Bluetooth: Add flag to track the real advertising state
authorJohan Hedberg <johan.hedberg@intel.com>
Tue, 8 Jul 2014 12:07:47 +0000 (15:07 +0300)
committerMarcel Holtmann <marcel@holtmann.org>
Tue, 8 Jul 2014 12:22:05 +0000 (14:22 +0200)
Having a single HCI_ADVERTISING flag is problematic since it tries to
track both the real advertising state and the corresponding mgmt
setting. To make the logic simpler and more reliable add a new flag that
only tracks the actual advertising state that has been written to the
controller.

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

index 5481d1c..6ed1f72 100644 (file)
@@ -175,7 +175,7 @@ enum {
        HCI_UNCONFIGURED,
        HCI_USER_CHANNEL,
        HCI_EXT_CONFIGURED,
-
+       HCI_LE_ADV,
        HCI_LE_SCAN,
        HCI_SSP_ENABLED,
        HCI_SC_ENABLED,
@@ -200,7 +200,7 @@ enum {
  * or the HCI device is closed.
  */
 #define HCI_PERSISTENT_MASK (BIT(HCI_LE_SCAN) | BIT(HCI_PERIODIC_INQ) | \
-                             BIT(HCI_FAST_CONNECTABLE))
+                             BIT(HCI_FAST_CONNECTABLE) | BIT(HCI_LE_ADV))
 
 /* HCI ioctl defines */
 #define HCIDEVUP       _IOW('H', 201, int)
index a681649..10f8de9 100644 (file)
@@ -1069,11 +1069,15 @@ static void hci_cc_le_set_adv_enable(struct hci_dev *hdev, struct sk_buff *skb)
        if (*sent) {
                struct hci_conn *conn;
 
+               set_bit(HCI_LE_ADV, &hdev->dev_flags);
+
                conn = hci_conn_hash_lookup_state(hdev, LE_LINK, BT_CONNECT);
                if (conn)
                        queue_delayed_work(hdev->workqueue,
                                           &conn->le_conn_timeout,
                                           conn->conn_timeout);
+       } else {
+               clear_bit(HCI_LE_ADV, &hdev->dev_flags);
        }
 
        mgmt_advertising(hdev, *sent);