Re: [PATCH net-next 2/2] selftests: drv-net: Add VLAN test
From: Nicolai Buchwitz <hidden>
Date: 2026-09-15 08:16:10
Also in:
linux-kselftest, lkml
Hi Ovidiu On 13.9.2026 16:39, Ovidiu Panait wrote:
Add a test that validates ping traffic over VLAN interfaces. It aims to catch drivers which mishandle hardware VLAN tag stripping, in particular QinQ. Three VLAN configurations are covered, each with hardware RX VLAN stripping enabled and disabled (via the rx-vlan-offload and rx-vlan-stag-hw-parse features): - a single 802.1q VLAN interface - a single 802.1ad VLAN interface - an 802.1q VLAN stacked on top of an 802.1ad interface The "hw" test variants enable the RX VLAN stripping features supported by the device (rx-vlan-offload and rx-vlan-stag-hw-parse), the "sw" test variants disable all of them. A test is xfailed if the requested configuration is not possible. VLAN insertion offloads are not tested for now. NETIF=end0 LOCAL_V4=172.16.0.2 REMOTE_V4=172.16.0.3 \ REMOTE_TYPE=ssh REMOTE_ARGS=root@172.16.0.3 \ run_kselftest.sh -t drivers/net/hw:vlan.py TAP version 13 1..1 # timeout set to 0 # selftests: drivers/net/hw: vlan.py # # Interface: end0, driver: st_gmac # TAP version 13 # 1..6 # ok 1 vlan.test.8021q_hw # ok 2 vlan.test.8021q_sw # ok 3 vlan.test.8021ad_hw # ok 4 vlan.test.8021ad_sw # ok 5 vlan.test.qinq_hw # ok 6 vlan.test.qinq_sw # # Totals: pass:6 fail:0 xfail:0 xpass:0 skip:0 error:0 ok 1 selftests: drivers/net/hw: vlan.py # Totals: pass:1 fail:0 xfail:0 xpass:0 skip:0 error:0 Signed-off-by: Ovidiu Panait <redacted>
[...]
+def _setup(cfg, outer_proto, inner_proto, hw_strip):
+ """Configure VLAN stripping and create the VLAN interfaces."""
+
+ names = ["rx-vlan-offload"]
+ if outer_proto == "802.1ad":
+ names.append("rx-vlan-stag-hw-parse")
+
+ feat = ethtool(f"-k {cfg.ifname}", json=True)[0]
+ feats = {}
+ for name in names:
+ # hw: skip the features the device does not support
+ # sw: request all of them off
+ if hw_strip and feat[name]["fixed"] and not
feat[name]["active"]:
+ continue
+ feats[name] = hw_strip
+
+ if hw_strip and not feats:
+ raise KsftXfailEx("Device does not support RX VLAN stripping")
+
+ set_ethtool_feat(cfg.ifname, feat, feats)
If a driver refuses to set the feature, set_ethtool_feat() would not
fail
and the test would be false positive.
I did a quick search and at least intel iavf could run into this:
drivers/net/ethernet/intel/iavf/iavf_main.c:iavf_fix_strip_features()
{
[...]
if ((netdev->features & NETIF_F_RXFCS) && is_vlan_strip) {
requested_features &= ~vlan_strip;
[...]
}
IMHO the test should check if the feature actually got enabled. This
could be wrapped in set_ethtool_feat() or be checked afterwards. I would
lean towards the first one.
[...]
Thanks, Nicolai