All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH mptcp-next 0/9] Refactor mptcp_join.sh
@ 2022-02-09 21:25 Matthieu Baerts
  2022-02-09 21:25 ` [PATCH mptcp-next 1/9] selftests: mptcp: join: allow running -cCi Matthieu Baerts
                   ` (9 more replies)
  0 siblings, 10 replies; 20+ messages in thread
From: Matthieu Baerts @ 2022-02-09 21:25 UTC (permalink / raw)
  To: mptcp; +Cc: Matthieu Baerts

I started this series to be able to launch a specific test without
having to modify the script to comment tests from the subgroup I didn't
want to validate when trying to reproduce a specific issue in a loop.
That's what we can find in patch 3/9.

While at it, I:
- fixed one issue with the options (patch 1/9)
- stop if an option doesn't exist (patch 2/9)
- removed unused vars (patch 4/9)
- delay some actions to the first test not to do them if no test is
  launched (patches 5-6/9)

But after having seen all modified lines, why stopping there? So I:
- clarify local vs global variables to avoid Bash's classical pitfall
  (patch 7/9)
- fixed all issues reported by ShellCheck except one (patch 8-9/9)

These last 3 patches (+ patch 3/9) will create a lot of conflicts. If
we are OK with them, probably best not to wait to long before applying
them to avoid big rebases.

For the patches that are already in review, I can fix the conflicts when
applying them.

Matthieu Baerts (9):
  selftests: mptcp: join: allow running -cCi
  selftests: mptcp: join: exit after printing usage
  selftests: mptcp: join: option to execute specific tests
  selftests: mptcp: join: remove unused vars
  selftests: mptcp: join: create tmp files only if needed
  selftests: mptcp: join: check for tools only if needed
  selftests: mptcp: join: clarify local/global vars
  selftests: mptcp: join: avoid backquotes
  selftests: mptcp: join: make it shellcheck compliant

 .../testing/selftests/net/mptcp/mptcp_join.sh | 2342 +++++++++--------
 1 file changed, 1257 insertions(+), 1085 deletions(-)

-- 
2.34.1


^ permalink raw reply	[flat|nested] 20+ messages in thread

* [PATCH mptcp-next 1/9] selftests: mptcp: join: allow running -cCi
  2022-02-09 21:25 [PATCH mptcp-next 0/9] Refactor mptcp_join.sh Matthieu Baerts
@ 2022-02-09 21:25 ` Matthieu Baerts
  2022-02-10 14:53   ` Paolo Abeni
  2022-02-09 21:25 ` [PATCH mptcp-next 2/9] selftests: mptcp: join: exit after usage() Matthieu Baerts
                   ` (8 subsequent siblings)
  9 siblings, 1 reply; 20+ messages in thread
From: Matthieu Baerts @ 2022-02-09 21:25 UTC (permalink / raw)
  To: mptcp; +Cc: Matthieu Baerts

Without this patch, no tests would be ran when launching:

  mptcp_join.sh -cCi

In any order or a combination with 2 of these letters.

Signed-off-by: Matthieu Baerts <matthieu.baerts@tessares.net>
---
 tools/testing/selftests/net/mptcp/mptcp_join.sh | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/tools/testing/selftests/net/mptcp/mptcp_join.sh b/tools/testing/selftests/net/mptcp/mptcp_join.sh
index 66ac990415e6..9bbb95837f73 100755
--- a/tools/testing/selftests/net/mptcp/mptcp_join.sh
+++ b/tools/testing/selftests/net/mptcp/mptcp_join.sh
@@ -2242,7 +2242,7 @@ for arg in "$@"; do
 	fi
 
 	# exception for the capture/checksum/ip_mptcp options, the rest means: a part of the tests
-	if [ "${arg}" != "-c" ] && [ "${arg}" != "-C" ] && [ "${arg}" != "-i" ]; then
+	if ! [[ "${arg}" =~ ^"-"[cCi]+$ ]]; then
 		do_all_tests=0
 	fi
 done
-- 
2.34.1


^ permalink raw reply related	[flat|nested] 20+ messages in thread

* [PATCH mptcp-next 2/9] selftests: mptcp: join: exit after usage()
  2022-02-09 21:25 [PATCH mptcp-next 0/9] Refactor mptcp_join.sh Matthieu Baerts
  2022-02-09 21:25 ` [PATCH mptcp-next 1/9] selftests: mptcp: join: allow running -cCi Matthieu Baerts
@ 2022-02-09 21:25 ` Matthieu Baerts
  2022-02-09 21:25 ` [PATCH mptcp-next 3/9] selftests: mptcp: join: option to execute specific tests Matthieu Baerts
                   ` (7 subsequent siblings)
  9 siblings, 0 replies; 20+ messages in thread
From: Matthieu Baerts @ 2022-02-09 21:25 UTC (permalink / raw)
  To: mptcp; +Cc: Matthieu Baerts

With an error if it is an unknown option.

Signed-off-by: Matthieu Baerts <matthieu.baerts@tessares.net>
---
 tools/testing/selftests/net/mptcp/mptcp_join.sh | 13 ++++++++++++-
 1 file changed, 12 insertions(+), 1 deletion(-)

diff --git a/tools/testing/selftests/net/mptcp/mptcp_join.sh b/tools/testing/selftests/net/mptcp/mptcp_join.sh
index 9bbb95837f73..327f4ace5153 100755
--- a/tools/testing/selftests/net/mptcp/mptcp_join.sh
+++ b/tools/testing/selftests/net/mptcp/mptcp_join.sh
@@ -2194,8 +2194,14 @@ all_tests()
 	userspace_tests
 }
 
+# [$1: error message]
 usage()
 {
+	if [ -n "${1}" ]; then
+		echo "${1}"
+		ret=1
+	fi
+
 	echo "mptcp_join usage:"
 	echo "  -f subflows_tests"
 	echo "  -e subflows_error_tests"
@@ -2217,6 +2223,8 @@ usage()
 	echo "  -C enable data checksum"
 	echo "  -i use ip mptcp"
 	echo "  -h help"
+
+	exit ${ret}
 }
 
 sin=$(mktemp)
@@ -2308,9 +2316,12 @@ while getopts 'fesltra64bpkdmuchCSi' opt; do
 			;;
 		i)
 			;;
-		h | *)
+		h)
 			usage
 			;;
+		*)
+			usage "Unknown option: -${opt}"
+			;;
 	esac
 done
 
-- 
2.34.1


^ permalink raw reply related	[flat|nested] 20+ messages in thread

* [PATCH mptcp-next 3/9] selftests: mptcp: join: option to execute specific tests
  2022-02-09 21:25 [PATCH mptcp-next 0/9] Refactor mptcp_join.sh Matthieu Baerts
  2022-02-09 21:25 ` [PATCH mptcp-next 1/9] selftests: mptcp: join: allow running -cCi Matthieu Baerts
  2022-02-09 21:25 ` [PATCH mptcp-next 2/9] selftests: mptcp: join: exit after usage() Matthieu Baerts
@ 2022-02-09 21:25 ` Matthieu Baerts
  2022-02-10  0:36   ` Mat Martineau
  2022-02-09 21:25 ` [PATCH mptcp-next 4/9] selftests: mptcp: join: remove unused vars Matthieu Baerts
                   ` (6 subsequent siblings)
  9 siblings, 1 reply; 20+ messages in thread
From: Matthieu Baerts @ 2022-02-09 21:25 UTC (permalink / raw)
  To: mptcp; +Cc: Matthieu Baerts, Paolo Abeni

Often, it is needed to run one specific test.

There are options to run subgroups of tests but when only one fails, no
need to run all the subgroup. So far, the solution was to edit the
script to comment the tests that are not needed but that's not ideal.

Now, it is possible to run one specific test by giving the ID of the
tests that are going to be validated, e.g.

  ./mptcp_join.sh 36 37

This is cleaner and saves time.

Technically, the reset* functions now return 0 if the test can be
executed. This naturally creates sections per test in the code which is
also helpful to understand what a test is exactly doing.

Suggested-by: Paolo Abeni <pabeni@redhat.com>
Signed-off-by: Matthieu Baerts <matthieu.baerts@tessares.net>
---
 .../testing/selftests/net/mptcp/mptcp_join.sh | 1676 +++++++++--------
 1 file changed, 900 insertions(+), 776 deletions(-)

diff --git a/tools/testing/selftests/net/mptcp/mptcp_join.sh b/tools/testing/selftests/net/mptcp/mptcp_join.sh
index 327f4ace5153..2dc81646e326 100755
--- a/tools/testing/selftests/net/mptcp/mptcp_join.sh
+++ b/tools/testing/selftests/net/mptcp/mptcp_join.sh
@@ -20,6 +20,7 @@ check_invert=0
 do_all_tests=1
 
 TEST_COUNT=0
+ONLY_TESTS=()
 nr_blank=40
 
 # generated using "nfbpf_compile '(ip && (ip[54] & 0xf0) == 0x30) ||
@@ -110,15 +111,40 @@ cleanup()
 	cleanup_partial
 }
 
+skip_test()
+{
+	local i
+
+	if [ "${#ONLY_TESTS[@]}" -eq 0 ]; then
+		return 1
+	fi
+
+	for i in "${ONLY_TESTS[@]}"; do
+		if [ "${TEST_COUNT}" -eq "${i}" ]; then
+			return 1
+		fi
+	done
+
+	return 0
+}
+
 reset()
 {
+	TEST_COUNT=$((TEST_COUNT+1))
+
+	if skip_test; then
+		return 1
+	fi
+
 	cleanup_partial
 	init
+
+	return 0
 }
 
 reset_with_cookies()
 {
-	reset
+	reset || return 1
 
 	for netns in "$ns1" "$ns2";do
 		ip netns exec $netns sysctl -q net.ipv4.tcp_syncookies=2
@@ -135,7 +161,7 @@ reset_with_add_addr_timeout()
 		tables="ip6tables"
 	fi
 
-	reset
+	reset || return 1
 
 	ip netns exec $ns1 sysctl -q net.mptcp.add_addr_timeout=1
 	ip netns exec $ns2 $tables -A OUTPUT -p tcp \
@@ -150,7 +176,7 @@ reset_with_checksum()
 	local ns1_enable=$1
 	local ns2_enable=$2
 
-	reset
+	reset || return 1
 
 	ip netns exec $ns1 sysctl -q net.mptcp.checksum_enabled=$ns1_enable
 	ip netns exec $ns2 sysctl -q net.mptcp.checksum_enabled=$ns2_enable
@@ -161,7 +187,7 @@ reset_with_allow_join_id0()
 	local ns1_enable=$1
 	local ns2_enable=$2
 
-	reset
+	reset || return 1
 
 	ip netns exec $ns1 sysctl -q net.mptcp.allow_join_initial_addr_port=$ns1_enable
 	ip netns exec $ns2 sysctl -q net.mptcp.allow_join_initial_addr_port=$ns2_enable
@@ -403,8 +429,7 @@ do_transfer()
 	speed="$9"
 	sflags="${10}"
 
-	port=$((10000+$TEST_COUNT))
-	TEST_COUNT=$((TEST_COUNT+1))
+	port=$((10000+$TEST_COUNT-1))
 
 	:> "$cout"
 	:> "$sout"
@@ -1141,888 +1166,967 @@ wait_attempt_fail()
 
 subflows_tests()
 {
-	reset
-	run_tests $ns1 $ns2 10.0.1.1
-	chk_join_nr "no JOIN" "0" "0" "0"
+	if reset; then
+		run_tests $ns1 $ns2 10.0.1.1
+		chk_join_nr "no JOIN" "0" "0" "0"
+	fi
 
 	# subflow limited by client
-	reset
-	pm_nl_set_limits $ns1 0 0
-	pm_nl_set_limits $ns2 0 0
-	pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow
-	run_tests $ns1 $ns2 10.0.1.1
-	chk_join_nr "single subflow, limited by client" 0 0 0
+	if reset; then
+		pm_nl_set_limits $ns1 0 0
+		pm_nl_set_limits $ns2 0 0
+		pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow
+		run_tests $ns1 $ns2 10.0.1.1
+		chk_join_nr "single subflow, limited by client" 0 0 0
+	fi
 
 	# subflow limited by server
-	reset
-	pm_nl_set_limits $ns1 0 0
-	pm_nl_set_limits $ns2 0 1
-	pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow
-	run_tests $ns1 $ns2 10.0.1.1
-	chk_join_nr "single subflow, limited by server" 1 1 0
+	if reset; then
+		pm_nl_set_limits $ns1 0 0
+		pm_nl_set_limits $ns2 0 1
+		pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow
+		run_tests $ns1 $ns2 10.0.1.1
+		chk_join_nr "single subflow, limited by server" 1 1 0
+	fi
 
 	# subflow
-	reset
-	pm_nl_set_limits $ns1 0 1
-	pm_nl_set_limits $ns2 0 1
-	pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow
-	run_tests $ns1 $ns2 10.0.1.1
-	chk_join_nr "single subflow" 1 1 1
+	if reset; then
+		pm_nl_set_limits $ns1 0 1
+		pm_nl_set_limits $ns2 0 1
+		pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow
+		run_tests $ns1 $ns2 10.0.1.1
+		chk_join_nr "single subflow" 1 1 1
+	fi
 
 	# multiple subflows
-	reset
-	pm_nl_set_limits $ns1 0 2
-	pm_nl_set_limits $ns2 0 2
-	pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow
-	pm_nl_add_endpoint $ns2 10.0.2.2 flags subflow
-	run_tests $ns1 $ns2 10.0.1.1
-	chk_join_nr "multiple subflows" 2 2 2
+	if reset; then
+		pm_nl_set_limits $ns1 0 2
+		pm_nl_set_limits $ns2 0 2
+		pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow
+		pm_nl_add_endpoint $ns2 10.0.2.2 flags subflow
+		run_tests $ns1 $ns2 10.0.1.1
+		chk_join_nr "multiple subflows" 2 2 2
+	fi
 
 	# multiple subflows limited by server
-	reset
-	pm_nl_set_limits $ns1 0 1
-	pm_nl_set_limits $ns2 0 2
-	pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow
-	pm_nl_add_endpoint $ns2 10.0.2.2 flags subflow
-	run_tests $ns1 $ns2 10.0.1.1
-	chk_join_nr "multiple subflows, limited by server" 2 2 1
+	if reset; then
+		pm_nl_set_limits $ns1 0 1
+		pm_nl_set_limits $ns2 0 2
+		pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow
+		pm_nl_add_endpoint $ns2 10.0.2.2 flags subflow
+		run_tests $ns1 $ns2 10.0.1.1
+		chk_join_nr "multiple subflows, limited by server" 2 2 1
+	fi
 
 	# single subflow, dev
-	reset
-	pm_nl_set_limits $ns1 0 1
-	pm_nl_set_limits $ns2 0 1
-	pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow dev ns2eth3
-	run_tests $ns1 $ns2 10.0.1.1
-	chk_join_nr "single subflow, dev" 1 1 1
+	if reset; then
+		pm_nl_set_limits $ns1 0 1
+		pm_nl_set_limits $ns2 0 1
+		pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow dev ns2eth3
+		run_tests $ns1 $ns2 10.0.1.1
+		chk_join_nr "single subflow, dev" 1 1 1
+	fi
 }
 
 subflows_error_tests()
 {
 	# If a single subflow is configured, and matches the MPC src
 	# address, no additional subflow should be created
-	reset
-	pm_nl_set_limits $ns1 0 1
-	pm_nl_set_limits $ns2 0 1
-	pm_nl_add_endpoint $ns2 10.0.1.2 flags subflow
-	run_tests $ns1 $ns2 10.0.1.1 0 0 0 slow
-	chk_join_nr "no MPC reuse with single endpoint" 0 0 0
+	if reset; then
+		pm_nl_set_limits $ns1 0 1
+		pm_nl_set_limits $ns2 0 1
+		pm_nl_add_endpoint $ns2 10.0.1.2 flags subflow
+		run_tests $ns1 $ns2 10.0.1.1 0 0 0 slow
+		chk_join_nr "no MPC reuse with single endpoint" 0 0 0
+	fi
 
 	# multiple subflows, with subflow creation error
-	reset
-	pm_nl_set_limits $ns1 0 2
-	pm_nl_set_limits $ns2 0 2
-	pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow
-	pm_nl_add_endpoint $ns2 10.0.2.2 flags subflow
-	ip netns exec $ns1 iptables -A INPUT -s 10.0.3.2 -p tcp -j REJECT
-	run_tests $ns1 $ns2 10.0.1.1 0 0 0 slow
-	chk_join_nr "multi subflows, with failing subflow" 1 1 1
+	if reset; then
+		pm_nl_set_limits $ns1 0 2
+		pm_nl_set_limits $ns2 0 2
+		pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow
+		pm_nl_add_endpoint $ns2 10.0.2.2 flags subflow
+		ip netns exec $ns1 iptables -A INPUT -s 10.0.3.2 -p tcp -j REJECT
+		run_tests $ns1 $ns2 10.0.1.1 0 0 0 slow
+		chk_join_nr "multi subflows, with failing subflow" 1 1 1
+	fi
 
 	# multiple subflows, with subflow timeout on MPJ
-	reset
-	pm_nl_set_limits $ns1 0 2
-	pm_nl_set_limits $ns2 0 2
-	pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow
-	pm_nl_add_endpoint $ns2 10.0.2.2 flags subflow
-	ip netns exec $ns1 iptables -A INPUT -s 10.0.3.2 -p tcp -j DROP
-	run_tests $ns1 $ns2 10.0.1.1 0 0 0 slow
-	chk_join_nr "multi subflows, with subflow timeout" 1 1 1
+	if reset; then
+		pm_nl_set_limits $ns1 0 2
+		pm_nl_set_limits $ns2 0 2
+		pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow
+		pm_nl_add_endpoint $ns2 10.0.2.2 flags subflow
+		ip netns exec $ns1 iptables -A INPUT -s 10.0.3.2 -p tcp -j DROP
+		run_tests $ns1 $ns2 10.0.1.1 0 0 0 slow
+		chk_join_nr "multi subflows, with subflow timeout" 1 1 1
+	fi
 
 	# multiple subflows, check that the endpoint corresponding to
 	# closed subflow (due to reset) is not reused if additional
 	# subflows are added later
-	reset
-	pm_nl_set_limits $ns1 0 1
-	pm_nl_set_limits $ns2 0 1
-	pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow
-	ip netns exec $ns1 iptables -A INPUT -s 10.0.3.2 -p tcp -j REJECT
-	run_tests $ns1 $ns2 10.0.1.1 0 0 0 slow &
-
-	# updates in the child shell do not have any effect here, we
-	# need to bump the test counter for the above case
-	TEST_COUNT=$((TEST_COUNT+1))
-
-	# mpj subflow will be in TW after the reset
-	wait_attempt_fail $ns2
-	pm_nl_add_endpoint $ns2 10.0.2.2 flags subflow
-	wait
-
-	# additional subflow could be created only if the PM select
-	# the later endpoint, skipping the already used one
-	chk_join_nr "multi subflows, fair usage on close" 1 1 1
+	if reset; then
+		pm_nl_set_limits $ns1 0 1
+		pm_nl_set_limits $ns2 0 1
+		pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow
+		ip netns exec $ns1 iptables -A INPUT -s 10.0.3.2 -p tcp -j REJECT
+		run_tests $ns1 $ns2 10.0.1.1 0 0 0 slow &
+
+		# mpj subflow will be in TW after the reset
+		wait_attempt_fail $ns2
+		pm_nl_add_endpoint $ns2 10.0.2.2 flags subflow
+		wait
+
+		# additional subflow could be created only if the PM select
+		# the later endpoint, skipping the already used one
+		chk_join_nr "multi subflows, fair usage on close" 1 1 1
+	fi
 }
 
 signal_address_tests()
 {
 	# add_address, unused
-	reset
-	pm_nl_add_endpoint $ns1 10.0.2.1 flags signal
-	run_tests $ns1 $ns2 10.0.1.1
-	chk_join_nr "unused signal address" 0 0 0
-	chk_add_nr 1 1
+	if reset; then
+		pm_nl_add_endpoint $ns1 10.0.2.1 flags signal
+		run_tests $ns1 $ns2 10.0.1.1
+		chk_join_nr "unused signal address" 0 0 0
+		chk_add_nr 1 1
+	fi
 
 	# accept and use add_addr
-	reset
-	pm_nl_set_limits $ns1 0 1
-	pm_nl_set_limits $ns2 1 1
-	pm_nl_add_endpoint $ns1 10.0.2.1 flags signal
-	run_tests $ns1 $ns2 10.0.1.1
-	chk_join_nr "signal address" 1 1 1
-	chk_add_nr 1 1
+	if reset; then
+		pm_nl_set_limits $ns1 0 1
+		pm_nl_set_limits $ns2 1 1
+		pm_nl_add_endpoint $ns1 10.0.2.1 flags signal
+		run_tests $ns1 $ns2 10.0.1.1
+		chk_join_nr "signal address" 1 1 1
+		chk_add_nr 1 1
+	fi
 
 	# accept and use add_addr with an additional subflow
 	# note: signal address in server ns and local addresses in client ns must
 	# belong to different subnets or one of the listed local address could be
 	# used for 'add_addr' subflow
-	reset
-	pm_nl_add_endpoint $ns1 10.0.2.1 flags signal
-	pm_nl_set_limits $ns1 0 2
-	pm_nl_set_limits $ns2 1 2
-	pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow
-	run_tests $ns1 $ns2 10.0.1.1
-	chk_join_nr "subflow and signal" 2 2 2
-	chk_add_nr 1 1
+	if reset; then
+		pm_nl_add_endpoint $ns1 10.0.2.1 flags signal
+		pm_nl_set_limits $ns1 0 2
+		pm_nl_set_limits $ns2 1 2
+		pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow
+		run_tests $ns1 $ns2 10.0.1.1
+		chk_join_nr "subflow and signal" 2 2 2
+		chk_add_nr 1 1
+	fi
 
 	# accept and use add_addr with additional subflows
-	reset
-	pm_nl_set_limits $ns1 0 3
-	pm_nl_add_endpoint $ns1 10.0.2.1 flags signal
-	pm_nl_set_limits $ns2 1 3
-	pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow
-	pm_nl_add_endpoint $ns2 10.0.4.2 flags subflow
-	run_tests $ns1 $ns2 10.0.1.1
-	chk_join_nr "multiple subflows and signal" 3 3 3
-	chk_add_nr 1 1
+	if reset; then
+		pm_nl_set_limits $ns1 0 3
+		pm_nl_add_endpoint $ns1 10.0.2.1 flags signal
+		pm_nl_set_limits $ns2 1 3
+		pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow
+		pm_nl_add_endpoint $ns2 10.0.4.2 flags subflow
+		run_tests $ns1 $ns2 10.0.1.1
+		chk_join_nr "multiple subflows and signal" 3 3 3
+		chk_add_nr 1 1
+	fi
 
 	# signal addresses
-	reset
-	pm_nl_set_limits $ns1 3 3
-	pm_nl_add_endpoint $ns1 10.0.2.1 flags signal
-	pm_nl_add_endpoint $ns1 10.0.3.1 flags signal
-	pm_nl_add_endpoint $ns1 10.0.4.1 flags signal
-	pm_nl_set_limits $ns2 3 3
-	run_tests $ns1 $ns2 10.0.1.1
-	chk_join_nr "signal addresses" 3 3 3
-	chk_add_nr 3 3
+	if reset; then
+		pm_nl_set_limits $ns1 3 3
+		pm_nl_add_endpoint $ns1 10.0.2.1 flags signal
+		pm_nl_add_endpoint $ns1 10.0.3.1 flags signal
+		pm_nl_add_endpoint $ns1 10.0.4.1 flags signal
+		pm_nl_set_limits $ns2 3 3
+		run_tests $ns1 $ns2 10.0.1.1
+		chk_join_nr "signal addresses" 3 3 3
+		chk_add_nr 3 3
+	fi
 
 	# signal invalid addresses
-	reset
-	pm_nl_set_limits $ns1 3 3
-	pm_nl_add_endpoint $ns1 10.0.12.1 flags signal
-	pm_nl_add_endpoint $ns1 10.0.3.1 flags signal
-	pm_nl_add_endpoint $ns1 10.0.14.1 flags signal
-	pm_nl_set_limits $ns2 3 3
-	run_tests $ns1 $ns2 10.0.1.1
-	chk_join_nr "signal invalid addresses" 1 1 1
-	chk_add_nr 3 3
+	if reset; then
+		pm_nl_set_limits $ns1 3 3
+		pm_nl_add_endpoint $ns1 10.0.12.1 flags signal
+		pm_nl_add_endpoint $ns1 10.0.3.1 flags signal
+		pm_nl_add_endpoint $ns1 10.0.14.1 flags signal
+		pm_nl_set_limits $ns2 3 3
+		run_tests $ns1 $ns2 10.0.1.1
+		chk_join_nr "signal invalid addresses" 1 1 1
+		chk_add_nr 3 3
+	fi
 
 	# signal addresses race test
-	reset
-
-	pm_nl_set_limits $ns1 4 4
-	pm_nl_set_limits $ns2 4 4
-	pm_nl_add_endpoint $ns1 10.0.1.1 flags signal
-	pm_nl_add_endpoint $ns1 10.0.2.1 flags signal
-	pm_nl_add_endpoint $ns1 10.0.3.1 flags signal
-	pm_nl_add_endpoint $ns1 10.0.4.1 flags signal
-	pm_nl_add_endpoint $ns2 10.0.1.2 flags signal
-	pm_nl_add_endpoint $ns2 10.0.2.2 flags signal
-	pm_nl_add_endpoint $ns2 10.0.3.2 flags signal
-	pm_nl_add_endpoint $ns2 10.0.4.2 flags signal
-
-	# the peer could possibly miss some addr notification, allow retransmission
-	ip netns exec $ns1 sysctl -q net.mptcp.add_addr_timeout=1
-	run_tests $ns1 $ns2 10.0.1.1 0 0 0 slow
-	chk_join_nr "signal addresses race test" 3 3 3
-
-	# the server will not signal the address terminating
-	# the MPC subflow
-	chk_add_nr 3 3
+	if reset; then
+		pm_nl_set_limits $ns1 4 4
+		pm_nl_set_limits $ns2 4 4
+		pm_nl_add_endpoint $ns1 10.0.1.1 flags signal
+		pm_nl_add_endpoint $ns1 10.0.2.1 flags signal
+		pm_nl_add_endpoint $ns1 10.0.3.1 flags signal
+		pm_nl_add_endpoint $ns1 10.0.4.1 flags signal
+		pm_nl_add_endpoint $ns2 10.0.1.2 flags signal
+		pm_nl_add_endpoint $ns2 10.0.2.2 flags signal
+		pm_nl_add_endpoint $ns2 10.0.3.2 flags signal
+		pm_nl_add_endpoint $ns2 10.0.4.2 flags signal
+
+		# the peer could possibly miss some addr notification, allow retransmission
+		ip netns exec $ns1 sysctl -q net.mptcp.add_addr_timeout=1
+		run_tests $ns1 $ns2 10.0.1.1 0 0 0 slow
+		chk_join_nr "signal addresses race test" 3 3 3
+
+		# the server will not signal the address terminating
+		# the MPC subflow
+		chk_add_nr 3 3
+	fi
 }
 
 link_failure_tests()
 {
 	# accept and use add_addr with additional subflows and link loss
-	reset
-
-	# without any b/w limit each veth could spool the packets and get
-	# them acked at xmit time, so that the corresponding subflow will
-	# have almost always no outstanding pkts, the scheduler will pick
-	# always the first subflow and we will have hard time testing
-	# active backup and link switch-over.
-	# Let's set some arbitrary (low) virtual link limits.
-	init_shapers
-	pm_nl_set_limits $ns1 0 3
-	pm_nl_add_endpoint $ns1 10.0.2.1 dev ns1eth2 flags signal
-	pm_nl_set_limits $ns2 1 3
-	pm_nl_add_endpoint $ns2 10.0.3.2 dev ns2eth3 flags subflow
-	pm_nl_add_endpoint $ns2 10.0.4.2 dev ns2eth4 flags subflow
-	run_tests $ns1 $ns2 10.0.1.1 1
-	chk_join_nr "multiple flows, signal, link failure" 3 3 3
-	chk_add_nr 1 1
-	chk_stale_nr $ns2 1 5 1
+	if reset; then
+		# without any b/w limit each veth could spool the packets and get
+		# them acked at xmit time, so that the corresponding subflow will
+		# have almost always no outstanding pkts, the scheduler will pick
+		# always the first subflow and we will have hard time testing
+		# active backup and link switch-over.
+		# Let's set some arbitrary (low) virtual link limits.
+		init_shapers
+		pm_nl_set_limits $ns1 0 3
+		pm_nl_add_endpoint $ns1 10.0.2.1 dev ns1eth2 flags signal
+		pm_nl_set_limits $ns2 1 3
+		pm_nl_add_endpoint $ns2 10.0.3.2 dev ns2eth3 flags subflow
+		pm_nl_add_endpoint $ns2 10.0.4.2 dev ns2eth4 flags subflow
+		run_tests $ns1 $ns2 10.0.1.1 1
+		chk_join_nr "multiple flows, signal, link failure" 3 3 3
+		chk_add_nr 1 1
+		chk_stale_nr $ns2 1 5 1
+	fi
 
 	# accept and use add_addr with additional subflows and link loss
 	# for bidirectional transfer
-	reset
-	init_shapers
-	pm_nl_set_limits $ns1 0 3
-	pm_nl_add_endpoint $ns1 10.0.2.1 dev ns1eth2 flags signal
-	pm_nl_set_limits $ns2 1 3
-	pm_nl_add_endpoint $ns2 10.0.3.2 dev ns2eth3 flags subflow
-	pm_nl_add_endpoint $ns2 10.0.4.2 dev ns2eth4 flags subflow
-	run_tests $ns1 $ns2 10.0.1.1 2
-	chk_join_nr "multi flows, signal, bidi, link fail" 3 3 3
-	chk_add_nr 1 1
-	chk_stale_nr $ns2 1 -1 1
+	if reset; then
+		init_shapers
+		pm_nl_set_limits $ns1 0 3
+		pm_nl_add_endpoint $ns1 10.0.2.1 dev ns1eth2 flags signal
+		pm_nl_set_limits $ns2 1 3
+		pm_nl_add_endpoint $ns2 10.0.3.2 dev ns2eth3 flags subflow
+		pm_nl_add_endpoint $ns2 10.0.4.2 dev ns2eth4 flags subflow
+		run_tests $ns1 $ns2 10.0.1.1 2
+		chk_join_nr "multi flows, signal, bidi, link fail" 3 3 3
+		chk_add_nr 1 1
+		chk_stale_nr $ns2 1 -1 1
+	fi
 
 	# 2 subflows plus 1 backup subflow with a lossy link, backup
 	# will never be used
-	reset
-	init_shapers
-	pm_nl_set_limits $ns1 0 2
-	pm_nl_add_endpoint $ns1 10.0.2.1 dev ns1eth2 flags signal
-	pm_nl_set_limits $ns2 1 2
-	export FAILING_LINKS="1"
-	pm_nl_add_endpoint $ns2 10.0.3.2 dev ns2eth3 flags subflow,backup
-	run_tests $ns1 $ns2 10.0.1.1 1
-	chk_join_nr "backup subflow unused, link failure" 2 2 2
-	chk_add_nr 1 1
-	chk_link_usage $ns2 ns2eth3 $cinsent 0
+	if reset; then
+		init_shapers
+		pm_nl_set_limits $ns1 0 2
+		pm_nl_add_endpoint $ns1 10.0.2.1 dev ns1eth2 flags signal
+		pm_nl_set_limits $ns2 1 2
+		export FAILING_LINKS="1"
+		pm_nl_add_endpoint $ns2 10.0.3.2 dev ns2eth3 flags subflow,backup
+		run_tests $ns1 $ns2 10.0.1.1 1
+		chk_join_nr "backup subflow unused, link failure" 2 2 2
+		chk_add_nr 1 1
+		chk_link_usage $ns2 ns2eth3 $cinsent 0
+	fi
 
 	# 2 lossy links after half transfer, backup will get half of
 	# the traffic
-	reset
-	init_shapers
-	pm_nl_set_limits $ns1 0 2
-	pm_nl_add_endpoint $ns1 10.0.2.1 dev ns1eth2 flags signal
-	pm_nl_set_limits $ns2 1 2
-	pm_nl_add_endpoint $ns2 10.0.3.2 dev ns2eth3 flags subflow,backup
-	export FAILING_LINKS="1 2"
-	run_tests $ns1 $ns2 10.0.1.1 1
-	chk_join_nr "backup flow used, multi links fail" 2 2 2
-	chk_add_nr 1 1
-	chk_stale_nr $ns2 2 4 2
-	chk_link_usage $ns2 ns2eth3 $cinsent 50
+	if reset; then
+		init_shapers
+		pm_nl_set_limits $ns1 0 2
+		pm_nl_add_endpoint $ns1 10.0.2.1 dev ns1eth2 flags signal
+		pm_nl_set_limits $ns2 1 2
+		pm_nl_add_endpoint $ns2 10.0.3.2 dev ns2eth3 flags subflow,backup
+		export FAILING_LINKS="1 2"
+		run_tests $ns1 $ns2 10.0.1.1 1
+		chk_join_nr "backup flow used, multi links fail" 2 2 2
+		chk_add_nr 1 1
+		chk_stale_nr $ns2 2 4 2
+		chk_link_usage $ns2 ns2eth3 $cinsent 50
+	fi
 
 	# use a backup subflow with the first subflow on a lossy link
 	# for bidirectional transfer
-	reset
-	init_shapers
-	pm_nl_set_limits $ns1 0 2
-	pm_nl_add_endpoint $ns1 10.0.2.1 dev ns1eth2 flags signal
-	pm_nl_set_limits $ns2 1 3
-	pm_nl_add_endpoint $ns2 10.0.3.2 dev ns2eth3 flags subflow,backup
-	run_tests $ns1 $ns2 10.0.1.1 2
-	chk_join_nr "backup flow used, bidi, link failure" 2 2 2
-	chk_add_nr 1 1
-	chk_stale_nr $ns2 1 -1 2
-	chk_link_usage $ns2 ns2eth3 $cinsent 50
+	if reset; then
+		init_shapers
+		pm_nl_set_limits $ns1 0 2
+		pm_nl_add_endpoint $ns1 10.0.2.1 dev ns1eth2 flags signal
+		pm_nl_set_limits $ns2 1 3
+		pm_nl_add_endpoint $ns2 10.0.3.2 dev ns2eth3 flags subflow,backup
+		run_tests $ns1 $ns2 10.0.1.1 2
+		chk_join_nr "backup flow used, bidi, link failure" 2 2 2
+		chk_add_nr 1 1
+		chk_stale_nr $ns2 1 -1 2
+		chk_link_usage $ns2 ns2eth3 $cinsent 50
+	fi
 }
 
 add_addr_timeout_tests()
 {
 	# add_addr timeout
-	reset_with_add_addr_timeout
-	pm_nl_set_limits $ns1 0 1
-	pm_nl_set_limits $ns2 1 1
-	pm_nl_add_endpoint $ns1 10.0.2.1 flags signal
-	run_tests $ns1 $ns2 10.0.1.1 0 0 0 slow
-	chk_join_nr "signal address, ADD_ADDR timeout" 1 1 1
-	chk_add_nr 4 0
+	if reset_with_add_addr_timeout; then
+		pm_nl_set_limits $ns1 0 1
+		pm_nl_set_limits $ns2 1 1
+		pm_nl_add_endpoint $ns1 10.0.2.1 flags signal
+		run_tests $ns1 $ns2 10.0.1.1 0 0 0 slow
+		chk_join_nr "signal address, ADD_ADDR timeout" 1 1 1
+		chk_add_nr 4 0
+	fi
 
 	# add_addr timeout IPv6
-	reset_with_add_addr_timeout 6
-	pm_nl_set_limits $ns1 0 1
-	pm_nl_set_limits $ns2 1 1
-	pm_nl_add_endpoint $ns1 dead:beef:2::1 flags signal
-	run_tests $ns1 $ns2 dead:beef:1::1 0 0 0 slow
-	chk_join_nr "signal address, ADD_ADDR6 timeout" 1 1 1
-	chk_add_nr 4 0
+	if reset_with_add_addr_timeout 6; then
+		pm_nl_set_limits $ns1 0 1
+		pm_nl_set_limits $ns2 1 1
+		pm_nl_add_endpoint $ns1 dead:beef:2::1 flags signal
+		run_tests $ns1 $ns2 dead:beef:1::1 0 0 0 slow
+		chk_join_nr "signal address, ADD_ADDR6 timeout" 1 1 1
+		chk_add_nr 4 0
+	fi
 
 	# signal addresses timeout
-	reset_with_add_addr_timeout
-	pm_nl_set_limits $ns1 2 2
-	pm_nl_add_endpoint $ns1 10.0.2.1 flags signal
-	pm_nl_add_endpoint $ns1 10.0.3.1 flags signal
-	pm_nl_set_limits $ns2 2 2
-	run_tests $ns1 $ns2 10.0.1.1 0 0 0 least
-	chk_join_nr "signal addresses, ADD_ADDR timeout" 2 2 2
-	chk_add_nr 8 0
+	if reset_with_add_addr_timeout; then
+		pm_nl_set_limits $ns1 2 2
+		pm_nl_add_endpoint $ns1 10.0.2.1 flags signal
+		pm_nl_add_endpoint $ns1 10.0.3.1 flags signal
+		pm_nl_set_limits $ns2 2 2
+		run_tests $ns1 $ns2 10.0.1.1 0 0 0 least
+		chk_join_nr "signal addresses, ADD_ADDR timeout" 2 2 2
+		chk_add_nr 8 0
+	fi
 
 	# signal invalid addresses timeout
-	reset_with_add_addr_timeout
-	pm_nl_set_limits $ns1 2 2
-	pm_nl_add_endpoint $ns1 10.0.12.1 flags signal
-	pm_nl_add_endpoint $ns1 10.0.3.1 flags signal
-	pm_nl_set_limits $ns2 2 2
-	run_tests $ns1 $ns2 10.0.1.1 0 0 0 least
-	chk_join_nr "invalid address, ADD_ADDR timeout" 1 1 1
-	chk_add_nr 8 0
+	if reset_with_add_addr_timeout; then
+		pm_nl_set_limits $ns1 2 2
+		pm_nl_add_endpoint $ns1 10.0.12.1 flags signal
+		pm_nl_add_endpoint $ns1 10.0.3.1 flags signal
+		pm_nl_set_limits $ns2 2 2
+		run_tests $ns1 $ns2 10.0.1.1 0 0 0 least
+		chk_join_nr "invalid address, ADD_ADDR timeout" 1 1 1
+		chk_add_nr 8 0
+	fi
 }
 
 remove_tests()
 {
 	# single subflow, remove
-	reset
-	pm_nl_set_limits $ns1 0 1
-	pm_nl_set_limits $ns2 0 1
-	pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow
-	run_tests $ns1 $ns2 10.0.1.1 0 0 -1 slow
-	chk_join_nr "remove single subflow" 1 1 1
-	chk_rm_nr 1 1
+	if reset; then
+		pm_nl_set_limits $ns1 0 1
+		pm_nl_set_limits $ns2 0 1
+		pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow
+		run_tests $ns1 $ns2 10.0.1.1 0 0 -1 slow
+		chk_join_nr "remove single subflow" 1 1 1
+		chk_rm_nr 1 1
+	fi
 
 	# multiple subflows, remove
-	reset
-	pm_nl_set_limits $ns1 0 2
-	pm_nl_set_limits $ns2 0 2
-	pm_nl_add_endpoint $ns2 10.0.2.2 flags subflow
-	pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow
-	run_tests $ns1 $ns2 10.0.1.1 0 0 -2 slow
-	chk_join_nr "remove multiple subflows" 2 2 2
-	chk_rm_nr 2 2
+	if reset; then
+		pm_nl_set_limits $ns1 0 2
+		pm_nl_set_limits $ns2 0 2
+		pm_nl_add_endpoint $ns2 10.0.2.2 flags subflow
+		pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow
+		run_tests $ns1 $ns2 10.0.1.1 0 0 -2 slow
+		chk_join_nr "remove multiple subflows" 2 2 2
+		chk_rm_nr 2 2
+	fi
 
 	# single address, remove
-	reset
-	pm_nl_set_limits $ns1 0 1
-	pm_nl_add_endpoint $ns1 10.0.2.1 flags signal
-	pm_nl_set_limits $ns2 1 1
-	run_tests $ns1 $ns2 10.0.1.1 0 -1 0 slow
-	chk_join_nr "remove single address" 1 1 1
-	chk_add_nr 1 1
-	chk_rm_nr 1 1 invert
+	if reset; then
+		pm_nl_set_limits $ns1 0 1
+		pm_nl_add_endpoint $ns1 10.0.2.1 flags signal
+		pm_nl_set_limits $ns2 1 1
+		run_tests $ns1 $ns2 10.0.1.1 0 -1 0 slow
+		chk_join_nr "remove single address" 1 1 1
+		chk_add_nr 1 1
+		chk_rm_nr 1 1 invert
+	fi
 
 	# subflow and signal, remove
-	reset
-	pm_nl_set_limits $ns1 0 2
-	pm_nl_add_endpoint $ns1 10.0.2.1 flags signal
-	pm_nl_set_limits $ns2 1 2
-	pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow
-	run_tests $ns1 $ns2 10.0.1.1 0 -1 -1 slow
-	chk_join_nr "remove subflow and signal" 2 2 2
-	chk_add_nr 1 1
-	chk_rm_nr 1 1
+	if reset; then
+		pm_nl_set_limits $ns1 0 2
+		pm_nl_add_endpoint $ns1 10.0.2.1 flags signal
+		pm_nl_set_limits $ns2 1 2
+		pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow
+		run_tests $ns1 $ns2 10.0.1.1 0 -1 -1 slow
+		chk_join_nr "remove subflow and signal" 2 2 2
+		chk_add_nr 1 1
+		chk_rm_nr 1 1
+	fi
 
 	# subflows and signal, remove
-	reset
-	pm_nl_set_limits $ns1 0 3
-	pm_nl_add_endpoint $ns1 10.0.2.1 flags signal
-	pm_nl_set_limits $ns2 1 3
-	pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow
-	pm_nl_add_endpoint $ns2 10.0.4.2 flags subflow
-	run_tests $ns1 $ns2 10.0.1.1 0 -1 -2 slow
-	chk_join_nr "remove subflows and signal" 3 3 3
-	chk_add_nr 1 1
-	chk_rm_nr 2 2
+	if reset; then
+		pm_nl_set_limits $ns1 0 3
+		pm_nl_add_endpoint $ns1 10.0.2.1 flags signal
+		pm_nl_set_limits $ns2 1 3
+		pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow
+		pm_nl_add_endpoint $ns2 10.0.4.2 flags subflow
+		run_tests $ns1 $ns2 10.0.1.1 0 -1 -2 slow
+		chk_join_nr "remove subflows and signal" 3 3 3
+		chk_add_nr 1 1
+		chk_rm_nr 2 2
+	fi
 
 	# addresses remove
-	reset
-	pm_nl_set_limits $ns1 3 3
-	pm_nl_add_endpoint $ns1 10.0.2.1 flags signal id 250
-	pm_nl_add_endpoint $ns1 10.0.3.1 flags signal
-	pm_nl_add_endpoint $ns1 10.0.4.1 flags signal
-	pm_nl_set_limits $ns2 3 3
-	run_tests $ns1 $ns2 10.0.1.1 0 -3 0 slow
-	chk_join_nr "remove addresses" 3 3 3
-	chk_add_nr 3 3
-	chk_rm_nr 3 3 invert
+	if reset; then
+		pm_nl_set_limits $ns1 3 3
+		pm_nl_add_endpoint $ns1 10.0.2.1 flags signal id 250
+		pm_nl_add_endpoint $ns1 10.0.3.1 flags signal
+		pm_nl_add_endpoint $ns1 10.0.4.1 flags signal
+		pm_nl_set_limits $ns2 3 3
+		run_tests $ns1 $ns2 10.0.1.1 0 -3 0 slow
+		chk_join_nr "remove addresses" 3 3 3
+		chk_add_nr 3 3
+		chk_rm_nr 3 3 invert
+	fi
 
 	# invalid addresses remove
-	reset
-	pm_nl_set_limits $ns1 3 3
-	pm_nl_add_endpoint $ns1 10.0.12.1 flags signal
-	pm_nl_add_endpoint $ns1 10.0.3.1 flags signal
-	pm_nl_add_endpoint $ns1 10.0.14.1 flags signal
-	pm_nl_set_limits $ns2 3 3
-	run_tests $ns1 $ns2 10.0.1.1 0 -3 0 slow
-	chk_join_nr "remove invalid addresses" 1 1 1
-	chk_add_nr 3 3
-	chk_rm_nr 3 1 invert
+	if reset; then
+		pm_nl_set_limits $ns1 3 3
+		pm_nl_add_endpoint $ns1 10.0.12.1 flags signal
+		pm_nl_add_endpoint $ns1 10.0.3.1 flags signal
+		pm_nl_add_endpoint $ns1 10.0.14.1 flags signal
+		pm_nl_set_limits $ns2 3 3
+		run_tests $ns1 $ns2 10.0.1.1 0 -3 0 slow
+		chk_join_nr "remove invalid addresses" 1 1 1
+		chk_add_nr 3 3
+		chk_rm_nr 3 1 invert
+	fi
 
 	# subflows and signal, flush
-	reset
-	pm_nl_set_limits $ns1 0 3
-	pm_nl_add_endpoint $ns1 10.0.2.1 flags signal
-	pm_nl_set_limits $ns2 1 3
-	pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow
-	pm_nl_add_endpoint $ns2 10.0.4.2 flags subflow
-	run_tests $ns1 $ns2 10.0.1.1 0 -8 -8 slow
-	chk_join_nr "flush subflows and signal" 3 3 3
-	chk_add_nr 1 1
-	chk_rm_nr 2 2
+	if reset; then
+		pm_nl_set_limits $ns1 0 3
+		pm_nl_add_endpoint $ns1 10.0.2.1 flags signal
+		pm_nl_set_limits $ns2 1 3
+		pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow
+		pm_nl_add_endpoint $ns2 10.0.4.2 flags subflow
+		run_tests $ns1 $ns2 10.0.1.1 0 -8 -8 slow
+		chk_join_nr "flush subflows and signal" 3 3 3
+		chk_add_nr 1 1
+		chk_rm_nr 2 2
+	fi
 
 	# subflows flush
-	reset
-	pm_nl_set_limits $ns1 3 3
-	pm_nl_set_limits $ns2 3 3
-	pm_nl_add_endpoint $ns2 10.0.2.2 flags subflow id 150
-	pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow
-	pm_nl_add_endpoint $ns2 10.0.4.2 flags subflow
-	run_tests $ns1 $ns2 10.0.1.1 0 -8 -8 slow
-	chk_join_nr "flush subflows" 3 3 3
-	chk_rm_nr 3 3
+	if reset; then
+		pm_nl_set_limits $ns1 3 3
+		pm_nl_set_limits $ns2 3 3
+		pm_nl_add_endpoint $ns2 10.0.2.2 flags subflow id 150
+		pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow
+		pm_nl_add_endpoint $ns2 10.0.4.2 flags subflow
+		run_tests $ns1 $ns2 10.0.1.1 0 -8 -8 slow
+		chk_join_nr "flush subflows" 3 3 3
+		chk_rm_nr 3 3
+	fi
 
 	# addresses flush
-	reset
-	pm_nl_set_limits $ns1 3 3
-	pm_nl_add_endpoint $ns1 10.0.2.1 flags signal id 250
-	pm_nl_add_endpoint $ns1 10.0.3.1 flags signal
-	pm_nl_add_endpoint $ns1 10.0.4.1 flags signal
-	pm_nl_set_limits $ns2 3 3
-	run_tests $ns1 $ns2 10.0.1.1 0 -8 -8 slow
-	chk_join_nr "flush addresses" 3 3 3
-	chk_add_nr 3 3
-	chk_rm_nr 3 3 invert
+	if reset; then
+		pm_nl_set_limits $ns1 3 3
+		pm_nl_add_endpoint $ns1 10.0.2.1 flags signal id 250
+		pm_nl_add_endpoint $ns1 10.0.3.1 flags signal
+		pm_nl_add_endpoint $ns1 10.0.4.1 flags signal
+		pm_nl_set_limits $ns2 3 3
+		run_tests $ns1 $ns2 10.0.1.1 0 -8 -8 slow
+		chk_join_nr "flush addresses" 3 3 3
+		chk_add_nr 3 3
+		chk_rm_nr 3 3 invert
+	fi
 
 	# invalid addresses flush
-	reset
-	pm_nl_set_limits $ns1 3 3
-	pm_nl_add_endpoint $ns1 10.0.12.1 flags signal
-	pm_nl_add_endpoint $ns1 10.0.3.1 flags signal
-	pm_nl_add_endpoint $ns1 10.0.14.1 flags signal
-	pm_nl_set_limits $ns2 3 3
-	run_tests $ns1 $ns2 10.0.1.1 0 -8 0 slow
-	chk_join_nr "flush invalid addresses" 1 1 1
-	chk_add_nr 3 3
-	chk_rm_nr 3 1 invert
+	if reset; then
+		pm_nl_set_limits $ns1 3 3
+		pm_nl_add_endpoint $ns1 10.0.12.1 flags signal
+		pm_nl_add_endpoint $ns1 10.0.3.1 flags signal
+		pm_nl_add_endpoint $ns1 10.0.14.1 flags signal
+		pm_nl_set_limits $ns2 3 3
+		run_tests $ns1 $ns2 10.0.1.1 0 -8 0 slow
+		chk_join_nr "flush invalid addresses" 1 1 1
+		chk_add_nr 3 3
+		chk_rm_nr 3 1 invert
+	fi
 
 	# remove id 0 subflow
-	reset
-	pm_nl_set_limits $ns1 0 1
-	pm_nl_set_limits $ns2 0 1
-	pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow
-	run_tests $ns1 $ns2 10.0.1.1 0 0 -9 slow
-	chk_join_nr "remove id 0 subflow" 1 1 1
-	chk_rm_nr 1 1
+	if reset; then
+		pm_nl_set_limits $ns1 0 1
+		pm_nl_set_limits $ns2 0 1
+		pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow
+		run_tests $ns1 $ns2 10.0.1.1 0 0 -9 slow
+		chk_join_nr "remove id 0 subflow" 1 1 1
+		chk_rm_nr 1 1
+	fi
 
 	# remove id 0 address
-	reset
-	pm_nl_set_limits $ns1 0 1
-	pm_nl_add_endpoint $ns1 10.0.2.1 flags signal
-	pm_nl_set_limits $ns2 1 1
-	run_tests $ns1 $ns2 10.0.1.1 0 -9 0 slow
-	chk_join_nr "remove id 0 address" 1 1 1
-	chk_add_nr 1 1
-	chk_rm_nr 1 1 invert
+	if reset; then
+		pm_nl_set_limits $ns1 0 1
+		pm_nl_add_endpoint $ns1 10.0.2.1 flags signal
+		pm_nl_set_limits $ns2 1 1
+		run_tests $ns1 $ns2 10.0.1.1 0 -9 0 slow
+		chk_join_nr "remove id 0 address" 1 1 1
+		chk_add_nr 1 1
+		chk_rm_nr 1 1 invert
+	fi
 }
 
 add_tests()
 {
 	# add single subflow
-	reset
-	pm_nl_set_limits $ns1 0 1
-	pm_nl_set_limits $ns2 0 1
-	run_tests $ns1 $ns2 10.0.1.1 0 0 1 slow
-	chk_join_nr "add single subflow" 1 1 1
+	if reset; then
+		pm_nl_set_limits $ns1 0 1
+		pm_nl_set_limits $ns2 0 1
+		run_tests $ns1 $ns2 10.0.1.1 0 0 1 slow
+		chk_join_nr "add single subflow" 1 1 1
+	fi
 
 	# add signal address
-	reset
-	pm_nl_set_limits $ns1 0 1
-	pm_nl_set_limits $ns2 1 1
-	run_tests $ns1 $ns2 10.0.1.1 0 1 0 slow
-	chk_join_nr "add signal address" 1 1 1
-	chk_add_nr 1 1
+	if reset; then
+		pm_nl_set_limits $ns1 0 1
+		pm_nl_set_limits $ns2 1 1
+		run_tests $ns1 $ns2 10.0.1.1 0 1 0 slow
+		chk_join_nr "add signal address" 1 1 1
+		chk_add_nr 1 1
+	fi
 
 	# add multiple subflows
-	reset
-	pm_nl_set_limits $ns1 0 2
-	pm_nl_set_limits $ns2 0 2
-	run_tests $ns1 $ns2 10.0.1.1 0 0 2 slow
-	chk_join_nr "add multiple subflows" 2 2 2
+	if reset; then
+		pm_nl_set_limits $ns1 0 2
+		pm_nl_set_limits $ns2 0 2
+		run_tests $ns1 $ns2 10.0.1.1 0 0 2 slow
+		chk_join_nr "add multiple subflows" 2 2 2
+	fi
 
 	# add multiple subflows IPv6
-	reset
-	pm_nl_set_limits $ns1 0 2
-	pm_nl_set_limits $ns2 0 2
-	run_tests $ns1 $ns2 dead:beef:1::1 0 0 2 slow
-	chk_join_nr "add multiple subflows IPv6" 2 2 2
+	if reset; then
+		pm_nl_set_limits $ns1 0 2
+		pm_nl_set_limits $ns2 0 2
+		run_tests $ns1 $ns2 dead:beef:1::1 0 0 2 slow
+		chk_join_nr "add multiple subflows IPv6" 2 2 2
+	fi
 
 	# add multiple addresses IPv6
-	reset
-	pm_nl_set_limits $ns1 0 2
-	pm_nl_set_limits $ns2 2 2
-	run_tests $ns1 $ns2 dead:beef:1::1 0 2 0 slow
-	chk_join_nr "add multiple addresses IPv6" 2 2 2
-	chk_add_nr 2 2
+	if reset; then
+		pm_nl_set_limits $ns1 0 2
+		pm_nl_set_limits $ns2 2 2
+		run_tests $ns1 $ns2 dead:beef:1::1 0 2 0 slow
+		chk_join_nr "add multiple addresses IPv6" 2 2 2
+		chk_add_nr 2 2
+	fi
 }
 
 ipv6_tests()
 {
 	# subflow IPv6
-	reset
-	pm_nl_set_limits $ns1 0 1
-	pm_nl_set_limits $ns2 0 1
-	pm_nl_add_endpoint $ns2 dead:beef:3::2 dev ns2eth3 flags subflow
-	run_tests $ns1 $ns2 dead:beef:1::1 0 0 0 slow
-	chk_join_nr "single subflow IPv6" 1 1 1
+	if reset; then
+		pm_nl_set_limits $ns1 0 1
+		pm_nl_set_limits $ns2 0 1
+		pm_nl_add_endpoint $ns2 dead:beef:3::2 dev ns2eth3 flags subflow
+		run_tests $ns1 $ns2 dead:beef:1::1 0 0 0 slow
+		chk_join_nr "single subflow IPv6" 1 1 1
+	fi
 
 	# add_address, unused IPv6
-	reset
-	pm_nl_add_endpoint $ns1 dead:beef:2::1 flags signal
-	run_tests $ns1 $ns2 dead:beef:1::1 0 0 0 slow
-	chk_join_nr "unused signal address IPv6" 0 0 0
-	chk_add_nr 1 1
+	if reset; then
+		pm_nl_add_endpoint $ns1 dead:beef:2::1 flags signal
+		run_tests $ns1 $ns2 dead:beef:1::1 0 0 0 slow
+		chk_join_nr "unused signal address IPv6" 0 0 0
+		chk_add_nr 1 1
+	fi
 
 	# signal address IPv6
-	reset
-	pm_nl_set_limits $ns1 0 1
-	pm_nl_add_endpoint $ns1 dead:beef:2::1 flags signal
-	pm_nl_set_limits $ns2 1 1
-	run_tests $ns1 $ns2 dead:beef:1::1 0 0 0 slow
-	chk_join_nr "single address IPv6" 1 1 1
-	chk_add_nr 1 1
+	if reset; then
+		pm_nl_set_limits $ns1 0 1
+		pm_nl_add_endpoint $ns1 dead:beef:2::1 flags signal
+		pm_nl_set_limits $ns2 1 1
+		run_tests $ns1 $ns2 dead:beef:1::1 0 0 0 slow
+		chk_join_nr "single address IPv6" 1 1 1
+		chk_add_nr 1 1
+	fi
 
 	# single address IPv6, remove
-	reset
-	pm_nl_set_limits $ns1 0 1
-	pm_nl_add_endpoint $ns1 dead:beef:2::1 flags signal
-	pm_nl_set_limits $ns2 1 1
-	run_tests $ns1 $ns2 dead:beef:1::1 0 -1 0 slow
-	chk_join_nr "remove single address IPv6" 1 1 1
-	chk_add_nr 1 1
-	chk_rm_nr 1 1 invert
+	if reset; then
+		pm_nl_set_limits $ns1 0 1
+		pm_nl_add_endpoint $ns1 dead:beef:2::1 flags signal
+		pm_nl_set_limits $ns2 1 1
+		run_tests $ns1 $ns2 dead:beef:1::1 0 -1 0 slow
+		chk_join_nr "remove single address IPv6" 1 1 1
+		chk_add_nr 1 1
+		chk_rm_nr 1 1 invert
+	fi
 
 	# subflow and signal IPv6, remove
-	reset
-	pm_nl_set_limits $ns1 0 2
-	pm_nl_add_endpoint $ns1 dead:beef:2::1 flags signal
-	pm_nl_set_limits $ns2 1 2
-	pm_nl_add_endpoint $ns2 dead:beef:3::2 dev ns2eth3 flags subflow
-	run_tests $ns1 $ns2 dead:beef:1::1 0 -1 -1 slow
-	chk_join_nr "remove subflow and signal IPv6" 2 2 2
-	chk_add_nr 1 1
-	chk_rm_nr 1 1
+	if reset; then
+		pm_nl_set_limits $ns1 0 2
+		pm_nl_add_endpoint $ns1 dead:beef:2::1 flags signal
+		pm_nl_set_limits $ns2 1 2
+		pm_nl_add_endpoint $ns2 dead:beef:3::2 dev ns2eth3 flags subflow
+		run_tests $ns1 $ns2 dead:beef:1::1 0 -1 -1 slow
+		chk_join_nr "remove subflow and signal IPv6" 2 2 2
+		chk_add_nr 1 1
+		chk_rm_nr 1 1
+	fi
 }
 
 v4mapped_tests()
 {
 	# subflow IPv4-mapped to IPv4-mapped
-	reset
-	pm_nl_set_limits $ns1 0 1
-	pm_nl_set_limits $ns2 0 1
-	pm_nl_add_endpoint $ns2 "::ffff:10.0.3.2" flags subflow
-	run_tests $ns1 $ns2 "::ffff:10.0.1.1"
-	chk_join_nr "single subflow IPv4-mapped" 1 1 1
+	if reset; then
+		pm_nl_set_limits $ns1 0 1
+		pm_nl_set_limits $ns2 0 1
+		pm_nl_add_endpoint $ns2 "::ffff:10.0.3.2" flags subflow
+		run_tests $ns1 $ns2 "::ffff:10.0.1.1"
+		chk_join_nr "single subflow IPv4-mapped" 1 1 1
+	fi
 
 	# signal address IPv4-mapped with IPv4-mapped sk
-	reset
-	pm_nl_set_limits $ns1 0 1
-	pm_nl_set_limits $ns2 1 1
-	pm_nl_add_endpoint $ns1 "::ffff:10.0.2.1" flags signal
-	run_tests $ns1 $ns2 "::ffff:10.0.1.1"
-	chk_join_nr "signal address IPv4-mapped" 1 1 1
-	chk_add_nr 1 1
+	if reset; then
+		pm_nl_set_limits $ns1 0 1
+		pm_nl_set_limits $ns2 1 1
+		pm_nl_add_endpoint $ns1 "::ffff:10.0.2.1" flags signal
+		run_tests $ns1 $ns2 "::ffff:10.0.1.1"
+		chk_join_nr "signal address IPv4-mapped" 1 1 1
+		chk_add_nr 1 1
+	fi
 
 	# subflow v4-map-v6
-	reset
-	pm_nl_set_limits $ns1 0 1
-	pm_nl_set_limits $ns2 0 1
-	pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow
-	run_tests $ns1 $ns2 "::ffff:10.0.1.1"
-	chk_join_nr "single subflow v4-map-v6" 1 1 1
+	if reset; then
+		pm_nl_set_limits $ns1 0 1
+		pm_nl_set_limits $ns2 0 1
+		pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow
+		run_tests $ns1 $ns2 "::ffff:10.0.1.1"
+		chk_join_nr "single subflow v4-map-v6" 1 1 1
+	fi
 
 	# signal address v4-map-v6
-	reset
-	pm_nl_set_limits $ns1 0 1
-	pm_nl_set_limits $ns2 1 1
-	pm_nl_add_endpoint $ns1 10.0.2.1 flags signal
-	run_tests $ns1 $ns2 "::ffff:10.0.1.1"
-	chk_join_nr "signal address v4-map-v6" 1 1 1
-	chk_add_nr 1 1
+	if reset; then
+		pm_nl_set_limits $ns1 0 1
+		pm_nl_set_limits $ns2 1 1
+		pm_nl_add_endpoint $ns1 10.0.2.1 flags signal
+		run_tests $ns1 $ns2 "::ffff:10.0.1.1"
+		chk_join_nr "signal address v4-map-v6" 1 1 1
+		chk_add_nr 1 1
+	fi
 
 	# subflow v6-map-v4
-	reset
-	pm_nl_set_limits $ns1 0 1
-	pm_nl_set_limits $ns2 0 1
-	pm_nl_add_endpoint $ns2 "::ffff:10.0.3.2" flags subflow
-	run_tests $ns1 $ns2 10.0.1.1
-	chk_join_nr "single subflow v6-map-v4" 1 1 1
+	if reset; then
+		pm_nl_set_limits $ns1 0 1
+		pm_nl_set_limits $ns2 0 1
+		pm_nl_add_endpoint $ns2 "::ffff:10.0.3.2" flags subflow
+		run_tests $ns1 $ns2 10.0.1.1
+		chk_join_nr "single subflow v6-map-v4" 1 1 1
+	fi
 
 	# signal address v6-map-v4
-	reset
-	pm_nl_set_limits $ns1 0 1
-	pm_nl_set_limits $ns2 1 1
-	pm_nl_add_endpoint $ns1 "::ffff:10.0.2.1" flags signal
-	run_tests $ns1 $ns2 10.0.1.1
-	chk_join_nr "signal address v6-map-v4" 1 1 1
-	chk_add_nr 1 1
+	if reset; then
+		pm_nl_set_limits $ns1 0 1
+		pm_nl_set_limits $ns2 1 1
+		pm_nl_add_endpoint $ns1 "::ffff:10.0.2.1" flags signal
+		run_tests $ns1 $ns2 10.0.1.1
+		chk_join_nr "signal address v6-map-v4" 1 1 1
+		chk_add_nr 1 1
+	fi
 
 	# no subflow IPv6 to v4 address
-	reset
-	pm_nl_set_limits $ns1 0 1
-	pm_nl_set_limits $ns2 0 1
-	pm_nl_add_endpoint $ns2 dead:beef:2::2 flags subflow
-	run_tests $ns1 $ns2 10.0.1.1
-	chk_join_nr "no JOIN with diff families v4-v6" 0 0 0
+	if reset; then
+		pm_nl_set_limits $ns1 0 1
+		pm_nl_set_limits $ns2 0 1
+		pm_nl_add_endpoint $ns2 dead:beef:2::2 flags subflow
+		run_tests $ns1 $ns2 10.0.1.1
+		chk_join_nr "no JOIN with diff families v4-v6" 0 0 0
+	fi
 
 	# no subflow IPv6 to v4 address even if v6 has a valid v4 at the end
-	reset
-	pm_nl_set_limits $ns1 0 1
-	pm_nl_set_limits $ns2 0 1
-	pm_nl_add_endpoint $ns2 dead:beef:2::10.0.3.2 flags subflow
-	run_tests $ns1 $ns2 10.0.1.1
-	chk_join_nr "no JOIN with diff families v4-v6-2" 0 0 0
+	if reset; then
+		pm_nl_set_limits $ns1 0 1
+		pm_nl_set_limits $ns2 0 1
+		pm_nl_add_endpoint $ns2 dead:beef:2::10.0.3.2 flags subflow
+		run_tests $ns1 $ns2 10.0.1.1
+		chk_join_nr "no JOIN with diff families v4-v6-2" 0 0 0
+	fi
 
 	# no subflow IPv4 to v6 address, no need to slow down too then
-	reset
-	pm_nl_set_limits $ns1 0 1
-	pm_nl_set_limits $ns2 0 1
-	pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow
-	run_tests $ns1 $ns2 dead:beef:1::1
-	chk_join_nr "no JOIN with diff families v6-v4" 0 0 0
+	if reset; then
+		pm_nl_set_limits $ns1 0 1
+		pm_nl_set_limits $ns2 0 1
+		pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow
+		run_tests $ns1 $ns2 dead:beef:1::1
+		chk_join_nr "no JOIN with diff families v6-v4" 0 0 0
+	fi
 }
 
 backup_tests()
 {
 	# single subflow, backup
-	reset
-	pm_nl_set_limits $ns1 0 1
-	pm_nl_set_limits $ns2 0 1
-	pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow,backup
-	run_tests $ns1 $ns2 10.0.1.1 0 0 0 slow nobackup
-	chk_join_nr "single subflow, backup" 1 1 1
-	chk_prio_nr 0 1
+	if reset; then
+		pm_nl_set_limits $ns1 0 1
+		pm_nl_set_limits $ns2 0 1
+		pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow,backup
+		run_tests $ns1 $ns2 10.0.1.1 0 0 0 slow nobackup
+		chk_join_nr "single subflow, backup" 1 1 1
+		chk_prio_nr 0 1
+	fi
 
 	# single address, backup
-	reset
-	pm_nl_set_limits $ns1 0 1
-	pm_nl_add_endpoint $ns1 10.0.2.1 flags signal
-	pm_nl_set_limits $ns2 1 1
-	run_tests $ns1 $ns2 10.0.1.1 0 0 0 slow backup
-	chk_join_nr "single address, backup" 1 1 1
-	chk_add_nr 1 1
-	chk_prio_nr 1 0
+	if reset; then
+		pm_nl_set_limits $ns1 0 1
+		pm_nl_add_endpoint $ns1 10.0.2.1 flags signal
+		pm_nl_set_limits $ns2 1 1
+		run_tests $ns1 $ns2 10.0.1.1 0 0 0 slow backup
+		chk_join_nr "single address, backup" 1 1 1
+		chk_add_nr 1 1
+		chk_prio_nr 1 0
+	fi
 
 	# single address with port, backup
-	reset
-	pm_nl_set_limits $ns1 0 1
-	pm_nl_add_endpoint $ns1 10.0.2.1 flags signal port 10100
-	pm_nl_set_limits $ns2 1 1
-	run_tests $ns1 $ns2 10.0.1.1 0 0 0 slow backup
-	chk_join_nr "single address with port, backup" 1 1 1
-	chk_add_nr 1 1
-	chk_prio_nr 1 0
+	if reset; then
+		pm_nl_set_limits $ns1 0 1
+		pm_nl_add_endpoint $ns1 10.0.2.1 flags signal port 10100
+		pm_nl_set_limits $ns2 1 1
+		run_tests $ns1 $ns2 10.0.1.1 0 0 0 slow backup
+		chk_join_nr "single address with port, backup" 1 1 1
+		chk_add_nr 1 1
+		chk_prio_nr 1 0
+	fi
 }
 
 add_addr_ports_tests()
 {
 	# signal address with port
-	reset
-	pm_nl_set_limits $ns1 0 1
-	pm_nl_set_limits $ns2 1 1
-	pm_nl_add_endpoint $ns1 10.0.2.1 flags signal port 10100
-	run_tests $ns1 $ns2 10.0.1.1
-	chk_join_nr "signal address with port" 1 1 1
-	chk_add_nr 1 1 1
+	if reset; then
+		pm_nl_set_limits $ns1 0 1
+		pm_nl_set_limits $ns2 1 1
+		pm_nl_add_endpoint $ns1 10.0.2.1 flags signal port 10100
+		run_tests $ns1 $ns2 10.0.1.1
+		chk_join_nr "signal address with port" 1 1 1
+		chk_add_nr 1 1 1
+	fi
 
 	# subflow and signal with port
-	reset
-	pm_nl_add_endpoint $ns1 10.0.2.1 flags signal port 10100
-	pm_nl_set_limits $ns1 0 2
-	pm_nl_set_limits $ns2 1 2
-	pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow
-	run_tests $ns1 $ns2 10.0.1.1
-	chk_join_nr "subflow and signal with port" 2 2 2
-	chk_add_nr 1 1 1
+	if reset; then
+		pm_nl_add_endpoint $ns1 10.0.2.1 flags signal port 10100
+		pm_nl_set_limits $ns1 0 2
+		pm_nl_set_limits $ns2 1 2
+		pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow
+		run_tests $ns1 $ns2 10.0.1.1
+		chk_join_nr "subflow and signal with port" 2 2 2
+		chk_add_nr 1 1 1
+	fi
 
 	# single address with port, remove
-	reset
-	pm_nl_set_limits $ns1 0 1
-	pm_nl_add_endpoint $ns1 10.0.2.1 flags signal port 10100
-	pm_nl_set_limits $ns2 1 1
-	run_tests $ns1 $ns2 10.0.1.1 0 -1 0 slow
-	chk_join_nr "remove single address with port" 1 1 1
-	chk_add_nr 1 1 1
-	chk_rm_nr 1 1 invert
+	if reset; then
+		pm_nl_set_limits $ns1 0 1
+		pm_nl_add_endpoint $ns1 10.0.2.1 flags signal port 10100
+		pm_nl_set_limits $ns2 1 1
+		run_tests $ns1 $ns2 10.0.1.1 0 -1 0 slow
+		chk_join_nr "remove single address with port" 1 1 1
+		chk_add_nr 1 1 1
+		chk_rm_nr 1 1 invert
+	fi
 
 	# subflow and signal with port, remove
-	reset
-	pm_nl_set_limits $ns1 0 2
-	pm_nl_add_endpoint $ns1 10.0.2.1 flags signal port 10100
-	pm_nl_set_limits $ns2 1 2
-	pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow
-	run_tests $ns1 $ns2 10.0.1.1 0 -1 -1 slow
-	chk_join_nr "remove subflow and signal with port" 2 2 2
-	chk_add_nr 1 1 1
-	chk_rm_nr 1 1
+	if reset; then
+		pm_nl_set_limits $ns1 0 2
+		pm_nl_add_endpoint $ns1 10.0.2.1 flags signal port 10100
+		pm_nl_set_limits $ns2 1 2
+		pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow
+		run_tests $ns1 $ns2 10.0.1.1 0 -1 -1 slow
+		chk_join_nr "remove subflow and signal with port" 2 2 2
+		chk_add_nr 1 1 1
+		chk_rm_nr 1 1
+	fi
 
 	# subflows and signal with port, flush
-	reset
-	pm_nl_set_limits $ns1 0 3
-	pm_nl_add_endpoint $ns1 10.0.2.1 flags signal port 10100
-	pm_nl_set_limits $ns2 1 3
-	pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow
-	pm_nl_add_endpoint $ns2 10.0.4.2 flags subflow
-	run_tests $ns1 $ns2 10.0.1.1 0 -8 -2 slow
-	chk_join_nr "flush subflows and signal with port" 3 3 3
-	chk_add_nr 1 1
-	chk_rm_nr 2 2
+	if reset; then
+		pm_nl_set_limits $ns1 0 3
+		pm_nl_add_endpoint $ns1 10.0.2.1 flags signal port 10100
+		pm_nl_set_limits $ns2 1 3
+		pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow
+		pm_nl_add_endpoint $ns2 10.0.4.2 flags subflow
+		run_tests $ns1 $ns2 10.0.1.1 0 -8 -2 slow
+		chk_join_nr "flush subflows and signal with port" 3 3 3
+		chk_add_nr 1 1
+		chk_rm_nr 2 2
+	fi
 
 	# multiple addresses with port
-	reset
-	pm_nl_set_limits $ns1 2 2
-	pm_nl_add_endpoint $ns1 10.0.2.1 flags signal port 10100
-	pm_nl_add_endpoint $ns1 10.0.3.1 flags signal port 10100
-	pm_nl_set_limits $ns2 2 2
-	run_tests $ns1 $ns2 10.0.1.1
-	chk_join_nr "multiple addresses with port" 2 2 2
-	chk_add_nr 2 2 2
+	if reset; then
+		pm_nl_set_limits $ns1 2 2
+		pm_nl_add_endpoint $ns1 10.0.2.1 flags signal port 10100
+		pm_nl_add_endpoint $ns1 10.0.3.1 flags signal port 10100
+		pm_nl_set_limits $ns2 2 2
+		run_tests $ns1 $ns2 10.0.1.1
+		chk_join_nr "multiple addresses with port" 2 2 2
+		chk_add_nr 2 2 2
+	fi
 
 	# multiple addresses with ports
-	reset
-	pm_nl_set_limits $ns1 2 2
-	pm_nl_add_endpoint $ns1 10.0.2.1 flags signal port 10100
-	pm_nl_add_endpoint $ns1 10.0.3.1 flags signal port 10101
-	pm_nl_set_limits $ns2 2 2
-	run_tests $ns1 $ns2 10.0.1.1
-	chk_join_nr "multiple addresses with ports" 2 2 2
-	chk_add_nr 2 2 2
+	if reset; then
+		pm_nl_set_limits $ns1 2 2
+		pm_nl_add_endpoint $ns1 10.0.2.1 flags signal port 10100
+		pm_nl_add_endpoint $ns1 10.0.3.1 flags signal port 10101
+		pm_nl_set_limits $ns2 2 2
+		run_tests $ns1 $ns2 10.0.1.1
+		chk_join_nr "multiple addresses with ports" 2 2 2
+		chk_add_nr 2 2 2
+	fi
 }
 
 syncookies_tests()
 {
 	# single subflow, syncookies
-	reset_with_cookies
-	pm_nl_set_limits $ns1 0 1
-	pm_nl_set_limits $ns2 0 1
-	pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow
-	run_tests $ns1 $ns2 10.0.1.1
-	chk_join_nr "single subflow with syn cookies" 1 1 1
+	if reset_with_cookies; then
+		pm_nl_set_limits $ns1 0 1
+		pm_nl_set_limits $ns2 0 1
+		pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow
+		run_tests $ns1 $ns2 10.0.1.1
+		chk_join_nr "single subflow with syn cookies" 1 1 1
+	fi
 
 	# multiple subflows with syn cookies
-	reset_with_cookies
-	pm_nl_set_limits $ns1 0 2
-	pm_nl_set_limits $ns2 0 2
-	pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow
-	pm_nl_add_endpoint $ns2 10.0.2.2 flags subflow
-	run_tests $ns1 $ns2 10.0.1.1
-	chk_join_nr "multiple subflows with syn cookies" 2 2 2
+	if reset_with_cookies; then
+		pm_nl_set_limits $ns1 0 2
+		pm_nl_set_limits $ns2 0 2
+		pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow
+		pm_nl_add_endpoint $ns2 10.0.2.2 flags subflow
+		run_tests $ns1 $ns2 10.0.1.1
+		chk_join_nr "multiple subflows with syn cookies" 2 2 2
+	fi
 
 	# multiple subflows limited by server
-	reset_with_cookies
-	pm_nl_set_limits $ns1 0 1
-	pm_nl_set_limits $ns2 0 2
-	pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow
-	pm_nl_add_endpoint $ns2 10.0.2.2 flags subflow
-	run_tests $ns1 $ns2 10.0.1.1
-	chk_join_nr "subflows limited by server w cookies" 2 1 1
+	if reset_with_cookies; then
+		pm_nl_set_limits $ns1 0 1
+		pm_nl_set_limits $ns2 0 2
+		pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow
+		pm_nl_add_endpoint $ns2 10.0.2.2 flags subflow
+		run_tests $ns1 $ns2 10.0.1.1
+		chk_join_nr "subflows limited by server w cookies" 2 1 1
+	fi
 
 	# test signal address with cookies
-	reset_with_cookies
-	pm_nl_set_limits $ns1 0 1
-	pm_nl_set_limits $ns2 1 1
-	pm_nl_add_endpoint $ns1 10.0.2.1 flags signal
-	run_tests $ns1 $ns2 10.0.1.1
-	chk_join_nr "signal address with syn cookies" 1 1 1
-	chk_add_nr 1 1
+	if reset_with_cookies; then
+		pm_nl_set_limits $ns1 0 1
+		pm_nl_set_limits $ns2 1 1
+		pm_nl_add_endpoint $ns1 10.0.2.1 flags signal
+		run_tests $ns1 $ns2 10.0.1.1
+		chk_join_nr "signal address with syn cookies" 1 1 1
+		chk_add_nr 1 1
+	fi
 
 	# test cookie with subflow and signal
-	reset_with_cookies
-	pm_nl_add_endpoint $ns1 10.0.2.1 flags signal
-	pm_nl_set_limits $ns1 0 2
-	pm_nl_set_limits $ns2 1 2
-	pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow
-	run_tests $ns1 $ns2 10.0.1.1
-	chk_join_nr "subflow and signal w cookies" 2 2 2
-	chk_add_nr 1 1
+	if reset_with_cookies; then
+		pm_nl_add_endpoint $ns1 10.0.2.1 flags signal
+		pm_nl_set_limits $ns1 0 2
+		pm_nl_set_limits $ns2 1 2
+		pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow
+		run_tests $ns1 $ns2 10.0.1.1
+		chk_join_nr "subflow and signal w cookies" 2 2 2
+		chk_add_nr 1 1
+	fi
 
 	# accept and use add_addr with additional subflows
-	reset_with_cookies
-	pm_nl_set_limits $ns1 0 3
-	pm_nl_add_endpoint $ns1 10.0.2.1 flags signal
-	pm_nl_set_limits $ns2 1 3
-	pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow
-	pm_nl_add_endpoint $ns2 10.0.4.2 flags subflow
-	run_tests $ns1 $ns2 10.0.1.1
-	chk_join_nr "subflows and signal w. cookies" 3 3 3
-	chk_add_nr 1 1
+	if reset_with_cookies; then
+		pm_nl_set_limits $ns1 0 3
+		pm_nl_add_endpoint $ns1 10.0.2.1 flags signal
+		pm_nl_set_limits $ns2 1 3
+		pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow
+		pm_nl_add_endpoint $ns2 10.0.4.2 flags subflow
+		run_tests $ns1 $ns2 10.0.1.1
+		chk_join_nr "subflows and signal w. cookies" 3 3 3
+		chk_add_nr 1 1
+	fi
 }
 
 checksum_tests()
 {
 	# checksum test 0 0
-	reset_with_checksum 0 0
-	pm_nl_set_limits $ns1 0 1
-	pm_nl_set_limits $ns2 0 1
-	run_tests $ns1 $ns2 10.0.1.1
-	chk_csum_nr "checksum test 0 0"
+	if reset_with_checksum 0 0; then
+		pm_nl_set_limits $ns1 0 1
+		pm_nl_set_limits $ns2 0 1
+		run_tests $ns1 $ns2 10.0.1.1
+		chk_csum_nr "checksum test 0 0"
+	fi
 
 	# checksum test 1 1
-	reset_with_checksum 1 1
-	pm_nl_set_limits $ns1 0 1
-	pm_nl_set_limits $ns2 0 1
-	run_tests $ns1 $ns2 10.0.1.1
-	chk_csum_nr "checksum test 1 1"
+	if reset_with_checksum 1 1; then
+		pm_nl_set_limits $ns1 0 1
+		pm_nl_set_limits $ns2 0 1
+		run_tests $ns1 $ns2 10.0.1.1
+		chk_csum_nr "checksum test 1 1"
+	fi
 
 	# checksum test 0 1
-	reset_with_checksum 0 1
-	pm_nl_set_limits $ns1 0 1
-	pm_nl_set_limits $ns2 0 1
-	run_tests $ns1 $ns2 10.0.1.1
-	chk_csum_nr "checksum test 0 1"
+	if reset_with_checksum 0 1; then
+		pm_nl_set_limits $ns1 0 1
+		pm_nl_set_limits $ns2 0 1
+		run_tests $ns1 $ns2 10.0.1.1
+		chk_csum_nr "checksum test 0 1"
+	fi
 
 	# checksum test 1 0
-	reset_with_checksum 1 0
-	pm_nl_set_limits $ns1 0 1
-	pm_nl_set_limits $ns2 0 1
-	run_tests $ns1 $ns2 10.0.1.1
-	chk_csum_nr "checksum test 1 0"
+	if reset_with_checksum 1 0; then
+		pm_nl_set_limits $ns1 0 1
+		pm_nl_set_limits $ns2 0 1
+		run_tests $ns1 $ns2 10.0.1.1
+		chk_csum_nr "checksum test 1 0"
+	fi
 }
 
 deny_join_id0_tests()
 {
 	# subflow allow join id0 ns1
-	reset_with_allow_join_id0 1 0
-	pm_nl_set_limits $ns1 1 1
-	pm_nl_set_limits $ns2 1 1
-	pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow
-	run_tests $ns1 $ns2 10.0.1.1
-	chk_join_nr "single subflow allow join id0 ns1" 1 1 1
+	if reset_with_allow_join_id0 1 0; then
+		pm_nl_set_limits $ns1 1 1
+		pm_nl_set_limits $ns2 1 1
+		pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow
+		run_tests $ns1 $ns2 10.0.1.1
+		chk_join_nr "single subflow allow join id0 ns1" 1 1 1
+	fi
 
 	# subflow allow join id0 ns2
-	reset_with_allow_join_id0 0 1
-	pm_nl_set_limits $ns1 1 1
-	pm_nl_set_limits $ns2 1 1
-	pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow
-	run_tests $ns1 $ns2 10.0.1.1
-	chk_join_nr "single subflow allow join id0 ns2" 0 0 0
+	if reset_with_allow_join_id0 0 1; then
+		pm_nl_set_limits $ns1 1 1
+		pm_nl_set_limits $ns2 1 1
+		pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow
+		run_tests $ns1 $ns2 10.0.1.1
+		chk_join_nr "single subflow allow join id0 ns2" 0 0 0
+	fi
 
 	# signal address allow join id0 ns1
 	# ADD_ADDRs are not affected by allow_join_id0 value.
-	reset_with_allow_join_id0 1 0
-	pm_nl_set_limits $ns1 1 1
-	pm_nl_set_limits $ns2 1 1
-	pm_nl_add_endpoint $ns1 10.0.2.1 flags signal
-	run_tests $ns1 $ns2 10.0.1.1
-	chk_join_nr "signal address allow join id0 ns1" 1 1 1
-	chk_add_nr 1 1
+	if reset_with_allow_join_id0 1 0; then
+		pm_nl_set_limits $ns1 1 1
+		pm_nl_set_limits $ns2 1 1
+		pm_nl_add_endpoint $ns1 10.0.2.1 flags signal
+		run_tests $ns1 $ns2 10.0.1.1
+		chk_join_nr "signal address allow join id0 ns1" 1 1 1
+		chk_add_nr 1 1
+	fi
 
 	# signal address allow join id0 ns2
 	# ADD_ADDRs are not affected by allow_join_id0 value.
-	reset_with_allow_join_id0 0 1
-	pm_nl_set_limits $ns1 1 1
-	pm_nl_set_limits $ns2 1 1
-	pm_nl_add_endpoint $ns1 10.0.2.1 flags signal
-	run_tests $ns1 $ns2 10.0.1.1
-	chk_join_nr "signal address allow join id0 ns2" 1 1 1
-	chk_add_nr 1 1
+	if reset_with_allow_join_id0 0 1; then
+		pm_nl_set_limits $ns1 1 1
+		pm_nl_set_limits $ns2 1 1
+		pm_nl_add_endpoint $ns1 10.0.2.1 flags signal
+		run_tests $ns1 $ns2 10.0.1.1
+		chk_join_nr "signal address allow join id0 ns2" 1 1 1
+		chk_add_nr 1 1
+	fi
 
 	# subflow and address allow join id0 ns1
-	reset_with_allow_join_id0 1 0
-	pm_nl_set_limits $ns1 2 2
-	pm_nl_set_limits $ns2 2 2
-	pm_nl_add_endpoint $ns1 10.0.2.1 flags signal
-	pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow
-	run_tests $ns1 $ns2 10.0.1.1
-	chk_join_nr "subflow and address allow join id0 1" 2 2 2
+	if reset_with_allow_join_id0 1 0; then
+		pm_nl_set_limits $ns1 2 2
+		pm_nl_set_limits $ns2 2 2
+		pm_nl_add_endpoint $ns1 10.0.2.1 flags signal
+		pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow
+		run_tests $ns1 $ns2 10.0.1.1
+		chk_join_nr "subflow and address allow join id0 1" 2 2 2
+	fi
 
 	# subflow and address allow join id0 ns2
-	reset_with_allow_join_id0 0 1
-	pm_nl_set_limits $ns1 2 2
-	pm_nl_set_limits $ns2 2 2
-	pm_nl_add_endpoint $ns1 10.0.2.1 flags signal
-	pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow
-	run_tests $ns1 $ns2 10.0.1.1
-	chk_join_nr "subflow and address allow join id0 2" 1 1 1
+	if reset_with_allow_join_id0 0 1; then
+		pm_nl_set_limits $ns1 2 2
+		pm_nl_set_limits $ns2 2 2
+		pm_nl_add_endpoint $ns1 10.0.2.1 flags signal
+		pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow
+		run_tests $ns1 $ns2 10.0.1.1
+		chk_join_nr "subflow and address allow join id0 2" 1 1 1
+	fi
 }
 
 fullmesh_tests()
@@ -2030,148 +2134,162 @@ fullmesh_tests()
 	# fullmesh 1
 	# 2 fullmesh addrs in ns2, added before the connection,
 	# 1 non-fullmesh addr in ns1, added during the connection.
-	reset
-	pm_nl_set_limits $ns1 0 4
-	pm_nl_set_limits $ns2 1 4
-	pm_nl_add_endpoint $ns2 10.0.2.2 flags subflow,fullmesh
-	pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow,fullmesh
-	run_tests $ns1 $ns2 10.0.1.1 0 1 0 slow
-	chk_join_nr "fullmesh test 2x1" 4 4 4
-	chk_add_nr 1 1
+	if reset; then
+		pm_nl_set_limits $ns1 0 4
+		pm_nl_set_limits $ns2 1 4
+		pm_nl_add_endpoint $ns2 10.0.2.2 flags subflow,fullmesh
+		pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow,fullmesh
+		run_tests $ns1 $ns2 10.0.1.1 0 1 0 slow
+		chk_join_nr "fullmesh test 2x1" 4 4 4
+		chk_add_nr 1 1
+	fi
 
 	# fullmesh 2
 	# 1 non-fullmesh addr in ns1, added before the connection,
 	# 1 fullmesh addr in ns2, added during the connection.
-	reset
-	pm_nl_set_limits $ns1 1 3
-	pm_nl_set_limits $ns2 1 3
-	pm_nl_add_endpoint $ns1 10.0.2.1 flags signal
-	run_tests $ns1 $ns2 10.0.1.1 0 0 fullmesh_1 slow
-	chk_join_nr "fullmesh test 1x1" 3 3 3
-	chk_add_nr 1 1
+	if reset; then
+		pm_nl_set_limits $ns1 1 3
+		pm_nl_set_limits $ns2 1 3
+		pm_nl_add_endpoint $ns1 10.0.2.1 flags signal
+		run_tests $ns1 $ns2 10.0.1.1 0 0 fullmesh_1 slow
+		chk_join_nr "fullmesh test 1x1" 3 3 3
+		chk_add_nr 1 1
+	fi
 
 	# fullmesh 3
 	# 1 non-fullmesh addr in ns1, added before the connection,
 	# 2 fullmesh addrs in ns2, added during the connection.
-	reset
-	pm_nl_set_limits $ns1 2 5
-	pm_nl_set_limits $ns2 1 5
-	pm_nl_add_endpoint $ns1 10.0.2.1 flags signal
-	run_tests $ns1 $ns2 10.0.1.1 0 0 fullmesh_2 slow
-	chk_join_nr "fullmesh test 1x2" 5 5 5
-	chk_add_nr 1 1
+	if reset; then
+		pm_nl_set_limits $ns1 2 5
+		pm_nl_set_limits $ns2 1 5
+		pm_nl_add_endpoint $ns1 10.0.2.1 flags signal
+		run_tests $ns1 $ns2 10.0.1.1 0 0 fullmesh_2 slow
+		chk_join_nr "fullmesh test 1x2" 5 5 5
+		chk_add_nr 1 1
+	fi
 
 	# fullmesh 4
 	# 1 non-fullmesh addr in ns1, added before the connection,
 	# 2 fullmesh addrs in ns2, added during the connection,
 	# limit max_subflows to 4.
-	reset
-	pm_nl_set_limits $ns1 2 4
-	pm_nl_set_limits $ns2 1 4
-	pm_nl_add_endpoint $ns1 10.0.2.1 flags signal
-	run_tests $ns1 $ns2 10.0.1.1 0 0 fullmesh_2 slow
-	chk_join_nr "fullmesh test 1x2, limited" 4 4 4
-	chk_add_nr 1 1
+	if reset; then
+		pm_nl_set_limits $ns1 2 4
+		pm_nl_set_limits $ns2 1 4
+		pm_nl_add_endpoint $ns1 10.0.2.1 flags signal
+		run_tests $ns1 $ns2 10.0.1.1 0 0 fullmesh_2 slow
+		chk_join_nr "fullmesh test 1x2, limited" 4 4 4
+		chk_add_nr 1 1
+	fi
 
 	# set fullmesh flag
-	reset
-	pm_nl_set_limits $ns1 4 4
-	pm_nl_add_endpoint $ns1 10.0.2.1 flags subflow
-	pm_nl_set_limits $ns2 4 4
-	run_tests $ns1 $ns2 10.0.1.1 0 0 1 slow fullmesh
-	chk_join_nr "set fullmesh flag test" 2 2 2
-	chk_rm_nr 0 1
+	if reset; then
+		pm_nl_set_limits $ns1 4 4
+		pm_nl_add_endpoint $ns1 10.0.2.1 flags subflow
+		pm_nl_set_limits $ns2 4 4
+		run_tests $ns1 $ns2 10.0.1.1 0 0 1 slow fullmesh
+		chk_join_nr "set fullmesh flag test" 2 2 2
+		chk_rm_nr 0 1
+	fi
 
 	# set nofullmesh flag
-	reset
-	pm_nl_set_limits $ns1 4 4
-	pm_nl_add_endpoint $ns1 10.0.2.1 flags subflow,fullmesh
-	pm_nl_set_limits $ns2 4 4
-	run_tests $ns1 $ns2 10.0.1.1 0 0 fullmesh_1 slow nofullmesh
-	chk_join_nr "set nofullmesh flag test" 2 2 2
-	chk_rm_nr 0 1
+	if reset; then
+		pm_nl_set_limits $ns1 4 4
+		pm_nl_add_endpoint $ns1 10.0.2.1 flags subflow,fullmesh
+		pm_nl_set_limits $ns2 4 4
+		run_tests $ns1 $ns2 10.0.1.1 0 0 fullmesh_1 slow nofullmesh
+		chk_join_nr "set nofullmesh flag test" 2 2 2
+		chk_rm_nr 0 1
+	fi
 
 	# set backup,fullmesh flags
-	reset
-	pm_nl_set_limits $ns1 4 4
-	pm_nl_add_endpoint $ns1 10.0.2.1 flags subflow
-	pm_nl_set_limits $ns2 4 4
-	run_tests $ns1 $ns2 10.0.1.1 0 0 1 slow backup,fullmesh
-	chk_join_nr "set backup,fullmesh flags test" 2 2 2
-	chk_prio_nr 0 1
-	chk_rm_nr 0 1
+	if reset; then
+		pm_nl_set_limits $ns1 4 4
+		pm_nl_add_endpoint $ns1 10.0.2.1 flags subflow
+		pm_nl_set_limits $ns2 4 4
+		run_tests $ns1 $ns2 10.0.1.1 0 0 1 slow backup,fullmesh
+		chk_join_nr "set backup,fullmesh flags test" 2 2 2
+		chk_prio_nr 0 1
+		chk_rm_nr 0 1
+	fi
 
 	# set nobackup,nofullmesh flags
-	reset
-	pm_nl_set_limits $ns1 4 4
-	pm_nl_set_limits $ns2 4 4
-	pm_nl_add_endpoint $ns2 10.0.2.2 flags subflow,backup,fullmesh
-	run_tests $ns1 $ns2 10.0.1.1 0 0 0 slow nobackup,nofullmesh
-	chk_join_nr "set nobackup,nofullmesh flags test" 2 2 2
-	chk_prio_nr 0 1
-	chk_rm_nr 0 1
+	if reset; then
+		pm_nl_set_limits $ns1 4 4
+		pm_nl_set_limits $ns2 4 4
+		pm_nl_add_endpoint $ns2 10.0.2.2 flags subflow,backup,fullmesh
+		run_tests $ns1 $ns2 10.0.1.1 0 0 0 slow nobackup,nofullmesh
+		chk_join_nr "set nobackup,nofullmesh flags test" 2 2 2
+		chk_prio_nr 0 1
+		chk_rm_nr 0 1
+	fi
 }
 
 userspace_tests()
 {
 	# userspace pm type prevents add_addr
-	reset
-	ip netns exec $ns1 sysctl -q net.mptcp.pm_type=1
-	ip netns exec $ns1 ./pm_nl_ctl limits 0 2
-	ip netns exec $ns2 ./pm_nl_ctl limits 0 2
-	ip netns exec $ns1 ./pm_nl_ctl add 10.0.2.1 flags signal
-	run_tests $ns1 $ns2 10.0.1.1
-	chk_join_nr "userspace pm type prevents add_addr" 0 0 0
-	chk_add_nr 0 0
+	if reset; then
+		ip netns exec $ns1 sysctl -q net.mptcp.pm_type=1
+		ip netns exec $ns1 ./pm_nl_ctl limits 0 2
+		ip netns exec $ns2 ./pm_nl_ctl limits 0 2
+		ip netns exec $ns1 ./pm_nl_ctl add 10.0.2.1 flags signal
+		run_tests $ns1 $ns2 10.0.1.1
+		chk_join_nr "userspace pm type prevents add_addr" 0 0 0
+		chk_add_nr 0 0
+	fi
 
 	# userspace pm type echoes add_addr
-	reset
-	ip netns exec $ns2 sysctl -q net.mptcp.pm_type=1
-	ip netns exec $ns1 ./pm_nl_ctl limits 0 2
-	ip netns exec $ns2 ./pm_nl_ctl limits 0 2
-	ip netns exec $ns1 ./pm_nl_ctl add 10.0.2.1 flags signal
-	run_tests $ns1 $ns2 10.0.1.1
-	chk_join_nr "userspace pm type echoes add_addr" 0 0 0
-	chk_add_nr 1 1
+	if reset; then
+		ip netns exec $ns2 sysctl -q net.mptcp.pm_type=1
+		ip netns exec $ns1 ./pm_nl_ctl limits 0 2
+		ip netns exec $ns2 ./pm_nl_ctl limits 0 2
+		ip netns exec $ns1 ./pm_nl_ctl add 10.0.2.1 flags signal
+		run_tests $ns1 $ns2 10.0.1.1
+		chk_join_nr "userspace pm type echoes add_addr" 0 0 0
+		chk_add_nr 1 1
+	fi
 
 	# userspace pm type rejects join
-	reset
-	ip netns exec $ns1 sysctl -q net.mptcp.pm_type=1
-	ip netns exec $ns1 ./pm_nl_ctl limits 1 1
-	ip netns exec $ns2 ./pm_nl_ctl limits 1 1
-	ip netns exec $ns2 ./pm_nl_ctl add 10.0.3.2 flags subflow
-	run_tests $ns1 $ns2 10.0.1.1
-	chk_join_nr "userspace pm type rejects join" 1 1 0
+	if reset; then
+		ip netns exec $ns1 sysctl -q net.mptcp.pm_type=1
+		ip netns exec $ns1 ./pm_nl_ctl limits 1 1
+		ip netns exec $ns2 ./pm_nl_ctl limits 1 1
+		ip netns exec $ns2 ./pm_nl_ctl add 10.0.3.2 flags subflow
+		run_tests $ns1 $ns2 10.0.1.1
+		chk_join_nr "userspace pm type rejects join" 1 1 0
+	fi
 
 	# userspace pm type does not send join
-	reset
-	ip netns exec $ns2 sysctl -q net.mptcp.pm_type=1
-	ip netns exec $ns1 ./pm_nl_ctl limits 1 1
-	ip netns exec $ns2 ./pm_nl_ctl limits 1 1
-	ip netns exec $ns2 ./pm_nl_ctl add 10.0.3.2 flags subflow
-	run_tests $ns1 $ns2 10.0.1.1
-	chk_join_nr "userspace pm type does not send join" 0 0 0
+	if reset; then
+		ip netns exec $ns2 sysctl -q net.mptcp.pm_type=1
+		ip netns exec $ns1 ./pm_nl_ctl limits 1 1
+		ip netns exec $ns2 ./pm_nl_ctl limits 1 1
+		ip netns exec $ns2 ./pm_nl_ctl add 10.0.3.2 flags subflow
+		run_tests $ns1 $ns2 10.0.1.1
+		chk_join_nr "userspace pm type does not send join" 0 0 0
+	fi
 
 	# userspace pm type prevents mp_prio
-	reset
-	ip netns exec $ns1 sysctl -q net.mptcp.pm_type=1
-	ip netns exec $ns1 ./pm_nl_ctl limits 1 1
-	ip netns exec $ns2 ./pm_nl_ctl limits 1 1
-	ip netns exec $ns2 ./pm_nl_ctl add 10.0.3.2 flags subflow
-	run_tests $ns1 $ns2 10.0.1.1 0 0 0 slow backup
-	chk_join_nr "userspace pm type prevents mp_prio" 1 1 0
-	chk_prio_nr 0 0
+	if reset; then
+		ip netns exec $ns1 sysctl -q net.mptcp.pm_type=1
+		ip netns exec $ns1 ./pm_nl_ctl limits 1 1
+		ip netns exec $ns2 ./pm_nl_ctl limits 1 1
+		ip netns exec $ns2 ./pm_nl_ctl add 10.0.3.2 flags subflow
+		run_tests $ns1 $ns2 10.0.1.1 0 0 0 slow backup
+		chk_join_nr "userspace pm type prevents mp_prio" 1 1 0
+		chk_prio_nr 0 0
+	fi
 
 	# userspace pm type prevents rm_addr
-	reset
-	ip netns exec $ns1 sysctl -q net.mptcp.pm_type=1
-	ip netns exec $ns2 sysctl -q net.mptcp.pm_type=1
-	ip netns exec $ns1 ./pm_nl_ctl limits 0 1
-	ip netns exec $ns2 ./pm_nl_ctl limits 0 1
-	ip netns exec $ns2 ./pm_nl_ctl add 10.0.3.2 flags subflow
-	run_tests $ns1 $ns2 10.0.1.1 0 0 -1 slow
-	chk_join_nr "userspace pm type prevents rm_addr" 0 0 0
-	chk_rm_nr 0 0
+	if reset; then
+		ip netns exec $ns1 sysctl -q net.mptcp.pm_type=1
+		ip netns exec $ns2 sysctl -q net.mptcp.pm_type=1
+		ip netns exec $ns1 ./pm_nl_ctl limits 0 1
+		ip netns exec $ns2 ./pm_nl_ctl limits 0 1
+		ip netns exec $ns2 ./pm_nl_ctl add 10.0.3.2 flags subflow
+		run_tests $ns1 $ns2 10.0.1.1 0 0 -1 slow
+		chk_join_nr "userspace pm type prevents rm_addr" 0 0 0
+		chk_rm_nr 0 0
+	fi
 }
 
 all_tests()
@@ -2250,7 +2368,13 @@ for arg in "$@"; do
 	fi
 
 	# exception for the capture/checksum/ip_mptcp options, the rest means: a part of the tests
-	if ! [[ "${arg}" =~ ^"-"[cCi]+$ ]]; then
+	if ! [[ "${arg}" =~ ^"-" ]]; then
+		if [[ "${arg}" =~ ^[0-9]+$ ]]; then
+			ONLY_TESTS+=("${arg}")
+		else
+			usage "Unknown option: ${arg}"
+		fi
+	elif ! [[ "${arg}" =~ ^"-"[cCi]+$ ]]; then
 		do_all_tests=0
 	fi
 done
-- 
2.34.1


^ permalink raw reply related	[flat|nested] 20+ messages in thread

* [PATCH mptcp-next 4/9] selftests: mptcp: join: remove unused vars
  2022-02-09 21:25 [PATCH mptcp-next 0/9] Refactor mptcp_join.sh Matthieu Baerts
                   ` (2 preceding siblings ...)
  2022-02-09 21:25 ` [PATCH mptcp-next 3/9] selftests: mptcp: join: option to execute specific tests Matthieu Baerts
@ 2022-02-09 21:25 ` Matthieu Baerts
  2022-02-09 21:25 ` [PATCH mptcp-next 5/9] selftests: mptcp: join: create tmp files only if needed Matthieu Baerts
                   ` (5 subsequent siblings)
  9 siblings, 0 replies; 20+ messages in thread
From: Matthieu Baerts @ 2022-02-09 21:25 UTC (permalink / raw)
  To: mptcp; +Cc: Matthieu Baerts

Shellcheck found that these variables were set but never used.

Note that rndh is no longer prefixed with '0-' but it doesn't change
anything.

Signed-off-by: Matthieu Baerts <matthieu.baerts@tessares.net>
---
 tools/testing/selftests/net/mptcp/mptcp_join.sh | 5 +----
 1 file changed, 1 insertion(+), 4 deletions(-)

diff --git a/tools/testing/selftests/net/mptcp/mptcp_join.sh b/tools/testing/selftests/net/mptcp/mptcp_join.sh
index 2dc81646e326..ce3e7db30b9d 100755
--- a/tools/testing/selftests/net/mptcp/mptcp_join.sh
+++ b/tools/testing/selftests/net/mptcp/mptcp_join.sh
@@ -45,7 +45,7 @@ init()
 {
 	capout=$(mktemp)
 
-	rndh=$(printf %x $sec)-$(mktemp -u XXXXXX)
+	rndh=$(mktemp -u XXXXXX)
 
 	ns1="ns1-$rndh"
 	ns2="ns2-$rndh"
@@ -701,8 +701,6 @@ run_tests()
 	addr_nr_ns2="${6:-0}"
 	speed="${7:-fast}"
 	sflags="${8:-""}"
-	lret=0
-	oldin=""
 
 	# create the input file for the failure test when
 	# the first failure test run
@@ -730,7 +728,6 @@ run_tests()
 
 	do_transfer ${listener_ns} ${connector_ns} MPTCP MPTCP ${connect_addr} \
 		${test_linkfail} ${addr_nr_ns1} ${addr_nr_ns2} ${speed} ${sflags}
-	lret=$?
 }
 
 dump_stats()
-- 
2.34.1


^ permalink raw reply related	[flat|nested] 20+ messages in thread

* [PATCH mptcp-next 5/9] selftests: mptcp: join: create tmp files only if needed
  2022-02-09 21:25 [PATCH mptcp-next 0/9] Refactor mptcp_join.sh Matthieu Baerts
                   ` (3 preceding siblings ...)
  2022-02-09 21:25 ` [PATCH mptcp-next 4/9] selftests: mptcp: join: remove unused vars Matthieu Baerts
@ 2022-02-09 21:25 ` Matthieu Baerts
  2022-02-09 21:25 ` [PATCH mptcp-next 6/9] selftests: mptcp: join: check for tools " Matthieu Baerts
                   ` (4 subsequent siblings)
  9 siblings, 0 replies; 20+ messages in thread
From: Matthieu Baerts @ 2022-02-09 21:25 UTC (permalink / raw)
  To: mptcp; +Cc: Matthieu Baerts

These tmp files will only be created when a test will be launched.

This avoid 'dd' output when '-h' is used for example.

While at it, also avoid creating netns that will be removed when
starting the first test.

Signed-off-by: Matthieu Baerts <matthieu.baerts@tessares.net>
---
 .../testing/selftests/net/mptcp/mptcp_join.sh | 37 ++++++++++++-------
 1 file changed, 24 insertions(+), 13 deletions(-)

diff --git a/tools/testing/selftests/net/mptcp/mptcp_join.sh b/tools/testing/selftests/net/mptcp/mptcp_join.sh
index ce3e7db30b9d..5691221ca302 100755
--- a/tools/testing/selftests/net/mptcp/mptcp_join.sh
+++ b/tools/testing/selftests/net/mptcp/mptcp_join.sh
@@ -18,6 +18,7 @@ checksum=0
 ip_mptcp=0
 check_invert=0
 do_all_tests=1
+INIT=0
 
 TEST_COUNT=0
 ONLY_TESTS=()
@@ -41,7 +42,7 @@ CBPF_MPTCP_SUBOPTION_ADD_ADDR="14,
 			       6 0 0 65535,
 			       6 0 0 0"
 
-init()
+init_partial()
 {
 	capout=$(mktemp)
 
@@ -104,6 +105,21 @@ cleanup_partial()
 	done
 }
 
+init() {
+	INIT=1
+
+	sin=$(mktemp)
+	sout=$(mktemp)
+	cin=$(mktemp)
+	cinsent=$(mktemp)
+	cout=$(mktemp)
+
+	trap cleanup EXIT
+
+	make_file "$cin" "client" 1
+	make_file "$sin" "server" 1
+}
+
 cleanup()
 {
 	rm -f "$cin" "$cout" "$sinfail"
@@ -136,8 +152,13 @@ reset()
 		return 1
 	fi
 
-	cleanup_partial
-	init
+	if [ "${INIT}" != "1" ]; then
+		init
+	else
+		cleanup_partial
+	fi
+
+	init_partial
 
 	return 0
 }
@@ -2342,16 +2363,6 @@ usage()
 	exit ${ret}
 }
 
-sin=$(mktemp)
-sout=$(mktemp)
-cin=$(mktemp)
-cinsent=$(mktemp)
-cout=$(mktemp)
-init
-make_file "$cin" "client" 1
-make_file "$sin" "server" 1
-trap cleanup EXIT
-
 for arg in "$@"; do
 	# check for "capture/checksum" args before launching tests
 	if [[ "${arg}" =~ ^"-"[0-9a-zA-Z]*"c"[0-9a-zA-Z]*$ ]]; then
-- 
2.34.1


^ permalink raw reply related	[flat|nested] 20+ messages in thread

* [PATCH mptcp-next 6/9] selftests: mptcp: join: check for tools only if needed
  2022-02-09 21:25 [PATCH mptcp-next 0/9] Refactor mptcp_join.sh Matthieu Baerts
                   ` (4 preceding siblings ...)
  2022-02-09 21:25 ` [PATCH mptcp-next 5/9] selftests: mptcp: join: create tmp files only if needed Matthieu Baerts
@ 2022-02-09 21:25 ` Matthieu Baerts
  2022-02-09 21:25 ` [PATCH mptcp-next 7/9] selftests: mptcp: join: clarify local/global vars Matthieu Baerts
                   ` (3 subsequent siblings)
  9 siblings, 0 replies; 20+ messages in thread
From: Matthieu Baerts @ 2022-02-09 21:25 UTC (permalink / raw)
  To: mptcp; +Cc: Matthieu Baerts

To allow showing the 'help' menu even if these tools are not available.

While at it, also avoid launching the command then checking $?. Instead,
the check is directly done in the 'if'.

Signed-off-by: Matthieu Baerts <matthieu.baerts@tessares.net>
---
 .../testing/selftests/net/mptcp/mptcp_join.sh | 38 ++++++++++---------
 1 file changed, 20 insertions(+), 18 deletions(-)

diff --git a/tools/testing/selftests/net/mptcp/mptcp_join.sh b/tools/testing/selftests/net/mptcp/mptcp_join.sh
index 5691221ca302..8c1ee51e9cfd 100755
--- a/tools/testing/selftests/net/mptcp/mptcp_join.sh
+++ b/tools/testing/selftests/net/mptcp/mptcp_join.sh
@@ -105,9 +105,29 @@ cleanup_partial()
 	done
 }
 
+check_tools()
+{
+	if ! ip -Version &> /dev/null; then
+		echo "SKIP: Could not run test without ip tool"
+		exit $KSFT_SKIP
+	fi
+
+	if ! iptables -V &> /dev/null; then
+		echo "SKIP: Could not run all tests without iptables tool"
+		exit $KSFT_SKIP
+	fi
+
+	if ! ip6tables -V &> /dev/null; then
+		echo "SKIP: Could not run all tests without ip6tables tool"
+		exit $KSFT_SKIP
+	fi
+}
+
 init() {
 	INIT=1
 
+	check_tools
+
 	sin=$(mktemp)
 	sout=$(mktemp)
 	cin=$(mktemp)
@@ -214,24 +234,6 @@ reset_with_allow_join_id0()
 	ip netns exec $ns2 sysctl -q net.mptcp.allow_join_initial_addr_port=$ns2_enable
 }
 
-ip -Version > /dev/null 2>&1
-if [ $? -ne 0 ];then
-	echo "SKIP: Could not run test without ip tool"
-	exit $ksft_skip
-fi
-
-iptables -V > /dev/null 2>&1
-if [ $? -ne 0 ];then
-	echo "SKIP: Could not run all tests without iptables tool"
-	exit $ksft_skip
-fi
-
-ip6tables -V > /dev/null 2>&1
-if [ $? -ne 0 ];then
-	echo "SKIP: Could not run all tests without ip6tables tool"
-	exit $ksft_skip
-fi
-
 print_file_err()
 {
 	ls -l "$1" 1>&2
-- 
2.34.1


^ permalink raw reply related	[flat|nested] 20+ messages in thread

* [PATCH mptcp-next 7/9] selftests: mptcp: join: clarify local/global vars
  2022-02-09 21:25 [PATCH mptcp-next 0/9] Refactor mptcp_join.sh Matthieu Baerts
                   ` (5 preceding siblings ...)
  2022-02-09 21:25 ` [PATCH mptcp-next 6/9] selftests: mptcp: join: check for tools " Matthieu Baerts
@ 2022-02-09 21:25 ` Matthieu Baerts
  2022-02-09 21:25 ` [PATCH mptcp-next 8/9] selftests: mptcp: join: avoid backquotes Matthieu Baerts
                   ` (2 subsequent siblings)
  9 siblings, 0 replies; 20+ messages in thread
From: Matthieu Baerts @ 2022-02-09 21:25 UTC (permalink / raw)
  To: mptcp; +Cc: Matthieu Baerts

Some vars are redefined in different places. Best to avoid this
classical Bash pitfall where variables are accidentally overridden by
other functions.

To distinct between local and non local variables, all non local ones
now have capital letters. The others are now defined with the "local"
keyword.

Signed-off-by: Matthieu Baerts <matthieu.baerts@tessares.net>
---
 .../testing/selftests/net/mptcp/mptcp_join.sh | 1390 +++++++++--------
 1 file changed, 705 insertions(+), 685 deletions(-)

diff --git a/tools/testing/selftests/net/mptcp/mptcp_join.sh b/tools/testing/selftests/net/mptcp/mptcp_join.sh
index 8c1ee51e9cfd..15e642e0fa03 100755
--- a/tools/testing/selftests/net/mptcp/mptcp_join.sh
+++ b/tools/testing/selftests/net/mptcp/mptcp_join.sh
@@ -1,28 +1,29 @@
 #!/bin/bash
 # SPDX-License-Identifier: GPL-2.0
 
-ret=0
-sin=""
-sinfail=""
-sout=""
-cin=""
-cinfail=""
-cinsent=""
-cout=""
-ksft_skip=4
-timeout_poll=30
-timeout_test=$((timeout_poll * 2 + 1))
-mptcp_connect=""
-capture=0
-checksum=0
-ip_mptcp=0
-check_invert=0
-do_all_tests=1
+RET=0
+SIN=""
+SINFAIL=""
+SOUT=""
+CIN=""
+CINFAIL=""
+CINSENT=""
+COUT=""
+CAPOUT=""
+KSFT_SKIP=4
+TIMEOUT_POLL=30
+TIMEOUT_TEST=$((TIMEOUT_POLL * 2 + 1))
+MPTCP_CONNECT=""
+CAPTURE=0
+CHECKSUM=0
+IP_MPTCP=0
+CHECK_INVERT=0
+DO_ALL_TESTS=1
 INIT=0
 
 TEST_COUNT=0
 ONLY_TESTS=()
-nr_blank=40
+NR_BLANK=40
 
 # generated using "nfbpf_compile '(ip && (ip[54] & 0xf0) == 0x30) ||
 #				  (ip6 && (ip6[74] & 0xf0) == 0x30)'"
@@ -44,26 +45,28 @@ CBPF_MPTCP_SUBOPTION_ADD_ADDR="14,
 
 init_partial()
 {
-	capout=$(mktemp)
+	CAPOUT=$(mktemp)
 
+	local rndh
 	rndh=$(mktemp -u XXXXXX)
 
-	ns1="ns1-$rndh"
-	ns2="ns2-$rndh"
+	NS1="ns1-$rndh"
+	NS2="ns2-$rndh"
 
-	for netns in "$ns1" "$ns2";do
-		ip netns add $netns || exit $ksft_skip
+	local netns
+	for netns in "$NS1" "$NS2"; do
+		ip netns add $netns || exit $KSFT_SKIP
 		ip -net $netns link set lo up
 		ip netns exec $netns sysctl -q net.mptcp.enabled=1
 		ip netns exec $netns sysctl -q net.mptcp.pm_type=0
 		ip netns exec $netns sysctl -q net.ipv4.conf.all.rp_filter=0
 		ip netns exec $netns sysctl -q net.ipv4.conf.default.rp_filter=0
-		if [ $checksum -eq 1 ]; then
+		if [ $CHECKSUM -eq 1 ]; then
 			ip netns exec $netns sysctl -q net.mptcp.checksum_enabled=1
 		fi
 	done
 
-	check_invert=0
+	CHECK_INVERT=0
 
 	#  ns1              ns2
 	# ns1eth1    ns2eth1
@@ -71,35 +74,38 @@ init_partial()
 	# ns1eth3    ns2eth3
 	# ns1eth4    ns2eth4
 
+	local i
 	for i in `seq 1 4`; do
-		ip link add ns1eth$i netns "$ns1" type veth peer name ns2eth$i netns "$ns2"
-		ip -net "$ns1" addr add 10.0.$i.1/24 dev ns1eth$i
-		ip -net "$ns1" addr add dead:beef:$i::1/64 dev ns1eth$i nodad
-		ip -net "$ns1" link set ns1eth$i up
-
-		ip -net "$ns2" addr add 10.0.$i.2/24 dev ns2eth$i
-		ip -net "$ns2" addr add dead:beef:$i::2/64 dev ns2eth$i nodad
-		ip -net "$ns2" link set ns2eth$i up
-
-		# let $ns2 reach any $ns1 address from any interface
-		ip -net "$ns2" route add default via 10.0.$i.1 dev ns2eth$i metric 10$i
-		ip -net "$ns2" route add default via dead:beef:$i::1 dev ns2eth$i metric 10$i
+		ip link add ns1eth$i netns "$NS1" type veth peer name ns2eth$i netns "$NS2"
+		ip -net "$NS1" addr add 10.0.$i.1/24 dev ns1eth$i
+		ip -net "$NS1" addr add dead:beef:$i::1/64 dev ns1eth$i nodad
+		ip -net "$NS1" link set ns1eth$i up
+
+		ip -net "$NS2" addr add 10.0.$i.2/24 dev ns2eth$i
+		ip -net "$NS2" addr add dead:beef:$i::2/64 dev ns2eth$i nodad
+		ip -net "$NS2" link set ns2eth$i up
+
+		# let $NS2 reach any $NS1 address from any interface
+		ip -net "$NS2" route add default via 10.0.$i.1 dev ns2eth$i metric 10$i
+		ip -net "$NS2" route add default via dead:beef:$i::1 dev ns2eth$i metric 10$i
 	done
 }
 
 init_shapers()
 {
+	local i
 	for i in `seq 1 4`; do
-		tc -n $ns1 qdisc add dev ns1eth$i root netem rate 20mbit delay 1
-		tc -n $ns2 qdisc add dev ns2eth$i root netem rate 20mbit delay 1
+		tc -n $NS1 qdisc add dev ns1eth$i root netem rate 20mbit delay 1
+		tc -n $NS2 qdisc add dev ns2eth$i root netem rate 20mbit delay 1
 	done
 }
 
 cleanup_partial()
 {
-	rm -f "$capout"
+	rm -f "${CAPOUT}"
 
-	for netns in "$ns1" "$ns2"; do
+	local netns
+	for netns in "$NS1" "$NS2"; do
 		ip netns del $netns
 		rm -f /tmp/$netns.{nstat,out}
 	done
@@ -128,33 +134,32 @@ init() {
 
 	check_tools
 
-	sin=$(mktemp)
-	sout=$(mktemp)
-	cin=$(mktemp)
-	cinsent=$(mktemp)
-	cout=$(mktemp)
+	SIN=$(mktemp)
+	SOUT=$(mktemp)
+	CIN=$(mktemp)
+	CINSENT=$(mktemp)
+	COUT=$(mktemp)
 
 	trap cleanup EXIT
 
-	make_file "$cin" "client" 1
-	make_file "$sin" "server" 1
+	make_file "$CIN" "client" 1
+	make_file "$SIN" "server" 1
 }
 
 cleanup()
 {
-	rm -f "$cin" "$cout" "$sinfail"
-	rm -f "$sin" "$sout" "$cinsent" "$cinfail"
+	rm -f "${CIN}" "${COUT}" "${SINFAIL}"
+	rm -f "${SIN}" "${SOUT}" "${CINSENT}" "${CINFAIL}"
 	cleanup_partial
 }
 
 skip_test()
 {
-	local i
-
 	if [ "${#ONLY_TESTS[@]}" -eq 0 ]; then
 		return 1
 	fi
 
+	local i
 	for i in "${ONLY_TESTS[@]}"; do
 		if [ "${TEST_COUNT}" -eq "${i}" ]; then
 			return 1
@@ -187,7 +192,8 @@ reset_with_cookies()
 {
 	reset || return 1
 
-	for netns in "$ns1" "$ns2";do
+	local netns
+	for netns in "$NS1" "$NS2"; do
 		ip netns exec $netns sysctl -q net.ipv4.tcp_syncookies=2
 	done
 }
@@ -197,15 +203,15 @@ reset_with_add_addr_timeout()
 	local ip="${1:-4}"
 	local tables
 
+	reset || return 1
+
 	tables="iptables"
 	if [ $ip -eq 6 ]; then
 		tables="ip6tables"
 	fi
 
-	reset || return 1
-
-	ip netns exec $ns1 sysctl -q net.mptcp.add_addr_timeout=1
-	ip netns exec $ns2 $tables -A OUTPUT -p tcp \
+	ip netns exec $NS1 sysctl -q net.mptcp.add_addr_timeout=1
+	ip netns exec $NS2 $tables -A OUTPUT -p tcp \
 		-m tcp --tcp-option 30 \
 		-m bpf --bytecode \
 		"$CBPF_MPTCP_SUBOPTION_ADD_ADDR" \
@@ -219,8 +225,8 @@ reset_with_checksum()
 
 	reset || return 1
 
-	ip netns exec $ns1 sysctl -q net.mptcp.checksum_enabled=$ns1_enable
-	ip netns exec $ns2 sysctl -q net.mptcp.checksum_enabled=$ns2_enable
+	ip netns exec $NS1 sysctl -q net.mptcp.checksum_enabled=$ns1_enable
+	ip netns exec $NS2 sysctl -q net.mptcp.checksum_enabled=$ns2_enable
 }
 
 reset_with_allow_join_id0()
@@ -230,8 +236,8 @@ reset_with_allow_join_id0()
 
 	reset || return 1
 
-	ip netns exec $ns1 sysctl -q net.mptcp.allow_join_initial_addr_port=$ns1_enable
-	ip netns exec $ns2 sysctl -q net.mptcp.allow_join_initial_addr_port=$ns2_enable
+	ip netns exec $NS1 sysctl -q net.mptcp.allow_join_initial_addr_port=$ns1_enable
+	ip netns exec $NS2 sysctl -q net.mptcp.allow_join_initial_addr_port=$ns2_enable
 }
 
 print_file_err()
@@ -243,19 +249,19 @@ print_file_err()
 
 check_transfer()
 {
-	in=$1
-	out=$2
-	what=$3
+	local in=$1
+	local out=$2
+	local what=$3
 
 	cmp -l "$in" "$out" | while read line; do
 		local arr=($line)
 
 		let sum=0${arr[1]}+0${arr[2]}
-		if [ $check_invert -eq 0 ] || [ $sum -ne $((0xff)) ]; then
+		if [ $CHECK_INVERT -eq 0 ] || [ $sum -ne $((0xff)) ]; then
 			echo "[ FAIL ] $what does not match (in, out):"
 			print_file_err "$in"
 			print_file_err "$out"
-			ret=1
+			RET=1
 
 			return 1
 		else
@@ -268,28 +274,29 @@ check_transfer()
 
 do_ping()
 {
-	listener_ns="$1"
-	connector_ns="$2"
-	connect_addr="$3"
+	local listener_ns="$1"
+	local connector_ns="$2"
+	local connect_addr="$3"
 
 	ip netns exec ${connector_ns} ping -q -c 1 $connect_addr >/dev/null
 	if [ $? -ne 0 ] ; then
 		echo "$listener_ns -> $connect_addr connectivity [ FAIL ]" 1>&2
-		ret=1
+		RET=1
 	fi
 }
 
 link_failure()
 {
-	ns="$1"
+	local ns="$1"
 
 	if [ -z "$FAILING_LINKS" ]; then
 		l=$((RANDOM%4))
 		FAILING_LINKS=$((l+1))
 	fi
 
+	local l
 	for l in $FAILING_LINKS; do
-		veth="ns1eth$l"
+		local veth="ns1eth$l"
 		ip -net "$ns" link set "$veth" down
 	done
 }
@@ -319,7 +326,7 @@ wait_local_port_listen()
 
 rm_addr_count()
 {
-	ns=${1}
+	local ns=${1}
 
 	ip netns exec ${ns} nstat -as | grep MPTcpExtRmAddr | awk '{print $2}'
 }
@@ -345,7 +352,7 @@ pm_nl_set_limits()
 	local addrs=$2
 	local subflows=$3
 
-	if [ $ip_mptcp -eq 1 ]; then
+	if [ $IP_MPTCP -eq 1 ]; then
 		ip -n $ns mptcp limits set add_addr_accepted $addrs subflows $subflows
 	else
 		ip netns exec $ns ./pm_nl_ctl limits $addrs $subflows
@@ -356,11 +363,12 @@ pm_nl_add_endpoint()
 {
 	local ns=$1
 	local addr=$2
-	local flags
-	local port
-	local dev
-	local id
+	local flags _flags
+	local port _port
+	local dev _dev
+	local id _id
 	local nr=2
+	local p
 
 	for p in $@
 	do
@@ -384,7 +392,7 @@ pm_nl_add_endpoint()
 		let nr+=1
 	done
 
-	if [ $ip_mptcp -eq 1 ]; then
+	if [ $IP_MPTCP -eq 1 ]; then
 		ip -n $ns mptcp endpoint add $addr ${_flags//","/" "} $dev $id $port
 	else
 		ip netns exec $ns ./pm_nl_ctl add $addr $flags $dev $id $port
@@ -397,7 +405,7 @@ pm_nl_del_endpoint()
 	local id=$2
 	local addr=$3
 
-	if [ $ip_mptcp -eq 1 ]; then
+	if [ $IP_MPTCP -eq 1 ]; then
 		ip -n $ns mptcp endpoint delete id $id $addr
 	else
 		ip netns exec $ns ./pm_nl_ctl del $id $addr
@@ -408,7 +416,7 @@ pm_nl_flush_endpoint()
 {
 	local ns=$1
 
-	if [ $ip_mptcp -eq 1 ]; then
+	if [ $IP_MPTCP -eq 1 ]; then
 		ip -n $ns mptcp endpoint flush
 	else
 		ip netns exec $ns ./pm_nl_ctl flush
@@ -419,7 +427,7 @@ pm_nl_show_endpoints()
 {
 	local ns=$1
 
-	if [ $ip_mptcp -eq 1 ]; then
+	if [ $IP_MPTCP -eq 1 ]; then
 		ip -n $ns mptcp endpoint show
 	else
 		ip netns exec $ns ./pm_nl_ctl dump
@@ -432,7 +440,7 @@ pm_nl_change_endpoint()
 	local id=$2
 	local flags=$3
 
-	if [ $ip_mptcp -eq 1 ]; then
+	if [ $IP_MPTCP -eq 1 ]; then
 		ip -n $ns mptcp endpoint change id $id ${flags//","/" "}
 	else
 		ip netns exec $ns ./pm_nl_ctl set id $id flags $flags
@@ -441,24 +449,26 @@ pm_nl_change_endpoint()
 
 do_transfer()
 {
-	listener_ns="$1"
-	connector_ns="$2"
-	cl_proto="$3"
-	srv_proto="$4"
-	connect_addr="$5"
-	test_link_fail="$6"
-	addr_nr_ns1="$7"
-	addr_nr_ns2="$8"
-	speed="$9"
-	sflags="${10}"
-
-	port=$((10000+$TEST_COUNT-1))
-
-	:> "$cout"
-	:> "$sout"
-	:> "$capout"
-
-	if [ $capture -eq 1 ]; then
+	local listener_ns="$1"
+	local connector_ns="$2"
+	local cl_proto="$3"
+	local srv_proto="$4"
+	local connect_addr="$5"
+	local test_link_fail="$6"
+	local addr_nr_ns1="$7"
+	local addr_nr_ns2="$8"
+	local speed="$9"
+	local sflags="${10}"
+
+	local port=$((10000 + TEST_COUNT - 1))
+	local cappid
+
+	:> "$COUT"
+	:> "$SOUT"
+	:> "$CAPOUT"
+
+	if [ $CAPTURE -eq 1 ]; then
+		local capuser
 		if [ -z $SUDO_USER ] ; then
 			capuser=""
 		else
@@ -468,7 +478,7 @@ do_transfer()
 		capfile=$(printf "mp_join-%02u-%s.pcap" "$TEST_COUNT" "${listener_ns}")
 
 		echo "Capturing traffic for test $TEST_COUNT into $capfile"
-		ip netns exec ${listener_ns} tcpdump -i any -s 65535 -B 32768 $capuser -w $capfile > "$capout" 2>&1 &
+		ip netns exec ${listener_ns} tcpdump -i any -s 65535 -B 32768 $capuser -w $capfile > "$CAPOUT" 2>&1 &
 		cappid=$!
 
 		sleep 1
@@ -480,11 +490,11 @@ do_transfer()
 		nstat -n
 
 	if [ $speed = "fast" ]; then
-		mptcp_connect="./mptcp_connect -j"
+		MPTCP_CONNECT="./mptcp_connect -j"
 	elif [ $speed = "slow" ]; then
-		mptcp_connect="./mptcp_connect -r 50"
+		MPTCP_CONNECT="./mptcp_connect -r 50"
 	elif [ $speed = "least" ]; then
-		mptcp_connect="./mptcp_connect -r 10"
+		MPTCP_CONNECT="./mptcp_connect -r 10"
 	fi
 
 	local local_addr
@@ -495,42 +505,43 @@ do_transfer()
 	fi
 
 	if [ "$test_link_fail" -eq 2 ];then
-		timeout ${timeout_test} \
+		timeout ${TIMEOUT_TEST} \
 			ip netns exec ${listener_ns} \
-				$mptcp_connect -t ${timeout_poll} -l -p $port -s ${srv_proto} \
-					${local_addr} < "$sinfail" > "$sout" &
+				$MPTCP_CONNECT -t ${TIMEOUT_POLL} -l -p $port -s ${srv_proto} \
+					${local_addr} < "$SINFAIL" > "$SOUT" &
 	else
-		timeout ${timeout_test} \
+		timeout ${TIMEOUT_TEST} \
 			ip netns exec ${listener_ns} \
-				$mptcp_connect -t ${timeout_poll} -l -p $port -s ${srv_proto} \
-					${local_addr} < "$sin" > "$sout" &
+				$MPTCP_CONNECT -t ${TIMEOUT_POLL} -l -p $port -s ${srv_proto} \
+					${local_addr} < "$SIN" > "$SOUT" &
 	fi
-	spid=$!
+	local spid=$!
 
 	wait_local_port_listen "${listener_ns}" "${port}"
 
 	if [ "$test_link_fail" -eq 0 ];then
-		timeout ${timeout_test} \
+		timeout ${TIMEOUT_TEST} \
 			ip netns exec ${connector_ns} \
-				$mptcp_connect -t ${timeout_poll} -p $port -s ${cl_proto} \
-					$connect_addr < "$cin" > "$cout" &
+				$MPTCP_CONNECT -t ${TIMEOUT_POLL} -p $port -s ${cl_proto} \
+					$connect_addr < "$CIN" > "$COUT" &
 	else
-		( cat "$cinfail" ; sleep 2; link_failure $listener_ns ; cat "$cinfail" ) | \
-			tee "$cinsent" | \
-			timeout ${timeout_test} \
+		( cat "$CINFAIL" ; sleep 2; link_failure $listener_ns ; cat "$CINFAIL" ) | \
+			tee "$CINSENT" | \
+			timeout ${TIMEOUT_TEST} \
 				ip netns exec ${connector_ns} \
-					$mptcp_connect -t ${timeout_poll} -p $port -s ${cl_proto} \
-						$connect_addr > "$cout" &
+					$MPTCP_CONNECT -t ${TIMEOUT_POLL} -p $port -s ${cl_proto} \
+						$connect_addr > "$COUT" &
 	fi
-	cpid=$!
+	local cpid=$!
 
 	# let the mptcp subflow be established in background before
 	# do endpoint manipulation
 	[ $addr_nr_ns1 = "0" -a $addr_nr_ns2 = "0" ] || sleep 1
 
 	if [ $addr_nr_ns1 -gt 0 ]; then
+		local counter=2
+		local add_nr_ns1
 		let add_nr_ns1=addr_nr_ns1
-		counter=2
 		while [ $add_nr_ns1 -gt 0 ]; do
 			local addr
 			if is_v6 "${connect_addr}"; then
@@ -538,18 +549,20 @@ do_transfer()
 			else
 				addr="10.0.$counter.1"
 			fi
-			pm_nl_add_endpoint $ns1 $addr flags signal
+			pm_nl_add_endpoint $NS1 $addr flags signal
 			let counter+=1
 			let add_nr_ns1-=1
 		done
 	elif [ $addr_nr_ns1 -lt 0 ]; then
+		local rm_nr_ns1
 		let rm_nr_ns1=-addr_nr_ns1
 		if [ $rm_nr_ns1 -lt 8 ]; then
-			counter=0
+			local counter=0
 			pm_nl_show_endpoints ${listener_ns} | while read line; do
 				local arr=($line)
 				local nr=0
 
+				local i
 				for i in ${arr[@]}; do
 					if [ $i = "id" ]; then
 						if [ $counter -eq $rm_nr_ns1 ]; then
@@ -571,7 +584,7 @@ do_transfer()
 		fi
 	fi
 
-	flags="subflow"
+	local flags="subflow"
 	if [[ "${addr_nr_ns2}" = "fullmesh_"* ]]; then
 		flags="${flags},fullmesh"
 		addr_nr_ns2=${addr_nr_ns2:9}
@@ -582,8 +595,9 @@ do_transfer()
 	[ $addr_nr_ns1 -gt 0 -a $addr_nr_ns2 -lt 0 ] && sleep 1
 
 	if [ $addr_nr_ns2 -gt 0 ]; then
+		local add_nr_ns2
 		let add_nr_ns2=addr_nr_ns2
-		counter=3
+		local counter=3
 		while [ $add_nr_ns2 -gt 0 ]; do
 			local addr
 			if is_v6 "${connect_addr}"; then
@@ -596,18 +610,20 @@ do_transfer()
 			let add_nr_ns2-=1
 		done
 	elif [ $addr_nr_ns2 -lt 0 ]; then
-		let rm_nr_ns2=-addr_nr_ns2
+		local rm_nr_ns2
 		if [ $rm_nr_ns2 -lt 8 ]; then
-			counter=0
+			local counter=0
 			pm_nl_show_endpoints ${connector_ns} | while read line; do
 				local arr=($line)
 				local nr=0
+				local i
 
 				for i in ${arr[@]}; do
 					if [ $i = "id" ]; then
 						if [ $counter -eq $rm_nr_ns2 ]; then
 							break
 						fi
+						local id rm_addr
 						# rm_addr are serialized, allow the previous one to
 						# complete
 						id=${arr[$nr+1]}
@@ -634,7 +650,7 @@ do_transfer()
 
 	if [ ! -z $sflags ]; then
 		sleep 1
-		for netns in "$ns1" "$ns2"; do
+		for netns in "$NS1" "$NS2"; do
 			pm_nl_show_endpoints $netns | while read line; do
 				local arr=($line)
 				local nr=0
@@ -652,11 +668,11 @@ do_transfer()
 	fi
 
 	wait $cpid
-	retc=$?
+	local retc=$?
 	wait $spid
-	rets=$?
+	local rets=$?
 
-	if [ $capture -eq 1 ]; then
+	if [ $CAPTURE -eq 1 ]; then
 	    sleep 1
 	    kill $cappid
 	fi
@@ -675,38 +691,38 @@ do_transfer()
 		ip netns exec ${connector_ns} ss -Menita 1>&2 -o "dport = :$port"
 		cat /tmp/${connector_ns}.out
 
-		cat "$capout"
-		ret=1
+		cat "$CAPOUT"
+		RET=1
 		return 1
 	fi
 
 	if [ "$test_link_fail" -eq 2 ];then
-		check_transfer $sinfail $cout "file received by client"
+		check_transfer $SINFAIL $COUT "file received by client"
 	else
-		check_transfer $sin $cout "file received by client"
+		check_transfer $SIN $COUT "file received by client"
 	fi
 	retc=$?
 	if [ "$test_link_fail" -eq 0 ];then
-		check_transfer $cin $sout "file received by server"
+		check_transfer $CIN $SOUT "file received by server"
 	else
-		check_transfer $cinsent $sout "file received by server"
+		check_transfer $CINSENT $SOUT "file received by server"
 	fi
 	rets=$?
 
 	if [ $retc -eq 0 ] && [ $rets -eq 0 ];then
-		cat "$capout"
+		cat "$CAPOUT"
 		return 0
 	fi
 
-	cat "$capout"
+	cat "$CAPOUT"
 	return 1
 }
 
 make_file()
 {
-	name=$1
-	who=$2
-	size=$3
+	local name=$1
+	local who=$2
+	local size=$3
 
 	dd if=/dev/urandom of="$name" bs=1024 count=$size 2> /dev/null
 	echo -e "\nMPTCP_TEST_FILE_END_MARKER" >> "$name"
@@ -716,18 +732,20 @@ make_file()
 
 run_tests()
 {
-	listener_ns="$1"
-	connector_ns="$2"
-	connect_addr="$3"
-	test_linkfail="${4:-0}"
-	addr_nr_ns1="${5:-0}"
-	addr_nr_ns2="${6:-0}"
-	speed="${7:-fast}"
-	sflags="${8:-""}"
+	local listener_ns="$1"
+	local connector_ns="$2"
+	local connect_addr="$3"
+	local test_linkfail="${4:-0}"
+	local addr_nr_ns1="${5:-0}"
+	local addr_nr_ns2="${6:-0}"
+	local speed="${7:-fast}"
+	local sflags="${8:-""}"
+
+	local size
 
 	# create the input file for the failure test when
 	# the first failure test run
-	if [ "$test_linkfail" -ne 0 -a -z "$cinfail" ]; then
+	if [ "$test_linkfail" -ne 0 -a -z "$CINFAIL" ]; then
 		# the client file must be considerably larger
 		# of the maximum expected cwin value, or the
 		# link utilization will be not predicable
@@ -736,17 +754,17 @@ run_tests()
 		size=$((size*8192))
 		size=$((size + ( $RANDOM % 8192) ))
 
-		cinfail=$(mktemp)
-		make_file "$cinfail" "client" $size
+		CINFAIL=$(mktemp)
+		make_file "$CINFAIL" "client" $size
 	fi
 
-	if [ "$test_linkfail" -eq 2 -a -z "$sinfail" ]; then
+	if [ "$test_linkfail" -eq 2 -a -z "$SINFAIL" ]; then
 		size=$((RANDOM%16))
 		size=$((size+1))
 		size=$((size*2048))
 
-		sinfail=$(mktemp)
-		make_file "$sinfail" "server" $size
+		SINFAIL=$(mktemp)
+		make_file "$SINFAIL" "server" $size
 	fi
 
 	do_transfer ${listener_ns} ${connector_ns} MPTCP MPTCP ${connect_addr} \
@@ -756,9 +774,9 @@ run_tests()
 dump_stats()
 {
 	echo Server ns stats
-	ip netns exec $ns1 nstat -as | grep Tcp
+	ip netns exec $NS1 nstat -as | grep Tcp
 	echo Client ns stats
-	ip netns exec $ns2 nstat -as | grep Tcp
+	ip netns exec $NS2 nstat -as | grep Tcp
 }
 
 chk_csum_nr()
@@ -773,21 +791,21 @@ chk_csum_nr()
 		echo -n "   "
 	fi
 	printf " %-36s %s" "$msg" "sum"
-	count=`ip netns exec $ns1 nstat -as | grep MPTcpExtDataCsumErr | awk '{print $2}'`
+	count=`ip netns exec $NS1 nstat -as | grep MPTcpExtDataCsumErr | awk '{print $2}'`
 	[ -z "$count" ] && count=0
 	if [ "$count" != 0 ]; then
 		echo "[fail] got $count data checksum error[s] expected 0"
-		ret=1
+		RET=1
 		dump_stats=1
 	else
 		echo -n "[ ok ]"
 	fi
 	echo -n " - csum  "
-	count=`ip netns exec $ns2 nstat -as | grep MPTcpExtDataCsumErr | awk '{print $2}'`
+	count=`ip netns exec $NS2 nstat -as | grep MPTcpExtDataCsumErr | awk '{print $2}'`
 	[ -z "$count" ] && count=0
 	if [ "$count" != 0 ]; then
 		echo "[fail] got $count data checksum error[s] expected 0"
-		ret=1
+		RET=1
 		dump_stats=1
 	else
 		echo "[ ok ]"
@@ -802,23 +820,23 @@ chk_fail_nr()
 	local count
 	local dump_stats
 
-	printf "%-${nr_blank}s %s" " " "ftx"
-	count=`ip netns exec $ns1 nstat -as | grep MPTcpExtMPFailTx | awk '{print $2}'`
+	printf "%-${NR_BLANK}s %s" " " "ftx"
+	count=`ip netns exec $NS1 nstat -as | grep MPTcpExtMPFailTx | awk '{print $2}'`
 	[ -z "$count" ] && count=0
 	if [ "$count" != "$mp_fail_nr_tx" ]; then
 		echo "[fail] got $count MP_FAIL[s] TX expected $mp_fail_nr_tx"
-		ret=1
+		RET=1
 		dump_stats=1
 	else
 		echo -n "[ ok ]"
 	fi
 
 	echo -n " - frx   "
-	count=`ip netns exec $ns2 nstat -as | grep MPTcpExtMPFailRx | awk '{print $2}'`
+	count=`ip netns exec $NS2 nstat -as | grep MPTcpExtMPFailRx | awk '{print $2}'`
 	[ -z "$count" ] && count=0
 	if [ "$count" != "$mp_fail_nr_rx" ]; then
 		echo "[fail] got $count MP_FAIL[s] RX expected $mp_fail_nr_rx"
-		ret=1
+		RET=1
 		dump_stats=1
 	else
 		echo "[ ok ]"
@@ -834,23 +852,23 @@ chk_infi_nr()
 	local count
 	local dump_stats
 
-	printf "%-${nr_blank}s %s" " " "itx"
-	count=`ip netns exec $ns2 nstat -as | grep InfiniteMapTx | awk '{print $2}'`
+	printf "%-${NR_BLANK}s %s" " " "itx"
+	count=`ip netns exec $NS2 nstat -as | grep InfiniteMapTx | awk '{print $2}'`
 	[ -z "$count" ] && count=0
 	if [ "$count" != "$mp_infi_nr_tx" ]; then
 		echo "[fail] got $count infinite map[s] TX expected $mp_infi_nr_tx"
-		ret=1
+		RET=1
 		dump_stats=1
 	else
 		echo -n "[ ok ]"
 	fi
 
 	echo -n " - irx   "
-	count=`ip netns exec $ns1 nstat -as | grep InfiniteMapRx | awk '{print $2}'`
+	count=`ip netns exec $NS1 nstat -as | grep InfiniteMapRx | awk '{print $2}'`
 	[ -z "$count" ] && count=0
 	if [ "$count" != "$mp_infi_nr_rx" ]; then
 		echo "[fail] got $count infinite map[s] RX expected $mp_infi_nr_rx"
-		ret=1
+		RET=1
 		dump_stats=1
 	else
 		echo "[ ok ]"
@@ -869,39 +887,39 @@ chk_join_nr()
 	local dump_stats
 
 	printf "%03u %-36s %s" "$TEST_COUNT" "$msg" "syn"
-	count=`ip netns exec $ns1 nstat -as | grep MPTcpExtMPJoinSynRx | awk '{print $2}'`
+	count=`ip netns exec $NS1 nstat -as | grep MPTcpExtMPJoinSynRx | awk '{print $2}'`
 	[ -z "$count" ] && count=0
 	if [ "$count" != "$syn_nr" ]; then
 		echo "[fail] got $count JOIN[s] syn expected $syn_nr"
-		ret=1
+		RET=1
 		dump_stats=1
 	else
 		echo -n "[ ok ]"
 	fi
 
 	echo -n " - synack"
-	count=`ip netns exec $ns2 nstat -as | grep MPTcpExtMPJoinSynAckRx | awk '{print $2}'`
+	count=`ip netns exec $NS2 nstat -as | grep MPTcpExtMPJoinSynAckRx | awk '{print $2}'`
 	[ -z "$count" ] && count=0
 	if [ "$count" != "$syn_ack_nr" ]; then
 		echo "[fail] got $count JOIN[s] synack expected $syn_ack_nr"
-		ret=1
+		RET=1
 		dump_stats=1
 	else
 		echo -n "[ ok ]"
 	fi
 
 	echo -n " - ack"
-	count=`ip netns exec $ns1 nstat -as | grep MPTcpExtMPJoinAckRx | awk '{print $2}'`
+	count=`ip netns exec $NS1 nstat -as | grep MPTcpExtMPJoinAckRx | awk '{print $2}'`
 	[ -z "$count" ] && count=0
 	if [ "$count" != "$ack_nr" ]; then
 		echo "[fail] got $count JOIN[s] ack expected $ack_nr"
-		ret=1
+		RET=1
 		dump_stats=1
 	else
 		echo "[ ok ]"
 	fi
 	[ "${dump_stats}" = 1 ] && dump_stats
-	if [ $checksum -eq 1 ]; then
+	if [ $CHECKSUM -eq 1 ]; then
 		chk_csum_nr
 		chk_fail_nr 0 0
 		chk_infi_nr 0 0
@@ -923,7 +941,7 @@ chk_stale_nr()
 	local stale_nr
 	local recover_nr
 
-	printf "%-${nr_blank}s %-18s" " " "stale"
+	printf "%-${NR_BLANK}s %-18s" " " "stale"
 	stale_nr=`ip netns exec $ns nstat -as | grep MPTcpExtSubflowStale | awk '{print $2}'`
 	[ -z "$stale_nr" ] && stale_nr=0
 	recover_nr=`ip netns exec $ns nstat -as | grep MPTcpExtSubflowRecover | awk '{print $2}'`
@@ -935,7 +953,7 @@ chk_stale_nr()
 		echo "[fail] got $stale_nr stale[s] $recover_nr recover[s], " \
 		     " expected stale in range [$stale_min..$stale_max]," \
 		     " stale-recover delta $stale_delta "
-		ret=1
+		RET=1
 		dump_stats=1
 	else
 		echo "[ ok ]"
@@ -962,28 +980,28 @@ chk_add_nr()
 	local dump_stats
 	local timeout
 
-	timeout=`ip netns exec $ns1 sysctl -n net.mptcp.add_addr_timeout`
+	timeout=`ip netns exec $NS1 sysctl -n net.mptcp.add_addr_timeout`
 
-	printf "%-${nr_blank}s %s" " " "add"
-	count=`ip netns exec $ns2 nstat -as MPTcpExtAddAddr | grep MPTcpExtAddAddr | awk '{print $2}'`
+	printf "%-${NR_BLANK}s %s" " " "add"
+	count=`ip netns exec $NS2 nstat -as MPTcpExtAddAddr | grep MPTcpExtAddAddr | awk '{print $2}'`
 	[ -z "$count" ] && count=0
 
 	# if the test configured a short timeout tolerate greater then expected
 	# add addrs options, due to retransmissions
 	if [ "$count" != "$add_nr" ] && [ "$timeout" -gt 1 -o "$count" -lt "$add_nr" ]; then
 		echo "[fail] got $count ADD_ADDR[s] expected $add_nr"
-		ret=1
+		RET=1
 		dump_stats=1
 	else
 		echo -n "[ ok ]"
 	fi
 
 	echo -n " - echo  "
-	count=`ip netns exec $ns1 nstat -as | grep MPTcpExtEchoAdd | awk '{print $2}'`
+	count=`ip netns exec $NS1 nstat -as | grep MPTcpExtEchoAdd | awk '{print $2}'`
 	[ -z "$count" ] && count=0
 	if [ "$count" != "$echo_nr" ]; then
 		echo "[fail] got $count ADD_ADDR echo[s] expected $echo_nr"
-		ret=1
+		RET=1
 		dump_stats=1
 	else
 		echo -n "[ ok ]"
@@ -991,76 +1009,76 @@ chk_add_nr()
 
 	if [ $port_nr -gt 0 ]; then
 		echo -n " - pt "
-		count=`ip netns exec $ns2 nstat -as | grep MPTcpExtPortAdd | awk '{print $2}'`
+		count=`ip netns exec $NS2 nstat -as | grep MPTcpExtPortAdd | awk '{print $2}'`
 		[ -z "$count" ] && count=0
 		if [ "$count" != "$port_nr" ]; then
 			echo "[fail] got $count ADD_ADDR[s] with a port-number expected $port_nr"
-			ret=1
+			RET=1
 			dump_stats=1
 		else
 			echo "[ ok ]"
 		fi
 
-		printf "%-${nr_blank}s %s" " " "syn"
-		count=`ip netns exec $ns1 nstat -as | grep MPTcpExtMPJoinPortSynRx |
+		printf "%-${NR_BLANK}s %s" " " "syn"
+		count=`ip netns exec $NS1 nstat -as | grep MPTcpExtMPJoinPortSynRx |
 			awk '{print $2}'`
 		[ -z "$count" ] && count=0
 		if [ "$count" != "$syn_nr" ]; then
 			echo "[fail] got $count JOIN[s] syn with a different \
 				port-number expected $syn_nr"
-			ret=1
+			RET=1
 			dump_stats=1
 		else
 			echo -n "[ ok ]"
 		fi
 
 		echo -n " - synack"
-		count=`ip netns exec $ns2 nstat -as | grep MPTcpExtMPJoinPortSynAckRx |
+		count=`ip netns exec $NS2 nstat -as | grep MPTcpExtMPJoinPortSynAckRx |
 			awk '{print $2}'`
 		[ -z "$count" ] && count=0
 		if [ "$count" != "$syn_ack_nr" ]; then
 			echo "[fail] got $count JOIN[s] synack with a different \
 				port-number expected $syn_ack_nr"
-			ret=1
+			RET=1
 			dump_stats=1
 		else
 			echo -n "[ ok ]"
 		fi
 
 		echo -n " - ack"
-		count=`ip netns exec $ns1 nstat -as | grep MPTcpExtMPJoinPortAckRx |
+		count=`ip netns exec $NS1 nstat -as | grep MPTcpExtMPJoinPortAckRx |
 			awk '{print $2}'`
 		[ -z "$count" ] && count=0
 		if [ "$count" != "$ack_nr" ]; then
 			echo "[fail] got $count JOIN[s] ack with a different \
 				port-number expected $ack_nr"
-			ret=1
+			RET=1
 			dump_stats=1
 		else
 			echo "[ ok ]"
 		fi
 
-		printf "%-${nr_blank}s %s" " " "syn"
-		count=`ip netns exec $ns1 nstat -as | grep MPTcpExtMismatchPortSynRx |
+		printf "%-${NR_BLANK}s %s" " " "syn"
+		count=`ip netns exec $NS1 nstat -as | grep MPTcpExtMismatchPortSynRx |
 			awk '{print $2}'`
 		[ -z "$count" ] && count=0
 		if [ "$count" != "$mis_syn_nr" ]; then
 			echo "[fail] got $count JOIN[s] syn with a mismatched \
 				port-number expected $mis_syn_nr"
-			ret=1
+			RET=1
 			dump_stats=1
 		else
 			echo -n "[ ok ]"
 		fi
 
 		echo -n " - ack   "
-		count=`ip netns exec $ns1 nstat -as | grep MPTcpExtMismatchPortAckRx |
+		count=`ip netns exec $NS1 nstat -as | grep MPTcpExtMismatchPortAckRx |
 			awk '{print $2}'`
 		[ -z "$count" ] && count=0
 		if [ "$count" != "$mis_ack_nr" ]; then
 			echo "[fail] got $count JOIN[s] ack with a mismatched \
 				port-number expected $mis_ack_nr"
-			ret=1
+			RET=1
 			dump_stats=1
 		else
 			echo "[ ok ]"
@@ -1083,19 +1101,19 @@ chk_rm_nr()
 	local subflow_ns
 
 	if [ -z $invert ]; then
-		addr_ns=$ns1
-		subflow_ns=$ns2
+		addr_ns=$NS1
+		subflow_ns=$NS2
 	elif [ $invert = "invert" ]; then
-		addr_ns=$ns2
-		subflow_ns=$ns1
+		addr_ns=$NS2
+		subflow_ns=$NS1
 	fi
 
-	printf "%-${nr_blank}s %s" " " "rm "
+	printf "%-${NR_BLANK}s %s" " " "rm "
 	count=`ip netns exec $addr_ns nstat -as | grep MPTcpExtRmAddr | awk '{print $2}'`
 	[ -z "$count" ] && count=0
 	if [ "$count" != "$rm_addr_nr" ]; then
 		echo "[fail] got $count RM_ADDR[s] expected $rm_addr_nr"
-		ret=1
+		RET=1
 		dump_stats=1
 	else
 		echo -n "[ ok ]"
@@ -1106,7 +1124,7 @@ chk_rm_nr()
 	[ -z "$count" ] && count=0
 	if [ "$count" != "$rm_subflow_nr" ]; then
 		echo "[fail] got $count RM_SUBFLOW[s] expected $rm_subflow_nr"
-		ret=1
+		RET=1
 		dump_stats=1
 	else
 		echo "[ ok ]"
@@ -1122,23 +1140,23 @@ chk_prio_nr()
 	local count
 	local dump_stats
 
-	printf "%-${nr_blank}s %s" " " "ptx"
-	count=`ip netns exec $ns1 nstat -as | grep MPTcpExtMPPrioTx | awk '{print $2}'`
+	printf "%-${NR_BLANK}s %s" " " "ptx"
+	count=`ip netns exec $NS1 nstat -as | grep MPTcpExtMPPrioTx | awk '{print $2}'`
 	[ -z "$count" ] && count=0
 	if [ "$count" != "$mp_prio_nr_tx" ]; then
 		echo "[fail] got $count MP_PRIO[s] TX expected $mp_prio_nr_tx"
-		ret=1
+		RET=1
 		dump_stats=1
 	else
 		echo -n "[ ok ]"
 	fi
 
 	echo -n " - prx   "
-	count=`ip netns exec $ns1 nstat -as | grep MPTcpExtMPPrioRx | awk '{print $2}'`
+	count=`ip netns exec $NS1 nstat -as | grep MPTcpExtMPPrioRx | awk '{print $2}'`
 	[ -z "$count" ] && count=0
 	if [ "$count" != "$mp_prio_nr_rx" ]; then
 		echo "[fail] got $count MP_PRIO[s] RX expected $mp_prio_nr_rx"
-		ret=1
+		RET=1
 		dump_stats=1
 	else
 		echo "[ ok ]"
@@ -1158,11 +1176,11 @@ chk_link_usage()
 	local tx_rate=$((tx_link * 100 / $tx_total))
 	local tolerance=5
 
-	printf "%-${nr_blank}s %-18s" " " "link usage"
+	printf "%-${NR_BLANK}s %-18s" " " "link usage"
 	if [ $tx_rate -lt $((expected_rate - $tolerance)) -o \
 	     $tx_rate -gt $((expected_rate + $tolerance)) ]; then
 		echo "[fail] got $tx_rate% usage, expected $expected_rate%"
-		ret=1
+		RET=1
 	else
 		echo "[ ok ]"
 	fi
@@ -1170,12 +1188,14 @@ chk_link_usage()
 
 wait_attempt_fail()
 {
-	local timeout_ms=$((timeout_poll * 1000))
+	local timeout_ms=$((TIMEOUT_POLL * 1000))
 	local time=0
 	local ns=$1
 
 	while [ $time -lt $timeout_ms ]; do
-		local cnt=$(ip netns exec $ns nstat -as TcpAttemptFails | grep TcpAttemptFails | awk '{print $2}')
+		local cnt
+
+		cnt=$(ip netns exec $ns nstat -as TcpAttemptFails | grep TcpAttemptFails | awk '{print $2}')
 
 		[ "$cnt" = 1 ] && return 1
 		time=$((time + 100))
@@ -1187,63 +1207,63 @@ wait_attempt_fail()
 subflows_tests()
 {
 	if reset; then
-		run_tests $ns1 $ns2 10.0.1.1
+		run_tests $NS1 $NS2 10.0.1.1
 		chk_join_nr "no JOIN" "0" "0" "0"
 	fi
 
 	# subflow limited by client
 	if reset; then
-		pm_nl_set_limits $ns1 0 0
-		pm_nl_set_limits $ns2 0 0
-		pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow
-		run_tests $ns1 $ns2 10.0.1.1
+		pm_nl_set_limits $NS1 0 0
+		pm_nl_set_limits $NS2 0 0
+		pm_nl_add_endpoint $NS2 10.0.3.2 flags subflow
+		run_tests $NS1 $NS2 10.0.1.1
 		chk_join_nr "single subflow, limited by client" 0 0 0
 	fi
 
 	# subflow limited by server
 	if reset; then
-		pm_nl_set_limits $ns1 0 0
-		pm_nl_set_limits $ns2 0 1
-		pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow
-		run_tests $ns1 $ns2 10.0.1.1
+		pm_nl_set_limits $NS1 0 0
+		pm_nl_set_limits $NS2 0 1
+		pm_nl_add_endpoint $NS2 10.0.3.2 flags subflow
+		run_tests $NS1 $NS2 10.0.1.1
 		chk_join_nr "single subflow, limited by server" 1 1 0
 	fi
 
 	# subflow
 	if reset; then
-		pm_nl_set_limits $ns1 0 1
-		pm_nl_set_limits $ns2 0 1
-		pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow
-		run_tests $ns1 $ns2 10.0.1.1
+		pm_nl_set_limits $NS1 0 1
+		pm_nl_set_limits $NS2 0 1
+		pm_nl_add_endpoint $NS2 10.0.3.2 flags subflow
+		run_tests $NS1 $NS2 10.0.1.1
 		chk_join_nr "single subflow" 1 1 1
 	fi
 
 	# multiple subflows
 	if reset; then
-		pm_nl_set_limits $ns1 0 2
-		pm_nl_set_limits $ns2 0 2
-		pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow
-		pm_nl_add_endpoint $ns2 10.0.2.2 flags subflow
-		run_tests $ns1 $ns2 10.0.1.1
+		pm_nl_set_limits $NS1 0 2
+		pm_nl_set_limits $NS2 0 2
+		pm_nl_add_endpoint $NS2 10.0.3.2 flags subflow
+		pm_nl_add_endpoint $NS2 10.0.2.2 flags subflow
+		run_tests $NS1 $NS2 10.0.1.1
 		chk_join_nr "multiple subflows" 2 2 2
 	fi
 
 	# multiple subflows limited by server
 	if reset; then
-		pm_nl_set_limits $ns1 0 1
-		pm_nl_set_limits $ns2 0 2
-		pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow
-		pm_nl_add_endpoint $ns2 10.0.2.2 flags subflow
-		run_tests $ns1 $ns2 10.0.1.1
+		pm_nl_set_limits $NS1 0 1
+		pm_nl_set_limits $NS2 0 2
+		pm_nl_add_endpoint $NS2 10.0.3.2 flags subflow
+		pm_nl_add_endpoint $NS2 10.0.2.2 flags subflow
+		run_tests $NS1 $NS2 10.0.1.1
 		chk_join_nr "multiple subflows, limited by server" 2 2 1
 	fi
 
 	# single subflow, dev
 	if reset; then
-		pm_nl_set_limits $ns1 0 1
-		pm_nl_set_limits $ns2 0 1
-		pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow dev ns2eth3
-		run_tests $ns1 $ns2 10.0.1.1
+		pm_nl_set_limits $NS1 0 1
+		pm_nl_set_limits $NS2 0 1
+		pm_nl_add_endpoint $NS2 10.0.3.2 flags subflow dev ns2eth3
+		run_tests $NS1 $NS2 10.0.1.1
 		chk_join_nr "single subflow, dev" 1 1 1
 	fi
 }
@@ -1253,32 +1273,32 @@ subflows_error_tests()
 	# If a single subflow is configured, and matches the MPC src
 	# address, no additional subflow should be created
 	if reset; then
-		pm_nl_set_limits $ns1 0 1
-		pm_nl_set_limits $ns2 0 1
-		pm_nl_add_endpoint $ns2 10.0.1.2 flags subflow
-		run_tests $ns1 $ns2 10.0.1.1 0 0 0 slow
+		pm_nl_set_limits $NS1 0 1
+		pm_nl_set_limits $NS2 0 1
+		pm_nl_add_endpoint $NS2 10.0.1.2 flags subflow
+		run_tests $NS1 $NS2 10.0.1.1 0 0 0 slow
 		chk_join_nr "no MPC reuse with single endpoint" 0 0 0
 	fi
 
 	# multiple subflows, with subflow creation error
 	if reset; then
-		pm_nl_set_limits $ns1 0 2
-		pm_nl_set_limits $ns2 0 2
-		pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow
-		pm_nl_add_endpoint $ns2 10.0.2.2 flags subflow
-		ip netns exec $ns1 iptables -A INPUT -s 10.0.3.2 -p tcp -j REJECT
-		run_tests $ns1 $ns2 10.0.1.1 0 0 0 slow
+		pm_nl_set_limits $NS1 0 2
+		pm_nl_set_limits $NS2 0 2
+		pm_nl_add_endpoint $NS2 10.0.3.2 flags subflow
+		pm_nl_add_endpoint $NS2 10.0.2.2 flags subflow
+		ip netns exec $NS1 iptables -A INPUT -s 10.0.3.2 -p tcp -j REJECT
+		run_tests $NS1 $NS2 10.0.1.1 0 0 0 slow
 		chk_join_nr "multi subflows, with failing subflow" 1 1 1
 	fi
 
 	# multiple subflows, with subflow timeout on MPJ
 	if reset; then
-		pm_nl_set_limits $ns1 0 2
-		pm_nl_set_limits $ns2 0 2
-		pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow
-		pm_nl_add_endpoint $ns2 10.0.2.2 flags subflow
-		ip netns exec $ns1 iptables -A INPUT -s 10.0.3.2 -p tcp -j DROP
-		run_tests $ns1 $ns2 10.0.1.1 0 0 0 slow
+		pm_nl_set_limits $NS1 0 2
+		pm_nl_set_limits $NS2 0 2
+		pm_nl_add_endpoint $NS2 10.0.3.2 flags subflow
+		pm_nl_add_endpoint $NS2 10.0.2.2 flags subflow
+		ip netns exec $NS1 iptables -A INPUT -s 10.0.3.2 -p tcp -j DROP
+		run_tests $NS1 $NS2 10.0.1.1 0 0 0 slow
 		chk_join_nr "multi subflows, with subflow timeout" 1 1 1
 	fi
 
@@ -1286,15 +1306,15 @@ subflows_error_tests()
 	# closed subflow (due to reset) is not reused if additional
 	# subflows are added later
 	if reset; then
-		pm_nl_set_limits $ns1 0 1
-		pm_nl_set_limits $ns2 0 1
-		pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow
-		ip netns exec $ns1 iptables -A INPUT -s 10.0.3.2 -p tcp -j REJECT
-		run_tests $ns1 $ns2 10.0.1.1 0 0 0 slow &
+		pm_nl_set_limits $NS1 0 1
+		pm_nl_set_limits $NS2 0 1
+		pm_nl_add_endpoint $NS2 10.0.3.2 flags subflow
+		ip netns exec $NS1 iptables -A INPUT -s 10.0.3.2 -p tcp -j REJECT
+		run_tests $NS1 $NS2 10.0.1.1 0 0 0 slow &
 
 		# mpj subflow will be in TW after the reset
-		wait_attempt_fail $ns2
-		pm_nl_add_endpoint $ns2 10.0.2.2 flags subflow
+		wait_attempt_fail $NS2
+		pm_nl_add_endpoint $NS2 10.0.2.2 flags subflow
 		wait
 
 		# additional subflow could be created only if the PM select
@@ -1307,18 +1327,18 @@ signal_address_tests()
 {
 	# add_address, unused
 	if reset; then
-		pm_nl_add_endpoint $ns1 10.0.2.1 flags signal
-		run_tests $ns1 $ns2 10.0.1.1
+		pm_nl_add_endpoint $NS1 10.0.2.1 flags signal
+		run_tests $NS1 $NS2 10.0.1.1
 		chk_join_nr "unused signal address" 0 0 0
 		chk_add_nr 1 1
 	fi
 
 	# accept and use add_addr
 	if reset; then
-		pm_nl_set_limits $ns1 0 1
-		pm_nl_set_limits $ns2 1 1
-		pm_nl_add_endpoint $ns1 10.0.2.1 flags signal
-		run_tests $ns1 $ns2 10.0.1.1
+		pm_nl_set_limits $NS1 0 1
+		pm_nl_set_limits $NS2 1 1
+		pm_nl_add_endpoint $NS1 10.0.2.1 flags signal
+		run_tests $NS1 $NS2 10.0.1.1
 		chk_join_nr "signal address" 1 1 1
 		chk_add_nr 1 1
 	fi
@@ -1328,67 +1348,67 @@ signal_address_tests()
 	# belong to different subnets or one of the listed local address could be
 	# used for 'add_addr' subflow
 	if reset; then
-		pm_nl_add_endpoint $ns1 10.0.2.1 flags signal
-		pm_nl_set_limits $ns1 0 2
-		pm_nl_set_limits $ns2 1 2
-		pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow
-		run_tests $ns1 $ns2 10.0.1.1
+		pm_nl_add_endpoint $NS1 10.0.2.1 flags signal
+		pm_nl_set_limits $NS1 0 2
+		pm_nl_set_limits $NS2 1 2
+		pm_nl_add_endpoint $NS2 10.0.3.2 flags subflow
+		run_tests $NS1 $NS2 10.0.1.1
 		chk_join_nr "subflow and signal" 2 2 2
 		chk_add_nr 1 1
 	fi
 
 	# accept and use add_addr with additional subflows
 	if reset; then
-		pm_nl_set_limits $ns1 0 3
-		pm_nl_add_endpoint $ns1 10.0.2.1 flags signal
-		pm_nl_set_limits $ns2 1 3
-		pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow
-		pm_nl_add_endpoint $ns2 10.0.4.2 flags subflow
-		run_tests $ns1 $ns2 10.0.1.1
+		pm_nl_set_limits $NS1 0 3
+		pm_nl_add_endpoint $NS1 10.0.2.1 flags signal
+		pm_nl_set_limits $NS2 1 3
+		pm_nl_add_endpoint $NS2 10.0.3.2 flags subflow
+		pm_nl_add_endpoint $NS2 10.0.4.2 flags subflow
+		run_tests $NS1 $NS2 10.0.1.1
 		chk_join_nr "multiple subflows and signal" 3 3 3
 		chk_add_nr 1 1
 	fi
 
 	# signal addresses
 	if reset; then
-		pm_nl_set_limits $ns1 3 3
-		pm_nl_add_endpoint $ns1 10.0.2.1 flags signal
-		pm_nl_add_endpoint $ns1 10.0.3.1 flags signal
-		pm_nl_add_endpoint $ns1 10.0.4.1 flags signal
-		pm_nl_set_limits $ns2 3 3
-		run_tests $ns1 $ns2 10.0.1.1
+		pm_nl_set_limits $NS1 3 3
+		pm_nl_add_endpoint $NS1 10.0.2.1 flags signal
+		pm_nl_add_endpoint $NS1 10.0.3.1 flags signal
+		pm_nl_add_endpoint $NS1 10.0.4.1 flags signal
+		pm_nl_set_limits $NS2 3 3
+		run_tests $NS1 $NS2 10.0.1.1
 		chk_join_nr "signal addresses" 3 3 3
 		chk_add_nr 3 3
 	fi
 
 	# signal invalid addresses
 	if reset; then
-		pm_nl_set_limits $ns1 3 3
-		pm_nl_add_endpoint $ns1 10.0.12.1 flags signal
-		pm_nl_add_endpoint $ns1 10.0.3.1 flags signal
-		pm_nl_add_endpoint $ns1 10.0.14.1 flags signal
-		pm_nl_set_limits $ns2 3 3
-		run_tests $ns1 $ns2 10.0.1.1
+		pm_nl_set_limits $NS1 3 3
+		pm_nl_add_endpoint $NS1 10.0.12.1 flags signal
+		pm_nl_add_endpoint $NS1 10.0.3.1 flags signal
+		pm_nl_add_endpoint $NS1 10.0.14.1 flags signal
+		pm_nl_set_limits $NS2 3 3
+		run_tests $NS1 $NS2 10.0.1.1
 		chk_join_nr "signal invalid addresses" 1 1 1
 		chk_add_nr 3 3
 	fi
 
 	# signal addresses race test
 	if reset; then
-		pm_nl_set_limits $ns1 4 4
-		pm_nl_set_limits $ns2 4 4
-		pm_nl_add_endpoint $ns1 10.0.1.1 flags signal
-		pm_nl_add_endpoint $ns1 10.0.2.1 flags signal
-		pm_nl_add_endpoint $ns1 10.0.3.1 flags signal
-		pm_nl_add_endpoint $ns1 10.0.4.1 flags signal
-		pm_nl_add_endpoint $ns2 10.0.1.2 flags signal
-		pm_nl_add_endpoint $ns2 10.0.2.2 flags signal
-		pm_nl_add_endpoint $ns2 10.0.3.2 flags signal
-		pm_nl_add_endpoint $ns2 10.0.4.2 flags signal
+		pm_nl_set_limits $NS1 4 4
+		pm_nl_set_limits $NS2 4 4
+		pm_nl_add_endpoint $NS1 10.0.1.1 flags signal
+		pm_nl_add_endpoint $NS1 10.0.2.1 flags signal
+		pm_nl_add_endpoint $NS1 10.0.3.1 flags signal
+		pm_nl_add_endpoint $NS1 10.0.4.1 flags signal
+		pm_nl_add_endpoint $NS2 10.0.1.2 flags signal
+		pm_nl_add_endpoint $NS2 10.0.2.2 flags signal
+		pm_nl_add_endpoint $NS2 10.0.3.2 flags signal
+		pm_nl_add_endpoint $NS2 10.0.4.2 flags signal
 
 		# the peer could possibly miss some addr notification, allow retransmission
-		ip netns exec $ns1 sysctl -q net.mptcp.add_addr_timeout=1
-		run_tests $ns1 $ns2 10.0.1.1 0 0 0 slow
+		ip netns exec $NS1 sysctl -q net.mptcp.add_addr_timeout=1
+		run_tests $NS1 $NS2 10.0.1.1 0 0 0 slow
 		chk_join_nr "signal addresses race test" 3 3 3
 
 		# the server will not signal the address terminating
@@ -1408,76 +1428,76 @@ link_failure_tests()
 		# active backup and link switch-over.
 		# Let's set some arbitrary (low) virtual link limits.
 		init_shapers
-		pm_nl_set_limits $ns1 0 3
-		pm_nl_add_endpoint $ns1 10.0.2.1 dev ns1eth2 flags signal
-		pm_nl_set_limits $ns2 1 3
-		pm_nl_add_endpoint $ns2 10.0.3.2 dev ns2eth3 flags subflow
-		pm_nl_add_endpoint $ns2 10.0.4.2 dev ns2eth4 flags subflow
-		run_tests $ns1 $ns2 10.0.1.1 1
+		pm_nl_set_limits $NS1 0 3
+		pm_nl_add_endpoint $NS1 10.0.2.1 dev ns1eth2 flags signal
+		pm_nl_set_limits $NS2 1 3
+		pm_nl_add_endpoint $NS2 10.0.3.2 dev ns2eth3 flags subflow
+		pm_nl_add_endpoint $NS2 10.0.4.2 dev ns2eth4 flags subflow
+		run_tests $NS1 $NS2 10.0.1.1 1
 		chk_join_nr "multiple flows, signal, link failure" 3 3 3
 		chk_add_nr 1 1
-		chk_stale_nr $ns2 1 5 1
+		chk_stale_nr $NS2 1 5 1
 	fi
 
 	# accept and use add_addr with additional subflows and link loss
 	# for bidirectional transfer
 	if reset; then
 		init_shapers
-		pm_nl_set_limits $ns1 0 3
-		pm_nl_add_endpoint $ns1 10.0.2.1 dev ns1eth2 flags signal
-		pm_nl_set_limits $ns2 1 3
-		pm_nl_add_endpoint $ns2 10.0.3.2 dev ns2eth3 flags subflow
-		pm_nl_add_endpoint $ns2 10.0.4.2 dev ns2eth4 flags subflow
-		run_tests $ns1 $ns2 10.0.1.1 2
+		pm_nl_set_limits $NS1 0 3
+		pm_nl_add_endpoint $NS1 10.0.2.1 dev ns1eth2 flags signal
+		pm_nl_set_limits $NS2 1 3
+		pm_nl_add_endpoint $NS2 10.0.3.2 dev ns2eth3 flags subflow
+		pm_nl_add_endpoint $NS2 10.0.4.2 dev ns2eth4 flags subflow
+		run_tests $NS1 $NS2 10.0.1.1 2
 		chk_join_nr "multi flows, signal, bidi, link fail" 3 3 3
 		chk_add_nr 1 1
-		chk_stale_nr $ns2 1 -1 1
+		chk_stale_nr $NS2 1 -1 1
 	fi
 
 	# 2 subflows plus 1 backup subflow with a lossy link, backup
 	# will never be used
 	if reset; then
 		init_shapers
-		pm_nl_set_limits $ns1 0 2
-		pm_nl_add_endpoint $ns1 10.0.2.1 dev ns1eth2 flags signal
-		pm_nl_set_limits $ns2 1 2
+		pm_nl_set_limits $NS1 0 2
+		pm_nl_add_endpoint $NS1 10.0.2.1 dev ns1eth2 flags signal
+		pm_nl_set_limits $NS2 1 2
 		export FAILING_LINKS="1"
-		pm_nl_add_endpoint $ns2 10.0.3.2 dev ns2eth3 flags subflow,backup
-		run_tests $ns1 $ns2 10.0.1.1 1
+		pm_nl_add_endpoint $NS2 10.0.3.2 dev ns2eth3 flags subflow,backup
+		run_tests $NS1 $NS2 10.0.1.1 1
 		chk_join_nr "backup subflow unused, link failure" 2 2 2
 		chk_add_nr 1 1
-		chk_link_usage $ns2 ns2eth3 $cinsent 0
+		chk_link_usage $NS2 ns2eth3 $CINSENT 0
 	fi
 
 	# 2 lossy links after half transfer, backup will get half of
 	# the traffic
 	if reset; then
 		init_shapers
-		pm_nl_set_limits $ns1 0 2
-		pm_nl_add_endpoint $ns1 10.0.2.1 dev ns1eth2 flags signal
-		pm_nl_set_limits $ns2 1 2
-		pm_nl_add_endpoint $ns2 10.0.3.2 dev ns2eth3 flags subflow,backup
+		pm_nl_set_limits $NS1 0 2
+		pm_nl_add_endpoint $NS1 10.0.2.1 dev ns1eth2 flags signal
+		pm_nl_set_limits $NS2 1 2
+		pm_nl_add_endpoint $NS2 10.0.3.2 dev ns2eth3 flags subflow,backup
 		export FAILING_LINKS="1 2"
-		run_tests $ns1 $ns2 10.0.1.1 1
+		run_tests $NS1 $NS2 10.0.1.1 1
 		chk_join_nr "backup flow used, multi links fail" 2 2 2
 		chk_add_nr 1 1
-		chk_stale_nr $ns2 2 4 2
-		chk_link_usage $ns2 ns2eth3 $cinsent 50
+		chk_stale_nr $NS2 2 4 2
+		chk_link_usage $NS2 ns2eth3 $CINSENT 50
 	fi
 
 	# use a backup subflow with the first subflow on a lossy link
 	# for bidirectional transfer
 	if reset; then
 		init_shapers
-		pm_nl_set_limits $ns1 0 2
-		pm_nl_add_endpoint $ns1 10.0.2.1 dev ns1eth2 flags signal
-		pm_nl_set_limits $ns2 1 3
-		pm_nl_add_endpoint $ns2 10.0.3.2 dev ns2eth3 flags subflow,backup
-		run_tests $ns1 $ns2 10.0.1.1 2
+		pm_nl_set_limits $NS1 0 2
+		pm_nl_add_endpoint $NS1 10.0.2.1 dev ns1eth2 flags signal
+		pm_nl_set_limits $NS2 1 3
+		pm_nl_add_endpoint $NS2 10.0.3.2 dev ns2eth3 flags subflow,backup
+		run_tests $NS1 $NS2 10.0.1.1 2
 		chk_join_nr "backup flow used, bidi, link failure" 2 2 2
 		chk_add_nr 1 1
-		chk_stale_nr $ns2 1 -1 2
-		chk_link_usage $ns2 ns2eth3 $cinsent 50
+		chk_stale_nr $NS2 1 -1 2
+		chk_link_usage $NS2 ns2eth3 $CINSENT 50
 	fi
 }
 
@@ -1485,42 +1505,42 @@ add_addr_timeout_tests()
 {
 	# add_addr timeout
 	if reset_with_add_addr_timeout; then
-		pm_nl_set_limits $ns1 0 1
-		pm_nl_set_limits $ns2 1 1
-		pm_nl_add_endpoint $ns1 10.0.2.1 flags signal
-		run_tests $ns1 $ns2 10.0.1.1 0 0 0 slow
+		pm_nl_set_limits $NS1 0 1
+		pm_nl_set_limits $NS2 1 1
+		pm_nl_add_endpoint $NS1 10.0.2.1 flags signal
+		run_tests $NS1 $NS2 10.0.1.1 0 0 0 slow
 		chk_join_nr "signal address, ADD_ADDR timeout" 1 1 1
 		chk_add_nr 4 0
 	fi
 
 	# add_addr timeout IPv6
 	if reset_with_add_addr_timeout 6; then
-		pm_nl_set_limits $ns1 0 1
-		pm_nl_set_limits $ns2 1 1
-		pm_nl_add_endpoint $ns1 dead:beef:2::1 flags signal
-		run_tests $ns1 $ns2 dead:beef:1::1 0 0 0 slow
+		pm_nl_set_limits $NS1 0 1
+		pm_nl_set_limits $NS2 1 1
+		pm_nl_add_endpoint $NS1 dead:beef:2::1 flags signal
+		run_tests $NS1 $NS2 dead:beef:1::1 0 0 0 slow
 		chk_join_nr "signal address, ADD_ADDR6 timeout" 1 1 1
 		chk_add_nr 4 0
 	fi
 
 	# signal addresses timeout
 	if reset_with_add_addr_timeout; then
-		pm_nl_set_limits $ns1 2 2
-		pm_nl_add_endpoint $ns1 10.0.2.1 flags signal
-		pm_nl_add_endpoint $ns1 10.0.3.1 flags signal
-		pm_nl_set_limits $ns2 2 2
-		run_tests $ns1 $ns2 10.0.1.1 0 0 0 least
+		pm_nl_set_limits $NS1 2 2
+		pm_nl_add_endpoint $NS1 10.0.2.1 flags signal
+		pm_nl_add_endpoint $NS1 10.0.3.1 flags signal
+		pm_nl_set_limits $NS2 2 2
+		run_tests $NS1 $NS2 10.0.1.1 0 0 0 least
 		chk_join_nr "signal addresses, ADD_ADDR timeout" 2 2 2
 		chk_add_nr 8 0
 	fi
 
 	# signal invalid addresses timeout
 	if reset_with_add_addr_timeout; then
-		pm_nl_set_limits $ns1 2 2
-		pm_nl_add_endpoint $ns1 10.0.12.1 flags signal
-		pm_nl_add_endpoint $ns1 10.0.3.1 flags signal
-		pm_nl_set_limits $ns2 2 2
-		run_tests $ns1 $ns2 10.0.1.1 0 0 0 least
+		pm_nl_set_limits $NS1 2 2
+		pm_nl_add_endpoint $NS1 10.0.12.1 flags signal
+		pm_nl_add_endpoint $NS1 10.0.3.1 flags signal
+		pm_nl_set_limits $NS2 2 2
+		run_tests $NS1 $NS2 10.0.1.1 0 0 0 least
 		chk_join_nr "invalid address, ADD_ADDR timeout" 1 1 1
 		chk_add_nr 8 0
 	fi
@@ -1530,31 +1550,31 @@ remove_tests()
 {
 	# single subflow, remove
 	if reset; then
-		pm_nl_set_limits $ns1 0 1
-		pm_nl_set_limits $ns2 0 1
-		pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow
-		run_tests $ns1 $ns2 10.0.1.1 0 0 -1 slow
+		pm_nl_set_limits $NS1 0 1
+		pm_nl_set_limits $NS2 0 1
+		pm_nl_add_endpoint $NS2 10.0.3.2 flags subflow
+		run_tests $NS1 $NS2 10.0.1.1 0 0 -1 slow
 		chk_join_nr "remove single subflow" 1 1 1
 		chk_rm_nr 1 1
 	fi
 
 	# multiple subflows, remove
 	if reset; then
-		pm_nl_set_limits $ns1 0 2
-		pm_nl_set_limits $ns2 0 2
-		pm_nl_add_endpoint $ns2 10.0.2.2 flags subflow
-		pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow
-		run_tests $ns1 $ns2 10.0.1.1 0 0 -2 slow
+		pm_nl_set_limits $NS1 0 2
+		pm_nl_set_limits $NS2 0 2
+		pm_nl_add_endpoint $NS2 10.0.2.2 flags subflow
+		pm_nl_add_endpoint $NS2 10.0.3.2 flags subflow
+		run_tests $NS1 $NS2 10.0.1.1 0 0 -2 slow
 		chk_join_nr "remove multiple subflows" 2 2 2
 		chk_rm_nr 2 2
 	fi
 
 	# single address, remove
 	if reset; then
-		pm_nl_set_limits $ns1 0 1
-		pm_nl_add_endpoint $ns1 10.0.2.1 flags signal
-		pm_nl_set_limits $ns2 1 1
-		run_tests $ns1 $ns2 10.0.1.1 0 -1 0 slow
+		pm_nl_set_limits $NS1 0 1
+		pm_nl_add_endpoint $NS1 10.0.2.1 flags signal
+		pm_nl_set_limits $NS2 1 1
+		run_tests $NS1 $NS2 10.0.1.1 0 -1 0 slow
 		chk_join_nr "remove single address" 1 1 1
 		chk_add_nr 1 1
 		chk_rm_nr 1 1 invert
@@ -1562,11 +1582,11 @@ remove_tests()
 
 	# subflow and signal, remove
 	if reset; then
-		pm_nl_set_limits $ns1 0 2
-		pm_nl_add_endpoint $ns1 10.0.2.1 flags signal
-		pm_nl_set_limits $ns2 1 2
-		pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow
-		run_tests $ns1 $ns2 10.0.1.1 0 -1 -1 slow
+		pm_nl_set_limits $NS1 0 2
+		pm_nl_add_endpoint $NS1 10.0.2.1 flags signal
+		pm_nl_set_limits $NS2 1 2
+		pm_nl_add_endpoint $NS2 10.0.3.2 flags subflow
+		run_tests $NS1 $NS2 10.0.1.1 0 -1 -1 slow
 		chk_join_nr "remove subflow and signal" 2 2 2
 		chk_add_nr 1 1
 		chk_rm_nr 1 1
@@ -1574,12 +1594,12 @@ remove_tests()
 
 	# subflows and signal, remove
 	if reset; then
-		pm_nl_set_limits $ns1 0 3
-		pm_nl_add_endpoint $ns1 10.0.2.1 flags signal
-		pm_nl_set_limits $ns2 1 3
-		pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow
-		pm_nl_add_endpoint $ns2 10.0.4.2 flags subflow
-		run_tests $ns1 $ns2 10.0.1.1 0 -1 -2 slow
+		pm_nl_set_limits $NS1 0 3
+		pm_nl_add_endpoint $NS1 10.0.2.1 flags signal
+		pm_nl_set_limits $NS2 1 3
+		pm_nl_add_endpoint $NS2 10.0.3.2 flags subflow
+		pm_nl_add_endpoint $NS2 10.0.4.2 flags subflow
+		run_tests $NS1 $NS2 10.0.1.1 0 -1 -2 slow
 		chk_join_nr "remove subflows and signal" 3 3 3
 		chk_add_nr 1 1
 		chk_rm_nr 2 2
@@ -1587,12 +1607,12 @@ remove_tests()
 
 	# addresses remove
 	if reset; then
-		pm_nl_set_limits $ns1 3 3
-		pm_nl_add_endpoint $ns1 10.0.2.1 flags signal id 250
-		pm_nl_add_endpoint $ns1 10.0.3.1 flags signal
-		pm_nl_add_endpoint $ns1 10.0.4.1 flags signal
-		pm_nl_set_limits $ns2 3 3
-		run_tests $ns1 $ns2 10.0.1.1 0 -3 0 slow
+		pm_nl_set_limits $NS1 3 3
+		pm_nl_add_endpoint $NS1 10.0.2.1 flags signal id 250
+		pm_nl_add_endpoint $NS1 10.0.3.1 flags signal
+		pm_nl_add_endpoint $NS1 10.0.4.1 flags signal
+		pm_nl_set_limits $NS2 3 3
+		run_tests $NS1 $NS2 10.0.1.1 0 -3 0 slow
 		chk_join_nr "remove addresses" 3 3 3
 		chk_add_nr 3 3
 		chk_rm_nr 3 3 invert
@@ -1600,12 +1620,12 @@ remove_tests()
 
 	# invalid addresses remove
 	if reset; then
-		pm_nl_set_limits $ns1 3 3
-		pm_nl_add_endpoint $ns1 10.0.12.1 flags signal
-		pm_nl_add_endpoint $ns1 10.0.3.1 flags signal
-		pm_nl_add_endpoint $ns1 10.0.14.1 flags signal
-		pm_nl_set_limits $ns2 3 3
-		run_tests $ns1 $ns2 10.0.1.1 0 -3 0 slow
+		pm_nl_set_limits $NS1 3 3
+		pm_nl_add_endpoint $NS1 10.0.12.1 flags signal
+		pm_nl_add_endpoint $NS1 10.0.3.1 flags signal
+		pm_nl_add_endpoint $NS1 10.0.14.1 flags signal
+		pm_nl_set_limits $NS2 3 3
+		run_tests $NS1 $NS2 10.0.1.1 0 -3 0 slow
 		chk_join_nr "remove invalid addresses" 1 1 1
 		chk_add_nr 3 3
 		chk_rm_nr 3 1 invert
@@ -1613,12 +1633,12 @@ remove_tests()
 
 	# subflows and signal, flush
 	if reset; then
-		pm_nl_set_limits $ns1 0 3
-		pm_nl_add_endpoint $ns1 10.0.2.1 flags signal
-		pm_nl_set_limits $ns2 1 3
-		pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow
-		pm_nl_add_endpoint $ns2 10.0.4.2 flags subflow
-		run_tests $ns1 $ns2 10.0.1.1 0 -8 -8 slow
+		pm_nl_set_limits $NS1 0 3
+		pm_nl_add_endpoint $NS1 10.0.2.1 flags signal
+		pm_nl_set_limits $NS2 1 3
+		pm_nl_add_endpoint $NS2 10.0.3.2 flags subflow
+		pm_nl_add_endpoint $NS2 10.0.4.2 flags subflow
+		run_tests $NS1 $NS2 10.0.1.1 0 -8 -8 slow
 		chk_join_nr "flush subflows and signal" 3 3 3
 		chk_add_nr 1 1
 		chk_rm_nr 2 2
@@ -1626,24 +1646,24 @@ remove_tests()
 
 	# subflows flush
 	if reset; then
-		pm_nl_set_limits $ns1 3 3
-		pm_nl_set_limits $ns2 3 3
-		pm_nl_add_endpoint $ns2 10.0.2.2 flags subflow id 150
-		pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow
-		pm_nl_add_endpoint $ns2 10.0.4.2 flags subflow
-		run_tests $ns1 $ns2 10.0.1.1 0 -8 -8 slow
+		pm_nl_set_limits $NS1 3 3
+		pm_nl_set_limits $NS2 3 3
+		pm_nl_add_endpoint $NS2 10.0.2.2 flags subflow id 150
+		pm_nl_add_endpoint $NS2 10.0.3.2 flags subflow
+		pm_nl_add_endpoint $NS2 10.0.4.2 flags subflow
+		run_tests $NS1 $NS2 10.0.1.1 0 -8 -8 slow
 		chk_join_nr "flush subflows" 3 3 3
 		chk_rm_nr 3 3
 	fi
 
 	# addresses flush
 	if reset; then
-		pm_nl_set_limits $ns1 3 3
-		pm_nl_add_endpoint $ns1 10.0.2.1 flags signal id 250
-		pm_nl_add_endpoint $ns1 10.0.3.1 flags signal
-		pm_nl_add_endpoint $ns1 10.0.4.1 flags signal
-		pm_nl_set_limits $ns2 3 3
-		run_tests $ns1 $ns2 10.0.1.1 0 -8 -8 slow
+		pm_nl_set_limits $NS1 3 3
+		pm_nl_add_endpoint $NS1 10.0.2.1 flags signal id 250
+		pm_nl_add_endpoint $NS1 10.0.3.1 flags signal
+		pm_nl_add_endpoint $NS1 10.0.4.1 flags signal
+		pm_nl_set_limits $NS2 3 3
+		run_tests $NS1 $NS2 10.0.1.1 0 -8 -8 slow
 		chk_join_nr "flush addresses" 3 3 3
 		chk_add_nr 3 3
 		chk_rm_nr 3 3 invert
@@ -1651,12 +1671,12 @@ remove_tests()
 
 	# invalid addresses flush
 	if reset; then
-		pm_nl_set_limits $ns1 3 3
-		pm_nl_add_endpoint $ns1 10.0.12.1 flags signal
-		pm_nl_add_endpoint $ns1 10.0.3.1 flags signal
-		pm_nl_add_endpoint $ns1 10.0.14.1 flags signal
-		pm_nl_set_limits $ns2 3 3
-		run_tests $ns1 $ns2 10.0.1.1 0 -8 0 slow
+		pm_nl_set_limits $NS1 3 3
+		pm_nl_add_endpoint $NS1 10.0.12.1 flags signal
+		pm_nl_add_endpoint $NS1 10.0.3.1 flags signal
+		pm_nl_add_endpoint $NS1 10.0.14.1 flags signal
+		pm_nl_set_limits $NS2 3 3
+		run_tests $NS1 $NS2 10.0.1.1 0 -8 0 slow
 		chk_join_nr "flush invalid addresses" 1 1 1
 		chk_add_nr 3 3
 		chk_rm_nr 3 1 invert
@@ -1664,20 +1684,20 @@ remove_tests()
 
 	# remove id 0 subflow
 	if reset; then
-		pm_nl_set_limits $ns1 0 1
-		pm_nl_set_limits $ns2 0 1
-		pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow
-		run_tests $ns1 $ns2 10.0.1.1 0 0 -9 slow
+		pm_nl_set_limits $NS1 0 1
+		pm_nl_set_limits $NS2 0 1
+		pm_nl_add_endpoint $NS2 10.0.3.2 flags subflow
+		run_tests $NS1 $NS2 10.0.1.1 0 0 -9 slow
 		chk_join_nr "remove id 0 subflow" 1 1 1
 		chk_rm_nr 1 1
 	fi
 
 	# remove id 0 address
 	if reset; then
-		pm_nl_set_limits $ns1 0 1
-		pm_nl_add_endpoint $ns1 10.0.2.1 flags signal
-		pm_nl_set_limits $ns2 1 1
-		run_tests $ns1 $ns2 10.0.1.1 0 -9 0 slow
+		pm_nl_set_limits $NS1 0 1
+		pm_nl_add_endpoint $NS1 10.0.2.1 flags signal
+		pm_nl_set_limits $NS2 1 1
+		run_tests $NS1 $NS2 10.0.1.1 0 -9 0 slow
 		chk_join_nr "remove id 0 address" 1 1 1
 		chk_add_nr 1 1
 		chk_rm_nr 1 1 invert
@@ -1688,42 +1708,42 @@ add_tests()
 {
 	# add single subflow
 	if reset; then
-		pm_nl_set_limits $ns1 0 1
-		pm_nl_set_limits $ns2 0 1
-		run_tests $ns1 $ns2 10.0.1.1 0 0 1 slow
+		pm_nl_set_limits $NS1 0 1
+		pm_nl_set_limits $NS2 0 1
+		run_tests $NS1 $NS2 10.0.1.1 0 0 1 slow
 		chk_join_nr "add single subflow" 1 1 1
 	fi
 
 	# add signal address
 	if reset; then
-		pm_nl_set_limits $ns1 0 1
-		pm_nl_set_limits $ns2 1 1
-		run_tests $ns1 $ns2 10.0.1.1 0 1 0 slow
+		pm_nl_set_limits $NS1 0 1
+		pm_nl_set_limits $NS2 1 1
+		run_tests $NS1 $NS2 10.0.1.1 0 1 0 slow
 		chk_join_nr "add signal address" 1 1 1
 		chk_add_nr 1 1
 	fi
 
 	# add multiple subflows
 	if reset; then
-		pm_nl_set_limits $ns1 0 2
-		pm_nl_set_limits $ns2 0 2
-		run_tests $ns1 $ns2 10.0.1.1 0 0 2 slow
+		pm_nl_set_limits $NS1 0 2
+		pm_nl_set_limits $NS2 0 2
+		run_tests $NS1 $NS2 10.0.1.1 0 0 2 slow
 		chk_join_nr "add multiple subflows" 2 2 2
 	fi
 
 	# add multiple subflows IPv6
 	if reset; then
-		pm_nl_set_limits $ns1 0 2
-		pm_nl_set_limits $ns2 0 2
-		run_tests $ns1 $ns2 dead:beef:1::1 0 0 2 slow
+		pm_nl_set_limits $NS1 0 2
+		pm_nl_set_limits $NS2 0 2
+		run_tests $NS1 $NS2 dead:beef:1::1 0 0 2 slow
 		chk_join_nr "add multiple subflows IPv6" 2 2 2
 	fi
 
 	# add multiple addresses IPv6
 	if reset; then
-		pm_nl_set_limits $ns1 0 2
-		pm_nl_set_limits $ns2 2 2
-		run_tests $ns1 $ns2 dead:beef:1::1 0 2 0 slow
+		pm_nl_set_limits $NS1 0 2
+		pm_nl_set_limits $NS2 2 2
+		run_tests $NS1 $NS2 dead:beef:1::1 0 2 0 slow
 		chk_join_nr "add multiple addresses IPv6" 2 2 2
 		chk_add_nr 2 2
 	fi
@@ -1733,37 +1753,37 @@ ipv6_tests()
 {
 	# subflow IPv6
 	if reset; then
-		pm_nl_set_limits $ns1 0 1
-		pm_nl_set_limits $ns2 0 1
-		pm_nl_add_endpoint $ns2 dead:beef:3::2 dev ns2eth3 flags subflow
-		run_tests $ns1 $ns2 dead:beef:1::1 0 0 0 slow
+		pm_nl_set_limits $NS1 0 1
+		pm_nl_set_limits $NS2 0 1
+		pm_nl_add_endpoint $NS2 dead:beef:3::2 dev ns2eth3 flags subflow
+		run_tests $NS1 $NS2 dead:beef:1::1 0 0 0 slow
 		chk_join_nr "single subflow IPv6" 1 1 1
 	fi
 
 	# add_address, unused IPv6
 	if reset; then
-		pm_nl_add_endpoint $ns1 dead:beef:2::1 flags signal
-		run_tests $ns1 $ns2 dead:beef:1::1 0 0 0 slow
+		pm_nl_add_endpoint $NS1 dead:beef:2::1 flags signal
+		run_tests $NS1 $NS2 dead:beef:1::1 0 0 0 slow
 		chk_join_nr "unused signal address IPv6" 0 0 0
 		chk_add_nr 1 1
 	fi
 
 	# signal address IPv6
 	if reset; then
-		pm_nl_set_limits $ns1 0 1
-		pm_nl_add_endpoint $ns1 dead:beef:2::1 flags signal
-		pm_nl_set_limits $ns2 1 1
-		run_tests $ns1 $ns2 dead:beef:1::1 0 0 0 slow
+		pm_nl_set_limits $NS1 0 1
+		pm_nl_add_endpoint $NS1 dead:beef:2::1 flags signal
+		pm_nl_set_limits $NS2 1 1
+		run_tests $NS1 $NS2 dead:beef:1::1 0 0 0 slow
 		chk_join_nr "single address IPv6" 1 1 1
 		chk_add_nr 1 1
 	fi
 
 	# single address IPv6, remove
 	if reset; then
-		pm_nl_set_limits $ns1 0 1
-		pm_nl_add_endpoint $ns1 dead:beef:2::1 flags signal
-		pm_nl_set_limits $ns2 1 1
-		run_tests $ns1 $ns2 dead:beef:1::1 0 -1 0 slow
+		pm_nl_set_limits $NS1 0 1
+		pm_nl_add_endpoint $NS1 dead:beef:2::1 flags signal
+		pm_nl_set_limits $NS2 1 1
+		run_tests $NS1 $NS2 dead:beef:1::1 0 -1 0 slow
 		chk_join_nr "remove single address IPv6" 1 1 1
 		chk_add_nr 1 1
 		chk_rm_nr 1 1 invert
@@ -1771,11 +1791,11 @@ ipv6_tests()
 
 	# subflow and signal IPv6, remove
 	if reset; then
-		pm_nl_set_limits $ns1 0 2
-		pm_nl_add_endpoint $ns1 dead:beef:2::1 flags signal
-		pm_nl_set_limits $ns2 1 2
-		pm_nl_add_endpoint $ns2 dead:beef:3::2 dev ns2eth3 flags subflow
-		run_tests $ns1 $ns2 dead:beef:1::1 0 -1 -1 slow
+		pm_nl_set_limits $NS1 0 2
+		pm_nl_add_endpoint $NS1 dead:beef:2::1 flags signal
+		pm_nl_set_limits $NS2 1 2
+		pm_nl_add_endpoint $NS2 dead:beef:3::2 dev ns2eth3 flags subflow
+		run_tests $NS1 $NS2 dead:beef:1::1 0 -1 -1 slow
 		chk_join_nr "remove subflow and signal IPv6" 2 2 2
 		chk_add_nr 1 1
 		chk_rm_nr 1 1
@@ -1786,85 +1806,85 @@ v4mapped_tests()
 {
 	# subflow IPv4-mapped to IPv4-mapped
 	if reset; then
-		pm_nl_set_limits $ns1 0 1
-		pm_nl_set_limits $ns2 0 1
-		pm_nl_add_endpoint $ns2 "::ffff:10.0.3.2" flags subflow
-		run_tests $ns1 $ns2 "::ffff:10.0.1.1"
+		pm_nl_set_limits $NS1 0 1
+		pm_nl_set_limits $NS2 0 1
+		pm_nl_add_endpoint $NS2 "::ffff:10.0.3.2" flags subflow
+		run_tests $NS1 $NS2 "::ffff:10.0.1.1"
 		chk_join_nr "single subflow IPv4-mapped" 1 1 1
 	fi
 
 	# signal address IPv4-mapped with IPv4-mapped sk
 	if reset; then
-		pm_nl_set_limits $ns1 0 1
-		pm_nl_set_limits $ns2 1 1
-		pm_nl_add_endpoint $ns1 "::ffff:10.0.2.1" flags signal
-		run_tests $ns1 $ns2 "::ffff:10.0.1.1"
+		pm_nl_set_limits $NS1 0 1
+		pm_nl_set_limits $NS2 1 1
+		pm_nl_add_endpoint $NS1 "::ffff:10.0.2.1" flags signal
+		run_tests $NS1 $NS2 "::ffff:10.0.1.1"
 		chk_join_nr "signal address IPv4-mapped" 1 1 1
 		chk_add_nr 1 1
 	fi
 
 	# subflow v4-map-v6
 	if reset; then
-		pm_nl_set_limits $ns1 0 1
-		pm_nl_set_limits $ns2 0 1
-		pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow
-		run_tests $ns1 $ns2 "::ffff:10.0.1.1"
+		pm_nl_set_limits $NS1 0 1
+		pm_nl_set_limits $NS2 0 1
+		pm_nl_add_endpoint $NS2 10.0.3.2 flags subflow
+		run_tests $NS1 $NS2 "::ffff:10.0.1.1"
 		chk_join_nr "single subflow v4-map-v6" 1 1 1
 	fi
 
 	# signal address v4-map-v6
 	if reset; then
-		pm_nl_set_limits $ns1 0 1
-		pm_nl_set_limits $ns2 1 1
-		pm_nl_add_endpoint $ns1 10.0.2.1 flags signal
-		run_tests $ns1 $ns2 "::ffff:10.0.1.1"
+		pm_nl_set_limits $NS1 0 1
+		pm_nl_set_limits $NS2 1 1
+		pm_nl_add_endpoint $NS1 10.0.2.1 flags signal
+		run_tests $NS1 $NS2 "::ffff:10.0.1.1"
 		chk_join_nr "signal address v4-map-v6" 1 1 1
 		chk_add_nr 1 1
 	fi
 
 	# subflow v6-map-v4
 	if reset; then
-		pm_nl_set_limits $ns1 0 1
-		pm_nl_set_limits $ns2 0 1
-		pm_nl_add_endpoint $ns2 "::ffff:10.0.3.2" flags subflow
-		run_tests $ns1 $ns2 10.0.1.1
+		pm_nl_set_limits $NS1 0 1
+		pm_nl_set_limits $NS2 0 1
+		pm_nl_add_endpoint $NS2 "::ffff:10.0.3.2" flags subflow
+		run_tests $NS1 $NS2 10.0.1.1
 		chk_join_nr "single subflow v6-map-v4" 1 1 1
 	fi
 
 	# signal address v6-map-v4
 	if reset; then
-		pm_nl_set_limits $ns1 0 1
-		pm_nl_set_limits $ns2 1 1
-		pm_nl_add_endpoint $ns1 "::ffff:10.0.2.1" flags signal
-		run_tests $ns1 $ns2 10.0.1.1
+		pm_nl_set_limits $NS1 0 1
+		pm_nl_set_limits $NS2 1 1
+		pm_nl_add_endpoint $NS1 "::ffff:10.0.2.1" flags signal
+		run_tests $NS1 $NS2 10.0.1.1
 		chk_join_nr "signal address v6-map-v4" 1 1 1
 		chk_add_nr 1 1
 	fi
 
 	# no subflow IPv6 to v4 address
 	if reset; then
-		pm_nl_set_limits $ns1 0 1
-		pm_nl_set_limits $ns2 0 1
-		pm_nl_add_endpoint $ns2 dead:beef:2::2 flags subflow
-		run_tests $ns1 $ns2 10.0.1.1
+		pm_nl_set_limits $NS1 0 1
+		pm_nl_set_limits $NS2 0 1
+		pm_nl_add_endpoint $NS2 dead:beef:2::2 flags subflow
+		run_tests $NS1 $NS2 10.0.1.1
 		chk_join_nr "no JOIN with diff families v4-v6" 0 0 0
 	fi
 
 	# no subflow IPv6 to v4 address even if v6 has a valid v4 at the end
 	if reset; then
-		pm_nl_set_limits $ns1 0 1
-		pm_nl_set_limits $ns2 0 1
-		pm_nl_add_endpoint $ns2 dead:beef:2::10.0.3.2 flags subflow
-		run_tests $ns1 $ns2 10.0.1.1
+		pm_nl_set_limits $NS1 0 1
+		pm_nl_set_limits $NS2 0 1
+		pm_nl_add_endpoint $NS2 dead:beef:2::10.0.3.2 flags subflow
+		run_tests $NS1 $NS2 10.0.1.1
 		chk_join_nr "no JOIN with diff families v4-v6-2" 0 0 0
 	fi
 
 	# no subflow IPv4 to v6 address, no need to slow down too then
 	if reset; then
-		pm_nl_set_limits $ns1 0 1
-		pm_nl_set_limits $ns2 0 1
-		pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow
-		run_tests $ns1 $ns2 dead:beef:1::1
+		pm_nl_set_limits $NS1 0 1
+		pm_nl_set_limits $NS2 0 1
+		pm_nl_add_endpoint $NS2 10.0.3.2 flags subflow
+		run_tests $NS1 $NS2 dead:beef:1::1
 		chk_join_nr "no JOIN with diff families v6-v4" 0 0 0
 	fi
 }
@@ -1873,20 +1893,20 @@ backup_tests()
 {
 	# single subflow, backup
 	if reset; then
-		pm_nl_set_limits $ns1 0 1
-		pm_nl_set_limits $ns2 0 1
-		pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow,backup
-		run_tests $ns1 $ns2 10.0.1.1 0 0 0 slow nobackup
+		pm_nl_set_limits $NS1 0 1
+		pm_nl_set_limits $NS2 0 1
+		pm_nl_add_endpoint $NS2 10.0.3.2 flags subflow,backup
+		run_tests $NS1 $NS2 10.0.1.1 0 0 0 slow nobackup
 		chk_join_nr "single subflow, backup" 1 1 1
 		chk_prio_nr 0 1
 	fi
 
 	# single address, backup
 	if reset; then
-		pm_nl_set_limits $ns1 0 1
-		pm_nl_add_endpoint $ns1 10.0.2.1 flags signal
-		pm_nl_set_limits $ns2 1 1
-		run_tests $ns1 $ns2 10.0.1.1 0 0 0 slow backup
+		pm_nl_set_limits $NS1 0 1
+		pm_nl_add_endpoint $NS1 10.0.2.1 flags signal
+		pm_nl_set_limits $NS2 1 1
+		run_tests $NS1 $NS2 10.0.1.1 0 0 0 slow backup
 		chk_join_nr "single address, backup" 1 1 1
 		chk_add_nr 1 1
 		chk_prio_nr 1 0
@@ -1894,10 +1914,10 @@ backup_tests()
 
 	# single address with port, backup
 	if reset; then
-		pm_nl_set_limits $ns1 0 1
-		pm_nl_add_endpoint $ns1 10.0.2.1 flags signal port 10100
-		pm_nl_set_limits $ns2 1 1
-		run_tests $ns1 $ns2 10.0.1.1 0 0 0 slow backup
+		pm_nl_set_limits $NS1 0 1
+		pm_nl_add_endpoint $NS1 10.0.2.1 flags signal port 10100
+		pm_nl_set_limits $NS2 1 1
+		run_tests $NS1 $NS2 10.0.1.1 0 0 0 slow backup
 		chk_join_nr "single address with port, backup" 1 1 1
 		chk_add_nr 1 1
 		chk_prio_nr 1 0
@@ -1908,31 +1928,31 @@ add_addr_ports_tests()
 {
 	# signal address with port
 	if reset; then
-		pm_nl_set_limits $ns1 0 1
-		pm_nl_set_limits $ns2 1 1
-		pm_nl_add_endpoint $ns1 10.0.2.1 flags signal port 10100
-		run_tests $ns1 $ns2 10.0.1.1
+		pm_nl_set_limits $NS1 0 1
+		pm_nl_set_limits $NS2 1 1
+		pm_nl_add_endpoint $NS1 10.0.2.1 flags signal port 10100
+		run_tests $NS1 $NS2 10.0.1.1
 		chk_join_nr "signal address with port" 1 1 1
 		chk_add_nr 1 1 1
 	fi
 
 	# subflow and signal with port
 	if reset; then
-		pm_nl_add_endpoint $ns1 10.0.2.1 flags signal port 10100
-		pm_nl_set_limits $ns1 0 2
-		pm_nl_set_limits $ns2 1 2
-		pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow
-		run_tests $ns1 $ns2 10.0.1.1
+		pm_nl_add_endpoint $NS1 10.0.2.1 flags signal port 10100
+		pm_nl_set_limits $NS1 0 2
+		pm_nl_set_limits $NS2 1 2
+		pm_nl_add_endpoint $NS2 10.0.3.2 flags subflow
+		run_tests $NS1 $NS2 10.0.1.1
 		chk_join_nr "subflow and signal with port" 2 2 2
 		chk_add_nr 1 1 1
 	fi
 
 	# single address with port, remove
 	if reset; then
-		pm_nl_set_limits $ns1 0 1
-		pm_nl_add_endpoint $ns1 10.0.2.1 flags signal port 10100
-		pm_nl_set_limits $ns2 1 1
-		run_tests $ns1 $ns2 10.0.1.1 0 -1 0 slow
+		pm_nl_set_limits $NS1 0 1
+		pm_nl_add_endpoint $NS1 10.0.2.1 flags signal port 10100
+		pm_nl_set_limits $NS2 1 1
+		run_tests $NS1 $NS2 10.0.1.1 0 -1 0 slow
 		chk_join_nr "remove single address with port" 1 1 1
 		chk_add_nr 1 1 1
 		chk_rm_nr 1 1 invert
@@ -1940,11 +1960,11 @@ add_addr_ports_tests()
 
 	# subflow and signal with port, remove
 	if reset; then
-		pm_nl_set_limits $ns1 0 2
-		pm_nl_add_endpoint $ns1 10.0.2.1 flags signal port 10100
-		pm_nl_set_limits $ns2 1 2
-		pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow
-		run_tests $ns1 $ns2 10.0.1.1 0 -1 -1 slow
+		pm_nl_set_limits $NS1 0 2
+		pm_nl_add_endpoint $NS1 10.0.2.1 flags signal port 10100
+		pm_nl_set_limits $NS2 1 2
+		pm_nl_add_endpoint $NS2 10.0.3.2 flags subflow
+		run_tests $NS1 $NS2 10.0.1.1 0 -1 -1 slow
 		chk_join_nr "remove subflow and signal with port" 2 2 2
 		chk_add_nr 1 1 1
 		chk_rm_nr 1 1
@@ -1952,12 +1972,12 @@ add_addr_ports_tests()
 
 	# subflows and signal with port, flush
 	if reset; then
-		pm_nl_set_limits $ns1 0 3
-		pm_nl_add_endpoint $ns1 10.0.2.1 flags signal port 10100
-		pm_nl_set_limits $ns2 1 3
-		pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow
-		pm_nl_add_endpoint $ns2 10.0.4.2 flags subflow
-		run_tests $ns1 $ns2 10.0.1.1 0 -8 -2 slow
+		pm_nl_set_limits $NS1 0 3
+		pm_nl_add_endpoint $NS1 10.0.2.1 flags signal port 10100
+		pm_nl_set_limits $NS2 1 3
+		pm_nl_add_endpoint $NS2 10.0.3.2 flags subflow
+		pm_nl_add_endpoint $NS2 10.0.4.2 flags subflow
+		run_tests $NS1 $NS2 10.0.1.1 0 -8 -2 slow
 		chk_join_nr "flush subflows and signal with port" 3 3 3
 		chk_add_nr 1 1
 		chk_rm_nr 2 2
@@ -1965,22 +1985,22 @@ add_addr_ports_tests()
 
 	# multiple addresses with port
 	if reset; then
-		pm_nl_set_limits $ns1 2 2
-		pm_nl_add_endpoint $ns1 10.0.2.1 flags signal port 10100
-		pm_nl_add_endpoint $ns1 10.0.3.1 flags signal port 10100
-		pm_nl_set_limits $ns2 2 2
-		run_tests $ns1 $ns2 10.0.1.1
+		pm_nl_set_limits $NS1 2 2
+		pm_nl_add_endpoint $NS1 10.0.2.1 flags signal port 10100
+		pm_nl_add_endpoint $NS1 10.0.3.1 flags signal port 10100
+		pm_nl_set_limits $NS2 2 2
+		run_tests $NS1 $NS2 10.0.1.1
 		chk_join_nr "multiple addresses with port" 2 2 2
 		chk_add_nr 2 2 2
 	fi
 
 	# multiple addresses with ports
 	if reset; then
-		pm_nl_set_limits $ns1 2 2
-		pm_nl_add_endpoint $ns1 10.0.2.1 flags signal port 10100
-		pm_nl_add_endpoint $ns1 10.0.3.1 flags signal port 10101
-		pm_nl_set_limits $ns2 2 2
-		run_tests $ns1 $ns2 10.0.1.1
+		pm_nl_set_limits $NS1 2 2
+		pm_nl_add_endpoint $NS1 10.0.2.1 flags signal port 10100
+		pm_nl_add_endpoint $NS1 10.0.3.1 flags signal port 10101
+		pm_nl_set_limits $NS2 2 2
+		run_tests $NS1 $NS2 10.0.1.1
 		chk_join_nr "multiple addresses with ports" 2 2 2
 		chk_add_nr 2 2 2
 	fi
@@ -1990,62 +2010,62 @@ syncookies_tests()
 {
 	# single subflow, syncookies
 	if reset_with_cookies; then
-		pm_nl_set_limits $ns1 0 1
-		pm_nl_set_limits $ns2 0 1
-		pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow
-		run_tests $ns1 $ns2 10.0.1.1
+		pm_nl_set_limits $NS1 0 1
+		pm_nl_set_limits $NS2 0 1
+		pm_nl_add_endpoint $NS2 10.0.3.2 flags subflow
+		run_tests $NS1 $NS2 10.0.1.1
 		chk_join_nr "single subflow with syn cookies" 1 1 1
 	fi
 
 	# multiple subflows with syn cookies
 	if reset_with_cookies; then
-		pm_nl_set_limits $ns1 0 2
-		pm_nl_set_limits $ns2 0 2
-		pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow
-		pm_nl_add_endpoint $ns2 10.0.2.2 flags subflow
-		run_tests $ns1 $ns2 10.0.1.1
+		pm_nl_set_limits $NS1 0 2
+		pm_nl_set_limits $NS2 0 2
+		pm_nl_add_endpoint $NS2 10.0.3.2 flags subflow
+		pm_nl_add_endpoint $NS2 10.0.2.2 flags subflow
+		run_tests $NS1 $NS2 10.0.1.1
 		chk_join_nr "multiple subflows with syn cookies" 2 2 2
 	fi
 
 	# multiple subflows limited by server
 	if reset_with_cookies; then
-		pm_nl_set_limits $ns1 0 1
-		pm_nl_set_limits $ns2 0 2
-		pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow
-		pm_nl_add_endpoint $ns2 10.0.2.2 flags subflow
-		run_tests $ns1 $ns2 10.0.1.1
+		pm_nl_set_limits $NS1 0 1
+		pm_nl_set_limits $NS2 0 2
+		pm_nl_add_endpoint $NS2 10.0.3.2 flags subflow
+		pm_nl_add_endpoint $NS2 10.0.2.2 flags subflow
+		run_tests $NS1 $NS2 10.0.1.1
 		chk_join_nr "subflows limited by server w cookies" 2 1 1
 	fi
 
 	# test signal address with cookies
 	if reset_with_cookies; then
-		pm_nl_set_limits $ns1 0 1
-		pm_nl_set_limits $ns2 1 1
-		pm_nl_add_endpoint $ns1 10.0.2.1 flags signal
-		run_tests $ns1 $ns2 10.0.1.1
+		pm_nl_set_limits $NS1 0 1
+		pm_nl_set_limits $NS2 1 1
+		pm_nl_add_endpoint $NS1 10.0.2.1 flags signal
+		run_tests $NS1 $NS2 10.0.1.1
 		chk_join_nr "signal address with syn cookies" 1 1 1
 		chk_add_nr 1 1
 	fi
 
 	# test cookie with subflow and signal
 	if reset_with_cookies; then
-		pm_nl_add_endpoint $ns1 10.0.2.1 flags signal
-		pm_nl_set_limits $ns1 0 2
-		pm_nl_set_limits $ns2 1 2
-		pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow
-		run_tests $ns1 $ns2 10.0.1.1
+		pm_nl_add_endpoint $NS1 10.0.2.1 flags signal
+		pm_nl_set_limits $NS1 0 2
+		pm_nl_set_limits $NS2 1 2
+		pm_nl_add_endpoint $NS2 10.0.3.2 flags subflow
+		run_tests $NS1 $NS2 10.0.1.1
 		chk_join_nr "subflow and signal w cookies" 2 2 2
 		chk_add_nr 1 1
 	fi
 
 	# accept and use add_addr with additional subflows
 	if reset_with_cookies; then
-		pm_nl_set_limits $ns1 0 3
-		pm_nl_add_endpoint $ns1 10.0.2.1 flags signal
-		pm_nl_set_limits $ns2 1 3
-		pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow
-		pm_nl_add_endpoint $ns2 10.0.4.2 flags subflow
-		run_tests $ns1 $ns2 10.0.1.1
+		pm_nl_set_limits $NS1 0 3
+		pm_nl_add_endpoint $NS1 10.0.2.1 flags signal
+		pm_nl_set_limits $NS2 1 3
+		pm_nl_add_endpoint $NS2 10.0.3.2 flags subflow
+		pm_nl_add_endpoint $NS2 10.0.4.2 flags subflow
+		run_tests $NS1 $NS2 10.0.1.1
 		chk_join_nr "subflows and signal w. cookies" 3 3 3
 		chk_add_nr 1 1
 	fi
@@ -2055,33 +2075,33 @@ checksum_tests()
 {
 	# checksum test 0 0
 	if reset_with_checksum 0 0; then
-		pm_nl_set_limits $ns1 0 1
-		pm_nl_set_limits $ns2 0 1
-		run_tests $ns1 $ns2 10.0.1.1
+		pm_nl_set_limits $NS1 0 1
+		pm_nl_set_limits $NS2 0 1
+		run_tests $NS1 $NS2 10.0.1.1
 		chk_csum_nr "checksum test 0 0"
 	fi
 
 	# checksum test 1 1
 	if reset_with_checksum 1 1; then
-		pm_nl_set_limits $ns1 0 1
-		pm_nl_set_limits $ns2 0 1
-		run_tests $ns1 $ns2 10.0.1.1
+		pm_nl_set_limits $NS1 0 1
+		pm_nl_set_limits $NS2 0 1
+		run_tests $NS1 $NS2 10.0.1.1
 		chk_csum_nr "checksum test 1 1"
 	fi
 
 	# checksum test 0 1
 	if reset_with_checksum 0 1; then
-		pm_nl_set_limits $ns1 0 1
-		pm_nl_set_limits $ns2 0 1
-		run_tests $ns1 $ns2 10.0.1.1
+		pm_nl_set_limits $NS1 0 1
+		pm_nl_set_limits $NS2 0 1
+		run_tests $NS1 $NS2 10.0.1.1
 		chk_csum_nr "checksum test 0 1"
 	fi
 
 	# checksum test 1 0
 	if reset_with_checksum 1 0; then
-		pm_nl_set_limits $ns1 0 1
-		pm_nl_set_limits $ns2 0 1
-		run_tests $ns1 $ns2 10.0.1.1
+		pm_nl_set_limits $NS1 0 1
+		pm_nl_set_limits $NS2 0 1
+		run_tests $NS1 $NS2 10.0.1.1
 		chk_csum_nr "checksum test 1 0"
 	fi
 }
@@ -2090,29 +2110,29 @@ deny_join_id0_tests()
 {
 	# subflow allow join id0 ns1
 	if reset_with_allow_join_id0 1 0; then
-		pm_nl_set_limits $ns1 1 1
-		pm_nl_set_limits $ns2 1 1
-		pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow
-		run_tests $ns1 $ns2 10.0.1.1
+		pm_nl_set_limits $NS1 1 1
+		pm_nl_set_limits $NS2 1 1
+		pm_nl_add_endpoint $NS2 10.0.3.2 flags subflow
+		run_tests $NS1 $NS2 10.0.1.1
 		chk_join_nr "single subflow allow join id0 ns1" 1 1 1
 	fi
 
 	# subflow allow join id0 ns2
 	if reset_with_allow_join_id0 0 1; then
-		pm_nl_set_limits $ns1 1 1
-		pm_nl_set_limits $ns2 1 1
-		pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow
-		run_tests $ns1 $ns2 10.0.1.1
+		pm_nl_set_limits $NS1 1 1
+		pm_nl_set_limits $NS2 1 1
+		pm_nl_add_endpoint $NS2 10.0.3.2 flags subflow
+		run_tests $NS1 $NS2 10.0.1.1
 		chk_join_nr "single subflow allow join id0 ns2" 0 0 0
 	fi
 
 	# signal address allow join id0 ns1
 	# ADD_ADDRs are not affected by allow_join_id0 value.
 	if reset_with_allow_join_id0 1 0; then
-		pm_nl_set_limits $ns1 1 1
-		pm_nl_set_limits $ns2 1 1
-		pm_nl_add_endpoint $ns1 10.0.2.1 flags signal
-		run_tests $ns1 $ns2 10.0.1.1
+		pm_nl_set_limits $NS1 1 1
+		pm_nl_set_limits $NS2 1 1
+		pm_nl_add_endpoint $NS1 10.0.2.1 flags signal
+		run_tests $NS1 $NS2 10.0.1.1
 		chk_join_nr "signal address allow join id0 ns1" 1 1 1
 		chk_add_nr 1 1
 	fi
@@ -2120,31 +2140,31 @@ deny_join_id0_tests()
 	# signal address allow join id0 ns2
 	# ADD_ADDRs are not affected by allow_join_id0 value.
 	if reset_with_allow_join_id0 0 1; then
-		pm_nl_set_limits $ns1 1 1
-		pm_nl_set_limits $ns2 1 1
-		pm_nl_add_endpoint $ns1 10.0.2.1 flags signal
-		run_tests $ns1 $ns2 10.0.1.1
+		pm_nl_set_limits $NS1 1 1
+		pm_nl_set_limits $NS2 1 1
+		pm_nl_add_endpoint $NS1 10.0.2.1 flags signal
+		run_tests $NS1 $NS2 10.0.1.1
 		chk_join_nr "signal address allow join id0 ns2" 1 1 1
 		chk_add_nr 1 1
 	fi
 
 	# subflow and address allow join id0 ns1
 	if reset_with_allow_join_id0 1 0; then
-		pm_nl_set_limits $ns1 2 2
-		pm_nl_set_limits $ns2 2 2
-		pm_nl_add_endpoint $ns1 10.0.2.1 flags signal
-		pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow
-		run_tests $ns1 $ns2 10.0.1.1
+		pm_nl_set_limits $NS1 2 2
+		pm_nl_set_limits $NS2 2 2
+		pm_nl_add_endpoint $NS1 10.0.2.1 flags signal
+		pm_nl_add_endpoint $NS2 10.0.3.2 flags subflow
+		run_tests $NS1 $NS2 10.0.1.1
 		chk_join_nr "subflow and address allow join id0 1" 2 2 2
 	fi
 
 	# subflow and address allow join id0 ns2
 	if reset_with_allow_join_id0 0 1; then
-		pm_nl_set_limits $ns1 2 2
-		pm_nl_set_limits $ns2 2 2
-		pm_nl_add_endpoint $ns1 10.0.2.1 flags signal
-		pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow
-		run_tests $ns1 $ns2 10.0.1.1
+		pm_nl_set_limits $NS1 2 2
+		pm_nl_set_limits $NS2 2 2
+		pm_nl_add_endpoint $NS1 10.0.2.1 flags signal
+		pm_nl_add_endpoint $NS2 10.0.3.2 flags subflow
+		run_tests $NS1 $NS2 10.0.1.1
 		chk_join_nr "subflow and address allow join id0 2" 1 1 1
 	fi
 }
@@ -2155,11 +2175,11 @@ fullmesh_tests()
 	# 2 fullmesh addrs in ns2, added before the connection,
 	# 1 non-fullmesh addr in ns1, added during the connection.
 	if reset; then
-		pm_nl_set_limits $ns1 0 4
-		pm_nl_set_limits $ns2 1 4
-		pm_nl_add_endpoint $ns2 10.0.2.2 flags subflow,fullmesh
-		pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow,fullmesh
-		run_tests $ns1 $ns2 10.0.1.1 0 1 0 slow
+		pm_nl_set_limits $NS1 0 4
+		pm_nl_set_limits $NS2 1 4
+		pm_nl_add_endpoint $NS2 10.0.2.2 flags subflow,fullmesh
+		pm_nl_add_endpoint $NS2 10.0.3.2 flags subflow,fullmesh
+		run_tests $NS1 $NS2 10.0.1.1 0 1 0 slow
 		chk_join_nr "fullmesh test 2x1" 4 4 4
 		chk_add_nr 1 1
 	fi
@@ -2168,10 +2188,10 @@ fullmesh_tests()
 	# 1 non-fullmesh addr in ns1, added before the connection,
 	# 1 fullmesh addr in ns2, added during the connection.
 	if reset; then
-		pm_nl_set_limits $ns1 1 3
-		pm_nl_set_limits $ns2 1 3
-		pm_nl_add_endpoint $ns1 10.0.2.1 flags signal
-		run_tests $ns1 $ns2 10.0.1.1 0 0 fullmesh_1 slow
+		pm_nl_set_limits $NS1 1 3
+		pm_nl_set_limits $NS2 1 3
+		pm_nl_add_endpoint $NS1 10.0.2.1 flags signal
+		run_tests $NS1 $NS2 10.0.1.1 0 0 fullmesh_1 slow
 		chk_join_nr "fullmesh test 1x1" 3 3 3
 		chk_add_nr 1 1
 	fi
@@ -2180,10 +2200,10 @@ fullmesh_tests()
 	# 1 non-fullmesh addr in ns1, added before the connection,
 	# 2 fullmesh addrs in ns2, added during the connection.
 	if reset; then
-		pm_nl_set_limits $ns1 2 5
-		pm_nl_set_limits $ns2 1 5
-		pm_nl_add_endpoint $ns1 10.0.2.1 flags signal
-		run_tests $ns1 $ns2 10.0.1.1 0 0 fullmesh_2 slow
+		pm_nl_set_limits $NS1 2 5
+		pm_nl_set_limits $NS2 1 5
+		pm_nl_add_endpoint $NS1 10.0.2.1 flags signal
+		run_tests $NS1 $NS2 10.0.1.1 0 0 fullmesh_2 slow
 		chk_join_nr "fullmesh test 1x2" 5 5 5
 		chk_add_nr 1 1
 	fi
@@ -2193,40 +2213,40 @@ fullmesh_tests()
 	# 2 fullmesh addrs in ns2, added during the connection,
 	# limit max_subflows to 4.
 	if reset; then
-		pm_nl_set_limits $ns1 2 4
-		pm_nl_set_limits $ns2 1 4
-		pm_nl_add_endpoint $ns1 10.0.2.1 flags signal
-		run_tests $ns1 $ns2 10.0.1.1 0 0 fullmesh_2 slow
+		pm_nl_set_limits $NS1 2 4
+		pm_nl_set_limits $NS2 1 4
+		pm_nl_add_endpoint $NS1 10.0.2.1 flags signal
+		run_tests $NS1 $NS2 10.0.1.1 0 0 fullmesh_2 slow
 		chk_join_nr "fullmesh test 1x2, limited" 4 4 4
 		chk_add_nr 1 1
 	fi
 
 	# set fullmesh flag
 	if reset; then
-		pm_nl_set_limits $ns1 4 4
-		pm_nl_add_endpoint $ns1 10.0.2.1 flags subflow
-		pm_nl_set_limits $ns2 4 4
-		run_tests $ns1 $ns2 10.0.1.1 0 0 1 slow fullmesh
+		pm_nl_set_limits $NS1 4 4
+		pm_nl_add_endpoint $NS1 10.0.2.1 flags subflow
+		pm_nl_set_limits $NS2 4 4
+		run_tests $NS1 $NS2 10.0.1.1 0 0 1 slow fullmesh
 		chk_join_nr "set fullmesh flag test" 2 2 2
 		chk_rm_nr 0 1
 	fi
 
 	# set nofullmesh flag
 	if reset; then
-		pm_nl_set_limits $ns1 4 4
-		pm_nl_add_endpoint $ns1 10.0.2.1 flags subflow,fullmesh
-		pm_nl_set_limits $ns2 4 4
-		run_tests $ns1 $ns2 10.0.1.1 0 0 fullmesh_1 slow nofullmesh
+		pm_nl_set_limits $NS1 4 4
+		pm_nl_add_endpoint $NS1 10.0.2.1 flags subflow,fullmesh
+		pm_nl_set_limits $NS2 4 4
+		run_tests $NS1 $NS2 10.0.1.1 0 0 fullmesh_1 slow nofullmesh
 		chk_join_nr "set nofullmesh flag test" 2 2 2
 		chk_rm_nr 0 1
 	fi
 
 	# set backup,fullmesh flags
 	if reset; then
-		pm_nl_set_limits $ns1 4 4
-		pm_nl_add_endpoint $ns1 10.0.2.1 flags subflow
-		pm_nl_set_limits $ns2 4 4
-		run_tests $ns1 $ns2 10.0.1.1 0 0 1 slow backup,fullmesh
+		pm_nl_set_limits $NS1 4 4
+		pm_nl_add_endpoint $NS1 10.0.2.1 flags subflow
+		pm_nl_set_limits $NS2 4 4
+		run_tests $NS1 $NS2 10.0.1.1 0 0 1 slow backup,fullmesh
 		chk_join_nr "set backup,fullmesh flags test" 2 2 2
 		chk_prio_nr 0 1
 		chk_rm_nr 0 1
@@ -2234,10 +2254,10 @@ fullmesh_tests()
 
 	# set nobackup,nofullmesh flags
 	if reset; then
-		pm_nl_set_limits $ns1 4 4
-		pm_nl_set_limits $ns2 4 4
-		pm_nl_add_endpoint $ns2 10.0.2.2 flags subflow,backup,fullmesh
-		run_tests $ns1 $ns2 10.0.1.1 0 0 0 slow nobackup,nofullmesh
+		pm_nl_set_limits $NS1 4 4
+		pm_nl_set_limits $NS2 4 4
+		pm_nl_add_endpoint $NS2 10.0.2.2 flags subflow,backup,fullmesh
+		run_tests $NS1 $NS2 10.0.1.1 0 0 0 slow nobackup,nofullmesh
 		chk_join_nr "set nobackup,nofullmesh flags test" 2 2 2
 		chk_prio_nr 0 1
 		chk_rm_nr 0 1
@@ -2248,65 +2268,65 @@ userspace_tests()
 {
 	# userspace pm type prevents add_addr
 	if reset; then
-		ip netns exec $ns1 sysctl -q net.mptcp.pm_type=1
-		ip netns exec $ns1 ./pm_nl_ctl limits 0 2
-		ip netns exec $ns2 ./pm_nl_ctl limits 0 2
-		ip netns exec $ns1 ./pm_nl_ctl add 10.0.2.1 flags signal
-		run_tests $ns1 $ns2 10.0.1.1
+		ip netns exec $NS1 sysctl -q net.mptcp.pm_type=1
+		ip netns exec $NS1 ./pm_nl_ctl limits 0 2
+		ip netns exec $NS2 ./pm_nl_ctl limits 0 2
+		ip netns exec $NS1 ./pm_nl_ctl add 10.0.2.1 flags signal
+		run_tests $NS1 $NS2 10.0.1.1
 		chk_join_nr "userspace pm type prevents add_addr" 0 0 0
 		chk_add_nr 0 0
 	fi
 
 	# userspace pm type echoes add_addr
 	if reset; then
-		ip netns exec $ns2 sysctl -q net.mptcp.pm_type=1
-		ip netns exec $ns1 ./pm_nl_ctl limits 0 2
-		ip netns exec $ns2 ./pm_nl_ctl limits 0 2
-		ip netns exec $ns1 ./pm_nl_ctl add 10.0.2.1 flags signal
-		run_tests $ns1 $ns2 10.0.1.1
+		ip netns exec $NS2 sysctl -q net.mptcp.pm_type=1
+		ip netns exec $NS1 ./pm_nl_ctl limits 0 2
+		ip netns exec $NS2 ./pm_nl_ctl limits 0 2
+		ip netns exec $NS1 ./pm_nl_ctl add 10.0.2.1 flags signal
+		run_tests $NS1 $NS2 10.0.1.1
 		chk_join_nr "userspace pm type echoes add_addr" 0 0 0
 		chk_add_nr 1 1
 	fi
 
 	# userspace pm type rejects join
 	if reset; then
-		ip netns exec $ns1 sysctl -q net.mptcp.pm_type=1
-		ip netns exec $ns1 ./pm_nl_ctl limits 1 1
-		ip netns exec $ns2 ./pm_nl_ctl limits 1 1
-		ip netns exec $ns2 ./pm_nl_ctl add 10.0.3.2 flags subflow
-		run_tests $ns1 $ns2 10.0.1.1
+		ip netns exec $NS1 sysctl -q net.mptcp.pm_type=1
+		ip netns exec $NS1 ./pm_nl_ctl limits 1 1
+		ip netns exec $NS2 ./pm_nl_ctl limits 1 1
+		ip netns exec $NS2 ./pm_nl_ctl add 10.0.3.2 flags subflow
+		run_tests $NS1 $NS2 10.0.1.1
 		chk_join_nr "userspace pm type rejects join" 1 1 0
 	fi
 
 	# userspace pm type does not send join
 	if reset; then
-		ip netns exec $ns2 sysctl -q net.mptcp.pm_type=1
-		ip netns exec $ns1 ./pm_nl_ctl limits 1 1
-		ip netns exec $ns2 ./pm_nl_ctl limits 1 1
-		ip netns exec $ns2 ./pm_nl_ctl add 10.0.3.2 flags subflow
-		run_tests $ns1 $ns2 10.0.1.1
+		ip netns exec $NS2 sysctl -q net.mptcp.pm_type=1
+		ip netns exec $NS1 ./pm_nl_ctl limits 1 1
+		ip netns exec $NS2 ./pm_nl_ctl limits 1 1
+		ip netns exec $NS2 ./pm_nl_ctl add 10.0.3.2 flags subflow
+		run_tests $NS1 $NS2 10.0.1.1
 		chk_join_nr "userspace pm type does not send join" 0 0 0
 	fi
 
 	# userspace pm type prevents mp_prio
 	if reset; then
-		ip netns exec $ns1 sysctl -q net.mptcp.pm_type=1
-		ip netns exec $ns1 ./pm_nl_ctl limits 1 1
-		ip netns exec $ns2 ./pm_nl_ctl limits 1 1
-		ip netns exec $ns2 ./pm_nl_ctl add 10.0.3.2 flags subflow
-		run_tests $ns1 $ns2 10.0.1.1 0 0 0 slow backup
+		ip netns exec $NS1 sysctl -q net.mptcp.pm_type=1
+		ip netns exec $NS1 ./pm_nl_ctl limits 1 1
+		ip netns exec $NS2 ./pm_nl_ctl limits 1 1
+		ip netns exec $NS2 ./pm_nl_ctl add 10.0.3.2 flags subflow
+		run_tests $NS1 $NS2 10.0.1.1 0 0 0 slow backup
 		chk_join_nr "userspace pm type prevents mp_prio" 1 1 0
 		chk_prio_nr 0 0
 	fi
 
 	# userspace pm type prevents rm_addr
 	if reset; then
-		ip netns exec $ns1 sysctl -q net.mptcp.pm_type=1
-		ip netns exec $ns2 sysctl -q net.mptcp.pm_type=1
-		ip netns exec $ns1 ./pm_nl_ctl limits 0 1
-		ip netns exec $ns2 ./pm_nl_ctl limits 0 1
-		ip netns exec $ns2 ./pm_nl_ctl add 10.0.3.2 flags subflow
-		run_tests $ns1 $ns2 10.0.1.1 0 0 -1 slow
+		ip netns exec $NS1 sysctl -q net.mptcp.pm_type=1
+		ip netns exec $NS2 sysctl -q net.mptcp.pm_type=1
+		ip netns exec $NS1 ./pm_nl_ctl limits 0 1
+		ip netns exec $NS2 ./pm_nl_ctl limits 0 1
+		ip netns exec $NS2 ./pm_nl_ctl add 10.0.3.2 flags subflow
+		run_tests $NS1 $NS2 10.0.1.1 0 0 -1 slow
 		chk_join_nr "userspace pm type prevents rm_addr" 0 0 0
 		chk_rm_nr 0 0
 	fi
@@ -2337,7 +2357,7 @@ usage()
 {
 	if [ -n "${1}" ]; then
 		echo "${1}"
-		ret=1
+		RET=1
 	fi
 
 	echo "mptcp_join usage:"
@@ -2362,19 +2382,19 @@ usage()
 	echo "  -i use ip mptcp"
 	echo "  -h help"
 
-	exit ${ret}
+	exit ${RET}
 }
 
 for arg in "$@"; do
 	# check for "capture/checksum" args before launching tests
 	if [[ "${arg}" =~ ^"-"[0-9a-zA-Z]*"c"[0-9a-zA-Z]*$ ]]; then
-		capture=1
+		CAPTURE=1
 	fi
 	if [[ "${arg}" =~ ^"-"[0-9a-zA-Z]*"C"[0-9a-zA-Z]*$ ]]; then
-		checksum=1
+		CHECKSUM=1
 	fi
 	if [[ "${arg}" =~ ^"-"[0-9a-zA-Z]*"i"[0-9a-zA-Z]*$ ]]; then
-		ip_mptcp=1
+		IP_MPTCP=1
 	fi
 
 	# exception for the capture/checksum/ip_mptcp options, the rest means: a part of the tests
@@ -2385,13 +2405,13 @@ for arg in "$@"; do
 			usage "Unknown option: ${arg}"
 		fi
 	elif ! [[ "${arg}" =~ ^"-"[cCi]+$ ]]; then
-		do_all_tests=0
+		DO_ALL_TESTS=0
 	fi
 done
 
-if [ $do_all_tests -eq 1 ]; then
+if [ $DO_ALL_TESTS -eq 1 ]; then
 	all_tests
-	exit $ret
+	exit $RET
 fi
 
 while getopts 'fesltra64bpkdmuchCSi' opt; do
@@ -2459,4 +2479,4 @@ while getopts 'fesltra64bpkdmuchCSi' opt; do
 	esac
 done
 
-exit $ret
+exit $RET
-- 
2.34.1


^ permalink raw reply related	[flat|nested] 20+ messages in thread

* [PATCH mptcp-next 8/9] selftests: mptcp: join: avoid backquotes
  2022-02-09 21:25 [PATCH mptcp-next 0/9] Refactor mptcp_join.sh Matthieu Baerts
                   ` (6 preceding siblings ...)
  2022-02-09 21:25 ` [PATCH mptcp-next 7/9] selftests: mptcp: join: clarify local/global vars Matthieu Baerts
@ 2022-02-09 21:25 ` Matthieu Baerts
  2022-02-09 21:25 ` [PATCH mptcp-next 9/9] selftests: mptcp: join: make it shellcheck compliant Matthieu Baerts
  2022-02-10  0:22 ` [PATCH mptcp-next 0/9] Refactor mptcp_join.sh Mat Martineau
  9 siblings, 0 replies; 20+ messages in thread
From: Matthieu Baerts @ 2022-02-09 21:25 UTC (permalink / raw)
  To: mptcp; +Cc: Matthieu Baerts

As explained on ShellCheck's wiki [1], it is recommended to avoid
backquotes `...` in favour of parenthesis $(...):

> Backtick command substitution `...` is legacy syntax with several
> issues.
>
> - It has a series of undefined behaviors related to quoting in POSIX.
> - It imposes a custom escaping mode with surprising results.
> - It's exceptionally hard to nest.
>
> $(...) command substitution has none of these problems, and is
> therefore strongly encouraged.

[1] https://www.shellcheck.net/wiki/SC2006

Signed-off-by: Matthieu Baerts <matthieu.baerts@tessares.net>
---
 .../testing/selftests/net/mptcp/mptcp_join.sh | 70 ++++++++++---------
 1 file changed, 36 insertions(+), 34 deletions(-)

diff --git a/tools/testing/selftests/net/mptcp/mptcp_join.sh b/tools/testing/selftests/net/mptcp/mptcp_join.sh
index 15e642e0fa03..c39d5b4e73cb 100755
--- a/tools/testing/selftests/net/mptcp/mptcp_join.sh
+++ b/tools/testing/selftests/net/mptcp/mptcp_join.sh
@@ -75,7 +75,7 @@ init_partial()
 	# ns1eth4    ns2eth4
 
 	local i
-	for i in `seq 1 4`; do
+	for i in $(seq 1 4); do
 		ip link add ns1eth$i netns "$NS1" type veth peer name ns2eth$i netns "$NS2"
 		ip -net "$NS1" addr add 10.0.$i.1/24 dev ns1eth$i
 		ip -net "$NS1" addr add dead:beef:$i::1/64 dev ns1eth$i nodad
@@ -94,7 +94,7 @@ init_partial()
 init_shapers()
 {
 	local i
-	for i in `seq 1 4`; do
+	for i in $(seq 1 4); do
 		tc -n $NS1 qdisc add dev ns1eth$i root netem rate 20mbit delay 1
 		tc -n $NS2 qdisc add dev ns2eth$i root netem rate 20mbit delay 1
 	done
@@ -605,7 +605,7 @@ do_transfer()
 			else
 				addr="10.0.$counter.2"
 			fi
-			pm_nl_add_endpoint $ns2 $addr flags $flags
+			pm_nl_add_endpoint $NS2 $addr flags $flags
 			let counter+=1
 			let add_nr_ns2-=1
 		done
@@ -791,7 +791,7 @@ chk_csum_nr()
 		echo -n "   "
 	fi
 	printf " %-36s %s" "$msg" "sum"
-	count=`ip netns exec $NS1 nstat -as | grep MPTcpExtDataCsumErr | awk '{print $2}'`
+	count=$(ip netns exec $NS1 nstat -as | grep MPTcpExtDataCsumErr | awk '{print $2}')
 	[ -z "$count" ] && count=0
 	if [ "$count" != 0 ]; then
 		echo "[fail] got $count data checksum error[s] expected 0"
@@ -801,7 +801,7 @@ chk_csum_nr()
 		echo -n "[ ok ]"
 	fi
 	echo -n " - csum  "
-	count=`ip netns exec $NS2 nstat -as | grep MPTcpExtDataCsumErr | awk '{print $2}'`
+	count=$(ip netns exec $NS2 nstat -as | grep MPTcpExtDataCsumErr | awk '{print $2}')
 	[ -z "$count" ] && count=0
 	if [ "$count" != 0 ]; then
 		echo "[fail] got $count data checksum error[s] expected 0"
@@ -821,7 +821,7 @@ chk_fail_nr()
 	local dump_stats
 
 	printf "%-${NR_BLANK}s %s" " " "ftx"
-	count=`ip netns exec $NS1 nstat -as | grep MPTcpExtMPFailTx | awk '{print $2}'`
+	count=$(ip netns exec $NS1 nstat -as | grep MPTcpExtMPFailTx | awk '{print $2}')
 	[ -z "$count" ] && count=0
 	if [ "$count" != "$mp_fail_nr_tx" ]; then
 		echo "[fail] got $count MP_FAIL[s] TX expected $mp_fail_nr_tx"
@@ -832,7 +832,7 @@ chk_fail_nr()
 	fi
 
 	echo -n " - frx   "
-	count=`ip netns exec $NS2 nstat -as | grep MPTcpExtMPFailRx | awk '{print $2}'`
+	count=$(ip netns exec $NS2 nstat -as | grep MPTcpExtMPFailRx | awk '{print $2}')
 	[ -z "$count" ] && count=0
 	if [ "$count" != "$mp_fail_nr_rx" ]; then
 		echo "[fail] got $count MP_FAIL[s] RX expected $mp_fail_nr_rx"
@@ -853,7 +853,7 @@ chk_infi_nr()
 	local dump_stats
 
 	printf "%-${NR_BLANK}s %s" " " "itx"
-	count=`ip netns exec $NS2 nstat -as | grep InfiniteMapTx | awk '{print $2}'`
+	count=$(ip netns exec $NS2 nstat -as | grep InfiniteMapTx | awk '{print $2}')
 	[ -z "$count" ] && count=0
 	if [ "$count" != "$mp_infi_nr_tx" ]; then
 		echo "[fail] got $count infinite map[s] TX expected $mp_infi_nr_tx"
@@ -864,7 +864,7 @@ chk_infi_nr()
 	fi
 
 	echo -n " - irx   "
-	count=`ip netns exec $NS1 nstat -as | grep InfiniteMapRx | awk '{print $2}'`
+	count=$(ip netns exec $NS1 nstat -as | grep InfiniteMapRx | awk '{print $2}')
 	[ -z "$count" ] && count=0
 	if [ "$count" != "$mp_infi_nr_rx" ]; then
 		echo "[fail] got $count infinite map[s] RX expected $mp_infi_nr_rx"
@@ -887,7 +887,7 @@ chk_join_nr()
 	local dump_stats
 
 	printf "%03u %-36s %s" "$TEST_COUNT" "$msg" "syn"
-	count=`ip netns exec $NS1 nstat -as | grep MPTcpExtMPJoinSynRx | awk '{print $2}'`
+	count=$(ip netns exec $NS1 nstat -as | grep MPTcpExtMPJoinSynRx | awk '{print $2}')
 	[ -z "$count" ] && count=0
 	if [ "$count" != "$syn_nr" ]; then
 		echo "[fail] got $count JOIN[s] syn expected $syn_nr"
@@ -898,7 +898,7 @@ chk_join_nr()
 	fi
 
 	echo -n " - synack"
-	count=`ip netns exec $NS2 nstat -as | grep MPTcpExtMPJoinSynAckRx | awk '{print $2}'`
+	count=$(ip netns exec $NS2 nstat -as | grep MPTcpExtMPJoinSynAckRx | awk '{print $2}')
 	[ -z "$count" ] && count=0
 	if [ "$count" != "$syn_ack_nr" ]; then
 		echo "[fail] got $count JOIN[s] synack expected $syn_ack_nr"
@@ -909,7 +909,7 @@ chk_join_nr()
 	fi
 
 	echo -n " - ack"
-	count=`ip netns exec $NS1 nstat -as | grep MPTcpExtMPJoinAckRx | awk '{print $2}'`
+	count=$(ip netns exec $NS1 nstat -as | grep MPTcpExtMPJoinAckRx | awk '{print $2}')
 	[ -z "$count" ] && count=0
 	if [ "$count" != "$ack_nr" ]; then
 		echo "[fail] got $count JOIN[s] ack expected $ack_nr"
@@ -942,9 +942,9 @@ chk_stale_nr()
 	local recover_nr
 
 	printf "%-${NR_BLANK}s %-18s" " " "stale"
-	stale_nr=`ip netns exec $ns nstat -as | grep MPTcpExtSubflowStale | awk '{print $2}'`
+	stale_nr=$(ip netns exec $ns nstat -as | grep MPTcpExtSubflowStale | awk '{print $2}')
 	[ -z "$stale_nr" ] && stale_nr=0
-	recover_nr=`ip netns exec $ns nstat -as | grep MPTcpExtSubflowRecover | awk '{print $2}'`
+	recover_nr=$(ip netns exec $ns nstat -as | grep MPTcpExtSubflowRecover | awk '{print $2}')
 	[ -z "$recover_nr" ] && recover_nr=0
 
 	if [ $stale_nr -lt $stale_min ] ||
@@ -980,10 +980,10 @@ chk_add_nr()
 	local dump_stats
 	local timeout
 
-	timeout=`ip netns exec $NS1 sysctl -n net.mptcp.add_addr_timeout`
+	timeout=$(ip netns exec $NS1 sysctl -n net.mptcp.add_addr_timeout)
 
 	printf "%-${NR_BLANK}s %s" " " "add"
-	count=`ip netns exec $NS2 nstat -as MPTcpExtAddAddr | grep MPTcpExtAddAddr | awk '{print $2}'`
+	count=$(ip netns exec $NS2 nstat -as MPTcpExtAddAddr | grep MPTcpExtAddAddr | awk '{print $2}')
 	[ -z "$count" ] && count=0
 
 	# if the test configured a short timeout tolerate greater then expected
@@ -997,7 +997,7 @@ chk_add_nr()
 	fi
 
 	echo -n " - echo  "
-	count=`ip netns exec $NS1 nstat -as | grep MPTcpExtEchoAdd | awk '{print $2}'`
+	count=$(ip netns exec $NS1 nstat -as | grep MPTcpExtEchoAdd | awk '{print $2}')
 	[ -z "$count" ] && count=0
 	if [ "$count" != "$echo_nr" ]; then
 		echo "[fail] got $count ADD_ADDR echo[s] expected $echo_nr"
@@ -1009,7 +1009,7 @@ chk_add_nr()
 
 	if [ $port_nr -gt 0 ]; then
 		echo -n " - pt "
-		count=`ip netns exec $NS2 nstat -as | grep MPTcpExtPortAdd | awk '{print $2}'`
+		count=$(ip netns exec $NS2 nstat -as | grep MPTcpExtPortAdd | awk '{print $2}')
 		[ -z "$count" ] && count=0
 		if [ "$count" != "$port_nr" ]; then
 			echo "[fail] got $count ADD_ADDR[s] with a port-number expected $port_nr"
@@ -1020,8 +1020,8 @@ chk_add_nr()
 		fi
 
 		printf "%-${NR_BLANK}s %s" " " "syn"
-		count=`ip netns exec $NS1 nstat -as | grep MPTcpExtMPJoinPortSynRx |
-			awk '{print $2}'`
+		count=$(ip netns exec $NS1 nstat -as | grep MPTcpExtMPJoinPortSynRx |
+			awk '{print $2}')
 		[ -z "$count" ] && count=0
 		if [ "$count" != "$syn_nr" ]; then
 			echo "[fail] got $count JOIN[s] syn with a different \
@@ -1033,8 +1033,8 @@ chk_add_nr()
 		fi
 
 		echo -n " - synack"
-		count=`ip netns exec $NS2 nstat -as | grep MPTcpExtMPJoinPortSynAckRx |
-			awk '{print $2}'`
+		count=$(ip netns exec $NS2 nstat -as | grep MPTcpExtMPJoinPortSynAckRx |
+			awk '{print $2}')
 		[ -z "$count" ] && count=0
 		if [ "$count" != "$syn_ack_nr" ]; then
 			echo "[fail] got $count JOIN[s] synack with a different \
@@ -1046,8 +1046,8 @@ chk_add_nr()
 		fi
 
 		echo -n " - ack"
-		count=`ip netns exec $NS1 nstat -as | grep MPTcpExtMPJoinPortAckRx |
-			awk '{print $2}'`
+		count=$(ip netns exec $NS1 nstat -as | grep MPTcpExtMPJoinPortAckRx |
+			awk '{print $2}')
 		[ -z "$count" ] && count=0
 		if [ "$count" != "$ack_nr" ]; then
 			echo "[fail] got $count JOIN[s] ack with a different \
@@ -1059,8 +1059,8 @@ chk_add_nr()
 		fi
 
 		printf "%-${NR_BLANK}s %s" " " "syn"
-		count=`ip netns exec $NS1 nstat -as | grep MPTcpExtMismatchPortSynRx |
-			awk '{print $2}'`
+		count=$(ip netns exec $NS1 nstat -as | grep MPTcpExtMismatchPortSynRx |
+			awk '{print $2}')
 		[ -z "$count" ] && count=0
 		if [ "$count" != "$mis_syn_nr" ]; then
 			echo "[fail] got $count JOIN[s] syn with a mismatched \
@@ -1072,8 +1072,8 @@ chk_add_nr()
 		fi
 
 		echo -n " - ack   "
-		count=`ip netns exec $NS1 nstat -as | grep MPTcpExtMismatchPortAckRx |
-			awk '{print $2}'`
+		count=$(ip netns exec $NS1 nstat -as | grep MPTcpExtMismatchPortAckRx |
+			awk '{print $2}')
 		[ -z "$count" ] && count=0
 		if [ "$count" != "$mis_ack_nr" ]; then
 			echo "[fail] got $count JOIN[s] ack with a mismatched \
@@ -1109,7 +1109,7 @@ chk_rm_nr()
 	fi
 
 	printf "%-${NR_BLANK}s %s" " " "rm "
-	count=`ip netns exec $addr_ns nstat -as | grep MPTcpExtRmAddr | awk '{print $2}'`
+	count=$(ip netns exec $addr_ns nstat -as | grep MPTcpExtRmAddr | awk '{print $2}')
 	[ -z "$count" ] && count=0
 	if [ "$count" != "$rm_addr_nr" ]; then
 		echo "[fail] got $count RM_ADDR[s] expected $rm_addr_nr"
@@ -1120,7 +1120,7 @@ chk_rm_nr()
 	fi
 
 	echo -n " - sf    "
-	count=`ip netns exec $subflow_ns nstat -as | grep MPTcpExtRmSubflow | awk '{print $2}'`
+	count=$(ip netns exec $subflow_ns nstat -as | grep MPTcpExtRmSubflow | awk '{print $2}')
 	[ -z "$count" ] && count=0
 	if [ "$count" != "$rm_subflow_nr" ]; then
 		echo "[fail] got $count RM_SUBFLOW[s] expected $rm_subflow_nr"
@@ -1141,7 +1141,7 @@ chk_prio_nr()
 	local dump_stats
 
 	printf "%-${NR_BLANK}s %s" " " "ptx"
-	count=`ip netns exec $NS1 nstat -as | grep MPTcpExtMPPrioTx | awk '{print $2}'`
+	count=$(ip netns exec $NS1 nstat -as | grep MPTcpExtMPPrioTx | awk '{print $2}')
 	[ -z "$count" ] && count=0
 	if [ "$count" != "$mp_prio_nr_tx" ]; then
 		echo "[fail] got $count MP_PRIO[s] TX expected $mp_prio_nr_tx"
@@ -1152,7 +1152,7 @@ chk_prio_nr()
 	fi
 
 	echo -n " - prx   "
-	count=`ip netns exec $NS1 nstat -as | grep MPTcpExtMPPrioRx | awk '{print $2}'`
+	count=$(ip netns exec $NS1 nstat -as | grep MPTcpExtMPPrioRx | awk '{print $2}')
 	[ -z "$count" ] && count=0
 	if [ "$count" != "$mp_prio_nr_rx" ]; then
 		echo "[fail] got $count MP_PRIO[s] RX expected $mp_prio_nr_rx"
@@ -1171,8 +1171,10 @@ chk_link_usage()
 	local link=$2
 	local out=$3
 	local expected_rate=$4
-	local tx_link=`ip netns exec $ns cat /sys/class/net/$link/statistics/tx_bytes`
-	local tx_total=`ls -l $out | awk '{print $5}'`
+
+	local tx_link tx_total
+	tx_link=$(ip netns exec $ns cat /sys/class/net/$link/statistics/tx_bytes)
+	tx_total=$(ls -l $out | awk '{print $5}')
 	local tx_rate=$((tx_link * 100 / $tx_total))
 	local tolerance=5
 
-- 
2.34.1


^ permalink raw reply related	[flat|nested] 20+ messages in thread

* [PATCH mptcp-next 9/9] selftests: mptcp: join: make it shellcheck compliant
  2022-02-09 21:25 [PATCH mptcp-next 0/9] Refactor mptcp_join.sh Matthieu Baerts
                   ` (7 preceding siblings ...)
  2022-02-09 21:25 ` [PATCH mptcp-next 8/9] selftests: mptcp: join: avoid backquotes Matthieu Baerts
@ 2022-02-09 21:25 ` Matthieu Baerts
  2022-02-10  0:22 ` [PATCH mptcp-next 0/9] Refactor mptcp_join.sh Mat Martineau
  9 siblings, 0 replies; 20+ messages in thread
From: Matthieu Baerts @ 2022-02-09 21:25 UTC (permalink / raw)
  To: mptcp; +Cc: Matthieu Baerts

This fixes a few issues reported by ShellCheck:

- SC2068: Double quote array expansions to avoid re-splitting elements.
- SC2206: Quote to prevent word splitting/globbing, or split robustly
          with mapfile or read -a.
- SC2166: Prefer [ p ] && [ q ] as [ p -a q ] is not well defined.
- SC2155: Declare and assign separately to avoid masking return values.
- SC2162: read without -r will mangle backslashes.
- SC2219: Instead of 'let expr', prefer (( expr )) .
- SC2181: Check exit code directly with e.g. 'if mycmd;', not indirectly
          with $?.
- SC2236: Use -n instead of ! -z.
- SC2004: $/${} is unnecessary on arithmetic variables.
- SC2012: Use find instead of ls to better handle non-alphanumeric
          filenames.

SC2086 (Double quotes to prevent globbing and word splitting) is ignored
because it is controlled for the moment and there are too many to
change.

While at it, also fixed two small comments: alignment and missing arg.

Signed-off-by: Matthieu Baerts <matthieu.baerts@tessares.net>
---
 .../testing/selftests/net/mptcp/mptcp_join.sh | 107 +++++++++---------
 1 file changed, 56 insertions(+), 51 deletions(-)

diff --git a/tools/testing/selftests/net/mptcp/mptcp_join.sh b/tools/testing/selftests/net/mptcp/mptcp_join.sh
index c39d5b4e73cb..368819213205 100755
--- a/tools/testing/selftests/net/mptcp/mptcp_join.sh
+++ b/tools/testing/selftests/net/mptcp/mptcp_join.sh
@@ -1,6 +1,11 @@
 #!/bin/bash
 # SPDX-License-Identifier: GPL-2.0
 
+# Double quotes to prevent globbing and word splitting is recommended in new
+# code but we accept it, especially because there were too many before having
+# address all other issues detected by shellcheck.
+#shellcheck disable=SC2086
+
 RET=0
 SIN=""
 SINFAIL=""
@@ -68,7 +73,7 @@ init_partial()
 
 	CHECK_INVERT=0
 
-	#  ns1              ns2
+	#  ns1         ns2
 	# ns1eth1    ns2eth1
 	# ns1eth2    ns2eth2
 	# ns1eth3    ns2eth3
@@ -252,11 +257,10 @@ check_transfer()
 	local in=$1
 	local out=$2
 	local what=$3
+	local i a b
 
-	cmp -l "$in" "$out" | while read line; do
-		local arr=($line)
-
-		let sum=0${arr[1]}+0${arr[2]}
+	cmp -l "$in" "$out" | while read -r i a b; do
+		sum=$((0${a} + 0${b}))
 		if [ $CHECK_INVERT -eq 0 ] || [ $sum -ne $((0xff)) ]; then
 			echo "[ FAIL ] $what does not match (in, out):"
 			print_file_err "$in"
@@ -265,7 +269,7 @@ check_transfer()
 
 			return 1
 		else
-			echo "$what has inverted byte at ${arr[0]}"
+			echo "$what has inverted byte at ${i}"
 		fi
 	done
 
@@ -278,8 +282,7 @@ do_ping()
 	local connector_ns="$2"
 	local connect_addr="$3"
 
-	ip netns exec ${connector_ns} ping -q -c 1 $connect_addr >/dev/null
-	if [ $? -ne 0 ] ; then
+	if ! ip netns exec ${connector_ns} ping -q -c 1 $connect_addr >/dev/null; then
 		echo "$listener_ns -> $connect_addr connectivity [ FAIL ]" 1>&2
 		RET=1
 	fi
@@ -370,26 +373,26 @@ pm_nl_add_endpoint()
 	local nr=2
 	local p
 
-	for p in $@
+	for p in "${@}"
 	do
 		if [ $p = "flags" ]; then
 			eval _flags=\$"$nr"
-			[ ! -z $_flags ]; flags="flags $_flags"
+			[ -n "$_flags" ]; flags="flags $_flags"
 		fi
 		if [ $p = "dev" ]; then
 			eval _dev=\$"$nr"
-			[ ! -z $_dev ]; dev="dev $_dev"
+			[ -n "$_dev" ]; dev="dev $_dev"
 		fi
 		if [ $p = "id" ]; then
 			eval _id=\$"$nr"
-			[ ! -z $_id ]; id="id $_id"
+			[ -n "$_id" ]; id="id $_id"
 		fi
 		if [ $p = "port" ]; then
 			eval _port=\$"$nr"
-			[ ! -z $_port ]; port="port $_port"
+			[ -n "$_port" ]; port="port $_port"
 		fi
 
-		let nr+=1
+		nr=$((nr + 1))
 	done
 
 	if [ $IP_MPTCP -eq 1 ]; then
@@ -536,12 +539,13 @@ do_transfer()
 
 	# let the mptcp subflow be established in background before
 	# do endpoint manipulation
-	[ $addr_nr_ns1 = "0" -a $addr_nr_ns2 = "0" ] || sleep 1
+	if [ $addr_nr_ns1 != "0" ] || [ $addr_nr_ns2 != "0" ]; then
+		sleep 1
+	fi
 
 	if [ $addr_nr_ns1 -gt 0 ]; then
 		local counter=2
-		local add_nr_ns1
-		let add_nr_ns1=addr_nr_ns1
+		local add_nr_ns1=${addr_nr_ns1}
 		while [ $add_nr_ns1 -gt 0 ]; do
 			local addr
 			if is_v6 "${connect_addr}"; then
@@ -550,20 +554,20 @@ do_transfer()
 				addr="10.0.$counter.1"
 			fi
 			pm_nl_add_endpoint $NS1 $addr flags signal
-			let counter+=1
-			let add_nr_ns1-=1
+			counter=$((counter + 1))
+			add_nr_ns1=$((add_nr_ns1 - 1))
 		done
 	elif [ $addr_nr_ns1 -lt 0 ]; then
-		local rm_nr_ns1
-		let rm_nr_ns1=-addr_nr_ns1
+		local rm_nr_ns1=$((-addr_nr_ns1))
 		if [ $rm_nr_ns1 -lt 8 ]; then
 			local counter=0
-			pm_nl_show_endpoints ${listener_ns} | while read line; do
+			pm_nl_show_endpoints ${listener_ns} | while read -r line; do
+				# shellcheck disable=SC2206
 				local arr=($line)
 				local nr=0
 
 				local i
-				for i in ${arr[@]}; do
+				for i in "${arr[@]}"; do
 					if [ $i = "id" ]; then
 						if [ $counter -eq $rm_nr_ns1 ]; then
 							break
@@ -572,9 +576,9 @@ do_transfer()
 						rm_addr=$(rm_addr_count ${connector_ns})
 						pm_nl_del_endpoint ${listener_ns} $id
 						wait_rm_addr ${connector_ns} ${rm_addr}
-						let counter+=1
+						counter=$((counter + 1))
 					fi
-					let nr+=1
+					nr=$((nr + 1))
 				done
 			done
 		elif [ $rm_nr_ns1 -eq 8 ]; then
@@ -592,11 +596,10 @@ do_transfer()
 
 	# if newly added endpoints must be deleted, give the background msk
 	# some time to created them
-	[ $addr_nr_ns1 -gt 0 -a $addr_nr_ns2 -lt 0 ] && sleep 1
+	[ $addr_nr_ns1 -gt 0 ] && [ $addr_nr_ns2 -lt 0 ] && sleep 1
 
 	if [ $addr_nr_ns2 -gt 0 ]; then
-		local add_nr_ns2
-		let add_nr_ns2=addr_nr_ns2
+		local add_nr_ns2=${addr_nr_ns2}
 		local counter=3
 		while [ $add_nr_ns2 -gt 0 ]; do
 			local addr
@@ -606,19 +609,20 @@ do_transfer()
 				addr="10.0.$counter.2"
 			fi
 			pm_nl_add_endpoint $NS2 $addr flags $flags
-			let counter+=1
-			let add_nr_ns2-=1
+			counter=$((counter + 1))
+			add_nr_ns2=$((add_nr_ns2 - 1))
 		done
 	elif [ $addr_nr_ns2 -lt 0 ]; then
-		local rm_nr_ns2
+		local rm_nr_ns2=$((-addr_nr_ns2))
 		if [ $rm_nr_ns2 -lt 8 ]; then
 			local counter=0
-			pm_nl_show_endpoints ${connector_ns} | while read line; do
+			pm_nl_show_endpoints ${connector_ns} | while read -r line; do
+				# shellcheck disable=SC2206
 				local arr=($line)
 				local nr=0
 				local i
 
-				for i in ${arr[@]}; do
+				for i in "${arr[@]}"; do
 					if [ $i = "id" ]; then
 						if [ $counter -eq $rm_nr_ns2 ]; then
 							break
@@ -630,9 +634,9 @@ do_transfer()
 						rm_addr=$(rm_addr_count ${listener_ns})
 						pm_nl_del_endpoint ${connector_ns} $id
 						wait_rm_addr ${listener_ns} ${rm_addr}
-						let counter+=1
+						counter=$((counter + 1))
 					fi
-					let nr+=1
+					nr=$((nr + 1))
 				done
 			done
 		elif [ $rm_nr_ns2 -eq 8 ]; then
@@ -648,19 +652,20 @@ do_transfer()
 		fi
 	fi
 
-	if [ ! -z $sflags ]; then
+	if [ -n "${sflags}" ]; then
 		sleep 1
 		for netns in "$NS1" "$NS2"; do
-			pm_nl_show_endpoints $netns | while read line; do
+			pm_nl_show_endpoints $netns | while read -r line; do
+				# shellcheck disable=SC2206
 				local arr=($line)
 				local nr=0
 				local id
 
-				for i in ${arr[@]}; do
+				for i in "${arr[@]}"; do
 					if [ $i = "id" ]; then
 						id=${arr[$nr+1]}
 					fi
-					let nr+=1
+					nr=$((nr + 1))
 				done
 				pm_nl_change_endpoint $netns $id $sflags
 			done
@@ -745,20 +750,20 @@ run_tests()
 
 	# create the input file for the failure test when
 	# the first failure test run
-	if [ "$test_linkfail" -ne 0 -a -z "$CINFAIL" ]; then
+	if [ "$test_linkfail" -ne 0 ] && [ -z "$CINFAIL" ]; then
 		# the client file must be considerably larger
 		# of the maximum expected cwin value, or the
 		# link utilization will be not predicable
 		size=$((RANDOM%2))
 		size=$((size+1))
 		size=$((size*8192))
-		size=$((size + ( $RANDOM % 8192) ))
+		size=$((size + ( RANDOM % 8192) ))
 
 		CINFAIL=$(mktemp)
 		make_file "$CINFAIL" "client" $size
 	fi
 
-	if [ "$test_linkfail" -eq 2 -a -z "$SINFAIL" ]; then
+	if [ "$test_linkfail" -eq 2 ] && [ -z "$SINFAIL" ]; then
 		size=$((RANDOM%16))
 		size=$((size+1))
 		size=$((size*2048))
@@ -785,7 +790,7 @@ chk_csum_nr()
 	local count
 	local dump_stats
 
-	if [ ! -z "$msg" ]; then
+	if [ -n "$msg" ]; then
 		printf "%03u" "$TEST_COUNT"
 	else
 		echo -n "   "
@@ -948,8 +953,8 @@ chk_stale_nr()
 	[ -z "$recover_nr" ] && recover_nr=0
 
 	if [ $stale_nr -lt $stale_min ] ||
-	   [ $stale_max -gt 0 -a $stale_nr -gt $stale_max ] ||
-	   [ $((stale_nr - $recover_nr)) -ne $stale_delta ]; then
+	   { [ $stale_max -gt 0 ] && [ $stale_nr -gt $stale_max ]; } ||
+	   [ $((stale_nr - recover_nr)) -ne $stale_delta ]; then
 		echo "[fail] got $stale_nr stale[s] $recover_nr recover[s], " \
 		     " expected stale in range [$stale_min..$stale_max]," \
 		     " stale-recover delta $stale_delta "
@@ -988,7 +993,7 @@ chk_add_nr()
 
 	# if the test configured a short timeout tolerate greater then expected
 	# add addrs options, due to retransmissions
-	if [ "$count" != "$add_nr" ] && [ "$timeout" -gt 1 -o "$count" -lt "$add_nr" ]; then
+	if [ "$count" != "$add_nr" ] && { [ "$timeout" -gt 1 ] || [ "$count" -lt "$add_nr" ]; }; then
 		echo "[fail] got $count ADD_ADDR[s] expected $add_nr"
 		RET=1
 		dump_stats=1
@@ -1174,13 +1179,13 @@ chk_link_usage()
 
 	local tx_link tx_total
 	tx_link=$(ip netns exec $ns cat /sys/class/net/$link/statistics/tx_bytes)
-	tx_total=$(ls -l $out | awk '{print $5}')
-	local tx_rate=$((tx_link * 100 / $tx_total))
+	tx_total=$(stat --format=%s $out)
+	local tx_rate=$((tx_link * 100 / tx_total))
 	local tolerance=5
 
 	printf "%-${NR_BLANK}s %-18s" " " "link usage"
-	if [ $tx_rate -lt $((expected_rate - $tolerance)) -o \
-	     $tx_rate -gt $((expected_rate + $tolerance)) ]; then
+	if [ $tx_rate -lt $((expected_rate - tolerance)) ] || \
+	   [ $tx_rate -gt $((expected_rate + tolerance)) ]; then
 		echo "[fail] got $tx_rate% usage, expected $expected_rate%"
 		RET=1
 	else
@@ -2388,7 +2393,7 @@ usage()
 }
 
 for arg in "$@"; do
-	# check for "capture/checksum" args before launching tests
+	# check for "capture/checksum/ip_mptcp" args before launching tests
 	if [[ "${arg}" =~ ^"-"[0-9a-zA-Z]*"c"[0-9a-zA-Z]*$ ]]; then
 		CAPTURE=1
 	fi
-- 
2.34.1


^ permalink raw reply related	[flat|nested] 20+ messages in thread

* Re: [PATCH mptcp-next 0/9] Refactor mptcp_join.sh
  2022-02-09 21:25 [PATCH mptcp-next 0/9] Refactor mptcp_join.sh Matthieu Baerts
                   ` (8 preceding siblings ...)
  2022-02-09 21:25 ` [PATCH mptcp-next 9/9] selftests: mptcp: join: make it shellcheck compliant Matthieu Baerts
@ 2022-02-10  0:22 ` Mat Martineau
  2022-02-11 17:34   ` Matthieu Baerts
  9 siblings, 1 reply; 20+ messages in thread
From: Mat Martineau @ 2022-02-10  0:22 UTC (permalink / raw)
  To: Matthieu Baerts; +Cc: mptcp

On Wed, 9 Feb 2022, Matthieu Baerts wrote:

> I started this series to be able to launch a specific test without
> having to modify the script to comment tests from the subgroup I didn't
> want to validate when trying to reproduce a specific issue in a loop.
> That's what we can find in patch 3/9.
>
> While at it, I:
> - fixed one issue with the options (patch 1/9)
> - stop if an option doesn't exist (patch 2/9)
> - removed unused vars (patch 4/9)
> - delay some actions to the first test not to do them if no test is
>  launched (patches 5-6/9)
>
> But after having seen all modified lines, why stopping there? So I:
> - clarify local vs global variables to avoid Bash's classical pitfall
>  (patch 7/9)
> - fixed all issues reported by ShellCheck except one (patch 8-9/9)
>
> These last 3 patches (+ patch 3/9) will create a lot of conflicts. If
> we are OK with them, probably best not to wait to long before applying
> them to avoid big rebases.

I think 1, 2, 4, 5, and 6 look good for the export branch now:

Reviewed-by: Mat Martineau <mathew.j.martineau@linux.intel.com>

I don't have changes to suggest for 7-9, but I think it's worth talking 
about how to manage conflicts considering the scope of those. I think it 
would make sense to send those to net-next fairly late in the development 
cycle, to avoid net/net-next conflicts if we send mptcp_join.sh fixes to 
-net.

To deal with that, I see a couple of options:

1. Keep these at the end of the topgit queue to help with that, but that 
makes it harder to send other mptcp_join.sh patches for mptcp-net or 
mptcp-next.

2. You update them out-of-tree until close to the 5.17 release

What do you think? Might be a good meeting topic too.


I have some other questions I'll ask in a patch 3 reply.


>
> For the patches that are already in review, I can fix the conflicts when
> applying them.
>
> Matthieu Baerts (9):
>  selftests: mptcp: join: allow running -cCi
>  selftests: mptcp: join: exit after printing usage
>  selftests: mptcp: join: option to execute specific tests
>  selftests: mptcp: join: remove unused vars
>  selftests: mptcp: join: create tmp files only if needed
>  selftests: mptcp: join: check for tools only if needed
>  selftests: mptcp: join: clarify local/global vars
>  selftests: mptcp: join: avoid backquotes
>  selftests: mptcp: join: make it shellcheck compliant
>
> .../testing/selftests/net/mptcp/mptcp_join.sh | 2342 +++++++++--------
> 1 file changed, 1257 insertions(+), 1085 deletions(-)
>
> -- 
> 2.34.1

--
Mat Martineau
Intel

^ permalink raw reply	[flat|nested] 20+ messages in thread

* Re: [PATCH mptcp-next 3/9] selftests: mptcp: join: option to execute specific tests
  2022-02-09 21:25 ` [PATCH mptcp-next 3/9] selftests: mptcp: join: option to execute specific tests Matthieu Baerts
@ 2022-02-10  0:36   ` Mat Martineau
  2022-02-10 10:04     ` Paolo Abeni
  0 siblings, 1 reply; 20+ messages in thread
From: Mat Martineau @ 2022-02-10  0:36 UTC (permalink / raw)
  To: Matthieu Baerts; +Cc: mptcp, Paolo Abeni

On Wed, 9 Feb 2022, Matthieu Baerts wrote:

> Often, it is needed to run one specific test.
>
> There are options to run subgroups of tests but when only one fails, no
> need to run all the subgroup. So far, the solution was to edit the
> script to comment the tests that are not needed but that's not ideal.
>
> Now, it is possible to run one specific test by giving the ID of the
> tests that are going to be validated, e.g.
>
>  ./mptcp_join.sh 36 37
>
> This is cleaner and saves time.
>
> Technically, the reset* functions now return 0 if the test can be
> executed. This naturally creates sections per test in the code which is
> also helpful to understand what a test is exactly doing.
>

My sense is that this is primarily for development purposes since the test 
numbers may shift as tests are added or modified. Is it worth the churn 
when we have the subgroup functionality and could comment out chunks of 
the test script that are not useful for running specific tests in a loop?

I'm not set against this change, but hoping to discuss it some more to 
both understand the benefits (I assume for running CI in a loop?) and to 
see if anyone has bright ideas for avoiding the whitespace churn.

("Include a bash fork in our selftest code that implements 'goto'" seems 
like overkill :) )


-Mat


> Suggested-by: Paolo Abeni <pabeni@redhat.com>
> Signed-off-by: Matthieu Baerts <matthieu.baerts@tessares.net>
> ---
> .../testing/selftests/net/mptcp/mptcp_join.sh | 1676 +++++++++--------
> 1 file changed, 900 insertions(+), 776 deletions(-)
>
> diff --git a/tools/testing/selftests/net/mptcp/mptcp_join.sh b/tools/testing/selftests/net/mptcp/mptcp_join.sh
> index 327f4ace5153..2dc81646e326 100755
> --- a/tools/testing/selftests/net/mptcp/mptcp_join.sh
> +++ b/tools/testing/selftests/net/mptcp/mptcp_join.sh
> @@ -20,6 +20,7 @@ check_invert=0
> do_all_tests=1
>
> TEST_COUNT=0
> +ONLY_TESTS=()
> nr_blank=40
>
> # generated using "nfbpf_compile '(ip && (ip[54] & 0xf0) == 0x30) ||
> @@ -110,15 +111,40 @@ cleanup()
> 	cleanup_partial
> }
>
> +skip_test()
> +{
> +	local i
> +
> +	if [ "${#ONLY_TESTS[@]}" -eq 0 ]; then
> +		return 1
> +	fi
> +
> +	for i in "${ONLY_TESTS[@]}"; do
> +		if [ "${TEST_COUNT}" -eq "${i}" ]; then
> +			return 1
> +		fi
> +	done
> +
> +	return 0
> +}
> +
> reset()
> {
> +	TEST_COUNT=$((TEST_COUNT+1))
> +
> +	if skip_test; then
> +		return 1
> +	fi
> +
> 	cleanup_partial
> 	init
> +
> +	return 0
> }
>
> reset_with_cookies()
> {
> -	reset
> +	reset || return 1
>
> 	for netns in "$ns1" "$ns2";do
> 		ip netns exec $netns sysctl -q net.ipv4.tcp_syncookies=2
> @@ -135,7 +161,7 @@ reset_with_add_addr_timeout()
> 		tables="ip6tables"
> 	fi
>
> -	reset
> +	reset || return 1
>
> 	ip netns exec $ns1 sysctl -q net.mptcp.add_addr_timeout=1
> 	ip netns exec $ns2 $tables -A OUTPUT -p tcp \
> @@ -150,7 +176,7 @@ reset_with_checksum()
> 	local ns1_enable=$1
> 	local ns2_enable=$2
>
> -	reset
> +	reset || return 1
>
> 	ip netns exec $ns1 sysctl -q net.mptcp.checksum_enabled=$ns1_enable
> 	ip netns exec $ns2 sysctl -q net.mptcp.checksum_enabled=$ns2_enable
> @@ -161,7 +187,7 @@ reset_with_allow_join_id0()
> 	local ns1_enable=$1
> 	local ns2_enable=$2
>
> -	reset
> +	reset || return 1
>
> 	ip netns exec $ns1 sysctl -q net.mptcp.allow_join_initial_addr_port=$ns1_enable
> 	ip netns exec $ns2 sysctl -q net.mptcp.allow_join_initial_addr_port=$ns2_enable
> @@ -403,8 +429,7 @@ do_transfer()
> 	speed="$9"
> 	sflags="${10}"
>
> -	port=$((10000+$TEST_COUNT))
> -	TEST_COUNT=$((TEST_COUNT+1))
> +	port=$((10000+$TEST_COUNT-1))
>
> 	:> "$cout"
> 	:> "$sout"
> @@ -1141,888 +1166,967 @@ wait_attempt_fail()
>
> subflows_tests()
> {
> -	reset
> -	run_tests $ns1 $ns2 10.0.1.1
> -	chk_join_nr "no JOIN" "0" "0" "0"
> +	if reset; then
> +		run_tests $ns1 $ns2 10.0.1.1
> +		chk_join_nr "no JOIN" "0" "0" "0"
> +	fi
>
> 	# subflow limited by client
> -	reset
> -	pm_nl_set_limits $ns1 0 0
> -	pm_nl_set_limits $ns2 0 0
> -	pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow
> -	run_tests $ns1 $ns2 10.0.1.1
> -	chk_join_nr "single subflow, limited by client" 0 0 0
> +	if reset; then
> +		pm_nl_set_limits $ns1 0 0
> +		pm_nl_set_limits $ns2 0 0
> +		pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow
> +		run_tests $ns1 $ns2 10.0.1.1
> +		chk_join_nr "single subflow, limited by client" 0 0 0
> +	fi
>
> 	# subflow limited by server
> -	reset
> -	pm_nl_set_limits $ns1 0 0
> -	pm_nl_set_limits $ns2 0 1
> -	pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow
> -	run_tests $ns1 $ns2 10.0.1.1
> -	chk_join_nr "single subflow, limited by server" 1 1 0
> +	if reset; then
> +		pm_nl_set_limits $ns1 0 0
> +		pm_nl_set_limits $ns2 0 1
> +		pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow
> +		run_tests $ns1 $ns2 10.0.1.1
> +		chk_join_nr "single subflow, limited by server" 1 1 0
> +	fi
>
> 	# subflow
> -	reset
> -	pm_nl_set_limits $ns1 0 1
> -	pm_nl_set_limits $ns2 0 1
> -	pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow
> -	run_tests $ns1 $ns2 10.0.1.1
> -	chk_join_nr "single subflow" 1 1 1
> +	if reset; then
> +		pm_nl_set_limits $ns1 0 1
> +		pm_nl_set_limits $ns2 0 1
> +		pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow
> +		run_tests $ns1 $ns2 10.0.1.1
> +		chk_join_nr "single subflow" 1 1 1
> +	fi
>
> 	# multiple subflows
> -	reset
> -	pm_nl_set_limits $ns1 0 2
> -	pm_nl_set_limits $ns2 0 2
> -	pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow
> -	pm_nl_add_endpoint $ns2 10.0.2.2 flags subflow
> -	run_tests $ns1 $ns2 10.0.1.1
> -	chk_join_nr "multiple subflows" 2 2 2
> +	if reset; then
> +		pm_nl_set_limits $ns1 0 2
> +		pm_nl_set_limits $ns2 0 2
> +		pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow
> +		pm_nl_add_endpoint $ns2 10.0.2.2 flags subflow
> +		run_tests $ns1 $ns2 10.0.1.1
> +		chk_join_nr "multiple subflows" 2 2 2
> +	fi
>
> 	# multiple subflows limited by server
> -	reset
> -	pm_nl_set_limits $ns1 0 1
> -	pm_nl_set_limits $ns2 0 2
> -	pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow
> -	pm_nl_add_endpoint $ns2 10.0.2.2 flags subflow
> -	run_tests $ns1 $ns2 10.0.1.1
> -	chk_join_nr "multiple subflows, limited by server" 2 2 1
> +	if reset; then
> +		pm_nl_set_limits $ns1 0 1
> +		pm_nl_set_limits $ns2 0 2
> +		pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow
> +		pm_nl_add_endpoint $ns2 10.0.2.2 flags subflow
> +		run_tests $ns1 $ns2 10.0.1.1
> +		chk_join_nr "multiple subflows, limited by server" 2 2 1
> +	fi
>
> 	# single subflow, dev
> -	reset
> -	pm_nl_set_limits $ns1 0 1
> -	pm_nl_set_limits $ns2 0 1
> -	pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow dev ns2eth3
> -	run_tests $ns1 $ns2 10.0.1.1
> -	chk_join_nr "single subflow, dev" 1 1 1
> +	if reset; then
> +		pm_nl_set_limits $ns1 0 1
> +		pm_nl_set_limits $ns2 0 1
> +		pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow dev ns2eth3
> +		run_tests $ns1 $ns2 10.0.1.1
> +		chk_join_nr "single subflow, dev" 1 1 1
> +	fi
> }
>
> subflows_error_tests()
> {
> 	# If a single subflow is configured, and matches the MPC src
> 	# address, no additional subflow should be created
> -	reset
> -	pm_nl_set_limits $ns1 0 1
> -	pm_nl_set_limits $ns2 0 1
> -	pm_nl_add_endpoint $ns2 10.0.1.2 flags subflow
> -	run_tests $ns1 $ns2 10.0.1.1 0 0 0 slow
> -	chk_join_nr "no MPC reuse with single endpoint" 0 0 0
> +	if reset; then
> +		pm_nl_set_limits $ns1 0 1
> +		pm_nl_set_limits $ns2 0 1
> +		pm_nl_add_endpoint $ns2 10.0.1.2 flags subflow
> +		run_tests $ns1 $ns2 10.0.1.1 0 0 0 slow
> +		chk_join_nr "no MPC reuse with single endpoint" 0 0 0
> +	fi
>
> 	# multiple subflows, with subflow creation error
> -	reset
> -	pm_nl_set_limits $ns1 0 2
> -	pm_nl_set_limits $ns2 0 2
> -	pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow
> -	pm_nl_add_endpoint $ns2 10.0.2.2 flags subflow
> -	ip netns exec $ns1 iptables -A INPUT -s 10.0.3.2 -p tcp -j REJECT
> -	run_tests $ns1 $ns2 10.0.1.1 0 0 0 slow
> -	chk_join_nr "multi subflows, with failing subflow" 1 1 1
> +	if reset; then
> +		pm_nl_set_limits $ns1 0 2
> +		pm_nl_set_limits $ns2 0 2
> +		pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow
> +		pm_nl_add_endpoint $ns2 10.0.2.2 flags subflow
> +		ip netns exec $ns1 iptables -A INPUT -s 10.0.3.2 -p tcp -j REJECT
> +		run_tests $ns1 $ns2 10.0.1.1 0 0 0 slow
> +		chk_join_nr "multi subflows, with failing subflow" 1 1 1
> +	fi
>
> 	# multiple subflows, with subflow timeout on MPJ
> -	reset
> -	pm_nl_set_limits $ns1 0 2
> -	pm_nl_set_limits $ns2 0 2
> -	pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow
> -	pm_nl_add_endpoint $ns2 10.0.2.2 flags subflow
> -	ip netns exec $ns1 iptables -A INPUT -s 10.0.3.2 -p tcp -j DROP
> -	run_tests $ns1 $ns2 10.0.1.1 0 0 0 slow
> -	chk_join_nr "multi subflows, with subflow timeout" 1 1 1
> +	if reset; then
> +		pm_nl_set_limits $ns1 0 2
> +		pm_nl_set_limits $ns2 0 2
> +		pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow
> +		pm_nl_add_endpoint $ns2 10.0.2.2 flags subflow
> +		ip netns exec $ns1 iptables -A INPUT -s 10.0.3.2 -p tcp -j DROP
> +		run_tests $ns1 $ns2 10.0.1.1 0 0 0 slow
> +		chk_join_nr "multi subflows, with subflow timeout" 1 1 1
> +	fi
>
> 	# multiple subflows, check that the endpoint corresponding to
> 	# closed subflow (due to reset) is not reused if additional
> 	# subflows are added later
> -	reset
> -	pm_nl_set_limits $ns1 0 1
> -	pm_nl_set_limits $ns2 0 1
> -	pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow
> -	ip netns exec $ns1 iptables -A INPUT -s 10.0.3.2 -p tcp -j REJECT
> -	run_tests $ns1 $ns2 10.0.1.1 0 0 0 slow &
> -
> -	# updates in the child shell do not have any effect here, we
> -	# need to bump the test counter for the above case
> -	TEST_COUNT=$((TEST_COUNT+1))
> -
> -	# mpj subflow will be in TW after the reset
> -	wait_attempt_fail $ns2
> -	pm_nl_add_endpoint $ns2 10.0.2.2 flags subflow
> -	wait
> -
> -	# additional subflow could be created only if the PM select
> -	# the later endpoint, skipping the already used one
> -	chk_join_nr "multi subflows, fair usage on close" 1 1 1
> +	if reset; then
> +		pm_nl_set_limits $ns1 0 1
> +		pm_nl_set_limits $ns2 0 1
> +		pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow
> +		ip netns exec $ns1 iptables -A INPUT -s 10.0.3.2 -p tcp -j REJECT
> +		run_tests $ns1 $ns2 10.0.1.1 0 0 0 slow &
> +
> +		# mpj subflow will be in TW after the reset
> +		wait_attempt_fail $ns2
> +		pm_nl_add_endpoint $ns2 10.0.2.2 flags subflow
> +		wait
> +
> +		# additional subflow could be created only if the PM select
> +		# the later endpoint, skipping the already used one
> +		chk_join_nr "multi subflows, fair usage on close" 1 1 1
> +	fi
> }
>
> signal_address_tests()
> {
> 	# add_address, unused
> -	reset
> -	pm_nl_add_endpoint $ns1 10.0.2.1 flags signal
> -	run_tests $ns1 $ns2 10.0.1.1
> -	chk_join_nr "unused signal address" 0 0 0
> -	chk_add_nr 1 1
> +	if reset; then
> +		pm_nl_add_endpoint $ns1 10.0.2.1 flags signal
> +		run_tests $ns1 $ns2 10.0.1.1
> +		chk_join_nr "unused signal address" 0 0 0
> +		chk_add_nr 1 1
> +	fi
>
> 	# accept and use add_addr
> -	reset
> -	pm_nl_set_limits $ns1 0 1
> -	pm_nl_set_limits $ns2 1 1
> -	pm_nl_add_endpoint $ns1 10.0.2.1 flags signal
> -	run_tests $ns1 $ns2 10.0.1.1
> -	chk_join_nr "signal address" 1 1 1
> -	chk_add_nr 1 1
> +	if reset; then
> +		pm_nl_set_limits $ns1 0 1
> +		pm_nl_set_limits $ns2 1 1
> +		pm_nl_add_endpoint $ns1 10.0.2.1 flags signal
> +		run_tests $ns1 $ns2 10.0.1.1
> +		chk_join_nr "signal address" 1 1 1
> +		chk_add_nr 1 1
> +	fi
>
> 	# accept and use add_addr with an additional subflow
> 	# note: signal address in server ns and local addresses in client ns must
> 	# belong to different subnets or one of the listed local address could be
> 	# used for 'add_addr' subflow
> -	reset
> -	pm_nl_add_endpoint $ns1 10.0.2.1 flags signal
> -	pm_nl_set_limits $ns1 0 2
> -	pm_nl_set_limits $ns2 1 2
> -	pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow
> -	run_tests $ns1 $ns2 10.0.1.1
> -	chk_join_nr "subflow and signal" 2 2 2
> -	chk_add_nr 1 1
> +	if reset; then
> +		pm_nl_add_endpoint $ns1 10.0.2.1 flags signal
> +		pm_nl_set_limits $ns1 0 2
> +		pm_nl_set_limits $ns2 1 2
> +		pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow
> +		run_tests $ns1 $ns2 10.0.1.1
> +		chk_join_nr "subflow and signal" 2 2 2
> +		chk_add_nr 1 1
> +	fi
>
> 	# accept and use add_addr with additional subflows
> -	reset
> -	pm_nl_set_limits $ns1 0 3
> -	pm_nl_add_endpoint $ns1 10.0.2.1 flags signal
> -	pm_nl_set_limits $ns2 1 3
> -	pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow
> -	pm_nl_add_endpoint $ns2 10.0.4.2 flags subflow
> -	run_tests $ns1 $ns2 10.0.1.1
> -	chk_join_nr "multiple subflows and signal" 3 3 3
> -	chk_add_nr 1 1
> +	if reset; then
> +		pm_nl_set_limits $ns1 0 3
> +		pm_nl_add_endpoint $ns1 10.0.2.1 flags signal
> +		pm_nl_set_limits $ns2 1 3
> +		pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow
> +		pm_nl_add_endpoint $ns2 10.0.4.2 flags subflow
> +		run_tests $ns1 $ns2 10.0.1.1
> +		chk_join_nr "multiple subflows and signal" 3 3 3
> +		chk_add_nr 1 1
> +	fi
>
> 	# signal addresses
> -	reset
> -	pm_nl_set_limits $ns1 3 3
> -	pm_nl_add_endpoint $ns1 10.0.2.1 flags signal
> -	pm_nl_add_endpoint $ns1 10.0.3.1 flags signal
> -	pm_nl_add_endpoint $ns1 10.0.4.1 flags signal
> -	pm_nl_set_limits $ns2 3 3
> -	run_tests $ns1 $ns2 10.0.1.1
> -	chk_join_nr "signal addresses" 3 3 3
> -	chk_add_nr 3 3
> +	if reset; then
> +		pm_nl_set_limits $ns1 3 3
> +		pm_nl_add_endpoint $ns1 10.0.2.1 flags signal
> +		pm_nl_add_endpoint $ns1 10.0.3.1 flags signal
> +		pm_nl_add_endpoint $ns1 10.0.4.1 flags signal
> +		pm_nl_set_limits $ns2 3 3
> +		run_tests $ns1 $ns2 10.0.1.1
> +		chk_join_nr "signal addresses" 3 3 3
> +		chk_add_nr 3 3
> +	fi
>
> 	# signal invalid addresses
> -	reset
> -	pm_nl_set_limits $ns1 3 3
> -	pm_nl_add_endpoint $ns1 10.0.12.1 flags signal
> -	pm_nl_add_endpoint $ns1 10.0.3.1 flags signal
> -	pm_nl_add_endpoint $ns1 10.0.14.1 flags signal
> -	pm_nl_set_limits $ns2 3 3
> -	run_tests $ns1 $ns2 10.0.1.1
> -	chk_join_nr "signal invalid addresses" 1 1 1
> -	chk_add_nr 3 3
> +	if reset; then
> +		pm_nl_set_limits $ns1 3 3
> +		pm_nl_add_endpoint $ns1 10.0.12.1 flags signal
> +		pm_nl_add_endpoint $ns1 10.0.3.1 flags signal
> +		pm_nl_add_endpoint $ns1 10.0.14.1 flags signal
> +		pm_nl_set_limits $ns2 3 3
> +		run_tests $ns1 $ns2 10.0.1.1
> +		chk_join_nr "signal invalid addresses" 1 1 1
> +		chk_add_nr 3 3
> +	fi
>
> 	# signal addresses race test
> -	reset
> -
> -	pm_nl_set_limits $ns1 4 4
> -	pm_nl_set_limits $ns2 4 4
> -	pm_nl_add_endpoint $ns1 10.0.1.1 flags signal
> -	pm_nl_add_endpoint $ns1 10.0.2.1 flags signal
> -	pm_nl_add_endpoint $ns1 10.0.3.1 flags signal
> -	pm_nl_add_endpoint $ns1 10.0.4.1 flags signal
> -	pm_nl_add_endpoint $ns2 10.0.1.2 flags signal
> -	pm_nl_add_endpoint $ns2 10.0.2.2 flags signal
> -	pm_nl_add_endpoint $ns2 10.0.3.2 flags signal
> -	pm_nl_add_endpoint $ns2 10.0.4.2 flags signal
> -
> -	# the peer could possibly miss some addr notification, allow retransmission
> -	ip netns exec $ns1 sysctl -q net.mptcp.add_addr_timeout=1
> -	run_tests $ns1 $ns2 10.0.1.1 0 0 0 slow
> -	chk_join_nr "signal addresses race test" 3 3 3
> -
> -	# the server will not signal the address terminating
> -	# the MPC subflow
> -	chk_add_nr 3 3
> +	if reset; then
> +		pm_nl_set_limits $ns1 4 4
> +		pm_nl_set_limits $ns2 4 4
> +		pm_nl_add_endpoint $ns1 10.0.1.1 flags signal
> +		pm_nl_add_endpoint $ns1 10.0.2.1 flags signal
> +		pm_nl_add_endpoint $ns1 10.0.3.1 flags signal
> +		pm_nl_add_endpoint $ns1 10.0.4.1 flags signal
> +		pm_nl_add_endpoint $ns2 10.0.1.2 flags signal
> +		pm_nl_add_endpoint $ns2 10.0.2.2 flags signal
> +		pm_nl_add_endpoint $ns2 10.0.3.2 flags signal
> +		pm_nl_add_endpoint $ns2 10.0.4.2 flags signal
> +
> +		# the peer could possibly miss some addr notification, allow retransmission
> +		ip netns exec $ns1 sysctl -q net.mptcp.add_addr_timeout=1
> +		run_tests $ns1 $ns2 10.0.1.1 0 0 0 slow
> +		chk_join_nr "signal addresses race test" 3 3 3
> +
> +		# the server will not signal the address terminating
> +		# the MPC subflow
> +		chk_add_nr 3 3
> +	fi
> }
>
> link_failure_tests()
> {
> 	# accept and use add_addr with additional subflows and link loss
> -	reset
> -
> -	# without any b/w limit each veth could spool the packets and get
> -	# them acked at xmit time, so that the corresponding subflow will
> -	# have almost always no outstanding pkts, the scheduler will pick
> -	# always the first subflow and we will have hard time testing
> -	# active backup and link switch-over.
> -	# Let's set some arbitrary (low) virtual link limits.
> -	init_shapers
> -	pm_nl_set_limits $ns1 0 3
> -	pm_nl_add_endpoint $ns1 10.0.2.1 dev ns1eth2 flags signal
> -	pm_nl_set_limits $ns2 1 3
> -	pm_nl_add_endpoint $ns2 10.0.3.2 dev ns2eth3 flags subflow
> -	pm_nl_add_endpoint $ns2 10.0.4.2 dev ns2eth4 flags subflow
> -	run_tests $ns1 $ns2 10.0.1.1 1
> -	chk_join_nr "multiple flows, signal, link failure" 3 3 3
> -	chk_add_nr 1 1
> -	chk_stale_nr $ns2 1 5 1
> +	if reset; then
> +		# without any b/w limit each veth could spool the packets and get
> +		# them acked at xmit time, so that the corresponding subflow will
> +		# have almost always no outstanding pkts, the scheduler will pick
> +		# always the first subflow and we will have hard time testing
> +		# active backup and link switch-over.
> +		# Let's set some arbitrary (low) virtual link limits.
> +		init_shapers
> +		pm_nl_set_limits $ns1 0 3
> +		pm_nl_add_endpoint $ns1 10.0.2.1 dev ns1eth2 flags signal
> +		pm_nl_set_limits $ns2 1 3
> +		pm_nl_add_endpoint $ns2 10.0.3.2 dev ns2eth3 flags subflow
> +		pm_nl_add_endpoint $ns2 10.0.4.2 dev ns2eth4 flags subflow
> +		run_tests $ns1 $ns2 10.0.1.1 1
> +		chk_join_nr "multiple flows, signal, link failure" 3 3 3
> +		chk_add_nr 1 1
> +		chk_stale_nr $ns2 1 5 1
> +	fi
>
> 	# accept and use add_addr with additional subflows and link loss
> 	# for bidirectional transfer
> -	reset
> -	init_shapers
> -	pm_nl_set_limits $ns1 0 3
> -	pm_nl_add_endpoint $ns1 10.0.2.1 dev ns1eth2 flags signal
> -	pm_nl_set_limits $ns2 1 3
> -	pm_nl_add_endpoint $ns2 10.0.3.2 dev ns2eth3 flags subflow
> -	pm_nl_add_endpoint $ns2 10.0.4.2 dev ns2eth4 flags subflow
> -	run_tests $ns1 $ns2 10.0.1.1 2
> -	chk_join_nr "multi flows, signal, bidi, link fail" 3 3 3
> -	chk_add_nr 1 1
> -	chk_stale_nr $ns2 1 -1 1
> +	if reset; then
> +		init_shapers
> +		pm_nl_set_limits $ns1 0 3
> +		pm_nl_add_endpoint $ns1 10.0.2.1 dev ns1eth2 flags signal
> +		pm_nl_set_limits $ns2 1 3
> +		pm_nl_add_endpoint $ns2 10.0.3.2 dev ns2eth3 flags subflow
> +		pm_nl_add_endpoint $ns2 10.0.4.2 dev ns2eth4 flags subflow
> +		run_tests $ns1 $ns2 10.0.1.1 2
> +		chk_join_nr "multi flows, signal, bidi, link fail" 3 3 3
> +		chk_add_nr 1 1
> +		chk_stale_nr $ns2 1 -1 1
> +	fi
>
> 	# 2 subflows plus 1 backup subflow with a lossy link, backup
> 	# will never be used
> -	reset
> -	init_shapers
> -	pm_nl_set_limits $ns1 0 2
> -	pm_nl_add_endpoint $ns1 10.0.2.1 dev ns1eth2 flags signal
> -	pm_nl_set_limits $ns2 1 2
> -	export FAILING_LINKS="1"
> -	pm_nl_add_endpoint $ns2 10.0.3.2 dev ns2eth3 flags subflow,backup
> -	run_tests $ns1 $ns2 10.0.1.1 1
> -	chk_join_nr "backup subflow unused, link failure" 2 2 2
> -	chk_add_nr 1 1
> -	chk_link_usage $ns2 ns2eth3 $cinsent 0
> +	if reset; then
> +		init_shapers
> +		pm_nl_set_limits $ns1 0 2
> +		pm_nl_add_endpoint $ns1 10.0.2.1 dev ns1eth2 flags signal
> +		pm_nl_set_limits $ns2 1 2
> +		export FAILING_LINKS="1"
> +		pm_nl_add_endpoint $ns2 10.0.3.2 dev ns2eth3 flags subflow,backup
> +		run_tests $ns1 $ns2 10.0.1.1 1
> +		chk_join_nr "backup subflow unused, link failure" 2 2 2
> +		chk_add_nr 1 1
> +		chk_link_usage $ns2 ns2eth3 $cinsent 0
> +	fi
>
> 	# 2 lossy links after half transfer, backup will get half of
> 	# the traffic
> -	reset
> -	init_shapers
> -	pm_nl_set_limits $ns1 0 2
> -	pm_nl_add_endpoint $ns1 10.0.2.1 dev ns1eth2 flags signal
> -	pm_nl_set_limits $ns2 1 2
> -	pm_nl_add_endpoint $ns2 10.0.3.2 dev ns2eth3 flags subflow,backup
> -	export FAILING_LINKS="1 2"
> -	run_tests $ns1 $ns2 10.0.1.1 1
> -	chk_join_nr "backup flow used, multi links fail" 2 2 2
> -	chk_add_nr 1 1
> -	chk_stale_nr $ns2 2 4 2
> -	chk_link_usage $ns2 ns2eth3 $cinsent 50
> +	if reset; then
> +		init_shapers
> +		pm_nl_set_limits $ns1 0 2
> +		pm_nl_add_endpoint $ns1 10.0.2.1 dev ns1eth2 flags signal
> +		pm_nl_set_limits $ns2 1 2
> +		pm_nl_add_endpoint $ns2 10.0.3.2 dev ns2eth3 flags subflow,backup
> +		export FAILING_LINKS="1 2"
> +		run_tests $ns1 $ns2 10.0.1.1 1
> +		chk_join_nr "backup flow used, multi links fail" 2 2 2
> +		chk_add_nr 1 1
> +		chk_stale_nr $ns2 2 4 2
> +		chk_link_usage $ns2 ns2eth3 $cinsent 50
> +	fi
>
> 	# use a backup subflow with the first subflow on a lossy link
> 	# for bidirectional transfer
> -	reset
> -	init_shapers
> -	pm_nl_set_limits $ns1 0 2
> -	pm_nl_add_endpoint $ns1 10.0.2.1 dev ns1eth2 flags signal
> -	pm_nl_set_limits $ns2 1 3
> -	pm_nl_add_endpoint $ns2 10.0.3.2 dev ns2eth3 flags subflow,backup
> -	run_tests $ns1 $ns2 10.0.1.1 2
> -	chk_join_nr "backup flow used, bidi, link failure" 2 2 2
> -	chk_add_nr 1 1
> -	chk_stale_nr $ns2 1 -1 2
> -	chk_link_usage $ns2 ns2eth3 $cinsent 50
> +	if reset; then
> +		init_shapers
> +		pm_nl_set_limits $ns1 0 2
> +		pm_nl_add_endpoint $ns1 10.0.2.1 dev ns1eth2 flags signal
> +		pm_nl_set_limits $ns2 1 3
> +		pm_nl_add_endpoint $ns2 10.0.3.2 dev ns2eth3 flags subflow,backup
> +		run_tests $ns1 $ns2 10.0.1.1 2
> +		chk_join_nr "backup flow used, bidi, link failure" 2 2 2
> +		chk_add_nr 1 1
> +		chk_stale_nr $ns2 1 -1 2
> +		chk_link_usage $ns2 ns2eth3 $cinsent 50
> +	fi
> }
>
> add_addr_timeout_tests()
> {
> 	# add_addr timeout
> -	reset_with_add_addr_timeout
> -	pm_nl_set_limits $ns1 0 1
> -	pm_nl_set_limits $ns2 1 1
> -	pm_nl_add_endpoint $ns1 10.0.2.1 flags signal
> -	run_tests $ns1 $ns2 10.0.1.1 0 0 0 slow
> -	chk_join_nr "signal address, ADD_ADDR timeout" 1 1 1
> -	chk_add_nr 4 0
> +	if reset_with_add_addr_timeout; then
> +		pm_nl_set_limits $ns1 0 1
> +		pm_nl_set_limits $ns2 1 1
> +		pm_nl_add_endpoint $ns1 10.0.2.1 flags signal
> +		run_tests $ns1 $ns2 10.0.1.1 0 0 0 slow
> +		chk_join_nr "signal address, ADD_ADDR timeout" 1 1 1
> +		chk_add_nr 4 0
> +	fi
>
> 	# add_addr timeout IPv6
> -	reset_with_add_addr_timeout 6
> -	pm_nl_set_limits $ns1 0 1
> -	pm_nl_set_limits $ns2 1 1
> -	pm_nl_add_endpoint $ns1 dead:beef:2::1 flags signal
> -	run_tests $ns1 $ns2 dead:beef:1::1 0 0 0 slow
> -	chk_join_nr "signal address, ADD_ADDR6 timeout" 1 1 1
> -	chk_add_nr 4 0
> +	if reset_with_add_addr_timeout 6; then
> +		pm_nl_set_limits $ns1 0 1
> +		pm_nl_set_limits $ns2 1 1
> +		pm_nl_add_endpoint $ns1 dead:beef:2::1 flags signal
> +		run_tests $ns1 $ns2 dead:beef:1::1 0 0 0 slow
> +		chk_join_nr "signal address, ADD_ADDR6 timeout" 1 1 1
> +		chk_add_nr 4 0
> +	fi
>
> 	# signal addresses timeout
> -	reset_with_add_addr_timeout
> -	pm_nl_set_limits $ns1 2 2
> -	pm_nl_add_endpoint $ns1 10.0.2.1 flags signal
> -	pm_nl_add_endpoint $ns1 10.0.3.1 flags signal
> -	pm_nl_set_limits $ns2 2 2
> -	run_tests $ns1 $ns2 10.0.1.1 0 0 0 least
> -	chk_join_nr "signal addresses, ADD_ADDR timeout" 2 2 2
> -	chk_add_nr 8 0
> +	if reset_with_add_addr_timeout; then
> +		pm_nl_set_limits $ns1 2 2
> +		pm_nl_add_endpoint $ns1 10.0.2.1 flags signal
> +		pm_nl_add_endpoint $ns1 10.0.3.1 flags signal
> +		pm_nl_set_limits $ns2 2 2
> +		run_tests $ns1 $ns2 10.0.1.1 0 0 0 least
> +		chk_join_nr "signal addresses, ADD_ADDR timeout" 2 2 2
> +		chk_add_nr 8 0
> +	fi
>
> 	# signal invalid addresses timeout
> -	reset_with_add_addr_timeout
> -	pm_nl_set_limits $ns1 2 2
> -	pm_nl_add_endpoint $ns1 10.0.12.1 flags signal
> -	pm_nl_add_endpoint $ns1 10.0.3.1 flags signal
> -	pm_nl_set_limits $ns2 2 2
> -	run_tests $ns1 $ns2 10.0.1.1 0 0 0 least
> -	chk_join_nr "invalid address, ADD_ADDR timeout" 1 1 1
> -	chk_add_nr 8 0
> +	if reset_with_add_addr_timeout; then
> +		pm_nl_set_limits $ns1 2 2
> +		pm_nl_add_endpoint $ns1 10.0.12.1 flags signal
> +		pm_nl_add_endpoint $ns1 10.0.3.1 flags signal
> +		pm_nl_set_limits $ns2 2 2
> +		run_tests $ns1 $ns2 10.0.1.1 0 0 0 least
> +		chk_join_nr "invalid address, ADD_ADDR timeout" 1 1 1
> +		chk_add_nr 8 0
> +	fi
> }
>
> remove_tests()
> {
> 	# single subflow, remove
> -	reset
> -	pm_nl_set_limits $ns1 0 1
> -	pm_nl_set_limits $ns2 0 1
> -	pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow
> -	run_tests $ns1 $ns2 10.0.1.1 0 0 -1 slow
> -	chk_join_nr "remove single subflow" 1 1 1
> -	chk_rm_nr 1 1
> +	if reset; then
> +		pm_nl_set_limits $ns1 0 1
> +		pm_nl_set_limits $ns2 0 1
> +		pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow
> +		run_tests $ns1 $ns2 10.0.1.1 0 0 -1 slow
> +		chk_join_nr "remove single subflow" 1 1 1
> +		chk_rm_nr 1 1
> +	fi
>
> 	# multiple subflows, remove
> -	reset
> -	pm_nl_set_limits $ns1 0 2
> -	pm_nl_set_limits $ns2 0 2
> -	pm_nl_add_endpoint $ns2 10.0.2.2 flags subflow
> -	pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow
> -	run_tests $ns1 $ns2 10.0.1.1 0 0 -2 slow
> -	chk_join_nr "remove multiple subflows" 2 2 2
> -	chk_rm_nr 2 2
> +	if reset; then
> +		pm_nl_set_limits $ns1 0 2
> +		pm_nl_set_limits $ns2 0 2
> +		pm_nl_add_endpoint $ns2 10.0.2.2 flags subflow
> +		pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow
> +		run_tests $ns1 $ns2 10.0.1.1 0 0 -2 slow
> +		chk_join_nr "remove multiple subflows" 2 2 2
> +		chk_rm_nr 2 2
> +	fi
>
> 	# single address, remove
> -	reset
> -	pm_nl_set_limits $ns1 0 1
> -	pm_nl_add_endpoint $ns1 10.0.2.1 flags signal
> -	pm_nl_set_limits $ns2 1 1
> -	run_tests $ns1 $ns2 10.0.1.1 0 -1 0 slow
> -	chk_join_nr "remove single address" 1 1 1
> -	chk_add_nr 1 1
> -	chk_rm_nr 1 1 invert
> +	if reset; then
> +		pm_nl_set_limits $ns1 0 1
> +		pm_nl_add_endpoint $ns1 10.0.2.1 flags signal
> +		pm_nl_set_limits $ns2 1 1
> +		run_tests $ns1 $ns2 10.0.1.1 0 -1 0 slow
> +		chk_join_nr "remove single address" 1 1 1
> +		chk_add_nr 1 1
> +		chk_rm_nr 1 1 invert
> +	fi
>
> 	# subflow and signal, remove
> -	reset
> -	pm_nl_set_limits $ns1 0 2
> -	pm_nl_add_endpoint $ns1 10.0.2.1 flags signal
> -	pm_nl_set_limits $ns2 1 2
> -	pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow
> -	run_tests $ns1 $ns2 10.0.1.1 0 -1 -1 slow
> -	chk_join_nr "remove subflow and signal" 2 2 2
> -	chk_add_nr 1 1
> -	chk_rm_nr 1 1
> +	if reset; then
> +		pm_nl_set_limits $ns1 0 2
> +		pm_nl_add_endpoint $ns1 10.0.2.1 flags signal
> +		pm_nl_set_limits $ns2 1 2
> +		pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow
> +		run_tests $ns1 $ns2 10.0.1.1 0 -1 -1 slow
> +		chk_join_nr "remove subflow and signal" 2 2 2
> +		chk_add_nr 1 1
> +		chk_rm_nr 1 1
> +	fi
>
> 	# subflows and signal, remove
> -	reset
> -	pm_nl_set_limits $ns1 0 3
> -	pm_nl_add_endpoint $ns1 10.0.2.1 flags signal
> -	pm_nl_set_limits $ns2 1 3
> -	pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow
> -	pm_nl_add_endpoint $ns2 10.0.4.2 flags subflow
> -	run_tests $ns1 $ns2 10.0.1.1 0 -1 -2 slow
> -	chk_join_nr "remove subflows and signal" 3 3 3
> -	chk_add_nr 1 1
> -	chk_rm_nr 2 2
> +	if reset; then
> +		pm_nl_set_limits $ns1 0 3
> +		pm_nl_add_endpoint $ns1 10.0.2.1 flags signal
> +		pm_nl_set_limits $ns2 1 3
> +		pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow
> +		pm_nl_add_endpoint $ns2 10.0.4.2 flags subflow
> +		run_tests $ns1 $ns2 10.0.1.1 0 -1 -2 slow
> +		chk_join_nr "remove subflows and signal" 3 3 3
> +		chk_add_nr 1 1
> +		chk_rm_nr 2 2
> +	fi
>
> 	# addresses remove
> -	reset
> -	pm_nl_set_limits $ns1 3 3
> -	pm_nl_add_endpoint $ns1 10.0.2.1 flags signal id 250
> -	pm_nl_add_endpoint $ns1 10.0.3.1 flags signal
> -	pm_nl_add_endpoint $ns1 10.0.4.1 flags signal
> -	pm_nl_set_limits $ns2 3 3
> -	run_tests $ns1 $ns2 10.0.1.1 0 -3 0 slow
> -	chk_join_nr "remove addresses" 3 3 3
> -	chk_add_nr 3 3
> -	chk_rm_nr 3 3 invert
> +	if reset; then
> +		pm_nl_set_limits $ns1 3 3
> +		pm_nl_add_endpoint $ns1 10.0.2.1 flags signal id 250
> +		pm_nl_add_endpoint $ns1 10.0.3.1 flags signal
> +		pm_nl_add_endpoint $ns1 10.0.4.1 flags signal
> +		pm_nl_set_limits $ns2 3 3
> +		run_tests $ns1 $ns2 10.0.1.1 0 -3 0 slow
> +		chk_join_nr "remove addresses" 3 3 3
> +		chk_add_nr 3 3
> +		chk_rm_nr 3 3 invert
> +	fi
>
> 	# invalid addresses remove
> -	reset
> -	pm_nl_set_limits $ns1 3 3
> -	pm_nl_add_endpoint $ns1 10.0.12.1 flags signal
> -	pm_nl_add_endpoint $ns1 10.0.3.1 flags signal
> -	pm_nl_add_endpoint $ns1 10.0.14.1 flags signal
> -	pm_nl_set_limits $ns2 3 3
> -	run_tests $ns1 $ns2 10.0.1.1 0 -3 0 slow
> -	chk_join_nr "remove invalid addresses" 1 1 1
> -	chk_add_nr 3 3
> -	chk_rm_nr 3 1 invert
> +	if reset; then
> +		pm_nl_set_limits $ns1 3 3
> +		pm_nl_add_endpoint $ns1 10.0.12.1 flags signal
> +		pm_nl_add_endpoint $ns1 10.0.3.1 flags signal
> +		pm_nl_add_endpoint $ns1 10.0.14.1 flags signal
> +		pm_nl_set_limits $ns2 3 3
> +		run_tests $ns1 $ns2 10.0.1.1 0 -3 0 slow
> +		chk_join_nr "remove invalid addresses" 1 1 1
> +		chk_add_nr 3 3
> +		chk_rm_nr 3 1 invert
> +	fi
>
> 	# subflows and signal, flush
> -	reset
> -	pm_nl_set_limits $ns1 0 3
> -	pm_nl_add_endpoint $ns1 10.0.2.1 flags signal
> -	pm_nl_set_limits $ns2 1 3
> -	pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow
> -	pm_nl_add_endpoint $ns2 10.0.4.2 flags subflow
> -	run_tests $ns1 $ns2 10.0.1.1 0 -8 -8 slow
> -	chk_join_nr "flush subflows and signal" 3 3 3
> -	chk_add_nr 1 1
> -	chk_rm_nr 2 2
> +	if reset; then
> +		pm_nl_set_limits $ns1 0 3
> +		pm_nl_add_endpoint $ns1 10.0.2.1 flags signal
> +		pm_nl_set_limits $ns2 1 3
> +		pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow
> +		pm_nl_add_endpoint $ns2 10.0.4.2 flags subflow
> +		run_tests $ns1 $ns2 10.0.1.1 0 -8 -8 slow
> +		chk_join_nr "flush subflows and signal" 3 3 3
> +		chk_add_nr 1 1
> +		chk_rm_nr 2 2
> +	fi
>
> 	# subflows flush
> -	reset
> -	pm_nl_set_limits $ns1 3 3
> -	pm_nl_set_limits $ns2 3 3
> -	pm_nl_add_endpoint $ns2 10.0.2.2 flags subflow id 150
> -	pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow
> -	pm_nl_add_endpoint $ns2 10.0.4.2 flags subflow
> -	run_tests $ns1 $ns2 10.0.1.1 0 -8 -8 slow
> -	chk_join_nr "flush subflows" 3 3 3
> -	chk_rm_nr 3 3
> +	if reset; then
> +		pm_nl_set_limits $ns1 3 3
> +		pm_nl_set_limits $ns2 3 3
> +		pm_nl_add_endpoint $ns2 10.0.2.2 flags subflow id 150
> +		pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow
> +		pm_nl_add_endpoint $ns2 10.0.4.2 flags subflow
> +		run_tests $ns1 $ns2 10.0.1.1 0 -8 -8 slow
> +		chk_join_nr "flush subflows" 3 3 3
> +		chk_rm_nr 3 3
> +	fi
>
> 	# addresses flush
> -	reset
> -	pm_nl_set_limits $ns1 3 3
> -	pm_nl_add_endpoint $ns1 10.0.2.1 flags signal id 250
> -	pm_nl_add_endpoint $ns1 10.0.3.1 flags signal
> -	pm_nl_add_endpoint $ns1 10.0.4.1 flags signal
> -	pm_nl_set_limits $ns2 3 3
> -	run_tests $ns1 $ns2 10.0.1.1 0 -8 -8 slow
> -	chk_join_nr "flush addresses" 3 3 3
> -	chk_add_nr 3 3
> -	chk_rm_nr 3 3 invert
> +	if reset; then
> +		pm_nl_set_limits $ns1 3 3
> +		pm_nl_add_endpoint $ns1 10.0.2.1 flags signal id 250
> +		pm_nl_add_endpoint $ns1 10.0.3.1 flags signal
> +		pm_nl_add_endpoint $ns1 10.0.4.1 flags signal
> +		pm_nl_set_limits $ns2 3 3
> +		run_tests $ns1 $ns2 10.0.1.1 0 -8 -8 slow
> +		chk_join_nr "flush addresses" 3 3 3
> +		chk_add_nr 3 3
> +		chk_rm_nr 3 3 invert
> +	fi
>
> 	# invalid addresses flush
> -	reset
> -	pm_nl_set_limits $ns1 3 3
> -	pm_nl_add_endpoint $ns1 10.0.12.1 flags signal
> -	pm_nl_add_endpoint $ns1 10.0.3.1 flags signal
> -	pm_nl_add_endpoint $ns1 10.0.14.1 flags signal
> -	pm_nl_set_limits $ns2 3 3
> -	run_tests $ns1 $ns2 10.0.1.1 0 -8 0 slow
> -	chk_join_nr "flush invalid addresses" 1 1 1
> -	chk_add_nr 3 3
> -	chk_rm_nr 3 1 invert
> +	if reset; then
> +		pm_nl_set_limits $ns1 3 3
> +		pm_nl_add_endpoint $ns1 10.0.12.1 flags signal
> +		pm_nl_add_endpoint $ns1 10.0.3.1 flags signal
> +		pm_nl_add_endpoint $ns1 10.0.14.1 flags signal
> +		pm_nl_set_limits $ns2 3 3
> +		run_tests $ns1 $ns2 10.0.1.1 0 -8 0 slow
> +		chk_join_nr "flush invalid addresses" 1 1 1
> +		chk_add_nr 3 3
> +		chk_rm_nr 3 1 invert
> +	fi
>
> 	# remove id 0 subflow
> -	reset
> -	pm_nl_set_limits $ns1 0 1
> -	pm_nl_set_limits $ns2 0 1
> -	pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow
> -	run_tests $ns1 $ns2 10.0.1.1 0 0 -9 slow
> -	chk_join_nr "remove id 0 subflow" 1 1 1
> -	chk_rm_nr 1 1
> +	if reset; then
> +		pm_nl_set_limits $ns1 0 1
> +		pm_nl_set_limits $ns2 0 1
> +		pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow
> +		run_tests $ns1 $ns2 10.0.1.1 0 0 -9 slow
> +		chk_join_nr "remove id 0 subflow" 1 1 1
> +		chk_rm_nr 1 1
> +	fi
>
> 	# remove id 0 address
> -	reset
> -	pm_nl_set_limits $ns1 0 1
> -	pm_nl_add_endpoint $ns1 10.0.2.1 flags signal
> -	pm_nl_set_limits $ns2 1 1
> -	run_tests $ns1 $ns2 10.0.1.1 0 -9 0 slow
> -	chk_join_nr "remove id 0 address" 1 1 1
> -	chk_add_nr 1 1
> -	chk_rm_nr 1 1 invert
> +	if reset; then
> +		pm_nl_set_limits $ns1 0 1
> +		pm_nl_add_endpoint $ns1 10.0.2.1 flags signal
> +		pm_nl_set_limits $ns2 1 1
> +		run_tests $ns1 $ns2 10.0.1.1 0 -9 0 slow
> +		chk_join_nr "remove id 0 address" 1 1 1
> +		chk_add_nr 1 1
> +		chk_rm_nr 1 1 invert
> +	fi
> }
>
> add_tests()
> {
> 	# add single subflow
> -	reset
> -	pm_nl_set_limits $ns1 0 1
> -	pm_nl_set_limits $ns2 0 1
> -	run_tests $ns1 $ns2 10.0.1.1 0 0 1 slow
> -	chk_join_nr "add single subflow" 1 1 1
> +	if reset; then
> +		pm_nl_set_limits $ns1 0 1
> +		pm_nl_set_limits $ns2 0 1
> +		run_tests $ns1 $ns2 10.0.1.1 0 0 1 slow
> +		chk_join_nr "add single subflow" 1 1 1
> +	fi
>
> 	# add signal address
> -	reset
> -	pm_nl_set_limits $ns1 0 1
> -	pm_nl_set_limits $ns2 1 1
> -	run_tests $ns1 $ns2 10.0.1.1 0 1 0 slow
> -	chk_join_nr "add signal address" 1 1 1
> -	chk_add_nr 1 1
> +	if reset; then
> +		pm_nl_set_limits $ns1 0 1
> +		pm_nl_set_limits $ns2 1 1
> +		run_tests $ns1 $ns2 10.0.1.1 0 1 0 slow
> +		chk_join_nr "add signal address" 1 1 1
> +		chk_add_nr 1 1
> +	fi
>
> 	# add multiple subflows
> -	reset
> -	pm_nl_set_limits $ns1 0 2
> -	pm_nl_set_limits $ns2 0 2
> -	run_tests $ns1 $ns2 10.0.1.1 0 0 2 slow
> -	chk_join_nr "add multiple subflows" 2 2 2
> +	if reset; then
> +		pm_nl_set_limits $ns1 0 2
> +		pm_nl_set_limits $ns2 0 2
> +		run_tests $ns1 $ns2 10.0.1.1 0 0 2 slow
> +		chk_join_nr "add multiple subflows" 2 2 2
> +	fi
>
> 	# add multiple subflows IPv6
> -	reset
> -	pm_nl_set_limits $ns1 0 2
> -	pm_nl_set_limits $ns2 0 2
> -	run_tests $ns1 $ns2 dead:beef:1::1 0 0 2 slow
> -	chk_join_nr "add multiple subflows IPv6" 2 2 2
> +	if reset; then
> +		pm_nl_set_limits $ns1 0 2
> +		pm_nl_set_limits $ns2 0 2
> +		run_tests $ns1 $ns2 dead:beef:1::1 0 0 2 slow
> +		chk_join_nr "add multiple subflows IPv6" 2 2 2
> +	fi
>
> 	# add multiple addresses IPv6
> -	reset
> -	pm_nl_set_limits $ns1 0 2
> -	pm_nl_set_limits $ns2 2 2
> -	run_tests $ns1 $ns2 dead:beef:1::1 0 2 0 slow
> -	chk_join_nr "add multiple addresses IPv6" 2 2 2
> -	chk_add_nr 2 2
> +	if reset; then
> +		pm_nl_set_limits $ns1 0 2
> +		pm_nl_set_limits $ns2 2 2
> +		run_tests $ns1 $ns2 dead:beef:1::1 0 2 0 slow
> +		chk_join_nr "add multiple addresses IPv6" 2 2 2
> +		chk_add_nr 2 2
> +	fi
> }
>
> ipv6_tests()
> {
> 	# subflow IPv6
> -	reset
> -	pm_nl_set_limits $ns1 0 1
> -	pm_nl_set_limits $ns2 0 1
> -	pm_nl_add_endpoint $ns2 dead:beef:3::2 dev ns2eth3 flags subflow
> -	run_tests $ns1 $ns2 dead:beef:1::1 0 0 0 slow
> -	chk_join_nr "single subflow IPv6" 1 1 1
> +	if reset; then
> +		pm_nl_set_limits $ns1 0 1
> +		pm_nl_set_limits $ns2 0 1
> +		pm_nl_add_endpoint $ns2 dead:beef:3::2 dev ns2eth3 flags subflow
> +		run_tests $ns1 $ns2 dead:beef:1::1 0 0 0 slow
> +		chk_join_nr "single subflow IPv6" 1 1 1
> +	fi
>
> 	# add_address, unused IPv6
> -	reset
> -	pm_nl_add_endpoint $ns1 dead:beef:2::1 flags signal
> -	run_tests $ns1 $ns2 dead:beef:1::1 0 0 0 slow
> -	chk_join_nr "unused signal address IPv6" 0 0 0
> -	chk_add_nr 1 1
> +	if reset; then
> +		pm_nl_add_endpoint $ns1 dead:beef:2::1 flags signal
> +		run_tests $ns1 $ns2 dead:beef:1::1 0 0 0 slow
> +		chk_join_nr "unused signal address IPv6" 0 0 0
> +		chk_add_nr 1 1
> +	fi
>
> 	# signal address IPv6
> -	reset
> -	pm_nl_set_limits $ns1 0 1
> -	pm_nl_add_endpoint $ns1 dead:beef:2::1 flags signal
> -	pm_nl_set_limits $ns2 1 1
> -	run_tests $ns1 $ns2 dead:beef:1::1 0 0 0 slow
> -	chk_join_nr "single address IPv6" 1 1 1
> -	chk_add_nr 1 1
> +	if reset; then
> +		pm_nl_set_limits $ns1 0 1
> +		pm_nl_add_endpoint $ns1 dead:beef:2::1 flags signal
> +		pm_nl_set_limits $ns2 1 1
> +		run_tests $ns1 $ns2 dead:beef:1::1 0 0 0 slow
> +		chk_join_nr "single address IPv6" 1 1 1
> +		chk_add_nr 1 1
> +	fi
>
> 	# single address IPv6, remove
> -	reset
> -	pm_nl_set_limits $ns1 0 1
> -	pm_nl_add_endpoint $ns1 dead:beef:2::1 flags signal
> -	pm_nl_set_limits $ns2 1 1
> -	run_tests $ns1 $ns2 dead:beef:1::1 0 -1 0 slow
> -	chk_join_nr "remove single address IPv6" 1 1 1
> -	chk_add_nr 1 1
> -	chk_rm_nr 1 1 invert
> +	if reset; then
> +		pm_nl_set_limits $ns1 0 1
> +		pm_nl_add_endpoint $ns1 dead:beef:2::1 flags signal
> +		pm_nl_set_limits $ns2 1 1
> +		run_tests $ns1 $ns2 dead:beef:1::1 0 -1 0 slow
> +		chk_join_nr "remove single address IPv6" 1 1 1
> +		chk_add_nr 1 1
> +		chk_rm_nr 1 1 invert
> +	fi
>
> 	# subflow and signal IPv6, remove
> -	reset
> -	pm_nl_set_limits $ns1 0 2
> -	pm_nl_add_endpoint $ns1 dead:beef:2::1 flags signal
> -	pm_nl_set_limits $ns2 1 2
> -	pm_nl_add_endpoint $ns2 dead:beef:3::2 dev ns2eth3 flags subflow
> -	run_tests $ns1 $ns2 dead:beef:1::1 0 -1 -1 slow
> -	chk_join_nr "remove subflow and signal IPv6" 2 2 2
> -	chk_add_nr 1 1
> -	chk_rm_nr 1 1
> +	if reset; then
> +		pm_nl_set_limits $ns1 0 2
> +		pm_nl_add_endpoint $ns1 dead:beef:2::1 flags signal
> +		pm_nl_set_limits $ns2 1 2
> +		pm_nl_add_endpoint $ns2 dead:beef:3::2 dev ns2eth3 flags subflow
> +		run_tests $ns1 $ns2 dead:beef:1::1 0 -1 -1 slow
> +		chk_join_nr "remove subflow and signal IPv6" 2 2 2
> +		chk_add_nr 1 1
> +		chk_rm_nr 1 1
> +	fi
> }
>
> v4mapped_tests()
> {
> 	# subflow IPv4-mapped to IPv4-mapped
> -	reset
> -	pm_nl_set_limits $ns1 0 1
> -	pm_nl_set_limits $ns2 0 1
> -	pm_nl_add_endpoint $ns2 "::ffff:10.0.3.2" flags subflow
> -	run_tests $ns1 $ns2 "::ffff:10.0.1.1"
> -	chk_join_nr "single subflow IPv4-mapped" 1 1 1
> +	if reset; then
> +		pm_nl_set_limits $ns1 0 1
> +		pm_nl_set_limits $ns2 0 1
> +		pm_nl_add_endpoint $ns2 "::ffff:10.0.3.2" flags subflow
> +		run_tests $ns1 $ns2 "::ffff:10.0.1.1"
> +		chk_join_nr "single subflow IPv4-mapped" 1 1 1
> +	fi
>
> 	# signal address IPv4-mapped with IPv4-mapped sk
> -	reset
> -	pm_nl_set_limits $ns1 0 1
> -	pm_nl_set_limits $ns2 1 1
> -	pm_nl_add_endpoint $ns1 "::ffff:10.0.2.1" flags signal
> -	run_tests $ns1 $ns2 "::ffff:10.0.1.1"
> -	chk_join_nr "signal address IPv4-mapped" 1 1 1
> -	chk_add_nr 1 1
> +	if reset; then
> +		pm_nl_set_limits $ns1 0 1
> +		pm_nl_set_limits $ns2 1 1
> +		pm_nl_add_endpoint $ns1 "::ffff:10.0.2.1" flags signal
> +		run_tests $ns1 $ns2 "::ffff:10.0.1.1"
> +		chk_join_nr "signal address IPv4-mapped" 1 1 1
> +		chk_add_nr 1 1
> +	fi
>
> 	# subflow v4-map-v6
> -	reset
> -	pm_nl_set_limits $ns1 0 1
> -	pm_nl_set_limits $ns2 0 1
> -	pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow
> -	run_tests $ns1 $ns2 "::ffff:10.0.1.1"
> -	chk_join_nr "single subflow v4-map-v6" 1 1 1
> +	if reset; then
> +		pm_nl_set_limits $ns1 0 1
> +		pm_nl_set_limits $ns2 0 1
> +		pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow
> +		run_tests $ns1 $ns2 "::ffff:10.0.1.1"
> +		chk_join_nr "single subflow v4-map-v6" 1 1 1
> +	fi
>
> 	# signal address v4-map-v6
> -	reset
> -	pm_nl_set_limits $ns1 0 1
> -	pm_nl_set_limits $ns2 1 1
> -	pm_nl_add_endpoint $ns1 10.0.2.1 flags signal
> -	run_tests $ns1 $ns2 "::ffff:10.0.1.1"
> -	chk_join_nr "signal address v4-map-v6" 1 1 1
> -	chk_add_nr 1 1
> +	if reset; then
> +		pm_nl_set_limits $ns1 0 1
> +		pm_nl_set_limits $ns2 1 1
> +		pm_nl_add_endpoint $ns1 10.0.2.1 flags signal
> +		run_tests $ns1 $ns2 "::ffff:10.0.1.1"
> +		chk_join_nr "signal address v4-map-v6" 1 1 1
> +		chk_add_nr 1 1
> +	fi
>
> 	# subflow v6-map-v4
> -	reset
> -	pm_nl_set_limits $ns1 0 1
> -	pm_nl_set_limits $ns2 0 1
> -	pm_nl_add_endpoint $ns2 "::ffff:10.0.3.2" flags subflow
> -	run_tests $ns1 $ns2 10.0.1.1
> -	chk_join_nr "single subflow v6-map-v4" 1 1 1
> +	if reset; then
> +		pm_nl_set_limits $ns1 0 1
> +		pm_nl_set_limits $ns2 0 1
> +		pm_nl_add_endpoint $ns2 "::ffff:10.0.3.2" flags subflow
> +		run_tests $ns1 $ns2 10.0.1.1
> +		chk_join_nr "single subflow v6-map-v4" 1 1 1
> +	fi
>
> 	# signal address v6-map-v4
> -	reset
> -	pm_nl_set_limits $ns1 0 1
> -	pm_nl_set_limits $ns2 1 1
> -	pm_nl_add_endpoint $ns1 "::ffff:10.0.2.1" flags signal
> -	run_tests $ns1 $ns2 10.0.1.1
> -	chk_join_nr "signal address v6-map-v4" 1 1 1
> -	chk_add_nr 1 1
> +	if reset; then
> +		pm_nl_set_limits $ns1 0 1
> +		pm_nl_set_limits $ns2 1 1
> +		pm_nl_add_endpoint $ns1 "::ffff:10.0.2.1" flags signal
> +		run_tests $ns1 $ns2 10.0.1.1
> +		chk_join_nr "signal address v6-map-v4" 1 1 1
> +		chk_add_nr 1 1
> +	fi
>
> 	# no subflow IPv6 to v4 address
> -	reset
> -	pm_nl_set_limits $ns1 0 1
> -	pm_nl_set_limits $ns2 0 1
> -	pm_nl_add_endpoint $ns2 dead:beef:2::2 flags subflow
> -	run_tests $ns1 $ns2 10.0.1.1
> -	chk_join_nr "no JOIN with diff families v4-v6" 0 0 0
> +	if reset; then
> +		pm_nl_set_limits $ns1 0 1
> +		pm_nl_set_limits $ns2 0 1
> +		pm_nl_add_endpoint $ns2 dead:beef:2::2 flags subflow
> +		run_tests $ns1 $ns2 10.0.1.1
> +		chk_join_nr "no JOIN with diff families v4-v6" 0 0 0
> +	fi
>
> 	# no subflow IPv6 to v4 address even if v6 has a valid v4 at the end
> -	reset
> -	pm_nl_set_limits $ns1 0 1
> -	pm_nl_set_limits $ns2 0 1
> -	pm_nl_add_endpoint $ns2 dead:beef:2::10.0.3.2 flags subflow
> -	run_tests $ns1 $ns2 10.0.1.1
> -	chk_join_nr "no JOIN with diff families v4-v6-2" 0 0 0
> +	if reset; then
> +		pm_nl_set_limits $ns1 0 1
> +		pm_nl_set_limits $ns2 0 1
> +		pm_nl_add_endpoint $ns2 dead:beef:2::10.0.3.2 flags subflow
> +		run_tests $ns1 $ns2 10.0.1.1
> +		chk_join_nr "no JOIN with diff families v4-v6-2" 0 0 0
> +	fi
>
> 	# no subflow IPv4 to v6 address, no need to slow down too then
> -	reset
> -	pm_nl_set_limits $ns1 0 1
> -	pm_nl_set_limits $ns2 0 1
> -	pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow
> -	run_tests $ns1 $ns2 dead:beef:1::1
> -	chk_join_nr "no JOIN with diff families v6-v4" 0 0 0
> +	if reset; then
> +		pm_nl_set_limits $ns1 0 1
> +		pm_nl_set_limits $ns2 0 1
> +		pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow
> +		run_tests $ns1 $ns2 dead:beef:1::1
> +		chk_join_nr "no JOIN with diff families v6-v4" 0 0 0
> +	fi
> }
>
> backup_tests()
> {
> 	# single subflow, backup
> -	reset
> -	pm_nl_set_limits $ns1 0 1
> -	pm_nl_set_limits $ns2 0 1
> -	pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow,backup
> -	run_tests $ns1 $ns2 10.0.1.1 0 0 0 slow nobackup
> -	chk_join_nr "single subflow, backup" 1 1 1
> -	chk_prio_nr 0 1
> +	if reset; then
> +		pm_nl_set_limits $ns1 0 1
> +		pm_nl_set_limits $ns2 0 1
> +		pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow,backup
> +		run_tests $ns1 $ns2 10.0.1.1 0 0 0 slow nobackup
> +		chk_join_nr "single subflow, backup" 1 1 1
> +		chk_prio_nr 0 1
> +	fi
>
> 	# single address, backup
> -	reset
> -	pm_nl_set_limits $ns1 0 1
> -	pm_nl_add_endpoint $ns1 10.0.2.1 flags signal
> -	pm_nl_set_limits $ns2 1 1
> -	run_tests $ns1 $ns2 10.0.1.1 0 0 0 slow backup
> -	chk_join_nr "single address, backup" 1 1 1
> -	chk_add_nr 1 1
> -	chk_prio_nr 1 0
> +	if reset; then
> +		pm_nl_set_limits $ns1 0 1
> +		pm_nl_add_endpoint $ns1 10.0.2.1 flags signal
> +		pm_nl_set_limits $ns2 1 1
> +		run_tests $ns1 $ns2 10.0.1.1 0 0 0 slow backup
> +		chk_join_nr "single address, backup" 1 1 1
> +		chk_add_nr 1 1
> +		chk_prio_nr 1 0
> +	fi
>
> 	# single address with port, backup
> -	reset
> -	pm_nl_set_limits $ns1 0 1
> -	pm_nl_add_endpoint $ns1 10.0.2.1 flags signal port 10100
> -	pm_nl_set_limits $ns2 1 1
> -	run_tests $ns1 $ns2 10.0.1.1 0 0 0 slow backup
> -	chk_join_nr "single address with port, backup" 1 1 1
> -	chk_add_nr 1 1
> -	chk_prio_nr 1 0
> +	if reset; then
> +		pm_nl_set_limits $ns1 0 1
> +		pm_nl_add_endpoint $ns1 10.0.2.1 flags signal port 10100
> +		pm_nl_set_limits $ns2 1 1
> +		run_tests $ns1 $ns2 10.0.1.1 0 0 0 slow backup
> +		chk_join_nr "single address with port, backup" 1 1 1
> +		chk_add_nr 1 1
> +		chk_prio_nr 1 0
> +	fi
> }
>
> add_addr_ports_tests()
> {
> 	# signal address with port
> -	reset
> -	pm_nl_set_limits $ns1 0 1
> -	pm_nl_set_limits $ns2 1 1
> -	pm_nl_add_endpoint $ns1 10.0.2.1 flags signal port 10100
> -	run_tests $ns1 $ns2 10.0.1.1
> -	chk_join_nr "signal address with port" 1 1 1
> -	chk_add_nr 1 1 1
> +	if reset; then
> +		pm_nl_set_limits $ns1 0 1
> +		pm_nl_set_limits $ns2 1 1
> +		pm_nl_add_endpoint $ns1 10.0.2.1 flags signal port 10100
> +		run_tests $ns1 $ns2 10.0.1.1
> +		chk_join_nr "signal address with port" 1 1 1
> +		chk_add_nr 1 1 1
> +	fi
>
> 	# subflow and signal with port
> -	reset
> -	pm_nl_add_endpoint $ns1 10.0.2.1 flags signal port 10100
> -	pm_nl_set_limits $ns1 0 2
> -	pm_nl_set_limits $ns2 1 2
> -	pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow
> -	run_tests $ns1 $ns2 10.0.1.1
> -	chk_join_nr "subflow and signal with port" 2 2 2
> -	chk_add_nr 1 1 1
> +	if reset; then
> +		pm_nl_add_endpoint $ns1 10.0.2.1 flags signal port 10100
> +		pm_nl_set_limits $ns1 0 2
> +		pm_nl_set_limits $ns2 1 2
> +		pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow
> +		run_tests $ns1 $ns2 10.0.1.1
> +		chk_join_nr "subflow and signal with port" 2 2 2
> +		chk_add_nr 1 1 1
> +	fi
>
> 	# single address with port, remove
> -	reset
> -	pm_nl_set_limits $ns1 0 1
> -	pm_nl_add_endpoint $ns1 10.0.2.1 flags signal port 10100
> -	pm_nl_set_limits $ns2 1 1
> -	run_tests $ns1 $ns2 10.0.1.1 0 -1 0 slow
> -	chk_join_nr "remove single address with port" 1 1 1
> -	chk_add_nr 1 1 1
> -	chk_rm_nr 1 1 invert
> +	if reset; then
> +		pm_nl_set_limits $ns1 0 1
> +		pm_nl_add_endpoint $ns1 10.0.2.1 flags signal port 10100
> +		pm_nl_set_limits $ns2 1 1
> +		run_tests $ns1 $ns2 10.0.1.1 0 -1 0 slow
> +		chk_join_nr "remove single address with port" 1 1 1
> +		chk_add_nr 1 1 1
> +		chk_rm_nr 1 1 invert
> +	fi
>
> 	# subflow and signal with port, remove
> -	reset
> -	pm_nl_set_limits $ns1 0 2
> -	pm_nl_add_endpoint $ns1 10.0.2.1 flags signal port 10100
> -	pm_nl_set_limits $ns2 1 2
> -	pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow
> -	run_tests $ns1 $ns2 10.0.1.1 0 -1 -1 slow
> -	chk_join_nr "remove subflow and signal with port" 2 2 2
> -	chk_add_nr 1 1 1
> -	chk_rm_nr 1 1
> +	if reset; then
> +		pm_nl_set_limits $ns1 0 2
> +		pm_nl_add_endpoint $ns1 10.0.2.1 flags signal port 10100
> +		pm_nl_set_limits $ns2 1 2
> +		pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow
> +		run_tests $ns1 $ns2 10.0.1.1 0 -1 -1 slow
> +		chk_join_nr "remove subflow and signal with port" 2 2 2
> +		chk_add_nr 1 1 1
> +		chk_rm_nr 1 1
> +	fi
>
> 	# subflows and signal with port, flush
> -	reset
> -	pm_nl_set_limits $ns1 0 3
> -	pm_nl_add_endpoint $ns1 10.0.2.1 flags signal port 10100
> -	pm_nl_set_limits $ns2 1 3
> -	pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow
> -	pm_nl_add_endpoint $ns2 10.0.4.2 flags subflow
> -	run_tests $ns1 $ns2 10.0.1.1 0 -8 -2 slow
> -	chk_join_nr "flush subflows and signal with port" 3 3 3
> -	chk_add_nr 1 1
> -	chk_rm_nr 2 2
> +	if reset; then
> +		pm_nl_set_limits $ns1 0 3
> +		pm_nl_add_endpoint $ns1 10.0.2.1 flags signal port 10100
> +		pm_nl_set_limits $ns2 1 3
> +		pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow
> +		pm_nl_add_endpoint $ns2 10.0.4.2 flags subflow
> +		run_tests $ns1 $ns2 10.0.1.1 0 -8 -2 slow
> +		chk_join_nr "flush subflows and signal with port" 3 3 3
> +		chk_add_nr 1 1
> +		chk_rm_nr 2 2
> +	fi
>
> 	# multiple addresses with port
> -	reset
> -	pm_nl_set_limits $ns1 2 2
> -	pm_nl_add_endpoint $ns1 10.0.2.1 flags signal port 10100
> -	pm_nl_add_endpoint $ns1 10.0.3.1 flags signal port 10100
> -	pm_nl_set_limits $ns2 2 2
> -	run_tests $ns1 $ns2 10.0.1.1
> -	chk_join_nr "multiple addresses with port" 2 2 2
> -	chk_add_nr 2 2 2
> +	if reset; then
> +		pm_nl_set_limits $ns1 2 2
> +		pm_nl_add_endpoint $ns1 10.0.2.1 flags signal port 10100
> +		pm_nl_add_endpoint $ns1 10.0.3.1 flags signal port 10100
> +		pm_nl_set_limits $ns2 2 2
> +		run_tests $ns1 $ns2 10.0.1.1
> +		chk_join_nr "multiple addresses with port" 2 2 2
> +		chk_add_nr 2 2 2
> +	fi
>
> 	# multiple addresses with ports
> -	reset
> -	pm_nl_set_limits $ns1 2 2
> -	pm_nl_add_endpoint $ns1 10.0.2.1 flags signal port 10100
> -	pm_nl_add_endpoint $ns1 10.0.3.1 flags signal port 10101
> -	pm_nl_set_limits $ns2 2 2
> -	run_tests $ns1 $ns2 10.0.1.1
> -	chk_join_nr "multiple addresses with ports" 2 2 2
> -	chk_add_nr 2 2 2
> +	if reset; then
> +		pm_nl_set_limits $ns1 2 2
> +		pm_nl_add_endpoint $ns1 10.0.2.1 flags signal port 10100
> +		pm_nl_add_endpoint $ns1 10.0.3.1 flags signal port 10101
> +		pm_nl_set_limits $ns2 2 2
> +		run_tests $ns1 $ns2 10.0.1.1
> +		chk_join_nr "multiple addresses with ports" 2 2 2
> +		chk_add_nr 2 2 2
> +	fi
> }
>
> syncookies_tests()
> {
> 	# single subflow, syncookies
> -	reset_with_cookies
> -	pm_nl_set_limits $ns1 0 1
> -	pm_nl_set_limits $ns2 0 1
> -	pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow
> -	run_tests $ns1 $ns2 10.0.1.1
> -	chk_join_nr "single subflow with syn cookies" 1 1 1
> +	if reset_with_cookies; then
> +		pm_nl_set_limits $ns1 0 1
> +		pm_nl_set_limits $ns2 0 1
> +		pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow
> +		run_tests $ns1 $ns2 10.0.1.1
> +		chk_join_nr "single subflow with syn cookies" 1 1 1
> +	fi
>
> 	# multiple subflows with syn cookies
> -	reset_with_cookies
> -	pm_nl_set_limits $ns1 0 2
> -	pm_nl_set_limits $ns2 0 2
> -	pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow
> -	pm_nl_add_endpoint $ns2 10.0.2.2 flags subflow
> -	run_tests $ns1 $ns2 10.0.1.1
> -	chk_join_nr "multiple subflows with syn cookies" 2 2 2
> +	if reset_with_cookies; then
> +		pm_nl_set_limits $ns1 0 2
> +		pm_nl_set_limits $ns2 0 2
> +		pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow
> +		pm_nl_add_endpoint $ns2 10.0.2.2 flags subflow
> +		run_tests $ns1 $ns2 10.0.1.1
> +		chk_join_nr "multiple subflows with syn cookies" 2 2 2
> +	fi
>
> 	# multiple subflows limited by server
> -	reset_with_cookies
> -	pm_nl_set_limits $ns1 0 1
> -	pm_nl_set_limits $ns2 0 2
> -	pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow
> -	pm_nl_add_endpoint $ns2 10.0.2.2 flags subflow
> -	run_tests $ns1 $ns2 10.0.1.1
> -	chk_join_nr "subflows limited by server w cookies" 2 1 1
> +	if reset_with_cookies; then
> +		pm_nl_set_limits $ns1 0 1
> +		pm_nl_set_limits $ns2 0 2
> +		pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow
> +		pm_nl_add_endpoint $ns2 10.0.2.2 flags subflow
> +		run_tests $ns1 $ns2 10.0.1.1
> +		chk_join_nr "subflows limited by server w cookies" 2 1 1
> +	fi
>
> 	# test signal address with cookies
> -	reset_with_cookies
> -	pm_nl_set_limits $ns1 0 1
> -	pm_nl_set_limits $ns2 1 1
> -	pm_nl_add_endpoint $ns1 10.0.2.1 flags signal
> -	run_tests $ns1 $ns2 10.0.1.1
> -	chk_join_nr "signal address with syn cookies" 1 1 1
> -	chk_add_nr 1 1
> +	if reset_with_cookies; then
> +		pm_nl_set_limits $ns1 0 1
> +		pm_nl_set_limits $ns2 1 1
> +		pm_nl_add_endpoint $ns1 10.0.2.1 flags signal
> +		run_tests $ns1 $ns2 10.0.1.1
> +		chk_join_nr "signal address with syn cookies" 1 1 1
> +		chk_add_nr 1 1
> +	fi
>
> 	# test cookie with subflow and signal
> -	reset_with_cookies
> -	pm_nl_add_endpoint $ns1 10.0.2.1 flags signal
> -	pm_nl_set_limits $ns1 0 2
> -	pm_nl_set_limits $ns2 1 2
> -	pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow
> -	run_tests $ns1 $ns2 10.0.1.1
> -	chk_join_nr "subflow and signal w cookies" 2 2 2
> -	chk_add_nr 1 1
> +	if reset_with_cookies; then
> +		pm_nl_add_endpoint $ns1 10.0.2.1 flags signal
> +		pm_nl_set_limits $ns1 0 2
> +		pm_nl_set_limits $ns2 1 2
> +		pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow
> +		run_tests $ns1 $ns2 10.0.1.1
> +		chk_join_nr "subflow and signal w cookies" 2 2 2
> +		chk_add_nr 1 1
> +	fi
>
> 	# accept and use add_addr with additional subflows
> -	reset_with_cookies
> -	pm_nl_set_limits $ns1 0 3
> -	pm_nl_add_endpoint $ns1 10.0.2.1 flags signal
> -	pm_nl_set_limits $ns2 1 3
> -	pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow
> -	pm_nl_add_endpoint $ns2 10.0.4.2 flags subflow
> -	run_tests $ns1 $ns2 10.0.1.1
> -	chk_join_nr "subflows and signal w. cookies" 3 3 3
> -	chk_add_nr 1 1
> +	if reset_with_cookies; then
> +		pm_nl_set_limits $ns1 0 3
> +		pm_nl_add_endpoint $ns1 10.0.2.1 flags signal
> +		pm_nl_set_limits $ns2 1 3
> +		pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow
> +		pm_nl_add_endpoint $ns2 10.0.4.2 flags subflow
> +		run_tests $ns1 $ns2 10.0.1.1
> +		chk_join_nr "subflows and signal w. cookies" 3 3 3
> +		chk_add_nr 1 1
> +	fi
> }
>
> checksum_tests()
> {
> 	# checksum test 0 0
> -	reset_with_checksum 0 0
> -	pm_nl_set_limits $ns1 0 1
> -	pm_nl_set_limits $ns2 0 1
> -	run_tests $ns1 $ns2 10.0.1.1
> -	chk_csum_nr "checksum test 0 0"
> +	if reset_with_checksum 0 0; then
> +		pm_nl_set_limits $ns1 0 1
> +		pm_nl_set_limits $ns2 0 1
> +		run_tests $ns1 $ns2 10.0.1.1
> +		chk_csum_nr "checksum test 0 0"
> +	fi
>
> 	# checksum test 1 1
> -	reset_with_checksum 1 1
> -	pm_nl_set_limits $ns1 0 1
> -	pm_nl_set_limits $ns2 0 1
> -	run_tests $ns1 $ns2 10.0.1.1
> -	chk_csum_nr "checksum test 1 1"
> +	if reset_with_checksum 1 1; then
> +		pm_nl_set_limits $ns1 0 1
> +		pm_nl_set_limits $ns2 0 1
> +		run_tests $ns1 $ns2 10.0.1.1
> +		chk_csum_nr "checksum test 1 1"
> +	fi
>
> 	# checksum test 0 1
> -	reset_with_checksum 0 1
> -	pm_nl_set_limits $ns1 0 1
> -	pm_nl_set_limits $ns2 0 1
> -	run_tests $ns1 $ns2 10.0.1.1
> -	chk_csum_nr "checksum test 0 1"
> +	if reset_with_checksum 0 1; then
> +		pm_nl_set_limits $ns1 0 1
> +		pm_nl_set_limits $ns2 0 1
> +		run_tests $ns1 $ns2 10.0.1.1
> +		chk_csum_nr "checksum test 0 1"
> +	fi
>
> 	# checksum test 1 0
> -	reset_with_checksum 1 0
> -	pm_nl_set_limits $ns1 0 1
> -	pm_nl_set_limits $ns2 0 1
> -	run_tests $ns1 $ns2 10.0.1.1
> -	chk_csum_nr "checksum test 1 0"
> +	if reset_with_checksum 1 0; then
> +		pm_nl_set_limits $ns1 0 1
> +		pm_nl_set_limits $ns2 0 1
> +		run_tests $ns1 $ns2 10.0.1.1
> +		chk_csum_nr "checksum test 1 0"
> +	fi
> }
>
> deny_join_id0_tests()
> {
> 	# subflow allow join id0 ns1
> -	reset_with_allow_join_id0 1 0
> -	pm_nl_set_limits $ns1 1 1
> -	pm_nl_set_limits $ns2 1 1
> -	pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow
> -	run_tests $ns1 $ns2 10.0.1.1
> -	chk_join_nr "single subflow allow join id0 ns1" 1 1 1
> +	if reset_with_allow_join_id0 1 0; then
> +		pm_nl_set_limits $ns1 1 1
> +		pm_nl_set_limits $ns2 1 1
> +		pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow
> +		run_tests $ns1 $ns2 10.0.1.1
> +		chk_join_nr "single subflow allow join id0 ns1" 1 1 1
> +	fi
>
> 	# subflow allow join id0 ns2
> -	reset_with_allow_join_id0 0 1
> -	pm_nl_set_limits $ns1 1 1
> -	pm_nl_set_limits $ns2 1 1
> -	pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow
> -	run_tests $ns1 $ns2 10.0.1.1
> -	chk_join_nr "single subflow allow join id0 ns2" 0 0 0
> +	if reset_with_allow_join_id0 0 1; then
> +		pm_nl_set_limits $ns1 1 1
> +		pm_nl_set_limits $ns2 1 1
> +		pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow
> +		run_tests $ns1 $ns2 10.0.1.1
> +		chk_join_nr "single subflow allow join id0 ns2" 0 0 0
> +	fi
>
> 	# signal address allow join id0 ns1
> 	# ADD_ADDRs are not affected by allow_join_id0 value.
> -	reset_with_allow_join_id0 1 0
> -	pm_nl_set_limits $ns1 1 1
> -	pm_nl_set_limits $ns2 1 1
> -	pm_nl_add_endpoint $ns1 10.0.2.1 flags signal
> -	run_tests $ns1 $ns2 10.0.1.1
> -	chk_join_nr "signal address allow join id0 ns1" 1 1 1
> -	chk_add_nr 1 1
> +	if reset_with_allow_join_id0 1 0; then
> +		pm_nl_set_limits $ns1 1 1
> +		pm_nl_set_limits $ns2 1 1
> +		pm_nl_add_endpoint $ns1 10.0.2.1 flags signal
> +		run_tests $ns1 $ns2 10.0.1.1
> +		chk_join_nr "signal address allow join id0 ns1" 1 1 1
> +		chk_add_nr 1 1
> +	fi
>
> 	# signal address allow join id0 ns2
> 	# ADD_ADDRs are not affected by allow_join_id0 value.
> -	reset_with_allow_join_id0 0 1
> -	pm_nl_set_limits $ns1 1 1
> -	pm_nl_set_limits $ns2 1 1
> -	pm_nl_add_endpoint $ns1 10.0.2.1 flags signal
> -	run_tests $ns1 $ns2 10.0.1.1
> -	chk_join_nr "signal address allow join id0 ns2" 1 1 1
> -	chk_add_nr 1 1
> +	if reset_with_allow_join_id0 0 1; then
> +		pm_nl_set_limits $ns1 1 1
> +		pm_nl_set_limits $ns2 1 1
> +		pm_nl_add_endpoint $ns1 10.0.2.1 flags signal
> +		run_tests $ns1 $ns2 10.0.1.1
> +		chk_join_nr "signal address allow join id0 ns2" 1 1 1
> +		chk_add_nr 1 1
> +	fi
>
> 	# subflow and address allow join id0 ns1
> -	reset_with_allow_join_id0 1 0
> -	pm_nl_set_limits $ns1 2 2
> -	pm_nl_set_limits $ns2 2 2
> -	pm_nl_add_endpoint $ns1 10.0.2.1 flags signal
> -	pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow
> -	run_tests $ns1 $ns2 10.0.1.1
> -	chk_join_nr "subflow and address allow join id0 1" 2 2 2
> +	if reset_with_allow_join_id0 1 0; then
> +		pm_nl_set_limits $ns1 2 2
> +		pm_nl_set_limits $ns2 2 2
> +		pm_nl_add_endpoint $ns1 10.0.2.1 flags signal
> +		pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow
> +		run_tests $ns1 $ns2 10.0.1.1
> +		chk_join_nr "subflow and address allow join id0 1" 2 2 2
> +	fi
>
> 	# subflow and address allow join id0 ns2
> -	reset_with_allow_join_id0 0 1
> -	pm_nl_set_limits $ns1 2 2
> -	pm_nl_set_limits $ns2 2 2
> -	pm_nl_add_endpoint $ns1 10.0.2.1 flags signal
> -	pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow
> -	run_tests $ns1 $ns2 10.0.1.1
> -	chk_join_nr "subflow and address allow join id0 2" 1 1 1
> +	if reset_with_allow_join_id0 0 1; then
> +		pm_nl_set_limits $ns1 2 2
> +		pm_nl_set_limits $ns2 2 2
> +		pm_nl_add_endpoint $ns1 10.0.2.1 flags signal
> +		pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow
> +		run_tests $ns1 $ns2 10.0.1.1
> +		chk_join_nr "subflow and address allow join id0 2" 1 1 1
> +	fi
> }
>
> fullmesh_tests()
> @@ -2030,148 +2134,162 @@ fullmesh_tests()
> 	# fullmesh 1
> 	# 2 fullmesh addrs in ns2, added before the connection,
> 	# 1 non-fullmesh addr in ns1, added during the connection.
> -	reset
> -	pm_nl_set_limits $ns1 0 4
> -	pm_nl_set_limits $ns2 1 4
> -	pm_nl_add_endpoint $ns2 10.0.2.2 flags subflow,fullmesh
> -	pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow,fullmesh
> -	run_tests $ns1 $ns2 10.0.1.1 0 1 0 slow
> -	chk_join_nr "fullmesh test 2x1" 4 4 4
> -	chk_add_nr 1 1
> +	if reset; then
> +		pm_nl_set_limits $ns1 0 4
> +		pm_nl_set_limits $ns2 1 4
> +		pm_nl_add_endpoint $ns2 10.0.2.2 flags subflow,fullmesh
> +		pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow,fullmesh
> +		run_tests $ns1 $ns2 10.0.1.1 0 1 0 slow
> +		chk_join_nr "fullmesh test 2x1" 4 4 4
> +		chk_add_nr 1 1
> +	fi
>
> 	# fullmesh 2
> 	# 1 non-fullmesh addr in ns1, added before the connection,
> 	# 1 fullmesh addr in ns2, added during the connection.
> -	reset
> -	pm_nl_set_limits $ns1 1 3
> -	pm_nl_set_limits $ns2 1 3
> -	pm_nl_add_endpoint $ns1 10.0.2.1 flags signal
> -	run_tests $ns1 $ns2 10.0.1.1 0 0 fullmesh_1 slow
> -	chk_join_nr "fullmesh test 1x1" 3 3 3
> -	chk_add_nr 1 1
> +	if reset; then
> +		pm_nl_set_limits $ns1 1 3
> +		pm_nl_set_limits $ns2 1 3
> +		pm_nl_add_endpoint $ns1 10.0.2.1 flags signal
> +		run_tests $ns1 $ns2 10.0.1.1 0 0 fullmesh_1 slow
> +		chk_join_nr "fullmesh test 1x1" 3 3 3
> +		chk_add_nr 1 1
> +	fi
>
> 	# fullmesh 3
> 	# 1 non-fullmesh addr in ns1, added before the connection,
> 	# 2 fullmesh addrs in ns2, added during the connection.
> -	reset
> -	pm_nl_set_limits $ns1 2 5
> -	pm_nl_set_limits $ns2 1 5
> -	pm_nl_add_endpoint $ns1 10.0.2.1 flags signal
> -	run_tests $ns1 $ns2 10.0.1.1 0 0 fullmesh_2 slow
> -	chk_join_nr "fullmesh test 1x2" 5 5 5
> -	chk_add_nr 1 1
> +	if reset; then
> +		pm_nl_set_limits $ns1 2 5
> +		pm_nl_set_limits $ns2 1 5
> +		pm_nl_add_endpoint $ns1 10.0.2.1 flags signal
> +		run_tests $ns1 $ns2 10.0.1.1 0 0 fullmesh_2 slow
> +		chk_join_nr "fullmesh test 1x2" 5 5 5
> +		chk_add_nr 1 1
> +	fi
>
> 	# fullmesh 4
> 	# 1 non-fullmesh addr in ns1, added before the connection,
> 	# 2 fullmesh addrs in ns2, added during the connection,
> 	# limit max_subflows to 4.
> -	reset
> -	pm_nl_set_limits $ns1 2 4
> -	pm_nl_set_limits $ns2 1 4
> -	pm_nl_add_endpoint $ns1 10.0.2.1 flags signal
> -	run_tests $ns1 $ns2 10.0.1.1 0 0 fullmesh_2 slow
> -	chk_join_nr "fullmesh test 1x2, limited" 4 4 4
> -	chk_add_nr 1 1
> +	if reset; then
> +		pm_nl_set_limits $ns1 2 4
> +		pm_nl_set_limits $ns2 1 4
> +		pm_nl_add_endpoint $ns1 10.0.2.1 flags signal
> +		run_tests $ns1 $ns2 10.0.1.1 0 0 fullmesh_2 slow
> +		chk_join_nr "fullmesh test 1x2, limited" 4 4 4
> +		chk_add_nr 1 1
> +	fi
>
> 	# set fullmesh flag
> -	reset
> -	pm_nl_set_limits $ns1 4 4
> -	pm_nl_add_endpoint $ns1 10.0.2.1 flags subflow
> -	pm_nl_set_limits $ns2 4 4
> -	run_tests $ns1 $ns2 10.0.1.1 0 0 1 slow fullmesh
> -	chk_join_nr "set fullmesh flag test" 2 2 2
> -	chk_rm_nr 0 1
> +	if reset; then
> +		pm_nl_set_limits $ns1 4 4
> +		pm_nl_add_endpoint $ns1 10.0.2.1 flags subflow
> +		pm_nl_set_limits $ns2 4 4
> +		run_tests $ns1 $ns2 10.0.1.1 0 0 1 slow fullmesh
> +		chk_join_nr "set fullmesh flag test" 2 2 2
> +		chk_rm_nr 0 1
> +	fi
>
> 	# set nofullmesh flag
> -	reset
> -	pm_nl_set_limits $ns1 4 4
> -	pm_nl_add_endpoint $ns1 10.0.2.1 flags subflow,fullmesh
> -	pm_nl_set_limits $ns2 4 4
> -	run_tests $ns1 $ns2 10.0.1.1 0 0 fullmesh_1 slow nofullmesh
> -	chk_join_nr "set nofullmesh flag test" 2 2 2
> -	chk_rm_nr 0 1
> +	if reset; then
> +		pm_nl_set_limits $ns1 4 4
> +		pm_nl_add_endpoint $ns1 10.0.2.1 flags subflow,fullmesh
> +		pm_nl_set_limits $ns2 4 4
> +		run_tests $ns1 $ns2 10.0.1.1 0 0 fullmesh_1 slow nofullmesh
> +		chk_join_nr "set nofullmesh flag test" 2 2 2
> +		chk_rm_nr 0 1
> +	fi
>
> 	# set backup,fullmesh flags
> -	reset
> -	pm_nl_set_limits $ns1 4 4
> -	pm_nl_add_endpoint $ns1 10.0.2.1 flags subflow
> -	pm_nl_set_limits $ns2 4 4
> -	run_tests $ns1 $ns2 10.0.1.1 0 0 1 slow backup,fullmesh
> -	chk_join_nr "set backup,fullmesh flags test" 2 2 2
> -	chk_prio_nr 0 1
> -	chk_rm_nr 0 1
> +	if reset; then
> +		pm_nl_set_limits $ns1 4 4
> +		pm_nl_add_endpoint $ns1 10.0.2.1 flags subflow
> +		pm_nl_set_limits $ns2 4 4
> +		run_tests $ns1 $ns2 10.0.1.1 0 0 1 slow backup,fullmesh
> +		chk_join_nr "set backup,fullmesh flags test" 2 2 2
> +		chk_prio_nr 0 1
> +		chk_rm_nr 0 1
> +	fi
>
> 	# set nobackup,nofullmesh flags
> -	reset
> -	pm_nl_set_limits $ns1 4 4
> -	pm_nl_set_limits $ns2 4 4
> -	pm_nl_add_endpoint $ns2 10.0.2.2 flags subflow,backup,fullmesh
> -	run_tests $ns1 $ns2 10.0.1.1 0 0 0 slow nobackup,nofullmesh
> -	chk_join_nr "set nobackup,nofullmesh flags test" 2 2 2
> -	chk_prio_nr 0 1
> -	chk_rm_nr 0 1
> +	if reset; then
> +		pm_nl_set_limits $ns1 4 4
> +		pm_nl_set_limits $ns2 4 4
> +		pm_nl_add_endpoint $ns2 10.0.2.2 flags subflow,backup,fullmesh
> +		run_tests $ns1 $ns2 10.0.1.1 0 0 0 slow nobackup,nofullmesh
> +		chk_join_nr "set nobackup,nofullmesh flags test" 2 2 2
> +		chk_prio_nr 0 1
> +		chk_rm_nr 0 1
> +	fi
> }
>
> userspace_tests()
> {
> 	# userspace pm type prevents add_addr
> -	reset
> -	ip netns exec $ns1 sysctl -q net.mptcp.pm_type=1
> -	ip netns exec $ns1 ./pm_nl_ctl limits 0 2
> -	ip netns exec $ns2 ./pm_nl_ctl limits 0 2
> -	ip netns exec $ns1 ./pm_nl_ctl add 10.0.2.1 flags signal
> -	run_tests $ns1 $ns2 10.0.1.1
> -	chk_join_nr "userspace pm type prevents add_addr" 0 0 0
> -	chk_add_nr 0 0
> +	if reset; then
> +		ip netns exec $ns1 sysctl -q net.mptcp.pm_type=1
> +		ip netns exec $ns1 ./pm_nl_ctl limits 0 2
> +		ip netns exec $ns2 ./pm_nl_ctl limits 0 2
> +		ip netns exec $ns1 ./pm_nl_ctl add 10.0.2.1 flags signal
> +		run_tests $ns1 $ns2 10.0.1.1
> +		chk_join_nr "userspace pm type prevents add_addr" 0 0 0
> +		chk_add_nr 0 0
> +	fi
>
> 	# userspace pm type echoes add_addr
> -	reset
> -	ip netns exec $ns2 sysctl -q net.mptcp.pm_type=1
> -	ip netns exec $ns1 ./pm_nl_ctl limits 0 2
> -	ip netns exec $ns2 ./pm_nl_ctl limits 0 2
> -	ip netns exec $ns1 ./pm_nl_ctl add 10.0.2.1 flags signal
> -	run_tests $ns1 $ns2 10.0.1.1
> -	chk_join_nr "userspace pm type echoes add_addr" 0 0 0
> -	chk_add_nr 1 1
> +	if reset; then
> +		ip netns exec $ns2 sysctl -q net.mptcp.pm_type=1
> +		ip netns exec $ns1 ./pm_nl_ctl limits 0 2
> +		ip netns exec $ns2 ./pm_nl_ctl limits 0 2
> +		ip netns exec $ns1 ./pm_nl_ctl add 10.0.2.1 flags signal
> +		run_tests $ns1 $ns2 10.0.1.1
> +		chk_join_nr "userspace pm type echoes add_addr" 0 0 0
> +		chk_add_nr 1 1
> +	fi
>
> 	# userspace pm type rejects join
> -	reset
> -	ip netns exec $ns1 sysctl -q net.mptcp.pm_type=1
> -	ip netns exec $ns1 ./pm_nl_ctl limits 1 1
> -	ip netns exec $ns2 ./pm_nl_ctl limits 1 1
> -	ip netns exec $ns2 ./pm_nl_ctl add 10.0.3.2 flags subflow
> -	run_tests $ns1 $ns2 10.0.1.1
> -	chk_join_nr "userspace pm type rejects join" 1 1 0
> +	if reset; then
> +		ip netns exec $ns1 sysctl -q net.mptcp.pm_type=1
> +		ip netns exec $ns1 ./pm_nl_ctl limits 1 1
> +		ip netns exec $ns2 ./pm_nl_ctl limits 1 1
> +		ip netns exec $ns2 ./pm_nl_ctl add 10.0.3.2 flags subflow
> +		run_tests $ns1 $ns2 10.0.1.1
> +		chk_join_nr "userspace pm type rejects join" 1 1 0
> +	fi
>
> 	# userspace pm type does not send join
> -	reset
> -	ip netns exec $ns2 sysctl -q net.mptcp.pm_type=1
> -	ip netns exec $ns1 ./pm_nl_ctl limits 1 1
> -	ip netns exec $ns2 ./pm_nl_ctl limits 1 1
> -	ip netns exec $ns2 ./pm_nl_ctl add 10.0.3.2 flags subflow
> -	run_tests $ns1 $ns2 10.0.1.1
> -	chk_join_nr "userspace pm type does not send join" 0 0 0
> +	if reset; then
> +		ip netns exec $ns2 sysctl -q net.mptcp.pm_type=1
> +		ip netns exec $ns1 ./pm_nl_ctl limits 1 1
> +		ip netns exec $ns2 ./pm_nl_ctl limits 1 1
> +		ip netns exec $ns2 ./pm_nl_ctl add 10.0.3.2 flags subflow
> +		run_tests $ns1 $ns2 10.0.1.1
> +		chk_join_nr "userspace pm type does not send join" 0 0 0
> +	fi
>
> 	# userspace pm type prevents mp_prio
> -	reset
> -	ip netns exec $ns1 sysctl -q net.mptcp.pm_type=1
> -	ip netns exec $ns1 ./pm_nl_ctl limits 1 1
> -	ip netns exec $ns2 ./pm_nl_ctl limits 1 1
> -	ip netns exec $ns2 ./pm_nl_ctl add 10.0.3.2 flags subflow
> -	run_tests $ns1 $ns2 10.0.1.1 0 0 0 slow backup
> -	chk_join_nr "userspace pm type prevents mp_prio" 1 1 0
> -	chk_prio_nr 0 0
> +	if reset; then
> +		ip netns exec $ns1 sysctl -q net.mptcp.pm_type=1
> +		ip netns exec $ns1 ./pm_nl_ctl limits 1 1
> +		ip netns exec $ns2 ./pm_nl_ctl limits 1 1
> +		ip netns exec $ns2 ./pm_nl_ctl add 10.0.3.2 flags subflow
> +		run_tests $ns1 $ns2 10.0.1.1 0 0 0 slow backup
> +		chk_join_nr "userspace pm type prevents mp_prio" 1 1 0
> +		chk_prio_nr 0 0
> +	fi
>
> 	# userspace pm type prevents rm_addr
> -	reset
> -	ip netns exec $ns1 sysctl -q net.mptcp.pm_type=1
> -	ip netns exec $ns2 sysctl -q net.mptcp.pm_type=1
> -	ip netns exec $ns1 ./pm_nl_ctl limits 0 1
> -	ip netns exec $ns2 ./pm_nl_ctl limits 0 1
> -	ip netns exec $ns2 ./pm_nl_ctl add 10.0.3.2 flags subflow
> -	run_tests $ns1 $ns2 10.0.1.1 0 0 -1 slow
> -	chk_join_nr "userspace pm type prevents rm_addr" 0 0 0
> -	chk_rm_nr 0 0
> +	if reset; then
> +		ip netns exec $ns1 sysctl -q net.mptcp.pm_type=1
> +		ip netns exec $ns2 sysctl -q net.mptcp.pm_type=1
> +		ip netns exec $ns1 ./pm_nl_ctl limits 0 1
> +		ip netns exec $ns2 ./pm_nl_ctl limits 0 1
> +		ip netns exec $ns2 ./pm_nl_ctl add 10.0.3.2 flags subflow
> +		run_tests $ns1 $ns2 10.0.1.1 0 0 -1 slow
> +		chk_join_nr "userspace pm type prevents rm_addr" 0 0 0
> +		chk_rm_nr 0 0
> +	fi
> }
>
> all_tests()
> @@ -2250,7 +2368,13 @@ for arg in "$@"; do
> 	fi
>
> 	# exception for the capture/checksum/ip_mptcp options, the rest means: a part of the tests
> -	if ! [[ "${arg}" =~ ^"-"[cCi]+$ ]]; then
> +	if ! [[ "${arg}" =~ ^"-" ]]; then
> +		if [[ "${arg}" =~ ^[0-9]+$ ]]; then
> +			ONLY_TESTS+=("${arg}")
> +		else
> +			usage "Unknown option: ${arg}"
> +		fi
> +	elif ! [[ "${arg}" =~ ^"-"[cCi]+$ ]]; then
> 		do_all_tests=0
> 	fi
> done
> -- 
> 2.34.1
>
>
>

--
Mat Martineau
Intel

^ permalink raw reply	[flat|nested] 20+ messages in thread

* Re: [PATCH mptcp-next 3/9] selftests: mptcp: join: option to execute specific tests
  2022-02-10  0:36   ` Mat Martineau
@ 2022-02-10 10:04     ` Paolo Abeni
  2022-02-10 10:42       ` Matthieu Baerts
  0 siblings, 1 reply; 20+ messages in thread
From: Paolo Abeni @ 2022-02-10 10:04 UTC (permalink / raw)
  To: Mat Martineau, Matthieu Baerts; +Cc: mptcp

On Wed, 2022-02-09 at 16:36 -0800, Mat Martineau wrote:
> On Wed, 9 Feb 2022, Matthieu Baerts wrote:
> 
> > Often, it is needed to run one specific test.
> > 
> > There are options to run subgroups of tests but when only one fails, no
> > need to run all the subgroup. So far, the solution was to edit the
> > script to comment the tests that are not needed but that's not ideal.
> > 
> > Now, it is possible to run one specific test by giving the ID of the
> > tests that are going to be validated, e.g.
> > 
> >  ./mptcp_join.sh 36 37
> > 
> > This is cleaner and saves time.
> > 
> > Technically, the reset* functions now return 0 if the test can be
> > executed. This naturally creates sections per test in the code which is
> > also helpful to understand what a test is exactly doing.
> > 
> 
> My sense is that this is primarily for development purposes since the test 
> numbers may shift as tests are added or modified. Is it worth the churn 
> when we have the subgroup functionality and could comment out chunks of 
> the test script that are not useful for running specific tests in a loop?
> 
> I'm not set against this change, but hoping to discuss it some more to 
> both understand the benefits (I assume for running CI in a loop?) and to 
> see if anyone has bright ideas for avoiding the whitespace churn.
> 
> ("Include a bash fork in our selftest code that implements 'goto'" seems 
> like overkill :) )

Perhapas something alike the following ?!? Not a complete solution:
- completely not tested
- we will first need to add some wrapper for iptables or even beffer
for ip netns exec, to be more generic
- possibly more 'skip_test && return' needed, but not many, I guess.

I hope should be enough demonstrate the idea...
---
diff --git a/tools/testing/selftests/net/mptcp/mptcp_join.sh
b/tools/testing/selftests/net/mptcp/mptcp_join.sh
index 29623d7ad415..4199d7404f10 100755
--- a/tools/testing/selftests/net/mptcp/mptcp_join.sh
+++ b/tools/testing/selftests/net/mptcp/mptcp_join.sh
@@ -113,6 +113,7 @@ reset()
 
 reset_with_cookies()
 {
+	skip_test && return
 	reset
 
 	for netns in "$ns1" "$ns2";do
@@ -125,6 +126,7 @@ reset_with_add_addr_timeout()
 	local ip="${1:-4}"
 	local tables
 
+	skip_test && return
 	tables="iptables"
 	if [ $ip -eq 6 ]; then
 		tables="ip6tables"
@@ -145,6 +147,7 @@ reset_with_checksum()
 	local ns1_enable=$1
 	local ns2_enable=$2
 
+	skip_test && return
 	reset
 
 	ip netns exec $ns1 sysctl -q
net.mptcp.checksum_enabled=$ns1_enable
@@ -156,6 +159,7 @@ reset_with_allow_join_id0()
 	local ns1_enable=$1
 	local ns2_enable=$2
 
+	skip_test && return
 	reset
 
 	ip netns exec $ns1 sysctl -q
net.mptcp.allow_join_initial_addr_port=$ns1_enable
@@ -295,6 +299,7 @@ pm_nl_set_limits()
 	local addrs=$2
 	local subflows=$3
 
+	skip_test && return
 	if [ $ip_mptcp -eq 1 ]; then
 		ip -n $ns mptcp limits set add_addr_accepted $addrs
subflows $subflows
 	else
@@ -312,6 +317,7 @@ pm_nl_add_endpoint()
 	local id
 	local nr=2
 
+	skip_test && return
 	for p in $@
 	do
 		if [ $p = "flags" ]; then
@@ -689,6 +695,7 @@ run_tests()
 	lret=0
 	oldin=""
 
+	skip_test && return
 	# create the input file for the failure test when
 	# the first failure test run
 	if [ "$test_linkfail" -ne 0 -a -z "$cinfail" ]; then
@@ -732,6 +739,7 @@ chk_csum_nr()
 	local count
 	local dump_stats
 
+	skip_test && return
 	if [ ! -z "$msg" ]; then
 		printf "%02u" "$TEST_COUNT"
 	else
@@ -767,6 +775,7 @@ chk_fail_nr()
 	local count
 	local dump_stats
 
+	skip_test && return
 	printf "%-39s %s" " " "ftx"
 	count=`ip netns exec $ns1 nstat -as | grep MPTcpExtMPFailTx |
awk '{print $2}'`
 	[ -z "$count" ] && count=0
@@ -801,6 +810,7 @@ chk_join_nr()
 	local count
 	local dump_stats
 
+	skip_test && return
 	printf "%02u %-36s %s" "$TEST_COUNT" "$msg" "syn"
 	count=`ip netns exec $ns1 nstat -as | grep MPTcpExtMPJoinSynRx
| awk '{print $2}'`
 	[ -z "$count" ] && count=0
@@ -855,6 +865,7 @@ chk_stale_nr()
 	local stale_nr
 	local recover_nr
 
+	skip_test && return
 	printf "%-39s %-18s" " " "stale"
 	stale_nr=`ip netns exec $ns nstat -as | grep
MPTcpExtSubflowStale | awk '{print $2}'`
 	[ -z "$stale_nr" ] && stale_nr=0
@@ -893,6 +904,7 @@ chk_add_nr()
 	local count
 	local dump_stats
 
+	skip_test && return
 	printf "%-39s %s" " " "add"
 	count=`ip netns exec $ns2 nstat -as | grep MPTcpExtAddAddr |
awk '{print $2}'`
 	[ -z "$count" ] && count=0
@@ -1008,6 +1020,7 @@ chk_rm_nr()
 	local addr_ns
 	local subflow_ns
 
+	skip_test && return
 	if [ -z $invert ]; then
 		addr_ns=$ns1
 		subflow_ns=$ns2
@@ -1048,6 +1061,7 @@ chk_prio_nr()
 	local count
 	local dump_stats
 
+	skip_test && return
 	printf "%-39s %s" " " "ptx"
 	count=`ip netns exec $ns1 nstat -as | grep MPTcpExtMPPrioTx |
awk '{print $2}'`
 	[ -z "$count" ] && count=0
@@ -1084,6 +1098,7 @@ chk_link_usage()
 	local tx_rate=$((tx_link * 100 / $tx_total))
 	local tolerance=5
 
+	skip_test && return
 	printf "%-39s %-18s" " " "link usage"
 	if [ $tx_rate -lt $((expected_rate - $tolerance)) -o \
 	     $tx_rate -gt $((expected_rate + $tolerance)) ]; then


^ permalink raw reply related	[flat|nested] 20+ messages in thread

* Re: [PATCH mptcp-next 3/9] selftests: mptcp: join: option to execute specific tests
  2022-02-10 10:04     ` Paolo Abeni
@ 2022-02-10 10:42       ` Matthieu Baerts
  2022-02-10 15:11         ` Paolo Abeni
  0 siblings, 1 reply; 20+ messages in thread
From: Matthieu Baerts @ 2022-02-10 10:42 UTC (permalink / raw)
  To: Paolo Abeni, Mat Martineau; +Cc: mptcp

Hi Mat, Paolo,

On 10/02/2022 11:04, Paolo Abeni wrote:
> On Wed, 2022-02-09 at 16:36 -0800, Mat Martineau wrote:
>> On Wed, 9 Feb 2022, Matthieu Baerts wrote:
>>
>>> Often, it is needed to run one specific test.
>>>
>>> There are options to run subgroups of tests but when only one fails, no
>>> need to run all the subgroup. So far, the solution was to edit the
>>> script to comment the tests that are not needed but that's not ideal.
>>>
>>> Now, it is possible to run one specific test by giving the ID of the
>>> tests that are going to be validated, e.g.
>>>
>>>  ./mptcp_join.sh 36 37
>>>
>>> This is cleaner and saves time.
>>>
>>> Technically, the reset* functions now return 0 if the test can be
>>> executed. This naturally creates sections per test in the code which is
>>> also helpful to understand what a test is exactly doing.
>>>
>>
>> My sense is that this is primarily for development purposes since the test 
>> numbers may shift as tests are added or modified. Is it worth the churn 
>> when we have the subgroup functionality and could comment out chunks of 
>> the test script that are not useful for running specific tests in a loop?

On my side, it would be helpful. On my side, I can edit the code but
that's not nice, especially if you want to automate tests with and
without a patch: you can have conflicts with the new comments, etc.

On the CI, I cannot easily modify the code so I end up testing more than
expected, that's slow and sometimes hits other issues.

I guess on Paolo's side too as he complained about this missing feature :)

>> I'm not set against this change, but hoping to discuss it some more to 
>> both understand the benefits (I assume for running CI in a loop?) and to 
>> see if anyone has bright ideas for avoiding the whitespace churn.
>>
>> ("Include a bash fork in our selftest code that implements 'goto'" seems 
>> like overkill :) )
> 
> Perhapas something alike the following ?!? Not a complete solution:
> - completely not tested
> - we will first need to add some wrapper for iptables or even beffer
> for ip netns exec, to be more generic
> - possibly more 'skip_test && return' needed, but not many, I guess.
> 
> I hope should be enough demonstrate the idea...

If we really want to avoid modifying existing lines in selftests, I can
also not add new tabs after the new "if reset" and drop patches 7-9. But
that's a shame we cannot refactor the code in the selftests :-/

I don't think it is a good idea to add the skip_test everywhere: we will
certainly forgot to add one somewhere until someone test the feature.

Cheers,
Matt
-- 
Tessares | Belgium | Hybrid Access Solutions
www.tessares.net

^ permalink raw reply	[flat|nested] 20+ messages in thread

* Re: [PATCH mptcp-next 1/9] selftests: mptcp: join: allow running -cCi
  2022-02-09 21:25 ` [PATCH mptcp-next 1/9] selftests: mptcp: join: allow running -cCi Matthieu Baerts
@ 2022-02-10 14:53   ` Paolo Abeni
  2022-02-11 17:30     ` Matthieu Baerts
  0 siblings, 1 reply; 20+ messages in thread
From: Paolo Abeni @ 2022-02-10 14:53 UTC (permalink / raw)
  To: Matthieu Baerts, mptcp

On Wed, 2022-02-09 at 22:25 +0100, Matthieu Baerts wrote:
> Without this patch, no tests would be ran when launching:
> 
>   mptcp_join.sh -cCi
> 
> In any order or a combination with 2 of these letters.
> 
> Signed-off-by: Matthieu Baerts <matthieu.baerts@tessares.net>
> ---
>  tools/testing/selftests/net/mptcp/mptcp_join.sh | 2 +-
>  1 file changed, 1 insertion(+), 1 deletion(-)
> 
> diff --git a/tools/testing/selftests/net/mptcp/mptcp_join.sh b/tools/testing/selftests/net/mptcp/mptcp_join.sh
> index 66ac990415e6..9bbb95837f73 100755
> --- a/tools/testing/selftests/net/mptcp/mptcp_join.sh
> +++ b/tools/testing/selftests/net/mptcp/mptcp_join.sh
> @@ -2242,7 +2242,7 @@ for arg in "$@"; do
>  	fi
>  
>  	# exception for the capture/checksum/ip_mptcp options, the rest means: a part of the tests
> -	if [ "${arg}" != "-c" ] && [ "${arg}" != "-C" ] && [ "${arg}" != "-i" ]; then
> +	if ! [[ "${arg}" =~ ^"-"[cCi]+$ ]]; then
>  		do_all_tests=0
>  	fi
>  done

At this point I think it would be better consolidate argument parsing
with getopts, and dropping the above regexp.

While parsing the test group selectors, we could build the list of 
groups to be executed (possibly a string contaning all the function to
be invoked), and run them after argument parsing - or run all if such
list (string) is empty

/P


^ permalink raw reply	[flat|nested] 20+ messages in thread

* Re: [PATCH mptcp-next 3/9] selftests: mptcp: join: option to execute specific tests
  2022-02-10 10:42       ` Matthieu Baerts
@ 2022-02-10 15:11         ` Paolo Abeni
  2022-02-16 15:50           ` Matthieu Baerts
  0 siblings, 1 reply; 20+ messages in thread
From: Paolo Abeni @ 2022-02-10 15:11 UTC (permalink / raw)
  To: Matthieu Baerts, Mat Martineau; +Cc: mptcp

On Thu, 2022-02-10 at 11:42 +0100, Matthieu Baerts wrote:
> On 10/02/2022 11:04, Paolo Abeni wrote:
> > On Wed, 2022-02-09 at 16:36 -0800, Mat Martineau wrote:
> > > On Wed, 9 Feb 2022, Matthieu Baerts wrote:
> > > 
> > > > Often, it is needed to run one specific test.
> > > > 
> > > > There are options to run subgroups of tests but when only one fails, no
> > > > need to run all the subgroup. So far, the solution was to edit the
> > > > script to comment the tests that are not needed but that's not ideal.
> > > > 
> > > > Now, it is possible to run one specific test by giving the ID of the
> > > > tests that are going to be validated, e.g.
> > > > 
> > > >  ./mptcp_join.sh 36 37
> > > > 
> > > > This is cleaner and saves time.
> > > > 
> > > > Technically, the reset* functions now return 0 if the test can be
> > > > executed. This naturally creates sections per test in the code which is
> > > > also helpful to understand what a test is exactly doing.
> > > > 
> > > 
> > > My sense is that this is primarily for development purposes since the test 
> > > numbers may shift as tests are added or modified. Is it worth the churn 
> > > when we have the subgroup functionality and could comment out chunks of 
> > > the test script that are not useful for running specific tests in a loop?
> 
> On my side, it would be helpful. On my side, I can edit the code but
> that's not nice, especially if you want to automate tests with and
> without a patch: you can have conflicts with the new comments, etc.
> 
> On the CI, I cannot easily modify the code so I end up testing more than
> expected, that's slow and sometimes hits other issues.
> 
> I guess on Paolo's side too as he complained about this missing feature :)
> 
> > > I'm not set against this change, but hoping to discuss it some more to 
> > > both understand the benefits (I assume for running CI in a loop?) and to 
> > > see if anyone has bright ideas for avoiding the whitespace churn.
> > > 
> > > ("Include a bash fork in our selftest code that implements 'goto'" seems 
> > > like overkill :) )
> > 
> > Perhapas something alike the following ?!? Not a complete solution:
> > - completely not tested
> > - we will first need to add some wrapper for iptables or even beffer
> > for ip netns exec, to be more generic
> > - possibly more 'skip_test && return' needed, but not many, I guess.
> > 
> > I hope should be enough demonstrate the idea...
> 
> If we really want to avoid modifying existing lines in selftests, I can
> also not add new tabs after the new "if reset" and drop patches 7-9. But
> that's a shame we cannot refactor the code in the selftests :-/
> 
> I don't think it is a good idea to add the skip_test everywhere: we will
> certainly forgot to add one somewhere until someone test the feature.

skip_test will be needed "only" in the helper called directly from the
test body. I think the shared chunk already touches all the existing
one.

Validating should be simple (assuming the current number of mpj
testacase is 100): 

---
for I in $(seq 1 100); do
	./mptcp_join.sh $I
done > out

test=$(grep -c "\d\d\d " out)
if [ $test = 100 ]; then
	echo ok
else
	echo paolo is dumb!
fi
---
/P


^ permalink raw reply	[flat|nested] 20+ messages in thread

* Re: [PATCH mptcp-next 1/9] selftests: mptcp: join: allow running -cCi
  2022-02-10 14:53   ` Paolo Abeni
@ 2022-02-11 17:30     ` Matthieu Baerts
  2022-02-11 18:56       ` Paolo Abeni
  0 siblings, 1 reply; 20+ messages in thread
From: Matthieu Baerts @ 2022-02-11 17:30 UTC (permalink / raw)
  To: Paolo Abeni, mptcp

Hi Paolo,

On 10/02/2022 15:53, Paolo Abeni wrote:
> On Wed, 2022-02-09 at 22:25 +0100, Matthieu Baerts wrote:
>> Without this patch, no tests would be ran when launching:
>>
>>   mptcp_join.sh -cCi
>>
>> In any order or a combination with 2 of these letters.
>>
>> Signed-off-by: Matthieu Baerts <matthieu.baerts@tessares.net>
>> ---
>>  tools/testing/selftests/net/mptcp/mptcp_join.sh | 2 +-
>>  1 file changed, 1 insertion(+), 1 deletion(-)
>>
>> diff --git a/tools/testing/selftests/net/mptcp/mptcp_join.sh b/tools/testing/selftests/net/mptcp/mptcp_join.sh
>> index 66ac990415e6..9bbb95837f73 100755
>> --- a/tools/testing/selftests/net/mptcp/mptcp_join.sh
>> +++ b/tools/testing/selftests/net/mptcp/mptcp_join.sh
>> @@ -2242,7 +2242,7 @@ for arg in "$@"; do
>>  	fi
>>  
>>  	# exception for the capture/checksum/ip_mptcp options, the rest means: a part of the tests
>> -	if [ "${arg}" != "-c" ] && [ "${arg}" != "-C" ] && [ "${arg}" != "-i" ]; then
>> +	if ! [[ "${arg}" =~ ^"-"[cCi]+$ ]]; then
>>  		do_all_tests=0
>>  	fi
>>  done
> 
> At this point I think it would be better consolidate argument parsing
> with getopts, and dropping the above regexp.
> 
> While parsing the test group selectors, we could build the list of 
> groups to be executed (possibly a string contaning all the function to
> be invoked), and run them after argument parsing - or run all if such
> list (string) is empty

I just applied the patches in our tree and saw this message after, sorry
about that.

Indeed, good idea, that would be the proper way to handle options!
It would also be good not to do anything if the -h option is given with
others.

I will try to remember about this idea next time I modify this part! I
can also remove this commit from our tree if you prefer.

Cheers,
Matt
-- 
Tessares | Belgium | Hybrid Access Solutions
www.tessares.net

^ permalink raw reply	[flat|nested] 20+ messages in thread

* Re: [PATCH mptcp-next 0/9] Refactor mptcp_join.sh
  2022-02-10  0:22 ` [PATCH mptcp-next 0/9] Refactor mptcp_join.sh Mat Martineau
@ 2022-02-11 17:34   ` Matthieu Baerts
  0 siblings, 0 replies; 20+ messages in thread
From: Matthieu Baerts @ 2022-02-11 17:34 UTC (permalink / raw)
  To: Mat Martineau; +Cc: mptcp

Hi Mat, Paolo,

On 10/02/2022 01:22, Mat Martineau wrote:
> On Wed, 9 Feb 2022, Matthieu Baerts wrote:
> 
>> I started this series to be able to launch a specific test without
>> having to modify the script to comment tests from the subgroup I didn't
>> want to validate when trying to reproduce a specific issue in a loop.
>> That's what we can find in patch 3/9.
>>
>> While at it, I:
>> - fixed one issue with the options (patch 1/9)
>> - stop if an option doesn't exist (patch 2/9)
>> - removed unused vars (patch 4/9)
>> - delay some actions to the first test not to do them if no test is
>>  launched (patches 5-6/9)
>>
>> But after having seen all modified lines, why stopping there? So I:
>> - clarify local vs global variables to avoid Bash's classical pitfall
>>  (patch 7/9)
>> - fixed all issues reported by ShellCheck except one (patch 8-9/9)
>>
>> These last 3 patches (+ patch 3/9) will create a lot of conflicts. If
>> we are OK with them, probably best not to wait to long before applying
>> them to avoid big rebases.
> 
> I think 1, 2, 4, 5, and 6 look good for the export branch now:
> 
> Reviewed-by: Mat Martineau <mathew.j.martineau@linux.intel.com>

Thank you for the reviews!

I just applied these 5 patches to our tree with your RvB tag (and fixed
s/KSFT_SKIP/ksft_skip/g I left by mistake when splitting commits).

- 1e4cd0e4eae7: selftests: mptcp: join: allow running -cCi
- 251e4354c1c0: selftests: mptcp: join: exit after usage()
- 7e59a8ad9b44: selftests: mptcp: join: remove unused vars
- 739ef6848c45: selftests: mptcp: join: create tmp files only if needed
- 50c4db8022d3: selftests: mptcp: join: check for tools only if needed
- Results: 178780fe8241..dd0f23150c09

I will look at the other patches from this series later.

Builds and tests are now in progress:



https://cirrus-ci.com/github/multipath-tcp/mptcp_net-next/export/20220211T173324

https://github.com/multipath-tcp/mptcp_net-next/actions/workflows/build-validation.yml?query=branch:export

Cheers,
Matt
-- 
Tessares | Belgium | Hybrid Access Solutions
www.tessares.net

^ permalink raw reply	[flat|nested] 20+ messages in thread

* Re: [PATCH mptcp-next 1/9] selftests: mptcp: join: allow running -cCi
  2022-02-11 17:30     ` Matthieu Baerts
@ 2022-02-11 18:56       ` Paolo Abeni
  0 siblings, 0 replies; 20+ messages in thread
From: Paolo Abeni @ 2022-02-11 18:56 UTC (permalink / raw)
  To: Matthieu Baerts, mptcp

On Fri, 2022-02-11 at 18:30 +0100, Matthieu Baerts wrote:
> Hi Paolo,
> 
> On 10/02/2022 15:53, Paolo Abeni wrote:
> > On Wed, 2022-02-09 at 22:25 +0100, Matthieu Baerts wrote:
> > > Without this patch, no tests would be ran when launching:
> > > 
> > >   mptcp_join.sh -cCi
> > > 
> > > In any order or a combination with 2 of these letters.
> > > 
> > > Signed-off-by: Matthieu Baerts <matthieu.baerts@tessares.net>
> > > ---
> > >  tools/testing/selftests/net/mptcp/mptcp_join.sh | 2 +-
> > >  1 file changed, 1 insertion(+), 1 deletion(-)
> > > 
> > > diff --git a/tools/testing/selftests/net/mptcp/mptcp_join.sh b/tools/testing/selftests/net/mptcp/mptcp_join.sh
> > > index 66ac990415e6..9bbb95837f73 100755
> > > --- a/tools/testing/selftests/net/mptcp/mptcp_join.sh
> > > +++ b/tools/testing/selftests/net/mptcp/mptcp_join.sh
> > > @@ -2242,7 +2242,7 @@ for arg in "$@"; do
> > >  	fi
> > >  
> > >  	# exception for the capture/checksum/ip_mptcp options, the rest means: a part of the tests
> > > -	if [ "${arg}" != "-c" ] && [ "${arg}" != "-C" ] && [ "${arg}" != "-i" ]; then
> > > +	if ! [[ "${arg}" =~ ^"-"[cCi]+$ ]]; then
> > >  		do_all_tests=0
> > >  	fi
> > >  done
> > 
> > At this point I think it would be better consolidate argument parsing
> > with getopts, and dropping the above regexp.
> > 
> > While parsing the test group selectors, we could build the list of 
> > groups to be executed (possibly a string contaning all the function to
> > be invoked), and run them after argument parsing - or run all if such
> > list (string) is empty
> 
> I just applied the patches in our tree and saw this message after, sorry
> about that.
> 
> Indeed, good idea, that would be the proper way to handle options!
> It would also be good not to do anything if the -h option is given with
> others.
> 
> I will try to remember about this idea next time I modify this part! I
> can also remove this commit from our tree if you prefer.

I think we can simply squash the suggested change into this commit

WDYT?

Cheers,

/P


^ permalink raw reply	[flat|nested] 20+ messages in thread

* Re: [PATCH mptcp-next 3/9] selftests: mptcp: join: option to execute specific tests
  2022-02-10 15:11         ` Paolo Abeni
@ 2022-02-16 15:50           ` Matthieu Baerts
  0 siblings, 0 replies; 20+ messages in thread
From: Matthieu Baerts @ 2022-02-16 15:50 UTC (permalink / raw)
  To: Paolo Abeni, Mat Martineau; +Cc: mptcp

Hi Paolo,

On 10/02/2022 16:11, Paolo Abeni wrote:
> On Thu, 2022-02-10 at 11:42 +0100, Matthieu Baerts wrote:
>> On 10/02/2022 11:04, Paolo Abeni wrote:
>>> On Wed, 2022-02-09 at 16:36 -0800, Mat Martineau wrote:
>>>> On Wed, 9 Feb 2022, Matthieu Baerts wrote:
>>>>
>>>>> Often, it is needed to run one specific test.
>>>>>
>>>>> There are options to run subgroups of tests but when only one fails, no
>>>>> need to run all the subgroup. So far, the solution was to edit the
>>>>> script to comment the tests that are not needed but that's not ideal.
>>>>>
>>>>> Now, it is possible to run one specific test by giving the ID of the
>>>>> tests that are going to be validated, e.g.
>>>>>
>>>>>  ./mptcp_join.sh 36 37
>>>>>
>>>>> This is cleaner and saves time.
>>>>>
>>>>> Technically, the reset* functions now return 0 if the test can be
>>>>> executed. This naturally creates sections per test in the code which is
>>>>> also helpful to understand what a test is exactly doing.
>>>>>
>>>>
>>>> My sense is that this is primarily for development purposes since the test 
>>>> numbers may shift as tests are added or modified. Is it worth the churn 
>>>> when we have the subgroup functionality and could comment out chunks of 
>>>> the test script that are not useful for running specific tests in a loop?
>>
>> On my side, it would be helpful. On my side, I can edit the code but
>> that's not nice, especially if you want to automate tests with and
>> without a patch: you can have conflicts with the new comments, etc.
>>
>> On the CI, I cannot easily modify the code so I end up testing more than
>> expected, that's slow and sometimes hits other issues.
>>
>> I guess on Paolo's side too as he complained about this missing feature :)
>>
>>>> I'm not set against this change, but hoping to discuss it some more to 
>>>> both understand the benefits (I assume for running CI in a loop?) and to 
>>>> see if anyone has bright ideas for avoiding the whitespace churn.
>>>>
>>>> ("Include a bash fork in our selftest code that implements 'goto'" seems 
>>>> like overkill :) )
>>>
>>> Perhapas something alike the following ?!? Not a complete solution:
>>> - completely not tested
>>> - we will first need to add some wrapper for iptables or even beffer
>>> for ip netns exec, to be more generic
>>> - possibly more 'skip_test && return' needed, but not many, I guess.
>>>
>>> I hope should be enough demonstrate the idea...
>>
>> If we really want to avoid modifying existing lines in selftests, I can
>> also not add new tabs after the new "if reset" and drop patches 7-9. But
>> that's a shame we cannot refactor the code in the selftests :-/
>>
>> I don't think it is a good idea to add the skip_test everywhere: we will
>> certainly forgot to add one somewhere until someone test the feature.
> 
> skip_test will be needed "only" in the helper called directly from the
> test body. I think the shared chunk already touches all the existing
> one.
> 
> Validating should be simple (assuming the current number of mpj
> testacase is 100): 
> 
> ---
> for I in $(seq 1 100); do
> 	./mptcp_join.sh $I
> done > out
> 
> test=$(grep -c "\d\d\d " out)
> if [ $test = 100 ]; then
> 	echo ok
> else
> 	echo paolo is dumb!
> fi
> ---

I hope it is OK but I prefer to stick with the 'if reset; then'.

The main reason is that I don't want to run this validation you gave
here and have the second and totally wrong "echo" printed in my terminal :-/

Even if it is clearly less important than that, another reason is that
there are still a few direct commands "ip netns exec (...)". I could
move them in a new helper but anyway Geliang did a lot of modifications
in the "tests" part recently to allow running the tests with 'ip'
instead of 'pm_nl_ctl'. So probably fine to do a bit more modifications,
no? :)

Cheers,
Matt
-- 
Tessares | Belgium | Hybrid Access Solutions
www.tessares.net

^ permalink raw reply	[flat|nested] 20+ messages in thread

end of thread, other threads:[~2022-02-16 15:50 UTC | newest]

Thread overview: 20+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2022-02-09 21:25 [PATCH mptcp-next 0/9] Refactor mptcp_join.sh Matthieu Baerts
2022-02-09 21:25 ` [PATCH mptcp-next 1/9] selftests: mptcp: join: allow running -cCi Matthieu Baerts
2022-02-10 14:53   ` Paolo Abeni
2022-02-11 17:30     ` Matthieu Baerts
2022-02-11 18:56       ` Paolo Abeni
2022-02-09 21:25 ` [PATCH mptcp-next 2/9] selftests: mptcp: join: exit after usage() Matthieu Baerts
2022-02-09 21:25 ` [PATCH mptcp-next 3/9] selftests: mptcp: join: option to execute specific tests Matthieu Baerts
2022-02-10  0:36   ` Mat Martineau
2022-02-10 10:04     ` Paolo Abeni
2022-02-10 10:42       ` Matthieu Baerts
2022-02-10 15:11         ` Paolo Abeni
2022-02-16 15:50           ` Matthieu Baerts
2022-02-09 21:25 ` [PATCH mptcp-next 4/9] selftests: mptcp: join: remove unused vars Matthieu Baerts
2022-02-09 21:25 ` [PATCH mptcp-next 5/9] selftests: mptcp: join: create tmp files only if needed Matthieu Baerts
2022-02-09 21:25 ` [PATCH mptcp-next 6/9] selftests: mptcp: join: check for tools " Matthieu Baerts
2022-02-09 21:25 ` [PATCH mptcp-next 7/9] selftests: mptcp: join: clarify local/global vars Matthieu Baerts
2022-02-09 21:25 ` [PATCH mptcp-next 8/9] selftests: mptcp: join: avoid backquotes Matthieu Baerts
2022-02-09 21:25 ` [PATCH mptcp-next 9/9] selftests: mptcp: join: make it shellcheck compliant Matthieu Baerts
2022-02-10  0:22 ` [PATCH mptcp-next 0/9] Refactor mptcp_join.sh Mat Martineau
2022-02-11 17:34   ` Matthieu Baerts

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.