From: Frank Cusack Date: Tue, 23 Mar 2004 23:31:45 +0000 (+0000) Subject: MPPE for 2.6. X-Git-Tag: ppp-2.4.7~248 X-Git-Url: http://git.ozlabs.org/?p=ppp.git;a=commitdiff_plain;h=2a7288026268a2a4bcbb622e496ebe77b4f66e6e MPPE for 2.6. Contributed by Thomas Sjolshagen and James Cameron --- diff --git a/linux/mppe/linux-2.6.2-include.patch b/linux/mppe/linux-2.6.2-include.patch new file mode 100644 index 0000000..f0bfbd9 --- /dev/null +++ b/linux/mppe/linux-2.6.2-include.patch @@ -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 index 0000000..5b32824 --- /dev/null +++ b/linux/mppe/linux-2.6.2-make.patch @@ -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 index 0000000..694be67 --- /dev/null +++ b/linux/mppe/linux-2.6.2-pad.patch @@ -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; diff --git a/linux/mppe/mppeinstall.sh b/linux/mppe/mppeinstall.sh index 60c7324..52ae7d1 100644 --- a/linux/mppe/mppeinstall.sh +++ b/linux/mppe/mppeinstall.sh @@ -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" diff --git a/linux/mppe/ppp_mppe_compress.c b/linux/mppe/ppp_mppe_compress.c index 33885df..6024edb 100644 --- a/linux/mppe/ppp_mppe_compress.c +++ b/linux/mppe/ppp_mppe_compress.c @@ -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 . - * 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 @@ -13,10 +11,16 @@ * notice appears in all copies. This software is provided without any * warranty, express or implied. * + * Changelog: + * 2/15/04 - TS: added #include and testing for Kernel + * version before using + * MOD_DEC_USAGE_COUNT/MOD_INC_USAGE_COUNT which are + * deprecated in 2.6 */ #include #include +#include #include #include #include @@ -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 } }