Skip to content

Commit 762e7e1

Browse files
KanjiMonsterkuba-moo
authored andcommitted
net: dsa: tag_brcm: do not mark link local traffic as offloaded
Broadcom switches locally terminate link local traffic and do not forward it, so we should not mark it as offloaded. In some situations we still want/need to flood this traffic, e.g. if STP is disabled, or it is explicitly enabled via the group_fwd_mask. But if the skb is marked as offloaded, the kernel will assume this was already done in hardware, and the packets never reach other bridge ports. So ensure that link local traffic is never marked as offloaded, so that the kernel can forward/flood these packets in software if needed. Since the local termination in not configurable, check the destination MAC, and never mark packets as offloaded if it is a link local ether address. While modern switches set the tag reason code to BRCM_EG_RC_PROT_TERM for trapped link local traffic, they also set it for link local traffic that is flooded (01:80:c2:00:00:10 to 01:80:c2:00:00:2f), so we cannot use it and need to look at the destination address for them as well. Fixes: 964dbf1 ("net: dsa: tag_brcm: add support for legacy tags") Fixes: 0e62f54 ("net: dsa: Fix duplicate frames flooded by learning") Signed-off-by: Jonas Gorski <jonas.gorski@gmail.com> Reviewed-by: Vladimir Oltean <olteanv@gmail.com> Reviewed-by: Florian Fainelli <florian.fainelli@broadcom.com> Link: https://patch.msgid.link/20251109134635.243951-1-jonas.gorski@gmail.com Signed-off-by: Jakub Kicinski <kuba@kernel.org>
1 parent 60260ad commit 762e7e1

File tree

1 file changed

+4
-2
lines changed

1 file changed

+4
-2
lines changed

net/dsa/tag_brcm.c

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -176,7 +176,8 @@ static struct sk_buff *brcm_tag_rcv_ll(struct sk_buff *skb,
176176
/* Remove Broadcom tag and update checksum */
177177
skb_pull_rcsum(skb, BRCM_TAG_LEN);
178178

179-
dsa_default_offload_fwd_mark(skb);
179+
if (likely(!is_link_local_ether_addr(eth_hdr(skb)->h_dest)))
180+
dsa_default_offload_fwd_mark(skb);
180181

181182
return skb;
182183
}
@@ -250,7 +251,8 @@ static struct sk_buff *brcm_leg_tag_rcv(struct sk_buff *skb,
250251
/* Remove Broadcom tag and update checksum */
251252
skb_pull_rcsum(skb, len);
252253

253-
dsa_default_offload_fwd_mark(skb);
254+
if (likely(!is_link_local_ether_addr(eth_hdr(skb)->h_dest)))
255+
dsa_default_offload_fwd_mark(skb);
254256

255257
dsa_strip_etype_header(skb, len);
256258

0 commit comments

Comments
 (0)