On Fri, Aug 29, 2025 at 09:54:30AM +0000, Hangbin Liu wrote: > make sure the virtual interface offload setting is correct after > changing lower devices. > > Signed-off-by: Hangbin Liu <liuhangbin@xxxxxxxxx> > --- > tools/testing/selftests/net/config | 2 + > tools/testing/selftests/net/vdev_offload.sh | 174 ++++++++++++++++++++ > 2 files changed, 176 insertions(+) > create mode 100755 tools/testing/selftests/net/vdev_offload.sh Need to add to the Makefile > > diff --git a/tools/testing/selftests/net/config b/tools/testing/selftests/net/config > index d548611e2698..0f3a64a86474 100644 > --- a/tools/testing/selftests/net/config > +++ b/tools/testing/selftests/net/config > @@ -117,6 +117,7 @@ CONFIG_IP_SCTP=m > CONFIG_NETFILTER_XT_MATCH_POLICY=m > CONFIG_CRYPTO_ARIA=y > CONFIG_XFRM_INTERFACE=m > +CONFIG_XFRM_OFFLOAD=y > CONFIG_XFRM_USER=m > CONFIG_IP_NF_MATCH_RPFILTER=m > CONFIG_IP6_NF_MATCH_RPFILTER=m > @@ -128,3 +129,4 @@ CONFIG_NETKIT=y > CONFIG_NET_PKTGEN=m > CONFIG_IPV6_ILA=m > CONFIG_IPV6_RPL_LWTUNNEL=y > +CONFIG_NET_TEAM=m > diff --git a/tools/testing/selftests/net/vdev_offload.sh b/tools/testing/selftests/net/vdev_offload.sh > new file mode 100755 > index 000000000000..4926774aef19 > --- /dev/null > +++ b/tools/testing/selftests/net/vdev_offload.sh > @@ -0,0 +1,174 @@ > +#!/bin/bash > +# SPDX-License-Identifier: GPL-2.0 > + > +# shellcheck disable=SC1091 > +source lib.sh > + > +# Set related offload on lower deivces and check if upper devices re-compute > +# Some fatures are fixed on veth interface. Just list here in case we have a s/fatures/features/ (:set spell) > +# better way to test in future. > +set_offload() > +{ > + local dev="$1" > + local state="$2" > + > + # VLAN features > + # NETIF_F_FRAGLIST: tx-scatter-gather-fraglist > + # shellcheck disable=SC2154 > + ip netns exec "$ns" ethtool -K "$dev" tx-scatter-gather-fraglist "$state" > + > + # ENC features > + # NETIF_F_RXCSUM: rx-checksum (bond/team/bridge fixed) > + > + # XFRM features (veth fixed, netdevsim supports) > + # NETIF_F_HW_ESP: esp-hw-offload > + # NETIF_F_GSO_ESP: tx-esp-segmentation > + > + # GSO partial features > + # NETIF_F_GSO_PARTIAL: tx-gso-partial (veth/bond fixed) > + > + # Common features > + # NETIF_F_SG: tx-scatter-gather > + ip netns exec "$ns" ethtool -K "$dev" tx-scatter-gather "$state" &> /dev/null Why the redirection here? I don't see it in other places > + # NETIF_F_GSO_SOFTWARE: NETIF_F_GSO_ACCECN: tx-tcp-accecn-segmentation > + ip netns exec "$ns" ethtool -K "$dev" tx-tcp-accecn-segmentation "$state" > + # NETIF_F_GSO_SOFTWARE: NETIF_F_GSO_SCTP: tx-sctp-segmentation > + ip netns exec "$ns" ethtool -K "$dev" tx-sctp-segmentation "$state" > + # NETIF_F_GSO_SOFTWARE: NETIF_F_GSO_FRAGLIST: tx-gso-list > + ip netns exec "$ns" ethtool -K "$dev" tx-gso-list "$state" > +} > + > +__check_offload() > +{ > + local dev=$1 > + local opt=$2 > + local expect=$3 > + > + ip netns exec "$ns" ethtool --json -k "$dev" | \ > + jq -r -e ".[].\"$opt\".active == ${expect}" >/dev/null > +} > + > +check_offload() > +{ > + local dev=$1 > + local state=$2 > + RET=0 > + > + __check_offload "$dev" "tx-scatter-gather-fraglist" "$state" || RET=1 > + __check_offload "$dev" "tx-scatter-gather" "$state" || RET=1 > + __check_offload "$dev" "tx-tcp-accecn-segmentation" "$state" || RET=1 > + __check_offload "$dev" "tx-sctp-segmentation" "$state" || RET=1 > + __check_offload "$dev" "tx-gso-list" "$state" || RET=1 > +} > + > +setup_veth() > +{ > + # Set up test netns > + setup_ns ns switch > + > + # shellcheck disable=SC2154 > + ip -n "$ns" link add veth0 type veth peer name veth0 netns "$switch" > + ip -n "$ns" link add veth1 type veth peer name veth1 netns "$switch" > + ip -n "$switch" link set veth0 up > + ip -n "$switch" link set veth1 up > + > + link_0=veth0 > + link_1=veth1 > +} > + > +setup_netdevsim() > +{ > + setup_ns ns > + # The create_netdevsim() function will set the interface up. Later, > + # when it is added to bonded, we need to set it down first. And when > + # set down, it will have no carrier. So we need to add netdevsim ourselves. > + modprobe netdevsim > + udevadm settle > + echo "0 2" | ip netns exec "$ns" tee /sys/bus/netdevsim/new_device >/dev/null > + link_0=$(ip netns exec "$ns" ls /sys/bus/netdevsim/devices/netdevsim0/net | head -n 1) > + link_1=$(ip netns exec "$ns" ls /sys/bus/netdevsim/devices/netdevsim0/net | tail -n 1) > +} > + > +cleanup() > +{ > + cleanup_netdevsim 0 > + cleanup_all_ns > +} > + > +setup_bond() > +{ > + ip -n "$ns" link set "$link_0" nomaster > + ip -n "$ns" link set "$link_1" nomaster > + ip -n "$ns" link add bond0 type bond mode active-backup miimon 100 > + ip -n "$ns" link set "$link_0" master bond0 > + ip -n "$ns" link set "$link_1" master bond0 > + ip -n "$ns" link set bond0 up > +} > + > +setup_team() > +{ > + ip -n "$ns" link set "$link_0" nomaster > + ip -n "$ns" link set "$link_1" nomaster > + ip -n "$ns" link add team0 type team > + ip -n "$ns" link set "$link_0" master team0 > + ip -n "$ns" link set "$link_1" master team0 > + ip -n "$ns" link set team0 up > +} > + > +setup_bridge() > +{ > + ip -n "$ns" link set "$link_0" nomaster > + ip -n "$ns" link set "$link_1" nomaster > + ip -n "$ns" link add br0 type bridge > + ip -n "$ns" link set "$link_0" master br0 > + ip -n "$ns" link set "$link_1" master br0 > + ip -n "$ns" link set br0 up > +} > + > +check_xfrm() > +{ > + local dev=$1 > + local src=192.0.2.1 > + local dst=192.0.2.2 > + local key="0x3132333435363738393031323334353664636261" > + > + RET=0 > + > + ip -n "$ns" xfrm state flush > + ip -n "$ns" xfrm state add proto esp src "$src" dst "$dst" spi 9 \ > + mode transport reqid 42 aead "rfc4106(gcm(aes))" "$key" 128 \ > + sel src "$src"/24 dst "$dst"/24 offload dev "$dev" dir out > + > + # shellcheck disable=SC2034 > + ip -n "$ns" xfrm state list | grep -q "crypto offload parameters: dev $dev dir" || RET=1 > + log_test "$dev" "xfrm offload" > +} > + > +do_test() > +{ > + local dev=$1 IMO, it makes more sense to put "RET=0" in the same function that calls log_test() (like you have it in check_xfrm()), so I would put it here... > + set_offload veth0 "on" > + set_offload veth1 "on" > + check_offload "$dev" "true" > + log_test "$dev" "enable offload" > + ... and here (instead of in check_offload()) > + set_offload veth0 "off" > + set_offload veth1 "off" > + check_offload "$dev" "false" > + log_test "$dev" "disable offload" > +} > + > +trap cleanup EXIT > +setup_veth > +setup_bond > +do_test bond0 > +setup_team > +do_test team0 > +setup_bridge > +do_test br0 > + > +# Check NETIF_F_HW_ESP > +# Only test bond as team and bridge haven't implemented xfrm offload > +setup_netdevsim > +setup_bond > +check_xfrm bond0 > -- > 2.50.1 >