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