summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBeniamino Galvani <bgalvani@redhat.com>2018-10-08 10:10:05 +0200
committerBeniamino Galvani <bgalvani@redhat.com>2018-10-15 14:05:23 +0200
commit0a25b9081376312c403270cb1052fbb6f0655075 (patch)
treec40d8e1da73f0a63c222ad6191a4b9d42b47e9b8
parent81aa1a3bb3e51bf6af86a656ebcab083b6225f18 (diff)
downloadNetworkManager-0a25b9081376312c403270cb1052fbb6f0655075.tar.gz
dhcp: introduce terminated dhcp-state
When the client terminates, we really don't care if it exited cleanly, with an error or killed by a signal. We expect the client to never exit and so all these situations are equally bad for us. Introduce a new TERMINATED state instead of reusing existing FAIL or DONE states, which are set when receiving particular events from the client.
-rw-r--r--src/devices/nm-device.c4
-rw-r--r--src/dhcp/nm-dhcp-client.c21
-rw-r--r--src/dhcp/nm-dhcp-client.h1
3 files changed, 12 insertions, 14 deletions
diff --git a/src/devices/nm-device.c b/src/devices/nm-device.c
index a5b34cf3c5..e09f3c054e 100644
--- a/src/devices/nm-device.c
+++ b/src/devices/nm-device.c
@@ -7446,6 +7446,7 @@ dhcp4_state_changed (NMDhcpClient *client,
/* fall through */
case NM_DHCP_STATE_DONE:
case NM_DHCP_STATE_FAIL:
+ case NM_DHCP_STATE_TERMINATED:
dhcp4_fail (self);
break;
default:
@@ -8203,7 +8204,7 @@ dhcp6_state_changed (NMDhcpClient *client,
if (priv->ip6_state != IP_CONF)
dhcp6_fail (self);
break;
- case NM_DHCP_STATE_DONE:
+ case NM_DHCP_STATE_TERMINATED:
/* 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
* normal. In that case we just ignore the exit.
@@ -8211,6 +8212,7 @@ dhcp6_state_changed (NMDhcpClient *client,
if (priv->dhcp6.mode == NM_NDISC_DHCP_LEVEL_OTHERCONF)
break;
/* fall through */
+ case NM_DHCP_STATE_DONE:
case NM_DHCP_STATE_FAIL:
dhcp6_fail (self);
break;
diff --git a/src/dhcp/nm-dhcp-client.c b/src/dhcp/nm-dhcp-client.c
index 16db830681..d60a9bdaba 100644
--- a/src/dhcp/nm-dhcp-client.c
+++ b/src/dhcp/nm-dhcp-client.c
@@ -288,12 +288,13 @@ nm_dhcp_client_get_use_fqdn (NMDhcpClient *self)
/*****************************************************************************/
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",
+ [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",
+ [NM_DHCP_STATE_TERMINATED] = "terminated",
};
static const char *
@@ -449,7 +450,6 @@ daemon_watch_cb (GPid pid, int status, gpointer user_data)
{
NMDhcpClient *self = NM_DHCP_CLIENT (user_data);
NMDhcpClientPrivate *priv = NM_DHCP_CLIENT_GET_PRIVATE (self);
- NMDhcpState new_state;
g_return_if_fail (priv->watch_id);
priv->watch_id = 0;
@@ -465,14 +465,9 @@ daemon_watch_cb (GPid pid, int status, gpointer user_data)
else
_LOGW ("client died abnormally");
- if (!WIFEXITED (status))
- new_state = NM_DHCP_STATE_FAIL;
- else
- new_state = NM_DHCP_STATE_DONE;
-
priv->pid = -1;
- nm_dhcp_client_set_state (self, new_state, NULL, NULL);
+ nm_dhcp_client_set_state (self, NM_DHCP_STATE_TERMINATED, NULL, NULL);
}
void
diff --git a/src/dhcp/nm-dhcp-client.h b/src/dhcp/nm-dhcp-client.h
index 86d60e3874..af0a97fad5 100644
--- a/src/dhcp/nm-dhcp-client.h
+++ b/src/dhcp/nm-dhcp-client.h
@@ -56,6 +56,7 @@ typedef enum {
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_TERMINATED, /* client is no longer running */
__NM_DHCP_STATE_MAX,
NM_DHCP_STATE_MAX = __NM_DHCP_STATE_MAX - 1,
} NMDhcpState;