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