+ }
+ /* *INDENT-ON* */
+}
+
+static void
+crypto_op_init (struct rte_mempool *mempool,
+ void *_arg __attribute__ ((unused)),
+ void *_obj, unsigned i __attribute__ ((unused)))
+{
+ struct rte_crypto_op *op = _obj;
+
+ op->sess_type = RTE_CRYPTO_OP_WITH_SESSION;
+ op->type = RTE_CRYPTO_OP_TYPE_SYMMETRIC;
+ op->status = RTE_CRYPTO_OP_STATUS_NOT_PROCESSED;
+ op->phys_addr = rte_mempool_virt2iova (_obj);
+ op->mempool = mempool;
+}
+
+static clib_error_t *
+crypto_create_crypto_op_pool (vlib_main_t * vm, u8 numa)
+{
+ dpdk_crypto_main_t *dcm = &dpdk_crypto_main;
+ dpdk_config_main_t *conf = &dpdk_config_main;
+ crypto_data_t *data;
+ u8 *pool_name;
+ u32 pool_priv_size = sizeof (struct rte_crypto_op_pool_private);
+ struct rte_crypto_op_pool_private *priv;
+ struct rte_mempool *mp;
+ clib_error_t *error = NULL;
+ vlib_physmem_region_index_t pri;
+
+ data = vec_elt_at_index (dcm->data, numa);
+
+ /* Already allocated */
+ if (data->crypto_op)
+ return NULL;
+
+ pool_name = format (0, "crypto_pool_numa%u%c", numa, 0);
+
+ error =
+ dpdk_pool_create (vm, pool_name, crypto_op_len (), conf->num_mbufs,
+ pool_priv_size, 512, numa, &mp, &pri);
+
+ vec_free (pool_name);
+
+ if (error)
+ return error;
+
+ /* Initialize mempool private data */
+ priv = rte_mempool_get_priv (mp);
+ priv->priv_size = pool_priv_size;
+ priv->type = RTE_CRYPTO_OP_TYPE_SYMMETRIC;
+
+ /* call the object initializers */
+ rte_mempool_obj_iter (mp, crypto_op_init, 0);
+
+ data->crypto_op = mp;
+
+ return NULL;
+}
+
+static clib_error_t *
+crypto_create_session_h_pool (vlib_main_t * vm, u8 numa)
+{
+ dpdk_crypto_main_t *dcm = &dpdk_crypto_main;
+ crypto_data_t *data;
+ u8 *pool_name;
+ struct rte_mempool *mp;
+ clib_error_t *error = NULL;
+ vlib_physmem_region_index_t pri;
+ u32 elt_size;
+
+ data = vec_elt_at_index (dcm->data, numa);
+
+ if (data->session_h)
+ return NULL;
+
+ pool_name = format (0, "session_h_pool_numa%u%c", numa, 0);
+
+ elt_size = rte_cryptodev_get_header_session_size ();
+
+ error =
+ dpdk_pool_create (vm, pool_name, elt_size, DPDK_CRYPTO_NB_SESS_OBJS,
+ 0, 512, numa, &mp, &pri);
+
+ vec_free (pool_name);
+
+ if (error)
+ return error;
+
+ data->session_h = mp;
+
+ return NULL;
+}
+
+static clib_error_t *
+crypto_create_session_drv_pool (vlib_main_t * vm, crypto_dev_t * dev)
+{
+ dpdk_crypto_main_t *dcm = &dpdk_crypto_main;
+ crypto_data_t *data;
+ u8 *pool_name;
+ struct rte_mempool *mp;
+ clib_error_t *error = NULL;
+ vlib_physmem_region_index_t pri;
+ u32 elt_size;
+ u8 numa = dev->numa;
+
+ data = vec_elt_at_index (dcm->data, numa);
+
+ vec_validate (data->session_drv, dev->drv_id);
+ vec_validate (data->session_drv_failed, dev->drv_id);
+
+ if (data->session_drv[dev->drv_id])
+ return NULL;
+
+ pool_name = format (0, "session_drv%u_pool_numa%u%c", dev->drv_id, numa, 0);
+ elt_size = rte_cryptodev_get_private_session_size (dev->id);
+
+ error =
+ dpdk_pool_create (vm, pool_name, elt_size, DPDK_CRYPTO_NB_SESS_OBJS,
+ 0, 512, numa, &mp, &pri);
+
+ vec_free (pool_name);
+
+ if (error)
+ return error;
+
+ data->session_drv[dev->drv_id] = mp;
+ clib_spinlock_init (&data->lockp);
+
+ return NULL;
+}
+
+static clib_error_t *
+crypto_create_pools (vlib_main_t * vm)
+{
+ dpdk_crypto_main_t *dcm = &dpdk_crypto_main;
+ clib_error_t *error = NULL;
+ crypto_dev_t *dev;
+
+ /* *INDENT-OFF* */
+ vec_foreach (dev, dcm->dev)
+ {
+ vec_validate_aligned (dcm->data, dev->numa, CLIB_CACHE_LINE_BYTES);
+
+ error = crypto_create_crypto_op_pool (vm, dev->numa);
+ if (error)
+ return error;