summaryrefslogtreecommitdiff
path: root/zebra/if_netlink.c
diff options
context:
space:
mode:
Diffstat (limited to 'zebra/if_netlink.c')
-rw-r--r--zebra/if_netlink.c10
1 files changed, 10 insertions, 0 deletions
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);
}
}