Bluetooth: Clear advertising cache before scanning
authorAndre Guedes <andre.guedes@openbossa.org>
Thu, 26 May 2011 19:23:52 +0000 (16:23 -0300)
committerGustavo F. Padovan <padovan@profusion.mobi>
Wed, 8 Jun 2011 19:58:17 +0000 (16:58 -0300)
The LE advertising cache should be cleared before performing a LE
scanning. This will force the cache to contain only fresh advertising
entries.

Signed-off-by: Andre Guedes <andre.guedes@openbossa.org>
Signed-off-by: Gustavo F. Padovan <padovan@profusion.mobi>
include/net/bluetooth/hci.h
net/bluetooth/hci_event.c

index 9317798fabcd557f05c227671648220ffbba1824..bd285c6a5509785aa3ee97ae9889cd4919058ec3 100644 (file)
@@ -710,6 +710,12 @@ struct hci_rp_le_read_buffer_size {
        __u8     le_max_pkt;
 } __packed;
 
+#define HCI_OP_LE_SET_SCAN_ENABLE      0x200c
+struct hci_cp_le_set_scan_enable {
+       __u8     enable;
+       __u8     filter_dup;
+} __packed;
+
 #define HCI_OP_LE_CREATE_CONN          0x200d
 struct hci_cp_le_create_conn {
        __le16   scan_interval;
index db74958d3ad92546eb962aa3455a74de51356501..056f7b2fa02f31fc75932ecd0a038ca665ffafb0 100644 (file)
@@ -839,6 +839,29 @@ static void hci_cc_read_local_oob_data_reply(struct hci_dev *hdev,
                                                rp->randomizer, rp->status);
 }
 
+static void hci_cc_le_set_scan_enable(struct hci_dev *hdev,
+                                       struct sk_buff *skb)
+{
+       struct hci_cp_le_set_scan_enable *cp;
+       __u8 status = *((__u8 *) skb->data);
+
+       BT_DBG("%s status 0x%x", hdev->name, status);
+
+       if (status)
+               return;
+
+       cp = hci_sent_cmd_data(hdev, HCI_OP_LE_SET_SCAN_ENABLE);
+       if (!cp)
+               return;
+
+       hci_dev_lock(hdev);
+
+       if (cp->enable == 0x01)
+               hci_adv_entries_clear(hdev);
+
+       hci_dev_unlock(hdev);
+}
+
 static inline void hci_cs_inquiry(struct hci_dev *hdev, __u8 status)
 {
        BT_DBG("%s status 0x%x", hdev->name, status);
@@ -1814,6 +1837,10 @@ static inline void hci_cmd_complete_evt(struct hci_dev *hdev, struct sk_buff *sk
                hci_cc_user_confirm_neg_reply(hdev, skb);
                break;
 
+       case HCI_OP_LE_SET_SCAN_ENABLE:
+               hci_cc_le_set_scan_enable(hdev, skb);
+               break;
+
        default:
                BT_DBG("%s opcode 0x%x", hdev->name, opcode);
                break;