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