--- /dev/null
+--- 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.
+ */
+
--- /dev/null
+--- 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
--- /dev/null
+--- 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;
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
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"
/*
- * ==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>
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. */
if (state) {
kfree(state);
+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0))
+ module_put(THIS_MODULE);
+#else
MOD_DEC_USE_COUNT;
+#endif
}
}