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:
Vinayak Kariappa Chettimada 2021-08-20 11:39:00 +05:30 committed by Christopher Friedt
commit 1c564e750b
7 changed files with 47 additions and 37 deletions

View file

@ -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);

View file

@ -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)

View file

@ -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;
}
}

View file

@ -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);

View file

@ -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 {

View file

@ -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;
}
}

View file

@ -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);