#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;
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)
{
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)
{
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);
/*
* 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;
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)
{
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)
{
/* 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;
{
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);
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
{