summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLubomir Rintel <lkundrak@v3.sk>2014-10-09 18:51:11 +0200
committerThomas Haller <thaller@redhat.com>2014-10-20 14:32:38 +0200
commit810dc260ef5697560e49fd92a2f6cb166d7babf4 (patch)
tree9c0177a563757a7ae6d74a8e239af98ee130b97d
parent33866e4030bce9bec081474c33e37854efb58ba7 (diff)
downloadNetworkManager-810dc260ef5697560e49fd92a2f6cb166d7babf4.tar.gz
core: track origin of MTU
Only override MTU if it came from a source of higher priority or is of equal priority but of lower value.
-rw-r--r--src/devices/nm-device-ethernet.c2
-rw-r--r--src/devices/nm-device-infiniband.c2
-rw-r--r--src/devices/nm-device-vlan.c2
-rw-r--r--src/devices/wifi/nm-device-wifi.c2
-rw-r--r--src/dhcp-manager/nm-dhcp-utils.c2
-rw-r--r--src/nm-ip4-config.c24
-rw-r--r--src/nm-ip4-config.h3
-rw-r--r--src/ppp-manager/nm-ppp-manager.c2
-rw-r--r--src/tests/test-ip4-config.c6
-rw-r--r--src/vpn-manager/nm-vpn-connection.c2
10 files changed, 31 insertions, 16 deletions
diff --git a/src/devices/nm-device-ethernet.c b/src/devices/nm-device-ethernet.c
index d057f1bea8..a0713a7922 100644
--- a/src/devices/nm-device-ethernet.c
+++ b/src/devices/nm-device-ethernet.c
@@ -1354,7 +1354,7 @@ ip4_config_pre_commit (NMDevice *device, NMIP4Config *config)
/* MTU override */
mtu = nm_setting_wired_get_mtu (s_wired);
if (mtu)
- nm_ip4_config_set_mtu (config, mtu);
+ nm_ip4_config_set_mtu (config, mtu, NM_IP_CONFIG_SOURCE_USER);
}
static void
diff --git a/src/devices/nm-device-infiniband.c b/src/devices/nm-device-infiniband.c
index 8101c3e12c..acf74490f2 100644
--- a/src/devices/nm-device-infiniband.c
+++ b/src/devices/nm-device-infiniband.c
@@ -142,7 +142,7 @@ ip4_config_pre_commit (NMDevice *self, NMIP4Config *config)
/* MTU override */
mtu = nm_setting_infiniband_get_mtu (s_infiniband);
if (mtu)
- nm_ip4_config_set_mtu (config, mtu);
+ nm_ip4_config_set_mtu (config, mtu, NM_IP_CONFIG_SOURCE_USER);
}
static gboolean
diff --git a/src/devices/nm-device-vlan.c b/src/devices/nm-device-vlan.c
index 71013a99c8..8ca39be64b 100644
--- a/src/devices/nm-device-vlan.c
+++ b/src/devices/nm-device-vlan.c
@@ -390,7 +390,7 @@ ip4_config_pre_commit (NMDevice *device, NMIP4Config *config)
if (s_wired) {
mtu = nm_setting_wired_get_mtu (s_wired);
if (mtu)
- nm_ip4_config_set_mtu (config, mtu);
+ nm_ip4_config_set_mtu (config, mtu, NM_IP_CONFIG_SOURCE_USER);
}
}
diff --git a/src/devices/wifi/nm-device-wifi.c b/src/devices/wifi/nm-device-wifi.c
index 6d93833792..cf5a4f631c 100644
--- a/src/devices/wifi/nm-device-wifi.c
+++ b/src/devices/wifi/nm-device-wifi.c
@@ -2883,7 +2883,7 @@ ip4_config_pre_commit (NMDevice *device, NMIP4Config *config)
/* MTU override */
mtu = nm_setting_wireless_get_mtu (s_wifi);
if (mtu)
- nm_ip4_config_set_mtu (config, mtu);
+ nm_ip4_config_set_mtu (config, mtu, NM_IP_CONFIG_SOURCE_USER);
}
static gboolean
diff --git a/src/dhcp-manager/nm-dhcp-utils.c b/src/dhcp-manager/nm-dhcp-utils.c
index 379e73729f..46fa96ecd9 100644
--- a/src/dhcp-manager/nm-dhcp-utils.c
+++ b/src/dhcp-manager/nm-dhcp-utils.c
@@ -542,7 +542,7 @@ nm_dhcp_utils_ip4_config_from_options (const char *iface,
goto error;
if (int_mtu > 576)
- nm_ip4_config_set_mtu (ip4_config, int_mtu);
+ nm_ip4_config_set_mtu (ip4_config, int_mtu, NM_IP_CONFIG_SOURCE_DHCP);
}
str = g_hash_table_lookup (options, "nis_domain");
diff --git a/src/nm-ip4-config.c b/src/nm-ip4-config.c
index b30a4ee766..490c0f18cb 100644
--- a/src/nm-ip4-config.c
+++ b/src/nm-ip4-config.c
@@ -49,6 +49,7 @@ typedef struct {
char *nis_domain;
GArray *wins;
guint32 mtu;
+ NMIPConfigSource mtu_source;
} NMIP4ConfigPrivate;
/* internal guint32 are assigned to gobject properties of type uint. Ensure, that uint is large enough */
@@ -516,7 +517,8 @@ nm_ip4_config_merge (NMIP4Config *dst, const NMIP4Config *src)
/* MTU */
if (!nm_ip4_config_get_mtu (dst))
- nm_ip4_config_set_mtu (dst, nm_ip4_config_get_mtu (src));
+ nm_ip4_config_set_mtu (dst, nm_ip4_config_get_mtu (src),
+ nm_ip4_config_get_mtu_source (src));
/* NIS */
for (i = 0; i < nm_ip4_config_get_num_nis_servers (src); i++)
@@ -630,7 +632,7 @@ nm_ip4_config_subtract (NMIP4Config *dst, const NMIP4Config *src)
/* MTU */
if (nm_ip4_config_get_mtu (src) == nm_ip4_config_get_mtu (dst))
- nm_ip4_config_set_mtu (dst, 0);
+ nm_ip4_config_set_mtu (dst, 0, NM_IP_CONFIG_SOURCE_UNKNOWN);
/* NIS */
for (i = 0; i < nm_ip4_config_get_num_nis_servers (src); i++) {
@@ -870,7 +872,7 @@ nm_ip4_config_replace (NMIP4Config *dst, const NMIP4Config *src, gboolean *relev
/* mtu */
if (src_priv->mtu != dst_priv->mtu) {
- nm_ip4_config_set_mtu (dst, src_priv->mtu);
+ nm_ip4_config_set_mtu (dst, src_priv->mtu, src_priv->mtu_source);
has_minor_changes = TRUE;
}
@@ -1502,11 +1504,15 @@ nm_ip4_config_get_wins (const NMIP4Config *config, guint i)
/******************************************************************/
void
-nm_ip4_config_set_mtu (NMIP4Config *config, guint32 mtu)
+nm_ip4_config_set_mtu (NMIP4Config *config, guint32 mtu, NMIPConfigSource source)
{
NMIP4ConfigPrivate *priv = NM_IP4_CONFIG_GET_PRIVATE (config);
- priv->mtu = mtu;
+ if (source > priv->mtu_source) {
+ priv->mtu = mtu;
+ priv->mtu_source = source;
+ } else if (source == priv->mtu_source && (!priv->mtu || priv->mtu > mtu))
+ priv->mtu = mtu;
}
guint32
@@ -1517,6 +1523,14 @@ nm_ip4_config_get_mtu (const NMIP4Config *config)
return priv->mtu;
}
+NMIPConfigSource
+nm_ip4_config_get_mtu_source (const NMIP4Config *config)
+{
+ NMIP4ConfigPrivate *priv = NM_IP4_CONFIG_GET_PRIVATE (config);
+
+ return priv->mtu_source;
+}
+
/******************************************************************/
static inline void
diff --git a/src/nm-ip4-config.h b/src/nm-ip4-config.h
index 6b88228bbe..5faaeb5f7b 100644
--- a/src/nm-ip4-config.h
+++ b/src/nm-ip4-config.h
@@ -134,8 +134,9 @@ guint32 nm_ip4_config_get_num_wins (const NMIP4Config *config);
guint32 nm_ip4_config_get_wins (const NMIP4Config *config, guint i);
/* MTU */
-void nm_ip4_config_set_mtu (NMIP4Config *config, guint32 mtu);
+void nm_ip4_config_set_mtu (NMIP4Config *config, guint32 mtu, NMIPConfigSource source);
guint32 nm_ip4_config_get_mtu (const NMIP4Config *config);
+NMIPConfigSource nm_ip4_config_get_mtu_source (const NMIP4Config *config);
void nm_ip4_config_hash (const NMIP4Config *config, GChecksum *sum, gboolean dns_only);
gboolean nm_ip4_config_equal (const NMIP4Config *a, const NMIP4Config *b);
diff --git a/src/ppp-manager/nm-ppp-manager.c b/src/ppp-manager/nm-ppp-manager.c
index af588c51ec..ac2fb9f7a3 100644
--- a/src/ppp-manager/nm-ppp-manager.c
+++ b/src/ppp-manager/nm-ppp-manager.c
@@ -610,7 +610,7 @@ impl_ppp_manager_set_ip4_config (NMPPPManager *manager,
goto out;
if (mtu)
- nm_ip4_config_set_mtu (config, mtu);
+ nm_ip4_config_set_mtu (config, mtu, NM_IP_CONFIG_SOURCE_PPP);
/* Push the IP4 config up to the device */
g_signal_emit (manager, signals[IP4_CONFIG], 0, priv->ip_iface, config);
diff --git a/src/tests/test-ip4-config.c b/src/tests/test-ip4-config.c
index ca01d5f02e..68de1e3ea6 100644
--- a/src/tests/test-ip4-config.c
+++ b/src/tests/test-ip4-config.c
@@ -139,7 +139,7 @@ test_subtract (void)
nm_ip4_config_add_wins (dst, expected_wins);
nm_ip4_config_set_mss (dst, expected_mss);
- nm_ip4_config_set_mtu (dst, expected_mtu);
+ nm_ip4_config_set_mtu (dst, expected_mtu, NM_IP_CONFIG_SOURCE_UNKNOWN);
nm_ip4_config_subtract (dst, src);
@@ -310,9 +310,9 @@ test_merge_subtract_mss_mtu (void)
/* add MSS, MTU to configs to test them */
nm_ip4_config_set_mss (cfg2, expected_mss2);
- nm_ip4_config_set_mtu (cfg2, expected_mtu2);
+ nm_ip4_config_set_mtu (cfg2, expected_mtu2, NM_IP_CONFIG_SOURCE_UNKNOWN);
nm_ip4_config_set_mss (cfg3, expected_mss3);
- nm_ip4_config_set_mtu (cfg3, expected_mtu3);
+ nm_ip4_config_set_mtu (cfg3, expected_mtu3, NM_IP_CONFIG_SOURCE_UNKNOWN);
nm_ip4_config_merge (cfg1, cfg2);
/* ensure MSS and MTU are in cfg1 */
diff --git a/src/vpn-manager/nm-vpn-connection.c b/src/vpn-manager/nm-vpn-connection.c
index 8106698ead..5ddf22e771 100644
--- a/src/vpn-manager/nm-vpn-connection.c
+++ b/src/vpn-manager/nm-vpn-connection.c
@@ -1160,7 +1160,7 @@ nm_vpn_connection_ip4_config_get (DBusGProxy *proxy,
nm_ip4_config_set_mss (config, g_value_get_uint (val));
if (priv->mtu)
- nm_ip4_config_set_mtu (config, priv->mtu);
+ nm_ip4_config_set_mtu (config, priv->mtu, NM_IP_CONFIG_SOURCE_VPN);
val = (GValue *) g_hash_table_lookup (config_hash, NM_VPN_PLUGIN_IP4_CONFIG_DOMAIN);
if (val)