+ if (conf->num_crypto_mbufs == 0)
+ conf->num_crypto_mbufs = NUM_CRYPTO_MBUFS;
+
+ mp = rte_mempool_create ((char *) pool_name, conf->num_crypto_mbufs,
+ crypto_op_len (), 512, pool_priv_size, NULL, NULL,
+ crypto_op_init, NULL, numa, 0);
+
+ vec_free (pool_name);
+
+ if (!mp)
+ return clib_error_return (0, "failed to create crypto op mempool");
+
+ /* Initialize mempool private data */
+ priv = rte_mempool_get_priv (mp);
+ priv->priv_size = pool_priv_size;
+ priv->type = RTE_CRYPTO_OP_TYPE_SYMMETRIC;
+
+ 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;
+ 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_sym_get_header_session_size ();
+
+#if RTE_VERSION < RTE_VERSION_NUM(19, 2, 0, 0)
+ mp = rte_mempool_create ((char *) pool_name, DPDK_CRYPTO_NB_SESS_OBJS,
+ elt_size, 512, 0, NULL, NULL, NULL, NULL, numa, 0);
+#else
+ /* XXX Experimental tag in DPDK 19.02 */
+ mp = rte_cryptodev_sym_session_pool_create ((char *) pool_name,
+ DPDK_CRYPTO_NB_SESS_OBJS,
+ elt_size, 512, 0, numa);
+#endif
+ vec_free (pool_name);
+
+ if (!mp)
+ return clib_error_return (0, "failed to create crypto session mempool");
+
+ 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;
+ 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);
+ vec_validate_aligned (data->session_by_drv_id_and_sa_index, 32,
+ CLIB_CACHE_LINE_BYTES);
+
+ 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_sym_get_private_session_size (dev->id);
+ mp =
+ rte_mempool_create ((char *) pool_name, DPDK_CRYPTO_NB_SESS_OBJS,
+ elt_size, 512, 0, NULL, NULL, NULL, NULL, numa, 0);
+
+ vec_free (pool_name);
+
+ if (!mp)
+ return clib_error_return (0, "failed to create session drv mempool");
+
+ 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;
+
+ error = crypto_create_session_h_pool (vm, dev->numa);
+ if (error)
+ return error;
+
+ error = crypto_create_session_drv_pool (vm, dev);
+ if (error)
+ return error;