cryptodev: support device independent sessions
[dpdk.git] / drivers / crypto / armv8 / rte_armv8_pmd.c
index 590803a..eeeaab7 100644 (file)
@@ -557,24 +557,32 @@ get_session(struct armv8_crypto_qp *qp, struct rte_crypto_op *op)
                /* get existing session */
                if (likely(op->sym->session != NULL)) {
                        sess = (struct armv8_crypto_session *)
-                               op->sym->session->_private;
+                                       get_session_private_data(
+                                       op->sym->session,
+                                       cryptodev_driver_id);
                }
        } else {
                /* provide internal session */
                void *_sess = NULL;
+               void *_sess_private_data = NULL;
 
-               if (!rte_mempool_get(qp->sess_mp, (void **)&_sess)) {
-                       sess = (struct armv8_crypto_session *)
-                               ((struct rte_cryptodev_sym_session *)_sess)
-                               ->_private;
-
-                       if (unlikely(armv8_crypto_set_session_parameters(
-                                       sess, op->sym->xform) != 0)) {
-                               rte_mempool_put(qp->sess_mp, _sess);
-                               sess = NULL;
-                       } else
-                               op->sym->session = _sess;
+               if (rte_mempool_get(qp->sess_mp, (void **)&_sess))
+                       return NULL;
+
+               if (rte_mempool_get(qp->sess_mp, (void **)&_sess_private_data))
+                       return NULL;
+
+               sess = (struct armv8_crypto_session *)_sess_private_data;
+
+               if (unlikely(armv8_crypto_set_session_parameters(sess,
+                               op->sym->xform) != 0)) {
+                       rte_mempool_put(qp->sess_mp, _sess);
+                       rte_mempool_put(qp->sess_mp, _sess_private_data);
+                       sess = NULL;
                }
+               op->sym->session = (struct rte_cryptodev_sym_session *)_sess;
+               set_session_private_data(op->sym->session, cryptodev_driver_id,
+                       _sess_private_data);
        }
 
        if (unlikely(sess == NULL))
@@ -704,6 +712,9 @@ process_op(const struct armv8_crypto_qp *qp, struct rte_crypto_op *op,
        /* Free session if a session-less crypto op */
        if (op->sess_type == RTE_CRYPTO_OP_SESSIONLESS) {
                memset(sess, 0, sizeof(struct armv8_crypto_session));
+               memset(op->sym->session, 0,
+                               rte_cryptodev_get_header_session_size());
+               rte_mempool_put(qp->sess_mp, sess);
                rte_mempool_put(qp->sess_mp, op->sym->session);
                op->sym->session = NULL;
        }