cryptodev: add AEAD specific data
[dpdk.git] / lib / librte_cryptodev / rte_cryptodev.c
index c0cfe94..60dc5e5 100644 (file)
@@ -47,7 +47,6 @@
 #include <rte_debug.h>
 #include <rte_dev.h>
 #include <rte_interrupts.h>
-#include <rte_pci.h>
 #include <rte_memory.h>
 #include <rte_memcpy.h>
 #include <rte_memzone.h>
@@ -177,6 +176,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)
@@ -211,6 +230,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.
@@ -246,6 +282,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;
@@ -273,7 +313,8 @@ rte_cryptodev_sym_capability_check_cipher(
 int
 rte_cryptodev_sym_capability_check_auth(
                const struct rte_cryptodev_symmetric_capability *capability,
-               uint16_t key_size, uint16_t digest_size, uint16_t aad_size)
+               uint16_t key_size, uint16_t digest_size, uint16_t aad_size,
+               uint16_t iv_size)
 {
        if (param_range_check(key_size, capability->auth.key_size))
                return -1;
@@ -284,9 +325,32 @@ rte_cryptodev_sym_capability_check_auth(
        if (param_range_check(aad_size, capability->auth.aad_size))
                return -1;
 
+       if (param_range_check(iv_size, capability->auth.iv_size))
+               return -1;
+
        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)
@@ -541,114 +605,15 @@ rte_cryptodev_pmd_release_device(struct rte_cryptodev *cryptodev)
        if (cryptodev == NULL)
                return -EINVAL;
 
-       ret = rte_cryptodev_close(cryptodev->data->dev_id);
-       if (ret < 0)
-               return ret;
-
-       cryptodev->attached = RTE_CRYPTODEV_DETACHED;
-       cryptodev_globals.nb_devs--;
-       return 0;
-}
-
-int
-rte_cryptodev_pci_probe(struct rte_pci_driver *pci_drv,
-                       struct rte_pci_device *pci_dev)
-{
-       struct rte_cryptodev_driver *cryptodrv;
-       struct rte_cryptodev *cryptodev;
-
-       char cryptodev_name[RTE_CRYPTODEV_NAME_MAX_LEN];
-
-       int retval;
-
-       cryptodrv = (struct rte_cryptodev_driver *)pci_drv;
-       if (cryptodrv == NULL)
-               return -ENODEV;
-
-       rte_pci_device_name(&pci_dev->addr, cryptodev_name,
-                       sizeof(cryptodev_name));
-
-       cryptodev = rte_cryptodev_pmd_allocate(cryptodev_name, rte_socket_id());
-       if (cryptodev == NULL)
-               return -ENOMEM;
-
-       if (rte_eal_process_type() == RTE_PROC_PRIMARY) {
-               cryptodev->data->dev_private =
-                               rte_zmalloc_socket(
-                                               "cryptodev private structure",
-                                               cryptodrv->dev_private_size,
-                                               RTE_CACHE_LINE_SIZE,
-                                               rte_socket_id());
-
-               if (cryptodev->data->dev_private == NULL)
-                       rte_panic("Cannot allocate memzone for private "
-                                       "device data");
+       /* Close device only if device operations have been set */
+       if (cryptodev->dev_ops) {
+               ret = rte_cryptodev_close(cryptodev->data->dev_id);
+               if (ret < 0)
+                       return ret;
        }
 
-       cryptodev->device = &pci_dev->device;
-       cryptodev->driver = cryptodrv;
-
-       /* init user callbacks */
-       TAILQ_INIT(&(cryptodev->link_intr_cbs));
-
-       /* Invoke PMD device initialization function */
-       retval = (*cryptodrv->cryptodev_init)(cryptodrv, cryptodev);
-       if (retval == 0)
-               return 0;
-
-       CDEV_LOG_ERR("driver %s: crypto_dev_init(vendor_id=0x%x device_id=0x%x)"
-                       " failed", pci_drv->driver.name,
-                       (unsigned) pci_dev->id.vendor_id,
-                       (unsigned) pci_dev->id.device_id);
-
-       if (rte_eal_process_type() == RTE_PROC_PRIMARY)
-               rte_free(cryptodev->data->dev_private);
-
        cryptodev->attached = RTE_CRYPTODEV_DETACHED;
        cryptodev_globals.nb_devs--;
-
-       return -ENXIO;
-}
-
-int
-rte_cryptodev_pci_remove(struct rte_pci_device *pci_dev)
-{
-       const struct rte_cryptodev_driver *cryptodrv;
-       struct rte_cryptodev *cryptodev;
-       char cryptodev_name[RTE_CRYPTODEV_NAME_MAX_LEN];
-       int ret;
-
-       if (pci_dev == NULL)
-               return -EINVAL;
-
-       rte_pci_device_name(&pci_dev->addr, cryptodev_name,
-                       sizeof(cryptodev_name));
-
-       cryptodev = rte_cryptodev_pmd_get_named_dev(cryptodev_name);
-       if (cryptodev == NULL)
-               return -ENODEV;
-
-       cryptodrv = (const struct rte_cryptodev_driver *)pci_dev->driver;
-       if (cryptodrv == NULL)
-               return -ENODEV;
-
-       /* Invoke PMD device uninit function */
-       if (*cryptodrv->cryptodev_uninit) {
-               ret = (*cryptodrv->cryptodev_uninit)(cryptodrv, cryptodev);
-               if (ret)
-                       return ret;
-       }
-
-       /* free crypto device */
-       rte_cryptodev_pmd_release_device(cryptodev);
-
-       if (rte_eal_process_type() == RTE_PROC_PRIMARY)
-               rte_free(cryptodev->data->dev_private);
-
-       cryptodev->device = NULL;
-       cryptodev->driver = NULL;
-       cryptodev->data = NULL;
-
        return 0;
 }
 
@@ -881,8 +846,8 @@ rte_cryptodev_stop(uint8_t dev_id)
                return;
        }
 
-       dev->data->dev_started = 0;
        (*dev->dev_ops->dev_stop)(dev);
+       dev->data->dev_started = 0;
 }
 
 int