tcp: add option to cfg max rx fifo size 60/14960/5
authorFlorin Coras <fcoras@cisco.com>
Mon, 24 Sep 2018 20:58:05 +0000 (13:58 -0700)
committerDamjan Marion <dmarion@me.com>
Tue, 25 Sep 2018 07:42:08 +0000 (07:42 +0000)
Change-Id: Icff3d688506e7658330db004c58bcfcac273fcec
Signed-off-by: Florin Coras <fcoras@cisco.com>
src/svm/svm_fifo_segment.h
src/vnet/tcp/tcp.c
src/vnet/tcp/tcp.h
src/vnet/tcp/tcp_output.c

index 1872da1..cbc327e 100644 (file)
@@ -28,7 +28,7 @@ typedef enum
 } svm_fifo_segment_freelist_t;
 
 #define FIFO_SEGMENT_MIN_FIFO_SIZE 4096
-#define FIFO_SEGMENT_MAX_FIFO_SIZE (8<<20)     /* 8mb max fifo size */
+#define FIFO_SEGMENT_MAX_FIFO_SIZE (2 << 30)   /* 2GB max fifo size */
 #define FIFO_SEGMENT_ALLOC_CHUNK_SIZE 32       /* Allocation quantum */
 
 #define FIFO_SEGMENT_F_IS_PREALLOCATED (1 << 0)
index 45eaf01..d00f4ab 100644 (file)
@@ -765,8 +765,9 @@ format_tcp_vars (u8 * s, va_list * args)
              tc->snd_una_max - tc->iss);
   s = format (s, " rcv_nxt %u rcv_las %u\n",
              tc->rcv_nxt - tc->irs, tc->rcv_las - tc->irs);
-  s = format (s, " snd_wnd %u rcv_wnd %u snd_wl1 %u snd_wl2 %u\n",
-             tc->snd_wnd, tc->rcv_wnd, tc->snd_wl1 - tc->irs,
+  s = format (s, " snd_wnd %u rcv_wnd %u rcv_wscale %u ",
+             tc->snd_wnd, tc->rcv_wnd, tc->rcv_wscale);
+  s = format (s, "snd_wl1 %u snd_wl2 %u\n", tc->snd_wl1 - tc->irs,
              tc->snd_wl2 - tc->iss);
   s = format (s, " flight size %u out space %u cc space %u rcv_wnd_av %u\n",
              tcp_flight_size (tc), tcp_available_output_snd_space (tc),
@@ -1388,9 +1389,8 @@ tcp_config_fn (vlib_main_t * vm, unformat_input_t * input)
 
   while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
     {
-      if (unformat
-         (input, "preallocated-connections %d",
-          &tm->preallocated_connections))
+      if (unformat (input, "preallocated-connections %d",
+                   &tm->preallocated_connections))
        ;
       else if (unformat (input, "preallocated-half-open-connections %d",
                         &tm->preallocated_half_open_connections))
@@ -1398,6 +1398,9 @@ tcp_config_fn (vlib_main_t * vm, unformat_input_t * input)
       else if (unformat (input, "buffer-fail-fraction %f",
                         &tm->buffer_fail_fraction))
        ;
+      else if (unformat (input, "max-rx-fifo %U", unformat_memory_size,
+                        &tm->max_rx_fifo))
+       ;
       else
        return clib_error_return (0, "unknown input `%U'",
                                  format_unformat_error, input);
index e4168c4..37b4573 100644 (file)
@@ -32,7 +32,7 @@
 #define TCP_MAX_OPTION_SPACE 40
 
 #define TCP_DUPACK_THRESHOLD   3
-#define TCP_MAX_RX_FIFO_SIZE   4 << 20
+#define TCP_MAX_RX_FIFO_SIZE   32 << 20
 #define TCP_MIN_RX_FIFO_SIZE   4 << 10
 #define TCP_IW_N_SEGMENTS      10
 #define TCP_ALWAYS_ACK         1       /**< On/off delayed acks */
@@ -408,9 +408,20 @@ typedef struct _tcp_main
   /* Congestion control algorithms registered */
   tcp_cc_algorithm_t *cc_algos;
 
+  /** vlib buffer size */
+  u32 bytes_per_buffer;
+
+  /*
+   * Configuration
+   */
+
   /* Flag that indicates if stack is on or off */
   u8 is_enabled;
 
+  /** Max rx fifo size for a session. It is used in to compute the
+   *  rfc 7323 window scaling factor */
+  u32 max_rx_fifo;
+
   /** Number of preallocated connections */
   u32 preallocated_connections;
   u32 preallocated_half_open_connections;
@@ -421,9 +432,6 @@ typedef struct _tcp_main
   u32 last_v6_address_rotor;
   ip6_address_t *ip6_src_addresses;
 
-  /** vlib buffer size */
-  u32 bytes_per_buffer;
-
   u8 punt_unknown4;
   u8 punt_unknown6;
 
index f37958e..0d5feb9 100644 (file)
@@ -118,12 +118,13 @@ tcp_initial_wnd_unscaled (tcp_connection_t * tc)
 u32
 tcp_initial_window_to_advertise (tcp_connection_t * tc)
 {
+  tcp_main_t *tm = &tcp_main;
   u32 max_fifo;
 
   /* Initial wnd for SYN. Fifos are not allocated yet.
    * Use some predefined value. For SYN-ACK we still want the
    * scale to be computed in the same way */
-  max_fifo = TCP_MAX_RX_FIFO_SIZE;
+  max_fifo = tm->max_rx_fifo ? tm->max_rx_fifo : TCP_MAX_RX_FIFO_SIZE;
 
   tc->rcv_wscale = tcp_window_compute_scale (max_fifo);
   tc->rcv_wnd = tcp_initial_wnd_unscaled (tc);