From: Nicolai Buchwitz <nb@tipi-net.de>
To: Ovidiu Panait <ovidiu.panait.rb@renesas.com>
Cc: andrew+netdev@lunn.ch, davem@davemloft.net, edumazet@google.com,
kuba@kernel.org, pabeni@redhat.com, shuah@kernel.org,
linux-kernel@vger.kernel.org, netdev@vger.kernel.org,
linux-kselftest@vger.kernel.org
Subject: Re: [PATCH net-next v2 3/3] selftests: drv-net: Add VLAN test
Date: Fri, 18 Sep 2026 14:04:13 +0200 [thread overview]
Message-ID: <5be2136e4142427285566f01d95c1b7b@tipi-net.de> (raw)
In-Reply-To: <20260918112529.96039-4-ovidiu.panait.rb@renesas.com>
Hi Ovidiu
On 18.9.2026 13:25, 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 <ovidiu.panait.rb@renesas.com>
> ---
> [...]
> +LOCAL_IP = os.environ.get("VLAN_LOCAL_V4", "198.51.100.1")
> +REMOTE_IP = os.environ.get("VLAN_REMOTE_V4", "198.51.100.2")
LOCAL_IP = "198.51.100.1"
REMOTE_IP = "198.51.100.2"
IMHO it would be better to use cfg.env, so net.config is honoured.
Either way the vars (eg. VLAN_LOCAL_V4 / VLAN_REMOVE_V4) should be
mentioned in README.rst? Right now it is only stated in the v2 changelog
in this commit.
> +
> +
> +def _vlan_add(base, name, proto, vid, host=None):
> + """Create a VLAN device on top of base and bring it up."""
> +
> + ip(f"link add link {base} name {name} type vlan proto {proto} id
> {vid}",
> + host=host)
> + defer(ip, f"link del {name}", host=host)
> + ip(f"link set {name} up", host=host)
> +
> +
> +def _vlan_setup(base, addr, outer_proto, inner_proto, host=None):
> + """Create VLAN interfaces on base and set an IP on the innermost
> one."""
> +
> + _vlan_add(base, OUTER_DEV, outer_proto, OUTER_VID, host=host)
> + if inner_proto:
> + _vlan_add(OUTER_DEV, INNER_DEV, inner_proto, INNER_VID,
> host=host)
> +
> + dev = INNER_DEV if inner_proto else OUTER_DEV
> + ip(f"addr add {addr}/24 dev {dev}", host=host)
> +
> +
> +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)
> +
> + _vlan_setup(cfg.ifname, LOCAL_IP, outer_proto, inner_proto)
> + _vlan_setup(cfg.remote_ifname, REMOTE_IP, outer_proto,
> inner_proto,
LOCAL_IP -> cfg.local_ip
REMOTE_IP -> cfg.remote_ip
> + host=cfg.remote)
> +
> +
> +def _vlan_variants():
> + """Generator that yields the VLAN protocols and the stripping
> mode."""
> +
> + yield KsftNamedVariant("8021q_hw", "802.1q", None, True)
> + yield KsftNamedVariant("8021q_sw", "802.1q", None, False)
> + yield KsftNamedVariant("8021ad_hw", "802.1ad", None, True)
> + yield KsftNamedVariant("8021ad_sw", "802.1ad", None, False)
> + yield KsftNamedVariant("qinq_hw", "802.1ad", "802.1q", True)
> + yield KsftNamedVariant("qinq_sw", "802.1ad", "802.1q", False)
> +
> +
> +@ksft_variants(_vlan_variants())
> +def test(cfg, outer_proto, inner_proto, hw_strip):
> + """Run a single VLAN test"""
> +
> + _setup(cfg, outer_proto, inner_proto, hw_strip)
> +
> + cmd(f"ping -c 1 -W 5 {REMOTE_IP}")
REMOTE_IP -> cfg.remote_ip
> +
> +
> +def main() -> None:
> + """ Ksft boiler plate main """
> +
> + with NetDrvEpEnv(__file__) as cfg:
cfg.local_ip = cfg.env.get("VLAN_LOCAL_V4", LOCAL_IP)
cfg.remote_ip = cfg.env.get("VLAN_REMOTE_V4", REMOTE_IP)
> + ksft_run(cases=[test], args=(cfg, ))
> + ksft_exit()
> +
> +
> +if __name__ == "__main__":
> + main()
Thanks,
Nicolai
next prev parent reply other threads:[~2026-09-18 12:04 UTC|newest]
Thread overview: 7+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-09-18 11:25 [PATCH net-next v2 0/3] " Ovidiu Panait
2026-09-18 11:25 ` [PATCH net-next v2 1/3] selftests: drv-net: Move _set_ethtool_feat() into lib Ovidiu Panait
2026-09-18 11:25 ` [PATCH net-next v2 2/3] selftests: drv-net: Check the features set by set_ethtool_feat() Ovidiu Panait
2026-09-18 11:51 ` Nicolai Buchwitz
2026-09-18 11:25 ` [PATCH net-next v2 3/3] selftests: drv-net: Add VLAN test Ovidiu Panait
2026-09-18 12:04 ` Nicolai Buchwitz [this message]
2026-09-18 22:12 ` Jakub Kicinski
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=5be2136e4142427285566f01d95c1b7b@tipi-net.de \
--to=nb@tipi-net.de \
--cc=andrew+netdev@lunn.ch \
--cc=davem@davemloft.net \
--cc=edumazet@google.com \
--cc=kuba@kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-kselftest@vger.kernel.org \
--cc=netdev@vger.kernel.org \
--cc=ovidiu.panait.rb@renesas.com \
--cc=pabeni@redhat.com \
--cc=shuah@kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
all inboxes | Powered by JetHome®