From: Jason A. Donenfeld Date: Tue, 30 Jun 2020 01:06:24 +0000 (-0600) Subject: net: sit: implement header_ops->parse_protocol for AF_PACKET X-Git-Tag: v5.8-rc5~11^2~58^2~1 X-Git-Url: https://www.infradead.org/git/?a=commitdiff_plain;h=75ea1f4773c09730bf8a364a367f6e7211484e12;p=users%2Fdwmw2%2Flinux.git net: sit: implement header_ops->parse_protocol for AF_PACKET Sit uses skb->protocol to determine packet type, and bails out if it's not set. For AF_PACKET injection, we need to support its call chain of: packet_sendmsg -> packet_snd -> packet_parse_headers -> dev_parse_header_protocol -> parse_protocol Without a valid parse_protocol, this returns zero, and sit rejects the skb. So, this wires up the ip_tunnel handler for layer 3 packets for that case. Reported-by: Willem de Bruijn Signed-off-by: Jason A. Donenfeld Signed-off-by: David S. Miller --- diff --git a/net/ipv6/sit.c b/net/ipv6/sit.c index 1fbb4dfbb191b..5e2c34c0ac973 100644 --- a/net/ipv6/sit.c +++ b/net/ipv6/sit.c @@ -1421,6 +1421,7 @@ static void ipip6_tunnel_setup(struct net_device *dev) int t_hlen = tunnel->hlen + sizeof(struct iphdr); dev->netdev_ops = &ipip6_netdev_ops; + dev->header_ops = &ip_tunnel_header_ops; dev->needs_free_netdev = true; dev->priv_destructor = ipip6_dev_free;