diff --git a/nimble/host/src/ble_gap.c b/nimble/host/src/ble_gap.c index 39289a516..3abc4215f 100644 --- a/nimble/host/src/ble_gap.c +++ b/nimble/host/src/ble_gap.c @@ -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; } diff --git a/nimble/host/src/ble_hs_conn.c b/nimble/host/src/ble_hs_conn.c index afb5439bf..00fa4f8c7 100644 --- a/nimble/host/src/ble_hs_conn.c +++ b/nimble/host/src/ble_hs_conn.c @@ -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); diff --git a/nimble/host/src/ble_hs_conn_priv.h b/nimble/host/src/ble_hs_conn_priv.h index b66b96a50..92aacd405 100644 --- a/nimble/host/src/ble_hs_conn_priv.h +++ b/nimble/host/src/ble_hs_conn_priv.h @@ -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;