Date: Thu, 20 Jun 1996 20:03:32 +0200 (MET DST) From: grog@lemis.de (Greg Lehey) To: hackers@freebsd.org (FreeBSD Hackers) Subject: IP question: who should return ENOBUFS? Message-ID: <199606201803.UAA19421@allegro.lemis.de>
next in thread | raw e-mail | index | archive | help
I've just spent a fair amount of time trying to figure out why our
ISDN software jams up if it can't establish a connection. The
symptoms are that if you can't establish a connection before a certain
number of packets have been sent, the whole interface just returns:
=== root@freebie (/dev/ttyp0) /sys/netinet 11 -> ping 192.109.197.38
PING 192.109.197.38 (192.109.197.38): 56 data bytes
ping: sendto: No buffer space available
ping: wrote 192.109.197.38 64 chars, ret=-1
ping: sendto: No buffer space available
I found this strange, since in the interface code (b_isdnipi.c, line
474) we have the code:
if (IF_QFULL(&ifp->if_snd))
{
if (ifp->if_flags & IFF_RUNNING)
isdn_output(sc->sc_appl);
IF_DROP(&ifp->if_snd);
m_freem(m);
splx(x);
ifp->if_oerrors++;
return (ENOBUFS);
}
This will drop the first packet *and* not enqueue the last if the
queue is full. So I set a breakpoint on the IF_DROP, and hey! nothing
happened. After a bit more investigation, I found this code in
ip_output.c:
/*
* Verify that we have any chance at all of being able to queue
* the packet or packet fragments
*/
if ((ifp->if_snd.ifq_len + ip->ip_len / ifp->if_mtu + 1) >=
ifp->if_snd.ifq_maxlen) {
error = ENOBUFS;
goto bad;
}
I think this is bogus. It's not present in the BSD/OS version, so I
assume it was added in FreeBSD. The problem is, it gives you no
possibility of recovery: the queue is full and stays that way. Can
anybody give me an idea of why it's there, when the interface is
perfectly capable of looking after itself?
Greg
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?199606201803.UAA19421>
