+ if (rte_mempool_from_obj(s->session))
+ {
+ ret = rte_cryptodev_sym_session_free (s->session);
+ ASSERT (!ret);
+ }
+ }
+ /* *INDENT-ON* */
+
+ if (s < vec_end (v))
+ vec_delete (v, s - v, 0);
+ else
+ vec_reset_length (v);
+
+ return 0;
+}
+
+static clib_error_t *
+add_del_sa_session (u32 sa_index, u8 is_add)
+{
+ dpdk_crypto_main_t *dcm = &dpdk_crypto_main;
+ crypto_data_t *data;
+ struct rte_cryptodev_sym_session *s;
+ uword *val;
+ u32 drv_id;
+
+ if (is_add)
+ return 0;
+
+ /* *INDENT-OFF* */
+ vec_foreach (data, dcm->data)
+ {
+ clib_spinlock_lock_if_init (&data->lockp);
+ val = hash_get (data->session_by_sa_index, sa_index);
+ if (val)
+ {
+ s = (struct rte_cryptodev_sym_session *) val[0];
+ vec_foreach_index (drv_id, dcm->drv)
+ {
+ val = (uword*) get_session_by_drv_and_sa_idx (data, drv_id, sa_index);
+ if (val)
+ add_session_by_drv_and_sa_idx(NULL, data, drv_id, sa_index);
+ }
+
+ hash_unset (data->session_by_sa_index, sa_index);
+
+ u64 ts = unix_time_now_nsec ();
+ dpdk_crypto_session_disposal (data->session_disposal, ts);
+
+ crypto_session_disposal_t sd;
+ sd.ts = ts;
+ sd.session = s;
+
+ vec_add1 (data->session_disposal, sd);
+ }
+ clib_spinlock_unlock_if_init (&data->lockp);