diff options
-rw-r--r-- | src/vnet/crypto/crypto.api | 20 | ||||
-rw-r--r-- | src/vnet/crypto/crypto.c | 17 | ||||
-rw-r--r-- | src/vnet/crypto/crypto.h | 2 | ||||
-rw-r--r-- | src/vnet/crypto/crypto_api.c | 14 |
4 files changed, 51 insertions, 2 deletions
diff --git a/src/vnet/crypto/crypto.api b/src/vnet/crypto/crypto.api index 61553e82fe3..8fec805dcfc 100644 --- a/src/vnet/crypto/crypto.api +++ b/src/vnet/crypto/crypto.api @@ -28,7 +28,8 @@ enum crypto_op_class_type:u8 CRYPTO_API_OP_BOTH, }; - /** \brief crypto: use polling or interrupt dispatch + /** \brief crypto: Use polling or interrupt dispatch. + Always unset the adaptive flag (that is why it is deprecated). @param client_index - opaque cookie to identify the sender @param context - sender context, to match reply w/ request @param mode - dispatch mode @@ -37,11 +38,28 @@ enum crypto_op_class_type:u8 autoreply define crypto_set_async_dispatch { option deprecated; + option replaced_by="crypto_set_async_dispatch_v2"; u32 client_index; u32 context; vl_api_crypto_dispatch_mode_t mode; }; + /** \brief crypto: Change the way crypto operations are dispatched. + Use adaptive (or not) mode, starting in polling or interrupt state. + @param client_index - opaque cookie to identify the sender + @param context - sender context, to match reply w/ request + @param mode - dispatch initial state + @param adaptive - whether on not the state shall change depending on load +*/ + +autoreply define crypto_set_async_dispatch_v2 +{ + u32 client_index; + u32 context; + vl_api_crypto_dispatch_mode_t mode; + bool adaptive; +}; + /** \brief crypto: set crypto handler @param client_index - opaque cookie to identify the sender @param context - sender context, to match reply w/ request diff --git a/src/vnet/crypto/crypto.c b/src/vnet/crypto/crypto.c index 81cbda8fd59..0f9949297a7 100644 --- a/src/vnet/crypto/crypto.c +++ b/src/vnet/crypto/crypto.c @@ -605,6 +605,23 @@ vnet_crypto_register_post_node (vlib_main_t * vm, char *post_node_name) return nn->next_idx; } +void +vnet_crypto_set_async_dispatch (u8 mode, u8 adaptive) +{ + vlib_thread_main_t *tm = vlib_get_thread_main (); + u32 i, node_index = crypto_main.crypto_node_index; + vlib_node_state_t state = + mode ? VLIB_NODE_STATE_INTERRUPT : VLIB_NODE_STATE_POLLING; + + for (i = vlib_num_workers () > 0; i < tm->n_vlib_mains; i++) + { + vlib_main_t *ovm = vlib_get_main_by_index (i); + vlib_node_set_state (ovm, node_index, state); + vlib_node_set_flag (ovm, node_index, VLIB_NODE_FLAG_ADAPTIVE_MODE, + adaptive); + } +} + int vnet_crypto_is_set_async_handler (vnet_crypto_async_op_id_t op) { diff --git a/src/vnet/crypto/crypto.h b/src/vnet/crypto/crypto.h index a34d3c668d8..877eb183ea6 100644 --- a/src/vnet/crypto/crypto.h +++ b/src/vnet/crypto/crypto.h @@ -488,7 +488,7 @@ u32 vnet_crypto_process_chained_ops (vlib_main_t * vm, vnet_crypto_op_t ops[], u32 vnet_crypto_process_ops (vlib_main_t * vm, vnet_crypto_op_t ops[], u32 n_ops); - +void vnet_crypto_set_async_dispatch (u8 mode, u8 adaptive); int vnet_crypto_set_handler2 (char *ops_handler_name, char *engine, crypto_op_class_type_t oct); int vnet_crypto_is_set_handler (vnet_crypto_alg_t alg); diff --git a/src/vnet/crypto/crypto_api.c b/src/vnet/crypto/crypto_api.c index 482a9b698cb..e701864a5ba 100644 --- a/src/vnet/crypto/crypto_api.c +++ b/src/vnet/crypto/crypto_api.c @@ -46,10 +46,24 @@ vl_api_crypto_set_async_dispatch_t_handler (vl_api_crypto_set_async_dispatch_t vl_api_crypto_set_async_dispatch_reply_t *rmp; int rv = 0; + vnet_crypto_set_async_dispatch ((u8) mp->mode, 0); + REPLY_MACRO (VL_API_CRYPTO_SET_ASYNC_DISPATCH_REPLY); } static void +vl_api_crypto_set_async_dispatch_v2_t_handler ( + vl_api_crypto_set_async_dispatch_v2_t *mp) +{ + vl_api_crypto_set_async_dispatch_v2_reply_t *rmp; + int rv = 0; + + vnet_crypto_set_async_dispatch ((u8) mp->mode, mp->adaptive ? 1 : 0); + + REPLY_MACRO (VL_API_CRYPTO_SET_ASYNC_DISPATCH_V2_REPLY); +} + +static void vl_api_crypto_set_handler_t_handler (vl_api_crypto_set_handler_t * mp) { vl_api_crypto_set_handler_reply_t *rmp; |