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