summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBeniamino Galvani <bgalvani@redhat.com>2018-05-30 11:37:09 +0200
committerBeniamino Galvani <bgalvani@redhat.com>2018-05-30 11:37:09 +0200
commitbb042ac65ae0dd3e8458bf5bcf19e854b047e22e (patch)
tree96b6952de3375e9e4cbad5cbb381d3596ac235ad
parent84a6eff106732f9754896c53599f907f811aed8e (diff)
downloadNetworkManager-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.c27
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;