* [PATCH BlueZ] adapter: Fix not removing client from discovery list
@ 2020-05-28 22:15 Luiz Augusto von Dentz
2020-05-29 20:30 ` Luiz Augusto von Dentz
0 siblings, 1 reply; 2+ messages in thread
From: Luiz Augusto von Dentz @ 2020-05-28 22:15 UTC (permalink / raw)
To: linux-bluetooth
From: Luiz Augusto von Dentz <luiz.von.dentz@intel.com>
If command MGMT_OP_START_DISCOVERY fails we reply with btd_error_busy
but we don't remove the client from the list which would prevent the
client to start it once again.
---
src/adapter.c | 225 +++++++++++++++++++++++++-------------------------
1 file changed, 113 insertions(+), 112 deletions(-)
diff --git a/src/adapter.c b/src/adapter.c
index 972d88772..c3d60697a 100644
--- a/src/adapter.c
+++ b/src/adapter.c
@@ -1468,6 +1468,118 @@ static void free_discovery_filter(struct discovery_filter *discovery_filter)
g_free(discovery_filter);
}
+static void invalidate_rssi_and_tx_power(gpointer a)
+{
+ struct btd_device *dev = a;
+
+ device_set_rssi(dev, 0);
+ device_set_tx_power(dev, 127);
+}
+
+static gboolean remove_temp_devices(gpointer user_data)
+{
+ struct btd_adapter *adapter = user_data;
+ GSList *l, *next;
+
+ DBG("%s", adapter->path);
+
+ adapter->temp_devices_timeout = 0;
+
+ for (l = adapter->devices; l != NULL; l = next) {
+ struct btd_device *dev = l->data;
+
+ next = g_slist_next(l);
+
+ if (device_is_temporary(dev) && !btd_device_is_connected(dev))
+ btd_adapter_remove_device(adapter, dev);
+ }
+
+ return FALSE;
+}
+
+static void discovery_cleanup(struct btd_adapter *adapter)
+{
+ GSList *l, *next;
+
+ adapter->discovery_type = 0x00;
+
+ if (adapter->discovery_idle_timeout > 0) {
+ g_source_remove(adapter->discovery_idle_timeout);
+ adapter->discovery_idle_timeout = 0;
+ }
+
+ if (adapter->temp_devices_timeout > 0) {
+ g_source_remove(adapter->temp_devices_timeout);
+ adapter->temp_devices_timeout = 0;
+ }
+
+ g_slist_free_full(adapter->discovery_found,
+ invalidate_rssi_and_tx_power);
+ adapter->discovery_found = NULL;
+
+ if (!adapter->devices)
+ return;
+
+ for (l = adapter->devices; l != NULL; l = next) {
+ struct btd_device *dev = l->data;
+
+ next = g_slist_next(l);
+
+ if (device_is_temporary(dev) && !device_is_connectable(dev))
+ btd_adapter_remove_device(adapter, dev);
+ }
+
+ adapter->temp_devices_timeout = g_timeout_add_seconds(TEMP_DEV_TIMEOUT,
+ remove_temp_devices, adapter);
+}
+
+static void discovery_free(void *user_data)
+{
+ struct watch_client *client = user_data;
+
+ if (client->watch)
+ g_dbus_remove_watch(dbus_conn, client->watch);
+
+ if (client->discovery_filter) {
+ free_discovery_filter(client->discovery_filter);
+ client->discovery_filter = NULL;
+ }
+
+ if (client->msg)
+ dbus_message_unref(client->msg);
+
+ g_free(client->owner);
+ g_free(client);
+}
+
+static void discovery_remove(struct watch_client *client, bool exit)
+{
+ struct btd_adapter *adapter = client->adapter;
+
+ DBG("owner %s", client->owner);
+
+ adapter->set_filter_list = g_slist_remove(adapter->set_filter_list,
+ client);
+
+ adapter->discovery_list = g_slist_remove(adapter->discovery_list,
+ client);
+
+ if (!exit && client->discovery_filter)
+ adapter->set_filter_list = g_slist_prepend(
+ adapter->set_filter_list, client);
+ else
+ discovery_free(client);
+
+ /*
+ * If there are other client discoveries in progress, then leave
+ * it active. If not, then make sure to stop the restart timeout.
+ */
+ if (adapter->discovery_list)
+ return;
+
+ discovery_cleanup(adapter);
+}
+
static void trigger_start_discovery(struct btd_adapter *adapter, guint delay);
static void start_discovery_complete(uint8_t status, uint16_t length,
@@ -1538,6 +1650,7 @@ fail:
reply = btd_error_busy(client->msg);
g_dbus_send_message(dbus_conn, reply);
g_dbus_remove_watch(dbus_conn, client->watch);
+ discovery_remove(client, false);
return;
}
@@ -1784,90 +1897,6 @@ static void discovering_callback(uint16_t index, uint16_t length,
}
}
-static void invalidate_rssi_and_tx_power(gpointer a)
-{
- struct btd_device *dev = a;
-
- device_set_rssi(dev, 0);
- device_set_tx_power(dev, 127);
-}
-
-static gboolean remove_temp_devices(gpointer user_data)
-{
- struct btd_adapter *adapter = user_data;
- GSList *l, *next;
-
- DBG("%s", adapter->path);
-
- adapter->temp_devices_timeout = 0;
-
- for (l = adapter->devices; l != NULL; l = next) {
- struct btd_device *dev = l->data;
-
- next = g_slist_next(l);
-
- if (device_is_temporary(dev) && !btd_device_is_connected(dev))
- btd_adapter_remove_device(adapter, dev);
- }
-
- return FALSE;
-}
-
-static void discovery_cleanup(struct btd_adapter *adapter)
-{
- GSList *l, *next;
-
- adapter->discovery_type = 0x00;
-
- if (adapter->discovery_idle_timeout > 0) {
- g_source_remove(adapter->discovery_idle_timeout);
- adapter->discovery_idle_timeout = 0;
- }
-
- if (adapter->temp_devices_timeout > 0) {
- g_source_remove(adapter->temp_devices_timeout);
- adapter->temp_devices_timeout = 0;
- }
-
- g_slist_free_full(adapter->discovery_found,
- invalidate_rssi_and_tx_power);
- adapter->discovery_found = NULL;
-
- if (!adapter->devices)
- return;
-
- for (l = adapter->devices; l != NULL; l = next) {
- struct btd_device *dev = l->data;
-
- next = g_slist_next(l);
-
- if (device_is_temporary(dev) && !device_is_connectable(dev))
- btd_adapter_remove_device(adapter, dev);
- }
-
- adapter->temp_devices_timeout = g_timeout_add_seconds(TEMP_DEV_TIMEOUT,
- remove_temp_devices, adapter);
-}
-
-static void discovery_free(void *user_data)
-{
- struct watch_client *client = user_data;
-
- if (client->watch)
- g_dbus_remove_watch(dbus_conn, client->watch);
-
- if (client->discovery_filter) {
- free_discovery_filter(client->discovery_filter);
- client->discovery_filter = NULL;
- }
-
- if (client->msg)
- dbus_message_unref(client->msg);
-
- g_free(client->owner);
- g_free(client);
-}
-
static bool set_discovery_discoverable(struct btd_adapter *adapter, bool enable)
{
if (adapter->discovery_discoverable == enable)
@@ -1882,34 +1911,6 @@ static bool set_discovery_discoverable(struct btd_adapter *adapter, bool enable)
return set_discoverable(adapter, enable, 0);
}
-static void discovery_remove(struct watch_client *client, bool exit)
-{
- struct btd_adapter *adapter = client->adapter;
-
- DBG("owner %s", client->owner);
-
- adapter->set_filter_list = g_slist_remove(adapter->set_filter_list,
- client);
-
- adapter->discovery_list = g_slist_remove(adapter->discovery_list,
- client);
-
- if (!exit && client->discovery_filter)
- adapter->set_filter_list = g_slist_prepend(
- adapter->set_filter_list, client);
- else
- discovery_free(client);
-
- /*
- * If there are other client discoveries in progress, then leave
- * it active. If not, then make sure to stop the restart timeout.
- */
- if (adapter->discovery_list)
- return;
-
- discovery_cleanup(adapter);
-}
-
static void stop_discovery_complete(uint8_t status, uint16_t length,
const void *param, void *user_data)
{
--
2.25.3
^ permalink raw reply related [flat|nested] 2+ messages in thread
* Re: [PATCH BlueZ] adapter: Fix not removing client from discovery list
2020-05-28 22:15 [PATCH BlueZ] adapter: Fix not removing client from discovery list Luiz Augusto von Dentz
@ 2020-05-29 20:30 ` Luiz Augusto von Dentz
0 siblings, 0 replies; 2+ messages in thread
From: Luiz Augusto von Dentz @ 2020-05-29 20:30 UTC (permalink / raw)
To: linux-bluetooth
Hi,
On Thu, May 28, 2020 at 3:15 PM Luiz Augusto von Dentz
<luiz.dentz@gmail.com> wrote:
>
> From: Luiz Augusto von Dentz <luiz.von.dentz@intel.com>
>
> If command MGMT_OP_START_DISCOVERY fails we reply with btd_error_busy
> but we don't remove the client from the list which would prevent the
> client to start it once again.
> ---
> src/adapter.c | 225 +++++++++++++++++++++++++-------------------------
> 1 file changed, 113 insertions(+), 112 deletions(-)
>
> diff --git a/src/adapter.c b/src/adapter.c
> index 972d88772..c3d60697a 100644
> --- a/src/adapter.c
> +++ b/src/adapter.c
> @@ -1468,6 +1468,118 @@ static void free_discovery_filter(struct discovery_filter *discovery_filter)
> g_free(discovery_filter);
> }
>
> +static void invalidate_rssi_and_tx_power(gpointer a)
> +{
> + struct btd_device *dev = a;
> +
> + device_set_rssi(dev, 0);
> + device_set_tx_power(dev, 127);
> +}
> +
> +static gboolean remove_temp_devices(gpointer user_data)
> +{
> + struct btd_adapter *adapter = user_data;
> + GSList *l, *next;
> +
> + DBG("%s", adapter->path);
> +
> + adapter->temp_devices_timeout = 0;
> +
> + for (l = adapter->devices; l != NULL; l = next) {
> + struct btd_device *dev = l->data;
> +
> + next = g_slist_next(l);
> +
> + if (device_is_temporary(dev) && !btd_device_is_connected(dev))
> + btd_adapter_remove_device(adapter, dev);
> + }
> +
> + return FALSE;
> +}
> +
> +static void discovery_cleanup(struct btd_adapter *adapter)
> +{
> + GSList *l, *next;
> +
> + adapter->discovery_type = 0x00;
> +
> + if (adapter->discovery_idle_timeout > 0) {
> + g_source_remove(adapter->discovery_idle_timeout);
> + adapter->discovery_idle_timeout = 0;
> + }
> +
> + if (adapter->temp_devices_timeout > 0) {
> + g_source_remove(adapter->temp_devices_timeout);
> + adapter->temp_devices_timeout = 0;
> + }
> +
> + g_slist_free_full(adapter->discovery_found,
> + invalidate_rssi_and_tx_power);
> + adapter->discovery_found = NULL;
> +
> + if (!adapter->devices)
> + return;
> +
> + for (l = adapter->devices; l != NULL; l = next) {
> + struct btd_device *dev = l->data;
> +
> + next = g_slist_next(l);
> +
> + if (device_is_temporary(dev) && !device_is_connectable(dev))
> + btd_adapter_remove_device(adapter, dev);
> + }
> +
> + adapter->temp_devices_timeout = g_timeout_add_seconds(TEMP_DEV_TIMEOUT,
> + remove_temp_devices, adapter);
> +}
> +
> +static void discovery_free(void *user_data)
> +{
> + struct watch_client *client = user_data;
> +
> + if (client->watch)
> + g_dbus_remove_watch(dbus_conn, client->watch);
> +
> + if (client->discovery_filter) {
> + free_discovery_filter(client->discovery_filter);
> + client->discovery_filter = NULL;
> + }
> +
> + if (client->msg)
> + dbus_message_unref(client->msg);
> +
> + g_free(client->owner);
> + g_free(client);
> +}
> +
> +static void discovery_remove(struct watch_client *client, bool exit)
> +{
> + struct btd_adapter *adapter = client->adapter;
> +
> + DBG("owner %s", client->owner);
> +
> + adapter->set_filter_list = g_slist_remove(adapter->set_filter_list,
> + client);
> +
> + adapter->discovery_list = g_slist_remove(adapter->discovery_list,
> + client);
> +
> + if (!exit && client->discovery_filter)
> + adapter->set_filter_list = g_slist_prepend(
> + adapter->set_filter_list, client);
> + else
> + discovery_free(client);
> +
> + /*
> + * If there are other client discoveries in progress, then leave
> + * it active. If not, then make sure to stop the restart timeout.
> + */
> + if (adapter->discovery_list)
> + return;
> +
> + discovery_cleanup(adapter);
> +}
> +
> static void trigger_start_discovery(struct btd_adapter *adapter, guint delay);
>
> static void start_discovery_complete(uint8_t status, uint16_t length,
> @@ -1538,6 +1650,7 @@ fail:
> reply = btd_error_busy(client->msg);
> g_dbus_send_message(dbus_conn, reply);
> g_dbus_remove_watch(dbus_conn, client->watch);
> + discovery_remove(client, false);
> return;
> }
>
> @@ -1784,90 +1897,6 @@ static void discovering_callback(uint16_t index, uint16_t length,
> }
> }
>
> -static void invalidate_rssi_and_tx_power(gpointer a)
> -{
> - struct btd_device *dev = a;
> -
> - device_set_rssi(dev, 0);
> - device_set_tx_power(dev, 127);
> -}
> -
> -static gboolean remove_temp_devices(gpointer user_data)
> -{
> - struct btd_adapter *adapter = user_data;
> - GSList *l, *next;
> -
> - DBG("%s", adapter->path);
> -
> - adapter->temp_devices_timeout = 0;
> -
> - for (l = adapter->devices; l != NULL; l = next) {
> - struct btd_device *dev = l->data;
> -
> - next = g_slist_next(l);
> -
> - if (device_is_temporary(dev) && !btd_device_is_connected(dev))
> - btd_adapter_remove_device(adapter, dev);
> - }
> -
> - return FALSE;
> -}
> -
> -static void discovery_cleanup(struct btd_adapter *adapter)
> -{
> - GSList *l, *next;
> -
> - adapter->discovery_type = 0x00;
> -
> - if (adapter->discovery_idle_timeout > 0) {
> - g_source_remove(adapter->discovery_idle_timeout);
> - adapter->discovery_idle_timeout = 0;
> - }
> -
> - if (adapter->temp_devices_timeout > 0) {
> - g_source_remove(adapter->temp_devices_timeout);
> - adapter->temp_devices_timeout = 0;
> - }
> -
> - g_slist_free_full(adapter->discovery_found,
> - invalidate_rssi_and_tx_power);
> - adapter->discovery_found = NULL;
> -
> - if (!adapter->devices)
> - return;
> -
> - for (l = adapter->devices; l != NULL; l = next) {
> - struct btd_device *dev = l->data;
> -
> - next = g_slist_next(l);
> -
> - if (device_is_temporary(dev) && !device_is_connectable(dev))
> - btd_adapter_remove_device(adapter, dev);
> - }
> -
> - adapter->temp_devices_timeout = g_timeout_add_seconds(TEMP_DEV_TIMEOUT,
> - remove_temp_devices, adapter);
> -}
> -
> -static void discovery_free(void *user_data)
> -{
> - struct watch_client *client = user_data;
> -
> - if (client->watch)
> - g_dbus_remove_watch(dbus_conn, client->watch);
> -
> - if (client->discovery_filter) {
> - free_discovery_filter(client->discovery_filter);
> - client->discovery_filter = NULL;
> - }
> -
> - if (client->msg)
> - dbus_message_unref(client->msg);
> -
> - g_free(client->owner);
> - g_free(client);
> -}
> -
> static bool set_discovery_discoverable(struct btd_adapter *adapter, bool enable)
> {
> if (adapter->discovery_discoverable == enable)
> @@ -1882,34 +1911,6 @@ static bool set_discovery_discoverable(struct btd_adapter *adapter, bool enable)
> return set_discoverable(adapter, enable, 0);
> }
>
> -static void discovery_remove(struct watch_client *client, bool exit)
> -{
> - struct btd_adapter *adapter = client->adapter;
> -
> - DBG("owner %s", client->owner);
> -
> - adapter->set_filter_list = g_slist_remove(adapter->set_filter_list,
> - client);
> -
> - adapter->discovery_list = g_slist_remove(adapter->discovery_list,
> - client);
> -
> - if (!exit && client->discovery_filter)
> - adapter->set_filter_list = g_slist_prepend(
> - adapter->set_filter_list, client);
> - else
> - discovery_free(client);
> -
> - /*
> - * If there are other client discoveries in progress, then leave
> - * it active. If not, then make sure to stop the restart timeout.
> - */
> - if (adapter->discovery_list)
> - return;
> -
> - discovery_cleanup(adapter);
> -}
> -
> static void stop_discovery_complete(uint8_t status, uint16_t length,
> const void *param, void *user_data)
> {
> --
> 2.25.3
>
Applied.
--
Luiz Augusto von Dentz
^ permalink raw reply [flat|nested] 2+ messages in thread
end of thread, other threads:[~2020-05-29 20:37 UTC | newest]
Thread overview: 2+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2020-05-28 22:15 [PATCH BlueZ] adapter: Fix not removing client from discovery list Luiz Augusto von Dentz
2020-05-29 20:30 ` Luiz Augusto von Dentz
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).