On Thu, Jan 17, 2019 at 4:10 AM Maxim Mikityanskiy <maxi...@mellanox.com> wrote: > > > > > +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. > > Sorry, I miss the point here, can you elaborate more? If all you need is > to have some header_ops callback that returns the L2 header length, > there is one already, it's called parse. Or do you have a specific > reason why you want my callback to also return the header length?
The main reason is to avoid multiple indirect function calls, both essentially doing the same: parsing the ll header. But admittedly the instances where dev->header_ops->validate are called are rare. > > This could just be an extension of existing header_ops->validate. > > If you suggest extending an existing function, parse looks more > suitable, but I decided not to touch the existing ones for two reasons: > > 1. I don't want to break the existing code that uses the parse function > and will need to be modified to pass an extra parameter. > > 2. I don't want to spend machine time on copying the destination MAC > when I only need the protocol, and vice versa. > > I'm looking forward to hearing your thoughts about it. header_ops.parse is also a good candidate. As a matter of fact, parse and validate could (eventually) probably be combined. The only direct caller to header_ops.parse appears to be dev_parse_header, so modifying its interface should be fairly straightforward. Allowing a NULL haddr could avoid the address copy cost if not needed. This does require modifying all implementations. But from a quick scan, there appear to be only 8. And only 1 for validate. So changing the implementation is quite acceptable. Another issue, though, would be what to return as protocol if a header does not encode that. Given these non-trivial changes, if you prefer to just add the dedicated new callback, that's fine. We can see independently whether deduplication makes sense. With three ll header parse functions, I think that it will be. But even if so, it is better to do so as a stand-alone noop patch than combining refactoring and new features, anyway. Long story short, sounds good. Thanks.