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:
Carles Cufi 2017-06-26 12:27:25 +02:00 committed by Johan Hedberg
commit 1a07179a3c
4 changed files with 29 additions and 13 deletions

View file

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

View file

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

View file

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

View file

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