Bluetooth: Track the LE Identity Address in struct hci_conn
authorJohan Hedberg <johan.hedberg@intel.com>
Tue, 18 Feb 2014 19:41:32 +0000 (21:41 +0200)
committerMarcel Holtmann <marcel@holtmann.org>
Tue, 18 Feb 2014 19:48:54 +0000 (11:48 -0800)
Since we want user space to see and use the LE Identity Address whenever
interfacing with the kernel it makes sense to track that instead of the
real address (the two will only be different in the case of an RPA).
This patch adds the necessary updates to when an LE connection gets
established and when receiving the Identity Address from a remote
device.

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

index d2c6878a9d6a98af67aab41c84351ee3ed9404dd..49a2d4d841df4d833c0704d89fb61d82d7cdd264 100644 (file)
@@ -3568,6 +3568,7 @@ static void hci_le_conn_complete_evt(struct hci_dev *hdev, struct sk_buff *skb)
 {
        struct hci_ev_le_conn_complete *ev = (void *) skb->data;
        struct hci_conn *conn;
+       struct smp_irk *irk;
 
        BT_DBG("%s status 0x%2.2x", hdev->name, ev->status);
 
@@ -3600,6 +3601,13 @@ static void hci_le_conn_complete_evt(struct hci_dev *hdev, struct sk_buff *skb)
                }
        }
 
+       /* Track the connection based on the Identity Address from now on */
+       irk = hci_get_irk(hdev, &ev->bdaddr, ev->bdaddr_type);
+       if (irk) {
+               bacpy(&conn->dst, &irk->bdaddr);
+               conn->dst_type = irk->addr_type;
+       }
+
        if (ev->status) {
                mgmt_connect_failed(hdev, &conn->dst, conn->type,
                                    conn->dst_type, ev->status);
index 8517d1f0984df4261349a6840d85828630e3a36f..af29afed0cca10642060df53aa9a64da89d40724 100644 (file)
@@ -987,6 +987,10 @@ static int smp_cmd_ident_addr_info(struct l2cap_conn *conn,
        hci_add_irk(conn->hcon->hdev, &smp->id_addr, smp->id_addr_type,
                    smp->irk, &rpa);
 
+       /* Track the connection based on the Identity Address from now on */
+       bacpy(&hcon->dst, &smp->id_addr);
+       hcon->dst_type = smp->id_addr_type;
+
        smp_distribute_keys(conn, 1);
 
        return 0;