From 085637f5d5d25023c4e7b13c9dcacfcf512aceee Mon Sep 17 00:00:00 2001 From: Damjan Marion Date: Wed, 3 Apr 2019 18:39:27 +0200 Subject: crypto: pass multiple ops to handler Change-Id: I438ef1f50d83560ecc608f898cfc61d7f51e1724 Signed-off-by: Damjan Marion --- src/vnet/crypto/crypto.c | 47 +++++++++++++++++++++++++++++++++++++++++------ 1 file changed, 41 insertions(+), 6 deletions(-) (limited to 'src/vnet/crypto') diff --git a/src/vnet/crypto/crypto.c b/src/vnet/crypto/crypto.c index ceedc93bbaf..3dcb2ec33bd 100644 --- a/src/vnet/crypto/crypto.c +++ b/src/vnet/crypto/crypto.c @@ -19,23 +19,58 @@ vnet_crypto_main_t crypto_main; +static_always_inline u32 +vnet_crypto_process_ops_call_handler (vlib_main_t * vm, + vnet_crypto_main_t * cm, + vnet_crypto_op_type_t opt, + vnet_crypto_op_t * ops[], u32 n_ops) +{ + if (n_ops == 0) + return 0; + + if (cm->ops_handlers[opt] == 0) + { + while (n_ops) + { + ops[0]->status = VNET_CRYPTO_OP_STATUS_FAIL_NO_HANDLER; + ops++; + } + return 0; + } + + return (cm->ops_handlers[opt]) (vm, ops, n_ops); +} + + u32 vnet_crypto_process_ops (vlib_main_t * vm, vnet_crypto_op_t ops[], u32 n_ops) { vnet_crypto_main_t *cm = &crypto_main; + const int op_q_size = VLIB_FRAME_SIZE; + vnet_crypto_op_t *op_queue[op_q_size]; + vnet_crypto_op_type_t opt, current_op_type = ~0; + u32 n_op_queue = 0; u32 rv = 0, i; + ASSERT (n_ops >= 1); + for (i = 0; i < n_ops; i++) { - vnet_crypto_op_type_t opt = ops[i].op; - vnet_crypto_op_t *opp = &ops[i]; + opt = ops[i].op; + + if (current_op_type != opt || n_op_queue >= op_q_size) + { + rv += vnet_crypto_process_ops_call_handler (vm, cm, current_op_type, + op_queue, n_op_queue); + n_op_queue = 0; + current_op_type = opt; + } - if (cm->ops_handlers[opt]) - rv += (cm->ops_handlers[opt]) (vm, &opp, 1); - else - ops[i].status = VNET_CRYPTO_OP_STATUS_FAIL_NO_HANDLER; + op_queue[n_op_queue++] = &ops[i]; } + rv += vnet_crypto_process_ops_call_handler (vm, cm, current_op_type, + op_queue, n_op_queue); return rv; } -- cgit 1.2.3-korg