dpdk-cryptodev: sync mbuf length with corresponding vlib buffer
[vpp.git] / src / plugins / dpdk / cryptodev / cryptodev_op_data_path.c
index 66c0c16..4d3e00a 100644 (file)
@@ -66,6 +66,23 @@ cryptodev_get_iova (clib_pmalloc_main_t *pm, enum rte_iova_mode mode,
   return pointer_to_uword (data) - pm->lookup_table[index];
 }
 
+static_always_inline void
+cryptodev_validate_mbuf (struct rte_mbuf *mb, vlib_buffer_t *b)
+{
+  /* on vnet side vlib_buffer current_length is updated by cipher padding and
+   * icv_sh. mbuf needs to be sync with these changes */
+  u16 data_len = b->current_length +
+                (b->data + b->current_data - rte_pktmbuf_mtod (mb, u8 *));
+
+  /* for input nodes that are not dpdk-input, it is possible the mbuf
+   * was updated before as one of the chained mbufs. Setting nb_segs
+   * to 1 here to prevent the cryptodev PMD to access potentially
+   * invalid m_src->next pointers.
+   */
+  mb->nb_segs = 1;
+  mb->pkt_len = mb->data_len = data_len;
+}
+
 static_always_inline void
 cryptodev_validate_mbuf_chain (vlib_main_t *vm, struct rte_mbuf *mb,
                               vlib_buffer_t *b)
@@ -140,7 +157,8 @@ cryptodev_frame_linked_algs_enqueue (vlib_main_t *vm,
   if (PREDICT_FALSE (CRYPTODEV_NB_CRYPTO_OPS - cet->inflight < n_elts))
     {
       cryptodev_mark_frame_err_status (frame,
-                                      VNET_CRYPTO_OP_STATUS_FAIL_ENGINE_ERR);
+                                      VNET_CRYPTO_OP_STATUS_FAIL_ENGINE_ERR,
+                                      VNET_CRYPTO_FRAME_STATE_NOT_PROCESSED);
       return -1;
     }
 
@@ -148,7 +166,8 @@ cryptodev_frame_linked_algs_enqueue (vlib_main_t *vm,
        rte_mempool_get_bulk (cet->cop_pool, (void **) cet->cops, n_elts) < 0))
     {
       cryptodev_mark_frame_err_status (frame,
-                                      VNET_CRYPTO_OP_STATUS_FAIL_ENGINE_ERR);
+                                      VNET_CRYPTO_OP_STATUS_FAIL_ENGINE_ERR,
+                                      VNET_CRYPTO_FRAME_STATE_NOT_PROCESSED);
       return -1;
     }
 
@@ -184,7 +203,8 @@ cryptodev_frame_linked_algs_enqueue (vlib_main_t *vm,
                    cryptodev_session_create (vm, last_key_index, 0) < 0))
                {
                  cryptodev_mark_frame_err_status (
-                   frame, VNET_CRYPTO_OP_STATUS_FAIL_ENGINE_ERR);
+                   frame, VNET_CRYPTO_OP_STATUS_FAIL_ENGINE_ERR,
+                   VNET_CRYPTO_FRAME_STATE_NOT_PROCESSED);
                  return -1;
                }
            }
@@ -215,12 +235,8 @@ cryptodev_frame_linked_algs_enqueue (vlib_main_t *vm,
       if (PREDICT_FALSE (fe->flags & VNET_CRYPTO_OP_FLAG_CHAINED_BUFFERS))
        cryptodev_validate_mbuf_chain (vm, sop->m_src, b);
       else
-       /* for input nodes that are not dpdk-input, it is possible the mbuf
-        * was updated before as one of the chained mbufs. Setting nb_segs
-        * to 1 here to prevent the cryptodev PMD to access potentially
-        * invalid m_src->next pointers.
-        */
-       sop->m_src->nb_segs = 1;
+       cryptodev_validate_mbuf (sop->m_src, b);
+
       clib_memcpy_fast (cop[0]->iv, fe->iv, 16);
       cop++;
       bi++;
@@ -259,7 +275,8 @@ cryptodev_frame_aead_enqueue (vlib_main_t *vm,
   if (PREDICT_FALSE (CRYPTODEV_MAX_INFLIGHT - cet->inflight < n_elts))
     {
       cryptodev_mark_frame_err_status (frame,
-                                      VNET_CRYPTO_OP_STATUS_FAIL_ENGINE_ERR);
+                                      VNET_CRYPTO_OP_STATUS_FAIL_ENGINE_ERR,
+                                      VNET_CRYPTO_FRAME_STATE_NOT_PROCESSED);
       return -1;
     }
 
@@ -267,7 +284,8 @@ cryptodev_frame_aead_enqueue (vlib_main_t *vm,
        rte_mempool_get_bulk (cet->cop_pool, (void **) cet->cops, n_elts) < 0))
     {
       cryptodev_mark_frame_err_status (frame,
-                                      VNET_CRYPTO_OP_STATUS_FAIL_ENGINE_ERR);
+                                      VNET_CRYPTO_OP_STATUS_FAIL_ENGINE_ERR,
+                                      VNET_CRYPTO_FRAME_STATE_NOT_PROCESSED);
       return -1;
     }
 
@@ -301,7 +319,8 @@ cryptodev_frame_aead_enqueue (vlib_main_t *vm,
                                                           aad_len) < 0))
                {
                  cryptodev_mark_frame_err_status (
-                   frame, VNET_CRYPTO_OP_STATUS_FAIL_ENGINE_ERR);
+                   frame, VNET_CRYPTO_OP_STATUS_FAIL_ENGINE_ERR,
+                   VNET_CRYPTO_FRAME_STATE_NOT_PROCESSED);
                  return -1;
                }
            }
@@ -320,7 +339,8 @@ cryptodev_frame_aead_enqueue (vlib_main_t *vm,
                                                           aad_len) < 0))
                {
                  cryptodev_mark_frame_err_status (
-                   frame, VNET_CRYPTO_OP_STATUS_FAIL_ENGINE_ERR);
+                   frame, VNET_CRYPTO_OP_STATUS_FAIL_ENGINE_ERR,
+                   VNET_CRYPTO_FRAME_STATE_NOT_PROCESSED);
                  return -1;
                }
            }
@@ -352,12 +372,8 @@ cryptodev_frame_aead_enqueue (vlib_main_t *vm,
       if (PREDICT_FALSE (fe->flags & VNET_CRYPTO_OP_FLAG_CHAINED_BUFFERS))
        cryptodev_validate_mbuf_chain (vm, sop->m_src, b);
       else
-       /* for input nodes that are not dpdk-input, it is possible the mbuf
-        * was updated before as one of the chained mbufs. Setting nb_segs
-        * to 1 here to prevent the cryptodev PMD to access potentially
-        * invalid m_src->next pointers.
-        */
-       sop->m_src->nb_segs = 1;
+       cryptodev_validate_mbuf (sop->m_src, b);
+
       clib_memcpy_fast (cop[0]->iv, fe->iv, 12);
       clib_memcpy_fast (cop[0]->aad, fe->aad, aad_len);
       cop++;