diff options
author | Dan Williams <dcbw@redhat.com> | 2014-07-01 09:48:58 -0500 |
---|---|---|
committer | Dan Williams <dcbw@redhat.com> | 2014-07-18 17:03:28 -0500 |
commit | 1478040b252ccf09bce7ccc141549c268f35418a (patch) | |
tree | ea5198d18cbb4f6f6f3fe47696a5943fd5bdc18f | |
parent | eb9a2dafc5479d55d0576478084242804ce3955c (diff) | |
download | NetworkManager-1478040b252ccf09bce7ccc141549c268f35418a.tar.gz |
dhcp: pass IP config in state signal
Just pass it in the state change signal.
-rw-r--r-- | src/devices/nm-device.c | 34 | ||||
-rw-r--r-- | src/dhcp-manager/nm-dhcp-client.c | 80 | ||||
-rw-r--r-- | src/dhcp-manager/nm-dhcp-client.h | 6 | ||||
-rw-r--r-- | src/dhcp-manager/nm-dhcp-manager.c | 10 |
4 files changed, 55 insertions, 75 deletions
diff --git a/src/devices/nm-device.c b/src/devices/nm-device.c index d877c47f8e..e5d801ba76 100644 --- a/src/devices/nm-device.c +++ b/src/devices/nm-device.c @@ -2691,21 +2691,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, @@ -2722,11 +2722,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); @@ -3131,12 +3129,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); @@ -3144,16 +3144,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 3e56338d72..12a69b038a 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 @@ -691,55 +716,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) { @@ -927,6 +903,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); |