tcp: always exit recovery if not in fastrecovery 40/34840/3
authorFlorin Coras <fcoras@cisco.com>
Thu, 6 Jan 2022 03:54:45 +0000 (19:54 -0800)
committerDave Barach <openvpp@barachs.net>
Thu, 6 Jan 2022 23:08:09 +0000 (23:08 +0000)
Stay in fast recovery only if it's already on.

Type: improvement

Signed-off-by: Florin Coras <fcoras@cisco.com>
Change-Id: Idcdbbacfed3e5f3c991fa293c532be1c671f5217

src/vnet/tcp/tcp_input.c

index 058b1c0..11491a6 100644 (file)
@@ -757,10 +757,11 @@ tcp_cc_try_recover (tcp_connection_t *tc)
 
   tcp_connection_tx_pacer_reset (tc, tc->cwnd, 0 /* start bucket */ );
   tc->rcv_dupacks = 0;
+  tcp_recovery_off (tc);
 
   /* Previous recovery left us congested. Continue sending as part
    * of the current recovery event with an updated snd_congestion */
-  if (tc->sack_sb.sacked_bytes)
+  if (tc->sack_sb.sacked_bytes && tcp_in_fastrecovery (tc))
     {
       tc->snd_congestion = tc->snd_nxt;
       return -1;
@@ -777,12 +778,11 @@ tcp_cc_try_recover (tcp_connection_t *tc)
   if (hole && hole->start == tc->snd_una && hole->end == tc->snd_nxt)
     scoreboard_clear (&tc->sack_sb);
 
-  if (!tcp_in_recovery (tc) && !is_spurious)
+  if (tcp_in_fastrecovery (tc) && !is_spurious)
     tcp_cc_recovered (tc);
 
   tcp_fastrecovery_off (tc);
   tcp_fastrecovery_first_off (tc);
-  tcp_recovery_off (tc);
   TCP_EVT (TCP_EVT_CC_EVT, tc, 3);
 
   ASSERT (tc->rto_boff == 0);