diff options
author | Herbert Xu <herbert@gondor.apana.org.au> | 2011-11-17 21:20:04 -0500 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2011-11-18 14:37:08 -0500 |
commit | 660882432909dbe611f1792eda158188065cb9f1 (patch) | |
tree | 101be8ad6357197cff3dcd6daf573dadab2cdd6b /net/ipv4/arp.c | |
parent | 505a467b66233fd08ac32fca943100130928bf89 (diff) |
ipv4: Remove all uses of LL_ALLOCATED_SPACE
ipv4: Remove all uses of LL_ALLOCATED_SPACE
The macro LL_ALLOCATED_SPACE was ill-conceived. It applies the
alignment to the sum of needed_headroom and needed_tailroom. As
the amount that is then reserved for head room is needed_headroom
with alignment, this means that the tail room left may be too small.
This patch replaces all uses of LL_ALLOCATED_SPACE in net/ipv4
with the macro LL_RESERVED_SPACE and direct reference to
needed_tailroom.
This also fixes the problem with needed_headroom changing between
allocating the skb and reserving the head room.
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net/ipv4/arp.c')
-rw-r--r-- | net/ipv4/arp.c | 6 |
1 files changed, 4 insertions, 2 deletions
diff --git a/net/ipv4/arp.c b/net/ipv4/arp.c index d732827b32b9..5c29ac5b0c3a 100644 --- a/net/ipv4/arp.c +++ b/net/ipv4/arp.c | |||
@@ -592,16 +592,18 @@ struct sk_buff *arp_create(int type, int ptype, __be32 dest_ip, | |||
592 | struct sk_buff *skb; | 592 | struct sk_buff *skb; |
593 | struct arphdr *arp; | 593 | struct arphdr *arp; |
594 | unsigned char *arp_ptr; | 594 | unsigned char *arp_ptr; |
595 | int hlen = LL_RESERVED_SPACE(dev); | ||
596 | int tlen = dev->needed_tailroom; | ||
595 | 597 | ||
596 | /* | 598 | /* |
597 | * Allocate a buffer | 599 | * Allocate a buffer |
598 | */ | 600 | */ |
599 | 601 | ||
600 | skb = alloc_skb(arp_hdr_len(dev) + LL_ALLOCATED_SPACE(dev), GFP_ATOMIC); | 602 | skb = alloc_skb(arp_hdr_len(dev) + hlen + tlen, GFP_ATOMIC); |
601 | if (skb == NULL) | 603 | if (skb == NULL) |
602 | return NULL; | 604 | return NULL; |
603 | 605 | ||
604 | skb_reserve(skb, LL_RESERVED_SPACE(dev)); | 606 | skb_reserve(skb, hlen); |
605 | skb_reset_network_header(skb); | 607 | skb_reset_network_header(skb); |
606 | arp = (struct arphdr *) skb_put(skb, arp_hdr_len(dev)); | 608 | arp = (struct arphdr *) skb_put(skb, arp_hdr_len(dev)); |
607 | skb->dev = dev; | 609 | skb->dev = dev; |