selftests: net: avoid just another constant wait
[platform/kernel/linux-starfive.git] / tools / testing / selftests / net / pmtu.sh
index f838dd3..d65fdd4 100755 (executable)
@@ -1,4 +1,4 @@
-#!/bin/sh
+#!/bin/bash
 # SPDX-License-Identifier: GPL-2.0
 #
 # Check that route PMTU values match expectations, and that initial device MTU
 # - pmtu_ipv6_route_change
 #      Same as above but with IPv6
 
-# Kselftest framework requirement - SKIP code is 4.
-ksft_skip=4
+source lib.sh
+source net_helper.sh
 
 PAUSE_ON_FAIL=no
 VERBOSE=0
@@ -268,16 +268,6 @@ tests="
        pmtu_ipv4_route_change          ipv4: PMTU exception w/route replace    1
        pmtu_ipv6_route_change          ipv6: PMTU exception w/route replace    1"
 
-NS_A="ns-A"
-NS_B="ns-B"
-NS_C="ns-C"
-NS_R1="ns-R1"
-NS_R2="ns-R2"
-ns_a="ip netns exec ${NS_A}"
-ns_b="ip netns exec ${NS_B}"
-ns_c="ip netns exec ${NS_C}"
-ns_r1="ip netns exec ${NS_R1}"
-ns_r2="ip netns exec ${NS_R2}"
 # Addressing and routing for tests with routers: four network segments, with
 # index SEGMENT between 1 and 4, a common prefix (PREFIX4 or PREFIX6) and an
 # identifier ID, which is 1 for hosts (A and B), 2 for routers (R1 and R2).
@@ -543,13 +533,17 @@ setup_ip6ip6() {
 }
 
 setup_namespaces() {
+       setup_ns NS_A NS_B NS_C NS_R1 NS_R2
        for n in ${NS_A} ${NS_B} ${NS_C} ${NS_R1} ${NS_R2}; do
-               ip netns add ${n} || return 1
-
                # Disable DAD, so that we don't have to wait to use the
                # configured IPv6 addresses
                ip netns exec ${n} sysctl -q net/ipv6/conf/default/accept_dad=0
        done
+       ns_a="ip netns exec ${NS_A}"
+       ns_b="ip netns exec ${NS_B}"
+       ns_c="ip netns exec ${NS_C}"
+       ns_r1="ip netns exec ${NS_R1}"
+       ns_r2="ip netns exec ${NS_R2}"
 }
 
 setup_veth() {
@@ -714,23 +708,23 @@ setup_xfrm6() {
 }
 
 setup_xfrm4udp() {
-       setup_xfrm 4 ${veth4_a_addr} ${veth4_b_addr} "encap espinudp 4500 4500 0.0.0.0"
-       setup_nettest_xfrm 4 4500
+       setup_xfrm 4 ${veth4_a_addr} ${veth4_b_addr} "encap espinudp 4500 4500 0.0.0.0" && \
+               setup_nettest_xfrm 4 4500
 }
 
 setup_xfrm6udp() {
-       setup_xfrm 6 ${veth6_a_addr} ${veth6_b_addr} "encap espinudp 4500 4500 0.0.0.0"
-       setup_nettest_xfrm 6 4500
+       setup_xfrm 6 ${veth6_a_addr} ${veth6_b_addr} "encap espinudp 4500 4500 0.0.0.0" && \
+               setup_nettest_xfrm 6 4500
 }
 
 setup_xfrm4udprouted() {
-       setup_xfrm 4 ${prefix4}.${a_r1}.1 ${prefix4}.${b_r1}.1 "encap espinudp 4500 4500 0.0.0.0"
-       setup_nettest_xfrm 4 4500
+       setup_xfrm 4 ${prefix4}.${a_r1}.1 ${prefix4}.${b_r1}.1 "encap espinudp 4500 4500 0.0.0.0" && \
+               setup_nettest_xfrm 4 4500
 }
 
 setup_xfrm6udprouted() {
-       setup_xfrm 6 ${prefix6}:${a_r1}::1 ${prefix6}:${b_r1}::1 "encap espinudp 4500 4500 0.0.0.0"
-       setup_nettest_xfrm 6 4500
+       setup_xfrm 6 ${prefix6}:${a_r1}::1 ${prefix6}:${b_r1}::1 "encap espinudp 4500 4500 0.0.0.0" && \
+               setup_nettest_xfrm 6 4500
 }
 
 setup_routing_old() {
@@ -839,7 +833,7 @@ setup_bridge() {
        run_cmd ${ns_a} ip link set br0 up
 
        run_cmd ${ns_c} ip link add veth_C-A type veth peer name veth_A-C
-       run_cmd ${ns_c} ip link set veth_A-C netns ns-A
+       run_cmd ${ns_c} ip link set veth_A-C netns ${NS_A}
 
        run_cmd ${ns_a} ip link set veth_A-C up
        run_cmd ${ns_c} ip link set veth_C-A up
@@ -944,9 +938,7 @@ cleanup() {
        done
        socat_pids=
 
-       for n in ${NS_A} ${NS_B} ${NS_C} ${NS_R1} ${NS_R2}; do
-               ip netns del ${n} 2> /dev/null
-       done
+       cleanup_all_ns
 
        ip link del veth_A-C                    2>/dev/null
        ip link del veth_A-R1                   2>/dev/null
@@ -1345,13 +1337,15 @@ test_pmtu_ipvX_over_bridged_vxlanY_or_geneveY_exception() {
                        TCPDST="TCP:[${dst}]:50000"
                fi
                ${ns_b} socat -T 3 -u -6 TCP-LISTEN:50000 STDOUT > $tmpoutfile &
+               local socat_pid=$!
 
-               sleep 1
+               wait_local_port_listen ${NS_B} 50000 tcp
 
-               dd if=/dev/zero of=/dev/stdout status=none bs=1M count=1 | ${target} socat -T 3 -u STDIN $TCPDST,connect-timeout=3
+               dd if=/dev/zero status=none bs=1M count=1 | ${target} socat -T 3 -u STDIN $TCPDST,connect-timeout=3
 
                size=$(du -sb $tmpoutfile)
                size=${size%%/tmp/*}
+               wait ${socat_pid}
 
                [ $size -ne 1048576 ] && err "File size $size mismatches exepcted value in locally bridged vxlan test" && return 1
        done
@@ -1963,6 +1957,13 @@ check_command() {
        return 0
 }
 
+check_running() {
+       pid=${1}
+       cmd=${2}
+
+       [ "$(cat /proc/${pid}/cmdline 2>/dev/null | tr -d '\0')" = "{cmd}" ]
+}
+
 test_cleanup_vxlanX_exception() {
        outer="${1}"
        encap="vxlan"
@@ -1993,11 +1994,12 @@ test_cleanup_vxlanX_exception() {
 
        ${ns_a} ip link del dev veth_A-R1 &
        iplink_pid=$!
-       sleep 1
-       if [ "$(cat /proc/${iplink_pid}/cmdline 2>/dev/null | tr -d '\0')" = "iplinkdeldevveth_A-R1" ]; then
-               err "  can't delete veth device in a timely manner, PMTU dst likely leaked"
-               return 1
-       fi
+       for i in $(seq 1 20); do
+               check_running ${iplink_pid} "iplinkdeldevveth_A-R1" || return 0
+               sleep 0.1
+       done
+       err "  can't delete veth device in a timely manner, PMTU dst likely leaked"
+       return 1
 }
 
 test_cleanup_ipv6_exception() {
@@ -2048,7 +2050,7 @@ run_test() {
        case $ret in
                0)
                        all_skipped=false
-                       [ $exitcode=$ksft_skip ] && exitcode=0
+                       [ $exitcode -eq $ksft_skip ] && exitcode=0
                ;;
                $ksft_skip)
                        [ $all_skipped = true ] && exitcode=$ksft_skip