1#!/bin/bash
2# SPDX-License-Identifier: GPL-2.0
3
4ret=0
5sin=""
6sout=""
7cin=""
8cinsent=""
9cout=""
10ksft_skip=4
11timeout=30
12mptcp_connect=""
13capture=0
14
15TEST_COUNT=0
16
17# generated using "nfbpf_compile '(ip && (ip[54] & 0xf0) == 0x30) ||
18#				  (ip6 && (ip6[74] & 0xf0) == 0x30)'"
19CBPF_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
35init()
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
73cleanup_partial()
74{
75	rm -f "$capout"
76
77	for netns in "$ns1" "$ns2"; do
78		ip netns del $netns
79	done
80}
81
82cleanup()
83{
84	rm -f "$cin" "$cout"
85	rm -f "$sin" "$sout" "$cinsent"
86	cleanup_partial
87}
88
89reset()
90{
91	cleanup_partial
92	init
93}
94
95reset_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
104reset_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
124for arg in "$@"; do
125	if [ "$arg" = "-c" ]; then
126		capture=1
127	fi
128done
129
130ip -Version > /dev/null 2>&1
131if [ $? -ne 0 ];then
132	echo "SKIP: Could not run test without ip tool"
133	exit $ksft_skip
134fi
135
136iptables -V > /dev/null 2>&1
137if [ $? -ne 0 ];then
138	echo "SKIP: Could not run all tests without iptables tool"
139	exit $ksft_skip
140fi
141
142ip6tables -V > /dev/null 2>&1
143if [ $? -ne 0 ];then
144	echo "SKIP: Could not run all tests without ip6tables tool"
145	exit $ksft_skip
146fi
147
148print_file_err()
149{
150	ls -l "$1" 1>&2
151	echo "Trailing bytes are: "
152	tail -c 27 "$1"
153}
154
155check_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
174do_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
187link_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
199is_v6()
200{
201	[ -z "${1##*:*}" ]
202}
203
204do_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			dump=(`ip netns exec ${listener_ns} ./pm_nl_ctl dump`)
288			if [ ${#dump[@]} -gt 0 ]; then
289				id=${dump[1]}
290				sleep 1
291
292				while [ $counter -le $rm_nr_ns1 ]
293				do
294					ip netns exec ${listener_ns} ./pm_nl_ctl del $id
295					sleep 1
296					let counter+=1
297					let id+=1
298				done
299			fi
300		else
301			sleep 1
302			ip netns exec ${listener_ns} ./pm_nl_ctl flush
303		fi
304	fi
305
306	if [ $addr_nr_ns2 -gt 0 ]; then
307		let add_nr_ns2=addr_nr_ns2
308		counter=3
309		sleep 1
310		while [ $add_nr_ns2 -gt 0 ]; do
311			local addr
312			if is_v6 "${connect_addr}"; then
313				addr="dead:beef:$counter::2"
314			else
315				addr="10.0.$counter.2"
316			fi
317			ip netns exec $ns2 ./pm_nl_ctl add $addr flags subflow
318			let counter+=1
319			let add_nr_ns2-=1
320		done
321		sleep 1
322	elif [ $addr_nr_ns2 -lt 0 ]; then
323		let rm_nr_ns2=-addr_nr_ns2
324		if [ $rm_nr_ns2 -lt 8 ]; then
325			counter=1
326			dump=(`ip netns exec ${connector_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_ns2 ]
332				do
333					ip netns exec ${connector_ns} ./pm_nl_ctl del $id
334					sleep 1
335					let counter+=1
336					let id+=1
337				done
338			fi
339		else
340			sleep 1
341			ip netns exec ${connector_ns} ./pm_nl_ctl flush
342		fi
343	fi
344
345	if [ ! -z $bkup ]; then
346		sleep 1
347		for netns in "$ns1" "$ns2"; do
348			dump=(`ip netns exec $netns ./pm_nl_ctl dump`)
349			if [ ${#dump[@]} -gt 0 ]; then
350				addr=${dump[${#dump[@]} - 1]}
351				backup="ip netns exec $netns ./pm_nl_ctl set $addr flags $bkup"
352				$backup
353			fi
354		done
355	fi
356
357	wait $cpid
358	retc=$?
359	wait $spid
360	rets=$?
361
362	if [ $capture -eq 1 ]; then
363	    sleep 1
364	    kill $cappid
365	fi
366
367	if [ ${rets} -ne 0 ] || [ ${retc} -ne 0 ]; then
368		echo " client exit code $retc, server $rets" 1>&2
369		echo -e "\nnetns ${listener_ns} socket stat for ${port}:" 1>&2
370		ip netns exec ${listener_ns} ss -nita 1>&2 -o "sport = :$port"
371		echo -e "\nnetns ${connector_ns} socket stat for ${port}:" 1>&2
372		ip netns exec ${connector_ns} ss -nita 1>&2 -o "dport = :$port"
373
374		cat "$capout"
375		ret=1
376		return 1
377	fi
378
379	check_transfer $sin $cout "file received by client"
380	retc=$?
381	if [ "$test_link_fail" -eq 0 ];then
382		check_transfer $cin $sout "file received by server"
383	else
384		check_transfer $cinsent $sout "file received by server"
385	fi
386	rets=$?
387
388	if [ $retc -eq 0 ] && [ $rets -eq 0 ];then
389		cat "$capout"
390		return 0
391	fi
392
393	cat "$capout"
394	return 1
395}
396
397make_file()
398{
399	name=$1
400	who=$2
401	size=$3
402
403	dd if=/dev/urandom of="$name" bs=1024 count=$size 2> /dev/null
404	echo -e "\nMPTCP_TEST_FILE_END_MARKER" >> "$name"
405
406	echo "Created $name (size $size KB) containing data sent by $who"
407}
408
409run_tests()
410{
411	listener_ns="$1"
412	connector_ns="$2"
413	connect_addr="$3"
414	test_linkfail="${4:-0}"
415	addr_nr_ns1="${5:-0}"
416	addr_nr_ns2="${6:-0}"
417	speed="${7:-fast}"
418	bkup="${8:-""}"
419	lret=0
420	oldin=""
421
422	if [ "$test_linkfail" -eq 1 ];then
423		size=$((RANDOM%1024))
424		size=$((size+1))
425		size=$((size*128))
426
427		oldin=$(mktemp)
428		cp "$cin" "$oldin"
429		make_file "$cin" "client" $size
430	fi
431
432	do_transfer ${listener_ns} ${connector_ns} MPTCP MPTCP ${connect_addr} \
433		${test_linkfail} ${addr_nr_ns1} ${addr_nr_ns2} ${speed} ${bkup}
434	lret=$?
435
436	if [ "$test_linkfail" -eq 1 ];then
437		cp "$oldin" "$cin"
438		rm -f "$oldin"
439	fi
440
441	if [ $lret -ne 0 ]; then
442		ret=$lret
443		return
444	fi
445}
446
447chk_join_nr()
448{
449	local msg="$1"
450	local syn_nr=$2
451	local syn_ack_nr=$3
452	local ack_nr=$4
453	local count
454	local dump_stats
455
456	printf "%02u %-36s %s" "$TEST_COUNT" "$msg" "syn"
457	count=`ip netns exec $ns1 nstat -as | grep MPTcpExtMPJoinSynRx | awk '{print $2}'`
458	[ -z "$count" ] && count=0
459	if [ "$count" != "$syn_nr" ]; then
460		echo "[fail] got $count JOIN[s] syn expected $syn_nr"
461		ret=1
462		dump_stats=1
463	else
464		echo -n "[ ok ]"
465	fi
466
467	echo -n " - synack"
468	count=`ip netns exec $ns2 nstat -as | grep MPTcpExtMPJoinSynAckRx | awk '{print $2}'`
469	[ -z "$count" ] && count=0
470	if [ "$count" != "$syn_ack_nr" ]; then
471		echo "[fail] got $count JOIN[s] synack expected $syn_ack_nr"
472		ret=1
473		dump_stats=1
474	else
475		echo -n "[ ok ]"
476	fi
477
478	echo -n " - ack"
479	count=`ip netns exec $ns1 nstat -as | grep MPTcpExtMPJoinAckRx | awk '{print $2}'`
480	[ -z "$count" ] && count=0
481	if [ "$count" != "$ack_nr" ]; then
482		echo "[fail] got $count JOIN[s] ack expected $ack_nr"
483		ret=1
484		dump_stats=1
485	else
486		echo "[ ok ]"
487	fi
488	if [ "${dump_stats}" = 1 ]; then
489		echo Server ns stats
490		ip netns exec $ns1 nstat -as | grep MPTcp
491		echo Client ns stats
492		ip netns exec $ns2 nstat -as | grep MPTcp
493	fi
494}
495
496chk_add_nr()
497{
498	local add_nr=$1
499	local echo_nr=$2
500	local port_nr=${3:-0}
501	local syn_nr=${4:-$port_nr}
502	local syn_ack_nr=${5:-$port_nr}
503	local ack_nr=${6:-$port_nr}
504	local mis_syn_nr=${7:-0}
505	local mis_ack_nr=${8:-0}
506	local count
507	local dump_stats
508
509	printf "%-39s %s" " " "add"
510	count=`ip netns exec $ns2 nstat -as | grep MPTcpExtAddAddr | awk '{print $2}'`
511	[ -z "$count" ] && count=0
512	if [ "$count" != "$add_nr" ]; then
513		echo "[fail] got $count ADD_ADDR[s] expected $add_nr"
514		ret=1
515		dump_stats=1
516	else
517		echo -n "[ ok ]"
518	fi
519
520	echo -n " - echo  "
521	count=`ip netns exec $ns1 nstat -as | grep MPTcpExtEchoAdd | awk '{print $2}'`
522	[ -z "$count" ] && count=0
523	if [ "$count" != "$echo_nr" ]; then
524		echo "[fail] got $count ADD_ADDR echo[s] expected $echo_nr"
525		ret=1
526		dump_stats=1
527	else
528		echo -n "[ ok ]"
529	fi
530
531	if [ $port_nr -gt 0 ]; then
532		echo -n " - pt "
533		count=`ip netns exec $ns2 nstat -as | grep MPTcpExtPortAdd | awk '{print $2}'`
534		[ -z "$count" ] && count=0
535		if [ "$count" != "$port_nr" ]; then
536			echo "[fail] got $count ADD_ADDR[s] with a port-number expected $port_nr"
537			ret=1
538			dump_stats=1
539		else
540			echo "[ ok ]"
541		fi
542
543		printf "%-39s %s" " " "syn"
544		count=`ip netns exec $ns1 nstat -as | grep MPTcpExtMPJoinPortSynRx |
545			awk '{print $2}'`
546		[ -z "$count" ] && count=0
547		if [ "$count" != "$syn_nr" ]; then
548			echo "[fail] got $count JOIN[s] syn with a different \
549				port-number expected $syn_nr"
550			ret=1
551			dump_stats=1
552		else
553			echo -n "[ ok ]"
554		fi
555
556		echo -n " - synack"
557		count=`ip netns exec $ns2 nstat -as | grep MPTcpExtMPJoinPortSynAckRx |
558			awk '{print $2}'`
559		[ -z "$count" ] && count=0
560		if [ "$count" != "$syn_ack_nr" ]; then
561			echo "[fail] got $count JOIN[s] synack with a different \
562				port-number expected $syn_ack_nr"
563			ret=1
564			dump_stats=1
565		else
566			echo -n "[ ok ]"
567		fi
568
569		echo -n " - ack"
570		count=`ip netns exec $ns1 nstat -as | grep MPTcpExtMPJoinPortAckRx |
571			awk '{print $2}'`
572		[ -z "$count" ] && count=0
573		if [ "$count" != "$ack_nr" ]; then
574			echo "[fail] got $count JOIN[s] ack with a different \
575				port-number expected $ack_nr"
576			ret=1
577			dump_stats=1
578		else
579			echo "[ ok ]"
580		fi
581
582		printf "%-39s %s" " " "syn"
583		count=`ip netns exec $ns1 nstat -as | grep MPTcpExtMismatchPortSynRx |
584			awk '{print $2}'`
585		[ -z "$count" ] && count=0
586		if [ "$count" != "$mis_syn_nr" ]; then
587			echo "[fail] got $count JOIN[s] syn with a mismatched \
588				port-number expected $mis_syn_nr"
589			ret=1
590			dump_stats=1
591		else
592			echo -n "[ ok ]"
593		fi
594
595		echo -n " - ack   "
596		count=`ip netns exec $ns1 nstat -as | grep MPTcpExtMismatchPortAckRx |
597			awk '{print $2}'`
598		[ -z "$count" ] && count=0
599		if [ "$count" != "$mis_ack_nr" ]; then
600			echo "[fail] got $count JOIN[s] ack with a mismatched \
601				port-number expected $mis_ack_nr"
602			ret=1
603			dump_stats=1
604		else
605			echo "[ ok ]"
606		fi
607	else
608		echo ""
609	fi
610
611	if [ "${dump_stats}" = 1 ]; then
612		echo Server ns stats
613		ip netns exec $ns1 nstat -as | grep MPTcp
614		echo Client ns stats
615		ip netns exec $ns2 nstat -as | grep MPTcp
616	fi
617}
618
619chk_rm_nr()
620{
621	local rm_addr_nr=$1
622	local rm_subflow_nr=$2
623	local invert=${3:-""}
624	local count
625	local dump_stats
626	local addr_ns
627	local subflow_ns
628
629	if [ -z $invert ]; then
630		addr_ns=$ns1
631		subflow_ns=$ns2
632	elif [ $invert = "invert" ]; then
633		addr_ns=$ns2
634		subflow_ns=$ns1
635	fi
636
637	printf "%-39s %s" " " "rm "
638	count=`ip netns exec $addr_ns nstat -as | grep MPTcpExtRmAddr | awk '{print $2}'`
639	[ -z "$count" ] && count=0
640	if [ "$count" != "$rm_addr_nr" ]; then
641		echo "[fail] got $count RM_ADDR[s] expected $rm_addr_nr"
642		ret=1
643		dump_stats=1
644	else
645		echo -n "[ ok ]"
646	fi
647
648	echo -n " - sf    "
649	count=`ip netns exec $subflow_ns nstat -as | grep MPTcpExtRmSubflow | awk '{print $2}'`
650	[ -z "$count" ] && count=0
651	if [ "$count" != "$rm_subflow_nr" ]; then
652		echo "[fail] got $count RM_SUBFLOW[s] expected $rm_subflow_nr"
653		ret=1
654		dump_stats=1
655	else
656		echo "[ ok ]"
657	fi
658
659	if [ "${dump_stats}" = 1 ]; then
660		echo Server ns stats
661		ip netns exec $ns1 nstat -as | grep MPTcp
662		echo Client ns stats
663		ip netns exec $ns2 nstat -as | grep MPTcp
664	fi
665}
666
667chk_prio_nr()
668{
669	local mp_prio_nr_tx=$1
670	local mp_prio_nr_rx=$2
671	local count
672	local dump_stats
673
674	printf "%-39s %s" " " "ptx"
675	count=`ip netns exec $ns1 nstat -as | grep MPTcpExtMPPrioTx | awk '{print $2}'`
676	[ -z "$count" ] && count=0
677	if [ "$count" != "$mp_prio_nr_tx" ]; then
678		echo "[fail] got $count MP_PRIO[s] TX expected $mp_prio_nr_tx"
679		ret=1
680		dump_stats=1
681	else
682		echo -n "[ ok ]"
683	fi
684
685	echo -n " - prx   "
686	count=`ip netns exec $ns1 nstat -as | grep MPTcpExtMPPrioRx | awk '{print $2}'`
687	[ -z "$count" ] && count=0
688	if [ "$count" != "$mp_prio_nr_rx" ]; then
689		echo "[fail] got $count MP_PRIO[s] RX expected $mp_prio_nr_rx"
690		ret=1
691		dump_stats=1
692	else
693		echo "[ ok ]"
694	fi
695
696	if [ "${dump_stats}" = 1 ]; then
697		echo Server ns stats
698		ip netns exec $ns1 nstat -as | grep MPTcp
699		echo Client ns stats
700		ip netns exec $ns2 nstat -as | grep MPTcp
701	fi
702}
703
704subflows_tests()
705{
706	reset
707	run_tests $ns1 $ns2 10.0.1.1
708	chk_join_nr "no JOIN" "0" "0" "0"
709
710	# subflow limited by client
711	reset
712	ip netns exec $ns2 ./pm_nl_ctl add 10.0.3.2 flags subflow
713	run_tests $ns1 $ns2 10.0.1.1
714	chk_join_nr "single subflow, limited by client" 0 0 0
715
716	# subflow limited by server
717	reset
718	ip netns exec $ns2 ./pm_nl_ctl limits 0 1
719	ip netns exec $ns2 ./pm_nl_ctl add 10.0.3.2 flags subflow
720	run_tests $ns1 $ns2 10.0.1.1
721	chk_join_nr "single subflow, limited by server" 1 1 0
722
723	# subflow
724	reset
725	ip netns exec $ns1 ./pm_nl_ctl limits 0 1
726	ip netns exec $ns2 ./pm_nl_ctl limits 0 1
727	ip netns exec $ns2 ./pm_nl_ctl add 10.0.3.2 flags subflow
728	run_tests $ns1 $ns2 10.0.1.1
729	chk_join_nr "single subflow" 1 1 1
730
731	# multiple subflows
732	reset
733	ip netns exec $ns1 ./pm_nl_ctl limits 0 2
734	ip netns exec $ns2 ./pm_nl_ctl limits 0 2
735	ip netns exec $ns2 ./pm_nl_ctl add 10.0.3.2 flags subflow
736	ip netns exec $ns2 ./pm_nl_ctl add 10.0.2.2 flags subflow
737	run_tests $ns1 $ns2 10.0.1.1
738	chk_join_nr "multiple subflows" 2 2 2
739
740	# multiple subflows limited by serverf
741	reset
742	ip netns exec $ns1 ./pm_nl_ctl limits 0 1
743	ip netns exec $ns2 ./pm_nl_ctl limits 0 2
744	ip netns exec $ns2 ./pm_nl_ctl add 10.0.3.2 flags subflow
745	ip netns exec $ns2 ./pm_nl_ctl add 10.0.2.2 flags subflow
746	run_tests $ns1 $ns2 10.0.1.1
747	chk_join_nr "multiple subflows, limited by server" 2 2 1
748}
749
750signal_address_tests()
751{
752	# add_address, unused
753	reset
754	ip netns exec $ns1 ./pm_nl_ctl add 10.0.2.1 flags signal
755	run_tests $ns1 $ns2 10.0.1.1
756	chk_join_nr "unused signal address" 0 0 0
757	chk_add_nr 1 1
758
759	# accept and use add_addr
760	reset
761	ip netns exec $ns1 ./pm_nl_ctl limits 0 1
762	ip netns exec $ns2 ./pm_nl_ctl limits 1 1
763	ip netns exec $ns1 ./pm_nl_ctl add 10.0.2.1 flags signal
764	run_tests $ns1 $ns2 10.0.1.1
765	chk_join_nr "signal address" 1 1 1
766	chk_add_nr 1 1
767
768	# accept and use add_addr with an additional subflow
769	# note: signal address in server ns and local addresses in client ns must
770	# belong to different subnets or one of the listed local address could be
771	# used for 'add_addr' subflow
772	reset
773	ip netns exec $ns1 ./pm_nl_ctl add 10.0.2.1 flags signal
774	ip netns exec $ns1 ./pm_nl_ctl limits 0 2
775	ip netns exec $ns2 ./pm_nl_ctl limits 1 2
776	ip netns exec $ns2 ./pm_nl_ctl add 10.0.3.2 flags subflow
777	run_tests $ns1 $ns2 10.0.1.1
778	chk_join_nr "subflow and signal" 2 2 2
779	chk_add_nr 1 1
780
781	# accept and use add_addr with additional subflows
782	reset
783	ip netns exec $ns1 ./pm_nl_ctl limits 0 3
784	ip netns exec $ns1 ./pm_nl_ctl add 10.0.2.1 flags signal
785	ip netns exec $ns2 ./pm_nl_ctl limits 1 3
786	ip netns exec $ns2 ./pm_nl_ctl add 10.0.3.2 flags subflow
787	ip netns exec $ns2 ./pm_nl_ctl add 10.0.4.2 flags subflow
788	run_tests $ns1 $ns2 10.0.1.1
789	chk_join_nr "multiple subflows and signal" 3 3 3
790	chk_add_nr 1 1
791}
792
793link_failure_tests()
794{
795	# accept and use add_addr with additional subflows and link loss
796	reset
797	ip netns exec $ns1 ./pm_nl_ctl limits 0 3
798	ip netns exec $ns1 ./pm_nl_ctl add 10.0.2.1 flags signal
799	ip netns exec $ns2 ./pm_nl_ctl limits 1 3
800	ip netns exec $ns2 ./pm_nl_ctl add 10.0.3.2 flags subflow
801	ip netns exec $ns2 ./pm_nl_ctl add 10.0.4.2 flags subflow
802	run_tests $ns1 $ns2 10.0.1.1 1
803	chk_join_nr "multiple flows, signal, link failure" 3 3 3
804	chk_add_nr 1 1
805}
806
807add_addr_timeout_tests()
808{
809	# add_addr timeout
810	reset_with_add_addr_timeout
811	ip netns exec $ns1 ./pm_nl_ctl limits 0 1
812	ip netns exec $ns2 ./pm_nl_ctl limits 1 1
813	ip netns exec $ns1 ./pm_nl_ctl add 10.0.2.1 flags signal
814	run_tests $ns1 $ns2 10.0.1.1 0 0 0 slow
815	chk_join_nr "signal address, ADD_ADDR timeout" 1 1 1
816	chk_add_nr 4 0
817
818	# add_addr timeout IPv6
819	reset_with_add_addr_timeout 6
820	ip netns exec $ns1 ./pm_nl_ctl limits 0 1
821	ip netns exec $ns2 ./pm_nl_ctl limits 1 1
822	ip netns exec $ns1 ./pm_nl_ctl add dead:beef:2::1 flags signal
823	run_tests $ns1 $ns2 dead:beef:1::1 0 0 0 slow
824	chk_join_nr "signal address, ADD_ADDR6 timeout" 1 1 1
825	chk_add_nr 4 0
826}
827
828remove_tests()
829{
830	# single subflow, remove
831	reset
832	ip netns exec $ns1 ./pm_nl_ctl limits 0 1
833	ip netns exec $ns2 ./pm_nl_ctl limits 0 1
834	ip netns exec $ns2 ./pm_nl_ctl add 10.0.3.2 flags subflow
835	run_tests $ns1 $ns2 10.0.1.1 0 0 -1 slow
836	chk_join_nr "remove single subflow" 1 1 1
837	chk_rm_nr 1 1
838
839	# multiple subflows, remove
840	reset
841	ip netns exec $ns1 ./pm_nl_ctl limits 0 2
842	ip netns exec $ns2 ./pm_nl_ctl limits 0 2
843	ip netns exec $ns2 ./pm_nl_ctl add 10.0.2.2 flags subflow
844	ip netns exec $ns2 ./pm_nl_ctl add 10.0.3.2 flags subflow
845	run_tests $ns1 $ns2 10.0.1.1 0 0 -2 slow
846	chk_join_nr "remove multiple subflows" 2 2 2
847	chk_rm_nr 2 2
848
849	# single address, remove
850	reset
851	ip netns exec $ns1 ./pm_nl_ctl limits 0 1
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 1
854	run_tests $ns1 $ns2 10.0.1.1 0 -1 0 slow
855	chk_join_nr "remove single address" 1 1 1
856	chk_add_nr 1 1
857	chk_rm_nr 1 1 invert
858
859	# subflow and signal, remove
860	reset
861	ip netns exec $ns1 ./pm_nl_ctl limits 0 2
862	ip netns exec $ns1 ./pm_nl_ctl add 10.0.2.1 flags signal
863	ip netns exec $ns2 ./pm_nl_ctl limits 1 2
864	ip netns exec $ns2 ./pm_nl_ctl add 10.0.3.2 flags subflow
865	run_tests $ns1 $ns2 10.0.1.1 0 -1 -1 slow
866	chk_join_nr "remove subflow and signal" 2 2 2
867	chk_add_nr 1 1
868	chk_rm_nr 1 1
869
870	# subflows and signal, remove
871	reset
872	ip netns exec $ns1 ./pm_nl_ctl limits 0 3
873	ip netns exec $ns1 ./pm_nl_ctl add 10.0.2.1 flags signal
874	ip netns exec $ns2 ./pm_nl_ctl limits 1 3
875	ip netns exec $ns2 ./pm_nl_ctl add 10.0.3.2 flags subflow
876	ip netns exec $ns2 ./pm_nl_ctl add 10.0.4.2 flags subflow
877	run_tests $ns1 $ns2 10.0.1.1 0 -1 -2 slow
878	chk_join_nr "remove subflows and signal" 3 3 3
879	chk_add_nr 1 1
880	chk_rm_nr 2 2
881
882	# subflows and signal, flush
883	reset
884	ip netns exec $ns1 ./pm_nl_ctl limits 0 3
885	ip netns exec $ns1 ./pm_nl_ctl add 10.0.2.1 flags signal
886	ip netns exec $ns2 ./pm_nl_ctl limits 1 3
887	ip netns exec $ns2 ./pm_nl_ctl add 10.0.3.2 flags subflow
888	ip netns exec $ns2 ./pm_nl_ctl add 10.0.4.2 flags subflow
889	run_tests $ns1 $ns2 10.0.1.1 0 -8 -8 slow
890	chk_join_nr "flush subflows and signal" 3 3 3
891	chk_add_nr 1 1
892	chk_rm_nr 2 2
893
894	# subflows flush
895	reset
896	ip netns exec $ns1 ./pm_nl_ctl limits 3 3
897	ip netns exec $ns2 ./pm_nl_ctl limits 3 3
898	ip netns exec $ns2 ./pm_nl_ctl add 10.0.2.2 flags subflow id 150
899	ip netns exec $ns2 ./pm_nl_ctl add 10.0.3.2 flags subflow
900	ip netns exec $ns2 ./pm_nl_ctl add 10.0.4.2 flags subflow
901	run_tests $ns1 $ns2 10.0.1.1 0 -8 -8 slow
902	chk_join_nr "flush subflows" 3 3 3
903	chk_rm_nr 3 3
904
905	# addresses flush
906	reset
907	ip netns exec $ns1 ./pm_nl_ctl limits 3 3
908	ip netns exec $ns1 ./pm_nl_ctl add 10.0.2.1 flags signal id 250
909	ip netns exec $ns1 ./pm_nl_ctl add 10.0.3.1 flags signal
910	ip netns exec $ns1 ./pm_nl_ctl add 10.0.4.1 flags signal
911	ip netns exec $ns2 ./pm_nl_ctl limits 3 3
912	run_tests $ns1 $ns2 10.0.1.1 0 -8 -8 slow
913	chk_join_nr "flush addresses" 3 3 3
914	chk_add_nr 3 3
915	chk_rm_nr 3 3 invert
916}
917
918add_tests()
919{
920	# add single subflow
921	reset
922	ip netns exec $ns1 ./pm_nl_ctl limits 0 1
923	ip netns exec $ns2 ./pm_nl_ctl limits 0 1
924	run_tests $ns1 $ns2 10.0.1.1 0 0 1 slow
925	chk_join_nr "add single subflow" 1 1 1
926
927	# add signal address
928	reset
929	ip netns exec $ns1 ./pm_nl_ctl limits 0 1
930	ip netns exec $ns2 ./pm_nl_ctl limits 1 1
931	run_tests $ns1 $ns2 10.0.1.1 0 1 0 slow
932	chk_join_nr "add signal address" 1 1 1
933	chk_add_nr 1 1
934
935	# add multiple subflows
936	reset
937	ip netns exec $ns1 ./pm_nl_ctl limits 0 2
938	ip netns exec $ns2 ./pm_nl_ctl limits 0 2
939	run_tests $ns1 $ns2 10.0.1.1 0 0 2 slow
940	chk_join_nr "add multiple subflows" 2 2 2
941
942	# add multiple subflows IPv6
943	reset
944	ip netns exec $ns1 ./pm_nl_ctl limits 0 2
945	ip netns exec $ns2 ./pm_nl_ctl limits 0 2
946	run_tests $ns1 $ns2 dead:beef:1::1 0 0 2 slow
947	chk_join_nr "add multiple subflows IPv6" 2 2 2
948
949	# add multiple addresses IPv6
950	reset
951	ip netns exec $ns1 ./pm_nl_ctl limits 0 2
952	ip netns exec $ns2 ./pm_nl_ctl limits 2 2
953	run_tests $ns1 $ns2 dead:beef:1::1 0 2 0 slow
954	chk_join_nr "add multiple addresses IPv6" 2 2 2
955	chk_add_nr 2 2
956}
957
958ipv6_tests()
959{
960	# subflow IPv6
961	reset
962	ip netns exec $ns1 ./pm_nl_ctl limits 0 1
963	ip netns exec $ns2 ./pm_nl_ctl limits 0 1
964	ip netns exec $ns2 ./pm_nl_ctl add dead:beef:3::2 flags subflow
965	run_tests $ns1 $ns2 dead:beef:1::1 0 0 0 slow
966	chk_join_nr "single subflow IPv6" 1 1 1
967
968	# add_address, unused IPv6
969	reset
970	ip netns exec $ns1 ./pm_nl_ctl add dead:beef:2::1 flags signal
971	run_tests $ns1 $ns2 dead:beef:1::1 0 0 0 slow
972	chk_join_nr "unused signal address IPv6" 0 0 0
973	chk_add_nr 1 1
974
975	# signal address IPv6
976	reset
977	ip netns exec $ns1 ./pm_nl_ctl limits 0 1
978	ip netns exec $ns1 ./pm_nl_ctl add dead:beef:2::1 flags signal
979	ip netns exec $ns2 ./pm_nl_ctl limits 1 1
980	run_tests $ns1 $ns2 dead:beef:1::1 0 0 0 slow
981	chk_join_nr "single address IPv6" 1 1 1
982	chk_add_nr 1 1
983
984	# single address IPv6, remove
985	reset
986	ip netns exec $ns1 ./pm_nl_ctl limits 0 1
987	ip netns exec $ns1 ./pm_nl_ctl add dead:beef:2::1 flags signal
988	ip netns exec $ns2 ./pm_nl_ctl limits 1 1
989	run_tests $ns1 $ns2 dead:beef:1::1 0 -1 0 slow
990	chk_join_nr "remove single address IPv6" 1 1 1
991	chk_add_nr 1 1
992	chk_rm_nr 1 1 invert
993
994	# subflow and signal IPv6, remove
995	reset
996	ip netns exec $ns1 ./pm_nl_ctl limits 0 2
997	ip netns exec $ns1 ./pm_nl_ctl add dead:beef:2::1 flags signal
998	ip netns exec $ns2 ./pm_nl_ctl limits 1 2
999	ip netns exec $ns2 ./pm_nl_ctl add dead:beef:3::2 flags subflow
1000	run_tests $ns1 $ns2 dead:beef:1::1 0 -1 -1 slow
1001	chk_join_nr "remove subflow and signal IPv6" 2 2 2
1002	chk_add_nr 1 1
1003	chk_rm_nr 1 1
1004}
1005
1006v4mapped_tests()
1007{
1008	# subflow IPv4-mapped to IPv4-mapped
1009	reset
1010	ip netns exec $ns1 ./pm_nl_ctl limits 0 1
1011	ip netns exec $ns2 ./pm_nl_ctl limits 0 1
1012	ip netns exec $ns2 ./pm_nl_ctl add "::ffff:10.0.3.2" flags subflow
1013	run_tests $ns1 $ns2 "::ffff:10.0.1.1"
1014	chk_join_nr "single subflow IPv4-mapped" 1 1 1
1015
1016	# signal address IPv4-mapped with IPv4-mapped sk
1017	reset
1018	ip netns exec $ns1 ./pm_nl_ctl limits 0 1
1019	ip netns exec $ns2 ./pm_nl_ctl limits 1 1
1020	ip netns exec $ns1 ./pm_nl_ctl add "::ffff:10.0.2.1" flags signal
1021	run_tests $ns1 $ns2 "::ffff:10.0.1.1"
1022	chk_join_nr "signal address IPv4-mapped" 1 1 1
1023	chk_add_nr 1 1
1024
1025	# subflow v4-map-v6
1026	reset
1027	ip netns exec $ns1 ./pm_nl_ctl limits 0 1
1028	ip netns exec $ns2 ./pm_nl_ctl limits 0 1
1029	ip netns exec $ns2 ./pm_nl_ctl add 10.0.3.2 flags subflow
1030	run_tests $ns1 $ns2 "::ffff:10.0.1.1"
1031	chk_join_nr "single subflow v4-map-v6" 1 1 1
1032
1033	# signal address v4-map-v6
1034	reset
1035	ip netns exec $ns1 ./pm_nl_ctl limits 0 1
1036	ip netns exec $ns2 ./pm_nl_ctl limits 1 1
1037	ip netns exec $ns1 ./pm_nl_ctl add 10.0.2.1 flags signal
1038	run_tests $ns1 $ns2 "::ffff:10.0.1.1"
1039	chk_join_nr "signal address v4-map-v6" 1 1 1
1040	chk_add_nr 1 1
1041
1042	# subflow v6-map-v4
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 "::ffff:10.0.3.2" flags subflow
1047	run_tests $ns1 $ns2 10.0.1.1
1048	chk_join_nr "single subflow v6-map-v4" 1 1 1
1049
1050	# signal address v6-map-v4
1051	reset
1052	ip netns exec $ns1 ./pm_nl_ctl limits 0 1
1053	ip netns exec $ns2 ./pm_nl_ctl limits 1 1
1054	ip netns exec $ns1 ./pm_nl_ctl add "::ffff:10.0.2.1" flags signal
1055	run_tests $ns1 $ns2 10.0.1.1
1056	chk_join_nr "signal address v6-map-v4" 1 1 1
1057	chk_add_nr 1 1
1058
1059	# no subflow IPv6 to v4 address
1060	reset
1061	ip netns exec $ns1 ./pm_nl_ctl limits 0 1
1062	ip netns exec $ns2 ./pm_nl_ctl limits 0 1
1063	ip netns exec $ns2 ./pm_nl_ctl add dead:beef:2::2 flags subflow
1064	run_tests $ns1 $ns2 10.0.1.1
1065	chk_join_nr "no JOIN with diff families v4-v6" 0 0 0
1066
1067	# no subflow IPv6 to v4 address even if v6 has a valid v4 at the end
1068	reset
1069	ip netns exec $ns1 ./pm_nl_ctl limits 0 1
1070	ip netns exec $ns2 ./pm_nl_ctl limits 0 1
1071	ip netns exec $ns2 ./pm_nl_ctl add dead:beef:2::10.0.3.2 flags subflow
1072	run_tests $ns1 $ns2 10.0.1.1
1073	chk_join_nr "no JOIN with diff families v4-v6-2" 0 0 0
1074
1075	# no subflow IPv4 to v6 address, no need to slow down too then
1076	reset
1077	ip netns exec $ns1 ./pm_nl_ctl limits 0 1
1078	ip netns exec $ns2 ./pm_nl_ctl limits 0 1
1079	ip netns exec $ns2 ./pm_nl_ctl add 10.0.3.2 flags subflow
1080	run_tests $ns1 $ns2 dead:beef:1::1
1081	chk_join_nr "no JOIN with diff families v6-v4" 0 0 0
1082}
1083
1084backup_tests()
1085{
1086	# single subflow, backup
1087	reset
1088	ip netns exec $ns1 ./pm_nl_ctl limits 0 1
1089	ip netns exec $ns2 ./pm_nl_ctl limits 0 1
1090	ip netns exec $ns2 ./pm_nl_ctl add 10.0.3.2 flags subflow,backup
1091	run_tests $ns1 $ns2 10.0.1.1 0 0 0 slow nobackup
1092	chk_join_nr "single subflow, backup" 1 1 1
1093	chk_prio_nr 0 1
1094
1095	# single address, backup
1096	reset
1097	ip netns exec $ns1 ./pm_nl_ctl limits 0 1
1098	ip netns exec $ns1 ./pm_nl_ctl add 10.0.2.1 flags signal
1099	ip netns exec $ns2 ./pm_nl_ctl limits 1 1
1100	run_tests $ns1 $ns2 10.0.1.1 0 0 0 slow backup
1101	chk_join_nr "single address, backup" 1 1 1
1102	chk_add_nr 1 1
1103	chk_prio_nr 1 0
1104}
1105
1106add_addr_ports_tests()
1107{
1108	# signal address with port
1109	reset
1110	ip netns exec $ns1 ./pm_nl_ctl limits 0 1
1111	ip netns exec $ns2 ./pm_nl_ctl limits 1 1
1112	ip netns exec $ns1 ./pm_nl_ctl add 10.0.2.1 flags signal port 10100
1113	run_tests $ns1 $ns2 10.0.1.1
1114	chk_join_nr "signal address with port" 1 1 1
1115	chk_add_nr 1 1 1
1116
1117	# subflow and signal with port
1118	reset
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 limits 0 2
1121	ip netns exec $ns2 ./pm_nl_ctl limits 1 2
1122	ip netns exec $ns2 ./pm_nl_ctl add 10.0.3.2 flags subflow
1123	run_tests $ns1 $ns2 10.0.1.1
1124	chk_join_nr "subflow and signal with port" 2 2 2
1125	chk_add_nr 1 1 1
1126
1127	# single address with port, remove
1128	reset
1129	ip netns exec $ns1 ./pm_nl_ctl limits 0 1
1130	ip netns exec $ns1 ./pm_nl_ctl add 10.0.2.1 flags signal port 10100
1131	ip netns exec $ns2 ./pm_nl_ctl limits 1 1
1132	run_tests $ns1 $ns2 10.0.1.1 0 -1 0 slow
1133	chk_join_nr "remove single address with port" 1 1 1
1134	chk_add_nr 1 1 1
1135	chk_rm_nr 1 1 invert
1136
1137	# subflow and signal with port, remove
1138	reset
1139	ip netns exec $ns1 ./pm_nl_ctl limits 0 2
1140	ip netns exec $ns1 ./pm_nl_ctl add 10.0.2.1 flags signal port 10100
1141	ip netns exec $ns2 ./pm_nl_ctl limits 1 2
1142	ip netns exec $ns2 ./pm_nl_ctl add 10.0.3.2 flags subflow
1143	run_tests $ns1 $ns2 10.0.1.1 0 -1 -1 slow
1144	chk_join_nr "remove subflow and signal with port" 2 2 2
1145	chk_add_nr 1 1 1
1146	chk_rm_nr 1 1
1147
1148	# subflows and signal with port, flush
1149	reset
1150	ip netns exec $ns1 ./pm_nl_ctl limits 0 3
1151	ip netns exec $ns1 ./pm_nl_ctl add 10.0.2.1 flags signal port 10100
1152	ip netns exec $ns2 ./pm_nl_ctl limits 1 3
1153	ip netns exec $ns2 ./pm_nl_ctl add 10.0.3.2 flags subflow
1154	ip netns exec $ns2 ./pm_nl_ctl add 10.0.4.2 flags subflow
1155	run_tests $ns1 $ns2 10.0.1.1 0 -8 -8 slow
1156	chk_join_nr "flush subflows and signal with port" 3 3 3
1157	chk_add_nr 1 1
1158	chk_rm_nr 2 2
1159
1160	# multiple addresses with port
1161	reset
1162	ip netns exec $ns1 ./pm_nl_ctl limits 2 2
1163	ip netns exec $ns1 ./pm_nl_ctl add 10.0.2.1 flags signal port 10100
1164	ip netns exec $ns1 ./pm_nl_ctl add 10.0.3.1 flags signal port 10100
1165	ip netns exec $ns2 ./pm_nl_ctl limits 2 2
1166	run_tests $ns1 $ns2 10.0.1.1
1167	chk_join_nr "multiple addresses with port" 2 2 2
1168	chk_add_nr 2 2 2
1169
1170	# multiple addresses with ports
1171	reset
1172	ip netns exec $ns1 ./pm_nl_ctl limits 2 2
1173	ip netns exec $ns1 ./pm_nl_ctl add 10.0.2.1 flags signal port 10100
1174	ip netns exec $ns1 ./pm_nl_ctl add 10.0.3.1 flags signal port 10101
1175	ip netns exec $ns2 ./pm_nl_ctl limits 2 2
1176	run_tests $ns1 $ns2 10.0.1.1
1177	chk_join_nr "multiple addresses with ports" 2 2 2
1178	chk_add_nr 2 2 2
1179}
1180
1181syncookies_tests()
1182{
1183	# single subflow, syncookies
1184	reset_with_cookies
1185	ip netns exec $ns1 ./pm_nl_ctl limits 0 1
1186	ip netns exec $ns2 ./pm_nl_ctl limits 0 1
1187	ip netns exec $ns2 ./pm_nl_ctl add 10.0.3.2 flags subflow
1188	run_tests $ns1 $ns2 10.0.1.1
1189	chk_join_nr "single subflow with syn cookies" 1 1 1
1190
1191	# multiple subflows with syn cookies
1192	reset_with_cookies
1193	ip netns exec $ns1 ./pm_nl_ctl limits 0 2
1194	ip netns exec $ns2 ./pm_nl_ctl limits 0 2
1195	ip netns exec $ns2 ./pm_nl_ctl add 10.0.3.2 flags subflow
1196	ip netns exec $ns2 ./pm_nl_ctl add 10.0.2.2 flags subflow
1197	run_tests $ns1 $ns2 10.0.1.1
1198	chk_join_nr "multiple subflows with syn cookies" 2 2 2
1199
1200	# multiple subflows limited by server
1201	reset_with_cookies
1202	ip netns exec $ns1 ./pm_nl_ctl limits 0 1
1203	ip netns exec $ns2 ./pm_nl_ctl limits 0 2
1204	ip netns exec $ns2 ./pm_nl_ctl add 10.0.3.2 flags subflow
1205	ip netns exec $ns2 ./pm_nl_ctl add 10.0.2.2 flags subflow
1206	run_tests $ns1 $ns2 10.0.1.1
1207	chk_join_nr "subflows limited by server w cookies" 2 2 1
1208
1209	# test signal address with cookies
1210	reset_with_cookies
1211	ip netns exec $ns1 ./pm_nl_ctl limits 0 1
1212	ip netns exec $ns2 ./pm_nl_ctl limits 1 1
1213	ip netns exec $ns1 ./pm_nl_ctl add 10.0.2.1 flags signal
1214	run_tests $ns1 $ns2 10.0.1.1
1215	chk_join_nr "signal address with syn cookies" 1 1 1
1216	chk_add_nr 1 1
1217
1218	# test cookie with subflow and signal
1219	reset_with_cookies
1220	ip netns exec $ns1 ./pm_nl_ctl add 10.0.2.1 flags signal
1221	ip netns exec $ns1 ./pm_nl_ctl limits 0 2
1222	ip netns exec $ns2 ./pm_nl_ctl limits 1 2
1223	ip netns exec $ns2 ./pm_nl_ctl add 10.0.3.2 flags subflow
1224	run_tests $ns1 $ns2 10.0.1.1
1225	chk_join_nr "subflow and signal w cookies" 2 2 2
1226	chk_add_nr 1 1
1227
1228	# accept and use add_addr with additional subflows
1229	reset_with_cookies
1230	ip netns exec $ns1 ./pm_nl_ctl limits 0 3
1231	ip netns exec $ns1 ./pm_nl_ctl add 10.0.2.1 flags signal
1232	ip netns exec $ns2 ./pm_nl_ctl limits 1 3
1233	ip netns exec $ns2 ./pm_nl_ctl add 10.0.3.2 flags subflow
1234	ip netns exec $ns2 ./pm_nl_ctl add 10.0.4.2 flags subflow
1235	run_tests $ns1 $ns2 10.0.1.1
1236	chk_join_nr "subflows and signal w. cookies" 3 3 3
1237	chk_add_nr 1 1
1238}
1239
1240all_tests()
1241{
1242	subflows_tests
1243	signal_address_tests
1244	link_failure_tests
1245	add_addr_timeout_tests
1246	remove_tests
1247	add_tests
1248	ipv6_tests
1249	v4mapped_tests
1250	backup_tests
1251	add_addr_ports_tests
1252	syncookies_tests
1253}
1254
1255usage()
1256{
1257	echo "mptcp_join usage:"
1258	echo "  -f subflows_tests"
1259	echo "  -s signal_address_tests"
1260	echo "  -l link_failure_tests"
1261	echo "  -t add_addr_timeout_tests"
1262	echo "  -r remove_tests"
1263	echo "  -a add_tests"
1264	echo "  -6 ipv6_tests"
1265	echo "  -4 v4mapped_tests"
1266	echo "  -b backup_tests"
1267	echo "  -p add_addr_ports_tests"
1268	echo "  -c syncookies_tests"
1269	echo "  -h help"
1270}
1271
1272sin=$(mktemp)
1273sout=$(mktemp)
1274cin=$(mktemp)
1275cinsent=$(mktemp)
1276cout=$(mktemp)
1277init
1278make_file "$cin" "client" 1
1279make_file "$sin" "server" 1
1280trap cleanup EXIT
1281
1282if [ -z $1 ]; then
1283	all_tests
1284	exit $ret
1285fi
1286
1287while getopts 'fsltra64bpch' opt; do
1288	case $opt in
1289		f)
1290			subflows_tests
1291			;;
1292		s)
1293			signal_address_tests
1294			;;
1295		l)
1296			link_failure_tests
1297			;;
1298		t)
1299			add_addr_timeout_tests
1300			;;
1301		r)
1302			remove_tests
1303			;;
1304		a)
1305			add_tests
1306			;;
1307		6)
1308			ipv6_tests
1309			;;
1310		4)
1311			v4mapped_tests
1312			;;
1313		b)
1314			backup_tests
1315			;;
1316		p)
1317			add_addr_ports_tests
1318			;;
1319		c)
1320			syncookies_tests
1321			;;
1322		h | *)
1323			usage
1324			;;
1325	esac
1326done
1327
1328exit $ret
1329