summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBeniamino Galvani <bgalvani@redhat.com>2017-05-04 10:05:25 +0200
committerBeniamino Galvani <bgalvani@redhat.com>2017-05-04 11:18:55 +0200
commite3113fdc4b01d79080911b7450fc032dc0a85108 (patch)
tree13a7d40d576e5e998d49b9ab963942230cf6a53d
parent2524a6f8528c6f7b013f1404452d3aa7e4e4ab39 (diff)
downloadNetworkManager-e3113fdc4b01d79080911b7450fc032dc0a85108.tar.gz
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.
-rw-r--r--src/devices/nm-device.c36
1 files changed, 14 insertions, 22 deletions
diff --git a/src/devices/nm-device.c b/src/devices/nm-device.c
index 77adda7f2a..3b1af608c9 100644
--- a/src/devices/nm-device.c
+++ b/src/devices/nm-device.c
@@ -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;
}