Bluetooth: Fix using global connectable settings for adv
authorArman Uguray <armansito@chromium.org>
Sat, 28 Mar 2015 19:38:58 +0000 (12:38 -0700)
committerMarcel Holtmann <marcel@holtmann.org>
Sat, 28 Mar 2015 20:31:57 +0000 (21:31 +0100)
This patch fixes a bug where ADV_NONCONN_IND was being used for
advertising instances >0 while the global connectable setting was
set to "on".

Signed-off-by: Arman Uguray <armansito@chromium.org>
Signed-off-by: Marcel Holtmann <marcel@holtmann.org>
net/bluetooth/mgmt.c

index fb2e764c62113d8f08768e6dd118b081f7be0531..d998ec360598334d925dabe8120280afcbfc67cd 100644 (file)
@@ -985,9 +985,10 @@ static u32 get_adv_instance_flags(struct hci_dev *hdev, u8 instance)
        /* Instance 0 always manages the "Tx Power" and "Flags" fields */
        flags = MGMT_ADV_FLAG_TX_POWER | MGMT_ADV_FLAG_MANAGED_FLAGS;
 
-       /* For instance 0, assemble the flags from global settings */
-       if (hci_dev_test_flag(hdev, HCI_ADVERTISING_CONNECTABLE) ||
-           get_connectable(hdev))
+       /* For instance 0, the HCI_ADVERTISING_CONNECTABLE setting corresponds
+        * to the "connectable" instance flag.
+        */
+       if (hci_dev_test_flag(hdev, HCI_ADVERTISING_CONNECTABLE))
                flags |= MGMT_ADV_FLAG_CONNECTABLE;
 
        return flags;
@@ -1242,7 +1243,12 @@ static void enable_advertising(struct hci_request *req)
 
        instance = get_current_adv_instance(hdev);
        flags = get_adv_instance_flags(hdev, instance);
-       connectable = (flags & MGMT_ADV_FLAG_CONNECTABLE);
+
+       /* If the "connectable" instance flag was not set, then choose between
+        * ADV_IND and ADV_NONCONN_IND based on the global connectable setting.
+        */
+       connectable = (flags & MGMT_ADV_FLAG_CONNECTABLE) ||
+                     get_connectable(hdev);
 
        /* Set require_privacy to true only when non-connectable
         * advertising is used. In that case it is fine to use a