tcp: fix tso not work in single buffer issue 05/22205/5
authorSimon Zhang <yuwei1.zhang@intel.com>
Tue, 24 Sep 2019 13:16:56 +0000 (21:16 +0800)
committerFlorin Coras <florin.coras@gmail.com>
Thu, 10 Oct 2019 15:52:30 +0000 (15:52 +0000)
Type: fix

Signed-off-by: Simon Zhang <yuwei1.zhang@intel.com>
Change-Id: Iddb6fd41812e8c97af58859ef43279cfc0f9d1df
Signed-off-by: Simon Zhang <yuwei1.zhang@intel.com>
src/vnet/tcp/tcp.c
src/vnet/tcp/tcp_output.c

index 8467ea4..5ffb1e2 100644 (file)
@@ -1189,7 +1189,7 @@ tcp_session_cal_goal_size (tcp_connection_t * tc)
   goal_size = TCP_MAX_GSO_SZ - tc->snd_mss % TCP_MAX_GSO_SZ;
   goal_size = clib_min (goal_size, tc->snd_wnd / 2);
 
-  return goal_size;
+  return goal_size > tc->snd_mss ? goal_size : tc->snd_mss;
 }
 
 /**
index 32c88e3..7ebea37 100644 (file)
@@ -2189,13 +2189,16 @@ tcp_output_push_ip (vlib_main_t * vm, vlib_buffer_t * b0,
 always_inline void
 tcp_check_if_gso (tcp_connection_t * tc, vlib_buffer_t * b)
 {
-  if (PREDICT_TRUE (!(b->flags & VLIB_BUFFER_TOTAL_LENGTH_VALID)))
+  if (!tc->is_tso)
     return;
-  u16 data_len =
-    b->current_length + b->total_length_not_including_first_buffer -
-    sizeof (tcp_header_t) - tc->snd_opts_len;
+  u16 data_len = b->current_length - sizeof (tcp_header_t) - tc->snd_opts_len;
 
-  if (data_len > tc->snd_mss)
+  if (PREDICT_FALSE (b->flags & VLIB_BUFFER_TOTAL_LENGTH_VALID))
+    data_len += b->total_length_not_including_first_buffer;
+
+  if (PREDICT_TRUE (data_len <= tc->snd_mss))
+    return;
+  else
     {
       ASSERT ((b->flags & VNET_BUFFER_F_L3_HDR_OFFSET_VALID) != 0);
       ASSERT ((b->flags & VNET_BUFFER_F_L4_HDR_OFFSET_VALID) != 0);