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