diff --git a/sys/netinet/tcp_input.c b/sys/netinet/tcp_input.c index f49a7f429d26..1f7d0fb2776b 100644 --- a/sys/netinet/tcp_input.c +++ b/sys/netinet/tcp_input.c @@ -1935,7 +1935,12 @@ process_ACK: if (cw > tp->snd_ssthresh) incr = incr * incr / cw; - if (tcp_do_newreno == 0 || SEQ_GEQ(th->th_ack, tp->snd_recover)) + /* + * If t_dupacks != 0 here, it indicates that we are still + * in NewReno fast recovery mode, so we leave the congestion + * window alone. + */ + if (tcp_do_newreno == 0 || tp->t_dupacks == 0) tp->snd_cwnd = min(cw + incr,TCP_MAXWIN<snd_scale); } if (acked > so->so_snd.sb_cc) { diff --git a/sys/netinet/tcp_reass.c b/sys/netinet/tcp_reass.c index f49a7f429d26..1f7d0fb2776b 100644 --- a/sys/netinet/tcp_reass.c +++ b/sys/netinet/tcp_reass.c @@ -1935,7 +1935,12 @@ process_ACK: if (cw > tp->snd_ssthresh) incr = incr * incr / cw; - if (tcp_do_newreno == 0 || SEQ_GEQ(th->th_ack, tp->snd_recover)) + /* + * If t_dupacks != 0 here, it indicates that we are still + * in NewReno fast recovery mode, so we leave the congestion + * window alone. + */ + if (tcp_do_newreno == 0 || tp->t_dupacks == 0) tp->snd_cwnd = min(cw + incr,TCP_MAXWIN<snd_scale); } if (acked > so->so_snd.sb_cc) {