summaryrefslogtreecommitdiffstats
path: root/freebsd/sys/netinet/cc/cc_newreno.c
diff options
context:
space:
mode:
Diffstat (limited to 'freebsd/sys/netinet/cc/cc_newreno.c')
-rw-r--r--freebsd/sys/netinet/cc/cc_newreno.c15
1 files changed, 8 insertions, 7 deletions
diff --git a/freebsd/sys/netinet/cc/cc_newreno.c b/freebsd/sys/netinet/cc/cc_newreno.c
index b1307c92..e1993664 100644
--- a/freebsd/sys/netinet/cc/cc_newreno.c
+++ b/freebsd/sys/netinet/cc/cc_newreno.c
@@ -201,7 +201,7 @@ newreno_ack_received(struct cc_var *ccv, uint16_t type)
static void
newreno_after_idle(struct cc_var *ccv)
{
- int rw;
+ uint32_t rw;
/*
* If we've been idle for more than one retransmit timeout the old
@@ -216,11 +216,7 @@ newreno_after_idle(struct cc_var *ccv)
*
* See RFC5681 Section 4.1. "Restarting Idle Connections".
*/
- if (V_tcp_do_rfc3390)
- rw = min(4 * CCV(ccv, t_maxseg),
- max(2 * CCV(ccv, t_maxseg), 4380));
- else
- rw = CCV(ccv, t_maxseg) * 2;
+ rw = tcp_compute_initwnd(tcp_maxseg(ccv->ccvc.tcp));
CCV(ccv, snd_cwnd) = min(rw, CCV(ccv, snd_cwnd));
}
@@ -301,7 +297,12 @@ newreno_post_recovery(struct cc_var *ccv)
pipe = CCV(ccv, snd_max) - ccv->curack;
if (pipe < CCV(ccv, snd_ssthresh))
- CCV(ccv, snd_cwnd) = pipe + CCV(ccv, t_maxseg);
+ /*
+ * Ensure that cwnd does not collapse to 1 MSS under
+ * adverse conditons. Implements RFC6582
+ */
+ CCV(ccv, snd_cwnd) = max(pipe, CCV(ccv, t_maxseg)) +
+ CCV(ccv, t_maxseg);
else
CCV(ccv, snd_cwnd) = CCV(ccv, snd_ssthresh);
}