session: fix preallocation of local endpoint table 18/9618/2
authorFlorin Coras <fcoras@cisco.com>
Wed, 29 Nov 2017 05:07:11 +0000 (00:07 -0500)
committerDamjan Marion <dmarion.lists@gmail.com>
Wed, 29 Nov 2017 11:59:46 +0000 (11:59 +0000)
Change-Id: I67a73e31bda9e497859297fcc1765e880572884a
Signed-off-by: Florin Coras <fcoras@cisco.com>
src/vnet/session/session.c
src/vnet/session/session.h
src/vnet/session/session_node.c
src/vnet/session/transport.c
src/vnet/tcp/tcp.c
src/vnet/tcp/tcp.h
src/vnet/tcp/tcp_output.c

index d995eeb..b1bd7a7 100644 (file)
@@ -1239,6 +1239,17 @@ session_config_fn (vlib_main_t * vm, unformat_input_t * input)
                                      tmp, tmp);
          smm->configured_v6_halfopen_table_memory = tmp;
        }
+      else if (unformat (input, "local-endpoints-table-memory %U",
+                        unformat_memory_size, &tmp))
+       {
+         if (tmp >= 0x100000000)
+           return clib_error_return (0, "memory size %llx (%lld) too large",
+                                     tmp, tmp);
+         smm->local_endpoints_table_memory = tmp;
+       }
+      else if (unformat (input, "local-endpoints-table-buckets %d",
+                        &smm->local_endpoints_table_buckets))
+       ;
       else
        return clib_error_return (0, "unknown input `%U'",
                                  format_unformat_error, input);
index 2a0b0cc..d7bb18e 100644 (file)
@@ -140,7 +140,7 @@ struct _session_manager_main
   stream_session_t *listen_sessions[SESSION_N_TYPES];
 
   /** Per-proto, per-worker enqueue epoch counters */
-  u8 *current_enqueue_epoch[TRANSPORT_N_PROTO];
+  u32 *current_enqueue_epoch[TRANSPORT_N_PROTO];
 
   /** Per-proto, per-worker thread vector of sessions to enqueue */
   u32 **session_to_enqueue[TRANSPORT_N_PROTO];
@@ -160,9 +160,22 @@ struct _session_manager_main
   /** vpp fifo event queue */
   unix_shared_memory_queue_t **vpp_event_queues;
 
+  /** Unique segment name counter */
+  u32 unique_segment_name_counter;
+
+  /** Per transport rx function that can either dequeue or peek */
+  session_fifo_rx_fn *session_tx_fns[SESSION_N_TYPES];
+
+  /** Session manager is enabled */
+  u8 is_enabled;
+
   /** vpp fifo event queue configured length */
   u32 configured_event_queue_length;
 
+  /*
+   * Config parameters
+   */
+
   /** session table size parameters */
   u32 configured_v4_session_table_buckets;
   u32 configured_v4_session_table_memory;
@@ -173,14 +186,9 @@ struct _session_manager_main
   u32 configured_v6_halfopen_table_buckets;
   u32 configured_v6_halfopen_table_memory;
 
-  /** Unique segment name counter */
-  u32 unique_segment_name_counter;
-
-  /** Per transport rx function that can either dequeue or peek */
-  session_fifo_rx_fn *session_tx_fns[SESSION_N_TYPES];
-
-  /** Session manager is enabled */
-  u8 is_enabled;
+  /** Transport table (preallocation) size parameters */
+  u32 local_endpoints_table_memory;
+  u32 local_endpoints_table_buckets;
 
   /** Preallocate session config parameter */
   u32 preallocated_sessions;
index f647360..08baa44 100644 (file)
@@ -629,7 +629,10 @@ skip_dequeue:
          /* Can retransmit for closed sessions but can't do anything if
           * session is not ready or closed */
          if (PREDICT_FALSE (s0->session_state < SESSION_STATE_READY))
-           continue;
+           {
+             vec_add1 (smm->pending_event_vector[my_thread_index], *e0);
+             continue;
+           }
          /* Spray packets in per session type frames, since they go to
           * different nodes */
          rv = (smm->session_tx_fns[s0->session_type]) (vm, node, smm, e0, s0,
index c18cf15..b0a5906 100644 (file)
@@ -314,16 +314,20 @@ void
 transport_init (void)
 {
   vlib_thread_main_t *vtm = vlib_get_thread_main ();
-  u32 local_endpoints_table_buckets = 250000;
-  u32 local_endpoints_table_memory = 512 << 20;
+  session_manager_main_t *smm = vnet_get_session_manager_main ();
   u32 num_threads;
 
+  if (smm->local_endpoints_table_buckets == 0)
+    smm->local_endpoints_table_buckets = 250000;
+  if (smm->local_endpoints_table_memory == 0)
+    smm->local_endpoints_table_memory = 512 << 20;
+
   /* Initialize [port-allocator] random number seed */
   port_allocator_seed = (u32) clib_cpu_time_now ();
 
   clib_bihash_init_24_8 (&local_endpoints_table, "local endpoints table",
-                        local_endpoints_table_buckets,
-                        local_endpoints_table_memory);
+                        smm->local_endpoints_table_buckets,
+                        smm->local_endpoints_table_memory);
   num_threads = 1 /* main thread */  + vtm->n_threads;
   if (num_threads > 1)
     clib_spinlock_init (&local_endpoints_lock);
index b16b2a7..aee18d9 100644 (file)
@@ -1297,7 +1297,6 @@ static clib_error_t *
 tcp_config_fn (vlib_main_t * vm, unformat_input_t * input)
 {
   tcp_main_t *tm = vnet_get_tcp_main ();
-  u64 tmp;
 
   while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
     {
@@ -1308,18 +1307,6 @@ tcp_config_fn (vlib_main_t * vm, unformat_input_t * input)
       else if (unformat (input, "preallocated-half-open-connections %d",
                         &tm->preallocated_half_open_connections))
        ;
-      else if (unformat (input, "local-endpoints-table-memory %U",
-                        unformat_memory_size, &tmp))
-       {
-         if (tmp >= 0x100000000)
-           return clib_error_return (0, "memory size %llx (%lld) too large",
-                                     tmp, tmp);
-         tm->local_endpoints_table_memory = tmp;
-       }
-      else if (unformat (input, "local-endpoints-table-buckets %d",
-                        &tm->local_endpoints_table_buckets))
-       ;
-
       else if (unformat (input, "buffer-fail-fraction %f",
                         &tm->buffer_fail_fraction))
        ;
index 1ddfac0..a7ae74e 100644 (file)
@@ -395,10 +395,6 @@ typedef struct _tcp_main
   u32 preallocated_connections;
   u32 preallocated_half_open_connections;
 
-  /** Transport table (preallocation) size parameters */
-  u32 local_endpoints_table_memory;
-  u32 local_endpoints_table_buckets;
-
   /** Vectors of src addresses. Optional unless one needs > 63K active-opens */
   ip4_address_t *ip4_src_addresses;
   u32 last_v4_address_rotor;
index f377c91..dd5b384 100644 (file)
@@ -1376,7 +1376,7 @@ tcp_timer_retransmit_handler_i (u32 index, u8 is_syn)
   if (tc->state >= TCP_STATE_ESTABLISHED)
     {
       /* Lost FIN, retransmit and return */
-      if (tc->state == TCP_STATE_FIN_WAIT_1)
+      if (tcp_is_lost_fin (tc))
        {
          tcp_send_fin (tc);
          tc->rto_boff += 1;
@@ -1495,8 +1495,6 @@ tcp_timer_retransmit_handler_i (u32 index, u8 is_syn)
   else
     {
       ASSERT (tc->state == TCP_STATE_CLOSED);
-      if (CLIB_DEBUG)
-       TCP_DBG ("connection state: %U", format_tcp_connection, tc, 2);
       return;
     }
 }