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