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