Lines Matching +full:1 +full:- +full:2

2 # SPDX-License-Identifier: GPL-2.0
32 timeout_test=$((timeout_poll * 2 + 1))
44 last_test_ignored=1
46 declare -A all_tests
47 declare -a only_tests_ids
48 declare -a only_tests_names
49 declare -A failed_tests
90 21 0 1 48,
102 ip netns exec $netns sysctl -q net.mptcp.pm_type=0 2>/dev/null || true
104 ip netns exec $netns sysctl -q net.mptcp.checksum_enabled=1
118 for i in $(seq 1 4); do
120 ip -net "$ns1" addr add 10.0.$i.1/24 dev ns1eth$i
121 ip -net "$ns1" addr add dead:beef:$i::1/64 dev ns1eth$i nodad
122 ip -net "$ns1" link set ns1eth$i up
124 ip -net "$ns2" addr add 10.0.$i.2/24 dev ns2eth$i
125 ip -net "$ns2" addr add dead:beef:$i::2/64 dev ns2eth$i nodad
126 ip -net "$ns2" link set ns2eth$i up
129 ip -net "$ns2" route add default via 10.0.$i.1 dev ns2eth$i metric 10$i
130 ip -net "$ns2" route add default via dead:beef:$i::1 dev ns2eth$i metric 10$i
137 for i in $(seq 1 4); do
138 tc -n $ns1 qdisc add dev ns1eth$i root netem rate 20mbit delay 1ms
139 tc -n $ns2 qdisc add dev ns2eth$i root netem rate 20mbit delay 1ms
145 rm -f "$capout"
151 init=1
168 make_file "$cin" "client" 1 >/dev/null
169 make_file "$sin" "server" 1 >/dev/null
174 rm -f "$cin" "$cout" "$sinfail"
175 rm -f "$sin" "$sout" "$cinsent" "$cinfail"
176 rm -f "$tmpfile"
177 rm -rf $evts_ns1 $evts_ns2
178 rm -f "$err"
184 printf "%-${nr_blank}s%-36s" " " "${*}"
190 [ -z "${1}" ] && return
210 # $1: check name; $2: rc
213 local check="${1}"
214 local rc=${2}
226 # [ $1: fail msg ]
229 local msg="${1:-"Feature not supported"}"
236 last_test_skipped=1
244 return 1
250 if [ "${#only_tests_ids[@]}" -eq 0 ] && [ "${#only_tests_names[@]}" -eq 0 ]; then
251 return 1
256 if [ "$((MPTCP_LIB_TEST_COUNTER+1))" -eq "${i}" ]; then
257 return 1
262 return 1
271 if [ ${last_test_failed} -eq 1 ]; then
273 elif [ ${last_test_skipped} -eq 1 ]; then
275 elif [ ${last_test_ignored} -ne 1 ]; then
284 # $1: test name
289 TEST_NAME="${1}"
294 MPTCP_LIB_TEST_COUNTER=$((MPTCP_LIB_TEST_COUNTER+1))
295 last_test_ignored=1
296 return 1
301 if [ "${init}" != "1" ]; then
312 # $1: test name ; $2: counter to check
315 reset "${1}" || return 1
317 local counter="${2}"
319 if ! nstat -asz "${counter}" | grep -wq "${counter}"; then
321 return 1
325 # $1: test name
328 reset "${1}" || return 1
332 ip netns exec $netns sysctl -q net.ipv4.tcp_syncookies=2
336 # $1: test name
339 local ip="${2:-4}"
342 reset "${1}" || return 1
345 if [ $ip -eq 6 ]; then
349 ip netns exec $ns1 sysctl -q net.mptcp.add_addr_timeout=1
351 if ! ip netns exec $ns2 $tables -A OUTPUT -p tcp \
352 -m tcp --tcp-option 30 \
353 -m bpf --bytecode \
355 -j DROP; then
357 return 1
361 # $1: test name
364 local ns1_enable=$1
365 local ns2_enable=$2
367 reset "checksum test ${ns1_enable} ${ns2_enable}" || return 1
369 ip netns exec $ns1 sysctl -q net.mptcp.checksum_enabled=$ns1_enable
370 ip netns exec $ns2 sysctl -q net.mptcp.checksum_enabled=$ns2_enable
377 local ns1_enable=$2
380 reset "${1}" || return 1
382 ip netns exec $ns1 sysctl -q net.mptcp.allow_join_initial_addr_port=$ns1_enable
383 ip netns exec $ns2 sysctl -q net.mptcp.allow_join_initial_addr_port=$ns2_enable
388 # This rule inverts a 8-bit word at byte offset 148 for the 2nd TCP ACK packets
404 check_invert=1
406 local i="$1"
407 local ip="${2:-4}"
411 if [ $ip -eq 6 ]; then
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}
424 tc -n $ns2 qdisc add dev ns2eth$i clsact || return ${KSFT_SKIP}
425 tc -n $ns2 filter add dev ns2eth$i egress \
435 reset_check_counter "${1}" "MPTcpExtInfiniteMapTx" || return 1
438 ip netns exec $ns1 sysctl -q net.mptcp.checksum_enabled=1
439 ip netns exec $ns2 sysctl -q net.mptcp.checksum_enabled=1
444 if [ ${rc} -eq ${KSFT_SKIP} ]; then
446 return 1
458 reset "${1}" || return 1
465 reset "${1}" || return 1
468 local ns="${!1}"
469 local src="${2}"
471 local chain="${4:-INPUT}"
474 -A "${chain}" \
475 -s "${src}" \
476 -p tcp \
477 -j "${target}"; then
479 return 1
483 # $1: err msg
490 if [ ${#} -gt 0 ]; then
495 if [ ${last_test_failed} -eq 0 ]; then
498 last_test_failed=1
508 done | sort -n
513 local in=$1
514 local out=$2
520 if [ -n "$bytes" ]; then
523 out_size=$(wc -c $out | awk '{print $1}')
524 if [ $out_size -ne $bytes ]; then
526 return 1
529 # note: BusyBox's "cmp" command doesn't support --bytes
531 head --bytes="$bytes" "$in" > "$tmpfile"
533 head --bytes="$bytes" "$out" > "$tmpfile"
537 cmp -l "$in" "$out" | while read -r i a b; do
539 if [ $check_invert -eq 0 ] || [ $sum -ne $((0xff)) ]; then
544 return 1
555 local listener_ns="$1"
556 local connector_ns="$2"
559 if ! ip netns exec ${connector_ns} ping -q -c 1 $connect_addr >/dev/null; then
560 fail_test "$listener_ns -> $connect_addr connectivity"
566 local ns="$1"
568 if [ -z "$FAILING_LINKS" ]; then
570 FAILING_LINKS=$((l+1))
576 ip -net "$ns" link set "$veth" down
582 mptcp_lib_get_counter "${1}" "MPTcpExtRmAddr"
585 # $1: ns, $2: old rm_addr counter in $ns
588 local ns="${1}"
589 local old_cnt="${2}"
602 mptcp_lib_get_counter "${1}" "MPTcpExtRmSubflow"
605 # $1: ns, $2: old rm_sf counter in $ns
608 local ns="${1}"
609 local old_cnt="${2}"
622 local ns="${1}"
675 local msg="$1"
676 local ns=$2
683 while [ -n "$1" ]; do
684 case "${1}" in
686 eval "${1}"="${2}"
696 if [ -z "${id}" ]; then
697 fail_test "bad test - missing endpoint id"
708 local listener_ns="$1"
709 local connector_ns="$2"
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:-""}
718 if [ -n "${fullmesh}" ]; then
726 sleep 1
729 if [ $addr_nr_ns1 -gt 0 ]; then
730 local counter=2
733 while [ $add_nr_ns1 -gt 0 ]; do
736 addr="dead:beef:$counter::1"
738 addr="10.0.$counter.1"
741 counter=$((counter + 1))
742 add_nr_ns1=$((add_nr_ns1 - 1))
743 id=$((id + 1))
745 elif [ $addr_nr_ns1 -lt 0 ]; then
746 local rm_nr_ns1=$((-addr_nr_ns1))
747 if [ $rm_nr_ns1 -lt 8 ]; then
750 pm_nl_show_endpoints ${listener_ns} | while read -r line; do
758 if [ $counter -eq $rm_nr_ns1 ]; then
761 id=${arr[$nr+1]}
765 counter=$((counter + 1))
767 nr=$((nr + 1))
770 elif [ $rm_nr_ns1 -eq 8 ]; then
772 elif [ $rm_nr_ns1 -eq 9 ]; then
779 [ $addr_nr_ns1 -gt 0 ] && [ $addr_nr_ns2 -lt 0 ] && sleep 1
781 if [ $addr_nr_ns2 -gt 0 ]; then
785 while [ $add_nr_ns2 -gt 0 ]; do
788 addr="dead:beef:$counter::2"
790 addr="10.0.$counter.2"
793 counter=$((counter + 1))
794 add_nr_ns2=$((add_nr_ns2 - 1))
795 id=$((id + 1))
797 elif [ $addr_nr_ns2 -lt 0 ]; then
798 local rm_nr_ns2=$((-addr_nr_ns2))
799 if [ $rm_nr_ns2 -lt 8 ]; then
802 pm_nl_show_endpoints ${connector_ns} | while read -r line; do
810 if [ $counter -eq $rm_nr_ns2 ]; then
816 id=${arr[$nr+1]}
820 counter=$((counter + 1))
822 nr=$((nr + 1))
825 elif [ $rm_nr_ns2 -eq 8 ]; then
827 elif [ $rm_nr_ns2 -eq 9 ]; then
830 addr="dead:beef:1::2"
838 if [ -n "${sflags}" ]; then
839 sleep 1
844 pm_nl_show_endpoints $netns | while read -r line; do
853 id=${arr[$nr+1]}
855 nr=$((nr + 1))
865 local ns=$1
866 local cestab=$2
871 if [ -z "$count" ]; then
880 # $1 namespace 1, $2 namespace 2
883 if [ -n "${cestab_ns1}" ]; then
884 chk_cestab_nr ${1} ${cestab_ns1}
886 if [ -n "${cestab_ns2}" ]; then
887 chk_cestab_nr ${2} ${cestab_ns2}
893 local ns="$1"
899 if [ -z $SUDO_USER ]; then
902 capuser="-Z $SUDO_USER"
905 capfile=$(printf "mp_join-%02u-%s.pcap" "$MPTCP_LIB_TEST_COUNTER" "$ns")
908 ip netns exec "$ns" tcpdump -i any -s 65535 -B 32768 $capuser -w "$capfile" > "$capout" 2>&1 &
911 sleep 1
918 sleep 1
926 echo "$((10000 + MPTCP_LIB_TEST_COUNTER - 1))"
931 local listener_ns="$1"
932 local connector_ns="$2"
938 local FAILING_LINKS=${FAILING_LINKS:-""}
939 local fastclose=${fastclose:-""}
940 local speed=${speed:-"fast"}
949 nstat -n
951 nstat -n
955 extra_args="-j"
957 extra_args="-r 50"
958 elif [ $speed -gt 0 ]; then
959 extra_args="-r ${speed}"
965 if [ -n "${fastclose}" ]; then
966 if [ ${test_linkfail} -le 1 ]; then
968 return 1
976 extra_cl_args="-f ${test_linkfail}"
977 extra_srv_args="-f -1"
979 extra_srv_args="-f ${test_linkfail}"
980 extra_cl_args="-f -1"
983 return 1
988 if [ "$test_linkfail" -gt 1 ];then
991 ./mptcp_connect -t ${timeout_poll} -l -p $port -s ${srv_proto} \
996 ./mptcp_connect -t ${timeout_poll} -l -p $port -s ${srv_proto} \
1004 if [ "$test_linkfail" -eq 0 ];then
1007 ./mptcp_connect -t ${timeout_poll} -p $port -s ${cl_proto} \
1009 elif [ "$test_linkfail" -eq 1 ] || [ "$test_linkfail" -eq 2 ];then
1010 ( cat "$cinfail" ; sleep 2; link_failure $listener_ns ; cat "$cinfail" ) | \
1014 ./mptcp_connect -t ${timeout_poll} -p $port -s ${cl_proto} \
1020 ./mptcp_connect -t ${timeout_poll} -p $port -s ${cl_proto} \
1040 if [ ${rets} -ne 0 ] || [ ${retc} -ne 0 ]; then
1044 return 1
1047 if [ "$test_linkfail" -gt 1 ];then
1053 if [ "$test_linkfail" -eq 0 ];then
1060 [ $retc -eq 0 ] && [ $rets -eq 0 ]
1065 local name=$1
1066 local who=$2
1076 local listener_ns="$1"
1077 local connector_ns="$2"
1081 local test_linkfail=${test_linkfail:-0}
1083 # The values above 2 are reused to make test files
1085 if [ "$test_linkfail" -gt 2 ]; then
1088 if [ -z "$cinfail" ]; then
1094 elif [ "$test_linkfail" -ne 0 ] && [ -z "$cinfail" ]; then
1098 size=$((RANDOM%2))
1099 size=$((size+1))
1107 if [ "$test_linkfail" -gt 2 ]; then
1110 if [ -z "$sinfail" ]; then
1114 elif [ "$test_linkfail" -eq 2 ] && [ -z "$sinfail" ]; then
1116 size=$((size+1))
1129 ip netns exec $ns1 nstat -as | grep Tcp
1131 ip netns exec $ns2 nstat -as | grep Tcp
1136 local csum_ns1=${1:-0}
1137 local csum_ns2=${2:-0}
1144 allow_multi_errors_ns1=1
1145 csum_ns1=${csum_ns1:1}
1148 allow_multi_errors_ns2=1
1149 csum_ns2=${csum_ns2:1}
1154 if [ -n "$count" ] && [ "$count" != "$csum_ns1" ]; then
1157 if [ -z "$count" ]; then
1159 elif { [ "$count" != $csum_ns1 ] && [ $allow_multi_errors_ns1 -eq 0 ]; } ||
1160 { [ "$count" -lt $csum_ns1 ] && [ $allow_multi_errors_ns1 -eq 1 ]; }; then
1168 if [ -n "$count" ] && [ "$count" != "$csum_ns2" ]; then
1171 if [ -z "$count" ]; then
1173 elif { [ "$count" != $csum_ns2 ] && [ $allow_multi_errors_ns2 -eq 0 ]; } ||
1174 { [ "$count" -lt $csum_ns2 ] && [ $allow_multi_errors_ns2 -eq 1 ]; }; then
1185 local fail_tx=$1
1186 local fail_rx=$2
1187 local ns_invert=${3:-""}
1204 if [[ "${fail_tx}" = "-"* ]]; then
1205 allow_tx_lost=1
1206 fail_tx=${fail_tx:1}
1208 if [[ "${fail_rx}" = "-"* ]]; then
1209 allow_rx_lost=1
1210 fail_rx=${fail_rx:1}
1215 if [ -n "$count" ] && [ "$count" != "$fail_tx" ]; then
1218 if [ -z "$count" ]; then
1220 elif { [ "$count" != "$fail_tx" ] && [ $allow_tx_lost -eq 0 ]; } ||
1221 { [ "$count" -gt "$fail_tx" ] && [ $allow_tx_lost -eq 1 ]; }; then
1229 if [ -n "$count" ] && [ "$count" != "$fail_rx" ]; then
1232 if [ -z "$count" ]; then
1234 elif { [ "$count" != "$fail_rx" ] && [ $allow_rx_lost -eq 0 ]; } ||
1235 { [ "$count" -gt "$fail_rx" ] && [ $allow_rx_lost -eq 1 ]; }; then
1246 local fclose_tx=$1
1247 local fclose_rx=$2
1264 if [ -z "$count" ]; then
1274 if [ -z "$count" ]; then
1285 local rst_tx=$1
1286 local rst_rx=$2
1287 local ns_invert=${3:-""}
1303 if [ -z "$count" ]; then
1306 elif { [ $rst_tx -ne 0 ] && [ $count -lt $rst_tx ]; } ||
1307 { [ $rst_tx -eq 0 ] && [ $count -ne 0 ]; }; then
1315 if [ -z "$count" ]; then
1318 elif { [ $rst_rx -ne 0 ] && [ $count -lt $rst_rx ]; } ||
1319 { [ $rst_rx -eq 0 ] && [ $count -ne 0 ]; }; then
1328 local infi_tx=$1
1329 local infi_rx=$2
1334 if [ -z "$count" ]; then
1344 if [ -z "$count" ]; then
1355 local syn_tx=${join_syn_tx:-0}
1356 local create=${join_create_err:-0}
1357 local bind=${join_bind_err:-0}
1358 local connect=${join_connect_err:-0}
1363 if [ -z "$count" ]; then
1372 if [ -z "$count" ]; then
1381 if [ -z "$count" ]; then
1390 if [ -z "$count" ]; then
1403 local syn_nr=$1
1404 local syn_ack_nr=$2
1406 local csum_ns1=${join_csum_ns1:-0}
1407 local csum_ns2=${join_csum_ns2:-0}
1408 local fail_nr=${join_fail_nr:-0}
1409 local rst_nr=${join_rst_nr:-0}
1410 local infi_nr=${join_infi_nr:-0}
1411 local corrupted_pkts=${join_corrupted_pkts:-0}
1416 if [ "${corrupted_pkts}" -gt 0 ]; then
1421 if [ -z "$count" ]; then
1429 with_cookie=$(ip netns exec $ns2 sysctl -n net.ipv4.tcp_syncookies)
1431 if [ -z "$count" ]; then
1437 if [ "$with_cookie" != 2 ] || [ "$count" -le "$syn_ack_nr" ] || [ "$count" -gt "$syn_nr" ]; then
1445 if [ -z "$count" ]; then
1455 join_syn_tx="${join_syn_tx:-${syn_nr}}" \
1468 # - as these tests do - we can have a quite high number of
1470 # sleep duration/ MPTCP-level RTX interval.
1473 local ns=$1
1474 local stale_min=$2
1485 if [ -z "$stale_nr" ] || [ -z "$recover_nr" ]; then
1487 elif [ $stale_nr -lt $stale_min ] ||
1488 { [ $stale_max -gt 0 ] && [ $stale_nr -gt $stale_max ]; } ||
1489 [ $((stale_nr - recover_nr)) -ne $stale_delta ]; then
1492 " stale-recover delta $stale_delta"
1493 dump_stats=1
1498 if [ "${dump_stats}" = 1 ]; then
1500 ip netns exec $ns ip -s link show
1501 ip netns exec $ns nstat -as | grep MPTcp
1507 local add_nr=$1
1508 local echo_nr=$2
1509 local port_nr=${3:-0}
1510 local ns_invert=${4:-""}
1530 timeout=$(ip netns exec ${ns_tx} sysctl -n net.mptcp.add_addr_timeout)
1534 if [ -z "$count" ]; then
1538 elif [ "$count" != "$add_nr" ] && { [ "$timeout" -gt 1 ] || [ "$count" -lt "$add_nr" ]; }; then
1546 if [ -z "$count" ]; then
1554 if [ $port_nr -gt 0 ]; then
1557 if [ -z "$count" ]; then
1560 fail_test "got $count ADD_ADDR[s] with a port-number expected $port_nr"
1567 if [ -z "$count" ]; then
1571 port-number expected $syn_nr"
1578 if [ -z "$count" ]; then
1582 port-number expected $syn_ack_nr"
1589 if [ -z "$count" ]; then
1593 port-number expected $ack_nr"
1600 if [ -z "$count" ]; then
1604 port-number expected $mis_syn_nr"
1611 if [ -z "$count" ]; then
1615 port-number expected $mis_ack_nr"
1624 local add_tx_nr=$1
1625 local echo_tx_nr=$2
1629 timeout=$(ip netns exec $ns1 sysctl -n net.mptcp.add_addr_timeout)
1633 if [ -z "$count" ]; then
1637 …elif [ "$count" != "$add_tx_nr" ] && { [ "$timeout" -gt 1 ] || [ "$count" -lt "$add_tx_nr" ]; }; t…
1645 if [ -z "$count" ]; then
1656 local rm_addr_nr=$1
1657 local rm_subflow_nr=$2
1667 shift 2
1668 while [ -n "$1" ]; do
1669 [ "$1" = "invert" ] && invert=true
1670 [ "$1" = "simult" ] && simult=true
1683 if [ -z "$count" ]; then
1693 if [ -z "$count" ]; then
1695 elif [ -n "$simult" ]; then
1704 suffix="$count in [$rm_subflow_nr:$((rm_subflow_nr*2))]"
1707 if [ $count -ge "$rm_subflow_nr" ] && \
1708 [ "$count" -le "$((rm_subflow_nr *2 ))" ]; then
1711 fail_test "got $count RM_SUBFLOW[s] expected in range [$rm_subflow_nr:$((rm_subflow_nr*2))]"
1724 local rm_addr_tx_nr=$1
1728 if [ -z "$count" ]; then
1739 local mp_prio_nr_tx=$1
1740 local mp_prio_nr_rx=$2
1747 if [ -z "$count" ]; then
1757 if [ -z "$count" ]; then
1767 if [ -z "$count" ]; then
1777 if [ -z "$count" ]; then
1788 local msg="$1"
1789 local subflow_nr=$2
1796 cnt1=$(ss -N $ns1 -tOni | grep -c token)
1797 cnt2=$(ss -N $ns2 -tOni | grep -c token)
1800 dump_stats=1
1805 if [ "${dump_stats}" = 1 ]; then
1806 ss -N $ns1 -tOni
1807 ss -N $ns1 -tOni | grep token
1808 ip -n $ns1 mptcp endpoint
1814 local info1=$1
1815 local exp1=$2
1824 cnt1=$(ss -N $ns1 -inmHM | mptcp_lib_get_info_value "$info1" "$info1")
1825 cnt2=$(ss -N $ns2 -inmHM | mptcp_lib_get_info_value "$info2" "$info2")
1827 [ -z "$cnt1" ] && cnt1=0
1828 [ -z "$cnt2" ] && cnt2=0
1832 dump_stats=1
1837 if [ "$dump_stats" = 1 ]; then
1838 ss -N $ns1 -inmHM
1839 ss -N $ns2 -inmHM
1843 # $1: subflows in ns1 ; $2: subflows in ns2
1853 if [ -n "$(ss -N $ns1 -inmHM | mptcp_lib_get_info_value $info $info)" ]; then
1854 chk_mptcp_info $info $1 $info $2
1858 print_check "$info $1:$2"
1861 cnt1=$(ss -N $ns1 -ti state established state syn-sent state syn-recv |
1862 grep -c tcp-ulp-mptcp)
1863 cnt2=$(ss -N $ns2 -ti state established state syn-sent state syn-recv |
1864 grep -c tcp-ulp-mptcp)
1866 if [ "$1" != "$cnt1" ] || [ "$2" != "$cnt2" ]; then
1867 fail_test "got subflows $cnt1:$cnt2 expected $1:$2"
1868 dump_stats=1
1873 if [ "$dump_stats" = 1 ]; then
1874 ss -N $ns1 -ti
1875 ss -N $ns2 -ti
1881 local ns=$1
1882 local link=$2
1888 tx_total=$(stat --format=%s $out)
1893 if [ $tx_rate -lt $((expected_rate - tolerance)) ] || \
1894 [ $tx_rate -gt $((expected_rate + tolerance)) ]; then
1905 local ns=$1
1907 while [ $time -lt $timeout_ms ]; do
1912 [ "$cnt" = 1 ] && return 1
1916 return 1
1921 local ns=$1
1923 ip netns exec $ns sysctl -q net.mptcp.pm_type=1
1945 pm_nl_set_limits $ns2 0 1
1948 chk_join_nr 1 1 0
1953 pm_nl_set_limits $ns1 0 1
1954 pm_nl_set_limits $ns2 0 1
1957 chk_join_nr 1 1 1
1962 pm_nl_set_limits $ns1 0 2
1963 pm_nl_set_limits $ns2 0 2
1967 chk_join_nr 2 2 2
1972 pm_nl_set_limits $ns1 0 1
1973 pm_nl_set_limits $ns2 0 2
1977 chk_join_nr 2 2 1
1982 pm_nl_set_limits $ns1 0 1
1983 pm_nl_set_limits $ns2 0 1
1986 chk_join_nr 1 1 1
1995 pm_nl_set_limits $ns1 0 1
1996 pm_nl_set_limits $ns2 0 1
2001 join_bind_err=1 \
2008 pm_nl_set_limits $ns1 0 2
2009 pm_nl_set_limits $ns2 0 2
2014 join_syn_tx=2 \
2015 chk_join_nr 1 1 1
2021 pm_nl_set_limits $ns1 0 2
2022 pm_nl_set_limits $ns2 0 2
2027 join_syn_tx=2 \
2028 chk_join_nr 1 1 1
2036 pm_nl_set_limits $ns1 0 1
2037 pm_nl_set_limits $ns2 0 1
2049 join_syn_tx=2 \
2050 chk_join_nr 1 1 1
2061 chk_add_tx_nr 1 1
2062 chk_add_nr 1 1
2067 pm_nl_set_limits $ns1 0 1
2068 pm_nl_set_limits $ns2 1 1
2071 chk_join_nr 1 1 1
2072 chk_add_nr 1 1
2081 pm_nl_set_limits $ns1 0 2
2082 pm_nl_set_limits $ns2 1 2
2085 chk_join_nr 2 2 2
2086 chk_add_nr 1 1
2093 pm_nl_set_limits $ns1 0 2
2094 pm_nl_set_limits $ns2 0 2
2097 chk_join_nr 1 1 1
2098 chk_add_nr 1 1 0 invert # only initiated by ns2
2108 pm_nl_set_limits $ns2 1 3
2113 chk_add_nr 1 1
2137 chk_join_nr 1 1 1
2155 ip netns exec $ns1 sysctl -q net.mptcp.add_addr_timeout=1
2162 chk_join_nr 3 3 2
2181 # active backup and link switch-over.
2186 pm_nl_set_limits $ns2 1 3
2189 test_linkfail=1 \
2192 chk_add_nr 1 1
2193 chk_stale_nr $ns2 1 5 1
2202 pm_nl_set_limits $ns2 1 3
2205 test_linkfail=2 \
2208 chk_add_nr 1 1
2209 chk_stale_nr $ns2 1 -1 1
2212 # 2 subflows plus 1 backup subflow with a lossy link, backup
2216 pm_nl_set_limits $ns1 0 2
2218 pm_nl_set_limits $ns2 1 2
2220 FAILING_LINKS="1" test_linkfail=1 \
2222 chk_join_nr 2 2 2
2223 chk_add_nr 1 1
2227 # 2 lossy links after half transfer, backup will get half of
2231 pm_nl_set_limits $ns1 0 2
2233 pm_nl_set_limits $ns2 1 2
2235 FAILING_LINKS="1 2" test_linkfail=1 \
2237 chk_join_nr 2 2 2
2238 chk_add_nr 1 1
2239 chk_stale_nr $ns2 2 4 2
2247 pm_nl_set_limits $ns1 0 2
2249 pm_nl_set_limits $ns2 1 3
2251 FAILING_LINKS="1 2" test_linkfail=2 \
2253 chk_join_nr 2 2 2
2254 chk_add_nr 1 1
2255 chk_stale_nr $ns2 1 -1 2
2264 pm_nl_set_limits $ns1 0 1
2265 pm_nl_set_limits $ns2 1 1
2269 chk_join_nr 1 1 1
2276 pm_nl_set_limits $ns1 0 1
2277 pm_nl_set_limits $ns2 1 1
2278 pm_nl_add_endpoint $ns1 dead:beef:2::1 flags signal
2280 run_tests $ns1 $ns2 dead:beef:1::1
2281 chk_join_nr 1 1 1
2287 pm_nl_set_limits $ns1 2 2
2290 pm_nl_set_limits $ns2 2 2
2293 chk_join_nr 2 2 2
2299 pm_nl_set_limits $ns1 2 2
2302 pm_nl_set_limits $ns2 2 2
2305 join_syn_tx=2 \
2306 chk_join_nr 1 1 1
2315 pm_nl_set_limits $ns1 0 1
2316 pm_nl_set_limits $ns2 0 1
2318 addr_nr_ns2=-1 speed=slow \
2320 chk_join_nr 1 1 1
2321 chk_rm_tx_nr 1
2322 chk_rm_nr 1 1
2328 pm_nl_set_limits $ns1 0 2
2329 pm_nl_set_limits $ns2 0 2
2332 addr_nr_ns2=-2 speed=slow \
2334 chk_join_nr 2 2 2
2335 chk_rm_nr 2 2
2341 pm_nl_set_limits $ns1 0 1
2343 pm_nl_set_limits $ns2 1 1
2344 addr_nr_ns1=-1 speed=slow \
2346 chk_join_nr 1 1 1
2347 chk_add_nr 1 1
2348 chk_rm_nr 1 1 invert
2354 pm_nl_set_limits $ns1 0 2
2356 pm_nl_set_limits $ns2 1 2
2358 addr_nr_ns1=-1 addr_nr_ns2=-1 speed=slow \
2360 chk_join_nr 2 2 2
2361 chk_add_nr 1 1
2362 chk_rm_nr 1 1
2370 pm_nl_set_limits $ns2 1 3
2373 addr_nr_ns1=-1 addr_nr_ns2=-2 speed=10 \
2376 chk_add_nr 1 1
2377 chk_rm_nr 2 2
2388 addr_nr_ns1=-3 speed=10 \
2403 pm_nl_set_limits $ns2 2 2
2404 addr_nr_ns1=-3 speed=10 \
2406 join_syn_tx=2 join_connect_err=1 \
2407 chk_join_nr 1 1 1
2409 chk_rm_nr 3 1 invert
2417 pm_nl_set_limits $ns2 1 3
2420 addr_nr_ns1=-8 addr_nr_ns2=-8 speed=slow \
2423 chk_add_nr 1 1
2424 chk_rm_nr 1 3 invert simult
2435 addr_nr_ns1=-8 addr_nr_ns2=-8 speed=slow \
2455 addr_nr_ns1=-8 addr_nr_ns2=-8 speed=slow \
2470 addr_nr_ns1=-8 speed=slow \
2473 chk_join_nr 1 1 1
2475 chk_rm_nr 3 1 invert
2481 pm_nl_set_limits $ns1 0 1
2482 pm_nl_set_limits $ns2 0 1
2484 addr_nr_ns2=-9 speed=slow \
2486 chk_join_nr 1 1 1
2487 chk_rm_nr 1 1
2493 pm_nl_set_limits $ns1 0 1
2495 pm_nl_set_limits $ns2 1 1
2496 addr_nr_ns1=-9 speed=slow \
2498 chk_join_nr 1 1 1
2499 chk_add_nr 1 1
2500 chk_rm_nr 1 1 invert
2509 pm_nl_set_limits $ns1 0 1
2510 pm_nl_set_limits $ns2 0 1
2511 addr_nr_ns2=1 speed=slow cestab_ns2=1 \
2513 chk_join_nr 1 1 1
2519 pm_nl_set_limits $ns1 0 1
2520 pm_nl_set_limits $ns2 1 1
2521 addr_nr_ns1=1 speed=slow cestab_ns1=1 \
2523 chk_join_nr 1 1 1
2524 chk_add_nr 1 1
2530 pm_nl_set_limits $ns1 0 2
2531 pm_nl_set_limits $ns2 0 2
2532 addr_nr_ns2=2 speed=slow cestab_ns2=1 \
2534 chk_join_nr 2 2 2
2540 pm_nl_set_limits $ns1 0 2
2541 pm_nl_set_limits $ns2 0 2
2542 addr_nr_ns2=2 speed=slow cestab_ns2=1 \
2543 run_tests $ns1 $ns2 dead:beef:1::1
2544 chk_join_nr 2 2 2
2550 pm_nl_set_limits $ns1 0 2
2551 pm_nl_set_limits $ns2 2 2
2552 addr_nr_ns1=2 speed=slow cestab_ns1=1 \
2553 run_tests $ns1 $ns2 dead:beef:1::1
2554 chk_join_nr 2 2 2
2555 chk_add_nr 2 2
2564 pm_nl_set_limits $ns1 0 1
2565 pm_nl_set_limits $ns2 0 1
2566 pm_nl_add_endpoint $ns2 dead:beef:3::2 dev ns2eth3 flags subflow
2568 run_tests $ns1 $ns2 dead:beef:1::1
2569 chk_join_nr 1 1 1
2574 pm_nl_add_endpoint $ns1 dead:beef:2::1 flags signal
2576 run_tests $ns1 $ns2 dead:beef:1::1
2578 chk_add_nr 1 1
2583 pm_nl_set_limits $ns1 0 1
2584 pm_nl_add_endpoint $ns1 dead:beef:2::1 flags signal
2585 pm_nl_set_limits $ns2 1 1
2587 run_tests $ns1 $ns2 dead:beef:1::1
2588 chk_join_nr 1 1 1
2589 chk_add_nr 1 1
2594 pm_nl_set_limits $ns1 0 1
2595 pm_nl_add_endpoint $ns1 dead:beef:2::1 flags signal
2596 pm_nl_set_limits $ns2 1 1
2597 addr_nr_ns1=-1 speed=slow \
2598 run_tests $ns1 $ns2 dead:beef:1::1
2599 chk_join_nr 1 1 1
2600 chk_add_nr 1 1
2601 chk_rm_nr 1 1 invert
2606 pm_nl_set_limits $ns1 0 2
2607 pm_nl_add_endpoint $ns1 dead:beef:2::1 flags signal
2608 pm_nl_set_limits $ns2 1 2
2609 pm_nl_add_endpoint $ns2 dead:beef:3::2 dev ns2eth3 flags subflow
2610 addr_nr_ns1=-1 addr_nr_ns2=-1 speed=slow \
2611 run_tests $ns1 $ns2 dead:beef:1::1
2612 chk_join_nr 2 2 2
2613 chk_add_nr 1 1
2614 chk_rm_nr 1 1
2620 # subflow IPv4-mapped to IPv4-mapped
2621 if reset "single subflow IPv4-mapped"; then
2622 pm_nl_set_limits $ns1 0 1
2623 pm_nl_set_limits $ns2 0 1
2626 chk_join_nr 1 1 1
2629 # signal address IPv4-mapped with IPv4-mapped sk
2630 if reset "signal address IPv4-mapped"; then
2631 pm_nl_set_limits $ns1 0 1
2632 pm_nl_set_limits $ns2 1 1
2635 chk_join_nr 1 1 1
2636 chk_add_nr 1 1
2639 # subflow v4-map-v6
2640 if reset "single subflow v4-map-v6"; then
2641 pm_nl_set_limits $ns1 0 1
2642 pm_nl_set_limits $ns2 0 1
2645 chk_join_nr 1 1 1
2648 # signal address v4-map-v6
2649 if reset "signal address v4-map-v6"; then
2650 pm_nl_set_limits $ns1 0 1
2651 pm_nl_set_limits $ns2 1 1
2654 chk_join_nr 1 1 1
2655 chk_add_nr 1 1
2658 # subflow v6-map-v4
2659 if reset "single subflow v6-map-v4"; then
2660 pm_nl_set_limits $ns1 0 1
2661 pm_nl_set_limits $ns2 0 1
2664 chk_join_nr 1 1 1
2667 # signal address v6-map-v4
2668 if reset "signal address v6-map-v4"; then
2669 pm_nl_set_limits $ns1 0 1
2670 pm_nl_set_limits $ns2 1 1
2673 chk_join_nr 1 1 1
2674 chk_add_nr 1 1
2678 if reset "no JOIN with diff families v4-v6"; then
2679 pm_nl_set_limits $ns1 0 1
2680 pm_nl_set_limits $ns2 0 1
2681 pm_nl_add_endpoint $ns2 dead:beef:2::2 flags subflow
2687 if reset "no JOIN with diff families v4-v6-2"; then
2688 pm_nl_set_limits $ns1 0 1
2689 pm_nl_set_limits $ns2 0 1
2690 pm_nl_add_endpoint $ns2 dead:beef:2::10.0.3.2 flags subflow
2696 if reset "no JOIN with diff families v6-v4"; then
2697 pm_nl_set_limits $ns1 0 1
2698 pm_nl_set_limits $ns2 0 1
2700 run_tests $ns1 $ns2 dead:beef:1::1
2709 pm_nl_set_limits $ns1 0 1
2710 pm_nl_set_limits $ns2 1 1
2711 pm_nl_add_endpoint $ns1 dead:beef:2::1 flags signal
2720 pm_nl_set_limits $ns1 0 1
2721 pm_nl_set_limits $ns2 1 1
2724 run_tests $ns1 $ns2 dead:beef:2::1
2725 chk_join_nr 1 1 1
2729 if reset "simult IPv4 and IPv6 subflows, fullmesh 1x1" &&
2732 pm_nl_set_limits $ns2 1 4
2733 pm_nl_add_endpoint $ns2 dead:beef:2::2 flags subflow,fullmesh
2736 run_tests $ns1 $ns2 dead:beef:2::1
2737 chk_join_nr 1 1 1
2742 if reset "simult IPv4 and IPv6 subflows, fullmesh 2x2" &&
2745 pm_nl_set_limits $ns2 2 4
2747 pm_nl_add_endpoint $ns1 dead:beef:2::1 flags signal
2748 fullmesh=1 speed=slow \
2749 run_tests $ns1 $ns2 dead:beef:1::1
2759 pm_nl_set_limits $ns1 0 1
2760 pm_nl_set_limits $ns2 0 1
2764 chk_join_nr 1 1 1
2765 chk_prio_nr 0 1 1 0
2771 pm_nl_set_limits $ns1 0 1
2773 pm_nl_set_limits $ns2 1 1
2776 chk_join_nr 1 1 1
2777 chk_add_nr 1 1
2778 chk_prio_nr 1 0 0 1
2784 pm_nl_set_limits $ns1 0 1
2786 pm_nl_set_limits $ns2 1 1
2789 chk_join_nr 1 1 1
2790 chk_add_nr 1 1
2791 chk_prio_nr 1 1 0 0
2797 pm_nl_set_limits $ns1 0 1
2799 pm_nl_set_limits $ns2 1 1
2802 chk_join_nr 1 1 1
2803 chk_add_nr 1 1
2804 chk_prio_nr 1 0 0 1
2813 chk_prio_nr 0 1 0 0
2818 pm_nl_set_limits $ns1 0 2
2819 pm_nl_set_limits $ns2 1 2
2823 # 10.0.2.2 (non-backup) -> 10.0.1.1 (backup)
2825 # 10.0.1.2 (backup) -> 10.0.2.1 (non-backup)
2827 ip -net "$ns2" route add 10.0.2.1 via 10.0.1.1 dev ns2eth1 # force this path
2831 chk_join_nr 2 2 2
2832 chk_prio_nr 1 1 1 1
2841 chk_prio_nr 0 1 0 0
2851 chk_prio_nr 1 1 0 0
2857 local e_type=$2
2886 local retl=$1
2887 local attempts=$2
2900 if [ -z "$count" ]; then
2903 fail_test "got ${count} MPC attempt[s] on port-based endpoint, expected ${attempts}"
2914 pm_nl_set_limits $ns1 0 1
2915 pm_nl_set_limits $ns2 1 1
2918 chk_join_nr 1 1 1
2919 chk_add_nr 1 1 1
2925 pm_nl_set_limits $ns1 0 2
2926 pm_nl_set_limits $ns2 1 2
2929 chk_join_nr 2 2 2
2930 chk_add_nr 1 1 1
2936 pm_nl_set_limits $ns1 0 1
2938 pm_nl_set_limits $ns2 1 1
2939 addr_nr_ns1=-1 speed=slow \
2941 chk_join_nr 1 1 1
2942 chk_add_nr 1 1 1
2943 chk_rm_nr 1 1 invert
2954 pm_nl_set_limits $ns1 0 2
2956 pm_nl_set_limits $ns2 1 2
2958 addr_nr_ns1=-1 addr_nr_ns2=-1 speed=slow \
2960 chk_join_nr 2 2 2
2961 chk_add_nr 1 1 1
2962 chk_rm_nr 1 1
2969 pm_nl_set_limits $ns2 1 3
2972 addr_nr_ns1=-8 addr_nr_ns2=-2 speed=slow \
2975 chk_add_nr 1 1
2976 chk_rm_nr 1 3 invert simult
2981 pm_nl_set_limits $ns1 2 2
2984 pm_nl_set_limits $ns2 2 2
2986 chk_join_nr 2 2 2
2987 chk_add_nr 2 2 2
2992 pm_nl_set_limits $ns1 2 2
2995 pm_nl_set_limits $ns2 2 2
2997 chk_join_nr 2 2 2
2998 chk_add_nr 2 2 2
3001 if reset "port-based signal endpoint must not accept mpc"; then
3009 timeout 1 ip netns exec ${ns2} \
3010 ./mptcp_connect -t ${timeout_poll} -p $port -s MPTCP 10.0.2.1 >/dev/null 2>&1
3014 chk_mpc_endp_attempt ${retl} 1
3022 pm_nl_set_limits $ns1 0 1
3023 pm_nl_set_limits $ns2 0 1
3026 chk_join_nr 1 1 1
3031 pm_nl_set_limits $ns1 0 2
3032 pm_nl_set_limits $ns2 0 2
3036 chk_join_nr 2 2 2
3041 pm_nl_set_limits $ns1 0 1
3042 pm_nl_set_limits $ns2 0 2
3046 chk_join_nr 2 1 1
3051 pm_nl_set_limits $ns1 0 1
3052 pm_nl_set_limits $ns2 1 1
3055 chk_join_nr 1 1 1
3056 chk_add_nr 1 1
3062 pm_nl_set_limits $ns1 0 2
3063 pm_nl_set_limits $ns2 1 2
3066 chk_join_nr 2 2 2
3067 chk_add_nr 1 1
3074 pm_nl_set_limits $ns2 1 3
3079 chk_add_nr 1 1
3086 for checksum_enable in "0 0" "1 1" "0 1" "1 0"; do
3087 # checksum test 0 0, 1 1, 0 1, 1 0
3089 pm_nl_set_limits $ns1 0 1
3090 pm_nl_set_limits $ns2 0 1
3100 if reset_with_allow_join_id0 "single subflow allow join id0 ns1" 1 0; then
3101 pm_nl_set_limits $ns1 1 1
3102 pm_nl_set_limits $ns2 1 1
3105 chk_join_nr 1 1 1
3109 if reset_with_allow_join_id0 "single subflow allow join id0 ns2" 0 1; then
3110 pm_nl_set_limits $ns1 1 1
3111 pm_nl_set_limits $ns2 1 1
3119 if reset_with_allow_join_id0 "signal address allow join id0 ns1" 1 0; then
3120 pm_nl_set_limits $ns1 1 1
3121 pm_nl_set_limits $ns2 1 1
3124 chk_join_nr 1 1 1
3125 chk_add_nr 1 1
3130 if reset_with_allow_join_id0 "signal address allow join id0 ns2" 0 1; then
3131 pm_nl_set_limits $ns1 1 1
3132 pm_nl_set_limits $ns2 1 1
3135 chk_join_nr 1 1 1
3136 chk_add_nr 1 1
3140 if reset_with_allow_join_id0 "subflow and address allow join id0 1" 1 0; then
3141 pm_nl_set_limits $ns1 2 2
3142 pm_nl_set_limits $ns2 2 2
3146 chk_join_nr 2 2 2
3150 if reset_with_allow_join_id0 "subflow and address allow join id0 2" 0 1; then
3151 pm_nl_set_limits $ns1 2 2
3152 pm_nl_set_limits $ns2 2 2
3156 chk_join_nr 1 1 1
3162 # fullmesh 1
3163 # 2 fullmesh addrs in ns2, added before the connection,
3164 # 1 non-fullmesh addr in ns1, added during the connection.
3165 if reset "fullmesh test 2x1"; then
3167 pm_nl_set_limits $ns2 1 4
3170 addr_nr_ns1=1 speed=slow \
3173 chk_add_nr 1 1
3176 # fullmesh 2
3177 # 1 non-fullmesh addr in ns1, added before the connection,
3178 # 1 fullmesh addr in ns2, added during the connection.
3179 if reset "fullmesh test 1x1"; then
3180 pm_nl_set_limits $ns1 1 3
3181 pm_nl_set_limits $ns2 1 3
3186 fullmesh=1 speed=slow \
3189 chk_add_nr 1 1
3193 # 1 non-fullmesh addr in ns1, added before the connection,
3194 # 2 fullmesh addrs in ns2, added during the connection.
3195 if reset "fullmesh test 1x2"; then
3196 pm_nl_set_limits $ns1 2 5
3197 pm_nl_set_limits $ns2 1 5
3199 fullmesh=2 speed=slow \
3202 chk_add_nr 1 1
3206 # 1 non-fullmesh addr in ns1, added before the connection,
3207 # 2 fullmesh addrs in ns2, added during the connection,
3209 if reset "fullmesh test 1x2, limited"; then
3210 pm_nl_set_limits $ns1 2 4
3211 pm_nl_set_limits $ns2 1 4
3213 fullmesh=2 speed=slow \
3216 chk_add_nr 1 1
3225 addr_nr_ns2=1 sflags=fullmesh speed=slow \
3227 chk_join_nr 2 2 2
3228 chk_rm_nr 0 1
3237 fullmesh=1 sflags=nofullmesh speed=slow \
3239 chk_join_nr 2 2 2
3240 chk_rm_nr 0 1
3249 addr_nr_ns2=1 sflags=backup,fullmesh speed=slow \
3251 chk_join_nr 2 2 2
3252 chk_prio_nr 0 1 1 0
3253 chk_rm_nr 0 1
3264 chk_join_nr 2 2 2
3265 chk_prio_nr 0 1 1 0
3266 chk_rm_nr 0 1
3273 MPTCP_LIB_SUBTEST_FLAKY=1
3277 chk_fclose_nr 1 1
3278 chk_rst_nr 1 1 invert
3282 MPTCP_LIB_SUBTEST_FLAKY=1
3285 join_rst_nr=1 \
3287 chk_fclose_nr 1 1 invert
3288 chk_rst_nr 1 1
3294 tc -n $ns2 -j -s action show action pedit index 100 | \
3301 if reset_with_fail "Infinite map" 1; then
3302 MPTCP_LIB_SUBTEST_FLAKY=1
3305 join_csum_ns1=+1 join_csum_ns2=+0 \
3306 join_fail_nr=1 join_rst_nr=0 join_infi_nr=1 \
3309 chk_fail_nr 1 -1 invert
3313 if reset_with_fail "MP_FAIL MP_RST" 2; then
3314 MPTCP_LIB_SUBTEST_FLAKY=1
3315 tc -n $ns2 qdisc add dev ns2eth1 root netem rate 1mbit delay 5ms
3316 pm_nl_set_limits $ns1 0 1
3317 pm_nl_set_limits $ns2 0 1
3321 join_csum_ns1=1 join_csum_ns2=0 \
3322 join_fail_nr=1 join_rst_nr=1 join_infi_nr=0 \
3324 chk_join_nr 1 1 1
3328 # $1: ns ; $2: addr ; $3: id
3334 [ "$1" == "$ns2" ] && evts=$evts_ns2
3337 ip netns exec $1 ./pm_nl_ctl ann $2 token $tk id $3
3338 sleep 1
3341 # $1: ns ; $2: id
3348 [ "$1" == "$ns2" ] && evts=$evts_ns2
3351 cnt=$(rm_addr_count ${1})
3352 ip netns exec $1 ./pm_nl_ctl rem token $tk id $2
3353 wait_rm_addr $1 "${cnt}"
3356 # $1: ns ; $2: addr ; $3: id
3362 [ "$1" == "$ns2" ] && evts=$evts_ns2
3367 ip netns exec $1 ./pm_nl_ctl csf lip $2 lid $3 \
3369 sleep 1
3372 # $1: ns ; $2: addr $3: event type
3376 local t=${3:-1}
3381 [ "$1" == "$ns2" ] && evts=$evts_ns2
3382 [ -n "$(mptcp_lib_evts_get_info "saddr4" "$evts" $t)" ] && ip=4
3383 [ -n "$(mptcp_lib_evts_get_info "saddr6" "$evts" $t)" ] && ip=6
3385 da=$(mptcp_lib_evts_get_info "daddr$ip" "$evts" $t $2)
3386 dp=$(mptcp_lib_evts_get_info dport "$evts" $t $2)
3387 sp=$(mptcp_lib_evts_get_info sport "$evts" $t $2)
3389 cnt=$(rm_sf_count ${1})
3390 ip netns exec $1 ./pm_nl_ctl dsf lip $2 lport $sp \
3392 wait_rm_sf $1 "${cnt}"
3397 local cmd="$1"
3398 local expected="$2"
3403 if [ ${rc} -eq 2 ]; then
3405 elif [ ${rc} -eq 0 ]; then
3407 elif [ ${rc} -eq 1 ]; then
3412 # $1: ns
3418 [ "$1" == "$ns2" ] && evts=$evts_ns2
3421 ip netns exec $1 ./pm_nl_ctl dump token $tk
3424 # $1: ns ; $2: id
3430 [ "$1" == "$ns2" ] && evts=$evts_ns2
3433 ip netns exec $1 ./pm_nl_ctl get $2 token $tk
3438 local ns="${1}"
3439 local exp="${2}"
3453 local ns="${1}"
3454 local id="${2}"
3466 # $1: ns ; $2: event type ; $3: count
3469 local ns=${1}
3470 local evt_name="${2}"
3488 count=$(grep -cw "type:${evt}" "${evts}")
3502 pm_nl_set_limits $ns1 0 2
3503 pm_nl_set_limits $ns2 0 2
3514 pm_nl_set_limits $ns1 0 2
3515 pm_nl_set_limits $ns2 0 2
3519 chk_add_nr 1 0
3526 pm_nl_set_limits $ns1 1 1
3527 pm_nl_set_limits $ns2 1 1
3530 chk_join_nr 1 1 0
3537 pm_nl_set_limits $ns1 1 1
3538 pm_nl_set_limits $ns2 1 1
3548 pm_nl_set_limits $ns1 1 1
3549 pm_nl_set_limits $ns2 1 1
3553 chk_join_nr 1 1 0
3562 pm_nl_set_limits $ns1 0 1
3563 pm_nl_set_limits $ns2 0 1
3565 addr_nr_ns2=-1 speed=slow \
3575 pm_nl_set_limits $ns2 2 2
3577 run_tests $ns1 $ns2 10.0.1.1 & } 2>/dev/null
3582 chk_join_nr 2 2 2
3583 chk_add_nr 2 2
3584 chk_mptcp_info subflows 2 subflows 2
3586 chk_mptcp_info add_addr_signal 2 add_addr_accepted 2
3597 chk_rm_nr 1 1 invert
3599 chk_subflows_total 1 1
3608 pm_nl_set_limits $ns1 0 1
3610 run_tests $ns1 $ns2 10.0.1.1 & } 2>/dev/null
3614 chk_join_nr 1 1 1
3615 chk_mptcp_info subflows 1 subflows 1
3616 chk_subflows_total 2 2
3625 chk_rm_nr 0 1
3627 chk_subflows_total 1 1
3636 pm_nl_set_limits $ns1 0 1
3638 run_tests $ns1 $ns2 10.0.1.1 & } 2>/dev/null
3642 chk_subflows_total 1 1
3646 chk_join_nr 1 1 1
3647 chk_mptcp_info subflows 1 subflows 1
3648 chk_subflows_total 2 2
3657 pm_nl_set_limits $ns1 0 1
3659 run_tests $ns1 $ns2 10.0.1.1 & } 2>/dev/null
3663 chk_join_nr 1 1 1
3664 chk_mptcp_info subflows 1 subflows 1
3665 chk_subflows_total 2 2
3669 chk_rm_nr 0 1
3671 chk_mptcp_info subflows 1 subflows 1
3672 chk_subflows_total 1 1
3681 pm_nl_set_limits $ns2 1 1
3683 run_tests $ns1 $ns2 10.0.1.1 & } 2>/dev/null
3687 chk_join_nr 1 1 1
3688 chk_add_nr 1 1
3689 chk_mptcp_info subflows 1 subflows 1
3690 chk_subflows_total 2 2
3691 chk_mptcp_info add_addr_signal 1 add_addr_accepted 1
3695 chk_rm_nr 1 0 invert
3697 chk_mptcp_info subflows 1 subflows 1
3698 chk_subflows_total 1 1
3710 pm_nl_set_limits $ns1 2 2
3711 pm_nl_set_limits $ns2 2 2
3714 run_tests $ns1 $ns2 10.0.1.1 & } 2>/dev/null
3719 $ns2 10.0.2.2 id 1 flags implicit
3720 chk_mptcp_info subflows 1 subflows 1
3721 chk_mptcp_info add_addr_signal 1 add_addr_accepted 1
3723 pm_nl_add_endpoint $ns2 10.0.2.2 id 33 2>/dev/null
3725 $ns2 10.0.2.2 id 1 flags implicit
3729 $ns2 10.0.2.2 id 1 flags signal
3733 if reset_with_tcp_filter "delete and re-add" ns2 10.0.3.2 REJECT OUTPUT &&
3738 pm_nl_add_endpoint $ns2 10.0.1.2 id 1 dev ns2eth1 flags subflow
3739 pm_nl_add_endpoint $ns2 10.0.2.2 id 2 dev ns2eth2 flags subflow
3741 run_tests $ns1 $ns2 10.0.1.1 & } 2>/dev/null
3746 $ns2 10.0.2.2 id 2 flags subflow dev ns2eth2
3747 chk_subflow_nr "before delete id 2" 2
3748 chk_mptcp_info subflows 1 subflows 1
3750 pm_nl_del_endpoint $ns2 2 10.0.2.2
3752 chk_subflow_nr "after delete id 2" 1
3755 pm_nl_add_endpoint $ns2 10.0.2.2 id 2 dev ns2eth2 flags subflow
3757 chk_subflow_nr "after re-add id 2" 2
3758 chk_mptcp_info subflows 1 subflows 1
3762 chk_subflow_nr "after new reject" 2
3763 chk_mptcp_info subflows 1 subflows 1
3765 ip netns exec "${ns2}" ${iptables} -D OUTPUT -s "10.0.3.2" -p tcp -j REJECT
3770 chk_mptcp_info subflows 2 subflows 2
3774 pm_nl_del_endpoint $ns2 1 10.0.1.2
3776 chk_subflow_nr "after delete id 0 ($i)" 2
3777 chk_mptcp_info subflows 2 subflows 2 # only decr for additional sf
3779 pm_nl_add_endpoint $ns2 10.0.1.2 id 1 dev ns2eth1 flags subflow
3781 chk_subflow_nr "after re-add id 0 ($i)" 3
3788 chk_evt_nr ns1 MPTCP_LIB_EVENT_LISTENER_CREATED 1
3789 chk_evt_nr ns1 MPTCP_LIB_EVENT_CREATED 1
3790 chk_evt_nr ns1 MPTCP_LIB_EVENT_ESTABLISHED 1
3796 chk_evt_nr ns2 MPTCP_LIB_EVENT_CREATED 1
3797 chk_evt_nr ns2 MPTCP_LIB_EVENT_ESTABLISHED 1
3808 # remove and re-add
3809 if reset_with_events "delete re-add signal" &&
3813 pm_nl_add_endpoint $ns1 10.0.2.1 id 1 flags signal
3815 pm_nl_add_endpoint $ns1 224.0.0.1 id 2 flags signal
3818 run_tests $ns1 $ns2 10.0.1.1 & } 2>/dev/null
3823 $ns1 10.0.2.1 id 1 flags signal
3824 chk_subflow_nr "before delete" 2
3825 chk_mptcp_info subflows 1 subflows 1
3827 pm_nl_del_endpoint $ns1 1 10.0.2.1
3828 pm_nl_del_endpoint $ns1 2 224.0.0.1
3830 chk_subflow_nr "after delete" 1
3833 pm_nl_add_endpoint $ns1 10.0.2.1 id 1 flags signal
3834 pm_nl_add_endpoint $ns1 10.0.3.1 id 2 flags signal
3836 chk_subflow_nr "after re-add" 3
3837 chk_mptcp_info subflows 2 subflows 2
3841 chk_subflow_nr "after delete ID 0" 2
3842 chk_mptcp_info subflows 2 subflows 2
3846 chk_subflow_nr "after re-add ID 0" 3
3851 chk_subflow_nr "after re-delete ID 0" 2
3852 chk_mptcp_info subflows 2 subflows 2
3856 chk_subflow_nr "after re-re-add ID 0" 3
3861 chk_evt_nr ns1 MPTCP_LIB_EVENT_LISTENER_CREATED 1
3862 chk_evt_nr ns1 MPTCP_LIB_EVENT_CREATED 1
3863 chk_evt_nr ns1 MPTCP_LIB_EVENT_ESTABLISHED 1
3869 chk_evt_nr ns2 MPTCP_LIB_EVENT_CREATED 1
3870 chk_evt_nr ns2 MPTCP_LIB_EVENT_ESTABLISHED 1
3876 join_connect_err=1 \
3882 # flush and re-add
3883 if reset_with_tcp_filter "flush re-add" ns2 10.0.3.2 REJECT OUTPUT &&
3885 pm_nl_set_limits $ns1 0 2
3886 pm_nl_set_limits $ns2 1 2
3888 pm_nl_add_endpoint $ns1 224.0.0.1 id 2 flags signal
3891 run_tests $ns1 $ns2 10.0.1.1 & } 2>/dev/null
3895 chk_subflow_nr "before flush" 1
3901 ip netns exec "${ns2}" ${iptables} -D OUTPUT -s "10.0.3.2" -p tcp -j REJECT
3904 pm_nl_add_endpoint $ns1 10.0.3.1 id 2 flags signal
3908 join_syn_tx=3 join_connect_err=1 \
3909 chk_join_nr 2 2 2
3910 chk_add_nr 2 2
3911 chk_rm_nr 1 0 invert
3915 # [$1: error message]
3918 if [ -n "${1}" ]; then
3919 echo "${1}"
3927 echo " -${key} ${all_tests[${key}]}"
3930 echo " -c capture pcap files"
3931 echo " -C enable data checksum"
3932 echo " -i use ip mptcp"
3933 echo " -h help"
3995 usage "Unknown option: -${opt}"
4000 shift $((OPTIND - 1))
4003 if [[ "${arg}" =~ ^[0-9]+$ ]]; then
4010 if [ ${#tests[@]} -eq 0 ]; then
4020 if [ ${ret} -ne 0 ]; then
4024 echo -e "\t- ${i}: ${failed_tests[${i}]}"