adapter: Fix storing discoverable setting
authorLuiz Augusto von Dentz <luiz.von.dentz@intel.com>
Thu, 24 Jun 2021 23:32:04 +0000 (16:32 -0700)
committerAyush Garg <ayush.garg@samsung.com>
Fri, 11 Mar 2022 13:38:36 +0000 (19:08 +0530)
discoverable setting shall only be store when changed via Discoverable
property and not when discovery client set it as that be considered
temporary just for the lifetime of the discovery.

Signed-off-by: Anuj Jain <anuj01.jain@samsung.com>
Signed-off-by: Ayush Garg <ayush.garg@samsung.com>
src/adapter.c

index eb1866b..fdb88ed 100644 (file)
@@ -970,7 +970,11 @@ static void settings_changed(struct btd_adapter *adapter, uint32_t settings)
        if (changed_mask & MGMT_SETTING_DISCOVERABLE) {
                g_dbus_emit_property_changed(dbus_conn, adapter->path,
                                        ADAPTER_INTERFACE, "Discoverable");
-               store_adapter_info(adapter);
+               /* Only persist discoverable setting if it was not set
+                * temporarily by discovery.
+                */
+               if (!adapter->discovery_discoverable)
+                       store_adapter_info(adapter);
                btd_adv_manager_refresh(adapter->adv_manager);
        }
 
@@ -3047,8 +3051,6 @@ static bool filters_equal(struct mgmt_cp_start_service_discovery *a,
 static int update_discovery_filter(struct btd_adapter *adapter)
 {
        struct mgmt_cp_start_service_discovery *sd_cp;
-       GSList *l;
-
 
        DBG("");
 
@@ -3058,17 +3060,24 @@ static int update_discovery_filter(struct btd_adapter *adapter)
                return -ENOMEM;
        }
 
-       for (l = adapter->discovery_list; l; l = g_slist_next(l)) {
-               struct discovery_client *client = l->data;
+       /* Only attempt to overwrite current discoverable setting when not
+        * discoverable.
+        */
+       if (!(adapter->current_settings & MGMT_OP_SET_DISCOVERABLE)) {
+               GSList *l;
 
-               if (!client->discovery_filter)
-                       continue;
+               for (l = adapter->discovery_list; l; l = g_slist_next(l)) {
+                       struct discovery_client *client = l->data;
 
-               if (client->discovery_filter->discoverable)
-                       break;
-       }
+                       if (!client->discovery_filter)
+                               continue;
 
-       set_discovery_discoverable(adapter, l ? true : false);
+                       if (client->discovery_filter->discoverable) {
+                               set_discovery_discoverable(adapter, true);
+                               break;
+                       }
+               }
+       }
 
        /*
         * If filters are equal, then don't update scan, except for when
@@ -3109,8 +3118,7 @@ static int discovery_stop(struct discovery_client *client)
                return 0;
        }
 
-       if (adapter->discovery_discoverable)
-               set_discovery_discoverable(adapter, false);
+       set_discovery_discoverable(adapter, false);
 
        /*
         * In the idle phase of a discovery, there is no need to stop it
@@ -12216,6 +12224,7 @@ static void adapter_stop(struct btd_adapter *adapter)
        g_free(adapter->current_discovery_filter);
        adapter->current_discovery_filter = NULL;
 
+       set_discovery_discoverable(adapter, false);
        adapter->discovering = false;
 
        while (adapter->connections) {