summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDavid S. Miller <davem@davemloft.net>2013-08-30 17:39:33 -0400
committerDavid S. Miller <davem@davemloft.net>2013-08-30 17:39:33 -0400
commit25ad6117e73656071b38fd19fa67ae325471c758 (patch)
tree348b3944db7801af995a833338559ab7cb807f3a
parent737e828bdbdaf2f9d7de07f20a0308ac46ce5178 (diff)
downloadlinux-25ad6117e73656071b38fd19fa67ae325471c758.tar.gz
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.c10
1 files changed, 7 insertions, 3 deletions
diff --git a/net/ipv6/ndisc.c b/net/ipv6/ndisc.c
index 5cb98df..04d31c2 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,
{
int hlen = LL_RESERVED_SPACE(dev);
int tlen = dev->needed_tailroom;
+ struct sock *sk = dev_net(dev)->ipv6.ndisc_sk;
struct sk_buff *skb;
+ int err;
- skb = alloc_skb(hlen + sizeof(struct ipv6hdr) + len + tlen, GFP_ATOMIC);
+ skb = sock_alloc_send_skb(sk,
+ hlen + sizeof(struct ipv6hdr) + len + tlen,
+ 1, &err);
if (!skb) {
- ND_PRINTK(0, err, "ndisc: %s failed to allocate an skb\n",
- __func__);
+ ND_PRINTK(0, err, "ndisc: %s failed to allocate an skb, err=%d\n",
+ __func__, err);
return NULL;
}