🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

1 total messages Started by Steven M. Schultz(Y) Thu, 29 Jun 1989 05:44
TIME_WAIT sockets clog system (part 1)
#5
Author: Steven M. Schultz(Y)
Date: Thu, 29 Jun 1989 05:44
62 lines
2389 bytes
Subject: TIME_WAIT sockets clog system (part 1)
Index:	sys/netinet/tcp_subr.c 2.10BSD

Description:
	Sockets in a TIME_WAIT state can constipate the networking
	buffer memory when generated in rapid succession by, for
	example, an "mget" in an ftp session.  If more than a dozen
	or so small files are transferred in rapid succession over
	an ethernet, all the mbufs in the system will be taken up
	by sockets in a TIME_WAIT state (from the socket opened for
	each data transfer).

Repeat-By:
	ftp in to a 2.10.1BSD system, do an "mget *" in a largish
	directory.  note that the transfer will hang/develope problems
	after about a dozen to twenty files.  the 2.10.1BSD system
	has run out of mbufs and will recover in a minute or so (hopefully).

Fix:
	Apply this patch to netinet/tcp_subr.c, this fix implements
	a tcp_drain() function that actually does something (the 
	original 4.3BSD tcp_drain() was a null function).  The other
	half of this fix will follow shortly and consists of a small
	modification to uipc_mbuf to invoke the drain routine at the
	appropriate time.

	The comment in the function pretty much sums the situation up.

*** tcp_subr.c.old	Thu Apr 28 16:22:56 1988
--- tcp_subr.c	Fri Jun  9 13:57:29 1989
***************
*** 251,257 ****
--- 251,279 ----
  
  tcp_drain()
  {
+ 	register struct inpcb *ip, *ipnxt;
+ 	register struct tcpcb *tp;
+ 	int s = splimp();
  
+ 	/*
+ 	 * Search through tcb's and look for TIME_WAIT states to liberate,
+ 	 * these are due to go away soon anyhow and we're short of space or
+  	 * we wouldn't be here...
+ 	 */
+ 	ip = tcb.inp_next;
+ 	if (ip == 0) {
+ 		splx(s);
+ 		return;
+ 	}
+ 	for (; ip != &tcb; ip = ipnxt) {
+ 		ipnxt = ip->inp_next;
+ 		tp = intotcpcb(ip);
+ 		if (tp == 0)
+ 			continue;
+ 		if (tp->t_state == TCPS_TIME_WAIT)
+ 			tcp_close(tp);
+ 	}
+ 	splx(s);
  }
  
  /*
Thread Navigation

This is a paginated view of messages in the thread with full content displayed inline.

Messages are displayed in chronological order, with the original post highlighted in green.

Use pagination controls to navigate through all messages in large threads.

Back to All Threads