Merge pull request #9982 from idryzhov/fix-netns-delete

zebra: fix netns deletion
This commit is contained in:
Donald Sharp 2021-11-11 18:41:33 -05:00 committed by GitHub
commit f15d7a202e
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -42,6 +42,7 @@
#include "zebra_netns_notify.h" #include "zebra_netns_notify.h"
#include "zebra_netns_id.h" #include "zebra_netns_id.h"
#include "zebra_errors.h" #include "zebra_errors.h"
#include "interface.h"
#ifdef HAVE_NETLINK #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) static int zebra_ns_delete(char *name)
{ {
struct vrf *vrf = vrf_lookup_by_name(name); struct vrf *vrf = vrf_lookup_by_name(name);
struct interface *ifp, *tmp;
struct ns *ns; struct ns *ns;
if (!vrf) { if (!vrf) {
@ -161,6 +163,25 @@ static int zebra_ns_delete(char *name)
"NS notify : no VRF found using NS %s", name); "NS notify : no VRF found using NS %s", name);
return 0; 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; ns = (struct ns *)vrf->ns_ctxt;
/* the deletion order is the same /* the deletion order is the same
* as the one used when siging signal is received * as the one used when siging signal is received