Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
82 changes: 62 additions & 20 deletions tools/testing/selftests/bpf/test_xdp_features.sh
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ readonly V0_IP6=2001:db8::11
readonly V1_IP6=2001:db8::1

ret=1
dut_pid=""

setup() {
{
Expand All @@ -30,77 +31,118 @@ setup() {
} > /dev/null 2>&1
}

terminate_dut_server() {
[ -z "$dut_pid" ] && return

# Use the shell job instead of a PID which may have been reused.
if [ "$(jobs -pr %% 2> /dev/null)" = "$dut_pid" ]; then
kill -KILL %% 2> /dev/null || true
fi

wait "$dut_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 143' TERM

test_xdp_features

Expand Down
Loading