+/* $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.
* 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 <sys/param.h>
#include <sys/types.h>
+#include <sys/systm.h>
#include <sys/mbuf.h>
#include <net/ppp_defs.h>
+#include <net/zlib.h>
#define PACKETPTR struct mbuf *
#include <net/ppp-comp.h>
-#include "common/zlib.h"
#if DO_DEFLATE
+#define DEFLATE_DEBUG 1
+
/*
* State for a Deflate (de)compressor.
*/
#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));
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.
*/
}
void
-zfree(notused, ptr, nbytes)
+zfree(notused, ptr)
void *notused;
void *ptr;
- u_int nbytes;
{
FREE(ptr, M_DEVBUF);
}
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)
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;
}
{
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
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;
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;
} else {
state->strm.next_out = NULL;
state->strm.avail_out = 1000000;
+ wptr = NULL;
+ wspace = 0;
}
++state->seqno;
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: ""));
}
}
}
- 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++;
*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
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)
{
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
{
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];
}
++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)
* 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);
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++;
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;