Fast recovery ssthresh value
Liang Tian
l.tian.email at gmail.com
Sat Aug 22 22:14:06 UTC 2020
Hi all,
When 3 dupacks are received and TCP enter fast recovery, if SACK is
used, the CWND is set to maxseg:
2593 if (tp->t_flags & TF_SACK_PERMIT) {
2594 TCPSTAT_INC(
2595 tcps_sack_recovery_episode);
2596 tp->snd_recover = tp->snd_nxt;
2597 tp->snd_cwnd = maxseg;
2598 (void) tp->t_fb->tfb_tcp_output(tp);
2599 goto drop;
2600 }
Otherwise(SACK is not in use), CWND is set to maxseg before
tcp_output() and then set back to snd_ssthresh+inflation
2601 tp->snd_nxt = th->th_ack;
2602 tp->snd_cwnd = maxseg;
2603 (void) tp->t_fb->tfb_tcp_output(tp);
2604 KASSERT(tp->snd_limited <= 2,
2605 ("%s: tp->snd_limited too big",
2606 __func__));
2607 tp->snd_cwnd = tp->snd_ssthresh +
2608 maxseg *
2609 (tp->t_dupacks - tp->snd_limited);
2610 if (SEQ_GT(onxt, tp->snd_nxt))
2611 tp->snd_nxt = onxt;
2612 goto drop;
I'm wondering in the SACK case, should CWND be set back to
ssthresh(which has been slashed in cc_cong_signal() a few lines above)
before line 2599, like non-SACK case, instead of doing slow start from
maxseg?
I read rfc6675 and a few others, and it looks like that's the case. I
appreciate your opinion, again.
Thanks,
Liang
More information about the freebsd-net
mailing list