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