Commit 46e967d1 authored by Paolo Abeni's avatar Paolo Abeni Committed by David S. Miller
Browse files

selftests: mptcp: add tests for subflow creation failure



Verify that, when multiple endpoints are available, subflows
creation proceed even when the first additional subflow creation
fails - due to packet drop on the relevant link

Co-developed-by: default avatarGeliang Tang <geliang.tang@suse.com>
Signed-off-by: default avatarGeliang Tang <geliang.tang@suse.com>
Signed-off-by: default avatarPaolo Abeni <pabeni@redhat.com>
Signed-off-by: default avatarMat Martineau <mathew.j.martineau@linux.intel.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent a88c9e49
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -17,4 +17,5 @@ CONFIG_NFT_TPROXY=m
CONFIG_NFT_SOCKET=m
CONFIG_IP_ADVANCED_ROUTER=y
CONFIG_IP_MULTIPLE_TABLES=y
CONFIG_IP_NF_TARGET_REJECT=m
CONFIG_IPV6_MULTIPLE_TABLES=y
+77 −1
Original line number Diff line number Diff line
@@ -937,6 +937,22 @@ chk_link_usage()
	fi
}

wait_for_tw()
{
	local timeout_ms=$((timeout_poll * 1000))
	local time=0
	local ns=$1

	while [ $time -lt $timeout_ms ]; do
		local cnt=$(ip netns exec $ns ss -t state time-wait |wc -l)

		[ "$cnt" = 1 ] && return 1
		time=$((time + 100))
		sleep 0.1
	done
	return 1
}

subflows_tests()
{
	reset
@@ -994,6 +1010,61 @@ subflows_tests()
	chk_join_nr "single subflow, dev" 1 1 1
}

subflows_error_tests()
{
	# If a single subflow is configured, and matches the MPC src
	# address, no additional subflow should be created
	reset
	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.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

	# multiple subflows, with subflow creation error
	reset
	ip netns exec $ns1 ./pm_nl_ctl limits 0 2
	ip netns exec $ns2 ./pm_nl_ctl limits 0 2
	ip netns exec $ns2 ./pm_nl_ctl add 10.0.3.2 flags subflow
	ip netns exec $ns2 ./pm_nl_ctl add 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

	# multiple subflows, with subflow timeout on MPJ
	reset
	ip netns exec $ns1 ./pm_nl_ctl limits 0 2
	ip netns exec $ns2 ./pm_nl_ctl limits 0 2
	ip netns exec $ns2 ./pm_nl_ctl add 10.0.3.2 flags subflow
	ip netns exec $ns2 ./pm_nl_ctl add 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

	# multiple subflows, check that the endpoint corresponding to
	# closed subflow (due to reset) is not reused if additional
	# subflows are added later
	reset
	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
	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_for_tw $ns2
	ip netns exec $ns2 ./pm_nl_ctl add 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
}

signal_address_tests()
{
	# add_address, unused
@@ -1805,6 +1876,7 @@ fullmesh_tests()
all_tests()
{
	subflows_tests
	subflows_error_tests
	signal_address_tests
	link_failure_tests
	add_addr_timeout_tests
@@ -1824,6 +1896,7 @@ usage()
{
	echo "mptcp_join usage:"
	echo "  -f subflows_tests"
	echo "  -e subflows_error_tests"
	echo "  -s signal_address_tests"
	echo "  -l link_failure_tests"
	echo "  -t add_addr_timeout_tests"
@@ -1872,11 +1945,14 @@ if [ $do_all_tests -eq 1 ]; then
	exit $ret
fi

while getopts 'fsltra64bpkdmchCS' opt; do
while getopts 'fesltra64bpkdmchCS' opt; do
	case $opt in
		f)
			subflows_tests
			;;
		e)
			subflows_error_tests
			;;
		s)
			signal_address_tests
			;;