Commit | Line | Data |
---|---|---|
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 |
15 | ret=0 |
16 | sin="" | |
7d1e6f16 | 17 | sinfail="" |
b08fbf24 PA |
18 | sout="" |
19 | cin="" | |
7d1e6f16 | 20 | cinfail="" |
8b819a84 | 21 | cinsent="" |
d328fe87 | 22 | tmpfile="" |
b08fbf24 | 23 | cout="" |
38f027fc | 24 | err="" |
1e777bd8 MB |
25 | capout="" |
26 | ns1="" | |
27 | ns2="" | |
0c4cd3f8 MB |
28 | iptables="iptables" |
29 | ip6tables="ip6tables" | |
5888a61c MB |
30 | timeout_poll=30 |
31 | timeout_test=$((timeout_poll * 2 + 1)) | |
8c6f6b4b GT |
32 | capture=false |
33 | checksum=false | |
8117dac3 | 34 | check_invert=0 |
8c6f6b4b | 35 | validate_checksum=false |
93827ad5 | 36 | init=0 |
a3735625 GT |
37 | evts_ns1="" |
38 | evts_ns2="" | |
39 | evts_ns1_pid=0 | |
40 | evts_ns2_pid=0 | |
7f117cd3 MB |
41 | last_test_failed=0 |
42 | last_test_skipped=0 | |
43 | last_test_ignored=1 | |
b08fbf24 | 44 | |
3afd0280 | 45 | declare -A all_tests |
c7d49c03 MB |
46 | declare -a only_tests_ids |
47 | declare -a only_tests_names | |
39aab882 | 48 | declare -A failed_tests |
3382bb09 | 49 | MPTCP_LIB_TEST_FORMAT="%03u %s\n" |
c7d49c03 | 50 | TEST_NAME="" |
03668c65 | 51 | nr_blank=6 |
b08fbf24 | 52 | |
662aa22d GT |
53 | # These var are used only in some tests, make sure they are not already set |
54 | unset FAILING_LINKS | |
55 | unset test_linkfail | |
56 | unset addr_nr_ns1 | |
57 | unset addr_nr_ns2 | |
0bd962dd GT |
58 | unset cestab_ns1 |
59 | unset cestab_ns2 | |
662aa22d | 60 | unset sflags |
080b7f57 | 61 | unset fastclose |
4aadde08 | 62 | unset fullmesh |
e571fb09 | 63 | unset speed |
1b2965a8 MBN |
64 | unset join_csum_ns1 |
65 | unset join_csum_ns2 | |
66 | unset join_fail_nr | |
67 | unset join_rst_nr | |
68 | unset join_infi_nr | |
69 | unset join_corrupted_pkts | |
004125c2 MBN |
70 | unset join_syn_tx |
71 | unset join_create_err | |
72 | unset join_bind_err | |
73 | unset join_connect_err | |
e59300ce | 74 | |
8d014eaa GT |
75 | # generated using "nfbpf_compile '(ip && (ip[54] & 0xf0) == 0x30) || |
76 | # (ip6 && (ip6[74] & 0xf0) == 0x30)'" | |
77 | CBPF_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 | 93 | init_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 |
133 | init_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 |
142 | cleanup_partial() |
143 | { | |
144 | rm -f "$capout" | |
145 | ||
3a0f9bed | 146 | mptcp_lib_ns_exit "${ns1}" "${ns2}" |
b08fbf24 PA |
147 | } |
148 | ||
93827ad5 MB |
149 | init() { |
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 |
171 | cleanup() |
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 |
181 | print_check() |
182 | { | |
183 | printf "%-${nr_blank}s%-36s" " " "${*}" | |
184 | } | |
185 | ||
186 | print_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 | ||
194 | print_ok() | |
195 | { | |
747ba878 | 196 | mptcp_lib_pr_ok "${@}" |
03668c65 MB |
197 | } |
198 | ||
199 | print_fail() | |
200 | { | |
747ba878 | 201 | mptcp_lib_pr_fail "${@}" |
03668c65 MB |
202 | } |
203 | ||
204 | print_skip() | |
205 | { | |
747ba878 | 206 | mptcp_lib_pr_skip "${@}" |
cdb50525 MB |
207 | } |
208 | ||
ba8a6640 MBN |
209 | # $1: check name; $2: rc |
210 | print_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 ] |
226 | mark_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 | |
239 | continue_if() | |
240 | { | |
241 | if ! "${@}"; then | |
242 | mark_as_skipped | |
243 | return 1 | |
244 | fi | |
245 | } | |
246 | ||
ae7bd9cc MB |
247 | skip_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 |
268 | append_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 |
284 | reset() |
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 |
312 | reset_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 |
325 | reset_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 |
336 | reset_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 |
361 | reset_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 |
374 | reset_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 | 401 | setup_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 | ||
432 | reset_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 |
449 | start_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 |
455 | reset_with_events() |
456 | { | |
457 | reset "${1}" || return 1 | |
458 | ||
20ccc7c5 | 459 | start_events |
a3735625 GT |
460 | } |
461 | ||
4a0b866a MB |
462 | reset_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 |
483 | fail_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 | ||
501 | get_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 |
510 | check_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 | ||
552 | do_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 |
563 | link_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 |
579 | rm_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 | |
585 | wait_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 |
599 | rm_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 | |
605 | wait_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 |
619 | wait_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 |
634 | kill_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 |
642 | pm_nl_set_limits() |
643 | { | |
441c6be9 | 644 | mptcp_lib_pm_nl_set_limits "${@}" |
34aa6e3b GT |
645 | } |
646 | ||
647 | pm_nl_add_endpoint() | |
648 | { | |
441c6be9 | 649 | mptcp_lib_pm_nl_add_endpoint "${@}" |
34aa6e3b GT |
650 | } |
651 | ||
652 | pm_nl_del_endpoint() | |
653 | { | |
441c6be9 | 654 | mptcp_lib_pm_nl_del_endpoint "${@}" |
34aa6e3b GT |
655 | } |
656 | ||
657 | pm_nl_flush_endpoint() | |
658 | { | |
441c6be9 | 659 | mptcp_lib_pm_nl_flush_endpoint "${@}" |
34aa6e3b GT |
660 | } |
661 | ||
dda61b3d GT |
662 | pm_nl_show_endpoints() |
663 | { | |
441c6be9 | 664 | mptcp_lib_pm_nl_show_endpoints "${@}" |
dda61b3d GT |
665 | } |
666 | ||
f0140386 GT |
667 | pm_nl_change_endpoint() |
668 | { | |
441c6be9 | 669 | mptcp_lib_pm_nl_change_endpoint "${@}" |
f0140386 GT |
670 | } |
671 | ||
69c6ce7b PA |
672 | pm_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 | 705 | pm_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 |
862 | chk_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 | |
880 | check_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 |
890 | do_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 | ||
1055 | make_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 | ||
1066 | run_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 |
1118 | dump_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 |
1126 | chk_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 |
1175 | chk_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 |
1236 | chk_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 |
1275 | chk_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 |
1318 | chk_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 |
1345 | chk_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 |
1393 | chk_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. | |
1463 | chk_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 |
1497 | chk_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 |
1614 | chk_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 |
1646 | chk_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 |
1714 | chk_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 |
1729 | chk_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 |
1778 | chk_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 |
1804 | chk_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. | |
1837 | chk_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 |
1871 | chk_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 | 1893 | wait_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 |
1911 | set_userspace_pm() |
1912 | { | |
1913 | local ns=$1 | |
1914 | ||
1915 | ip netns exec $ns sysctl -q net.mptcp.pm_type=1 | |
1916 | } | |
1917 | ||
1002b89f GT |
1918 | subflows_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 |
1982 | subflows_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 |
2046 | signal_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 | ||
2165 | link_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 | ||
2252 | add_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 | ||
2303 | remove_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 | ||
2497 | add_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 | ||
2552 | ipv6_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 | ||
2610 | v4mapped_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 |
2697 | mixed_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 |
2746 | backup_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 |
2847 | verify_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 |
2876 | add_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 | ||
2968 | syncookies_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 |
3033 | checksum_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 |
3047 | deny_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 |
3110 | fullmesh_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 |
3220 | fastclose_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 |
3242 | pedit_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 | ||
3248 | fail_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 |
3279 | userspace_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 |
3292 | userspace_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 |
3307 | userspace_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 |
3323 | userspace_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 |
3345 | check_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 | |
3363 | userspace_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 |
3375 | userspace_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 |
3386 | userspace_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 |
3401 | userspace_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 |
3417 | chk_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 |
3446 | userspace_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 | 3654 | endpoint_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 |
3866 | usage() |
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 |
3892 | all_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 | ||
3915 | all_tests_args="" | |
3916 | all_tests_names=() | |
3917 | for 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}" | |
3924 | done | |
3925 | ||
826d7bdc | 3926 | tests=() |
3afd0280 | 3927 | while 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 |
3948 | done | |
00587187 | 3949 | |
ae7bd9cc MB |
3950 | shift $((OPTIND - 1)) |
3951 | ||
3952 | for 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 |
3958 | done | |
3959 | ||
826d7bdc | 3960 | if [ ${#tests[@]} -eq 0 ]; then |
3afd0280 | 3961 | tests=("${all_tests_names[@]}") |
826d7bdc MB |
3962 | fi |
3963 | ||
d4e19272 | 3964 | mptcp_lib_subtests_last_ts_reset |
3afd0280 MB |
3965 | for subtests in "${tests[@]}"; do |
3966 | "${subtests}" | |
3967 | done | |
d4e19272 | 3968 | append_prev_results |
3afd0280 | 3969 | |
39aab882 MB |
3970 | if [ ${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 | |
3977 | fi | |
3978 | ||
7f117cd3 MB |
3979 | mptcp_lib_result_print_all_tap |
3980 | ||
b08fbf24 | 3981 | exit $ret |