session: separate local session logic
[vpp.git] / src / vnet / session / application.c
index ee69cf8..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)
 {
@@ -191,9 +161,11 @@ app_listener_alloc_and_init (application_t * app,
   session_handle_t lh;
   session_type_t st;
   session_t *ls = 0;
+  u32 al_index;
   int rv;
 
   app_listener = app_listener_alloc (app);
+  al_index = app_listener->al_index;
   st = session_type_from_proto_and_ip (sep->transport_proto, sep->is_ip4);
 
   /*
@@ -225,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;
 
@@ -239,8 +211,10 @@ app_listener_alloc_and_init (application_t * app,
          session_free (ls);
          return rv;
        }
+      ls = session_get_from_handle (lh);
+      app_listener = app_listener_get (app, al_index);
       app_listener->session_index = ls->session_index;
-      ls->al_index = app_listener->al_index;
+      ls->al_index = al_index;
     }
 
   if (!ll && !ls)
@@ -262,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)
     {
@@ -951,14 +925,8 @@ session_endpoint_update_for_app (session_endpoint_cfg_t * sep,
 
   /* App is a transport proto, so fetch the calling app's ns */
   if (app->flags & APP_OPTIONS_FLAGS_IS_TRANSPORT_APP)
-    {
-      app_worker_t *owner_wrk;
-      application_t *owner_app;
+    ns_index = sep->ns_index;
 
-      owner_wrk = app_worker_get (sep->app_wrk_index);
-      owner_app = application_get (owner_wrk->app_index);
-      ns_index = owner_app->ns_index;
-    }
   app_ns = app_namespace_get (ns_index);
   if (!app_ns)
     return;
@@ -1157,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);
@@ -1165,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
     {