]> git.baikalelectronics.ru Git - kernel.git/commitdiff
selftests: mptcp: add tests for subflow creation failure
authorPaolo Abeni <pabeni@redhat.com>
Fri, 7 Jan 2022 00:20:24 +0000 (16:20 -0800)
committerDavid S. Miller <davem@davemloft.net>
Fri, 7 Jan 2022 11:27:07 +0000 (11:27 +0000)
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: Geliang Tang <geliang.tang@suse.com>
Signed-off-by: Geliang Tang <geliang.tang@suse.com>
Signed-off-by: Paolo Abeni <pabeni@redhat.com>
Signed-off-by: Mat Martineau <mathew.j.martineau@linux.intel.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
tools/testing/selftests/net/mptcp/config
tools/testing/selftests/net/mptcp/mptcp_join.sh

index d548bc139b5d8724234ad81af1541ae45f041420..d36b7da5082a8668de513a734c697496a8ca02b5 100644 (file)
@@ -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
index bbafa4cf54538bfa5ef8320ff572e393dc8550d0..3165bd1a43ccd9065547df6faa6aaff360d9ed83 100755 (executable)
@@ -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
                        ;;