Merge in 1.3 and post 1.3 fixes; some of them might be applicable to
authorChristos Zoulas <christos@zoulas.com>
Wed, 2 Sep 1998 21:19:45 +0000 (21:19 +0000)
committerChristos Zoulas <christos@zoulas.com>
Wed, 2 Sep 1998 21:19:45 +0000 (21:19 +0000)
other ppp ports.

- XXX: we don't check for the exact version of new features added, so
  this might not compile for all post 1.3 versions. It should be trivial
  to fix.

- ppp can delay the last packet so check:
    && (sc->sc_if.if_snd.ifq_head || sc->sc_fastq.ifq_head
|| sc->sc_outm)) {
  instead of just:
    && (sc->sc_if.if_snd.ifq_head || sc->sc_fastq.ifq_head)) {

- glue in ipflow fast forwarding.

- Only run pppasyncstart (sc->sc_start) from the netisr handler.
  This allows pppoutput to be called from splimp (e.g., when ipflow is
  in use.) without requiring pppasyncstart to run at splimp.

- defopt INET, NETATALK

- Remove force argument to pppstart; it is not necessary anymore.

netbsd-1.2/if_ppp.c
netbsd-1.2/ppp_tty.c

index cede49b4b4ba18688eb09e9626237a2ee26ff2fe..34c0cd1ebc3f04158d515e139f82bb0725cfbe20 100644 (file)
@@ -1,5 +1,5 @@
-/*     $NetBSD: if_ppp.c,v 1.41 1998/05/02 14:34:24 christos 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>
@@ -471,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);
            }
@@ -771,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;
@@ -788,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++;
@@ -805,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)
@@ -882,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;
 
@@ -1014,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);
@@ -1416,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;
index 3ddbf468f7a08323ac94bcc7b9e2d3900862bb84..3cc267a2a546b8173a875433c39a7d8965f7625a 100644 (file)
@@ -1,5 +1,5 @@
-/*     $NetBSD: ppp_tty.c,v 1.13 1997/03/25 22:33:25 christos Exp $    */
-/*     Id: ppp_tty.c,v 1.3 1996/07/01 01:04:11 paulus Exp      */
+/*     $NetBSD: ppp_tty.c,v 1.14 1998/08/02 15:09:50 sommerfe Exp $    */
+/*     $Id: ppp_tty.c,v 1.3 1998/09/02 21:19:45 christos Exp $ */
 
 /*
  * ppp_tty.c - Point-to-Point Protocol (PPP) driver for asynchronous
@@ -119,7 +119,7 @@ int pppwrite __P((struct tty *tp, struct uio *uio, int flag));
 int    ppptioctl __P((struct tty *tp, u_long cmd, caddr_t data, int flag,
                       struct proc *));
 int    pppinput __P((int c, struct tty *tp));
-int    pppstart __P((struct tty *tp, int));
+int    pppstart __P((struct tty *tp));
 
 static u_int16_t pppfcs __P((u_int16_t fcs, u_char *cp, int len));
 static void    pppasyncstart __P((struct ppp_softc *));
@@ -664,7 +664,7 @@ pppasyncstart(sc)
 
     /* Call pppstart to start output again if necessary. */
     s = spltty();
-    pppstart(tp, 0);
+    pppstart(tp);
 
     /*
      * This timeout is needed for operation on a pseudo-tty,
@@ -705,9 +705,8 @@ pppasyncctlp(sc)
  * Called at spltty or higher.
  */
 int
-pppstart(tp, force)
+pppstart(tp)
     register struct tty *tp;
-    int force;
 {
     register struct ppp_softc *sc = (struct ppp_softc *) tp->t_sc;
 
@@ -723,7 +722,8 @@ pppstart(tp, force)
      * or been disconnected from the ppp unit, then tell if_ppp.c that
      * we need more output.
      */
-    if (CCOUNT(&tp->t_outq) >= PPP_LOWAT && !force)
+    if ((CCOUNT(&tp->t_outq) >= PPP_LOWAT)
+       && ((sc == NULL) || (sc->sc_flags & SC_TIMEOUT)))
        return 0;
     if (!((tp->t_state & TS_CARR_ON) == 0 && (tp->t_cflag & CLOCAL) == 0)
        && sc != NULL && tp == (struct tty *) sc->sc_devp) {
@@ -746,7 +746,7 @@ ppp_timeout(x)
 
     s = spltty();
     sc->sc_flags &= ~SC_TIMEOUT;
-    pppstart(tp, 1);
+    pppstart(tp);
     splx(s);
 }