tcp: cc improvements and fixes
[vpp.git] / src / vnet / tcp / tcp_newreno.c
index c825e95..0f43d21 100644 (file)
@@ -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 += inc * tc->snd_mss;
+         tc->cwnd_acc_bytes -= inc * tc->cwnd;
+       }
+      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;
        }