[dpdk-dev] [PATCH v3 1/2] cryptodev: add functions to retrieve device info
Trahe, Fiona
fiona.trahe at intel.com
Wed Jan 11 16:21:45 CET 2017
Hi Slawomir
> -----Original Message-----
> From: dev [mailto:dev-bounces at dpdk.org] On Behalf Of Slawomir Mrozowicz
> Sent: Wednesday, January 11, 2017 4:07 PM
> To: dev at dpdk.org
> Cc: Mrozowicz, SlawomirX <slawomirx.mrozowicz at intel.com>; Doherty,
> Declan <declan.doherty at intel.com>; Kerlin, Marcin
> <marcin.kerlin at intel.com>
> Subject: [dpdk-dev] [PATCH v3 1/2] cryptodev: add functions to retrieve device
> info
>
> This patch adds helper functions for new performance application which
> provide identifiers and number of crypto device and
> provide and check capabilities available for defined device and algorithm.
> The performance application can be used to measure throughput and latency
> of cryptography operation performed by crypto device.
>
> Signed-off-by: Declan Doherty <declan.doherty at intel.com>
> Signed-off-by: Slawomir Mrozowicz <slawomirx.mrozowicz at intel.com>
> Signed-off-by: Marcin Kerlin <marcinx.kerlin at intel.com>
> ---
> To be applied on top of:
> [dpdk-dev,v4] crypto/aesni_gcm: migration from MB library to ISA-L
>
> v2 changes:
> - code style fix
> - add information in version.map about changes
>
> v3 changes:
> - title of the cryptodev patch
> - supply information in version.map about changes
> ---
> lib/librte_cryptodev/rte_crypto_sym.h | 16 +++
> lib/librte_cryptodev/rte_cryptodev.c | 181
> +++++++++++++++++++++++++
> lib/librte_cryptodev/rte_cryptodev.h | 120 +++++++++-------
> lib/librte_cryptodev/rte_cryptodev_version.map | 14 ++
> 4 files changed, 285 insertions(+), 46 deletions(-)
>
> diff --git a/lib/librte_cryptodev/rte_crypto_sym.h
> b/lib/librte_cryptodev/rte_crypto_sym.h
> index 0e20b30..c782588 100644
> --- a/lib/librte_cryptodev/rte_crypto_sym.h
> +++ b/lib/librte_cryptodev/rte_crypto_sym.h
> @@ -112,6 +112,10 @@ enum rte_crypto_cipher_algorithm {
>
> };
>
> +/** Cipher algorithm name strings */
> +extern const char *
> +rte_crypto_cipher_algorithm_strings[];
> +
> /** Symmetric Cipher Direction */
> enum rte_crypto_cipher_operation {
> RTE_CRYPTO_CIPHER_OP_ENCRYPT,
> @@ -120,6 +124,10 @@ enum rte_crypto_cipher_operation {
> /**< Decrypt cipher operation */
> };
>
> +/** Cipher operation name strings */
> +extern const char *
> +rte_crypto_cipher_operation_strings[];
> +
> /**
> * Symmetric Cipher Setup Data.
> *
> @@ -245,12 +253,20 @@ enum rte_crypto_auth_algorithm {
> RTE_CRYPTO_AUTH_LIST_END
> };
>
> +/** Authentication algorithm name strings */
> +extern const char *
> +rte_crypto_auth_algorithm_strings[];
> +
> /** Symmetric Authentication / Hash Operations */
> enum rte_crypto_auth_operation {
> RTE_CRYPTO_AUTH_OP_VERIFY, /**< Verify authentication
> digest */
> RTE_CRYPTO_AUTH_OP_GENERATE /**< Generate authentication
> digest */
> };
>
> +/** Authentication operation name strings */
> +extern const char *
> +rte_crypto_auth_operation_strings[];
> +
> /**
> * Authentication / Hash transform data.
> *
> diff --git a/lib/librte_cryptodev/rte_cryptodev.c
> b/lib/librte_cryptodev/rte_cryptodev.c
> index bbab4b3..c126b1b 100644
> --- a/lib/librte_cryptodev/rte_cryptodev.c
> +++ b/lib/librte_cryptodev/rte_cryptodev.c
> @@ -111,6 +111,86 @@ static const char *cryptodev_vdev_valid_params[] =
> {
> RTE_CRYPTODEV_VDEV_SOCKET_ID
> };
>
> +/**
> + * The crypto cipher algorithm strings identifiers.
> + * It could be used in application command line.
> + */
> +const char *
> +rte_crypto_cipher_algorithm_strings[] = {
> + [RTE_CRYPTO_CIPHER_3DES_CBC] = "3des-cbc",
> + [RTE_CRYPTO_CIPHER_3DES_ECB] = "3des-ecb",
> + [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_ECB] = "aes-ecb",
> + [RTE_CRYPTO_CIPHER_AES_GCM] = "aes-gcm",
> + [RTE_CRYPTO_CIPHER_AES_F8] = "aes-f8",
> + [RTE_CRYPTO_CIPHER_AES_XTS] = "aes-xts",
> +
> + [RTE_CRYPTO_CIPHER_ARC4] = "arc4",
> +
> + [RTE_CRYPTO_CIPHER_NULL] = "null",
> +
> + [RTE_CRYPTO_CIPHER_KASUMI_F8] = "kasumi-f8",
> + [RTE_CRYPTO_CIPHER_SNOW3G_UEA2] = "snow3g-uea2",
> + [RTE_CRYPTO_CIPHER_ZUC_EEA3] = "zuc-eea3"
> +};
> +
> +/**
> + * The crypto cipher operation strings identifiers.
> + * It could be used in application command line.
> + */
> +const char *
> +rte_crypto_cipher_operation_strings[] = {
> + [RTE_CRYPTO_CIPHER_OP_ENCRYPT] = "encrypt",
> + [RTE_CRYPTO_CIPHER_OP_DECRYPT] = "decrypt"
> +};
> +
> +/**
> + * The crypto auth algorithm strings identifiers.
> + * It could be used in application command line.
> + */
> +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",
> +
> + [RTE_CRYPTO_AUTH_MD5] = "md5",
> + [RTE_CRYPTO_AUTH_MD5_HMAC] = "md5-hmac",
> +
> + [RTE_CRYPTO_AUTH_SHA1] = "sha1",
> + [RTE_CRYPTO_AUTH_SHA1_HMAC] = "sha1-hmac",
> +
> + [RTE_CRYPTO_AUTH_SHA224] = "sha2-224",
> + [RTE_CRYPTO_AUTH_SHA224_HMAC] = "sha2-224-hmac",
> + [RTE_CRYPTO_AUTH_SHA256] = "sha2-256",
> + [RTE_CRYPTO_AUTH_SHA256_HMAC] = "sha2-256-hmac",
> + [RTE_CRYPTO_AUTH_SHA384] = "sha2-384",
> + [RTE_CRYPTO_AUTH_SHA384_HMAC] = "sha2-384-hmac",
> + [RTE_CRYPTO_AUTH_SHA512] = "sha2-512",
> + [RTE_CRYPTO_AUTH_SHA512_HMAC] = "sha2-512-hmac",
> +
> + [RTE_CRYPTO_AUTH_KASUMI_F9] = "kasumi-f9",
> + [RTE_CRYPTO_AUTH_SNOW3G_UIA2] = "snow3g-uia2",
> + [RTE_CRYPTO_AUTH_ZUC_EIA3] = "zuc-eia3"
> +};
> +
> +/**
> + * The crypto auth operation strings identifiers.
> + * It could be used in application command line.
> + */
> +const char *
> +rte_crypto_auth_operation_strings[] = {
> + [RTE_CRYPTO_AUTH_OP_VERIFY] = "verify",
> + [RTE_CRYPTO_AUTH_OP_GENERATE] = "generate"
> +};
> +
> static uint8_t
> number_of_sockets(void)
> {
> @@ -191,6 +271,73 @@ rte_cryptodev_parse_vdev_init_params(struct
> rte_crypto_vdev_init_params *params,
> return ret;
> }
>
> +const struct rte_cryptodev_symmetric_capability *
> +rte_cryptodev_capability_get(uint8_t dev_id,
> + const struct rte_cryptodev_capability_idx *idx)
It would be better to call this rte_cryptodev_sym_capability_get() to allow for other capability types in future. OR pass in rte_crypto_op_type as a parameter or in the idx struct.
> +{
> + const struct rte_cryptodev_capabilities *capability;
> + struct rte_cryptodev_info dev_info;
> + int i = 0;
> +
> + rte_cryptodev_info_get(dev_id, &dev_info);
> +
> + while ((capability = &dev_info.capabilities[i++])->op !=
> + RTE_CRYPTO_OP_TYPE_UNDEFINED) {
> + if (capability->op != RTE_CRYPTO_OP_TYPE_SYMMETRIC)
> + continue;
> +
> + if (capability->sym.xform_type != idx->type)
> + continue;
> +
> + if (idx->type == RTE_CRYPTO_SYM_XFORM_AUTH &&
> + capability->sym.auth.algo == idx->algo.auth)
> + return &capability->sym;
> +
> + if (idx->type == RTE_CRYPTO_SYM_XFORM_CIPHER &&
> + capability->sym.cipher.algo == idx->algo.cipher)
> + return &capability->sym;
> + }
> +
> + return NULL;
> +
> +}
> +
> +#define param_range_check(x, y) \
> + (((x < y.min) || (x > y.max)) || \
> + (y.increment != 0 && (x % y.increment) != 0))
> +
> +int
> +rte_cryptodev_capability_check_cipher(
> + const struct rte_cryptodev_symmetric_capability *capability,
> + uint16_t key_size, uint16_t iv_size)
> +{
> + if (param_range_check(key_size, capability->cipher.key_size))
> + return -1;
> +
> + if (param_range_check(iv_size, capability->cipher.iv_size))
> + return -1;
> +
> + return 0;
> +}
> +
> +int
> +rte_cryptodev_capability_check_auth(
> + const struct rte_cryptodev_symmetric_capability *capability,
> + uint16_t key_size, uint16_t digest_size, uint16_t aad_size)
> +{
> + if (param_range_check(key_size, capability->auth.key_size))
> + return -1;
> +
> + if (param_range_check(digest_size, capability->auth.digest_size))
> + return -1;
> +
> + if (param_range_check(aad_size, capability->auth.aad_size))
> + return -1;
> +
> + return 0;
> +}
> +
> +
> const char *
> rte_cryptodev_get_feature_name(uint64_t flag)
> {
> @@ -263,6 +410,40 @@ rte_cryptodev_count_devtype(enum
> rte_cryptodev_type type)
> }
>
> int
> +rte_cryptodev_devices_get(const char *dev_name, uint8_t *devices,
> + uint8_t nb_devices)
> +{
> + uint8_t i, cmp, count = 0;
> + struct rte_cryptodev **devs = &rte_cryptodev_globals->devs;
> + struct rte_pci_device *pci;
> +
> + for (i = 0; i < rte_cryptodev_globals->max_devs && count <
> nb_devices;
> + i++) {
> +
> + if ((*devs + i)
> + && (*devs + i)->attached ==
> + RTE_CRYPTODEV_ATTACHED)
> {
> +
> + pci = (*devs + i)->pci_dev;
> +
> + if (pci)
> + cmp = strncmp(pci->driver->driver.name,
> + dev_name,
> + strlen(dev_name));
> + else
> + cmp = strncmp((*devs + i)->data->name,
> + dev_name,
> + strlen(dev_name));
> +
> + if (cmp == 0)
> + devices[count++] = (*devs + i)->data->dev_id;
> + }
> + }
> +
> + return count;
> +}
> +
> +int
> rte_cryptodev_socket_id(uint8_t dev_id)
> {
> struct rte_cryptodev *dev;
> diff --git a/lib/librte_cryptodev/rte_cryptodev.h
> b/lib/librte_cryptodev/rte_cryptodev.h
> index fa311a9..97d1a86 100644
> --- a/lib/librte_cryptodev/rte_cryptodev.h
> +++ b/lib/librte_cryptodev/rte_cryptodev.h
> @@ -76,7 +76,7 @@ enum rte_cryptodev_type {
> RTE_CRYPTODEV_SNOW3G_PMD, /**< SNOW 3G PMD */
> RTE_CRYPTODEV_KASUMI_PMD, /**< KASUMI PMD */
> RTE_CRYPTODEV_ZUC_PMD, /**< ZUC PMD */
> - RTE_CRYPTODEV_OPENSSL_PMD, /**< OpenSSL PMD */
> + RTE_CRYPTODEV_OPENSSL_PMD, /**< OpenSSL PMD */
> };
>
> extern const char **rte_cyptodev_names;
> @@ -110,6 +110,20 @@ extern const char **rte_cyptodev_names;
> #endif
>
> /**
> + * Crypto parameters range description
> + */
> +struct rte_crypto_param_range {
> + uint16_t min; /**< minimum size */
> + uint16_t max; /**< maximum size */
> + uint16_t increment;
> + /**< if a range of sizes are supported,
> + * this parameter is used to indicate
> + * increments in byte size that are supported
> + * between the minimum and maximum
> + */
> +};
> +
> +/**
> * Symmetric Crypto Capability
> */
> struct rte_cryptodev_symmetric_capability {
> @@ -122,35 +136,11 @@ struct rte_cryptodev_symmetric_capability {
> /**< authentication algorithm */
> uint16_t block_size;
> /**< algorithm block size */
> - struct {
> - uint16_t min; /**< minimum key size */
> - uint16_t max; /**< maximum key size */
> - uint16_t increment;
> - /**< if a range of sizes are supported,
> - * this parameter is used to indicate
> - * increments in byte size that are supported
> - * between the minimum and maximum */
> - } key_size;
> + struct rte_crypto_param_range key_size;
> /**< auth key size range */
> - struct {
> - uint16_t min; /**< minimum digest size */
> - uint16_t max; /**< maximum digest size */
> - uint16_t increment;
> - /**< if a range of sizes are supported,
> - * this parameter is used to indicate
> - * increments in byte size that are supported
> - * between the minimum and maximum */
> - } digest_size;
> + struct rte_crypto_param_range digest_size;
> /**< digest size range */
> - struct {
> - uint16_t min; /**< minimum aad size */
> - uint16_t max; /**< maximum aad size */
> - uint16_t increment;
> - /**< if a range of sizes are supported,
> - * this parameter is used to indicate
> - * increments in byte size that are supported
> - * between the minimum and maximum */
> - } aad_size;
> + struct rte_crypto_param_range aad_size;
> /**< Additional authentication data size range */
> } auth;
> /**< Symmetric Authentication transform capabilities */
> @@ -159,25 +149,9 @@ struct rte_cryptodev_symmetric_capability {
> /**< cipher algorithm */
> uint16_t block_size;
> /**< algorithm block size */
> - struct {
> - uint16_t min; /**< minimum key size */
> - uint16_t max; /**< maximum key size */
> - uint16_t increment;
> - /**< if a range of sizes are supported,
> - * this parameter is used to indicate
> - * increments in byte size that are supported
> - * between the minimum and maximum */
> - } key_size;
> + struct rte_crypto_param_range key_size;
> /**< cipher key size range */
> - struct {
> - uint16_t min; /**< minimum iv size */
> - uint16_t max; /**< maximum iv size */
> - uint16_t increment;
> - /**< if a range of sizes are supported,
> - * this parameter is used to indicate
> - * increments in byte size that are supported
> - * between the minimum and maximum */
> - } iv_size;
> + struct rte_crypto_param_range iv_size;
> /**< Initialisation vector data size range */
> } cipher;
> /**< Symmetric Cipher transform capabilities */
> @@ -196,6 +170,38 @@ struct rte_cryptodev_capabilities {
> };
> };
>
> +/** Structure used to describe crypto algorithms */
> +struct rte_cryptodev_capability_idx {
This should also have _sym_ in the name. OR add the op into this structure.
> + enum rte_crypto_sym_xform_type type;
> + union {
> + enum rte_crypto_cipher_algorithm cipher;
> + enum rte_crypto_auth_algorithm auth;
> + } algo;
> +};
> +
> +/** Provide capabilities available for defined device and algorithm */
> +const struct rte_cryptodev_symmetric_capability *
> +rte_cryptodev_capability_get(uint8_t dev_id,
> + const struct rte_cryptodev_capability_idx *idx);
> +
> +/**
> + * Check if key size and initial vector are supported
> + * in crypto cipher capability
> + */
> +int
> +rte_cryptodev_capability_check_cipher(
> + const struct rte_cryptodev_symmetric_capability *capability,
> + uint16_t key_size, uint16_t iv_size);
> +
> +/**
> + * Check if key size and initial vector are supported
> + * in crypto auth capability
> + */
> +int
> +rte_cryptodev_capability_check_auth(
> + const struct rte_cryptodev_symmetric_capability *capability,
> + uint16_t key_size, uint16_t digest_size, uint16_t aad_size);
> +
> /** Macro used at end of crypto PMD list */
> #define RTE_CRYPTODEV_END_OF_CAPABILITIES_LIST() \
> { RTE_CRYPTO_OP_TYPE_UNDEFINED }
> @@ -369,8 +375,30 @@ rte_cryptodev_get_dev_id(const char *name);
> extern uint8_t
> rte_cryptodev_count(void);
>
> +/**
> + * Get number of crypto device defined type.
> + *
> + * @param type type of device.
> + *
> + * @return
> + * Returns number of crypto device.
> + */
> extern uint8_t
> rte_cryptodev_count_devtype(enum rte_cryptodev_type type);
> +
> +/**
> + * Get number and identifiers of attached crypto device.
> + *
> + * @param dev_name device name.
> + * @param devices output devices identifiers.
> + * @param nb_devices maximal number of devices.
> + *
> + * @return
> + * Returns number of attached crypto device.
> + */
> +int
> +rte_cryptodev_devices_get(const char *dev_name, uint8_t *devices,
> + uint8_t nb_devices);
> /*
> * Return the NUMA socket to which a device is connected
> *
> diff --git a/lib/librte_cryptodev/rte_cryptodev_version.map
> b/lib/librte_cryptodev/rte_cryptodev_version.map
> index 9dde0e7..bdd5e5d 100644
> --- a/lib/librte_cryptodev/rte_cryptodev_version.map
> +++ b/lib/librte_cryptodev/rte_cryptodev_version.map
> @@ -46,3 +46,17 @@ DPDK_16.11 {
> rte_cryptodev_pci_remove;
>
> } DPDK_16.07;
> +
> +DPDK_17.02 {
> + global:
> +
> + rte_cryptodev_capability_check_auth;
> + rte_cryptodev_capability_check_cipher;
> + rte_cryptodev_capability_get;
> + rte_cryptodev_devices_get;
> + rte_crypto_auth_algorithm_strings;
> + rte_crypto_auth_operation_strings;
> + rte_crypto_cipher_algorithm_strings;
> + rte_crypto_cipher_operation_strings;
> +
> +} DPDK_16.11;
> --
> 2.5.0
More information about the dev
mailing list