Subject: Re: altq 3.0 and pppd ? ( log vs queue )
To: None <>
From: Kenjiro Cho <>
List: tech-net
Date: 01/23/2002 11:17:35
Content-Type: Text/Plain; charset=us-ascii
Content-Transfer-Encoding: 7bit

It turns out that the problem is caused by a simple merge mistake
when I back-ported if_ppp.c from KAME.

In KAME (and NetBSD-current),
   (1) "#include "opt_inet.h"" is moved upwards.
   (2) "#define VJC" is moved in "#ifdef INET".
I missed (1) and merged only (2).

Its result is pretty nasty:
The size of "struct ppp_softc" doesn't agree in if_ppp.c and ppp_tty.c
since part of the fields are in "#ifdef VJC".
pppasyncstart() sees sc_outm to be zero but pppintr() always evaluates
the same field to be non-zero, which leads to an infinite loop!

This only happens on altq-3.0 for NetBSD-1.5.2.  (KAME and
NetBSD-current are ok.)
The first patch attached fixes this.

To use ALTQ on kernel ppp, you also need the second patch for
ppp_tty.c in addition to the previous patch I posted.  This prevents
pppintr() from looping under rate-limiting.


> I finally set up pppd between 2 NetBSD-1.5.2/i386 using a cross serial
> cable.  I was able to reproduce a problem but the sympton isn't the
> same.
> An ALTQ patched kernel hungs up when pppd starts, apparently just
> after the first packet arrives.
> It is strange that a KAME kernel which has almost identical ALTQ code
> works fine.
> 	OK	stock GENERIC
> 	NG	GENERIC with altq-3.0 patch applied
> 	OK	GENERIC.KAME from a KAME snap
> For the NG case, I can break into DDB by Alt-Ctrl-ESC and the trace
> command shows it was in Xspllower() from pppintr().  Apparently, the
> kernel loops in Xspllower().
> I don't think ALTQ changes any interrupt handling but I'll take a
> closer look tomorrow.
> Does anyone have an idea about what's going on?
> -Kenjiro

Content-Type: Text/Plain; charset=us-ascii
Content-Transfer-Encoding: 7bit
Content-Disposition: inline; filename="if_ppp.c.diff2"

--- if_ppp.c.old	Tue Jan 22 17:53:46 2002
+++ if_ppp.c	Tue Jan 22 20:15:37 2002
@@ -78,14 +78,14 @@
 #include "ppp.h"
 #if NPPP > 0
+#include "opt_inet.h"
+#include "opt_gateway.h"
+#include "opt_ppp.h"
 #ifdef INET
 #define VJC
-#include "opt_inet.h"
-#include "opt_gateway.h"
-#include "opt_ppp.h"
 #include <sys/param.h>
 #include <sys/proc.h>

Content-Type: Text/Plain; charset=us-ascii
Content-Transfer-Encoding: 7bit
Content-Disposition: inline; filename="ppp_tty.c.diff"

--- ppp_tty.c-	Wed Jan 23 11:09:46 2002
+++ ppp_tty.c	Wed Jan 23 11:08:40 2002
@@ -894,6 +894,15 @@
     if ((CCOUNT(&tp->t_outq) >= PPP_LOWAT)
 	&& ((sc == NULL) || (sc->sc_flags & SC_TIMEOUT)))
 	return 0;
+#ifdef ALTQ
+    /*
+     * if ALTQ is enabled, don't invoke NETISR_PPP.
+     * pppintr() could loop without doing anything useful
+     * under rate-limiting.
+     */
+    if (ALTQ_IS_ENABLED(&sc->sc_if.if_snd))
+	return 0;
     if (!((tp->t_state & TS_CARR_ON) == 0 && (tp->t_cflag & CLOCAL) == 0)
 	&& sc != NULL && tp == (struct tty *) sc->sc_devp) {