From 4b270448e4ef73d92289a0ef307cc5cd0e4542db Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Sun, 17 Oct 2021 10:20:25 +0200 Subject: [PATCH] l3cfg: add addr_family parameter to nm_l3cfg_check_ready() We have "ipv[46].may-fail", which are per-address family. This works together with nm_l3cfg_check_ready(), where we check whether an NML3ConfigData is ready. We need to have that check also per-address family. --- src/core/nm-l3cfg.c | 35 ++++++++++++++++++++++++----------- src/core/nm-l3cfg.h | 7 +++++-- 2 files changed, 29 insertions(+), 13 deletions(-) diff --git a/src/core/nm-l3cfg.c b/src/core/nm-l3cfg.c index 19e30cb5c4..05022ee117 100644 --- a/src/core/nm-l3cfg.c +++ b/src/core/nm-l3cfg.c @@ -2767,38 +2767,51 @@ nm_l3cfg_get_acd_addr_info(NML3Cfg *self, in_addr_t addr) /*****************************************************************************/ gboolean -nm_l3cfg_check_ready(NML3Cfg *self, const NML3ConfigData *l3cd, NML3CfgCheckReadyFlags flags) +nm_l3cfg_check_ready(NML3Cfg * self, + const NML3ConfigData * l3cd, + int addr_family, + NML3CfgCheckReadyFlags flags, + gboolean * acd_used) { NMDedupMultiIter iter; const NMPObject *obj; nm_assert(NM_IS_L3CFG(self)); + nm_assert_addr_family_or_unspec(addr_family); + + NM_SET_OUT(acd_used, FALSE); if (!l3cd) return TRUE; - if (NM_FLAGS_HAS(flags, NM_L3CFG_CHECK_READY_FLAGS_IP4_ACD_READY)) { + if (NM_IN_SET(addr_family, AF_UNSPEC, AF_INET) + && NM_FLAGS_HAS(flags, NM_L3CFG_CHECK_READY_FLAGS_IP4_ACD_READY)) { + gboolean pending = FALSE; + nm_l3_config_data_iter_obj_for_each (&iter, l3cd, &obj, NMP_OBJECT_TYPE_IP4_ADDRESS) { const NML3AcdAddrInfo *addr_info; addr_info = nm_l3cfg_get_acd_addr_info(self, NMP_OBJECT_CAST_IP4_ADDRESS(obj)->address); - if (!addr_info) { /* We don't track the this address? That's odd. Not ready. */ - return FALSE; + pending = TRUE; + } else { + if (addr_info->state <= NM_L3_ACD_ADDR_STATE_PROBING) { + /* Still probing. Not ready. */ + pending = TRUE; + } else if (addr_info->state == NM_L3_ACD_ADDR_STATE_USED) { + NM_SET_OUT(acd_used, TRUE); + } } - - if (addr_info->state <= NM_L3_ACD_ADDR_STATE_PROBING) { - /* Still probing. Not ready. */ - return FALSE; - } - /* we only care that we don't have ACD still pending. Otherwise we are ready, * including if we have no addr_info about this address or the address is in use. */ } + if (pending) + return FALSE; } - if (NM_FLAGS_HAS(flags, NM_L3CFG_CHECK_READY_FLAGS_IP6_DAD_READY)) { + if (NM_IN_SET(addr_family, AF_UNSPEC, AF_INET6) + && NM_FLAGS_HAS(flags, NM_L3CFG_CHECK_READY_FLAGS_IP6_DAD_READY)) { nm_l3_config_data_iter_obj_for_each (&iter, l3cd, &obj, NMP_OBJECT_TYPE_IP6_ADDRESS) { ObjStateData *obj_state; diff --git a/src/core/nm-l3cfg.h b/src/core/nm-l3cfg.h index dd1d7d9f9d..19dec11839 100644 --- a/src/core/nm-l3cfg.h +++ b/src/core/nm-l3cfg.h @@ -397,8 +397,11 @@ typedef enum { NM_L3CFG_CHECK_READY_FLAGS_IP6_DAD_READY = (1ull << 1), } NML3CfgCheckReadyFlags; -gboolean -nm_l3cfg_check_ready(NML3Cfg *self, const NML3ConfigData *l3cd, NML3CfgCheckReadyFlags flags); +gboolean nm_l3cfg_check_ready(NML3Cfg * self, + const NML3ConfigData * l3cd, + int addr_family, + NML3CfgCheckReadyFlags flags, + gboolean * acd_used); /*****************************************************************************/