diff options
| author | Donatas Abraitis <donatas@opensourcerouting.org> | 2022-11-02 20:15:32 +0200 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2022-11-02 20:15:32 +0200 |
| commit | 87bc89bc87cdcb54ed1598088c4aff40f80bc2d5 (patch) | |
| tree | e54b1c799507114a69d6f5aab558caf5bd43b1e7 /zebra/zebra_rib.c | |
| parent | 8d133f9460ab86e7aaa1658bd3df5d9cfbf1a6ad (diff) | |
| parent | 8d4665aabfba6dc2da854d6cb5cd439930c1ea76 (diff) | |
Merge pull request #12169 from donaldsharp/zebra_meta_q_ordering
zebra: Fix handling of recursive routes when processing closely in time
Diffstat (limited to 'zebra/zebra_rib.c')
| -rw-r--r-- | zebra/zebra_rib.c | 17 |
1 files changed, 14 insertions, 3 deletions
diff --git a/zebra/zebra_rib.c b/zebra/zebra_rib.c index fceaaaa9f0..54ef4768eb 100644 --- a/zebra/zebra_rib.c +++ b/zebra/zebra_rib.c @@ -292,13 +292,16 @@ static char *_dump_re_status(const struct route_entry *re, char *buf, } snprintfrr( - buf, len, "%s%s%s%s%s%s%s", + buf, len, "%s%s%s%s%s%s%s%s", CHECK_FLAG(re->status, ROUTE_ENTRY_REMOVED) ? "Removed " : "", CHECK_FLAG(re->status, ROUTE_ENTRY_CHANGED) ? "Changed " : "", CHECK_FLAG(re->status, ROUTE_ENTRY_LABELS_CHANGED) ? "Label Changed " : "", CHECK_FLAG(re->status, ROUTE_ENTRY_QUEUED) ? "Queued " : "", + CHECK_FLAG(re->status, ROUTE_ENTRY_ROUTE_REPLACING) + ? "Replacing" + : "", CHECK_FLAG(re->status, ROUTE_ENTRY_INSTALLED) ? "Installed " : "", CHECK_FLAG(re->status, ROUTE_ENTRY_FAILED) ? "Failed " : "", @@ -713,6 +716,7 @@ void rib_install_kernel(struct route_node *rn, struct route_entry *re, if (old) { SET_FLAG(old->status, ROUTE_ENTRY_QUEUED); + SET_FLAG(re->status, ROUTE_ENTRY_ROUTE_REPLACING); /* Free old FIB nexthop group */ UNSET_FLAG(old->status, ROUTE_ENTRY_USE_FIB_NHG); @@ -1538,6 +1542,7 @@ static void zebra_rib_fixup_system(struct route_node *rn) SET_FLAG(re->status, ROUTE_ENTRY_INSTALLED); UNSET_FLAG(re->status, ROUTE_ENTRY_QUEUED); + UNSET_FLAG(re->status, ROUTE_ENTRY_ROUTE_REPLACING); for (ALL_NEXTHOPS(re->nhe->nhg, nhop)) { if (CHECK_FLAG(nhop->flags, NEXTHOP_FLAG_RECURSIVE)) @@ -1995,8 +2000,12 @@ static void rib_process_result(struct zebra_dplane_ctx *ctx) } else { if (!zrouter.asic_offloaded || (CHECK_FLAG(re->flags, ZEBRA_FLAG_OFFLOADED) || - CHECK_FLAG(re->flags, ZEBRA_FLAG_OFFLOAD_FAILED))) + CHECK_FLAG(re->flags, + ZEBRA_FLAG_OFFLOAD_FAILED))) { + UNSET_FLAG(re->status, + ROUTE_ENTRY_ROUTE_REPLACING); UNSET_FLAG(re->status, ROUTE_ENTRY_QUEUED); + } } } @@ -2252,8 +2261,10 @@ static void rib_process_dplane_notify(struct zebra_dplane_ctx *ctx) } /* Ensure we clear the QUEUED flag */ - if (!zrouter.asic_offloaded) + if (!zrouter.asic_offloaded) { UNSET_FLAG(re->status, ROUTE_ENTRY_QUEUED); + UNSET_FLAG(re->status, ROUTE_ENTRY_ROUTE_REPLACING); + } /* Is this a notification that ... matters? We mostly care about * the route that is currently selected for installation; we may also |
