fib: Only track cover if activated 20/30120/2
authorNeale Ranns <nranns@cisco.com>
Wed, 25 Nov 2020 09:14:22 +0000 (09:14 +0000)
committerBeno�t Ganne <bganne@cisco.com>
Thu, 26 Nov 2020 10:16:58 +0000 (10:16 +0000)
Type: fix

also cleanup any tracking at delete

Signed-off-by: Neale Ranns <nranns@cisco.com>
Change-Id: Id1037920c88c63e2029384af931064c00ed497aa

src/vnet/fib/fib_entry_src_adj.c
test/test_ip4.py

index ec80a86..fb46f2e 100644 (file)
@@ -125,6 +125,12 @@ static void
 fib_entry_src_adj_remove (fib_entry_src_t *src)
 {
     src->fes_pl = FIB_NODE_INDEX_INVALID;
+
+    if (FIB_NODE_INDEX_INVALID != src->u.adj.fesa_cover)
+    {
+        fib_entry_cover_untrack(fib_entry_get(src->u.adj.fesa_cover),
+                                src->u.adj.fesa_sibling);
+    }
 }
 
 /*
@@ -311,6 +317,7 @@ fib_entry_src_adj_deactivate (fib_entry_src_t *src,
     fib_attached_export_covered_removed(cover, fib_entry_get_index(fib_entry));
 
     src->u.adj.fesa_cover = FIB_NODE_INDEX_INVALID;
+    src->u.adj.fesa_sibling = FIB_NODE_INDEX_INVALID;
 }
 
 static u8*
@@ -341,10 +348,17 @@ fib_entry_src_adj_cover_change (fib_entry_src_t *src,
                                 const fib_entry_t *fib_entry)
 {
     fib_entry_src_cover_res_t res = {
-        .install = !0,
+        .install = 0,
         .bw_reason = FIB_NODE_BW_REASON_FLAG_NONE,
     };
 
+    /*
+     * not interested in a change to the cover if the cover
+     * is not being tracked, i.e. the source is not active
+     */
+    if (FIB_NODE_INDEX_INVALID == src->u.adj.fesa_cover)
+        return res;
+
     fib_entry_src_adj_deactivate(src, fib_entry);
 
     res.install = fib_entry_src_adj_activate(src, fib_entry);
index 2592f58..35be24c 100644 (file)
@@ -2243,15 +2243,19 @@ class TestIPCover(VppTestCase):
                        register=False).add_vpp_config()
 
         # add/remove/add a longer mask cover
-        r = VppIpRoute(self, "127.0.0.0", 8,
-                       [VppRoutePath("127.0.0.1",
-                                     lo.sw_if_index)]).add_vpp_config()
-        r.remove_vpp_config()
-        r.add_vpp_config()
+        r8 = VppIpRoute(self, "127.0.0.0", 8,
+                        [VppRoutePath("127.0.0.1",
+                                      lo.sw_if_index)]).add_vpp_config()
+        r8.remove_vpp_config()
+        r8.add_vpp_config()
+        r8.remove_vpp_config()
 
         # remove the default route
         r.remove_vpp_config()
 
+        # remove the interface prefix
+        a.remove_vpp_config()
+
 
 class TestIP4Replace(VppTestCase):
     """ IPv4 Interface Address Replace """