Bluetooth: Fix not generating RPA when required
Code was checking if random_addr and hdev->rpa match without first checking if the RPA has not been set (BDADDR_ANY), furthermore it was clearing HCI_RPA_EXPIRED before the command completes and the RPA is actually programmed which in case of failure would leave the expired RPA still set. Since advertising instance have a similar problem the clearing of HCI_RPA_EXPIRED has been moved to hci_event.c after checking the random address is in fact the hdev->rap and then proceed to set the expire timeout. Signed-off-by: Luiz Augusto von Dentz <luiz.von.dentz@intel.com> Signed-off-by: Marcel Holtmann <marcel@holtmann.org>
This commit is contained in:
committed by
Marcel Holtmann
parent
102793136c
commit
c45074d68a
@@ -40,6 +40,8 @@
|
||||
#define ZERO_KEY "\x00\x00\x00\x00\x00\x00\x00\x00" \
|
||||
"\x00\x00\x00\x00\x00\x00\x00\x00"
|
||||
|
||||
#define secs_to_jiffies(_secs) msecs_to_jiffies((_secs) * 1000)
|
||||
|
||||
/* Handle HCI Event packets */
|
||||
|
||||
static void hci_cc_inquiry_cancel(struct hci_dev *hdev, struct sk_buff *skb,
|
||||
@@ -1171,6 +1173,12 @@ static void hci_cc_le_set_random_addr(struct hci_dev *hdev, struct sk_buff *skb)
|
||||
|
||||
bacpy(&hdev->random_addr, sent);
|
||||
|
||||
if (!bacmp(&hdev->rpa, sent)) {
|
||||
hci_dev_clear_flag(hdev, HCI_RPA_EXPIRED);
|
||||
queue_delayed_work(hdev->workqueue, &hdev->rpa_expired,
|
||||
secs_to_jiffies(hdev->rpa_timeout));
|
||||
}
|
||||
|
||||
hci_dev_unlock(hdev);
|
||||
}
|
||||
|
||||
@@ -1201,24 +1209,30 @@ static void hci_cc_le_set_adv_set_random_addr(struct hci_dev *hdev,
|
||||
{
|
||||
__u8 status = *((__u8 *) skb->data);
|
||||
struct hci_cp_le_set_adv_set_rand_addr *cp;
|
||||
struct adv_info *adv_instance;
|
||||
struct adv_info *adv;
|
||||
|
||||
if (status)
|
||||
return;
|
||||
|
||||
cp = hci_sent_cmd_data(hdev, HCI_OP_LE_SET_ADV_SET_RAND_ADDR);
|
||||
if (!cp)
|
||||
/* Update only in case the adv instance since handle 0x00 shall be using
|
||||
* HCI_OP_LE_SET_RANDOM_ADDR since that allows both extended and
|
||||
* non-extended adverting.
|
||||
*/
|
||||
if (!cp || !cp->handle)
|
||||
return;
|
||||
|
||||
hci_dev_lock(hdev);
|
||||
|
||||
if (!cp->handle) {
|
||||
/* Store in hdev for instance 0 (Set adv and Directed advs) */
|
||||
bacpy(&hdev->random_addr, &cp->bdaddr);
|
||||
} else {
|
||||
adv_instance = hci_find_adv_instance(hdev, cp->handle);
|
||||
if (adv_instance)
|
||||
bacpy(&adv_instance->random_addr, &cp->bdaddr);
|
||||
adv = hci_find_adv_instance(hdev, cp->handle);
|
||||
if (adv) {
|
||||
bacpy(&adv->random_addr, &cp->bdaddr);
|
||||
if (!bacmp(&hdev->rpa, &cp->bdaddr)) {
|
||||
adv->rpa_expired = false;
|
||||
queue_delayed_work(hdev->workqueue,
|
||||
&adv->rpa_expired_cb,
|
||||
secs_to_jiffies(hdev->rpa_timeout));
|
||||
}
|
||||
}
|
||||
|
||||
hci_dev_unlock(hdev);
|
||||
|
||||
Reference in New Issue
Block a user