Re: [PATCH v2 1/2] Bluetooth: Send device found event on name resolve failure

From: Marcel Holtmann
Date: Tue Nov 16 2021 - 09:08:04 EST


Hi Archie,

> Introducing CONFIRM_NAME_FAILED flag that will be sent together with
> device found event on name resolve failure. This will provide the
> userspace with an information so it can decide not to resolve the
> name for these devices in the future.
>
> Signed-off-by: Archie Pusaka <apusaka@xxxxxxxxxxxx>
> Reviewed-by: Miao-chen Chou <mcchou@xxxxxxxxxxxx>
>
> ---
> Hi maintainers,
>
> This is the patch series for remote name request as was discussed here.
> https://patchwork.kernel.org/project/bluetooth/patch/20211028191805.1.I35b7f3a496f834de6b43a32f94b6160cb1467c94@changeid/
> Please also review the corresponding userspace change.
>
> Thanks,
> Archie
>
> Changes in v2:
> * Remove the part which accepts DONT_CARE flag in MGMT_OP_CONFIRM_NAME
> * Rename MGMT constant to conform with the docs
>
> include/net/bluetooth/mgmt.h | 1 +
> net/bluetooth/hci_event.c | 11 ++++-------
> net/bluetooth/mgmt.c | 11 ++++++++---
> 3 files changed, 13 insertions(+), 10 deletions(-)
>
> diff --git a/include/net/bluetooth/mgmt.h b/include/net/bluetooth/mgmt.h
> index 23a0524061b7..3cda081ed6d0 100644
> --- a/include/net/bluetooth/mgmt.h
> +++ b/include/net/bluetooth/mgmt.h
> @@ -940,6 +940,7 @@ struct mgmt_ev_auth_failed {
> #define MGMT_DEV_FOUND_LEGACY_PAIRING 0x02
> #define MGMT_DEV_FOUND_NOT_CONNECTABLE 0x04
> #define MGMT_DEV_FOUND_INITIATED_CONN 0x08
> +#define MGMT_DEV_FOUND_NAME_REQUEST_FAILED 0x10

please indent the other defines to match this one.

>
> #define MGMT_EV_DEVICE_FOUND 0x0012
> struct mgmt_ev_device_found {
> diff --git a/net/bluetooth/hci_event.c b/net/bluetooth/hci_event.c
> index d4b75a6cfeee..2de3080659f9 100644
> --- a/net/bluetooth/hci_event.c
> +++ b/net/bluetooth/hci_event.c
> @@ -2175,13 +2175,10 @@ static void hci_check_pending_name(struct hci_dev *hdev, struct hci_conn *conn,
> return;
>
> list_del(&e->list);
> - if (name) {
> - e->name_state = NAME_KNOWN;
> - mgmt_remote_name(hdev, bdaddr, ACL_LINK, 0x00,
> - e->data.rssi, name, name_len);
> - } else {
> - e->name_state = NAME_NOT_KNOWN;
> - }
> +
> + e->name_state = name ? NAME_KNOWN : NAME_NOT_KNOWN;
> + mgmt_remote_name(hdev, bdaddr, ACL_LINK, 0x00, e->data.rssi,
> + name, name_len);
>
> if (hci_resolve_next_name(hdev))
> return;
> diff --git a/net/bluetooth/mgmt.c b/net/bluetooth/mgmt.c
> index 06384d761928..0d77c010b391 100644
> --- a/net/bluetooth/mgmt.c
> +++ b/net/bluetooth/mgmt.c
> @@ -9615,7 +9615,8 @@ void mgmt_remote_name(struct hci_dev *hdev, bdaddr_t *bdaddr, u8 link_type,
> {
> struct mgmt_ev_device_found *ev;
> char buf[sizeof(*ev) + HCI_MAX_NAME_LENGTH + 2];
> - u16 eir_len;
> + u16 eir_len = 0;
> + u32 flags = 0;
>
> ev = (struct mgmt_ev_device_found *) buf;
>
> @@ -9625,10 +9626,14 @@ void mgmt_remote_name(struct hci_dev *hdev, bdaddr_t *bdaddr, u8 link_type,
> ev->addr.type = link_to_bdaddr(link_type, addr_type);
> ev->rssi = rssi;
>
> - eir_len = eir_append_data(ev->eir, 0, EIR_NAME_COMPLETE, name,
> - name_len);
> + if (name)
> + eir_len = eir_append_data(ev->eir, 0, EIR_NAME_COMPLETE, name,
> + name_len);
> + else
> + flags |= MGMT_DEV_FOUND_NAME_REQUEST_FAILED;

So instead of initializing a variable, I prefer to set them where they are used.

if (name) {
eir_len = eir_..
flags = 0;
} else {
eir_len = 0;
flags = MGMT_DEV_FOUND_NAME_REQUEST_FAILED;
}

This way, the compiler will complain loudly if we change things and forget to set any of these two variables.

>
> ev->eir_len = cpu_to_le16(eir_len);
> + ev->flags = cpu_to_le32(flags);
>
> mgmt_event(MGMT_EV_DEVICE_FOUND, hdev, ev, sizeof(*ev) + eir_len, NULL);
> }
> --

Regards

Marcel