From bb042ac65ae0dd3e8458bf5bcf19e854b047e22e Mon Sep 17 00:00:00 2001 From: Beniamino Galvani Date: Wed, 30 May 2018 11:37:09 +0200 Subject: platform: sort known IPv6 addresses by scope before a sync https://bugzilla.redhat.com/show_bug.cgi?id=1578668 --- src/platform/nm-platform.c | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/src/platform/nm-platform.c b/src/platform/nm-platform.c index 727e064bd5..e3d194c022 100644 --- a/src/platform/nm-platform.c +++ b/src/platform/nm-platform.c @@ -3595,6 +3595,25 @@ delete_and_next2: return TRUE; } +static guint +ip6_address_scope_priority (struct in6_addr *addr) +{ + if (IN6_IS_ADDR_LINKLOCAL (addr)) + return 1; + if (IN6_IS_ADDR_SITELOCAL (addr)) + return 2; + return 3; +} + +static gint +ip6_address_scope_cmp (gconstpointer a, gconstpointer b) +{ + NMPlatformIP6Address *x = NMP_OBJECT_CAST_IP6_ADDRESS (*(void **) a); + NMPlatformIP6Address *y = NMP_OBJECT_CAST_IP6_ADDRESS (*(void **) b); + + return ip6_address_scope_priority (&x->address) - ip6_address_scope_priority (&y->address); +} + /** * nm_platform_ip6_address_sync: * @self: platform instance @@ -3628,6 +3647,14 @@ nm_platform_ip6_address_sync (NMPlatform *self, NMPLookup lookup; guint32 ifa_flags; + /* The order we want to enforce is only among addresses with the same + * scope, as the kernel keeps addresses sorted by scope. Therefore, + * apply the same sorting to known addresses, so that we don't try to + * unnecessary change the order of addresses with different scopes. + */ + if (known_addresses) + g_ptr_array_sort (known_addresses, ip6_address_scope_cmp); + if (!_addr_array_clean_expired (AF_INET6, ifindex, known_addresses, now, &known_addresses_idx)) known_addresses = NULL; -- cgit v1.2.1