Page MenuHomeFreeBSD

Stop sending tiny new data segments during SACK recovery
ClosedPublic

Authored by rscheff on Sep 15 2020, 8:46 PM.

Details

Summary

When processing a partial acknowledgment during SACK
loss recovery, the size of the TCP option (in particular,
the timestamp option) was not considered properly.

This would restict the amount of new data to be injected,
but also could lead to the transmission of segments with
little data (a multiple of 12 bytes).

Considering the currently in-use TCP options when
calculating the amount of new data to be injected will
address this issue.

Reported-by: Liang Tian

Test Plan

Establish a TCP session with both SACK and Timestamps
enabled (the vast majority of all sessions in use today).

Simulate two or more non-consecutive packet drops within
a window and validate that new data is no longer injected
with very small segments, provided that the send buffer
is sufficiently full.

Diff Detail

Repository
rS FreeBSD src repository - subversion
Lint
Automatic diff as part of commit; lint not applicable.
Unit
Automatic diff as part of commit; unit tests not applicable.

Event Timeline

This revision is now accepted and ready to land.Oct 8 2020, 1:03 PM
chengc_netapp.com added inline comments.
sys/netinet/tcp_sack.c
790 ↗(On Diff #77076)

Better use the type u_int for maxseg.

This revision now requires changes to proceed.Oct 8 2020, 3:13 PM
  • make maxseg u_int,
  • fix tcpstat accounting for sack,
  • remove redundant conditional check
This revision was not accepted when it landed; it landed in state Needs Review.Oct 9 2020, 12:45 PM
This revision was automatically updated to reflect the committed changes.