]> git.puffer.fish Git - mirror/frr.git/commitdiff
zebra: fix NHE dependents backpointer relationship 7289/head
authorStephen Worley <sworley@cumulusnetworks.com>
Mon, 12 Oct 2020 21:39:19 +0000 (17:39 -0400)
committerStephen Worley <sworley@cumulusnetworks.com>
Mon, 19 Oct 2020 16:52:39 +0000 (12:52 -0400)
Apparantly the dependents backpointer trees for singletons
got broken at some point and we never noticed. There is
not really any code making use of this right now so not
suprising but let's go ahead and fix it for zebra and proto
NHGs.

Signed-off-by: Stephen Worley <sworley@cumulusnetworks.com>
zebra/zebra_nhg.c

index f1f6e7e2bf882d5439855ca3e136e8e12ac6c002..781a70da17e58aac92263fc99348d40323e17392 100644 (file)
@@ -442,11 +442,8 @@ static void *zebra_nhg_hash_alloc(void *arg)
        /* Mark duplicate nexthops in a group at creation time. */
        nexthop_group_mark_duplicates(&(nhe->nhg));
 
-       zebra_nhg_connect_depends(nhe, &(copy->nhg_depends));
-
        /* Add the ifp now if it's not a group or recursive and has ifindex */
-       if (zebra_nhg_depends_is_empty(nhe) && nhe->nhg.nexthop
-           && nhe->nhg.nexthop->ifindex) {
+       if (nhe->nhg.nexthop && nhe->nhg.nexthop->ifindex) {
                struct interface *ifp = NULL;
 
                ifp = if_lookup_by_index(nhe->nhg.nexthop->ifindex,
@@ -461,7 +458,6 @@ static void *zebra_nhg_hash_alloc(void *arg)
                                nhe->nhg.nexthop->vrf_id, nhe->id);
        }
 
-
        return nhe;
 }
 
@@ -754,7 +750,7 @@ static bool zebra_nhe_find(struct nhg_hash_entry **nhe, /* return value */
         * resolving nexthop; or a group of nexthops, where we need
         * relationships with the corresponding singletons.
         */
-       zebra_nhg_depends_init(lookup);
+       zebra_nhg_depends_init(newnhe);
 
        nh = newnhe->nhg.nexthop;
 
@@ -786,7 +782,14 @@ static bool zebra_nhe_find(struct nhg_hash_entry **nhe, /* return value */
        }
 
        if (recursive)
-               SET_FLAG((*nhe)->flags, NEXTHOP_GROUP_RECURSIVE);
+               SET_FLAG(newnhe->flags, NEXTHOP_GROUP_RECURSIVE);
+
+       /* Attach dependent backpointers to singletons */
+       zebra_nhg_connect_depends(newnhe, &newnhe->nhg_depends);
+
+       /**
+        * Backup Nexthops
+        */
 
        if (zebra_nhg_get_backup_nhg(newnhe) == NULL ||
            zebra_nhg_get_backup_nhg(newnhe)->nexthop == NULL)
@@ -829,6 +832,9 @@ static bool zebra_nhe_find(struct nhg_hash_entry **nhe, /* return value */
        if (recursive)
                SET_FLAG(backup_nhe->flags, NEXTHOP_GROUP_RECURSIVE);
 
+       /* Attach dependent backpointers to singletons */
+       zebra_nhg_connect_depends(backup_nhe, &backup_nhe->nhg_depends);
+
 done:
 
        return created;
@@ -1588,6 +1594,7 @@ void zebra_nhg_free(struct nhg_hash_entry *nhe)
 
 void zebra_nhg_hash_free(void *p)
 {
+       zebra_nhg_release_all_deps((struct nhg_hash_entry *)p);
        zebra_nhg_free((struct nhg_hash_entry *)p);
 }
 
@@ -2814,10 +2821,15 @@ struct nhg_hash_entry *zebra_nhg_proto_add(uint32_t id, int type,
        if (old) {
                /*
                 * This is a replace, just release NHE from ID for now, The
-                * depends/dependents may still be used in the replacement.
+                * depends/dependents may still be used in the replacement so
+                * we don't touch them other than to remove their refs to their
+                * old parent.
                 */
                replace = true;
                hash_release(zrouter.nhgs_id, old);
+
+               /* Free all the things */
+               zebra_nhg_release_all_deps(old);
        }
 
        new = zebra_nhg_rib_find_nhe(&lookup, afi);
@@ -2854,9 +2866,6 @@ struct nhg_hash_entry *zebra_nhg_proto_add(uint32_t id, int type,
                                zebra_nhg_decrement_ref(rb_node_dep->nhe);
                }
 
-               /* Free all the things */
-               zebra_nhg_release_all_deps(old);
-
                /* Dont call the dec API, we dont want to uninstall the ID */
                old->refcnt = 0;
                zebra_nhg_free(old);