Randomize the time between rotations of BLE Random Address
Bug: 150394435
Bug: 151485516
Change-Id: I342f3e34f12a200db0a5c3aab23efabac5626825
diff --git a/stack/btm/btm_ble_addr.cc b/stack/btm/btm_ble_addr.cc
index 000066e..678dd76 100644
--- a/stack/btm/btm_ble_addr.cc
+++ b/stack/btm/btm_ble_addr.cc
@@ -72,7 +72,7 @@
p_cb->own_addr_type = BLE_ADDR_RANDOM;
/* start a periodical timer to refresh random addr */
- uint64_t interval_ms = BTM_BLE_PRIVATE_ADDR_INT_MS;
+ uint64_t interval_ms = btm_get_next_private_addrress_interval_ms();
#if (BTM_BLE_CONFORMANCE_TESTING == TRUE)
interval_ms = btm_cb.ble_ctr_cb.rpa_tout * 1000;
#endif
@@ -93,6 +93,14 @@
std::move(cb)));
}
+uint64_t btm_get_next_private_addrress_interval_ms() {
+ /* 7 minutes minimum, 15 minutes maximum for random address refreshing */
+ const uint64_t interval_min_ms = (7 * 60 * 1000);
+ const uint64_t interval_random_part_max_ms = (8 * 60 * 1000);
+
+ return interval_min_ms + std::rand() % interval_random_part_max_ms;
+}
+
/*******************************************************************************
*
* Function btm_gen_non_resolve_paddr_cmpl
diff --git a/stack/btm/btm_ble_int.h b/stack/btm/btm_ble_int.h
index fc1bfcf..b2702fe 100644
--- a/stack/btm/btm_ble_int.h
+++ b/stack/btm/btm_ble_int.h
@@ -139,6 +139,7 @@
extern tBTM_SEC_DEV_REC* btm_ble_resolve_random_addr(
const RawAddress& random_bda);
extern void btm_gen_resolve_paddr_low(const RawAddress& address);
+extern uint64_t btm_get_next_private_addrress_interval_ms();
/* privacy function */
#if (BLE_PRIVACY_SPT == TRUE)
diff --git a/stack/btm/btm_ble_int_types.h b/stack/btm/btm_ble_int_types.h
index d2fa554..375c2b3 100644
--- a/stack/btm/btm_ble_int_types.h
+++ b/stack/btm/btm_ble_int_types.h
@@ -119,9 +119,6 @@
#define BTM_BLE_ISVALID_PARAM(x, min, max) \
(((x) >= (min) && (x) <= (max)) || ((x) == BTM_BLE_CONN_PARAM_UNDEF))
-/* 15 minutes minimum for random address refreshing */
-#define BTM_BLE_PRIVATE_ADDR_INT_MS (15 * 60 * 1000)
-
typedef struct {
uint16_t discoverable_mode;
uint16_t connectable_mode;
diff --git a/stack/btm/btm_ble_multi_adv.cc b/stack/btm/btm_ble_multi_adv.cc
index e1e50e9..6db7594 100644
--- a/stack/btm/btm_ble_multi_adv.cc
+++ b/stack/btm/btm_ble_multi_adv.cc
@@ -24,6 +24,7 @@
#include "ble_advertiser.h"
#include "ble_advertiser_hci_interface.h"
#include "btm_int_types.h"
+#include "stack/btm/btm_ble_int.h"
#include <string.h>
#include <queue>
@@ -257,7 +258,7 @@
p_inst->own_address = bda;
alarm_set_on_mloop(p_inst->adv_raddr_timer,
- BTM_BLE_PRIVATE_ADDR_INT_MS,
+ btm_get_next_private_addrress_interval_ms(),
btm_ble_adv_raddr_timer_timeout, p_inst);
cb.Run(p_inst->inst_id, BTM_BLE_MULTI_ADV_SUCCESS);
},
diff --git a/stack/btm/btm_devctl.cc b/stack/btm/btm_devctl.cc
index 2b717b9..52b66b4 100644
--- a/stack/btm/btm_devctl.cc
+++ b/stack/btm/btm_devctl.cc
@@ -199,14 +199,17 @@
l2c_link_processs_num_bufs(controller->get_acl_buffer_count_classic());
+ // setup the random number generator
+ std::srand(std::time(nullptr));
+
#if (BLE_PRIVACY_SPT == TRUE)
/* Set up the BLE privacy settings */
if (controller->supports_ble() && controller->supports_ble_privacy() &&
controller->get_ble_resolving_list_max_size() > 0) {
btm_ble_resolving_list_init(controller->get_ble_resolving_list_max_size());
/* set the default random private address timeout */
- btsnd_hcic_ble_set_rand_priv_addr_timeout(BTM_BLE_PRIVATE_ADDR_INT_MS /
- 1000);
+ btsnd_hcic_ble_set_rand_priv_addr_timeout(
+ btm_get_next_private_addrress_interval_ms() / 1000);
}
#endif
diff --git a/stack/test/ble_advertiser_test.cc b/stack/test/ble_advertiser_test.cc
index 952aa41..98142dd 100644
--- a/stack/test/ble_advertiser_test.cc
+++ b/stack/test/ble_advertiser_test.cc
@@ -68,6 +68,8 @@
void alarm_free(alarm_t* alarm) {}
const controller_t* controller_get_interface() { return nullptr; }
+uint64_t btm_get_next_private_addrress_interval_ms() { return 15 * 60 * 1000; }
+
namespace {
void DoNothing(uint8_t) {}