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

Commit 26ccadfa authored by Rahul Arya's avatar Rahul Arya Committed by Cherrypicker Worker
Browse files

Use dedicated enum for Advertiser Address Type

OwnAddressType is not appropriate since it includes cases that are
impossible in our stack, and merges RPA + NRPA together.

No behavioral changes.

Test: unit
Bug: 268112598
(cherry picked from https://android-review.googlesource.com/q/commit:80c922dc1e33b673af3ff43c0a9928f600c69782)
Merged-In: I9139c5e63cc9d34ed21f0005336e1517c80628f2
Change-Id: I9139c5e63cc9d34ed21f0005336e1517c80628f2
Bug:279962122
parent 38f1c6fd
Loading
Loading
Loading
Loading
+5 −1
Original line number Original line Diff line number Diff line
@@ -42,6 +42,7 @@ using ::grpc::Status;


using ::blueberry::facade::BluetoothAddress;
using ::blueberry::facade::BluetoothAddress;
using ::blueberry::facade::BluetoothAddressTypeEnum;
using ::blueberry::facade::BluetoothAddressTypeEnum;
using ::blueberry::facade::BluetoothOwnAddressTypeEnum;
using ::blueberry::facade::hci::AdvertisingConfig;
using ::blueberry::facade::hci::AdvertisingConfig;
using ::blueberry::facade::hci::ExtendedAdvertisingConfig;
using ::blueberry::facade::hci::ExtendedAdvertisingConfig;
using ::blueberry::facade::hci::GapDataMsg;
using ::blueberry::facade::hci::GapDataMsg;
@@ -79,7 +80,10 @@ bool AdvertisingConfigFromProto(const AdvertisingConfig& config_proto, hci::Exte


  config->advertising_type = static_cast<hci::AdvertisingType>(config_proto.advertising_type());
  config->advertising_type = static_cast<hci::AdvertisingType>(config_proto.advertising_type());


  config->own_address_type = static_cast<::bluetooth::hci::OwnAddressType>(config_proto.own_address_type());
  config->requested_advertiser_address_type =
      config_proto.own_address_type() == BluetoothOwnAddressTypeEnum::USE_PUBLIC_DEVICE_ADDRESS
          ? AdvertiserAddressType::PUBLIC
          : AdvertiserAddressType::RESOLVABLE_RANDOM;


  config->peer_address_type = static_cast<::bluetooth::hci::PeerAddressType>(config_proto.peer_address_type());
  config->peer_address_type = static_cast<::bluetooth::hci::PeerAddressType>(config_proto.peer_address_type());


+8 −6
Original line number Original line Diff line number Diff line
@@ -71,15 +71,15 @@ class LeAddressManager {
      crypto_toolbox::Octet16 rotation_irk,
      crypto_toolbox::Octet16 rotation_irk,
      std::chrono::milliseconds minimum_rotation_time,
      std::chrono::milliseconds minimum_rotation_time,
      std::chrono::milliseconds maximum_rotation_time);
      std::chrono::milliseconds maximum_rotation_time);
  virtual AddressPolicy GetAddressPolicy();
  AddressPolicy GetAddressPolicy();
  virtual void AckPause(LeAddressManagerCallback* callback);
  virtual void AckPause(LeAddressManagerCallback* callback);
  virtual void AckResume(LeAddressManagerCallback* callback);
  virtual void AckResume(LeAddressManagerCallback* callback);
  virtual AddressPolicy Register(LeAddressManagerCallback* callback);
  virtual AddressPolicy Register(LeAddressManagerCallback* callback);
  virtual void Unregister(LeAddressManagerCallback* callback);
  virtual void Unregister(LeAddressManagerCallback* callback);
  virtual bool UnregisterSync(
  virtual bool UnregisterSync(
      LeAddressManagerCallback* callback, std::chrono::milliseconds timeout = kUnregisterSyncTimeoutInMs);
      LeAddressManagerCallback* callback, std::chrono::milliseconds timeout = kUnregisterSyncTimeoutInMs);
  virtual AddressWithType GetCurrentAddress();  // What was set in SetRandomAddress()
  AddressWithType GetCurrentAddress();  // What was set in SetRandomAddress()
  virtual AddressWithType GetAnotherAddress();  // A new random address without rotating.
  AddressWithType GetAnotherAddress();  // A new random address without rotating.


  uint8_t GetFilterAcceptListSize();
  uint8_t GetFilterAcceptListSize();
  uint8_t GetResolvingListSize();
  uint8_t GetResolvingListSize();
@@ -101,6 +101,11 @@ class LeAddressManager {
    return cached_commands_.size();
    return cached_commands_.size();
  }
  }


 protected:
  AddressPolicy address_policy_ = AddressPolicy::POLICY_NOT_SET;
  std::chrono::milliseconds minimum_rotation_time_;
  std::chrono::milliseconds maximum_rotation_time_;

 private:
 private:
  enum ClientState {
  enum ClientState {
    WAITING_FOR_PAUSE,
    WAITING_FOR_PAUSE,
@@ -163,14 +168,11 @@ class LeAddressManager {
  os::Handler* handler_;
  os::Handler* handler_;
  std::map<LeAddressManagerCallback*, ClientState> registered_clients_;
  std::map<LeAddressManagerCallback*, ClientState> registered_clients_;


  AddressPolicy address_policy_ = AddressPolicy::POLICY_NOT_SET;
  AddressWithType le_address_;
  AddressWithType le_address_;
  AddressWithType cached_address_;
  AddressWithType cached_address_;
  Address public_address_;
  Address public_address_;
  std::unique_ptr<os::Alarm> address_rotation_alarm_;
  std::unique_ptr<os::Alarm> address_rotation_alarm_;
  crypto_toolbox::Octet16 rotation_irk_;
  crypto_toolbox::Octet16 rotation_irk_;
  std::chrono::milliseconds minimum_rotation_time_;
  std::chrono::milliseconds maximum_rotation_time_;
  uint8_t connect_list_size_;
  uint8_t connect_list_size_;
  uint8_t resolving_list_size_;
  uint8_t resolving_list_size_;
  std::queue<Command> cached_commands_;
  std::queue<Command> cached_commands_;
+31 −30
Original line number Original line Diff line number Diff line
@@ -330,12 +330,6 @@ struct LeAdvertisingManager::impl : public bluetooth::hci::LeAddressManagerCallb


    switch (advertising_api_type_) {
    switch (advertising_api_type_) {
      case (AdvertisingApiType::LEGACY): {
      case (AdvertisingApiType::LEGACY): {
        set_parameters(id, config);
        if (config.advertising_type == AdvertisingType::ADV_IND ||
            config.advertising_type == AdvertisingType::ADV_NONCONN_IND) {
          set_data(id, true, config.scan_response);
        }
        set_data(id, false, config.advertisement);
        auto address_policy = le_address_manager_->GetAddressPolicy();
        auto address_policy = le_address_manager_->GetAddressPolicy();
        if (address_policy == LeAddressManager::AddressPolicy::USE_NON_RESOLVABLE_ADDRESS ||
        if (address_policy == LeAddressManager::AddressPolicy::USE_NON_RESOLVABLE_ADDRESS ||
            address_policy == LeAddressManager::AddressPolicy::USE_RESOLVABLE_ADDRESS) {
            address_policy == LeAddressManager::AddressPolicy::USE_RESOLVABLE_ADDRESS) {
@@ -343,6 +337,12 @@ struct LeAdvertisingManager::impl : public bluetooth::hci::LeAddressManagerCallb
        } else {
        } else {
          advertising_sets_[id].current_address = le_address_manager_->GetCurrentAddress();
          advertising_sets_[id].current_address = le_address_manager_->GetCurrentAddress();
        }
        }
        set_parameters(id, config);
        if (config.advertising_type == AdvertisingType::ADV_IND ||
            config.advertising_type == AdvertisingType::ADV_NONCONN_IND) {
          set_data(id, true, config.scan_response);
        }
        set_data(id, false, config.advertisement);
        if (!paused) {
        if (!paused) {
          enable_advertiser(id, true, 0, 0);
          enable_advertiser(id, true, 0, 0);
        } else {
        } else {
@@ -430,21 +430,22 @@ struct LeAdvertisingManager::impl : public bluetooth::hci::LeAddressManagerCallb
    advertising_sets_[id].max_extended_advertising_events = max_ext_adv_events;
    advertising_sets_[id].max_extended_advertising_events = max_ext_adv_events;
    advertising_sets_[id].handler = handler;
    advertising_sets_[id].handler = handler;


    set_parameters(id, config);

    auto address_policy = le_address_manager_->GetAddressPolicy();
    auto address_policy = le_address_manager_->GetAddressPolicy();
    switch (config.own_address_type) {
    switch (config.requested_advertiser_address_type) {
      case OwnAddressType::RANDOM_DEVICE_ADDRESS:
      case AdvertiserAddressType::RESOLVABLE_RANDOM:
        if (address_policy == LeAddressManager::AddressPolicy::USE_NON_RESOLVABLE_ADDRESS ||
        if (address_policy == LeAddressManager::AddressPolicy::USE_NON_RESOLVABLE_ADDRESS ||
            address_policy == LeAddressManager::AddressPolicy::USE_RESOLVABLE_ADDRESS) {
            address_policy == LeAddressManager::AddressPolicy::USE_RESOLVABLE_ADDRESS) {
          AddressWithType address_with_type = le_address_manager_->GetAnotherAddress();
          advertising_sets_[id].current_address = le_address_manager_->GetAnotherAddress();
          set_parameters(id, config);
          le_advertising_interface_->EnqueueCommand(
          le_advertising_interface_->EnqueueCommand(
              hci::LeSetAdvertisingSetRandomAddressBuilder::Create(id, address_with_type.GetAddress()),
              hci::LeSetAdvertisingSetRandomAddressBuilder::Create(
                  id, advertising_sets_[id].current_address.GetAddress()),
              module_handler_->BindOnceOn(
              module_handler_->BindOnceOn(
                  this,
                  this,
                  &impl::on_set_advertising_set_random_address_complete<LeSetAdvertisingSetRandomAddressCompleteView>,
                  &impl::on_set_advertising_set_random_address_complete<
                      LeSetAdvertisingSetRandomAddressCompleteView>,
                  id,
                  id,
                  address_with_type));
                  advertising_sets_[id].current_address));


          // start timer for random address
          // start timer for random address
          advertising_sets_[id].address_rotation_alarm = std::make_unique<os::Alarm>(module_handler_);
          advertising_sets_[id].address_rotation_alarm = std::make_unique<os::Alarm>(module_handler_);
@@ -457,15 +458,17 @@ struct LeAdvertisingManager::impl : public bluetooth::hci::LeAddressManagerCallb
              hci::LeSetAdvertisingSetRandomAddressBuilder::Create(
              hci::LeSetAdvertisingSetRandomAddressBuilder::Create(
                  id, advertising_sets_[id].current_address.GetAddress()),
                  id, advertising_sets_[id].current_address.GetAddress()),
              module_handler_->BindOnce(impl::check_status<LeSetAdvertisingSetRandomAddressCompleteView>));
              module_handler_->BindOnce(impl::check_status<LeSetAdvertisingSetRandomAddressCompleteView>));
          set_parameters(id, config);
        }
        }
        break;
        break;
      case OwnAddressType::PUBLIC_DEVICE_ADDRESS:
      case AdvertiserAddressType::PUBLIC:
        advertising_sets_[id].current_address =
        advertising_sets_[id].current_address =
            AddressWithType(controller_->GetMacAddress(), AddressType::PUBLIC_DEVICE_ADDRESS);
            AddressWithType(controller_->GetMacAddress(), AddressType::PUBLIC_DEVICE_ADDRESS);
        set_parameters(id, config);
        break;
        break;
      default:
      default:
        // For resolvable address types, set the Peer address and type, and the controller generates the address.
        LOG_ALWAYS_FATAL(
        LOG_ALWAYS_FATAL("Unsupported Advertising Type %s", OwnAddressTypeText(config.own_address_type).c_str());
            "Unsupported Advertising Type %d", config.requested_advertiser_address_type);
    }
    }
    if (config.advertising_type == AdvertisingType::ADV_IND ||
    if (config.advertising_type == AdvertisingType::ADV_IND ||
        config.advertising_type == AdvertisingType::ADV_NONCONN_IND) {
        config.advertising_type == AdvertisingType::ADV_NONCONN_IND) {
@@ -598,6 +601,11 @@ struct LeAdvertisingManager::impl : public bluetooth::hci::LeAddressManagerCallb
    advertising_sets_[advertiser_id].tx_power = config.tx_power;
    advertising_sets_[advertiser_id].tx_power = config.tx_power;
    advertising_sets_[advertiser_id].directed = config.directed;
    advertising_sets_[advertiser_id].directed = config.directed;


    // note: does not necessarily match config.requested_advertiser_address_type, since we will
    // ignore the config but instead always use PUBLIC if the device does not support privacy
    auto own_address_type = static_cast<OwnAddressType>(
        advertising_sets_[advertiser_id].current_address.GetAddressType());

    switch (advertising_api_type_) {
    switch (advertising_api_type_) {
      case (AdvertisingApiType::LEGACY): {
      case (AdvertisingApiType::LEGACY): {
        le_advertising_interface_->EnqueueCommand(
        le_advertising_interface_->EnqueueCommand(
@@ -605,17 +613,17 @@ struct LeAdvertisingManager::impl : public bluetooth::hci::LeAddressManagerCallb
                config.interval_min,
                config.interval_min,
                config.interval_max,
                config.interval_max,
                config.advertising_type,
                config.advertising_type,
                config.own_address_type,
                own_address_type,
                config.peer_address_type,
                config.peer_address_type,
                config.peer_address,
                config.peer_address,
                config.channel_map,
                config.channel_map,
                config.filter_policy),
                config.filter_policy),
            module_handler_->BindOnceOn(
            module_handler_->BindOnceOn(
                this, &impl::check_status_with_id<LeSetAdvertisingParametersCompleteView>, advertiser_id));
                this,
                &impl::check_status_with_id<LeSetAdvertisingParametersCompleteView>,
                advertiser_id));
      } break;
      } break;
      case (AdvertisingApiType::ANDROID_HCI): {
      case (AdvertisingApiType::ANDROID_HCI): {
        auto own_address_type =
            static_cast<OwnAddressType>(advertising_sets_[advertiser_id].current_address.GetAddressType());
        le_advertising_interface_->EnqueueCommand(
        le_advertising_interface_->EnqueueCommand(
            hci::LeMultiAdvtParamBuilder::Create(
            hci::LeMultiAdvtParamBuilder::Create(
                config.interval_min,
                config.interval_min,
@@ -659,7 +667,7 @@ struct LeAdvertisingManager::impl : public bluetooth::hci::LeAddressManagerCallb
                  config.interval_min,
                  config.interval_min,
                  config.interval_max,
                  config.interval_max,
                  config.channel_map,
                  config.channel_map,
                  config.own_address_type,
                  own_address_type,
                  config.peer_address_type,
                  config.peer_address_type,
                  config.peer_address,
                  config.peer_address,
                  config.filter_policy,
                  config.filter_policy,
@@ -688,7 +696,7 @@ struct LeAdvertisingManager::impl : public bluetooth::hci::LeAddressManagerCallb
                  config.interval_min,
                  config.interval_min,
                  config.interval_max,
                  config.interval_max,
                  config.channel_map,
                  config.channel_map,
                  config.own_address_type,
                  own_address_type,
                  config.peer_address_type,
                  config.peer_address_type,
                  config.peer_address,
                  config.peer_address,
                  config.filter_policy,
                  config.filter_policy,
@@ -1495,13 +1503,6 @@ AdvertiserId LeAdvertisingManager::create_advertiser(
    const common::Callback<void(ErrorCode, uint8_t, uint8_t)>& set_terminated_callback,
    const common::Callback<void(ErrorCode, uint8_t, uint8_t)>& set_terminated_callback,
    os::Handler* handler) {
    os::Handler* handler) {
  if (config.peer_address == Address::kEmpty) {
  if (config.peer_address == Address::kEmpty) {
    if (config.own_address_type == hci::OwnAddressType::RESOLVABLE_OR_PUBLIC_ADDRESS ||
        config.own_address_type == hci::OwnAddressType::RESOLVABLE_OR_RANDOM_ADDRESS) {
      LOG_WARN("Peer address can not be empty");
      CallOn(
          pimpl_.get(), &impl::start_advertising_fail, reg_id, AdvertisingCallback::AdvertisingStatus::INTERNAL_ERROR);
      return kInvalidId;
    }
    if (config.advertising_type == hci::AdvertisingType::ADV_DIRECT_IND_HIGH ||
    if (config.advertising_type == hci::AdvertisingType::ADV_DIRECT_IND_HIGH ||
        config.advertising_type == hci::AdvertisingType::ADV_DIRECT_IND_LOW) {
        config.advertising_type == hci::AdvertisingType::ADV_DIRECT_IND_LOW) {
      LOG_WARN("Peer address can not be empty for directed advertising");
      LOG_WARN("Peer address can not be empty for directed advertising");
+6 −1
Original line number Original line Diff line number Diff line
@@ -33,6 +33,11 @@ class PeriodicAdvertisingParameters {
  enum AdvertisingProperty { INCLUDE_TX_POWER = 0x06 };
  enum AdvertisingProperty { INCLUDE_TX_POWER = 0x06 };
};
};


enum class AdvertiserAddressType {
  PUBLIC,
  RESOLVABLE_RANDOM,
};

class AdvertisingConfig {
class AdvertisingConfig {
 public:
 public:
  std::vector<GapData> advertisement;
  std::vector<GapData> advertisement;
@@ -40,7 +45,7 @@ class AdvertisingConfig {
  uint16_t interval_min;
  uint16_t interval_min;
  uint16_t interval_max;
  uint16_t interval_max;
  AdvertisingType advertising_type;
  AdvertisingType advertising_type;
  OwnAddressType own_address_type;
  AdvertiserAddressType requested_advertiser_address_type;
  PeerAddressType peer_address_type;
  PeerAddressType peer_address_type;
  Address peer_address;
  Address peer_address;
  uint8_t channel_map;
  uint8_t channel_map;
+45 −31
Original line number Original line Diff line number Diff line
@@ -94,7 +94,12 @@ class TestLeAddressManager : public LeAddressManager {
      Address public_address,
      Address public_address,
      uint8_t connect_list_size,
      uint8_t connect_list_size,
      uint8_t resolving_list_size)
      uint8_t resolving_list_size)
      : LeAddressManager(enqueue_command, handler, public_address, connect_list_size, resolving_list_size) {}
      : LeAddressManager(
            enqueue_command, handler, public_address, connect_list_size, resolving_list_size) {
    address_policy_ = AddressPolicy::USE_STATIC_ADDRESS;
    minimum_rotation_time_ = 0ms;
    maximum_rotation_time_ = 100ms;
  }


  AddressPolicy Register(LeAddressManagerCallback* callback) override {
  AddressPolicy Register(LeAddressManagerCallback* callback) override {
    client_ = callback;
    client_ = callback;
@@ -117,29 +122,10 @@ class TestLeAddressManager : public LeAddressManager {
    test_client_state_ = RESUMED;
    test_client_state_ = RESUMED;
  }
  }


  AddressPolicy GetAddressPolicy() override {
    return address_policy_;
  }

  void SetAddressPolicy(AddressPolicy address_policy) {
  void SetAddressPolicy(AddressPolicy address_policy) {
    address_policy_ = address_policy;
    address_policy_ = address_policy;
  }
  }


  AddressWithType GetAnotherAddress() override {
    hci::Address address;
    Address::FromString("05:04:03:02:01:00", address);
    auto random_address = AddressWithType(address, AddressType::RANDOM_DEVICE_ADDRESS);
    return random_address;
  }

  AddressWithType GetCurrentAddress() override {
    hci::Address address;
    Address::FromString("05:04:03:02:01:00", address);
    auto random_address = AddressWithType(address, AddressType::RANDOM_DEVICE_ADDRESS);
    return random_address;
  }

  AddressPolicy address_policy_ = AddressPolicy::USE_STATIC_ADDRESS;
  LeAddressManagerCallback* client_;
  LeAddressManagerCallback* client_;
  bool ignore_unregister_for_testing = false;
  bool ignore_unregister_for_testing = false;
  enum TestClientState {
  enum TestClientState {
@@ -259,7 +245,7 @@ class LeAdvertisingAPITest : public LeAdvertisingManagerTest {
    // start advertising set
    // start advertising set
    ExtendedAdvertisingConfig advertising_config{};
    ExtendedAdvertisingConfig advertising_config{};
    advertising_config.advertising_type = AdvertisingType::ADV_IND;
    advertising_config.advertising_type = AdvertisingType::ADV_IND;
    advertising_config.own_address_type = OwnAddressType::PUBLIC_DEVICE_ADDRESS;
    advertising_config.requested_advertiser_address_type = AdvertiserAddressType::PUBLIC;
    std::vector<GapData> gap_data{};
    std::vector<GapData> gap_data{};
    GapData data_item{};
    GapData data_item{};
    data_item.data_type_ = GapDataType::FLAGS;
    data_item.data_type_ = GapDataType::FLAGS;
@@ -316,7 +302,7 @@ class LeAndroidHciAdvertisingAPITest : public LeAndroidHciAdvertisingManagerTest


    ExtendedAdvertisingConfig advertising_config{};
    ExtendedAdvertisingConfig advertising_config{};
    advertising_config.advertising_type = AdvertisingType::ADV_IND;
    advertising_config.advertising_type = AdvertisingType::ADV_IND;
    advertising_config.own_address_type = OwnAddressType::PUBLIC_DEVICE_ADDRESS;
    advertising_config.requested_advertiser_address_type = AdvertiserAddressType::PUBLIC;
    std::vector<GapData> gap_data{};
    std::vector<GapData> gap_data{};
    GapData data_item{};
    GapData data_item{};
    data_item.data_type_ = GapDataType::FLAGS;
    data_item.data_type_ = GapDataType::FLAGS;
@@ -361,7 +347,7 @@ class LeAndroidHciAdvertisingAPIPublicAddressTest : public LeAndroidHciAdvertisi


    ExtendedAdvertisingConfig advertising_config{};
    ExtendedAdvertisingConfig advertising_config{};
    advertising_config.advertising_type = AdvertisingType::ADV_IND;
    advertising_config.advertising_type = AdvertisingType::ADV_IND;
    advertising_config.own_address_type = OwnAddressType::PUBLIC_DEVICE_ADDRESS;
    advertising_config.requested_advertiser_address_type = AdvertiserAddressType::PUBLIC;
    std::vector<GapData> gap_data{};
    std::vector<GapData> gap_data{};
    GapData data_item{};
    GapData data_item{};
    data_item.data_type_ = GapDataType::FLAGS;
    data_item.data_type_ = GapDataType::FLAGS;
@@ -416,7 +402,7 @@ class LeExtendedAdvertisingAPITest : public LeExtendedAdvertisingManagerTest {
    // start advertising set
    // start advertising set
    ExtendedAdvertisingConfig advertising_config{};
    ExtendedAdvertisingConfig advertising_config{};
    advertising_config.advertising_type = AdvertisingType::ADV_IND;
    advertising_config.advertising_type = AdvertisingType::ADV_IND;
    advertising_config.own_address_type = OwnAddressType::PUBLIC_DEVICE_ADDRESS;
    advertising_config.requested_advertiser_address_type = AdvertiserAddressType::PUBLIC;
    std::vector<GapData> gap_data{};
    std::vector<GapData> gap_data{};
    GapData data_item{};
    GapData data_item{};
    data_item.data_type_ = GapDataType::FLAGS;
    data_item.data_type_ = GapDataType::FLAGS;
@@ -468,7 +454,7 @@ TEST_F(LeExtendedAdvertisingManagerTest, startup_teardown) {}
TEST_F(LeAdvertisingManagerTest, create_advertiser_test) {
TEST_F(LeAdvertisingManagerTest, create_advertiser_test) {
  ExtendedAdvertisingConfig advertising_config{};
  ExtendedAdvertisingConfig advertising_config{};
  advertising_config.advertising_type = AdvertisingType::ADV_IND;
  advertising_config.advertising_type = AdvertisingType::ADV_IND;
  advertising_config.own_address_type = OwnAddressType::PUBLIC_DEVICE_ADDRESS;
  advertising_config.requested_advertiser_address_type = AdvertiserAddressType::PUBLIC;
  std::vector<GapData> gap_data{};
  std::vector<GapData> gap_data{};
  GapData data_item{};
  GapData data_item{};
  data_item.data_type_ = GapDataType::FLAGS;
  data_item.data_type_ = GapDataType::FLAGS;
@@ -514,7 +500,7 @@ TEST_F(LeAdvertisingManagerTest, create_advertiser_test) {
TEST_F(LeAndroidHciAdvertisingManagerTest, create_advertiser_test) {
TEST_F(LeAndroidHciAdvertisingManagerTest, create_advertiser_test) {
  ExtendedAdvertisingConfig advertising_config{};
  ExtendedAdvertisingConfig advertising_config{};
  advertising_config.advertising_type = AdvertisingType::ADV_IND;
  advertising_config.advertising_type = AdvertisingType::ADV_IND;
  advertising_config.own_address_type = OwnAddressType::PUBLIC_DEVICE_ADDRESS;
  advertising_config.requested_advertiser_address_type = AdvertiserAddressType::PUBLIC;
  std::vector<GapData> gap_data{};
  std::vector<GapData> gap_data{};
  GapData data_item{};
  GapData data_item{};
  data_item.data_type_ = GapDataType::FLAGS;
  data_item.data_type_ = GapDataType::FLAGS;
@@ -556,7 +542,7 @@ TEST_F(LeAndroidHciAdvertisingManagerTest, create_advertiser_test) {
TEST_F(LeExtendedAdvertisingManagerTest, create_advertiser_test) {
TEST_F(LeExtendedAdvertisingManagerTest, create_advertiser_test) {
  ExtendedAdvertisingConfig advertising_config{};
  ExtendedAdvertisingConfig advertising_config{};
  advertising_config.advertising_type = AdvertisingType::ADV_IND;
  advertising_config.advertising_type = AdvertisingType::ADV_IND;
  advertising_config.own_address_type = OwnAddressType::PUBLIC_DEVICE_ADDRESS;
  advertising_config.requested_advertiser_address_type = AdvertiserAddressType::PUBLIC;
  std::vector<GapData> gap_data{};
  std::vector<GapData> gap_data{};
  GapData data_item{};
  GapData data_item{};
  data_item.data_type_ = GapDataType::FLAGS;
  data_item.data_type_ = GapDataType::FLAGS;
@@ -609,7 +595,7 @@ TEST_F(LeExtendedAdvertisingManagerTest, ignore_on_pause_on_resume_after_unregis
  // Register LeAddressManager vai ExtendedCreateAdvertiser
  // Register LeAddressManager vai ExtendedCreateAdvertiser
  ExtendedAdvertisingConfig advertising_config{};
  ExtendedAdvertisingConfig advertising_config{};
  advertising_config.advertising_type = AdvertisingType::ADV_IND;
  advertising_config.advertising_type = AdvertisingType::ADV_IND;
  advertising_config.own_address_type = OwnAddressType::PUBLIC_DEVICE_ADDRESS;
  advertising_config.requested_advertiser_address_type = AdvertiserAddressType::PUBLIC;
  std::vector<GapData> gap_data{};
  std::vector<GapData> gap_data{};
  GapData data_item{};
  GapData data_item{};
  data_item.data_type_ = GapDataType::FLAGS;
  data_item.data_type_ = GapDataType::FLAGS;
@@ -675,7 +661,7 @@ TEST_F(LeExtendedAdvertisingAPITest, startup_teardown) {}
TEST_F(LeAdvertisingAPITest, set_parameter) {
TEST_F(LeAdvertisingAPITest, set_parameter) {
  ExtendedAdvertisingConfig advertising_config{};
  ExtendedAdvertisingConfig advertising_config{};
  advertising_config.advertising_type = AdvertisingType::ADV_IND;
  advertising_config.advertising_type = AdvertisingType::ADV_IND;
  advertising_config.own_address_type = OwnAddressType::PUBLIC_DEVICE_ADDRESS;
  advertising_config.requested_advertiser_address_type = AdvertiserAddressType::PUBLIC;
  std::vector<GapData> gap_data{};
  std::vector<GapData> gap_data{};
  GapData data_item{};
  GapData data_item{};
  data_item.data_type_ = GapDataType::COMPLETE_LOCAL_NAME;
  data_item.data_type_ = GapDataType::COMPLETE_LOCAL_NAME;
@@ -694,7 +680,7 @@ TEST_F(LeAdvertisingAPITest, set_parameter) {
TEST_F(LeAndroidHciAdvertisingAPITest, set_parameter) {
TEST_F(LeAndroidHciAdvertisingAPITest, set_parameter) {
  ExtendedAdvertisingConfig advertising_config{};
  ExtendedAdvertisingConfig advertising_config{};
  advertising_config.advertising_type = AdvertisingType::ADV_IND;
  advertising_config.advertising_type = AdvertisingType::ADV_IND;
  advertising_config.own_address_type = OwnAddressType::PUBLIC_DEVICE_ADDRESS;
  advertising_config.requested_advertiser_address_type = AdvertiserAddressType::PUBLIC;
  std::vector<GapData> gap_data{};
  std::vector<GapData> gap_data{};
  GapData data_item{};
  GapData data_item{};
  data_item.data_type_ = GapDataType::COMPLETE_LOCAL_NAME;
  data_item.data_type_ = GapDataType::COMPLETE_LOCAL_NAME;
@@ -716,7 +702,7 @@ TEST_F(LeAndroidHciAdvertisingAPITest, set_parameter) {
TEST_F(LeExtendedAdvertisingAPITest, set_parameter) {
TEST_F(LeExtendedAdvertisingAPITest, set_parameter) {
  ExtendedAdvertisingConfig advertising_config{};
  ExtendedAdvertisingConfig advertising_config{};
  advertising_config.advertising_type = AdvertisingType::ADV_IND;
  advertising_config.advertising_type = AdvertisingType::ADV_IND;
  advertising_config.own_address_type = OwnAddressType::PUBLIC_DEVICE_ADDRESS;
  advertising_config.requested_advertiser_address_type = AdvertiserAddressType::PUBLIC;
  std::vector<GapData> gap_data{};
  std::vector<GapData> gap_data{};
  GapData data_item{};
  GapData data_item{};
  data_item.data_type_ = GapDataType::COMPLETE_LOCAL_NAME;
  data_item.data_type_ = GapDataType::COMPLETE_LOCAL_NAME;
@@ -1258,6 +1244,34 @@ TEST_F(LeExtendedAdvertisingAPITest, no_callbacks_on_resume) {
  sync_client_handler();
  sync_client_handler();
}
}


TEST_F(LeExtendedAdvertisingManagerTest, use_rpa) {
  // arrange: use RANDOM address policy
  test_acl_manager_->SetAddressPolicy(LeAddressManager::AddressPolicy::USE_RESOLVABLE_ADDRESS);

  // act: start advertising set with RPA
  le_advertising_manager_->ExtendedCreateAdvertiser(
      0x00,
      AdvertisingConfig{
          .requested_advertiser_address_type = AdvertiserAddressType::RESOLVABLE_RANDOM,
          .channel_map = 1,
      },
      scan_callback,
      set_terminated_callback,
      0,
      0,
      client_handler_);
  auto command = LeAdvertisingCommandView::Create(test_hci_layer_->GetCommand());

  // assert
  ASSERT_TRUE(command.IsValid());
  EXPECT_EQ(command.GetOpCode(), OpCode::LE_SET_EXTENDED_ADVERTISING_PARAMETERS);

  auto set_parameters_command =
      LeSetExtendedAdvertisingParametersView::Create(LeAdvertisingCommandView::Create(command));
  ASSERT_TRUE(set_parameters_command.IsValid());
  EXPECT_EQ(set_parameters_command.GetOwnAddressType(), OwnAddressType::RANDOM_DEVICE_ADDRESS);
}

}  // namespace
}  // namespace
}  // namespace hci
}  // namespace hci
}  // namespace bluetooth
}  // namespace bluetooth
Loading