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