summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDonald Sharp <sharpd@cumulusnetworks.com>2019-04-03 11:21:37 -0400
committerDonald Sharp <sharpd@cumulusnetworks.com>2019-04-05 11:12:59 -0400
commit2cb7234faff0ac0c0b51cb4c0585d0500bb48f7e (patch)
tree28409944666472f8a7b6866cb100e8f8ae852ccd
parent43763b11d0d51b60809cddc4722daae359a4d1a9 (diff)
pimd: Add a flag PIM_NEXTHOP_ANSWER_RECEIVED
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>
-rw-r--r--pimd/pim_nht.c9
-rw-r--r--pimd/pim_nht.h1
2 files changed, 7 insertions, 3 deletions
diff --git a/pimd/pim_nht.c b/pimd/pim_nht.c
index 0ec239ceab..8a459fe86e 100644
--- a/pimd/pim_nht.c
+++ b/pimd/pim_nht.c
@@ -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);
diff --git a/pimd/pim_nht.h b/pimd/pim_nht.h
index 8f68af5652..13bb0fcb55 100644
--- a/pimd/pim_nht.h
+++ b/pimd/pim_nht.h
@@ -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;