mptcp: add deny_join_id0 in mptcp_options_received
[linux-2.6-block.git] / tools / testing / selftests / net / mptcp / mptcp_join.sh
CommitLineData
b08fbf24
PA
1#!/bin/bash
2# SPDX-License-Identifier: GPL-2.0
3
4ret=0
5sin=""
6sout=""
7cin=""
8b819a84 8cinsent=""
b08fbf24
PA
9cout=""
10ksft_skip=4
5888a61c
MB
11timeout_poll=30
12timeout_test=$((timeout_poll * 2 + 1))
dd72b0fe 13mptcp_connect=""
b08fbf24 14capture=0
af66d3e1 15checksum=0
a673321a 16do_all_tests=1
b08fbf24
PA
17
18TEST_COUNT=0
19
8d014eaa
GT
20# generated using "nfbpf_compile '(ip && (ip[54] & 0xf0) == 0x30) ||
21# (ip6 && (ip6[74] & 0xf0) == 0x30)'"
22CBPF_MPTCP_SUBOPTION_ADD_ADDR="14,
23 48 0 0 0,
24 84 0 0 240,
25 21 0 3 64,
26 48 0 0 54,
27 84 0 0 240,
28 21 6 7 48,
29 48 0 0 0,
30 84 0 0 240,
31 21 0 4 96,
32 48 0 0 74,
33 84 0 0 240,
34 21 0 1 48,
35 6 0 0 65535,
36 6 0 0 0"
37
b08fbf24
PA
38init()
39{
40 capout=$(mktemp)
41
42 rndh=$(printf %x $sec)-$(mktemp -u XXXXXX)
43
44 ns1="ns1-$rndh"
45 ns2="ns2-$rndh"
46
47 for netns in "$ns1" "$ns2";do
48 ip netns add $netns || exit $ksft_skip
49 ip -net $netns link set lo up
50 ip netns exec $netns sysctl -q net.mptcp.enabled=1
51 ip netns exec $netns sysctl -q net.ipv4.conf.all.rp_filter=0
52 ip netns exec $netns sysctl -q net.ipv4.conf.default.rp_filter=0
af66d3e1
GT
53 if [ $checksum -eq 1 ]; then
54 ip netns exec $netns sysctl -q net.mptcp.checksum_enabled=1
55 fi
b08fbf24
PA
56 done
57
58 # ns1 ns2
59 # ns1eth1 ns2eth1
60 # ns1eth2 ns2eth2
61 # ns1eth3 ns2eth3
62 # ns1eth4 ns2eth4
63
64 for i in `seq 1 4`; do
65 ip link add ns1eth$i netns "$ns1" type veth peer name ns2eth$i netns "$ns2"
66 ip -net "$ns1" addr add 10.0.$i.1/24 dev ns1eth$i
67 ip -net "$ns1" addr add dead:beef:$i::1/64 dev ns1eth$i nodad
68 ip -net "$ns1" link set ns1eth$i up
69
70 ip -net "$ns2" addr add 10.0.$i.2/24 dev ns2eth$i
71 ip -net "$ns2" addr add dead:beef:$i::2/64 dev ns2eth$i nodad
72 ip -net "$ns2" link set ns2eth$i up
73
74 # let $ns2 reach any $ns1 address from any interface
75 ip -net "$ns2" route add default via 10.0.$i.1 dev ns2eth$i metric 10$i
76 done
77}
78
79cleanup_partial()
80{
81 rm -f "$capout"
82
83 for netns in "$ns1" "$ns2"; do
84 ip netns del $netns
c2a55e8f 85 rm -f /tmp/$netns.{nstat,out}
b08fbf24
PA
86 done
87}
88
89cleanup()
90{
91 rm -f "$cin" "$cout"
8b819a84 92 rm -f "$sin" "$sout" "$cinsent"
b08fbf24
PA
93 cleanup_partial
94}
95
96reset()
97{
98 cleanup_partial
99 init
100}
101
00587187
FW
102reset_with_cookies()
103{
104 reset
105
106 for netns in "$ns1" "$ns2";do
107 ip netns exec $netns sysctl -q net.ipv4.tcp_syncookies=2
108 done
109}
110
8d014eaa
GT
111reset_with_add_addr_timeout()
112{
113 local ip="${1:-4}"
114 local tables
115
116 tables="iptables"
117 if [ $ip -eq 6 ]; then
118 tables="ip6tables"
119 fi
120
121 reset
122
123 ip netns exec $ns1 sysctl -q net.mptcp.add_addr_timeout=1
124 ip netns exec $ns2 $tables -A OUTPUT -p tcp \
125 -m tcp --tcp-option 30 \
126 -m bpf --bytecode \
127 "$CBPF_MPTCP_SUBOPTION_ADD_ADDR" \
128 -j DROP
129}
130
af66d3e1
GT
131reset_with_checksum()
132{
133 local ns1_enable=$1
134 local ns2_enable=$2
135
136 reset
137
138 ip netns exec $ns1 sysctl -q net.mptcp.checksum_enabled=$ns1_enable
139 ip netns exec $ns2 sysctl -q net.mptcp.checksum_enabled=$ns2_enable
140}
141
b08fbf24
PA
142ip -Version > /dev/null 2>&1
143if [ $? -ne 0 ];then
144 echo "SKIP: Could not run test without ip tool"
145 exit $ksft_skip
146fi
147
8d014eaa
GT
148iptables -V > /dev/null 2>&1
149if [ $? -ne 0 ];then
150 echo "SKIP: Could not run all tests without iptables tool"
151 exit $ksft_skip
152fi
153
154ip6tables -V > /dev/null 2>&1
155if [ $? -ne 0 ];then
156 echo "SKIP: Could not run all tests without ip6tables tool"
157 exit $ksft_skip
158fi
b08fbf24 159
8b819a84
FW
160print_file_err()
161{
162 ls -l "$1" 1>&2
163 echo "Trailing bytes are: "
164 tail -c 27 "$1"
165}
166
b08fbf24
PA
167check_transfer()
168{
169 in=$1
170 out=$2
171 what=$3
172
173 cmp "$in" "$out" > /dev/null 2>&1
174 if [ $? -ne 0 ] ;then
175 echo "[ FAIL ] $what does not match (in, out):"
176 print_file_err "$in"
177 print_file_err "$out"
8b819a84 178 ret=1
b08fbf24
PA
179
180 return 1
181 fi
182
183 return 0
184}
185
186do_ping()
187{
188 listener_ns="$1"
189 connector_ns="$2"
190 connect_addr="$3"
191
192 ip netns exec ${connector_ns} ping -q -c 1 $connect_addr >/dev/null
193 if [ $? -ne 0 ] ; then
194 echo "$listener_ns -> $connect_addr connectivity [ FAIL ]" 1>&2
195 ret=1
196 fi
197}
198
8b819a84
FW
199link_failure()
200{
201 ns="$1"
202
203 l=$((RANDOM%4))
204 l=$((l+1))
205
206 veth="ns1eth$l"
207 ip -net "$ns" link set "$veth" down
208}
209
523514ed
GT
210# $1: IP address
211is_v6()
212{
213 [ -z "${1##*:*}" ]
214}
215
b08fbf24
PA
216do_transfer()
217{
218 listener_ns="$1"
219 connector_ns="$2"
220 cl_proto="$3"
221 srv_proto="$4"
222 connect_addr="$5"
8b819a84 223 test_link_fail="$6"
2e8cbf45
GT
224 addr_nr_ns1="$7"
225 addr_nr_ns2="$8"
8b819a84 226 speed="$9"
718eb44e 227 bkup="${10}"
b08fbf24
PA
228
229 port=$((10000+$TEST_COUNT))
230 TEST_COUNT=$((TEST_COUNT+1))
231
232 :> "$cout"
233 :> "$sout"
234 :> "$capout"
235
236 if [ $capture -eq 1 ]; then
237 if [ -z $SUDO_USER ] ; then
238 capuser=""
239 else
240 capuser="-Z $SUDO_USER"
241 fi
242
00587187 243 capfile=$(printf "mp_join-%02u-%s.pcap" "$TEST_COUNT" "${listener_ns}")
b08fbf24
PA
244
245 echo "Capturing traffic for test $TEST_COUNT into $capfile"
246 ip netns exec ${listener_ns} tcpdump -i any -s 65535 -B 32768 $capuser -w $capfile > "$capout" 2>&1 &
247 cappid=$!
248
249 sleep 1
250 fi
251
c2a55e8f
MB
252 NSTAT_HISTORY=/tmp/${listener_ns}.nstat ip netns exec ${listener_ns} \
253 nstat -n
254 NSTAT_HISTORY=/tmp/${connector_ns}.nstat ip netns exec ${connector_ns} \
255 nstat -n
256
8d014eaa 257 if [ $speed = "fast" ]; then
dd72b0fe 258 mptcp_connect="./mptcp_connect -j"
8da6229b
GT
259 elif [ $speed = "slow" ]; then
260 mptcp_connect="./mptcp_connect -r 50"
261 elif [ $speed = "least" ]; then
262 mptcp_connect="./mptcp_connect -r 10"
dd72b0fe
GT
263 fi
264
523514ed
GT
265 local local_addr
266 if is_v6 "${connect_addr}"; then
267 local_addr="::"
268 else
269 local_addr="0.0.0.0"
270 fi
271
5888a61c
MB
272 timeout ${timeout_test} \
273 ip netns exec ${listener_ns} \
274 $mptcp_connect -t ${timeout_poll} -l -p $port -s ${srv_proto} \
275 ${local_addr} < "$sin" > "$sout" &
b08fbf24
PA
276 spid=$!
277
278 sleep 1
279
8b819a84 280 if [ "$test_link_fail" -eq 0 ];then
5888a61c
MB
281 timeout ${timeout_test} \
282 ip netns exec ${connector_ns} \
283 $mptcp_connect -t ${timeout_poll} -p $port -s ${cl_proto} \
284 $connect_addr < "$cin" > "$cout" &
8b819a84 285 else
5888a61c
MB
286 ( cat "$cin" ; sleep 2; link_failure $listener_ns ; cat "$cin" ) | \
287 tee "$cinsent" | \
288 timeout ${timeout_test} \
289 ip netns exec ${connector_ns} \
290 $mptcp_connect -t ${timeout_poll} -p $port -s ${cl_proto} \
291 $connect_addr > "$cout" &
8b819a84 292 fi
b08fbf24
PA
293 cpid=$!
294
6208fd82
GT
295 if [ $addr_nr_ns1 -gt 0 ]; then
296 let add_nr_ns1=addr_nr_ns1
297 counter=2
298 sleep 1
299 while [ $add_nr_ns1 -gt 0 ]; do
300 local addr
301 if is_v6 "${connect_addr}"; then
302 addr="dead:beef:$counter::1"
303 else
304 addr="10.0.$counter.1"
305 fi
306 ip netns exec $ns1 ./pm_nl_ctl add $addr flags signal
307 let counter+=1
308 let add_nr_ns1-=1
309 done
310 sleep 1
311 elif [ $addr_nr_ns1 -lt 0 ]; then
2e8cbf45 312 let rm_nr_ns1=-addr_nr_ns1
6fe4ccdc
GT
313 if [ $rm_nr_ns1 -lt 8 ]; then
314 counter=1
f87744ad
GT
315 dump=(`ip netns exec ${listener_ns} ./pm_nl_ctl dump`)
316 if [ ${#dump[@]} -gt 0 ]; then
317 id=${dump[1]}
6fe4ccdc 318 sleep 1
f87744ad
GT
319
320 while [ $counter -le $rm_nr_ns1 ]
321 do
322 ip netns exec ${listener_ns} ./pm_nl_ctl del $id
323 sleep 1
324 let counter+=1
325 let id+=1
326 done
327 fi
5e287fe7 328 elif [ $rm_nr_ns1 -eq 8 ]; then
dd72b0fe 329 sleep 1
6fe4ccdc 330 ip netns exec ${listener_ns} ./pm_nl_ctl flush
5e287fe7
GT
331 elif [ $rm_nr_ns1 -eq 9 ]; then
332 sleep 1
333 ip netns exec ${listener_ns} ./pm_nl_ctl del 0 ${connect_addr}
6fe4ccdc 334 fi
dd72b0fe
GT
335 fi
336
6208fd82
GT
337 if [ $addr_nr_ns2 -gt 0 ]; then
338 let add_nr_ns2=addr_nr_ns2
339 counter=3
340 sleep 1
341 while [ $add_nr_ns2 -gt 0 ]; do
342 local addr
343 if is_v6 "${connect_addr}"; then
344 addr="dead:beef:$counter::2"
345 else
346 addr="10.0.$counter.2"
347 fi
348 ip netns exec $ns2 ./pm_nl_ctl add $addr flags subflow
349 let counter+=1
350 let add_nr_ns2-=1
351 done
352 sleep 1
353 elif [ $addr_nr_ns2 -lt 0 ]; then
2e8cbf45 354 let rm_nr_ns2=-addr_nr_ns2
6fe4ccdc
GT
355 if [ $rm_nr_ns2 -lt 8 ]; then
356 counter=1
f87744ad
GT
357 dump=(`ip netns exec ${connector_ns} ./pm_nl_ctl dump`)
358 if [ ${#dump[@]} -gt 0 ]; then
359 id=${dump[1]}
6fe4ccdc 360 sleep 1
f87744ad
GT
361
362 while [ $counter -le $rm_nr_ns2 ]
363 do
364 ip netns exec ${connector_ns} ./pm_nl_ctl del $id
365 sleep 1
366 let counter+=1
367 let id+=1
368 done
369 fi
5e287fe7 370 elif [ $rm_nr_ns2 -eq 8 ]; then
dd72b0fe 371 sleep 1
6fe4ccdc 372 ip netns exec ${connector_ns} ./pm_nl_ctl flush
5e287fe7
GT
373 elif [ $rm_nr_ns2 -eq 9 ]; then
374 local addr
375 if is_v6 "${connect_addr}"; then
376 addr="dead:beef:1::2"
377 else
378 addr="10.0.1.2"
379 fi
380 sleep 1
381 ip netns exec ${connector_ns} ./pm_nl_ctl del 0 $addr
6fe4ccdc 382 fi
dd72b0fe
GT
383 fi
384
718eb44e
GT
385 if [ ! -z $bkup ]; then
386 sleep 1
387 for netns in "$ns1" "$ns2"; do
388 dump=(`ip netns exec $netns ./pm_nl_ctl dump`)
389 if [ ${#dump[@]} -gt 0 ]; then
390 addr=${dump[${#dump[@]} - 1]}
391 backup="ip netns exec $netns ./pm_nl_ctl set $addr flags $bkup"
392 $backup
393 fi
394 done
395 fi
396
b08fbf24
PA
397 wait $cpid
398 retc=$?
399 wait $spid
400 rets=$?
401
402 if [ $capture -eq 1 ]; then
403 sleep 1
404 kill $cappid
405 fi
406
c2a55e8f
MB
407 NSTAT_HISTORY=/tmp/${listener_ns}.nstat ip netns exec ${listener_ns} \
408 nstat | grep Tcp > /tmp/${listener_ns}.out
409 NSTAT_HISTORY=/tmp/${connector_ns}.nstat ip netns exec ${connector_ns} \
410 nstat | grep Tcp > /tmp/${connector_ns}.out
411
b08fbf24
PA
412 if [ ${rets} -ne 0 ] || [ ${retc} -ne 0 ]; then
413 echo " client exit code $retc, server $rets" 1>&2
8b974778 414 echo -e "\nnetns ${listener_ns} socket stat for ${port}:" 1>&2
c2a55e8f
MB
415 ip netns exec ${listener_ns} ss -Menita 1>&2 -o "sport = :$port"
416 cat /tmp/${listener_ns}.out
8b974778 417 echo -e "\nnetns ${connector_ns} socket stat for ${port}:" 1>&2
c2a55e8f
MB
418 ip netns exec ${connector_ns} ss -Menita 1>&2 -o "dport = :$port"
419 cat /tmp/${connector_ns}.out
b08fbf24
PA
420
421 cat "$capout"
8b819a84 422 ret=1
b08fbf24
PA
423 return 1
424 fi
425
426 check_transfer $sin $cout "file received by client"
427 retc=$?
8b819a84
FW
428 if [ "$test_link_fail" -eq 0 ];then
429 check_transfer $cin $sout "file received by server"
430 else
431 check_transfer $cinsent $sout "file received by server"
432 fi
b08fbf24
PA
433 rets=$?
434
435 if [ $retc -eq 0 ] && [ $rets -eq 0 ];then
436 cat "$capout"
437 return 0
438 fi
439
440 cat "$capout"
441 return 1
442}
443
444make_file()
445{
446 name=$1
447 who=$2
8b819a84 448 size=$3
b08fbf24 449
8b819a84 450 dd if=/dev/urandom of="$name" bs=1024 count=$size 2> /dev/null
b08fbf24
PA
451 echo -e "\nMPTCP_TEST_FILE_END_MARKER" >> "$name"
452
8b819a84 453 echo "Created $name (size $size KB) containing data sent by $who"
b08fbf24
PA
454}
455
456run_tests()
457{
458 listener_ns="$1"
459 connector_ns="$2"
460 connect_addr="$3"
8b819a84 461 test_linkfail="${4:-0}"
2e8cbf45
GT
462 addr_nr_ns1="${5:-0}"
463 addr_nr_ns2="${6:-0}"
8b819a84 464 speed="${7:-fast}"
718eb44e 465 bkup="${8:-""}"
b08fbf24 466 lret=0
8b819a84
FW
467 oldin=""
468
469 if [ "$test_linkfail" -eq 1 ];then
470 size=$((RANDOM%1024))
471 size=$((size+1))
472 size=$((size*128))
473
474 oldin=$(mktemp)
475 cp "$cin" "$oldin"
476 make_file "$cin" "client" $size
477 fi
b08fbf24 478
8d014eaa 479 do_transfer ${listener_ns} ${connector_ns} MPTCP MPTCP ${connect_addr} \
2e8cbf45 480 ${test_linkfail} ${addr_nr_ns1} ${addr_nr_ns2} ${speed} ${bkup}
b08fbf24 481 lret=$?
8b819a84
FW
482
483 if [ "$test_linkfail" -eq 1 ];then
484 cp "$oldin" "$cin"
485 rm -f "$oldin"
486 fi
487
b08fbf24
PA
488 if [ $lret -ne 0 ]; then
489 ret=$lret
490 return
491 fi
492}
493
af66d3e1
GT
494chk_csum_nr()
495{
496 local msg=${1:-""}
497 local count
498 local dump_stats
499
500 if [ ! -z "$msg" ]; then
501 printf "%02u" "$TEST_COUNT"
502 else
503 echo -n " "
504 fi
505 printf " %-36s %s" "$msg" "sum"
506 count=`ip netns exec $ns1 nstat -as | grep MPTcpExtDataCsumErr | awk '{print $2}'`
507 [ -z "$count" ] && count=0
508 if [ "$count" != 0 ]; then
509 echo "[fail] got $count data checksum error[s] expected 0"
510 ret=1
511 dump_stats=1
512 else
513 echo -n "[ ok ]"
514 fi
515 echo -n " - csum "
516 count=`ip netns exec $ns2 nstat -as | grep MPTcpExtDataCsumErr | awk '{print $2}'`
517 [ -z "$count" ] && count=0
518 if [ "$count" != 0 ]; then
519 echo "[fail] got $count data checksum error[s] expected 0"
520 ret=1
521 dump_stats=1
522 else
523 echo "[ ok ]"
524 fi
525 if [ "${dump_stats}" = 1 ]; then
526 echo Server ns stats
527 ip netns exec $ns1 nstat -as | grep MPTcp
528 echo Client ns stats
529 ip netns exec $ns2 nstat -as | grep MPTcp
530 fi
531}
532
b08fbf24
PA
533chk_join_nr()
534{
535 local msg="$1"
536 local syn_nr=$2
537 local syn_ack_nr=$3
538 local ack_nr=$4
539 local count
540 local dump_stats
541
00587187 542 printf "%02u %-36s %s" "$TEST_COUNT" "$msg" "syn"
b08fbf24
PA
543 count=`ip netns exec $ns1 nstat -as | grep MPTcpExtMPJoinSynRx | awk '{print $2}'`
544 [ -z "$count" ] && count=0
545 if [ "$count" != "$syn_nr" ]; then
546 echo "[fail] got $count JOIN[s] syn expected $syn_nr"
547 ret=1
548 dump_stats=1
549 else
550 echo -n "[ ok ]"
551 fi
552
553 echo -n " - synack"
554 count=`ip netns exec $ns2 nstat -as | grep MPTcpExtMPJoinSynAckRx | awk '{print $2}'`
555 [ -z "$count" ] && count=0
556 if [ "$count" != "$syn_ack_nr" ]; then
557 echo "[fail] got $count JOIN[s] synack expected $syn_ack_nr"
558 ret=1
559 dump_stats=1
560 else
561 echo -n "[ ok ]"
562 fi
563
564 echo -n " - ack"
565 count=`ip netns exec $ns1 nstat -as | grep MPTcpExtMPJoinAckRx | awk '{print $2}'`
566 [ -z "$count" ] && count=0
567 if [ "$count" != "$ack_nr" ]; then
568 echo "[fail] got $count JOIN[s] ack expected $ack_nr"
569 ret=1
570 dump_stats=1
571 else
572 echo "[ ok ]"
573 fi
574 if [ "${dump_stats}" = 1 ]; then
575 echo Server ns stats
576 ip netns exec $ns1 nstat -as | grep MPTcp
577 echo Client ns stats
578 ip netns exec $ns2 nstat -as | grep MPTcp
579 fi
af66d3e1
GT
580 if [ $checksum -eq 1 ]; then
581 chk_csum_nr
582 fi
b08fbf24
PA
583}
584
be613160
GT
585chk_add_nr()
586{
587 local add_nr=$1
588 local echo_nr=$2
8a127bf6
GT
589 local port_nr=${3:-0}
590 local syn_nr=${4:-$port_nr}
591 local syn_ack_nr=${5:-$port_nr}
592 local ack_nr=${6:-$port_nr}
593 local mis_syn_nr=${7:-0}
594 local mis_ack_nr=${8:-0}
be613160
GT
595 local count
596 local dump_stats
597
598 printf "%-39s %s" " " "add"
599 count=`ip netns exec $ns2 nstat -as | grep MPTcpExtAddAddr | awk '{print $2}'`
600 [ -z "$count" ] && count=0
601 if [ "$count" != "$add_nr" ]; then
602 echo "[fail] got $count ADD_ADDR[s] expected $add_nr"
603 ret=1
604 dump_stats=1
605 else
606 echo -n "[ ok ]"
607 fi
608
609 echo -n " - echo "
610 count=`ip netns exec $ns1 nstat -as | grep MPTcpExtEchoAdd | awk '{print $2}'`
611 [ -z "$count" ] && count=0
612 if [ "$count" != "$echo_nr" ]; then
613 echo "[fail] got $count ADD_ADDR echo[s] expected $echo_nr"
614 ret=1
615 dump_stats=1
616 else
8a127bf6
GT
617 echo -n "[ ok ]"
618 fi
619
620 if [ $port_nr -gt 0 ]; then
621 echo -n " - pt "
622 count=`ip netns exec $ns2 nstat -as | grep MPTcpExtPortAdd | awk '{print $2}'`
623 [ -z "$count" ] && count=0
624 if [ "$count" != "$port_nr" ]; then
625 echo "[fail] got $count ADD_ADDR[s] with a port-number expected $port_nr"
626 ret=1
627 dump_stats=1
628 else
629 echo "[ ok ]"
630 fi
631
632 printf "%-39s %s" " " "syn"
633 count=`ip netns exec $ns1 nstat -as | grep MPTcpExtMPJoinPortSynRx |
634 awk '{print $2}'`
635 [ -z "$count" ] && count=0
636 if [ "$count" != "$syn_nr" ]; then
637 echo "[fail] got $count JOIN[s] syn with a different \
638 port-number expected $syn_nr"
639 ret=1
640 dump_stats=1
641 else
642 echo -n "[ ok ]"
643 fi
644
645 echo -n " - synack"
646 count=`ip netns exec $ns2 nstat -as | grep MPTcpExtMPJoinPortSynAckRx |
647 awk '{print $2}'`
648 [ -z "$count" ] && count=0
649 if [ "$count" != "$syn_ack_nr" ]; then
650 echo "[fail] got $count JOIN[s] synack with a different \
651 port-number expected $syn_ack_nr"
652 ret=1
653 dump_stats=1
654 else
655 echo -n "[ ok ]"
656 fi
657
658 echo -n " - ack"
659 count=`ip netns exec $ns1 nstat -as | grep MPTcpExtMPJoinPortAckRx |
660 awk '{print $2}'`
661 [ -z "$count" ] && count=0
662 if [ "$count" != "$ack_nr" ]; then
663 echo "[fail] got $count JOIN[s] ack with a different \
664 port-number expected $ack_nr"
665 ret=1
666 dump_stats=1
667 else
668 echo "[ ok ]"
669 fi
670
671 printf "%-39s %s" " " "syn"
672 count=`ip netns exec $ns1 nstat -as | grep MPTcpExtMismatchPortSynRx |
673 awk '{print $2}'`
674 [ -z "$count" ] && count=0
675 if [ "$count" != "$mis_syn_nr" ]; then
676 echo "[fail] got $count JOIN[s] syn with a mismatched \
677 port-number expected $mis_syn_nr"
678 ret=1
679 dump_stats=1
680 else
681 echo -n "[ ok ]"
682 fi
683
684 echo -n " - ack "
685 count=`ip netns exec $ns1 nstat -as | grep MPTcpExtMismatchPortAckRx |
686 awk '{print $2}'`
687 [ -z "$count" ] && count=0
688 if [ "$count" != "$mis_ack_nr" ]; then
689 echo "[fail] got $count JOIN[s] ack with a mismatched \
690 port-number expected $mis_ack_nr"
691 ret=1
692 dump_stats=1
693 else
694 echo "[ ok ]"
695 fi
696 else
697 echo ""
be613160
GT
698 fi
699
700 if [ "${dump_stats}" = 1 ]; then
701 echo Server ns stats
702 ip netns exec $ns1 nstat -as | grep MPTcp
703 echo Client ns stats
704 ip netns exec $ns2 nstat -as | grep MPTcp
705 fi
706}
707
dd72b0fe
GT
708chk_rm_nr()
709{
710 local rm_addr_nr=$1
711 local rm_subflow_nr=$2
7028ba8a 712 local invert=${3:-""}
dd72b0fe
GT
713 local count
714 local dump_stats
7028ba8a
GT
715 local addr_ns
716 local subflow_ns
717
718 if [ -z $invert ]; then
719 addr_ns=$ns1
720 subflow_ns=$ns2
721 elif [ $invert = "invert" ]; then
722 addr_ns=$ns2
723 subflow_ns=$ns1
724 fi
dd72b0fe
GT
725
726 printf "%-39s %s" " " "rm "
7028ba8a 727 count=`ip netns exec $addr_ns nstat -as | grep MPTcpExtRmAddr | awk '{print $2}'`
dd72b0fe
GT
728 [ -z "$count" ] && count=0
729 if [ "$count" != "$rm_addr_nr" ]; then
730 echo "[fail] got $count RM_ADDR[s] expected $rm_addr_nr"
731 ret=1
732 dump_stats=1
733 else
734 echo -n "[ ok ]"
735 fi
736
737 echo -n " - sf "
7028ba8a 738 count=`ip netns exec $subflow_ns nstat -as | grep MPTcpExtRmSubflow | awk '{print $2}'`
dd72b0fe
GT
739 [ -z "$count" ] && count=0
740 if [ "$count" != "$rm_subflow_nr" ]; then
741 echo "[fail] got $count RM_SUBFLOW[s] expected $rm_subflow_nr"
742 ret=1
743 dump_stats=1
744 else
745 echo "[ ok ]"
746 fi
747
748 if [ "${dump_stats}" = 1 ]; then
749 echo Server ns stats
750 ip netns exec $ns1 nstat -as | grep MPTcp
751 echo Client ns stats
752 ip netns exec $ns2 nstat -as | grep MPTcp
753 fi
754}
755
718eb44e
GT
756chk_prio_nr()
757{
758 local mp_prio_nr_tx=$1
759 local mp_prio_nr_rx=$2
760 local count
761 local dump_stats
762
763 printf "%-39s %s" " " "ptx"
764 count=`ip netns exec $ns1 nstat -as | grep MPTcpExtMPPrioTx | awk '{print $2}'`
765 [ -z "$count" ] && count=0
766 if [ "$count" != "$mp_prio_nr_tx" ]; then
767 echo "[fail] got $count MP_PRIO[s] TX expected $mp_prio_nr_tx"
768 ret=1
769 dump_stats=1
770 else
771 echo -n "[ ok ]"
772 fi
773
774 echo -n " - prx "
775 count=`ip netns exec $ns1 nstat -as | grep MPTcpExtMPPrioRx | awk '{print $2}'`
776 [ -z "$count" ] && count=0
777 if [ "$count" != "$mp_prio_nr_rx" ]; then
778 echo "[fail] got $count MP_PRIO[s] RX expected $mp_prio_nr_rx"
779 ret=1
780 dump_stats=1
781 else
782 echo "[ ok ]"
783 fi
784
785 if [ "${dump_stats}" = 1 ]; then
786 echo Server ns stats
787 ip netns exec $ns1 nstat -as | grep MPTcp
788 echo Client ns stats
789 ip netns exec $ns2 nstat -as | grep MPTcp
790 fi
791}
792
1002b89f
GT
793subflows_tests()
794{
795 reset
796 run_tests $ns1 $ns2 10.0.1.1
797 chk_join_nr "no JOIN" "0" "0" "0"
798
799 # subflow limited by client
800 reset
801 ip netns exec $ns2 ./pm_nl_ctl add 10.0.3.2 flags subflow
802 run_tests $ns1 $ns2 10.0.1.1
803 chk_join_nr "single subflow, limited by client" 0 0 0
804
805 # subflow limited by server
806 reset
807 ip netns exec $ns2 ./pm_nl_ctl limits 0 1
808 ip netns exec $ns2 ./pm_nl_ctl add 10.0.3.2 flags subflow
809 run_tests $ns1 $ns2 10.0.1.1
810 chk_join_nr "single subflow, limited by server" 1 1 0
811
812 # subflow
813 reset
814 ip netns exec $ns1 ./pm_nl_ctl limits 0 1
815 ip netns exec $ns2 ./pm_nl_ctl limits 0 1
816 ip netns exec $ns2 ./pm_nl_ctl add 10.0.3.2 flags subflow
817 run_tests $ns1 $ns2 10.0.1.1
818 chk_join_nr "single subflow" 1 1 1
819
820 # multiple subflows
821 reset
822 ip netns exec $ns1 ./pm_nl_ctl limits 0 2
823 ip netns exec $ns2 ./pm_nl_ctl limits 0 2
824 ip netns exec $ns2 ./pm_nl_ctl add 10.0.3.2 flags subflow
825 ip netns exec $ns2 ./pm_nl_ctl add 10.0.2.2 flags subflow
826 run_tests $ns1 $ns2 10.0.1.1
827 chk_join_nr "multiple subflows" 2 2 2
828
829 # multiple subflows limited by serverf
830 reset
831 ip netns exec $ns1 ./pm_nl_ctl limits 0 1
832 ip netns exec $ns2 ./pm_nl_ctl limits 0 2
833 ip netns exec $ns2 ./pm_nl_ctl add 10.0.3.2 flags subflow
834 ip netns exec $ns2 ./pm_nl_ctl add 10.0.2.2 flags subflow
835 run_tests $ns1 $ns2 10.0.1.1
836 chk_join_nr "multiple subflows, limited by server" 2 2 1
c3eaa5f6
GT
837
838 # single subflow, dev
839 reset
840 ip netns exec $ns1 ./pm_nl_ctl limits 0 1
841 ip netns exec $ns2 ./pm_nl_ctl limits 0 1
842 ip netns exec $ns2 ./pm_nl_ctl add 10.0.3.2 flags subflow dev ns2eth3
843 run_tests $ns1 $ns2 10.0.1.1
844 chk_join_nr "single subflow, dev" 1 1 1
1002b89f
GT
845}
846
847signal_address_tests()
848{
849 # add_address, unused
850 reset
851 ip netns exec $ns1 ./pm_nl_ctl add 10.0.2.1 flags signal
852 run_tests $ns1 $ns2 10.0.1.1
853 chk_join_nr "unused signal address" 0 0 0
854 chk_add_nr 1 1
855
856 # accept and use add_addr
857 reset
858 ip netns exec $ns1 ./pm_nl_ctl limits 0 1
859 ip netns exec $ns2 ./pm_nl_ctl limits 1 1
860 ip netns exec $ns1 ./pm_nl_ctl add 10.0.2.1 flags signal
861 run_tests $ns1 $ns2 10.0.1.1
862 chk_join_nr "signal address" 1 1 1
863 chk_add_nr 1 1
864
865 # accept and use add_addr with an additional subflow
866 # note: signal address in server ns and local addresses in client ns must
867 # belong to different subnets or one of the listed local address could be
868 # used for 'add_addr' subflow
869 reset
870 ip netns exec $ns1 ./pm_nl_ctl add 10.0.2.1 flags signal
871 ip netns exec $ns1 ./pm_nl_ctl limits 0 2
872 ip netns exec $ns2 ./pm_nl_ctl limits 1 2
873 ip netns exec $ns2 ./pm_nl_ctl add 10.0.3.2 flags subflow
874 run_tests $ns1 $ns2 10.0.1.1
875 chk_join_nr "subflow and signal" 2 2 2
876 chk_add_nr 1 1
877
878 # accept and use add_addr with additional subflows
879 reset
880 ip netns exec $ns1 ./pm_nl_ctl limits 0 3
881 ip netns exec $ns1 ./pm_nl_ctl add 10.0.2.1 flags signal
882 ip netns exec $ns2 ./pm_nl_ctl limits 1 3
883 ip netns exec $ns2 ./pm_nl_ctl add 10.0.3.2 flags subflow
884 ip netns exec $ns2 ./pm_nl_ctl add 10.0.4.2 flags subflow
885 run_tests $ns1 $ns2 10.0.1.1
886 chk_join_nr "multiple subflows and signal" 3 3 3
887 chk_add_nr 1 1
ef360019
GT
888
889 # signal addresses
890 reset
891 ip netns exec $ns1 ./pm_nl_ctl limits 3 3
892 ip netns exec $ns1 ./pm_nl_ctl add 10.0.2.1 flags signal
893 ip netns exec $ns1 ./pm_nl_ctl add 10.0.3.1 flags signal
894 ip netns exec $ns1 ./pm_nl_ctl add 10.0.4.1 flags signal
895 ip netns exec $ns2 ./pm_nl_ctl limits 3 3
896 run_tests $ns1 $ns2 10.0.1.1
897 chk_join_nr "signal addresses" 3 3 3
898 chk_add_nr 3 3
899
900 # signal invalid addresses
901 reset
902 ip netns exec $ns1 ./pm_nl_ctl limits 3 3
903 ip netns exec $ns1 ./pm_nl_ctl add 10.0.12.1 flags signal
904 ip netns exec $ns1 ./pm_nl_ctl add 10.0.3.1 flags signal
905 ip netns exec $ns1 ./pm_nl_ctl add 10.0.14.1 flags signal
906 ip netns exec $ns2 ./pm_nl_ctl limits 3 3
907 run_tests $ns1 $ns2 10.0.1.1
908 chk_join_nr "signal invalid addresses" 1 1 1
909 chk_add_nr 3 3
1002b89f
GT
910}
911
912link_failure_tests()
913{
914 # accept and use add_addr with additional subflows and link loss
915 reset
916 ip netns exec $ns1 ./pm_nl_ctl limits 0 3
917 ip netns exec $ns1 ./pm_nl_ctl add 10.0.2.1 flags signal
918 ip netns exec $ns2 ./pm_nl_ctl limits 1 3
919 ip netns exec $ns2 ./pm_nl_ctl add 10.0.3.2 flags subflow
920 ip netns exec $ns2 ./pm_nl_ctl add 10.0.4.2 flags subflow
921 run_tests $ns1 $ns2 10.0.1.1 1
922 chk_join_nr "multiple flows, signal, link failure" 3 3 3
923 chk_add_nr 1 1
924}
925
926add_addr_timeout_tests()
927{
928 # add_addr timeout
929 reset_with_add_addr_timeout
930 ip netns exec $ns1 ./pm_nl_ctl limits 0 1
931 ip netns exec $ns2 ./pm_nl_ctl limits 1 1
932 ip netns exec $ns1 ./pm_nl_ctl add 10.0.2.1 flags signal
933 run_tests $ns1 $ns2 10.0.1.1 0 0 0 slow
934 chk_join_nr "signal address, ADD_ADDR timeout" 1 1 1
935 chk_add_nr 4 0
936
937 # add_addr timeout IPv6
938 reset_with_add_addr_timeout 6
939 ip netns exec $ns1 ./pm_nl_ctl limits 0 1
940 ip netns exec $ns2 ./pm_nl_ctl limits 1 1
941 ip netns exec $ns1 ./pm_nl_ctl add dead:beef:2::1 flags signal
942 run_tests $ns1 $ns2 dead:beef:1::1 0 0 0 slow
943 chk_join_nr "signal address, ADD_ADDR6 timeout" 1 1 1
944 chk_add_nr 4 0
8da6229b
GT
945
946 # signal addresses timeout
947 reset_with_add_addr_timeout
948 ip netns exec $ns1 ./pm_nl_ctl limits 2 2
949 ip netns exec $ns1 ./pm_nl_ctl add 10.0.2.1 flags signal
950 ip netns exec $ns1 ./pm_nl_ctl add 10.0.3.1 flags signal
951 ip netns exec $ns2 ./pm_nl_ctl limits 2 2
952 run_tests $ns1 $ns2 10.0.1.1 0 0 0 least
953 chk_join_nr "signal addresses, ADD_ADDR timeout" 2 2 2
954 chk_add_nr 8 0
955
956 # signal invalid addresses timeout
957 reset_with_add_addr_timeout
958 ip netns exec $ns1 ./pm_nl_ctl limits 2 2
959 ip netns exec $ns1 ./pm_nl_ctl add 10.0.12.1 flags signal
960 ip netns exec $ns1 ./pm_nl_ctl add 10.0.3.1 flags signal
961 ip netns exec $ns2 ./pm_nl_ctl limits 2 2
962 run_tests $ns1 $ns2 10.0.1.1 0 0 0 least
963 chk_join_nr "invalid address, ADD_ADDR timeout" 1 1 1
964 chk_add_nr 8 0
1002b89f
GT
965}
966
967remove_tests()
968{
969 # single subflow, remove
970 reset
971 ip netns exec $ns1 ./pm_nl_ctl limits 0 1
972 ip netns exec $ns2 ./pm_nl_ctl limits 0 1
973 ip netns exec $ns2 ./pm_nl_ctl add 10.0.3.2 flags subflow
974 run_tests $ns1 $ns2 10.0.1.1 0 0 -1 slow
975 chk_join_nr "remove single subflow" 1 1 1
976 chk_rm_nr 1 1
977
978 # multiple subflows, remove
979 reset
980 ip netns exec $ns1 ./pm_nl_ctl limits 0 2
981 ip netns exec $ns2 ./pm_nl_ctl limits 0 2
982 ip netns exec $ns2 ./pm_nl_ctl add 10.0.2.2 flags subflow
983 ip netns exec $ns2 ./pm_nl_ctl add 10.0.3.2 flags subflow
984 run_tests $ns1 $ns2 10.0.1.1 0 0 -2 slow
985 chk_join_nr "remove multiple subflows" 2 2 2
986 chk_rm_nr 2 2
987
988 # single address, remove
989 reset
990 ip netns exec $ns1 ./pm_nl_ctl limits 0 1
991 ip netns exec $ns1 ./pm_nl_ctl add 10.0.2.1 flags signal
992 ip netns exec $ns2 ./pm_nl_ctl limits 1 1
993 run_tests $ns1 $ns2 10.0.1.1 0 -1 0 slow
994 chk_join_nr "remove single address" 1 1 1
995 chk_add_nr 1 1
7028ba8a 996 chk_rm_nr 1 1 invert
1002b89f
GT
997
998 # subflow and signal, remove
999 reset
1000 ip netns exec $ns1 ./pm_nl_ctl limits 0 2
1001 ip netns exec $ns1 ./pm_nl_ctl add 10.0.2.1 flags signal
1002 ip netns exec $ns2 ./pm_nl_ctl limits 1 2
1003 ip netns exec $ns2 ./pm_nl_ctl add 10.0.3.2 flags subflow
1004 run_tests $ns1 $ns2 10.0.1.1 0 -1 -1 slow
1005 chk_join_nr "remove subflow and signal" 2 2 2
1006 chk_add_nr 1 1
1007 chk_rm_nr 1 1
1008
1009 # subflows and signal, remove
1010 reset
1011 ip netns exec $ns1 ./pm_nl_ctl limits 0 3
1012 ip netns exec $ns1 ./pm_nl_ctl add 10.0.2.1 flags signal
1013 ip netns exec $ns2 ./pm_nl_ctl limits 1 3
1014 ip netns exec $ns2 ./pm_nl_ctl add 10.0.3.2 flags subflow
1015 ip netns exec $ns2 ./pm_nl_ctl add 10.0.4.2 flags subflow
1016 run_tests $ns1 $ns2 10.0.1.1 0 -1 -2 slow
1017 chk_join_nr "remove subflows and signal" 3 3 3
1018 chk_add_nr 1 1
1019 chk_rm_nr 2 2
1020
ef360019
GT
1021 # addresses remove
1022 reset
1023 ip netns exec $ns1 ./pm_nl_ctl limits 3 3
1024 ip netns exec $ns1 ./pm_nl_ctl add 10.0.2.1 flags signal id 250
1025 ip netns exec $ns1 ./pm_nl_ctl add 10.0.3.1 flags signal
1026 ip netns exec $ns1 ./pm_nl_ctl add 10.0.4.1 flags signal
1027 ip netns exec $ns2 ./pm_nl_ctl limits 3 3
1028 run_tests $ns1 $ns2 10.0.1.1 0 -3 0 slow
1029 chk_join_nr "remove addresses" 3 3 3
1030 chk_add_nr 3 3
1031 chk_rm_nr 3 3 invert
1032
1033 # invalid addresses remove
1034 reset
1035 ip netns exec $ns1 ./pm_nl_ctl limits 3 3
1036 ip netns exec $ns1 ./pm_nl_ctl add 10.0.12.1 flags signal
1037 ip netns exec $ns1 ./pm_nl_ctl add 10.0.3.1 flags signal
1038 ip netns exec $ns1 ./pm_nl_ctl add 10.0.14.1 flags signal
1039 ip netns exec $ns2 ./pm_nl_ctl limits 3 3
1040 run_tests $ns1 $ns2 10.0.1.1 0 -3 0 slow
1041 chk_join_nr "remove invalid addresses" 1 1 1
1042 chk_add_nr 3 3
1043 chk_rm_nr 3 1 invert
1044
1002b89f
GT
1045 # subflows and signal, flush
1046 reset
1047 ip netns exec $ns1 ./pm_nl_ctl limits 0 3
1048 ip netns exec $ns1 ./pm_nl_ctl add 10.0.2.1 flags signal
1049 ip netns exec $ns2 ./pm_nl_ctl limits 1 3
1050 ip netns exec $ns2 ./pm_nl_ctl add 10.0.3.2 flags subflow
1051 ip netns exec $ns2 ./pm_nl_ctl add 10.0.4.2 flags subflow
1052 run_tests $ns1 $ns2 10.0.1.1 0 -8 -8 slow
1053 chk_join_nr "flush subflows and signal" 3 3 3
1054 chk_add_nr 1 1
1055 chk_rm_nr 2 2
d2c4333a
GT
1056
1057 # subflows flush
1058 reset
1059 ip netns exec $ns1 ./pm_nl_ctl limits 3 3
1060 ip netns exec $ns2 ./pm_nl_ctl limits 3 3
1061 ip netns exec $ns2 ./pm_nl_ctl add 10.0.2.2 flags subflow id 150
1062 ip netns exec $ns2 ./pm_nl_ctl add 10.0.3.2 flags subflow
1063 ip netns exec $ns2 ./pm_nl_ctl add 10.0.4.2 flags subflow
1064 run_tests $ns1 $ns2 10.0.1.1 0 -8 -8 slow
1065 chk_join_nr "flush subflows" 3 3 3
1066 chk_rm_nr 3 3
1067
1068 # addresses flush
1069 reset
1070 ip netns exec $ns1 ./pm_nl_ctl limits 3 3
1071 ip netns exec $ns1 ./pm_nl_ctl add 10.0.2.1 flags signal id 250
1072 ip netns exec $ns1 ./pm_nl_ctl add 10.0.3.1 flags signal
1073 ip netns exec $ns1 ./pm_nl_ctl add 10.0.4.1 flags signal
1074 ip netns exec $ns2 ./pm_nl_ctl limits 3 3
1075 run_tests $ns1 $ns2 10.0.1.1 0 -8 -8 slow
1076 chk_join_nr "flush addresses" 3 3 3
1077 chk_add_nr 3 3
1078 chk_rm_nr 3 3 invert
ef360019
GT
1079
1080 # invalid addresses flush
1081 reset
1082 ip netns exec $ns1 ./pm_nl_ctl limits 3 3
1083 ip netns exec $ns1 ./pm_nl_ctl add 10.0.12.1 flags signal
1084 ip netns exec $ns1 ./pm_nl_ctl add 10.0.3.1 flags signal
1085 ip netns exec $ns1 ./pm_nl_ctl add 10.0.14.1 flags signal
1086 ip netns exec $ns2 ./pm_nl_ctl limits 3 3
1087 run_tests $ns1 $ns2 10.0.1.1 0 -8 0 slow
1088 chk_join_nr "flush invalid addresses" 1 1 1
1089 chk_add_nr 3 3
1090 chk_rm_nr 3 1 invert
5e287fe7
GT
1091
1092 # remove id 0 subflow
1093 reset
1094 ip netns exec $ns1 ./pm_nl_ctl limits 0 1
1095 ip netns exec $ns2 ./pm_nl_ctl limits 0 1
1096 ip netns exec $ns2 ./pm_nl_ctl add 10.0.3.2 flags subflow
1097 run_tests $ns1 $ns2 10.0.1.1 0 0 -9 slow
1098 chk_join_nr "remove id 0 subflow" 1 1 1
1099 chk_rm_nr 1 1
1100
1101 # remove id 0 address
1102 reset
1103 ip netns exec $ns1 ./pm_nl_ctl limits 0 1
1104 ip netns exec $ns1 ./pm_nl_ctl add 10.0.2.1 flags signal
1105 ip netns exec $ns2 ./pm_nl_ctl limits 1 1
1106 run_tests $ns1 $ns2 10.0.1.1 0 -9 0 slow
1107 chk_join_nr "remove id 0 address" 1 1 1
1108 chk_add_nr 1 1
1109 chk_rm_nr 1 1 invert
1002b89f
GT
1110}
1111
1112add_tests()
1113{
1114 # add single subflow
1115 reset
1116 ip netns exec $ns1 ./pm_nl_ctl limits 0 1
1117 ip netns exec $ns2 ./pm_nl_ctl limits 0 1
1118 run_tests $ns1 $ns2 10.0.1.1 0 0 1 slow
1119 chk_join_nr "add single subflow" 1 1 1
1120
1121 # add signal address
1122 reset
1123 ip netns exec $ns1 ./pm_nl_ctl limits 0 1
1124 ip netns exec $ns2 ./pm_nl_ctl limits 1 1
1125 run_tests $ns1 $ns2 10.0.1.1 0 1 0 slow
1126 chk_join_nr "add signal address" 1 1 1
1127 chk_add_nr 1 1
1128
1129 # add multiple subflows
1130 reset
1131 ip netns exec $ns1 ./pm_nl_ctl limits 0 2
1132 ip netns exec $ns2 ./pm_nl_ctl limits 0 2
1133 run_tests $ns1 $ns2 10.0.1.1 0 0 2 slow
1134 chk_join_nr "add multiple subflows" 2 2 2
1135
1136 # add multiple subflows IPv6
1137 reset
1138 ip netns exec $ns1 ./pm_nl_ctl limits 0 2
1139 ip netns exec $ns2 ./pm_nl_ctl limits 0 2
1140 run_tests $ns1 $ns2 dead:beef:1::1 0 0 2 slow
1141 chk_join_nr "add multiple subflows IPv6" 2 2 2
1142
1143 # add multiple addresses IPv6
1144 reset
1145 ip netns exec $ns1 ./pm_nl_ctl limits 0 2
1146 ip netns exec $ns2 ./pm_nl_ctl limits 2 2
1147 run_tests $ns1 $ns2 dead:beef:1::1 0 2 0 slow
1148 chk_join_nr "add multiple addresses IPv6" 2 2 2
1149 chk_add_nr 2 2
1150}
1151
1152ipv6_tests()
1153{
1154 # subflow IPv6
1155 reset
1156 ip netns exec $ns1 ./pm_nl_ctl limits 0 1
1157 ip netns exec $ns2 ./pm_nl_ctl limits 0 1
1158 ip netns exec $ns2 ./pm_nl_ctl add dead:beef:3::2 flags subflow
1159 run_tests $ns1 $ns2 dead:beef:1::1 0 0 0 slow
1160 chk_join_nr "single subflow IPv6" 1 1 1
1161
1162 # add_address, unused IPv6
1163 reset
1164 ip netns exec $ns1 ./pm_nl_ctl add dead:beef:2::1 flags signal
1165 run_tests $ns1 $ns2 dead:beef:1::1 0 0 0 slow
1166 chk_join_nr "unused signal address IPv6" 0 0 0
1167 chk_add_nr 1 1
1168
1169 # signal address IPv6
1170 reset
1171 ip netns exec $ns1 ./pm_nl_ctl limits 0 1
1172 ip netns exec $ns1 ./pm_nl_ctl add dead:beef:2::1 flags signal
1173 ip netns exec $ns2 ./pm_nl_ctl limits 1 1
1174 run_tests $ns1 $ns2 dead:beef:1::1 0 0 0 slow
1175 chk_join_nr "single address IPv6" 1 1 1
1176 chk_add_nr 1 1
1177
1178 # single address IPv6, remove
1179 reset
1180 ip netns exec $ns1 ./pm_nl_ctl limits 0 1
1181 ip netns exec $ns1 ./pm_nl_ctl add dead:beef:2::1 flags signal
1182 ip netns exec $ns2 ./pm_nl_ctl limits 1 1
1183 run_tests $ns1 $ns2 dead:beef:1::1 0 -1 0 slow
1184 chk_join_nr "remove single address IPv6" 1 1 1
1185 chk_add_nr 1 1
7028ba8a 1186 chk_rm_nr 1 1 invert
1002b89f
GT
1187
1188 # subflow and signal IPv6, remove
1189 reset
1190 ip netns exec $ns1 ./pm_nl_ctl limits 0 2
1191 ip netns exec $ns1 ./pm_nl_ctl add dead:beef:2::1 flags signal
1192 ip netns exec $ns2 ./pm_nl_ctl limits 1 2
1193 ip netns exec $ns2 ./pm_nl_ctl add dead:beef:3::2 flags subflow
1194 run_tests $ns1 $ns2 dead:beef:1::1 0 -1 -1 slow
1195 chk_join_nr "remove subflow and signal IPv6" 2 2 2
1196 chk_add_nr 1 1
1197 chk_rm_nr 1 1
1198}
1199
1200v4mapped_tests()
1201{
1202 # subflow IPv4-mapped to IPv4-mapped
1203 reset
1204 ip netns exec $ns1 ./pm_nl_ctl limits 0 1
1205 ip netns exec $ns2 ./pm_nl_ctl limits 0 1
1206 ip netns exec $ns2 ./pm_nl_ctl add "::ffff:10.0.3.2" flags subflow
1207 run_tests $ns1 $ns2 "::ffff:10.0.1.1"
1208 chk_join_nr "single subflow IPv4-mapped" 1 1 1
1209
1210 # signal address IPv4-mapped with IPv4-mapped sk
1211 reset
1212 ip netns exec $ns1 ./pm_nl_ctl limits 0 1
1213 ip netns exec $ns2 ./pm_nl_ctl limits 1 1
1214 ip netns exec $ns1 ./pm_nl_ctl add "::ffff:10.0.2.1" flags signal
1215 run_tests $ns1 $ns2 "::ffff:10.0.1.1"
1216 chk_join_nr "signal address IPv4-mapped" 1 1 1
1217 chk_add_nr 1 1
1218
1219 # subflow v4-map-v6
1220 reset
1221 ip netns exec $ns1 ./pm_nl_ctl limits 0 1
1222 ip netns exec $ns2 ./pm_nl_ctl limits 0 1
1223 ip netns exec $ns2 ./pm_nl_ctl add 10.0.3.2 flags subflow
1224 run_tests $ns1 $ns2 "::ffff:10.0.1.1"
1225 chk_join_nr "single subflow v4-map-v6" 1 1 1
1226
1227 # signal address v4-map-v6
1228 reset
1229 ip netns exec $ns1 ./pm_nl_ctl limits 0 1
1230 ip netns exec $ns2 ./pm_nl_ctl limits 1 1
1231 ip netns exec $ns1 ./pm_nl_ctl add 10.0.2.1 flags signal
1232 run_tests $ns1 $ns2 "::ffff:10.0.1.1"
1233 chk_join_nr "signal address v4-map-v6" 1 1 1
1234 chk_add_nr 1 1
1235
1236 # subflow v6-map-v4
1237 reset
1238 ip netns exec $ns1 ./pm_nl_ctl limits 0 1
1239 ip netns exec $ns2 ./pm_nl_ctl limits 0 1
1240 ip netns exec $ns2 ./pm_nl_ctl add "::ffff:10.0.3.2" flags subflow
1241 run_tests $ns1 $ns2 10.0.1.1
1242 chk_join_nr "single subflow v6-map-v4" 1 1 1
1243
1244 # signal address v6-map-v4
1245 reset
1246 ip netns exec $ns1 ./pm_nl_ctl limits 0 1
1247 ip netns exec $ns2 ./pm_nl_ctl limits 1 1
1248 ip netns exec $ns1 ./pm_nl_ctl add "::ffff:10.0.2.1" flags signal
1249 run_tests $ns1 $ns2 10.0.1.1
1250 chk_join_nr "signal address v6-map-v4" 1 1 1
1251 chk_add_nr 1 1
1252
1253 # no subflow IPv6 to v4 address
1254 reset
1255 ip netns exec $ns1 ./pm_nl_ctl limits 0 1
1256 ip netns exec $ns2 ./pm_nl_ctl limits 0 1
1257 ip netns exec $ns2 ./pm_nl_ctl add dead:beef:2::2 flags subflow
1258 run_tests $ns1 $ns2 10.0.1.1
1259 chk_join_nr "no JOIN with diff families v4-v6" 0 0 0
1260
1261 # no subflow IPv6 to v4 address even if v6 has a valid v4 at the end
1262 reset
1263 ip netns exec $ns1 ./pm_nl_ctl limits 0 1
1264 ip netns exec $ns2 ./pm_nl_ctl limits 0 1
1265 ip netns exec $ns2 ./pm_nl_ctl add dead:beef:2::10.0.3.2 flags subflow
1266 run_tests $ns1 $ns2 10.0.1.1
1267 chk_join_nr "no JOIN with diff families v4-v6-2" 0 0 0
1268
1269 # no subflow IPv4 to v6 address, no need to slow down too then
1270 reset
1271 ip netns exec $ns1 ./pm_nl_ctl limits 0 1
1272 ip netns exec $ns2 ./pm_nl_ctl limits 0 1
1273 ip netns exec $ns2 ./pm_nl_ctl add 10.0.3.2 flags subflow
1274 run_tests $ns1 $ns2 dead:beef:1::1
1275 chk_join_nr "no JOIN with diff families v6-v4" 0 0 0
1276}
1277
1278backup_tests()
1279{
1280 # single subflow, backup
1281 reset
1282 ip netns exec $ns1 ./pm_nl_ctl limits 0 1
1283 ip netns exec $ns2 ./pm_nl_ctl limits 0 1
1284 ip netns exec $ns2 ./pm_nl_ctl add 10.0.3.2 flags subflow,backup
1285 run_tests $ns1 $ns2 10.0.1.1 0 0 0 slow nobackup
1286 chk_join_nr "single subflow, backup" 1 1 1
1287 chk_prio_nr 0 1
1288
1289 # single address, backup
1290 reset
1291 ip netns exec $ns1 ./pm_nl_ctl limits 0 1
1292 ip netns exec $ns1 ./pm_nl_ctl add 10.0.2.1 flags signal
1293 ip netns exec $ns2 ./pm_nl_ctl limits 1 1
1294 run_tests $ns1 $ns2 10.0.1.1 0 0 0 slow backup
1295 chk_join_nr "single address, backup" 1 1 1
1296 chk_add_nr 1 1
1297 chk_prio_nr 1 0
1298}
1299
1300add_addr_ports_tests()
1301{
1302 # signal address with port
1303 reset
1304 ip netns exec $ns1 ./pm_nl_ctl limits 0 1
1305 ip netns exec $ns2 ./pm_nl_ctl limits 1 1
1306 ip netns exec $ns1 ./pm_nl_ctl add 10.0.2.1 flags signal port 10100
1307 run_tests $ns1 $ns2 10.0.1.1
1308 chk_join_nr "signal address with port" 1 1 1
1309 chk_add_nr 1 1 1
1310
1311 # subflow and signal with port
1312 reset
1313 ip netns exec $ns1 ./pm_nl_ctl add 10.0.2.1 flags signal port 10100
1314 ip netns exec $ns1 ./pm_nl_ctl limits 0 2
1315 ip netns exec $ns2 ./pm_nl_ctl limits 1 2
1316 ip netns exec $ns2 ./pm_nl_ctl add 10.0.3.2 flags subflow
1317 run_tests $ns1 $ns2 10.0.1.1
1318 chk_join_nr "subflow and signal with port" 2 2 2
1319 chk_add_nr 1 1 1
1320
1321 # single address with port, remove
1322 reset
1323 ip netns exec $ns1 ./pm_nl_ctl limits 0 1
1324 ip netns exec $ns1 ./pm_nl_ctl add 10.0.2.1 flags signal port 10100
1325 ip netns exec $ns2 ./pm_nl_ctl limits 1 1
1326 run_tests $ns1 $ns2 10.0.1.1 0 -1 0 slow
1327 chk_join_nr "remove single address with port" 1 1 1
1328 chk_add_nr 1 1 1
7028ba8a 1329 chk_rm_nr 1 1 invert
1002b89f
GT
1330
1331 # subflow and signal with port, remove
1332 reset
1333 ip netns exec $ns1 ./pm_nl_ctl limits 0 2
1334 ip netns exec $ns1 ./pm_nl_ctl add 10.0.2.1 flags signal port 10100
1335 ip netns exec $ns2 ./pm_nl_ctl limits 1 2
1336 ip netns exec $ns2 ./pm_nl_ctl add 10.0.3.2 flags subflow
1337 run_tests $ns1 $ns2 10.0.1.1 0 -1 -1 slow
1338 chk_join_nr "remove subflow and signal with port" 2 2 2
1339 chk_add_nr 1 1 1
1340 chk_rm_nr 1 1
1341
1342 # subflows and signal with port, flush
1343 reset
1344 ip netns exec $ns1 ./pm_nl_ctl limits 0 3
1345 ip netns exec $ns1 ./pm_nl_ctl add 10.0.2.1 flags signal port 10100
1346 ip netns exec $ns2 ./pm_nl_ctl limits 1 3
1347 ip netns exec $ns2 ./pm_nl_ctl add 10.0.3.2 flags subflow
1348 ip netns exec $ns2 ./pm_nl_ctl add 10.0.4.2 flags subflow
1349 run_tests $ns1 $ns2 10.0.1.1 0 -8 -8 slow
1350 chk_join_nr "flush subflows and signal with port" 3 3 3
1351 chk_add_nr 1 1
1352 chk_rm_nr 2 2
1353
1354 # multiple addresses with port
1355 reset
1356 ip netns exec $ns1 ./pm_nl_ctl limits 2 2
1357 ip netns exec $ns1 ./pm_nl_ctl add 10.0.2.1 flags signal port 10100
1358 ip netns exec $ns1 ./pm_nl_ctl add 10.0.3.1 flags signal port 10100
1359 ip netns exec $ns2 ./pm_nl_ctl limits 2 2
1360 run_tests $ns1 $ns2 10.0.1.1
1361 chk_join_nr "multiple addresses with port" 2 2 2
1362 chk_add_nr 2 2 2
1363
1364 # multiple addresses with ports
1365 reset
1366 ip netns exec $ns1 ./pm_nl_ctl limits 2 2
1367 ip netns exec $ns1 ./pm_nl_ctl add 10.0.2.1 flags signal port 10100
1368 ip netns exec $ns1 ./pm_nl_ctl add 10.0.3.1 flags signal port 10101
1369 ip netns exec $ns2 ./pm_nl_ctl limits 2 2
1370 run_tests $ns1 $ns2 10.0.1.1
1371 chk_join_nr "multiple addresses with ports" 2 2 2
1372 chk_add_nr 2 2 2
1373}
1374
1375syncookies_tests()
1376{
1377 # single subflow, syncookies
1378 reset_with_cookies
1379 ip netns exec $ns1 ./pm_nl_ctl limits 0 1
1380 ip netns exec $ns2 ./pm_nl_ctl limits 0 1
1381 ip netns exec $ns2 ./pm_nl_ctl add 10.0.3.2 flags subflow
1382 run_tests $ns1 $ns2 10.0.1.1
1383 chk_join_nr "single subflow with syn cookies" 1 1 1
1384
1385 # multiple subflows with syn cookies
1386 reset_with_cookies
1387 ip netns exec $ns1 ./pm_nl_ctl limits 0 2
1388 ip netns exec $ns2 ./pm_nl_ctl limits 0 2
1389 ip netns exec $ns2 ./pm_nl_ctl add 10.0.3.2 flags subflow
1390 ip netns exec $ns2 ./pm_nl_ctl add 10.0.2.2 flags subflow
1391 run_tests $ns1 $ns2 10.0.1.1
1392 chk_join_nr "multiple subflows with syn cookies" 2 2 2
1393
1394 # multiple subflows limited by server
1395 reset_with_cookies
1396 ip netns exec $ns1 ./pm_nl_ctl limits 0 1
1397 ip netns exec $ns2 ./pm_nl_ctl limits 0 2
1398 ip netns exec $ns2 ./pm_nl_ctl add 10.0.3.2 flags subflow
1399 ip netns exec $ns2 ./pm_nl_ctl add 10.0.2.2 flags subflow
1400 run_tests $ns1 $ns2 10.0.1.1
1401 chk_join_nr "subflows limited by server w cookies" 2 2 1
1402
1403 # test signal address with cookies
1404 reset_with_cookies
1405 ip netns exec $ns1 ./pm_nl_ctl limits 0 1
1406 ip netns exec $ns2 ./pm_nl_ctl limits 1 1
1407 ip netns exec $ns1 ./pm_nl_ctl add 10.0.2.1 flags signal
1408 run_tests $ns1 $ns2 10.0.1.1
1409 chk_join_nr "signal address with syn cookies" 1 1 1
1410 chk_add_nr 1 1
1411
1412 # test cookie with subflow and signal
1413 reset_with_cookies
1414 ip netns exec $ns1 ./pm_nl_ctl add 10.0.2.1 flags signal
1415 ip netns exec $ns1 ./pm_nl_ctl limits 0 2
1416 ip netns exec $ns2 ./pm_nl_ctl limits 1 2
1417 ip netns exec $ns2 ./pm_nl_ctl add 10.0.3.2 flags subflow
1418 run_tests $ns1 $ns2 10.0.1.1
1419 chk_join_nr "subflow and signal w cookies" 2 2 2
1420 chk_add_nr 1 1
1421
1422 # accept and use add_addr with additional subflows
1423 reset_with_cookies
1424 ip netns exec $ns1 ./pm_nl_ctl limits 0 3
1425 ip netns exec $ns1 ./pm_nl_ctl add 10.0.2.1 flags signal
1426 ip netns exec $ns2 ./pm_nl_ctl limits 1 3
1427 ip netns exec $ns2 ./pm_nl_ctl add 10.0.3.2 flags subflow
1428 ip netns exec $ns2 ./pm_nl_ctl add 10.0.4.2 flags subflow
1429 run_tests $ns1 $ns2 10.0.1.1
1430 chk_join_nr "subflows and signal w. cookies" 3 3 3
1431 chk_add_nr 1 1
1432}
1433
af66d3e1
GT
1434checksum_tests()
1435{
1436 # checksum test 0 0
1437 reset_with_checksum 0 0
1438 ip netns exec $ns1 ./pm_nl_ctl limits 0 1
1439 ip netns exec $ns2 ./pm_nl_ctl limits 0 1
1440 run_tests $ns1 $ns2 10.0.1.1
1441 chk_csum_nr "checksum test 0 0"
1442
1443 # checksum test 1 1
1444 reset_with_checksum 1 1
1445 ip netns exec $ns1 ./pm_nl_ctl limits 0 1
1446 ip netns exec $ns2 ./pm_nl_ctl limits 0 1
1447 run_tests $ns1 $ns2 10.0.1.1
1448 chk_csum_nr "checksum test 1 1"
1449
1450 # checksum test 0 1
1451 reset_with_checksum 0 1
1452 ip netns exec $ns1 ./pm_nl_ctl limits 0 1
1453 ip netns exec $ns2 ./pm_nl_ctl limits 0 1
1454 run_tests $ns1 $ns2 10.0.1.1
1455 chk_csum_nr "checksum test 0 1"
1456
1457 # checksum test 1 0
1458 reset_with_checksum 1 0
1459 ip netns exec $ns1 ./pm_nl_ctl limits 0 1
1460 ip netns exec $ns2 ./pm_nl_ctl limits 0 1
1461 run_tests $ns1 $ns2 10.0.1.1
1462 chk_csum_nr "checksum test 1 0"
1463}
1464
1002b89f
GT
1465all_tests()
1466{
1467 subflows_tests
1468 signal_address_tests
1469 link_failure_tests
1470 add_addr_timeout_tests
1471 remove_tests
1472 add_tests
1473 ipv6_tests
1474 v4mapped_tests
1475 backup_tests
1476 add_addr_ports_tests
1477 syncookies_tests
af66d3e1 1478 checksum_tests
1002b89f
GT
1479}
1480
1481usage()
1482{
1483 echo "mptcp_join usage:"
1484 echo " -f subflows_tests"
1485 echo " -s signal_address_tests"
1486 echo " -l link_failure_tests"
1487 echo " -t add_addr_timeout_tests"
1488 echo " -r remove_tests"
1489 echo " -a add_tests"
1490 echo " -6 ipv6_tests"
1491 echo " -4 v4mapped_tests"
1492 echo " -b backup_tests"
1493 echo " -p add_addr_ports_tests"
a673321a 1494 echo " -k syncookies_tests"
af66d3e1 1495 echo " -S checksum_tests"
a673321a 1496 echo " -c capture pcap files"
af66d3e1 1497 echo " -C enable data checksum"
1002b89f
GT
1498 echo " -h help"
1499}
1500
b08fbf24
PA
1501sin=$(mktemp)
1502sout=$(mktemp)
1503cin=$(mktemp)
8b819a84 1504cinsent=$(mktemp)
b08fbf24
PA
1505cout=$(mktemp)
1506init
8b819a84
FW
1507make_file "$cin" "client" 1
1508make_file "$sin" "server" 1
b08fbf24
PA
1509trap cleanup EXIT
1510
a673321a 1511for arg in "$@"; do
af66d3e1 1512 # check for "capture/checksum" args before launching tests
a673321a
MM
1513 if [[ "${arg}" =~ ^"-"[0-9a-zA-Z]*"c"[0-9a-zA-Z]*$ ]]; then
1514 capture=1
1515 fi
af66d3e1
GT
1516 if [[ "${arg}" =~ ^"-"[0-9a-zA-Z]*"C"[0-9a-zA-Z]*$ ]]; then
1517 checksum=1
1518 fi
a673321a 1519
af66d3e1
GT
1520 # exception for the capture/checksum options, the rest means: a part of the tests
1521 if [ "${arg}" != "-c" ] && [ "${arg}" != "-C" ]; then
a673321a
MM
1522 do_all_tests=0
1523 fi
1524done
1525
1526if [ $do_all_tests -eq 1 ]; then
1002b89f
GT
1527 all_tests
1528 exit $ret
1529fi
1530
af66d3e1 1531while getopts 'fsltra64bpkchCS' opt; do
1002b89f
GT
1532 case $opt in
1533 f)
1534 subflows_tests
1535 ;;
1536 s)
1537 signal_address_tests
1538 ;;
1539 l)
1540 link_failure_tests
1541 ;;
1542 t)
1543 add_addr_timeout_tests
1544 ;;
1545 r)
1546 remove_tests
1547 ;;
1548 a)
1549 add_tests
1550 ;;
1551 6)
1552 ipv6_tests
1553 ;;
1554 4)
1555 v4mapped_tests
1556 ;;
1557 b)
1558 backup_tests
1559 ;;
1560 p)
1561 add_addr_ports_tests
1562 ;;
a673321a 1563 k)
1002b89f
GT
1564 syncookies_tests
1565 ;;
af66d3e1
GT
1566 S)
1567 checksum_tests
1568 ;;
a673321a
MM
1569 c)
1570 ;;
af66d3e1
GT
1571 C)
1572 ;;
1002b89f
GT
1573 h | *)
1574 usage
1575 ;;
1576 esac
1577done
00587187 1578
b08fbf24 1579exit $ret