mirror of https://lore.kernel.org/lkml/
 help / color / mirror / Atom feed
* [PATCH 0/1] Bluetooth: mgmt: Add command for getting device IO capabilities.
@ 2024-02-10 22:22 Vibhav Pant
  2024-02-10 22:22 ` [PATCH 1/1] " Vibhav Pant
  2024-02-11 15:57 ` [PATCH 0/1] " Luiz Augusto von Dentz
  0 siblings, 2 replies; 3+ messages in thread
From: Vibhav Pant @ 2024-02-10 22:22 UTC (permalink / raw)
  To: linux-bluetooth; +Cc: marcel, johan.hedberg, linux-kernel, Vibhav Pant

The following patch adds a new command to the bluetooth management interface,
GET_DEVICE_IO_CAPABILITY. The command allows userspace to get the IO capability,
and the authentication methods supported by a connected device. The command is
necessary in order to implement parts of the Win32 Bluetooth API in the Wine,
specifically the following two structs:

* BLUETOOTH_AUTHENTICATION_CALLBACK_PARAMS, which provides IO and auth capabilities
info for an incoming authentication request from a device.

* BTH_DEVICE_INFO, which contains flags indicating whether the device supports
Simple Secure Pairing and MITM protection. The former is supported through BlueZ's
"LegacyPairing" property.

Because the Wine API are implemented on top of BlueZ, I'll also be providing a
corresponding patch that uses the newly added management command to expose the
capabilities through new properties in the org.bluez.Device1 interface.

Thanks,
Vibhav

Vibhav Pant (1):
  Bluetooth: mgmt: Add command for getting device IO capabilities.

 include/net/bluetooth/mgmt.h | 19 ++++++++
 net/bluetooth/mgmt.c         | 89 ++++++++++++++++++++++++++++++++++++
 2 files changed, 108 insertions(+)

-- 
2.43.0


^ permalink raw reply	[flat|nested] 3+ messages in thread

* [PATCH 1/1] Bluetooth: mgmt: Add command for getting device IO capabilities.
  2024-02-10 22:22 [PATCH 0/1] Bluetooth: mgmt: Add command for getting device IO capabilities Vibhav Pant
@ 2024-02-10 22:22 ` Vibhav Pant
  2024-02-11 15:57 ` [PATCH 0/1] " Luiz Augusto von Dentz
  1 sibling, 0 replies; 3+ messages in thread
From: Vibhav Pant @ 2024-02-10 22:22 UTC (permalink / raw)
  To: linux-bluetooth; +Cc: marcel, johan.hedberg, linux-kernel, Vibhav Pant

get_device_io_capability allows to get a connected device's IO
capabilities, including the authentication method (and MITM support)
requested, stored in the hci_conn for the device.

Signed-off-by: Vibhav Pant <vibhavp@gmail.com>
---
 include/net/bluetooth/mgmt.h | 19 ++++++++
 net/bluetooth/mgmt.c         | 89 ++++++++++++++++++++++++++++++++++++
 2 files changed, 108 insertions(+)

diff --git a/include/net/bluetooth/mgmt.h b/include/net/bluetooth/mgmt.h
index d382679efd2b..dba431baaef8 100644
--- a/include/net/bluetooth/mgmt.h
+++ b/include/net/bluetooth/mgmt.h
@@ -878,6 +878,25 @@ struct mgmt_cp_mesh_send_cancel {
 } __packed;
 #define MGMT_MESH_SEND_CANCEL_SIZE	1
 
+#define MGMT_OP_GET_DEVICE_IO_CAPABILITY         0x005B
+struct mgmt_cp_get_device_io_capability {
+	struct mgmt_addr_info addr;
+} __packed;
+#define MGMT_GET_DEVICE_IO_CAPABILITY_SIZE       MGMT_ADDR_INFO_SIZE
+struct mgmt_rp_get_device_io_capability {
+	struct mgmt_addr_info addr;
+	__u8 flags;
+} __packed;
+
+#define MGMT_DEVICE_IO_CAP_FLAG_IO_DISPLAY_ONLY       BIT(0)
+#define MGMT_DEVICE_IO_CAP_FLAG_IO_DISPLAY_YESNO      BIT(1)
+#define MGMT_DEVICE_IO_CAP_FLAG_IO_KEYBOARD_ONLY      BIT(2)
+#define MGMT_DEVICE_IO_CAP_FLAG_IO_NO_INPUT_OUTPUT    BIT(3)
+#define MGMT_DEVICE_IO_CAP_FLAG_AT_NO_BONDING         BIT(4)
+#define MGMT_DEVICE_IO_CAP_FLAG_AT_DEDICATED_BONDING  BIT(5)
+#define MGMT_DEVICE_IO_CAP_FLAG_AT_GENERAL_BONDING    BIT(6)
+#define MGMT_DEVICE_IO_CAP_FLAG_AT_MITM               BIT(7)
+
 #define MGMT_EV_CMD_COMPLETE		0x0001
 struct mgmt_ev_cmd_complete {
 	__le16	opcode;
diff --git a/net/bluetooth/mgmt.c b/net/bluetooth/mgmt.c
index 78ab562807d0..92b4317e60a1 100644
--- a/net/bluetooth/mgmt.c
+++ b/net/bluetooth/mgmt.c
@@ -28,6 +28,7 @@
 #include <asm/unaligned.h>
 
 #include <net/bluetooth/bluetooth.h>
+#include <net/bluetooth/hci.h>
 #include <net/bluetooth/hci_core.h>
 #include <net/bluetooth/hci_sock.h>
 #include <net/bluetooth/l2cap.h>
@@ -67,6 +68,7 @@ static const u16 mgmt_commands[] = {
 	MGMT_OP_PIN_CODE_REPLY,
 	MGMT_OP_PIN_CODE_NEG_REPLY,
 	MGMT_OP_SET_IO_CAPABILITY,
+	MGMT_OP_GET_DEVICE_IO_CAPABILITY,
 	MGMT_OP_PAIR_DEVICE,
 	MGMT_OP_CANCEL_PAIR_DEVICE,
 	MGMT_OP_UNPAIR_DEVICE,
@@ -3303,6 +3305,92 @@ static int set_io_capability(struct sock *sk, struct hci_dev *hdev, void *data,
 				 NULL, 0);
 }
 
+static int get_device_io_capability(struct sock *sk, struct hci_dev *hdev,
+				    void *data, u16 len)
+{
+	struct mgmt_cp_get_device_io_capability *cp = data;
+	struct mgmt_rp_get_device_io_capability rp;
+	struct hci_conn *conn;
+	int err = 0;
+
+	bt_dev_dbg(hdev, "sock %p", sk);
+
+	memset(&rp, 0, sizeof(rp));
+	bacpy(&rp.addr.bdaddr, &cp->addr.bdaddr);
+	rp.addr.type = cp->addr.type;
+
+	if (!bdaddr_type_is_valid(cp->addr.type))
+		return mgmt_cmd_complete(sk, hdev->id,
+					 MGMT_OP_GET_DEVICE_IO_CAPABILITY,
+					 MGMT_STATUS_INVALID_PARAMS, &rp,
+					 sizeof(rp));
+	hci_dev_lock(hdev);
+
+	if (!hdev_is_powered(hdev)) {
+		err = mgmt_cmd_complete(sk, hdev->id,
+					MGMT_OP_GET_DEVICE_IO_CAPABILITY,
+					MGMT_STATUS_NOT_POWERED, &rp,
+					sizeof(rp));
+		goto unlock;
+	}
+
+	if (cp->addr.type == BDADDR_BREDR)
+		conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK,
+					       &cp->addr.bdaddr);
+	else
+		conn = hci_conn_hash_lookup_ba(hdev, LE_LINK, &cp->addr.bdaddr);
+
+	if (!conn) {
+		err = mgmt_cmd_complete(sk, hdev->id,
+					MGMT_OP_GET_DEVICE_IO_CAPABILITY,
+					MGMT_STATUS_NOT_CONNECTED, &rp,
+					sizeof(rp));
+		goto unlock;
+	}
+
+	switch (conn->remote_cap) {
+	case HCI_IO_DISPLAY_ONLY:
+		rp.flags |= MGMT_DEVICE_IO_CAP_FLAG_IO_DISPLAY_ONLY;
+		break;
+	case HCI_IO_DISPLAY_YESNO:
+		rp.flags |= MGMT_DEVICE_IO_CAP_FLAG_IO_DISPLAY_YESNO;
+		break;
+	case HCI_IO_KEYBOARD_ONLY:
+		rp.flags |= MGMT_DEVICE_IO_CAP_FLAG_IO_KEYBOARD_ONLY;
+		break;
+	case HCI_IO_NO_INPUT_OUTPUT:
+		rp.flags |= MGMT_DEVICE_IO_CAP_FLAG_IO_NO_INPUT_OUTPUT;
+		break;
+	}
+
+	switch (conn->remote_auth) {
+	case HCI_AT_NO_BONDING_MITM:
+		rp.flags |= MGMT_DEVICE_IO_CAP_FLAG_AT_MITM;
+		fallthrough;
+	case HCI_AT_NO_BONDING:
+		rp.flags |= MGMT_DEVICE_IO_CAP_FLAG_AT_NO_BONDING;
+		break;
+	case HCI_AT_DEDICATED_BONDING_MITM:
+		rp.flags |= MGMT_DEVICE_IO_CAP_FLAG_AT_MITM;
+		fallthrough;
+	case HCI_AT_DEDICATED_BONDING:
+		rp.flags |= MGMT_DEVICE_IO_CAP_FLAG_AT_DEDICATED_BONDING;
+		break;
+	case HCI_AT_GENERAL_BONDING_MITM:
+		rp.flags |= MGMT_DEVICE_IO_CAP_FLAG_AT_MITM;
+		fallthrough;
+	case HCI_AT_GENERAL_BONDING:
+		rp.flags |= MGMT_DEVICE_IO_CAP_FLAG_AT_GENERAL_BONDING;
+		break;
+	}
+
+	err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_GET_DEVICE_IO_CAPABILITY,
+				MGMT_STATUS_SUCCESS, &rp, sizeof(rp));
+unlock:
+	hci_dev_unlock(hdev);
+	return err;
+}
+
 static struct mgmt_pending_cmd *find_pairing(struct hci_conn *conn)
 {
 	struct hci_dev *hdev = conn->hdev;
@@ -9217,6 +9305,7 @@ static const struct hci_mgmt_handler mgmt_handlers[] = {
 	{ pin_code_reply,          MGMT_PIN_CODE_REPLY_SIZE },
 	{ pin_code_neg_reply,      MGMT_PIN_CODE_NEG_REPLY_SIZE },
 	{ set_io_capability,       MGMT_SET_IO_CAPABILITY_SIZE },
+	{ get_device_io_capability,MGMT_GET_DEVICE_IO_CAPABILITY_SIZE },
 	{ pair_device,             MGMT_PAIR_DEVICE_SIZE },
 	{ cancel_pair_device,      MGMT_CANCEL_PAIR_DEVICE_SIZE },
 	{ unpair_device,           MGMT_UNPAIR_DEVICE_SIZE },
-- 
2.43.0


^ permalink raw reply	[flat|nested] 3+ messages in thread

* Re: [PATCH 0/1] Bluetooth: mgmt: Add command for getting device IO capabilities.
  2024-02-10 22:22 [PATCH 0/1] Bluetooth: mgmt: Add command for getting device IO capabilities Vibhav Pant
  2024-02-10 22:22 ` [PATCH 1/1] " Vibhav Pant
@ 2024-02-11 15:57 ` Luiz Augusto von Dentz
  1 sibling, 0 replies; 3+ messages in thread
From: Luiz Augusto von Dentz @ 2024-02-11 15:57 UTC (permalink / raw)
  To: Vibhav Pant; +Cc: linux-bluetooth, marcel, johan.hedberg, linux-kernel

Hi Vibhav,

On Sat, Feb 10, 2024 at 5:22 PM Vibhav Pant <vibhavp@gmail.com> wrote:
>
> The following patch adds a new command to the bluetooth management interface,
> GET_DEVICE_IO_CAPABILITY. The command allows userspace to get the IO capability,
> and the authentication methods supported by a connected device. The command is
> necessary in order to implement parts of the Win32 Bluetooth API in the Wine,
> specifically the following two structs:
>
> * BLUETOOTH_AUTHENTICATION_CALLBACK_PARAMS, which provides IO and auth capabilities
> info for an incoming authentication request from a device.
>
> * BTH_DEVICE_INFO, which contains flags indicating whether the device supports
> Simple Secure Pairing and MITM protection. The former is supported through BlueZ's
> "LegacyPairing" property.
>
> Because the Wine API are implemented on top of BlueZ, I'll also be providing a
> corresponding patch that uses the newly added management command to expose the
> capabilities through new properties in the org.bluez.Device1 interface.

Interesting, but the IO capability matching logic lives under the
kernel so I wonder how useful this information is if you can't really
do much about the authentication method used? And in case you are
thinking of changing the pairing procedure to just leave it up to the
upper layer to figure it out, I don't think that is a good idea
because that is subject to qualification that would effectively be a
new implementation.

> Thanks,
> Vibhav
>
> Vibhav Pant (1):
>   Bluetooth: mgmt: Add command for getting device IO capabilities.
>
>  include/net/bluetooth/mgmt.h | 19 ++++++++
>  net/bluetooth/mgmt.c         | 89 ++++++++++++++++++++++++++++++++++++
>  2 files changed, 108 insertions(+)
>
> --
> 2.43.0
>
>


-- 
Luiz Augusto von Dentz

^ permalink raw reply	[flat|nested] 3+ messages in thread

end of thread, other threads:[~2024-02-11 15:57 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2024-02-10 22:22 [PATCH 0/1] Bluetooth: mgmt: Add command for getting device IO capabilities Vibhav Pant
2024-02-10 22:22 ` [PATCH 1/1] " Vibhav Pant
2024-02-11 15:57 ` [PATCH 0/1] " Luiz Augusto von Dentz

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox

all inboxes | Powered by JetHome®