162306a36Sopenharmony_ci#!/bin/bash 262306a36Sopenharmony_ci# SPDX-License-Identifier: GPL-2.0 362306a36Sopenharmony_ci 462306a36Sopenharmony_ci# Double quotes to prevent globbing and word splitting is recommended in new 562306a36Sopenharmony_ci# code but we accept it, especially because there were too many before having 662306a36Sopenharmony_ci# address all other issues detected by shellcheck. 762306a36Sopenharmony_ci#shellcheck disable=SC2086 862306a36Sopenharmony_ci 962306a36Sopenharmony_ci# ShellCheck incorrectly believes that most of the code here is unreachable 1062306a36Sopenharmony_ci# because it's invoked by variable name, see how the "tests" array is used 1162306a36Sopenharmony_ci#shellcheck disable=SC2317 1262306a36Sopenharmony_ci 1362306a36Sopenharmony_ci. "$(dirname "${0}")/mptcp_lib.sh" 1462306a36Sopenharmony_ci 1562306a36Sopenharmony_ciret=0 1662306a36Sopenharmony_cisin="" 1762306a36Sopenharmony_cisinfail="" 1862306a36Sopenharmony_cisout="" 1962306a36Sopenharmony_cicin="" 2062306a36Sopenharmony_cicinfail="" 2162306a36Sopenharmony_cicinsent="" 2262306a36Sopenharmony_citmpfile="" 2362306a36Sopenharmony_cicout="" 2462306a36Sopenharmony_cicapout="" 2562306a36Sopenharmony_cins1="" 2662306a36Sopenharmony_cins2="" 2762306a36Sopenharmony_ciksft_skip=4 2862306a36Sopenharmony_ciiptables="iptables" 2962306a36Sopenharmony_ciip6tables="ip6tables" 3062306a36Sopenharmony_citimeout_poll=30 3162306a36Sopenharmony_citimeout_test=$((timeout_poll * 2 + 1)) 3262306a36Sopenharmony_cicapture=0 3362306a36Sopenharmony_cichecksum=0 3462306a36Sopenharmony_ciip_mptcp=0 3562306a36Sopenharmony_cicheck_invert=0 3662306a36Sopenharmony_civalidate_checksum=0 3762306a36Sopenharmony_ciinit=0 3862306a36Sopenharmony_cievts_ns1="" 3962306a36Sopenharmony_cievts_ns2="" 4062306a36Sopenharmony_cievts_ns1_pid=0 4162306a36Sopenharmony_cievts_ns2_pid=0 4262306a36Sopenharmony_cilast_test_failed=0 4362306a36Sopenharmony_cilast_test_skipped=0 4462306a36Sopenharmony_cilast_test_ignored=1 4562306a36Sopenharmony_ci 4662306a36Sopenharmony_cideclare -A all_tests 4762306a36Sopenharmony_cideclare -a only_tests_ids 4862306a36Sopenharmony_cideclare -a only_tests_names 4962306a36Sopenharmony_cideclare -A failed_tests 5062306a36Sopenharmony_ciTEST_COUNT=0 5162306a36Sopenharmony_ciTEST_NAME="" 5262306a36Sopenharmony_cinr_blank=6 5362306a36Sopenharmony_ci 5462306a36Sopenharmony_ci# These var are used only in some tests, make sure they are not already set 5562306a36Sopenharmony_ciunset FAILING_LINKS 5662306a36Sopenharmony_ciunset test_linkfail 5762306a36Sopenharmony_ciunset addr_nr_ns1 5862306a36Sopenharmony_ciunset addr_nr_ns2 5962306a36Sopenharmony_ciunset sflags 6062306a36Sopenharmony_ciunset fastclose 6162306a36Sopenharmony_ciunset fullmesh 6262306a36Sopenharmony_ciunset speed 6362306a36Sopenharmony_ci 6462306a36Sopenharmony_ci# generated using "nfbpf_compile '(ip && (ip[54] & 0xf0) == 0x30) || 6562306a36Sopenharmony_ci# (ip6 && (ip6[74] & 0xf0) == 0x30)'" 6662306a36Sopenharmony_ciCBPF_MPTCP_SUBOPTION_ADD_ADDR="14, 6762306a36Sopenharmony_ci 48 0 0 0, 6862306a36Sopenharmony_ci 84 0 0 240, 6962306a36Sopenharmony_ci 21 0 3 64, 7062306a36Sopenharmony_ci 48 0 0 54, 7162306a36Sopenharmony_ci 84 0 0 240, 7262306a36Sopenharmony_ci 21 6 7 48, 7362306a36Sopenharmony_ci 48 0 0 0, 7462306a36Sopenharmony_ci 84 0 0 240, 7562306a36Sopenharmony_ci 21 0 4 96, 7662306a36Sopenharmony_ci 48 0 0 74, 7762306a36Sopenharmony_ci 84 0 0 240, 7862306a36Sopenharmony_ci 21 0 1 48, 7962306a36Sopenharmony_ci 6 0 0 65535, 8062306a36Sopenharmony_ci 6 0 0 0" 8162306a36Sopenharmony_ci 8262306a36Sopenharmony_ciinit_partial() 8362306a36Sopenharmony_ci{ 8462306a36Sopenharmony_ci capout=$(mktemp) 8562306a36Sopenharmony_ci 8662306a36Sopenharmony_ci local sec rndh 8762306a36Sopenharmony_ci sec=$(date +%s) 8862306a36Sopenharmony_ci rndh=$(printf %x $sec)-$(mktemp -u XXXXXX) 8962306a36Sopenharmony_ci 9062306a36Sopenharmony_ci ns1="ns1-$rndh" 9162306a36Sopenharmony_ci ns2="ns2-$rndh" 9262306a36Sopenharmony_ci 9362306a36Sopenharmony_ci local netns 9462306a36Sopenharmony_ci for netns in "$ns1" "$ns2"; do 9562306a36Sopenharmony_ci ip netns add $netns || exit $ksft_skip 9662306a36Sopenharmony_ci ip -net $netns link set lo up 9762306a36Sopenharmony_ci ip netns exec $netns sysctl -q net.mptcp.enabled=1 9862306a36Sopenharmony_ci ip netns exec $netns sysctl -q net.mptcp.pm_type=0 2>/dev/null || true 9962306a36Sopenharmony_ci ip netns exec $netns sysctl -q net.ipv4.conf.all.rp_filter=0 10062306a36Sopenharmony_ci ip netns exec $netns sysctl -q net.ipv4.conf.default.rp_filter=0 10162306a36Sopenharmony_ci if [ $checksum -eq 1 ]; then 10262306a36Sopenharmony_ci ip netns exec $netns sysctl -q net.mptcp.checksum_enabled=1 10362306a36Sopenharmony_ci fi 10462306a36Sopenharmony_ci done 10562306a36Sopenharmony_ci 10662306a36Sopenharmony_ci check_invert=0 10762306a36Sopenharmony_ci validate_checksum=$checksum 10862306a36Sopenharmony_ci 10962306a36Sopenharmony_ci # ns1 ns2 11062306a36Sopenharmony_ci # ns1eth1 ns2eth1 11162306a36Sopenharmony_ci # ns1eth2 ns2eth2 11262306a36Sopenharmony_ci # ns1eth3 ns2eth3 11362306a36Sopenharmony_ci # ns1eth4 ns2eth4 11462306a36Sopenharmony_ci 11562306a36Sopenharmony_ci local i 11662306a36Sopenharmony_ci for i in $(seq 1 4); do 11762306a36Sopenharmony_ci ip link add ns1eth$i netns "$ns1" type veth peer name ns2eth$i netns "$ns2" 11862306a36Sopenharmony_ci ip -net "$ns1" addr add 10.0.$i.1/24 dev ns1eth$i 11962306a36Sopenharmony_ci ip -net "$ns1" addr add dead:beef:$i::1/64 dev ns1eth$i nodad 12062306a36Sopenharmony_ci ip -net "$ns1" link set ns1eth$i up 12162306a36Sopenharmony_ci 12262306a36Sopenharmony_ci ip -net "$ns2" addr add 10.0.$i.2/24 dev ns2eth$i 12362306a36Sopenharmony_ci ip -net "$ns2" addr add dead:beef:$i::2/64 dev ns2eth$i nodad 12462306a36Sopenharmony_ci ip -net "$ns2" link set ns2eth$i up 12562306a36Sopenharmony_ci 12662306a36Sopenharmony_ci # let $ns2 reach any $ns1 address from any interface 12762306a36Sopenharmony_ci ip -net "$ns2" route add default via 10.0.$i.1 dev ns2eth$i metric 10$i 12862306a36Sopenharmony_ci ip -net "$ns2" route add default via dead:beef:$i::1 dev ns2eth$i metric 10$i 12962306a36Sopenharmony_ci done 13062306a36Sopenharmony_ci} 13162306a36Sopenharmony_ci 13262306a36Sopenharmony_ciinit_shapers() 13362306a36Sopenharmony_ci{ 13462306a36Sopenharmony_ci local i 13562306a36Sopenharmony_ci for i in $(seq 1 4); do 13662306a36Sopenharmony_ci tc -n $ns1 qdisc add dev ns1eth$i root netem rate 20mbit delay 1 13762306a36Sopenharmony_ci tc -n $ns2 qdisc add dev ns2eth$i root netem rate 20mbit delay 1 13862306a36Sopenharmony_ci done 13962306a36Sopenharmony_ci} 14062306a36Sopenharmony_ci 14162306a36Sopenharmony_cicleanup_partial() 14262306a36Sopenharmony_ci{ 14362306a36Sopenharmony_ci rm -f "$capout" 14462306a36Sopenharmony_ci 14562306a36Sopenharmony_ci local netns 14662306a36Sopenharmony_ci for netns in "$ns1" "$ns2"; do 14762306a36Sopenharmony_ci ip netns del $netns 14862306a36Sopenharmony_ci rm -f /tmp/$netns.{nstat,out} 14962306a36Sopenharmony_ci done 15062306a36Sopenharmony_ci} 15162306a36Sopenharmony_ci 15262306a36Sopenharmony_cicheck_tools() 15362306a36Sopenharmony_ci{ 15462306a36Sopenharmony_ci mptcp_lib_check_mptcp 15562306a36Sopenharmony_ci mptcp_lib_check_kallsyms 15662306a36Sopenharmony_ci 15762306a36Sopenharmony_ci if ! ip -Version &> /dev/null; then 15862306a36Sopenharmony_ci echo "SKIP: Could not run test without ip tool" 15962306a36Sopenharmony_ci exit $ksft_skip 16062306a36Sopenharmony_ci fi 16162306a36Sopenharmony_ci 16262306a36Sopenharmony_ci if ! ss -h | grep -q MPTCP; then 16362306a36Sopenharmony_ci echo "SKIP: ss tool does not support MPTCP" 16462306a36Sopenharmony_ci exit $ksft_skip 16562306a36Sopenharmony_ci fi 16662306a36Sopenharmony_ci 16762306a36Sopenharmony_ci # Use the legacy version if available to support old kernel versions 16862306a36Sopenharmony_ci if iptables-legacy -V &> /dev/null; then 16962306a36Sopenharmony_ci iptables="iptables-legacy" 17062306a36Sopenharmony_ci ip6tables="ip6tables-legacy" 17162306a36Sopenharmony_ci elif ! iptables -V &> /dev/null; then 17262306a36Sopenharmony_ci echo "SKIP: Could not run all tests without iptables tool" 17362306a36Sopenharmony_ci exit $ksft_skip 17462306a36Sopenharmony_ci elif ! ip6tables -V &> /dev/null; then 17562306a36Sopenharmony_ci echo "SKIP: Could not run all tests without ip6tables tool" 17662306a36Sopenharmony_ci exit $ksft_skip 17762306a36Sopenharmony_ci fi 17862306a36Sopenharmony_ci} 17962306a36Sopenharmony_ci 18062306a36Sopenharmony_ciinit() { 18162306a36Sopenharmony_ci init=1 18262306a36Sopenharmony_ci 18362306a36Sopenharmony_ci check_tools 18462306a36Sopenharmony_ci 18562306a36Sopenharmony_ci sin=$(mktemp) 18662306a36Sopenharmony_ci sout=$(mktemp) 18762306a36Sopenharmony_ci cin=$(mktemp) 18862306a36Sopenharmony_ci cinsent=$(mktemp) 18962306a36Sopenharmony_ci cout=$(mktemp) 19062306a36Sopenharmony_ci evts_ns1=$(mktemp) 19162306a36Sopenharmony_ci evts_ns2=$(mktemp) 19262306a36Sopenharmony_ci 19362306a36Sopenharmony_ci trap cleanup EXIT 19462306a36Sopenharmony_ci 19562306a36Sopenharmony_ci make_file "$cin" "client" 1 >/dev/null 19662306a36Sopenharmony_ci make_file "$sin" "server" 1 >/dev/null 19762306a36Sopenharmony_ci} 19862306a36Sopenharmony_ci 19962306a36Sopenharmony_cicleanup() 20062306a36Sopenharmony_ci{ 20162306a36Sopenharmony_ci rm -f "$cin" "$cout" "$sinfail" 20262306a36Sopenharmony_ci rm -f "$sin" "$sout" "$cinsent" "$cinfail" 20362306a36Sopenharmony_ci rm -f "$tmpfile" 20462306a36Sopenharmony_ci rm -rf $evts_ns1 $evts_ns2 20562306a36Sopenharmony_ci cleanup_partial 20662306a36Sopenharmony_ci} 20762306a36Sopenharmony_ci 20862306a36Sopenharmony_ciprint_title() 20962306a36Sopenharmony_ci{ 21062306a36Sopenharmony_ci printf "%03u %s\n" "${TEST_COUNT}" "${TEST_NAME}" 21162306a36Sopenharmony_ci} 21262306a36Sopenharmony_ci 21362306a36Sopenharmony_ciprint_check() 21462306a36Sopenharmony_ci{ 21562306a36Sopenharmony_ci printf "%-${nr_blank}s%-36s" " " "${*}" 21662306a36Sopenharmony_ci} 21762306a36Sopenharmony_ci 21862306a36Sopenharmony_ciprint_info() 21962306a36Sopenharmony_ci{ 22062306a36Sopenharmony_ci # It can be empty, no need to print anything then 22162306a36Sopenharmony_ci [ -z "${1}" ] && return 22262306a36Sopenharmony_ci 22362306a36Sopenharmony_ci mptcp_lib_print_info " Info: ${*}" 22462306a36Sopenharmony_ci} 22562306a36Sopenharmony_ci 22662306a36Sopenharmony_ciprint_ok() 22762306a36Sopenharmony_ci{ 22862306a36Sopenharmony_ci mptcp_lib_print_ok "[ ok ]${1:+ ${*}}" 22962306a36Sopenharmony_ci} 23062306a36Sopenharmony_ci 23162306a36Sopenharmony_ciprint_fail() 23262306a36Sopenharmony_ci{ 23362306a36Sopenharmony_ci mptcp_lib_print_err "[fail]${1:+ ${*}}" 23462306a36Sopenharmony_ci} 23562306a36Sopenharmony_ci 23662306a36Sopenharmony_ciprint_skip() 23762306a36Sopenharmony_ci{ 23862306a36Sopenharmony_ci mptcp_lib_print_warn "[skip]${1:+ ${*}}" 23962306a36Sopenharmony_ci} 24062306a36Sopenharmony_ci 24162306a36Sopenharmony_ci# [ $1: fail msg ] 24262306a36Sopenharmony_cimark_as_skipped() 24362306a36Sopenharmony_ci{ 24462306a36Sopenharmony_ci local msg="${1:-"Feature not supported"}" 24562306a36Sopenharmony_ci 24662306a36Sopenharmony_ci mptcp_lib_fail_if_expected_feature "${msg}" 24762306a36Sopenharmony_ci 24862306a36Sopenharmony_ci print_check "${msg}" 24962306a36Sopenharmony_ci print_skip 25062306a36Sopenharmony_ci 25162306a36Sopenharmony_ci last_test_skipped=1 25262306a36Sopenharmony_ci} 25362306a36Sopenharmony_ci 25462306a36Sopenharmony_ci# $@: condition 25562306a36Sopenharmony_cicontinue_if() 25662306a36Sopenharmony_ci{ 25762306a36Sopenharmony_ci if ! "${@}"; then 25862306a36Sopenharmony_ci mark_as_skipped 25962306a36Sopenharmony_ci return 1 26062306a36Sopenharmony_ci fi 26162306a36Sopenharmony_ci} 26262306a36Sopenharmony_ci 26362306a36Sopenharmony_ciskip_test() 26462306a36Sopenharmony_ci{ 26562306a36Sopenharmony_ci if [ "${#only_tests_ids[@]}" -eq 0 ] && [ "${#only_tests_names[@]}" -eq 0 ]; then 26662306a36Sopenharmony_ci return 1 26762306a36Sopenharmony_ci fi 26862306a36Sopenharmony_ci 26962306a36Sopenharmony_ci local i 27062306a36Sopenharmony_ci for i in "${only_tests_ids[@]}"; do 27162306a36Sopenharmony_ci if [ "${TEST_COUNT}" -eq "${i}" ]; then 27262306a36Sopenharmony_ci return 1 27362306a36Sopenharmony_ci fi 27462306a36Sopenharmony_ci done 27562306a36Sopenharmony_ci for i in "${only_tests_names[@]}"; do 27662306a36Sopenharmony_ci if [ "${TEST_NAME}" = "${i}" ]; then 27762306a36Sopenharmony_ci return 1 27862306a36Sopenharmony_ci fi 27962306a36Sopenharmony_ci done 28062306a36Sopenharmony_ci 28162306a36Sopenharmony_ci return 0 28262306a36Sopenharmony_ci} 28362306a36Sopenharmony_ci 28462306a36Sopenharmony_ciappend_prev_results() 28562306a36Sopenharmony_ci{ 28662306a36Sopenharmony_ci if [ ${last_test_failed} -eq 1 ]; then 28762306a36Sopenharmony_ci mptcp_lib_result_fail "${TEST_NAME}" 28862306a36Sopenharmony_ci elif [ ${last_test_skipped} -eq 1 ]; then 28962306a36Sopenharmony_ci mptcp_lib_result_skip "${TEST_NAME}" 29062306a36Sopenharmony_ci elif [ ${last_test_ignored} -ne 1 ]; then 29162306a36Sopenharmony_ci mptcp_lib_result_pass "${TEST_NAME}" 29262306a36Sopenharmony_ci fi 29362306a36Sopenharmony_ci 29462306a36Sopenharmony_ci last_test_failed=0 29562306a36Sopenharmony_ci last_test_skipped=0 29662306a36Sopenharmony_ci last_test_ignored=0 29762306a36Sopenharmony_ci} 29862306a36Sopenharmony_ci 29962306a36Sopenharmony_ci# $1: test name 30062306a36Sopenharmony_cireset() 30162306a36Sopenharmony_ci{ 30262306a36Sopenharmony_ci append_prev_results 30362306a36Sopenharmony_ci 30462306a36Sopenharmony_ci TEST_NAME="${1}" 30562306a36Sopenharmony_ci 30662306a36Sopenharmony_ci TEST_COUNT=$((TEST_COUNT+1)) 30762306a36Sopenharmony_ci 30862306a36Sopenharmony_ci if skip_test; then 30962306a36Sopenharmony_ci last_test_ignored=1 31062306a36Sopenharmony_ci return 1 31162306a36Sopenharmony_ci fi 31262306a36Sopenharmony_ci 31362306a36Sopenharmony_ci print_title 31462306a36Sopenharmony_ci 31562306a36Sopenharmony_ci if [ "${init}" != "1" ]; then 31662306a36Sopenharmony_ci init 31762306a36Sopenharmony_ci else 31862306a36Sopenharmony_ci cleanup_partial 31962306a36Sopenharmony_ci fi 32062306a36Sopenharmony_ci 32162306a36Sopenharmony_ci init_partial 32262306a36Sopenharmony_ci 32362306a36Sopenharmony_ci return 0 32462306a36Sopenharmony_ci} 32562306a36Sopenharmony_ci 32662306a36Sopenharmony_ci# $1: test name ; $2: counter to check 32762306a36Sopenharmony_cireset_check_counter() 32862306a36Sopenharmony_ci{ 32962306a36Sopenharmony_ci reset "${1}" || return 1 33062306a36Sopenharmony_ci 33162306a36Sopenharmony_ci local counter="${2}" 33262306a36Sopenharmony_ci 33362306a36Sopenharmony_ci if ! nstat -asz "${counter}" | grep -wq "${counter}"; then 33462306a36Sopenharmony_ci mark_as_skipped "counter '${counter}' is not available" 33562306a36Sopenharmony_ci return 1 33662306a36Sopenharmony_ci fi 33762306a36Sopenharmony_ci} 33862306a36Sopenharmony_ci 33962306a36Sopenharmony_ci# $1: test name 34062306a36Sopenharmony_cireset_with_cookies() 34162306a36Sopenharmony_ci{ 34262306a36Sopenharmony_ci reset "${1}" || return 1 34362306a36Sopenharmony_ci 34462306a36Sopenharmony_ci local netns 34562306a36Sopenharmony_ci for netns in "$ns1" "$ns2"; do 34662306a36Sopenharmony_ci ip netns exec $netns sysctl -q net.ipv4.tcp_syncookies=2 34762306a36Sopenharmony_ci done 34862306a36Sopenharmony_ci} 34962306a36Sopenharmony_ci 35062306a36Sopenharmony_ci# $1: test name 35162306a36Sopenharmony_cireset_with_add_addr_timeout() 35262306a36Sopenharmony_ci{ 35362306a36Sopenharmony_ci local ip="${2:-4}" 35462306a36Sopenharmony_ci local tables 35562306a36Sopenharmony_ci 35662306a36Sopenharmony_ci reset "${1}" || return 1 35762306a36Sopenharmony_ci 35862306a36Sopenharmony_ci tables="${iptables}" 35962306a36Sopenharmony_ci if [ $ip -eq 6 ]; then 36062306a36Sopenharmony_ci tables="${ip6tables}" 36162306a36Sopenharmony_ci fi 36262306a36Sopenharmony_ci 36362306a36Sopenharmony_ci ip netns exec $ns1 sysctl -q net.mptcp.add_addr_timeout=1 36462306a36Sopenharmony_ci 36562306a36Sopenharmony_ci if ! ip netns exec $ns2 $tables -A OUTPUT -p tcp \ 36662306a36Sopenharmony_ci -m tcp --tcp-option 30 \ 36762306a36Sopenharmony_ci -m bpf --bytecode \ 36862306a36Sopenharmony_ci "$CBPF_MPTCP_SUBOPTION_ADD_ADDR" \ 36962306a36Sopenharmony_ci -j DROP; then 37062306a36Sopenharmony_ci mark_as_skipped "unable to set the 'add addr' rule" 37162306a36Sopenharmony_ci return 1 37262306a36Sopenharmony_ci fi 37362306a36Sopenharmony_ci} 37462306a36Sopenharmony_ci 37562306a36Sopenharmony_ci# $1: test name 37662306a36Sopenharmony_cireset_with_checksum() 37762306a36Sopenharmony_ci{ 37862306a36Sopenharmony_ci local ns1_enable=$1 37962306a36Sopenharmony_ci local ns2_enable=$2 38062306a36Sopenharmony_ci 38162306a36Sopenharmony_ci reset "checksum test ${1} ${2}" || return 1 38262306a36Sopenharmony_ci 38362306a36Sopenharmony_ci ip netns exec $ns1 sysctl -q net.mptcp.checksum_enabled=$ns1_enable 38462306a36Sopenharmony_ci ip netns exec $ns2 sysctl -q net.mptcp.checksum_enabled=$ns2_enable 38562306a36Sopenharmony_ci 38662306a36Sopenharmony_ci validate_checksum=1 38762306a36Sopenharmony_ci} 38862306a36Sopenharmony_ci 38962306a36Sopenharmony_cireset_with_allow_join_id0() 39062306a36Sopenharmony_ci{ 39162306a36Sopenharmony_ci local ns1_enable=$2 39262306a36Sopenharmony_ci local ns2_enable=$3 39362306a36Sopenharmony_ci 39462306a36Sopenharmony_ci reset "${1}" || return 1 39562306a36Sopenharmony_ci 39662306a36Sopenharmony_ci ip netns exec $ns1 sysctl -q net.mptcp.allow_join_initial_addr_port=$ns1_enable 39762306a36Sopenharmony_ci ip netns exec $ns2 sysctl -q net.mptcp.allow_join_initial_addr_port=$ns2_enable 39862306a36Sopenharmony_ci} 39962306a36Sopenharmony_ci 40062306a36Sopenharmony_ci# Modify TCP payload without corrupting the TCP packet 40162306a36Sopenharmony_ci# 40262306a36Sopenharmony_ci# This rule inverts a 8-bit word at byte offset 148 for the 2nd TCP ACK packets 40362306a36Sopenharmony_ci# carrying enough data. 40462306a36Sopenharmony_ci# Once it is done, the TCP Checksum field is updated so the packet is still 40562306a36Sopenharmony_ci# considered as valid at the TCP level. 40662306a36Sopenharmony_ci# Because the MPTCP checksum, covering the TCP options and data, has not been 40762306a36Sopenharmony_ci# updated, the modification will be detected and an MP_FAIL will be emitted: 40862306a36Sopenharmony_ci# what we want to validate here without corrupting "random" MPTCP options. 40962306a36Sopenharmony_ci# 41062306a36Sopenharmony_ci# To avoid having tc producing this pr_info() message for each TCP ACK packets 41162306a36Sopenharmony_ci# not carrying enough data: 41262306a36Sopenharmony_ci# 41362306a36Sopenharmony_ci# tc action pedit offset 162 out of bounds 41462306a36Sopenharmony_ci# 41562306a36Sopenharmony_ci# Netfilter is used to mark packets with enough data. 41662306a36Sopenharmony_cisetup_fail_rules() 41762306a36Sopenharmony_ci{ 41862306a36Sopenharmony_ci check_invert=1 41962306a36Sopenharmony_ci validate_checksum=1 42062306a36Sopenharmony_ci local i="$1" 42162306a36Sopenharmony_ci local ip="${2:-4}" 42262306a36Sopenharmony_ci local tables 42362306a36Sopenharmony_ci 42462306a36Sopenharmony_ci tables="${iptables}" 42562306a36Sopenharmony_ci if [ $ip -eq 6 ]; then 42662306a36Sopenharmony_ci tables="${ip6tables}" 42762306a36Sopenharmony_ci fi 42862306a36Sopenharmony_ci 42962306a36Sopenharmony_ci ip netns exec $ns2 $tables \ 43062306a36Sopenharmony_ci -t mangle \ 43162306a36Sopenharmony_ci -A OUTPUT \ 43262306a36Sopenharmony_ci -o ns2eth$i \ 43362306a36Sopenharmony_ci -p tcp \ 43462306a36Sopenharmony_ci -m length --length 150:9999 \ 43562306a36Sopenharmony_ci -m statistic --mode nth --packet 1 --every 99999 \ 43662306a36Sopenharmony_ci -j MARK --set-mark 42 || return ${ksft_skip} 43762306a36Sopenharmony_ci 43862306a36Sopenharmony_ci tc -n $ns2 qdisc add dev ns2eth$i clsact || return ${ksft_skip} 43962306a36Sopenharmony_ci tc -n $ns2 filter add dev ns2eth$i egress \ 44062306a36Sopenharmony_ci protocol ip prio 1000 \ 44162306a36Sopenharmony_ci handle 42 fw \ 44262306a36Sopenharmony_ci action pedit munge offset 148 u8 invert \ 44362306a36Sopenharmony_ci pipe csum tcp \ 44462306a36Sopenharmony_ci index 100 || return ${ksft_skip} 44562306a36Sopenharmony_ci} 44662306a36Sopenharmony_ci 44762306a36Sopenharmony_cireset_with_fail() 44862306a36Sopenharmony_ci{ 44962306a36Sopenharmony_ci reset_check_counter "${1}" "MPTcpExtInfiniteMapTx" || return 1 45062306a36Sopenharmony_ci shift 45162306a36Sopenharmony_ci 45262306a36Sopenharmony_ci ip netns exec $ns1 sysctl -q net.mptcp.checksum_enabled=1 45362306a36Sopenharmony_ci ip netns exec $ns2 sysctl -q net.mptcp.checksum_enabled=1 45462306a36Sopenharmony_ci 45562306a36Sopenharmony_ci local rc=0 45662306a36Sopenharmony_ci setup_fail_rules "${@}" || rc=$? 45762306a36Sopenharmony_ci 45862306a36Sopenharmony_ci if [ ${rc} -eq ${ksft_skip} ]; then 45962306a36Sopenharmony_ci mark_as_skipped "unable to set the 'fail' rules" 46062306a36Sopenharmony_ci return 1 46162306a36Sopenharmony_ci fi 46262306a36Sopenharmony_ci} 46362306a36Sopenharmony_ci 46462306a36Sopenharmony_cireset_with_events() 46562306a36Sopenharmony_ci{ 46662306a36Sopenharmony_ci reset "${1}" || return 1 46762306a36Sopenharmony_ci 46862306a36Sopenharmony_ci :> "$evts_ns1" 46962306a36Sopenharmony_ci :> "$evts_ns2" 47062306a36Sopenharmony_ci ip netns exec $ns1 ./pm_nl_ctl events >> "$evts_ns1" 2>&1 & 47162306a36Sopenharmony_ci evts_ns1_pid=$! 47262306a36Sopenharmony_ci ip netns exec $ns2 ./pm_nl_ctl events >> "$evts_ns2" 2>&1 & 47362306a36Sopenharmony_ci evts_ns2_pid=$! 47462306a36Sopenharmony_ci} 47562306a36Sopenharmony_ci 47662306a36Sopenharmony_cireset_with_tcp_filter() 47762306a36Sopenharmony_ci{ 47862306a36Sopenharmony_ci reset "${1}" || return 1 47962306a36Sopenharmony_ci shift 48062306a36Sopenharmony_ci 48162306a36Sopenharmony_ci local ns="${!1}" 48262306a36Sopenharmony_ci local src="${2}" 48362306a36Sopenharmony_ci local target="${3}" 48462306a36Sopenharmony_ci 48562306a36Sopenharmony_ci if ! ip netns exec "${ns}" ${iptables} \ 48662306a36Sopenharmony_ci -A INPUT \ 48762306a36Sopenharmony_ci -s "${src}" \ 48862306a36Sopenharmony_ci -p tcp \ 48962306a36Sopenharmony_ci -j "${target}"; then 49062306a36Sopenharmony_ci mark_as_skipped "unable to set the filter rules" 49162306a36Sopenharmony_ci return 1 49262306a36Sopenharmony_ci fi 49362306a36Sopenharmony_ci} 49462306a36Sopenharmony_ci 49562306a36Sopenharmony_ci# $1: err msg 49662306a36Sopenharmony_cifail_test() 49762306a36Sopenharmony_ci{ 49862306a36Sopenharmony_ci ret=1 49962306a36Sopenharmony_ci 50062306a36Sopenharmony_ci print_fail "${@}" 50162306a36Sopenharmony_ci 50262306a36Sopenharmony_ci # just in case a test is marked twice as failed 50362306a36Sopenharmony_ci if [ ${last_test_failed} -eq 0 ]; then 50462306a36Sopenharmony_ci failed_tests[${TEST_COUNT}]="${TEST_NAME}" 50562306a36Sopenharmony_ci dump_stats 50662306a36Sopenharmony_ci last_test_failed=1 50762306a36Sopenharmony_ci fi 50862306a36Sopenharmony_ci} 50962306a36Sopenharmony_ci 51062306a36Sopenharmony_ciget_failed_tests_ids() 51162306a36Sopenharmony_ci{ 51262306a36Sopenharmony_ci # sorted 51362306a36Sopenharmony_ci local i 51462306a36Sopenharmony_ci for i in "${!failed_tests[@]}"; do 51562306a36Sopenharmony_ci echo "${i}" 51662306a36Sopenharmony_ci done | sort -n 51762306a36Sopenharmony_ci} 51862306a36Sopenharmony_ci 51962306a36Sopenharmony_ciprint_file_err() 52062306a36Sopenharmony_ci{ 52162306a36Sopenharmony_ci ls -l "$1" 1>&2 52262306a36Sopenharmony_ci echo -n "Trailing bytes are: " 52362306a36Sopenharmony_ci tail -c 27 "$1" 52462306a36Sopenharmony_ci} 52562306a36Sopenharmony_ci 52662306a36Sopenharmony_cicheck_transfer() 52762306a36Sopenharmony_ci{ 52862306a36Sopenharmony_ci local in=$1 52962306a36Sopenharmony_ci local out=$2 53062306a36Sopenharmony_ci local what=$3 53162306a36Sopenharmony_ci local bytes=$4 53262306a36Sopenharmony_ci local i a b 53362306a36Sopenharmony_ci 53462306a36Sopenharmony_ci local line 53562306a36Sopenharmony_ci if [ -n "$bytes" ]; then 53662306a36Sopenharmony_ci local out_size 53762306a36Sopenharmony_ci # when truncating we must check the size explicitly 53862306a36Sopenharmony_ci out_size=$(wc -c $out | awk '{print $1}') 53962306a36Sopenharmony_ci if [ $out_size -ne $bytes ]; then 54062306a36Sopenharmony_ci fail_test "$what output file has wrong size ($out_size, $bytes)" 54162306a36Sopenharmony_ci return 1 54262306a36Sopenharmony_ci fi 54362306a36Sopenharmony_ci 54462306a36Sopenharmony_ci # note: BusyBox's "cmp" command doesn't support --bytes 54562306a36Sopenharmony_ci tmpfile=$(mktemp) 54662306a36Sopenharmony_ci head --bytes="$bytes" "$in" > "$tmpfile" 54762306a36Sopenharmony_ci mv "$tmpfile" "$in" 54862306a36Sopenharmony_ci head --bytes="$bytes" "$out" > "$tmpfile" 54962306a36Sopenharmony_ci mv "$tmpfile" "$out" 55062306a36Sopenharmony_ci tmpfile="" 55162306a36Sopenharmony_ci fi 55262306a36Sopenharmony_ci cmp -l "$in" "$out" | while read -r i a b; do 55362306a36Sopenharmony_ci local sum=$((0${a} + 0${b})) 55462306a36Sopenharmony_ci if [ $check_invert -eq 0 ] || [ $sum -ne $((0xff)) ]; then 55562306a36Sopenharmony_ci fail_test "$what does not match (in, out):" 55662306a36Sopenharmony_ci print_file_err "$in" 55762306a36Sopenharmony_ci print_file_err "$out" 55862306a36Sopenharmony_ci 55962306a36Sopenharmony_ci return 1 56062306a36Sopenharmony_ci else 56162306a36Sopenharmony_ci print_info "$what has inverted byte at ${i}" 56262306a36Sopenharmony_ci fi 56362306a36Sopenharmony_ci done 56462306a36Sopenharmony_ci 56562306a36Sopenharmony_ci return 0 56662306a36Sopenharmony_ci} 56762306a36Sopenharmony_ci 56862306a36Sopenharmony_cido_ping() 56962306a36Sopenharmony_ci{ 57062306a36Sopenharmony_ci local listener_ns="$1" 57162306a36Sopenharmony_ci local connector_ns="$2" 57262306a36Sopenharmony_ci local connect_addr="$3" 57362306a36Sopenharmony_ci 57462306a36Sopenharmony_ci if ! ip netns exec ${connector_ns} ping -q -c 1 $connect_addr >/dev/null; then 57562306a36Sopenharmony_ci fail_test "$listener_ns -> $connect_addr connectivity" 57662306a36Sopenharmony_ci fi 57762306a36Sopenharmony_ci} 57862306a36Sopenharmony_ci 57962306a36Sopenharmony_cilink_failure() 58062306a36Sopenharmony_ci{ 58162306a36Sopenharmony_ci local ns="$1" 58262306a36Sopenharmony_ci 58362306a36Sopenharmony_ci if [ -z "$FAILING_LINKS" ]; then 58462306a36Sopenharmony_ci l=$((RANDOM%4)) 58562306a36Sopenharmony_ci FAILING_LINKS=$((l+1)) 58662306a36Sopenharmony_ci fi 58762306a36Sopenharmony_ci 58862306a36Sopenharmony_ci local l 58962306a36Sopenharmony_ci for l in $FAILING_LINKS; do 59062306a36Sopenharmony_ci local veth="ns1eth$l" 59162306a36Sopenharmony_ci ip -net "$ns" link set "$veth" down 59262306a36Sopenharmony_ci done 59362306a36Sopenharmony_ci} 59462306a36Sopenharmony_ci 59562306a36Sopenharmony_ci# $1: ns, $2: port 59662306a36Sopenharmony_ciwait_local_port_listen() 59762306a36Sopenharmony_ci{ 59862306a36Sopenharmony_ci local listener_ns="${1}" 59962306a36Sopenharmony_ci local port="${2}" 60062306a36Sopenharmony_ci 60162306a36Sopenharmony_ci local port_hex 60262306a36Sopenharmony_ci port_hex="$(printf "%04X" "${port}")" 60362306a36Sopenharmony_ci 60462306a36Sopenharmony_ci local i 60562306a36Sopenharmony_ci for i in $(seq 10); do 60662306a36Sopenharmony_ci ip netns exec "${listener_ns}" cat /proc/net/tcp* | \ 60762306a36Sopenharmony_ci awk "BEGIN {rc=1} {if (\$2 ~ /:${port_hex}\$/ && \$4 ~ /0A/) {rc=0; exit}} END {exit rc}" && 60862306a36Sopenharmony_ci break 60962306a36Sopenharmony_ci sleep 0.1 61062306a36Sopenharmony_ci done 61162306a36Sopenharmony_ci} 61262306a36Sopenharmony_ci 61362306a36Sopenharmony_cirm_addr_count() 61462306a36Sopenharmony_ci{ 61562306a36Sopenharmony_ci mptcp_lib_get_counter "${1}" "MPTcpExtRmAddr" 61662306a36Sopenharmony_ci} 61762306a36Sopenharmony_ci 61862306a36Sopenharmony_ci# $1: ns, $2: old rm_addr counter in $ns 61962306a36Sopenharmony_ciwait_rm_addr() 62062306a36Sopenharmony_ci{ 62162306a36Sopenharmony_ci local ns="${1}" 62262306a36Sopenharmony_ci local old_cnt="${2}" 62362306a36Sopenharmony_ci local cnt 62462306a36Sopenharmony_ci 62562306a36Sopenharmony_ci local i 62662306a36Sopenharmony_ci for i in $(seq 10); do 62762306a36Sopenharmony_ci cnt=$(rm_addr_count ${ns}) 62862306a36Sopenharmony_ci [ "$cnt" = "${old_cnt}" ] || break 62962306a36Sopenharmony_ci sleep 0.1 63062306a36Sopenharmony_ci done 63162306a36Sopenharmony_ci} 63262306a36Sopenharmony_ci 63362306a36Sopenharmony_cirm_sf_count() 63462306a36Sopenharmony_ci{ 63562306a36Sopenharmony_ci mptcp_lib_get_counter "${1}" "MPTcpExtRmSubflow" 63662306a36Sopenharmony_ci} 63762306a36Sopenharmony_ci 63862306a36Sopenharmony_ci# $1: ns, $2: old rm_sf counter in $ns 63962306a36Sopenharmony_ciwait_rm_sf() 64062306a36Sopenharmony_ci{ 64162306a36Sopenharmony_ci local ns="${1}" 64262306a36Sopenharmony_ci local old_cnt="${2}" 64362306a36Sopenharmony_ci local cnt 64462306a36Sopenharmony_ci 64562306a36Sopenharmony_ci local i 64662306a36Sopenharmony_ci for i in $(seq 10); do 64762306a36Sopenharmony_ci cnt=$(rm_sf_count ${ns}) 64862306a36Sopenharmony_ci [ "$cnt" = "${old_cnt}" ] || break 64962306a36Sopenharmony_ci sleep 0.1 65062306a36Sopenharmony_ci done 65162306a36Sopenharmony_ci} 65262306a36Sopenharmony_ci 65362306a36Sopenharmony_ciwait_mpj() 65462306a36Sopenharmony_ci{ 65562306a36Sopenharmony_ci local ns="${1}" 65662306a36Sopenharmony_ci local cnt old_cnt 65762306a36Sopenharmony_ci 65862306a36Sopenharmony_ci old_cnt=$(mptcp_lib_get_counter ${ns} "MPTcpExtMPJoinAckRx") 65962306a36Sopenharmony_ci 66062306a36Sopenharmony_ci local i 66162306a36Sopenharmony_ci for i in $(seq 10); do 66262306a36Sopenharmony_ci cnt=$(mptcp_lib_get_counter ${ns} "MPTcpExtMPJoinAckRx") 66362306a36Sopenharmony_ci [ "$cnt" = "${old_cnt}" ] || break 66462306a36Sopenharmony_ci sleep 0.1 66562306a36Sopenharmony_ci done 66662306a36Sopenharmony_ci} 66762306a36Sopenharmony_ci 66862306a36Sopenharmony_cikill_events_pids() 66962306a36Sopenharmony_ci{ 67062306a36Sopenharmony_ci mptcp_lib_kill_wait $evts_ns1_pid 67162306a36Sopenharmony_ci mptcp_lib_kill_wait $evts_ns2_pid 67262306a36Sopenharmony_ci} 67362306a36Sopenharmony_ci 67462306a36Sopenharmony_cipm_nl_set_limits() 67562306a36Sopenharmony_ci{ 67662306a36Sopenharmony_ci local ns=$1 67762306a36Sopenharmony_ci local addrs=$2 67862306a36Sopenharmony_ci local subflows=$3 67962306a36Sopenharmony_ci 68062306a36Sopenharmony_ci if [ $ip_mptcp -eq 1 ]; then 68162306a36Sopenharmony_ci ip -n $ns mptcp limits set add_addr_accepted $addrs subflows $subflows 68262306a36Sopenharmony_ci else 68362306a36Sopenharmony_ci ip netns exec $ns ./pm_nl_ctl limits $addrs $subflows 68462306a36Sopenharmony_ci fi 68562306a36Sopenharmony_ci} 68662306a36Sopenharmony_ci 68762306a36Sopenharmony_cipm_nl_add_endpoint() 68862306a36Sopenharmony_ci{ 68962306a36Sopenharmony_ci local ns=$1 69062306a36Sopenharmony_ci local addr=$2 69162306a36Sopenharmony_ci local flags _flags 69262306a36Sopenharmony_ci local port _port 69362306a36Sopenharmony_ci local dev _dev 69462306a36Sopenharmony_ci local id _id 69562306a36Sopenharmony_ci local nr=2 69662306a36Sopenharmony_ci 69762306a36Sopenharmony_ci local p 69862306a36Sopenharmony_ci for p in "${@}" 69962306a36Sopenharmony_ci do 70062306a36Sopenharmony_ci if [ $p = "flags" ]; then 70162306a36Sopenharmony_ci eval _flags=\$"$nr" 70262306a36Sopenharmony_ci [ -n "$_flags" ]; flags="flags $_flags" 70362306a36Sopenharmony_ci fi 70462306a36Sopenharmony_ci if [ $p = "dev" ]; then 70562306a36Sopenharmony_ci eval _dev=\$"$nr" 70662306a36Sopenharmony_ci [ -n "$_dev" ]; dev="dev $_dev" 70762306a36Sopenharmony_ci fi 70862306a36Sopenharmony_ci if [ $p = "id" ]; then 70962306a36Sopenharmony_ci eval _id=\$"$nr" 71062306a36Sopenharmony_ci [ -n "$_id" ]; id="id $_id" 71162306a36Sopenharmony_ci fi 71262306a36Sopenharmony_ci if [ $p = "port" ]; then 71362306a36Sopenharmony_ci eval _port=\$"$nr" 71462306a36Sopenharmony_ci [ -n "$_port" ]; port="port $_port" 71562306a36Sopenharmony_ci fi 71662306a36Sopenharmony_ci 71762306a36Sopenharmony_ci nr=$((nr + 1)) 71862306a36Sopenharmony_ci done 71962306a36Sopenharmony_ci 72062306a36Sopenharmony_ci if [ $ip_mptcp -eq 1 ]; then 72162306a36Sopenharmony_ci ip -n $ns mptcp endpoint add $addr ${_flags//","/" "} $dev $id $port 72262306a36Sopenharmony_ci else 72362306a36Sopenharmony_ci ip netns exec $ns ./pm_nl_ctl add $addr $flags $dev $id $port 72462306a36Sopenharmony_ci fi 72562306a36Sopenharmony_ci} 72662306a36Sopenharmony_ci 72762306a36Sopenharmony_cipm_nl_del_endpoint() 72862306a36Sopenharmony_ci{ 72962306a36Sopenharmony_ci local ns=$1 73062306a36Sopenharmony_ci local id=$2 73162306a36Sopenharmony_ci local addr=$3 73262306a36Sopenharmony_ci 73362306a36Sopenharmony_ci if [ $ip_mptcp -eq 1 ]; then 73462306a36Sopenharmony_ci [ $id -ne 0 ] && addr='' 73562306a36Sopenharmony_ci ip -n $ns mptcp endpoint delete id $id $addr 73662306a36Sopenharmony_ci else 73762306a36Sopenharmony_ci ip netns exec $ns ./pm_nl_ctl del $id $addr 73862306a36Sopenharmony_ci fi 73962306a36Sopenharmony_ci} 74062306a36Sopenharmony_ci 74162306a36Sopenharmony_cipm_nl_flush_endpoint() 74262306a36Sopenharmony_ci{ 74362306a36Sopenharmony_ci local ns=$1 74462306a36Sopenharmony_ci 74562306a36Sopenharmony_ci if [ $ip_mptcp -eq 1 ]; then 74662306a36Sopenharmony_ci ip -n $ns mptcp endpoint flush 74762306a36Sopenharmony_ci else 74862306a36Sopenharmony_ci ip netns exec $ns ./pm_nl_ctl flush 74962306a36Sopenharmony_ci fi 75062306a36Sopenharmony_ci} 75162306a36Sopenharmony_ci 75262306a36Sopenharmony_cipm_nl_show_endpoints() 75362306a36Sopenharmony_ci{ 75462306a36Sopenharmony_ci local ns=$1 75562306a36Sopenharmony_ci 75662306a36Sopenharmony_ci if [ $ip_mptcp -eq 1 ]; then 75762306a36Sopenharmony_ci ip -n $ns mptcp endpoint show 75862306a36Sopenharmony_ci else 75962306a36Sopenharmony_ci ip netns exec $ns ./pm_nl_ctl dump 76062306a36Sopenharmony_ci fi 76162306a36Sopenharmony_ci} 76262306a36Sopenharmony_ci 76362306a36Sopenharmony_cipm_nl_change_endpoint() 76462306a36Sopenharmony_ci{ 76562306a36Sopenharmony_ci local ns=$1 76662306a36Sopenharmony_ci local id=$2 76762306a36Sopenharmony_ci local flags=$3 76862306a36Sopenharmony_ci 76962306a36Sopenharmony_ci if [ $ip_mptcp -eq 1 ]; then 77062306a36Sopenharmony_ci ip -n $ns mptcp endpoint change id $id ${flags//","/" "} 77162306a36Sopenharmony_ci else 77262306a36Sopenharmony_ci ip netns exec $ns ./pm_nl_ctl set id $id flags $flags 77362306a36Sopenharmony_ci fi 77462306a36Sopenharmony_ci} 77562306a36Sopenharmony_ci 77662306a36Sopenharmony_cipm_nl_check_endpoint() 77762306a36Sopenharmony_ci{ 77862306a36Sopenharmony_ci local line expected_line 77962306a36Sopenharmony_ci local msg="$1" 78062306a36Sopenharmony_ci local ns=$2 78162306a36Sopenharmony_ci local addr=$3 78262306a36Sopenharmony_ci local _flags="" 78362306a36Sopenharmony_ci local flags 78462306a36Sopenharmony_ci local _port 78562306a36Sopenharmony_ci local port 78662306a36Sopenharmony_ci local dev 78762306a36Sopenharmony_ci local _id 78862306a36Sopenharmony_ci local id 78962306a36Sopenharmony_ci 79062306a36Sopenharmony_ci print_check "${msg}" 79162306a36Sopenharmony_ci 79262306a36Sopenharmony_ci shift 3 79362306a36Sopenharmony_ci while [ -n "$1" ]; do 79462306a36Sopenharmony_ci if [ $1 = "flags" ]; then 79562306a36Sopenharmony_ci _flags=$2 79662306a36Sopenharmony_ci [ -n "$_flags" ]; flags="flags $_flags" 79762306a36Sopenharmony_ci shift 79862306a36Sopenharmony_ci elif [ $1 = "dev" ]; then 79962306a36Sopenharmony_ci [ -n "$2" ]; dev="dev $1" 80062306a36Sopenharmony_ci shift 80162306a36Sopenharmony_ci elif [ $1 = "id" ]; then 80262306a36Sopenharmony_ci _id=$2 80362306a36Sopenharmony_ci [ -n "$_id" ]; id="id $_id" 80462306a36Sopenharmony_ci shift 80562306a36Sopenharmony_ci elif [ $1 = "port" ]; then 80662306a36Sopenharmony_ci _port=$2 80762306a36Sopenharmony_ci [ -n "$_port" ]; port=" port $_port" 80862306a36Sopenharmony_ci shift 80962306a36Sopenharmony_ci fi 81062306a36Sopenharmony_ci 81162306a36Sopenharmony_ci shift 81262306a36Sopenharmony_ci done 81362306a36Sopenharmony_ci 81462306a36Sopenharmony_ci if [ -z "$id" ]; then 81562306a36Sopenharmony_ci test_fail "bad test - missing endpoint id" 81662306a36Sopenharmony_ci return 81762306a36Sopenharmony_ci fi 81862306a36Sopenharmony_ci 81962306a36Sopenharmony_ci if [ $ip_mptcp -eq 1 ]; then 82062306a36Sopenharmony_ci # get line and trim trailing whitespace 82162306a36Sopenharmony_ci line=$(ip -n $ns mptcp endpoint show $id) 82262306a36Sopenharmony_ci line="${line% }" 82362306a36Sopenharmony_ci # the dump order is: address id flags port dev 82462306a36Sopenharmony_ci [ -n "$addr" ] && expected_line="$addr" 82562306a36Sopenharmony_ci expected_line="$expected_line $id" 82662306a36Sopenharmony_ci [ -n "$_flags" ] && expected_line="$expected_line ${_flags//","/" "}" 82762306a36Sopenharmony_ci [ -n "$dev" ] && expected_line="$expected_line $dev" 82862306a36Sopenharmony_ci [ -n "$port" ] && expected_line="$expected_line $port" 82962306a36Sopenharmony_ci else 83062306a36Sopenharmony_ci line=$(ip netns exec $ns ./pm_nl_ctl get $_id) 83162306a36Sopenharmony_ci # the dump order is: id flags dev address port 83262306a36Sopenharmony_ci expected_line="$id" 83362306a36Sopenharmony_ci [ -n "$flags" ] && expected_line="$expected_line $flags" 83462306a36Sopenharmony_ci [ -n "$dev" ] && expected_line="$expected_line $dev" 83562306a36Sopenharmony_ci [ -n "$addr" ] && expected_line="$expected_line $addr" 83662306a36Sopenharmony_ci [ -n "$_port" ] && expected_line="$expected_line $_port" 83762306a36Sopenharmony_ci fi 83862306a36Sopenharmony_ci if [ "$line" = "$expected_line" ]; then 83962306a36Sopenharmony_ci print_ok 84062306a36Sopenharmony_ci else 84162306a36Sopenharmony_ci fail_test "expected '$expected_line' found '$line'" 84262306a36Sopenharmony_ci fi 84362306a36Sopenharmony_ci} 84462306a36Sopenharmony_ci 84562306a36Sopenharmony_cipm_nl_set_endpoint() 84662306a36Sopenharmony_ci{ 84762306a36Sopenharmony_ci local listener_ns="$1" 84862306a36Sopenharmony_ci local connector_ns="$2" 84962306a36Sopenharmony_ci local connect_addr="$3" 85062306a36Sopenharmony_ci 85162306a36Sopenharmony_ci local addr_nr_ns1=${addr_nr_ns1:-0} 85262306a36Sopenharmony_ci local addr_nr_ns2=${addr_nr_ns2:-0} 85362306a36Sopenharmony_ci local sflags=${sflags:-""} 85462306a36Sopenharmony_ci local fullmesh=${fullmesh:-""} 85562306a36Sopenharmony_ci 85662306a36Sopenharmony_ci local flags="subflow" 85762306a36Sopenharmony_ci if [ -n "${fullmesh}" ]; then 85862306a36Sopenharmony_ci flags="${flags},fullmesh" 85962306a36Sopenharmony_ci addr_nr_ns2=${fullmesh} 86062306a36Sopenharmony_ci fi 86162306a36Sopenharmony_ci 86262306a36Sopenharmony_ci # let the mptcp subflow be established in background before 86362306a36Sopenharmony_ci # do endpoint manipulation 86462306a36Sopenharmony_ci if [ $addr_nr_ns1 != "0" ] || [ $addr_nr_ns2 != "0" ]; then 86562306a36Sopenharmony_ci sleep 1 86662306a36Sopenharmony_ci fi 86762306a36Sopenharmony_ci 86862306a36Sopenharmony_ci if [ $addr_nr_ns1 -gt 0 ]; then 86962306a36Sopenharmony_ci local counter=2 87062306a36Sopenharmony_ci local add_nr_ns1=${addr_nr_ns1} 87162306a36Sopenharmony_ci local id=10 87262306a36Sopenharmony_ci while [ $add_nr_ns1 -gt 0 ]; do 87362306a36Sopenharmony_ci local addr 87462306a36Sopenharmony_ci if mptcp_lib_is_v6 "${connect_addr}"; then 87562306a36Sopenharmony_ci addr="dead:beef:$counter::1" 87662306a36Sopenharmony_ci else 87762306a36Sopenharmony_ci addr="10.0.$counter.1" 87862306a36Sopenharmony_ci fi 87962306a36Sopenharmony_ci pm_nl_add_endpoint $ns1 $addr flags signal 88062306a36Sopenharmony_ci counter=$((counter + 1)) 88162306a36Sopenharmony_ci add_nr_ns1=$((add_nr_ns1 - 1)) 88262306a36Sopenharmony_ci id=$((id + 1)) 88362306a36Sopenharmony_ci done 88462306a36Sopenharmony_ci elif [ $addr_nr_ns1 -lt 0 ]; then 88562306a36Sopenharmony_ci local rm_nr_ns1=$((-addr_nr_ns1)) 88662306a36Sopenharmony_ci if [ $rm_nr_ns1 -lt 8 ]; then 88762306a36Sopenharmony_ci local counter=0 88862306a36Sopenharmony_ci local line 88962306a36Sopenharmony_ci pm_nl_show_endpoints ${listener_ns} | while read -r line; do 89062306a36Sopenharmony_ci # shellcheck disable=SC2206 # we do want to split per word 89162306a36Sopenharmony_ci local arr=($line) 89262306a36Sopenharmony_ci local nr=0 89362306a36Sopenharmony_ci 89462306a36Sopenharmony_ci local i 89562306a36Sopenharmony_ci for i in "${arr[@]}"; do 89662306a36Sopenharmony_ci if [ $i = "id" ]; then 89762306a36Sopenharmony_ci if [ $counter -eq $rm_nr_ns1 ]; then 89862306a36Sopenharmony_ci break 89962306a36Sopenharmony_ci fi 90062306a36Sopenharmony_ci id=${arr[$nr+1]} 90162306a36Sopenharmony_ci rm_addr=$(rm_addr_count ${connector_ns}) 90262306a36Sopenharmony_ci pm_nl_del_endpoint ${listener_ns} $id 90362306a36Sopenharmony_ci wait_rm_addr ${connector_ns} ${rm_addr} 90462306a36Sopenharmony_ci counter=$((counter + 1)) 90562306a36Sopenharmony_ci fi 90662306a36Sopenharmony_ci nr=$((nr + 1)) 90762306a36Sopenharmony_ci done 90862306a36Sopenharmony_ci done 90962306a36Sopenharmony_ci elif [ $rm_nr_ns1 -eq 8 ]; then 91062306a36Sopenharmony_ci pm_nl_flush_endpoint ${listener_ns} 91162306a36Sopenharmony_ci elif [ $rm_nr_ns1 -eq 9 ]; then 91262306a36Sopenharmony_ci pm_nl_del_endpoint ${listener_ns} 0 ${connect_addr} 91362306a36Sopenharmony_ci fi 91462306a36Sopenharmony_ci fi 91562306a36Sopenharmony_ci 91662306a36Sopenharmony_ci # if newly added endpoints must be deleted, give the background msk 91762306a36Sopenharmony_ci # some time to created them 91862306a36Sopenharmony_ci [ $addr_nr_ns1 -gt 0 ] && [ $addr_nr_ns2 -lt 0 ] && sleep 1 91962306a36Sopenharmony_ci 92062306a36Sopenharmony_ci if [ $addr_nr_ns2 -gt 0 ]; then 92162306a36Sopenharmony_ci local add_nr_ns2=${addr_nr_ns2} 92262306a36Sopenharmony_ci local counter=3 92362306a36Sopenharmony_ci local id=20 92462306a36Sopenharmony_ci while [ $add_nr_ns2 -gt 0 ]; do 92562306a36Sopenharmony_ci local addr 92662306a36Sopenharmony_ci if mptcp_lib_is_v6 "${connect_addr}"; then 92762306a36Sopenharmony_ci addr="dead:beef:$counter::2" 92862306a36Sopenharmony_ci else 92962306a36Sopenharmony_ci addr="10.0.$counter.2" 93062306a36Sopenharmony_ci fi 93162306a36Sopenharmony_ci pm_nl_add_endpoint $ns2 $addr flags $flags 93262306a36Sopenharmony_ci counter=$((counter + 1)) 93362306a36Sopenharmony_ci add_nr_ns2=$((add_nr_ns2 - 1)) 93462306a36Sopenharmony_ci id=$((id + 1)) 93562306a36Sopenharmony_ci done 93662306a36Sopenharmony_ci elif [ $addr_nr_ns2 -lt 0 ]; then 93762306a36Sopenharmony_ci local rm_nr_ns2=$((-addr_nr_ns2)) 93862306a36Sopenharmony_ci if [ $rm_nr_ns2 -lt 8 ]; then 93962306a36Sopenharmony_ci local counter=0 94062306a36Sopenharmony_ci local line 94162306a36Sopenharmony_ci pm_nl_show_endpoints ${connector_ns} | while read -r line; do 94262306a36Sopenharmony_ci # shellcheck disable=SC2206 # we do want to split per word 94362306a36Sopenharmony_ci local arr=($line) 94462306a36Sopenharmony_ci local nr=0 94562306a36Sopenharmony_ci 94662306a36Sopenharmony_ci local i 94762306a36Sopenharmony_ci for i in "${arr[@]}"; do 94862306a36Sopenharmony_ci if [ $i = "id" ]; then 94962306a36Sopenharmony_ci if [ $counter -eq $rm_nr_ns2 ]; then 95062306a36Sopenharmony_ci break 95162306a36Sopenharmony_ci fi 95262306a36Sopenharmony_ci local id rm_addr 95362306a36Sopenharmony_ci # rm_addr are serialized, allow the previous one to 95462306a36Sopenharmony_ci # complete 95562306a36Sopenharmony_ci id=${arr[$nr+1]} 95662306a36Sopenharmony_ci rm_addr=$(rm_addr_count ${listener_ns}) 95762306a36Sopenharmony_ci pm_nl_del_endpoint ${connector_ns} $id 95862306a36Sopenharmony_ci wait_rm_addr ${listener_ns} ${rm_addr} 95962306a36Sopenharmony_ci counter=$((counter + 1)) 96062306a36Sopenharmony_ci fi 96162306a36Sopenharmony_ci nr=$((nr + 1)) 96262306a36Sopenharmony_ci done 96362306a36Sopenharmony_ci done 96462306a36Sopenharmony_ci elif [ $rm_nr_ns2 -eq 8 ]; then 96562306a36Sopenharmony_ci pm_nl_flush_endpoint ${connector_ns} 96662306a36Sopenharmony_ci elif [ $rm_nr_ns2 -eq 9 ]; then 96762306a36Sopenharmony_ci local addr 96862306a36Sopenharmony_ci if mptcp_lib_is_v6 "${connect_addr}"; then 96962306a36Sopenharmony_ci addr="dead:beef:1::2" 97062306a36Sopenharmony_ci else 97162306a36Sopenharmony_ci addr="10.0.1.2" 97262306a36Sopenharmony_ci fi 97362306a36Sopenharmony_ci pm_nl_del_endpoint ${connector_ns} 0 $addr 97462306a36Sopenharmony_ci fi 97562306a36Sopenharmony_ci fi 97662306a36Sopenharmony_ci 97762306a36Sopenharmony_ci if [ -n "${sflags}" ]; then 97862306a36Sopenharmony_ci sleep 1 97962306a36Sopenharmony_ci 98062306a36Sopenharmony_ci local netns 98162306a36Sopenharmony_ci for netns in "$ns1" "$ns2"; do 98262306a36Sopenharmony_ci local line 98362306a36Sopenharmony_ci pm_nl_show_endpoints $netns | while read -r line; do 98462306a36Sopenharmony_ci # shellcheck disable=SC2206 # we do want to split per word 98562306a36Sopenharmony_ci local arr=($line) 98662306a36Sopenharmony_ci local nr=0 98762306a36Sopenharmony_ci local id 98862306a36Sopenharmony_ci 98962306a36Sopenharmony_ci local i 99062306a36Sopenharmony_ci for i in "${arr[@]}"; do 99162306a36Sopenharmony_ci if [ $i = "id" ]; then 99262306a36Sopenharmony_ci id=${arr[$nr+1]} 99362306a36Sopenharmony_ci fi 99462306a36Sopenharmony_ci nr=$((nr + 1)) 99562306a36Sopenharmony_ci done 99662306a36Sopenharmony_ci pm_nl_change_endpoint $netns $id $sflags 99762306a36Sopenharmony_ci done 99862306a36Sopenharmony_ci done 99962306a36Sopenharmony_ci fi 100062306a36Sopenharmony_ci} 100162306a36Sopenharmony_ci 100262306a36Sopenharmony_cido_transfer() 100362306a36Sopenharmony_ci{ 100462306a36Sopenharmony_ci local listener_ns="$1" 100562306a36Sopenharmony_ci local connector_ns="$2" 100662306a36Sopenharmony_ci local cl_proto="$3" 100762306a36Sopenharmony_ci local srv_proto="$4" 100862306a36Sopenharmony_ci local connect_addr="$5" 100962306a36Sopenharmony_ci 101062306a36Sopenharmony_ci local port=$((10000 + TEST_COUNT - 1)) 101162306a36Sopenharmony_ci local cappid 101262306a36Sopenharmony_ci local FAILING_LINKS=${FAILING_LINKS:-""} 101362306a36Sopenharmony_ci local fastclose=${fastclose:-""} 101462306a36Sopenharmony_ci local speed=${speed:-"fast"} 101562306a36Sopenharmony_ci 101662306a36Sopenharmony_ci :> "$cout" 101762306a36Sopenharmony_ci :> "$sout" 101862306a36Sopenharmony_ci :> "$capout" 101962306a36Sopenharmony_ci 102062306a36Sopenharmony_ci if [ $capture -eq 1 ]; then 102162306a36Sopenharmony_ci local capuser 102262306a36Sopenharmony_ci if [ -z $SUDO_USER ] ; then 102362306a36Sopenharmony_ci capuser="" 102462306a36Sopenharmony_ci else 102562306a36Sopenharmony_ci capuser="-Z $SUDO_USER" 102662306a36Sopenharmony_ci fi 102762306a36Sopenharmony_ci 102862306a36Sopenharmony_ci capfile=$(printf "mp_join-%02u-%s.pcap" "$TEST_COUNT" "${listener_ns}") 102962306a36Sopenharmony_ci 103062306a36Sopenharmony_ci echo "Capturing traffic for test $TEST_COUNT into $capfile" 103162306a36Sopenharmony_ci ip netns exec ${listener_ns} tcpdump -i any -s 65535 -B 32768 $capuser -w $capfile > "$capout" 2>&1 & 103262306a36Sopenharmony_ci cappid=$! 103362306a36Sopenharmony_ci 103462306a36Sopenharmony_ci sleep 1 103562306a36Sopenharmony_ci fi 103662306a36Sopenharmony_ci 103762306a36Sopenharmony_ci NSTAT_HISTORY=/tmp/${listener_ns}.nstat ip netns exec ${listener_ns} \ 103862306a36Sopenharmony_ci nstat -n 103962306a36Sopenharmony_ci NSTAT_HISTORY=/tmp/${connector_ns}.nstat ip netns exec ${connector_ns} \ 104062306a36Sopenharmony_ci nstat -n 104162306a36Sopenharmony_ci 104262306a36Sopenharmony_ci local extra_args 104362306a36Sopenharmony_ci if [ $speed = "fast" ]; then 104462306a36Sopenharmony_ci extra_args="-j" 104562306a36Sopenharmony_ci elif [ $speed = "slow" ]; then 104662306a36Sopenharmony_ci extra_args="-r 50" 104762306a36Sopenharmony_ci elif [ $speed -gt 0 ]; then 104862306a36Sopenharmony_ci extra_args="-r ${speed}" 104962306a36Sopenharmony_ci fi 105062306a36Sopenharmony_ci 105162306a36Sopenharmony_ci local extra_cl_args="" 105262306a36Sopenharmony_ci local extra_srv_args="" 105362306a36Sopenharmony_ci local trunc_size="" 105462306a36Sopenharmony_ci if [ -n "${fastclose}" ]; then 105562306a36Sopenharmony_ci if [ ${test_linkfail} -le 1 ]; then 105662306a36Sopenharmony_ci fail_test "fastclose tests need test_linkfail argument" 105762306a36Sopenharmony_ci return 1 105862306a36Sopenharmony_ci fi 105962306a36Sopenharmony_ci 106062306a36Sopenharmony_ci # disconnect 106162306a36Sopenharmony_ci trunc_size=${test_linkfail} 106262306a36Sopenharmony_ci local side=${fastclose} 106362306a36Sopenharmony_ci 106462306a36Sopenharmony_ci if [ ${side} = "client" ]; then 106562306a36Sopenharmony_ci extra_cl_args="-f ${test_linkfail}" 106662306a36Sopenharmony_ci extra_srv_args="-f -1" 106762306a36Sopenharmony_ci elif [ ${side} = "server" ]; then 106862306a36Sopenharmony_ci extra_srv_args="-f ${test_linkfail}" 106962306a36Sopenharmony_ci extra_cl_args="-f -1" 107062306a36Sopenharmony_ci else 107162306a36Sopenharmony_ci fail_test "wrong/unknown fastclose spec ${side}" 107262306a36Sopenharmony_ci return 1 107362306a36Sopenharmony_ci fi 107462306a36Sopenharmony_ci fi 107562306a36Sopenharmony_ci 107662306a36Sopenharmony_ci extra_srv_args="$extra_args $extra_srv_args" 107762306a36Sopenharmony_ci if [ "$test_linkfail" -gt 1 ];then 107862306a36Sopenharmony_ci timeout ${timeout_test} \ 107962306a36Sopenharmony_ci ip netns exec ${listener_ns} \ 108062306a36Sopenharmony_ci ./mptcp_connect -t ${timeout_poll} -l -p $port -s ${srv_proto} \ 108162306a36Sopenharmony_ci $extra_srv_args "::" < "$sinfail" > "$sout" & 108262306a36Sopenharmony_ci else 108362306a36Sopenharmony_ci timeout ${timeout_test} \ 108462306a36Sopenharmony_ci ip netns exec ${listener_ns} \ 108562306a36Sopenharmony_ci ./mptcp_connect -t ${timeout_poll} -l -p $port -s ${srv_proto} \ 108662306a36Sopenharmony_ci $extra_srv_args "::" < "$sin" > "$sout" & 108762306a36Sopenharmony_ci fi 108862306a36Sopenharmony_ci local spid=$! 108962306a36Sopenharmony_ci 109062306a36Sopenharmony_ci wait_local_port_listen "${listener_ns}" "${port}" 109162306a36Sopenharmony_ci 109262306a36Sopenharmony_ci extra_cl_args="$extra_args $extra_cl_args" 109362306a36Sopenharmony_ci if [ "$test_linkfail" -eq 0 ];then 109462306a36Sopenharmony_ci timeout ${timeout_test} \ 109562306a36Sopenharmony_ci ip netns exec ${connector_ns} \ 109662306a36Sopenharmony_ci ./mptcp_connect -t ${timeout_poll} -p $port -s ${cl_proto} \ 109762306a36Sopenharmony_ci $extra_cl_args $connect_addr < "$cin" > "$cout" & 109862306a36Sopenharmony_ci elif [ "$test_linkfail" -eq 1 ] || [ "$test_linkfail" -eq 2 ];then 109962306a36Sopenharmony_ci ( cat "$cinfail" ; sleep 2; link_failure $listener_ns ; cat "$cinfail" ) | \ 110062306a36Sopenharmony_ci tee "$cinsent" | \ 110162306a36Sopenharmony_ci timeout ${timeout_test} \ 110262306a36Sopenharmony_ci ip netns exec ${connector_ns} \ 110362306a36Sopenharmony_ci ./mptcp_connect -t ${timeout_poll} -p $port -s ${cl_proto} \ 110462306a36Sopenharmony_ci $extra_cl_args $connect_addr > "$cout" & 110562306a36Sopenharmony_ci else 110662306a36Sopenharmony_ci tee "$cinsent" < "$cinfail" | \ 110762306a36Sopenharmony_ci timeout ${timeout_test} \ 110862306a36Sopenharmony_ci ip netns exec ${connector_ns} \ 110962306a36Sopenharmony_ci ./mptcp_connect -t ${timeout_poll} -p $port -s ${cl_proto} \ 111062306a36Sopenharmony_ci $extra_cl_args $connect_addr > "$cout" & 111162306a36Sopenharmony_ci fi 111262306a36Sopenharmony_ci local cpid=$! 111362306a36Sopenharmony_ci 111462306a36Sopenharmony_ci pm_nl_set_endpoint $listener_ns $connector_ns $connect_addr 111562306a36Sopenharmony_ci 111662306a36Sopenharmony_ci wait $cpid 111762306a36Sopenharmony_ci local retc=$? 111862306a36Sopenharmony_ci wait $spid 111962306a36Sopenharmony_ci local rets=$? 112062306a36Sopenharmony_ci 112162306a36Sopenharmony_ci if [ $capture -eq 1 ]; then 112262306a36Sopenharmony_ci sleep 1 112362306a36Sopenharmony_ci kill $cappid 112462306a36Sopenharmony_ci fi 112562306a36Sopenharmony_ci 112662306a36Sopenharmony_ci NSTAT_HISTORY=/tmp/${listener_ns}.nstat ip netns exec ${listener_ns} \ 112762306a36Sopenharmony_ci nstat | grep Tcp > /tmp/${listener_ns}.out 112862306a36Sopenharmony_ci NSTAT_HISTORY=/tmp/${connector_ns}.nstat ip netns exec ${connector_ns} \ 112962306a36Sopenharmony_ci nstat | grep Tcp > /tmp/${connector_ns}.out 113062306a36Sopenharmony_ci 113162306a36Sopenharmony_ci if [ ${rets} -ne 0 ] || [ ${retc} -ne 0 ]; then 113262306a36Sopenharmony_ci fail_test "client exit code $retc, server $rets" 113362306a36Sopenharmony_ci echo -e "\nnetns ${listener_ns} socket stat for ${port}:" 1>&2 113462306a36Sopenharmony_ci ip netns exec ${listener_ns} ss -Menita 1>&2 -o "sport = :$port" 113562306a36Sopenharmony_ci cat /tmp/${listener_ns}.out 113662306a36Sopenharmony_ci echo -e "\nnetns ${connector_ns} socket stat for ${port}:" 1>&2 113762306a36Sopenharmony_ci ip netns exec ${connector_ns} ss -Menita 1>&2 -o "dport = :$port" 113862306a36Sopenharmony_ci cat /tmp/${connector_ns}.out 113962306a36Sopenharmony_ci 114062306a36Sopenharmony_ci cat "$capout" 114162306a36Sopenharmony_ci return 1 114262306a36Sopenharmony_ci fi 114362306a36Sopenharmony_ci 114462306a36Sopenharmony_ci if [ "$test_linkfail" -gt 1 ];then 114562306a36Sopenharmony_ci check_transfer $sinfail $cout "file received by client" $trunc_size 114662306a36Sopenharmony_ci else 114762306a36Sopenharmony_ci check_transfer $sin $cout "file received by client" $trunc_size 114862306a36Sopenharmony_ci fi 114962306a36Sopenharmony_ci retc=$? 115062306a36Sopenharmony_ci if [ "$test_linkfail" -eq 0 ];then 115162306a36Sopenharmony_ci check_transfer $cin $sout "file received by server" $trunc_size 115262306a36Sopenharmony_ci else 115362306a36Sopenharmony_ci check_transfer $cinsent $sout "file received by server" $trunc_size 115462306a36Sopenharmony_ci fi 115562306a36Sopenharmony_ci rets=$? 115662306a36Sopenharmony_ci 115762306a36Sopenharmony_ci if [ $retc -eq 0 ] && [ $rets -eq 0 ];then 115862306a36Sopenharmony_ci cat "$capout" 115962306a36Sopenharmony_ci return 0 116062306a36Sopenharmony_ci fi 116162306a36Sopenharmony_ci 116262306a36Sopenharmony_ci cat "$capout" 116362306a36Sopenharmony_ci return 1 116462306a36Sopenharmony_ci} 116562306a36Sopenharmony_ci 116662306a36Sopenharmony_cimake_file() 116762306a36Sopenharmony_ci{ 116862306a36Sopenharmony_ci local name=$1 116962306a36Sopenharmony_ci local who=$2 117062306a36Sopenharmony_ci local size=$3 117162306a36Sopenharmony_ci 117262306a36Sopenharmony_ci dd if=/dev/urandom of="$name" bs=1024 count=$size 2> /dev/null 117362306a36Sopenharmony_ci echo -e "\nMPTCP_TEST_FILE_END_MARKER" >> "$name" 117462306a36Sopenharmony_ci 117562306a36Sopenharmony_ci print_info "Test file (size $size KB) for $who" 117662306a36Sopenharmony_ci} 117762306a36Sopenharmony_ci 117862306a36Sopenharmony_cirun_tests() 117962306a36Sopenharmony_ci{ 118062306a36Sopenharmony_ci local listener_ns="$1" 118162306a36Sopenharmony_ci local connector_ns="$2" 118262306a36Sopenharmony_ci local connect_addr="$3" 118362306a36Sopenharmony_ci 118462306a36Sopenharmony_ci local size 118562306a36Sopenharmony_ci local test_linkfail=${test_linkfail:-0} 118662306a36Sopenharmony_ci 118762306a36Sopenharmony_ci # The values above 2 are reused to make test files 118862306a36Sopenharmony_ci # with the given sizes (KB) 118962306a36Sopenharmony_ci if [ "$test_linkfail" -gt 2 ]; then 119062306a36Sopenharmony_ci size=$test_linkfail 119162306a36Sopenharmony_ci 119262306a36Sopenharmony_ci if [ -z "$cinfail" ]; then 119362306a36Sopenharmony_ci cinfail=$(mktemp) 119462306a36Sopenharmony_ci fi 119562306a36Sopenharmony_ci make_file "$cinfail" "client" $size 119662306a36Sopenharmony_ci # create the input file for the failure test when 119762306a36Sopenharmony_ci # the first failure test run 119862306a36Sopenharmony_ci elif [ "$test_linkfail" -ne 0 ] && [ -z "$cinfail" ]; then 119962306a36Sopenharmony_ci # the client file must be considerably larger 120062306a36Sopenharmony_ci # of the maximum expected cwin value, or the 120162306a36Sopenharmony_ci # link utilization will be not predicable 120262306a36Sopenharmony_ci size=$((RANDOM%2)) 120362306a36Sopenharmony_ci size=$((size+1)) 120462306a36Sopenharmony_ci size=$((size*8192)) 120562306a36Sopenharmony_ci size=$((size + ( RANDOM % 8192) )) 120662306a36Sopenharmony_ci 120762306a36Sopenharmony_ci cinfail=$(mktemp) 120862306a36Sopenharmony_ci make_file "$cinfail" "client" $size 120962306a36Sopenharmony_ci fi 121062306a36Sopenharmony_ci 121162306a36Sopenharmony_ci if [ "$test_linkfail" -gt 2 ]; then 121262306a36Sopenharmony_ci size=$test_linkfail 121362306a36Sopenharmony_ci 121462306a36Sopenharmony_ci if [ -z "$sinfail" ]; then 121562306a36Sopenharmony_ci sinfail=$(mktemp) 121662306a36Sopenharmony_ci fi 121762306a36Sopenharmony_ci make_file "$sinfail" "server" $size 121862306a36Sopenharmony_ci elif [ "$test_linkfail" -eq 2 ] && [ -z "$sinfail" ]; then 121962306a36Sopenharmony_ci size=$((RANDOM%16)) 122062306a36Sopenharmony_ci size=$((size+1)) 122162306a36Sopenharmony_ci size=$((size*2048)) 122262306a36Sopenharmony_ci 122362306a36Sopenharmony_ci sinfail=$(mktemp) 122462306a36Sopenharmony_ci make_file "$sinfail" "server" $size 122562306a36Sopenharmony_ci fi 122662306a36Sopenharmony_ci 122762306a36Sopenharmony_ci do_transfer ${listener_ns} ${connector_ns} MPTCP MPTCP ${connect_addr} 122862306a36Sopenharmony_ci} 122962306a36Sopenharmony_ci 123062306a36Sopenharmony_cidump_stats() 123162306a36Sopenharmony_ci{ 123262306a36Sopenharmony_ci echo Server ns stats 123362306a36Sopenharmony_ci ip netns exec $ns1 nstat -as | grep Tcp 123462306a36Sopenharmony_ci echo Client ns stats 123562306a36Sopenharmony_ci ip netns exec $ns2 nstat -as | grep Tcp 123662306a36Sopenharmony_ci} 123762306a36Sopenharmony_ci 123862306a36Sopenharmony_cichk_csum_nr() 123962306a36Sopenharmony_ci{ 124062306a36Sopenharmony_ci local csum_ns1=${1:-0} 124162306a36Sopenharmony_ci local csum_ns2=${2:-0} 124262306a36Sopenharmony_ci local count 124362306a36Sopenharmony_ci local extra_msg="" 124462306a36Sopenharmony_ci local allow_multi_errors_ns1=0 124562306a36Sopenharmony_ci local allow_multi_errors_ns2=0 124662306a36Sopenharmony_ci 124762306a36Sopenharmony_ci if [[ "${csum_ns1}" = "+"* ]]; then 124862306a36Sopenharmony_ci allow_multi_errors_ns1=1 124962306a36Sopenharmony_ci csum_ns1=${csum_ns1:1} 125062306a36Sopenharmony_ci fi 125162306a36Sopenharmony_ci if [[ "${csum_ns2}" = "+"* ]]; then 125262306a36Sopenharmony_ci allow_multi_errors_ns2=1 125362306a36Sopenharmony_ci csum_ns2=${csum_ns2:1} 125462306a36Sopenharmony_ci fi 125562306a36Sopenharmony_ci 125662306a36Sopenharmony_ci print_check "sum" 125762306a36Sopenharmony_ci count=$(mptcp_lib_get_counter ${ns1} "MPTcpExtDataCsumErr") 125862306a36Sopenharmony_ci if [ "$count" != "$csum_ns1" ]; then 125962306a36Sopenharmony_ci extra_msg="$extra_msg ns1=$count" 126062306a36Sopenharmony_ci fi 126162306a36Sopenharmony_ci if [ -z "$count" ]; then 126262306a36Sopenharmony_ci print_skip 126362306a36Sopenharmony_ci elif { [ "$count" != $csum_ns1 ] && [ $allow_multi_errors_ns1 -eq 0 ]; } || 126462306a36Sopenharmony_ci { [ "$count" -lt $csum_ns1 ] && [ $allow_multi_errors_ns1 -eq 1 ]; }; then 126562306a36Sopenharmony_ci fail_test "got $count data checksum error[s] expected $csum_ns1" 126662306a36Sopenharmony_ci else 126762306a36Sopenharmony_ci print_ok 126862306a36Sopenharmony_ci fi 126962306a36Sopenharmony_ci print_check "csum" 127062306a36Sopenharmony_ci count=$(mptcp_lib_get_counter ${ns2} "MPTcpExtDataCsumErr") 127162306a36Sopenharmony_ci if [ "$count" != "$csum_ns2" ]; then 127262306a36Sopenharmony_ci extra_msg="$extra_msg ns2=$count" 127362306a36Sopenharmony_ci fi 127462306a36Sopenharmony_ci if [ -z "$count" ]; then 127562306a36Sopenharmony_ci print_skip 127662306a36Sopenharmony_ci elif { [ "$count" != $csum_ns2 ] && [ $allow_multi_errors_ns2 -eq 0 ]; } || 127762306a36Sopenharmony_ci { [ "$count" -lt $csum_ns2 ] && [ $allow_multi_errors_ns2 -eq 1 ]; }; then 127862306a36Sopenharmony_ci fail_test "got $count data checksum error[s] expected $csum_ns2" 127962306a36Sopenharmony_ci else 128062306a36Sopenharmony_ci print_ok 128162306a36Sopenharmony_ci fi 128262306a36Sopenharmony_ci 128362306a36Sopenharmony_ci print_info "$extra_msg" 128462306a36Sopenharmony_ci} 128562306a36Sopenharmony_ci 128662306a36Sopenharmony_cichk_fail_nr() 128762306a36Sopenharmony_ci{ 128862306a36Sopenharmony_ci local fail_tx=$1 128962306a36Sopenharmony_ci local fail_rx=$2 129062306a36Sopenharmony_ci local ns_invert=${3:-""} 129162306a36Sopenharmony_ci local count 129262306a36Sopenharmony_ci local ns_tx=$ns1 129362306a36Sopenharmony_ci local ns_rx=$ns2 129462306a36Sopenharmony_ci local extra_msg="" 129562306a36Sopenharmony_ci local allow_tx_lost=0 129662306a36Sopenharmony_ci local allow_rx_lost=0 129762306a36Sopenharmony_ci 129862306a36Sopenharmony_ci if [[ $ns_invert = "invert" ]]; then 129962306a36Sopenharmony_ci ns_tx=$ns2 130062306a36Sopenharmony_ci ns_rx=$ns1 130162306a36Sopenharmony_ci extra_msg="invert" 130262306a36Sopenharmony_ci fi 130362306a36Sopenharmony_ci 130462306a36Sopenharmony_ci if [[ "${fail_tx}" = "-"* ]]; then 130562306a36Sopenharmony_ci allow_tx_lost=1 130662306a36Sopenharmony_ci fail_tx=${fail_tx:1} 130762306a36Sopenharmony_ci fi 130862306a36Sopenharmony_ci if [[ "${fail_rx}" = "-"* ]]; then 130962306a36Sopenharmony_ci allow_rx_lost=1 131062306a36Sopenharmony_ci fail_rx=${fail_rx:1} 131162306a36Sopenharmony_ci fi 131262306a36Sopenharmony_ci 131362306a36Sopenharmony_ci print_check "ftx" 131462306a36Sopenharmony_ci count=$(mptcp_lib_get_counter ${ns_tx} "MPTcpExtMPFailTx") 131562306a36Sopenharmony_ci if [ "$count" != "$fail_tx" ]; then 131662306a36Sopenharmony_ci extra_msg="$extra_msg,tx=$count" 131762306a36Sopenharmony_ci fi 131862306a36Sopenharmony_ci if [ -z "$count" ]; then 131962306a36Sopenharmony_ci print_skip 132062306a36Sopenharmony_ci elif { [ "$count" != "$fail_tx" ] && [ $allow_tx_lost -eq 0 ]; } || 132162306a36Sopenharmony_ci { [ "$count" -gt "$fail_tx" ] && [ $allow_tx_lost -eq 1 ]; }; then 132262306a36Sopenharmony_ci fail_test "got $count MP_FAIL[s] TX expected $fail_tx" 132362306a36Sopenharmony_ci else 132462306a36Sopenharmony_ci print_ok 132562306a36Sopenharmony_ci fi 132662306a36Sopenharmony_ci 132762306a36Sopenharmony_ci print_check "failrx" 132862306a36Sopenharmony_ci count=$(mptcp_lib_get_counter ${ns_rx} "MPTcpExtMPFailRx") 132962306a36Sopenharmony_ci if [ "$count" != "$fail_rx" ]; then 133062306a36Sopenharmony_ci extra_msg="$extra_msg,rx=$count" 133162306a36Sopenharmony_ci fi 133262306a36Sopenharmony_ci if [ -z "$count" ]; then 133362306a36Sopenharmony_ci print_skip 133462306a36Sopenharmony_ci elif { [ "$count" != "$fail_rx" ] && [ $allow_rx_lost -eq 0 ]; } || 133562306a36Sopenharmony_ci { [ "$count" -gt "$fail_rx" ] && [ $allow_rx_lost -eq 1 ]; }; then 133662306a36Sopenharmony_ci fail_test "got $count MP_FAIL[s] RX expected $fail_rx" 133762306a36Sopenharmony_ci else 133862306a36Sopenharmony_ci print_ok 133962306a36Sopenharmony_ci fi 134062306a36Sopenharmony_ci 134162306a36Sopenharmony_ci print_info "$extra_msg" 134262306a36Sopenharmony_ci} 134362306a36Sopenharmony_ci 134462306a36Sopenharmony_cichk_fclose_nr() 134562306a36Sopenharmony_ci{ 134662306a36Sopenharmony_ci local fclose_tx=$1 134762306a36Sopenharmony_ci local fclose_rx=$2 134862306a36Sopenharmony_ci local ns_invert=$3 134962306a36Sopenharmony_ci local count 135062306a36Sopenharmony_ci local ns_tx=$ns2 135162306a36Sopenharmony_ci local ns_rx=$ns1 135262306a36Sopenharmony_ci local extra_msg="" 135362306a36Sopenharmony_ci 135462306a36Sopenharmony_ci if [[ $ns_invert = "invert" ]]; then 135562306a36Sopenharmony_ci ns_tx=$ns1 135662306a36Sopenharmony_ci ns_rx=$ns2 135762306a36Sopenharmony_ci extra_msg="invert" 135862306a36Sopenharmony_ci fi 135962306a36Sopenharmony_ci 136062306a36Sopenharmony_ci print_check "ctx" 136162306a36Sopenharmony_ci count=$(mptcp_lib_get_counter ${ns_tx} "MPTcpExtMPFastcloseTx") 136262306a36Sopenharmony_ci if [ -z "$count" ]; then 136362306a36Sopenharmony_ci print_skip 136462306a36Sopenharmony_ci elif [ "$count" != "$fclose_tx" ]; then 136562306a36Sopenharmony_ci extra_msg="$extra_msg,tx=$count" 136662306a36Sopenharmony_ci fail_test "got $count MP_FASTCLOSE[s] TX expected $fclose_tx" 136762306a36Sopenharmony_ci else 136862306a36Sopenharmony_ci print_ok 136962306a36Sopenharmony_ci fi 137062306a36Sopenharmony_ci 137162306a36Sopenharmony_ci print_check "fclzrx" 137262306a36Sopenharmony_ci count=$(mptcp_lib_get_counter ${ns_rx} "MPTcpExtMPFastcloseRx") 137362306a36Sopenharmony_ci if [ -z "$count" ]; then 137462306a36Sopenharmony_ci print_skip 137562306a36Sopenharmony_ci elif [ "$count" != "$fclose_rx" ]; then 137662306a36Sopenharmony_ci extra_msg="$extra_msg,rx=$count" 137762306a36Sopenharmony_ci fail_test "got $count MP_FASTCLOSE[s] RX expected $fclose_rx" 137862306a36Sopenharmony_ci else 137962306a36Sopenharmony_ci print_ok 138062306a36Sopenharmony_ci fi 138162306a36Sopenharmony_ci 138262306a36Sopenharmony_ci print_info "$extra_msg" 138362306a36Sopenharmony_ci} 138462306a36Sopenharmony_ci 138562306a36Sopenharmony_cichk_rst_nr() 138662306a36Sopenharmony_ci{ 138762306a36Sopenharmony_ci local rst_tx=$1 138862306a36Sopenharmony_ci local rst_rx=$2 138962306a36Sopenharmony_ci local ns_invert=${3:-""} 139062306a36Sopenharmony_ci local count 139162306a36Sopenharmony_ci local ns_tx=$ns1 139262306a36Sopenharmony_ci local ns_rx=$ns2 139362306a36Sopenharmony_ci local extra_msg="" 139462306a36Sopenharmony_ci 139562306a36Sopenharmony_ci if [[ $ns_invert = "invert" ]]; then 139662306a36Sopenharmony_ci ns_tx=$ns2 139762306a36Sopenharmony_ci ns_rx=$ns1 139862306a36Sopenharmony_ci extra_msg="invert" 139962306a36Sopenharmony_ci fi 140062306a36Sopenharmony_ci 140162306a36Sopenharmony_ci print_check "rtx" 140262306a36Sopenharmony_ci count=$(mptcp_lib_get_counter ${ns_tx} "MPTcpExtMPRstTx") 140362306a36Sopenharmony_ci if [ -z "$count" ]; then 140462306a36Sopenharmony_ci print_skip 140562306a36Sopenharmony_ci # accept more rst than expected except if we don't expect any 140662306a36Sopenharmony_ci elif { [ $rst_tx -ne 0 ] && [ $count -lt $rst_tx ]; } || 140762306a36Sopenharmony_ci { [ $rst_tx -eq 0 ] && [ $count -ne 0 ]; }; then 140862306a36Sopenharmony_ci fail_test "got $count MP_RST[s] TX expected $rst_tx" 140962306a36Sopenharmony_ci else 141062306a36Sopenharmony_ci print_ok 141162306a36Sopenharmony_ci fi 141262306a36Sopenharmony_ci 141362306a36Sopenharmony_ci print_check "rstrx" 141462306a36Sopenharmony_ci count=$(mptcp_lib_get_counter ${ns_rx} "MPTcpExtMPRstRx") 141562306a36Sopenharmony_ci if [ -z "$count" ]; then 141662306a36Sopenharmony_ci print_skip 141762306a36Sopenharmony_ci # accept more rst than expected except if we don't expect any 141862306a36Sopenharmony_ci elif { [ $rst_rx -ne 0 ] && [ $count -lt $rst_rx ]; } || 141962306a36Sopenharmony_ci { [ $rst_rx -eq 0 ] && [ $count -ne 0 ]; }; then 142062306a36Sopenharmony_ci fail_test "got $count MP_RST[s] RX expected $rst_rx" 142162306a36Sopenharmony_ci else 142262306a36Sopenharmony_ci print_ok 142362306a36Sopenharmony_ci fi 142462306a36Sopenharmony_ci 142562306a36Sopenharmony_ci print_info "$extra_msg" 142662306a36Sopenharmony_ci} 142762306a36Sopenharmony_ci 142862306a36Sopenharmony_cichk_infi_nr() 142962306a36Sopenharmony_ci{ 143062306a36Sopenharmony_ci local infi_tx=$1 143162306a36Sopenharmony_ci local infi_rx=$2 143262306a36Sopenharmony_ci local count 143362306a36Sopenharmony_ci 143462306a36Sopenharmony_ci print_check "itx" 143562306a36Sopenharmony_ci count=$(mptcp_lib_get_counter ${ns2} "MPTcpExtInfiniteMapTx") 143662306a36Sopenharmony_ci if [ -z "$count" ]; then 143762306a36Sopenharmony_ci print_skip 143862306a36Sopenharmony_ci elif [ "$count" != "$infi_tx" ]; then 143962306a36Sopenharmony_ci fail_test "got $count infinite map[s] TX expected $infi_tx" 144062306a36Sopenharmony_ci else 144162306a36Sopenharmony_ci print_ok 144262306a36Sopenharmony_ci fi 144362306a36Sopenharmony_ci 144462306a36Sopenharmony_ci print_check "infirx" 144562306a36Sopenharmony_ci count=$(mptcp_lib_get_counter ${ns1} "MPTcpExtInfiniteMapRx") 144662306a36Sopenharmony_ci if [ -z "$count" ]; then 144762306a36Sopenharmony_ci print_skip 144862306a36Sopenharmony_ci elif [ "$count" != "$infi_rx" ]; then 144962306a36Sopenharmony_ci fail_test "got $count infinite map[s] RX expected $infi_rx" 145062306a36Sopenharmony_ci else 145162306a36Sopenharmony_ci print_ok 145262306a36Sopenharmony_ci fi 145362306a36Sopenharmony_ci} 145462306a36Sopenharmony_ci 145562306a36Sopenharmony_cichk_join_nr() 145662306a36Sopenharmony_ci{ 145762306a36Sopenharmony_ci local syn_nr=$1 145862306a36Sopenharmony_ci local syn_ack_nr=$2 145962306a36Sopenharmony_ci local ack_nr=$3 146062306a36Sopenharmony_ci local csum_ns1=${4:-0} 146162306a36Sopenharmony_ci local csum_ns2=${5:-0} 146262306a36Sopenharmony_ci local fail_nr=${6:-0} 146362306a36Sopenharmony_ci local rst_nr=${7:-0} 146462306a36Sopenharmony_ci local infi_nr=${8:-0} 146562306a36Sopenharmony_ci local corrupted_pkts=${9:-0} 146662306a36Sopenharmony_ci local count 146762306a36Sopenharmony_ci local with_cookie 146862306a36Sopenharmony_ci 146962306a36Sopenharmony_ci if [ "${corrupted_pkts}" -gt 0 ]; then 147062306a36Sopenharmony_ci print_info "${corrupted_pkts} corrupted pkts" 147162306a36Sopenharmony_ci fi 147262306a36Sopenharmony_ci 147362306a36Sopenharmony_ci print_check "syn" 147462306a36Sopenharmony_ci count=$(mptcp_lib_get_counter ${ns1} "MPTcpExtMPJoinSynRx") 147562306a36Sopenharmony_ci if [ -z "$count" ]; then 147662306a36Sopenharmony_ci print_skip 147762306a36Sopenharmony_ci elif [ "$count" != "$syn_nr" ]; then 147862306a36Sopenharmony_ci fail_test "got $count JOIN[s] syn expected $syn_nr" 147962306a36Sopenharmony_ci else 148062306a36Sopenharmony_ci print_ok 148162306a36Sopenharmony_ci fi 148262306a36Sopenharmony_ci 148362306a36Sopenharmony_ci print_check "synack" 148462306a36Sopenharmony_ci with_cookie=$(ip netns exec $ns2 sysctl -n net.ipv4.tcp_syncookies) 148562306a36Sopenharmony_ci count=$(mptcp_lib_get_counter ${ns2} "MPTcpExtMPJoinSynAckRx") 148662306a36Sopenharmony_ci if [ -z "$count" ]; then 148762306a36Sopenharmony_ci print_skip 148862306a36Sopenharmony_ci elif [ "$count" != "$syn_ack_nr" ]; then 148962306a36Sopenharmony_ci # simult connections exceeding the limit with cookie enabled could go up to 149062306a36Sopenharmony_ci # synack validation as the conn limit can be enforced reliably only after 149162306a36Sopenharmony_ci # the subflow creation 149262306a36Sopenharmony_ci if [ "$with_cookie" = 2 ] && [ "$count" -gt "$syn_ack_nr" ] && [ "$count" -le "$syn_nr" ]; then 149362306a36Sopenharmony_ci print_ok 149462306a36Sopenharmony_ci else 149562306a36Sopenharmony_ci fail_test "got $count JOIN[s] synack expected $syn_ack_nr" 149662306a36Sopenharmony_ci fi 149762306a36Sopenharmony_ci else 149862306a36Sopenharmony_ci print_ok 149962306a36Sopenharmony_ci fi 150062306a36Sopenharmony_ci 150162306a36Sopenharmony_ci print_check "ack" 150262306a36Sopenharmony_ci count=$(mptcp_lib_get_counter ${ns1} "MPTcpExtMPJoinAckRx") 150362306a36Sopenharmony_ci if [ -z "$count" ]; then 150462306a36Sopenharmony_ci print_skip 150562306a36Sopenharmony_ci elif [ "$count" != "$ack_nr" ]; then 150662306a36Sopenharmony_ci fail_test "got $count JOIN[s] ack expected $ack_nr" 150762306a36Sopenharmony_ci else 150862306a36Sopenharmony_ci print_ok 150962306a36Sopenharmony_ci fi 151062306a36Sopenharmony_ci if [ $validate_checksum -eq 1 ]; then 151162306a36Sopenharmony_ci chk_csum_nr $csum_ns1 $csum_ns2 151262306a36Sopenharmony_ci chk_fail_nr $fail_nr $fail_nr 151362306a36Sopenharmony_ci chk_rst_nr $rst_nr $rst_nr 151462306a36Sopenharmony_ci chk_infi_nr $infi_nr $infi_nr 151562306a36Sopenharmony_ci fi 151662306a36Sopenharmony_ci} 151762306a36Sopenharmony_ci 151862306a36Sopenharmony_ci# a negative value for 'stale_max' means no upper bound: 151962306a36Sopenharmony_ci# for bidirectional transfer, if one peer sleep for a while 152062306a36Sopenharmony_ci# - as these tests do - we can have a quite high number of 152162306a36Sopenharmony_ci# stale/recover conversions, proportional to 152262306a36Sopenharmony_ci# sleep duration/ MPTCP-level RTX interval. 152362306a36Sopenharmony_cichk_stale_nr() 152462306a36Sopenharmony_ci{ 152562306a36Sopenharmony_ci local ns=$1 152662306a36Sopenharmony_ci local stale_min=$2 152762306a36Sopenharmony_ci local stale_max=$3 152862306a36Sopenharmony_ci local stale_delta=$4 152962306a36Sopenharmony_ci local dump_stats 153062306a36Sopenharmony_ci local stale_nr 153162306a36Sopenharmony_ci local recover_nr 153262306a36Sopenharmony_ci 153362306a36Sopenharmony_ci print_check "stale" 153462306a36Sopenharmony_ci 153562306a36Sopenharmony_ci stale_nr=$(mptcp_lib_get_counter ${ns} "MPTcpExtSubflowStale") 153662306a36Sopenharmony_ci recover_nr=$(mptcp_lib_get_counter ${ns} "MPTcpExtSubflowRecover") 153762306a36Sopenharmony_ci if [ -z "$stale_nr" ] || [ -z "$recover_nr" ]; then 153862306a36Sopenharmony_ci print_skip 153962306a36Sopenharmony_ci elif [ $stale_nr -lt $stale_min ] || 154062306a36Sopenharmony_ci { [ $stale_max -gt 0 ] && [ $stale_nr -gt $stale_max ]; } || 154162306a36Sopenharmony_ci [ $((stale_nr - recover_nr)) -ne $stale_delta ]; then 154262306a36Sopenharmony_ci fail_test "got $stale_nr stale[s] $recover_nr recover[s], " \ 154362306a36Sopenharmony_ci " expected stale in range [$stale_min..$stale_max]," \ 154462306a36Sopenharmony_ci " stale-recover delta $stale_delta" 154562306a36Sopenharmony_ci dump_stats=1 154662306a36Sopenharmony_ci else 154762306a36Sopenharmony_ci print_ok 154862306a36Sopenharmony_ci fi 154962306a36Sopenharmony_ci 155062306a36Sopenharmony_ci if [ "${dump_stats}" = 1 ]; then 155162306a36Sopenharmony_ci echo $ns stats 155262306a36Sopenharmony_ci ip netns exec $ns ip -s link show 155362306a36Sopenharmony_ci ip netns exec $ns nstat -as | grep MPTcp 155462306a36Sopenharmony_ci fi 155562306a36Sopenharmony_ci} 155662306a36Sopenharmony_ci 155762306a36Sopenharmony_cichk_add_nr() 155862306a36Sopenharmony_ci{ 155962306a36Sopenharmony_ci local add_nr=$1 156062306a36Sopenharmony_ci local echo_nr=$2 156162306a36Sopenharmony_ci local port_nr=${3:-0} 156262306a36Sopenharmony_ci local syn_nr=${4:-$port_nr} 156362306a36Sopenharmony_ci local syn_ack_nr=${5:-$port_nr} 156462306a36Sopenharmony_ci local ack_nr=${6:-$port_nr} 156562306a36Sopenharmony_ci local mis_syn_nr=${7:-0} 156662306a36Sopenharmony_ci local mis_ack_nr=${8:-0} 156762306a36Sopenharmony_ci local count 156862306a36Sopenharmony_ci local timeout 156962306a36Sopenharmony_ci 157062306a36Sopenharmony_ci timeout=$(ip netns exec $ns1 sysctl -n net.mptcp.add_addr_timeout) 157162306a36Sopenharmony_ci 157262306a36Sopenharmony_ci print_check "add" 157362306a36Sopenharmony_ci count=$(mptcp_lib_get_counter ${ns2} "MPTcpExtAddAddr") 157462306a36Sopenharmony_ci if [ -z "$count" ]; then 157562306a36Sopenharmony_ci print_skip 157662306a36Sopenharmony_ci # if the test configured a short timeout tolerate greater then expected 157762306a36Sopenharmony_ci # add addrs options, due to retransmissions 157862306a36Sopenharmony_ci elif [ "$count" != "$add_nr" ] && { [ "$timeout" -gt 1 ] || [ "$count" -lt "$add_nr" ]; }; then 157962306a36Sopenharmony_ci fail_test "got $count ADD_ADDR[s] expected $add_nr" 158062306a36Sopenharmony_ci else 158162306a36Sopenharmony_ci print_ok 158262306a36Sopenharmony_ci fi 158362306a36Sopenharmony_ci 158462306a36Sopenharmony_ci print_check "echo" 158562306a36Sopenharmony_ci count=$(mptcp_lib_get_counter ${ns1} "MPTcpExtEchoAdd") 158662306a36Sopenharmony_ci if [ -z "$count" ]; then 158762306a36Sopenharmony_ci print_skip 158862306a36Sopenharmony_ci elif [ "$count" != "$echo_nr" ]; then 158962306a36Sopenharmony_ci fail_test "got $count ADD_ADDR echo[s] expected $echo_nr" 159062306a36Sopenharmony_ci else 159162306a36Sopenharmony_ci print_ok 159262306a36Sopenharmony_ci fi 159362306a36Sopenharmony_ci 159462306a36Sopenharmony_ci if [ $port_nr -gt 0 ]; then 159562306a36Sopenharmony_ci print_check "pt" 159662306a36Sopenharmony_ci count=$(mptcp_lib_get_counter ${ns2} "MPTcpExtPortAdd") 159762306a36Sopenharmony_ci if [ -z "$count" ]; then 159862306a36Sopenharmony_ci print_skip 159962306a36Sopenharmony_ci elif [ "$count" != "$port_nr" ]; then 160062306a36Sopenharmony_ci fail_test "got $count ADD_ADDR[s] with a port-number expected $port_nr" 160162306a36Sopenharmony_ci else 160262306a36Sopenharmony_ci print_ok 160362306a36Sopenharmony_ci fi 160462306a36Sopenharmony_ci 160562306a36Sopenharmony_ci print_check "syn" 160662306a36Sopenharmony_ci count=$(mptcp_lib_get_counter ${ns1} "MPTcpExtMPJoinPortSynRx") 160762306a36Sopenharmony_ci if [ -z "$count" ]; then 160862306a36Sopenharmony_ci print_skip 160962306a36Sopenharmony_ci elif [ "$count" != "$syn_nr" ]; then 161062306a36Sopenharmony_ci fail_test "got $count JOIN[s] syn with a different \ 161162306a36Sopenharmony_ci port-number expected $syn_nr" 161262306a36Sopenharmony_ci else 161362306a36Sopenharmony_ci print_ok 161462306a36Sopenharmony_ci fi 161562306a36Sopenharmony_ci 161662306a36Sopenharmony_ci print_check "synack" 161762306a36Sopenharmony_ci count=$(mptcp_lib_get_counter ${ns2} "MPTcpExtMPJoinPortSynAckRx") 161862306a36Sopenharmony_ci if [ -z "$count" ]; then 161962306a36Sopenharmony_ci print_skip 162062306a36Sopenharmony_ci elif [ "$count" != "$syn_ack_nr" ]; then 162162306a36Sopenharmony_ci fail_test "got $count JOIN[s] synack with a different \ 162262306a36Sopenharmony_ci port-number expected $syn_ack_nr" 162362306a36Sopenharmony_ci else 162462306a36Sopenharmony_ci print_ok 162562306a36Sopenharmony_ci fi 162662306a36Sopenharmony_ci 162762306a36Sopenharmony_ci print_check "ack" 162862306a36Sopenharmony_ci count=$(mptcp_lib_get_counter ${ns1} "MPTcpExtMPJoinPortAckRx") 162962306a36Sopenharmony_ci if [ -z "$count" ]; then 163062306a36Sopenharmony_ci print_skip 163162306a36Sopenharmony_ci elif [ "$count" != "$ack_nr" ]; then 163262306a36Sopenharmony_ci fail_test "got $count JOIN[s] ack with a different \ 163362306a36Sopenharmony_ci port-number expected $ack_nr" 163462306a36Sopenharmony_ci else 163562306a36Sopenharmony_ci print_ok 163662306a36Sopenharmony_ci fi 163762306a36Sopenharmony_ci 163862306a36Sopenharmony_ci print_check "syn" 163962306a36Sopenharmony_ci count=$(mptcp_lib_get_counter ${ns1} "MPTcpExtMismatchPortSynRx") 164062306a36Sopenharmony_ci if [ -z "$count" ]; then 164162306a36Sopenharmony_ci print_skip 164262306a36Sopenharmony_ci elif [ "$count" != "$mis_syn_nr" ]; then 164362306a36Sopenharmony_ci fail_test "got $count JOIN[s] syn with a mismatched \ 164462306a36Sopenharmony_ci port-number expected $mis_syn_nr" 164562306a36Sopenharmony_ci else 164662306a36Sopenharmony_ci print_ok 164762306a36Sopenharmony_ci fi 164862306a36Sopenharmony_ci 164962306a36Sopenharmony_ci print_check "ack" 165062306a36Sopenharmony_ci count=$(mptcp_lib_get_counter ${ns1} "MPTcpExtMismatchPortAckRx") 165162306a36Sopenharmony_ci if [ -z "$count" ]; then 165262306a36Sopenharmony_ci print_skip 165362306a36Sopenharmony_ci elif [ "$count" != "$mis_ack_nr" ]; then 165462306a36Sopenharmony_ci fail_test "got $count JOIN[s] ack with a mismatched \ 165562306a36Sopenharmony_ci port-number expected $mis_ack_nr" 165662306a36Sopenharmony_ci else 165762306a36Sopenharmony_ci print_ok 165862306a36Sopenharmony_ci fi 165962306a36Sopenharmony_ci fi 166062306a36Sopenharmony_ci} 166162306a36Sopenharmony_ci 166262306a36Sopenharmony_cichk_add_tx_nr() 166362306a36Sopenharmony_ci{ 166462306a36Sopenharmony_ci local add_tx_nr=$1 166562306a36Sopenharmony_ci local echo_tx_nr=$2 166662306a36Sopenharmony_ci local timeout 166762306a36Sopenharmony_ci local count 166862306a36Sopenharmony_ci 166962306a36Sopenharmony_ci timeout=$(ip netns exec $ns1 sysctl -n net.mptcp.add_addr_timeout) 167062306a36Sopenharmony_ci 167162306a36Sopenharmony_ci print_check "add TX" 167262306a36Sopenharmony_ci count=$(mptcp_lib_get_counter ${ns1} "MPTcpExtAddAddrTx") 167362306a36Sopenharmony_ci if [ -z "$count" ]; then 167462306a36Sopenharmony_ci print_skip 167562306a36Sopenharmony_ci # if the test configured a short timeout tolerate greater then expected 167662306a36Sopenharmony_ci # add addrs options, due to retransmissions 167762306a36Sopenharmony_ci elif [ "$count" != "$add_tx_nr" ] && { [ "$timeout" -gt 1 ] || [ "$count" -lt "$add_tx_nr" ]; }; then 167862306a36Sopenharmony_ci fail_test "got $count ADD_ADDR[s] TX, expected $add_tx_nr" 167962306a36Sopenharmony_ci else 168062306a36Sopenharmony_ci print_ok 168162306a36Sopenharmony_ci fi 168262306a36Sopenharmony_ci 168362306a36Sopenharmony_ci print_check "echo TX" 168462306a36Sopenharmony_ci count=$(mptcp_lib_get_counter ${ns2} "MPTcpExtEchoAddTx") 168562306a36Sopenharmony_ci if [ -z "$count" ]; then 168662306a36Sopenharmony_ci print_skip 168762306a36Sopenharmony_ci elif [ "$count" != "$echo_tx_nr" ]; then 168862306a36Sopenharmony_ci fail_test "got $count ADD_ADDR echo[s] TX, expected $echo_tx_nr" 168962306a36Sopenharmony_ci else 169062306a36Sopenharmony_ci print_ok 169162306a36Sopenharmony_ci fi 169262306a36Sopenharmony_ci} 169362306a36Sopenharmony_ci 169462306a36Sopenharmony_cichk_rm_nr() 169562306a36Sopenharmony_ci{ 169662306a36Sopenharmony_ci local rm_addr_nr=$1 169762306a36Sopenharmony_ci local rm_subflow_nr=$2 169862306a36Sopenharmony_ci local invert 169962306a36Sopenharmony_ci local simult 170062306a36Sopenharmony_ci local count 170162306a36Sopenharmony_ci local addr_ns=$ns1 170262306a36Sopenharmony_ci local subflow_ns=$ns2 170362306a36Sopenharmony_ci local extra_msg="" 170462306a36Sopenharmony_ci 170562306a36Sopenharmony_ci shift 2 170662306a36Sopenharmony_ci while [ -n "$1" ]; do 170762306a36Sopenharmony_ci [ "$1" = "invert" ] && invert=true 170862306a36Sopenharmony_ci [ "$1" = "simult" ] && simult=true 170962306a36Sopenharmony_ci shift 171062306a36Sopenharmony_ci done 171162306a36Sopenharmony_ci 171262306a36Sopenharmony_ci if [ -z $invert ]; then 171362306a36Sopenharmony_ci addr_ns=$ns1 171462306a36Sopenharmony_ci subflow_ns=$ns2 171562306a36Sopenharmony_ci elif [ $invert = "true" ]; then 171662306a36Sopenharmony_ci addr_ns=$ns2 171762306a36Sopenharmony_ci subflow_ns=$ns1 171862306a36Sopenharmony_ci extra_msg="invert" 171962306a36Sopenharmony_ci fi 172062306a36Sopenharmony_ci 172162306a36Sopenharmony_ci print_check "rm" 172262306a36Sopenharmony_ci count=$(mptcp_lib_get_counter ${addr_ns} "MPTcpExtRmAddr") 172362306a36Sopenharmony_ci if [ -z "$count" ]; then 172462306a36Sopenharmony_ci print_skip 172562306a36Sopenharmony_ci elif [ "$count" != "$rm_addr_nr" ]; then 172662306a36Sopenharmony_ci fail_test "got $count RM_ADDR[s] expected $rm_addr_nr" 172762306a36Sopenharmony_ci else 172862306a36Sopenharmony_ci print_ok 172962306a36Sopenharmony_ci fi 173062306a36Sopenharmony_ci 173162306a36Sopenharmony_ci print_check "rmsf" 173262306a36Sopenharmony_ci count=$(mptcp_lib_get_counter ${subflow_ns} "MPTcpExtRmSubflow") 173362306a36Sopenharmony_ci if [ -z "$count" ]; then 173462306a36Sopenharmony_ci print_skip 173562306a36Sopenharmony_ci elif [ -n "$simult" ]; then 173662306a36Sopenharmony_ci local cnt suffix 173762306a36Sopenharmony_ci 173862306a36Sopenharmony_ci cnt=$(mptcp_lib_get_counter ${addr_ns} "MPTcpExtRmSubflow") 173962306a36Sopenharmony_ci 174062306a36Sopenharmony_ci # in case of simult flush, the subflow removal count on each side is 174162306a36Sopenharmony_ci # unreliable 174262306a36Sopenharmony_ci count=$((count + cnt)) 174362306a36Sopenharmony_ci [ "$count" != "$rm_subflow_nr" ] && suffix="$count in [$rm_subflow_nr:$((rm_subflow_nr*2))]" 174462306a36Sopenharmony_ci if [ $count -ge "$rm_subflow_nr" ] && \ 174562306a36Sopenharmony_ci [ "$count" -le "$((rm_subflow_nr *2 ))" ]; then 174662306a36Sopenharmony_ci print_ok "$suffix" 174762306a36Sopenharmony_ci else 174862306a36Sopenharmony_ci fail_test "got $count RM_SUBFLOW[s] expected in range [$rm_subflow_nr:$((rm_subflow_nr*2))]" 174962306a36Sopenharmony_ci fi 175062306a36Sopenharmony_ci elif [ "$count" != "$rm_subflow_nr" ]; then 175162306a36Sopenharmony_ci fail_test "got $count RM_SUBFLOW[s] expected $rm_subflow_nr" 175262306a36Sopenharmony_ci else 175362306a36Sopenharmony_ci print_ok 175462306a36Sopenharmony_ci fi 175562306a36Sopenharmony_ci 175662306a36Sopenharmony_ci print_info "$extra_msg" 175762306a36Sopenharmony_ci} 175862306a36Sopenharmony_ci 175962306a36Sopenharmony_cichk_rm_tx_nr() 176062306a36Sopenharmony_ci{ 176162306a36Sopenharmony_ci local rm_addr_tx_nr=$1 176262306a36Sopenharmony_ci 176362306a36Sopenharmony_ci print_check "rm TX" 176462306a36Sopenharmony_ci count=$(mptcp_lib_get_counter ${ns2} "MPTcpExtRmAddrTx") 176562306a36Sopenharmony_ci if [ -z "$count" ]; then 176662306a36Sopenharmony_ci print_skip 176762306a36Sopenharmony_ci elif [ "$count" != "$rm_addr_tx_nr" ]; then 176862306a36Sopenharmony_ci fail_test "got $count RM_ADDR[s] expected $rm_addr_tx_nr" 176962306a36Sopenharmony_ci else 177062306a36Sopenharmony_ci print_ok 177162306a36Sopenharmony_ci fi 177262306a36Sopenharmony_ci} 177362306a36Sopenharmony_ci 177462306a36Sopenharmony_cichk_prio_nr() 177562306a36Sopenharmony_ci{ 177662306a36Sopenharmony_ci local mp_prio_nr_tx=$1 177762306a36Sopenharmony_ci local mp_prio_nr_rx=$2 177862306a36Sopenharmony_ci local count 177962306a36Sopenharmony_ci 178062306a36Sopenharmony_ci print_check "ptx" 178162306a36Sopenharmony_ci count=$(mptcp_lib_get_counter ${ns1} "MPTcpExtMPPrioTx") 178262306a36Sopenharmony_ci if [ -z "$count" ]; then 178362306a36Sopenharmony_ci print_skip 178462306a36Sopenharmony_ci elif [ "$count" != "$mp_prio_nr_tx" ]; then 178562306a36Sopenharmony_ci fail_test "got $count MP_PRIO[s] TX expected $mp_prio_nr_tx" 178662306a36Sopenharmony_ci else 178762306a36Sopenharmony_ci print_ok 178862306a36Sopenharmony_ci fi 178962306a36Sopenharmony_ci 179062306a36Sopenharmony_ci print_check "prx" 179162306a36Sopenharmony_ci count=$(mptcp_lib_get_counter ${ns1} "MPTcpExtMPPrioRx") 179262306a36Sopenharmony_ci if [ -z "$count" ]; then 179362306a36Sopenharmony_ci print_skip 179462306a36Sopenharmony_ci elif [ "$count" != "$mp_prio_nr_rx" ]; then 179562306a36Sopenharmony_ci fail_test "got $count MP_PRIO[s] RX expected $mp_prio_nr_rx" 179662306a36Sopenharmony_ci else 179762306a36Sopenharmony_ci print_ok 179862306a36Sopenharmony_ci fi 179962306a36Sopenharmony_ci} 180062306a36Sopenharmony_ci 180162306a36Sopenharmony_cichk_subflow_nr() 180262306a36Sopenharmony_ci{ 180362306a36Sopenharmony_ci local msg="$1" 180462306a36Sopenharmony_ci local subflow_nr=$2 180562306a36Sopenharmony_ci local cnt1 180662306a36Sopenharmony_ci local cnt2 180762306a36Sopenharmony_ci local dump_stats 180862306a36Sopenharmony_ci 180962306a36Sopenharmony_ci print_check "${msg}" 181062306a36Sopenharmony_ci 181162306a36Sopenharmony_ci cnt1=$(ss -N $ns1 -tOni | grep -c token) 181262306a36Sopenharmony_ci cnt2=$(ss -N $ns2 -tOni | grep -c token) 181362306a36Sopenharmony_ci if [ "$cnt1" != "$subflow_nr" ] || [ "$cnt2" != "$subflow_nr" ]; then 181462306a36Sopenharmony_ci fail_test "got $cnt1:$cnt2 subflows expected $subflow_nr" 181562306a36Sopenharmony_ci dump_stats=1 181662306a36Sopenharmony_ci else 181762306a36Sopenharmony_ci print_ok 181862306a36Sopenharmony_ci fi 181962306a36Sopenharmony_ci 182062306a36Sopenharmony_ci if [ "${dump_stats}" = 1 ]; then 182162306a36Sopenharmony_ci ss -N $ns1 -tOni 182262306a36Sopenharmony_ci ss -N $ns1 -tOni | grep token 182362306a36Sopenharmony_ci ip -n $ns1 mptcp endpoint 182462306a36Sopenharmony_ci fi 182562306a36Sopenharmony_ci} 182662306a36Sopenharmony_ci 182762306a36Sopenharmony_cichk_mptcp_info() 182862306a36Sopenharmony_ci{ 182962306a36Sopenharmony_ci local info1=$1 183062306a36Sopenharmony_ci local exp1=$2 183162306a36Sopenharmony_ci local info2=$3 183262306a36Sopenharmony_ci local exp2=$4 183362306a36Sopenharmony_ci local cnt1 183462306a36Sopenharmony_ci local cnt2 183562306a36Sopenharmony_ci local dump_stats 183662306a36Sopenharmony_ci 183762306a36Sopenharmony_ci print_check "mptcp_info ${info1:0:15}=$exp1:$exp2" 183862306a36Sopenharmony_ci 183962306a36Sopenharmony_ci cnt1=$(ss -N $ns1 -inmHM | mptcp_lib_get_info_value "$info1" "$info1") 184062306a36Sopenharmony_ci cnt2=$(ss -N $ns2 -inmHM | mptcp_lib_get_info_value "$info2" "$info2") 184162306a36Sopenharmony_ci # 'ss' only display active connections and counters that are not 0. 184262306a36Sopenharmony_ci [ -z "$cnt1" ] && cnt1=0 184362306a36Sopenharmony_ci [ -z "$cnt2" ] && cnt2=0 184462306a36Sopenharmony_ci 184562306a36Sopenharmony_ci if [ "$cnt1" != "$exp1" ] || [ "$cnt2" != "$exp2" ]; then 184662306a36Sopenharmony_ci fail_test "got $cnt1:$cnt2 $info1:$info2 expected $exp1:$exp2" 184762306a36Sopenharmony_ci dump_stats=1 184862306a36Sopenharmony_ci else 184962306a36Sopenharmony_ci print_ok 185062306a36Sopenharmony_ci fi 185162306a36Sopenharmony_ci 185262306a36Sopenharmony_ci if [ "$dump_stats" = 1 ]; then 185362306a36Sopenharmony_ci ss -N $ns1 -inmHM 185462306a36Sopenharmony_ci ss -N $ns2 -inmHM 185562306a36Sopenharmony_ci fi 185662306a36Sopenharmony_ci} 185762306a36Sopenharmony_ci 185862306a36Sopenharmony_ci# $1: subflows in ns1 ; $2: subflows in ns2 185962306a36Sopenharmony_ci# number of all subflows, including the initial subflow. 186062306a36Sopenharmony_cichk_subflows_total() 186162306a36Sopenharmony_ci{ 186262306a36Sopenharmony_ci local cnt1 186362306a36Sopenharmony_ci local cnt2 186462306a36Sopenharmony_ci local info="subflows_total" 186562306a36Sopenharmony_ci local dump_stats 186662306a36Sopenharmony_ci 186762306a36Sopenharmony_ci # if subflows_total counter is supported, use it: 186862306a36Sopenharmony_ci if [ -n "$(ss -N $ns1 -inmHM | mptcp_lib_get_info_value $info $info)" ]; then 186962306a36Sopenharmony_ci chk_mptcp_info $info $1 $info $2 187062306a36Sopenharmony_ci return 187162306a36Sopenharmony_ci fi 187262306a36Sopenharmony_ci 187362306a36Sopenharmony_ci print_check "$info $1:$2" 187462306a36Sopenharmony_ci 187562306a36Sopenharmony_ci # if not, count the TCP connections that are in fact MPTCP subflows 187662306a36Sopenharmony_ci cnt1=$(ss -N $ns1 -ti state established state syn-sent state syn-recv | 187762306a36Sopenharmony_ci grep -c tcp-ulp-mptcp) 187862306a36Sopenharmony_ci cnt2=$(ss -N $ns2 -ti state established state syn-sent state syn-recv | 187962306a36Sopenharmony_ci grep -c tcp-ulp-mptcp) 188062306a36Sopenharmony_ci 188162306a36Sopenharmony_ci if [ "$1" != "$cnt1" ] || [ "$2" != "$cnt2" ]; then 188262306a36Sopenharmony_ci fail_test "got subflows $cnt1:$cnt2 expected $1:$2" 188362306a36Sopenharmony_ci dump_stats=1 188462306a36Sopenharmony_ci else 188562306a36Sopenharmony_ci print_ok 188662306a36Sopenharmony_ci fi 188762306a36Sopenharmony_ci 188862306a36Sopenharmony_ci if [ "$dump_stats" = 1 ]; then 188962306a36Sopenharmony_ci ss -N $ns1 -ti 189062306a36Sopenharmony_ci ss -N $ns2 -ti 189162306a36Sopenharmony_ci fi 189262306a36Sopenharmony_ci} 189362306a36Sopenharmony_ci 189462306a36Sopenharmony_cichk_link_usage() 189562306a36Sopenharmony_ci{ 189662306a36Sopenharmony_ci local ns=$1 189762306a36Sopenharmony_ci local link=$2 189862306a36Sopenharmony_ci local out=$3 189962306a36Sopenharmony_ci local expected_rate=$4 190062306a36Sopenharmony_ci 190162306a36Sopenharmony_ci local tx_link tx_total 190262306a36Sopenharmony_ci tx_link=$(ip netns exec $ns cat /sys/class/net/$link/statistics/tx_bytes) 190362306a36Sopenharmony_ci tx_total=$(stat --format=%s $out) 190462306a36Sopenharmony_ci local tx_rate=$((tx_link * 100 / tx_total)) 190562306a36Sopenharmony_ci local tolerance=5 190662306a36Sopenharmony_ci 190762306a36Sopenharmony_ci print_check "link usage" 190862306a36Sopenharmony_ci if [ $tx_rate -lt $((expected_rate - tolerance)) ] || \ 190962306a36Sopenharmony_ci [ $tx_rate -gt $((expected_rate + tolerance)) ]; then 191062306a36Sopenharmony_ci fail_test "got $tx_rate% usage, expected $expected_rate%" 191162306a36Sopenharmony_ci else 191262306a36Sopenharmony_ci print_ok 191362306a36Sopenharmony_ci fi 191462306a36Sopenharmony_ci} 191562306a36Sopenharmony_ci 191662306a36Sopenharmony_ciwait_attempt_fail() 191762306a36Sopenharmony_ci{ 191862306a36Sopenharmony_ci local timeout_ms=$((timeout_poll * 1000)) 191962306a36Sopenharmony_ci local time=0 192062306a36Sopenharmony_ci local ns=$1 192162306a36Sopenharmony_ci 192262306a36Sopenharmony_ci while [ $time -lt $timeout_ms ]; do 192362306a36Sopenharmony_ci local cnt 192462306a36Sopenharmony_ci 192562306a36Sopenharmony_ci cnt=$(mptcp_lib_get_counter ${ns} "TcpAttemptFails") 192662306a36Sopenharmony_ci 192762306a36Sopenharmony_ci [ "$cnt" = 1 ] && return 1 192862306a36Sopenharmony_ci time=$((time + 100)) 192962306a36Sopenharmony_ci sleep 0.1 193062306a36Sopenharmony_ci done 193162306a36Sopenharmony_ci return 1 193262306a36Sopenharmony_ci} 193362306a36Sopenharmony_ci 193462306a36Sopenharmony_ciset_userspace_pm() 193562306a36Sopenharmony_ci{ 193662306a36Sopenharmony_ci local ns=$1 193762306a36Sopenharmony_ci 193862306a36Sopenharmony_ci ip netns exec $ns sysctl -q net.mptcp.pm_type=1 193962306a36Sopenharmony_ci} 194062306a36Sopenharmony_ci 194162306a36Sopenharmony_cisubflows_tests() 194262306a36Sopenharmony_ci{ 194362306a36Sopenharmony_ci if reset "no JOIN"; then 194462306a36Sopenharmony_ci run_tests $ns1 $ns2 10.0.1.1 194562306a36Sopenharmony_ci chk_join_nr 0 0 0 194662306a36Sopenharmony_ci fi 194762306a36Sopenharmony_ci 194862306a36Sopenharmony_ci # subflow limited by client 194962306a36Sopenharmony_ci if reset "single subflow, limited by client"; then 195062306a36Sopenharmony_ci pm_nl_set_limits $ns1 0 0 195162306a36Sopenharmony_ci pm_nl_set_limits $ns2 0 0 195262306a36Sopenharmony_ci pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow 195362306a36Sopenharmony_ci run_tests $ns1 $ns2 10.0.1.1 195462306a36Sopenharmony_ci chk_join_nr 0 0 0 195562306a36Sopenharmony_ci fi 195662306a36Sopenharmony_ci 195762306a36Sopenharmony_ci # subflow limited by server 195862306a36Sopenharmony_ci if reset "single subflow, limited by server"; then 195962306a36Sopenharmony_ci pm_nl_set_limits $ns1 0 0 196062306a36Sopenharmony_ci pm_nl_set_limits $ns2 0 1 196162306a36Sopenharmony_ci pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow 196262306a36Sopenharmony_ci run_tests $ns1 $ns2 10.0.1.1 196362306a36Sopenharmony_ci chk_join_nr 1 1 0 196462306a36Sopenharmony_ci fi 196562306a36Sopenharmony_ci 196662306a36Sopenharmony_ci # subflow 196762306a36Sopenharmony_ci if reset "single subflow"; then 196862306a36Sopenharmony_ci pm_nl_set_limits $ns1 0 1 196962306a36Sopenharmony_ci pm_nl_set_limits $ns2 0 1 197062306a36Sopenharmony_ci pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow 197162306a36Sopenharmony_ci run_tests $ns1 $ns2 10.0.1.1 197262306a36Sopenharmony_ci chk_join_nr 1 1 1 197362306a36Sopenharmony_ci fi 197462306a36Sopenharmony_ci 197562306a36Sopenharmony_ci # multiple subflows 197662306a36Sopenharmony_ci if reset "multiple subflows"; then 197762306a36Sopenharmony_ci pm_nl_set_limits $ns1 0 2 197862306a36Sopenharmony_ci pm_nl_set_limits $ns2 0 2 197962306a36Sopenharmony_ci pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow 198062306a36Sopenharmony_ci pm_nl_add_endpoint $ns2 10.0.2.2 flags subflow 198162306a36Sopenharmony_ci run_tests $ns1 $ns2 10.0.1.1 198262306a36Sopenharmony_ci chk_join_nr 2 2 2 198362306a36Sopenharmony_ci fi 198462306a36Sopenharmony_ci 198562306a36Sopenharmony_ci # multiple subflows limited by server 198662306a36Sopenharmony_ci if reset "multiple subflows, limited by server"; then 198762306a36Sopenharmony_ci pm_nl_set_limits $ns1 0 1 198862306a36Sopenharmony_ci pm_nl_set_limits $ns2 0 2 198962306a36Sopenharmony_ci pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow 199062306a36Sopenharmony_ci pm_nl_add_endpoint $ns2 10.0.2.2 flags subflow 199162306a36Sopenharmony_ci run_tests $ns1 $ns2 10.0.1.1 199262306a36Sopenharmony_ci chk_join_nr 2 2 1 199362306a36Sopenharmony_ci fi 199462306a36Sopenharmony_ci 199562306a36Sopenharmony_ci # single subflow, dev 199662306a36Sopenharmony_ci if reset "single subflow, dev"; then 199762306a36Sopenharmony_ci pm_nl_set_limits $ns1 0 1 199862306a36Sopenharmony_ci pm_nl_set_limits $ns2 0 1 199962306a36Sopenharmony_ci pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow dev ns2eth3 200062306a36Sopenharmony_ci run_tests $ns1 $ns2 10.0.1.1 200162306a36Sopenharmony_ci chk_join_nr 1 1 1 200262306a36Sopenharmony_ci fi 200362306a36Sopenharmony_ci} 200462306a36Sopenharmony_ci 200562306a36Sopenharmony_cisubflows_error_tests() 200662306a36Sopenharmony_ci{ 200762306a36Sopenharmony_ci # If a single subflow is configured, and matches the MPC src 200862306a36Sopenharmony_ci # address, no additional subflow should be created 200962306a36Sopenharmony_ci if reset "no MPC reuse with single endpoint"; then 201062306a36Sopenharmony_ci pm_nl_set_limits $ns1 0 1 201162306a36Sopenharmony_ci pm_nl_set_limits $ns2 0 1 201262306a36Sopenharmony_ci pm_nl_add_endpoint $ns2 10.0.1.2 flags subflow 201362306a36Sopenharmony_ci speed=slow \ 201462306a36Sopenharmony_ci run_tests $ns1 $ns2 10.0.1.1 201562306a36Sopenharmony_ci chk_join_nr 0 0 0 201662306a36Sopenharmony_ci fi 201762306a36Sopenharmony_ci 201862306a36Sopenharmony_ci # multiple subflows, with subflow creation error 201962306a36Sopenharmony_ci if reset_with_tcp_filter "multi subflows, with failing subflow" ns1 10.0.3.2 REJECT && 202062306a36Sopenharmony_ci continue_if mptcp_lib_kallsyms_has "mptcp_pm_subflow_check_next$"; then 202162306a36Sopenharmony_ci pm_nl_set_limits $ns1 0 2 202262306a36Sopenharmony_ci pm_nl_set_limits $ns2 0 2 202362306a36Sopenharmony_ci pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow 202462306a36Sopenharmony_ci pm_nl_add_endpoint $ns2 10.0.2.2 flags subflow 202562306a36Sopenharmony_ci speed=slow \ 202662306a36Sopenharmony_ci run_tests $ns1 $ns2 10.0.1.1 202762306a36Sopenharmony_ci chk_join_nr 1 1 1 202862306a36Sopenharmony_ci fi 202962306a36Sopenharmony_ci 203062306a36Sopenharmony_ci # multiple subflows, with subflow timeout on MPJ 203162306a36Sopenharmony_ci if reset_with_tcp_filter "multi subflows, with subflow timeout" ns1 10.0.3.2 DROP && 203262306a36Sopenharmony_ci continue_if mptcp_lib_kallsyms_has "mptcp_pm_subflow_check_next$"; then 203362306a36Sopenharmony_ci pm_nl_set_limits $ns1 0 2 203462306a36Sopenharmony_ci pm_nl_set_limits $ns2 0 2 203562306a36Sopenharmony_ci pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow 203662306a36Sopenharmony_ci pm_nl_add_endpoint $ns2 10.0.2.2 flags subflow 203762306a36Sopenharmony_ci speed=slow \ 203862306a36Sopenharmony_ci run_tests $ns1 $ns2 10.0.1.1 203962306a36Sopenharmony_ci chk_join_nr 1 1 1 204062306a36Sopenharmony_ci fi 204162306a36Sopenharmony_ci 204262306a36Sopenharmony_ci # multiple subflows, check that the endpoint corresponding to 204362306a36Sopenharmony_ci # closed subflow (due to reset) is not reused if additional 204462306a36Sopenharmony_ci # subflows are added later 204562306a36Sopenharmony_ci if reset_with_tcp_filter "multi subflows, fair usage on close" ns1 10.0.3.2 REJECT && 204662306a36Sopenharmony_ci continue_if mptcp_lib_kallsyms_has "mptcp_pm_subflow_check_next$"; then 204762306a36Sopenharmony_ci pm_nl_set_limits $ns1 0 1 204862306a36Sopenharmony_ci pm_nl_set_limits $ns2 0 1 204962306a36Sopenharmony_ci pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow 205062306a36Sopenharmony_ci speed=slow \ 205162306a36Sopenharmony_ci run_tests $ns1 $ns2 10.0.1.1 & 205262306a36Sopenharmony_ci 205362306a36Sopenharmony_ci # mpj subflow will be in TW after the reset 205462306a36Sopenharmony_ci wait_attempt_fail $ns2 205562306a36Sopenharmony_ci pm_nl_add_endpoint $ns2 10.0.2.2 flags subflow 205662306a36Sopenharmony_ci wait 205762306a36Sopenharmony_ci 205862306a36Sopenharmony_ci # additional subflow could be created only if the PM select 205962306a36Sopenharmony_ci # the later endpoint, skipping the already used one 206062306a36Sopenharmony_ci chk_join_nr 1 1 1 206162306a36Sopenharmony_ci fi 206262306a36Sopenharmony_ci} 206362306a36Sopenharmony_ci 206462306a36Sopenharmony_cisignal_address_tests() 206562306a36Sopenharmony_ci{ 206662306a36Sopenharmony_ci # add_address, unused 206762306a36Sopenharmony_ci if reset "unused signal address"; then 206862306a36Sopenharmony_ci pm_nl_add_endpoint $ns1 10.0.2.1 flags signal 206962306a36Sopenharmony_ci run_tests $ns1 $ns2 10.0.1.1 207062306a36Sopenharmony_ci chk_join_nr 0 0 0 207162306a36Sopenharmony_ci chk_add_tx_nr 1 1 207262306a36Sopenharmony_ci chk_add_nr 1 1 207362306a36Sopenharmony_ci fi 207462306a36Sopenharmony_ci 207562306a36Sopenharmony_ci # accept and use add_addr 207662306a36Sopenharmony_ci if reset "signal address"; then 207762306a36Sopenharmony_ci pm_nl_set_limits $ns1 0 1 207862306a36Sopenharmony_ci pm_nl_set_limits $ns2 1 1 207962306a36Sopenharmony_ci pm_nl_add_endpoint $ns1 10.0.2.1 flags signal 208062306a36Sopenharmony_ci run_tests $ns1 $ns2 10.0.1.1 208162306a36Sopenharmony_ci chk_join_nr 1 1 1 208262306a36Sopenharmony_ci chk_add_nr 1 1 208362306a36Sopenharmony_ci fi 208462306a36Sopenharmony_ci 208562306a36Sopenharmony_ci # accept and use add_addr with an additional subflow 208662306a36Sopenharmony_ci # note: signal address in server ns and local addresses in client ns must 208762306a36Sopenharmony_ci # belong to different subnets or one of the listed local address could be 208862306a36Sopenharmony_ci # used for 'add_addr' subflow 208962306a36Sopenharmony_ci if reset "subflow and signal"; then 209062306a36Sopenharmony_ci pm_nl_add_endpoint $ns1 10.0.2.1 flags signal 209162306a36Sopenharmony_ci pm_nl_set_limits $ns1 0 2 209262306a36Sopenharmony_ci pm_nl_set_limits $ns2 1 2 209362306a36Sopenharmony_ci pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow 209462306a36Sopenharmony_ci run_tests $ns1 $ns2 10.0.1.1 209562306a36Sopenharmony_ci chk_join_nr 2 2 2 209662306a36Sopenharmony_ci chk_add_nr 1 1 209762306a36Sopenharmony_ci fi 209862306a36Sopenharmony_ci 209962306a36Sopenharmony_ci # accept and use add_addr with additional subflows 210062306a36Sopenharmony_ci if reset "multiple subflows and signal"; then 210162306a36Sopenharmony_ci pm_nl_set_limits $ns1 0 3 210262306a36Sopenharmony_ci pm_nl_add_endpoint $ns1 10.0.2.1 flags signal 210362306a36Sopenharmony_ci pm_nl_set_limits $ns2 1 3 210462306a36Sopenharmony_ci pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow 210562306a36Sopenharmony_ci pm_nl_add_endpoint $ns2 10.0.4.2 flags subflow 210662306a36Sopenharmony_ci run_tests $ns1 $ns2 10.0.1.1 210762306a36Sopenharmony_ci chk_join_nr 3 3 3 210862306a36Sopenharmony_ci chk_add_nr 1 1 210962306a36Sopenharmony_ci fi 211062306a36Sopenharmony_ci 211162306a36Sopenharmony_ci # signal addresses 211262306a36Sopenharmony_ci if reset "signal addresses"; then 211362306a36Sopenharmony_ci pm_nl_set_limits $ns1 3 3 211462306a36Sopenharmony_ci pm_nl_add_endpoint $ns1 10.0.2.1 flags signal 211562306a36Sopenharmony_ci pm_nl_add_endpoint $ns1 10.0.3.1 flags signal 211662306a36Sopenharmony_ci pm_nl_add_endpoint $ns1 10.0.4.1 flags signal 211762306a36Sopenharmony_ci pm_nl_set_limits $ns2 3 3 211862306a36Sopenharmony_ci run_tests $ns1 $ns2 10.0.1.1 211962306a36Sopenharmony_ci chk_join_nr 3 3 3 212062306a36Sopenharmony_ci chk_add_nr 3 3 212162306a36Sopenharmony_ci fi 212262306a36Sopenharmony_ci 212362306a36Sopenharmony_ci # signal invalid addresses 212462306a36Sopenharmony_ci if reset "signal invalid addresses"; then 212562306a36Sopenharmony_ci pm_nl_set_limits $ns1 3 3 212662306a36Sopenharmony_ci pm_nl_add_endpoint $ns1 10.0.12.1 flags signal 212762306a36Sopenharmony_ci pm_nl_add_endpoint $ns1 10.0.3.1 flags signal 212862306a36Sopenharmony_ci pm_nl_add_endpoint $ns1 10.0.14.1 flags signal 212962306a36Sopenharmony_ci pm_nl_set_limits $ns2 3 3 213062306a36Sopenharmony_ci run_tests $ns1 $ns2 10.0.1.1 213162306a36Sopenharmony_ci chk_join_nr 1 1 1 213262306a36Sopenharmony_ci chk_add_nr 3 3 213362306a36Sopenharmony_ci fi 213462306a36Sopenharmony_ci 213562306a36Sopenharmony_ci # signal addresses race test 213662306a36Sopenharmony_ci if reset "signal addresses race test"; then 213762306a36Sopenharmony_ci pm_nl_set_limits $ns1 4 4 213862306a36Sopenharmony_ci pm_nl_set_limits $ns2 4 4 213962306a36Sopenharmony_ci pm_nl_add_endpoint $ns1 10.0.1.1 flags signal 214062306a36Sopenharmony_ci pm_nl_add_endpoint $ns1 10.0.2.1 flags signal 214162306a36Sopenharmony_ci pm_nl_add_endpoint $ns1 10.0.3.1 flags signal 214262306a36Sopenharmony_ci pm_nl_add_endpoint $ns1 10.0.4.1 flags signal 214362306a36Sopenharmony_ci pm_nl_add_endpoint $ns2 10.0.1.2 flags signal 214462306a36Sopenharmony_ci pm_nl_add_endpoint $ns2 10.0.2.2 flags signal 214562306a36Sopenharmony_ci pm_nl_add_endpoint $ns2 10.0.3.2 flags signal 214662306a36Sopenharmony_ci pm_nl_add_endpoint $ns2 10.0.4.2 flags signal 214762306a36Sopenharmony_ci 214862306a36Sopenharmony_ci # the peer could possibly miss some addr notification, allow retransmission 214962306a36Sopenharmony_ci ip netns exec $ns1 sysctl -q net.mptcp.add_addr_timeout=1 215062306a36Sopenharmony_ci speed=slow \ 215162306a36Sopenharmony_ci run_tests $ns1 $ns2 10.0.1.1 215262306a36Sopenharmony_ci 215362306a36Sopenharmony_ci # It is not directly linked to the commit introducing this 215462306a36Sopenharmony_ci # symbol but for the parent one which is linked anyway. 215562306a36Sopenharmony_ci if ! mptcp_lib_kallsyms_has "mptcp_pm_subflow_check_next$"; then 215662306a36Sopenharmony_ci chk_join_nr 3 3 2 215762306a36Sopenharmony_ci chk_add_nr 4 4 215862306a36Sopenharmony_ci else 215962306a36Sopenharmony_ci chk_join_nr 3 3 3 216062306a36Sopenharmony_ci # the server will not signal the address terminating 216162306a36Sopenharmony_ci # the MPC subflow 216262306a36Sopenharmony_ci chk_add_nr 3 3 216362306a36Sopenharmony_ci fi 216462306a36Sopenharmony_ci fi 216562306a36Sopenharmony_ci} 216662306a36Sopenharmony_ci 216762306a36Sopenharmony_cilink_failure_tests() 216862306a36Sopenharmony_ci{ 216962306a36Sopenharmony_ci # accept and use add_addr with additional subflows and link loss 217062306a36Sopenharmony_ci if reset "multiple flows, signal, link failure"; then 217162306a36Sopenharmony_ci # without any b/w limit each veth could spool the packets and get 217262306a36Sopenharmony_ci # them acked at xmit time, so that the corresponding subflow will 217362306a36Sopenharmony_ci # have almost always no outstanding pkts, the scheduler will pick 217462306a36Sopenharmony_ci # always the first subflow and we will have hard time testing 217562306a36Sopenharmony_ci # active backup and link switch-over. 217662306a36Sopenharmony_ci # Let's set some arbitrary (low) virtual link limits. 217762306a36Sopenharmony_ci init_shapers 217862306a36Sopenharmony_ci pm_nl_set_limits $ns1 0 3 217962306a36Sopenharmony_ci pm_nl_add_endpoint $ns1 10.0.2.1 dev ns1eth2 flags signal 218062306a36Sopenharmony_ci pm_nl_set_limits $ns2 1 3 218162306a36Sopenharmony_ci pm_nl_add_endpoint $ns2 10.0.3.2 dev ns2eth3 flags subflow 218262306a36Sopenharmony_ci pm_nl_add_endpoint $ns2 10.0.4.2 dev ns2eth4 flags subflow 218362306a36Sopenharmony_ci test_linkfail=1 \ 218462306a36Sopenharmony_ci run_tests $ns1 $ns2 10.0.1.1 218562306a36Sopenharmony_ci chk_join_nr 3 3 3 218662306a36Sopenharmony_ci chk_add_nr 1 1 218762306a36Sopenharmony_ci chk_stale_nr $ns2 1 5 1 218862306a36Sopenharmony_ci fi 218962306a36Sopenharmony_ci 219062306a36Sopenharmony_ci # accept and use add_addr with additional subflows and link loss 219162306a36Sopenharmony_ci # for bidirectional transfer 219262306a36Sopenharmony_ci if reset "multi flows, signal, bidi, link fail"; then 219362306a36Sopenharmony_ci init_shapers 219462306a36Sopenharmony_ci pm_nl_set_limits $ns1 0 3 219562306a36Sopenharmony_ci pm_nl_add_endpoint $ns1 10.0.2.1 dev ns1eth2 flags signal 219662306a36Sopenharmony_ci pm_nl_set_limits $ns2 1 3 219762306a36Sopenharmony_ci pm_nl_add_endpoint $ns2 10.0.3.2 dev ns2eth3 flags subflow 219862306a36Sopenharmony_ci pm_nl_add_endpoint $ns2 10.0.4.2 dev ns2eth4 flags subflow 219962306a36Sopenharmony_ci test_linkfail=2 \ 220062306a36Sopenharmony_ci run_tests $ns1 $ns2 10.0.1.1 220162306a36Sopenharmony_ci chk_join_nr 3 3 3 220262306a36Sopenharmony_ci chk_add_nr 1 1 220362306a36Sopenharmony_ci chk_stale_nr $ns2 1 -1 1 220462306a36Sopenharmony_ci fi 220562306a36Sopenharmony_ci 220662306a36Sopenharmony_ci # 2 subflows plus 1 backup subflow with a lossy link, backup 220762306a36Sopenharmony_ci # will never be used 220862306a36Sopenharmony_ci if reset "backup subflow unused, link failure"; then 220962306a36Sopenharmony_ci init_shapers 221062306a36Sopenharmony_ci pm_nl_set_limits $ns1 0 2 221162306a36Sopenharmony_ci pm_nl_add_endpoint $ns1 10.0.2.1 dev ns1eth2 flags signal 221262306a36Sopenharmony_ci pm_nl_set_limits $ns2 1 2 221362306a36Sopenharmony_ci pm_nl_add_endpoint $ns2 10.0.3.2 dev ns2eth3 flags subflow,backup 221462306a36Sopenharmony_ci FAILING_LINKS="1" test_linkfail=1 \ 221562306a36Sopenharmony_ci run_tests $ns1 $ns2 10.0.1.1 221662306a36Sopenharmony_ci chk_join_nr 2 2 2 221762306a36Sopenharmony_ci chk_add_nr 1 1 221862306a36Sopenharmony_ci chk_link_usage $ns2 ns2eth3 $cinsent 0 221962306a36Sopenharmony_ci fi 222062306a36Sopenharmony_ci 222162306a36Sopenharmony_ci # 2 lossy links after half transfer, backup will get half of 222262306a36Sopenharmony_ci # the traffic 222362306a36Sopenharmony_ci if reset "backup flow used, multi links fail"; then 222462306a36Sopenharmony_ci init_shapers 222562306a36Sopenharmony_ci pm_nl_set_limits $ns1 0 2 222662306a36Sopenharmony_ci pm_nl_add_endpoint $ns1 10.0.2.1 dev ns1eth2 flags signal 222762306a36Sopenharmony_ci pm_nl_set_limits $ns2 1 2 222862306a36Sopenharmony_ci pm_nl_add_endpoint $ns2 10.0.3.2 dev ns2eth3 flags subflow,backup 222962306a36Sopenharmony_ci FAILING_LINKS="1 2" test_linkfail=1 \ 223062306a36Sopenharmony_ci run_tests $ns1 $ns2 10.0.1.1 223162306a36Sopenharmony_ci chk_join_nr 2 2 2 223262306a36Sopenharmony_ci chk_add_nr 1 1 223362306a36Sopenharmony_ci chk_stale_nr $ns2 2 4 2 223462306a36Sopenharmony_ci chk_link_usage $ns2 ns2eth3 $cinsent 50 223562306a36Sopenharmony_ci fi 223662306a36Sopenharmony_ci 223762306a36Sopenharmony_ci # use a backup subflow with the first subflow on a lossy link 223862306a36Sopenharmony_ci # for bidirectional transfer 223962306a36Sopenharmony_ci if reset "backup flow used, bidi, link failure"; then 224062306a36Sopenharmony_ci init_shapers 224162306a36Sopenharmony_ci pm_nl_set_limits $ns1 0 2 224262306a36Sopenharmony_ci pm_nl_add_endpoint $ns1 10.0.2.1 dev ns1eth2 flags signal 224362306a36Sopenharmony_ci pm_nl_set_limits $ns2 1 3 224462306a36Sopenharmony_ci pm_nl_add_endpoint $ns2 10.0.3.2 dev ns2eth3 flags subflow,backup 224562306a36Sopenharmony_ci FAILING_LINKS="1 2" test_linkfail=2 \ 224662306a36Sopenharmony_ci run_tests $ns1 $ns2 10.0.1.1 224762306a36Sopenharmony_ci chk_join_nr 2 2 2 224862306a36Sopenharmony_ci chk_add_nr 1 1 224962306a36Sopenharmony_ci chk_stale_nr $ns2 1 -1 2 225062306a36Sopenharmony_ci chk_link_usage $ns2 ns2eth3 $cinsent 50 225162306a36Sopenharmony_ci fi 225262306a36Sopenharmony_ci} 225362306a36Sopenharmony_ci 225462306a36Sopenharmony_ciadd_addr_timeout_tests() 225562306a36Sopenharmony_ci{ 225662306a36Sopenharmony_ci # add_addr timeout 225762306a36Sopenharmony_ci if reset_with_add_addr_timeout "signal address, ADD_ADDR timeout"; then 225862306a36Sopenharmony_ci pm_nl_set_limits $ns1 0 1 225962306a36Sopenharmony_ci pm_nl_set_limits $ns2 1 1 226062306a36Sopenharmony_ci pm_nl_add_endpoint $ns1 10.0.2.1 flags signal 226162306a36Sopenharmony_ci speed=slow \ 226262306a36Sopenharmony_ci run_tests $ns1 $ns2 10.0.1.1 226362306a36Sopenharmony_ci chk_join_nr 1 1 1 226462306a36Sopenharmony_ci chk_add_tx_nr 4 4 226562306a36Sopenharmony_ci chk_add_nr 4 0 226662306a36Sopenharmony_ci fi 226762306a36Sopenharmony_ci 226862306a36Sopenharmony_ci # add_addr timeout IPv6 226962306a36Sopenharmony_ci if reset_with_add_addr_timeout "signal address, ADD_ADDR6 timeout" 6; then 227062306a36Sopenharmony_ci pm_nl_set_limits $ns1 0 1 227162306a36Sopenharmony_ci pm_nl_set_limits $ns2 1 1 227262306a36Sopenharmony_ci pm_nl_add_endpoint $ns1 dead:beef:2::1 flags signal 227362306a36Sopenharmony_ci speed=slow \ 227462306a36Sopenharmony_ci run_tests $ns1 $ns2 dead:beef:1::1 227562306a36Sopenharmony_ci chk_join_nr 1 1 1 227662306a36Sopenharmony_ci chk_add_nr 4 0 227762306a36Sopenharmony_ci fi 227862306a36Sopenharmony_ci 227962306a36Sopenharmony_ci # signal addresses timeout 228062306a36Sopenharmony_ci if reset_with_add_addr_timeout "signal addresses, ADD_ADDR timeout"; then 228162306a36Sopenharmony_ci pm_nl_set_limits $ns1 2 2 228262306a36Sopenharmony_ci pm_nl_add_endpoint $ns1 10.0.2.1 flags signal 228362306a36Sopenharmony_ci pm_nl_add_endpoint $ns1 10.0.3.1 flags signal 228462306a36Sopenharmony_ci pm_nl_set_limits $ns2 2 2 228562306a36Sopenharmony_ci speed=10 \ 228662306a36Sopenharmony_ci run_tests $ns1 $ns2 10.0.1.1 228762306a36Sopenharmony_ci chk_join_nr 2 2 2 228862306a36Sopenharmony_ci chk_add_nr 8 0 228962306a36Sopenharmony_ci fi 229062306a36Sopenharmony_ci 229162306a36Sopenharmony_ci # signal invalid addresses timeout 229262306a36Sopenharmony_ci if reset_with_add_addr_timeout "invalid address, ADD_ADDR timeout"; then 229362306a36Sopenharmony_ci pm_nl_set_limits $ns1 2 2 229462306a36Sopenharmony_ci pm_nl_add_endpoint $ns1 10.0.12.1 flags signal 229562306a36Sopenharmony_ci pm_nl_add_endpoint $ns1 10.0.3.1 flags signal 229662306a36Sopenharmony_ci pm_nl_set_limits $ns2 2 2 229762306a36Sopenharmony_ci speed=10 \ 229862306a36Sopenharmony_ci run_tests $ns1 $ns2 10.0.1.1 229962306a36Sopenharmony_ci chk_join_nr 1 1 1 230062306a36Sopenharmony_ci chk_add_nr 8 0 230162306a36Sopenharmony_ci fi 230262306a36Sopenharmony_ci} 230362306a36Sopenharmony_ci 230462306a36Sopenharmony_ciremove_tests() 230562306a36Sopenharmony_ci{ 230662306a36Sopenharmony_ci # single subflow, remove 230762306a36Sopenharmony_ci if reset "remove single subflow"; then 230862306a36Sopenharmony_ci pm_nl_set_limits $ns1 0 1 230962306a36Sopenharmony_ci pm_nl_set_limits $ns2 0 1 231062306a36Sopenharmony_ci pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow 231162306a36Sopenharmony_ci addr_nr_ns2=-1 speed=slow \ 231262306a36Sopenharmony_ci run_tests $ns1 $ns2 10.0.1.1 231362306a36Sopenharmony_ci chk_join_nr 1 1 1 231462306a36Sopenharmony_ci chk_rm_tx_nr 1 231562306a36Sopenharmony_ci chk_rm_nr 1 1 231662306a36Sopenharmony_ci chk_rst_nr 0 0 231762306a36Sopenharmony_ci fi 231862306a36Sopenharmony_ci 231962306a36Sopenharmony_ci # multiple subflows, remove 232062306a36Sopenharmony_ci if reset "remove multiple subflows"; then 232162306a36Sopenharmony_ci pm_nl_set_limits $ns1 0 2 232262306a36Sopenharmony_ci pm_nl_set_limits $ns2 0 2 232362306a36Sopenharmony_ci pm_nl_add_endpoint $ns2 10.0.2.2 flags subflow 232462306a36Sopenharmony_ci pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow 232562306a36Sopenharmony_ci addr_nr_ns2=-2 speed=slow \ 232662306a36Sopenharmony_ci run_tests $ns1 $ns2 10.0.1.1 232762306a36Sopenharmony_ci chk_join_nr 2 2 2 232862306a36Sopenharmony_ci chk_rm_nr 2 2 232962306a36Sopenharmony_ci chk_rst_nr 0 0 233062306a36Sopenharmony_ci fi 233162306a36Sopenharmony_ci 233262306a36Sopenharmony_ci # single address, remove 233362306a36Sopenharmony_ci if reset "remove single address"; then 233462306a36Sopenharmony_ci pm_nl_set_limits $ns1 0 1 233562306a36Sopenharmony_ci pm_nl_add_endpoint $ns1 10.0.2.1 flags signal 233662306a36Sopenharmony_ci pm_nl_set_limits $ns2 1 1 233762306a36Sopenharmony_ci addr_nr_ns1=-1 speed=slow \ 233862306a36Sopenharmony_ci run_tests $ns1 $ns2 10.0.1.1 233962306a36Sopenharmony_ci chk_join_nr 1 1 1 234062306a36Sopenharmony_ci chk_add_nr 1 1 234162306a36Sopenharmony_ci chk_rm_nr 1 1 invert 234262306a36Sopenharmony_ci chk_rst_nr 0 0 234362306a36Sopenharmony_ci fi 234462306a36Sopenharmony_ci 234562306a36Sopenharmony_ci # subflow and signal, remove 234662306a36Sopenharmony_ci if reset "remove subflow and signal"; then 234762306a36Sopenharmony_ci pm_nl_set_limits $ns1 0 2 234862306a36Sopenharmony_ci pm_nl_add_endpoint $ns1 10.0.2.1 flags signal 234962306a36Sopenharmony_ci pm_nl_set_limits $ns2 1 2 235062306a36Sopenharmony_ci pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow 235162306a36Sopenharmony_ci addr_nr_ns1=-1 addr_nr_ns2=-1 speed=slow \ 235262306a36Sopenharmony_ci run_tests $ns1 $ns2 10.0.1.1 235362306a36Sopenharmony_ci chk_join_nr 2 2 2 235462306a36Sopenharmony_ci chk_add_nr 1 1 235562306a36Sopenharmony_ci chk_rm_nr 1 1 235662306a36Sopenharmony_ci chk_rst_nr 0 0 235762306a36Sopenharmony_ci fi 235862306a36Sopenharmony_ci 235962306a36Sopenharmony_ci # subflows and signal, remove 236062306a36Sopenharmony_ci if reset "remove subflows and signal"; then 236162306a36Sopenharmony_ci pm_nl_set_limits $ns1 0 3 236262306a36Sopenharmony_ci pm_nl_add_endpoint $ns1 10.0.2.1 flags signal 236362306a36Sopenharmony_ci pm_nl_set_limits $ns2 1 3 236462306a36Sopenharmony_ci pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow 236562306a36Sopenharmony_ci pm_nl_add_endpoint $ns2 10.0.4.2 flags subflow 236662306a36Sopenharmony_ci addr_nr_ns1=-1 addr_nr_ns2=-2 speed=10 \ 236762306a36Sopenharmony_ci run_tests $ns1 $ns2 10.0.1.1 236862306a36Sopenharmony_ci chk_join_nr 3 3 3 236962306a36Sopenharmony_ci chk_add_nr 1 1 237062306a36Sopenharmony_ci chk_rm_nr 2 2 237162306a36Sopenharmony_ci chk_rst_nr 0 0 237262306a36Sopenharmony_ci fi 237362306a36Sopenharmony_ci 237462306a36Sopenharmony_ci # addresses remove 237562306a36Sopenharmony_ci if reset "remove addresses"; then 237662306a36Sopenharmony_ci pm_nl_set_limits $ns1 3 3 237762306a36Sopenharmony_ci pm_nl_add_endpoint $ns1 10.0.2.1 flags signal id 250 237862306a36Sopenharmony_ci pm_nl_add_endpoint $ns1 10.0.3.1 flags signal 237962306a36Sopenharmony_ci pm_nl_add_endpoint $ns1 10.0.4.1 flags signal 238062306a36Sopenharmony_ci pm_nl_set_limits $ns2 3 3 238162306a36Sopenharmony_ci addr_nr_ns1=-3 speed=10 \ 238262306a36Sopenharmony_ci run_tests $ns1 $ns2 10.0.1.1 238362306a36Sopenharmony_ci chk_join_nr 3 3 3 238462306a36Sopenharmony_ci chk_add_nr 3 3 238562306a36Sopenharmony_ci chk_rm_nr 3 3 invert 238662306a36Sopenharmony_ci chk_rst_nr 0 0 238762306a36Sopenharmony_ci fi 238862306a36Sopenharmony_ci 238962306a36Sopenharmony_ci # invalid addresses remove 239062306a36Sopenharmony_ci if reset "remove invalid addresses"; then 239162306a36Sopenharmony_ci pm_nl_set_limits $ns1 3 3 239262306a36Sopenharmony_ci pm_nl_add_endpoint $ns1 10.0.12.1 flags signal 239362306a36Sopenharmony_ci pm_nl_add_endpoint $ns1 10.0.3.1 flags signal 239462306a36Sopenharmony_ci pm_nl_add_endpoint $ns1 10.0.14.1 flags signal 239562306a36Sopenharmony_ci pm_nl_set_limits $ns2 3 3 239662306a36Sopenharmony_ci addr_nr_ns1=-3 speed=10 \ 239762306a36Sopenharmony_ci run_tests $ns1 $ns2 10.0.1.1 239862306a36Sopenharmony_ci chk_join_nr 1 1 1 239962306a36Sopenharmony_ci chk_add_nr 3 3 240062306a36Sopenharmony_ci chk_rm_nr 3 1 invert 240162306a36Sopenharmony_ci chk_rst_nr 0 0 240262306a36Sopenharmony_ci fi 240362306a36Sopenharmony_ci 240462306a36Sopenharmony_ci # subflows and signal, flush 240562306a36Sopenharmony_ci if reset "flush subflows and signal"; then 240662306a36Sopenharmony_ci pm_nl_set_limits $ns1 0 3 240762306a36Sopenharmony_ci pm_nl_add_endpoint $ns1 10.0.2.1 flags signal 240862306a36Sopenharmony_ci pm_nl_set_limits $ns2 1 3 240962306a36Sopenharmony_ci pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow 241062306a36Sopenharmony_ci pm_nl_add_endpoint $ns2 10.0.4.2 flags subflow 241162306a36Sopenharmony_ci addr_nr_ns1=-8 addr_nr_ns2=-8 speed=slow \ 241262306a36Sopenharmony_ci run_tests $ns1 $ns2 10.0.1.1 241362306a36Sopenharmony_ci chk_join_nr 3 3 3 241462306a36Sopenharmony_ci chk_add_nr 1 1 241562306a36Sopenharmony_ci chk_rm_nr 1 3 invert simult 241662306a36Sopenharmony_ci chk_rst_nr 0 0 241762306a36Sopenharmony_ci fi 241862306a36Sopenharmony_ci 241962306a36Sopenharmony_ci # subflows flush 242062306a36Sopenharmony_ci if reset "flush subflows"; then 242162306a36Sopenharmony_ci pm_nl_set_limits $ns1 3 3 242262306a36Sopenharmony_ci pm_nl_set_limits $ns2 3 3 242362306a36Sopenharmony_ci pm_nl_add_endpoint $ns2 10.0.2.2 flags subflow id 150 242462306a36Sopenharmony_ci pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow 242562306a36Sopenharmony_ci pm_nl_add_endpoint $ns2 10.0.4.2 flags subflow 242662306a36Sopenharmony_ci addr_nr_ns1=-8 addr_nr_ns2=-8 speed=slow \ 242762306a36Sopenharmony_ci run_tests $ns1 $ns2 10.0.1.1 242862306a36Sopenharmony_ci chk_join_nr 3 3 3 242962306a36Sopenharmony_ci 243062306a36Sopenharmony_ci if mptcp_lib_kversion_ge 5.18; then 243162306a36Sopenharmony_ci chk_rm_tx_nr 0 243262306a36Sopenharmony_ci chk_rm_nr 0 3 simult 243362306a36Sopenharmony_ci else 243462306a36Sopenharmony_ci chk_rm_nr 3 3 243562306a36Sopenharmony_ci fi 243662306a36Sopenharmony_ci chk_rst_nr 0 0 243762306a36Sopenharmony_ci fi 243862306a36Sopenharmony_ci 243962306a36Sopenharmony_ci # addresses flush 244062306a36Sopenharmony_ci if reset "flush addresses"; then 244162306a36Sopenharmony_ci pm_nl_set_limits $ns1 3 3 244262306a36Sopenharmony_ci pm_nl_add_endpoint $ns1 10.0.2.1 flags signal id 250 244362306a36Sopenharmony_ci pm_nl_add_endpoint $ns1 10.0.3.1 flags signal 244462306a36Sopenharmony_ci pm_nl_add_endpoint $ns1 10.0.4.1 flags signal 244562306a36Sopenharmony_ci pm_nl_set_limits $ns2 3 3 244662306a36Sopenharmony_ci addr_nr_ns1=-8 addr_nr_ns2=-8 speed=slow \ 244762306a36Sopenharmony_ci run_tests $ns1 $ns2 10.0.1.1 244862306a36Sopenharmony_ci chk_join_nr 3 3 3 244962306a36Sopenharmony_ci chk_add_nr 3 3 245062306a36Sopenharmony_ci chk_rm_nr 3 3 invert simult 245162306a36Sopenharmony_ci chk_rst_nr 0 0 245262306a36Sopenharmony_ci fi 245362306a36Sopenharmony_ci 245462306a36Sopenharmony_ci # invalid addresses flush 245562306a36Sopenharmony_ci if reset "flush invalid addresses"; then 245662306a36Sopenharmony_ci pm_nl_set_limits $ns1 3 3 245762306a36Sopenharmony_ci pm_nl_add_endpoint $ns1 10.0.12.1 flags signal 245862306a36Sopenharmony_ci pm_nl_add_endpoint $ns1 10.0.3.1 flags signal 245962306a36Sopenharmony_ci pm_nl_add_endpoint $ns1 10.0.14.1 flags signal 246062306a36Sopenharmony_ci pm_nl_set_limits $ns2 3 3 246162306a36Sopenharmony_ci addr_nr_ns1=-8 speed=slow \ 246262306a36Sopenharmony_ci run_tests $ns1 $ns2 10.0.1.1 246362306a36Sopenharmony_ci chk_join_nr 1 1 1 246462306a36Sopenharmony_ci chk_add_nr 3 3 246562306a36Sopenharmony_ci chk_rm_nr 3 1 invert 246662306a36Sopenharmony_ci chk_rst_nr 0 0 246762306a36Sopenharmony_ci fi 246862306a36Sopenharmony_ci 246962306a36Sopenharmony_ci # remove id 0 subflow 247062306a36Sopenharmony_ci if reset "remove id 0 subflow"; then 247162306a36Sopenharmony_ci pm_nl_set_limits $ns1 0 1 247262306a36Sopenharmony_ci pm_nl_set_limits $ns2 0 1 247362306a36Sopenharmony_ci pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow 247462306a36Sopenharmony_ci addr_nr_ns2=-9 speed=slow \ 247562306a36Sopenharmony_ci run_tests $ns1 $ns2 10.0.1.1 247662306a36Sopenharmony_ci chk_join_nr 1 1 1 247762306a36Sopenharmony_ci chk_rm_nr 1 1 247862306a36Sopenharmony_ci chk_rst_nr 0 0 247962306a36Sopenharmony_ci fi 248062306a36Sopenharmony_ci 248162306a36Sopenharmony_ci # remove id 0 address 248262306a36Sopenharmony_ci if reset "remove id 0 address"; then 248362306a36Sopenharmony_ci pm_nl_set_limits $ns1 0 1 248462306a36Sopenharmony_ci pm_nl_add_endpoint $ns1 10.0.2.1 flags signal 248562306a36Sopenharmony_ci pm_nl_set_limits $ns2 1 1 248662306a36Sopenharmony_ci addr_nr_ns1=-9 speed=slow \ 248762306a36Sopenharmony_ci run_tests $ns1 $ns2 10.0.1.1 248862306a36Sopenharmony_ci chk_join_nr 1 1 1 248962306a36Sopenharmony_ci chk_add_nr 1 1 249062306a36Sopenharmony_ci chk_rm_nr 1 1 invert 249162306a36Sopenharmony_ci chk_rst_nr 0 0 invert 249262306a36Sopenharmony_ci fi 249362306a36Sopenharmony_ci} 249462306a36Sopenharmony_ci 249562306a36Sopenharmony_ciadd_tests() 249662306a36Sopenharmony_ci{ 249762306a36Sopenharmony_ci # add single subflow 249862306a36Sopenharmony_ci if reset "add single subflow"; then 249962306a36Sopenharmony_ci pm_nl_set_limits $ns1 0 1 250062306a36Sopenharmony_ci pm_nl_set_limits $ns2 0 1 250162306a36Sopenharmony_ci addr_nr_ns2=1 speed=slow \ 250262306a36Sopenharmony_ci run_tests $ns1 $ns2 10.0.1.1 250362306a36Sopenharmony_ci chk_join_nr 1 1 1 250462306a36Sopenharmony_ci fi 250562306a36Sopenharmony_ci 250662306a36Sopenharmony_ci # add signal address 250762306a36Sopenharmony_ci if reset "add signal address"; then 250862306a36Sopenharmony_ci pm_nl_set_limits $ns1 0 1 250962306a36Sopenharmony_ci pm_nl_set_limits $ns2 1 1 251062306a36Sopenharmony_ci addr_nr_ns1=1 speed=slow \ 251162306a36Sopenharmony_ci run_tests $ns1 $ns2 10.0.1.1 251262306a36Sopenharmony_ci chk_join_nr 1 1 1 251362306a36Sopenharmony_ci chk_add_nr 1 1 251462306a36Sopenharmony_ci fi 251562306a36Sopenharmony_ci 251662306a36Sopenharmony_ci # add multiple subflows 251762306a36Sopenharmony_ci if reset "add multiple subflows"; then 251862306a36Sopenharmony_ci pm_nl_set_limits $ns1 0 2 251962306a36Sopenharmony_ci pm_nl_set_limits $ns2 0 2 252062306a36Sopenharmony_ci addr_nr_ns2=2 speed=slow \ 252162306a36Sopenharmony_ci run_tests $ns1 $ns2 10.0.1.1 252262306a36Sopenharmony_ci chk_join_nr 2 2 2 252362306a36Sopenharmony_ci fi 252462306a36Sopenharmony_ci 252562306a36Sopenharmony_ci # add multiple subflows IPv6 252662306a36Sopenharmony_ci if reset "add multiple subflows IPv6"; then 252762306a36Sopenharmony_ci pm_nl_set_limits $ns1 0 2 252862306a36Sopenharmony_ci pm_nl_set_limits $ns2 0 2 252962306a36Sopenharmony_ci addr_nr_ns2=2 speed=slow \ 253062306a36Sopenharmony_ci run_tests $ns1 $ns2 dead:beef:1::1 253162306a36Sopenharmony_ci chk_join_nr 2 2 2 253262306a36Sopenharmony_ci fi 253362306a36Sopenharmony_ci 253462306a36Sopenharmony_ci # add multiple addresses IPv6 253562306a36Sopenharmony_ci if reset "add multiple addresses IPv6"; then 253662306a36Sopenharmony_ci pm_nl_set_limits $ns1 0 2 253762306a36Sopenharmony_ci pm_nl_set_limits $ns2 2 2 253862306a36Sopenharmony_ci addr_nr_ns1=2 speed=slow \ 253962306a36Sopenharmony_ci run_tests $ns1 $ns2 dead:beef:1::1 254062306a36Sopenharmony_ci chk_join_nr 2 2 2 254162306a36Sopenharmony_ci chk_add_nr 2 2 254262306a36Sopenharmony_ci fi 254362306a36Sopenharmony_ci} 254462306a36Sopenharmony_ci 254562306a36Sopenharmony_ciipv6_tests() 254662306a36Sopenharmony_ci{ 254762306a36Sopenharmony_ci # subflow IPv6 254862306a36Sopenharmony_ci if reset "single subflow IPv6"; then 254962306a36Sopenharmony_ci pm_nl_set_limits $ns1 0 1 255062306a36Sopenharmony_ci pm_nl_set_limits $ns2 0 1 255162306a36Sopenharmony_ci pm_nl_add_endpoint $ns2 dead:beef:3::2 dev ns2eth3 flags subflow 255262306a36Sopenharmony_ci speed=slow \ 255362306a36Sopenharmony_ci run_tests $ns1 $ns2 dead:beef:1::1 255462306a36Sopenharmony_ci chk_join_nr 1 1 1 255562306a36Sopenharmony_ci fi 255662306a36Sopenharmony_ci 255762306a36Sopenharmony_ci # add_address, unused IPv6 255862306a36Sopenharmony_ci if reset "unused signal address IPv6"; then 255962306a36Sopenharmony_ci pm_nl_add_endpoint $ns1 dead:beef:2::1 flags signal 256062306a36Sopenharmony_ci speed=slow \ 256162306a36Sopenharmony_ci run_tests $ns1 $ns2 dead:beef:1::1 256262306a36Sopenharmony_ci chk_join_nr 0 0 0 256362306a36Sopenharmony_ci chk_add_nr 1 1 256462306a36Sopenharmony_ci fi 256562306a36Sopenharmony_ci 256662306a36Sopenharmony_ci # signal address IPv6 256762306a36Sopenharmony_ci if reset "single address IPv6"; then 256862306a36Sopenharmony_ci pm_nl_set_limits $ns1 0 1 256962306a36Sopenharmony_ci pm_nl_add_endpoint $ns1 dead:beef:2::1 flags signal 257062306a36Sopenharmony_ci pm_nl_set_limits $ns2 1 1 257162306a36Sopenharmony_ci speed=slow \ 257262306a36Sopenharmony_ci run_tests $ns1 $ns2 dead:beef:1::1 257362306a36Sopenharmony_ci chk_join_nr 1 1 1 257462306a36Sopenharmony_ci chk_add_nr 1 1 257562306a36Sopenharmony_ci fi 257662306a36Sopenharmony_ci 257762306a36Sopenharmony_ci # single address IPv6, remove 257862306a36Sopenharmony_ci if reset "remove single address IPv6"; then 257962306a36Sopenharmony_ci pm_nl_set_limits $ns1 0 1 258062306a36Sopenharmony_ci pm_nl_add_endpoint $ns1 dead:beef:2::1 flags signal 258162306a36Sopenharmony_ci pm_nl_set_limits $ns2 1 1 258262306a36Sopenharmony_ci addr_nr_ns1=-1 speed=slow \ 258362306a36Sopenharmony_ci run_tests $ns1 $ns2 dead:beef:1::1 258462306a36Sopenharmony_ci chk_join_nr 1 1 1 258562306a36Sopenharmony_ci chk_add_nr 1 1 258662306a36Sopenharmony_ci chk_rm_nr 1 1 invert 258762306a36Sopenharmony_ci fi 258862306a36Sopenharmony_ci 258962306a36Sopenharmony_ci # subflow and signal IPv6, remove 259062306a36Sopenharmony_ci if reset "remove subflow and signal IPv6"; then 259162306a36Sopenharmony_ci pm_nl_set_limits $ns1 0 2 259262306a36Sopenharmony_ci pm_nl_add_endpoint $ns1 dead:beef:2::1 flags signal 259362306a36Sopenharmony_ci pm_nl_set_limits $ns2 1 2 259462306a36Sopenharmony_ci pm_nl_add_endpoint $ns2 dead:beef:3::2 dev ns2eth3 flags subflow 259562306a36Sopenharmony_ci addr_nr_ns1=-1 addr_nr_ns2=-1 speed=slow \ 259662306a36Sopenharmony_ci run_tests $ns1 $ns2 dead:beef:1::1 259762306a36Sopenharmony_ci chk_join_nr 2 2 2 259862306a36Sopenharmony_ci chk_add_nr 1 1 259962306a36Sopenharmony_ci chk_rm_nr 1 1 260062306a36Sopenharmony_ci fi 260162306a36Sopenharmony_ci} 260262306a36Sopenharmony_ci 260362306a36Sopenharmony_civ4mapped_tests() 260462306a36Sopenharmony_ci{ 260562306a36Sopenharmony_ci # subflow IPv4-mapped to IPv4-mapped 260662306a36Sopenharmony_ci if reset "single subflow IPv4-mapped"; then 260762306a36Sopenharmony_ci pm_nl_set_limits $ns1 0 1 260862306a36Sopenharmony_ci pm_nl_set_limits $ns2 0 1 260962306a36Sopenharmony_ci pm_nl_add_endpoint $ns2 "::ffff:10.0.3.2" flags subflow 261062306a36Sopenharmony_ci run_tests $ns1 $ns2 "::ffff:10.0.1.1" 261162306a36Sopenharmony_ci chk_join_nr 1 1 1 261262306a36Sopenharmony_ci fi 261362306a36Sopenharmony_ci 261462306a36Sopenharmony_ci # signal address IPv4-mapped with IPv4-mapped sk 261562306a36Sopenharmony_ci if reset "signal address IPv4-mapped"; then 261662306a36Sopenharmony_ci pm_nl_set_limits $ns1 0 1 261762306a36Sopenharmony_ci pm_nl_set_limits $ns2 1 1 261862306a36Sopenharmony_ci pm_nl_add_endpoint $ns1 "::ffff:10.0.2.1" flags signal 261962306a36Sopenharmony_ci run_tests $ns1 $ns2 "::ffff:10.0.1.1" 262062306a36Sopenharmony_ci chk_join_nr 1 1 1 262162306a36Sopenharmony_ci chk_add_nr 1 1 262262306a36Sopenharmony_ci fi 262362306a36Sopenharmony_ci 262462306a36Sopenharmony_ci # subflow v4-map-v6 262562306a36Sopenharmony_ci if reset "single subflow v4-map-v6"; then 262662306a36Sopenharmony_ci pm_nl_set_limits $ns1 0 1 262762306a36Sopenharmony_ci pm_nl_set_limits $ns2 0 1 262862306a36Sopenharmony_ci pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow 262962306a36Sopenharmony_ci run_tests $ns1 $ns2 "::ffff:10.0.1.1" 263062306a36Sopenharmony_ci chk_join_nr 1 1 1 263162306a36Sopenharmony_ci fi 263262306a36Sopenharmony_ci 263362306a36Sopenharmony_ci # signal address v4-map-v6 263462306a36Sopenharmony_ci if reset "signal address v4-map-v6"; then 263562306a36Sopenharmony_ci pm_nl_set_limits $ns1 0 1 263662306a36Sopenharmony_ci pm_nl_set_limits $ns2 1 1 263762306a36Sopenharmony_ci pm_nl_add_endpoint $ns1 10.0.2.1 flags signal 263862306a36Sopenharmony_ci run_tests $ns1 $ns2 "::ffff:10.0.1.1" 263962306a36Sopenharmony_ci chk_join_nr 1 1 1 264062306a36Sopenharmony_ci chk_add_nr 1 1 264162306a36Sopenharmony_ci fi 264262306a36Sopenharmony_ci 264362306a36Sopenharmony_ci # subflow v6-map-v4 264462306a36Sopenharmony_ci if reset "single subflow v6-map-v4"; then 264562306a36Sopenharmony_ci pm_nl_set_limits $ns1 0 1 264662306a36Sopenharmony_ci pm_nl_set_limits $ns2 0 1 264762306a36Sopenharmony_ci pm_nl_add_endpoint $ns2 "::ffff:10.0.3.2" flags subflow 264862306a36Sopenharmony_ci run_tests $ns1 $ns2 10.0.1.1 264962306a36Sopenharmony_ci chk_join_nr 1 1 1 265062306a36Sopenharmony_ci fi 265162306a36Sopenharmony_ci 265262306a36Sopenharmony_ci # signal address v6-map-v4 265362306a36Sopenharmony_ci if reset "signal address v6-map-v4"; then 265462306a36Sopenharmony_ci pm_nl_set_limits $ns1 0 1 265562306a36Sopenharmony_ci pm_nl_set_limits $ns2 1 1 265662306a36Sopenharmony_ci pm_nl_add_endpoint $ns1 "::ffff:10.0.2.1" flags signal 265762306a36Sopenharmony_ci run_tests $ns1 $ns2 10.0.1.1 265862306a36Sopenharmony_ci chk_join_nr 1 1 1 265962306a36Sopenharmony_ci chk_add_nr 1 1 266062306a36Sopenharmony_ci fi 266162306a36Sopenharmony_ci 266262306a36Sopenharmony_ci # no subflow IPv6 to v4 address 266362306a36Sopenharmony_ci if reset "no JOIN with diff families v4-v6"; then 266462306a36Sopenharmony_ci pm_nl_set_limits $ns1 0 1 266562306a36Sopenharmony_ci pm_nl_set_limits $ns2 0 1 266662306a36Sopenharmony_ci pm_nl_add_endpoint $ns2 dead:beef:2::2 flags subflow 266762306a36Sopenharmony_ci run_tests $ns1 $ns2 10.0.1.1 266862306a36Sopenharmony_ci chk_join_nr 0 0 0 266962306a36Sopenharmony_ci fi 267062306a36Sopenharmony_ci 267162306a36Sopenharmony_ci # no subflow IPv6 to v4 address even if v6 has a valid v4 at the end 267262306a36Sopenharmony_ci if reset "no JOIN with diff families v4-v6-2"; then 267362306a36Sopenharmony_ci pm_nl_set_limits $ns1 0 1 267462306a36Sopenharmony_ci pm_nl_set_limits $ns2 0 1 267562306a36Sopenharmony_ci pm_nl_add_endpoint $ns2 dead:beef:2::10.0.3.2 flags subflow 267662306a36Sopenharmony_ci run_tests $ns1 $ns2 10.0.1.1 267762306a36Sopenharmony_ci chk_join_nr 0 0 0 267862306a36Sopenharmony_ci fi 267962306a36Sopenharmony_ci 268062306a36Sopenharmony_ci # no subflow IPv4 to v6 address, no need to slow down too then 268162306a36Sopenharmony_ci if reset "no JOIN with diff families v6-v4"; then 268262306a36Sopenharmony_ci pm_nl_set_limits $ns1 0 1 268362306a36Sopenharmony_ci pm_nl_set_limits $ns2 0 1 268462306a36Sopenharmony_ci pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow 268562306a36Sopenharmony_ci run_tests $ns1 $ns2 dead:beef:1::1 268662306a36Sopenharmony_ci chk_join_nr 0 0 0 268762306a36Sopenharmony_ci fi 268862306a36Sopenharmony_ci} 268962306a36Sopenharmony_ci 269062306a36Sopenharmony_cimixed_tests() 269162306a36Sopenharmony_ci{ 269262306a36Sopenharmony_ci if reset "IPv4 sockets do not use IPv6 addresses" && 269362306a36Sopenharmony_ci continue_if mptcp_lib_kversion_ge 6.3; then 269462306a36Sopenharmony_ci pm_nl_set_limits $ns1 0 1 269562306a36Sopenharmony_ci pm_nl_set_limits $ns2 1 1 269662306a36Sopenharmony_ci pm_nl_add_endpoint $ns1 dead:beef:2::1 flags signal 269762306a36Sopenharmony_ci speed=slow \ 269862306a36Sopenharmony_ci run_tests $ns1 $ns2 10.0.1.1 269962306a36Sopenharmony_ci chk_join_nr 0 0 0 270062306a36Sopenharmony_ci fi 270162306a36Sopenharmony_ci 270262306a36Sopenharmony_ci # Need an IPv6 mptcp socket to allow subflows of both families 270362306a36Sopenharmony_ci if reset "simult IPv4 and IPv6 subflows" && 270462306a36Sopenharmony_ci continue_if mptcp_lib_kversion_ge 6.3; then 270562306a36Sopenharmony_ci pm_nl_set_limits $ns1 0 1 270662306a36Sopenharmony_ci pm_nl_set_limits $ns2 1 1 270762306a36Sopenharmony_ci pm_nl_add_endpoint $ns1 10.0.1.1 flags signal 270862306a36Sopenharmony_ci speed=slow \ 270962306a36Sopenharmony_ci run_tests $ns1 $ns2 dead:beef:2::1 271062306a36Sopenharmony_ci chk_join_nr 1 1 1 271162306a36Sopenharmony_ci fi 271262306a36Sopenharmony_ci 271362306a36Sopenharmony_ci # cross families subflows will not be created even in fullmesh mode 271462306a36Sopenharmony_ci if reset "simult IPv4 and IPv6 subflows, fullmesh 1x1" && 271562306a36Sopenharmony_ci continue_if mptcp_lib_kversion_ge 6.3; then 271662306a36Sopenharmony_ci pm_nl_set_limits $ns1 0 4 271762306a36Sopenharmony_ci pm_nl_set_limits $ns2 1 4 271862306a36Sopenharmony_ci pm_nl_add_endpoint $ns2 dead:beef:2::2 flags subflow,fullmesh 271962306a36Sopenharmony_ci pm_nl_add_endpoint $ns1 10.0.1.1 flags signal 272062306a36Sopenharmony_ci speed=slow \ 272162306a36Sopenharmony_ci run_tests $ns1 $ns2 dead:beef:2::1 272262306a36Sopenharmony_ci chk_join_nr 1 1 1 272362306a36Sopenharmony_ci fi 272462306a36Sopenharmony_ci 272562306a36Sopenharmony_ci # fullmesh still tries to create all the possibly subflows with 272662306a36Sopenharmony_ci # matching family 272762306a36Sopenharmony_ci if reset "simult IPv4 and IPv6 subflows, fullmesh 2x2" && 272862306a36Sopenharmony_ci continue_if mptcp_lib_kversion_ge 6.3; then 272962306a36Sopenharmony_ci pm_nl_set_limits $ns1 0 4 273062306a36Sopenharmony_ci pm_nl_set_limits $ns2 2 4 273162306a36Sopenharmony_ci pm_nl_add_endpoint $ns1 10.0.2.1 flags signal 273262306a36Sopenharmony_ci pm_nl_add_endpoint $ns1 dead:beef:2::1 flags signal 273362306a36Sopenharmony_ci fullmesh=1 speed=slow \ 273462306a36Sopenharmony_ci run_tests $ns1 $ns2 dead:beef:1::1 273562306a36Sopenharmony_ci chk_join_nr 4 4 4 273662306a36Sopenharmony_ci fi 273762306a36Sopenharmony_ci} 273862306a36Sopenharmony_ci 273962306a36Sopenharmony_cibackup_tests() 274062306a36Sopenharmony_ci{ 274162306a36Sopenharmony_ci # single subflow, backup 274262306a36Sopenharmony_ci if reset "single subflow, backup" && 274362306a36Sopenharmony_ci continue_if mptcp_lib_kallsyms_has "subflow_rebuild_header$"; then 274462306a36Sopenharmony_ci pm_nl_set_limits $ns1 0 1 274562306a36Sopenharmony_ci pm_nl_set_limits $ns2 0 1 274662306a36Sopenharmony_ci pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow,backup 274762306a36Sopenharmony_ci sflags=nobackup speed=slow \ 274862306a36Sopenharmony_ci run_tests $ns1 $ns2 10.0.1.1 274962306a36Sopenharmony_ci chk_join_nr 1 1 1 275062306a36Sopenharmony_ci chk_prio_nr 0 1 275162306a36Sopenharmony_ci fi 275262306a36Sopenharmony_ci 275362306a36Sopenharmony_ci # single address, backup 275462306a36Sopenharmony_ci if reset "single address, backup" && 275562306a36Sopenharmony_ci continue_if mptcp_lib_kallsyms_has "subflow_rebuild_header$"; then 275662306a36Sopenharmony_ci pm_nl_set_limits $ns1 0 1 275762306a36Sopenharmony_ci pm_nl_add_endpoint $ns1 10.0.2.1 flags signal 275862306a36Sopenharmony_ci pm_nl_set_limits $ns2 1 1 275962306a36Sopenharmony_ci sflags=backup speed=slow \ 276062306a36Sopenharmony_ci run_tests $ns1 $ns2 10.0.1.1 276162306a36Sopenharmony_ci chk_join_nr 1 1 1 276262306a36Sopenharmony_ci chk_add_nr 1 1 276362306a36Sopenharmony_ci chk_prio_nr 1 1 276462306a36Sopenharmony_ci fi 276562306a36Sopenharmony_ci 276662306a36Sopenharmony_ci # single address with port, backup 276762306a36Sopenharmony_ci if reset "single address with port, backup" && 276862306a36Sopenharmony_ci continue_if mptcp_lib_kallsyms_has "subflow_rebuild_header$"; then 276962306a36Sopenharmony_ci pm_nl_set_limits $ns1 0 1 277062306a36Sopenharmony_ci pm_nl_add_endpoint $ns1 10.0.2.1 flags signal port 10100 277162306a36Sopenharmony_ci pm_nl_set_limits $ns2 1 1 277262306a36Sopenharmony_ci sflags=backup speed=slow \ 277362306a36Sopenharmony_ci run_tests $ns1 $ns2 10.0.1.1 277462306a36Sopenharmony_ci chk_join_nr 1 1 1 277562306a36Sopenharmony_ci chk_add_nr 1 1 277662306a36Sopenharmony_ci chk_prio_nr 1 1 277762306a36Sopenharmony_ci fi 277862306a36Sopenharmony_ci 277962306a36Sopenharmony_ci if reset "mpc backup" && 278062306a36Sopenharmony_ci continue_if mptcp_lib_kallsyms_doesnt_have "T mptcp_subflow_send_ack$"; then 278162306a36Sopenharmony_ci pm_nl_add_endpoint $ns2 10.0.1.2 flags subflow,backup 278262306a36Sopenharmony_ci speed=slow \ 278362306a36Sopenharmony_ci run_tests $ns1 $ns2 10.0.1.1 278462306a36Sopenharmony_ci chk_join_nr 0 0 0 278562306a36Sopenharmony_ci chk_prio_nr 0 1 278662306a36Sopenharmony_ci fi 278762306a36Sopenharmony_ci 278862306a36Sopenharmony_ci if reset "mpc backup both sides" && 278962306a36Sopenharmony_ci continue_if mptcp_lib_kallsyms_doesnt_have "T mptcp_subflow_send_ack$"; then 279062306a36Sopenharmony_ci pm_nl_add_endpoint $ns1 10.0.1.1 flags subflow,backup 279162306a36Sopenharmony_ci pm_nl_add_endpoint $ns2 10.0.1.2 flags subflow,backup 279262306a36Sopenharmony_ci speed=slow \ 279362306a36Sopenharmony_ci run_tests $ns1 $ns2 10.0.1.1 279462306a36Sopenharmony_ci chk_join_nr 0 0 0 279562306a36Sopenharmony_ci chk_prio_nr 1 1 279662306a36Sopenharmony_ci fi 279762306a36Sopenharmony_ci 279862306a36Sopenharmony_ci if reset "mpc switch to backup" && 279962306a36Sopenharmony_ci continue_if mptcp_lib_kallsyms_doesnt_have "T mptcp_subflow_send_ack$"; then 280062306a36Sopenharmony_ci pm_nl_add_endpoint $ns2 10.0.1.2 flags subflow 280162306a36Sopenharmony_ci sflags=backup speed=slow \ 280262306a36Sopenharmony_ci run_tests $ns1 $ns2 10.0.1.1 280362306a36Sopenharmony_ci chk_join_nr 0 0 0 280462306a36Sopenharmony_ci chk_prio_nr 0 1 280562306a36Sopenharmony_ci fi 280662306a36Sopenharmony_ci 280762306a36Sopenharmony_ci if reset "mpc switch to backup both sides" && 280862306a36Sopenharmony_ci continue_if mptcp_lib_kallsyms_doesnt_have "T mptcp_subflow_send_ack$"; then 280962306a36Sopenharmony_ci pm_nl_add_endpoint $ns1 10.0.1.1 flags subflow 281062306a36Sopenharmony_ci pm_nl_add_endpoint $ns2 10.0.1.2 flags subflow 281162306a36Sopenharmony_ci sflags=backup speed=slow \ 281262306a36Sopenharmony_ci run_tests $ns1 $ns2 10.0.1.1 281362306a36Sopenharmony_ci chk_join_nr 0 0 0 281462306a36Sopenharmony_ci chk_prio_nr 1 1 281562306a36Sopenharmony_ci fi 281662306a36Sopenharmony_ci} 281762306a36Sopenharmony_ci 281862306a36Sopenharmony_ciSUB_ESTABLISHED=10 # MPTCP_EVENT_SUB_ESTABLISHED 281962306a36Sopenharmony_ciLISTENER_CREATED=15 #MPTCP_EVENT_LISTENER_CREATED 282062306a36Sopenharmony_ciLISTENER_CLOSED=16 #MPTCP_EVENT_LISTENER_CLOSED 282162306a36Sopenharmony_ci 282262306a36Sopenharmony_ciAF_INET=2 282362306a36Sopenharmony_ciAF_INET6=10 282462306a36Sopenharmony_ci 282562306a36Sopenharmony_civerify_listener_events() 282662306a36Sopenharmony_ci{ 282762306a36Sopenharmony_ci local evt=$1 282862306a36Sopenharmony_ci local e_type=$2 282962306a36Sopenharmony_ci local e_family=$3 283062306a36Sopenharmony_ci local e_saddr=$4 283162306a36Sopenharmony_ci local e_sport=$5 283262306a36Sopenharmony_ci local type 283362306a36Sopenharmony_ci local family 283462306a36Sopenharmony_ci local saddr 283562306a36Sopenharmony_ci local sport 283662306a36Sopenharmony_ci local name 283762306a36Sopenharmony_ci 283862306a36Sopenharmony_ci if [ $e_type = $LISTENER_CREATED ]; then 283962306a36Sopenharmony_ci name="LISTENER_CREATED" 284062306a36Sopenharmony_ci elif [ $e_type = $LISTENER_CLOSED ]; then 284162306a36Sopenharmony_ci name="LISTENER_CLOSED " 284262306a36Sopenharmony_ci else 284362306a36Sopenharmony_ci name="$e_type" 284462306a36Sopenharmony_ci fi 284562306a36Sopenharmony_ci 284662306a36Sopenharmony_ci print_check "$name $e_saddr:$e_sport" 284762306a36Sopenharmony_ci 284862306a36Sopenharmony_ci if ! mptcp_lib_kallsyms_has "mptcp_event_pm_listener$"; then 284962306a36Sopenharmony_ci print_skip "event not supported" 285062306a36Sopenharmony_ci return 285162306a36Sopenharmony_ci fi 285262306a36Sopenharmony_ci 285362306a36Sopenharmony_ci type=$(mptcp_lib_evts_get_info type "$evt" "$e_type") 285462306a36Sopenharmony_ci family=$(mptcp_lib_evts_get_info family "$evt" "$e_type") 285562306a36Sopenharmony_ci sport=$(mptcp_lib_evts_get_info sport "$evt" "$e_type") 285662306a36Sopenharmony_ci if [ $family ] && [ $family = $AF_INET6 ]; then 285762306a36Sopenharmony_ci saddr=$(mptcp_lib_evts_get_info saddr6 "$evt" "$e_type") 285862306a36Sopenharmony_ci else 285962306a36Sopenharmony_ci saddr=$(mptcp_lib_evts_get_info saddr4 "$evt" "$e_type") 286062306a36Sopenharmony_ci fi 286162306a36Sopenharmony_ci 286262306a36Sopenharmony_ci if [ $type ] && [ $type = $e_type ] && 286362306a36Sopenharmony_ci [ $family ] && [ $family = $e_family ] && 286462306a36Sopenharmony_ci [ $saddr ] && [ $saddr = $e_saddr ] && 286562306a36Sopenharmony_ci [ $sport ] && [ $sport = $e_sport ]; then 286662306a36Sopenharmony_ci print_ok 286762306a36Sopenharmony_ci return 0 286862306a36Sopenharmony_ci fi 286962306a36Sopenharmony_ci fail_test "$e_type:$type $e_family:$family $e_saddr:$saddr $e_sport:$sport" 287062306a36Sopenharmony_ci} 287162306a36Sopenharmony_ci 287262306a36Sopenharmony_ciadd_addr_ports_tests() 287362306a36Sopenharmony_ci{ 287462306a36Sopenharmony_ci # signal address with port 287562306a36Sopenharmony_ci if reset "signal address with port"; then 287662306a36Sopenharmony_ci pm_nl_set_limits $ns1 0 1 287762306a36Sopenharmony_ci pm_nl_set_limits $ns2 1 1 287862306a36Sopenharmony_ci pm_nl_add_endpoint $ns1 10.0.2.1 flags signal port 10100 287962306a36Sopenharmony_ci run_tests $ns1 $ns2 10.0.1.1 288062306a36Sopenharmony_ci chk_join_nr 1 1 1 288162306a36Sopenharmony_ci chk_add_nr 1 1 1 288262306a36Sopenharmony_ci fi 288362306a36Sopenharmony_ci 288462306a36Sopenharmony_ci # subflow and signal with port 288562306a36Sopenharmony_ci if reset "subflow and signal with port"; then 288662306a36Sopenharmony_ci pm_nl_add_endpoint $ns1 10.0.2.1 flags signal port 10100 288762306a36Sopenharmony_ci pm_nl_set_limits $ns1 0 2 288862306a36Sopenharmony_ci pm_nl_set_limits $ns2 1 2 288962306a36Sopenharmony_ci pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow 289062306a36Sopenharmony_ci run_tests $ns1 $ns2 10.0.1.1 289162306a36Sopenharmony_ci chk_join_nr 2 2 2 289262306a36Sopenharmony_ci chk_add_nr 1 1 1 289362306a36Sopenharmony_ci fi 289462306a36Sopenharmony_ci 289562306a36Sopenharmony_ci # single address with port, remove 289662306a36Sopenharmony_ci # pm listener events 289762306a36Sopenharmony_ci if reset_with_events "remove single address with port"; then 289862306a36Sopenharmony_ci pm_nl_set_limits $ns1 0 1 289962306a36Sopenharmony_ci pm_nl_add_endpoint $ns1 10.0.2.1 flags signal port 10100 290062306a36Sopenharmony_ci pm_nl_set_limits $ns2 1 1 290162306a36Sopenharmony_ci addr_nr_ns1=-1 speed=slow \ 290262306a36Sopenharmony_ci run_tests $ns1 $ns2 10.0.1.1 290362306a36Sopenharmony_ci chk_join_nr 1 1 1 290462306a36Sopenharmony_ci chk_add_nr 1 1 1 290562306a36Sopenharmony_ci chk_rm_nr 1 1 invert 290662306a36Sopenharmony_ci 290762306a36Sopenharmony_ci verify_listener_events $evts_ns1 $LISTENER_CREATED $AF_INET 10.0.2.1 10100 290862306a36Sopenharmony_ci verify_listener_events $evts_ns1 $LISTENER_CLOSED $AF_INET 10.0.2.1 10100 290962306a36Sopenharmony_ci kill_events_pids 291062306a36Sopenharmony_ci fi 291162306a36Sopenharmony_ci 291262306a36Sopenharmony_ci # subflow and signal with port, remove 291362306a36Sopenharmony_ci if reset "remove subflow and signal with port"; then 291462306a36Sopenharmony_ci pm_nl_set_limits $ns1 0 2 291562306a36Sopenharmony_ci pm_nl_add_endpoint $ns1 10.0.2.1 flags signal port 10100 291662306a36Sopenharmony_ci pm_nl_set_limits $ns2 1 2 291762306a36Sopenharmony_ci pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow 291862306a36Sopenharmony_ci addr_nr_ns1=-1 addr_nr_ns2=-1 speed=slow \ 291962306a36Sopenharmony_ci run_tests $ns1 $ns2 10.0.1.1 292062306a36Sopenharmony_ci chk_join_nr 2 2 2 292162306a36Sopenharmony_ci chk_add_nr 1 1 1 292262306a36Sopenharmony_ci chk_rm_nr 1 1 292362306a36Sopenharmony_ci fi 292462306a36Sopenharmony_ci 292562306a36Sopenharmony_ci # subflows and signal with port, flush 292662306a36Sopenharmony_ci if reset "flush subflows and signal with port"; then 292762306a36Sopenharmony_ci pm_nl_set_limits $ns1 0 3 292862306a36Sopenharmony_ci pm_nl_add_endpoint $ns1 10.0.2.1 flags signal port 10100 292962306a36Sopenharmony_ci pm_nl_set_limits $ns2 1 3 293062306a36Sopenharmony_ci pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow 293162306a36Sopenharmony_ci pm_nl_add_endpoint $ns2 10.0.4.2 flags subflow 293262306a36Sopenharmony_ci addr_nr_ns1=-8 addr_nr_ns2=-2 speed=slow \ 293362306a36Sopenharmony_ci run_tests $ns1 $ns2 10.0.1.1 293462306a36Sopenharmony_ci chk_join_nr 3 3 3 293562306a36Sopenharmony_ci chk_add_nr 1 1 293662306a36Sopenharmony_ci chk_rm_nr 1 3 invert simult 293762306a36Sopenharmony_ci fi 293862306a36Sopenharmony_ci 293962306a36Sopenharmony_ci # multiple addresses with port 294062306a36Sopenharmony_ci if reset "multiple addresses with port"; then 294162306a36Sopenharmony_ci pm_nl_set_limits $ns1 2 2 294262306a36Sopenharmony_ci pm_nl_add_endpoint $ns1 10.0.2.1 flags signal port 10100 294362306a36Sopenharmony_ci pm_nl_add_endpoint $ns1 10.0.3.1 flags signal port 10100 294462306a36Sopenharmony_ci pm_nl_set_limits $ns2 2 2 294562306a36Sopenharmony_ci run_tests $ns1 $ns2 10.0.1.1 294662306a36Sopenharmony_ci chk_join_nr 2 2 2 294762306a36Sopenharmony_ci chk_add_nr 2 2 2 294862306a36Sopenharmony_ci fi 294962306a36Sopenharmony_ci 295062306a36Sopenharmony_ci # multiple addresses with ports 295162306a36Sopenharmony_ci if reset "multiple addresses with ports"; then 295262306a36Sopenharmony_ci pm_nl_set_limits $ns1 2 2 295362306a36Sopenharmony_ci pm_nl_add_endpoint $ns1 10.0.2.1 flags signal port 10100 295462306a36Sopenharmony_ci pm_nl_add_endpoint $ns1 10.0.3.1 flags signal port 10101 295562306a36Sopenharmony_ci pm_nl_set_limits $ns2 2 2 295662306a36Sopenharmony_ci run_tests $ns1 $ns2 10.0.1.1 295762306a36Sopenharmony_ci chk_join_nr 2 2 2 295862306a36Sopenharmony_ci chk_add_nr 2 2 2 295962306a36Sopenharmony_ci fi 296062306a36Sopenharmony_ci} 296162306a36Sopenharmony_ci 296262306a36Sopenharmony_cisyncookies_tests() 296362306a36Sopenharmony_ci{ 296462306a36Sopenharmony_ci # single subflow, syncookies 296562306a36Sopenharmony_ci if reset_with_cookies "single subflow with syn cookies"; then 296662306a36Sopenharmony_ci pm_nl_set_limits $ns1 0 1 296762306a36Sopenharmony_ci pm_nl_set_limits $ns2 0 1 296862306a36Sopenharmony_ci pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow 296962306a36Sopenharmony_ci run_tests $ns1 $ns2 10.0.1.1 297062306a36Sopenharmony_ci chk_join_nr 1 1 1 297162306a36Sopenharmony_ci fi 297262306a36Sopenharmony_ci 297362306a36Sopenharmony_ci # multiple subflows with syn cookies 297462306a36Sopenharmony_ci if reset_with_cookies "multiple subflows with syn cookies"; then 297562306a36Sopenharmony_ci pm_nl_set_limits $ns1 0 2 297662306a36Sopenharmony_ci pm_nl_set_limits $ns2 0 2 297762306a36Sopenharmony_ci pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow 297862306a36Sopenharmony_ci pm_nl_add_endpoint $ns2 10.0.2.2 flags subflow 297962306a36Sopenharmony_ci run_tests $ns1 $ns2 10.0.1.1 298062306a36Sopenharmony_ci chk_join_nr 2 2 2 298162306a36Sopenharmony_ci fi 298262306a36Sopenharmony_ci 298362306a36Sopenharmony_ci # multiple subflows limited by server 298462306a36Sopenharmony_ci if reset_with_cookies "subflows limited by server w cookies"; then 298562306a36Sopenharmony_ci pm_nl_set_limits $ns1 0 1 298662306a36Sopenharmony_ci pm_nl_set_limits $ns2 0 2 298762306a36Sopenharmony_ci pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow 298862306a36Sopenharmony_ci pm_nl_add_endpoint $ns2 10.0.2.2 flags subflow 298962306a36Sopenharmony_ci run_tests $ns1 $ns2 10.0.1.1 299062306a36Sopenharmony_ci chk_join_nr 2 1 1 299162306a36Sopenharmony_ci fi 299262306a36Sopenharmony_ci 299362306a36Sopenharmony_ci # test signal address with cookies 299462306a36Sopenharmony_ci if reset_with_cookies "signal address with syn cookies"; then 299562306a36Sopenharmony_ci pm_nl_set_limits $ns1 0 1 299662306a36Sopenharmony_ci pm_nl_set_limits $ns2 1 1 299762306a36Sopenharmony_ci pm_nl_add_endpoint $ns1 10.0.2.1 flags signal 299862306a36Sopenharmony_ci run_tests $ns1 $ns2 10.0.1.1 299962306a36Sopenharmony_ci chk_join_nr 1 1 1 300062306a36Sopenharmony_ci chk_add_nr 1 1 300162306a36Sopenharmony_ci fi 300262306a36Sopenharmony_ci 300362306a36Sopenharmony_ci # test cookie with subflow and signal 300462306a36Sopenharmony_ci if reset_with_cookies "subflow and signal w cookies"; then 300562306a36Sopenharmony_ci pm_nl_add_endpoint $ns1 10.0.2.1 flags signal 300662306a36Sopenharmony_ci pm_nl_set_limits $ns1 0 2 300762306a36Sopenharmony_ci pm_nl_set_limits $ns2 1 2 300862306a36Sopenharmony_ci pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow 300962306a36Sopenharmony_ci run_tests $ns1 $ns2 10.0.1.1 301062306a36Sopenharmony_ci chk_join_nr 2 2 2 301162306a36Sopenharmony_ci chk_add_nr 1 1 301262306a36Sopenharmony_ci fi 301362306a36Sopenharmony_ci 301462306a36Sopenharmony_ci # accept and use add_addr with additional subflows 301562306a36Sopenharmony_ci if reset_with_cookies "subflows and signal w. cookies"; then 301662306a36Sopenharmony_ci pm_nl_set_limits $ns1 0 3 301762306a36Sopenharmony_ci pm_nl_add_endpoint $ns1 10.0.2.1 flags signal 301862306a36Sopenharmony_ci pm_nl_set_limits $ns2 1 3 301962306a36Sopenharmony_ci pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow 302062306a36Sopenharmony_ci pm_nl_add_endpoint $ns2 10.0.4.2 flags subflow 302162306a36Sopenharmony_ci run_tests $ns1 $ns2 10.0.1.1 302262306a36Sopenharmony_ci chk_join_nr 3 3 3 302362306a36Sopenharmony_ci chk_add_nr 1 1 302462306a36Sopenharmony_ci fi 302562306a36Sopenharmony_ci} 302662306a36Sopenharmony_ci 302762306a36Sopenharmony_cichecksum_tests() 302862306a36Sopenharmony_ci{ 302962306a36Sopenharmony_ci # checksum test 0 0 303062306a36Sopenharmony_ci if reset_with_checksum 0 0; then 303162306a36Sopenharmony_ci pm_nl_set_limits $ns1 0 1 303262306a36Sopenharmony_ci pm_nl_set_limits $ns2 0 1 303362306a36Sopenharmony_ci run_tests $ns1 $ns2 10.0.1.1 303462306a36Sopenharmony_ci chk_join_nr 0 0 0 303562306a36Sopenharmony_ci fi 303662306a36Sopenharmony_ci 303762306a36Sopenharmony_ci # checksum test 1 1 303862306a36Sopenharmony_ci if reset_with_checksum 1 1; then 303962306a36Sopenharmony_ci pm_nl_set_limits $ns1 0 1 304062306a36Sopenharmony_ci pm_nl_set_limits $ns2 0 1 304162306a36Sopenharmony_ci run_tests $ns1 $ns2 10.0.1.1 304262306a36Sopenharmony_ci chk_join_nr 0 0 0 304362306a36Sopenharmony_ci fi 304462306a36Sopenharmony_ci 304562306a36Sopenharmony_ci # checksum test 0 1 304662306a36Sopenharmony_ci if reset_with_checksum 0 1; then 304762306a36Sopenharmony_ci pm_nl_set_limits $ns1 0 1 304862306a36Sopenharmony_ci pm_nl_set_limits $ns2 0 1 304962306a36Sopenharmony_ci run_tests $ns1 $ns2 10.0.1.1 305062306a36Sopenharmony_ci chk_join_nr 0 0 0 305162306a36Sopenharmony_ci fi 305262306a36Sopenharmony_ci 305362306a36Sopenharmony_ci # checksum test 1 0 305462306a36Sopenharmony_ci if reset_with_checksum 1 0; then 305562306a36Sopenharmony_ci pm_nl_set_limits $ns1 0 1 305662306a36Sopenharmony_ci pm_nl_set_limits $ns2 0 1 305762306a36Sopenharmony_ci run_tests $ns1 $ns2 10.0.1.1 305862306a36Sopenharmony_ci chk_join_nr 0 0 0 305962306a36Sopenharmony_ci fi 306062306a36Sopenharmony_ci} 306162306a36Sopenharmony_ci 306262306a36Sopenharmony_cideny_join_id0_tests() 306362306a36Sopenharmony_ci{ 306462306a36Sopenharmony_ci # subflow allow join id0 ns1 306562306a36Sopenharmony_ci if reset_with_allow_join_id0 "single subflow allow join id0 ns1" 1 0; then 306662306a36Sopenharmony_ci pm_nl_set_limits $ns1 1 1 306762306a36Sopenharmony_ci pm_nl_set_limits $ns2 1 1 306862306a36Sopenharmony_ci pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow 306962306a36Sopenharmony_ci run_tests $ns1 $ns2 10.0.1.1 307062306a36Sopenharmony_ci chk_join_nr 1 1 1 307162306a36Sopenharmony_ci fi 307262306a36Sopenharmony_ci 307362306a36Sopenharmony_ci # subflow allow join id0 ns2 307462306a36Sopenharmony_ci if reset_with_allow_join_id0 "single subflow allow join id0 ns2" 0 1; then 307562306a36Sopenharmony_ci pm_nl_set_limits $ns1 1 1 307662306a36Sopenharmony_ci pm_nl_set_limits $ns2 1 1 307762306a36Sopenharmony_ci pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow 307862306a36Sopenharmony_ci run_tests $ns1 $ns2 10.0.1.1 307962306a36Sopenharmony_ci chk_join_nr 0 0 0 308062306a36Sopenharmony_ci fi 308162306a36Sopenharmony_ci 308262306a36Sopenharmony_ci # signal address allow join id0 ns1 308362306a36Sopenharmony_ci # ADD_ADDRs are not affected by allow_join_id0 value. 308462306a36Sopenharmony_ci if reset_with_allow_join_id0 "signal address allow join id0 ns1" 1 0; then 308562306a36Sopenharmony_ci pm_nl_set_limits $ns1 1 1 308662306a36Sopenharmony_ci pm_nl_set_limits $ns2 1 1 308762306a36Sopenharmony_ci pm_nl_add_endpoint $ns1 10.0.2.1 flags signal 308862306a36Sopenharmony_ci run_tests $ns1 $ns2 10.0.1.1 308962306a36Sopenharmony_ci chk_join_nr 1 1 1 309062306a36Sopenharmony_ci chk_add_nr 1 1 309162306a36Sopenharmony_ci fi 309262306a36Sopenharmony_ci 309362306a36Sopenharmony_ci # signal address allow join id0 ns2 309462306a36Sopenharmony_ci # ADD_ADDRs are not affected by allow_join_id0 value. 309562306a36Sopenharmony_ci if reset_with_allow_join_id0 "signal address allow join id0 ns2" 0 1; then 309662306a36Sopenharmony_ci pm_nl_set_limits $ns1 1 1 309762306a36Sopenharmony_ci pm_nl_set_limits $ns2 1 1 309862306a36Sopenharmony_ci pm_nl_add_endpoint $ns1 10.0.2.1 flags signal 309962306a36Sopenharmony_ci run_tests $ns1 $ns2 10.0.1.1 310062306a36Sopenharmony_ci chk_join_nr 1 1 1 310162306a36Sopenharmony_ci chk_add_nr 1 1 310262306a36Sopenharmony_ci fi 310362306a36Sopenharmony_ci 310462306a36Sopenharmony_ci # subflow and address allow join id0 ns1 310562306a36Sopenharmony_ci if reset_with_allow_join_id0 "subflow and address allow join id0 1" 1 0; then 310662306a36Sopenharmony_ci pm_nl_set_limits $ns1 2 2 310762306a36Sopenharmony_ci pm_nl_set_limits $ns2 2 2 310862306a36Sopenharmony_ci pm_nl_add_endpoint $ns1 10.0.2.1 flags signal 310962306a36Sopenharmony_ci pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow 311062306a36Sopenharmony_ci run_tests $ns1 $ns2 10.0.1.1 311162306a36Sopenharmony_ci chk_join_nr 2 2 2 311262306a36Sopenharmony_ci fi 311362306a36Sopenharmony_ci 311462306a36Sopenharmony_ci # subflow and address allow join id0 ns2 311562306a36Sopenharmony_ci if reset_with_allow_join_id0 "subflow and address allow join id0 2" 0 1; then 311662306a36Sopenharmony_ci pm_nl_set_limits $ns1 2 2 311762306a36Sopenharmony_ci pm_nl_set_limits $ns2 2 2 311862306a36Sopenharmony_ci pm_nl_add_endpoint $ns1 10.0.2.1 flags signal 311962306a36Sopenharmony_ci pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow 312062306a36Sopenharmony_ci run_tests $ns1 $ns2 10.0.1.1 312162306a36Sopenharmony_ci chk_join_nr 1 1 1 312262306a36Sopenharmony_ci fi 312362306a36Sopenharmony_ci} 312462306a36Sopenharmony_ci 312562306a36Sopenharmony_cifullmesh_tests() 312662306a36Sopenharmony_ci{ 312762306a36Sopenharmony_ci # fullmesh 1 312862306a36Sopenharmony_ci # 2 fullmesh addrs in ns2, added before the connection, 312962306a36Sopenharmony_ci # 1 non-fullmesh addr in ns1, added during the connection. 313062306a36Sopenharmony_ci if reset "fullmesh test 2x1"; then 313162306a36Sopenharmony_ci pm_nl_set_limits $ns1 0 4 313262306a36Sopenharmony_ci pm_nl_set_limits $ns2 1 4 313362306a36Sopenharmony_ci pm_nl_add_endpoint $ns2 10.0.2.2 flags subflow,fullmesh 313462306a36Sopenharmony_ci pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow,fullmesh 313562306a36Sopenharmony_ci addr_nr_ns1=1 speed=slow \ 313662306a36Sopenharmony_ci run_tests $ns1 $ns2 10.0.1.1 313762306a36Sopenharmony_ci chk_join_nr 4 4 4 313862306a36Sopenharmony_ci chk_add_nr 1 1 313962306a36Sopenharmony_ci fi 314062306a36Sopenharmony_ci 314162306a36Sopenharmony_ci # fullmesh 2 314262306a36Sopenharmony_ci # 1 non-fullmesh addr in ns1, added before the connection, 314362306a36Sopenharmony_ci # 1 fullmesh addr in ns2, added during the connection. 314462306a36Sopenharmony_ci if reset "fullmesh test 1x1"; then 314562306a36Sopenharmony_ci pm_nl_set_limits $ns1 1 3 314662306a36Sopenharmony_ci pm_nl_set_limits $ns2 1 3 314762306a36Sopenharmony_ci pm_nl_add_endpoint $ns1 10.0.2.1 flags signal 314862306a36Sopenharmony_ci fullmesh=1 speed=slow \ 314962306a36Sopenharmony_ci run_tests $ns1 $ns2 10.0.1.1 315062306a36Sopenharmony_ci chk_join_nr 3 3 3 315162306a36Sopenharmony_ci chk_add_nr 1 1 315262306a36Sopenharmony_ci fi 315362306a36Sopenharmony_ci 315462306a36Sopenharmony_ci # fullmesh 3 315562306a36Sopenharmony_ci # 1 non-fullmesh addr in ns1, added before the connection, 315662306a36Sopenharmony_ci # 2 fullmesh addrs in ns2, added during the connection. 315762306a36Sopenharmony_ci if reset "fullmesh test 1x2"; then 315862306a36Sopenharmony_ci pm_nl_set_limits $ns1 2 5 315962306a36Sopenharmony_ci pm_nl_set_limits $ns2 1 5 316062306a36Sopenharmony_ci pm_nl_add_endpoint $ns1 10.0.2.1 flags signal 316162306a36Sopenharmony_ci fullmesh=2 speed=slow \ 316262306a36Sopenharmony_ci run_tests $ns1 $ns2 10.0.1.1 316362306a36Sopenharmony_ci chk_join_nr 5 5 5 316462306a36Sopenharmony_ci chk_add_nr 1 1 316562306a36Sopenharmony_ci fi 316662306a36Sopenharmony_ci 316762306a36Sopenharmony_ci # fullmesh 4 316862306a36Sopenharmony_ci # 1 non-fullmesh addr in ns1, added before the connection, 316962306a36Sopenharmony_ci # 2 fullmesh addrs in ns2, added during the connection, 317062306a36Sopenharmony_ci # limit max_subflows to 4. 317162306a36Sopenharmony_ci if reset "fullmesh test 1x2, limited"; then 317262306a36Sopenharmony_ci pm_nl_set_limits $ns1 2 4 317362306a36Sopenharmony_ci pm_nl_set_limits $ns2 1 4 317462306a36Sopenharmony_ci pm_nl_add_endpoint $ns1 10.0.2.1 flags signal 317562306a36Sopenharmony_ci fullmesh=2 speed=slow \ 317662306a36Sopenharmony_ci run_tests $ns1 $ns2 10.0.1.1 317762306a36Sopenharmony_ci chk_join_nr 4 4 4 317862306a36Sopenharmony_ci chk_add_nr 1 1 317962306a36Sopenharmony_ci fi 318062306a36Sopenharmony_ci 318162306a36Sopenharmony_ci # set fullmesh flag 318262306a36Sopenharmony_ci if reset "set fullmesh flag test" && 318362306a36Sopenharmony_ci continue_if mptcp_lib_kversion_ge 5.18; then 318462306a36Sopenharmony_ci pm_nl_set_limits $ns1 4 4 318562306a36Sopenharmony_ci pm_nl_add_endpoint $ns1 10.0.2.1 flags subflow 318662306a36Sopenharmony_ci pm_nl_set_limits $ns2 4 4 318762306a36Sopenharmony_ci addr_nr_ns2=1 sflags=fullmesh speed=slow \ 318862306a36Sopenharmony_ci run_tests $ns1 $ns2 10.0.1.1 318962306a36Sopenharmony_ci chk_join_nr 2 2 2 319062306a36Sopenharmony_ci chk_rm_nr 0 1 319162306a36Sopenharmony_ci fi 319262306a36Sopenharmony_ci 319362306a36Sopenharmony_ci # set nofullmesh flag 319462306a36Sopenharmony_ci if reset "set nofullmesh flag test" && 319562306a36Sopenharmony_ci continue_if mptcp_lib_kversion_ge 5.18; then 319662306a36Sopenharmony_ci pm_nl_set_limits $ns1 4 4 319762306a36Sopenharmony_ci pm_nl_add_endpoint $ns1 10.0.2.1 flags subflow,fullmesh 319862306a36Sopenharmony_ci pm_nl_set_limits $ns2 4 4 319962306a36Sopenharmony_ci fullmesh=1 sflags=nofullmesh speed=slow \ 320062306a36Sopenharmony_ci run_tests $ns1 $ns2 10.0.1.1 320162306a36Sopenharmony_ci chk_join_nr 2 2 2 320262306a36Sopenharmony_ci chk_rm_nr 0 1 320362306a36Sopenharmony_ci fi 320462306a36Sopenharmony_ci 320562306a36Sopenharmony_ci # set backup,fullmesh flags 320662306a36Sopenharmony_ci if reset "set backup,fullmesh flags test" && 320762306a36Sopenharmony_ci continue_if mptcp_lib_kversion_ge 5.18; then 320862306a36Sopenharmony_ci pm_nl_set_limits $ns1 4 4 320962306a36Sopenharmony_ci pm_nl_add_endpoint $ns1 10.0.2.1 flags subflow 321062306a36Sopenharmony_ci pm_nl_set_limits $ns2 4 4 321162306a36Sopenharmony_ci addr_nr_ns2=1 sflags=backup,fullmesh speed=slow \ 321262306a36Sopenharmony_ci run_tests $ns1 $ns2 10.0.1.1 321362306a36Sopenharmony_ci chk_join_nr 2 2 2 321462306a36Sopenharmony_ci chk_prio_nr 0 1 321562306a36Sopenharmony_ci chk_rm_nr 0 1 321662306a36Sopenharmony_ci fi 321762306a36Sopenharmony_ci 321862306a36Sopenharmony_ci # set nobackup,nofullmesh flags 321962306a36Sopenharmony_ci if reset "set nobackup,nofullmesh flags test" && 322062306a36Sopenharmony_ci continue_if mptcp_lib_kversion_ge 5.18; then 322162306a36Sopenharmony_ci pm_nl_set_limits $ns1 4 4 322262306a36Sopenharmony_ci pm_nl_set_limits $ns2 4 4 322362306a36Sopenharmony_ci pm_nl_add_endpoint $ns2 10.0.2.2 flags subflow,backup,fullmesh 322462306a36Sopenharmony_ci sflags=nobackup,nofullmesh speed=slow \ 322562306a36Sopenharmony_ci run_tests $ns1 $ns2 10.0.1.1 322662306a36Sopenharmony_ci chk_join_nr 2 2 2 322762306a36Sopenharmony_ci chk_prio_nr 0 1 322862306a36Sopenharmony_ci chk_rm_nr 0 1 322962306a36Sopenharmony_ci fi 323062306a36Sopenharmony_ci} 323162306a36Sopenharmony_ci 323262306a36Sopenharmony_cifastclose_tests() 323362306a36Sopenharmony_ci{ 323462306a36Sopenharmony_ci if reset_check_counter "fastclose test" "MPTcpExtMPFastcloseTx"; then 323562306a36Sopenharmony_ci test_linkfail=1024 fastclose=client \ 323662306a36Sopenharmony_ci run_tests $ns1 $ns2 10.0.1.1 323762306a36Sopenharmony_ci chk_join_nr 0 0 0 323862306a36Sopenharmony_ci chk_fclose_nr 1 1 323962306a36Sopenharmony_ci chk_rst_nr 1 1 invert 324062306a36Sopenharmony_ci fi 324162306a36Sopenharmony_ci 324262306a36Sopenharmony_ci if reset_check_counter "fastclose server test" "MPTcpExtMPFastcloseRx"; then 324362306a36Sopenharmony_ci test_linkfail=1024 fastclose=server \ 324462306a36Sopenharmony_ci run_tests $ns1 $ns2 10.0.1.1 324562306a36Sopenharmony_ci chk_join_nr 0 0 0 0 0 0 1 324662306a36Sopenharmony_ci chk_fclose_nr 1 1 invert 324762306a36Sopenharmony_ci chk_rst_nr 1 1 324862306a36Sopenharmony_ci fi 324962306a36Sopenharmony_ci} 325062306a36Sopenharmony_ci 325162306a36Sopenharmony_cipedit_action_pkts() 325262306a36Sopenharmony_ci{ 325362306a36Sopenharmony_ci tc -n $ns2 -j -s action show action pedit index 100 | \ 325462306a36Sopenharmony_ci mptcp_lib_get_info_value \"packets\" packets 325562306a36Sopenharmony_ci} 325662306a36Sopenharmony_ci 325762306a36Sopenharmony_cifail_tests() 325862306a36Sopenharmony_ci{ 325962306a36Sopenharmony_ci # single subflow 326062306a36Sopenharmony_ci if reset_with_fail "Infinite map" 1; then 326162306a36Sopenharmony_ci test_linkfail=128 \ 326262306a36Sopenharmony_ci run_tests $ns1 $ns2 10.0.1.1 326362306a36Sopenharmony_ci chk_join_nr 0 0 0 +1 +0 1 0 1 "$(pedit_action_pkts)" 326462306a36Sopenharmony_ci chk_fail_nr 1 -1 invert 326562306a36Sopenharmony_ci fi 326662306a36Sopenharmony_ci 326762306a36Sopenharmony_ci # multiple subflows 326862306a36Sopenharmony_ci if reset_with_fail "MP_FAIL MP_RST" 2; then 326962306a36Sopenharmony_ci tc -n $ns2 qdisc add dev ns2eth1 root netem rate 1mbit delay 5 327062306a36Sopenharmony_ci pm_nl_set_limits $ns1 0 1 327162306a36Sopenharmony_ci pm_nl_set_limits $ns2 0 1 327262306a36Sopenharmony_ci pm_nl_add_endpoint $ns2 10.0.2.2 dev ns2eth2 flags subflow 327362306a36Sopenharmony_ci test_linkfail=1024 \ 327462306a36Sopenharmony_ci run_tests $ns1 $ns2 10.0.1.1 327562306a36Sopenharmony_ci chk_join_nr 1 1 1 1 0 1 1 0 "$(pedit_action_pkts)" 327662306a36Sopenharmony_ci fi 327762306a36Sopenharmony_ci} 327862306a36Sopenharmony_ci 327962306a36Sopenharmony_ci# $1: ns ; $2: addr ; $3: id 328062306a36Sopenharmony_ciuserspace_pm_add_addr() 328162306a36Sopenharmony_ci{ 328262306a36Sopenharmony_ci local evts=$evts_ns1 328362306a36Sopenharmony_ci local tk 328462306a36Sopenharmony_ci 328562306a36Sopenharmony_ci [ "$1" == "$ns2" ] && evts=$evts_ns2 328662306a36Sopenharmony_ci tk=$(mptcp_lib_evts_get_info token "$evts") 328762306a36Sopenharmony_ci 328862306a36Sopenharmony_ci ip netns exec $1 ./pm_nl_ctl ann $2 token $tk id $3 328962306a36Sopenharmony_ci sleep 1 329062306a36Sopenharmony_ci} 329162306a36Sopenharmony_ci 329262306a36Sopenharmony_ci# $1: ns ; $2: id 329362306a36Sopenharmony_ciuserspace_pm_rm_addr() 329462306a36Sopenharmony_ci{ 329562306a36Sopenharmony_ci local evts=$evts_ns1 329662306a36Sopenharmony_ci local tk 329762306a36Sopenharmony_ci local cnt 329862306a36Sopenharmony_ci 329962306a36Sopenharmony_ci [ "$1" == "$ns2" ] && evts=$evts_ns2 330062306a36Sopenharmony_ci tk=$(mptcp_lib_evts_get_info token "$evts") 330162306a36Sopenharmony_ci 330262306a36Sopenharmony_ci cnt=$(rm_addr_count ${1}) 330362306a36Sopenharmony_ci ip netns exec $1 ./pm_nl_ctl rem token $tk id $2 330462306a36Sopenharmony_ci wait_rm_addr $1 "${cnt}" 330562306a36Sopenharmony_ci} 330662306a36Sopenharmony_ci 330762306a36Sopenharmony_ci# $1: ns ; $2: addr ; $3: id 330862306a36Sopenharmony_ciuserspace_pm_add_sf() 330962306a36Sopenharmony_ci{ 331062306a36Sopenharmony_ci local evts=$evts_ns1 331162306a36Sopenharmony_ci local tk da dp 331262306a36Sopenharmony_ci 331362306a36Sopenharmony_ci [ "$1" == "$ns2" ] && evts=$evts_ns2 331462306a36Sopenharmony_ci tk=$(mptcp_lib_evts_get_info token "$evts") 331562306a36Sopenharmony_ci da=$(mptcp_lib_evts_get_info daddr4 "$evts") 331662306a36Sopenharmony_ci dp=$(mptcp_lib_evts_get_info dport "$evts") 331762306a36Sopenharmony_ci 331862306a36Sopenharmony_ci ip netns exec $1 ./pm_nl_ctl csf lip $2 lid $3 \ 331962306a36Sopenharmony_ci rip $da rport $dp token $tk 332062306a36Sopenharmony_ci sleep 1 332162306a36Sopenharmony_ci} 332262306a36Sopenharmony_ci 332362306a36Sopenharmony_ci# $1: ns ; $2: addr $3: event type 332462306a36Sopenharmony_ciuserspace_pm_rm_sf() 332562306a36Sopenharmony_ci{ 332662306a36Sopenharmony_ci local evts=$evts_ns1 332762306a36Sopenharmony_ci local t=${3:-1} 332862306a36Sopenharmony_ci local ip 332962306a36Sopenharmony_ci local tk da dp sp 333062306a36Sopenharmony_ci local cnt 333162306a36Sopenharmony_ci 333262306a36Sopenharmony_ci [ "$1" == "$ns2" ] && evts=$evts_ns2 333362306a36Sopenharmony_ci [ -n "$(mptcp_lib_evts_get_info "saddr4" "$evts" $t)" ] && ip=4 333462306a36Sopenharmony_ci [ -n "$(mptcp_lib_evts_get_info "saddr6" "$evts" $t)" ] && ip=6 333562306a36Sopenharmony_ci tk=$(mptcp_lib_evts_get_info token "$evts") 333662306a36Sopenharmony_ci da=$(mptcp_lib_evts_get_info "daddr$ip" "$evts" $t $2) 333762306a36Sopenharmony_ci dp=$(mptcp_lib_evts_get_info dport "$evts" $t $2) 333862306a36Sopenharmony_ci sp=$(mptcp_lib_evts_get_info sport "$evts" $t $2) 333962306a36Sopenharmony_ci 334062306a36Sopenharmony_ci cnt=$(rm_sf_count ${1}) 334162306a36Sopenharmony_ci ip netns exec $1 ./pm_nl_ctl dsf lip $2 lport $sp \ 334262306a36Sopenharmony_ci rip $da rport $dp token $tk 334362306a36Sopenharmony_ci wait_rm_sf $1 "${cnt}" 334462306a36Sopenharmony_ci} 334562306a36Sopenharmony_ci 334662306a36Sopenharmony_ciuserspace_tests() 334762306a36Sopenharmony_ci{ 334862306a36Sopenharmony_ci # userspace pm type prevents add_addr 334962306a36Sopenharmony_ci if reset "userspace pm type prevents add_addr" && 335062306a36Sopenharmony_ci continue_if mptcp_lib_has_file '/proc/sys/net/mptcp/pm_type'; then 335162306a36Sopenharmony_ci set_userspace_pm $ns1 335262306a36Sopenharmony_ci pm_nl_set_limits $ns1 0 2 335362306a36Sopenharmony_ci pm_nl_set_limits $ns2 0 2 335462306a36Sopenharmony_ci pm_nl_add_endpoint $ns1 10.0.2.1 flags signal 335562306a36Sopenharmony_ci run_tests $ns1 $ns2 10.0.1.1 335662306a36Sopenharmony_ci chk_join_nr 0 0 0 335762306a36Sopenharmony_ci chk_add_nr 0 0 335862306a36Sopenharmony_ci fi 335962306a36Sopenharmony_ci 336062306a36Sopenharmony_ci # userspace pm type does not echo add_addr without daemon 336162306a36Sopenharmony_ci if reset "userspace pm no echo w/o daemon" && 336262306a36Sopenharmony_ci continue_if mptcp_lib_has_file '/proc/sys/net/mptcp/pm_type'; then 336362306a36Sopenharmony_ci set_userspace_pm $ns2 336462306a36Sopenharmony_ci pm_nl_set_limits $ns1 0 2 336562306a36Sopenharmony_ci pm_nl_set_limits $ns2 0 2 336662306a36Sopenharmony_ci pm_nl_add_endpoint $ns1 10.0.2.1 flags signal 336762306a36Sopenharmony_ci run_tests $ns1 $ns2 10.0.1.1 336862306a36Sopenharmony_ci chk_join_nr 0 0 0 336962306a36Sopenharmony_ci chk_add_nr 1 0 337062306a36Sopenharmony_ci fi 337162306a36Sopenharmony_ci 337262306a36Sopenharmony_ci # userspace pm type rejects join 337362306a36Sopenharmony_ci if reset "userspace pm type rejects join" && 337462306a36Sopenharmony_ci continue_if mptcp_lib_has_file '/proc/sys/net/mptcp/pm_type'; then 337562306a36Sopenharmony_ci set_userspace_pm $ns1 337662306a36Sopenharmony_ci pm_nl_set_limits $ns1 1 1 337762306a36Sopenharmony_ci pm_nl_set_limits $ns2 1 1 337862306a36Sopenharmony_ci pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow 337962306a36Sopenharmony_ci run_tests $ns1 $ns2 10.0.1.1 338062306a36Sopenharmony_ci chk_join_nr 1 1 0 338162306a36Sopenharmony_ci fi 338262306a36Sopenharmony_ci 338362306a36Sopenharmony_ci # userspace pm type does not send join 338462306a36Sopenharmony_ci if reset "userspace pm type does not send join" && 338562306a36Sopenharmony_ci continue_if mptcp_lib_has_file '/proc/sys/net/mptcp/pm_type'; then 338662306a36Sopenharmony_ci set_userspace_pm $ns2 338762306a36Sopenharmony_ci pm_nl_set_limits $ns1 1 1 338862306a36Sopenharmony_ci pm_nl_set_limits $ns2 1 1 338962306a36Sopenharmony_ci pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow 339062306a36Sopenharmony_ci run_tests $ns1 $ns2 10.0.1.1 339162306a36Sopenharmony_ci chk_join_nr 0 0 0 339262306a36Sopenharmony_ci fi 339362306a36Sopenharmony_ci 339462306a36Sopenharmony_ci # userspace pm type prevents mp_prio 339562306a36Sopenharmony_ci if reset "userspace pm type prevents mp_prio" && 339662306a36Sopenharmony_ci continue_if mptcp_lib_has_file '/proc/sys/net/mptcp/pm_type'; then 339762306a36Sopenharmony_ci set_userspace_pm $ns1 339862306a36Sopenharmony_ci pm_nl_set_limits $ns1 1 1 339962306a36Sopenharmony_ci pm_nl_set_limits $ns2 1 1 340062306a36Sopenharmony_ci pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow 340162306a36Sopenharmony_ci sflags=backup speed=slow \ 340262306a36Sopenharmony_ci run_tests $ns1 $ns2 10.0.1.1 340362306a36Sopenharmony_ci chk_join_nr 1 1 0 340462306a36Sopenharmony_ci chk_prio_nr 0 0 340562306a36Sopenharmony_ci fi 340662306a36Sopenharmony_ci 340762306a36Sopenharmony_ci # userspace pm type prevents rm_addr 340862306a36Sopenharmony_ci if reset "userspace pm type prevents rm_addr" && 340962306a36Sopenharmony_ci continue_if mptcp_lib_has_file '/proc/sys/net/mptcp/pm_type'; then 341062306a36Sopenharmony_ci set_userspace_pm $ns1 341162306a36Sopenharmony_ci set_userspace_pm $ns2 341262306a36Sopenharmony_ci pm_nl_set_limits $ns1 0 1 341362306a36Sopenharmony_ci pm_nl_set_limits $ns2 0 1 341462306a36Sopenharmony_ci pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow 341562306a36Sopenharmony_ci addr_nr_ns2=-1 speed=slow \ 341662306a36Sopenharmony_ci run_tests $ns1 $ns2 10.0.1.1 341762306a36Sopenharmony_ci chk_join_nr 0 0 0 341862306a36Sopenharmony_ci chk_rm_nr 0 0 341962306a36Sopenharmony_ci fi 342062306a36Sopenharmony_ci 342162306a36Sopenharmony_ci # userspace pm add & remove address 342262306a36Sopenharmony_ci if reset_with_events "userspace pm add & remove address" && 342362306a36Sopenharmony_ci continue_if mptcp_lib_has_file '/proc/sys/net/mptcp/pm_type'; then 342462306a36Sopenharmony_ci set_userspace_pm $ns1 342562306a36Sopenharmony_ci pm_nl_set_limits $ns2 2 2 342662306a36Sopenharmony_ci speed=5 \ 342762306a36Sopenharmony_ci run_tests $ns1 $ns2 10.0.1.1 & 342862306a36Sopenharmony_ci local tests_pid=$! 342962306a36Sopenharmony_ci wait_mpj $ns1 343062306a36Sopenharmony_ci userspace_pm_add_addr $ns1 10.0.2.1 10 343162306a36Sopenharmony_ci userspace_pm_add_addr $ns1 10.0.3.1 20 343262306a36Sopenharmony_ci chk_join_nr 2 2 2 343362306a36Sopenharmony_ci chk_add_nr 2 2 343462306a36Sopenharmony_ci chk_mptcp_info subflows 2 subflows 2 343562306a36Sopenharmony_ci chk_subflows_total 3 3 343662306a36Sopenharmony_ci chk_mptcp_info add_addr_signal 2 add_addr_accepted 2 343762306a36Sopenharmony_ci userspace_pm_rm_addr $ns1 10 343862306a36Sopenharmony_ci userspace_pm_rm_sf $ns1 "::ffff:10.0.2.1" $SUB_ESTABLISHED 343962306a36Sopenharmony_ci userspace_pm_rm_addr $ns1 20 344062306a36Sopenharmony_ci userspace_pm_rm_sf $ns1 10.0.3.1 $SUB_ESTABLISHED 344162306a36Sopenharmony_ci chk_rm_nr 2 2 invert 344262306a36Sopenharmony_ci chk_mptcp_info subflows 0 subflows 0 344362306a36Sopenharmony_ci chk_subflows_total 1 1 344462306a36Sopenharmony_ci kill_events_pids 344562306a36Sopenharmony_ci mptcp_lib_kill_wait $tests_pid 344662306a36Sopenharmony_ci fi 344762306a36Sopenharmony_ci 344862306a36Sopenharmony_ci # userspace pm create destroy subflow 344962306a36Sopenharmony_ci if reset_with_events "userspace pm create destroy subflow" && 345062306a36Sopenharmony_ci continue_if mptcp_lib_has_file '/proc/sys/net/mptcp/pm_type'; then 345162306a36Sopenharmony_ci set_userspace_pm $ns2 345262306a36Sopenharmony_ci pm_nl_set_limits $ns1 0 1 345362306a36Sopenharmony_ci speed=5 \ 345462306a36Sopenharmony_ci run_tests $ns1 $ns2 10.0.1.1 & 345562306a36Sopenharmony_ci local tests_pid=$! 345662306a36Sopenharmony_ci wait_mpj $ns2 345762306a36Sopenharmony_ci userspace_pm_add_sf $ns2 10.0.3.2 20 345862306a36Sopenharmony_ci chk_join_nr 1 1 1 345962306a36Sopenharmony_ci chk_mptcp_info subflows 1 subflows 1 346062306a36Sopenharmony_ci chk_subflows_total 2 2 346162306a36Sopenharmony_ci userspace_pm_rm_addr $ns2 20 346262306a36Sopenharmony_ci userspace_pm_rm_sf $ns2 10.0.3.2 $SUB_ESTABLISHED 346362306a36Sopenharmony_ci chk_rm_nr 1 1 346462306a36Sopenharmony_ci chk_mptcp_info subflows 0 subflows 0 346562306a36Sopenharmony_ci chk_subflows_total 1 1 346662306a36Sopenharmony_ci kill_events_pids 346762306a36Sopenharmony_ci mptcp_lib_kill_wait $tests_pid 346862306a36Sopenharmony_ci fi 346962306a36Sopenharmony_ci} 347062306a36Sopenharmony_ci 347162306a36Sopenharmony_ciendpoint_tests() 347262306a36Sopenharmony_ci{ 347362306a36Sopenharmony_ci # subflow_rebuild_header is needed to support the implicit flag 347462306a36Sopenharmony_ci # userspace pm type prevents add_addr 347562306a36Sopenharmony_ci if reset "implicit EP" && 347662306a36Sopenharmony_ci mptcp_lib_kallsyms_has "subflow_rebuild_header$"; then 347762306a36Sopenharmony_ci pm_nl_set_limits $ns1 2 2 347862306a36Sopenharmony_ci pm_nl_set_limits $ns2 2 2 347962306a36Sopenharmony_ci pm_nl_add_endpoint $ns1 10.0.2.1 flags signal 348062306a36Sopenharmony_ci speed=slow \ 348162306a36Sopenharmony_ci run_tests $ns1 $ns2 10.0.1.1 & 348262306a36Sopenharmony_ci local tests_pid=$! 348362306a36Sopenharmony_ci 348462306a36Sopenharmony_ci wait_mpj $ns1 348562306a36Sopenharmony_ci pm_nl_check_endpoint "creation" \ 348662306a36Sopenharmony_ci $ns2 10.0.2.2 id 1 flags implicit 348762306a36Sopenharmony_ci chk_mptcp_info subflows 1 subflows 1 348862306a36Sopenharmony_ci chk_mptcp_info add_addr_signal 1 add_addr_accepted 1 348962306a36Sopenharmony_ci 349062306a36Sopenharmony_ci pm_nl_add_endpoint $ns2 10.0.2.2 id 33 2>/dev/null 349162306a36Sopenharmony_ci pm_nl_check_endpoint "ID change is prevented" \ 349262306a36Sopenharmony_ci $ns2 10.0.2.2 id 1 flags implicit 349362306a36Sopenharmony_ci 349462306a36Sopenharmony_ci pm_nl_add_endpoint $ns2 10.0.2.2 flags signal 349562306a36Sopenharmony_ci pm_nl_check_endpoint "modif is allowed" \ 349662306a36Sopenharmony_ci $ns2 10.0.2.2 id 1 flags signal 349762306a36Sopenharmony_ci mptcp_lib_kill_wait $tests_pid 349862306a36Sopenharmony_ci fi 349962306a36Sopenharmony_ci 350062306a36Sopenharmony_ci if reset "delete and re-add" && 350162306a36Sopenharmony_ci mptcp_lib_kallsyms_has "subflow_rebuild_header$"; then 350262306a36Sopenharmony_ci pm_nl_set_limits $ns1 1 1 350362306a36Sopenharmony_ci pm_nl_set_limits $ns2 1 1 350462306a36Sopenharmony_ci pm_nl_add_endpoint $ns2 10.0.2.2 id 2 dev ns2eth2 flags subflow 350562306a36Sopenharmony_ci test_linkfail=4 speed=20 \ 350662306a36Sopenharmony_ci run_tests $ns1 $ns2 10.0.1.1 & 350762306a36Sopenharmony_ci local tests_pid=$! 350862306a36Sopenharmony_ci 350962306a36Sopenharmony_ci wait_mpj $ns2 351062306a36Sopenharmony_ci chk_subflow_nr "before delete" 2 351162306a36Sopenharmony_ci chk_mptcp_info subflows 1 subflows 1 351262306a36Sopenharmony_ci 351362306a36Sopenharmony_ci pm_nl_del_endpoint $ns2 2 10.0.2.2 351462306a36Sopenharmony_ci sleep 0.5 351562306a36Sopenharmony_ci chk_subflow_nr "after delete" 1 351662306a36Sopenharmony_ci chk_mptcp_info subflows 0 subflows 0 351762306a36Sopenharmony_ci 351862306a36Sopenharmony_ci pm_nl_add_endpoint $ns2 10.0.2.2 dev ns2eth2 flags subflow 351962306a36Sopenharmony_ci wait_mpj $ns2 352062306a36Sopenharmony_ci chk_subflow_nr "after re-add" 2 352162306a36Sopenharmony_ci chk_mptcp_info subflows 1 subflows 1 352262306a36Sopenharmony_ci mptcp_lib_kill_wait $tests_pid 352362306a36Sopenharmony_ci fi 352462306a36Sopenharmony_ci} 352562306a36Sopenharmony_ci 352662306a36Sopenharmony_ci# [$1: error message] 352762306a36Sopenharmony_ciusage() 352862306a36Sopenharmony_ci{ 352962306a36Sopenharmony_ci if [ -n "${1}" ]; then 353062306a36Sopenharmony_ci echo "${1}" 353162306a36Sopenharmony_ci ret=1 353262306a36Sopenharmony_ci fi 353362306a36Sopenharmony_ci 353462306a36Sopenharmony_ci echo "mptcp_join usage:" 353562306a36Sopenharmony_ci 353662306a36Sopenharmony_ci local key 353762306a36Sopenharmony_ci for key in "${!all_tests[@]}"; do 353862306a36Sopenharmony_ci echo " -${key} ${all_tests[${key}]}" 353962306a36Sopenharmony_ci done 354062306a36Sopenharmony_ci 354162306a36Sopenharmony_ci echo " -c capture pcap files" 354262306a36Sopenharmony_ci echo " -C enable data checksum" 354362306a36Sopenharmony_ci echo " -i use ip mptcp" 354462306a36Sopenharmony_ci echo " -h help" 354562306a36Sopenharmony_ci 354662306a36Sopenharmony_ci echo "[test ids|names]" 354762306a36Sopenharmony_ci 354862306a36Sopenharmony_ci exit ${ret} 354962306a36Sopenharmony_ci} 355062306a36Sopenharmony_ci 355162306a36Sopenharmony_ci 355262306a36Sopenharmony_ci# Use a "simple" array to force an specific order we cannot have with an associative one 355362306a36Sopenharmony_ciall_tests_sorted=( 355462306a36Sopenharmony_ci f@subflows_tests 355562306a36Sopenharmony_ci e@subflows_error_tests 355662306a36Sopenharmony_ci s@signal_address_tests 355762306a36Sopenharmony_ci l@link_failure_tests 355862306a36Sopenharmony_ci t@add_addr_timeout_tests 355962306a36Sopenharmony_ci r@remove_tests 356062306a36Sopenharmony_ci a@add_tests 356162306a36Sopenharmony_ci 6@ipv6_tests 356262306a36Sopenharmony_ci 4@v4mapped_tests 356362306a36Sopenharmony_ci M@mixed_tests 356462306a36Sopenharmony_ci b@backup_tests 356562306a36Sopenharmony_ci p@add_addr_ports_tests 356662306a36Sopenharmony_ci k@syncookies_tests 356762306a36Sopenharmony_ci S@checksum_tests 356862306a36Sopenharmony_ci d@deny_join_id0_tests 356962306a36Sopenharmony_ci m@fullmesh_tests 357062306a36Sopenharmony_ci z@fastclose_tests 357162306a36Sopenharmony_ci F@fail_tests 357262306a36Sopenharmony_ci u@userspace_tests 357362306a36Sopenharmony_ci I@endpoint_tests 357462306a36Sopenharmony_ci) 357562306a36Sopenharmony_ci 357662306a36Sopenharmony_ciall_tests_args="" 357762306a36Sopenharmony_ciall_tests_names=() 357862306a36Sopenharmony_cifor subtests in "${all_tests_sorted[@]}"; do 357962306a36Sopenharmony_ci key="${subtests%@*}" 358062306a36Sopenharmony_ci value="${subtests#*@}" 358162306a36Sopenharmony_ci 358262306a36Sopenharmony_ci all_tests_args+="${key}" 358362306a36Sopenharmony_ci all_tests_names+=("${value}") 358462306a36Sopenharmony_ci all_tests[${key}]="${value}" 358562306a36Sopenharmony_cidone 358662306a36Sopenharmony_ci 358762306a36Sopenharmony_citests=() 358862306a36Sopenharmony_ciwhile getopts "${all_tests_args}cCih" opt; do 358962306a36Sopenharmony_ci case $opt in 359062306a36Sopenharmony_ci ["${all_tests_args}"]) 359162306a36Sopenharmony_ci tests+=("${all_tests[${opt}]}") 359262306a36Sopenharmony_ci ;; 359362306a36Sopenharmony_ci c) 359462306a36Sopenharmony_ci capture=1 359562306a36Sopenharmony_ci ;; 359662306a36Sopenharmony_ci C) 359762306a36Sopenharmony_ci checksum=1 359862306a36Sopenharmony_ci ;; 359962306a36Sopenharmony_ci i) 360062306a36Sopenharmony_ci ip_mptcp=1 360162306a36Sopenharmony_ci ;; 360262306a36Sopenharmony_ci h) 360362306a36Sopenharmony_ci usage 360462306a36Sopenharmony_ci ;; 360562306a36Sopenharmony_ci *) 360662306a36Sopenharmony_ci usage "Unknown option: -${opt}" 360762306a36Sopenharmony_ci ;; 360862306a36Sopenharmony_ci esac 360962306a36Sopenharmony_cidone 361062306a36Sopenharmony_ci 361162306a36Sopenharmony_cishift $((OPTIND - 1)) 361262306a36Sopenharmony_ci 361362306a36Sopenharmony_cifor arg in "${@}"; do 361462306a36Sopenharmony_ci if [[ "${arg}" =~ ^[0-9]+$ ]]; then 361562306a36Sopenharmony_ci only_tests_ids+=("${arg}") 361662306a36Sopenharmony_ci else 361762306a36Sopenharmony_ci only_tests_names+=("${arg}") 361862306a36Sopenharmony_ci fi 361962306a36Sopenharmony_cidone 362062306a36Sopenharmony_ci 362162306a36Sopenharmony_ciif [ ${#tests[@]} -eq 0 ]; then 362262306a36Sopenharmony_ci tests=("${all_tests_names[@]}") 362362306a36Sopenharmony_cifi 362462306a36Sopenharmony_ci 362562306a36Sopenharmony_cifor subtests in "${tests[@]}"; do 362662306a36Sopenharmony_ci "${subtests}" 362762306a36Sopenharmony_cidone 362862306a36Sopenharmony_ci 362962306a36Sopenharmony_ciif [ ${ret} -ne 0 ]; then 363062306a36Sopenharmony_ci echo 363162306a36Sopenharmony_ci echo "${#failed_tests[@]} failure(s) has(ve) been detected:" 363262306a36Sopenharmony_ci for i in $(get_failed_tests_ids); do 363362306a36Sopenharmony_ci echo -e "\t- ${i}: ${failed_tests[${i}]}" 363462306a36Sopenharmony_ci done 363562306a36Sopenharmony_ci echo 363662306a36Sopenharmony_cifi 363762306a36Sopenharmony_ci 363862306a36Sopenharmony_ciappend_prev_results 363962306a36Sopenharmony_cimptcp_lib_result_print_all_tap 364062306a36Sopenharmony_ci 364162306a36Sopenharmony_ciexit $ret 3642