session: fix feature disable 19/29619/5
authorFlorin Coras <fcoras@cisco.com>
Sun, 25 Oct 2020 21:00:29 +0000 (14:00 -0700)
committerDamjan Marion <dmarion@me.com>
Mon, 26 Oct 2020 15:24:32 +0000 (15:24 +0000)
Type: fix

Signed-off-by: Florin Coras <fcoras@cisco.com>
Change-Id: I69e912ddf64d8ec89f8d93e02a201781b99de0bd

src/vnet/session/session.c
src/vnet/session/session.h
src/vnet/session/session_node.c

index 6413da5..18850cc 100644 (file)
@@ -1665,6 +1665,10 @@ session_manager_main_enable (vlib_main_t * vm)
   session_worker_t *wrk;
   int i;
 
+  /* We only initialize once and do not de-initialized on disable */
+  if (smm->is_initialized)
+    goto done;
+
   num_threads = 1 /* main thread */  + vtm->n_threads;
 
   if (num_threads < 1)
@@ -1721,6 +1725,9 @@ session_manager_main_enable (vlib_main_t * vm)
   session_lookup_init ();
   app_namespaces_init ();
   transport_init ();
+  smm->is_initialized = 1;
+
+done:
 
   smm->is_enabled = 1;
 
@@ -1731,6 +1738,12 @@ session_manager_main_enable (vlib_main_t * vm)
   return 0;
 }
 
+static void
+session_manager_main_disable (vlib_main_t * vm)
+{
+  transport_enable_disable (vm, 0 /* is_en */ );
+}
+
 void
 session_node_enable_disable (u8 is_en)
 {
@@ -1742,10 +1755,10 @@ session_node_enable_disable (u8 is_en)
   foreach_vlib_main (({
     if (have_workers && ii == 0)
       {
-       vlib_node_set_state (this_vlib_main, session_queue_process_node.index,
-                            state);
        if (is_en)
          {
+           vlib_node_set_state (this_vlib_main,
+                                session_queue_process_node.index, state);
            vlib_node_t *n = vlib_get_node (this_vlib_main,
                                            session_queue_process_node.index);
            vlib_start_process (this_vlib_main, n->runtime_index);
@@ -1780,6 +1793,7 @@ vnet_session_enable_disable (vlib_main_t * vm, u8 is_en)
   else
     {
       session_main.is_enabled = 0;
+      session_manager_main_disable (vm);
       session_node_enable_disable (is_en);
     }
 
index 5e0a832..2de22bd 100644 (file)
@@ -164,6 +164,10 @@ typedef struct session_main_
 
   /** Session manager is enabled */
   u8 is_enabled;
+
+  /** Session manager initialized (not necessarily enabled) */
+  u8 is_initialized;
+
   /** Enable session manager at startup */
   u8 session_enable_asap;
 
index 346b9f4..482f8b0 100644 (file)
@@ -1564,6 +1564,8 @@ session_queue_process (vlib_main_t * vm, vlib_node_runtime_t * rt,
          session_queue_run_on_main (vm);
          break;
        case SESSION_Q_PROCESS_STOP:
+         vlib_node_set_state (vm, session_queue_process_node.index,
+                              VLIB_NODE_STATE_DISABLED);
          timeout = 100000.0;
          break;
        case ~0: