apps/bttester: implement NRPA rotation

As per CORE v5.3, Vol 3, Part C 10.7.1 NRPA should also rotate, same
as RPA is doing right now. For time beeing let's implement this in
tester application, before it's implemented in host.

This affects GAP/BROB/BCST/BV-04-C
This commit is contained in:
Krzysztof Kopyściński
2021-11-03 14:38:07 +01:00
committed by Krzysztof Kopyściński
parent 7f31820ea1
commit 8135e51185
2 changed files with 51 additions and 1 deletions
+47 -1
View File
@@ -63,6 +63,10 @@ static struct os_callout connected_ev_co;
static struct gap_device_connected_ev connected_ev;
#define CONNECTED_EV_DELAY_MS(itvl) 8 * BLE_HCI_CONN_ITVL * itvl / 1000
static int connection_attempts;
#if MYNEWT_VAL(BTTESTER_PRIVACY_MODE) && MYNEWT_VAL(BTTESTER_USE_NRPA)
static int64_t advertising_start;
static struct os_callout bttester_nrpa_rotate_timer;
#endif
static const struct ble_gap_conn_params dflt_conn_params = {
.scan_itvl = 0x0010,
@@ -248,6 +252,38 @@ static struct ble_gap_adv_params adv_params = {
.disc_mode = BLE_GAP_DISC_MODE_NON,
};
#if MYNEWT_VAL(BTTESTER_PRIVACY_MODE) && MYNEWT_VAL(BTTESTER_USE_NRPA)
static void rotate_nrpa_cb(struct os_event *ev)
{
int rc;
ble_addr_t addr;
int32_t duration_ms = BLE_HS_FOREVER;
int32_t remaining_time;
os_time_t remaining_ticks;
if (adv_params.disc_mode == BLE_GAP_DISC_MODE_LTD) {
duration_ms = MYNEWT_VAL(BTTESTER_LTD_ADV_TIMEOUT);
}
ble_gap_adv_stop();
rc = ble_hs_id_gen_rnd(1, &addr);
assert(rc == 0);
rc = ble_hs_id_set_rnd(addr.val);
assert(rc == 0);
ble_gap_adv_start(own_addr_type, NULL, duration_ms,
&adv_params, gap_event_cb, NULL);
remaining_time = os_get_uptime_usec() - advertising_start;
if (remaining_time > 0) {
advertising_start = os_get_uptime_usec();
os_time_ms_to_ticks(remaining_time, &remaining_ticks);
os_callout_reset(&bttester_nrpa_rotate_timer,
remaining_ticks);
}
}
#endif
static void set_connectable(uint8_t *data, uint16_t len)
{
const struct gap_set_connectable_cmd *cmd = (void *) data;
@@ -418,6 +454,13 @@ static void start_advertising(const uint8_t *data, uint16_t len)
duration_ms = MYNEWT_VAL(BTTESTER_LTD_ADV_TIMEOUT);
}
#if MYNEWT_VAL(BTTESTER_PRIVACY_MODE) && MYNEWT_VAL(BTTESTER_USE_NRPA)
if (MYNEWT_VAL(BTTESTER_NRPA_TIMEOUT) < duration_ms / 1000) {
advertising_start = os_get_uptime_usec();
os_callout_reset(&bttester_nrpa_rotate_timer,
OS_TICKS_PER_SEC * MYNEWT_VAL(BTTESTER_NRPA_TIMEOUT));
}
#endif
err = ble_gap_adv_start(own_addr_type, NULL, duration_ms,
&adv_params, gap_event_cb, NULL);
if (err) {
@@ -1675,7 +1718,10 @@ uint8_t tester_init_gap(void)
return BTP_STATUS_FAILED;
}
#endif
#if MYNEWT_VAL(BTTESTER_PRIVACY_MODE) && MYNEWT_VAL(BTTESTER_USE_NRPA)
os_callout_init(&bttester_nrpa_rotate_timer, os_eventq_dflt_get(),
rotate_nrpa_cb, NULL);
#endif
adv_buf = NET_BUF_SIMPLE(ADV_BUF_LEN);
tester_init_gap_cb(BTP_STATUS_SUCCESS);
+4
View File
@@ -75,6 +75,10 @@ syscfg.defs:
description: Maximum MTU size the application can handle
value: 230
BTTESTER_NRPA_TIMEOUT:
description: NRPA rotation timeout in seconds
value: 5
syscfg.vals:
OS_MAIN_STACK_SIZE: 512
SHELL_TASK: 0