You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@mynewt.apache.org by ko...@apache.org on 2021/11/03 13:38:12 UTC

[mynewt-nimble] branch master updated: apps/bttester: implement NRPA rotation

This is an automated email from the ASF dual-hosted git repository.

kopyscinski pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/mynewt-nimble.git


The following commit(s) were added to refs/heads/master by this push:
     new 8135e51  apps/bttester: implement NRPA rotation
8135e51 is described below

commit 8135e511854e3c665408cbe331e257fd7aa91226
Author: Krzysztof Kopyściński <kr...@codecoup.pl>
AuthorDate: Wed Sep 29 08:43:39 2021 +0200

    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
---
 apps/bttester/src/gap.c  | 48 +++++++++++++++++++++++++++++++++++++++++++++++-
 apps/bttester/syscfg.yml |  4 ++++
 2 files changed, 51 insertions(+), 1 deletion(-)

diff --git a/apps/bttester/src/gap.c b/apps/bttester/src/gap.c
index acac998..63150e2 100644
--- a/apps/bttester/src/gap.c
+++ b/apps/bttester/src/gap.c
@@ -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);
diff --git a/apps/bttester/syscfg.yml b/apps/bttester/syscfg.yml
index 7f99ded..f00afeb 100644
--- a/apps/bttester/syscfg.yml
+++ b/apps/bttester/syscfg.yml
@@ -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