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); } }