tcp: send rwnd update only if wnd is large enough 46/21646/4
authorFlorin Coras <fcoras@cisco.com>
Fri, 30 Aug 2019 18:06:35 +0000 (11:06 -0700)
committerDave Barach <openvpp@barachs.net>
Tue, 3 Sep 2019 15:40:26 +0000 (15:40 +0000)
Type: feature

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

index bd3a4c1..d060654 100644 (file)
@@ -1587,6 +1587,7 @@ tcp_configuration_init (void)
   tcp_cfg.initial_cwnd_multiplier = 0;
   tcp_cfg.enable_tx_pacing = 1;
   tcp_cfg.cc_algo = TCP_CC_NEWRENO;
+  tcp_cfg.rwnd_min_update_ack = 1;
 
   /* Time constants defined as timer tick (100ms) multiples */
   tcp_cfg.delack_time = 1;     /* 0.1s */
@@ -1698,6 +1699,9 @@ tcp_config_fn (vlib_main_t * vm, unformat_input_t * input)
        tcp_cfg.min_rx_fifo = memory_size;
       else if (unformat (input, "mtu %u", &tcp_cfg.default_mtu))
        ;
+      else if (unformat (input, "rwnd-min-update-ack %d",
+                        &tcp_cfg.rwnd_min_update_ack))
+       ;
       else if (unformat (input, "initial-cwnd-multiplier %u",
                         &tcp_cfg.initial_cwnd_multiplier))
        ;
index d55ff80..9e13de4 100644 (file)
@@ -524,6 +524,10 @@ typedef struct tcp_configuration_
   /** Default congestion control algorithm type */
   tcp_cc_algorithm_type_e cc_algo;
 
+  /** Min rwnd, as number of snd_mss segments, for update ack to be sent after
+   * a zero rwnd advertisement */
+  u32 rwnd_min_update_ack;
+
   /** Delayed ack time (disabled) */
   u16 delack_time;
 
index eb48158..20031b2 100644 (file)
@@ -1185,19 +1185,19 @@ tcp_timer_delack_handler (u32 index)
 }
 
 /**
- * Send Window Update ACK,
- * ensuring that it will be sent once, if RWND became non-zero,
- * after zero RWND has been advertised in ACK before
+ * Send window update ack
+ *
+ * Ensures that it will be sent only once, after a zero rwnd has been
+ * advertised in a previous ack, and only if rwnd has grown beyond a
+ * configurable value.
  */
 void
 tcp_send_window_update_ack (tcp_connection_t * tc)
 {
-  u32 win;
-
   if (tcp_zero_rwnd_sent (tc))
     {
-      win = tcp_window_to_advertise (tc, tc->state);
-      if (win > 0)
+      tcp_update_rcv_wnd (tc);
+      if (tc->rcv_wnd >= tcp_cfg.rwnd_min_update_ack * tc->snd_mss)
        {
          tcp_zero_rwnd_sent_off (tc);
          tcp_program_ack (tc);