From 29fe4822f5022d26164ab4a0d1922e62f673cadd Mon Sep 17 00:00:00 2001 From: Fan Zhang Date: Wed, 24 Oct 2018 13:49:01 +0100 Subject: [PATCH] net/softnic: add cryptodev This patch adds cryptodev abstraction to softnic. The DPDK Cryptodevs are abstracted as crypto ports in the softnic. Signed-off-by: Fan Zhang Acked-by: Cristian Dumitrescu --- drivers/net/softnic/Makefile | 2 + drivers/net/softnic/meson.build | 3 +- drivers/net/softnic/rte_eth_softnic.c | 1 + .../net/softnic/rte_eth_softnic_cryptodev.c | 125 ++++++++++++++++++ .../net/softnic/rte_eth_softnic_internals.h | 51 +++++++ 5 files changed, 181 insertions(+), 1 deletion(-) create mode 100644 drivers/net/softnic/rte_eth_softnic_cryptodev.c diff --git a/drivers/net/softnic/Makefile b/drivers/net/softnic/Makefile index 720f067bc4..484e76cd6c 100644 --- a/drivers/net/softnic/Makefile +++ b/drivers/net/softnic/Makefile @@ -14,6 +14,7 @@ CFLAGS += $(WERROR_FLAGS) LDLIBS += -lrte_pipeline -lrte_port -lrte_table LDLIBS += -lrte_eal -lrte_mbuf -lrte_mempool -lrte_ring LDLIBS += -lrte_ethdev -lrte_net -lrte_kvargs -lrte_sched +LDLIBS += -lrte_cryptodev LDLIBS += -lrte_bus_vdev EXPORT_MAP := rte_pmd_softnic_version.map @@ -35,6 +36,7 @@ SRCS-$(CONFIG_RTE_LIBRTE_PMD_SOFTNIC) += rte_eth_softnic_thread.c SRCS-$(CONFIG_RTE_LIBRTE_PMD_SOFTNIC) += rte_eth_softnic_cli.c SRCS-$(CONFIG_RTE_LIBRTE_PMD_SOFTNIC) += rte_eth_softnic_flow.c SRCS-$(CONFIG_RTE_LIBRTE_PMD_SOFTNIC) += rte_eth_softnic_meter.c +SRCS-$(CONFIG_RTE_LIBRTE_PMD_SOFTNIC) += rte_eth_softnic_cryptodev.c SRCS-$(CONFIG_RTE_LIBRTE_PMD_SOFTNIC) += parser.c SRCS-$(CONFIG_RTE_LIBRTE_PMD_SOFTNIC) += conn.c diff --git a/drivers/net/softnic/meson.build b/drivers/net/softnic/meson.build index 6b7a6ccf2a..a18eef5965 100644 --- a/drivers/net/softnic/meson.build +++ b/drivers/net/softnic/meson.build @@ -15,6 +15,7 @@ sources = files('rte_eth_softnic_tm.c', 'rte_eth_softnic_cli.c', 'rte_eth_softnic_flow.c', 'rte_eth_softnic_meter.c', + 'rte_eth_softnic_cryptodev.c', 'parser.c', 'conn.c') -deps += ['pipeline', 'port', 'table', 'sched'] +deps += ['pipeline', 'port', 'table', 'sched', 'cryptodev'] diff --git a/drivers/net/softnic/rte_eth_softnic.c b/drivers/net/softnic/rte_eth_softnic.c index 0fd264e25a..aec684610a 100644 --- a/drivers/net/softnic/rte_eth_softnic.c +++ b/drivers/net/softnic/rte_eth_softnic.c @@ -298,6 +298,7 @@ pmd_init(struct pmd_params *params) softnic_link_init(p); softnic_tmgr_init(p); softnic_tap_init(p); + softnic_cryptodev_init(p); softnic_port_in_action_profile_init(p); softnic_table_action_profile_init(p); softnic_pipeline_init(p); diff --git a/drivers/net/softnic/rte_eth_softnic_cryptodev.c b/drivers/net/softnic/rte_eth_softnic_cryptodev.c new file mode 100644 index 0000000000..1480f6dd5d --- /dev/null +++ b/drivers/net/softnic/rte_eth_softnic_cryptodev.c @@ -0,0 +1,125 @@ +/* SPDX-License-Identifier: BSD-3-Clause + * Copyright(c) 2018 Intel Corporation + */ + +#include +#include + +#include +#include +#include + +#include "rte_eth_softnic_internals.h" + +int +softnic_cryptodev_init(struct pmd_internals *p) +{ + TAILQ_INIT(&p->cryptodev_list); + + return 0; +} + +void +softnic_cryptodev_free(struct pmd_internals *p) +{ + for ( ; ; ) { + struct softnic_cryptodev *cryptodev; + + cryptodev = TAILQ_FIRST(&p->cryptodev_list); + if (cryptodev == NULL) + break; + + TAILQ_REMOVE(&p->cryptodev_list, cryptodev, node); + free(cryptodev); + } +} + +struct softnic_cryptodev * +softnic_cryptodev_find(struct pmd_internals *p, + const char *name) +{ + struct softnic_cryptodev *cryptodev; + + if (name == NULL) + return NULL; + + TAILQ_FOREACH(cryptodev, &p->cryptodev_list, node) + if (strcmp(cryptodev->name, name) == 0) + return cryptodev; + + return NULL; +} + +struct softnic_cryptodev * +softnic_cryptodev_create(struct pmd_internals *p, + const char *name, + struct softnic_cryptodev_params *params) +{ + struct rte_cryptodev_info dev_info; + struct rte_cryptodev_config dev_conf; + struct rte_cryptodev_qp_conf queue_conf; + struct softnic_cryptodev *cryptodev; + uint32_t dev_id, i; + uint32_t socket_id; + int status; + + /* Check input params */ + if ((name == NULL) || + softnic_cryptodev_find(p, 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 softnic_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(&p->cryptodev_list, cryptodev, node); + + return cryptodev; +} diff --git a/drivers/net/softnic/rte_eth_softnic_internals.h b/drivers/net/softnic/rte_eth_softnic_internals.h index 9aa19a9ec7..6322b32062 100644 --- a/drivers/net/softnic/rte_eth_softnic_internals.h +++ b/drivers/net/softnic/rte_eth_softnic_internals.h @@ -278,6 +278,25 @@ struct softnic_tap { TAILQ_HEAD(softnic_tap_list, softnic_tap); +/** + * Cryptodev + */ +struct softnic_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 softnic_cryptodev { + TAILQ_ENTRY(softnic_cryptodev) node; + char name[NAME_SIZE]; + uint16_t dev_id; + uint32_t n_queues; +}; + +TAILQ_HEAD(softnic_cryptodev_list, softnic_cryptodev); + /** * Input port action */ @@ -343,6 +362,7 @@ enum softnic_port_in_type { PORT_IN_TMGR, PORT_IN_TAP, PORT_IN_SOURCE, + PORT_IN_CRYPTODEV, }; struct softnic_port_in_params { @@ -364,6 +384,12 @@ struct softnic_port_in_params { const char *file_name; uint32_t n_bytes_per_pkt; } source; + + struct { + uint16_t queue_id; + void *f_callback; + void *arg_callback; + } cryptodev; }; uint32_t burst_size; @@ -377,6 +403,7 @@ enum softnic_port_out_type { PORT_OUT_TMGR, PORT_OUT_TAP, PORT_OUT_SINK, + PORT_OUT_CRYPTODEV, }; struct softnic_port_out_params { @@ -391,6 +418,11 @@ struct softnic_port_out_params { const char *file_name; uint32_t max_n_pkts; } sink; + + struct { + uint16_t queue_id; + uint32_t op_offset; + } cryptodev; }; uint32_t burst_size; int retry; @@ -574,6 +606,7 @@ struct pmd_internals { struct softnic_link_list link_list; struct softnic_tmgr_port_list tmgr_port_list; struct softnic_tap_list tap_list; + struct softnic_cryptodev_list cryptodev_list; struct softnic_port_in_action_profile_list port_in_action_profile_list; struct softnic_table_action_profile_list table_action_profile_list; struct pipeline_list pipeline_list; @@ -740,6 +773,24 @@ struct softnic_tap * softnic_tap_create(struct pmd_internals *p, const char *name); +/** + * Sym Crypto + */ +int +softnic_cryptodev_init(struct pmd_internals *p); + +void +softnic_cryptodev_free(struct pmd_internals *p); + +struct softnic_cryptodev * +softnic_cryptodev_find(struct pmd_internals *p, + const char *name); + +struct softnic_cryptodev * +softnic_cryptodev_create(struct pmd_internals *p, + const char *name, + struct softnic_cryptodev_params *params); + /** * Input port action */