summaryrefslogtreecommitdiff
path: root/src/nm-ip6-config.c
diff options
context:
space:
mode:
authorThomas Haller <thaller@redhat.com>2018-03-09 16:08:52 +0100
committerThomas Haller <thaller@redhat.com>2018-03-20 15:24:38 +0100
commit945339cba53ab25fdd3eaded56eec35312f94867 (patch)
tree4b26f2b880aad39696d6ef0b5270e755d31c1a19 /src/nm-ip6-config.c
parentfe02bb4f2a0903d3ecc48be303b8578805c41972 (diff)
downloadNetworkManager-945339cba53ab25fdd3eaded56eec35312f94867.tar.gz
core: add nm_ip6_config_find_first_address() function and refactor lookup of code
Instead have one particular nm_ip6_config_get_address_first_nontentative() function, make it more extendable. Now, we pass a match-type argument, which can control which element to search. This patch has no change in behavior, but it already makes clear, that nm_ip6_config_get_address_first_nontentative() was buggy, because it would also return addresses that failed DAD.
Diffstat (limited to 'src/nm-ip6-config.c')
-rw-r--r--src/nm-ip6-config.c34
1 files changed, 29 insertions, 5 deletions
diff --git a/src/nm-ip6-config.c b/src/nm-ip6-config.c
index 883e8e00fa..5700f5e64e 100644
--- a/src/nm-ip6-config.c
+++ b/src/nm-ip6-config.c
@@ -1691,19 +1691,43 @@ nm_ip6_config_lookup_address (const NMIP6Config *self,
}
const NMPlatformIP6Address *
-nm_ip6_config_get_address_first_nontentative (const NMIP6Config *self, gboolean linklocal)
+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);
- linklocal = !!linklocal;
+ 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 ( ((!!IN6_IS_ADDR_LINKLOCAL (&addr->address)) == linklocal)
- && !(addr->n_ifa_flags & IFA_F_TENTATIVE))
- return addr;
+
+ if (IN6_IS_ADDR_LINKLOCAL (&addr->address)) {
+ if (!NM_FLAGS_HAS (match_flag, NM_PLATFORM_MATCH_WITH_ADDRTYPE_LINKLOCAL))
+ continue;
+ } else {
+ if (!NM_FLAGS_HAS (match_flag, NM_PLATFORM_MATCH_WITH_ADDRTYPE_NORMAL))
+ continue;
+ }
+
+ if (NM_FLAGS_HAS (addr->n_ifa_flags, IFA_F_DADFAILED)) {
+ if (!NM_FLAGS_HAS (match_flag, NM_PLATFORM_MATCH_WITH_ADDRSTATE_DADFAILED))
+ continue;
+ } else if ( NM_FLAGS_HAS (addr->n_ifa_flags, IFA_F_TENTATIVE)
+ && !NM_FLAGS_HAS (addr->n_ifa_flags, IFA_F_OPTIMISTIC)) {
+ if (!NM_FLAGS_HAS (match_flag, NM_PLATFORM_MATCH_WITH_ADDRSTATE_TENTATIVE))
+ continue;
+ } else {
+ if (!NM_FLAGS_HAS (match_flag, NM_PLATFORM_MATCH_WITH_ADDRSTATE_NORMAL))
+ continue;
+ }
+
+ return addr;
}
return NULL;