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