+ 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;
+
+ 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;
+ }
+ /* *INDENT-ON* */
+
+ return NULL;
+}
+
+static void
+crypto_disable (void)
+{
+ dpdk_crypto_main_t *dcm = &dpdk_crypto_main;
+ crypto_data_t *data;
+ u8 i;
+
+ dcm->enabled = 0;
+
+ /* *INDENT-OFF* */
+ vec_foreach (data, dcm->data)
+ {
+ rte_mempool_free (data->crypto_op);
+ rte_mempool_free (data->session_h);
+
+ vec_foreach_index (i, data->session_drv)
+ rte_mempool_free (data->session_drv[i]);
+
+ vec_free (data->session_drv);
+ clib_spinlock_free (&data->lockp);
+ }
+ /* *INDENT-ON* */
+
+ vec_free (dcm->data);
+ vec_free (dcm->workers_main);
+ vec_free (dcm->sa_session);
+ vec_free (dcm->dev);
+ vec_free (dcm->resource);
+ vec_free (dcm->cipher_algs);
+ vec_free (dcm->auth_algs);
+}
+
+static uword
+dpdk_ipsec_process (vlib_main_t * vm, vlib_node_runtime_t * rt,
+ vlib_frame_t * f)
+{
+ ipsec_main_t *im = &ipsec_main;
+ dpdk_crypto_main_t *dcm = &dpdk_crypto_main;
+ vlib_thread_main_t *tm = vlib_get_thread_main ();
+ crypto_worker_main_t *cwm;
+ clib_error_t *error = NULL;
+ u32 i, skip_master, n_mains;
+
+ n_mains = tm->n_vlib_mains;
+ skip_master = vlib_num_workers () > 0;
+
+ algos_init (n_mains - skip_master);
+
+ crypto_scan_devs (n_mains - skip_master);
+
+ if (!(dcm->enabled))
+ {
+ clib_warning ("not enough DPDK crypto resources, default to OpenSSL");
+ crypto_disable ();
+ return 0;
+ }
+
+ dcm->session_timeout = 10e9;
+
+ vec_validate_init_empty_aligned (dcm->workers_main, n_mains - 1,
+ (crypto_worker_main_t) EMPTY_STRUCT,
+ CLIB_CACHE_LINE_BYTES);
+
+ /* *INDENT-OFF* */
+ vec_foreach (cwm, dcm->workers_main)
+ {
+ vec_validate_init_empty_aligned (cwm->ops, VLIB_FRAME_SIZE - 1, 0,
+ CLIB_CACHE_LINE_BYTES);
+ memset (cwm->cipher_resource_idx, ~0,
+ IPSEC_CRYPTO_N_ALG * sizeof(*cwm->cipher_resource_idx));
+ memset (cwm->auth_resource_idx, ~0,
+ IPSEC_INTEG_N_ALG * sizeof(*cwm->auth_resource_idx));