summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBeniamino Galvani <bgalvani@redhat.com>2016-11-18 11:52:45 +0100
committerBeniamino Galvani <bgalvani@redhat.com>2016-12-05 10:56:51 +0100
commit9609d4da1db564ffa2379790d26b74fd7f99fc27 (patch)
treea75719c568a574d9d8297888f96f3c6e329b30b0
parent5ce81e23b7508c79b036ddbf4dc3dfdd2e6faec4 (diff)
downloadNetworkManager-9609d4da1db564ffa2379790d26b74fd7f99fc27.tar.gz
ip4-config: sort addresses only when reading the property value
Don't change the address order from configuration, but instead sort addresses just before returning them to clients.
-rw-r--r--src/devices/nm-device.c2
-rw-r--r--src/nm-ip4-config.c38
-rw-r--r--src/nm-ip4-config.h1
3 files changed, 6 insertions, 35 deletions
diff --git a/src/devices/nm-device.c b/src/devices/nm-device.c
index b95dce544a..222a6223a7 100644
--- a/src/devices/nm-device.c
+++ b/src/devices/nm-device.c
@@ -4957,8 +4957,6 @@ END_ADD_DEFAULT_ROUTE:
priv->default_route.v4_has = _device_get_default_route_from_platform (self, AF_INET, (NMPlatformIPRoute *) &priv->default_route.v4);
}
- nm_ip4_config_addresses_sort (composite);
-
/* Allow setting MTU etc */
if (commit) {
if (NM_DEVICE_GET_CLASS (self)->ip4_config_pre_commit)
diff --git a/src/nm-ip4-config.c b/src/nm-ip4-config.c
index 65c6277137..4c0883cdba 100644
--- a/src/nm-ip4-config.c
+++ b/src/nm-ip4-config.c
@@ -238,36 +238,6 @@ _addresses_sort_cmp (gconstpointer a, gconstpointer b)
return memcmp (&n1, &n2, sizeof (guint32));
}
-gboolean
-nm_ip4_config_addresses_sort (NMIP4Config *self)
-{
- NMIP4ConfigPrivate *priv;
- size_t data_len = 0;
- char *data_pre = NULL;
- gboolean changed;
-
- g_return_val_if_fail (NM_IS_IP4_CONFIG (self), FALSE);
-
- priv = NM_IP4_CONFIG_GET_PRIVATE (self);
- if (priv->addresses->len > 1) {
- data_len = priv->addresses->len * g_array_get_element_size (priv->addresses);
- data_pre = g_new (char, data_len);
- memcpy (data_pre, priv->addresses->data, data_len);
-
- g_array_sort (priv->addresses, _addresses_sort_cmp);
-
- changed = memcmp (data_pre, priv->addresses->data, data_len) != 0;
- g_free (data_pre);
-
- if (changed) {
- _notify (self, PROP_ADDRESS_DATA);
- _notify (self, PROP_ADDRESSES);
- return TRUE;
- }
- }
- return FALSE;
-}
-
/*****************************************************************************/
static void
@@ -2315,6 +2285,7 @@ get_property (GObject *object, guint prop_id,
case PROP_ADDRESSES:
{
GVariantBuilder array_builder, addr_builder;
+ gs_unref_array GArray *new = NULL;
guint naddr, i;
g_return_if_fail (!!priv->address_data_variant == !!priv->addresses_variant);
@@ -2323,11 +2294,14 @@ get_property (GObject *object, guint prop_id,
goto return_cached;
naddr = nm_ip4_config_get_num_addresses (config);
+ new = g_array_sized_new (FALSE, FALSE, sizeof (NMPlatformIP4Address), naddr);
+ g_array_append_vals (new, priv->addresses->data, priv->addresses->len);
+ g_array_sort (new, _addresses_sort_cmp);
/* Build address data variant */
g_variant_builder_init (&array_builder, G_VARIANT_TYPE ("aa{sv}"));
for (i = 0; i < naddr; i++) {
- const NMPlatformIP4Address *address = nm_ip4_config_get_address (config, i);
+ const NMPlatformIP4Address *address = &g_array_index (new, NMPlatformIP4Address, i);
g_variant_builder_init (&addr_builder, G_VARIANT_TYPE ("a{sv}"));
g_variant_builder_add (&addr_builder, "{sv}",
@@ -2355,7 +2329,7 @@ get_property (GObject *object, guint prop_id,
/* Build addresses variant */
g_variant_builder_init (&array_builder, G_VARIANT_TYPE ("aau"));
for (i = 0; i < naddr; i++) {
- const NMPlatformIP4Address *address = nm_ip4_config_get_address (config, i);
+ const NMPlatformIP4Address *address = &g_array_index (new, NMPlatformIP4Address, i);
guint32 dbus_addr[3];
dbus_addr[0] = address->address;
diff --git a/src/nm-ip4-config.h b/src/nm-ip4-config.h
index 64d6330ccd..58ee4a7de0 100644
--- a/src/nm-ip4-config.h
+++ b/src/nm-ip4-config.h
@@ -87,7 +87,6 @@ void nm_ip4_config_del_address (NMIP4Config *config, guint i);
guint nm_ip4_config_get_num_addresses (const NMIP4Config *config);
const NMPlatformIP4Address *nm_ip4_config_get_address (const NMIP4Config *config, guint i);
gboolean nm_ip4_config_address_exists (const NMIP4Config *config, const NMPlatformIP4Address *address);
-gboolean nm_ip4_config_addresses_sort (NMIP4Config *config);
void nm_ip4_config_reset_routes (NMIP4Config *config);
void nm_ip4_config_add_route (NMIP4Config *config, const NMPlatformIP4Route *route);