From 786ab294dbe317b66c4103b10bbebc22ff3f4461 Mon Sep 17 00:00:00 2001 From: Beniamino Galvani Date: Thu, 10 Jun 2021 22:45:48 +0200 Subject: [PATCH] libnm-platform: add nm_platform_ip_address_match() Replace nm_platform_ip6_address_match() with a version generic for IPv4 and IPv6. (cherry picked from commit 376c7f83152ebd561ba837695dd24b641ad38021) --- src/core/nm-ip6-config.c | 2 +- src/libnm-platform/nm-platform.c | 30 +++++++++++++++++++++--------- src/libnm-platform/nm-platform.h | 5 +++-- 3 files changed, 25 insertions(+), 12 deletions(-) diff --git a/src/core/nm-ip6-config.c b/src/core/nm-ip6-config.c index 8793c1c27a..61dccf3b0f 100644 --- a/src/core/nm-ip6-config.c +++ b/src/core/nm-ip6-config.c @@ -1644,7 +1644,7 @@ nm_ip6_config_find_first_address(const NMIP6Config *self, NMPlatformMatchFlags m 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)) + if (nm_platform_ip_address_match(AF_INET6, (NMPlatformIPAddress *) addr, match_flag)) return addr; } return NULL; diff --git a/src/libnm-platform/nm-platform.c b/src/libnm-platform/nm-platform.c index 2af6cbb3c9..98c8733653 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,19 +3423,29 @@ 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 { diff --git a/src/libnm-platform/nm-platform.h b/src/libnm-platform/nm-platform.h index 4f76e19b90..096851b160 100644 --- a/src/libnm-platform/nm-platform.h +++ b/src/libnm-platform/nm-platform.h @@ -2380,7 +2380,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__ */