ethdev: promote API to set packet types
[dpdk.git] / examples / fips_validation / fips_dev_self_test.c
index ac366cb..b4eab05 100644 (file)
@@ -3,13 +3,14 @@
  */
 
 #include <rte_cryptodev.h>
-#include <rte_cryptodev_pmd.h>
+#include <rte_malloc.h>
 
 #include "fips_dev_self_test.h"
 
 #define IV_OFF (sizeof(struct rte_crypto_op) + sizeof(struct rte_crypto_sym_op))
 
 #define FIPS_DEV_TEST_DATA_MAX_SIZE    8096
+#define AES_CCM_AAD_PAD_SIZE           18
 
 struct fips_dev_self_test_vector {
        const char *name;
@@ -1236,6 +1237,8 @@ prepare_auth_op(struct rte_crypto_op *op,
        memcpy(dst, vec->input.data, vec->input.len);
        sym->auth.data.length = vec->input.len;
        sym->auth.digest.data = dst + vec->input.len;
+       sym->auth.digest.phys_addr = rte_pktmbuf_iova_offset(mbuf,
+                       vec->input.len);
 
        if (dir == self_test_dir_dec_auth_verify)
                memcpy(dst + vec->input.len, vec->digest.data, vec->digest.len);
@@ -1277,7 +1280,8 @@ prepare_aead_op(struct rte_crypto_op *op,
                return -ENOMEM;
        }
 
-       dst = (uint8_t *)rte_pktmbuf_append(mbuf, len + vec->digest.len);
+       dst = (uint8_t *)rte_pktmbuf_append(mbuf, RTE_ALIGN_CEIL(len +
+                       vec->digest.len, 16));
        if (!dst) {
                RTE_LOG(ERR, PMD, "Error %i: MBUF too small\n", -ENOMEM);
                return -ENOMEM;
@@ -1286,13 +1290,33 @@ prepare_aead_op(struct rte_crypto_op *op,
        sym->m_src = mbuf;
        sym->aead.data.length = len;
        sym->aead.data.offset = 0;
-       sym->aead.aad.data = vec->aead.aad.data;
-       sym->aead.digest.data = dst + vec->input.len;
        memcpy(dst, src, len);
 
+       sym->aead.digest.data = dst + vec->input.len;
+       sym->aead.digest.phys_addr = rte_pktmbuf_iova_offset(mbuf,
+                       vec->input.len);
        if (dir == self_test_dir_dec_auth_verify)
                memcpy(sym->aead.digest.data, vec->digest.data, vec->digest.len);
 
+       len = (vec->aead.algo == RTE_CRYPTO_AEAD_AES_CCM) ?
+                       (vec->aead.aad.len + AES_CCM_AAD_PAD_SIZE) :
+                       vec->aead.aad.len;
+
+       dst = rte_malloc(NULL, len, 16);
+       if (!dst) {
+               RTE_LOG(ERR, PMD, "Error %i: Not enough memory\n", -ENOMEM);
+               return -ENOMEM;
+       }
+
+       sym->aead.aad.data = dst;
+       sym->aead.aad.phys_addr = rte_malloc_virt2iova(dst);
+       if (vec->aead.algo == RTE_CRYPTO_AEAD_AES_CCM)
+               memcpy(dst, vec->aead.aad.data,
+                               vec->aead.aad.len + AES_CCM_AAD_PAD_SIZE);
+       else
+               memcpy(dst, vec->aead.aad.data,
+                               vec->aead.aad.len);
+
        rte_crypto_op_attach_sym_session(op, session);
 
        return 0;
@@ -1309,6 +1333,9 @@ check_cipher_result(struct rte_crypto_op *op,
        uint32_t len, src_len;
        int ret;
 
+       if (!mbuf)
+               return -1;
+
        if (dir == self_test_dir_enc_auth_gen) {
                src = vec->output.data;
                src_len = vec->output.len;
@@ -1318,7 +1345,7 @@ check_cipher_result(struct rte_crypto_op *op,
        }
 
        GET_MBUF_DATA(data, len, mbuf);
-       if (len != src_len)
+       if (!len)
                return -1;
 
        ret = memcmp(data, src, src_len);
@@ -1338,8 +1365,11 @@ check_auth_result(struct rte_crypto_op *op,
        uint32_t len;
        int ret;
 
+       if (mbuf == NULL)
+               return -1;
+
        GET_MBUF_DATA(data, len, mbuf);
-       if (len != vec->input.len + vec->digest.len)
+       if (!len)
                return -1;
 
        if (dir == self_test_dir_enc_auth_gen) {
@@ -1363,6 +1393,12 @@ check_aead_result(struct rte_crypto_op *op,
        uint32_t len, src_len;
        int ret;
 
+       if (!mbuf)
+               return -1;
+
+       if (op->sym->aead.aad.data)
+               rte_free(op->sym->aead.aad.data);
+
        if (dir == self_test_dir_enc_auth_gen) {
                src = vec->output.data;
                src_len = vec->output.len;
@@ -1372,7 +1408,7 @@ check_aead_result(struct rte_crypto_op *op,
        }
 
        GET_MBUF_DATA(data, len, mbuf);
-       if (len != src_len + vec->digest.len)
+       if (!len)
                return -1;
 
        ret = memcmp(data, src, src_len);
@@ -1487,12 +1523,6 @@ static void
 fips_dev_auto_test_uninit(uint8_t dev_id,
                struct fips_dev_auto_test_env *env)
 {
-       struct rte_cryptodev *dev = rte_cryptodev_pmd_get_dev(dev_id);
-       uint32_t i;
-
-       if (!dev)
-               return;
-
        if (env->mbuf)
                rte_pktmbuf_free(env->mbuf);
        if (env->op)
@@ -1506,27 +1536,22 @@ fips_dev_auto_test_uninit(uint8_t dev_id,
        if (env->sess_priv_pool)
                rte_mempool_free(env->sess_priv_pool);
 
-       if (dev->data->dev_started)
-               rte_cryptodev_stop(dev_id);
-
-       if (dev->data->nb_queue_pairs) {
-               for (i = 0; i < dev->data->nb_queue_pairs; i++)
-                       (*dev->dev_ops->queue_pair_release)(dev, i);
-               dev->data->nb_queue_pairs = 0;
-               rte_free(dev->data->queue_pairs);
-               dev->data->queue_pairs = NULL;
-       }
+       rte_cryptodev_stop(dev_id);
 }
 
 static int
 fips_dev_auto_test_init(uint8_t dev_id, struct fips_dev_auto_test_env *env)
 {
-       struct rte_cryptodev_config conf = {rte_cryptodev_socket_id(dev_id), 1};
        struct rte_cryptodev_qp_conf qp_conf = {128, NULL, NULL};
        uint32_t sess_sz = rte_cryptodev_sym_get_private_session_size(dev_id);
+       struct rte_cryptodev_config conf;
        char name[128];
        int ret;
 
+       conf.socket_id = rte_cryptodev_socket_id(dev_id);
+       conf.nb_queue_pairs = 1;
+       conf.ff_disable = 0;
+
        ret = rte_cryptodev_configure(dev_id, &conf);
        if (ret < 0)
                return ret;