Commit | Line | Data |
---|---|---|
b08fbf24 PA |
1 | #!/bin/bash |
2 | # SPDX-License-Identifier: GPL-2.0 | |
3 | ||
4 | ret=0 | |
5 | sin="" | |
7d1e6f16 | 6 | sinfail="" |
b08fbf24 PA |
7 | sout="" |
8 | cin="" | |
7d1e6f16 | 9 | cinfail="" |
8b819a84 | 10 | cinsent="" |
b08fbf24 PA |
11 | cout="" |
12 | ksft_skip=4 | |
5888a61c MB |
13 | timeout_poll=30 |
14 | timeout_test=$((timeout_poll * 2 + 1)) | |
dd72b0fe | 15 | mptcp_connect="" |
b08fbf24 | 16 | capture=0 |
af66d3e1 | 17 | checksum=0 |
34aa6e3b | 18 | ip_mptcp=0 |
a673321a | 19 | do_all_tests=1 |
b08fbf24 PA |
20 | |
21 | TEST_COUNT=0 | |
22 | ||
8d014eaa GT |
23 | # generated using "nfbpf_compile '(ip && (ip[54] & 0xf0) == 0x30) || |
24 | # (ip6 && (ip6[74] & 0xf0) == 0x30)'" | |
25 | CBPF_MPTCP_SUBOPTION_ADD_ADDR="14, | |
26 | 48 0 0 0, | |
27 | 84 0 0 240, | |
28 | 21 0 3 64, | |
29 | 48 0 0 54, | |
30 | 84 0 0 240, | |
31 | 21 6 7 48, | |
32 | 48 0 0 0, | |
33 | 84 0 0 240, | |
34 | 21 0 4 96, | |
35 | 48 0 0 74, | |
36 | 84 0 0 240, | |
37 | 21 0 1 48, | |
38 | 6 0 0 65535, | |
39 | 6 0 0 0" | |
40 | ||
b08fbf24 PA |
41 | init() |
42 | { | |
43 | capout=$(mktemp) | |
44 | ||
45 | rndh=$(printf %x $sec)-$(mktemp -u XXXXXX) | |
46 | ||
47 | ns1="ns1-$rndh" | |
48 | ns2="ns2-$rndh" | |
49 | ||
50 | for netns in "$ns1" "$ns2";do | |
51 | ip netns add $netns || exit $ksft_skip | |
52 | ip -net $netns link set lo up | |
53 | ip netns exec $netns sysctl -q net.mptcp.enabled=1 | |
54 | ip netns exec $netns sysctl -q net.ipv4.conf.all.rp_filter=0 | |
55 | ip netns exec $netns sysctl -q net.ipv4.conf.default.rp_filter=0 | |
af66d3e1 GT |
56 | if [ $checksum -eq 1 ]; then |
57 | ip netns exec $netns sysctl -q net.mptcp.checksum_enabled=1 | |
58 | fi | |
b08fbf24 PA |
59 | done |
60 | ||
61 | # ns1 ns2 | |
62 | # ns1eth1 ns2eth1 | |
63 | # ns1eth2 ns2eth2 | |
64 | # ns1eth3 ns2eth3 | |
65 | # ns1eth4 ns2eth4 | |
66 | ||
67 | for i in `seq 1 4`; do | |
68 | ip link add ns1eth$i netns "$ns1" type veth peer name ns2eth$i netns "$ns2" | |
69 | ip -net "$ns1" addr add 10.0.$i.1/24 dev ns1eth$i | |
70 | ip -net "$ns1" addr add dead:beef:$i::1/64 dev ns1eth$i nodad | |
71 | ip -net "$ns1" link set ns1eth$i up | |
72 | ||
73 | ip -net "$ns2" addr add 10.0.$i.2/24 dev ns2eth$i | |
74 | ip -net "$ns2" addr add dead:beef:$i::2/64 dev ns2eth$i nodad | |
75 | ip -net "$ns2" link set ns2eth$i up | |
76 | ||
77 | # let $ns2 reach any $ns1 address from any interface | |
78 | ip -net "$ns2" route add default via 10.0.$i.1 dev ns2eth$i metric 10$i | |
9846921d | 79 | ip -net "$ns2" route add default via dead:beef:$i::1 dev ns2eth$i metric 10$i |
b08fbf24 PA |
80 | done |
81 | } | |
82 | ||
7d1e6f16 PA |
83 | init_shapers() |
84 | { | |
85 | for i in `seq 1 4`; do | |
86 | tc -n $ns1 qdisc add dev ns1eth$i root netem rate 20mbit delay 1 | |
87 | tc -n $ns2 qdisc add dev ns2eth$i root netem rate 20mbit delay 1 | |
88 | done | |
89 | } | |
90 | ||
b08fbf24 PA |
91 | cleanup_partial() |
92 | { | |
93 | rm -f "$capout" | |
94 | ||
95 | for netns in "$ns1" "$ns2"; do | |
96 | ip netns del $netns | |
c2a55e8f | 97 | rm -f /tmp/$netns.{nstat,out} |
b08fbf24 PA |
98 | done |
99 | } | |
100 | ||
101 | cleanup() | |
102 | { | |
7d1e6f16 PA |
103 | rm -f "$cin" "$cout" "$sinfail" |
104 | rm -f "$sin" "$sout" "$cinsent" "$cinfail" | |
b08fbf24 PA |
105 | cleanup_partial |
106 | } | |
107 | ||
108 | reset() | |
109 | { | |
110 | cleanup_partial | |
111 | init | |
112 | } | |
113 | ||
00587187 FW |
114 | reset_with_cookies() |
115 | { | |
116 | reset | |
117 | ||
118 | for netns in "$ns1" "$ns2";do | |
119 | ip netns exec $netns sysctl -q net.ipv4.tcp_syncookies=2 | |
120 | done | |
121 | } | |
122 | ||
8d014eaa GT |
123 | reset_with_add_addr_timeout() |
124 | { | |
125 | local ip="${1:-4}" | |
126 | local tables | |
127 | ||
128 | tables="iptables" | |
129 | if [ $ip -eq 6 ]; then | |
130 | tables="ip6tables" | |
131 | fi | |
132 | ||
133 | reset | |
134 | ||
135 | ip netns exec $ns1 sysctl -q net.mptcp.add_addr_timeout=1 | |
136 | ip netns exec $ns2 $tables -A OUTPUT -p tcp \ | |
137 | -m tcp --tcp-option 30 \ | |
138 | -m bpf --bytecode \ | |
139 | "$CBPF_MPTCP_SUBOPTION_ADD_ADDR" \ | |
140 | -j DROP | |
141 | } | |
142 | ||
af66d3e1 GT |
143 | reset_with_checksum() |
144 | { | |
145 | local ns1_enable=$1 | |
146 | local ns2_enable=$2 | |
147 | ||
148 | reset | |
149 | ||
150 | ip netns exec $ns1 sysctl -q net.mptcp.checksum_enabled=$ns1_enable | |
151 | ip netns exec $ns2 sysctl -q net.mptcp.checksum_enabled=$ns2_enable | |
152 | } | |
153 | ||
0cddb4a6 GT |
154 | reset_with_allow_join_id0() |
155 | { | |
156 | local ns1_enable=$1 | |
157 | local ns2_enable=$2 | |
158 | ||
159 | reset | |
160 | ||
161 | ip netns exec $ns1 sysctl -q net.mptcp.allow_join_initial_addr_port=$ns1_enable | |
162 | ip netns exec $ns2 sysctl -q net.mptcp.allow_join_initial_addr_port=$ns2_enable | |
163 | } | |
164 | ||
b08fbf24 PA |
165 | ip -Version > /dev/null 2>&1 |
166 | if [ $? -ne 0 ];then | |
167 | echo "SKIP: Could not run test without ip tool" | |
168 | exit $ksft_skip | |
169 | fi | |
170 | ||
8d014eaa GT |
171 | iptables -V > /dev/null 2>&1 |
172 | if [ $? -ne 0 ];then | |
173 | echo "SKIP: Could not run all tests without iptables tool" | |
174 | exit $ksft_skip | |
175 | fi | |
176 | ||
177 | ip6tables -V > /dev/null 2>&1 | |
178 | if [ $? -ne 0 ];then | |
179 | echo "SKIP: Could not run all tests without ip6tables tool" | |
180 | exit $ksft_skip | |
181 | fi | |
b08fbf24 | 182 | |
8b819a84 FW |
183 | print_file_err() |
184 | { | |
185 | ls -l "$1" 1>&2 | |
186 | echo "Trailing bytes are: " | |
187 | tail -c 27 "$1" | |
188 | } | |
189 | ||
b08fbf24 PA |
190 | check_transfer() |
191 | { | |
192 | in=$1 | |
193 | out=$2 | |
194 | what=$3 | |
195 | ||
196 | cmp "$in" "$out" > /dev/null 2>&1 | |
197 | if [ $? -ne 0 ] ;then | |
198 | echo "[ FAIL ] $what does not match (in, out):" | |
199 | print_file_err "$in" | |
200 | print_file_err "$out" | |
8b819a84 | 201 | ret=1 |
b08fbf24 PA |
202 | |
203 | return 1 | |
204 | fi | |
205 | ||
206 | return 0 | |
207 | } | |
208 | ||
209 | do_ping() | |
210 | { | |
211 | listener_ns="$1" | |
212 | connector_ns="$2" | |
213 | connect_addr="$3" | |
214 | ||
215 | ip netns exec ${connector_ns} ping -q -c 1 $connect_addr >/dev/null | |
216 | if [ $? -ne 0 ] ; then | |
217 | echo "$listener_ns -> $connect_addr connectivity [ FAIL ]" 1>&2 | |
218 | ret=1 | |
219 | fi | |
220 | } | |
221 | ||
8b819a84 FW |
222 | link_failure() |
223 | { | |
224 | ns="$1" | |
225 | ||
7d1e6f16 PA |
226 | if [ -z "$FAILING_LINKS" ]; then |
227 | l=$((RANDOM%4)) | |
228 | FAILING_LINKS=$((l+1)) | |
229 | fi | |
8b819a84 | 230 | |
7d1e6f16 PA |
231 | for l in $FAILING_LINKS; do |
232 | veth="ns1eth$l" | |
233 | ip -net "$ns" link set "$veth" down | |
234 | done | |
8b819a84 FW |
235 | } |
236 | ||
523514ed GT |
237 | # $1: IP address |
238 | is_v6() | |
239 | { | |
240 | [ -z "${1##*:*}" ] | |
241 | } | |
242 | ||
33397b83 GT |
243 | is_addr() |
244 | { | |
245 | [ -z "${1##*[.:]*}" ] | |
246 | } | |
247 | ||
248 | is_number() | |
249 | { | |
250 | [[ $1 == ?(-)+([0-9]) ]] | |
251 | } | |
252 | ||
327b9a94 PA |
253 | # $1: ns, $2: port |
254 | wait_local_port_listen() | |
255 | { | |
256 | local listener_ns="${1}" | |
257 | local port="${2}" | |
258 | ||
259 | local port_hex i | |
260 | ||
261 | port_hex="$(printf "%04X" "${port}")" | |
262 | for i in $(seq 10); do | |
263 | ip netns exec "${listener_ns}" cat /proc/net/tcp* | \ | |
264 | awk "BEGIN {rc=1} {if (\$2 ~ /:${port_hex}\$/ && \$4 ~ /0A/) {rc=0; exit}} END {exit rc}" && | |
265 | break | |
266 | sleep 0.1 | |
267 | done | |
268 | } | |
269 | ||
270 | rm_addr_count() | |
271 | { | |
272 | ns=${1} | |
273 | ||
274 | ip netns exec ${ns} nstat -as | grep MPTcpExtRmAddr | awk '{print $2}' | |
275 | } | |
276 | ||
277 | # $1: ns, $2: old rm_addr counter in $ns | |
278 | wait_rm_addr() | |
279 | { | |
280 | local ns="${1}" | |
281 | local old_cnt="${2}" | |
282 | local cnt | |
283 | local i | |
284 | ||
285 | for i in $(seq 10); do | |
286 | cnt=$(rm_addr_count ${ns}) | |
287 | [ "$cnt" = "${old_cnt}" ] || break | |
288 | sleep 0.1 | |
289 | done | |
290 | } | |
291 | ||
34aa6e3b GT |
292 | pm_nl_set_limits() |
293 | { | |
294 | local ns=$1 | |
295 | local addrs=$2 | |
296 | local subflows=$3 | |
297 | ||
298 | if [ $ip_mptcp -eq 1 ]; then | |
299 | ip -n $ns mptcp limits set add_addr_accepted $addrs subflows $subflows | |
300 | else | |
301 | ip netns exec $ns ./pm_nl_ctl limits $addrs $subflows | |
302 | fi | |
303 | } | |
304 | ||
305 | pm_nl_add_endpoint() | |
306 | { | |
307 | local ns=$1 | |
308 | local addr=$2 | |
309 | local flags | |
310 | local port | |
311 | local dev | |
312 | local id | |
313 | local nr=2 | |
314 | ||
315 | for p in $@ | |
316 | do | |
317 | if [ $p = "flags" ]; then | |
318 | eval _flags=\$"$nr" | |
319 | [ ! -z $_flags ]; flags="flags $_flags" | |
320 | fi | |
321 | if [ $p = "dev" ]; then | |
322 | eval _dev=\$"$nr" | |
323 | [ ! -z $_dev ]; dev="dev $_dev" | |
324 | fi | |
325 | if [ $p = "id" ]; then | |
326 | eval _id=\$"$nr" | |
327 | [ ! -z $_id ]; id="id $_id" | |
328 | fi | |
329 | if [ $p = "port" ]; then | |
330 | eval _port=\$"$nr" | |
331 | [ ! -z $_port ]; port="port $_port" | |
332 | fi | |
333 | ||
334 | let nr+=1 | |
335 | done | |
336 | ||
337 | if [ $ip_mptcp -eq 1 ]; then | |
338 | ip -n $ns mptcp endpoint add $addr ${_flags//","/" "} $dev $id $port | |
339 | else | |
340 | ip netns exec $ns ./pm_nl_ctl add $addr $flags $dev $id $port | |
341 | fi | |
342 | } | |
343 | ||
344 | pm_nl_del_endpoint() | |
345 | { | |
346 | local ns=$1 | |
347 | local id=$2 | |
348 | local addr=$3 | |
349 | ||
350 | if [ $ip_mptcp -eq 1 ]; then | |
351 | ip -n $ns mptcp endpoint delete id $id $addr | |
352 | else | |
353 | ip netns exec $ns ./pm_nl_ctl del $id $addr | |
354 | fi | |
355 | } | |
356 | ||
357 | pm_nl_flush_endpoint() | |
358 | { | |
359 | local ns=$1 | |
360 | ||
361 | if [ $ip_mptcp -eq 1 ]; then | |
362 | ip -n $ns mptcp endpoint flush | |
363 | else | |
364 | ip netns exec $ns ./pm_nl_ctl flush | |
365 | fi | |
366 | } | |
367 | ||
dda61b3d GT |
368 | pm_nl_show_endpoints() |
369 | { | |
370 | local ns=$1 | |
371 | ||
372 | if [ $ip_mptcp -eq 1 ]; then | |
373 | ip -n $ns mptcp endpoint show | |
374 | else | |
375 | ip netns exec $ns ./pm_nl_ctl dump | |
376 | fi | |
377 | } | |
378 | ||
f0140386 GT |
379 | pm_nl_change_endpoint() |
380 | { | |
381 | local ns=$1 | |
382 | local flags=$2 | |
383 | local id=$3 | |
384 | local addr=$4 | |
385 | local port="" | |
386 | ||
387 | if [ $ip_mptcp -eq 1 ]; then | |
388 | ip -n $ns mptcp endpoint change id $id ${flags//","/" "} | |
389 | else | |
390 | if [ $5 -ne 0 ]; then port="port $5"; fi | |
391 | ip netns exec $ns ./pm_nl_ctl set $addr flags $flags $port | |
392 | fi | |
393 | } | |
394 | ||
b08fbf24 PA |
395 | do_transfer() |
396 | { | |
397 | listener_ns="$1" | |
398 | connector_ns="$2" | |
399 | cl_proto="$3" | |
400 | srv_proto="$4" | |
401 | connect_addr="$5" | |
8b819a84 | 402 | test_link_fail="$6" |
2e8cbf45 GT |
403 | addr_nr_ns1="$7" |
404 | addr_nr_ns2="$8" | |
8b819a84 | 405 | speed="$9" |
6a0653b9 | 406 | sflags="${10}" |
b08fbf24 PA |
407 | |
408 | port=$((10000+$TEST_COUNT)) | |
409 | TEST_COUNT=$((TEST_COUNT+1)) | |
410 | ||
411 | :> "$cout" | |
412 | :> "$sout" | |
413 | :> "$capout" | |
414 | ||
415 | if [ $capture -eq 1 ]; then | |
416 | if [ -z $SUDO_USER ] ; then | |
417 | capuser="" | |
418 | else | |
419 | capuser="-Z $SUDO_USER" | |
420 | fi | |
421 | ||
00587187 | 422 | capfile=$(printf "mp_join-%02u-%s.pcap" "$TEST_COUNT" "${listener_ns}") |
b08fbf24 PA |
423 | |
424 | echo "Capturing traffic for test $TEST_COUNT into $capfile" | |
425 | ip netns exec ${listener_ns} tcpdump -i any -s 65535 -B 32768 $capuser -w $capfile > "$capout" 2>&1 & | |
426 | cappid=$! | |
427 | ||
428 | sleep 1 | |
429 | fi | |
430 | ||
c2a55e8f MB |
431 | NSTAT_HISTORY=/tmp/${listener_ns}.nstat ip netns exec ${listener_ns} \ |
432 | nstat -n | |
433 | NSTAT_HISTORY=/tmp/${connector_ns}.nstat ip netns exec ${connector_ns} \ | |
434 | nstat -n | |
435 | ||
8d014eaa | 436 | if [ $speed = "fast" ]; then |
dd72b0fe | 437 | mptcp_connect="./mptcp_connect -j" |
8da6229b GT |
438 | elif [ $speed = "slow" ]; then |
439 | mptcp_connect="./mptcp_connect -r 50" | |
440 | elif [ $speed = "least" ]; then | |
441 | mptcp_connect="./mptcp_connect -r 10" | |
dd72b0fe GT |
442 | fi |
443 | ||
523514ed GT |
444 | local local_addr |
445 | if is_v6 "${connect_addr}"; then | |
446 | local_addr="::" | |
447 | else | |
448 | local_addr="0.0.0.0" | |
449 | fi | |
450 | ||
7d1e6f16 PA |
451 | if [ "$test_link_fail" -eq 2 ];then |
452 | timeout ${timeout_test} \ | |
453 | ip netns exec ${listener_ns} \ | |
7c909a98 | 454 | $mptcp_connect -t ${timeout_poll} -l -p $port -s ${srv_proto} \ |
7d1e6f16 PA |
455 | ${local_addr} < "$sinfail" > "$sout" & |
456 | else | |
457 | timeout ${timeout_test} \ | |
458 | ip netns exec ${listener_ns} \ | |
459 | $mptcp_connect -t ${timeout_poll} -l -p $port -s ${srv_proto} \ | |
460 | ${local_addr} < "$sin" > "$sout" & | |
461 | fi | |
b08fbf24 PA |
462 | spid=$! |
463 | ||
327b9a94 | 464 | wait_local_port_listen "${listener_ns}" "${port}" |
b08fbf24 | 465 | |
8b819a84 | 466 | if [ "$test_link_fail" -eq 0 ];then |
5888a61c MB |
467 | timeout ${timeout_test} \ |
468 | ip netns exec ${connector_ns} \ | |
469 | $mptcp_connect -t ${timeout_poll} -p $port -s ${cl_proto} \ | |
470 | $connect_addr < "$cin" > "$cout" & | |
8b819a84 | 471 | else |
7d1e6f16 | 472 | ( cat "$cinfail" ; sleep 2; link_failure $listener_ns ; cat "$cinfail" ) | \ |
5888a61c MB |
473 | tee "$cinsent" | \ |
474 | timeout ${timeout_test} \ | |
475 | ip netns exec ${connector_ns} \ | |
476 | $mptcp_connect -t ${timeout_poll} -p $port -s ${cl_proto} \ | |
477 | $connect_addr > "$cout" & | |
8b819a84 | 478 | fi |
b08fbf24 PA |
479 | cpid=$! |
480 | ||
327b9a94 PA |
481 | # let the mptcp subflow be established in background before |
482 | # do endpoint manipulation | |
483 | [ $addr_nr_ns1 = "0" -a $addr_nr_ns2 = "0" ] || sleep 1 | |
484 | ||
6208fd82 GT |
485 | if [ $addr_nr_ns1 -gt 0 ]; then |
486 | let add_nr_ns1=addr_nr_ns1 | |
487 | counter=2 | |
6208fd82 GT |
488 | while [ $add_nr_ns1 -gt 0 ]; do |
489 | local addr | |
490 | if is_v6 "${connect_addr}"; then | |
491 | addr="dead:beef:$counter::1" | |
492 | else | |
493 | addr="10.0.$counter.1" | |
494 | fi | |
34aa6e3b | 495 | pm_nl_add_endpoint $ns1 $addr flags signal |
6208fd82 GT |
496 | let counter+=1 |
497 | let add_nr_ns1-=1 | |
498 | done | |
6208fd82 | 499 | elif [ $addr_nr_ns1 -lt 0 ]; then |
2e8cbf45 | 500 | let rm_nr_ns1=-addr_nr_ns1 |
6fe4ccdc | 501 | if [ $rm_nr_ns1 -lt 8 ]; then |
dda61b3d GT |
502 | counter=0 |
503 | pm_nl_show_endpoints ${listener_ns} | while read line; do | |
504 | local arr=($line) | |
505 | local nr=0 | |
506 | ||
507 | for i in ${arr[@]}; do | |
508 | if [ $i = "id" ]; then | |
509 | if [ $counter -eq $rm_nr_ns1 ]; then | |
510 | break | |
511 | fi | |
512 | id=${arr[$nr+1]} | |
513 | rm_addr=$(rm_addr_count ${connector_ns}) | |
514 | pm_nl_del_endpoint ${listener_ns} $id | |
515 | wait_rm_addr ${connector_ns} ${rm_addr} | |
516 | let counter+=1 | |
517 | fi | |
518 | let nr+=1 | |
f87744ad | 519 | done |
dda61b3d | 520 | done |
5e287fe7 | 521 | elif [ $rm_nr_ns1 -eq 8 ]; then |
34aa6e3b | 522 | pm_nl_flush_endpoint ${listener_ns} |
5e287fe7 | 523 | elif [ $rm_nr_ns1 -eq 9 ]; then |
34aa6e3b | 524 | pm_nl_del_endpoint ${listener_ns} 0 ${connect_addr} |
6fe4ccdc | 525 | fi |
dd72b0fe GT |
526 | fi |
527 | ||
4f49d633 GT |
528 | flags="subflow" |
529 | if [[ "${addr_nr_ns2}" = "fullmesh_"* ]]; then | |
530 | flags="${flags},fullmesh" | |
531 | addr_nr_ns2=${addr_nr_ns2:9} | |
532 | fi | |
533 | ||
327b9a94 PA |
534 | # if newly added endpoints must be deleted, give the background msk |
535 | # some time to created them | |
536 | [ $addr_nr_ns1 -gt 0 -a $addr_nr_ns2 -lt 0 ] && sleep 1 | |
537 | ||
6208fd82 GT |
538 | if [ $addr_nr_ns2 -gt 0 ]; then |
539 | let add_nr_ns2=addr_nr_ns2 | |
540 | counter=3 | |
6208fd82 GT |
541 | while [ $add_nr_ns2 -gt 0 ]; do |
542 | local addr | |
543 | if is_v6 "${connect_addr}"; then | |
544 | addr="dead:beef:$counter::2" | |
545 | else | |
546 | addr="10.0.$counter.2" | |
547 | fi | |
34aa6e3b | 548 | pm_nl_add_endpoint $ns2 $addr flags $flags |
6208fd82 GT |
549 | let counter+=1 |
550 | let add_nr_ns2-=1 | |
551 | done | |
6208fd82 | 552 | elif [ $addr_nr_ns2 -lt 0 ]; then |
2e8cbf45 | 553 | let rm_nr_ns2=-addr_nr_ns2 |
6fe4ccdc | 554 | if [ $rm_nr_ns2 -lt 8 ]; then |
dda61b3d GT |
555 | counter=0 |
556 | pm_nl_show_endpoints ${connector_ns} | while read line; do | |
557 | local arr=($line) | |
558 | local nr=0 | |
559 | ||
560 | for i in ${arr[@]}; do | |
561 | if [ $i = "id" ]; then | |
562 | if [ $counter -eq $rm_nr_ns2 ]; then | |
563 | break | |
564 | fi | |
565 | # rm_addr are serialized, allow the previous one to | |
566 | # complete | |
567 | id=${arr[$nr+1]} | |
568 | rm_addr=$(rm_addr_count ${listener_ns}) | |
569 | pm_nl_del_endpoint ${connector_ns} $id | |
570 | wait_rm_addr ${listener_ns} ${rm_addr} | |
571 | let counter+=1 | |
572 | fi | |
573 | let nr+=1 | |
f87744ad | 574 | done |
dda61b3d | 575 | done |
5e287fe7 | 576 | elif [ $rm_nr_ns2 -eq 8 ]; then |
34aa6e3b | 577 | pm_nl_flush_endpoint ${connector_ns} |
5e287fe7 GT |
578 | elif [ $rm_nr_ns2 -eq 9 ]; then |
579 | local addr | |
580 | if is_v6 "${connect_addr}"; then | |
581 | addr="dead:beef:1::2" | |
582 | else | |
583 | addr="10.0.1.2" | |
584 | fi | |
34aa6e3b | 585 | pm_nl_del_endpoint ${connector_ns} 0 $addr |
6fe4ccdc | 586 | fi |
dd72b0fe GT |
587 | fi |
588 | ||
6a0653b9 | 589 | if [ ! -z $sflags ]; then |
718eb44e GT |
590 | sleep 1 |
591 | for netns in "$ns1" "$ns2"; do | |
dda61b3d | 592 | pm_nl_show_endpoints $netns | while read line; do |
33397b83 GT |
593 | local arr=($line) |
594 | local addr | |
595 | local port=0 | |
f0140386 | 596 | local id |
33397b83 GT |
597 | |
598 | for i in ${arr[@]}; do | |
599 | if is_addr $i; then | |
600 | addr=$i | |
601 | elif is_number $i; then | |
602 | # The minimum expected port number is 10000 | |
603 | if [ $i -gt 10000 ]; then | |
604 | port=$i | |
f0140386 GT |
605 | # The maximum id number is 255 |
606 | elif [ $i -lt 255 ]; then | |
607 | id=$i | |
33397b83 GT |
608 | fi |
609 | fi | |
610 | done | |
f0140386 | 611 | pm_nl_change_endpoint $netns $sflags $id $addr $port |
33397b83 | 612 | done |
718eb44e GT |
613 | done |
614 | fi | |
615 | ||
b08fbf24 PA |
616 | wait $cpid |
617 | retc=$? | |
618 | wait $spid | |
619 | rets=$? | |
620 | ||
621 | if [ $capture -eq 1 ]; then | |
622 | sleep 1 | |
623 | kill $cappid | |
624 | fi | |
625 | ||
c2a55e8f MB |
626 | NSTAT_HISTORY=/tmp/${listener_ns}.nstat ip netns exec ${listener_ns} \ |
627 | nstat | grep Tcp > /tmp/${listener_ns}.out | |
628 | NSTAT_HISTORY=/tmp/${connector_ns}.nstat ip netns exec ${connector_ns} \ | |
629 | nstat | grep Tcp > /tmp/${connector_ns}.out | |
630 | ||
b08fbf24 PA |
631 | if [ ${rets} -ne 0 ] || [ ${retc} -ne 0 ]; then |
632 | echo " client exit code $retc, server $rets" 1>&2 | |
8b974778 | 633 | echo -e "\nnetns ${listener_ns} socket stat for ${port}:" 1>&2 |
c2a55e8f MB |
634 | ip netns exec ${listener_ns} ss -Menita 1>&2 -o "sport = :$port" |
635 | cat /tmp/${listener_ns}.out | |
8b974778 | 636 | echo -e "\nnetns ${connector_ns} socket stat for ${port}:" 1>&2 |
c2a55e8f MB |
637 | ip netns exec ${connector_ns} ss -Menita 1>&2 -o "dport = :$port" |
638 | cat /tmp/${connector_ns}.out | |
b08fbf24 PA |
639 | |
640 | cat "$capout" | |
8b819a84 | 641 | ret=1 |
b08fbf24 PA |
642 | return 1 |
643 | fi | |
644 | ||
7d1e6f16 PA |
645 | if [ "$test_link_fail" -eq 2 ];then |
646 | check_transfer $sinfail $cout "file received by client" | |
647 | else | |
648 | check_transfer $sin $cout "file received by client" | |
649 | fi | |
b08fbf24 | 650 | retc=$? |
8b819a84 FW |
651 | if [ "$test_link_fail" -eq 0 ];then |
652 | check_transfer $cin $sout "file received by server" | |
653 | else | |
654 | check_transfer $cinsent $sout "file received by server" | |
655 | fi | |
b08fbf24 PA |
656 | rets=$? |
657 | ||
658 | if [ $retc -eq 0 ] && [ $rets -eq 0 ];then | |
659 | cat "$capout" | |
660 | return 0 | |
661 | fi | |
662 | ||
663 | cat "$capout" | |
664 | return 1 | |
665 | } | |
666 | ||
667 | make_file() | |
668 | { | |
669 | name=$1 | |
670 | who=$2 | |
8b819a84 | 671 | size=$3 |
b08fbf24 | 672 | |
8b819a84 | 673 | dd if=/dev/urandom of="$name" bs=1024 count=$size 2> /dev/null |
b08fbf24 PA |
674 | echo -e "\nMPTCP_TEST_FILE_END_MARKER" >> "$name" |
675 | ||
8b819a84 | 676 | echo "Created $name (size $size KB) containing data sent by $who" |
b08fbf24 PA |
677 | } |
678 | ||
679 | run_tests() | |
680 | { | |
681 | listener_ns="$1" | |
682 | connector_ns="$2" | |
683 | connect_addr="$3" | |
8b819a84 | 684 | test_linkfail="${4:-0}" |
2e8cbf45 GT |
685 | addr_nr_ns1="${5:-0}" |
686 | addr_nr_ns2="${6:-0}" | |
8b819a84 | 687 | speed="${7:-fast}" |
6a0653b9 | 688 | sflags="${8:-""}" |
b08fbf24 | 689 | lret=0 |
8b819a84 FW |
690 | oldin="" |
691 | ||
7d1e6f16 PA |
692 | # create the input file for the failure test when |
693 | # the first failure test run | |
694 | if [ "$test_linkfail" -ne 0 -a -z "$cinfail" ]; then | |
695 | # the client file must be considerably larger | |
696 | # of the maximum expected cwin value, or the | |
697 | # link utilization will be not predicable | |
698 | size=$((RANDOM%2)) | |
8b819a84 | 699 | size=$((size+1)) |
7d1e6f16 PA |
700 | size=$((size*8192)) |
701 | size=$((size + ( $RANDOM % 8192) )) | |
8b819a84 | 702 | |
7d1e6f16 PA |
703 | cinfail=$(mktemp) |
704 | make_file "$cinfail" "client" $size | |
8b819a84 | 705 | fi |
b08fbf24 | 706 | |
7d1e6f16 PA |
707 | if [ "$test_linkfail" -eq 2 -a -z "$sinfail" ]; then |
708 | size=$((RANDOM%16)) | |
709 | size=$((size+1)) | |
710 | size=$((size*2048)) | |
8b819a84 | 711 | |
7d1e6f16 PA |
712 | sinfail=$(mktemp) |
713 | make_file "$sinfail" "server" $size | |
8b819a84 FW |
714 | fi |
715 | ||
7d1e6f16 | 716 | do_transfer ${listener_ns} ${connector_ns} MPTCP MPTCP ${connect_addr} \ |
6a0653b9 | 717 | ${test_linkfail} ${addr_nr_ns1} ${addr_nr_ns2} ${speed} ${sflags} |
7d1e6f16 | 718 | lret=$? |
b08fbf24 PA |
719 | } |
720 | ||
327b9a94 PA |
721 | dump_stats() |
722 | { | |
723 | echo Server ns stats | |
724 | ip netns exec $ns1 nstat -as | grep Tcp | |
725 | echo Client ns stats | |
726 | ip netns exec $ns2 nstat -as | grep Tcp | |
727 | } | |
728 | ||
af66d3e1 GT |
729 | chk_csum_nr() |
730 | { | |
731 | local msg=${1:-""} | |
732 | local count | |
733 | local dump_stats | |
734 | ||
735 | if [ ! -z "$msg" ]; then | |
736 | printf "%02u" "$TEST_COUNT" | |
737 | else | |
738 | echo -n " " | |
739 | fi | |
740 | printf " %-36s %s" "$msg" "sum" | |
741 | count=`ip netns exec $ns1 nstat -as | grep MPTcpExtDataCsumErr | awk '{print $2}'` | |
742 | [ -z "$count" ] && count=0 | |
743 | if [ "$count" != 0 ]; then | |
744 | echo "[fail] got $count data checksum error[s] expected 0" | |
745 | ret=1 | |
746 | dump_stats=1 | |
747 | else | |
748 | echo -n "[ ok ]" | |
749 | fi | |
750 | echo -n " - csum " | |
751 | count=`ip netns exec $ns2 nstat -as | grep MPTcpExtDataCsumErr | awk '{print $2}'` | |
752 | [ -z "$count" ] && count=0 | |
753 | if [ "$count" != 0 ]; then | |
754 | echo "[fail] got $count data checksum error[s] expected 0" | |
755 | ret=1 | |
756 | dump_stats=1 | |
757 | else | |
758 | echo "[ ok ]" | |
759 | fi | |
327b9a94 | 760 | [ "${dump_stats}" = 1 ] && dump_stats |
af66d3e1 GT |
761 | } |
762 | ||
6bb3ab49 GT |
763 | chk_fail_nr() |
764 | { | |
765 | local mp_fail_nr_tx=$1 | |
766 | local mp_fail_nr_rx=$2 | |
767 | local count | |
768 | local dump_stats | |
769 | ||
770 | printf "%-39s %s" " " "ftx" | |
771 | count=`ip netns exec $ns1 nstat -as | grep MPTcpExtMPFailTx | awk '{print $2}'` | |
772 | [ -z "$count" ] && count=0 | |
773 | if [ "$count" != "$mp_fail_nr_tx" ]; then | |
774 | echo "[fail] got $count MP_FAIL[s] TX expected $mp_fail_nr_tx" | |
775 | ret=1 | |
776 | dump_stats=1 | |
777 | else | |
778 | echo -n "[ ok ]" | |
779 | fi | |
780 | ||
781 | echo -n " - frx " | |
782 | count=`ip netns exec $ns2 nstat -as | grep MPTcpExtMPFailRx | awk '{print $2}'` | |
783 | [ -z "$count" ] && count=0 | |
784 | if [ "$count" != "$mp_fail_nr_rx" ]; then | |
785 | echo "[fail] got $count MP_FAIL[s] RX expected $mp_fail_nr_rx" | |
786 | ret=1 | |
787 | dump_stats=1 | |
788 | else | |
789 | echo "[ ok ]" | |
790 | fi | |
791 | ||
327b9a94 | 792 | [ "${dump_stats}" = 1 ] && dump_stats |
6bb3ab49 GT |
793 | } |
794 | ||
b08fbf24 PA |
795 | chk_join_nr() |
796 | { | |
797 | local msg="$1" | |
798 | local syn_nr=$2 | |
799 | local syn_ack_nr=$3 | |
800 | local ack_nr=$4 | |
801 | local count | |
802 | local dump_stats | |
803 | ||
00587187 | 804 | printf "%02u %-36s %s" "$TEST_COUNT" "$msg" "syn" |
b08fbf24 PA |
805 | count=`ip netns exec $ns1 nstat -as | grep MPTcpExtMPJoinSynRx | awk '{print $2}'` |
806 | [ -z "$count" ] && count=0 | |
807 | if [ "$count" != "$syn_nr" ]; then | |
808 | echo "[fail] got $count JOIN[s] syn expected $syn_nr" | |
809 | ret=1 | |
810 | dump_stats=1 | |
811 | else | |
812 | echo -n "[ ok ]" | |
813 | fi | |
814 | ||
815 | echo -n " - synack" | |
816 | count=`ip netns exec $ns2 nstat -as | grep MPTcpExtMPJoinSynAckRx | awk '{print $2}'` | |
817 | [ -z "$count" ] && count=0 | |
818 | if [ "$count" != "$syn_ack_nr" ]; then | |
819 | echo "[fail] got $count JOIN[s] synack expected $syn_ack_nr" | |
820 | ret=1 | |
821 | dump_stats=1 | |
822 | else | |
823 | echo -n "[ ok ]" | |
824 | fi | |
825 | ||
826 | echo -n " - ack" | |
827 | count=`ip netns exec $ns1 nstat -as | grep MPTcpExtMPJoinAckRx | awk '{print $2}'` | |
828 | [ -z "$count" ] && count=0 | |
829 | if [ "$count" != "$ack_nr" ]; then | |
830 | echo "[fail] got $count JOIN[s] ack expected $ack_nr" | |
831 | ret=1 | |
832 | dump_stats=1 | |
833 | else | |
834 | echo "[ ok ]" | |
835 | fi | |
327b9a94 | 836 | [ "${dump_stats}" = 1 ] && dump_stats |
af66d3e1 GT |
837 | if [ $checksum -eq 1 ]; then |
838 | chk_csum_nr | |
6bb3ab49 | 839 | chk_fail_nr 0 0 |
af66d3e1 | 840 | fi |
b08fbf24 PA |
841 | } |
842 | ||
7d1e6f16 PA |
843 | # a negative value for 'stale_max' means no upper bound: |
844 | # for bidirectional transfer, if one peer sleep for a while | |
845 | # - as these tests do - we can have a quite high number of | |
846 | # stale/recover conversions, proportional to | |
847 | # sleep duration/ MPTCP-level RTX interval. | |
848 | chk_stale_nr() | |
849 | { | |
850 | local ns=$1 | |
851 | local stale_min=$2 | |
852 | local stale_max=$3 | |
853 | local stale_delta=$4 | |
854 | local dump_stats | |
855 | local stale_nr | |
856 | local recover_nr | |
857 | ||
858 | printf "%-39s %-18s" " " "stale" | |
859 | stale_nr=`ip netns exec $ns nstat -as | grep MPTcpExtSubflowStale | awk '{print $2}'` | |
860 | [ -z "$stale_nr" ] && stale_nr=0 | |
861 | recover_nr=`ip netns exec $ns nstat -as | grep MPTcpExtSubflowRecover | awk '{print $2}'` | |
862 | [ -z "$recover_nr" ] && recover_nr=0 | |
863 | ||
864 | if [ $stale_nr -lt $stale_min ] || | |
865 | [ $stale_max -gt 0 -a $stale_nr -gt $stale_max ] || | |
866 | [ $((stale_nr - $recover_nr)) -ne $stale_delta ]; then | |
867 | echo "[fail] got $stale_nr stale[s] $recover_nr recover[s], " \ | |
868 | " expected stale in range [$stale_min..$stale_max]," \ | |
869 | " stale-recover delta $stale_delta " | |
870 | ret=1 | |
871 | dump_stats=1 | |
872 | else | |
873 | echo "[ ok ]" | |
874 | fi | |
875 | ||
876 | if [ "${dump_stats}" = 1 ]; then | |
877 | echo $ns stats | |
878 | ip netns exec $ns ip -s link show | |
879 | ip netns exec $ns nstat -as | grep MPTcp | |
880 | fi | |
881 | } | |
882 | ||
be613160 GT |
883 | chk_add_nr() |
884 | { | |
885 | local add_nr=$1 | |
886 | local echo_nr=$2 | |
8a127bf6 GT |
887 | local port_nr=${3:-0} |
888 | local syn_nr=${4:-$port_nr} | |
889 | local syn_ack_nr=${5:-$port_nr} | |
890 | local ack_nr=${6:-$port_nr} | |
891 | local mis_syn_nr=${7:-0} | |
892 | local mis_ack_nr=${8:-0} | |
be613160 GT |
893 | local count |
894 | local dump_stats | |
895 | ||
896 | printf "%-39s %s" " " "add" | |
897 | count=`ip netns exec $ns2 nstat -as | grep MPTcpExtAddAddr | awk '{print $2}'` | |
898 | [ -z "$count" ] && count=0 | |
899 | if [ "$count" != "$add_nr" ]; then | |
900 | echo "[fail] got $count ADD_ADDR[s] expected $add_nr" | |
901 | ret=1 | |
902 | dump_stats=1 | |
903 | else | |
904 | echo -n "[ ok ]" | |
905 | fi | |
906 | ||
907 | echo -n " - echo " | |
908 | count=`ip netns exec $ns1 nstat -as | grep MPTcpExtEchoAdd | awk '{print $2}'` | |
909 | [ -z "$count" ] && count=0 | |
910 | if [ "$count" != "$echo_nr" ]; then | |
911 | echo "[fail] got $count ADD_ADDR echo[s] expected $echo_nr" | |
912 | ret=1 | |
913 | dump_stats=1 | |
914 | else | |
8a127bf6 GT |
915 | echo -n "[ ok ]" |
916 | fi | |
917 | ||
918 | if [ $port_nr -gt 0 ]; then | |
919 | echo -n " - pt " | |
920 | count=`ip netns exec $ns2 nstat -as | grep MPTcpExtPortAdd | awk '{print $2}'` | |
921 | [ -z "$count" ] && count=0 | |
922 | if [ "$count" != "$port_nr" ]; then | |
923 | echo "[fail] got $count ADD_ADDR[s] with a port-number expected $port_nr" | |
924 | ret=1 | |
925 | dump_stats=1 | |
926 | else | |
927 | echo "[ ok ]" | |
928 | fi | |
929 | ||
930 | printf "%-39s %s" " " "syn" | |
931 | count=`ip netns exec $ns1 nstat -as | grep MPTcpExtMPJoinPortSynRx | | |
932 | awk '{print $2}'` | |
933 | [ -z "$count" ] && count=0 | |
934 | if [ "$count" != "$syn_nr" ]; then | |
935 | echo "[fail] got $count JOIN[s] syn with a different \ | |
936 | port-number expected $syn_nr" | |
937 | ret=1 | |
938 | dump_stats=1 | |
939 | else | |
940 | echo -n "[ ok ]" | |
941 | fi | |
942 | ||
943 | echo -n " - synack" | |
944 | count=`ip netns exec $ns2 nstat -as | grep MPTcpExtMPJoinPortSynAckRx | | |
945 | awk '{print $2}'` | |
946 | [ -z "$count" ] && count=0 | |
947 | if [ "$count" != "$syn_ack_nr" ]; then | |
948 | echo "[fail] got $count JOIN[s] synack with a different \ | |
949 | port-number expected $syn_ack_nr" | |
950 | ret=1 | |
951 | dump_stats=1 | |
952 | else | |
953 | echo -n "[ ok ]" | |
954 | fi | |
955 | ||
956 | echo -n " - ack" | |
957 | count=`ip netns exec $ns1 nstat -as | grep MPTcpExtMPJoinPortAckRx | | |
958 | awk '{print $2}'` | |
959 | [ -z "$count" ] && count=0 | |
960 | if [ "$count" != "$ack_nr" ]; then | |
961 | echo "[fail] got $count JOIN[s] ack with a different \ | |
962 | port-number expected $ack_nr" | |
963 | ret=1 | |
964 | dump_stats=1 | |
965 | else | |
966 | echo "[ ok ]" | |
967 | fi | |
968 | ||
969 | printf "%-39s %s" " " "syn" | |
970 | count=`ip netns exec $ns1 nstat -as | grep MPTcpExtMismatchPortSynRx | | |
971 | awk '{print $2}'` | |
972 | [ -z "$count" ] && count=0 | |
973 | if [ "$count" != "$mis_syn_nr" ]; then | |
974 | echo "[fail] got $count JOIN[s] syn with a mismatched \ | |
975 | port-number expected $mis_syn_nr" | |
976 | ret=1 | |
977 | dump_stats=1 | |
978 | else | |
979 | echo -n "[ ok ]" | |
980 | fi | |
981 | ||
982 | echo -n " - ack " | |
983 | count=`ip netns exec $ns1 nstat -as | grep MPTcpExtMismatchPortAckRx | | |
984 | awk '{print $2}'` | |
985 | [ -z "$count" ] && count=0 | |
986 | if [ "$count" != "$mis_ack_nr" ]; then | |
987 | echo "[fail] got $count JOIN[s] ack with a mismatched \ | |
988 | port-number expected $mis_ack_nr" | |
989 | ret=1 | |
990 | dump_stats=1 | |
991 | else | |
992 | echo "[ ok ]" | |
993 | fi | |
994 | else | |
995 | echo "" | |
be613160 GT |
996 | fi |
997 | ||
327b9a94 | 998 | [ "${dump_stats}" = 1 ] && dump_stats |
be613160 GT |
999 | } |
1000 | ||
dd72b0fe GT |
1001 | chk_rm_nr() |
1002 | { | |
1003 | local rm_addr_nr=$1 | |
1004 | local rm_subflow_nr=$2 | |
7028ba8a | 1005 | local invert=${3:-""} |
dd72b0fe GT |
1006 | local count |
1007 | local dump_stats | |
7028ba8a GT |
1008 | local addr_ns |
1009 | local subflow_ns | |
1010 | ||
1011 | if [ -z $invert ]; then | |
1012 | addr_ns=$ns1 | |
1013 | subflow_ns=$ns2 | |
1014 | elif [ $invert = "invert" ]; then | |
1015 | addr_ns=$ns2 | |
1016 | subflow_ns=$ns1 | |
1017 | fi | |
dd72b0fe GT |
1018 | |
1019 | printf "%-39s %s" " " "rm " | |
7028ba8a | 1020 | count=`ip netns exec $addr_ns nstat -as | grep MPTcpExtRmAddr | awk '{print $2}'` |
dd72b0fe GT |
1021 | [ -z "$count" ] && count=0 |
1022 | if [ "$count" != "$rm_addr_nr" ]; then | |
1023 | echo "[fail] got $count RM_ADDR[s] expected $rm_addr_nr" | |
1024 | ret=1 | |
1025 | dump_stats=1 | |
1026 | else | |
1027 | echo -n "[ ok ]" | |
1028 | fi | |
1029 | ||
1030 | echo -n " - sf " | |
7028ba8a | 1031 | count=`ip netns exec $subflow_ns nstat -as | grep MPTcpExtRmSubflow | awk '{print $2}'` |
dd72b0fe GT |
1032 | [ -z "$count" ] && count=0 |
1033 | if [ "$count" != "$rm_subflow_nr" ]; then | |
1034 | echo "[fail] got $count RM_SUBFLOW[s] expected $rm_subflow_nr" | |
1035 | ret=1 | |
1036 | dump_stats=1 | |
1037 | else | |
1038 | echo "[ ok ]" | |
1039 | fi | |
1040 | ||
327b9a94 | 1041 | [ "${dump_stats}" = 1 ] && dump_stats |
dd72b0fe GT |
1042 | } |
1043 | ||
718eb44e GT |
1044 | chk_prio_nr() |
1045 | { | |
1046 | local mp_prio_nr_tx=$1 | |
1047 | local mp_prio_nr_rx=$2 | |
1048 | local count | |
1049 | local dump_stats | |
1050 | ||
1051 | printf "%-39s %s" " " "ptx" | |
1052 | count=`ip netns exec $ns1 nstat -as | grep MPTcpExtMPPrioTx | awk '{print $2}'` | |
1053 | [ -z "$count" ] && count=0 | |
1054 | if [ "$count" != "$mp_prio_nr_tx" ]; then | |
1055 | echo "[fail] got $count MP_PRIO[s] TX expected $mp_prio_nr_tx" | |
1056 | ret=1 | |
1057 | dump_stats=1 | |
1058 | else | |
1059 | echo -n "[ ok ]" | |
1060 | fi | |
1061 | ||
1062 | echo -n " - prx " | |
1063 | count=`ip netns exec $ns1 nstat -as | grep MPTcpExtMPPrioRx | awk '{print $2}'` | |
1064 | [ -z "$count" ] && count=0 | |
1065 | if [ "$count" != "$mp_prio_nr_rx" ]; then | |
1066 | echo "[fail] got $count MP_PRIO[s] RX expected $mp_prio_nr_rx" | |
1067 | ret=1 | |
1068 | dump_stats=1 | |
1069 | else | |
1070 | echo "[ ok ]" | |
1071 | fi | |
1072 | ||
327b9a94 | 1073 | [ "${dump_stats}" = 1 ] && dump_stats |
718eb44e GT |
1074 | } |
1075 | ||
7d1e6f16 PA |
1076 | chk_link_usage() |
1077 | { | |
1078 | local ns=$1 | |
1079 | local link=$2 | |
1080 | local out=$3 | |
1081 | local expected_rate=$4 | |
1082 | local tx_link=`ip netns exec $ns cat /sys/class/net/$link/statistics/tx_bytes` | |
1083 | local tx_total=`ls -l $out | awk '{print $5}'` | |
1084 | local tx_rate=$((tx_link * 100 / $tx_total)) | |
1085 | local tolerance=5 | |
1086 | ||
1087 | printf "%-39s %-18s" " " "link usage" | |
1088 | if [ $tx_rate -lt $((expected_rate - $tolerance)) -o \ | |
1089 | $tx_rate -gt $((expected_rate + $tolerance)) ]; then | |
1090 | echo "[fail] got $tx_rate% usage, expected $expected_rate%" | |
1091 | ret=1 | |
1092 | else | |
1093 | echo "[ ok ]" | |
1094 | fi | |
1095 | } | |
1096 | ||
46e967d1 PA |
1097 | wait_for_tw() |
1098 | { | |
1099 | local timeout_ms=$((timeout_poll * 1000)) | |
1100 | local time=0 | |
1101 | local ns=$1 | |
1102 | ||
1103 | while [ $time -lt $timeout_ms ]; do | |
1104 | local cnt=$(ip netns exec $ns ss -t state time-wait |wc -l) | |
1105 | ||
1106 | [ "$cnt" = 1 ] && return 1 | |
1107 | time=$((time + 100)) | |
1108 | sleep 0.1 | |
1109 | done | |
1110 | return 1 | |
1111 | } | |
1112 | ||
1002b89f GT |
1113 | subflows_tests() |
1114 | { | |
1115 | reset | |
1116 | run_tests $ns1 $ns2 10.0.1.1 | |
1117 | chk_join_nr "no JOIN" "0" "0" "0" | |
1118 | ||
1119 | # subflow limited by client | |
1120 | reset | |
34aa6e3b GT |
1121 | pm_nl_set_limits $ns1 0 0 |
1122 | pm_nl_set_limits $ns2 0 0 | |
1123 | pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow | |
1002b89f GT |
1124 | run_tests $ns1 $ns2 10.0.1.1 |
1125 | chk_join_nr "single subflow, limited by client" 0 0 0 | |
1126 | ||
1127 | # subflow limited by server | |
1128 | reset | |
34aa6e3b GT |
1129 | pm_nl_set_limits $ns1 0 0 |
1130 | pm_nl_set_limits $ns2 0 1 | |
1131 | pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow | |
1002b89f GT |
1132 | run_tests $ns1 $ns2 10.0.1.1 |
1133 | chk_join_nr "single subflow, limited by server" 1 1 0 | |
1134 | ||
1135 | # subflow | |
1136 | reset | |
34aa6e3b GT |
1137 | pm_nl_set_limits $ns1 0 1 |
1138 | pm_nl_set_limits $ns2 0 1 | |
1139 | pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow | |
1002b89f GT |
1140 | run_tests $ns1 $ns2 10.0.1.1 |
1141 | chk_join_nr "single subflow" 1 1 1 | |
1142 | ||
1143 | # multiple subflows | |
1144 | reset | |
34aa6e3b GT |
1145 | pm_nl_set_limits $ns1 0 2 |
1146 | pm_nl_set_limits $ns2 0 2 | |
1147 | pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow | |
1148 | pm_nl_add_endpoint $ns2 10.0.2.2 flags subflow | |
1002b89f GT |
1149 | run_tests $ns1 $ns2 10.0.1.1 |
1150 | chk_join_nr "multiple subflows" 2 2 2 | |
1151 | ||
72bcbc46 | 1152 | # multiple subflows limited by server |
1002b89f | 1153 | reset |
34aa6e3b GT |
1154 | pm_nl_set_limits $ns1 0 1 |
1155 | pm_nl_set_limits $ns2 0 2 | |
1156 | pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow | |
1157 | pm_nl_add_endpoint $ns2 10.0.2.2 flags subflow | |
1002b89f GT |
1158 | run_tests $ns1 $ns2 10.0.1.1 |
1159 | chk_join_nr "multiple subflows, limited by server" 2 2 1 | |
c3eaa5f6 GT |
1160 | |
1161 | # single subflow, dev | |
1162 | reset | |
34aa6e3b GT |
1163 | pm_nl_set_limits $ns1 0 1 |
1164 | pm_nl_set_limits $ns2 0 1 | |
1165 | pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow dev ns2eth3 | |
c3eaa5f6 GT |
1166 | run_tests $ns1 $ns2 10.0.1.1 |
1167 | chk_join_nr "single subflow, dev" 1 1 1 | |
1002b89f GT |
1168 | } |
1169 | ||
46e967d1 PA |
1170 | subflows_error_tests() |
1171 | { | |
1172 | # If a single subflow is configured, and matches the MPC src | |
1173 | # address, no additional subflow should be created | |
1174 | reset | |
34aa6e3b GT |
1175 | pm_nl_set_limits $ns1 0 1 |
1176 | pm_nl_set_limits $ns2 0 1 | |
1177 | pm_nl_add_endpoint $ns2 10.0.1.2 flags subflow | |
46e967d1 PA |
1178 | run_tests $ns1 $ns2 10.0.1.1 0 0 0 slow |
1179 | chk_join_nr "no MPC reuse with single endpoint" 0 0 0 | |
1180 | ||
1181 | # multiple subflows, with subflow creation error | |
1182 | reset | |
34aa6e3b GT |
1183 | pm_nl_set_limits $ns1 0 2 |
1184 | pm_nl_set_limits $ns2 0 2 | |
1185 | pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow | |
1186 | pm_nl_add_endpoint $ns2 10.0.2.2 flags subflow | |
46e967d1 PA |
1187 | ip netns exec $ns1 iptables -A INPUT -s 10.0.3.2 -p tcp -j REJECT |
1188 | run_tests $ns1 $ns2 10.0.1.1 0 0 0 slow | |
1189 | chk_join_nr "multi subflows, with failing subflow" 1 1 1 | |
1190 | ||
1191 | # multiple subflows, with subflow timeout on MPJ | |
1192 | reset | |
34aa6e3b GT |
1193 | pm_nl_set_limits $ns1 0 2 |
1194 | pm_nl_set_limits $ns2 0 2 | |
1195 | pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow | |
1196 | pm_nl_add_endpoint $ns2 10.0.2.2 flags subflow | |
46e967d1 PA |
1197 | ip netns exec $ns1 iptables -A INPUT -s 10.0.3.2 -p tcp -j DROP |
1198 | run_tests $ns1 $ns2 10.0.1.1 0 0 0 slow | |
1199 | chk_join_nr "multi subflows, with subflow timeout" 1 1 1 | |
1200 | ||
1201 | # multiple subflows, check that the endpoint corresponding to | |
1202 | # closed subflow (due to reset) is not reused if additional | |
1203 | # subflows are added later | |
1204 | reset | |
34aa6e3b GT |
1205 | pm_nl_set_limits $ns1 0 1 |
1206 | pm_nl_set_limits $ns2 0 1 | |
1207 | pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow | |
46e967d1 PA |
1208 | ip netns exec $ns1 iptables -A INPUT -s 10.0.3.2 -p tcp -j REJECT |
1209 | run_tests $ns1 $ns2 10.0.1.1 0 0 0 slow & | |
1210 | ||
1211 | # updates in the child shell do not have any effect here, we | |
1212 | # need to bump the test counter for the above case | |
1213 | TEST_COUNT=$((TEST_COUNT+1)) | |
1214 | ||
1215 | # mpj subflow will be in TW after the reset | |
1216 | wait_for_tw $ns2 | |
34aa6e3b | 1217 | pm_nl_add_endpoint $ns2 10.0.2.2 flags subflow |
46e967d1 PA |
1218 | wait |
1219 | ||
1220 | # additional subflow could be created only if the PM select | |
1221 | # the later endpoint, skipping the already used one | |
1222 | chk_join_nr "multi subflows, fair usage on close" 1 1 1 | |
1223 | } | |
1224 | ||
1002b89f GT |
1225 | signal_address_tests() |
1226 | { | |
1227 | # add_address, unused | |
1228 | reset | |
34aa6e3b | 1229 | pm_nl_add_endpoint $ns1 10.0.2.1 flags signal |
1002b89f GT |
1230 | run_tests $ns1 $ns2 10.0.1.1 |
1231 | chk_join_nr "unused signal address" 0 0 0 | |
1232 | chk_add_nr 1 1 | |
1233 | ||
1234 | # accept and use add_addr | |
1235 | reset | |
34aa6e3b GT |
1236 | pm_nl_set_limits $ns1 0 1 |
1237 | pm_nl_set_limits $ns2 1 1 | |
1238 | pm_nl_add_endpoint $ns1 10.0.2.1 flags signal | |
1002b89f GT |
1239 | run_tests $ns1 $ns2 10.0.1.1 |
1240 | chk_join_nr "signal address" 1 1 1 | |
1241 | chk_add_nr 1 1 | |
1242 | ||
1243 | # accept and use add_addr with an additional subflow | |
1244 | # note: signal address in server ns and local addresses in client ns must | |
1245 | # belong to different subnets or one of the listed local address could be | |
1246 | # used for 'add_addr' subflow | |
1247 | reset | |
34aa6e3b GT |
1248 | pm_nl_add_endpoint $ns1 10.0.2.1 flags signal |
1249 | pm_nl_set_limits $ns1 0 2 | |
1250 | pm_nl_set_limits $ns2 1 2 | |
1251 | pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow | |
1002b89f GT |
1252 | run_tests $ns1 $ns2 10.0.1.1 |
1253 | chk_join_nr "subflow and signal" 2 2 2 | |
1254 | chk_add_nr 1 1 | |
1255 | ||
1256 | # accept and use add_addr with additional subflows | |
1257 | reset | |
34aa6e3b GT |
1258 | pm_nl_set_limits $ns1 0 3 |
1259 | pm_nl_add_endpoint $ns1 10.0.2.1 flags signal | |
1260 | pm_nl_set_limits $ns2 1 3 | |
1261 | pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow | |
1262 | pm_nl_add_endpoint $ns2 10.0.4.2 flags subflow | |
1002b89f GT |
1263 | run_tests $ns1 $ns2 10.0.1.1 |
1264 | chk_join_nr "multiple subflows and signal" 3 3 3 | |
1265 | chk_add_nr 1 1 | |
ef360019 GT |
1266 | |
1267 | # signal addresses | |
1268 | reset | |
34aa6e3b GT |
1269 | pm_nl_set_limits $ns1 3 3 |
1270 | pm_nl_add_endpoint $ns1 10.0.2.1 flags signal | |
1271 | pm_nl_add_endpoint $ns1 10.0.3.1 flags signal | |
1272 | pm_nl_add_endpoint $ns1 10.0.4.1 flags signal | |
1273 | pm_nl_set_limits $ns2 3 3 | |
ef360019 GT |
1274 | run_tests $ns1 $ns2 10.0.1.1 |
1275 | chk_join_nr "signal addresses" 3 3 3 | |
1276 | chk_add_nr 3 3 | |
1277 | ||
1278 | # signal invalid addresses | |
1279 | reset | |
34aa6e3b GT |
1280 | pm_nl_set_limits $ns1 3 3 |
1281 | pm_nl_add_endpoint $ns1 10.0.12.1 flags signal | |
1282 | pm_nl_add_endpoint $ns1 10.0.3.1 flags signal | |
1283 | pm_nl_add_endpoint $ns1 10.0.14.1 flags signal | |
1284 | pm_nl_set_limits $ns2 3 3 | |
ef360019 GT |
1285 | run_tests $ns1 $ns2 10.0.1.1 |
1286 | chk_join_nr "signal invalid addresses" 1 1 1 | |
1287 | chk_add_nr 3 3 | |
33c563ad YL |
1288 | |
1289 | # signal addresses race test | |
1290 | reset | |
34aa6e3b GT |
1291 | pm_nl_set_limits $ns1 4 4 |
1292 | pm_nl_set_limits $ns2 4 4 | |
1293 | pm_nl_add_endpoint $ns1 10.0.1.1 flags signal | |
1294 | pm_nl_add_endpoint $ns1 10.0.2.1 flags signal | |
1295 | pm_nl_add_endpoint $ns1 10.0.3.1 flags signal | |
1296 | pm_nl_add_endpoint $ns1 10.0.4.1 flags signal | |
1297 | pm_nl_add_endpoint $ns2 10.0.1.2 flags signal | |
1298 | pm_nl_add_endpoint $ns2 10.0.2.2 flags signal | |
1299 | pm_nl_add_endpoint $ns2 10.0.3.2 flags signal | |
1300 | pm_nl_add_endpoint $ns2 10.0.4.2 flags signal | |
33c563ad | 1301 | run_tests $ns1 $ns2 10.0.1.1 |
86e39e04 PA |
1302 | |
1303 | # the server will not signal the address terminating | |
1304 | # the MPC subflow | |
1305 | chk_add_nr 3 3 | |
1002b89f GT |
1306 | } |
1307 | ||
1308 | link_failure_tests() | |
1309 | { | |
1310 | # accept and use add_addr with additional subflows and link loss | |
1311 | reset | |
7d1e6f16 PA |
1312 | |
1313 | # without any b/w limit each veth could spool the packets and get | |
1314 | # them acked at xmit time, so that the corresponding subflow will | |
1315 | # have almost always no outstanding pkts, the scheduler will pick | |
1316 | # always the first subflow and we will have hard time testing | |
1317 | # active backup and link switch-over. | |
1318 | # Let's set some arbitrary (low) virtual link limits. | |
1319 | init_shapers | |
34aa6e3b GT |
1320 | pm_nl_set_limits $ns1 0 3 |
1321 | pm_nl_add_endpoint $ns1 10.0.2.1 dev ns1eth2 flags signal | |
1322 | pm_nl_set_limits $ns2 1 3 | |
1323 | pm_nl_add_endpoint $ns2 10.0.3.2 dev ns2eth3 flags subflow | |
1324 | pm_nl_add_endpoint $ns2 10.0.4.2 dev ns2eth4 flags subflow | |
1002b89f GT |
1325 | run_tests $ns1 $ns2 10.0.1.1 1 |
1326 | chk_join_nr "multiple flows, signal, link failure" 3 3 3 | |
1327 | chk_add_nr 1 1 | |
7d1e6f16 PA |
1328 | chk_stale_nr $ns2 1 5 1 |
1329 | ||
1330 | # accept and use add_addr with additional subflows and link loss | |
1331 | # for bidirectional transfer | |
1332 | reset | |
1333 | init_shapers | |
34aa6e3b GT |
1334 | pm_nl_set_limits $ns1 0 3 |
1335 | pm_nl_add_endpoint $ns1 10.0.2.1 dev ns1eth2 flags signal | |
1336 | pm_nl_set_limits $ns2 1 3 | |
1337 | pm_nl_add_endpoint $ns2 10.0.3.2 dev ns2eth3 flags subflow | |
1338 | pm_nl_add_endpoint $ns2 10.0.4.2 dev ns2eth4 flags subflow | |
7d1e6f16 PA |
1339 | run_tests $ns1 $ns2 10.0.1.1 2 |
1340 | chk_join_nr "multi flows, signal, bidi, link fail" 3 3 3 | |
1341 | chk_add_nr 1 1 | |
1342 | chk_stale_nr $ns2 1 -1 1 | |
1343 | ||
1344 | # 2 subflows plus 1 backup subflow with a lossy link, backup | |
1345 | # will never be used | |
1346 | reset | |
1347 | init_shapers | |
34aa6e3b GT |
1348 | pm_nl_set_limits $ns1 0 2 |
1349 | pm_nl_add_endpoint $ns1 10.0.2.1 dev ns1eth2 flags signal | |
1350 | pm_nl_set_limits $ns2 1 2 | |
7d1e6f16 | 1351 | export FAILING_LINKS="1" |
34aa6e3b | 1352 | pm_nl_add_endpoint $ns2 10.0.3.2 dev ns2eth3 flags subflow,backup |
7d1e6f16 PA |
1353 | run_tests $ns1 $ns2 10.0.1.1 1 |
1354 | chk_join_nr "backup subflow unused, link failure" 2 2 2 | |
1355 | chk_add_nr 1 1 | |
1356 | chk_link_usage $ns2 ns2eth3 $cinsent 0 | |
1357 | ||
1358 | # 2 lossy links after half transfer, backup will get half of | |
1359 | # the traffic | |
1360 | reset | |
1361 | init_shapers | |
34aa6e3b GT |
1362 | pm_nl_set_limits $ns1 0 2 |
1363 | pm_nl_add_endpoint $ns1 10.0.2.1 dev ns1eth2 flags signal | |
1364 | pm_nl_set_limits $ns2 1 2 | |
1365 | pm_nl_add_endpoint $ns2 10.0.3.2 dev ns2eth3 flags subflow,backup | |
7d1e6f16 PA |
1366 | export FAILING_LINKS="1 2" |
1367 | run_tests $ns1 $ns2 10.0.1.1 1 | |
1368 | chk_join_nr "backup flow used, multi links fail" 2 2 2 | |
1369 | chk_add_nr 1 1 | |
1370 | chk_stale_nr $ns2 2 4 2 | |
1371 | chk_link_usage $ns2 ns2eth3 $cinsent 50 | |
1372 | ||
1373 | # use a backup subflow with the first subflow on a lossy link | |
1374 | # for bidirectional transfer | |
1375 | reset | |
1376 | init_shapers | |
34aa6e3b GT |
1377 | pm_nl_set_limits $ns1 0 2 |
1378 | pm_nl_add_endpoint $ns1 10.0.2.1 dev ns1eth2 flags signal | |
1379 | pm_nl_set_limits $ns2 1 3 | |
1380 | pm_nl_add_endpoint $ns2 10.0.3.2 dev ns2eth3 flags subflow,backup | |
7d1e6f16 PA |
1381 | run_tests $ns1 $ns2 10.0.1.1 2 |
1382 | chk_join_nr "backup flow used, bidi, link failure" 2 2 2 | |
1383 | chk_add_nr 1 1 | |
1384 | chk_stale_nr $ns2 1 -1 2 | |
1385 | chk_link_usage $ns2 ns2eth3 $cinsent 50 | |
1002b89f GT |
1386 | } |
1387 | ||
1388 | add_addr_timeout_tests() | |
1389 | { | |
1390 | # add_addr timeout | |
1391 | reset_with_add_addr_timeout | |
34aa6e3b GT |
1392 | pm_nl_set_limits $ns1 0 1 |
1393 | pm_nl_set_limits $ns2 1 1 | |
1394 | pm_nl_add_endpoint $ns1 10.0.2.1 flags signal | |
1002b89f GT |
1395 | run_tests $ns1 $ns2 10.0.1.1 0 0 0 slow |
1396 | chk_join_nr "signal address, ADD_ADDR timeout" 1 1 1 | |
1397 | chk_add_nr 4 0 | |
1398 | ||
1399 | # add_addr timeout IPv6 | |
1400 | reset_with_add_addr_timeout 6 | |
34aa6e3b GT |
1401 | pm_nl_set_limits $ns1 0 1 |
1402 | pm_nl_set_limits $ns2 1 1 | |
1403 | pm_nl_add_endpoint $ns1 dead:beef:2::1 flags signal | |
1002b89f GT |
1404 | run_tests $ns1 $ns2 dead:beef:1::1 0 0 0 slow |
1405 | chk_join_nr "signal address, ADD_ADDR6 timeout" 1 1 1 | |
1406 | chk_add_nr 4 0 | |
8da6229b GT |
1407 | |
1408 | # signal addresses timeout | |
1409 | reset_with_add_addr_timeout | |
34aa6e3b GT |
1410 | pm_nl_set_limits $ns1 2 2 |
1411 | pm_nl_add_endpoint $ns1 10.0.2.1 flags signal | |
1412 | pm_nl_add_endpoint $ns1 10.0.3.1 flags signal | |
1413 | pm_nl_set_limits $ns2 2 2 | |
8da6229b GT |
1414 | run_tests $ns1 $ns2 10.0.1.1 0 0 0 least |
1415 | chk_join_nr "signal addresses, ADD_ADDR timeout" 2 2 2 | |
1416 | chk_add_nr 8 0 | |
1417 | ||
1418 | # signal invalid addresses timeout | |
1419 | reset_with_add_addr_timeout | |
34aa6e3b GT |
1420 | pm_nl_set_limits $ns1 2 2 |
1421 | pm_nl_add_endpoint $ns1 10.0.12.1 flags signal | |
1422 | pm_nl_add_endpoint $ns1 10.0.3.1 flags signal | |
1423 | pm_nl_set_limits $ns2 2 2 | |
8da6229b GT |
1424 | run_tests $ns1 $ns2 10.0.1.1 0 0 0 least |
1425 | chk_join_nr "invalid address, ADD_ADDR timeout" 1 1 1 | |
1426 | chk_add_nr 8 0 | |
1002b89f GT |
1427 | } |
1428 | ||
1429 | remove_tests() | |
1430 | { | |
1431 | # single subflow, remove | |
1432 | reset | |
34aa6e3b GT |
1433 | pm_nl_set_limits $ns1 0 1 |
1434 | pm_nl_set_limits $ns2 0 1 | |
1435 | pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow | |
1002b89f GT |
1436 | run_tests $ns1 $ns2 10.0.1.1 0 0 -1 slow |
1437 | chk_join_nr "remove single subflow" 1 1 1 | |
1438 | chk_rm_nr 1 1 | |
1439 | ||
1440 | # multiple subflows, remove | |
1441 | reset | |
34aa6e3b GT |
1442 | pm_nl_set_limits $ns1 0 2 |
1443 | pm_nl_set_limits $ns2 0 2 | |
1444 | pm_nl_add_endpoint $ns2 10.0.2.2 flags subflow | |
1445 | pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow | |
1002b89f GT |
1446 | run_tests $ns1 $ns2 10.0.1.1 0 0 -2 slow |
1447 | chk_join_nr "remove multiple subflows" 2 2 2 | |
1448 | chk_rm_nr 2 2 | |
1449 | ||
1450 | # single address, remove | |
1451 | reset | |
34aa6e3b GT |
1452 | pm_nl_set_limits $ns1 0 1 |
1453 | pm_nl_add_endpoint $ns1 10.0.2.1 flags signal | |
1454 | pm_nl_set_limits $ns2 1 1 | |
1002b89f GT |
1455 | run_tests $ns1 $ns2 10.0.1.1 0 -1 0 slow |
1456 | chk_join_nr "remove single address" 1 1 1 | |
1457 | chk_add_nr 1 1 | |
7028ba8a | 1458 | chk_rm_nr 1 1 invert |
1002b89f GT |
1459 | |
1460 | # subflow and signal, remove | |
1461 | reset | |
34aa6e3b GT |
1462 | pm_nl_set_limits $ns1 0 2 |
1463 | pm_nl_add_endpoint $ns1 10.0.2.1 flags signal | |
1464 | pm_nl_set_limits $ns2 1 2 | |
1465 | pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow | |
1002b89f GT |
1466 | run_tests $ns1 $ns2 10.0.1.1 0 -1 -1 slow |
1467 | chk_join_nr "remove subflow and signal" 2 2 2 | |
1468 | chk_add_nr 1 1 | |
1469 | chk_rm_nr 1 1 | |
1470 | ||
1471 | # subflows and signal, remove | |
1472 | reset | |
34aa6e3b GT |
1473 | pm_nl_set_limits $ns1 0 3 |
1474 | pm_nl_add_endpoint $ns1 10.0.2.1 flags signal | |
1475 | pm_nl_set_limits $ns2 1 3 | |
1476 | pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow | |
1477 | pm_nl_add_endpoint $ns2 10.0.4.2 flags subflow | |
1002b89f GT |
1478 | run_tests $ns1 $ns2 10.0.1.1 0 -1 -2 slow |
1479 | chk_join_nr "remove subflows and signal" 3 3 3 | |
1480 | chk_add_nr 1 1 | |
1481 | chk_rm_nr 2 2 | |
1482 | ||
ef360019 GT |
1483 | # addresses remove |
1484 | reset | |
34aa6e3b GT |
1485 | pm_nl_set_limits $ns1 3 3 |
1486 | pm_nl_add_endpoint $ns1 10.0.2.1 flags signal id 250 | |
1487 | pm_nl_add_endpoint $ns1 10.0.3.1 flags signal | |
1488 | pm_nl_add_endpoint $ns1 10.0.4.1 flags signal | |
1489 | pm_nl_set_limits $ns2 3 3 | |
ef360019 GT |
1490 | run_tests $ns1 $ns2 10.0.1.1 0 -3 0 slow |
1491 | chk_join_nr "remove addresses" 3 3 3 | |
1492 | chk_add_nr 3 3 | |
1493 | chk_rm_nr 3 3 invert | |
1494 | ||
1495 | # invalid addresses remove | |
1496 | reset | |
34aa6e3b GT |
1497 | pm_nl_set_limits $ns1 3 3 |
1498 | pm_nl_add_endpoint $ns1 10.0.12.1 flags signal | |
1499 | pm_nl_add_endpoint $ns1 10.0.3.1 flags signal | |
1500 | pm_nl_add_endpoint $ns1 10.0.14.1 flags signal | |
1501 | pm_nl_set_limits $ns2 3 3 | |
ef360019 GT |
1502 | run_tests $ns1 $ns2 10.0.1.1 0 -3 0 slow |
1503 | chk_join_nr "remove invalid addresses" 1 1 1 | |
1504 | chk_add_nr 3 3 | |
1505 | chk_rm_nr 3 1 invert | |
1506 | ||
1002b89f GT |
1507 | # subflows and signal, flush |
1508 | reset | |
34aa6e3b GT |
1509 | pm_nl_set_limits $ns1 0 3 |
1510 | pm_nl_add_endpoint $ns1 10.0.2.1 flags signal | |
1511 | pm_nl_set_limits $ns2 1 3 | |
1512 | pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow | |
1513 | pm_nl_add_endpoint $ns2 10.0.4.2 flags subflow | |
1002b89f GT |
1514 | run_tests $ns1 $ns2 10.0.1.1 0 -8 -8 slow |
1515 | chk_join_nr "flush subflows and signal" 3 3 3 | |
1516 | chk_add_nr 1 1 | |
1517 | chk_rm_nr 2 2 | |
d2c4333a GT |
1518 | |
1519 | # subflows flush | |
1520 | reset | |
34aa6e3b GT |
1521 | pm_nl_set_limits $ns1 3 3 |
1522 | pm_nl_set_limits $ns2 3 3 | |
1523 | pm_nl_add_endpoint $ns2 10.0.2.2 flags subflow id 150 | |
1524 | pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow | |
1525 | pm_nl_add_endpoint $ns2 10.0.4.2 flags subflow | |
d2c4333a GT |
1526 | run_tests $ns1 $ns2 10.0.1.1 0 -8 -8 slow |
1527 | chk_join_nr "flush subflows" 3 3 3 | |
1528 | chk_rm_nr 3 3 | |
1529 | ||
1530 | # addresses flush | |
1531 | reset | |
34aa6e3b GT |
1532 | pm_nl_set_limits $ns1 3 3 |
1533 | pm_nl_add_endpoint $ns1 10.0.2.1 flags signal id 250 | |
1534 | pm_nl_add_endpoint $ns1 10.0.3.1 flags signal | |
1535 | pm_nl_add_endpoint $ns1 10.0.4.1 flags signal | |
1536 | pm_nl_set_limits $ns2 3 3 | |
d2c4333a GT |
1537 | run_tests $ns1 $ns2 10.0.1.1 0 -8 -8 slow |
1538 | chk_join_nr "flush addresses" 3 3 3 | |
1539 | chk_add_nr 3 3 | |
1540 | chk_rm_nr 3 3 invert | |
ef360019 GT |
1541 | |
1542 | # invalid addresses flush | |
1543 | reset | |
34aa6e3b GT |
1544 | pm_nl_set_limits $ns1 3 3 |
1545 | pm_nl_add_endpoint $ns1 10.0.12.1 flags signal | |
1546 | pm_nl_add_endpoint $ns1 10.0.3.1 flags signal | |
1547 | pm_nl_add_endpoint $ns1 10.0.14.1 flags signal | |
1548 | pm_nl_set_limits $ns2 3 3 | |
ef360019 GT |
1549 | run_tests $ns1 $ns2 10.0.1.1 0 -8 0 slow |
1550 | chk_join_nr "flush invalid addresses" 1 1 1 | |
1551 | chk_add_nr 3 3 | |
1552 | chk_rm_nr 3 1 invert | |
5e287fe7 GT |
1553 | |
1554 | # remove id 0 subflow | |
1555 | reset | |
34aa6e3b GT |
1556 | pm_nl_set_limits $ns1 0 1 |
1557 | pm_nl_set_limits $ns2 0 1 | |
1558 | pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow | |
5e287fe7 GT |
1559 | run_tests $ns1 $ns2 10.0.1.1 0 0 -9 slow |
1560 | chk_join_nr "remove id 0 subflow" 1 1 1 | |
1561 | chk_rm_nr 1 1 | |
1562 | ||
1563 | # remove id 0 address | |
1564 | reset | |
34aa6e3b GT |
1565 | pm_nl_set_limits $ns1 0 1 |
1566 | pm_nl_add_endpoint $ns1 10.0.2.1 flags signal | |
1567 | pm_nl_set_limits $ns2 1 1 | |
5e287fe7 GT |
1568 | run_tests $ns1 $ns2 10.0.1.1 0 -9 0 slow |
1569 | chk_join_nr "remove id 0 address" 1 1 1 | |
1570 | chk_add_nr 1 1 | |
1571 | chk_rm_nr 1 1 invert | |
1002b89f GT |
1572 | } |
1573 | ||
1574 | add_tests() | |
1575 | { | |
1576 | # add single subflow | |
1577 | reset | |
34aa6e3b GT |
1578 | pm_nl_set_limits $ns1 0 1 |
1579 | pm_nl_set_limits $ns2 0 1 | |
1002b89f GT |
1580 | run_tests $ns1 $ns2 10.0.1.1 0 0 1 slow |
1581 | chk_join_nr "add single subflow" 1 1 1 | |
1582 | ||
1583 | # add signal address | |
1584 | reset | |
34aa6e3b GT |
1585 | pm_nl_set_limits $ns1 0 1 |
1586 | pm_nl_set_limits $ns2 1 1 | |
1002b89f GT |
1587 | run_tests $ns1 $ns2 10.0.1.1 0 1 0 slow |
1588 | chk_join_nr "add signal address" 1 1 1 | |
1589 | chk_add_nr 1 1 | |
1590 | ||
1591 | # add multiple subflows | |
1592 | reset | |
34aa6e3b GT |
1593 | pm_nl_set_limits $ns1 0 2 |
1594 | pm_nl_set_limits $ns2 0 2 | |
1002b89f GT |
1595 | run_tests $ns1 $ns2 10.0.1.1 0 0 2 slow |
1596 | chk_join_nr "add multiple subflows" 2 2 2 | |
1597 | ||
1598 | # add multiple subflows IPv6 | |
1599 | reset | |
34aa6e3b GT |
1600 | pm_nl_set_limits $ns1 0 2 |
1601 | pm_nl_set_limits $ns2 0 2 | |
1002b89f GT |
1602 | run_tests $ns1 $ns2 dead:beef:1::1 0 0 2 slow |
1603 | chk_join_nr "add multiple subflows IPv6" 2 2 2 | |
1604 | ||
1605 | # add multiple addresses IPv6 | |
1606 | reset | |
34aa6e3b GT |
1607 | pm_nl_set_limits $ns1 0 2 |
1608 | pm_nl_set_limits $ns2 2 2 | |
1002b89f GT |
1609 | run_tests $ns1 $ns2 dead:beef:1::1 0 2 0 slow |
1610 | chk_join_nr "add multiple addresses IPv6" 2 2 2 | |
1611 | chk_add_nr 2 2 | |
1612 | } | |
1613 | ||
1614 | ipv6_tests() | |
1615 | { | |
1616 | # subflow IPv6 | |
1617 | reset | |
34aa6e3b GT |
1618 | pm_nl_set_limits $ns1 0 1 |
1619 | pm_nl_set_limits $ns2 0 1 | |
1620 | pm_nl_add_endpoint $ns2 dead:beef:3::2 dev ns2eth3 flags subflow | |
1002b89f GT |
1621 | run_tests $ns1 $ns2 dead:beef:1::1 0 0 0 slow |
1622 | chk_join_nr "single subflow IPv6" 1 1 1 | |
1623 | ||
1624 | # add_address, unused IPv6 | |
1625 | reset | |
34aa6e3b | 1626 | pm_nl_add_endpoint $ns1 dead:beef:2::1 flags signal |
1002b89f GT |
1627 | run_tests $ns1 $ns2 dead:beef:1::1 0 0 0 slow |
1628 | chk_join_nr "unused signal address IPv6" 0 0 0 | |
1629 | chk_add_nr 1 1 | |
1630 | ||
1631 | # signal address IPv6 | |
1632 | reset | |
34aa6e3b GT |
1633 | pm_nl_set_limits $ns1 0 1 |
1634 | pm_nl_add_endpoint $ns1 dead:beef:2::1 flags signal | |
1635 | pm_nl_set_limits $ns2 1 1 | |
1002b89f GT |
1636 | run_tests $ns1 $ns2 dead:beef:1::1 0 0 0 slow |
1637 | chk_join_nr "single address IPv6" 1 1 1 | |
1638 | chk_add_nr 1 1 | |
1639 | ||
1640 | # single address IPv6, remove | |
1641 | reset | |
34aa6e3b GT |
1642 | pm_nl_set_limits $ns1 0 1 |
1643 | pm_nl_add_endpoint $ns1 dead:beef:2::1 flags signal | |
1644 | pm_nl_set_limits $ns2 1 1 | |
1002b89f GT |
1645 | run_tests $ns1 $ns2 dead:beef:1::1 0 -1 0 slow |
1646 | chk_join_nr "remove single address IPv6" 1 1 1 | |
1647 | chk_add_nr 1 1 | |
7028ba8a | 1648 | chk_rm_nr 1 1 invert |
1002b89f GT |
1649 | |
1650 | # subflow and signal IPv6, remove | |
1651 | reset | |
34aa6e3b GT |
1652 | pm_nl_set_limits $ns1 0 2 |
1653 | pm_nl_add_endpoint $ns1 dead:beef:2::1 flags signal | |
1654 | pm_nl_set_limits $ns2 1 2 | |
1655 | pm_nl_add_endpoint $ns2 dead:beef:3::2 dev ns2eth3 flags subflow | |
1002b89f GT |
1656 | run_tests $ns1 $ns2 dead:beef:1::1 0 -1 -1 slow |
1657 | chk_join_nr "remove subflow and signal IPv6" 2 2 2 | |
1658 | chk_add_nr 1 1 | |
1659 | chk_rm_nr 1 1 | |
1660 | } | |
1661 | ||
1662 | v4mapped_tests() | |
1663 | { | |
1664 | # subflow IPv4-mapped to IPv4-mapped | |
1665 | reset | |
34aa6e3b GT |
1666 | pm_nl_set_limits $ns1 0 1 |
1667 | pm_nl_set_limits $ns2 0 1 | |
1668 | pm_nl_add_endpoint $ns2 "::ffff:10.0.3.2" flags subflow | |
1002b89f GT |
1669 | run_tests $ns1 $ns2 "::ffff:10.0.1.1" |
1670 | chk_join_nr "single subflow IPv4-mapped" 1 1 1 | |
1671 | ||
1672 | # signal address IPv4-mapped with IPv4-mapped sk | |
1673 | reset | |
34aa6e3b GT |
1674 | pm_nl_set_limits $ns1 0 1 |
1675 | pm_nl_set_limits $ns2 1 1 | |
1676 | pm_nl_add_endpoint $ns1 "::ffff:10.0.2.1" flags signal | |
1002b89f GT |
1677 | run_tests $ns1 $ns2 "::ffff:10.0.1.1" |
1678 | chk_join_nr "signal address IPv4-mapped" 1 1 1 | |
1679 | chk_add_nr 1 1 | |
1680 | ||
1681 | # subflow v4-map-v6 | |
1682 | reset | |
34aa6e3b GT |
1683 | pm_nl_set_limits $ns1 0 1 |
1684 | pm_nl_set_limits $ns2 0 1 | |
1685 | pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow | |
1002b89f GT |
1686 | run_tests $ns1 $ns2 "::ffff:10.0.1.1" |
1687 | chk_join_nr "single subflow v4-map-v6" 1 1 1 | |
1688 | ||
1689 | # signal address v4-map-v6 | |
1690 | reset | |
34aa6e3b GT |
1691 | pm_nl_set_limits $ns1 0 1 |
1692 | pm_nl_set_limits $ns2 1 1 | |
1693 | pm_nl_add_endpoint $ns1 10.0.2.1 flags signal | |
1002b89f GT |
1694 | run_tests $ns1 $ns2 "::ffff:10.0.1.1" |
1695 | chk_join_nr "signal address v4-map-v6" 1 1 1 | |
1696 | chk_add_nr 1 1 | |
1697 | ||
1698 | # subflow v6-map-v4 | |
1699 | reset | |
34aa6e3b GT |
1700 | pm_nl_set_limits $ns1 0 1 |
1701 | pm_nl_set_limits $ns2 0 1 | |
1702 | pm_nl_add_endpoint $ns2 "::ffff:10.0.3.2" flags subflow | |
1002b89f GT |
1703 | run_tests $ns1 $ns2 10.0.1.1 |
1704 | chk_join_nr "single subflow v6-map-v4" 1 1 1 | |
1705 | ||
1706 | # signal address v6-map-v4 | |
1707 | reset | |
34aa6e3b GT |
1708 | pm_nl_set_limits $ns1 0 1 |
1709 | pm_nl_set_limits $ns2 1 1 | |
1710 | pm_nl_add_endpoint $ns1 "::ffff:10.0.2.1" flags signal | |
1002b89f GT |
1711 | run_tests $ns1 $ns2 10.0.1.1 |
1712 | chk_join_nr "signal address v6-map-v4" 1 1 1 | |
1713 | chk_add_nr 1 1 | |
1714 | ||
1715 | # no subflow IPv6 to v4 address | |
1716 | reset | |
34aa6e3b GT |
1717 | pm_nl_set_limits $ns1 0 1 |
1718 | pm_nl_set_limits $ns2 0 1 | |
1719 | pm_nl_add_endpoint $ns2 dead:beef:2::2 flags subflow | |
1002b89f GT |
1720 | run_tests $ns1 $ns2 10.0.1.1 |
1721 | chk_join_nr "no JOIN with diff families v4-v6" 0 0 0 | |
1722 | ||
1723 | # no subflow IPv6 to v4 address even if v6 has a valid v4 at the end | |
1724 | reset | |
34aa6e3b GT |
1725 | pm_nl_set_limits $ns1 0 1 |
1726 | pm_nl_set_limits $ns2 0 1 | |
1727 | pm_nl_add_endpoint $ns2 dead:beef:2::10.0.3.2 flags subflow | |
1002b89f GT |
1728 | run_tests $ns1 $ns2 10.0.1.1 |
1729 | chk_join_nr "no JOIN with diff families v4-v6-2" 0 0 0 | |
1730 | ||
1731 | # no subflow IPv4 to v6 address, no need to slow down too then | |
1732 | reset | |
34aa6e3b GT |
1733 | pm_nl_set_limits $ns1 0 1 |
1734 | pm_nl_set_limits $ns2 0 1 | |
1735 | pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow | |
1002b89f GT |
1736 | run_tests $ns1 $ns2 dead:beef:1::1 |
1737 | chk_join_nr "no JOIN with diff families v6-v4" 0 0 0 | |
1738 | } | |
1739 | ||
1740 | backup_tests() | |
1741 | { | |
1742 | # single subflow, backup | |
1743 | reset | |
34aa6e3b GT |
1744 | pm_nl_set_limits $ns1 0 1 |
1745 | pm_nl_set_limits $ns2 0 1 | |
1746 | pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow,backup | |
1002b89f GT |
1747 | run_tests $ns1 $ns2 10.0.1.1 0 0 0 slow nobackup |
1748 | chk_join_nr "single subflow, backup" 1 1 1 | |
1749 | chk_prio_nr 0 1 | |
1750 | ||
1751 | # single address, backup | |
1752 | reset | |
34aa6e3b GT |
1753 | pm_nl_set_limits $ns1 0 1 |
1754 | pm_nl_add_endpoint $ns1 10.0.2.1 flags signal | |
1755 | pm_nl_set_limits $ns2 1 1 | |
1002b89f GT |
1756 | run_tests $ns1 $ns2 10.0.1.1 0 0 0 slow backup |
1757 | chk_join_nr "single address, backup" 1 1 1 | |
1758 | chk_add_nr 1 1 | |
1759 | chk_prio_nr 1 0 | |
33397b83 GT |
1760 | |
1761 | # single address with port, backup | |
1762 | reset | |
34aa6e3b GT |
1763 | pm_nl_set_limits $ns1 0 1 |
1764 | pm_nl_add_endpoint $ns1 10.0.2.1 flags signal port 10100 | |
1765 | pm_nl_set_limits $ns2 1 1 | |
33397b83 GT |
1766 | run_tests $ns1 $ns2 10.0.1.1 0 0 0 slow backup |
1767 | chk_join_nr "single address with port, backup" 1 1 1 | |
1768 | chk_add_nr 1 1 | |
1769 | chk_prio_nr 1 0 | |
1002b89f GT |
1770 | } |
1771 | ||
1772 | add_addr_ports_tests() | |
1773 | { | |
1774 | # signal address with port | |
1775 | reset | |
34aa6e3b GT |
1776 | pm_nl_set_limits $ns1 0 1 |
1777 | pm_nl_set_limits $ns2 1 1 | |
1778 | pm_nl_add_endpoint $ns1 10.0.2.1 flags signal port 10100 | |
1002b89f GT |
1779 | run_tests $ns1 $ns2 10.0.1.1 |
1780 | chk_join_nr "signal address with port" 1 1 1 | |
1781 | chk_add_nr 1 1 1 | |
1782 | ||
1783 | # subflow and signal with port | |
1784 | reset | |
34aa6e3b GT |
1785 | pm_nl_add_endpoint $ns1 10.0.2.1 flags signal port 10100 |
1786 | pm_nl_set_limits $ns1 0 2 | |
1787 | pm_nl_set_limits $ns2 1 2 | |
1788 | pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow | |
1002b89f GT |
1789 | run_tests $ns1 $ns2 10.0.1.1 |
1790 | chk_join_nr "subflow and signal with port" 2 2 2 | |
1791 | chk_add_nr 1 1 1 | |
1792 | ||
1793 | # single address with port, remove | |
1794 | reset | |
34aa6e3b GT |
1795 | pm_nl_set_limits $ns1 0 1 |
1796 | pm_nl_add_endpoint $ns1 10.0.2.1 flags signal port 10100 | |
1797 | pm_nl_set_limits $ns2 1 1 | |
1002b89f GT |
1798 | run_tests $ns1 $ns2 10.0.1.1 0 -1 0 slow |
1799 | chk_join_nr "remove single address with port" 1 1 1 | |
1800 | chk_add_nr 1 1 1 | |
7028ba8a | 1801 | chk_rm_nr 1 1 invert |
1002b89f GT |
1802 | |
1803 | # subflow and signal with port, remove | |
1804 | reset | |
34aa6e3b GT |
1805 | pm_nl_set_limits $ns1 0 2 |
1806 | pm_nl_add_endpoint $ns1 10.0.2.1 flags signal port 10100 | |
1807 | pm_nl_set_limits $ns2 1 2 | |
1808 | pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow | |
1002b89f GT |
1809 | run_tests $ns1 $ns2 10.0.1.1 0 -1 -1 slow |
1810 | chk_join_nr "remove subflow and signal with port" 2 2 2 | |
1811 | chk_add_nr 1 1 1 | |
1812 | chk_rm_nr 1 1 | |
1813 | ||
1814 | # subflows and signal with port, flush | |
1815 | reset | |
34aa6e3b GT |
1816 | pm_nl_set_limits $ns1 0 3 |
1817 | pm_nl_add_endpoint $ns1 10.0.2.1 flags signal port 10100 | |
1818 | pm_nl_set_limits $ns2 1 3 | |
1819 | pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow | |
1820 | pm_nl_add_endpoint $ns2 10.0.4.2 flags subflow | |
327b9a94 | 1821 | run_tests $ns1 $ns2 10.0.1.1 0 -8 -2 slow |
1002b89f GT |
1822 | chk_join_nr "flush subflows and signal with port" 3 3 3 |
1823 | chk_add_nr 1 1 | |
1824 | chk_rm_nr 2 2 | |
1825 | ||
1826 | # multiple addresses with port | |
1827 | reset | |
34aa6e3b GT |
1828 | pm_nl_set_limits $ns1 2 2 |
1829 | pm_nl_add_endpoint $ns1 10.0.2.1 flags signal port 10100 | |
1830 | pm_nl_add_endpoint $ns1 10.0.3.1 flags signal port 10100 | |
1831 | pm_nl_set_limits $ns2 2 2 | |
1002b89f GT |
1832 | run_tests $ns1 $ns2 10.0.1.1 |
1833 | chk_join_nr "multiple addresses with port" 2 2 2 | |
1834 | chk_add_nr 2 2 2 | |
1835 | ||
1836 | # multiple addresses with ports | |
1837 | reset | |
34aa6e3b GT |
1838 | pm_nl_set_limits $ns1 2 2 |
1839 | pm_nl_add_endpoint $ns1 10.0.2.1 flags signal port 10100 | |
1840 | pm_nl_add_endpoint $ns1 10.0.3.1 flags signal port 10101 | |
1841 | pm_nl_set_limits $ns2 2 2 | |
1002b89f GT |
1842 | run_tests $ns1 $ns2 10.0.1.1 |
1843 | chk_join_nr "multiple addresses with ports" 2 2 2 | |
1844 | chk_add_nr 2 2 2 | |
1845 | } | |
1846 | ||
1847 | syncookies_tests() | |
1848 | { | |
1849 | # single subflow, syncookies | |
1850 | reset_with_cookies | |
34aa6e3b GT |
1851 | pm_nl_set_limits $ns1 0 1 |
1852 | pm_nl_set_limits $ns2 0 1 | |
1853 | pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow | |
1002b89f GT |
1854 | run_tests $ns1 $ns2 10.0.1.1 |
1855 | chk_join_nr "single subflow with syn cookies" 1 1 1 | |
1856 | ||
1857 | # multiple subflows with syn cookies | |
1858 | reset_with_cookies | |
34aa6e3b GT |
1859 | pm_nl_set_limits $ns1 0 2 |
1860 | pm_nl_set_limits $ns2 0 2 | |
1861 | pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow | |
1862 | pm_nl_add_endpoint $ns2 10.0.2.2 flags subflow | |
1002b89f GT |
1863 | run_tests $ns1 $ns2 10.0.1.1 |
1864 | chk_join_nr "multiple subflows with syn cookies" 2 2 2 | |
1865 | ||
1866 | # multiple subflows limited by server | |
1867 | reset_with_cookies | |
34aa6e3b GT |
1868 | pm_nl_set_limits $ns1 0 1 |
1869 | pm_nl_set_limits $ns2 0 2 | |
1870 | pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow | |
1871 | pm_nl_add_endpoint $ns2 10.0.2.2 flags subflow | |
1002b89f | 1872 | run_tests $ns1 $ns2 10.0.1.1 |
a7da4416 | 1873 | chk_join_nr "subflows limited by server w cookies" 2 1 1 |
1002b89f GT |
1874 | |
1875 | # test signal address with cookies | |
1876 | reset_with_cookies | |
34aa6e3b GT |
1877 | pm_nl_set_limits $ns1 0 1 |
1878 | pm_nl_set_limits $ns2 1 1 | |
1879 | pm_nl_add_endpoint $ns1 10.0.2.1 flags signal | |
1002b89f GT |
1880 | run_tests $ns1 $ns2 10.0.1.1 |
1881 | chk_join_nr "signal address with syn cookies" 1 1 1 | |
1882 | chk_add_nr 1 1 | |
1883 | ||
1884 | # test cookie with subflow and signal | |
1885 | reset_with_cookies | |
34aa6e3b GT |
1886 | pm_nl_add_endpoint $ns1 10.0.2.1 flags signal |
1887 | pm_nl_set_limits $ns1 0 2 | |
1888 | pm_nl_set_limits $ns2 1 2 | |
1889 | pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow | |
1002b89f GT |
1890 | run_tests $ns1 $ns2 10.0.1.1 |
1891 | chk_join_nr "subflow and signal w cookies" 2 2 2 | |
1892 | chk_add_nr 1 1 | |
1893 | ||
1894 | # accept and use add_addr with additional subflows | |
1895 | reset_with_cookies | |
34aa6e3b GT |
1896 | pm_nl_set_limits $ns1 0 3 |
1897 | pm_nl_add_endpoint $ns1 10.0.2.1 flags signal | |
1898 | pm_nl_set_limits $ns2 1 3 | |
1899 | pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow | |
1900 | pm_nl_add_endpoint $ns2 10.0.4.2 flags subflow | |
1002b89f GT |
1901 | run_tests $ns1 $ns2 10.0.1.1 |
1902 | chk_join_nr "subflows and signal w. cookies" 3 3 3 | |
1903 | chk_add_nr 1 1 | |
1904 | } | |
1905 | ||
af66d3e1 GT |
1906 | checksum_tests() |
1907 | { | |
1908 | # checksum test 0 0 | |
1909 | reset_with_checksum 0 0 | |
34aa6e3b GT |
1910 | pm_nl_set_limits $ns1 0 1 |
1911 | pm_nl_set_limits $ns2 0 1 | |
af66d3e1 GT |
1912 | run_tests $ns1 $ns2 10.0.1.1 |
1913 | chk_csum_nr "checksum test 0 0" | |
1914 | ||
1915 | # checksum test 1 1 | |
1916 | reset_with_checksum 1 1 | |
34aa6e3b GT |
1917 | pm_nl_set_limits $ns1 0 1 |
1918 | pm_nl_set_limits $ns2 0 1 | |
af66d3e1 GT |
1919 | run_tests $ns1 $ns2 10.0.1.1 |
1920 | chk_csum_nr "checksum test 1 1" | |
1921 | ||
1922 | # checksum test 0 1 | |
1923 | reset_with_checksum 0 1 | |
34aa6e3b GT |
1924 | pm_nl_set_limits $ns1 0 1 |
1925 | pm_nl_set_limits $ns2 0 1 | |
af66d3e1 GT |
1926 | run_tests $ns1 $ns2 10.0.1.1 |
1927 | chk_csum_nr "checksum test 0 1" | |
1928 | ||
1929 | # checksum test 1 0 | |
1930 | reset_with_checksum 1 0 | |
34aa6e3b GT |
1931 | pm_nl_set_limits $ns1 0 1 |
1932 | pm_nl_set_limits $ns2 0 1 | |
af66d3e1 GT |
1933 | run_tests $ns1 $ns2 10.0.1.1 |
1934 | chk_csum_nr "checksum test 1 0" | |
1935 | } | |
1936 | ||
0cddb4a6 GT |
1937 | deny_join_id0_tests() |
1938 | { | |
1939 | # subflow allow join id0 ns1 | |
1940 | reset_with_allow_join_id0 1 0 | |
34aa6e3b GT |
1941 | pm_nl_set_limits $ns1 1 1 |
1942 | pm_nl_set_limits $ns2 1 1 | |
1943 | pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow | |
0cddb4a6 GT |
1944 | run_tests $ns1 $ns2 10.0.1.1 |
1945 | chk_join_nr "single subflow allow join id0 ns1" 1 1 1 | |
1946 | ||
1947 | # subflow allow join id0 ns2 | |
1948 | reset_with_allow_join_id0 0 1 | |
34aa6e3b GT |
1949 | pm_nl_set_limits $ns1 1 1 |
1950 | pm_nl_set_limits $ns2 1 1 | |
1951 | pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow | |
0cddb4a6 GT |
1952 | run_tests $ns1 $ns2 10.0.1.1 |
1953 | chk_join_nr "single subflow allow join id0 ns2" 0 0 0 | |
1954 | ||
1955 | # signal address allow join id0 ns1 | |
1956 | # ADD_ADDRs are not affected by allow_join_id0 value. | |
1957 | reset_with_allow_join_id0 1 0 | |
34aa6e3b GT |
1958 | pm_nl_set_limits $ns1 1 1 |
1959 | pm_nl_set_limits $ns2 1 1 | |
1960 | pm_nl_add_endpoint $ns1 10.0.2.1 flags signal | |
0cddb4a6 GT |
1961 | run_tests $ns1 $ns2 10.0.1.1 |
1962 | chk_join_nr "signal address allow join id0 ns1" 1 1 1 | |
1963 | chk_add_nr 1 1 | |
1964 | ||
1965 | # signal address allow join id0 ns2 | |
1966 | # ADD_ADDRs are not affected by allow_join_id0 value. | |
1967 | reset_with_allow_join_id0 0 1 | |
34aa6e3b GT |
1968 | pm_nl_set_limits $ns1 1 1 |
1969 | pm_nl_set_limits $ns2 1 1 | |
1970 | pm_nl_add_endpoint $ns1 10.0.2.1 flags signal | |
0cddb4a6 GT |
1971 | run_tests $ns1 $ns2 10.0.1.1 |
1972 | chk_join_nr "signal address allow join id0 ns2" 1 1 1 | |
1973 | chk_add_nr 1 1 | |
1974 | ||
1975 | # subflow and address allow join id0 ns1 | |
1976 | reset_with_allow_join_id0 1 0 | |
34aa6e3b GT |
1977 | pm_nl_set_limits $ns1 2 2 |
1978 | pm_nl_set_limits $ns2 2 2 | |
1979 | pm_nl_add_endpoint $ns1 10.0.2.1 flags signal | |
1980 | pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow | |
0cddb4a6 GT |
1981 | run_tests $ns1 $ns2 10.0.1.1 |
1982 | chk_join_nr "subflow and address allow join id0 1" 2 2 2 | |
1983 | ||
1984 | # subflow and address allow join id0 ns2 | |
1985 | reset_with_allow_join_id0 0 1 | |
34aa6e3b GT |
1986 | pm_nl_set_limits $ns1 2 2 |
1987 | pm_nl_set_limits $ns2 2 2 | |
1988 | pm_nl_add_endpoint $ns1 10.0.2.1 flags signal | |
1989 | pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow | |
0cddb4a6 GT |
1990 | run_tests $ns1 $ns2 10.0.1.1 |
1991 | chk_join_nr "subflow and address allow join id0 2" 1 1 1 | |
1992 | } | |
1993 | ||
4f49d633 GT |
1994 | fullmesh_tests() |
1995 | { | |
1996 | # fullmesh 1 | |
1997 | # 2 fullmesh addrs in ns2, added before the connection, | |
1998 | # 1 non-fullmesh addr in ns1, added during the connection. | |
1999 | reset | |
34aa6e3b GT |
2000 | pm_nl_set_limits $ns1 0 4 |
2001 | pm_nl_set_limits $ns2 1 4 | |
2002 | pm_nl_add_endpoint $ns2 10.0.2.2 flags subflow,fullmesh | |
2003 | pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow,fullmesh | |
4f49d633 GT |
2004 | run_tests $ns1 $ns2 10.0.1.1 0 1 0 slow |
2005 | chk_join_nr "fullmesh test 2x1" 4 4 4 | |
2006 | chk_add_nr 1 1 | |
2007 | ||
2008 | # fullmesh 2 | |
2009 | # 1 non-fullmesh addr in ns1, added before the connection, | |
2010 | # 1 fullmesh addr in ns2, added during the connection. | |
2011 | reset | |
34aa6e3b GT |
2012 | pm_nl_set_limits $ns1 1 3 |
2013 | pm_nl_set_limits $ns2 1 3 | |
2014 | pm_nl_add_endpoint $ns1 10.0.2.1 flags signal | |
4f49d633 GT |
2015 | run_tests $ns1 $ns2 10.0.1.1 0 0 fullmesh_1 slow |
2016 | chk_join_nr "fullmesh test 1x1" 3 3 3 | |
2017 | chk_add_nr 1 1 | |
2018 | ||
2019 | # fullmesh 3 | |
2020 | # 1 non-fullmesh addr in ns1, added before the connection, | |
2021 | # 2 fullmesh addrs in ns2, added during the connection. | |
2022 | reset | |
34aa6e3b GT |
2023 | pm_nl_set_limits $ns1 2 5 |
2024 | pm_nl_set_limits $ns2 1 5 | |
2025 | pm_nl_add_endpoint $ns1 10.0.2.1 flags signal | |
4f49d633 GT |
2026 | run_tests $ns1 $ns2 10.0.1.1 0 0 fullmesh_2 slow |
2027 | chk_join_nr "fullmesh test 1x2" 5 5 5 | |
2028 | chk_add_nr 1 1 | |
2029 | ||
2030 | # fullmesh 4 | |
2031 | # 1 non-fullmesh addr in ns1, added before the connection, | |
2032 | # 2 fullmesh addrs in ns2, added during the connection, | |
2033 | # limit max_subflows to 4. | |
2034 | reset | |
34aa6e3b GT |
2035 | pm_nl_set_limits $ns1 2 4 |
2036 | pm_nl_set_limits $ns2 1 4 | |
2037 | pm_nl_add_endpoint $ns1 10.0.2.1 flags signal | |
4f49d633 GT |
2038 | run_tests $ns1 $ns2 10.0.1.1 0 0 fullmesh_2 slow |
2039 | chk_join_nr "fullmesh test 1x2, limited" 4 4 4 | |
2040 | chk_add_nr 1 1 | |
6a0653b9 GT |
2041 | |
2042 | # set fullmesh flag | |
2043 | reset | |
34aa6e3b GT |
2044 | pm_nl_set_limits $ns1 4 4 |
2045 | pm_nl_add_endpoint $ns1 10.0.2.1 flags subflow | |
2046 | pm_nl_set_limits $ns2 4 4 | |
6a0653b9 GT |
2047 | run_tests $ns1 $ns2 10.0.1.1 0 0 1 slow fullmesh |
2048 | chk_join_nr "set fullmesh flag test" 2 2 2 | |
2049 | chk_rm_nr 0 1 | |
2050 | ||
2051 | # set nofullmesh flag | |
2052 | reset | |
34aa6e3b GT |
2053 | pm_nl_set_limits $ns1 4 4 |
2054 | pm_nl_add_endpoint $ns1 10.0.2.1 flags subflow,fullmesh | |
2055 | pm_nl_set_limits $ns2 4 4 | |
6a0653b9 GT |
2056 | run_tests $ns1 $ns2 10.0.1.1 0 0 fullmesh_1 slow nofullmesh |
2057 | chk_join_nr "set nofullmesh flag test" 2 2 2 | |
2058 | chk_rm_nr 0 1 | |
2059 | ||
2060 | # set backup,fullmesh flags | |
2061 | reset | |
34aa6e3b GT |
2062 | pm_nl_set_limits $ns1 4 4 |
2063 | pm_nl_add_endpoint $ns1 10.0.2.1 flags subflow | |
2064 | pm_nl_set_limits $ns2 4 4 | |
6a0653b9 GT |
2065 | run_tests $ns1 $ns2 10.0.1.1 0 0 1 slow backup,fullmesh |
2066 | chk_join_nr "set backup,fullmesh flags test" 2 2 2 | |
2067 | chk_prio_nr 0 1 | |
2068 | chk_rm_nr 0 1 | |
2069 | ||
2070 | # set nobackup,nofullmesh flags | |
2071 | reset | |
34aa6e3b GT |
2072 | pm_nl_set_limits $ns1 4 4 |
2073 | pm_nl_set_limits $ns2 4 4 | |
2074 | pm_nl_add_endpoint $ns2 10.0.2.2 flags subflow,backup,fullmesh | |
6a0653b9 GT |
2075 | run_tests $ns1 $ns2 10.0.1.1 0 0 0 slow nobackup,nofullmesh |
2076 | chk_join_nr "set nobackup,nofullmesh flags test" 2 2 2 | |
2077 | chk_prio_nr 0 1 | |
2078 | chk_rm_nr 0 1 | |
4f49d633 GT |
2079 | } |
2080 | ||
1002b89f GT |
2081 | all_tests() |
2082 | { | |
2083 | subflows_tests | |
46e967d1 | 2084 | subflows_error_tests |
1002b89f GT |
2085 | signal_address_tests |
2086 | link_failure_tests | |
2087 | add_addr_timeout_tests | |
2088 | remove_tests | |
2089 | add_tests | |
2090 | ipv6_tests | |
2091 | v4mapped_tests | |
2092 | backup_tests | |
2093 | add_addr_ports_tests | |
2094 | syncookies_tests | |
af66d3e1 | 2095 | checksum_tests |
0cddb4a6 | 2096 | deny_join_id0_tests |
4f49d633 | 2097 | fullmesh_tests |
1002b89f GT |
2098 | } |
2099 | ||
2100 | usage() | |
2101 | { | |
2102 | echo "mptcp_join usage:" | |
2103 | echo " -f subflows_tests" | |
46e967d1 | 2104 | echo " -e subflows_error_tests" |
1002b89f GT |
2105 | echo " -s signal_address_tests" |
2106 | echo " -l link_failure_tests" | |
2107 | echo " -t add_addr_timeout_tests" | |
2108 | echo " -r remove_tests" | |
2109 | echo " -a add_tests" | |
2110 | echo " -6 ipv6_tests" | |
2111 | echo " -4 v4mapped_tests" | |
2112 | echo " -b backup_tests" | |
2113 | echo " -p add_addr_ports_tests" | |
a673321a | 2114 | echo " -k syncookies_tests" |
af66d3e1 | 2115 | echo " -S checksum_tests" |
0cddb4a6 | 2116 | echo " -d deny_join_id0_tests" |
4f49d633 | 2117 | echo " -m fullmesh_tests" |
a673321a | 2118 | echo " -c capture pcap files" |
af66d3e1 | 2119 | echo " -C enable data checksum" |
1002b89f GT |
2120 | echo " -h help" |
2121 | } | |
2122 | ||
b08fbf24 PA |
2123 | sin=$(mktemp) |
2124 | sout=$(mktemp) | |
2125 | cin=$(mktemp) | |
8b819a84 | 2126 | cinsent=$(mktemp) |
b08fbf24 PA |
2127 | cout=$(mktemp) |
2128 | init | |
8b819a84 FW |
2129 | make_file "$cin" "client" 1 |
2130 | make_file "$sin" "server" 1 | |
b08fbf24 PA |
2131 | trap cleanup EXIT |
2132 | ||
a673321a | 2133 | for arg in "$@"; do |
af66d3e1 | 2134 | # check for "capture/checksum" args before launching tests |
a673321a MM |
2135 | if [[ "${arg}" =~ ^"-"[0-9a-zA-Z]*"c"[0-9a-zA-Z]*$ ]]; then |
2136 | capture=1 | |
2137 | fi | |
af66d3e1 GT |
2138 | if [[ "${arg}" =~ ^"-"[0-9a-zA-Z]*"C"[0-9a-zA-Z]*$ ]]; then |
2139 | checksum=1 | |
2140 | fi | |
a673321a | 2141 | |
af66d3e1 GT |
2142 | # exception for the capture/checksum options, the rest means: a part of the tests |
2143 | if [ "${arg}" != "-c" ] && [ "${arg}" != "-C" ]; then | |
a673321a MM |
2144 | do_all_tests=0 |
2145 | fi | |
2146 | done | |
2147 | ||
2148 | if [ $do_all_tests -eq 1 ]; then | |
1002b89f GT |
2149 | all_tests |
2150 | exit $ret | |
2151 | fi | |
2152 | ||
46e967d1 | 2153 | while getopts 'fesltra64bpkdmchCS' opt; do |
1002b89f GT |
2154 | case $opt in |
2155 | f) | |
2156 | subflows_tests | |
2157 | ;; | |
46e967d1 PA |
2158 | e) |
2159 | subflows_error_tests | |
2160 | ;; | |
1002b89f GT |
2161 | s) |
2162 | signal_address_tests | |
2163 | ;; | |
2164 | l) | |
2165 | link_failure_tests | |
2166 | ;; | |
2167 | t) | |
2168 | add_addr_timeout_tests | |
2169 | ;; | |
2170 | r) | |
2171 | remove_tests | |
2172 | ;; | |
2173 | a) | |
2174 | add_tests | |
2175 | ;; | |
2176 | 6) | |
2177 | ipv6_tests | |
2178 | ;; | |
2179 | 4) | |
2180 | v4mapped_tests | |
2181 | ;; | |
2182 | b) | |
2183 | backup_tests | |
2184 | ;; | |
2185 | p) | |
2186 | add_addr_ports_tests | |
2187 | ;; | |
a673321a | 2188 | k) |
1002b89f GT |
2189 | syncookies_tests |
2190 | ;; | |
af66d3e1 GT |
2191 | S) |
2192 | checksum_tests | |
2193 | ;; | |
0cddb4a6 GT |
2194 | d) |
2195 | deny_join_id0_tests | |
2196 | ;; | |
4f49d633 GT |
2197 | m) |
2198 | fullmesh_tests | |
2199 | ;; | |
a673321a MM |
2200 | c) |
2201 | ;; | |
af66d3e1 GT |
2202 | C) |
2203 | ;; | |
1002b89f GT |
2204 | h | *) |
2205 | usage | |
2206 | ;; | |
2207 | esac | |
2208 | done | |
00587187 | 2209 | |
b08fbf24 | 2210 | exit $ret |