From e3113fdc4b01d79080911b7450fc032dc0a85108 Mon Sep 17 00:00:00 2001 From: Beniamino Galvani Date: Thu, 4 May 2017 10:05:25 +0200 Subject: 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. --- src/devices/nm-device.c | 36 ++++++++++++++---------------------- 1 file 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; } -- cgit v1.2.1