OSDN Git Service

Bluetooth: Introduce HCI_MGMT_HDEV_OPTIONAL option
authorMarcel Holtmann <marcel@holtmann.org>
Wed, 6 May 2020 07:57:49 +0000 (09:57 +0200)
committerMarcel Holtmann <marcel@holtmann.org>
Mon, 11 May 2020 10:13:38 +0000 (12:13 +0200)
When setting HCI_MGMT_HDEV_OPTIONAL it is possible to target a specific
conntroller or a global interface.

Signed-off-by: Marcel Holtmann <marcel@holtmann.org>
Signed-off-by: Johan Hedberg <johan.hedberg@intel.com>
include/net/bluetooth/hci_core.h
net/bluetooth/hci_sock.c

index 239ab72..0c7f3ad 100644 (file)
@@ -1554,6 +1554,7 @@ void hci_sock_dev_event(struct hci_dev *hdev, int event);
 #define HCI_MGMT_NO_HDEV       BIT(1)
 #define HCI_MGMT_UNTRUSTED     BIT(2)
 #define HCI_MGMT_UNCONFIGURED  BIT(3)
+#define HCI_MGMT_HDEV_OPTIONAL BIT(4)
 
 struct hci_mgmt_handler {
        int (*func) (struct sock *sk, struct hci_dev *hdev, void *data,
index 9c4a093..caf38a8 100644 (file)
@@ -1579,11 +1579,13 @@ static int hci_mgmt_cmd(struct hci_mgmt_chan *chan, struct sock *sk,
                }
        }
 
-       no_hdev = (handler->flags & HCI_MGMT_NO_HDEV);
-       if (no_hdev != !hdev) {
-               err = mgmt_cmd_status(sk, index, opcode,
-                                     MGMT_STATUS_INVALID_INDEX);
-               goto done;
+       if (!(handler->flags & HCI_MGMT_HDEV_OPTIONAL)) {
+               no_hdev = (handler->flags & HCI_MGMT_NO_HDEV);
+               if (no_hdev != !hdev) {
+                       err = mgmt_cmd_status(sk, index, opcode,
+                                             MGMT_STATUS_INVALID_INDEX);
+                       goto done;
+               }
        }
 
        var_len = (handler->flags & HCI_MGMT_VAR_LEN);