From: Ido Schimmel <idosch@nvidia.com>
To: Alexandre Knecht <knecht.alexandre@gmail.com>, razor@blackwall.org
Cc: netdev@vger.kernel.org, roopa@nvidia.com
Subject: Re: [PATCH net] bridge: fix C-VLAN preservation in 802.1ad vlan_tunnel egress
Date: Tue, 30 Dec 2025 11:31:44 +0200 [thread overview]
Message-ID: <20251230093144.GA497224@shredder> (raw)
In-Reply-To: <20251228020057.2788865-1-knecht.alexandre@gmail.com>
+ Nik (Please use scripts/get_maintainer.pl next time)
On Sun, Dec 28, 2025 at 03:00:57AM +0100, Alexandre Knecht wrote:
> When using an 802.1ad bridge with vlan_tunnel, the C-VLAN tag is
> incorrectly stripped from frames during egress processing.
>
> br_handle_egress_vlan_tunnel() uses skb_vlan_pop() to remove the S-VLAN
> from hwaccel before VXLAN encapsulation. However, skb_vlan_pop() also
> moves any "next" VLAN from the payload into hwaccel:
>
> /* move next vlan tag to hw accel tag */
> __skb_vlan_pop(skb, &vlan_tci);
> __vlan_hwaccel_put_tag(skb, vlan_proto, vlan_tci);
>
> For QinQ frames where the C-VLAN sits in the payload, this moves it to
> hwaccel where it gets lost during VXLAN encapsulation.
>
> Fix by calling __vlan_hwaccel_clear_tag() directly, which clears only
> the hwaccel S-VLAN and leaves the payload untouched.
>
> This path is only taken when vlan_tunnel is enabled and tunnel_info
> is configured, so 802.1Q bridges are unaffected.
It's not clear from the commit message why 802.1Q bridges are
unaffected. I think you mean that in 802.1Q bridges the C-VLAN is never
in the payload and always in hwaccel (even when Tx VLAN offload is
disabled, thanks to commit 12464bb8de021).
>
> Tested with 802.1ad bridge + VXLAN vlan_tunnel, verified C-VLAN
> preserved in VXLAN payload via tcpdump.
>
> Fixes: 11538d039ac6 ("bridge: vlan dst_metadata hooks in ingress and egress paths")
> Signed-off-by: Alexandre Knecht <knecht.alexandre@gmail.com>
Looks correct to me:
Reviewed-by: Ido Schimmel <idosch@nvidia.com>
> ---
> net/bridge/br_vlan_tunnel.c | 11 +++++++----
> 1 file changed, 7 insertions(+), 4 deletions(-)
>
> diff --git a/net/bridge/br_vlan_tunnel.c b/net/bridge/br_vlan_tunnel.c
> index 12de0d1df0bc..a1b62507e521 100644
> --- a/net/bridge/br_vlan_tunnel.c
> +++ b/net/bridge/br_vlan_tunnel.c
> @@ -189,7 +189,6 @@ int br_handle_egress_vlan_tunnel(struct sk_buff *skb,
> IP_TUNNEL_DECLARE_FLAGS(flags) = { };
> struct metadata_dst *tunnel_dst;
> __be64 tunnel_id;
> - int err;
>
> if (!vlan)
> return 0;
> @@ -199,9 +198,13 @@ int br_handle_egress_vlan_tunnel(struct sk_buff *skb,
> return 0;
>
> skb_dst_drop(skb);
> - err = skb_vlan_pop(skb);
> - if (err)
> - return err;
> + /* For 802.1ad (QinQ), skb_vlan_pop() incorrectly moves the C-VLAN
> + * from payload to hwaccel after clearing S-VLAN. We only need to
> + * clear the hwaccel S-VLAN; the C-VLAN must stay in payload for
> + * correct VXLAN encapsulation. This is also correct for 802.1Q
> + * where no C-VLAN exists in payload.
> + */
> + __vlan_hwaccel_clear_tag(skb);
>
> if (BR_INPUT_SKB_CB(skb)->backup_nhid) {
> __set_bit(IP_TUNNEL_KEY_BIT, flags);
> --
> 2.43.0
next prev parent reply other threads:[~2025-12-30 9:31 UTC|newest]
Thread overview: 7+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-12-28 2:00 [PATCH net] bridge: fix C-VLAN preservation in 802.1ad vlan_tunnel egress Alexandre Knecht
2025-12-30 9:31 ` Ido Schimmel [this message]
2025-12-30 9:38 ` Nikolay Aleksandrov
2025-12-30 9:43 ` Nikolay Aleksandrov
2025-12-30 11:25 ` Alexandre Knecht
2025-12-30 12:03 ` Ido Schimmel
2026-01-04 18:22 ` patchwork-bot+netdevbpf
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=20251230093144.GA497224@shredder \
--to=idosch@nvidia.com \
--cc=knecht.alexandre@gmail.com \
--cc=netdev@vger.kernel.org \
--cc=razor@blackwall.org \
--cc=roopa@nvidia.com \
/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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.