2022-03-21 13:01:14

by Manish Mandlik

[permalink] [raw]
Subject: [BlueZ PATCH 2/9] adv_monitor: Don't send DeviceFound for already found devices

When monitors with same patterns are merged, BlueZ removes the existing
monitor from the kernel and re-registers it with updated/merged RSSI
parameters. The controller then triggers a new Device Found event for
the device that matches the updated monitor. Don't notify the D-Bus
client again with another DeviceFound for that device.

Reviewed-by: Miao-chen Chou <[email protected]>
---

src/adv_monitor.c | 40 ++++++++++++++++++++++++++++++++++++++++
1 file changed, 40 insertions(+)

diff --git a/src/adv_monitor.c b/src/adv_monitor.c
index a1778248f..a7763df10 100644
--- a/src/adv_monitor.c
+++ b/src/adv_monitor.c
@@ -188,6 +188,11 @@ static void merged_pattern_send_add(
static void merged_pattern_send_remove(
struct adv_monitor_merged_pattern *merged_pattern);

+static bool monitor_device_match(const void *a, const void *b);
+static struct adv_monitor_device *monitor_device_create(
+ struct adv_monitor *monitor,
+ struct btd_device *device);
+
const struct adv_monitor_type {
enum monitor_type type;
const char *name;
@@ -1555,8 +1560,26 @@ static void notify_device_found_per_monitor(void *data, void *user_data)
{
struct adv_monitor *monitor = data;
struct monitored_device_info *info = user_data;
+ struct adv_monitor_device *dev = NULL;
+ uint16_t adapter_id = monitor->app->manager->adapter_id;

if (monitor->merged_pattern->monitor_handle == info->monitor_handle) {
+ dev = queue_find(monitor->devices, monitor_device_match,
+ info->device);
+ if (!dev) {
+ dev = monitor_device_create(monitor, info->device);
+ if (!dev) {
+ btd_error(adapter_id, "Failed to create "
+ "Adv Monitor device object.");
+ return;
+ }
+ }
+
+ if (dev->found)
+ return;
+
+ dev->found = true;
+
DBG("Calling DeviceFound() on Adv Monitor of owner %s "
"at path %s", monitor->app->owner, monitor->path);

@@ -1652,8 +1675,25 @@ static void notify_device_lost_per_monitor(void *data, void *user_data)
{
struct adv_monitor *monitor = data;
struct monitored_device_info *info = user_data;
+ struct adv_monitor_device *dev = NULL;
+ uint16_t adapter_id = monitor->app->manager->adapter_id;

if (monitor->merged_pattern->monitor_handle == info->monitor_handle) {
+ dev = queue_find(monitor->devices, monitor_device_match,
+ info->device);
+ if (!dev) {
+ btd_error(adapter_id, "Adv Monitor device object "
+ "not found.");
+ return;
+ }
+
+ if (!dev->found) {
+ btd_error(adapter_id, "Device not tracked.");
+ return;
+ }
+
+ dev->found = false;
+
DBG("Calling DeviceLost() on Adv Monitor of owner %s "
"at path %s", monitor->app->owner, monitor->path);

--
2.35.1.894.gb6a874cedc-goog