Message ID | 20240412151314.3365034-7-jiri@resnulli.us (mailing list archive) |
---|---|
State | Superseded |
Delegated to: | Netdev Maintainers |
Headers | show |
Series | selftests: virtio_net: introduce initial testing infrastructure | expand |
On 2024-04-12 17:13 +0200, Jiri Pirko wrote: > From: Jiri Pirko <jiri@nvidia.com> > > Introduce initial tests for virtio_net driver. Focus on feature testing > leveraging previously introduced debugfs feature filtering > infrastructure. Add very basic ping and F_MAC feature tests. > > To run this, do: > $ make -C tools/testing/selftests/ TARGETS=drivers/net/virtio_net/ run_tests > > Run it on a system with 2 virtio_net devices connected back-to-back > on the hypervisor. > > Signed-off-by: Jiri Pirko <jiri@nvidia.com> > --- > tools/testing/selftests/Makefile | 1 + > .../selftests/drivers/net/virtio_net/Makefile | 5 + > .../drivers/net/virtio_net/basic_features.sh | 127 ++++++++++++++++++ > .../net/virtio_net/virtio_net_common.sh | 99 ++++++++++++++ > 4 files changed, 232 insertions(+) > create mode 100644 tools/testing/selftests/drivers/net/virtio_net/Makefile > create mode 100755 tools/testing/selftests/drivers/net/virtio_net/basic_features.sh > create mode 100644 tools/testing/selftests/drivers/net/virtio_net/virtio_net_common.sh > > diff --git a/tools/testing/selftests/Makefile b/tools/testing/selftests/Makefile > index 6dab886d6f7a..a8e40599c65f 100644 > --- a/tools/testing/selftests/Makefile > +++ b/tools/testing/selftests/Makefile > @@ -20,6 +20,7 @@ TARGETS += drivers/s390x/uvdevice > TARGETS += drivers/net > TARGETS += drivers/net/bonding > TARGETS += drivers/net/team > +TARGETS += drivers/net/virtio > TARGETS += dt > TARGETS += efivarfs > TARGETS += exec > diff --git a/tools/testing/selftests/drivers/net/virtio_net/Makefile b/tools/testing/selftests/drivers/net/virtio_net/Makefile > new file mode 100644 > index 000000000000..c6edf5ddb0e4 > --- /dev/null > +++ b/tools/testing/selftests/drivers/net/virtio_net/Makefile > @@ -0,0 +1,5 @@ > +# SPDX-License-Identifier: GPL-2.0+ OR MIT > + > +TEST_PROGS = basic_features.sh > + > +include ../../../lib.mk Makefile is missing something like TEST_FILES = \ virtio_net_common.sh \ # TEST_INCLUDES = \ ../../../net/forwarding/lib.sh \ ../../../net/lib.sh \ # Without those, these files are missing when exporting the tests, such as with: cd tools/testing/selftests/ make install TARGETS=drivers/net/virtio_net/ ./kselftest_install/run_kselftest.sh
Fri, Apr 12, 2024 at 10:46:58PM CEST, benjamin.poirier@gmail.com wrote: >On 2024-04-12 17:13 +0200, Jiri Pirko wrote: >> From: Jiri Pirko <jiri@nvidia.com> >> >> Introduce initial tests for virtio_net driver. Focus on feature testing >> leveraging previously introduced debugfs feature filtering >> infrastructure. Add very basic ping and F_MAC feature tests. >> >> To run this, do: >> $ make -C tools/testing/selftests/ TARGETS=drivers/net/virtio_net/ run_tests >> >> Run it on a system with 2 virtio_net devices connected back-to-back >> on the hypervisor. >> >> Signed-off-by: Jiri Pirko <jiri@nvidia.com> >> --- >> tools/testing/selftests/Makefile | 1 + >> .../selftests/drivers/net/virtio_net/Makefile | 5 + >> .../drivers/net/virtio_net/basic_features.sh | 127 ++++++++++++++++++ >> .../net/virtio_net/virtio_net_common.sh | 99 ++++++++++++++ >> 4 files changed, 232 insertions(+) >> create mode 100644 tools/testing/selftests/drivers/net/virtio_net/Makefile >> create mode 100755 tools/testing/selftests/drivers/net/virtio_net/basic_features.sh >> create mode 100644 tools/testing/selftests/drivers/net/virtio_net/virtio_net_common.sh >> >> diff --git a/tools/testing/selftests/Makefile b/tools/testing/selftests/Makefile >> index 6dab886d6f7a..a8e40599c65f 100644 >> --- a/tools/testing/selftests/Makefile >> +++ b/tools/testing/selftests/Makefile >> @@ -20,6 +20,7 @@ TARGETS += drivers/s390x/uvdevice >> TARGETS += drivers/net >> TARGETS += drivers/net/bonding >> TARGETS += drivers/net/team >> +TARGETS += drivers/net/virtio >> TARGETS += dt >> TARGETS += efivarfs >> TARGETS += exec >> diff --git a/tools/testing/selftests/drivers/net/virtio_net/Makefile b/tools/testing/selftests/drivers/net/virtio_net/Makefile >> new file mode 100644 >> index 000000000000..c6edf5ddb0e4 >> --- /dev/null >> +++ b/tools/testing/selftests/drivers/net/virtio_net/Makefile >> @@ -0,0 +1,5 @@ >> +# SPDX-License-Identifier: GPL-2.0+ OR MIT >> + >> +TEST_PROGS = basic_features.sh >> + >> +include ../../../lib.mk > >Makefile is missing something like > >TEST_FILES = \ > virtio_net_common.sh \ > # > >TEST_INCLUDES = \ > ../../../net/forwarding/lib.sh \ > ../../../net/lib.sh \ > # > >Without those, these files are missing when exporting the tests, such as >with: > >cd tools/testing/selftests/ >make install TARGETS=drivers/net/virtio_net/ >./kselftest_install/run_kselftest.sh Ah, will try and fix. Thanks!
diff --git a/tools/testing/selftests/Makefile b/tools/testing/selftests/Makefile index 6dab886d6f7a..a8e40599c65f 100644 --- a/tools/testing/selftests/Makefile +++ b/tools/testing/selftests/Makefile @@ -20,6 +20,7 @@ TARGETS += drivers/s390x/uvdevice TARGETS += drivers/net TARGETS += drivers/net/bonding TARGETS += drivers/net/team +TARGETS += drivers/net/virtio TARGETS += dt TARGETS += efivarfs TARGETS += exec diff --git a/tools/testing/selftests/drivers/net/virtio_net/Makefile b/tools/testing/selftests/drivers/net/virtio_net/Makefile new file mode 100644 index 000000000000..c6edf5ddb0e4 --- /dev/null +++ b/tools/testing/selftests/drivers/net/virtio_net/Makefile @@ -0,0 +1,5 @@ +# SPDX-License-Identifier: GPL-2.0+ OR MIT + +TEST_PROGS = basic_features.sh + +include ../../../lib.mk diff --git a/tools/testing/selftests/drivers/net/virtio_net/basic_features.sh b/tools/testing/selftests/drivers/net/virtio_net/basic_features.sh new file mode 100755 index 000000000000..b9047299b510 --- /dev/null +++ b/tools/testing/selftests/drivers/net/virtio_net/basic_features.sh @@ -0,0 +1,127 @@ +#!/bin/bash +# SPDX-License-Identifier: GPL-2.0 + +# See virtio_net_common.sh comments for more details about assumed setup + +ALL_TESTS=" + initial_ping_test + f_mac_test +" + +source virtio_net_common.sh + +lib_dir=$(dirname "$0") +source "$lib_dir"/../../../net/forwarding/lib.sh + +h1=${NETIFS[p1]} +h2=${NETIFS[p2]} + +h1_create() +{ + simple_if_init $h1 $H1_IPV4/24 $H1_IPV6/64 +} + +h1_destroy() +{ + simple_if_fini $h1 $H1_IPV4/24 $H1_IPV6/64 +} + +h2_create() +{ + simple_if_init $h2 $H2_IPV4/24 $H2_IPV6/64 +} + +h2_destroy() +{ + simple_if_fini $h2 $H2_IPV4/24 $H2_IPV6/64 +} + +initial_ping_test() +{ + cleanup + setup_prepare + ping_test $h1 $H2_IPV4 " simple" +} + +f_mac_test() +{ + RET=0 + local test_name="mac feature filtered" + + virtio_feature_present $h1 $VIRTIO_NET_F_MAC + if [ $? -ne 0 ]; then + log_test_skip "$test_name" "Device $h1 is missing feature $VIRTIO_NET_F_MAC." + return 0 + fi + virtio_feature_present $h1 $VIRTIO_NET_F_MAC + if [ $? -ne 0 ]; then + log_test_skip "$test_name" "Device $h2 is missing feature $VIRTIO_NET_F_MAC." + return 0 + fi + + cleanup + setup_prepare + + grep -q 0 /sys/class/net/$h1/addr_assign_type + check_err $? "Permanent address assign type for $h1 is not set" + grep -q 0 /sys/class/net/$h2/addr_assign_type + check_err $? "Permanent address assign type for $h2 is not set" + + cleanup + virtio_filter_feature_add $h1 $VIRTIO_NET_F_MAC + virtio_filter_feature_add $h2 $VIRTIO_NET_F_MAC + setup_prepare + + grep -q 0 /sys/class/net/$h1/addr_assign_type + check_fail $? "Permanent address assign type for $h1 is set when F_MAC feature is filtered" + grep -q 0 /sys/class/net/$h2/addr_assign_type + check_fail $? "Permanent address assign type for $h2 is set when F_MAC feature is filtered" + + ping_do $h1 $H2_IPV4 + check_err $? "Ping failed" + + log_test "$test_name" +} + +setup_prepare() +{ + virtio_device_rebind $h1 + virtio_device_rebind $h2 + wait_for_dev $h1 + wait_for_dev $h2 + + vrf_prepare + + h1_create + h2_create +} + +cleanup() +{ + pre_cleanup + + h2_destroy + h1_destroy + + vrf_cleanup + + virtio_filter_features_clear $h1 + virtio_filter_features_clear $h2 + virtio_device_rebind $h1 + virtio_device_rebind $h2 + wait_for_dev $h1 + wait_for_dev $h2 +} + +check_driver $h1 "virtio_net" +check_driver $h2 "virtio_net" +check_virtio_debugfs $h1 +check_virtio_debugfs $h2 + +trap cleanup EXIT + +setup_prepare + +tests_run + +exit "$EXIT_STATUS" diff --git a/tools/testing/selftests/drivers/net/virtio_net/virtio_net_common.sh b/tools/testing/selftests/drivers/net/virtio_net/virtio_net_common.sh new file mode 100644 index 000000000000..57bd8055e2e5 --- /dev/null +++ b/tools/testing/selftests/drivers/net/virtio_net/virtio_net_common.sh @@ -0,0 +1,99 @@ +#!/bin/bash +# SPDX-License-Identifier: GPL-2.0 + +# This assumes running on a host with two virtio interfaces connected +# back to back. Example script to do such wire-up of tap devices would +# look like this: +# +# ======================================================================================================= +# #!/bin/bash +# +# DEV1="$1" +# DEV2="$2" +# +# sudo tc qdisc add dev $DEV1 clsact +# sudo tc qdisc add dev $DEV2 clsact +# sudo tc filter add dev $DEV1 ingress protocol all pref 1 matchall action mirred egress redirect dev $DEV2 +# sudo tc filter add dev $DEV2 ingress protocol all pref 1 matchall action mirred egress redirect dev $DEV1 +# sudo ip link set $DEV1 up +# sudo ip link set $DEV2 up +# ======================================================================================================= + +REQUIRE_MZ="no" +NETIF_CREATE="no" +NETIF_FIND_DRIVER="virtio_net" +NUM_NETIFS=2 + +H1_IPV4="192.0.2.1" +H2_IPV4="192.0.2.2" +H1_IPV6="2001:db8:1::1" +H2_IPV6="2001:db8:1::2" + +VIRTIO_NET_F_MAC=5 + +virtio_device_get() +{ + local dev=$1; shift + local device_path="/sys/class/net/$dev/device/" + + basename `realpath $device_path` +} + +virtio_device_rebind() +{ + local dev=$1; shift + local device=`virtio_device_get $dev` + + echo "$device" > /sys/bus/virtio/drivers/virtio_net/unbind + echo "$device" > /sys/bus/virtio/drivers/virtio_net/bind +} + +virtio_debugfs_get() +{ + local dev=$1; shift + local device=`virtio_device_get $dev` + + echo /sys/kernel/debug/virtio/$device/ +} + +check_virtio_debugfs() +{ + local dev=$1; shift + local debugfs=`virtio_debugfs_get $dev` + + if [ ! -f "$debugfs/device_features" ] || + [ ! -f "$debugfs/filter_feature_add" ] || + [ ! -f "$debugfs/filter_feature_del" ] || + [ ! -f "$debugfs/filter_features" ] || + [ ! -f "$debugfs/filter_features_clear" ]; then + echo "SKIP: not possible to access debugfs for $dev" + exit $ksft_skip + fi +} + +virtio_feature_present() +{ + local dev=$1; shift + local feature=$1; shift + local debugfs=`virtio_debugfs_get $dev` + + cat $debugfs/device_features |grep "^$feature$" &> /dev/null + return $? +} + +virtio_filter_features_clear() +{ + local dev=$1; shift + local debugfs=`virtio_debugfs_get $dev` + + echo "1" > $debugfs/filter_features_clear +} + +virtio_filter_feature_add() +{ + local dev=$1; shift + local feature=$1; shift + local debugfs=`virtio_debugfs_get $dev` + + echo "$feature" > $debugfs/filter_feature_add +}