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