xref: /OK3568_Linux_fs/kernel/tools/testing/selftests/net/mptcp/mptcp_join.sh (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun#!/bin/bash
2*4882a593Smuzhiyun# SPDX-License-Identifier: GPL-2.0
3*4882a593Smuzhiyun
4*4882a593Smuzhiyunret=0
5*4882a593Smuzhiyunsin=""
6*4882a593Smuzhiyunsout=""
7*4882a593Smuzhiyuncin=""
8*4882a593Smuzhiyuncout=""
9*4882a593Smuzhiyunksft_skip=4
10*4882a593Smuzhiyuntimeout=30
11*4882a593Smuzhiyunmptcp_connect=""
12*4882a593Smuzhiyuncapture=0
13*4882a593Smuzhiyun
14*4882a593SmuzhiyunTEST_COUNT=0
15*4882a593Smuzhiyun
16*4882a593Smuzhiyuninit()
17*4882a593Smuzhiyun{
18*4882a593Smuzhiyun	capout=$(mktemp)
19*4882a593Smuzhiyun
20*4882a593Smuzhiyun	rndh=$(printf %x $sec)-$(mktemp -u XXXXXX)
21*4882a593Smuzhiyun
22*4882a593Smuzhiyun	ns1="ns1-$rndh"
23*4882a593Smuzhiyun	ns2="ns2-$rndh"
24*4882a593Smuzhiyun
25*4882a593Smuzhiyun	for netns in "$ns1" "$ns2";do
26*4882a593Smuzhiyun		ip netns add $netns || exit $ksft_skip
27*4882a593Smuzhiyun		ip -net $netns link set lo up
28*4882a593Smuzhiyun		ip netns exec $netns sysctl -q net.mptcp.enabled=1
29*4882a593Smuzhiyun		ip netns exec $netns sysctl -q net.ipv4.conf.all.rp_filter=0
30*4882a593Smuzhiyun		ip netns exec $netns sysctl -q net.ipv4.conf.default.rp_filter=0
31*4882a593Smuzhiyun	done
32*4882a593Smuzhiyun
33*4882a593Smuzhiyun	#  ns1              ns2
34*4882a593Smuzhiyun	# ns1eth1    ns2eth1
35*4882a593Smuzhiyun	# ns1eth2    ns2eth2
36*4882a593Smuzhiyun	# ns1eth3    ns2eth3
37*4882a593Smuzhiyun	# ns1eth4    ns2eth4
38*4882a593Smuzhiyun
39*4882a593Smuzhiyun	for i in `seq 1 4`; do
40*4882a593Smuzhiyun		ip link add ns1eth$i netns "$ns1" type veth peer name ns2eth$i netns "$ns2"
41*4882a593Smuzhiyun		ip -net "$ns1" addr add 10.0.$i.1/24 dev ns1eth$i
42*4882a593Smuzhiyun		ip -net "$ns1" addr add dead:beef:$i::1/64 dev ns1eth$i nodad
43*4882a593Smuzhiyun		ip -net "$ns1" link set ns1eth$i up
44*4882a593Smuzhiyun
45*4882a593Smuzhiyun		ip -net "$ns2" addr add 10.0.$i.2/24 dev ns2eth$i
46*4882a593Smuzhiyun		ip -net "$ns2" addr add dead:beef:$i::2/64 dev ns2eth$i nodad
47*4882a593Smuzhiyun		ip -net "$ns2" link set ns2eth$i up
48*4882a593Smuzhiyun
49*4882a593Smuzhiyun		# let $ns2 reach any $ns1 address from any interface
50*4882a593Smuzhiyun		ip -net "$ns2" route add default via 10.0.$i.1 dev ns2eth$i metric 10$i
51*4882a593Smuzhiyun	done
52*4882a593Smuzhiyun}
53*4882a593Smuzhiyun
54*4882a593Smuzhiyuncleanup_partial()
55*4882a593Smuzhiyun{
56*4882a593Smuzhiyun	rm -f "$capout"
57*4882a593Smuzhiyun
58*4882a593Smuzhiyun	for netns in "$ns1" "$ns2"; do
59*4882a593Smuzhiyun		ip netns del $netns
60*4882a593Smuzhiyun	done
61*4882a593Smuzhiyun}
62*4882a593Smuzhiyun
63*4882a593Smuzhiyuncleanup()
64*4882a593Smuzhiyun{
65*4882a593Smuzhiyun	rm -f "$cin" "$cout"
66*4882a593Smuzhiyun	rm -f "$sin" "$sout"
67*4882a593Smuzhiyun	cleanup_partial
68*4882a593Smuzhiyun}
69*4882a593Smuzhiyun
70*4882a593Smuzhiyunreset()
71*4882a593Smuzhiyun{
72*4882a593Smuzhiyun	cleanup_partial
73*4882a593Smuzhiyun	init
74*4882a593Smuzhiyun}
75*4882a593Smuzhiyun
76*4882a593Smuzhiyunreset_with_cookies()
77*4882a593Smuzhiyun{
78*4882a593Smuzhiyun	reset
79*4882a593Smuzhiyun
80*4882a593Smuzhiyun	for netns in "$ns1" "$ns2";do
81*4882a593Smuzhiyun		ip netns exec $netns sysctl -q net.ipv4.tcp_syncookies=2
82*4882a593Smuzhiyun	done
83*4882a593Smuzhiyun}
84*4882a593Smuzhiyun
85*4882a593Smuzhiyunfor arg in "$@"; do
86*4882a593Smuzhiyun	if [ "$arg" = "-c" ]; then
87*4882a593Smuzhiyun		capture=1
88*4882a593Smuzhiyun	fi
89*4882a593Smuzhiyundone
90*4882a593Smuzhiyun
91*4882a593Smuzhiyunip -Version > /dev/null 2>&1
92*4882a593Smuzhiyunif [ $? -ne 0 ];then
93*4882a593Smuzhiyun	echo "SKIP: Could not run test without ip tool"
94*4882a593Smuzhiyun	exit $ksft_skip
95*4882a593Smuzhiyunfi
96*4882a593Smuzhiyun
97*4882a593Smuzhiyun
98*4882a593Smuzhiyuncheck_transfer()
99*4882a593Smuzhiyun{
100*4882a593Smuzhiyun	in=$1
101*4882a593Smuzhiyun	out=$2
102*4882a593Smuzhiyun	what=$3
103*4882a593Smuzhiyun
104*4882a593Smuzhiyun	cmp "$in" "$out" > /dev/null 2>&1
105*4882a593Smuzhiyun	if [ $? -ne 0 ] ;then
106*4882a593Smuzhiyun		echo "[ FAIL ] $what does not match (in, out):"
107*4882a593Smuzhiyun		print_file_err "$in"
108*4882a593Smuzhiyun		print_file_err "$out"
109*4882a593Smuzhiyun
110*4882a593Smuzhiyun		return 1
111*4882a593Smuzhiyun	fi
112*4882a593Smuzhiyun
113*4882a593Smuzhiyun	return 0
114*4882a593Smuzhiyun}
115*4882a593Smuzhiyun
116*4882a593Smuzhiyundo_ping()
117*4882a593Smuzhiyun{
118*4882a593Smuzhiyun	listener_ns="$1"
119*4882a593Smuzhiyun	connector_ns="$2"
120*4882a593Smuzhiyun	connect_addr="$3"
121*4882a593Smuzhiyun
122*4882a593Smuzhiyun	ip netns exec ${connector_ns} ping -q -c 1 $connect_addr >/dev/null
123*4882a593Smuzhiyun	if [ $? -ne 0 ] ; then
124*4882a593Smuzhiyun		echo "$listener_ns -> $connect_addr connectivity [ FAIL ]" 1>&2
125*4882a593Smuzhiyun		ret=1
126*4882a593Smuzhiyun	fi
127*4882a593Smuzhiyun}
128*4882a593Smuzhiyun
129*4882a593Smuzhiyundo_transfer()
130*4882a593Smuzhiyun{
131*4882a593Smuzhiyun	listener_ns="$1"
132*4882a593Smuzhiyun	connector_ns="$2"
133*4882a593Smuzhiyun	cl_proto="$3"
134*4882a593Smuzhiyun	srv_proto="$4"
135*4882a593Smuzhiyun	connect_addr="$5"
136*4882a593Smuzhiyun	rm_nr_ns1="$6"
137*4882a593Smuzhiyun	rm_nr_ns2="$7"
138*4882a593Smuzhiyun
139*4882a593Smuzhiyun	port=$((10000+$TEST_COUNT))
140*4882a593Smuzhiyun	TEST_COUNT=$((TEST_COUNT+1))
141*4882a593Smuzhiyun
142*4882a593Smuzhiyun	:> "$cout"
143*4882a593Smuzhiyun	:> "$sout"
144*4882a593Smuzhiyun	:> "$capout"
145*4882a593Smuzhiyun
146*4882a593Smuzhiyun	if [ $capture -eq 1 ]; then
147*4882a593Smuzhiyun		if [ -z $SUDO_USER ] ; then
148*4882a593Smuzhiyun			capuser=""
149*4882a593Smuzhiyun		else
150*4882a593Smuzhiyun			capuser="-Z $SUDO_USER"
151*4882a593Smuzhiyun		fi
152*4882a593Smuzhiyun
153*4882a593Smuzhiyun		capfile=$(printf "mp_join-%02u-%s.pcap" "$TEST_COUNT" "${listener_ns}")
154*4882a593Smuzhiyun
155*4882a593Smuzhiyun		echo "Capturing traffic for test $TEST_COUNT into $capfile"
156*4882a593Smuzhiyun		ip netns exec ${listener_ns} tcpdump -i any -s 65535 -B 32768 $capuser -w $capfile > "$capout" 2>&1 &
157*4882a593Smuzhiyun		cappid=$!
158*4882a593Smuzhiyun
159*4882a593Smuzhiyun		sleep 1
160*4882a593Smuzhiyun	fi
161*4882a593Smuzhiyun
162*4882a593Smuzhiyun	if [[ $rm_nr_ns1 -eq 0 && $rm_nr_ns2 -eq 0 ]]; then
163*4882a593Smuzhiyun		mptcp_connect="./mptcp_connect -j"
164*4882a593Smuzhiyun	else
165*4882a593Smuzhiyun		mptcp_connect="./mptcp_connect -r"
166*4882a593Smuzhiyun	fi
167*4882a593Smuzhiyun
168*4882a593Smuzhiyun	ip netns exec ${listener_ns} $mptcp_connect -t $timeout -l -p $port -s ${srv_proto} 0.0.0.0 < "$sin" > "$sout" &
169*4882a593Smuzhiyun	spid=$!
170*4882a593Smuzhiyun
171*4882a593Smuzhiyun	sleep 1
172*4882a593Smuzhiyun
173*4882a593Smuzhiyun	ip netns exec ${connector_ns} $mptcp_connect -t $timeout -p $port -s ${cl_proto} $connect_addr < "$cin" > "$cout" &
174*4882a593Smuzhiyun	cpid=$!
175*4882a593Smuzhiyun
176*4882a593Smuzhiyun	if [ $rm_nr_ns1 -gt 0 ]; then
177*4882a593Smuzhiyun		counter=1
178*4882a593Smuzhiyun		sleep 1
179*4882a593Smuzhiyun
180*4882a593Smuzhiyun		while [ $counter -le $rm_nr_ns1 ]
181*4882a593Smuzhiyun		do
182*4882a593Smuzhiyun			ip netns exec ${listener_ns} ./pm_nl_ctl del $counter
183*4882a593Smuzhiyun			sleep 1
184*4882a593Smuzhiyun			let counter+=1
185*4882a593Smuzhiyun		done
186*4882a593Smuzhiyun	fi
187*4882a593Smuzhiyun
188*4882a593Smuzhiyun	if [ $rm_nr_ns2 -gt 0 ]; then
189*4882a593Smuzhiyun		counter=1
190*4882a593Smuzhiyun		sleep 1
191*4882a593Smuzhiyun
192*4882a593Smuzhiyun		while [ $counter -le $rm_nr_ns2 ]
193*4882a593Smuzhiyun		do
194*4882a593Smuzhiyun			ip netns exec ${connector_ns} ./pm_nl_ctl del $counter
195*4882a593Smuzhiyun			sleep 1
196*4882a593Smuzhiyun			let counter+=1
197*4882a593Smuzhiyun		done
198*4882a593Smuzhiyun	fi
199*4882a593Smuzhiyun
200*4882a593Smuzhiyun	wait $cpid
201*4882a593Smuzhiyun	retc=$?
202*4882a593Smuzhiyun	wait $spid
203*4882a593Smuzhiyun	rets=$?
204*4882a593Smuzhiyun
205*4882a593Smuzhiyun	if [ $capture -eq 1 ]; then
206*4882a593Smuzhiyun	    sleep 1
207*4882a593Smuzhiyun	    kill $cappid
208*4882a593Smuzhiyun	fi
209*4882a593Smuzhiyun
210*4882a593Smuzhiyun	if [ ${rets} -ne 0 ] || [ ${retc} -ne 0 ]; then
211*4882a593Smuzhiyun		echo " client exit code $retc, server $rets" 1>&2
212*4882a593Smuzhiyun		echo -e "\nnetns ${listener_ns} socket stat for ${port}:" 1>&2
213*4882a593Smuzhiyun		ip netns exec ${listener_ns} ss -nita 1>&2 -o "sport = :$port"
214*4882a593Smuzhiyun		echo -e "\nnetns ${connector_ns} socket stat for ${port}:" 1>&2
215*4882a593Smuzhiyun		ip netns exec ${connector_ns} ss -nita 1>&2 -o "dport = :$port"
216*4882a593Smuzhiyun
217*4882a593Smuzhiyun		cat "$capout"
218*4882a593Smuzhiyun		return 1
219*4882a593Smuzhiyun	fi
220*4882a593Smuzhiyun
221*4882a593Smuzhiyun	check_transfer $sin $cout "file received by client"
222*4882a593Smuzhiyun	retc=$?
223*4882a593Smuzhiyun	check_transfer $cin $sout "file received by server"
224*4882a593Smuzhiyun	rets=$?
225*4882a593Smuzhiyun
226*4882a593Smuzhiyun	if [ $retc -eq 0 ] && [ $rets -eq 0 ];then
227*4882a593Smuzhiyun		cat "$capout"
228*4882a593Smuzhiyun		return 0
229*4882a593Smuzhiyun	fi
230*4882a593Smuzhiyun
231*4882a593Smuzhiyun	cat "$capout"
232*4882a593Smuzhiyun	return 1
233*4882a593Smuzhiyun}
234*4882a593Smuzhiyun
235*4882a593Smuzhiyunmake_file()
236*4882a593Smuzhiyun{
237*4882a593Smuzhiyun	name=$1
238*4882a593Smuzhiyun	who=$2
239*4882a593Smuzhiyun
240*4882a593Smuzhiyun	SIZE=1
241*4882a593Smuzhiyun
242*4882a593Smuzhiyun	dd if=/dev/urandom of="$name" bs=1024 count=$SIZE 2> /dev/null
243*4882a593Smuzhiyun	echo -e "\nMPTCP_TEST_FILE_END_MARKER" >> "$name"
244*4882a593Smuzhiyun
245*4882a593Smuzhiyun	echo "Created $name (size $SIZE KB) containing data sent by $who"
246*4882a593Smuzhiyun}
247*4882a593Smuzhiyun
248*4882a593Smuzhiyunrun_tests()
249*4882a593Smuzhiyun{
250*4882a593Smuzhiyun	listener_ns="$1"
251*4882a593Smuzhiyun	connector_ns="$2"
252*4882a593Smuzhiyun	connect_addr="$3"
253*4882a593Smuzhiyun	lret=0
254*4882a593Smuzhiyun
255*4882a593Smuzhiyun	do_transfer ${listener_ns} ${connector_ns} MPTCP MPTCP ${connect_addr} 0 0
256*4882a593Smuzhiyun	lret=$?
257*4882a593Smuzhiyun	if [ $lret -ne 0 ]; then
258*4882a593Smuzhiyun		ret=$lret
259*4882a593Smuzhiyun		return
260*4882a593Smuzhiyun	fi
261*4882a593Smuzhiyun}
262*4882a593Smuzhiyun
263*4882a593Smuzhiyunrun_remove_tests()
264*4882a593Smuzhiyun{
265*4882a593Smuzhiyun	listener_ns="$1"
266*4882a593Smuzhiyun	connector_ns="$2"
267*4882a593Smuzhiyun	connect_addr="$3"
268*4882a593Smuzhiyun	rm_nr_ns1="$4"
269*4882a593Smuzhiyun	rm_nr_ns2="$5"
270*4882a593Smuzhiyun	lret=0
271*4882a593Smuzhiyun
272*4882a593Smuzhiyun	do_transfer ${listener_ns} ${connector_ns} MPTCP MPTCP ${connect_addr} ${rm_nr_ns1} ${rm_nr_ns2}
273*4882a593Smuzhiyun	lret=$?
274*4882a593Smuzhiyun	if [ $lret -ne 0 ]; then
275*4882a593Smuzhiyun		ret=$lret
276*4882a593Smuzhiyun		return
277*4882a593Smuzhiyun	fi
278*4882a593Smuzhiyun}
279*4882a593Smuzhiyun
280*4882a593Smuzhiyunchk_join_nr()
281*4882a593Smuzhiyun{
282*4882a593Smuzhiyun	local msg="$1"
283*4882a593Smuzhiyun	local syn_nr=$2
284*4882a593Smuzhiyun	local syn_ack_nr=$3
285*4882a593Smuzhiyun	local ack_nr=$4
286*4882a593Smuzhiyun	local count
287*4882a593Smuzhiyun	local dump_stats
288*4882a593Smuzhiyun
289*4882a593Smuzhiyun	printf "%02u %-36s %s" "$TEST_COUNT" "$msg" "syn"
290*4882a593Smuzhiyun	count=`ip netns exec $ns1 nstat -as | grep MPTcpExtMPJoinSynRx | awk '{print $2}'`
291*4882a593Smuzhiyun	[ -z "$count" ] && count=0
292*4882a593Smuzhiyun	if [ "$count" != "$syn_nr" ]; then
293*4882a593Smuzhiyun		echo "[fail] got $count JOIN[s] syn expected $syn_nr"
294*4882a593Smuzhiyun		ret=1
295*4882a593Smuzhiyun		dump_stats=1
296*4882a593Smuzhiyun	else
297*4882a593Smuzhiyun		echo -n "[ ok ]"
298*4882a593Smuzhiyun	fi
299*4882a593Smuzhiyun
300*4882a593Smuzhiyun	echo -n " - synack"
301*4882a593Smuzhiyun	count=`ip netns exec $ns2 nstat -as | grep MPTcpExtMPJoinSynAckRx | awk '{print $2}'`
302*4882a593Smuzhiyun	[ -z "$count" ] && count=0
303*4882a593Smuzhiyun	if [ "$count" != "$syn_ack_nr" ]; then
304*4882a593Smuzhiyun		echo "[fail] got $count JOIN[s] synack expected $syn_ack_nr"
305*4882a593Smuzhiyun		ret=1
306*4882a593Smuzhiyun		dump_stats=1
307*4882a593Smuzhiyun	else
308*4882a593Smuzhiyun		echo -n "[ ok ]"
309*4882a593Smuzhiyun	fi
310*4882a593Smuzhiyun
311*4882a593Smuzhiyun	echo -n " - ack"
312*4882a593Smuzhiyun	count=`ip netns exec $ns1 nstat -as | grep MPTcpExtMPJoinAckRx | awk '{print $2}'`
313*4882a593Smuzhiyun	[ -z "$count" ] && count=0
314*4882a593Smuzhiyun	if [ "$count" != "$ack_nr" ]; then
315*4882a593Smuzhiyun		echo "[fail] got $count JOIN[s] ack expected $ack_nr"
316*4882a593Smuzhiyun		ret=1
317*4882a593Smuzhiyun		dump_stats=1
318*4882a593Smuzhiyun	else
319*4882a593Smuzhiyun		echo "[ ok ]"
320*4882a593Smuzhiyun	fi
321*4882a593Smuzhiyun	if [ "${dump_stats}" = 1 ]; then
322*4882a593Smuzhiyun		echo Server ns stats
323*4882a593Smuzhiyun		ip netns exec $ns1 nstat -as | grep MPTcp
324*4882a593Smuzhiyun		echo Client ns stats
325*4882a593Smuzhiyun		ip netns exec $ns2 nstat -as | grep MPTcp
326*4882a593Smuzhiyun	fi
327*4882a593Smuzhiyun}
328*4882a593Smuzhiyun
329*4882a593Smuzhiyunchk_add_nr()
330*4882a593Smuzhiyun{
331*4882a593Smuzhiyun	local add_nr=$1
332*4882a593Smuzhiyun	local echo_nr=$2
333*4882a593Smuzhiyun	local count
334*4882a593Smuzhiyun	local dump_stats
335*4882a593Smuzhiyun
336*4882a593Smuzhiyun	printf "%-39s %s" " " "add"
337*4882a593Smuzhiyun	count=`ip netns exec $ns2 nstat -as | grep MPTcpExtAddAddr | awk '{print $2}'`
338*4882a593Smuzhiyun	[ -z "$count" ] && count=0
339*4882a593Smuzhiyun	if [ "$count" != "$add_nr" ]; then
340*4882a593Smuzhiyun		echo "[fail] got $count ADD_ADDR[s] expected $add_nr"
341*4882a593Smuzhiyun		ret=1
342*4882a593Smuzhiyun		dump_stats=1
343*4882a593Smuzhiyun	else
344*4882a593Smuzhiyun		echo -n "[ ok ]"
345*4882a593Smuzhiyun	fi
346*4882a593Smuzhiyun
347*4882a593Smuzhiyun	echo -n " - echo  "
348*4882a593Smuzhiyun	count=`ip netns exec $ns1 nstat -as | grep MPTcpExtEchoAdd | awk '{print $2}'`
349*4882a593Smuzhiyun	[ -z "$count" ] && count=0
350*4882a593Smuzhiyun	if [ "$count" != "$echo_nr" ]; then
351*4882a593Smuzhiyun		echo "[fail] got $count ADD_ADDR echo[s] expected $echo_nr"
352*4882a593Smuzhiyun		ret=1
353*4882a593Smuzhiyun		dump_stats=1
354*4882a593Smuzhiyun	else
355*4882a593Smuzhiyun		echo "[ ok ]"
356*4882a593Smuzhiyun	fi
357*4882a593Smuzhiyun
358*4882a593Smuzhiyun	if [ "${dump_stats}" = 1 ]; then
359*4882a593Smuzhiyun		echo Server ns stats
360*4882a593Smuzhiyun		ip netns exec $ns1 nstat -as | grep MPTcp
361*4882a593Smuzhiyun		echo Client ns stats
362*4882a593Smuzhiyun		ip netns exec $ns2 nstat -as | grep MPTcp
363*4882a593Smuzhiyun	fi
364*4882a593Smuzhiyun}
365*4882a593Smuzhiyun
366*4882a593Smuzhiyunchk_rm_nr()
367*4882a593Smuzhiyun{
368*4882a593Smuzhiyun	local rm_addr_nr=$1
369*4882a593Smuzhiyun	local rm_subflow_nr=$2
370*4882a593Smuzhiyun	local count
371*4882a593Smuzhiyun	local dump_stats
372*4882a593Smuzhiyun
373*4882a593Smuzhiyun	printf "%-39s %s" " " "rm "
374*4882a593Smuzhiyun	count=`ip netns exec $ns1 nstat -as | grep MPTcpExtRmAddr | awk '{print $2}'`
375*4882a593Smuzhiyun	[ -z "$count" ] && count=0
376*4882a593Smuzhiyun	if [ "$count" != "$rm_addr_nr" ]; then
377*4882a593Smuzhiyun		echo "[fail] got $count RM_ADDR[s] expected $rm_addr_nr"
378*4882a593Smuzhiyun		ret=1
379*4882a593Smuzhiyun		dump_stats=1
380*4882a593Smuzhiyun	else
381*4882a593Smuzhiyun		echo -n "[ ok ]"
382*4882a593Smuzhiyun	fi
383*4882a593Smuzhiyun
384*4882a593Smuzhiyun	echo -n " - sf    "
385*4882a593Smuzhiyun	count=`ip netns exec $ns2 nstat -as | grep MPTcpExtRmSubflow | awk '{print $2}'`
386*4882a593Smuzhiyun	[ -z "$count" ] && count=0
387*4882a593Smuzhiyun	if [ "$count" != "$rm_subflow_nr" ]; then
388*4882a593Smuzhiyun		echo "[fail] got $count RM_SUBFLOW[s] expected $rm_subflow_nr"
389*4882a593Smuzhiyun		ret=1
390*4882a593Smuzhiyun		dump_stats=1
391*4882a593Smuzhiyun	else
392*4882a593Smuzhiyun		echo "[ ok ]"
393*4882a593Smuzhiyun	fi
394*4882a593Smuzhiyun
395*4882a593Smuzhiyun	if [ "${dump_stats}" = 1 ]; then
396*4882a593Smuzhiyun		echo Server ns stats
397*4882a593Smuzhiyun		ip netns exec $ns1 nstat -as | grep MPTcp
398*4882a593Smuzhiyun		echo Client ns stats
399*4882a593Smuzhiyun		ip netns exec $ns2 nstat -as | grep MPTcp
400*4882a593Smuzhiyun	fi
401*4882a593Smuzhiyun}
402*4882a593Smuzhiyun
403*4882a593Smuzhiyunsin=$(mktemp)
404*4882a593Smuzhiyunsout=$(mktemp)
405*4882a593Smuzhiyuncin=$(mktemp)
406*4882a593Smuzhiyuncout=$(mktemp)
407*4882a593Smuzhiyuninit
408*4882a593Smuzhiyunmake_file "$cin" "client"
409*4882a593Smuzhiyunmake_file "$sin" "server"
410*4882a593Smuzhiyuntrap cleanup EXIT
411*4882a593Smuzhiyun
412*4882a593Smuzhiyunrun_tests $ns1 $ns2 10.0.1.1
413*4882a593Smuzhiyunchk_join_nr "no JOIN" "0" "0" "0"
414*4882a593Smuzhiyun
415*4882a593Smuzhiyun# subflow limted by client
416*4882a593Smuzhiyunreset
417*4882a593Smuzhiyunip netns exec $ns2 ./pm_nl_ctl add 10.0.3.2 flags subflow
418*4882a593Smuzhiyunrun_tests $ns1 $ns2 10.0.1.1
419*4882a593Smuzhiyunchk_join_nr "single subflow, limited by client" 0 0 0
420*4882a593Smuzhiyun
421*4882a593Smuzhiyun# subflow limted by server
422*4882a593Smuzhiyunreset
423*4882a593Smuzhiyunip netns exec $ns2 ./pm_nl_ctl limits 0 1
424*4882a593Smuzhiyunip netns exec $ns2 ./pm_nl_ctl add 10.0.3.2 flags subflow
425*4882a593Smuzhiyunrun_tests $ns1 $ns2 10.0.1.1
426*4882a593Smuzhiyunchk_join_nr "single subflow, limited by server" 1 1 0
427*4882a593Smuzhiyun
428*4882a593Smuzhiyun# subflow
429*4882a593Smuzhiyunreset
430*4882a593Smuzhiyunip netns exec $ns1 ./pm_nl_ctl limits 0 1
431*4882a593Smuzhiyunip netns exec $ns2 ./pm_nl_ctl limits 0 1
432*4882a593Smuzhiyunip netns exec $ns2 ./pm_nl_ctl add 10.0.3.2 flags subflow
433*4882a593Smuzhiyunrun_tests $ns1 $ns2 10.0.1.1
434*4882a593Smuzhiyunchk_join_nr "single subflow" 1 1 1
435*4882a593Smuzhiyun
436*4882a593Smuzhiyun# multiple subflows
437*4882a593Smuzhiyunreset
438*4882a593Smuzhiyunip netns exec $ns1 ./pm_nl_ctl limits 0 2
439*4882a593Smuzhiyunip netns exec $ns2 ./pm_nl_ctl limits 0 2
440*4882a593Smuzhiyunip netns exec $ns2 ./pm_nl_ctl add 10.0.3.2 flags subflow
441*4882a593Smuzhiyunip netns exec $ns2 ./pm_nl_ctl add 10.0.2.2 flags subflow
442*4882a593Smuzhiyunrun_tests $ns1 $ns2 10.0.1.1
443*4882a593Smuzhiyunchk_join_nr "multiple subflows" 2 2 2
444*4882a593Smuzhiyun
445*4882a593Smuzhiyun# multiple subflows limited by serverf
446*4882a593Smuzhiyunreset
447*4882a593Smuzhiyunip netns exec $ns1 ./pm_nl_ctl limits 0 1
448*4882a593Smuzhiyunip netns exec $ns2 ./pm_nl_ctl limits 0 2
449*4882a593Smuzhiyunip netns exec $ns2 ./pm_nl_ctl add 10.0.3.2 flags subflow
450*4882a593Smuzhiyunip netns exec $ns2 ./pm_nl_ctl add 10.0.2.2 flags subflow
451*4882a593Smuzhiyunrun_tests $ns1 $ns2 10.0.1.1
452*4882a593Smuzhiyunchk_join_nr "multiple subflows, limited by server" 2 2 1
453*4882a593Smuzhiyun
454*4882a593Smuzhiyun# add_address, unused
455*4882a593Smuzhiyunreset
456*4882a593Smuzhiyunip netns exec $ns1 ./pm_nl_ctl add 10.0.2.1 flags signal
457*4882a593Smuzhiyunrun_tests $ns1 $ns2 10.0.1.1
458*4882a593Smuzhiyunchk_join_nr "unused signal address" 0 0 0
459*4882a593Smuzhiyunchk_add_nr 1 1
460*4882a593Smuzhiyun
461*4882a593Smuzhiyun# accept and use add_addr
462*4882a593Smuzhiyunreset
463*4882a593Smuzhiyunip netns exec $ns1 ./pm_nl_ctl limits 0 1
464*4882a593Smuzhiyunip netns exec $ns2 ./pm_nl_ctl limits 1 1
465*4882a593Smuzhiyunip netns exec $ns1 ./pm_nl_ctl add 10.0.2.1 flags signal
466*4882a593Smuzhiyunrun_tests $ns1 $ns2 10.0.1.1
467*4882a593Smuzhiyunchk_join_nr "signal address" 1 1 1
468*4882a593Smuzhiyunchk_add_nr 1 1
469*4882a593Smuzhiyun
470*4882a593Smuzhiyun# accept and use add_addr with an additional subflow
471*4882a593Smuzhiyun# note: signal address in server ns and local addresses in client ns must
472*4882a593Smuzhiyun# belong to different subnets or one of the listed local address could be
473*4882a593Smuzhiyun# used for 'add_addr' subflow
474*4882a593Smuzhiyunreset
475*4882a593Smuzhiyunip netns exec $ns1 ./pm_nl_ctl add 10.0.2.1 flags signal
476*4882a593Smuzhiyunip netns exec $ns1 ./pm_nl_ctl limits 0 2
477*4882a593Smuzhiyunip netns exec $ns2 ./pm_nl_ctl limits 1 2
478*4882a593Smuzhiyunip netns exec $ns2 ./pm_nl_ctl add 10.0.3.2 flags subflow
479*4882a593Smuzhiyunrun_tests $ns1 $ns2 10.0.1.1
480*4882a593Smuzhiyunchk_join_nr "subflow and signal" 2 2 2
481*4882a593Smuzhiyunchk_add_nr 1 1
482*4882a593Smuzhiyun
483*4882a593Smuzhiyun# accept and use add_addr with additional subflows
484*4882a593Smuzhiyunreset
485*4882a593Smuzhiyunip netns exec $ns1 ./pm_nl_ctl limits 0 3
486*4882a593Smuzhiyunip netns exec $ns1 ./pm_nl_ctl add 10.0.2.1 flags signal
487*4882a593Smuzhiyunip netns exec $ns2 ./pm_nl_ctl limits 1 3
488*4882a593Smuzhiyunip netns exec $ns2 ./pm_nl_ctl add 10.0.3.2 flags subflow
489*4882a593Smuzhiyunip netns exec $ns2 ./pm_nl_ctl add 10.0.4.2 flags subflow
490*4882a593Smuzhiyunrun_tests $ns1 $ns2 10.0.1.1
491*4882a593Smuzhiyunchk_join_nr "multiple subflows and signal" 3 3 3
492*4882a593Smuzhiyunchk_add_nr 1 1
493*4882a593Smuzhiyun
494*4882a593Smuzhiyun# single subflow, remove
495*4882a593Smuzhiyunreset
496*4882a593Smuzhiyunip netns exec $ns1 ./pm_nl_ctl limits 0 1
497*4882a593Smuzhiyunip netns exec $ns2 ./pm_nl_ctl limits 0 1
498*4882a593Smuzhiyunip netns exec $ns2 ./pm_nl_ctl add 10.0.3.2 flags subflow
499*4882a593Smuzhiyunrun_remove_tests $ns1 $ns2 10.0.1.1 0 1
500*4882a593Smuzhiyunchk_join_nr "remove single subflow" 1 1 1
501*4882a593Smuzhiyunchk_rm_nr 1 1
502*4882a593Smuzhiyun
503*4882a593Smuzhiyun# multiple subflows, remove
504*4882a593Smuzhiyunreset
505*4882a593Smuzhiyunip netns exec $ns1 ./pm_nl_ctl limits 0 2
506*4882a593Smuzhiyunip netns exec $ns2 ./pm_nl_ctl limits 0 2
507*4882a593Smuzhiyunip netns exec $ns2 ./pm_nl_ctl add 10.0.2.2 flags subflow
508*4882a593Smuzhiyunip netns exec $ns2 ./pm_nl_ctl add 10.0.3.2 flags subflow
509*4882a593Smuzhiyunrun_remove_tests $ns1 $ns2 10.0.1.1 0 2
510*4882a593Smuzhiyunchk_join_nr "remove multiple subflows" 2 2 2
511*4882a593Smuzhiyunchk_rm_nr 2 2
512*4882a593Smuzhiyun
513*4882a593Smuzhiyun# single address, remove
514*4882a593Smuzhiyunreset
515*4882a593Smuzhiyunip netns exec $ns1 ./pm_nl_ctl limits 0 1
516*4882a593Smuzhiyunip netns exec $ns1 ./pm_nl_ctl add 10.0.2.1 flags signal
517*4882a593Smuzhiyunip netns exec $ns2 ./pm_nl_ctl limits 1 1
518*4882a593Smuzhiyunrun_remove_tests $ns1 $ns2 10.0.1.1 1 0
519*4882a593Smuzhiyunchk_join_nr "remove single address" 1 1 1
520*4882a593Smuzhiyunchk_add_nr 1 1
521*4882a593Smuzhiyunchk_rm_nr 0 0
522*4882a593Smuzhiyun
523*4882a593Smuzhiyun# subflow and signal, remove
524*4882a593Smuzhiyunreset
525*4882a593Smuzhiyunip netns exec $ns1 ./pm_nl_ctl limits 0 2
526*4882a593Smuzhiyunip netns exec $ns1 ./pm_nl_ctl add 10.0.2.1 flags signal
527*4882a593Smuzhiyunip netns exec $ns2 ./pm_nl_ctl limits 1 2
528*4882a593Smuzhiyunip netns exec $ns2 ./pm_nl_ctl add 10.0.3.2 flags subflow
529*4882a593Smuzhiyunrun_remove_tests $ns1 $ns2 10.0.1.1 1 1
530*4882a593Smuzhiyunchk_join_nr "remove subflow and signal" 2 2 2
531*4882a593Smuzhiyunchk_add_nr 1 1
532*4882a593Smuzhiyunchk_rm_nr 1 1
533*4882a593Smuzhiyun
534*4882a593Smuzhiyun# subflows and signal, remove
535*4882a593Smuzhiyunreset
536*4882a593Smuzhiyunip netns exec $ns1 ./pm_nl_ctl limits 0 3
537*4882a593Smuzhiyunip netns exec $ns1 ./pm_nl_ctl add 10.0.2.1 flags signal
538*4882a593Smuzhiyunip netns exec $ns2 ./pm_nl_ctl limits 1 3
539*4882a593Smuzhiyunip netns exec $ns2 ./pm_nl_ctl add 10.0.3.2 flags subflow
540*4882a593Smuzhiyunip netns exec $ns2 ./pm_nl_ctl add 10.0.4.2 flags subflow
541*4882a593Smuzhiyunrun_remove_tests $ns1 $ns2 10.0.1.1 1 2
542*4882a593Smuzhiyunchk_join_nr "remove subflows and signal" 3 3 3
543*4882a593Smuzhiyunchk_add_nr 1 1
544*4882a593Smuzhiyunchk_rm_nr 2 2
545*4882a593Smuzhiyun
546*4882a593Smuzhiyun# single subflow, syncookies
547*4882a593Smuzhiyunreset_with_cookies
548*4882a593Smuzhiyunip netns exec $ns1 ./pm_nl_ctl limits 0 1
549*4882a593Smuzhiyunip netns exec $ns2 ./pm_nl_ctl limits 0 1
550*4882a593Smuzhiyunip netns exec $ns2 ./pm_nl_ctl add 10.0.3.2 flags subflow
551*4882a593Smuzhiyunrun_tests $ns1 $ns2 10.0.1.1
552*4882a593Smuzhiyunchk_join_nr "single subflow with syn cookies" 1 1 1
553*4882a593Smuzhiyun
554*4882a593Smuzhiyun# multiple subflows with syn cookies
555*4882a593Smuzhiyunreset_with_cookies
556*4882a593Smuzhiyunip netns exec $ns1 ./pm_nl_ctl limits 0 2
557*4882a593Smuzhiyunip netns exec $ns2 ./pm_nl_ctl limits 0 2
558*4882a593Smuzhiyunip netns exec $ns2 ./pm_nl_ctl add 10.0.3.2 flags subflow
559*4882a593Smuzhiyunip netns exec $ns2 ./pm_nl_ctl add 10.0.2.2 flags subflow
560*4882a593Smuzhiyunrun_tests $ns1 $ns2 10.0.1.1
561*4882a593Smuzhiyunchk_join_nr "multiple subflows with syn cookies" 2 2 2
562*4882a593Smuzhiyun
563*4882a593Smuzhiyun# multiple subflows limited by server
564*4882a593Smuzhiyunreset_with_cookies
565*4882a593Smuzhiyunip netns exec $ns1 ./pm_nl_ctl limits 0 1
566*4882a593Smuzhiyunip netns exec $ns2 ./pm_nl_ctl limits 0 2
567*4882a593Smuzhiyunip netns exec $ns2 ./pm_nl_ctl add 10.0.3.2 flags subflow
568*4882a593Smuzhiyunip netns exec $ns2 ./pm_nl_ctl add 10.0.2.2 flags subflow
569*4882a593Smuzhiyunrun_tests $ns1 $ns2 10.0.1.1
570*4882a593Smuzhiyunchk_join_nr "subflows limited by server w cookies" 2 2 1
571*4882a593Smuzhiyun
572*4882a593Smuzhiyun# test signal address with cookies
573*4882a593Smuzhiyunreset_with_cookies
574*4882a593Smuzhiyunip netns exec $ns1 ./pm_nl_ctl limits 0 1
575*4882a593Smuzhiyunip netns exec $ns2 ./pm_nl_ctl limits 1 1
576*4882a593Smuzhiyunip netns exec $ns1 ./pm_nl_ctl add 10.0.2.1 flags signal
577*4882a593Smuzhiyunrun_tests $ns1 $ns2 10.0.1.1
578*4882a593Smuzhiyunchk_join_nr "signal address with syn cookies" 1 1 1
579*4882a593Smuzhiyunchk_add_nr 1 1
580*4882a593Smuzhiyun
581*4882a593Smuzhiyun# test cookie with subflow and signal
582*4882a593Smuzhiyunreset_with_cookies
583*4882a593Smuzhiyunip netns exec $ns1 ./pm_nl_ctl add 10.0.2.1 flags signal
584*4882a593Smuzhiyunip netns exec $ns1 ./pm_nl_ctl limits 0 2
585*4882a593Smuzhiyunip netns exec $ns2 ./pm_nl_ctl limits 1 2
586*4882a593Smuzhiyunip netns exec $ns2 ./pm_nl_ctl add 10.0.3.2 flags subflow
587*4882a593Smuzhiyunrun_tests $ns1 $ns2 10.0.1.1
588*4882a593Smuzhiyunchk_join_nr "subflow and signal w cookies" 2 2 2
589*4882a593Smuzhiyunchk_add_nr 1 1
590*4882a593Smuzhiyun
591*4882a593Smuzhiyun# accept and use add_addr with additional subflows
592*4882a593Smuzhiyunreset_with_cookies
593*4882a593Smuzhiyunip netns exec $ns1 ./pm_nl_ctl limits 0 3
594*4882a593Smuzhiyunip netns exec $ns1 ./pm_nl_ctl add 10.0.2.1 flags signal
595*4882a593Smuzhiyunip netns exec $ns2 ./pm_nl_ctl limits 1 3
596*4882a593Smuzhiyunip netns exec $ns2 ./pm_nl_ctl add 10.0.3.2 flags subflow
597*4882a593Smuzhiyunip netns exec $ns2 ./pm_nl_ctl add 10.0.4.2 flags subflow
598*4882a593Smuzhiyunrun_tests $ns1 $ns2 10.0.1.1
599*4882a593Smuzhiyunchk_join_nr "subflows and signal w. cookies" 3 3 3
600*4882a593Smuzhiyunchk_add_nr 1 1
601*4882a593Smuzhiyun
602*4882a593Smuzhiyunexit $ret
603