diff options
author | Beniamino Galvani <bgalvani@redhat.com> | 2018-05-30 11:37:09 +0200 |
---|---|---|
committer | Beniamino Galvani <bgalvani@redhat.com> | 2018-05-30 11:37:09 +0200 |
commit | bb042ac65ae0dd3e8458bf5bcf19e854b047e22e (patch) | |
tree | 96b6952de3375e9e4cbad5cbb381d3596ac235ad | |
parent | 84a6eff106732f9754896c53599f907f811aed8e (diff) | |
download | NetworkManager-bg/rh1578668.tar.gz |
platform: sort known IPv6 addresses by scope before a syncbg/rh1578668
https://bugzilla.redhat.com/show_bug.cgi?id=1578668
-rw-r--r-- | src/platform/nm-platform.c | 27 |
1 files changed, 27 insertions, 0 deletions
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; |