1#!/bin/bash 2# SPDX-License-Identifier: GPL-2.0 3 4ret=0 5sin="" 6sout="" 7cin="" 8cinsent="" 9cout="" 10ksft_skip=4 11timeout_poll=30 12timeout_test=$((timeout_poll * 2 + 1)) 13mptcp_connect="" 14capture=0 15checksum=0 16do_all_tests=1 17 18TEST_COUNT=0 19 20# generated using "nfbpf_compile '(ip && (ip[54] & 0xf0) == 0x30) || 21# (ip6 && (ip6[74] & 0xf0) == 0x30)'" 22CBPF_MPTCP_SUBOPTION_ADD_ADDR="14, 23 48 0 0 0, 24 84 0 0 240, 25 21 0 3 64, 26 48 0 0 54, 27 84 0 0 240, 28 21 6 7 48, 29 48 0 0 0, 30 84 0 0 240, 31 21 0 4 96, 32 48 0 0 74, 33 84 0 0 240, 34 21 0 1 48, 35 6 0 0 65535, 36 6 0 0 0" 37 38init() 39{ 40 capout=$(mktemp) 41 42 rndh=$(printf %x $sec)-$(mktemp -u XXXXXX) 43 44 ns1="ns1-$rndh" 45 ns2="ns2-$rndh" 46 47 for netns in "$ns1" "$ns2";do 48 ip netns add $netns || exit $ksft_skip 49 ip -net $netns link set lo up 50 ip netns exec $netns sysctl -q net.mptcp.enabled=1 51 ip netns exec $netns sysctl -q net.ipv4.conf.all.rp_filter=0 52 ip netns exec $netns sysctl -q net.ipv4.conf.default.rp_filter=0 53 if [ $checksum -eq 1 ]; then 54 ip netns exec $netns sysctl -q net.mptcp.checksum_enabled=1 55 fi 56 done 57 58 # ns1 ns2 59 # ns1eth1 ns2eth1 60 # ns1eth2 ns2eth2 61 # ns1eth3 ns2eth3 62 # ns1eth4 ns2eth4 63 64 for i in `seq 1 4`; do 65 ip link add ns1eth$i netns "$ns1" type veth peer name ns2eth$i netns "$ns2" 66 ip -net "$ns1" addr add 10.0.$i.1/24 dev ns1eth$i 67 ip -net "$ns1" addr add dead:beef:$i::1/64 dev ns1eth$i nodad 68 ip -net "$ns1" link set ns1eth$i up 69 70 ip -net "$ns2" addr add 10.0.$i.2/24 dev ns2eth$i 71 ip -net "$ns2" addr add dead:beef:$i::2/64 dev ns2eth$i nodad 72 ip -net "$ns2" link set ns2eth$i up 73 74 # let $ns2 reach any $ns1 address from any interface 75 ip -net "$ns2" route add default via 10.0.$i.1 dev ns2eth$i metric 10$i 76 done 77} 78 79cleanup_partial() 80{ 81 rm -f "$capout" 82 83 for netns in "$ns1" "$ns2"; do 84 ip netns del $netns 85 rm -f /tmp/$netns.{nstat,out} 86 done 87} 88 89cleanup() 90{ 91 rm -f "$cin" "$cout" 92 rm -f "$sin" "$sout" "$cinsent" 93 cleanup_partial 94} 95 96reset() 97{ 98 cleanup_partial 99 init 100} 101 102reset_with_cookies() 103{ 104 reset 105 106 for netns in "$ns1" "$ns2";do 107 ip netns exec $netns sysctl -q net.ipv4.tcp_syncookies=2 108 done 109} 110 111reset_with_add_addr_timeout() 112{ 113 local ip="${1:-4}" 114 local tables 115 116 tables="iptables" 117 if [ $ip -eq 6 ]; then 118 tables="ip6tables" 119 fi 120 121 reset 122 123 ip netns exec $ns1 sysctl -q net.mptcp.add_addr_timeout=1 124 ip netns exec $ns2 $tables -A OUTPUT -p tcp \ 125 -m tcp --tcp-option 30 \ 126 -m bpf --bytecode \ 127 "$CBPF_MPTCP_SUBOPTION_ADD_ADDR" \ 128 -j DROP 129} 130 131reset_with_checksum() 132{ 133 local ns1_enable=$1 134 local ns2_enable=$2 135 136 reset 137 138 ip netns exec $ns1 sysctl -q net.mptcp.checksum_enabled=$ns1_enable 139 ip netns exec $ns2 sysctl -q net.mptcp.checksum_enabled=$ns2_enable 140} 141 142ip -Version > /dev/null 2>&1 143if [ $? -ne 0 ];then 144 echo "SKIP: Could not run test without ip tool" 145 exit $ksft_skip 146fi 147 148iptables -V > /dev/null 2>&1 149if [ $? -ne 0 ];then 150 echo "SKIP: Could not run all tests without iptables tool" 151 exit $ksft_skip 152fi 153 154ip6tables -V > /dev/null 2>&1 155if [ $? -ne 0 ];then 156 echo "SKIP: Could not run all tests without ip6tables tool" 157 exit $ksft_skip 158fi 159 160print_file_err() 161{ 162 ls -l "$1" 1>&2 163 echo "Trailing bytes are: " 164 tail -c 27 "$1" 165} 166 167check_transfer() 168{ 169 in=$1 170 out=$2 171 what=$3 172 173 cmp "$in" "$out" > /dev/null 2>&1 174 if [ $? -ne 0 ] ;then 175 echo "[ FAIL ] $what does not match (in, out):" 176 print_file_err "$in" 177 print_file_err "$out" 178 ret=1 179 180 return 1 181 fi 182 183 return 0 184} 185 186do_ping() 187{ 188 listener_ns="$1" 189 connector_ns="$2" 190 connect_addr="$3" 191 192 ip netns exec ${connector_ns} ping -q -c 1 $connect_addr >/dev/null 193 if [ $? -ne 0 ] ; then 194 echo "$listener_ns -> $connect_addr connectivity [ FAIL ]" 1>&2 195 ret=1 196 fi 197} 198 199link_failure() 200{ 201 ns="$1" 202 203 l=$((RANDOM%4)) 204 l=$((l+1)) 205 206 veth="ns1eth$l" 207 ip -net "$ns" link set "$veth" down 208} 209 210# $1: IP address 211is_v6() 212{ 213 [ -z "${1##*:*}" ] 214} 215 216do_transfer() 217{ 218 listener_ns="$1" 219 connector_ns="$2" 220 cl_proto="$3" 221 srv_proto="$4" 222 connect_addr="$5" 223 test_link_fail="$6" 224 addr_nr_ns1="$7" 225 addr_nr_ns2="$8" 226 speed="$9" 227 bkup="${10}" 228 229 port=$((10000+$TEST_COUNT)) 230 TEST_COUNT=$((TEST_COUNT+1)) 231 232 :> "$cout" 233 :> "$sout" 234 :> "$capout" 235 236 if [ $capture -eq 1 ]; then 237 if [ -z $SUDO_USER ] ; then 238 capuser="" 239 else 240 capuser="-Z $SUDO_USER" 241 fi 242 243 capfile=$(printf "mp_join-%02u-%s.pcap" "$TEST_COUNT" "${listener_ns}") 244 245 echo "Capturing traffic for test $TEST_COUNT into $capfile" 246 ip netns exec ${listener_ns} tcpdump -i any -s 65535 -B 32768 $capuser -w $capfile > "$capout" 2>&1 & 247 cappid=$! 248 249 sleep 1 250 fi 251 252 NSTAT_HISTORY=/tmp/${listener_ns}.nstat ip netns exec ${listener_ns} \ 253 nstat -n 254 NSTAT_HISTORY=/tmp/${connector_ns}.nstat ip netns exec ${connector_ns} \ 255 nstat -n 256 257 if [ $speed = "fast" ]; then 258 mptcp_connect="./mptcp_connect -j" 259 elif [ $speed = "slow" ]; then 260 mptcp_connect="./mptcp_connect -r 50" 261 elif [ $speed = "least" ]; then 262 mptcp_connect="./mptcp_connect -r 10" 263 fi 264 265 local local_addr 266 if is_v6 "${connect_addr}"; then 267 local_addr="::" 268 else 269 local_addr="0.0.0.0" 270 fi 271 272 timeout ${timeout_test} \ 273 ip netns exec ${listener_ns} \ 274 $mptcp_connect -t ${timeout_poll} -l -p $port -s ${srv_proto} \ 275 ${local_addr} < "$sin" > "$sout" & 276 spid=$! 277 278 sleep 1 279 280 if [ "$test_link_fail" -eq 0 ];then 281 timeout ${timeout_test} \ 282 ip netns exec ${connector_ns} \ 283 $mptcp_connect -t ${timeout_poll} -p $port -s ${cl_proto} \ 284 $connect_addr < "$cin" > "$cout" & 285 else 286 ( cat "$cin" ; sleep 2; link_failure $listener_ns ; cat "$cin" ) | \ 287 tee "$cinsent" | \ 288 timeout ${timeout_test} \ 289 ip netns exec ${connector_ns} \ 290 $mptcp_connect -t ${timeout_poll} -p $port -s ${cl_proto} \ 291 $connect_addr > "$cout" & 292 fi 293 cpid=$! 294 295 if [ $addr_nr_ns1 -gt 0 ]; then 296 let add_nr_ns1=addr_nr_ns1 297 counter=2 298 sleep 1 299 while [ $add_nr_ns1 -gt 0 ]; do 300 local addr 301 if is_v6 "${connect_addr}"; then 302 addr="dead:beef:$counter::1" 303 else 304 addr="10.0.$counter.1" 305 fi 306 ip netns exec $ns1 ./pm_nl_ctl add $addr flags signal 307 let counter+=1 308 let add_nr_ns1-=1 309 done 310 sleep 1 311 elif [ $addr_nr_ns1 -lt 0 ]; then 312 let rm_nr_ns1=-addr_nr_ns1 313 if [ $rm_nr_ns1 -lt 8 ]; then 314 counter=1 315 dump=(`ip netns exec ${listener_ns} ./pm_nl_ctl dump`) 316 if [ ${#dump[@]} -gt 0 ]; then 317 id=${dump[1]} 318 sleep 1 319 320 while [ $counter -le $rm_nr_ns1 ] 321 do 322 ip netns exec ${listener_ns} ./pm_nl_ctl del $id 323 sleep 1 324 let counter+=1 325 let id+=1 326 done 327 fi 328 elif [ $rm_nr_ns1 -eq 8 ]; then 329 sleep 1 330 ip netns exec ${listener_ns} ./pm_nl_ctl flush 331 elif [ $rm_nr_ns1 -eq 9 ]; then 332 sleep 1 333 ip netns exec ${listener_ns} ./pm_nl_ctl del 0 ${connect_addr} 334 fi 335 fi 336 337 if [ $addr_nr_ns2 -gt 0 ]; then 338 let add_nr_ns2=addr_nr_ns2 339 counter=3 340 sleep 1 341 while [ $add_nr_ns2 -gt 0 ]; do 342 local addr 343 if is_v6 "${connect_addr}"; then 344 addr="dead:beef:$counter::2" 345 else 346 addr="10.0.$counter.2" 347 fi 348 ip netns exec $ns2 ./pm_nl_ctl add $addr flags subflow 349 let counter+=1 350 let add_nr_ns2-=1 351 done 352 sleep 1 353 elif [ $addr_nr_ns2 -lt 0 ]; then 354 let rm_nr_ns2=-addr_nr_ns2 355 if [ $rm_nr_ns2 -lt 8 ]; then 356 counter=1 357 dump=(`ip netns exec ${connector_ns} ./pm_nl_ctl dump`) 358 if [ ${#dump[@]} -gt 0 ]; then 359 id=${dump[1]} 360 sleep 1 361 362 while [ $counter -le $rm_nr_ns2 ] 363 do 364 ip netns exec ${connector_ns} ./pm_nl_ctl del $id 365 sleep 1 366 let counter+=1 367 let id+=1 368 done 369 fi 370 elif [ $rm_nr_ns2 -eq 8 ]; then 371 sleep 1 372 ip netns exec ${connector_ns} ./pm_nl_ctl flush 373 elif [ $rm_nr_ns2 -eq 9 ]; then 374 local addr 375 if is_v6 "${connect_addr}"; then 376 addr="dead:beef:1::2" 377 else 378 addr="10.0.1.2" 379 fi 380 sleep 1 381 ip netns exec ${connector_ns} ./pm_nl_ctl del 0 $addr 382 fi 383 fi 384 385 if [ ! -z $bkup ]; then 386 sleep 1 387 for netns in "$ns1" "$ns2"; do 388 dump=(`ip netns exec $netns ./pm_nl_ctl dump`) 389 if [ ${#dump[@]} -gt 0 ]; then 390 addr=${dump[${#dump[@]} - 1]} 391 backup="ip netns exec $netns ./pm_nl_ctl set $addr flags $bkup" 392 $backup 393 fi 394 done 395 fi 396 397 wait $cpid 398 retc=$? 399 wait $spid 400 rets=$? 401 402 if [ $capture -eq 1 ]; then 403 sleep 1 404 kill $cappid 405 fi 406 407 NSTAT_HISTORY=/tmp/${listener_ns}.nstat ip netns exec ${listener_ns} \ 408 nstat | grep Tcp > /tmp/${listener_ns}.out 409 NSTAT_HISTORY=/tmp/${connector_ns}.nstat ip netns exec ${connector_ns} \ 410 nstat | grep Tcp > /tmp/${connector_ns}.out 411 412 if [ ${rets} -ne 0 ] || [ ${retc} -ne 0 ]; then 413 echo " client exit code $retc, server $rets" 1>&2 414 echo -e "\nnetns ${listener_ns} socket stat for ${port}:" 1>&2 415 ip netns exec ${listener_ns} ss -Menita 1>&2 -o "sport = :$port" 416 cat /tmp/${listener_ns}.out 417 echo -e "\nnetns ${connector_ns} socket stat for ${port}:" 1>&2 418 ip netns exec ${connector_ns} ss -Menita 1>&2 -o "dport = :$port" 419 cat /tmp/${connector_ns}.out 420 421 cat "$capout" 422 ret=1 423 return 1 424 fi 425 426 check_transfer $sin $cout "file received by client" 427 retc=$? 428 if [ "$test_link_fail" -eq 0 ];then 429 check_transfer $cin $sout "file received by server" 430 else 431 check_transfer $cinsent $sout "file received by server" 432 fi 433 rets=$? 434 435 if [ $retc -eq 0 ] && [ $rets -eq 0 ];then 436 cat "$capout" 437 return 0 438 fi 439 440 cat "$capout" 441 return 1 442} 443 444make_file() 445{ 446 name=$1 447 who=$2 448 size=$3 449 450 dd if=/dev/urandom of="$name" bs=1024 count=$size 2> /dev/null 451 echo -e "\nMPTCP_TEST_FILE_END_MARKER" >> "$name" 452 453 echo "Created $name (size $size KB) containing data sent by $who" 454} 455 456run_tests() 457{ 458 listener_ns="$1" 459 connector_ns="$2" 460 connect_addr="$3" 461 test_linkfail="${4:-0}" 462 addr_nr_ns1="${5:-0}" 463 addr_nr_ns2="${6:-0}" 464 speed="${7:-fast}" 465 bkup="${8:-""}" 466 lret=0 467 oldin="" 468 469 if [ "$test_linkfail" -eq 1 ];then 470 size=$((RANDOM%1024)) 471 size=$((size+1)) 472 size=$((size*128)) 473 474 oldin=$(mktemp) 475 cp "$cin" "$oldin" 476 make_file "$cin" "client" $size 477 fi 478 479 do_transfer ${listener_ns} ${connector_ns} MPTCP MPTCP ${connect_addr} \ 480 ${test_linkfail} ${addr_nr_ns1} ${addr_nr_ns2} ${speed} ${bkup} 481 lret=$? 482 483 if [ "$test_linkfail" -eq 1 ];then 484 cp "$oldin" "$cin" 485 rm -f "$oldin" 486 fi 487 488 if [ $lret -ne 0 ]; then 489 ret=$lret 490 return 491 fi 492} 493 494chk_csum_nr() 495{ 496 local msg=${1:-""} 497 local count 498 local dump_stats 499 500 if [ ! -z "$msg" ]; then 501 printf "%02u" "$TEST_COUNT" 502 else 503 echo -n " " 504 fi 505 printf " %-36s %s" "$msg" "sum" 506 count=`ip netns exec $ns1 nstat -as | grep MPTcpExtDataCsumErr | awk '{print $2}'` 507 [ -z "$count" ] && count=0 508 if [ "$count" != 0 ]; then 509 echo "[fail] got $count data checksum error[s] expected 0" 510 ret=1 511 dump_stats=1 512 else 513 echo -n "[ ok ]" 514 fi 515 echo -n " - csum " 516 count=`ip netns exec $ns2 nstat -as | grep MPTcpExtDataCsumErr | awk '{print $2}'` 517 [ -z "$count" ] && count=0 518 if [ "$count" != 0 ]; then 519 echo "[fail] got $count data checksum error[s] expected 0" 520 ret=1 521 dump_stats=1 522 else 523 echo "[ ok ]" 524 fi 525 if [ "${dump_stats}" = 1 ]; then 526 echo Server ns stats 527 ip netns exec $ns1 nstat -as | grep MPTcp 528 echo Client ns stats 529 ip netns exec $ns2 nstat -as | grep MPTcp 530 fi 531} 532 533chk_join_nr() 534{ 535 local msg="$1" 536 local syn_nr=$2 537 local syn_ack_nr=$3 538 local ack_nr=$4 539 local count 540 local dump_stats 541 542 printf "%02u %-36s %s" "$TEST_COUNT" "$msg" "syn" 543 count=`ip netns exec $ns1 nstat -as | grep MPTcpExtMPJoinSynRx | awk '{print $2}'` 544 [ -z "$count" ] && count=0 545 if [ "$count" != "$syn_nr" ]; then 546 echo "[fail] got $count JOIN[s] syn expected $syn_nr" 547 ret=1 548 dump_stats=1 549 else 550 echo -n "[ ok ]" 551 fi 552 553 echo -n " - synack" 554 count=`ip netns exec $ns2 nstat -as | grep MPTcpExtMPJoinSynAckRx | awk '{print $2}'` 555 [ -z "$count" ] && count=0 556 if [ "$count" != "$syn_ack_nr" ]; then 557 echo "[fail] got $count JOIN[s] synack expected $syn_ack_nr" 558 ret=1 559 dump_stats=1 560 else 561 echo -n "[ ok ]" 562 fi 563 564 echo -n " - ack" 565 count=`ip netns exec $ns1 nstat -as | grep MPTcpExtMPJoinAckRx | awk '{print $2}'` 566 [ -z "$count" ] && count=0 567 if [ "$count" != "$ack_nr" ]; then 568 echo "[fail] got $count JOIN[s] ack expected $ack_nr" 569 ret=1 570 dump_stats=1 571 else 572 echo "[ ok ]" 573 fi 574 if [ "${dump_stats}" = 1 ]; then 575 echo Server ns stats 576 ip netns exec $ns1 nstat -as | grep MPTcp 577 echo Client ns stats 578 ip netns exec $ns2 nstat -as | grep MPTcp 579 fi 580 if [ $checksum -eq 1 ]; then 581 chk_csum_nr 582 fi 583} 584 585chk_add_nr() 586{ 587 local add_nr=$1 588 local echo_nr=$2 589 local port_nr=${3:-0} 590 local syn_nr=${4:-$port_nr} 591 local syn_ack_nr=${5:-$port_nr} 592 local ack_nr=${6:-$port_nr} 593 local mis_syn_nr=${7:-0} 594 local mis_ack_nr=${8:-0} 595 local count 596 local dump_stats 597 598 printf "%-39s %s" " " "add" 599 count=`ip netns exec $ns2 nstat -as | grep MPTcpExtAddAddr | awk '{print $2}'` 600 [ -z "$count" ] && count=0 601 if [ "$count" != "$add_nr" ]; then 602 echo "[fail] got $count ADD_ADDR[s] expected $add_nr" 603 ret=1 604 dump_stats=1 605 else 606 echo -n "[ ok ]" 607 fi 608 609 echo -n " - echo " 610 count=`ip netns exec $ns1 nstat -as | grep MPTcpExtEchoAdd | awk '{print $2}'` 611 [ -z "$count" ] && count=0 612 if [ "$count" != "$echo_nr" ]; then 613 echo "[fail] got $count ADD_ADDR echo[s] expected $echo_nr" 614 ret=1 615 dump_stats=1 616 else 617 echo -n "[ ok ]" 618 fi 619 620 if [ $port_nr -gt 0 ]; then 621 echo -n " - pt " 622 count=`ip netns exec $ns2 nstat -as | grep MPTcpExtPortAdd | awk '{print $2}'` 623 [ -z "$count" ] && count=0 624 if [ "$count" != "$port_nr" ]; then 625 echo "[fail] got $count ADD_ADDR[s] with a port-number expected $port_nr" 626 ret=1 627 dump_stats=1 628 else 629 echo "[ ok ]" 630 fi 631 632 printf "%-39s %s" " " "syn" 633 count=`ip netns exec $ns1 nstat -as | grep MPTcpExtMPJoinPortSynRx | 634 awk '{print $2}'` 635 [ -z "$count" ] && count=0 636 if [ "$count" != "$syn_nr" ]; then 637 echo "[fail] got $count JOIN[s] syn with a different \ 638 port-number expected $syn_nr" 639 ret=1 640 dump_stats=1 641 else 642 echo -n "[ ok ]" 643 fi 644 645 echo -n " - synack" 646 count=`ip netns exec $ns2 nstat -as | grep MPTcpExtMPJoinPortSynAckRx | 647 awk '{print $2}'` 648 [ -z "$count" ] && count=0 649 if [ "$count" != "$syn_ack_nr" ]; then 650 echo "[fail] got $count JOIN[s] synack with a different \ 651 port-number expected $syn_ack_nr" 652 ret=1 653 dump_stats=1 654 else 655 echo -n "[ ok ]" 656 fi 657 658 echo -n " - ack" 659 count=`ip netns exec $ns1 nstat -as | grep MPTcpExtMPJoinPortAckRx | 660 awk '{print $2}'` 661 [ -z "$count" ] && count=0 662 if [ "$count" != "$ack_nr" ]; then 663 echo "[fail] got $count JOIN[s] ack with a different \ 664 port-number expected $ack_nr" 665 ret=1 666 dump_stats=1 667 else 668 echo "[ ok ]" 669 fi 670 671 printf "%-39s %s" " " "syn" 672 count=`ip netns exec $ns1 nstat -as | grep MPTcpExtMismatchPortSynRx | 673 awk '{print $2}'` 674 [ -z "$count" ] && count=0 675 if [ "$count" != "$mis_syn_nr" ]; then 676 echo "[fail] got $count JOIN[s] syn with a mismatched \ 677 port-number expected $mis_syn_nr" 678 ret=1 679 dump_stats=1 680 else 681 echo -n "[ ok ]" 682 fi 683 684 echo -n " - ack " 685 count=`ip netns exec $ns1 nstat -as | grep MPTcpExtMismatchPortAckRx | 686 awk '{print $2}'` 687 [ -z "$count" ] && count=0 688 if [ "$count" != "$mis_ack_nr" ]; then 689 echo "[fail] got $count JOIN[s] ack with a mismatched \ 690 port-number expected $mis_ack_nr" 691 ret=1 692 dump_stats=1 693 else 694 echo "[ ok ]" 695 fi 696 else 697 echo "" 698 fi 699 700 if [ "${dump_stats}" = 1 ]; then 701 echo Server ns stats 702 ip netns exec $ns1 nstat -as | grep MPTcp 703 echo Client ns stats 704 ip netns exec $ns2 nstat -as | grep MPTcp 705 fi 706} 707 708chk_rm_nr() 709{ 710 local rm_addr_nr=$1 711 local rm_subflow_nr=$2 712 local invert=${3:-""} 713 local count 714 local dump_stats 715 local addr_ns 716 local subflow_ns 717 718 if [ -z $invert ]; then 719 addr_ns=$ns1 720 subflow_ns=$ns2 721 elif [ $invert = "invert" ]; then 722 addr_ns=$ns2 723 subflow_ns=$ns1 724 fi 725 726 printf "%-39s %s" " " "rm " 727 count=`ip netns exec $addr_ns nstat -as | grep MPTcpExtRmAddr | awk '{print $2}'` 728 [ -z "$count" ] && count=0 729 if [ "$count" != "$rm_addr_nr" ]; then 730 echo "[fail] got $count RM_ADDR[s] expected $rm_addr_nr" 731 ret=1 732 dump_stats=1 733 else 734 echo -n "[ ok ]" 735 fi 736 737 echo -n " - sf " 738 count=`ip netns exec $subflow_ns nstat -as | grep MPTcpExtRmSubflow | awk '{print $2}'` 739 [ -z "$count" ] && count=0 740 if [ "$count" != "$rm_subflow_nr" ]; then 741 echo "[fail] got $count RM_SUBFLOW[s] expected $rm_subflow_nr" 742 ret=1 743 dump_stats=1 744 else 745 echo "[ ok ]" 746 fi 747 748 if [ "${dump_stats}" = 1 ]; then 749 echo Server ns stats 750 ip netns exec $ns1 nstat -as | grep MPTcp 751 echo Client ns stats 752 ip netns exec $ns2 nstat -as | grep MPTcp 753 fi 754} 755 756chk_prio_nr() 757{ 758 local mp_prio_nr_tx=$1 759 local mp_prio_nr_rx=$2 760 local count 761 local dump_stats 762 763 printf "%-39s %s" " " "ptx" 764 count=`ip netns exec $ns1 nstat -as | grep MPTcpExtMPPrioTx | awk '{print $2}'` 765 [ -z "$count" ] && count=0 766 if [ "$count" != "$mp_prio_nr_tx" ]; then 767 echo "[fail] got $count MP_PRIO[s] TX expected $mp_prio_nr_tx" 768 ret=1 769 dump_stats=1 770 else 771 echo -n "[ ok ]" 772 fi 773 774 echo -n " - prx " 775 count=`ip netns exec $ns1 nstat -as | grep MPTcpExtMPPrioRx | awk '{print $2}'` 776 [ -z "$count" ] && count=0 777 if [ "$count" != "$mp_prio_nr_rx" ]; then 778 echo "[fail] got $count MP_PRIO[s] RX expected $mp_prio_nr_rx" 779 ret=1 780 dump_stats=1 781 else 782 echo "[ ok ]" 783 fi 784 785 if [ "${dump_stats}" = 1 ]; then 786 echo Server ns stats 787 ip netns exec $ns1 nstat -as | grep MPTcp 788 echo Client ns stats 789 ip netns exec $ns2 nstat -as | grep MPTcp 790 fi 791} 792 793subflows_tests() 794{ 795 reset 796 run_tests $ns1 $ns2 10.0.1.1 797 chk_join_nr "no JOIN" "0" "0" "0" 798 799 # subflow limited by client 800 reset 801 ip netns exec $ns2 ./pm_nl_ctl add 10.0.3.2 flags subflow 802 run_tests $ns1 $ns2 10.0.1.1 803 chk_join_nr "single subflow, limited by client" 0 0 0 804 805 # subflow limited by server 806 reset 807 ip netns exec $ns2 ./pm_nl_ctl limits 0 1 808 ip netns exec $ns2 ./pm_nl_ctl add 10.0.3.2 flags subflow 809 run_tests $ns1 $ns2 10.0.1.1 810 chk_join_nr "single subflow, limited by server" 1 1 0 811 812 # subflow 813 reset 814 ip netns exec $ns1 ./pm_nl_ctl limits 0 1 815 ip netns exec $ns2 ./pm_nl_ctl limits 0 1 816 ip netns exec $ns2 ./pm_nl_ctl add 10.0.3.2 flags subflow 817 run_tests $ns1 $ns2 10.0.1.1 818 chk_join_nr "single subflow" 1 1 1 819 820 # multiple subflows 821 reset 822 ip netns exec $ns1 ./pm_nl_ctl limits 0 2 823 ip netns exec $ns2 ./pm_nl_ctl limits 0 2 824 ip netns exec $ns2 ./pm_nl_ctl add 10.0.3.2 flags subflow 825 ip netns exec $ns2 ./pm_nl_ctl add 10.0.2.2 flags subflow 826 run_tests $ns1 $ns2 10.0.1.1 827 chk_join_nr "multiple subflows" 2 2 2 828 829 # multiple subflows limited by serverf 830 reset 831 ip netns exec $ns1 ./pm_nl_ctl limits 0 1 832 ip netns exec $ns2 ./pm_nl_ctl limits 0 2 833 ip netns exec $ns2 ./pm_nl_ctl add 10.0.3.2 flags subflow 834 ip netns exec $ns2 ./pm_nl_ctl add 10.0.2.2 flags subflow 835 run_tests $ns1 $ns2 10.0.1.1 836 chk_join_nr "multiple subflows, limited by server" 2 2 1 837 838 # single subflow, dev 839 reset 840 ip netns exec $ns1 ./pm_nl_ctl limits 0 1 841 ip netns exec $ns2 ./pm_nl_ctl limits 0 1 842 ip netns exec $ns2 ./pm_nl_ctl add 10.0.3.2 flags subflow dev ns2eth3 843 run_tests $ns1 $ns2 10.0.1.1 844 chk_join_nr "single subflow, dev" 1 1 1 845} 846 847signal_address_tests() 848{ 849 # add_address, unused 850 reset 851 ip netns exec $ns1 ./pm_nl_ctl add 10.0.2.1 flags signal 852 run_tests $ns1 $ns2 10.0.1.1 853 chk_join_nr "unused signal address" 0 0 0 854 chk_add_nr 1 1 855 856 # accept and use add_addr 857 reset 858 ip netns exec $ns1 ./pm_nl_ctl limits 0 1 859 ip netns exec $ns2 ./pm_nl_ctl limits 1 1 860 ip netns exec $ns1 ./pm_nl_ctl add 10.0.2.1 flags signal 861 run_tests $ns1 $ns2 10.0.1.1 862 chk_join_nr "signal address" 1 1 1 863 chk_add_nr 1 1 864 865 # accept and use add_addr with an additional subflow 866 # note: signal address in server ns and local addresses in client ns must 867 # belong to different subnets or one of the listed local address could be 868 # used for 'add_addr' subflow 869 reset 870 ip netns exec $ns1 ./pm_nl_ctl add 10.0.2.1 flags signal 871 ip netns exec $ns1 ./pm_nl_ctl limits 0 2 872 ip netns exec $ns2 ./pm_nl_ctl limits 1 2 873 ip netns exec $ns2 ./pm_nl_ctl add 10.0.3.2 flags subflow 874 run_tests $ns1 $ns2 10.0.1.1 875 chk_join_nr "subflow and signal" 2 2 2 876 chk_add_nr 1 1 877 878 # accept and use add_addr with additional subflows 879 reset 880 ip netns exec $ns1 ./pm_nl_ctl limits 0 3 881 ip netns exec $ns1 ./pm_nl_ctl add 10.0.2.1 flags signal 882 ip netns exec $ns2 ./pm_nl_ctl limits 1 3 883 ip netns exec $ns2 ./pm_nl_ctl add 10.0.3.2 flags subflow 884 ip netns exec $ns2 ./pm_nl_ctl add 10.0.4.2 flags subflow 885 run_tests $ns1 $ns2 10.0.1.1 886 chk_join_nr "multiple subflows and signal" 3 3 3 887 chk_add_nr 1 1 888 889 # signal addresses 890 reset 891 ip netns exec $ns1 ./pm_nl_ctl limits 3 3 892 ip netns exec $ns1 ./pm_nl_ctl add 10.0.2.1 flags signal 893 ip netns exec $ns1 ./pm_nl_ctl add 10.0.3.1 flags signal 894 ip netns exec $ns1 ./pm_nl_ctl add 10.0.4.1 flags signal 895 ip netns exec $ns2 ./pm_nl_ctl limits 3 3 896 run_tests $ns1 $ns2 10.0.1.1 897 chk_join_nr "signal addresses" 3 3 3 898 chk_add_nr 3 3 899 900 # signal invalid addresses 901 reset 902 ip netns exec $ns1 ./pm_nl_ctl limits 3 3 903 ip netns exec $ns1 ./pm_nl_ctl add 10.0.12.1 flags signal 904 ip netns exec $ns1 ./pm_nl_ctl add 10.0.3.1 flags signal 905 ip netns exec $ns1 ./pm_nl_ctl add 10.0.14.1 flags signal 906 ip netns exec $ns2 ./pm_nl_ctl limits 3 3 907 run_tests $ns1 $ns2 10.0.1.1 908 chk_join_nr "signal invalid addresses" 1 1 1 909 chk_add_nr 3 3 910} 911 912link_failure_tests() 913{ 914 # accept and use add_addr with additional subflows and link loss 915 reset 916 ip netns exec $ns1 ./pm_nl_ctl limits 0 3 917 ip netns exec $ns1 ./pm_nl_ctl add 10.0.2.1 flags signal 918 ip netns exec $ns2 ./pm_nl_ctl limits 1 3 919 ip netns exec $ns2 ./pm_nl_ctl add 10.0.3.2 flags subflow 920 ip netns exec $ns2 ./pm_nl_ctl add 10.0.4.2 flags subflow 921 run_tests $ns1 $ns2 10.0.1.1 1 922 chk_join_nr "multiple flows, signal, link failure" 3 3 3 923 chk_add_nr 1 1 924} 925 926add_addr_timeout_tests() 927{ 928 # add_addr timeout 929 reset_with_add_addr_timeout 930 ip netns exec $ns1 ./pm_nl_ctl limits 0 1 931 ip netns exec $ns2 ./pm_nl_ctl limits 1 1 932 ip netns exec $ns1 ./pm_nl_ctl add 10.0.2.1 flags signal 933 run_tests $ns1 $ns2 10.0.1.1 0 0 0 slow 934 chk_join_nr "signal address, ADD_ADDR timeout" 1 1 1 935 chk_add_nr 4 0 936 937 # add_addr timeout IPv6 938 reset_with_add_addr_timeout 6 939 ip netns exec $ns1 ./pm_nl_ctl limits 0 1 940 ip netns exec $ns2 ./pm_nl_ctl limits 1 1 941 ip netns exec $ns1 ./pm_nl_ctl add dead:beef:2::1 flags signal 942 run_tests $ns1 $ns2 dead:beef:1::1 0 0 0 slow 943 chk_join_nr "signal address, ADD_ADDR6 timeout" 1 1 1 944 chk_add_nr 4 0 945 946 # signal addresses timeout 947 reset_with_add_addr_timeout 948 ip netns exec $ns1 ./pm_nl_ctl limits 2 2 949 ip netns exec $ns1 ./pm_nl_ctl add 10.0.2.1 flags signal 950 ip netns exec $ns1 ./pm_nl_ctl add 10.0.3.1 flags signal 951 ip netns exec $ns2 ./pm_nl_ctl limits 2 2 952 run_tests $ns1 $ns2 10.0.1.1 0 0 0 least 953 chk_join_nr "signal addresses, ADD_ADDR timeout" 2 2 2 954 chk_add_nr 8 0 955 956 # signal invalid addresses timeout 957 reset_with_add_addr_timeout 958 ip netns exec $ns1 ./pm_nl_ctl limits 2 2 959 ip netns exec $ns1 ./pm_nl_ctl add 10.0.12.1 flags signal 960 ip netns exec $ns1 ./pm_nl_ctl add 10.0.3.1 flags signal 961 ip netns exec $ns2 ./pm_nl_ctl limits 2 2 962 run_tests $ns1 $ns2 10.0.1.1 0 0 0 least 963 chk_join_nr "invalid address, ADD_ADDR timeout" 1 1 1 964 chk_add_nr 8 0 965} 966 967remove_tests() 968{ 969 # single subflow, remove 970 reset 971 ip netns exec $ns1 ./pm_nl_ctl limits 0 1 972 ip netns exec $ns2 ./pm_nl_ctl limits 0 1 973 ip netns exec $ns2 ./pm_nl_ctl add 10.0.3.2 flags subflow 974 run_tests $ns1 $ns2 10.0.1.1 0 0 -1 slow 975 chk_join_nr "remove single subflow" 1 1 1 976 chk_rm_nr 1 1 977 978 # multiple subflows, remove 979 reset 980 ip netns exec $ns1 ./pm_nl_ctl limits 0 2 981 ip netns exec $ns2 ./pm_nl_ctl limits 0 2 982 ip netns exec $ns2 ./pm_nl_ctl add 10.0.2.2 flags subflow 983 ip netns exec $ns2 ./pm_nl_ctl add 10.0.3.2 flags subflow 984 run_tests $ns1 $ns2 10.0.1.1 0 0 -2 slow 985 chk_join_nr "remove multiple subflows" 2 2 2 986 chk_rm_nr 2 2 987 988 # single address, remove 989 reset 990 ip netns exec $ns1 ./pm_nl_ctl limits 0 1 991 ip netns exec $ns1 ./pm_nl_ctl add 10.0.2.1 flags signal 992 ip netns exec $ns2 ./pm_nl_ctl limits 1 1 993 run_tests $ns1 $ns2 10.0.1.1 0 -1 0 slow 994 chk_join_nr "remove single address" 1 1 1 995 chk_add_nr 1 1 996 chk_rm_nr 1 1 invert 997 998 # subflow and signal, remove 999 reset 1000 ip netns exec $ns1 ./pm_nl_ctl limits 0 2 1001 ip netns exec $ns1 ./pm_nl_ctl add 10.0.2.1 flags signal 1002 ip netns exec $ns2 ./pm_nl_ctl limits 1 2 1003 ip netns exec $ns2 ./pm_nl_ctl add 10.0.3.2 flags subflow 1004 run_tests $ns1 $ns2 10.0.1.1 0 -1 -1 slow 1005 chk_join_nr "remove subflow and signal" 2 2 2 1006 chk_add_nr 1 1 1007 chk_rm_nr 1 1 1008 1009 # subflows and signal, remove 1010 reset 1011 ip netns exec $ns1 ./pm_nl_ctl limits 0 3 1012 ip netns exec $ns1 ./pm_nl_ctl add 10.0.2.1 flags signal 1013 ip netns exec $ns2 ./pm_nl_ctl limits 1 3 1014 ip netns exec $ns2 ./pm_nl_ctl add 10.0.3.2 flags subflow 1015 ip netns exec $ns2 ./pm_nl_ctl add 10.0.4.2 flags subflow 1016 run_tests $ns1 $ns2 10.0.1.1 0 -1 -2 slow 1017 chk_join_nr "remove subflows and signal" 3 3 3 1018 chk_add_nr 1 1 1019 chk_rm_nr 2 2 1020 1021 # addresses remove 1022 reset 1023 ip netns exec $ns1 ./pm_nl_ctl limits 3 3 1024 ip netns exec $ns1 ./pm_nl_ctl add 10.0.2.1 flags signal id 250 1025 ip netns exec $ns1 ./pm_nl_ctl add 10.0.3.1 flags signal 1026 ip netns exec $ns1 ./pm_nl_ctl add 10.0.4.1 flags signal 1027 ip netns exec $ns2 ./pm_nl_ctl limits 3 3 1028 run_tests $ns1 $ns2 10.0.1.1 0 -3 0 slow 1029 chk_join_nr "remove addresses" 3 3 3 1030 chk_add_nr 3 3 1031 chk_rm_nr 3 3 invert 1032 1033 # invalid addresses remove 1034 reset 1035 ip netns exec $ns1 ./pm_nl_ctl limits 3 3 1036 ip netns exec $ns1 ./pm_nl_ctl add 10.0.12.1 flags signal 1037 ip netns exec $ns1 ./pm_nl_ctl add 10.0.3.1 flags signal 1038 ip netns exec $ns1 ./pm_nl_ctl add 10.0.14.1 flags signal 1039 ip netns exec $ns2 ./pm_nl_ctl limits 3 3 1040 run_tests $ns1 $ns2 10.0.1.1 0 -3 0 slow 1041 chk_join_nr "remove invalid addresses" 1 1 1 1042 chk_add_nr 3 3 1043 chk_rm_nr 3 1 invert 1044 1045 # subflows and signal, flush 1046 reset 1047 ip netns exec $ns1 ./pm_nl_ctl limits 0 3 1048 ip netns exec $ns1 ./pm_nl_ctl add 10.0.2.1 flags signal 1049 ip netns exec $ns2 ./pm_nl_ctl limits 1 3 1050 ip netns exec $ns2 ./pm_nl_ctl add 10.0.3.2 flags subflow 1051 ip netns exec $ns2 ./pm_nl_ctl add 10.0.4.2 flags subflow 1052 run_tests $ns1 $ns2 10.0.1.1 0 -8 -8 slow 1053 chk_join_nr "flush subflows and signal" 3 3 3 1054 chk_add_nr 1 1 1055 chk_rm_nr 2 2 1056 1057 # subflows flush 1058 reset 1059 ip netns exec $ns1 ./pm_nl_ctl limits 3 3 1060 ip netns exec $ns2 ./pm_nl_ctl limits 3 3 1061 ip netns exec $ns2 ./pm_nl_ctl add 10.0.2.2 flags subflow id 150 1062 ip netns exec $ns2 ./pm_nl_ctl add 10.0.3.2 flags subflow 1063 ip netns exec $ns2 ./pm_nl_ctl add 10.0.4.2 flags subflow 1064 run_tests $ns1 $ns2 10.0.1.1 0 -8 -8 slow 1065 chk_join_nr "flush subflows" 3 3 3 1066 chk_rm_nr 3 3 1067 1068 # addresses flush 1069 reset 1070 ip netns exec $ns1 ./pm_nl_ctl limits 3 3 1071 ip netns exec $ns1 ./pm_nl_ctl add 10.0.2.1 flags signal id 250 1072 ip netns exec $ns1 ./pm_nl_ctl add 10.0.3.1 flags signal 1073 ip netns exec $ns1 ./pm_nl_ctl add 10.0.4.1 flags signal 1074 ip netns exec $ns2 ./pm_nl_ctl limits 3 3 1075 run_tests $ns1 $ns2 10.0.1.1 0 -8 -8 slow 1076 chk_join_nr "flush addresses" 3 3 3 1077 chk_add_nr 3 3 1078 chk_rm_nr 3 3 invert 1079 1080 # invalid addresses flush 1081 reset 1082 ip netns exec $ns1 ./pm_nl_ctl limits 3 3 1083 ip netns exec $ns1 ./pm_nl_ctl add 10.0.12.1 flags signal 1084 ip netns exec $ns1 ./pm_nl_ctl add 10.0.3.1 flags signal 1085 ip netns exec $ns1 ./pm_nl_ctl add 10.0.14.1 flags signal 1086 ip netns exec $ns2 ./pm_nl_ctl limits 3 3 1087 run_tests $ns1 $ns2 10.0.1.1 0 -8 0 slow 1088 chk_join_nr "flush invalid addresses" 1 1 1 1089 chk_add_nr 3 3 1090 chk_rm_nr 3 1 invert 1091 1092 # remove id 0 subflow 1093 reset 1094 ip netns exec $ns1 ./pm_nl_ctl limits 0 1 1095 ip netns exec $ns2 ./pm_nl_ctl limits 0 1 1096 ip netns exec $ns2 ./pm_nl_ctl add 10.0.3.2 flags subflow 1097 run_tests $ns1 $ns2 10.0.1.1 0 0 -9 slow 1098 chk_join_nr "remove id 0 subflow" 1 1 1 1099 chk_rm_nr 1 1 1100 1101 # remove id 0 address 1102 reset 1103 ip netns exec $ns1 ./pm_nl_ctl limits 0 1 1104 ip netns exec $ns1 ./pm_nl_ctl add 10.0.2.1 flags signal 1105 ip netns exec $ns2 ./pm_nl_ctl limits 1 1 1106 run_tests $ns1 $ns2 10.0.1.1 0 -9 0 slow 1107 chk_join_nr "remove id 0 address" 1 1 1 1108 chk_add_nr 1 1 1109 chk_rm_nr 1 1 invert 1110} 1111 1112add_tests() 1113{ 1114 # add single subflow 1115 reset 1116 ip netns exec $ns1 ./pm_nl_ctl limits 0 1 1117 ip netns exec $ns2 ./pm_nl_ctl limits 0 1 1118 run_tests $ns1 $ns2 10.0.1.1 0 0 1 slow 1119 chk_join_nr "add single subflow" 1 1 1 1120 1121 # add signal address 1122 reset 1123 ip netns exec $ns1 ./pm_nl_ctl limits 0 1 1124 ip netns exec $ns2 ./pm_nl_ctl limits 1 1 1125 run_tests $ns1 $ns2 10.0.1.1 0 1 0 slow 1126 chk_join_nr "add signal address" 1 1 1 1127 chk_add_nr 1 1 1128 1129 # add multiple subflows 1130 reset 1131 ip netns exec $ns1 ./pm_nl_ctl limits 0 2 1132 ip netns exec $ns2 ./pm_nl_ctl limits 0 2 1133 run_tests $ns1 $ns2 10.0.1.1 0 0 2 slow 1134 chk_join_nr "add multiple subflows" 2 2 2 1135 1136 # add multiple subflows IPv6 1137 reset 1138 ip netns exec $ns1 ./pm_nl_ctl limits 0 2 1139 ip netns exec $ns2 ./pm_nl_ctl limits 0 2 1140 run_tests $ns1 $ns2 dead:beef:1::1 0 0 2 slow 1141 chk_join_nr "add multiple subflows IPv6" 2 2 2 1142 1143 # add multiple addresses IPv6 1144 reset 1145 ip netns exec $ns1 ./pm_nl_ctl limits 0 2 1146 ip netns exec $ns2 ./pm_nl_ctl limits 2 2 1147 run_tests $ns1 $ns2 dead:beef:1::1 0 2 0 slow 1148 chk_join_nr "add multiple addresses IPv6" 2 2 2 1149 chk_add_nr 2 2 1150} 1151 1152ipv6_tests() 1153{ 1154 # subflow IPv6 1155 reset 1156 ip netns exec $ns1 ./pm_nl_ctl limits 0 1 1157 ip netns exec $ns2 ./pm_nl_ctl limits 0 1 1158 ip netns exec $ns2 ./pm_nl_ctl add dead:beef:3::2 flags subflow 1159 run_tests $ns1 $ns2 dead:beef:1::1 0 0 0 slow 1160 chk_join_nr "single subflow IPv6" 1 1 1 1161 1162 # add_address, unused IPv6 1163 reset 1164 ip netns exec $ns1 ./pm_nl_ctl add dead:beef:2::1 flags signal 1165 run_tests $ns1 $ns2 dead:beef:1::1 0 0 0 slow 1166 chk_join_nr "unused signal address IPv6" 0 0 0 1167 chk_add_nr 1 1 1168 1169 # signal address IPv6 1170 reset 1171 ip netns exec $ns1 ./pm_nl_ctl limits 0 1 1172 ip netns exec $ns1 ./pm_nl_ctl add dead:beef:2::1 flags signal 1173 ip netns exec $ns2 ./pm_nl_ctl limits 1 1 1174 run_tests $ns1 $ns2 dead:beef:1::1 0 0 0 slow 1175 chk_join_nr "single address IPv6" 1 1 1 1176 chk_add_nr 1 1 1177 1178 # single address IPv6, remove 1179 reset 1180 ip netns exec $ns1 ./pm_nl_ctl limits 0 1 1181 ip netns exec $ns1 ./pm_nl_ctl add dead:beef:2::1 flags signal 1182 ip netns exec $ns2 ./pm_nl_ctl limits 1 1 1183 run_tests $ns1 $ns2 dead:beef:1::1 0 -1 0 slow 1184 chk_join_nr "remove single address IPv6" 1 1 1 1185 chk_add_nr 1 1 1186 chk_rm_nr 1 1 invert 1187 1188 # subflow and signal IPv6, remove 1189 reset 1190 ip netns exec $ns1 ./pm_nl_ctl limits 0 2 1191 ip netns exec $ns1 ./pm_nl_ctl add dead:beef:2::1 flags signal 1192 ip netns exec $ns2 ./pm_nl_ctl limits 1 2 1193 ip netns exec $ns2 ./pm_nl_ctl add dead:beef:3::2 flags subflow 1194 run_tests $ns1 $ns2 dead:beef:1::1 0 -1 -1 slow 1195 chk_join_nr "remove subflow and signal IPv6" 2 2 2 1196 chk_add_nr 1 1 1197 chk_rm_nr 1 1 1198} 1199 1200v4mapped_tests() 1201{ 1202 # subflow IPv4-mapped to IPv4-mapped 1203 reset 1204 ip netns exec $ns1 ./pm_nl_ctl limits 0 1 1205 ip netns exec $ns2 ./pm_nl_ctl limits 0 1 1206 ip netns exec $ns2 ./pm_nl_ctl add "::ffff:10.0.3.2" flags subflow 1207 run_tests $ns1 $ns2 "::ffff:10.0.1.1" 1208 chk_join_nr "single subflow IPv4-mapped" 1 1 1 1209 1210 # signal address IPv4-mapped with IPv4-mapped sk 1211 reset 1212 ip netns exec $ns1 ./pm_nl_ctl limits 0 1 1213 ip netns exec $ns2 ./pm_nl_ctl limits 1 1 1214 ip netns exec $ns1 ./pm_nl_ctl add "::ffff:10.0.2.1" flags signal 1215 run_tests $ns1 $ns2 "::ffff:10.0.1.1" 1216 chk_join_nr "signal address IPv4-mapped" 1 1 1 1217 chk_add_nr 1 1 1218 1219 # subflow v4-map-v6 1220 reset 1221 ip netns exec $ns1 ./pm_nl_ctl limits 0 1 1222 ip netns exec $ns2 ./pm_nl_ctl limits 0 1 1223 ip netns exec $ns2 ./pm_nl_ctl add 10.0.3.2 flags subflow 1224 run_tests $ns1 $ns2 "::ffff:10.0.1.1" 1225 chk_join_nr "single subflow v4-map-v6" 1 1 1 1226 1227 # signal address v4-map-v6 1228 reset 1229 ip netns exec $ns1 ./pm_nl_ctl limits 0 1 1230 ip netns exec $ns2 ./pm_nl_ctl limits 1 1 1231 ip netns exec $ns1 ./pm_nl_ctl add 10.0.2.1 flags signal 1232 run_tests $ns1 $ns2 "::ffff:10.0.1.1" 1233 chk_join_nr "signal address v4-map-v6" 1 1 1 1234 chk_add_nr 1 1 1235 1236 # subflow v6-map-v4 1237 reset 1238 ip netns exec $ns1 ./pm_nl_ctl limits 0 1 1239 ip netns exec $ns2 ./pm_nl_ctl limits 0 1 1240 ip netns exec $ns2 ./pm_nl_ctl add "::ffff:10.0.3.2" flags subflow 1241 run_tests $ns1 $ns2 10.0.1.1 1242 chk_join_nr "single subflow v6-map-v4" 1 1 1 1243 1244 # signal address v6-map-v4 1245 reset 1246 ip netns exec $ns1 ./pm_nl_ctl limits 0 1 1247 ip netns exec $ns2 ./pm_nl_ctl limits 1 1 1248 ip netns exec $ns1 ./pm_nl_ctl add "::ffff:10.0.2.1" flags signal 1249 run_tests $ns1 $ns2 10.0.1.1 1250 chk_join_nr "signal address v6-map-v4" 1 1 1 1251 chk_add_nr 1 1 1252 1253 # no subflow IPv6 to v4 address 1254 reset 1255 ip netns exec $ns1 ./pm_nl_ctl limits 0 1 1256 ip netns exec $ns2 ./pm_nl_ctl limits 0 1 1257 ip netns exec $ns2 ./pm_nl_ctl add dead:beef:2::2 flags subflow 1258 run_tests $ns1 $ns2 10.0.1.1 1259 chk_join_nr "no JOIN with diff families v4-v6" 0 0 0 1260 1261 # no subflow IPv6 to v4 address even if v6 has a valid v4 at the end 1262 reset 1263 ip netns exec $ns1 ./pm_nl_ctl limits 0 1 1264 ip netns exec $ns2 ./pm_nl_ctl limits 0 1 1265 ip netns exec $ns2 ./pm_nl_ctl add dead:beef:2::10.0.3.2 flags subflow 1266 run_tests $ns1 $ns2 10.0.1.1 1267 chk_join_nr "no JOIN with diff families v4-v6-2" 0 0 0 1268 1269 # no subflow IPv4 to v6 address, no need to slow down too then 1270 reset 1271 ip netns exec $ns1 ./pm_nl_ctl limits 0 1 1272 ip netns exec $ns2 ./pm_nl_ctl limits 0 1 1273 ip netns exec $ns2 ./pm_nl_ctl add 10.0.3.2 flags subflow 1274 run_tests $ns1 $ns2 dead:beef:1::1 1275 chk_join_nr "no JOIN with diff families v6-v4" 0 0 0 1276} 1277 1278backup_tests() 1279{ 1280 # single subflow, backup 1281 reset 1282 ip netns exec $ns1 ./pm_nl_ctl limits 0 1 1283 ip netns exec $ns2 ./pm_nl_ctl limits 0 1 1284 ip netns exec $ns2 ./pm_nl_ctl add 10.0.3.2 flags subflow,backup 1285 run_tests $ns1 $ns2 10.0.1.1 0 0 0 slow nobackup 1286 chk_join_nr "single subflow, backup" 1 1 1 1287 chk_prio_nr 0 1 1288 1289 # single address, backup 1290 reset 1291 ip netns exec $ns1 ./pm_nl_ctl limits 0 1 1292 ip netns exec $ns1 ./pm_nl_ctl add 10.0.2.1 flags signal 1293 ip netns exec $ns2 ./pm_nl_ctl limits 1 1 1294 run_tests $ns1 $ns2 10.0.1.1 0 0 0 slow backup 1295 chk_join_nr "single address, backup" 1 1 1 1296 chk_add_nr 1 1 1297 chk_prio_nr 1 0 1298} 1299 1300add_addr_ports_tests() 1301{ 1302 # signal address with port 1303 reset 1304 ip netns exec $ns1 ./pm_nl_ctl limits 0 1 1305 ip netns exec $ns2 ./pm_nl_ctl limits 1 1 1306 ip netns exec $ns1 ./pm_nl_ctl add 10.0.2.1 flags signal port 10100 1307 run_tests $ns1 $ns2 10.0.1.1 1308 chk_join_nr "signal address with port" 1 1 1 1309 chk_add_nr 1 1 1 1310 1311 # subflow and signal with port 1312 reset 1313 ip netns exec $ns1 ./pm_nl_ctl add 10.0.2.1 flags signal port 10100 1314 ip netns exec $ns1 ./pm_nl_ctl limits 0 2 1315 ip netns exec $ns2 ./pm_nl_ctl limits 1 2 1316 ip netns exec $ns2 ./pm_nl_ctl add 10.0.3.2 flags subflow 1317 run_tests $ns1 $ns2 10.0.1.1 1318 chk_join_nr "subflow and signal with port" 2 2 2 1319 chk_add_nr 1 1 1 1320 1321 # single address with port, remove 1322 reset 1323 ip netns exec $ns1 ./pm_nl_ctl limits 0 1 1324 ip netns exec $ns1 ./pm_nl_ctl add 10.0.2.1 flags signal port 10100 1325 ip netns exec $ns2 ./pm_nl_ctl limits 1 1 1326 run_tests $ns1 $ns2 10.0.1.1 0 -1 0 slow 1327 chk_join_nr "remove single address with port" 1 1 1 1328 chk_add_nr 1 1 1 1329 chk_rm_nr 1 1 invert 1330 1331 # subflow and signal with port, remove 1332 reset 1333 ip netns exec $ns1 ./pm_nl_ctl limits 0 2 1334 ip netns exec $ns1 ./pm_nl_ctl add 10.0.2.1 flags signal port 10100 1335 ip netns exec $ns2 ./pm_nl_ctl limits 1 2 1336 ip netns exec $ns2 ./pm_nl_ctl add 10.0.3.2 flags subflow 1337 run_tests $ns1 $ns2 10.0.1.1 0 -1 -1 slow 1338 chk_join_nr "remove subflow and signal with port" 2 2 2 1339 chk_add_nr 1 1 1 1340 chk_rm_nr 1 1 1341 1342 # subflows and signal with port, flush 1343 reset 1344 ip netns exec $ns1 ./pm_nl_ctl limits 0 3 1345 ip netns exec $ns1 ./pm_nl_ctl add 10.0.2.1 flags signal port 10100 1346 ip netns exec $ns2 ./pm_nl_ctl limits 1 3 1347 ip netns exec $ns2 ./pm_nl_ctl add 10.0.3.2 flags subflow 1348 ip netns exec $ns2 ./pm_nl_ctl add 10.0.4.2 flags subflow 1349 run_tests $ns1 $ns2 10.0.1.1 0 -8 -8 slow 1350 chk_join_nr "flush subflows and signal with port" 3 3 3 1351 chk_add_nr 1 1 1352 chk_rm_nr 2 2 1353 1354 # multiple addresses with port 1355 reset 1356 ip netns exec $ns1 ./pm_nl_ctl limits 2 2 1357 ip netns exec $ns1 ./pm_nl_ctl add 10.0.2.1 flags signal port 10100 1358 ip netns exec $ns1 ./pm_nl_ctl add 10.0.3.1 flags signal port 10100 1359 ip netns exec $ns2 ./pm_nl_ctl limits 2 2 1360 run_tests $ns1 $ns2 10.0.1.1 1361 chk_join_nr "multiple addresses with port" 2 2 2 1362 chk_add_nr 2 2 2 1363 1364 # multiple addresses with ports 1365 reset 1366 ip netns exec $ns1 ./pm_nl_ctl limits 2 2 1367 ip netns exec $ns1 ./pm_nl_ctl add 10.0.2.1 flags signal port 10100 1368 ip netns exec $ns1 ./pm_nl_ctl add 10.0.3.1 flags signal port 10101 1369 ip netns exec $ns2 ./pm_nl_ctl limits 2 2 1370 run_tests $ns1 $ns2 10.0.1.1 1371 chk_join_nr "multiple addresses with ports" 2 2 2 1372 chk_add_nr 2 2 2 1373} 1374 1375syncookies_tests() 1376{ 1377 # single subflow, syncookies 1378 reset_with_cookies 1379 ip netns exec $ns1 ./pm_nl_ctl limits 0 1 1380 ip netns exec $ns2 ./pm_nl_ctl limits 0 1 1381 ip netns exec $ns2 ./pm_nl_ctl add 10.0.3.2 flags subflow 1382 run_tests $ns1 $ns2 10.0.1.1 1383 chk_join_nr "single subflow with syn cookies" 1 1 1 1384 1385 # multiple subflows with syn cookies 1386 reset_with_cookies 1387 ip netns exec $ns1 ./pm_nl_ctl limits 0 2 1388 ip netns exec $ns2 ./pm_nl_ctl limits 0 2 1389 ip netns exec $ns2 ./pm_nl_ctl add 10.0.3.2 flags subflow 1390 ip netns exec $ns2 ./pm_nl_ctl add 10.0.2.2 flags subflow 1391 run_tests $ns1 $ns2 10.0.1.1 1392 chk_join_nr "multiple subflows with syn cookies" 2 2 2 1393 1394 # multiple subflows limited by server 1395 reset_with_cookies 1396 ip netns exec $ns1 ./pm_nl_ctl limits 0 1 1397 ip netns exec $ns2 ./pm_nl_ctl limits 0 2 1398 ip netns exec $ns2 ./pm_nl_ctl add 10.0.3.2 flags subflow 1399 ip netns exec $ns2 ./pm_nl_ctl add 10.0.2.2 flags subflow 1400 run_tests $ns1 $ns2 10.0.1.1 1401 chk_join_nr "subflows limited by server w cookies" 2 2 1 1402 1403 # test signal address with cookies 1404 reset_with_cookies 1405 ip netns exec $ns1 ./pm_nl_ctl limits 0 1 1406 ip netns exec $ns2 ./pm_nl_ctl limits 1 1 1407 ip netns exec $ns1 ./pm_nl_ctl add 10.0.2.1 flags signal 1408 run_tests $ns1 $ns2 10.0.1.1 1409 chk_join_nr "signal address with syn cookies" 1 1 1 1410 chk_add_nr 1 1 1411 1412 # test cookie with subflow and signal 1413 reset_with_cookies 1414 ip netns exec $ns1 ./pm_nl_ctl add 10.0.2.1 flags signal 1415 ip netns exec $ns1 ./pm_nl_ctl limits 0 2 1416 ip netns exec $ns2 ./pm_nl_ctl limits 1 2 1417 ip netns exec $ns2 ./pm_nl_ctl add 10.0.3.2 flags subflow 1418 run_tests $ns1 $ns2 10.0.1.1 1419 chk_join_nr "subflow and signal w cookies" 2 2 2 1420 chk_add_nr 1 1 1421 1422 # accept and use add_addr with additional subflows 1423 reset_with_cookies 1424 ip netns exec $ns1 ./pm_nl_ctl limits 0 3 1425 ip netns exec $ns1 ./pm_nl_ctl add 10.0.2.1 flags signal 1426 ip netns exec $ns2 ./pm_nl_ctl limits 1 3 1427 ip netns exec $ns2 ./pm_nl_ctl add 10.0.3.2 flags subflow 1428 ip netns exec $ns2 ./pm_nl_ctl add 10.0.4.2 flags subflow 1429 run_tests $ns1 $ns2 10.0.1.1 1430 chk_join_nr "subflows and signal w. cookies" 3 3 3 1431 chk_add_nr 1 1 1432} 1433 1434checksum_tests() 1435{ 1436 # checksum test 0 0 1437 reset_with_checksum 0 0 1438 ip netns exec $ns1 ./pm_nl_ctl limits 0 1 1439 ip netns exec $ns2 ./pm_nl_ctl limits 0 1 1440 run_tests $ns1 $ns2 10.0.1.1 1441 chk_csum_nr "checksum test 0 0" 1442 1443 # checksum test 1 1 1444 reset_with_checksum 1 1 1445 ip netns exec $ns1 ./pm_nl_ctl limits 0 1 1446 ip netns exec $ns2 ./pm_nl_ctl limits 0 1 1447 run_tests $ns1 $ns2 10.0.1.1 1448 chk_csum_nr "checksum test 1 1" 1449 1450 # checksum test 0 1 1451 reset_with_checksum 0 1 1452 ip netns exec $ns1 ./pm_nl_ctl limits 0 1 1453 ip netns exec $ns2 ./pm_nl_ctl limits 0 1 1454 run_tests $ns1 $ns2 10.0.1.1 1455 chk_csum_nr "checksum test 0 1" 1456 1457 # checksum test 1 0 1458 reset_with_checksum 1 0 1459 ip netns exec $ns1 ./pm_nl_ctl limits 0 1 1460 ip netns exec $ns2 ./pm_nl_ctl limits 0 1 1461 run_tests $ns1 $ns2 10.0.1.1 1462 chk_csum_nr "checksum test 1 0" 1463} 1464 1465all_tests() 1466{ 1467 subflows_tests 1468 signal_address_tests 1469 link_failure_tests 1470 add_addr_timeout_tests 1471 remove_tests 1472 add_tests 1473 ipv6_tests 1474 v4mapped_tests 1475 backup_tests 1476 add_addr_ports_tests 1477 syncookies_tests 1478 checksum_tests 1479} 1480 1481usage() 1482{ 1483 echo "mptcp_join usage:" 1484 echo " -f subflows_tests" 1485 echo " -s signal_address_tests" 1486 echo " -l link_failure_tests" 1487 echo " -t add_addr_timeout_tests" 1488 echo " -r remove_tests" 1489 echo " -a add_tests" 1490 echo " -6 ipv6_tests" 1491 echo " -4 v4mapped_tests" 1492 echo " -b backup_tests" 1493 echo " -p add_addr_ports_tests" 1494 echo " -k syncookies_tests" 1495 echo " -S checksum_tests" 1496 echo " -c capture pcap files" 1497 echo " -C enable data checksum" 1498 echo " -h help" 1499} 1500 1501sin=$(mktemp) 1502sout=$(mktemp) 1503cin=$(mktemp) 1504cinsent=$(mktemp) 1505cout=$(mktemp) 1506init 1507make_file "$cin" "client" 1 1508make_file "$sin" "server" 1 1509trap cleanup EXIT 1510 1511for arg in "$@"; do 1512 # check for "capture/checksum" args before launching tests 1513 if [[ "${arg}" =~ ^"-"[0-9a-zA-Z]*"c"[0-9a-zA-Z]*$ ]]; then 1514 capture=1 1515 fi 1516 if [[ "${arg}" =~ ^"-"[0-9a-zA-Z]*"C"[0-9a-zA-Z]*$ ]]; then 1517 checksum=1 1518 fi 1519 1520 # exception for the capture/checksum options, the rest means: a part of the tests 1521 if [ "${arg}" != "-c" ] && [ "${arg}" != "-C" ]; then 1522 do_all_tests=0 1523 fi 1524done 1525 1526if [ $do_all_tests -eq 1 ]; then 1527 all_tests 1528 exit $ret 1529fi 1530 1531while getopts 'fsltra64bpkchCS' opt; do 1532 case $opt in 1533 f) 1534 subflows_tests 1535 ;; 1536 s) 1537 signal_address_tests 1538 ;; 1539 l) 1540 link_failure_tests 1541 ;; 1542 t) 1543 add_addr_timeout_tests 1544 ;; 1545 r) 1546 remove_tests 1547 ;; 1548 a) 1549 add_tests 1550 ;; 1551 6) 1552 ipv6_tests 1553 ;; 1554 4) 1555 v4mapped_tests 1556 ;; 1557 b) 1558 backup_tests 1559 ;; 1560 p) 1561 add_addr_ports_tests 1562 ;; 1563 k) 1564 syncookies_tests 1565 ;; 1566 S) 1567 checksum_tests 1568 ;; 1569 c) 1570 ;; 1571 C) 1572 ;; 1573 h | *) 1574 usage 1575 ;; 1576 esac 1577done 1578 1579exit $ret 1580