mirror of
https://github.com/torvalds/linux.git
synced 2026-09-22 12:44:03 +02:00
net: libwx: disable TX VLAN offload for packets with >2 VLAN tags
The current hardware does not support TX VLAN offload for packets with three or more VLAN tags. When such packets are transmitted with hardware VLAN offload enabled, the hardware may malfunction or produce corrupted frames. Add a check in wx_features_check() to parse the VLAN depth of the skb. If more than two VLAN tags are detected (including both the hardware tag and in-band tags), strip NETIF_F_HW_VLAN_CTAG_TX and NETIF_F_HW_VLAN_STAG_TX from the feature set. This forces the kernel networking stack to handle VLAN insertion in software for these specific packets, ensuring correct transmission. Signed-off-by: Jiawen Wu <jiawenwu@trustnetic.com> Link: https://patch.msgid.link/069DF89AA8029189+20260713060441.276612-1-jiawenwu@trustnetic.com Signed-off-by: Jakub Kicinski <kuba@kernel.org>
This commit is contained in:
parent
40c705961d
commit
f5cfb576ce
|
|
@ -3228,6 +3228,30 @@ netdev_features_t wx_features_check(struct sk_buff *skb,
|
|||
netdev_features_t features)
|
||||
{
|
||||
struct wx *wx = netdev_priv(netdev);
|
||||
__be16 type = skb->protocol;
|
||||
u16 vlan_depth = ETH_HLEN;
|
||||
u32 vlan_num = 0;
|
||||
|
||||
if (skb_vlan_tag_present(skb))
|
||||
vlan_num++;
|
||||
|
||||
while (eth_type_vlan(type)) {
|
||||
struct vlan_hdr vhdr, *vh;
|
||||
|
||||
vh = skb_header_pointer(skb, vlan_depth, sizeof(vhdr), &vhdr);
|
||||
if (unlikely(!vh))
|
||||
break;
|
||||
|
||||
type = vh->h_vlan_encapsulated_proto;
|
||||
vlan_depth += VLAN_HLEN;
|
||||
vlan_num++;
|
||||
|
||||
if (vlan_num > 2) {
|
||||
features &= ~(NETIF_F_HW_VLAN_CTAG_TX |
|
||||
NETIF_F_HW_VLAN_STAG_TX);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (!skb->encapsulation)
|
||||
return features;
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user