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