examples/ipsec-secgw: initialize event crypto adapter
Added support to create, configure and start an event crypto adapter. This adapter will be used in lookaside event mode processing. Signed-off-by: Volodymyr Fialko <vfialko@marvell.com> Acked-by: Akhil Goyal <gakhil@marvell.com>
This commit is contained in:
parent
487599f121
commit
0dbe550a4a
@ -4,8 +4,10 @@
|
||||
#include <stdlib.h>
|
||||
|
||||
#include <rte_bitmap.h>
|
||||
#include <rte_cryptodev.h>
|
||||
#include <rte_ethdev.h>
|
||||
#include <rte_eventdev.h>
|
||||
#include <rte_event_crypto_adapter.h>
|
||||
#include <rte_event_eth_rx_adapter.h>
|
||||
#include <rte_event_eth_tx_adapter.h>
|
||||
#include <rte_malloc.h>
|
||||
@ -744,6 +746,126 @@ eh_start_eventdev(struct eventmode_conf *em_conf)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int
|
||||
eh_initialize_crypto_adapter(struct eventmode_conf *em_conf)
|
||||
{
|
||||
struct rte_event_dev_info evdev_default_conf = {0};
|
||||
struct rte_event_port_conf port_conf = {0};
|
||||
struct eventdev_params *eventdev_config;
|
||||
uint8_t eventdev_id, cdev_id, n;
|
||||
uint32_t cap;
|
||||
int ret;
|
||||
|
||||
if (!em_conf->enable_event_crypto_adapter)
|
||||
return 0;
|
||||
|
||||
/*
|
||||
* More then one eventdev is not supported,
|
||||
* all event crypto adapters will be assigned to one eventdev
|
||||
*/
|
||||
RTE_ASSERT(em_conf->nb_eventdev == 1);
|
||||
|
||||
/* Get event device configuration */
|
||||
eventdev_config = &(em_conf->eventdev_config[0]);
|
||||
eventdev_id = eventdev_config->eventdev_id;
|
||||
|
||||
n = rte_cryptodev_count();
|
||||
|
||||
for (cdev_id = 0; cdev_id != n; cdev_id++) {
|
||||
/* Check event's crypto capabilities */
|
||||
ret = rte_event_crypto_adapter_caps_get(eventdev_id, cdev_id, &cap);
|
||||
if (ret < 0) {
|
||||
EH_LOG_ERR("Failed to get event device's crypto capabilities %d", ret);
|
||||
return ret;
|
||||
}
|
||||
|
||||
if (!(cap & RTE_EVENT_CRYPTO_ADAPTER_CAP_INTERNAL_PORT_OP_FWD)) {
|
||||
EH_LOG_ERR("Event crypto adapter does not support forward mode!");
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
/* Create event crypto adapter */
|
||||
|
||||
/* Get default configuration of event dev */
|
||||
ret = rte_event_dev_info_get(eventdev_id, &evdev_default_conf);
|
||||
if (ret < 0) {
|
||||
EH_LOG_ERR("Failed to get event dev info %d", ret);
|
||||
return ret;
|
||||
}
|
||||
|
||||
/* Setup port conf */
|
||||
port_conf.new_event_threshold =
|
||||
evdev_default_conf.max_num_events;
|
||||
port_conf.dequeue_depth =
|
||||
evdev_default_conf.max_event_port_dequeue_depth;
|
||||
port_conf.enqueue_depth =
|
||||
evdev_default_conf.max_event_port_enqueue_depth;
|
||||
|
||||
/* Create adapter */
|
||||
ret = rte_event_crypto_adapter_create(cdev_id, eventdev_id,
|
||||
&port_conf, RTE_EVENT_CRYPTO_ADAPTER_OP_FORWARD);
|
||||
if (ret < 0) {
|
||||
EH_LOG_ERR("Failed to create event crypto adapter %d", ret);
|
||||
return ret;
|
||||
}
|
||||
|
||||
/* Add crypto queue pairs to event crypto adapter */
|
||||
ret = rte_event_crypto_adapter_queue_pair_add(cdev_id, eventdev_id,
|
||||
-1, /* adds all the pre configured queue pairs to the instance */
|
||||
NULL);
|
||||
if (ret < 0) {
|
||||
EH_LOG_ERR("Failed to add queue pairs to event crypto adapter %d", ret);
|
||||
return ret;
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int
|
||||
eh_start_crypto_adapter(struct eventmode_conf *em_conf)
|
||||
{
|
||||
uint8_t cdev_id, n;
|
||||
int ret;
|
||||
|
||||
if (!em_conf->enable_event_crypto_adapter)
|
||||
return 0;
|
||||
|
||||
n = rte_cryptodev_count();
|
||||
for (cdev_id = 0; cdev_id != n; cdev_id++) {
|
||||
ret = rte_event_crypto_adapter_start(cdev_id);
|
||||
if (ret < 0) {
|
||||
EH_LOG_ERR("Failed to start event crypto device %d (%d)",
|
||||
cdev_id, ret);
|
||||
return ret;
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int
|
||||
eh_stop_crypto_adapter(struct eventmode_conf *em_conf)
|
||||
{
|
||||
uint8_t cdev_id, n;
|
||||
int ret;
|
||||
|
||||
if (!em_conf->enable_event_crypto_adapter)
|
||||
return 0;
|
||||
|
||||
n = rte_cryptodev_count();
|
||||
for (cdev_id = 0; cdev_id != n; cdev_id++) {
|
||||
ret = rte_event_crypto_adapter_stop(cdev_id);
|
||||
if (ret < 0) {
|
||||
EH_LOG_ERR("Failed to stop event crypto device %d (%d)",
|
||||
cdev_id, ret);
|
||||
return ret;
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int
|
||||
eh_event_vector_limits_validate(struct eventmode_conf *em_conf,
|
||||
uint8_t ev_dev_id, uint8_t ethdev_id)
|
||||
@ -1697,6 +1819,13 @@ eh_devs_init(struct eh_conf *conf)
|
||||
return ret;
|
||||
}
|
||||
|
||||
/* Setup event crypto adapter */
|
||||
ret = eh_initialize_crypto_adapter(em_conf);
|
||||
if (ret < 0) {
|
||||
EH_LOG_ERR("Failed to start event dev %d", ret);
|
||||
return ret;
|
||||
}
|
||||
|
||||
/* Setup Rx adapter */
|
||||
ret = eh_initialize_rx_adapter(em_conf);
|
||||
if (ret < 0) {
|
||||
@ -1718,6 +1847,14 @@ eh_devs_init(struct eh_conf *conf)
|
||||
return ret;
|
||||
}
|
||||
|
||||
/* Start event crypto adapter */
|
||||
ret = eh_start_crypto_adapter(em_conf);
|
||||
if (ret < 0) {
|
||||
EH_LOG_ERR("Failed to start event crypto dev %d", ret);
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
||||
/* Start eth devices after setting up adapter */
|
||||
RTE_ETH_FOREACH_DEV(port_id) {
|
||||
|
||||
@ -1788,6 +1925,13 @@ eh_devs_uninit(struct eh_conf *conf)
|
||||
}
|
||||
}
|
||||
|
||||
/* Stop event crypto adapter */
|
||||
ret = eh_stop_crypto_adapter(em_conf);
|
||||
if (ret < 0) {
|
||||
EH_LOG_ERR("Failed to start event crypto dev %d", ret);
|
||||
return ret;
|
||||
}
|
||||
|
||||
/* Stop and release event devices */
|
||||
for (i = 0; i < em_conf->nb_eventdev; i++) {
|
||||
|
||||
|
@ -185,6 +185,8 @@ struct eventmode_conf {
|
||||
/**< Max vector timeout in nanoseconds */
|
||||
uint64_t vector_pool_sz;
|
||||
/**< Vector pool size */
|
||||
bool enable_event_crypto_adapter;
|
||||
/**< Enables event crypto adapter related configuration */
|
||||
};
|
||||
|
||||
/**
|
||||
|
@ -44,6 +44,7 @@
|
||||
#include <rte_cryptodev.h>
|
||||
#include <rte_security.h>
|
||||
#include <rte_eventdev.h>
|
||||
#include <rte_event_crypto_adapter.h>
|
||||
#include <rte_ip.h>
|
||||
#include <rte_ip_frag.h>
|
||||
#include <rte_alarm.h>
|
||||
@ -2098,8 +2099,8 @@ session_pool_init(struct socket_ctx *ctx, int32_t socket_id, size_t sess_sz)
|
||||
nb_sess = RTE_MAX(nb_sess, CDEV_MP_CACHE_SZ *
|
||||
CDEV_MP_CACHE_MULTIPLIER);
|
||||
sess_mp = rte_cryptodev_sym_session_pool_create(
|
||||
mp_name, nb_sess, sess_sz, CDEV_MP_CACHE_SZ, 0,
|
||||
socket_id);
|
||||
mp_name, nb_sess, sess_sz, CDEV_MP_CACHE_SZ,
|
||||
0, socket_id);
|
||||
ctx->session_pool = sess_mp;
|
||||
|
||||
if (ctx->session_pool == NULL)
|
||||
@ -2378,7 +2379,8 @@ signal_handler(int signum)
|
||||
}
|
||||
|
||||
static void
|
||||
ev_mode_sess_verify(struct ipsec_sa *sa, int nb_sa)
|
||||
ev_mode_sess_verify(struct ipsec_sa *sa, int nb_sa,
|
||||
struct eventmode_conf *em_conf)
|
||||
{
|
||||
struct rte_ipsec_session *ips;
|
||||
int32_t i;
|
||||
@ -2388,9 +2390,11 @@ ev_mode_sess_verify(struct ipsec_sa *sa, int nb_sa)
|
||||
|
||||
for (i = 0; i < nb_sa; i++) {
|
||||
ips = ipsec_get_primary_session(&sa[i]);
|
||||
if (ips->type != RTE_SECURITY_ACTION_TYPE_INLINE_PROTOCOL)
|
||||
rte_exit(EXIT_FAILURE, "Event mode supports only "
|
||||
"inline protocol sessions\n");
|
||||
if (ips->type == RTE_SECURITY_ACTION_TYPE_LOOKASIDE_PROTOCOL)
|
||||
em_conf->enable_event_crypto_adapter = true;
|
||||
else if (ips->type != RTE_SECURITY_ACTION_TYPE_INLINE_PROTOCOL)
|
||||
rte_exit(EXIT_FAILURE, "Event mode supports inline "
|
||||
"and lookaside protocol sessions\n");
|
||||
}
|
||||
|
||||
}
|
||||
@ -2423,13 +2427,12 @@ check_event_mode_params(struct eh_conf *eh_conf)
|
||||
em_conf->ext_params.sched_type = RTE_SCHED_TYPE_ORDERED;
|
||||
|
||||
/*
|
||||
* Event mode currently supports only inline protocol sessions.
|
||||
* If there are other types of sessions configured then exit with
|
||||
* error.
|
||||
* Event mode currently supports inline and lookaside protocol
|
||||
* sessions. If there are other types of sessions configured then exit
|
||||
* with error.
|
||||
*/
|
||||
ev_mode_sess_verify(sa_in, nb_sa_in);
|
||||
ev_mode_sess_verify(sa_out, nb_sa_out);
|
||||
|
||||
ev_mode_sess_verify(sa_in, nb_sa_in, em_conf);
|
||||
ev_mode_sess_verify(sa_out, nb_sa_out, em_conf);
|
||||
|
||||
/* Option --config does not apply to event mode */
|
||||
if (nb_lcore_params > 0) {
|
||||
|
Loading…
x
Reference in New Issue
Block a user