summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPaolo Abeni <pabeni@redhat.com>2026-08-11 13:14:40 +0200
committerPaolo Abeni <pabeni@redhat.com>2026-08-11 13:14:40 +0200
commit37aae6f352284a07ef69553825aae2fbccc5c4dc (patch)
tree66f6cc5e467532e1b03826b2f4db4f36bcbbfd80
parentb37971686ec59fb027fa4910ba16805e68fddb97 (diff)
parentcbb35cbe8db268fefe34c23df15348cf99025298 (diff)
Merge branch 'fix-wrong-transport_header-when-sending-vlan-tagged-frames'
Wei Fang says: ==================== Fix wrong transport_header when sending VLAN-tagged frames When sending a VLAN-tagged frame via AF_PACKET or tap, calling skb_set_network_header() before skb_probe_transport_header() causes the flow dissector to misinterpret the inner protocol header as a VLAN header. As a result, transport_header is never set and remains at its uninitialized sentinel value (~0U). Move skb_probe_transport_header() to before skb_set_network_header() so the flow dissector sees network_header still pointing to the VLAN header and can correctly identify the transport layer. ==================== Link: https://patch.msgid.link/20260807063405.688780-1-wei.fang@oss.nxp.com Signed-off-by: Paolo Abeni <pabeni@redhat.com>
-rw-r--r--drivers/net/tap.c3
-rw-r--r--net/packet/af_packet.c4
2 files changed, 4 insertions, 3 deletions
diff --git a/drivers/net/tap.c b/drivers/net/tap.c
index 5d2d34d24ce8..9b5af08cdd47 100644
--- a/drivers/net/tap.c
+++ b/drivers/net/tap.c
@@ -1091,12 +1091,13 @@ static int tap_get_user_xdp(struct tap_queue *q, struct xdp_buff *xdp)
}
}
+ skb_probe_transport_header(skb);
+
/* Move network header to the right position for VLAN tagged packets */
if (eth_type_vlan(skb->protocol) &&
vlan_get_protocol_and_depth(skb, skb->protocol, &depth) != 0)
skb_set_network_header(skb, depth);
- skb_probe_transport_header(skb);
dev_queue_xmit(skb);
rcu_read_unlock();
diff --git a/net/packet/af_packet.c b/net/packet/af_packet.c
index 435756877aba..213a8a3b7ee5 100644
--- a/net/packet/af_packet.c
+++ b/net/packet/af_packet.c
@@ -1943,13 +1943,13 @@ static void packet_parse_headers(struct sk_buff *skb, struct socket *sock)
sock->type == SOCK_RAW)
skb->protocol = dev_parse_header_protocol(skb);
+ skb_probe_transport_header(skb);
+
/* Move network header to the right position for VLAN tagged packets */
if (likely(skb->dev->type == ARPHRD_ETHER) &&
eth_type_vlan(skb->protocol) &&
vlan_get_protocol_and_depth(skb, skb->protocol, &depth) != 0)
skb_set_network_header(skb, depth);
-
- skb_probe_transport_header(skb);
}
/*