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 #endif
#if defined(CONFIG_BT_CTLR_CHECK_SAME_PEER_CONN) #if defined(CONFIG_BT_CTLR_CHECK_SAME_PEER_CONN)
conn->own_addr_type = BT_ADDR_LE_NONE->type; conn->own_id_addr_type = BT_ADDR_LE_NONE->type;
memcpy(conn->own_addr, BT_ADDR_LE_NONE->a.val, sizeof(conn->own_addr)); (void)memcpy(conn->own_id_addr, BT_ADDR_LE_NONE->a.val,
conn->peer_addr_type = BT_ADDR_LE_NONE->type; sizeof(conn->own_id_addr));
memcpy(conn->peer_addr, BT_ADDR_LE_NONE->a.val, sizeof(conn->peer_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 */ #endif /* CONFIG_BT_CTLR_CHECK_SAME_PEER_CONN */
conn->common.fex_valid = 0; 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 #else
const uint8_t *rpa = NULL; const uint8_t *rpa = NULL;
#endif #endif
const uint8_t *own_addr; const uint8_t *own_id_addr;
const uint8_t *tx_addr; const uint8_t *tx_addr;
uint8_t *adv_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 (0) {
#if defined(CONFIG_BT_CTLR_ADV_EXT) #if defined(CONFIG_BT_CTLR_ADV_EXT)
} else if (ll_adv_cmds_is_ext() && pdu->tx_addr) { } 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 #endif
} else { } 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) #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 */ #endif /* CONFIG_BT_CTLR_CHECK_SAME_PEER_CONN */
if (rpa) { if (rpa) {
pdu->tx_addr = 1; pdu->tx_addr = 1;
tx_addr = rpa; tx_addr = rpa;
} else { } else {
tx_addr = own_addr; tx_addr = own_id_addr;
} }
adv_addr = adv_pdu_adva_get(pdu); adv_addr = adv_pdu_adva_get(pdu);

View file

@ -51,7 +51,7 @@ struct ll_adv_set {
#endif /* CONFIG_BT_CTLR_PRIVACY */ #endif /* CONFIG_BT_CTLR_PRIVACY */
#if defined(CONFIG_BT_CTLR_CHECK_SAME_PEER_CONN) #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 */ #endif /* CONFIG_BT_CTLR_CHECK_SAME_PEER_CONN */
#if defined(CONFIG_BT_CTLR_DF_ADV_CTE_TX) #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 */ #endif /* CONFIG_BT_CTLR_PHY */
#if defined(CONFIG_BT_CTLR_CHECK_SAME_PEER_CONN) #if defined(CONFIG_BT_CTLR_CHECK_SAME_PEER_CONN)
bool ull_conn_peer_connected(uint8_t own_addr_type, uint8_t *own_addr, bool ull_conn_peer_connected(uint8_t const own_id_addr_type,
uint8_t peer_addr_type, uint8_t *peer_addr) uint8_t const *const own_id_addr,
uint8_t const peer_id_addr_type,
uint8_t const *const peer_id_addr)
{ {
uint16_t handle; 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); struct ll_conn *conn = ll_connected_get(handle);
if (conn && if (conn &&
conn->peer_addr_type == peer_addr_type && conn->peer_id_addr_type == peer_id_addr_type &&
!memcmp(conn->peer_addr, peer_addr, BDADDR_SIZE) && !memcmp(conn->peer_id_addr, peer_id_addr, BDADDR_SIZE) &&
conn->own_addr_type == own_addr_type && conn->own_id_addr_type == own_id_addr_type &&
!memcmp(conn->own_addr, own_addr, BDADDR_SIZE)) { !memcmp(conn->own_id_addr, own_id_addr, BDADDR_SIZE)) {
return true; 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); uint16_t ull_conn_default_tx_time_get(void);
uint8_t ull_conn_default_phy_tx_get(void); uint8_t ull_conn_default_phy_tx_get(void);
uint8_t ull_conn_default_phy_rx_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, bool ull_conn_peer_connected(uint8_t const own_id_addr_type,
uint8_t peer_addr_type, uint8_t *peer_addr); 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); 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_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); 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 */ #endif /* CONFIG_BT_CTLR_DATA_LENGTH */
#if defined(CONFIG_BT_CTLR_CHECK_SAME_PEER_CONN) #if defined(CONFIG_BT_CTLR_CHECK_SAME_PEER_CONN)
uint8_t own_addr_type:1; uint8_t own_id_addr_type:1;
uint8_t peer_addr_type:2; uint8_t peer_id_addr_type:1;
uint8_t own_addr[BDADDR_SIZE]; uint8_t own_id_addr[BDADDR_SIZE];
uint8_t peer_addr[BDADDR_SIZE]; uint8_t peer_id_addr[BDADDR_SIZE];
#endif /* CONFIG_BT_CTLR_CHECK_SAME_PEER_CONN */ #endif /* CONFIG_BT_CTLR_CHECK_SAME_PEER_CONN */
union { 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++) { for (handle = 0U; handle < CONFIG_BT_MAX_CONN; handle++) {
struct ll_conn *conn = ll_connected_get(handle); struct ll_conn *conn = ll_connected_get(handle);
/* The RPA of the connection matches the RPA that was just resolved */ /* The RPA of the connection matches the RPA that was just
if (conn && * resolved
conn->peer_addr_type < 2U && */
!memcmp(conn->peer_addr, rl[rl_idx].curr_rpa.val, BDADDR_SIZE)) { if (conn && !memcmp(conn->peer_id_addr, rl[rl_idx].curr_rpa.val,
memcpy(conn->peer_addr, rl[rl_idx].id_addr.val, BDADDR_SIZE); BDADDR_SIZE)) {
conn->peer_addr_type += 2U; (void)memcpy(conn->peer_id_addr, rl[rl_idx].id_addr.val,
BDADDR_SIZE);
break; break;
} }
} }

View file

@ -112,22 +112,25 @@ void ull_slave_setup(struct node_rx_hdr *rx, struct node_rx_ftr *ftr,
link = rx->link; link = rx->link;
#if defined(CONFIG_BT_CTLR_CHECK_SAME_PEER_CONN) #if defined(CONFIG_BT_CTLR_CHECK_SAME_PEER_CONN)
uint8_t own_addr_type = pdu_adv->rx_addr; const uint8_t peer_id_addr_type = (peer_addr_type & 0x01);
uint8_t *own_addr = adv->own_addr; 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 */ /* Do not connect twice to the same peer */
if (ull_conn_peer_connected(own_addr_type, own_addr, if (ull_conn_peer_connected(own_id_addr_type, own_id_addr,
peer_addr_type, peer_id_addr)) { peer_id_addr_type, peer_id_addr)) {
invalid_release(&adv->ull, lll, link, rx); invalid_release(&adv->ull, lll, link, rx);
return; return;
} }
/* Remember peer and own identity */ /* Remember peer and own identity address */
conn->peer_addr_type = peer_addr_type; conn->peer_id_addr_type = peer_id_addr_type;
memcpy(conn->peer_addr, peer_id_addr, sizeof(conn->peer_addr)); (void)memcpy(conn->peer_id_addr, peer_id_addr,
conn->own_addr_type = own_addr_type; sizeof(conn->peer_id_addr));
memcpy(conn->own_addr, own_addr, sizeof(conn->own_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 */ #endif /* CONFIG_BT_CTLR_CHECK_SAME_PEER_CONN */
memcpy(&lll->crc_init[0], &pdu_adv->connect_ind.crc_init[0], 3); memcpy(&lll->crc_init[0], &pdu_adv->connect_ind.crc_init[0], 3);