brintos

brintos / linux-shallow public Read only

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