Loading...
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 | #!/bin/bash # SPDX-License-Identifier: GPL-2.0 # # Testing For SCTP VRF. # TOPO: CLIENT_NS1 (veth1) <---> (veth1) -> vrf_s1 # SERVER_NS # CLIENT_NS2 (veth1) <---> (veth2) -> vrf_s2 CLIENT_NS1="client-ns1" CLIENT_NS2="client-ns2" CLIENT_IP4="10.0.0.1" CLIENT_IP6="2000::1" CLIENT_PORT=1234 SERVER_NS="server-ns" SERVER_IP4="10.0.0.2" SERVER_IP6="2000::2" SERVER_PORT=1234 setup() { modprobe sctp modprobe sctp_diag ip netns add $CLIENT_NS1 ip netns add $CLIENT_NS2 ip netns add $SERVER_NS ip net exec $CLIENT_NS1 sysctl -w net.ipv6.conf.default.accept_dad=0 2>&1 >/dev/null ip net exec $CLIENT_NS2 sysctl -w net.ipv6.conf.default.accept_dad=0 2>&1 >/dev/null ip net exec $SERVER_NS sysctl -w net.ipv6.conf.default.accept_dad=0 2>&1 >/dev/null ip -n $SERVER_NS link add veth1 type veth peer name veth1 netns $CLIENT_NS1 ip -n $SERVER_NS link add veth2 type veth peer name veth1 netns $CLIENT_NS2 ip -n $CLIENT_NS1 link set veth1 up ip -n $CLIENT_NS1 addr add $CLIENT_IP4/24 dev veth1 ip -n $CLIENT_NS1 addr add $CLIENT_IP6/24 dev veth1 ip -n $CLIENT_NS2 link set veth1 up ip -n $CLIENT_NS2 addr add $CLIENT_IP4/24 dev veth1 ip -n $CLIENT_NS2 addr add $CLIENT_IP6/24 dev veth1 ip -n $SERVER_NS link add dummy1 type dummy ip -n $SERVER_NS link set dummy1 up ip -n $SERVER_NS link add vrf-1 type vrf table 10 ip -n $SERVER_NS link add vrf-2 type vrf table 20 ip -n $SERVER_NS link set vrf-1 up ip -n $SERVER_NS link set vrf-2 up ip -n $SERVER_NS link set veth1 master vrf-1 ip -n $SERVER_NS link set veth2 master vrf-2 ip -n $SERVER_NS addr add $SERVER_IP4/24 dev dummy1 ip -n $SERVER_NS addr add $SERVER_IP4/24 dev veth1 ip -n $SERVER_NS addr add $SERVER_IP4/24 dev veth2 ip -n $SERVER_NS addr add $SERVER_IP6/24 dev dummy1 ip -n $SERVER_NS addr add $SERVER_IP6/24 dev veth1 ip -n $SERVER_NS addr add $SERVER_IP6/24 dev veth2 ip -n $SERVER_NS link set veth1 up ip -n $SERVER_NS link set veth2 up ip -n $SERVER_NS route add table 10 $CLIENT_IP4 dev veth1 src $SERVER_IP4 ip -n $SERVER_NS route add table 20 $CLIENT_IP4 dev veth2 src $SERVER_IP4 ip -n $SERVER_NS route add $CLIENT_IP4 dev veth1 src $SERVER_IP4 ip -n $SERVER_NS route add table 10 $CLIENT_IP6 dev veth1 src $SERVER_IP6 ip -n $SERVER_NS route add table 20 $CLIENT_IP6 dev veth2 src $SERVER_IP6 ip -n $SERVER_NS route add $CLIENT_IP6 dev veth1 src $SERVER_IP6 } cleanup() { ip netns exec $SERVER_NS pkill sctp_hello 2>&1 >/dev/null ip netns del "$CLIENT_NS1" ip netns del "$CLIENT_NS2" ip netns del "$SERVER_NS" } wait_server() { local IFACE=$1 local CNT=0 until ip netns exec $SERVER_NS ss -lS src $SERVER_IP:$SERVER_PORT | \ grep LISTEN | grep "$IFACE" 2>&1 >/dev/null; do [ $((CNT++)) = "20" ] && { RET=3; return $RET; } sleep 0.1 done } do_test() { local CLIENT_NS=$1 local IFACE=$2 ip netns exec $SERVER_NS pkill sctp_hello 2>&1 >/dev/null ip netns exec $SERVER_NS ./sctp_hello server $AF $SERVER_IP \ $SERVER_PORT $IFACE 2>&1 >/dev/null & disown wait_server $IFACE || return $RET timeout 3 ip netns exec $CLIENT_NS ./sctp_hello client $AF \ $SERVER_IP $SERVER_PORT $CLIENT_IP $CLIENT_PORT 2>&1 >/dev/null RET=$? return $RET } do_testx() { local IFACE1=$1 local IFACE2=$2 ip netns exec $SERVER_NS pkill sctp_hello 2>&1 >/dev/null ip netns exec $SERVER_NS ./sctp_hello server $AF $SERVER_IP \ $SERVER_PORT $IFACE1 2>&1 >/dev/null & disown wait_server $IFACE1 || return $RET ip netns exec $SERVER_NS ./sctp_hello server $AF $SERVER_IP \ $SERVER_PORT $IFACE2 2>&1 >/dev/null & disown wait_server $IFACE2 || return $RET timeout 3 ip netns exec $CLIENT_NS1 ./sctp_hello client $AF \ $SERVER_IP $SERVER_PORT $CLIENT_IP $CLIENT_PORT 2>&1 >/dev/null && \ timeout 3 ip netns exec $CLIENT_NS2 ./sctp_hello client $AF \ $SERVER_IP $SERVER_PORT $CLIENT_IP $CLIENT_PORT 2>&1 >/dev/null RET=$? return $RET } testup() { ip netns exec $SERVER_NS sysctl -w net.sctp.l3mdev_accept=1 2>&1 >/dev/null echo -n "TEST 01: nobind, connect from client 1, l3mdev_accept=1, Y " do_test $CLIENT_NS1 || { echo "[FAIL]"; return $RET; } echo "[PASS]" echo -n "TEST 02: nobind, connect from client 2, l3mdev_accept=1, N " do_test $CLIENT_NS2 && { echo "[FAIL]"; return $RET; } echo "[PASS]" ip netns exec $SERVER_NS sysctl -w net.sctp.l3mdev_accept=0 2>&1 >/dev/null echo -n "TEST 03: nobind, connect from client 1, l3mdev_accept=0, N " do_test $CLIENT_NS1 && { echo "[FAIL]"; return $RET; } echo "[PASS]" echo -n "TEST 04: nobind, connect from client 2, l3mdev_accept=0, N " do_test $CLIENT_NS2 && { echo "[FAIL]"; return $RET; } echo "[PASS]" echo -n "TEST 05: bind veth2 in server, connect from client 1, N " do_test $CLIENT_NS1 veth2 && { echo "[FAIL]"; return $RET; } echo "[PASS]" echo -n "TEST 06: bind veth1 in server, connect from client 1, Y " do_test $CLIENT_NS1 veth1 || { echo "[FAIL]"; return $RET; } echo "[PASS]" echo -n "TEST 07: bind vrf-1 in server, connect from client 1, Y " do_test $CLIENT_NS1 vrf-1 || { echo "[FAIL]"; return $RET; } echo "[PASS]" echo -n "TEST 08: bind vrf-2 in server, connect from client 1, N " do_test $CLIENT_NS1 vrf-2 && { echo "[FAIL]"; return $RET; } echo "[PASS]" echo -n "TEST 09: bind vrf-2 in server, connect from client 2, Y " do_test $CLIENT_NS2 vrf-2 || { echo "[FAIL]"; return $RET; } echo "[PASS]" echo -n "TEST 10: bind vrf-1 in server, connect from client 2, N " do_test $CLIENT_NS2 vrf-1 && { echo "[FAIL]"; return $RET; } echo "[PASS]" echo -n "TEST 11: bind vrf-1 & 2 in server, connect from client 1 & 2, Y " do_testx vrf-1 vrf-2 || { echo "[FAIL]"; return $RET; } echo "[PASS]" echo -n "TEST 12: bind vrf-2 & 1 in server, connect from client 1 & 2, N " do_testx vrf-2 vrf-1 || { echo "[FAIL]"; return $RET; } echo "[PASS]" } trap cleanup EXIT setup && echo "Testing For SCTP VRF:" && \ CLIENT_IP=$CLIENT_IP4 SERVER_IP=$SERVER_IP4 AF="-4" testup && echo "***v4 Tests Done***" && CLIENT_IP=$CLIENT_IP6 SERVER_IP=$SERVER_IP6 AF="-6" testup && echo "***v6 Tests Done***" exit $? |