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.
This commit is contained in:
Beniamino Galvani 2016-11-18 11:52:45 +01:00
parent 5ce81e23b7
commit 9609d4da1d
3 changed files with 6 additions and 35 deletions

View file

@ -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)

View file

@ -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;

View file

@ -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);