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:
Thomas Haller 2020-10-06 14:18:58 +02:00
commit 47a0f21181
No known key found for this signature in database
GPG key ID: 29C2366E4DFC5728
2 changed files with 53 additions and 43 deletions

View file

@ -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);

View file

@ -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);