summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDan Williams <dcbw@redhat.com>2014-05-15 14:11:48 -0500
committerDan Williams <dcbw@redhat.com>2014-07-22 14:39:18 -0500
commit9568ae52e4f8747b3773a8fd27bd03df5240fd4d (patch)
treeda7552583ce9566e7b81f01d661d6ce5cb2c4fbc
parent9e75e2ad0d803f88b3facb8ec15ecf9a3ef3c590 (diff)
downloadNetworkManager-9568ae52e4f8747b3773a8fd27bd03df5240fd4d.tar.gz
dhcp: merge TIMEOUT signal with DHCP_STATE_TIMEOUT
No reason to have two signals for the same thing. Previously, the TIMEOUT signal was used for the internal overall DHCP transaction bound, while DHCP_STATE_TIMEOUT/DHC_TIMEOUT was a signal from the DHCP client itself that something had timed out. But in both cases the results should be the same, so just collapse the stand-alone TIMEOUT signal into the DHCP_STATE_TIMEOUT state.
-rw-r--r--src/devices/nm-device.c79
-rw-r--r--src/dhcp-manager/nm-dhcp-client.c42
-rw-r--r--src/dhcp-manager/nm-dhcp-client.h2
-rw-r--r--src/dhcp-manager/nm-dhcp-manager.c33
4 files changed, 51 insertions, 105 deletions
diff --git a/src/devices/nm-device.c b/src/devices/nm-device.c
index 3efc3a2874..6ca17b2f86 100644
--- a/src/devices/nm-device.c
+++ b/src/devices/nm-device.c
@@ -241,7 +241,6 @@ typedef struct {
/* DHCPv4 tracking */
NMDHCPClient * dhcp4_client;
gulong dhcp4_state_sigid;
- gulong dhcp4_timeout_sigid;
NMDHCP4Config * dhcp4_config;
NMIP4Config * vpn4_config; /* routes added by a VPN which uses this device */
@@ -279,7 +278,6 @@ typedef struct {
NMDHCPClient * dhcp6_client;
NMRDiscDHCPLevel dhcp6_mode;
gulong dhcp6_state_sigid;
- gulong dhcp6_timeout_sigid;
NMDHCP6Config * dhcp6_config;
/* IP6 config from DHCP */
NMIP6Config * dhcp6_ip6_config;
@@ -2591,11 +2589,6 @@ dhcp4_cleanup (NMDevice *self, gboolean stop, gboolean release)
priv->dhcp4_state_sigid = 0;
}
- if (priv->dhcp4_timeout_sigid) {
- g_signal_handler_disconnect (priv->dhcp4_client, priv->dhcp4_timeout_sigid);
- priv->dhcp4_timeout_sigid = 0;
- }
-
nm_device_remove_pending_action (self, PENDING_ACTION_DHCP4, FALSE);
if (stop)
@@ -2738,6 +2731,7 @@ dhcp4_state_changed (NMDHCPClient *client,
break;
case NM_DHCP_STATE_TIMEOUT:
+ nm_dhcp_client_stop (client, FALSE);
dhcp4_fail (device, TRUE);
break;
case NM_DHCP_STATE_DONE:
@@ -2750,18 +2744,6 @@ dhcp4_state_changed (NMDHCPClient *client,
}
}
-static void
-dhcp4_timeout (NMDHCPClient *client, gpointer user_data)
-{
- NMDevice *device = NM_DEVICE (user_data);
-
- g_return_if_fail (nm_device_get_act_request (device) != NULL);
- g_return_if_fail (nm_dhcp_client_get_ipv6 (client) == FALSE);
-
- nm_dhcp_client_stop (client, FALSE);
- dhcp4_fail (device, TRUE);
-}
-
static NMActStageReturn
dhcp4_start (NMDevice *self,
NMConnection *connection,
@@ -2807,10 +2789,6 @@ dhcp4_start (NMDevice *self,
NM_DHCP_CLIENT_SIGNAL_STATE_CHANGED,
G_CALLBACK (dhcp4_state_changed),
self);
- priv->dhcp4_timeout_sigid = g_signal_connect (priv->dhcp4_client,
- NM_DHCP_CLIENT_SIGNAL_TIMEOUT,
- G_CALLBACK (dhcp4_timeout),
- self);
nm_device_add_pending_action (self, PENDING_ACTION_DHCP4, TRUE);
@@ -3034,11 +3012,6 @@ dhcp6_cleanup (NMDevice *self, gboolean stop, gboolean release)
priv->dhcp6_state_sigid = 0;
}
- if (priv->dhcp6_timeout_sigid) {
- g_signal_handler_disconnect (priv->dhcp6_client, priv->dhcp6_timeout_sigid);
- priv->dhcp6_timeout_sigid = 0;
- }
-
nm_device_remove_pending_action (self, PENDING_ACTION_DHCP6, FALSE);
if (stop)
@@ -3145,6 +3118,26 @@ dhcp6_fail (NMDevice *device, gboolean timeout)
}
static void
+dhcp6_timeout (NMDevice *self, NMDHCPClient *client)
+{
+ NMDevicePrivate *priv = NM_DEVICE_GET_PRIVATE (self);
+
+ nm_dhcp_client_stop (client, FALSE);
+ if (priv->dhcp6_mode == NM_RDISC_DHCP_LEVEL_MANAGED)
+ dhcp6_fail (self, TRUE);
+ else {
+ /* not a hard failure; just live with the RA info */
+ nm_dhcp6_config_reset (priv->dhcp6_config);
+ if (priv->dhcp6_ip6_config)
+ g_object_unref (priv->dhcp6_ip6_config);
+ priv->dhcp6_ip6_config = NULL;
+
+ if (priv->ip6_state == IP_CONF)
+ nm_device_activate_schedule_ip6_config_result (self);
+ }
+}
+
+static void
dhcp6_state_changed (NMDHCPClient *client,
NMDhcpState state,
gpointer user_data)
@@ -3182,7 +3175,7 @@ dhcp6_state_changed (NMDHCPClient *client,
dhcp6_lease_change (device);
break;
case NM_DHCP_STATE_TIMEOUT:
- dhcp6_fail (device, TRUE);
+ dhcp6_timeout (device, client);
break;
case NM_DHCP_STATE_DONE:
/* In IPv6 info-only mode, the client doesn't handle leases so it
@@ -3201,30 +3194,6 @@ dhcp6_state_changed (NMDHCPClient *client,
}
}
-static void
-dhcp6_timeout (NMDHCPClient *client, gpointer user_data)
-{
- NMDevice *device = NM_DEVICE (user_data);
- NMDevicePrivate *priv = NM_DEVICE_GET_PRIVATE (device);
-
- g_return_if_fail (nm_device_get_act_request (device) != NULL);
- g_return_if_fail (nm_dhcp_client_get_ipv6 (client) == TRUE);
-
- nm_dhcp_client_stop (client, FALSE);
- if (priv->dhcp6_mode == NM_RDISC_DHCP_LEVEL_MANAGED)
- dhcp6_fail (device, TRUE);
- else {
- /* not a hard failure; just live with the RA info */
- nm_dhcp6_config_reset (priv->dhcp6_config);
- if (priv->dhcp6_ip6_config)
- g_object_unref (priv->dhcp6_ip6_config);
- priv->dhcp6_ip6_config = NULL;
-
- if (priv->ip6_state == IP_CONF)
- nm_device_activate_schedule_ip6_config_result (device);
- }
-}
-
static NMActStageReturn
dhcp6_start (NMDevice *self,
NMConnection *connection,
@@ -3277,10 +3246,6 @@ dhcp6_start (NMDevice *self,
NM_DHCP_CLIENT_SIGNAL_STATE_CHANGED,
G_CALLBACK (dhcp6_state_changed),
self);
- priv->dhcp6_timeout_sigid = g_signal_connect (priv->dhcp6_client,
- NM_DHCP_CLIENT_SIGNAL_TIMEOUT,
- G_CALLBACK (dhcp6_timeout),
- self);
s_ip6 = nm_connection_get_setting_ip6_config (connection);
if (!nm_setting_ip6_config_get_may_fail (s_ip6) ||
diff --git a/src/dhcp-manager/nm-dhcp-client.c b/src/dhcp-manager/nm-dhcp-client.c
index abe3bf6360..2534d0c13a 100644
--- a/src/dhcp-manager/nm-dhcp-client.c
+++ b/src/dhcp-manager/nm-dhcp-client.c
@@ -48,7 +48,7 @@ typedef struct {
pid_t pid;
guint timeout_id;
guint watch_id;
- guint32 remove_id;
+ guint remove_id;
GHashTable * options;
gboolean info_only;
@@ -60,7 +60,6 @@ G_DEFINE_TYPE_EXTENDED (NMDHCPClient, nm_dhcp_client, G_TYPE_OBJECT, G_TYPE_FLAG
enum {
SIGNAL_STATE_CHANGED,
- SIGNAL_TIMEOUT,
SIGNAL_REMOVE,
LAST_SIGNAL
};
@@ -175,21 +174,6 @@ stop (NMDHCPClient *self, gboolean release, const GByteArray *duid)
}
static gboolean
-daemon_timeout (gpointer user_data)
-{
- NMDHCPClient *self = NM_DHCP_CLIENT (user_data);
- NMDHCPClientPrivate *priv = NM_DHCP_CLIENT_GET_PRIVATE (self);
-
- if (priv->ipv6) {
- nm_log_warn (LOGD_DHCP6, "(%s): DHCPv6 request timed out.", priv->iface);
- } else {
- nm_log_warn (LOGD_DHCP4, "(%s): DHCPv4 request timed out.", priv->iface);
- }
- g_signal_emit (G_OBJECT (self), signals[SIGNAL_TIMEOUT], 0);
- return FALSE;
-}
-
-static gboolean
signal_remove (gpointer user_data)
{
NMDHCPClient *self = NM_DHCP_CLIENT (user_data);
@@ -223,6 +207,21 @@ dhcp_client_set_state (NMDHCPClient *self,
}
}
+static gboolean
+daemon_timeout (gpointer user_data)
+{
+ NMDHCPClient *self = NM_DHCP_CLIENT (user_data);
+ NMDHCPClientPrivate *priv = NM_DHCP_CLIENT_GET_PRIVATE (self);
+
+ priv->timeout_id = 0;
+ nm_log_warn (priv->ipv6 ? LOGD_DHCP6 : LOGD_DHCP4,
+ "(%s): DHCPv%c request timed out.",
+ priv->iface,
+ priv->ipv6 ? '6' : '4');
+ dhcp_client_set_state (self, NM_DHCP_STATE_TIMEOUT, TRUE, FALSE);
+ return G_SOURCE_REMOVE;
+}
+
static void
daemon_watch_cb (GPid pid, gint status, gpointer user_data)
{
@@ -1602,15 +1601,6 @@ nm_dhcp_client_class_init (NMDHCPClientClass *client_class)
NULL, NULL, NULL,
G_TYPE_NONE, 1, G_TYPE_UINT);
- signals[SIGNAL_TIMEOUT] =
- g_signal_new (NM_DHCP_CLIENT_SIGNAL_TIMEOUT,
- G_OBJECT_CLASS_TYPE (object_class),
- G_SIGNAL_RUN_FIRST,
- G_STRUCT_OFFSET (NMDHCPClientClass, timeout),
- NULL, NULL,
- g_cclosure_marshal_VOID__VOID,
- G_TYPE_NONE, 0);
-
signals[SIGNAL_REMOVE] =
g_signal_new (NM_DHCP_CLIENT_SIGNAL_REMOVE,
G_OBJECT_CLASS_TYPE (object_class),
diff --git a/src/dhcp-manager/nm-dhcp-client.h b/src/dhcp-manager/nm-dhcp-client.h
index 9fef69da08..997abb63e6 100644
--- a/src/dhcp-manager/nm-dhcp-client.h
+++ b/src/dhcp-manager/nm-dhcp-client.h
@@ -42,7 +42,6 @@
#define NM_DHCP_CLIENT_PRIORITY "priority"
#define NM_DHCP_CLIENT_TIMEOUT "timeout"
-#define NM_DHCP_CLIENT_SIGNAL_TIMEOUT "timeout"
#define NM_DHCP_CLIENT_SIGNAL_STATE_CHANGED "state-changed"
#define NM_DHCP_CLIENT_SIGNAL_REMOVE "remove"
@@ -93,7 +92,6 @@ typedef struct {
/* Signals */
void (*state_changed) (NMDHCPClient *self, NMDhcpState state);
- void (*timeout) (NMDHCPClient *self);
void (*remove) (NMDHCPClient *self);
} NMDHCPClientClass;
diff --git a/src/dhcp-manager/nm-dhcp-manager.c b/src/dhcp-manager/nm-dhcp-manager.c
index 944345a092..1cc9d92901 100644
--- a/src/dhcp-manager/nm-dhcp-manager.c
+++ b/src/dhcp-manager/nm-dhcp-manager.c
@@ -339,43 +339,36 @@ get_client_type (const char *client, GError **error)
return G_TYPE_INVALID;
}
-#define REMOVE_ID_TAG "remove-id"
-#define TIMEOUT_ID_TAG "timeout-id"
+static void client_state_changed (NMDHCPClient *client, NMDhcpState state, NMDHCPManager *self);
static void
remove_client (NMDHCPManager *self, NMDHCPClient *client)
{
- NMDHCPManagerPrivate *priv = NM_DHCP_MANAGER_GET_PRIVATE (self);
- guint id;
-
- id = GPOINTER_TO_UINT (g_object_get_data (G_OBJECT (client), REMOVE_ID_TAG));
- if (id)
- g_signal_handler_disconnect (client, id);
-
- id = GPOINTER_TO_UINT (g_object_get_data (G_OBJECT (client), TIMEOUT_ID_TAG));
- if (id)
- g_signal_handler_disconnect (client, id);
+ g_signal_handlers_disconnect_by_func (client, remove_client, self);
+ g_signal_handlers_disconnect_by_func (client, client_state_changed, self);
/* Stopping the client is left up to the controlling device
* explicitly since we may want to quit NetworkManager but not terminate
* the DHCP client.
*/
- g_hash_table_remove (priv->clients, client);
+ g_hash_table_remove (NM_DHCP_MANAGER_GET_PRIVATE (self)->clients, client);
+}
+
+static void
+client_state_changed (NMDHCPClient *client, NMDhcpState state, NMDHCPManager *self)
+{
+ if (state == NM_DHCP_STATE_TIMEOUT)
+ remove_client (self, client);
}
static void
add_client (NMDHCPManager *self, NMDHCPClient *client)
{
NMDHCPManagerPrivate *priv = NM_DHCP_MANAGER_GET_PRIVATE (self);
- guint id;
-
- id = g_signal_connect_swapped (client, NM_DHCP_CLIENT_SIGNAL_REMOVE, G_CALLBACK (remove_client), self);
- g_object_set_data (G_OBJECT (client), REMOVE_ID_TAG, GUINT_TO_POINTER (id));
-
- id = g_signal_connect_swapped (client, NM_DHCP_CLIENT_SIGNAL_TIMEOUT, G_CALLBACK (remove_client), self);
- g_object_set_data (G_OBJECT (client), TIMEOUT_ID_TAG, GUINT_TO_POINTER (id));
+ g_signal_connect_swapped (client, NM_DHCP_CLIENT_SIGNAL_REMOVE, G_CALLBACK (remove_client), self);
+ g_signal_connect (client, NM_DHCP_CLIENT_SIGNAL_STATE_CHANGED, G_CALLBACK (client_state_changed), self);
g_hash_table_insert (priv->clients, client, g_object_ref (client));
}