]> git.puffer.fish Git - matthieu/frr.git/commitdiff
zebra: fix netns deletion
authorIgor Ryzhov <iryzhov@nfware.com>
Sat, 6 Nov 2021 00:36:48 +0000 (03:36 +0300)
committerIgor Ryzhov <iryzhov@nfware.com>
Thu, 11 Nov 2021 11:57:18 +0000 (14:57 +0300)
We don't receive interface down/delete notifications from kernel when a
netns is deleted. Therefore we have to manually replicate the necessary
actions, otherwise interfaces are kept in the system with stale pointers
to the deleted netns.

Signed-off-by: Igor Ryzhov <iryzhov@nfware.com>
zebra/zebra_netns_notify.c

index 5b9539904f67da938424359cf126e691e8eca201..391f28d18fd05b5ed06b5b38874589337a0bd2ae 100644 (file)
@@ -42,6 +42,7 @@
 #include "zebra_netns_notify.h"
 #include "zebra_netns_id.h"
 #include "zebra_errors.h"
+#include "interface.h"
 
 #ifdef HAVE_NETLINK
 
@@ -154,6 +155,7 @@ static int zebra_ns_continue_read(struct zebra_netns_info *zns_info,
 static int zebra_ns_delete(char *name)
 {
        struct vrf *vrf = vrf_lookup_by_name(name);
+       struct interface *ifp, *tmp;
        struct ns *ns;
 
        if (!vrf) {
@@ -161,6 +163,25 @@ static int zebra_ns_delete(char *name)
                          "NS notify : no VRF found using NS %s", name);
                return 0;
        }
+
+       /*
+        * We don't receive interface down/delete notifications from kernel
+        * when a netns is deleted. Therefore we have to manually replicate
+        * the necessary actions here.
+        */
+       RB_FOREACH_SAFE (ifp, if_name_head, &vrf->ifaces_by_name, tmp) {
+               if (!CHECK_FLAG(ifp->status, ZEBRA_INTERFACE_ACTIVE))
+                       continue;
+
+               if (if_is_no_ptm_operative(ifp)) {
+                       UNSET_FLAG(ifp->flags, IFF_RUNNING);
+                       if_down(ifp);
+               }
+
+               UNSET_FLAG(ifp->flags, IFF_UP);
+               if_delete_update(ifp);
+       }
+
        ns = (struct ns *)vrf->ns_ctxt;
        /* the deletion order is the same
         * as the one used when siging signal is received