]> git.ozlabs.org Git - ppp.git/blobdiff - netbsd-1.2/if_ppp.c
Add extra baud rates >= 1Mbaud.
[ppp.git] / netbsd-1.2 / if_ppp.c
index cede49b4b4ba18688eb09e9626237a2ee26ff2fe..88efa84ba7f24c640e0489d208114fd8a6efcb05 100644 (file)
@@ -1,23 +1,46 @@
-/*     $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.6 2002/12/06 12:03:44 paulus Exp $    */
 
 /*
  * if_ppp.c - Point-to-Point Protocol (PPP) Asynchronous driver.
  *
- * Copyright (c) 1989 Carnegie Mellon University.
- * All rights reserved.
+ * Copyright (c) 1984-2000 Carnegie Mellon University. All rights reserved.
  *
- * Redistribution and use in source and binary forms are permitted
- * provided that the above copyright notice and this paragraph are
- * duplicated in all such forms and that any documentation,
- * advertising materials, and other materials related to such
- * distribution and use acknowledge that the software was developed
- * by Carnegie Mellon University.  The name of the
- * University may not be used to endorse or promote products derived
- * from this software without specific prior written permission.
- * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
- * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
- * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ *
+ * 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.
+ *
+ * 3. The name "Carnegie Mellon University" must not be used to
+ *    endorse or promote products derived from this software without
+ *    prior written permission. For permission or any legal
+ *    details, please contact
+ *      Office of Technology Transfer
+ *      Carnegie Mellon University
+ *      5000 Forbes Avenue
+ *      Pittsburgh, PA  15213-3890
+ *      (412) 268-4387, fax: (412) 268-7395
+ *      tech-transfer@andrew.cmu.edu
+ *
+ * 4. Redistributions of any form whatsoever must retain the following
+ *    acknowledgment:
+ *    "This product includes software developed by Computing Services
+ *     at Carnegie Mellon University (http://www.cmu.edu/computing/)."
+ *
+ * CARNEGIE MELLON UNIVERSITY DISCLAIMS ALL WARRANTIES WITH REGARD TO
+ * THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
+ * AND FITNESS, IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY 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.
  *
  * Drew D. Perkins
  * Carnegie Mellon University
 #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 +500,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 +800,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 +817,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 +834,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 +911,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 +1047,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 +1450,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;