From c4f77eb5acbd8398dbf990364daf6c11c781e969 Mon Sep 17 00:00:00 2001 From: Luiz Augusto von Dentz Date: Thu, 23 Nov 2017 12:52:44 +0200 Subject: [PATCH] adapter: Cleanup non-connectable temporary devices These devices cannot be used after the discovery has been terminated so there is no point in keep them on cache like other temporary devices. --- src/adapter.c | 11 +++++++++++ src/device.c | 13 +++++++++++++ src/device.h | 1 + 3 files changed, 25 insertions(+) diff --git a/src/adapter.c b/src/adapter.c index 4d20acb83..7ac3d20a1 100644 --- a/src/adapter.c +++ b/src/adapter.c @@ -1766,6 +1766,8 @@ static gboolean remove_temp_devices(gpointer user_data) static void discovery_cleanup(struct btd_adapter *adapter) { + GSList *l, *next; + adapter->discovery_type = 0x00; if (adapter->discovery_idle_timeout > 0) { @@ -1785,6 +1787,15 @@ static void discovery_cleanup(struct btd_adapter *adapter) 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); } diff --git a/src/device.c b/src/device.c index 7701987a7..9f9c47807 100644 --- a/src/device.c +++ b/src/device.c @@ -210,6 +210,7 @@ struct btd_device { GSList *pending; /* Pending services */ GSList *watches; /* List of disconnect_data */ bool temporary; + bool connectable; guint disconn_timer; guint discov_timer; struct browse_req *browse; /* service discover request */ @@ -5354,6 +5355,18 @@ void device_set_flags(struct btd_device *device, uint8_t flags) DEVICE_INTERFACE, "AdvertisingFlags"); } +bool device_is_connectable(struct btd_device *device) +{ + if (!device) + return false; + + if (device->bredr) + return true; + + /* Check if either Limited or General discoverable are set */ + return (device->ad_flags[0] & 0x03); +} + static gboolean start_discovery(gpointer user_data) { struct btd_device *device = user_data; diff --git a/src/device.h b/src/device.h index 32f8edce5..bc046f780 100644 --- a/src/device.h +++ b/src/device.h @@ -89,6 +89,7 @@ struct btd_adapter *device_get_adapter(struct btd_device *device); const bdaddr_t *device_get_address(struct btd_device *device); const char *device_get_path(const struct btd_device *device); gboolean device_is_temporary(struct btd_device *device); +bool device_is_connectable(struct btd_device *device); bool device_is_paired(struct btd_device *device, uint8_t bdaddr_type); bool device_is_bonded(struct btd_device *device, uint8_t bdaddr_type); gboolean device_is_trusted(struct btd_device *device); -- 2.47.3