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