diff --git a/src/devices/nm-device.c b/src/devices/nm-device.c index f9bcec2117..093f7a5150 100644 --- a/src/devices/nm-device.c +++ b/src/devices/nm-device.c @@ -5432,13 +5432,15 @@ ip6_config_merge_and_apply (NMDevice *self, /* If no config was passed in, create a new one */ composite = nm_ip6_config_new (nm_device_get_ip_ifindex (self)); + nm_ip6_config_set_privacy (composite, + priv->rdisc ? + priv->rdisc_use_tempaddr : + NM_SETTING_IP6_CONFIG_PRIVACY_UNKNOWN); init_ip6_config_dns_priority (self, composite); if (commit) ensure_con_ip6_config (self); - g_assert (composite); - /* Merge all the IP configs into the composite config */ if (priv->ac_ip6_config) { nm_ip6_config_merge (composite, priv->ac_ip6_config, @@ -5565,8 +5567,7 @@ END_ADD_DEFAULT_ROUTE: priv->default_route.v6_has = _device_get_default_route_from_platform (self, AF_INET6, (NMPlatformIPRoute *) &priv->default_route.v6); } - nm_ip6_config_addresses_sort (composite, - priv->rdisc ? priv->rdisc_use_tempaddr : NM_SETTING_IP6_CONFIG_PRIVACY_UNKNOWN); + nm_ip6_config_addresses_sort (composite); /* Allow setting MTU etc */ if (commit) { diff --git a/src/nm-ip6-config.c b/src/nm-ip6-config.c index b80c958386..893302b33b 100644 --- a/src/nm-ip6-config.c +++ b/src/nm-ip6-config.c @@ -50,6 +50,7 @@ typedef struct { gint dns_priority; GVariant *address_data_variant; GVariant *addresses_variant; + NMSettingIP6ConfigPrivacy privacy; } NMIP6ConfigPrivate; struct _NMIP6Config { @@ -106,7 +107,15 @@ nm_ip6_config_get_ifindex (const NMIP6Config *config) return NM_IP6_CONFIG_GET_PRIVATE (config)->ifindex; } -/******************************************************************/ +void +nm_ip6_config_set_privacy (NMIP6Config *config, NMSettingIP6ConfigPrivacy privacy) +{ + NMIP6ConfigPrivate *priv = NM_IP6_CONFIG_GET_PRIVATE (config); + + priv->privacy = privacy; +} + +/*****************************************************************************/ static void notify_addresses (NMIP6Config *self) @@ -279,7 +288,7 @@ _addresses_sort_cmp (gconstpointer a, gconstpointer b, gpointer user_data) } gboolean -nm_ip6_config_addresses_sort (NMIP6Config *self, NMSettingIP6ConfigPrivacy use_temporary) +nm_ip6_config_addresses_sort (NMIP6Config *self) { NMIP6ConfigPrivate *priv; size_t data_len = 0; @@ -294,7 +303,8 @@ nm_ip6_config_addresses_sort (NMIP6Config *self, NMSettingIP6ConfigPrivacy use_t data_pre = g_new (char, data_len); memcpy (data_pre, priv->addresses->data, data_len); - g_array_sort_with_data (priv->addresses, _addresses_sort_cmp, GINT_TO_POINTER (use_temporary)); + g_array_sort_with_data (priv->addresses, _addresses_sort_cmp, + GINT_TO_POINTER (priv->privacy)); changed = memcmp (data_pre, priv->addresses->data, data_len) != 0; g_free (data_pre); @@ -1168,6 +1178,11 @@ nm_ip6_config_replace (NMIP6Config *dst, const NMIP6Config *src, gboolean *relev has_minor_changes = TRUE; } + if (src_priv->privacy != dst_priv->privacy) { + nm_ip6_config_set_privacy (dst, src_priv->privacy); + has_minor_changes = TRUE; + } + #if NM_MORE_ASSERTS /* 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. */ diff --git a/src/nm-ip6-config.h b/src/nm-ip6-config.h index 184d3e327d..9454c0f772 100644 --- a/src/nm-ip6-config.h +++ b/src/nm-ip6-config.h @@ -88,7 +88,7 @@ guint nm_ip6_config_get_num_addresses (const NMIP6Config *config); const NMPlatformIP6Address *nm_ip6_config_get_address (const NMIP6Config *config, guint i); const NMPlatformIP6Address *nm_ip6_config_get_address_first_nontentative (const NMIP6Config *config, gboolean linklocal); gboolean nm_ip6_config_address_exists (const NMIP6Config *config, const NMPlatformIP6Address *address); -gboolean nm_ip6_config_addresses_sort (NMIP6Config *config, NMSettingIP6ConfigPrivacy use_temporary); +gboolean nm_ip6_config_addresses_sort (NMIP6Config *config); gboolean nm_ip6_config_has_any_dad_pending (const NMIP6Config *self, const NMIP6Config *candidates); @@ -134,7 +134,8 @@ guint32 nm_ip6_config_get_mss (const NMIP6Config *config); void nm_ip6_config_hash (const NMIP6Config *config, GChecksum *sum, gboolean dns_only); gboolean nm_ip6_config_equal (const NMIP6Config *a, const NMIP6Config *b); -/******************************************************/ +void nm_ip6_config_set_privacy (NMIP6Config *config, NMSettingIP6ConfigPrivacy privacy); + /* Testing-only functions */ gboolean nm_ip6_config_capture_resolv_conf (GArray *nameservers, diff --git a/src/tests/test-ip6-config.c b/src/tests/test-ip6-config.c index 3eceec0cbe..de890141d1 100644 --- a/src/tests/test-ip6-config.c +++ b/src/tests/test-ip6-config.c @@ -238,10 +238,13 @@ test_nm_ip6_config_addresses_sort_check (NMIP6Config *config, NMSettingIP6Config { int addr_count = nm_ip6_config_get_num_addresses (config); int i, irepeat; - NMIP6Config *copy = nmtst_ip6_config_clone (config); - NMIP6Config *copy2 = nmtst_ip6_config_clone (config); + NMIP6Config *copy, *copy2; int *idx = g_new (int, addr_count); + nm_ip6_config_set_privacy (config, use_tempaddr); + copy = nmtst_ip6_config_clone (config); + copy2 = nmtst_ip6_config_clone (config); + /* initialize the array of indeces, and keep shuffling them for every @repeat iteration. */ for (i = 0; i < addr_count; i++) idx[i] = i; @@ -257,7 +260,7 @@ test_nm_ip6_config_addresses_sort_check (NMIP6Config *config, NMSettingIP6Config } /* reorder them again */ - nm_ip6_config_addresses_sort (copy, use_tempaddr); + nm_ip6_config_addresses_sort (copy); /* check equality using nm_ip6_config_equal() */ if (!nm_ip6_config_equal (copy, config)) {