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 239ab72f16c6edfc1c5adad8b5af59c2416f23f3..0c7f3ad7666522ff7b9e9f8b871245f29f14e1ea 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 9c4a093f89607620f7d4c0c633f3bec84f10f751..caf38a8ea6a8ba07f29647824862b9d86436e1ca 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);