Bluetooth: Controller: Use id addr type to check same peer connection
Store and check device identity addr type of public or random. Signed-off-by: Vinayak Kariappa Chettimada <vich@nordicsemi.no>
This commit is contained in:
parent
22a48e502e
commit
1c564e750b
7 changed files with 47 additions and 37 deletions
|
@ -1008,10 +1008,12 @@ uint8_t ll_adv_enable(uint8_t enable)
|
|||
#endif
|
||||
|
||||
#if defined(CONFIG_BT_CTLR_CHECK_SAME_PEER_CONN)
|
||||
conn->own_addr_type = BT_ADDR_LE_NONE->type;
|
||||
memcpy(conn->own_addr, BT_ADDR_LE_NONE->a.val, sizeof(conn->own_addr));
|
||||
conn->peer_addr_type = BT_ADDR_LE_NONE->type;
|
||||
memcpy(conn->peer_addr, BT_ADDR_LE_NONE->a.val, sizeof(conn->peer_addr));
|
||||
conn->own_id_addr_type = BT_ADDR_LE_NONE->type;
|
||||
(void)memcpy(conn->own_id_addr, BT_ADDR_LE_NONE->a.val,
|
||||
sizeof(conn->own_id_addr));
|
||||
conn->peer_id_addr_type = BT_ADDR_LE_NONE->type;
|
||||
(void)memcpy(conn->peer_id_addr, BT_ADDR_LE_NONE->a.val,
|
||||
sizeof(conn->peer_id_addr));
|
||||
#endif /* CONFIG_BT_CTLR_CHECK_SAME_PEER_CONN */
|
||||
|
||||
conn->common.fex_valid = 0;
|
||||
|
@ -2699,7 +2701,7 @@ static const uint8_t *adva_update(struct ll_adv_set *adv, struct pdu_adv *pdu)
|
|||
#else
|
||||
const uint8_t *rpa = NULL;
|
||||
#endif
|
||||
const uint8_t *own_addr;
|
||||
const uint8_t *own_id_addr;
|
||||
const uint8_t *tx_addr;
|
||||
uint8_t *adv_addr;
|
||||
|
||||
|
@ -2707,22 +2709,22 @@ static const uint8_t *adva_update(struct ll_adv_set *adv, struct pdu_adv *pdu)
|
|||
if (0) {
|
||||
#if defined(CONFIG_BT_CTLR_ADV_EXT)
|
||||
} else if (ll_adv_cmds_is_ext() && pdu->tx_addr) {
|
||||
own_addr = ll_adv_aux_random_addr_get(adv, NULL);
|
||||
own_id_addr = ll_adv_aux_random_addr_get(adv, NULL);
|
||||
#endif
|
||||
} else {
|
||||
own_addr = ll_addr_get(pdu->tx_addr, NULL);
|
||||
own_id_addr = ll_addr_get(pdu->tx_addr, NULL);
|
||||
}
|
||||
}
|
||||
|
||||
#if defined(CONFIG_BT_CTLR_CHECK_SAME_PEER_CONN)
|
||||
memcpy(adv->own_addr, own_addr, BDADDR_SIZE);
|
||||
(void)memcpy(adv->own_id_addr, own_id_addr, BDADDR_SIZE);
|
||||
#endif /* CONFIG_BT_CTLR_CHECK_SAME_PEER_CONN */
|
||||
|
||||
if (rpa) {
|
||||
pdu->tx_addr = 1;
|
||||
tx_addr = rpa;
|
||||
} else {
|
||||
tx_addr = own_addr;
|
||||
tx_addr = own_id_addr;
|
||||
}
|
||||
|
||||
adv_addr = adv_pdu_adva_get(pdu);
|
||||
|
|
|
@ -51,7 +51,7 @@ struct ll_adv_set {
|
|||
#endif /* CONFIG_BT_CTLR_PRIVACY */
|
||||
|
||||
#if defined(CONFIG_BT_CTLR_CHECK_SAME_PEER_CONN)
|
||||
uint8_t own_addr[BDADDR_SIZE];
|
||||
uint8_t own_id_addr[BDADDR_SIZE];
|
||||
#endif /* CONFIG_BT_CTLR_CHECK_SAME_PEER_CONN */
|
||||
|
||||
#if defined(CONFIG_BT_CTLR_DF_ADV_CTE_TX)
|
||||
|
|
|
@ -809,8 +809,10 @@ uint8_t ull_conn_default_phy_rx_get(void)
|
|||
#endif /* CONFIG_BT_CTLR_PHY */
|
||||
|
||||
#if defined(CONFIG_BT_CTLR_CHECK_SAME_PEER_CONN)
|
||||
bool ull_conn_peer_connected(uint8_t own_addr_type, uint8_t *own_addr,
|
||||
uint8_t peer_addr_type, uint8_t *peer_addr)
|
||||
bool ull_conn_peer_connected(uint8_t const own_id_addr_type,
|
||||
uint8_t const *const own_id_addr,
|
||||
uint8_t const peer_id_addr_type,
|
||||
uint8_t const *const peer_id_addr)
|
||||
{
|
||||
uint16_t handle;
|
||||
|
||||
|
@ -818,10 +820,10 @@ bool ull_conn_peer_connected(uint8_t own_addr_type, uint8_t *own_addr,
|
|||
struct ll_conn *conn = ll_connected_get(handle);
|
||||
|
||||
if (conn &&
|
||||
conn->peer_addr_type == peer_addr_type &&
|
||||
!memcmp(conn->peer_addr, peer_addr, BDADDR_SIZE) &&
|
||||
conn->own_addr_type == own_addr_type &&
|
||||
!memcmp(conn->own_addr, own_addr, BDADDR_SIZE)) {
|
||||
conn->peer_id_addr_type == peer_id_addr_type &&
|
||||
!memcmp(conn->peer_id_addr, peer_id_addr, BDADDR_SIZE) &&
|
||||
conn->own_id_addr_type == own_id_addr_type &&
|
||||
!memcmp(conn->own_id_addr, own_id_addr, BDADDR_SIZE)) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -18,8 +18,10 @@ uint16_t ull_conn_default_tx_octets_get(void);
|
|||
uint16_t ull_conn_default_tx_time_get(void);
|
||||
uint8_t ull_conn_default_phy_tx_get(void);
|
||||
uint8_t ull_conn_default_phy_rx_get(void);
|
||||
bool ull_conn_peer_connected(uint8_t own_addr_type, uint8_t *own_addr,
|
||||
uint8_t peer_addr_type, uint8_t *peer_addr);
|
||||
bool ull_conn_peer_connected(uint8_t const own_id_addr_type,
|
||||
uint8_t const *const own_id_addr,
|
||||
uint8_t const peer_id_addr_type,
|
||||
uint8_t const *const peer_id_addr);
|
||||
void ull_conn_setup(memq_link_t *rx_link, struct node_rx_hdr *rx);
|
||||
int ull_conn_rx(memq_link_t *link, struct node_rx_pdu **rx);
|
||||
int ull_conn_llcp(struct ll_conn *conn, uint32_t ticks_at_expire, uint16_t lazy);
|
||||
|
|
|
@ -56,10 +56,10 @@ struct ll_conn {
|
|||
#endif /* CONFIG_BT_CTLR_DATA_LENGTH */
|
||||
|
||||
#if defined(CONFIG_BT_CTLR_CHECK_SAME_PEER_CONN)
|
||||
uint8_t own_addr_type:1;
|
||||
uint8_t peer_addr_type:2;
|
||||
uint8_t own_addr[BDADDR_SIZE];
|
||||
uint8_t peer_addr[BDADDR_SIZE];
|
||||
uint8_t own_id_addr_type:1;
|
||||
uint8_t peer_id_addr_type:1;
|
||||
uint8_t own_id_addr[BDADDR_SIZE];
|
||||
uint8_t peer_id_addr[BDADDR_SIZE];
|
||||
#endif /* CONFIG_BT_CTLR_CHECK_SAME_PEER_CONN */
|
||||
|
||||
union {
|
||||
|
|
|
@ -1103,12 +1103,13 @@ static void conn_rpa_update(uint8_t rl_idx)
|
|||
for (handle = 0U; handle < CONFIG_BT_MAX_CONN; handle++) {
|
||||
struct ll_conn *conn = ll_connected_get(handle);
|
||||
|
||||
/* The RPA of the connection matches the RPA that was just resolved */
|
||||
if (conn &&
|
||||
conn->peer_addr_type < 2U &&
|
||||
!memcmp(conn->peer_addr, rl[rl_idx].curr_rpa.val, BDADDR_SIZE)) {
|
||||
memcpy(conn->peer_addr, rl[rl_idx].id_addr.val, BDADDR_SIZE);
|
||||
conn->peer_addr_type += 2U;
|
||||
/* The RPA of the connection matches the RPA that was just
|
||||
* resolved
|
||||
*/
|
||||
if (conn && !memcmp(conn->peer_id_addr, rl[rl_idx].curr_rpa.val,
|
||||
BDADDR_SIZE)) {
|
||||
(void)memcpy(conn->peer_id_addr, rl[rl_idx].id_addr.val,
|
||||
BDADDR_SIZE);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -112,22 +112,25 @@ void ull_slave_setup(struct node_rx_hdr *rx, struct node_rx_ftr *ftr,
|
|||
link = rx->link;
|
||||
|
||||
#if defined(CONFIG_BT_CTLR_CHECK_SAME_PEER_CONN)
|
||||
uint8_t own_addr_type = pdu_adv->rx_addr;
|
||||
uint8_t *own_addr = adv->own_addr;
|
||||
const uint8_t peer_id_addr_type = (peer_addr_type & 0x01);
|
||||
const uint8_t own_id_addr_type = pdu_adv->rx_addr;
|
||||
const uint8_t *own_id_addr = adv->own_id_addr;
|
||||
|
||||
/* Do not connect twice to the same peer */
|
||||
if (ull_conn_peer_connected(own_addr_type, own_addr,
|
||||
peer_addr_type, peer_id_addr)) {
|
||||
if (ull_conn_peer_connected(own_id_addr_type, own_id_addr,
|
||||
peer_id_addr_type, peer_id_addr)) {
|
||||
invalid_release(&adv->ull, lll, link, rx);
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
/* Remember peer and own identity */
|
||||
conn->peer_addr_type = peer_addr_type;
|
||||
memcpy(conn->peer_addr, peer_id_addr, sizeof(conn->peer_addr));
|
||||
conn->own_addr_type = own_addr_type;
|
||||
memcpy(conn->own_addr, own_addr, sizeof(conn->own_addr));
|
||||
/* Remember peer and own identity address */
|
||||
conn->peer_id_addr_type = peer_id_addr_type;
|
||||
(void)memcpy(conn->peer_id_addr, peer_id_addr,
|
||||
sizeof(conn->peer_id_addr));
|
||||
conn->own_id_addr_type = own_id_addr_type;
|
||||
(void)memcpy(conn->own_id_addr, own_id_addr,
|
||||
sizeof(conn->own_id_addr));
|
||||
#endif /* CONFIG_BT_CTLR_CHECK_SAME_PEER_CONN */
|
||||
|
||||
memcpy(&lll->crc_init[0], &pdu_adv->connect_ind.crc_init[0], 3);
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue