]> git.ozlabs.org Git - ppp.git/blobdiff - netbsd-1.2/if_ppp.c
MP-related code should be wrapped within HAVE_MULTILINK pre-processor
[ppp.git] / netbsd-1.2 / if_ppp.c
index 58b000607a3f3b32b3a9a2910286cdad823bd9e3..34c0cd1ebc3f04158d515e139f82bb0725cfbe20 100644 (file)
@@ -1,5 +1,5 @@
-/*     $NetBSD: if_ppp.c,v 1.36 1997/03/04 21:40:07 mycroft Exp $      */
-/*     Id: if_ppp.c,v 1.6 1997/03/04 03:33:00 paulus Exp       */
+/*     $NetBSD: if_ppp.c,v 1.46 1998/08/02 15:09:50 sommerfe Exp $     */
+/*     $Id: if_ppp.c,v 1.5 1998/09/02 21:19:44 christos Exp $  */
 
 /*
  * if_ppp.c - Point-to-Point Protocol (PPP) Asynchronous driver.
 #define PPP_COMPRESS
 
 #include <sys/param.h>
+
+#ifdef __NetBSD_Version__      /* Post 1.3 */
+#include "opt_inet.h"
+#include "opt_gateway.h"
+#endif
+
 #include <sys/proc.h>
 #include <sys/mbuf.h>
 #include <sys/socket.h>
 #include <net/bpf.h>
 #endif
 
-#if INET
+#ifdef INET
 #include <netinet/in.h>
 #include <netinet/in_systm.h>
 #include <netinet/in_var.h>
@@ -161,7 +167,7 @@ static void pppdumpm __P((struct mbuf *m0));
  */
 
 extern struct compressor ppp_bsd_compress;
-extern struct compressor ppp_deflate;
+extern struct compressor ppp_deflate, ppp_deflate_draft;
 
 struct compressor *ppp_compressors[8] = {
 #if DO_BSD_COMPRESS && defined(PPP_BSDCOMP)
@@ -169,6 +175,7 @@ struct compressor *ppp_compressors[8] = {
 #endif
 #if DO_DEFLATE && defined(PPP_DEFLATE)
     &ppp_deflate,
+    &ppp_deflate_draft,
 #endif
     NULL
 };
@@ -234,7 +241,7 @@ pppalloc(pid)
     MALLOC(sc->sc_comp, struct slcompress *, sizeof(struct slcompress),
           M_DEVBUF, M_NOWAIT);
     if (sc->sc_comp)
-       sl_compress_init(sc->sc_comp, -1);
+       sl_compress_init(sc->sc_comp);
 #endif
 #ifdef PPP_COMPRESS
     sc->sc_xc_state = NULL;
@@ -383,7 +390,7 @@ pppioctl(sc, cmd, data, flag, p)
            return (error);
        if (sc->sc_comp) {
            s = splsoftnet();
-           sl_compress_init(sc->sc_comp, *(int *)data);
+           sl_compress_setup(sc->sc_comp, *(int *)data);
            splx(s);
        }
        break;
@@ -470,11 +477,11 @@ pppioctl(sc, cmd, data, flag, p)
            if ((error = suser(p->p_ucred, &p->p_acflag)) != 0)
                return (error);
            if (npi->mode != sc->sc_npmode[npx]) {
-               s = splsoftnet();
+               s = splimp();
                sc->sc_npmode[npx] = npi->mode;
                if (npi->mode != NPMODE_QUEUE) {
                    ppp_requeue(sc);
-                   (*sc->sc_start)(sc);
+                   ppp_restart(sc);
                }
                splx(s);
            }
@@ -770,7 +777,7 @@ pppoutput(ifp, m0, dst, rtp)
     /*
      * Put the packet on the appropriate queue.
      */
-    s = splsoftnet();
+    s = splimp();
     if (mode == NPMODE_QUEUE) {
        /* XXX we should limit the number of packets on this queue */
        *sc->sc_npqtail = m0;
@@ -787,7 +794,7 @@ pppoutput(ifp, m0, dst, rtp)
            goto bad;
        }
        IF_ENQUEUE(ifq, m0);
-       (*sc->sc_start)(sc);
+       ppp_restart(sc);
     }
     ifp->if_lastchange = time;
     ifp->if_opackets++;
@@ -804,7 +811,7 @@ bad:
 /*
  * After a change in the NPmode for some NP, move packets from the
  * npqueue to the send queue or the fast queue as appropriate.
- * Should be called at splsoftnet.
+ * Should be called at splimp, since we muck with the queues.
  */
 static void
 ppp_requeue(sc)
@@ -881,14 +888,18 @@ ppp_dequeue(sc)
     struct mbuf *m, *mp;
     u_char *cp;
     int address, control, protocol;
+    int s;
 
     /*
      * Grab a packet to send: first try the fast queue, then the
      * normal queue.
      */
+    s = splimp();    
     IF_DEQUEUE(&sc->sc_fastq, m);
     if (m == NULL)
        IF_DEQUEUE(&sc->sc_if.if_snd, m);
+    splx(s);
+    
     if (m == NULL)
        return NULL;
 
@@ -1013,7 +1024,8 @@ pppintr()
     s = splsoftnet();
     for (i = 0; i < NPPP; ++i, ++sc) {
        if (!(sc->sc_flags & SC_TBUSY)
-           && (sc->sc_if.if_snd.ifq_head || sc->sc_fastq.ifq_head)) {
+           && (sc->sc_if.if_snd.ifq_head || sc->sc_fastq.ifq_head
+               || sc->sc_outm)) {
            s2 = splimp();
            sc->sc_flags |= SC_TBUSY;
            splx(s2);
@@ -1415,6 +1427,12 @@ ppp_inproc(sc, m)
        m->m_pkthdr.len -= PPP_HDRLEN;
        m->m_data += PPP_HDRLEN;
        m->m_len -= PPP_HDRLEN;
+#ifdef __NetBSD_Version__
+#ifdef GATEWAY
+       if (ipflow_fastforward(m))
+               return;
+#endif
+#endif
        schednetisr(NETISR_IP);
        inq = &ipintrq;
        break;