diff options
| author | YOSHIFUJI Hideaki / 吉藤英明 <yoshfuji@linux-ipv6.org> | 2013-01-21 06:48:14 +0000 | 
|---|---|---|
| committer | David S. Miller <davem@davemloft.net> | 2013-01-21 13:33:15 -0500 | 
| commit | de09334b9326632bbf1a74bfd8b01866cbbf2f61 (patch) | |
| tree | fcdf6af7a7d1f529d41dbdd1d785c7f1337b1553 /net/ipv6 | |
| parent | 9c86dafe94f03679b77d85915e65da1304005a7c (diff) | |
ndisc: Introduce ndisc_alloc_skb() helper.
Signed-off-by: YOSHIFUJI Hideaki <yoshfuji@linux-ipv6.org>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net/ipv6')
| -rw-r--r-- | net/ipv6/ndisc.c | 52 | 
1 files changed, 27 insertions, 25 deletions
| diff --git a/net/ipv6/ndisc.c b/net/ipv6/ndisc.c index 53a545f32625..1776a0deee7f 100644 --- a/net/ipv6/ndisc.c +++ b/net/ipv6/ndisc.c @@ -366,6 +366,29 @@ static void pndisc_destructor(struct pneigh_entry *n)  	ipv6_dev_mc_dec(dev, &maddr);  } +static struct sk_buff *ndisc_alloc_skb(struct net_device *dev, +				       int len) +{ +	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 = 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, err=%d\n", +			  __func__, err); +		return NULL; +	} + +	skb_reserve(skb, hlen); + +	return skb; +} +  static struct sk_buff *ndisc_build_skb(struct net_device *dev,  				       const struct in6_addr *daddr,  				       const struct in6_addr *saddr, @@ -377,10 +400,7 @@ static struct sk_buff *ndisc_build_skb(struct net_device *dev,  	struct sock *sk = net->ipv6.ndisc_sk;  	struct sk_buff *skb;  	struct icmp6hdr *hdr; -	int hlen = LL_RESERVED_SPACE(dev); -	int tlen = dev->needed_tailroom;  	int len; -	int err;  	u8 *opt;  	if (!dev->addr_len) @@ -390,17 +410,10 @@ static struct sk_buff *ndisc_build_skb(struct net_device *dev,  	if (llinfo)  		len += ndisc_opt_addr_space(dev); -	skb = sock_alloc_send_skb(sk, -				  (sizeof(struct ipv6hdr) + -				   len + hlen + tlen), -				  1, &err); -	if (!skb) { -		ND_PRINTK(0, err, "ND: %s failed to allocate an skb, err=%d\n", -			  __func__, err); +	skb = ndisc_alloc_skb(dev, len); +	if (!skb)  		return NULL; -	} -	skb_reserve(skb, hlen);  	ip6_nd_hdr(sk, skb, dev, saddr, daddr, IPPROTO_ICMPV6, len);  	skb->transport_header = skb->tail; @@ -1369,7 +1382,6 @@ void ndisc_send_redirect(struct sk_buff *skb, const struct in6_addr *target)  	struct inet6_dev *idev;  	struct flowi6 fl6;  	u8 *opt; -	int hlen, tlen;  	int rd_len;  	int err;  	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)  	rd_len &= ~0x7;  	len += rd_len; -	hlen = LL_RESERVED_SPACE(dev); -	tlen = dev->needed_tailroom; -	buff = sock_alloc_send_skb(sk, -				   (sizeof(struct ipv6hdr) + -				    len + hlen + tlen), -				   1, &err); -	if (buff == NULL) { -		ND_PRINTK(0, err, -			  "Redirect: %s failed to allocate an skb, err=%d\n", -			  __func__, err); +	buff = ndisc_alloc_skb(dev, len); +	if (!buff)  		goto release; -	} -	skb_reserve(buff, hlen);  	ip6_nd_hdr(sk, buff, dev, &saddr_buf, &ipv6_hdr(skb)->saddr,  		   IPPROTO_ICMPV6, len); | 
