From a25ab4af5d8ea4f1760b5db5f5ee5b65bbfcd53b Mon Sep 17 00:00:00 2001 From: Christos Zoulas Date: Wed, 2 Sep 1998 21:19:45 +0000 Subject: [PATCH] Merge in 1.3 and post 1.3 fixes; some of them might be applicable to 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 | 35 ++++++++++++++++++++++++++--------- netbsd-1.2/ppp_tty.c | 16 ++++++++-------- 2 files changed, 34 insertions(+), 17 deletions(-) diff --git a/netbsd-1.2/if_ppp.c b/netbsd-1.2/if_ppp.c index cede49b..34c0cd1 100644 --- a/netbsd-1.2/if_ppp.c +++ b/netbsd-1.2/if_ppp.c @@ -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. @@ -82,6 +82,12 @@ #define PPP_COMPRESS #include + +#ifdef __NetBSD_Version__ /* Post 1.3 */ +#include "opt_inet.h" +#include "opt_gateway.h" +#endif + #include #include #include @@ -99,7 +105,7 @@ #include #endif -#if INET +#ifdef INET #include #include #include @@ -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; diff --git a/netbsd-1.2/ppp_tty.c b/netbsd-1.2/ppp_tty.c index 3ddbf46..3cc267a 100644 --- a/netbsd-1.2/ppp_tty.c +++ b/netbsd-1.2/ppp_tty.c @@ -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); } -- 2.39.2