session: separate local session logic
[vpp.git] / src / vnet / session / application.c
index e79851c..954b934 100644 (file)
@@ -16,6 +16,7 @@
 #include <vnet/session/application.h>
 #include <vnet/session/application_interface.h>
 #include <vnet/session/application_namespace.h>
+#include <vnet/session/application_local.h>
 #include <vnet/session/session.h>
 
 static app_main_t app_main;
@@ -27,16 +28,6 @@ static app_main_t app_main;
       return 0;                                                                \
     }
 
-static void
-application_local_listener_session_endpoint (local_session_t * ll,
-                                            session_endpoint_t * sep)
-{
-  sep->transport_proto =
-    session_type_transport_proto (ll->listener_session_type);
-  sep->port = ll->port;
-  sep->is_ip4 = ll->listener_session_type & 1;
-}
-
 static app_listener_t *
 app_listener_alloc (application_t * app)
 {
@@ -65,27 +56,6 @@ app_listener_free (application_t * app, app_listener_t * app_listener)
     clib_memset (app_listener, 0xfa, sizeof (*app_listener));
 }
 
-local_session_t *
-application_local_listen_session_alloc (application_t * app)
-{
-  local_session_t *ll;
-  pool_get_zero (app->local_listen_sessions, ll);
-  ll->session_index = ll - app->local_listen_sessions;
-  ll->session_type = session_type_from_proto_and_ip (TRANSPORT_PROTO_NONE, 0);
-  ll->app_index = app->app_index;
-  ll->session_state = SESSION_STATE_LISTENING;
-  return ll;
-}
-
-void
-application_local_listen_session_free (application_t * app,
-                                      local_session_t * ll)
-{
-  pool_put (app->local_listen_sessions, ll);
-  if (CLIB_DEBUG)
-    clib_memset (ll, 0xfb, sizeof (*ll));
-}
-
 static u32
 app_listener_id (app_listener_t * al)
 {
@@ -227,7 +197,7 @@ app_listener_alloc_and_init (application_t * app,
        * lookups, prior to establishing connection. Requests transport to
        * build it's own specific listening connection.
        */
-      ls = listen_session_new (0, st);
+      ls = listen_session_alloc (0, st);
       ls->app_index = app->app_index;
       ls->app_wrk_index = sep->app_wrk_index;
 
@@ -266,7 +236,7 @@ app_listener_cleanup (app_listener_t * al)
     {
       session_t *ls = session_get (al->session_index, 0);
       session_stop_listen (ls);
-      listen_session_del (ls);
+      listen_session_free (ls);
     }
   if (al->local_index != SESSION_INVALID_INDEX)
     {
@@ -1155,7 +1125,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 +1135,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
     {