about summary refs log tree commit diff
path: root/src/core
diff options
context:
space:
mode:
authorMichael Biebl <biebl@debian.org>2022-02-19 17:19:17 +0100
committerMichael Biebl <biebl@debian.org>2022-02-19 17:19:17 +0100
commite3f2ee969d065d2971170563c8aef77d5a0d39b9 (patch)
tree94454d4e2fe0955c09516f18dc4e84a6cf7139fa /src/core
parent2f94dba7385fd0e0ef19a06eb4a2fcf6c43d7946 (diff)
New upstream version 1.35.92 upstream/1.35.92
Diffstat (limited to 'src/core')
-rw-r--r--src/core/devices/nm-device.c29
-rw-r--r--src/core/nm-l3cfg.c17
-rw-r--r--src/core/nm-l3cfg.h2
-rw-r--r--src/core/nm-policy.c6
-rw-r--r--src/core/ppp/nm-ppp-manager.c2
5 files changed, 47 insertions, 9 deletions
diff --git a/src/core/devices/nm-device.c b/src/core/devices/nm-device.c
index 696c0df8..aed580ab 100644
--- a/src/core/devices/nm-device.c
+++ b/src/core/devices/nm-device.c
@@ -3057,6 +3057,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;
@@ -3188,6 +3189,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)
@@ -3215,7 +3220,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),
@@ -3223,6 +3228,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" : "",
@@ -3932,6 +3938,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);
@@ -9821,6 +9830,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);
         }
@@ -10455,14 +10472,14 @@ nm_device_copy_ip6_dns_config(NMDevice *self, NMDevice *from_device)
         l3cd_src = priv_src->l3cds[L3_CONFIG_DATA_TYPE_AC_6].d;
     }
     if (l3cd_src) {
-        const char *const            *strvarr;
-        const struct in6_addr *const *addrs;
-        guint                         n;
-        guint                         i;
+        const char *const     *strvarr;
+        const struct in6_addr *addrs;
+        guint                  n;
+        guint                  i;
 
         addrs = nm_l3_config_data_get_nameservers(l3cd_src, AF_INET6, &n);
         for (i = 0; i < n; i++)
-            nm_l3_config_data_add_nameserver(l3cd, AF_INET6, addrs[i]);
+            nm_l3_config_data_add_nameserver(l3cd, AF_INET6, &addrs[i]);
 
         strvarr = nm_l3_config_data_get_searches(l3cd_src, AF_INET6, &n);
         for (i = 0; i < n; i++)
diff --git a/src/core/nm-l3cfg.c b/src/core/nm-l3cfg.c
index 9258decf..7d00264b 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 7dc9facc..0ea68646 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);
diff --git a/src/core/nm-policy.c b/src/core/nm-policy.c
index cb5b543e..d77fc0a0 100644
--- a/src/core/nm-policy.c
+++ b/src/core/nm-policy.c
@@ -2005,7 +2005,8 @@ device_state_changed(NMDevice           *device,
                                          AF_UNSPEC,
                                          device,
                                          nm_device_get_l3cd(device, TRUE),
-                                         NM_DNS_IP_CONFIG_TYPE_DEFAULT,
+                                         nm_device_is_vpn(device) ? NM_DNS_IP_CONFIG_TYPE_VPN
+                                                                  : NM_DNS_IP_CONFIG_TYPE_DEFAULT,
                                          TRUE);
         }
         update_ip_dns(self, AF_INET, device);
@@ -2147,7 +2148,8 @@ device_l3cd_changed(NMDevice             *device,
                                      AF_UNSPEC,
                                      device,
                                      l3cd_new,
-                                     NM_DNS_IP_CONFIG_TYPE_DEFAULT,
+                                     nm_device_is_vpn(device) ? NM_DNS_IP_CONFIG_TYPE_VPN
+                                                              : NM_DNS_IP_CONFIG_TYPE_DEFAULT,
                                      TRUE);
         update_ip_dns(self, AF_INET, device);
         update_ip_dns(self, AF_INET6, device);
diff --git a/src/core/ppp/nm-ppp-manager.c b/src/core/ppp/nm-ppp-manager.c
index f1f10305..dd6b1bc7 100644
--- a/src/core/ppp/nm-ppp-manager.c
+++ b/src/core/ppp/nm-ppp-manager.c
@@ -1246,7 +1246,7 @@ _ppp_manager_stop(NMPPPManager            *self,
                               SIGTERM,
                               LOGD_PPP,
                               "pppd",
-                              NM_SHUTDOWN_TIMEOUT_MS,
+                              5000,
                               _stop_child_cb,
                               handle);