Relay-Version: version B 2.10 5/3/83; site utzoo.UUCP
Path: utzoo!mnetor!uunet!seismo!gatech!hao!boulder!forys
From: forys@sigi.Colorado.EDU (Jeff Forys)
Newsgroups: comp.unix.wizards
Subject: Re: 4.3 BSD networking
Message-ID: <1652@sigi.Colorado.EDU>
Date: Mon, 27-Jul-87 14:26:54 EDT
Article-I.D.: sigi.1652
Posted: Mon Jul 27 14:26:54 1987
Date-Received: Tue, 28-Jul-87 05:27:02 EDT
References: <8479@brl-adm.ARPA>
Reply-To: forys@boulder.Colorado.EDU (Jeff Forys)
Distribution: world
Organization: University of Colorado, Boulder
Lines: 54
Summary: You may have gone too far...

In article <8479@brl-adm.ARPA> cpw%sneezy@LANL.GOV (C. Philip Wood) writes:
> if you throw in rude hosts with broken network implementions, sending
> junk, the result used to be:
>
>	panic: out of mbufs: map full

I had the same problem here.  Our 4.3BSD 11/785 would run out of mbufs
and crash at *least* once a week.  We've now gone over 20 days without
a crash so I'm betting the problem is no more...

> I am hoping for some discussion, pointers to other discussions, fixes,
> etc., on buffering, congestion control, garbage collection [...]

I spoke with Mike Karels about the problem.  He directed me to a couple
fixes Dave Borman (dab@umn-rei.uc.arpa) added to UNICOS (Cray UNIX).
He had advertised the fixes on the tcp-ip mailing list and they can be
easily ported to a BSD system.

> the exhaustion of the page map happened after all mbufs had been put
> on one queue or another.

Right.  I too, had assumed a leak when this first started happening (when
we put up 4.3BSD in January) but soon discovered this was not the case.

> [...] Each mbuf had one character in it.  With a receive window of 4K
> you can run out of mbufs pretty easy.

Uh huh, by any chance, are these running Wollongong TCP/IP?  After closer
examination, I discovered that's where our `problem' packets were comming
from.  Anyways, what you want to do here is compact the TCP reassembly
queues (i.e. take all the 1 byte packets and merge them together).

> [...] sending lots of udp packets of trash over an ethernet and
> swamping the udp queue.

While I have not experienced crashing due to being "swamped" (in fact,
our deuna would drop the packets before UDP ever sees them), the other
fix from Dave asks the protocols to free up mbufs when they run out.
This also takes care of the case where some brain-damaged machine sends
you every *other* packet.  Freeing things in tcp-reassembly queues doesnt
make me "happy", but since no acknowledgments for the stuff have gone
out, it's "safe".  Besides, what else can you do?  It's an unpleasant
situation...

This second fix has explicitly *not* been tested, but it looks like it
does the "right thing" (I should throw a log() message in there to see
if it's been used yet).  At any rate, besides the couple fixes to get
Dave's mods working under BSD, I also ifdef'd them so either or both
could be `activated' in the kernel config file.  I added his name to
the mods so I suppose I could be persuaded to pass them out if you dont
wanna fix them for BSD yourself.
---
Jeff Forys @ UC/Boulder Engineering Research Comp Cntr (303-492-4991)
forys@Boulder.Colorado.EDU  -or-  ..!{hao|nbires}!boulder!forys