X-Git-Url: https://gerrit.fd.io/r/gitweb?a=blobdiff_plain;f=src%2Fvnet%2Ftcp%2Ftcp_newreno.c;h=a9ec58c262f74cfdee323e4f9d1afec1f688e241;hb=6bd197ebb9fd9ae271449ad3937ae076d85c6479;hp=c825e952c9b76e0077f7efa2770709c54c4c5bc3;hpb=f03a59ab008908f98fd7d1b187a8c0fb78b01add;p=vpp.git diff --git a/src/vnet/tcp/tcp_newreno.c b/src/vnet/tcp/tcp_newreno.c index c825e952c9b..a9ec58c262f 100644 --- a/src/vnet/tcp/tcp_newreno.c +++ b/src/vnet/tcp/tcp_newreno.c @@ -36,8 +36,16 @@ newreno_rcv_ack (tcp_connection_t * tc) } else { - /* Round up to 1 if needed */ - tc->cwnd += clib_max ((tc->snd_mss * tc->snd_mss) / tc->cwnd, 1); + /* tc->cwnd += clib_max ((tc->snd_mss * tc->snd_mss) / tc->cwnd, 1); */ + tc->cwnd_acc_bytes += tc->bytes_acked; + if (tc->cwnd_acc_bytes >= tc->cwnd) + { + u32 inc = tc->cwnd_acc_bytes / tc->cwnd; + tc->cwnd_acc_bytes -= inc * tc->cwnd; + tc->cwnd += inc * tc->snd_mss; + } + tc->cwnd = clib_min (tc->cwnd, + transport_tx_fifo_size (&tc->connection)); } } @@ -63,8 +71,8 @@ newreno_rcv_cong_ack (tcp_connection_t * tc, tcp_cc_ack_t ack_type) * window deflation" attempts to ensure that, when fast recovery * eventually ends, approximately ssthresh amount of data will be * outstanding in the network.*/ - tc->cwnd = (tc->cwnd > tc->bytes_acked) ? - tc->cwnd - tc->bytes_acked : 0; + tc->cwnd = (tc->cwnd > tc->bytes_acked + tc->snd_mss) ? + tc->cwnd - tc->bytes_acked : tc->snd_mss; if (tc->bytes_acked > tc->snd_mss) tc->cwnd += tc->snd_mss; }