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