]> git.puffer.fish Git - matthieu/frr.git/commitdiff
zebra: On if down/addr-del, process kernel routes
authorStephen Worley <sworley@cumulusnetworks.com>
Thu, 17 Oct 2019 19:44:08 +0000 (15:44 -0400)
committerStephen Worley <sworley@cumulusnetworks.com>
Fri, 18 Oct 2019 20:59:34 +0000 (16:59 -0400)
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 <sworley@cumulusnetworks.com>
zebra/if_netlink.c

index 4e9b093610f7e02a7a3784753d690c2ad5805e37..d42f68cbe8134b6c9aac59841cdc93e4cb714665 100644 (file)
@@ -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);
                                }
                        }