@@ -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+
369392static 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