aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/net/core/dev.c
diff options
context:
space:
mode:
Diffstat (limited to 'net/core/dev.c')
-rw-r--r--net/core/dev.c12
1 files changed, 12 insertions, 0 deletions
diff --git a/net/core/dev.c b/net/core/dev.c
index 151f1651439f..79c15f4244e6 100644
--- a/net/core/dev.c
+++ b/net/core/dev.c
@@ -4630,6 +4630,18 @@ static u32 netif_receive_generic_xdp(struct sk_buff *skb,
* header.
*/
mac_len = skb->data - skb_mac_header(skb);
+ if (!mac_len && !skb->dev->hard_header_len) {
+ /* For l3 packets, we push on a fake mac header, and then
+ * pull it off again, so that it has the same skb geometry
+ * as for the l2 case.
+ */
+ eth = skb_push(skb, ETH_HLEN);
+ eth_zero_addr(eth->h_source);
+ eth_zero_addr(eth->h_dest);
+ eth->h_proto = skb->protocol;
+ __skb_pull(skb, ETH_HLEN);
+ mac_len = ETH_HLEN;
+ }
hlen = skb_headlen(skb) + mac_len;
xdp->data = skb->data - mac_len;
xdp->data_meta = xdp->data;