On Mon, Jan 14, 2019 at 8:20 AM Maxim Mikityanskiy <maxi...@mellanox.com> wrote: > > If a socket was created with socket(AF_PACKET, SOCK_RAW, 0), the > protocol number is unavailable. Try to ask the driver to extract it from > the L2 header in order for skb_try_probe_transport_header to succeed. > > Signed-off-by: Maxim Mikityanskiy <maxi...@mellanox.com> > --- > net/packet/af_packet.c | 15 ++++++++++++--- > 1 file changed, 12 insertions(+), 3 deletions(-) > > diff --git a/net/packet/af_packet.c b/net/packet/af_packet.c > index 8fc76e68777a..d1d89749a17a 100644 > --- a/net/packet/af_packet.c > +++ b/net/packet/af_packet.c > @@ -1850,6 +1850,15 @@ static int packet_rcv_spkt(struct sk_buff *skb, struct > net_device *dev, > return 0; > } > > +static void packet_parse_headers(struct sk_buff *skb, struct socket *sock) > +{ > + if (!skb->protocol && sock->type == SOCK_RAW) { > + skb_reset_mac_header(skb); > + skb->protocol = dev_parse_header_protocol(skb); > + } > + > + skb_try_probe_transport_header(skb); > +}
In relation to the discussion at af_packet: fix raw sockets over 6in4 tunnel http://patchwork.ozlabs.org/patch/1023623/ if adding a new header_ops callback to parse link layer headers, please have it return both protocol and link layer header length. also, this information may be needed earlier in (t)packet_snd than the transport header, so I would suggest not combining the two in a new packet_parse_headers wrapper function.