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) #if defined(CONFIG_BLUETOOTH_CONTROLLER_PRIVACY)
ll_adv.own_addr_type = own_addr_type; 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; ll_adv.id_addr_type = direct_addr_type;
memcpy(&ll_adv.id_addr, direct_addr, BDADDR_SIZE); 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 */ /* Prepare whitelist and optionally resolving list */
ll_filters_adv_update(ll_adv.filter_policy); ll_filters_adv_update(ll_adv.filter_policy);
if (ctrl_rl_enabled()) { if (ll_adv.own_addr_type == BT_ADDR_LE_PUBLIC_ID ||
/*@todo: Enable AR */ ll_adv.own_addr_type == BT_ADDR_LE_RANDOM_ID) {
}
if (ll_adv.own_addr_type >= BT_ADDR_LE_PUBLIC_ID) {
/* Look up the resolving list */ /* Look up the resolving list */
int idx = ll_rl_find(ll_adv.id_addr_type, int idx = ll_rl_find(ll_adv.id_addr_type,
ll_adv.id_addr); ll_adv.id_addr);

View file

@ -67,7 +67,7 @@ static u8_t peer_irk_count;
/* Hardware filter for the resolving list */ /* Hardware filter for the resolving list */
static struct ll_filter rl_filter; 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; u32_t rpa_timeout_ms;
s64_t rpa_last_ms; s64_t rpa_last_ms;
@ -267,6 +267,7 @@ static void filter_wl_update(void)
for (i = 0; i < WL_SIZE; i++) { for (i = 0; i < WL_SIZE; i++) {
int j = wl_peers[i].rl_idx; int j = wl_peers[i].rl_idx;
if (!rl_enable || j == IDX_NONE || !rl[j].pirk || rl[j].dev) { if (!rl_enable || j == IDX_NONE || !rl[j].pirk || rl[j].dev) {
filter_insert(&wl, i, wl_peers[i].id_addr_type, filter_insert(&wl, i, wl_peers[i].id_addr_type,
wl_peers[i].id_addr.val); wl_peers[i].id_addr.val);
@ -337,6 +338,7 @@ bool ctrl_rl_enabled(void)
return rl_enable; return rl_enable;
} }
#if defined(CONFIG_BLUETOOTH_BROADCASTER)
void ll_rl_pdu_adv_update(int idx, struct pdu_adv *pdu) void ll_rl_pdu_adv_update(int idx, struct pdu_adv *pdu)
{ {
u8_t *adva = pdu->type == PDU_ADV_TYPE_SCAN_RSP ? 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(); 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; return;
} }
@ -414,11 +417,12 @@ static void rpa_adv_refresh(void)
memcpy(&pdu->payload.adv_ind.data[0], &prev->payload.adv_ind.data[0], memcpy(&pdu->payload.adv_ind.data[0], &prev->payload.adv_ind.data[0],
prev->len - BDADDR_SIZE); prev->len - BDADDR_SIZE);
pdu->len = prev->len;; pdu->len = prev->len;
/* commit the update so controller picks it. */ /* commit the update so controller picks it. */
radio_adv_data->last = last; radio_adv_data->last = last;
} }
#endif
static void rl_clear(void) static void rl_clear(void)
{ {
@ -470,9 +474,11 @@ void ll_rl_rpa_update(bool timeout)
} }
if (timeout) { if (timeout) {
#if defined(CONFIG_BLUETOOTH_BROADCASTER)
if (radio_adv_is_enabled()) { if (radio_adv_is_enabled()) {
rpa_adv_refresh(); 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) #if defined(CONFIG_BLUETOOTH_CONTROLLER_PRIVACY)
ll_filters_scan_update(filter_policy); 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 #endif
return radio_scan_enable(0, own_addr_type, return radio_scan_enable(0, own_addr_type,
ll_addr_get(own_addr_type, NULL), ll_addr_get(own_addr_type, NULL),

View file

@ -25,7 +25,7 @@ static struct {
u8_t type:1; u8_t type:1;
#endif /* !CONFIG_BLUETOOTH_CONTROLLER_ADV_EXT */ #endif /* !CONFIG_BLUETOOTH_CONTROLLER_ADV_EXT */
u8_t tx_addr:1; u8_t own_addr_type:2;
u8_t filter_policy:2; u8_t filter_policy:2;
} ll_scan; } 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.type = type;
ll_scan.interval = interval; ll_scan.interval = interval;
ll_scan.window = window; 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; ll_scan.filter_policy = filter_policy;
return 0; return 0;
@ -70,9 +70,16 @@ u32_t ll_scan_enable(u8_t enable)
#if defined(CONFIG_BLUETOOTH_CONTROLLER_PRIVACY) #if defined(CONFIG_BLUETOOTH_CONTROLLER_PRIVACY)
ll_filters_scan_update(ll_scan.filter_policy); 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 #endif
status = radio_scan_enable(ll_scan.type, ll_scan.tx_addr, status = radio_scan_enable(ll_scan.type, ll_scan.own_addr_type,
ll_addr_get(ll_scan.tx_addr, NULL), ll_addr_get(ll_scan.own_addr_type, NULL),
ll_scan.interval, ll_scan.window, ll_scan.interval, ll_scan.window,
ll_scan.filter_policy); ll_scan.filter_policy);