mirror of
https://gitlab.freedesktop.org/NetworkManager/NetworkManager.git
synced 2026-05-08 14:48:10 +02:00
ip6-config: cache addresses variants
This commit is contained in:
parent
9609d4da1d
commit
ed4d5889c7
1 changed files with 38 additions and 21 deletions
|
|
@ -48,6 +48,8 @@ typedef struct {
|
||||||
int ifindex;
|
int ifindex;
|
||||||
gint64 route_metric;
|
gint64 route_metric;
|
||||||
gint dns_priority;
|
gint dns_priority;
|
||||||
|
GVariant *address_data_variant;
|
||||||
|
GVariant *addresses_variant;
|
||||||
} NMIP6ConfigPrivate;
|
} NMIP6ConfigPrivate;
|
||||||
|
|
||||||
struct _NMIP6Config {
|
struct _NMIP6Config {
|
||||||
|
|
@ -106,6 +108,17 @@ nm_ip6_config_get_ifindex (const NMIP6Config *config)
|
||||||
|
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
|
|
||||||
|
static void
|
||||||
|
notify_addresses (NMIP6Config *self)
|
||||||
|
{
|
||||||
|
NMIP6ConfigPrivate *priv = NM_IP6_CONFIG_GET_PRIVATE (self);
|
||||||
|
|
||||||
|
nm_clear_g_variant (&priv->address_data_variant);
|
||||||
|
nm_clear_g_variant (&priv->addresses_variant);
|
||||||
|
_notify (self, PROP_ADDRESS_DATA);
|
||||||
|
_notify (self, PROP_ADDRESSES);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* nm_ip6_config_capture_resolv_conf():
|
* nm_ip6_config_capture_resolv_conf():
|
||||||
* @nameservers: array of struct in6_addr
|
* @nameservers: array of struct in6_addr
|
||||||
|
|
@ -287,8 +300,7 @@ nm_ip6_config_addresses_sort (NMIP6Config *self, NMSettingIP6ConfigPrivacy use_t
|
||||||
g_free (data_pre);
|
g_free (data_pre);
|
||||||
|
|
||||||
if (changed) {
|
if (changed) {
|
||||||
_notify (self, PROP_ADDRESS_DATA);
|
notify_addresses (self);
|
||||||
_notify (self, PROP_ADDRESSES);
|
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -1282,8 +1294,7 @@ nm_ip6_config_reset_addresses (NMIP6Config *config)
|
||||||
|
|
||||||
if (priv->addresses->len != 0) {
|
if (priv->addresses->len != 0) {
|
||||||
g_array_set_size (priv->addresses, 0);
|
g_array_set_size (priv->addresses, 0);
|
||||||
_notify (config, PROP_ADDRESS_DATA);
|
notify_addresses (config);
|
||||||
_notify (config, PROP_ADDRESSES);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -1340,8 +1351,7 @@ nm_ip6_config_add_address (NMIP6Config *config, const NMPlatformIP6Address *new)
|
||||||
|
|
||||||
g_array_append_val (priv->addresses, *new);
|
g_array_append_val (priv->addresses, *new);
|
||||||
NOTIFY:
|
NOTIFY:
|
||||||
_notify (config, PROP_ADDRESS_DATA);
|
notify_addresses (config);
|
||||||
_notify (config, PROP_ADDRESSES);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
|
@ -1352,8 +1362,8 @@ nm_ip6_config_del_address (NMIP6Config *config, guint i)
|
||||||
g_return_if_fail (i < priv->addresses->len);
|
g_return_if_fail (i < priv->addresses->len);
|
||||||
|
|
||||||
g_array_remove_index (priv->addresses, i);
|
g_array_remove_index (priv->addresses, i);
|
||||||
_notify (config, PROP_ADDRESS_DATA);
|
|
||||||
_notify (config, PROP_ADDRESSES);
|
notify_addresses (config);
|
||||||
}
|
}
|
||||||
|
|
||||||
guint
|
guint
|
||||||
|
|
@ -2000,6 +2010,8 @@ finalize (GObject *object)
|
||||||
g_ptr_array_unref (priv->domains);
|
g_ptr_array_unref (priv->domains);
|
||||||
g_ptr_array_unref (priv->searches);
|
g_ptr_array_unref (priv->searches);
|
||||||
g_ptr_array_unref (priv->dns_options);
|
g_ptr_array_unref (priv->dns_options);
|
||||||
|
nm_clear_g_variant (&priv->address_data_variant);
|
||||||
|
nm_clear_g_variant (&priv->addresses_variant);
|
||||||
|
|
||||||
G_OBJECT_CLASS (nm_ip6_config_parent_class)->finalize (object);
|
G_OBJECT_CLASS (nm_ip6_config_parent_class)->finalize (object);
|
||||||
}
|
}
|
||||||
|
|
@ -2036,10 +2048,19 @@ get_property (GObject *object, guint prop_id,
|
||||||
g_value_set_int (value, priv->ifindex);
|
g_value_set_int (value, priv->ifindex);
|
||||||
break;
|
break;
|
||||||
case PROP_ADDRESS_DATA:
|
case PROP_ADDRESS_DATA:
|
||||||
|
case PROP_ADDRESSES:
|
||||||
{
|
{
|
||||||
GVariantBuilder array_builder, addr_builder;
|
GVariantBuilder array_builder, addr_builder;
|
||||||
guint naddr = nm_ip6_config_get_num_addresses (config);
|
const struct in6_addr *gateway;
|
||||||
guint i;
|
guint naddr, i;
|
||||||
|
|
||||||
|
g_return_if_fail (!!priv->address_data_variant == !!priv->addresses_variant);
|
||||||
|
|
||||||
|
if (priv->address_data_variant)
|
||||||
|
goto return_cached;
|
||||||
|
|
||||||
|
naddr = nm_ip6_config_get_num_addresses (config);
|
||||||
|
gateway = nm_ip6_config_get_gateway (config);
|
||||||
|
|
||||||
g_variant_builder_init (&array_builder, G_VARIANT_TYPE ("aa{sv}"));
|
g_variant_builder_init (&array_builder, G_VARIANT_TYPE ("aa{sv}"));
|
||||||
for (i = 0; i < naddr; i++) {
|
for (i = 0; i < naddr; i++) {
|
||||||
|
|
@ -2061,16 +2082,7 @@ get_property (GObject *object, guint prop_id,
|
||||||
|
|
||||||
g_variant_builder_add (&array_builder, "a{sv}", &addr_builder);
|
g_variant_builder_add (&array_builder, "a{sv}", &addr_builder);
|
||||||
}
|
}
|
||||||
|
priv->address_data_variant = g_variant_ref_sink (g_variant_builder_end (&array_builder));
|
||||||
g_value_take_variant (value, g_variant_builder_end (&array_builder));
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case PROP_ADDRESSES:
|
|
||||||
{
|
|
||||||
GVariantBuilder array_builder;
|
|
||||||
const struct in6_addr *gateway = nm_ip6_config_get_gateway (config);
|
|
||||||
guint naddr = nm_ip6_config_get_num_addresses (config);
|
|
||||||
guint i;
|
|
||||||
|
|
||||||
g_variant_builder_init (&array_builder, G_VARIANT_TYPE ("a(ayuay)"));
|
g_variant_builder_init (&array_builder, G_VARIANT_TYPE ("a(ayuay)"));
|
||||||
for (i = 0; i < naddr; i++) {
|
for (i = 0; i < naddr; i++) {
|
||||||
|
|
@ -2085,7 +2097,12 @@ get_property (GObject *object, guint prop_id,
|
||||||
16, 1));
|
16, 1));
|
||||||
}
|
}
|
||||||
|
|
||||||
g_value_take_variant (value, g_variant_builder_end (&array_builder));
|
priv->addresses_variant = g_variant_ref_sink (g_variant_builder_end (&array_builder));
|
||||||
|
return_cached:
|
||||||
|
g_value_set_variant (value,
|
||||||
|
prop_id == PROP_ADDRESS_DATA ?
|
||||||
|
priv->address_data_variant :
|
||||||
|
priv->addresses_variant);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case PROP_ROUTE_DATA:
|
case PROP_ROUTE_DATA:
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue