Author: jajcus                       Date: Fri Feb 24 07:51:38 2006 GMT
Module: SOURCES                       Tag: HEAD
---- Log message:
- MPPE/MPPC support from 
http://mppe-mppc.alphacron.de/ppp-2.4.3-mppe-mppc-1.1.patch.gz

---- Files affected:
SOURCES:
   ppp-2.4.3-mppe-mppc-1.1.patch (NONE -> 1.1)  (NEW)

---- Diffs:

================================================================
Index: SOURCES/ppp-2.4.3-mppe-mppc-1.1.patch
diff -u /dev/null SOURCES/ppp-2.4.3-mppe-mppc-1.1.patch:1.1
--- /dev/null   Fri Feb 24 08:51:38 2006
+++ SOURCES/ppp-2.4.3-mppe-mppc-1.1.patch       Fri Feb 24 08:51:33 2006
@@ -0,0 +1,1585 @@
+diff -ruN ppp-2.4.3.orig/include/linux/ppp-comp.h 
ppp-2.4.3/include/linux/ppp-comp.h
+--- ppp-2.4.3.orig/include/linux/ppp-comp.h    2002-12-06 10:49:15.000000000 
+0100
++++ ppp-2.4.3/include/linux/ppp-comp.h 2004-11-21 13:54:09.000000000 +0100
+@@ -36,7 +36,7 @@
+  */
+ 
+ /*
+- *  ==FILEVERSION 20020319==
++ *  ==FILEVERSION 20020715==
+  *
+  *  NOTE TO MAINTAINERS:
+  *     If you modify this file at all, please set the above date.
+@@ -86,7 +86,7 @@
+ 
+       /* Compress a packet */
+       int     (*compress) (void *state, unsigned char *rptr,
+-                            unsigned char *obuf, int isize, int osize);
++                           unsigned char *obuf, int isize, int osize);
+ 
+       /* Return compression statistics */
+       void    (*comp_stat) (void *state, struct compstat *stats);
+@@ -107,7 +107,7 @@
+ 
+       /* Decompress a packet. */
+       int     (*decompress) (void *state, unsigned char *ibuf, int isize,
+-                              unsigned char *obuf, int osize);
++                             unsigned char *obuf, int osize);
+ 
+       /* Update state for an incompressible packet received */
+       void    (*incomp) (void *state, unsigned char *ibuf, int icnt);
+@@ -288,6 +288,33 @@
+           opts |= MPPE_OPT_UNKNOWN;           \
+     } while (/* CONSTCOND */ 0)
+ 
++/* MPPE/MPPC definitions by J.D.*/
++#define MPPE_STATELESS          MPPE_H_BIT    /* configuration bit H */
++#define MPPE_40BIT              MPPE_L_BIT    /* configuration bit L */
++#define MPPE_56BIT              MPPE_M_BIT    /* configuration bit M */
++#define MPPE_128BIT             MPPE_S_BIT    /* configuration bit S */
++#define MPPE_MPPC               MPPE_C_BIT    /* configuration bit C */
++
++/*
++ * Definitions for Stac LZS.
++ */
++
++#define CI_LZS                        17      /* config option for Stac LZS */
++#define CILEN_LZS             5       /* length of config option */
++
++#define LZS_OVHD              4       /* max. LZS overhead */
++#define LZS_HIST_LEN          2048    /* LZS history size */
++#define LZS_MAX_CCOUNT                0x0FFF  /* max. coherency counter value 
*/
++
++#define LZS_MODE_NONE         0
++#define LZS_MODE_LCB          1
++#define LZS_MODE_CRC          2
++#define LZS_MODE_SEQ          3
++#define LZS_MODE_EXT          4
++
++#define LZS_EXT_BIT_FLUSHED   0x80    /* bit A */
++#define LZS_EXT_BIT_COMP      0x20    /* bit C */
++
+ /*
+  * Definitions for other, as yet unsupported, compression methods.
+  */
+diff -ruN ppp-2.4.3.orig/include/net/ppp-comp.h 
ppp-2.4.3/include/net/ppp-comp.h
+--- ppp-2.4.3.orig/include/net/ppp-comp.h      2002-12-06 10:49:15.000000000 
+0100
++++ ppp-2.4.3/include/net/ppp-comp.h   2004-11-21 13:54:09.000000000 +0100
+@@ -255,6 +255,33 @@
+           opts |= MPPE_OPT_UNKNOWN;           \
+     } while (/* CONSTCOND */ 0)
+ 
++/* MPPE/MPPC definitions by J.D.*/
++#define MPPE_STATELESS          MPPE_H_BIT    /* configuration bit H */
++#define MPPE_40BIT              MPPE_L_BIT    /* configuration bit L */
++#define MPPE_56BIT              MPPE_M_BIT    /* configuration bit M */
++#define MPPE_128BIT             MPPE_S_BIT    /* configuration bit S */
++#define MPPE_MPPC               MPPE_C_BIT    /* configuration bit C */
++
++/*
++ * Definitions for Stac LZS.
++ */
++
++#define CI_LZS                        17      /* config option for Stac LZS */
++#define CILEN_LZS             5       /* length of config option */
++
++#define LZS_OVHD              4       /* max. LZS overhead */
++#define LZS_HIST_LEN          2048    /* LZS history size */
++#define LZS_MAX_CCOUNT                0x0FFF  /* max. coherency counter value 
*/
++
++#define LZS_MODE_NONE         0
++#define LZS_MODE_LCB          1
++#define LZS_MODE_CRC          2
++#define LZS_MODE_SEQ          3
++#define LZS_MODE_EXT          4
++
++#define LZS_EXT_BIT_FLUSHED   0x80    /* bit A */
++#define LZS_EXT_BIT_COMP      0x20    /* bit C */
++
+ /*
+  * Definitions for other, as yet unsupported, compression methods.
+  */
+diff -ruN ppp-2.4.3.orig/pppd/ccp.c ppp-2.4.3/pppd/ccp.c
+--- ppp-2.4.3.orig/pppd/ccp.c  2004-11-13 03:28:15.000000000 +0100
++++ ppp-2.4.3/pppd/ccp.c       2004-11-21 13:54:09.000000000 +0100
+@@ -62,12 +62,10 @@
+ static char bsd_value[8];
+ static char deflate_value[8];
+ 
+-/*
+- * Option variables.
+- */
+ #ifdef MPPE
+-bool refuse_mppe_stateful = 1;                /* Allow stateful mode? */
+-#endif
++static int setmppe(char **);
++static int setnomppe(void);
++#endif /* MPPE */
+ 
+ static option_t ccp_option_list[] = {
+     { "noccp", o_bool, &ccp_protent.enabled_flag,
+@@ -108,54 +106,36 @@
+       "don't allow Predictor-1", OPT_ALIAS | OPT_PRIOSUB | OPT_A2CLR,
+       &ccp_allowoptions[0].predictor_1 },
+ 
++    { "lzs", o_bool, &ccp_wantoptions[0].lzs,
++      "request Stac LZS", 1, &ccp_allowoptions[0].lzs, OPT_PRIO },
++    { "+lzs", o_bool, &ccp_wantoptions[0].lzs,
++      "request Stac LZS", 1, &ccp_allowoptions[0].lzs, OPT_ALIAS | OPT_PRIO },
++    { "nolzs", o_bool, &ccp_wantoptions[0].lzs,
++      "don't allow Stac LZS", OPT_PRIOSUB | OPT_A2CLR,
++      &ccp_allowoptions[0].lzs },
++    { "-lzs", o_bool, &ccp_wantoptions[0].lzs,
++      "don't allow Stac LZS", OPT_ALIAS | OPT_PRIOSUB | OPT_A2CLR,
++      &ccp_allowoptions[0].lzs },
++
+ #ifdef MPPE
+-    /* MPPE options are symmetrical ... we only set wantoptions here */
+-    { "require-mppe", o_bool, &ccp_wantoptions[0].mppe,
+-      "require MPPE encryption",
+-      OPT_PRIO | MPPE_OPT_40 | MPPE_OPT_128 },
+-    { "+mppe", o_bool, &ccp_wantoptions[0].mppe,
+-      "require MPPE encryption",
+-      OPT_ALIAS | OPT_PRIO | MPPE_OPT_40 | MPPE_OPT_128 },
+-    { "nomppe", o_bool, &ccp_wantoptions[0].mppe,
+-      "don't allow MPPE encryption", OPT_PRIO },
+-    { "-mppe", o_bool, &ccp_wantoptions[0].mppe,
+-      "don't allow MPPE encryption", OPT_ALIAS | OPT_PRIO },
+-
+-    /* We use ccp_allowoptions[0].mppe as a junk var ... it is reset later */
+-    { "require-mppe-40", o_bool, &ccp_allowoptions[0].mppe,
+-      "require MPPE 40-bit encryption", OPT_PRIO | OPT_A2OR | MPPE_OPT_40,
+-      &ccp_wantoptions[0].mppe },
+-    { "+mppe-40", o_bool, &ccp_allowoptions[0].mppe,
+-      "require MPPE 40-bit encryption", OPT_PRIO | OPT_A2OR | MPPE_OPT_40,
+-      &ccp_wantoptions[0].mppe },
+-    { "nomppe-40", o_bool, &ccp_allowoptions[0].mppe,
+-      "don't allow MPPE 40-bit encryption",
+-      OPT_PRIOSUB | OPT_A2CLRB | MPPE_OPT_40, &ccp_wantoptions[0].mppe },
+-    { "-mppe-40", o_bool, &ccp_allowoptions[0].mppe,
+-      "don't allow MPPE 40-bit encryption",
+-      OPT_ALIAS | OPT_PRIOSUB | OPT_A2CLRB | MPPE_OPT_40,
+-      &ccp_wantoptions[0].mppe },
+-
+-    { "require-mppe-128", o_bool, &ccp_allowoptions[0].mppe,
+-      "require MPPE 128-bit encryption", OPT_PRIO | OPT_A2OR | MPPE_OPT_128,
+-      &ccp_wantoptions[0].mppe },
+-    { "+mppe-128", o_bool, &ccp_allowoptions[0].mppe,
+-      "require MPPE 128-bit encryption",
+-      OPT_ALIAS | OPT_PRIO | OPT_A2OR | MPPE_OPT_128,
+-      &ccp_wantoptions[0].mppe },
+-    { "nomppe-128", o_bool, &ccp_allowoptions[0].mppe,
+-      "don't allow MPPE 128-bit encryption",
+-      OPT_PRIOSUB | OPT_A2CLRB | MPPE_OPT_128, &ccp_wantoptions[0].mppe },
+-    { "-mppe-128", o_bool, &ccp_allowoptions[0].mppe,
+-      "don't allow MPPE 128-bit encryption",
+-      OPT_ALIAS | OPT_PRIOSUB | OPT_A2CLRB | MPPE_OPT_128,
+-      &ccp_wantoptions[0].mppe },
+-
+-    /* strange one; we always request stateless, but will we allow stateful? 
*/
+-    { "mppe-stateful", o_bool, &refuse_mppe_stateful,
+-      "allow MPPE stateful mode", OPT_PRIO },
+-    { "nomppe-stateful", o_bool, &refuse_mppe_stateful,
+-      "disallow MPPE stateful mode", OPT_PRIO | 1 },
++    { "mppc", o_bool, &ccp_wantoptions[0].mppc,
++      "request MPPC compression", 1, &ccp_allowoptions[0].mppc },
++    { "+mppc", o_bool, &ccp_wantoptions[0].mppc,
++      "request MPPC compression", 1, &ccp_allowoptions[0].mppc, OPT_ALIAS },
++    { "nomppc", o_bool, &ccp_wantoptions[0].mppc,
++      "don't allow MPPC compression", OPT_PRIOSUB | OPT_A2CLR,
++      &ccp_allowoptions[0].mppc },
++    { "-mppc", o_bool, &ccp_wantoptions[0].mppc,
++      "don't allow MPPC compression", OPT_ALIAS | OPT_PRIOSUB | OPT_A2CLR,
++      &ccp_allowoptions[0].mppc },
++    { "mppe", o_special, (void *)setmppe,
++      "request MPPE encryption" },
++    { "+mppe", o_special, (void *)setmppe,
++      "request MPPE encryption" },
++    { "nomppe", o_special_noarg, (void *)setnomppe,
++      "don't allow MPPE encryption" },
++    { "-mppe", o_special_noarg, (void *)setnomppe,
++      "don't allow MPPE encryption" },
+ #endif /* MPPE */
+ 
+     { NULL }
+@@ -241,7 +221,7 @@
+  */
+ #define ANY_COMPRESS(opt)     ((opt).deflate || (opt).bsd_compress \
+                                || (opt).predictor_1 || (opt).predictor_2 \
+-                               || (opt).mppe)
++                               || (opt).lzs || (opt).mppc || (opt).mppe)
+ 
+ /*
+  * Local state (mainly for handling reset-reqs and reset-acks).
+@@ -344,6 +324,100 @@
+     return 1;
+ }
+ 
++#ifdef MPPE
++/*
++ * Functions called from config options
++ */
++/* 
++   MPPE suboptions:
++      required - require MPPE; disconnect if peer doesn't support it
++      stateless - use stateless mode
++      no40 - disable 40 bit keys
++      no56 - disable 56 bit keys
++      no128 - disable 128 bit keys
++*/
++int setmppe(char **argv)
++{
++    int i;
++    char *str, cmdbuf[16];
++
++    ccp_allowoptions[0].mppe = 1;
++    ccp_allowoptions[0].mppe_40 = 1;
++    ccp_allowoptions[0].mppe_56 = 1;
++    ccp_allowoptions[0].mppe_128 = 1;
++    ccp_allowoptions[0].mppe_stateless = 0;
++    ccp_wantoptions[0].mppe = 0;
++
++    str = *argv;
++
++    while (1) {
++      i = 0;
++      memset(cmdbuf, '\0', 16);
++      while ((i < 16) && (*str != ',') && (*str != '\0'))
++          cmdbuf[i++] = *str++;
++      cmdbuf[i] = '\0';
++      if (!strncasecmp(cmdbuf, "no40", strlen("no40"))) {
++          ccp_allowoptions[0].mppe_40 = 0;
++          goto next_param;
++      } else if (!strncasecmp(cmdbuf, "no56", strlen("no56"))) {
++          ccp_allowoptions[0].mppe_56 = 0;
++          goto next_param;
++      } else if (!strncasecmp(cmdbuf, "no128", strlen("no128"))) {
++          ccp_allowoptions[0].mppe_128 = 0;
++          goto next_param;
++      } else if (!strncasecmp(cmdbuf, "stateless", strlen("stateless"))) {
++          ccp_allowoptions[0].mppe_stateless = 1;
++          goto next_param;
++      } else if (!strncasecmp(cmdbuf, "required", strlen("required"))) {
++          ccp_wantoptions[0].mppe = 1;
++          goto next_param;
++      } else {
++          option_error("invalid parameter '%s' for mppe option", cmdbuf);
++          return 0;
++      }
++
++    next_param:
++      if (*str == ',') {
++          str++;
++          continue;
++      }
++      if (*str == '\0') {
++          if (!(ccp_allowoptions[0].mppe_40 || ccp_allowoptions[0].mppe_56 ||
++                ccp_allowoptions[0].mppe_128)) {
++              if (ccp_wantoptions[0].mppe == 1) {
++                  option_error("You require MPPE but you have switched off "
++                               "all encryption key lengths.");
++                  return 0;
++              }
++              ccp_wantoptions[0].mppe = ccp_allowoptions[0].mppe = 0;
++              ccp_wantoptions[0].mppe_stateless =
++                  ccp_allowoptions[0].mppe_stateless = 0;
++          } else {
++              ccp_allowoptions[0].mppe = 1;
++              ccp_wantoptions[0].mppe_stateless =
++                  ccp_allowoptions[0].mppe_stateless;
++              if (ccp_wantoptions[0].mppe == 1) {
++                  ccp_wantoptions[0].mppe_40 = ccp_allowoptions[0].mppe_40;
++                  ccp_wantoptions[0].mppe_56 = ccp_allowoptions[0].mppe_56;
++                  ccp_wantoptions[0].mppe_128 = ccp_allowoptions[0].mppe_128;
++              }
++          }
++          return 1;
++      }
++    }
++}
++
++int setnomppe(void)
++{
++    ccp_wantoptions[0].mppe = ccp_allowoptions[0].mppe = 0;
++    ccp_wantoptions[0].mppe_40 = ccp_allowoptions[0].mppe_40 = 0;
++    ccp_wantoptions[0].mppe_56 = ccp_allowoptions[0].mppe_56 = 0;
++    ccp_wantoptions[0].mppe_128 = ccp_allowoptions[0].mppe_128 = 0;
++    ccp_wantoptions[0].mppe_stateless = ccp_allowoptions[0].mppe_stateless = 
0;
++    return 1;
++}
++#endif /* MPPE */
++
+ /*
+  * ccp_init - initialize CCP.
+  */
+@@ -378,6 +452,30 @@
+     ccp_allowoptions[0].bsd_bits = BSD_MAX_BITS;
+ 
+     ccp_allowoptions[0].predictor_1 = 1;
++
++    ccp_wantoptions[0].lzs = 0; /* Stac LZS  - will be enabled in the future 
*/
++    ccp_wantoptions[0].lzs_mode = LZS_MODE_SEQ;
++    ccp_wantoptions[0].lzs_hists = 1;
++    ccp_allowoptions[0].lzs = 0; /* Stac LZS  - will be enabled in the future 
*/
++    ccp_allowoptions[0].lzs_mode = LZS_MODE_SEQ;
++    ccp_allowoptions[0].lzs_hists = 1;
++
++#ifdef MPPE
++    /* by default allow and request MPPC... */
++    ccp_wantoptions[0].mppc = ccp_allowoptions[0].mppc = 1;
++
++    /* ... and allow but don't request MPPE */
++    ccp_allowoptions[0].mppe = 1;
++    ccp_allowoptions[0].mppe_40 = 1;
++    ccp_allowoptions[0].mppe_56 = 1;
++    ccp_allowoptions[0].mppe_128 = 1;
++    ccp_allowoptions[0].mppe_stateless = 1;
++    ccp_wantoptions[0].mppe = 0;
++    ccp_wantoptions[0].mppe_40 = 0;
++    ccp_wantoptions[0].mppe_56 = 0;
++    ccp_wantoptions[0].mppe_128 = 0;
++    ccp_wantoptions[0].mppe_stateless = 0;
++#endif /* MPPE */
+ }
+ 
+ /*
+@@ -455,11 +553,11 @@
+     if (oldstate == OPENED && p[0] == TERMREQ && f->state != OPENED) {
+       notice("Compression disabled by peer.");
+ #ifdef MPPE
+-      if (ccp_gotoptions[unit].mppe) {
++      if (ccp_wantoptions[unit].mppe) {
+           error("MPPE disabled, closing LCP");
+           lcp_close(unit, "MPPE disabled by peer");
+       }
+-#endif
++#endif /* MPPE */
+     }
+ 
+     /*
+@@ -487,6 +585,15 @@
+           break;
+       /* send a reset-ack, which the transmitter will see and
+          reset its compression state. */
++
++      /* In case of MPPE/MPPC or LZS we shouldn't send CCP_RESETACK,
++         but we do it in order to reset compressor; CCP_RESETACK is
++         then silently discarded. See functions ppp_send_frame and
++         ppp_ccp_peek in ppp_generic.c (Linux only !!!). All the
++         confusion is caused by the fact that CCP code is splited
++         into two parts - one part is handled by pppd, the other one
++         is handled by kernel. */
++
+       fsm_sdata(f, CCP_RESETACK, id, NULL, 0);
+       break;
+ 
+@@ -515,12 +622,11 @@
+     fsm_lowerdown(&ccp_fsm[unit]);
+ 
+ #ifdef MPPE
+-    if (ccp_gotoptions[unit].mppe) {
++    if (ccp_wantoptions[unit].mppe) {
+       error("MPPE required but peer negotiation failed");
+       lcp_close(unit, "MPPE required but peer negotiation failed");
+     }
+-#endif
+-
++#endif /* MPPE */
+ }
+ 
+ /*
+@@ -537,7 +643,7 @@
+     all_rejected[f->unit] = 0;
+ 
+ #ifdef MPPE
+-    if (go->mppe) {
++    if (go->mppe || go->mppc) {
+       ccp_options *ao = &ccp_allowoptions[f->unit];
+       int auth_mschap_bits = auth_done[f->unit];
+       int numbits;
+@@ -551,80 +657,109 @@
+        * NB: If MPPE is required, all other compression opts are invalid.
+        *     So, we return right away if we can't do it.
+        */
++      if (ccp_wantoptions[f->unit].mppe) {
++          /* Leave only the mschap auth bits set */
++          auth_mschap_bits &= (CHAP_MS_WITHPEER  | CHAP_MS_PEER |
++                               CHAP_MS2_WITHPEER | CHAP_MS2_PEER);
++          /* Count the mschap auths */
++          auth_mschap_bits >>= CHAP_MS_SHIFT;
++          numbits = 0;
++          do {
++              numbits += auth_mschap_bits & 1;
++              auth_mschap_bits >>= 1;
++          } while (auth_mschap_bits);
++          if (numbits > 1) {
++              error("MPPE required, but auth done in both directions.");
++              lcp_close(f->unit, "MPPE required but not available");
++              return;
++          }
++          if (!numbits) {
++              error("MPPE required, but MS-CHAP[v2] auth not performed.");
++              lcp_close(f->unit, "MPPE required but not available");
++              return;
++          }
+ 
+-      /* Leave only the mschap auth bits set */
+-      auth_mschap_bits &= (CHAP_MS_WITHPEER  | CHAP_MS_PEER |
+-                           CHAP_MS2_WITHPEER | CHAP_MS2_PEER);
+-      /* Count the mschap auths */
+-      auth_mschap_bits >>= CHAP_MS_SHIFT;
+-      numbits = 0;
+-      do {
+-          numbits += auth_mschap_bits & 1;
+-          auth_mschap_bits >>= 1;
+-      } while (auth_mschap_bits);
+-      if (numbits > 1) {
+-          error("MPPE required, but auth done in both directions.");
+-          lcp_close(f->unit, "MPPE required but not available");
+-          return;
+-      }
+-      if (!numbits) {
+-          error("MPPE required, but MS-CHAP[v2] auth not performed.");
+-          lcp_close(f->unit, "MPPE required but not available");
+-          return;
+-      }
+-
+-      /* A plugin (eg radius) may not have obtained key material. */
+-      if (!mppe_keys_set) {
+-          error("MPPE required, but keys are not available.  "
+-                "Possible plugin problem?");
+-          lcp_close(f->unit, "MPPE required but not available");
+-          return;
+-      }
+-
+-      /* LM auth not supported for MPPE */
+-      if (auth_done[f->unit] & (CHAP_MS_WITHPEER | CHAP_MS_PEER)) {
+-          /* This might be noise */
+-          if (go->mppe & MPPE_OPT_40) {
+-              notice("Disabling 40-bit MPPE; MS-CHAP LM not supported");
+-              go->mppe &= ~MPPE_OPT_40;
+-              ccp_wantoptions[f->unit].mppe &= ~MPPE_OPT_40;
++          /* A plugin (eg radius) may not have obtained key material. */
++          if (!mppe_keys_set) {
++              error("MPPE required, but keys are not available.  "
++                    "Possible plugin problem?");
++              lcp_close(f->unit, "MPPE required but not available");
++              return;
+           }
+       }
+ 
+-      /* Last check: can we actually negotiate something? */
+-      if (!(go->mppe & (MPPE_OPT_40 | MPPE_OPT_128))) {
+-          /* Could be misconfig, could be 40-bit disabled above. */
+-          error("MPPE required, but both 40-bit and 128-bit disabled.");
+-          lcp_close(f->unit, "MPPE required but not available");
+-          return;
++      /*
++       * Check whether the kernel knows about the various
++       * compression methods we might request. Key material
++       * unimportant here.
++       */
++      if (go->mppc) {
++          opt_buf[0] = CI_MPPE;
++          opt_buf[1] = CILEN_MPPE;
++          opt_buf[2] = 0;
++          opt_buf[3] = 0;
++          opt_buf[4] = 0;
++          opt_buf[5] = MPPE_MPPC;
++          if (ccp_test(f->unit, opt_buf, CILEN_MPPE, 0) <= 0)
++              go->mppc = 0;
++      }
++      if (go->mppe_40) {
++          opt_buf[0] = CI_MPPE;
++          opt_buf[1] = CILEN_MPPE;
++          opt_buf[2] = MPPE_STATELESS;
++          opt_buf[3] = 0;
++          opt_buf[4] = 0;
++          opt_buf[5] = MPPE_40BIT;
++          if (ccp_test(f->unit, opt_buf, CILEN_MPPE + MPPE_MAX_KEY_LEN, 0) <= 
0)
++              go->mppe_40 = 0;
++      }
++      if (go->mppe_56) {
++          opt_buf[0] = CI_MPPE;
++          opt_buf[1] = CILEN_MPPE;
++          opt_buf[2] = MPPE_STATELESS;
++          opt_buf[3] = 0;
++          opt_buf[4] = 0;
++          opt_buf[5] = MPPE_56BIT;
++          if (ccp_test(f->unit, opt_buf, CILEN_MPPE + MPPE_MAX_KEY_LEN, 0) <= 
0)
++              go->mppe_56 = 0;
++      }
++      if (go->mppe_128) {
++          opt_buf[0] = CI_MPPE;
++          opt_buf[1] = CILEN_MPPE;
++          opt_buf[2] = MPPE_STATELESS;
++          opt_buf[3] = 0;
++          opt_buf[4] = 0;
++          opt_buf[5] = MPPE_128BIT;
++          if (ccp_test(f->unit, opt_buf, CILEN_MPPE + MPPE_MAX_KEY_LEN, 0) <= 
0)
++              go->mppe_128 = 0;
++      }
++      if (!go->mppe_40 && !go->mppe_56 && !go->mppe_128) {
++          if (ccp_wantoptions[f->unit].mppe) {
++              error("MPPE required, but kernel has no support.");
++              lcp_close(f->unit, "MPPE required but not available");
++          }
++          go->mppe = go->mppe_stateless = 0;
++      } else {
++          /* MPPE is not compatible with other compression types */
++          if (ccp_wantoptions[f->unit].mppe) {
++              ao->bsd_compress = go->bsd_compress = 0;
++              ao->predictor_1  = go->predictor_1  = 0;
++              ao->predictor_2  = go->predictor_2  = 0;
++              ao->deflate      = go->deflate      = 0;
++              ao->lzs          = go->lzs          = 0;
++          }
+       }
+-
+-      /* sync options */
+-      ao->mppe = go->mppe;
+-      /* MPPE is not compatible with other compression types */
+-      ao->bsd_compress = go->bsd_compress = 0;
+-      ao->predictor_1  = go->predictor_1  = 0;
+-      ao->predictor_2  = go->predictor_2  = 0;
+-      ao->deflate      = go->deflate      = 0;
+     }
+ #endif /* MPPE */
+-
+-    /*
+-     * Check whether the kernel knows about the various
+-     * compression methods we might request.
+-     */
+-#ifdef MPPE
+-    if (go->mppe) {
+-      opt_buf[0] = CI_MPPE;
+-      opt_buf[1] = CILEN_MPPE;
+-      MPPE_OPTS_TO_CI(go->mppe, &opt_buf[2]);
+-      /* Key material unimportant here. */
+-      if (ccp_test(f->unit, opt_buf, CILEN_MPPE + MPPE_MAX_KEY_LEN, 0) <= 0) {
+-          error("MPPE required, but kernel has no support.");
+-          lcp_close(f->unit, "MPPE required but not available");
+-      }
++    if (go->lzs) {
++      opt_buf[0] = CI_LZS;
++      opt_buf[1] = CILEN_LZS;
++      opt_buf[2] = go->lzs_hists >> 8;
++      opt_buf[3] = go->lzs_hists & 0xff;
++      opt_buf[4] = LZS_MODE_SEQ;
++      if (ccp_test(f->unit, opt_buf, CILEN_LZS, 0) <= 0)
++          go->lzs = 0;
+     }
+-#endif
+     if (go->bsd_compress) {
+       opt_buf[0] = CI_BSD_COMPRESS;
+       opt_buf[1] = CILEN_BSD_COMPRESS;
+@@ -679,7 +814,8 @@
+       + (go->deflate? CILEN_DEFLATE: 0)
+       + (go->predictor_1? CILEN_PREDICTOR_1: 0)
+       + (go->predictor_2? CILEN_PREDICTOR_2: 0)
+-      + (go->mppe? CILEN_MPPE: 0);
++      + (go->lzs? CILEN_LZS: 0)
++      + ((go->mppe || go->mppc)? CILEN_MPPE: 0);
+ }
+ 
+ /*
+@@ -693,6 +829,8 @@
+ {
+     int res;
+     ccp_options *go = &ccp_gotoptions[f->unit];
++    ccp_options *ao = &ccp_allowoptions[f->unit];
++    ccp_options *wo = &ccp_wantoptions[f->unit];
<<Diff was trimmed, longer than 597 lines>>
_______________________________________________
pld-cvs-commit mailing list
[email protected]
http://lists.pld-linux.org/mailman/listinfo/pld-cvs-commit

Reply via email to