]> git.ozlabs.org Git - ppp.git/commitdiff
MPPE for 2.6.
authorFrank Cusack <fcusack@fcusack.com>
Tue, 23 Mar 2004 23:31:45 +0000 (23:31 +0000)
committerFrank Cusack <fcusack@fcusack.com>
Tue, 23 Mar 2004 23:31:45 +0000 (23:31 +0000)
Contributed by Thomas Sjolshagen <thomas.sjolshagen@hp.com> and
James Cameron <james.cameron@hp.com>

linux/mppe/linux-2.6.2-include.patch [new file with mode: 0644]
linux/mppe/linux-2.6.2-make.patch [new file with mode: 0644]
linux/mppe/linux-2.6.2-pad.patch [new file with mode: 0644]
linux/mppe/mppeinstall.sh
linux/mppe/ppp_mppe_compress.c

diff --git a/linux/mppe/linux-2.6.2-include.patch b/linux/mppe/linux-2.6.2-include.patch
new file mode 100644 (file)
index 0000000..f0bfbd9
--- /dev/null
@@ -0,0 +1,103 @@
+--- linux-2.6.0-test6/include/linux/ppp-comp.h 2003-09-27 20:50:05.000000000 -0400
++++ linux-2.6.0-test6-mod/include/linux/ppp-comp.h     2003-10-08 19:32:13.000000000 -0400
+@@ -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.
+  */
+
diff --git a/linux/mppe/linux-2.6.2-make.patch b/linux/mppe/linux-2.6.2-make.patch
new file mode 100644 (file)
index 0000000..5b32824
--- /dev/null
@@ -0,0 +1,26 @@
+--- linux-2.6.2/drivers/net/Kconfig    2003-09-27 20:50:52.000000000 -0400
++++ linux-2.6.2/drivers/net/Kconfig    2003-10-08 19:06:10.000000000 -0400
+@@ -2310,6 +2310,12 @@
+         module; it is called bsd_comp and will show up in the directory
+         modules once you have said "make modules". If unsure, say N.
++config PPP_MPPE
++       tristate "PPP MPPE compression (encryption)"
++       depends on PPP
++       ---help---
++         Support for the MPPE Encryption protocol.
++
+ config PPPOE
+       tristate "PPP over Ethernet (EXPERIMENTAL)"
+       depends on EXPERIMENTAL && PPP
+--- linux-2.6.2/drivers/net/Makefile   2003-09-27 20:50:14.000000000 -0400
++++ linux-2.6.2/drivers/net/Makefile   2003-10-08 19:00:42.000000000 -0400
+@@ -101,6 +101,8 @@
+ obj-$(CONFIG_PPP_SYNC_TTY) += ppp_synctty.o
+ obj-$(CONFIG_PPP_DEFLATE) += ppp_deflate.o
+ obj-$(CONFIG_PPP_BSDCOMP) += bsd_comp.o
++obj-$(CONFIG_PPP_MPPE) += ppp_mppe.o
++ppp_mppe-objs := ppp_mppe_compress.o sha1.o arcfour.o
+ obj-$(CONFIG_PPPOE) += pppox.o pppoe.o
+ obj-$(CONFIG_SLIP) += slip.o
diff --git a/linux/mppe/linux-2.6.2-pad.patch b/linux/mppe/linux-2.6.2-pad.patch
new file mode 100644 (file)
index 0000000..694be67
--- /dev/null
@@ -0,0 +1,59 @@
+--- linux/drivers/net/ppp_generic.c    2003-09-27 20:51:03.000000000 -0400
++++ linux/drivers/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;
index 60c7324a107ef79fb3151f0ea8e8bc9fd3aa1015..52ae7d12e31661711567ccd82a0cc1263ba7b8e2 100644 (file)
@@ -15,9 +15,12 @@ fi
 set -- ${1%/}
 # strip leading /path/to/linux- and trailing -release
 ver=`echo "${1##*/}" | sed -e 's/linux-//' -e 's/-.*//'`
-if ! expr "$ver" : 2.[24] >/dev/null ; then
-    echo "$0: Unable to determine kernel version ($ver)" >&2
-    exit 1
+if ! expr "$ver" : 2.[246] >/dev/null ; then
+    ver=`echo "${1##*/}" | sed -e 's/kernel-source-//' -e 's/-.*//'`
+    if ! expr "$ver" : 2.[246] >/dev/null ; then
+        echo "$0: Unable to determine kernel version ($ver)" >&2
+        exit 1
+    fi
 fi
 
 # build patch files list
@@ -37,6 +40,8 @@ elif expr $ver : 2.4 >/dev/null ; then
        echo "$0: unable to determine kernel version" >&2
        exit 1
     fi
+elif expr $ver : 2.6 >/dev/null ; then
+    patchfiles=`echo $patchdir/linux-2.6*.patch`
 fi
 
 echo "Detected kernel version $ver"
index 33885df433211f92c433a65ef0548a30469b98e3..6024edbab7d488c247ecf40aca35d8d2059a1357 100644 (file)
@@ -1,11 +1,9 @@
 /*
- *  ==FILEVERSION 20020521==
- *
  * ppp_mppe_compress.c - interface MPPE to the PPP code.
- * This version is for use with Linux kernel 2.2.19+ and 2.4.x.
+ * This version is for use with Linux kernel 2.2.19+, 2.4.18+ and 2.6.2+.
  *
  * By Frank Cusack <frank@google.com>.
- * Copyright (c) 2002 Google, Inc.
+ * Copyright (c) 2002,2003,2004 Google, Inc.
  * All rights reserved.
  *
  * Permission to use, copy, modify, and distribute this software and its
  * notice appears in all copies.  This software is provided without any
  * warranty, express or implied.
  *
+ * Changelog:
+ *      2/15/04 - TS: added #include <version.h> and testing for Kernel
+ *                    version before using 
+ *                    MOD_DEC_USAGE_COUNT/MOD_INC_USAGE_COUNT which are
+ *                    deprecated in 2.6
  */
 
 #include <linux/module.h>
 #include <linux/kernel.h>
+#include <linux/version.h>
 #include <linux/init.h>
 #include <linux/types.h>
 #include <linux/slab.h>
@@ -170,7 +174,11 @@ mppe_alloc(unsigned char *options, int optlen)
     if (state == NULL)
        return NULL;
 
+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0))
+    try_module_get(THIS_MODULE);
+#else
     MOD_INC_USE_COUNT;
+#endif
     memset(state, 0, sizeof(*state));
 
     /* Save keys. */
@@ -194,7 +202,11 @@ mppe_free(void *arg)
 
     if (state) {
        kfree(state);
+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0))
+       module_put(THIS_MODULE);
+#else
        MOD_DEC_USE_COUNT;
+#endif
     }
 }