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.
This commit is contained in:
Dan Williams 2014-05-15 14:11:48 -05:00
parent 9e75e2ad0d
commit 9568ae52e4
4 changed files with 51 additions and 105 deletions

View file

@ -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)
@ -3144,6 +3117,26 @@ dhcp6_fail (NMDevice *device, gboolean timeout)
nm_device_state_changed (device, NM_DEVICE_STATE_FAILED, NM_DEVICE_STATE_REASON_IP_CONFIG_EXPIRED);
}
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,
@ -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) ||

View file

@ -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
};
@ -174,21 +173,6 @@ stop (NMDHCPClient *self, gboolean release, const GByteArray *duid)
priv->info_only = FALSE;
}
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)
{
@ -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),

View file

@ -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;

View file

@ -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));
}