X-Git-Url: http://git.ozlabs.org/?p=ppp.git;a=blobdiff_plain;f=modules%2Fppp_comp.c;h=97d13ebd3bf608b624718e60ed23566f191588e3;hp=c4ed83e50343c7500a32ad82d0afbfca38e83638;hb=d00f8a0e184cc73b1ca33a9b22c1b1f87292a72f;hpb=4fdc878315fc1752f4cf53b3352f27f09e2b6bcb diff --git a/modules/ppp_comp.c b/modules/ppp_comp.c index c4ed83e..97d13eb 100644 --- a/modules/ppp_comp.c +++ b/modules/ppp_comp.c @@ -1,30 +1,38 @@ /* * ppp_comp.c - STREAMS module for kernel-level compression and CCP support. * - * Copyright (c) 1994 The Australian National University. - * All rights reserved. + * Copyright (c) 1994 Paul Mackerras. All rights reserved. * - * Permission to use, copy, modify, and distribute this software and its - * documentation is hereby granted, provided that the above copyright - * notice appears in all copies. This software is provided without any - * warranty, express or implied. The Australian National University - * makes no representations about the suitability of this software for - * any purpose. + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: * - * IN NO EVENT SHALL THE AUSTRALIAN NATIONAL UNIVERSITY BE LIABLE TO ANY - * PARTY FOR DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES - * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF - * THE AUSTRALIAN NATIONAL UNIVERSITY HAS BEEN ADVISED OF THE POSSIBILITY - * OF SUCH DAMAGE. + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. * - * THE AUSTRALIAN NATIONAL UNIVERSITY SPECIFICALLY DISCLAIMS ANY WARRANTIES, - * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY - * AND FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS - * ON AN "AS IS" BASIS, AND THE AUSTRALIAN NATIONAL UNIVERSITY HAS NO - * OBLIGATION TO PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, - * OR MODIFICATIONS. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. * - * $Id: ppp_comp.c,v 1.9 1998/03/24 23:52:37 paulus Exp $ + * 3. The name(s) of the authors of this software must not be used to + * endorse or promote products derived from this software without + * prior written permission. + * + * 4. Redistributions of any form whatsoever must retain the following + * acknowledgment: + * "This product includes software developed by Paul Mackerras + * ". + * + * THE AUTHORS OF THIS SOFTWARE DISCLAIM ALL WARRANTIES WITH REGARD TO + * THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY + * AND FITNESS, IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + * SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN + * AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING + * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * $Id: ppp_comp.c,v 1.14 2002/12/06 09:49:15 paulus Exp $ */ /* @@ -190,20 +198,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; } @@ -326,6 +334,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: @@ -584,28 +598,36 @@ ppp_comp_wput(q, mp) default: putnext(q, mp); } + + return 0; } static int ppp_comp_wsrv(q) queue_t *q; { - mblk_t *mp, *cmp = NULL, *np; + mblk_t *mp, *cmp = NULL; comp_state_t *cp; int len, proto, type, hlen, code; struct ip *ip; 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)) { -#endif PRIOQ + if (!canputnext(q)) +#endif /* PRIOQ */ + { putbq(q, mp); - return; + break; } /* @@ -680,7 +702,7 @@ ppp_comp_wsrv(q) if (cmp != NULL) { #ifdef PRIOQ cmp->b_band=mp->b_band; -#endif PRIOQ +#endif /* PRIOQ */ freemsg(mp); mp = cmp; } @@ -705,6 +727,8 @@ ppp_comp_wsrv(q) cp->stats.ppp_obytes += msgdsize(mp); putnext(q, mp); } + + return 0; } static int @@ -717,6 +741,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: @@ -755,6 +785,8 @@ ppp_comp_rput(q, mp) default: putnext(q, mp); } + + return 0; } static int @@ -769,11 +801,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); @@ -995,6 +1032,8 @@ ppp_comp_rsrv(q) cp->stats.ppp_ierrors++; putctl1(q->q_next, M_CTL, PPPCTL_IERROR); } + + return 0; } /*