18c2ecf20Sopenharmony_ci#!/bin/bash
28c2ecf20Sopenharmony_ci# SPDX-License-Identifier: GPL-2.0
38c2ecf20Sopenharmony_ci
48c2ecf20Sopenharmony_ci. "$(dirname "${0}")/mptcp_lib.sh"
58c2ecf20Sopenharmony_ci
68c2ecf20Sopenharmony_citime_start=$(date +%s)
78c2ecf20Sopenharmony_ci
88c2ecf20Sopenharmony_cioptstring="S:R:d:e:l:r:h4cm:f:t"
98c2ecf20Sopenharmony_ciret=0
108c2ecf20Sopenharmony_cisin=""
118c2ecf20Sopenharmony_cisout=""
128c2ecf20Sopenharmony_cicin=""
138c2ecf20Sopenharmony_cicout=""
148c2ecf20Sopenharmony_ciksft_skip=4
158c2ecf20Sopenharmony_cicapture=false
168c2ecf20Sopenharmony_citimeout=30
178c2ecf20Sopenharmony_ciipv6=true
188c2ecf20Sopenharmony_ciethtool_random_on=true
198c2ecf20Sopenharmony_citc_delay="$((RANDOM%50))"
208c2ecf20Sopenharmony_citc_loss=$((RANDOM%101))
218c2ecf20Sopenharmony_citestmode=""
228c2ecf20Sopenharmony_cisndbuf=0
238c2ecf20Sopenharmony_circvbuf=0
248c2ecf20Sopenharmony_cioptions_log=true
258c2ecf20Sopenharmony_cido_tcp=0
268c2ecf20Sopenharmony_cifilesize=0
278c2ecf20Sopenharmony_ci
288c2ecf20Sopenharmony_ciif [ $tc_loss -eq 100 ];then
298c2ecf20Sopenharmony_ci	tc_loss=1%
308c2ecf20Sopenharmony_cielif [ $tc_loss -ge 10 ]; then
318c2ecf20Sopenharmony_ci	tc_loss=0.$tc_loss%
328c2ecf20Sopenharmony_cielif [ $tc_loss -ge 1 ]; then
338c2ecf20Sopenharmony_ci	tc_loss=0.0$tc_loss%
348c2ecf20Sopenharmony_cielse
358c2ecf20Sopenharmony_ci	tc_loss=""
368c2ecf20Sopenharmony_cifi
378c2ecf20Sopenharmony_ci
388c2ecf20Sopenharmony_ciusage() {
398c2ecf20Sopenharmony_ci	echo "Usage: $0 [ -a ]"
408c2ecf20Sopenharmony_ci	echo -e "\t-d: tc/netem delay in milliseconds, e.g. \"-d 10\" (default random)"
418c2ecf20Sopenharmony_ci	echo -e "\t-l: tc/netem loss percentage, e.g. \"-l 0.02\" (default random)"
428c2ecf20Sopenharmony_ci	echo -e "\t-r: tc/netem reorder mode, e.g. \"-r 25% 50% gap 5\", use "-r 0" to disable reordering (default random)"
438c2ecf20Sopenharmony_ci	echo -e "\t-e: ethtool features to disable, e.g.: \"-e tso -e gso\" (default: randomly disable any of tso/gso/gro)"
448c2ecf20Sopenharmony_ci	echo -e "\t-4: IPv4 only: disable IPv6 tests (default: test both IPv4 and IPv6)"
458c2ecf20Sopenharmony_ci	echo -e "\t-c: capture packets for each test using tcpdump (default: no capture)"
468c2ecf20Sopenharmony_ci	echo -e "\t-f: size of file to transfer in bytes (default random)"
478c2ecf20Sopenharmony_ci	echo -e "\t-S: set sndbuf value (default: use kernel default)"
488c2ecf20Sopenharmony_ci	echo -e "\t-R: set rcvbuf value (default: use kernel default)"
498c2ecf20Sopenharmony_ci	echo -e "\t-m: test mode (poll, sendfile; default: poll)"
508c2ecf20Sopenharmony_ci	echo -e "\t-t: also run tests with TCP (use twice to non-fallback tcp)"
518c2ecf20Sopenharmony_ci}
528c2ecf20Sopenharmony_ci
538c2ecf20Sopenharmony_ciwhile getopts "$optstring" option;do
548c2ecf20Sopenharmony_ci	case "$option" in
558c2ecf20Sopenharmony_ci	"h")
568c2ecf20Sopenharmony_ci		usage $0
578c2ecf20Sopenharmony_ci		exit 0
588c2ecf20Sopenharmony_ci		;;
598c2ecf20Sopenharmony_ci	"d")
608c2ecf20Sopenharmony_ci		if [ $OPTARG -ge 0 ];then
618c2ecf20Sopenharmony_ci			tc_delay="$OPTARG"
628c2ecf20Sopenharmony_ci		else
638c2ecf20Sopenharmony_ci			echo "-d requires numeric argument, got \"$OPTARG\"" 1>&2
648c2ecf20Sopenharmony_ci			exit 1
658c2ecf20Sopenharmony_ci		fi
668c2ecf20Sopenharmony_ci		;;
678c2ecf20Sopenharmony_ci	"e")
688c2ecf20Sopenharmony_ci		ethtool_args="$ethtool_args $OPTARG off"
698c2ecf20Sopenharmony_ci		ethtool_random_on=false
708c2ecf20Sopenharmony_ci		;;
718c2ecf20Sopenharmony_ci	"l")
728c2ecf20Sopenharmony_ci		tc_loss="$OPTARG"
738c2ecf20Sopenharmony_ci		;;
748c2ecf20Sopenharmony_ci	"r")
758c2ecf20Sopenharmony_ci		tc_reorder="$OPTARG"
768c2ecf20Sopenharmony_ci		;;
778c2ecf20Sopenharmony_ci	"4")
788c2ecf20Sopenharmony_ci		ipv6=false
798c2ecf20Sopenharmony_ci		;;
808c2ecf20Sopenharmony_ci	"c")
818c2ecf20Sopenharmony_ci		capture=true
828c2ecf20Sopenharmony_ci		;;
838c2ecf20Sopenharmony_ci	"S")
848c2ecf20Sopenharmony_ci		if [ $OPTARG -ge 0 ];then
858c2ecf20Sopenharmony_ci			sndbuf="$OPTARG"
868c2ecf20Sopenharmony_ci		else
878c2ecf20Sopenharmony_ci			echo "-S requires numeric argument, got \"$OPTARG\"" 1>&2
888c2ecf20Sopenharmony_ci			exit 1
898c2ecf20Sopenharmony_ci		fi
908c2ecf20Sopenharmony_ci		;;
918c2ecf20Sopenharmony_ci	"R")
928c2ecf20Sopenharmony_ci		if [ $OPTARG -ge 0 ];then
938c2ecf20Sopenharmony_ci			rcvbuf="$OPTARG"
948c2ecf20Sopenharmony_ci		else
958c2ecf20Sopenharmony_ci			echo "-R requires numeric argument, got \"$OPTARG\"" 1>&2
968c2ecf20Sopenharmony_ci			exit 1
978c2ecf20Sopenharmony_ci		fi
988c2ecf20Sopenharmony_ci		;;
998c2ecf20Sopenharmony_ci	"m")
1008c2ecf20Sopenharmony_ci		testmode="$OPTARG"
1018c2ecf20Sopenharmony_ci		;;
1028c2ecf20Sopenharmony_ci	"f")
1038c2ecf20Sopenharmony_ci		filesize="$OPTARG"
1048c2ecf20Sopenharmony_ci		;;
1058c2ecf20Sopenharmony_ci	"t")
1068c2ecf20Sopenharmony_ci		do_tcp=$((do_tcp+1))
1078c2ecf20Sopenharmony_ci		;;
1088c2ecf20Sopenharmony_ci	"?")
1098c2ecf20Sopenharmony_ci		usage $0
1108c2ecf20Sopenharmony_ci		exit 1
1118c2ecf20Sopenharmony_ci		;;
1128c2ecf20Sopenharmony_ci	esac
1138c2ecf20Sopenharmony_cidone
1148c2ecf20Sopenharmony_ci
1158c2ecf20Sopenharmony_cisec=$(date +%s)
1168c2ecf20Sopenharmony_cirndh=$(printf %x $sec)-$(mktemp -u XXXXXX)
1178c2ecf20Sopenharmony_cins1="ns1-$rndh"
1188c2ecf20Sopenharmony_cins2="ns2-$rndh"
1198c2ecf20Sopenharmony_cins3="ns3-$rndh"
1208c2ecf20Sopenharmony_cins4="ns4-$rndh"
1218c2ecf20Sopenharmony_ci
1228c2ecf20Sopenharmony_ciTEST_COUNT=0
1238c2ecf20Sopenharmony_ci
1248c2ecf20Sopenharmony_cicleanup()
1258c2ecf20Sopenharmony_ci{
1268c2ecf20Sopenharmony_ci	rm -f "$cin" "$cout"
1278c2ecf20Sopenharmony_ci	rm -f "$sin" "$sout"
1288c2ecf20Sopenharmony_ci	rm -f "$capout"
1298c2ecf20Sopenharmony_ci
1308c2ecf20Sopenharmony_ci	local netns
1318c2ecf20Sopenharmony_ci	for netns in "$ns1" "$ns2" "$ns3" "$ns4";do
1328c2ecf20Sopenharmony_ci		ip netns del $netns
1338c2ecf20Sopenharmony_ci	done
1348c2ecf20Sopenharmony_ci}
1358c2ecf20Sopenharmony_ci
1368c2ecf20Sopenharmony_cimptcp_lib_check_mptcp
1378c2ecf20Sopenharmony_ci
1388c2ecf20Sopenharmony_ciip -Version > /dev/null 2>&1
1398c2ecf20Sopenharmony_ciif [ $? -ne 0 ];then
1408c2ecf20Sopenharmony_ci	echo "SKIP: Could not run test without ip tool"
1418c2ecf20Sopenharmony_ci	exit $ksft_skip
1428c2ecf20Sopenharmony_cifi
1438c2ecf20Sopenharmony_ci
1448c2ecf20Sopenharmony_cisin=$(mktemp)
1458c2ecf20Sopenharmony_cisout=$(mktemp)
1468c2ecf20Sopenharmony_cicin=$(mktemp)
1478c2ecf20Sopenharmony_cicout=$(mktemp)
1488c2ecf20Sopenharmony_cicapout=$(mktemp)
1498c2ecf20Sopenharmony_citrap cleanup EXIT
1508c2ecf20Sopenharmony_ci
1518c2ecf20Sopenharmony_cifor i in "$ns1" "$ns2" "$ns3" "$ns4";do
1528c2ecf20Sopenharmony_ci	ip netns add $i || exit $ksft_skip
1538c2ecf20Sopenharmony_ci	ip -net $i link set lo up
1548c2ecf20Sopenharmony_cidone
1558c2ecf20Sopenharmony_ci
1568c2ecf20Sopenharmony_ci#  "$ns1"              ns2                    ns3                     ns4
1578c2ecf20Sopenharmony_ci# ns1eth2    ns2eth1   ns2eth3      ns3eth2   ns3eth4       ns4eth3
1588c2ecf20Sopenharmony_ci#                           - drop 1% ->            reorder 25%
1598c2ecf20Sopenharmony_ci#                           <- TSO off -
1608c2ecf20Sopenharmony_ci
1618c2ecf20Sopenharmony_ciip link add ns1eth2 netns "$ns1" type veth peer name ns2eth1 netns "$ns2"
1628c2ecf20Sopenharmony_ciip link add ns2eth3 netns "$ns2" type veth peer name ns3eth2 netns "$ns3"
1638c2ecf20Sopenharmony_ciip link add ns3eth4 netns "$ns3" type veth peer name ns4eth3 netns "$ns4"
1648c2ecf20Sopenharmony_ci
1658c2ecf20Sopenharmony_ciip -net "$ns1" addr add 10.0.1.1/24 dev ns1eth2
1668c2ecf20Sopenharmony_ciip -net "$ns1" addr add dead:beef:1::1/64 dev ns1eth2 nodad
1678c2ecf20Sopenharmony_ci
1688c2ecf20Sopenharmony_ciip -net "$ns1" link set ns1eth2 up
1698c2ecf20Sopenharmony_ciip -net "$ns1" route add default via 10.0.1.2
1708c2ecf20Sopenharmony_ciip -net "$ns1" route add default via dead:beef:1::2
1718c2ecf20Sopenharmony_ci
1728c2ecf20Sopenharmony_ciip -net "$ns2" addr add 10.0.1.2/24 dev ns2eth1
1738c2ecf20Sopenharmony_ciip -net "$ns2" addr add dead:beef:1::2/64 dev ns2eth1 nodad
1748c2ecf20Sopenharmony_ciip -net "$ns2" link set ns2eth1 up
1758c2ecf20Sopenharmony_ci
1768c2ecf20Sopenharmony_ciip -net "$ns2" addr add 10.0.2.1/24 dev ns2eth3
1778c2ecf20Sopenharmony_ciip -net "$ns2" addr add dead:beef:2::1/64 dev ns2eth3 nodad
1788c2ecf20Sopenharmony_ciip -net "$ns2" link set ns2eth3 up
1798c2ecf20Sopenharmony_ciip -net "$ns2" route add default via 10.0.2.2
1808c2ecf20Sopenharmony_ciip -net "$ns2" route add default via dead:beef:2::2
1818c2ecf20Sopenharmony_ciip netns exec "$ns2" sysctl -q net.ipv4.ip_forward=1
1828c2ecf20Sopenharmony_ciip netns exec "$ns2" sysctl -q net.ipv6.conf.all.forwarding=1
1838c2ecf20Sopenharmony_ci
1848c2ecf20Sopenharmony_ciip -net "$ns3" addr add 10.0.2.2/24 dev ns3eth2
1858c2ecf20Sopenharmony_ciip -net "$ns3" addr add dead:beef:2::2/64 dev ns3eth2 nodad
1868c2ecf20Sopenharmony_ciip -net "$ns3" link set ns3eth2 up
1878c2ecf20Sopenharmony_ci
1888c2ecf20Sopenharmony_ciip -net "$ns3" addr add 10.0.3.2/24 dev ns3eth4
1898c2ecf20Sopenharmony_ciip -net "$ns3" addr add dead:beef:3::2/64 dev ns3eth4 nodad
1908c2ecf20Sopenharmony_ciip -net "$ns3" link set ns3eth4 up
1918c2ecf20Sopenharmony_ciip -net "$ns3" route add default via 10.0.2.1
1928c2ecf20Sopenharmony_ciip -net "$ns3" route add default via dead:beef:2::1
1938c2ecf20Sopenharmony_ciip netns exec "$ns3" sysctl -q net.ipv4.ip_forward=1
1948c2ecf20Sopenharmony_ciip netns exec "$ns3" sysctl -q net.ipv6.conf.all.forwarding=1
1958c2ecf20Sopenharmony_ci
1968c2ecf20Sopenharmony_ciip -net "$ns4" addr add 10.0.3.1/24 dev ns4eth3
1978c2ecf20Sopenharmony_ciip -net "$ns4" addr add dead:beef:3::1/64 dev ns4eth3 nodad
1988c2ecf20Sopenharmony_ciip -net "$ns4" link set ns4eth3 up
1998c2ecf20Sopenharmony_ciip -net "$ns4" route add default via 10.0.3.2
2008c2ecf20Sopenharmony_ciip -net "$ns4" route add default via dead:beef:3::2
2018c2ecf20Sopenharmony_ci
2028c2ecf20Sopenharmony_ciset_ethtool_flags() {
2038c2ecf20Sopenharmony_ci	local ns="$1"
2048c2ecf20Sopenharmony_ci	local dev="$2"
2058c2ecf20Sopenharmony_ci	local flags="$3"
2068c2ecf20Sopenharmony_ci
2078c2ecf20Sopenharmony_ci	ip netns exec $ns ethtool -K $dev $flags 2>/dev/null
2088c2ecf20Sopenharmony_ci	[ $? -eq 0 ] && echo "INFO: set $ns dev $dev: ethtool -K $flags"
2098c2ecf20Sopenharmony_ci}
2108c2ecf20Sopenharmony_ci
2118c2ecf20Sopenharmony_ciset_random_ethtool_flags() {
2128c2ecf20Sopenharmony_ci	local flags=""
2138c2ecf20Sopenharmony_ci	local r=$RANDOM
2148c2ecf20Sopenharmony_ci
2158c2ecf20Sopenharmony_ci	local pick1=$((r & 1))
2168c2ecf20Sopenharmony_ci	local pick2=$((r & 2))
2178c2ecf20Sopenharmony_ci	local pick3=$((r & 4))
2188c2ecf20Sopenharmony_ci
2198c2ecf20Sopenharmony_ci	[ $pick1 -ne 0 ] && flags="tso off"
2208c2ecf20Sopenharmony_ci	[ $pick2 -ne 0 ] && flags="$flags gso off"
2218c2ecf20Sopenharmony_ci	[ $pick3 -ne 0 ] && flags="$flags gro off"
2228c2ecf20Sopenharmony_ci
2238c2ecf20Sopenharmony_ci	[ -z "$flags" ] && return
2248c2ecf20Sopenharmony_ci
2258c2ecf20Sopenharmony_ci	set_ethtool_flags "$1" "$2" "$flags"
2268c2ecf20Sopenharmony_ci}
2278c2ecf20Sopenharmony_ci
2288c2ecf20Sopenharmony_ciif $ethtool_random_on;then
2298c2ecf20Sopenharmony_ci	set_random_ethtool_flags "$ns3" ns3eth2
2308c2ecf20Sopenharmony_ci	set_random_ethtool_flags "$ns4" ns4eth3
2318c2ecf20Sopenharmony_cielse
2328c2ecf20Sopenharmony_ci	set_ethtool_flags "$ns3" ns3eth2 "$ethtool_args"
2338c2ecf20Sopenharmony_ci	set_ethtool_flags "$ns4" ns4eth3 "$ethtool_args"
2348c2ecf20Sopenharmony_cifi
2358c2ecf20Sopenharmony_ci
2368c2ecf20Sopenharmony_ciprint_file_err()
2378c2ecf20Sopenharmony_ci{
2388c2ecf20Sopenharmony_ci	ls -l "$1" 1>&2
2398c2ecf20Sopenharmony_ci	echo "Trailing bytes are: "
2408c2ecf20Sopenharmony_ci	tail -c 27 "$1"
2418c2ecf20Sopenharmony_ci}
2428c2ecf20Sopenharmony_ci
2438c2ecf20Sopenharmony_cicheck_transfer()
2448c2ecf20Sopenharmony_ci{
2458c2ecf20Sopenharmony_ci	local in=$1
2468c2ecf20Sopenharmony_ci	local out=$2
2478c2ecf20Sopenharmony_ci	local what=$3
2488c2ecf20Sopenharmony_ci
2498c2ecf20Sopenharmony_ci	cmp "$in" "$out" > /dev/null 2>&1
2508c2ecf20Sopenharmony_ci	if [ $? -ne 0 ] ;then
2518c2ecf20Sopenharmony_ci		echo "[ FAIL ] $what does not match (in, out):"
2528c2ecf20Sopenharmony_ci		print_file_err "$in"
2538c2ecf20Sopenharmony_ci		print_file_err "$out"
2548c2ecf20Sopenharmony_ci
2558c2ecf20Sopenharmony_ci		return 1
2568c2ecf20Sopenharmony_ci	fi
2578c2ecf20Sopenharmony_ci
2588c2ecf20Sopenharmony_ci	return 0
2598c2ecf20Sopenharmony_ci}
2608c2ecf20Sopenharmony_ci
2618c2ecf20Sopenharmony_cicheck_mptcp_disabled()
2628c2ecf20Sopenharmony_ci{
2638c2ecf20Sopenharmony_ci	local disabled_ns
2648c2ecf20Sopenharmony_ci	disabled_ns="ns_disabled-$sech-$(mktemp -u XXXXXX)"
2658c2ecf20Sopenharmony_ci	ip netns add ${disabled_ns} || exit $ksft_skip
2668c2ecf20Sopenharmony_ci
2678c2ecf20Sopenharmony_ci	# net.mptcp.enabled should be enabled by default
2688c2ecf20Sopenharmony_ci	if [ "$(ip netns exec ${disabled_ns} sysctl net.mptcp.enabled | awk '{ print $3 }')" -ne 1 ]; then
2698c2ecf20Sopenharmony_ci		echo -e "net.mptcp.enabled sysctl is not 1 by default\t\t[ FAIL ]"
2708c2ecf20Sopenharmony_ci		ret=1
2718c2ecf20Sopenharmony_ci		return 1
2728c2ecf20Sopenharmony_ci	fi
2738c2ecf20Sopenharmony_ci	ip netns exec ${disabled_ns} sysctl -q net.mptcp.enabled=0
2748c2ecf20Sopenharmony_ci
2758c2ecf20Sopenharmony_ci	local err=0
2768c2ecf20Sopenharmony_ci	LANG=C ip netns exec ${disabled_ns} ./mptcp_connect -t $timeout -p 10000 -s MPTCP 127.0.0.1 < "$cin" 2>&1 | \
2778c2ecf20Sopenharmony_ci		grep -q "^socket: Protocol not available$" && err=1
2788c2ecf20Sopenharmony_ci	ip netns delete ${disabled_ns}
2798c2ecf20Sopenharmony_ci
2808c2ecf20Sopenharmony_ci	if [ ${err} -eq 0 ]; then
2818c2ecf20Sopenharmony_ci		echo -e "New MPTCP socket cannot be blocked via sysctl\t\t[ FAIL ]"
2828c2ecf20Sopenharmony_ci		ret=1
2838c2ecf20Sopenharmony_ci		return 1
2848c2ecf20Sopenharmony_ci	fi
2858c2ecf20Sopenharmony_ci
2868c2ecf20Sopenharmony_ci	echo -e "New MPTCP socket can be blocked via sysctl\t\t[ OK ]"
2878c2ecf20Sopenharmony_ci	return 0
2888c2ecf20Sopenharmony_ci}
2898c2ecf20Sopenharmony_ci
2908c2ecf20Sopenharmony_cicheck_mptcp_ulp_setsockopt()
2918c2ecf20Sopenharmony_ci{
2928c2ecf20Sopenharmony_ci	local t retval
2938c2ecf20Sopenharmony_ci	t="ns_ulp-$sech-$(mktemp -u XXXXXX)"
2948c2ecf20Sopenharmony_ci
2958c2ecf20Sopenharmony_ci	ip netns add ${t} || exit $ksft_skip
2968c2ecf20Sopenharmony_ci	if ! ip netns exec ${t} ./mptcp_connect -u -p 10000 -s TCP 127.0.0.1 2>&1; then
2978c2ecf20Sopenharmony_ci		printf "setsockopt(..., TCP_ULP, \"mptcp\", ...) allowed\t[ FAIL ]\n"
2988c2ecf20Sopenharmony_ci		retval=1
2998c2ecf20Sopenharmony_ci		ret=$retval
3008c2ecf20Sopenharmony_ci	else
3018c2ecf20Sopenharmony_ci		printf "setsockopt(..., TCP_ULP, \"mptcp\", ...) blocked\t[ OK ]\n"
3028c2ecf20Sopenharmony_ci		retval=0
3038c2ecf20Sopenharmony_ci	fi
3048c2ecf20Sopenharmony_ci	ip netns del ${t}
3058c2ecf20Sopenharmony_ci	return $retval
3068c2ecf20Sopenharmony_ci}
3078c2ecf20Sopenharmony_ci
3088c2ecf20Sopenharmony_ci# $1: IP address
3098c2ecf20Sopenharmony_ciis_v6()
3108c2ecf20Sopenharmony_ci{
3118c2ecf20Sopenharmony_ci	[ -z "${1##*:*}" ]
3128c2ecf20Sopenharmony_ci}
3138c2ecf20Sopenharmony_ci
3148c2ecf20Sopenharmony_cido_ping()
3158c2ecf20Sopenharmony_ci{
3168c2ecf20Sopenharmony_ci	local listener_ns="$1"
3178c2ecf20Sopenharmony_ci	local connector_ns="$2"
3188c2ecf20Sopenharmony_ci	local connect_addr="$3"
3198c2ecf20Sopenharmony_ci	local ping_args="-q -c 1"
3208c2ecf20Sopenharmony_ci
3218c2ecf20Sopenharmony_ci	if is_v6 "${connect_addr}"; then
3228c2ecf20Sopenharmony_ci		$ipv6 || return 0
3238c2ecf20Sopenharmony_ci		ping_args="${ping_args} -6"
3248c2ecf20Sopenharmony_ci	fi
3258c2ecf20Sopenharmony_ci
3268c2ecf20Sopenharmony_ci	ip netns exec ${connector_ns} ping ${ping_args} $connect_addr >/dev/null
3278c2ecf20Sopenharmony_ci	if [ $? -ne 0 ] ; then
3288c2ecf20Sopenharmony_ci		echo "$listener_ns -> $connect_addr connectivity [ FAIL ]" 1>&2
3298c2ecf20Sopenharmony_ci		ret=1
3308c2ecf20Sopenharmony_ci
3318c2ecf20Sopenharmony_ci		return 1
3328c2ecf20Sopenharmony_ci	fi
3338c2ecf20Sopenharmony_ci
3348c2ecf20Sopenharmony_ci	return 0
3358c2ecf20Sopenharmony_ci}
3368c2ecf20Sopenharmony_ci
3378c2ecf20Sopenharmony_ci# $1: ns, $2: port
3388c2ecf20Sopenharmony_ciwait_local_port_listen()
3398c2ecf20Sopenharmony_ci{
3408c2ecf20Sopenharmony_ci	local listener_ns="${1}"
3418c2ecf20Sopenharmony_ci	local port="${2}"
3428c2ecf20Sopenharmony_ci
3438c2ecf20Sopenharmony_ci	local port_hex i
3448c2ecf20Sopenharmony_ci
3458c2ecf20Sopenharmony_ci	port_hex="$(printf "%04X" "${port}")"
3468c2ecf20Sopenharmony_ci	for i in $(seq 10); do
3478c2ecf20Sopenharmony_ci		ip netns exec "${listener_ns}" cat /proc/net/tcp* | \
3488c2ecf20Sopenharmony_ci			awk "BEGIN {rc=1} {if (\$2 ~ /:${port_hex}\$/ && \$4 ~ /0A/) {rc=0; exit}} END {exit rc}" &&
3498c2ecf20Sopenharmony_ci			break
3508c2ecf20Sopenharmony_ci		sleep 0.1
3518c2ecf20Sopenharmony_ci	done
3528c2ecf20Sopenharmony_ci}
3538c2ecf20Sopenharmony_ci
3548c2ecf20Sopenharmony_cido_transfer()
3558c2ecf20Sopenharmony_ci{
3568c2ecf20Sopenharmony_ci	local listener_ns="$1"
3578c2ecf20Sopenharmony_ci	local connector_ns="$2"
3588c2ecf20Sopenharmony_ci	local cl_proto="$3"
3598c2ecf20Sopenharmony_ci	local srv_proto="$4"
3608c2ecf20Sopenharmony_ci	local connect_addr="$5"
3618c2ecf20Sopenharmony_ci	local local_addr="$6"
3628c2ecf20Sopenharmony_ci	local extra_args=""
3638c2ecf20Sopenharmony_ci
3648c2ecf20Sopenharmony_ci	local port
3658c2ecf20Sopenharmony_ci	port=$((10000+$TEST_COUNT))
3668c2ecf20Sopenharmony_ci	TEST_COUNT=$((TEST_COUNT+1))
3678c2ecf20Sopenharmony_ci
3688c2ecf20Sopenharmony_ci	if [ "$rcvbuf" -gt 0 ]; then
3698c2ecf20Sopenharmony_ci		extra_args="$extra_args -R $rcvbuf"
3708c2ecf20Sopenharmony_ci	fi
3718c2ecf20Sopenharmony_ci
3728c2ecf20Sopenharmony_ci	if [ "$sndbuf" -gt 0 ]; then
3738c2ecf20Sopenharmony_ci		extra_args="$extra_args -S $sndbuf"
3748c2ecf20Sopenharmony_ci	fi
3758c2ecf20Sopenharmony_ci
3768c2ecf20Sopenharmony_ci	if [ -n "$testmode" ]; then
3778c2ecf20Sopenharmony_ci		extra_args="$extra_args -m $testmode"
3788c2ecf20Sopenharmony_ci	fi
3798c2ecf20Sopenharmony_ci
3808c2ecf20Sopenharmony_ci	if [ -n "$extra_args" ] && $options_log; then
3818c2ecf20Sopenharmony_ci		options_log=false
3828c2ecf20Sopenharmony_ci		echo "INFO: extra options: $extra_args"
3838c2ecf20Sopenharmony_ci	fi
3848c2ecf20Sopenharmony_ci
3858c2ecf20Sopenharmony_ci	:> "$cout"
3868c2ecf20Sopenharmony_ci	:> "$sout"
3878c2ecf20Sopenharmony_ci	:> "$capout"
3888c2ecf20Sopenharmony_ci
3898c2ecf20Sopenharmony_ci	local addr_port
3908c2ecf20Sopenharmony_ci	addr_port=$(printf "%s:%d" ${connect_addr} ${port})
3918c2ecf20Sopenharmony_ci	printf "%.3s %-5s -> %.3s (%-20s) %-5s\t" ${connector_ns} ${cl_proto} ${listener_ns} ${addr_port} ${srv_proto}
3928c2ecf20Sopenharmony_ci
3938c2ecf20Sopenharmony_ci	if $capture; then
3948c2ecf20Sopenharmony_ci		local capuser
3958c2ecf20Sopenharmony_ci		if [ -z $SUDO_USER ] ; then
3968c2ecf20Sopenharmony_ci			capuser=""
3978c2ecf20Sopenharmony_ci		else
3988c2ecf20Sopenharmony_ci			capuser="-Z $SUDO_USER"
3998c2ecf20Sopenharmony_ci		fi
4008c2ecf20Sopenharmony_ci
4018c2ecf20Sopenharmony_ci		local capfile="${rndh}-${connector_ns:0:3}-${listener_ns:0:3}-${cl_proto}-${srv_proto}-${connect_addr}-${port}"
4028c2ecf20Sopenharmony_ci		local capopt="-i any -s 65535 -B 32768 ${capuser}"
4038c2ecf20Sopenharmony_ci
4048c2ecf20Sopenharmony_ci		ip netns exec ${listener_ns}  tcpdump ${capopt} -w "${capfile}-listener.pcap"  >> "${capout}" 2>&1 &
4058c2ecf20Sopenharmony_ci		local cappid_listener=$!
4068c2ecf20Sopenharmony_ci
4078c2ecf20Sopenharmony_ci		ip netns exec ${connector_ns} tcpdump ${capopt} -w "${capfile}-connector.pcap" >> "${capout}" 2>&1 &
4088c2ecf20Sopenharmony_ci		local cappid_connector=$!
4098c2ecf20Sopenharmony_ci
4108c2ecf20Sopenharmony_ci		sleep 1
4118c2ecf20Sopenharmony_ci	fi
4128c2ecf20Sopenharmony_ci
4138c2ecf20Sopenharmony_ci	local stat_synrx_last_l=$(ip netns exec ${listener_ns} nstat -z -a MPTcpExtMPCapableSYNRX | while read a count c rest ;do  echo $count;done)
4148c2ecf20Sopenharmony_ci	local stat_ackrx_last_l=$(ip netns exec ${listener_ns} nstat -z -a MPTcpExtMPCapableACKRX | while read a count c rest ;do  echo $count;done)
4158c2ecf20Sopenharmony_ci	local stat_cookietx_last=$(ip netns exec ${listener_ns} nstat -z -a TcpExtSyncookiesSent | while read a count c rest ;do  echo $count;done)
4168c2ecf20Sopenharmony_ci	local stat_cookierx_last=$(ip netns exec ${listener_ns} nstat -z -a TcpExtSyncookiesRecv | while read a count c rest ;do  echo $count;done)
4178c2ecf20Sopenharmony_ci
4188c2ecf20Sopenharmony_ci	ip netns exec ${listener_ns} ./mptcp_connect -t $timeout -l -p $port -s ${srv_proto} $extra_args $local_addr < "$sin" > "$sout" &
4198c2ecf20Sopenharmony_ci	local spid=$!
4208c2ecf20Sopenharmony_ci
4218c2ecf20Sopenharmony_ci	wait_local_port_listen "${listener_ns}" "${port}"
4228c2ecf20Sopenharmony_ci
4238c2ecf20Sopenharmony_ci	local start
4248c2ecf20Sopenharmony_ci	start=$(date +%s%3N)
4258c2ecf20Sopenharmony_ci	ip netns exec ${connector_ns} ./mptcp_connect -t $timeout -p $port -s ${cl_proto} $extra_args $connect_addr < "$cin" > "$cout" &
4268c2ecf20Sopenharmony_ci	local cpid=$!
4278c2ecf20Sopenharmony_ci
4288c2ecf20Sopenharmony_ci	wait $cpid
4298c2ecf20Sopenharmony_ci	local retc=$?
4308c2ecf20Sopenharmony_ci	wait $spid
4318c2ecf20Sopenharmony_ci	local rets=$?
4328c2ecf20Sopenharmony_ci
4338c2ecf20Sopenharmony_ci	local stop
4348c2ecf20Sopenharmony_ci	stop=$(date +%s%3N)
4358c2ecf20Sopenharmony_ci
4368c2ecf20Sopenharmony_ci	if $capture; then
4378c2ecf20Sopenharmony_ci		sleep 1
4388c2ecf20Sopenharmony_ci		kill ${cappid_listener}
4398c2ecf20Sopenharmony_ci		kill ${cappid_connector}
4408c2ecf20Sopenharmony_ci	fi
4418c2ecf20Sopenharmony_ci
4428c2ecf20Sopenharmony_ci	local duration
4438c2ecf20Sopenharmony_ci	duration=$((stop-start))
4448c2ecf20Sopenharmony_ci	duration=$(printf "(duration %05sms)" $duration)
4458c2ecf20Sopenharmony_ci	if [ ${rets} -ne 0 ] || [ ${retc} -ne 0 ]; then
4468c2ecf20Sopenharmony_ci		echo "$duration [ FAIL ] client exit code $retc, server $rets" 1>&2
4478c2ecf20Sopenharmony_ci		echo -e "\nnetns ${listener_ns} socket stat for ${port}:" 1>&2
4488c2ecf20Sopenharmony_ci		ip netns exec ${listener_ns} ss -nita 1>&2 -o "sport = :$port"
4498c2ecf20Sopenharmony_ci		echo -e "\nnetns ${connector_ns} socket stat for ${port}:" 1>&2
4508c2ecf20Sopenharmony_ci		ip netns exec ${connector_ns} ss -nita 1>&2 -o "dport = :$port"
4518c2ecf20Sopenharmony_ci
4528c2ecf20Sopenharmony_ci		cat "$capout"
4538c2ecf20Sopenharmony_ci		return 1
4548c2ecf20Sopenharmony_ci	fi
4558c2ecf20Sopenharmony_ci
4568c2ecf20Sopenharmony_ci	check_transfer $sin $cout "file received by client"
4578c2ecf20Sopenharmony_ci	retc=$?
4588c2ecf20Sopenharmony_ci	check_transfer $cin $sout "file received by server"
4598c2ecf20Sopenharmony_ci	rets=$?
4608c2ecf20Sopenharmony_ci
4618c2ecf20Sopenharmony_ci	local stat_synrx_now_l=$(ip netns exec ${listener_ns} nstat -z -a MPTcpExtMPCapableSYNRX  | while read a count c rest ;do  echo $count;done)
4628c2ecf20Sopenharmony_ci	local stat_ackrx_now_l=$(ip netns exec ${listener_ns} nstat -z -a MPTcpExtMPCapableACKRX  | while read a count c rest ;do  echo $count;done)
4638c2ecf20Sopenharmony_ci
4648c2ecf20Sopenharmony_ci	local stat_cookietx_now=$(ip netns exec ${listener_ns} nstat -z -a TcpExtSyncookiesSent | while read a count c rest ;do  echo $count;done)
4658c2ecf20Sopenharmony_ci	local stat_cookierx_now=$(ip netns exec ${listener_ns} nstat -z -a TcpExtSyncookiesRecv | while read a count c rest ;do  echo $count;done)
4668c2ecf20Sopenharmony_ci
4678c2ecf20Sopenharmony_ci	expect_synrx=$((stat_synrx_last_l))
4688c2ecf20Sopenharmony_ci	expect_ackrx=$((stat_ackrx_last_l))
4698c2ecf20Sopenharmony_ci
4708c2ecf20Sopenharmony_ci	cookies=$(ip netns exec ${listener_ns} sysctl net.ipv4.tcp_syncookies)
4718c2ecf20Sopenharmony_ci	cookies=${cookies##*=}
4728c2ecf20Sopenharmony_ci
4738c2ecf20Sopenharmony_ci	if [ ${cl_proto} = "MPTCP" ] && [ ${srv_proto} = "MPTCP" ]; then
4748c2ecf20Sopenharmony_ci		expect_synrx=$((stat_synrx_last_l+1))
4758c2ecf20Sopenharmony_ci		expect_ackrx=$((stat_ackrx_last_l+1))
4768c2ecf20Sopenharmony_ci	fi
4778c2ecf20Sopenharmony_ci	if [ $cookies -eq 2 ];then
4788c2ecf20Sopenharmony_ci		if [ $stat_cookietx_last -ge $stat_cookietx_now ] ;then
4798c2ecf20Sopenharmony_ci			echo "${listener_ns} CookieSent: ${cl_proto} -> ${srv_proto}: did not advance"
4808c2ecf20Sopenharmony_ci		fi
4818c2ecf20Sopenharmony_ci		if [ $stat_cookierx_last -ge $stat_cookierx_now ] ;then
4828c2ecf20Sopenharmony_ci			echo "${listener_ns} CookieRecv: ${cl_proto} -> ${srv_proto}: did not advance"
4838c2ecf20Sopenharmony_ci		fi
4848c2ecf20Sopenharmony_ci	else
4858c2ecf20Sopenharmony_ci		if [ $stat_cookietx_last -ne $stat_cookietx_now ] ;then
4868c2ecf20Sopenharmony_ci			echo "${listener_ns} CookieSent: ${cl_proto} -> ${srv_proto}: changed"
4878c2ecf20Sopenharmony_ci		fi
4888c2ecf20Sopenharmony_ci		if [ $stat_cookierx_last -ne $stat_cookierx_now ] ;then
4898c2ecf20Sopenharmony_ci			echo "${listener_ns} CookieRecv: ${cl_proto} -> ${srv_proto}: changed"
4908c2ecf20Sopenharmony_ci		fi
4918c2ecf20Sopenharmony_ci	fi
4928c2ecf20Sopenharmony_ci
4938c2ecf20Sopenharmony_ci	if [ $expect_synrx -ne $stat_synrx_now_l ] ;then
4948c2ecf20Sopenharmony_ci		echo "${listener_ns} SYNRX: ${cl_proto} -> ${srv_proto}: expect ${expect_synrx}, got ${stat_synrx_now_l}"
4958c2ecf20Sopenharmony_ci	fi
4968c2ecf20Sopenharmony_ci	if [ $expect_ackrx -ne $stat_ackrx_now_l ] ;then
4978c2ecf20Sopenharmony_ci		echo "${listener_ns} ACKRX: ${cl_proto} -> ${srv_proto}: expect ${expect_ackrx}, got ${stat_ackrx_now_l} "
4988c2ecf20Sopenharmony_ci	fi
4998c2ecf20Sopenharmony_ci
5008c2ecf20Sopenharmony_ci	if [ $retc -eq 0 ] && [ $rets -eq 0 ];then
5018c2ecf20Sopenharmony_ci		echo "$duration [ OK ]"
5028c2ecf20Sopenharmony_ci		cat "$capout"
5038c2ecf20Sopenharmony_ci		return 0
5048c2ecf20Sopenharmony_ci	fi
5058c2ecf20Sopenharmony_ci
5068c2ecf20Sopenharmony_ci	cat "$capout"
5078c2ecf20Sopenharmony_ci	return 1
5088c2ecf20Sopenharmony_ci}
5098c2ecf20Sopenharmony_ci
5108c2ecf20Sopenharmony_cimake_file()
5118c2ecf20Sopenharmony_ci{
5128c2ecf20Sopenharmony_ci	local name=$1
5138c2ecf20Sopenharmony_ci	local who=$2
5148c2ecf20Sopenharmony_ci	local SIZE=$filesize
5158c2ecf20Sopenharmony_ci	local ksize
5168c2ecf20Sopenharmony_ci	local rem
5178c2ecf20Sopenharmony_ci
5188c2ecf20Sopenharmony_ci	if [ $SIZE -eq 0 ]; then
5198c2ecf20Sopenharmony_ci		local MAXSIZE=$((1024 * 1024 * 8))
5208c2ecf20Sopenharmony_ci		local MINSIZE=$((1024 * 256))
5218c2ecf20Sopenharmony_ci
5228c2ecf20Sopenharmony_ci		SIZE=$(((RANDOM * RANDOM + MINSIZE) % MAXSIZE))
5238c2ecf20Sopenharmony_ci	fi
5248c2ecf20Sopenharmony_ci
5258c2ecf20Sopenharmony_ci	ksize=$((SIZE / 1024))
5268c2ecf20Sopenharmony_ci	rem=$((SIZE - (ksize * 1024)))
5278c2ecf20Sopenharmony_ci
5288c2ecf20Sopenharmony_ci	dd if=/dev/urandom of="$name" bs=1024 count=$ksize 2> /dev/null
5298c2ecf20Sopenharmony_ci	dd if=/dev/urandom conv=notrunc of="$name" bs=1 count=$rem 2> /dev/null
5308c2ecf20Sopenharmony_ci	echo -e "\nMPTCP_TEST_FILE_END_MARKER" >> "$name"
5318c2ecf20Sopenharmony_ci
5328c2ecf20Sopenharmony_ci	echo "Created $name (size $(du -b "$name")) containing data sent by $who"
5338c2ecf20Sopenharmony_ci}
5348c2ecf20Sopenharmony_ci
5358c2ecf20Sopenharmony_cirun_tests_lo()
5368c2ecf20Sopenharmony_ci{
5378c2ecf20Sopenharmony_ci	local listener_ns="$1"
5388c2ecf20Sopenharmony_ci	local connector_ns="$2"
5398c2ecf20Sopenharmony_ci	local connect_addr="$3"
5408c2ecf20Sopenharmony_ci	local loopback="$4"
5418c2ecf20Sopenharmony_ci	local lret=0
5428c2ecf20Sopenharmony_ci
5438c2ecf20Sopenharmony_ci	# skip if test programs are running inside same netns for subsequent runs.
5448c2ecf20Sopenharmony_ci	if [ $loopback -eq 0 ] && [ ${listener_ns} = ${connector_ns} ]; then
5458c2ecf20Sopenharmony_ci		return 0
5468c2ecf20Sopenharmony_ci	fi
5478c2ecf20Sopenharmony_ci
5488c2ecf20Sopenharmony_ci	# skip if we don't want v6
5498c2ecf20Sopenharmony_ci	if ! $ipv6 && is_v6 "${connect_addr}"; then
5508c2ecf20Sopenharmony_ci		return 0
5518c2ecf20Sopenharmony_ci	fi
5528c2ecf20Sopenharmony_ci
5538c2ecf20Sopenharmony_ci	local local_addr
5548c2ecf20Sopenharmony_ci	if is_v6 "${connect_addr}"; then
5558c2ecf20Sopenharmony_ci		local_addr="::"
5568c2ecf20Sopenharmony_ci	else
5578c2ecf20Sopenharmony_ci		local_addr="0.0.0.0"
5588c2ecf20Sopenharmony_ci	fi
5598c2ecf20Sopenharmony_ci
5608c2ecf20Sopenharmony_ci	do_transfer ${listener_ns} ${connector_ns} MPTCP MPTCP ${connect_addr} ${local_addr}
5618c2ecf20Sopenharmony_ci	lret=$?
5628c2ecf20Sopenharmony_ci	if [ $lret -ne 0 ]; then
5638c2ecf20Sopenharmony_ci		ret=$lret
5648c2ecf20Sopenharmony_ci		return 1
5658c2ecf20Sopenharmony_ci	fi
5668c2ecf20Sopenharmony_ci
5678c2ecf20Sopenharmony_ci	if [ $do_tcp -eq 0 ]; then
5688c2ecf20Sopenharmony_ci		# don't bother testing fallback tcp except for loopback case.
5698c2ecf20Sopenharmony_ci		if [ ${listener_ns} != ${connector_ns} ]; then
5708c2ecf20Sopenharmony_ci			return 0
5718c2ecf20Sopenharmony_ci		fi
5728c2ecf20Sopenharmony_ci	fi
5738c2ecf20Sopenharmony_ci
5748c2ecf20Sopenharmony_ci	do_transfer ${listener_ns} ${connector_ns} MPTCP TCP ${connect_addr} ${local_addr}
5758c2ecf20Sopenharmony_ci	lret=$?
5768c2ecf20Sopenharmony_ci	if [ $lret -ne 0 ]; then
5778c2ecf20Sopenharmony_ci		ret=$lret
5788c2ecf20Sopenharmony_ci		return 1
5798c2ecf20Sopenharmony_ci	fi
5808c2ecf20Sopenharmony_ci
5818c2ecf20Sopenharmony_ci	do_transfer ${listener_ns} ${connector_ns} TCP MPTCP ${connect_addr} ${local_addr}
5828c2ecf20Sopenharmony_ci	lret=$?
5838c2ecf20Sopenharmony_ci	if [ $lret -ne 0 ]; then
5848c2ecf20Sopenharmony_ci		ret=$lret
5858c2ecf20Sopenharmony_ci		return 1
5868c2ecf20Sopenharmony_ci	fi
5878c2ecf20Sopenharmony_ci
5888c2ecf20Sopenharmony_ci	if [ $do_tcp -gt 1 ] ;then
5898c2ecf20Sopenharmony_ci		do_transfer ${listener_ns} ${connector_ns} TCP TCP ${connect_addr} ${local_addr}
5908c2ecf20Sopenharmony_ci		lret=$?
5918c2ecf20Sopenharmony_ci		if [ $lret -ne 0 ]; then
5928c2ecf20Sopenharmony_ci			ret=$lret
5938c2ecf20Sopenharmony_ci			return 1
5948c2ecf20Sopenharmony_ci		fi
5958c2ecf20Sopenharmony_ci	fi
5968c2ecf20Sopenharmony_ci
5978c2ecf20Sopenharmony_ci	return 0
5988c2ecf20Sopenharmony_ci}
5998c2ecf20Sopenharmony_ci
6008c2ecf20Sopenharmony_cirun_tests()
6018c2ecf20Sopenharmony_ci{
6028c2ecf20Sopenharmony_ci	run_tests_lo $1 $2 $3 0
6038c2ecf20Sopenharmony_ci}
6048c2ecf20Sopenharmony_ci
6058c2ecf20Sopenharmony_cimake_file "$cin" "client"
6068c2ecf20Sopenharmony_cimake_file "$sin" "server"
6078c2ecf20Sopenharmony_ci
6088c2ecf20Sopenharmony_cicheck_mptcp_disabled
6098c2ecf20Sopenharmony_ci
6108c2ecf20Sopenharmony_cicheck_mptcp_ulp_setsockopt
6118c2ecf20Sopenharmony_ci
6128c2ecf20Sopenharmony_ciecho "INFO: validating network environment with pings"
6138c2ecf20Sopenharmony_cifor sender in "$ns1" "$ns2" "$ns3" "$ns4";do
6148c2ecf20Sopenharmony_ci	do_ping "$ns1" $sender 10.0.1.1
6158c2ecf20Sopenharmony_ci	do_ping "$ns1" $sender dead:beef:1::1
6168c2ecf20Sopenharmony_ci
6178c2ecf20Sopenharmony_ci	do_ping "$ns2" $sender 10.0.1.2
6188c2ecf20Sopenharmony_ci	do_ping "$ns2" $sender dead:beef:1::2
6198c2ecf20Sopenharmony_ci	do_ping "$ns2" $sender 10.0.2.1
6208c2ecf20Sopenharmony_ci	do_ping "$ns2" $sender dead:beef:2::1
6218c2ecf20Sopenharmony_ci
6228c2ecf20Sopenharmony_ci	do_ping "$ns3" $sender 10.0.2.2
6238c2ecf20Sopenharmony_ci	do_ping "$ns3" $sender dead:beef:2::2
6248c2ecf20Sopenharmony_ci	do_ping "$ns3" $sender 10.0.3.2
6258c2ecf20Sopenharmony_ci	do_ping "$ns3" $sender dead:beef:3::2
6268c2ecf20Sopenharmony_ci
6278c2ecf20Sopenharmony_ci	do_ping "$ns4" $sender 10.0.3.1
6288c2ecf20Sopenharmony_ci	do_ping "$ns4" $sender dead:beef:3::1
6298c2ecf20Sopenharmony_cidone
6308c2ecf20Sopenharmony_ci
6318c2ecf20Sopenharmony_ci[ -n "$tc_loss" ] && tc -net "$ns2" qdisc add dev ns2eth3 root netem loss random $tc_loss delay ${tc_delay}ms
6328c2ecf20Sopenharmony_ciecho -n "INFO: Using loss of $tc_loss "
6338c2ecf20Sopenharmony_citest "$tc_delay" -gt 0 && echo -n "delay $tc_delay ms "
6348c2ecf20Sopenharmony_ci
6358c2ecf20Sopenharmony_cireorder_delay=$(($tc_delay / 4))
6368c2ecf20Sopenharmony_ci
6378c2ecf20Sopenharmony_ciif [ -z "${tc_reorder}" ]; then
6388c2ecf20Sopenharmony_ci	reorder1=$((RANDOM%10))
6398c2ecf20Sopenharmony_ci	reorder1=$((100 - reorder1))
6408c2ecf20Sopenharmony_ci	reorder2=$((RANDOM%100))
6418c2ecf20Sopenharmony_ci
6428c2ecf20Sopenharmony_ci	if [ $reorder_delay -gt 0 ] && [ $reorder1 -lt 100 ] && [ $reorder2 -gt 0 ]; then
6438c2ecf20Sopenharmony_ci		tc_reorder="reorder ${reorder1}% ${reorder2}%"
6448c2ecf20Sopenharmony_ci		echo -n "$tc_reorder with delay ${reorder_delay}ms "
6458c2ecf20Sopenharmony_ci	fi
6468c2ecf20Sopenharmony_cielif [ "$tc_reorder" = "0" ];then
6478c2ecf20Sopenharmony_ci	tc_reorder=""
6488c2ecf20Sopenharmony_cielif [ "$reorder_delay" -gt 0 ];then
6498c2ecf20Sopenharmony_ci	# reordering requires some delay
6508c2ecf20Sopenharmony_ci	tc_reorder="reorder $tc_reorder"
6518c2ecf20Sopenharmony_ci	echo -n "$tc_reorder with delay ${reorder_delay}ms "
6528c2ecf20Sopenharmony_cifi
6538c2ecf20Sopenharmony_ci
6548c2ecf20Sopenharmony_ciecho "on ns3eth4"
6558c2ecf20Sopenharmony_ci
6568c2ecf20Sopenharmony_citc -net "$ns3" qdisc add dev ns3eth4 root netem delay ${reorder_delay}ms $tc_reorder
6578c2ecf20Sopenharmony_ci
6588c2ecf20Sopenharmony_cifor sender in $ns1 $ns2 $ns3 $ns4;do
6598c2ecf20Sopenharmony_ci	run_tests_lo "$ns1" "$sender" 10.0.1.1 1
6608c2ecf20Sopenharmony_ci	if [ $ret -ne 0 ] ;then
6618c2ecf20Sopenharmony_ci		echo "FAIL: Could not even run loopback test" 1>&2
6628c2ecf20Sopenharmony_ci		exit $ret
6638c2ecf20Sopenharmony_ci	fi
6648c2ecf20Sopenharmony_ci	run_tests_lo "$ns1" $sender dead:beef:1::1 1
6658c2ecf20Sopenharmony_ci	if [ $ret -ne 0 ] ;then
6668c2ecf20Sopenharmony_ci		echo "FAIL: Could not even run loopback v6 test" 2>&1
6678c2ecf20Sopenharmony_ci		exit $ret
6688c2ecf20Sopenharmony_ci	fi
6698c2ecf20Sopenharmony_ci
6708c2ecf20Sopenharmony_ci	# ns1<->ns2 is not subject to reordering/tc delays. Use it to test
6718c2ecf20Sopenharmony_ci	# mptcp syncookie support.
6728c2ecf20Sopenharmony_ci	if [ $sender = $ns1 ]; then
6738c2ecf20Sopenharmony_ci		ip netns exec "$ns2" sysctl -q net.ipv4.tcp_syncookies=2
6748c2ecf20Sopenharmony_ci	else
6758c2ecf20Sopenharmony_ci		ip netns exec "$ns2" sysctl -q net.ipv4.tcp_syncookies=1
6768c2ecf20Sopenharmony_ci	fi
6778c2ecf20Sopenharmony_ci
6788c2ecf20Sopenharmony_ci	run_tests "$ns2" $sender 10.0.1.2
6798c2ecf20Sopenharmony_ci	run_tests "$ns2" $sender dead:beef:1::2
6808c2ecf20Sopenharmony_ci	run_tests "$ns2" $sender 10.0.2.1
6818c2ecf20Sopenharmony_ci	run_tests "$ns2" $sender dead:beef:2::1
6828c2ecf20Sopenharmony_ci
6838c2ecf20Sopenharmony_ci	run_tests "$ns3" $sender 10.0.2.2
6848c2ecf20Sopenharmony_ci	run_tests "$ns3" $sender dead:beef:2::2
6858c2ecf20Sopenharmony_ci	run_tests "$ns3" $sender 10.0.3.2
6868c2ecf20Sopenharmony_ci	run_tests "$ns3" $sender dead:beef:3::2
6878c2ecf20Sopenharmony_ci
6888c2ecf20Sopenharmony_ci	run_tests "$ns4" $sender 10.0.3.1
6898c2ecf20Sopenharmony_ci	run_tests "$ns4" $sender dead:beef:3::1
6908c2ecf20Sopenharmony_cidone
6918c2ecf20Sopenharmony_ci
6928c2ecf20Sopenharmony_citime_end=$(date +%s)
6938c2ecf20Sopenharmony_citime_run=$((time_end-time_start))
6948c2ecf20Sopenharmony_ci
6958c2ecf20Sopenharmony_ciecho "Time: ${time_run} seconds"
6968c2ecf20Sopenharmony_ci
6978c2ecf20Sopenharmony_ciexit $ret
698