summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorThomas Haller <thaller@redhat.com>2016-03-28 11:24:29 +0200
committerThomas Haller <thaller@redhat.com>2016-03-29 12:55:56 +0200
commitc473cb42d0d7a2157ddba119aac17fdb9c448e2d (patch)
tree64e047bb622599db1e39cc7df2982e91ff925c86
parent75fc7f1d1dffffbb8e5694707960ef14c2c45026 (diff)
downloadNetworkManager-c473cb42d0d7a2157ddba119aac17fdb9c448e2d.tar.gz
netns: refactor NMNetns
- drop platform functions to create and switch namespace. This is done already via NMPNetns. - drop nm_netns_controller_activate_netns() and nm_netns_controller_get_active_netns(). Upper layers don't concern itself with calling setns. Every component that needs it (NMPlatform, NMRDisc) switches namespace via NMPNetns as needed. - make some properties of NMNetns immutable: name, platform, route_manager, etc. don't need to be changed or reset. They are only initalized once. - fix some style issues - use NM_DEFINE_SINGLETON_GETTER() and NM_GOBJECT_PROPERTIES_DEFINE().
-rw-r--r--src/devices/nm-device.c51
-rw-r--r--src/devices/nm-device.h8
-rw-r--r--src/devices/wwan/nm-modem.c2
-rw-r--r--src/main.c8
-rw-r--r--src/netns/nm-netns-controller-dummy.c102
-rw-r--r--src/netns/nm-netns-controller.c459
-rw-r--r--src/netns/nm-netns-controller.h29
-rw-r--r--src/netns/nm-netns-dummy.c12
-rw-r--r--src/netns/nm-netns.c607
-rw-r--r--src/netns/nm-netns.h94
-rw-r--r--src/nm-iface-helper.c3
-rw-r--r--src/nm-ip6-config.c4
-rw-r--r--src/nm-ip6-config.h2
-rw-r--r--src/nm-manager.c4
-rw-r--r--src/nm-policy.c20
-rw-r--r--src/nm-policy.h4
-rw-r--r--src/platform/nm-linux-platform.c104
-rw-r--r--src/platform/nm-linux-platform.h7
-rw-r--r--src/platform/nm-platform.c33
-rw-r--r--src/platform/nm-platform.h8
-rw-r--r--src/tests/config/Makefile.am1
-rw-r--r--src/tests/test-route-manager.c35
22 files changed, 601 insertions, 996 deletions
diff --git a/src/devices/nm-device.c b/src/devices/nm-device.c
index 1138026b63..de3d8ea693 100644
--- a/src/devices/nm-device.c
+++ b/src/devices/nm-device.c
@@ -4301,7 +4301,7 @@ ip4_config_merge_and_apply (NMDevice *self,
*/
connection_has_default_route
- = nm_default_route_manager_ip4_connection_has_default_route (nm_netns_controller_get_default_route_manager (),
+ = nm_default_route_manager_ip4_connection_has_default_route (nm_device_get_default_route_manager (self),
connection, &connection_is_never_default);
if ( !priv->v4_commit_first_time
@@ -5023,7 +5023,7 @@ ip6_config_merge_and_apply (NMDevice *self,
*/
connection_has_default_route
- = nm_default_route_manager_ip6_connection_has_default_route (nm_netns_controller_get_default_route_manager (),
+ = nm_default_route_manager_ip6_connection_has_default_route (nm_device_get_default_route_manager (self),
connection, &connection_is_never_default);
if ( !priv->v6_commit_first_time
@@ -7884,7 +7884,7 @@ nm_device_set_ip4_config (NMDevice *self,
g_clear_object (&priv->dev_ip4_config);
}
- nm_default_route_manager_ip4_update_default_route (nm_netns_controller_get_default_route_manager (), self);
+ nm_default_route_manager_ip4_update_default_route (nm_device_get_default_route_manager (self), self);
if (has_changes) {
_update_ip4_address (self);
@@ -8052,7 +8052,7 @@ nm_device_set_ip6_config (NMDevice *self,
nm_exported_object_get_path (NM_EXPORTED_OBJECT (old_config)));
}
- nm_default_route_manager_ip6_update_default_route (nm_netns_controller_get_default_route_manager (), self);
+ nm_default_route_manager_ip6_update_default_route (nm_device_get_default_route_manager (self), self);
if (has_changes) {
if (old_config != priv->ip6_config)
@@ -9956,14 +9956,14 @@ _cleanup_generic_post (NMDevice *self, CleanupType cleanup_type)
if (cleanup_type == CLEANUP_TYPE_DECONFIGURE) {
priv->default_route.v4_is_assumed = FALSE;
priv->default_route.v6_is_assumed = FALSE;
- nm_default_route_manager_ip4_update_default_route (nm_netns_controller_get_default_route_manager (), self);
- nm_default_route_manager_ip6_update_default_route (nm_netns_controller_get_default_route_manager (), self);
+ nm_default_route_manager_ip4_update_default_route (nm_device_get_default_route_manager (self), self);
+ nm_default_route_manager_ip6_update_default_route (nm_device_get_default_route_manager (self), self);
}
priv->default_route.v4_is_assumed = TRUE;
priv->default_route.v6_is_assumed = TRUE;
- nm_default_route_manager_ip4_update_default_route (nm_netns_controller_get_default_route_manager (), self);
- nm_default_route_manager_ip6_update_default_route (nm_netns_controller_get_default_route_manager (), self);
+ nm_default_route_manager_ip4_update_default_route (nm_device_get_default_route_manager (self), self);
+ nm_default_route_manager_ip6_update_default_route (nm_device_get_default_route_manager (self), self);
priv->v4_commit_first_time = TRUE;
priv->v6_commit_first_time = TRUE;
@@ -10060,7 +10060,7 @@ nm_device_cleanup (NMDevice *self, NMDeviceStateReason reason, CleanupType clean
/* Take out any entries in the routing table and any IP address the device had. */
ifindex = nm_device_get_ip_ifindex (self);
if (ifindex > 0) {
- nm_route_manager_route_flush (nm_netns_controller_get_route_manager (), ifindex);
+ nm_route_manager_route_flush (nm_device_get_route_manager (self), ifindex);
nm_platform_address_flush (nm_device_get_platform(self), ifindex);
}
@@ -11025,15 +11025,38 @@ nm_device_get_platform (NMDevice *self)
{
NMDevicePrivate *priv;
- if (self == NULL)
- return NULL;
+ g_return_val_if_fail (NM_IS_DEVICE (self), NULL);
priv = NM_DEVICE_GET_PRIVATE (self);
+ g_return_val_if_fail (priv->netns, NULL);
- if (priv == NULL)
- return NULL;
+ return nm_netns_get_platform (priv->netns);
+}
+
+NMDefaultRouteManager *
+nm_device_get_default_route_manager (NMDevice *self)
+{
+ NMDevicePrivate *priv;
+
+ g_return_val_if_fail (NM_IS_DEVICE (self), NULL);
+
+ priv = NM_DEVICE_GET_PRIVATE (self);
+ g_return_val_if_fail (priv->netns, NULL);
+
+ return nm_netns_get_default_route_manager (priv->netns);
+}
+
+NMRouteManager *
+nm_device_get_route_manager (NMDevice *self)
+{
+ NMDevicePrivate *priv;
+
+ g_return_val_if_fail (NM_IS_DEVICE (self), NULL);
+
+ priv = NM_DEVICE_GET_PRIVATE (self);
+ g_return_val_if_fail (priv->netns, NULL);
- return nm_netns_get_platform(priv->netns);
+ return nm_netns_get_route_manager (priv->netns);
}
static const char *
diff --git a/src/devices/nm-device.h b/src/devices/nm-device.h
index 7bf996d598..bb5e235845 100644
--- a/src/devices/nm-device.h
+++ b/src/devices/nm-device.h
@@ -26,9 +26,7 @@
#include "nm-exported-object.h"
#include "nm-dbus-interface.h"
-#include "nm-default.h"
#include "nm-connection.h"
-#include "nm-netns.h"
#include "nm-platform.h"
#include "nm-rfkill-manager.h"
#include "NetworkManagerUtils.h"
@@ -571,9 +569,11 @@ void nm_device_update_hw_address (NMDevice *self);
void nm_device_update_initial_hw_address (NMDevice *self);
void nm_device_set_netns (NMDevice *self, NMNetns *netns);
-NMNetns * nm_device_get_netns (NMDevice *self);
+NMNetns *nm_device_get_netns (NMDevice *self);
-NMPlatform * nm_device_get_platform(NMDevice *self);
+NMPlatform *nm_device_get_platform (NMDevice *self);
+NMDefaultRouteManager *nm_device_get_default_route_manager (NMDevice *self);
+NMRouteManager *nm_device_get_route_manager (NMDevice *self);
G_END_DECLS
diff --git a/src/devices/wwan/nm-modem.c b/src/devices/wwan/nm-modem.c
index 232f5f89c6..ecc577ab43 100644
--- a/src/devices/wwan/nm-modem.c
+++ b/src/devices/wwan/nm-modem.c
@@ -978,7 +978,7 @@ deactivate_cleanup (NMModem *self, NMDevice *device)
priv->ip6_method == NM_MODEM_IP_METHOD_AUTO) {
ifindex = nm_device_get_ip_ifindex (device);
if (ifindex > 0) {
- nm_route_manager_route_flush (nm_netns_controller_get_route_manager (), ifindex);
+ nm_route_manager_route_flush (nm_device_get_route_manager (device), ifindex);
nm_platform_address_flush (NM_PLATFORM_GET, ifindex);
nm_platform_link_set_down (NM_PLATFORM_GET, ifindex);
}
diff --git a/src/main.c b/src/main.c
index 9fec8e585d..9e582206ce 100644
--- a/src/main.c
+++ b/src/main.c
@@ -446,12 +446,6 @@ main (int argc, char *argv[])
/* Set up platform interaction layer */
nm_linux_platform_setup ();
- /* Set up network namespace controller */
- if (!nm_netns_controller_setup ()) {
- nm_log_err (LOGD_CORE, "failed to initialize network namespace controller");
- goto done;
- }
-
NM_UTILS_KEEP_ALIVE (config, NM_PLATFORM_GET, "NMConfig-depends-on-NMPlatform");
nm_dispatcher_init ();
@@ -489,8 +483,6 @@ done:
nm_manager_stop (nm_manager_get ());
- nm_netns_controller_stop (nm_netns_controller_get ());
-
if (global_opt.pidfile && wrote_pidfile)
unlink (global_opt.pidfile);
diff --git a/src/netns/nm-netns-controller-dummy.c b/src/netns/nm-netns-controller-dummy.c
index 764a7aed97..1f2feadb75 100644
--- a/src/netns/nm-netns-controller-dummy.c
+++ b/src/netns/nm-netns-controller-dummy.c
@@ -51,52 +51,16 @@
G_DEFINE_TYPE (NMNetnsController, nm_netns_controller, G_TYPE_OBJECT)
-enum {
- PROP_0,
- PROP_REGISTER_SINGLETON,
- LAST_PROP,
-};
-
typedef struct {
- gboolean register_singleton;
-
- /*
- * Only one fixed network namespace
- */
NMNetns *netns;
-
} NMNetnsControllerPrivate;
#define NM_NETNS_CONTROLLER_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), NM_TYPE_NETNS_CONTROLLER, NMNetnsControllerPrivate))
-NM_DEFINE_SINGLETON_INSTANCE (NMNetnsController);
-
-NM_DEFINE_SINGLETON_REGISTER (NMNetnsController);
-
-void nm_netns_controller_activate_root_netns(void)
-{
-}
-
-void nm_netns_controller_activate_netns(NMNetns *netns)
-{
-}
-
-NMRouteManager *
-nm_netns_controller_get_route_manager(void)
-{
- NMNetnsControllerPrivate *priv = NM_NETNS_CONTROLLER_GET_PRIVATE (singleton_instance);
-
- return nm_netns_get_route_manager(priv->netns);
-}
+NM_DEFINE_SINGLETON_GETTER (NMNetnsController, nm_netns_controller_get, NM_TYPE_NETNS_CONTROLLER);
NMNetns *
-nm_netns_controller_get_root_netns(void)
-{
- return nm_netns_controller_get_active_netns();
-}
-
-NMNetns *
-nm_netns_controller_get_active_netns(void)
+nm_netns_controller_get_root_netns (void)
{
NMNetnsControllerPrivate *priv = NM_NETNS_CONTROLLER_GET_PRIVATE (singleton_instance);
@@ -105,68 +69,6 @@ nm_netns_controller_get_active_netns(void)
/******************************************************************/
-/**
- * nm_netns_controller_setup:
- * @instance: the #NMNetnsController instance
- *
- * Failing to set up #NMNetnsController singleton results in a fatal
- * error, as well as trying to initialize it multiple times without
- * freeing it.
- *
- * NetworkManager will typically use only one network manager controller
- * object during its run.
- */
-gboolean
-nm_netns_controller_setup (void)
-{
- NMNetnsControllerPrivate *priv;
-
- g_return_val_if_fail (!singleton_instance, FALSE);
-
- singleton_instance = nm_netns_controller_new();
-
- nm_singleton_instance_register ();
-
- priv = NM_NETNS_CONTROLLER_GET_PRIVATE (singleton_instance);
-
- priv->netns = nm_netns_new(NULL);
-
- nm_log_dbg (LOGD_NETNS, "setup %s singleton (%p, %s)",
- "NMNetnsController", singleton_instance,
- G_OBJECT_TYPE_NAME (singleton_instance));
-
- return TRUE;
-}
-
-NMNetnsController *
-nm_netns_controller_get(void)
-{
- return singleton_instance;
-}
-
-void
-nm_netns_controller_stop (NMNetnsController *self)
-{
- NMNetnsControllerPrivate *priv = NM_NETNS_CONTROLLER_GET_PRIVATE (self);
-
- nm_netns_stop(priv->netns);
- g_clear_object(&priv->netns);
-}
-
-NMNetnsController *
-nm_netns_controller_new (void)
-{
- NMNetnsController *self;
-
- self = g_object_new (NM_TYPE_NETNS_CONTROLLER,
- NM_NETNS_CONTROLLER_REGISTER_SINGLETON, TRUE,
- NULL);
-
- return self;
-}
-
-/******************************************************************/
-
static void
nm_netns_controller_init (NMNetnsController *self)
{
diff --git a/src/netns/nm-netns-controller.c b/src/netns/nm-netns-controller.c
index 0e69bbdda8..5b15c30c50 100644
--- a/src/netns/nm-netns-controller.c
+++ b/src/netns/nm-netns-controller.c
@@ -19,32 +19,31 @@
* with this program; if not, write to the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*
- * (C) Copyright 2007 - 2011 Red Hat, Inc.
- * (C) Copyright 2008 Novell, Inc.
+ * (C) Copyright 2016 Red Hat, Inc.
*/
-#include "config.h"
+#include "nm-default.h"
+
+#include "nm-netns-controller.h"
#include <gmodule.h>
-#include <nm-dbus-interface.h>
+#include "nm-dbus-interface.h"
+#include "config.h"
+#include "nmp-netns.h"
#include "nm-platform.h"
#include "nm-linux-platform.h"
#include "nm-device.h"
#include "nm-netns.h"
-#include "nm-netns-controller.h"
#include "NetworkManagerUtils.h"
#include "nmdbus-netns-controller.h"
G_DEFINE_TYPE (NMNetnsController, nm_netns_controller, NM_TYPE_EXPORTED_OBJECT)
-enum {
- PROP_0,
- PROP_REGISTER_SINGLETON,
+NM_GOBJECT_PROPERTIES_DEFINE (NMNetnsController,
PROP_NETWORK_NAMESPACES,
- LAST_PROP,
-};
+);
enum {
NETNS_ADDED,
@@ -54,32 +53,17 @@ enum {
static guint signals[LAST_SIGNAL] = { 0 };
typedef struct {
- gboolean register_singleton;
-
- /*
- * Pointer to a root network namespace
- */
NMNetns *root_ns;
-
- /*
- * Pointer to a currently active network namespace
- */
- NMNetns *active_ns;
-
- /*
- * Hash table of NMNetns object indexed by DBus path they are
- * exported at.
- */
GHashTable *network_namespaces;
} NMNetnsControllerPrivate;
#define NM_NETNS_CONTROLLER_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), NM_TYPE_NETNS_CONTROLLER, NMNetnsControllerPrivate))
-NM_DEFINE_SINGLETON_INSTANCE (NMNetnsController);
+NM_DEFINE_SINGLETON_GETTER (NMNetnsController, nm_netns_controller_get, NM_TYPE_NETNS_CONTROLLER);
-NM_DEFINE_SINGLETON_REGISTER (NMNetnsController);
+#define NETNS_ROOT_NAME "rootns"
-#define NETNS_ROOT_NAME "rootns"
+static void namespace_destroy (gpointer data);
/******************************************************************/
@@ -90,10 +74,11 @@ find_netns_key_by_name(NMNetnsController *self, const char *netnsname)
GHashTableIter iter;
gpointer key, value;
- g_hash_table_iter_init (&iter, priv->network_namespaces);
- while (g_hash_table_iter_next (&iter, &key, &value))
+ g_hash_table_iter_init (&iter, priv->network_namespaces);
+ while (g_hash_table_iter_next (&iter, &key, &value)) {
if (!strcmp(netnsname, nm_netns_get_name(value)))
return key;
+ }
return NULL;
}
@@ -101,46 +86,6 @@ find_netns_key_by_name(NMNetnsController *self, const char *netnsname)
/******************************************************************/
-void
-nm_netns_controller_activate_root_netns(void)
-{
- NMNetnsControllerPrivate *priv = NM_NETNS_CONTROLLER_GET_PRIVATE (singleton_instance);
-
- nm_log_dbg (LOGD_NETNS, "Activating root network namespace %s (net_id=%d)",
- nm_netns_get_name(priv->root_ns), nm_netns_get_id(priv->root_ns));
-
- g_assert(priv->root_ns);
-
- nm_platform_netns_activate(NM_PLATFORM_GET, nm_netns_get_id(priv->root_ns));
-
- if (priv->active_ns)
- g_object_unref(priv->active_ns);
-
- priv->active_ns = priv->root_ns;
- g_object_ref(priv->root_ns);
-}
-
-void
-nm_netns_controller_activate_netns(NMNetns *netns)
-{
- NMNetnsControllerPrivate *priv = NM_NETNS_CONTROLLER_GET_PRIVATE (singleton_instance);
-
- nm_log_dbg (LOGD_NETNS, "Activating network namespace %s (net_id=%d)",
- nm_netns_get_name(netns), nm_netns_get_id(netns));
-
- g_assert(netns);
-
- nm_platform_netns_activate(NM_PLATFORM_GET, nm_netns_get_id(netns));
-
- if (priv->active_ns)
- g_object_unref(priv->active_ns);
-
- priv->active_ns = netns;
- g_object_ref(netns);
-}
-
-/******************************************************************/
-
NMNetns *
nm_netns_controller_get_root_netns (void)
{
@@ -150,14 +95,6 @@ nm_netns_controller_get_root_netns (void)
}
NMNetns *
-nm_netns_controller_get_active_netns (void)
-{
- NMNetnsControllerPrivate *priv = NM_NETNS_CONTROLLER_GET_PRIVATE (singleton_instance);
-
- return priv->active_ns;
-}
-
-NMNetns *
nm_netns_controller_find_netns_by_path(const char *netns_path)
{
NMNetnsControllerPrivate *priv = NM_NETNS_CONTROLLER_GET_PRIVATE (singleton_instance);
@@ -172,46 +109,15 @@ nm_netns_controller_find_netns_by_name(const char *netns_name)
GHashTableIter iter;
gpointer value;
- g_hash_table_iter_init (&iter, priv->network_namespaces);
- while (g_hash_table_iter_next (&iter, NULL, &value))
+ g_hash_table_iter_init (&iter, priv->network_namespaces);
+ while (g_hash_table_iter_next (&iter, NULL, &value)) {
if (!strcmp (nm_netns_get_name(value), netns_name))
return value;
+ }
return NULL;
}
-NMPlatform *
-nm_netns_controller_get_active_platform (void)
-{
- NMNetnsControllerPrivate *priv = NM_NETNS_CONTROLLER_GET_PRIVATE (singleton_instance);
-
- return nm_netns_get_platform(priv->active_ns);
-}
-
-NMPlatform *
-nm_netns_controller_get_root_platform (NMNetnsController *self)
-{
- NMNetnsControllerPrivate *priv = NM_NETNS_CONTROLLER_GET_PRIVATE (self);
-
- return nm_netns_get_platform(priv->root_ns);
-}
-
-NMDefaultRouteManager *
-nm_netns_controller_get_default_route_manager (void)
-{
- NMNetnsControllerPrivate *priv = NM_NETNS_CONTROLLER_GET_PRIVATE (singleton_instance);
-
- return nm_netns_get_default_route_manager(priv->active_ns);
-}
-
-NMRouteManager *
-nm_netns_controller_get_route_manager (void)
-{
- NMNetnsControllerPrivate *priv = NM_NETNS_CONTROLLER_GET_PRIVATE (singleton_instance);
-
- return nm_netns_get_route_manager(priv->active_ns);
-}
-
/******************************************************************/
NMDevice *
@@ -222,75 +128,63 @@ nm_netns_controller_find_device_by_path (const char *device_path)
gpointer value;
NMDevice *device;
- g_hash_table_iter_init (&iter, priv->network_namespaces);
- while (g_hash_table_iter_next (&iter, NULL, &value))
+ g_hash_table_iter_init (&iter, priv->network_namespaces);
+ while (g_hash_table_iter_next (&iter, NULL, &value)) {
if ((device = nm_netns_get_device_by_path (value, device_path)) != NULL)
return device;
+ }
return NULL;
}
/******************************************************************/
+static void
+namespace_destroy (gpointer data)
+{
+ NMNetns *netns = data;
+
+ g_return_if_fail (NM_IS_NETNS (netns));
+
+ nm_netns_stop (netns);
+ nm_exported_object_clear_and_unexport (&netns);
+}
+
static NMNetns *
-create_new_namespace (NMNetnsController *self, const char *netnsname,
- gboolean isroot)
+create_new_namespace (NMNetnsController *self, const char *netnsname)
{
NMNetnsControllerPrivate *priv = NM_NETNS_CONTROLLER_GET_PRIVATE (self);
NMNetns *netns;
-
+ nm_auto_pop_netns NMPNetns *netnsp = NULL;
const char *path;
- int netns_id;
-
- netns = nm_netns_new(netnsname);
-
- /*
- * When creating new namespace it isn't important which platform
- * module we are using, so use the main one.
- */
- if ((netns_id = nm_platform_netns_create(NM_PLATFORM_GET, netnsname, isroot)) == -1) {
- nm_log_err (LOGD_NETNS, "error creating namespace %s (root=%s)",
- netnsname, isroot ? "yes" : "no");
- g_object_unref(netns);
- return NULL;
- }
- nm_netns_set_id(netns, netns_id);
-
- if (isroot) {
- nm_netns_set_platform(netns, NM_PLATFORM_GET);
- priv->root_ns = netns;
- g_object_ref(netns);
- } else {
- /* Instantiate a new platform layer for the created network namespace */
- nm_netns_set_platform(netns, nm_linux_platform_new());
+ netnsp = nmp_netns_new ();
+ if (!netnsp) {
+ nm_log_err (LOGD_NETNS, "error creating namespace");
+ return NULL;
}
- nm_netns_controller_activate_netns(netns);
+ netns = nm_netns_new (netnsname);
- if (!nm_netns_setup(netns, isroot)) {
- nm_log_dbg (LOGD_NETNS, "error setting up namespace %s ", netnsname);
- g_object_unref(netns);
- nm_netns_controller_activate_root_netns();
+ if (!nm_netns_setup (netns)) {
+ nm_log_dbg (LOGD_NETNS, "error setting up namespace %s ", netnsname);
+ g_object_unref (netns);
return NULL;
}
- nm_netns_controller_activate_root_netns();
+ path = nm_exported_object_export (NM_EXPORTED_OBJECT (netns));
+ g_hash_table_insert (priv->network_namespaces, g_strdup (path), netns);
- path = nm_netns_export(netns);
- g_hash_table_insert(priv->network_namespaces, (gpointer)path, netns);
-
- /* Emit D-Bus signals */
g_signal_emit (self, signals[NETNS_ADDED], 0, netns);
- g_object_notify (G_OBJECT (self), NM_NETNS_CONTROLLER_NETWORK_NAMESPACES);
+ _notify (self, PROP_NETWORK_NAMESPACES);
return netns;
}
NMNetns *
-nm_netns_controller_new_netns(const char *netns_name)
+nm_netns_controller_new_netns (const char *netns_name)
{
- return create_new_namespace (singleton_instance, netns_name, FALSE);
+ return create_new_namespace (singleton_instance, netns_name);
}
void
@@ -313,8 +207,7 @@ nm_netns_controller_remove_netns (NMNetnsController *self,
/* Remove network namespace from a list */
g_hash_table_remove(priv->network_namespaces, path);
- /* Signal change in property */
- g_object_notify (G_OBJECT (self), NM_NETNS_CONTROLLER_NETWORK_NAMESPACES);
+ _notify (self, PROP_NETWORK_NAMESPACES);
}
/******************************************************************/
@@ -329,14 +222,14 @@ impl_netns_controller_list_namespaces (NMNetnsController *self,
gpointer key;
network_namespaces = g_ptr_array_sized_new (g_hash_table_size (priv->network_namespaces) + 1);
- g_hash_table_iter_init (&iter, priv->network_namespaces);
- while (g_hash_table_iter_next (&iter, &key, NULL))
- g_ptr_array_add (network_namespaces, key);
- g_ptr_array_add (network_namespaces, NULL);
-
- g_dbus_method_invocation_return_value (context,
- g_variant_new ("(^ao)", network_namespaces->pdata));
- g_ptr_array_unref (network_namespaces);
+ g_hash_table_iter_init (&iter, priv->network_namespaces);
+ while (g_hash_table_iter_next (&iter, &key, NULL))
+ g_ptr_array_add (network_namespaces, key);
+ g_ptr_array_add (network_namespaces, NULL);
+
+ g_dbus_method_invocation_return_value (context,
+ g_variant_new ("(^ao)", network_namespaces->pdata));
+ g_ptr_array_unref (network_namespaces);
}
static void
@@ -346,15 +239,16 @@ impl_netns_controller_add_namespace (NMNetnsController *self,
{
NMNetns *netns;
- if ((netns = create_new_namespace(self, netnsname, FALSE)) != NULL) {
+ if ((netns = create_new_namespace (self, netnsname)) != NULL) {
g_dbus_method_invocation_return_value (context,
- g_variant_new ("(o)",
- nm_exported_object_get_path (NM_EXPORTED_OBJECT (netns))));
- } else
+ g_variant_new ("(o)",
+ nm_exported_object_get_path (NM_EXPORTED_OBJECT (netns))));
+ } else {
g_dbus_method_invocation_return_error (context,
- NM_NETNS_ERROR,
- NM_NETNS_ERROR_FAILED,
- "Error creating network namespace");
+ NM_NETNS_ERROR,
+ NM_NETNS_ERROR_FAILED,
+ "Error creating network namespace");
+ }
}
static void
@@ -369,143 +263,40 @@ impl_netns_controller_remove_namespace (NMNetnsController *self,
path = find_netns_key_by_name(self, netnsname);
nm_log_dbg (LOGD_NETNS, "Removing network namespace %s (path %s)",
- netnsname, path);
+ netnsname, path);
if (path == NULL) {
nm_log_err (LOGD_NETNS, "Network namespace %s not found", netnsname);
g_dbus_method_invocation_return_error (context,
- NM_NETNS_ERROR,
- NM_NETNS_ERROR_NOT_FOUND,
- "Network name space not found");
+ NM_NETNS_ERROR,
+ NM_NETNS_ERROR_NOT_FOUND,
+ "Network name space not found");
return;
}
- netns = g_hash_table_lookup(priv->network_namespaces, path);
+ netns = g_hash_table_lookup (priv->network_namespaces, path);
if (netns == priv->root_ns) {
nm_log_err (LOGD_NETNS, "Root namespace %s can not be removed", netnsname);
g_dbus_method_invocation_return_error (context,
- NM_NETNS_ERROR,
- NM_NETNS_ERROR_PERMISSION_DENIED,
- "Root network namespace can not be removed");
+ NM_NETNS_ERROR,
+ NM_NETNS_ERROR_PERMISSION_DENIED,
+ "Root network namespace can not be removed");
return;
}
nm_netns_controller_remove_netns (self, netns);
g_dbus_method_invocation_return_value (context,
- g_variant_new ("(s)",
- "Success"));
-}
-
-/**
- * nm_netns_controller_setup:
- * @instance: the #NMNetnsController instance
- *
- * Failing to set up #NMNetnsController singleton results in a fatal
- * error, as well as trying to initialize it multiple times without
- * freeing it.
- *
- * NetworkManager will typically use only one network manager controller
- * object during its run.
- */
-gboolean
-nm_netns_controller_setup (void)
-{
- g_return_val_if_fail (!singleton_instance, FALSE);
-
- singleton_instance = nm_netns_controller_new();
-
- nm_singleton_instance_register ();
-
- nm_log_dbg (LOGD_NETNS, "setup %s singleton (%p, %s)",
- "NMNetnsController", singleton_instance,
- G_OBJECT_TYPE_NAME (singleton_instance));
-
- return create_new_namespace(singleton_instance, NETNS_ROOT_NAME, TRUE) ? TRUE : FALSE;
-}
-
-NMNetnsController *
-nm_netns_controller_get (void)
-{
- return singleton_instance;
-}
-
-void
-nm_netns_controller_stop (NMNetnsController *self)
-{
- NMNetnsControllerPrivate *priv;
- GHashTableIter iter;
- gpointer value;
-
- if (!self)
- return;
-
- priv = NM_NETNS_CONTROLLER_GET_PRIVATE (self);
-
- g_hash_table_iter_init (&iter, priv->network_namespaces);
- while (g_hash_table_iter_next (&iter, NULL, &value))
- nm_netns_stop(value);
-
- g_hash_table_destroy (priv->network_namespaces);
- priv->network_namespaces = NULL;
-
- g_object_unref(priv->root_ns);
- g_object_unref(priv->active_ns);
-
- priv->root_ns = priv->active_ns = NULL;
-}
-
-NMNetnsController *
-nm_netns_controller_new (void)
-{
- NMNetnsController *self;
- NMNetnsControllerPrivate *priv;
-
- self = g_object_new (NM_TYPE_NETNS_CONTROLLER,
- NM_NETNS_CONTROLLER_REGISTER_SINGLETON, TRUE,
- NULL);
-
- priv = NM_NETNS_CONTROLLER_GET_PRIVATE (self);
-
- nm_exported_object_export (NM_EXPORTED_OBJECT (self));
-
- nm_log_dbg (LOGD_NETNS, "Created network namespace controller.");
-
- return self;
-}
-
-static void
-nm_netns_controller_init (NMNetnsController *self)
-{
- NMNetnsControllerPrivate *priv = NM_NETNS_CONTROLLER_GET_PRIVATE (self);
-
- priv->network_namespaces = g_hash_table_new_full (g_str_hash, g_str_equal, NULL, g_object_unref);
+ g_variant_new ("(s)",
+ "Success"));
}
/******************************************************************/
static void
-set_property (GObject *object, guint prop_id,
- const GValue *value, GParamSpec *pspec)
-{
- NMNetnsController *self = NM_NETNS_CONTROLLER (object);
- NMNetnsControllerPrivate *priv = NM_NETNS_CONTROLLER_GET_PRIVATE (self);
-
- switch (prop_id) {
- case PROP_REGISTER_SINGLETON:
- /* construct-only */
- priv->register_singleton = g_value_get_boolean (value);
- break;
- default:
- G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
- break;
- }
-}
-
-static void
get_property (GObject *object, guint prop_id,
- GValue *value, GParamSpec *pspec)
+ GValue *value, GParamSpec *pspec)
{
NMNetnsController *self = NM_NETNS_CONTROLLER (object);
NMNetnsControllerPrivate *priv = NM_NETNS_CONTROLLER_GET_PRIVATE (self);
@@ -534,6 +325,50 @@ get_property (GObject *object, guint prop_id,
}
static void
+nm_netns_controller_init (NMNetnsController *self)
+{
+ NMNetnsControllerPrivate *priv = NM_NETNS_CONTROLLER_GET_PRIVATE (self);
+
+ priv->network_namespaces = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, namespace_destroy);
+}
+
+static void
+constructed (GObject *object)
+{
+ NMNetnsController *self = NM_NETNS_CONTROLLER (object);
+ NMNetnsControllerPrivate *priv = NM_NETNS_CONTROLLER_GET_PRIVATE (self);
+ NMNetns *netns;
+ const char *path;
+
+ G_OBJECT_CLASS (nm_netns_controller_parent_class)->constructed (object);
+
+ netns = nm_netns_new (NETNS_ROOT_NAME);
+ if (!nm_netns_setup (netns))
+ nm_log_err (LOGD_NETNS, "error setting up root namespace %s", NETNS_ROOT_NAME);
+
+ path = nm_exported_object_export (NM_EXPORTED_OBJECT (netns));
+ g_hash_table_insert (priv->network_namespaces, g_strdup (path), netns);
+
+ priv->root_ns = g_object_ref (netns);
+}
+
+static void
+dispose (GObject *object)
+{
+ NMNetnsController *self = NM_NETNS_CONTROLLER (object);
+ NMNetnsControllerPrivate *priv = NM_NETNS_CONTROLLER_GET_PRIVATE (self);
+
+ if (priv->network_namespaces) {
+ g_hash_table_destroy (priv->network_namespaces);
+ priv->network_namespaces = NULL;
+ }
+
+ g_clear_object (&priv->root_ns);
+
+ G_OBJECT_CLASS (nm_netns_controller_parent_class)->dispose (object);
+}
+
+static void
nm_netns_controller_class_init (NMNetnsControllerClass *klass)
{
GObjectClass *object_class = G_OBJECT_CLASS (klass);
@@ -542,48 +377,42 @@ nm_netns_controller_class_init (NMNetnsControllerClass *klass)
g_type_class_add_private (klass, sizeof (NMNetnsControllerPrivate));
exported_object_class->export_path = NM_DBUS_PATH_NETNS_CONTROLLER;
+ exported_object_class->export_on_construction = TRUE;
/* virtual methods */
- object_class->set_property = set_property;
object_class->get_property = get_property;
+ object_class->constructed = constructed;
+ object_class->dispose = dispose;
- g_object_class_install_property
- (object_class, PROP_REGISTER_SINGLETON,
- g_param_spec_boolean (NM_NETNS_CONTROLLER_REGISTER_SINGLETON, "", "",
- FALSE,
- G_PARAM_WRITABLE |
- G_PARAM_CONSTRUCT_ONLY |
- G_PARAM_STATIC_STRINGS));
-
- g_object_class_install_property
- (object_class, PROP_NETWORK_NAMESPACES,
- g_param_spec_boxed (NM_NETNS_CONTROLLER_NETWORK_NAMESPACES, "", "",
- G_TYPE_STRV,
- G_PARAM_READABLE |
- G_PARAM_STATIC_STRINGS));
+ obj_properties[PROP_NETWORK_NAMESPACES] =
+ g_param_spec_boxed (NM_NETNS_CONTROLLER_NETWORK_NAMESPACES, "", "",
+ G_TYPE_STRV,
+ G_PARAM_READABLE |
+ G_PARAM_STATIC_STRINGS);
+ g_object_class_install_properties (object_class, _PROPERTY_ENUMS_LAST, obj_properties);
/* Signals */
signals[NETNS_ADDED] =
- g_signal_new (NM_NETNS_CONTROLLER_NETNS_ADDED,
- G_OBJECT_CLASS_TYPE (object_class),
- G_SIGNAL_RUN_FIRST,
- 0, NULL, NULL, NULL,
- G_TYPE_NONE, 1, NM_TYPE_NETNS);
+ g_signal_new (NM_NETNS_CONTROLLER_NETNS_ADDED,
+ G_OBJECT_CLASS_TYPE (object_class),
+ G_SIGNAL_RUN_FIRST,
+ 0, NULL, NULL, NULL,
+ G_TYPE_NONE, 1, NM_TYPE_NETNS);
signals[NETNS_REMOVED] =
- g_signal_new (NM_NETNS_CONTROLLER_NETNS_REMOVED,
- G_OBJECT_CLASS_TYPE (object_class),
- G_SIGNAL_RUN_FIRST,
- 0, NULL, NULL, NULL,
- G_TYPE_NONE, 1, NM_TYPE_NETNS);
+ g_signal_new (NM_NETNS_CONTROLLER_NETNS_REMOVED,
+ G_OBJECT_CLASS_TYPE (object_class),
+ G_SIGNAL_RUN_FIRST,
+ 0, NULL, NULL, NULL,
+ G_TYPE_NONE, 1, NM_TYPE_NETNS);
-// TODO: Signal that namespace is removed
+ // TODO: Signal that namespace is removed
nm_exported_object_class_add_interface (NM_EXPORTED_OBJECT_CLASS (klass),
- NMDBUS_TYPE_NETWORK_NAMESPACES_CONTROLLER_SKELETON,
- "ListNetworkNamespaces", impl_netns_controller_list_namespaces,
- "AddNetworkNamespace", impl_netns_controller_add_namespace,
- "RemoveNetworkNamespace", impl_netns_controller_remove_namespace,
- NULL);
+ NMDBUS_TYPE_NETWORK_NAMESPACES_CONTROLLER_SKELETON,
+ "ListNetworkNamespaces", impl_netns_controller_list_namespaces,
+ "AddNetworkNamespace", impl_netns_controller_add_namespace,
+ "RemoveNetworkNamespace", impl_netns_controller_remove_namespace,
+ NULL);
}
diff --git a/src/netns/nm-netns-controller.h b/src/netns/nm-netns-controller.h
index baf0f5ea75..c18b07123c 100644
--- a/src/netns/nm-netns-controller.h
+++ b/src/netns/nm-netns-controller.h
@@ -19,19 +19,13 @@
* with this program; if not, write to the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*
- * (C) Copyright 2007 - 2011 Red Hat, Inc.
- * (C) Copyright 2008 Novell, Inc.
+ * (C) Copyright 2016 Red Hat, Inc.
*/
#ifndef __NM_NETNS_CONTROLLER_H__
#define __NM_NETNS_CONTROLLER_H__
-#include "nm-types.h"
-
#include "nm-exported-object.h"
-#include "nm-platform.h"
-#include "nm-default-route-manager.h"
-#include "nm-route-manager.h"
#define NM_TYPE_NETNS_CONTROLLER (nm_netns_controller_get_type ())
#define NM_NETNS_CONTROLLER(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), NM_TYPE_NETNS_CONTROLLER, NMNetnsController))
@@ -48,25 +42,16 @@ typedef struct {
NMExportedObjectClass parent_class;
} NMNetnsControllerClass;
-#define NM_NETNS_CONTROLLER_REGISTER_SINGLETON "register-singleton"
-#define NM_NETNS_CONTROLLER_NETWORK_NAMESPACES "network-namespaces"
+#define NM_NETNS_CONTROLLER_NETWORK_NAMESPACES "network-namespaces"
/* Signals */
-#define NM_NETNS_CONTROLLER_NETNS_ADDED "network-namespace-added"
-#define NM_NETNS_CONTROLLER_NETNS_REMOVED "network-namespace-removed"
+#define NM_NETNS_CONTROLLER_NETNS_ADDED "network-namespace-added"
+#define NM_NETNS_CONTROLLER_NETNS_REMOVED "network-namespace-removed"
GType nm_netns_controller_get_type (void);
-gboolean nm_netns_controller_setup (void);
-
NMNetnsController * nm_netns_controller_get (void);
-void nm_netns_controller_stop (NMNetnsController *self);
-
-void nm_netns_controller_activate_root_netns (void);
-void nm_netns_controller_activate_netns (NMNetns *netns);
-
-NMNetns * nm_netns_controller_get_active_netns (void);
NMNetns * nm_netns_controller_get_root_netns (void);
NMNetns * nm_netns_controller_find_netns_by_path (const char *netns_path);
@@ -79,12 +64,6 @@ NMNetns * nm_netns_controller_new_netns (const char *netns_name);
void nm_netns_controller_remove_netns (NMNetnsController *self, NMNetns *netns);
-NMPlatform * nm_netns_controller_get_active_platform (void);
-NMPlatform * nm_netns_controller_get_root_platform (NMNetnsController *self);
-
-NMDefaultRouteManager *nm_netns_controller_get_default_route_manager (void);
-NMRouteManager *nm_netns_controller_get_route_manager (void);
-
NMNetnsController *nm_netns_controller_new (void);
#endif /* __NM_NETNS_CONTROLLER_H__ */
diff --git a/src/netns/nm-netns-dummy.c b/src/netns/nm-netns-dummy.c
index f6f00a780e..534ca23bd5 100644
--- a/src/netns/nm-netns-dummy.c
+++ b/src/netns/nm-netns-dummy.c
@@ -71,17 +71,9 @@ nm_netns_stop (NMNetns *self)
}
NMNetns *
-nm_netns_new (const char *netns_name)
+nm_netns_new ()
{
- NMNetns *netns;
- NMNetnsPrivate *priv;
-
- netns = g_object_new (NM_TYPE_NETNS, NULL);
-
- priv = NM_NETNS_GET_PRIVATE (netns);
- priv->route_manager = nm_route_manager_new(nm_netns_get_platform (netns));
-
- return netns;
+ return g_object_new (NM_TYPE_NETNS, NULL);
}
/******************************************************************/
diff --git a/src/netns/nm-netns.c b/src/netns/nm-netns.c
index 4ffc7e18cf..fbfcf39543 100644
--- a/src/netns/nm-netns.c
+++ b/src/netns/nm-netns.c
@@ -19,26 +19,25 @@
* with this program; if not, write to the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*
- * (C) Copyright 2007 - 2011 Red Hat, Inc.
- * (C) Copyright 2008 Novell, Inc.
+ * (C) Copyright 2016 Red Hat, Inc.
*/
-#include "config.h"
+#include "nm-default.h"
-#include <stdio.h>
+#include "nm-netns.h"
+#include <stdio.h>
#include <gmodule.h>
-#include <nm-dbus-interface.h>
+
+#include "nm-dbus-interface.h"
#include "nm-config.h"
-#include "nm-macros-internal.h"
#include "nm-default-route-manager.h"
#include "nm-route-manager.h"
#include "nm-device.h"
#include "nm-device-generic.h"
#include "nm-platform.h"
#include "nm-device-factory.h"
-#include "nm-netns.h"
#include "nm-netns-controller.h"
#include "nm-connectivity.h"
#include "nm-settings.h"
@@ -57,7 +56,8 @@
#include "nm-activation-request.h"
#include "nm-core-internal.h"
#include "nm-policy.h"
-#include "nm-logging.h"
+#include "nmp-netns.h"
+#include "nm-linux-platform.h"
#include "nmdbus-netns.h"
@@ -83,12 +83,18 @@ active_connection_state_changed (NMActiveConnection *active,
GParamSpec *pspec,
NMNetns *self);
+static void platform_link_cb (NMPlatform *platform,
+ NMPObjectType obj_type,
+ int ifindex,
+ NMPlatformLink *plink,
+ NMPlatformSignalChangeType change_type,
+ gpointer user_data);
+
G_DEFINE_TYPE (NMNetns, nm_netns, NM_TYPE_EXPORTED_OBJECT)
#define NM_NETNS_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), NM_TYPE_NETNS, NMNetnsPrivate))
-enum {
- PROP_0 = 0,
+NM_GOBJECT_PROPERTIES_DEFINE (NMNetns,
PROP_NAME,
PROP_DEVICES,
PROP_ALL_DEVICES,
@@ -96,7 +102,7 @@ enum {
PROP_PRIMARY_CONNECTION,
PROP_PRIMARY_CONNECTION_TYPE,
PROP_METERED,
-};
+);
enum {
DEVICE_ADDED,
@@ -141,25 +147,15 @@ typedef struct {
typedef struct {
/*
- * Is this root network namespace? For root network namespace
- * behavior is special.
- */
- gboolean isroot;
-
- /*
- * file descriptor of file in directory /var/run/netns/
- * where network namespace is mounted. It is necessary
- * to have it because setns() system call needs it as a
- * paramter.
- */
- int fd;
-
- /*
* Network namespace name, as created in /var/run/netns/
* directory.
*/
char *name;
+ bool bound:1;
+
+ NMPNetns *netns;
+
/*
* Platform interaction layer
*/
@@ -242,6 +238,23 @@ typedef struct {
/************************************************************************/
+gboolean
+nm_netns_push (NMNetns *self, NMPNetns **netnsp)
+{
+ NMNetnsPrivate *priv;
+
+ g_return_val_if_fail (NM_IS_NETNS (self), FALSE);
+
+ priv = NM_NETNS_GET_PRIVATE (self);
+ if ( !priv->netns
+ || !nmp_netns_push (priv->netns)) {
+ NM_SET_OUT (netnsp, NULL);
+ return FALSE;
+ }
+ NM_SET_OUT (netnsp, priv->netns);
+ return TRUE;
+}
+
/*
* Functions that manipulate device change callback structure
*/
@@ -365,96 +378,100 @@ nm_netns_device_change_callback_activate_and_remove(NMNetns *self, NMDevice *dev
/**************************************************************/
-const char *
-nm_netns_export(NMNetns *self)
+static gboolean
+_is_root (NMNetns *self)
{
- const char *path;
-
- path = nm_exported_object_export (NM_EXPORTED_OBJECT (self));
+ NMNetnsPrivate *priv = NM_NETNS_GET_PRIVATE (self);
- return g_strdup(path);
+ return !priv->netns || priv->netns == nmp_netns_get_initial ();
}
/**************************************************************/
-void
-nm_netns_set_name(NMNetns *self, const char *name)
-{
- NMNetnsPrivate *priv = NM_NETNS_GET_PRIVATE (self);
-
- if (priv->name)
- g_free(priv->name);
-
- priv->name = g_strdup(name);
-
- g_object_notify (G_OBJECT (self), NM_NETNS_NAME);
-}
-
const char *
-nm_netns_get_name(NMNetns *self)
+nm_netns_get_name (NMNetns *self)
{
- NMNetnsPrivate *priv = NM_NETNS_GET_PRIVATE (self);
-
- return priv->name;
-}
-
-void
-nm_netns_set_id(NMNetns *self, int netns_id)
-{
- NMNetnsPrivate *priv = NM_NETNS_GET_PRIVATE (self);
-
- priv->fd = netns_id;
-}
-
-int
-nm_netns_get_id(NMNetns *self)
-{
- NMNetnsPrivate *priv = NM_NETNS_GET_PRIVATE (self);
+ g_return_val_if_fail (NM_IS_NETNS (self), NULL);
- return priv->fd;
+ return NM_NETNS_GET_PRIVATE (self)->name;
}
-void
-nm_netns_set_platform(NMNetns *self, NMPlatform *platform)
+NMPNetns *
+nm_netns_get_ns (NMNetns *self)
{
- NMNetnsPrivate *priv = NM_NETNS_GET_PRIVATE (self);
-
- if (priv->platform)
- g_object_unref(priv->platform);
+ g_return_val_if_fail (NM_IS_NETNS (self), NULL);
- priv->platform = platform;
- g_object_ref(priv->platform);
+ return NM_NETNS_GET_PRIVATE (self)->netns;
}
NMPlatform *
-nm_netns_get_platform(NMNetns *self)
+nm_netns_get_platform (NMNetns *self)
{
NMNetnsPrivate *priv;
- if (self == NULL)
- return NM_PLATFORM_GET;
+ g_return_val_if_fail (NM_IS_NETNS (self), NULL);
priv = NM_NETNS_GET_PRIVATE (self);
- if (priv == NULL || priv->platform == NULL)
- return NM_PLATFORM_GET;
+ if (G_UNLIKELY (!priv->platform)) {
+ if (G_UNLIKELY (!priv->netns))
+ return NULL;
+
+ if (!nmp_netns_push (priv->netns))
+ return NULL;
+ priv->platform = nm_linux_platform_new ();
+ nmp_netns_pop (priv->netns);
+
+ g_signal_connect (priv->platform,
+ NM_PLATFORM_SIGNAL_LINK_CHANGED,
+ G_CALLBACK (platform_link_cb),
+ self);
+ }
return priv->platform;
}
NMDefaultRouteManager *
-nm_netns_get_default_route_manager(NMNetns *self)
+nm_netns_get_default_route_manager (NMNetns *self)
{
NMNetnsPrivate *priv = NM_NETNS_GET_PRIVATE (self);
+ g_return_val_if_fail (NM_IS_NETNS (self), FALSE);
+
+ priv = NM_NETNS_GET_PRIVATE (self);
+
+ if (G_UNLIKELY (!priv->default_route_manager)) {
+ nm_auto_pop_netns NMPNetns *netnsp = NULL;
+ NMPlatform *platform = nm_netns_get_platform (self);
+
+ if (!platform)
+ return NULL;
+ if (!nm_netns_push (self, &netnsp))
+ return NULL;
+ priv->default_route_manager = nm_default_route_manager_new (platform);
+ }
return priv->default_route_manager;
}
NMRouteManager *
-nm_netns_get_route_manager(NMNetns *self)
+nm_netns_get_route_manager (NMNetns *self)
{
NMNetnsPrivate *priv = NM_NETNS_GET_PRIVATE (self);
+ g_return_val_if_fail (NM_IS_NETNS (self), FALSE);
+
+ priv = NM_NETNS_GET_PRIVATE (self);
+
+ if (G_UNLIKELY (!priv->route_manager)) {
+ nm_auto_pop_netns NMPNetns *netnsp = NULL;
+ NMPlatform *platform = nm_netns_get_platform (self);
+
+ if (!platform)
+ return NULL;
+ if (!nm_netns_push (self, &netnsp))
+ return NULL;
+ priv->route_manager = nm_route_manager_new (platform);
+ }
return priv->route_manager;
}
@@ -468,13 +485,13 @@ nm_netns_remove_device(NMNetns *self, NMDevice *device)
if (nm_device_is_real (device)) {
g_signal_emit (self, signals[DEVICE_REMOVED], 0, device);
nm_device_removed (device);
- g_object_notify (G_OBJECT (self), NM_NETNS_DEVICES);
+ _notify (self, PROP_DEVICES);
}
g_signal_emit (self, signals[INTERNAL_DEVICE_REMOVED], 0, device);
nm_exported_object_clear_and_unexport (&device);
- g_object_notify (G_OBJECT (self), NM_NETNS_ALL_DEVICES);
+ _notify (self, PROP_ALL_DEVICES);
}
void
@@ -496,14 +513,14 @@ nm_netns_add_device(NMNetns *self, NMDevice *device)
priv->devices = g_slist_append (priv->devices, g_object_ref (device));
if (nm_device_is_real (device)) {
- g_object_notify (G_OBJECT (self), NM_NETNS_DEVICES);
+ _notify (self, PROP_DEVICES);
nm_device_removed (device);
}
- g_object_notify (G_OBJECT (self), NM_NETNS_ALL_DEVICES);
+ _notify (self, PROP_ALL_DEVICES);
nm_settings_device_added (nm_settings_get(), device);
g_signal_emit (self, signals[INTERNAL_DEVICE_ADDED], 0, device);
- g_object_notify (G_OBJECT (self), NM_NETNS_ALL_DEVICES);
+ _notify (self, PROP_ALL_DEVICES);
for (iter = priv->devices; iter; iter = iter->next) {
NMDevice *d = iter->data;
@@ -523,28 +540,27 @@ nm_netns_take_device(NMNetns *self,
DeviceChangeData *dc;
nm_log_dbg (LOGD_NETNS, "Moving device %s (%d) from network namespace %s to %s",
- nm_device_get_iface (device),
- nm_device_get_ifindex (device),
- nm_netns_get_name (nm_device_get_netns (device)),
- nm_netns_get_name (self));
+ nm_device_get_iface (device),
+ nm_device_get_ifindex (device),
+ nm_netns_get_name (nm_device_get_netns (device)),
+ nm_netns_get_name (self));
/*
* Add callback structure and associated timeout
*/
- dc = _device_change_callback_add(self, nm_device_get_ifindex(device), callback, user_data);
+ dc = _device_change_callback_add (self, nm_device_get_ifindex (device), callback, user_data);
/*
* Initiate change of network namespace for device
*/
- if (!nm_platform_link_set_netns(nm_device_get_platform(device),
- nm_device_get_ifindex(device),
- nm_netns_get_id(self))) {
-
+ if (!nm_platform_link_set_netns (nm_device_get_platform (device),
+ nm_device_get_ifindex (device),
+ nmp_netns_get_fd_net (nm_netns_get_ns (self)))) {
nm_log_dbg (LOGD_NETNS, "Error moving device %s (%d) from network namespace %s to %s",
- nm_device_get_iface (device),
- nm_device_get_ifindex (device),
- nm_netns_get_name (nm_device_get_netns (device)),
- nm_netns_get_name (self));
+ nm_device_get_iface (device),
+ nm_device_get_ifindex (device),
+ nm_netns_get_name (nm_device_get_netns (device)),
+ nm_netns_get_name (self));
/*
* Remove callback structure and associated timeout
@@ -562,14 +578,13 @@ nm_netns_take_device(NMNetns *self,
NMDevice *
nm_netns_get_device_by_ifindex (NMNetns *self, int ifindex)
{
- NMNetnsPrivate *priv = NM_NETNS_GET_PRIVATE (self);
GSList *iter;
/*
* Root network namespace is handled by NMManager so redirect
* query to it.
*/
- if (priv->isroot)
+ if (_is_root (self))
return nm_manager_get_device_by_ifindex (nm_manager_get(), ifindex);
for (iter = NM_NETNS_GET_PRIVATE (self)->devices; iter; iter = iter->next) {
@@ -592,7 +607,7 @@ nm_netns_get_device_by_path (NMNetns *self, const char *device_path)
* Root network namespace is handled by NMManager so redirect
* qurey to it.
*/
- if (priv->isroot)
+ if (_is_root (self))
return nm_manager_get_device_by_path (nm_manager_get(), device_path);
for (iter = priv->devices; iter; iter = iter->next) {
@@ -654,13 +669,13 @@ remove_device (NMNetns *self,
if (nm_device_is_real (device)) {
g_signal_emit (self, signals[DEVICE_REMOVED], 0, device);
nm_device_removed (device);
- g_object_notify (G_OBJECT (self), NM_NETNS_DEVICES);
+ _notify (self, PROP_DEVICES);
}
g_signal_emit (self, signals[INTERNAL_DEVICE_REMOVED], 0, device);
nm_exported_object_clear_and_unexport (&device);
- g_object_notify (G_OBJECT (self), NM_NETNS_ALL_DEVICES);
+ _notify (self, PROP_ALL_DEVICES);
}
static void
@@ -785,7 +800,7 @@ add_device (NMNetns *self, NMDevice *device, GError **error)
nm_settings_device_added (nm_settings_get(), device);
g_signal_emit (self, signals[INTERNAL_DEVICE_ADDED], 0, device);
- g_object_notify (G_OBJECT (self), NM_NETNS_ALL_DEVICES);
+ _notify (self, PROP_ALL_DEVICES);
for (iter = priv->devices; iter; iter = iter->next) {
NMDevice *d = iter->data;
@@ -907,12 +922,11 @@ platform_link_added (NMNetns *self,
static void
platform_query_devices (NMNetns *self)
{
- NMNetnsPrivate *priv = NM_NETNS_GET_PRIVATE (self);
GArray *links_array;
NMPlatformLink *links;
int i;
- links_array = nm_platform_link_get_all (priv->platform);
+ links_array = nm_platform_link_get_all (nm_netns_get_platform (self));
links = (NMPlatformLink *) links_array->data;
for (i = 0; i < links_array->len; i++)
platform_link_added (self, links[i].ifindex, &links[i]);
@@ -929,7 +943,6 @@ static gboolean
_platform_link_cb_idle (PlatformLinkCbData *data)
{
NMNetns *self = data->self;
- NMNetnsPrivate *priv = NM_NETNS_GET_PRIVATE (self);
const NMPlatformLink *l;
if (!self)
@@ -937,7 +950,7 @@ _platform_link_cb_idle (PlatformLinkCbData *data)
g_object_remove_weak_pointer (G_OBJECT (self), (gpointer *) &data->self);
- l = nm_platform_link_get (priv->platform, data->ifindex);
+ l = nm_platform_link_get (nm_netns_get_platform (self), data->ifindex);
if (l) {
NMPlatformLink pllink;
@@ -972,11 +985,11 @@ out:
static void
platform_link_cb (NMPlatform *platform,
- NMPObjectType obj_type,
- int ifindex,
- NMPlatformLink *plink,
- NMPlatformSignalChangeType change_type,
- gpointer user_data)
+ NMPObjectType obj_type,
+ int ifindex,
+ NMPlatformLink *plink,
+ NMPlatformSignalChangeType change_type,
+ gpointer user_data)
{
PlatformLinkCbData *data;
@@ -990,38 +1003,30 @@ platform_link_cb (NMPlatform *platform,
g_idle_add ((GSourceFunc) _platform_link_cb_idle, data);
break;
default:
- break;
+ break;
}
}
+#define _bind_to_path(path_buf, name) \
+ nm_sprintf_buf (path_buf, "/var/run/netns/%s", name)
+
gboolean
-nm_netns_setup(NMNetns *self, gboolean isroot)
+nm_netns_setup (NMNetns *self)
{
- NMNetnsPrivate *priv = NM_NETNS_GET_PRIVATE (self);
+ NMNetnsPrivate *priv;
+ char path_buf[256];
- /*
- * For root network namespace NMManager enumerates devices
- * and loopback interface is activated in main function.
- * For all other network namespaces we have to do it by our
- * selves!
- *
- * Also, monitoring of network devices in root network
- * namespace will be done by NMManager, so we don't do
- * anything about it.
- */
+ g_return_val_if_fail (NM_IS_NETNS (self), FALSE);
- priv->default_route_manager = nm_default_route_manager_new (priv->platform);
- priv->route_manager = nm_route_manager_new (priv->platform);
+ priv = NM_NETNS_GET_PRIVATE (self);
- priv->isroot = isroot;
+ g_return_val_if_fail (priv->name && priv->name[0], FALSE);
+ g_return_val_if_fail (!priv->bound, FALSE);
- if (isroot)
- return TRUE;
+ if (!nmp_netns_bind_to_path (priv->netns, _bind_to_path (path_buf, priv->name), NULL))
+ return FALSE;
- g_signal_connect (priv->platform,
- NM_PLATFORM_SIGNAL_LINK_CHANGED,
- G_CALLBACK (platform_link_cb),
- self);
+ priv->bound = TRUE;
/*
* Enumerate all existing devices in the network namespace
@@ -1032,7 +1037,7 @@ nm_netns_setup(NMNetns *self, gboolean isroot)
platform_query_devices (self);
/* Activate loopback interface in a new network namespace */
- nm_platform_link_set_up (priv->platform, 1, NULL);
+ nm_platform_link_set_up (nm_netns_get_platform (self), 1, NULL);
#if 0
priv->policy = nm_policy_new (self, nm_settings_get());
@@ -1054,13 +1059,18 @@ nm_netns_stop(NMNetns *self)
{
NMNetnsPrivate *priv = NM_NETNS_GET_PRIVATE (self);
- if (priv->isroot)
+ if (_is_root (self))
return;
while (priv->devices)
remove_device (self, NM_DEVICE (priv->devices->data), TRUE, TRUE);
- nm_platform_netns_destroy(priv->platform, priv->name);
+ if (priv->bound) {
+ char path_buf[256];
+
+ nmp_netns_bind_to_path_destroy (priv->netns, _bind_to_path (path_buf, priv->name));
+ priv->bound = FALSE;
+ }
/*
* TODO/BUG: Maybe this should go to dispose method?
@@ -1078,19 +1088,6 @@ nm_netns_stop(NMNetns *self)
g_clear_object (&priv->policy);
}
#endif
-
- g_clear_object(&priv->platform);
-}
-
-NMNetns *
-nm_netns_new (const char *netns_name)
-{
- NMNetns *self;
-
- self = g_object_new (NM_TYPE_NETNS, NULL);
- nm_netns_set_name(self, netns_name);
-
- return self;
}
/******************************************************************/
@@ -2219,8 +2216,9 @@ _active_connection_cleanup (gpointer user_data)
iter = iter->next;
if (nm_active_connection_get_state (ac) == NM_ACTIVE_CONNECTION_STATE_DEACTIVATED) {
- if (active_connection_remove (self, ac))
- g_object_notify (G_OBJECT (self), NM_MANAGER_ACTIVE_CONNECTIONS);
+ if (active_connection_remove (self, ac)) {
+ /*FIXME: g_object_notify (G_OBJECT (self), NM_MANAGER_ACTIVE_CONNECTIONS);*/
+ }
}
}
g_object_thaw_notify (G_OBJECT (self));
@@ -2289,7 +2287,7 @@ active_connection_add (NMNetns *self, NMActiveConnection *active)
/* Only notify D-Bus if the active connection is actually exported */
if (nm_exported_object_is_exported (NM_EXPORTED_OBJECT (active)))
- g_object_notify (G_OBJECT (self), NM_NETNS_ACTIVE_CONNECTIONS);
+ _notify (self, PROP_ACTIVATING_CONNECTION);
}
#if 0
@@ -2327,7 +2325,7 @@ policy_activating_device_changed (GObject *object, GParamSpec *pspec, gpointer u
g_clear_object (&priv->activating_connection);
priv->activating_connection = ac ? g_object_ref (ac) : NULL;
_LOGD (LOGD_CORE, "ActivatingConnection now %s", ac ? nm_active_connection_get_settings_connection_id (ac) : "(none)");
- g_object_notify (G_OBJECT (self), NM_NETNS_ACTIVATING_CONNECTION);
+ _notify (self, PROP_ACTIVATING_CONNECTION);
}
}
#endif
@@ -2352,7 +2350,7 @@ nm_netns_update_metered (NMNetns *self)
if (value != priv->metered) {
priv->metered = value;
_LOGD (LOGD_CORE, "new metered value: %d", (int) priv->metered);
- g_object_notify (G_OBJECT (self), NM_NETNS_METERED);
+ _notify (self, PROP_METERED);
}
}
#endif
@@ -2733,7 +2731,7 @@ system_hostname_changed_cb (NMSettings *settings,
g_free (priv->hostname);
priv->hostname = hostname;
- g_object_notify (G_OBJECT (self), NM_NETNS_HOSTNAME);
+ _notify (self, PROP_HOSTNAME);
nm_dhcp_manager_set_default_hostname (nm_dhcp_manager_get (), priv->hostname);
}
@@ -3094,48 +3092,6 @@ connectivity_changed (NMConnectivity *connectivity,
/******************************************************************/
-static void
-nm_netns_init (NMNetns *self)
-{
- NMNetnsPrivate *priv = NM_NETNS_GET_PRIVATE (self);
- NMConfigData *config_data;
-
-#if 0
- /*
- * TODO/BUG: What is this for?
- */
- _set_prop_filter (self, nm_bus_manager_get_connection (priv->dbus_mgr));
-
- priv->settings = nm_settings_get ();
- g_signal_connect (priv->settings, "notify::" NM_SETTINGS_HOSTNAME,
- G_CALLBACK (system_hostname_changed_cb), self);
- g_signal_connect (priv->settings, NM_SETTINGS_SIGNAL_CONNECTION_ADDED,
- G_CALLBACK (connection_changed), self);
- g_signal_connect (priv->settings, NM_SETTINGS_SIGNAL_CONNECTION_UPDATED_BY_USER,
- G_CALLBACK (connection_changed), self);
- g_signal_connect (priv->settings, NM_SETTINGS_SIGNAL_CONNECTION_REMOVED,
- G_CALLBACK (connection_removed), self);
-#endif
-
- priv->config = g_object_ref (nm_config_get ());
- g_signal_connect (G_OBJECT (priv->config),
- NM_CONFIG_SIGNAL_CONFIG_CHANGED,
- G_CALLBACK (_config_changed_cb),
- self);
-
- config_data = nm_config_get_data (priv->config);
-#if 0
- priv->connectivity = nm_connectivity_new (nm_config_data_get_connectivity_uri (config_data),
- nm_config_data_get_connectivity_interval (config_data),
- nm_config_data_get_connectivity_response (config_data));
- g_signal_connect (priv->connectivity, "notify::" NM_CONNECTIVITY_STATE,
- G_CALLBACK (connectivity_changed), self);
-#endif
-
- /* Load VPN plugins */
- priv->vpn_manager = g_object_ref (nm_vpn_manager_get ());
-}
-
static gboolean
device_is_real (GObject *device, gpointer user_data)
{
@@ -3188,13 +3144,18 @@ get_property (GObject *object, guint prop_id,
static void
set_property (GObject *object, guint prop_id,
- const GValue *value, GParamSpec *pspec)
+ const GValue *value, GParamSpec *pspec)
{
NMNetns *self = NM_NETNS (object);
+ NMNetnsPrivate *priv = NM_NETNS_GET_PRIVATE (self);
switch (prop_id) {
case PROP_NAME:
- nm_netns_set_name (self, g_value_get_string (value));
+ /* construct-only */
+ priv->name = g_value_dup_string (value);
+ g_return_if_fail (priv->name && priv->name[0]);
+ g_return_if_fail (NM_IN_STRSET (priv->name, ".", ".."));
+ g_return_if_fail (!strchr (priv->name, '/'));
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
@@ -3202,6 +3163,72 @@ set_property (GObject *object, guint prop_id,
}
}
+NMNetns *
+nm_netns_new (const char *name)
+{
+ return g_object_new (NM_TYPE_NETNS,
+ NM_NETNS_NAME, name,
+ NULL);
+}
+
+static void
+nm_netns_init (NMNetns *self)
+{
+ NMNetnsPrivate *priv = NM_NETNS_GET_PRIVATE (self);
+ NMConfigData *config_data;
+
+#if 0
+ /*
+ * TODO/BUG: What is this for?
+ */
+ _set_prop_filter (self, nm_bus_manager_get_connection (priv->dbus_mgr));
+
+ priv->settings = nm_settings_get ();
+ g_signal_connect (priv->settings, "notify::" NM_SETTINGS_HOSTNAME,
+ G_CALLBACK (system_hostname_changed_cb), self);
+ g_signal_connect (priv->settings, NM_SETTINGS_SIGNAL_CONNECTION_ADDED,
+ G_CALLBACK (connection_changed), self);
+ g_signal_connect (priv->settings, NM_SETTINGS_SIGNAL_CONNECTION_UPDATED_BY_USER,
+ G_CALLBACK (connection_changed), self);
+ g_signal_connect (priv->settings, NM_SETTINGS_SIGNAL_CONNECTION_REMOVED,
+ G_CALLBACK (connection_removed), self);
+#endif
+
+ priv->config = g_object_ref (nm_config_get ());
+ g_signal_connect (G_OBJECT (priv->config),
+ NM_CONFIG_SIGNAL_CONFIG_CHANGED,
+ G_CALLBACK (_config_changed_cb),
+ self);
+
+ config_data = nm_config_get_data (priv->config);
+#if 0
+ priv->connectivity = nm_connectivity_new (nm_config_data_get_connectivity_uri (config_data),
+ nm_config_data_get_connectivity_interval (config_data),
+ nm_config_data_get_connectivity_response (config_data));
+ g_signal_connect (priv->connectivity, "notify::" NM_CONNECTIVITY_STATE,
+ G_CALLBACK (connectivity_changed), self);
+#endif
+
+ /* Load VPN plugins */
+ priv->vpn_manager = g_object_ref (nm_vpn_manager_get ());
+}
+
+static void
+constructed (GObject *object)
+{
+ G_OBJECT_CLASS (nm_netns_parent_class)->constructed (object);
+}
+
+static void
+dispose (GObject *object)
+{
+ NMNetns *self = NM_NETNS (object);
+
+ nm_netns_stop (self);
+
+ G_OBJECT_CLASS (nm_netns_parent_class)->dispose (object);
+}
+
static void
finalize (GObject *object)
{
@@ -3213,6 +3240,12 @@ finalize (GObject *object)
g_clear_object (&priv->config);
}
+ g_free (priv->name);
+
+ g_clear_object (&priv->platform);
+ g_clear_object (&priv->default_route_manager);
+ g_clear_object (&priv->route_manager);
+
g_clear_object (&priv->vpn_manager);
#if 0
@@ -3247,55 +3280,52 @@ nm_netns_class_init (NMNetnsClass *klass)
exported_object_class->export_path = NM_DBUS_PATH_NETNS "/%u";
- /* virtual methods */
- object_class->set_property = set_property;
object_class->get_property = get_property;
+ object_class->set_property = set_property;
+ object_class->constructed = constructed;
+ object_class->dispose = dispose;
object_class->finalize = finalize;
/* Network namespace's name */
- g_object_class_install_property
- (object_class, PROP_NAME,
- g_param_spec_string (NM_NETNS_NAME, "", "",
- NULL,
- G_PARAM_READABLE |
- G_PARAM_STATIC_STRINGS));
+ obj_properties[PROP_NAME] =
+ g_param_spec_string (NM_NETNS_NAME, "", "",
+ NULL,
+ G_PARAM_READABLE |
+ G_PARAM_WRITABLE |
+ G_PARAM_CONSTRUCT_ONLY |
+ G_PARAM_STATIC_STRINGS);
/* Realized devices in the network namespace */
- g_object_class_install_property
- (object_class, PROP_DEVICES,
- g_param_spec_boxed (NM_NETNS_DEVICES, "", "",
- G_TYPE_STRV,
- G_PARAM_READABLE |
- G_PARAM_STATIC_STRINGS));
+ obj_properties[PROP_DEVICES] =
+ g_param_spec_boxed (NM_NETNS_DEVICES, "", "",
+ G_TYPE_STRV,
+ G_PARAM_READABLE |
+ G_PARAM_STATIC_STRINGS);
/* All devices in the network namespace */
- g_object_class_install_property
- (object_class, PROP_ALL_DEVICES,
- g_param_spec_boxed (NM_NETNS_ALL_DEVICES, "", "",
- G_TYPE_STRV,
- G_PARAM_READABLE |
- G_PARAM_STATIC_STRINGS));
-
- g_object_class_install_property
- (object_class, PROP_PRIMARY_CONNECTION,
- g_param_spec_string (NM_NETNS_PRIMARY_CONNECTION, "", "",
- NULL,
- G_PARAM_READABLE |
- G_PARAM_STATIC_STRINGS));
-
- g_object_class_install_property
- (object_class, PROP_PRIMARY_CONNECTION_TYPE,
- g_param_spec_string (NM_NETNS_PRIMARY_CONNECTION_TYPE, "", "",
- NULL,
- G_PARAM_READABLE |
- G_PARAM_STATIC_STRINGS));
-
- g_object_class_install_property
- (object_class, PROP_ACTIVATING_CONNECTION,
- g_param_spec_string (NM_NETNS_ACTIVATING_CONNECTION, "", "",
- NULL,
- G_PARAM_READABLE |
- G_PARAM_STATIC_STRINGS));
+ obj_properties[PROP_ALL_DEVICES] =
+ g_param_spec_boxed (NM_NETNS_ALL_DEVICES, "", "",
+ G_TYPE_STRV,
+ G_PARAM_READABLE |
+ G_PARAM_STATIC_STRINGS);
+
+ obj_properties[PROP_PRIMARY_CONNECTION] =
+ g_param_spec_string (NM_NETNS_PRIMARY_CONNECTION, "", "",
+ NULL,
+ G_PARAM_READABLE |
+ G_PARAM_STATIC_STRINGS);
+
+ obj_properties[PROP_PRIMARY_CONNECTION_TYPE] =
+ g_param_spec_string (NM_NETNS_PRIMARY_CONNECTION_TYPE, "", "",
+ NULL,
+ G_PARAM_READABLE |
+ G_PARAM_STATIC_STRINGS);
+
+ obj_properties[PROP_ACTIVATING_CONNECTION] =
+ g_param_spec_string (NM_NETNS_ACTIVATING_CONNECTION, "", "",
+ NULL,
+ G_PARAM_READABLE |
+ G_PARAM_STATIC_STRINGS);
/**
* NMManager:metered:
@@ -3304,62 +3334,63 @@ nm_netns_class_init (NMNetnsClass *klass)
*
* Since: 1.2
**/
- g_object_class_install_property
- (object_class, PROP_METERED,
- g_param_spec_uint (NM_NETNS_METERED, "", "",
- 0, G_MAXUINT32, NM_METERED_UNKNOWN,
- G_PARAM_READABLE |
- G_PARAM_STATIC_STRINGS));
+ obj_properties[PROP_METERED] =
+ g_param_spec_uint (NM_NETNS_METERED, "", "",
+ 0, G_MAXUINT32, NM_METERED_UNKNOWN,
+ G_PARAM_READABLE |
+ G_PARAM_STATIC_STRINGS);
+
+ g_object_class_install_properties (object_class, _PROPERTY_ENUMS_LAST, obj_properties);
/* Signals */
- signals[DEVICE_ADDED] =
- g_signal_new (NM_NETNS_DEVICE_ADDED,
- G_OBJECT_CLASS_TYPE (object_class),
- G_SIGNAL_RUN_FIRST,
- 0, NULL, NULL, NULL,
- G_TYPE_NONE, 1, NM_TYPE_DEVICE);
-
- signals[DEVICE_REMOVED] =
- g_signal_new (NM_NETNS_DEVICE_REMOVED,
- G_OBJECT_CLASS_TYPE (object_class),
- G_SIGNAL_RUN_FIRST,
- 0, NULL, NULL, NULL,
- G_TYPE_NONE, 1, NM_TYPE_DEVICE);
-
- signals[INTERNAL_DEVICE_ADDED] =
- g_signal_new (NM_NETNS_INTERNAL_DEVICE_ADDED,
- G_OBJECT_CLASS_TYPE (object_class),
- G_SIGNAL_RUN_FIRST,
- 0, NULL, NULL, NULL,
- G_TYPE_NONE, 1, NM_TYPE_DEVICE);
-
- signals[INTERNAL_DEVICE_REMOVED] =
- g_signal_new (NM_NETNS_INTERNAL_DEVICE_REMOVED,
- G_OBJECT_CLASS_TYPE (object_class),
- G_SIGNAL_RUN_FIRST,
- 0, NULL, NULL, NULL,
- G_TYPE_NONE, 1, NM_TYPE_DEVICE);
+ signals[DEVICE_ADDED] =
+ g_signal_new (NM_NETNS_DEVICE_ADDED,
+ G_OBJECT_CLASS_TYPE (object_class),
+ G_SIGNAL_RUN_FIRST,
+ 0, NULL, NULL, NULL,
+ G_TYPE_NONE, 1, NM_TYPE_DEVICE);
+
+ signals[DEVICE_REMOVED] =
+ g_signal_new (NM_NETNS_DEVICE_REMOVED,
+ G_OBJECT_CLASS_TYPE (object_class),
+ G_SIGNAL_RUN_FIRST,
+ 0, NULL, NULL, NULL,
+ G_TYPE_NONE, 1, NM_TYPE_DEVICE);
+
+ signals[INTERNAL_DEVICE_ADDED] =
+ g_signal_new (NM_NETNS_INTERNAL_DEVICE_ADDED,
+ G_OBJECT_CLASS_TYPE (object_class),
+ G_SIGNAL_RUN_FIRST,
+ 0, NULL, NULL, NULL,
+ G_TYPE_NONE, 1, NM_TYPE_DEVICE);
+
+ signals[INTERNAL_DEVICE_REMOVED] =
+ g_signal_new (NM_NETNS_INTERNAL_DEVICE_REMOVED,
+ G_OBJECT_CLASS_TYPE (object_class),
+ G_SIGNAL_RUN_FIRST,
+ 0, NULL, NULL, NULL,
+ G_TYPE_NONE, 1, NM_TYPE_DEVICE);
signals[ACTIVE_CONNECTION_ADDED] =
- g_signal_new (NM_NETNS_ACTIVE_CONNECTION_ADDED,
- G_OBJECT_CLASS_TYPE (object_class),
- G_SIGNAL_RUN_FIRST,
- 0, NULL, NULL, NULL,
- G_TYPE_NONE, 1, NM_TYPE_ACTIVE_CONNECTION);
+ g_signal_new (NM_NETNS_ACTIVE_CONNECTION_ADDED,
+ G_OBJECT_CLASS_TYPE (object_class),
+ G_SIGNAL_RUN_FIRST,
+ 0, NULL, NULL, NULL,
+ G_TYPE_NONE, 1, NM_TYPE_ACTIVE_CONNECTION);
signals[ACTIVE_CONNECTION_REMOVED] =
- g_signal_new (NM_NETNS_ACTIVE_CONNECTION_REMOVED,
- G_OBJECT_CLASS_TYPE (object_class),
- G_SIGNAL_RUN_FIRST,
- 0, NULL, NULL, NULL,
- G_TYPE_NONE, 1, NM_TYPE_ACTIVE_CONNECTION);
+ g_signal_new (NM_NETNS_ACTIVE_CONNECTION_REMOVED,
+ G_OBJECT_CLASS_TYPE (object_class),
+ G_SIGNAL_RUN_FIRST,
+ 0, NULL, NULL, NULL,
+ G_TYPE_NONE, 1, NM_TYPE_ACTIVE_CONNECTION);
nm_exported_object_class_add_interface (NM_EXPORTED_OBJECT_CLASS (klass),
- NMDBUS_TYPE_NET_NS_INSTANCE_SKELETON,
- "GetDevices", impl_netns_get_devices,
- "GetAllDevices", impl_netns_get_all_devices,
- "TakeDevice", impl_netns_take_device,
+ NMDBUS_TYPE_NET_NS_INSTANCE_SKELETON,
+ "GetDevices", impl_netns_get_devices,
+ "GetAllDevices", impl_netns_get_all_devices,
+ "TakeDevice", impl_netns_take_device,
"ActivateConnection", impl_netns_activate_connection,
- NULL);
+ NULL);
}
diff --git a/src/netns/nm-netns.h b/src/netns/nm-netns.h
index 182628873a..f007f9001d 100644
--- a/src/netns/nm-netns.h
+++ b/src/netns/nm-netns.h
@@ -19,19 +19,15 @@
* with this program; if not, write to the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*
- * (C) Copyright 2007 - 2011 Red Hat, Inc.
- * (C) Copyright 2008 Novell, Inc.
+ * (C) Copyright 2016 Red Hat, Inc.
*/
#ifndef __NM_NETNS_H__
#define __NM_NETNS_H__
-#include "nm-types.h"
-
+#include "nm-connection.h"
#include "nm-exported-object.h"
-#include "nm-platform.h"
-
#define NM_TYPE_NETNS (nm_netns_get_type ())
#define NM_NETNS(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), NM_TYPE_NETNS, NMNetns))
#define NM_NETNS_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), NM_TYPE_NETNS, NMNetnsClass))
@@ -39,30 +35,30 @@
#define NM_IS_NETNS_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), NM_TYPE_NETNS))
#define NM_NETNS_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), NM_TYPE_NETNS, NMNetnsClass))
-#define NM_NETNS_VERSION "version"
-#define NM_NETNS_STATE "state"
-#define NM_NETNS_STARTUP "startup"
-#define NM_NETNS_NETWORKING_ENABLED "networking-enabled"
-#define NM_NETNS_WIRELESS_ENABLED "wireless-enabled"
-#define NM_NETNS_WIRELESS_HARDWARE_ENABLED "wireless-hardware-enabled"
-#define NM_NETNS_WWAN_ENABLED "wwan-enabled"
-#define NM_NETNS_WWAN_HARDWARE_ENABLED "wwan-hardware-enabled"
-#define NM_NETNS_WIMAX_ENABLED "wimax-enabled"
-#define NM_NETNS_WIMAX_HARDWARE_ENABLED "wimax-hardware-enabled"
-#define NM_NETNS_ACTIVE_CONNECTIONS "active-connections"
-#define NM_NETNS_CONNECTIVITY "connectivity"
-#define NM_NETNS_PRIMARY_CONNECTION "primary-connection"
-#define NM_NETNS_PRIMARY_CONNECTION_TYPE "primary-connection-type"
-#define NM_NETNS_ACTIVATING_CONNECTION "activating-connection"
-#define NM_NETNS_DEVICES "devices"
-#define NM_NETNS_METERED "metered"
-#define NM_NETNS_GLOBAL_DNS_CONFIGURATION "global-dns-configuration"
-#define NM_NETNS_ALL_DEVICES "all-devices"
-
-#define NM_NETNS_DEVICE_ADDED "netns-device-added"
-#define NM_NETNS_DEVICE_REMOVED "netns-device-removed"
-#define NM_NETNS_INTERNAL_DEVICE_ADDED "netns-internal-device-added"
-#define NM_NETNS_INTERNAL_DEVICE_REMOVED "netns-internal-device-removed"
+#define NM_NETNS_VERSION "version"
+#define NM_NETNS_STATE "state"
+#define NM_NETNS_STARTUP "startup"
+#define NM_NETNS_NETWORKING_ENABLED "networking-enabled"
+#define NM_NETNS_WIRELESS_ENABLED "wireless-enabled"
+#define NM_NETNS_WIRELESS_HARDWARE_ENABLED "wireless-hardware-enabled"
+#define NM_NETNS_WWAN_ENABLED "wwan-enabled"
+#define NM_NETNS_WWAN_HARDWARE_ENABLED "wwan-hardware-enabled"
+#define NM_NETNS_WIMAX_ENABLED "wimax-enabled"
+#define NM_NETNS_WIMAX_HARDWARE_ENABLED "wimax-hardware-enabled"
+#define NM_NETNS_ACTIVE_CONNECTIONS "active-connections"
+#define NM_NETNS_CONNECTIVITY "connectivity"
+#define NM_NETNS_PRIMARY_CONNECTION "primary-connection"
+#define NM_NETNS_PRIMARY_CONNECTION_TYPE "primary-connection-type"
+#define NM_NETNS_ACTIVATING_CONNECTION "activating-connection"
+#define NM_NETNS_DEVICES "devices"
+#define NM_NETNS_METERED "metered"
+#define NM_NETNS_GLOBAL_DNS_CONFIGURATION "global-dns-configuration"
+#define NM_NETNS_ALL_DEVICES "all-devices"
+
+#define NM_NETNS_DEVICE_ADDED "netns-device-added"
+#define NM_NETNS_DEVICE_REMOVED "netns-device-removed"
+#define NM_NETNS_INTERNAL_DEVICE_ADDED "netns-internal-device-added"
+#define NM_NETNS_INTERNAL_DEVICE_REMOVED "netns-internal-device-removed"
#define NM_NETNS_ACTIVE_CONNECTION_ADDED "netns-active-connection-added"
#define NM_NETNS_ACTIVE_CONNECTION_REMOVED "netns-active-connection-removed"
@@ -74,11 +70,25 @@ typedef struct {
NMExportedObjectClass parent_class;
} NMNetnsClass;
-#define NM_NETNS_NAME "name"
+#define NM_NETNS_NAME "name"
GType nm_netns_get_type (void);
-const char *nm_netns_export (NMNetns *self);
+NMNetns *nm_netns_new (const char *name);
+
+gboolean nm_netns_setup (NMNetns *netns);
+
+void nm_netns_stop (NMNetns *netns);
+
+gboolean nm_netns_push (NMNetns *self, NMPNetns **netnsp);
+
+const char *nm_netns_get_name (NMNetns *netns);
+
+NMPNetns *nm_netns_get_ns (NMNetns *self);
+NMDefaultRouteManager *nm_netns_get_default_route_manager (NMNetns *self);
+NMRouteManager *nm_netns_get_route_manager (NMNetns *self);
+NMPlatform *nm_netns_get_platform (NMNetns *self);
+
NMDevice *nm_netns_get_device_by_ifindex (NMNetns *self, int ifindex);
NMDevice *nm_netns_get_device_by_path (NMNetns *self, const char *device_path);
@@ -93,21 +103,6 @@ NMActiveConnection *nm_netns_activate_connection (NMNetns *self,
NMAuthSubject *subject,
GError **error);
-void nm_netns_set_name (NMNetns *netns, const char *name);
-const char *nm_netns_get_name (NMNetns *netns);
-
-void nm_netns_set_id (NMNetns *self, int netns_id);
-int nm_netns_get_id (NMNetns *self);
-
-void nm_netns_set_default_route_manager (NMNetns *self, NMDefaultRouteManager *default_route_manager);
-NMDefaultRouteManager *nm_netns_get_default_route_manager (NMNetns *self);
-
-void nm_netns_set_route_manager (NMNetns *self, NMRouteManager *route_manager);
-NMRouteManager *nm_netns_get_route_manager (NMNetns *self);
-
-void nm_netns_set_platform (NMNetns *self, NMPlatform *platform);
-NMPlatform * nm_netns_get_platform (NMNetns *self);
-
void nm_netns_remove_device (NMNetns *self, NMDevice *device);
void nm_netns_add_device (NMNetns *self, NMDevice *device);
@@ -115,12 +110,7 @@ gboolean nm_netns_take_device (NMNetns *self, NMDevice *device, int timeout, voi
void nm_netns_device_change_callback_activate_and_remove(NMNetns *self, NMDevice *device);
-NMNetns *nm_netns_new (const char *netns_name);
-
const GSList *nm_netns_get_devices (NMNetns *netns);
-gboolean nm_netns_setup (NMNetns *netns, gboolean isroot);
-
-void nm_netns_stop (NMNetns *netns);
#endif /* __NM_NETNS_H__ */
diff --git a/src/nm-iface-helper.c b/src/nm-iface-helper.c
index 8cc5618e8c..6703ab659b 100644
--- a/src/nm-iface-helper.c
+++ b/src/nm-iface-helper.c
@@ -428,9 +428,6 @@ main (int argc, char *argv[])
/* Set up platform interaction layer */
nm_linux_platform_setup ();
- /* Set up dummy network namespace control */
- nm_netns_controller_setup ();
-
tmp = nm_platform_link_get_address (NM_PLATFORM_GET, ifindex, &hwaddr_len);
if (tmp) {
hwaddr = g_byte_array_sized_new (hwaddr_len);
diff --git a/src/nm-ip6-config.c b/src/nm-ip6-config.c
index 69995595e7..863dc66e0c 100644
--- a/src/nm-ip6-config.c
+++ b/src/nm-ip6-config.c
@@ -29,7 +29,7 @@
#include "nm-macros-internal.h"
#include "nm-utils.h"
#include "nm-platform.h"
-#include "nm-netns-controller.h"
+#include "nm-netns.h"
#include "nm-route-manager.h"
#include "nm-core-internal.h"
#include "NetworkManagerUtils.h"
@@ -421,7 +421,7 @@ nm_ip6_config_commit (const NMIP6Config *config, NMNetns *netns, int ifindex, gb
g_array_append_vals (routes, route, 1);
}
- success = nm_route_manager_ip6_route_sync (nm_netns_controller_get_route_manager (), ifindex, routes, TRUE, routes_full_sync);
+ success = nm_route_manager_ip6_route_sync (nm_netns_get_route_manager (netns), ifindex, routes, TRUE, routes_full_sync);
g_array_unref (routes);
}
diff --git a/src/nm-ip6-config.h b/src/nm-ip6-config.h
index 45a1666399..43dc64ad75 100644
--- a/src/nm-ip6-config.h
+++ b/src/nm-ip6-config.h
@@ -23,10 +23,8 @@
#include <netinet/in.h>
-#include "nm-types.h"
#include "nm-exported-object.h"
#include "nm-setting-ip6-config.h"
-#include "nm-netns.h"
#define NM_TYPE_IP6_CONFIG (nm_ip6_config_get_type ())
#define NM_IP6_CONFIG(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), NM_TYPE_IP6_CONFIG, NMIP6Config))
diff --git a/src/nm-manager.c b/src/nm-manager.c
index f525110935..27241c26f0 100644
--- a/src/nm-manager.c
+++ b/src/nm-manager.c
@@ -4442,7 +4442,9 @@ nm_manager_start (NMManager *self, GError **error)
g_signal_connect (nm_settings_get(), NM_SETTINGS_SIGNAL_CONNECTION_REMOVED,
G_CALLBACK (connection_removed), self);
- priv->policy = nm_policy_new (self, nm_settings_get());
+ priv->policy = nm_policy_new (self,
+ nm_settings_get(),
+ nm_netns_get_default_route_manager (nm_netns_controller_get_root_netns()));
g_signal_connect (priv->policy, "notify::" NM_POLICY_DEFAULT_IP4_DEVICE,
G_CALLBACK (policy_default_device_changed), self);
g_signal_connect (priv->policy, "notify::" NM_POLICY_DEFAULT_IP6_DEVICE,
diff --git a/src/nm-policy.c b/src/nm-policy.c
index 908bedc846..ef0e7d975f 100644
--- a/src/nm-policy.c
+++ b/src/nm-policy.c
@@ -42,7 +42,6 @@
#include "nm-utils.h"
#include "nm-core-internal.h"
#include "nm-manager.h"
-#include "nm-netns-controller.h"
#include "nm-settings.h"
#include "nm-settings-connection.h"
#include "nm-dhcp4-config.h"
@@ -59,6 +58,7 @@
typedef struct {
NMManager *manager;
+ NMDefaultRouteManager *default_route_manager;
NMFirewallManager *firewall_manager;
guint update_state_id;
GSList *pending_activation_checks;
@@ -109,7 +109,7 @@ get_best_ip4_device (NMPolicy *self, gboolean fully_activated)
{
NMPolicyPrivate *priv = NM_POLICY_GET_PRIVATE (self);
- return nm_default_route_manager_ip4_get_best_device (nm_netns_controller_get_default_route_manager (),
+ return nm_default_route_manager_ip4_get_best_device (priv->default_route_manager,
nm_manager_get_devices (priv->manager),
fully_activated,
priv->default_device4);
@@ -120,7 +120,7 @@ get_best_ip6_device (NMPolicy *self, gboolean fully_activated)
{
NMPolicyPrivate *priv = NM_POLICY_GET_PRIVATE (self);
- return nm_default_route_manager_ip6_get_best_device (nm_netns_controller_get_default_route_manager (),
+ return nm_default_route_manager_ip6_get_best_device (priv->default_route_manager,
nm_manager_get_devices (priv->manager),
fully_activated,
priv->default_device6);
@@ -414,7 +414,9 @@ get_best_ip4_config (NMPolicy *self,
NMDevice **out_device,
NMVpnConnection **out_vpn)
{
- return nm_default_route_manager_ip4_get_best_config (nm_netns_controller_get_default_route_manager (),
+ NMPolicyPrivate *priv = NM_POLICY_GET_PRIVATE (self);
+
+ return nm_default_route_manager_ip4_get_best_config (priv->default_route_manager,
ignore_never_default,
out_ip_iface,
out_ac,
@@ -509,7 +511,9 @@ get_best_ip6_config (NMPolicy *self,
NMDevice **out_device,
NMVpnConnection **out_vpn)
{
- return nm_default_route_manager_ip6_get_best_config (nm_netns_controller_get_default_route_manager (),
+ NMPolicyPrivate *priv = NM_POLICY_GET_PRIVATE (self);
+
+ return nm_default_route_manager_ip6_get_best_config (priv->default_route_manager,
ignore_never_default,
out_ip_iface,
out_ac,
@@ -1768,7 +1772,9 @@ _connect_settings_signal (NMPolicy *policy, const char *name, gpointer callback)
}
NMPolicy *
-nm_policy_new (NMManager *manager, NMSettings *settings)
+nm_policy_new (NMManager *manager,
+ NMSettings *settings,
+ NMDefaultRouteManager *default_route_manager)
{
NMPolicy *policy;
NMPolicyPrivate *priv;
@@ -1781,6 +1787,7 @@ nm_policy_new (NMManager *manager, NMSettings *settings)
policy = g_object_new (NM_TYPE_POLICY, NULL);
priv = NM_POLICY_GET_PRIVATE (policy);
priv->manager = manager;
+ priv->default_route_manager = g_object_ref (default_route_manager);
priv->settings = g_object_ref (settings);
priv->update_state_id = 0;
@@ -1942,6 +1949,7 @@ dispose (GObject *object)
g_clear_pointer (&priv->cur_hostname, g_free);
g_clear_object (&priv->settings);
+ g_clear_object (&priv->default_route_manager);
G_OBJECT_CLASS (nm_policy_parent_class)->dispose (object);
}
diff --git a/src/nm-policy.h b/src/nm-policy.h
index 7824f3ea72..f41f743d7e 100644
--- a/src/nm-policy.h
+++ b/src/nm-policy.h
@@ -47,7 +47,9 @@ typedef struct {
GType nm_policy_get_type (void);
-NMPolicy *nm_policy_new (NMManager *manager, NMSettings *settings);
+NMPolicy *nm_policy_new (NMManager *manager,
+ NMSettings *settings,
+ NMDefaultRouteManager *default_route_manager);
NMDevice *nm_policy_get_default_ip4_device (NMPolicy *policy);
NMDevice *nm_policy_get_default_ip6_device (NMPolicy *policy);
diff --git a/src/platform/nm-linux-platform.c b/src/platform/nm-linux-platform.c
index ac7b38da93..1004acc989 100644
--- a/src/platform/nm-linux-platform.c
+++ b/src/platform/nm-linux-platform.c
@@ -25,9 +25,6 @@
#include <unistd.h>
#include <sys/socket.h>
#include <sys/ioctl.h>
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <sys/mount.h>
#include <fcntl.h>
#include <dlfcn.h>
#include <arpa/inet.h>
@@ -46,7 +43,6 @@
#include <netlink/route/addr.h>
#include <netlink/route/route.h>
#include <gudev/gudev.h>
-#include <sched.h>
#include "nm-utils.h"
#include "nm-core-internal.h"
@@ -116,11 +112,6 @@
#define IP6_FLOWINFO_TCLASS_SHIFT 20
#define IP6_FLOWINFO_FLOWLABEL_MASK 0x000FFFFF
-/* network namespace related constants */
-#define PATHMAX 4096
-#define NETNS_PATH "/var/run/netns/" /* must end with / */
-#define SELF_NET_PATH "/proc/self/ns/net"
-
/*********************************************************************************************/
#define _NMLOG_PREFIX_NAME "platform-linux"
@@ -2423,7 +2414,6 @@ void
nm_linux_platform_setup (void)
{
g_object_new (NM_TYPE_LINUX_PLATFORM,
- NM_PLATFORM_NETNS_SUPPORT, FALSE,
NM_PLATFORM_REGISTER_SINGLETON, TRUE,
NULL);
}
@@ -2432,8 +2422,8 @@ NMPlatform *
nm_linux_platform_new (void)
{
return g_object_new (NM_TYPE_LINUX_PLATFORM,
- NM_PLATFORM_REGISTER_SINGLETON, FALSE,
- NULL);
+ NM_PLATFORM_REGISTER_SINGLETON, FALSE,
+ NULL);
}
/******************************************************************/
@@ -2671,92 +2661,6 @@ process_events (NMPlatform *platform)
/******************************************************************/
-static int
-netns_create(NMPlatform *platform, const char *name, gboolean isroot)
-{
- char filename[PATHMAX];
- int netns_id;
-
- strcpy(filename, NETNS_PATH);
- strncat(filename, name, PATHMAX);
-
- /*
- * Create target directory first. Note that all subdirectories,
- * except the last one, must already exist!
- */
- if (mkdir (NETNS_PATH, 0) == -1) {
- if (errno != EEXIST) {
- nm_log_err (LOGD_NETNS, "Failed to create %s with error '%s'",
- filename, strerror(errno));
- return -1;
- }
- }
-
- /*
- * Create a node in /var/run/netns
- */
- if ((netns_id = creat(filename, S_IRUSR | S_IRGRP | S_IROTH)) == -1) {
- nm_log_err (LOGD_NETNS, "Failed to create %s with error '%s'",
- filename, strerror(errno));
- return -1;
- }
-
- close(netns_id);
- netns_id = -1;
-
- if (!isroot) {
- if (unshare(CLONE_NEWNET) < 0) {
- nm_log_err (LOGD_NETNS, "Failed to unshare network namespace with error '%s'", strerror(errno));
- unlink(filename);
- return -1;
- }
- }
-
- if (mount(SELF_NET_PATH, filename, "none", MS_BIND, NULL) < 0) {
- nm_log_err (LOGD_NETNS, "Failed to mount %s to %s with error '%s'",
- SELF_NET_PATH, filename, strerror(errno));
- unlink(filename);
- return -1;
- }
-
- if ((netns_id = open(filename, O_RDONLY)) == -1) {
- nm_log_err (LOGD_NETNS, "Failed to open %s with error '%s'", filename, strerror(errno));
- umount2(filename, MNT_DETACH);
- unlink(filename);
- return -1;
- }
-
- return netns_id;
-}
-
-static void
-netns_destroy(NMPlatform *platform, const char *name)
-{
- char filename[PATHMAX];
-
- strcpy(filename, NETNS_PATH);
- strncat(filename, name, PATHMAX);
-
- if (umount2(filename, MNT_DETACH) == 0) {
- if (unlink(filename) < 0)
- nm_log_err (LOGD_NETNS, "Failed to unlink %s with error '%s'", filename, strerror(errno));
- } else
- nm_log_err (LOGD_NETNS, "Failed to unmount2 %s with error '%s'", filename, strerror(errno));
-}
-
-static gboolean
-netns_activate(NMPlatform *platform, int netns_id)
-{
- if (setns(netns_id, CLONE_NEWNET) < 0) {
- nm_log_err (LOGD_NETNS, "Failed to set network namespace fd %d with error '%s'", netns_id, strerror(errno));
- return FALSE;
- }
-
- return TRUE;
-}
-
-/******************************************************************/
-
#define cache_lookup_all_objects(type, platform, obj_type, visible_only) \
((const type *const*) nmp_cache_lookup_multi (NM_LINUX_PLATFORM_GET_PRIVATE ((platform))->cache, \
nmp_cache_id_init_object_type (NMP_CACHE_ID_STATIC, (obj_type), (visible_only)), \
@@ -6369,10 +6273,6 @@ nm_linux_platform_class_init (NMLinuxPlatformClass *klass)
platform_class->check_support_kernel_extended_ifa_flags = check_support_kernel_extended_ifa_flags;
platform_class->check_support_user_ipv6ll = check_support_user_ipv6ll;
- platform_class->netns_create = netns_create;
- platform_class->netns_destroy = netns_destroy;
- platform_class->netns_activate = netns_activate;
-
platform_class->process_events = process_events;
}
diff --git a/src/platform/nm-linux-platform.h b/src/platform/nm-linux-platform.h
index c8f572335b..c1210dd0a5 100644
--- a/src/platform/nm-linux-platform.h
+++ b/src/platform/nm-linux-platform.h
@@ -50,13 +50,6 @@ GType nm_linux_platform_get_type (void);
void nm_linux_platform_setup (void);
-/*
- * Added so that each network namespace has a separate copy. This is
- * necessary since each namespace heas its own set of sockets (and
- * thus all the connections!).
- */
NMPlatform *nm_linux_platform_new (void);
-void _nm_linux_platform_sysctl_clear_cache (void);
-
#endif /* __NETWORKMANAGER_LINUX_PLATFORM_H__ */
diff --git a/src/platform/nm-platform.c b/src/platform/nm-platform.c
index 31d28a5ab6..c2a3c40485 100644
--- a/src/platform/nm-platform.c
+++ b/src/platform/nm-platform.c
@@ -236,37 +236,6 @@ nm_platform_check_support_user_ipv6ll (NMPlatform *self)
return !!supported;
}
-int
-nm_platform_netns_create(NMPlatform *self, const char *name, gboolean isroot)
-{
- _CHECK_SELF (self, klass, -1);
-
- if (!klass->netns_create)
- return FALSE;
-
- return klass->netns_create (self, name, isroot);
-}
-
-void
-nm_platform_netns_destroy(NMPlatform *self, const char *name)
-{
- _CHECK_SELF_VOID (self, klass);
-
- if (klass->netns_destroy)
- klass->netns_destroy (self, name);
-}
-
-gboolean
-nm_platform_netns_activate(NMPlatform *self, int netns_id)
-{
- _CHECK_SELF (self, klass, FALSE);
-
- if (!klass->netns_activate)
- return FALSE;
-
- return klass->netns_activate (self, netns_id);
-}
-
/**
* nm_platform_process_events:
* @self: platform instance
@@ -4276,7 +4245,7 @@ nm_platform_class_init (NMPlatformClass *platform_class)
g_object_class_install_property
(object_class, PROP_NETNS_SUPPORT,
g_param_spec_boolean (NM_PLATFORM_NETNS_SUPPORT, "", "",
- FALSE,
+ TRUE,
G_PARAM_WRITABLE |
G_PARAM_CONSTRUCT_ONLY |
G_PARAM_STATIC_STRINGS));
diff --git a/src/platform/nm-platform.h b/src/platform/nm-platform.h
index 629eece270..8c97f7668a 100644
--- a/src/platform/nm-platform.h
+++ b/src/platform/nm-platform.h
@@ -625,10 +625,6 @@ typedef struct {
gboolean (*check_support_kernel_extended_ifa_flags) (NMPlatform *);
gboolean (*check_support_user_ipv6ll) (NMPlatform *);
-
- int (*netns_create) (NMPlatform *platform, const char *name, gboolean isroot);
- void (*netns_destroy) (NMPlatform *platform, const char *name);
- gboolean (*netns_activate) (NMPlatform *platform, int netns_id);
} NMPlatformClass;
/* NMPlatform signals
@@ -938,10 +934,6 @@ int nm_platform_ip6_route_cmp (const NMPlatformIP6Route *a, const NMPlatformIP6R
gboolean nm_platform_check_support_kernel_extended_ifa_flags (NMPlatform *self);
gboolean nm_platform_check_support_user_ipv6ll (NMPlatform *self);
-int nm_platform_netns_create(NMPlatform *self, const char *name, gboolean isroot);
-void nm_platform_netns_destroy(NMPlatform *self, const char *name);
-gboolean nm_platform_netns_activate(NMPlatform *self, int netns_id);
-
const char *nm_platform_link_flags2str (unsigned flags, char *buf, gsize len);
const char *nm_platform_link_inet6_addrgenmode2str (guint8 mode, char *buf, gsize len);
const char *nm_platform_addr_flags2str (unsigned flags, char *buf, gsize len);
diff --git a/src/tests/config/Makefile.am b/src/tests/config/Makefile.am
index 95f7875207..5d4aed5c86 100644
--- a/src/tests/config/Makefile.am
+++ b/src/tests/config/Makefile.am
@@ -6,7 +6,6 @@ AM_CPPFLAGS = \
-I$(top_srcdir)/src/ \
-I$(top_srcdir)/src/devices \
-I${top_srcdir}/src/platform \
- -I${top_srcdir}/src/netns \
-DG_LOG_DOMAIN=\""NetworkManager"\" \
-DNETWORKMANAGER_COMPILATION=NM_NETWORKMANAGER_COMPILATION_INSIDE_DAEMON \
-DNM_VERSION_MAX_ALLOWED=NM_VERSION_NEXT_STABLE \
diff --git a/src/tests/test-route-manager.c b/src/tests/test-route-manager.c
index 8f4c31adef..102016df47 100644
--- a/src/tests/test-route-manager.c
+++ b/src/tests/test-route-manager.c
@@ -28,6 +28,7 @@
#include "nm-platform.h"
#include "nm-route-manager.h"
#include "nm-netns-controller.h"
+#include "nm-netns.h"
#include "nm-test-utils.h"
@@ -37,6 +38,12 @@ typedef struct {
/*****************************************************************************/
+static NMRouteManager *
+_get_route_manager (void)
+{
+ return nm_netns_get_route_manager (nm_netns_controller_get_root_netns ());
+}
+
static void
setup_dev0_ip4 (int ifindex, guint mss_of_first_route, guint32 metric_of_second_route)
{
@@ -62,7 +69,7 @@ setup_dev0_ip4 (int ifindex, guint mss_of_first_route, guint32 metric_of_second_
route.mss = 0;
g_array_append_val (routes, route);
- nm_route_manager_ip4_route_sync (nm_netns_controller_get_route_manager (), ifindex, routes, TRUE, TRUE);
+ nm_route_manager_ip4_route_sync (_get_route_manager (), ifindex, routes, TRUE, TRUE);
g_array_free (routes, TRUE);
}
@@ -109,7 +116,7 @@ setup_dev1_ip4 (int ifindex)
route.metric = 22;
g_array_append_val (routes, route);
- nm_route_manager_ip4_route_sync (nm_netns_controller_get_route_manager (), ifindex, routes, TRUE, TRUE);
+ nm_route_manager_ip4_route_sync (_get_route_manager (), ifindex, routes, TRUE, TRUE);
g_array_free (routes, TRUE);
}
@@ -136,7 +143,7 @@ update_dev0_ip4 (int ifindex)
route.metric = 21;
g_array_append_val (routes, route);
- nm_route_manager_ip4_route_sync (nm_netns_controller_get_route_manager (), ifindex, routes, TRUE, TRUE);
+ nm_route_manager_ip4_route_sync (_get_route_manager (), ifindex, routes, TRUE, TRUE);
g_array_free (routes, TRUE);
}
@@ -348,7 +355,7 @@ test_ip4 (test_fixture *fixture, gconstpointer user_data)
nmtst_platform_ip4_routes_equal ((NMPlatformIP4Route *) routes->data, state2, routes->len, TRUE);
g_array_free (routes, TRUE);
- nm_route_manager_route_flush (nm_netns_controller_get_route_manager (), fixture->ifindex0);
+ nm_route_manager_route_flush (_get_route_manager (), fixture->ifindex0);
/* 6.6.6.0/24 is now on dev1
* 6.6.6.0/24 is also still on dev1 with bumped metric 21.
@@ -360,7 +367,7 @@ test_ip4 (test_fixture *fixture, gconstpointer user_data)
nmtst_platform_ip4_routes_equal ((NMPlatformIP4Route *) routes->data, state3, routes->len, TRUE);
g_array_free (routes, TRUE);
- nm_route_manager_route_flush (nm_netns_controller_get_route_manager (), fixture->ifindex1);
+ nm_route_manager_route_flush (_get_route_manager (), fixture->ifindex1);
/* No routes left. */
routes = ip4_routes (fixture);
@@ -411,7 +418,7 @@ setup_dev0_ip6 (int ifindex)
0);
g_array_append_val (routes, *route);
- nm_route_manager_ip6_route_sync (nm_netns_controller_get_route_manager (), ifindex, routes, TRUE, TRUE);
+ nm_route_manager_ip6_route_sync (_get_route_manager (), ifindex, routes, TRUE, TRUE);
g_array_free (routes, TRUE);
}
@@ -469,7 +476,7 @@ setup_dev1_ip6 (int ifindex)
0);
g_array_append_val (routes, *route);
- nm_route_manager_ip6_route_sync (nm_netns_controller_get_route_manager (), ifindex, routes, TRUE, TRUE);
+ nm_route_manager_ip6_route_sync (_get_route_manager (), ifindex, routes, TRUE, TRUE);
g_array_free (routes, TRUE);
}
@@ -516,7 +523,7 @@ update_dev0_ip6 (int ifindex)
0);
g_array_append_val (routes, *route);
- nm_route_manager_ip6_route_sync (nm_netns_controller_get_route_manager (), ifindex, routes, TRUE, TRUE);
+ nm_route_manager_ip6_route_sync (_get_route_manager (), ifindex, routes, TRUE, TRUE);
g_array_free (routes, TRUE);
}
@@ -762,7 +769,7 @@ test_ip6 (test_fixture *fixture, gconstpointer user_data)
nmtst_platform_ip6_routes_equal ((NMPlatformIP6Route *) routes->data, state2, routes->len, TRUE);
g_array_free (routes, TRUE);
- nm_route_manager_route_flush (nm_netns_controller_get_route_manager (), fixture->ifindex0);
+ nm_route_manager_route_flush (_get_route_manager (), fixture->ifindex0);
/* 2001:db8:abad:c0de::/64 on dev1 is still there, went away from dev0
* 2001:db8:8086::/48 is now on dev1
@@ -774,7 +781,7 @@ test_ip6 (test_fixture *fixture, gconstpointer user_data)
nmtst_platform_ip6_routes_equal ((NMPlatformIP6Route *) routes->data, state3, routes->len, TRUE);
g_array_free (routes, TRUE);
- nm_route_manager_route_flush (nm_netns_controller_get_route_manager (), fixture->ifindex1);
+ nm_route_manager_route_flush (_get_route_manager (), fixture->ifindex1);
/* No routes left. */
routes = ip6_routes (fixture);
@@ -830,7 +837,7 @@ test_ip4_full_sync (test_fixture *fixture, gconstpointer user_data)
g_array_set_size (routes, 2);
g_array_index (routes, NMPlatformIP4Route, 0) = r01;
g_array_index (routes, NMPlatformIP4Route, 1) = r02;
- nm_route_manager_ip4_route_sync (nm_netns_controller_get_route_manager (), fixture->ifindex0, routes, TRUE, TRUE);
+ nm_route_manager_ip4_route_sync (_get_route_manager (), fixture->ifindex0, routes, TRUE, TRUE);
_assert_route_check (vtable, TRUE, (const NMPlatformIPXRoute *) &r01);
_assert_route_check (vtable, TRUE, (const NMPlatformIPXRoute *) &r02);
@@ -842,7 +849,7 @@ test_ip4_full_sync (test_fixture *fixture, gconstpointer user_data)
_assert_route_check (vtable, TRUE, (const NMPlatformIPXRoute *) &r02);
_assert_route_check (vtable, TRUE, (const NMPlatformIPXRoute *) &r03);
- nm_route_manager_ip4_route_sync (nm_netns_controller_get_route_manager (), fixture->ifindex0, routes, TRUE, FALSE);
+ nm_route_manager_ip4_route_sync (_get_route_manager (), fixture->ifindex0, routes, TRUE, FALSE);
_assert_route_check (vtable, TRUE, (const NMPlatformIPXRoute *) &r01);
_assert_route_check (vtable, TRUE, (const NMPlatformIPXRoute *) &r02);
@@ -850,13 +857,13 @@ test_ip4_full_sync (test_fixture *fixture, gconstpointer user_data)
g_array_set_size (routes, 1);
- nm_route_manager_ip4_route_sync (nm_netns_controller_get_route_manager (), fixture->ifindex0, routes, TRUE, FALSE);
+ nm_route_manager_ip4_route_sync (_get_route_manager (), fixture->ifindex0, routes, TRUE, FALSE);
_assert_route_check (vtable, TRUE, (const NMPlatformIPXRoute *) &r01);
_assert_route_check (vtable, FALSE, (const NMPlatformIPXRoute *) &r02);
_assert_route_check (vtable, TRUE, (const NMPlatformIPXRoute *) &r03);
- nm_route_manager_ip4_route_sync (nm_netns_controller_get_route_manager (), fixture->ifindex0, routes, TRUE, TRUE);
+ nm_route_manager_ip4_route_sync (_get_route_manager (), fixture->ifindex0, routes, TRUE, TRUE);
_assert_route_check (vtable, TRUE, (const NMPlatformIPXRoute *) &r01);
_assert_route_check (vtable, FALSE, (const NMPlatformIPXRoute *) &r02);