4037 lines · bash
1#!/bin/bash2# SPDX-License-Identifier: GPL-2.03 4# Double quotes to prevent globbing and word splitting is recommended in new5# code but we accept it, especially because there were too many before having6# address all other issues detected by shellcheck.7#shellcheck disable=SC20868 9# ShellCheck incorrectly believes that most of the code here is unreachable10# because it's invoked by variable name, see how the "tests" array is used11#shellcheck disable=SC231712 13. "$(dirname "${0}")/mptcp_lib.sh"14 15ret=016sin=""17sinfail=""18sout=""19cin=""20cinfail=""21cinsent=""22tmpfile=""23cout=""24err=""25capout=""26cappid=""27ns1=""28ns2=""29iptables="iptables"30ip6tables="ip6tables"31timeout_poll=3032timeout_test=$((timeout_poll * 2 + 1))33capture=false34checksum=false35check_invert=036validate_checksum=false37init=038evts_ns1=""39evts_ns2=""40evts_ns1_pid=041evts_ns2_pid=042last_test_failed=043last_test_skipped=044last_test_ignored=145 46declare -A all_tests47declare -a only_tests_ids48declare -a only_tests_names49declare -A failed_tests50MPTCP_LIB_TEST_FORMAT="%03u %s\n"51TEST_NAME=""52nr_blank=653 54# These var are used only in some tests, make sure they are not already set55unset FAILING_LINKS56unset test_linkfail57unset addr_nr_ns158unset addr_nr_ns259unset cestab_ns160unset cestab_ns261unset sflags62unset fastclose63unset fullmesh64unset speed65unset join_csum_ns166unset join_csum_ns267unset join_fail_nr68unset join_rst_nr69unset join_infi_nr70unset join_corrupted_pkts71unset join_syn_tx72unset join_create_err73unset join_bind_err74unset join_connect_err75 76# generated using "nfbpf_compile '(ip && (ip[54] & 0xf0) == 0x30) ||77# (ip6 && (ip6[74] & 0xf0) == 0x30)'"78CBPF_MPTCP_SUBOPTION_ADD_ADDR="14,79 48 0 0 0,80 84 0 0 240,81 21 0 3 64,82 48 0 0 54,83 84 0 0 240,84 21 6 7 48,85 48 0 0 0,86 84 0 0 240,87 21 0 4 96,88 48 0 0 74,89 84 0 0 240,90 21 0 1 48,91 6 0 0 65535,92 6 0 0 0"93 94init_partial()95{96 capout=$(mktemp)97 98 mptcp_lib_ns_init ns1 ns299 100 local netns101 for netns in "$ns1" "$ns2"; do102 ip netns exec $netns sysctl -q net.mptcp.pm_type=0 2>/dev/null || true103 if $checksum; then104 ip netns exec $netns sysctl -q net.mptcp.checksum_enabled=1105 fi106 done107 108 check_invert=0109 validate_checksum=$checksum110 111 # ns1 ns2112 # ns1eth1 ns2eth1113 # ns1eth2 ns2eth2114 # ns1eth3 ns2eth3115 # ns1eth4 ns2eth4116 117 local i118 for i in $(seq 1 4); do119 ip link add ns1eth$i netns "$ns1" type veth peer name ns2eth$i netns "$ns2"120 ip -net "$ns1" addr add 10.0.$i.1/24 dev ns1eth$i121 ip -net "$ns1" addr add dead:beef:$i::1/64 dev ns1eth$i nodad122 ip -net "$ns1" link set ns1eth$i up123 124 ip -net "$ns2" addr add 10.0.$i.2/24 dev ns2eth$i125 ip -net "$ns2" addr add dead:beef:$i::2/64 dev ns2eth$i nodad126 ip -net "$ns2" link set ns2eth$i up127 128 # let $ns2 reach any $ns1 address from any interface129 ip -net "$ns2" route add default via 10.0.$i.1 dev ns2eth$i metric 10$i130 ip -net "$ns2" route add default via dead:beef:$i::1 dev ns2eth$i metric 10$i131 done132}133 134init_shapers()135{136 local i137 for i in $(seq 1 4); do138 tc -n $ns1 qdisc add dev ns1eth$i root netem rate 20mbit delay 1ms139 tc -n $ns2 qdisc add dev ns2eth$i root netem rate 20mbit delay 1ms140 done141}142 143cleanup_partial()144{145 rm -f "$capout"146 147 mptcp_lib_ns_exit "${ns1}" "${ns2}"148}149 150init() {151 init=1152 153 mptcp_lib_check_mptcp154 mptcp_lib_check_kallsyms155 mptcp_lib_check_tools ip tc ss "${iptables}" "${ip6tables}"156 157 sin=$(mktemp)158 sout=$(mktemp)159 cin=$(mktemp)160 cinsent=$(mktemp)161 cout=$(mktemp)162 err=$(mktemp)163 evts_ns1=$(mktemp)164 evts_ns2=$(mktemp)165 166 trap cleanup EXIT167 168 make_file "$cin" "client" 1 >/dev/null169 make_file "$sin" "server" 1 >/dev/null170}171 172cleanup()173{174 rm -f "$cin" "$cout" "$sinfail"175 rm -f "$sin" "$sout" "$cinsent" "$cinfail"176 rm -f "$tmpfile"177 rm -rf $evts_ns1 $evts_ns2178 rm -f "$err"179 cleanup_partial180}181 182print_check()183{184 printf "%-${nr_blank}s%-36s" " " "${*}"185}186 187print_info()188{189 # It can be empty, no need to print anything then190 [ -z "${1}" ] && return191 192 mptcp_lib_print_info " Info: ${*}"193}194 195print_ok()196{197 mptcp_lib_pr_ok "${@}"198}199 200print_fail()201{202 mptcp_lib_pr_fail "${@}"203}204 205print_skip()206{207 mptcp_lib_pr_skip "${@}"208}209 210# $1: check name; $2: rc211print_results()212{213 local check="${1}"214 local rc=${2}215 216 print_check "${check}"217 if [ ${rc} = ${KSFT_PASS} ]; then218 print_ok219 elif [ ${rc} = ${KSFT_SKIP} ]; then220 print_skip221 else222 fail_test "see above"223 fi224}225 226# [ $1: fail msg ]227mark_as_skipped()228{229 local msg="${1:-"Feature not supported"}"230 231 mptcp_lib_fail_if_expected_feature "${msg}"232 233 print_check "${msg}"234 print_skip235 236 last_test_skipped=1237}238 239# $@: condition240continue_if()241{242 if ! "${@}"; then243 mark_as_skipped244 return 1245 fi246}247 248skip_test()249{250 if [ "${#only_tests_ids[@]}" -eq 0 ] && [ "${#only_tests_names[@]}" -eq 0 ]; then251 return 1252 fi253 254 local i255 for i in "${only_tests_ids[@]}"; do256 if [ "$((MPTCP_LIB_TEST_COUNTER+1))" -eq "${i}" ]; then257 return 1258 fi259 done260 for i in "${only_tests_names[@]}"; do261 if [ "${TEST_NAME}" = "${i}" ]; then262 return 1263 fi264 done265 266 return 0267}268 269append_prev_results()270{271 if [ ${last_test_failed} -eq 1 ]; then272 mptcp_lib_result_fail "${TEST_NAME}"273 elif [ ${last_test_skipped} -eq 1 ]; then274 mptcp_lib_result_skip "${TEST_NAME}"275 elif [ ${last_test_ignored} -ne 1 ]; then276 mptcp_lib_result_pass "${TEST_NAME}"277 fi278 279 last_test_failed=0280 last_test_skipped=0281 last_test_ignored=0282}283 284# $1: test name285reset()286{287 append_prev_results288 289 TEST_NAME="${1}"290 291 MPTCP_LIB_SUBTEST_FLAKY=0 # reset if modified292 293 if skip_test; then294 MPTCP_LIB_TEST_COUNTER=$((MPTCP_LIB_TEST_COUNTER+1))295 last_test_ignored=1296 return 1297 fi298 299 mptcp_lib_print_title "${TEST_NAME}"300 301 if [ "${init}" != "1" ]; then302 init303 else304 cleanup_partial305 fi306 307 init_partial308 309 return 0310}311 312# $1: test name ; $2: counter to check313reset_check_counter()314{315 reset "${1}" || return 1316 317 local counter="${2}"318 319 if ! nstat -asz "${counter}" | grep -wq "${counter}"; then320 mark_as_skipped "counter '${counter}' is not available"321 return 1322 fi323}324 325# $1: test name326reset_with_cookies()327{328 reset "${1}" || return 1329 330 local netns331 for netns in "$ns1" "$ns2"; do332 ip netns exec $netns sysctl -q net.ipv4.tcp_syncookies=2333 done334}335 336# $1: test name337reset_with_add_addr_timeout()338{339 local ip="${2:-4}"340 local tables341 342 reset "${1}" || return 1343 344 tables="${iptables}"345 if [ $ip -eq 6 ]; then346 tables="${ip6tables}"347 fi348 349 ip netns exec $ns1 sysctl -q net.mptcp.add_addr_timeout=1350 351 if ! ip netns exec $ns2 $tables -A OUTPUT -p tcp \352 -m tcp --tcp-option 30 \353 -m bpf --bytecode \354 "$CBPF_MPTCP_SUBOPTION_ADD_ADDR" \355 -j DROP; then356 mark_as_skipped "unable to set the 'add addr' rule"357 return 1358 fi359}360 361# $1: test name362reset_with_checksum()363{364 local ns1_enable=$1365 local ns2_enable=$2366 367 reset "checksum test ${ns1_enable} ${ns2_enable}" || return 1368 369 ip netns exec $ns1 sysctl -q net.mptcp.checksum_enabled=$ns1_enable370 ip netns exec $ns2 sysctl -q net.mptcp.checksum_enabled=$ns2_enable371 372 validate_checksum=true373}374 375reset_with_allow_join_id0()376{377 local ns1_enable=$2378 local ns2_enable=$3379 380 reset "${1}" || return 1381 382 ip netns exec $ns1 sysctl -q net.mptcp.allow_join_initial_addr_port=$ns1_enable383 ip netns exec $ns2 sysctl -q net.mptcp.allow_join_initial_addr_port=$ns2_enable384}385 386# Modify TCP payload without corrupting the TCP packet387#388# This rule inverts a 8-bit word at byte offset 148 for the 2nd TCP ACK packets389# carrying enough data.390# Once it is done, the TCP Checksum field is updated so the packet is still391# considered as valid at the TCP level.392# Because the MPTCP checksum, covering the TCP options and data, has not been393# updated, the modification will be detected and an MP_FAIL will be emitted:394# what we want to validate here without corrupting "random" MPTCP options.395#396# To avoid having tc producing this pr_info() message for each TCP ACK packets397# not carrying enough data:398#399# tc action pedit offset 162 out of bounds400#401# Netfilter is used to mark packets with enough data.402setup_fail_rules()403{404 check_invert=1405 validate_checksum=true406 local i="$1"407 local ip="${2:-4}"408 local tables409 410 tables="${iptables}"411 if [ $ip -eq 6 ]; then412 tables="${ip6tables}"413 fi414 415 ip netns exec $ns2 $tables \416 -t mangle \417 -A OUTPUT \418 -o ns2eth$i \419 -p tcp \420 -m length --length 150:9999 \421 -m statistic --mode nth --packet 1 --every 99999 \422 -j MARK --set-mark 42 || return ${KSFT_SKIP}423 424 tc -n $ns2 qdisc add dev ns2eth$i clsact || return ${KSFT_SKIP}425 tc -n $ns2 filter add dev ns2eth$i egress \426 protocol ip prio 1000 \427 handle 42 fw \428 action pedit munge offset 148 u8 invert \429 pipe csum tcp \430 index 100 || return ${KSFT_SKIP}431}432 433reset_with_fail()434{435 reset_check_counter "${1}" "MPTcpExtInfiniteMapTx" || return 1436 shift437 438 ip netns exec $ns1 sysctl -q net.mptcp.checksum_enabled=1439 ip netns exec $ns2 sysctl -q net.mptcp.checksum_enabled=1440 441 local rc=0442 setup_fail_rules "${@}" || rc=$?443 444 if [ ${rc} -eq ${KSFT_SKIP} ]; then445 mark_as_skipped "unable to set the 'fail' rules"446 return 1447 fi448}449 450start_events()451{452 mptcp_lib_events "${ns1}" "${evts_ns1}" evts_ns1_pid453 mptcp_lib_events "${ns2}" "${evts_ns2}" evts_ns2_pid454}455 456reset_with_events()457{458 reset "${1}" || return 1459 460 start_events461}462 463reset_with_tcp_filter()464{465 reset "${1}" || return 1466 shift467 468 local ns="${!1}"469 local src="${2}"470 local target="${3}"471 local chain="${4:-INPUT}"472 473 if ! ip netns exec "${ns}" ${iptables} \474 -A "${chain}" \475 -s "${src}" \476 -p tcp \477 -j "${target}"; then478 mark_as_skipped "unable to set the filter rules"479 return 1480 fi481}482 483# $1: err msg484fail_test()485{486 if ! mptcp_lib_subtest_is_flaky; then487 ret=${KSFT_FAIL}488 fi489 490 if [ ${#} -gt 0 ]; then491 print_fail "${@}"492 fi493 494 # just in case a test is marked twice as failed495 if [ ${last_test_failed} -eq 0 ]; then496 failed_tests[${MPTCP_LIB_TEST_COUNTER}]="${TEST_NAME}"497 dump_stats498 last_test_failed=1499 fi500}501 502get_failed_tests_ids()503{504 # sorted505 local i506 for i in "${!failed_tests[@]}"; do507 echo "${i}"508 done | sort -n509}510 511check_transfer()512{513 local in=$1514 local out=$2515 local what=$3516 local bytes=$4517 local i a b518 519 local line520 if [ -n "$bytes" ]; then521 local out_size522 # when truncating we must check the size explicitly523 out_size=$(wc -c $out | awk '{print $1}')524 if [ $out_size -ne $bytes ]; then525 fail_test "$what output file has wrong size ($out_size, $bytes)"526 return 1527 fi528 529 # note: BusyBox's "cmp" command doesn't support --bytes530 tmpfile=$(mktemp)531 head --bytes="$bytes" "$in" > "$tmpfile"532 mv "$tmpfile" "$in"533 head --bytes="$bytes" "$out" > "$tmpfile"534 mv "$tmpfile" "$out"535 tmpfile=""536 fi537 cmp -l "$in" "$out" | while read -r i a b; do538 local sum=$((0${a} + 0${b}))539 if [ $check_invert -eq 0 ] || [ $sum -ne $((0xff)) ]; then540 fail_test "$what does not match (in, out):"541 mptcp_lib_print_file_err "$in"542 mptcp_lib_print_file_err "$out"543 544 return 1545 else546 print_info "$what has inverted byte at ${i}"547 fi548 done549 550 return 0551}552 553do_ping()554{555 local listener_ns="$1"556 local connector_ns="$2"557 local connect_addr="$3"558 559 if ! ip netns exec ${connector_ns} ping -q -c 1 $connect_addr >/dev/null; then560 fail_test "$listener_ns -> $connect_addr connectivity"561 fi562}563 564link_failure()565{566 local ns="$1"567 568 if [ -z "$FAILING_LINKS" ]; then569 l=$((RANDOM%4))570 FAILING_LINKS=$((l+1))571 fi572 573 local l574 for l in $FAILING_LINKS; do575 local veth="ns1eth$l"576 ip -net "$ns" link set "$veth" down577 done578}579 580rm_addr_count()581{582 mptcp_lib_get_counter "${1}" "MPTcpExtRmAddr"583}584 585# $1: ns, $2: old rm_addr counter in $ns586wait_rm_addr()587{588 local ns="${1}"589 local old_cnt="${2}"590 local cnt591 592 local i593 for i in $(seq 10); do594 cnt=$(rm_addr_count ${ns})595 [ "$cnt" = "${old_cnt}" ] || break596 sleep 0.1597 done598}599 600rm_sf_count()601{602 mptcp_lib_get_counter "${1}" "MPTcpExtRmSubflow"603}604 605# $1: ns, $2: old rm_sf counter in $ns606wait_rm_sf()607{608 local ns="${1}"609 local old_cnt="${2}"610 local cnt611 612 local i613 for i in $(seq 10); do614 cnt=$(rm_sf_count ${ns})615 [ "$cnt" = "${old_cnt}" ] || break616 sleep 0.1617 done618}619 620wait_mpj()621{622 local ns="${1}"623 local cnt old_cnt624 625 old_cnt=$(mptcp_lib_get_counter ${ns} "MPTcpExtMPJoinAckRx")626 627 local i628 for i in $(seq 10); do629 cnt=$(mptcp_lib_get_counter ${ns} "MPTcpExtMPJoinAckRx")630 [ "$cnt" = "${old_cnt}" ] || break631 sleep 0.1632 done633}634 635kill_events_pids()636{637 mptcp_lib_kill_wait $evts_ns1_pid638 evts_ns1_pid=0639 mptcp_lib_kill_wait $evts_ns2_pid640 evts_ns2_pid=0641}642 643pm_nl_set_limits()644{645 mptcp_lib_pm_nl_set_limits "${@}"646}647 648pm_nl_add_endpoint()649{650 mptcp_lib_pm_nl_add_endpoint "${@}"651}652 653pm_nl_del_endpoint()654{655 mptcp_lib_pm_nl_del_endpoint "${@}"656}657 658pm_nl_flush_endpoint()659{660 mptcp_lib_pm_nl_flush_endpoint "${@}"661}662 663pm_nl_show_endpoints()664{665 mptcp_lib_pm_nl_show_endpoints "${@}"666}667 668pm_nl_change_endpoint()669{670 mptcp_lib_pm_nl_change_endpoint "${@}"671}672 673pm_nl_check_endpoint()674{675 local msg="$1"676 local ns=$2677 local addr=$3678 local flags dev id port679 680 print_check "${msg}"681 682 shift 3683 while [ -n "$1" ]; do684 case "${1}" in685 "flags" | "dev" | "id" | "port")686 eval "${1}"="${2}"687 shift688 ;;689 *)690 ;;691 esac692 693 shift694 done695 696 if [ -z "${id}" ]; then697 fail_test "bad test - missing endpoint id"698 return699 fi700 701 check_output "mptcp_lib_pm_nl_get_endpoint ${ns} ${id}" \702 "$(mptcp_lib_pm_nl_format_endpoints \703 "${id},${addr},${flags//","/" "},${dev},${port}")"704}705 706pm_nl_set_endpoint()707{708 local listener_ns="$1"709 local connector_ns="$2"710 local connect_addr="$3"711 712 local addr_nr_ns1=${addr_nr_ns1:-0}713 local addr_nr_ns2=${addr_nr_ns2:-0}714 local sflags=${sflags:-""}715 local fullmesh=${fullmesh:-""}716 717 local flags="subflow"718 if [ -n "${fullmesh}" ]; then719 flags="${flags},fullmesh"720 addr_nr_ns2=${fullmesh}721 fi722 723 # let the mptcp subflow be established in background before724 # do endpoint manipulation725 if [ $addr_nr_ns1 != "0" ] || [ $addr_nr_ns2 != "0" ]; then726 sleep 1727 fi728 729 if [ $addr_nr_ns1 -gt 0 ]; then730 local counter=2731 local add_nr_ns1=${addr_nr_ns1}732 local id=10733 while [ $add_nr_ns1 -gt 0 ]; do734 local addr735 if mptcp_lib_is_v6 "${connect_addr}"; then736 addr="dead:beef:$counter::1"737 else738 addr="10.0.$counter.1"739 fi740 pm_nl_add_endpoint $ns1 $addr flags signal741 counter=$((counter + 1))742 add_nr_ns1=$((add_nr_ns1 - 1))743 id=$((id + 1))744 done745 elif [ $addr_nr_ns1 -lt 0 ]; then746 local rm_nr_ns1=$((-addr_nr_ns1))747 if [ $rm_nr_ns1 -lt 8 ]; then748 local counter=0749 local line750 pm_nl_show_endpoints ${listener_ns} | while read -r line; do751 # shellcheck disable=SC2206 # we do want to split per word752 local arr=($line)753 local nr=0754 755 local i756 for i in "${arr[@]}"; do757 if [ $i = "id" ]; then758 if [ $counter -eq $rm_nr_ns1 ]; then759 break760 fi761 id=${arr[$nr+1]}762 rm_addr=$(rm_addr_count ${connector_ns})763 pm_nl_del_endpoint ${listener_ns} $id764 wait_rm_addr ${connector_ns} ${rm_addr}765 counter=$((counter + 1))766 fi767 nr=$((nr + 1))768 done769 done770 elif [ $rm_nr_ns1 -eq 8 ]; then771 pm_nl_flush_endpoint ${listener_ns}772 elif [ $rm_nr_ns1 -eq 9 ]; then773 pm_nl_del_endpoint ${listener_ns} 0 ${connect_addr}774 fi775 fi776 777 # if newly added endpoints must be deleted, give the background msk778 # some time to created them779 [ $addr_nr_ns1 -gt 0 ] && [ $addr_nr_ns2 -lt 0 ] && sleep 1780 781 if [ $addr_nr_ns2 -gt 0 ]; then782 local add_nr_ns2=${addr_nr_ns2}783 local counter=3784 local id=20785 while [ $add_nr_ns2 -gt 0 ]; do786 local addr787 if mptcp_lib_is_v6 "${connect_addr}"; then788 addr="dead:beef:$counter::2"789 else790 addr="10.0.$counter.2"791 fi792 pm_nl_add_endpoint $ns2 $addr flags $flags793 counter=$((counter + 1))794 add_nr_ns2=$((add_nr_ns2 - 1))795 id=$((id + 1))796 done797 elif [ $addr_nr_ns2 -lt 0 ]; then798 local rm_nr_ns2=$((-addr_nr_ns2))799 if [ $rm_nr_ns2 -lt 8 ]; then800 local counter=0801 local line802 pm_nl_show_endpoints ${connector_ns} | while read -r line; do803 # shellcheck disable=SC2206 # we do want to split per word804 local arr=($line)805 local nr=0806 807 local i808 for i in "${arr[@]}"; do809 if [ $i = "id" ]; then810 if [ $counter -eq $rm_nr_ns2 ]; then811 break812 fi813 local id rm_addr814 # rm_addr are serialized, allow the previous one to815 # complete816 id=${arr[$nr+1]}817 rm_addr=$(rm_addr_count ${listener_ns})818 pm_nl_del_endpoint ${connector_ns} $id819 wait_rm_addr ${listener_ns} ${rm_addr}820 counter=$((counter + 1))821 fi822 nr=$((nr + 1))823 done824 done825 elif [ $rm_nr_ns2 -eq 8 ]; then826 pm_nl_flush_endpoint ${connector_ns}827 elif [ $rm_nr_ns2 -eq 9 ]; then828 local addr829 if mptcp_lib_is_v6 "${connect_addr}"; then830 addr="dead:beef:1::2"831 else832 addr="10.0.1.2"833 fi834 pm_nl_del_endpoint ${connector_ns} 0 $addr835 fi836 fi837 838 if [ -n "${sflags}" ]; then839 sleep 1840 841 local netns842 for netns in "$ns1" "$ns2"; do843 local line844 pm_nl_show_endpoints $netns | while read -r line; do845 # shellcheck disable=SC2206 # we do want to split per word846 local arr=($line)847 local nr=0848 local id849 850 local i851 for i in "${arr[@]}"; do852 if [ $i = "id" ]; then853 id=${arr[$nr+1]}854 fi855 nr=$((nr + 1))856 done857 pm_nl_change_endpoint $netns $id $sflags858 done859 done860 fi861}862 863chk_cestab_nr()864{865 local ns=$1866 local cestab=$2867 local count868 869 print_check "currently established: $cestab"870 count=$(mptcp_lib_get_counter ${ns} "MPTcpExtMPCurrEstab")871 if [ -z "$count" ]; then872 print_skip873 elif [ "$count" != "$cestab" ]; then874 fail_test "got $count current establish[s] expected $cestab"875 else876 print_ok877 fi878}879 880# $1 namespace 1, $2 namespace 2881check_cestab()882{883 if [ -n "${cestab_ns1}" ]; then884 chk_cestab_nr ${1} ${cestab_ns1}885 fi886 if [ -n "${cestab_ns2}" ]; then887 chk_cestab_nr ${2} ${cestab_ns2}888 fi889}890 891cond_start_capture()892{893 local ns="$1"894 895 :> "$capout"896 897 if $capture; then898 local capuser capfile899 if [ -z $SUDO_USER ]; then900 capuser=""901 else902 capuser="-Z $SUDO_USER"903 fi904 905 capfile=$(printf "mp_join-%02u-%s.pcap" "$MPTCP_LIB_TEST_COUNTER" "$ns")906 907 echo "Capturing traffic for test $MPTCP_LIB_TEST_COUNTER into $capfile"908 ip netns exec "$ns" tcpdump -i any -s 65535 -B 32768 $capuser -w "$capfile" > "$capout" 2>&1 &909 cappid=$!910 911 sleep 1912 fi913}914 915cond_stop_capture()916{917 if $capture; then918 sleep 1919 kill $cappid920 cat "$capout"921 fi922}923 924get_port()925{926 echo "$((10000 + MPTCP_LIB_TEST_COUNTER - 1))"927}928 929do_transfer()930{931 local listener_ns="$1"932 local connector_ns="$2"933 local cl_proto="$3"934 local srv_proto="$4"935 local connect_addr="$5"936 local port937 938 local FAILING_LINKS=${FAILING_LINKS:-""}939 local fastclose=${fastclose:-""}940 local speed=${speed:-"fast"}941 port=$(get_port)942 943 :> "$cout"944 :> "$sout"945 946 cond_start_capture ${listener_ns}947 948 NSTAT_HISTORY=/tmp/${listener_ns}.nstat ip netns exec ${listener_ns} \949 nstat -n950 NSTAT_HISTORY=/tmp/${connector_ns}.nstat ip netns exec ${connector_ns} \951 nstat -n952 953 local extra_args954 if [ $speed = "fast" ]; then955 extra_args="-j"956 elif [ $speed = "slow" ]; then957 extra_args="-r 50"958 elif [ $speed -gt 0 ]; then959 extra_args="-r ${speed}"960 fi961 962 local extra_cl_args=""963 local extra_srv_args=""964 local trunc_size=""965 if [ -n "${fastclose}" ]; then966 if [ ${test_linkfail} -le 1 ]; then967 fail_test "fastclose tests need test_linkfail argument"968 return 1969 fi970 971 # disconnect972 trunc_size=${test_linkfail}973 local side=${fastclose}974 975 if [ ${side} = "client" ]; then976 extra_cl_args="-f ${test_linkfail}"977 extra_srv_args="-f -1"978 elif [ ${side} = "server" ]; then979 extra_srv_args="-f ${test_linkfail}"980 extra_cl_args="-f -1"981 else982 fail_test "wrong/unknown fastclose spec ${side}"983 return 1984 fi985 fi986 987 extra_srv_args="$extra_args $extra_srv_args"988 if [ "$test_linkfail" -gt 1 ];then989 timeout ${timeout_test} \990 ip netns exec ${listener_ns} \991 ./mptcp_connect -t ${timeout_poll} -l -p $port -s ${srv_proto} \992 $extra_srv_args "::" < "$sinfail" > "$sout" &993 else994 timeout ${timeout_test} \995 ip netns exec ${listener_ns} \996 ./mptcp_connect -t ${timeout_poll} -l -p $port -s ${srv_proto} \997 $extra_srv_args "::" < "$sin" > "$sout" &998 fi999 local spid=$!1000 1001 mptcp_lib_wait_local_port_listen "${listener_ns}" "${port}"1002 1003 extra_cl_args="$extra_args $extra_cl_args"1004 if [ "$test_linkfail" -eq 0 ];then1005 timeout ${timeout_test} \1006 ip netns exec ${connector_ns} \1007 ./mptcp_connect -t ${timeout_poll} -p $port -s ${cl_proto} \1008 $extra_cl_args $connect_addr < "$cin" > "$cout" &1009 elif [ "$test_linkfail" -eq 1 ] || [ "$test_linkfail" -eq 2 ];then1010 ( cat "$cinfail" ; sleep 2; link_failure $listener_ns ; cat "$cinfail" ) | \1011 tee "$cinsent" | \1012 timeout ${timeout_test} \1013 ip netns exec ${connector_ns} \1014 ./mptcp_connect -t ${timeout_poll} -p $port -s ${cl_proto} \1015 $extra_cl_args $connect_addr > "$cout" &1016 else1017 tee "$cinsent" < "$cinfail" | \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 > "$cout" &1022 fi1023 local cpid=$!1024 1025 pm_nl_set_endpoint $listener_ns $connector_ns $connect_addr1026 check_cestab $listener_ns $connector_ns1027 1028 wait $cpid1029 local retc=$?1030 wait $spid1031 local rets=$?1032 1033 cond_stop_capture1034 1035 NSTAT_HISTORY=/tmp/${listener_ns}.nstat ip netns exec ${listener_ns} \1036 nstat | grep Tcp > /tmp/${listener_ns}.out1037 NSTAT_HISTORY=/tmp/${connector_ns}.nstat ip netns exec ${connector_ns} \1038 nstat | grep Tcp > /tmp/${connector_ns}.out1039 1040 if [ ${rets} -ne 0 ] || [ ${retc} -ne 0 ]; then1041 fail_test "client exit code $retc, server $rets"1042 echo -e "\nnetns ${listener_ns} socket stat for ${port}:" 1>&21043 ip netns exec ${listener_ns} ss -Menita 1>&2 -o "sport = :$port"1044 cat /tmp/${listener_ns}.out1045 echo -e "\nnetns ${connector_ns} socket stat for ${port}:" 1>&21046 ip netns exec ${connector_ns} ss -Menita 1>&2 -o "dport = :$port"1047 cat /tmp/${connector_ns}.out1048 1049 return 11050 fi1051 1052 if [ "$test_linkfail" -gt 1 ];then1053 check_transfer $sinfail $cout "file received by client" $trunc_size1054 else1055 check_transfer $sin $cout "file received by client" $trunc_size1056 fi1057 retc=$?1058 if [ "$test_linkfail" -eq 0 ];then1059 check_transfer $cin $sout "file received by server" $trunc_size1060 else1061 check_transfer $cinsent $sout "file received by server" $trunc_size1062 fi1063 rets=$?1064 1065 [ $retc -eq 0 ] && [ $rets -eq 0 ]1066}1067 1068make_file()1069{1070 local name=$11071 local who=$21072 local size=$31073 1074 mptcp_lib_make_file $name 1024 $size1075 1076 print_info "Test file (size $size KB) for $who"1077}1078 1079run_tests()1080{1081 local listener_ns="$1"1082 local connector_ns="$2"1083 local connect_addr="$3"1084 1085 local size1086 local test_linkfail=${test_linkfail:-0}1087 1088 # The values above 2 are reused to make test files1089 # with the given sizes (KB)1090 if [ "$test_linkfail" -gt 2 ]; then1091 size=$test_linkfail1092 1093 if [ -z "$cinfail" ]; then1094 cinfail=$(mktemp)1095 fi1096 make_file "$cinfail" "client" $size1097 # create the input file for the failure test when1098 # the first failure test run1099 elif [ "$test_linkfail" -ne 0 ] && [ -z "$cinfail" ]; then1100 # the client file must be considerably larger1101 # of the maximum expected cwin value, or the1102 # link utilization will be not predicable1103 size=$((RANDOM%2))1104 size=$((size+1))1105 size=$((size*8192))1106 size=$((size + ( RANDOM % 8192) ))1107 1108 cinfail=$(mktemp)1109 make_file "$cinfail" "client" $size1110 fi1111 1112 if [ "$test_linkfail" -gt 2 ]; then1113 size=$test_linkfail1114 1115 if [ -z "$sinfail" ]; then1116 sinfail=$(mktemp)1117 fi1118 make_file "$sinfail" "server" $size1119 elif [ "$test_linkfail" -eq 2 ] && [ -z "$sinfail" ]; then1120 size=$((RANDOM%16))1121 size=$((size+1))1122 size=$((size*2048))1123 1124 sinfail=$(mktemp)1125 make_file "$sinfail" "server" $size1126 fi1127 1128 do_transfer ${listener_ns} ${connector_ns} MPTCP MPTCP ${connect_addr}1129}1130 1131dump_stats()1132{1133 echo Server ns stats1134 ip netns exec $ns1 nstat -as | grep Tcp1135 echo Client ns stats1136 ip netns exec $ns2 nstat -as | grep Tcp1137}1138 1139chk_csum_nr()1140{1141 local csum_ns1=${1:-0}1142 local csum_ns2=${2:-0}1143 local count1144 local extra_msg=""1145 local allow_multi_errors_ns1=01146 local allow_multi_errors_ns2=01147 1148 if [[ "${csum_ns1}" = "+"* ]]; then1149 allow_multi_errors_ns1=11150 csum_ns1=${csum_ns1:1}1151 fi1152 if [[ "${csum_ns2}" = "+"* ]]; then1153 allow_multi_errors_ns2=11154 csum_ns2=${csum_ns2:1}1155 fi1156 1157 print_check "checksum server"1158 count=$(mptcp_lib_get_counter ${ns1} "MPTcpExtDataCsumErr")1159 if [ -n "$count" ] && [ "$count" != "$csum_ns1" ]; then1160 extra_msg+=" ns1=$count"1161 fi1162 if [ -z "$count" ]; then1163 print_skip1164 elif { [ "$count" != $csum_ns1 ] && [ $allow_multi_errors_ns1 -eq 0 ]; } ||1165 { [ "$count" -lt $csum_ns1 ] && [ $allow_multi_errors_ns1 -eq 1 ]; }; then1166 fail_test "got $count data checksum error[s] expected $csum_ns1"1167 else1168 print_ok1169 fi1170 1171 print_check "checksum client"1172 count=$(mptcp_lib_get_counter ${ns2} "MPTcpExtDataCsumErr")1173 if [ -n "$count" ] && [ "$count" != "$csum_ns2" ]; then1174 extra_msg+=" ns2=$count"1175 fi1176 if [ -z "$count" ]; then1177 print_skip1178 elif { [ "$count" != $csum_ns2 ] && [ $allow_multi_errors_ns2 -eq 0 ]; } ||1179 { [ "$count" -lt $csum_ns2 ] && [ $allow_multi_errors_ns2 -eq 1 ]; }; then1180 fail_test "got $count data checksum error[s] expected $csum_ns2"1181 else1182 print_ok1183 fi1184 1185 print_info "$extra_msg"1186}1187 1188chk_fail_nr()1189{1190 local fail_tx=$11191 local fail_rx=$21192 local ns_invert=${3:-""}1193 local count1194 local ns_tx=$ns11195 local ns_rx=$ns21196 local tx="server"1197 local rx="client"1198 local extra_msg=""1199 local allow_tx_lost=01200 local allow_rx_lost=01201 1202 if [[ $ns_invert = "invert" ]]; then1203 ns_tx=$ns21204 ns_rx=$ns11205 tx="client"1206 rx="server"1207 fi1208 1209 if [[ "${fail_tx}" = "-"* ]]; then1210 allow_tx_lost=11211 fail_tx=${fail_tx:1}1212 fi1213 if [[ "${fail_rx}" = "-"* ]]; then1214 allow_rx_lost=11215 fail_rx=${fail_rx:1}1216 fi1217 1218 print_check "fail tx ${tx}"1219 count=$(mptcp_lib_get_counter ${ns_tx} "MPTcpExtMPFailTx")1220 if [ -n "$count" ] && [ "$count" != "$fail_tx" ]; then1221 extra_msg+=" tx=$count"1222 fi1223 if [ -z "$count" ]; then1224 print_skip1225 elif { [ "$count" != "$fail_tx" ] && [ $allow_tx_lost -eq 0 ]; } ||1226 { [ "$count" -gt "$fail_tx" ] && [ $allow_tx_lost -eq 1 ]; }; then1227 fail_test "got $count MP_FAIL[s] TX expected $fail_tx"1228 else1229 print_ok1230 fi1231 1232 print_check "fail rx ${rx}"1233 count=$(mptcp_lib_get_counter ${ns_rx} "MPTcpExtMPFailRx")1234 if [ -n "$count" ] && [ "$count" != "$fail_rx" ]; then1235 extra_msg+=" rx=$count"1236 fi1237 if [ -z "$count" ]; then1238 print_skip1239 elif { [ "$count" != "$fail_rx" ] && [ $allow_rx_lost -eq 0 ]; } ||1240 { [ "$count" -gt "$fail_rx" ] && [ $allow_rx_lost -eq 1 ]; }; then1241 fail_test "got $count MP_FAIL[s] RX expected $fail_rx"1242 else1243 print_ok1244 fi1245 1246 print_info "$extra_msg"1247}1248 1249chk_fclose_nr()1250{1251 local fclose_tx=$11252 local fclose_rx=$21253 local ns_invert=$31254 local count1255 local ns_tx=$ns21256 local ns_rx=$ns11257 local tx="client"1258 local rx="server"1259 1260 if [[ $ns_invert = "invert" ]]; then1261 ns_tx=$ns11262 ns_rx=$ns21263 tx="server"1264 rx="client"1265 fi1266 1267 print_check "fast close tx ${tx}"1268 count=$(mptcp_lib_get_counter ${ns_tx} "MPTcpExtMPFastcloseTx")1269 if [ -z "$count" ]; then1270 print_skip1271 elif [ "$count" != "$fclose_tx" ]; then1272 fail_test "got $count MP_FASTCLOSE[s] TX expected $fclose_tx"1273 else1274 print_ok1275 fi1276 1277 print_check "fast close rx ${rx}"1278 count=$(mptcp_lib_get_counter ${ns_rx} "MPTcpExtMPFastcloseRx")1279 if [ -z "$count" ]; then1280 print_skip1281 elif [ "$count" != "$fclose_rx" ]; then1282 fail_test "got $count MP_FASTCLOSE[s] RX expected $fclose_rx"1283 else1284 print_ok1285 fi1286}1287 1288chk_rst_nr()1289{1290 local rst_tx=$11291 local rst_rx=$21292 local ns_invert=${3:-""}1293 local count1294 local ns_tx=$ns11295 local ns_rx=$ns21296 local tx="server"1297 local rx="client"1298 1299 if [[ $ns_invert = "invert" ]]; then1300 ns_tx=$ns21301 ns_rx=$ns11302 tx="client"1303 rx="server"1304 fi1305 1306 print_check "reset tx ${tx}"1307 count=$(mptcp_lib_get_counter ${ns_tx} "MPTcpExtMPRstTx")1308 if [ -z "$count" ]; then1309 print_skip1310 # accept more rst than expected except if we don't expect any1311 elif { [ $rst_tx -ne 0 ] && [ $count -lt $rst_tx ]; } ||1312 { [ $rst_tx -eq 0 ] && [ $count -ne 0 ]; }; then1313 fail_test "got $count MP_RST[s] TX expected $rst_tx"1314 else1315 print_ok1316 fi1317 1318 print_check "reset rx ${rx}"1319 count=$(mptcp_lib_get_counter ${ns_rx} "MPTcpExtMPRstRx")1320 if [ -z "$count" ]; then1321 print_skip1322 # accept more rst than expected except if we don't expect any1323 elif { [ $rst_rx -ne 0 ] && [ $count -lt $rst_rx ]; } ||1324 { [ $rst_rx -eq 0 ] && [ $count -ne 0 ]; }; then1325 fail_test "got $count MP_RST[s] RX expected $rst_rx"1326 else1327 print_ok1328 fi1329}1330 1331chk_infi_nr()1332{1333 local infi_tx=$11334 local infi_rx=$21335 local count1336 1337 print_check "infi tx client"1338 count=$(mptcp_lib_get_counter ${ns2} "MPTcpExtInfiniteMapTx")1339 if [ -z "$count" ]; then1340 print_skip1341 elif [ "$count" != "$infi_tx" ]; then1342 fail_test "got $count infinite map[s] TX expected $infi_tx"1343 else1344 print_ok1345 fi1346 1347 print_check "infi rx server"1348 count=$(mptcp_lib_get_counter ${ns1} "MPTcpExtInfiniteMapRx")1349 if [ -z "$count" ]; then1350 print_skip1351 elif [ "$count" != "$infi_rx" ]; then1352 fail_test "got $count infinite map[s] RX expected $infi_rx"1353 else1354 print_ok1355 fi1356}1357 1358chk_join_tx_nr()1359{1360 local syn_tx=${join_syn_tx:-0}1361 local create=${join_create_err:-0}1362 local bind=${join_bind_err:-0}1363 local connect=${join_connect_err:-0}1364 local rc=${KSFT_PASS}1365 local count1366 1367 count=$(mptcp_lib_get_counter ${ns2} "MPTcpExtMPJoinSynTx")1368 if [ -z "$count" ]; then1369 rc=${KSFT_SKIP}1370 elif [ "$count" != "$syn_tx" ]; then1371 rc=${KSFT_FAIL}1372 print_check "syn tx"1373 fail_test "got $count JOIN[s] syn tx expected $syn_tx"1374 fi1375 1376 count=$(mptcp_lib_get_counter ${ns2} "MPTcpExtMPJoinSynTxCreatSkErr")1377 if [ -z "$count" ]; then1378 rc=${KSFT_SKIP}1379 elif [ "$count" != "$create" ]; then1380 rc=${KSFT_FAIL}1381 print_check "syn tx create socket error"1382 fail_test "got $count JOIN[s] syn tx create socket error expected $create"1383 fi1384 1385 count=$(mptcp_lib_get_counter ${ns2} "MPTcpExtMPJoinSynTxBindErr")1386 if [ -z "$count" ]; then1387 rc=${KSFT_SKIP}1388 elif [ "$count" != "$bind" ]; then1389 rc=${KSFT_FAIL}1390 print_check "syn tx bind error"1391 fail_test "got $count JOIN[s] syn tx bind error expected $bind"1392 fi1393 1394 count=$(mptcp_lib_get_counter ${ns2} "MPTcpExtMPJoinSynTxConnectErr")1395 if [ -z "$count" ]; then1396 rc=${KSFT_SKIP}1397 elif [ "$count" != "$connect" ]; then1398 rc=${KSFT_FAIL}1399 print_check "syn tx connect error"1400 fail_test "got $count JOIN[s] syn tx connect error expected $connect"1401 fi1402 1403 print_results "join Tx" ${rc}1404}1405 1406chk_join_nr()1407{1408 local syn_nr=$11409 local syn_ack_nr=$21410 local ack_nr=$31411 local csum_ns1=${join_csum_ns1:-0}1412 local csum_ns2=${join_csum_ns2:-0}1413 local fail_nr=${join_fail_nr:-0}1414 local rst_nr=${join_rst_nr:-0}1415 local infi_nr=${join_infi_nr:-0}1416 local corrupted_pkts=${join_corrupted_pkts:-0}1417 local rc=${KSFT_PASS}1418 local count1419 local with_cookie1420 1421 if [ "${corrupted_pkts}" -gt 0 ]; then1422 print_info "${corrupted_pkts} corrupted pkts"1423 fi1424 1425 count=$(mptcp_lib_get_counter ${ns1} "MPTcpExtMPJoinSynRx")1426 if [ -z "$count" ]; then1427 rc=${KSFT_SKIP}1428 elif [ "$count" != "$syn_nr" ]; then1429 rc=${KSFT_FAIL}1430 print_check "syn rx"1431 fail_test "got $count JOIN[s] syn rx expected $syn_nr"1432 fi1433 1434 with_cookie=$(ip netns exec $ns2 sysctl -n net.ipv4.tcp_syncookies)1435 count=$(mptcp_lib_get_counter ${ns2} "MPTcpExtMPJoinSynAckRx")1436 if [ -z "$count" ]; then1437 rc=${KSFT_SKIP}1438 elif [ "$count" != "$syn_ack_nr" ]; then1439 # simult connections exceeding the limit with cookie enabled could go up to1440 # synack validation as the conn limit can be enforced reliably only after1441 # the subflow creation1442 if [ "$with_cookie" != 2 ] || [ "$count" -le "$syn_ack_nr" ] || [ "$count" -gt "$syn_nr" ]; then1443 rc=${KSFT_FAIL}1444 print_check "synack rx"1445 fail_test "got $count JOIN[s] synack rx expected $syn_ack_nr"1446 fi1447 fi1448 1449 count=$(mptcp_lib_get_counter ${ns1} "MPTcpExtMPJoinAckRx")1450 if [ -z "$count" ]; then1451 rc=${KSFT_SKIP}1452 elif [ "$count" != "$ack_nr" ]; then1453 rc=${KSFT_FAIL}1454 print_check "ack rx"1455 fail_test "got $count JOIN[s] ack rx expected $ack_nr"1456 fi1457 1458 print_results "join Rx" ${rc}1459 1460 join_syn_tx="${join_syn_tx:-${syn_nr}}" \1461 chk_join_tx_nr1462 1463 if $validate_checksum; then1464 chk_csum_nr $csum_ns1 $csum_ns21465 chk_fail_nr $fail_nr $fail_nr1466 chk_rst_nr $rst_nr $rst_nr1467 chk_infi_nr $infi_nr $infi_nr1468 fi1469}1470 1471# a negative value for 'stale_max' means no upper bound:1472# for bidirectional transfer, if one peer sleep for a while1473# - as these tests do - we can have a quite high number of1474# stale/recover conversions, proportional to1475# sleep duration/ MPTCP-level RTX interval.1476chk_stale_nr()1477{1478 local ns=$11479 local stale_min=$21480 local stale_max=$31481 local stale_delta=$41482 local dump_stats1483 local stale_nr1484 local recover_nr1485 1486 print_check "stale"1487 1488 stale_nr=$(mptcp_lib_get_counter ${ns} "MPTcpExtSubflowStale")1489 recover_nr=$(mptcp_lib_get_counter ${ns} "MPTcpExtSubflowRecover")1490 if [ -z "$stale_nr" ] || [ -z "$recover_nr" ]; then1491 print_skip1492 elif [ $stale_nr -lt $stale_min ] ||1493 { [ $stale_max -gt 0 ] && [ $stale_nr -gt $stale_max ]; } ||1494 [ $((stale_nr - recover_nr)) -ne $stale_delta ]; then1495 fail_test "got $stale_nr stale[s] $recover_nr recover[s], " \1496 " expected stale in range [$stale_min..$stale_max]," \1497 " stale-recover delta $stale_delta"1498 dump_stats=11499 else1500 print_ok1501 fi1502 1503 if [ "${dump_stats}" = 1 ]; then1504 echo $ns stats1505 ip netns exec $ns ip -s link show1506 ip netns exec $ns nstat -as | grep MPTcp1507 fi1508}1509 1510chk_add_nr()1511{1512 local add_nr=$11513 local echo_nr=$21514 local port_nr=${3:-0}1515 local ns_invert=${4:-""}1516 local syn_nr=$port_nr1517 local syn_ack_nr=$port_nr1518 local ack_nr=$port_nr1519 local mis_syn_nr=01520 local mis_ack_nr=01521 local ns_tx=$ns11522 local ns_rx=$ns21523 local tx=""1524 local rx=""1525 local count1526 local timeout1527 1528 if [[ $ns_invert = "invert" ]]; then1529 ns_tx=$ns21530 ns_rx=$ns11531 tx=" client"1532 rx=" server"1533 fi1534 1535 timeout=$(ip netns exec ${ns_tx} sysctl -n net.mptcp.add_addr_timeout)1536 1537 print_check "add addr rx${rx}"1538 count=$(mptcp_lib_get_counter ${ns_rx} "MPTcpExtAddAddr")1539 if [ -z "$count" ]; then1540 print_skip1541 # if the test configured a short timeout tolerate greater then expected1542 # add addrs options, due to retransmissions1543 elif [ "$count" != "$add_nr" ] && { [ "$timeout" -gt 1 ] || [ "$count" -lt "$add_nr" ]; }; then1544 fail_test "got $count ADD_ADDR[s] expected $add_nr"1545 else1546 print_ok1547 fi1548 1549 print_check "add addr echo rx${tx}"1550 count=$(mptcp_lib_get_counter ${ns_tx} "MPTcpExtEchoAdd")1551 if [ -z "$count" ]; then1552 print_skip1553 elif [ "$count" != "$echo_nr" ]; then1554 fail_test "got $count ADD_ADDR echo[s] expected $echo_nr"1555 else1556 print_ok1557 fi1558 1559 if [ $port_nr -gt 0 ]; then1560 print_check "add addr rx with port${rx}"1561 count=$(mptcp_lib_get_counter ${ns_rx} "MPTcpExtPortAdd")1562 if [ -z "$count" ]; then1563 print_skip1564 elif [ "$count" != "$port_nr" ]; then1565 fail_test "got $count ADD_ADDR[s] with a port-number expected $port_nr"1566 else1567 print_ok1568 fi1569 1570 print_check "syn rx port${tx}"1571 count=$(mptcp_lib_get_counter ${ns_tx} "MPTcpExtMPJoinPortSynRx")1572 if [ -z "$count" ]; then1573 print_skip1574 elif [ "$count" != "$syn_nr" ]; then1575 fail_test "got $count JOIN[s] syn with a different \1576 port-number expected $syn_nr"1577 else1578 print_ok1579 fi1580 1581 print_check "synack rx port${rx}"1582 count=$(mptcp_lib_get_counter ${ns_rx} "MPTcpExtMPJoinPortSynAckRx")1583 if [ -z "$count" ]; then1584 print_skip1585 elif [ "$count" != "$syn_ack_nr" ]; then1586 fail_test "got $count JOIN[s] synack with a different \1587 port-number expected $syn_ack_nr"1588 else1589 print_ok1590 fi1591 1592 print_check "ack rx port${tx}"1593 count=$(mptcp_lib_get_counter ${ns_tx} "MPTcpExtMPJoinPortAckRx")1594 if [ -z "$count" ]; then1595 print_skip1596 elif [ "$count" != "$ack_nr" ]; then1597 fail_test "got $count JOIN[s] ack with a different \1598 port-number expected $ack_nr"1599 else1600 print_ok1601 fi1602 1603 print_check "syn rx port mismatch${tx}"1604 count=$(mptcp_lib_get_counter ${ns_tx} "MPTcpExtMismatchPortSynRx")1605 if [ -z "$count" ]; then1606 print_skip1607 elif [ "$count" != "$mis_syn_nr" ]; then1608 fail_test "got $count JOIN[s] syn with a mismatched \1609 port-number expected $mis_syn_nr"1610 else1611 print_ok1612 fi1613 1614 print_check "ack rx port mismatch${tx}"1615 count=$(mptcp_lib_get_counter ${ns_tx} "MPTcpExtMismatchPortAckRx")1616 if [ -z "$count" ]; then1617 print_skip1618 elif [ "$count" != "$mis_ack_nr" ]; then1619 fail_test "got $count JOIN[s] ack with a mismatched \1620 port-number expected $mis_ack_nr"1621 else1622 print_ok1623 fi1624 fi1625}1626 1627chk_add_tx_nr()1628{1629 local add_tx_nr=$11630 local echo_tx_nr=$21631 local timeout1632 local count1633 1634 timeout=$(ip netns exec $ns1 sysctl -n net.mptcp.add_addr_timeout)1635 1636 print_check "add addr tx"1637 count=$(mptcp_lib_get_counter ${ns1} "MPTcpExtAddAddrTx")1638 if [ -z "$count" ]; then1639 print_skip1640 # if the test configured a short timeout tolerate greater then expected1641 # add addrs options, due to retransmissions1642 elif [ "$count" != "$add_tx_nr" ] && { [ "$timeout" -gt 1 ] || [ "$count" -lt "$add_tx_nr" ]; }; then1643 fail_test "got $count ADD_ADDR[s] TX, expected $add_tx_nr"1644 else1645 print_ok1646 fi1647 1648 print_check "add addr echo tx"1649 count=$(mptcp_lib_get_counter ${ns2} "MPTcpExtEchoAddTx")1650 if [ -z "$count" ]; then1651 print_skip1652 elif [ "$count" != "$echo_tx_nr" ]; then1653 fail_test "got $count ADD_ADDR echo[s] TX, expected $echo_tx_nr"1654 else1655 print_ok1656 fi1657}1658 1659chk_rm_nr()1660{1661 local rm_addr_nr=$11662 local rm_subflow_nr=$21663 local invert1664 local simult1665 local count1666 local addr_ns=$ns11667 local subflow_ns=$ns21668 local addr="server"1669 local subflow="client"1670 local extra_msg=""1671 1672 shift 21673 while [ -n "$1" ]; do1674 [ "$1" = "invert" ] && invert=true1675 [ "$1" = "simult" ] && simult=true1676 shift1677 done1678 1679 if [ "$invert" = "true" ]; then1680 addr_ns=$ns21681 subflow_ns=$ns11682 addr="client"1683 subflow="server"1684 fi1685 1686 print_check "rm addr rx ${addr}"1687 count=$(mptcp_lib_get_counter ${addr_ns} "MPTcpExtRmAddr")1688 if [ -z "$count" ]; then1689 print_skip1690 elif [ "$count" != "$rm_addr_nr" ]; then1691 fail_test "got $count RM_ADDR[s] expected $rm_addr_nr"1692 else1693 print_ok1694 fi1695 1696 print_check "rm subflow ${subflow}"1697 count=$(mptcp_lib_get_counter ${subflow_ns} "MPTcpExtRmSubflow")1698 if [ -z "$count" ]; then1699 print_skip1700 elif [ -n "$simult" ]; then1701 local cnt suffix1702 1703 cnt=$(mptcp_lib_get_counter ${addr_ns} "MPTcpExtRmSubflow")1704 1705 # in case of simult flush, the subflow removal count on each side is1706 # unreliable1707 count=$((count + cnt))1708 if [ "$count" != "$rm_subflow_nr" ]; then1709 suffix="$count in [$rm_subflow_nr:$((rm_subflow_nr*2))]"1710 extra_msg="simult"1711 fi1712 if [ $count -ge "$rm_subflow_nr" ] && \1713 [ "$count" -le "$((rm_subflow_nr *2 ))" ]; then1714 print_ok "$suffix"1715 else1716 fail_test "got $count RM_SUBFLOW[s] expected in range [$rm_subflow_nr:$((rm_subflow_nr*2))]"1717 fi1718 elif [ "$count" != "$rm_subflow_nr" ]; then1719 fail_test "got $count RM_SUBFLOW[s] expected $rm_subflow_nr"1720 else1721 print_ok1722 fi1723 1724 print_info "$extra_msg"1725}1726 1727chk_rm_tx_nr()1728{1729 local rm_addr_tx_nr=$11730 1731 print_check "rm addr tx client"1732 count=$(mptcp_lib_get_counter ${ns2} "MPTcpExtRmAddrTx")1733 if [ -z "$count" ]; then1734 print_skip1735 elif [ "$count" != "$rm_addr_tx_nr" ]; then1736 fail_test "got $count RM_ADDR[s] expected $rm_addr_tx_nr"1737 else1738 print_ok1739 fi1740}1741 1742chk_prio_nr()1743{1744 local mp_prio_nr_tx=$11745 local mp_prio_nr_rx=$21746 local mpj_syn=$31747 local mpj_syn_ack=$41748 local count1749 1750 print_check "mp_prio tx server"1751 count=$(mptcp_lib_get_counter ${ns1} "MPTcpExtMPPrioTx")1752 if [ -z "$count" ]; then1753 print_skip1754 elif [ "$count" != "$mp_prio_nr_tx" ]; then1755 fail_test "got $count MP_PRIO[s] TX expected $mp_prio_nr_tx"1756 else1757 print_ok1758 fi1759 1760 print_check "mp_prio rx client"1761 count=$(mptcp_lib_get_counter ${ns1} "MPTcpExtMPPrioRx")1762 if [ -z "$count" ]; then1763 print_skip1764 elif [ "$count" != "$mp_prio_nr_rx" ]; then1765 fail_test "got $count MP_PRIO[s] RX expected $mp_prio_nr_rx"1766 else1767 print_ok1768 fi1769 1770 print_check "syn backup"1771 count=$(mptcp_lib_get_counter ${ns1} "MPTcpExtMPJoinSynBackupRx")1772 if [ -z "$count" ]; then1773 print_skip1774 elif [ "$count" != "$mpj_syn" ]; then1775 fail_test "got $count JOIN[s] syn with Backup expected $mpj_syn"1776 else1777 print_ok1778 fi1779 1780 print_check "synack backup"1781 count=$(mptcp_lib_get_counter ${ns2} "MPTcpExtMPJoinSynAckBackupRx")1782 if [ -z "$count" ]; then1783 print_skip1784 elif [ "$count" != "$mpj_syn_ack" ]; then1785 fail_test "got $count JOIN[s] synack with Backup expected $mpj_syn_ack"1786 else1787 print_ok1788 fi1789}1790 1791chk_subflow_nr()1792{1793 local msg="$1"1794 local subflow_nr=$21795 local cnt11796 local cnt21797 local dump_stats1798 1799 print_check "${msg}"1800 1801 cnt1=$(ss -N $ns1 -tOni | grep -c token)1802 cnt2=$(ss -N $ns2 -tOni | grep -c token)1803 if [ "$cnt1" != "$subflow_nr" ] || [ "$cnt2" != "$subflow_nr" ]; then1804 fail_test "got $cnt1:$cnt2 subflows expected $subflow_nr"1805 dump_stats=11806 else1807 print_ok1808 fi1809 1810 if [ "${dump_stats}" = 1 ]; then1811 ss -N $ns1 -tOni1812 ss -N $ns1 -tOni | grep token1813 ip -n $ns1 mptcp endpoint1814 fi1815}1816 1817chk_mptcp_info()1818{1819 local info1=$11820 local exp1=$21821 local info2=$31822 local exp2=$41823 local cnt11824 local cnt21825 local dump_stats1826 1827 print_check "mptcp_info ${info1:0:15}=$exp1:$exp2"1828 1829 cnt1=$(ss -N $ns1 -inmHM | mptcp_lib_get_info_value "$info1" "$info1")1830 cnt2=$(ss -N $ns2 -inmHM | mptcp_lib_get_info_value "$info2" "$info2")1831 # 'ss' only display active connections and counters that are not 0.1832 [ -z "$cnt1" ] && cnt1=01833 [ -z "$cnt2" ] && cnt2=01834 1835 if [ "$cnt1" != "$exp1" ] || [ "$cnt2" != "$exp2" ]; then1836 fail_test "got $cnt1:$cnt2 $info1:$info2 expected $exp1:$exp2"1837 dump_stats=11838 else1839 print_ok1840 fi1841 1842 if [ "$dump_stats" = 1 ]; then1843 ss -N $ns1 -inmHM1844 ss -N $ns2 -inmHM1845 fi1846}1847 1848# $1: subflows in ns1 ; $2: subflows in ns21849# number of all subflows, including the initial subflow.1850chk_subflows_total()1851{1852 local cnt11853 local cnt21854 local info="subflows_total"1855 local dump_stats1856 1857 # if subflows_total counter is supported, use it:1858 if [ -n "$(ss -N $ns1 -inmHM | mptcp_lib_get_info_value $info $info)" ]; then1859 chk_mptcp_info $info $1 $info $21860 return1861 fi1862 1863 print_check "$info $1:$2"1864 1865 # if not, count the TCP connections that are in fact MPTCP subflows1866 cnt1=$(ss -N $ns1 -ti state established state syn-sent state syn-recv |1867 grep -c tcp-ulp-mptcp)1868 cnt2=$(ss -N $ns2 -ti state established state syn-sent state syn-recv |1869 grep -c tcp-ulp-mptcp)1870 1871 if [ "$1" != "$cnt1" ] || [ "$2" != "$cnt2" ]; then1872 fail_test "got subflows $cnt1:$cnt2 expected $1:$2"1873 dump_stats=11874 else1875 print_ok1876 fi1877 1878 if [ "$dump_stats" = 1 ]; then1879 ss -N $ns1 -ti1880 ss -N $ns2 -ti1881 fi1882}1883 1884chk_link_usage()1885{1886 local ns=$11887 local link=$21888 local out=$31889 local expected_rate=$41890 1891 local tx_link tx_total1892 tx_link=$(ip netns exec $ns cat /sys/class/net/$link/statistics/tx_bytes)1893 tx_total=$(stat --format=%s $out)1894 local tx_rate=$((tx_link * 100 / tx_total))1895 local tolerance=51896 1897 print_check "link usage"1898 if [ $tx_rate -lt $((expected_rate - tolerance)) ] || \1899 [ $tx_rate -gt $((expected_rate + tolerance)) ]; then1900 fail_test "got $tx_rate% usage, expected $expected_rate%"1901 else1902 print_ok1903 fi1904}1905 1906wait_attempt_fail()1907{1908 local timeout_ms=$((timeout_poll * 1000))1909 local time=01910 local ns=$11911 1912 while [ $time -lt $timeout_ms ]; do1913 local cnt1914 1915 cnt=$(mptcp_lib_get_counter ${ns} "TcpAttemptFails")1916 1917 [ "$cnt" = 1 ] && return 11918 time=$((time + 100))1919 sleep 0.11920 done1921 return 11922}1923 1924set_userspace_pm()1925{1926 local ns=$11927 1928 ip netns exec $ns sysctl -q net.mptcp.pm_type=11929}1930 1931subflows_tests()1932{1933 if reset "no JOIN"; then1934 run_tests $ns1 $ns2 10.0.1.11935 chk_join_nr 0 0 01936 fi1937 1938 # subflow limited by client1939 if reset "single subflow, limited by client"; then1940 pm_nl_set_limits $ns1 0 01941 pm_nl_set_limits $ns2 0 01942 pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow1943 run_tests $ns1 $ns2 10.0.1.11944 chk_join_nr 0 0 01945 fi1946 1947 # subflow limited by server1948 if reset "single subflow, limited by server"; then1949 pm_nl_set_limits $ns1 0 01950 pm_nl_set_limits $ns2 0 11951 pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow1952 run_tests $ns1 $ns2 10.0.1.11953 chk_join_nr 1 1 01954 fi1955 1956 # subflow1957 if reset "single subflow"; then1958 pm_nl_set_limits $ns1 0 11959 pm_nl_set_limits $ns2 0 11960 pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow1961 run_tests $ns1 $ns2 10.0.1.11962 chk_join_nr 1 1 11963 fi1964 1965 # multiple subflows1966 if reset "multiple subflows"; then1967 pm_nl_set_limits $ns1 0 21968 pm_nl_set_limits $ns2 0 21969 pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow1970 pm_nl_add_endpoint $ns2 10.0.2.2 flags subflow1971 run_tests $ns1 $ns2 10.0.1.11972 chk_join_nr 2 2 21973 fi1974 1975 # multiple subflows limited by server1976 if reset "multiple subflows, limited by server"; then1977 pm_nl_set_limits $ns1 0 11978 pm_nl_set_limits $ns2 0 21979 pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow1980 pm_nl_add_endpoint $ns2 10.0.2.2 flags subflow1981 run_tests $ns1 $ns2 10.0.1.11982 chk_join_nr 2 2 11983 fi1984 1985 # single subflow, dev1986 if reset "single subflow, dev"; then1987 pm_nl_set_limits $ns1 0 11988 pm_nl_set_limits $ns2 0 11989 pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow dev ns2eth31990 run_tests $ns1 $ns2 10.0.1.11991 chk_join_nr 1 1 11992 fi1993}1994 1995subflows_error_tests()1996{1997 # If a single subflow is configured, and matches the MPC src1998 # address, no additional subflow should be created1999 if reset "no MPC reuse with single endpoint"; then2000 pm_nl_set_limits $ns1 0 12001 pm_nl_set_limits $ns2 0 12002 pm_nl_add_endpoint $ns2 10.0.1.2 flags subflow2003 pm_nl_add_endpoint $ns2 10.0.12.2 flags subflow2004 speed=slow \2005 run_tests $ns1 $ns2 10.0.1.12006 join_bind_err=1 \2007 chk_join_nr 0 0 02008 fi2009 2010 # multiple subflows, with subflow creation error2011 if reset_with_tcp_filter "multi subflows, with failing subflow" ns1 10.0.3.2 REJECT &&2012 continue_if mptcp_lib_kallsyms_has "mptcp_pm_subflow_check_next$"; then2013 pm_nl_set_limits $ns1 0 22014 pm_nl_set_limits $ns2 0 22015 pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow2016 pm_nl_add_endpoint $ns2 10.0.2.2 flags subflow2017 speed=slow \2018 run_tests $ns1 $ns2 10.0.1.12019 join_syn_tx=2 \2020 chk_join_nr 1 1 12021 fi2022 2023 # multiple subflows, with subflow timeout on MPJ2024 if reset_with_tcp_filter "multi subflows, with subflow timeout" ns1 10.0.3.2 DROP &&2025 continue_if mptcp_lib_kallsyms_has "mptcp_pm_subflow_check_next$"; then2026 pm_nl_set_limits $ns1 0 22027 pm_nl_set_limits $ns2 0 22028 pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow2029 pm_nl_add_endpoint $ns2 10.0.2.2 flags subflow2030 speed=slow \2031 run_tests $ns1 $ns2 10.0.1.12032 join_syn_tx=2 \2033 chk_join_nr 1 1 12034 fi2035 2036 # multiple subflows, check that the endpoint corresponding to2037 # closed subflow (due to reset) is not reused if additional2038 # subflows are added later2039 if reset_with_tcp_filter "multi subflows, fair usage on close" ns1 10.0.3.2 REJECT &&2040 continue_if mptcp_lib_kallsyms_has "mptcp_pm_subflow_check_next$"; then2041 pm_nl_set_limits $ns1 0 12042 pm_nl_set_limits $ns2 0 12043 pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow2044 speed=slow \2045 run_tests $ns1 $ns2 10.0.1.1 &2046 2047 # mpj subflow will be in TW after the reset2048 wait_attempt_fail $ns22049 pm_nl_add_endpoint $ns2 10.0.2.2 flags subflow2050 wait2051 2052 # additional subflow could be created only if the PM select2053 # the later endpoint, skipping the already used one2054 join_syn_tx=2 \2055 chk_join_nr 1 1 12056 fi2057}2058 2059signal_address_tests()2060{2061 # add_address, unused2062 if reset "unused signal address"; then2063 pm_nl_add_endpoint $ns1 10.0.2.1 flags signal2064 run_tests $ns1 $ns2 10.0.1.12065 chk_join_nr 0 0 02066 chk_add_tx_nr 1 12067 chk_add_nr 1 12068 fi2069 2070 # accept and use add_addr2071 if reset "signal address"; then2072 pm_nl_set_limits $ns1 0 12073 pm_nl_set_limits $ns2 1 12074 pm_nl_add_endpoint $ns1 10.0.2.1 flags signal2075 run_tests $ns1 $ns2 10.0.1.12076 chk_join_nr 1 1 12077 chk_add_nr 1 12078 fi2079 2080 # accept and use add_addr with an additional subflow2081 # note: signal address in server ns and local addresses in client ns must2082 # belong to different subnets or one of the listed local address could be2083 # used for 'add_addr' subflow2084 if reset "subflow and signal"; then2085 pm_nl_add_endpoint $ns1 10.0.2.1 flags signal2086 pm_nl_set_limits $ns1 0 22087 pm_nl_set_limits $ns2 1 22088 pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow2089 run_tests $ns1 $ns2 10.0.1.12090 chk_join_nr 2 2 22091 chk_add_nr 1 12092 fi2093 2094 # uncommon: subflow and signal flags on the same endpoint2095 # or because the user wrongly picked both, but still expects the client2096 # to create additional subflows2097 if reset "subflow and signal together"; then2098 pm_nl_set_limits $ns1 0 22099 pm_nl_set_limits $ns2 0 22100 pm_nl_add_endpoint $ns2 10.0.3.2 flags signal,subflow2101 run_tests $ns1 $ns2 10.0.1.12102 chk_join_nr 1 1 12103 chk_add_nr 1 1 0 invert # only initiated by ns22104 chk_add_nr 0 0 0 # none initiated by ns12105 chk_rst_nr 0 0 invert # no RST sent by the client2106 chk_rst_nr 0 0 # no RST sent by the server2107 fi2108 2109 # accept and use add_addr with additional subflows2110 if reset "multiple subflows and signal"; then2111 pm_nl_set_limits $ns1 0 32112 pm_nl_add_endpoint $ns1 10.0.2.1 flags signal2113 pm_nl_set_limits $ns2 1 32114 pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow2115 pm_nl_add_endpoint $ns2 10.0.4.2 flags subflow2116 run_tests $ns1 $ns2 10.0.1.12117 chk_join_nr 3 3 32118 chk_add_nr 1 12119 fi2120 2121 # signal addresses2122 if reset "signal addresses"; then2123 pm_nl_set_limits $ns1 3 32124 pm_nl_add_endpoint $ns1 10.0.2.1 flags signal2125 pm_nl_add_endpoint $ns1 10.0.3.1 flags signal2126 pm_nl_add_endpoint $ns1 10.0.4.1 flags signal2127 pm_nl_set_limits $ns2 3 32128 run_tests $ns1 $ns2 10.0.1.12129 chk_join_nr 3 3 32130 chk_add_nr 3 32131 fi2132 2133 # signal invalid addresses2134 if reset "signal invalid addresses"; then2135 pm_nl_set_limits $ns1 3 32136 pm_nl_add_endpoint $ns1 10.0.12.1 flags signal2137 pm_nl_add_endpoint $ns1 10.0.3.1 flags signal2138 pm_nl_add_endpoint $ns1 10.0.14.1 flags signal2139 pm_nl_set_limits $ns2 3 32140 run_tests $ns1 $ns2 10.0.1.12141 join_syn_tx=3 \2142 chk_join_nr 1 1 12143 chk_add_nr 3 32144 fi2145 2146 # signal addresses race test2147 if reset "signal addresses race test"; then2148 pm_nl_set_limits $ns1 4 42149 pm_nl_set_limits $ns2 4 42150 pm_nl_add_endpoint $ns1 10.0.1.1 flags signal2151 pm_nl_add_endpoint $ns1 10.0.2.1 flags signal2152 pm_nl_add_endpoint $ns1 10.0.3.1 flags signal2153 pm_nl_add_endpoint $ns1 10.0.4.1 flags signal2154 pm_nl_add_endpoint $ns2 10.0.1.2 flags signal2155 pm_nl_add_endpoint $ns2 10.0.2.2 flags signal2156 pm_nl_add_endpoint $ns2 10.0.3.2 flags signal2157 pm_nl_add_endpoint $ns2 10.0.4.2 flags signal2158 2159 # the peer could possibly miss some addr notification, allow retransmission2160 ip netns exec $ns1 sysctl -q net.mptcp.add_addr_timeout=12161 speed=slow \2162 run_tests $ns1 $ns2 10.0.1.12163 2164 # It is not directly linked to the commit introducing this2165 # symbol but for the parent one which is linked anyway.2166 if ! mptcp_lib_kallsyms_has "mptcp_pm_subflow_check_next$"; then2167 chk_join_nr 3 3 22168 chk_add_nr 4 42169 else2170 chk_join_nr 3 3 32171 # the server will not signal the address terminating2172 # the MPC subflow2173 chk_add_nr 3 32174 fi2175 fi2176}2177 2178link_failure_tests()2179{2180 # accept and use add_addr with additional subflows and link loss2181 if reset "multiple flows, signal, link failure"; then2182 # without any b/w limit each veth could spool the packets and get2183 # them acked at xmit time, so that the corresponding subflow will2184 # have almost always no outstanding pkts, the scheduler will pick2185 # always the first subflow and we will have hard time testing2186 # active backup and link switch-over.2187 # Let's set some arbitrary (low) virtual link limits.2188 init_shapers2189 pm_nl_set_limits $ns1 0 32190 pm_nl_add_endpoint $ns1 10.0.2.1 dev ns1eth2 flags signal2191 pm_nl_set_limits $ns2 1 32192 pm_nl_add_endpoint $ns2 10.0.3.2 dev ns2eth3 flags subflow2193 pm_nl_add_endpoint $ns2 10.0.4.2 dev ns2eth4 flags subflow2194 test_linkfail=1 \2195 run_tests $ns1 $ns2 10.0.1.12196 chk_join_nr 3 3 32197 chk_add_nr 1 12198 chk_stale_nr $ns2 1 5 12199 fi2200 2201 # accept and use add_addr with additional subflows and link loss2202 # for bidirectional transfer2203 if reset "multi flows, signal, bidi, link fail"; then2204 init_shapers2205 pm_nl_set_limits $ns1 0 32206 pm_nl_add_endpoint $ns1 10.0.2.1 dev ns1eth2 flags signal2207 pm_nl_set_limits $ns2 1 32208 pm_nl_add_endpoint $ns2 10.0.3.2 dev ns2eth3 flags subflow2209 pm_nl_add_endpoint $ns2 10.0.4.2 dev ns2eth4 flags subflow2210 test_linkfail=2 \2211 run_tests $ns1 $ns2 10.0.1.12212 chk_join_nr 3 3 32213 chk_add_nr 1 12214 chk_stale_nr $ns2 1 -1 12215 fi2216 2217 # 2 subflows plus 1 backup subflow with a lossy link, backup2218 # will never be used2219 if reset "backup subflow unused, link failure"; then2220 init_shapers2221 pm_nl_set_limits $ns1 0 22222 pm_nl_add_endpoint $ns1 10.0.2.1 dev ns1eth2 flags signal2223 pm_nl_set_limits $ns2 1 22224 pm_nl_add_endpoint $ns2 10.0.3.2 dev ns2eth3 flags subflow,backup2225 FAILING_LINKS="1" test_linkfail=1 \2226 run_tests $ns1 $ns2 10.0.1.12227 chk_join_nr 2 2 22228 chk_add_nr 1 12229 chk_link_usage $ns2 ns2eth3 $cinsent 02230 fi2231 2232 # 2 lossy links after half transfer, backup will get half of2233 # the traffic2234 if reset "backup flow used, multi links fail"; then2235 init_shapers2236 pm_nl_set_limits $ns1 0 22237 pm_nl_add_endpoint $ns1 10.0.2.1 dev ns1eth2 flags signal2238 pm_nl_set_limits $ns2 1 22239 pm_nl_add_endpoint $ns2 10.0.3.2 dev ns2eth3 flags subflow,backup2240 FAILING_LINKS="1 2" test_linkfail=1 \2241 run_tests $ns1 $ns2 10.0.1.12242 chk_join_nr 2 2 22243 chk_add_nr 1 12244 chk_stale_nr $ns2 2 4 22245 chk_link_usage $ns2 ns2eth3 $cinsent 502246 fi2247 2248 # use a backup subflow with the first subflow on a lossy link2249 # for bidirectional transfer2250 if reset "backup flow used, bidi, link failure"; then2251 init_shapers2252 pm_nl_set_limits $ns1 0 22253 pm_nl_add_endpoint $ns1 10.0.2.1 dev ns1eth2 flags signal2254 pm_nl_set_limits $ns2 1 32255 pm_nl_add_endpoint $ns2 10.0.3.2 dev ns2eth3 flags subflow,backup2256 FAILING_LINKS="1 2" test_linkfail=2 \2257 run_tests $ns1 $ns2 10.0.1.12258 chk_join_nr 2 2 22259 chk_add_nr 1 12260 chk_stale_nr $ns2 1 -1 22261 chk_link_usage $ns2 ns2eth3 $cinsent 502262 fi2263}2264 2265add_addr_timeout_tests()2266{2267 # add_addr timeout2268 if reset_with_add_addr_timeout "signal address, ADD_ADDR timeout"; then2269 pm_nl_set_limits $ns1 0 12270 pm_nl_set_limits $ns2 1 12271 pm_nl_add_endpoint $ns1 10.0.2.1 flags signal2272 speed=slow \2273 run_tests $ns1 $ns2 10.0.1.12274 chk_join_nr 1 1 12275 chk_add_tx_nr 4 42276 chk_add_nr 4 02277 fi2278 2279 # add_addr timeout IPv62280 if reset_with_add_addr_timeout "signal address, ADD_ADDR6 timeout" 6; then2281 pm_nl_set_limits $ns1 0 12282 pm_nl_set_limits $ns2 1 12283 pm_nl_add_endpoint $ns1 dead:beef:2::1 flags signal2284 speed=slow \2285 run_tests $ns1 $ns2 dead:beef:1::12286 chk_join_nr 1 1 12287 chk_add_nr 4 02288 fi2289 2290 # signal addresses timeout2291 if reset_with_add_addr_timeout "signal addresses, ADD_ADDR timeout"; then2292 pm_nl_set_limits $ns1 2 22293 pm_nl_add_endpoint $ns1 10.0.2.1 flags signal2294 pm_nl_add_endpoint $ns1 10.0.3.1 flags signal2295 pm_nl_set_limits $ns2 2 22296 speed=10 \2297 run_tests $ns1 $ns2 10.0.1.12298 chk_join_nr 2 2 22299 chk_add_nr 8 02300 fi2301 2302 # signal invalid addresses timeout2303 if reset_with_add_addr_timeout "invalid address, ADD_ADDR timeout"; then2304 pm_nl_set_limits $ns1 2 22305 pm_nl_add_endpoint $ns1 10.0.12.1 flags signal2306 pm_nl_add_endpoint $ns1 10.0.3.1 flags signal2307 pm_nl_set_limits $ns2 2 22308 speed=10 \2309 run_tests $ns1 $ns2 10.0.1.12310 join_syn_tx=2 \2311 chk_join_nr 1 1 12312 chk_add_nr 8 02313 fi2314}2315 2316remove_tests()2317{2318 # single subflow, remove2319 if reset "remove single subflow"; then2320 pm_nl_set_limits $ns1 0 12321 pm_nl_set_limits $ns2 0 12322 pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow2323 addr_nr_ns2=-1 speed=slow \2324 run_tests $ns1 $ns2 10.0.1.12325 chk_join_nr 1 1 12326 chk_rm_tx_nr 12327 chk_rm_nr 1 12328 chk_rst_nr 0 02329 fi2330 2331 # multiple subflows, remove2332 if reset "remove multiple subflows"; then2333 pm_nl_set_limits $ns1 0 22334 pm_nl_set_limits $ns2 0 22335 pm_nl_add_endpoint $ns2 10.0.2.2 flags subflow2336 pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow2337 addr_nr_ns2=-2 speed=slow \2338 run_tests $ns1 $ns2 10.0.1.12339 chk_join_nr 2 2 22340 chk_rm_nr 2 22341 chk_rst_nr 0 02342 fi2343 2344 # single address, remove2345 if reset "remove single address"; then2346 pm_nl_set_limits $ns1 0 12347 pm_nl_add_endpoint $ns1 10.0.2.1 flags signal2348 pm_nl_set_limits $ns2 1 12349 addr_nr_ns1=-1 speed=slow \2350 run_tests $ns1 $ns2 10.0.1.12351 chk_join_nr 1 1 12352 chk_add_nr 1 12353 chk_rm_nr 1 1 invert2354 chk_rst_nr 0 02355 fi2356 2357 # subflow and signal, remove2358 if reset "remove subflow and signal"; then2359 pm_nl_set_limits $ns1 0 22360 pm_nl_add_endpoint $ns1 10.0.2.1 flags signal2361 pm_nl_set_limits $ns2 1 22362 pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow2363 addr_nr_ns1=-1 addr_nr_ns2=-1 speed=slow \2364 run_tests $ns1 $ns2 10.0.1.12365 chk_join_nr 2 2 22366 chk_add_nr 1 12367 chk_rm_nr 1 12368 chk_rst_nr 0 02369 fi2370 2371 # subflows and signal, remove2372 if reset "remove subflows and signal"; then2373 pm_nl_set_limits $ns1 0 32374 pm_nl_add_endpoint $ns1 10.0.2.1 flags signal2375 pm_nl_set_limits $ns2 1 32376 pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow2377 pm_nl_add_endpoint $ns2 10.0.4.2 flags subflow2378 addr_nr_ns1=-1 addr_nr_ns2=-2 speed=10 \2379 run_tests $ns1 $ns2 10.0.1.12380 chk_join_nr 3 3 32381 chk_add_nr 1 12382 chk_rm_nr 2 22383 chk_rst_nr 0 02384 fi2385 2386 # addresses remove2387 if reset "remove addresses"; then2388 pm_nl_set_limits $ns1 3 32389 pm_nl_add_endpoint $ns1 10.0.2.1 flags signal id 2502390 pm_nl_add_endpoint $ns1 10.0.3.1 flags signal2391 pm_nl_add_endpoint $ns1 10.0.4.1 flags signal2392 pm_nl_set_limits $ns2 3 32393 addr_nr_ns1=-3 speed=10 \2394 run_tests $ns1 $ns2 10.0.1.12395 chk_join_nr 3 3 32396 chk_add_nr 3 32397 chk_rm_nr 3 3 invert2398 chk_rst_nr 0 02399 fi2400 2401 # invalid addresses remove2402 if reset "remove invalid addresses"; then2403 pm_nl_set_limits $ns1 3 32404 pm_nl_add_endpoint $ns1 10.0.12.1 flags signal2405 # broadcast IP: no packet for this address will be received on ns12406 pm_nl_add_endpoint $ns1 224.0.0.1 flags signal2407 pm_nl_add_endpoint $ns1 10.0.3.1 flags signal2408 pm_nl_set_limits $ns2 2 22409 addr_nr_ns1=-3 speed=10 \2410 run_tests $ns1 $ns2 10.0.1.12411 join_syn_tx=2 join_connect_err=1 \2412 chk_join_nr 1 1 12413 chk_add_nr 3 32414 chk_rm_nr 3 1 invert2415 chk_rst_nr 0 02416 fi2417 2418 # subflows and signal, flush2419 if reset "flush subflows and signal"; then2420 pm_nl_set_limits $ns1 0 32421 pm_nl_add_endpoint $ns1 10.0.2.1 flags signal2422 pm_nl_set_limits $ns2 1 32423 pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow2424 pm_nl_add_endpoint $ns2 10.0.4.2 flags subflow2425 addr_nr_ns1=-8 addr_nr_ns2=-8 speed=slow \2426 run_tests $ns1 $ns2 10.0.1.12427 chk_join_nr 3 3 32428 chk_add_nr 1 12429 chk_rm_nr 1 3 invert simult2430 chk_rst_nr 0 02431 fi2432 2433 # subflows flush2434 if reset "flush subflows"; then2435 pm_nl_set_limits $ns1 3 32436 pm_nl_set_limits $ns2 3 32437 pm_nl_add_endpoint $ns2 10.0.2.2 flags subflow id 1502438 pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow2439 pm_nl_add_endpoint $ns2 10.0.4.2 flags subflow2440 addr_nr_ns1=-8 addr_nr_ns2=-8 speed=slow \2441 run_tests $ns1 $ns2 10.0.1.12442 chk_join_nr 3 3 32443 2444 if mptcp_lib_kversion_ge 5.18; then2445 chk_rm_tx_nr 02446 chk_rm_nr 0 3 simult2447 else2448 chk_rm_nr 3 32449 fi2450 chk_rst_nr 0 02451 fi2452 2453 # addresses flush2454 if reset "flush addresses"; then2455 pm_nl_set_limits $ns1 3 32456 pm_nl_add_endpoint $ns1 10.0.2.1 flags signal id 2502457 pm_nl_add_endpoint $ns1 10.0.3.1 flags signal2458 pm_nl_add_endpoint $ns1 10.0.4.1 flags signal2459 pm_nl_set_limits $ns2 3 32460 addr_nr_ns1=-8 addr_nr_ns2=-8 speed=slow \2461 run_tests $ns1 $ns2 10.0.1.12462 chk_join_nr 3 3 32463 chk_add_nr 3 32464 chk_rm_nr 3 3 invert simult2465 chk_rst_nr 0 02466 fi2467 2468 # invalid addresses flush2469 if reset "flush invalid addresses"; then2470 pm_nl_set_limits $ns1 3 32471 pm_nl_add_endpoint $ns1 10.0.12.1 flags signal2472 pm_nl_add_endpoint $ns1 10.0.3.1 flags signal2473 pm_nl_add_endpoint $ns1 10.0.14.1 flags signal2474 pm_nl_set_limits $ns2 3 32475 addr_nr_ns1=-8 speed=slow \2476 run_tests $ns1 $ns2 10.0.1.12477 join_syn_tx=3 \2478 chk_join_nr 1 1 12479 chk_add_nr 3 32480 chk_rm_nr 3 1 invert2481 chk_rst_nr 0 02482 fi2483 2484 # remove id 0 subflow2485 if reset "remove id 0 subflow"; then2486 pm_nl_set_limits $ns1 0 12487 pm_nl_set_limits $ns2 0 12488 pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow2489 addr_nr_ns2=-9 speed=slow \2490 run_tests $ns1 $ns2 10.0.1.12491 chk_join_nr 1 1 12492 chk_rm_nr 1 12493 chk_rst_nr 0 02494 fi2495 2496 # remove id 0 address2497 if reset "remove id 0 address"; then2498 pm_nl_set_limits $ns1 0 12499 pm_nl_add_endpoint $ns1 10.0.2.1 flags signal2500 pm_nl_set_limits $ns2 1 12501 addr_nr_ns1=-9 speed=slow \2502 run_tests $ns1 $ns2 10.0.1.12503 chk_join_nr 1 1 12504 chk_add_nr 1 12505 chk_rm_nr 1 1 invert2506 chk_rst_nr 0 0 invert2507 fi2508}2509 2510add_tests()2511{2512 # add single subflow2513 if reset "add single subflow"; then2514 pm_nl_set_limits $ns1 0 12515 pm_nl_set_limits $ns2 0 12516 addr_nr_ns2=1 speed=slow cestab_ns2=1 \2517 run_tests $ns1 $ns2 10.0.1.12518 chk_join_nr 1 1 12519 chk_cestab_nr $ns2 02520 fi2521 2522 # add signal address2523 if reset "add signal address"; then2524 pm_nl_set_limits $ns1 0 12525 pm_nl_set_limits $ns2 1 12526 addr_nr_ns1=1 speed=slow cestab_ns1=1 \2527 run_tests $ns1 $ns2 10.0.1.12528 chk_join_nr 1 1 12529 chk_add_nr 1 12530 chk_cestab_nr $ns1 02531 fi2532 2533 # add multiple subflows2534 if reset "add multiple subflows"; then2535 pm_nl_set_limits $ns1 0 22536 pm_nl_set_limits $ns2 0 22537 addr_nr_ns2=2 speed=slow cestab_ns2=1 \2538 run_tests $ns1 $ns2 10.0.1.12539 chk_join_nr 2 2 22540 chk_cestab_nr $ns2 02541 fi2542 2543 # add multiple subflows IPv62544 if reset "add multiple subflows IPv6"; then2545 pm_nl_set_limits $ns1 0 22546 pm_nl_set_limits $ns2 0 22547 addr_nr_ns2=2 speed=slow cestab_ns2=1 \2548 run_tests $ns1 $ns2 dead:beef:1::12549 chk_join_nr 2 2 22550 chk_cestab_nr $ns2 02551 fi2552 2553 # add multiple addresses IPv62554 if reset "add multiple addresses IPv6"; then2555 pm_nl_set_limits $ns1 0 22556 pm_nl_set_limits $ns2 2 22557 addr_nr_ns1=2 speed=slow cestab_ns1=1 \2558 run_tests $ns1 $ns2 dead:beef:1::12559 chk_join_nr 2 2 22560 chk_add_nr 2 22561 chk_cestab_nr $ns1 02562 fi2563}2564 2565ipv6_tests()2566{2567 # subflow IPv62568 if reset "single subflow IPv6"; then2569 pm_nl_set_limits $ns1 0 12570 pm_nl_set_limits $ns2 0 12571 pm_nl_add_endpoint $ns2 dead:beef:3::2 dev ns2eth3 flags subflow2572 speed=slow \2573 run_tests $ns1 $ns2 dead:beef:1::12574 chk_join_nr 1 1 12575 fi2576 2577 # add_address, unused IPv62578 if reset "unused signal address IPv6"; then2579 pm_nl_add_endpoint $ns1 dead:beef:2::1 flags signal2580 speed=slow \2581 run_tests $ns1 $ns2 dead:beef:1::12582 chk_join_nr 0 0 02583 chk_add_nr 1 12584 fi2585 2586 # signal address IPv62587 if reset "single address IPv6"; then2588 pm_nl_set_limits $ns1 0 12589 pm_nl_add_endpoint $ns1 dead:beef:2::1 flags signal2590 pm_nl_set_limits $ns2 1 12591 speed=slow \2592 run_tests $ns1 $ns2 dead:beef:1::12593 chk_join_nr 1 1 12594 chk_add_nr 1 12595 fi2596 2597 # single address IPv6, remove2598 if reset "remove single address IPv6"; then2599 pm_nl_set_limits $ns1 0 12600 pm_nl_add_endpoint $ns1 dead:beef:2::1 flags signal2601 pm_nl_set_limits $ns2 1 12602 addr_nr_ns1=-1 speed=slow \2603 run_tests $ns1 $ns2 dead:beef:1::12604 chk_join_nr 1 1 12605 chk_add_nr 1 12606 chk_rm_nr 1 1 invert2607 fi2608 2609 # subflow and signal IPv6, remove2610 if reset "remove subflow and signal IPv6"; then2611 pm_nl_set_limits $ns1 0 22612 pm_nl_add_endpoint $ns1 dead:beef:2::1 flags signal2613 pm_nl_set_limits $ns2 1 22614 pm_nl_add_endpoint $ns2 dead:beef:3::2 dev ns2eth3 flags subflow2615 addr_nr_ns1=-1 addr_nr_ns2=-1 speed=slow \2616 run_tests $ns1 $ns2 dead:beef:1::12617 chk_join_nr 2 2 22618 chk_add_nr 1 12619 chk_rm_nr 1 12620 fi2621}2622 2623v4mapped_tests()2624{2625 # subflow IPv4-mapped to IPv4-mapped2626 if reset "single subflow IPv4-mapped"; then2627 pm_nl_set_limits $ns1 0 12628 pm_nl_set_limits $ns2 0 12629 pm_nl_add_endpoint $ns2 "::ffff:10.0.3.2" flags subflow2630 run_tests $ns1 $ns2 "::ffff:10.0.1.1"2631 chk_join_nr 1 1 12632 fi2633 2634 # signal address IPv4-mapped with IPv4-mapped sk2635 if reset "signal address IPv4-mapped"; then2636 pm_nl_set_limits $ns1 0 12637 pm_nl_set_limits $ns2 1 12638 pm_nl_add_endpoint $ns1 "::ffff:10.0.2.1" flags signal2639 run_tests $ns1 $ns2 "::ffff:10.0.1.1"2640 chk_join_nr 1 1 12641 chk_add_nr 1 12642 fi2643 2644 # subflow v4-map-v62645 if reset "single subflow v4-map-v6"; then2646 pm_nl_set_limits $ns1 0 12647 pm_nl_set_limits $ns2 0 12648 pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow2649 run_tests $ns1 $ns2 "::ffff:10.0.1.1"2650 chk_join_nr 1 1 12651 fi2652 2653 # signal address v4-map-v62654 if reset "signal address v4-map-v6"; then2655 pm_nl_set_limits $ns1 0 12656 pm_nl_set_limits $ns2 1 12657 pm_nl_add_endpoint $ns1 10.0.2.1 flags signal2658 run_tests $ns1 $ns2 "::ffff:10.0.1.1"2659 chk_join_nr 1 1 12660 chk_add_nr 1 12661 fi2662 2663 # subflow v6-map-v42664 if reset "single subflow v6-map-v4"; then2665 pm_nl_set_limits $ns1 0 12666 pm_nl_set_limits $ns2 0 12667 pm_nl_add_endpoint $ns2 "::ffff:10.0.3.2" flags subflow2668 run_tests $ns1 $ns2 10.0.1.12669 chk_join_nr 1 1 12670 fi2671 2672 # signal address v6-map-v42673 if reset "signal address v6-map-v4"; then2674 pm_nl_set_limits $ns1 0 12675 pm_nl_set_limits $ns2 1 12676 pm_nl_add_endpoint $ns1 "::ffff:10.0.2.1" flags signal2677 run_tests $ns1 $ns2 10.0.1.12678 chk_join_nr 1 1 12679 chk_add_nr 1 12680 fi2681 2682 # no subflow IPv6 to v4 address2683 if reset "no JOIN with diff families v4-v6"; then2684 pm_nl_set_limits $ns1 0 12685 pm_nl_set_limits $ns2 0 12686 pm_nl_add_endpoint $ns2 dead:beef:2::2 flags subflow2687 run_tests $ns1 $ns2 10.0.1.12688 chk_join_nr 0 0 02689 fi2690 2691 # no subflow IPv6 to v4 address even if v6 has a valid v4 at the end2692 if reset "no JOIN with diff families v4-v6-2"; then2693 pm_nl_set_limits $ns1 0 12694 pm_nl_set_limits $ns2 0 12695 pm_nl_add_endpoint $ns2 dead:beef:2::10.0.3.2 flags subflow2696 run_tests $ns1 $ns2 10.0.1.12697 chk_join_nr 0 0 02698 fi2699 2700 # no subflow IPv4 to v6 address, no need to slow down too then2701 if reset "no JOIN with diff families v6-v4"; then2702 pm_nl_set_limits $ns1 0 12703 pm_nl_set_limits $ns2 0 12704 pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow2705 run_tests $ns1 $ns2 dead:beef:1::12706 chk_join_nr 0 0 02707 fi2708}2709 2710mixed_tests()2711{2712 if reset "IPv4 sockets do not use IPv6 addresses" &&2713 continue_if mptcp_lib_kversion_ge 6.3; then2714 pm_nl_set_limits $ns1 0 12715 pm_nl_set_limits $ns2 1 12716 pm_nl_add_endpoint $ns1 dead:beef:2::1 flags signal2717 speed=slow \2718 run_tests $ns1 $ns2 10.0.1.12719 chk_join_nr 0 0 02720 fi2721 2722 # Need an IPv6 mptcp socket to allow subflows of both families2723 if reset "simult IPv4 and IPv6 subflows" &&2724 continue_if mptcp_lib_kversion_ge 6.3; then2725 pm_nl_set_limits $ns1 0 12726 pm_nl_set_limits $ns2 1 12727 pm_nl_add_endpoint $ns1 10.0.1.1 flags signal2728 speed=slow \2729 run_tests $ns1 $ns2 dead:beef:2::12730 chk_join_nr 1 1 12731 fi2732 2733 # cross families subflows will not be created even in fullmesh mode2734 if reset "simult IPv4 and IPv6 subflows, fullmesh 1x1" &&2735 continue_if mptcp_lib_kversion_ge 6.3; then2736 pm_nl_set_limits $ns1 0 42737 pm_nl_set_limits $ns2 1 42738 pm_nl_add_endpoint $ns2 dead:beef:2::2 flags subflow,fullmesh2739 pm_nl_add_endpoint $ns1 10.0.1.1 flags signal2740 speed=slow \2741 run_tests $ns1 $ns2 dead:beef:2::12742 chk_join_nr 1 1 12743 fi2744 2745 # fullmesh still tries to create all the possibly subflows with2746 # matching family2747 if reset "simult IPv4 and IPv6 subflows, fullmesh 2x2" &&2748 continue_if mptcp_lib_kversion_ge 6.3; then2749 pm_nl_set_limits $ns1 0 42750 pm_nl_set_limits $ns2 2 42751 pm_nl_add_endpoint $ns1 10.0.2.1 flags signal2752 pm_nl_add_endpoint $ns1 dead:beef:2::1 flags signal2753 fullmesh=1 speed=slow \2754 run_tests $ns1 $ns2 dead:beef:1::12755 chk_join_nr 4 4 42756 fi2757}2758 2759backup_tests()2760{2761 # single subflow, backup2762 if reset "single subflow, backup" &&2763 continue_if mptcp_lib_kallsyms_has "subflow_rebuild_header$"; then2764 pm_nl_set_limits $ns1 0 12765 pm_nl_set_limits $ns2 0 12766 pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow,backup2767 sflags=nobackup speed=slow \2768 run_tests $ns1 $ns2 10.0.1.12769 chk_join_nr 1 1 12770 chk_prio_nr 0 1 1 02771 fi2772 2773 # single address, backup2774 if reset "single address, backup" &&2775 continue_if mptcp_lib_kallsyms_has "subflow_rebuild_header$"; then2776 pm_nl_set_limits $ns1 0 12777 pm_nl_add_endpoint $ns1 10.0.2.1 flags signal,backup2778 pm_nl_set_limits $ns2 1 12779 sflags=nobackup speed=slow \2780 run_tests $ns1 $ns2 10.0.1.12781 chk_join_nr 1 1 12782 chk_add_nr 1 12783 chk_prio_nr 1 0 0 12784 fi2785 2786 # single address, switch to backup2787 if reset "single address, switch to backup" &&2788 continue_if mptcp_lib_kallsyms_has "subflow_rebuild_header$"; then2789 pm_nl_set_limits $ns1 0 12790 pm_nl_add_endpoint $ns1 10.0.2.1 flags signal2791 pm_nl_set_limits $ns2 1 12792 sflags=backup speed=slow \2793 run_tests $ns1 $ns2 10.0.1.12794 chk_join_nr 1 1 12795 chk_add_nr 1 12796 chk_prio_nr 1 1 0 02797 fi2798 2799 # single address with port, backup2800 if reset "single address with port, backup" &&2801 continue_if mptcp_lib_kallsyms_has "subflow_rebuild_header$"; then2802 pm_nl_set_limits $ns1 0 12803 pm_nl_add_endpoint $ns1 10.0.2.1 flags signal,backup port 101002804 pm_nl_set_limits $ns2 1 12805 sflags=nobackup speed=slow \2806 run_tests $ns1 $ns2 10.0.1.12807 chk_join_nr 1 1 12808 chk_add_nr 1 12809 chk_prio_nr 1 0 0 12810 fi2811 2812 if reset "mpc backup" &&2813 continue_if mptcp_lib_kallsyms_doesnt_have "T mptcp_subflow_send_ack$"; then2814 pm_nl_add_endpoint $ns2 10.0.1.2 flags subflow,backup2815 speed=slow \2816 run_tests $ns1 $ns2 10.0.1.12817 chk_join_nr 0 0 02818 chk_prio_nr 0 1 0 02819 fi2820 2821 if reset "mpc backup both sides" &&2822 continue_if mptcp_lib_kallsyms_doesnt_have "T mptcp_subflow_send_ack$"; then2823 pm_nl_set_limits $ns1 0 22824 pm_nl_set_limits $ns2 1 22825 pm_nl_add_endpoint $ns1 10.0.1.1 flags signal,backup2826 pm_nl_add_endpoint $ns2 10.0.1.2 flags subflow,backup2827 2828 # 10.0.2.2 (non-backup) -> 10.0.1.1 (backup)2829 pm_nl_add_endpoint $ns2 10.0.2.2 flags subflow2830 # 10.0.1.2 (backup) -> 10.0.2.1 (non-backup)2831 pm_nl_add_endpoint $ns1 10.0.2.1 flags signal2832 ip -net "$ns2" route add 10.0.2.1 via 10.0.1.1 dev ns2eth1 # force this path2833 2834 speed=slow \2835 run_tests $ns1 $ns2 10.0.1.12836 chk_join_nr 2 2 22837 chk_prio_nr 1 1 1 12838 fi2839 2840 if reset "mpc switch to backup" &&2841 continue_if mptcp_lib_kallsyms_doesnt_have "T mptcp_subflow_send_ack$"; then2842 pm_nl_add_endpoint $ns2 10.0.1.2 flags subflow2843 sflags=backup speed=slow \2844 run_tests $ns1 $ns2 10.0.1.12845 chk_join_nr 0 0 02846 chk_prio_nr 0 1 0 02847 fi2848 2849 if reset "mpc switch to backup both sides" &&2850 continue_if mptcp_lib_kallsyms_doesnt_have "T mptcp_subflow_send_ack$"; then2851 pm_nl_add_endpoint $ns1 10.0.1.1 flags subflow2852 pm_nl_add_endpoint $ns2 10.0.1.2 flags subflow2853 sflags=backup speed=slow \2854 run_tests $ns1 $ns2 10.0.1.12855 chk_join_nr 0 0 02856 chk_prio_nr 1 1 0 02857 fi2858}2859 2860verify_listener_events()2861{2862 local e_type=$22863 local e_saddr=$42864 local e_sport=$52865 local name2866 2867 if [ $e_type = $MPTCP_LIB_EVENT_LISTENER_CREATED ]; then2868 name="LISTENER_CREATED"2869 elif [ $e_type = $MPTCP_LIB_EVENT_LISTENER_CLOSED ]; then2870 name="LISTENER_CLOSED "2871 else2872 name="$e_type"2873 fi2874 2875 print_check "$name $e_saddr:$e_sport"2876 2877 if ! mptcp_lib_kallsyms_has "mptcp_event_pm_listener$"; then2878 print_skip "event not supported"2879 return2880 fi2881 2882 if mptcp_lib_verify_listener_events "${@}"; then2883 print_ok2884 return 02885 fi2886 fail_test2887}2888 2889chk_mpc_endp_attempt()2890{2891 local retl=$12892 local attempts=$22893 2894 print_check "Connect"2895 2896 if [ ${retl} = 124 ]; then2897 fail_test "timeout on connect"2898 elif [ ${retl} = 0 ]; then2899 fail_test "unexpected successful connect"2900 else2901 print_ok2902 2903 print_check "Attempts"2904 count=$(mptcp_lib_get_counter ${ns1} "MPTcpExtMPCapableEndpAttempt")2905 if [ -z "$count" ]; then2906 print_skip2907 elif [ "$count" != "$attempts" ]; then2908 fail_test "got ${count} MPC attempt[s] on port-based endpoint, expected ${attempts}"2909 else2910 print_ok2911 fi2912 fi2913}2914 2915add_addr_ports_tests()2916{2917 # signal address with port2918 if reset "signal address with port"; then2919 pm_nl_set_limits $ns1 0 12920 pm_nl_set_limits $ns2 1 12921 pm_nl_add_endpoint $ns1 10.0.2.1 flags signal port 101002922 run_tests $ns1 $ns2 10.0.1.12923 chk_join_nr 1 1 12924 chk_add_nr 1 1 12925 fi2926 2927 # subflow and signal with port2928 if reset "subflow and signal with port"; then2929 pm_nl_add_endpoint $ns1 10.0.2.1 flags signal port 101002930 pm_nl_set_limits $ns1 0 22931 pm_nl_set_limits $ns2 1 22932 pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow2933 run_tests $ns1 $ns2 10.0.1.12934 chk_join_nr 2 2 22935 chk_add_nr 1 1 12936 fi2937 2938 # single address with port, remove2939 # pm listener events2940 if reset_with_events "remove single address with port"; then2941 pm_nl_set_limits $ns1 0 12942 pm_nl_add_endpoint $ns1 10.0.2.1 flags signal port 101002943 pm_nl_set_limits $ns2 1 12944 addr_nr_ns1=-1 speed=slow \2945 run_tests $ns1 $ns2 10.0.1.12946 chk_join_nr 1 1 12947 chk_add_nr 1 1 12948 chk_rm_nr 1 1 invert2949 2950 verify_listener_events $evts_ns1 $MPTCP_LIB_EVENT_LISTENER_CREATED \2951 $MPTCP_LIB_AF_INET 10.0.2.1 101002952 verify_listener_events $evts_ns1 $MPTCP_LIB_EVENT_LISTENER_CLOSED \2953 $MPTCP_LIB_AF_INET 10.0.2.1 101002954 kill_events_pids2955 fi2956 2957 # subflow and signal with port, remove2958 if reset "remove subflow and signal with port"; then2959 pm_nl_set_limits $ns1 0 22960 pm_nl_add_endpoint $ns1 10.0.2.1 flags signal port 101002961 pm_nl_set_limits $ns2 1 22962 pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow2963 addr_nr_ns1=-1 addr_nr_ns2=-1 speed=slow \2964 run_tests $ns1 $ns2 10.0.1.12965 chk_join_nr 2 2 22966 chk_add_nr 1 1 12967 chk_rm_nr 1 12968 fi2969 2970 # subflows and signal with port, flush2971 if reset "flush subflows and signal with port"; then2972 pm_nl_set_limits $ns1 0 32973 pm_nl_add_endpoint $ns1 10.0.2.1 flags signal port 101002974 pm_nl_set_limits $ns2 1 32975 pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow2976 pm_nl_add_endpoint $ns2 10.0.4.2 flags subflow2977 addr_nr_ns1=-8 addr_nr_ns2=-2 speed=slow \2978 run_tests $ns1 $ns2 10.0.1.12979 chk_join_nr 3 3 32980 chk_add_nr 1 12981 chk_rm_nr 1 3 invert simult2982 fi2983 2984 # multiple addresses with port2985 if reset "multiple addresses with port"; then2986 pm_nl_set_limits $ns1 2 22987 pm_nl_add_endpoint $ns1 10.0.2.1 flags signal port 101002988 pm_nl_add_endpoint $ns1 10.0.3.1 flags signal port 101002989 pm_nl_set_limits $ns2 2 22990 run_tests $ns1 $ns2 10.0.1.12991 chk_join_nr 2 2 22992 chk_add_nr 2 2 22993 fi2994 2995 # multiple addresses with ports2996 if reset "multiple addresses with ports"; then2997 pm_nl_set_limits $ns1 2 22998 pm_nl_add_endpoint $ns1 10.0.2.1 flags signal port 101002999 pm_nl_add_endpoint $ns1 10.0.3.1 flags signal port 101013000 pm_nl_set_limits $ns2 2 23001 run_tests $ns1 $ns2 10.0.1.13002 chk_join_nr 2 2 23003 chk_add_nr 2 2 23004 fi3005 3006 if reset "port-based signal endpoint must not accept mpc"; then3007 local port retl count3008 port=$(get_port)3009 3010 cond_start_capture ${ns1}3011 pm_nl_add_endpoint ${ns1} 10.0.2.1 flags signal port ${port}3012 mptcp_lib_wait_local_port_listen ${ns1} ${port}3013 3014 timeout 1 ip netns exec ${ns2} \3015 ./mptcp_connect -t ${timeout_poll} -p $port -s MPTCP 10.0.2.1 >/dev/null 2>&13016 retl=$?3017 cond_stop_capture3018 3019 chk_mpc_endp_attempt ${retl} 13020 fi3021}3022 3023syncookies_tests()3024{3025 # single subflow, syncookies3026 if reset_with_cookies "single subflow with syn cookies"; then3027 pm_nl_set_limits $ns1 0 13028 pm_nl_set_limits $ns2 0 13029 pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow3030 run_tests $ns1 $ns2 10.0.1.13031 chk_join_nr 1 1 13032 fi3033 3034 # multiple subflows with syn cookies3035 if reset_with_cookies "multiple subflows with syn cookies"; then3036 pm_nl_set_limits $ns1 0 23037 pm_nl_set_limits $ns2 0 23038 pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow3039 pm_nl_add_endpoint $ns2 10.0.2.2 flags subflow3040 run_tests $ns1 $ns2 10.0.1.13041 chk_join_nr 2 2 23042 fi3043 3044 # multiple subflows limited by server3045 if reset_with_cookies "subflows limited by server w cookies"; then3046 pm_nl_set_limits $ns1 0 13047 pm_nl_set_limits $ns2 0 23048 pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow3049 pm_nl_add_endpoint $ns2 10.0.2.2 flags subflow3050 run_tests $ns1 $ns2 10.0.1.13051 chk_join_nr 2 1 13052 fi3053 3054 # test signal address with cookies3055 if reset_with_cookies "signal address with syn cookies"; then3056 pm_nl_set_limits $ns1 0 13057 pm_nl_set_limits $ns2 1 13058 pm_nl_add_endpoint $ns1 10.0.2.1 flags signal3059 run_tests $ns1 $ns2 10.0.1.13060 chk_join_nr 1 1 13061 chk_add_nr 1 13062 fi3063 3064 # test cookie with subflow and signal3065 if reset_with_cookies "subflow and signal w cookies"; then3066 pm_nl_add_endpoint $ns1 10.0.2.1 flags signal3067 pm_nl_set_limits $ns1 0 23068 pm_nl_set_limits $ns2 1 23069 pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow3070 run_tests $ns1 $ns2 10.0.1.13071 chk_join_nr 2 2 23072 chk_add_nr 1 13073 fi3074 3075 # accept and use add_addr with additional subflows3076 if reset_with_cookies "subflows and signal w. cookies"; then3077 pm_nl_set_limits $ns1 0 33078 pm_nl_add_endpoint $ns1 10.0.2.1 flags signal3079 pm_nl_set_limits $ns2 1 33080 pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow3081 pm_nl_add_endpoint $ns2 10.0.4.2 flags subflow3082 run_tests $ns1 $ns2 10.0.1.13083 chk_join_nr 3 3 33084 chk_add_nr 1 13085 fi3086}3087 3088checksum_tests()3089{3090 local checksum_enable3091 for checksum_enable in "0 0" "1 1" "0 1" "1 0"; do3092 # checksum test 0 0, 1 1, 0 1, 1 03093 if reset_with_checksum ${checksum_enable}; then3094 pm_nl_set_limits $ns1 0 13095 pm_nl_set_limits $ns2 0 13096 run_tests $ns1 $ns2 10.0.1.13097 chk_join_nr 0 0 03098 fi3099 done3100}3101 3102deny_join_id0_tests()3103{3104 # subflow allow join id0 ns13105 if reset_with_allow_join_id0 "single subflow allow join id0 ns1" 1 0; then3106 pm_nl_set_limits $ns1 1 13107 pm_nl_set_limits $ns2 1 13108 pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow3109 run_tests $ns1 $ns2 10.0.1.13110 chk_join_nr 1 1 13111 fi3112 3113 # subflow allow join id0 ns23114 if reset_with_allow_join_id0 "single subflow allow join id0 ns2" 0 1; then3115 pm_nl_set_limits $ns1 1 13116 pm_nl_set_limits $ns2 1 13117 pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow3118 run_tests $ns1 $ns2 10.0.1.13119 chk_join_nr 0 0 03120 fi3121 3122 # signal address allow join id0 ns13123 # ADD_ADDRs are not affected by allow_join_id0 value.3124 if reset_with_allow_join_id0 "signal address allow join id0 ns1" 1 0; then3125 pm_nl_set_limits $ns1 1 13126 pm_nl_set_limits $ns2 1 13127 pm_nl_add_endpoint $ns1 10.0.2.1 flags signal3128 run_tests $ns1 $ns2 10.0.1.13129 chk_join_nr 1 1 13130 chk_add_nr 1 13131 fi3132 3133 # signal address allow join id0 ns23134 # ADD_ADDRs are not affected by allow_join_id0 value.3135 if reset_with_allow_join_id0 "signal address allow join id0 ns2" 0 1; then3136 pm_nl_set_limits $ns1 1 13137 pm_nl_set_limits $ns2 1 13138 pm_nl_add_endpoint $ns1 10.0.2.1 flags signal3139 run_tests $ns1 $ns2 10.0.1.13140 chk_join_nr 1 1 13141 chk_add_nr 1 13142 fi3143 3144 # subflow and address allow join id0 ns13145 if reset_with_allow_join_id0 "subflow and address allow join id0 1" 1 0; then3146 pm_nl_set_limits $ns1 2 23147 pm_nl_set_limits $ns2 2 23148 pm_nl_add_endpoint $ns1 10.0.2.1 flags signal3149 pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow3150 run_tests $ns1 $ns2 10.0.1.13151 chk_join_nr 2 2 23152 fi3153 3154 # subflow and address allow join id0 ns23155 if reset_with_allow_join_id0 "subflow and address allow join id0 2" 0 1; then3156 pm_nl_set_limits $ns1 2 23157 pm_nl_set_limits $ns2 2 23158 pm_nl_add_endpoint $ns1 10.0.2.1 flags signal3159 pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow3160 run_tests $ns1 $ns2 10.0.1.13161 chk_join_nr 1 1 13162 fi3163}3164 3165fullmesh_tests()3166{3167 # fullmesh 13168 # 2 fullmesh addrs in ns2, added before the connection,3169 # 1 non-fullmesh addr in ns1, added during the connection.3170 if reset "fullmesh test 2x1"; then3171 pm_nl_set_limits $ns1 0 43172 pm_nl_set_limits $ns2 1 43173 pm_nl_add_endpoint $ns2 10.0.2.2 flags subflow,fullmesh3174 pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow,fullmesh3175 addr_nr_ns1=1 speed=slow \3176 run_tests $ns1 $ns2 10.0.1.13177 chk_join_nr 4 4 43178 chk_add_nr 1 13179 fi3180 3181 # fullmesh 23182 # 1 non-fullmesh addr in ns1, added before the connection,3183 # 1 fullmesh addr in ns2, added during the connection.3184 if reset "fullmesh test 1x1"; then3185 pm_nl_set_limits $ns1 1 33186 pm_nl_set_limits $ns2 1 33187 pm_nl_add_endpoint $ns1 10.0.2.1 flags signal3188 if mptcp_lib_kallsyms_has "mptcp_pm_subflow_check_next$"; then3189 pm_nl_add_endpoint $ns2 10.0.1.2 flags subflow,fullmesh3190 fi3191 fullmesh=1 speed=slow \3192 run_tests $ns1 $ns2 10.0.1.13193 chk_join_nr 3 3 33194 chk_add_nr 1 13195 fi3196 3197 # fullmesh 33198 # 1 non-fullmesh addr in ns1, added before the connection,3199 # 2 fullmesh addrs in ns2, added during the connection.3200 if reset "fullmesh test 1x2"; then3201 pm_nl_set_limits $ns1 2 53202 pm_nl_set_limits $ns2 1 53203 pm_nl_add_endpoint $ns1 10.0.2.1 flags signal3204 fullmesh=2 speed=slow \3205 run_tests $ns1 $ns2 10.0.1.13206 chk_join_nr 5 5 53207 chk_add_nr 1 13208 fi3209 3210 # fullmesh 43211 # 1 non-fullmesh addr in ns1, added before the connection,3212 # 2 fullmesh addrs in ns2, added during the connection,3213 # limit max_subflows to 4.3214 if reset "fullmesh test 1x2, limited"; then3215 pm_nl_set_limits $ns1 2 43216 pm_nl_set_limits $ns2 1 43217 pm_nl_add_endpoint $ns1 10.0.2.1 flags signal3218 fullmesh=2 speed=slow \3219 run_tests $ns1 $ns2 10.0.1.13220 chk_join_nr 4 4 43221 chk_add_nr 1 13222 fi3223 3224 # set fullmesh flag3225 if reset "set fullmesh flag test" &&3226 continue_if mptcp_lib_kversion_ge 5.18; then3227 pm_nl_set_limits $ns1 4 43228 pm_nl_add_endpoint $ns1 10.0.2.1 flags subflow3229 pm_nl_set_limits $ns2 4 43230 addr_nr_ns2=1 sflags=fullmesh speed=slow \3231 run_tests $ns1 $ns2 10.0.1.13232 chk_join_nr 2 2 23233 chk_rm_nr 0 13234 fi3235 3236 # set nofullmesh flag3237 if reset "set nofullmesh flag test" &&3238 continue_if mptcp_lib_kversion_ge 5.18; then3239 pm_nl_set_limits $ns1 4 43240 pm_nl_add_endpoint $ns1 10.0.2.1 flags subflow,fullmesh3241 pm_nl_set_limits $ns2 4 43242 fullmesh=1 sflags=nofullmesh speed=slow \3243 run_tests $ns1 $ns2 10.0.1.13244 chk_join_nr 2 2 23245 chk_rm_nr 0 13246 fi3247 3248 # set backup,fullmesh flags3249 if reset "set backup,fullmesh flags test" &&3250 continue_if mptcp_lib_kversion_ge 5.18; then3251 pm_nl_set_limits $ns1 4 43252 pm_nl_add_endpoint $ns1 10.0.2.1 flags subflow3253 pm_nl_set_limits $ns2 4 43254 addr_nr_ns2=1 sflags=backup,fullmesh speed=slow \3255 run_tests $ns1 $ns2 10.0.1.13256 chk_join_nr 2 2 23257 chk_prio_nr 0 1 1 03258 chk_rm_nr 0 13259 fi3260 3261 # set nobackup,nofullmesh flags3262 if reset "set nobackup,nofullmesh flags test" &&3263 continue_if mptcp_lib_kversion_ge 5.18; then3264 pm_nl_set_limits $ns1 4 43265 pm_nl_set_limits $ns2 4 43266 pm_nl_add_endpoint $ns2 10.0.2.2 flags subflow,backup,fullmesh3267 sflags=nobackup,nofullmesh speed=slow \3268 run_tests $ns1 $ns2 10.0.1.13269 chk_join_nr 2 2 23270 chk_prio_nr 0 1 1 03271 chk_rm_nr 0 13272 fi3273}3274 3275fastclose_tests()3276{3277 if reset_check_counter "fastclose test" "MPTcpExtMPFastcloseTx"; then3278 MPTCP_LIB_SUBTEST_FLAKY=13279 test_linkfail=1024 fastclose=client \3280 run_tests $ns1 $ns2 10.0.1.13281 chk_join_nr 0 0 03282 chk_fclose_nr 1 13283 chk_rst_nr 1 1 invert3284 fi3285 3286 if reset_check_counter "fastclose server test" "MPTcpExtMPFastcloseRx"; then3287 MPTCP_LIB_SUBTEST_FLAKY=13288 test_linkfail=1024 fastclose=server \3289 run_tests $ns1 $ns2 10.0.1.13290 join_rst_nr=1 \3291 chk_join_nr 0 0 03292 chk_fclose_nr 1 1 invert3293 chk_rst_nr 1 13294 fi3295}3296 3297pedit_action_pkts()3298{3299 tc -n $ns2 -j -s action show action pedit index 100 | \3300 mptcp_lib_get_info_value \"packets\" packets3301}3302 3303fail_tests()3304{3305 # single subflow3306 if reset_with_fail "Infinite map" 1; then3307 MPTCP_LIB_SUBTEST_FLAKY=13308 test_linkfail=128 \3309 run_tests $ns1 $ns2 10.0.1.13310 join_csum_ns1=+1 join_csum_ns2=+0 \3311 join_fail_nr=1 join_rst_nr=0 join_infi_nr=1 \3312 join_corrupted_pkts="$(pedit_action_pkts)" \3313 chk_join_nr 0 0 03314 chk_fail_nr 1 -1 invert3315 fi3316 3317 # multiple subflows3318 if reset_with_fail "MP_FAIL MP_RST" 2; then3319 MPTCP_LIB_SUBTEST_FLAKY=13320 tc -n $ns2 qdisc add dev ns2eth1 root netem rate 1mbit delay 5ms3321 pm_nl_set_limits $ns1 0 13322 pm_nl_set_limits $ns2 0 13323 pm_nl_add_endpoint $ns2 10.0.2.2 dev ns2eth2 flags subflow3324 test_linkfail=1024 \3325 run_tests $ns1 $ns2 10.0.1.13326 join_csum_ns1=1 join_csum_ns2=0 \3327 join_fail_nr=1 join_rst_nr=1 join_infi_nr=0 \3328 join_corrupted_pkts="$(pedit_action_pkts)" \3329 chk_join_nr 1 1 13330 fi3331}3332 3333# $1: ns ; $2: addr ; $3: id3334userspace_pm_add_addr()3335{3336 local evts=$evts_ns13337 local tk3338 3339 [ "$1" == "$ns2" ] && evts=$evts_ns23340 tk=$(mptcp_lib_evts_get_info token "$evts")3341 3342 ip netns exec $1 ./pm_nl_ctl ann $2 token $tk id $33343 sleep 13344}3345 3346# $1: ns ; $2: id3347userspace_pm_rm_addr()3348{3349 local evts=$evts_ns13350 local tk3351 local cnt3352 3353 [ "$1" == "$ns2" ] && evts=$evts_ns23354 tk=$(mptcp_lib_evts_get_info token "$evts")3355 3356 cnt=$(rm_addr_count ${1})3357 ip netns exec $1 ./pm_nl_ctl rem token $tk id $23358 wait_rm_addr $1 "${cnt}"3359}3360 3361# $1: ns ; $2: addr ; $3: id3362userspace_pm_add_sf()3363{3364 local evts=$evts_ns13365 local tk da dp3366 3367 [ "$1" == "$ns2" ] && evts=$evts_ns23368 tk=$(mptcp_lib_evts_get_info token "$evts")3369 da=$(mptcp_lib_evts_get_info daddr4 "$evts")3370 dp=$(mptcp_lib_evts_get_info dport "$evts")3371 3372 ip netns exec $1 ./pm_nl_ctl csf lip $2 lid $3 \3373 rip $da rport $dp token $tk3374 sleep 13375}3376 3377# $1: ns ; $2: addr $3: event type3378userspace_pm_rm_sf()3379{3380 local evts=$evts_ns13381 local t=${3:-1}3382 local ip3383 local tk da dp sp3384 local cnt3385 3386 [ "$1" == "$ns2" ] && evts=$evts_ns23387 [ -n "$(mptcp_lib_evts_get_info "saddr4" "$evts" $t)" ] && ip=43388 [ -n "$(mptcp_lib_evts_get_info "saddr6" "$evts" $t)" ] && ip=63389 tk=$(mptcp_lib_evts_get_info token "$evts")3390 da=$(mptcp_lib_evts_get_info "daddr$ip" "$evts" $t $2)3391 dp=$(mptcp_lib_evts_get_info dport "$evts" $t $2)3392 sp=$(mptcp_lib_evts_get_info sport "$evts" $t $2)3393 3394 cnt=$(rm_sf_count ${1})3395 ip netns exec $1 ./pm_nl_ctl dsf lip $2 lport $sp \3396 rip $da rport $dp token $tk3397 wait_rm_sf $1 "${cnt}"3398}3399 3400check_output()3401{3402 local cmd="$1"3403 local expected="$2"3404 local msg="$3"3405 local rc=03406 3407 mptcp_lib_check_output "${err}" "${cmd}" "${expected}" || rc=${?}3408 if [ ${rc} -eq 2 ]; then3409 fail_test "fail to check output # error ${rc}"3410 elif [ ${rc} -eq 0 ]; then3411 print_ok3412 elif [ ${rc} -eq 1 ]; then3413 fail_test "fail to check output # different output"3414 fi3415}3416 3417# $1: ns3418userspace_pm_dump()3419{3420 local evts=$evts_ns13421 local tk3422 3423 [ "$1" == "$ns2" ] && evts=$evts_ns23424 tk=$(mptcp_lib_evts_get_info token "$evts")3425 3426 ip netns exec $1 ./pm_nl_ctl dump token $tk3427}3428 3429# $1: ns ; $2: id3430userspace_pm_get_addr()3431{3432 local evts=$evts_ns13433 local tk3434 3435 [ "$1" == "$ns2" ] && evts=$evts_ns23436 tk=$(mptcp_lib_evts_get_info token "$evts")3437 3438 ip netns exec $1 ./pm_nl_ctl get $2 token $tk3439}3440 3441userspace_pm_chk_dump_addr()3442{3443 local ns="${1}"3444 local exp="${2}"3445 local check="${3}"3446 3447 print_check "dump addrs ${check}"3448 3449 if mptcp_lib_kallsyms_has "mptcp_userspace_pm_dump_addr$"; then3450 check_output "userspace_pm_dump ${ns}" "${exp}"3451 else3452 print_skip3453 fi3454}3455 3456userspace_pm_chk_get_addr()3457{3458 local ns="${1}"3459 local id="${2}"3460 local exp="${3}"3461 3462 print_check "get id ${id} addr"3463 3464 if mptcp_lib_kallsyms_has "mptcp_userspace_pm_get_addr$"; then3465 check_output "userspace_pm_get_addr ${ns} ${id}" "${exp}"3466 else3467 print_skip3468 fi3469}3470 3471# $1: ns ; $2: event type ; $3: count3472chk_evt_nr()3473{3474 local ns=${1}3475 local evt_name="${2}"3476 local exp="${3}"3477 3478 local evts="${evts_ns1}"3479 local evt="${!evt_name}"3480 local count3481 3482 evt_name="${evt_name:16}" # without MPTCP_LIB_EVENT_3483 [ "${ns}" == "ns2" ] && evts="${evts_ns2}"3484 3485 print_check "event ${ns} ${evt_name} (${exp})"3486 3487 if [[ "${evt_name}" = "LISTENER_"* ]] &&3488 ! mptcp_lib_kallsyms_has "mptcp_event_pm_listener$"; then3489 print_skip "event not supported"3490 return3491 fi3492 3493 count=$(grep -cw "type:${evt}" "${evts}")3494 if [ "${count}" != "${exp}" ]; then3495 fail_test "got ${count} events, expected ${exp}"3496 else3497 print_ok3498 fi3499}3500 3501userspace_tests()3502{3503 # userspace pm type prevents add_addr3504 if reset "userspace pm type prevents add_addr" &&3505 continue_if mptcp_lib_has_file '/proc/sys/net/mptcp/pm_type'; then3506 set_userspace_pm $ns13507 pm_nl_set_limits $ns1 0 23508 pm_nl_set_limits $ns2 0 23509 pm_nl_add_endpoint $ns1 10.0.2.1 flags signal3510 run_tests $ns1 $ns2 10.0.1.13511 chk_join_nr 0 0 03512 chk_add_nr 0 03513 fi3514 3515 # userspace pm type does not echo add_addr without daemon3516 if reset "userspace pm no echo w/o daemon" &&3517 continue_if mptcp_lib_has_file '/proc/sys/net/mptcp/pm_type'; then3518 set_userspace_pm $ns23519 pm_nl_set_limits $ns1 0 23520 pm_nl_set_limits $ns2 0 23521 pm_nl_add_endpoint $ns1 10.0.2.1 flags signal3522 run_tests $ns1 $ns2 10.0.1.13523 chk_join_nr 0 0 03524 chk_add_nr 1 03525 fi3526 3527 # userspace pm type rejects join3528 if reset "userspace pm type rejects join" &&3529 continue_if mptcp_lib_has_file '/proc/sys/net/mptcp/pm_type'; then3530 set_userspace_pm $ns13531 pm_nl_set_limits $ns1 1 13532 pm_nl_set_limits $ns2 1 13533 pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow3534 run_tests $ns1 $ns2 10.0.1.13535 chk_join_nr 1 1 03536 fi3537 3538 # userspace pm type does not send join3539 if reset "userspace pm type does not send join" &&3540 continue_if mptcp_lib_has_file '/proc/sys/net/mptcp/pm_type'; then3541 set_userspace_pm $ns23542 pm_nl_set_limits $ns1 1 13543 pm_nl_set_limits $ns2 1 13544 pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow3545 run_tests $ns1 $ns2 10.0.1.13546 chk_join_nr 0 0 03547 fi3548 3549 # userspace pm type prevents mp_prio3550 if reset "userspace pm type prevents mp_prio" &&3551 continue_if mptcp_lib_has_file '/proc/sys/net/mptcp/pm_type'; then3552 set_userspace_pm $ns13553 pm_nl_set_limits $ns1 1 13554 pm_nl_set_limits $ns2 1 13555 pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow3556 sflags=backup speed=slow \3557 run_tests $ns1 $ns2 10.0.1.13558 chk_join_nr 1 1 03559 chk_prio_nr 0 0 0 03560 fi3561 3562 # userspace pm type prevents rm_addr3563 if reset "userspace pm type prevents rm_addr" &&3564 continue_if mptcp_lib_has_file '/proc/sys/net/mptcp/pm_type'; then3565 set_userspace_pm $ns13566 set_userspace_pm $ns23567 pm_nl_set_limits $ns1 0 13568 pm_nl_set_limits $ns2 0 13569 pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow3570 addr_nr_ns2=-1 speed=slow \3571 run_tests $ns1 $ns2 10.0.1.13572 chk_join_nr 0 0 03573 chk_rm_nr 0 03574 fi3575 3576 # userspace pm add & remove address3577 if reset_with_events "userspace pm add & remove address" &&3578 continue_if mptcp_lib_has_file '/proc/sys/net/mptcp/pm_type'; then3579 set_userspace_pm $ns13580 pm_nl_set_limits $ns2 2 23581 { speed=5 \3582 run_tests $ns1 $ns2 10.0.1.1 & } 2>/dev/null3583 local tests_pid=$!3584 wait_mpj $ns13585 userspace_pm_add_addr $ns1 10.0.2.1 103586 userspace_pm_add_addr $ns1 10.0.3.1 203587 chk_join_nr 2 2 23588 chk_add_nr 2 23589 chk_mptcp_info subflows 2 subflows 23590 chk_subflows_total 3 33591 chk_mptcp_info add_addr_signal 2 add_addr_accepted 23592 userspace_pm_chk_dump_addr "${ns1}" \3593 $'id 10 flags signal 10.0.2.1\nid 20 flags signal 10.0.3.1' \3594 "signal"3595 userspace_pm_chk_get_addr "${ns1}" "10" "id 10 flags signal 10.0.2.1"3596 userspace_pm_chk_get_addr "${ns1}" "20" "id 20 flags signal 10.0.3.1"3597 userspace_pm_rm_sf $ns1 "::ffff:10.0.2.1" $MPTCP_LIB_EVENT_SUB_ESTABLISHED3598 userspace_pm_chk_dump_addr "${ns1}" \3599 "id 20 flags signal 10.0.3.1" "after rm_sf 10"3600 userspace_pm_rm_addr $ns1 203601 userspace_pm_chk_dump_addr "${ns1}" "" "after rm_addr 20"3602 chk_rm_nr 1 1 invert3603 chk_mptcp_info subflows 0 subflows 03604 chk_subflows_total 1 13605 kill_events_pids3606 mptcp_lib_kill_wait $tests_pid3607 fi3608 3609 # userspace pm create destroy subflow3610 if reset_with_events "userspace pm create destroy subflow" &&3611 continue_if mptcp_lib_has_file '/proc/sys/net/mptcp/pm_type'; then3612 set_userspace_pm $ns23613 pm_nl_set_limits $ns1 0 13614 { speed=5 \3615 run_tests $ns1 $ns2 10.0.1.1 & } 2>/dev/null3616 local tests_pid=$!3617 wait_mpj $ns23618 userspace_pm_add_sf $ns2 10.0.3.2 203619 chk_join_nr 1 1 13620 chk_mptcp_info subflows 1 subflows 13621 chk_subflows_total 2 23622 userspace_pm_chk_dump_addr "${ns2}" \3623 "id 20 flags subflow 10.0.3.2" \3624 "subflow"3625 userspace_pm_chk_get_addr "${ns2}" "20" "id 20 flags subflow 10.0.3.2"3626 userspace_pm_rm_sf $ns2 10.0.3.2 $MPTCP_LIB_EVENT_SUB_ESTABLISHED3627 userspace_pm_chk_dump_addr "${ns2}" \3628 "" \3629 "after rm_sf 20"3630 chk_rm_nr 0 13631 chk_mptcp_info subflows 0 subflows 03632 chk_subflows_total 1 13633 kill_events_pids3634 mptcp_lib_kill_wait $tests_pid3635 fi3636 3637 # userspace pm create id 0 subflow3638 if reset_with_events "userspace pm create id 0 subflow" &&3639 continue_if mptcp_lib_has_file '/proc/sys/net/mptcp/pm_type'; then3640 set_userspace_pm $ns23641 pm_nl_set_limits $ns1 0 13642 { speed=5 \3643 run_tests $ns1 $ns2 10.0.1.1 & } 2>/dev/null3644 local tests_pid=$!3645 wait_mpj $ns23646 chk_mptcp_info subflows 0 subflows 03647 chk_subflows_total 1 13648 userspace_pm_add_sf $ns2 10.0.3.2 03649 userspace_pm_chk_dump_addr "${ns2}" \3650 "id 0 flags subflow 10.0.3.2" "id 0 subflow"3651 chk_join_nr 1 1 13652 chk_mptcp_info subflows 1 subflows 13653 chk_subflows_total 2 23654 kill_events_pids3655 mptcp_lib_kill_wait $tests_pid3656 fi3657 3658 # userspace pm remove initial subflow3659 if reset_with_events "userspace pm remove initial subflow" &&3660 continue_if mptcp_lib_has_file '/proc/sys/net/mptcp/pm_type'; then3661 set_userspace_pm $ns23662 pm_nl_set_limits $ns1 0 13663 { speed=5 \3664 run_tests $ns1 $ns2 10.0.1.1 & } 2>/dev/null3665 local tests_pid=$!3666 wait_mpj $ns23667 userspace_pm_add_sf $ns2 10.0.3.2 203668 chk_join_nr 1 1 13669 chk_mptcp_info subflows 1 subflows 13670 chk_subflows_total 2 23671 userspace_pm_rm_sf $ns2 10.0.1.23672 # we don't look at the counter linked to the RM_ADDR but3673 # to the one linked to the subflows that have been removed3674 chk_rm_nr 0 13675 chk_rst_nr 0 0 invert3676 chk_mptcp_info subflows 1 subflows 13677 chk_subflows_total 1 13678 kill_events_pids3679 mptcp_lib_kill_wait $tests_pid3680 fi3681 3682 # userspace pm send RM_ADDR for ID 03683 if reset_with_events "userspace pm send RM_ADDR for ID 0" &&3684 continue_if mptcp_lib_has_file '/proc/sys/net/mptcp/pm_type'; then3685 set_userspace_pm $ns13686 pm_nl_set_limits $ns2 1 13687 { speed=5 \3688 run_tests $ns1 $ns2 10.0.1.1 & } 2>/dev/null3689 local tests_pid=$!3690 wait_mpj $ns13691 userspace_pm_add_addr $ns1 10.0.2.1 103692 chk_join_nr 1 1 13693 chk_add_nr 1 13694 chk_mptcp_info subflows 1 subflows 13695 chk_subflows_total 2 23696 chk_mptcp_info add_addr_signal 1 add_addr_accepted 13697 userspace_pm_rm_addr $ns1 03698 # we don't look at the counter linked to the subflows that3699 # have been removed but to the one linked to the RM_ADDR3700 chk_rm_nr 1 0 invert3701 chk_rst_nr 0 0 invert3702 chk_mptcp_info subflows 1 subflows 13703 chk_subflows_total 1 13704 kill_events_pids3705 mptcp_lib_kill_wait $tests_pid3706 fi3707}3708 3709endpoint_tests()3710{3711 # subflow_rebuild_header is needed to support the implicit flag3712 # userspace pm type prevents add_addr3713 if reset "implicit EP" &&3714 mptcp_lib_kallsyms_has "subflow_rebuild_header$"; then3715 pm_nl_set_limits $ns1 2 23716 pm_nl_set_limits $ns2 2 23717 pm_nl_add_endpoint $ns1 10.0.2.1 flags signal3718 { speed=slow \3719 run_tests $ns1 $ns2 10.0.1.1 & } 2>/dev/null3720 local tests_pid=$!3721 3722 wait_mpj $ns13723 pm_nl_check_endpoint "creation" \3724 $ns2 10.0.2.2 id 1 flags implicit3725 chk_mptcp_info subflows 1 subflows 13726 chk_mptcp_info add_addr_signal 1 add_addr_accepted 13727 3728 pm_nl_add_endpoint $ns2 10.0.2.2 id 33 2>/dev/null3729 pm_nl_check_endpoint "ID change is prevented" \3730 $ns2 10.0.2.2 id 1 flags implicit3731 3732 pm_nl_add_endpoint $ns2 10.0.2.2 flags signal3733 pm_nl_check_endpoint "modif is allowed" \3734 $ns2 10.0.2.2 id 1 flags signal3735 mptcp_lib_kill_wait $tests_pid3736 fi3737 3738 if reset_with_tcp_filter "delete and re-add" ns2 10.0.3.2 REJECT OUTPUT &&3739 mptcp_lib_kallsyms_has "subflow_rebuild_header$"; then3740 start_events3741 pm_nl_set_limits $ns1 0 33742 pm_nl_set_limits $ns2 0 33743 pm_nl_add_endpoint $ns2 10.0.1.2 id 1 dev ns2eth1 flags subflow3744 pm_nl_add_endpoint $ns2 10.0.2.2 id 2 dev ns2eth2 flags subflow3745 { test_linkfail=4 speed=5 \3746 run_tests $ns1 $ns2 10.0.1.1 & } 2>/dev/null3747 local tests_pid=$!3748 3749 wait_mpj $ns23750 pm_nl_check_endpoint "creation" \3751 $ns2 10.0.2.2 id 2 flags subflow dev ns2eth23752 chk_subflow_nr "before delete id 2" 23753 chk_mptcp_info subflows 1 subflows 13754 3755 pm_nl_del_endpoint $ns2 2 10.0.2.23756 sleep 0.53757 chk_subflow_nr "after delete id 2" 13758 chk_mptcp_info subflows 0 subflows 03759 3760 pm_nl_add_endpoint $ns2 10.0.2.2 id 2 dev ns2eth2 flags subflow3761 wait_mpj $ns23762 chk_subflow_nr "after re-add id 2" 23763 chk_mptcp_info subflows 1 subflows 13764 3765 pm_nl_add_endpoint $ns2 10.0.3.2 id 3 flags subflow3766 wait_attempt_fail $ns23767 chk_subflow_nr "after new reject" 23768 chk_mptcp_info subflows 1 subflows 13769 3770 ip netns exec "${ns2}" ${iptables} -D OUTPUT -s "10.0.3.2" -p tcp -j REJECT3771 pm_nl_del_endpoint $ns2 3 10.0.3.23772 pm_nl_add_endpoint $ns2 10.0.3.2 id 3 flags subflow3773 wait_mpj $ns23774 chk_subflow_nr "after no reject" 33775 chk_mptcp_info subflows 2 subflows 23776 3777 local i3778 for i in $(seq 3); do3779 pm_nl_del_endpoint $ns2 1 10.0.1.23780 sleep 0.53781 chk_subflow_nr "after delete id 0 ($i)" 23782 chk_mptcp_info subflows 2 subflows 2 # only decr for additional sf3783 3784 pm_nl_add_endpoint $ns2 10.0.1.2 id 1 dev ns2eth1 flags subflow3785 wait_mpj $ns23786 chk_subflow_nr "after re-add id 0 ($i)" 33787 chk_mptcp_info subflows 3 subflows 33788 done3789 3790 mptcp_lib_kill_wait $tests_pid3791 3792 kill_events_pids3793 chk_evt_nr ns1 MPTCP_LIB_EVENT_LISTENER_CREATED 13794 chk_evt_nr ns1 MPTCP_LIB_EVENT_CREATED 13795 chk_evt_nr ns1 MPTCP_LIB_EVENT_ESTABLISHED 13796 chk_evt_nr ns1 MPTCP_LIB_EVENT_ANNOUNCED 03797 chk_evt_nr ns1 MPTCP_LIB_EVENT_REMOVED 43798 chk_evt_nr ns1 MPTCP_LIB_EVENT_SUB_ESTABLISHED 63799 chk_evt_nr ns1 MPTCP_LIB_EVENT_SUB_CLOSED 43800 3801 chk_evt_nr ns2 MPTCP_LIB_EVENT_CREATED 13802 chk_evt_nr ns2 MPTCP_LIB_EVENT_ESTABLISHED 13803 chk_evt_nr ns2 MPTCP_LIB_EVENT_ANNOUNCED 03804 chk_evt_nr ns2 MPTCP_LIB_EVENT_REMOVED 03805 chk_evt_nr ns2 MPTCP_LIB_EVENT_SUB_ESTABLISHED 63806 chk_evt_nr ns2 MPTCP_LIB_EVENT_SUB_CLOSED 5 # one has been closed before estab3807 3808 join_syn_tx=7 \3809 chk_join_nr 6 6 63810 chk_rm_nr 4 43811 fi3812 3813 # remove and re-add3814 if reset_with_events "delete re-add signal" &&3815 mptcp_lib_kallsyms_has "subflow_rebuild_header$"; then3816 pm_nl_set_limits $ns1 0 33817 pm_nl_set_limits $ns2 3 33818 pm_nl_add_endpoint $ns1 10.0.2.1 id 1 flags signal3819 # broadcast IP: no packet for this address will be received on ns13820 pm_nl_add_endpoint $ns1 224.0.0.1 id 2 flags signal3821 pm_nl_add_endpoint $ns1 10.0.1.1 id 42 flags signal3822 { test_linkfail=4 speed=5 \3823 run_tests $ns1 $ns2 10.0.1.1 & } 2>/dev/null3824 local tests_pid=$!3825 3826 wait_mpj $ns23827 pm_nl_check_endpoint "creation" \3828 $ns1 10.0.2.1 id 1 flags signal3829 chk_subflow_nr "before delete" 23830 chk_mptcp_info subflows 1 subflows 13831 3832 pm_nl_del_endpoint $ns1 1 10.0.2.13833 pm_nl_del_endpoint $ns1 2 224.0.0.13834 sleep 0.53835 chk_subflow_nr "after delete" 13836 chk_mptcp_info subflows 0 subflows 03837 3838 pm_nl_add_endpoint $ns1 10.0.2.1 id 1 flags signal3839 pm_nl_add_endpoint $ns1 10.0.3.1 id 2 flags signal3840 wait_mpj $ns23841 chk_subflow_nr "after re-add" 33842 chk_mptcp_info subflows 2 subflows 23843 3844 pm_nl_del_endpoint $ns1 42 10.0.1.13845 sleep 0.53846 chk_subflow_nr "after delete ID 0" 23847 chk_mptcp_info subflows 2 subflows 23848 3849 pm_nl_add_endpoint $ns1 10.0.1.1 id 99 flags signal3850 wait_mpj $ns23851 chk_subflow_nr "after re-add ID 0" 33852 chk_mptcp_info subflows 3 subflows 33853 3854 pm_nl_del_endpoint $ns1 99 10.0.1.13855 sleep 0.53856 chk_subflow_nr "after re-delete ID 0" 23857 chk_mptcp_info subflows 2 subflows 23858 3859 pm_nl_add_endpoint $ns1 10.0.1.1 id 88 flags signal3860 wait_mpj $ns23861 chk_subflow_nr "after re-re-add ID 0" 33862 chk_mptcp_info subflows 3 subflows 33863 mptcp_lib_kill_wait $tests_pid3864 3865 kill_events_pids3866 chk_evt_nr ns1 MPTCP_LIB_EVENT_LISTENER_CREATED 13867 chk_evt_nr ns1 MPTCP_LIB_EVENT_CREATED 13868 chk_evt_nr ns1 MPTCP_LIB_EVENT_ESTABLISHED 13869 chk_evt_nr ns1 MPTCP_LIB_EVENT_ANNOUNCED 03870 chk_evt_nr ns1 MPTCP_LIB_EVENT_REMOVED 03871 chk_evt_nr ns1 MPTCP_LIB_EVENT_SUB_ESTABLISHED 53872 chk_evt_nr ns1 MPTCP_LIB_EVENT_SUB_CLOSED 33873 3874 chk_evt_nr ns2 MPTCP_LIB_EVENT_CREATED 13875 chk_evt_nr ns2 MPTCP_LIB_EVENT_ESTABLISHED 13876 chk_evt_nr ns2 MPTCP_LIB_EVENT_ANNOUNCED 63877 chk_evt_nr ns2 MPTCP_LIB_EVENT_REMOVED 43878 chk_evt_nr ns2 MPTCP_LIB_EVENT_SUB_ESTABLISHED 53879 chk_evt_nr ns2 MPTCP_LIB_EVENT_SUB_CLOSED 33880 3881 join_connect_err=1 \3882 chk_join_nr 5 5 53883 chk_add_nr 6 63884 chk_rm_nr 4 3 invert3885 fi3886 3887 # flush and re-add3888 if reset_with_tcp_filter "flush re-add" ns2 10.0.3.2 REJECT OUTPUT &&3889 mptcp_lib_kallsyms_has "subflow_rebuild_header$"; then3890 pm_nl_set_limits $ns1 0 23891 pm_nl_set_limits $ns2 1 23892 # broadcast IP: no packet for this address will be received on ns13893 pm_nl_add_endpoint $ns1 224.0.0.1 id 2 flags signal3894 pm_nl_add_endpoint $ns2 10.0.3.2 id 3 flags subflow3895 { test_linkfail=4 speed=20 \3896 run_tests $ns1 $ns2 10.0.1.1 & } 2>/dev/null3897 local tests_pid=$!3898 3899 wait_attempt_fail $ns23900 chk_subflow_nr "before flush" 13901 chk_mptcp_info subflows 0 subflows 03902 3903 pm_nl_flush_endpoint $ns23904 pm_nl_flush_endpoint $ns13905 wait_rm_addr $ns2 03906 ip netns exec "${ns2}" ${iptables} -D OUTPUT -s "10.0.3.2" -p tcp -j REJECT3907 pm_nl_add_endpoint $ns2 10.0.3.2 id 3 flags subflow3908 wait_mpj $ns23909 pm_nl_add_endpoint $ns1 10.0.3.1 id 2 flags signal3910 wait_mpj $ns23911 mptcp_lib_kill_wait $tests_pid3912 3913 join_syn_tx=3 join_connect_err=1 \3914 chk_join_nr 2 2 23915 chk_add_nr 2 23916 chk_rm_nr 1 0 invert3917 fi3918}3919 3920# [$1: error message]3921usage()3922{3923 if [ -n "${1}" ]; then3924 echo "${1}"3925 ret=${KSFT_FAIL}3926 fi3927 3928 echo "mptcp_join usage:"3929 3930 local key3931 for key in "${!all_tests[@]}"; do3932 echo " -${key} ${all_tests[${key}]}"3933 done3934 3935 echo " -c capture pcap files"3936 echo " -C enable data checksum"3937 echo " -i use ip mptcp"3938 echo " -h help"3939 3940 echo "[test ids|names]"3941 3942 exit ${ret}3943}3944 3945 3946# Use a "simple" array to force an specific order we cannot have with an associative one3947all_tests_sorted=(3948 f@subflows_tests3949 e@subflows_error_tests3950 s@signal_address_tests3951 l@link_failure_tests3952 t@add_addr_timeout_tests3953 r@remove_tests3954 a@add_tests3955 6@ipv6_tests3956 4@v4mapped_tests3957 M@mixed_tests3958 b@backup_tests3959 p@add_addr_ports_tests3960 k@syncookies_tests3961 S@checksum_tests3962 d@deny_join_id0_tests3963 m@fullmesh_tests3964 z@fastclose_tests3965 F@fail_tests3966 u@userspace_tests3967 I@endpoint_tests3968)3969 3970all_tests_args=""3971all_tests_names=()3972for subtests in "${all_tests_sorted[@]}"; do3973 key="${subtests%@*}"3974 value="${subtests#*@}"3975 3976 all_tests_args+="${key}"3977 all_tests_names+=("${value}")3978 all_tests[${key}]="${value}"3979done3980 3981tests=()3982while getopts "${all_tests_args}cCih" opt; do3983 case $opt in3984 ["${all_tests_args}"])3985 tests+=("${all_tests[${opt}]}")3986 ;;3987 c)3988 capture=true3989 ;;3990 C)3991 checksum=true3992 ;;3993 i)3994 mptcp_lib_set_ip_mptcp3995 ;;3996 h)3997 usage3998 ;;3999 *)4000 usage "Unknown option: -${opt}"4001 ;;4002 esac4003done4004 4005shift $((OPTIND - 1))4006 4007for arg in "${@}"; do4008 if [[ "${arg}" =~ ^[0-9]+$ ]]; then4009 only_tests_ids+=("${arg}")4010 else4011 only_tests_names+=("${arg}")4012 fi4013done4014 4015if [ ${#tests[@]} -eq 0 ]; then4016 tests=("${all_tests_names[@]}")4017fi4018 4019mptcp_lib_subtests_last_ts_reset4020for subtests in "${tests[@]}"; do4021 "${subtests}"4022done4023append_prev_results4024 4025if [ ${ret} -ne 0 ]; then4026 echo4027 echo "${#failed_tests[@]} failure(s) has(ve) been detected:"4028 for i in $(get_failed_tests_ids); do4029 echo -e "\t- ${i}: ${failed_tests[${i}]}"4030 done4031 echo4032fi4033 4034mptcp_lib_result_print_all_tap4035 4036exit $ret4037