Fix TCP tx when snd_wnd < smss 65/6565/2
authorFlorin Coras <fcoras@cisco.com>
Tue, 2 May 2017 19:40:39 +0000 (12:40 -0700)
committerDave Barach <openvpp@barachs.net>
Tue, 2 May 2017 21:52:56 +0000 (21:52 +0000)
Fixes VPP-728, VPP-729, VPP-730

Change-Id: Ie8c6c0dd006f98527525e87d19b508bb8d39db69
Signed-off-by: Florin Coras <fcoras@cisco.com>
src/vnet/tcp/tcp.c

index 245a35a..de4edfa 100644 (file)
@@ -573,7 +573,7 @@ tcp_session_send_mss (transport_connection_t * trans_conn)
 u32
 tcp_session_send_space (transport_connection_t * trans_conn)
 {
-  u32 snd_space;
+  u32 snd_space, chunk;
   tcp_connection_t *tc = (tcp_connection_t *) trans_conn;
 
   /* If we haven't gotten dupacks or if we did and have gotten sacked bytes
@@ -582,14 +582,15 @@ tcp_session_send_space (transport_connection_t * trans_conn)
                    && (tc->rcv_dupacks == 0
                        || tc->sack_sb.last_sacked_bytes)))
     {
+      chunk = tc->snd_wnd > tc->snd_mss ? tc->snd_mss : tc->snd_wnd;
       snd_space = tcp_available_snd_space (tc);
 
       /* If we can't write at least a segment, don't try at all */
-      if (snd_space < tc->snd_mss)
+      if (chunk == 0 || snd_space < chunk)
        return 0;
 
       /* round down to mss multiple */
-      return snd_space - (snd_space % tc->snd_mss);
+      return snd_space - (snd_space % chunk);
     }
 
   /* If in fast recovery, send 1 SMSS if wnd allows */