diff options
author | Filip Tehlar <ftehlar@cisco.com> | 2016-05-30 10:39:20 +0200 |
---|---|---|
committer | Florin Coras <florin.coras@gmail.com> | 2016-05-31 11:19:39 +0000 |
commit | d1c5cc3930277d6a09dbe80b5d1fcb636ce060d2 (patch) | |
tree | 2108caf219a789b5a86f59289711ac80b982620f /vnet | |
parent | 0e06e2b1420bca9b2bddd43e9642e56c81768fc2 (diff) |
ONE-16: Locators are not properly cleaned
Change-Id: Ia6eaaa9a741e84cbd0ff957cfd9a7143a3d0a977
Signed-off-by: Filip Tehlar <ftehlar@cisco.com>
Diffstat (limited to 'vnet')
-rw-r--r-- | vnet/vnet/lisp-cp/control.c | 18 |
1 files changed, 16 insertions, 2 deletions
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) |