--- net/ppp_generic.c 2003-09-27 20:51:03.000000000 -0400 +++ net/ppp_generic.c 2003-10-08 19:08:21.000000000 -0400 @@ -1045,8 +1045,15 @@ /* try to do packet compression */ if ((ppp->xstate & SC_COMP_RUN) && ppp->xc_state != 0 && proto != PPP_LCP && proto != PPP_CCP) { - new_skb = alloc_skb(ppp->dev->mtu + ppp->dev->hard_header_len, - GFP_ATOMIC); + int new_skb_size = ppp->dev->mtu + ppp->dev->hard_header_len; + int compressor_skb_size = ppp->dev->mtu + PPP_HDRLEN; + + if (ppp->xcomp->compress_proto == CI_MPPE) { + /* CCP [must have] reduced MTU by MPPE_PAD. */ + new_skb_size += MPPE_PAD; + compressor_skb_size += MPPE_PAD; + } + new_skb = alloc_skb(new_skb_size, GFP_ATOMIC); if (new_skb == 0) { printk(KERN_ERR "PPP: no memory (comp pkt)\n"); goto drop; @@ -1058,15 +1065,27 @@ /* compressor still expects A/C bytes in hdr */ len = ppp->xcomp->compress(ppp->xc_state, skb->data - 2, new_skb->data, skb->len + 2, - ppp->dev->mtu + PPP_HDRLEN); + compressor_skb_size); if (len > 0 && (ppp->flags & SC_CCP_UP)) { kfree_skb(skb); skb = new_skb; skb_put(skb, len); skb_pull(skb, 2); /* pull off A/C bytes */ - } else { + } else if (len == 0) { /* didn't compress, or CCP not up yet */ kfree_skb(new_skb); + } else { + /* + * (len < 0) + * MPPE requires that we do not send unencrypted + * frames. The compressor will return -1 if we + * should drop the frame. We cannot simply test + * the compress_proto because MPPE and MPPC share + * the same number. + */ + printk(KERN_ERR "ppp: compressor dropped pkt\n"); + kfree_skb(new_skb); + goto drop; } } @@ -1571,7 +1590,7 @@ goto err; if (proto == PPP_COMP) { - ns = dev_alloc_skb(ppp->mru + PPP_HDRLEN); + ns = dev_alloc_skb(ppp->mru + 128 + PPP_HDRLEN); if (ns == 0) { printk(KERN_ERR "ppp_decompress_frame: no memory\n"); goto err;