diff options
author | Dan Williams <dcbw@redhat.com> | 2014-05-15 14:11:48 -0500 |
---|---|---|
committer | Dan Williams <dcbw@redhat.com> | 2014-07-22 14:39:18 -0500 |
commit | 9568ae52e4f8747b3773a8fd27bd03df5240fd4d (patch) | |
tree | da7552583ce9566e7b81f01d661d6ce5cb2c4fbc | |
parent | 9e75e2ad0d803f88b3facb8ec15ecf9a3ef3c590 (diff) | |
download | NetworkManager-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.c | 79 | ||||
-rw-r--r-- | src/dhcp-manager/nm-dhcp-client.c | 42 | ||||
-rw-r--r-- | src/dhcp-manager/nm-dhcp-client.h | 2 | ||||
-rw-r--r-- | src/dhcp-manager/nm-dhcp-manager.c | 33 |
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)); } |