]> git.proxmox.com Git - mirror_frr.git/commitdiff
zebra: Install directly connected route after interface flap
authorPooja Jagadeesh Doijode <pdoijode@nvidia.com>
Mon, 10 Apr 2023 23:03:23 +0000 (16:03 -0700)
committerMergify <37929162+mergify[bot]@users.noreply.github.com>
Wed, 12 Apr 2023 15:04:16 +0000 (15:04 +0000)
Issue:
After vlan flap, zebra was not marking the selected/best route as installed.

As a result, when a static route was configured with nexthop as directly
connected interface's(vlan) IP, the static route was not being installed
in the kernel since its nexthop was unresolved. The nexthop was marked
unresolved because zebra failed to mark the best route as installed after
interface flap.

This was happening because, in dplane_route_update_internal() if the old and
new context type, and nexthop group id are the same, then zebra doesn't send
down a route replace request to kernel. But, the installed (ROUTE_ENTRY_INSTALLED)
flag is set when zebra receives a response from kernel. Since the
request to kernel was being skipped for the route entry, installed flag
was not being set

Fix:
In dplane_route_update_internal() if the old and new context type, and
nexthop group id are the same, then before returning, installed flag will
be set on the route-entry if it's not set already.

Signed-off-by: Pooja Jagadeesh Doijode <pdoijode@nvidia.com>
(cherry picked from commit e25a0b138a196c7daf389989ebffbd09d345cd53)

zebra/zebra_dplane.c

index 6341358afaf58c3c4f6d0832a3a01e68c03f5099..f6f436f39f61b1a5d9401ddc6a78c876e302b860 100644 (file)
@@ -3745,6 +3745,11 @@ dplane_route_update_internal(struct route_node *rn,
                                                 NEXTHOP_FLAG_FIB);
                        }
 
+                       if ((op == DPLANE_OP_ROUTE_UPDATE) && old_re && re &&
+                           (old_re != re) &&
+                           !CHECK_FLAG(re->status, ROUTE_ENTRY_INSTALLED))
+                               SET_FLAG(re->status, ROUTE_ENTRY_INSTALLED);
+
                        dplane_ctx_free(&ctx);
                        return ZEBRA_DPLANE_REQUEST_SUCCESS;
                }