summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/devices/nm-device.c12
-rw-r--r--src/dhcp-manager/nm-dhcp-client.c12
-rw-r--r--src/dhcp-manager/nm-dhcp-client.h9
-rw-r--r--src/dhcp-manager/nm-dhcp-systemd.c2
4 files changed, 25 insertions, 10 deletions
diff --git a/src/devices/nm-device.c b/src/devices/nm-device.c
index 060a7aa6f5..cd548d260e 100644
--- a/src/devices/nm-device.c
+++ b/src/devices/nm-device.c
@@ -3006,9 +3006,13 @@ dhcp4_state_changed (NMDhcpClient *client,
case NM_DHCP_STATE_TIMEOUT:
dhcp4_fail (self, TRUE);
break;
+ case NM_DHCP_STATE_EXPIRE:
+ /* Ignore expiry before we even have a lease (NAK, old lease, etc) */
+ if (priv->ip4_state == IP_CONF)
+ break;
+ /* Fall through */
case NM_DHCP_STATE_DONE:
case NM_DHCP_STATE_FAIL:
- /* dhclient quit and can't get/renew a lease; so kill the connection */
dhcp4_fail (self, FALSE);
break;
default:
@@ -3597,6 +3601,11 @@ dhcp6_state_changed (NMDhcpClient *client,
case NM_DHCP_STATE_TIMEOUT:
dhcp6_timeout (self, client);
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, FALSE);
+ break;
case NM_DHCP_STATE_DONE:
/* In IPv6 info-only mode, the client doesn't handle leases so it
* may exit right after getting a response from the server. That's
@@ -3606,7 +3615,6 @@ dhcp6_state_changed (NMDhcpClient *client,
break;
/* Otherwise, fall through */
case NM_DHCP_STATE_FAIL:
- /* dhclient quit and can't get/renew a lease; so kill the connection */
dhcp6_fail (self, FALSE);
break;
default:
diff --git a/src/dhcp-manager/nm-dhcp-client.c b/src/dhcp-manager/nm-dhcp-client.c
index 4e56550028..47fa53171f 100644
--- a/src/dhcp-manager/nm-dhcp-client.c
+++ b/src/dhcp-manager/nm-dhcp-client.c
@@ -183,6 +183,7 @@ static const char *state_table[NM_DHCP_STATE_MAX + 1] = {
[NM_DHCP_STATE_UNKNOWN] = "unknown",
[NM_DHCP_STATE_BOUND] = "bound",
[NM_DHCP_STATE_TIMEOUT] = "timeout",
+ [NM_DHCP_STATE_EXPIRE] = "expire",
[NM_DHCP_STATE_DONE] = "done",
[NM_DHCP_STATE_FAIL] = "fail",
};
@@ -208,13 +209,14 @@ reason_to_state (const char *iface, const char *reason)
return NM_DHCP_STATE_BOUND;
else if (g_ascii_strcasecmp (reason, "timeout") == 0)
return NM_DHCP_STATE_TIMEOUT;
+ else if (g_ascii_strcasecmp (reason, "nak") == 0 ||
+ g_ascii_strcasecmp (reason, "expire") == 0 ||
+ g_ascii_strcasecmp (reason, "expire6") == 0)
+ return NM_DHCP_STATE_EXPIRE;
else if (g_ascii_strcasecmp (reason, "end") == 0)
return NM_DHCP_STATE_DONE;
else if (g_ascii_strcasecmp (reason, "fail") == 0 ||
- g_ascii_strcasecmp (reason, "abend") == 0 ||
- g_ascii_strcasecmp (reason, "nak") == 0 ||
- g_ascii_strcasecmp (reason, "expire") == 0 ||
- g_ascii_strcasecmp (reason, "expire6") == 0)
+ g_ascii_strcasecmp (reason, "abend") == 0)
return NM_DHCP_STATE_FAIL;
nm_log_dbg (LOGD_DHCP, "(%s): unmapped DHCP state '%s'", iface, reason);
@@ -744,6 +746,8 @@ nm_dhcp_client_handle_event (gpointer unused,
old_state = priv->state;
new_state = reason_to_state (priv->iface, reason);
+ nm_log_dbg (LOGD_DHCP, "(%s): DHCP reason '%s' -> state '%s'",
+ iface, reason, state_to_string (new_state));
if (new_state == NM_DHCP_STATE_BOUND) {
/* Copy options */
diff --git a/src/dhcp-manager/nm-dhcp-client.h b/src/dhcp-manager/nm-dhcp-client.h
index 0876061f8a..971c9dc04e 100644
--- a/src/dhcp-manager/nm-dhcp-client.h
+++ b/src/dhcp-manager/nm-dhcp-client.h
@@ -46,10 +46,11 @@
typedef enum {
NM_DHCP_STATE_UNKNOWN = 0,
- NM_DHCP_STATE_BOUND, /* lease changed (state_is_bound) */
- NM_DHCP_STATE_TIMEOUT, /* TIMEOUT */
- NM_DHCP_STATE_DONE, /* END */
- NM_DHCP_STATE_FAIL, /* failed or quit unexpectedly */
+ NM_DHCP_STATE_BOUND, /* new lease or lease changed */
+ NM_DHCP_STATE_TIMEOUT, /* timed out contacting server */
+ NM_DHCP_STATE_DONE, /* client quit or stopped */
+ NM_DHCP_STATE_EXPIRE, /* lease expired or NAKed */
+ NM_DHCP_STATE_FAIL, /* failed for some reason */
__NM_DHCP_STATE_MAX,
NM_DHCP_STATE_MAX = __NM_DHCP_STATE_MAX - 1,
} NMDhcpState;
diff --git a/src/dhcp-manager/nm-dhcp-systemd.c b/src/dhcp-manager/nm-dhcp-systemd.c
index 5d36282cff..12dc03cc84 100644
--- a/src/dhcp-manager/nm-dhcp-systemd.c
+++ b/src/dhcp-manager/nm-dhcp-systemd.c
@@ -485,6 +485,8 @@ dhcp_event_cb (sd_dhcp_client *client, int event, gpointer user_data)
switch (event) {
case DHCP_EVENT_EXPIRED:
+ nm_dhcp_client_set_state (NM_DHCP_CLIENT (user_data), NM_DHCP_STATE_EXPIRE, NULL, NULL);
+ break;
case DHCP_EVENT_STOP:
nm_dhcp_client_set_state (NM_DHCP_CLIENT (user_data), NM_DHCP_STATE_FAIL, NULL, NULL);
break;