netdev.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Christoph Hellwig <hch@infradead.org>
To: Matt Domsch <Matt_Domsch@dell.com>
Cc: netdev@oss.sgi.com, pptpclient-devel@lists.sourceforge.net,
	paulus@samba.org
Subject: Re: RFC: [1/2] PPP MPPE module
Date: Fri, 18 Jun 2004 17:15:58 +0100	[thread overview]
Message-ID: <20040618161558.GA22913@infradead.org> (raw)
In-Reply-To: <20040618161242.GG19269@lists.us.dell.com>

Last time I talked to Paul on MPPE he didn't like those hacks in
the ppp core.

> --- 1.45/drivers/net/ppp_generic.c	2004-04-09 18:21:06 -05:00
> +++ edited/drivers/net/ppp_generic.c	2004-06-18 09:47:10 -05:00
> @@ -1066,8 +1066,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;
> @@ -1079,15 +1086,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;
>  		}
>  	}
>  
> @@ -1596,7 +1615,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;
> ===== include/linux/ppp-comp.h 1.4 vs edited =====
> --- 1.4/include/linux/ppp-comp.h	2003-08-07 18:57:19 -05:00
> +++ edited/include/linux/ppp-comp.h	2004-06-18 09:46:32 -05:00
> @@ -191,6 +191,100 @@
>  #define DEFLATE_CHK_SEQUENCE	0
>  
>  /*
> + * Definitions for MPPE.
> + */
> +
> +#define CI_MPPE                        18      /* config option for MPPE */
> +#define CILEN_MPPE             6       /* length of config option */
> +
> +#define MPPE_PAD               8       /* MPPE growth per frame */
> +#define MPPE_MAX_KEY_LEN       16      /* largest key length (128-bit) */
> +
> +/* option bits for ccp_options.mppe */
> +#define MPPE_OPT_40            0x01    /* 40 bit */
> +#define MPPE_OPT_128           0x02    /* 128 bit */
> +#define MPPE_OPT_STATEFUL      0x04    /* stateful mode */
> +/* unsupported opts */
> +#define MPPE_OPT_56            0x08    /* 56 bit */
> +#define MPPE_OPT_MPPC          0x10    /* MPPC compression */
> +#define MPPE_OPT_D             0x20    /* Unknown */
> +#define MPPE_OPT_UNSUPPORTED (MPPE_OPT_56|MPPE_OPT_MPPC|MPPE_OPT_D)
> +#define MPPE_OPT_UNKNOWN       0x40    /* Bits !defined in RFC 3078 were set */
> +
> +/*
> + * This is not nice ... the alternative is a bitfield struct though.
> + * And unfortunately, we cannot share the same bits for the option
> + * names above since C and H are the same bit.  We could do a u_int32
> + * but then we have to do a htonl() all the time and/or we still need
> + * to know which octet is which.
> + */
> +#define MPPE_C_BIT             0x01    /* MPPC */
> +#define MPPE_D_BIT             0x10    /* Obsolete, usage unknown */
> +#define MPPE_L_BIT             0x20    /* 40-bit */
> +#define MPPE_S_BIT             0x40    /* 128-bit */
> +#define MPPE_M_BIT             0x80    /* 56-bit, not supported */
> +#define MPPE_H_BIT             0x01    /* Stateless (in a different byte) */
> +
> +/* Does not include H bit; used for least significant octet only. */
> +#define MPPE_ALL_BITS (MPPE_D_BIT|MPPE_L_BIT|MPPE_S_BIT|MPPE_M_BIT|MPPE_H_BIT)
> +
> +/* Build a CI from mppe opts (see RFC 3078) */
> +#define MPPE_OPTS_TO_CI(opts, ci)              \
> +    do {                                       \
> +       u_char *ptr = ci; /* u_char[4] */       \
> +                                               \
> +       /* H bit */                             \
> +       if (opts & MPPE_OPT_STATEFUL)           \
> +           *ptr++ = 0x0;                       \
> +       else                                    \
> +           *ptr++ = MPPE_H_BIT;                \
> +       *ptr++ = 0;                             \
> +       *ptr++ = 0;                             \
> +                                               \
> +       /* S,L bits */                          \
> +       *ptr = 0;                               \
> +       if (opts & MPPE_OPT_128)                \
> +           *ptr |= MPPE_S_BIT;                 \
> +       if (opts & MPPE_OPT_40)                 \
> +           *ptr |= MPPE_L_BIT;                 \
> +       /* M,D,C bits not supported */          \
> +    } while (/* CONSTCOND */ 0)
> +
> +/* The reverse of the above */
> +#define MPPE_CI_TO_OPTS(ci, opts)              \
> +    do {                                       \
> +       u_char *ptr = ci; /* u_char[4] */       \
> +                                               \
> +       opts = 0;                               \
> +                                               \
> +       /* H bit */                             \
> +       if (!(ptr[0] & MPPE_H_BIT))             \
> +           opts |= MPPE_OPT_STATEFUL;          \
> +                                               \
> +       /* S,L bits */                          \
> +       if (ptr[3] & MPPE_S_BIT)                \
> +           opts |= MPPE_OPT_128;               \
> +       if (ptr[3] & MPPE_L_BIT)                \
> +           opts |= MPPE_OPT_40;                \
> +                                               \
> +       /* M,D,C bits */                        \
> +       if (ptr[3] & MPPE_M_BIT)                \
> +           opts |= MPPE_OPT_56;                \
> +       if (ptr[3] & MPPE_D_BIT)                \
> +           opts |= MPPE_OPT_D;                 \
> +       if (ptr[3] & MPPE_C_BIT)                \
> +           opts |= MPPE_OPT_MPPC;              \
> +                                               \
> +       /* Other bits */                        \
> +       if (ptr[0] & ~MPPE_H_BIT)               \
> +           opts |= MPPE_OPT_UNKNOWN;           \
> +       if (ptr[1] || ptr[2])                   \
> +           opts |= MPPE_OPT_UNKNOWN;           \
> +       if (ptr[3] & ~MPPE_ALL_BITS)            \
> +           opts |= MPPE_OPT_UNKNOWN;           \
> +    } while (/* CONSTCOND */ 0)
> +
> +/*
>   * Definitions for other, as yet unsupported, compression methods.
>   */
>  

---end quoted text---

  reply	other threads:[~2004-06-18 16:15 UTC|newest]

Thread overview: 7+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2004-06-18 16:10 RFC: [0/3] PPP MPPE module Matt Domsch
2004-06-18 16:10 ` RFC: [1/3] " Matt Domsch
2004-06-18 18:03   ` Stephen Hemminger
2004-06-18 19:31     ` [pptp-devel] " Matt Domsch
2004-06-18 16:12 ` RFC: [1/2] " Matt Domsch
2004-06-18 16:15   ` Christoph Hellwig [this message]
2004-06-21 16:39     ` Matt Domsch

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20040618161558.GA22913@infradead.org \
    --to=hch@infradead.org \
    --cc=Matt_Domsch@dell.com \
    --cc=netdev@oss.sgi.com \
    --cc=paulus@samba.org \
    --cc=pptpclient-devel@lists.sourceforge.net \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).