diff options
Diffstat (limited to 'src/vnet/crypto/cli.c')
-rw-r--r-- | src/vnet/crypto/cli.c | 195 |
1 files changed, 178 insertions, 17 deletions
diff --git a/src/vnet/crypto/cli.c b/src/vnet/crypto/cli.c index c3383692757..f6778930ef7 100644 --- a/src/vnet/crypto/cli.c +++ b/src/vnet/crypto/cli.c @@ -58,26 +58,45 @@ format_vnet_crypto_engine_candidates (u8 * s, va_list * args) { vnet_crypto_engine_t *e; vnet_crypto_main_t *cm = &crypto_main; - - vnet_crypto_op_id_t id = va_arg (*args, vnet_crypto_op_id_t); + u32 id = va_arg (*args, u32); u32 ei = va_arg (*args, u32); int is_chained = va_arg (*args, int); + int is_async = va_arg (*args, int); - vec_foreach (e, cm->engines) + if (is_async) { - void * h = is_chained ? (void *) e->chained_ops_handlers[id] - : (void *) e->ops_handlers[id]; - - if (h) - { - s = format (s, "%U", format_vnet_crypto_engine, e - cm->engines); - if (ei == e - cm->engines) - s = format (s, "%c ", '*'); - else - s = format (s, " "); - } + vec_foreach (e, cm->engines) + { + if (e->enqueue_handlers[id] && e->dequeue_handlers[id]) + { + s = format (s, "%U", format_vnet_crypto_engine, e - cm->engines); + if (ei == e - cm->engines) + s = format (s, "%c ", '*'); + else + s = format (s, " "); + } + } + + return s; + } + else + { + vec_foreach (e, cm->engines) + { + void * h = is_chained ? (void *) e->chained_ops_handlers[id] + : (void *) e->ops_handlers[id]; + + if (h) + { + s = format (s, "%U", format_vnet_crypto_engine, e - cm->engines); + if (ei == e - cm->engines) + s = format (s, "%c ", '*'); + else + s = format (s, " "); + } + } + return s; } - return s; } static u8 * @@ -103,9 +122,9 @@ format_vnet_crypto_handlers (u8 * s, va_list * args) s = format (s, "%-16U", format_vnet_crypto_op_type, od->type); s = format (s, "%-28U", format_vnet_crypto_engine_candidates, id, - od->active_engine_index_simple, 0); + od->active_engine_index_simple, 0, 0); s = format (s, "%U", format_vnet_crypto_engine_candidates, id, - od->active_engine_index_chained, 1); + od->active_engine_index_chained, 1, 0); first = 0; } return s; @@ -232,6 +251,148 @@ VLIB_CLI_COMMAND (set_crypto_handler_command, static) = }; /* *INDENT-ON* */ +static u8 * +format_vnet_crypto_async_handlers (u8 * s, va_list * args) +{ + vnet_crypto_async_alg_t alg = va_arg (*args, vnet_crypto_async_alg_t); + vnet_crypto_main_t *cm = &crypto_main; + vnet_crypto_async_alg_data_t *d = vec_elt_at_index (cm->async_algs, alg); + u32 indent = format_get_indent (s); + int i, first = 1; + + for (i = 0; i < VNET_CRYPTO_ASYNC_OP_N_TYPES; i++) + { + vnet_crypto_async_op_data_t *od; + vnet_crypto_async_op_id_t id = d->op_by_type[i]; + + if (id == 0) + continue; + + od = cm->async_opt_data + id; + if (first == 0) + s = format (s, "\n%U", format_white_space, indent); + s = format (s, "%-16U", format_vnet_crypto_async_op_type, od->type); + + s = format (s, "%U", format_vnet_crypto_engine_candidates, id, + od->active_engine_index_async, 0, 1); + first = 0; + } + return s; +} + +static clib_error_t * +show_crypto_async_handlers_command_fn (vlib_main_t * vm, + unformat_input_t * input, + vlib_cli_command_t * cmd) +{ + unformat_input_t _line_input, *line_input = &_line_input; + int i; + + if (unformat_user (input, unformat_line_input, line_input)) + unformat_free (line_input); + + vlib_cli_output (vm, "%-28s%-16s%s", "Algo", "Type", "Handler"); + + for (i = 0; i < VNET_CRYPTO_N_ASYNC_ALGS; i++) + vlib_cli_output (vm, "%-28U%U", format_vnet_crypto_async_alg, i, + format_vnet_crypto_async_handlers, i); + + return 0; +} + +/* *INDENT-OFF* */ +VLIB_CLI_COMMAND (show_crypto_async_handlers_command, static) = +{ + .path = "show crypto async handlers", + .short_help = "show crypto async handlers", + .function = show_crypto_async_handlers_command_fn, +}; +/* *INDENT-ON* */ + + +static clib_error_t * +set_crypto_async_handler_command_fn (vlib_main_t * vm, + unformat_input_t * input, + vlib_cli_command_t * cmd) +{ + unformat_input_t _line_input, *line_input = &_line_input; + vnet_crypto_main_t *cm = &crypto_main; + int rc = 0; + char **args = 0, *s, **arg, *engine = 0; + int all = 0; + clib_error_t *error = 0; + + if (!unformat_user (input, unformat_line_input, line_input)) + return 0; + + while (unformat_check_input (line_input) != UNFORMAT_END_OF_INPUT) + { + if (unformat (line_input, "all")) + all = 1; + else if (unformat (line_input, "%s", &s)) + vec_add1 (args, s); + else + { + error = clib_error_return (0, "invalid params"); + goto done; + } + } + + if ((vec_len (args) < 2 && !all) || (vec_len (args) == 0 && all)) + { + error = clib_error_return (0, "missing cipher or engine!"); + goto done; + } + + engine = vec_elt_at_index (args, vec_len (args) - 1)[0]; + vec_del1 (args, vec_len (args) - 1); + + if (all) + { + char *key; + u8 *value; + + /* *INDENT-OFF* */ + hash_foreach_mem (key, value, cm->async_alg_index_by_name, + ({ + (void) value; + rc += vnet_crypto_set_async_handler2 (key, engine); + })); + /* *INDENT-ON* */ + + if (rc) + vlib_cli_output (vm, "failed to set crypto engine!"); + } + else + { + vec_foreach (arg, args) + { + rc = vnet_crypto_set_async_handler2 (arg[0], engine); + if (rc) + { + vlib_cli_output (vm, "failed to set engine %s for %s!", + engine, arg[0]); + } + } + } + +done: + vec_free (engine); + vec_foreach (arg, args) vec_free (arg[0]); + vec_free (args); + unformat_free (line_input); + return error; +} + +/* *INDENT-OFF* */ +VLIB_CLI_COMMAND (set_crypto_async_handler_command, static) = +{ + .path = "set crypto async handler", + .short_help = "set crypto async handler type [type2 type3 ...] engine", + .function = set_crypto_async_handler_command_fn, +}; +/* *INDENT-ON* */ + /* * fd.io coding-style-patch-verification: ON * |