diff options
author | Thomas Haller <thaller@redhat.com> | 2016-02-19 01:06:28 +0100 |
---|---|---|
committer | Thomas Haller <thaller@redhat.com> | 2016-02-20 00:19:09 +0100 |
commit | 6635e54d613304c3b319d822d6ae1a93d016e968 (patch) | |
tree | 7d58a573cf408dff8a2a9a3c60ebc55fab940a4d /src/platform/nm-platform.c | |
parent | 94d6aaac70ecec4baca6a072d32825287f8ee109 (diff) | |
download | NetworkManager-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.c | 52 |
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; |