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