Bluetooth: Fix incorrectly disabling page scan when toggling connectable
authorJohan Hedberg <johan.hedberg@intel.com>
Mon, 28 Jul 2014 17:53:58 +0000 (20:53 +0300)
committerMarcel Holtmann <marcel@holtmann.org>
Mon, 28 Jul 2014 18:13:32 +0000 (20:13 +0200)
If we have entries in the whitelist we shouldn't disable page scanning
when disabling connectable mode. This patch adds the necessary check to
the Set Connectable command handler.

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

index eb25a1259271968b03282a0f91deb3b507ed68f7..5d18efcb8467effd1db69a94760fe17df5c2c150 100644 (file)
@@ -1881,7 +1881,18 @@ static int set_connectable(struct sock *sk, struct hci_dev *hdev, void *data,
                if (cp->val) {
                        scan = SCAN_PAGE;
                } else {
-                       scan = 0;
+                       /* If we don't have any whitelist entries just
+                        * disable all scanning. If there are entries
+                        * and we had both page and inquiry scanning
+                        * enabled then fall back to only page scanning.
+                        * Otherwise no changes are needed.
+                        */
+                       if (list_empty(&hdev->whitelist))
+                               scan = SCAN_DISABLED;
+                       else if (test_bit(HCI_ISCAN, &hdev->flags))
+                               scan = SCAN_PAGE;
+                       else
+                               goto no_scan_update;
 
                        if (test_bit(HCI_ISCAN, &hdev->flags) &&
                            hdev->discov_timeout > 0)
@@ -1891,6 +1902,7 @@ static int set_connectable(struct sock *sk, struct hci_dev *hdev, void *data,
                hci_req_add(&req, HCI_OP_WRITE_SCAN_ENABLE, 1, &scan);
        }
 
+no_scan_update:
        /* If we're going from non-connectable to connectable or
         * vice-versa when fast connectable is enabled ensure that fast
         * connectable gets disabled. write_fast_connectable won't do