Commit | Line | Data |
---|---|---|
b08fbf24 PA |
1 | #!/bin/bash |
2 | # SPDX-License-Identifier: GPL-2.0 | |
3 | ||
4 | ret=0 | |
5 | sin="" | |
7d1e6f16 | 6 | sinfail="" |
b08fbf24 PA |
7 | sout="" |
8 | cin="" | |
7d1e6f16 | 9 | cinfail="" |
8b819a84 | 10 | cinsent="" |
b08fbf24 PA |
11 | cout="" |
12 | ksft_skip=4 | |
5888a61c MB |
13 | timeout_poll=30 |
14 | timeout_test=$((timeout_poll * 2 + 1)) | |
dd72b0fe | 15 | mptcp_connect="" |
b08fbf24 | 16 | capture=0 |
af66d3e1 | 17 | checksum=0 |
34aa6e3b | 18 | ip_mptcp=0 |
a673321a | 19 | do_all_tests=1 |
93827ad5 | 20 | init=0 |
b08fbf24 PA |
21 | |
22 | TEST_COUNT=0 | |
9a0a9367 | 23 | nr_blank=40 |
b08fbf24 | 24 | |
8d014eaa GT |
25 | # generated using "nfbpf_compile '(ip && (ip[54] & 0xf0) == 0x30) || |
26 | # (ip6 && (ip6[74] & 0xf0) == 0x30)'" | |
27 | CBPF_MPTCP_SUBOPTION_ADD_ADDR="14, | |
28 | 48 0 0 0, | |
29 | 84 0 0 240, | |
30 | 21 0 3 64, | |
31 | 48 0 0 54, | |
32 | 84 0 0 240, | |
33 | 21 6 7 48, | |
34 | 48 0 0 0, | |
35 | 84 0 0 240, | |
36 | 21 0 4 96, | |
37 | 48 0 0 74, | |
38 | 84 0 0 240, | |
39 | 21 0 1 48, | |
40 | 6 0 0 65535, | |
41 | 6 0 0 0" | |
42 | ||
93827ad5 | 43 | init_partial() |
b08fbf24 PA |
44 | { |
45 | capout=$(mktemp) | |
46 | ||
0a40e273 | 47 | rndh=$(mktemp -u XXXXXX) |
b08fbf24 PA |
48 | |
49 | ns1="ns1-$rndh" | |
50 | ns2="ns2-$rndh" | |
51 | ||
52 | for netns in "$ns1" "$ns2";do | |
53 | ip netns add $netns || exit $ksft_skip | |
54 | ip -net $netns link set lo up | |
55 | ip netns exec $netns sysctl -q net.mptcp.enabled=1 | |
56 | ip netns exec $netns sysctl -q net.ipv4.conf.all.rp_filter=0 | |
57 | ip netns exec $netns sysctl -q net.ipv4.conf.default.rp_filter=0 | |
af66d3e1 GT |
58 | if [ $checksum -eq 1 ]; then |
59 | ip netns exec $netns sysctl -q net.mptcp.checksum_enabled=1 | |
60 | fi | |
b08fbf24 PA |
61 | done |
62 | ||
63 | # ns1 ns2 | |
64 | # ns1eth1 ns2eth1 | |
65 | # ns1eth2 ns2eth2 | |
66 | # ns1eth3 ns2eth3 | |
67 | # ns1eth4 ns2eth4 | |
68 | ||
69 | for i in `seq 1 4`; do | |
70 | ip link add ns1eth$i netns "$ns1" type veth peer name ns2eth$i netns "$ns2" | |
71 | ip -net "$ns1" addr add 10.0.$i.1/24 dev ns1eth$i | |
72 | ip -net "$ns1" addr add dead:beef:$i::1/64 dev ns1eth$i nodad | |
73 | ip -net "$ns1" link set ns1eth$i up | |
74 | ||
75 | ip -net "$ns2" addr add 10.0.$i.2/24 dev ns2eth$i | |
76 | ip -net "$ns2" addr add dead:beef:$i::2/64 dev ns2eth$i nodad | |
77 | ip -net "$ns2" link set ns2eth$i up | |
78 | ||
79 | # let $ns2 reach any $ns1 address from any interface | |
80 | ip -net "$ns2" route add default via 10.0.$i.1 dev ns2eth$i metric 10$i | |
9846921d | 81 | ip -net "$ns2" route add default via dead:beef:$i::1 dev ns2eth$i metric 10$i |
b08fbf24 PA |
82 | done |
83 | } | |
84 | ||
7d1e6f16 PA |
85 | init_shapers() |
86 | { | |
87 | for i in `seq 1 4`; do | |
88 | tc -n $ns1 qdisc add dev ns1eth$i root netem rate 20mbit delay 1 | |
89 | tc -n $ns2 qdisc add dev ns2eth$i root netem rate 20mbit delay 1 | |
90 | done | |
91 | } | |
92 | ||
b08fbf24 PA |
93 | cleanup_partial() |
94 | { | |
95 | rm -f "$capout" | |
96 | ||
97 | for netns in "$ns1" "$ns2"; do | |
98 | ip netns del $netns | |
c2a55e8f | 99 | rm -f /tmp/$netns.{nstat,out} |
b08fbf24 PA |
100 | done |
101 | } | |
102 | ||
87154755 MB |
103 | check_tools() |
104 | { | |
105 | if ! ip -Version &> /dev/null; then | |
106 | echo "SKIP: Could not run test without ip tool" | |
107 | exit $ksft_skip | |
108 | fi | |
109 | ||
110 | if ! iptables -V &> /dev/null; then | |
111 | echo "SKIP: Could not run all tests without iptables tool" | |
112 | exit $ksft_skip | |
113 | fi | |
114 | ||
115 | if ! ip6tables -V &> /dev/null; then | |
116 | echo "SKIP: Could not run all tests without ip6tables tool" | |
117 | exit $ksft_skip | |
118 | fi | |
119 | } | |
120 | ||
93827ad5 MB |
121 | init() { |
122 | init=1 | |
123 | ||
87154755 MB |
124 | check_tools |
125 | ||
93827ad5 MB |
126 | sin=$(mktemp) |
127 | sout=$(mktemp) | |
128 | cin=$(mktemp) | |
129 | cinsent=$(mktemp) | |
130 | cout=$(mktemp) | |
131 | ||
132 | trap cleanup EXIT | |
133 | ||
134 | make_file "$cin" "client" 1 | |
135 | make_file "$sin" "server" 1 | |
136 | } | |
137 | ||
b08fbf24 PA |
138 | cleanup() |
139 | { | |
7d1e6f16 PA |
140 | rm -f "$cin" "$cout" "$sinfail" |
141 | rm -f "$sin" "$sout" "$cinsent" "$cinfail" | |
b08fbf24 PA |
142 | cleanup_partial |
143 | } | |
144 | ||
145 | reset() | |
146 | { | |
93827ad5 MB |
147 | if [ "${init}" != "1" ]; then |
148 | init | |
149 | else | |
150 | cleanup_partial | |
151 | fi | |
152 | ||
153 | init_partial | |
b08fbf24 PA |
154 | } |
155 | ||
00587187 FW |
156 | reset_with_cookies() |
157 | { | |
158 | reset | |
159 | ||
160 | for netns in "$ns1" "$ns2";do | |
161 | ip netns exec $netns sysctl -q net.ipv4.tcp_syncookies=2 | |
162 | done | |
163 | } | |
164 | ||
8d014eaa GT |
165 | reset_with_add_addr_timeout() |
166 | { | |
167 | local ip="${1:-4}" | |
168 | local tables | |
169 | ||
170 | tables="iptables" | |
171 | if [ $ip -eq 6 ]; then | |
172 | tables="ip6tables" | |
173 | fi | |
174 | ||
175 | reset | |
176 | ||
177 | ip netns exec $ns1 sysctl -q net.mptcp.add_addr_timeout=1 | |
178 | ip netns exec $ns2 $tables -A OUTPUT -p tcp \ | |
179 | -m tcp --tcp-option 30 \ | |
180 | -m bpf --bytecode \ | |
181 | "$CBPF_MPTCP_SUBOPTION_ADD_ADDR" \ | |
182 | -j DROP | |
183 | } | |
184 | ||
af66d3e1 GT |
185 | reset_with_checksum() |
186 | { | |
187 | local ns1_enable=$1 | |
188 | local ns2_enable=$2 | |
189 | ||
190 | reset | |
191 | ||
192 | ip netns exec $ns1 sysctl -q net.mptcp.checksum_enabled=$ns1_enable | |
193 | ip netns exec $ns2 sysctl -q net.mptcp.checksum_enabled=$ns2_enable | |
194 | } | |
195 | ||
0cddb4a6 GT |
196 | reset_with_allow_join_id0() |
197 | { | |
198 | local ns1_enable=$1 | |
199 | local ns2_enable=$2 | |
200 | ||
201 | reset | |
202 | ||
203 | ip netns exec $ns1 sysctl -q net.mptcp.allow_join_initial_addr_port=$ns1_enable | |
204 | ip netns exec $ns2 sysctl -q net.mptcp.allow_join_initial_addr_port=$ns2_enable | |
205 | } | |
206 | ||
8b819a84 FW |
207 | print_file_err() |
208 | { | |
209 | ls -l "$1" 1>&2 | |
210 | echo "Trailing bytes are: " | |
211 | tail -c 27 "$1" | |
212 | } | |
213 | ||
b08fbf24 PA |
214 | check_transfer() |
215 | { | |
216 | in=$1 | |
217 | out=$2 | |
218 | what=$3 | |
219 | ||
220 | cmp "$in" "$out" > /dev/null 2>&1 | |
221 | if [ $? -ne 0 ] ;then | |
222 | echo "[ FAIL ] $what does not match (in, out):" | |
223 | print_file_err "$in" | |
224 | print_file_err "$out" | |
8b819a84 | 225 | ret=1 |
b08fbf24 PA |
226 | |
227 | return 1 | |
228 | fi | |
229 | ||
230 | return 0 | |
231 | } | |
232 | ||
233 | do_ping() | |
234 | { | |
235 | listener_ns="$1" | |
236 | connector_ns="$2" | |
237 | connect_addr="$3" | |
238 | ||
239 | ip netns exec ${connector_ns} ping -q -c 1 $connect_addr >/dev/null | |
240 | if [ $? -ne 0 ] ; then | |
241 | echo "$listener_ns -> $connect_addr connectivity [ FAIL ]" 1>&2 | |
242 | ret=1 | |
243 | fi | |
244 | } | |
245 | ||
8b819a84 FW |
246 | link_failure() |
247 | { | |
248 | ns="$1" | |
249 | ||
7d1e6f16 PA |
250 | if [ -z "$FAILING_LINKS" ]; then |
251 | l=$((RANDOM%4)) | |
252 | FAILING_LINKS=$((l+1)) | |
253 | fi | |
8b819a84 | 254 | |
7d1e6f16 PA |
255 | for l in $FAILING_LINKS; do |
256 | veth="ns1eth$l" | |
257 | ip -net "$ns" link set "$veth" down | |
258 | done | |
8b819a84 FW |
259 | } |
260 | ||
523514ed GT |
261 | # $1: IP address |
262 | is_v6() | |
263 | { | |
264 | [ -z "${1##*:*}" ] | |
265 | } | |
266 | ||
327b9a94 PA |
267 | # $1: ns, $2: port |
268 | wait_local_port_listen() | |
269 | { | |
270 | local listener_ns="${1}" | |
271 | local port="${2}" | |
272 | ||
273 | local port_hex i | |
274 | ||
275 | port_hex="$(printf "%04X" "${port}")" | |
276 | for i in $(seq 10); do | |
277 | ip netns exec "${listener_ns}" cat /proc/net/tcp* | \ | |
278 | awk "BEGIN {rc=1} {if (\$2 ~ /:${port_hex}\$/ && \$4 ~ /0A/) {rc=0; exit}} END {exit rc}" && | |
279 | break | |
280 | sleep 0.1 | |
281 | done | |
282 | } | |
283 | ||
284 | rm_addr_count() | |
285 | { | |
286 | ns=${1} | |
287 | ||
288 | ip netns exec ${ns} nstat -as | grep MPTcpExtRmAddr | awk '{print $2}' | |
289 | } | |
290 | ||
291 | # $1: ns, $2: old rm_addr counter in $ns | |
292 | wait_rm_addr() | |
293 | { | |
294 | local ns="${1}" | |
295 | local old_cnt="${2}" | |
296 | local cnt | |
297 | local i | |
298 | ||
299 | for i in $(seq 10); do | |
300 | cnt=$(rm_addr_count ${ns}) | |
301 | [ "$cnt" = "${old_cnt}" ] || break | |
302 | sleep 0.1 | |
303 | done | |
304 | } | |
305 | ||
34aa6e3b GT |
306 | pm_nl_set_limits() |
307 | { | |
308 | local ns=$1 | |
309 | local addrs=$2 | |
310 | local subflows=$3 | |
311 | ||
312 | if [ $ip_mptcp -eq 1 ]; then | |
313 | ip -n $ns mptcp limits set add_addr_accepted $addrs subflows $subflows | |
314 | else | |
315 | ip netns exec $ns ./pm_nl_ctl limits $addrs $subflows | |
316 | fi | |
317 | } | |
318 | ||
319 | pm_nl_add_endpoint() | |
320 | { | |
321 | local ns=$1 | |
322 | local addr=$2 | |
323 | local flags | |
324 | local port | |
325 | local dev | |
326 | local id | |
327 | local nr=2 | |
328 | ||
329 | for p in $@ | |
330 | do | |
331 | if [ $p = "flags" ]; then | |
332 | eval _flags=\$"$nr" | |
333 | [ ! -z $_flags ]; flags="flags $_flags" | |
334 | fi | |
335 | if [ $p = "dev" ]; then | |
336 | eval _dev=\$"$nr" | |
337 | [ ! -z $_dev ]; dev="dev $_dev" | |
338 | fi | |
339 | if [ $p = "id" ]; then | |
340 | eval _id=\$"$nr" | |
341 | [ ! -z $_id ]; id="id $_id" | |
342 | fi | |
343 | if [ $p = "port" ]; then | |
344 | eval _port=\$"$nr" | |
345 | [ ! -z $_port ]; port="port $_port" | |
346 | fi | |
347 | ||
348 | let nr+=1 | |
349 | done | |
350 | ||
351 | if [ $ip_mptcp -eq 1 ]; then | |
352 | ip -n $ns mptcp endpoint add $addr ${_flags//","/" "} $dev $id $port | |
353 | else | |
354 | ip netns exec $ns ./pm_nl_ctl add $addr $flags $dev $id $port | |
355 | fi | |
356 | } | |
357 | ||
358 | pm_nl_del_endpoint() | |
359 | { | |
360 | local ns=$1 | |
361 | local id=$2 | |
362 | local addr=$3 | |
363 | ||
364 | if [ $ip_mptcp -eq 1 ]; then | |
365 | ip -n $ns mptcp endpoint delete id $id $addr | |
366 | else | |
367 | ip netns exec $ns ./pm_nl_ctl del $id $addr | |
368 | fi | |
369 | } | |
370 | ||
371 | pm_nl_flush_endpoint() | |
372 | { | |
373 | local ns=$1 | |
374 | ||
375 | if [ $ip_mptcp -eq 1 ]; then | |
376 | ip -n $ns mptcp endpoint flush | |
377 | else | |
378 | ip netns exec $ns ./pm_nl_ctl flush | |
379 | fi | |
380 | } | |
381 | ||
dda61b3d GT |
382 | pm_nl_show_endpoints() |
383 | { | |
384 | local ns=$1 | |
385 | ||
386 | if [ $ip_mptcp -eq 1 ]; then | |
387 | ip -n $ns mptcp endpoint show | |
388 | else | |
389 | ip netns exec $ns ./pm_nl_ctl dump | |
390 | fi | |
391 | } | |
392 | ||
f0140386 GT |
393 | pm_nl_change_endpoint() |
394 | { | |
395 | local ns=$1 | |
bccefb76 GT |
396 | local id=$2 |
397 | local flags=$3 | |
f0140386 GT |
398 | |
399 | if [ $ip_mptcp -eq 1 ]; then | |
400 | ip -n $ns mptcp endpoint change id $id ${flags//","/" "} | |
401 | else | |
bccefb76 | 402 | ip netns exec $ns ./pm_nl_ctl set id $id flags $flags |
f0140386 GT |
403 | fi |
404 | } | |
405 | ||
b08fbf24 PA |
406 | do_transfer() |
407 | { | |
408 | listener_ns="$1" | |
409 | connector_ns="$2" | |
410 | cl_proto="$3" | |
411 | srv_proto="$4" | |
412 | connect_addr="$5" | |
8b819a84 | 413 | test_link_fail="$6" |
2e8cbf45 GT |
414 | addr_nr_ns1="$7" |
415 | addr_nr_ns2="$8" | |
8b819a84 | 416 | speed="$9" |
6a0653b9 | 417 | sflags="${10}" |
b08fbf24 PA |
418 | |
419 | port=$((10000+$TEST_COUNT)) | |
420 | TEST_COUNT=$((TEST_COUNT+1)) | |
421 | ||
422 | :> "$cout" | |
423 | :> "$sout" | |
424 | :> "$capout" | |
425 | ||
426 | if [ $capture -eq 1 ]; then | |
427 | if [ -z $SUDO_USER ] ; then | |
428 | capuser="" | |
429 | else | |
430 | capuser="-Z $SUDO_USER" | |
431 | fi | |
432 | ||
00587187 | 433 | capfile=$(printf "mp_join-%02u-%s.pcap" "$TEST_COUNT" "${listener_ns}") |
b08fbf24 PA |
434 | |
435 | echo "Capturing traffic for test $TEST_COUNT into $capfile" | |
436 | ip netns exec ${listener_ns} tcpdump -i any -s 65535 -B 32768 $capuser -w $capfile > "$capout" 2>&1 & | |
437 | cappid=$! | |
438 | ||
439 | sleep 1 | |
440 | fi | |
441 | ||
c2a55e8f MB |
442 | NSTAT_HISTORY=/tmp/${listener_ns}.nstat ip netns exec ${listener_ns} \ |
443 | nstat -n | |
444 | NSTAT_HISTORY=/tmp/${connector_ns}.nstat ip netns exec ${connector_ns} \ | |
445 | nstat -n | |
446 | ||
8d014eaa | 447 | if [ $speed = "fast" ]; then |
dd72b0fe | 448 | mptcp_connect="./mptcp_connect -j" |
8da6229b GT |
449 | elif [ $speed = "slow" ]; then |
450 | mptcp_connect="./mptcp_connect -r 50" | |
451 | elif [ $speed = "least" ]; then | |
452 | mptcp_connect="./mptcp_connect -r 10" | |
dd72b0fe GT |
453 | fi |
454 | ||
523514ed GT |
455 | local local_addr |
456 | if is_v6 "${connect_addr}"; then | |
457 | local_addr="::" | |
458 | else | |
459 | local_addr="0.0.0.0" | |
460 | fi | |
461 | ||
7d1e6f16 PA |
462 | if [ "$test_link_fail" -eq 2 ];then |
463 | timeout ${timeout_test} \ | |
464 | ip netns exec ${listener_ns} \ | |
7c909a98 | 465 | $mptcp_connect -t ${timeout_poll} -l -p $port -s ${srv_proto} \ |
7d1e6f16 PA |
466 | ${local_addr} < "$sinfail" > "$sout" & |
467 | else | |
468 | timeout ${timeout_test} \ | |
469 | ip netns exec ${listener_ns} \ | |
470 | $mptcp_connect -t ${timeout_poll} -l -p $port -s ${srv_proto} \ | |
471 | ${local_addr} < "$sin" > "$sout" & | |
472 | fi | |
b08fbf24 PA |
473 | spid=$! |
474 | ||
327b9a94 | 475 | wait_local_port_listen "${listener_ns}" "${port}" |
b08fbf24 | 476 | |
8b819a84 | 477 | if [ "$test_link_fail" -eq 0 ];then |
5888a61c MB |
478 | timeout ${timeout_test} \ |
479 | ip netns exec ${connector_ns} \ | |
480 | $mptcp_connect -t ${timeout_poll} -p $port -s ${cl_proto} \ | |
481 | $connect_addr < "$cin" > "$cout" & | |
8b819a84 | 482 | else |
7d1e6f16 | 483 | ( cat "$cinfail" ; sleep 2; link_failure $listener_ns ; cat "$cinfail" ) | \ |
5888a61c MB |
484 | tee "$cinsent" | \ |
485 | timeout ${timeout_test} \ | |
486 | ip netns exec ${connector_ns} \ | |
487 | $mptcp_connect -t ${timeout_poll} -p $port -s ${cl_proto} \ | |
488 | $connect_addr > "$cout" & | |
8b819a84 | 489 | fi |
b08fbf24 PA |
490 | cpid=$! |
491 | ||
327b9a94 PA |
492 | # let the mptcp subflow be established in background before |
493 | # do endpoint manipulation | |
494 | [ $addr_nr_ns1 = "0" -a $addr_nr_ns2 = "0" ] || sleep 1 | |
495 | ||
6208fd82 GT |
496 | if [ $addr_nr_ns1 -gt 0 ]; then |
497 | let add_nr_ns1=addr_nr_ns1 | |
498 | counter=2 | |
6208fd82 GT |
499 | while [ $add_nr_ns1 -gt 0 ]; do |
500 | local addr | |
501 | if is_v6 "${connect_addr}"; then | |
502 | addr="dead:beef:$counter::1" | |
503 | else | |
504 | addr="10.0.$counter.1" | |
505 | fi | |
34aa6e3b | 506 | pm_nl_add_endpoint $ns1 $addr flags signal |
6208fd82 GT |
507 | let counter+=1 |
508 | let add_nr_ns1-=1 | |
509 | done | |
6208fd82 | 510 | elif [ $addr_nr_ns1 -lt 0 ]; then |
2e8cbf45 | 511 | let rm_nr_ns1=-addr_nr_ns1 |
6fe4ccdc | 512 | if [ $rm_nr_ns1 -lt 8 ]; then |
dda61b3d GT |
513 | counter=0 |
514 | pm_nl_show_endpoints ${listener_ns} | while read line; do | |
515 | local arr=($line) | |
516 | local nr=0 | |
517 | ||
518 | for i in ${arr[@]}; do | |
519 | if [ $i = "id" ]; then | |
520 | if [ $counter -eq $rm_nr_ns1 ]; then | |
521 | break | |
522 | fi | |
523 | id=${arr[$nr+1]} | |
524 | rm_addr=$(rm_addr_count ${connector_ns}) | |
525 | pm_nl_del_endpoint ${listener_ns} $id | |
526 | wait_rm_addr ${connector_ns} ${rm_addr} | |
527 | let counter+=1 | |
528 | fi | |
529 | let nr+=1 | |
f87744ad | 530 | done |
dda61b3d | 531 | done |
5e287fe7 | 532 | elif [ $rm_nr_ns1 -eq 8 ]; then |
34aa6e3b | 533 | pm_nl_flush_endpoint ${listener_ns} |
5e287fe7 | 534 | elif [ $rm_nr_ns1 -eq 9 ]; then |
34aa6e3b | 535 | pm_nl_del_endpoint ${listener_ns} 0 ${connect_addr} |
6fe4ccdc | 536 | fi |
dd72b0fe GT |
537 | fi |
538 | ||
4f49d633 GT |
539 | flags="subflow" |
540 | if [[ "${addr_nr_ns2}" = "fullmesh_"* ]]; then | |
541 | flags="${flags},fullmesh" | |
542 | addr_nr_ns2=${addr_nr_ns2:9} | |
543 | fi | |
544 | ||
327b9a94 PA |
545 | # if newly added endpoints must be deleted, give the background msk |
546 | # some time to created them | |
547 | [ $addr_nr_ns1 -gt 0 -a $addr_nr_ns2 -lt 0 ] && sleep 1 | |
548 | ||
6208fd82 GT |
549 | if [ $addr_nr_ns2 -gt 0 ]; then |
550 | let add_nr_ns2=addr_nr_ns2 | |
551 | counter=3 | |
6208fd82 GT |
552 | while [ $add_nr_ns2 -gt 0 ]; do |
553 | local addr | |
554 | if is_v6 "${connect_addr}"; then | |
555 | addr="dead:beef:$counter::2" | |
556 | else | |
557 | addr="10.0.$counter.2" | |
558 | fi | |
34aa6e3b | 559 | pm_nl_add_endpoint $ns2 $addr flags $flags |
6208fd82 GT |
560 | let counter+=1 |
561 | let add_nr_ns2-=1 | |
562 | done | |
6208fd82 | 563 | elif [ $addr_nr_ns2 -lt 0 ]; then |
2e8cbf45 | 564 | let rm_nr_ns2=-addr_nr_ns2 |
6fe4ccdc | 565 | if [ $rm_nr_ns2 -lt 8 ]; then |
dda61b3d GT |
566 | counter=0 |
567 | pm_nl_show_endpoints ${connector_ns} | while read line; do | |
568 | local arr=($line) | |
569 | local nr=0 | |
570 | ||
571 | for i in ${arr[@]}; do | |
572 | if [ $i = "id" ]; then | |
573 | if [ $counter -eq $rm_nr_ns2 ]; then | |
574 | break | |
575 | fi | |
576 | # rm_addr are serialized, allow the previous one to | |
577 | # complete | |
578 | id=${arr[$nr+1]} | |
579 | rm_addr=$(rm_addr_count ${listener_ns}) | |
580 | pm_nl_del_endpoint ${connector_ns} $id | |
581 | wait_rm_addr ${listener_ns} ${rm_addr} | |
582 | let counter+=1 | |
583 | fi | |
584 | let nr+=1 | |
f87744ad | 585 | done |
dda61b3d | 586 | done |
5e287fe7 | 587 | elif [ $rm_nr_ns2 -eq 8 ]; then |
34aa6e3b | 588 | pm_nl_flush_endpoint ${connector_ns} |
5e287fe7 GT |
589 | elif [ $rm_nr_ns2 -eq 9 ]; then |
590 | local addr | |
591 | if is_v6 "${connect_addr}"; then | |
592 | addr="dead:beef:1::2" | |
593 | else | |
594 | addr="10.0.1.2" | |
595 | fi | |
34aa6e3b | 596 | pm_nl_del_endpoint ${connector_ns} 0 $addr |
6fe4ccdc | 597 | fi |
dd72b0fe GT |
598 | fi |
599 | ||
6a0653b9 | 600 | if [ ! -z $sflags ]; then |
718eb44e GT |
601 | sleep 1 |
602 | for netns in "$ns1" "$ns2"; do | |
dda61b3d | 603 | pm_nl_show_endpoints $netns | while read line; do |
33397b83 | 604 | local arr=($line) |
bccefb76 | 605 | local nr=0 |
f0140386 | 606 | local id |
33397b83 GT |
607 | |
608 | for i in ${arr[@]}; do | |
bccefb76 GT |
609 | if [ $i = "id" ]; then |
610 | id=${arr[$nr+1]} | |
33397b83 | 611 | fi |
bccefb76 | 612 | let nr+=1 |
33397b83 | 613 | done |
bccefb76 | 614 | pm_nl_change_endpoint $netns $id $sflags |
33397b83 | 615 | done |
718eb44e GT |
616 | done |
617 | fi | |
618 | ||
b08fbf24 PA |
619 | wait $cpid |
620 | retc=$? | |
621 | wait $spid | |
622 | rets=$? | |
623 | ||
624 | if [ $capture -eq 1 ]; then | |
625 | sleep 1 | |
626 | kill $cappid | |
627 | fi | |
628 | ||
c2a55e8f MB |
629 | NSTAT_HISTORY=/tmp/${listener_ns}.nstat ip netns exec ${listener_ns} \ |
630 | nstat | grep Tcp > /tmp/${listener_ns}.out | |
631 | NSTAT_HISTORY=/tmp/${connector_ns}.nstat ip netns exec ${connector_ns} \ | |
632 | nstat | grep Tcp > /tmp/${connector_ns}.out | |
633 | ||
b08fbf24 PA |
634 | if [ ${rets} -ne 0 ] || [ ${retc} -ne 0 ]; then |
635 | echo " client exit code $retc, server $rets" 1>&2 | |
8b974778 | 636 | echo -e "\nnetns ${listener_ns} socket stat for ${port}:" 1>&2 |
c2a55e8f MB |
637 | ip netns exec ${listener_ns} ss -Menita 1>&2 -o "sport = :$port" |
638 | cat /tmp/${listener_ns}.out | |
8b974778 | 639 | echo -e "\nnetns ${connector_ns} socket stat for ${port}:" 1>&2 |
c2a55e8f MB |
640 | ip netns exec ${connector_ns} ss -Menita 1>&2 -o "dport = :$port" |
641 | cat /tmp/${connector_ns}.out | |
b08fbf24 PA |
642 | |
643 | cat "$capout" | |
8b819a84 | 644 | ret=1 |
b08fbf24 PA |
645 | return 1 |
646 | fi | |
647 | ||
7d1e6f16 PA |
648 | if [ "$test_link_fail" -eq 2 ];then |
649 | check_transfer $sinfail $cout "file received by client" | |
650 | else | |
651 | check_transfer $sin $cout "file received by client" | |
652 | fi | |
b08fbf24 | 653 | retc=$? |
8b819a84 FW |
654 | if [ "$test_link_fail" -eq 0 ];then |
655 | check_transfer $cin $sout "file received by server" | |
656 | else | |
657 | check_transfer $cinsent $sout "file received by server" | |
658 | fi | |
b08fbf24 PA |
659 | rets=$? |
660 | ||
661 | if [ $retc -eq 0 ] && [ $rets -eq 0 ];then | |
662 | cat "$capout" | |
663 | return 0 | |
664 | fi | |
665 | ||
666 | cat "$capout" | |
667 | return 1 | |
668 | } | |
669 | ||
670 | make_file() | |
671 | { | |
672 | name=$1 | |
673 | who=$2 | |
8b819a84 | 674 | size=$3 |
b08fbf24 | 675 | |
8b819a84 | 676 | dd if=/dev/urandom of="$name" bs=1024 count=$size 2> /dev/null |
b08fbf24 PA |
677 | echo -e "\nMPTCP_TEST_FILE_END_MARKER" >> "$name" |
678 | ||
8b819a84 | 679 | echo "Created $name (size $size KB) containing data sent by $who" |
b08fbf24 PA |
680 | } |
681 | ||
682 | run_tests() | |
683 | { | |
684 | listener_ns="$1" | |
685 | connector_ns="$2" | |
686 | connect_addr="$3" | |
8b819a84 | 687 | test_linkfail="${4:-0}" |
2e8cbf45 GT |
688 | addr_nr_ns1="${5:-0}" |
689 | addr_nr_ns2="${6:-0}" | |
8b819a84 | 690 | speed="${7:-fast}" |
6a0653b9 | 691 | sflags="${8:-""}" |
8b819a84 | 692 | |
7d1e6f16 PA |
693 | # create the input file for the failure test when |
694 | # the first failure test run | |
695 | if [ "$test_linkfail" -ne 0 -a -z "$cinfail" ]; then | |
696 | # the client file must be considerably larger | |
697 | # of the maximum expected cwin value, or the | |
698 | # link utilization will be not predicable | |
699 | size=$((RANDOM%2)) | |
8b819a84 | 700 | size=$((size+1)) |
7d1e6f16 PA |
701 | size=$((size*8192)) |
702 | size=$((size + ( $RANDOM % 8192) )) | |
8b819a84 | 703 | |
7d1e6f16 PA |
704 | cinfail=$(mktemp) |
705 | make_file "$cinfail" "client" $size | |
8b819a84 | 706 | fi |
b08fbf24 | 707 | |
7d1e6f16 PA |
708 | if [ "$test_linkfail" -eq 2 -a -z "$sinfail" ]; then |
709 | size=$((RANDOM%16)) | |
710 | size=$((size+1)) | |
711 | size=$((size*2048)) | |
8b819a84 | 712 | |
7d1e6f16 PA |
713 | sinfail=$(mktemp) |
714 | make_file "$sinfail" "server" $size | |
8b819a84 FW |
715 | fi |
716 | ||
7d1e6f16 | 717 | do_transfer ${listener_ns} ${connector_ns} MPTCP MPTCP ${connect_addr} \ |
6a0653b9 | 718 | ${test_linkfail} ${addr_nr_ns1} ${addr_nr_ns2} ${speed} ${sflags} |
b08fbf24 PA |
719 | } |
720 | ||
327b9a94 PA |
721 | dump_stats() |
722 | { | |
723 | echo Server ns stats | |
724 | ip netns exec $ns1 nstat -as | grep Tcp | |
725 | echo Client ns stats | |
726 | ip netns exec $ns2 nstat -as | grep Tcp | |
727 | } | |
728 | ||
af66d3e1 GT |
729 | chk_csum_nr() |
730 | { | |
731 | local msg=${1:-""} | |
732 | local count | |
733 | local dump_stats | |
734 | ||
735 | if [ ! -z "$msg" ]; then | |
9a0a9367 | 736 | printf "%03u" "$TEST_COUNT" |
af66d3e1 | 737 | else |
9a0a9367 | 738 | echo -n " " |
af66d3e1 GT |
739 | fi |
740 | printf " %-36s %s" "$msg" "sum" | |
741 | count=`ip netns exec $ns1 nstat -as | grep MPTcpExtDataCsumErr | awk '{print $2}'` | |
742 | [ -z "$count" ] && count=0 | |
743 | if [ "$count" != 0 ]; then | |
744 | echo "[fail] got $count data checksum error[s] expected 0" | |
745 | ret=1 | |
746 | dump_stats=1 | |
747 | else | |
748 | echo -n "[ ok ]" | |
749 | fi | |
750 | echo -n " - csum " | |
751 | count=`ip netns exec $ns2 nstat -as | grep MPTcpExtDataCsumErr | awk '{print $2}'` | |
752 | [ -z "$count" ] && count=0 | |
753 | if [ "$count" != 0 ]; then | |
754 | echo "[fail] got $count data checksum error[s] expected 0" | |
755 | ret=1 | |
756 | dump_stats=1 | |
757 | else | |
758 | echo "[ ok ]" | |
759 | fi | |
327b9a94 | 760 | [ "${dump_stats}" = 1 ] && dump_stats |
af66d3e1 GT |
761 | } |
762 | ||
6bb3ab49 GT |
763 | chk_fail_nr() |
764 | { | |
765 | local mp_fail_nr_tx=$1 | |
766 | local mp_fail_nr_rx=$2 | |
767 | local count | |
768 | local dump_stats | |
769 | ||
9a0a9367 | 770 | printf "%-${nr_blank}s %s" " " "ftx" |
6bb3ab49 GT |
771 | count=`ip netns exec $ns1 nstat -as | grep MPTcpExtMPFailTx | awk '{print $2}'` |
772 | [ -z "$count" ] && count=0 | |
773 | if [ "$count" != "$mp_fail_nr_tx" ]; then | |
774 | echo "[fail] got $count MP_FAIL[s] TX expected $mp_fail_nr_tx" | |
775 | ret=1 | |
776 | dump_stats=1 | |
777 | else | |
778 | echo -n "[ ok ]" | |
779 | fi | |
780 | ||
781 | echo -n " - frx " | |
782 | count=`ip netns exec $ns2 nstat -as | grep MPTcpExtMPFailRx | awk '{print $2}'` | |
783 | [ -z "$count" ] && count=0 | |
784 | if [ "$count" != "$mp_fail_nr_rx" ]; then | |
785 | echo "[fail] got $count MP_FAIL[s] RX expected $mp_fail_nr_rx" | |
786 | ret=1 | |
787 | dump_stats=1 | |
788 | else | |
789 | echo "[ ok ]" | |
790 | fi | |
791 | ||
327b9a94 | 792 | [ "${dump_stats}" = 1 ] && dump_stats |
6bb3ab49 GT |
793 | } |
794 | ||
b08fbf24 PA |
795 | chk_join_nr() |
796 | { | |
797 | local msg="$1" | |
798 | local syn_nr=$2 | |
799 | local syn_ack_nr=$3 | |
800 | local ack_nr=$4 | |
801 | local count | |
802 | local dump_stats | |
e35f885b | 803 | local with_cookie |
b08fbf24 | 804 | |
9a0a9367 | 805 | printf "%03u %-36s %s" "$TEST_COUNT" "$msg" "syn" |
b08fbf24 PA |
806 | count=`ip netns exec $ns1 nstat -as | grep MPTcpExtMPJoinSynRx | awk '{print $2}'` |
807 | [ -z "$count" ] && count=0 | |
808 | if [ "$count" != "$syn_nr" ]; then | |
809 | echo "[fail] got $count JOIN[s] syn expected $syn_nr" | |
810 | ret=1 | |
811 | dump_stats=1 | |
812 | else | |
813 | echo -n "[ ok ]" | |
814 | fi | |
815 | ||
816 | echo -n " - synack" | |
e35f885b | 817 | with_cookie=`ip netns exec $ns2 sysctl -n net.ipv4.tcp_syncookies` |
b08fbf24 PA |
818 | count=`ip netns exec $ns2 nstat -as | grep MPTcpExtMPJoinSynAckRx | awk '{print $2}'` |
819 | [ -z "$count" ] && count=0 | |
820 | if [ "$count" != "$syn_ack_nr" ]; then | |
e35f885b PA |
821 | # simult connections exceeding the limit with cookie enabled could go up to |
822 | # synack validation as the conn limit can be enforced reliably only after | |
823 | # the subflow creation | |
824 | if [ "$with_cookie" = 2 ] && [ "$count" -gt "$syn_ack_nr" ] && [ "$count" -le "$syn_nr" ]; then | |
825 | echo -n "[ ok ]" | |
826 | else | |
827 | echo "[fail] got $count JOIN[s] synack expected $syn_ack_nr" | |
828 | ret=1 | |
829 | dump_stats=1 | |
830 | fi | |
b08fbf24 PA |
831 | else |
832 | echo -n "[ ok ]" | |
833 | fi | |
834 | ||
835 | echo -n " - ack" | |
836 | count=`ip netns exec $ns1 nstat -as | grep MPTcpExtMPJoinAckRx | awk '{print $2}'` | |
837 | [ -z "$count" ] && count=0 | |
838 | if [ "$count" != "$ack_nr" ]; then | |
839 | echo "[fail] got $count JOIN[s] ack expected $ack_nr" | |
840 | ret=1 | |
841 | dump_stats=1 | |
842 | else | |
843 | echo "[ ok ]" | |
844 | fi | |
327b9a94 | 845 | [ "${dump_stats}" = 1 ] && dump_stats |
af66d3e1 GT |
846 | if [ $checksum -eq 1 ]; then |
847 | chk_csum_nr | |
6bb3ab49 | 848 | chk_fail_nr 0 0 |
af66d3e1 | 849 | fi |
b08fbf24 PA |
850 | } |
851 | ||
7d1e6f16 PA |
852 | # a negative value for 'stale_max' means no upper bound: |
853 | # for bidirectional transfer, if one peer sleep for a while | |
854 | # - as these tests do - we can have a quite high number of | |
855 | # stale/recover conversions, proportional to | |
856 | # sleep duration/ MPTCP-level RTX interval. | |
857 | chk_stale_nr() | |
858 | { | |
859 | local ns=$1 | |
860 | local stale_min=$2 | |
861 | local stale_max=$3 | |
862 | local stale_delta=$4 | |
863 | local dump_stats | |
864 | local stale_nr | |
865 | local recover_nr | |
866 | ||
9a0a9367 | 867 | printf "%-${nr_blank}s %-18s" " " "stale" |
7d1e6f16 PA |
868 | stale_nr=`ip netns exec $ns nstat -as | grep MPTcpExtSubflowStale | awk '{print $2}'` |
869 | [ -z "$stale_nr" ] && stale_nr=0 | |
870 | recover_nr=`ip netns exec $ns nstat -as | grep MPTcpExtSubflowRecover | awk '{print $2}'` | |
871 | [ -z "$recover_nr" ] && recover_nr=0 | |
872 | ||
873 | if [ $stale_nr -lt $stale_min ] || | |
874 | [ $stale_max -gt 0 -a $stale_nr -gt $stale_max ] || | |
875 | [ $((stale_nr - $recover_nr)) -ne $stale_delta ]; then | |
876 | echo "[fail] got $stale_nr stale[s] $recover_nr recover[s], " \ | |
877 | " expected stale in range [$stale_min..$stale_max]," \ | |
878 | " stale-recover delta $stale_delta " | |
879 | ret=1 | |
880 | dump_stats=1 | |
881 | else | |
882 | echo "[ ok ]" | |
883 | fi | |
884 | ||
885 | if [ "${dump_stats}" = 1 ]; then | |
886 | echo $ns stats | |
887 | ip netns exec $ns ip -s link show | |
888 | ip netns exec $ns nstat -as | grep MPTcp | |
889 | fi | |
890 | } | |
891 | ||
be613160 GT |
892 | chk_add_nr() |
893 | { | |
894 | local add_nr=$1 | |
895 | local echo_nr=$2 | |
8a127bf6 GT |
896 | local port_nr=${3:-0} |
897 | local syn_nr=${4:-$port_nr} | |
898 | local syn_ack_nr=${5:-$port_nr} | |
899 | local ack_nr=${6:-$port_nr} | |
900 | local mis_syn_nr=${7:-0} | |
901 | local mis_ack_nr=${8:-0} | |
be613160 GT |
902 | local count |
903 | local dump_stats | |
6ef84b15 PA |
904 | local timeout |
905 | ||
906 | timeout=`ip netns exec $ns1 sysctl -n net.mptcp.add_addr_timeout` | |
be613160 | 907 | |
9a0a9367 | 908 | printf "%-${nr_blank}s %s" " " "add" |
6ef84b15 | 909 | count=`ip netns exec $ns2 nstat -as MPTcpExtAddAddr | grep MPTcpExtAddAddr | awk '{print $2}'` |
be613160 | 910 | [ -z "$count" ] && count=0 |
6ef84b15 PA |
911 | |
912 | # if the test configured a short timeout tolerate greater then expected | |
913 | # add addrs options, due to retransmissions | |
914 | if [ "$count" != "$add_nr" ] && [ "$timeout" -gt 1 -o "$count" -lt "$add_nr" ]; then | |
be613160 GT |
915 | echo "[fail] got $count ADD_ADDR[s] expected $add_nr" |
916 | ret=1 | |
917 | dump_stats=1 | |
918 | else | |
919 | echo -n "[ ok ]" | |
920 | fi | |
921 | ||
922 | echo -n " - echo " | |
923 | count=`ip netns exec $ns1 nstat -as | grep MPTcpExtEchoAdd | awk '{print $2}'` | |
924 | [ -z "$count" ] && count=0 | |
925 | if [ "$count" != "$echo_nr" ]; then | |
926 | echo "[fail] got $count ADD_ADDR echo[s] expected $echo_nr" | |
927 | ret=1 | |
928 | dump_stats=1 | |
929 | else | |
8a127bf6 GT |
930 | echo -n "[ ok ]" |
931 | fi | |
932 | ||
933 | if [ $port_nr -gt 0 ]; then | |
934 | echo -n " - pt " | |
935 | count=`ip netns exec $ns2 nstat -as | grep MPTcpExtPortAdd | awk '{print $2}'` | |
936 | [ -z "$count" ] && count=0 | |
937 | if [ "$count" != "$port_nr" ]; then | |
938 | echo "[fail] got $count ADD_ADDR[s] with a port-number expected $port_nr" | |
939 | ret=1 | |
940 | dump_stats=1 | |
941 | else | |
942 | echo "[ ok ]" | |
943 | fi | |
944 | ||
9a0a9367 | 945 | printf "%-${nr_blank}s %s" " " "syn" |
8a127bf6 GT |
946 | count=`ip netns exec $ns1 nstat -as | grep MPTcpExtMPJoinPortSynRx | |
947 | awk '{print $2}'` | |
948 | [ -z "$count" ] && count=0 | |
949 | if [ "$count" != "$syn_nr" ]; then | |
950 | echo "[fail] got $count JOIN[s] syn with a different \ | |
951 | port-number expected $syn_nr" | |
952 | ret=1 | |
953 | dump_stats=1 | |
954 | else | |
955 | echo -n "[ ok ]" | |
956 | fi | |
957 | ||
958 | echo -n " - synack" | |
959 | count=`ip netns exec $ns2 nstat -as | grep MPTcpExtMPJoinPortSynAckRx | | |
960 | awk '{print $2}'` | |
961 | [ -z "$count" ] && count=0 | |
962 | if [ "$count" != "$syn_ack_nr" ]; then | |
963 | echo "[fail] got $count JOIN[s] synack with a different \ | |
964 | port-number expected $syn_ack_nr" | |
965 | ret=1 | |
966 | dump_stats=1 | |
967 | else | |
968 | echo -n "[ ok ]" | |
969 | fi | |
970 | ||
971 | echo -n " - ack" | |
972 | count=`ip netns exec $ns1 nstat -as | grep MPTcpExtMPJoinPortAckRx | | |
973 | awk '{print $2}'` | |
974 | [ -z "$count" ] && count=0 | |
975 | if [ "$count" != "$ack_nr" ]; then | |
976 | echo "[fail] got $count JOIN[s] ack with a different \ | |
977 | port-number expected $ack_nr" | |
978 | ret=1 | |
979 | dump_stats=1 | |
980 | else | |
981 | echo "[ ok ]" | |
982 | fi | |
983 | ||
9a0a9367 | 984 | printf "%-${nr_blank}s %s" " " "syn" |
8a127bf6 GT |
985 | count=`ip netns exec $ns1 nstat -as | grep MPTcpExtMismatchPortSynRx | |
986 | awk '{print $2}'` | |
987 | [ -z "$count" ] && count=0 | |
988 | if [ "$count" != "$mis_syn_nr" ]; then | |
989 | echo "[fail] got $count JOIN[s] syn with a mismatched \ | |
990 | port-number expected $mis_syn_nr" | |
991 | ret=1 | |
992 | dump_stats=1 | |
993 | else | |
994 | echo -n "[ ok ]" | |
995 | fi | |
996 | ||
997 | echo -n " - ack " | |
998 | count=`ip netns exec $ns1 nstat -as | grep MPTcpExtMismatchPortAckRx | | |
999 | awk '{print $2}'` | |
1000 | [ -z "$count" ] && count=0 | |
1001 | if [ "$count" != "$mis_ack_nr" ]; then | |
1002 | echo "[fail] got $count JOIN[s] ack with a mismatched \ | |
1003 | port-number expected $mis_ack_nr" | |
1004 | ret=1 | |
1005 | dump_stats=1 | |
1006 | else | |
1007 | echo "[ ok ]" | |
1008 | fi | |
1009 | else | |
1010 | echo "" | |
be613160 GT |
1011 | fi |
1012 | ||
327b9a94 | 1013 | [ "${dump_stats}" = 1 ] && dump_stats |
be613160 GT |
1014 | } |
1015 | ||
dd72b0fe GT |
1016 | chk_rm_nr() |
1017 | { | |
1018 | local rm_addr_nr=$1 | |
1019 | local rm_subflow_nr=$2 | |
7028ba8a | 1020 | local invert=${3:-""} |
dd72b0fe GT |
1021 | local count |
1022 | local dump_stats | |
7028ba8a GT |
1023 | local addr_ns |
1024 | local subflow_ns | |
1025 | ||
1026 | if [ -z $invert ]; then | |
1027 | addr_ns=$ns1 | |
1028 | subflow_ns=$ns2 | |
1029 | elif [ $invert = "invert" ]; then | |
1030 | addr_ns=$ns2 | |
1031 | subflow_ns=$ns1 | |
1032 | fi | |
dd72b0fe | 1033 | |
9a0a9367 | 1034 | printf "%-${nr_blank}s %s" " " "rm " |
7028ba8a | 1035 | count=`ip netns exec $addr_ns nstat -as | grep MPTcpExtRmAddr | awk '{print $2}'` |
dd72b0fe GT |
1036 | [ -z "$count" ] && count=0 |
1037 | if [ "$count" != "$rm_addr_nr" ]; then | |
1038 | echo "[fail] got $count RM_ADDR[s] expected $rm_addr_nr" | |
1039 | ret=1 | |
1040 | dump_stats=1 | |
1041 | else | |
1042 | echo -n "[ ok ]" | |
1043 | fi | |
1044 | ||
1045 | echo -n " - sf " | |
7028ba8a | 1046 | count=`ip netns exec $subflow_ns nstat -as | grep MPTcpExtRmSubflow | awk '{print $2}'` |
dd72b0fe GT |
1047 | [ -z "$count" ] && count=0 |
1048 | if [ "$count" != "$rm_subflow_nr" ]; then | |
1049 | echo "[fail] got $count RM_SUBFLOW[s] expected $rm_subflow_nr" | |
1050 | ret=1 | |
1051 | dump_stats=1 | |
1052 | else | |
1053 | echo "[ ok ]" | |
1054 | fi | |
1055 | ||
327b9a94 | 1056 | [ "${dump_stats}" = 1 ] && dump_stats |
dd72b0fe GT |
1057 | } |
1058 | ||
718eb44e GT |
1059 | chk_prio_nr() |
1060 | { | |
1061 | local mp_prio_nr_tx=$1 | |
1062 | local mp_prio_nr_rx=$2 | |
1063 | local count | |
1064 | local dump_stats | |
1065 | ||
9a0a9367 | 1066 | printf "%-${nr_blank}s %s" " " "ptx" |
718eb44e GT |
1067 | count=`ip netns exec $ns1 nstat -as | grep MPTcpExtMPPrioTx | awk '{print $2}'` |
1068 | [ -z "$count" ] && count=0 | |
1069 | if [ "$count" != "$mp_prio_nr_tx" ]; then | |
1070 | echo "[fail] got $count MP_PRIO[s] TX expected $mp_prio_nr_tx" | |
1071 | ret=1 | |
1072 | dump_stats=1 | |
1073 | else | |
1074 | echo -n "[ ok ]" | |
1075 | fi | |
1076 | ||
1077 | echo -n " - prx " | |
1078 | count=`ip netns exec $ns1 nstat -as | grep MPTcpExtMPPrioRx | awk '{print $2}'` | |
1079 | [ -z "$count" ] && count=0 | |
1080 | if [ "$count" != "$mp_prio_nr_rx" ]; then | |
1081 | echo "[fail] got $count MP_PRIO[s] RX expected $mp_prio_nr_rx" | |
1082 | ret=1 | |
1083 | dump_stats=1 | |
1084 | else | |
1085 | echo "[ ok ]" | |
1086 | fi | |
1087 | ||
327b9a94 | 1088 | [ "${dump_stats}" = 1 ] && dump_stats |
718eb44e GT |
1089 | } |
1090 | ||
7d1e6f16 PA |
1091 | chk_link_usage() |
1092 | { | |
1093 | local ns=$1 | |
1094 | local link=$2 | |
1095 | local out=$3 | |
1096 | local expected_rate=$4 | |
1097 | local tx_link=`ip netns exec $ns cat /sys/class/net/$link/statistics/tx_bytes` | |
1098 | local tx_total=`ls -l $out | awk '{print $5}'` | |
1099 | local tx_rate=$((tx_link * 100 / $tx_total)) | |
1100 | local tolerance=5 | |
1101 | ||
9a0a9367 | 1102 | printf "%-${nr_blank}s %-18s" " " "link usage" |
7d1e6f16 PA |
1103 | if [ $tx_rate -lt $((expected_rate - $tolerance)) -o \ |
1104 | $tx_rate -gt $((expected_rate + $tolerance)) ]; then | |
1105 | echo "[fail] got $tx_rate% usage, expected $expected_rate%" | |
1106 | ret=1 | |
1107 | else | |
1108 | echo "[ ok ]" | |
1109 | fi | |
1110 | } | |
1111 | ||
46e967d1 PA |
1112 | wait_for_tw() |
1113 | { | |
1114 | local timeout_ms=$((timeout_poll * 1000)) | |
1115 | local time=0 | |
1116 | local ns=$1 | |
1117 | ||
1118 | while [ $time -lt $timeout_ms ]; do | |
5b31dda7 | 1119 | local cnt=$(ip netns exec $ns nstat -as TcpAttemptFails | grep TcpAttemptFails | awk '{print $2}') |
46e967d1 PA |
1120 | |
1121 | [ "$cnt" = 1 ] && return 1 | |
1122 | time=$((time + 100)) | |
1123 | sleep 0.1 | |
1124 | done | |
1125 | return 1 | |
1126 | } | |
1127 | ||
1002b89f GT |
1128 | subflows_tests() |
1129 | { | |
1130 | reset | |
1131 | run_tests $ns1 $ns2 10.0.1.1 | |
1132 | chk_join_nr "no JOIN" "0" "0" "0" | |
1133 | ||
1134 | # subflow limited by client | |
1135 | reset | |
34aa6e3b GT |
1136 | pm_nl_set_limits $ns1 0 0 |
1137 | pm_nl_set_limits $ns2 0 0 | |
1138 | pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow | |
1002b89f GT |
1139 | run_tests $ns1 $ns2 10.0.1.1 |
1140 | chk_join_nr "single subflow, limited by client" 0 0 0 | |
1141 | ||
1142 | # subflow limited by server | |
1143 | reset | |
34aa6e3b GT |
1144 | pm_nl_set_limits $ns1 0 0 |
1145 | pm_nl_set_limits $ns2 0 1 | |
1146 | pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow | |
1002b89f GT |
1147 | run_tests $ns1 $ns2 10.0.1.1 |
1148 | chk_join_nr "single subflow, limited by server" 1 1 0 | |
1149 | ||
1150 | # subflow | |
1151 | reset | |
34aa6e3b GT |
1152 | pm_nl_set_limits $ns1 0 1 |
1153 | pm_nl_set_limits $ns2 0 1 | |
1154 | pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow | |
1002b89f GT |
1155 | run_tests $ns1 $ns2 10.0.1.1 |
1156 | chk_join_nr "single subflow" 1 1 1 | |
1157 | ||
1158 | # multiple subflows | |
1159 | reset | |
34aa6e3b GT |
1160 | pm_nl_set_limits $ns1 0 2 |
1161 | pm_nl_set_limits $ns2 0 2 | |
1162 | pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow | |
1163 | pm_nl_add_endpoint $ns2 10.0.2.2 flags subflow | |
1002b89f GT |
1164 | run_tests $ns1 $ns2 10.0.1.1 |
1165 | chk_join_nr "multiple subflows" 2 2 2 | |
1166 | ||
72bcbc46 | 1167 | # multiple subflows limited by server |
1002b89f | 1168 | reset |
34aa6e3b GT |
1169 | pm_nl_set_limits $ns1 0 1 |
1170 | pm_nl_set_limits $ns2 0 2 | |
1171 | pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow | |
1172 | pm_nl_add_endpoint $ns2 10.0.2.2 flags subflow | |
1002b89f GT |
1173 | run_tests $ns1 $ns2 10.0.1.1 |
1174 | chk_join_nr "multiple subflows, limited by server" 2 2 1 | |
c3eaa5f6 GT |
1175 | |
1176 | # single subflow, dev | |
1177 | reset | |
34aa6e3b GT |
1178 | pm_nl_set_limits $ns1 0 1 |
1179 | pm_nl_set_limits $ns2 0 1 | |
1180 | pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow dev ns2eth3 | |
c3eaa5f6 GT |
1181 | run_tests $ns1 $ns2 10.0.1.1 |
1182 | chk_join_nr "single subflow, dev" 1 1 1 | |
1002b89f GT |
1183 | } |
1184 | ||
46e967d1 PA |
1185 | subflows_error_tests() |
1186 | { | |
1187 | # If a single subflow is configured, and matches the MPC src | |
1188 | # address, no additional subflow should be created | |
1189 | reset | |
34aa6e3b GT |
1190 | pm_nl_set_limits $ns1 0 1 |
1191 | pm_nl_set_limits $ns2 0 1 | |
1192 | pm_nl_add_endpoint $ns2 10.0.1.2 flags subflow | |
46e967d1 PA |
1193 | run_tests $ns1 $ns2 10.0.1.1 0 0 0 slow |
1194 | chk_join_nr "no MPC reuse with single endpoint" 0 0 0 | |
1195 | ||
1196 | # multiple subflows, with subflow creation error | |
1197 | reset | |
34aa6e3b GT |
1198 | pm_nl_set_limits $ns1 0 2 |
1199 | pm_nl_set_limits $ns2 0 2 | |
1200 | pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow | |
1201 | pm_nl_add_endpoint $ns2 10.0.2.2 flags subflow | |
46e967d1 PA |
1202 | ip netns exec $ns1 iptables -A INPUT -s 10.0.3.2 -p tcp -j REJECT |
1203 | run_tests $ns1 $ns2 10.0.1.1 0 0 0 slow | |
1204 | chk_join_nr "multi subflows, with failing subflow" 1 1 1 | |
1205 | ||
1206 | # multiple subflows, with subflow timeout on MPJ | |
1207 | reset | |
34aa6e3b GT |
1208 | pm_nl_set_limits $ns1 0 2 |
1209 | pm_nl_set_limits $ns2 0 2 | |
1210 | pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow | |
1211 | pm_nl_add_endpoint $ns2 10.0.2.2 flags subflow | |
46e967d1 PA |
1212 | ip netns exec $ns1 iptables -A INPUT -s 10.0.3.2 -p tcp -j DROP |
1213 | run_tests $ns1 $ns2 10.0.1.1 0 0 0 slow | |
1214 | chk_join_nr "multi subflows, with subflow timeout" 1 1 1 | |
1215 | ||
1216 | # multiple subflows, check that the endpoint corresponding to | |
1217 | # closed subflow (due to reset) is not reused if additional | |
1218 | # subflows are added later | |
1219 | reset | |
34aa6e3b GT |
1220 | pm_nl_set_limits $ns1 0 1 |
1221 | pm_nl_set_limits $ns2 0 1 | |
1222 | pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow | |
46e967d1 PA |
1223 | ip netns exec $ns1 iptables -A INPUT -s 10.0.3.2 -p tcp -j REJECT |
1224 | run_tests $ns1 $ns2 10.0.1.1 0 0 0 slow & | |
1225 | ||
1226 | # updates in the child shell do not have any effect here, we | |
1227 | # need to bump the test counter for the above case | |
1228 | TEST_COUNT=$((TEST_COUNT+1)) | |
1229 | ||
1230 | # mpj subflow will be in TW after the reset | |
1231 | wait_for_tw $ns2 | |
34aa6e3b | 1232 | pm_nl_add_endpoint $ns2 10.0.2.2 flags subflow |
46e967d1 PA |
1233 | wait |
1234 | ||
1235 | # additional subflow could be created only if the PM select | |
1236 | # the later endpoint, skipping the already used one | |
1237 | chk_join_nr "multi subflows, fair usage on close" 1 1 1 | |
1238 | } | |
1239 | ||
1002b89f GT |
1240 | signal_address_tests() |
1241 | { | |
1242 | # add_address, unused | |
1243 | reset | |
34aa6e3b | 1244 | pm_nl_add_endpoint $ns1 10.0.2.1 flags signal |
1002b89f GT |
1245 | run_tests $ns1 $ns2 10.0.1.1 |
1246 | chk_join_nr "unused signal address" 0 0 0 | |
1247 | chk_add_nr 1 1 | |
1248 | ||
1249 | # accept and use add_addr | |
1250 | reset | |
34aa6e3b GT |
1251 | pm_nl_set_limits $ns1 0 1 |
1252 | pm_nl_set_limits $ns2 1 1 | |
1253 | pm_nl_add_endpoint $ns1 10.0.2.1 flags signal | |
1002b89f GT |
1254 | run_tests $ns1 $ns2 10.0.1.1 |
1255 | chk_join_nr "signal address" 1 1 1 | |
1256 | chk_add_nr 1 1 | |
1257 | ||
1258 | # accept and use add_addr with an additional subflow | |
1259 | # note: signal address in server ns and local addresses in client ns must | |
1260 | # belong to different subnets or one of the listed local address could be | |
1261 | # used for 'add_addr' subflow | |
1262 | reset | |
34aa6e3b GT |
1263 | pm_nl_add_endpoint $ns1 10.0.2.1 flags signal |
1264 | pm_nl_set_limits $ns1 0 2 | |
1265 | pm_nl_set_limits $ns2 1 2 | |
1266 | pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow | |
1002b89f GT |
1267 | run_tests $ns1 $ns2 10.0.1.1 |
1268 | chk_join_nr "subflow and signal" 2 2 2 | |
1269 | chk_add_nr 1 1 | |
1270 | ||
1271 | # accept and use add_addr with additional subflows | |
1272 | reset | |
34aa6e3b GT |
1273 | pm_nl_set_limits $ns1 0 3 |
1274 | pm_nl_add_endpoint $ns1 10.0.2.1 flags signal | |
1275 | pm_nl_set_limits $ns2 1 3 | |
1276 | pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow | |
1277 | pm_nl_add_endpoint $ns2 10.0.4.2 flags subflow | |
1002b89f GT |
1278 | run_tests $ns1 $ns2 10.0.1.1 |
1279 | chk_join_nr "multiple subflows and signal" 3 3 3 | |
1280 | chk_add_nr 1 1 | |
ef360019 GT |
1281 | |
1282 | # signal addresses | |
1283 | reset | |
34aa6e3b GT |
1284 | pm_nl_set_limits $ns1 3 3 |
1285 | pm_nl_add_endpoint $ns1 10.0.2.1 flags signal | |
1286 | pm_nl_add_endpoint $ns1 10.0.3.1 flags signal | |
1287 | pm_nl_add_endpoint $ns1 10.0.4.1 flags signal | |
1288 | pm_nl_set_limits $ns2 3 3 | |
ef360019 GT |
1289 | run_tests $ns1 $ns2 10.0.1.1 |
1290 | chk_join_nr "signal addresses" 3 3 3 | |
1291 | chk_add_nr 3 3 | |
1292 | ||
1293 | # signal invalid addresses | |
1294 | reset | |
34aa6e3b GT |
1295 | pm_nl_set_limits $ns1 3 3 |
1296 | pm_nl_add_endpoint $ns1 10.0.12.1 flags signal | |
1297 | pm_nl_add_endpoint $ns1 10.0.3.1 flags signal | |
1298 | pm_nl_add_endpoint $ns1 10.0.14.1 flags signal | |
1299 | pm_nl_set_limits $ns2 3 3 | |
ef360019 GT |
1300 | run_tests $ns1 $ns2 10.0.1.1 |
1301 | chk_join_nr "signal invalid addresses" 1 1 1 | |
1302 | chk_add_nr 3 3 | |
33c563ad YL |
1303 | |
1304 | # signal addresses race test | |
1305 | reset | |
34aa6e3b GT |
1306 | pm_nl_set_limits $ns1 4 4 |
1307 | pm_nl_set_limits $ns2 4 4 | |
1308 | pm_nl_add_endpoint $ns1 10.0.1.1 flags signal | |
1309 | pm_nl_add_endpoint $ns1 10.0.2.1 flags signal | |
1310 | pm_nl_add_endpoint $ns1 10.0.3.1 flags signal | |
1311 | pm_nl_add_endpoint $ns1 10.0.4.1 flags signal | |
1312 | pm_nl_add_endpoint $ns2 10.0.1.2 flags signal | |
1313 | pm_nl_add_endpoint $ns2 10.0.2.2 flags signal | |
1314 | pm_nl_add_endpoint $ns2 10.0.3.2 flags signal | |
1315 | pm_nl_add_endpoint $ns2 10.0.4.2 flags signal | |
6ef84b15 PA |
1316 | |
1317 | # the peer could possibly miss some addr notification, allow retransmission | |
1318 | ip netns exec $ns1 sysctl -q net.mptcp.add_addr_timeout=1 | |
1319 | run_tests $ns1 $ns2 10.0.1.1 0 0 0 slow | |
857898eb | 1320 | chk_join_nr "signal addresses race test" 3 3 3 |
86e39e04 PA |
1321 | |
1322 | # the server will not signal the address terminating | |
1323 | # the MPC subflow | |
1324 | chk_add_nr 3 3 | |
1002b89f GT |
1325 | } |
1326 | ||
1327 | link_failure_tests() | |
1328 | { | |
1329 | # accept and use add_addr with additional subflows and link loss | |
1330 | reset | |
7d1e6f16 PA |
1331 | |
1332 | # without any b/w limit each veth could spool the packets and get | |
1333 | # them acked at xmit time, so that the corresponding subflow will | |
1334 | # have almost always no outstanding pkts, the scheduler will pick | |
1335 | # always the first subflow and we will have hard time testing | |
1336 | # active backup and link switch-over. | |
1337 | # Let's set some arbitrary (low) virtual link limits. | |
1338 | init_shapers | |
34aa6e3b GT |
1339 | pm_nl_set_limits $ns1 0 3 |
1340 | pm_nl_add_endpoint $ns1 10.0.2.1 dev ns1eth2 flags signal | |
1341 | pm_nl_set_limits $ns2 1 3 | |
1342 | pm_nl_add_endpoint $ns2 10.0.3.2 dev ns2eth3 flags subflow | |
1343 | pm_nl_add_endpoint $ns2 10.0.4.2 dev ns2eth4 flags subflow | |
1002b89f GT |
1344 | run_tests $ns1 $ns2 10.0.1.1 1 |
1345 | chk_join_nr "multiple flows, signal, link failure" 3 3 3 | |
1346 | chk_add_nr 1 1 | |
7d1e6f16 PA |
1347 | chk_stale_nr $ns2 1 5 1 |
1348 | ||
1349 | # accept and use add_addr with additional subflows and link loss | |
1350 | # for bidirectional transfer | |
1351 | reset | |
1352 | init_shapers | |
34aa6e3b GT |
1353 | pm_nl_set_limits $ns1 0 3 |
1354 | pm_nl_add_endpoint $ns1 10.0.2.1 dev ns1eth2 flags signal | |
1355 | pm_nl_set_limits $ns2 1 3 | |
1356 | pm_nl_add_endpoint $ns2 10.0.3.2 dev ns2eth3 flags subflow | |
1357 | pm_nl_add_endpoint $ns2 10.0.4.2 dev ns2eth4 flags subflow | |
7d1e6f16 PA |
1358 | run_tests $ns1 $ns2 10.0.1.1 2 |
1359 | chk_join_nr "multi flows, signal, bidi, link fail" 3 3 3 | |
1360 | chk_add_nr 1 1 | |
1361 | chk_stale_nr $ns2 1 -1 1 | |
1362 | ||
1363 | # 2 subflows plus 1 backup subflow with a lossy link, backup | |
1364 | # will never be used | |
1365 | reset | |
1366 | init_shapers | |
34aa6e3b GT |
1367 | pm_nl_set_limits $ns1 0 2 |
1368 | pm_nl_add_endpoint $ns1 10.0.2.1 dev ns1eth2 flags signal | |
1369 | pm_nl_set_limits $ns2 1 2 | |
7d1e6f16 | 1370 | export FAILING_LINKS="1" |
34aa6e3b | 1371 | pm_nl_add_endpoint $ns2 10.0.3.2 dev ns2eth3 flags subflow,backup |
7d1e6f16 PA |
1372 | run_tests $ns1 $ns2 10.0.1.1 1 |
1373 | chk_join_nr "backup subflow unused, link failure" 2 2 2 | |
1374 | chk_add_nr 1 1 | |
1375 | chk_link_usage $ns2 ns2eth3 $cinsent 0 | |
1376 | ||
1377 | # 2 lossy links after half transfer, backup will get half of | |
1378 | # the traffic | |
1379 | reset | |
1380 | init_shapers | |
34aa6e3b GT |
1381 | pm_nl_set_limits $ns1 0 2 |
1382 | pm_nl_add_endpoint $ns1 10.0.2.1 dev ns1eth2 flags signal | |
1383 | pm_nl_set_limits $ns2 1 2 | |
1384 | pm_nl_add_endpoint $ns2 10.0.3.2 dev ns2eth3 flags subflow,backup | |
7d1e6f16 PA |
1385 | export FAILING_LINKS="1 2" |
1386 | run_tests $ns1 $ns2 10.0.1.1 1 | |
1387 | chk_join_nr "backup flow used, multi links fail" 2 2 2 | |
1388 | chk_add_nr 1 1 | |
1389 | chk_stale_nr $ns2 2 4 2 | |
1390 | chk_link_usage $ns2 ns2eth3 $cinsent 50 | |
1391 | ||
1392 | # use a backup subflow with the first subflow on a lossy link | |
1393 | # for bidirectional transfer | |
1394 | reset | |
1395 | init_shapers | |
34aa6e3b GT |
1396 | pm_nl_set_limits $ns1 0 2 |
1397 | pm_nl_add_endpoint $ns1 10.0.2.1 dev ns1eth2 flags signal | |
1398 | pm_nl_set_limits $ns2 1 3 | |
1399 | pm_nl_add_endpoint $ns2 10.0.3.2 dev ns2eth3 flags subflow,backup | |
7d1e6f16 PA |
1400 | run_tests $ns1 $ns2 10.0.1.1 2 |
1401 | chk_join_nr "backup flow used, bidi, link failure" 2 2 2 | |
1402 | chk_add_nr 1 1 | |
1403 | chk_stale_nr $ns2 1 -1 2 | |
1404 | chk_link_usage $ns2 ns2eth3 $cinsent 50 | |
1002b89f GT |
1405 | } |
1406 | ||
1407 | add_addr_timeout_tests() | |
1408 | { | |
1409 | # add_addr timeout | |
1410 | reset_with_add_addr_timeout | |
34aa6e3b GT |
1411 | pm_nl_set_limits $ns1 0 1 |
1412 | pm_nl_set_limits $ns2 1 1 | |
1413 | pm_nl_add_endpoint $ns1 10.0.2.1 flags signal | |
1002b89f GT |
1414 | run_tests $ns1 $ns2 10.0.1.1 0 0 0 slow |
1415 | chk_join_nr "signal address, ADD_ADDR timeout" 1 1 1 | |
1416 | chk_add_nr 4 0 | |
1417 | ||
1418 | # add_addr timeout IPv6 | |
1419 | reset_with_add_addr_timeout 6 | |
34aa6e3b GT |
1420 | pm_nl_set_limits $ns1 0 1 |
1421 | pm_nl_set_limits $ns2 1 1 | |
1422 | pm_nl_add_endpoint $ns1 dead:beef:2::1 flags signal | |
1002b89f GT |
1423 | run_tests $ns1 $ns2 dead:beef:1::1 0 0 0 slow |
1424 | chk_join_nr "signal address, ADD_ADDR6 timeout" 1 1 1 | |
1425 | chk_add_nr 4 0 | |
8da6229b GT |
1426 | |
1427 | # signal addresses timeout | |
1428 | reset_with_add_addr_timeout | |
34aa6e3b GT |
1429 | pm_nl_set_limits $ns1 2 2 |
1430 | pm_nl_add_endpoint $ns1 10.0.2.1 flags signal | |
1431 | pm_nl_add_endpoint $ns1 10.0.3.1 flags signal | |
1432 | pm_nl_set_limits $ns2 2 2 | |
8da6229b GT |
1433 | run_tests $ns1 $ns2 10.0.1.1 0 0 0 least |
1434 | chk_join_nr "signal addresses, ADD_ADDR timeout" 2 2 2 | |
1435 | chk_add_nr 8 0 | |
1436 | ||
1437 | # signal invalid addresses timeout | |
1438 | reset_with_add_addr_timeout | |
34aa6e3b GT |
1439 | pm_nl_set_limits $ns1 2 2 |
1440 | pm_nl_add_endpoint $ns1 10.0.12.1 flags signal | |
1441 | pm_nl_add_endpoint $ns1 10.0.3.1 flags signal | |
1442 | pm_nl_set_limits $ns2 2 2 | |
8da6229b GT |
1443 | run_tests $ns1 $ns2 10.0.1.1 0 0 0 least |
1444 | chk_join_nr "invalid address, ADD_ADDR timeout" 1 1 1 | |
1445 | chk_add_nr 8 0 | |
1002b89f GT |
1446 | } |
1447 | ||
1448 | remove_tests() | |
1449 | { | |
1450 | # single subflow, remove | |
1451 | reset | |
34aa6e3b GT |
1452 | pm_nl_set_limits $ns1 0 1 |
1453 | pm_nl_set_limits $ns2 0 1 | |
1454 | pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow | |
1002b89f GT |
1455 | run_tests $ns1 $ns2 10.0.1.1 0 0 -1 slow |
1456 | chk_join_nr "remove single subflow" 1 1 1 | |
1457 | chk_rm_nr 1 1 | |
1458 | ||
1459 | # multiple subflows, remove | |
1460 | reset | |
34aa6e3b GT |
1461 | pm_nl_set_limits $ns1 0 2 |
1462 | pm_nl_set_limits $ns2 0 2 | |
1463 | pm_nl_add_endpoint $ns2 10.0.2.2 flags subflow | |
1464 | pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow | |
1002b89f GT |
1465 | run_tests $ns1 $ns2 10.0.1.1 0 0 -2 slow |
1466 | chk_join_nr "remove multiple subflows" 2 2 2 | |
1467 | chk_rm_nr 2 2 | |
1468 | ||
1469 | # single address, remove | |
1470 | reset | |
34aa6e3b GT |
1471 | pm_nl_set_limits $ns1 0 1 |
1472 | pm_nl_add_endpoint $ns1 10.0.2.1 flags signal | |
1473 | pm_nl_set_limits $ns2 1 1 | |
1002b89f GT |
1474 | run_tests $ns1 $ns2 10.0.1.1 0 -1 0 slow |
1475 | chk_join_nr "remove single address" 1 1 1 | |
1476 | chk_add_nr 1 1 | |
7028ba8a | 1477 | chk_rm_nr 1 1 invert |
1002b89f GT |
1478 | |
1479 | # subflow and signal, remove | |
1480 | reset | |
34aa6e3b GT |
1481 | pm_nl_set_limits $ns1 0 2 |
1482 | pm_nl_add_endpoint $ns1 10.0.2.1 flags signal | |
1483 | pm_nl_set_limits $ns2 1 2 | |
1484 | pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow | |
1002b89f GT |
1485 | run_tests $ns1 $ns2 10.0.1.1 0 -1 -1 slow |
1486 | chk_join_nr "remove subflow and signal" 2 2 2 | |
1487 | chk_add_nr 1 1 | |
1488 | chk_rm_nr 1 1 | |
1489 | ||
1490 | # subflows and signal, remove | |
1491 | reset | |
34aa6e3b GT |
1492 | pm_nl_set_limits $ns1 0 3 |
1493 | pm_nl_add_endpoint $ns1 10.0.2.1 flags signal | |
1494 | pm_nl_set_limits $ns2 1 3 | |
1495 | pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow | |
1496 | pm_nl_add_endpoint $ns2 10.0.4.2 flags subflow | |
1002b89f GT |
1497 | run_tests $ns1 $ns2 10.0.1.1 0 -1 -2 slow |
1498 | chk_join_nr "remove subflows and signal" 3 3 3 | |
1499 | chk_add_nr 1 1 | |
1500 | chk_rm_nr 2 2 | |
1501 | ||
ef360019 GT |
1502 | # addresses remove |
1503 | reset | |
34aa6e3b GT |
1504 | pm_nl_set_limits $ns1 3 3 |
1505 | pm_nl_add_endpoint $ns1 10.0.2.1 flags signal id 250 | |
1506 | pm_nl_add_endpoint $ns1 10.0.3.1 flags signal | |
1507 | pm_nl_add_endpoint $ns1 10.0.4.1 flags signal | |
1508 | pm_nl_set_limits $ns2 3 3 | |
ef360019 GT |
1509 | run_tests $ns1 $ns2 10.0.1.1 0 -3 0 slow |
1510 | chk_join_nr "remove addresses" 3 3 3 | |
1511 | chk_add_nr 3 3 | |
1512 | chk_rm_nr 3 3 invert | |
1513 | ||
1514 | # invalid addresses remove | |
1515 | reset | |
34aa6e3b GT |
1516 | pm_nl_set_limits $ns1 3 3 |
1517 | pm_nl_add_endpoint $ns1 10.0.12.1 flags signal | |
1518 | pm_nl_add_endpoint $ns1 10.0.3.1 flags signal | |
1519 | pm_nl_add_endpoint $ns1 10.0.14.1 flags signal | |
1520 | pm_nl_set_limits $ns2 3 3 | |
ef360019 GT |
1521 | run_tests $ns1 $ns2 10.0.1.1 0 -3 0 slow |
1522 | chk_join_nr "remove invalid addresses" 1 1 1 | |
1523 | chk_add_nr 3 3 | |
1524 | chk_rm_nr 3 1 invert | |
1525 | ||
1002b89f GT |
1526 | # subflows and signal, flush |
1527 | reset | |
34aa6e3b GT |
1528 | pm_nl_set_limits $ns1 0 3 |
1529 | pm_nl_add_endpoint $ns1 10.0.2.1 flags signal | |
1530 | pm_nl_set_limits $ns2 1 3 | |
1531 | pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow | |
1532 | pm_nl_add_endpoint $ns2 10.0.4.2 flags subflow | |
1002b89f GT |
1533 | run_tests $ns1 $ns2 10.0.1.1 0 -8 -8 slow |
1534 | chk_join_nr "flush subflows and signal" 3 3 3 | |
1535 | chk_add_nr 1 1 | |
1536 | chk_rm_nr 2 2 | |
d2c4333a GT |
1537 | |
1538 | # subflows flush | |
1539 | reset | |
34aa6e3b GT |
1540 | pm_nl_set_limits $ns1 3 3 |
1541 | pm_nl_set_limits $ns2 3 3 | |
1542 | pm_nl_add_endpoint $ns2 10.0.2.2 flags subflow id 150 | |
1543 | pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow | |
1544 | pm_nl_add_endpoint $ns2 10.0.4.2 flags subflow | |
d2c4333a GT |
1545 | run_tests $ns1 $ns2 10.0.1.1 0 -8 -8 slow |
1546 | chk_join_nr "flush subflows" 3 3 3 | |
1547 | chk_rm_nr 3 3 | |
1548 | ||
1549 | # addresses flush | |
1550 | reset | |
34aa6e3b GT |
1551 | pm_nl_set_limits $ns1 3 3 |
1552 | pm_nl_add_endpoint $ns1 10.0.2.1 flags signal id 250 | |
1553 | pm_nl_add_endpoint $ns1 10.0.3.1 flags signal | |
1554 | pm_nl_add_endpoint $ns1 10.0.4.1 flags signal | |
1555 | pm_nl_set_limits $ns2 3 3 | |
d2c4333a GT |
1556 | run_tests $ns1 $ns2 10.0.1.1 0 -8 -8 slow |
1557 | chk_join_nr "flush addresses" 3 3 3 | |
1558 | chk_add_nr 3 3 | |
1559 | chk_rm_nr 3 3 invert | |
ef360019 GT |
1560 | |
1561 | # invalid addresses flush | |
1562 | reset | |
34aa6e3b GT |
1563 | pm_nl_set_limits $ns1 3 3 |
1564 | pm_nl_add_endpoint $ns1 10.0.12.1 flags signal | |
1565 | pm_nl_add_endpoint $ns1 10.0.3.1 flags signal | |
1566 | pm_nl_add_endpoint $ns1 10.0.14.1 flags signal | |
1567 | pm_nl_set_limits $ns2 3 3 | |
ef360019 GT |
1568 | run_tests $ns1 $ns2 10.0.1.1 0 -8 0 slow |
1569 | chk_join_nr "flush invalid addresses" 1 1 1 | |
1570 | chk_add_nr 3 3 | |
1571 | chk_rm_nr 3 1 invert | |
5e287fe7 GT |
1572 | |
1573 | # remove id 0 subflow | |
1574 | reset | |
34aa6e3b GT |
1575 | pm_nl_set_limits $ns1 0 1 |
1576 | pm_nl_set_limits $ns2 0 1 | |
1577 | pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow | |
5e287fe7 GT |
1578 | run_tests $ns1 $ns2 10.0.1.1 0 0 -9 slow |
1579 | chk_join_nr "remove id 0 subflow" 1 1 1 | |
1580 | chk_rm_nr 1 1 | |
1581 | ||
1582 | # remove id 0 address | |
1583 | reset | |
34aa6e3b GT |
1584 | pm_nl_set_limits $ns1 0 1 |
1585 | pm_nl_add_endpoint $ns1 10.0.2.1 flags signal | |
1586 | pm_nl_set_limits $ns2 1 1 | |
5e287fe7 GT |
1587 | run_tests $ns1 $ns2 10.0.1.1 0 -9 0 slow |
1588 | chk_join_nr "remove id 0 address" 1 1 1 | |
1589 | chk_add_nr 1 1 | |
1590 | chk_rm_nr 1 1 invert | |
1002b89f GT |
1591 | } |
1592 | ||
1593 | add_tests() | |
1594 | { | |
1595 | # add single subflow | |
1596 | reset | |
34aa6e3b GT |
1597 | pm_nl_set_limits $ns1 0 1 |
1598 | pm_nl_set_limits $ns2 0 1 | |
1002b89f GT |
1599 | run_tests $ns1 $ns2 10.0.1.1 0 0 1 slow |
1600 | chk_join_nr "add single subflow" 1 1 1 | |
1601 | ||
1602 | # add signal address | |
1603 | reset | |
34aa6e3b GT |
1604 | pm_nl_set_limits $ns1 0 1 |
1605 | pm_nl_set_limits $ns2 1 1 | |
1002b89f GT |
1606 | run_tests $ns1 $ns2 10.0.1.1 0 1 0 slow |
1607 | chk_join_nr "add signal address" 1 1 1 | |
1608 | chk_add_nr 1 1 | |
1609 | ||
1610 | # add multiple subflows | |
1611 | reset | |
34aa6e3b GT |
1612 | pm_nl_set_limits $ns1 0 2 |
1613 | pm_nl_set_limits $ns2 0 2 | |
1002b89f GT |
1614 | run_tests $ns1 $ns2 10.0.1.1 0 0 2 slow |
1615 | chk_join_nr "add multiple subflows" 2 2 2 | |
1616 | ||
1617 | # add multiple subflows IPv6 | |
1618 | reset | |
34aa6e3b GT |
1619 | pm_nl_set_limits $ns1 0 2 |
1620 | pm_nl_set_limits $ns2 0 2 | |
1002b89f GT |
1621 | run_tests $ns1 $ns2 dead:beef:1::1 0 0 2 slow |
1622 | chk_join_nr "add multiple subflows IPv6" 2 2 2 | |
1623 | ||
1624 | # add multiple addresses IPv6 | |
1625 | reset | |
34aa6e3b GT |
1626 | pm_nl_set_limits $ns1 0 2 |
1627 | pm_nl_set_limits $ns2 2 2 | |
1002b89f GT |
1628 | run_tests $ns1 $ns2 dead:beef:1::1 0 2 0 slow |
1629 | chk_join_nr "add multiple addresses IPv6" 2 2 2 | |
1630 | chk_add_nr 2 2 | |
1631 | } | |
1632 | ||
1633 | ipv6_tests() | |
1634 | { | |
1635 | # subflow IPv6 | |
1636 | reset | |
34aa6e3b GT |
1637 | pm_nl_set_limits $ns1 0 1 |
1638 | pm_nl_set_limits $ns2 0 1 | |
1639 | pm_nl_add_endpoint $ns2 dead:beef:3::2 dev ns2eth3 flags subflow | |
1002b89f GT |
1640 | run_tests $ns1 $ns2 dead:beef:1::1 0 0 0 slow |
1641 | chk_join_nr "single subflow IPv6" 1 1 1 | |
1642 | ||
1643 | # add_address, unused IPv6 | |
1644 | reset | |
34aa6e3b | 1645 | pm_nl_add_endpoint $ns1 dead:beef:2::1 flags signal |
1002b89f GT |
1646 | run_tests $ns1 $ns2 dead:beef:1::1 0 0 0 slow |
1647 | chk_join_nr "unused signal address IPv6" 0 0 0 | |
1648 | chk_add_nr 1 1 | |
1649 | ||
1650 | # signal address IPv6 | |
1651 | reset | |
34aa6e3b GT |
1652 | pm_nl_set_limits $ns1 0 1 |
1653 | pm_nl_add_endpoint $ns1 dead:beef:2::1 flags signal | |
1654 | pm_nl_set_limits $ns2 1 1 | |
1002b89f GT |
1655 | run_tests $ns1 $ns2 dead:beef:1::1 0 0 0 slow |
1656 | chk_join_nr "single address IPv6" 1 1 1 | |
1657 | chk_add_nr 1 1 | |
1658 | ||
1659 | # single address IPv6, remove | |
1660 | reset | |
34aa6e3b GT |
1661 | pm_nl_set_limits $ns1 0 1 |
1662 | pm_nl_add_endpoint $ns1 dead:beef:2::1 flags signal | |
1663 | pm_nl_set_limits $ns2 1 1 | |
1002b89f GT |
1664 | run_tests $ns1 $ns2 dead:beef:1::1 0 -1 0 slow |
1665 | chk_join_nr "remove single address IPv6" 1 1 1 | |
1666 | chk_add_nr 1 1 | |
7028ba8a | 1667 | chk_rm_nr 1 1 invert |
1002b89f GT |
1668 | |
1669 | # subflow and signal IPv6, remove | |
1670 | reset | |
34aa6e3b GT |
1671 | pm_nl_set_limits $ns1 0 2 |
1672 | pm_nl_add_endpoint $ns1 dead:beef:2::1 flags signal | |
1673 | pm_nl_set_limits $ns2 1 2 | |
1674 | pm_nl_add_endpoint $ns2 dead:beef:3::2 dev ns2eth3 flags subflow | |
1002b89f GT |
1675 | run_tests $ns1 $ns2 dead:beef:1::1 0 -1 -1 slow |
1676 | chk_join_nr "remove subflow and signal IPv6" 2 2 2 | |
1677 | chk_add_nr 1 1 | |
1678 | chk_rm_nr 1 1 | |
1679 | } | |
1680 | ||
1681 | v4mapped_tests() | |
1682 | { | |
1683 | # subflow IPv4-mapped to IPv4-mapped | |
1684 | reset | |
34aa6e3b GT |
1685 | pm_nl_set_limits $ns1 0 1 |
1686 | pm_nl_set_limits $ns2 0 1 | |
1687 | pm_nl_add_endpoint $ns2 "::ffff:10.0.3.2" flags subflow | |
1002b89f GT |
1688 | run_tests $ns1 $ns2 "::ffff:10.0.1.1" |
1689 | chk_join_nr "single subflow IPv4-mapped" 1 1 1 | |
1690 | ||
1691 | # signal address IPv4-mapped with IPv4-mapped sk | |
1692 | reset | |
34aa6e3b GT |
1693 | pm_nl_set_limits $ns1 0 1 |
1694 | pm_nl_set_limits $ns2 1 1 | |
1695 | pm_nl_add_endpoint $ns1 "::ffff:10.0.2.1" flags signal | |
1002b89f GT |
1696 | run_tests $ns1 $ns2 "::ffff:10.0.1.1" |
1697 | chk_join_nr "signal address IPv4-mapped" 1 1 1 | |
1698 | chk_add_nr 1 1 | |
1699 | ||
1700 | # subflow v4-map-v6 | |
1701 | reset | |
34aa6e3b GT |
1702 | pm_nl_set_limits $ns1 0 1 |
1703 | pm_nl_set_limits $ns2 0 1 | |
1704 | pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow | |
1002b89f GT |
1705 | run_tests $ns1 $ns2 "::ffff:10.0.1.1" |
1706 | chk_join_nr "single subflow v4-map-v6" 1 1 1 | |
1707 | ||
1708 | # signal address v4-map-v6 | |
1709 | reset | |
34aa6e3b GT |
1710 | pm_nl_set_limits $ns1 0 1 |
1711 | pm_nl_set_limits $ns2 1 1 | |
1712 | pm_nl_add_endpoint $ns1 10.0.2.1 flags signal | |
1002b89f GT |
1713 | run_tests $ns1 $ns2 "::ffff:10.0.1.1" |
1714 | chk_join_nr "signal address v4-map-v6" 1 1 1 | |
1715 | chk_add_nr 1 1 | |
1716 | ||
1717 | # subflow v6-map-v4 | |
1718 | reset | |
34aa6e3b GT |
1719 | pm_nl_set_limits $ns1 0 1 |
1720 | pm_nl_set_limits $ns2 0 1 | |
1721 | pm_nl_add_endpoint $ns2 "::ffff:10.0.3.2" flags subflow | |
1002b89f GT |
1722 | run_tests $ns1 $ns2 10.0.1.1 |
1723 | chk_join_nr "single subflow v6-map-v4" 1 1 1 | |
1724 | ||
1725 | # signal address v6-map-v4 | |
1726 | reset | |
34aa6e3b GT |
1727 | pm_nl_set_limits $ns1 0 1 |
1728 | pm_nl_set_limits $ns2 1 1 | |
1729 | pm_nl_add_endpoint $ns1 "::ffff:10.0.2.1" flags signal | |
1002b89f GT |
1730 | run_tests $ns1 $ns2 10.0.1.1 |
1731 | chk_join_nr "signal address v6-map-v4" 1 1 1 | |
1732 | chk_add_nr 1 1 | |
1733 | ||
1734 | # no subflow IPv6 to v4 address | |
1735 | reset | |
34aa6e3b GT |
1736 | pm_nl_set_limits $ns1 0 1 |
1737 | pm_nl_set_limits $ns2 0 1 | |
1738 | pm_nl_add_endpoint $ns2 dead:beef:2::2 flags subflow | |
1002b89f GT |
1739 | run_tests $ns1 $ns2 10.0.1.1 |
1740 | chk_join_nr "no JOIN with diff families v4-v6" 0 0 0 | |
1741 | ||
1742 | # no subflow IPv6 to v4 address even if v6 has a valid v4 at the end | |
1743 | reset | |
34aa6e3b GT |
1744 | pm_nl_set_limits $ns1 0 1 |
1745 | pm_nl_set_limits $ns2 0 1 | |
1746 | pm_nl_add_endpoint $ns2 dead:beef:2::10.0.3.2 flags subflow | |
1002b89f GT |
1747 | run_tests $ns1 $ns2 10.0.1.1 |
1748 | chk_join_nr "no JOIN with diff families v4-v6-2" 0 0 0 | |
1749 | ||
1750 | # no subflow IPv4 to v6 address, no need to slow down too then | |
1751 | reset | |
34aa6e3b GT |
1752 | pm_nl_set_limits $ns1 0 1 |
1753 | pm_nl_set_limits $ns2 0 1 | |
1754 | pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow | |
1002b89f GT |
1755 | run_tests $ns1 $ns2 dead:beef:1::1 |
1756 | chk_join_nr "no JOIN with diff families v6-v4" 0 0 0 | |
1757 | } | |
1758 | ||
1759 | backup_tests() | |
1760 | { | |
1761 | # single subflow, backup | |
1762 | reset | |
34aa6e3b GT |
1763 | pm_nl_set_limits $ns1 0 1 |
1764 | pm_nl_set_limits $ns2 0 1 | |
1765 | pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow,backup | |
1002b89f GT |
1766 | run_tests $ns1 $ns2 10.0.1.1 0 0 0 slow nobackup |
1767 | chk_join_nr "single subflow, backup" 1 1 1 | |
1768 | chk_prio_nr 0 1 | |
1769 | ||
1770 | # single address, backup | |
1771 | reset | |
34aa6e3b GT |
1772 | pm_nl_set_limits $ns1 0 1 |
1773 | pm_nl_add_endpoint $ns1 10.0.2.1 flags signal | |
1774 | pm_nl_set_limits $ns2 1 1 | |
1002b89f GT |
1775 | run_tests $ns1 $ns2 10.0.1.1 0 0 0 slow backup |
1776 | chk_join_nr "single address, backup" 1 1 1 | |
1777 | chk_add_nr 1 1 | |
1778 | chk_prio_nr 1 0 | |
33397b83 GT |
1779 | |
1780 | # single address with port, backup | |
1781 | reset | |
34aa6e3b GT |
1782 | pm_nl_set_limits $ns1 0 1 |
1783 | pm_nl_add_endpoint $ns1 10.0.2.1 flags signal port 10100 | |
1784 | pm_nl_set_limits $ns2 1 1 | |
33397b83 GT |
1785 | run_tests $ns1 $ns2 10.0.1.1 0 0 0 slow backup |
1786 | chk_join_nr "single address with port, backup" 1 1 1 | |
1787 | chk_add_nr 1 1 | |
1788 | chk_prio_nr 1 0 | |
1002b89f GT |
1789 | } |
1790 | ||
1791 | add_addr_ports_tests() | |
1792 | { | |
1793 | # signal address with port | |
1794 | reset | |
34aa6e3b GT |
1795 | pm_nl_set_limits $ns1 0 1 |
1796 | pm_nl_set_limits $ns2 1 1 | |
1797 | pm_nl_add_endpoint $ns1 10.0.2.1 flags signal port 10100 | |
1002b89f GT |
1798 | run_tests $ns1 $ns2 10.0.1.1 |
1799 | chk_join_nr "signal address with port" 1 1 1 | |
1800 | chk_add_nr 1 1 1 | |
1801 | ||
1802 | # subflow and signal with port | |
1803 | reset | |
34aa6e3b GT |
1804 | pm_nl_add_endpoint $ns1 10.0.2.1 flags signal port 10100 |
1805 | pm_nl_set_limits $ns1 0 2 | |
1806 | pm_nl_set_limits $ns2 1 2 | |
1807 | pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow | |
1002b89f GT |
1808 | run_tests $ns1 $ns2 10.0.1.1 |
1809 | chk_join_nr "subflow and signal with port" 2 2 2 | |
1810 | chk_add_nr 1 1 1 | |
1811 | ||
1812 | # single address with port, remove | |
1813 | reset | |
34aa6e3b GT |
1814 | pm_nl_set_limits $ns1 0 1 |
1815 | pm_nl_add_endpoint $ns1 10.0.2.1 flags signal port 10100 | |
1816 | pm_nl_set_limits $ns2 1 1 | |
1002b89f GT |
1817 | run_tests $ns1 $ns2 10.0.1.1 0 -1 0 slow |
1818 | chk_join_nr "remove single address with port" 1 1 1 | |
1819 | chk_add_nr 1 1 1 | |
7028ba8a | 1820 | chk_rm_nr 1 1 invert |
1002b89f GT |
1821 | |
1822 | # subflow and signal with port, remove | |
1823 | reset | |
34aa6e3b GT |
1824 | pm_nl_set_limits $ns1 0 2 |
1825 | pm_nl_add_endpoint $ns1 10.0.2.1 flags signal port 10100 | |
1826 | pm_nl_set_limits $ns2 1 2 | |
1827 | pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow | |
1002b89f GT |
1828 | run_tests $ns1 $ns2 10.0.1.1 0 -1 -1 slow |
1829 | chk_join_nr "remove subflow and signal with port" 2 2 2 | |
1830 | chk_add_nr 1 1 1 | |
1831 | chk_rm_nr 1 1 | |
1832 | ||
1833 | # subflows and signal with port, flush | |
1834 | reset | |
34aa6e3b GT |
1835 | pm_nl_set_limits $ns1 0 3 |
1836 | pm_nl_add_endpoint $ns1 10.0.2.1 flags signal port 10100 | |
1837 | pm_nl_set_limits $ns2 1 3 | |
1838 | pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow | |
1839 | pm_nl_add_endpoint $ns2 10.0.4.2 flags subflow | |
327b9a94 | 1840 | run_tests $ns1 $ns2 10.0.1.1 0 -8 -2 slow |
1002b89f GT |
1841 | chk_join_nr "flush subflows and signal with port" 3 3 3 |
1842 | chk_add_nr 1 1 | |
1843 | chk_rm_nr 2 2 | |
1844 | ||
1845 | # multiple addresses with port | |
1846 | reset | |
34aa6e3b GT |
1847 | pm_nl_set_limits $ns1 2 2 |
1848 | pm_nl_add_endpoint $ns1 10.0.2.1 flags signal port 10100 | |
1849 | pm_nl_add_endpoint $ns1 10.0.3.1 flags signal port 10100 | |
1850 | pm_nl_set_limits $ns2 2 2 | |
1002b89f GT |
1851 | run_tests $ns1 $ns2 10.0.1.1 |
1852 | chk_join_nr "multiple addresses with port" 2 2 2 | |
1853 | chk_add_nr 2 2 2 | |
1854 | ||
1855 | # multiple addresses with ports | |
1856 | reset | |
34aa6e3b GT |
1857 | pm_nl_set_limits $ns1 2 2 |
1858 | pm_nl_add_endpoint $ns1 10.0.2.1 flags signal port 10100 | |
1859 | pm_nl_add_endpoint $ns1 10.0.3.1 flags signal port 10101 | |
1860 | pm_nl_set_limits $ns2 2 2 | |
1002b89f GT |
1861 | run_tests $ns1 $ns2 10.0.1.1 |
1862 | chk_join_nr "multiple addresses with ports" 2 2 2 | |
1863 | chk_add_nr 2 2 2 | |
1864 | } | |
1865 | ||
1866 | syncookies_tests() | |
1867 | { | |
1868 | # single subflow, syncookies | |
1869 | reset_with_cookies | |
34aa6e3b GT |
1870 | pm_nl_set_limits $ns1 0 1 |
1871 | pm_nl_set_limits $ns2 0 1 | |
1872 | pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow | |
1002b89f GT |
1873 | run_tests $ns1 $ns2 10.0.1.1 |
1874 | chk_join_nr "single subflow with syn cookies" 1 1 1 | |
1875 | ||
1876 | # multiple subflows with syn cookies | |
1877 | reset_with_cookies | |
34aa6e3b GT |
1878 | pm_nl_set_limits $ns1 0 2 |
1879 | pm_nl_set_limits $ns2 0 2 | |
1880 | pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow | |
1881 | pm_nl_add_endpoint $ns2 10.0.2.2 flags subflow | |
1002b89f GT |
1882 | run_tests $ns1 $ns2 10.0.1.1 |
1883 | chk_join_nr "multiple subflows with syn cookies" 2 2 2 | |
1884 | ||
1885 | # multiple subflows limited by server | |
1886 | reset_with_cookies | |
34aa6e3b GT |
1887 | pm_nl_set_limits $ns1 0 1 |
1888 | pm_nl_set_limits $ns2 0 2 | |
1889 | pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow | |
1890 | pm_nl_add_endpoint $ns2 10.0.2.2 flags subflow | |
1002b89f | 1891 | run_tests $ns1 $ns2 10.0.1.1 |
a7da4416 | 1892 | chk_join_nr "subflows limited by server w cookies" 2 1 1 |
1002b89f GT |
1893 | |
1894 | # test signal address with cookies | |
1895 | reset_with_cookies | |
34aa6e3b GT |
1896 | pm_nl_set_limits $ns1 0 1 |
1897 | pm_nl_set_limits $ns2 1 1 | |
1898 | pm_nl_add_endpoint $ns1 10.0.2.1 flags signal | |
1002b89f GT |
1899 | run_tests $ns1 $ns2 10.0.1.1 |
1900 | chk_join_nr "signal address with syn cookies" 1 1 1 | |
1901 | chk_add_nr 1 1 | |
1902 | ||
1903 | # test cookie with subflow and signal | |
1904 | reset_with_cookies | |
34aa6e3b GT |
1905 | pm_nl_add_endpoint $ns1 10.0.2.1 flags signal |
1906 | pm_nl_set_limits $ns1 0 2 | |
1907 | pm_nl_set_limits $ns2 1 2 | |
1908 | pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow | |
1002b89f GT |
1909 | run_tests $ns1 $ns2 10.0.1.1 |
1910 | chk_join_nr "subflow and signal w cookies" 2 2 2 | |
1911 | chk_add_nr 1 1 | |
1912 | ||
1913 | # accept and use add_addr with additional subflows | |
1914 | reset_with_cookies | |
34aa6e3b GT |
1915 | pm_nl_set_limits $ns1 0 3 |
1916 | pm_nl_add_endpoint $ns1 10.0.2.1 flags signal | |
1917 | pm_nl_set_limits $ns2 1 3 | |
1918 | pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow | |
1919 | pm_nl_add_endpoint $ns2 10.0.4.2 flags subflow | |
1002b89f GT |
1920 | run_tests $ns1 $ns2 10.0.1.1 |
1921 | chk_join_nr "subflows and signal w. cookies" 3 3 3 | |
1922 | chk_add_nr 1 1 | |
1923 | } | |
1924 | ||
af66d3e1 GT |
1925 | checksum_tests() |
1926 | { | |
1927 | # checksum test 0 0 | |
1928 | reset_with_checksum 0 0 | |
34aa6e3b GT |
1929 | pm_nl_set_limits $ns1 0 1 |
1930 | pm_nl_set_limits $ns2 0 1 | |
af66d3e1 GT |
1931 | run_tests $ns1 $ns2 10.0.1.1 |
1932 | chk_csum_nr "checksum test 0 0" | |
1933 | ||
1934 | # checksum test 1 1 | |
1935 | reset_with_checksum 1 1 | |
34aa6e3b GT |
1936 | pm_nl_set_limits $ns1 0 1 |
1937 | pm_nl_set_limits $ns2 0 1 | |
af66d3e1 GT |
1938 | run_tests $ns1 $ns2 10.0.1.1 |
1939 | chk_csum_nr "checksum test 1 1" | |
1940 | ||
1941 | # checksum test 0 1 | |
1942 | reset_with_checksum 0 1 | |
34aa6e3b GT |
1943 | pm_nl_set_limits $ns1 0 1 |
1944 | pm_nl_set_limits $ns2 0 1 | |
af66d3e1 GT |
1945 | run_tests $ns1 $ns2 10.0.1.1 |
1946 | chk_csum_nr "checksum test 0 1" | |
1947 | ||
1948 | # checksum test 1 0 | |
1949 | reset_with_checksum 1 0 | |
34aa6e3b GT |
1950 | pm_nl_set_limits $ns1 0 1 |
1951 | pm_nl_set_limits $ns2 0 1 | |
af66d3e1 GT |
1952 | run_tests $ns1 $ns2 10.0.1.1 |
1953 | chk_csum_nr "checksum test 1 0" | |
1954 | } | |
1955 | ||
0cddb4a6 GT |
1956 | deny_join_id0_tests() |
1957 | { | |
1958 | # subflow allow join id0 ns1 | |
1959 | reset_with_allow_join_id0 1 0 | |
34aa6e3b GT |
1960 | pm_nl_set_limits $ns1 1 1 |
1961 | pm_nl_set_limits $ns2 1 1 | |
1962 | pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow | |
0cddb4a6 GT |
1963 | run_tests $ns1 $ns2 10.0.1.1 |
1964 | chk_join_nr "single subflow allow join id0 ns1" 1 1 1 | |
1965 | ||
1966 | # subflow allow join id0 ns2 | |
1967 | reset_with_allow_join_id0 0 1 | |
34aa6e3b GT |
1968 | pm_nl_set_limits $ns1 1 1 |
1969 | pm_nl_set_limits $ns2 1 1 | |
1970 | pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow | |
0cddb4a6 GT |
1971 | run_tests $ns1 $ns2 10.0.1.1 |
1972 | chk_join_nr "single subflow allow join id0 ns2" 0 0 0 | |
1973 | ||
1974 | # signal address allow join id0 ns1 | |
1975 | # ADD_ADDRs are not affected by allow_join_id0 value. | |
1976 | reset_with_allow_join_id0 1 0 | |
34aa6e3b GT |
1977 | pm_nl_set_limits $ns1 1 1 |
1978 | pm_nl_set_limits $ns2 1 1 | |
1979 | pm_nl_add_endpoint $ns1 10.0.2.1 flags signal | |
0cddb4a6 GT |
1980 | run_tests $ns1 $ns2 10.0.1.1 |
1981 | chk_join_nr "signal address allow join id0 ns1" 1 1 1 | |
1982 | chk_add_nr 1 1 | |
1983 | ||
1984 | # signal address allow join id0 ns2 | |
1985 | # ADD_ADDRs are not affected by allow_join_id0 value. | |
1986 | reset_with_allow_join_id0 0 1 | |
34aa6e3b GT |
1987 | pm_nl_set_limits $ns1 1 1 |
1988 | pm_nl_set_limits $ns2 1 1 | |
1989 | pm_nl_add_endpoint $ns1 10.0.2.1 flags signal | |
0cddb4a6 GT |
1990 | run_tests $ns1 $ns2 10.0.1.1 |
1991 | chk_join_nr "signal address allow join id0 ns2" 1 1 1 | |
1992 | chk_add_nr 1 1 | |
1993 | ||
1994 | # subflow and address allow join id0 ns1 | |
1995 | reset_with_allow_join_id0 1 0 | |
34aa6e3b GT |
1996 | pm_nl_set_limits $ns1 2 2 |
1997 | pm_nl_set_limits $ns2 2 2 | |
1998 | pm_nl_add_endpoint $ns1 10.0.2.1 flags signal | |
1999 | pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow | |
0cddb4a6 GT |
2000 | run_tests $ns1 $ns2 10.0.1.1 |
2001 | chk_join_nr "subflow and address allow join id0 1" 2 2 2 | |
2002 | ||
2003 | # subflow and address allow join id0 ns2 | |
2004 | reset_with_allow_join_id0 0 1 | |
34aa6e3b GT |
2005 | pm_nl_set_limits $ns1 2 2 |
2006 | pm_nl_set_limits $ns2 2 2 | |
2007 | pm_nl_add_endpoint $ns1 10.0.2.1 flags signal | |
2008 | pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow | |
0cddb4a6 GT |
2009 | run_tests $ns1 $ns2 10.0.1.1 |
2010 | chk_join_nr "subflow and address allow join id0 2" 1 1 1 | |
2011 | } | |
2012 | ||
4f49d633 GT |
2013 | fullmesh_tests() |
2014 | { | |
2015 | # fullmesh 1 | |
2016 | # 2 fullmesh addrs in ns2, added before the connection, | |
2017 | # 1 non-fullmesh addr in ns1, added during the connection. | |
2018 | reset | |
34aa6e3b GT |
2019 | pm_nl_set_limits $ns1 0 4 |
2020 | pm_nl_set_limits $ns2 1 4 | |
2021 | pm_nl_add_endpoint $ns2 10.0.2.2 flags subflow,fullmesh | |
2022 | pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow,fullmesh | |
4f49d633 GT |
2023 | run_tests $ns1 $ns2 10.0.1.1 0 1 0 slow |
2024 | chk_join_nr "fullmesh test 2x1" 4 4 4 | |
2025 | chk_add_nr 1 1 | |
2026 | ||
2027 | # fullmesh 2 | |
2028 | # 1 non-fullmesh addr in ns1, added before the connection, | |
2029 | # 1 fullmesh addr in ns2, added during the connection. | |
2030 | reset | |
34aa6e3b GT |
2031 | pm_nl_set_limits $ns1 1 3 |
2032 | pm_nl_set_limits $ns2 1 3 | |
2033 | pm_nl_add_endpoint $ns1 10.0.2.1 flags signal | |
4f49d633 GT |
2034 | run_tests $ns1 $ns2 10.0.1.1 0 0 fullmesh_1 slow |
2035 | chk_join_nr "fullmesh test 1x1" 3 3 3 | |
2036 | chk_add_nr 1 1 | |
2037 | ||
2038 | # fullmesh 3 | |
2039 | # 1 non-fullmesh addr in ns1, added before the connection, | |
2040 | # 2 fullmesh addrs in ns2, added during the connection. | |
2041 | reset | |
34aa6e3b GT |
2042 | pm_nl_set_limits $ns1 2 5 |
2043 | pm_nl_set_limits $ns2 1 5 | |
2044 | pm_nl_add_endpoint $ns1 10.0.2.1 flags signal | |
4f49d633 GT |
2045 | run_tests $ns1 $ns2 10.0.1.1 0 0 fullmesh_2 slow |
2046 | chk_join_nr "fullmesh test 1x2" 5 5 5 | |
2047 | chk_add_nr 1 1 | |
2048 | ||
2049 | # fullmesh 4 | |
2050 | # 1 non-fullmesh addr in ns1, added before the connection, | |
2051 | # 2 fullmesh addrs in ns2, added during the connection, | |
2052 | # limit max_subflows to 4. | |
2053 | reset | |
34aa6e3b GT |
2054 | pm_nl_set_limits $ns1 2 4 |
2055 | pm_nl_set_limits $ns2 1 4 | |
2056 | pm_nl_add_endpoint $ns1 10.0.2.1 flags signal | |
4f49d633 GT |
2057 | run_tests $ns1 $ns2 10.0.1.1 0 0 fullmesh_2 slow |
2058 | chk_join_nr "fullmesh test 1x2, limited" 4 4 4 | |
2059 | chk_add_nr 1 1 | |
6a0653b9 GT |
2060 | |
2061 | # set fullmesh flag | |
2062 | reset | |
34aa6e3b GT |
2063 | pm_nl_set_limits $ns1 4 4 |
2064 | pm_nl_add_endpoint $ns1 10.0.2.1 flags subflow | |
2065 | pm_nl_set_limits $ns2 4 4 | |
6a0653b9 GT |
2066 | run_tests $ns1 $ns2 10.0.1.1 0 0 1 slow fullmesh |
2067 | chk_join_nr "set fullmesh flag test" 2 2 2 | |
2068 | chk_rm_nr 0 1 | |
2069 | ||
2070 | # set nofullmesh flag | |
2071 | reset | |
34aa6e3b GT |
2072 | pm_nl_set_limits $ns1 4 4 |
2073 | pm_nl_add_endpoint $ns1 10.0.2.1 flags subflow,fullmesh | |
2074 | pm_nl_set_limits $ns2 4 4 | |
6a0653b9 GT |
2075 | run_tests $ns1 $ns2 10.0.1.1 0 0 fullmesh_1 slow nofullmesh |
2076 | chk_join_nr "set nofullmesh flag test" 2 2 2 | |
2077 | chk_rm_nr 0 1 | |
2078 | ||
2079 | # set backup,fullmesh flags | |
2080 | reset | |
34aa6e3b GT |
2081 | pm_nl_set_limits $ns1 4 4 |
2082 | pm_nl_add_endpoint $ns1 10.0.2.1 flags subflow | |
2083 | pm_nl_set_limits $ns2 4 4 | |
6a0653b9 GT |
2084 | run_tests $ns1 $ns2 10.0.1.1 0 0 1 slow backup,fullmesh |
2085 | chk_join_nr "set backup,fullmesh flags test" 2 2 2 | |
2086 | chk_prio_nr 0 1 | |
2087 | chk_rm_nr 0 1 | |
2088 | ||
2089 | # set nobackup,nofullmesh flags | |
2090 | reset | |
34aa6e3b GT |
2091 | pm_nl_set_limits $ns1 4 4 |
2092 | pm_nl_set_limits $ns2 4 4 | |
2093 | pm_nl_add_endpoint $ns2 10.0.2.2 flags subflow,backup,fullmesh | |
6a0653b9 GT |
2094 | run_tests $ns1 $ns2 10.0.1.1 0 0 0 slow nobackup,nofullmesh |
2095 | chk_join_nr "set nobackup,nofullmesh flags test" 2 2 2 | |
2096 | chk_prio_nr 0 1 | |
2097 | chk_rm_nr 0 1 | |
4f49d633 GT |
2098 | } |
2099 | ||
1002b89f GT |
2100 | all_tests() |
2101 | { | |
2102 | subflows_tests | |
46e967d1 | 2103 | subflows_error_tests |
1002b89f GT |
2104 | signal_address_tests |
2105 | link_failure_tests | |
2106 | add_addr_timeout_tests | |
2107 | remove_tests | |
2108 | add_tests | |
2109 | ipv6_tests | |
2110 | v4mapped_tests | |
2111 | backup_tests | |
2112 | add_addr_ports_tests | |
2113 | syncookies_tests | |
af66d3e1 | 2114 | checksum_tests |
0cddb4a6 | 2115 | deny_join_id0_tests |
4f49d633 | 2116 | fullmesh_tests |
1002b89f GT |
2117 | } |
2118 | ||
22514d52 | 2119 | # [$1: error message] |
1002b89f GT |
2120 | usage() |
2121 | { | |
22514d52 MB |
2122 | if [ -n "${1}" ]; then |
2123 | echo "${1}" | |
2124 | ret=1 | |
2125 | fi | |
2126 | ||
1002b89f GT |
2127 | echo "mptcp_join usage:" |
2128 | echo " -f subflows_tests" | |
46e967d1 | 2129 | echo " -e subflows_error_tests" |
1002b89f GT |
2130 | echo " -s signal_address_tests" |
2131 | echo " -l link_failure_tests" | |
2132 | echo " -t add_addr_timeout_tests" | |
2133 | echo " -r remove_tests" | |
2134 | echo " -a add_tests" | |
2135 | echo " -6 ipv6_tests" | |
2136 | echo " -4 v4mapped_tests" | |
2137 | echo " -b backup_tests" | |
2138 | echo " -p add_addr_ports_tests" | |
a673321a | 2139 | echo " -k syncookies_tests" |
af66d3e1 | 2140 | echo " -S checksum_tests" |
0cddb4a6 | 2141 | echo " -d deny_join_id0_tests" |
4f49d633 | 2142 | echo " -m fullmesh_tests" |
a673321a | 2143 | echo " -c capture pcap files" |
af66d3e1 | 2144 | echo " -C enable data checksum" |
621bd393 | 2145 | echo " -i use ip mptcp" |
1002b89f | 2146 | echo " -h help" |
22514d52 MB |
2147 | |
2148 | exit ${ret} | |
1002b89f GT |
2149 | } |
2150 | ||
a673321a | 2151 | for arg in "$@"; do |
af66d3e1 | 2152 | # check for "capture/checksum" args before launching tests |
a673321a MM |
2153 | if [[ "${arg}" =~ ^"-"[0-9a-zA-Z]*"c"[0-9a-zA-Z]*$ ]]; then |
2154 | capture=1 | |
2155 | fi | |
af66d3e1 GT |
2156 | if [[ "${arg}" =~ ^"-"[0-9a-zA-Z]*"C"[0-9a-zA-Z]*$ ]]; then |
2157 | checksum=1 | |
2158 | fi | |
621bd393 GT |
2159 | if [[ "${arg}" =~ ^"-"[0-9a-zA-Z]*"i"[0-9a-zA-Z]*$ ]]; then |
2160 | ip_mptcp=1 | |
2161 | fi | |
a673321a | 2162 | |
621bd393 GT |
2163 | # exception for the capture/checksum/ip_mptcp options, the rest means: a part of the tests |
2164 | if [ "${arg}" != "-c" ] && [ "${arg}" != "-C" ] && [ "${arg}" != "-i" ]; then | |
a673321a MM |
2165 | do_all_tests=0 |
2166 | fi | |
2167 | done | |
2168 | ||
2169 | if [ $do_all_tests -eq 1 ]; then | |
1002b89f GT |
2170 | all_tests |
2171 | exit $ret | |
2172 | fi | |
2173 | ||
621bd393 | 2174 | while getopts 'fesltra64bpkdmchCSi' opt; do |
1002b89f GT |
2175 | case $opt in |
2176 | f) | |
2177 | subflows_tests | |
2178 | ;; | |
46e967d1 PA |
2179 | e) |
2180 | subflows_error_tests | |
2181 | ;; | |
1002b89f GT |
2182 | s) |
2183 | signal_address_tests | |
2184 | ;; | |
2185 | l) | |
2186 | link_failure_tests | |
2187 | ;; | |
2188 | t) | |
2189 | add_addr_timeout_tests | |
2190 | ;; | |
2191 | r) | |
2192 | remove_tests | |
2193 | ;; | |
2194 | a) | |
2195 | add_tests | |
2196 | ;; | |
2197 | 6) | |
2198 | ipv6_tests | |
2199 | ;; | |
2200 | 4) | |
2201 | v4mapped_tests | |
2202 | ;; | |
2203 | b) | |
2204 | backup_tests | |
2205 | ;; | |
2206 | p) | |
2207 | add_addr_ports_tests | |
2208 | ;; | |
a673321a | 2209 | k) |
1002b89f GT |
2210 | syncookies_tests |
2211 | ;; | |
af66d3e1 GT |
2212 | S) |
2213 | checksum_tests | |
2214 | ;; | |
0cddb4a6 GT |
2215 | d) |
2216 | deny_join_id0_tests | |
2217 | ;; | |
4f49d633 GT |
2218 | m) |
2219 | fullmesh_tests | |
2220 | ;; | |
a673321a MM |
2221 | c) |
2222 | ;; | |
af66d3e1 GT |
2223 | C) |
2224 | ;; | |
621bd393 GT |
2225 | i) |
2226 | ;; | |
22514d52 | 2227 | h) |
1002b89f GT |
2228 | usage |
2229 | ;; | |
22514d52 MB |
2230 | *) |
2231 | usage "Unknown option: -${opt}" | |
2232 | ;; | |
1002b89f GT |
2233 | esac |
2234 | done | |
00587187 | 2235 | |
b08fbf24 | 2236 | exit $ret |