summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBeniamino Galvani <bgalvani@redhat.com>2019-09-18 09:31:57 +0200
committerBeniamino Galvani <bgalvani@redhat.com>2019-09-18 09:31:57 +0200
commita7dd935d87a5ff2981f8465a0c263e3db46ce9ac (patch)
tree78d565d8b26417ce7abbc3404410727869081429
parent686c6b003237c3fa6a76823f377d815a4b11a483 (diff)
parent9c123cdd3f6133bae8fb9776c715d70ea4c959f1 (diff)
downloadNetworkManager-a7dd935d87a5ff2981f8465a0c263e3db46ce9ac.tar.gz
Merge branch 'bg/dhcp-keep'
https://gitlab.freedesktop.org/NetworkManager/NetworkManager/merge_requests/243 https://bugzilla.redhat.com/show_bug.cgi?id=1688329
-rw-r--r--shared/n-dhcp4/src/n-dhcp4-c-probe.c2
-rw-r--r--src/devices/nm-device.c40
2 files changed, 31 insertions, 11 deletions
diff --git a/shared/n-dhcp4/src/n-dhcp4-c-probe.c b/shared/n-dhcp4/src/n-dhcp4-c-probe.c
index f1ac3db746..107c18bbad 100644
--- a/shared/n-dhcp4/src/n-dhcp4-c-probe.c
+++ b/shared/n-dhcp4/src/n-dhcp4-c-probe.c
@@ -1009,7 +1009,7 @@ int n_dhcp4_client_probe_transition_accept(NDhcp4ClientProbe *probe, NDhcp4Incom
probe->state = N_DHCP4_CLIENT_PROBE_STATE_BOUND;
- /* XXX: trigger timers */
+ n_dhcp4_client_arm_timer (probe->client);
break;
diff --git a/src/devices/nm-device.c b/src/devices/nm-device.c
index 5ea94c7959..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,
@@ -7787,8 +7791,8 @@ dhcp4_dad_cb (NMDevice *self, NMIP4Config **configs, gboolean success)
NMDevicePrivate *priv = NM_DEVICE_GET_PRIVATE (self);
if (success) {
- nm_dhcp_client_accept (priv->dhcp4.client, NULL);
- nm_device_activate_schedule_ip_config_result (self, AF_INET, NM_IP_CONFIG_CAST (configs[1]));
+ nm_device_activate_schedule_ip_config_result (self, AF_INET,
+ NM_IP_CONFIG_CAST (configs[1]));
} else {
nm_dhcp_client_decline (priv->dhcp4.client, "Address conflict detected", NULL);
nm_device_ip_method_failed (self, AF_INET,
@@ -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,
@@ -10774,6 +10782,18 @@ activate_stage5_ip_config_result_4 (NMDevice *self)
}
}
+ if (priv->dhcp4.client) {
+ gs_free_error GError *error = NULL;
+
+ if (!nm_dhcp_client_accept (priv->dhcp4.client, &error)) {
+ _LOGW (LOGD_DHCP4,
+ "Activation: Stage 5 of 5 (IPv4 Commit) error accepting lease: %s",
+ error->message);
+ nm_device_ip_method_failed (self, AF_INET, NM_DEVICE_STATE_REASON_DHCP_ERROR);
+ return;
+ }
+ }
+
/* If IPv4 wasn't the first to complete, and DHCP was used, then ensure
* dispatcher scripts get the DHCP lease information.
*/