diff options
author | Thomas Haller <thaller@redhat.com> | 2016-03-28 11:24:29 +0200 |
---|---|---|
committer | Thomas Haller <thaller@redhat.com> | 2016-03-29 12:55:56 +0200 |
commit | c473cb42d0d7a2157ddba119aac17fdb9c448e2d (patch) | |
tree | 64e047bb622599db1e39cc7df2982e91ff925c86 | |
parent | 75fc7f1d1dffffbb8e5694707960ef14c2c45026 (diff) | |
download | NetworkManager-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.c | 51 | ||||
-rw-r--r-- | src/devices/nm-device.h | 8 | ||||
-rw-r--r-- | src/devices/wwan/nm-modem.c | 2 | ||||
-rw-r--r-- | src/main.c | 8 | ||||
-rw-r--r-- | src/netns/nm-netns-controller-dummy.c | 102 | ||||
-rw-r--r-- | src/netns/nm-netns-controller.c | 459 | ||||
-rw-r--r-- | src/netns/nm-netns-controller.h | 29 | ||||
-rw-r--r-- | src/netns/nm-netns-dummy.c | 12 | ||||
-rw-r--r-- | src/netns/nm-netns.c | 607 | ||||
-rw-r--r-- | src/netns/nm-netns.h | 94 | ||||
-rw-r--r-- | src/nm-iface-helper.c | 3 | ||||
-rw-r--r-- | src/nm-ip6-config.c | 4 | ||||
-rw-r--r-- | src/nm-ip6-config.h | 2 | ||||
-rw-r--r-- | src/nm-manager.c | 4 | ||||
-rw-r--r-- | src/nm-policy.c | 20 | ||||
-rw-r--r-- | src/nm-policy.h | 4 | ||||
-rw-r--r-- | src/platform/nm-linux-platform.c | 104 | ||||
-rw-r--r-- | src/platform/nm-linux-platform.h | 7 | ||||
-rw-r--r-- | src/platform/nm-platform.c | 33 | ||||
-rw-r--r-- | src/platform/nm-platform.h | 8 | ||||
-rw-r--r-- | src/tests/config/Makefile.am | 1 | ||||
-rw-r--r-- | src/tests/test-route-manager.c | 35 |
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); |