From 45da629b24f720019355fca8e1ddddb798ac409f Mon Sep 17 00:00:00 2001 From: Joakim Andersson Date: Fri, 2 Aug 2019 16:04:01 +0200 Subject: [PATCH] Bluetooth: Host: Fix wrong init address when controller resolved address The init addr should contain the on-air address used to establish the connection. The dst address contains either the current RPA of the unknown peer, or the identity address after identity information has been exchanged. Signed-off-by: Joakim Andersson --- subsys/bluetooth/host/conn.c | 14 ++++++++---- subsys/bluetooth/host/hci_core.c | 38 ++++++++++++++++++-------------- subsys/bluetooth/host/hci_core.h | 1 + 3 files changed, 33 insertions(+), 20 deletions(-) diff --git a/subsys/bluetooth/host/conn.c b/subsys/bluetooth/host/conn.c index 9deb2cfa850..3dbfd920f58 100644 --- a/subsys/bluetooth/host/conn.c +++ b/subsys/bluetooth/host/conn.c @@ -1929,6 +1929,7 @@ struct bt_conn *bt_conn_create_le(const bt_addr_le_t *peer, const struct bt_le_conn_param *param) { struct bt_conn *conn; + bt_addr_le_t dst; if (!atomic_test_bit(bt_dev.flags, BT_DEV_READY)) { return NULL; @@ -1957,7 +1958,15 @@ struct bt_conn *bt_conn_create_le(const bt_addr_le_t *peer, } } - conn = bt_conn_add_le(peer); + if (peer->type == BT_ADDR_LE_PUBLIC_ID || + peer->type == BT_ADDR_LE_RANDOM_ID) { + bt_addr_le_copy(&dst, peer); + dst.type -= BT_ADDR_LE_PUBLIC_ID; + } else { + bt_addr_le_copy(&dst, bt_lookup_id_addr(BT_ID_DEFAULT, peer)); + } + + conn = bt_conn_add_le(&dst); if (!conn) { return NULL; } @@ -1965,9 +1974,6 @@ struct bt_conn *bt_conn_create_le(const bt_addr_le_t *peer, /* Only default identity supported for now */ conn->id = BT_ID_DEFAULT; - /* Set initial address - will be updated later if necessary. */ - bt_addr_le_copy(&conn->le.resp_addr, peer); - bt_conn_set_param_le(conn, param); bt_conn_set_state(conn, BT_CONN_CONNECT_SCAN); diff --git a/subsys/bluetooth/host/hci_core.c b/subsys/bluetooth/host/hci_core.c index 2bdffa61153..a0922dd9941 100644 --- a/subsys/bluetooth/host/hci_core.c +++ b/subsys/bluetooth/host/hci_core.c @@ -356,7 +356,7 @@ int bt_hci_cmd_send_sync(u16_t opcode, struct net_buf *buf, } #if defined(CONFIG_BT_OBSERVER) || defined(CONFIG_BT_CONN) -static const bt_addr_le_t *find_id_addr(u8_t id, const bt_addr_le_t *addr) +const bt_addr_le_t *bt_lookup_id_addr(u8_t id, const bt_addr_le_t *addr) { if (IS_ENABLED(CONFIG_BT_SMP)) { struct bt_keys *keys; @@ -703,8 +703,8 @@ static int hci_le_create_conn(const struct bt_conn *conn) cp->scan_interval = sys_cpu_to_le16(BT_GAP_SCAN_FAST_INTERVAL); cp->scan_window = cp->scan_interval; - bt_addr_le_copy(&cp->peer_addr, &conn->le.resp_addr); - cp->own_addr_type = conn->le.init_addr.type; + bt_addr_le_copy(&cp->peer_addr, &conn->le.dst); + cp->own_addr_type = conn->le.dst.type; cp->conn_interval_min = sys_cpu_to_le16(conn->le.interval_min); cp->conn_interval_max = sys_cpu_to_le16(conn->le.interval_max); cp->conn_latency = sys_cpu_to_le16(conn->le.latency); @@ -1059,6 +1059,18 @@ static void enh_conn_complete(struct bt_hci_evt_le_enh_conn_complete *evt) } } + if (conn->role == BT_HCI_ROLE_MASTER) { + bt_addr_le_copy(&conn->le.resp_addr, &peer_addr); + + if (IS_ENABLED(CONFIG_BT_PRIVACY)) { + bt_addr_copy(&conn->le.init_addr.a, &evt->local_rpa); + conn->le.init_addr.type = BT_ADDR_LE_RANDOM; + } else { + bt_addr_le_copy(&conn->le.init_addr, + &bt_dev.id_addr[conn->id]); + } + } + bt_conn_set_state(conn, BT_CONN_CONNECTED); /* @@ -1135,9 +1147,9 @@ static void le_legacy_conn_complete(struct net_buf *buf) } if (evt->role == BT_HCI_ROLE_SLAVE) { - id_addr = find_id_addr(bt_dev.adv_id, &enh.peer_addr); + id_addr = bt_lookup_id_addr(bt_dev.adv_id, &enh.peer_addr); } else { - id_addr = find_id_addr(BT_ID_DEFAULT, &enh.peer_addr); + id_addr = bt_lookup_id_addr(BT_ID_DEFAULT, &enh.peer_addr); } if (id_addr != &enh.peer_addr) { @@ -1420,24 +1432,18 @@ static void check_pending_conn(const bt_addr_le_t *id_addr, if (le_set_private_addr(BT_ID_DEFAULT)) { goto failed; } - - bt_addr_le_copy(&conn->le.init_addr, &bt_dev.random_addr); } else { - const bt_addr_le_t *addr = &bt_dev.id_addr[conn->id]; + const bt_addr_le_t *own_addr = &bt_dev.id_addr[conn->id]; /* If Static Random address is used as Identity address we * need to restore it before creating connection. Otherwise * NRPA used for active scan could be used for connection. */ - if (addr->type == BT_ADDR_LE_RANDOM) { - set_random_address(&addr->a); + if (own_addr->type == BT_ADDR_LE_RANDOM) { + set_random_address(&own_addr->a); } - - bt_addr_le_copy(&conn->le.init_addr, addr); } - bt_addr_le_copy(&conn->le.resp_addr, addr); - if (hci_le_create_conn(conn)) { goto failed; } @@ -3419,8 +3425,8 @@ static void le_adv_report(struct net_buf *buf) id_addr.type -= BT_ADDR_LE_PUBLIC_ID; } else { bt_addr_le_copy(&id_addr, - find_id_addr(bt_dev.adv_id, - &info->addr)); + bt_lookup_id_addr(bt_dev.adv_id, + &info->addr)); } if (scan_dev_found_cb) { diff --git a/subsys/bluetooth/host/hci_core.h b/subsys/bluetooth/host/hci_core.h index 764156cbf07..c28d4ace358 100644 --- a/subsys/bluetooth/host/hci_core.h +++ b/subsys/bluetooth/host/hci_core.h @@ -186,6 +186,7 @@ bool bt_le_conn_params_valid(const struct bt_le_conn_param *param); int bt_le_scan_update(bool fast_scan); bool bt_addr_le_is_bonded(u8_t id, const bt_addr_le_t *addr); +const bt_addr_le_t *bt_lookup_id_addr(u8_t id, const bt_addr_le_t *addr); int bt_send(struct net_buf *buf);