mirror of
https://gitlab.freedesktop.org/NetworkManager/NetworkManager.git
synced 2025-12-25 10:40:08 +01:00
device: fix behavior for assumed DHCP connections
When a DHCP connection is active and the DHCP server is temporarily unreachable, we restart DHCP for some times before failing the connection. From the user point of view, restarting NM (and thus assuming the existing connection) should not change this behavior. However, if NM is restarted while the server is temporarily down, at the moment we immediately fail because we consider the DHCP transaction our first try. Fix this by restoring the multiple tries when we detect that DHCP was active before because the connection is assumed.
This commit is contained in:
parent
2524a6f852
commit
e3113fdc4b
1 changed files with 14 additions and 22 deletions
|
|
@ -355,6 +355,7 @@ typedef struct _NMDevicePrivate {
|
|||
guint restart_id;
|
||||
guint num_tries_left;
|
||||
char * pac_url;
|
||||
bool was_active;
|
||||
} dhcp4;
|
||||
|
||||
struct {
|
||||
|
|
@ -424,6 +425,7 @@ typedef struct _NMDevicePrivate {
|
|||
guint restart_id;
|
||||
guint num_tries_left;
|
||||
guint needed_prefixes;
|
||||
bool was_active;
|
||||
} dhcp6;
|
||||
|
||||
gboolean needs_ip6_subnet;
|
||||
|
|
@ -5661,19 +5663,11 @@ dhcp4_fail (NMDevice *self, gboolean timeout)
|
|||
return;
|
||||
}
|
||||
|
||||
/* Instead of letting an assumed connection fail (which means that the
|
||||
* device will transition to the ACTIVATED state without IP configuration),
|
||||
* retry DHCP again.
|
||||
*/
|
||||
if (nm_device_sys_iface_state_is_external_or_assume (self)) {
|
||||
dhcp_schedule_restart (self, AF_INET, "connection is assumed");
|
||||
return;
|
||||
}
|
||||
|
||||
if ( priv->dhcp4.num_tries_left == DHCP_NUM_TRIES_MAX
|
||||
&& (timeout || (priv->ip4_state == IP_CONF)))
|
||||
&& (timeout || (priv->ip4_state == IP_CONF))
|
||||
&& !priv->dhcp4.was_active)
|
||||
nm_device_activate_schedule_ip4_config_timeout (self);
|
||||
else if (priv->ip4_state == IP_DONE) {
|
||||
else if (priv->ip4_state == IP_DONE || priv->dhcp4.was_active) {
|
||||
/* Don't fail immediately when the lease expires but try to
|
||||
* restart DHCP for a predefined number of times.
|
||||
*/
|
||||
|
|
@ -5842,6 +5836,9 @@ dhcp4_start (NMDevice *self,
|
|||
|
||||
nm_device_add_pending_action (self, NM_PENDING_ACTION_DHCP4, TRUE);
|
||||
|
||||
if (nm_device_sys_iface_state_get (self) == NM_DEVICE_SYS_IFACE_STATE_ASSUME)
|
||||
priv->dhcp4.was_active = TRUE;
|
||||
|
||||
/* DHCP devices will be notified by the DHCP manager when stuff happens */
|
||||
return NM_ACT_STAGE_RETURN_POSTPONE;
|
||||
}
|
||||
|
|
@ -6456,19 +6453,11 @@ dhcp6_fail (NMDevice *self, gboolean timeout)
|
|||
return;
|
||||
}
|
||||
|
||||
/* Instead of letting an assumed connection fail (which means that the
|
||||
* device will transition to the ACTIVATED state without IP configuration),
|
||||
* retry DHCP again.
|
||||
*/
|
||||
if (nm_device_sys_iface_state_is_external_or_assume (self)) {
|
||||
dhcp_schedule_restart (self, AF_INET6, "connection is assumed");
|
||||
return;
|
||||
}
|
||||
|
||||
if ( priv->dhcp6.num_tries_left == DHCP_NUM_TRIES_MAX
|
||||
&& (timeout || (priv->ip6_state == IP_CONF)))
|
||||
&& (timeout || (priv->ip6_state == IP_CONF))
|
||||
&& !priv->dhcp6.was_active)
|
||||
nm_device_activate_schedule_ip6_config_timeout (self);
|
||||
else if (priv->ip6_state == IP_DONE) {
|
||||
else if (priv->ip6_state == IP_DONE || priv->dhcp6.was_active) {
|
||||
/* Don't fail immediately when the lease expires but try to
|
||||
* restart DHCP for a predefined number of times.
|
||||
*/
|
||||
|
|
@ -6648,6 +6637,9 @@ dhcp6_start_with_link_ready (NMDevice *self, NMConnection *connection)
|
|||
self);
|
||||
}
|
||||
|
||||
if (nm_device_sys_iface_state_get (self) == NM_DEVICE_SYS_IFACE_STATE_ASSUME)
|
||||
priv->dhcp6.was_active = TRUE;
|
||||
|
||||
return !!priv->dhcp6.client;
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue