session: fix local sessions disconnects 04/17704/4
authorFlorin Coras <fcoras@cisco.com>
Wed, 20 Feb 2019 04:57:06 +0000 (20:57 -0800)
committerDamjan Marion <dmarion@me.com>
Wed, 20 Feb 2019 16:26:46 +0000 (16:26 +0000)
Change-Id: Ib4ca472aa2413ced7f82d87e4fee65ca86ab1f2b
Signed-off-by: Florin Coras <fcoras@cisco.com>
src/vnet/session/application.c
src/vnet/session/application_worker.c
test/test_vcl.py

index e79851c..3bf722b 100644 (file)
@@ -1155,7 +1155,9 @@ vnet_disconnect_session (vnet_disconnect_args_t * a)
 {
   if (session_handle_is_local (a->handle))
     {
+      app_worker_t *client_wrk, *server_wrk;
       local_session_t *ls;
+      u32 wrk_index = ~0;
 
       /* Disconnect reply came to worker 1 not main thread */
       app_interface_check_thread_and_barrier (vnet_disconnect_session, a);
@@ -1163,7 +1165,22 @@ vnet_disconnect_session (vnet_disconnect_args_t * a)
       if (!(ls = app_worker_get_local_session_from_handle (a->handle)))
        return 0;
 
-      return app_worker_local_session_disconnect (a->app_index, ls);
+      client_wrk = app_worker_get_if_valid (ls->client_wrk_index);
+      server_wrk = app_worker_get (ls->app_wrk_index);
+
+      if (server_wrk->app_index == a->app_index)
+       wrk_index = server_wrk->wrk_index;
+      else if (client_wrk && client_wrk->app_index == a->app_index)
+       wrk_index = client_wrk->wrk_index;
+
+      if (wrk_index == ~0)
+       {
+         clib_warning ("app %u does not own session 0x%lx", a->app_index,
+                       application_local_session_handle (ls));
+         return VNET_API_ERROR_INVALID_VALUE;
+       }
+
+      return app_worker_local_session_disconnect (wrk_index, ls);
     }
   else
     {
index a72856a..3bab356 100644 (file)
@@ -362,7 +362,7 @@ app_worker_stop_listen (app_worker_t * app_wrk, app_listener_t * al)
       /* *INDENT-OFF* */
       pool_foreach (ls, app_wrk->local_sessions, ({
         if (ls->listener_index == ll->session_index)
-          app_worker_local_session_disconnect (app_wrk->app_index, ls);
+          app_worker_local_session_disconnect (app_wrk->wrk_index, ls);
       }));
       /* *INDENT-ON* */
     }
@@ -966,35 +966,17 @@ app_worker_local_session_connect_notify (local_session_t * ls)
 }
 
 int
-app_worker_local_session_disconnect (u32 app_index, local_session_t * ls)
+app_worker_local_session_disconnect (u32 app_wrk_index, local_session_t * ls)
 {
   app_worker_t *client_wrk, *server_wrk;
-  u8 is_server = 0, is_client = 0;
-  application_t *app;
-
-  app = application_get_if_valid (app_index);
-  if (!app)
-    return 0;
 
   client_wrk = app_worker_get_if_valid (ls->client_wrk_index);
   server_wrk = app_worker_get (ls->app_wrk_index);
 
-  if (server_wrk->app_index == app_index)
-    is_server = 1;
-  else if (client_wrk && client_wrk->app_index == app_index)
-    is_client = 1;
-
-  if (!is_server && !is_client)
-    {
-      clib_warning ("app %u is neither client nor server for session 0x%lx",
-                   app_index, application_local_session_handle (ls));
-      return VNET_API_ERROR_INVALID_VALUE;
-    }
-
   if (ls->session_state == SESSION_STATE_CLOSED)
     return app_worker_local_session_cleanup (client_wrk, server_wrk, ls);
 
-  if (app_index == ls->client_wrk_index)
+  if (app_wrk_index == ls->client_wrk_index)
     {
       mq_send_local_session_disconnected_cb (ls->app_wrk_index, ls);
     }
index d88d944..0901712 100644 (file)
@@ -453,7 +453,7 @@ class VCLThruHostStackTLS(VCLTestCase):
 
     def tearDown(self):
         self.logger.debug(self.vapi.cli("show app server"))
-        self.logger.debug(self.vapi.cli("show session verbose"))
+        self.logger.debug(self.vapi.cli("show session verbose 2"))
         self.thru_host_stack_tear_down()
         super(VCLThruHostStackTLS, self).tearDown()
 
@@ -638,6 +638,7 @@ class LDPThruHostStackIperf(VCLTestCase):
         self.server_iperf3_args = ["-V4d", "-s"]
 
     def tearDown(self):
+        self.logger.debug(self.vapi.cli("show session verbose 2"))
         self.thru_host_stack_tear_down()
         super(LDPThruHostStackIperf, self).tearDown()