]> git.proxmox.com Git - mirror_frr.git/commitdiff
zebra: remove kernel routes that are suppressed
authorPhilippe Guibert <philippe.guibert@6wind.com>
Thu, 11 Oct 2018 17:04:05 +0000 (19:04 +0200)
committerPhilippe Guibert <philippe.guibert@6wind.com>
Wed, 17 Oct 2018 21:01:10 +0000 (23:01 +0200)
on some cases, kernel routes are not selected, because the kernel
suppressed it without informing the netlink layer that the route has
been suppressed ( for instance, when an interface goes down, the route
never goes back when interface goes up again). This commit intends to
suppress that entry from zebra.

Signed-off-by: Philippe Guibert <philippe.guibert@6wind.com>
zebra/zebra_rib.c

index 4c35b1003f8add81854f58d37c9e05426b46edaf..f47081d30222792b8dfd3fa9ec8fdee75892f2f6 100644 (file)
@@ -867,6 +867,9 @@ int rib_lookup_ipv4_route(struct prefix_ipv4 *p, union sockunion *qgate,
 #define RIB_SYSTEM_ROUTE(R)                                                    \
        ((R)->type == ZEBRA_ROUTE_KERNEL || (R)->type == ZEBRA_ROUTE_CONNECT)
 
+#define RIB_KERNEL_ROUTE(R)                                            \
+       ((R)->type == ZEBRA_ROUTE_KERNEL)
+
 /* This function verifies reachability of one given nexthop, which can be
  * numbered or unnumbered, IPv4 or IPv6. The result is unconditionally stored
  * in nexthop->flags field. If the 4th parameter, 'set', is non-zero,
@@ -1397,8 +1400,11 @@ static void rib_process_del_fib(struct zebra_vrf *zvrf, struct route_node *rn,
        }
 
        /* Update nexthop for route, reset changed flag. */
-       nexthop_active_update(rn, old, 1);
-       UNSET_FLAG(old->status, ROUTE_ENTRY_CHANGED);
+       if (!nexthop_active_update(rn, old, 1) &&
+           (RIB_KERNEL_ROUTE(old)))
+               SET_FLAG(old->status, ROUTE_ENTRY_REMOVED);
+       else
+               UNSET_FLAG(old->status, ROUTE_ENTRY_CHANGED);
 }
 
 static void rib_process_update_fib(struct zebra_vrf *zvrf,