aboutsummaryrefslogtreecommitdiffstats
path: root/net/ipv4/raw.c
diff options
context:
space:
mode:
authorHerbert Xu <herbert@gondor.apana.org.au>2011-11-17 21:20:04 -0500
committerDavid S. Miller <davem@davemloft.net>2011-11-18 14:37:08 -0500
commit660882432909dbe611f1792eda158188065cb9f1 (patch)
tree101be8ad6357197cff3dcd6daf573dadab2cdd6b /net/ipv4/raw.c
parent505a467b66233fd08ac32fca943100130928bf89 (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/raw.c')
-rw-r--r--net/ipv4/raw.c7
1 files changed, 5 insertions, 2 deletions
diff --git a/net/ipv4/raw.c b/net/ipv4/raw.c
index 7a8410d1b4b1..3ccda5ae8a27 100644
--- a/net/ipv4/raw.c
+++ b/net/ipv4/raw.c
@@ -328,6 +328,7 @@ static int raw_send_hdrinc(struct sock *sk, struct flowi4 *fl4,
328 unsigned int iphlen; 328 unsigned int iphlen;
329 int err; 329 int err;
330 struct rtable *rt = *rtp; 330 struct rtable *rt = *rtp;
331 int hlen, tlen;
331 332
332 if (length > rt->dst.dev->mtu) { 333 if (length > rt->dst.dev->mtu) {
333 ip_local_error(sk, EMSGSIZE, fl4->daddr, inet->inet_dport, 334 ip_local_error(sk, EMSGSIZE, fl4->daddr, inet->inet_dport,
@@ -337,12 +338,14 @@ static int raw_send_hdrinc(struct sock *sk, struct flowi4 *fl4,
337 if (flags&MSG_PROBE) 338 if (flags&MSG_PROBE)
338 goto out; 339 goto out;
339 340
341 hlen = LL_RESERVED_SPACE(rt->dst.dev);
342 tlen = rt->dst.dev->needed_tailroom;
340 skb = sock_alloc_send_skb(sk, 343 skb = sock_alloc_send_skb(sk,
341 length + LL_ALLOCATED_SPACE(rt->dst.dev) + 15, 344 length + hlen + tlen + 15,
342 flags & MSG_DONTWAIT, &err); 345 flags & MSG_DONTWAIT, &err);
343 if (skb == NULL) 346 if (skb == NULL)
344 goto error; 347 goto error;
345 skb_reserve(skb, LL_RESERVED_SPACE(rt->dst.dev)); 348 skb_reserve(skb, hlen);
346 349
347 skb->priority = sk->sk_priority; 350 skb->priority = sk->sk_priority;
348 skb->mark = sk->sk_mark; 351 skb->mark = sk->sk_mark;