summaryrefslogtreecommitdiff
path: root/src/adapter.c
diff options
context:
space:
mode:
authorManish Mandlik <mmandlik@google.com>2021-11-20 07:29:38 -0800
committerLuiz Augusto von Dentz <luiz.von.dentz@intel.com>2021-11-22 14:25:04 -0800
commitda253c54d11837c4a8c33f6f047a3a41d71f917b (patch)
tree0a16e7d36e0bf6b154c074f8bb6af89de40fec7b /src/adapter.c
parent37caf622b8ad71f9b29a1104504e5fdefdd7934e (diff)
downloadbluez-da253c54d11837c4a8c33f6f047a3a41d71f917b.tar.gz
adv_monitor: Receive the Device Found/Lost events
This patch registers callback functions to receive the Advertisement Monitor Device Found and Device Lost events. It also disables software based filtering whenever controller offloading support is available. Test performed: - Verified by logs that the MSFT Monitor Device is received from the controller and the bluetoothd is notified whenever the controller starts/stops monitoring a device. Reviewed-by: Miao-chen Chou <mcchou@google.com>
Diffstat (limited to 'src/adapter.c')
-rw-r--r--src/adapter.c47
1 files changed, 27 insertions, 20 deletions
diff --git a/src/adapter.c b/src/adapter.c
index 309956bbb..98616f17d 100644
--- a/src/adapter.c
+++ b/src/adapter.c
@@ -6974,12 +6974,13 @@ static bool device_is_discoverable(struct btd_adapter *adapter,
return discoverable;
}
-static void update_found_devices(struct btd_adapter *adapter,
+void btd_adapter_update_found_device(struct btd_adapter *adapter,
const bdaddr_t *bdaddr,
uint8_t bdaddr_type, int8_t rssi,
bool confirm, bool legacy,
bool not_connectable,
- const uint8_t *data, uint8_t data_len)
+ const uint8_t *data, uint8_t data_len,
+ bool monitoring)
{
struct btd_device *dev;
struct bt_ad *ad = NULL;
@@ -6989,20 +6990,24 @@ static void update_found_devices(struct btd_adapter *adapter,
bool duplicate = false;
struct queue *matched_monitors = NULL;
- if (bdaddr_type != BDADDR_BREDR)
- ad = bt_ad_new_with_data(data_len, data);
+ if (!btd_adv_monitor_offload_supported(adapter->adv_monitor_manager)) {
+ if (bdaddr_type != BDADDR_BREDR)
+ ad = bt_ad_new_with_data(data_len, data);
- /* During the background scanning, update the device only when the data
- * match at least one Adv monitor
- */
- if (ad) {
- matched_monitors = btd_adv_monitor_content_filter(
- adapter->adv_monitor_manager, ad);
- bt_ad_unref(ad);
- ad = NULL;
+ /* During the background scanning, update the device only when
+ * the data match at least one Adv monitor
+ */
+ if (ad) {
+ matched_monitors = btd_adv_monitor_content_filter(
+ adapter->adv_monitor_manager,
+ ad);
+ bt_ad_unref(ad);
+ ad = NULL;
+ monitoring = matched_monitors ? true : false;
+ }
}
- if (!adapter->discovering && !matched_monitors)
+ if (!adapter->discovering && !monitoring)
return;
memset(&eir_data, 0, sizeof(eir_data));
@@ -7015,7 +7020,7 @@ static void update_found_devices(struct btd_adapter *adapter,
dev = btd_adapter_find_device(adapter, bdaddr, bdaddr_type);
if (!dev) {
- if (!discoverable && !matched_monitors) {
+ if (!discoverable && !monitoring) {
eir_data_free(&eir_data);
return;
}
@@ -7054,7 +7059,7 @@ static void update_found_devices(struct btd_adapter *adapter,
*/
if (!btd_device_is_connected(dev) &&
(device_is_temporary(dev) && !adapter->discovery_list) &&
- !matched_monitors) {
+ !monitoring) {
eir_data_free(&eir_data);
return;
}
@@ -7062,7 +7067,7 @@ static void update_found_devices(struct btd_adapter *adapter,
/* If there is no matched Adv monitors, don't continue if not
* discoverable or if active discovery filter don't match.
*/
- if (!matched_monitors && (!discoverable ||
+ if (!monitoring && (!discoverable ||
(adapter->filtered_discovery && !is_filter_match(
adapter->discovery_list, &eir_data, rssi)))) {
eir_data_free(&eir_data);
@@ -7192,6 +7197,7 @@ static void device_found_callback(uint16_t index, uint16_t length,
bool confirm_name;
bool legacy;
char addr[18];
+ bool not_connectable;
if (length < sizeof(*ev)) {
btd_error(adapter->dev_id,
@@ -7220,11 +7226,12 @@ static void device_found_callback(uint16_t index, uint16_t length,
confirm_name = (flags & MGMT_DEV_FOUND_CONFIRM_NAME);
legacy = (flags & MGMT_DEV_FOUND_LEGACY_PAIRING);
+ not_connectable = (flags & MGMT_DEV_FOUND_NOT_CONNECTABLE);
- update_found_devices(adapter, &ev->addr.bdaddr, ev->addr.type,
- ev->rssi, confirm_name, legacy,
- flags & MGMT_DEV_FOUND_NOT_CONNECTABLE,
- eir, eir_len);
+ btd_adapter_update_found_device(adapter, &ev->addr.bdaddr,
+ ev->addr.type, ev->rssi, confirm_name,
+ legacy, not_connectable, eir, eir_len,
+ false);
}
struct agent *adapter_get_agent(struct btd_adapter *adapter)