From: Florin Coras Date: Fri, 7 Sep 2018 20:29:17 +0000 (-0700) Subject: session: detect namespace for transport apps X-Git-Tag: v18.10-rc1~240 X-Git-Url: https://gerrit.fd.io/r/gitweb?p=vpp.git;a=commitdiff_plain;h=da3eec1672d66131ec85f8420f4df070e6cf326d session: detect namespace for transport apps Change-Id: I770607cb213d538a29d7bd5762682981b01e9d18 Signed-off-by: Florin Coras --- diff --git a/src/vnet/session/application_interface.c b/src/vnet/session/application_interface.c index ab87def4062..6c517e8f92b 100644 --- a/src/vnet/session/application_interface.c +++ b/src/vnet/session/application_interface.c @@ -130,11 +130,25 @@ api_parse_session_handle (u64 handle, u32 * session_index, u32 * thread_index) } static void -session_endpoint_update_for_app (session_endpoint_t * sep, +session_endpoint_update_for_app (session_endpoint_extended_t * sep, application_t * app) { app_namespace_t *app_ns; - app_ns = app_namespace_get (app->ns_index); + u32 ns_index; + + ns_index = app->ns_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; + + 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) { /* Ask transport and network to bind to/connect using local interface @@ -164,7 +178,7 @@ vnet_bind_inline (vnet_bind_args_t * a) app_wrk = application_get_worker (app, a->wrk_map_index); a->sep_ext.app_wrk_index = app_wrk->wrk_index; - session_endpoint_update_for_app (&a->sep, app); + session_endpoint_update_for_app (&a->sep_ext, app); if (!session_endpoint_in_ns (&a->sep)) return VNET_API_ERROR_INVALID_VALUE_2; @@ -257,7 +271,7 @@ application_connect (vnet_connect_args_t * a) return VNET_API_ERROR_INVALID_VALUE; client = application_get (a->app_index); - session_endpoint_update_for_app (&a->sep, client); + session_endpoint_update_for_app (&a->sep_ext, client); client_wrk = application_get_worker (client, a->wrk_map_index); /* diff --git a/src/vnet/session/application_interface.h b/src/vnet/session/application_interface.h index 1eefb0c3860..5b28a29c45b 100644 --- a/src/vnet/session/application_interface.h +++ b/src/vnet/session/application_interface.h @@ -123,6 +123,7 @@ typedef enum _(ACCEPT_REDIRECT, "Use FIFO with redirects") \ _(ADD_SEGMENT, "Add segment and signal app if needed") \ _(IS_BUILTIN, "Application is builtin") \ + _(IS_TRANSPORT_APP, "Application is a transport proto") \ _(IS_PROXY, "Application is proxying") \ _(USE_GLOBAL_SCOPE, "App can use global session scope") \ _(USE_LOCAL_SCOPE, "App can use local session scope") \ diff --git a/src/vnet/tls/tls.c b/src/vnet/tls/tls.c index 2d7126a6dfe..a31466baf29 100644 --- a/src/vnet/tls/tls.c +++ b/src/vnet/tls/tls.c @@ -714,6 +714,7 @@ tls_init (vlib_main_t * vm) a->options[APP_OPTIONS_TX_FIFO_SIZE] = fifo_size; a->options[APP_OPTIONS_FLAGS] = APP_OPTIONS_FLAGS_IS_BUILTIN; a->options[APP_OPTIONS_FLAGS] |= APP_OPTIONS_FLAGS_USE_GLOBAL_SCOPE; + a->options[APP_OPTIONS_FLAGS] |= APP_OPTIONS_FLAGS_IS_TRANSPORT_APP; if (vnet_application_attach (a)) {