]> git.ozlabs.org Git - ppp.git/blobdiff - modules/ppp_comp.c
pppd: Fix variable reference syntax in Makefile.linux
[ppp.git] / modules / ppp_comp.c
index c3badd3698c54c5266a8260a8965e5507e29593e..97d13ebd3bf608b624718e60ed23566f191588e3 100644 (file)
@@ -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.8 1997/04/30 05:45:15 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
+ *     <paulus@samba.org>".
+ *
+ * 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 $
  */
 
 /*
@@ -162,7 +170,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 +179,7 @@ struct compressor *ppp_compressors[] = {
 #endif
 #if DO_DEFLATE
     &ppp_deflate,
+    &ppp_deflate_draft,
 #endif
     NULL
 };
@@ -189,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;
 }
@@ -325,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:
@@ -340,6 +355,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 +385,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 +403,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 +542,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,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;
        }
 
        /*
@@ -659,11 +698,11 @@ 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;
-#endif PRIOQ
+#endif /* PRIOQ */
                freemsg(mp);
                mp = cmp;
            }
@@ -688,6 +727,8 @@ ppp_comp_wsrv(q)
        cp->stats.ppp_obytes += msgdsize(mp);
        putnext(q, mp);
     }
+
+    return 0;
 }
 
 static int
@@ -700,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:
@@ -738,6 +785,8 @@ ppp_comp_rput(q, mp)
     default:
        putnext(q, mp);
     }
+
+    return 0;
 }
 
 static int
@@ -752,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);
@@ -978,6 +1032,8 @@ ppp_comp_rsrv(q)
        cp->stats.ppp_ierrors++;
        putctl1(q->q_next, M_CTL, PPPCTL_IERROR);
     }
+
+    return 0;
 }
 
 /*