|
@@ -842,6 +842,7 @@ static int pppoe_sendmsg(struct socket *sock, struct msghdr *m,
|
|
|
struct pppoe_hdr *ph;
|
|
|
struct net_device *dev;
|
|
|
char *start;
|
|
|
+ int hlen;
|
|
|
|
|
|
lock_sock(sk);
|
|
|
if (sock_flag(sk, SOCK_DEAD) || !(sk->sk_state & PPPOX_CONNECTED)) {
|
|
@@ -860,16 +861,16 @@ static int pppoe_sendmsg(struct socket *sock, struct msghdr *m,
|
|
|
if (total_len > (dev->mtu + dev->hard_header_len))
|
|
|
goto end;
|
|
|
|
|
|
-
|
|
|
- skb = sock_wmalloc(sk, total_len + dev->hard_header_len + 32,
|
|
|
- 0, GFP_KERNEL);
|
|
|
+ hlen = LL_RESERVED_SPACE(dev);
|
|
|
+ skb = sock_wmalloc(sk, hlen + sizeof(*ph) + total_len +
|
|
|
+ dev->needed_tailroom, 0, GFP_KERNEL);
|
|
|
if (!skb) {
|
|
|
error = -ENOMEM;
|
|
|
goto end;
|
|
|
}
|
|
|
|
|
|
/* Reserve space for headers. */
|
|
|
- skb_reserve(skb, dev->hard_header_len);
|
|
|
+ skb_reserve(skb, hlen);
|
|
|
skb_reset_network_header(skb);
|
|
|
|
|
|
skb->dev = dev;
|
|
@@ -930,7 +931,7 @@ static int __pppoe_xmit(struct sock *sk, struct sk_buff *skb)
|
|
|
/* Copy the data if there is no space for the header or if it's
|
|
|
* read-only.
|
|
|
*/
|
|
|
- if (skb_cow_head(skb, sizeof(*ph) + dev->hard_header_len))
|
|
|
+ if (skb_cow_head(skb, LL_RESERVED_SPACE(dev) + sizeof(*ph)))
|
|
|
goto abort;
|
|
|
|
|
|
__skb_push(skb, sizeof(*ph));
|