mirror of
https://github.com/espressif/esp-nimble.git
synced 2026-10-30 09:13:31 +00:00
nimble/gap: Fix assert on slave connection with ext advertising
When extended advertising is enabled and advertising instance is configured to own_address_type=random, it is using per instance random address and not global random address. We need to store address set in instance and pass it to connection object so that it can be returned as ID address.
This commit is contained in:
@@ -152,14 +152,15 @@ struct ble_gap_slave_state {
|
||||
unsigned int preempted:1; /** Set to 1 if advertising was preempted. */
|
||||
unsigned int connectable:1;
|
||||
|
||||
#if MYNEWT_VAL(BLE_EXT_ADV)
|
||||
unsigned int configured:1; /** If instance is configured */
|
||||
unsigned int scannable:1;
|
||||
unsigned int directed:1;
|
||||
unsigned int legacy_pdu:1;
|
||||
unsigned int rnd_addr_set:1;
|
||||
|
||||
uint8_t rnd_addr[6];
|
||||
#else
|
||||
/* timer is used only with legacy advertising */
|
||||
#if !MYNEWT_VAL(BLE_EXT_ADV)
|
||||
unsigned int exp_set:1;
|
||||
ble_npl_time_t exp_os_ticks;
|
||||
#endif
|
||||
@@ -1424,6 +1425,9 @@ ble_gap_rx_conn_complete(struct hci_le_conn_complete *evt, uint8_t instance)
|
||||
conn->bhc_cb = ble_gap_slave[instance].cb;
|
||||
conn->bhc_cb_arg = ble_gap_slave[instance].cb_arg;
|
||||
conn->bhc_our_addr_type = ble_gap_slave[instance].our_addr_type;
|
||||
#if MYNEWT_VAL(BLE_EXT_ADV)
|
||||
memcpy(conn->bhc_our_rnd_addr, ble_gap_slave[instance].rnd_addr, 6);
|
||||
#endif
|
||||
ble_gap_slave_reset_state(instance);
|
||||
}
|
||||
|
||||
@@ -2565,6 +2569,7 @@ ble_gap_ext_adv_set_addr_no_lock(uint8_t instance, const uint8_t *addr)
|
||||
}
|
||||
|
||||
ble_gap_slave[instance].rnd_addr_set = 1;
|
||||
memcpy(ble_gap_slave[instance].rnd_addr, addr, 6);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -365,8 +365,23 @@ ble_hs_conn_addrs(const struct ble_hs_conn *conn,
|
||||
/* Determine our address information. */
|
||||
addrs->our_id_addr.type =
|
||||
ble_hs_misc_addr_type_to_id(conn->bhc_our_addr_type);
|
||||
|
||||
#if MYNEWT_VAL(BLE_EXT_ADV)
|
||||
/* With EA enabled random address for slave connection is per advertising
|
||||
* instance and requires special handling here.
|
||||
*/
|
||||
|
||||
if (!(conn->bhc_flags & BLE_HS_CONN_F_MASTER) &&
|
||||
addrs->our_id_addr.type == BLE_ADDR_RANDOM) {
|
||||
our_id_addr_val = conn->bhc_our_rnd_addr;
|
||||
} else {
|
||||
rc = ble_hs_id_addr(addrs->our_id_addr.type, &our_id_addr_val, NULL);
|
||||
assert(rc == 0);
|
||||
}
|
||||
#else
|
||||
rc = ble_hs_id_addr(addrs->our_id_addr.type, &our_id_addr_val, NULL);
|
||||
assert(rc == 0);
|
||||
#endif
|
||||
|
||||
memcpy(addrs->our_id_addr.val, our_id_addr_val, 6);
|
||||
|
||||
|
||||
@@ -42,6 +42,9 @@ struct ble_hs_conn {
|
||||
SLIST_ENTRY(ble_hs_conn) bhc_next;
|
||||
uint16_t bhc_handle;
|
||||
uint8_t bhc_our_addr_type;
|
||||
#if MYNEWT_VAL(BLE_EXT_ADV)
|
||||
uint8_t bhc_our_rnd_addr[6];
|
||||
#endif
|
||||
ble_addr_t bhc_peer_addr;
|
||||
ble_addr_t bhc_our_rpa_addr;
|
||||
ble_addr_t bhc_peer_rpa_addr;
|
||||
|
||||
Reference in New Issue
Block a user