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:
Szymon Janc
2018-05-14 13:23:20 +02:00
parent fc9896d42a
commit c271949729
3 changed files with 25 additions and 2 deletions
+7 -2
View File
@@ -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;
}
+15
View File
@@ -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);
+3
View File
@@ -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;