From: Bochao Cao <[email protected]>

Track the DUT process instead of matching processes by name to avoid
interference between concurrent tests. Fix readiness retries under
set -e and clean up the DUT and network state on exit or interruption.

Signed-off-by: Bochao Cao <[email protected]>
---
 tools/testing/selftests/bpf/test_xdp_features.sh | 88 ++++++++++++++++++------
 1 file changed, 68 insertions(+), 20 deletions(-)

diff --git a/tools/testing/selftests/bpf/test_xdp_features.sh 
b/tools/testing/selftests/bpf/test_xdp_features.sh
index 0aa71c445..a78e0fb9e 100755
--- a/tools/testing/selftests/bpf/test_xdp_features.sh
+++ b/tools/testing/selftests/bpf/test_xdp_features.sh
@@ -8,6 +8,7 @@ readonly V0_IP6=2001:db8::11
 readonly V1_IP6=2001:db8::1
 
 ret=1
+dut_pid=""
 
 setup() {
        {
@@ -30,77 +31,124 @@ setup() {
        } > /dev/null 2>&1
 }
 
+terminate_dut_server() {
+       local pid
+
+       # Use the shell job instead of dut_pid, which may not have been assigned
+       # yet if a signal arrived immediately after the server was started.
+       pid=$(jobs -pr %% 2> /dev/null) || true
+       if [ -z "$pid" ]; then
+               dut_pid=""
+               return
+       fi
+
+       kill -KILL %% 2> /dev/null || true
+       wait "$pid" 2> /dev/null || true
+       dut_pid=""
+}
+
 cleanup() {
-       ip link del v1 2> /dev/null
-       ip netns del ${NS} 2> /dev/null
-       [ "$(pidof xdp_features)" = "" ] || kill $(pidof xdp_features) 2> 
/dev/null
+       terminate_dut_server
+       ip link del v1 2> /dev/null || true
+       ip netns del "${NS}" 2> /dev/null || true
 }
 
 wait_for_dut_server() {
-       while sleep 1; do
-               ss -tlp | grep -q xdp_features
-               [ $? -eq 0 ] && break
+       local i
+
+       for ((i = 0; i < 10; i++)); do
+               if [ "$(jobs -pr %% 2> /dev/null)" != "$dut_pid" ]; then
+                       echo "xdp_features server $dut_pid exited before 
accepting connections" >&2
+                       return 1
+               fi
+
+               if ss -tlp 2> /dev/null | grep -q "pid=$dut_pid,"; then
+                       return 0
+               fi
+
+               sleep 1
        done
+
+       echo "Timed out waiting for xdp_features server $dut_pid" >&2
+       return 1
+}
+
+start_dut_server() {
+       ./xdp_features "$@" &
+       dut_pid=$!
+       wait_for_dut_server
+}
+
+reap_dut_server() {
+       local status=0
+
+       wait "$dut_pid" || status=$?
+       dut_pid=""
+       return "$status"
 }
 
 test_xdp_features() {
        setup
 
        ## XDP_PASS
-       ./xdp_features -f XDP_PASS -D $V1_IP6 -T $V0_IP6 v1 &
-       wait_for_dut_server
+       start_dut_server -f XDP_PASS -D $V1_IP6 -T $V0_IP6 v1
        ip netns exec ${NS} ./xdp_features -t -f XDP_PASS \
                                           -D $V1_IP6 -C $V1_IP6 \
                                           -T $V0_IP6 v0
        [ $? -ne 0 ] && exit
+       reap_dut_server
 
        ## XDP_DROP
-       ./xdp_features -f XDP_DROP -D ::ffff:$V1_IP4 -T ::ffff:$V0_IP4 v1 &
-       wait_for_dut_server
+       start_dut_server -f XDP_DROP -D ::ffff:$V1_IP4 -T ::ffff:$V0_IP4 v1
        ip netns exec ${NS} ./xdp_features -t -f XDP_DROP \
                                           -D ::ffff:$V1_IP4 \
                                           -C ::ffff:$V1_IP4 \
                                           -T ::ffff:$V0_IP4 v0
        [ $? -ne 0 ] && exit
+       reap_dut_server
 
        ## XDP_ABORTED
-       ./xdp_features -f XDP_ABORTED -D $V1_IP6 -T $V0_IP6 v1 &
-       wait_for_dut_server
+       start_dut_server -f XDP_ABORTED -D $V1_IP6 -T $V0_IP6 v1
        ip netns exec ${NS} ./xdp_features -t -f XDP_ABORTED \
                                           -D $V1_IP6 -C $V1_IP6 \
                                           -T $V0_IP6 v0
        [ $? -ne 0 ] && exit
+       reap_dut_server
 
        ## XDP_TX
-       ./xdp_features -f XDP_TX -D ::ffff:$V1_IP4 -T ::ffff:$V0_IP4 v1 &
-       wait_for_dut_server
+       start_dut_server -f XDP_TX -D ::ffff:$V1_IP4 -T ::ffff:$V0_IP4 v1
        ip netns exec ${NS} ./xdp_features -t -f XDP_TX \
                                           -D ::ffff:$V1_IP4 \
                                           -C ::ffff:$V1_IP4 \
                                           -T ::ffff:$V0_IP4 v0
        [ $? -ne 0 ] && exit
+       reap_dut_server
 
        ## XDP_REDIRECT
-       ./xdp_features -f XDP_REDIRECT -D $V1_IP6 -T $V0_IP6 v1 &
-       wait_for_dut_server
+       start_dut_server -f XDP_REDIRECT -D $V1_IP6 -T $V0_IP6 v1
        ip netns exec ${NS} ./xdp_features -t -f XDP_REDIRECT \
                                           -D $V1_IP6 -C $V1_IP6 \
                                           -T $V0_IP6 v0
        [ $? -ne 0 ] && exit
+       reap_dut_server
 
        ## XDP_NDO_XMIT
-       ./xdp_features -f XDP_NDO_XMIT -D ::ffff:$V1_IP4 -T ::ffff:$V0_IP4 v1 &
-       wait_for_dut_server
+       start_dut_server -f XDP_NDO_XMIT -D ::ffff:$V1_IP4 -T ::ffff:$V0_IP4 v1
        ip netns exec ${NS} ./xdp_features -t -f XDP_NDO_XMIT \
                                           -D ::ffff:$V1_IP4 \
                                           -C ::ffff:$V1_IP4 \
                                           -T ::ffff:$V0_IP4 v0
        ret=$?
-       cleanup
+       reap_dut_server
 }
 
 set -e
-trap cleanup 2 3 6 9
+trap cleanup EXIT
+trap 'exit 129' HUP
+trap 'exit 130' INT
+trap 'exit 131' QUIT
+trap 'exit 134' ABRT
+trap 'exit 143' TERM
 
 test_xdp_features
 

-- 
2.43.0



Reply via email to