bsd_comp.c
上传用户:lgb322
上传日期:2013-02-24
资源大小:30529k
文件大小:29k
源码类别:

嵌入式Linux

开发平台:

Unix_Linux

  1. /*
  2.  * Update: The Berkeley copyright was changed, and the change 
  3.  * is retroactive to all "true" BSD software (ie everything
  4.  * from UCB as opposed to other peoples code that just carried
  5.  * the same license). The new copyright doesn't clash with the
  6.  * GPL, so the module-only restriction has been removed..
  7.  */
  8. /* Because this code is derived from the 4.3BSD compress source:
  9.  *
  10.  * Copyright (c) 1985, 1986 The Regents of the University of California.
  11.  * All rights reserved.
  12.  *
  13.  * This code is derived from software contributed to Berkeley by
  14.  * James A. Woods, derived from original work by Spencer Thomas
  15.  * and Joseph Orost.
  16.  *
  17.  * Redistribution and use in source and binary forms, with or without
  18.  * modification, are permitted provided that the following conditions
  19.  * are met:
  20.  * 1. Redistributions of source code must retain the above copyright
  21.  *    notice, this list of conditions and the following disclaimer.
  22.  * 2. Redistributions in binary form must reproduce the above copyright
  23.  *    notice, this list of conditions and the following disclaimer in the
  24.  *    documentation and/or other materials provided with the distribution.
  25.  * 3. All advertising materials mentioning features or use of this software
  26.  *    must display the following acknowledgement:
  27.  * This product includes software developed by the University of
  28.  * California, Berkeley and its contributors.
  29.  * 4. Neither the name of the University nor the names of its contributors
  30.  *    may be used to endorse or promote products derived from this software
  31.  *    without specific prior written permission.
  32.  *
  33.  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
  34.  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  35.  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  36.  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
  37.  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
  38.  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
  39.  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
  40.  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
  41.  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
  42.  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  43.  * SUCH DAMAGE.
  44.  */
  45. /*
  46.  * This version is for use with contiguous buffers on Linux-derived systems.
  47.  *
  48.  *  ==FILEVERSION 20000226==
  49.  *
  50.  *  NOTE TO MAINTAINERS:
  51.  *     If you modify this file at all, please set the number above to the
  52.  *     date of the modification as YYMMDD (year month day).
  53.  *     bsd_comp.c is shipped with a PPP distribution as well as with
  54.  *     the kernel; if everyone increases the FILEVERSION number above,
  55.  *     then scripts can do the right thing when deciding whether to
  56.  *     install a new bsd_comp.c file. Don't change the format of that
  57.  *     line otherwise, so the installation script can recognize it.
  58.  *
  59.  * From: bsd_comp.c,v 1.3 1994/12/08 01:59:58 paulus Exp
  60.  */
  61. #include <linux/module.h>
  62. #include <linux/init.h>
  63. #include <linux/slab.h>
  64. #include <linux/vmalloc.h>
  65. #include <linux/ppp_defs.h>
  66. #undef   PACKETPTR
  67. #define  PACKETPTR 1
  68. #include <linux/ppp-comp.h>
  69. #undef   PACKETPTR
  70. /*
  71.  * PPP "BSD compress" compression
  72.  *  The differences between this compression and the classic BSD LZW
  73.  *  source are obvious from the requirement that the classic code worked
  74.  *  with files while this handles arbitrarily long streams that
  75.  *  are broken into packets.  They are:
  76.  *
  77.  * When the code size expands, a block of junk is not emitted by
  78.  *     the compressor and not expected by the decompressor.
  79.  *
  80.  * New codes are not necessarily assigned every time an old
  81.  *     code is output by the compressor.  This is because a packet
  82.  *     end forces a code to be emitted, but does not imply that a
  83.  *     new sequence has been seen.
  84.  *
  85.  * The compression ratio is checked at the first end of a packet
  86.  *     after the appropriate gap. Besides simplifying and speeding
  87.  *     things up, this makes it more likely that the transmitter
  88.  *     and receiver will agree when the dictionary is cleared when
  89.  *     compression is not going well.
  90.  */
  91. /*
  92.  * Macros to extract protocol version and number of bits
  93.  * from the third byte of the BSD Compress CCP configuration option.
  94.  */
  95. #define BSD_VERSION(x) ((x) >> 5)
  96. #define BSD_NBITS(x) ((x) & 0x1F)
  97. #define BSD_CURRENT_VERSION 1
  98. /*
  99.  * A dictionary for doing BSD compress.
  100.  */
  101. struct bsd_dict {
  102.     union { /* hash value */
  103. unsigned long fcode;
  104. struct {
  105. #if defined(__LITTLE_ENDIAN) /* Little endian order */
  106.     unsigned short prefix; /* preceding code */
  107.     unsigned char suffix; /* last character of new code */
  108.     unsigned char pad;
  109. #elif defined(__BIG_ENDIAN) /* Big endian order */
  110.     unsigned char pad;
  111.     unsigned char suffix; /* last character of new code */
  112.     unsigned short prefix; /* preceding code */
  113. #else
  114. #error Endianness not defined...
  115. #endif
  116. } hs;
  117.     } f;
  118.     unsigned short codem1; /* output of hash table -1 */
  119.     unsigned short cptr; /* map code to hash table entry */
  120. };
  121. struct bsd_db {
  122.     int     totlen; /* length of this structure */
  123.     unsigned int   hsize; /* size of the hash table */
  124.     unsigned char  hshift; /* used in hash function */
  125.     unsigned char  n_bits; /* current bits/code */
  126.     unsigned char  maxbits; /* maximum bits/code */
  127.     unsigned char  debug; /* non-zero if debug desired */
  128.     unsigned char  unit; /* ppp unit number */
  129.     unsigned short seqno; /* sequence # of next packet */
  130.     unsigned int   mru; /* size of receive (decompress) bufr */
  131.     unsigned int   maxmaxcode; /* largest valid code */
  132.     unsigned int   max_ent; /* largest code in use */
  133.     unsigned int   in_count; /* uncompressed bytes, aged */
  134.     unsigned int   bytes_out; /* compressed bytes, aged */
  135.     unsigned int   ratio; /* recent compression ratio */
  136.     unsigned int   checkpoint; /* when to next check the ratio */
  137.     unsigned int   clear_count; /* times dictionary cleared */
  138.     unsigned int   incomp_count; /* incompressible packets */
  139.     unsigned int   incomp_bytes; /* incompressible bytes */
  140.     unsigned int   uncomp_count; /* uncompressed packets */
  141.     unsigned int   uncomp_bytes; /* uncompressed bytes */
  142.     unsigned int   comp_count; /* compressed packets */
  143.     unsigned int   comp_bytes; /* compressed bytes */
  144.     unsigned short  *lens; /* array of lengths of codes */
  145.     struct bsd_dict *dict; /* dictionary */
  146. };
  147. #define BSD_OVHD 2 /* BSD compress overhead/packet */
  148. #define MIN_BSD_BITS 9
  149. #define BSD_INIT_BITS MIN_BSD_BITS
  150. #define MAX_BSD_BITS 15
  151. static void bsd_free (void *state);
  152. static void *bsd_alloc(unsigned char *options, int opt_len, int decomp);
  153. static void *bsd_comp_alloc (unsigned char *options, int opt_len);
  154. static void *bsd_decomp_alloc (unsigned char *options, int opt_len);
  155. static int bsd_init        (void *db, unsigned char *options,
  156.          int opt_len, int unit, int debug, int decomp);
  157. static int bsd_comp_init   (void *state, unsigned char *options,
  158.          int opt_len, int unit, int opthdr, int debug);
  159. static int bsd_decomp_init (void *state, unsigned char *options,
  160.  int opt_len, int unit, int opthdr, int mru,
  161.  int debug);
  162. static void bsd_reset (void *state);
  163. static void bsd_comp_stats (void *state, struct compstat *stats);
  164. static int bsd_compress (void *state, unsigned char *rptr,
  165.       unsigned char *obuf, int isize, int osize);
  166. static void bsd_incomp (void *state, unsigned char *ibuf, int icnt);
  167. static int bsd_decompress (void *state, unsigned char *ibuf, int isize,
  168. unsigned char *obuf, int osize);
  169. /* These are in ppp_generic.c */
  170. extern int  ppp_register_compressor   (struct compressor *cp);
  171. extern void ppp_unregister_compressor (struct compressor *cp);
  172. /*
  173.  * the next two codes should not be changed lightly, as they must not
  174.  * lie within the contiguous general code space.
  175.  */
  176. #define CLEAR 256 /* table clear output code */
  177. #define FIRST 257 /* first free entry */
  178. #define LAST 255
  179. #define MAXCODE(b) ((1 << (b)) - 1)
  180. #define BADCODEM1 MAXCODE(MAX_BSD_BITS);
  181. #define BSD_HASH(prefix,suffix,hshift) ((((unsigned long)(suffix))<<(hshift)) 
  182.  ^ (unsigned long)(prefix))
  183. #define BSD_KEY(prefix,suffix) ((((unsigned long)(suffix)) << 16) 
  184.  + (unsigned long)(prefix))
  185. #define CHECK_GAP 10000 /* Ratio check interval */
  186. #define RATIO_SCALE_LOG 8
  187. #define RATIO_SCALE (1<<RATIO_SCALE_LOG)
  188. #define RATIO_MAX (0x7fffffff>>RATIO_SCALE_LOG)
  189. /*
  190.  * clear the dictionary
  191.  */
  192. static void
  193. bsd_clear(struct bsd_db *db)
  194. {
  195.     db->clear_count++;
  196.     db->max_ent      = FIRST-1;
  197.     db->n_bits       = BSD_INIT_BITS;
  198.     db->bytes_out    = 0;
  199.     db->in_count     = 0;
  200.     db->ratio      = 0;
  201.     db->checkpoint   = CHECK_GAP;
  202. }
  203. /*
  204.  * If the dictionary is full, then see if it is time to reset it.
  205.  *
  206.  * Compute the compression ratio using fixed-point arithmetic
  207.  * with 8 fractional bits.
  208.  *
  209.  * Since we have an infinite stream instead of a single file,
  210.  * watch only the local compression ratio.
  211.  *
  212.  * Since both peers must reset the dictionary at the same time even in
  213.  * the absence of CLEAR codes (while packets are incompressible), they
  214.  * must compute the same ratio.
  215.  */
  216. static int bsd_check (struct bsd_db *db) /* 1=output CLEAR */
  217.   {
  218.     unsigned int new_ratio;
  219.     if (db->in_count >= db->checkpoint)
  220.       {
  221. /* age the ratio by limiting the size of the counts */
  222. if (db->in_count >= RATIO_MAX || db->bytes_out >= RATIO_MAX)
  223.   {
  224.     db->in_count  -= (db->in_count  >> 2);
  225.     db->bytes_out -= (db->bytes_out >> 2);
  226.   }
  227. db->checkpoint = db->in_count + CHECK_GAP;
  228. if (db->max_ent >= db->maxmaxcode)
  229.   {
  230.     /* Reset the dictionary only if the ratio is worse,
  231.      * or if it looks as if it has been poisoned
  232.      * by incompressible data.
  233.      *
  234.      * This does not overflow, because
  235.      * db->in_count <= RATIO_MAX.
  236.      */
  237.     new_ratio = db->in_count << RATIO_SCALE_LOG;
  238.     if (db->bytes_out != 0)
  239.       {
  240. new_ratio /= db->bytes_out;
  241.       }
  242.     
  243.     if (new_ratio < db->ratio || new_ratio < 1 * RATIO_SCALE)
  244.       {
  245. bsd_clear (db);
  246. return 1;
  247.       }
  248.     db->ratio = new_ratio;
  249.   }
  250.       }
  251.     return 0;
  252.   }
  253. /*
  254.  * Return statistics.
  255.  */
  256. static void bsd_comp_stats (void *state, struct compstat *stats)
  257.   {
  258.     struct bsd_db *db = (struct bsd_db *) state;
  259.     
  260.     stats->unc_bytes    = db->uncomp_bytes;
  261.     stats->unc_packets  = db->uncomp_count;
  262.     stats->comp_bytes   = db->comp_bytes;
  263.     stats->comp_packets = db->comp_count;
  264.     stats->inc_bytes    = db->incomp_bytes;
  265.     stats->inc_packets  = db->incomp_count;
  266.     stats->in_count     = db->in_count;
  267.     stats->bytes_out    = db->bytes_out;
  268.   }
  269. /*
  270.  * Reset state, as on a CCP ResetReq.
  271.  */
  272. static void bsd_reset (void *state)
  273.   {
  274.     struct bsd_db *db = (struct bsd_db *) state;
  275.     bsd_clear(db);
  276.     db->seqno       = 0;
  277.     db->clear_count = 0;
  278.   }
  279. /*
  280.  * Release the compression structure
  281.  */
  282. static void bsd_free (void *state)
  283.   {
  284.     struct bsd_db *db = (struct bsd_db *) state;
  285.     
  286.     if (db)
  287.       {
  288. /*
  289.  * Release the dictionary
  290.  */
  291. if (db->dict)
  292.   {
  293.     vfree (db->dict);
  294.     db->dict = NULL;
  295.   }
  296. /*
  297.  * Release the string buffer
  298.  */
  299. if (db->lens)
  300.   {
  301.     vfree (db->lens);
  302.     db->lens = NULL;
  303.   }
  304. /*
  305.  * Finally release the structure itself.
  306.  */
  307. kfree (db);
  308. MOD_DEC_USE_COUNT;
  309.       }
  310.   }
  311. /*
  312.  * Allocate space for a (de) compressor.
  313.  */
  314. static void *bsd_alloc (unsigned char *options, int opt_len, int decomp)
  315.   {
  316.     int bits;
  317.     unsigned int hsize, hshift, maxmaxcode;
  318.     struct bsd_db *db;
  319.     if (opt_len != 3 || options[0] != CI_BSD_COMPRESS || options[1] != 3
  320. || BSD_VERSION(options[2]) != BSD_CURRENT_VERSION)
  321.       {
  322. return NULL;
  323.       }
  324.     bits = BSD_NBITS(options[2]);
  325.     switch (bits)
  326.       {
  327.     case 9: /* needs 82152 for both directions */
  328.     case 10: /* needs 84144 */
  329.     case 11: /* needs 88240 */
  330.     case 12: /* needs 96432 */
  331. hsize = 5003;
  332. hshift = 4;
  333. break;
  334.     case 13: /* needs 176784 */
  335. hsize = 9001;
  336. hshift = 5;
  337. break;
  338.     case 14: /* needs 353744 */
  339. hsize = 18013;
  340. hshift = 6;
  341. break;
  342.     case 15: /* needs 691440 */
  343. hsize = 35023;
  344. hshift = 7;
  345. break;
  346.     case 16: /* needs 1366160--far too much, */
  347. /* hsize = 69001; */ /* and 69001 is too big for cptr */
  348. /* hshift = 8; */ /* in struct bsd_db */
  349. /* break; */
  350.     default:
  351. return NULL;
  352.       }
  353. /*
  354.  * Allocate the main control structure for this instance.
  355.  */
  356.     maxmaxcode = MAXCODE(bits);
  357.     db         = (struct bsd_db *) kmalloc (sizeof (struct bsd_db),
  358.     GFP_KERNEL);
  359.     if (!db)
  360.       {
  361. return NULL;
  362.       }
  363.     memset (db, 0, sizeof(struct bsd_db));
  364. /*
  365.  * Allocate space for the dictionary. This may be more than one page in
  366.  * length.
  367.  */
  368.     db->dict = (struct bsd_dict *) vmalloc (hsize *
  369.     sizeof (struct bsd_dict));
  370.     if (!db->dict)
  371.       {
  372. bsd_free (db);
  373. return NULL;
  374.       }
  375.     MOD_INC_USE_COUNT;
  376. /*
  377.  * If this is the compression buffer then there is no length data.
  378.  */
  379.     if (!decomp)
  380.       {
  381. db->lens = NULL;
  382.       }
  383. /*
  384.  * For decompression, the length information is needed as well.
  385.  */
  386.     else
  387.       {
  388.         db->lens = (unsigned short *) vmalloc ((maxmaxcode + 1) *
  389.        sizeof (db->lens[0]));
  390. if (!db->lens)
  391.   {
  392.     bsd_free (db);
  393.     return (NULL);
  394.   }
  395.       }
  396. /*
  397.  * Initialize the data information for the compression code
  398.  */
  399.     db->totlen     = sizeof (struct bsd_db)   +
  400.            (sizeof (struct bsd_dict) * hsize);
  401.     db->hsize      = hsize;
  402.     db->hshift     = hshift;
  403.     db->maxmaxcode = maxmaxcode;
  404.     db->maxbits    = bits;
  405.     return (void *) db;
  406.   }
  407. static void *bsd_comp_alloc (unsigned char *options, int opt_len)
  408.   {
  409.     return bsd_alloc (options, opt_len, 0);
  410.   }
  411. static void *bsd_decomp_alloc (unsigned char *options, int opt_len)
  412.   {
  413.     return bsd_alloc (options, opt_len, 1);
  414.   }
  415. /*
  416.  * Initialize the database.
  417.  */
  418. static int bsd_init (void *state, unsigned char *options,
  419.      int opt_len, int unit, int debug, int decomp)
  420.   {
  421.     struct bsd_db *db = state;
  422.     int indx;
  423.     
  424.     if ((opt_len != 3) || (options[0] != CI_BSD_COMPRESS) || (options[1] != 3)
  425. || (BSD_VERSION(options[2]) != BSD_CURRENT_VERSION)
  426. || (BSD_NBITS(options[2]) != db->maxbits)
  427. || (decomp && db->lens == NULL))
  428.       {
  429. return 0;
  430.       }
  431.     if (decomp)
  432.       {
  433. indx = LAST;
  434. do
  435.   {
  436.     db->lens[indx] = 1;
  437.   }
  438. while (indx-- > 0);
  439.       }
  440.     indx = db->hsize;
  441.     while (indx-- != 0)
  442.       {
  443. db->dict[indx].codem1 = BADCODEM1;
  444. db->dict[indx].cptr   = 0;
  445.       }
  446.     db->unit = unit;
  447.     db->mru  = 0;
  448. #ifndef DEBUG
  449.     if (debug)
  450. #endif
  451.       db->debug = 1;
  452.     
  453.     bsd_reset(db);
  454.     
  455.     return 1;
  456.   }
  457. static int bsd_comp_init (void *state, unsigned char *options,
  458.   int opt_len, int unit, int opthdr, int debug)
  459.   {
  460.     return bsd_init (state, options, opt_len, unit, debug, 0);
  461.   }
  462. static int bsd_decomp_init (void *state, unsigned char *options,
  463.     int opt_len, int unit, int opthdr, int mru,
  464.     int debug)
  465.   {
  466.     return bsd_init (state, options, opt_len, unit, debug, 1);
  467.   }
  468. /*
  469.  * Obtain pointers to the various structures in the compression tables
  470.  */
  471. #define dict_ptrx(p,idx) &(p->dict[idx])
  472. #define lens_ptrx(p,idx) &(p->lens[idx])
  473. #ifdef DEBUG
  474. static unsigned short *lens_ptr(struct bsd_db *db, int idx)
  475.   {
  476.     if ((unsigned int) idx > (unsigned int) db->maxmaxcode)
  477.       {
  478. printk ("<9>ppp: lens_ptr(%d) > maxn", idx);
  479. idx = 0;
  480.       }
  481.     return lens_ptrx (db, idx);
  482.   }
  483. static struct bsd_dict *dict_ptr(struct bsd_db *db, int idx)
  484.   {
  485.     if ((unsigned int) idx >= (unsigned int) db->hsize)
  486.       {
  487. printk ("<9>ppp: dict_ptr(%d) > maxn", idx);
  488. idx = 0;
  489.       }
  490.     return dict_ptrx (db, idx);
  491.   }
  492. #else
  493. #define lens_ptr(db,idx) lens_ptrx(db,idx)
  494. #define dict_ptr(db,idx) dict_ptrx(db,idx)
  495. #endif
  496. /*
  497.  * compress a packet
  498.  *
  499.  * The result of this function is the size of the compressed
  500.  * packet. A zero is returned if the packet was not compressed
  501.  * for some reason, such as the size being larger than uncompressed.
  502.  *
  503.  * One change from the BSD compress command is that when the
  504.  * code size expands, we do not output a bunch of padding.
  505.  */
  506. static int bsd_compress (void *state, unsigned char *rptr, unsigned char *obuf,
  507.  int isize, int osize)
  508.   {
  509.     struct bsd_db *db;
  510.     int hshift;
  511.     unsigned int max_ent;
  512.     unsigned int n_bits;
  513.     unsigned int bitno;
  514.     unsigned long accm;
  515.     int ent;
  516.     unsigned long fcode;
  517.     struct bsd_dict *dictp;
  518.     unsigned char c;
  519.     int hval;
  520.     int disp;
  521.     int ilen;
  522.     int mxcode;
  523.     unsigned char *wptr;
  524.     int olen;
  525. #define PUTBYTE(v)
  526.   {
  527.     ++olen;
  528.     if (wptr)
  529.       {
  530. *wptr++ = (unsigned char) (v);
  531. if (olen >= osize)
  532.   {
  533.     wptr = NULL;
  534.   }
  535.       }
  536.   }
  537. #define OUTPUT(ent)
  538.   {
  539.     bitno -= n_bits;
  540.     accm |= ((ent) << bitno);
  541.     do
  542.       {
  543. PUTBYTE(accm >> 24);
  544. accm <<= 8;
  545. bitno += 8;
  546.       }
  547.     while (bitno <= 24);
  548.   }
  549.   /*
  550.    * If the protocol is not in the range we're interested in,
  551.    * just return without compressing the packet.  If it is,
  552.    * the protocol becomes the first byte to compress.
  553.    */
  554.     ent = PPP_PROTOCOL(rptr);
  555.     if (ent < 0x21 || ent > 0xf9)
  556.       {
  557. return 0;
  558.       }
  559.     db      = (struct bsd_db *) state;
  560.     hshift  = db->hshift;
  561.     max_ent = db->max_ent;
  562.     n_bits  = db->n_bits;
  563.     bitno   = 32;
  564.     accm    = 0;
  565.     mxcode  = MAXCODE (n_bits);
  566.     /* Initialize the output pointers */
  567.     wptr  = obuf;
  568.     olen  = PPP_HDRLEN + BSD_OVHD;
  569.     if (osize > isize)
  570.       {
  571. osize = isize;
  572.       }
  573.     /* This is the PPP header information */
  574.     if (wptr)
  575.       {
  576. *wptr++ = PPP_ADDRESS(rptr);
  577. *wptr++ = PPP_CONTROL(rptr);
  578. *wptr++ = 0;
  579. *wptr++ = PPP_COMP;
  580. *wptr++ = db->seqno >> 8;
  581. *wptr++ = db->seqno;
  582.       }
  583.     /* Skip the input header */
  584.     rptr  += PPP_HDRLEN;
  585.     isize -= PPP_HDRLEN;
  586.     ilen   = ++isize; /* Low byte of protocol is counted as input */
  587.     while (--ilen > 0)
  588.       {
  589. c     = *rptr++;
  590. fcode = BSD_KEY  (ent, c);
  591. hval  = BSD_HASH (ent, c, hshift);
  592. dictp = dict_ptr (db, hval);
  593. /* Validate and then check the entry. */
  594. if (dictp->codem1 >= max_ent)
  595.   {
  596.     goto nomatch;
  597.   }
  598. if (dictp->f.fcode == fcode)
  599.   {
  600.     ent = dictp->codem1 + 1;
  601.     continue; /* found (prefix,suffix) */
  602.   }
  603. /* continue probing until a match or invalid entry */
  604. disp = (hval == 0) ? 1 : hval;
  605. do
  606.   {
  607.     hval += disp;
  608.     if (hval >= db->hsize)
  609.       {
  610. hval -= db->hsize;
  611.       }
  612.     dictp = dict_ptr (db, hval);
  613.     if (dictp->codem1 >= max_ent)
  614.       {
  615. goto nomatch;
  616.       }
  617.   }
  618. while (dictp->f.fcode != fcode);
  619. ent = dictp->codem1 + 1; /* finally found (prefix,suffix) */
  620. continue;
  621. nomatch:
  622. OUTPUT(ent); /* output the prefix */
  623. /* code -> hashtable */
  624. if (max_ent < db->maxmaxcode)
  625.   {
  626.     struct bsd_dict *dictp2;
  627.     struct bsd_dict *dictp3;
  628.     int    indx;
  629.     /* expand code size if needed */
  630.     if (max_ent >= mxcode)
  631.       {
  632. db->n_bits = ++n_bits;
  633. mxcode     = MAXCODE (n_bits);
  634.       }
  635.     
  636.     /* Invalidate old hash table entry using
  637.      * this code, and then take it over.
  638.      */
  639.     dictp2 = dict_ptr (db, max_ent + 1);
  640.     indx   = dictp2->cptr;
  641.     dictp3 = dict_ptr (db, indx);
  642.     if (dictp3->codem1 == max_ent)
  643.       {
  644. dictp3->codem1 = BADCODEM1;
  645.       }
  646.     dictp2->cptr   = hval;
  647.     dictp->codem1  = max_ent;
  648.     dictp->f.fcode = fcode;
  649.     db->max_ent    = ++max_ent;
  650.     if (db->lens)
  651.       {
  652. unsigned short *len1 = lens_ptr (db, max_ent);
  653. unsigned short *len2 = lens_ptr (db, ent);
  654. *len1 = *len2 + 1;
  655.       }
  656.   }
  657. ent = c;
  658.       }
  659.     
  660.     OUTPUT(ent); /* output the last code */
  661.     db->bytes_out    += olen - PPP_HDRLEN - BSD_OVHD;
  662.     db->uncomp_bytes += isize;
  663.     db->in_count     += isize;
  664.     ++db->uncomp_count;
  665.     ++db->seqno;
  666.     if (bitno < 32)
  667.       {
  668. ++db->bytes_out; /* must be set before calling bsd_check */
  669.       }
  670.     /*
  671.      * Generate the clear command if needed
  672.      */
  673.     if (bsd_check(db))
  674.       {
  675. OUTPUT (CLEAR);
  676.       }
  677.     
  678.     /*
  679.      * Pad dribble bits of last code with ones.
  680.      * Do not emit a completely useless byte of ones.
  681.      */
  682.     if (bitno != 32)
  683.       {
  684. PUTBYTE((accm | (0xff << (bitno-8))) >> 24);
  685.       }
  686.     
  687.     /*
  688.      * Increase code size if we would have without the packet
  689.      * boundary because the decompressor will do so.
  690.      */
  691.     if (max_ent >= mxcode && max_ent < db->maxmaxcode)
  692.       {
  693. db->n_bits++;
  694.       }
  695.     /* If output length is too large then this is an incomplete frame. */
  696.     if (wptr == NULL)
  697.       {
  698. ++db->incomp_count;
  699. db->incomp_bytes += isize;
  700. olen              = 0;
  701.       }
  702.     else /* Count the number of compressed frames */
  703.       {
  704. ++db->comp_count;
  705. db->comp_bytes += olen;
  706.       }
  707.     /* Return the resulting output length */
  708.     return olen;
  709. #undef OUTPUT
  710. #undef PUTBYTE
  711.   }
  712. /*
  713.  * Update the "BSD Compress" dictionary on the receiver for
  714.  * incompressible data by pretending to compress the incoming data.
  715.  */
  716. static void bsd_incomp (void *state, unsigned char *ibuf, int icnt)
  717.   {
  718.     (void) bsd_compress (state, ibuf, (char *) 0, icnt, 0);
  719.   }
  720. /*
  721.  * Decompress "BSD Compress".
  722.  *
  723.  * Because of patent problems, we return DECOMP_ERROR for errors
  724.  * found by inspecting the input data and for system problems, but
  725.  * DECOMP_FATALERROR for any errors which could possibly be said to
  726.  * be being detected "after" decompression.  For DECOMP_ERROR,
  727.  * we can issue a CCP reset-request; for DECOMP_FATALERROR, we may be
  728.  * infringing a patent of Motorola's if we do, so we take CCP down
  729.  * instead.
  730.  *
  731.  * Given that the frame has the correct sequence number and a good FCS,
  732.  * errors such as invalid codes in the input most likely indicate a
  733.  * bug, so we return DECOMP_FATALERROR for them in order to turn off
  734.  * compression, even though they are detected by inspecting the input.
  735.  */
  736. static int bsd_decompress (void *state, unsigned char *ibuf, int isize,
  737.    unsigned char *obuf, int osize)
  738.   {
  739.     struct bsd_db *db;
  740.     unsigned int max_ent;
  741.     unsigned long accm;
  742.     unsigned int bitno; /* 1st valid bit in accm */
  743.     unsigned int n_bits;
  744.     unsigned int tgtbitno; /* bitno when we have a code */
  745.     struct bsd_dict *dictp;
  746.     int explen;
  747.     int seq;
  748.     unsigned int incode;
  749.     unsigned int oldcode;
  750.     unsigned int finchar;
  751.     unsigned char *p;
  752.     unsigned char *wptr;
  753.     int adrs;
  754.     int ctrl;
  755.     int ilen;
  756.     int codelen;
  757.     int extra;
  758.     db       = (struct bsd_db *) state;
  759.     max_ent  = db->max_ent;
  760.     accm     = 0;
  761.     bitno    = 32; /* 1st valid bit in accm */
  762.     n_bits   = db->n_bits;
  763.     tgtbitno = 32 - n_bits; /* bitno when we have a code */
  764.     
  765.     /*
  766.      * Save the address/control from the PPP header
  767.      * and then get the sequence number.
  768.      */
  769.     adrs  = PPP_ADDRESS (ibuf);
  770.     ctrl  = PPP_CONTROL (ibuf);
  771.     seq   = (ibuf[4] << 8) + ibuf[5];
  772.     ibuf += (PPP_HDRLEN + 2);
  773.     ilen  = isize - (PPP_HDRLEN + 2);
  774.     
  775.     /*
  776.      * Check the sequence number and give up if it differs from
  777.      * the value we're expecting.
  778.      */
  779.     if (seq != db->seqno)
  780.       {
  781. if (db->debug)
  782.   {
  783.     printk("bsd_decomp%d: bad sequence # %d, expected %dn",
  784.    db->unit, seq, db->seqno - 1);
  785.   }
  786. return DECOMP_ERROR;
  787.       }
  788.     ++db->seqno;
  789.     db->bytes_out += ilen;
  790.     /*
  791.      * Fill in the ppp header, but not the last byte of the protocol
  792.      * (that comes from the decompressed data).
  793.      */
  794.     wptr    = obuf;
  795.     *wptr++ = adrs;
  796.     *wptr++ = ctrl;
  797.     *wptr++ = 0;
  798.     
  799.     oldcode = CLEAR;
  800.     explen  = 3;
  801.     /*
  802.      * Keep the checkpoint correctly so that incompressible packets
  803.      * clear the dictionary at the proper times.
  804.      */
  805.     for (;;)
  806.       {
  807. if (ilen-- <= 0)
  808.   {
  809.     db->in_count += (explen - 3); /* don't count the header */
  810.     break;
  811.   }
  812. /*
  813.  * Accumulate bytes until we have a complete code.
  814.  * Then get the next code, relying on the 32-bit,
  815.  * unsigned accm to mask the result.
  816.  */
  817. bitno -= 8;
  818. accm  |= *ibuf++ << bitno;
  819. if (tgtbitno < bitno)
  820.   {
  821.     continue;
  822.   }
  823. incode = accm >> tgtbitno;
  824. accm <<= n_bits;
  825. bitno += n_bits;
  826. /*
  827.  * The dictionary must only be cleared at the end of a packet.
  828.  */
  829. if (incode == CLEAR)
  830.   {
  831.     if (ilen > 0)
  832.       {
  833. if (db->debug)
  834.   {
  835.     printk("bsd_decomp%d: bad CLEARn", db->unit);
  836.   }
  837. return DECOMP_FATALERROR; /* probably a bug */
  838.       }
  839.     
  840.     bsd_clear(db);
  841.     break;
  842.   }
  843. if ((incode > max_ent + 2) || (incode > db->maxmaxcode)
  844.     || (incode > max_ent && oldcode == CLEAR))
  845.   {
  846.     if (db->debug)
  847.       {
  848. printk("bsd_decomp%d: bad code 0x%x oldcode=0x%x ",
  849.        db->unit, incode, oldcode);
  850. printk("max_ent=0x%x explen=%d seqno=%dn",
  851.        max_ent, explen, db->seqno);
  852.       }
  853.     return DECOMP_FATALERROR; /* probably a bug */
  854.   }
  855. /* Special case for KwKwK string. */
  856. if (incode > max_ent)
  857.   {
  858.     finchar = oldcode;
  859.     extra   = 1;
  860.   }
  861. else
  862.   {
  863.     finchar = incode;
  864.     extra   = 0;
  865.   }
  866. codelen = *(lens_ptr (db, finchar));
  867. explen += codelen + extra;
  868. if (explen > osize)
  869.   {
  870.     if (db->debug)
  871.       {
  872. printk("bsd_decomp%d: ran out of mrun", db->unit);
  873. #ifdef DEBUG
  874. printk("  len=%d, finchar=0x%x, codelen=%d, explen=%dn",
  875.        ilen, finchar, codelen, explen);
  876. #endif
  877.       }
  878.     return DECOMP_FATALERROR;
  879.   }
  880. /*
  881.  * Decode this code and install it in the decompressed buffer.
  882.  */
  883. wptr += codelen;
  884. p     = wptr;
  885. while (finchar > LAST)
  886.   {
  887.     struct bsd_dict *dictp2 = dict_ptr (db, finchar);
  888.     
  889.     dictp = dict_ptr (db, dictp2->cptr);
  890. #ifdef DEBUG
  891.     if (--codelen <= 0 || dictp->codem1 != finchar-1)
  892.       {
  893. if (codelen <= 0)
  894.   {
  895.     printk("bsd_decomp%d: fell off end of chain ", db->unit);
  896.     printk("0x%x at 0x%x by 0x%x, max_ent=0x%xn",
  897.    incode, finchar, dictp2->cptr, max_ent);
  898.   }
  899. else
  900.   {
  901.     if (dictp->codem1 != finchar-1)
  902.       {
  903. printk("bsd_decomp%d: bad code chain 0x%x "
  904.        "finchar=0x%x ",
  905.        db->unit, incode, finchar);
  906. printk("oldcode=0x%x cptr=0x%x codem1=0x%xn",
  907.        oldcode, dictp2->cptr, dictp->codem1);
  908.       }
  909.   }
  910. return DECOMP_FATALERROR;
  911.       }
  912. #endif
  913.     *--p    = dictp->f.hs.suffix;
  914.     finchar = dictp->f.hs.prefix;
  915.   }
  916. *--p = finchar;
  917. #ifdef DEBUG
  918. if (--codelen != 0)
  919.   {
  920.     printk("bsd_decomp%d: short by %d after code 0x%x, max_ent=0x%xn",
  921.    db->unit, codelen, incode, max_ent);
  922.   }
  923. #endif
  924. if (extra) /* the KwKwK case again */
  925.   {
  926.     *wptr++ = finchar;
  927.   }
  928. /*
  929.  * If not first code in a packet, and
  930.  * if not out of code space, then allocate a new code.
  931.  *
  932.  * Keep the hash table correct so it can be used
  933.  * with uncompressed packets.
  934.  */
  935. if (oldcode != CLEAR && max_ent < db->maxmaxcode)
  936.   {
  937.     struct bsd_dict *dictp2, *dictp3;
  938.     unsigned short  *lens1,  *lens2;
  939.     unsigned long fcode;
  940.     int hval, disp, indx;
  941.     
  942.     fcode = BSD_KEY(oldcode,finchar);
  943.     hval  = BSD_HASH(oldcode,finchar,db->hshift);
  944.     dictp = dict_ptr (db, hval);
  945.     
  946.     /* look for a free hash table entry */
  947.     if (dictp->codem1 < max_ent)
  948.       {
  949. disp = (hval == 0) ? 1 : hval;
  950. do
  951.   {
  952.     hval += disp;
  953.     if (hval >= db->hsize)
  954.       {
  955. hval -= db->hsize;
  956.       }
  957.     dictp = dict_ptr (db, hval);
  958.   }
  959. while (dictp->codem1 < max_ent);
  960.       }
  961.     
  962.     /*
  963.      * Invalidate previous hash table entry
  964.      * assigned this code, and then take it over
  965.      */
  966.     dictp2 = dict_ptr (db, max_ent + 1);
  967.     indx   = dictp2->cptr;
  968.     dictp3 = dict_ptr (db, indx);
  969.     if (dictp3->codem1 == max_ent)
  970.       {
  971. dictp3->codem1 = BADCODEM1;
  972.       }
  973.     dictp2->cptr   = hval;
  974.     dictp->codem1  = max_ent;
  975.     dictp->f.fcode = fcode;
  976.     db->max_ent    = ++max_ent;
  977.     /* Update the length of this string. */
  978.     lens1  = lens_ptr (db, max_ent);
  979.     lens2  = lens_ptr (db, oldcode);
  980.     *lens1 = *lens2 + 1;
  981.     
  982.     /* Expand code size if needed. */
  983.     if (max_ent >= MAXCODE(n_bits) && max_ent < db->maxmaxcode)
  984.       {
  985. db->n_bits = ++n_bits;
  986. tgtbitno   = 32-n_bits;
  987.       }
  988.   }
  989. oldcode = incode;
  990.       }
  991.     ++db->comp_count;
  992.     ++db->uncomp_count;
  993.     db->comp_bytes   += isize - BSD_OVHD - PPP_HDRLEN;
  994.     db->uncomp_bytes += explen;
  995.     if (bsd_check(db))
  996.       {
  997. if (db->debug)
  998.   {
  999.     printk("bsd_decomp%d: peer should have cleared dictionary on %dn",
  1000.    db->unit, db->seqno - 1);
  1001.   }
  1002.       }
  1003.     return explen;
  1004.   }
  1005.      
  1006. /*************************************************************
  1007.  * Table of addresses for the BSD compression module
  1008.  *************************************************************/
  1009. static struct compressor ppp_bsd_compress = {
  1010.     CI_BSD_COMPRESS, /* compress_proto */
  1011.     bsd_comp_alloc, /* comp_alloc */
  1012.     bsd_free, /* comp_free */
  1013.     bsd_comp_init, /* comp_init */
  1014.     bsd_reset, /* comp_reset */
  1015.     bsd_compress, /* compress */
  1016.     bsd_comp_stats, /* comp_stat */
  1017.     bsd_decomp_alloc, /* decomp_alloc */
  1018.     bsd_free, /* decomp_free */
  1019.     bsd_decomp_init, /* decomp_init */
  1020.     bsd_reset, /* decomp_reset */
  1021.     bsd_decompress, /* decompress */
  1022.     bsd_incomp, /* incomp */
  1023.     bsd_comp_stats /* decomp_stat */
  1024. };
  1025. /*************************************************************
  1026.  * Module support routines
  1027.  *************************************************************/
  1028. int __init bsdcomp_init(void)
  1029. {
  1030. int answer = ppp_register_compressor(&ppp_bsd_compress);
  1031. if (answer == 0)
  1032. printk(KERN_INFO "PPP BSD Compression module registeredn");
  1033. return answer;
  1034. }
  1035. void __exit bsdcomp_cleanup(void)
  1036. {
  1037. ppp_unregister_compressor(&ppp_bsd_compress);
  1038. }
  1039. module_init(bsdcomp_init);
  1040. module_exit(bsdcomp_cleanup);
  1041. MODULE_LICENSE("Dual BSD/GPL");