X-Git-Url: http://git.ozlabs.org/?p=ppp.git;a=blobdiff_plain;f=netbsd-1.1%2Fppp-deflate.c;h=213bf0e2e38732436cb27ff45c75d82054b07916;hp=425d2d24e78975f6a3f06a9cfabe495359ae405f;hb=91fe5eefe0e7b0e46b2df9dd1d5b54a545a5b432;hpb=07a34207f71a960b27f188c2a221d1656e009871 diff --git a/netbsd-1.1/ppp-deflate.c b/netbsd-1.1/ppp-deflate.c index 425d2d2..213bf0e 100644 --- a/netbsd-1.1/ppp-deflate.c +++ b/netbsd-1.1/ppp-deflate.c @@ -1,3 +1,5 @@ +/* $Id: ppp-deflate.c,v 1.8 1998/03/24 23:48:04 paulus Exp $ */ + /* * ppp_deflate.c - interface the zlib procedures for Deflate compression * and decompression (as used by gzip) to the PPP code. @@ -25,21 +27,22 @@ * ON AN "AS IS" BASIS, AND THE AUSTRALIAN NATIONAL UNIVERSITY HAS NO * OBLIGATION TO PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, * OR MODIFICATIONS. - * - * $Id: ppp-deflate.c,v 1.1 1996/01/18 03:19:11 paulus Exp $ */ #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 +60,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 +98,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 +130,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 +148,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 +167,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 +195,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 +231,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 +245,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 +277,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 +289,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 +324,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 +361,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 +381,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 +427,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 +479,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 +509,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 +551,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 +602,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 +656,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;