>-----Original Message----- >From: dev [mailto:dev-boun...@dpdk.org] On Behalf Of Abhinandan Gujjar >Sent: 16 April 2018 12:25 >To: pablo.de.lara.gua...@intel.com; declan.dohe...@intel.com; Jacob, Jerin ><jerin.jacobkollanukka...@cavium.com>; >hemant.agra...@nxp.com; akhil.go...@nxp.com; dev@dpdk.org >Cc: narender.vang...@intel.com; abhinandan.guj...@intel.com; >nikhil....@intel.com >Subject: [dpdk-dev] [v2, 2/3] 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.guj...@intel.com> >Signed-off-by: Nikhil Rao <nikhil....@intel.com> >Acked-by: Pablo de Lara <pablo.de.lara.gua...@intel.com> >--- > lib/librte_cryptodev/rte_cryptodev.c | 43 +++++++++++++++++++++++--- > lib/librte_cryptodev/rte_cryptodev.h | 32 +++++++++++++++++++ > lib/librte_cryptodev/rte_cryptodev_version.map | 7 +++++ > 3 files changed, 78 insertions(+), 4 deletions(-) > >diff --git a/lib/librte_cryptodev/rte_cryptodev.c >b/lib/librte_cryptodev/rte_cryptodev.c >index 8745b6b..2a95a35 100644 >--- a/lib/librte_cryptodev/rte_cryptodev.c >+++ b/lib/librte_cryptodev/rte_cryptodev.c >@@ -1099,8 +1099,10 @@ struct rte_cryptodev_sym_session * > 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 @@ struct rte_cryptodev_sym_session * > { > /* > * 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 @@ struct rte_cryptodev_sym_session * > > } > >+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;
[Shally] I was going through this in context of crypto event adapter and realize probably it is safer to set priv_data_size after (sess == NULL) check. Same is applicable in get_private_data(). >+ >+ 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, >diff --git a/lib/librte_cryptodev/rte_cryptodev.h >b/lib/librte_cryptodev/rte_cryptodev.h >index c8fa689..261a359 100644 >--- a/lib/librte_cryptodev/rte_cryptodev.h >+++ b/lib/librte_cryptodev/rte_cryptodev.h >@@ -1037,6 +1037,38 @@ struct rte_cryptodev_sym_session * > */ > 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 >diff --git a/lib/librte_cryptodev/rte_cryptodev_version.map >b/lib/librte_cryptodev/rte_cryptodev_version.map >index eb47308..560e464 100644 >--- a/lib/librte_cryptodev/rte_cryptodev_version.map >+++ b/lib/librte_cryptodev/rte_cryptodev_version.map >@@ -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; >-- >1.9.1