mirror of
https://gitlab.freedesktop.org/NetworkManager/NetworkManager.git
synced 2026-05-08 06:38:11 +02:00
core: rework tracking of auto-activating devices in NMPolicy
Hook the information for tracking the activation of a device, to the NMDevice itself. Sure, that slightly couples the NMPolicy closer to NMDevice, but the result is still simpler code because we don't need a separate ActivateData. It also means we can immediately tell whether the auto activation check for NMDevice is already scheduled and don't need to search through the list.
This commit is contained in:
parent
520fcc8667
commit
a22e5080a0
3 changed files with 44 additions and 56 deletions
|
|
@ -17945,6 +17945,7 @@ nm_device_init(NMDevice *self)
|
||||||
c_list_init(&priv->concheck_lst_head);
|
c_list_init(&priv->concheck_lst_head);
|
||||||
c_list_init(&self->devices_lst);
|
c_list_init(&self->devices_lst);
|
||||||
c_list_init(&self->devcon_dev_lst_head);
|
c_list_init(&self->devcon_dev_lst_head);
|
||||||
|
c_list_init(&self->policy_auto_activate_lst);
|
||||||
c_list_init(&priv->slaves);
|
c_list_init(&priv->slaves);
|
||||||
|
|
||||||
priv->ipdhcp_data_6.v6.mode = NM_NDISC_DHCP_LEVEL_NONE;
|
priv->ipdhcp_data_6.v6.mode = NM_NDISC_DHCP_LEVEL_NONE;
|
||||||
|
|
@ -18066,6 +18067,8 @@ dispose(GObject *object)
|
||||||
|
|
||||||
nm_assert(c_list_is_empty(&self->devices_lst));
|
nm_assert(c_list_is_empty(&self->devices_lst));
|
||||||
nm_assert(c_list_is_empty(&self->devcon_dev_lst_head));
|
nm_assert(c_list_is_empty(&self->devcon_dev_lst_head));
|
||||||
|
nm_assert(c_list_is_empty(&self->policy_auto_activate_lst));
|
||||||
|
nm_assert(!self->policy_auto_activate_idle_source);
|
||||||
|
|
||||||
while ((con_handle = c_list_first_entry(&priv->concheck_lst_head,
|
while ((con_handle = c_list_first_entry(&priv->concheck_lst_head,
|
||||||
NMDeviceConnectivityHandle,
|
NMDeviceConnectivityHandle,
|
||||||
|
|
|
||||||
|
|
@ -144,6 +144,9 @@ struct _NMDevice {
|
||||||
struct _NMDevicePrivate *_priv;
|
struct _NMDevicePrivate *_priv;
|
||||||
CList devices_lst;
|
CList devices_lst;
|
||||||
CList devcon_dev_lst_head;
|
CList devcon_dev_lst_head;
|
||||||
|
|
||||||
|
CList policy_auto_activate_lst;
|
||||||
|
GSource *policy_auto_activate_idle_source;
|
||||||
};
|
};
|
||||||
|
|
||||||
/* The flags have an relaxing meaning, that means, specifying more flags, can make
|
/* The flags have an relaxing meaning, that means, specifying more flags, can make
|
||||||
|
|
|
||||||
|
|
@ -51,7 +51,7 @@ typedef struct {
|
||||||
NMManager *manager;
|
NMManager *manager;
|
||||||
NMNetns *netns;
|
NMNetns *netns;
|
||||||
NMFirewalldManager *firewalld_manager;
|
NMFirewalldManager *firewalld_manager;
|
||||||
CList pending_activation_checks;
|
CList policy_auto_activate_lst_head;
|
||||||
|
|
||||||
NMAgentManager *agent_mgr;
|
NMAgentManager *agent_mgr;
|
||||||
|
|
||||||
|
|
@ -1282,23 +1282,6 @@ check_activating_active_connections(NMPolicy *self)
|
||||||
g_object_thaw_notify(G_OBJECT(self));
|
g_object_thaw_notify(G_OBJECT(self));
|
||||||
}
|
}
|
||||||
|
|
||||||
typedef struct {
|
|
||||||
CList pending_lst;
|
|
||||||
NMPolicy *policy;
|
|
||||||
NMDevice *device;
|
|
||||||
guint autoactivate_id;
|
|
||||||
} ActivateData;
|
|
||||||
|
|
||||||
static void
|
|
||||||
activate_data_free(ActivateData *data)
|
|
||||||
{
|
|
||||||
nm_device_remove_pending_action(data->device, NM_PENDING_ACTION_AUTOACTIVATE, TRUE);
|
|
||||||
c_list_unlink_stale(&data->pending_lst);
|
|
||||||
nm_clear_g_source(&data->autoactivate_id);
|
|
||||||
g_object_unref(data->device);
|
|
||||||
g_slice_free(ActivateData, data);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
static void
|
||||||
pending_ac_gone(gpointer data, GObject *where_the_object_was)
|
pending_ac_gone(gpointer data, GObject *where_the_object_was)
|
||||||
{
|
{
|
||||||
|
|
@ -1348,7 +1331,7 @@ pending_ac_state_changed(NMActiveConnection *ac, guint state, guint reason, NMPo
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
auto_activate_device(NMPolicy *self, NMDevice *device)
|
_auto_activate_device(NMPolicy *self, NMDevice *device)
|
||||||
{
|
{
|
||||||
NMPolicyPrivate *priv;
|
NMPolicyPrivate *priv;
|
||||||
NMSettingsConnection *best_connection;
|
NMSettingsConnection *best_connection;
|
||||||
|
|
@ -1461,32 +1444,34 @@ auto_activate_device(NMPolicy *self, NMDevice *device)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static gboolean
|
static void
|
||||||
auto_activate_device_cb(gpointer user_data)
|
_auto_activate_device_clear(NMPolicy *self, NMDevice *device, gboolean do_activate)
|
||||||
{
|
{
|
||||||
ActivateData *data = user_data;
|
nm_assert(NM_IS_DEVICE(device));
|
||||||
|
nm_assert(NM_IS_POLICY(self));
|
||||||
|
nm_assert(c_list_is_linked(&device->policy_auto_activate_lst));
|
||||||
|
nm_assert(c_list_contains(&NM_POLICY_GET_PRIVATE(self)->policy_auto_activate_lst_head,
|
||||||
|
&device->policy_auto_activate_lst));
|
||||||
|
|
||||||
g_assert(data);
|
c_list_unlink(&device->policy_auto_activate_lst);
|
||||||
g_assert(NM_IS_POLICY(data->policy));
|
nm_clear_g_source_inst(&device->policy_auto_activate_idle_source);
|
||||||
g_assert(NM_IS_DEVICE(data->device));
|
|
||||||
|
|
||||||
data->autoactivate_id = 0;
|
if (do_activate)
|
||||||
auto_activate_device(data->policy, data->device);
|
_auto_activate_device(self, device);
|
||||||
activate_data_free(data);
|
|
||||||
return G_SOURCE_REMOVE;
|
nm_device_remove_pending_action(device, NM_PENDING_ACTION_AUTOACTIVATE, TRUE);
|
||||||
|
g_object_unref(device);
|
||||||
}
|
}
|
||||||
|
|
||||||
static ActivateData *
|
static gboolean
|
||||||
find_pending_activation(NMPolicy *self, NMDevice *device)
|
_auto_activate_idle_cb(gpointer user_data)
|
||||||
{
|
{
|
||||||
NMPolicyPrivate *priv = NM_POLICY_GET_PRIVATE(self);
|
NMDevice *device = user_data;
|
||||||
ActivateData *data;
|
|
||||||
|
|
||||||
c_list_for_each_entry (data, &priv->pending_activation_checks, pending_lst) {
|
nm_assert(NM_IS_DEVICE(device));
|
||||||
if (data->device == device)
|
|
||||||
return data;
|
_auto_activate_device_clear(nm_manager_get_policy(nm_device_get_manager(device)), device, TRUE);
|
||||||
}
|
return G_SOURCE_CONTINUE;
|
||||||
return NULL;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
|
|
@ -1673,13 +1658,17 @@ void
|
||||||
nm_policy_device_recheck_auto_activate_schedule(NMPolicy *self, NMDevice *device)
|
nm_policy_device_recheck_auto_activate_schedule(NMPolicy *self, NMDevice *device)
|
||||||
{
|
{
|
||||||
NMPolicyPrivate *priv;
|
NMPolicyPrivate *priv;
|
||||||
ActivateData *data;
|
|
||||||
NMActiveConnection *ac;
|
NMActiveConnection *ac;
|
||||||
const CList *tmp_list;
|
const CList *tmp_list;
|
||||||
|
|
||||||
g_return_if_fail(NM_IS_POLICY(self));
|
g_return_if_fail(NM_IS_POLICY(self));
|
||||||
g_return_if_fail(NM_IS_DEVICE(device));
|
g_return_if_fail(NM_IS_DEVICE(device));
|
||||||
|
|
||||||
|
if (!c_list_is_empty(&device->policy_auto_activate_lst)) {
|
||||||
|
/* already queued. Return. */
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
priv = NM_POLICY_GET_PRIVATE(self);
|
priv = NM_POLICY_GET_PRIVATE(self);
|
||||||
|
|
||||||
if (nm_manager_get_state(priv->manager) == NM_STATE_ASLEEP)
|
if (nm_manager_get_state(priv->manager) == NM_STATE_ASLEEP)
|
||||||
|
|
@ -1688,9 +1677,6 @@ nm_policy_device_recheck_auto_activate_schedule(NMPolicy *self, NMDevice *device
|
||||||
if (!nm_device_autoconnect_allowed(device))
|
if (!nm_device_autoconnect_allowed(device))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if (find_pending_activation(self, device))
|
|
||||||
return;
|
|
||||||
|
|
||||||
nm_manager_for_each_active_connection (priv->manager, ac, tmp_list) {
|
nm_manager_for_each_active_connection (priv->manager, ac, tmp_list) {
|
||||||
if (nm_active_connection_get_device(ac) == device) {
|
if (nm_active_connection_get_device(ac) == device) {
|
||||||
if (nm_device_sys_iface_state_is_external(device)
|
if (nm_device_sys_iface_state_is_external(device)
|
||||||
|
|
@ -1703,11 +1689,9 @@ nm_policy_device_recheck_auto_activate_schedule(NMPolicy *self, NMDevice *device
|
||||||
|
|
||||||
nm_device_add_pending_action(device, NM_PENDING_ACTION_AUTOACTIVATE, TRUE);
|
nm_device_add_pending_action(device, NM_PENDING_ACTION_AUTOACTIVATE, TRUE);
|
||||||
|
|
||||||
data = g_slice_new0(ActivateData);
|
c_list_link_tail(&priv->policy_auto_activate_lst_head, &device->policy_auto_activate_lst);
|
||||||
data->policy = self;
|
device->policy_auto_activate_idle_source = nm_g_idle_add_source(_auto_activate_idle_cb, device);
|
||||||
data->device = g_object_ref(device);
|
g_object_ref(device);
|
||||||
data->autoactivate_id = g_idle_add(auto_activate_device_cb, data);
|
|
||||||
c_list_link_tail(&priv->pending_activation_checks, &data->pending_lst);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static gboolean
|
static gboolean
|
||||||
|
|
@ -2326,16 +2310,13 @@ device_removed(NMManager *manager, NMDevice *device, gpointer user_data)
|
||||||
{
|
{
|
||||||
NMPolicyPrivate *priv = user_data;
|
NMPolicyPrivate *priv = user_data;
|
||||||
NMPolicy *self = _PRIV_TO_SELF(priv);
|
NMPolicy *self = _PRIV_TO_SELF(priv);
|
||||||
ActivateData *data;
|
|
||||||
|
|
||||||
/* TODO: is this needed? The delegations are cleaned up
|
/* TODO: is this needed? The delegations are cleaned up
|
||||||
* on transition to deactivated too. */
|
* on transition to deactivated too. */
|
||||||
ip6_remove_device_prefix_delegations(self, device);
|
ip6_remove_device_prefix_delegations(self, device);
|
||||||
|
|
||||||
/* Clear any idle callbacks for this device */
|
if (c_list_is_linked(&device->policy_auto_activate_lst))
|
||||||
data = find_pending_activation(self, device);
|
_auto_activate_device_clear(self, device, FALSE);
|
||||||
if (data && data->autoactivate_id)
|
|
||||||
activate_data_free(data);
|
|
||||||
|
|
||||||
if (g_hash_table_remove(priv->devices, device))
|
if (g_hash_table_remove(priv->devices, device))
|
||||||
devices_list_unregister(self, device);
|
devices_list_unregister(self, device);
|
||||||
|
|
@ -2747,7 +2728,7 @@ nm_policy_init(NMPolicy *self)
|
||||||
NMPolicyPrivate *priv = NM_POLICY_GET_PRIVATE(self);
|
NMPolicyPrivate *priv = NM_POLICY_GET_PRIVATE(self);
|
||||||
gs_free char *hostname_mode = NULL;
|
gs_free char *hostname_mode = NULL;
|
||||||
|
|
||||||
c_list_init(&priv->pending_activation_checks);
|
c_list_init(&priv->policy_auto_activate_lst_head);
|
||||||
|
|
||||||
priv->netns = g_object_ref(nm_netns_get());
|
priv->netns = g_object_ref(nm_netns_get());
|
||||||
|
|
||||||
|
|
@ -2885,7 +2866,6 @@ dispose(GObject *object)
|
||||||
NMPolicyPrivate *priv = NM_POLICY_GET_PRIVATE(self);
|
NMPolicyPrivate *priv = NM_POLICY_GET_PRIVATE(self);
|
||||||
GHashTableIter h_iter;
|
GHashTableIter h_iter;
|
||||||
NMDevice *device;
|
NMDevice *device;
|
||||||
ActivateData *data, *data_safe;
|
|
||||||
|
|
||||||
nm_clear_g_object(&priv->default_ac4);
|
nm_clear_g_object(&priv->default_ac4);
|
||||||
nm_clear_g_object(&priv->default_ac6);
|
nm_clear_g_object(&priv->default_ac6);
|
||||||
|
|
@ -2893,8 +2873,10 @@ dispose(GObject *object)
|
||||||
nm_clear_g_object(&priv->activating_ac6);
|
nm_clear_g_object(&priv->activating_ac6);
|
||||||
nm_clear_pointer(&priv->pending_active_connections, g_hash_table_unref);
|
nm_clear_pointer(&priv->pending_active_connections, g_hash_table_unref);
|
||||||
|
|
||||||
c_list_for_each_entry_safe (data, data_safe, &priv->pending_activation_checks, pending_lst)
|
while ((device = c_list_first_entry(&priv->policy_auto_activate_lst_head,
|
||||||
activate_data_free(data);
|
NMDevice,
|
||||||
|
policy_auto_activate_lst)))
|
||||||
|
_auto_activate_device_clear(self, device, FALSE);
|
||||||
|
|
||||||
g_slist_free_full(priv->pending_secondaries, (GDestroyNotify) pending_secondary_data_free);
|
g_slist_free_full(priv->pending_secondaries, (GDestroyNotify) pending_secondary_data_free);
|
||||||
priv->pending_secondaries = NULL;
|
priv->pending_secondaries = NULL;
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue