X-Git-Url: http://git.ozlabs.org/?p=ppp.git;a=blobdiff_plain;f=pppd%2Fccp.c;h=23fee58446584ece466faafcedd4155ad773feac;hp=bade39a8403c026d60d4a6fa7cf31ae728dfdb82;hb=35db9b26511273fc41366dad861545b418083ef2;hpb=a78ea8bb0a9255c933ac9d702ded881d4195ceab diff --git a/pppd/ccp.c b/pppd/ccp.c index bade39a..23fee58 100644 --- a/pppd/ccp.c +++ b/pppd/ccp.c @@ -26,37 +26,37 @@ */ #ifndef lint -static char rcsid[] = "$Id: ccp.c,v 1.4 1994/09/16 02:14:31 paulus Exp $"; +static char rcsid[] = "$Id: ccp.c,v 1.10 1995/06/06 01:52:23 paulus Exp $"; #endif #include #include +#include #include "pppd.h" -#include "ppp.h" #include "fsm.h" #include "ccp.h" -fsm ccp_fsm[NPPP]; -ccp_options ccp_wantoptions[NPPP]; /* what to request the peer to use */ -ccp_options ccp_gotoptions[NPPP]; /* what the peer agreed to do */ -ccp_options ccp_allowoptions[NPPP]; /* what we'll agree to do */ -ccp_options ccp_hisoptions[NPPP]; /* what we agreed to do */ +fsm ccp_fsm[NUM_PPP]; +ccp_options ccp_wantoptions[NUM_PPP]; /* what to request the peer to use */ +ccp_options ccp_gotoptions[NUM_PPP]; /* what the peer agreed to do */ +ccp_options ccp_allowoptions[NUM_PPP]; /* what we'll agree to do */ +ccp_options ccp_hisoptions[NUM_PPP]; /* what we agreed to do */ /* * Callbacks for fsm code. */ -static void ccp_resetci __ARGS((fsm *)); -static int ccp_cilen __ARGS((fsm *)); -static void ccp_addci __ARGS((fsm *, u_char *, int *)); -static int ccp_ackci __ARGS((fsm *, u_char *, int)); -static int ccp_nakci __ARGS((fsm *, u_char *, int)); -static int ccp_rejci __ARGS((fsm *, u_char *, int)); -static int ccp_reqci __ARGS((fsm *, u_char *, int *, int)); -static void ccp_up __ARGS((fsm *)); -static void ccp_down __ARGS((fsm *)); -static int ccp_extcode __ARGS((fsm *, int, int, u_char *, int)); -static void ccp_rack_timeout __ARGS(()); +static void ccp_resetci __P((fsm *)); +static int ccp_cilen __P((fsm *)); +static void ccp_addci __P((fsm *, u_char *, int *)); +static int ccp_ackci __P((fsm *, u_char *, int)); +static int ccp_nakci __P((fsm *, u_char *, int)); +static int ccp_rejci __P((fsm *, u_char *, int)); +static int ccp_reqci __P((fsm *, u_char *, int *, int)); +static void ccp_up __P((fsm *)); +static void ccp_down __P((fsm *)); +static int ccp_extcode __P((fsm *, int, int, u_char *, int)); +static void ccp_rack_timeout __P(()); static fsm_callbacks ccp_callbacks = { ccp_resetci, @@ -76,25 +76,6 @@ static fsm_callbacks ccp_callbacks = { "CCP" }; -/* - * Length of configuration options, which describe possible - * compression methods. - */ -#define CILEN_BSD 3 - -/* - * Configuration option values for compression methods. - */ -#define CI_BSD_COMPRESS 0x21 - -/* - * Information relating to BSD Compress configuration options. - */ -#define BSD_NBITS(x) ((x) & 0x1F) -#define BSD_VERSION(x) ((x) >> 5) -#define BSD_CURRENT_VERSION 1 -#define BSD_MAKE_OPT(v, n) (((v) << 5) | (n)) - /* * Do we want / did we get any compression? */ @@ -103,7 +84,7 @@ static fsm_callbacks ccp_callbacks = { /* * Local state (mainly for handling reset-reqs and reset-acks */ -static int ccp_localstate[NPPP]; +static int ccp_localstate[NUM_PPP]; #define RACK_PENDING 1 /* waiting for reset-ack */ #define RREQ_REPEAT 2 /* send another reset-req if no reset-ack */ @@ -119,7 +100,7 @@ ccp_init(unit) fsm *f = &ccp_fsm[unit]; f->unit = unit; - f->protocol = CCP; + f->protocol = PPP_CCP; f->callbacks = &ccp_callbacks; fsm_init(f); @@ -128,10 +109,11 @@ ccp_init(unit) memset(&ccp_allowoptions[unit], 0, sizeof(ccp_options)); memset(&ccp_hisoptions[unit], 0, sizeof(ccp_options)); + ccp_wantoptions[0].bsd_compress = 1; ccp_wantoptions[0].bsd_bits = 12; /* default value */ ccp_allowoptions[0].bsd_compress = 1; - ccp_allowoptions[0].bsd_bits = MAX_BSD_BITS; + ccp_allowoptions[0].bsd_bits = BSD_MAX_BITS; } /* @@ -213,15 +195,15 @@ ccp_extcode(f, code, id, p, len) int len; { switch (code) { - case RESETREQ: + case CCP_RESETREQ: if (f->state != OPENED) break; /* send a reset-ack, which the transmitter will see and reset its compression state. */ - fsm_sdata(f, RESETACK, id, NULL, 0); + fsm_sdata(f, CCP_RESETACK, id, NULL, 0); break; - case RESETACK: + case CCP_RESETACK: if (ccp_localstate[f->unit] & RACK_PENDING && id == f->reqid) { ccp_localstate[f->unit] &= ~(RACK_PENDING | RREQ_REPEAT); UNTIMEOUT(ccp_rack_timeout, (caddr_t) f); @@ -259,9 +241,9 @@ ccp_resetci(f) *go = ccp_wantoptions[f->unit]; if (go->bsd_compress) { opt_buf[0] = CI_BSD_COMPRESS; - opt_buf[1] = CILEN_BSD; + opt_buf[1] = CILEN_BSD_COMPRESS; opt_buf[2] = BSD_MAKE_OPT(BSD_CURRENT_VERSION, go->bsd_bits); - if (!ccp_test(f->unit, opt_buf, CILEN_BSD, 0)) + if (!ccp_test(f->unit, opt_buf, CILEN_BSD_COMPRESS, 0)) go->bsd_compress = 0; } } @@ -275,7 +257,7 @@ ccp_cilen(f) { ccp_options *go = &ccp_gotoptions[f->unit]; - return (go->bsd_compress? CILEN_BSD: 0); + return (go->bsd_compress? CILEN_BSD_COMPRESS: 0); } /* @@ -292,10 +274,10 @@ ccp_addci(f, p, lenp) if (go->bsd_compress) { p[0] = CI_BSD_COMPRESS; - p[1] = CILEN_BSD; + p[1] = CILEN_BSD_COMPRESS; p[2] = BSD_MAKE_OPT(BSD_CURRENT_VERSION, go->bsd_bits); - if (ccp_test(f->unit, p, CILEN_BSD, 0)) - p += CILEN_BSD; + if (ccp_test(f->unit, p, CILEN_BSD_COMPRESS, 0)) + p += CILEN_BSD_COMPRESS; else go->bsd_compress = 0; } @@ -315,11 +297,12 @@ ccp_ackci(f, p, len) ccp_options *go = &ccp_gotoptions[f->unit]; if (go->bsd_compress) { - if (len < CILEN_BSD || p[0] != CI_BSD_COMPRESS || p[1] != CILEN_BSD + if (len < CILEN_BSD_COMPRESS + || p[0] != CI_BSD_COMPRESS || p[1] != CILEN_BSD_COMPRESS || p[2] != BSD_MAKE_OPT(BSD_CURRENT_VERSION, go->bsd_bits)) return 0; - p += CILEN_BSD; - len -= CILEN_BSD; + p += CILEN_BSD_COMPRESS; + len -= CILEN_BSD_COMPRESS; } if (len != 0) return 0; @@ -343,8 +326,8 @@ ccp_nakci(f, p, len) memset(&no, 0, sizeof(no)); try = *go; - if (go->bsd_compress && !no.bsd_compress && len >= CILEN_BSD - && p[0] == CI_BSD_COMPRESS && p[1] == CILEN_BSD) { + if (go->bsd_compress && !no.bsd_compress && len >= CILEN_BSD_COMPRESS + && p[0] == CI_BSD_COMPRESS && p[1] == CILEN_BSD_COMPRESS) { no.bsd_compress = 1; /* * Peer wants us to use a different number of bits @@ -354,8 +337,8 @@ ccp_nakci(f, p, len) try.bsd_compress = 0; else if (BSD_NBITS(p[2]) < go->bsd_bits) try.bsd_bits = BSD_NBITS(p[2]); - p += CILEN_BSD; - len -= CILEN_BSD; + p += CILEN_BSD_COMPRESS; + len -= CILEN_BSD_COMPRESS; } /* @@ -384,13 +367,13 @@ ccp_rejci(f, p, len) try = *go; - if (go->bsd_compress && len >= CILEN_BSD - && p[0] == CI_BSD_COMPRESS && p[1] == CILEN_BSD) { + if (go->bsd_compress && len >= CILEN_BSD_COMPRESS + && p[0] == CI_BSD_COMPRESS && p[1] == CILEN_BSD_COMPRESS) { if (p[2] != BSD_MAKE_OPT(BSD_CURRENT_VERSION, go->bsd_bits)) return 0; try.bsd_compress = 0; - p += CILEN_BSD; - len -= CILEN_BSD; + p += CILEN_BSD_COMPRESS; + len -= CILEN_BSD_COMPRESS; } if (len != 0) @@ -439,7 +422,7 @@ ccp_reqci(f, p, lenp, dont_nak) switch (type) { case CI_BSD_COMPRESS: - if (!ao->bsd_compress || clen != CILEN_BSD) { + if (!ao->bsd_compress || clen != CILEN_BSD_COMPRESS) { newret = CONFREJ; break; } @@ -450,10 +433,10 @@ ccp_reqci(f, p, lenp, dont_nak) || nb > ao->bsd_bits) { newret = CONFNAK; nb = ao->bsd_bits; - } else if (nb < MIN_BSD_BITS) { + } else if (nb < BSD_MIN_BITS) { newret = CONFREJ; - } else if (!ccp_test(f->unit, p, CILEN_BSD, 1)) { - if (nb > MIN_BSD_BITS) { + } else if (!ccp_test(f->unit, p, CILEN_BSD_COMPRESS, 1)) { + if (nb > BSD_MIN_BITS) { --nb; newret = CONFNAK; } else @@ -470,8 +453,12 @@ ccp_reqci(f, p, lenp, dont_nak) } } + if (newret == CONFNAK && dont_nak) + newret = CONFREJ; if (!(newret == CONFACK || newret == CONFNAK && ret == CONFREJ)) { /* we're returning this option */ + if (newret == CONFREJ && ret == CONFNAK) + retp = p0; ret = newret; if (p != retp) BCOPY(p, retp, clen); @@ -531,7 +518,7 @@ int ccp_printpkt(p, plen, printer, arg) u_char *p; int plen; - void (*printer) __ARGS((void *, char *, ...)); + void (*printer) __P((void *, char *, ...)); void *arg; { u_char *p0, *optend; @@ -572,10 +559,10 @@ ccp_printpkt(p, plen, printer, arg) optend = p + optlen; switch (code) { case CI_BSD_COMPRESS: - if (optlen >= CILEN_BSD) { + if (optlen >= CILEN_BSD_COMPRESS) { printer(arg, "bsd v%d %d", BSD_VERSION(p[2]), BSD_NBITS(p[2])); - p += CILEN_BSD; + p += CILEN_BSD_COMPRESS; } break; } @@ -628,7 +615,7 @@ ccp_datainput(unit, pkt, len) * acknowledgement to a previous reset-request. */ if (!(ccp_localstate[f->unit] & RACK_PENDING)) { - fsm_sdata(f, RESETREQ, f->reqid = ++f->id, NULL, 0); + fsm_sdata(f, CCP_RESETREQ, f->reqid = ++f->id, NULL, 0); TIMEOUT(ccp_rack_timeout, (caddr_t) f, RACKTIMEOUT); ccp_localstate[f->unit] |= RACK_PENDING; } else @@ -647,7 +634,7 @@ ccp_rack_timeout(arg) fsm *f = (fsm *) arg; if (f->state == OPENED && ccp_localstate[f->unit] & RREQ_REPEAT) { - fsm_sdata(f, RESETREQ, f->reqid, NULL, 0); + fsm_sdata(f, CCP_RESETREQ, f->reqid, NULL, 0); TIMEOUT(ccp_rack_timeout, (caddr_t) f, RACKTIMEOUT); ccp_localstate[f->unit] &= ~RREQ_REPEAT; } else