Return-Path: From: Andre Guedes To: linux-bluetooth@vger.kernel.org Cc: Andre Guedes Subject: [RFC v2 5/6] Bluetooth: Clear advertising cache before scanning Date: Fri, 11 Mar 2011 10:32:56 -0300 Message-Id: <1299850377-3734-6-git-send-email-andre.guedes@openbossa.org> In-Reply-To: <1299850377-3734-1-git-send-email-andre.guedes@openbossa.org> References: <1299850377-3734-1-git-send-email-andre.guedes@openbossa.org> Sender: linux-bluetooth-owner@vger.kernel.org List-ID: The LE advertising list should be cleared when a LE scanning is performed. This will force the list to contain only fresh advertising entries. In order to achieve that, it was added a handler to the Command Complete Event generated by the LE Set Scan Enable Command. Signed-off-by: Andre Guedes --- include/net/bluetooth/hci.h | 2 ++ include/net/bluetooth/hci_core.h | 1 + net/bluetooth/hci_core.c | 2 +- net/bluetooth/hci_event.c | 23 +++++++++++++++++++++++ 4 files changed, 27 insertions(+), 1 deletions(-) diff --git a/include/net/bluetooth/hci.h b/include/net/bluetooth/hci.h index de27caa..a936592 100644 --- a/include/net/bluetooth/hci.h +++ b/include/net/bluetooth/hci.h @@ -670,6 +670,8 @@ struct hci_rp_le_read_buffer_size { __u8 le_max_pkt; } __packed; +#define HCI_OP_LE_SET_SCAN_ENABLE 0x200c + #define HCI_OP_LE_CREATE_CONN 0x200d struct hci_cp_le_create_conn { __le16 scan_interval; diff --git a/include/net/bluetooth/hci_core.h b/include/net/bluetooth/hci_core.h index bf7b5df..3ead365 100644 --- a/include/net/bluetooth/hci_core.h +++ b/include/net/bluetooth/hci_core.h @@ -517,6 +517,7 @@ int hci_add_link_key(struct hci_dev *hdev, int new_key, bdaddr_t *bdaddr, u8 *key, u8 type, u8 pin_len); int hci_remove_link_key(struct hci_dev *hdev, bdaddr_t *bdaddr); +int hci_adv_entries_clear(struct hci_dev *hdev); struct adv_entry *hci_find_adv_entry(struct hci_dev *hdev, bdaddr_t *bdaddr); int hci_add_adv_entry(struct hci_dev *hdev, struct hci_ev_le_advertising_info *ev); diff --git a/net/bluetooth/hci_core.c b/net/bluetooth/hci_core.c index 71f8788..8f9b3a5 100644 --- a/net/bluetooth/hci_core.c +++ b/net/bluetooth/hci_core.c @@ -1081,7 +1081,7 @@ static void hci_cmd_timer(unsigned long arg) tasklet_schedule(&hdev->cmd_task); } -static int hci_adv_entries_clear(struct hci_dev *hdev) +int hci_adv_entries_clear(struct hci_dev *hdev) { struct list_head *p, *n; diff --git a/net/bluetooth/hci_event.c b/net/bluetooth/hci_event.c index 5019b76..fa1b43b 100644 --- a/net/bluetooth/hci_event.c +++ b/net/bluetooth/hci_event.c @@ -843,6 +843,25 @@ static void hci_cc_le_ltk_neg_reply(struct hci_dev *hdev, struct sk_buff *skb) hci_req_complete(hdev, HCI_OP_LE_LTK_NEG_REPLY, rp->status); } +static void hci_cc_le_set_scan_enable(struct hci_dev *hdev, + struct sk_buff *skb) +{ + void *sent; + __u8 param_scan_enable; + __u8 status = *((__u8 *) skb->data); + + if (status) + return; + + sent = hci_sent_cmd_data(hdev, HCI_OP_LE_SET_SCAN_ENABLE); + if (!sent) + return; + + param_scan_enable = *((__u8 *) sent); + if (param_scan_enable == 0x01) + hci_adv_entries_clear(hdev); +} + static inline void hci_cs_inquiry(struct hci_dev *hdev, __u8 status) { BT_DBG("%s status 0x%x", hdev->name, status); @@ -1799,6 +1818,10 @@ static inline void hci_cmd_complete_evt(struct hci_dev *hdev, struct sk_buff *sk hci_cc_le_ltk_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; -- 1.7.1