Diff between 11a57b5c267d310bc0fd20d51fc4286bbda12697 and c4f77eb5acbd8398dbf990364daf6c11c781e969

Changed Files

File Additions Deletions Status
src/adapter.c +11 -0 modified
src/device.c +13 -0 modified
src/device.h +1 -0 modified

Full Patch

diff --git a/src/adapter.c b/src/adapter.c
index 4d20acb..7ac3d20 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 7701987..9f9c478 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 32f8edc..bc046f7 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);