summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBeniamino Galvani <bgalvani@redhat.com>2018-09-28 15:58:02 +0200
committerBeniamino Galvani <bgalvani@redhat.com>2018-10-15 14:05:23 +0200
commit567e277e64a8d9d7e9c46e8e61a6e15948c49279 (patch)
tree2d2ef1c2936260c1547e6123cc763a6115463679
parent0a25b9081376312c403270cb1052fbb6f0655075 (diff)
downloadNetworkManager-567e277e64a8d9d7e9c46e8e61a6e15948c49279.tar.gz
dhcp: don't start grace period if the client is not running
We shouldn't start a grace period when the client is not running.
-rw-r--r--src/devices/nm-device.c64
1 files changed, 31 insertions, 33 deletions
diff --git a/src/devices/nm-device.c b/src/devices/nm-device.c
index e09f3c054e..7a9f03800a 100644
--- a/src/devices/nm-device.c
+++ b/src/devices/nm-device.c
@@ -7307,7 +7307,7 @@ dhcp4_grace_period_expired (gpointer user_data)
}
static void
-dhcp4_fail (NMDevice *self)
+dhcp4_fail (NMDevice *self, NMDhcpState dhcp_state)
{
NMDevicePrivate *priv = NM_DEVICE_GET_PRIVATE (self);
@@ -7323,11 +7323,14 @@ dhcp4_fail (NMDevice *self)
&& nm_ip4_config_get_num_addresses (priv->con_ip_config_4) > 0)
goto clear_config;
- /* Fail the method in case of timeout or failure during initial
- * configuration.
+ /* Fail the method when one of the following is true:
+ * 1) the DHCP client terminated: it does not make sense to start a grace
+ * period without a client running;
+ * 2) we failed to get an initial lease AND the client was
+ * not active before.
*/
- if ( !priv->dhcp4.was_active
- && priv->ip4_state == IP_CONF) {
+ if ( dhcp_state == NM_DHCP_STATE_TERMINATED
+ || (!priv->dhcp4.was_active && priv->ip4_state == IP_CONF)) {
dhcp4_cleanup (self, CLEANUP_TYPE_DECONFIGURE, FALSE);
nm_device_activate_schedule_ip4_config_timeout (self);
return;
@@ -7390,7 +7393,7 @@ dhcp4_state_changed (NMDhcpClient *client,
case NM_DHCP_STATE_BOUND:
if (!ip4_config) {
_LOGW (LOGD_DHCP4, "failed to get IPv4 config in response to DHCP event.");
- dhcp4_fail (self);
+ dhcp4_fail (self, state);
break;
}
@@ -7433,11 +7436,11 @@ dhcp4_state_changed (NMDhcpClient *client,
if (dhcp4_lease_change (self, ip4_config))
nm_device_update_metered (self);
else
- dhcp4_fail (self);
+ dhcp4_fail (self, state);
}
break;
case NM_DHCP_STATE_TIMEOUT:
- dhcp4_fail (self);
+ dhcp4_fail (self, state);
break;
case NM_DHCP_STATE_EXPIRE:
/* Ignore expiry before we even have a lease (NAK, old lease, etc) */
@@ -7447,7 +7450,7 @@ dhcp4_state_changed (NMDhcpClient *client,
case NM_DHCP_STATE_DONE:
case NM_DHCP_STATE_FAIL:
case NM_DHCP_STATE_TERMINATED:
- dhcp4_fail (self);
+ dhcp4_fail (self, state);
break;
default:
break;
@@ -8062,7 +8065,7 @@ dhcp6_grace_period_expired (gpointer user_data)
}
static void
-dhcp6_fail (NMDevice *self)
+dhcp6_fail (NMDevice *self, NMDhcpState dhcp_state)
{
NMDevicePrivate *priv = NM_DEVICE_GET_PRIVATE (self);
gboolean is_dhcp_managed;
@@ -8082,11 +8085,14 @@ dhcp6_fail (NMDevice *self)
&& nm_ip6_config_get_num_addresses (priv->con_ip_config_6))
goto clear_config;
- /* Fail the method in case of timeout or failure during initial
- * configuration.
+ /* Fail the method when one of the following is true:
+ * 1) the DHCP client terminated: it does not make sense to start a grace
+ * period without a client running;
+ * 2) we failed to get an initial lease AND the client was
+ * not active before.
*/
- if ( !priv->dhcp6.was_active
- && priv->ip6_state == IP_CONF) {
+ if ( dhcp_state == NM_DHCP_STATE_TERMINATED
+ || (!priv->dhcp6.was_active && priv->ip6_state == IP_CONF)) {
dhcp6_cleanup (self, CLEANUP_TYPE_DECONFIGURE, FALSE);
nm_device_activate_schedule_ip6_config_timeout (self);
return;
@@ -8123,21 +8129,6 @@ clear_config:
}
static void
-dhcp6_timeout (NMDevice *self, NMDhcpClient *client)
-{
- NMDevicePrivate *priv = NM_DEVICE_GET_PRIVATE (self);
-
- if (priv->dhcp6.mode == NM_NDISC_DHCP_LEVEL_MANAGED)
- dhcp6_fail (self);
- else {
- /* not a hard failure; just live with the RA info */
- dhcp6_cleanup (self, CLEANUP_TYPE_DECONFIGURE, FALSE);
- if (priv->ip6_state == IP_CONF)
- nm_device_activate_schedule_ip6_config_result (self);
- }
-}
-
-static void
dhcp6_state_changed (NMDhcpClient *client,
NMDhcpState state,
NMIP6Config *ip6_config,
@@ -8194,15 +8185,22 @@ dhcp6_state_changed (NMDhcpClient *client,
nm_device_activate_schedule_ip6_config_result (self);
} else if (priv->ip6_state == IP_DONE)
if (!dhcp6_lease_change (self))
- dhcp6_fail (self);
+ dhcp6_fail (self, state);
break;
case NM_DHCP_STATE_TIMEOUT:
- dhcp6_timeout (self, client);
+ if (priv->dhcp6.mode == NM_NDISC_DHCP_LEVEL_MANAGED)
+ dhcp6_fail (self, state);
+ else {
+ /* not a hard failure; just live with the RA info */
+ dhcp6_cleanup (self, CLEANUP_TYPE_DECONFIGURE, FALSE);
+ if (priv->ip6_state == IP_CONF)
+ nm_device_activate_schedule_ip6_config_result (self);
+ }
break;
case NM_DHCP_STATE_EXPIRE:
/* Ignore expiry before we even have a lease (NAK, old lease, etc) */
if (priv->ip6_state != IP_CONF)
- dhcp6_fail (self);
+ dhcp6_fail (self, state);
break;
case NM_DHCP_STATE_TERMINATED:
/* In IPv6 info-only mode, the client doesn't handle leases so it
@@ -8214,7 +8212,7 @@ dhcp6_state_changed (NMDhcpClient *client,
/* fall through */
case NM_DHCP_STATE_DONE:
case NM_DHCP_STATE_FAIL:
- dhcp6_fail (self);
+ dhcp6_fail (self, state);
break;
default:
break;