]> git.puffer.fish Git - mirror/frr.git/commitdiff
pimd: Add a flag PIM_NEXTHOP_ANSWER_RECEIVED
authorDonald Sharp <sharpd@cumulusnetworks.com>
Wed, 3 Apr 2019 15:21:37 +0000 (11:21 -0400)
committerDonald Sharp <sharpd@cumulusnetworks.com>
Fri, 5 Apr 2019 15:12:59 +0000 (11:12 -0400)
Track whether or not we have received an answer from
our query to do nexthop tracking.  This allows us to
go straight to doing a synchronous query for our
RPF.

Signed-off-by: Donald Sharp <sharpd@cumulusnetworks.com>
pimd/pim_nht.c
pimd/pim_nht.h

index 0ec239ceab1ba4cc90cead20a88dd2108b20cb47..8a459fe86e57325183e6a9f0d6c00c541f42a041 100644 (file)
@@ -710,6 +710,7 @@ int pim_parse_nexthop_update(int command, struct zclient *zclient,
                nexthops_free(pnc->nexthop);
                pnc->nexthop = NULL;
        }
+       SET_FLAG(pnc->flags, PIM_NEXTHOP_ANSWER_RECEIVED);
 
        if (PIM_DEBUG_PIM_NHT) {
                char buf[PREFIX2STR_BUFFER];
@@ -762,9 +763,11 @@ int pim_ecmp_nexthop_lookup(struct pim_instance *pim,
        rpf.rpf_addr.u.prefix4 = src->u.prefix4;
 
        pnc = pim_nexthop_cache_find(pim, &rpf);
-       if (pnc)
-               return pim_ecmp_nexthop_search(pim, pnc, nexthop, src, grp,
-                                              neighbor_needed);
+       if (pnc) {
+               if (CHECK_FLAG(pnc->flags, PIM_NEXTHOP_ANSWER_RECEIVED))
+                   return pim_ecmp_nexthop_search(pim, pnc, nexthop, src, grp,
+                                                  neighbor_needed);
+       }
 
        memset(nexthop_tab, 0,
               sizeof(struct pim_zlookup_nexthop) * MULTIPATH_NUM);
index 8f68af565239370c1d39a9c833d1a13df7632e7a..13bb0fcb55cfde5ba68564149e631a140f9784da 100644 (file)
@@ -41,6 +41,7 @@ struct pim_nexthop_cache {
        int64_t last_update;
        uint16_t flags;
 #define PIM_NEXTHOP_VALID             (1 << 0)
+#define PIM_NEXTHOP_ANSWER_RECEIVED   (1 << 1)
 
        struct list *rp_list;
        struct hash *upstream_hash;