zebra: remove kernel routes that are suppressed

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>
This commit is contained in:
Philippe Guibert 2018-10-11 19:04:05 +02:00
parent b9ea408385
commit 212df1de28

View file

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