octeon: fix for async crypto session init 53/42153/7
authorNithinsen Kaithakadan <[email protected]>
Thu, 16 Jan 2025 07:26:09 +0000 (12:56 +0530)
committerDamjan Marion <[email protected]>
Tue, 21 Jan 2025 12:58:20 +0000 (12:58 +0000)
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 <[email protected]>
src/plugins/dev_octeon/crypto.c
src/plugins/dev_octeon/crypto.h

index df6670e..7333da1 100644 (file)
@@ -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;
 
index 0a3b796..bee2db8 100644 (file)
@@ -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;