Skip site navigation (1)Skip section navigation (2)
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>