diff options
Diffstat (limited to 'net')
-rw-r--r-- | net/packet/af_packet.c | 11 |
1 files changed, 11 insertions, 0 deletions
diff --git a/net/packet/af_packet.c b/net/packet/af_packet.c index e9ea7ff99bc0..b5c38ab3a93f 100644 --- a/net/packet/af_packet.c +++ b/net/packet/af_packet.c @@ -2097,6 +2097,15 @@ static void tpacket_destruct_skb(struct sk_buff *skb) sock_wfree(skb); } +static void tpacket_set_protocol(const struct net_device *dev, + struct sk_buff *skb) +{ + if (dev->type == ARPHRD_ETHER) { + skb_reset_mac_header(skb); + skb->protocol = eth_hdr(skb)->h_proto; + } +} + static int tpacket_fill_skb(struct packet_sock *po, struct sk_buff *skb, void *frame, struct net_device *dev, int size_max, __be16 proto, unsigned char *addr, int hlen) @@ -2182,6 +2191,8 @@ static int tpacket_fill_skb(struct packet_sock *po, struct sk_buff *skb, dev->hard_header_len); if (unlikely(err)) return err; + if (!skb->protocol) + tpacket_set_protocol(dev, skb); data += dev->hard_header_len; to_write -= dev->hard_header_len; |