cryptodev: move session init out of pool creation
[dpdk.git] / lib / librte_cryptodev / rte_cryptodev.c
index 5aa177f..cf444c0 100644 (file)
@@ -111,11 +111,9 @@ rte_crypto_cipher_algorithm_strings[] = {
        [RTE_CRYPTO_CIPHER_3DES_CTR]    = "3des-ctr",
 
        [RTE_CRYPTO_CIPHER_AES_CBC]     = "aes-cbc",
-       [RTE_CRYPTO_CIPHER_AES_CCM]     = "aes-ccm",
        [RTE_CRYPTO_CIPHER_AES_CTR]     = "aes-ctr",
        [RTE_CRYPTO_CIPHER_AES_DOCSISBPI]       = "aes-docsisbpi",
        [RTE_CRYPTO_CIPHER_AES_ECB]     = "aes-ecb",
-       [RTE_CRYPTO_CIPHER_AES_GCM]     = "aes-gcm",
        [RTE_CRYPTO_CIPHER_AES_F8]      = "aes-f8",
        [RTE_CRYPTO_CIPHER_AES_XTS]     = "aes-xts",
 
@@ -148,9 +146,7 @@ rte_crypto_cipher_operation_strings[] = {
 const char *
 rte_crypto_auth_algorithm_strings[] = {
        [RTE_CRYPTO_AUTH_AES_CBC_MAC]   = "aes-cbc-mac",
-       [RTE_CRYPTO_AUTH_AES_CCM]       = "aes-ccm",
        [RTE_CRYPTO_AUTH_AES_CMAC]      = "aes-cmac",
-       [RTE_CRYPTO_AUTH_AES_GCM]       = "aes-gcm",
        [RTE_CRYPTO_AUTH_AES_GMAC]      = "aes-gmac",
        [RTE_CRYPTO_AUTH_AES_XCBC_MAC]  = "aes-xcbc-mac",
 
@@ -176,6 +172,26 @@ rte_crypto_auth_algorithm_strings[] = {
        [RTE_CRYPTO_AUTH_ZUC_EIA3]      = "zuc-eia3"
 };
 
+/**
+ * The crypto AEAD algorithm strings identifiers.
+ * It could be used in application command line.
+ */
+const char *
+rte_crypto_aead_algorithm_strings[] = {
+       [RTE_CRYPTO_AEAD_AES_CCM]       = "aes-ccm",
+       [RTE_CRYPTO_AEAD_AES_GCM]       = "aes-gcm",
+};
+
+/**
+ * The crypto AEAD operation strings identifiers.
+ * It could be used in application command line.
+ */
+const char *
+rte_crypto_aead_operation_strings[] = {
+       [RTE_CRYPTO_AEAD_OP_ENCRYPT]    = "encrypt",
+       [RTE_CRYPTO_AEAD_OP_DECRYPT]    = "decrypt"
+};
+
 int
 rte_cryptodev_get_cipher_algo_enum(enum rte_crypto_cipher_algorithm *algo_enum,
                const char *algo_string)
@@ -210,6 +226,23 @@ rte_cryptodev_get_auth_algo_enum(enum rte_crypto_auth_algorithm *algo_enum,
        return -1;
 }
 
+int
+rte_cryptodev_get_aead_algo_enum(enum rte_crypto_aead_algorithm *algo_enum,
+               const char *algo_string)
+{
+       unsigned int i;
+
+       for (i = 1; i < RTE_DIM(rte_crypto_aead_algorithm_strings); i++) {
+               if (strcmp(algo_string, rte_crypto_aead_algorithm_strings[i]) == 0) {
+                       *algo_enum = (enum rte_crypto_aead_algorithm) i;
+                       return 0;
+               }
+       }
+
+       /* Invalid string */
+       return -1;
+}
+
 /**
  * The crypto auth operation strings identifiers.
  * It could be used in application command line.
@@ -245,6 +278,10 @@ rte_cryptodev_sym_capability_get(uint8_t dev_id,
                if (idx->type == RTE_CRYPTO_SYM_XFORM_CIPHER &&
                        capability->sym.cipher.algo == idx->algo.cipher)
                        return &capability->sym;
+
+               if (idx->type == RTE_CRYPTO_SYM_XFORM_AEAD &&
+                               capability->sym.aead.algo == idx->algo.aead)
+                       return &capability->sym;
        }
 
        return NULL;
@@ -290,6 +327,26 @@ rte_cryptodev_sym_capability_check_auth(
        return 0;
 }
 
+int
+rte_cryptodev_sym_capability_check_aead(
+               const struct rte_cryptodev_symmetric_capability *capability,
+               uint16_t key_size, uint16_t digest_size, uint16_t aad_size,
+               uint16_t iv_size)
+{
+       if (param_range_check(key_size, capability->aead.key_size))
+               return -1;
+
+       if (param_range_check(digest_size, capability->aead.digest_size))
+               return -1;
+
+       if (param_range_check(aad_size, capability->aead.aad_size))
+               return -1;
+
+       if (param_range_check(iv_size, capability->aead.iv_size))
+               return -1;
+
+       return 0;
+}
 
 const char *
 rte_cryptodev_get_feature_name(uint64_t flag)
@@ -395,12 +452,12 @@ rte_cryptodev_count(void)
 }
 
 uint8_t
-rte_cryptodev_count_devtype(enum rte_cryptodev_type type)
+rte_cryptodev_device_count_by_driver(uint8_t driver_id)
 {
        uint8_t i, dev_count = 0;
 
        for (i = 0; i < rte_cryptodev_globals->max_devs; i++)
-               if (rte_cryptodev_globals->devs[i].dev_type == type &&
+               if (rte_cryptodev_globals->devs[i].driver_id == driver_id &&
                        rte_cryptodev_globals->devs[i].attached ==
                                        RTE_CRYPTODEV_ATTACHED)
                        dev_count++;
@@ -1034,17 +1091,13 @@ rte_cryptodev_pmd_callback_process(struct rte_cryptodev *dev,
 
 static void
 rte_cryptodev_sym_session_init(struct rte_mempool *mp,
-               void *opaque_arg,
-               void *_sess,
-               __rte_unused unsigned i)
+               const struct rte_cryptodev *dev,
+               struct rte_cryptodev_sym_session *sess)
 {
-       struct rte_cryptodev_sym_session *sess = _sess;
-       struct rte_cryptodev *dev = opaque_arg;
-
        memset(sess, 0, mp->elt_size);
 
        sess->dev_id = dev->data->dev_id;
-       sess->dev_type = dev->dev_type;
+       sess->driver_id = dev->driver_id;
        sess->mp = mp;
 
        if (dev->dev_ops->session_initialize)
@@ -1097,8 +1150,7 @@ rte_cryptodev_sym_session_pool_create(struct rte_cryptodev *dev,
                                0, /* private data size */
                                NULL, /* obj initialization constructor */
                                NULL, /* obj initialization constructor arg */
-                               rte_cryptodev_sym_session_init,
-                               /**< obj constructor*/
+                               NULL, /**< obj constructor*/
                                dev, /* obj constructor arg */
                                socket_id, /* socket id */
                                0); /* flags */
@@ -1136,6 +1188,8 @@ rte_cryptodev_sym_session_create(uint8_t dev_id,
 
        sess = _sess;
 
+       rte_cryptodev_sym_session_init(dev->data->session_pool, dev,
+                                       sess);
        RTE_FUNC_PTR_OR_ERR_RET(*dev->dev_ops->session_configure, NULL);
        if (dev->dev_ops->session_configure(dev, xform, sess->_private) ==
                        NULL) {
@@ -1211,7 +1265,7 @@ rte_cryptodev_sym_session_free(uint8_t dev_id,
        dev = &rte_crypto_devices[dev_id];
 
        /* Check the session belongs to this device type */
-       if (sess->dev_type != dev->dev_type)
+       if (sess->driver_id != dev->driver_id)
                return sess;
 
        /* Let device implementation clear session material */
@@ -1323,3 +1377,60 @@ rte_cryptodev_pmd_create_dev_name(char *name, const char *dev_name_prefix)
 
        return -1;
 }
+
+TAILQ_HEAD(cryptodev_driver_list, cryptodev_driver);
+
+static struct cryptodev_driver_list cryptodev_driver_list =
+       TAILQ_HEAD_INITIALIZER(cryptodev_driver_list);
+
+struct cryptodev_driver {
+       TAILQ_ENTRY(cryptodev_driver) next; /**< Next in list. */
+       const struct rte_driver *driver;
+       uint8_t id;
+};
+
+static uint8_t nb_drivers;
+
+int
+rte_cryptodev_driver_id_get(const char *name)
+{
+       struct cryptodev_driver *driver;
+       const char *driver_name;
+
+       if (name == NULL) {
+               RTE_LOG(DEBUG, CRYPTODEV, "name pointer NULL");
+               return -1;
+       }
+
+       TAILQ_FOREACH(driver, &cryptodev_driver_list, next) {
+               driver_name = driver->driver->name;
+               if (strncmp(driver_name, name, strlen(driver_name)) == 0)
+                       return driver->id;
+       }
+       return -1;
+}
+
+const char *
+rte_cryptodev_driver_name_get(uint8_t driver_id)
+{
+       struct cryptodev_driver *driver;
+
+       TAILQ_FOREACH(driver, &cryptodev_driver_list, next)
+               if (driver->id == driver_id)
+                       return driver->driver->name;
+       return NULL;
+}
+
+uint8_t
+rte_cryptodev_allocate_driver(const struct rte_driver *drv)
+{
+       struct cryptodev_driver *driver;
+
+       driver = malloc(sizeof(*driver));
+       driver->driver = drv;
+       driver->id = nb_drivers;
+
+       TAILQ_INSERT_TAIL(&cryptodev_driver_list, driver, next);
+
+       return nb_drivers++;
+}