summaryrefslogtreecommitdiffstats
path: root/src/vnet/crypto/crypto.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/vnet/crypto/crypto.c')
-rw-r--r--src/vnet/crypto/crypto.c47
1 files changed, 41 insertions, 6 deletions
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;
}