summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDon Slice <dslice@cumulusnetworks.com>2019-07-01 17:17:46 +0000
committerDon Slice <dslice@cumulusnetworks.com>2019-07-26 17:26:10 +0000
commit6d0ee6a0d44d2647c3daa96829a494b7f31a7809 (patch)
treef08aff608454f8be753f517decd1627e37eb0e95
parent51e75ed2280cb5e3e1a4fcf98240c1f1eab24d9a (diff)
zebra: skip queued entries when resolving nexthop
Problem reported where certain routes were not being passed on to clients if they were operated on while still queued for kernel installation. Changed it to defer working on entries that were queued to dplane so we could operate on them after getting an answer back from kernel installatino. Ticket: CM-25480 Signed-off-by: Don Slice <dslice@cumulusnetworks.com>
-rw-r--r--zebra/zebra_rib.c1
-rw-r--r--zebra/zebra_rnh.c9
2 files changed, 10 insertions, 0 deletions
diff --git a/zebra/zebra_rib.c b/zebra/zebra_rib.c
index afe59b9593..b523d54012 100644
--- a/zebra/zebra_rib.c
+++ b/zebra/zebra_rib.c
@@ -1364,6 +1364,7 @@ static void zebra_rib_fixup_system(struct route_node *rn)
continue;
SET_FLAG(re->status, ROUTE_ENTRY_INSTALLED);
+ UNSET_FLAG(re->status, ROUTE_ENTRY_QUEUED);
for (ALL_NEXTHOPS(re->ng, nhop)) {
if (CHECK_FLAG(nhop->flags, NEXTHOP_FLAG_RECURSIVE))
diff --git a/zebra/zebra_rnh.c b/zebra/zebra_rnh.c
index 6f65f8ab7a..7b5459f1ec 100644
--- a/zebra/zebra_rnh.c
+++ b/zebra/zebra_rnh.c
@@ -465,6 +465,7 @@ zebra_rnh_resolve_import_entry(struct zebra_vrf *zvrf, afi_t afi,
RNODE_FOREACH_RE (rn, re) {
if (!CHECK_FLAG(re->status, ROUTE_ENTRY_REMOVED)
&& CHECK_FLAG(re->flags, ZEBRA_FLAG_SELECTED)
+ && !CHECK_FLAG(re->status, ROUTE_ENTRY_QUEUED)
&& (re->type != ZEBRA_ROUTE_BGP))
break;
}
@@ -679,6 +680,14 @@ zebra_rnh_resolve_nexthop_entry(struct zebra_vrf *zvrf, afi_t afi,
continue;
}
+ if (CHECK_FLAG(re->status, ROUTE_ENTRY_QUEUED)) {
+ if (IS_ZEBRA_DEBUG_NHT_DETAILED)
+ zlog_debug(
+ "\tRoute Entry %s queued",
+ zebra_route_string(re->type));
+ continue;
+ }
+
/* Just being SELECTED isn't quite enough - must
* have an installed nexthop to be useful.
*/