Bluetooth: controller: Generate RPAs for scanning and initating
Start RPA generation when enabling the scanner either for observing or for initiating. Signed-off-by: Carles Cufi <carles.cufi@nordicsemi.no>
This commit is contained in:
parent
4ba2bb0d1c
commit
1a07179a3c
4 changed files with 29 additions and 13 deletions
|
@ -125,7 +125,8 @@ u32_t ll_adv_params_set(u16_t interval, u8_t adv_type,
|
|||
|
||||
#if defined(CONFIG_BLUETOOTH_CONTROLLER_PRIVACY)
|
||||
ll_adv.own_addr_type = own_addr_type;
|
||||
if (own_addr_type >= BT_ADDR_LE_PUBLIC_ID) {
|
||||
if (ll_adv.own_addr_type == BT_ADDR_LE_PUBLIC_ID ||
|
||||
ll_adv.own_addr_type == BT_ADDR_LE_RANDOM_ID) {
|
||||
ll_adv.id_addr_type = direct_addr_type;
|
||||
memcpy(&ll_adv.id_addr, direct_addr, BDADDR_SIZE);
|
||||
}
|
||||
|
@ -387,11 +388,8 @@ u32_t ll_adv_enable(u8_t enable)
|
|||
/* Prepare whitelist and optionally resolving list */
|
||||
ll_filters_adv_update(ll_adv.filter_policy);
|
||||
|
||||
if (ctrl_rl_enabled()) {
|
||||
/*@todo: Enable AR */
|
||||
}
|
||||
|
||||
if (ll_adv.own_addr_type >= BT_ADDR_LE_PUBLIC_ID) {
|
||||
if (ll_adv.own_addr_type == BT_ADDR_LE_PUBLIC_ID ||
|
||||
ll_adv.own_addr_type == BT_ADDR_LE_RANDOM_ID) {
|
||||
/* Look up the resolving list */
|
||||
int idx = ll_rl_find(ll_adv.id_addr_type,
|
||||
ll_adv.id_addr);
|
||||
|
|
|
@ -67,7 +67,7 @@ static u8_t peer_irk_count;
|
|||
/* Hardware filter for the resolving list */
|
||||
static struct ll_filter rl_filter;
|
||||
|
||||
#define DEFAULT_RPA_TIMEOUT_MS 900 * 1000
|
||||
#define DEFAULT_RPA_TIMEOUT_MS (900 * 1000)
|
||||
u32_t rpa_timeout_ms;
|
||||
s64_t rpa_last_ms;
|
||||
|
||||
|
@ -267,6 +267,7 @@ static void filter_wl_update(void)
|
|||
|
||||
for (i = 0; i < WL_SIZE; i++) {
|
||||
int j = wl_peers[i].rl_idx;
|
||||
|
||||
if (!rl_enable || j == IDX_NONE || !rl[j].pirk || rl[j].dev) {
|
||||
filter_insert(&wl, i, wl_peers[i].id_addr_type,
|
||||
wl_peers[i].id_addr.val);
|
||||
|
@ -337,6 +338,7 @@ bool ctrl_rl_enabled(void)
|
|||
return rl_enable;
|
||||
}
|
||||
|
||||
#if defined(CONFIG_BLUETOOTH_BROADCASTER)
|
||||
void ll_rl_pdu_adv_update(int idx, struct pdu_adv *pdu)
|
||||
{
|
||||
u8_t *adva = pdu->type == PDU_ADV_TYPE_SCAN_RSP ?
|
||||
|
@ -380,7 +382,8 @@ static void rpa_adv_refresh(void)
|
|||
|
||||
ll_adv = ll_adv_set_get();
|
||||
|
||||
if (ll_adv->own_addr_type < BT_ADDR_LE_PUBLIC_ID) {
|
||||
if (ll_adv->own_addr_type != BT_ADDR_LE_PUBLIC_ID &&
|
||||
ll_adv->own_addr_type != BT_ADDR_LE_RANDOM_ID) {
|
||||
return;
|
||||
}
|
||||
|
||||
|
@ -414,11 +417,12 @@ static void rpa_adv_refresh(void)
|
|||
|
||||
memcpy(&pdu->payload.adv_ind.data[0], &prev->payload.adv_ind.data[0],
|
||||
prev->len - BDADDR_SIZE);
|
||||
pdu->len = prev->len;;
|
||||
pdu->len = prev->len;
|
||||
|
||||
/* commit the update so controller picks it. */
|
||||
radio_adv_data->last = last;
|
||||
}
|
||||
#endif
|
||||
|
||||
static void rl_clear(void)
|
||||
{
|
||||
|
@ -470,9 +474,11 @@ void ll_rl_rpa_update(bool timeout)
|
|||
}
|
||||
|
||||
if (timeout) {
|
||||
#if defined(CONFIG_BLUETOOTH_BROADCASTER)
|
||||
if (radio_adv_is_enabled()) {
|
||||
rpa_adv_refresh();
|
||||
}
|
||||
#endif
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -36,6 +36,11 @@ u32_t ll_create_connection(u16_t scan_interval, u16_t scan_window,
|
|||
|
||||
#if defined(CONFIG_BLUETOOTH_CONTROLLER_PRIVACY)
|
||||
ll_filters_scan_update(filter_policy);
|
||||
if (own_addr_type == BT_ADDR_LE_PUBLIC_ID ||
|
||||
own_addr_type == BT_ADDR_LE_RANDOM_ID) {
|
||||
/* Generate RPAs if required */
|
||||
ll_rl_rpa_update(false);
|
||||
}
|
||||
#endif
|
||||
return radio_scan_enable(0, own_addr_type,
|
||||
ll_addr_get(own_addr_type, NULL),
|
||||
|
|
|
@ -25,7 +25,7 @@ static struct {
|
|||
u8_t type:1;
|
||||
#endif /* !CONFIG_BLUETOOTH_CONTROLLER_ADV_EXT */
|
||||
|
||||
u8_t tx_addr:1;
|
||||
u8_t own_addr_type:2;
|
||||
u8_t filter_policy:2;
|
||||
} ll_scan;
|
||||
|
||||
|
@ -51,7 +51,7 @@ u32_t ll_scan_params_set(u8_t type, u16_t interval, u16_t window,
|
|||
ll_scan.type = type;
|
||||
ll_scan.interval = interval;
|
||||
ll_scan.window = window;
|
||||
ll_scan.tx_addr = own_addr_type;
|
||||
ll_scan.own_addr_type = own_addr_type;
|
||||
ll_scan.filter_policy = filter_policy;
|
||||
|
||||
return 0;
|
||||
|
@ -70,9 +70,16 @@ u32_t ll_scan_enable(u8_t enable)
|
|||
|
||||
#if defined(CONFIG_BLUETOOTH_CONTROLLER_PRIVACY)
|
||||
ll_filters_scan_update(ll_scan.filter_policy);
|
||||
|
||||
if ((ll_scan.type & 0x1) &&
|
||||
(ll_scan.own_addr_type == BT_ADDR_LE_PUBLIC_ID ||
|
||||
ll_scan.own_addr_type == BT_ADDR_LE_RANDOM_ID)) {
|
||||
/* Generate RPAs if required */
|
||||
ll_rl_rpa_update(false);
|
||||
}
|
||||
#endif
|
||||
status = radio_scan_enable(ll_scan.type, ll_scan.tx_addr,
|
||||
ll_addr_get(ll_scan.tx_addr, NULL),
|
||||
status = radio_scan_enable(ll_scan.type, ll_scan.own_addr_type,
|
||||
ll_addr_get(ll_scan.own_addr_type, NULL),
|
||||
ll_scan.interval, ll_scan.window,
|
||||
ll_scan.filter_policy);
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue