From 07ba8ae1b292225b2a72798699a1ccba59c1fc3e Mon Sep 17 00:00:00 2001 From: Nithinsen Kaithakadan Date: Thu, 16 Jan 2025 12:56:09 +0530 Subject: octeon: fix for async crypto session init This patch resolves segmentation fault that occurs during the initialization of an asynchronous crypto session when processing the first packet in the data path. And resolves compilation failures. Type: fix Change-Id: I60e4060c65741a445fe02f01b3c94f627534ecef Signed-off-by: Nithinsen Kaithakadan --- src/plugins/dev_octeon/crypto.c | 24 +++++++++++++++--------- src/plugins/dev_octeon/crypto.h | 2 +- 2 files changed, 16 insertions(+), 10 deletions(-) (limited to 'src/plugins') diff --git a/src/plugins/dev_octeon/crypto.c b/src/plugins/dev_octeon/crypto.c index df6670e2eab..7333da1119e 100644 --- a/src/plugins/dev_octeon/crypto.c +++ b/src/plugins/dev_octeon/crypto.c @@ -1181,7 +1181,7 @@ oct_crypto_link_session_update (vlib_main_t *vm, oct_crypto_sess_t *sess, key = vnet_crypto_get_key (key_index); - switch (key->async_alg) + switch (key->alg) { case VNET_CRYPTO_ALG_AES_128_CBC_SHA1_TAG12: case VNET_CRYPTO_ALG_AES_192_CBC_SHA1_TAG12: @@ -1264,8 +1264,8 @@ oct_crypto_link_session_update (vlib_main_t *vm, oct_crypto_sess_t *sess, break; default: clib_warning ( - "Cryptodev: Undefined link algo %u specified. Key index %u", - key->async_alg, key_index); + "Cryptodev: Undefined link algo %u specified. Key index %u", key->alg, + key_index); return -1; } @@ -1279,7 +1279,7 @@ oct_crypto_link_session_update (vlib_main_t *vm, oct_crypto_sess_t *sess, crypto_key = vnet_crypto_get_key (key->index_crypto); rv = roc_se_ciph_key_set (&sess->cpt_ctx, enc_type, crypto_key->data, - vec_len (crypto_key->data)); + crypto_key->length); if (rv) { clib_warning ("Cryptodev: Error in setting cipher key for enc type %u", @@ -1290,7 +1290,7 @@ oct_crypto_link_session_update (vlib_main_t *vm, oct_crypto_sess_t *sess, auth_key = vnet_crypto_get_key (key->index_integ); rv = roc_se_auth_key_set (&sess->cpt_ctx, auth_type, auth_key->data, - vec_len (auth_key->data), digest_len); + auth_key->length, digest_len); if (rv) { clib_warning ("Cryptodev: Error in setting auth key for auth type %u", @@ -1311,7 +1311,7 @@ oct_crypto_aead_session_update (vlib_main_t *vm, oct_crypto_sess_t *sess, u32 digest_len = ~0; i32 rv = 0; - switch (key->async_alg) + switch (key->alg) { case VNET_CRYPTO_ALG_AES_128_GCM: case VNET_CRYPTO_ALG_AES_192_GCM: @@ -1331,7 +1331,7 @@ oct_crypto_aead_session_update (vlib_main_t *vm, oct_crypto_sess_t *sess, default: clib_warning ( "Cryptodev: Undefined cipher algo %u specified. Key index %u", - key->async_alg, key_index); + key->alg, key_index); return -1; } @@ -1422,7 +1422,7 @@ oct_crypto_enqueue_enc_dec (vlib_main_t *vm, vnet_crypto_async_frame_t *frame, oct_crypto_key_t *key; vlib_buffer_t *buffer; u16 adj_len; - int ret; + int ret = 0; /* GCM packets having 8 bytes of aad and 8 bytes of iv */ u8 aad_iv = 8 + 8; @@ -1458,7 +1458,13 @@ oct_crypto_enqueue_enc_dec (vlib_main_t *vm, vnet_crypto_async_frame_t *frame, sess = key->sess; if (PREDICT_FALSE (!sess->initialised)) - oct_crypto_session_init (vm, sess, elts->key_index, type); + ret = oct_crypto_session_init (vm, sess, elts->key_index, type); + if (ret) + { + oct_crypto_update_frame_error_status ( + frame, i, VNET_CRYPTO_OP_STATUS_FAIL_ENGINE_ERR); + return -1; + } crypto_dev = sess->crypto_dev; diff --git a/src/plugins/dev_octeon/crypto.h b/src/plugins/dev_octeon/crypto.h index 0a3b796d3dd..bee2db8f9ed 100644 --- a/src/plugins/dev_octeon/crypto.h +++ b/src/plugins/dev_octeon/crypto.h @@ -143,7 +143,7 @@ typedef struct typedef struct { oct_crypto_dev_t *crypto_dev[OCT_MAX_N_CPT_DEV]; - oct_crypto_key_t *keys[VNET_CRYPTO_ASYNC_OP_N_TYPES]; + oct_crypto_key_t *keys[VNET_CRYPTO_OP_N_TYPES]; oct_crypto_pending_queue_t *pend_q; int n_cpt; u8 started; -- cgit