cryptodev: support session private data setting

The application may want to store private data along with the
rte_cryptodev that is transparent to the rte_cryptodev layer.
For e.g., If an eventdev based application is submitting a
rte_cryptodev_sym_session operation and wants to indicate event
information required to construct a new event that will be
enqueued to eventdev after completion of the rte_cryptodev_sym_session
operation. This patch provides a mechanism for the application
to associate this information with the rte_cryptodev_sym_session session.
The application can set the private data using
rte_cryptodev_sym_session_set_private_data() and retrieve it using
rte_cryptodev_sym_session_get_private_data().

Signed-off-by: Abhinandan Gujjar <abhinandan.gujjar@intel.com>
Signed-off-by: Nikhil Rao <nikhil.rao@intel.com>
Acked-by: Akhil Goyal <akhil.goyal@nxp.com>
Acked-by: Pablo de Lara <pablo.de.lara.guarch@intel.com>
This commit is contained in:
Abhinandan Gujjar 2018-04-16 12:24:55 +05:30 committed by Pablo de Lara
parent 54c8368466
commit 2d96371fbd
3 changed files with 78 additions and 4 deletions

View File

@ -1099,8 +1099,10 @@ rte_cryptodev_sym_session_create(struct rte_mempool *mp)
return NULL;
}
/* Clear device session pointer */
memset(sess, 0, (sizeof(void *) * nb_drivers));
/* Clear device session pointer.
* Include the flag indicating presence of private data
*/
memset(sess, 0, (sizeof(void *) * nb_drivers) + sizeof(uint8_t));
return sess;
}
@ -1204,9 +1206,10 @@ rte_cryptodev_get_header_session_size(void)
{
/*
* Header contains pointers to the private data
* of all registered drivers
* of all registered drivers, and a flag which
* indicates presence of private data
*/
return (sizeof(void *) * nb_drivers);
return ((sizeof(void *) * nb_drivers) + sizeof(uint8_t));
}
unsigned int
@ -1238,6 +1241,38 @@ rte_cryptodev_get_private_session_size(uint8_t dev_id)
}
int __rte_experimental
rte_cryptodev_sym_session_set_private_data(
struct rte_cryptodev_sym_session *sess,
void *data,
uint16_t size)
{
uint16_t off_set = sizeof(void *) * nb_drivers;
uint8_t *private_data_present = (uint8_t *)sess + off_set;
if (sess == NULL)
return -EINVAL;
*private_data_present = 1;
off_set += sizeof(uint8_t);
rte_memcpy((uint8_t *)sess + off_set, data, size);
return 0;
}
void * __rte_experimental
rte_cryptodev_sym_session_get_private_data(
struct rte_cryptodev_sym_session *sess)
{
uint16_t off_set = sizeof(void *) * nb_drivers;
uint8_t *private_data_present = (uint8_t *)sess + off_set;
if (sess == NULL || !*private_data_present)
return NULL;
off_set += sizeof(uint8_t);
return (uint8_t *)sess + off_set;
}
/** Initialise rte_crypto_op mempool element */
static void
rte_crypto_op_init(struct rte_mempool *mempool,

View File

@ -1037,6 +1037,38 @@ int rte_cryptodev_driver_id_get(const char *name);
*/
const char *rte_cryptodev_driver_name_get(uint8_t driver_id);
/**
* Set private data for a session.
*
* @param sess Session pointer allocated by
* *rte_cryptodev_sym_session_create*.
* @param data Pointer to the private data.
* @param size Size of the private data.
*
* @return
* - On success, zero.
* - On failure, a negative value.
*/
int __rte_experimental
rte_cryptodev_sym_session_set_private_data(
struct rte_cryptodev_sym_session *sess,
void *data,
uint16_t size);
/**
* Get private data of a session.
*
* @param sess Session pointer allocated by
* *rte_cryptodev_sym_session_create*.
*
* @return
* - On success return pointer to private data.
* - On failure returns NULL.
*/
void * __rte_experimental
rte_cryptodev_sym_session_get_private_data(
struct rte_cryptodev_sym_session *sess);
#ifdef __cplusplus
}
#endif

View File

@ -85,3 +85,10 @@ DPDK_17.11 {
rte_cryptodev_pmd_parse_input_args;
} DPDK_17.08;
EXPERIMENTAL {
global:
rte_cryptodev_sym_session_get_private_data;
rte_cryptodev_sym_session_set_private_data;
} DPDK_17.11;