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