dhcp: pass IP config in state signal

Just pass it in the state change signal.
This commit is contained in:
Dan Williams 2014-07-01 09:48:58 -05:00
parent 5b4be27f4a
commit 4ce6e39a8f
4 changed files with 54 additions and 74 deletions

View file

@ -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) {

View file

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

View file

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

View file

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