Skip to content

Commit

Permalink
selftests: mptcp: add tests for subflow creation failure
Browse files Browse the repository at this point in the history
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

Reviewed-by: Mat Martineau <mathew.j.martineau@linux.intel.com>
Signed-off-by: Paolo Abeni <pabeni@redhat.com>
  • Loading branch information
Paolo Abeni authored and matttbe committed Dec 15, 2021
1 parent 5768c7f commit 0f4945b
Show file tree
Hide file tree
Showing 2 changed files with 78 additions and 1 deletion.
1 change: 1 addition & 0 deletions tools/testing/selftests/net/mptcp/config
Original file line number Diff line number Diff line change
Expand Up @@ -18,4 +18,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
78 changes: 77 additions & 1 deletion tools/testing/selftests/net/mptcp/mptcp_join.sh
Original file line number Diff line number Diff line change
Expand Up @@ -975,6 +975,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
Expand Down Expand Up @@ -1032,6 +1048,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 address 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 "multiple 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 "multiple 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))

# 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 "multiple subflows, fair usage on close" 1 1 1
}

signal_address_tests()
{
# add_address, unused
Expand Down Expand Up @@ -1843,6 +1914,7 @@ fullmesh_tests()
all_tests()
{
subflows_tests
subflows_error_tests
signal_address_tests
link_failure_tests
add_addr_timeout_tests
Expand All @@ -1862,6 +1934,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"
Expand Down Expand Up @@ -1910,11 +1983,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
;;
Expand Down

0 comments on commit 0f4945b

Please sign in to comment.