20 #include <openssl/engine.h> 23 #define MAX_SESSION 4096 24 #define MAX_VECTOR_ASYNC 256 26 #define SSL_ASYNC_INFLIGHT 1 27 #define SSL_ASYNC_PENDING 2 28 #define SSL_ASYNC_READY 3 30 #define EMPTY_STRUCT {0} 64 void (*polling) (void);
77 void (*polling) (void);
78 void (*pre_init) (void);
102 TLS_DBG (
"Totally there is %d thread\n", num_threads);
110 for (i = 0; i < num_threads; i++)
127 int i, registered = -1;
132 for (i = 0; i <
ARRAY_LEN (engine_list); i++)
134 if (!strcmp (engine_list[i].engine, engine_name))
146 ENGINE_load_builtin_engines ();
147 ENGINE_load_dynamic ();
148 engine = ENGINE_by_id (engine_name);
157 p = engine_list[registered].
pre_init;
163 if (!ENGINE_set_default_string (engine, algorithm))
166 engine_name, algorithm);
172 if (!ENGINE_set_default (engine, ENGINE_METHOD_ALL))
174 clib_warning (
"Failed to set engine %s to all algorithm",
223 if (*evt_run_tail == event_idx)
242 return ((*evt)->event_index);
256 TLS_DBG (
"Set event %d to run\n", event_index);
267 if (*evt_run_tail >= 0)
273 if (*evt_run_head < 0)
287 int *evt_pending_head;
288 u32 thread_id = ctx->c_thread_index;
295 event->handler = handler;
296 event->cb_args.event_index = eidx;
297 event->cb_args.thread_index = thread_id;
299 event->engine_callback.arg = &
event->cb_args;
303 event->next = *evt_pending_head;
304 *evt_pending_head = eidx;
307 return &
event->engine_callback;
329 (*handler) (
ctx, tls_session);
350 while (*evt_pending >= 0)
352 TLS_DBG (
"polling... current head = %d\n", *evt_pending);
354 *evt_pending =
event->next;
357 engine_cb = &
event->engine_callback;
369 ENGINE_ctrl_cmd (om->
engine,
"ENABLE_EXTERNAL_POLLING", 0,
NULL,
NULL, 0);
384 ENGINE_ctrl_cmd (om->
engine,
"SET_INSTANCE_FOR_THREAD", thread_index,
388 TLS_DBG (
"set thread %d and instance %d mapping\n", thread_index,
402 #define QAT_CMD_POLL (ENGINE_CMD_BASE + 1) 421 u8 state = is_en ? VLIB_NODE_STATE_POLLING : VLIB_NODE_STATE_DISABLED;
457 if (*evt_run_head < 0)
462 if (*evt_run_head >= 0)
465 TLS_DBG (
"event run = %d\n", *evt_run_head);
468 *evt_run_head =
event->next;
485 TLS_DBG (
"Start to call tls_async_init\n");
511 .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)
int tls_async_do_job(int eidx, u32 thread_index)
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(* callback)(void *arg)
static stream_session_t * session_get_from_handle(session_handle_t handle)
#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()
int openssl_async_run(void *evt)
struct _stream_session_t stream_session_t
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 openssl_resume_handler(tls_ctx_t *ctx, stream_session_t *tls_session)
#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...)
#define TLS_DBG(_fmt, _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.
#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)
static vlib_thread_main_t * vlib_get_thread_main()
openssl_tls_callback_t engine_callback
struct openssl_event_ openssl_evt_t
static uword tls_async_process(vlib_main_t *vm, vlib_node_runtime_t *rt, vlib_frame_t *f)