DCTCP: update alpha only once after loss recovery.

In mixed ECN marking and loss scenarios it was found, that
the alpha value of DCTCP is updated two times. The second
update happens with freshly initialized counters indicating
to ECN loss. Overall this leads to alpha not adjusting as
quickly as expected to ECN markings, and therefore lead to
excessive loss.

Reported by:	Cheng Cui
Reviewed by:	chengc_netapp.com, rrs, tuexen (mentor)
Approved by:	tuexen (mentor)
MFC after:	2 weeks
Sponsored by:	NetApp, Inc.
Differential Revision:	https://reviews.freebsd.org/D24817
This commit is contained in:
Richard Scheffenegger 2020-05-21 21:42:49 +00:00
parent af2fb894c9
commit e68cde59c3

View File

@ -154,10 +154,8 @@ dctcp_ack_received(struct cc_var *ccv, uint16_t type)
* Update the fraction of marked bytes at the end of
* current window size.
*/
if ((IN_FASTRECOVERY(CCV(ccv, t_flags)) &&
SEQ_GEQ(ccv->curack, CCV(ccv, snd_recover))) ||
(!IN_FASTRECOVERY(CCV(ccv, t_flags)) &&
SEQ_GT(ccv->curack, dctcp_data->save_sndnxt)))
if (!IN_FASTRECOVERY(CCV(ccv, t_flags)) &&
SEQ_GT(ccv->curack, dctcp_data->save_sndnxt))
dctcp_update_alpha(ccv);
} else
newreno_cc_algo.ack_received(ccv, type);