From bd9b67a1092ef17a5f6cb49c91c687329718a5dc Mon Sep 17 00:00:00 2001 From: Fan Zhang Date: Fri, 28 Sep 2018 13:26:10 +0100 Subject: [PATCH] examples/ip_pipeline: add cryptodev This patch adds symmetric crypto device abstraction to ip_pipeline sameple application. Signed-off-by: Fan Zhang Acked-by: Cristian Dumitrescu --- examples/ip_pipeline/Makefile | 1 + examples/ip_pipeline/cryptodev.c | 117 +++++++++++++++++++++++++++++++ examples/ip_pipeline/cryptodev.h | 43 ++++++++++++ examples/ip_pipeline/main.c | 9 +++ examples/ip_pipeline/meson.build | 3 +- 5 files changed, 172 insertions(+), 1 deletion(-) create mode 100644 examples/ip_pipeline/cryptodev.c create mode 100644 examples/ip_pipeline/cryptodev.h diff --git a/examples/ip_pipeline/Makefile b/examples/ip_pipeline/Makefile index 3fb98ce3e5..41ba7df2ce 100644 --- a/examples/ip_pipeline/Makefile +++ b/examples/ip_pipeline/Makefile @@ -18,6 +18,7 @@ SRCS-y += swq.c SRCS-y += tap.c SRCS-y += thread.c SRCS-y += tmgr.c +SRCS-y += cryptodev.c # Build using pkg-config variables if possible $(shell pkg-config --exists libdpdk) diff --git a/examples/ip_pipeline/cryptodev.c b/examples/ip_pipeline/cryptodev.c new file mode 100644 index 0000000000..c4ba72beca --- /dev/null +++ b/examples/ip_pipeline/cryptodev.c @@ -0,0 +1,117 @@ +/* SPDX-License-Identifier: BSD-3-Clause + * Copyright(c) 2018 Intel Corporation + */ + +#include +#include + +#include +#include +#include + +#include "cryptodev.h" + +static struct cryptodev_list cryptodev_list; + +int +cryptodev_init(void) +{ + TAILQ_INIT(&cryptodev_list); + + return 0; +} + +struct cryptodev * +cryptodev_find(const char *name) +{ + struct cryptodev *cryptodev; + + if (name == NULL) + return NULL; + + TAILQ_FOREACH(cryptodev, &cryptodev_list, node) + if (strcmp(cryptodev->name, name) == 0) + return cryptodev; + + return NULL; +} + +struct cryptodev * +cryptodev_next(struct cryptodev *cryptodev) +{ + return (cryptodev == NULL) ? + TAILQ_FIRST(&cryptodev_list) : + TAILQ_NEXT(cryptodev, node); +} + +struct cryptodev * +cryptodev_create(const char *name, struct cryptodev_params *params) +{ + struct rte_cryptodev_info dev_info; + struct rte_cryptodev_config dev_conf; + struct rte_cryptodev_qp_conf queue_conf; + struct cryptodev *cryptodev; + uint32_t dev_id, i; + uint32_t socket_id; + int status; + + /* Check input params */ + if ((name == NULL) || + cryptodev_find(name) || + (params->n_queues == 0) || + (params->queue_size == 0)) + return NULL; + + if (params->dev_name) { + status = rte_cryptodev_get_dev_id(params->dev_name); + if (status == -1) + return NULL; + + dev_id = (uint32_t)status; + } else { + if (rte_cryptodev_pmd_is_valid_dev(params->dev_id) == 0) + return NULL; + + dev_id = params->dev_id; + } + + socket_id = rte_cryptodev_socket_id(dev_id); + rte_cryptodev_info_get(dev_id, &dev_info); + + if (dev_info.max_nb_queue_pairs < params->n_queues) + return NULL; + if (dev_info.feature_flags & RTE_CRYPTODEV_FF_HW_ACCELERATED) + return NULL; + + dev_conf.socket_id = socket_id; + dev_conf.nb_queue_pairs = params->n_queues; + + status = rte_cryptodev_configure(dev_id, &dev_conf); + if (status < 0) + return NULL; + + queue_conf.nb_descriptors = params->queue_size; + for (i = 0; i < params->n_queues; i++) { + status = rte_cryptodev_queue_pair_setup(dev_id, i, + &queue_conf, socket_id, NULL); + if (status < 0) + return NULL; + } + + if (rte_cryptodev_start(dev_id) < 0) + return NULL; + + cryptodev = calloc(1, sizeof(struct cryptodev)); + if (cryptodev == NULL) { + rte_cryptodev_stop(dev_id); + return NULL; + } + + strlcpy(cryptodev->name, name, sizeof(cryptodev->name)); + cryptodev->dev_id = dev_id; + cryptodev->n_queues = params->n_queues; + + TAILQ_INSERT_TAIL(&cryptodev_list, cryptodev, node); + + return cryptodev; +} diff --git a/examples/ip_pipeline/cryptodev.h b/examples/ip_pipeline/cryptodev.h new file mode 100644 index 0000000000..d06b3f2f13 --- /dev/null +++ b/examples/ip_pipeline/cryptodev.h @@ -0,0 +1,43 @@ +/* SPDX-License-Identifier: BSD-3-Clause + * Copyright(c) 2018 Intel Corporation + */ + +#ifndef _INCLUDE_SYM_C_H_ +#define _INCLUDE_SYM_C_H_ + +#include +#include + +#include + +#include "common.h" + +struct cryptodev { + TAILQ_ENTRY(cryptodev) node; + char name[NAME_SIZE]; + uint16_t dev_id; + uint32_t n_queues; +}; + +TAILQ_HEAD(cryptodev_list, cryptodev); + +int +cryptodev_init(void); + +struct cryptodev * +cryptodev_find(const char *name); + +struct cryptodev * +cryptodev_next(struct cryptodev *cryptodev); + +struct cryptodev_params { + const char *dev_name; + uint32_t dev_id; /**< Valid only when *dev_name* is NULL. */ + uint32_t n_queues; + uint32_t queue_size; +}; + +struct cryptodev * +cryptodev_create(const char *name, struct cryptodev_params *params); + +#endif diff --git a/examples/ip_pipeline/main.c b/examples/ip_pipeline/main.c index a69faceef7..97d1e91c2b 100644 --- a/examples/ip_pipeline/main.c +++ b/examples/ip_pipeline/main.c @@ -14,6 +14,7 @@ #include "cli.h" #include "conn.h" #include "kni.h" +#include "cryptodev.h" #include "link.h" #include "mempool.h" #include "pipeline.h" @@ -210,6 +211,14 @@ main(int argc, char **argv) return status; } + /* Sym Crypto */ + status = cryptodev_init(); + if (status) { + printf("Error: Cryptodev initialization failed (%d)\n", + status); + return status; + } + /* Action */ status = port_in_action_profile_init(); if (status) { diff --git a/examples/ip_pipeline/meson.build b/examples/ip_pipeline/meson.build index a9f2ea447a..5e5fe6479d 100644 --- a/examples/ip_pipeline/meson.build +++ b/examples/ip_pipeline/meson.build @@ -21,5 +21,6 @@ sources = files( 'swq.c', 'tap.c', 'thread.c', - 'tmgr.c' + 'tmgr.c', + 'cryptodev.c' ) -- 2.20.1