tcp: fix the initial CWND when a SYN retransmission happened

According to RFC 3390 the CWND should be set to one MSS if the
SYN or SYN-ACK has been retransmitted. This is handled in the
code by setting CWND to 1 and cc_conn_init() translates this
to MSS. Unfortunately, cc_cong_signal() was overwriting the
special value of 1 in case of a lost SYN, and therefore the
initial CWND was not as it was supposed to be.
Fix this by not overwriting the special value of 1.

Reviewed by:		cc, rscheff
MFC after:		3 days
Sponsored by:		Netflix, Inc.
Differential Revision:	https://reviews.freebsd.org/D47439
This commit is contained in:
Michael Tuexen 2024-11-05 09:52:42 +01:00
parent 55c854cf0c
commit 625835c8b5

View File

@ -810,7 +810,9 @@ tcp_timer_rexmt(struct tcpcb *tp)
*/ */
tp->t_rtttime = 0; tp->t_rtttime = 0;
cc_cong_signal(tp, NULL, CC_RTO); /* Do not overwrite the snd_cwnd on SYN retransmissions. */
if (tp->t_state != TCPS_SYN_SENT)
cc_cong_signal(tp, NULL, CC_RTO);
NET_EPOCH_ENTER(et); NET_EPOCH_ENTER(et);
rv = tcp_output_locked(tp); rv = tcp_output_locked(tp);
NET_EPOCH_EXIT(et); NET_EPOCH_EXIT(et);