mirror of
https://gitlab.freedesktop.org/NetworkManager/NetworkManager.git
synced 2026-02-11 08:20:30 +01:00
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:
parent
9e75e2ad0d
commit
9568ae52e4
4 changed files with 51 additions and 105 deletions
|
|
@ -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) ||
|
||||
|
|
|
|||
|
|
@ -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),
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
||||
|
|
|
|||
|
|
@ -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));
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue