Re: [BlueZ PATCH v5 3/6] adv_monitor: Receive the Device Found/Lost events

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hi Manish,

On Wed, Nov 17, 2021 at 11:15 AM Manish Mandlik <mmandlik@xxxxxxxxxx> wrote:
>
> 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@xxxxxxxxxx>
> ---
>
> Changes in v5:
> - Update the Adv Monitor Device Found event to include fields from the
>   existing Device Found event and update the device object.
> - Disable the software based filtering whenever controller offloading is
>   available.
>
> Changes in v4:
> - Add Advertisement Monitor Device Found event.
>
> Changes in v3:
> - Fix indentation of the adv_monitor_device_lost_callback() name and
>   it's arguments.
>
> Changes in v2:
> - Update function name adv_monitor_tracking_callback() to
>   adv_monitor_device_lost_callback() as it will receive only Device Lost
>   event.
>
>  src/adapter.c     | 47 +++++++++++++-----------
>  src/adapter.h     |  8 +++++
>  src/adv_monitor.c | 91 +++++++++++++++++++++++++++++++++++++++++++++++
>  src/adv_monitor.h |  2 ++
>  4 files changed, 128 insertions(+), 20 deletions(-)
>
> diff --git a/src/adapter.c b/src/adapter.c
> index d0d38621b..42463a3c1 100644
> --- a/src/adapter.c
> +++ b/src/adapter.c
> @@ -6984,12 +6984,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;
> @@ -6999,20 +7000,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));
> @@ -7025,7 +7030,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;
>                 }
> @@ -7064,7 +7069,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;
>         }
> @@ -7072,7 +7077,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);
> @@ -7202,6 +7207,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,
> @@ -7230,11 +7236,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)
> diff --git a/src/adapter.h b/src/adapter.h
> index db3c17f23..cd0d037af 100644
> --- a/src/adapter.h
> +++ b/src/adapter.h
> @@ -87,6 +87,14 @@ struct btd_device *btd_adapter_find_device(struct btd_adapter *adapter,
>  struct btd_device *btd_adapter_find_device_by_path(struct btd_adapter *adapter,
>                                                    const char *path);
>
> +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,
> +                                       bool monitored);
> +
>  const char *adapter_get_path(struct btd_adapter *adapter);
>  const bdaddr_t *btd_adapter_get_address(struct btd_adapter *adapter);
>  uint8_t btd_adapter_get_address_type(struct btd_adapter *adapter);
> diff --git a/src/adv_monitor.c b/src/adv_monitor.c
> index a3b33188b..e5bdfb6ef 100644
> --- a/src/adv_monitor.c
> +++ b/src/adv_monitor.c
> @@ -1531,6 +1531,78 @@ static void adv_monitor_removed_callback(uint16_t index, uint16_t length,
>                 ev->monitor_handle);
>  }
>
> +/* Processes Adv Monitor Device Found event from kernel */
> +static void adv_monitor_device_found_callback(uint16_t index, uint16_t length,
> +                                               const void *param,
> +                                               void *user_data)
> +{
> +       const struct mgmt_ev_adv_monitor_device_found *ev = param;
> +       struct btd_adv_monitor_manager *manager = user_data;
> +       uint16_t handle = le16_to_cpu(ev->monitor_handle);

Make sure each patch don't break the build:

src/adv_monitor.c: In function ‘adv_monitor_device_found_callback’:
src/adv_monitor.c:1541:18: error: unused variable ‘handle’
[-Werror=unused-variable]
 1541 |         uint16_t handle = le16_to_cpu(ev->monitor_handle);
      |

> +       const uint16_t adapter_id = manager->adapter_id;
> +       struct btd_adapter *adapter = manager->adapter;
> +       const uint8_t *ad_data = NULL;
> +       uint16_t ad_data_len;
> +       uint32_t flags;
> +       bool confirm_name;
> +       bool legacy;
> +       char addr[18];
> +       bool not_connectable;
> +
> +       if (length < sizeof(*ev)) {
> +               btd_error(adapter_id,
> +                               "Too short Adv Monitor Device Found event");
> +               return;
> +       }
> +
> +       ad_data_len = btohs(ev->ad_data_len);
> +       if (length != sizeof(*ev) + ad_data_len) {
> +               btd_error(adapter_id,
> +                               "Wrong size of Adv Monitor Device Found event");
> +               return;
> +       }
> +
> +       if (ad_data_len > 0)
> +               ad_data = ev->ad_data;
> +
> +       flags = btohl(ev->flags);
> +
> +       ba2str(&ev->addr.bdaddr, addr);
> +       DBG("hci%u addr %s, rssi %d flags 0x%04x ad_data_len %u",
> +                       index, addr, ev->rssi, flags, ad_data_len);
> +
> +       confirm_name = (flags & MGMT_DEV_FOUND_CONFIRM_NAME);
> +       legacy = (flags & MGMT_DEV_FOUND_LEGACY_PAIRING);
> +       not_connectable = (flags & MGMT_DEV_FOUND_NOT_CONNECTABLE);
> +
> +       btd_adapter_update_found_device(adapter, &ev->addr.bdaddr,
> +                                       ev->addr.type, ev->rssi, confirm_name,
> +                                       legacy, not_connectable, ad_data,
> +                                       ad_data_len, true);
> +}
> +
> +/* Processes Adv Monitor Device Lost event from kernel */
> +static void adv_monitor_device_lost_callback(uint16_t index, uint16_t length,
> +                                               const void *param,
> +                                               void *user_data)
> +{
> +       struct btd_adv_monitor_manager *manager = user_data;
> +       const struct mgmt_ev_adv_monitor_device_lost *ev = param;
> +       uint16_t handle = le16_to_cpu(ev->monitor_handle);
> +       const uint16_t adapter_id = manager->adapter_id;
> +       char addr[18];
> +
> +       if (length < sizeof(*ev)) {
> +               btd_error(adapter_id,
> +                               "Wrong size of Adv Monitor Device Lost event");
> +               return;
> +       }
> +
> +       ba2str(&ev->addr.bdaddr, addr);
> +       DBG("Adv Monitor with handle 0x%04x stopped tracking the device %s",
> +               handle, addr);
> +}
> +
>  /* Allocates a manager object */
>  static struct btd_adv_monitor_manager *manager_new(
>                                                 struct btd_adapter *adapter,
> @@ -1555,6 +1627,14 @@ static struct btd_adv_monitor_manager *manager_new(
>                         manager->adapter_id, adv_monitor_removed_callback,
>                         manager, NULL);
>
> +       mgmt_register(manager->mgmt, MGMT_EV_ADV_MONITOR_DEVICE_FOUND,
> +                       manager->adapter_id, adv_monitor_device_found_callback,
> +                       manager, NULL);
> +
> +       mgmt_register(manager->mgmt, MGMT_EV_ADV_MONITOR_DEVICE_LOST,
> +                       manager->adapter_id, adv_monitor_device_lost_callback,
> +                       manager, NULL);
> +
>         return manager;
>  }
>
> @@ -1666,6 +1746,17 @@ void btd_adv_monitor_manager_destroy(struct btd_adv_monitor_manager *manager)
>         manager_destroy(manager);
>  }
>
> +bool btd_adv_monitor_offload_supported(struct btd_adv_monitor_manager *manager)
> +{
> +       if (!manager) {
> +               error("Manager is NULL, get offload support failed");
> +               return false;
> +       }
> +
> +       return !!(manager->enabled_features &
> +                               MGMT_ADV_MONITOR_FEATURE_MASK_OR_PATTERNS);
> +}
> +
>  /* Processes the content matching based pattern(s) of a monitor */
>  static void adv_match_per_monitor(void *data, void *user_data)
>  {
> diff --git a/src/adv_monitor.h b/src/adv_monitor.h
> index d9cb9ccbb..bed6572d0 100644
> --- a/src/adv_monitor.h
> +++ b/src/adv_monitor.h
> @@ -27,6 +27,8 @@ struct btd_adv_monitor_manager *btd_adv_monitor_manager_create(
>                                                 struct mgmt *mgmt);
>  void btd_adv_monitor_manager_destroy(struct btd_adv_monitor_manager *manager);
>
> +bool btd_adv_monitor_offload_supported(struct btd_adv_monitor_manager *manager);
> +
>  struct queue *btd_adv_monitor_content_filter(
>                                 struct btd_adv_monitor_manager *manager,
>                                 struct bt_ad *ad);
> --
> 2.34.0.rc1.387.gb447b232ab-goog
>


-- 
Luiz Augusto von Dentz




[Index of Archives]     [Bluez Devel]     [Linux Wireless Networking]     [Linux Wireless Personal Area Networking]     [Linux ATH6KL]     [Linux USB Devel]     [Linux Media Drivers]     [Linux Audio Users]     [Linux Kernel]     [Linux SCSI]     [Big List of Linux Books]

  Powered by Linux