diff options
author | David S. Miller <davem@davemloft.net> | 2013-08-30 17:39:33 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2013-08-30 17:39:33 -0400 |
commit | 25ad6117e73656071b38fd19fa67ae325471c758 (patch) | |
tree | 348b3944db7801af995a833338559ab7cb807f3a | |
parent | 737e828bdbdaf2f9d7de07f20a0308ac46ce5178 (diff) |
Revert "ipv6: Don't depend on per socket memory for neighbour discovery messages"
This reverts commit 1f324e38870cc09659cf23bc626f1b8869e201f2.
It seems to cause regressions, and in particular the output path
really depends upon there being a socket attached to skb->sk for
checks such as sk_mc_loop(skb->sk) for example. See ip6_output_finish2().
Reported-by: Stephen Warren <swarren@wwwdotorg.org>
Reported-by: Fabio Estevam <festevam@gmail.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
-rw-r--r-- | net/ipv6/ndisc.c | 10 |
1 files changed, 7 insertions, 3 deletions
diff --git a/net/ipv6/ndisc.c b/net/ipv6/ndisc.c index 5cb98df966c2..04d31c2fbef1 100644 --- a/net/ipv6/ndisc.c +++ b/net/ipv6/ndisc.c | |||
@@ -370,12 +370,16 @@ static struct sk_buff *ndisc_alloc_skb(struct net_device *dev, | |||
370 | { | 370 | { |
371 | int hlen = LL_RESERVED_SPACE(dev); | 371 | int hlen = LL_RESERVED_SPACE(dev); |
372 | int tlen = dev->needed_tailroom; | 372 | int tlen = dev->needed_tailroom; |
373 | struct sock *sk = dev_net(dev)->ipv6.ndisc_sk; | ||
373 | struct sk_buff *skb; | 374 | struct sk_buff *skb; |
375 | int err; | ||
374 | 376 | ||
375 | skb = alloc_skb(hlen + sizeof(struct ipv6hdr) + len + tlen, GFP_ATOMIC); | 377 | skb = sock_alloc_send_skb(sk, |
378 | hlen + sizeof(struct ipv6hdr) + len + tlen, | ||
379 | 1, &err); | ||
376 | if (!skb) { | 380 | if (!skb) { |
377 | ND_PRINTK(0, err, "ndisc: %s failed to allocate an skb\n", | 381 | ND_PRINTK(0, err, "ndisc: %s failed to allocate an skb, err=%d\n", |
378 | __func__); | 382 | __func__, err); |
379 | return NULL; | 383 | return NULL; |
380 | } | 384 | } |
381 | 385 | ||