[net.bugs.4bsd] Loss of RFNM

clyde@ut-ngp.UTEXAS (Clyde W. Hoover) (10/11/85)

Subject: Loss of RFNMs on ARPAnet hosts
Index:	/sys/netimp/if_imp.h 4.2BSD

NOTE:	This is **not applicable** unless the modifications from Chris Kent
	(cak@purdue.ARPA, posted 21 March 1984) have been made to
	/sys/netinet/tcp_output.c.  These modifications advertise a
	maximum TCP segment size that is tuned per network interface.

Description:
	Connections to certain hosts on the ARPAnet will start failing with
	"out of buffer space" messages.  Doing a 'netstat -h' shows
	that the host (or the gateway to it) has a RFNM count of 8.

	The RFNM count never drops below 8 and so the network path is
	unusable until the system is rebooted.

	The problem lies in the LH/DH-11 IMP interface.
	Sometimes, most likely always, it will not set the <END OF MESSAGE>
	flag in the control & status register if the input buffer is filled  
	at the same time that <LAST BIT SIGNAL> from the 
	IMP comes up.

	This causes the LH/DH driver to append the next 
	incoming message from the IMP to the the previous message.
	This process (appending of messages) will continue until
	a message SHORTER then the input buffer size is sent --
	a RFNM response does nicely.

	This results in the LOSS of the succeeding messages (e.g. RFNMs)
	since the 1822 protocol handling code expects to get only
	<ONE> message from the LH/DH at a time.

	This problem happens when the IMP MTU is advertised as the TCP
	maximum segment size (as is done by the TCP changes from cak@purdue).
	This allows an incoming message to be 1006 + 12 bytes long, which
	equals the size of the 1018 byte input buffer in
	the IMP (I believe) and so exercises the bug in the LH/DH.

Fix:
	/sys/netimp/if_imp.h:
/*
 * When IMPMTU based on 8159 is advertised as the TCP maximum
 * segment size, it exercises a bug in the LH/DH-11 that causes small
 * messages (e.g. RFNMs) to be dropped.  So we just arbitrarily
 * shrink this number until it falls below the bug threshold.
 * #define      IMPMTU          ((8159 / NBBY) & ~01)
 *                                ^^^^
 */
#define IMPMTU          ((8000 / NBBY) & ~01)

	As long as all incoming messages are less than or
	equal to  576 + 12 bytes long. Since 576 + 12 bytes is less
	then 1018 bytes, the size of the input driver buffer,
	the end of message flag in the control&status 
	register is always set correctly.

-- 
Shouter-To-Dead-Parrots @ Univ. of Texas Computation Center; Austin, Texas  

"All life is a blur of Republicans and meat." -Zippy the Pinhead

	clyde@ngp.UTEXAS.EDU, clyde@sally.UTEXAS.EDU
	...!ihnp4!ut-ngp!clyde, ...!allegra!ut-ngp!clyde

ron@brl-sem.ARPA (Ron Natalie <ron>) (10/12/85)

> Subject: Loss of RFNMs on ARPAnet hosts
> Index:	/sys/netimp/if_imp.h 4.2BSD
> 
> /*
>  * When IMPMTU based on 8159 is advertised as the TCP maximum
>  * segment size, it exercises a bug in the LH/DH-11 that causes small
>  * messages (e.g. RFNMs) to be dropped.  So we just arbitrarily
>  * shrink this number until it falls below the bug threshold.
>  * #define      IMPMTU          ((8159 / NBBY) & ~01)
>  *                                ^^^^
>  */
> #define IMPMTU          ((8000 / NBBY) & ~01)
> 
This BUG fix, while it will work, is WRONG.  Reading carefully you
will find that the EOM bit may not be set on the 8159/NBBY byte.
You should set the input DMA to IMPMTU+2 to avoid this problem.

-Ron