Sending CWR after an RTO is according to RFC 3168 generally required

and not only for the DCTCP congestion control.

Submitted by:		Richard Scheffenegger
Reviewed by:		rgrimes, tuexen@, Cheng Cui
MFC after:		1 week
Differential Revision:	https://reviews.freebsd.org/D23119
This commit is contained in:
Michael Tuexen 2020-01-25 13:45:10 +00:00
parent 47e2c17c12
commit 9cc711c9ff
3 changed files with 4 additions and 1 deletions

View File

@ -284,7 +284,6 @@ dctcp_cong_signal(struct cc_var *ccv, uint32_t type)
dctcp_data->ece_curr = 1; dctcp_data->ece_curr = 1;
break; break;
case CC_RTO: case CC_RTO:
CCV(ccv, t_flags2) |= TF2_ECN_SND_CWR;
dctcp_update_alpha(ccv); dctcp_update_alpha(ccv);
dctcp_data->save_sndnxt += CCV(ccv, t_maxseg); dctcp_data->save_sndnxt += CCV(ccv, t_maxseg);
dctcp_data->num_cong_events++; dctcp_data->num_cong_events++;

View File

@ -460,6 +460,8 @@ cc_cong_signal(struct tcpcb *tp, struct tcphdr *th, uint32_t type)
tp->snd_ssthresh = max(2, min(tp->snd_wnd, tp->snd_cwnd) / 2 / tp->snd_ssthresh = max(2, min(tp->snd_wnd, tp->snd_cwnd) / 2 /
maxseg) * maxseg; maxseg) * maxseg;
tp->snd_cwnd = maxseg; tp->snd_cwnd = maxseg;
if (tp->t_flags2 & TF2_ECN_PERMIT)
tp->t_flags2 |= TF2_ECN_SND_CWR;
break; break;
case CC_RTO_ERR: case CC_RTO_ERR:
TCPSTAT_INC(tcps_sndrexmitbad); TCPSTAT_INC(tcps_sndrexmitbad);

View File

@ -1813,6 +1813,8 @@ rack_cong_signal(struct tcpcb *tp, struct tcphdr *th, uint32_t type)
tp->snd_ssthresh = max(2, min(tp->snd_wnd, tp->snd_cwnd) / 2 / tp->snd_ssthresh = max(2, min(tp->snd_wnd, tp->snd_cwnd) / 2 /
ctf_fixed_maxseg(tp)) * ctf_fixed_maxseg(tp); ctf_fixed_maxseg(tp)) * ctf_fixed_maxseg(tp);
tp->snd_cwnd = ctf_fixed_maxseg(tp); tp->snd_cwnd = ctf_fixed_maxseg(tp);
if (tp->t_flags2 & TF2_ECN_PERMIT)
tp->t_flags2 |= TF2_ECN_SND_CWR;
break; break;
case CC_RTO_ERR: case CC_RTO_ERR:
TCPSTAT_INC(tcps_sndrexmitbad); TCPSTAT_INC(tcps_sndrexmitbad);