Skip to content

Commit

Permalink
selftests/xsk: Add support for executing tests on physical device
Browse files Browse the repository at this point in the history
Currently, architecture of xdpxceiver is designed strictly for
conducting veth based tests. Veth pair is created together with a
network namespace and one of the veth interfaces is moved to the
mentioned netns. Then, separate threads for Tx and Rx are spawned which
will utilize described setup.

Infrastructure described in the paragraph above can not be used for
testing AF_XDP support on physical devices. That testing will be
conducted on a single network interface and same queue. Xskxceiver
needs to be extended to distinguish between veth tests and physical
interface tests.

Since same iface/queue id pair will be used by both Tx/Rx threads for
physical device testing, Tx thread, which happen to run after the Rx
thread, is going to create XSK socket with shared umem flag. In order to
track this setting throughout the lifetime of spawned threads, introduce
'shared_umem' boolean variable to struct ifobject and set it to true
when xdpxceiver is run against physical device. In such case, UMEM size
needs to be doubled, so half of it will be used by Rx thread and other
half by Tx thread. For two step based test types, value of XSKMAP
element under key 0 has to be updated as there is now another socket for
the second step. Also, to avoid race conditions when destroying XSK
resources, move this activity to the main thread after spawned Rx and Tx
threads have finished its job. This way it is possible to gracefully
remove shared umem without introducing synchronization mechanisms.

To run xsk selftests suite on physical device, append "-i $IFACE" when
invoking test_xsk.sh. For veth based tests, simply skip it. When "-i
$IFACE" is in place, under the hood test_xsk.sh will use $IFACE for both
interfaces supplied to xdpxceiver, which in turn will interpret that
this execution of test suite is for a physical device.

Note that currently this makes it possible only to test SKB and DRV mode
(in case underlying device has native XDP support). ZC testing support
is added in a later patch.

Signed-off-by: Maciej Fijalkowski <maciej.fijalkowski@intel.com>
Signed-off-by: Daniel Borkmann <daniel@iogearbox.net>
Acked-by: Magnus Karlsson <magnus.karlsson@intel.com>
Link: https://lore.kernel.org/bpf/20220901114813.16275-5-maciej.fijalkowski@intel.com
  • Loading branch information
Maciej Fijalkowski authored and Daniel Borkmann committed Sep 2, 2022
1 parent 24037ba commit a693ff3
Show file tree
Hide file tree
Showing 3 changed files with 170 additions and 87 deletions.
52 changes: 36 additions & 16 deletions tools/testing/selftests/bpf/test_xsk.sh
Original file line number Diff line number Diff line change
Expand Up @@ -73,14 +73,20 @@
#
# Run and dump packet contents:
# sudo ./test_xsk.sh -D
#
# Run test suite for physical device in loopback mode
# sudo ./test_xsk.sh -i IFACE

. xsk_prereqs.sh

while getopts "vD" flag
ETH=""

while getopts "vDi:" flag
do
case "${flag}" in
v) verbose=1;;
D) dump_pkts=1;;
i) ETH=${OPTARG};;
esac
done

Expand Down Expand Up @@ -132,18 +138,25 @@ setup_vethPairs() {
ip link set ${VETH0} up
}

validate_root_exec
validate_veth_support ${VETH0}
validate_ip_utility
setup_vethPairs

retval=$?
if [ $retval -ne 0 ]; then
test_status $retval "${TEST_NAME}"
cleanup_exit ${VETH0} ${VETH1} ${NS1}
exit $retval
if [ ! -z $ETH ]; then
VETH0=${ETH}
VETH1=${ETH}
NS1=""
else
validate_root_exec
validate_veth_support ${VETH0}
validate_ip_utility
setup_vethPairs

retval=$?
if [ $retval -ne 0 ]; then
test_status $retval "${TEST_NAME}"
cleanup_exit ${VETH0} ${VETH1} ${NS1}
exit $retval
fi
fi


if [[ $verbose -eq 1 ]]; then
ARGS+="-v "
fi
Expand All @@ -152,26 +165,33 @@ if [[ $dump_pkts -eq 1 ]]; then
ARGS="-D "
fi

retval=$?
test_status $retval "${TEST_NAME}"

## START TESTS

statusList=()

TEST_NAME="XSK_SELFTESTS_SOFTIRQ"
TEST_NAME="XSK_SELFTESTS_${VETH0}_SOFTIRQ"

exec_xskxceiver

cleanup_exit ${VETH0} ${VETH1} ${NS1}
TEST_NAME="XSK_SELFTESTS_BUSY_POLL"
if [ -z $ETH ]; then
cleanup_exit ${VETH0} ${VETH1} ${NS1}
fi
TEST_NAME="XSK_SELFTESTS_${VETH0}_BUSY_POLL"
busy_poll=1

setup_vethPairs
if [ -z $ETH ]; then
setup_vethPairs
fi
exec_xskxceiver

## END TESTS

cleanup_exit ${VETH0} ${VETH1} ${NS1}
if [ -z $ETH ]; then
cleanup_exit ${VETH0} ${VETH1} ${NS1}
fi

failures=0
echo -e "\nSummary:"
Expand Down
Loading

0 comments on commit a693ff3

Please sign in to comment.