From d1c5cc3930277d6a09dbe80b5d1fcb636ce060d2 Mon Sep 17 00:00:00 2001 From: Filip Tehlar Date: Mon, 30 May 2016 10:39:20 +0200 Subject: ONE-16: Locators are not properly cleaned Change-Id: Ia6eaaa9a741e84cbd0ff957cfd9a7143a3d0a977 Signed-off-by: Filip Tehlar --- vnet/vnet/lisp-cp/control.c | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) (limited to 'vnet') diff --git a/vnet/vnet/lisp-cp/control.c b/vnet/vnet/lisp-cp/control.c index 419b745a2e4..2a29bd21d34 100644 --- a/vnet/vnet/lisp-cp/control.c +++ b/vnet/vnet/lisp-cp/control.c @@ -744,7 +744,7 @@ VLIB_CLI_COMMAND (lisp_cp_show_local_eid_table_command) = { static void clean_locator_to_locator_set (lisp_cp_main_t * lcm, u32 lsi) { - u32 i, j, *loc_indexp, *ls_indexp, **ls_indexes; + u32 i, j, *loc_indexp, *ls_indexp, **ls_indexes, *to_be_deleted = 0; locator_set_t * ls = pool_elt_at_index(lcm->locator_set_pool, lsi); for (i = 0; i < vec_len(ls->locator_indices); i++) { @@ -763,9 +763,23 @@ clean_locator_to_locator_set (lisp_cp_main_t * lcm, u32 lsi) /* delete locator if it's part of no locator-set */ if (vec_len (ls_indexes[0]) == 0) - pool_put_index(lcm->locator_pool, loc_indexp[0]); + { + pool_put_index (lcm->locator_pool, loc_indexp[0]); + vec_add1 (to_be_deleted, i); + } + } + + if (to_be_deleted) + { + for (i = 0; i < vec_len (to_be_deleted); i++) + { + loc_indexp = vec_elt_at_index (to_be_deleted, i); + vec_del1 (ls->locator_indices, loc_indexp[0]); + } + vec_free (to_be_deleted); } } + int vnet_lisp_add_del_locator_set (vnet_lisp_add_del_locator_set_args_t * a, u32 * ls_result) -- cgit 1.2.3-korg