*/
static uword *app_by_api_client_index;
+/**
+ * Hash table of builtin apps by name
+ */
+static uword *app_by_name;
+
static u8 *
app_get_name_from_reg_index (application_t * app)
{
return app_name;
}
+static u8 *
+app_get_name (application_t * app)
+{
+ if (!app->name)
+ return app_get_name_from_reg_index (app);
+ return app->name;
+}
+
u32
application_session_table (application_t * app, u8 fib_proto)
{
static void
application_table_add (application_t * app)
{
- hash_set (app_by_api_client_index, app->api_client_index, app->index);
+ if (app->api_client_index != APP_INVALID_INDEX)
+ hash_set (app_by_api_client_index, app->api_client_index, app->index);
+ else if (app->name)
+ hash_set_mem (app_by_name, app->name, app->index);
}
static void
application_table_del (application_t * app)
{
- hash_unset (app_by_api_client_index, app->api_client_index);
+ if (app->api_client_index != APP_INVALID_INDEX)
+ hash_unset (app_by_api_client_index, app->api_client_index);
+ else if (app->name)
+ hash_unset_mem (app_by_name, app->name);
}
application_t *
return 0;
}
+application_t *
+application_lookup_name (const u8 * name)
+{
+ uword *p;
+ p = hash_get_mem (app_by_name, name);
+ if (p)
+ return application_get (p[0]);
+
+ return 0;
+}
+
application_t *
application_new ()
{
*/
application_local_sessions_del (app);
+ vec_free (app->tls_cert);
+ vec_free (app->tls_key);
+
application_table_del (app);
+ vec_free (app->name);
pool_put (app_pool, app);
}
}
int
-application_init (application_t * app, u32 api_client_index, u64 * options,
- session_cb_vft_t * cb_fns)
+application_init (application_t * app, u32 api_client_index, u8 * app_name,
+ u64 * options, session_cb_vft_t * cb_fns)
{
ssvm_segment_type_t seg_type = SSVM_SEGMENT_MEMFD;
u32 first_seg_size, prealloc_fifo_pairs;
props->tx_fifo_size = options[APP_OPTIONS_TX_FIFO_SIZE];
if (options[APP_OPTIONS_EVT_QUEUE_SIZE])
props->evt_q_size = options[APP_OPTIONS_EVT_QUEUE_SIZE];
+ if (options[APP_OPTIONS_TLS_ENGINE])
+ app->tls_engine = options[APP_OPTIONS_TLS_ENGINE];
props->segment_type = seg_type;
first_seg_size = options[APP_OPTIONS_SEGMENT_SIZE];
app->local_connects = hash_create (0, sizeof (u64));
app->proxied_transports = options[APP_OPTIONS_PROXY_TRANSPORT];
app->event_queue = segment_manager_event_queue (sm);
+ app->name = vec_dup (app_name);
/* If no scope enabled, default to global */
if (!application_has_global_scope (app)
application_open_session (application_t * app, session_endpoint_t * sep,
u32 api_context)
{
- segment_manager_t *sm;
int rv;
/* Make sure we have a segment manager for connects */
+ application_alloc_connects_segment_manager (app);
+
+ if ((rv = session_open (app->index, sep, api_context)))
+ return rv;
+
+ return 0;
+}
+
+int
+application_alloc_connects_segment_manager (application_t * app)
+{
+ segment_manager_t *sm;
+
if (app->connects_seg_manager == APP_INVALID_SEGMENT_MANAGER_INDEX)
{
sm = application_alloc_segment_manager (app);
return -1;
app->connects_seg_manager = segment_manager_index (sm);
}
-
- if ((rv = session_open (app->index, sep, api_context)))
- return rv;
-
return 0;
}
segment_manager_del (sm);
}
+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);
+ 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);
+ return 0;
+}
+
u8 *
format_application_listener (u8 * s, va_list * args)
{
"API Client", "Namespace", "Add seg size", "Rx fifo size",
"Tx fifo size");
else
- s =
- format (s, "%-10s%-20s%-15s%-40s", "Index", "Name", "API Client",
- "Namespace");
+ s = format (s, "%-10s%-20s%-15s%-40s", "Index", "Name", "API Client",
+ "Namespace");
return s;
}
- app_name = app_get_name_from_reg_index (app);
+ app_name = app_get_name (app);
app_ns_name = app_namespace_id_from_index (app->ns_index);
props = application_segment_manager_properties (app);
if (verbose)
- s =
- format (s, "%-10d%-20s%-15d%-15d%-15d%-15d%-15d", app->index, app_name,
- app->api_client_index, app->ns_index,
- props->add_segment_size,
- props->rx_fifo_size, props->tx_fifo_size);
+ s = format (s, "%-10d%-20s%-15d%-15d%-15d%-15d%-15d", app->index,
+ app_name, app->api_client_index, app->ns_index,
+ props->add_segment_size, props->rx_fifo_size,
+ props->tx_fifo_size);
else
s = format (s, "%-10d%-20s%-15d%-40s", app->index, app_name,
app->api_client_index, app_ns_name);