mirror of
https://github.com/espressif/esp-nimble.git
synced 2026-11-08 05:22:48 +00:00
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:
committed by
Krzysztof Kopyściński
parent
7f31820ea1
commit
8135e51185
+47
-1
@@ -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);
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user