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

Lint
Lint OK
Unit
No Unit Test Coverage
Build Status
Buildable 33581
Build 30833: arc lint + arc unit

Event Timeline

This revision is now accepted and ready to land.Oct 8 2020, 1:03 PM
guest-ccui added inline comments.
sys/netinet/tcp_sack.c
790

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.