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 $?
|