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