diff options
| -rw-r--r-- | lib/vrf.h | 1 | ||||
| -rw-r--r-- | zebra/interface.c | 6 | ||||
| -rw-r--r-- | zebra/zebra_netns_notify.c | 33 | ||||
| -rw-r--r-- | zebra/zebra_ns.c | 7 |
4 files changed, 40 insertions, 7 deletions
@@ -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/interface.c b/zebra/interface.c index 01283f9122..7795d34d0b 100644 --- a/zebra/interface.c +++ b/zebra/interface.c @@ -867,6 +867,7 @@ void if_up(struct interface *ifp) { struct zebra_if *zif; struct interface *link_if; + struct zebra_vrf *zvrf = vrf_info_lookup(ifp->vrf_id); zif = ifp->info; zif->up_count++; @@ -909,7 +910,7 @@ void if_up(struct interface *ifp) link_if = ifp; zebra_vxlan_svi_up(ifp, link_if); } else if (IS_ZEBRA_IF_VLAN(ifp)) { - link_if = if_lookup_by_index_per_ns(zebra_ns_lookup(NS_DEFAULT), + link_if = if_lookup_by_index_per_ns(zvrf->zns, zif->link_ifindex); if (link_if) zebra_vxlan_svi_up(ifp, link_if); @@ -922,6 +923,7 @@ void if_down(struct interface *ifp) { struct zebra_if *zif; struct interface *link_if; + struct zebra_vrf *zvrf = vrf_info_lookup(ifp->vrf_id); zif = ifp->info; zif->down_count++; @@ -938,7 +940,7 @@ void if_down(struct interface *ifp) link_if = ifp; zebra_vxlan_svi_down(ifp, link_if); } else if (IS_ZEBRA_IF_VLAN(ifp)) { - link_if = if_lookup_by_index_per_ns(zebra_ns_lookup(NS_DEFAULT), + link_if = if_lookup_by_index_per_ns(zvrf->zns, zif->link_ifindex); if (link_if) zebra_vxlan_svi_down(ifp, link_if); diff --git a/zebra/zebra_netns_notify.c b/zebra/zebra_netns_notify.c index 98b36dd10f..f9beb32ac4 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)); } diff --git a/zebra/zebra_ns.c b/zebra/zebra_ns.c index 29c179245b..d841bdeec4 100644 --- a/zebra/zebra_ns.c +++ b/zebra/zebra_ns.c @@ -135,6 +135,10 @@ int zebra_ns_enable(ns_id_t ns_id, void **info) zns->ns_id = ns_id; + zns->rules_hash = + hash_create_size(8, zebra_pbr_rules_hash_key, + zebra_pbr_rules_hash_equal, "Rules Hash"); + #if defined(HAVE_RTADV) rtadv_init(zns); #endif @@ -287,9 +291,6 @@ int zebra_ns_init(void) /* Default NS is activated */ zebra_ns_enable(ns_id, (void **)&dzns); - dzns->rules_hash = - hash_create_size(8, zebra_pbr_rules_hash_key, - zebra_pbr_rules_hash_equal, "Rules Hash"); if (vrf_is_backend_netns()) { ns_add_hook(NS_NEW_HOOK, zebra_ns_new); ns_add_hook(NS_ENABLE_HOOK, zebra_ns_enabled); |
