OSDN Git Service

gd HCI: Do not start rotate address if policy not set
authorChienyuan <chienyuanhuang@google.com>
Thu, 13 Aug 2020 15:51:16 +0000 (23:51 +0800)
committerChienyuan <chienyuanhuang@google.com>
Thu, 13 Aug 2020 15:58:45 +0000 (23:58 +0800)
Bug: 145832107
Tag: #gd-refactor
Test: cert/run --host; manual
Change-Id: I38311a43998baf464181533fbf04a4bec1f34e71

gd/hci/le_address_manager.cc

index 62253c9..6f73b19 100644 (file)
@@ -41,6 +41,7 @@ void LeAddressManager::SetPrivacyPolicyForInitiatorAddress(
   switch (address_policy_) {
     case AddressPolicy::USE_PUBLIC_ADDRESS:
       le_address_ = fixed_address;
+      handler_->BindOnceOn(this, &LeAddressManager::resume_registered_clients).Invoke();
       break;
     case AddressPolicy::USE_STATIC_ADDRESS: {
       auto addr = fixed_address.GetAddress();
@@ -64,6 +65,11 @@ void LeAddressManager::SetPrivacyPolicyForInitiatorAddress(
       minimum_rotation_time_ = minimum_rotation_time;
       maximum_rotation_time_ = maximum_rotation_time;
       address_rotation_alarm_ = std::make_unique<os::Alarm>(handler_);
+      if (!registered_clients_.empty()) {
+        // clients registered and paused before the policy set, rotate random address and resume
+        // clients after set random address complete
+        handler_->BindOnceOn(this, &LeAddressManager::rotate_random_address).Invoke();
+      }
       break;
     case AddressPolicy::POLICY_NOT_SET:
       LOG_ALWAYS_FATAL("invalid parameters");
@@ -120,7 +126,12 @@ LeAddressManager::AddressPolicy LeAddressManager::Register(LeAddressManagerCallb
 
 void LeAddressManager::register_client(LeAddressManagerCallback* callback) {
   registered_clients_.insert(std::pair<LeAddressManagerCallback*, ClientState>(callback, ClientState::RESUMED));
-  if (address_policy_ == AddressPolicy::POLICY_NOT_SET || address_policy_ == AddressPolicy::USE_RESOLVABLE_ADDRESS ||
+  if (address_policy_ == AddressPolicy::POLICY_NOT_SET) {
+    LOG_DEBUG("address policy isn't set yet, pause clients and return");
+    pause_registered_clients();
+    return;
+  } else if (
+      address_policy_ == AddressPolicy::USE_RESOLVABLE_ADDRESS ||
       address_policy_ == AddressPolicy::USE_NON_RESOLVABLE_ADDRESS) {
     prepare_to_rotate();
   }
@@ -177,7 +188,10 @@ void LeAddressManager::ack_pause(LeAddressManagerCallback* callback) {
       return;
     }
   }
-  handle_next_command();
+
+  if (address_policy_ != AddressPolicy::POLICY_NOT_SET) {
+    handle_next_command();
+  }
 }
 
 void LeAddressManager::resume_registered_clients() {
@@ -207,6 +221,7 @@ void LeAddressManager::prepare_to_rotate() {
 void LeAddressManager::rotate_random_address() {
   if (address_policy_ != AddressPolicy::USE_RESOLVABLE_ADDRESS &&
       address_policy_ != AddressPolicy::USE_NON_RESOLVABLE_ADDRESS) {
+    LOG_ALWAYS_FATAL("Invalid address policy!");
     return;
   }