Merge pull request #1956 from pguibert6WIND/misc_fixes_netns

Misc fixes netns
This commit is contained in:
Renato Westphal 2018-03-26 13:29:38 -03:00 committed by GitHub
commit 4adfefaeac
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 40 additions and 7 deletions

View File

@ -279,5 +279,6 @@ extern int vrf_netns_handler_create(struct vty *vty, struct vrf *vrf,
*/ */
extern void vrf_disable(struct vrf *vrf); extern void vrf_disable(struct vrf *vrf);
extern int vrf_enable(struct vrf *vrf); extern int vrf_enable(struct vrf *vrf);
extern void vrf_delete(struct vrf *vrf);
#endif /*_ZEBRA_VRF_H*/ #endif /*_ZEBRA_VRF_H*/

View File

@ -867,6 +867,7 @@ void if_up(struct interface *ifp)
{ {
struct zebra_if *zif; struct zebra_if *zif;
struct interface *link_if; struct interface *link_if;
struct zebra_vrf *zvrf = vrf_info_lookup(ifp->vrf_id);
zif = ifp->info; zif = ifp->info;
zif->up_count++; zif->up_count++;
@ -909,7 +910,7 @@ void if_up(struct interface *ifp)
link_if = ifp; link_if = ifp;
zebra_vxlan_svi_up(ifp, link_if); zebra_vxlan_svi_up(ifp, link_if);
} else if (IS_ZEBRA_IF_VLAN(ifp)) { } 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); zif->link_ifindex);
if (link_if) if (link_if)
zebra_vxlan_svi_up(ifp, link_if); zebra_vxlan_svi_up(ifp, link_if);
@ -922,6 +923,7 @@ void if_down(struct interface *ifp)
{ {
struct zebra_if *zif; struct zebra_if *zif;
struct interface *link_if; struct interface *link_if;
struct zebra_vrf *zvrf = vrf_info_lookup(ifp->vrf_id);
zif = ifp->info; zif = ifp->info;
zif->down_count++; zif->down_count++;
@ -938,7 +940,7 @@ void if_down(struct interface *ifp)
link_if = ifp; link_if = ifp;
zebra_vxlan_svi_down(ifp, link_if); zebra_vxlan_svi_down(ifp, link_if);
} else if (IS_ZEBRA_IF_VLAN(ifp)) { } 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); zif->link_ifindex);
if (link_if) if (link_if)
zebra_vxlan_svi_down(ifp, link_if); zebra_vxlan_svi_down(ifp, link_if);

View File

@ -120,6 +120,32 @@ static int zebra_ns_continue_read(struct zebra_netns_info *zns_info,
return 0; 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) static int zebra_ns_ready_read(struct thread *t)
{ {
struct zebra_netns_info *zns_info = THREAD_ARG(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; char *netnspath;
struct zebra_netns_info *netnsinfo; struct zebra_netns_info *netnsinfo;
if (!(event->mask & IN_CREATE)) if (!(event->mask & (IN_CREATE | IN_DELETE)))
continue; continue;
if (event->mask & IN_DELETE)
return zebra_ns_delete(event->name);
netnspath = ns_netns_pathname(NULL, event->name); netnspath = ns_netns_pathname(NULL, event->name);
if (!netnspath) if (!netnspath)
continue; continue;
@ -234,7 +262,8 @@ void zebra_ns_notify_init(void)
zlog_warn("NS notify init: failed to initialize inotify (%s)", zlog_warn("NS notify init: failed to initialize inotify (%s)",
safe_strerror(errno)); 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)", zlog_warn("NS notify watch: failed to add watch (%s)",
safe_strerror(errno)); safe_strerror(errno));
} }

View File

@ -135,6 +135,10 @@ int zebra_ns_enable(ns_id_t ns_id, void **info)
zns->ns_id = ns_id; 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) #if defined(HAVE_RTADV)
rtadv_init(zns); rtadv_init(zns);
#endif #endif
@ -287,9 +291,6 @@ int zebra_ns_init(void)
/* Default NS is activated */ /* Default NS is activated */
zebra_ns_enable(ns_id, (void **)&dzns); 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()) { if (vrf_is_backend_netns()) {
ns_add_hook(NS_NEW_HOOK, zebra_ns_new); ns_add_hook(NS_NEW_HOOK, zebra_ns_new);
ns_add_hook(NS_ENABLE_HOOK, zebra_ns_enabled); ns_add_hook(NS_ENABLE_HOOK, zebra_ns_enabled);