diff options
author | Eric Dumazet <eric.dumazet@gmail.com> | 2011-10-07 01:45:57 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2011-10-18 23:33:44 -0400 |
commit | 09df57ca604512b29b6096afb381c839ccbd2912 (patch) | |
tree | d7a820fea1ef93ad5a2e8ba74926b85b451428cb /net/l2tp/l2tp_ppp.c | |
parent | bc416d9768aa9a2e46eb11354a9c58399dafeb01 (diff) |
l2tp: give proper headroom in pppol2tp_xmit()
pppol2tp_xmit() calls skb_cow_head(skb, 2) before calling
l2tp_xmit_skb()
Then l2tp_xmit_skb() calls again skb_cow_head(skb, large_headroom)
This patchs changes the first skb_cow_head() call to supply the needed
headroom to make sure at most one (expensive) pskb_expand_head() is
done.
Signed-off-by: Eric Dumazet <eric.dumazet@gmail.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net/l2tp/l2tp_ppp.c')
-rw-r--r-- | net/l2tp/l2tp_ppp.c | 9 |
1 files changed, 8 insertions, 1 deletions
diff --git a/net/l2tp/l2tp_ppp.c b/net/l2tp/l2tp_ppp.c index f42cd0915966..8a90d756c904 100644 --- a/net/l2tp/l2tp_ppp.c +++ b/net/l2tp/l2tp_ppp.c | |||
@@ -395,6 +395,7 @@ static int pppol2tp_xmit(struct ppp_channel *chan, struct sk_buff *skb) | |||
395 | struct pppol2tp_session *ps; | 395 | struct pppol2tp_session *ps; |
396 | int old_headroom; | 396 | int old_headroom; |
397 | int new_headroom; | 397 | int new_headroom; |
398 | int uhlen, headroom; | ||
398 | 399 | ||
399 | if (sock_flag(sk, SOCK_DEAD) || !(sk->sk_state & PPPOX_CONNECTED)) | 400 | if (sock_flag(sk, SOCK_DEAD) || !(sk->sk_state & PPPOX_CONNECTED)) |
400 | goto abort; | 401 | goto abort; |
@@ -413,7 +414,13 @@ static int pppol2tp_xmit(struct ppp_channel *chan, struct sk_buff *skb) | |||
413 | goto abort_put_sess; | 414 | goto abort_put_sess; |
414 | 415 | ||
415 | old_headroom = skb_headroom(skb); | 416 | old_headroom = skb_headroom(skb); |
416 | if (skb_cow_head(skb, sizeof(ppph))) | 417 | uhlen = (tunnel->encap == L2TP_ENCAPTYPE_UDP) ? sizeof(struct udphdr) : 0; |
418 | headroom = NET_SKB_PAD + | ||
419 | sizeof(struct iphdr) + /* IP header */ | ||
420 | uhlen + /* UDP header (if L2TP_ENCAPTYPE_UDP) */ | ||
421 | session->hdr_len + /* L2TP header */ | ||
422 | sizeof(ppph); /* PPP header */ | ||
423 | if (skb_cow_head(skb, headroom)) | ||
417 | goto abort_put_sess_tun; | 424 | goto abort_put_sess_tun; |
418 | 425 | ||
419 | new_headroom = skb_headroom(skb); | 426 | new_headroom = skb_headroom(skb); |