summaryrefslogtreecommitdiff
path: root/src/platform/nm-linux-platform.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/platform/nm-linux-platform.c')
-rw-r--r--src/platform/nm-linux-platform.c135
1 files changed, 76 insertions, 59 deletions
diff --git a/src/platform/nm-linux-platform.c b/src/platform/nm-linux-platform.c
index 1ebffd0007..696dd139a3 100644
--- a/src/platform/nm-linux-platform.c
+++ b/src/platform/nm-linux-platform.c
@@ -45,6 +45,7 @@
#include "nm-core-internal.h"
#include "NetworkManagerUtils.h"
#include "nm-linux-platform.h"
+#include "nmp-netns-utils.h"
#include "nm-platform-utils.h"
#include "NetworkManagerUtils.h"
#include "nm-utils.h"
@@ -222,6 +223,7 @@ static void do_request_all_no_delayed_actions (NMPlatform *platform, DelayedActi
static void cache_pre_hook (NMPCache *cache, const NMPObject *old, const NMPObject *new, NMPCacheOpsType ops_type, gpointer user_data);
static void cache_prune_candidates_prune (NMPlatform *platform);
static gboolean event_handler_read_netlink (NMPlatform *platform, gboolean wait_for_acks);
+static void _assert_netns_current (NMPlatform *platform);
/*****************************************************************************/
@@ -648,6 +650,8 @@ _linktype_get_type (NMPlatform *platform,
{
guint i;
+ _assert_netns_current (platform);
+
if (completed_from_cache) {
const NMPObject *obj;
@@ -2420,6 +2424,16 @@ nm_linux_platform_setup (void)
/******************************************************************/
static void
+_assert_netns_current (NMPlatform *platform)
+{
+#if NM_MORE_ASSERTS
+ nm_assert (NM_IS_LINUX_PLATFORM (platform));
+
+ nm_assert (nmp_netns_get_current () == nm_platform_netns_get (platform));
+#endif
+}
+
+static void
_log_dbg_sysctl_set_impl (NMPlatform *platform, const char *path, const char *value)
{
GError *error = NULL;
@@ -2452,6 +2466,7 @@ _log_dbg_sysctl_set_impl (NMPlatform *platform, const char *path, const char *va
static gboolean
sysctl_set (NMPlatform *platform, const char *path, const char *value)
{
+ nm_auto_pop_netns NMPNetns *netns = NULL;
int fd, len, nwrote, tries;
char *actual;
@@ -2464,6 +2479,9 @@ sysctl_set (NMPlatform *platform, const char *path, const char *value)
/* Don't write to suspicious locations */
g_assert (!strstr (path, "/../"));
+ if (!nm_platform_netns_push (platform, &netns))
+ g_return_val_if_reached (FALSE);
+
fd = open (path, O_WRONLY | O_TRUNC);
if (fd == -1) {
if (errno == ENOENT) {
@@ -2572,6 +2590,7 @@ _log_dbg_sysctl_get_impl (NMPlatform *platform, const char *path, const char *co
static char *
sysctl_get (NMPlatform *platform, const char *path)
{
+ nm_auto_pop_netns NMPNetns *netns = NULL;
GError *error = NULL;
char *contents;
@@ -2581,6 +2600,9 @@ sysctl_get (NMPlatform *platform, const char *path)
/* Don't write to suspicious locations */
g_assert (!strstr (path, "/../"));
+ if (!nm_platform_netns_push (platform, &netns))
+ g_return_val_if_reached (NULL);
+
if (!g_file_get_contents (path, &contents, NULL, &error)) {
/* We assume FAILED means EOPNOTSUP */
if ( g_error_matches (error, G_FILE_ERROR, G_FILE_ERROR_NOENT)
@@ -4129,11 +4151,15 @@ link_set_user_ipv6ll_enabled (NMPlatform *platform, int ifindex, gboolean enable
static gboolean
link_supports_carrier_detect (NMPlatform *platform, int ifindex)
{
+ nm_auto_pop_netns NMPNetns *netns = NULL;
const char *name = nm_platform_link_get_name (platform, ifindex);
if (!name)
return FALSE;
+ if (!nm_platform_netns_push (platform, &netns))
+ g_return_val_if_reached (FALSE);
+
/* We use netlink for the actual carrier detection, but netlink can't tell
* us whether the device actually supports carrier detection in the first
* place. We assume any device that does implements one of these two APIs.
@@ -4144,6 +4170,7 @@ link_supports_carrier_detect (NMPlatform *platform, int ifindex)
static gboolean
link_supports_vlans (NMPlatform *platform, int ifindex)
{
+ nm_auto_pop_netns NMPNetns *netns = NULL;
const NMPObject *obj;
obj = cache_lookup_link (platform, ifindex);
@@ -4152,6 +4179,9 @@ link_supports_vlans (NMPlatform *platform, int ifindex)
if (!obj || obj->link.arptype != ARPHRD_ETHER)
return FALSE;
+ if (!nm_platform_netns_push (platform, &netns))
+ g_return_val_if_reached (FALSE);
+
return nmp_utils_ethtool_supports_vlans (obj->link.name);
}
@@ -4190,6 +4220,11 @@ link_get_permanent_address (NMPlatform *platform,
guint8 *buf,
size_t *length)
{
+ nm_auto_pop_netns NMPNetns *netns = NULL;
+
+ if (!nm_platform_netns_push (platform, &netns))
+ g_return_val_if_reached (FALSE);
+
return nmp_utils_ethtool_get_permanent_address (nm_platform_link_get_name (platform, ifindex), buf, length);
}
@@ -4971,15 +5006,19 @@ wifi_get_wifi_data (NMPlatform *platform, int ifindex)
return wifi_data;
}
+#define WIFI_GET_WIFI_DATA_NETNS(wifi_data, platform, ifindex, retval) \
+ nm_auto_pop_netns NMPNetns *netns = NULL; \
+ WifiData *wifi_data; \
+ if (!nm_platform_netns_push (platform, &netns)) \
+ return retval; \
+ wifi_data = wifi_get_wifi_data (platform, ifindex); \
+ if (!wifi_data) \
+ return retval;
static gboolean
wifi_get_capabilities (NMPlatform *platform, int ifindex, NMDeviceWifiCapabilities *caps)
{
- WifiData *wifi_data = wifi_get_wifi_data (platform, ifindex);
-
- if (!wifi_data)
- return FALSE;
-
+ WIFI_GET_WIFI_DATA_NETNS (wifi_data, platform, ifindex, FALSE);
if (caps)
*caps = wifi_utils_get_caps (wifi_data);
return TRUE;
@@ -4988,90 +5027,64 @@ wifi_get_capabilities (NMPlatform *platform, int ifindex, NMDeviceWifiCapabiliti
static gboolean
wifi_get_bssid (NMPlatform *platform, int ifindex, guint8 *bssid)
{
- WifiData *wifi_data = wifi_get_wifi_data (platform, ifindex);
-
- if (!wifi_data)
- return FALSE;
+ WIFI_GET_WIFI_DATA_NETNS (wifi_data, platform, ifindex, FALSE);
return wifi_utils_get_bssid (wifi_data, bssid);
}
static guint32
wifi_get_frequency (NMPlatform *platform, int ifindex)
{
- WifiData *wifi_data = wifi_get_wifi_data (platform, ifindex);
-
- if (!wifi_data)
- return 0;
+ WIFI_GET_WIFI_DATA_NETNS (wifi_data, platform, ifindex, 0);
return wifi_utils_get_freq (wifi_data);
}
static gboolean
wifi_get_quality (NMPlatform *platform, int ifindex)
{
- WifiData *wifi_data = wifi_get_wifi_data (platform, ifindex);
-
- if (!wifi_data)
- return FALSE;
+ WIFI_GET_WIFI_DATA_NETNS (wifi_data, platform, ifindex, FALSE);
return wifi_utils_get_qual (wifi_data);
}
static guint32
wifi_get_rate (NMPlatform *platform, int ifindex)
{
- WifiData *wifi_data = wifi_get_wifi_data (platform, ifindex);
-
- if (!wifi_data)
- return FALSE;
+ WIFI_GET_WIFI_DATA_NETNS (wifi_data, platform, ifindex, FALSE);
return wifi_utils_get_rate (wifi_data);
}
static NM80211Mode
wifi_get_mode (NMPlatform *platform, int ifindex)
{
- WifiData *wifi_data = wifi_get_wifi_data (platform, ifindex);
-
- if (!wifi_data)
- return NM_802_11_MODE_UNKNOWN;
-
+ WIFI_GET_WIFI_DATA_NETNS (wifi_data, platform, ifindex, NM_802_11_MODE_UNKNOWN);
return wifi_utils_get_mode (wifi_data);
}
static void
wifi_set_mode (NMPlatform *platform, int ifindex, NM80211Mode mode)
{
- WifiData *wifi_data = wifi_get_wifi_data (platform, ifindex);
-
- if (wifi_data)
- wifi_utils_set_mode (wifi_data, mode);
+ WIFI_GET_WIFI_DATA_NETNS (wifi_data, platform, ifindex, );
+ wifi_utils_set_mode (wifi_data, mode);
}
static void
wifi_set_powersave (NMPlatform *platform, int ifindex, guint32 powersave)
{
- WifiData *wifi_data = wifi_get_wifi_data (platform, ifindex);
-
- if (wifi_data)
- wifi_utils_set_powersave (wifi_data, powersave);
+ WIFI_GET_WIFI_DATA_NETNS (wifi_data, platform, ifindex, );
+ wifi_utils_set_powersave (wifi_data, powersave);
}
static guint32
wifi_find_frequency (NMPlatform *platform, int ifindex, const guint32 *freqs)
{
- WifiData *wifi_data = wifi_get_wifi_data (platform, ifindex);
-
- if (!wifi_data)
- return 0;
-
+ WIFI_GET_WIFI_DATA_NETNS (wifi_data, platform, ifindex, 0);
return wifi_utils_find_freq (wifi_data, freqs);
}
static void
wifi_indicate_addressing_running (NMPlatform *platform, int ifindex, gboolean running)
{
- WifiData *wifi_data = wifi_get_wifi_data (platform, ifindex);
-
- if (wifi_data)
- wifi_utils_indicate_addressing_running (wifi_data, running);
+ WIFI_GET_WIFI_DATA_NETNS (wifi_data, platform, ifindex, );
+ wifi_utils_indicate_addressing_running (wifi_data, running);
}
/******************************************************************/
@@ -5079,33 +5092,21 @@ wifi_indicate_addressing_running (NMPlatform *platform, int ifindex, gboolean ru
static guint32
mesh_get_channel (NMPlatform *platform, int ifindex)
{
- WifiData *wifi_data = wifi_get_wifi_data (platform, ifindex);
-
- if (!wifi_data)
- return 0;
-
+ WIFI_GET_WIFI_DATA_NETNS (wifi_data, platform, ifindex, 0);
return wifi_utils_get_mesh_channel (wifi_data);
}
static gboolean
mesh_set_channel (NMPlatform *platform, int ifindex, guint32 channel)
{
- WifiData *wifi_data = wifi_get_wifi_data (platform, ifindex);
-
- if (!wifi_data)
- return FALSE;
-
+ WIFI_GET_WIFI_DATA_NETNS (wifi_data, platform, ifindex, FALSE);
return wifi_utils_set_mesh_channel (wifi_data, channel);
}
static gboolean
mesh_set_ssid (NMPlatform *platform, int ifindex, const guint8 *ssid, gsize len)
{
- WifiData *wifi_data = wifi_get_wifi_data (platform, ifindex);
-
- if (!wifi_data)
- return FALSE;
-
+ WIFI_GET_WIFI_DATA_NETNS (wifi_data, platform, ifindex, FALSE);
return wifi_utils_set_mesh_ssid (wifi_data, ssid, len);
}
@@ -5114,8 +5115,12 @@ mesh_set_ssid (NMPlatform *platform, int ifindex, const guint8 *ssid, gsize len)
static gboolean
link_get_wake_on_lan (NMPlatform *platform, int ifindex)
{
+ nm_auto_pop_netns NMPNetns *netns = NULL;
NMLinkType type = nm_platform_link_get_type (platform, ifindex);
+ if (!nm_platform_netns_push (platform, &netns))
+ g_return_val_if_reached (FALSE);
+
if (type == NM_LINK_TYPE_ETHERNET)
return nmp_utils_ethtool_get_wake_on_lan (nm_platform_link_get_name (platform, ifindex));
else if (type == NM_LINK_TYPE_WIFI) {
@@ -5136,6 +5141,11 @@ link_get_driver_info (NMPlatform *platform,
char **out_driver_version,
char **out_fw_version)
{
+ nm_auto_pop_netns NMPNetns *netns = NULL;
+
+ if (!nm_platform_netns_push (platform, &netns))
+ g_return_val_if_reached (FALSE);
+
return nmp_utils_ethtool_get_driver_info (nm_platform_link_get_name (platform, ifindex),
out_driver_name,
out_driver_version,
@@ -5716,6 +5726,7 @@ out:
static gboolean
event_handler_read_netlink (NMPlatform *platform, gboolean wait_for_acks)
{
+ nm_auto_pop_netns NMPNetns *netns = NULL;
NMLinuxPlatformPrivate *priv = NM_LINUX_PLATFORM_GET_PRIVATE (platform);
int r, nle;
struct pollfd pfd;
@@ -5728,6 +5739,9 @@ event_handler_read_netlink (NMPlatform *platform, gboolean wait_for_acks)
gint64 timeout_abs_ns;
} data_next;
+ if (!nm_platform_netns_push (platform, &netns))
+ g_return_val_if_reached (FALSE);
+
while (TRUE) {
while (TRUE) {
@@ -5932,11 +5946,14 @@ static void
nm_linux_platform_init (NMLinuxPlatform *self)
{
NMLinuxPlatformPrivate *priv = G_TYPE_INSTANCE_GET_PRIVATE (self, NM_TYPE_LINUX_PLATFORM, NMLinuxPlatformPrivate);
+ gboolean use_udev;
+
+ use_udev = (nmp_netns_get_initial () == nmp_netns_get_current ()) && nmp_cache_use_udev_detect ();
self->priv = priv;
priv->nlh_seq_next = 1;
- priv->cache = nmp_cache_new ();
+ priv->cache = nmp_cache_new (use_udev);
priv->delayed_action.list_master_connected = g_ptr_array_new ();
priv->delayed_action.list_refresh_link = g_ptr_array_new ();
priv->delayed_action.list_wait_for_nl_response = g_array_new (FALSE, TRUE, sizeof (DelayedActionWaitForNlResponseData));