crypto/ccp: support session related ops
authorRavi Kumar <ravi1.kumar@amd.com>
Mon, 19 Mar 2018 12:23:38 +0000 (08:23 -0400)
committerPablo de Lara <pablo.de.lara.guarch@intel.com>
Mon, 23 Apr 2018 17:20:08 +0000 (18:20 +0100)
Added crypto session specific basic crypto ops callback functions.
Added different crypto engine types and definitions.

Signed-off-by: Ravi Kumar <ravi1.kumar@amd.com>
drivers/crypto/ccp/Makefile
drivers/crypto/ccp/ccp_crypto.c [new file with mode: 0644]
drivers/crypto/ccp/ccp_crypto.h [new file with mode: 0644]
drivers/crypto/ccp/ccp_dev.h
drivers/crypto/ccp/ccp_pmd_ops.c

index 6697cf5..216bc0d 100644 (file)
@@ -26,8 +26,9 @@ EXPORT_MAP := rte_pmd_ccp_version.map
 
 # library source files
 SRCS-$(CONFIG_RTE_LIBRTE_PMD_CCP) += rte_ccp_pmd.c
-SRCS-$(CONFIG_RTE_LIBRTE_PMD_CCP) += ccp_pmd_ops.c
+SRCS-$(CONFIG_RTE_LIBRTE_PMD_CCP) += ccp_crypto.c
 SRCS-$(CONFIG_RTE_LIBRTE_PMD_CCP) += ccp_dev.c
 SRCS-$(CONFIG_RTE_LIBRTE_PMD_CCP) += ccp_pci.c
+SRCS-$(CONFIG_RTE_LIBRTE_PMD_CCP) += ccp_pmd_ops.c
 
 include $(RTE_SDK)/mk/rte.lib.mk
diff --git a/drivers/crypto/ccp/ccp_crypto.c b/drivers/crypto/ccp/ccp_crypto.c
new file mode 100644 (file)
index 0000000..8bf4ce1
--- /dev/null
@@ -0,0 +1,203 @@
+/*   SPDX-License-Identifier: BSD-3-Clause
+ *   Copyright(c) 2018 Advanced Micro Devices, Inc. All rights reserved.
+ */
+
+#include <dirent.h>
+#include <fcntl.h>
+#include <stdio.h>
+#include <string.h>
+#include <sys/mman.h>
+#include <sys/queue.h>
+#include <sys/types.h>
+#include <unistd.h>
+
+#include <rte_hexdump.h>
+#include <rte_memzone.h>
+#include <rte_malloc.h>
+#include <rte_memory.h>
+#include <rte_spinlock.h>
+#include <rte_string_fns.h>
+#include <rte_cryptodev_pmd.h>
+
+#include "ccp_dev.h"
+#include "ccp_crypto.h"
+#include "ccp_pci.h"
+#include "ccp_pmd_private.h"
+
+static enum ccp_cmd_order
+ccp_get_cmd_id(const struct rte_crypto_sym_xform *xform)
+{
+       enum ccp_cmd_order res = CCP_CMD_NOT_SUPPORTED;
+
+       if (xform == NULL)
+               return res;
+       if (xform->type == RTE_CRYPTO_SYM_XFORM_AUTH) {
+               if (xform->next == NULL)
+                       return CCP_CMD_AUTH;
+               else if (xform->next->type == RTE_CRYPTO_SYM_XFORM_CIPHER)
+                       return CCP_CMD_HASH_CIPHER;
+       }
+       if (xform->type == RTE_CRYPTO_SYM_XFORM_CIPHER) {
+               if (xform->next == NULL)
+                       return CCP_CMD_CIPHER;
+               else if (xform->next->type == RTE_CRYPTO_SYM_XFORM_AUTH)
+                       return CCP_CMD_CIPHER_HASH;
+       }
+       if (xform->type == RTE_CRYPTO_SYM_XFORM_AEAD)
+               return CCP_CMD_COMBINED;
+       return res;
+}
+
+/* configure session */
+static int
+ccp_configure_session_cipher(struct ccp_session *sess,
+                            const struct rte_crypto_sym_xform *xform)
+{
+       const struct rte_crypto_cipher_xform *cipher_xform = NULL;
+
+       cipher_xform = &xform->cipher;
+
+       /* set cipher direction */
+       if (cipher_xform->op ==  RTE_CRYPTO_CIPHER_OP_ENCRYPT)
+               sess->cipher.dir = CCP_CIPHER_DIR_ENCRYPT;
+       else
+               sess->cipher.dir = CCP_CIPHER_DIR_DECRYPT;
+
+       /* set cipher key */
+       sess->cipher.key_length = cipher_xform->key.length;
+       rte_memcpy(sess->cipher.key, cipher_xform->key.data,
+                  cipher_xform->key.length);
+
+       /* set iv parameters */
+       sess->iv.offset = cipher_xform->iv.offset;
+       sess->iv.length = cipher_xform->iv.length;
+
+       switch (cipher_xform->algo) {
+       default:
+               CCP_LOG_ERR("Unsupported cipher algo");
+               return -1;
+       }
+
+
+       switch (sess->cipher.engine) {
+       default:
+               CCP_LOG_ERR("Invalid CCP Engine");
+               return -ENOTSUP;
+       }
+       return 0;
+}
+
+static int
+ccp_configure_session_auth(struct ccp_session *sess,
+                          const struct rte_crypto_sym_xform *xform)
+{
+       const struct rte_crypto_auth_xform *auth_xform = NULL;
+
+       auth_xform = &xform->auth;
+
+       sess->auth.digest_length = auth_xform->digest_length;
+       if (auth_xform->op ==  RTE_CRYPTO_AUTH_OP_GENERATE)
+               sess->auth.op = CCP_AUTH_OP_GENERATE;
+       else
+               sess->auth.op = CCP_AUTH_OP_VERIFY;
+       switch (auth_xform->algo) {
+       default:
+               CCP_LOG_ERR("Unsupported hash algo");
+               return -ENOTSUP;
+       }
+       return 0;
+}
+
+static int
+ccp_configure_session_aead(struct ccp_session *sess,
+                          const struct rte_crypto_sym_xform *xform)
+{
+       const struct rte_crypto_aead_xform *aead_xform = NULL;
+
+       aead_xform = &xform->aead;
+
+       sess->cipher.key_length = aead_xform->key.length;
+       rte_memcpy(sess->cipher.key, aead_xform->key.data,
+                  aead_xform->key.length);
+
+       if (aead_xform->op == RTE_CRYPTO_AEAD_OP_ENCRYPT) {
+               sess->cipher.dir = CCP_CIPHER_DIR_ENCRYPT;
+               sess->auth.op = CCP_AUTH_OP_GENERATE;
+       } else {
+               sess->cipher.dir = CCP_CIPHER_DIR_DECRYPT;
+               sess->auth.op = CCP_AUTH_OP_VERIFY;
+       }
+       sess->auth.aad_length = aead_xform->aad_length;
+       sess->auth.digest_length = aead_xform->digest_length;
+
+       /* set iv parameters */
+       sess->iv.offset = aead_xform->iv.offset;
+       sess->iv.length = aead_xform->iv.length;
+
+       switch (aead_xform->algo) {
+       default:
+               CCP_LOG_ERR("Unsupported aead algo");
+               return -ENOTSUP;
+       }
+       return 0;
+}
+
+int
+ccp_set_session_parameters(struct ccp_session *sess,
+                          const struct rte_crypto_sym_xform *xform)
+{
+       const struct rte_crypto_sym_xform *cipher_xform = NULL;
+       const struct rte_crypto_sym_xform *auth_xform = NULL;
+       const struct rte_crypto_sym_xform *aead_xform = NULL;
+       int ret = 0;
+
+       sess->cmd_id = ccp_get_cmd_id(xform);
+
+       switch (sess->cmd_id) {
+       case CCP_CMD_CIPHER:
+               cipher_xform = xform;
+               break;
+       case CCP_CMD_AUTH:
+               auth_xform = xform;
+               break;
+       case CCP_CMD_CIPHER_HASH:
+               cipher_xform = xform;
+               auth_xform = xform->next;
+               break;
+       case CCP_CMD_HASH_CIPHER:
+               auth_xform = xform;
+               cipher_xform = xform->next;
+               break;
+       case CCP_CMD_COMBINED:
+               aead_xform = xform;
+               break;
+       default:
+               CCP_LOG_ERR("Unsupported cmd_id");
+               return -1;
+       }
+
+       /* Default IV length = 0 */
+       sess->iv.length = 0;
+       if (cipher_xform) {
+               ret = ccp_configure_session_cipher(sess, cipher_xform);
+               if (ret != 0) {
+                       CCP_LOG_ERR("Invalid/unsupported cipher parameters");
+                       return ret;
+               }
+       }
+       if (auth_xform) {
+               ret = ccp_configure_session_auth(sess, auth_xform);
+               if (ret != 0) {
+                       CCP_LOG_ERR("Invalid/unsupported auth parameters");
+                       return ret;
+               }
+       }
+       if (aead_xform) {
+               ret = ccp_configure_session_aead(sess, aead_xform);
+               if (ret != 0) {
+                       CCP_LOG_ERR("Invalid/unsupported aead parameters");
+                       return ret;
+               }
+       }
+       return ret;
+}
diff --git a/drivers/crypto/ccp/ccp_crypto.h b/drivers/crypto/ccp/ccp_crypto.h
new file mode 100644 (file)
index 0000000..8d9de07
--- /dev/null
@@ -0,0 +1,241 @@
+/*   SPDX-License-Identifier: BSD-3-Clause
+ *   Copyright(c) 2018 Advanced Micro Devices, Inc. All rights reserved.
+ */
+
+#ifndef _CCP_CRYPTO_H_
+#define _CCP_CRYPTO_H_
+
+#include <limits.h>
+#include <stdbool.h>
+#include <stdint.h>
+#include <string.h>
+
+#include <rte_atomic.h>
+#include <rte_byteorder.h>
+#include <rte_io.h>
+#include <rte_pci.h>
+#include <rte_spinlock.h>
+#include <rte_crypto_sym.h>
+#include <rte_cryptodev.h>
+
+#include "ccp_dev.h"
+
+#define CCP_SHA3_CTX_SIZE 200
+/**
+ * CCP supported AES modes
+ */
+enum ccp_aes_mode {
+       CCP_AES_MODE_ECB = 0,
+       CCP_AES_MODE_CBC,
+       CCP_AES_MODE_OFB,
+       CCP_AES_MODE_CFB,
+       CCP_AES_MODE_CTR,
+       CCP_AES_MODE_CMAC,
+       CCP_AES_MODE_GHASH,
+       CCP_AES_MODE_GCTR,
+       CCP_AES_MODE__LAST,
+};
+
+/**
+ * CCP AES GHASH mode
+ */
+enum ccp_aes_ghash_mode {
+       CCP_AES_MODE_GHASH_AAD = 0,
+       CCP_AES_MODE_GHASH_FINAL
+};
+
+/**
+ * CCP supported AES types
+ */
+enum ccp_aes_type {
+       CCP_AES_TYPE_128 = 0,
+       CCP_AES_TYPE_192,
+       CCP_AES_TYPE_256,
+       CCP_AES_TYPE__LAST,
+};
+
+/***** 3DES engine *****/
+
+/**
+ * CCP supported DES/3DES modes
+ */
+enum ccp_des_mode {
+       CCP_DES_MODE_ECB = 0, /* Not supported */
+       CCP_DES_MODE_CBC,
+       CCP_DES_MODE_CFB,
+};
+
+/**
+ * CCP supported DES types
+ */
+enum ccp_des_type {
+       CCP_DES_TYPE_128 = 0,   /* 112 + 16 parity */
+       CCP_DES_TYPE_192,       /* 168 + 24 parity */
+       CCP_DES_TYPE__LAST,
+};
+
+/***** SHA engine *****/
+
+/**
+ * ccp_sha_type - type of SHA operation
+ *
+ * @CCP_SHA_TYPE_1: SHA-1 operation
+ * @CCP_SHA_TYPE_224: SHA-224 operation
+ * @CCP_SHA_TYPE_256: SHA-256 operation
+ */
+enum ccp_sha_type {
+       CCP_SHA_TYPE_1 = 1,
+       CCP_SHA_TYPE_224,
+       CCP_SHA_TYPE_256,
+       CCP_SHA_TYPE_384,
+       CCP_SHA_TYPE_512,
+       CCP_SHA_TYPE_RSVD1,
+       CCP_SHA_TYPE_RSVD2,
+       CCP_SHA3_TYPE_224,
+       CCP_SHA3_TYPE_256,
+       CCP_SHA3_TYPE_384,
+       CCP_SHA3_TYPE_512,
+       CCP_SHA_TYPE__LAST,
+};
+
+/**
+ * CCP supported cipher algorithms
+ */
+enum ccp_cipher_algo {
+       CCP_CIPHER_ALGO_AES_CBC = 0,
+       CCP_CIPHER_ALGO_AES_ECB,
+       CCP_CIPHER_ALGO_AES_CTR,
+       CCP_CIPHER_ALGO_AES_GCM,
+       CCP_CIPHER_ALGO_3DES_CBC,
+};
+
+/**
+ * CCP cipher operation type
+ */
+enum ccp_cipher_dir {
+       CCP_CIPHER_DIR_DECRYPT = 0,
+       CCP_CIPHER_DIR_ENCRYPT = 1,
+};
+
+/**
+ * CCP supported hash algorithms
+ */
+enum ccp_hash_algo {
+       CCP_AUTH_ALGO_SHA1 = 0,
+       CCP_AUTH_ALGO_SHA1_HMAC,
+       CCP_AUTH_ALGO_SHA224,
+       CCP_AUTH_ALGO_SHA224_HMAC,
+       CCP_AUTH_ALGO_SHA3_224,
+       CCP_AUTH_ALGO_SHA3_224_HMAC,
+       CCP_AUTH_ALGO_SHA256,
+       CCP_AUTH_ALGO_SHA256_HMAC,
+       CCP_AUTH_ALGO_SHA3_256,
+       CCP_AUTH_ALGO_SHA3_256_HMAC,
+       CCP_AUTH_ALGO_SHA384,
+       CCP_AUTH_ALGO_SHA384_HMAC,
+       CCP_AUTH_ALGO_SHA3_384,
+       CCP_AUTH_ALGO_SHA3_384_HMAC,
+       CCP_AUTH_ALGO_SHA512,
+       CCP_AUTH_ALGO_SHA512_HMAC,
+       CCP_AUTH_ALGO_SHA3_512,
+       CCP_AUTH_ALGO_SHA3_512_HMAC,
+       CCP_AUTH_ALGO_AES_CMAC,
+       CCP_AUTH_ALGO_AES_GCM,
+#ifdef RTE_LIBRTE_PMD_CCP_CPU_AUTH
+       CCP_AUTH_ALGO_MD5_HMAC,
+#endif
+};
+
+/**
+ * CCP hash operation type
+ */
+enum ccp_hash_op {
+       CCP_AUTH_OP_GENERATE = 0,
+       CCP_AUTH_OP_VERIFY = 1,
+};
+
+/* CCP crypto private session structure */
+struct ccp_session {
+       enum ccp_cmd_order cmd_id;
+       /**< chain order mode */
+       struct {
+               uint16_t length;
+               uint16_t offset;
+       } iv;
+       /**< IV parameters */
+       struct {
+               enum ccp_cipher_algo  algo;
+               enum ccp_engine  engine;
+               union {
+                       enum ccp_aes_mode aes_mode;
+                       enum ccp_des_mode des_mode;
+               } um;
+               union {
+                       enum ccp_aes_type aes_type;
+                       enum ccp_des_type des_type;
+               } ut;
+               enum ccp_cipher_dir dir;
+               uint64_t key_length;
+               /**< max cipher key size 256 bits */
+               uint8_t key[32];
+               /**ccp key format*/
+               uint8_t key_ccp[32];
+               phys_addr_t key_phys;
+               /**AES-ctr nonce(4) iv(8) ctr*/
+               uint8_t nonce[32];
+               phys_addr_t nonce_phys;
+       } cipher;
+       /**< Cipher Parameters */
+
+       struct {
+               enum ccp_hash_algo algo;
+               enum ccp_engine  engine;
+               union {
+                       enum ccp_aes_mode aes_mode;
+               } um;
+               union {
+                       enum ccp_sha_type sha_type;
+                       enum ccp_aes_type aes_type;
+               } ut;
+               enum ccp_hash_op op;
+               uint64_t key_length;
+               /**< max hash key size 144 bytes (struct capabilties) */
+               uint8_t key[144];
+               /**< max be key size of AES is 32*/
+               uint8_t key_ccp[32];
+               phys_addr_t key_phys;
+               uint64_t digest_length;
+               void *ctx;
+               int ctx_len;
+               int offset;
+               int block_size;
+               /**< Buffer to store  Software generated precomute values*/
+               /**< For HMAC H(ipad ^ key) and H(opad ^ key) */
+               /**< For CMAC K1 IV and K2 IV*/
+               uint8_t pre_compute[2 * CCP_SHA3_CTX_SIZE];
+               /**< SHA3 initial ctx all zeros*/
+               uint8_t sha3_ctx[200];
+               int aad_length;
+       } auth;
+       /**< Authentication Parameters */
+       enum rte_crypto_aead_algorithm aead_algo;
+       /**< AEAD Algorithm */
+
+       uint32_t reserved;
+} __rte_cache_aligned;
+
+extern uint8_t ccp_cryptodev_driver_id;
+
+struct ccp_qp;
+
+/**
+ * Set and validate CCP crypto session parameters
+ *
+ * @param sess ccp private session
+ * @param xform crypto xform for this session
+ * @return 0 on success otherwise -1
+ */
+int ccp_set_session_parameters(struct ccp_session *sess,
+                              const struct rte_crypto_sym_xform *xform);
+
+#endif /* _CCP_CRYPTO_H_ */
index c360fe0..d88f70c 100644 (file)
@@ -199,6 +199,123 @@ struct ccp_device {
        /**< current queue index */
 } __rte_cache_aligned;
 
+/**< CCP H/W engine related */
+/**
+ * ccp_engine - CCP operation identifiers
+ *
+ * @CCP_ENGINE_AES: AES operation
+ * @CCP_ENGINE_XTS_AES: 128-bit XTS AES operation
+ * @CCP_ENGINE_3DES: DES/3DES operation
+ * @CCP_ENGINE_SHA: SHA operation
+ * @CCP_ENGINE_RSA: RSA operation
+ * @CCP_ENGINE_PASSTHRU: pass-through operation
+ * @CCP_ENGINE_ZLIB_DECOMPRESS: unused
+ * @CCP_ENGINE_ECC: ECC operation
+ */
+enum ccp_engine {
+       CCP_ENGINE_AES = 0,
+       CCP_ENGINE_XTS_AES_128,
+       CCP_ENGINE_3DES,
+       CCP_ENGINE_SHA,
+       CCP_ENGINE_RSA,
+       CCP_ENGINE_PASSTHRU,
+       CCP_ENGINE_ZLIB_DECOMPRESS,
+       CCP_ENGINE_ECC,
+       CCP_ENGINE__LAST,
+};
+
+/* Passthru engine */
+/**
+ * ccp_passthru_bitwise - type of bitwise passthru operation
+ *
+ * @CCP_PASSTHRU_BITWISE_NOOP: no bitwise operation performed
+ * @CCP_PASSTHRU_BITWISE_AND: perform bitwise AND of src with mask
+ * @CCP_PASSTHRU_BITWISE_OR: perform bitwise OR of src with mask
+ * @CCP_PASSTHRU_BITWISE_XOR: perform bitwise XOR of src with mask
+ * @CCP_PASSTHRU_BITWISE_MASK: overwrite with mask
+ */
+enum ccp_passthru_bitwise {
+       CCP_PASSTHRU_BITWISE_NOOP = 0,
+       CCP_PASSTHRU_BITWISE_AND,
+       CCP_PASSTHRU_BITWISE_OR,
+       CCP_PASSTHRU_BITWISE_XOR,
+       CCP_PASSTHRU_BITWISE_MASK,
+       CCP_PASSTHRU_BITWISE__LAST,
+};
+
+/**
+ * ccp_passthru_byteswap - type of byteswap passthru operation
+ *
+ * @CCP_PASSTHRU_BYTESWAP_NOOP: no byte swapping performed
+ * @CCP_PASSTHRU_BYTESWAP_32BIT: swap bytes within 32-bit words
+ * @CCP_PASSTHRU_BYTESWAP_256BIT: swap bytes within 256-bit words
+ */
+enum ccp_passthru_byteswap {
+       CCP_PASSTHRU_BYTESWAP_NOOP = 0,
+       CCP_PASSTHRU_BYTESWAP_32BIT,
+       CCP_PASSTHRU_BYTESWAP_256BIT,
+       CCP_PASSTHRU_BYTESWAP__LAST,
+};
+
+/**
+ * CCP passthru
+ */
+struct ccp_passthru {
+       phys_addr_t src_addr;
+       phys_addr_t dest_addr;
+       enum ccp_passthru_bitwise bit_mod;
+       enum ccp_passthru_byteswap byte_swap;
+       int len;
+       int dir;
+};
+
+/* CCP version 5: Union to define the function field (cmd_reg1/dword0) */
+union ccp_function {
+       struct {
+               uint16_t size:7;
+               uint16_t encrypt:1;
+               uint16_t mode:5;
+               uint16_t type:2;
+       } aes;
+       struct {
+               uint16_t size:7;
+               uint16_t encrypt:1;
+               uint16_t mode:5;
+               uint16_t type:2;
+       } des;
+       struct {
+               uint16_t size:7;
+               uint16_t encrypt:1;
+               uint16_t rsvd:5;
+               uint16_t type:2;
+       } aes_xts;
+       struct {
+               uint16_t rsvd1:10;
+               uint16_t type:4;
+               uint16_t rsvd2:1;
+       } sha;
+       struct {
+               uint16_t mode:3;
+               uint16_t size:12;
+       } rsa;
+       struct {
+               uint16_t byteswap:2;
+               uint16_t bitwise:3;
+               uint16_t reflect:2;
+               uint16_t rsvd:8;
+       } pt;
+       struct  {
+               uint16_t rsvd:13;
+       } zlib;
+       struct {
+               uint16_t size:10;
+               uint16_t type:2;
+               uint16_t mode:3;
+       } ecc;
+       uint16_t raw;
+};
+
+
 /**
  * descriptor for version 5 CPP commands
  * 8 32-bit words:
@@ -265,6 +382,18 @@ struct ccp_desc {
        struct dword7 dw7;
 };
 
+/**
+ * cmd id to follow order
+ */
+enum ccp_cmd_order {
+       CCP_CMD_CIPHER = 0,
+       CCP_CMD_AUTH,
+       CCP_CMD_CIPHER_HASH,
+       CCP_CMD_HASH_CIPHER,
+       CCP_CMD_COMBINED,
+       CCP_CMD_NOT_SUPPORTED,
+};
+
 static inline uint32_t
 low32_value(unsigned long addr)
 {
index 99b8ca5..0560f68 100644 (file)
@@ -10,6 +10,7 @@
 
 #include "ccp_pmd_private.h"
 #include "ccp_dev.h"
+#include "ccp_crypto.h"
 
 static const struct rte_cryptodev_capabilities ccp_pmd_capabilities[] = {
        RTE_CRYPTODEV_END_OF_CAPABILITIES_LIST()
@@ -55,6 +56,60 @@ ccp_pmd_info_get(struct rte_cryptodev *dev,
        }
 }
 
+static unsigned
+ccp_pmd_session_get_size(struct rte_cryptodev *dev __rte_unused)
+{
+       return sizeof(struct ccp_session);
+}
+
+static int
+ccp_pmd_session_configure(struct rte_cryptodev *dev,
+                         struct rte_crypto_sym_xform *xform,
+                         struct rte_cryptodev_sym_session *sess,
+                         struct rte_mempool *mempool)
+{
+       int ret;
+       void *sess_private_data;
+
+       if (unlikely(sess == NULL || xform == NULL)) {
+               CCP_LOG_ERR("Invalid session struct or xform");
+               return -ENOMEM;
+       }
+
+       if (rte_mempool_get(mempool, &sess_private_data)) {
+               CCP_LOG_ERR("Couldn't get object from session mempool");
+               return -ENOMEM;
+       }
+       ret = ccp_set_session_parameters(sess_private_data, xform);
+       if (ret != 0) {
+               CCP_LOG_ERR("failed configure session parameters");
+
+               /* Return session to mempool */
+               rte_mempool_put(mempool, sess_private_data);
+               return ret;
+       }
+       set_session_private_data(sess, dev->driver_id,
+                                sess_private_data);
+
+       return 0;
+}
+
+static void
+ccp_pmd_session_clear(struct rte_cryptodev *dev,
+                     struct rte_cryptodev_sym_session *sess)
+{
+       uint8_t index = dev->driver_id;
+       void *sess_priv = get_session_private_data(sess, index);
+
+       if (sess_priv) {
+               struct rte_mempool *sess_mp = rte_mempool_from_obj(sess_priv);
+
+               rte_mempool_put(sess_mp, sess_priv);
+               memset(sess_priv, 0, sizeof(struct ccp_session));
+               set_session_private_data(sess, index, NULL);
+       }
+}
+
 struct rte_cryptodev_ops ccp_ops = {
                .dev_configure          = ccp_pmd_config,
                .dev_start              = ccp_pmd_start,
@@ -72,9 +127,9 @@ struct rte_cryptodev_ops ccp_ops = {
                .queue_pair_stop        = NULL,
                .queue_pair_count       = NULL,
 
-               .session_get_size       = NULL,
-               .session_configure      = NULL,
-               .session_clear          = NULL,
+               .session_get_size       = ccp_pmd_session_get_size,
+               .session_configure      = ccp_pmd_session_configure,
+               .session_clear          = ccp_pmd_session_clear,
 };
 
 struct rte_cryptodev_ops *ccp_pmd_ops = &ccp_ops;