tcp: avoid rcv wnd less than mss 51/28451/1
authorFlorin Coras <fcoras@cisco.com>
Fri, 8 May 2020 16:23:38 +0000 (16:23 +0000)
committerAndrew Yourtchenko <ayourtch@gmail.com>
Tue, 18 Aug 2020 09:54:56 +0000 (09:54 +0000)
Type: fix

Signed-off-by: Florin Coras <fcoras@cisco.com>
Change-Id: I84ec1c91a3a7b2195aad58923fa6f17f551444cb
(cherry picked from commit f2fe353cc829f2074d63ebba9bb3b25e5ceb20af)

src/vnet/tcp/tcp_output.c

index 9eba05e..464cf52 100644 (file)
@@ -144,13 +144,11 @@ tcp_update_rcv_wnd (tcp_connection_t * tc)
       wnd = available_space;
     }
 
-  /* Make sure we have a multiple of rcv_wscale */
+  /* Make sure we have a multiple of 1 << rcv_wscale. We round up to
+   * avoid advertising a window less than mss which could happen if
+   * 1 << rcv_wscale < mss */
   if (wnd && tc->rcv_wscale)
-    {
-      wnd &= ~((1 << tc->rcv_wscale) - 1);
-      if (wnd == 0)
-       wnd = 1 << tc->rcv_wscale;
-    }
+    wnd = round_pow2 (wnd, 1 << tc->rcv_wscale);
 
   tc->rcv_wnd = clib_min (wnd, TCP_WND_MAX << tc->rcv_wscale);
 }