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