summaryrefslogtreecommitdiff
path: root/src/platform/nm-platform.c
diff options
context:
space:
mode:
authorThomas Haller <thaller@redhat.com>2016-02-19 01:06:28 +0100
committerThomas Haller <thaller@redhat.com>2016-02-20 00:19:09 +0100
commit6635e54d613304c3b319d822d6ae1a93d016e968 (patch)
tree7d58a573cf408dff8a2a9a3c60ebc55fab940a4d /src/platform/nm-platform.c
parent94d6aaac70ecec4baca6a072d32825287f8ee109 (diff)
downloadNetworkManager-th/platform-netns.tar.gz
platform: add network namespace support to platformth/platform-netns
Platform not only uses the netlink socket, but also sysfs, udev, ethtool, mii. To properly support network namespaces, we must switch the namespace as necessary. In case of udev, it is only supported on the main namespace.
Diffstat (limited to 'src/platform/nm-platform.c')
-rw-r--r--src/platform/nm-platform.c52
1 files changed, 52 insertions, 0 deletions
diff --git a/src/platform/nm-platform.c b/src/platform/nm-platform.c
index d82b096a2c..633b968126 100644
--- a/src/platform/nm-platform.c
+++ b/src/platform/nm-platform.c
@@ -37,6 +37,7 @@
#include "nm-platform.h"
#include "nm-platform-utils.h"
#include "nmp-object.h"
+#include "nmp-netns-utils.h"
#include "NetworkManagerUtils.h"
#include "nm-enum-types.h"
#include "nm-core-internal.h"
@@ -2127,6 +2128,10 @@ nm_platform_link_veth_get_properties (NMPlatform *self, int ifindex, int *out_pe
/* Pre-4.1 kernel did not expose the peer_ifindex as IFA_LINK. Lookup via ethtool. */
if (out_peer_ifindex) {
+ nm_auto_pop_netns NMPNetns *netns = NULL;
+
+ if (!nm_platform_netns_push (self, &netns))
+ return FALSE;
peer_ifindex = nmp_utils_ethtool_get_peer_ifindex (plink->name);
if (peer_ifindex <= 0)
return FALSE;
@@ -2372,16 +2377,24 @@ _to_string_dev (NMPlatform *self, int ifindex, char *buf, size_t size)
gboolean
nm_platform_ethtool_set_wake_on_lan (NMPlatform *self, const char *ifname, NMSettingWiredWakeOnLan wol, const char *wol_password)
{
+ nm_auto_pop_netns NMPNetns *netns = NULL;
_CHECK_SELF (self, klass, FALSE);
+ if (!nm_platform_netns_push (self, &netns))
+ return FALSE;
+
return nmp_utils_ethtool_set_wake_on_lan (ifname, wol, wol_password);
}
gboolean
nm_platform_ethtool_get_link_speed (NMPlatform *self, const char *ifname, guint32 *out_speed)
{
+ nm_auto_pop_netns NMPNetns *netns = NULL;
_CHECK_SELF (self, klass, FALSE);
+ if (!nm_platform_netns_push (self, &netns))
+ return FALSE;
+
return nmp_utils_ethtool_get_link_speed (ifname, out_speed);
}
@@ -3997,6 +4010,30 @@ log_ip6_route (NMPlatform *self, NMPObjectType obj_type, int ifindex, NMPlatform
/******************************************************************/
+NMPNetns *
+nm_platform_netns_get (NMPlatform *self)
+{
+ _CHECK_SELF (self, klass, NULL);
+
+ return self->_netns;
+}
+
+gboolean
+nm_platform_netns_push (NMPlatform *platform, NMPNetns **netns)
+{
+ g_return_val_if_fail (NM_IS_PLATFORM (platform), FALSE);
+ g_return_val_if_fail (!netns || !*netns, FALSE);
+
+ if ( platform->_netns
+ && !nmp_netns_push (platform->_netns))
+ return FALSE;
+
+ NM_SET_OUT (netns, platform->_netns);
+ return TRUE;
+}
+
+/******************************************************************/
+
static gboolean
_vtr_v4_route_add (NMPlatform *self, int ifindex, const NMPlatformIPXRoute *route, gint64 metric)
{
@@ -4124,6 +4161,20 @@ constructed (GObject *object)
static void
nm_platform_init (NMPlatform *object)
{
+ NMPlatform *self = NM_PLATFORM (object);
+ NMPNetns *netns;
+
+ netns = nmp_netns_get_current ();
+ if (netns)
+ self->_netns = nmp_netns_ref (netns);
+}
+
+static void
+finalize (GObject *object)
+{
+ NMPlatform *self = NM_PLATFORM (object);
+
+ nmp_netns_unref (self->_netns);
}
static void
@@ -4135,6 +4186,7 @@ nm_platform_class_init (NMPlatformClass *platform_class)
object_class->set_property = set_property;
object_class->constructed = constructed;
+ object_class->finalize = finalize;
platform_class->wifi_set_powersave = wifi_set_powersave;