|
@@ -588,6 +588,7 @@ static struct hci_conn *hci_connect_le(struct hci_dev *hdev, bdaddr_t *dst,
|
|
|
{
|
|
|
struct hci_conn_params *params;
|
|
|
struct hci_conn *conn;
|
|
|
+ struct smp_irk *irk;
|
|
|
int err;
|
|
|
|
|
|
if (test_bit(HCI_ADVERTISING, &hdev->flags))
|
|
@@ -616,15 +617,23 @@ static struct hci_conn *hci_connect_le(struct hci_dev *hdev, bdaddr_t *dst,
|
|
|
if (conn)
|
|
|
return ERR_PTR(-EBUSY);
|
|
|
|
|
|
+ /* Convert from L2CAP channel address type to HCI address type */
|
|
|
+ if (dst_type == BDADDR_LE_PUBLIC)
|
|
|
+ dst_type = ADDR_LE_DEV_PUBLIC;
|
|
|
+ else
|
|
|
+ dst_type = ADDR_LE_DEV_RANDOM;
|
|
|
+
|
|
|
+ irk = hci_find_irk_by_addr(hdev, dst, dst_type);
|
|
|
+ if (irk && bacmp(&irk->rpa, BDADDR_ANY)) {
|
|
|
+ dst = &irk->rpa;
|
|
|
+ dst_type = ADDR_LE_DEV_RANDOM;
|
|
|
+ }
|
|
|
+
|
|
|
conn = hci_conn_add(hdev, LE_LINK, dst);
|
|
|
if (!conn)
|
|
|
return ERR_PTR(-ENOMEM);
|
|
|
|
|
|
- if (dst_type == BDADDR_LE_PUBLIC)
|
|
|
- conn->dst_type = ADDR_LE_DEV_PUBLIC;
|
|
|
- else
|
|
|
- conn->dst_type = ADDR_LE_DEV_RANDOM;
|
|
|
-
|
|
|
+ conn->dst_type = dst_type;
|
|
|
conn->src_type = hdev->own_addr_type;
|
|
|
|
|
|
conn->state = BT_CONNECT;
|