2017-12-19 15:49:01 +00:00
|
|
|
/* SPDX-License-Identifier: BSD-3-Clause
|
|
|
|
* Copyright(c) 2016-2017 Intel Corporation
|
2016-03-11 01:04:10 +00:00
|
|
|
*/
|
|
|
|
|
|
|
|
#include <rte_common.h>
|
|
|
|
#include <rte_cryptodev_pmd.h>
|
2017-11-07 06:54:21 +00:00
|
|
|
#include <rte_bus_vdev.h>
|
2016-03-11 01:04:10 +00:00
|
|
|
#include <rte_malloc.h>
|
|
|
|
|
|
|
|
#include "null_crypto_pmd_private.h"
|
|
|
|
|
2017-06-30 14:34:21 +00:00
|
|
|
static uint8_t cryptodev_driver_id;
|
|
|
|
|
2016-03-11 01:04:10 +00:00
|
|
|
/** verify and set session parameters */
|
|
|
|
int
|
|
|
|
null_crypto_set_session_parameters(
|
|
|
|
struct null_crypto_session *sess __rte_unused,
|
|
|
|
const struct rte_crypto_sym_xform *xform)
|
|
|
|
{
|
|
|
|
if (xform == NULL) {
|
2017-07-25 06:16:50 +00:00
|
|
|
return -EINVAL;
|
2016-03-11 01:04:10 +00:00
|
|
|
} else if (xform->type == RTE_CRYPTO_SYM_XFORM_AUTH &&
|
|
|
|
xform->next == NULL) {
|
|
|
|
/* Authentication Only */
|
|
|
|
if (xform->auth.algo == RTE_CRYPTO_AUTH_NULL)
|
|
|
|
return 0;
|
|
|
|
} else if (xform->type == RTE_CRYPTO_SYM_XFORM_AUTH &&
|
|
|
|
xform->next->type == RTE_CRYPTO_SYM_XFORM_CIPHER) {
|
|
|
|
/* Authentication then Cipher */
|
|
|
|
if (xform->auth.algo == RTE_CRYPTO_AUTH_NULL &&
|
|
|
|
xform->next->cipher.algo == RTE_CRYPTO_CIPHER_NULL)
|
|
|
|
return 0;
|
|
|
|
} else if (xform->type == RTE_CRYPTO_SYM_XFORM_CIPHER &&
|
|
|
|
xform->next == NULL) {
|
|
|
|
/* Cipher Only */
|
|
|
|
if (xform->cipher.algo == RTE_CRYPTO_CIPHER_NULL)
|
|
|
|
return 0;
|
|
|
|
} else if (xform->type == RTE_CRYPTO_SYM_XFORM_CIPHER &&
|
|
|
|
xform->next->type == RTE_CRYPTO_SYM_XFORM_AUTH) {
|
|
|
|
/* Cipher then Authentication */
|
|
|
|
if (xform->cipher.algo == RTE_CRYPTO_CIPHER_NULL &&
|
|
|
|
xform->next->auth.algo == RTE_CRYPTO_AUTH_NULL)
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
2017-07-25 06:16:50 +00:00
|
|
|
return -ENOTSUP;
|
2016-03-11 01:04:10 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
/** Process crypto operation for mbuf */
|
|
|
|
static int
|
|
|
|
process_op(const struct null_crypto_qp *qp, struct rte_crypto_op *op,
|
|
|
|
struct null_crypto_session *sess __rte_unused)
|
|
|
|
{
|
|
|
|
/* set status as successful by default */
|
|
|
|
op->status = RTE_CRYPTO_OP_STATUS_SUCCESS;
|
|
|
|
|
2017-07-05 05:26:17 +00:00
|
|
|
/* Free session if a session-less crypto op. */
|
|
|
|
if (op->sess_type == RTE_CRYPTO_OP_SESSIONLESS) {
|
|
|
|
memset(op->sym->session, 0,
|
|
|
|
sizeof(struct null_crypto_session));
|
|
|
|
rte_cryptodev_sym_session_free(op->sym->session);
|
|
|
|
op->sym->session = NULL;
|
|
|
|
}
|
|
|
|
|
2016-03-11 01:04:10 +00:00
|
|
|
/*
|
|
|
|
* if crypto session and operation are valid just enqueue the packet
|
|
|
|
* in the processed ring
|
|
|
|
*/
|
|
|
|
return rte_ring_enqueue(qp->processed_pkts, (void *)op);
|
|
|
|
}
|
|
|
|
|
|
|
|
static struct null_crypto_session *
|
2017-07-02 05:41:02 +00:00
|
|
|
get_session(struct null_crypto_qp *qp, struct rte_crypto_op *op)
|
2016-03-11 01:04:10 +00:00
|
|
|
{
|
2017-07-05 05:26:17 +00:00
|
|
|
struct null_crypto_session *sess = NULL;
|
2017-07-02 05:41:02 +00:00
|
|
|
struct rte_crypto_sym_op *sym_op = op->sym;
|
2016-03-11 01:04:10 +00:00
|
|
|
|
2017-07-02 05:41:02 +00:00
|
|
|
if (op->sess_type == RTE_CRYPTO_OP_WITH_SESSION) {
|
2017-07-05 05:26:17 +00:00
|
|
|
if (likely(sym_op->session != NULL))
|
|
|
|
sess = (struct null_crypto_session *)
|
2018-07-05 02:08:04 +00:00
|
|
|
get_sym_session_private_data(
|
2017-07-05 05:26:17 +00:00
|
|
|
sym_op->session, cryptodev_driver_id);
|
|
|
|
} else {
|
|
|
|
void *_sess = NULL;
|
|
|
|
void *_sess_private_data = NULL;
|
|
|
|
|
|
|
|
if (rte_mempool_get(qp->sess_mp, (void **)&_sess))
|
2016-03-11 01:04:10 +00:00
|
|
|
return NULL;
|
|
|
|
|
2019-01-10 14:50:11 +00:00
|
|
|
if (rte_mempool_get(qp->sess_mp_priv,
|
|
|
|
(void **)&_sess_private_data))
|
2016-03-11 01:04:10 +00:00
|
|
|
return NULL;
|
|
|
|
|
2017-07-05 05:26:17 +00:00
|
|
|
sess = (struct null_crypto_session *)_sess_private_data;
|
|
|
|
|
|
|
|
if (unlikely(null_crypto_set_session_parameters(sess,
|
|
|
|
sym_op->xform) != 0)) {
|
|
|
|
rte_mempool_put(qp->sess_mp, _sess);
|
2019-01-10 14:50:11 +00:00
|
|
|
rte_mempool_put(qp->sess_mp_priv, _sess_private_data);
|
2017-07-05 05:26:17 +00:00
|
|
|
sess = NULL;
|
|
|
|
}
|
|
|
|
sym_op->session = (struct rte_cryptodev_sym_session *)_sess;
|
2018-07-05 02:08:04 +00:00
|
|
|
set_sym_session_private_data(op->sym->session,
|
|
|
|
cryptodev_driver_id, _sess_private_data);
|
2016-03-11 01:04:10 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
return sess;
|
|
|
|
}
|
|
|
|
|
|
|
|
/** Enqueue burst */
|
|
|
|
static uint16_t
|
|
|
|
null_crypto_pmd_enqueue_burst(void *queue_pair, struct rte_crypto_op **ops,
|
|
|
|
uint16_t nb_ops)
|
|
|
|
{
|
|
|
|
struct null_crypto_session *sess;
|
|
|
|
struct null_crypto_qp *qp = queue_pair;
|
|
|
|
|
|
|
|
int i, retval;
|
|
|
|
|
|
|
|
for (i = 0; i < nb_ops; i++) {
|
2017-07-02 05:41:02 +00:00
|
|
|
sess = get_session(qp, ops[i]);
|
2016-03-11 01:04:10 +00:00
|
|
|
if (unlikely(sess == NULL))
|
|
|
|
goto enqueue_err;
|
|
|
|
|
|
|
|
retval = process_op(qp, ops[i], sess);
|
|
|
|
if (unlikely(retval < 0))
|
|
|
|
goto enqueue_err;
|
|
|
|
}
|
|
|
|
|
|
|
|
qp->qp_stats.enqueued_count += i;
|
|
|
|
return i;
|
|
|
|
|
|
|
|
enqueue_err:
|
|
|
|
if (ops[i])
|
|
|
|
ops[i]->status = RTE_CRYPTO_OP_STATUS_INVALID_ARGS;
|
|
|
|
|
|
|
|
qp->qp_stats.enqueue_err_count++;
|
|
|
|
return i;
|
|
|
|
}
|
|
|
|
|
|
|
|
/** Dequeue burst */
|
|
|
|
static uint16_t
|
|
|
|
null_crypto_pmd_dequeue_burst(void *queue_pair, struct rte_crypto_op **ops,
|
|
|
|
uint16_t nb_ops)
|
|
|
|
{
|
|
|
|
struct null_crypto_qp *qp = queue_pair;
|
|
|
|
|
|
|
|
unsigned nb_dequeued;
|
|
|
|
|
|
|
|
nb_dequeued = rte_ring_dequeue_burst(qp->processed_pkts,
|
2017-03-29 15:21:25 +00:00
|
|
|
(void **)ops, nb_ops, NULL);
|
2016-03-11 01:04:10 +00:00
|
|
|
qp->qp_stats.dequeued_count += nb_dequeued;
|
|
|
|
|
|
|
|
return nb_dequeued;
|
|
|
|
}
|
|
|
|
|
|
|
|
/** Create crypto device */
|
|
|
|
static int
|
2017-04-18 14:34:20 +00:00
|
|
|
cryptodev_null_create(const char *name,
|
2017-06-21 06:28:18 +00:00
|
|
|
struct rte_vdev_device *vdev,
|
2017-10-25 12:00:35 +00:00
|
|
|
struct rte_cryptodev_pmd_init_params *init_params)
|
2016-03-11 01:04:10 +00:00
|
|
|
{
|
|
|
|
struct rte_cryptodev *dev;
|
|
|
|
struct null_crypto_private *internals;
|
2017-10-25 12:00:35 +00:00
|
|
|
dev = rte_cryptodev_pmd_create(name, &vdev->device, init_params);
|
2016-03-11 01:04:10 +00:00
|
|
|
if (dev == NULL) {
|
2018-06-29 12:29:06 +00:00
|
|
|
NULL_LOG(ERR, "failed to create cryptodev vdev");
|
2017-10-25 12:00:35 +00:00
|
|
|
return -EFAULT;
|
2016-03-11 01:04:10 +00:00
|
|
|
}
|
|
|
|
|
2017-06-30 14:34:21 +00:00
|
|
|
dev->driver_id = cryptodev_driver_id;
|
2016-03-11 01:04:10 +00:00
|
|
|
dev->dev_ops = null_crypto_pmd_ops;
|
|
|
|
|
|
|
|
/* register rx/tx burst functions for data path */
|
|
|
|
dev->dequeue_burst = null_crypto_pmd_dequeue_burst;
|
|
|
|
dev->enqueue_burst = null_crypto_pmd_enqueue_burst;
|
|
|
|
|
2016-03-11 01:36:54 +00:00
|
|
|
dev->feature_flags = RTE_CRYPTODEV_FF_SYMMETRIC_CRYPTO |
|
2017-01-13 15:23:15 +00:00
|
|
|
RTE_CRYPTODEV_FF_SYM_OPERATION_CHAINING |
|
2020-04-16 09:25:29 +00:00
|
|
|
RTE_CRYPTODEV_FF_IN_PLACE_SGL |
|
|
|
|
RTE_CRYPTODEV_FF_SYM_SESSIONLESS;
|
2016-03-11 01:36:54 +00:00
|
|
|
|
2016-03-11 01:04:10 +00:00
|
|
|
internals = dev->data->dev_private;
|
|
|
|
|
|
|
|
internals->max_nb_qpairs = init_params->max_nb_queue_pairs;
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
/** Initialise null crypto device */
|
|
|
|
static int
|
2017-04-11 15:44:13 +00:00
|
|
|
cryptodev_null_probe(struct rte_vdev_device *dev)
|
2016-03-11 01:04:10 +00:00
|
|
|
{
|
2017-10-25 12:00:35 +00:00
|
|
|
struct rte_cryptodev_pmd_init_params init_params = {
|
|
|
|
"",
|
|
|
|
sizeof(struct null_crypto_private),
|
cryptodev: add user defined name for vdev
This patch adds a user defined name initializing parameter to cryptodev
library.
Originally, for software cryptodev PMD, the vdev name parameter is
treated as the driver identifier, and will create an unique name for each
device automatically, which is not necessarily as same as the vdev
parameter.
This patch allows the user to either create a unique name for his software
cryptodev, or by default, let the system creates a unique one. This should
help the user managing the created cryptodevs easily.
Examples:
CLI command fragment 1: --vdev "crypto_aesni_gcm_pmd"
The above command will result in creating a AESNI-GCM PMD with name of
"crypto_aesni_gcm_X", where postfix X is the number assigned by the system,
starting from 0. This fragment can be placed in the same CLI command
multiple times, resulting the postfixs incremented by one for each new
device.
CLI command fragment 2: --vdev "crypto_aesni_gcm_pmd,name=gcm1"
The above command will result in creating a AESNI-GCM PMD with name of
"gcm1". This fragment can be placed in the same CLI command multiple
times, as long as each having a unique name value.
Signed-off-by: Fan Zhang <roy.fan.zhang@intel.com>
Acked-by: Declan Doherty <declan.doherty@intel.com>
2017-01-16 14:14:54 +00:00
|
|
|
rte_socket_id(),
|
2018-07-05 02:07:58 +00:00
|
|
|
RTE_CRYPTODEV_PMD_DEFAULT_MAX_NB_QUEUE_PAIRS
|
2016-03-11 01:04:10 +00:00
|
|
|
};
|
2017-10-25 12:00:35 +00:00
|
|
|
const char *name, *args;
|
|
|
|
int retval;
|
2016-03-11 01:04:10 +00:00
|
|
|
|
2017-04-18 14:34:19 +00:00
|
|
|
name = rte_vdev_device_name(dev);
|
|
|
|
if (name == NULL)
|
|
|
|
return -EINVAL;
|
2016-03-11 01:04:10 +00:00
|
|
|
|
2017-10-25 12:00:35 +00:00
|
|
|
args = rte_vdev_device_args(dev);
|
|
|
|
|
|
|
|
retval = rte_cryptodev_pmd_parse_input_args(&init_params, args);
|
|
|
|
if (retval) {
|
2018-06-29 12:29:06 +00:00
|
|
|
NULL_LOG(ERR,
|
|
|
|
"Failed to parse initialisation arguments[%s]",
|
|
|
|
args);
|
2017-10-25 12:00:35 +00:00
|
|
|
return -EINVAL;
|
|
|
|
}
|
2016-03-11 01:04:10 +00:00
|
|
|
|
2017-06-21 06:28:18 +00:00
|
|
|
return cryptodev_null_create(name, dev, &init_params);
|
2016-03-11 01:04:10 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
static int
|
2017-10-25 12:00:35 +00:00
|
|
|
cryptodev_null_remove_dev(struct rte_vdev_device *vdev)
|
2016-03-11 01:04:10 +00:00
|
|
|
{
|
2017-10-25 12:00:35 +00:00
|
|
|
struct rte_cryptodev *cryptodev;
|
|
|
|
const char *name;
|
|
|
|
|
|
|
|
name = rte_vdev_device_name(vdev);
|
2016-03-11 01:04:10 +00:00
|
|
|
if (name == NULL)
|
|
|
|
return -EINVAL;
|
|
|
|
|
2017-10-25 12:00:35 +00:00
|
|
|
cryptodev = rte_cryptodev_pmd_get_named_dev(name);
|
|
|
|
if (cryptodev == NULL)
|
|
|
|
return -ENODEV;
|
2016-03-11 01:04:10 +00:00
|
|
|
|
2017-10-25 12:00:35 +00:00
|
|
|
return rte_cryptodev_pmd_destroy(cryptodev);
|
2017-04-11 15:44:13 +00:00
|
|
|
}
|
|
|
|
|
2016-09-20 12:41:29 +00:00
|
|
|
static struct rte_vdev_driver cryptodev_null_pmd_drv = {
|
2016-10-06 13:54:03 +00:00
|
|
|
.probe = cryptodev_null_probe,
|
2017-04-11 15:44:13 +00:00
|
|
|
.remove = cryptodev_null_remove_dev,
|
2016-03-11 01:04:10 +00:00
|
|
|
};
|
|
|
|
|
2017-08-16 02:41:51 +00:00
|
|
|
static struct cryptodev_driver null_crypto_drv;
|
|
|
|
|
2016-10-10 05:43:15 +00:00
|
|
|
RTE_PMD_REGISTER_VDEV(CRYPTODEV_NAME_NULL_PMD, cryptodev_null_pmd_drv);
|
2016-10-24 16:22:23 +00:00
|
|
|
RTE_PMD_REGISTER_ALIAS(CRYPTODEV_NAME_NULL_PMD, cryptodev_null_pmd);
|
2016-10-10 05:43:15 +00:00
|
|
|
RTE_PMD_REGISTER_PARAM_STRING(CRYPTODEV_NAME_NULL_PMD,
|
2016-07-09 01:06:12 +00:00
|
|
|
"max_nb_queue_pairs=<int> "
|
|
|
|
"socket_id=<int>");
|
2018-03-09 17:44:38 +00:00
|
|
|
RTE_PMD_REGISTER_CRYPTO_DRIVER(null_crypto_drv, cryptodev_null_pmd_drv.driver,
|
2017-08-16 02:41:51 +00:00
|
|
|
cryptodev_driver_id);
|
2020-07-01 12:33:35 +00:00
|
|
|
RTE_LOG_REGISTER(null_logtype_driver, pmd.crypto.null, INFO);
|