Page MenuHomeFreeBSD

Add PRR 6937bis heuristic and remove prr_conservative sysctl
ClosedPublic

Authored by rscheff on Feb 21 2021, 12:43 AM.
Tags
None
Referenced Files
Unknown Object (File)
Fri, Mar 22, 1:48 AM
Unknown Object (File)
Tue, Mar 19, 2:59 AM
Unknown Object (File)
Tue, Mar 12, 4:52 AM
Unknown Object (File)
Tue, Mar 12, 3:50 AM
Unknown Object (File)
Tue, Mar 5, 2:24 AM
Unknown Object (File)
Feb 11 2024, 7:40 AM
Unknown Object (File)
Feb 8 2024, 12:09 PM
Unknown Object (File)
Feb 4 2024, 12:12 AM

Details

Summary

Proportional Rate Reduction (RFC6937) is in the process
of becoming a standard. The difference to the experimental
RFC is a heuristic, which automatically chooses between
CRB and SSRB schema. Only when snd_una advances (a partial
ACK), SSRB may be used. Also, that ACK must not have
any indication of ongoing loss - using the addition of
new holes into the scoreboard as proxy for such an
event.

Now based off D29441.

MFC after: 2 weeks

Diff Detail

Repository
rG FreeBSD src repository
Lint
Lint Passed
Unit
No Test Coverage
Build Status
Buildable 49335
Build 46225: arc lint + arc unit

Event Timeline

This revision is now accepted and ready to land.Feb 25 2021, 6:23 PM

The code above is my current understanding of the 6927bis draft. Note that this will make PRR loss recovery slightly less aggressive especially under heavy loss.

Also, this change probably doesn't change much in the pathological instance discueed in the draft, as the base stack has no capability at the moment, to retransmit lost retransmissions, and will instead run into an RTO and slow-start thereafter.

This revision now requires review to proceed.Feb 25 2021, 7:16 PM
rscheff added a reviewer: cc.
  • use PRR-SSRB and PRR-CRB per -bis heuristic
  • update comment to include ACK split attack

no magic numbers in sack-changed.

  • rebase without D29441
  • make magic values human-readable
sys/netinet/tcp_var.h
307–311

Maybe make at a typedef enum? Funcion arguments will look prettier in a debugger session.

  • make the sack return status an enum for nice debugging
  • make the sack return status an enum for nice debugging

Sorry for nit-picking, but this isn't enough for the goal of seeing the string literals in the debugger. The prototype of tcp_sack_doack() needs to be changed accordingly, as well as type of variable.

typedef enum {
        SACK_NOCHANGE = 0,
        SACK_CHANGE,
        SACK_NEWLOSS
} sack_status;

sack_status  tcp_sack_doack(struct tcpcb *, struct tcpopt *, tcp_seq);

And in tcp_do_segment():

sack_status sack_changed;
  • properly define and use sackstatus_t type

Thanks Gleb! While at it, I also found that most other typedef enums use a nomenclature of a _t suffix. Also fixed up all relevant variables - haven't checked gdb to verify the proper decoding though.

  • honor proper SACK scoreboard change

Did more unit testing as promised. Found that the hardcoded CRB during dupack processing needs to be changed against the proper toggle (SACK_NEWLOSS or SACK_CHANGE) - to conform with RFC6937bis

  • exclude limited transmit segments from prr_delivered.
This revision is now accepted and ready to land.Nov 16 2023, 3:31 PM