summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBeniamino Galvani <bgalvani@redhat.com>2022-02-16 15:14:18 +0100
committerBeniamino Galvani <bgalvani@redhat.com>2022-02-16 15:14:18 +0100
commit8fc9f818b875772e0352d1da8e45061f6d837513 (patch)
treeb5256ad95799069bab43e1b7b45aa23d29dc9909
parent365d0e49bc4feb7a5532c8a0bc37121e7e0aac2e (diff)
parentf15b3f15a7c8401f60df16a6327c53d345aff0fa (diff)
downloadNetworkManager-8fc9f818b875772e0352d1da8e45061f6d837513.tar.gz
merge: branch 'bg/ipv6-route-src'
https://gitlab.freedesktop.org/NetworkManager/NetworkManager/-/merge_requests/1097
-rw-r--r--src/core/devices/nm-device.c19
-rw-r--r--src/core/nm-l3cfg.c17
-rw-r--r--src/core/nm-l3cfg.h2
3 files changed, 37 insertions, 1 deletions
diff --git a/src/core/devices/nm-device.c b/src/core/devices/nm-device.c
index 0fe058b197..bebfc4c3ab 100644
--- a/src/core/devices/nm-device.c
+++ b/src/core/devices/nm-device.c
@@ -3055,6 +3055,7 @@ _dev_ip_state_check(NMDevice *self, int addr_family)
gboolean s_is_started = FALSE;
gboolean s_is_failed = FALSE;
gboolean s_is_pending = FALSE;
+ gboolean has_tna = FALSE;
gboolean v_bool;
NMDeviceIPState ip_state;
NMDeviceIPState ip_state_other;
@@ -3186,6 +3187,10 @@ _dev_ip_state_check(NMDevice *self, int addr_family)
&s_is_pending,
&s_is_failed);
+ has_tna = priv->l3cfg && nm_l3cfg_has_temp_not_available_obj(priv->l3cfg, addr_family);
+ if (has_tna)
+ s_is_pending = TRUE;
+
if (s_is_failed)
ip_state = NM_DEVICE_IP_STATE_FAILED;
else if (s_is_pending)
@@ -3213,7 +3218,7 @@ got_ip_state:
nm_assert(!priv->ip_data_4.is_ignore);
_LOGT_ip(addr_family,
- "check-state: state %s => %s, is_failed=%d, is_pending=%d, is_started=%d, "
+ "check-state: state %s => %s, is_failed=%d, is_pending=%d, is_started=%d temp_na=%d, "
"may-fail-4=%d, may-fail-6=%d;"
"%s;%s%s%s%s%s%s;%s%s%s%s%s%s%s%s",
nm_device_ip_state_to_string(priv->ip_data_x[IS_IPv4].state),
@@ -3221,6 +3226,7 @@ got_ip_state:
s_is_failed,
s_is_pending,
s_is_started,
+ has_tna,
_prop_get_ipvx_may_fail_cached(self, AF_INET, IS_IPv4 ? &may_fail : &may_fail_other),
_prop_get_ipvx_may_fail_cached(self, AF_INET6, !IS_IPv4 ? &may_fail : &may_fail_other),
priv->ip_data_4.is_disabled ? " disabled4" : "",
@@ -3930,6 +3936,9 @@ _dev_l3_cfg_notify_cb(NML3Cfg *l3cfg, const NML3ConfigNotifyData *notify_data, N
AF_INET6,
NM_L3CFG_CHECK_READY_FLAGS_IP6_DAD_READY,
NULL)) {
+ if (nm_l3cfg_has_temp_not_available_obj(priv->l3cfg, AF_INET6))
+ _dev_l3_cfg_commit(self, FALSE);
+
nm_clear_l3cd(&priv->ipac6_data.l3cd);
_dev_ipac6_set_state(self, NM_DEVICE_IP_STATE_READY);
_dev_ip_state_check_async(self, AF_INET6);
@@ -9824,6 +9833,14 @@ _dev_ipmanual_check_ready(NMDevice *self)
_dev_ipmanual_set_state(self, addr_family, NM_DEVICE_IP_STATE_FAILED);
_dev_ip_state_check_async(self, AF_UNSPEC);
} else if (ready) {
+ if (priv->ipmanual_data.state_x[IS_IPv4] != NM_DEVICE_IP_STATE_READY
+ && nm_l3cfg_has_temp_not_available_obj(priv->l3cfg, addr_family)) {
+ /* Addresses with pending ACD/DAD are a possible cause for the
+ * presence of temporarily-not-available objects. Once all addresses
+ * are ready, retry to commit those unavailable objects. */
+ _dev_l3_cfg_commit(self, FALSE);
+ }
+
_dev_ipmanual_set_state(self, addr_family, NM_DEVICE_IP_STATE_READY);
_dev_ip_state_check_async(self, AF_UNSPEC);
}
diff --git a/src/core/nm-l3cfg.c b/src/core/nm-l3cfg.c
index 9258decf07..7d00264b01 100644
--- a/src/core/nm-l3cfg.c
+++ b/src/core/nm-l3cfg.c
@@ -2948,6 +2948,23 @@ nm_l3cfg_get_acd_addr_info(NML3Cfg *self, in_addr_t addr)
/*****************************************************************************/
gboolean
+nm_l3cfg_has_temp_not_available_obj(NML3Cfg *self, int addr_family)
+{
+ ObjStateData *obj_state;
+
+ nm_assert(NM_IS_L3CFG(self));
+ nm_assert_addr_family(addr_family);
+
+ c_list_for_each_entry (obj_state,
+ &self->priv.p->obj_state_temporary_not_available_lst_head,
+ os_temporary_not_available_lst) {
+ if (NMP_OBJECT_GET_ADDR_FAMILY(obj_state->obj) == addr_family)
+ return TRUE;
+ }
+ return FALSE;
+}
+
+gboolean
nm_l3cfg_check_ready(NML3Cfg *self,
const NML3ConfigData *l3cd,
int addr_family,
diff --git a/src/core/nm-l3cfg.h b/src/core/nm-l3cfg.h
index 7dc9faccfe..0ea6864661 100644
--- a/src/core/nm-l3cfg.h
+++ b/src/core/nm-l3cfg.h
@@ -410,6 +410,8 @@ gboolean nm_l3cfg_check_ready(NML3Cfg *self,
NML3CfgCheckReadyFlags flags,
gboolean *acd_used);
+gboolean nm_l3cfg_has_temp_not_available_obj(NML3Cfg *self, int addr_family);
+
/*****************************************************************************/
NML3CfgCommitType nm_l3cfg_commit_type_get(NML3Cfg *self);