Bluetooth: Gracefully response to enabling LE on LE only devices
authorMarcel Holtmann <marcel@holtmann.org>
Wed, 18 Mar 2015 23:15:07 +0000 (16:15 -0700)
committerJohan Hedberg <johan.hedberg@intel.com>
Fri, 20 Mar 2015 12:05:27 +0000 (14:05 +0200)
Currently the enabling of LE on LE only devices causes an error. This
is a bit difference from other commands where trying to set the same
existing settings causes a positive response. Fix this behavior for
this single corner case.

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

index f3a9579051931ce9215b918a438df3cf5eb77294..cee9bc9735af945aa832412d5ed0cb7544bbcbe8 100644 (file)
@@ -2209,10 +2209,22 @@ static int set_le(struct sock *sk, struct hci_dev *hdev, void *data, u16 len)
                return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_LE,
                                       MGMT_STATUS_INVALID_PARAMS);
 
-       /* LE-only devices do not allow toggling LE on/off */
-       if (!hci_dev_test_flag(hdev, HCI_BREDR_ENABLED))
+       /* Bluetooth single mode LE only controllers or dual-mode
+        * controllers configured as LE only devices, do not allow
+        * switching LE off. These have either LE enabled explicitly
+        * or BR/EDR has been previously switched off.
+        *
+        * When trying to enable an already enabled LE, then gracefully
+        * send a positive response. Trying to disable it however will
+        * result into rejection.
+        */
+       if (!hci_dev_test_flag(hdev, HCI_BREDR_ENABLED)) {
+               if (cp->val == 0x01)
+                       return send_settings_rsp(sk, MGMT_OP_SET_LE, hdev);
+
                return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_LE,
                                       MGMT_STATUS_REJECTED);
+       }
 
        hci_dev_lock(hdev);