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

Commit 5d810081 authored by Rahul Arya's avatar Rahul Arya Committed by William Escande
Browse files

Add support for NRPAs in advertisement sets

Bug: 268112598
Test: unit
(cherry picked from https://android-review.googlesource.com/q/commit:5c715054913b13d7374def3d4fd577f63c9f0cc7)
Merged-In: I51550c1b6c76412975e8cdcac9eca1ba3ad53a67
Change-Id: I51550c1b6c76412975e8cdcac9eca1ba3ad53a67
Bug:279962122
parent 13d1b7ca
Loading
Loading
Loading
Loading
+2 −1
Original line number Diff line number Diff line
@@ -259,7 +259,8 @@ public final class AdvertiseSettings implements Parcelable {
        @SystemApi
        public @NonNull Builder setOwnAddressType(@AddressTypeStatus int ownAddressType) {
            if (ownAddressType < AdvertisingSetParameters.ADDRESS_TYPE_DEFAULT
                    ||  ownAddressType > AdvertisingSetParameters.ADDRESS_TYPE_RANDOM) {
                    || ownAddressType
                            > AdvertisingSetParameters.ADDRESS_TYPE_RANDOM_NON_RESOLVABLE) {
                throw new IllegalArgumentException("unknown address type " + ownAddressType);
            }
            mOwnAddressType = ownAddressType;
+11 −2
Original line number Diff line number Diff line
@@ -107,7 +107,8 @@ public final class AdvertisingSetParameters implements Parcelable {
    @IntDef(prefix = "ADDRESS_TYPE_", value = {
        ADDRESS_TYPE_DEFAULT,
        ADDRESS_TYPE_PUBLIC,
        ADDRESS_TYPE_RANDOM
        ADDRESS_TYPE_RANDOM,
        ADDRESS_TYPE_RANDOM_NON_RESOLVABLE,
    })
    @Retention(RetentionPolicy.SOURCE)
    public @interface AddressTypeStatus {}
@@ -136,6 +137,13 @@ public final class AdvertisingSetParameters implements Parcelable {
    @SystemApi
    public static final int ADDRESS_TYPE_RANDOM = 1;

    /**
     * Generate and advertise on non-resolvable private address.
     *
     * @hide
     */
    public static final int ADDRESS_TYPE_RANDOM_NON_RESOLVABLE = 2;

    private final boolean mIsLegacy;
    private final boolean mIsAnonymous;
    private final boolean mIncludeTxPower;
@@ -466,7 +474,8 @@ public final class AdvertisingSetParameters implements Parcelable {
        @SystemApi
        public @NonNull Builder setOwnAddressType(@AddressTypeStatus int ownAddressType) {
            if (ownAddressType < AdvertisingSetParameters.ADDRESS_TYPE_DEFAULT
                    ||  ownAddressType > AdvertisingSetParameters.ADDRESS_TYPE_RANDOM) {
                    || ownAddressType
                            > AdvertisingSetParameters.ADDRESS_TYPE_RANDOM_NON_RESOLVABLE) {
                throw new IllegalArgumentException("unknown address type " + ownAddressType);
            }
            mOwnAddressType = ownAddressType;
+8 −3
Original line number Diff line number Diff line
@@ -220,14 +220,19 @@ AddressWithType LeAddressManager::GetCurrentAddress() {
}

AddressWithType LeAddressManager::GetAnotherAddress() {
  ASSERT(
      address_policy_ == AddressPolicy::USE_NON_RESOLVABLE_ADDRESS ||
      address_policy_ == AddressPolicy::USE_RESOLVABLE_ADDRESS);
  ASSERT(RotatingAddress());
  hci::Address address = generate_rpa();
  auto random_address = AddressWithType(address, AddressType::RANDOM_DEVICE_ADDRESS);
  return random_address;
}

AddressWithType LeAddressManager::NewNonResolvableAddress() {
  ASSERT(RotatingAddress());
  hci::Address address = generate_nrpa();
  auto random_address = AddressWithType(address, AddressType::RANDOM_DEVICE_ADDRESS);
  return random_address;
}

void LeAddressManager::pause_registered_clients() {
  for (auto& client : registered_clients_) {
    switch (client.second) {
+5 −3
Original line number Diff line number Diff line
@@ -78,9 +78,11 @@ class LeAddressManager {
  virtual AddressPolicy Register(LeAddressManagerCallback* callback);
  virtual void Unregister(LeAddressManagerCallback* callback);
  virtual bool UnregisterSync(
      LeAddressManagerCallback* callback, std::chrono::milliseconds timeout = kUnregisterSyncTimeoutInMs);
      LeAddressManagerCallback* callback,
      std::chrono::milliseconds timeout = kUnregisterSyncTimeoutInMs);
  AddressWithType GetCurrentAddress();        // What was set in SetRandomAddress()
  AddressWithType GetAnotherAddress();        // A new random address without rotating.
  AddressWithType NewNonResolvableAddress();  // A new non-resolvable address

  uint8_t GetFilterAcceptListSize();
  uint8_t GetResolvingListSize();
+26 −12
Original line number Diff line number Diff line
@@ -54,6 +54,7 @@ enum class AdvertisingFlag : uint8_t {
struct Advertiser {
  os::Handler* handler;
  AddressWithType current_address;
  AdvertiserAddressType requested_address_type;
  base::OnceCallback<void(uint8_t /* status */)> status_callback;
  base::OnceCallback<void(uint8_t /* status */)> timeout_callback;
  common::Callback<void(Address, AddressType)> scan_callback;
@@ -301,6 +302,24 @@ struct LeAdvertisingManager::impl : public bluetooth::hci::LeAddressManagerCallb
    }
  }

  /// Generates a random address for the advertiser, if supported by the address manager
  ///
  /// Note: Ignores whether the requested_address_type is PUBLIC/RANDOM (to match existing behavior
  /// in non-extended advertising where we don't check this) so if this matters (e.g. for extended
  /// advertising), make sure to check it separately
  AddressWithType request_random_advertiser_address(AdvertiserId id) {
    if (le_address_manager_->RotatingAddress()) {
      if (advertising_sets_[id].requested_address_type ==
          AdvertiserAddressType::NONRESOLVABLE_RANDOM) {
        return le_address_manager_->NewNonResolvableAddress();
      } else {
        return le_address_manager_->GetAnotherAddress();
      }
    } else {
      return le_address_manager_->GetCurrentAddress();
    }
  }

  void create_advertiser(
      int reg_id,
      AdvertiserId id,
@@ -321,6 +340,7 @@ struct LeAdvertisingManager::impl : public bluetooth::hci::LeAddressManagerCallb
    advertising_sets_[id].scan_callback = scan_callback;
    advertising_sets_[id].set_terminated_callback = set_terminated_callback;
    advertising_sets_[id].handler = handler;
    advertising_sets_[id].requested_address_type = config.requested_advertiser_address_type;
    advertising_sets_[id].current_address = AddressWithType{};

    if (!address_manager_registered) {
@@ -330,11 +350,7 @@ struct LeAdvertisingManager::impl : public bluetooth::hci::LeAddressManagerCallb

    switch (advertising_api_type_) {
      case (AdvertisingApiType::LEGACY): {
        if (le_address_manager_->RotatingAddress()) {
          advertising_sets_[id].current_address = le_address_manager_->GetAnotherAddress();
        } else {
          advertising_sets_[id].current_address = le_address_manager_->GetCurrentAddress();
        }
        advertising_sets_[id].current_address = request_random_advertiser_address(id);
        set_parameters(id, config);
        if (config.advertising_type == AdvertisingType::ADV_IND ||
            config.advertising_type == AdvertisingType::ADV_NONCONN_IND) {
@@ -348,11 +364,7 @@ struct LeAdvertisingManager::impl : public bluetooth::hci::LeAddressManagerCallb
        }
      } break;
      case (AdvertisingApiType::ANDROID_HCI): {
        if (le_address_manager_->RotatingAddress()) {
          advertising_sets_[id].current_address = le_address_manager_->GetAnotherAddress();
        } else {
          advertising_sets_[id].current_address = le_address_manager_->GetCurrentAddress();
        }
        advertising_sets_[id].current_address = request_random_advertiser_address(id);
        set_parameters(id, config);
        if (config.advertising_type == AdvertisingType::ADV_IND ||
            config.advertising_type == AdvertisingType::ADV_NONCONN_IND) {
@@ -425,11 +437,13 @@ struct LeAdvertisingManager::impl : public bluetooth::hci::LeAddressManagerCallb
    advertising_sets_[id].duration = duration;
    advertising_sets_[id].max_extended_advertising_events = max_ext_adv_events;
    advertising_sets_[id].handler = handler;
    advertising_sets_[id].requested_address_type = config.requested_advertiser_address_type;

    switch (config.requested_advertiser_address_type) {
      case AdvertiserAddressType::RESOLVABLE_RANDOM:
      case AdvertiserAddressType::NONRESOLVABLE_RANDOM:
        if (le_address_manager_->RotatingAddress()) {
          advertising_sets_[id].current_address = le_address_manager_->GetAnotherAddress();
          advertising_sets_[id].current_address = request_random_advertiser_address(id);
          set_parameters(id, config);
          le_advertising_interface_->EnqueueCommand(
              hci::LeSetAdvertisingSetRandomAddressBuilder::Create(
@@ -528,7 +542,7 @@ struct LeAdvertisingManager::impl : public bluetooth::hci::LeAddressManagerCallb

  void rotate_advertiser_address(AdvertiserId advertiser_id) {
    if (advertising_api_type_ == AdvertisingApiType::EXTENDED) {
      AddressWithType address_with_type = le_address_manager_->GetAnotherAddress();
      AddressWithType address_with_type = request_random_advertiser_address(advertiser_id);
      le_advertising_interface_->EnqueueCommand(
          hci::LeSetAdvertisingSetRandomAddressBuilder::Create(advertiser_id, address_with_type.GetAddress()),
          module_handler_->BindOnceOn(
Loading