mirror of https://lore.kernel.org/lkml/
 help / color / mirror / Atom feed
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

  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®