diff options
author | Beniamino Galvani <bgalvani@redhat.com> | 2016-11-18 11:52:45 +0100 |
---|---|---|
committer | Beniamino Galvani <bgalvani@redhat.com> | 2016-12-05 10:56:51 +0100 |
commit | 9609d4da1db564ffa2379790d26b74fd7f99fc27 (patch) | |
tree | a75719c568a574d9d8297888f96f3c6e329b30b0 | |
parent | 5ce81e23b7508c79b036ddbf4dc3dfdd2e6faec4 (diff) | |
download | NetworkManager-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.c | 2 | ||||
-rw-r--r-- | src/nm-ip4-config.c | 38 | ||||
-rw-r--r-- | src/nm-ip4-config.h | 1 |
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); |