3e86158156
The PPP Daemon is the userland part of the Point-to-Point Protocol. It works in combination with a dedicated kernel network interface usually named ppp. PPP is a very extensible protocol and pppd supports a large number of options, including compression (through various algorithms), cryptography (Microsoft's MPPE) and authentication (PAP, CHAP, Microsoft CHAP), provided the kernel has the relevant back-ends in some cases.
177 lines
5.3 KiB
Text
177 lines
5.3 KiB
Text
$NetBSD: patch-bf,v 1.1.1.1 2005/01/02 02:51:44 cube Exp $
|
|
|
|
--- pppdump/bsd-comp.c.orig 2004-02-02 04:36:46.000000000 +0100
|
|
+++ pppdump/bsd-comp.c
|
|
@@ -46,8 +46,15 @@
|
|
#include <stddef.h>
|
|
#include <stdlib.h>
|
|
#include <string.h>
|
|
+#include "pppdump.h"
|
|
+#ifdef __NetBSD__
|
|
+#include <net/ppp_defs.h>
|
|
+#include <net/ppp-comp.h>
|
|
+#else
|
|
#include "ppp_defs.h"
|
|
#include "ppp-comp.h"
|
|
+#endif
|
|
+
|
|
|
|
#if DO_BSD_COMPRESS
|
|
|
|
@@ -128,9 +135,8 @@ static void *bsd_decomp_alloc __P((u_cha
|
|
static void bsd_free __P((void *state));
|
|
static int bsd_decomp_init __P((void *state, u_char *options, int opt_len,
|
|
int unit, int hdrlen, int mru, int debug));
|
|
-static void bsd_incomp __P((void *state, u_char *dmsg, int len));
|
|
-static int bsd_decompress __P((void *state, u_char *cmp, int inlen,
|
|
- u_char *dmp, int *outlen));
|
|
+static void bsd_incomp __P((void *state, PACKETPTR in));
|
|
+static int bsd_decompress __P((void *state, PACKETPTR in, PACKETPTR *out));
|
|
static void bsd_reset __P((void *state));
|
|
static void bsd_comp_stats __P((void *state, struct compstat *stats));
|
|
|
|
@@ -139,6 +145,12 @@ static void bsd_comp_stats __P((void *st
|
|
*/
|
|
struct compressor ppp_bsd_compress = {
|
|
CI_BSD_COMPRESS, /* compress_proto */
|
|
+ NULL, /* comp_alloc */
|
|
+ NULL, /* comp_free */
|
|
+ NULL, /* comp_init */
|
|
+ NULL, /* comp_reset */
|
|
+ NULL, /* comp_compress */
|
|
+ NULL, /* comp_stat */
|
|
bsd_decomp_alloc, /* decomp_alloc */
|
|
bsd_free, /* decomp_free */
|
|
bsd_decomp_init, /* decomp_init */
|
|
@@ -170,6 +182,12 @@ struct compressor ppp_bsd_compress = {
|
|
#define RATIO_SCALE (1<<RATIO_SCALE_LOG)
|
|
#define RATIO_MAX (0x7fffffff>>RATIO_SCALE_LOG)
|
|
|
|
+static void bsd_clear __P((struct bsd_db *));
|
|
+static int bsd_check __P((struct bsd_db *));
|
|
+static void *bsd_alloc __P((u_char *, int, int));
|
|
+static int bsd_init __P((struct bsd_db *, u_char *, int, int, int, int,
|
|
+ int, int));
|
|
+
|
|
/*
|
|
* clear the dictionary
|
|
*/
|
|
@@ -257,7 +275,7 @@ bsd_comp_stats(state, stats)
|
|
stats->ratio = db->in_count;
|
|
out = db->bytes_out;
|
|
if (stats->ratio <= 0x7fffff)
|
|
- stats->ratio <<= 8;
|
|
+ stats->ratio = ((stats->ratio) << 8);
|
|
else
|
|
out >>= 8;
|
|
if (out != 0)
|
|
@@ -383,7 +401,7 @@ bsd_init(db, options, opt_len, unit, hdr
|
|
|| options[0] != CI_BSD_COMPRESS || options[1] != CILEN_BSD_COMPRESS
|
|
|| BSD_VERSION(options[2]) != BSD_CURRENT_VERSION
|
|
|| BSD_NBITS(options[2]) != db->maxbits
|
|
- || decomp && db->lens == NULL)
|
|
+ || (decomp && db->lens == NULL))
|
|
return 0;
|
|
|
|
if (decomp) {
|
|
@@ -424,10 +442,9 @@ bsd_decomp_init(state, options, opt_len,
|
|
* incompressible data by pretending to compress the incoming data.
|
|
*/
|
|
static void
|
|
-bsd_incomp(state, dmsg, mlen)
|
|
+bsd_incomp(state, in)
|
|
void *state;
|
|
- u_char *dmsg;
|
|
- int mlen;
|
|
+ PACKETPTR in;
|
|
{
|
|
struct bsd_db *db = (struct bsd_db *) state;
|
|
u_int hshift = db->hshift;
|
|
@@ -442,11 +459,11 @@ bsd_incomp(state, dmsg, mlen)
|
|
u_char *rptr;
|
|
u_int ent;
|
|
|
|
- rptr = dmsg;
|
|
+ rptr = in->buf;
|
|
ent = rptr[0]; /* get the protocol */
|
|
if (ent == 0) {
|
|
++rptr;
|
|
- --mlen;
|
|
+ in->len--;
|
|
ent = rptr[0];
|
|
}
|
|
if ((ent & 1) == 0 || ent < 0x21 || ent > 0xf9)
|
|
@@ -455,7 +472,7 @@ bsd_incomp(state, dmsg, mlen)
|
|
db->seqno++;
|
|
ilen = 1; /* count the protocol as 1 byte */
|
|
++rptr;
|
|
- slen = dmsg + mlen - rptr;
|
|
+ slen = in->buf + in->len - rptr;
|
|
ilen += slen;
|
|
for (; slen > 0; --slen) {
|
|
c = *rptr++;
|
|
@@ -544,10 +561,10 @@ bsd_incomp(state, dmsg, mlen)
|
|
* compression, even though they are detected by inspecting the input.
|
|
*/
|
|
static int
|
|
-bsd_decompress(state, cmsg, inlen, dmp, outlenp)
|
|
+bsd_decompress(state, in, out)
|
|
void *state;
|
|
- u_char *cmsg, *dmp;
|
|
- int inlen, *outlenp;
|
|
+ PACKETPTR in;
|
|
+ PACKETPTR *out;
|
|
{
|
|
struct bsd_db *db = (struct bsd_db *) state;
|
|
u_int max_ent = db->max_ent;
|
|
@@ -556,19 +573,19 @@ bsd_decompress(state, cmsg, inlen, dmp,
|
|
u_int n_bits = db->n_bits;
|
|
u_int tgtbitno = 32-n_bits; /* bitno when we have a code */
|
|
struct bsd_dict *dictp;
|
|
- int explen, i, seq, len;
|
|
+ int explen, seq, len;
|
|
u_int incode, oldcode, finchar;
|
|
u_char *p, *rptr, *wptr;
|
|
int ilen;
|
|
- int dlen, space, codelen, extra;
|
|
+ int dlen, codelen, extra;
|
|
|
|
- rptr = cmsg;
|
|
+ rptr = in->buf;
|
|
if (*rptr == 0)
|
|
++rptr;
|
|
++rptr; /* skip protocol (assumed 0xfd) */
|
|
seq = (rptr[0] << 8) + rptr[1];
|
|
rptr += BSD_OVHD;
|
|
- ilen = len = cmsg + inlen - rptr;
|
|
+ ilen = len = in->buf + in->len - rptr;
|
|
|
|
/*
|
|
* Check the sequence number and give up if it is not what we expect.
|
|
@@ -580,7 +597,7 @@ bsd_decompress(state, cmsg, inlen, dmp,
|
|
return DECOMP_ERROR;
|
|
}
|
|
|
|
- wptr = dmp + db->hdrlen;
|
|
+ wptr = (*out)->buf + db->hdrlen;
|
|
|
|
oldcode = CLEAR;
|
|
explen = 0;
|
|
@@ -616,7 +633,7 @@ bsd_decompress(state, cmsg, inlen, dmp,
|
|
}
|
|
|
|
if (incode > max_ent + 2 || incode > db->maxmaxcode
|
|
- || incode > max_ent && oldcode == CLEAR) {
|
|
+ || (incode > max_ent && oldcode == CLEAR)) {
|
|
if (db->debug) {
|
|
printf("bsd_decomp%d: bad code 0x%x oldcode=0x%x ",
|
|
db->unit, incode, oldcode);
|
|
@@ -729,7 +746,7 @@ bsd_decompress(state, cmsg, inlen, dmp,
|
|
}
|
|
oldcode = incode;
|
|
}
|
|
- *outlenp = wptr - (dmp + db->hdrlen);
|
|
+ (*out)->len = wptr - ((*out)->buf + db->hdrlen);
|
|
|
|
/*
|
|
* Keep the checkpoint right so that incompressible packets
|