Thread (9 messages) flat view 9 messages, 2 authors, 2021-11-18

Re: [PATCH v2 1/2] Bluetooth: Introduce HCI_CONN_FLAG_DEVICE_PRIVACY device flag

From: Marcel Holtmann <marcel@holtmann.org>
Date: 2021-11-18 17:19:28

Hi Luiz,
quoted
quoted
This introduces HCI_CONN_FLAG_DEVICE_PRIVACY which can be used by
userspace to indicate to the controller to use Device Privacy Mode to a
specific device.

Signed-off-by: Luiz Augusto von Dentz <redacted>
---
v2: Fix marking Device Privacy Flag even when adapter is not capable of
handling Set Privacy Mode.

include/net/bluetooth/hci_core.h |  4 ++++
net/bluetooth/mgmt.c             | 24 ++++++++++++++++++++----
2 files changed, 24 insertions(+), 4 deletions(-)
diff --git a/include/net/bluetooth/hci_core.h b/include/net/bluetooth/hci_core.h
index b5f061882c10..07d2d099dc2a 100644
--- a/include/net/bluetooth/hci_core.h
+++ b/include/net/bluetooth/hci_core.h
@@ -160,6 +160,7 @@ struct bdaddr_list_with_flags {
enum hci_conn_flags {
     HCI_CONN_FLAG_REMOTE_WAKEUP,
+     HCI_CONN_FLAG_DEVICE_PRIVACY,
     HCI_CONN_FLAG_MAX
};
@@ -1468,6 +1469,9 @@ void hci_conn_del_sysfs(struct hci_conn *conn);
#define use_ll_privacy(dev) (ll_privacy_capable(dev) && \
                          hci_dev_test_flag(dev, HCI_ENABLE_LL_PRIVACY))

+#define privacy_mode_capable(dev) (use_ll_privacy(dev) && \
+                                (hdev->commands[39] & 0x04))
+
/* Use enhanced synchronous connection if command is supported */
#define enhanced_sco_capable(dev) ((dev)->commands[29] & 0x08)
diff --git a/net/bluetooth/mgmt.c b/net/bluetooth/mgmt.c
index 06384d761928..8a8376d32be3 100644
--- a/net/bluetooth/mgmt.c
+++ b/net/bluetooth/mgmt.c
@@ -4350,7 +4350,16 @@ static int set_exp_feature(struct sock *sk, struct hci_dev *hdev,
                            MGMT_STATUS_NOT_SUPPORTED);
}

-#define SUPPORTED_DEVICE_FLAGS() ((1U << HCI_CONN_FLAG_MAX) - 1)
+static u32 supported_device_flags(struct hci_dev *hdev)
+{
+     u32 flags = BIT(HCI_CONN_FLAG_MAX) - 1;
+
+     /* Check if Privacy Mode can be set */
+     if (!privacy_mode_capable(hdev))
+             flags &= ~BIT(HCI_CONN_FLAG_DEVICE_PRIVACY);
+
+     return flags;
+}
I am lost on what we are doing, I know that SUPPORTED_DEVICE_FLAGS was introduced by 4c54bf2b093bb from Abhishek, but I fail to reason now why it is correct.
But we don't set the HCI_CONN_FLAG_DEVICE_PRIVACY is hdev is not
capable of setting it, anyway the general idea of the supported_flags
is to indicate to userspace what flags the kernel is capable of
settings, so yeah I would expected it to be capable of setting every
flag except for those the controller don't have proper support for.
Maybe you got confused by the logic of first enabling everything and
then toggle back the bits that are not supported by the hdev.
and I think that is wrong. We should only set the bits that the hardware and/or kernel supports. I have no idea on how I missed this in the review back then. I am trying to figure it out, but I am failing to follow this logic.

Regards

Marcel
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help