From 59aa2a26b4a712131b38e155d3c1d70a74183636 Mon Sep 17 00:00:00 2001 From: Beniamino Galvani Date: Tue, 13 Jun 2017 14:44:22 +0200 Subject: [PATCH] core: sort addresses in captured IPv4 configuration When IPv4 addresses are synchronized to platform, the order of IPv4 addresses matters because the first address is considered the primary one. Thus, nm_ip4_config_capture() should put the primary address as first, otherwise during synchronization addresses will be removed and added back with a different primary/secondary role. https://bugzilla.redhat.com/show_bug.cgi?id=1459813 (cherry picked from commit b6fa87a4c07c968614d123750be47a74de62f04d) (cherry picked from commit 9819ffe7d42f08bb082ae2d9e125a7dd3bfe6420) --- src/nm-ip4-config.c | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/src/nm-ip4-config.c b/src/nm-ip4-config.c index 20532e8..ae6af9c 100644 --- a/src/nm-ip4-config.c +++ b/src/nm-ip4-config.c @@ -248,6 +248,16 @@ notify_addresses (NMIP4Config *self) _notify (self, PROP_ADDRESSES); } +static gint +sort_captured_addresses (gconstpointer a, gconstpointer b) +{ + const NMPlatformIP4Address *addr_a = a, *addr_b = b; + + /* Primary addresses first */ + return NM_FLAGS_HAS (addr_a->n_ifa_flags, IFA_F_SECONDARY) - + NM_FLAGS_HAS (addr_b->n_ifa_flags, IFA_F_SECONDARY); +} + NMIP4Config * nm_ip4_config_capture (NMPlatform *platform, int ifindex, gboolean capture_resolv_conf) { @@ -269,6 +279,8 @@ nm_ip4_config_capture (NMPlatform *platform, int ifindex, gboolean capture_resol g_array_unref (priv->routes); priv->addresses = nm_platform_ip4_address_get_all (platform, ifindex); + g_array_sort (priv->addresses, sort_captured_addresses); + priv->routes = nm_platform_ip4_route_get_all (platform, ifindex, NM_PLATFORM_GET_ROUTE_FLAGS_WITH_DEFAULT | NM_PLATFORM_GET_ROUTE_FLAGS_WITH_NON_DEFAULT); /* Extract gateway from default route */ -- 2.9.3