X-Git-Url: https://gerrit.fd.io/r/gitweb?a=blobdiff_plain;f=src%2Fvnet%2Fsession%2Fapplication.c;h=d4f3d61ab613e4b718e747095d1adffd5971eba5;hb=5bb23ecd098eac639641e2b3d62eb8744e0efef0;hp=4bae8dba4de309038be2c637e41ee9423a395b58;hpb=404b8a36e737e2911ca8874363a4e87cb707e5f9;p=vpp.git diff --git a/src/vnet/session/application.c b/src/vnet/session/application.c index 4bae8dba4de..d4f3d61ab61 100644 --- a/src/vnet/session/application.c +++ b/src/vnet/session/application.c @@ -38,6 +38,7 @@ app_listener_alloc (application_t * app) app_listener->app_index = app->app_index; app_listener->session_index = SESSION_INVALID_INDEX; app_listener->local_index = SESSION_INVALID_INDEX; + app_listener->ls_handle = SESSION_INVALID_HANDLE; return app_listener; } @@ -47,14 +48,6 @@ app_listener_get (application_t * app, u32 app_listener_index) return pool_elt_at_index (app->listeners, app_listener_index); } -static app_listener_t * -app_listener_get_if_valid (application_t * app, u32 app_listener_index) -{ - if (pool_is_free_index (app->listeners, app_listener_index)) - return 0; - return pool_elt_at_index (app->listeners, app_listener_index); -} - static void app_listener_free (application_t * app, app_listener_t * app_listener) { @@ -64,45 +57,10 @@ app_listener_free (application_t * app, app_listener_t * app_listener) clib_memset (app_listener, 0xfa, sizeof (*app_listener)); } -static u32 -app_listener_id (app_listener_t * al) -{ - ASSERT (al->app_index < 1 << 16 && al->al_index < 1 << 16); - return (al->app_index << 16 | al->al_index); -} - session_handle_t app_listener_handle (app_listener_t * al) { - return ((u64) SESSION_LISTENER_PREFIX << 32 | (u64) app_listener_id (al)); -} - -static void -app_listener_id_parse (u32 listener_id, u32 * app_index, - u32 * app_listener_index) -{ - *app_index = listener_id >> 16; - *app_listener_index = listener_id & 0xFFFF; -} - -void -app_listener_handle_parse (session_handle_t handle, u32 * app_index, - u32 * app_listener_index) -{ - app_listener_id_parse (handle & 0xFFFFFFFF, app_index, app_listener_index); -} - -static app_listener_t * -app_listener_get_w_id (u32 listener_id) -{ - u32 app_index, app_listener_index; - application_t *app; - - app_listener_id_parse (listener_id, &app_index, &app_listener_index); - app = application_get_if_valid (app_index); - if (!app) - return 0; - return app_listener_get_if_valid (app, app_listener_index); + return al->ls_handle; } app_listener_t * @@ -116,14 +74,24 @@ app_listener_get_w_session (session_t * ls) return app_listener_get (app, ls->al_index); } +session_handle_t +app_listen_session_handle (session_t * ls) +{ + app_listener_t *al; + al = app_listener_get_w_session (ls); + if (!al) + return listen_session_get_handle (ls); + return al->ls_handle; +} + app_listener_t * app_listener_get_w_handle (session_handle_t handle) { - - if (handle >> 32 != SESSION_LISTENER_PREFIX) + session_t *ls; + ls = session_get_from_handle_if_valid (handle); + if (!ls) return 0; - - return app_listener_get_w_id (handle & 0xFFFFFFFF); + return app_listener_get_w_session (ls); } app_listener_t * @@ -202,6 +170,7 @@ app_listener_alloc_and_init (application_t * app, ls = session_get_from_handle (lh); app_listener = app_listener_get (app, al_index); app_listener->local_index = ls->session_index; + app_listener->ls_handle = lh; ls->al_index = al_index; table_index = application_local_session_table (app); @@ -234,6 +203,7 @@ app_listener_alloc_and_init (application_t * app, ls = listen_session_get_from_handle (lh); app_listener = app_listener_get (app, al_index); app_listener->session_index = ls->session_index; + app_listener->ls_handle = lh; ls->al_index = al_index; /* Add to the global lookup table after transport was initialized. @@ -242,7 +212,8 @@ app_listener_alloc_and_init (application_t * app, * are not related to network fibs, i.e., cannot be added as * connections */ tc = session_get_transport (ls); - session_lookup_add_connection (tc, lh); + if (!(tc->flags & TRANSPORT_CONNECTION_F_NO_LOOKUP)) + session_lookup_add_connection (tc, lh); } if (!ls) @@ -582,7 +553,7 @@ application_alloc_and_init (app_init_args_t * a) a->app_index = app->app_index; APP_DBG ("New app name: %v api index: %u index %u", app->name, - app->api_client_index, app->app_index); + a->api_client_index, app->app_index); return 0; } @@ -597,8 +568,7 @@ application_free (application_t * app) * The app event queue allocated in first segment is cleared with * the segment manager. No need to explicitly free it. */ - APP_DBG ("Delete app name %v api index: %d index: %d", app->name, - app->api_client_index, app->app_index); + APP_DBG ("Delete app name %v index: %d", app->name, app->app_index); if (application_is_proxy (app)) application_remove_proxy (app); @@ -641,7 +611,7 @@ application_detach_process (application_t * app, u32 api_client_index) } APP_DBG ("Detaching for app %v index %u api client index %u", app->name, - app->app_index, app->api_client_index); + app->app_index, api_client_index); /* *INDENT-OFF* */ pool_foreach (wrk_map, app->worker_maps, ({ @@ -981,6 +951,8 @@ vnet_listen (vnet_listen_args_t * a) application_t *app; int rv; + ASSERT (vlib_thread_is_main_w_barrier ()); + app = application_get_if_valid (a->app_index); if (!app) return VNET_API_ERROR_APPLICATION_NOT_ATTACHED; @@ -1031,6 +1003,8 @@ vnet_connect (vnet_connect_args_t * a) app_worker_t *client_wrk; application_t *client; + ASSERT (vlib_thread_is_main_w_barrier ()); + if (session_endpoint_is_zero (&a->sep)) return VNET_API_ERROR_INVALID_VALUE; @@ -1068,6 +1042,8 @@ vnet_unlisten (vnet_unlisten_args_t * a) app_listener_t *al; application_t *app; + ASSERT (vlib_thread_is_main_w_barrier ()); + if (!(app = application_get_if_valid (a->app_index))) return VNET_API_ERROR_APPLICATION_NOT_ATTACHED;