X-Git-Url: https://git.ozlabs.org/?p=ppp.git;a=blobdiff_plain;f=modules%2Fppp_comp.c;h=96713709b97570ebf04b7bc6a1da3da3ff94bee0;hp=c3badd3698c54c5266a8260a8965e5507e29593e;hb=8592783058509b5493a42f3b0432fcbaab55c994;hpb=f5a0b14163d8fff8b1ef7394d79f48496d5cd7bc diff --git a/modules/ppp_comp.c b/modules/ppp_comp.c index c3badd3..9671370 100644 --- a/modules/ppp_comp.c +++ b/modules/ppp_comp.c @@ -24,7 +24,7 @@ * OBLIGATION TO PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, * OR MODIFICATIONS. * - * $Id: ppp_comp.c,v 1.8 1997/04/30 05:45:15 paulus Exp $ + * $Id: ppp_comp.c,v 1.11 1999/04/12 06:20:22 paulus Exp $ */ /* @@ -162,7 +162,7 @@ extern task_t first_task; extern struct compressor ppp_bsd_compress; #endif #if DO_DEFLATE -extern struct compressor ppp_deflate; +extern struct compressor ppp_deflate, ppp_deflate_draft; #endif struct compressor *ppp_compressors[] = { @@ -171,6 +171,7 @@ struct compressor *ppp_compressors[] = { #endif #if DO_DEFLATE &ppp_deflate, + &ppp_deflate_draft, #endif NULL }; @@ -189,20 +190,20 @@ MOD_OPEN(ppp_comp_open) cp = (comp_state_t *) ALLOC_SLEEP(sizeof(comp_state_t)); if (cp == NULL) OPEN_ERROR(ENOSR); - WR(q)->q_ptr = q->q_ptr = (caddr_t) cp; bzero((caddr_t)cp, sizeof(comp_state_t)); + WR(q)->q_ptr = q->q_ptr = (caddr_t) cp; cp->mru = PPP_MRU; cp->mtu = PPP_MTU; cp->xstate = NULL; cp->rstate = NULL; vj_compress_init(&cp->vj_comp, -1); - ++ppp_comp_count; - qprocson(q); #ifdef __osf__ if (!(thread = kernel_thread_w_arg(first_task, ppp_comp_alloc, (void *)cp))) OPEN_ERROR(ENOSR); cp->thread = thread; #endif + ++ppp_comp_count; + qprocson(q); } return 0; } @@ -325,6 +326,12 @@ ppp_comp_wput(q, mp) int nxslots, nrslots; cp = (comp_state_t *) q->q_ptr; + if (cp == 0) { + DPRINT("cp == 0 in ppp_comp_wput\n"); + freemsg(mp); + return 0; + } + switch (mp->b_datap->db_type) { case M_DATA: @@ -340,6 +347,10 @@ ppp_comp_wput(q, mp) /* set/get CCP state */ if (iop->ioc_count != 2 * sizeof(int)) break; + if (mp->b_cont == 0) { + DPRINT1("ppp_comp_wput/%d: PPPIO_CFLAGS b_cont = 0!\n", cp->unit); + break; + } flags = ((int *) mp->b_cont->b_rptr)[0]; mask = ((int *) mp->b_cont->b_rptr)[1]; cp->flags = (cp->flags & ~mask) | (flags & mask); @@ -366,6 +377,10 @@ ppp_comp_wput(q, mp) */ if (iop->ioc_count != 2) break; + if (mp->b_cont == 0) { + DPRINT1("ppp_comp_wput/%d: PPPIO_VJINIT b_cont = 0!\n", cp->unit); + break; + } nxslots = mp->b_cont->b_rptr[0] + 1; nrslots = mp->b_cont->b_rptr[1] + 1; if (nxslots > MAX_STATES || nrslots > MAX_STATES) @@ -380,6 +395,10 @@ ppp_comp_wput(q, mp) case PPPIO_RCOMP: if (iop->ioc_count <= 0) break; + if (mp->b_cont == 0) { + DPRINT1("ppp_comp_wput/%d: PPPIO_[XR]COMP b_cont = 0!\n", cp->unit); + break; + } opt_data = mp->b_cont->b_rptr; len = mp->b_cont->b_wptr - opt_data; if (len > iop->ioc_count) @@ -515,6 +534,10 @@ ppp_comp_wput(q, mp) case PPPIO_DEBUG: if (iop->ioc_count != sizeof(int)) break; + if (mp->b_cont == 0) { + DPRINT1("ppp_comp_wput/%d: PPPIO_DEBUG b_cont = 0!\n", cp->unit); + break; + } n = *(int *)mp->b_cont->b_rptr; if (n == PPPDBG_LOG + PPPDBG_COMP) { DPRINT1("ppp_comp%d: debug log enabled\n", cp->unit); @@ -567,6 +590,8 @@ ppp_comp_wput(q, mp) default: putnext(q, mp); } + + return 0; } static int @@ -580,15 +605,21 @@ ppp_comp_wsrv(q) unsigned char *vjhdr, *dp; cp = (comp_state_t *) q->q_ptr; + if (cp == 0) { + DPRINT("cp == 0 in ppp_comp_wsrv\n"); + return 0; + } + while ((mp = getq(q)) != 0) { /* assert(mp->b_datap->db_type == M_DATA) */ #ifdef PRIOQ - if (!bcanputnext(q,mp->b_band)) { + if (!bcanputnext(q,mp->b_band)) #else - if (!canputnext(q)) { + if (!canputnext(q)) #endif PRIOQ + { putbq(q, mp); - return; + break; } /* @@ -659,7 +690,7 @@ ppp_comp_wsrv(q) && cp->xstate != NULL) { len = msgdsize(mp); (*cp->xcomp->compress)(cp->xstate, &cmp, mp, len, - (cp->flags & CCP_ISUP? cp->mtu: 0)); + (cp->flags & CCP_ISUP? cp->mtu + PPP_HDRLEN: 0)); if (cmp != NULL) { #ifdef PRIOQ cmp->b_band=mp->b_band; @@ -688,6 +719,8 @@ ppp_comp_wsrv(q) cp->stats.ppp_obytes += msgdsize(mp); putnext(q, mp); } + + return 0; } static int @@ -700,6 +733,12 @@ ppp_comp_rput(q, mp) struct ppp_stats *psp; cp = (comp_state_t *) q->q_ptr; + if (cp == 0) { + DPRINT("cp == 0 in ppp_comp_rput\n"); + freemsg(mp); + return 0; + } + switch (mp->b_datap->db_type) { case M_DATA: @@ -738,6 +777,8 @@ ppp_comp_rput(q, mp) default: putnext(q, mp); } + + return 0; } static int @@ -752,11 +793,16 @@ ppp_comp_rsrv(q) u_int iphlen; cp = (comp_state_t *) q->q_ptr; + if (cp == 0) { + DPRINT("cp == 0 in ppp_comp_rsrv\n"); + return 0; + } + while ((mp = getq(q)) != 0) { /* assert(mp->b_datap->db_type == M_DATA) */ if (!canputnext(q)) { putbq(q, mp); - return; + break; } len = msgdsize(mp); @@ -978,6 +1024,8 @@ ppp_comp_rsrv(q) cp->stats.ppp_ierrors++; putctl1(q->q_next, M_CTL, PPPCTL_IERROR); } + + return 0; } /*