Skip to content

Commit de09334

Browse files
yoshfujidavem330
authored andcommitted
ndisc: Introduce ndisc_alloc_skb() helper.
Signed-off-by: YOSHIFUJI Hideaki <[email protected]> Signed-off-by: David S. Miller <[email protected]>
1 parent 9c86daf commit de09334

File tree

1 file changed

+27
-25
lines changed

1 file changed

+27
-25
lines changed

net/ipv6/ndisc.c

Lines changed: 27 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -366,6 +366,29 @@ static void pndisc_destructor(struct pneigh_entry *n)
366366
ipv6_dev_mc_dec(dev, &maddr);
367367
}
368368

369+
static struct sk_buff *ndisc_alloc_skb(struct net_device *dev,
370+
int len)
371+
{
372+
int hlen = LL_RESERVED_SPACE(dev);
373+
int tlen = dev->needed_tailroom;
374+
struct sock *sk = dev_net(dev)->ipv6.ndisc_sk;
375+
struct sk_buff *skb;
376+
int err;
377+
378+
skb = sock_alloc_send_skb(sk,
379+
hlen + sizeof(struct ipv6hdr) + len + tlen,
380+
1, &err);
381+
if (!skb) {
382+
ND_PRINTK(0, err, "ndisc: %s failed to allocate an skb, err=%d\n",
383+
__func__, err);
384+
return NULL;
385+
}
386+
387+
skb_reserve(skb, hlen);
388+
389+
return skb;
390+
}
391+
369392
static struct sk_buff *ndisc_build_skb(struct net_device *dev,
370393
const struct in6_addr *daddr,
371394
const struct in6_addr *saddr,
@@ -377,10 +400,7 @@ static struct sk_buff *ndisc_build_skb(struct net_device *dev,
377400
struct sock *sk = net->ipv6.ndisc_sk;
378401
struct sk_buff *skb;
379402
struct icmp6hdr *hdr;
380-
int hlen = LL_RESERVED_SPACE(dev);
381-
int tlen = dev->needed_tailroom;
382403
int len;
383-
int err;
384404
u8 *opt;
385405

386406
if (!dev->addr_len)
@@ -390,17 +410,10 @@ static struct sk_buff *ndisc_build_skb(struct net_device *dev,
390410
if (llinfo)
391411
len += ndisc_opt_addr_space(dev);
392412

393-
skb = sock_alloc_send_skb(sk,
394-
(sizeof(struct ipv6hdr) +
395-
len + hlen + tlen),
396-
1, &err);
397-
if (!skb) {
398-
ND_PRINTK(0, err, "ND: %s failed to allocate an skb, err=%d\n",
399-
__func__, err);
413+
skb = ndisc_alloc_skb(dev, len);
414+
if (!skb)
400415
return NULL;
401-
}
402416

403-
skb_reserve(skb, hlen);
404417
ip6_nd_hdr(sk, skb, dev, saddr, daddr, IPPROTO_ICMPV6, len);
405418

406419
skb->transport_header = skb->tail;
@@ -1369,7 +1382,6 @@ void ndisc_send_redirect(struct sk_buff *skb, const struct in6_addr *target)
13691382
struct inet6_dev *idev;
13701383
struct flowi6 fl6;
13711384
u8 *opt;
1372-
int hlen, tlen;
13731385
int rd_len;
13741386
int err;
13751387
u8 ha_buf[MAX_ADDR_LEN], *ha = NULL;
@@ -1439,20 +1451,10 @@ void ndisc_send_redirect(struct sk_buff *skb, const struct in6_addr *target)
14391451
rd_len &= ~0x7;
14401452
len += rd_len;
14411453

1442-
hlen = LL_RESERVED_SPACE(dev);
1443-
tlen = dev->needed_tailroom;
1444-
buff = sock_alloc_send_skb(sk,
1445-
(sizeof(struct ipv6hdr) +
1446-
len + hlen + tlen),
1447-
1, &err);
1448-
if (buff == NULL) {
1449-
ND_PRINTK(0, err,
1450-
"Redirect: %s failed to allocate an skb, err=%d\n",
1451-
__func__, err);
1454+
buff = ndisc_alloc_skb(dev, len);
1455+
if (!buff)
14521456
goto release;
1453-
}
14541457

1455-
skb_reserve(buff, hlen);
14561458
ip6_nd_hdr(sk, buff, dev, &saddr_buf, &ipv6_hdr(skb)->saddr,
14571459
IPPROTO_ICMPV6, len);
14581460

0 commit comments

Comments
 (0)