/* Holding NS hooks */
struct ns_master {
- int (*ns_new_hook)(ns_id_t, void **);
- int (*ns_delete_hook)(ns_id_t, void **);
- int (*ns_enable_hook)(ns_id_t, void **);
- int (*ns_disable_hook)(ns_id_t, void **);
+ int (*ns_new_hook)(struct ns *ns);
+ int (*ns_delete_hook)(struct ns *ns);
+ int (*ns_enable_hook)(struct ns *ns);
+ int (*ns_disable_hook)(struct ns *ns);
} ns_master = {
0,
};
else
zlog_info("NS %s is created.", ns->name);
if (ns_master.ns_new_hook)
- (*ns_master.ns_new_hook)(ns->ns_id, &ns->info);
+ (*ns_master.ns_new_hook) (ns);
+ return;
}
/* Get a NS. If not found, create one. */
ns_disable(ns);
if (ns_master.ns_delete_hook)
- (*ns_master.ns_delete_hook)(ns->ns_id, &ns->info);
+ (*ns_master.ns_delete_hook)(ns);
/*
* I'm not entirely sure if the vrf->iflist
* then VRF enable event
*/
if (ns_master.ns_enable_hook)
- (*ns_master.ns_enable_hook)(ns->ns_id, &ns->info);
+ (*ns_master.ns_enable_hook)(ns);
if (vrf_on == 1)
vrf_enable((struct vrf *)ns->vrf_ctxt);
}
zlog_info("NS %u is to be disabled.", ns->ns_id);
if (ns_master.ns_disable_hook)
- (*ns_master.ns_disable_hook)(ns->ns_id, &ns->info);
+ (*ns_master.ns_disable_hook)(ns);
if (have_netns())
close(ns->fd);
/* Add a NS hook. Please add hooks before calling ns_init(). */
-void ns_add_hook(int type, int (*func)(ns_id_t, void **))
+void ns_add_hook(int type, int (*func)(struct ns *))
{
switch (type) {
case NS_NEW_HOOK:
}
/* Initialize NS module. */
-void ns_init(void)
+void ns_init_zebra(void)
{
struct ns *default_ns;
* - param 2: the address of the user data pointer (the user data
* can be stored in or freed from there)
*/
-extern void ns_add_hook(int, int (*)(ns_id_t, void **));
+extern void ns_add_hook(int type, int (*)(struct ns *));
/*
* NS initializer/destructor
*/
-/* Please add hooks before calling ns_init(). */
-extern void ns_init(void);
+extern void ns_init_zebra(void);
extern void ns_terminate(void);
/*
#include "zebra_memory.h"
#include "rt.h"
#include "zebra_vxlan.h"
+#include "debug.h"
DEFINE_MTYPE(ZEBRA, ZEBRA_NS, "Zebra Name Space")
return dzns;
}
+static struct zebra_ns *zebra_ns_alloc(void)
+{
+ return XCALLOC(MTYPE_ZEBRA_NS, sizeof(struct zebra_ns));
+}
+
+static int zebra_ns_new(struct ns *ns)
+{
+ struct zebra_ns *zns;
+
+ if (IS_ZEBRA_DEBUG_EVENT)
+ zlog_info("ZNS %s with id %u (created)", ns->name, ns->ns_id);
+
+ zns = zebra_ns_alloc();
+ ns->info = zns;
+ zns->ns = ns;
+ return 0;
+}
+
+static int zebra_ns_delete(struct ns *ns)
+{
+ struct zebra_ns *zns = (struct zebra_ns *) ns->info;
+
+ if (IS_ZEBRA_DEBUG_EVENT)
+ zlog_info("ZNS %s with id %u (deleted)", ns->name, ns->ns_id);
+ if (!zns)
+ return 0;
+ XFREE(MTYPE_ZEBRA_NS, zns);
+ return 0;
+}
+
+static int zebra_ns_enabled(struct ns *ns)
+{
+ struct zebra_ns *zns = ns->info;
+
+ if (IS_ZEBRA_DEBUG_EVENT)
+ zlog_info("ZNS %s with id %u (enabled)", ns->name, ns->ns_id);
+ if (!zns)
+ return 0;
+ return zebra_ns_enable(ns->ns_id, (void **)&zns);
+}
+
+static int zebra_ns_disabled(struct ns *ns)
+{
+ struct zebra_ns *zns = ns->info;
+
+ if (IS_ZEBRA_DEBUG_EVENT)
+ zlog_info("ZNS %s with id %u (disabled)", ns->name, ns->ns_id);
+ if (!zns)
+ return 0;
+ return zebra_ns_disable(ns->ns_id, (void **)&zns);
+}
+
/* Do global enable actions - open sockets, read kernel config etc. */
int zebra_ns_enable(ns_id_t ns_id, void **info)
{
int zebra_ns_init(void)
{
- dzns = XCALLOC(MTYPE_ZEBRA_NS, sizeof(struct zebra_ns));
+ dzns = zebra_ns_alloc();
+
+ ns_init_zebra();
ns_init();
/* Default NS is activated */
zebra_ns_enable(NS_DEFAULT, (void **)&dzns);
+ if (vrf_is_backend_netns()) {
+ ns_add_hook(NS_NEW_HOOK, zebra_ns_new);
+ ns_add_hook(NS_ENABLE_HOOK, zebra_ns_enabled);
+ ns_add_hook(NS_DISABLE_HOOK, zebra_ns_disabled);
+ ns_add_hook(NS_DELETE_HOOK, zebra_ns_delete);
+ }
return 0;
}
#endif /* HAVE_RTADV */
struct zebra_ns_table_head ns_tables;
+
+ /* Back pointer */
+ struct ns *ns;
};
struct zebra_ns *zebra_ns_lookup(ns_id_t ns_id);