|
@@ -749,18 +749,31 @@ static bool conn_use_rpa(struct hci_conn *conn)
|
|
|
}
|
|
|
|
|
|
static void hci_req_add_le_create_conn(struct hci_request *req,
|
|
|
- struct hci_conn *conn)
|
|
|
+ struct hci_conn *conn,
|
|
|
+ bdaddr_t *direct_rpa)
|
|
|
{
|
|
|
struct hci_cp_le_create_conn cp;
|
|
|
struct hci_dev *hdev = conn->hdev;
|
|
|
u8 own_addr_type;
|
|
|
|
|
|
- /* Update random address, but set require_privacy to false so
|
|
|
- * that we never connect with an non-resolvable address.
|
|
|
+ /* If direct address was provided we use it instead of current
|
|
|
+ * address.
|
|
|
*/
|
|
|
- if (hci_update_random_address(req, false, conn_use_rpa(conn),
|
|
|
- &own_addr_type))
|
|
|
- return;
|
|
|
+ if (direct_rpa) {
|
|
|
+ if (bacmp(&req->hdev->random_addr, direct_rpa))
|
|
|
+ hci_req_add(req, HCI_OP_LE_SET_RANDOM_ADDR, 6,
|
|
|
+ direct_rpa);
|
|
|
+
|
|
|
+ /* direct address is always RPA */
|
|
|
+ own_addr_type = ADDR_LE_DEV_RANDOM;
|
|
|
+ } else {
|
|
|
+ /* Update random address, but set require_privacy to false so
|
|
|
+ * that we never connect with an non-resolvable address.
|
|
|
+ */
|
|
|
+ if (hci_update_random_address(req, false, conn_use_rpa(conn),
|
|
|
+ &own_addr_type))
|
|
|
+ return;
|
|
|
+ }
|
|
|
|
|
|
memset(&cp, 0, sizeof(cp));
|
|
|
|
|
@@ -825,7 +838,7 @@ static void hci_req_directed_advertising(struct hci_request *req,
|
|
|
|
|
|
struct hci_conn *hci_connect_le(struct hci_dev *hdev, bdaddr_t *dst,
|
|
|
u8 dst_type, u8 sec_level, u16 conn_timeout,
|
|
|
- u8 role)
|
|
|
+ u8 role, bdaddr_t *direct_rpa)
|
|
|
{
|
|
|
struct hci_conn_params *params;
|
|
|
struct hci_conn *conn;
|
|
@@ -940,7 +953,7 @@ struct hci_conn *hci_connect_le(struct hci_dev *hdev, bdaddr_t *dst,
|
|
|
hci_dev_set_flag(hdev, HCI_LE_SCAN_INTERRUPTED);
|
|
|
}
|
|
|
|
|
|
- hci_req_add_le_create_conn(&req, conn);
|
|
|
+ hci_req_add_le_create_conn(&req, conn, direct_rpa);
|
|
|
|
|
|
create_conn:
|
|
|
err = hci_req_run(&req, create_le_conn_complete);
|