+
+ om->engine_init = 0;
+
+ return 0;
+}
+
+#ifdef HAVE_OPENSSL_ASYNC
+static clib_error_t *
+tls_openssl_set_command_fn (vlib_main_t * vm, unformat_input_t * input,
+ vlib_cli_command_t * cmd)
+{
+ openssl_main_t *om = &openssl_main;
+ char *engine_name = NULL;
+ char *engine_alg = NULL;
+ u8 engine_name_set = 0;
+ int i;
+
+ /* By present, it is not allowed to configure engine again after running */
+ if (om->engine_init)
+ {
+ clib_warning ("engine has started!\n");
+ return clib_error_return
+ (0, "engine has started, and no config is accepted");
+ }
+
+ while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
+ {
+ if (unformat (input, "engine %s", &engine_name))
+ {
+ engine_name_set = 1;
+ }
+ else if (unformat (input, "async"))
+ {
+ om->async = 1;
+ openssl_async_node_enable_disable (1);
+ }
+ else if (unformat (input, "alg %s", &engine_alg))
+ {
+ for (i = 0; i < strnlen (engine_alg, MAX_CRYPTO_LEN); i++)
+ engine_alg[i] = toupper (engine_alg[i]);
+ }
+ else
+ return clib_error_return (0, "failed: unknown input `%U'",
+ format_unformat_error, input);
+ }
+
+ /* reset parameters if engine is not configured */
+ if (!engine_name_set)
+ {
+ clib_warning ("No engine provided! \n");
+ om->async = 0;
+ }
+ else
+ {
+ if (!openssl_engine_register (engine_name, engine_alg))
+ {
+ return clib_error_return (0, "failed to register %s polling",
+ engine_name);
+ }
+ }
+