summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDan Williams <dcbw@redhat.com>2014-05-22 14:51:55 -0500
committerDan Williams <dcbw@redhat.com>2014-06-06 13:43:45 -0500
commit90242d74a9bca04fdb4ab80801b7d7db024ac064 (patch)
tree548dddb9a0ceff8a38938a86a6fa20231a784efa
parent47622420da876fa8351be0139190b9f17320449b (diff)
downloadNetworkManager-90242d74a9bca04fdb4ab80801b7d7db024ac064.tar.gz
core: consolidate generic device cleanup tasks
dispose() and nm_device_cleanup() both do common tasks; consolidate these common tasks in one place and call when appropriate.
-rw-r--r--src/devices/nm-device.c195
1 files changed, 90 insertions, 105 deletions
diff --git a/src/devices/nm-device.c b/src/devices/nm-device.c
index 308ff2faab..7f73b74e3a 100644
--- a/src/devices/nm-device.c
+++ b/src/devices/nm-device.c
@@ -6259,6 +6259,91 @@ nm_device_has_pending_action (NMDevice *device)
/***********************************************************/
+static void
+_cleanup_generic_pre (NMDevice *self, gboolean deconfigure)
+{
+ NMDevicePrivate *priv = NM_DEVICE_GET_PRIVATE (self);
+
+ /* Clean up when device was deactivated during call to firewall */
+ if (priv->fw_manager) {
+ NMConnection *connection;
+
+ if (priv->fw_call) {
+ nm_firewall_manager_cancel_call (priv->fw_manager, priv->fw_call);
+ priv->fw_call = NULL;
+ }
+
+ connection = nm_device_get_connection (self);
+ if (deconfigure && connection) {
+ nm_firewall_manager_remove_from_zone (priv->fw_manager,
+ nm_device_get_ip_iface (self),
+ NULL);
+ }
+ }
+
+ ip_check_gw_ping_cleanup (self);
+
+ /* Break the activation chain */
+ activation_source_clear (self, TRUE, AF_INET);
+ activation_source_clear (self, TRUE, AF_INET6);
+
+ /* Clear any queued transitions */
+ nm_device_queued_state_clear (self);
+ nm_device_queued_ip_config_change_clear (self);
+
+ priv->ip4_state = priv->ip6_state = IP_NONE;
+
+ dhcp4_cleanup (self, deconfigure, FALSE);
+ arp_cleanup (self);
+ dhcp6_cleanup (self, deconfigure, FALSE);
+ linklocal6_cleanup (self);
+ addrconf6_cleanup (self);
+ dnsmasq_cleanup (self);
+ aipd_cleanup (self);
+}
+
+static void
+_cleanup_generic_post (NMDevice *self, gboolean deconfigure)
+{
+ NMDevicePrivate *priv = NM_DEVICE_GET_PRIVATE (self);
+ NMDeviceStateReason ignored = NM_DEVICE_STATE_REASON_NONE;
+
+ /* Clean up IP configs; this does not actually deconfigure the
+ * interface; the caller must flush routes and addresses explicitly.
+ */
+ nm_device_set_ip4_config (self, NULL, TRUE, &ignored);
+ nm_device_set_ip6_config (self, NULL, TRUE, &ignored);
+ g_clear_object (&priv->dev_ip4_config);
+ g_clear_object (&priv->ext_ip4_config);
+ g_clear_object (&priv->vpn4_config);
+ g_clear_object (&priv->ip4_config);
+ g_clear_object (&priv->ac_ip6_config);
+ g_clear_object (&priv->ext_ip6_config);
+ g_clear_object (&priv->vpn6_config);
+ g_clear_object (&priv->ip6_config);
+
+ clear_act_request (self);
+
+ /* Clear legacy IPv4 address property */
+ if (priv->ip4_address) {
+ priv->ip4_address = 0;
+ g_object_notify (G_OBJECT (self), NM_DEVICE_IP4_ADDRESS);
+ }
+
+ if (deconfigure) {
+ /* Check if the device was deactivated, and if so, delete_link.
+ * Don't call delete_link synchronously because we are currently
+ * handling a state change -- which is not reentrant. */
+ delete_on_deactivate_check_and_schedule (self, nm_device_get_ip_ifindex (self));
+ }
+
+ /* ip_iface should be cleared after flushing all routes and addreses, since
+ * those are identified by ip_iface, not by iface (which might be a tty
+ * or ATM device).
+ */
+ nm_device_set_ip_iface (self, NULL);
+}
+
/*
* nm_device_cleanup
*
@@ -6269,8 +6354,6 @@ static void
nm_device_cleanup (NMDevice *self, NMDeviceStateReason reason)
{
NMDevicePrivate *priv;
- NMDeviceStateReason ignored = NM_DEVICE_STATE_REASON_NONE;
- NMConnection *connection = NULL;
int ifindex;
g_return_if_fail (NM_IS_DEVICE (self));
@@ -6286,39 +6369,7 @@ nm_device_cleanup (NMDevice *self, NMDeviceStateReason reason)
/* Save whether or not we tried IPv6 for later */
priv = NM_DEVICE_GET_PRIVATE (self);
- /* Clean up when device was deactivated during call to firewall */
- if (priv->fw_call) {
- nm_firewall_manager_cancel_call (priv->fw_manager, priv->fw_call);
- priv->fw_call = NULL;
- }
-
- if (priv->act_request)
- connection = nm_act_request_get_connection (priv->act_request);
- if (connection) {
- nm_firewall_manager_remove_from_zone (priv->fw_manager,
- nm_device_get_ip_iface (self),
- NULL);
- }
-
- ip_check_gw_ping_cleanup (self);
-
- /* Break the activation chain */
- activation_source_clear (self, TRUE, AF_INET);
- activation_source_clear (self, TRUE, AF_INET6);
-
- /* Clear any queued transitions */
- nm_device_queued_state_clear (self);
- nm_device_queued_ip_config_change_clear (self);
-
- priv->ip4_state = priv->ip6_state = IP_NONE;
-
- dhcp4_cleanup (self, TRUE, FALSE);
- arp_cleanup (self);
- dhcp6_cleanup (self, TRUE, FALSE);
- linklocal6_cleanup (self);
- addrconf6_cleanup (self);
- dnsmasq_cleanup (self);
- aipd_cleanup (self);
+ _cleanup_generic_pre (self, TRUE);
/* Turn off kernel IPv6 */
nm_device_ipv6_sysctl_set (self, "disable_ipv6", "1");
@@ -6337,9 +6388,6 @@ nm_device_cleanup (NMDevice *self, NMDeviceStateReason reason)
priv->enslaved = FALSE;
g_object_notify (G_OBJECT (self), NM_DEVICE_MASTER);
- /* Tear down an existing activation request */
- clear_act_request (self);
-
/* Take out any entries in the routing table and any IP address the device had. */
ifindex = nm_device_get_ip_ifindex (self);
if (ifindex > 0) {
@@ -6347,28 +6395,7 @@ nm_device_cleanup (NMDevice *self, NMDeviceStateReason reason)
nm_platform_address_flush (ifindex);
}
- /* Clean up nameservers and addresses */
- nm_device_set_ip4_config (self, NULL, TRUE, &ignored);
- nm_device_set_ip6_config (self, NULL, TRUE, &ignored);
- g_clear_object (&priv->ext_ip4_config);
- g_clear_object (&priv->vpn4_config);
- g_clear_object (&priv->vpn6_config);
- g_clear_object (&priv->ext_ip6_config);
-
- /* Clear legacy IPv4 address property */
- priv->ip4_address = 0;
- g_object_notify (G_OBJECT (self), NM_DEVICE_IP4_ADDRESS);
-
- /* Only clear ip_iface after flushing all routes and addreses, since
- * those are identified by ip_iface, not by iface (which might be a tty
- * or ATM device).
- */
- nm_device_set_ip_iface (self, NULL);
-
- /* Check if the device was deactivated, and if so, delete_link.
- * Don't call delete_link synchronously because we are currently
- * handling a state change -- which is not reentrant. */
- delete_on_deactivate_check_and_schedule (self, ifindex);
+ _cleanup_generic_post (self, TRUE);
}
/***********************************************************/
@@ -7123,49 +7150,18 @@ dispose (GObject *object)
}
}
- ip_check_gw_ping_cleanup (self);
-
- /* Clear any queued transitions */
- nm_device_queued_state_clear (self);
- nm_device_queued_ip_config_change_clear (self);
-
- /* Clean up and stop address configuration */
- dhcp4_cleanup (self, deconfigure, FALSE);
- arp_cleanup (self);
- dhcp6_cleanup (self, deconfigure, FALSE);
- linklocal6_cleanup (self);
- addrconf6_cleanup (self);
- dnsmasq_cleanup (self);
- aipd_cleanup (self);
+ _cleanup_generic_pre (self, deconfigure);
g_warn_if_fail (priv->slaves == NULL);
g_assert (priv->master_ready_id == 0);
- /* Take the device itself down and clear its IP configuration */
if (nm_device_get_managed (self) && deconfigure) {
- NMDeviceStateReason ignored = NM_DEVICE_STATE_REASON_NONE;
-
if (nm_device_get_act_request (self))
nm_device_cleanup (self, NM_DEVICE_STATE_REASON_REMOVED);
- nm_device_set_ip4_config (self, NULL, TRUE, &ignored);
- nm_device_set_ip6_config (self, NULL, TRUE, &ignored);
-
nm_device_take_down (self, FALSE);
-
restore_ip6_properties (self);
-
- /* do a final check whether we should delete_link */
- delete_on_deactivate_check_and_schedule (self, nm_device_get_ip_ifindex (self));
}
- g_clear_object (&priv->dev_ip4_config);
- g_clear_object (&priv->ext_ip4_config);
- g_clear_object (&priv->vpn4_config);
- g_clear_object (&priv->ip4_config);
-
- g_clear_object (&priv->ac_ip6_config);
- g_clear_object (&priv->ext_ip6_config);
- g_clear_object (&priv->vpn6_config);
- g_clear_object (&priv->ip6_config);
+ _cleanup_generic_post (self, deconfigure);
g_clear_pointer (&priv->ip6_saved_properties, g_hash_table_unref);
@@ -7191,24 +7187,13 @@ dispose (GObject *object)
priv->carrier_wait_id = 0;
}
- activation_source_clear (self, TRUE, AF_INET);
- activation_source_clear (self, TRUE, AF_INET6);
-
- clear_act_request (self);
g_clear_object (&priv->queued_act_request);
platform = nm_platform_get ();
g_signal_handlers_disconnect_by_func (platform, G_CALLBACK (device_ip_changed), self);
g_signal_handlers_disconnect_by_func (platform, G_CALLBACK (link_changed_cb), self);
- /* Clean up when device was deactivated during call to firewall */
- if (priv->fw_manager) {
- if (priv->fw_call) {
- nm_firewall_manager_cancel_call (priv->fw_manager, priv->fw_call);
- priv->fw_call = NULL;
- }
- g_clear_object (&priv->fw_manager);
- }
+ g_clear_object (&priv->fw_manager);
out:
G_OBJECT_CLASS (nm_device_parent_class)->dispose (object);