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

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
...@@ -17,4 +17,5 @@ CONFIG_NFT_TPROXY=m ...@@ -17,4 +17,5 @@ CONFIG_NFT_TPROXY=m
CONFIG_NFT_SOCKET=m CONFIG_NFT_SOCKET=m
CONFIG_IP_ADVANCED_ROUTER=y CONFIG_IP_ADVANCED_ROUTER=y
CONFIG_IP_MULTIPLE_TABLES=y CONFIG_IP_MULTIPLE_TABLES=y
CONFIG_IP_NF_TARGET_REJECT=m
CONFIG_IPV6_MULTIPLE_TABLES=y CONFIG_IPV6_MULTIPLE_TABLES=y
...@@ -937,6 +937,22 @@ chk_link_usage() ...@@ -937,6 +937,22 @@ chk_link_usage()
fi 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() subflows_tests()
{ {
reset reset
...@@ -994,6 +1010,61 @@ subflows_tests() ...@@ -994,6 +1010,61 @@ subflows_tests()
chk_join_nr "single subflow, dev" 1 1 1 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() signal_address_tests()
{ {
# add_address, unused # add_address, unused
...@@ -1805,6 +1876,7 @@ fullmesh_tests() ...@@ -1805,6 +1876,7 @@ fullmesh_tests()
all_tests() all_tests()
{ {
subflows_tests subflows_tests
subflows_error_tests
signal_address_tests signal_address_tests
link_failure_tests link_failure_tests
add_addr_timeout_tests add_addr_timeout_tests
...@@ -1824,6 +1896,7 @@ usage() ...@@ -1824,6 +1896,7 @@ usage()
{ {
echo "mptcp_join usage:" echo "mptcp_join usage:"
echo " -f subflows_tests" echo " -f subflows_tests"
echo " -e subflows_error_tests"
echo " -s signal_address_tests" echo " -s signal_address_tests"
echo " -l link_failure_tests" echo " -l link_failure_tests"
echo " -t add_addr_timeout_tests" echo " -t add_addr_timeout_tests"
...@@ -1872,11 +1945,14 @@ if [ $do_all_tests -eq 1 ]; then ...@@ -1872,11 +1945,14 @@ if [ $do_all_tests -eq 1 ]; then
exit $ret exit $ret
fi fi
while getopts 'fsltra64bpkdmchCS' opt; do while getopts 'fesltra64bpkdmchCS' opt; do
case $opt in case $opt in
f) f)
subflows_tests subflows_tests
;; ;;
e)
subflows_error_tests
;;
s) s)
signal_address_tests signal_address_tests
;; ;;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment