summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBeniamino Galvani <bgalvani@redhat.com>2015-04-30 18:11:16 +0200
committerBeniamino Galvani <bgalvani@redhat.com>2015-06-04 17:32:01 +0200
commit366da20bf486bf2dbba092d9edcda050490e0d8a (patch)
tree04af1f19998a714d0f7caf98892d07dbf5da7473
parentff8c3d3fdaf116d28826c163656c202b4a876d0b (diff)
downloadNetworkManager-366da20bf486bf2dbba092d9edcda050490e0d8a.tar.gz
core: add 'metered' flag to NMIP4Config
Some DHCP servers send specific options to give a hint that clients should avoid unneeded data usage. Add a metered flag to NMIP4Config to keep track of this information.
-rw-r--r--src/nm-ip4-config.c30
-rw-r--r--src/nm-ip4-config.h4
2 files changed, 34 insertions, 0 deletions
diff --git a/src/nm-ip4-config.c b/src/nm-ip4-config.c
index 144e0a6f01..d10bcb9270 100644
--- a/src/nm-ip4-config.c
+++ b/src/nm-ip4-config.c
@@ -58,6 +58,7 @@ typedef struct {
guint32 mtu;
NMIPConfigSource mtu_source;
int ifindex;
+ gboolean metered;
} NMIP4ConfigPrivate;
/* internal guint32 are assigned to gobject properties of type uint. Ensure, that uint is large enough */
@@ -581,6 +582,10 @@ nm_ip4_config_merge (NMIP4Config *dst, const NMIP4Config *src)
for (i = 0; i < nm_ip4_config_get_num_wins (src); i++)
nm_ip4_config_add_wins (dst, nm_ip4_config_get_wins (src, i));
+ /* metered flag */
+ nm_ip4_config_set_metered (dst, nm_ip4_config_get_metered (dst) ||
+ nm_ip4_config_get_metered (src));
+
g_object_thaw_notify (G_OBJECT (dst));
}
@@ -1083,6 +1088,12 @@ nm_ip4_config_replace (NMIP4Config *dst, const NMIP4Config *src, gboolean *relev
has_minor_changes = TRUE;
}
+ /* metered */
+ if (src_priv->metered != dst_priv->metered) {
+ dst_priv->metered = src_priv->metered;
+ has_minor_changes = TRUE;
+ }
+
/* config_equal does not compare *all* the fields, therefore, we might have has_minor_changes
* regardless of config_equal. But config_equal must correspond to has_relevant_changes. */
g_assert (config_equal == !has_relevant_changes);
@@ -1158,6 +1169,7 @@ nm_ip4_config_dump (const NMIP4Config *config, const char *detail)
}
g_message (" n-dflt: %d", nm_ip4_config_get_never_default (config));
+ g_message (" mtrd: %d", (int) nm_ip4_config_get_metered (config));
}
gboolean
@@ -1864,6 +1876,24 @@ nm_ip4_config_get_mtu_source (const NMIP4Config *config)
/******************************************************************/
+void
+nm_ip4_config_set_metered (NMIP4Config *config, gboolean metered)
+{
+ NMIP4ConfigPrivate *priv = NM_IP4_CONFIG_GET_PRIVATE (config);
+
+ priv->metered = !!metered;
+}
+
+gboolean
+nm_ip4_config_get_metered (const NMIP4Config *config)
+{
+ NMIP4ConfigPrivate *priv = NM_IP4_CONFIG_GET_PRIVATE (config);
+
+ return priv->metered;
+}
+
+/******************************************************************/
+
static inline void
hash_u32 (GChecksum *sum, guint32 n)
{
diff --git a/src/nm-ip4-config.h b/src/nm-ip4-config.h
index a69af7e795..7f55d1bb18 100644
--- a/src/nm-ip4-config.h
+++ b/src/nm-ip4-config.h
@@ -157,6 +157,10 @@ void nm_ip4_config_set_mtu (NMIP4Config *config, guint32 mtu, NMIPConfigSource s
guint32 nm_ip4_config_get_mtu (const NMIP4Config *config);
NMIPConfigSource nm_ip4_config_get_mtu_source (const NMIP4Config *config);
+/* Metered */
+void nm_ip4_config_set_metered (NMIP4Config *config, gboolean metered);
+gboolean nm_ip4_config_get_metered (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);