Bug #13475

Updated by Marcel Telka about 1 year ago

 * tcp connection was closed 
 * there is more than one mss unsent 
 * LSO is enabled 

 In tcp_send() the calculation of bytes to send is done under the assumption that LSO will be used. A value higher than mss is set for lso_usable. Later this 'if' is taken, because we are at the end of the data stream: 

		 if (tcp->tcp_valid_bits != 0 && 
		     (tcp->tcp_valid_bits != TCP_FSS_VALID || 
		     ((*snxt + len) == tcp->tcp_fss))) { 

 This causes data with len > mss being sent without LSO setup and due to this with IP fragmentation. Beside the general wish to avoid IP fragmentation this conflicted with IP filter: The additional fragments were dropped and retransmission occurred. segmentation. 

 I can imagine two fixes: 

 * the easy one: don't do LSO if any of the VALID bits is set 
 * more complicated: with TCP_FSS_VALID don't send the complete unsent data with LSO but leave data <=mss for the next loop, which will then automaticaly be without LSO