Message ID | 20140611113109.4c104592@nehalam.linuxnetplumber.net |
---|---|
State | Rejected, archived |
Delegated to: | David Miller |
Headers | show |
On Wed, 2014-06-11 at 11:31 -0700, Stephen Hemminger wrote: > IPv6 neighbor discovery should use netdev_alloc_skb which adds > extra space for headroom. The old code would allocate packet w/o any > additional headroom and force drivers to reallocate and copy the > packet in some cases. > > Signed-off-by: Stephen Hemminger <stephen@networkplumber.org> > > > --- a/net/ipv6/ndisc.c 2014-06-03 08:06:35.549942475 -0700 > +++ b/net/ipv6/ndisc.c 2014-06-11 08:54:31.729764741 -0700 > @@ -375,7 +375,7 @@ static struct sk_buff *ndisc_alloc_skb(s > struct sock *sk = dev_net(dev)->ipv6.ndisc_sk; > struct sk_buff *skb; > > - skb = alloc_skb(hlen + sizeof(struct ipv6hdr) + len + tlen, GFP_ATOMIC); > + skb = netdev_alloc_skb(dev, hlen + sizeof(struct ipv6hdr) + len + tlen); > if (!skb) { This looks strange. netdev_alloc_skb() is mostly used for RX. Perhaps you need to increase hlen with the needed room, because NET_SKB_PAD might be only 32, and its a bit hidden. ie use LL_RESERVED_SPACE_EXTRA() instead of LL_RESERVED_SPACE(), to make clear what the intentions are. -- To unsubscribe from this list: send the line "unsubscribe netdev" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
On Wed, 11 Jun 2014 12:58:22 -0700 Eric Dumazet <eric.dumazet@gmail.com> wrote: > On Wed, 2014-06-11 at 11:31 -0700, Stephen Hemminger wrote: > > IPv6 neighbor discovery should use netdev_alloc_skb which adds > > extra space for headroom. The old code would allocate packet w/o any > > additional headroom and force drivers to reallocate and copy the > > packet in some cases. > > > > Signed-off-by: Stephen Hemminger <stephen@networkplumber.org> > > > > > > --- a/net/ipv6/ndisc.c 2014-06-03 08:06:35.549942475 -0700 > > +++ b/net/ipv6/ndisc.c 2014-06-11 08:54:31.729764741 -0700 > > @@ -375,7 +375,7 @@ static struct sk_buff *ndisc_alloc_skb(s > > struct sock *sk = dev_net(dev)->ipv6.ndisc_sk; > > struct sk_buff *skb; > > > > - skb = alloc_skb(hlen + sizeof(struct ipv6hdr) + len + tlen, GFP_ATOMIC); > > + skb = netdev_alloc_skb(dev, hlen + sizeof(struct ipv6hdr) + len + tlen); > > if (!skb) { > > This looks strange. > > netdev_alloc_skb() is mostly used for RX. > > Perhaps you need to increase hlen with the needed room, because > NET_SKB_PAD might be only 32, and its a bit hidden. > > ie use LL_RESERVED_SPACE_EXTRA() instead of LL_RESERVED_SPACE(), to make > clear what the intentions are. Never mind, I just saw a packet w/o space show up. It was because of bad driver hard header len -- To unsubscribe from this list: send the line "unsubscribe netdev" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
--- a/net/ipv6/ndisc.c 2014-06-03 08:06:35.549942475 -0700 +++ b/net/ipv6/ndisc.c 2014-06-11 08:54:31.729764741 -0700 @@ -375,7 +375,7 @@ static struct sk_buff *ndisc_alloc_skb(s struct sock *sk = dev_net(dev)->ipv6.ndisc_sk; struct sk_buff *skb; - skb = alloc_skb(hlen + sizeof(struct ipv6hdr) + len + tlen, GFP_ATOMIC); + skb = netdev_alloc_skb(dev, hlen + sizeof(struct ipv6hdr) + len + tlen); if (!skb) { ND_PRINTK(0, err, "ndisc: %s failed to allocate an skb\n", __func__); @@ -383,7 +383,6 @@ static struct sk_buff *ndisc_alloc_skb(s } skb->protocol = htons(ETH_P_IPV6); - skb->dev = dev; skb_reserve(skb, hlen + sizeof(struct ipv6hdr)); skb_reset_transport_header(skb);
IPv6 neighbor discovery should use netdev_alloc_skb which adds extra space for headroom. The old code would allocate packet w/o any additional headroom and force drivers to reallocate and copy the packet in some cases. Signed-off-by: Stephen Hemminger <stephen@networkplumber.org> -- To unsubscribe from this list: send the line "unsubscribe netdev" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html