ONE-16: Locators are not properly cleaned 01/1301/2
authorFilip Tehlar <ftehlar@cisco.com>
Mon, 30 May 2016 08:39:20 +0000 (10:39 +0200)
committerFlorin Coras <florin.coras@gmail.com>
Tue, 31 May 2016 11:19:39 +0000 (11:19 +0000)
Change-Id: Ia6eaaa9a741e84cbd0ff957cfd9a7143a3d0a977
Signed-off-by: Filip Tehlar <ftehlar@cisco.com>
vnet/vnet/lisp-cp/control.c

index 419b745..2a29bd2 100644 (file)
@@ -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)