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