summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBeniamino Galvani <bgalvani@redhat.com>2021-06-21 10:11:05 +0200
committerBeniamino Galvani <bgalvani@redhat.com>2021-06-21 10:11:05 +0200
commit599565331256524a1d1bfddfc959db766a19deb8 (patch)
tree7fb0b120cec26494e4f860cf3bf1cd38c5eebe5c
parent89af6be1d6f84c6f09d560a73073c65284d46b87 (diff)
parent3c55db886a6062010450fd67645815e567b03bbf (diff)
merge: branch 'bg/rh1820770'
https://bugzilla.redhat.com/show_bug.cgi?id=1820770 https://gitlab.freedesktop.org/NetworkManager/NetworkManager/-/merge_requests/889
-rw-r--r--src/core/devices/nm-device.c63
-rw-r--r--src/core/nm-ip4-config.c20
-rw-r--r--src/core/nm-ip4-config.h3
-rw-r--r--src/core/nm-ip6-config.c22
-rw-r--r--src/core/nm-ip6-config.h2
-rw-r--r--src/libnm-platform/nm-platform.c33
-rw-r--r--src/libnm-platform/nm-platform.h18
7 files changed, 100 insertions, 61 deletions
diff --git a/src/core/devices/nm-device.c b/src/core/devices/nm-device.c
index 19a46b5f52..269418df40 100644
--- a/src/core/devices/nm-device.c
+++ b/src/core/devices/nm-device.c
@@ -9893,9 +9893,9 @@ dhcp6_start_with_link_ready(NMDevice *self, NMConnection *connection)
nm_assert(s_con);
if (priv->ext_ip6_config_captured) {
- ll_addr = nm_ip6_config_find_first_address(priv->ext_ip6_config_captured,
- NM_PLATFORM_MATCH_WITH_ADDRTYPE_LINKLOCAL
- | NM_PLATFORM_MATCH_WITH_ADDRSTATE_NORMAL);
+ ll_addr = nm_ip_config_find_first_address(NM_IP_CONFIG(priv->ext_ip6_config_captured),
+ NM_PLATFORM_MATCH_WITH_ADDRTYPE_LINKLOCAL
+ | NM_PLATFORM_MATCH_WITH_ADDRSTATE_NORMAL);
}
if (!ll_addr) {
@@ -10134,9 +10134,9 @@ linklocal6_check_complete(NMDevice *self)
}
if (!priv->ext_ip6_config_captured
- || !nm_ip6_config_find_first_address(priv->ext_ip6_config_captured,
- NM_PLATFORM_MATCH_WITH_ADDRTYPE_LINKLOCAL
- | NM_PLATFORM_MATCH_WITH_ADDRSTATE_NORMAL)) {
+ || !nm_ip_config_find_first_address(NM_IP_CONFIG(priv->ext_ip6_config_captured),
+ NM_PLATFORM_MATCH_WITH_ADDRTYPE_LINKLOCAL
+ | NM_PLATFORM_MATCH_WITH_ADDRSTATE_NORMAL)) {
/* we don't have a non-tentative link local address yet. Wait longer. */
return;
}
@@ -10182,10 +10182,10 @@ check_and_add_ipv6ll_addr(NMDevice *self)
return;
if (priv->ext_ip6_config_captured
- && nm_ip6_config_find_first_address(priv->ext_ip6_config_captured,
- NM_PLATFORM_MATCH_WITH_ADDRTYPE_LINKLOCAL
- | NM_PLATFORM_MATCH_WITH_ADDRSTATE_NORMAL
- | NM_PLATFORM_MATCH_WITH_ADDRSTATE_TENTATIVE)) {
+ && nm_ip_config_find_first_address(NM_IP_CONFIG(priv->ext_ip6_config_captured),
+ NM_PLATFORM_MATCH_WITH_ADDRTYPE_LINKLOCAL
+ | NM_PLATFORM_MATCH_WITH_ADDRSTATE_NORMAL
+ | NM_PLATFORM_MATCH_WITH_ADDRSTATE_TENTATIVE)) {
/* Already have an LL address, nothing to do */
return;
}
@@ -10255,9 +10255,9 @@ linklocal6_start(NMDevice *self)
nm_clear_g_source(&priv->linklocal6_timeout_id);
if (priv->ext_ip6_config_captured
- && nm_ip6_config_find_first_address(priv->ext_ip6_config_captured,
- NM_PLATFORM_MATCH_WITH_ADDRTYPE_LINKLOCAL
- | NM_PLATFORM_MATCH_WITH_ADDRSTATE_NORMAL))
+ && nm_ip_config_find_first_address(NM_IP_CONFIG(priv->ext_ip6_config_captured),
+ NM_PLATFORM_MATCH_WITH_ADDRTYPE_LINKLOCAL
+ | NM_PLATFORM_MATCH_WITH_ADDRSTATE_NORMAL))
return TRUE;
_LOGD(LOGD_DEVICE,
@@ -10836,9 +10836,9 @@ ndisc_ra_timeout(NMNDisc *ndisc, NMDevice *self)
* addresses we find inside priv->ip_config_6.
*/
if (priv->ip_config_6
- && nm_ip6_config_find_first_address(priv->ip_config_6,
- NM_PLATFORM_MATCH_WITH_ADDRTYPE_NORMAL
- | NM_PLATFORM_MATCH_WITH_ADDRSTATE__ANY))
+ && nm_ip_config_find_first_address(NM_IP_CONFIG(priv->ip_config_6),
+ NM_PLATFORM_MATCH_WITH_ADDRTYPE_NORMAL
+ | NM_PLATFORM_MATCH_WITH_ADDRSTATE__ANY))
nm_device_activate_schedule_ip_config_result(self, AF_INET6, NULL);
else
nm_device_activate_schedule_ip_config_timeout(self, AF_INET6);
@@ -17799,13 +17799,36 @@ nm_device_get_hostname_from_dns_lookup(NMDevice *self, int addr_family, gboolean
priv->hostname_resolver_x[IS_IPv4] = resolver;
}
- /* Determine the first address of the interface and
- * whether it changed from the previous lookup */
+ /* Determine the most suitable address of the interface
+ * and whether it changed from the previous lookup */
ip_config = priv->ip_config_x[IS_IPv4];
if (ip_config) {
- const NMPlatformIPAddress *addr;
+ const NMPlatformIPAddress *addr = NULL;
+
+ if (IS_IPv4) {
+ addr = nm_ip_config_get_first_address(ip_config);
+ } else {
+ /* For IPv6 prefer, in order:
+ * - !link-local, !deprecated
+ * - !link-local, deprecated
+ * - link-local
+ */
+ addr = nm_ip_config_find_first_address(ip_config,
+ NM_PLATFORM_MATCH_WITH_ADDRTYPE_NORMAL
+ | NM_PLATFORM_MATCH_WITH_ADDRSTATE_NORMAL);
+ if (!addr) {
+ addr = nm_ip_config_find_first_address(
+ ip_config,
+ NM_PLATFORM_MATCH_WITH_ADDRTYPE_NORMAL
+ | NM_PLATFORM_MATCH_WITH_ADDRSTATE_DEPRECATED);
+ }
+ if (!addr) {
+ addr = nm_ip_config_find_first_address(ip_config,
+ NM_PLATFORM_MATCH_WITH_ADDRTYPE_LINKLOCAL
+ | NM_PLATFORM_MATCH_WITH_ADDRSTATE__ANY);
+ }
+ }
- addr = nm_ip_config_get_first_address(ip_config);
if (addr) {
new_address = g_inet_address_new_from_bytes(addr->address_ptr,
IS_IPv4 ? G_SOCKET_FAMILY_IPV4
diff --git a/src/core/nm-ip4-config.c b/src/core/nm-ip4-config.c
index 171ed4bae1..47f0ee3a80 100644
--- a/src/core/nm-ip4-config.c
+++ b/src/core/nm-ip4-config.c
@@ -1977,6 +1977,26 @@ nm_ip_config_dump(const NMIPConfig *self, const char *detail, NMLogLevel level,
/*****************************************************************************/
+gconstpointer
+nm_ip_config_find_first_address(const NMIPConfig *self, NMPlatformMatchFlags match_flag)
+{
+ NMDedupMultiIter iter;
+ const NMPlatformIPAddress *address;
+
+ g_return_val_if_fail(NM_IS_IP_CONFIG(self), NULL);
+
+ nm_assert(!NM_FLAGS_ANY(
+ match_flag,
+ ~(NM_PLATFORM_MATCH_WITH_ADDRTYPE__ANY | NM_PLATFORM_MATCH_WITH_ADDRSTATE__ANY)));
+
+ nm_ip_config_iter_ip_address_for_each (&iter, self, &address) {
+ if (nm_platform_ip_address_match(nm_ip_config_get_addr_family(self), address, match_flag))
+ return address;
+ }
+
+ return NULL;
+}
+
void
nm_ip4_config_reset_addresses(NMIP4Config *self)
{
diff --git a/src/core/nm-ip4-config.h b/src/core/nm-ip4-config.h
index 7032a2385e..fdaa6d4673 100644
--- a/src/core/nm-ip4-config.h
+++ b/src/core/nm-ip4-config.h
@@ -664,4 +664,7 @@ nm_ip_config_intersect_alloc(const NMIPConfig *a,
}
}
+gconstpointer nm_ip_config_find_first_address(const NMIPConfig * self,
+ NMPlatformMatchFlags match_flag);
+
#endif /* __NETWORKMANAGER_IP4_CONFIG_H__ */
diff --git a/src/core/nm-ip6-config.c b/src/core/nm-ip6-config.c
index 8793c1c27a..d2ecf1759b 100644
--- a/src/core/nm-ip6-config.c
+++ b/src/core/nm-ip6-config.c
@@ -1628,28 +1628,6 @@ nm_ip6_config_lookup_address(const NMIP6Config *self, const struct in6_addr *add
return entry ? NMP_OBJECT_CAST_IP6_ADDRESS(entry->obj) : NULL;
}
-const NMPlatformIP6Address *
-nm_ip6_config_find_first_address(const NMIP6Config *self, NMPlatformMatchFlags match_flag)
-{
- const NMPlatformIP6Address *addr;
- NMDedupMultiIter iter;
-
- g_return_val_if_fail(NM_IS_IP6_CONFIG(self), NULL);
-
- nm_assert(!NM_FLAGS_ANY(
- match_flag,
- ~(NM_PLATFORM_MATCH_WITH_ADDRTYPE__ANY | NM_PLATFORM_MATCH_WITH_ADDRSTATE__ANY)));
-
- nm_assert(NM_FLAGS_ANY(match_flag, NM_PLATFORM_MATCH_WITH_ADDRTYPE__ANY));
- nm_assert(NM_FLAGS_ANY(match_flag, NM_PLATFORM_MATCH_WITH_ADDRSTATE__ANY));
-
- nm_ip_config_iter_ip6_address_for_each (&iter, self, &addr) {
- if (nm_platform_ip6_address_match(addr, match_flag))
- return addr;
- }
- return NULL;
-}
-
/**
* nm_ip6_config_has_dad_pending_addresses
* @self: configuration containing the addresses to check
diff --git a/src/core/nm-ip6-config.h b/src/core/nm-ip6-config.h
index 4aa0ee4e58..8694ab0c0f 100644
--- a/src/core/nm-ip6-config.h
+++ b/src/core/nm-ip6-config.h
@@ -125,8 +125,6 @@ void _nmtst_ip6_config_del_address(NMIP6Config *self, guint i);
guint nm_ip6_config_get_num_addresses(const NMIP6Config *self);
const NMPlatformIP6Address *nm_ip6_config_get_first_address(const NMIP6Config *self);
const NMPlatformIP6Address *_nmtst_ip6_config_get_address(const NMIP6Config *self, guint i);
-const NMPlatformIP6Address *nm_ip6_config_find_first_address(const NMIP6Config * self,
- NMPlatformMatchFlags match_flag);
gboolean nm_ip6_config_address_exists(const NMIP6Config *self, const NMPlatformIP6Address *address);
const NMPlatformIP6Address *nm_ip6_config_lookup_address(const NMIP6Config * self,
const struct in6_addr *addr);
diff --git a/src/libnm-platform/nm-platform.c b/src/libnm-platform/nm-platform.c
index 2af6cbb3c9..089d0d42c1 100644
--- a/src/libnm-platform/nm-platform.c
+++ b/src/libnm-platform/nm-platform.c
@@ -3413,7 +3413,9 @@ nm_platform_ip6_address_get_peer(const NMPlatformIP6Address *addr)
}
gboolean
-nm_platform_ip6_address_match(const NMPlatformIP6Address *addr, NMPlatformMatchFlags match_flag)
+nm_platform_ip_address_match(int addr_family,
+ const NMPlatformIPAddress *address,
+ NMPlatformMatchFlags match_flag)
{
nm_assert(!NM_FLAGS_ANY(
match_flag,
@@ -3421,21 +3423,34 @@ nm_platform_ip6_address_match(const NMPlatformIP6Address *addr, NMPlatformMatchF
nm_assert(NM_FLAGS_ANY(match_flag, NM_PLATFORM_MATCH_WITH_ADDRTYPE__ANY));
nm_assert(NM_FLAGS_ANY(match_flag, NM_PLATFORM_MATCH_WITH_ADDRSTATE__ANY));
- if (IN6_IS_ADDR_LINKLOCAL(&addr->address)) {
- if (!NM_FLAGS_HAS(match_flag, NM_PLATFORM_MATCH_WITH_ADDRTYPE_LINKLOCAL))
- return FALSE;
+ if (addr_family == AF_INET) {
+ if (nm_utils_ip4_address_is_link_local(((NMPlatformIP4Address *) address)->address)) {
+ if (!NM_FLAGS_HAS(match_flag, NM_PLATFORM_MATCH_WITH_ADDRTYPE_LINKLOCAL))
+ return FALSE;
+ } else {
+ if (!NM_FLAGS_HAS(match_flag, NM_PLATFORM_MATCH_WITH_ADDRTYPE_NORMAL))
+ return FALSE;
+ }
} else {
- if (!NM_FLAGS_HAS(match_flag, NM_PLATFORM_MATCH_WITH_ADDRTYPE_NORMAL))
- return FALSE;
+ if (IN6_IS_ADDR_LINKLOCAL(address->address_ptr)) {
+ if (!NM_FLAGS_HAS(match_flag, NM_PLATFORM_MATCH_WITH_ADDRTYPE_LINKLOCAL))
+ return FALSE;
+ } else {
+ if (!NM_FLAGS_HAS(match_flag, NM_PLATFORM_MATCH_WITH_ADDRTYPE_NORMAL))
+ return FALSE;
+ }
}
- if (NM_FLAGS_HAS(addr->n_ifa_flags, IFA_F_DADFAILED)) {
+ if (NM_FLAGS_HAS(address->n_ifa_flags, IFA_F_DADFAILED)) {
if (!NM_FLAGS_HAS(match_flag, NM_PLATFORM_MATCH_WITH_ADDRSTATE_DADFAILED))
return FALSE;
- } else if (NM_FLAGS_HAS(addr->n_ifa_flags, IFA_F_TENTATIVE)
- && !NM_FLAGS_HAS(addr->n_ifa_flags, IFA_F_OPTIMISTIC)) {
+ } else if (NM_FLAGS_HAS(address->n_ifa_flags, IFA_F_TENTATIVE)
+ && !NM_FLAGS_HAS(address->n_ifa_flags, IFA_F_OPTIMISTIC)) {
if (!NM_FLAGS_HAS(match_flag, NM_PLATFORM_MATCH_WITH_ADDRSTATE_TENTATIVE))
return FALSE;
+ } else if (NM_FLAGS_HAS(address->n_ifa_flags, IFA_F_DEPRECATED)) {
+ if (!NM_FLAGS_HAS(match_flag, NM_PLATFORM_MATCH_WITH_ADDRSTATE_DEPRECATED))
+ return FALSE;
} else {
if (!NM_FLAGS_HAS(match_flag, NM_PLATFORM_MATCH_WITH_ADDRSTATE_NORMAL))
return FALSE;
diff --git a/src/libnm-platform/nm-platform.h b/src/libnm-platform/nm-platform.h
index 4f76e19b90..e627917698 100644
--- a/src/libnm-platform/nm-platform.h
+++ b/src/libnm-platform/nm-platform.h
@@ -176,12 +176,13 @@ typedef enum {
NM_PLATFORM_MATCH_WITH_ADDRTYPE__ANY =
NM_PLATFORM_MATCH_WITH_ADDRTYPE_NORMAL | NM_PLATFORM_MATCH_WITH_ADDRTYPE_LINKLOCAL,
- NM_PLATFORM_MATCH_WITH_ADDRSTATE_NORMAL = (1LL << 2),
- NM_PLATFORM_MATCH_WITH_ADDRSTATE_TENTATIVE = (1LL << 3),
- NM_PLATFORM_MATCH_WITH_ADDRSTATE_DADFAILED = (1LL << 4),
- NM_PLATFORM_MATCH_WITH_ADDRSTATE__ANY = NM_PLATFORM_MATCH_WITH_ADDRSTATE_NORMAL
- | NM_PLATFORM_MATCH_WITH_ADDRSTATE_TENTATIVE
- | NM_PLATFORM_MATCH_WITH_ADDRSTATE_DADFAILED,
+ NM_PLATFORM_MATCH_WITH_ADDRSTATE_NORMAL = (1LL << 2),
+ NM_PLATFORM_MATCH_WITH_ADDRSTATE_TENTATIVE = (1LL << 3),
+ NM_PLATFORM_MATCH_WITH_ADDRSTATE_DADFAILED = (1LL << 4),
+ NM_PLATFORM_MATCH_WITH_ADDRSTATE_DEPRECATED = (1LL << 5),
+ NM_PLATFORM_MATCH_WITH_ADDRSTATE__ANY =
+ NM_PLATFORM_MATCH_WITH_ADDRSTATE_NORMAL | NM_PLATFORM_MATCH_WITH_ADDRSTATE_TENTATIVE
+ | NM_PLATFORM_MATCH_WITH_ADDRSTATE_DADFAILED | NM_PLATFORM_MATCH_WITH_ADDRSTATE_DEPRECATED,
} NMPlatformMatchFlags;
#define NM_PLATFORM_LINK_OTHER_NETNS (-1)
@@ -2380,7 +2381,8 @@ struct _NMDedupMultiIndex *nm_platform_get_multi_idx(NMPlatform *self);
/*****************************************************************************/
-gboolean nm_platform_ip6_address_match(const NMPlatformIP6Address *addr,
- NMPlatformMatchFlags match_flag);
+gboolean nm_platform_ip_address_match(int addr_family,
+ const NMPlatformIPAddress *addr,
+ NMPlatformMatchFlags match_flag);
#endif /* __NETWORKMANAGER_PLATFORM_H__ */