18c2ecf20Sopenharmony_ci#!/bin/bash
28c2ecf20Sopenharmony_ci# SPDX-License-Identifier: GPL-2.0
38c2ecf20Sopenharmony_ci
48c2ecf20Sopenharmony_ci. "$(dirname "${0}")/mptcp_lib.sh"
58c2ecf20Sopenharmony_ci
68c2ecf20Sopenharmony_ciret=0
78c2ecf20Sopenharmony_cisin=""
88c2ecf20Sopenharmony_cisout=""
98c2ecf20Sopenharmony_cicin=""
108c2ecf20Sopenharmony_cicout=""
118c2ecf20Sopenharmony_ciksft_skip=4
128c2ecf20Sopenharmony_citimeout=30
138c2ecf20Sopenharmony_cimptcp_connect=""
148c2ecf20Sopenharmony_cicapture=0
158c2ecf20Sopenharmony_ci
168c2ecf20Sopenharmony_ciTEST_COUNT=0
178c2ecf20Sopenharmony_ci
188c2ecf20Sopenharmony_ciinit()
198c2ecf20Sopenharmony_ci{
208c2ecf20Sopenharmony_ci	capout=$(mktemp)
218c2ecf20Sopenharmony_ci
228c2ecf20Sopenharmony_ci	rndh=$(printf %x $sec)-$(mktemp -u XXXXXX)
238c2ecf20Sopenharmony_ci
248c2ecf20Sopenharmony_ci	ns1="ns1-$rndh"
258c2ecf20Sopenharmony_ci	ns2="ns2-$rndh"
268c2ecf20Sopenharmony_ci
278c2ecf20Sopenharmony_ci	for netns in "$ns1" "$ns2";do
288c2ecf20Sopenharmony_ci		ip netns add $netns || exit $ksft_skip
298c2ecf20Sopenharmony_ci		ip -net $netns link set lo up
308c2ecf20Sopenharmony_ci		ip netns exec $netns sysctl -q net.mptcp.enabled=1
318c2ecf20Sopenharmony_ci		ip netns exec $netns sysctl -q net.ipv4.conf.all.rp_filter=0
328c2ecf20Sopenharmony_ci		ip netns exec $netns sysctl -q net.ipv4.conf.default.rp_filter=0
338c2ecf20Sopenharmony_ci	done
348c2ecf20Sopenharmony_ci
358c2ecf20Sopenharmony_ci	#  ns1              ns2
368c2ecf20Sopenharmony_ci	# ns1eth1    ns2eth1
378c2ecf20Sopenharmony_ci	# ns1eth2    ns2eth2
388c2ecf20Sopenharmony_ci	# ns1eth3    ns2eth3
398c2ecf20Sopenharmony_ci	# ns1eth4    ns2eth4
408c2ecf20Sopenharmony_ci
418c2ecf20Sopenharmony_ci	for i in `seq 1 4`; do
428c2ecf20Sopenharmony_ci		ip link add ns1eth$i netns "$ns1" type veth peer name ns2eth$i netns "$ns2"
438c2ecf20Sopenharmony_ci		ip -net "$ns1" addr add 10.0.$i.1/24 dev ns1eth$i
448c2ecf20Sopenharmony_ci		ip -net "$ns1" addr add dead:beef:$i::1/64 dev ns1eth$i nodad
458c2ecf20Sopenharmony_ci		ip -net "$ns1" link set ns1eth$i up
468c2ecf20Sopenharmony_ci
478c2ecf20Sopenharmony_ci		ip -net "$ns2" addr add 10.0.$i.2/24 dev ns2eth$i
488c2ecf20Sopenharmony_ci		ip -net "$ns2" addr add dead:beef:$i::2/64 dev ns2eth$i nodad
498c2ecf20Sopenharmony_ci		ip -net "$ns2" link set ns2eth$i up
508c2ecf20Sopenharmony_ci
518c2ecf20Sopenharmony_ci		# let $ns2 reach any $ns1 address from any interface
528c2ecf20Sopenharmony_ci		ip -net "$ns2" route add default via 10.0.$i.1 dev ns2eth$i metric 10$i
538c2ecf20Sopenharmony_ci	done
548c2ecf20Sopenharmony_ci}
558c2ecf20Sopenharmony_ci
568c2ecf20Sopenharmony_cicleanup_partial()
578c2ecf20Sopenharmony_ci{
588c2ecf20Sopenharmony_ci	rm -f "$capout"
598c2ecf20Sopenharmony_ci
608c2ecf20Sopenharmony_ci	for netns in "$ns1" "$ns2"; do
618c2ecf20Sopenharmony_ci		ip netns del $netns
628c2ecf20Sopenharmony_ci	done
638c2ecf20Sopenharmony_ci}
648c2ecf20Sopenharmony_ci
658c2ecf20Sopenharmony_cicleanup()
668c2ecf20Sopenharmony_ci{
678c2ecf20Sopenharmony_ci	rm -f "$cin" "$cout"
688c2ecf20Sopenharmony_ci	rm -f "$sin" "$sout"
698c2ecf20Sopenharmony_ci	cleanup_partial
708c2ecf20Sopenharmony_ci}
718c2ecf20Sopenharmony_ci
728c2ecf20Sopenharmony_cireset()
738c2ecf20Sopenharmony_ci{
748c2ecf20Sopenharmony_ci	cleanup_partial
758c2ecf20Sopenharmony_ci	init
768c2ecf20Sopenharmony_ci}
778c2ecf20Sopenharmony_ci
788c2ecf20Sopenharmony_cireset_with_cookies()
798c2ecf20Sopenharmony_ci{
808c2ecf20Sopenharmony_ci	reset
818c2ecf20Sopenharmony_ci
828c2ecf20Sopenharmony_ci	for netns in "$ns1" "$ns2";do
838c2ecf20Sopenharmony_ci		ip netns exec $netns sysctl -q net.ipv4.tcp_syncookies=2
848c2ecf20Sopenharmony_ci	done
858c2ecf20Sopenharmony_ci}
868c2ecf20Sopenharmony_ci
878c2ecf20Sopenharmony_cifor arg in "$@"; do
888c2ecf20Sopenharmony_ci	if [ "$arg" = "-c" ]; then
898c2ecf20Sopenharmony_ci		capture=1
908c2ecf20Sopenharmony_ci	fi
918c2ecf20Sopenharmony_cidone
928c2ecf20Sopenharmony_ci
938c2ecf20Sopenharmony_cimptcp_lib_check_mptcp
948c2ecf20Sopenharmony_ci
958c2ecf20Sopenharmony_ciip -Version > /dev/null 2>&1
968c2ecf20Sopenharmony_ciif [ $? -ne 0 ];then
978c2ecf20Sopenharmony_ci	echo "SKIP: Could not run test without ip tool"
988c2ecf20Sopenharmony_ci	exit $ksft_skip
998c2ecf20Sopenharmony_cifi
1008c2ecf20Sopenharmony_ci
1018c2ecf20Sopenharmony_ci
1028c2ecf20Sopenharmony_cicheck_transfer()
1038c2ecf20Sopenharmony_ci{
1048c2ecf20Sopenharmony_ci	in=$1
1058c2ecf20Sopenharmony_ci	out=$2
1068c2ecf20Sopenharmony_ci	what=$3
1078c2ecf20Sopenharmony_ci
1088c2ecf20Sopenharmony_ci	cmp "$in" "$out" > /dev/null 2>&1
1098c2ecf20Sopenharmony_ci	if [ $? -ne 0 ] ;then
1108c2ecf20Sopenharmony_ci		echo "[ FAIL ] $what does not match (in, out):"
1118c2ecf20Sopenharmony_ci		print_file_err "$in"
1128c2ecf20Sopenharmony_ci		print_file_err "$out"
1138c2ecf20Sopenharmony_ci
1148c2ecf20Sopenharmony_ci		return 1
1158c2ecf20Sopenharmony_ci	fi
1168c2ecf20Sopenharmony_ci
1178c2ecf20Sopenharmony_ci	return 0
1188c2ecf20Sopenharmony_ci}
1198c2ecf20Sopenharmony_ci
1208c2ecf20Sopenharmony_cido_ping()
1218c2ecf20Sopenharmony_ci{
1228c2ecf20Sopenharmony_ci	listener_ns="$1"
1238c2ecf20Sopenharmony_ci	connector_ns="$2"
1248c2ecf20Sopenharmony_ci	connect_addr="$3"
1258c2ecf20Sopenharmony_ci
1268c2ecf20Sopenharmony_ci	ip netns exec ${connector_ns} ping -q -c 1 $connect_addr >/dev/null
1278c2ecf20Sopenharmony_ci	if [ $? -ne 0 ] ; then
1288c2ecf20Sopenharmony_ci		echo "$listener_ns -> $connect_addr connectivity [ FAIL ]" 1>&2
1298c2ecf20Sopenharmony_ci		ret=1
1308c2ecf20Sopenharmony_ci	fi
1318c2ecf20Sopenharmony_ci}
1328c2ecf20Sopenharmony_ci
1338c2ecf20Sopenharmony_ci# $1: ns ; $2: counter
1348c2ecf20Sopenharmony_ciget_counter()
1358c2ecf20Sopenharmony_ci{
1368c2ecf20Sopenharmony_ci	local ns="${1}"
1378c2ecf20Sopenharmony_ci	local counter="${2}"
1388c2ecf20Sopenharmony_ci	local count
1398c2ecf20Sopenharmony_ci
1408c2ecf20Sopenharmony_ci	count=$(ip netns exec ${ns} nstat -asz "${counter}" | awk 'NR==1 {next} {print $2}')
1418c2ecf20Sopenharmony_ci	if [ -z "${count}" ]; then
1428c2ecf20Sopenharmony_ci		mptcp_lib_fail_if_expected_feature "${counter} counter"
1438c2ecf20Sopenharmony_ci		return 1
1448c2ecf20Sopenharmony_ci	fi
1458c2ecf20Sopenharmony_ci
1468c2ecf20Sopenharmony_ci	echo "${count}"
1478c2ecf20Sopenharmony_ci}
1488c2ecf20Sopenharmony_ci
1498c2ecf20Sopenharmony_cido_transfer()
1508c2ecf20Sopenharmony_ci{
1518c2ecf20Sopenharmony_ci	listener_ns="$1"
1528c2ecf20Sopenharmony_ci	connector_ns="$2"
1538c2ecf20Sopenharmony_ci	cl_proto="$3"
1548c2ecf20Sopenharmony_ci	srv_proto="$4"
1558c2ecf20Sopenharmony_ci	connect_addr="$5"
1568c2ecf20Sopenharmony_ci	rm_nr_ns1="$6"
1578c2ecf20Sopenharmony_ci	rm_nr_ns2="$7"
1588c2ecf20Sopenharmony_ci
1598c2ecf20Sopenharmony_ci	port=$((10000+$TEST_COUNT))
1608c2ecf20Sopenharmony_ci	TEST_COUNT=$((TEST_COUNT+1))
1618c2ecf20Sopenharmony_ci
1628c2ecf20Sopenharmony_ci	:> "$cout"
1638c2ecf20Sopenharmony_ci	:> "$sout"
1648c2ecf20Sopenharmony_ci	:> "$capout"
1658c2ecf20Sopenharmony_ci
1668c2ecf20Sopenharmony_ci	if [ $capture -eq 1 ]; then
1678c2ecf20Sopenharmony_ci		if [ -z $SUDO_USER ] ; then
1688c2ecf20Sopenharmony_ci			capuser=""
1698c2ecf20Sopenharmony_ci		else
1708c2ecf20Sopenharmony_ci			capuser="-Z $SUDO_USER"
1718c2ecf20Sopenharmony_ci		fi
1728c2ecf20Sopenharmony_ci
1738c2ecf20Sopenharmony_ci		capfile=$(printf "mp_join-%02u-%s.pcap" "$TEST_COUNT" "${listener_ns}")
1748c2ecf20Sopenharmony_ci
1758c2ecf20Sopenharmony_ci		echo "Capturing traffic for test $TEST_COUNT into $capfile"
1768c2ecf20Sopenharmony_ci		ip netns exec ${listener_ns} tcpdump -i any -s 65535 -B 32768 $capuser -w $capfile > "$capout" 2>&1 &
1778c2ecf20Sopenharmony_ci		cappid=$!
1788c2ecf20Sopenharmony_ci
1798c2ecf20Sopenharmony_ci		sleep 1
1808c2ecf20Sopenharmony_ci	fi
1818c2ecf20Sopenharmony_ci
1828c2ecf20Sopenharmony_ci	if [[ $rm_nr_ns1 -eq 0 && $rm_nr_ns2 -eq 0 ]]; then
1838c2ecf20Sopenharmony_ci		mptcp_connect="./mptcp_connect -j"
1848c2ecf20Sopenharmony_ci	else
1858c2ecf20Sopenharmony_ci		mptcp_connect="./mptcp_connect -r"
1868c2ecf20Sopenharmony_ci	fi
1878c2ecf20Sopenharmony_ci
1888c2ecf20Sopenharmony_ci	ip netns exec ${listener_ns} $mptcp_connect -t $timeout -l -p $port -s ${srv_proto} 0.0.0.0 < "$sin" > "$sout" &
1898c2ecf20Sopenharmony_ci	spid=$!
1908c2ecf20Sopenharmony_ci
1918c2ecf20Sopenharmony_ci	sleep 1
1928c2ecf20Sopenharmony_ci
1938c2ecf20Sopenharmony_ci	ip netns exec ${connector_ns} $mptcp_connect -t $timeout -p $port -s ${cl_proto} $connect_addr < "$cin" > "$cout" &
1948c2ecf20Sopenharmony_ci	cpid=$!
1958c2ecf20Sopenharmony_ci
1968c2ecf20Sopenharmony_ci	if [ $rm_nr_ns1 -gt 0 ]; then
1978c2ecf20Sopenharmony_ci		counter=1
1988c2ecf20Sopenharmony_ci		sleep 1
1998c2ecf20Sopenharmony_ci
2008c2ecf20Sopenharmony_ci		while [ $counter -le $rm_nr_ns1 ]
2018c2ecf20Sopenharmony_ci		do
2028c2ecf20Sopenharmony_ci			ip netns exec ${listener_ns} ./pm_nl_ctl del $counter
2038c2ecf20Sopenharmony_ci			sleep 1
2048c2ecf20Sopenharmony_ci			let counter+=1
2058c2ecf20Sopenharmony_ci		done
2068c2ecf20Sopenharmony_ci	fi
2078c2ecf20Sopenharmony_ci
2088c2ecf20Sopenharmony_ci	if [ $rm_nr_ns2 -gt 0 ]; then
2098c2ecf20Sopenharmony_ci		counter=1
2108c2ecf20Sopenharmony_ci		sleep 1
2118c2ecf20Sopenharmony_ci
2128c2ecf20Sopenharmony_ci		while [ $counter -le $rm_nr_ns2 ]
2138c2ecf20Sopenharmony_ci		do
2148c2ecf20Sopenharmony_ci			ip netns exec ${connector_ns} ./pm_nl_ctl del $counter
2158c2ecf20Sopenharmony_ci			sleep 1
2168c2ecf20Sopenharmony_ci			let counter+=1
2178c2ecf20Sopenharmony_ci		done
2188c2ecf20Sopenharmony_ci	fi
2198c2ecf20Sopenharmony_ci
2208c2ecf20Sopenharmony_ci	wait $cpid
2218c2ecf20Sopenharmony_ci	retc=$?
2228c2ecf20Sopenharmony_ci	wait $spid
2238c2ecf20Sopenharmony_ci	rets=$?
2248c2ecf20Sopenharmony_ci
2258c2ecf20Sopenharmony_ci	if [ $capture -eq 1 ]; then
2268c2ecf20Sopenharmony_ci	    sleep 1
2278c2ecf20Sopenharmony_ci	    kill $cappid
2288c2ecf20Sopenharmony_ci	fi
2298c2ecf20Sopenharmony_ci
2308c2ecf20Sopenharmony_ci	if [ ${rets} -ne 0 ] || [ ${retc} -ne 0 ]; then
2318c2ecf20Sopenharmony_ci		echo " client exit code $retc, server $rets" 1>&2
2328c2ecf20Sopenharmony_ci		echo -e "\nnetns ${listener_ns} socket stat for ${port}:" 1>&2
2338c2ecf20Sopenharmony_ci		ip netns exec ${listener_ns} ss -nita 1>&2 -o "sport = :$port"
2348c2ecf20Sopenharmony_ci		echo -e "\nnetns ${connector_ns} socket stat for ${port}:" 1>&2
2358c2ecf20Sopenharmony_ci		ip netns exec ${connector_ns} ss -nita 1>&2 -o "dport = :$port"
2368c2ecf20Sopenharmony_ci
2378c2ecf20Sopenharmony_ci		cat "$capout"
2388c2ecf20Sopenharmony_ci		return 1
2398c2ecf20Sopenharmony_ci	fi
2408c2ecf20Sopenharmony_ci
2418c2ecf20Sopenharmony_ci	check_transfer $sin $cout "file received by client"
2428c2ecf20Sopenharmony_ci	retc=$?
2438c2ecf20Sopenharmony_ci	check_transfer $cin $sout "file received by server"
2448c2ecf20Sopenharmony_ci	rets=$?
2458c2ecf20Sopenharmony_ci
2468c2ecf20Sopenharmony_ci	if [ $retc -eq 0 ] && [ $rets -eq 0 ];then
2478c2ecf20Sopenharmony_ci		cat "$capout"
2488c2ecf20Sopenharmony_ci		return 0
2498c2ecf20Sopenharmony_ci	fi
2508c2ecf20Sopenharmony_ci
2518c2ecf20Sopenharmony_ci	cat "$capout"
2528c2ecf20Sopenharmony_ci	return 1
2538c2ecf20Sopenharmony_ci}
2548c2ecf20Sopenharmony_ci
2558c2ecf20Sopenharmony_cimake_file()
2568c2ecf20Sopenharmony_ci{
2578c2ecf20Sopenharmony_ci	name=$1
2588c2ecf20Sopenharmony_ci	who=$2
2598c2ecf20Sopenharmony_ci
2608c2ecf20Sopenharmony_ci	SIZE=1
2618c2ecf20Sopenharmony_ci
2628c2ecf20Sopenharmony_ci	dd if=/dev/urandom of="$name" bs=1024 count=$SIZE 2> /dev/null
2638c2ecf20Sopenharmony_ci	echo -e "\nMPTCP_TEST_FILE_END_MARKER" >> "$name"
2648c2ecf20Sopenharmony_ci
2658c2ecf20Sopenharmony_ci	echo "Created $name (size $SIZE KB) containing data sent by $who"
2668c2ecf20Sopenharmony_ci}
2678c2ecf20Sopenharmony_ci
2688c2ecf20Sopenharmony_cirun_tests()
2698c2ecf20Sopenharmony_ci{
2708c2ecf20Sopenharmony_ci	listener_ns="$1"
2718c2ecf20Sopenharmony_ci	connector_ns="$2"
2728c2ecf20Sopenharmony_ci	connect_addr="$3"
2738c2ecf20Sopenharmony_ci	lret=0
2748c2ecf20Sopenharmony_ci
2758c2ecf20Sopenharmony_ci	do_transfer ${listener_ns} ${connector_ns} MPTCP MPTCP ${connect_addr} 0 0
2768c2ecf20Sopenharmony_ci	lret=$?
2778c2ecf20Sopenharmony_ci	if [ $lret -ne 0 ]; then
2788c2ecf20Sopenharmony_ci		ret=$lret
2798c2ecf20Sopenharmony_ci		return
2808c2ecf20Sopenharmony_ci	fi
2818c2ecf20Sopenharmony_ci}
2828c2ecf20Sopenharmony_ci
2838c2ecf20Sopenharmony_cirun_remove_tests()
2848c2ecf20Sopenharmony_ci{
2858c2ecf20Sopenharmony_ci	listener_ns="$1"
2868c2ecf20Sopenharmony_ci	connector_ns="$2"
2878c2ecf20Sopenharmony_ci	connect_addr="$3"
2888c2ecf20Sopenharmony_ci	rm_nr_ns1="$4"
2898c2ecf20Sopenharmony_ci	rm_nr_ns2="$5"
2908c2ecf20Sopenharmony_ci	lret=0
2918c2ecf20Sopenharmony_ci
2928c2ecf20Sopenharmony_ci	do_transfer ${listener_ns} ${connector_ns} MPTCP MPTCP ${connect_addr} ${rm_nr_ns1} ${rm_nr_ns2}
2938c2ecf20Sopenharmony_ci	lret=$?
2948c2ecf20Sopenharmony_ci	if [ $lret -ne 0 ]; then
2958c2ecf20Sopenharmony_ci		ret=$lret
2968c2ecf20Sopenharmony_ci		return
2978c2ecf20Sopenharmony_ci	fi
2988c2ecf20Sopenharmony_ci}
2998c2ecf20Sopenharmony_ci
3008c2ecf20Sopenharmony_cichk_join_nr()
3018c2ecf20Sopenharmony_ci{
3028c2ecf20Sopenharmony_ci	local msg="$1"
3038c2ecf20Sopenharmony_ci	local syn_nr=$2
3048c2ecf20Sopenharmony_ci	local syn_ack_nr=$3
3058c2ecf20Sopenharmony_ci	local ack_nr=$4
3068c2ecf20Sopenharmony_ci	local count
3078c2ecf20Sopenharmony_ci	local dump_stats
3088c2ecf20Sopenharmony_ci
3098c2ecf20Sopenharmony_ci	printf "%02u %-36s %s" "$TEST_COUNT" "$msg" "syn"
3108c2ecf20Sopenharmony_ci	count=$(get_counter ${ns1} "MPTcpExtMPJoinSynRx")
3118c2ecf20Sopenharmony_ci	if [ -z "$count" ]; then
3128c2ecf20Sopenharmony_ci		echo -n "[skip]"
3138c2ecf20Sopenharmony_ci	elif [ "$count" != "$syn_nr" ]; then
3148c2ecf20Sopenharmony_ci		echo "[fail] got $count JOIN[s] syn expected $syn_nr"
3158c2ecf20Sopenharmony_ci		ret=1
3168c2ecf20Sopenharmony_ci		dump_stats=1
3178c2ecf20Sopenharmony_ci	else
3188c2ecf20Sopenharmony_ci		echo -n "[ ok ]"
3198c2ecf20Sopenharmony_ci	fi
3208c2ecf20Sopenharmony_ci
3218c2ecf20Sopenharmony_ci	echo -n " - synack"
3228c2ecf20Sopenharmony_ci	count=$(get_counter ${ns2} "MPTcpExtMPJoinSynAckRx")
3238c2ecf20Sopenharmony_ci	if [ -z "$count" ]; then
3248c2ecf20Sopenharmony_ci		echo -n "[skip]"
3258c2ecf20Sopenharmony_ci	elif [ "$count" != "$syn_ack_nr" ]; then
3268c2ecf20Sopenharmony_ci		echo "[fail] got $count JOIN[s] synack expected $syn_ack_nr"
3278c2ecf20Sopenharmony_ci		ret=1
3288c2ecf20Sopenharmony_ci		dump_stats=1
3298c2ecf20Sopenharmony_ci	else
3308c2ecf20Sopenharmony_ci		echo -n "[ ok ]"
3318c2ecf20Sopenharmony_ci	fi
3328c2ecf20Sopenharmony_ci
3338c2ecf20Sopenharmony_ci	echo -n " - ack"
3348c2ecf20Sopenharmony_ci	count=$(get_counter ${ns1} "MPTcpExtMPJoinAckRx")
3358c2ecf20Sopenharmony_ci	if [ -z "$count" ]; then
3368c2ecf20Sopenharmony_ci		echo "[skip]"
3378c2ecf20Sopenharmony_ci	elif [ "$count" != "$ack_nr" ]; then
3388c2ecf20Sopenharmony_ci		echo "[fail] got $count JOIN[s] ack expected $ack_nr"
3398c2ecf20Sopenharmony_ci		ret=1
3408c2ecf20Sopenharmony_ci		dump_stats=1
3418c2ecf20Sopenharmony_ci	else
3428c2ecf20Sopenharmony_ci		echo "[ ok ]"
3438c2ecf20Sopenharmony_ci	fi
3448c2ecf20Sopenharmony_ci	if [ "${dump_stats}" = 1 ]; then
3458c2ecf20Sopenharmony_ci		echo Server ns stats
3468c2ecf20Sopenharmony_ci		ip netns exec $ns1 nstat -as | grep MPTcp
3478c2ecf20Sopenharmony_ci		echo Client ns stats
3488c2ecf20Sopenharmony_ci		ip netns exec $ns2 nstat -as | grep MPTcp
3498c2ecf20Sopenharmony_ci	fi
3508c2ecf20Sopenharmony_ci}
3518c2ecf20Sopenharmony_ci
3528c2ecf20Sopenharmony_cichk_add_nr()
3538c2ecf20Sopenharmony_ci{
3548c2ecf20Sopenharmony_ci	local add_nr=$1
3558c2ecf20Sopenharmony_ci	local echo_nr=$2
3568c2ecf20Sopenharmony_ci	local count
3578c2ecf20Sopenharmony_ci	local dump_stats
3588c2ecf20Sopenharmony_ci
3598c2ecf20Sopenharmony_ci	printf "%-39s %s" " " "add"
3608c2ecf20Sopenharmony_ci	count=$(get_counter ${ns2} "MPTcpExtAddAddr")
3618c2ecf20Sopenharmony_ci	if [ -z "$count" ]; then
3628c2ecf20Sopenharmony_ci		echo -n "[skip]"
3638c2ecf20Sopenharmony_ci	elif [ "$count" != "$add_nr" ]; then
3648c2ecf20Sopenharmony_ci		echo "[fail] got $count ADD_ADDR[s] expected $add_nr"
3658c2ecf20Sopenharmony_ci		ret=1
3668c2ecf20Sopenharmony_ci		dump_stats=1
3678c2ecf20Sopenharmony_ci	else
3688c2ecf20Sopenharmony_ci		echo -n "[ ok ]"
3698c2ecf20Sopenharmony_ci	fi
3708c2ecf20Sopenharmony_ci
3718c2ecf20Sopenharmony_ci	echo -n " - echo  "
3728c2ecf20Sopenharmony_ci	count=$(get_counter ${ns1} "MPTcpExtEchoAdd")
3738c2ecf20Sopenharmony_ci	if [ -z "$count" ]; then
3748c2ecf20Sopenharmony_ci		echo "[skip]"
3758c2ecf20Sopenharmony_ci	elif [ "$count" != "$echo_nr" ]; then
3768c2ecf20Sopenharmony_ci		echo "[fail] got $count ADD_ADDR echo[s] expected $echo_nr"
3778c2ecf20Sopenharmony_ci		ret=1
3788c2ecf20Sopenharmony_ci		dump_stats=1
3798c2ecf20Sopenharmony_ci	else
3808c2ecf20Sopenharmony_ci		echo "[ ok ]"
3818c2ecf20Sopenharmony_ci	fi
3828c2ecf20Sopenharmony_ci
3838c2ecf20Sopenharmony_ci	if [ "${dump_stats}" = 1 ]; then
3848c2ecf20Sopenharmony_ci		echo Server ns stats
3858c2ecf20Sopenharmony_ci		ip netns exec $ns1 nstat -as | grep MPTcp
3868c2ecf20Sopenharmony_ci		echo Client ns stats
3878c2ecf20Sopenharmony_ci		ip netns exec $ns2 nstat -as | grep MPTcp
3888c2ecf20Sopenharmony_ci	fi
3898c2ecf20Sopenharmony_ci}
3908c2ecf20Sopenharmony_ci
3918c2ecf20Sopenharmony_cichk_rm_nr()
3928c2ecf20Sopenharmony_ci{
3938c2ecf20Sopenharmony_ci	local rm_addr_nr=$1
3948c2ecf20Sopenharmony_ci	local rm_subflow_nr=$2
3958c2ecf20Sopenharmony_ci	local count
3968c2ecf20Sopenharmony_ci	local dump_stats
3978c2ecf20Sopenharmony_ci
3988c2ecf20Sopenharmony_ci	printf "%-39s %s" " " "rm "
3998c2ecf20Sopenharmony_ci	count=$(get_counter ${ns1} "MPTcpExtRmAddr")
4008c2ecf20Sopenharmony_ci	if [ -z "$count" ]; then
4018c2ecf20Sopenharmony_ci		echo -n "[skip]"
4028c2ecf20Sopenharmony_ci	elif [ "$count" != "$rm_addr_nr" ]; then
4038c2ecf20Sopenharmony_ci		echo "[fail] got $count RM_ADDR[s] expected $rm_addr_nr"
4048c2ecf20Sopenharmony_ci		ret=1
4058c2ecf20Sopenharmony_ci		dump_stats=1
4068c2ecf20Sopenharmony_ci	else
4078c2ecf20Sopenharmony_ci		echo -n "[ ok ]"
4088c2ecf20Sopenharmony_ci	fi
4098c2ecf20Sopenharmony_ci
4108c2ecf20Sopenharmony_ci	echo -n " - sf    "
4118c2ecf20Sopenharmony_ci	count=$(get_counter ${ns2} "MPTcpExtRmSubflow")
4128c2ecf20Sopenharmony_ci	if [ -z "$count" ]; then
4138c2ecf20Sopenharmony_ci		echo "[skip]"
4148c2ecf20Sopenharmony_ci	elif [ "$count" != "$rm_subflow_nr" ]; then
4158c2ecf20Sopenharmony_ci		echo "[fail] got $count RM_SUBFLOW[s] expected $rm_subflow_nr"
4168c2ecf20Sopenharmony_ci		ret=1
4178c2ecf20Sopenharmony_ci		dump_stats=1
4188c2ecf20Sopenharmony_ci	else
4198c2ecf20Sopenharmony_ci		echo "[ ok ]"
4208c2ecf20Sopenharmony_ci	fi
4218c2ecf20Sopenharmony_ci
4228c2ecf20Sopenharmony_ci	if [ "${dump_stats}" = 1 ]; then
4238c2ecf20Sopenharmony_ci		echo Server ns stats
4248c2ecf20Sopenharmony_ci		ip netns exec $ns1 nstat -as | grep MPTcp
4258c2ecf20Sopenharmony_ci		echo Client ns stats
4268c2ecf20Sopenharmony_ci		ip netns exec $ns2 nstat -as | grep MPTcp
4278c2ecf20Sopenharmony_ci	fi
4288c2ecf20Sopenharmony_ci}
4298c2ecf20Sopenharmony_ci
4308c2ecf20Sopenharmony_cisin=$(mktemp)
4318c2ecf20Sopenharmony_cisout=$(mktemp)
4328c2ecf20Sopenharmony_cicin=$(mktemp)
4338c2ecf20Sopenharmony_cicout=$(mktemp)
4348c2ecf20Sopenharmony_ciinit
4358c2ecf20Sopenharmony_cimake_file "$cin" "client"
4368c2ecf20Sopenharmony_cimake_file "$sin" "server"
4378c2ecf20Sopenharmony_citrap cleanup EXIT
4388c2ecf20Sopenharmony_ci
4398c2ecf20Sopenharmony_cirun_tests $ns1 $ns2 10.0.1.1
4408c2ecf20Sopenharmony_cichk_join_nr "no JOIN" "0" "0" "0"
4418c2ecf20Sopenharmony_ci
4428c2ecf20Sopenharmony_ci# subflow limted by client
4438c2ecf20Sopenharmony_cireset
4448c2ecf20Sopenharmony_ciip netns exec $ns2 ./pm_nl_ctl add 10.0.3.2 flags subflow
4458c2ecf20Sopenharmony_cirun_tests $ns1 $ns2 10.0.1.1
4468c2ecf20Sopenharmony_cichk_join_nr "single subflow, limited by client" 0 0 0
4478c2ecf20Sopenharmony_ci
4488c2ecf20Sopenharmony_ci# subflow limted by server
4498c2ecf20Sopenharmony_cireset
4508c2ecf20Sopenharmony_ciip netns exec $ns2 ./pm_nl_ctl limits 0 1
4518c2ecf20Sopenharmony_ciip netns exec $ns2 ./pm_nl_ctl add 10.0.3.2 flags subflow
4528c2ecf20Sopenharmony_cirun_tests $ns1 $ns2 10.0.1.1
4538c2ecf20Sopenharmony_cichk_join_nr "single subflow, limited by server" 1 1 0
4548c2ecf20Sopenharmony_ci
4558c2ecf20Sopenharmony_ci# subflow
4568c2ecf20Sopenharmony_cireset
4578c2ecf20Sopenharmony_ciip netns exec $ns1 ./pm_nl_ctl limits 0 1
4588c2ecf20Sopenharmony_ciip netns exec $ns2 ./pm_nl_ctl limits 0 1
4598c2ecf20Sopenharmony_ciip netns exec $ns2 ./pm_nl_ctl add 10.0.3.2 flags subflow
4608c2ecf20Sopenharmony_cirun_tests $ns1 $ns2 10.0.1.1
4618c2ecf20Sopenharmony_cichk_join_nr "single subflow" 1 1 1
4628c2ecf20Sopenharmony_ci
4638c2ecf20Sopenharmony_ci# multiple subflows
4648c2ecf20Sopenharmony_cireset
4658c2ecf20Sopenharmony_ciip netns exec $ns1 ./pm_nl_ctl limits 0 2
4668c2ecf20Sopenharmony_ciip netns exec $ns2 ./pm_nl_ctl limits 0 2
4678c2ecf20Sopenharmony_ciip netns exec $ns2 ./pm_nl_ctl add 10.0.3.2 flags subflow
4688c2ecf20Sopenharmony_ciip netns exec $ns2 ./pm_nl_ctl add 10.0.2.2 flags subflow
4698c2ecf20Sopenharmony_cirun_tests $ns1 $ns2 10.0.1.1
4708c2ecf20Sopenharmony_cichk_join_nr "multiple subflows" 2 2 2
4718c2ecf20Sopenharmony_ci
4728c2ecf20Sopenharmony_ci# multiple subflows limited by serverf
4738c2ecf20Sopenharmony_cireset
4748c2ecf20Sopenharmony_ciip netns exec $ns1 ./pm_nl_ctl limits 0 1
4758c2ecf20Sopenharmony_ciip netns exec $ns2 ./pm_nl_ctl limits 0 2
4768c2ecf20Sopenharmony_ciip netns exec $ns2 ./pm_nl_ctl add 10.0.3.2 flags subflow
4778c2ecf20Sopenharmony_ciip netns exec $ns2 ./pm_nl_ctl add 10.0.2.2 flags subflow
4788c2ecf20Sopenharmony_cirun_tests $ns1 $ns2 10.0.1.1
4798c2ecf20Sopenharmony_cichk_join_nr "multiple subflows, limited by server" 2 2 1
4808c2ecf20Sopenharmony_ci
4818c2ecf20Sopenharmony_ci# add_address, unused
4828c2ecf20Sopenharmony_cireset
4838c2ecf20Sopenharmony_ciip netns exec $ns1 ./pm_nl_ctl add 10.0.2.1 flags signal
4848c2ecf20Sopenharmony_cirun_tests $ns1 $ns2 10.0.1.1
4858c2ecf20Sopenharmony_cichk_join_nr "unused signal address" 0 0 0
4868c2ecf20Sopenharmony_cichk_add_nr 1 1
4878c2ecf20Sopenharmony_ci
4888c2ecf20Sopenharmony_ci# accept and use add_addr
4898c2ecf20Sopenharmony_cireset
4908c2ecf20Sopenharmony_ciip netns exec $ns1 ./pm_nl_ctl limits 0 1
4918c2ecf20Sopenharmony_ciip netns exec $ns2 ./pm_nl_ctl limits 1 1
4928c2ecf20Sopenharmony_ciip netns exec $ns1 ./pm_nl_ctl add 10.0.2.1 flags signal
4938c2ecf20Sopenharmony_cirun_tests $ns1 $ns2 10.0.1.1
4948c2ecf20Sopenharmony_cichk_join_nr "signal address" 1 1 1
4958c2ecf20Sopenharmony_cichk_add_nr 1 1
4968c2ecf20Sopenharmony_ci
4978c2ecf20Sopenharmony_ci# accept and use add_addr with an additional subflow
4988c2ecf20Sopenharmony_ci# note: signal address in server ns and local addresses in client ns must
4998c2ecf20Sopenharmony_ci# belong to different subnets or one of the listed local address could be
5008c2ecf20Sopenharmony_ci# used for 'add_addr' subflow
5018c2ecf20Sopenharmony_cireset
5028c2ecf20Sopenharmony_ciip netns exec $ns1 ./pm_nl_ctl add 10.0.2.1 flags signal
5038c2ecf20Sopenharmony_ciip netns exec $ns1 ./pm_nl_ctl limits 0 2
5048c2ecf20Sopenharmony_ciip netns exec $ns2 ./pm_nl_ctl limits 1 2
5058c2ecf20Sopenharmony_ciip netns exec $ns2 ./pm_nl_ctl add 10.0.3.2 flags subflow
5068c2ecf20Sopenharmony_cirun_tests $ns1 $ns2 10.0.1.1
5078c2ecf20Sopenharmony_cichk_join_nr "subflow and signal" 2 2 2
5088c2ecf20Sopenharmony_cichk_add_nr 1 1
5098c2ecf20Sopenharmony_ci
5108c2ecf20Sopenharmony_ci# accept and use add_addr with additional subflows
5118c2ecf20Sopenharmony_cireset
5128c2ecf20Sopenharmony_ciip netns exec $ns1 ./pm_nl_ctl limits 0 3
5138c2ecf20Sopenharmony_ciip netns exec $ns1 ./pm_nl_ctl add 10.0.2.1 flags signal
5148c2ecf20Sopenharmony_ciip netns exec $ns2 ./pm_nl_ctl limits 1 3
5158c2ecf20Sopenharmony_ciip netns exec $ns2 ./pm_nl_ctl add 10.0.3.2 flags subflow
5168c2ecf20Sopenharmony_ciip netns exec $ns2 ./pm_nl_ctl add 10.0.4.2 flags subflow
5178c2ecf20Sopenharmony_cirun_tests $ns1 $ns2 10.0.1.1
5188c2ecf20Sopenharmony_cichk_join_nr "multiple subflows and signal" 3 3 3
5198c2ecf20Sopenharmony_cichk_add_nr 1 1
5208c2ecf20Sopenharmony_ci
5218c2ecf20Sopenharmony_ci# single subflow, remove
5228c2ecf20Sopenharmony_cireset
5238c2ecf20Sopenharmony_ciip netns exec $ns1 ./pm_nl_ctl limits 0 1
5248c2ecf20Sopenharmony_ciip netns exec $ns2 ./pm_nl_ctl limits 0 1
5258c2ecf20Sopenharmony_ciip netns exec $ns2 ./pm_nl_ctl add 10.0.3.2 flags subflow
5268c2ecf20Sopenharmony_cirun_remove_tests $ns1 $ns2 10.0.1.1 0 1
5278c2ecf20Sopenharmony_cichk_join_nr "remove single subflow" 1 1 1
5288c2ecf20Sopenharmony_cichk_rm_nr 1 1
5298c2ecf20Sopenharmony_ci
5308c2ecf20Sopenharmony_ci# multiple subflows, remove
5318c2ecf20Sopenharmony_cireset
5328c2ecf20Sopenharmony_ciip netns exec $ns1 ./pm_nl_ctl limits 0 2
5338c2ecf20Sopenharmony_ciip netns exec $ns2 ./pm_nl_ctl limits 0 2
5348c2ecf20Sopenharmony_ciip netns exec $ns2 ./pm_nl_ctl add 10.0.2.2 flags subflow
5358c2ecf20Sopenharmony_ciip netns exec $ns2 ./pm_nl_ctl add 10.0.3.2 flags subflow
5368c2ecf20Sopenharmony_cirun_remove_tests $ns1 $ns2 10.0.1.1 0 2
5378c2ecf20Sopenharmony_cichk_join_nr "remove multiple subflows" 2 2 2
5388c2ecf20Sopenharmony_cichk_rm_nr 2 2
5398c2ecf20Sopenharmony_ci
5408c2ecf20Sopenharmony_ci# single address, remove
5418c2ecf20Sopenharmony_cireset
5428c2ecf20Sopenharmony_ciip netns exec $ns1 ./pm_nl_ctl limits 0 1
5438c2ecf20Sopenharmony_ciip netns exec $ns1 ./pm_nl_ctl add 10.0.2.1 flags signal
5448c2ecf20Sopenharmony_ciip netns exec $ns2 ./pm_nl_ctl limits 1 1
5458c2ecf20Sopenharmony_cirun_remove_tests $ns1 $ns2 10.0.1.1 1 0
5468c2ecf20Sopenharmony_cichk_join_nr "remove single address" 1 1 1
5478c2ecf20Sopenharmony_cichk_add_nr 1 1
5488c2ecf20Sopenharmony_cichk_rm_nr 0 0
5498c2ecf20Sopenharmony_ci
5508c2ecf20Sopenharmony_ci# subflow and signal, remove
5518c2ecf20Sopenharmony_cireset
5528c2ecf20Sopenharmony_ciip netns exec $ns1 ./pm_nl_ctl limits 0 2
5538c2ecf20Sopenharmony_ciip netns exec $ns1 ./pm_nl_ctl add 10.0.2.1 flags signal
5548c2ecf20Sopenharmony_ciip netns exec $ns2 ./pm_nl_ctl limits 1 2
5558c2ecf20Sopenharmony_ciip netns exec $ns2 ./pm_nl_ctl add 10.0.3.2 flags subflow
5568c2ecf20Sopenharmony_cirun_remove_tests $ns1 $ns2 10.0.1.1 1 1
5578c2ecf20Sopenharmony_cichk_join_nr "remove subflow and signal" 2 2 2
5588c2ecf20Sopenharmony_cichk_add_nr 1 1
5598c2ecf20Sopenharmony_cichk_rm_nr 1 1
5608c2ecf20Sopenharmony_ci
5618c2ecf20Sopenharmony_ci# subflows and signal, remove
5628c2ecf20Sopenharmony_cireset
5638c2ecf20Sopenharmony_ciip netns exec $ns1 ./pm_nl_ctl limits 0 3
5648c2ecf20Sopenharmony_ciip netns exec $ns1 ./pm_nl_ctl add 10.0.2.1 flags signal
5658c2ecf20Sopenharmony_ciip netns exec $ns2 ./pm_nl_ctl limits 1 3
5668c2ecf20Sopenharmony_ciip netns exec $ns2 ./pm_nl_ctl add 10.0.3.2 flags subflow
5678c2ecf20Sopenharmony_ciip netns exec $ns2 ./pm_nl_ctl add 10.0.4.2 flags subflow
5688c2ecf20Sopenharmony_cirun_remove_tests $ns1 $ns2 10.0.1.1 1 2
5698c2ecf20Sopenharmony_cichk_join_nr "remove subflows and signal" 3 3 3
5708c2ecf20Sopenharmony_cichk_add_nr 1 1
5718c2ecf20Sopenharmony_cichk_rm_nr 2 2
5728c2ecf20Sopenharmony_ci
5738c2ecf20Sopenharmony_ci# single subflow, syncookies
5748c2ecf20Sopenharmony_cireset_with_cookies
5758c2ecf20Sopenharmony_ciip netns exec $ns1 ./pm_nl_ctl limits 0 1
5768c2ecf20Sopenharmony_ciip netns exec $ns2 ./pm_nl_ctl limits 0 1
5778c2ecf20Sopenharmony_ciip netns exec $ns2 ./pm_nl_ctl add 10.0.3.2 flags subflow
5788c2ecf20Sopenharmony_cirun_tests $ns1 $ns2 10.0.1.1
5798c2ecf20Sopenharmony_cichk_join_nr "single subflow with syn cookies" 1 1 1
5808c2ecf20Sopenharmony_ci
5818c2ecf20Sopenharmony_ci# multiple subflows with syn cookies
5828c2ecf20Sopenharmony_cireset_with_cookies
5838c2ecf20Sopenharmony_ciip netns exec $ns1 ./pm_nl_ctl limits 0 2
5848c2ecf20Sopenharmony_ciip netns exec $ns2 ./pm_nl_ctl limits 0 2
5858c2ecf20Sopenharmony_ciip netns exec $ns2 ./pm_nl_ctl add 10.0.3.2 flags subflow
5868c2ecf20Sopenharmony_ciip netns exec $ns2 ./pm_nl_ctl add 10.0.2.2 flags subflow
5878c2ecf20Sopenharmony_cirun_tests $ns1 $ns2 10.0.1.1
5888c2ecf20Sopenharmony_cichk_join_nr "multiple subflows with syn cookies" 2 2 2
5898c2ecf20Sopenharmony_ci
5908c2ecf20Sopenharmony_ci# multiple subflows limited by server
5918c2ecf20Sopenharmony_cireset_with_cookies
5928c2ecf20Sopenharmony_ciip netns exec $ns1 ./pm_nl_ctl limits 0 1
5938c2ecf20Sopenharmony_ciip netns exec $ns2 ./pm_nl_ctl limits 0 2
5948c2ecf20Sopenharmony_ciip netns exec $ns2 ./pm_nl_ctl add 10.0.3.2 flags subflow
5958c2ecf20Sopenharmony_ciip netns exec $ns2 ./pm_nl_ctl add 10.0.2.2 flags subflow
5968c2ecf20Sopenharmony_cirun_tests $ns1 $ns2 10.0.1.1
5978c2ecf20Sopenharmony_cichk_join_nr "subflows limited by server w cookies" 2 2 1
5988c2ecf20Sopenharmony_ci
5998c2ecf20Sopenharmony_ci# test signal address with cookies
6008c2ecf20Sopenharmony_cireset_with_cookies
6018c2ecf20Sopenharmony_ciip netns exec $ns1 ./pm_nl_ctl limits 0 1
6028c2ecf20Sopenharmony_ciip netns exec $ns2 ./pm_nl_ctl limits 1 1
6038c2ecf20Sopenharmony_ciip netns exec $ns1 ./pm_nl_ctl add 10.0.2.1 flags signal
6048c2ecf20Sopenharmony_cirun_tests $ns1 $ns2 10.0.1.1
6058c2ecf20Sopenharmony_cichk_join_nr "signal address with syn cookies" 1 1 1
6068c2ecf20Sopenharmony_cichk_add_nr 1 1
6078c2ecf20Sopenharmony_ci
6088c2ecf20Sopenharmony_ci# test cookie with subflow and signal
6098c2ecf20Sopenharmony_cireset_with_cookies
6108c2ecf20Sopenharmony_ciip netns exec $ns1 ./pm_nl_ctl add 10.0.2.1 flags signal
6118c2ecf20Sopenharmony_ciip netns exec $ns1 ./pm_nl_ctl limits 0 2
6128c2ecf20Sopenharmony_ciip netns exec $ns2 ./pm_nl_ctl limits 1 2
6138c2ecf20Sopenharmony_ciip netns exec $ns2 ./pm_nl_ctl add 10.0.3.2 flags subflow
6148c2ecf20Sopenharmony_cirun_tests $ns1 $ns2 10.0.1.1
6158c2ecf20Sopenharmony_cichk_join_nr "subflow and signal w cookies" 2 2 2
6168c2ecf20Sopenharmony_cichk_add_nr 1 1
6178c2ecf20Sopenharmony_ci
6188c2ecf20Sopenharmony_ci# accept and use add_addr with additional subflows
6198c2ecf20Sopenharmony_cireset_with_cookies
6208c2ecf20Sopenharmony_ciip netns exec $ns1 ./pm_nl_ctl limits 0 3
6218c2ecf20Sopenharmony_ciip netns exec $ns1 ./pm_nl_ctl add 10.0.2.1 flags signal
6228c2ecf20Sopenharmony_ciip netns exec $ns2 ./pm_nl_ctl limits 1 3
6238c2ecf20Sopenharmony_ciip netns exec $ns2 ./pm_nl_ctl add 10.0.3.2 flags subflow
6248c2ecf20Sopenharmony_ciip netns exec $ns2 ./pm_nl_ctl add 10.0.4.2 flags subflow
6258c2ecf20Sopenharmony_cirun_tests $ns1 $ns2 10.0.1.1
6268c2ecf20Sopenharmony_cichk_join_nr "subflows and signal w. cookies" 3 3 3
6278c2ecf20Sopenharmony_cichk_add_nr 1 1
6288c2ecf20Sopenharmony_ci
6298c2ecf20Sopenharmony_ciexit $ret
630