1#!/bin/bash 2# SPDX-License-Identifier: GPL-2.0 3 4# Double quotes to prevent globbing and word splitting is recommended in new 5# code but we accept it, especially because there were too many before having 6# address all other issues detected by shellcheck. 7#shellcheck disable=SC2086 8 9. "$(dirname "${0}")/mptcp_lib.sh" 10 11# ShellCheck incorrectly believes that most of the code here is unreachable 12# because it's invoked by variable name, see how the "tests" array is used 13#shellcheck disable=SC2317 14 15ret=0 16sin="" 17sinfail="" 18sout="" 19cin="" 20cinfail="" 21cinsent="" 22tmpfile="" 23cout="" 24capout="" 25ns1="" 26ns2="" 27ksft_skip=4 28iptables="iptables" 29ip6tables="ip6tables" 30timeout_poll=30 31timeout_test=$((timeout_poll * 2 + 1)) 32capture=0 33checksum=0 34ip_mptcp=0 35check_invert=0 36validate_checksum=0 37init=0 38 39declare -A all_tests 40declare -a only_tests_ids 41declare -a only_tests_names 42declare -A failed_tests 43TEST_COUNT=0 44TEST_NAME="" 45nr_blank=40 46 47export FAILING_LINKS="" 48 49# generated using "nfbpf_compile '(ip && (ip[54] & 0xf0) == 0x30) || 50# (ip6 && (ip6[74] & 0xf0) == 0x30)'" 51CBPF_MPTCP_SUBOPTION_ADD_ADDR="14, 52 48 0 0 0, 53 84 0 0 240, 54 21 0 3 64, 55 48 0 0 54, 56 84 0 0 240, 57 21 6 7 48, 58 48 0 0 0, 59 84 0 0 240, 60 21 0 4 96, 61 48 0 0 74, 62 84 0 0 240, 63 21 0 1 48, 64 6 0 0 65535, 65 6 0 0 0" 66 67init_partial() 68{ 69 capout=$(mktemp) 70 71 local rndh 72 rndh=$(mktemp -u XXXXXX) 73 74 ns1="ns1-$rndh" 75 ns2="ns2-$rndh" 76 77 local netns 78 for netns in "$ns1" "$ns2"; do 79 ip netns add $netns || exit $ksft_skip 80 ip -net $netns link set lo up 81 ip netns exec $netns sysctl -q net.mptcp.enabled=1 82 ip netns exec $netns sysctl -q net.mptcp.pm_type=0 2>/dev/null || true 83 ip netns exec $netns sysctl -q net.ipv4.conf.all.rp_filter=0 84 ip netns exec $netns sysctl -q net.ipv4.conf.default.rp_filter=0 85 if [ $checksum -eq 1 ]; then 86 ip netns exec $netns sysctl -q net.mptcp.checksum_enabled=1 87 fi 88 done 89 90 check_invert=0 91 validate_checksum=$checksum 92 FAILING_LINKS="" 93 94 # ns1 ns2 95 # ns1eth1 ns2eth1 96 # ns1eth2 ns2eth2 97 # ns1eth3 ns2eth3 98 # ns1eth4 ns2eth4 99 100 local i 101 for i in $(seq 1 4); do 102 ip link add ns1eth$i netns "$ns1" type veth peer name ns2eth$i netns "$ns2" 103 ip -net "$ns1" addr add 10.0.$i.1/24 dev ns1eth$i 104 ip -net "$ns1" addr add dead:beef:$i::1/64 dev ns1eth$i nodad 105 ip -net "$ns1" link set ns1eth$i up 106 107 ip -net "$ns2" addr add 10.0.$i.2/24 dev ns2eth$i 108 ip -net "$ns2" addr add dead:beef:$i::2/64 dev ns2eth$i nodad 109 ip -net "$ns2" link set ns2eth$i up 110 111 # let $ns2 reach any $ns1 address from any interface 112 ip -net "$ns2" route add default via 10.0.$i.1 dev ns2eth$i metric 10$i 113 ip -net "$ns2" route add default via dead:beef:$i::1 dev ns2eth$i metric 10$i 114 done 115} 116 117init_shapers() 118{ 119 local i 120 for i in $(seq 1 4); do 121 tc -n $ns1 qdisc add dev ns1eth$i root netem rate 20mbit delay 1 122 tc -n $ns2 qdisc add dev ns2eth$i root netem rate 20mbit delay 1 123 done 124} 125 126cleanup_partial() 127{ 128 rm -f "$capout" 129 130 local netns 131 for netns in "$ns1" "$ns2"; do 132 ip netns del $netns 133 rm -f /tmp/$netns.{nstat,out} 134 done 135} 136 137check_tools() 138{ 139 mptcp_lib_check_mptcp 140 mptcp_lib_check_kallsyms 141 142 if ! ip -Version &> /dev/null; then 143 echo "SKIP: Could not run test without ip tool" 144 exit $ksft_skip 145 fi 146 147 # Use the legacy version if available to support old kernel versions 148 if iptables-legacy -V &> /dev/null; then 149 iptables="iptables-legacy" 150 ip6tables="ip6tables-legacy" 151 elif ! iptables -V &> /dev/null; then 152 echo "SKIP: Could not run all tests without iptables tool" 153 exit $ksft_skip 154 elif ! ip6tables -V &> /dev/null; then 155 echo "SKIP: Could not run all tests without ip6tables tool" 156 exit $ksft_skip 157 fi 158} 159 160init() { 161 init=1 162 163 check_tools 164 165 sin=$(mktemp) 166 sout=$(mktemp) 167 cin=$(mktemp) 168 cinsent=$(mktemp) 169 cout=$(mktemp) 170 171 trap cleanup EXIT 172 173 make_file "$cin" "client" 1 174 make_file "$sin" "server" 1 175} 176 177cleanup() 178{ 179 rm -f "$cin" "$cout" "$sinfail" 180 rm -f "$sin" "$sout" "$cinsent" "$cinfail" 181 rm -f "$tmpfile" 182 cleanup_partial 183} 184 185# $1: msg 186print_title() 187{ 188 printf "%03u %-36s %s" "${TEST_COUNT}" "${TEST_NAME}" "${1}" 189} 190 191# [ $1: fail msg ] 192mark_as_skipped() 193{ 194 local msg="${1:-"Feature not supported"}" 195 196 mptcp_lib_fail_if_expected_feature "${msg}" 197 198 print_title "[ skip ] ${msg}" 199 printf "\n" 200} 201 202# $@: condition 203continue_if() 204{ 205 if ! "${@}"; then 206 mark_as_skipped 207 return 1 208 fi 209} 210 211skip_test() 212{ 213 if [ "${#only_tests_ids[@]}" -eq 0 ] && [ "${#only_tests_names[@]}" -eq 0 ]; then 214 return 1 215 fi 216 217 local i 218 for i in "${only_tests_ids[@]}"; do 219 if [ "${TEST_COUNT}" -eq "${i}" ]; then 220 return 1 221 fi 222 done 223 for i in "${only_tests_names[@]}"; do 224 if [ "${TEST_NAME}" = "${i}" ]; then 225 return 1 226 fi 227 done 228 229 return 0 230} 231 232# $1: test name 233reset() 234{ 235 TEST_NAME="${1}" 236 237 TEST_COUNT=$((TEST_COUNT+1)) 238 239 if skip_test; then 240 return 1 241 fi 242 243 if [ "${init}" != "1" ]; then 244 init 245 else 246 cleanup_partial 247 fi 248 249 init_partial 250 251 return 0 252} 253 254# $1: test name ; $2: counter to check 255reset_check_counter() 256{ 257 reset "${1}" || return 1 258 259 local counter="${2}" 260 261 if ! nstat -asz "${counter}" | grep -wq "${counter}"; then 262 mark_as_skipped "counter '${counter}' is not available" 263 return 1 264 fi 265} 266 267# $1: test name 268reset_with_cookies() 269{ 270 reset "${1}" || return 1 271 272 local netns 273 for netns in "$ns1" "$ns2"; do 274 ip netns exec $netns sysctl -q net.ipv4.tcp_syncookies=2 275 done 276} 277 278# $1: test name 279reset_with_add_addr_timeout() 280{ 281 local ip="${2:-4}" 282 local tables 283 284 reset "${1}" || return 1 285 286 tables="${iptables}" 287 if [ $ip -eq 6 ]; then 288 tables="${ip6tables}" 289 fi 290 291 ip netns exec $ns1 sysctl -q net.mptcp.add_addr_timeout=1 292 293 if ! ip netns exec $ns2 $tables -A OUTPUT -p tcp \ 294 -m tcp --tcp-option 30 \ 295 -m bpf --bytecode \ 296 "$CBPF_MPTCP_SUBOPTION_ADD_ADDR" \ 297 -j DROP; then 298 mark_as_skipped "unable to set the 'add addr' rule" 299 return 1 300 fi 301} 302 303# $1: test name 304reset_with_checksum() 305{ 306 local ns1_enable=$1 307 local ns2_enable=$2 308 309 reset "checksum test ${1} ${2}" || return 1 310 311 ip netns exec $ns1 sysctl -q net.mptcp.checksum_enabled=$ns1_enable 312 ip netns exec $ns2 sysctl -q net.mptcp.checksum_enabled=$ns2_enable 313 314 validate_checksum=1 315} 316 317reset_with_allow_join_id0() 318{ 319 local ns1_enable=$2 320 local ns2_enable=$3 321 322 reset "${1}" || return 1 323 324 ip netns exec $ns1 sysctl -q net.mptcp.allow_join_initial_addr_port=$ns1_enable 325 ip netns exec $ns2 sysctl -q net.mptcp.allow_join_initial_addr_port=$ns2_enable 326} 327 328# Modify TCP payload without corrupting the TCP packet 329# 330# This rule inverts a 8-bit word at byte offset 148 for the 2nd TCP ACK packets 331# carrying enough data. 332# Once it is done, the TCP Checksum field is updated so the packet is still 333# considered as valid at the TCP level. 334# Because the MPTCP checksum, covering the TCP options and data, has not been 335# updated, the modification will be detected and an MP_FAIL will be emitted: 336# what we want to validate here without corrupting "random" MPTCP options. 337# 338# To avoid having tc producing this pr_info() message for each TCP ACK packets 339# not carrying enough data: 340# 341# tc action pedit offset 162 out of bounds 342# 343# Netfilter is used to mark packets with enough data. 344setup_fail_rules() 345{ 346 check_invert=1 347 validate_checksum=1 348 local i="$1" 349 local ip="${2:-4}" 350 local tables 351 352 tables="${iptables}" 353 if [ $ip -eq 6 ]; then 354 tables="${ip6tables}" 355 fi 356 357 ip netns exec $ns2 $tables \ 358 -t mangle \ 359 -A OUTPUT \ 360 -o ns2eth$i \ 361 -p tcp \ 362 -m length --length 150:9999 \ 363 -m statistic --mode nth --packet 1 --every 99999 \ 364 -j MARK --set-mark 42 || return ${ksft_skip} 365 366 tc -n $ns2 qdisc add dev ns2eth$i clsact || return ${ksft_skip} 367 tc -n $ns2 filter add dev ns2eth$i egress \ 368 protocol ip prio 1000 \ 369 handle 42 fw \ 370 action pedit munge offset 148 u8 invert \ 371 pipe csum tcp \ 372 index 100 || return ${ksft_skip} 373} 374 375reset_with_fail() 376{ 377 reset_check_counter "${1}" "MPTcpExtInfiniteMapTx" || return 1 378 shift 379 380 ip netns exec $ns1 sysctl -q net.mptcp.checksum_enabled=1 381 ip netns exec $ns2 sysctl -q net.mptcp.checksum_enabled=1 382 383 local rc=0 384 setup_fail_rules "${@}" || rc=$? 385 386 if [ ${rc} -eq ${ksft_skip} ]; then 387 mark_as_skipped "unable to set the 'fail' rules" 388 return 1 389 fi 390} 391 392reset_with_tcp_filter() 393{ 394 reset "${1}" || return 1 395 shift 396 397 local ns="${!1}" 398 local src="${2}" 399 local target="${3}" 400 401 if ! ip netns exec "${ns}" ${iptables} \ 402 -A INPUT \ 403 -s "${src}" \ 404 -p tcp \ 405 -j "${target}"; then 406 mark_as_skipped "unable to set the filter rules" 407 return 1 408 fi 409} 410 411fail_test() 412{ 413 ret=1 414 failed_tests[${TEST_COUNT}]="${TEST_NAME}" 415} 416 417get_failed_tests_ids() 418{ 419 # sorted 420 local i 421 for i in "${!failed_tests[@]}"; do 422 echo "${i}" 423 done | sort -n 424} 425 426print_file_err() 427{ 428 ls -l "$1" 1>&2 429 echo "Trailing bytes are: " 430 tail -c 27 "$1" 431} 432 433check_transfer() 434{ 435 local in=$1 436 local out=$2 437 local what=$3 438 local bytes=$4 439 local i a b 440 441 local line 442 if [ -n "$bytes" ]; then 443 local out_size 444 # when truncating we must check the size explicitly 445 out_size=$(wc -c $out | awk '{print $1}') 446 if [ $out_size -ne $bytes ]; then 447 echo "[ FAIL ] $what output file has wrong size ($out_size, $bytes)" 448 fail_test 449 return 1 450 fi 451 452 # note: BusyBox's "cmp" command doesn't support --bytes 453 tmpfile=$(mktemp) 454 head --bytes="$bytes" "$in" > "$tmpfile" 455 mv "$tmpfile" "$in" 456 head --bytes="$bytes" "$out" > "$tmpfile" 457 mv "$tmpfile" "$out" 458 tmpfile="" 459 fi 460 cmp -l "$in" "$out" | while read -r i a b; do 461 local sum=$((0${a} + 0${b})) 462 if [ $check_invert -eq 0 ] || [ $sum -ne $((0xff)) ]; then 463 echo "[ FAIL ] $what does not match (in, out):" 464 print_file_err "$in" 465 print_file_err "$out" 466 fail_test 467 468 return 1 469 else 470 echo "$what has inverted byte at ${i}" 471 fi 472 done 473 474 return 0 475} 476 477do_ping() 478{ 479 local listener_ns="$1" 480 local connector_ns="$2" 481 local connect_addr="$3" 482 483 if ! ip netns exec ${connector_ns} ping -q -c 1 $connect_addr >/dev/null; then 484 echo "$listener_ns -> $connect_addr connectivity [ FAIL ]" 1>&2 485 fail_test 486 fi 487} 488 489link_failure() 490{ 491 local ns="$1" 492 493 if [ -z "$FAILING_LINKS" ]; then 494 l=$((RANDOM%4)) 495 FAILING_LINKS=$((l+1)) 496 fi 497 498 local l 499 for l in $FAILING_LINKS; do 500 local veth="ns1eth$l" 501 ip -net "$ns" link set "$veth" down 502 done 503} 504 505# $1: IP address 506is_v6() 507{ 508 [ -z "${1##*:*}" ] 509} 510 511# $1: ns, $2: port 512wait_local_port_listen() 513{ 514 local listener_ns="${1}" 515 local port="${2}" 516 517 local port_hex 518 port_hex="$(printf "%04X" "${port}")" 519 520 local i 521 for i in $(seq 10); do 522 ip netns exec "${listener_ns}" cat /proc/net/tcp* | \ 523 awk "BEGIN {rc=1} {if (\$2 ~ /:${port_hex}\$/ && \$4 ~ /0A/) {rc=0; exit}} END {exit rc}" && 524 break 525 sleep 0.1 526 done 527} 528 529# $1: ns ; $2: counter 530get_counter() 531{ 532 local ns="${1}" 533 local counter="${2}" 534 local count 535 536 count=$(ip netns exec ${ns} nstat -asz "${counter}" | awk 'NR==1 {next} {print $2}') 537 if [ -z "${count}" ]; then 538 mptcp_lib_fail_if_expected_feature "${counter} counter" 539 return 1 540 fi 541 542 echo "${count}" 543} 544 545rm_addr_count() 546{ 547 get_counter "${1}" "MPTcpExtRmAddr" 548} 549 550# $1: ns, $2: old rm_addr counter in $ns 551wait_rm_addr() 552{ 553 local ns="${1}" 554 local old_cnt="${2}" 555 local cnt 556 557 local i 558 for i in $(seq 10); do 559 cnt=$(rm_addr_count ${ns}) 560 [ "$cnt" = "${old_cnt}" ] || break 561 sleep 0.1 562 done 563} 564 565wait_mpj() 566{ 567 local ns="${1}" 568 local cnt old_cnt 569 570 old_cnt=$(get_counter ${ns} "MPTcpExtMPJoinAckRx") 571 572 local i 573 for i in $(seq 10); do 574 cnt=$(get_counter ${ns} "MPTcpExtMPJoinAckRx") 575 [ "$cnt" = "${old_cnt}" ] || break 576 sleep 0.1 577 done 578} 579 580kill_wait() 581{ 582 kill $1 > /dev/null 2>&1 583 wait $1 2>/dev/null 584} 585 586kill_tests_wait() 587{ 588 #shellcheck disable=SC2046 589 kill -SIGUSR1 $(ip netns pids $ns2) $(ip netns pids $ns1) 590 wait 591} 592 593pm_nl_set_limits() 594{ 595 local ns=$1 596 local addrs=$2 597 local subflows=$3 598 599 if [ $ip_mptcp -eq 1 ]; then 600 ip -n $ns mptcp limits set add_addr_accepted $addrs subflows $subflows 601 else 602 ip netns exec $ns ./pm_nl_ctl limits $addrs $subflows 603 fi 604} 605 606pm_nl_add_endpoint() 607{ 608 local ns=$1 609 local addr=$2 610 local flags _flags 611 local port _port 612 local dev _dev 613 local id _id 614 local nr=2 615 616 local p 617 for p in "${@}" 618 do 619 if [ $p = "flags" ]; then 620 eval _flags=\$"$nr" 621 [ -n "$_flags" ]; flags="flags $_flags" 622 fi 623 if [ $p = "dev" ]; then 624 eval _dev=\$"$nr" 625 [ -n "$_dev" ]; dev="dev $_dev" 626 fi 627 if [ $p = "id" ]; then 628 eval _id=\$"$nr" 629 [ -n "$_id" ]; id="id $_id" 630 fi 631 if [ $p = "port" ]; then 632 eval _port=\$"$nr" 633 [ -n "$_port" ]; port="port $_port" 634 fi 635 636 nr=$((nr + 1)) 637 done 638 639 if [ $ip_mptcp -eq 1 ]; then 640 ip -n $ns mptcp endpoint add $addr ${_flags//","/" "} $dev $id $port 641 else 642 ip netns exec $ns ./pm_nl_ctl add $addr $flags $dev $id $port 643 fi 644} 645 646pm_nl_del_endpoint() 647{ 648 local ns=$1 649 local id=$2 650 local addr=$3 651 652 if [ $ip_mptcp -eq 1 ]; then 653 [ $id -ne 0 ] && addr='' 654 ip -n $ns mptcp endpoint delete id $id $addr 655 else 656 ip netns exec $ns ./pm_nl_ctl del $id $addr 657 fi 658} 659 660pm_nl_flush_endpoint() 661{ 662 local ns=$1 663 664 if [ $ip_mptcp -eq 1 ]; then 665 ip -n $ns mptcp endpoint flush 666 else 667 ip netns exec $ns ./pm_nl_ctl flush 668 fi 669} 670 671pm_nl_show_endpoints() 672{ 673 local ns=$1 674 675 if [ $ip_mptcp -eq 1 ]; then 676 ip -n $ns mptcp endpoint show 677 else 678 ip netns exec $ns ./pm_nl_ctl dump 679 fi 680} 681 682pm_nl_change_endpoint() 683{ 684 local ns=$1 685 local id=$2 686 local flags=$3 687 688 if [ $ip_mptcp -eq 1 ]; then 689 ip -n $ns mptcp endpoint change id $id ${flags//","/" "} 690 else 691 ip netns exec $ns ./pm_nl_ctl set id $id flags $flags 692 fi 693} 694 695pm_nl_check_endpoint() 696{ 697 local line expected_line 698 local need_title=$1 699 local msg="$2" 700 local ns=$3 701 local addr=$4 702 local _flags="" 703 local flags 704 local _port 705 local port 706 local dev 707 local _id 708 local id 709 710 if [ "${need_title}" = 1 ]; then 711 printf "%03u %-36s %s" "${TEST_COUNT}" "${TEST_NAME}" "${msg}" 712 else 713 printf "%-${nr_blank}s %s" " " "${msg}" 714 fi 715 716 shift 4 717 while [ -n "$1" ]; do 718 if [ $1 = "flags" ]; then 719 _flags=$2 720 [ -n "$_flags" ]; flags="flags $_flags" 721 shift 722 elif [ $1 = "dev" ]; then 723 [ -n "$2" ]; dev="dev $1" 724 shift 725 elif [ $1 = "id" ]; then 726 _id=$2 727 [ -n "$_id" ]; id="id $_id" 728 shift 729 elif [ $1 = "port" ]; then 730 _port=$2 731 [ -n "$_port" ]; port=" port $_port" 732 shift 733 fi 734 735 shift 736 done 737 738 if [ -z "$id" ]; then 739 echo "[skip] bad test - missing endpoint id" 740 return 741 fi 742 743 if [ $ip_mptcp -eq 1 ]; then 744 # get line and trim trailing whitespace 745 line=$(ip -n $ns mptcp endpoint show $id) 746 line="${line% }" 747 # the dump order is: address id flags port dev 748 [ -n "$addr" ] && expected_line="$addr" 749 expected_line="$expected_line $id" 750 [ -n "$_flags" ] && expected_line="$expected_line ${_flags//","/" "}" 751 [ -n "$dev" ] && expected_line="$expected_line $dev" 752 [ -n "$port" ] && expected_line="$expected_line $port" 753 else 754 line=$(ip netns exec $ns ./pm_nl_ctl get $_id) 755 # the dump order is: id flags dev address port 756 expected_line="$id" 757 [ -n "$flags" ] && expected_line="$expected_line $flags" 758 [ -n "$dev" ] && expected_line="$expected_line $dev" 759 [ -n "$addr" ] && expected_line="$expected_line $addr" 760 [ -n "$_port" ] && expected_line="$expected_line $_port" 761 fi 762 if [ "$line" = "$expected_line" ]; then 763 echo "[ ok ]" 764 else 765 echo "[fail] expected '$expected_line' found '$line'" 766 fail_test 767 fi 768} 769 770do_transfer() 771{ 772 local listener_ns="$1" 773 local connector_ns="$2" 774 local cl_proto="$3" 775 local srv_proto="$4" 776 local connect_addr="$5" 777 local test_link_fail="$6" 778 local addr_nr_ns1="$7" 779 local addr_nr_ns2="$8" 780 local speed="$9" 781 local sflags="${10}" 782 783 local port=$((10000 + TEST_COUNT - 1)) 784 local cappid 785 local userspace_pm=0 786 local evts_ns1 787 local evts_ns1_pid 788 local evts_ns2 789 local evts_ns2_pid 790 791 :> "$cout" 792 :> "$sout" 793 :> "$capout" 794 795 if [ $capture -eq 1 ]; then 796 local capuser 797 if [ -z $SUDO_USER ] ; then 798 capuser="" 799 else 800 capuser="-Z $SUDO_USER" 801 fi 802 803 capfile=$(printf "mp_join-%02u-%s.pcap" "$TEST_COUNT" "${listener_ns}") 804 805 echo "Capturing traffic for test $TEST_COUNT into $capfile" 806 ip netns exec ${listener_ns} tcpdump -i any -s 65535 -B 32768 $capuser -w $capfile > "$capout" 2>&1 & 807 cappid=$! 808 809 sleep 1 810 fi 811 812 NSTAT_HISTORY=/tmp/${listener_ns}.nstat ip netns exec ${listener_ns} \ 813 nstat -n 814 NSTAT_HISTORY=/tmp/${connector_ns}.nstat ip netns exec ${connector_ns} \ 815 nstat -n 816 817 local extra_args 818 if [ $speed = "fast" ]; then 819 extra_args="-j" 820 elif [ $speed = "slow" ]; then 821 extra_args="-r 50" 822 elif [[ $speed = "speed_"* ]]; then 823 extra_args="-r ${speed:6}" 824 fi 825 826 if [[ "${addr_nr_ns1}" = "userspace_"* ]]; then 827 userspace_pm=1 828 addr_nr_ns1=${addr_nr_ns1:10} 829 fi 830 831 local flags="subflow" 832 local extra_cl_args="" 833 local extra_srv_args="" 834 local trunc_size="" 835 if [[ "${addr_nr_ns2}" = "fastclose_"* ]]; then 836 if [ ${test_link_fail} -le 1 ]; then 837 echo "fastclose tests need test_link_fail argument" 838 fail_test 839 return 1 840 fi 841 842 # disconnect 843 trunc_size=${test_link_fail} 844 local side=${addr_nr_ns2:10} 845 846 if [ ${side} = "client" ]; then 847 extra_cl_args="-f ${test_link_fail}" 848 extra_srv_args="-f -1" 849 elif [ ${side} = "server" ]; then 850 extra_srv_args="-f ${test_link_fail}" 851 extra_cl_args="-f -1" 852 else 853 echo "wrong/unknown fastclose spec ${side}" 854 fail_test 855 return 1 856 fi 857 addr_nr_ns2=0 858 elif [[ "${addr_nr_ns2}" = "userspace_"* ]]; then 859 userspace_pm=1 860 addr_nr_ns2=${addr_nr_ns2:10} 861 elif [[ "${addr_nr_ns2}" = "fullmesh_"* ]]; then 862 flags="${flags},fullmesh" 863 addr_nr_ns2=${addr_nr_ns2:9} 864 fi 865 866 if [ $userspace_pm -eq 1 ]; then 867 evts_ns1=$(mktemp) 868 evts_ns2=$(mktemp) 869 :> "$evts_ns1" 870 :> "$evts_ns2" 871 ip netns exec ${listener_ns} ./pm_nl_ctl events >> "$evts_ns1" 2>&1 & 872 evts_ns1_pid=$! 873 ip netns exec ${connector_ns} ./pm_nl_ctl events >> "$evts_ns2" 2>&1 & 874 evts_ns2_pid=$! 875 fi 876 877 local local_addr 878 if is_v6 "${connect_addr}"; then 879 local_addr="::" 880 else 881 local_addr="0.0.0.0" 882 fi 883 884 extra_srv_args="$extra_args $extra_srv_args" 885 if [ "$test_link_fail" -gt 1 ];then 886 timeout ${timeout_test} \ 887 ip netns exec ${listener_ns} \ 888 ./mptcp_connect -t ${timeout_poll} -l -p $port -s ${srv_proto} \ 889 $extra_srv_args ${local_addr} < "$sinfail" > "$sout" & 890 else 891 timeout ${timeout_test} \ 892 ip netns exec ${listener_ns} \ 893 ./mptcp_connect -t ${timeout_poll} -l -p $port -s ${srv_proto} \ 894 $extra_srv_args ${local_addr} < "$sin" > "$sout" & 895 fi 896 local spid=$! 897 898 wait_local_port_listen "${listener_ns}" "${port}" 899 900 extra_cl_args="$extra_args $extra_cl_args" 901 if [ "$test_link_fail" -eq 0 ];then 902 timeout ${timeout_test} \ 903 ip netns exec ${connector_ns} \ 904 ./mptcp_connect -t ${timeout_poll} -p $port -s ${cl_proto} \ 905 $extra_cl_args $connect_addr < "$cin" > "$cout" & 906 elif [ "$test_link_fail" -eq 1 ] || [ "$test_link_fail" -eq 2 ];then 907 ( cat "$cinfail" ; sleep 2; link_failure $listener_ns ; cat "$cinfail" ) | \ 908 tee "$cinsent" | \ 909 timeout ${timeout_test} \ 910 ip netns exec ${connector_ns} \ 911 ./mptcp_connect -t ${timeout_poll} -p $port -s ${cl_proto} \ 912 $extra_cl_args $connect_addr > "$cout" & 913 else 914 tee "$cinsent" < "$cinfail" | \ 915 timeout ${timeout_test} \ 916 ip netns exec ${connector_ns} \ 917 ./mptcp_connect -t ${timeout_poll} -p $port -s ${cl_proto} \ 918 $extra_cl_args $connect_addr > "$cout" & 919 fi 920 local cpid=$! 921 922 # let the mptcp subflow be established in background before 923 # do endpoint manipulation 924 if [ $addr_nr_ns1 != "0" ] || [ $addr_nr_ns2 != "0" ]; then 925 sleep 1 926 fi 927 928 if [ $addr_nr_ns1 -gt 0 ]; then 929 local counter=2 930 local add_nr_ns1=${addr_nr_ns1} 931 local id=10 932 local tk 933 while [ $add_nr_ns1 -gt 0 ]; do 934 local addr 935 if is_v6 "${connect_addr}"; then 936 addr="dead:beef:$counter::1" 937 else 938 addr="10.0.$counter.1" 939 fi 940 if [ $userspace_pm -eq 0 ]; then 941 pm_nl_add_endpoint $ns1 $addr flags signal 942 else 943 tk=$(sed -n 's/.*\(token:\)\([[:digit:]]*\).*$/\2/p;q' "$evts_ns1") 944 ip netns exec ${listener_ns} ./pm_nl_ctl ann $addr token $tk id $id 945 sleep 1 946 sp=$(grep "type:10" "$evts_ns1" | 947 sed -n 's/.*\(sport:\)\([[:digit:]]*\).*$/\2/p;q') 948 da=$(grep "type:10" "$evts_ns1" | 949 sed -n 's/.*\(daddr[46]:\)\([0-9a-f:.]*\).*$/\2/p;q') 950 echo "$da" | grep -q ":" && addr="::ffff:$addr" 951 dp=$(grep "type:10" "$evts_ns1" | 952 sed -n 's/.*\(dport:\)\([[:digit:]]*\).*$/\2/p;q') 953 ip netns exec ${listener_ns} ./pm_nl_ctl rem token $tk id $id 954 ip netns exec ${listener_ns} ./pm_nl_ctl dsf lip "$addr" \ 955 lport $sp rip $da rport $dp token $tk 956 fi 957 958 counter=$((counter + 1)) 959 add_nr_ns1=$((add_nr_ns1 - 1)) 960 id=$((id + 1)) 961 done 962 elif [ $addr_nr_ns1 -lt 0 ]; then 963 local rm_nr_ns1=$((-addr_nr_ns1)) 964 if [ $rm_nr_ns1 -lt 8 ]; then 965 local counter=0 966 local line 967 pm_nl_show_endpoints ${listener_ns} | while read -r line; do 968 # shellcheck disable=SC2206 # we do want to split per word 969 local arr=($line) 970 local nr=0 971 972 local i 973 for i in "${arr[@]}"; do 974 if [ $i = "id" ]; then 975 if [ $counter -eq $rm_nr_ns1 ]; then 976 break 977 fi 978 id=${arr[$nr+1]} 979 rm_addr=$(rm_addr_count ${connector_ns}) 980 pm_nl_del_endpoint ${listener_ns} $id 981 wait_rm_addr ${connector_ns} ${rm_addr} 982 counter=$((counter + 1)) 983 fi 984 nr=$((nr + 1)) 985 done 986 done 987 elif [ $rm_nr_ns1 -eq 8 ]; then 988 pm_nl_flush_endpoint ${listener_ns} 989 elif [ $rm_nr_ns1 -eq 9 ]; then 990 pm_nl_del_endpoint ${listener_ns} 0 ${connect_addr} 991 fi 992 fi 993 994 # if newly added endpoints must be deleted, give the background msk 995 # some time to created them 996 [ $addr_nr_ns1 -gt 0 ] && [ $addr_nr_ns2 -lt 0 ] && sleep 1 997 998 if [ $addr_nr_ns2 -gt 0 ]; then 999 local add_nr_ns2=${addr_nr_ns2} 1000 local counter=3 1001 local id=20 1002 local tk da dp sp 1003 while [ $add_nr_ns2 -gt 0 ]; do 1004 local addr 1005 if is_v6 "${connect_addr}"; then 1006 addr="dead:beef:$counter::2" 1007 else 1008 addr="10.0.$counter.2" 1009 fi 1010 if [ $userspace_pm -eq 0 ]; then 1011 pm_nl_add_endpoint $ns2 $addr flags $flags 1012 else 1013 tk=$(sed -n 's/.*\(token:\)\([[:digit:]]*\).*$/\2/p;q' "$evts_ns2") 1014 da=$(sed -n 's/.*\(daddr4:\)\([0-9.]*\).*$/\2/p;q' "$evts_ns2") 1015 dp=$(sed -n 's/.*\(dport:\)\([[:digit:]]*\).*$/\2/p;q' "$evts_ns2") 1016 ip netns exec ${connector_ns} ./pm_nl_ctl csf lip $addr lid $id \ 1017 rip $da rport $dp token $tk 1018 sleep 1 1019 sp=$(grep "type:10" "$evts_ns2" | 1020 sed -n 's/.*\(sport:\)\([[:digit:]]*\).*$/\2/p;q') 1021 ip netns exec ${connector_ns} ./pm_nl_ctl rem token $tk id $id 1022 ip netns exec ${connector_ns} ./pm_nl_ctl dsf lip $addr lport $sp \ 1023 rip $da rport $dp token $tk 1024 fi 1025 counter=$((counter + 1)) 1026 add_nr_ns2=$((add_nr_ns2 - 1)) 1027 id=$((id + 1)) 1028 done 1029 elif [ $addr_nr_ns2 -lt 0 ]; then 1030 local rm_nr_ns2=$((-addr_nr_ns2)) 1031 if [ $rm_nr_ns2 -lt 8 ]; then 1032 local counter=0 1033 local line 1034 pm_nl_show_endpoints ${connector_ns} | while read -r line; do 1035 # shellcheck disable=SC2206 # we do want to split per word 1036 local arr=($line) 1037 local nr=0 1038 1039 local i 1040 for i in "${arr[@]}"; do 1041 if [ $i = "id" ]; then 1042 if [ $counter -eq $rm_nr_ns2 ]; then 1043 break 1044 fi 1045 local id rm_addr 1046 # rm_addr are serialized, allow the previous one to 1047 # complete 1048 id=${arr[$nr+1]} 1049 rm_addr=$(rm_addr_count ${listener_ns}) 1050 pm_nl_del_endpoint ${connector_ns} $id 1051 wait_rm_addr ${listener_ns} ${rm_addr} 1052 counter=$((counter + 1)) 1053 fi 1054 nr=$((nr + 1)) 1055 done 1056 done 1057 elif [ $rm_nr_ns2 -eq 8 ]; then 1058 pm_nl_flush_endpoint ${connector_ns} 1059 elif [ $rm_nr_ns2 -eq 9 ]; then 1060 local addr 1061 if is_v6 "${connect_addr}"; then 1062 addr="dead:beef:1::2" 1063 else 1064 addr="10.0.1.2" 1065 fi 1066 pm_nl_del_endpoint ${connector_ns} 0 $addr 1067 fi 1068 fi 1069 1070 if [ -n "${sflags}" ]; then 1071 sleep 1 1072 1073 local netns 1074 for netns in "$ns1" "$ns2"; do 1075 local line 1076 pm_nl_show_endpoints $netns | while read -r line; do 1077 # shellcheck disable=SC2206 # we do want to split per word 1078 local arr=($line) 1079 local nr=0 1080 local id 1081 1082 local i 1083 for i in "${arr[@]}"; do 1084 if [ $i = "id" ]; then 1085 id=${arr[$nr+1]} 1086 fi 1087 nr=$((nr + 1)) 1088 done 1089 pm_nl_change_endpoint $netns $id $sflags 1090 done 1091 done 1092 fi 1093 1094 wait $cpid 1095 local retc=$? 1096 wait $spid 1097 local rets=$? 1098 1099 if [ $capture -eq 1 ]; then 1100 sleep 1 1101 kill $cappid 1102 fi 1103 1104 if [ $userspace_pm -eq 1 ]; then 1105 kill_wait $evts_ns1_pid 1106 kill_wait $evts_ns2_pid 1107 rm -rf $evts_ns1 $evts_ns2 1108 fi 1109 1110 NSTAT_HISTORY=/tmp/${listener_ns}.nstat ip netns exec ${listener_ns} \ 1111 nstat | grep Tcp > /tmp/${listener_ns}.out 1112 NSTAT_HISTORY=/tmp/${connector_ns}.nstat ip netns exec ${connector_ns} \ 1113 nstat | grep Tcp > /tmp/${connector_ns}.out 1114 1115 if [ ${rets} -ne 0 ] || [ ${retc} -ne 0 ]; then 1116 echo " client exit code $retc, server $rets" 1>&2 1117 echo -e "\nnetns ${listener_ns} socket stat for ${port}:" 1>&2 1118 ip netns exec ${listener_ns} ss -Menita 1>&2 -o "sport = :$port" 1119 cat /tmp/${listener_ns}.out 1120 echo -e "\nnetns ${connector_ns} socket stat for ${port}:" 1>&2 1121 ip netns exec ${connector_ns} ss -Menita 1>&2 -o "dport = :$port" 1122 cat /tmp/${connector_ns}.out 1123 1124 cat "$capout" 1125 fail_test 1126 return 1 1127 fi 1128 1129 if [ "$test_link_fail" -gt 1 ];then 1130 check_transfer $sinfail $cout "file received by client" $trunc_size 1131 else 1132 check_transfer $sin $cout "file received by client" $trunc_size 1133 fi 1134 retc=$? 1135 if [ "$test_link_fail" -eq 0 ];then 1136 check_transfer $cin $sout "file received by server" $trunc_size 1137 else 1138 check_transfer $cinsent $sout "file received by server" $trunc_size 1139 fi 1140 rets=$? 1141 1142 if [ $retc -eq 0 ] && [ $rets -eq 0 ];then 1143 cat "$capout" 1144 return 0 1145 fi 1146 1147 cat "$capout" 1148 return 1 1149} 1150 1151make_file() 1152{ 1153 local name=$1 1154 local who=$2 1155 local size=$3 1156 1157 dd if=/dev/urandom of="$name" bs=1024 count=$size 2> /dev/null 1158 echo -e "\nMPTCP_TEST_FILE_END_MARKER" >> "$name" 1159 1160 echo "Created $name (size $size KB) containing data sent by $who" 1161} 1162 1163run_tests() 1164{ 1165 local listener_ns="$1" 1166 local connector_ns="$2" 1167 local connect_addr="$3" 1168 local test_linkfail="${4:-0}" 1169 local addr_nr_ns1="${5:-0}" 1170 local addr_nr_ns2="${6:-0}" 1171 local speed="${7:-fast}" 1172 local sflags="${8:-""}" 1173 1174 local size 1175 1176 # The values above 2 are reused to make test files 1177 # with the given sizes (KB) 1178 if [ "$test_linkfail" -gt 2 ]; then 1179 size=$test_linkfail 1180 1181 if [ -z "$cinfail" ]; then 1182 cinfail=$(mktemp) 1183 fi 1184 make_file "$cinfail" "client" $size 1185 # create the input file for the failure test when 1186 # the first failure test run 1187 elif [ "$test_linkfail" -ne 0 ] && [ -z "$cinfail" ]; then 1188 # the client file must be considerably larger 1189 # of the maximum expected cwin value, or the 1190 # link utilization will be not predicable 1191 size=$((RANDOM%2)) 1192 size=$((size+1)) 1193 size=$((size*8192)) 1194 size=$((size + ( RANDOM % 8192) )) 1195 1196 cinfail=$(mktemp) 1197 make_file "$cinfail" "client" $size 1198 fi 1199 1200 if [ "$test_linkfail" -gt 2 ]; then 1201 size=$test_linkfail 1202 1203 if [ -z "$sinfail" ]; then 1204 sinfail=$(mktemp) 1205 fi 1206 make_file "$sinfail" "server" $size 1207 elif [ "$test_linkfail" -eq 2 ] && [ -z "$sinfail" ]; then 1208 size=$((RANDOM%16)) 1209 size=$((size+1)) 1210 size=$((size*2048)) 1211 1212 sinfail=$(mktemp) 1213 make_file "$sinfail" "server" $size 1214 fi 1215 1216 do_transfer ${listener_ns} ${connector_ns} MPTCP MPTCP ${connect_addr} \ 1217 ${test_linkfail} ${addr_nr_ns1} ${addr_nr_ns2} ${speed} ${sflags} 1218} 1219 1220dump_stats() 1221{ 1222 echo Server ns stats 1223 ip netns exec $ns1 nstat -as | grep Tcp 1224 echo Client ns stats 1225 ip netns exec $ns2 nstat -as | grep Tcp 1226} 1227 1228chk_csum_nr() 1229{ 1230 local csum_ns1=${1:-0} 1231 local csum_ns2=${2:-0} 1232 local count 1233 local dump_stats 1234 local extra_msg="" 1235 local allow_multi_errors_ns1=0 1236 local allow_multi_errors_ns2=0 1237 1238 if [[ "${csum_ns1}" = "+"* ]]; then 1239 allow_multi_errors_ns1=1 1240 csum_ns1=${csum_ns1:1} 1241 fi 1242 if [[ "${csum_ns2}" = "+"* ]]; then 1243 allow_multi_errors_ns2=1 1244 csum_ns2=${csum_ns2:1} 1245 fi 1246 1247 printf "%-${nr_blank}s %s" " " "sum" 1248 count=$(get_counter ${ns1} "MPTcpExtDataCsumErr") 1249 if [ "$count" != "$csum_ns1" ]; then 1250 extra_msg="$extra_msg ns1=$count" 1251 fi 1252 if [ -z "$count" ]; then 1253 echo -n "[skip]" 1254 elif { [ "$count" != $csum_ns1 ] && [ $allow_multi_errors_ns1 -eq 0 ]; } || 1255 { [ "$count" -lt $csum_ns1 ] && [ $allow_multi_errors_ns1 -eq 1 ]; }; then 1256 echo "[fail] got $count data checksum error[s] expected $csum_ns1" 1257 fail_test 1258 dump_stats=1 1259 else 1260 echo -n "[ ok ]" 1261 fi 1262 echo -n " - csum " 1263 count=$(get_counter ${ns2} "MPTcpExtDataCsumErr") 1264 if [ "$count" != "$csum_ns2" ]; then 1265 extra_msg="$extra_msg ns2=$count" 1266 fi 1267 if [ -z "$count" ]; then 1268 echo -n "[skip]" 1269 elif { [ "$count" != $csum_ns2 ] && [ $allow_multi_errors_ns2 -eq 0 ]; } || 1270 { [ "$count" -lt $csum_ns2 ] && [ $allow_multi_errors_ns2 -eq 1 ]; }; then 1271 echo "[fail] got $count data checksum error[s] expected $csum_ns2" 1272 fail_test 1273 dump_stats=1 1274 else 1275 echo -n "[ ok ]" 1276 fi 1277 [ "${dump_stats}" = 1 ] && dump_stats 1278 1279 echo "$extra_msg" 1280} 1281 1282chk_fail_nr() 1283{ 1284 local fail_tx=$1 1285 local fail_rx=$2 1286 local ns_invert=${3:-""} 1287 local count 1288 local dump_stats 1289 local ns_tx=$ns1 1290 local ns_rx=$ns2 1291 local extra_msg="" 1292 local allow_tx_lost=0 1293 local allow_rx_lost=0 1294 1295 if [[ $ns_invert = "invert" ]]; then 1296 ns_tx=$ns2 1297 ns_rx=$ns1 1298 extra_msg=" invert" 1299 fi 1300 1301 if [[ "${fail_tx}" = "-"* ]]; then 1302 allow_tx_lost=1 1303 fail_tx=${fail_tx:1} 1304 fi 1305 if [[ "${fail_rx}" = "-"* ]]; then 1306 allow_rx_lost=1 1307 fail_rx=${fail_rx:1} 1308 fi 1309 1310 printf "%-${nr_blank}s %s" " " "ftx" 1311 count=$(get_counter ${ns_tx} "MPTcpExtMPFailTx") 1312 if [ "$count" != "$fail_tx" ]; then 1313 extra_msg="$extra_msg,tx=$count" 1314 fi 1315 if [ -z "$count" ]; then 1316 echo -n "[skip]" 1317 elif { [ "$count" != "$fail_tx" ] && [ $allow_tx_lost -eq 0 ]; } || 1318 { [ "$count" -gt "$fail_tx" ] && [ $allow_tx_lost -eq 1 ]; }; then 1319 echo "[fail] got $count MP_FAIL[s] TX expected $fail_tx" 1320 fail_test 1321 dump_stats=1 1322 else 1323 echo -n "[ ok ]" 1324 fi 1325 1326 echo -n " - failrx" 1327 count=$(get_counter ${ns_rx} "MPTcpExtMPFailRx") 1328 if [ "$count" != "$fail_rx" ]; then 1329 extra_msg="$extra_msg,rx=$count" 1330 fi 1331 if [ -z "$count" ]; then 1332 echo -n "[skip]" 1333 elif { [ "$count" != "$fail_rx" ] && [ $allow_rx_lost -eq 0 ]; } || 1334 { [ "$count" -gt "$fail_rx" ] && [ $allow_rx_lost -eq 1 ]; }; then 1335 echo "[fail] got $count MP_FAIL[s] RX expected $fail_rx" 1336 fail_test 1337 dump_stats=1 1338 else 1339 echo -n "[ ok ]" 1340 fi 1341 1342 [ "${dump_stats}" = 1 ] && dump_stats 1343 1344 echo "$extra_msg" 1345} 1346 1347chk_fclose_nr() 1348{ 1349 local fclose_tx=$1 1350 local fclose_rx=$2 1351 local ns_invert=$3 1352 local count 1353 local dump_stats 1354 local ns_tx=$ns2 1355 local ns_rx=$ns1 1356 local extra_msg=" " 1357 1358 if [[ $ns_invert = "invert" ]]; then 1359 ns_tx=$ns1 1360 ns_rx=$ns2 1361 extra_msg=${extra_msg}"invert" 1362 fi 1363 1364 printf "%-${nr_blank}s %s" " " "ctx" 1365 count=$(get_counter ${ns_tx} "MPTcpExtMPFastcloseTx") 1366 if [ -z "$count" ]; then 1367 echo -n "[skip]" 1368 elif [ "$count" != "$fclose_tx" ]; then 1369 extra_msg="$extra_msg,tx=$count" 1370 echo "[fail] got $count MP_FASTCLOSE[s] TX expected $fclose_tx" 1371 fail_test 1372 dump_stats=1 1373 else 1374 echo -n "[ ok ]" 1375 fi 1376 1377 echo -n " - fclzrx" 1378 count=$(get_counter ${ns_rx} "MPTcpExtMPFastcloseRx") 1379 if [ -z "$count" ]; then 1380 echo -n "[skip]" 1381 elif [ "$count" != "$fclose_rx" ]; then 1382 extra_msg="$extra_msg,rx=$count" 1383 echo "[fail] got $count MP_FASTCLOSE[s] RX expected $fclose_rx" 1384 fail_test 1385 dump_stats=1 1386 else 1387 echo -n "[ ok ]" 1388 fi 1389 1390 [ "${dump_stats}" = 1 ] && dump_stats 1391 1392 echo "$extra_msg" 1393} 1394 1395chk_rst_nr() 1396{ 1397 local rst_tx=$1 1398 local rst_rx=$2 1399 local ns_invert=${3:-""} 1400 local count 1401 local dump_stats 1402 local ns_tx=$ns1 1403 local ns_rx=$ns2 1404 local extra_msg="" 1405 1406 if [[ $ns_invert = "invert" ]]; then 1407 ns_tx=$ns2 1408 ns_rx=$ns1 1409 extra_msg=" invert" 1410 fi 1411 1412 printf "%-${nr_blank}s %s" " " "rtx" 1413 count=$(get_counter ${ns_tx} "MPTcpExtMPRstTx") 1414 if [ -z "$count" ]; then 1415 echo -n "[skip]" 1416 # accept more rst than expected except if we don't expect any 1417 elif { [ $rst_tx -ne 0 ] && [ $count -lt $rst_tx ]; } || 1418 { [ $rst_tx -eq 0 ] && [ $count -ne 0 ]; }; then 1419 echo "[fail] got $count MP_RST[s] TX expected $rst_tx" 1420 fail_test 1421 dump_stats=1 1422 else 1423 echo -n "[ ok ]" 1424 fi 1425 1426 echo -n " - rstrx " 1427 count=$(get_counter ${ns_rx} "MPTcpExtMPRstRx") 1428 if [ -z "$count" ]; then 1429 echo -n "[skip]" 1430 # accept more rst than expected except if we don't expect any 1431 elif { [ $rst_rx -ne 0 ] && [ $count -lt $rst_rx ]; } || 1432 { [ $rst_rx -eq 0 ] && [ $count -ne 0 ]; }; then 1433 echo "[fail] got $count MP_RST[s] RX expected $rst_rx" 1434 fail_test 1435 dump_stats=1 1436 else 1437 echo -n "[ ok ]" 1438 fi 1439 1440 [ "${dump_stats}" = 1 ] && dump_stats 1441 1442 echo "$extra_msg" 1443} 1444 1445chk_infi_nr() 1446{ 1447 local infi_tx=$1 1448 local infi_rx=$2 1449 local count 1450 local dump_stats 1451 1452 printf "%-${nr_blank}s %s" " " "itx" 1453 count=$(get_counter ${ns2} "MPTcpExtInfiniteMapTx") 1454 if [ -z "$count" ]; then 1455 echo -n "[skip]" 1456 elif [ "$count" != "$infi_tx" ]; then 1457 echo "[fail] got $count infinite map[s] TX expected $infi_tx" 1458 fail_test 1459 dump_stats=1 1460 else 1461 echo -n "[ ok ]" 1462 fi 1463 1464 echo -n " - infirx" 1465 count=$(get_counter ${ns1} "MPTcpExtInfiniteMapRx") 1466 if [ -z "$count" ]; then 1467 echo "[skip]" 1468 elif [ "$count" != "$infi_rx" ]; then 1469 echo "[fail] got $count infinite map[s] RX expected $infi_rx" 1470 fail_test 1471 dump_stats=1 1472 else 1473 echo "[ ok ]" 1474 fi 1475 1476 [ "${dump_stats}" = 1 ] && dump_stats 1477} 1478 1479chk_join_nr() 1480{ 1481 local syn_nr=$1 1482 local syn_ack_nr=$2 1483 local ack_nr=$3 1484 local csum_ns1=${4:-0} 1485 local csum_ns2=${5:-0} 1486 local fail_nr=${6:-0} 1487 local rst_nr=${7:-0} 1488 local infi_nr=${8:-0} 1489 local corrupted_pkts=${9:-0} 1490 local count 1491 local dump_stats 1492 local with_cookie 1493 local title="${TEST_NAME}" 1494 1495 if [ "${corrupted_pkts}" -gt 0 ]; then 1496 title+=": ${corrupted_pkts} corrupted pkts" 1497 fi 1498 1499 printf "%03u %-36s %s" "${TEST_COUNT}" "${title}" "syn" 1500 count=$(get_counter ${ns1} "MPTcpExtMPJoinSynRx") 1501 if [ -z "$count" ]; then 1502 echo -n "[skip]" 1503 elif [ "$count" != "$syn_nr" ]; then 1504 echo "[fail] got $count JOIN[s] syn expected $syn_nr" 1505 fail_test 1506 dump_stats=1 1507 else 1508 echo -n "[ ok ]" 1509 fi 1510 1511 echo -n " - synack" 1512 with_cookie=$(ip netns exec $ns2 sysctl -n net.ipv4.tcp_syncookies) 1513 count=$(get_counter ${ns2} "MPTcpExtMPJoinSynAckRx") 1514 if [ -z "$count" ]; then 1515 echo -n "[skip]" 1516 elif [ "$count" != "$syn_ack_nr" ]; then 1517 # simult connections exceeding the limit with cookie enabled could go up to 1518 # synack validation as the conn limit can be enforced reliably only after 1519 # the subflow creation 1520 if [ "$with_cookie" = 2 ] && [ "$count" -gt "$syn_ack_nr" ] && [ "$count" -le "$syn_nr" ]; then 1521 echo -n "[ ok ]" 1522 else 1523 echo "[fail] got $count JOIN[s] synack expected $syn_ack_nr" 1524 fail_test 1525 dump_stats=1 1526 fi 1527 else 1528 echo -n "[ ok ]" 1529 fi 1530 1531 echo -n " - ack" 1532 count=$(get_counter ${ns1} "MPTcpExtMPJoinAckRx") 1533 if [ -z "$count" ]; then 1534 echo "[skip]" 1535 elif [ "$count" != "$ack_nr" ]; then 1536 echo "[fail] got $count JOIN[s] ack expected $ack_nr" 1537 fail_test 1538 dump_stats=1 1539 else 1540 echo "[ ok ]" 1541 fi 1542 [ "${dump_stats}" = 1 ] && dump_stats 1543 if [ $validate_checksum -eq 1 ]; then 1544 chk_csum_nr $csum_ns1 $csum_ns2 1545 chk_fail_nr $fail_nr $fail_nr 1546 chk_rst_nr $rst_nr $rst_nr 1547 chk_infi_nr $infi_nr $infi_nr 1548 fi 1549} 1550 1551# a negative value for 'stale_max' means no upper bound: 1552# for bidirectional transfer, if one peer sleep for a while 1553# - as these tests do - we can have a quite high number of 1554# stale/recover conversions, proportional to 1555# sleep duration/ MPTCP-level RTX interval. 1556chk_stale_nr() 1557{ 1558 local ns=$1 1559 local stale_min=$2 1560 local stale_max=$3 1561 local stale_delta=$4 1562 local dump_stats 1563 local stale_nr 1564 local recover_nr 1565 1566 printf "%-${nr_blank}s %-18s" " " "stale" 1567 1568 stale_nr=$(get_counter ${ns} "MPTcpExtSubflowStale") 1569 recover_nr=$(get_counter ${ns} "MPTcpExtSubflowRecover") 1570 if [ -z "$stale_nr" ] || [ -z "$recover_nr" ]; then 1571 echo "[skip]" 1572 elif [ $stale_nr -lt $stale_min ] || 1573 { [ $stale_max -gt 0 ] && [ $stale_nr -gt $stale_max ]; } || 1574 [ $((stale_nr - recover_nr)) -ne $stale_delta ]; then 1575 echo "[fail] got $stale_nr stale[s] $recover_nr recover[s], " \ 1576 " expected stale in range [$stale_min..$stale_max]," \ 1577 " stale-recover delta $stale_delta " 1578 fail_test 1579 dump_stats=1 1580 else 1581 echo "[ ok ]" 1582 fi 1583 1584 if [ "${dump_stats}" = 1 ]; then 1585 echo $ns stats 1586 ip netns exec $ns ip -s link show 1587 ip netns exec $ns nstat -as | grep MPTcp 1588 fi 1589} 1590 1591chk_add_nr() 1592{ 1593 local add_nr=$1 1594 local echo_nr=$2 1595 local port_nr=${3:-0} 1596 local syn_nr=${4:-$port_nr} 1597 local syn_ack_nr=${5:-$port_nr} 1598 local ack_nr=${6:-$port_nr} 1599 local mis_syn_nr=${7:-0} 1600 local mis_ack_nr=${8:-0} 1601 local count 1602 local dump_stats 1603 local timeout 1604 1605 timeout=$(ip netns exec $ns1 sysctl -n net.mptcp.add_addr_timeout) 1606 1607 printf "%-${nr_blank}s %s" " " "add" 1608 count=$(get_counter ${ns2} "MPTcpExtAddAddr") 1609 if [ -z "$count" ]; then 1610 echo -n "[skip]" 1611 # if the test configured a short timeout tolerate greater then expected 1612 # add addrs options, due to retransmissions 1613 elif [ "$count" != "$add_nr" ] && { [ "$timeout" -gt 1 ] || [ "$count" -lt "$add_nr" ]; }; then 1614 echo "[fail] got $count ADD_ADDR[s] expected $add_nr" 1615 fail_test 1616 dump_stats=1 1617 else 1618 echo -n "[ ok ]" 1619 fi 1620 1621 echo -n " - echo " 1622 count=$(get_counter ${ns1} "MPTcpExtEchoAdd") 1623 if [ -z "$count" ]; then 1624 echo -n "[skip]" 1625 elif [ "$count" != "$echo_nr" ]; then 1626 echo "[fail] got $count ADD_ADDR echo[s] expected $echo_nr" 1627 fail_test 1628 dump_stats=1 1629 else 1630 echo -n "[ ok ]" 1631 fi 1632 1633 if [ $port_nr -gt 0 ]; then 1634 echo -n " - pt " 1635 count=$(get_counter ${ns2} "MPTcpExtPortAdd") 1636 if [ -z "$count" ]; then 1637 echo "[skip]" 1638 elif [ "$count" != "$port_nr" ]; then 1639 echo "[fail] got $count ADD_ADDR[s] with a port-number expected $port_nr" 1640 fail_test 1641 dump_stats=1 1642 else 1643 echo "[ ok ]" 1644 fi 1645 1646 printf "%-${nr_blank}s %s" " " "syn" 1647 count=$(get_counter ${ns1} "MPTcpExtMPJoinPortSynRx") 1648 if [ -z "$count" ]; then 1649 echo -n "[skip]" 1650 elif [ "$count" != "$syn_nr" ]; then 1651 echo "[fail] got $count JOIN[s] syn with a different \ 1652 port-number expected $syn_nr" 1653 fail_test 1654 dump_stats=1 1655 else 1656 echo -n "[ ok ]" 1657 fi 1658 1659 echo -n " - synack" 1660 count=$(get_counter ${ns2} "MPTcpExtMPJoinPortSynAckRx") 1661 if [ -z "$count" ]; then 1662 echo -n "[skip]" 1663 elif [ "$count" != "$syn_ack_nr" ]; then 1664 echo "[fail] got $count JOIN[s] synack with a different \ 1665 port-number expected $syn_ack_nr" 1666 fail_test 1667 dump_stats=1 1668 else 1669 echo -n "[ ok ]" 1670 fi 1671 1672 echo -n " - ack" 1673 count=$(get_counter ${ns1} "MPTcpExtMPJoinPortAckRx") 1674 if [ -z "$count" ]; then 1675 echo "[skip]" 1676 elif [ "$count" != "$ack_nr" ]; then 1677 echo "[fail] got $count JOIN[s] ack with a different \ 1678 port-number expected $ack_nr" 1679 fail_test 1680 dump_stats=1 1681 else 1682 echo "[ ok ]" 1683 fi 1684 1685 printf "%-${nr_blank}s %s" " " "syn" 1686 count=$(get_counter ${ns1} "MPTcpExtMismatchPortSynRx") 1687 if [ -z "$count" ]; then 1688 echo -n "[skip]" 1689 elif [ "$count" != "$mis_syn_nr" ]; then 1690 echo "[fail] got $count JOIN[s] syn with a mismatched \ 1691 port-number expected $mis_syn_nr" 1692 fail_test 1693 dump_stats=1 1694 else 1695 echo -n "[ ok ]" 1696 fi 1697 1698 echo -n " - ack " 1699 count=$(get_counter ${ns1} "MPTcpExtMismatchPortAckRx") 1700 if [ -z "$count" ]; then 1701 echo "[skip]" 1702 elif [ "$count" != "$mis_ack_nr" ]; then 1703 echo "[fail] got $count JOIN[s] ack with a mismatched \ 1704 port-number expected $mis_ack_nr" 1705 fail_test 1706 dump_stats=1 1707 else 1708 echo "[ ok ]" 1709 fi 1710 else 1711 echo "" 1712 fi 1713 1714 [ "${dump_stats}" = 1 ] && dump_stats 1715} 1716 1717chk_rm_nr() 1718{ 1719 local rm_addr_nr=$1 1720 local rm_subflow_nr=$2 1721 local invert 1722 local simult 1723 local count 1724 local dump_stats 1725 local addr_ns=$ns1 1726 local subflow_ns=$ns2 1727 local extra_msg="" 1728 1729 shift 2 1730 while [ -n "$1" ]; do 1731 [ "$1" = "invert" ] && invert=true 1732 [ "$1" = "simult" ] && simult=true 1733 shift 1734 done 1735 1736 if [ -z $invert ]; then 1737 addr_ns=$ns1 1738 subflow_ns=$ns2 1739 elif [ $invert = "true" ]; then 1740 addr_ns=$ns2 1741 subflow_ns=$ns1 1742 extra_msg=" invert" 1743 fi 1744 1745 printf "%-${nr_blank}s %s" " " "rm " 1746 count=$(get_counter ${addr_ns} "MPTcpExtRmAddr") 1747 if [ -z "$count" ]; then 1748 echo -n "[skip]" 1749 elif [ "$count" != "$rm_addr_nr" ]; then 1750 echo "[fail] got $count RM_ADDR[s] expected $rm_addr_nr" 1751 fail_test 1752 dump_stats=1 1753 else 1754 echo -n "[ ok ]" 1755 fi 1756 1757 echo -n " - rmsf " 1758 count=$(get_counter ${subflow_ns} "MPTcpExtRmSubflow") 1759 if [ -z "$count" ]; then 1760 echo -n "[skip]" 1761 elif [ -n "$simult" ]; then 1762 local cnt suffix 1763 1764 cnt=$(get_counter ${addr_ns} "MPTcpExtRmSubflow") 1765 1766 # in case of simult flush, the subflow removal count on each side is 1767 # unreliable 1768 count=$((count + cnt)) 1769 [ "$count" != "$rm_subflow_nr" ] && suffix="$count in [$rm_subflow_nr:$((rm_subflow_nr*2))]" 1770 if [ $count -ge "$rm_subflow_nr" ] && \ 1771 [ "$count" -le "$((rm_subflow_nr *2 ))" ]; then 1772 echo -n "[ ok ] $suffix" 1773 else 1774 echo "[fail] got $count RM_SUBFLOW[s] expected in range [$rm_subflow_nr:$((rm_subflow_nr*2))]" 1775 fail_test 1776 dump_stats=1 1777 fi 1778 elif [ "$count" != "$rm_subflow_nr" ]; then 1779 echo "[fail] got $count RM_SUBFLOW[s] expected $rm_subflow_nr" 1780 fail_test 1781 dump_stats=1 1782 else 1783 echo -n "[ ok ]" 1784 fi 1785 1786 [ "${dump_stats}" = 1 ] && dump_stats 1787 1788 echo "$extra_msg" 1789} 1790 1791chk_prio_nr() 1792{ 1793 local mp_prio_nr_tx=$1 1794 local mp_prio_nr_rx=$2 1795 local count 1796 local dump_stats 1797 1798 printf "%-${nr_blank}s %s" " " "ptx" 1799 count=$(get_counter ${ns1} "MPTcpExtMPPrioTx") 1800 if [ -z "$count" ]; then 1801 echo -n "[skip]" 1802 elif [ "$count" != "$mp_prio_nr_tx" ]; then 1803 echo "[fail] got $count MP_PRIO[s] TX expected $mp_prio_nr_tx" 1804 fail_test 1805 dump_stats=1 1806 else 1807 echo -n "[ ok ]" 1808 fi 1809 1810 echo -n " - prx " 1811 count=$(get_counter ${ns1} "MPTcpExtMPPrioRx") 1812 if [ -z "$count" ]; then 1813 echo "[skip]" 1814 elif [ "$count" != "$mp_prio_nr_rx" ]; then 1815 echo "[fail] got $count MP_PRIO[s] RX expected $mp_prio_nr_rx" 1816 fail_test 1817 dump_stats=1 1818 else 1819 echo "[ ok ]" 1820 fi 1821 1822 [ "${dump_stats}" = 1 ] && dump_stats 1823} 1824 1825chk_subflow_nr() 1826{ 1827 local need_title="$1" 1828 local msg="$2" 1829 local subflow_nr=$3 1830 local cnt1 1831 local cnt2 1832 local dump_stats 1833 1834 if [ -n "${need_title}" ]; then 1835 printf "%03u %-36s %s" "${TEST_COUNT}" "${TEST_NAME}" "${msg}" 1836 else 1837 printf "%-${nr_blank}s %s" " " "${msg}" 1838 fi 1839 1840 cnt1=$(ss -N $ns1 -tOni | grep -c token) 1841 cnt2=$(ss -N $ns2 -tOni | grep -c token) 1842 if [ "$cnt1" != "$subflow_nr" ] || [ "$cnt2" != "$subflow_nr" ]; then 1843 echo "[fail] got $cnt1:$cnt2 subflows expected $subflow_nr" 1844 fail_test 1845 dump_stats=1 1846 else 1847 echo "[ ok ]" 1848 fi 1849 1850 if [ "${dump_stats}" = 1 ]; then 1851 ss -N $ns1 -tOni 1852 ss -N $ns1 -tOni | grep token 1853 ip -n $ns1 mptcp endpoint 1854 dump_stats 1855 fi 1856} 1857 1858chk_link_usage() 1859{ 1860 local ns=$1 1861 local link=$2 1862 local out=$3 1863 local expected_rate=$4 1864 1865 local tx_link tx_total 1866 tx_link=$(ip netns exec $ns cat /sys/class/net/$link/statistics/tx_bytes) 1867 tx_total=$(stat --format=%s $out) 1868 local tx_rate=$((tx_link * 100 / tx_total)) 1869 local tolerance=5 1870 1871 printf "%-${nr_blank}s %-18s" " " "link usage" 1872 if [ $tx_rate -lt $((expected_rate - tolerance)) ] || \ 1873 [ $tx_rate -gt $((expected_rate + tolerance)) ]; then 1874 echo "[fail] got $tx_rate% usage, expected $expected_rate%" 1875 fail_test 1876 else 1877 echo "[ ok ]" 1878 fi 1879} 1880 1881wait_attempt_fail() 1882{ 1883 local timeout_ms=$((timeout_poll * 1000)) 1884 local time=0 1885 local ns=$1 1886 1887 while [ $time -lt $timeout_ms ]; do 1888 local cnt 1889 1890 cnt=$(get_counter ${ns} "TcpAttemptFails") 1891 1892 [ "$cnt" = 1 ] && return 1 1893 time=$((time + 100)) 1894 sleep 0.1 1895 done 1896 return 1 1897} 1898 1899set_userspace_pm() 1900{ 1901 local ns=$1 1902 1903 ip netns exec $ns sysctl -q net.mptcp.pm_type=1 1904} 1905 1906subflows_tests() 1907{ 1908 if reset "no JOIN"; then 1909 run_tests $ns1 $ns2 10.0.1.1 1910 chk_join_nr 0 0 0 1911 fi 1912 1913 # subflow limited by client 1914 if reset "single subflow, limited by client"; then 1915 pm_nl_set_limits $ns1 0 0 1916 pm_nl_set_limits $ns2 0 0 1917 pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow 1918 run_tests $ns1 $ns2 10.0.1.1 1919 chk_join_nr 0 0 0 1920 fi 1921 1922 # subflow limited by server 1923 if reset "single subflow, limited by server"; then 1924 pm_nl_set_limits $ns1 0 0 1925 pm_nl_set_limits $ns2 0 1 1926 pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow 1927 run_tests $ns1 $ns2 10.0.1.1 1928 chk_join_nr 1 1 0 1929 fi 1930 1931 # subflow 1932 if reset "single subflow"; then 1933 pm_nl_set_limits $ns1 0 1 1934 pm_nl_set_limits $ns2 0 1 1935 pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow 1936 run_tests $ns1 $ns2 10.0.1.1 1937 chk_join_nr 1 1 1 1938 fi 1939 1940 # multiple subflows 1941 if reset "multiple subflows"; then 1942 pm_nl_set_limits $ns1 0 2 1943 pm_nl_set_limits $ns2 0 2 1944 pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow 1945 pm_nl_add_endpoint $ns2 10.0.2.2 flags subflow 1946 run_tests $ns1 $ns2 10.0.1.1 1947 chk_join_nr 2 2 2 1948 fi 1949 1950 # multiple subflows limited by server 1951 if reset "multiple subflows, limited by server"; then 1952 pm_nl_set_limits $ns1 0 1 1953 pm_nl_set_limits $ns2 0 2 1954 pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow 1955 pm_nl_add_endpoint $ns2 10.0.2.2 flags subflow 1956 run_tests $ns1 $ns2 10.0.1.1 1957 chk_join_nr 2 2 1 1958 fi 1959 1960 # single subflow, dev 1961 if reset "single subflow, dev"; then 1962 pm_nl_set_limits $ns1 0 1 1963 pm_nl_set_limits $ns2 0 1 1964 pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow dev ns2eth3 1965 run_tests $ns1 $ns2 10.0.1.1 1966 chk_join_nr 1 1 1 1967 fi 1968} 1969 1970subflows_error_tests() 1971{ 1972 # If a single subflow is configured, and matches the MPC src 1973 # address, no additional subflow should be created 1974 if reset "no MPC reuse with single endpoint"; then 1975 pm_nl_set_limits $ns1 0 1 1976 pm_nl_set_limits $ns2 0 1 1977 pm_nl_add_endpoint $ns2 10.0.1.2 flags subflow 1978 run_tests $ns1 $ns2 10.0.1.1 0 0 0 slow 1979 chk_join_nr 0 0 0 1980 fi 1981 1982 # multiple subflows, with subflow creation error 1983 if reset_with_tcp_filter "multi subflows, with failing subflow" ns1 10.0.3.2 REJECT && 1984 continue_if mptcp_lib_kallsyms_has "mptcp_pm_subflow_check_next$"; then 1985 pm_nl_set_limits $ns1 0 2 1986 pm_nl_set_limits $ns2 0 2 1987 pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow 1988 pm_nl_add_endpoint $ns2 10.0.2.2 flags subflow 1989 run_tests $ns1 $ns2 10.0.1.1 0 0 0 slow 1990 chk_join_nr 1 1 1 1991 fi 1992 1993 # multiple subflows, with subflow timeout on MPJ 1994 if reset_with_tcp_filter "multi subflows, with subflow timeout" ns1 10.0.3.2 DROP && 1995 continue_if mptcp_lib_kallsyms_has "mptcp_pm_subflow_check_next$"; then 1996 pm_nl_set_limits $ns1 0 2 1997 pm_nl_set_limits $ns2 0 2 1998 pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow 1999 pm_nl_add_endpoint $ns2 10.0.2.2 flags subflow 2000 run_tests $ns1 $ns2 10.0.1.1 0 0 0 slow 2001 chk_join_nr 1 1 1 2002 fi 2003 2004 # multiple subflows, check that the endpoint corresponding to 2005 # closed subflow (due to reset) is not reused if additional 2006 # subflows are added later 2007 if reset_with_tcp_filter "multi subflows, fair usage on close" ns1 10.0.3.2 REJECT && 2008 continue_if mptcp_lib_kallsyms_has "mptcp_pm_subflow_check_next$"; then 2009 pm_nl_set_limits $ns1 0 1 2010 pm_nl_set_limits $ns2 0 1 2011 pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow 2012 run_tests $ns1 $ns2 10.0.1.1 0 0 0 slow & 2013 2014 # mpj subflow will be in TW after the reset 2015 wait_attempt_fail $ns2 2016 pm_nl_add_endpoint $ns2 10.0.2.2 flags subflow 2017 wait 2018 2019 # additional subflow could be created only if the PM select 2020 # the later endpoint, skipping the already used one 2021 chk_join_nr 1 1 1 2022 fi 2023} 2024 2025signal_address_tests() 2026{ 2027 # add_address, unused 2028 if reset "unused signal address"; then 2029 pm_nl_add_endpoint $ns1 10.0.2.1 flags signal 2030 run_tests $ns1 $ns2 10.0.1.1 2031 chk_join_nr 0 0 0 2032 chk_add_nr 1 1 2033 fi 2034 2035 # accept and use add_addr 2036 if reset "signal address"; then 2037 pm_nl_set_limits $ns1 0 1 2038 pm_nl_set_limits $ns2 1 1 2039 pm_nl_add_endpoint $ns1 10.0.2.1 flags signal 2040 run_tests $ns1 $ns2 10.0.1.1 2041 chk_join_nr 1 1 1 2042 chk_add_nr 1 1 2043 fi 2044 2045 # accept and use add_addr with an additional subflow 2046 # note: signal address in server ns and local addresses in client ns must 2047 # belong to different subnets or one of the listed local address could be 2048 # used for 'add_addr' subflow 2049 if reset "subflow and signal"; then 2050 pm_nl_add_endpoint $ns1 10.0.2.1 flags signal 2051 pm_nl_set_limits $ns1 0 2 2052 pm_nl_set_limits $ns2 1 2 2053 pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow 2054 run_tests $ns1 $ns2 10.0.1.1 2055 chk_join_nr 2 2 2 2056 chk_add_nr 1 1 2057 fi 2058 2059 # accept and use add_addr with additional subflows 2060 if reset "multiple subflows and signal"; then 2061 pm_nl_set_limits $ns1 0 3 2062 pm_nl_add_endpoint $ns1 10.0.2.1 flags signal 2063 pm_nl_set_limits $ns2 1 3 2064 pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow 2065 pm_nl_add_endpoint $ns2 10.0.4.2 flags subflow 2066 run_tests $ns1 $ns2 10.0.1.1 2067 chk_join_nr 3 3 3 2068 chk_add_nr 1 1 2069 fi 2070 2071 # signal addresses 2072 if reset "signal addresses"; then 2073 pm_nl_set_limits $ns1 3 3 2074 pm_nl_add_endpoint $ns1 10.0.2.1 flags signal 2075 pm_nl_add_endpoint $ns1 10.0.3.1 flags signal 2076 pm_nl_add_endpoint $ns1 10.0.4.1 flags signal 2077 pm_nl_set_limits $ns2 3 3 2078 run_tests $ns1 $ns2 10.0.1.1 2079 chk_join_nr 3 3 3 2080 chk_add_nr 3 3 2081 fi 2082 2083 # signal invalid addresses 2084 if reset "signal invalid addresses"; then 2085 pm_nl_set_limits $ns1 3 3 2086 pm_nl_add_endpoint $ns1 10.0.12.1 flags signal 2087 pm_nl_add_endpoint $ns1 10.0.3.1 flags signal 2088 pm_nl_add_endpoint $ns1 10.0.14.1 flags signal 2089 pm_nl_set_limits $ns2 3 3 2090 run_tests $ns1 $ns2 10.0.1.1 2091 chk_join_nr 1 1 1 2092 chk_add_nr 3 3 2093 fi 2094 2095 # signal addresses race test 2096 if reset "signal addresses race test"; then 2097 pm_nl_set_limits $ns1 4 4 2098 pm_nl_set_limits $ns2 4 4 2099 pm_nl_add_endpoint $ns1 10.0.1.1 flags signal 2100 pm_nl_add_endpoint $ns1 10.0.2.1 flags signal 2101 pm_nl_add_endpoint $ns1 10.0.3.1 flags signal 2102 pm_nl_add_endpoint $ns1 10.0.4.1 flags signal 2103 pm_nl_add_endpoint $ns2 10.0.1.2 flags signal 2104 pm_nl_add_endpoint $ns2 10.0.2.2 flags signal 2105 pm_nl_add_endpoint $ns2 10.0.3.2 flags signal 2106 pm_nl_add_endpoint $ns2 10.0.4.2 flags signal 2107 2108 # the peer could possibly miss some addr notification, allow retransmission 2109 ip netns exec $ns1 sysctl -q net.mptcp.add_addr_timeout=1 2110 run_tests $ns1 $ns2 10.0.1.1 0 0 0 slow 2111 2112 # It is not directly linked to the commit introducing this 2113 # symbol but for the parent one which is linked anyway. 2114 if ! mptcp_lib_kallsyms_has "mptcp_pm_subflow_check_next$"; then 2115 chk_join_nr 3 3 2 2116 chk_add_nr 4 4 2117 else 2118 chk_join_nr 3 3 3 2119 # the server will not signal the address terminating 2120 # the MPC subflow 2121 chk_add_nr 3 3 2122 fi 2123 fi 2124} 2125 2126link_failure_tests() 2127{ 2128 # accept and use add_addr with additional subflows and link loss 2129 if reset "multiple flows, signal, link failure"; then 2130 # without any b/w limit each veth could spool the packets and get 2131 # them acked at xmit time, so that the corresponding subflow will 2132 # have almost always no outstanding pkts, the scheduler will pick 2133 # always the first subflow and we will have hard time testing 2134 # active backup and link switch-over. 2135 # Let's set some arbitrary (low) virtual link limits. 2136 init_shapers 2137 pm_nl_set_limits $ns1 0 3 2138 pm_nl_add_endpoint $ns1 10.0.2.1 dev ns1eth2 flags signal 2139 pm_nl_set_limits $ns2 1 3 2140 pm_nl_add_endpoint $ns2 10.0.3.2 dev ns2eth3 flags subflow 2141 pm_nl_add_endpoint $ns2 10.0.4.2 dev ns2eth4 flags subflow 2142 run_tests $ns1 $ns2 10.0.1.1 1 2143 chk_join_nr 3 3 3 2144 chk_add_nr 1 1 2145 chk_stale_nr $ns2 1 5 1 2146 fi 2147 2148 # accept and use add_addr with additional subflows and link loss 2149 # for bidirectional transfer 2150 if reset "multi flows, signal, bidi, link fail"; then 2151 init_shapers 2152 pm_nl_set_limits $ns1 0 3 2153 pm_nl_add_endpoint $ns1 10.0.2.1 dev ns1eth2 flags signal 2154 pm_nl_set_limits $ns2 1 3 2155 pm_nl_add_endpoint $ns2 10.0.3.2 dev ns2eth3 flags subflow 2156 pm_nl_add_endpoint $ns2 10.0.4.2 dev ns2eth4 flags subflow 2157 run_tests $ns1 $ns2 10.0.1.1 2 2158 chk_join_nr 3 3 3 2159 chk_add_nr 1 1 2160 chk_stale_nr $ns2 1 -1 1 2161 fi 2162 2163 # 2 subflows plus 1 backup subflow with a lossy link, backup 2164 # will never be used 2165 if reset "backup subflow unused, link failure"; then 2166 init_shapers 2167 pm_nl_set_limits $ns1 0 2 2168 pm_nl_add_endpoint $ns1 10.0.2.1 dev ns1eth2 flags signal 2169 pm_nl_set_limits $ns2 1 2 2170 pm_nl_add_endpoint $ns2 10.0.3.2 dev ns2eth3 flags subflow,backup 2171 FAILING_LINKS="1" \ 2172 run_tests $ns1 $ns2 10.0.1.1 1 2173 chk_join_nr 2 2 2 2174 chk_add_nr 1 1 2175 chk_link_usage $ns2 ns2eth3 $cinsent 0 2176 fi 2177 2178 # 2 lossy links after half transfer, backup will get half of 2179 # the traffic 2180 if reset "backup flow used, multi links fail"; then 2181 init_shapers 2182 pm_nl_set_limits $ns1 0 2 2183 pm_nl_add_endpoint $ns1 10.0.2.1 dev ns1eth2 flags signal 2184 pm_nl_set_limits $ns2 1 2 2185 pm_nl_add_endpoint $ns2 10.0.3.2 dev ns2eth3 flags subflow,backup 2186 FAILING_LINKS="1 2" \ 2187 run_tests $ns1 $ns2 10.0.1.1 1 2188 chk_join_nr 2 2 2 2189 chk_add_nr 1 1 2190 chk_stale_nr $ns2 2 4 2 2191 chk_link_usage $ns2 ns2eth3 $cinsent 50 2192 fi 2193 2194 # use a backup subflow with the first subflow on a lossy link 2195 # for bidirectional transfer 2196 if reset "backup flow used, bidi, link failure"; then 2197 init_shapers 2198 pm_nl_set_limits $ns1 0 2 2199 pm_nl_add_endpoint $ns1 10.0.2.1 dev ns1eth2 flags signal 2200 pm_nl_set_limits $ns2 1 3 2201 pm_nl_add_endpoint $ns2 10.0.3.2 dev ns2eth3 flags subflow,backup 2202 FAILING_LINKS="1 2" \ 2203 run_tests $ns1 $ns2 10.0.1.1 2 2204 chk_join_nr 2 2 2 2205 chk_add_nr 1 1 2206 chk_stale_nr $ns2 1 -1 2 2207 chk_link_usage $ns2 ns2eth3 $cinsent 50 2208 fi 2209} 2210 2211add_addr_timeout_tests() 2212{ 2213 # add_addr timeout 2214 if reset_with_add_addr_timeout "signal address, ADD_ADDR timeout"; then 2215 pm_nl_set_limits $ns1 0 1 2216 pm_nl_set_limits $ns2 1 1 2217 pm_nl_add_endpoint $ns1 10.0.2.1 flags signal 2218 run_tests $ns1 $ns2 10.0.1.1 0 0 0 slow 2219 chk_join_nr 1 1 1 2220 chk_add_nr 4 0 2221 fi 2222 2223 # add_addr timeout IPv6 2224 if reset_with_add_addr_timeout "signal address, ADD_ADDR6 timeout" 6; then 2225 pm_nl_set_limits $ns1 0 1 2226 pm_nl_set_limits $ns2 1 1 2227 pm_nl_add_endpoint $ns1 dead:beef:2::1 flags signal 2228 run_tests $ns1 $ns2 dead:beef:1::1 0 0 0 slow 2229 chk_join_nr 1 1 1 2230 chk_add_nr 4 0 2231 fi 2232 2233 # signal addresses timeout 2234 if reset_with_add_addr_timeout "signal addresses, ADD_ADDR timeout"; then 2235 pm_nl_set_limits $ns1 2 2 2236 pm_nl_add_endpoint $ns1 10.0.2.1 flags signal 2237 pm_nl_add_endpoint $ns1 10.0.3.1 flags signal 2238 pm_nl_set_limits $ns2 2 2 2239 run_tests $ns1 $ns2 10.0.1.1 0 0 0 speed_10 2240 chk_join_nr 2 2 2 2241 chk_add_nr 8 0 2242 fi 2243 2244 # signal invalid addresses timeout 2245 if reset_with_add_addr_timeout "invalid address, ADD_ADDR timeout"; then 2246 pm_nl_set_limits $ns1 2 2 2247 pm_nl_add_endpoint $ns1 10.0.12.1 flags signal 2248 pm_nl_add_endpoint $ns1 10.0.3.1 flags signal 2249 pm_nl_set_limits $ns2 2 2 2250 run_tests $ns1 $ns2 10.0.1.1 0 0 0 speed_10 2251 chk_join_nr 1 1 1 2252 chk_add_nr 8 0 2253 fi 2254} 2255 2256remove_tests() 2257{ 2258 # single subflow, remove 2259 if reset "remove single subflow"; then 2260 pm_nl_set_limits $ns1 0 1 2261 pm_nl_set_limits $ns2 0 1 2262 pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow 2263 run_tests $ns1 $ns2 10.0.1.1 0 0 -1 slow 2264 chk_join_nr 1 1 1 2265 chk_rm_nr 1 1 2266 chk_rst_nr 0 0 2267 fi 2268 2269 # multiple subflows, remove 2270 if reset "remove multiple subflows"; then 2271 pm_nl_set_limits $ns1 0 2 2272 pm_nl_set_limits $ns2 0 2 2273 pm_nl_add_endpoint $ns2 10.0.2.2 flags subflow 2274 pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow 2275 run_tests $ns1 $ns2 10.0.1.1 0 0 -2 slow 2276 chk_join_nr 2 2 2 2277 chk_rm_nr 2 2 2278 chk_rst_nr 0 0 2279 fi 2280 2281 # single address, remove 2282 if reset "remove single address"; then 2283 pm_nl_set_limits $ns1 0 1 2284 pm_nl_add_endpoint $ns1 10.0.2.1 flags signal 2285 pm_nl_set_limits $ns2 1 1 2286 run_tests $ns1 $ns2 10.0.1.1 0 -1 0 slow 2287 chk_join_nr 1 1 1 2288 chk_add_nr 1 1 2289 chk_rm_nr 1 1 invert 2290 chk_rst_nr 0 0 2291 fi 2292 2293 # subflow and signal, remove 2294 if reset "remove subflow and signal"; then 2295 pm_nl_set_limits $ns1 0 2 2296 pm_nl_add_endpoint $ns1 10.0.2.1 flags signal 2297 pm_nl_set_limits $ns2 1 2 2298 pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow 2299 run_tests $ns1 $ns2 10.0.1.1 0 -1 -1 slow 2300 chk_join_nr 2 2 2 2301 chk_add_nr 1 1 2302 chk_rm_nr 1 1 2303 chk_rst_nr 0 0 2304 fi 2305 2306 # subflows and signal, remove 2307 if reset "remove subflows and signal"; then 2308 pm_nl_set_limits $ns1 0 3 2309 pm_nl_add_endpoint $ns1 10.0.2.1 flags signal 2310 pm_nl_set_limits $ns2 1 3 2311 pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow 2312 pm_nl_add_endpoint $ns2 10.0.4.2 flags subflow 2313 run_tests $ns1 $ns2 10.0.1.1 0 -1 -2 speed_10 2314 chk_join_nr 3 3 3 2315 chk_add_nr 1 1 2316 chk_rm_nr 2 2 2317 chk_rst_nr 0 0 2318 fi 2319 2320 # addresses remove 2321 if reset "remove addresses"; then 2322 pm_nl_set_limits $ns1 3 3 2323 pm_nl_add_endpoint $ns1 10.0.2.1 flags signal id 250 2324 pm_nl_add_endpoint $ns1 10.0.3.1 flags signal 2325 pm_nl_add_endpoint $ns1 10.0.4.1 flags signal 2326 pm_nl_set_limits $ns2 3 3 2327 run_tests $ns1 $ns2 10.0.1.1 0 -3 0 speed_10 2328 chk_join_nr 3 3 3 2329 chk_add_nr 3 3 2330 chk_rm_nr 3 3 invert 2331 chk_rst_nr 0 0 2332 fi 2333 2334 # invalid addresses remove 2335 if reset "remove invalid addresses"; then 2336 pm_nl_set_limits $ns1 3 3 2337 pm_nl_add_endpoint $ns1 10.0.12.1 flags signal 2338 pm_nl_add_endpoint $ns1 10.0.3.1 flags signal 2339 pm_nl_add_endpoint $ns1 10.0.14.1 flags signal 2340 pm_nl_set_limits $ns2 3 3 2341 run_tests $ns1 $ns2 10.0.1.1 0 -3 0 speed_10 2342 chk_join_nr 1 1 1 2343 chk_add_nr 3 3 2344 chk_rm_nr 3 1 invert 2345 chk_rst_nr 0 0 2346 fi 2347 2348 # subflows and signal, flush 2349 if reset "flush subflows and signal"; then 2350 pm_nl_set_limits $ns1 0 3 2351 pm_nl_add_endpoint $ns1 10.0.2.1 flags signal 2352 pm_nl_set_limits $ns2 1 3 2353 pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow 2354 pm_nl_add_endpoint $ns2 10.0.4.2 flags subflow 2355 run_tests $ns1 $ns2 10.0.1.1 0 -8 -8 slow 2356 chk_join_nr 3 3 3 2357 chk_add_nr 1 1 2358 chk_rm_nr 1 3 invert simult 2359 chk_rst_nr 0 0 2360 fi 2361 2362 # subflows flush 2363 if reset "flush subflows"; then 2364 pm_nl_set_limits $ns1 3 3 2365 pm_nl_set_limits $ns2 3 3 2366 pm_nl_add_endpoint $ns2 10.0.2.2 flags subflow id 150 2367 pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow 2368 pm_nl_add_endpoint $ns2 10.0.4.2 flags subflow 2369 run_tests $ns1 $ns2 10.0.1.1 0 -8 -8 slow 2370 chk_join_nr 3 3 3 2371 2372 if mptcp_lib_kversion_ge 5.18; then 2373 chk_rm_nr 0 3 simult 2374 else 2375 chk_rm_nr 3 3 2376 fi 2377 chk_rst_nr 0 0 2378 fi 2379 2380 # addresses flush 2381 if reset "flush addresses"; then 2382 pm_nl_set_limits $ns1 3 3 2383 pm_nl_add_endpoint $ns1 10.0.2.1 flags signal id 250 2384 pm_nl_add_endpoint $ns1 10.0.3.1 flags signal 2385 pm_nl_add_endpoint $ns1 10.0.4.1 flags signal 2386 pm_nl_set_limits $ns2 3 3 2387 run_tests $ns1 $ns2 10.0.1.1 0 -8 -8 slow 2388 chk_join_nr 3 3 3 2389 chk_add_nr 3 3 2390 chk_rm_nr 3 3 invert simult 2391 chk_rst_nr 0 0 2392 fi 2393 2394 # invalid addresses flush 2395 if reset "flush invalid addresses"; then 2396 pm_nl_set_limits $ns1 3 3 2397 pm_nl_add_endpoint $ns1 10.0.12.1 flags signal 2398 pm_nl_add_endpoint $ns1 10.0.3.1 flags signal 2399 pm_nl_add_endpoint $ns1 10.0.14.1 flags signal 2400 pm_nl_set_limits $ns2 3 3 2401 run_tests $ns1 $ns2 10.0.1.1 0 -8 0 slow 2402 chk_join_nr 1 1 1 2403 chk_add_nr 3 3 2404 chk_rm_nr 3 1 invert 2405 chk_rst_nr 0 0 2406 fi 2407 2408 # remove id 0 subflow 2409 if reset "remove id 0 subflow"; then 2410 pm_nl_set_limits $ns1 0 1 2411 pm_nl_set_limits $ns2 0 1 2412 pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow 2413 run_tests $ns1 $ns2 10.0.1.1 0 0 -9 slow 2414 chk_join_nr 1 1 1 2415 chk_rm_nr 1 1 2416 chk_rst_nr 0 0 2417 fi 2418 2419 # remove id 0 address 2420 if reset "remove id 0 address"; then 2421 pm_nl_set_limits $ns1 0 1 2422 pm_nl_add_endpoint $ns1 10.0.2.1 flags signal 2423 pm_nl_set_limits $ns2 1 1 2424 run_tests $ns1 $ns2 10.0.1.1 0 -9 0 slow 2425 chk_join_nr 1 1 1 2426 chk_add_nr 1 1 2427 chk_rm_nr 1 1 invert 2428 chk_rst_nr 0 0 invert 2429 fi 2430} 2431 2432add_tests() 2433{ 2434 # add single subflow 2435 if reset "add single subflow"; then 2436 pm_nl_set_limits $ns1 0 1 2437 pm_nl_set_limits $ns2 0 1 2438 run_tests $ns1 $ns2 10.0.1.1 0 0 1 slow 2439 chk_join_nr 1 1 1 2440 fi 2441 2442 # add signal address 2443 if reset "add signal address"; then 2444 pm_nl_set_limits $ns1 0 1 2445 pm_nl_set_limits $ns2 1 1 2446 run_tests $ns1 $ns2 10.0.1.1 0 1 0 slow 2447 chk_join_nr 1 1 1 2448 chk_add_nr 1 1 2449 fi 2450 2451 # add multiple subflows 2452 if reset "add multiple subflows"; then 2453 pm_nl_set_limits $ns1 0 2 2454 pm_nl_set_limits $ns2 0 2 2455 run_tests $ns1 $ns2 10.0.1.1 0 0 2 slow 2456 chk_join_nr 2 2 2 2457 fi 2458 2459 # add multiple subflows IPv6 2460 if reset "add multiple subflows IPv6"; then 2461 pm_nl_set_limits $ns1 0 2 2462 pm_nl_set_limits $ns2 0 2 2463 run_tests $ns1 $ns2 dead:beef:1::1 0 0 2 slow 2464 chk_join_nr 2 2 2 2465 fi 2466 2467 # add multiple addresses IPv6 2468 if reset "add multiple addresses IPv6"; then 2469 pm_nl_set_limits $ns1 0 2 2470 pm_nl_set_limits $ns2 2 2 2471 run_tests $ns1 $ns2 dead:beef:1::1 0 2 0 slow 2472 chk_join_nr 2 2 2 2473 chk_add_nr 2 2 2474 fi 2475} 2476 2477ipv6_tests() 2478{ 2479 # subflow IPv6 2480 if reset "single subflow IPv6"; then 2481 pm_nl_set_limits $ns1 0 1 2482 pm_nl_set_limits $ns2 0 1 2483 pm_nl_add_endpoint $ns2 dead:beef:3::2 dev ns2eth3 flags subflow 2484 run_tests $ns1 $ns2 dead:beef:1::1 0 0 0 slow 2485 chk_join_nr 1 1 1 2486 fi 2487 2488 # add_address, unused IPv6 2489 if reset "unused signal address IPv6"; then 2490 pm_nl_add_endpoint $ns1 dead:beef:2::1 flags signal 2491 run_tests $ns1 $ns2 dead:beef:1::1 0 0 0 slow 2492 chk_join_nr 0 0 0 2493 chk_add_nr 1 1 2494 fi 2495 2496 # signal address IPv6 2497 if reset "single address IPv6"; then 2498 pm_nl_set_limits $ns1 0 1 2499 pm_nl_add_endpoint $ns1 dead:beef:2::1 flags signal 2500 pm_nl_set_limits $ns2 1 1 2501 run_tests $ns1 $ns2 dead:beef:1::1 0 0 0 slow 2502 chk_join_nr 1 1 1 2503 chk_add_nr 1 1 2504 fi 2505 2506 # single address IPv6, remove 2507 if reset "remove single address IPv6"; then 2508 pm_nl_set_limits $ns1 0 1 2509 pm_nl_add_endpoint $ns1 dead:beef:2::1 flags signal 2510 pm_nl_set_limits $ns2 1 1 2511 run_tests $ns1 $ns2 dead:beef:1::1 0 -1 0 slow 2512 chk_join_nr 1 1 1 2513 chk_add_nr 1 1 2514 chk_rm_nr 1 1 invert 2515 fi 2516 2517 # subflow and signal IPv6, remove 2518 if reset "remove subflow and signal IPv6"; then 2519 pm_nl_set_limits $ns1 0 2 2520 pm_nl_add_endpoint $ns1 dead:beef:2::1 flags signal 2521 pm_nl_set_limits $ns2 1 2 2522 pm_nl_add_endpoint $ns2 dead:beef:3::2 dev ns2eth3 flags subflow 2523 run_tests $ns1 $ns2 dead:beef:1::1 0 -1 -1 slow 2524 chk_join_nr 2 2 2 2525 chk_add_nr 1 1 2526 chk_rm_nr 1 1 2527 fi 2528} 2529 2530v4mapped_tests() 2531{ 2532 # subflow IPv4-mapped to IPv4-mapped 2533 if reset "single subflow IPv4-mapped"; then 2534 pm_nl_set_limits $ns1 0 1 2535 pm_nl_set_limits $ns2 0 1 2536 pm_nl_add_endpoint $ns2 "::ffff:10.0.3.2" flags subflow 2537 run_tests $ns1 $ns2 "::ffff:10.0.1.1" 2538 chk_join_nr 1 1 1 2539 fi 2540 2541 # signal address IPv4-mapped with IPv4-mapped sk 2542 if reset "signal address IPv4-mapped"; then 2543 pm_nl_set_limits $ns1 0 1 2544 pm_nl_set_limits $ns2 1 1 2545 pm_nl_add_endpoint $ns1 "::ffff:10.0.2.1" flags signal 2546 run_tests $ns1 $ns2 "::ffff:10.0.1.1" 2547 chk_join_nr 1 1 1 2548 chk_add_nr 1 1 2549 fi 2550 2551 # subflow v4-map-v6 2552 if reset "single subflow v4-map-v6"; then 2553 pm_nl_set_limits $ns1 0 1 2554 pm_nl_set_limits $ns2 0 1 2555 pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow 2556 run_tests $ns1 $ns2 "::ffff:10.0.1.1" 2557 chk_join_nr 1 1 1 2558 fi 2559 2560 # signal address v4-map-v6 2561 if reset "signal address v4-map-v6"; then 2562 pm_nl_set_limits $ns1 0 1 2563 pm_nl_set_limits $ns2 1 1 2564 pm_nl_add_endpoint $ns1 10.0.2.1 flags signal 2565 run_tests $ns1 $ns2 "::ffff:10.0.1.1" 2566 chk_join_nr 1 1 1 2567 chk_add_nr 1 1 2568 fi 2569 2570 # subflow v6-map-v4 2571 if reset "single subflow v6-map-v4"; then 2572 pm_nl_set_limits $ns1 0 1 2573 pm_nl_set_limits $ns2 0 1 2574 pm_nl_add_endpoint $ns2 "::ffff:10.0.3.2" flags subflow 2575 run_tests $ns1 $ns2 10.0.1.1 2576 chk_join_nr 1 1 1 2577 fi 2578 2579 # signal address v6-map-v4 2580 if reset "signal address v6-map-v4"; then 2581 pm_nl_set_limits $ns1 0 1 2582 pm_nl_set_limits $ns2 1 1 2583 pm_nl_add_endpoint $ns1 "::ffff:10.0.2.1" flags signal 2584 run_tests $ns1 $ns2 10.0.1.1 2585 chk_join_nr 1 1 1 2586 chk_add_nr 1 1 2587 fi 2588 2589 # no subflow IPv6 to v4 address 2590 if reset "no JOIN with diff families v4-v6"; then 2591 pm_nl_set_limits $ns1 0 1 2592 pm_nl_set_limits $ns2 0 1 2593 pm_nl_add_endpoint $ns2 dead:beef:2::2 flags subflow 2594 run_tests $ns1 $ns2 10.0.1.1 2595 chk_join_nr 0 0 0 2596 fi 2597 2598 # no subflow IPv6 to v4 address even if v6 has a valid v4 at the end 2599 if reset "no JOIN with diff families v4-v6-2"; then 2600 pm_nl_set_limits $ns1 0 1 2601 pm_nl_set_limits $ns2 0 1 2602 pm_nl_add_endpoint $ns2 dead:beef:2::10.0.3.2 flags subflow 2603 run_tests $ns1 $ns2 10.0.1.1 2604 chk_join_nr 0 0 0 2605 fi 2606 2607 # no subflow IPv4 to v6 address, no need to slow down too then 2608 if reset "no JOIN with diff families v6-v4"; then 2609 pm_nl_set_limits $ns1 0 1 2610 pm_nl_set_limits $ns2 0 1 2611 pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow 2612 run_tests $ns1 $ns2 dead:beef:1::1 2613 chk_join_nr 0 0 0 2614 fi 2615} 2616 2617backup_tests() 2618{ 2619 # single subflow, backup 2620 if reset "single subflow, backup" && 2621 continue_if mptcp_lib_kallsyms_has "subflow_rebuild_header$"; then 2622 pm_nl_set_limits $ns1 0 1 2623 pm_nl_set_limits $ns2 0 1 2624 pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow,backup 2625 run_tests $ns1 $ns2 10.0.1.1 0 0 0 slow nobackup 2626 chk_join_nr 1 1 1 2627 chk_prio_nr 0 1 2628 fi 2629 2630 # single address, backup 2631 if reset "single address, backup" && 2632 continue_if mptcp_lib_kallsyms_has "subflow_rebuild_header$"; then 2633 pm_nl_set_limits $ns1 0 1 2634 pm_nl_add_endpoint $ns1 10.0.2.1 flags signal 2635 pm_nl_set_limits $ns2 1 1 2636 run_tests $ns1 $ns2 10.0.1.1 0 0 0 slow backup 2637 chk_join_nr 1 1 1 2638 chk_add_nr 1 1 2639 chk_prio_nr 1 1 2640 fi 2641 2642 # single address with port, backup 2643 if reset "single address with port, backup" && 2644 continue_if mptcp_lib_kallsyms_has "subflow_rebuild_header$"; then 2645 pm_nl_set_limits $ns1 0 1 2646 pm_nl_add_endpoint $ns1 10.0.2.1 flags signal port 10100 2647 pm_nl_set_limits $ns2 1 1 2648 run_tests $ns1 $ns2 10.0.1.1 0 0 0 slow backup 2649 chk_join_nr 1 1 1 2650 chk_add_nr 1 1 2651 chk_prio_nr 1 1 2652 fi 2653 2654 if reset "mpc backup" && 2655 continue_if mptcp_lib_kallsyms_doesnt_have "T mptcp_subflow_send_ack$"; then 2656 pm_nl_add_endpoint $ns2 10.0.1.2 flags subflow,backup 2657 run_tests $ns1 $ns2 10.0.1.1 0 0 0 slow 2658 chk_join_nr 0 0 0 2659 chk_prio_nr 0 1 2660 fi 2661 2662 if reset "mpc backup both sides" && 2663 continue_if mptcp_lib_kallsyms_doesnt_have "T mptcp_subflow_send_ack$"; then 2664 pm_nl_add_endpoint $ns1 10.0.1.1 flags subflow,backup 2665 pm_nl_add_endpoint $ns2 10.0.1.2 flags subflow,backup 2666 run_tests $ns1 $ns2 10.0.1.1 0 0 0 slow 2667 chk_join_nr 0 0 0 2668 chk_prio_nr 1 1 2669 fi 2670 2671 if reset "mpc switch to backup" && 2672 continue_if mptcp_lib_kallsyms_doesnt_have "T mptcp_subflow_send_ack$"; then 2673 pm_nl_add_endpoint $ns2 10.0.1.2 flags subflow 2674 run_tests $ns1 $ns2 10.0.1.1 0 0 0 slow backup 2675 chk_join_nr 0 0 0 2676 chk_prio_nr 0 1 2677 fi 2678 2679 if reset "mpc switch to backup both sides" && 2680 continue_if mptcp_lib_kallsyms_doesnt_have "T mptcp_subflow_send_ack$"; then 2681 pm_nl_add_endpoint $ns1 10.0.1.1 flags subflow 2682 pm_nl_add_endpoint $ns2 10.0.1.2 flags subflow 2683 run_tests $ns1 $ns2 10.0.1.1 0 0 0 slow backup 2684 chk_join_nr 0 0 0 2685 chk_prio_nr 1 1 2686 fi 2687} 2688 2689add_addr_ports_tests() 2690{ 2691 # signal address with port 2692 if reset "signal address with port"; then 2693 pm_nl_set_limits $ns1 0 1 2694 pm_nl_set_limits $ns2 1 1 2695 pm_nl_add_endpoint $ns1 10.0.2.1 flags signal port 10100 2696 run_tests $ns1 $ns2 10.0.1.1 2697 chk_join_nr 1 1 1 2698 chk_add_nr 1 1 1 2699 fi 2700 2701 # subflow and signal with port 2702 if reset "subflow and signal with port"; then 2703 pm_nl_add_endpoint $ns1 10.0.2.1 flags signal port 10100 2704 pm_nl_set_limits $ns1 0 2 2705 pm_nl_set_limits $ns2 1 2 2706 pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow 2707 run_tests $ns1 $ns2 10.0.1.1 2708 chk_join_nr 2 2 2 2709 chk_add_nr 1 1 1 2710 fi 2711 2712 # single address with port, remove 2713 if reset "remove single address with port"; then 2714 pm_nl_set_limits $ns1 0 1 2715 pm_nl_add_endpoint $ns1 10.0.2.1 flags signal port 10100 2716 pm_nl_set_limits $ns2 1 1 2717 run_tests $ns1 $ns2 10.0.1.1 0 -1 0 slow 2718 chk_join_nr 1 1 1 2719 chk_add_nr 1 1 1 2720 chk_rm_nr 1 1 invert 2721 fi 2722 2723 # subflow and signal with port, remove 2724 if reset "remove subflow and signal with port"; then 2725 pm_nl_set_limits $ns1 0 2 2726 pm_nl_add_endpoint $ns1 10.0.2.1 flags signal port 10100 2727 pm_nl_set_limits $ns2 1 2 2728 pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow 2729 run_tests $ns1 $ns2 10.0.1.1 0 -1 -1 slow 2730 chk_join_nr 2 2 2 2731 chk_add_nr 1 1 1 2732 chk_rm_nr 1 1 2733 fi 2734 2735 # subflows and signal with port, flush 2736 if reset "flush subflows and signal with port"; then 2737 pm_nl_set_limits $ns1 0 3 2738 pm_nl_add_endpoint $ns1 10.0.2.1 flags signal port 10100 2739 pm_nl_set_limits $ns2 1 3 2740 pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow 2741 pm_nl_add_endpoint $ns2 10.0.4.2 flags subflow 2742 run_tests $ns1 $ns2 10.0.1.1 0 -8 -2 slow 2743 chk_join_nr 3 3 3 2744 chk_add_nr 1 1 2745 chk_rm_nr 1 3 invert simult 2746 fi 2747 2748 # multiple addresses with port 2749 if reset "multiple addresses with port"; then 2750 pm_nl_set_limits $ns1 2 2 2751 pm_nl_add_endpoint $ns1 10.0.2.1 flags signal port 10100 2752 pm_nl_add_endpoint $ns1 10.0.3.1 flags signal port 10100 2753 pm_nl_set_limits $ns2 2 2 2754 run_tests $ns1 $ns2 10.0.1.1 2755 chk_join_nr 2 2 2 2756 chk_add_nr 2 2 2 2757 fi 2758 2759 # multiple addresses with ports 2760 if reset "multiple addresses with ports"; then 2761 pm_nl_set_limits $ns1 2 2 2762 pm_nl_add_endpoint $ns1 10.0.2.1 flags signal port 10100 2763 pm_nl_add_endpoint $ns1 10.0.3.1 flags signal port 10101 2764 pm_nl_set_limits $ns2 2 2 2765 run_tests $ns1 $ns2 10.0.1.1 2766 chk_join_nr 2 2 2 2767 chk_add_nr 2 2 2 2768 fi 2769} 2770 2771syncookies_tests() 2772{ 2773 # single subflow, syncookies 2774 if reset_with_cookies "single subflow with syn cookies"; then 2775 pm_nl_set_limits $ns1 0 1 2776 pm_nl_set_limits $ns2 0 1 2777 pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow 2778 run_tests $ns1 $ns2 10.0.1.1 2779 chk_join_nr 1 1 1 2780 fi 2781 2782 # multiple subflows with syn cookies 2783 if reset_with_cookies "multiple subflows with syn cookies"; then 2784 pm_nl_set_limits $ns1 0 2 2785 pm_nl_set_limits $ns2 0 2 2786 pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow 2787 pm_nl_add_endpoint $ns2 10.0.2.2 flags subflow 2788 run_tests $ns1 $ns2 10.0.1.1 2789 chk_join_nr 2 2 2 2790 fi 2791 2792 # multiple subflows limited by server 2793 if reset_with_cookies "subflows limited by server w cookies"; then 2794 pm_nl_set_limits $ns1 0 1 2795 pm_nl_set_limits $ns2 0 2 2796 pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow 2797 pm_nl_add_endpoint $ns2 10.0.2.2 flags subflow 2798 run_tests $ns1 $ns2 10.0.1.1 2799 chk_join_nr 2 1 1 2800 fi 2801 2802 # test signal address with cookies 2803 if reset_with_cookies "signal address with syn cookies"; then 2804 pm_nl_set_limits $ns1 0 1 2805 pm_nl_set_limits $ns2 1 1 2806 pm_nl_add_endpoint $ns1 10.0.2.1 flags signal 2807 run_tests $ns1 $ns2 10.0.1.1 2808 chk_join_nr 1 1 1 2809 chk_add_nr 1 1 2810 fi 2811 2812 # test cookie with subflow and signal 2813 if reset_with_cookies "subflow and signal w cookies"; then 2814 pm_nl_add_endpoint $ns1 10.0.2.1 flags signal 2815 pm_nl_set_limits $ns1 0 2 2816 pm_nl_set_limits $ns2 1 2 2817 pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow 2818 run_tests $ns1 $ns2 10.0.1.1 2819 chk_join_nr 2 2 2 2820 chk_add_nr 1 1 2821 fi 2822 2823 # accept and use add_addr with additional subflows 2824 if reset_with_cookies "subflows and signal w. cookies"; then 2825 pm_nl_set_limits $ns1 0 3 2826 pm_nl_add_endpoint $ns1 10.0.2.1 flags signal 2827 pm_nl_set_limits $ns2 1 3 2828 pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow 2829 pm_nl_add_endpoint $ns2 10.0.4.2 flags subflow 2830 run_tests $ns1 $ns2 10.0.1.1 2831 chk_join_nr 3 3 3 2832 chk_add_nr 1 1 2833 fi 2834} 2835 2836checksum_tests() 2837{ 2838 # checksum test 0 0 2839 if reset_with_checksum 0 0; then 2840 pm_nl_set_limits $ns1 0 1 2841 pm_nl_set_limits $ns2 0 1 2842 run_tests $ns1 $ns2 10.0.1.1 2843 chk_join_nr 0 0 0 2844 fi 2845 2846 # checksum test 1 1 2847 if reset_with_checksum 1 1; then 2848 pm_nl_set_limits $ns1 0 1 2849 pm_nl_set_limits $ns2 0 1 2850 run_tests $ns1 $ns2 10.0.1.1 2851 chk_join_nr 0 0 0 2852 fi 2853 2854 # checksum test 0 1 2855 if reset_with_checksum 0 1; then 2856 pm_nl_set_limits $ns1 0 1 2857 pm_nl_set_limits $ns2 0 1 2858 run_tests $ns1 $ns2 10.0.1.1 2859 chk_join_nr 0 0 0 2860 fi 2861 2862 # checksum test 1 0 2863 if reset_with_checksum 1 0; then 2864 pm_nl_set_limits $ns1 0 1 2865 pm_nl_set_limits $ns2 0 1 2866 run_tests $ns1 $ns2 10.0.1.1 2867 chk_join_nr 0 0 0 2868 fi 2869} 2870 2871deny_join_id0_tests() 2872{ 2873 # subflow allow join id0 ns1 2874 if reset_with_allow_join_id0 "single subflow allow join id0 ns1" 1 0; then 2875 pm_nl_set_limits $ns1 1 1 2876 pm_nl_set_limits $ns2 1 1 2877 pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow 2878 run_tests $ns1 $ns2 10.0.1.1 2879 chk_join_nr 1 1 1 2880 fi 2881 2882 # subflow allow join id0 ns2 2883 if reset_with_allow_join_id0 "single subflow allow join id0 ns2" 0 1; then 2884 pm_nl_set_limits $ns1 1 1 2885 pm_nl_set_limits $ns2 1 1 2886 pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow 2887 run_tests $ns1 $ns2 10.0.1.1 2888 chk_join_nr 0 0 0 2889 fi 2890 2891 # signal address allow join id0 ns1 2892 # ADD_ADDRs are not affected by allow_join_id0 value. 2893 if reset_with_allow_join_id0 "signal address allow join id0 ns1" 1 0; then 2894 pm_nl_set_limits $ns1 1 1 2895 pm_nl_set_limits $ns2 1 1 2896 pm_nl_add_endpoint $ns1 10.0.2.1 flags signal 2897 run_tests $ns1 $ns2 10.0.1.1 2898 chk_join_nr 1 1 1 2899 chk_add_nr 1 1 2900 fi 2901 2902 # signal address allow join id0 ns2 2903 # ADD_ADDRs are not affected by allow_join_id0 value. 2904 if reset_with_allow_join_id0 "signal address allow join id0 ns2" 0 1; then 2905 pm_nl_set_limits $ns1 1 1 2906 pm_nl_set_limits $ns2 1 1 2907 pm_nl_add_endpoint $ns1 10.0.2.1 flags signal 2908 run_tests $ns1 $ns2 10.0.1.1 2909 chk_join_nr 1 1 1 2910 chk_add_nr 1 1 2911 fi 2912 2913 # subflow and address allow join id0 ns1 2914 if reset_with_allow_join_id0 "subflow and address allow join id0 1" 1 0; then 2915 pm_nl_set_limits $ns1 2 2 2916 pm_nl_set_limits $ns2 2 2 2917 pm_nl_add_endpoint $ns1 10.0.2.1 flags signal 2918 pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow 2919 run_tests $ns1 $ns2 10.0.1.1 2920 chk_join_nr 2 2 2 2921 fi 2922 2923 # subflow and address allow join id0 ns2 2924 if reset_with_allow_join_id0 "subflow and address allow join id0 2" 0 1; then 2925 pm_nl_set_limits $ns1 2 2 2926 pm_nl_set_limits $ns2 2 2 2927 pm_nl_add_endpoint $ns1 10.0.2.1 flags signal 2928 pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow 2929 run_tests $ns1 $ns2 10.0.1.1 2930 chk_join_nr 1 1 1 2931 fi 2932} 2933 2934fullmesh_tests() 2935{ 2936 # fullmesh 1 2937 # 2 fullmesh addrs in ns2, added before the connection, 2938 # 1 non-fullmesh addr in ns1, added during the connection. 2939 if reset "fullmesh test 2x1"; then 2940 pm_nl_set_limits $ns1 0 4 2941 pm_nl_set_limits $ns2 1 4 2942 pm_nl_add_endpoint $ns2 10.0.2.2 flags subflow,fullmesh 2943 pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow,fullmesh 2944 run_tests $ns1 $ns2 10.0.1.1 0 1 0 slow 2945 chk_join_nr 4 4 4 2946 chk_add_nr 1 1 2947 fi 2948 2949 # fullmesh 2 2950 # 1 non-fullmesh addr in ns1, added before the connection, 2951 # 1 fullmesh addr in ns2, added during the connection. 2952 if reset "fullmesh test 1x1"; then 2953 pm_nl_set_limits $ns1 1 3 2954 pm_nl_set_limits $ns2 1 3 2955 pm_nl_add_endpoint $ns1 10.0.2.1 flags signal 2956 run_tests $ns1 $ns2 10.0.1.1 0 0 fullmesh_1 slow 2957 chk_join_nr 3 3 3 2958 chk_add_nr 1 1 2959 fi 2960 2961 # fullmesh 3 2962 # 1 non-fullmesh addr in ns1, added before the connection, 2963 # 2 fullmesh addrs in ns2, added during the connection. 2964 if reset "fullmesh test 1x2"; then 2965 pm_nl_set_limits $ns1 2 5 2966 pm_nl_set_limits $ns2 1 5 2967 pm_nl_add_endpoint $ns1 10.0.2.1 flags signal 2968 run_tests $ns1 $ns2 10.0.1.1 0 0 fullmesh_2 slow 2969 chk_join_nr 5 5 5 2970 chk_add_nr 1 1 2971 fi 2972 2973 # fullmesh 4 2974 # 1 non-fullmesh addr in ns1, added before the connection, 2975 # 2 fullmesh addrs in ns2, added during the connection, 2976 # limit max_subflows to 4. 2977 if reset "fullmesh test 1x2, limited"; then 2978 pm_nl_set_limits $ns1 2 4 2979 pm_nl_set_limits $ns2 1 4 2980 pm_nl_add_endpoint $ns1 10.0.2.1 flags signal 2981 run_tests $ns1 $ns2 10.0.1.1 0 0 fullmesh_2 slow 2982 chk_join_nr 4 4 4 2983 chk_add_nr 1 1 2984 fi 2985 2986 # set fullmesh flag 2987 if reset "set fullmesh flag test" && 2988 continue_if mptcp_lib_kversion_ge 5.18; then 2989 pm_nl_set_limits $ns1 4 4 2990 pm_nl_add_endpoint $ns1 10.0.2.1 flags subflow 2991 pm_nl_set_limits $ns2 4 4 2992 run_tests $ns1 $ns2 10.0.1.1 0 0 1 slow fullmesh 2993 chk_join_nr 2 2 2 2994 chk_rm_nr 0 1 2995 fi 2996 2997 # set nofullmesh flag 2998 if reset "set nofullmesh flag test" && 2999 continue_if mptcp_lib_kversion_ge 5.18; then 3000 pm_nl_set_limits $ns1 4 4 3001 pm_nl_add_endpoint $ns1 10.0.2.1 flags subflow,fullmesh 3002 pm_nl_set_limits $ns2 4 4 3003 run_tests $ns1 $ns2 10.0.1.1 0 0 fullmesh_1 slow nofullmesh 3004 chk_join_nr 2 2 2 3005 chk_rm_nr 0 1 3006 fi 3007 3008 # set backup,fullmesh flags 3009 if reset "set backup,fullmesh flags test" && 3010 continue_if mptcp_lib_kversion_ge 5.18; then 3011 pm_nl_set_limits $ns1 4 4 3012 pm_nl_add_endpoint $ns1 10.0.2.1 flags subflow 3013 pm_nl_set_limits $ns2 4 4 3014 run_tests $ns1 $ns2 10.0.1.1 0 0 1 slow backup,fullmesh 3015 chk_join_nr 2 2 2 3016 chk_prio_nr 0 1 3017 chk_rm_nr 0 1 3018 fi 3019 3020 # set nobackup,nofullmesh flags 3021 if reset "set nobackup,nofullmesh flags test" && 3022 continue_if mptcp_lib_kversion_ge 5.18; then 3023 pm_nl_set_limits $ns1 4 4 3024 pm_nl_set_limits $ns2 4 4 3025 pm_nl_add_endpoint $ns2 10.0.2.2 flags subflow,backup,fullmesh 3026 run_tests $ns1 $ns2 10.0.1.1 0 0 0 slow nobackup,nofullmesh 3027 chk_join_nr 2 2 2 3028 chk_prio_nr 0 1 3029 chk_rm_nr 0 1 3030 fi 3031} 3032 3033fastclose_tests() 3034{ 3035 if reset_check_counter "fastclose test" "MPTcpExtMPFastcloseTx"; then 3036 run_tests $ns1 $ns2 10.0.1.1 1024 0 fastclose_client 3037 chk_join_nr 0 0 0 3038 chk_fclose_nr 1 1 3039 chk_rst_nr 1 1 invert 3040 fi 3041 3042 if reset_check_counter "fastclose server test" "MPTcpExtMPFastcloseRx"; then 3043 run_tests $ns1 $ns2 10.0.1.1 1024 0 fastclose_server 3044 chk_join_nr 0 0 0 0 0 0 1 3045 chk_fclose_nr 1 1 invert 3046 chk_rst_nr 1 1 3047 fi 3048} 3049 3050pedit_action_pkts() 3051{ 3052 tc -n $ns2 -j -s action show action pedit index 100 | \ 3053 grep "packets" | \ 3054 sed 's/.*"packets":\([0-9]\+\),.*/\1/' 3055} 3056 3057fail_tests() 3058{ 3059 # single subflow 3060 if reset_with_fail "Infinite map" 1; then 3061 run_tests $ns1 $ns2 10.0.1.1 128 3062 chk_join_nr 0 0 0 +1 +0 1 0 1 "$(pedit_action_pkts)" 3063 chk_fail_nr 1 -1 invert 3064 fi 3065 3066 # multiple subflows 3067 if reset_with_fail "MP_FAIL MP_RST" 2; then 3068 tc -n $ns2 qdisc add dev ns2eth1 root netem rate 1mbit delay 5 3069 pm_nl_set_limits $ns1 0 1 3070 pm_nl_set_limits $ns2 0 1 3071 pm_nl_add_endpoint $ns2 10.0.2.2 dev ns2eth2 flags subflow 3072 run_tests $ns1 $ns2 10.0.1.1 1024 3073 chk_join_nr 1 1 1 1 0 1 1 0 "$(pedit_action_pkts)" 3074 fi 3075} 3076 3077userspace_tests() 3078{ 3079 # userspace pm type prevents add_addr 3080 if reset "userspace pm type prevents add_addr" && 3081 continue_if mptcp_lib_has_file '/proc/sys/net/mptcp/pm_type'; then 3082 set_userspace_pm $ns1 3083 pm_nl_set_limits $ns1 0 2 3084 pm_nl_set_limits $ns2 0 2 3085 pm_nl_add_endpoint $ns1 10.0.2.1 flags signal 3086 run_tests $ns1 $ns2 10.0.1.1 3087 chk_join_nr 0 0 0 3088 chk_add_nr 0 0 3089 fi 3090 3091 # userspace pm type does not echo add_addr without daemon 3092 if reset "userspace pm no echo w/o daemon" && 3093 continue_if mptcp_lib_has_file '/proc/sys/net/mptcp/pm_type'; then 3094 set_userspace_pm $ns2 3095 pm_nl_set_limits $ns1 0 2 3096 pm_nl_set_limits $ns2 0 2 3097 pm_nl_add_endpoint $ns1 10.0.2.1 flags signal 3098 run_tests $ns1 $ns2 10.0.1.1 3099 chk_join_nr 0 0 0 3100 chk_add_nr 1 0 3101 fi 3102 3103 # userspace pm type rejects join 3104 if reset "userspace pm type rejects join" && 3105 continue_if mptcp_lib_has_file '/proc/sys/net/mptcp/pm_type'; then 3106 set_userspace_pm $ns1 3107 pm_nl_set_limits $ns1 1 1 3108 pm_nl_set_limits $ns2 1 1 3109 pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow 3110 run_tests $ns1 $ns2 10.0.1.1 3111 chk_join_nr 1 1 0 3112 fi 3113 3114 # userspace pm type does not send join 3115 if reset "userspace pm type does not send join" && 3116 continue_if mptcp_lib_has_file '/proc/sys/net/mptcp/pm_type'; then 3117 set_userspace_pm $ns2 3118 pm_nl_set_limits $ns1 1 1 3119 pm_nl_set_limits $ns2 1 1 3120 pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow 3121 run_tests $ns1 $ns2 10.0.1.1 3122 chk_join_nr 0 0 0 3123 fi 3124 3125 # userspace pm type prevents mp_prio 3126 if reset "userspace pm type prevents mp_prio" && 3127 continue_if mptcp_lib_has_file '/proc/sys/net/mptcp/pm_type'; then 3128 set_userspace_pm $ns1 3129 pm_nl_set_limits $ns1 1 1 3130 pm_nl_set_limits $ns2 1 1 3131 pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow 3132 run_tests $ns1 $ns2 10.0.1.1 0 0 0 slow backup 3133 chk_join_nr 1 1 0 3134 chk_prio_nr 0 0 3135 fi 3136 3137 # userspace pm type prevents rm_addr 3138 if reset "userspace pm type prevents rm_addr" && 3139 continue_if mptcp_lib_has_file '/proc/sys/net/mptcp/pm_type'; then 3140 set_userspace_pm $ns1 3141 set_userspace_pm $ns2 3142 pm_nl_set_limits $ns1 0 1 3143 pm_nl_set_limits $ns2 0 1 3144 pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow 3145 run_tests $ns1 $ns2 10.0.1.1 0 0 -1 slow 3146 chk_join_nr 0 0 0 3147 chk_rm_nr 0 0 3148 fi 3149 3150 # userspace pm add & remove address 3151 if reset "userspace pm add & remove address" && 3152 continue_if mptcp_lib_has_file '/proc/sys/net/mptcp/pm_type'; then 3153 set_userspace_pm $ns1 3154 pm_nl_set_limits $ns2 1 1 3155 run_tests $ns1 $ns2 10.0.1.1 0 userspace_1 0 slow 3156 chk_join_nr 1 1 1 3157 chk_add_nr 1 1 3158 chk_rm_nr 1 1 invert 3159 fi 3160 3161 # userspace pm create destroy subflow 3162 if reset "userspace pm create destroy subflow" && 3163 continue_if mptcp_lib_has_file '/proc/sys/net/mptcp/pm_type'; then 3164 set_userspace_pm $ns2 3165 pm_nl_set_limits $ns1 0 1 3166 run_tests $ns1 $ns2 10.0.1.1 0 0 userspace_1 slow 3167 chk_join_nr 1 1 1 3168 chk_rm_nr 1 1 3169 fi 3170} 3171 3172endpoint_tests() 3173{ 3174 # subflow_rebuild_header is needed to support the implicit flag 3175 # userspace pm type prevents add_addr 3176 if reset "implicit EP" && 3177 mptcp_lib_kallsyms_has "subflow_rebuild_header$"; then 3178 pm_nl_set_limits $ns1 2 2 3179 pm_nl_set_limits $ns2 2 2 3180 pm_nl_add_endpoint $ns1 10.0.2.1 flags signal 3181 run_tests $ns1 $ns2 10.0.1.1 0 0 0 slow 2>/dev/null & 3182 3183 wait_mpj $ns1 3184 pm_nl_check_endpoint 1 "creation" \ 3185 $ns2 10.0.2.2 id 1 flags implicit 3186 3187 pm_nl_add_endpoint $ns2 10.0.2.2 id 33 3188 pm_nl_check_endpoint 0 "ID change is prevented" \ 3189 $ns2 10.0.2.2 id 1 flags implicit 3190 3191 pm_nl_add_endpoint $ns2 10.0.2.2 flags signal 3192 pm_nl_check_endpoint 0 "modif is allowed" \ 3193 $ns2 10.0.2.2 id 1 flags signal 3194 kill_tests_wait 3195 fi 3196 3197 if reset "delete and re-add" && 3198 mptcp_lib_kallsyms_has "subflow_rebuild_header$"; then 3199 pm_nl_set_limits $ns1 1 1 3200 pm_nl_set_limits $ns2 1 1 3201 pm_nl_add_endpoint $ns2 10.0.2.2 id 2 dev ns2eth2 flags subflow 3202 run_tests $ns1 $ns2 10.0.1.1 4 0 0 speed_20 2>/dev/null & 3203 3204 wait_mpj $ns2 3205 pm_nl_del_endpoint $ns2 2 10.0.2.2 3206 sleep 0.5 3207 chk_subflow_nr needtitle "after delete" 1 3208 3209 pm_nl_add_endpoint $ns2 10.0.2.2 dev ns2eth2 flags subflow 3210 wait_mpj $ns2 3211 chk_subflow_nr "" "after re-add" 2 3212 kill_tests_wait 3213 fi 3214} 3215 3216# [$1: error message] 3217usage() 3218{ 3219 if [ -n "${1}" ]; then 3220 echo "${1}" 3221 ret=1 3222 fi 3223 3224 echo "mptcp_join usage:" 3225 3226 local key 3227 for key in "${!all_tests[@]}"; do 3228 echo " -${key} ${all_tests[${key}]}" 3229 done 3230 3231 echo " -c capture pcap files" 3232 echo " -C enable data checksum" 3233 echo " -i use ip mptcp" 3234 echo " -h help" 3235 3236 echo "[test ids|names]" 3237 3238 exit ${ret} 3239} 3240 3241 3242# Use a "simple" array to force an specific order we cannot have with an associative one 3243all_tests_sorted=( 3244 f@subflows_tests 3245 e@subflows_error_tests 3246 s@signal_address_tests 3247 l@link_failure_tests 3248 t@add_addr_timeout_tests 3249 r@remove_tests 3250 a@add_tests 3251 6@ipv6_tests 3252 4@v4mapped_tests 3253 b@backup_tests 3254 p@add_addr_ports_tests 3255 k@syncookies_tests 3256 S@checksum_tests 3257 d@deny_join_id0_tests 3258 m@fullmesh_tests 3259 z@fastclose_tests 3260 F@fail_tests 3261 u@userspace_tests 3262 I@endpoint_tests 3263) 3264 3265all_tests_args="" 3266all_tests_names=() 3267for subtests in "${all_tests_sorted[@]}"; do 3268 key="${subtests%@*}" 3269 value="${subtests#*@}" 3270 3271 all_tests_args+="${key}" 3272 all_tests_names+=("${value}") 3273 all_tests[${key}]="${value}" 3274done 3275 3276tests=() 3277while getopts "${all_tests_args}cCih" opt; do 3278 case $opt in 3279 ["${all_tests_args}"]) 3280 tests+=("${all_tests[${opt}]}") 3281 ;; 3282 c) 3283 capture=1 3284 ;; 3285 C) 3286 checksum=1 3287 ;; 3288 i) 3289 ip_mptcp=1 3290 ;; 3291 h) 3292 usage 3293 ;; 3294 *) 3295 usage "Unknown option: -${opt}" 3296 ;; 3297 esac 3298done 3299 3300shift $((OPTIND - 1)) 3301 3302for arg in "${@}"; do 3303 if [[ "${arg}" =~ ^[0-9]+$ ]]; then 3304 only_tests_ids+=("${arg}") 3305 else 3306 only_tests_names+=("${arg}") 3307 fi 3308done 3309 3310if [ ${#tests[@]} -eq 0 ]; then 3311 tests=("${all_tests_names[@]}") 3312fi 3313 3314for subtests in "${tests[@]}"; do 3315 "${subtests}" 3316done 3317 3318if [ ${ret} -ne 0 ]; then 3319 echo 3320 echo "${#failed_tests[@]} failure(s) has(ve) been detected:" 3321 for i in $(get_failed_tests_ids); do 3322 echo -e "\t- ${i}: ${failed_tests[${i}]}" 3323 done 3324 echo 3325fi 3326 3327exit $ret 3328