diff options
author | Neale Ranns <neale@graphiant.com> | 2022-11-18 04:24:09 +0000 |
---|---|---|
committer | Beno�t Ganne <bganne@cisco.com> | 2022-11-18 08:09:29 +0000 |
commit | fe2d23f916d1991f4a1a8384eae41b5cceb80189 (patch) | |
tree | 8507f04b50af99522114c7caab056d6c41136aa4 /src/plugins | |
parent | 0b466ad75d180d6cf0a4741fac4be21a9f2f770d (diff) |
ipsec: Failure at the start of the batch should not invalidate the rest of the batch
Type: fix
Signed-off-by: Neale Ranns <neale@graphiant.com>
Change-Id: Icd1e43a5764496784c355c93066273435f16dd35
Diffstat (limited to 'src/plugins')
-rw-r--r-- | src/plugins/crypto_sw_scheduler/main.c | 38 |
1 files changed, 24 insertions, 14 deletions
diff --git a/src/plugins/crypto_sw_scheduler/main.c b/src/plugins/crypto_sw_scheduler/main.c index 09d4a0b9b94..991ef6a43f7 100644 --- a/src/plugins/crypto_sw_scheduler/main.c +++ b/src/plugins/crypto_sw_scheduler/main.c @@ -260,17 +260,22 @@ process_ops (vlib_main_t * vm, vnet_crypto_async_frame_t * f, n_fail = n_ops - vnet_crypto_process_ops (vm, op, n_ops); - while (n_fail) + /* + * If we had a failure in the ops then we need to walk all the ops + * and set the status in the corresponding frame. This status is + * not set in the case with no failures, as in that case the overall + * frame status is success. + */ + if (n_fail) { - ASSERT (op - ops < n_ops); - - if (op->status != VNET_CRYPTO_OP_STATUS_COMPLETED) + for (int i = 0; i < n_ops; i++) { + ASSERT (op - ops < n_ops); + f->elts[op->user_data].status = op->status; - *state = VNET_CRYPTO_FRAME_STATE_ELT_ERROR; - n_fail--; + op++; } - op++; + *state = VNET_CRYPTO_FRAME_STATE_ELT_ERROR; } } @@ -287,17 +292,22 @@ process_chained_ops (vlib_main_t * vm, vnet_crypto_async_frame_t * f, n_fail = n_ops - vnet_crypto_process_chained_ops (vm, op, chunks, n_ops); - while (n_fail) + /* + * If we had a failure in the ops then we need to walk all the ops + * and set the status in the corresponding frame. This status is + * not set in the case with no failures, as in that case the overall + * frame status is success. + */ + if (n_fail) { - ASSERT (op - ops < n_ops); - - if (op->status != VNET_CRYPTO_OP_STATUS_COMPLETED) + for (int i = 0; i < n_ops; i++) { + ASSERT (op - ops < n_ops); + f->elts[op->user_data].status = op->status; - *state = VNET_CRYPTO_FRAME_STATE_ELT_ERROR; - n_fail--; + op++; } - op++; + *state = VNET_CRYPTO_FRAME_STATE_ELT_ERROR; } } |