summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBeniamino Galvani <bgalvani@redhat.com>2019-08-14 10:55:44 +0200
committerBeniamino Galvani <bgalvani@redhat.com>2019-09-18 09:29:51 +0200
commit9c123cdd3f6133bae8fb9776c715d70ea4c959f1 (patch)
tree78d565d8b26417ce7abbc3404410727869081429
parent8b5bf6e4d1f739d6ce9725d30e39a4e54a527b01 (diff)
downloadNetworkManager-9c123cdd3f6133bae8fb9776c715d70ea4c959f1.tar.gz
device: keep client running after activation failure
If DHCPv4 fails but IPv6 succeeds it makes sense to continue trying DHCP so that we will eventually be able to get an address if the DHCP server comes back. Always keep the client running; it will be only terminated when the connection is brought down. https://bugzilla.redhat.com/show_bug.cgi?id=1688329
-rw-r--r--src/devices/nm-device.c24
1 files changed, 16 insertions, 8 deletions
diff --git a/src/devices/nm-device.c b/src/devices/nm-device.c
index 81e8d934f9..02963b52c2 100644
--- a/src/devices/nm-device.c
+++ b/src/devices/nm-device.c
@@ -7736,7 +7736,13 @@ dhcp4_fail (NMDevice *self, NMDhcpState dhcp_state)
_ip_state_to_string (priv->ip_state_4),
priv->dhcp4.was_active);
- /* Keep client running if there are static addresses configured
+ /* The client is always left running after a failure. */
+
+ /* Nothing to do if we failed before... */
+ if (priv->ip_state_4 == NM_DEVICE_IP_STATE_FAIL)
+ goto clear_config;
+
+ /* ... and also if there are static addresses configured
* on the interface.
*/
if ( priv->ip_state_4 == NM_DEVICE_IP_STATE_DONE
@@ -7752,14 +7758,12 @@ dhcp4_fail (NMDevice *self, NMDhcpState dhcp_state)
*/
if ( dhcp_state == NM_DHCP_STATE_TERMINATED
|| (!priv->dhcp4.was_active && priv->ip_state_4 == NM_DEVICE_IP_STATE_CONF)) {
- dhcp4_cleanup (self, CLEANUP_TYPE_DECONFIGURE, FALSE);
nm_device_activate_schedule_ip_config_timeout (self, AF_INET);
return;
}
/* In any other case (expired lease, assumed connection, etc.),
- * start a grace period in which we keep the client running,
- * hoping that it will regain a lease.
+ * wait for some time before failing the IP method.
*/
if (!priv->dhcp4.grace_id) {
priv->dhcp4.grace_id = g_timeout_add_seconds (DHCP_GRACE_PERIOD_SEC,
@@ -8381,10 +8385,16 @@ dhcp6_fail (NMDevice *self, NMDhcpState dhcp_state)
_ip_state_to_string (priv->ip_state_6),
priv->dhcp6.was_active);
+ /* The client is always left running after a failure. */
+
+ /* Nothing to do if we failed before... */
+ if (priv->ip_state_6 == NM_DEVICE_IP_STATE_FAIL)
+ goto clear_config;
+
is_dhcp_managed = (priv->dhcp6.mode == NM_NDISC_DHCP_LEVEL_MANAGED);
if (is_dhcp_managed) {
- /* Keep client running if there are static addresses configured
+ /* ... and also if there are static addresses configured
* on the interface.
*/
if ( priv->ip_state_6 == NM_DEVICE_IP_STATE_DONE
@@ -8400,14 +8410,12 @@ dhcp6_fail (NMDevice *self, NMDhcpState dhcp_state)
*/
if ( dhcp_state == NM_DHCP_STATE_TERMINATED
|| (!priv->dhcp6.was_active && priv->ip_state_6 == NM_DEVICE_IP_STATE_CONF)) {
- dhcp6_cleanup (self, CLEANUP_TYPE_DECONFIGURE, FALSE);
nm_device_activate_schedule_ip_config_timeout (self, AF_INET6);
return;
}
/* In any other case (expired lease, assumed connection, etc.),
- * start a grace period in which we keep the client running,
- * hoping that it will regain a lease.
+ * wait for some time before failing the IP method.
*/
if (!priv->dhcp6.grace_id) {
priv->dhcp6.grace_id = g_timeout_add_seconds (DHCP_GRACE_PERIOD_SEC,