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