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;
}
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)
{
clib_bitmap_free (app_listener->workers);
- pool_put (app->listeners, app_listener);
if (CLIB_DEBUG)
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);
+ pool_put (app->listeners, app_listener);
}
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 *
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 *
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);
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.
* 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)
application_alloc_and_init (app_init_args_t * a)
{
ssvm_segment_type_t seg_type = SSVM_SEGMENT_MEMFD;
- segment_manager_properties_t *props;
+ segment_manager_props_t *props;
vl_api_registration_t *reg;
application_t *app;
u64 *options;
app->flags |= APP_OPTIONS_FLAGS_USE_GLOBAL_SCOPE;
props = application_segment_manager_properties (app);
- segment_manager_properties_init (props);
- props->segment_size = options[APP_OPTIONS_ADD_SEGMENT_SIZE];
+ segment_manager_props_init (props);
+ props->segment_size = options[APP_OPTIONS_SEGMENT_SIZE];
props->prealloc_fifos = options[APP_OPTIONS_PREALLOC_FIFO_PAIRS];
if (options[APP_OPTIONS_ADD_SEGMENT_SIZE])
{
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;
}
* 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);
if (application_is_builtin (app))
application_name_table_del (app);
vec_free (app->name);
- vec_free (app->tls_cert);
- vec_free (app->tls_key);
pool_put (app_main.app_pool, app);
}
}
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, ({
/*
* Setup first segment manager
*/
- sm = segment_manager_new ();
+ sm = segment_manager_alloc ();
sm->app_wrk_index = app_wrk->wrk_index;
if ((rv = segment_manager_init (sm, app->sm_properties.segment_size,
int
vnet_app_worker_add_del (vnet_app_worker_add_del_args_t * a)
{
- svm_fifo_segment_private_t *fs;
+ fifo_segment_t *fs;
app_worker_map_t *wrk_map;
app_worker_t *app_wrk;
segment_manager_t *sm;
vl_api_registration_t *regp;
regp = vl_api_client_index_to_registration (api_client_index);
if (regp)
- return format (0, "%s%c", regp->name, 0);
+ return format (0, "%s", regp->name);
clib_warning ("api client index %u does not have an api registration!",
api_client_index);
- return format (0, "unknown%c", 0);
+ return format (0, "unknown");
}
/**
int
vnet_application_attach (vnet_app_attach_args_t * a)
{
- svm_fifo_segment_private_t *fs;
+ fifo_segment_t *fs;
application_t *app = 0;
app_worker_t *app_wrk;
segment_manager_t *sm;
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;
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;
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;
app_worker_start_listen (app_wrk, al);
s = listen_session_get (al->session_index);
- s->enqueue_epoch = SESSION_PROXY_LISTENER_INDEX;
+ s->flags |= SESSION_F_PROXY;
}
}
else
/* *INDENT-ON* */
}
-segment_manager_properties_t *
+segment_manager_props_t *
application_segment_manager_properties (application_t * app)
{
return &app->sm_properties;
}
-segment_manager_properties_t *
+segment_manager_props_t *
application_get_segment_manager_properties (u32 app_index)
{
application_t *app = application_get (app_index);
clib_error_t *
vnet_app_add_tls_cert (vnet_app_add_tls_cert_args_t * a)
{
- application_t *app;
- app = application_get (a->app_index);
- if (!app)
- return clib_error_return_code (0, VNET_API_ERROR_APPLICATION_NOT_ATTACHED,
- 0, "app %u doesn't exist", a->app_index);
- app->tls_cert = vec_dup (a->cert);
+ /* Deprected, will be remove after 20.01 */
+ app_cert_key_pair_t *ckpair;
+ ckpair = app_cert_key_pair_get_default ();
+ ckpair->cert = vec_dup (a->cert);
return 0;
}
clib_error_t *
vnet_app_add_tls_key (vnet_app_add_tls_key_args_t * a)
{
- application_t *app;
- app = application_get (a->app_index);
- if (!app)
- return clib_error_return_code (0, VNET_API_ERROR_APPLICATION_NOT_ATTACHED,
- 0, "app %u doesn't exist", a->app_index);
- app->tls_key = vec_dup (a->key);
+ /* Deprected, will be remove after 20.01 */
+ app_cert_key_pair_t *ckpair;
+ ckpair = app_cert_key_pair_get_default ();
+ ckpair->key = vec_dup (a->key);
return 0;
}
/* *INDENT-ON* */
}
+u8 *
+format_cert_key_pair (u8 * s, va_list * args)
+{
+ app_cert_key_pair_t *ckpair = va_arg (*args, app_cert_key_pair_t *);
+ int key_len = 0, cert_len = 0;
+ cert_len = vec_len (ckpair->cert);
+ key_len = vec_len (ckpair->key);
+ if (ckpair->cert_key_index == 0)
+ s = format (s, "DEFAULT (cert:%d, key:%d)", cert_len, key_len);
+ else
+ s =
+ format (s, "%d (cert:%d, key:%d)", ckpair->cert_key_index, cert_len,
+ key_len);
+ return s;
+}
+
u8 *
format_application (u8 * s, va_list * args)
{
application_t *app = va_arg (*args, application_t *);
CLIB_UNUSED (int verbose) = va_arg (*args, int);
- segment_manager_properties_t *props;
+ segment_manager_props_t *props;
const u8 *app_ns_name, *app_name;
app_worker_map_t *wrk_map;
app_worker_t *app_wrk;
props = application_segment_manager_properties (app);
if (!verbose)
{
- s = format (s, "%-10u%-20s%-40s", app->app_index, app_name,
+ s = format (s, "%-10u%-20v%-40s", app->app_index, app_name,
app_ns_name);
return s;
}
- s = format (s, "app-name %s app-index %u ns-index %u seg-size %U\n",
+ s = format (s, "app-name %v app-index %u ns-index %u seg-size %U\n",
app_name, app->app_index, app->ns_index,
format_memory_size, props->add_segment_size);
s = format (s, "rx-fifo-size %U tx-fifo-size %U workers:\n",
/* *INDENT-ON* */
}
+static clib_error_t *
+show_certificate_command_fn (vlib_main_t * vm, unformat_input_t * input,
+ vlib_cli_command_t * cmd)
+{
+ app_cert_key_pair_t *ckpair;
+ session_cli_return_if_not_enabled ();
+
+ /* *INDENT-OFF* */
+ pool_foreach (ckpair, app_main.cert_key_pair_store, ({
+ vlib_cli_output (vm, "%U", format_cert_key_pair, ckpair);
+ }));
+ /* *INDENT-ON* */
+ return 0;
+}
+
static clib_error_t *
show_app_command_fn (vlib_main_t * vm, unformat_input_t * input,
vlib_cli_command_t * cmd)
return 0;
}
+/*
+ * Certificate store
+ *
+ */
+
+static app_cert_key_pair_t *
+app_cert_key_pair_alloc ()
+{
+ app_cert_key_pair_t *ckpair;
+ pool_get (app_main.cert_key_pair_store, ckpair);
+ clib_memset (ckpair, 0, sizeof (*ckpair));
+ ckpair->cert_key_index = ckpair - app_main.cert_key_pair_store;
+ return ckpair;
+}
+
+app_cert_key_pair_t *
+app_cert_key_pair_get_if_valid (u32 index)
+{
+ if (pool_is_free_index (app_main.cert_key_pair_store, index))
+ return 0;
+ return app_cert_key_pair_get (index);
+}
+
+app_cert_key_pair_t *
+app_cert_key_pair_get (u32 index)
+{
+ return pool_elt_at_index (app_main.cert_key_pair_store, index);
+}
+
+app_cert_key_pair_t *
+app_cert_key_pair_get_default ()
+{
+ /* To maintain legacy bapi */
+ return app_cert_key_pair_get (0);
+}
+
+int
+vnet_app_add_cert_key_pair (vnet_app_add_cert_key_pair_args_t * a)
+{
+ app_cert_key_pair_t *ckpair = app_cert_key_pair_alloc ();
+ ckpair->cert = vec_dup (a->cert);
+ ckpair->key = vec_dup (a->key);
+ a->index = ckpair->cert_key_index;
+ return 0;
+}
+
+int
+vnet_app_add_cert_key_interest (u32 index, u32 app_index)
+{
+ app_cert_key_pair_t *ckpair;
+ if (!(ckpair = app_cert_key_pair_get_if_valid (index)))
+ return -1;
+ vec_add1 (ckpair->app_interests, app_index);
+ return 0;
+}
+
+int
+vnet_app_del_cert_key_pair (u32 index)
+{
+ app_cert_key_pair_t *ckpair;
+ application_t *app;
+ u32 *app_index;
+
+ if (!(ckpair = app_cert_key_pair_get_if_valid (index)))
+ return (VNET_API_ERROR_INVALID_VALUE);
+
+ vec_foreach (app_index, ckpair->app_interests)
+ {
+ if ((app = application_get_if_valid (*app_index))
+ && app->cb_fns.app_cert_key_pair_delete_callback)
+ app->cb_fns.app_cert_key_pair_delete_callback (ckpair);
+ }
+
+ vec_free (ckpair->cert);
+ vec_free (ckpair->key);
+ pool_put (app_main.cert_key_pair_store, ckpair);
+ return 0;
+}
+
+clib_error_t *
+cert_key_pair_store_init (vlib_main_t * vm)
+{
+ /* Add a certificate with index 0 to support legacy apis */
+ (void) app_cert_key_pair_alloc ();
+ return 0;
+}
+
/* *INDENT-OFF* */
+VLIB_INIT_FUNCTION (cert_key_pair_store_init);
+
VLIB_CLI_COMMAND (show_app_command, static) =
{
.path = "show app",
.short_help = "show app [server|client] [verbose]",
.function = show_app_command_fn,
};
+
+VLIB_CLI_COMMAND (show_certificate_command, static) =
+{
+ .path = "show app certificate",
+ .short_help = "list app certs and keys present in store",
+ .function = show_certificate_command_fn,
+};
/* *INDENT-ON* */
/*