mirror of
https://gitlab.freedesktop.org/NetworkManager/NetworkManager.git
synced 2026-05-01 21:58:00 +02:00
wifi/iwd: merge branch 'balrog-kun:iwd-fixes'
https://gitlab.freedesktop.org/NetworkManager/NetworkManager/-/merge_requests/640
(cherry picked from commit 838c3d6795)
This commit is contained in:
commit
47a0f21181
2 changed files with 53 additions and 43 deletions
|
|
@ -1952,36 +1952,39 @@ schedule_periodic_scan(NMDeviceIwd *self, gboolean initial_scan)
|
|||
{
|
||||
NMDeviceIwdPrivate *priv = NM_DEVICE_IWD_GET_PRIVATE(self);
|
||||
GVariant * value;
|
||||
gboolean disconnected;
|
||||
gboolean disconnected = TRUE;
|
||||
guint interval;
|
||||
|
||||
if (!priv->can_scan || priv->scan_requested)
|
||||
return;
|
||||
|
||||
value = g_dbus_proxy_get_cached_property(priv->dbus_station_proxy, "State");
|
||||
disconnected = nm_streq0(get_variant_state(value), "disconnected");
|
||||
g_variant_unref(value);
|
||||
if (priv->can_scan) {
|
||||
value = g_dbus_proxy_get_cached_property(priv->dbus_station_proxy, "State");
|
||||
disconnected = nm_streq0(get_variant_state(value), "disconnected");
|
||||
g_variant_unref(value);
|
||||
}
|
||||
|
||||
/* Start scan immediately after a disconnect, mode change or
|
||||
* device UP, otherwise wait a period dependent on the current
|
||||
* state.
|
||||
* device UP, otherwise wait 10 seconds. When connected, update
|
||||
* AP list mainly on UI requests.
|
||||
*
|
||||
* (initial_scan && disconnected) override priv->scanning below
|
||||
* because of an IWD quirk where a device will often be in the
|
||||
* autoconnect state and scanning at the time of our initial_scan,
|
||||
* but our logic will the send it a Disconnect() causing IWD to
|
||||
* but our logic will then send it a Disconnect() causing IWD to
|
||||
* exit autoconnect and interrupt the ongoing scan, meaning that
|
||||
* we still want a new scan ASAP.
|
||||
*/
|
||||
if (initial_scan && disconnected)
|
||||
if (!priv->can_scan || !disconnected || priv->scan_requested || priv->scanning)
|
||||
interval = -1;
|
||||
else if (initial_scan)
|
||||
interval = 0;
|
||||
else if (!priv->periodic_scan_id && !priv->scanning)
|
||||
interval = disconnected ? 10 : 20;
|
||||
else if (!priv->periodic_scan_id)
|
||||
interval = 10;
|
||||
else
|
||||
return;
|
||||
|
||||
nm_clear_g_source(&priv->periodic_scan_id);
|
||||
priv->periodic_scan_id = g_timeout_add_seconds(interval, periodic_scan_timeout_cb, self);
|
||||
|
||||
if (interval != (guint) -1)
|
||||
priv->periodic_scan_id = g_timeout_add_seconds(interval, periodic_scan_timeout_cb, self);
|
||||
}
|
||||
|
||||
static void
|
||||
|
|
@ -2384,7 +2387,6 @@ powered_changed(NMDeviceIwd *self, gboolean new_powered)
|
|||
update_aps(self);
|
||||
} else {
|
||||
set_can_scan(self, FALSE);
|
||||
nm_clear_g_source(&priv->periodic_scan_id);
|
||||
priv->scanning = FALSE;
|
||||
priv->scan_requested = FALSE;
|
||||
priv->can_connect = FALSE;
|
||||
|
|
@ -2600,17 +2602,7 @@ dispose(GObject *object)
|
|||
|
||||
nm_clear_g_cancellable(&priv->cancellable);
|
||||
|
||||
nm_clear_g_source(&priv->periodic_scan_id);
|
||||
|
||||
cleanup_association_attempt(self, TRUE);
|
||||
|
||||
g_clear_object(&priv->dbus_device_proxy);
|
||||
g_clear_object(&priv->dbus_station_proxy);
|
||||
g_clear_object(&priv->dbus_ap_proxy);
|
||||
g_clear_object(&priv->dbus_adhoc_proxy);
|
||||
g_clear_object(&priv->dbus_obj);
|
||||
|
||||
remove_all_aps(self);
|
||||
nm_device_iwd_set_dbus_object(self, NULL);
|
||||
|
||||
G_OBJECT_CLASS(nm_device_iwd_parent_class)->dispose(object);
|
||||
|
||||
|
|
|
|||
|
|
@ -631,6 +631,38 @@ interface_removed(GDBusObjectManager *object_manager,
|
|||
}
|
||||
}
|
||||
|
||||
static void
|
||||
object_added(GDBusObjectManager *object_manager, GDBusObject *object, gpointer user_data)
|
||||
{
|
||||
GList *interfaces, *iter;
|
||||
|
||||
interfaces = g_dbus_object_get_interfaces(object);
|
||||
|
||||
for (iter = interfaces; iter; iter = iter->next) {
|
||||
GDBusInterface *interface = G_DBUS_INTERFACE(iter->data);
|
||||
|
||||
interface_added(NULL, object, interface, user_data);
|
||||
}
|
||||
|
||||
g_list_free_full(interfaces, g_object_unref);
|
||||
}
|
||||
|
||||
static void
|
||||
object_removed(GDBusObjectManager *object_manager, GDBusObject *object, gpointer user_data)
|
||||
{
|
||||
GList *interfaces, *iter;
|
||||
|
||||
interfaces = g_dbus_object_get_interfaces(object);
|
||||
|
||||
for (iter = interfaces; iter; iter = iter->next) {
|
||||
GDBusInterface *interface = G_DBUS_INTERFACE(iter->data);
|
||||
|
||||
interface_removed(NULL, object, interface, user_data);
|
||||
}
|
||||
|
||||
g_list_free_full(interfaces, g_object_unref);
|
||||
}
|
||||
|
||||
static void
|
||||
connection_removed(NMSettings *settings, NMSettingsConnection *sett_conn, gpointer user_data)
|
||||
{
|
||||
|
|
@ -696,22 +728,6 @@ _om_has_name_owner(GDBusObjectManager *object_manager)
|
|||
return !!name_owner;
|
||||
}
|
||||
|
||||
static void
|
||||
object_added(NMIwdManager *self, GDBusObject *object)
|
||||
{
|
||||
GList *interfaces, *iter;
|
||||
|
||||
interfaces = g_dbus_object_get_interfaces(object);
|
||||
|
||||
for (iter = interfaces; iter; iter = iter->next) {
|
||||
GDBusInterface *interface = G_DBUS_INTERFACE(iter->data);
|
||||
|
||||
interface_added(NULL, object, interface, self);
|
||||
}
|
||||
|
||||
g_list_free_full(interfaces, g_object_unref);
|
||||
}
|
||||
|
||||
static void
|
||||
release_object_manager(NMIwdManager *self)
|
||||
{
|
||||
|
|
@ -852,12 +868,14 @@ got_object_manager(GObject *object, GAsyncResult *result, gpointer user_data)
|
|||
"interface-removed",
|
||||
G_CALLBACK(interface_removed),
|
||||
self);
|
||||
g_signal_connect(priv->object_manager, "object-added", G_CALLBACK(object_added), self);
|
||||
g_signal_connect(priv->object_manager, "object-removed", G_CALLBACK(object_removed), self);
|
||||
|
||||
g_hash_table_remove_all(priv->known_networks);
|
||||
|
||||
objects = g_dbus_object_manager_get_objects(object_manager);
|
||||
for (iter = objects; iter; iter = iter->next)
|
||||
object_added(self, G_DBUS_OBJECT(iter->data));
|
||||
object_added(NULL, G_DBUS_OBJECT(iter->data), self);
|
||||
|
||||
g_list_free_full(objects, g_object_unref);
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue