ppp problems

Matthew Dillon dillon at apollo.backplane.com
Fri Oct 15 21:02:08 PDT 2004


    I believe I have fixed the pppd infinite loop problem.

    It turns out that some of the network protocol stack work we did caused
    a tty placeholder token function to be called incorrectly, resulting in
    the tty code believing that there was data pending (hence pppd's select()
    would return instantly) even though there was in fact no data pending
    in the ppp line discipline's packet queue.

    I have committed the patch and slipped the DragonFly_Stable tag.  The
    patch is included below.

						-Matt

Index: if_ppp.c
===================================================================
RCS file: /cvs/src/sys/net/ppp/if_ppp.c,v
retrieving revision 1.20
retrieving revision 1.21
diff -u -r1.20 -r1.21
--- if_ppp.c	16 Sep 2004 04:39:30 -0000	1.20
+++ if_ppp.c	16 Oct 2004 03:58:52 -0000	1.21
@@ -70,7 +70,7 @@
  */
 
 /* $FreeBSD: src/sys/net/if_ppp.c,v 1.67.2.4 2002/04/14 21:41:48 luigi Exp $ */
-/* $DragonFly: src/sys/net/ppp/if_ppp.c,v 1.20 2004/09/16 04:39:30 dillon Exp $ */
+/* $DragonFly: src/sys/net/ppp/if_ppp.c,v 1.21 2004/10/16 03:58:52 dillon Exp $ */
 /* from if_sl.c,v 1.11 84/10/04 12:54:47 rick Exp */
 /* from NetBSD: if_ppp.c,v 1.15.2.2 1994/07/28 05:17:58 cgd Exp */
 
@@ -1503,10 +1503,18 @@
 	break;
     }
 
-    if (isr == -1)
+    /*
+     * If we found a netproto just pass it to the proto.  Otherwise queue
+     * the packet to the tty (e.g. pppd).  Note that sc_ctlp() must be
+     * called EXACTLY once per packet queued.
+     */
+    if (isr == -1) {
 	rv = IF_HANDOFF(&sc->sc_inq, m, NULL);
-    else
+	if (rv)
+	    (*sc->sc_ctlp)(sc);
+    } else {
 	rv = (netisr_queue(isr, m) == 0);
+    }
     if (!rv) {
 	if (sc->sc_flags & SC_DEBUG)
 	    printf("%s: input queue full\n", ifp->if_xname);
@@ -1518,9 +1526,6 @@
     ifp->if_ibytes += ilen;
     getmicrotime(&ifp->if_lastchange);
 
-    if (rv)
-	(*sc->sc_ctlp)(sc);
-
     return;
 
  bad:





More information about the Bugs mailing list