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