]> git.ipfire.org Git - thirdparty/kernel/stable.git/blame - tools/testing/selftests/net/mptcp/mptcp_join.sh
Merge tag 'kvm-x86-mmu-6.7' of https://github.com/kvm-x86/linux into HEAD
[thirdparty/kernel/stable.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
0fcd72df
MB
9# ShellCheck incorrectly believes that most of the code here is unreachable
10# because it's invoked by variable name, see how the "tests" array is used
11#shellcheck disable=SC2317
12
715c78a8
MB
13. "$(dirname "${0}")/mptcp_lib.sh"
14
b08fbf24
PA
15ret=0
16sin=""
7d1e6f16 17sinfail=""
b08fbf24
PA
18sout=""
19cin=""
7d1e6f16 20cinfail=""
8b819a84 21cinsent=""
d328fe87 22tmpfile=""
b08fbf24 23cout=""
1e777bd8
MB
24capout=""
25ns1=""
26ns2=""
b08fbf24 27ksft_skip=4
0c4cd3f8
MB
28iptables="iptables"
29ip6tables="ip6tables"
5888a61c
MB
30timeout_poll=30
31timeout_test=$((timeout_poll * 2 + 1))
b08fbf24 32capture=0
af66d3e1 33checksum=0
34aa6e3b 34ip_mptcp=0
8117dac3 35check_invert=0
3c082695 36validate_checksum=0
93827ad5 37init=0
a3735625
GT
38evts_ns1=""
39evts_ns2=""
40evts_ns1_pid=0
41evts_ns2_pid=0
7f117cd3
MB
42last_test_failed=0
43last_test_skipped=0
44last_test_ignored=1
b08fbf24 45
3afd0280 46declare -A all_tests
c7d49c03
MB
47declare -a only_tests_ids
48declare -a only_tests_names
39aab882 49declare -A failed_tests
b08fbf24 50TEST_COUNT=0
c7d49c03 51TEST_NAME=""
03668c65 52nr_blank=6
b08fbf24 53
662aa22d
GT
54# These var are used only in some tests, make sure they are not already set
55unset FAILING_LINKS
56unset test_linkfail
57unset addr_nr_ns1
58unset addr_nr_ns2
59unset sflags
080b7f57 60unset fastclose
4aadde08 61unset fullmesh
e571fb09 62unset speed
e59300ce 63
8d014eaa
GT
64# generated using "nfbpf_compile '(ip && (ip[54] & 0xf0) == 0x30) ||
65# (ip6 && (ip6[74] & 0xf0) == 0x30)'"
66CBPF_MPTCP_SUBOPTION_ADD_ADDR="14,
67 48 0 0 0,
68 84 0 0 240,
69 21 0 3 64,
70 48 0 0 54,
71 84 0 0 240,
72 21 6 7 48,
73 48 0 0 0,
74 84 0 0 240,
75 21 0 4 96,
76 48 0 0 74,
77 84 0 0 240,
78 21 0 1 48,
79 6 0 0 65535,
80 6 0 0 0"
81
93827ad5 82init_partial()
b08fbf24
PA
83{
84 capout=$(mktemp)
85
787eb1e4
MB
86 local sec rndh
87 sec=$(date +%s)
88 rndh=$(printf %x $sec)-$(mktemp -u XXXXXX)
b08fbf24
PA
89
90 ns1="ns1-$rndh"
91 ns2="ns2-$rndh"
92
1e777bd8
MB
93 local netns
94 for netns in "$ns1" "$ns2"; do
b08fbf24
PA
95 ip netns add $netns || exit $ksft_skip
96 ip -net $netns link set lo up
97 ip netns exec $netns sysctl -q net.mptcp.enabled=1
f2b492b0 98 ip netns exec $netns sysctl -q net.mptcp.pm_type=0 2>/dev/null || true
b08fbf24
PA
99 ip netns exec $netns sysctl -q net.ipv4.conf.all.rp_filter=0
100 ip netns exec $netns sysctl -q net.ipv4.conf.default.rp_filter=0
af66d3e1
GT
101 if [ $checksum -eq 1 ]; then
102 ip netns exec $netns sysctl -q net.mptcp.checksum_enabled=1
103 fi
b08fbf24
PA
104 done
105
8117dac3 106 check_invert=0
3c082695 107 validate_checksum=$checksum
8117dac3 108
d8d08302 109 # ns1 ns2
b08fbf24
PA
110 # ns1eth1 ns2eth1
111 # ns1eth2 ns2eth2
112 # ns1eth3 ns2eth3
113 # ns1eth4 ns2eth4
114
1e777bd8 115 local i
4bfadd71 116 for i in $(seq 1 4); do
b08fbf24
PA
117 ip link add ns1eth$i netns "$ns1" type veth peer name ns2eth$i netns "$ns2"
118 ip -net "$ns1" addr add 10.0.$i.1/24 dev ns1eth$i
119 ip -net "$ns1" addr add dead:beef:$i::1/64 dev ns1eth$i nodad
120 ip -net "$ns1" link set ns1eth$i up
121
122 ip -net "$ns2" addr add 10.0.$i.2/24 dev ns2eth$i
123 ip -net "$ns2" addr add dead:beef:$i::2/64 dev ns2eth$i nodad
124 ip -net "$ns2" link set ns2eth$i up
125
126 # let $ns2 reach any $ns1 address from any interface
127 ip -net "$ns2" route add default via 10.0.$i.1 dev ns2eth$i metric 10$i
9846921d 128 ip -net "$ns2" route add default via dead:beef:$i::1 dev ns2eth$i metric 10$i
b08fbf24
PA
129 done
130}
131
7d1e6f16
PA
132init_shapers()
133{
1e777bd8 134 local i
4bfadd71 135 for i in $(seq 1 4); do
7d1e6f16
PA
136 tc -n $ns1 qdisc add dev ns1eth$i root netem rate 20mbit delay 1
137 tc -n $ns2 qdisc add dev ns2eth$i root netem rate 20mbit delay 1
138 done
139}
140
b08fbf24
PA
141cleanup_partial()
142{
143 rm -f "$capout"
144
1e777bd8 145 local netns
b08fbf24
PA
146 for netns in "$ns1" "$ns2"; do
147 ip netns del $netns
c2a55e8f 148 rm -f /tmp/$netns.{nstat,out}
b08fbf24
PA
149 done
150}
151
87154755
MB
152check_tools()
153{
715c78a8 154 mptcp_lib_check_mptcp
cdb50525 155 mptcp_lib_check_kallsyms
715c78a8 156
87154755
MB
157 if ! ip -Version &> /dev/null; then
158 echo "SKIP: Could not run test without ip tool"
159 exit $ksft_skip
160 fi
161
0c4cd3f8
MB
162 # Use the legacy version if available to support old kernel versions
163 if iptables-legacy -V &> /dev/null; then
164 iptables="iptables-legacy"
165 ip6tables="ip6tables-legacy"
166 elif ! iptables -V &> /dev/null; then
87154755
MB
167 echo "SKIP: Could not run all tests without iptables tool"
168 exit $ksft_skip
016e7ba4 169 elif ! ip6tables -V &> /dev/null; then
87154755
MB
170 echo "SKIP: Could not run all tests without ip6tables tool"
171 exit $ksft_skip
172 fi
173}
174
93827ad5
MB
175init() {
176 init=1
177
87154755
MB
178 check_tools
179
93827ad5
MB
180 sin=$(mktemp)
181 sout=$(mktemp)
182 cin=$(mktemp)
183 cinsent=$(mktemp)
184 cout=$(mktemp)
a3735625
GT
185 evts_ns1=$(mktemp)
186 evts_ns2=$(mktemp)
93827ad5
MB
187
188 trap cleanup EXIT
189
03668c65
MB
190 make_file "$cin" "client" 1 >/dev/null
191 make_file "$sin" "server" 1 >/dev/null
93827ad5
MB
192}
193
b08fbf24
PA
194cleanup()
195{
7d1e6f16
PA
196 rm -f "$cin" "$cout" "$sinfail"
197 rm -f "$sin" "$sout" "$cinsent" "$cinfail"
d328fe87 198 rm -f "$tmpfile"
a3735625 199 rm -rf $evts_ns1 $evts_ns2
b08fbf24
PA
200 cleanup_partial
201}
202
cdb50525
MB
203print_title()
204{
03668c65
MB
205 printf "%03u %s\n" "${TEST_COUNT}" "${TEST_NAME}"
206}
207
208print_check()
209{
210 printf "%-${nr_blank}s%-36s" " " "${*}"
211}
212
213print_info()
214{
215 # It can be empty, no need to print anything then
216 [ -z "${1}" ] && return
217
9466df1a 218 mptcp_lib_print_info " Info: ${*}"
03668c65
MB
219}
220
221print_ok()
222{
9466df1a 223 mptcp_lib_print_ok "[ ok ]${1:+ ${*}}"
03668c65
MB
224}
225
226print_fail()
227{
9466df1a 228 mptcp_lib_print_err "[fail]${1:+ ${*}}"
03668c65
MB
229}
230
231print_skip()
232{
9466df1a 233 mptcp_lib_print_warn "[skip]${1:+ ${*}}"
cdb50525
MB
234}
235
236# [ $1: fail msg ]
237mark_as_skipped()
238{
239 local msg="${1:-"Feature not supported"}"
240
241 mptcp_lib_fail_if_expected_feature "${msg}"
242
03668c65
MB
243 print_check "${msg}"
244 print_skip
7f117cd3
MB
245
246 last_test_skipped=1
cdb50525
MB
247}
248
249# $@: condition
250continue_if()
251{
252 if ! "${@}"; then
253 mark_as_skipped
254 return 1
255 fi
256}
257
ae7bd9cc
MB
258skip_test()
259{
c7d49c03 260 if [ "${#only_tests_ids[@]}" -eq 0 ] && [ "${#only_tests_names[@]}" -eq 0 ]; then
ae7bd9cc
MB
261 return 1
262 fi
263
264 local i
c7d49c03 265 for i in "${only_tests_ids[@]}"; do
ae7bd9cc
MB
266 if [ "${TEST_COUNT}" -eq "${i}" ]; then
267 return 1
268 fi
269 done
c7d49c03
MB
270 for i in "${only_tests_names[@]}"; do
271 if [ "${TEST_NAME}" = "${i}" ]; then
272 return 1
273 fi
274 done
ae7bd9cc
MB
275
276 return 0
277}
278
7f117cd3
MB
279append_prev_results()
280{
281 if [ ${last_test_failed} -eq 1 ]; then
282 mptcp_lib_result_fail "${TEST_NAME}"
283 elif [ ${last_test_skipped} -eq 1 ]; then
284 mptcp_lib_result_skip "${TEST_NAME}"
285 elif [ ${last_test_ignored} -ne 1 ]; then
286 mptcp_lib_result_pass "${TEST_NAME}"
287 fi
288
289 last_test_failed=0
290 last_test_skipped=0
291 last_test_ignored=0
292}
293
c7d49c03 294# $1: test name
b08fbf24
PA
295reset()
296{
7f117cd3
MB
297 append_prev_results
298
c7d49c03
MB
299 TEST_NAME="${1}"
300
ae7bd9cc
MB
301 TEST_COUNT=$((TEST_COUNT+1))
302
303 if skip_test; then
7f117cd3 304 last_test_ignored=1
ae7bd9cc
MB
305 return 1
306 fi
307
03668c65
MB
308 print_title
309
93827ad5
MB
310 if [ "${init}" != "1" ]; then
311 init
312 else
313 cleanup_partial
314 fi
315
316 init_partial
ae7bd9cc
MB
317
318 return 0
b08fbf24
PA
319}
320
ae947bb2
MB
321# $1: test name ; $2: counter to check
322reset_check_counter()
323{
324 reset "${1}" || return 1
325
326 local counter="${2}"
327
328 if ! nstat -asz "${counter}" | grep -wq "${counter}"; then
329 mark_as_skipped "counter '${counter}' is not available"
330 return 1
331 fi
332}
333
c7d49c03 334# $1: test name
00587187
FW
335reset_with_cookies()
336{
c7d49c03 337 reset "${1}" || return 1
00587187 338
1e777bd8
MB
339 local netns
340 for netns in "$ns1" "$ns2"; do
00587187
FW
341 ip netns exec $netns sysctl -q net.ipv4.tcp_syncookies=2
342 done
343}
344
c7d49c03 345# $1: test name
8d014eaa
GT
346reset_with_add_addr_timeout()
347{
c7d49c03 348 local ip="${2:-4}"
8d014eaa
GT
349 local tables
350
c7d49c03
MB
351 reset "${1}" || return 1
352
0c4cd3f8 353 tables="${iptables}"
8d014eaa 354 if [ $ip -eq 6 ]; then
0c4cd3f8 355 tables="${ip6tables}"
8d014eaa
GT
356 fi
357
8d014eaa 358 ip netns exec $ns1 sysctl -q net.mptcp.add_addr_timeout=1
4a0b866a
MB
359
360 if ! ip netns exec $ns2 $tables -A OUTPUT -p tcp \
361 -m tcp --tcp-option 30 \
362 -m bpf --bytecode \
363 "$CBPF_MPTCP_SUBOPTION_ADD_ADDR" \
364 -j DROP; then
365 mark_as_skipped "unable to set the 'add addr' rule"
366 return 1
367 fi
8d014eaa
GT
368}
369
c7d49c03 370# $1: test name
af66d3e1
GT
371reset_with_checksum()
372{
373 local ns1_enable=$1
374 local ns2_enable=$2
375
c7d49c03 376 reset "checksum test ${1} ${2}" || return 1
af66d3e1
GT
377
378 ip netns exec $ns1 sysctl -q net.mptcp.checksum_enabled=$ns1_enable
379 ip netns exec $ns2 sysctl -q net.mptcp.checksum_enabled=$ns2_enable
3c082695
GT
380
381 validate_checksum=1
af66d3e1
GT
382}
383
0cddb4a6
GT
384reset_with_allow_join_id0()
385{
c7d49c03
MB
386 local ns1_enable=$2
387 local ns2_enable=$3
0cddb4a6 388
c7d49c03 389 reset "${1}" || return 1
0cddb4a6
GT
390
391 ip netns exec $ns1 sysctl -q net.mptcp.allow_join_initial_addr_port=$ns1_enable
392 ip netns exec $ns2 sysctl -q net.mptcp.allow_join_initial_addr_port=$ns2_enable
393}
394
b6e074e1
GT
395# Modify TCP payload without corrupting the TCP packet
396#
397# This rule inverts a 8-bit word at byte offset 148 for the 2nd TCP ACK packets
398# carrying enough data.
399# Once it is done, the TCP Checksum field is updated so the packet is still
400# considered as valid at the TCP level.
401# Because the MPTCP checksum, covering the TCP options and data, has not been
402# updated, the modification will be detected and an MP_FAIL will be emitted:
403# what we want to validate here without corrupting "random" MPTCP options.
404#
405# To avoid having tc producing this pr_info() message for each TCP ACK packets
406# not carrying enough data:
407#
408# tc action pedit offset 162 out of bounds
409#
410# Netfilter is used to mark packets with enough data.
4a0b866a 411setup_fail_rules()
b6e074e1 412{
b6e074e1
GT
413 check_invert=1
414 validate_checksum=1
4a0b866a
MB
415 local i="$1"
416 local ip="${2:-4}"
b6e074e1
GT
417 local tables
418
0c4cd3f8 419 tables="${iptables}"
b6e074e1 420 if [ $ip -eq 6 ]; then
0c4cd3f8 421 tables="${ip6tables}"
b6e074e1
GT
422 fi
423
424 ip netns exec $ns2 $tables \
425 -t mangle \
426 -A OUTPUT \
427 -o ns2eth$i \
428 -p tcp \
429 -m length --length 150:9999 \
430 -m statistic --mode nth --packet 1 --every 99999 \
4a0b866a 431 -j MARK --set-mark 42 || return ${ksft_skip}
b6e074e1 432
4a0b866a 433 tc -n $ns2 qdisc add dev ns2eth$i clsact || return ${ksft_skip}
b6e074e1
GT
434 tc -n $ns2 filter add dev ns2eth$i egress \
435 protocol ip prio 1000 \
436 handle 42 fw \
437 action pedit munge offset 148 u8 invert \
438 pipe csum tcp \
4a0b866a
MB
439 index 100 || return ${ksft_skip}
440}
441
442reset_with_fail()
443{
ff8897b5 444 reset_check_counter "${1}" "MPTcpExtInfiniteMapTx" || return 1
4a0b866a
MB
445 shift
446
447 ip netns exec $ns1 sysctl -q net.mptcp.checksum_enabled=1
448 ip netns exec $ns2 sysctl -q net.mptcp.checksum_enabled=1
449
450 local rc=0
451 setup_fail_rules "${@}" || rc=$?
452
453 if [ ${rc} -eq ${ksft_skip} ]; then
454 mark_as_skipped "unable to set the 'fail' rules"
455 return 1
456 fi
b6e074e1
GT
457}
458
a3735625
GT
459reset_with_events()
460{
461 reset "${1}" || return 1
462
463 :> "$evts_ns1"
464 :> "$evts_ns2"
465 ip netns exec $ns1 ./pm_nl_ctl events >> "$evts_ns1" 2>&1 &
466 evts_ns1_pid=$!
467 ip netns exec $ns2 ./pm_nl_ctl events >> "$evts_ns2" 2>&1 &
468 evts_ns2_pid=$!
469}
470
4a0b866a
MB
471reset_with_tcp_filter()
472{
473 reset "${1}" || return 1
474 shift
475
476 local ns="${!1}"
477 local src="${2}"
478 local target="${3}"
479
480 if ! ip netns exec "${ns}" ${iptables} \
481 -A INPUT \
482 -s "${src}" \
483 -p tcp \
484 -j "${target}"; then
485 mark_as_skipped "unable to set the filter rules"
486 return 1
487 fi
488}
489
03668c65 490# $1: err msg
39aab882
MB
491fail_test()
492{
493 ret=1
985de459 494
03668c65
MB
495 print_fail "${@}"
496
7f117cd3
MB
497 # just in case a test is marked twice as failed
498 if [ ${last_test_failed} -eq 0 ]; then
499 failed_tests[${TEST_COUNT}]="${TEST_NAME}"
500 dump_stats
501 last_test_failed=1
502 fi
39aab882
MB
503}
504
505get_failed_tests_ids()
506{
507 # sorted
508 local i
509 for i in "${!failed_tests[@]}"; do
510 echo "${i}"
511 done | sort -n
512}
513
8b819a84
FW
514print_file_err()
515{
516 ls -l "$1" 1>&2
03668c65 517 echo -n "Trailing bytes are: "
8b819a84
FW
518 tail -c 27 "$1"
519}
520
b08fbf24
PA
521check_transfer()
522{
1e777bd8
MB
523 local in=$1
524 local out=$2
525 local what=$3
6bf41020 526 local bytes=$4
d8d08302 527 local i a b
b08fbf24 528
1e777bd8 529 local line
6bf41020 530 if [ -n "$bytes" ]; then
0fcd72df 531 local out_size
6bf41020 532 # when truncating we must check the size explicitly
0fcd72df 533 out_size=$(wc -c $out | awk '{print $1}')
6bf41020 534 if [ $out_size -ne $bytes ]; then
03668c65 535 fail_test "$what output file has wrong size ($out_size, $bytes)"
6bf41020
PA
536 return 1
537 fi
d328fe87
MB
538
539 # note: BusyBox's "cmp" command doesn't support --bytes
540 tmpfile=$(mktemp)
541 head --bytes="$bytes" "$in" > "$tmpfile"
542 mv "$tmpfile" "$in"
543 head --bytes="$bytes" "$out" > "$tmpfile"
544 mv "$tmpfile" "$out"
545 tmpfile=""
6bf41020 546 fi
d328fe87 547 cmp -l "$in" "$out" | while read -r i a b; do
d8d08302 548 local sum=$((0${a} + 0${b}))
8117dac3 549 if [ $check_invert -eq 0 ] || [ $sum -ne $((0xff)) ]; then
03668c65 550 fail_test "$what does not match (in, out):"
8117dac3
GT
551 print_file_err "$in"
552 print_file_err "$out"
8117dac3
GT
553
554 return 1
555 else
03668c65 556 print_info "$what has inverted byte at ${i}"
8117dac3
GT
557 fi
558 done
b08fbf24
PA
559
560 return 0
561}
562
563do_ping()
564{
1e777bd8
MB
565 local listener_ns="$1"
566 local connector_ns="$2"
567 local connect_addr="$3"
b08fbf24 568
d8d08302 569 if ! ip netns exec ${connector_ns} ping -q -c 1 $connect_addr >/dev/null; then
03668c65 570 fail_test "$listener_ns -> $connect_addr connectivity"
b08fbf24
PA
571 fi
572}
573
8b819a84
FW
574link_failure()
575{
1e777bd8 576 local ns="$1"
8b819a84 577
7d1e6f16
PA
578 if [ -z "$FAILING_LINKS" ]; then
579 l=$((RANDOM%4))
580 FAILING_LINKS=$((l+1))
581 fi
8b819a84 582
1e777bd8 583 local l
7d1e6f16 584 for l in $FAILING_LINKS; do
1e777bd8 585 local veth="ns1eth$l"
7d1e6f16
PA
586 ip -net "$ns" link set "$veth" down
587 done
8b819a84
FW
588}
589
523514ed
GT
590# $1: IP address
591is_v6()
592{
593 [ -z "${1##*:*}" ]
594}
595
327b9a94
PA
596# $1: ns, $2: port
597wait_local_port_listen()
598{
599 local listener_ns="${1}"
600 local port="${2}"
601
1e777bd8 602 local port_hex
327b9a94 603 port_hex="$(printf "%04X" "${port}")"
1e777bd8
MB
604
605 local i
327b9a94
PA
606 for i in $(seq 10); do
607 ip netns exec "${listener_ns}" cat /proc/net/tcp* | \
608 awk "BEGIN {rc=1} {if (\$2 ~ /:${port_hex}\$/ && \$4 ~ /0A/) {rc=0; exit}} END {exit rc}" &&
609 break
610 sleep 0.1
611 done
612}
613
47867f0a
MB
614# $1: ns ; $2: counter
615get_counter()
327b9a94 616{
47867f0a
MB
617 local ns="${1}"
618 local counter="${2}"
619 local count
327b9a94 620
47867f0a
MB
621 count=$(ip netns exec ${ns} nstat -asz "${counter}" | awk 'NR==1 {next} {print $2}')
622 if [ -z "${count}" ]; then
623 mptcp_lib_fail_if_expected_feature "${counter} counter"
624 return 1
625 fi
327b9a94 626
47867f0a
MB
627 echo "${count}"
628}
629
630rm_addr_count()
631{
632 get_counter "${1}" "MPTcpExtRmAddr"
327b9a94
PA
633}
634
635# $1: ns, $2: old rm_addr counter in $ns
636wait_rm_addr()
637{
638 local ns="${1}"
639 local old_cnt="${2}"
640 local cnt
327b9a94 641
1e777bd8 642 local i
327b9a94
PA
643 for i in $(seq 10); do
644 cnt=$(rm_addr_count ${ns})
645 [ "$cnt" = "${old_cnt}" ] || break
646 sleep 0.1
647 done
648}
649
4369c198
GT
650rm_sf_count()
651{
652 get_counter "${1}" "MPTcpExtRmSubflow"
653}
654
655# $1: ns, $2: old rm_sf counter in $ns
656wait_rm_sf()
657{
658 local ns="${1}"
659 local old_cnt="${2}"
660 local cnt
661
662 local i
663 for i in $(seq 10); do
664 cnt=$(rm_sf_count ${ns})
665 [ "$cnt" = "${old_cnt}" ] || break
666 sleep 0.1
667 done
668}
669
69c6ce7b
PA
670wait_mpj()
671{
672 local ns="${1}"
673 local cnt old_cnt
674
47867f0a 675 old_cnt=$(get_counter ${ns} "MPTcpExtMPJoinAckRx")
69c6ce7b
PA
676
677 local i
678 for i in $(seq 10); do
47867f0a 679 cnt=$(get_counter ${ns} "MPTcpExtMPJoinAckRx")
69c6ce7b
PA
680 [ "$cnt" = "${old_cnt}" ] || break
681 sleep 0.1
682 done
683}
684
97040cf9
GT
685kill_wait()
686{
687 kill $1 > /dev/null 2>&1
688 wait $1 2>/dev/null
689}
690
a3735625
GT
691kill_events_pids()
692{
693 kill_wait $evts_ns1_pid
694 kill_wait $evts_ns2_pid
695}
696
070d6daf
MB
697kill_tests_wait()
698{
0fcd72df 699 #shellcheck disable=SC2046
070d6daf
MB
700 kill -SIGUSR1 $(ip netns pids $ns2) $(ip netns pids $ns1)
701 wait
702}
703
34aa6e3b
GT
704pm_nl_set_limits()
705{
706 local ns=$1
707 local addrs=$2
708 local subflows=$3
709
710 if [ $ip_mptcp -eq 1 ]; then
711 ip -n $ns mptcp limits set add_addr_accepted $addrs subflows $subflows
712 else
713 ip netns exec $ns ./pm_nl_ctl limits $addrs $subflows
714 fi
715}
716
717pm_nl_add_endpoint()
718{
719 local ns=$1
720 local addr=$2
1e777bd8
MB
721 local flags _flags
722 local port _port
723 local dev _dev
724 local id _id
34aa6e3b
GT
725 local nr=2
726
1e777bd8 727 local p
d8d08302 728 for p in "${@}"
34aa6e3b
GT
729 do
730 if [ $p = "flags" ]; then
731 eval _flags=\$"$nr"
d8d08302 732 [ -n "$_flags" ]; flags="flags $_flags"
34aa6e3b
GT
733 fi
734 if [ $p = "dev" ]; then
735 eval _dev=\$"$nr"
d8d08302 736 [ -n "$_dev" ]; dev="dev $_dev"
34aa6e3b
GT
737 fi
738 if [ $p = "id" ]; then
739 eval _id=\$"$nr"
d8d08302 740 [ -n "$_id" ]; id="id $_id"
34aa6e3b
GT
741 fi
742 if [ $p = "port" ]; then
743 eval _port=\$"$nr"
d8d08302 744 [ -n "$_port" ]; port="port $_port"
34aa6e3b
GT
745 fi
746
d8d08302 747 nr=$((nr + 1))
34aa6e3b
GT
748 done
749
750 if [ $ip_mptcp -eq 1 ]; then
751 ip -n $ns mptcp endpoint add $addr ${_flags//","/" "} $dev $id $port
752 else
753 ip netns exec $ns ./pm_nl_ctl add $addr $flags $dev $id $port
754 fi
755}
756
757pm_nl_del_endpoint()
758{
759 local ns=$1
760 local id=$2
761 local addr=$3
762
763 if [ $ip_mptcp -eq 1 ]; then
aaf2123a 764 [ $id -ne 0 ] && addr=''
34aa6e3b
GT
765 ip -n $ns mptcp endpoint delete id $id $addr
766 else
767 ip netns exec $ns ./pm_nl_ctl del $id $addr
768 fi
769}
770
771pm_nl_flush_endpoint()
772{
773 local ns=$1
774
775 if [ $ip_mptcp -eq 1 ]; then
776 ip -n $ns mptcp endpoint flush
777 else
778 ip netns exec $ns ./pm_nl_ctl flush
779 fi
780}
781
dda61b3d
GT
782pm_nl_show_endpoints()
783{
784 local ns=$1
785
786 if [ $ip_mptcp -eq 1 ]; then
787 ip -n $ns mptcp endpoint show
788 else
789 ip netns exec $ns ./pm_nl_ctl dump
790 fi
791}
792
f0140386
GT
793pm_nl_change_endpoint()
794{
795 local ns=$1
bccefb76
GT
796 local id=$2
797 local flags=$3
f0140386
GT
798
799 if [ $ip_mptcp -eq 1 ]; then
800 ip -n $ns mptcp endpoint change id $id ${flags//","/" "}
801 else
bccefb76 802 ip netns exec $ns ./pm_nl_ctl set id $id flags $flags
f0140386
GT
803 fi
804}
805
69c6ce7b
PA
806pm_nl_check_endpoint()
807{
808 local line expected_line
03668c65
MB
809 local msg="$1"
810 local ns=$2
811 local addr=$3
69c6ce7b
PA
812 local _flags=""
813 local flags
814 local _port
815 local port
816 local dev
817 local _id
818 local id
819
03668c65 820 print_check "${msg}"
69c6ce7b 821
03668c65 822 shift 3
69c6ce7b
PA
823 while [ -n "$1" ]; do
824 if [ $1 = "flags" ]; then
825 _flags=$2
d8d08302 826 [ -n "$_flags" ]; flags="flags $_flags"
69c6ce7b
PA
827 shift
828 elif [ $1 = "dev" ]; then
d8d08302 829 [ -n "$2" ]; dev="dev $1"
69c6ce7b
PA
830 shift
831 elif [ $1 = "id" ]; then
832 _id=$2
d8d08302 833 [ -n "$_id" ]; id="id $_id"
69c6ce7b
PA
834 shift
835 elif [ $1 = "port" ]; then
836 _port=$2
d8d08302 837 [ -n "$_port" ]; port=" port $_port"
69c6ce7b
PA
838 shift
839 fi
840
841 shift
842 done
843
844 if [ -z "$id" ]; then
03668c65 845 test_fail "bad test - missing endpoint id"
69c6ce7b
PA
846 return
847 fi
848
849 if [ $ip_mptcp -eq 1 ]; then
c8c101ae 850 # get line and trim trailing whitespace
69c6ce7b 851 line=$(ip -n $ns mptcp endpoint show $id)
c8c101ae 852 line="${line% }"
69c6ce7b 853 # the dump order is: address id flags port dev
c8c101ae 854 [ -n "$addr" ] && expected_line="$addr"
69c6ce7b
PA
855 expected_line="$expected_line $id"
856 [ -n "$_flags" ] && expected_line="$expected_line ${_flags//","/" "}"
857 [ -n "$dev" ] && expected_line="$expected_line $dev"
858 [ -n "$port" ] && expected_line="$expected_line $port"
859 else
860 line=$(ip netns exec $ns ./pm_nl_ctl get $_id)
861 # the dump order is: id flags dev address port
862 expected_line="$id"
863 [ -n "$flags" ] && expected_line="$expected_line $flags"
864 [ -n "$dev" ] && expected_line="$expected_line $dev"
865 [ -n "$addr" ] && expected_line="$expected_line $addr"
866 [ -n "$_port" ] && expected_line="$expected_line $_port"
867 fi
868 if [ "$line" = "$expected_line" ]; then
03668c65 869 print_ok
69c6ce7b 870 else
03668c65 871 fail_test "expected '$expected_line' found '$line'"
69c6ce7b
PA
872 fi
873}
874
9e9d176d 875pm_nl_set_endpoint()
b08fbf24 876{
1e777bd8
MB
877 local listener_ns="$1"
878 local connector_ns="$2"
9e9d176d 879 local connect_addr="$3"
b08fbf24 880
662aa22d
GT
881 local addr_nr_ns1=${addr_nr_ns1:-0}
882 local addr_nr_ns2=${addr_nr_ns2:-0}
883 local sflags=${sflags:-""}
4aadde08 884 local fullmesh=${fullmesh:-""}
662aa22d 885
080b7f57 886 local flags="subflow"
4aadde08 887 if [ -n "${fullmesh}" ]; then
080b7f57 888 flags="${flags},fullmesh"
4aadde08 889 addr_nr_ns2=${fullmesh}
080b7f57
GT
890 fi
891
327b9a94
PA
892 # let the mptcp subflow be established in background before
893 # do endpoint manipulation
d8d08302
MB
894 if [ $addr_nr_ns1 != "0" ] || [ $addr_nr_ns2 != "0" ]; then
895 sleep 1
896 fi
327b9a94 897
6208fd82 898 if [ $addr_nr_ns1 -gt 0 ]; then
1e777bd8 899 local counter=2
d8d08302 900 local add_nr_ns1=${addr_nr_ns1}
97040cf9 901 local id=10
6208fd82
GT
902 while [ $add_nr_ns1 -gt 0 ]; do
903 local addr
904 if is_v6 "${connect_addr}"; then
905 addr="dead:beef:$counter::1"
906 else
907 addr="10.0.$counter.1"
908 fi
4369c198 909 pm_nl_add_endpoint $ns1 $addr flags signal
d8d08302
MB
910 counter=$((counter + 1))
911 add_nr_ns1=$((add_nr_ns1 - 1))
97040cf9 912 id=$((id + 1))
6208fd82 913 done
6208fd82 914 elif [ $addr_nr_ns1 -lt 0 ]; then
d8d08302 915 local rm_nr_ns1=$((-addr_nr_ns1))
6fe4ccdc 916 if [ $rm_nr_ns1 -lt 8 ]; then
1e777bd8
MB
917 local counter=0
918 local line
d8d08302
MB
919 pm_nl_show_endpoints ${listener_ns} | while read -r line; do
920 # shellcheck disable=SC2206 # we do want to split per word
dda61b3d
GT
921 local arr=($line)
922 local nr=0
923
1e777bd8 924 local i
d8d08302 925 for i in "${arr[@]}"; do
dda61b3d
GT
926 if [ $i = "id" ]; then
927 if [ $counter -eq $rm_nr_ns1 ]; then
928 break
929 fi
930 id=${arr[$nr+1]}
931 rm_addr=$(rm_addr_count ${connector_ns})
932 pm_nl_del_endpoint ${listener_ns} $id
933 wait_rm_addr ${connector_ns} ${rm_addr}
d8d08302 934 counter=$((counter + 1))
dda61b3d 935 fi
d8d08302 936 nr=$((nr + 1))
f87744ad 937 done
dda61b3d 938 done
5e287fe7 939 elif [ $rm_nr_ns1 -eq 8 ]; then
34aa6e3b 940 pm_nl_flush_endpoint ${listener_ns}
5e287fe7 941 elif [ $rm_nr_ns1 -eq 9 ]; then
34aa6e3b 942 pm_nl_del_endpoint ${listener_ns} 0 ${connect_addr}
6fe4ccdc 943 fi
dd72b0fe 944 fi
4f49d633 945
327b9a94
PA
946 # if newly added endpoints must be deleted, give the background msk
947 # some time to created them
d8d08302 948 [ $addr_nr_ns1 -gt 0 ] && [ $addr_nr_ns2 -lt 0 ] && sleep 1
327b9a94 949
6208fd82 950 if [ $addr_nr_ns2 -gt 0 ]; then
d8d08302 951 local add_nr_ns2=${addr_nr_ns2}
1e777bd8 952 local counter=3
5e986ec4 953 local id=20
6208fd82
GT
954 while [ $add_nr_ns2 -gt 0 ]; do
955 local addr
956 if is_v6 "${connect_addr}"; then
957 addr="dead:beef:$counter::2"
958 else
959 addr="10.0.$counter.2"
960 fi
4369c198 961 pm_nl_add_endpoint $ns2 $addr flags $flags
d8d08302
MB
962 counter=$((counter + 1))
963 add_nr_ns2=$((add_nr_ns2 - 1))
5e986ec4 964 id=$((id + 1))
6208fd82 965 done
6208fd82 966 elif [ $addr_nr_ns2 -lt 0 ]; then
d8d08302 967 local rm_nr_ns2=$((-addr_nr_ns2))
6fe4ccdc 968 if [ $rm_nr_ns2 -lt 8 ]; then
1e777bd8
MB
969 local counter=0
970 local line
d8d08302
MB
971 pm_nl_show_endpoints ${connector_ns} | while read -r line; do
972 # shellcheck disable=SC2206 # we do want to split per word
dda61b3d
GT
973 local arr=($line)
974 local nr=0
975
1e777bd8 976 local i
d8d08302 977 for i in "${arr[@]}"; do
dda61b3d
GT
978 if [ $i = "id" ]; then
979 if [ $counter -eq $rm_nr_ns2 ]; then
980 break
981 fi
1e777bd8 982 local id rm_addr
dda61b3d
GT
983 # rm_addr are serialized, allow the previous one to
984 # complete
985 id=${arr[$nr+1]}
986 rm_addr=$(rm_addr_count ${listener_ns})
987 pm_nl_del_endpoint ${connector_ns} $id
988 wait_rm_addr ${listener_ns} ${rm_addr}
d8d08302 989 counter=$((counter + 1))
dda61b3d 990 fi
d8d08302 991 nr=$((nr + 1))
f87744ad 992 done
dda61b3d 993 done
5e287fe7 994 elif [ $rm_nr_ns2 -eq 8 ]; then
34aa6e3b 995 pm_nl_flush_endpoint ${connector_ns}
5e287fe7
GT
996 elif [ $rm_nr_ns2 -eq 9 ]; then
997 local addr
998 if is_v6 "${connect_addr}"; then
999 addr="dead:beef:1::2"
1000 else
1001 addr="10.0.1.2"
1002 fi
34aa6e3b 1003 pm_nl_del_endpoint ${connector_ns} 0 $addr
6fe4ccdc 1004 fi
dd72b0fe
GT
1005 fi
1006
d8d08302 1007 if [ -n "${sflags}" ]; then
718eb44e 1008 sleep 1
1e777bd8
MB
1009
1010 local netns
718eb44e 1011 for netns in "$ns1" "$ns2"; do
1e777bd8 1012 local line
d8d08302
MB
1013 pm_nl_show_endpoints $netns | while read -r line; do
1014 # shellcheck disable=SC2206 # we do want to split per word
33397b83 1015 local arr=($line)
bccefb76 1016 local nr=0
f0140386 1017 local id
33397b83 1018
1e777bd8 1019 local i
d8d08302 1020 for i in "${arr[@]}"; do
bccefb76
GT
1021 if [ $i = "id" ]; then
1022 id=${arr[$nr+1]}
33397b83 1023 fi
d8d08302 1024 nr=$((nr + 1))
33397b83 1025 done
bccefb76 1026 pm_nl_change_endpoint $netns $id $sflags
33397b83 1027 done
718eb44e
GT
1028 done
1029 fi
9e9d176d
GT
1030}
1031
1032do_transfer()
1033{
1034 local listener_ns="$1"
1035 local connector_ns="$2"
1036 local cl_proto="$3"
1037 local srv_proto="$4"
1038 local connect_addr="$5"
9e9d176d
GT
1039
1040 local port=$((10000 + TEST_COUNT - 1))
1041 local cappid
662aa22d 1042 local FAILING_LINKS=${FAILING_LINKS:-""}
080b7f57 1043 local fastclose=${fastclose:-""}
e571fb09 1044 local speed=${speed:-"fast"}
9e9d176d
GT
1045
1046 :> "$cout"
1047 :> "$sout"
1048 :> "$capout"
1049
1050 if [ $capture -eq 1 ]; then
1051 local capuser
1052 if [ -z $SUDO_USER ] ; then
1053 capuser=""
1054 else
1055 capuser="-Z $SUDO_USER"
1056 fi
1057
1058 capfile=$(printf "mp_join-%02u-%s.pcap" "$TEST_COUNT" "${listener_ns}")
1059
1060 echo "Capturing traffic for test $TEST_COUNT into $capfile"
1061 ip netns exec ${listener_ns} tcpdump -i any -s 65535 -B 32768 $capuser -w $capfile > "$capout" 2>&1 &
1062 cappid=$!
1063
1064 sleep 1
1065 fi
1066
1067 NSTAT_HISTORY=/tmp/${listener_ns}.nstat ip netns exec ${listener_ns} \
1068 nstat -n
1069 NSTAT_HISTORY=/tmp/${connector_ns}.nstat ip netns exec ${connector_ns} \
1070 nstat -n
1071
1072 local extra_args
1073 if [ $speed = "fast" ]; then
1074 extra_args="-j"
1075 elif [ $speed = "slow" ]; then
1076 extra_args="-r 50"
e571fb09
GT
1077 elif [ $speed -gt 0 ]; then
1078 extra_args="-r ${speed}"
9e9d176d
GT
1079 fi
1080
9e9d176d
GT
1081 local extra_cl_args=""
1082 local extra_srv_args=""
1083 local trunc_size=""
080b7f57 1084 if [ -n "${fastclose}" ]; then
9e9d176d 1085 if [ ${test_linkfail} -le 1 ]; then
03668c65 1086 fail_test "fastclose tests need test_linkfail argument"
9e9d176d
GT
1087 return 1
1088 fi
1089
1090 # disconnect
1091 trunc_size=${test_linkfail}
080b7f57 1092 local side=${fastclose}
9e9d176d
GT
1093
1094 if [ ${side} = "client" ]; then
1095 extra_cl_args="-f ${test_linkfail}"
1096 extra_srv_args="-f -1"
1097 elif [ ${side} = "server" ]; then
1098 extra_srv_args="-f ${test_linkfail}"
1099 extra_cl_args="-f -1"
1100 else
03668c65 1101 fail_test "wrong/unknown fastclose spec ${side}"
9e9d176d
GT
1102 return 1
1103 fi
9e9d176d
GT
1104 fi
1105
1106 extra_srv_args="$extra_args $extra_srv_args"
1107 if [ "$test_linkfail" -gt 1 ];then
1108 timeout ${timeout_test} \
1109 ip netns exec ${listener_ns} \
1110 ./mptcp_connect -t ${timeout_poll} -l -p $port -s ${srv_proto} \
1111 $extra_srv_args "::" < "$sinfail" > "$sout" &
1112 else
1113 timeout ${timeout_test} \
1114 ip netns exec ${listener_ns} \
1115 ./mptcp_connect -t ${timeout_poll} -l -p $port -s ${srv_proto} \
1116 $extra_srv_args "::" < "$sin" > "$sout" &
1117 fi
1118 local spid=$!
1119
1120 wait_local_port_listen "${listener_ns}" "${port}"
1121
1122 extra_cl_args="$extra_args $extra_cl_args"
1123 if [ "$test_linkfail" -eq 0 ];then
1124 timeout ${timeout_test} \
1125 ip netns exec ${connector_ns} \
1126 ./mptcp_connect -t ${timeout_poll} -p $port -s ${cl_proto} \
1127 $extra_cl_args $connect_addr < "$cin" > "$cout" &
1128 elif [ "$test_linkfail" -eq 1 ] || [ "$test_linkfail" -eq 2 ];then
1129 ( cat "$cinfail" ; sleep 2; link_failure $listener_ns ; cat "$cinfail" ) | \
1130 tee "$cinsent" | \
1131 timeout ${timeout_test} \
1132 ip netns exec ${connector_ns} \
1133 ./mptcp_connect -t ${timeout_poll} -p $port -s ${cl_proto} \
1134 $extra_cl_args $connect_addr > "$cout" &
1135 else
1136 tee "$cinsent" < "$cinfail" | \
1137 timeout ${timeout_test} \
1138 ip netns exec ${connector_ns} \
1139 ./mptcp_connect -t ${timeout_poll} -p $port -s ${cl_proto} \
1140 $extra_cl_args $connect_addr > "$cout" &
1141 fi
1142 local cpid=$!
1143
1144 pm_nl_set_endpoint $listener_ns $connector_ns $connect_addr
718eb44e 1145
b08fbf24 1146 wait $cpid
1e777bd8 1147 local retc=$?
b08fbf24 1148 wait $spid
1e777bd8 1149 local rets=$?
b08fbf24
PA
1150
1151 if [ $capture -eq 1 ]; then
1152 sleep 1
1153 kill $cappid
1154 fi
1155
c2a55e8f
MB
1156 NSTAT_HISTORY=/tmp/${listener_ns}.nstat ip netns exec ${listener_ns} \
1157 nstat | grep Tcp > /tmp/${listener_ns}.out
1158 NSTAT_HISTORY=/tmp/${connector_ns}.nstat ip netns exec ${connector_ns} \
1159 nstat | grep Tcp > /tmp/${connector_ns}.out
1160
b08fbf24 1161 if [ ${rets} -ne 0 ] || [ ${retc} -ne 0 ]; then
03668c65 1162 fail_test "client exit code $retc, server $rets"
8b974778 1163 echo -e "\nnetns ${listener_ns} socket stat for ${port}:" 1>&2
c2a55e8f
MB
1164 ip netns exec ${listener_ns} ss -Menita 1>&2 -o "sport = :$port"
1165 cat /tmp/${listener_ns}.out
8b974778 1166 echo -e "\nnetns ${connector_ns} socket stat for ${port}:" 1>&2
c2a55e8f
MB
1167 ip netns exec ${connector_ns} ss -Menita 1>&2 -o "dport = :$port"
1168 cat /tmp/${connector_ns}.out
b08fbf24
PA
1169
1170 cat "$capout"
1171 return 1
1172 fi
1173
0c93af1f 1174 if [ "$test_linkfail" -gt 1 ];then
6bf41020 1175 check_transfer $sinfail $cout "file received by client" $trunc_size
7d1e6f16 1176 else
6bf41020 1177 check_transfer $sin $cout "file received by client" $trunc_size
7d1e6f16 1178 fi
b08fbf24 1179 retc=$?
0c93af1f 1180 if [ "$test_linkfail" -eq 0 ];then
6bf41020 1181 check_transfer $cin $sout "file received by server" $trunc_size
8b819a84 1182 else
6bf41020 1183 check_transfer $cinsent $sout "file received by server" $trunc_size
8b819a84 1184 fi
b08fbf24
PA
1185 rets=$?
1186
1187 if [ $retc -eq 0 ] && [ $rets -eq 0 ];then
1188 cat "$capout"
1189 return 0
1190 fi
1191
1192 cat "$capout"
1193 return 1
1194}
1195
1196make_file()
1197{
1e777bd8
MB
1198 local name=$1
1199 local who=$2
1200 local size=$3
b08fbf24 1201
8b819a84 1202 dd if=/dev/urandom of="$name" bs=1024 count=$size 2> /dev/null
b08fbf24
PA
1203 echo -e "\nMPTCP_TEST_FILE_END_MARKER" >> "$name"
1204
03668c65 1205 print_info "Test file (size $size KB) for $who"
b08fbf24
PA
1206}
1207
1208run_tests()
1209{
1e777bd8
MB
1210 local listener_ns="$1"
1211 local connector_ns="$2"
1212 local connect_addr="$3"
1e777bd8
MB
1213
1214 local size
662aa22d 1215 local test_linkfail=${test_linkfail:-0}
8b819a84 1216
34b572b7
GT
1217 # The values above 2 are reused to make test files
1218 # with the given sizes (KB)
1219 if [ "$test_linkfail" -gt 2 ]; then
1220 size=$test_linkfail
1221
1222 if [ -z "$cinfail" ]; then
1223 cinfail=$(mktemp)
1224 fi
1225 make_file "$cinfail" "client" $size
7d1e6f16
PA
1226 # create the input file for the failure test when
1227 # the first failure test run
d8d08302 1228 elif [ "$test_linkfail" -ne 0 ] && [ -z "$cinfail" ]; then
7d1e6f16
PA
1229 # the client file must be considerably larger
1230 # of the maximum expected cwin value, or the
1231 # link utilization will be not predicable
1232 size=$((RANDOM%2))
8b819a84 1233 size=$((size+1))
7d1e6f16 1234 size=$((size*8192))
d8d08302 1235 size=$((size + ( RANDOM % 8192) ))
8b819a84 1236
7d1e6f16
PA
1237 cinfail=$(mktemp)
1238 make_file "$cinfail" "client" $size
8b819a84 1239 fi
b08fbf24 1240
34b572b7
GT
1241 if [ "$test_linkfail" -gt 2 ]; then
1242 size=$test_linkfail
1243
1244 if [ -z "$sinfail" ]; then
1245 sinfail=$(mktemp)
1246 fi
1247 make_file "$sinfail" "server" $size
d8d08302 1248 elif [ "$test_linkfail" -eq 2 ] && [ -z "$sinfail" ]; then
7d1e6f16
PA
1249 size=$((RANDOM%16))
1250 size=$((size+1))
1251 size=$((size*2048))
8b819a84 1252
7d1e6f16
PA
1253 sinfail=$(mktemp)
1254 make_file "$sinfail" "server" $size
8b819a84
FW
1255 fi
1256
e571fb09 1257 do_transfer ${listener_ns} ${connector_ns} MPTCP MPTCP ${connect_addr}
b08fbf24
PA
1258}
1259
327b9a94
PA
1260dump_stats()
1261{
1262 echo Server ns stats
1263 ip netns exec $ns1 nstat -as | grep Tcp
1264 echo Client ns stats
1265 ip netns exec $ns2 nstat -as | grep Tcp
1266}
1267
af66d3e1
GT
1268chk_csum_nr()
1269{
3c082695
GT
1270 local csum_ns1=${1:-0}
1271 local csum_ns2=${2:-0}
af66d3e1 1272 local count
53f368bf 1273 local extra_msg=""
26516e10
GT
1274 local allow_multi_errors_ns1=0
1275 local allow_multi_errors_ns2=0
1276
1277 if [[ "${csum_ns1}" = "+"* ]]; then
1278 allow_multi_errors_ns1=1
1279 csum_ns1=${csum_ns1:1}
1280 fi
1281 if [[ "${csum_ns2}" = "+"* ]]; then
1282 allow_multi_errors_ns2=1
1283 csum_ns2=${csum_ns2:1}
1284 fi
af66d3e1 1285
03668c65 1286 print_check "sum"
47867f0a 1287 count=$(get_counter ${ns1} "MPTcpExtDataCsumErr")
53f368bf
GT
1288 if [ "$count" != "$csum_ns1" ]; then
1289 extra_msg="$extra_msg ns1=$count"
1290 fi
47867f0a 1291 if [ -z "$count" ]; then
03668c65 1292 print_skip
47867f0a 1293 elif { [ "$count" != $csum_ns1 ] && [ $allow_multi_errors_ns1 -eq 0 ]; } ||
d8d08302 1294 { [ "$count" -lt $csum_ns1 ] && [ $allow_multi_errors_ns1 -eq 1 ]; }; then
03668c65 1295 fail_test "got $count data checksum error[s] expected $csum_ns1"
af66d3e1 1296 else
03668c65 1297 print_ok
af66d3e1 1298 fi
03668c65 1299 print_check "csum"
47867f0a 1300 count=$(get_counter ${ns2} "MPTcpExtDataCsumErr")
53f368bf
GT
1301 if [ "$count" != "$csum_ns2" ]; then
1302 extra_msg="$extra_msg ns2=$count"
1303 fi
47867f0a 1304 if [ -z "$count" ]; then
03668c65 1305 print_skip
47867f0a 1306 elif { [ "$count" != $csum_ns2 ] && [ $allow_multi_errors_ns2 -eq 0 ]; } ||
d8d08302 1307 { [ "$count" -lt $csum_ns2 ] && [ $allow_multi_errors_ns2 -eq 1 ]; }; then
03668c65 1308 fail_test "got $count data checksum error[s] expected $csum_ns2"
af66d3e1 1309 else
03668c65 1310 print_ok
af66d3e1 1311 fi
53f368bf 1312
03668c65 1313 print_info "$extra_msg"
af66d3e1
GT
1314}
1315
6bb3ab49
GT
1316chk_fail_nr()
1317{
26516e10
GT
1318 local fail_tx=$1
1319 local fail_rx=$2
1f7d325f 1320 local ns_invert=${3:-""}
6bb3ab49 1321 local count
1f7d325f
GT
1322 local ns_tx=$ns1
1323 local ns_rx=$ns2
1324 local extra_msg=""
1325 local allow_tx_lost=0
1326 local allow_rx_lost=0
1327
1328 if [[ $ns_invert = "invert" ]]; then
1329 ns_tx=$ns2
1330 ns_rx=$ns1
03668c65 1331 extra_msg="invert"
1f7d325f
GT
1332 fi
1333
1334 if [[ "${fail_tx}" = "-"* ]]; then
1335 allow_tx_lost=1
1336 fail_tx=${fail_tx:1}
1337 fi
1338 if [[ "${fail_rx}" = "-"* ]]; then
1339 allow_rx_lost=1
1340 fail_rx=${fail_rx:1}
1341 fi
6bb3ab49 1342
03668c65 1343 print_check "ftx"
47867f0a 1344 count=$(get_counter ${ns_tx} "MPTcpExtMPFailTx")
26516e10 1345 if [ "$count" != "$fail_tx" ]; then
1f7d325f
GT
1346 extra_msg="$extra_msg,tx=$count"
1347 fi
47867f0a 1348 if [ -z "$count" ]; then
03668c65 1349 print_skip
47867f0a 1350 elif { [ "$count" != "$fail_tx" ] && [ $allow_tx_lost -eq 0 ]; } ||
1f7d325f 1351 { [ "$count" -gt "$fail_tx" ] && [ $allow_tx_lost -eq 1 ]; }; then
03668c65 1352 fail_test "got $count MP_FAIL[s] TX expected $fail_tx"
6bb3ab49 1353 else
03668c65 1354 print_ok
6bb3ab49
GT
1355 fi
1356
03668c65 1357 print_check "failrx"
47867f0a 1358 count=$(get_counter ${ns_rx} "MPTcpExtMPFailRx")
26516e10 1359 if [ "$count" != "$fail_rx" ]; then
1f7d325f
GT
1360 extra_msg="$extra_msg,rx=$count"
1361 fi
47867f0a 1362 if [ -z "$count" ]; then
03668c65 1363 print_skip
47867f0a 1364 elif { [ "$count" != "$fail_rx" ] && [ $allow_rx_lost -eq 0 ]; } ||
1f7d325f 1365 { [ "$count" -gt "$fail_rx" ] && [ $allow_rx_lost -eq 1 ]; }; then
03668c65 1366 fail_test "got $count MP_FAIL[s] RX expected $fail_rx"
6bb3ab49 1367 else
03668c65 1368 print_ok
6bb3ab49
GT
1369 fi
1370
03668c65 1371 print_info "$extra_msg"
6bb3ab49
GT
1372}
1373
e8e947ef
GT
1374chk_fclose_nr()
1375{
1376 local fclose_tx=$1
1377 local fclose_rx=$2
6bf41020 1378 local ns_invert=$3
e8e947ef 1379 local count
6bf41020
PA
1380 local ns_tx=$ns2
1381 local ns_rx=$ns1
03668c65 1382 local extra_msg=""
6bf41020
PA
1383
1384 if [[ $ns_invert = "invert" ]]; then
1385 ns_tx=$ns1
1386 ns_rx=$ns2
03668c65 1387 extra_msg="invert"
6bf41020 1388 fi
e8e947ef 1389
03668c65 1390 print_check "ctx"
47867f0a
MB
1391 count=$(get_counter ${ns_tx} "MPTcpExtMPFastcloseTx")
1392 if [ -z "$count" ]; then
03668c65 1393 print_skip
47867f0a
MB
1394 elif [ "$count" != "$fclose_tx" ]; then
1395 extra_msg="$extra_msg,tx=$count"
03668c65 1396 fail_test "got $count MP_FASTCLOSE[s] TX expected $fclose_tx"
e8e947ef 1397 else
03668c65 1398 print_ok
e8e947ef
GT
1399 fi
1400
03668c65 1401 print_check "fclzrx"
47867f0a
MB
1402 count=$(get_counter ${ns_rx} "MPTcpExtMPFastcloseRx")
1403 if [ -z "$count" ]; then
03668c65 1404 print_skip
47867f0a
MB
1405 elif [ "$count" != "$fclose_rx" ]; then
1406 extra_msg="$extra_msg,rx=$count"
03668c65 1407 fail_test "got $count MP_FASTCLOSE[s] RX expected $fclose_rx"
e8e947ef 1408 else
03668c65 1409 print_ok
e8e947ef
GT
1410 fi
1411
03668c65 1412 print_info "$extra_msg"
e8e947ef
GT
1413}
1414
922fd2b3
GT
1415chk_rst_nr()
1416{
1417 local rst_tx=$1
1418 local rst_rx=$2
1419 local ns_invert=${3:-""}
1420 local count
922fd2b3
GT
1421 local ns_tx=$ns1
1422 local ns_rx=$ns2
1423 local extra_msg=""
1424
1425 if [[ $ns_invert = "invert" ]]; then
1426 ns_tx=$ns2
1427 ns_rx=$ns1
03668c65 1428 extra_msg="invert"
922fd2b3
GT
1429 fi
1430
03668c65 1431 print_check "rtx"
47867f0a
MB
1432 count=$(get_counter ${ns_tx} "MPTcpExtMPRstTx")
1433 if [ -z "$count" ]; then
03668c65 1434 print_skip
b134a580
MB
1435 # accept more rst than expected except if we don't expect any
1436 elif { [ $rst_tx -ne 0 ] && [ $count -lt $rst_tx ]; } ||
1437 { [ $rst_tx -eq 0 ] && [ $count -ne 0 ]; }; then
03668c65 1438 fail_test "got $count MP_RST[s] TX expected $rst_tx"
922fd2b3 1439 else
03668c65 1440 print_ok
922fd2b3
GT
1441 fi
1442
03668c65 1443 print_check "rstrx"
47867f0a
MB
1444 count=$(get_counter ${ns_rx} "MPTcpExtMPRstRx")
1445 if [ -z "$count" ]; then
03668c65 1446 print_skip
b134a580
MB
1447 # accept more rst than expected except if we don't expect any
1448 elif { [ $rst_rx -ne 0 ] && [ $count -lt $rst_rx ]; } ||
1449 { [ $rst_rx -eq 0 ] && [ $count -ne 0 ]; }; then
03668c65 1450 fail_test "got $count MP_RST[s] RX expected $rst_rx"
922fd2b3 1451 else
03668c65 1452 print_ok
922fd2b3
GT
1453 fi
1454
03668c65 1455 print_info "$extra_msg"
922fd2b3
GT
1456}
1457
8bd03be3
GT
1458chk_infi_nr()
1459{
1460 local infi_tx=$1
1461 local infi_rx=$2
1462 local count
8bd03be3 1463
03668c65 1464 print_check "itx"
47867f0a
MB
1465 count=$(get_counter ${ns2} "MPTcpExtInfiniteMapTx")
1466 if [ -z "$count" ]; then
03668c65 1467 print_skip
47867f0a 1468 elif [ "$count" != "$infi_tx" ]; then
03668c65 1469 fail_test "got $count infinite map[s] TX expected $infi_tx"
8bd03be3 1470 else
03668c65 1471 print_ok
8bd03be3
GT
1472 fi
1473
03668c65 1474 print_check "infirx"
47867f0a
MB
1475 count=$(get_counter ${ns1} "MPTcpExtInfiniteMapRx")
1476 if [ -z "$count" ]; then
03668c65 1477 print_skip
47867f0a 1478 elif [ "$count" != "$infi_rx" ]; then
03668c65 1479 fail_test "got $count infinite map[s] RX expected $infi_rx"
8bd03be3 1480 else
03668c65 1481 print_ok
8bd03be3 1482 fi
8bd03be3
GT
1483}
1484
b08fbf24
PA
1485chk_join_nr()
1486{
c7d49c03
MB
1487 local syn_nr=$1
1488 local syn_ack_nr=$2
1489 local ack_nr=$3
1490 local csum_ns1=${4:-0}
1491 local csum_ns2=${5:-0}
1492 local fail_nr=${6:-0}
1493 local rst_nr=${7:-0}
8bd03be3
GT
1494 local infi_nr=${8:-0}
1495 local corrupted_pkts=${9:-0}
b08fbf24 1496 local count
e35f885b 1497 local with_cookie
c7d49c03
MB
1498
1499 if [ "${corrupted_pkts}" -gt 0 ]; then
03668c65 1500 print_info "${corrupted_pkts} corrupted pkts"
c7d49c03 1501 fi
b08fbf24 1502
03668c65 1503 print_check "syn"
47867f0a
MB
1504 count=$(get_counter ${ns1} "MPTcpExtMPJoinSynRx")
1505 if [ -z "$count" ]; then
03668c65 1506 print_skip
47867f0a 1507 elif [ "$count" != "$syn_nr" ]; then
03668c65 1508 fail_test "got $count JOIN[s] syn expected $syn_nr"
b08fbf24 1509 else
03668c65 1510 print_ok
b08fbf24
PA
1511 fi
1512
03668c65 1513 print_check "synack"
4bfadd71 1514 with_cookie=$(ip netns exec $ns2 sysctl -n net.ipv4.tcp_syncookies)
47867f0a
MB
1515 count=$(get_counter ${ns2} "MPTcpExtMPJoinSynAckRx")
1516 if [ -z "$count" ]; then
03668c65 1517 print_skip
47867f0a 1518 elif [ "$count" != "$syn_ack_nr" ]; then
e35f885b
PA
1519 # simult connections exceeding the limit with cookie enabled could go up to
1520 # synack validation as the conn limit can be enforced reliably only after
1521 # the subflow creation
1522 if [ "$with_cookie" = 2 ] && [ "$count" -gt "$syn_ack_nr" ] && [ "$count" -le "$syn_nr" ]; then
03668c65 1523 print_ok
e35f885b 1524 else
03668c65 1525 fail_test "got $count JOIN[s] synack expected $syn_ack_nr"
e35f885b 1526 fi
b08fbf24 1527 else
03668c65 1528 print_ok
b08fbf24
PA
1529 fi
1530
03668c65 1531 print_check "ack"
47867f0a
MB
1532 count=$(get_counter ${ns1} "MPTcpExtMPJoinAckRx")
1533 if [ -z "$count" ]; then
03668c65 1534 print_skip
47867f0a 1535 elif [ "$count" != "$ack_nr" ]; then
03668c65 1536 fail_test "got $count JOIN[s] ack expected $ack_nr"
b08fbf24 1537 else
03668c65 1538 print_ok
b08fbf24 1539 fi
b6e074e1 1540 if [ $validate_checksum -eq 1 ]; then
3c082695 1541 chk_csum_nr $csum_ns1 $csum_ns2
26516e10
GT
1542 chk_fail_nr $fail_nr $fail_nr
1543 chk_rst_nr $rst_nr $rst_nr
8bd03be3 1544 chk_infi_nr $infi_nr $infi_nr
af66d3e1 1545 fi
b08fbf24
PA
1546}
1547
7d1e6f16
PA
1548# a negative value for 'stale_max' means no upper bound:
1549# for bidirectional transfer, if one peer sleep for a while
1550# - as these tests do - we can have a quite high number of
1551# stale/recover conversions, proportional to
1552# sleep duration/ MPTCP-level RTX interval.
1553chk_stale_nr()
1554{
1555 local ns=$1
1556 local stale_min=$2
1557 local stale_max=$3
1558 local stale_delta=$4
1559 local dump_stats
1560 local stale_nr
1561 local recover_nr
1562
03668c65 1563 print_check "stale"
7d1e6f16 1564
47867f0a
MB
1565 stale_nr=$(get_counter ${ns} "MPTcpExtSubflowStale")
1566 recover_nr=$(get_counter ${ns} "MPTcpExtSubflowRecover")
1567 if [ -z "$stale_nr" ] || [ -z "$recover_nr" ]; then
03668c65 1568 print_skip
47867f0a 1569 elif [ $stale_nr -lt $stale_min ] ||
d8d08302
MB
1570 { [ $stale_max -gt 0 ] && [ $stale_nr -gt $stale_max ]; } ||
1571 [ $((stale_nr - recover_nr)) -ne $stale_delta ]; then
03668c65 1572 fail_test "got $stale_nr stale[s] $recover_nr recover[s], " \
7d1e6f16 1573 " expected stale in range [$stale_min..$stale_max]," \
03668c65 1574 " stale-recover delta $stale_delta"
7d1e6f16
PA
1575 dump_stats=1
1576 else
03668c65 1577 print_ok
7d1e6f16
PA
1578 fi
1579
1580 if [ "${dump_stats}" = 1 ]; then
1581 echo $ns stats
1582 ip netns exec $ns ip -s link show
1583 ip netns exec $ns nstat -as | grep MPTcp
1584 fi
1585}
1586
be613160
GT
1587chk_add_nr()
1588{
1589 local add_nr=$1
1590 local echo_nr=$2
8a127bf6
GT
1591 local port_nr=${3:-0}
1592 local syn_nr=${4:-$port_nr}
1593 local syn_ack_nr=${5:-$port_nr}
1594 local ack_nr=${6:-$port_nr}
1595 local mis_syn_nr=${7:-0}
1596 local mis_ack_nr=${8:-0}
be613160 1597 local count
6ef84b15
PA
1598 local timeout
1599
4bfadd71 1600 timeout=$(ip netns exec $ns1 sysctl -n net.mptcp.add_addr_timeout)
be613160 1601
03668c65 1602 print_check "add"
47867f0a
MB
1603 count=$(get_counter ${ns2} "MPTcpExtAddAddr")
1604 if [ -z "$count" ]; then
03668c65 1605 print_skip
6ef84b15
PA
1606 # if the test configured a short timeout tolerate greater then expected
1607 # add addrs options, due to retransmissions
47867f0a 1608 elif [ "$count" != "$add_nr" ] && { [ "$timeout" -gt 1 ] || [ "$count" -lt "$add_nr" ]; }; then
03668c65 1609 fail_test "got $count ADD_ADDR[s] expected $add_nr"
be613160 1610 else
03668c65 1611 print_ok
be613160
GT
1612 fi
1613
03668c65 1614 print_check "echo"
47867f0a
MB
1615 count=$(get_counter ${ns1} "MPTcpExtEchoAdd")
1616 if [ -z "$count" ]; then
03668c65 1617 print_skip
47867f0a 1618 elif [ "$count" != "$echo_nr" ]; then
03668c65 1619 fail_test "got $count ADD_ADDR echo[s] expected $echo_nr"
be613160 1620 else
03668c65 1621 print_ok
8a127bf6
GT
1622 fi
1623
1624 if [ $port_nr -gt 0 ]; then
03668c65 1625 print_check "pt"
47867f0a
MB
1626 count=$(get_counter ${ns2} "MPTcpExtPortAdd")
1627 if [ -z "$count" ]; then
03668c65 1628 print_skip
47867f0a 1629 elif [ "$count" != "$port_nr" ]; then
03668c65 1630 fail_test "got $count ADD_ADDR[s] with a port-number expected $port_nr"
8a127bf6 1631 else
03668c65 1632 print_ok
8a127bf6
GT
1633 fi
1634
03668c65 1635 print_check "syn"
47867f0a
MB
1636 count=$(get_counter ${ns1} "MPTcpExtMPJoinPortSynRx")
1637 if [ -z "$count" ]; then
03668c65 1638 print_skip
47867f0a 1639 elif [ "$count" != "$syn_nr" ]; then
03668c65
MB
1640 fail_test "got $count JOIN[s] syn with a different \
1641 port-number expected $syn_nr"
8a127bf6 1642 else
03668c65 1643 print_ok
8a127bf6
GT
1644 fi
1645
03668c65 1646 print_check "synack"
47867f0a
MB
1647 count=$(get_counter ${ns2} "MPTcpExtMPJoinPortSynAckRx")
1648 if [ -z "$count" ]; then
03668c65 1649 print_skip
47867f0a 1650 elif [ "$count" != "$syn_ack_nr" ]; then
03668c65
MB
1651 fail_test "got $count JOIN[s] synack with a different \
1652 port-number expected $syn_ack_nr"
8a127bf6 1653 else
03668c65 1654 print_ok
8a127bf6
GT
1655 fi
1656
03668c65 1657 print_check "ack"
47867f0a
MB
1658 count=$(get_counter ${ns1} "MPTcpExtMPJoinPortAckRx")
1659 if [ -z "$count" ]; then
03668c65 1660 print_skip
47867f0a 1661 elif [ "$count" != "$ack_nr" ]; then
03668c65
MB
1662 fail_test "got $count JOIN[s] ack with a different \
1663 port-number expected $ack_nr"
8a127bf6 1664 else
03668c65 1665 print_ok
8a127bf6
GT
1666 fi
1667
03668c65 1668 print_check "syn"
47867f0a
MB
1669 count=$(get_counter ${ns1} "MPTcpExtMismatchPortSynRx")
1670 if [ -z "$count" ]; then
03668c65 1671 print_skip
47867f0a 1672 elif [ "$count" != "$mis_syn_nr" ]; then
03668c65
MB
1673 fail_test "got $count JOIN[s] syn with a mismatched \
1674 port-number expected $mis_syn_nr"
8a127bf6 1675 else
03668c65 1676 print_ok
8a127bf6
GT
1677 fi
1678
03668c65 1679 print_check "ack"
47867f0a
MB
1680 count=$(get_counter ${ns1} "MPTcpExtMismatchPortAckRx")
1681 if [ -z "$count" ]; then
03668c65 1682 print_skip
47867f0a 1683 elif [ "$count" != "$mis_ack_nr" ]; then
03668c65
MB
1684 fail_test "got $count JOIN[s] ack with a mismatched \
1685 port-number expected $mis_ack_nr"
8a127bf6 1686 else
03668c65 1687 print_ok
8a127bf6 1688 fi
be613160 1689 fi
be613160
GT
1690}
1691
0639fa23
PA
1692chk_add_tx_nr()
1693{
1694 local add_tx_nr=$1
1695 local echo_tx_nr=$2
0639fa23
PA
1696 local timeout
1697 local count
1698
1699 timeout=$(ip netns exec $ns1 sysctl -n net.mptcp.add_addr_timeout)
1700
03668c65 1701 print_check "add TX"
00079f18
MB
1702 count=$(get_counter ${ns1} "MPTcpExtAddAddrTx")
1703 if [ -z "$count" ]; then
03668c65 1704 print_skip
0639fa23
PA
1705 # if the test configured a short timeout tolerate greater then expected
1706 # add addrs options, due to retransmissions
00079f18 1707 elif [ "$count" != "$add_tx_nr" ] && { [ "$timeout" -gt 1 ] || [ "$count" -lt "$add_tx_nr" ]; }; then
03668c65 1708 fail_test "got $count ADD_ADDR[s] TX, expected $add_tx_nr"
0639fa23 1709 else
03668c65 1710 print_ok
0639fa23
PA
1711 fi
1712
03668c65 1713 print_check "echo TX"
00079f18
MB
1714 count=$(get_counter ${ns2} "MPTcpExtEchoAddTx")
1715 if [ -z "$count" ]; then
03668c65 1716 print_skip
00079f18 1717 elif [ "$count" != "$echo_tx_nr" ]; then
03668c65 1718 fail_test "got $count ADD_ADDR echo[s] TX, expected $echo_tx_nr"
0639fa23 1719 else
03668c65 1720 print_ok
0639fa23 1721 fi
0639fa23
PA
1722}
1723
dd72b0fe
GT
1724chk_rm_nr()
1725{
1726 local rm_addr_nr=$1
1727 local rm_subflow_nr=$2
6fa0174a
PA
1728 local invert
1729 local simult
dd72b0fe 1730 local count
7d9bf018
GT
1731 local addr_ns=$ns1
1732 local subflow_ns=$ns2
1733 local extra_msg=""
7028ba8a 1734
6fa0174a
PA
1735 shift 2
1736 while [ -n "$1" ]; do
1737 [ "$1" = "invert" ] && invert=true
1738 [ "$1" = "simult" ] && simult=true
1739 shift
1740 done
1741
1742 if [ -z $invert ]; then
1743 addr_ns=$ns1
1744 subflow_ns=$ns2
1745 elif [ $invert = "true" ]; then
7028ba8a
GT
1746 addr_ns=$ns2
1747 subflow_ns=$ns1
03668c65 1748 extra_msg="invert"
7028ba8a 1749 fi
dd72b0fe 1750
03668c65 1751 print_check "rm"
00079f18
MB
1752 count=$(get_counter ${addr_ns} "MPTcpExtRmAddr")
1753 if [ -z "$count" ]; then
03668c65 1754 print_skip
00079f18 1755 elif [ "$count" != "$rm_addr_nr" ]; then
03668c65 1756 fail_test "got $count RM_ADDR[s] expected $rm_addr_nr"
dd72b0fe 1757 else
03668c65 1758 print_ok
dd72b0fe
GT
1759 fi
1760
03668c65 1761 print_check "rmsf"
47867f0a
MB
1762 count=$(get_counter ${subflow_ns} "MPTcpExtRmSubflow")
1763 if [ -z "$count" ]; then
03668c65 1764 print_skip
47867f0a 1765 elif [ -n "$simult" ]; then
d8d08302
MB
1766 local cnt suffix
1767
47867f0a 1768 cnt=$(get_counter ${addr_ns} "MPTcpExtRmSubflow")
6fa0174a
PA
1769
1770 # in case of simult flush, the subflow removal count on each side is
1771 # unreliable
6fa0174a
PA
1772 count=$((count + cnt))
1773 [ "$count" != "$rm_subflow_nr" ] && suffix="$count in [$rm_subflow_nr:$((rm_subflow_nr*2))]"
1774 if [ $count -ge "$rm_subflow_nr" ] && \
1775 [ "$count" -le "$((rm_subflow_nr *2 ))" ]; then
03668c65 1776 print_ok "$suffix"
6fa0174a 1777 else
03668c65 1778 fail_test "got $count RM_SUBFLOW[s] expected in range [$rm_subflow_nr:$((rm_subflow_nr*2))]"
6fa0174a 1779 fi
47867f0a 1780 elif [ "$count" != "$rm_subflow_nr" ]; then
03668c65 1781 fail_test "got $count RM_SUBFLOW[s] expected $rm_subflow_nr"
dd72b0fe 1782 else
03668c65 1783 print_ok
dd72b0fe
GT
1784 fi
1785
03668c65 1786 print_info "$extra_msg"
dd72b0fe
GT
1787}
1788
0639fa23
PA
1789chk_rm_tx_nr()
1790{
1791 local rm_addr_tx_nr=$1
1792
03668c65 1793 print_check "rm TX"
00079f18
MB
1794 count=$(get_counter ${ns2} "MPTcpExtRmAddrTx")
1795 if [ -z "$count" ]; then
03668c65 1796 print_skip
00079f18 1797 elif [ "$count" != "$rm_addr_tx_nr" ]; then
03668c65 1798 fail_test "got $count RM_ADDR[s] expected $rm_addr_tx_nr"
0639fa23 1799 else
03668c65 1800 print_ok
0639fa23 1801 fi
0639fa23
PA
1802}
1803
718eb44e
GT
1804chk_prio_nr()
1805{
1806 local mp_prio_nr_tx=$1
1807 local mp_prio_nr_rx=$2
1808 local count
718eb44e 1809
03668c65 1810 print_check "ptx"
47867f0a
MB
1811 count=$(get_counter ${ns1} "MPTcpExtMPPrioTx")
1812 if [ -z "$count" ]; then
03668c65 1813 print_skip
47867f0a 1814 elif [ "$count" != "$mp_prio_nr_tx" ]; then
03668c65 1815 fail_test "got $count MP_PRIO[s] TX expected $mp_prio_nr_tx"
718eb44e 1816 else
03668c65 1817 print_ok
718eb44e
GT
1818 fi
1819
03668c65 1820 print_check "prx"
47867f0a
MB
1821 count=$(get_counter ${ns1} "MPTcpExtMPPrioRx")
1822 if [ -z "$count" ]; then
03668c65 1823 print_skip
47867f0a 1824 elif [ "$count" != "$mp_prio_nr_rx" ]; then
03668c65 1825 fail_test "got $count MP_PRIO[s] RX expected $mp_prio_nr_rx"
718eb44e 1826 else
03668c65 1827 print_ok
718eb44e 1828 fi
718eb44e
GT
1829}
1830
e274f715
PA
1831chk_subflow_nr()
1832{
03668c65
MB
1833 local msg="$1"
1834 local subflow_nr=$2
e274f715
PA
1835 local cnt1
1836 local cnt2
a635a8c3 1837 local dump_stats
e274f715 1838
03668c65 1839 print_check "${msg}"
e274f715
PA
1840
1841 cnt1=$(ss -N $ns1 -tOni | grep -c token)
1842 cnt2=$(ss -N $ns2 -tOni | grep -c token)
0fcd72df 1843 if [ "$cnt1" != "$subflow_nr" ] || [ "$cnt2" != "$subflow_nr" ]; then
03668c65 1844 fail_test "got $cnt1:$cnt2 subflows expected $subflow_nr"
e274f715
PA
1845 dump_stats=1
1846 else
03668c65 1847 print_ok
e274f715
PA
1848 fi
1849
a635a8c3
PA
1850 if [ "${dump_stats}" = 1 ]; then
1851 ss -N $ns1 -tOni
1852 ss -N $ns1 -tOni | grep token
1853 ip -n $ns1 mptcp endpoint
a635a8c3 1854 fi
e274f715
PA
1855}
1856
9095ce97
GT
1857chk_mptcp_info()
1858{
d7ced753
GT
1859 local info1=$1
1860 local exp1=$2
1861 local info2=$3
1862 local exp2=$4
9095ce97
GT
1863 local cnt1
1864 local cnt2
1865 local dump_stats
1866
03668c65 1867 print_check "mptcp_info ${info1:0:8}=$exp1:$exp2"
9095ce97 1868
d7ced753
GT
1869 cnt1=$(ss -N $ns1 -inmHM | grep "$info1:" |
1870 sed -n 's/.*\('"$info1"':\)\([[:digit:]]*\).*$/\2/p;q')
1871 cnt2=$(ss -N $ns2 -inmHM | grep "$info2:" |
1872 sed -n 's/.*\('"$info2"':\)\([[:digit:]]*\).*$/\2/p;q')
1873 # 'ss' only display active connections and counters that are not 0.
9095ce97 1874 [ -z "$cnt1" ] && cnt1=0
9095ce97 1875 [ -z "$cnt2" ] && cnt2=0
d7ced753
GT
1876
1877 if [ "$cnt1" != "$exp1" ] || [ "$cnt2" != "$exp2" ]; then
03668c65 1878 fail_test "got $cnt1:$cnt2 $info1:$info2 expected $exp1:$exp2"
9095ce97
GT
1879 dump_stats=1
1880 else
03668c65 1881 print_ok
9095ce97
GT
1882 fi
1883
1884 if [ "$dump_stats" = 1 ]; then
1885 ss -N $ns1 -inmHM
1886 ss -N $ns2 -inmHM
9095ce97
GT
1887 fi
1888}
1889
7d1e6f16
PA
1890chk_link_usage()
1891{
1892 local ns=$1
1893 local link=$2
1894 local out=$3
1895 local expected_rate=$4
4bfadd71
MB
1896
1897 local tx_link tx_total
1898 tx_link=$(ip netns exec $ns cat /sys/class/net/$link/statistics/tx_bytes)
d8d08302
MB
1899 tx_total=$(stat --format=%s $out)
1900 local tx_rate=$((tx_link * 100 / tx_total))
7d1e6f16
PA
1901 local tolerance=5
1902
03668c65 1903 print_check "link usage"
d8d08302
MB
1904 if [ $tx_rate -lt $((expected_rate - tolerance)) ] || \
1905 [ $tx_rate -gt $((expected_rate + tolerance)) ]; then
03668c65 1906 fail_test "got $tx_rate% usage, expected $expected_rate%"
7d1e6f16 1907 else
03668c65 1908 print_ok
7d1e6f16
PA
1909 fi
1910}
1911
f98c2bca 1912wait_attempt_fail()
46e967d1
PA
1913{
1914 local timeout_ms=$((timeout_poll * 1000))
1915 local time=0
1916 local ns=$1
1917
1918 while [ $time -lt $timeout_ms ]; do
1e777bd8
MB
1919 local cnt
1920
47867f0a 1921 cnt=$(get_counter ${ns} "TcpAttemptFails")
46e967d1
PA
1922
1923 [ "$cnt" = 1 ] && return 1
1924 time=$((time + 100))
1925 sleep 0.1
1926 done
1927 return 1
1928}
1929
5ac1d2d6
MM
1930set_userspace_pm()
1931{
1932 local ns=$1
1933
1934 ip netns exec $ns sysctl -q net.mptcp.pm_type=1
1935}
1936
1002b89f
GT
1937subflows_tests()
1938{
c7d49c03 1939 if reset "no JOIN"; then
ae7bd9cc 1940 run_tests $ns1 $ns2 10.0.1.1
c7d49c03 1941 chk_join_nr 0 0 0
ae7bd9cc 1942 fi
1002b89f
GT
1943
1944 # subflow limited by client
c7d49c03 1945 if reset "single subflow, limited by client"; then
ae7bd9cc
MB
1946 pm_nl_set_limits $ns1 0 0
1947 pm_nl_set_limits $ns2 0 0
1948 pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow
1949 run_tests $ns1 $ns2 10.0.1.1
c7d49c03 1950 chk_join_nr 0 0 0
ae7bd9cc 1951 fi
1002b89f
GT
1952
1953 # subflow limited by server
c7d49c03 1954 if reset "single subflow, limited by server"; then
ae7bd9cc
MB
1955 pm_nl_set_limits $ns1 0 0
1956 pm_nl_set_limits $ns2 0 1
1957 pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow
1958 run_tests $ns1 $ns2 10.0.1.1
c7d49c03 1959 chk_join_nr 1 1 0
ae7bd9cc 1960 fi
1002b89f
GT
1961
1962 # subflow
c7d49c03 1963 if reset "single subflow"; then
ae7bd9cc
MB
1964 pm_nl_set_limits $ns1 0 1
1965 pm_nl_set_limits $ns2 0 1
1966 pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow
1967 run_tests $ns1 $ns2 10.0.1.1
c7d49c03 1968 chk_join_nr 1 1 1
ae7bd9cc 1969 fi
1002b89f
GT
1970
1971 # multiple subflows
c7d49c03 1972 if reset "multiple subflows"; then
ae7bd9cc
MB
1973 pm_nl_set_limits $ns1 0 2
1974 pm_nl_set_limits $ns2 0 2
1975 pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow
1976 pm_nl_add_endpoint $ns2 10.0.2.2 flags subflow
1977 run_tests $ns1 $ns2 10.0.1.1
c7d49c03 1978 chk_join_nr 2 2 2
ae7bd9cc 1979 fi
1002b89f 1980
72bcbc46 1981 # multiple subflows limited by server
c7d49c03 1982 if reset "multiple subflows, limited by server"; then
ae7bd9cc
MB
1983 pm_nl_set_limits $ns1 0 1
1984 pm_nl_set_limits $ns2 0 2
1985 pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow
1986 pm_nl_add_endpoint $ns2 10.0.2.2 flags subflow
1987 run_tests $ns1 $ns2 10.0.1.1
c7d49c03 1988 chk_join_nr 2 2 1
ae7bd9cc 1989 fi
c3eaa5f6
GT
1990
1991 # single subflow, dev
c7d49c03 1992 if reset "single subflow, dev"; then
ae7bd9cc
MB
1993 pm_nl_set_limits $ns1 0 1
1994 pm_nl_set_limits $ns2 0 1
1995 pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow dev ns2eth3
1996 run_tests $ns1 $ns2 10.0.1.1
c7d49c03 1997 chk_join_nr 1 1 1
ae7bd9cc 1998 fi
1002b89f
GT
1999}
2000
46e967d1
PA
2001subflows_error_tests()
2002{
2003 # If a single subflow is configured, and matches the MPC src
2004 # address, no additional subflow should be created
c7d49c03 2005 if reset "no MPC reuse with single endpoint"; then
ae7bd9cc
MB
2006 pm_nl_set_limits $ns1 0 1
2007 pm_nl_set_limits $ns2 0 1
2008 pm_nl_add_endpoint $ns2 10.0.1.2 flags subflow
e571fb09
GT
2009 speed=slow \
2010 run_tests $ns1 $ns2 10.0.1.1
c7d49c03 2011 chk_join_nr 0 0 0
ae7bd9cc 2012 fi
46e967d1
PA
2013
2014 # multiple subflows, with subflow creation error
4a0b866a
MB
2015 if reset_with_tcp_filter "multi subflows, with failing subflow" ns1 10.0.3.2 REJECT &&
2016 continue_if mptcp_lib_kallsyms_has "mptcp_pm_subflow_check_next$"; then
ae7bd9cc
MB
2017 pm_nl_set_limits $ns1 0 2
2018 pm_nl_set_limits $ns2 0 2
2019 pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow
2020 pm_nl_add_endpoint $ns2 10.0.2.2 flags subflow
e571fb09
GT
2021 speed=slow \
2022 run_tests $ns1 $ns2 10.0.1.1
c7d49c03 2023 chk_join_nr 1 1 1
ae7bd9cc 2024 fi
46e967d1
PA
2025
2026 # multiple subflows, with subflow timeout on MPJ
4a0b866a
MB
2027 if reset_with_tcp_filter "multi subflows, with subflow timeout" ns1 10.0.3.2 DROP &&
2028 continue_if mptcp_lib_kallsyms_has "mptcp_pm_subflow_check_next$"; then
ae7bd9cc
MB
2029 pm_nl_set_limits $ns1 0 2
2030 pm_nl_set_limits $ns2 0 2
2031 pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow
2032 pm_nl_add_endpoint $ns2 10.0.2.2 flags subflow
e571fb09
GT
2033 speed=slow \
2034 run_tests $ns1 $ns2 10.0.1.1
c7d49c03 2035 chk_join_nr 1 1 1
ae7bd9cc 2036 fi
46e967d1
PA
2037
2038 # multiple subflows, check that the endpoint corresponding to
2039 # closed subflow (due to reset) is not reused if additional
2040 # subflows are added later
4a0b866a
MB
2041 if reset_with_tcp_filter "multi subflows, fair usage on close" ns1 10.0.3.2 REJECT &&
2042 continue_if mptcp_lib_kallsyms_has "mptcp_pm_subflow_check_next$"; then
ae7bd9cc
MB
2043 pm_nl_set_limits $ns1 0 1
2044 pm_nl_set_limits $ns2 0 1
2045 pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow
e571fb09
GT
2046 speed=slow \
2047 run_tests $ns1 $ns2 10.0.1.1 &
ae7bd9cc
MB
2048
2049 # mpj subflow will be in TW after the reset
2050 wait_attempt_fail $ns2
2051 pm_nl_add_endpoint $ns2 10.0.2.2 flags subflow
2052 wait
2053
2054 # additional subflow could be created only if the PM select
2055 # the later endpoint, skipping the already used one
c7d49c03 2056 chk_join_nr 1 1 1
ae7bd9cc 2057 fi
46e967d1
PA
2058}
2059
1002b89f
GT
2060signal_address_tests()
2061{
2062 # add_address, unused
c7d49c03 2063 if reset "unused signal address"; then
ae7bd9cc
MB
2064 pm_nl_add_endpoint $ns1 10.0.2.1 flags signal
2065 run_tests $ns1 $ns2 10.0.1.1
c7d49c03 2066 chk_join_nr 0 0 0
0639fa23 2067 chk_add_tx_nr 1 1
ae7bd9cc
MB
2068 chk_add_nr 1 1
2069 fi
1002b89f
GT
2070
2071 # accept and use add_addr
c7d49c03 2072 if reset "signal address"; then
ae7bd9cc
MB
2073 pm_nl_set_limits $ns1 0 1
2074 pm_nl_set_limits $ns2 1 1
2075 pm_nl_add_endpoint $ns1 10.0.2.1 flags signal
2076 run_tests $ns1 $ns2 10.0.1.1
c7d49c03 2077 chk_join_nr 1 1 1
ae7bd9cc
MB
2078 chk_add_nr 1 1
2079 fi
1002b89f
GT
2080
2081 # accept and use add_addr with an additional subflow
2082 # note: signal address in server ns and local addresses in client ns must
2083 # belong to different subnets or one of the listed local address could be
2084 # used for 'add_addr' subflow
c7d49c03 2085 if reset "subflow and signal"; then
ae7bd9cc
MB
2086 pm_nl_add_endpoint $ns1 10.0.2.1 flags signal
2087 pm_nl_set_limits $ns1 0 2
2088 pm_nl_set_limits $ns2 1 2
2089 pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow
2090 run_tests $ns1 $ns2 10.0.1.1
c7d49c03 2091 chk_join_nr 2 2 2
ae7bd9cc
MB
2092 chk_add_nr 1 1
2093 fi
1002b89f
GT
2094
2095 # accept and use add_addr with additional subflows
c7d49c03 2096 if reset "multiple subflows and signal"; then
ae7bd9cc
MB
2097 pm_nl_set_limits $ns1 0 3
2098 pm_nl_add_endpoint $ns1 10.0.2.1 flags signal
2099 pm_nl_set_limits $ns2 1 3
2100 pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow
2101 pm_nl_add_endpoint $ns2 10.0.4.2 flags subflow
2102 run_tests $ns1 $ns2 10.0.1.1
c7d49c03 2103 chk_join_nr 3 3 3
ae7bd9cc
MB
2104 chk_add_nr 1 1
2105 fi
ef360019
GT
2106
2107 # signal addresses
c7d49c03 2108 if reset "signal addresses"; then
ae7bd9cc
MB
2109 pm_nl_set_limits $ns1 3 3
2110 pm_nl_add_endpoint $ns1 10.0.2.1 flags signal
2111 pm_nl_add_endpoint $ns1 10.0.3.1 flags signal
2112 pm_nl_add_endpoint $ns1 10.0.4.1 flags signal
2113 pm_nl_set_limits $ns2 3 3
2114 run_tests $ns1 $ns2 10.0.1.1
c7d49c03 2115 chk_join_nr 3 3 3
ae7bd9cc
MB
2116 chk_add_nr 3 3
2117 fi
ef360019
GT
2118
2119 # signal invalid addresses
c7d49c03 2120 if reset "signal invalid addresses"; then
ae7bd9cc
MB
2121 pm_nl_set_limits $ns1 3 3
2122 pm_nl_add_endpoint $ns1 10.0.12.1 flags signal
2123 pm_nl_add_endpoint $ns1 10.0.3.1 flags signal
2124 pm_nl_add_endpoint $ns1 10.0.14.1 flags signal
2125 pm_nl_set_limits $ns2 3 3
2126 run_tests $ns1 $ns2 10.0.1.1
c7d49c03 2127 chk_join_nr 1 1 1
ae7bd9cc
MB
2128 chk_add_nr 3 3
2129 fi
33c563ad
YL
2130
2131 # signal addresses race test
c7d49c03 2132 if reset "signal addresses race test"; then
ae7bd9cc
MB
2133 pm_nl_set_limits $ns1 4 4
2134 pm_nl_set_limits $ns2 4 4
2135 pm_nl_add_endpoint $ns1 10.0.1.1 flags signal
2136 pm_nl_add_endpoint $ns1 10.0.2.1 flags signal
2137 pm_nl_add_endpoint $ns1 10.0.3.1 flags signal
2138 pm_nl_add_endpoint $ns1 10.0.4.1 flags signal
2139 pm_nl_add_endpoint $ns2 10.0.1.2 flags signal
2140 pm_nl_add_endpoint $ns2 10.0.2.2 flags signal
2141 pm_nl_add_endpoint $ns2 10.0.3.2 flags signal
2142 pm_nl_add_endpoint $ns2 10.0.4.2 flags signal
2143
2144 # the peer could possibly miss some addr notification, allow retransmission
2145 ip netns exec $ns1 sysctl -q net.mptcp.add_addr_timeout=1
e571fb09
GT
2146 speed=slow \
2147 run_tests $ns1 $ns2 10.0.1.1
ae7bd9cc 2148
d4c81bbb
MB
2149 # It is not directly linked to the commit introducing this
2150 # symbol but for the parent one which is linked anyway.
2151 if ! mptcp_lib_kallsyms_has "mptcp_pm_subflow_check_next$"; then
2152 chk_join_nr 3 3 2
2153 chk_add_nr 4 4
2154 else
2155 chk_join_nr 3 3 3
2156 # the server will not signal the address terminating
2157 # the MPC subflow
2158 chk_add_nr 3 3
2159 fi
ae7bd9cc 2160 fi
1002b89f
GT
2161}
2162
2163link_failure_tests()
2164{
2165 # accept and use add_addr with additional subflows and link loss
c7d49c03 2166 if reset "multiple flows, signal, link failure"; then
ae7bd9cc
MB
2167 # without any b/w limit each veth could spool the packets and get
2168 # them acked at xmit time, so that the corresponding subflow will
2169 # have almost always no outstanding pkts, the scheduler will pick
2170 # always the first subflow and we will have hard time testing
2171 # active backup and link switch-over.
2172 # Let's set some arbitrary (low) virtual link limits.
2173 init_shapers
2174 pm_nl_set_limits $ns1 0 3
2175 pm_nl_add_endpoint $ns1 10.0.2.1 dev ns1eth2 flags signal
2176 pm_nl_set_limits $ns2 1 3
2177 pm_nl_add_endpoint $ns2 10.0.3.2 dev ns2eth3 flags subflow
2178 pm_nl_add_endpoint $ns2 10.0.4.2 dev ns2eth4 flags subflow
0c93af1f
GT
2179 test_linkfail=1 \
2180 run_tests $ns1 $ns2 10.0.1.1
c7d49c03 2181 chk_join_nr 3 3 3
ae7bd9cc
MB
2182 chk_add_nr 1 1
2183 chk_stale_nr $ns2 1 5 1
2184 fi
7d1e6f16
PA
2185
2186 # accept and use add_addr with additional subflows and link loss
2187 # for bidirectional transfer
c7d49c03 2188 if reset "multi flows, signal, bidi, link fail"; then
ae7bd9cc
MB
2189 init_shapers
2190 pm_nl_set_limits $ns1 0 3
2191 pm_nl_add_endpoint $ns1 10.0.2.1 dev ns1eth2 flags signal
2192 pm_nl_set_limits $ns2 1 3
2193 pm_nl_add_endpoint $ns2 10.0.3.2 dev ns2eth3 flags subflow
2194 pm_nl_add_endpoint $ns2 10.0.4.2 dev ns2eth4 flags subflow
0c93af1f
GT
2195 test_linkfail=2 \
2196 run_tests $ns1 $ns2 10.0.1.1
c7d49c03 2197 chk_join_nr 3 3 3
ae7bd9cc
MB
2198 chk_add_nr 1 1
2199 chk_stale_nr $ns2 1 -1 1
2200 fi
7d1e6f16
PA
2201
2202 # 2 subflows plus 1 backup subflow with a lossy link, backup
2203 # will never be used
c7d49c03 2204 if reset "backup subflow unused, link failure"; then
ae7bd9cc
MB
2205 init_shapers
2206 pm_nl_set_limits $ns1 0 2
2207 pm_nl_add_endpoint $ns1 10.0.2.1 dev ns1eth2 flags signal
2208 pm_nl_set_limits $ns2 1 2
ae7bd9cc 2209 pm_nl_add_endpoint $ns2 10.0.3.2 dev ns2eth3 flags subflow,backup
0c93af1f
GT
2210 FAILING_LINKS="1" test_linkfail=1 \
2211 run_tests $ns1 $ns2 10.0.1.1
c7d49c03 2212 chk_join_nr 2 2 2
ae7bd9cc
MB
2213 chk_add_nr 1 1
2214 chk_link_usage $ns2 ns2eth3 $cinsent 0
2215 fi
7d1e6f16
PA
2216
2217 # 2 lossy links after half transfer, backup will get half of
2218 # the traffic
c7d49c03 2219 if reset "backup flow used, multi links fail"; then
ae7bd9cc
MB
2220 init_shapers
2221 pm_nl_set_limits $ns1 0 2
2222 pm_nl_add_endpoint $ns1 10.0.2.1 dev ns1eth2 flags signal
2223 pm_nl_set_limits $ns2 1 2
2224 pm_nl_add_endpoint $ns2 10.0.3.2 dev ns2eth3 flags subflow,backup
0c93af1f
GT
2225 FAILING_LINKS="1 2" test_linkfail=1 \
2226 run_tests $ns1 $ns2 10.0.1.1
c7d49c03 2227 chk_join_nr 2 2 2
ae7bd9cc
MB
2228 chk_add_nr 1 1
2229 chk_stale_nr $ns2 2 4 2
2230 chk_link_usage $ns2 ns2eth3 $cinsent 50
2231 fi
7d1e6f16
PA
2232
2233 # use a backup subflow with the first subflow on a lossy link
2234 # for bidirectional transfer
c7d49c03 2235 if reset "backup flow used, bidi, link failure"; then
ae7bd9cc
MB
2236 init_shapers
2237 pm_nl_set_limits $ns1 0 2
2238 pm_nl_add_endpoint $ns1 10.0.2.1 dev ns1eth2 flags signal
2239 pm_nl_set_limits $ns2 1 3
2240 pm_nl_add_endpoint $ns2 10.0.3.2 dev ns2eth3 flags subflow,backup
0c93af1f
GT
2241 FAILING_LINKS="1 2" test_linkfail=2 \
2242 run_tests $ns1 $ns2 10.0.1.1
c7d49c03 2243 chk_join_nr 2 2 2
ae7bd9cc
MB
2244 chk_add_nr 1 1
2245 chk_stale_nr $ns2 1 -1 2
2246 chk_link_usage $ns2 ns2eth3 $cinsent 50
2247 fi
1002b89f
GT
2248}
2249
2250add_addr_timeout_tests()
2251{
2252 # add_addr timeout
c7d49c03 2253 if reset_with_add_addr_timeout "signal address, ADD_ADDR timeout"; then
ae7bd9cc
MB
2254 pm_nl_set_limits $ns1 0 1
2255 pm_nl_set_limits $ns2 1 1
2256 pm_nl_add_endpoint $ns1 10.0.2.1 flags signal
e571fb09
GT
2257 speed=slow \
2258 run_tests $ns1 $ns2 10.0.1.1
c7d49c03 2259 chk_join_nr 1 1 1
0639fa23 2260 chk_add_tx_nr 4 4
ae7bd9cc
MB
2261 chk_add_nr 4 0
2262 fi
1002b89f
GT
2263
2264 # add_addr timeout IPv6
c7d49c03 2265 if reset_with_add_addr_timeout "signal address, ADD_ADDR6 timeout" 6; then
ae7bd9cc
MB
2266 pm_nl_set_limits $ns1 0 1
2267 pm_nl_set_limits $ns2 1 1
2268 pm_nl_add_endpoint $ns1 dead:beef:2::1 flags signal
e571fb09
GT
2269 speed=slow \
2270 run_tests $ns1 $ns2 dead:beef:1::1
c7d49c03 2271 chk_join_nr 1 1 1
ae7bd9cc
MB
2272 chk_add_nr 4 0
2273 fi
8da6229b
GT
2274
2275 # signal addresses timeout
c7d49c03 2276 if reset_with_add_addr_timeout "signal addresses, ADD_ADDR timeout"; then
ae7bd9cc
MB
2277 pm_nl_set_limits $ns1 2 2
2278 pm_nl_add_endpoint $ns1 10.0.2.1 flags signal
2279 pm_nl_add_endpoint $ns1 10.0.3.1 flags signal
2280 pm_nl_set_limits $ns2 2 2
e571fb09
GT
2281 speed=10 \
2282 run_tests $ns1 $ns2 10.0.1.1
c7d49c03 2283 chk_join_nr 2 2 2
ae7bd9cc
MB
2284 chk_add_nr 8 0
2285 fi
8da6229b
GT
2286
2287 # signal invalid addresses timeout
c7d49c03 2288 if reset_with_add_addr_timeout "invalid address, ADD_ADDR timeout"; then
ae7bd9cc
MB
2289 pm_nl_set_limits $ns1 2 2
2290 pm_nl_add_endpoint $ns1 10.0.12.1 flags signal
2291 pm_nl_add_endpoint $ns1 10.0.3.1 flags signal
2292 pm_nl_set_limits $ns2 2 2
e571fb09
GT
2293 speed=10 \
2294 run_tests $ns1 $ns2 10.0.1.1
c7d49c03 2295 chk_join_nr 1 1 1
ae7bd9cc
MB
2296 chk_add_nr 8 0
2297 fi
1002b89f
GT
2298}
2299
2300remove_tests()
2301{
2302 # single subflow, remove
c7d49c03 2303 if reset "remove single subflow"; then
ae7bd9cc
MB
2304 pm_nl_set_limits $ns1 0 1
2305 pm_nl_set_limits $ns2 0 1
2306 pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow
e571fb09
GT
2307 addr_nr_ns2=-1 speed=slow \
2308 run_tests $ns1 $ns2 10.0.1.1
c7d49c03 2309 chk_join_nr 1 1 1
0639fa23 2310 chk_rm_tx_nr 1
ae7bd9cc 2311 chk_rm_nr 1 1
2cfaa8b3 2312 chk_rst_nr 0 0
ae7bd9cc 2313 fi
1002b89f
GT
2314
2315 # multiple subflows, remove
c7d49c03 2316 if reset "remove multiple subflows"; then
ae7bd9cc
MB
2317 pm_nl_set_limits $ns1 0 2
2318 pm_nl_set_limits $ns2 0 2
2319 pm_nl_add_endpoint $ns2 10.0.2.2 flags subflow
2320 pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow
e571fb09
GT
2321 addr_nr_ns2=-2 speed=slow \
2322 run_tests $ns1 $ns2 10.0.1.1
c7d49c03 2323 chk_join_nr 2 2 2
ae7bd9cc 2324 chk_rm_nr 2 2
2cfaa8b3 2325 chk_rst_nr 0 0
ae7bd9cc 2326 fi
1002b89f
GT
2327
2328 # single address, remove
c7d49c03 2329 if reset "remove single address"; then
ae7bd9cc
MB
2330 pm_nl_set_limits $ns1 0 1
2331 pm_nl_add_endpoint $ns1 10.0.2.1 flags signal
2332 pm_nl_set_limits $ns2 1 1
e571fb09
GT
2333 addr_nr_ns1=-1 speed=slow \
2334 run_tests $ns1 $ns2 10.0.1.1
c7d49c03 2335 chk_join_nr 1 1 1
ae7bd9cc
MB
2336 chk_add_nr 1 1
2337 chk_rm_nr 1 1 invert
2cfaa8b3 2338 chk_rst_nr 0 0
ae7bd9cc 2339 fi
1002b89f
GT
2340
2341 # subflow and signal, remove
c7d49c03 2342 if reset "remove subflow and signal"; then
ae7bd9cc
MB
2343 pm_nl_set_limits $ns1 0 2
2344 pm_nl_add_endpoint $ns1 10.0.2.1 flags signal
2345 pm_nl_set_limits $ns2 1 2
2346 pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow
e571fb09
GT
2347 addr_nr_ns1=-1 addr_nr_ns2=-1 speed=slow \
2348 run_tests $ns1 $ns2 10.0.1.1
c7d49c03 2349 chk_join_nr 2 2 2
ae7bd9cc
MB
2350 chk_add_nr 1 1
2351 chk_rm_nr 1 1
2cfaa8b3 2352 chk_rst_nr 0 0
ae7bd9cc 2353 fi
1002b89f
GT
2354
2355 # subflows and signal, remove
c7d49c03 2356 if reset "remove subflows and signal"; then
ae7bd9cc
MB
2357 pm_nl_set_limits $ns1 0 3
2358 pm_nl_add_endpoint $ns1 10.0.2.1 flags signal
2359 pm_nl_set_limits $ns2 1 3
2360 pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow
2361 pm_nl_add_endpoint $ns2 10.0.4.2 flags subflow
e571fb09
GT
2362 addr_nr_ns1=-1 addr_nr_ns2=-2 speed=10 \
2363 run_tests $ns1 $ns2 10.0.1.1
c7d49c03 2364 chk_join_nr 3 3 3
ae7bd9cc
MB
2365 chk_add_nr 1 1
2366 chk_rm_nr 2 2
2cfaa8b3 2367 chk_rst_nr 0 0
ae7bd9cc 2368 fi
1002b89f 2369
ef360019 2370 # addresses remove
c7d49c03 2371 if reset "remove addresses"; then
ae7bd9cc
MB
2372 pm_nl_set_limits $ns1 3 3
2373 pm_nl_add_endpoint $ns1 10.0.2.1 flags signal id 250
2374 pm_nl_add_endpoint $ns1 10.0.3.1 flags signal
2375 pm_nl_add_endpoint $ns1 10.0.4.1 flags signal
2376 pm_nl_set_limits $ns2 3 3
e571fb09
GT
2377 addr_nr_ns1=-3 speed=10 \
2378 run_tests $ns1 $ns2 10.0.1.1
c7d49c03 2379 chk_join_nr 3 3 3
ae7bd9cc
MB
2380 chk_add_nr 3 3
2381 chk_rm_nr 3 3 invert
2cfaa8b3 2382 chk_rst_nr 0 0
ae7bd9cc 2383 fi
ef360019
GT
2384
2385 # invalid addresses remove
c7d49c03 2386 if reset "remove invalid addresses"; then
ae7bd9cc
MB
2387 pm_nl_set_limits $ns1 3 3
2388 pm_nl_add_endpoint $ns1 10.0.12.1 flags signal
2389 pm_nl_add_endpoint $ns1 10.0.3.1 flags signal
2390 pm_nl_add_endpoint $ns1 10.0.14.1 flags signal
2391 pm_nl_set_limits $ns2 3 3
e571fb09
GT
2392 addr_nr_ns1=-3 speed=10 \
2393 run_tests $ns1 $ns2 10.0.1.1
c7d49c03 2394 chk_join_nr 1 1 1
ae7bd9cc
MB
2395 chk_add_nr 3 3
2396 chk_rm_nr 3 1 invert
2cfaa8b3 2397 chk_rst_nr 0 0
ae7bd9cc 2398 fi
ef360019 2399
1002b89f 2400 # subflows and signal, flush
c7d49c03 2401 if reset "flush subflows and signal"; then
ae7bd9cc
MB
2402 pm_nl_set_limits $ns1 0 3
2403 pm_nl_add_endpoint $ns1 10.0.2.1 flags signal
2404 pm_nl_set_limits $ns2 1 3
2405 pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow
2406 pm_nl_add_endpoint $ns2 10.0.4.2 flags subflow
e571fb09
GT
2407 addr_nr_ns1=-8 addr_nr_ns2=-8 speed=slow \
2408 run_tests $ns1 $ns2 10.0.1.1
c7d49c03 2409 chk_join_nr 3 3 3
ae7bd9cc
MB
2410 chk_add_nr 1 1
2411 chk_rm_nr 1 3 invert simult
2cfaa8b3 2412 chk_rst_nr 0 0
ae7bd9cc 2413 fi
d2c4333a
GT
2414
2415 # subflows flush
c7d49c03 2416 if reset "flush subflows"; then
ae7bd9cc
MB
2417 pm_nl_set_limits $ns1 3 3
2418 pm_nl_set_limits $ns2 3 3
2419 pm_nl_add_endpoint $ns2 10.0.2.2 flags subflow id 150
2420 pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow
2421 pm_nl_add_endpoint $ns2 10.0.4.2 flags subflow
e571fb09
GT
2422 addr_nr_ns1=-8 addr_nr_ns2=-8 speed=slow \
2423 run_tests $ns1 $ns2 10.0.1.1
c7d49c03 2424 chk_join_nr 3 3 3
425ba803
MB
2425
2426 if mptcp_lib_kversion_ge 5.18; then
173780ff 2427 chk_rm_tx_nr 0
425ba803
MB
2428 chk_rm_nr 0 3 simult
2429 else
2430 chk_rm_nr 3 3
2431 fi
2cfaa8b3 2432 chk_rst_nr 0 0
ae7bd9cc 2433 fi
d2c4333a
GT
2434
2435 # addresses flush
c7d49c03 2436 if reset "flush addresses"; then
ae7bd9cc
MB
2437 pm_nl_set_limits $ns1 3 3
2438 pm_nl_add_endpoint $ns1 10.0.2.1 flags signal id 250
2439 pm_nl_add_endpoint $ns1 10.0.3.1 flags signal
2440 pm_nl_add_endpoint $ns1 10.0.4.1 flags signal
2441 pm_nl_set_limits $ns2 3 3
e571fb09
GT
2442 addr_nr_ns1=-8 addr_nr_ns2=-8 speed=slow \
2443 run_tests $ns1 $ns2 10.0.1.1
c7d49c03 2444 chk_join_nr 3 3 3
ae7bd9cc
MB
2445 chk_add_nr 3 3
2446 chk_rm_nr 3 3 invert simult
2cfaa8b3 2447 chk_rst_nr 0 0
ae7bd9cc 2448 fi
ef360019
GT
2449
2450 # invalid addresses flush
c7d49c03 2451 if reset "flush invalid addresses"; then
ae7bd9cc
MB
2452 pm_nl_set_limits $ns1 3 3
2453 pm_nl_add_endpoint $ns1 10.0.12.1 flags signal
2454 pm_nl_add_endpoint $ns1 10.0.3.1 flags signal
2455 pm_nl_add_endpoint $ns1 10.0.14.1 flags signal
2456 pm_nl_set_limits $ns2 3 3
e571fb09
GT
2457 addr_nr_ns1=-8 speed=slow \
2458 run_tests $ns1 $ns2 10.0.1.1
c7d49c03 2459 chk_join_nr 1 1 1
ae7bd9cc
MB
2460 chk_add_nr 3 3
2461 chk_rm_nr 3 1 invert
2cfaa8b3 2462 chk_rst_nr 0 0
ae7bd9cc 2463 fi
5e287fe7
GT
2464
2465 # remove id 0 subflow
c7d49c03 2466 if reset "remove id 0 subflow"; then
ae7bd9cc
MB
2467 pm_nl_set_limits $ns1 0 1
2468 pm_nl_set_limits $ns2 0 1
2469 pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow
e571fb09
GT
2470 addr_nr_ns2=-9 speed=slow \
2471 run_tests $ns1 $ns2 10.0.1.1
c7d49c03 2472 chk_join_nr 1 1 1
ae7bd9cc 2473 chk_rm_nr 1 1
2cfaa8b3 2474 chk_rst_nr 0 0
ae7bd9cc 2475 fi
5e287fe7
GT
2476
2477 # remove id 0 address
c7d49c03 2478 if reset "remove id 0 address"; then
ae7bd9cc
MB
2479 pm_nl_set_limits $ns1 0 1
2480 pm_nl_add_endpoint $ns1 10.0.2.1 flags signal
2481 pm_nl_set_limits $ns2 1 1
e571fb09
GT
2482 addr_nr_ns1=-9 speed=slow \
2483 run_tests $ns1 $ns2 10.0.1.1
c7d49c03 2484 chk_join_nr 1 1 1
ae7bd9cc
MB
2485 chk_add_nr 1 1
2486 chk_rm_nr 1 1 invert
2cfaa8b3 2487 chk_rst_nr 0 0 invert
ae7bd9cc 2488 fi
1002b89f
GT
2489}
2490
2491add_tests()
2492{
2493 # add single subflow
c7d49c03 2494 if reset "add single subflow"; then
ae7bd9cc
MB
2495 pm_nl_set_limits $ns1 0 1
2496 pm_nl_set_limits $ns2 0 1
e571fb09
GT
2497 addr_nr_ns2=1 speed=slow \
2498 run_tests $ns1 $ns2 10.0.1.1
c7d49c03 2499 chk_join_nr 1 1 1
ae7bd9cc 2500 fi
1002b89f
GT
2501
2502 # add signal address
c7d49c03 2503 if reset "add signal address"; then
ae7bd9cc
MB
2504 pm_nl_set_limits $ns1 0 1
2505 pm_nl_set_limits $ns2 1 1
e571fb09
GT
2506 addr_nr_ns1=1 speed=slow \
2507 run_tests $ns1 $ns2 10.0.1.1
c7d49c03 2508 chk_join_nr 1 1 1
ae7bd9cc
MB
2509 chk_add_nr 1 1
2510 fi
1002b89f
GT
2511
2512 # add multiple subflows
c7d49c03 2513 if reset "add multiple subflows"; then
ae7bd9cc
MB
2514 pm_nl_set_limits $ns1 0 2
2515 pm_nl_set_limits $ns2 0 2
e571fb09
GT
2516 addr_nr_ns2=2 speed=slow \
2517 run_tests $ns1 $ns2 10.0.1.1
c7d49c03 2518 chk_join_nr 2 2 2
ae7bd9cc 2519 fi
1002b89f
GT
2520
2521 # add multiple subflows IPv6
c7d49c03 2522 if reset "add multiple subflows IPv6"; then
ae7bd9cc
MB
2523 pm_nl_set_limits $ns1 0 2
2524 pm_nl_set_limits $ns2 0 2
e571fb09
GT
2525 addr_nr_ns2=2 speed=slow \
2526 run_tests $ns1 $ns2 dead:beef:1::1
c7d49c03 2527 chk_join_nr 2 2 2
ae7bd9cc 2528 fi
1002b89f
GT
2529
2530 # add multiple addresses IPv6
c7d49c03 2531 if reset "add multiple addresses IPv6"; then
ae7bd9cc
MB
2532 pm_nl_set_limits $ns1 0 2
2533 pm_nl_set_limits $ns2 2 2
e571fb09
GT
2534 addr_nr_ns1=2 speed=slow \
2535 run_tests $ns1 $ns2 dead:beef:1::1
c7d49c03 2536 chk_join_nr 2 2 2
ae7bd9cc
MB
2537 chk_add_nr 2 2
2538 fi
1002b89f
GT
2539}
2540
2541ipv6_tests()
2542{
2543 # subflow IPv6
c7d49c03 2544 if reset "single subflow IPv6"; then
ae7bd9cc
MB
2545 pm_nl_set_limits $ns1 0 1
2546 pm_nl_set_limits $ns2 0 1
2547 pm_nl_add_endpoint $ns2 dead:beef:3::2 dev ns2eth3 flags subflow
e571fb09
GT
2548 speed=slow \
2549 run_tests $ns1 $ns2 dead:beef:1::1
c7d49c03 2550 chk_join_nr 1 1 1
ae7bd9cc 2551 fi
1002b89f
GT
2552
2553 # add_address, unused IPv6
c7d49c03 2554 if reset "unused signal address IPv6"; then
ae7bd9cc 2555 pm_nl_add_endpoint $ns1 dead:beef:2::1 flags signal
e571fb09
GT
2556 speed=slow \
2557 run_tests $ns1 $ns2 dead:beef:1::1
c7d49c03 2558 chk_join_nr 0 0 0
ae7bd9cc
MB
2559 chk_add_nr 1 1
2560 fi
1002b89f
GT
2561
2562 # signal address IPv6
c7d49c03 2563 if reset "single address IPv6"; then
ae7bd9cc
MB
2564 pm_nl_set_limits $ns1 0 1
2565 pm_nl_add_endpoint $ns1 dead:beef:2::1 flags signal
2566 pm_nl_set_limits $ns2 1 1
e571fb09
GT
2567 speed=slow \
2568 run_tests $ns1 $ns2 dead:beef:1::1
c7d49c03 2569 chk_join_nr 1 1 1
ae7bd9cc
MB
2570 chk_add_nr 1 1
2571 fi
1002b89f
GT
2572
2573 # single address IPv6, remove
c7d49c03 2574 if reset "remove single address IPv6"; then
ae7bd9cc
MB
2575 pm_nl_set_limits $ns1 0 1
2576 pm_nl_add_endpoint $ns1 dead:beef:2::1 flags signal
2577 pm_nl_set_limits $ns2 1 1
e571fb09
GT
2578 addr_nr_ns1=-1 speed=slow \
2579 run_tests $ns1 $ns2 dead:beef:1::1
c7d49c03 2580 chk_join_nr 1 1 1
ae7bd9cc
MB
2581 chk_add_nr 1 1
2582 chk_rm_nr 1 1 invert
2583 fi
1002b89f
GT
2584
2585 # subflow and signal IPv6, remove
c7d49c03 2586 if reset "remove subflow and signal IPv6"; then
ae7bd9cc
MB
2587 pm_nl_set_limits $ns1 0 2
2588 pm_nl_add_endpoint $ns1 dead:beef:2::1 flags signal
2589 pm_nl_set_limits $ns2 1 2
2590 pm_nl_add_endpoint $ns2 dead:beef:3::2 dev ns2eth3 flags subflow
e571fb09
GT
2591 addr_nr_ns1=-1 addr_nr_ns2=-1 speed=slow \
2592 run_tests $ns1 $ns2 dead:beef:1::1
c7d49c03 2593 chk_join_nr 2 2 2
ae7bd9cc
MB
2594 chk_add_nr 1 1
2595 chk_rm_nr 1 1
2596 fi
1002b89f
GT
2597}
2598
2599v4mapped_tests()
2600{
2601 # subflow IPv4-mapped to IPv4-mapped
c7d49c03 2602 if reset "single subflow IPv4-mapped"; then
ae7bd9cc
MB
2603 pm_nl_set_limits $ns1 0 1
2604 pm_nl_set_limits $ns2 0 1
2605 pm_nl_add_endpoint $ns2 "::ffff:10.0.3.2" flags subflow
2606 run_tests $ns1 $ns2 "::ffff:10.0.1.1"
c7d49c03 2607 chk_join_nr 1 1 1
ae7bd9cc 2608 fi
1002b89f
GT
2609
2610 # signal address IPv4-mapped with IPv4-mapped sk
c7d49c03 2611 if reset "signal address IPv4-mapped"; then
ae7bd9cc
MB
2612 pm_nl_set_limits $ns1 0 1
2613 pm_nl_set_limits $ns2 1 1
2614 pm_nl_add_endpoint $ns1 "::ffff:10.0.2.1" flags signal
2615 run_tests $ns1 $ns2 "::ffff:10.0.1.1"
c7d49c03 2616 chk_join_nr 1 1 1
ae7bd9cc
MB
2617 chk_add_nr 1 1
2618 fi
1002b89f
GT
2619
2620 # subflow v4-map-v6
c7d49c03 2621 if reset "single subflow v4-map-v6"; then
ae7bd9cc
MB
2622 pm_nl_set_limits $ns1 0 1
2623 pm_nl_set_limits $ns2 0 1
2624 pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow
2625 run_tests $ns1 $ns2 "::ffff:10.0.1.1"
c7d49c03 2626 chk_join_nr 1 1 1
ae7bd9cc 2627 fi
1002b89f
GT
2628
2629 # signal address v4-map-v6
c7d49c03 2630 if reset "signal address v4-map-v6"; then
ae7bd9cc
MB
2631 pm_nl_set_limits $ns1 0 1
2632 pm_nl_set_limits $ns2 1 1
2633 pm_nl_add_endpoint $ns1 10.0.2.1 flags signal
2634 run_tests $ns1 $ns2 "::ffff:10.0.1.1"
c7d49c03 2635 chk_join_nr 1 1 1
ae7bd9cc
MB
2636 chk_add_nr 1 1
2637 fi
1002b89f
GT
2638
2639 # subflow v6-map-v4
c7d49c03 2640 if reset "single subflow v6-map-v4"; then
ae7bd9cc
MB
2641 pm_nl_set_limits $ns1 0 1
2642 pm_nl_set_limits $ns2 0 1
2643 pm_nl_add_endpoint $ns2 "::ffff:10.0.3.2" flags subflow
2644 run_tests $ns1 $ns2 10.0.1.1
c7d49c03 2645 chk_join_nr 1 1 1
ae7bd9cc 2646 fi
1002b89f
GT
2647
2648 # signal address v6-map-v4
c7d49c03 2649 if reset "signal address v6-map-v4"; then
ae7bd9cc
MB
2650 pm_nl_set_limits $ns1 0 1
2651 pm_nl_set_limits $ns2 1 1
2652 pm_nl_add_endpoint $ns1 "::ffff:10.0.2.1" flags signal
2653 run_tests $ns1 $ns2 10.0.1.1
c7d49c03 2654 chk_join_nr 1 1 1
ae7bd9cc
MB
2655 chk_add_nr 1 1
2656 fi
1002b89f
GT
2657
2658 # no subflow IPv6 to v4 address
c7d49c03 2659 if reset "no JOIN with diff families v4-v6"; then
ae7bd9cc
MB
2660 pm_nl_set_limits $ns1 0 1
2661 pm_nl_set_limits $ns2 0 1
2662 pm_nl_add_endpoint $ns2 dead:beef:2::2 flags subflow
2663 run_tests $ns1 $ns2 10.0.1.1
c7d49c03 2664 chk_join_nr 0 0 0
ae7bd9cc 2665 fi
1002b89f
GT
2666
2667 # no subflow IPv6 to v4 address even if v6 has a valid v4 at the end
c7d49c03 2668 if reset "no JOIN with diff families v4-v6-2"; then
ae7bd9cc
MB
2669 pm_nl_set_limits $ns1 0 1
2670 pm_nl_set_limits $ns2 0 1
2671 pm_nl_add_endpoint $ns2 dead:beef:2::10.0.3.2 flags subflow
2672 run_tests $ns1 $ns2 10.0.1.1
c7d49c03 2673 chk_join_nr 0 0 0
ae7bd9cc 2674 fi
1002b89f
GT
2675
2676 # no subflow IPv4 to v6 address, no need to slow down too then
c7d49c03 2677 if reset "no JOIN with diff families v6-v4"; then
ae7bd9cc
MB
2678 pm_nl_set_limits $ns1 0 1
2679 pm_nl_set_limits $ns2 0 1
2680 pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow
2681 run_tests $ns1 $ns2 dead:beef:1::1
c7d49c03 2682 chk_join_nr 0 0 0
ae7bd9cc 2683 fi
1002b89f
GT
2684}
2685
ad349374
PA
2686mixed_tests()
2687{
6673851b
MB
2688 if reset "IPv4 sockets do not use IPv6 addresses" &&
2689 continue_if mptcp_lib_kversion_ge 6.3; then
ad349374
PA
2690 pm_nl_set_limits $ns1 0 1
2691 pm_nl_set_limits $ns2 1 1
2692 pm_nl_add_endpoint $ns1 dead:beef:2::1 flags signal
e571fb09
GT
2693 speed=slow \
2694 run_tests $ns1 $ns2 10.0.1.1
ad349374
PA
2695 chk_join_nr 0 0 0
2696 fi
2697
2698 # Need an IPv6 mptcp socket to allow subflows of both families
6673851b
MB
2699 if reset "simult IPv4 and IPv6 subflows" &&
2700 continue_if mptcp_lib_kversion_ge 6.3; then
ad349374
PA
2701 pm_nl_set_limits $ns1 0 1
2702 pm_nl_set_limits $ns2 1 1
2703 pm_nl_add_endpoint $ns1 10.0.1.1 flags signal
e571fb09
GT
2704 speed=slow \
2705 run_tests $ns1 $ns2 dead:beef:2::1
ad349374
PA
2706 chk_join_nr 1 1 1
2707 fi
2708
2709 # cross families subflows will not be created even in fullmesh mode
6673851b
MB
2710 if reset "simult IPv4 and IPv6 subflows, fullmesh 1x1" &&
2711 continue_if mptcp_lib_kversion_ge 6.3; then
ad349374
PA
2712 pm_nl_set_limits $ns1 0 4
2713 pm_nl_set_limits $ns2 1 4
2714 pm_nl_add_endpoint $ns2 dead:beef:2::2 flags subflow,fullmesh
2715 pm_nl_add_endpoint $ns1 10.0.1.1 flags signal
e571fb09
GT
2716 speed=slow \
2717 run_tests $ns1 $ns2 dead:beef:2::1
ad349374
PA
2718 chk_join_nr 1 1 1
2719 fi
2720
2721 # fullmesh still tries to create all the possibly subflows with
2722 # matching family
6673851b
MB
2723 if reset "simult IPv4 and IPv6 subflows, fullmesh 2x2" &&
2724 continue_if mptcp_lib_kversion_ge 6.3; then
ad349374
PA
2725 pm_nl_set_limits $ns1 0 4
2726 pm_nl_set_limits $ns2 2 4
2727 pm_nl_add_endpoint $ns1 10.0.2.1 flags signal
2728 pm_nl_add_endpoint $ns1 dead:beef:2::1 flags signal
e571fb09
GT
2729 fullmesh=1 speed=slow \
2730 run_tests $ns1 $ns2 dead:beef:1::1
ad349374
PA
2731 chk_join_nr 4 4 4
2732 fi
2733}
2734
1002b89f
GT
2735backup_tests()
2736{
2737 # single subflow, backup
07216a3c
MB
2738 if reset "single subflow, backup" &&
2739 continue_if mptcp_lib_kallsyms_has "subflow_rebuild_header$"; then
ae7bd9cc
MB
2740 pm_nl_set_limits $ns1 0 1
2741 pm_nl_set_limits $ns2 0 1
2742 pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow,backup
e571fb09
GT
2743 sflags=nobackup speed=slow \
2744 run_tests $ns1 $ns2 10.0.1.1
c7d49c03 2745 chk_join_nr 1 1 1
ae7bd9cc
MB
2746 chk_prio_nr 0 1
2747 fi
1002b89f
GT
2748
2749 # single address, backup
07216a3c
MB
2750 if reset "single address, backup" &&
2751 continue_if mptcp_lib_kallsyms_has "subflow_rebuild_header$"; then
ae7bd9cc
MB
2752 pm_nl_set_limits $ns1 0 1
2753 pm_nl_add_endpoint $ns1 10.0.2.1 flags signal
2754 pm_nl_set_limits $ns2 1 1
e571fb09
GT
2755 sflags=backup speed=slow \
2756 run_tests $ns1 $ns2 10.0.1.1
c7d49c03 2757 chk_join_nr 1 1 1
ae7bd9cc
MB
2758 chk_add_nr 1 1
2759 chk_prio_nr 1 1
2760 fi
33397b83
GT
2761
2762 # single address with port, backup
07216a3c
MB
2763 if reset "single address with port, backup" &&
2764 continue_if mptcp_lib_kallsyms_has "subflow_rebuild_header$"; then
ae7bd9cc
MB
2765 pm_nl_set_limits $ns1 0 1
2766 pm_nl_add_endpoint $ns1 10.0.2.1 flags signal port 10100
2767 pm_nl_set_limits $ns2 1 1
e571fb09
GT
2768 sflags=backup speed=slow \
2769 run_tests $ns1 $ns2 10.0.1.1
c7d49c03 2770 chk_join_nr 1 1 1
ae7bd9cc
MB
2771 chk_add_nr 1 1
2772 chk_prio_nr 1 1
2773 fi
914f6a59 2774
632978f0
MB
2775 if reset "mpc backup" &&
2776 continue_if mptcp_lib_kallsyms_doesnt_have "mptcp_subflow_send_ack$"; then
914f6a59 2777 pm_nl_add_endpoint $ns2 10.0.1.2 flags subflow,backup
e571fb09
GT
2778 speed=slow \
2779 run_tests $ns1 $ns2 10.0.1.1
914f6a59
PA
2780 chk_join_nr 0 0 0
2781 chk_prio_nr 0 1
2782 fi
2783
632978f0
MB
2784 if reset "mpc backup both sides" &&
2785 continue_if mptcp_lib_kallsyms_doesnt_have "mptcp_subflow_send_ack$"; then
914f6a59
PA
2786 pm_nl_add_endpoint $ns1 10.0.1.1 flags subflow,backup
2787 pm_nl_add_endpoint $ns2 10.0.1.2 flags subflow,backup
e571fb09
GT
2788 speed=slow \
2789 run_tests $ns1 $ns2 10.0.1.1
914f6a59
PA
2790 chk_join_nr 0 0 0
2791 chk_prio_nr 1 1
2792 fi
2793
632978f0
MB
2794 if reset "mpc switch to backup" &&
2795 continue_if mptcp_lib_kallsyms_doesnt_have "mptcp_subflow_send_ack$"; then
914f6a59 2796 pm_nl_add_endpoint $ns2 10.0.1.2 flags subflow
e571fb09
GT
2797 sflags=backup speed=slow \
2798 run_tests $ns1 $ns2 10.0.1.1
914f6a59
PA
2799 chk_join_nr 0 0 0
2800 chk_prio_nr 0 1
2801 fi
2802
632978f0
MB
2803 if reset "mpc switch to backup both sides" &&
2804 continue_if mptcp_lib_kallsyms_doesnt_have "mptcp_subflow_send_ack$"; then
914f6a59
PA
2805 pm_nl_add_endpoint $ns1 10.0.1.1 flags subflow
2806 pm_nl_add_endpoint $ns2 10.0.1.2 flags subflow
e571fb09
GT
2807 sflags=backup speed=slow \
2808 run_tests $ns1 $ns2 10.0.1.1
914f6a59
PA
2809 chk_join_nr 0 0 0
2810 chk_prio_nr 1 1
2811 fi
1002b89f
GT
2812}
2813
178d0232
GT
2814LISTENER_CREATED=15 #MPTCP_EVENT_LISTENER_CREATED
2815LISTENER_CLOSED=16 #MPTCP_EVENT_LISTENER_CLOSED
2816
2817AF_INET=2
2818AF_INET6=10
2819
2820verify_listener_events()
2821{
2822 local evt=$1
2823 local e_type=$2
2824 local e_family=$3
2825 local e_saddr=$4
2826 local e_sport=$5
2827 local type
2828 local family
2829 local saddr
2830 local sport
96b84195 2831 local name
178d0232
GT
2832
2833 if [ $e_type = $LISTENER_CREATED ]; then
96b84195 2834 name="LISTENER_CREATED"
178d0232 2835 elif [ $e_type = $LISTENER_CLOSED ]; then
03668c65 2836 name="LISTENER_CLOSED "
96b84195
MB
2837 else
2838 name="$e_type"
178d0232
GT
2839 fi
2840
03668c65 2841 print_check "$name $e_saddr:$e_sport"
96b84195 2842
0471bb47 2843 if ! mptcp_lib_kallsyms_has "mptcp_event_pm_listener$"; then
03668c65 2844 print_skip "event not supported"
0471bb47 2845 return
178d0232
GT
2846 fi
2847
96b84195
MB
2848 type=$(grep "type:$e_type," $evt | sed -n 's/.*\(type:\)\([[:digit:]]*\).*$/\2/p;q')
2849 family=$(grep "type:$e_type," $evt | sed -n 's/.*\(family:\)\([[:digit:]]*\).*$/\2/p;q')
2850 sport=$(grep "type:$e_type," $evt | sed -n 's/.*\(sport:\)\([[:digit:]]*\).*$/\2/p;q')
178d0232 2851 if [ $family ] && [ $family = $AF_INET6 ]; then
96b84195 2852 saddr=$(grep "type:$e_type," $evt | sed -n 's/.*\(saddr6:\)\([0-9a-f:.]*\).*$/\2/p;q')
178d0232 2853 else
96b84195 2854 saddr=$(grep "type:$e_type," $evt | sed -n 's/.*\(saddr4:\)\([0-9.]*\).*$/\2/p;q')
178d0232
GT
2855 fi
2856
2857 if [ $type ] && [ $type = $e_type ] &&
2858 [ $family ] && [ $family = $e_family ] &&
2859 [ $saddr ] && [ $saddr = $e_saddr ] &&
2860 [ $sport ] && [ $sport = $e_sport ]; then
03668c65 2861 print_ok
178d0232
GT
2862 return 0
2863 fi
03668c65 2864 fail_test "$e_type:$type $e_family:$family $e_saddr:$saddr $e_sport:$sport"
178d0232
GT
2865}
2866
1002b89f
GT
2867add_addr_ports_tests()
2868{
2869 # signal address with port
c7d49c03 2870 if reset "signal address with port"; then
ae7bd9cc
MB
2871 pm_nl_set_limits $ns1 0 1
2872 pm_nl_set_limits $ns2 1 1
2873 pm_nl_add_endpoint $ns1 10.0.2.1 flags signal port 10100
2874 run_tests $ns1 $ns2 10.0.1.1
c7d49c03 2875 chk_join_nr 1 1 1
ae7bd9cc
MB
2876 chk_add_nr 1 1 1
2877 fi
1002b89f
GT
2878
2879 # subflow and signal with port
c7d49c03 2880 if reset "subflow and signal with port"; then
ae7bd9cc
MB
2881 pm_nl_add_endpoint $ns1 10.0.2.1 flags signal port 10100
2882 pm_nl_set_limits $ns1 0 2
2883 pm_nl_set_limits $ns2 1 2
2884 pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow
2885 run_tests $ns1 $ns2 10.0.1.1
c7d49c03 2886 chk_join_nr 2 2 2
ae7bd9cc
MB
2887 chk_add_nr 1 1 1
2888 fi
1002b89f
GT
2889
2890 # single address with port, remove
178d0232
GT
2891 # pm listener events
2892 if reset_with_events "remove single address with port"; then
ae7bd9cc
MB
2893 pm_nl_set_limits $ns1 0 1
2894 pm_nl_add_endpoint $ns1 10.0.2.1 flags signal port 10100
2895 pm_nl_set_limits $ns2 1 1
e571fb09
GT
2896 addr_nr_ns1=-1 speed=slow \
2897 run_tests $ns1 $ns2 10.0.1.1
c7d49c03 2898 chk_join_nr 1 1 1
ae7bd9cc
MB
2899 chk_add_nr 1 1 1
2900 chk_rm_nr 1 1 invert
178d0232
GT
2901
2902 verify_listener_events $evts_ns1 $LISTENER_CREATED $AF_INET 10.0.2.1 10100
2903 verify_listener_events $evts_ns1 $LISTENER_CLOSED $AF_INET 10.0.2.1 10100
2904 kill_events_pids
ae7bd9cc 2905 fi
1002b89f
GT
2906
2907 # subflow and signal with port, remove
c7d49c03 2908 if reset "remove subflow and signal with port"; then
ae7bd9cc
MB
2909 pm_nl_set_limits $ns1 0 2
2910 pm_nl_add_endpoint $ns1 10.0.2.1 flags signal port 10100
2911 pm_nl_set_limits $ns2 1 2
2912 pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow
e571fb09
GT
2913 addr_nr_ns1=-1 addr_nr_ns2=-1 speed=slow \
2914 run_tests $ns1 $ns2 10.0.1.1
c7d49c03 2915 chk_join_nr 2 2 2
ae7bd9cc
MB
2916 chk_add_nr 1 1 1
2917 chk_rm_nr 1 1
2918 fi
1002b89f
GT
2919
2920 # subflows and signal with port, flush
c7d49c03 2921 if reset "flush subflows and signal with port"; then
ae7bd9cc
MB
2922 pm_nl_set_limits $ns1 0 3
2923 pm_nl_add_endpoint $ns1 10.0.2.1 flags signal port 10100
2924 pm_nl_set_limits $ns2 1 3
2925 pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow
2926 pm_nl_add_endpoint $ns2 10.0.4.2 flags subflow
e571fb09
GT
2927 addr_nr_ns1=-8 addr_nr_ns2=-2 speed=slow \
2928 run_tests $ns1 $ns2 10.0.1.1
c7d49c03 2929 chk_join_nr 3 3 3
ae7bd9cc
MB
2930 chk_add_nr 1 1
2931 chk_rm_nr 1 3 invert simult
2932 fi
1002b89f
GT
2933
2934 # multiple addresses with port
c7d49c03 2935 if reset "multiple addresses with port"; then
ae7bd9cc
MB
2936 pm_nl_set_limits $ns1 2 2
2937 pm_nl_add_endpoint $ns1 10.0.2.1 flags signal port 10100
2938 pm_nl_add_endpoint $ns1 10.0.3.1 flags signal port 10100
2939 pm_nl_set_limits $ns2 2 2
2940 run_tests $ns1 $ns2 10.0.1.1
c7d49c03 2941 chk_join_nr 2 2 2
ae7bd9cc
MB
2942 chk_add_nr 2 2 2
2943 fi
1002b89f
GT
2944
2945 # multiple addresses with ports
c7d49c03 2946 if reset "multiple addresses with ports"; then
ae7bd9cc
MB
2947 pm_nl_set_limits $ns1 2 2
2948 pm_nl_add_endpoint $ns1 10.0.2.1 flags signal port 10100
2949 pm_nl_add_endpoint $ns1 10.0.3.1 flags signal port 10101
2950 pm_nl_set_limits $ns2 2 2
2951 run_tests $ns1 $ns2 10.0.1.1
c7d49c03 2952 chk_join_nr 2 2 2
ae7bd9cc
MB
2953 chk_add_nr 2 2 2
2954 fi
1002b89f
GT
2955}
2956
2957syncookies_tests()
2958{
2959 # single subflow, syncookies
c7d49c03 2960 if reset_with_cookies "single subflow with syn cookies"; then
ae7bd9cc
MB
2961 pm_nl_set_limits $ns1 0 1
2962 pm_nl_set_limits $ns2 0 1
2963 pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow
2964 run_tests $ns1 $ns2 10.0.1.1
c7d49c03 2965 chk_join_nr 1 1 1
ae7bd9cc 2966 fi
1002b89f
GT
2967
2968 # multiple subflows with syn cookies
c7d49c03 2969 if reset_with_cookies "multiple subflows with syn cookies"; then
ae7bd9cc
MB
2970 pm_nl_set_limits $ns1 0 2
2971 pm_nl_set_limits $ns2 0 2
2972 pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow
2973 pm_nl_add_endpoint $ns2 10.0.2.2 flags subflow
2974 run_tests $ns1 $ns2 10.0.1.1
c7d49c03 2975 chk_join_nr 2 2 2
ae7bd9cc 2976 fi
1002b89f
GT
2977
2978 # multiple subflows limited by server
c7d49c03 2979 if reset_with_cookies "subflows limited by server w cookies"; then
ae7bd9cc
MB
2980 pm_nl_set_limits $ns1 0 1
2981 pm_nl_set_limits $ns2 0 2
2982 pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow
2983 pm_nl_add_endpoint $ns2 10.0.2.2 flags subflow
2984 run_tests $ns1 $ns2 10.0.1.1
c7d49c03 2985 chk_join_nr 2 1 1
ae7bd9cc 2986 fi
1002b89f
GT
2987
2988 # test signal address with cookies
c7d49c03 2989 if reset_with_cookies "signal address with syn cookies"; then
ae7bd9cc
MB
2990 pm_nl_set_limits $ns1 0 1
2991 pm_nl_set_limits $ns2 1 1
2992 pm_nl_add_endpoint $ns1 10.0.2.1 flags signal
2993 run_tests $ns1 $ns2 10.0.1.1
c7d49c03 2994 chk_join_nr 1 1 1
ae7bd9cc
MB
2995 chk_add_nr 1 1
2996 fi
1002b89f
GT
2997
2998 # test cookie with subflow and signal
c7d49c03 2999 if reset_with_cookies "subflow and signal w cookies"; then
ae7bd9cc
MB
3000 pm_nl_add_endpoint $ns1 10.0.2.1 flags signal
3001 pm_nl_set_limits $ns1 0 2
3002 pm_nl_set_limits $ns2 1 2
3003 pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow
3004 run_tests $ns1 $ns2 10.0.1.1
c7d49c03 3005 chk_join_nr 2 2 2
ae7bd9cc
MB
3006 chk_add_nr 1 1
3007 fi
1002b89f
GT
3008
3009 # accept and use add_addr with additional subflows
c7d49c03 3010 if reset_with_cookies "subflows and signal w. cookies"; then
ae7bd9cc
MB
3011 pm_nl_set_limits $ns1 0 3
3012 pm_nl_add_endpoint $ns1 10.0.2.1 flags signal
3013 pm_nl_set_limits $ns2 1 3
3014 pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow
3015 pm_nl_add_endpoint $ns2 10.0.4.2 flags subflow
3016 run_tests $ns1 $ns2 10.0.1.1
c7d49c03 3017 chk_join_nr 3 3 3
ae7bd9cc
MB
3018 chk_add_nr 1 1
3019 fi
1002b89f
GT
3020}
3021
af66d3e1
GT
3022checksum_tests()
3023{
3024 # checksum test 0 0
ae7bd9cc
MB
3025 if reset_with_checksum 0 0; then
3026 pm_nl_set_limits $ns1 0 1
3027 pm_nl_set_limits $ns2 0 1
3028 run_tests $ns1 $ns2 10.0.1.1
c7d49c03 3029 chk_join_nr 0 0 0
ae7bd9cc 3030 fi
af66d3e1
GT
3031
3032 # checksum test 1 1
ae7bd9cc
MB
3033 if reset_with_checksum 1 1; then
3034 pm_nl_set_limits $ns1 0 1
3035 pm_nl_set_limits $ns2 0 1
3036 run_tests $ns1 $ns2 10.0.1.1
c7d49c03 3037 chk_join_nr 0 0 0
ae7bd9cc 3038 fi
af66d3e1
GT
3039
3040 # checksum test 0 1
ae7bd9cc
MB
3041 if reset_with_checksum 0 1; then
3042 pm_nl_set_limits $ns1 0 1
3043 pm_nl_set_limits $ns2 0 1
3044 run_tests $ns1 $ns2 10.0.1.1
c7d49c03 3045 chk_join_nr 0 0 0
ae7bd9cc 3046 fi
af66d3e1
GT
3047
3048 # checksum test 1 0
ae7bd9cc
MB
3049 if reset_with_checksum 1 0; then
3050 pm_nl_set_limits $ns1 0 1
3051 pm_nl_set_limits $ns2 0 1
3052 run_tests $ns1 $ns2 10.0.1.1
c7d49c03 3053 chk_join_nr 0 0 0
ae7bd9cc 3054 fi
af66d3e1
GT
3055}
3056
0cddb4a6
GT
3057deny_join_id0_tests()
3058{
3059 # subflow allow join id0 ns1
c7d49c03 3060 if reset_with_allow_join_id0 "single subflow allow join id0 ns1" 1 0; then
ae7bd9cc
MB
3061 pm_nl_set_limits $ns1 1 1
3062 pm_nl_set_limits $ns2 1 1
3063 pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow
3064 run_tests $ns1 $ns2 10.0.1.1
c7d49c03 3065 chk_join_nr 1 1 1
ae7bd9cc 3066 fi
0cddb4a6
GT
3067
3068 # subflow allow join id0 ns2
c7d49c03 3069 if reset_with_allow_join_id0 "single subflow allow join id0 ns2" 0 1; then
ae7bd9cc
MB
3070 pm_nl_set_limits $ns1 1 1
3071 pm_nl_set_limits $ns2 1 1
3072 pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow
3073 run_tests $ns1 $ns2 10.0.1.1
c7d49c03 3074 chk_join_nr 0 0 0
ae7bd9cc 3075 fi
0cddb4a6
GT
3076
3077 # signal address allow join id0 ns1
3078 # ADD_ADDRs are not affected by allow_join_id0 value.
c7d49c03 3079 if reset_with_allow_join_id0 "signal address allow join id0 ns1" 1 0; then
ae7bd9cc
MB
3080 pm_nl_set_limits $ns1 1 1
3081 pm_nl_set_limits $ns2 1 1
3082 pm_nl_add_endpoint $ns1 10.0.2.1 flags signal
3083 run_tests $ns1 $ns2 10.0.1.1
c7d49c03 3084 chk_join_nr 1 1 1
ae7bd9cc
MB
3085 chk_add_nr 1 1
3086 fi
0cddb4a6
GT
3087
3088 # signal address allow join id0 ns2
3089 # ADD_ADDRs are not affected by allow_join_id0 value.
c7d49c03 3090 if reset_with_allow_join_id0 "signal address allow join id0 ns2" 0 1; then
ae7bd9cc
MB
3091 pm_nl_set_limits $ns1 1 1
3092 pm_nl_set_limits $ns2 1 1
3093 pm_nl_add_endpoint $ns1 10.0.2.1 flags signal
3094 run_tests $ns1 $ns2 10.0.1.1
c7d49c03 3095 chk_join_nr 1 1 1
ae7bd9cc
MB
3096 chk_add_nr 1 1
3097 fi
0cddb4a6
GT
3098
3099 # subflow and address allow join id0 ns1
c7d49c03 3100 if reset_with_allow_join_id0 "subflow and address allow join id0 1" 1 0; then
ae7bd9cc
MB
3101 pm_nl_set_limits $ns1 2 2
3102 pm_nl_set_limits $ns2 2 2
3103 pm_nl_add_endpoint $ns1 10.0.2.1 flags signal
3104 pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow
3105 run_tests $ns1 $ns2 10.0.1.1
c7d49c03 3106 chk_join_nr 2 2 2
ae7bd9cc 3107 fi
0cddb4a6
GT
3108
3109 # subflow and address allow join id0 ns2
c7d49c03 3110 if reset_with_allow_join_id0 "subflow and address allow join id0 2" 0 1; then
ae7bd9cc
MB
3111 pm_nl_set_limits $ns1 2 2
3112 pm_nl_set_limits $ns2 2 2
3113 pm_nl_add_endpoint $ns1 10.0.2.1 flags signal
3114 pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow
3115 run_tests $ns1 $ns2 10.0.1.1
c7d49c03 3116 chk_join_nr 1 1 1
ae7bd9cc 3117 fi
0cddb4a6
GT
3118}
3119
4f49d633
GT
3120fullmesh_tests()
3121{
3122 # fullmesh 1
3123 # 2 fullmesh addrs in ns2, added before the connection,
3124 # 1 non-fullmesh addr in ns1, added during the connection.
c7d49c03 3125 if reset "fullmesh test 2x1"; then
ae7bd9cc
MB
3126 pm_nl_set_limits $ns1 0 4
3127 pm_nl_set_limits $ns2 1 4
3128 pm_nl_add_endpoint $ns2 10.0.2.2 flags subflow,fullmesh
3129 pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow,fullmesh
e571fb09
GT
3130 addr_nr_ns1=1 speed=slow \
3131 run_tests $ns1 $ns2 10.0.1.1
c7d49c03 3132 chk_join_nr 4 4 4
ae7bd9cc
MB
3133 chk_add_nr 1 1
3134 fi
4f49d633
GT
3135
3136 # fullmesh 2
3137 # 1 non-fullmesh addr in ns1, added before the connection,
3138 # 1 fullmesh addr in ns2, added during the connection.
c7d49c03 3139 if reset "fullmesh test 1x1"; then
ae7bd9cc
MB
3140 pm_nl_set_limits $ns1 1 3
3141 pm_nl_set_limits $ns2 1 3
3142 pm_nl_add_endpoint $ns1 10.0.2.1 flags signal
e571fb09
GT
3143 fullmesh=1 speed=slow \
3144 run_tests $ns1 $ns2 10.0.1.1
c7d49c03 3145 chk_join_nr 3 3 3
ae7bd9cc
MB
3146 chk_add_nr 1 1
3147 fi
4f49d633
GT
3148
3149 # fullmesh 3
3150 # 1 non-fullmesh addr in ns1, added before the connection,
3151 # 2 fullmesh addrs in ns2, added during the connection.
c7d49c03 3152 if reset "fullmesh test 1x2"; then
ae7bd9cc
MB
3153 pm_nl_set_limits $ns1 2 5
3154 pm_nl_set_limits $ns2 1 5
3155 pm_nl_add_endpoint $ns1 10.0.2.1 flags signal
e571fb09
GT
3156 fullmesh=2 speed=slow \
3157 run_tests $ns1 $ns2 10.0.1.1
c7d49c03 3158 chk_join_nr 5 5 5
ae7bd9cc
MB
3159 chk_add_nr 1 1
3160 fi
4f49d633
GT
3161
3162 # fullmesh 4
3163 # 1 non-fullmesh addr in ns1, added before the connection,
3164 # 2 fullmesh addrs in ns2, added during the connection,
3165 # limit max_subflows to 4.
c7d49c03 3166 if reset "fullmesh test 1x2, limited"; then
ae7bd9cc
MB
3167 pm_nl_set_limits $ns1 2 4
3168 pm_nl_set_limits $ns2 1 4
3169 pm_nl_add_endpoint $ns1 10.0.2.1 flags signal
e571fb09
GT
3170 fullmesh=2 speed=slow \
3171 run_tests $ns1 $ns2 10.0.1.1
c7d49c03 3172 chk_join_nr 4 4 4
ae7bd9cc
MB
3173 chk_add_nr 1 1
3174 fi
6a0653b9
GT
3175
3176 # set fullmesh flag
9db34c42
MB
3177 if reset "set fullmesh flag test" &&
3178 continue_if mptcp_lib_kversion_ge 5.18; then
ae7bd9cc
MB
3179 pm_nl_set_limits $ns1 4 4
3180 pm_nl_add_endpoint $ns1 10.0.2.1 flags subflow
3181 pm_nl_set_limits $ns2 4 4
e571fb09
GT
3182 addr_nr_ns2=1 sflags=fullmesh speed=slow \
3183 run_tests $ns1 $ns2 10.0.1.1
c7d49c03 3184 chk_join_nr 2 2 2
ae7bd9cc
MB
3185 chk_rm_nr 0 1
3186 fi
6a0653b9
GT
3187
3188 # set nofullmesh flag
9db34c42
MB
3189 if reset "set nofullmesh flag test" &&
3190 continue_if mptcp_lib_kversion_ge 5.18; then
ae7bd9cc
MB
3191 pm_nl_set_limits $ns1 4 4
3192 pm_nl_add_endpoint $ns1 10.0.2.1 flags subflow,fullmesh
3193 pm_nl_set_limits $ns2 4 4
e571fb09
GT
3194 fullmesh=1 sflags=nofullmesh speed=slow \
3195 run_tests $ns1 $ns2 10.0.1.1
c7d49c03 3196 chk_join_nr 2 2 2
ae7bd9cc
MB
3197 chk_rm_nr 0 1
3198 fi
6a0653b9
GT
3199
3200 # set backup,fullmesh flags
9db34c42
MB
3201 if reset "set backup,fullmesh flags test" &&
3202 continue_if mptcp_lib_kversion_ge 5.18; then
ae7bd9cc
MB
3203 pm_nl_set_limits $ns1 4 4
3204 pm_nl_add_endpoint $ns1 10.0.2.1 flags subflow
3205 pm_nl_set_limits $ns2 4 4
e571fb09
GT
3206 addr_nr_ns2=1 sflags=backup,fullmesh speed=slow \
3207 run_tests $ns1 $ns2 10.0.1.1
c7d49c03 3208 chk_join_nr 2 2 2
ae7bd9cc
MB
3209 chk_prio_nr 0 1
3210 chk_rm_nr 0 1
3211 fi
6a0653b9
GT
3212
3213 # set nobackup,nofullmesh flags
9db34c42
MB
3214 if reset "set nobackup,nofullmesh flags test" &&
3215 continue_if mptcp_lib_kversion_ge 5.18; then
ae7bd9cc
MB
3216 pm_nl_set_limits $ns1 4 4
3217 pm_nl_set_limits $ns2 4 4
3218 pm_nl_add_endpoint $ns2 10.0.2.2 flags subflow,backup,fullmesh
e571fb09
GT
3219 sflags=nobackup,nofullmesh speed=slow \
3220 run_tests $ns1 $ns2 10.0.1.1
c7d49c03 3221 chk_join_nr 2 2 2
ae7bd9cc
MB
3222 chk_prio_nr 0 1
3223 chk_rm_nr 0 1
3224 fi
4f49d633
GT
3225}
3226
01542c9b
GT
3227fastclose_tests()
3228{
ae947bb2 3229 if reset_check_counter "fastclose test" "MPTcpExtMPFastcloseTx"; then
080b7f57 3230 test_linkfail=1024 fastclose=client \
595ef566 3231 run_tests $ns1 $ns2 10.0.1.1
c7d49c03 3232 chk_join_nr 0 0 0
ae7bd9cc
MB
3233 chk_fclose_nr 1 1
3234 chk_rst_nr 1 1 invert
3235 fi
6bf41020 3236
ae947bb2 3237 if reset_check_counter "fastclose server test" "MPTcpExtMPFastcloseRx"; then
080b7f57 3238 test_linkfail=1024 fastclose=server \
595ef566 3239 run_tests $ns1 $ns2 10.0.1.1
6bf41020
PA
3240 chk_join_nr 0 0 0
3241 chk_fclose_nr 1 1 invert
3242 chk_rst_nr 1 1
3243 fi
01542c9b
GT
3244}
3245
b6e074e1
GT
3246pedit_action_pkts()
3247{
3248 tc -n $ns2 -j -s action show action pedit index 100 | \
c43ce398 3249 grep "packets" | \
b6e074e1
GT
3250 sed 's/.*"packets":\([0-9]\+\),.*/\1/'
3251}
3252
3253fail_tests()
3254{
3255 # single subflow
3256 if reset_with_fail "Infinite map" 1; then
0c93af1f
GT
3257 test_linkfail=128 \
3258 run_tests $ns1 $ns2 10.0.1.1
b6e074e1 3259 chk_join_nr 0 0 0 +1 +0 1 0 1 "$(pedit_action_pkts)"
1f7d325f 3260 chk_fail_nr 1 -1 invert
b6e074e1 3261 fi
2ba18161
GT
3262
3263 # multiple subflows
3264 if reset_with_fail "MP_FAIL MP_RST" 2; then
3265 tc -n $ns2 qdisc add dev ns2eth1 root netem rate 1mbit delay 5
3266 pm_nl_set_limits $ns1 0 1
3267 pm_nl_set_limits $ns2 0 1
3268 pm_nl_add_endpoint $ns2 10.0.2.2 dev ns2eth2 flags subflow
0c93af1f
GT
3269 test_linkfail=1024 \
3270 run_tests $ns1 $ns2 10.0.1.1
2ba18161
GT
3271 chk_join_nr 1 1 1 1 0 1 1 0 "$(pedit_action_pkts)"
3272 fi
b6e074e1
GT
3273}
3274
4369c198
GT
3275userspace_pm_add_addr()
3276{
3277 local addr=$1
3278 local id=$2
3279 local tk
3280
3281 tk=$(grep "type:1," "$evts_ns1" |
3282 sed -n 's/.*\(token:\)\([[:digit:]]*\).*$/\2/p;q')
3283 ip netns exec $ns1 ./pm_nl_ctl ann $addr token $tk id $id
3284 sleep 1
3285}
3286
3287userspace_pm_rm_sf_addr_ns1()
3288{
3289 local addr=$1
3290 local id=$2
3291 local tk sp da dp
3292
3293 tk=$(grep "type:1," "$evts_ns1" |
3294 sed -n 's/.*\(token:\)\([[:digit:]]*\).*$/\2/p;q')
3295 sp=$(grep "type:10" "$evts_ns1" |
3296 sed -n 's/.*\(sport:\)\([[:digit:]]*\).*$/\2/p;q')
3297 da=$(grep "type:10" "$evts_ns1" |
3298 sed -n 's/.*\(daddr6:\)\([0-9a-f:.]*\).*$/\2/p;q')
3299 dp=$(grep "type:10" "$evts_ns1" |
3300 sed -n 's/.*\(dport:\)\([[:digit:]]*\).*$/\2/p;q')
3301 ip netns exec $ns1 ./pm_nl_ctl rem token $tk id $id
3302 ip netns exec $ns1 ./pm_nl_ctl dsf lip "::ffff:$addr" \
3303 lport $sp rip $da rport $dp token $tk
3304 wait_rm_addr $ns1 1
3305 wait_rm_sf $ns1 1
3306}
3307
3308userspace_pm_add_sf()
3309{
3310 local addr=$1
3311 local id=$2
3312 local tk da dp
3313
3314 tk=$(sed -n 's/.*\(token:\)\([[:digit:]]*\).*$/\2/p;q' "$evts_ns2")
3315 da=$(sed -n 's/.*\(daddr4:\)\([0-9.]*\).*$/\2/p;q' "$evts_ns2")
3316 dp=$(sed -n 's/.*\(dport:\)\([[:digit:]]*\).*$/\2/p;q' "$evts_ns2")
3317 ip netns exec $ns2 ./pm_nl_ctl csf lip $addr lid $id \
3318 rip $da rport $dp token $tk
3319 sleep 1
3320}
3321
3322userspace_pm_rm_sf_addr_ns2()
3323{
3324 local addr=$1
3325 local id=$2
3326 local tk da dp sp
3327
3328 tk=$(sed -n 's/.*\(token:\)\([[:digit:]]*\).*$/\2/p;q' "$evts_ns2")
3329 da=$(sed -n 's/.*\(daddr4:\)\([0-9.]*\).*$/\2/p;q' "$evts_ns2")
3330 dp=$(sed -n 's/.*\(dport:\)\([[:digit:]]*\).*$/\2/p;q' "$evts_ns2")
3331 sp=$(grep "type:10" "$evts_ns2" |
3332 sed -n 's/.*\(sport:\)\([[:digit:]]*\).*$/\2/p;q')
3333 ip netns exec $ns2 ./pm_nl_ctl rem token $tk id $id
3334 ip netns exec $ns2 ./pm_nl_ctl dsf lip $addr lport $sp \
3335 rip $da rport $dp token $tk
3336 wait_rm_addr $ns2 1
3337 wait_rm_sf $ns2 1
3338}
3339
5ac1d2d6
MM
3340userspace_tests()
3341{
3342 # userspace pm type prevents add_addr
f2b492b0
MB
3343 if reset "userspace pm type prevents add_addr" &&
3344 continue_if mptcp_lib_has_file '/proc/sys/net/mptcp/pm_type'; then
5ac1d2d6
MM
3345 set_userspace_pm $ns1
3346 pm_nl_set_limits $ns1 0 2
3347 pm_nl_set_limits $ns2 0 2
3348 pm_nl_add_endpoint $ns1 10.0.2.1 flags signal
3349 run_tests $ns1 $ns2 10.0.1.1
3350 chk_join_nr 0 0 0
3351 chk_add_nr 0 0
3352 fi
3353
b3b71bf9 3354 # userspace pm type does not echo add_addr without daemon
f2b492b0
MB
3355 if reset "userspace pm no echo w/o daemon" &&
3356 continue_if mptcp_lib_has_file '/proc/sys/net/mptcp/pm_type'; then
b3b71bf9
MM
3357 set_userspace_pm $ns2
3358 pm_nl_set_limits $ns1 0 2
3359 pm_nl_set_limits $ns2 0 2
3360 pm_nl_add_endpoint $ns1 10.0.2.1 flags signal
3361 run_tests $ns1 $ns2 10.0.1.1
3362 chk_join_nr 0 0 0
3363 chk_add_nr 1 0
3364 fi
3365
5ac1d2d6 3366 # userspace pm type rejects join
f2b492b0
MB
3367 if reset "userspace pm type rejects join" &&
3368 continue_if mptcp_lib_has_file '/proc/sys/net/mptcp/pm_type'; then
5ac1d2d6
MM
3369 set_userspace_pm $ns1
3370 pm_nl_set_limits $ns1 1 1
3371 pm_nl_set_limits $ns2 1 1
3372 pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow
3373 run_tests $ns1 $ns2 10.0.1.1
3374 chk_join_nr 1 1 0
3375 fi
3376
3377 # userspace pm type does not send join
f2b492b0
MB
3378 if reset "userspace pm type does not send join" &&
3379 continue_if mptcp_lib_has_file '/proc/sys/net/mptcp/pm_type'; then
5ac1d2d6
MM
3380 set_userspace_pm $ns2
3381 pm_nl_set_limits $ns1 1 1
3382 pm_nl_set_limits $ns2 1 1
3383 pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow
3384 run_tests $ns1 $ns2 10.0.1.1
3385 chk_join_nr 0 0 0
3386 fi
3387
3388 # userspace pm type prevents mp_prio
f2b492b0
MB
3389 if reset "userspace pm type prevents mp_prio" &&
3390 continue_if mptcp_lib_has_file '/proc/sys/net/mptcp/pm_type'; then
5ac1d2d6
MM
3391 set_userspace_pm $ns1
3392 pm_nl_set_limits $ns1 1 1
3393 pm_nl_set_limits $ns2 1 1
3394 pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow
e571fb09
GT
3395 sflags=backup speed=slow \
3396 run_tests $ns1 $ns2 10.0.1.1
5ac1d2d6
MM
3397 chk_join_nr 1 1 0
3398 chk_prio_nr 0 0
3399 fi
3400
3401 # userspace pm type prevents rm_addr
f2b492b0
MB
3402 if reset "userspace pm type prevents rm_addr" &&
3403 continue_if mptcp_lib_has_file '/proc/sys/net/mptcp/pm_type'; then
5ac1d2d6
MM
3404 set_userspace_pm $ns1
3405 set_userspace_pm $ns2
3406 pm_nl_set_limits $ns1 0 1
3407 pm_nl_set_limits $ns2 0 1
3408 pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow
e571fb09
GT
3409 addr_nr_ns2=-1 speed=slow \
3410 run_tests $ns1 $ns2 10.0.1.1
5ac1d2d6
MM
3411 chk_join_nr 0 0 0
3412 chk_rm_nr 0 0
3413 fi
97040cf9
GT
3414
3415 # userspace pm add & remove address
f2b492b0
MB
3416 if reset_with_events "userspace pm add & remove address" &&
3417 continue_if mptcp_lib_has_file '/proc/sys/net/mptcp/pm_type'; then
97040cf9
GT
3418 set_userspace_pm $ns1
3419 pm_nl_set_limits $ns2 1 1
e571fb09
GT
3420 speed=10 \
3421 run_tests $ns1 $ns2 10.0.1.1 &
4369c198
GT
3422 local tests_pid=$!
3423 wait_mpj $ns1
3424 userspace_pm_add_addr 10.0.2.1 10
97040cf9
GT
3425 chk_join_nr 1 1 1
3426 chk_add_nr 1 1
d7ced753
GT
3427 chk_mptcp_info subflows 1 subflows 1
3428 chk_mptcp_info add_addr_signal 1 add_addr_accepted 1
4369c198 3429 userspace_pm_rm_sf_addr_ns1 10.0.2.1 10
97040cf9 3430 chk_rm_nr 1 1 invert
d7ced753 3431 chk_mptcp_info subflows 0 subflows 0
a3735625 3432 kill_events_pids
4369c198 3433 wait $tests_pid
97040cf9 3434 fi
5e986ec4
GT
3435
3436 # userspace pm create destroy subflow
f2b492b0
MB
3437 if reset_with_events "userspace pm create destroy subflow" &&
3438 continue_if mptcp_lib_has_file '/proc/sys/net/mptcp/pm_type'; then
5e986ec4
GT
3439 set_userspace_pm $ns2
3440 pm_nl_set_limits $ns1 0 1
e571fb09
GT
3441 speed=10 \
3442 run_tests $ns1 $ns2 10.0.1.1 &
4369c198
GT
3443 local tests_pid=$!
3444 wait_mpj $ns2
3445 userspace_pm_add_sf 10.0.3.2 20
5e986ec4 3446 chk_join_nr 1 1 1
d7ced753 3447 chk_mptcp_info subflows 1 subflows 1
4369c198 3448 userspace_pm_rm_sf_addr_ns2 10.0.3.2 20
6c160b63 3449 chk_rm_nr 1 1
d7ced753 3450 chk_mptcp_info subflows 0 subflows 0
a3735625 3451 kill_events_pids
4369c198 3452 wait $tests_pid
5e986ec4 3453 fi
5ac1d2d6
MM
3454}
3455
e274f715 3456endpoint_tests()
69c6ce7b 3457{
36c4127a 3458 # subflow_rebuild_header is needed to support the implicit flag
69c6ce7b 3459 # userspace pm type prevents add_addr
36c4127a
MB
3460 if reset "implicit EP" &&
3461 mptcp_lib_kallsyms_has "subflow_rebuild_header$"; then
ae7bd9cc
MB
3462 pm_nl_set_limits $ns1 2 2
3463 pm_nl_set_limits $ns2 2 2
3464 pm_nl_add_endpoint $ns1 10.0.2.1 flags signal
e571fb09
GT
3465 speed=slow \
3466 run_tests $ns1 $ns2 10.0.1.1 2>/dev/null &
ae7bd9cc
MB
3467
3468 wait_mpj $ns1
03668c65 3469 pm_nl_check_endpoint "creation" \
ae7bd9cc 3470 $ns2 10.0.2.2 id 1 flags implicit
d7ced753
GT
3471 chk_mptcp_info subflows 1 subflows 1
3472 chk_mptcp_info add_addr_signal 1 add_addr_accepted 1
ae7bd9cc 3473
1dc88d24 3474 pm_nl_add_endpoint $ns2 10.0.2.2 id 33 2>/dev/null
03668c65 3475 pm_nl_check_endpoint "ID change is prevented" \
ae7bd9cc
MB
3476 $ns2 10.0.2.2 id 1 flags implicit
3477
3478 pm_nl_add_endpoint $ns2 10.0.2.2 flags signal
03668c65 3479 pm_nl_check_endpoint "modif is allowed" \
ae7bd9cc 3480 $ns2 10.0.2.2 id 1 flags signal
070d6daf 3481 kill_tests_wait
ae7bd9cc 3482 fi
e274f715 3483
36c4127a
MB
3484 if reset "delete and re-add" &&
3485 mptcp_lib_kallsyms_has "subflow_rebuild_header$"; then
e274f715
PA
3486 pm_nl_set_limits $ns1 1 1
3487 pm_nl_set_limits $ns2 1 1
3488 pm_nl_add_endpoint $ns2 10.0.2.2 id 2 dev ns2eth2 flags subflow
e571fb09
GT
3489 test_linkfail=4 speed=20 \
3490 run_tests $ns1 $ns2 10.0.1.1 2>/dev/null &
e274f715
PA
3491
3492 wait_mpj $ns2
03668c65 3493 chk_subflow_nr "before delete" 2
d7ced753 3494 chk_mptcp_info subflows 1 subflows 1
9095ce97 3495
e274f715
PA
3496 pm_nl_del_endpoint $ns2 2 10.0.2.2
3497 sleep 0.5
03668c65 3498 chk_subflow_nr "after delete" 1
d7ced753 3499 chk_mptcp_info subflows 0 subflows 0
e274f715
PA
3500
3501 pm_nl_add_endpoint $ns2 10.0.2.2 dev ns2eth2 flags subflow
3502 wait_mpj $ns2
03668c65 3503 chk_subflow_nr "after re-add" 2
d7ced753 3504 chk_mptcp_info subflows 1 subflows 1
070d6daf 3505 kill_tests_wait
e274f715 3506 fi
69c6ce7b
PA
3507}
3508
22514d52 3509# [$1: error message]
1002b89f
GT
3510usage()
3511{
22514d52
MB
3512 if [ -n "${1}" ]; then
3513 echo "${1}"
3514 ret=1
3515 fi
3516
1002b89f 3517 echo "mptcp_join usage:"
3afd0280
MB
3518
3519 local key
3520 for key in "${!all_tests[@]}"; do
3521 echo " -${key} ${all_tests[${key}]}"
3522 done
3523
a673321a 3524 echo " -c capture pcap files"
af66d3e1 3525 echo " -C enable data checksum"
621bd393 3526 echo " -i use ip mptcp"
1002b89f 3527 echo " -h help"
22514d52 3528
c7d49c03 3529 echo "[test ids|names]"
ae7bd9cc 3530
22514d52 3531 exit ${ret}
1002b89f
GT
3532}
3533
1002b89f 3534
3afd0280
MB
3535# Use a "simple" array to force an specific order we cannot have with an associative one
3536all_tests_sorted=(
3537 f@subflows_tests
3538 e@subflows_error_tests
3539 s@signal_address_tests
3540 l@link_failure_tests
3541 t@add_addr_timeout_tests
3542 r@remove_tests
3543 a@add_tests
3544 6@ipv6_tests
3545 4@v4mapped_tests
ad349374 3546 M@mixed_tests
3afd0280
MB
3547 b@backup_tests
3548 p@add_addr_ports_tests
3549 k@syncookies_tests
3550 S@checksum_tests
3551 d@deny_join_id0_tests
3552 m@fullmesh_tests
3553 z@fastclose_tests
b6e074e1 3554 F@fail_tests
5ac1d2d6 3555 u@userspace_tests
e274f715 3556 I@endpoint_tests
3afd0280
MB
3557)
3558
3559all_tests_args=""
3560all_tests_names=()
3561for subtests in "${all_tests_sorted[@]}"; do
3562 key="${subtests%@*}"
3563 value="${subtests#*@}"
3564
3565 all_tests_args+="${key}"
3566 all_tests_names+=("${value}")
3567 all_tests[${key}]="${value}"
3568done
3569
826d7bdc 3570tests=()
3afd0280 3571while getopts "${all_tests_args}cCih" opt; do
1002b89f 3572 case $opt in
3afd0280
MB
3573 ["${all_tests_args}"])
3574 tests+=("${all_tests[${opt}]}")
69c6ce7b 3575 ;;
a673321a 3576 c)
826d7bdc 3577 capture=1
a673321a 3578 ;;
af66d3e1 3579 C)
826d7bdc 3580 checksum=1
af66d3e1 3581 ;;
621bd393 3582 i)
826d7bdc 3583 ip_mptcp=1
621bd393 3584 ;;
22514d52 3585 h)
1002b89f
GT
3586 usage
3587 ;;
22514d52
MB
3588 *)
3589 usage "Unknown option: -${opt}"
3590 ;;
1002b89f
GT
3591 esac
3592done
00587187 3593
ae7bd9cc
MB
3594shift $((OPTIND - 1))
3595
3596for arg in "${@}"; do
3597 if [[ "${arg}" =~ ^[0-9]+$ ]]; then
c7d49c03 3598 only_tests_ids+=("${arg}")
ae7bd9cc 3599 else
c7d49c03 3600 only_tests_names+=("${arg}")
ae7bd9cc
MB
3601 fi
3602done
3603
826d7bdc 3604if [ ${#tests[@]} -eq 0 ]; then
3afd0280 3605 tests=("${all_tests_names[@]}")
826d7bdc
MB
3606fi
3607
3afd0280
MB
3608for subtests in "${tests[@]}"; do
3609 "${subtests}"
3610done
3611
39aab882
MB
3612if [ ${ret} -ne 0 ]; then
3613 echo
3614 echo "${#failed_tests[@]} failure(s) has(ve) been detected:"
3615 for i in $(get_failed_tests_ids); do
3616 echo -e "\t- ${i}: ${failed_tests[${i}]}"
3617 done
3618 echo
3619fi
3620
7f117cd3
MB
3621append_prev_results
3622mptcp_lib_result_print_all_tap
3623
b08fbf24 3624exit $ret