cryptodev: add API to get/set event metadata

Currently, crypto session userdata is used to set event crypto
metadata from the application and the driver is dereferencing it
in driver which is not correct. User data is meant to be opaque
to the driver.
To support this, new API is added to get and set event crypto
metadata. The new API, rte_cryptodev_set_session_event_mdata,
allows setting event metadata in session private data which is
filled inside PMD using a new cryptodev op. This operation
can be performed on any of the PMD supported sessions
(sym/asym/security).
For SW abstraction of event crypto adapter to be used by
eventdev library, a new field is added in asymmetric crypto
session for now and for symmetric case, current implementation
of using userdata is used. Symmetric cases cannot be fixed now,
as it will be ABI breakage which will be resolved in DPDK 22.11.

Signed-off-by: Volodymyr Fialko <vfialko@marvell.com>
Signed-off-by: Akhil Goyal <gakhil@marvell.com>
Acked-by: Fan Zhang <roy.fan.zhang@intel.com>
Acked-by: Abhinandan Gujjar <abhinandan.gujjar@intel.com>
Acked-by: Anoob Joseph <anoobj@marvell.com>
This commit is contained in:
Volodymyr Fialko 2022-05-12 18:15:21 +05:30 committed by Akhil Goyal
parent e6d37ffa69
commit a7ddfa9c27
5 changed files with 121 additions and 0 deletions

View File

@ -227,3 +227,19 @@ cryptodev_fp_ops_set(struct rte_crypto_fp_ops *fp_ops,
fp_ops->qp.enq_cb = dev->enq_cbs;
fp_ops->qp.deq_cb = dev->deq_cbs;
}
void *
rte_cryptodev_session_event_mdata_get(struct rte_crypto_op *op)
{
if (op->type == RTE_CRYPTO_OP_TYPE_SYMMETRIC &&
op->sess_type == RTE_CRYPTO_OP_WITH_SESSION)
return rte_cryptodev_sym_session_get_user_data(op->sym->session);
else if (op->type == RTE_CRYPTO_OP_TYPE_ASYMMETRIC &&
op->sess_type == RTE_CRYPTO_OP_WITH_SESSION)
return op->asym->session->event_mdata;
else if (op->sess_type == RTE_CRYPTO_OP_SESSIONLESS &&
op->private_data_offset)
return ((uint8_t *)op + op->private_data_offset);
else
return NULL;
}

View File

@ -398,6 +398,25 @@ typedef int (*cryptodev_sym_configure_raw_dp_ctx_t)(
enum rte_crypto_op_sess_type sess_type,
union rte_cryptodev_session_ctx session_ctx, uint8_t is_update);
/**
* Typedef that the driver provided to set event crypto meta data.
*
* @param dev Crypto device pointer.
* @param sess Crypto or security session.
* @param op_type Operation type.
* @param sess_type Session type.
* @param ev_mdata Pointer to the event crypto meta data
* (aka *union rte_event_crypto_metadata*)
* @return
* - On success return 0.
* - On failure return negative integer.
*/
typedef int (*cryptodev_session_event_mdata_set_t)(
struct rte_cryptodev *dev, void *sess,
enum rte_crypto_op_type op_type,
enum rte_crypto_op_sess_type sess_type,
void *ev_mdata);
/** Crypto device operations function pointer table */
struct rte_cryptodev_ops {
cryptodev_configure_t dev_configure; /**< Configure device. */
@ -442,6 +461,8 @@ struct rte_cryptodev_ops {
/**< Initialize raw data path context data. */
};
};
cryptodev_session_event_mdata_set_t session_ev_mdata_set;
/**< Set a Crypto or Security session even meta data. */
};
@ -603,6 +624,19 @@ void
cryptodev_fp_ops_set(struct rte_crypto_fp_ops *fp_ops,
const struct rte_cryptodev *dev);
/**
* Get session event meta data (aka *union rte_event_crypto_metadata*)
*
* @param op pointer to *rte_crypto_op* structure.
*
* @return
* - On success, pointer to event crypto metadata
* - On failure, NULL.
*/
__rte_internal
void *
rte_cryptodev_session_event_mdata_get(struct rte_crypto_op *op);
static inline void *
get_sym_session_private_data(const struct rte_cryptodev_sym_session *sess,
uint8_t driver_id) {
@ -637,6 +671,8 @@ RTE_STD_C11 struct rte_cryptodev_asym_session {
uint16_t user_data_sz;
/**< Session user data will be placed after sess_data */
uint8_t padding[3];
void *event_mdata;
/**< Event metadata (aka *union rte_event_crypto_metadata*) */
uint8_t sess_private_data[0];
};

View File

@ -2051,6 +2051,8 @@ rte_cryptodev_asym_session_free(uint8_t dev_id, void *sess)
dev->dev_ops->asym_session_clear(dev, sess);
rte_free(((struct rte_cryptodev_asym_session *)sess)->event_mdata);
/* Return session to mempool */
sess_mp = rte_mempool_from_obj(sess);
rte_mempool_put(sess_mp, sess);
@ -2259,6 +2261,47 @@ rte_cryptodev_configure_raw_dp_ctx(uint8_t dev_id, uint16_t qp_id,
sess_type, session_ctx, is_update);
}
int
rte_cryptodev_session_event_mdata_set(uint8_t dev_id, void *sess,
enum rte_crypto_op_type op_type,
enum rte_crypto_op_sess_type sess_type,
void *ev_mdata,
uint16_t size)
{
struct rte_cryptodev *dev;
if (sess == NULL || ev_mdata == NULL)
return -EINVAL;
if (!rte_cryptodev_is_valid_dev(dev_id))
goto skip_pmd_op;
dev = rte_cryptodev_pmd_get_dev(dev_id);
if (dev->dev_ops->session_ev_mdata_set == NULL)
goto skip_pmd_op;
return (*dev->dev_ops->session_ev_mdata_set)(dev, sess, op_type,
sess_type, ev_mdata);
skip_pmd_op:
if (op_type == RTE_CRYPTO_OP_TYPE_SYMMETRIC)
return rte_cryptodev_sym_session_set_user_data(sess, ev_mdata,
size);
else if (op_type == RTE_CRYPTO_OP_TYPE_ASYMMETRIC) {
struct rte_cryptodev_asym_session *s = sess;
if (s->event_mdata == NULL) {
s->event_mdata = rte_malloc(NULL, size, 0);
if (s->event_mdata == NULL)
return -ENOMEM;
}
rte_memcpy(s->event_mdata, ev_mdata, size);
return 0;
} else
return -ENOTSUP;
}
uint32_t
rte_cryptodev_raw_enqueue_burst(struct rte_crypto_raw_dp_ctx *ctx,
struct rte_crypto_sym_vec *vec, union rte_crypto_sym_ofs ofs,

View File

@ -1269,6 +1269,28 @@ __rte_experimental
int
rte_cryptodev_get_raw_dp_ctx_size(uint8_t dev_id);
/**
* Set session event meta data
*
* @param dev_id The device identifier.
* @param sess Crypto or security session.
* @param op_type Operation type.
* @param sess_type Session type.
* @param ev_mdata Pointer to the event crypto meta data
* (aka *union rte_event_crypto_metadata*)
* @param size Size of ev_mdata.
*
* @return
* - On success, zero.
* - On failure, a negative value.
*/
__rte_experimental
int
rte_cryptodev_session_event_mdata_set(uint8_t dev_id, void *sess,
enum rte_crypto_op_type op_type,
enum rte_crypto_op_sess_type sess_type,
void *ev_mdata, uint16_t size);
/**
* Union of different crypto session types, including session-less xform
* pointer.

View File

@ -105,6 +105,9 @@ EXPERIMENTAL {
rte_cryptodev_asym_session_pool_create;
rte_cryptodev_asym_session_set_user_data;
__rte_cryptodev_trace_asym_session_pool_create;
#added in 22.07
rte_cryptodev_session_event_mdata_set;
};
INTERNAL {
@ -123,5 +126,6 @@ INTERNAL {
rte_cryptodev_pmd_parse_input_args;
rte_cryptodev_pmd_probing_finish;
rte_cryptodev_pmd_release_device;
rte_cryptodev_session_event_mdata_get;
rte_cryptodevs;
};