Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit a34699a4 authored by Rongxuan Liu's avatar Rongxuan Liu
Browse files

Not periodically auto-rotate address for le audio non-resolvable address

Bug: 292010892
Tag: #bug
Test: atest bluetooth_test_gd_unit
Test: manual check LEA broadcast not auto rotate nrpa
Change-Id: I042cc8665322d1732e2f68e2c47630238c30dc57
parent c9b69147
Loading
Loading
Loading
Loading
+8 −0
Original line number Diff line number Diff line
@@ -228,6 +228,10 @@ cc_binary {
    defaults: [
        "gd_defaults",
    ],
    include_dirs: [
        "packages/modules/Bluetooth/system/include",
        "packages/modules/Bluetooth/system/types",
    ],
    host_supported: true,
    srcs: [
        ":BluetoothFacade_hci_hal",
@@ -309,6 +313,10 @@ cc_test {
        "gd_defaults",
        "mts_defaults",
    ],
    include_dirs: [
        "packages/modules/Bluetooth/system/include",
        "packages/modules/Bluetooth/system/types",
    ],
    host_supported: true,
    // TODO(b/231993739): Reenable isolated:true by deleting the explicit disable below
    isolated: false,
+3 −0
Original line number Diff line number Diff line
@@ -25,6 +25,7 @@
#include "common/bidi_queue.h"
#include "common/bind.h"
#include "grpc/grpc_event_queue.h"
#include "hardware/ble_advertiser.h"
#include "hci/address.h"
#include "hci/address_with_type.h"
#include "hci/le_advertising_manager.h"
@@ -234,6 +235,7 @@ class LeAdvertisingManagerFacadeService : public LeAdvertisingManagerFacade::Ser
    pending_advertiser_id_ = std::promise<AdvertiserId>();
    auto future = pending_advertiser_id_->get_future();
    le_advertising_manager_->ExtendedCreateAdvertiser(
        kAdvertiserClientIdJni,
        0,
        config,
        common::Bind(&LeAdvertiser::ScanCallback, common::Unretained(&le_advertiser)),
@@ -266,6 +268,7 @@ class LeAdvertisingManagerFacadeService : public LeAdvertisingManagerFacade::Ser
    pending_advertiser_id_ = std::promise<AdvertiserId>();
    auto future = pending_advertiser_id_->get_future();
    le_advertising_manager_->ExtendedCreateAdvertiser(
        kAdvertiserClientIdJni,
        0,
        config,
        common::Bind(&LeAdvertiser::ScanCallback, common::Unretained(&le_advertiser)),
+29 −4
Original line number Diff line number Diff line
@@ -20,6 +20,7 @@

#include "common/init_flags.h"
#include "common/strings.h"
#include "hardware/ble_advertiser.h"
#include "hci/acl_manager.h"
#include "hci/controller.h"
#include "hci/hci_layer.h"
@@ -488,11 +489,21 @@ struct LeAdvertisingManager::impl : public bluetooth::hci::LeAddressManagerCallb
    advertising_sets_[id].status_callback = std::move(status_callback);
    advertising_sets_[id].timeout_callback = std::move(timeout_callback);

    // legacy start_advertising use default jni client id
    create_extended_advertiser_with_id(
        kIdLocal, id, config, scan_callback, set_terminated_callback, duration, 0, handler);
        kAdvertiserClientIdJni,
        kIdLocal,
        id,
        config,
        scan_callback,
        set_terminated_callback,
        duration,
        0,
        handler);
  }

  void create_extended_advertiser(
      uint8_t client_id,
      int reg_id,
      const AdvertisingConfig config,
      common::Callback<void(Address, AddressType)> scan_callback,
@@ -507,6 +518,7 @@ struct LeAdvertisingManager::impl : public bluetooth::hci::LeAddressManagerCallb
      return;
    }
    create_extended_advertiser_with_id(
        client_id,
        reg_id,
        id,
        config,
@@ -518,6 +530,7 @@ struct LeAdvertisingManager::impl : public bluetooth::hci::LeAddressManagerCallb
  }

  void create_extended_advertiser_with_id(
      uint8_t client_id,
      int reg_id,
      AdvertiserId id,
      const AdvertisingConfig config,
@@ -573,9 +586,19 @@ struct LeAdvertisingManager::impl : public bluetooth::hci::LeAddressManagerCallb
              id,
              advertising_sets_[id].current_address));

      // but we only rotate if the AdvertiserAddressType is non-public (since static random
      // addresses don't rotate)
      if (advertising_sets_[id].address_type != AdvertiserAddressType::PUBLIC) {
      bool leaudio_requested_nrpa = false;
      if (client_id == kAdvertiserClientIdLeAudio &&
          advertising_sets_[id].address_type == AdvertiserAddressType::NONRESOLVABLE_RANDOM) {
        LOG_INFO(
            "Advertiser started by le audio client with address type: %d",
            advertising_sets_[id].address_type);
        leaudio_requested_nrpa = true;
      }

      // but we only rotate if the AdvertiserAddressType is non-public
      // or non-rpa requested by leaudio(since static random addresses don't rotate)
      if (advertising_sets_[id].address_type != AdvertiserAddressType::PUBLIC &&
          !leaudio_requested_nrpa) {
        // start timer for random address
        advertising_sets_[id].address_rotation_alarm = std::make_unique<os::Alarm>(module_handler_);
        advertising_sets_[id].address_rotation_alarm->Schedule(
@@ -1647,6 +1670,7 @@ int LeAdvertisingManager::GetAdvertiserRegId(AdvertiserId advertiser_id) {
}

void LeAdvertisingManager::ExtendedCreateAdvertiser(
    uint8_t client_id,
    int reg_id,
    const AdvertisingConfig config,
    common::Callback<void(Address, AddressType)> scan_callback,
@@ -1715,6 +1739,7 @@ void LeAdvertisingManager::ExtendedCreateAdvertiser(
  CallOn(
      pimpl_.get(),
      &impl::create_extended_advertiser,
      client_id,
      reg_id,
      config,
      scan_callback,
+1 −0
Original line number Diff line number Diff line
@@ -114,6 +114,7 @@ class LeAdvertisingManager : public bluetooth::Module {
  int GetAdvertiserRegId(AdvertiserId advertiser_id);

  void ExtendedCreateAdvertiser(
      uint8_t client_id,
      int reg_id,
      const AdvertisingConfig config,
      common::Callback<void(Address, AddressType)> scan_callback,
+2 −1
Original line number Diff line number Diff line
@@ -36,7 +36,8 @@ class MockLeAdvertisingManager : public LeAdvertisingManager {
  MOCK_METHOD(
      AdvertiserId,
      ExtendedCreateAdvertiser,
      (int regId,
      (uint8_t client_id,
       int regId,
       const AdvertisingConfig,
       const common::Callback<void(Address, AddressType)>&,
       const common::Callback<void(ErrorCode, uint8_t, uint8_t)>&,
Loading