19 #include <openssl/engine.h> 22 #define MAX_SESSION 4096 23 #define MAX_VECTOR_ASYNC 256 25 #define SSL_ASYNC_INFLIGHT 1 26 #define SSL_ASYNC_PENDING 2 27 #define SSL_ASYNC_READY 3 29 #define EMPTY_STRUCT {0} 63 void (*polling) (void);
64 void (*polling_conf) (void);
78 void (*polling) (void);
79 void (*pre_init) (void);
80 void (*polling_conf) (void);
104 TLS_DBG (2,
"Totally there is %d thread\n", num_threads);
112 for (i = 0; i < num_threads; i++)
128 int i, registered = -1;
133 for (i = 0; i <
ARRAY_LEN (engine_list); i++)
135 if (!strcmp (engine_list[i].engine, engine_name))
145 clib_error (
"engine %s is not regisered in VPP", engine_name);
149 ENGINE_load_builtin_engines ();
150 ENGINE_load_dynamic ();
151 engine = ENGINE_by_id (engine_name);
155 clib_warning (
"Failed to find engine ENGINE_by_id %s", engine_name);
161 p = engine_list[registered].
pre_init;
167 if (!ENGINE_set_default_string (engine, algorithm))
170 engine_name, algorithm);
176 if (!ENGINE_set_default (engine, ENGINE_METHOD_ALL))
178 clib_warning (
"Failed to set engine %s to all algorithm",
227 if (*evt_run_tail == event_idx)
246 return ((*evt)->event_index);
260 TLS_DBG (2,
"Set event %d to run\n", event_index);
271 if (*evt_run_tail >= 0)
277 if (*evt_run_head < 0)
293 int *evt_pending_head;
294 u32 thread_id = ctx->c_thread_index;
301 event->handler = handler;
302 event->cb_args.event_index = eidx;
303 event->cb_args.thread_index = thread_id;
305 event->engine_callback.arg = &
event->cb_args;
309 event->next = *evt_pending_head;
310 *evt_pending_head = eidx;
312 return &
event->engine_callback;
321 u32 thread_id = ctx->c_thread_index;
328 event->handler = handler;
329 event->cb_args.event_index = eidx;
330 event->cb_args.thread_index = thread_id;
332 event->engine_callback.arg = &
event->cb_args;
357 (*handler) (
ctx, tls_session);
381 ENGINE_ctrl_cmd (om->
engine,
"ENABLE_EXTERNAL_POLLING", 0,
NULL,
NULL, 0);
396 ENGINE_ctrl_cmd (om->
engine,
"SET_INSTANCE_FOR_THREAD", thread_index,
400 TLS_DBG (2,
"set thread %d and instance %d mapping\n", thread_index,
413 ENGINE_ctrl_cmd (om->
engine,
"POLL", 0, &poll_status,
NULL, 0);
430 u8 state = is_en ? VLIB_NODE_STATE_POLLING : VLIB_NODE_STATE_DISABLED;
466 if (*evt_run_head < 0)
471 if (*evt_run_head >= 0)
474 TLS_DBG (2,
"event run = %d\n", *evt_run_head);
477 *evt_run_head =
event->next;
523 .name =
"tls-async-process",
#define vec_validate(V, I)
Make sure vector is long enough for given index (no header, unspecified alignment) ...
openssl_evt_t *** evt_pool
int openssl_evt_free(int event_idx, u8 thread_index)
#define clib_error(format, args...)
int tls_async_do_job(int eidx, u32 thread_index)
clib_memset(h->entries, 0, sizeof(h->entries[0]) *entries)
void openssl_async_node_enable_disable(u8 is_en)
static clib_error_t * tls_async_init(vlib_main_t *vm)
static openssl_evt_t * openssl_evt_get(u32 evt_index)
int tls_async_openssl_callback(SSL *s, void *evt)
#define pool_get(P, E)
Allocate an object E from a pool P (unspecified alignment).
static openssl_evt_t * openssl_evt_get_w_thread(int evt_index, u8 thread_index)
static u32 openssl_evt_alloc(void)
static vlib_node_registration_t tls_async_process_node
(constructor) VLIB_REGISTER_NODE (tls_async_process_node)
void qat_polling_config()
#define VLIB_INIT_FUNCTION(x)
void session_send_rpc_evt_to_thread(u32 thread_index, void *fp, void *rpc_args)
struct openssl_async_ openssl_async_t
int openssl_engine_register(char *engine_name, char *algorithm)
vhost_vring_state_t state
void openssl_async_polling()
openssl_async_status_t * status
#define pool_elt_at_index(p, i)
Returns pointer to element at given index.
int tls_resume_from_crypto(int thread_index)
int vpp_add_async_run_event(tls_ctx_t *ctx, openssl_resume_handler *handler)
static session_t * session_get_from_handle(session_handle_t handle)
void(* polling_conf)(void)
#define foreach_vlib_main(body)
openssl_resume_handler * handler
#define VLIB_REGISTER_NODE(x,...)
static_always_inline uword vlib_get_thread_index(void)
openssl_tls_callback_arg_t cb_args
struct openssl_tls_callback_arg_ openssl_tls_callback_arg_t
#define clib_warning(format, args...)
void evt_pool_init(vlib_main_t *vm)
void event_handler(void *tls_async)
#define pool_put_index(p, i)
Free pool element with given index.
int openssl_resume_handler(tls_ctx_t *ctx, session_t *tls_session)
#define SSL_ASYNC_PENDING
static void vlib_node_set_state(vlib_main_t *vm, u32 node_index, vlib_node_state_t new_state)
Set node dispatch state.
static void * clib_mem_alloc(uword size)
openssl_async_t openssl_async_main
struct openssl_async_status_ openssl_async_status_t
tls_ctx_t * openssl_ctx_get_w_thread(u32 ctx_index, u8 thread_index)
struct _vlib_node_registration vlib_node_registration_t
openssl_tls_callback_t * vpp_add_async_pending_event(tls_ctx_t *ctx, openssl_resume_handler *handler)
void(* polling_conf)(void)
static vlib_thread_main_t * vlib_get_thread_main()
openssl_tls_callback_t engine_callback
struct openssl_event_ openssl_evt_t
#define TLS_DBG(_lvl, _fmt, _args...)
static uword tls_async_process(vlib_main_t *vm, vlib_node_runtime_t *rt, vlib_frame_t *f)
static uword pool_elts(void *v)
Number of active elements in a pool.