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 int vrf_enable(struct vrf *vrf);
extern void vrf_delete(struct vrf *vrf);
#endif /*_ZEBRA_VRF_H*/

View File

@ -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);

View File

@ -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));
}

View File

@ -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);