Date: Thu, 20 Jun 1996 12:46:19 -0600 From: Nate Williams <nate@sri.MT.net> To: grog@lemis.de (Greg Lehey) Cc: hackers@freebsd.org (FreeBSD Hackers), davidg@FreeBS.org Subject: Re: IP question: who should return ENOBUFS? Message-ID: <199606201846.MAA10546@rocky.sri.MT.net> In-Reply-To: <199606201803.UAA19421@allegro.lemis.de> References: <199606201803.UAA19421@allegro.lemis.de>
next in thread | previous in thread | raw e-mail | index | archive | help
I Cc'd David on this since I'm not sure he reads hackers, and he's responsible for the piece of code in question. > 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 .... . 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? Here's the log messages when David made the change. ---------------------------- revision 1.3 date: 1994/08/01 12:01:45; author: davidg; state: Exp; lines: +10 -0 fixed bug where large amounts of unidirectional UDP traffic would fill the interface output queue and further udp packets would be fragmented and only partially sent - keeping the output queue full and jamming the network, but not actually getting any real work done (because you can't send just 'part' of a udp packet - if you fragment it, you must send the whole thing). The fix involves adding a check to make sure that the output queue has sufficient space for all of the fragments. Nate
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?199606201846.MAA10546>