From 0c902ba575789472612c0e18eaa6f5a27daec5b1 Mon Sep 17 00:00:00 2001 From: Philippe Guibert Date: Thu, 22 Mar 2018 18:02:00 +0100 Subject: [PATCH] zebra: handle the zebra netns delete notifications Upon a 'ip netns del' event, the associated vrf with netns backend is looked for, then the internal contexts are first disabled, then suppressed. Signed-off-by: Philippe Guibert --- lib/vrf.h | 1 + zebra/zebra_netns_notify.c | 33 +++++++++++++++++++++++++++++++-- 2 files changed, 32 insertions(+), 2 deletions(-) diff --git a/lib/vrf.h b/lib/vrf.h index 617405a77e..eb35d97fe1 100644 --- a/lib/vrf.h +++ b/lib/vrf.h @@ -279,5 +279,6 @@ extern int vrf_netns_handler_create(struct vty *vty, struct vrf *vrf, */ extern void vrf_disable(struct vrf *vrf); extern int vrf_enable(struct vrf *vrf); +extern void vrf_delete(struct vrf *vrf); #endif /*_ZEBRA_VRF_H*/ diff --git a/zebra/zebra_netns_notify.c b/zebra/zebra_netns_notify.c index 98b36dd10f..3486bfacdd 100644 --- a/zebra/zebra_netns_notify.c +++ b/zebra/zebra_netns_notify.c @@ -120,6 +120,32 @@ static int zebra_ns_continue_read(struct zebra_netns_info *zns_info, return 0; } +static int zebra_ns_delete(char *name) +{ + struct vrf *vrf = vrf_lookup_by_name(name); + struct ns *ns; + + if (!vrf) { + zlog_warn( + "NS notify : no VRF found using NS %s", + name); + return 0; + } + /* Clear configured flag and invoke delete. */ + UNSET_FLAG(vrf->status, VRF_CONFIGURED); + ns = (struct ns *)vrf->ns_ctxt; + /* the deletion order is the same + * as the one used when siging signal is received + */ + vrf_delete(vrf); + if (ns) + ns_delete(ns); + + zlog_info("NS notify : deleted VRF %s", name); + return 0; +} + + static int zebra_ns_ready_read(struct thread *t) { struct zebra_netns_info *zns_info = THREAD_ARG(t); @@ -178,8 +204,10 @@ static int zebra_ns_notify_read(struct thread *t) char *netnspath; struct zebra_netns_info *netnsinfo; - if (!(event->mask & IN_CREATE)) + if (!(event->mask & (IN_CREATE | IN_DELETE))) continue; + if (event->mask & (IN_DELETE)) + return zebra_ns_delete(event->name); netnspath = ns_netns_pathname(NULL, event->name); if (!netnspath) continue; @@ -234,7 +262,8 @@ void zebra_ns_notify_init(void) zlog_warn("NS notify init: failed to initialize inotify (%s)", safe_strerror(errno)); } - if (inotify_add_watch(fd_monitor, NS_RUN_DIR, IN_CREATE) < 0) { + if (inotify_add_watch(fd_monitor, NS_RUN_DIR, + IN_CREATE | IN_DELETE) < 0) { zlog_warn("NS notify watch: failed to add watch (%s)", safe_strerror(errno)); } -- 2.39.5