mirror of
https://github.com/espressif/esp-nimble.git
synced 2026-09-15 21:50:03 +00:00
Merge pull request #87 from sjanc/adv_random_fix
nimble/gap: Fix assert on slave connection with ext advertising
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