diff options
Diffstat (limited to 'src/devices/wifi')
| -rw-r--r-- | src/devices/wifi/nm-device-iwd.c | 44 | ||||
| -rw-r--r-- | src/devices/wifi/nm-iwd-manager.c | 52 | ||||
| -rw-r--r-- | src/devices/wifi/nm-wifi-p2p-peer.c | 15 |
3 files changed, 65 insertions, 46 deletions
diff --git a/src/devices/wifi/nm-device-iwd.c b/src/devices/wifi/nm-device-iwd.c index fb113f83..64ac3de7 100644 --- a/src/devices/wifi/nm-device-iwd.c +++ b/src/devices/wifi/nm-device-iwd.c @@ -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); diff --git a/src/devices/wifi/nm-iwd-manager.c b/src/devices/wifi/nm-iwd-manager.c index bdff20ac..6a562014 100644 --- a/src/devices/wifi/nm-iwd-manager.c +++ b/src/devices/wifi/nm-iwd-manager.c @@ -632,6 +632,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) { NMIwdManager * self = user_data; @@ -697,22 +729,6 @@ _om_has_name_owner(GDBusObjectManager *object_manager) } 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) { NMIwdManagerPrivate *priv = NM_IWD_MANAGER_GET_PRIVATE(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); diff --git a/src/devices/wifi/nm-wifi-p2p-peer.c b/src/devices/wifi/nm-wifi-p2p-peer.c index fe6ad0a0..a194f168 100644 --- a/src/devices/wifi/nm-wifi-p2p-peer.c +++ b/src/devices/wifi/nm-wifi-p2p-peer.c @@ -47,7 +47,8 @@ struct _NMWifiP2PPeerPrivate { char *address; GBytes *wfd_ies; - char ** groups; + + const char **groups; guint8 strength; @@ -281,7 +282,7 @@ nm_wifi_p2p_peer_get_groups(const NMWifiP2PPeer *peer) { g_return_val_if_fail(NM_IS_WIFI_P2P_PEER(peer), NULL); - return (const char *const *) NM_WIFI_P2P_PEER_GET_PRIVATE(peer)->groups; + return NM_WIFI_P2P_PEER_GET_PRIVATE(peer)->groups; } const char * @@ -404,6 +405,14 @@ nm_wifi_p2p_peer_update_from_properties(NMWifiP2PPeer *peer, const NMSupplicantP changed |= nm_wifi_p2p_peer_set_wfd_ies(peer, peer_info->ies); changed |= nm_wifi_p2p_peer_set_last_seen(peer, peer_info->last_seen_msec / 1000u); + /* We currently only use the groups information internally to check if + * the peer is still joined. */ + if (!_nm_utils_strv_equal((char **) priv->groups, (char **) peer_info->groups)) { + g_free(priv->groups); + priv->groups = nm_utils_strv_dup_packed(peer_info->groups, -1); + changed |= TRUE; + } + g_object_thaw_notify(G_OBJECT(peer)); return changed; @@ -566,7 +575,7 @@ finalize(GObject *object) g_free(priv->serial); g_free(priv->address); g_bytes_unref(priv->wfd_ies); - g_strfreev(priv->groups); + g_free(priv->groups); G_OBJECT_CLASS(nm_wifi_p2p_peer_parent_class)->finalize(object); } |