Bluetooth: controller: Optimize RL addition
To avoid iterating twice through the list, have ll_rl_find() return the first free empty slot on the list. Signed-off-by: Carles Cufi <carles.cufi@nordicsemi.no>
This commit is contained in:
parent
2c1dbd21f4
commit
0f0c45ce7c
1 changed files with 30 additions and 34 deletions
|
@ -143,7 +143,6 @@ static void filter_clear(struct ll_filter *filter)
|
||||||
filter->addr_type_bitmask = 0;
|
filter->addr_type_bitmask = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static void filter_insert(struct ll_filter *filter, int index, u8_t addr_type,
|
static void filter_insert(struct ll_filter *filter, int index, u8_t addr_type,
|
||||||
u8_t *bdaddr)
|
u8_t *bdaddr)
|
||||||
{
|
{
|
||||||
|
@ -278,6 +277,7 @@ static void filter_wl_update(void)
|
||||||
static void filter_rl_update(void)
|
static void filter_rl_update(void)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
/* No whitelist: populate filter from rl peers */
|
/* No whitelist: populate filter from rl peers */
|
||||||
filter_clear(&rl_filter);
|
filter_clear(&rl_filter);
|
||||||
|
|
||||||
|
@ -289,7 +289,6 @@ static void filter_rl_update(void)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void ll_filters_adv_update(u8_t adv_fp)
|
void ll_filters_adv_update(u8_t adv_fp)
|
||||||
{
|
{
|
||||||
/* enabling advertising */
|
/* enabling advertising */
|
||||||
|
@ -320,15 +319,17 @@ void ll_filters_scan_update(u8_t scan_fp)
|
||||||
|
|
||||||
int ll_rl_find(u8_t id_addr_type, u8_t *id_addr)
|
int ll_rl_find(u8_t id_addr_type, u8_t *id_addr)
|
||||||
{
|
{
|
||||||
int i;
|
int i, free = -IDX_NONE;
|
||||||
|
|
||||||
for (i = 0; i < CONFIG_BLUETOOTH_CONTROLLER_RL_SIZE; i++) {
|
for (i = 0; i < CONFIG_BLUETOOTH_CONTROLLER_RL_SIZE; i++) {
|
||||||
if (LIST_MATCH(rl, i, id_addr_type, id_addr)) {
|
if (LIST_MATCH(rl, i, id_addr_type, id_addr)) {
|
||||||
return i;
|
return i;
|
||||||
|
} else if (!rl[i].taken && free == -IDX_NONE) {
|
||||||
|
free = -i;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return -1;
|
return free;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool ctrl_rl_enabled(void)
|
bool ctrl_rl_enabled(void)
|
||||||
|
@ -509,7 +510,6 @@ void ll_adv_scan_state_cb(u8_t bm)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
u32_t ll_rl_size_get(void)
|
u32_t ll_rl_size_get(void)
|
||||||
{
|
{
|
||||||
return CONFIG_BLUETOOTH_CONTROLLER_RL_SIZE;
|
return CONFIG_BLUETOOTH_CONTROLLER_RL_SIZE;
|
||||||
|
@ -529,7 +529,7 @@ u32_t ll_rl_clear(void)
|
||||||
u32_t ll_rl_add(bt_addr_le_t *id_addr, const u8_t pirk[16],
|
u32_t ll_rl_add(bt_addr_le_t *id_addr, const u8_t pirk[16],
|
||||||
const u8_t lirk[16])
|
const u8_t lirk[16])
|
||||||
{
|
{
|
||||||
int i;
|
int i, j;
|
||||||
|
|
||||||
if (!rl_access_check(false)) {
|
if (!rl_access_check(false)) {
|
||||||
return BT_HCI_ERR_CMD_DISALLOWED;
|
return BT_HCI_ERR_CMD_DISALLOWED;
|
||||||
|
@ -538,39 +538,35 @@ u32_t ll_rl_add(bt_addr_le_t *id_addr, const u8_t pirk[16],
|
||||||
i = ll_rl_find(id_addr->type, id_addr->a.val);
|
i = ll_rl_find(id_addr->type, id_addr->a.val);
|
||||||
if (i >= 0) {
|
if (i >= 0) {
|
||||||
return BT_HCI_ERR_INVALID_PARAM;
|
return BT_HCI_ERR_INVALID_PARAM;
|
||||||
|
} else if (i == -IDX_NONE) {
|
||||||
|
return BT_HCI_ERR_MEM_CAPACITY_EXCEEDED;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* find an empty slot and insert device */
|
/* Device not found but empty slot found */
|
||||||
for (i = 0; i < CONFIG_BLUETOOTH_CONTROLLER_RL_SIZE; i++) {
|
i = -i;
|
||||||
if (!rl[i].taken) {
|
|
||||||
int j;
|
|
||||||
|
|
||||||
bt_addr_copy(&rl[i].id_addr, &id_addr->a);
|
bt_addr_copy(&rl[i].id_addr, &id_addr->a);
|
||||||
rl[i].id_addr_type = id_addr->type & 0x1;
|
rl[i].id_addr_type = id_addr->type & 0x1;
|
||||||
rl[i].pirk = mem_nz((u8_t *)pirk, 16);
|
rl[i].pirk = mem_nz((u8_t *)pirk, 16);
|
||||||
rl[i].lirk = mem_nz((u8_t *)lirk, 16);
|
rl[i].lirk = mem_nz((u8_t *)lirk, 16);
|
||||||
if (rl[i].pirk) {
|
if (rl[i].pirk) {
|
||||||
rl[i].pirk_idx = peer_irk_count;
|
rl[i].pirk_idx = peer_irk_count;
|
||||||
memcpy(peer_irks[peer_irk_count++],
|
memcpy(peer_irks[peer_irk_count++], pirk, 16);
|
||||||
pirk, 16);
|
|
||||||
}
|
|
||||||
if (rl[i].lirk) {
|
|
||||||
memcpy(rl[i].local_irk, lirk, 16);
|
|
||||||
}
|
|
||||||
rl[i].rpas_ready = 0;
|
|
||||||
/* Default to Network Privacy */
|
|
||||||
rl[i].dev = 0;
|
|
||||||
/* Add reference to a whitelist entry */
|
|
||||||
j = wl_peers_find(id_addr->type, id_addr->a.val);
|
|
||||||
if (j >= 0) {
|
|
||||||
wl_peers[j].rl_idx = i;
|
|
||||||
}
|
|
||||||
rl[i].taken = 1;
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
if (rl[i].lirk) {
|
||||||
|
memcpy(rl[i].local_irk, lirk, 16);
|
||||||
|
}
|
||||||
|
rl[i].rpas_ready = 0;
|
||||||
|
/* Default to Network Privacy */
|
||||||
|
rl[i].dev = 0;
|
||||||
|
/* Add reference to a whitelist entry */
|
||||||
|
j = wl_peers_find(id_addr->type, id_addr->a.val);
|
||||||
|
if (j >= 0) {
|
||||||
|
wl_peers[j].rl_idx = i;
|
||||||
|
}
|
||||||
|
rl[i].taken = 1;
|
||||||
|
|
||||||
return BT_HCI_ERR_MEM_CAPACITY_EXCEEDED;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
u32_t ll_rl_remove(bt_addr_le_t *id_addr)
|
u32_t ll_rl_remove(bt_addr_le_t *id_addr)
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue