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