mirror of
https://gitlab.freedesktop.org/NetworkManager/NetworkManager.git
synced 2026-01-18 15:40:30 +01:00
merge: branch 'bg/rh1820770'
https://bugzilla.redhat.com/show_bug.cgi?id=1820770
https://gitlab.freedesktop.org/NetworkManager/NetworkManager/-/merge_requests/889
(cherry picked from commit 5995653312)
This commit is contained in:
commit
2632bb9273
7 changed files with 100 additions and 61 deletions
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -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__ */
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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__ */
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue