Bluetooth: controller: Use RL indices in adv ISR
To avoid manipulation of the irkmatch_ok and irkmatch_id, rely instead on Resolving List indices for all checks in the advertising ISR. Although we do incur in a small overhead to look it up initially, the overall gains are worth the change. Signed-off-by: Carles Cufi <carles.cufi@nordicsemi.no>
This commit is contained in:
parent
2dd375ef45
commit
269a828cb1
3 changed files with 30 additions and 29 deletions
|
@ -713,14 +713,13 @@ static u32_t isr_rx_adv_sr_report(struct pdu_adv *pdu_adv_rx, u8_t rssi_ready)
|
||||||
#endif /* CONFIG_BLUETOOTH_CONTROLLER_SCAN_REQ_NOTIFY */
|
#endif /* CONFIG_BLUETOOTH_CONTROLLER_SCAN_REQ_NOTIFY */
|
||||||
|
|
||||||
static inline bool isr_adv_sr_check(struct pdu_adv *pdu, u8_t devmatch_ok,
|
static inline bool isr_adv_sr_check(struct pdu_adv *pdu, u8_t devmatch_ok,
|
||||||
u8_t irkmatch_ok, u8_t irkmatch_id)
|
u8_t rl_idx)
|
||||||
{
|
{
|
||||||
#if defined(CONFIG_BLUETOOTH_CONTROLLER_PRIVACY)
|
#if defined(CONFIG_BLUETOOTH_CONTROLLER_PRIVACY)
|
||||||
return ((((_radio.advertiser.filter_policy & 0x01) == 0) &&
|
return ((((_radio.advertiser.filter_policy & 0x01) == 0) &&
|
||||||
ctrl_rl_allowed(pdu->tx_addr,
|
ctrl_rl_allowed(pdu->tx_addr,
|
||||||
pdu->payload.scan_req.scan_addr)) ||
|
pdu->payload.scan_req.scan_addr)) ||
|
||||||
(devmatch_ok) || (ctrl_rl_enabled() && irkmatch_ok &&
|
(devmatch_ok) || (ctrl_irk_whitelisted(rl_idx))) &&
|
||||||
ctrl_irk_whitelisted(irkmatch_id))) &&
|
|
||||||
(1 /** @todo own addr match check */);
|
(1 /** @todo own addr match check */);
|
||||||
#else
|
#else
|
||||||
return (((_radio.advertiser.filter_policy & 0x01) == 0) ||
|
return (((_radio.advertiser.filter_policy & 0x01) == 0) ||
|
||||||
|
@ -730,11 +729,11 @@ static inline bool isr_adv_sr_check(struct pdu_adv *pdu, u8_t devmatch_ok,
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline bool isr_adv_tgta_check(struct pdu_adv *adv, struct pdu_adv *ci,
|
static inline bool isr_adv_tgta_check(struct pdu_adv *adv, struct pdu_adv *ci,
|
||||||
u8_t irkmatch_ok, u8_t irkmatch_id)
|
u8_t rl_idx)
|
||||||
{
|
{
|
||||||
#if defined(CONFIG_BLUETOOTH_CONTROLLER_PRIVACY)
|
#if defined(CONFIG_BLUETOOTH_CONTROLLER_PRIVACY)
|
||||||
if (ctrl_rl_enabled() && irkmatch_ok) {
|
if (rl_idx != RL_IDX_NONE) {
|
||||||
return ctrl_rl_idx_match(irkmatch_id, _radio.advertiser.rl_idx);
|
return rl_idx == _radio.advertiser.rl_idx;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
return !memcmp(adv->payload.direct_ind.tgt_addr,
|
return !memcmp(adv->payload.direct_ind.tgt_addr,
|
||||||
|
@ -743,31 +742,29 @@ static inline bool isr_adv_tgta_check(struct pdu_adv *adv, struct pdu_adv *ci,
|
||||||
|
|
||||||
static inline bool isr_adv_ci_direct_check(struct pdu_adv *adv,
|
static inline bool isr_adv_ci_direct_check(struct pdu_adv *adv,
|
||||||
struct pdu_adv *ci,
|
struct pdu_adv *ci,
|
||||||
u8_t irkmatch_ok, u8_t irkmatch_id)
|
u8_t rl_idx)
|
||||||
{
|
{
|
||||||
return ((adv->type != PDU_ADV_TYPE_DIRECT_IND) ||
|
return ((adv->type != PDU_ADV_TYPE_DIRECT_IND) ||
|
||||||
((adv->tx_addr == ci->rx_addr) &&
|
((adv->tx_addr == ci->rx_addr) &&
|
||||||
(adv->rx_addr == ci->tx_addr) &&
|
(adv->rx_addr == ci->tx_addr) &&
|
||||||
!memcmp(adv->payload.direct_ind.adv_addr,
|
!memcmp(adv->payload.direct_ind.adv_addr,
|
||||||
ci->payload.connect_ind.adv_addr, BDADDR_SIZE) &&
|
ci->payload.connect_ind.adv_addr, BDADDR_SIZE) &&
|
||||||
isr_adv_tgta_check(adv, ci, irkmatch_ok, irkmatch_id)));
|
isr_adv_tgta_check(adv, ci, rl_idx)));
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline bool isr_adv_ci_check(struct pdu_adv *adv, struct pdu_adv *ci,
|
static inline bool isr_adv_ci_check(struct pdu_adv *adv, struct pdu_adv *ci,
|
||||||
u8_t devmatch_ok, u8_t irkmatch_ok,
|
u8_t devmatch_ok, u8_t rl_idx)
|
||||||
u8_t irkmatch_id)
|
|
||||||
{
|
{
|
||||||
#if defined(CONFIG_BLUETOOTH_CONTROLLER_PRIVACY)
|
#if defined(CONFIG_BLUETOOTH_CONTROLLER_PRIVACY)
|
||||||
return ((((_radio.advertiser.filter_policy & 0x02) == 0) &&
|
return ((((_radio.advertiser.filter_policy & 0x02) == 0) &&
|
||||||
ctrl_rl_allowed(ci->tx_addr,
|
ctrl_rl_allowed(ci->tx_addr,
|
||||||
ci->payload.connect_ind.init_addr)) ||
|
ci->payload.connect_ind.init_addr)) ||
|
||||||
(devmatch_ok) || (ctrl_rl_enabled() && irkmatch_ok &&
|
(devmatch_ok) || (ctrl_irk_whitelisted(rl_idx))) &&
|
||||||
ctrl_irk_whitelisted(irkmatch_id))) &&
|
isr_adv_ci_direct_check(adv, ci, rl_idx);
|
||||||
isr_adv_ci_direct_check(adv, ci, irkmatch_ok, irkmatch_id);
|
|
||||||
#else
|
#else
|
||||||
return (((_radio.advertiser.filter_policy & 0x02) == 0) ||
|
return (((_radio.advertiser.filter_policy & 0x02) == 0) ||
|
||||||
(devmatch_ok)) &&
|
(devmatch_ok)) &&
|
||||||
isr_adv_ci_direct_check(adv, ci, irkmatch_ok, irkmatch_id);
|
isr_adv_ci_direct_check(adv, ci, rl_idx);
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -777,14 +774,19 @@ static inline u32_t isr_rx_adv(u8_t devmatch_ok, u8_t devmatch_id,
|
||||||
{
|
{
|
||||||
struct pdu_adv *pdu_adv, *_pdu_adv;
|
struct pdu_adv *pdu_adv, *_pdu_adv;
|
||||||
struct radio_pdu_node_rx *radio_pdu_node_rx;
|
struct radio_pdu_node_rx *radio_pdu_node_rx;
|
||||||
|
#if defined(CONFIG_BLUETOOTH_CONTROLLER_PRIVACY)
|
||||||
|
/* An IRK match implies address resolution enabled */
|
||||||
|
u8_t rl_idx = irkmatch_ok ? ctrl_rl_idx(irkmatch_id) : RL_IDX_NONE;
|
||||||
|
#else
|
||||||
|
u8_t rl_idx = RL_IDX_NONE;
|
||||||
|
#endif
|
||||||
pdu_adv = (struct pdu_adv *)radio_pkt_scratch_get();
|
pdu_adv = (struct pdu_adv *)radio_pkt_scratch_get();
|
||||||
_pdu_adv = (struct pdu_adv *)&_radio.advertiser.adv_data.data
|
_pdu_adv = (struct pdu_adv *)&_radio.advertiser.adv_data.data
|
||||||
[_radio.advertiser.adv_data.first][0];
|
[_radio.advertiser.adv_data.first][0];
|
||||||
|
|
||||||
if ((pdu_adv->type == PDU_ADV_TYPE_SCAN_REQ) &&
|
if ((pdu_adv->type == PDU_ADV_TYPE_SCAN_REQ) &&
|
||||||
(pdu_adv->len == sizeof(struct pdu_adv_payload_scan_req)) &&
|
(pdu_adv->len == sizeof(struct pdu_adv_payload_scan_req)) &&
|
||||||
isr_adv_sr_check(pdu_adv, devmatch_ok, irkmatch_ok, irkmatch_id)) {
|
isr_adv_sr_check(pdu_adv, devmatch_ok, rl_idx)) {
|
||||||
|
|
||||||
#if defined(CONFIG_BLUETOOTH_CONTROLLER_SCAN_REQ_NOTIFY)
|
#if defined(CONFIG_BLUETOOTH_CONTROLLER_SCAN_REQ_NOTIFY)
|
||||||
if (!IS_ENABLED(CONFIG_BLUETOOTH_CONTROLLER_ADV_EXT) ||
|
if (!IS_ENABLED(CONFIG_BLUETOOTH_CONTROLLER_ADV_EXT) ||
|
||||||
|
@ -810,8 +812,7 @@ static inline u32_t isr_rx_adv(u8_t devmatch_ok, u8_t devmatch_id,
|
||||||
return 0;
|
return 0;
|
||||||
} else if ((pdu_adv->type == PDU_ADV_TYPE_CONNECT_IND) &&
|
} else if ((pdu_adv->type == PDU_ADV_TYPE_CONNECT_IND) &&
|
||||||
(pdu_adv->len == sizeof(struct pdu_adv_payload_connect_ind)) &&
|
(pdu_adv->len == sizeof(struct pdu_adv_payload_connect_ind)) &&
|
||||||
isr_adv_ci_check(_pdu_adv, pdu_adv, devmatch_ok, irkmatch_ok,
|
isr_adv_ci_check(_pdu_adv, pdu_adv, devmatch_ok, rl_idx) &&
|
||||||
irkmatch_id) &&
|
|
||||||
((_radio.fc_ena == 0) || (_radio.fc_req == _radio.fc_ack)) &&
|
((_radio.fc_ena == 0) || (_radio.fc_req == _radio.fc_ack)) &&
|
||||||
(_radio.advertiser.conn)) {
|
(_radio.advertiser.conn)) {
|
||||||
struct radio_le_conn_cmplt *radio_le_conn_cmplt;
|
struct radio_le_conn_cmplt *radio_le_conn_cmplt;
|
||||||
|
|
|
@ -211,7 +211,7 @@ u8_t *ctrl_irks_get(u8_t *count)
|
||||||
return (u8_t *)peer_irks;
|
return (u8_t *)peer_irks;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool ctrl_irk_whitelisted(u8_t irkmatch_id)
|
u8_t ctrl_rl_idx(u8_t irkmatch_id)
|
||||||
{
|
{
|
||||||
u8_t i;
|
u8_t i;
|
||||||
|
|
||||||
|
@ -220,19 +220,19 @@ bool ctrl_irk_whitelisted(u8_t irkmatch_id)
|
||||||
LL_ASSERT(i < CONFIG_BLUETOOTH_CONTROLLER_RL_SIZE);
|
LL_ASSERT(i < CONFIG_BLUETOOTH_CONTROLLER_RL_SIZE);
|
||||||
LL_ASSERT(rl[i].taken);
|
LL_ASSERT(rl[i].taken);
|
||||||
|
|
||||||
return rl[i].wl;
|
return i;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool ctrl_rl_idx_match(u8_t irkmatch_id, u8_t rl_idx)
|
bool ctrl_irk_whitelisted(u8_t rl_idx)
|
||||||
{
|
{
|
||||||
u8_t i;
|
if (rl_idx == RL_IDX_NONE) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
LL_ASSERT(irkmatch_id < peer_irk_count);
|
LL_ASSERT(rl_idx < CONFIG_BLUETOOTH_CONTROLLER_RL_SIZE);
|
||||||
i = peer_irk_rl_ids[irkmatch_id];
|
LL_ASSERT(rl[rl_idx].taken);
|
||||||
LL_ASSERT(i < CONFIG_BLUETOOTH_CONTROLLER_RL_SIZE);
|
|
||||||
LL_ASSERT(rl[i].taken);
|
|
||||||
|
|
||||||
return i == rl_idx;
|
return rl[rl_idx].wl;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
|
@ -20,8 +20,8 @@ void ll_filters_scan_update(u8_t scan_fp);
|
||||||
|
|
||||||
struct ll_filter *ctrl_filter_get(bool whitelist);
|
struct ll_filter *ctrl_filter_get(bool whitelist);
|
||||||
u8_t *ctrl_irks_get(u8_t *count);
|
u8_t *ctrl_irks_get(u8_t *count);
|
||||||
bool ctrl_irk_whitelisted(u8_t irkmatch_id);
|
u8_t ctrl_rl_idx(u8_t irkmatch_id);
|
||||||
bool ctrl_rl_idx_match(u8_t irkmatch_id, u8_t rl_idx);
|
bool ctrl_irk_whitelisted(u8_t rl_idx);
|
||||||
|
|
||||||
bool ctrl_rl_enabled(void);
|
bool ctrl_rl_enabled(void);
|
||||||
void ll_rl_rpa_update(bool timeout);
|
void ll_rl_rpa_update(bool timeout);
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue