summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDan Williams <dcbw@redhat.com>2014-07-01 09:48:58 -0500
committerDan Williams <dcbw@redhat.com>2014-07-22 14:39:19 -0500
commit4ce6e39a8f07994f12d7170c554b60327d117a82 (patch)
tree097057a281ee2ff442aeb2634712e6e77944d322
parent5b4be27f4a4faabb1fddc4b9bd2fb435331fb67d (diff)
downloadNetworkManager-4ce6e39a8f07994f12d7170c554b60327d117a82.tar.gz
dhcp: pass IP config in state signal
Just pass it in the state change signal.
-rw-r--r--src/devices/nm-device.c34
-rw-r--r--src/dhcp-manager/nm-dhcp-client.c80
-rw-r--r--src/dhcp-manager/nm-dhcp-client.h6
-rw-r--r--src/dhcp-manager/nm-dhcp-manager.c10
4 files changed, 55 insertions, 75 deletions
diff --git a/src/devices/nm-device.c b/src/devices/nm-device.c
index 0afdc68a29..d1b34b25ae 100644
--- a/src/devices/nm-device.c
+++ b/src/devices/nm-device.c
@@ -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);
-
- /* 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);
+ 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);
+ }
+ 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) {
diff --git a/src/dhcp-manager/nm-dhcp-client.c b/src/dhcp-manager/nm-dhcp-client.c
index e92366b6c6..6d18dd1b91 100644
--- a/src/dhcp-manager/nm-dhcp-client.c
+++ b/src/dhcp-manager/nm-dhcp-client.c
@@ -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);
}
diff --git a/src/dhcp-manager/nm-dhcp-client.h b/src/dhcp-manager/nm-dhcp-client.h
index e7b3051e00..89cd7cc045 100644
--- a/src/dhcp-manager/nm-dhcp-client.h
+++ b/src/dhcp-manager/nm-dhcp-client.h
@@ -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);
diff --git a/src/dhcp-manager/nm-dhcp-manager.c b/src/dhcp-manager/nm-dhcp-manager.c
index 3a2e52a5db..4275746142 100644
--- a/src/dhcp-manager/nm-dhcp-manager.c
+++ b/src/dhcp-manager/nm-dhcp-manager.c
@@ -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);