Bluetooth: Check for matching IRK when looking for paired LE devices
authorJohan Hedberg <johan.hedberg@intel.com>
Wed, 11 Mar 2015 08:52:08 +0000 (10:52 +0200)
committerMarcel Holtmann <marcel@holtmann.org>
Wed, 11 Mar 2015 14:54:23 +0000 (15:54 +0100)
If we're given an RPA when checking whether we're paired or not, we
should consult the local RPA storage whether there's a matching IRK.
This we we ensure that hci_bdaddr_is_paired() gives the right result
even when trying to pair a second time with the same device with an RPA.

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

index 4eba9d6..e3bbdd5 100644 (file)
@@ -2519,6 +2519,7 @@ void hci_remove_irk(struct hci_dev *hdev, bdaddr_t *bdaddr, u8 addr_type)
 bool hci_bdaddr_is_paired(struct hci_dev *hdev, bdaddr_t *bdaddr, u8 type)
 {
        struct smp_ltk *k;
+       struct smp_irk *irk;
        u8 addr_type;
 
        if (type == BDADDR_BREDR) {
@@ -2533,6 +2534,12 @@ bool hci_bdaddr_is_paired(struct hci_dev *hdev, bdaddr_t *bdaddr, u8 type)
        else
                addr_type = ADDR_LE_DEV_RANDOM;
 
+       irk = hci_get_irk(hdev, bdaddr, addr_type);
+       if (irk) {
+               bdaddr = &irk->bdaddr;
+               addr_type = irk->addr_type;
+       }
+
        rcu_read_lock();
        list_for_each_entry_rcu(k, &hdev->long_term_keys, list) {
                if (k->bdaddr_type == addr_type && !bacmp(bdaddr, &k->bdaddr)) {