]> git.puffer.fish Git - matthieu/frr.git/commitdiff
zebra: Fix another ships in the night issue with WFI
authorDonald Sharp <sharpd@cumulusnetworks.com>
Mon, 18 Oct 2021 17:49:35 +0000 (13:49 -0400)
committerDonald Sharp <sharpd@nvidia.com>
Mon, 9 Dec 2024 17:35:42 +0000 (12:35 -0500)
Effectively When bgp would send a route update down
to zebra and immediately after that a asic update
from the kernel was read.  Zebra would choose the
asic update and drop the bgp update leaving us in
a state where bgp was not used as the true source.

Modify the code so that in rib_multipath_nhe
we notice that we have an unprocessed route update
from bgp.  And if so just drop this kernel update
about an older version of the route since it is
no longer needed.

Ticket: 2722533
Signed-off-by: Donald Sharp <sharpd@nvidia.com>
zebra/zebra_rib.c

index 574083ae0283f725319b23fc060769f05980cfcd..11d279d8c9c13ebd235b3e0fa9902380ab02327b 100644 (file)
@@ -2838,6 +2838,8 @@ static void process_subq_early_route_add(struct zebra_early_route *ere)
 
        if (!ere->startup && (re->flags & ZEBRA_FLAG_SELFROUTE) &&
            zrouter.asic_offloaded) {
+               struct route_entry *entry;
+
                if (!same) {
                        if (IS_ZEBRA_DEBUG_RIB)
                                zlog_debug(
@@ -2854,6 +2856,25 @@ static void process_subq_early_route_add(struct zebra_early_route *ere)
                        early_route_memory_free(ere);
                        return;
                }
+
+               RNODE_FOREACH_RE (rn, entry) {
+                       if (CHECK_FLAG(entry->status, ROUTE_ENTRY_REMOVED))
+                               continue;
+
+                       if (entry->type != ere->re->type)
+                               continue;
+
+                       /*
+                        * If we have an entry that is changed but un
+                        * processed and not a self route, then
+                        * we should just drop this new self route
+                        */
+                       if (CHECK_FLAG(entry->status, ROUTE_ENTRY_CHANGED) &&
+                           !(entry->flags & ZEBRA_FLAG_SELFROUTE)) {
+                               early_route_memory_free(ere);
+                               return;
+                       }
+               }
        }
 
        /* Set default distance by route type. */