about summary refs log tree commit diff
path: root/src/devices/wifi
diff options
context:
space:
mode:
authorMichael Biebl <biebl@debian.org>2020-10-20 22:07:24 +0200
committerMichael Biebl <biebl@debian.org>2020-10-20 22:07:24 +0200
commitf2ddac4cbc895837ddcc55015fae112f9859cd0a (patch)
tree774424baed3e65adb78c34e25874cf4e781ac005 /src/devices/wifi
parentaafc1dbe4712c86189bbc1d4d54ad8cb4c69be7e (diff)
New upstream version 1.27.91 upstream/1.27.91
Diffstat (limited to 'src/devices/wifi')
-rw-r--r--src/devices/wifi/nm-device-iwd.c44
-rw-r--r--src/devices/wifi/nm-iwd-manager.c52
-rw-r--r--src/devices/wifi/nm-wifi-p2p-peer.c15
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);
 }