mirror of
https://gitlab.freedesktop.org/NetworkManager/NetworkManager.git
synced 2026-01-06 07:20:14 +01:00
dhcp: pass IP config in state signal
Just pass it in the state change signal.
This commit is contained in:
parent
5b4be27f4a
commit
4ce6e39a8f
4 changed files with 54 additions and 74 deletions
|
|
@ -2692,21 +2692,21 @@ dhcp4_fail (NMDevice *device, gboolean timeout)
|
|||
static void
|
||||
dhcp4_state_changed (NMDHCPClient *client,
|
||||
NMDhcpState state,
|
||||
NMIP4Config *ip4_config,
|
||||
gpointer user_data)
|
||||
{
|
||||
NMDevice *device = NM_DEVICE (user_data);
|
||||
NMDevicePrivate *priv = NM_DEVICE_GET_PRIVATE (device);
|
||||
NMIP4Config *config;
|
||||
|
||||
g_return_if_fail (nm_dhcp_client_get_ipv6 (client) == FALSE);
|
||||
g_return_if_fail (!ip4_config || NM_IS_IP4_CONFIG (ip4_config));
|
||||
|
||||
nm_log_dbg (LOGD_DHCP4, "(%s): new DHCPv4 client state %d",
|
||||
nm_device_get_iface (device), state);
|
||||
|
||||
switch (state) {
|
||||
case NM_DHCP_STATE_BOUND:
|
||||
config = nm_dhcp_client_get_ip4_config (priv->dhcp4_client, FALSE);
|
||||
if (!config) {
|
||||
if (!ip4_config) {
|
||||
nm_log_warn (LOGD_DHCP4, "(%s): failed to get IPv4 config in response to DHCP event.",
|
||||
nm_device_get_ip_iface (device));
|
||||
nm_device_state_changed (device,
|
||||
|
|
@ -2723,11 +2723,9 @@ dhcp4_state_changed (NMDHCPClient *client,
|
|||
g_object_notify (G_OBJECT (device), NM_DEVICE_DHCP4_CONFIG);
|
||||
|
||||
if (priv->ip4_state == IP_CONF)
|
||||
nm_device_activate_schedule_ip4_config_result (device, config);
|
||||
nm_device_activate_schedule_ip4_config_result (device, ip4_config);
|
||||
else if (priv->ip4_state == IP_DONE)
|
||||
dhcp4_lease_change (device, config);
|
||||
g_object_unref (config);
|
||||
|
||||
dhcp4_lease_change (device, ip4_config);
|
||||
break;
|
||||
case NM_DHCP_STATE_TIMEOUT:
|
||||
dhcp4_fail (device, TRUE);
|
||||
|
|
@ -3132,12 +3130,14 @@ dhcp6_timeout (NMDevice *self, NMDHCPClient *client)
|
|||
static void
|
||||
dhcp6_state_changed (NMDHCPClient *client,
|
||||
NMDhcpState state,
|
||||
NMIP6Config *ip6_config,
|
||||
gpointer user_data)
|
||||
{
|
||||
NMDevice *device = NM_DEVICE (user_data);
|
||||
NMDevicePrivate *priv = NM_DEVICE_GET_PRIVATE (device);
|
||||
|
||||
g_return_if_fail (nm_dhcp_client_get_ipv6 (client) == TRUE);
|
||||
g_return_if_fail (!ip6_config || NM_IS_IP6_CONFIG (ip6_config));
|
||||
|
||||
nm_log_dbg (LOGD_DHCP6, "(%s): new DHCPv6 client state %d",
|
||||
nm_device_get_iface (device), state);
|
||||
|
|
@ -3145,16 +3145,18 @@ dhcp6_state_changed (NMDHCPClient *client,
|
|||
switch (state) {
|
||||
case NM_DHCP_STATE_BOUND:
|
||||
g_clear_object (&priv->dhcp6_ip6_config);
|
||||
priv->dhcp6_ip6_config = nm_dhcp_client_get_ip6_config (priv->dhcp6_client, FALSE);
|
||||
if (ip6_config) {
|
||||
priv->dhcp6_ip6_config = g_object_ref (ip6_config);
|
||||
|
||||
/* Update the DHCP6 config object with new DHCP options */
|
||||
nm_dhcp6_config_reset (priv->dhcp6_config);
|
||||
if (priv->dhcp6_ip6_config) {
|
||||
nm_dhcp_client_foreach_option (priv->dhcp6_client,
|
||||
dhcp6_add_option_cb,
|
||||
priv->dhcp6_config);
|
||||
/* Update the DHCP6 config object with new DHCP options */
|
||||
nm_dhcp6_config_reset (priv->dhcp6_config);
|
||||
if (priv->dhcp6_ip6_config) {
|
||||
nm_dhcp_client_foreach_option (priv->dhcp6_client,
|
||||
dhcp6_add_option_cb,
|
||||
priv->dhcp6_config);
|
||||
}
|
||||
g_object_notify (G_OBJECT (device), NM_DEVICE_DHCP6_CONFIG);
|
||||
}
|
||||
g_object_notify (G_OBJECT (device), NM_DEVICE_DHCP6_CONFIG);
|
||||
|
||||
if (priv->ip6_state == IP_CONF) {
|
||||
if (priv->dhcp6_ip6_config == NULL) {
|
||||
|
|
|
|||
|
|
@ -175,8 +175,33 @@ stop (NMDHCPClient *self, gboolean release, const GByteArray *duid)
|
|||
void
|
||||
nm_dhcp_client_set_state (NMDHCPClient *self, NMDhcpState state)
|
||||
{
|
||||
NM_DHCP_CLIENT_GET_PRIVATE (self)->state = state;
|
||||
g_signal_emit (G_OBJECT (self), signals[SIGNAL_STATE_CHANGED], 0, state);
|
||||
NMDHCPClientPrivate *priv = NM_DHCP_CLIENT_GET_PRIVATE (self);
|
||||
NMIP4Config *ip4_config = NULL;
|
||||
NMIP6Config *ip6_config = NULL;
|
||||
|
||||
priv->state = state;
|
||||
if (priv->state == NM_DHCP_STATE_BOUND && g_hash_table_size (priv->options)) {
|
||||
if (priv->ipv6) {
|
||||
ip6_config = nm_dhcp_utils_ip6_config_from_options (priv->iface,
|
||||
priv->options,
|
||||
priv->priority,
|
||||
priv->info_only);
|
||||
g_warn_if_fail (ip6_config != NULL);
|
||||
} else {
|
||||
ip4_config = nm_dhcp_utils_ip4_config_from_options (priv->iface,
|
||||
priv->options,
|
||||
priv->priority);
|
||||
g_warn_if_fail (ip4_config != NULL);
|
||||
}
|
||||
}
|
||||
|
||||
g_signal_emit (G_OBJECT (self),
|
||||
signals[SIGNAL_STATE_CHANGED], 0,
|
||||
state,
|
||||
ip6_config ? (GObject *) ip6_config : (GObject *) ip4_config);
|
||||
|
||||
g_clear_object (&ip4_config);
|
||||
g_clear_object (&ip6_config);
|
||||
}
|
||||
|
||||
static gboolean
|
||||
|
|
@ -692,55 +717,6 @@ nm_dhcp_client_foreach_option (NMDHCPClient *self,
|
|||
|
||||
/********************************************/
|
||||
|
||||
NMIP4Config *
|
||||
nm_dhcp_client_get_ip4_config (NMDHCPClient *self, gboolean test)
|
||||
{
|
||||
NMDHCPClientPrivate *priv;
|
||||
|
||||
g_return_val_if_fail (NM_IS_DHCP_CLIENT (self), NULL);
|
||||
|
||||
priv = NM_DHCP_CLIENT_GET_PRIVATE (self);
|
||||
|
||||
if (test && (priv->state != NM_DHCP_STATE_BOUND)) {
|
||||
nm_log_warn (LOGD_DHCP4, "(%s): DHCPv4 client didn't bind to a lease.", priv->iface);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
if (!g_hash_table_size (priv->options)) {
|
||||
/* We never got a response from the DHCP client */
|
||||
return NULL;
|
||||
}
|
||||
|
||||
return nm_dhcp_utils_ip4_config_from_options (priv->iface, priv->options, priv->priority);
|
||||
}
|
||||
|
||||
NMIP6Config *
|
||||
nm_dhcp_client_get_ip6_config (NMDHCPClient *self, gboolean test)
|
||||
{
|
||||
NMDHCPClientPrivate *priv;
|
||||
|
||||
g_return_val_if_fail (NM_IS_DHCP_CLIENT (self), NULL);
|
||||
|
||||
priv = NM_DHCP_CLIENT_GET_PRIVATE (self);
|
||||
|
||||
if (test && (priv->state != NM_DHCP_STATE_BOUND)) {
|
||||
nm_log_warn (LOGD_DHCP6, "(%s): DHCPv6 client didn't bind to a lease.", priv->iface);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
if (!g_hash_table_size (priv->options)) {
|
||||
/* We never got a response from the DHCP client */
|
||||
return NULL;
|
||||
}
|
||||
|
||||
return nm_dhcp_utils_ip6_config_from_options (priv->iface,
|
||||
priv->options,
|
||||
priv->priority,
|
||||
priv->info_only);
|
||||
}
|
||||
|
||||
/********************************************/
|
||||
|
||||
static void
|
||||
nm_dhcp_client_init (NMDHCPClient *self)
|
||||
{
|
||||
|
|
@ -928,6 +904,6 @@ nm_dhcp_client_class_init (NMDHCPClientClass *client_class)
|
|||
G_SIGNAL_RUN_FIRST,
|
||||
G_STRUCT_OFFSET (NMDHCPClientClass, state_changed),
|
||||
NULL, NULL, NULL,
|
||||
G_TYPE_NONE, 1, G_TYPE_UINT);
|
||||
G_TYPE_NONE, 2, G_TYPE_UINT, G_TYPE_OBJECT);
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -90,7 +90,7 @@ typedef struct {
|
|||
GByteArray * (*get_duid) (NMDHCPClient *self);
|
||||
|
||||
/* Signals */
|
||||
void (*state_changed) (NMDHCPClient *self, NMDhcpState state);
|
||||
void (*state_changed) (NMDHCPClient *self, NMDhcpState state, GObject *ip_config);
|
||||
} NMDHCPClientClass;
|
||||
|
||||
GType nm_dhcp_client_get_type (void);
|
||||
|
|
@ -125,10 +125,6 @@ gboolean nm_dhcp_client_foreach_option (NMDHCPClient *self,
|
|||
GHFunc func,
|
||||
gpointer user_data);
|
||||
|
||||
NMIP4Config *nm_dhcp_client_get_ip4_config (NMDHCPClient *self, gboolean test);
|
||||
|
||||
NMIP6Config *nm_dhcp_client_get_ip6_config (NMDHCPClient *self, gboolean test);
|
||||
|
||||
/* Backend helpers for subclasses */
|
||||
void nm_dhcp_client_stop_existing (const char *pid_file, const char *binary_name);
|
||||
|
||||
|
|
|
|||
|
|
@ -337,7 +337,10 @@ get_client_type (const char *client, GError **error)
|
|||
return G_TYPE_INVALID;
|
||||
}
|
||||
|
||||
static void client_state_changed (NMDHCPClient *client, NMDhcpState state, NMDHCPManager *self);
|
||||
static void client_state_changed (NMDHCPClient *client,
|
||||
NMDhcpState state,
|
||||
GObject *ip_config,
|
||||
NMDHCPManager *self);
|
||||
|
||||
static void
|
||||
remove_client (NMDHCPManager *self, NMDHCPClient *client)
|
||||
|
|
@ -353,7 +356,10 @@ remove_client (NMDHCPManager *self, NMDHCPClient *client)
|
|||
}
|
||||
|
||||
static void
|
||||
client_state_changed (NMDHCPClient *client, NMDhcpState state, NMDHCPManager *self)
|
||||
client_state_changed (NMDHCPClient *client,
|
||||
NMDhcpState state,
|
||||
GObject *ip_config,
|
||||
NMDHCPManager *self)
|
||||
{
|
||||
if (state >= NM_DHCP_STATE_TIMEOUT)
|
||||
remove_client (self, client);
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue