From 2a18114787919aab7bee9bf4dedcf3b407e77ebe Mon Sep 17 00:00:00 2001 From: Stephen Worley Date: Thu, 17 Oct 2019 15:44:08 -0400 Subject: [PATCH] zebra: On if down/addr-del, process kernel routes Since we don't have a daemon who's job is to handle kernel routes and we don't get an explicit route delete anymore if nexthops become unreachable from the kernel, zebra must re-process kernel routes itself to make sure they are still valid. Signed-off-by: Stephen Worley --- zebra/if_netlink.c | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/zebra/if_netlink.c b/zebra/if_netlink.c index 4e9b093610..d42f68cbe8 100644 --- a/zebra/if_netlink.c +++ b/zebra/if_netlink.c @@ -1104,6 +1104,14 @@ int netlink_interface_addr(struct nlmsghdr *h, ns_id_t ns_id, int startup) NULL, ifa->ifa_prefixlen); } + + /* + * Linux kernel does not send route delete on interface down/addr del + * so we have to re-process routes it owns (i.e. kernel routes) + */ + if (h->nlmsg_type != RTM_NEWADDR) + rib_update(RIB_UPDATE_KERNEL); + return 0; } @@ -1332,6 +1340,7 @@ int netlink_link_change(struct nlmsghdr *h, ns_id_t ns_id, int startup) "Intf %s(%u) has gone DOWN", name, ifp->ifindex); if_down(ifp); + rib_update(RIB_UPDATE_KERNEL); } else if (if_is_operative(ifp)) { /* Must notify client daemons of new * interface status. */ @@ -1371,6 +1380,7 @@ int netlink_link_change(struct nlmsghdr *h, ns_id_t ns_id, int startup) "Intf %s(%u) has gone DOWN", name, ifp->ifindex); if_down(ifp); + rib_update(RIB_UPDATE_KERNEL); } } -- 2.39.5