X-Git-Url: http://git.ozlabs.org/?p=ppp.git;a=blobdiff_plain;f=netbsd-1.1%2Fppp-deflate.c;h=9e6579764bcea0e50a6391f580b866adf3afbe06;hp=425d2d24e78975f6a3f06a9cfabe495359ae405f;hb=d1506f182ba87dd019a9d5594f6acea17a77577f;hpb=07a34207f71a960b27f188c2a221d1656e009871 diff --git a/netbsd-1.1/ppp-deflate.c b/netbsd-1.1/ppp-deflate.c index 425d2d2..9e65797 100644 --- a/netbsd-1.1/ppp-deflate.c +++ b/netbsd-1.1/ppp-deflate.c @@ -1,45 +1,56 @@ +/* $Id: ppp-deflate.c,v 1.9 2002/12/06 09:49:16 paulus Exp $ */ + /* * ppp_deflate.c - interface the zlib procedures for Deflate compression * and decompression (as used by gzip) to the PPP code. * This version is for use with mbufs on BSD-derived systems. * - * Copyright (c) 1994 The Australian National University. - * All rights reserved. + * Copyright (c) 1994 Paul Mackerras. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: * - * Permission to use, copy, modify, and distribute this software and its - * documentation is hereby granted, provided that the above copyright - * notice appears in all copies. This software is provided without any - * warranty, express or implied. The Australian National University - * makes no representations about the suitability of this software for - * any purpose. + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. * - * IN NO EVENT SHALL THE AUSTRALIAN NATIONAL UNIVERSITY BE LIABLE TO ANY - * PARTY FOR DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES - * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF - * THE AUSTRALIAN NATIONAL UNIVERSITY HAS BEEN ADVISED OF THE POSSIBILITY - * OF SUCH DAMAGE. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. * - * THE AUSTRALIAN NATIONAL UNIVERSITY SPECIFICALLY DISCLAIMS ANY WARRANTIES, - * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY - * AND FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS - * ON AN "AS IS" BASIS, AND THE AUSTRALIAN NATIONAL UNIVERSITY HAS NO - * OBLIGATION TO PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, - * OR MODIFICATIONS. + * 3. The name(s) of the authors of this software must not be used to + * endorse or promote products derived from this software without + * prior written permission. * - * $Id: ppp-deflate.c,v 1.1 1996/01/18 03:19:11 paulus Exp $ + * 4. Redistributions of any form whatsoever must retain the following + * acknowledgment: + * "This product includes software developed by Paul Mackerras + * ". + * + * THE AUTHORS OF THIS SOFTWARE DISCLAIM ALL WARRANTIES WITH REGARD TO + * THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY + * AND FITNESS, IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + * SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN + * AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING + * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ #include #include +#include #include #include +#include #define PACKETPTR struct mbuf * #include -#include "common/zlib.h" #if DO_DEFLATE +#define DEFLATE_DEBUG 1 + /* * State for a Deflate (de)compressor. */ @@ -57,7 +68,7 @@ struct deflate_state { #define DEFLATE_OVHD 2 /* Deflate overhead/packet */ static void *zalloc __P((void *, u_int items, u_int size)); -static void zfree __P((void *, void *ptr, u_int nb)); +static void zfree __P((void *, void *ptr)); static void *z_comp_alloc __P((u_char *options, int opt_len)); static void *z_decomp_alloc __P((u_char *options, int opt_len)); static void z_comp_free __P((void *state)); @@ -95,6 +106,23 @@ struct compressor ppp_deflate = { z_comp_stats, /* decomp_stat */ }; +struct compressor ppp_deflate = { + CI_DEFLATE_DRAFT, /* compress_proto */ + z_comp_alloc, /* comp_alloc */ + z_comp_free, /* comp_free */ + z_comp_init, /* comp_init */ + z_comp_reset, /* comp_reset */ + z_compress, /* compress */ + z_comp_stats, /* comp_stat */ + z_decomp_alloc, /* decomp_alloc */ + z_decomp_free, /* decomp_free */ + z_decomp_init, /* decomp_init */ + z_decomp_reset, /* decomp_reset */ + z_decompress, /* decompress */ + z_incomp, /* incomp */ + z_comp_stats, /* decomp_stat */ +}; + /* * Space allocation and freeing routines for use by zlib routines. */ @@ -110,10 +138,9 @@ zalloc(notused, items, size) } void -zfree(notused, ptr, nbytes) +zfree(notused, ptr) void *notused; void *ptr; - u_int nbytes; { FREE(ptr, M_DEVBUF); } @@ -129,7 +156,8 @@ z_comp_alloc(options, opt_len) struct deflate_state *state; int w_size; - if (opt_len != CILEN_DEFLATE || options[0] != CI_DEFLATE + if (opt_len != CILEN_DEFLATE + || (options[0] != CI_DEFLATE && options[0] != CI_DEFLATE_DRAFT) || options[1] != CILEN_DEFLATE || DEFLATE_METHOD(options[2]) != DEFLATE_METHOD_VAL || options[3] != DEFLATE_CHK_SEQUENCE) @@ -147,7 +175,7 @@ z_comp_alloc(options, opt_len) state->strm.zalloc = zalloc; state->strm.zfree = zfree; if (deflateInit2(&state->strm, Z_DEFAULT_COMPRESSION, DEFLATE_METHOD_VAL, - -w_size, 8, Z_DEFAULT_STRATEGY, DEFLATE_OVHD+2) != Z_OK) { + -w_size, 8, Z_DEFAULT_STRATEGY) != Z_OK) { FREE(state, M_DEVBUF); return NULL; } @@ -175,7 +203,8 @@ z_comp_init(arg, options, opt_len, unit, hdrlen, debug) { struct deflate_state *state = (struct deflate_state *) arg; - if (opt_len < CILEN_DEFLATE || options[0] != CI_DEFLATE + if (opt_len < CILEN_DEFLATE + || (options[0] != CI_DEFLATE && options[0] != CI_DEFLATE_DRAFT) || options[1] != CILEN_DEFLATE || DEFLATE_METHOD(options[2]) != DEFLATE_METHOD_VAL || DEFLATE_SIZE(options[2]) != state->w_size @@ -210,7 +239,7 @@ z_compress(arg, mret, mp, orig_len, maxolen) int orig_len, maxolen; { struct deflate_state *state = (struct deflate_state *) arg; - u_char *rptr, *wptr, *wp0; + u_char *rptr, *wptr; int proto, olen, wspace, r, flush; struct mbuf *m; @@ -224,9 +253,6 @@ z_compress(arg, mret, mp, orig_len, maxolen) return orig_len; } - if (state->debug) - printf("z_comp%d: pkt in len=%d proto=%x seq=%d\n", - state->unit, orig_len, proto, state->seqno); /* Allocate one mbuf initially. */ if (maxolen > orig_len) maxolen = orig_len; @@ -259,6 +285,8 @@ z_compress(arg, mret, mp, orig_len, maxolen) } else { state->strm.next_out = NULL; state->strm.avail_out = 1000000; + wptr = NULL; + wspace = 0; } ++state->seqno; @@ -269,19 +297,7 @@ z_compress(arg, mret, mp, orig_len, maxolen) flush = (mp == NULL)? Z_PACKET_FLUSH: Z_NO_FLUSH; olen = 0; for (;;) { - if (state->debug) { - wp0 = state->strm.next_in; - printf("z_comp%d: deflate flush=%d in=%d[%x %x %x %x]\n", - state->unit, flush, state->strm.avail_in, - wp0[0], wp0[1], wp0[2], wp0[3]); - wp0 = state->strm.next_out; - } r = deflate(&state->strm, flush); - if (state->debug) { - printf("z_comp%d: ret %d inleft=%d gen %d[%x %x %x %x]\n", - state->unit, r, state->strm.avail_in, - state->strm.next_out - wp0, wp0[0], wp0[1], wp0[2], wp0[3]); - } if (r != Z_OK) { printf("z_compress: deflate returned %d (%s)\n", r, (state->strm.msg? state->strm.msg: "")); @@ -316,14 +332,15 @@ z_compress(arg, mret, mp, orig_len, maxolen) } } } - olen += (m->m_len = wspace - state->strm.avail_out); + if (m != NULL) + olen += (m->m_len = wspace - state->strm.avail_out); /* * See if we managed to reduce the size of the packet. * If the compressor just gave us a single zero byte, it means * the packet was incompressible. */ - if (olen < orig_len && m != NULL + if (m != NULL && olen < orig_len && !(olen == PPP_HDRLEN + 3 && *wptr == 0)) { state->stats.comp_bytes += olen; state->stats.comp_packets++; @@ -352,7 +369,7 @@ z_comp_stats(arg, stats) *stats = state->stats; stats->ratio = stats->unc_bytes; - out = stats->comp_bytes + stats->unc_bytes; + out = stats->comp_bytes + stats->inc_bytes; if (stats->ratio <= 0x7ffffff) stats->ratio <<= 8; else @@ -372,7 +389,8 @@ z_decomp_alloc(options, opt_len) struct deflate_state *state; int w_size; - if (opt_len != CILEN_DEFLATE || options[0] != CI_DEFLATE + if (opt_len != CILEN_DEFLATE + || (options[0] != CI_DEFLATE && options[0] != CI_DEFLATE_DRAFT) || options[1] != CILEN_DEFLATE || DEFLATE_METHOD(options[2]) != DEFLATE_METHOD_VAL || options[3] != DEFLATE_CHK_SEQUENCE) @@ -417,7 +435,8 @@ z_decomp_init(arg, options, opt_len, unit, hdrlen, mru, debug) { struct deflate_state *state = (struct deflate_state *) arg; - if (opt_len < CILEN_DEFLATE || options[0] != CI_DEFLATE + if (opt_len < CILEN_DEFLATE + || (options[0] != CI_DEFLATE && options[0] != CI_DEFLATE_DRAFT) || options[1] != CILEN_DEFLATE || DEFLATE_METHOD(options[2]) != DEFLATE_METHOD_VAL || DEFLATE_SIZE(options[2]) != state->w_size @@ -468,7 +487,7 @@ z_decompress(arg, mi, mop) { struct deflate_state *state = (struct deflate_state *) arg; struct mbuf *mo, *mo_head; - u_char *rptr, *wptr, *wp0; + u_char *rptr, *wptr; int rlen, olen, ospace; int seq, i, flush, r, decode_proto; u_char hdr[PPP_HDRLEN + DEFLATE_OVHD]; @@ -498,14 +517,6 @@ z_decompress(arg, mi, mop) } ++state->seqno; - if (state->debug) { - struct mbuf *x; - int l = rlen; - - for (x = mi; (x = x->m_next) != NULL; ) - l += x->m_len; - printf("z_decomp%d: pkt in len=%d seq=%d\n", state->unit, l, seq); - } /* Allocate an output mbuf. */ MGETHDR(mo, M_DONTWAIT, MT_DATA); if (mo == NULL) @@ -548,21 +559,11 @@ z_decompress(arg, mi, mop) * Call inflate, supplying more input or output as needed. */ for (;;) { - if (state->debug) { - wp0 = state->strm.next_in; - printf("z_decomp%d: inflate flush=%d in=%d[%x %x %x %x]\n", - state->unit, flush, state->strm.avail_in, - wp0[0], wp0[1], wp0[2], wp0[3]); - wp0 = state->strm.next_out; - } r = inflate(&state->strm, flush); - if (state->debug) { - printf("z_decomp%d: ret %d inleft=%d gen %d[%x %x %x %x]\n", - state->unit, r, state->strm.avail_in, - state->strm.next_out - wp0, wp0[0], wp0[1], wp0[2], wp0[3]); - } if (r != Z_OK) { +#if !DEFLATE_DEBUG if (state->debug) +#endif printf("z_decompress%d: inflate returned %d (%s)\n", state->unit, r, (state->strm.msg? state->strm.msg: "")); m_freem(mo_head); @@ -609,6 +610,11 @@ z_decompress(arg, mi, mop) return DECOMP_ERROR; } olen += (mo->m_len = ospace - state->strm.avail_out); +#if DEFLATE_DEBUG + if (olen > state->mru + PPP_HDRLEN) + printf("ppp_deflate%d: exceeded mru (%d > %d)\n", + state->unit, olen, state->mru + PPP_HDRLEN); +#endif state->stats.unc_bytes += olen; state->stats.unc_packets++; @@ -658,10 +664,11 @@ z_incomp(arg, mi) r = inflateIncomp(&state->strm); if (r != Z_OK) { /* gak! */ - if (state->debug) { +#if !DEFLATE_DEBUG + if (state->debug) +#endif printf("z_incomp%d: inflateIncomp returned %d (%s)\n", state->unit, r, (state->strm.msg? state->strm.msg: "")); - } return; } mi = mi->m_next;