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