Page MenuHomeFreeBSD

tcp: include RFC6675 IsLost() in pipe calculation
ClosedPublic

Authored by rscheff on Mar 28 2023, 11:12 PM.
Tags
None
Referenced Files
Unknown Object (File)
Thu, Apr 25, 10:19 PM
Unknown Object (File)
Sun, Apr 7, 10:53 PM
Unknown Object (File)
Sat, Apr 6, 7:58 PM
Unknown Object (File)
Fri, Apr 5, 8:17 PM
Unknown Object (File)
Apr 5 2024, 11:09 AM
Unknown Object (File)
Apr 5 2024, 8:43 AM
Unknown Object (File)
Apr 4 2024, 1:09 PM
Unknown Object (File)
Mar 27 2024, 12:49 AM
Subscribers

Details

Summary

RFC6675 allows for a less conservative estimate of
the pipe size (data presumed still in flight and not
lost). Basically, when the SACK scoreboard indicates
that at least (DupThresh-1)*SMSS + 1 bytes were
received by the client, or DupThresh number of SACK
blocks beyond had been returned, it is reasonable
to assume this byte to have been lost by the network.

Together with PRR (RFC6972) this allows a sender to
retransmit presumed lost packets faster, and loss
recovery to complete earlier.

This implementation first tracks all the unacknowledged
bytes in the SACK scoreboard, by accounting any change
during the regular scoreboard updating.

When traversing the scoreboard for right to left to
update it with any received new SACK blocks, the
number of discontinous holes, as well as the bytes
in between holes and holes themselves are summed up.

Once the required threshold of positively sacked
bytes, or discontinous sack ranges is reached, the
remaining holes in the scoreboard are declared lost
for the purpoes of calculating pipe.

All that additional accounting happens during normal
SACK scoreboard updates - at most, DupThesh-1 additional
holes have to be processed.

Diff Detail

Repository
rG FreeBSD src repository
Lint
Lint Not Applicable
Unit
Tests Not Applicable

Event Timeline

validate that new pipe calc is gated by sysctl (to retain classical non-6675 pipe calculation if need be)

  • combine assignment and if check

tcp_compute_pipe is always controlled by mostly V_tcp_do_newsack in the output path and CC modules, and V_tcp_do_newcwv in the input path for deciding if the session is cwnd limited or not. New cwnd validation is disabled by default, newsack (formerly rfc6675_pipe) is enabled by default.

Without the improved Pipe calculation, PRR can not deliver the expected results (in high loss-fraction fast recovery scenarios).

tcp_compute_pipe is always controlled by mostly V_tcp_do_newsack in the output path and CC modules, and V_tcp_do_newcwv in the input path for deciding if the session is cwnd limited or not. New cwnd validation is disabled by default, newsack (formerly rfc6675_pipe) is enabled by default.

Without the improved Pipe calculation, PRR can not deliver the expected results (in high loss-fraction fast recovery scenarios).

Thanks for the update and test tip. Will show some initial test result soon.

Offline discussion includes packetdrill tests from Richard and my Emulab dumbbell testbed tests. I found it hard to attach my Emulab test result here. But this patch looks good to me.

This revision is now accepted and ready to land.Apr 21 2023, 4:53 PM
This revision now requires review to proceed.Jul 23 2023, 4:43 PM

Renew my approval after the re-base.

This revision is now accepted and ready to land.Aug 24 2023, 9:21 PM