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

Commit 582701f4 authored by Jakub Pawlowski's avatar Jakub Pawlowski Committed by android-build-merger
Browse files

Fix initial advertising command order am: 01d2fcb6 am: 041b1721

am: 0811ff47

Change-Id: If3ab8f45a2daad59e23efa8a274343c4c0eed069
parents 15721c0f 0811ff47
Loading
Loading
Loading
Loading
+15 −16
Original line number Diff line number Diff line
@@ -94,11 +94,11 @@ class BleAdvertiserVscHciInterfaceImpl : public BleAdvertiserHciInterface {

  void SetParameters(uint8_t handle, uint16_t properties, uint32_t adv_int_min,
                     uint32_t adv_int_max, uint8_t channel_map,
                     uint8_t own_address_type, uint8_t peer_address_type,
                     BD_ADDR peer_address, uint8_t filter_policy,
                     int8_t tx_power, uint8_t primary_phy,
                     uint8_t secondary_max_skip, uint8_t secondary_phy,
                     uint8_t advertising_sid,
                     uint8_t own_address_type, BD_ADDR own_address,
                     uint8_t peer_address_type, BD_ADDR peer_address,
                     uint8_t filter_policy, int8_t tx_power,
                     uint8_t primary_phy, uint8_t secondary_max_skip,
                     uint8_t secondary_phy, uint8_t advertising_sid,
                     uint8_t scan_request_notify_enable,
                     status_cb command_complete) override {
    VLOG(1) << __func__;
@@ -124,7 +124,6 @@ class BleAdvertiserVscHciInterfaceImpl : public BleAdvertiserHciInterface {
    }

    UINT8_TO_STREAM(pp, own_address_type);
    BD_ADDR own_address = {0, 0, 0, 0, 0, 0};
    BDADDR_TO_STREAM(pp, own_address);
    UINT8_TO_STREAM(pp, peer_address_type);
    BDADDR_TO_STREAM(pp, peer_address);
@@ -273,11 +272,11 @@ class BleAdvertiserLegacyHciInterfaceImpl : public BleAdvertiserHciInterface {

  void SetParameters(uint8_t handle, uint16_t properties, uint32_t adv_int_min,
                     uint32_t adv_int_max, uint8_t channel_map,
                     uint8_t own_address_type, uint8_t peer_address_type,
                     BD_ADDR peer_address, uint8_t filter_policy,
                     int8_t tx_power, uint8_t primary_phy,
                     uint8_t secondary_max_skip, uint8_t secondary_phy,
                     uint8_t advertising_sid,
                     uint8_t own_address_type, BD_ADDR /* own_address */,
                     uint8_t peer_address_type, BD_ADDR peer_address,
                     uint8_t filter_policy, int8_t tx_power,
                     uint8_t primary_phy, uint8_t secondary_max_skip,
                     uint8_t secondary_phy, uint8_t advertising_sid,
                     uint8_t scan_request_notify_enable,
                     status_cb command_complete) override {
    VLOG(1) << __func__;
@@ -393,11 +392,11 @@ class BleAdvertiserHciExtendedImpl : public BleAdvertiserHciInterface {

  void SetParameters(uint8_t handle, uint16_t properties, uint32_t adv_int_min,
                     uint32_t adv_int_max, uint8_t channel_map,
                     uint8_t own_address_type, uint8_t peer_address_type,
                     BD_ADDR peer_address, uint8_t filter_policy,
                     int8_t tx_power, uint8_t primary_phy,
                     uint8_t secondary_max_skip, uint8_t secondary_phy,
                     uint8_t advertising_sid,
                     uint8_t own_address_type, BD_ADDR /* own_address */,
                     uint8_t peer_address_type, BD_ADDR peer_address,
                     uint8_t filter_policy, int8_t tx_power,
                     uint8_t primary_phy, uint8_t secondary_max_skip,
                     uint8_t secondary_phy, uint8_t advertising_sid,
                     uint8_t scan_request_notify_enable,
                     status_cb command_complete) override {
    VLOG(1) << __func__;
+5 −4
Original line number Diff line number Diff line
@@ -51,10 +51,11 @@ class BleAdvertiserHciInterface {
  virtual void SetParameters(uint8_t handle, uint16_t properties,
                             uint32_t adv_int_min, uint32_t adv_int_max,
                             uint8_t channel_map, uint8_t own_address_type,
                             uint8_t peer_address_type, BD_ADDR peer_address,
                             uint8_t filter_policy, int8_t tx_power,
                             uint8_t primary_phy, uint8_t secondary_max_skip,
                             uint8_t secondary_phy, uint8_t advertising_sid,
                             BD_ADDR own_address, uint8_t peer_address_type,
                             BD_ADDR peer_address, uint8_t filter_policy,
                             int8_t tx_power, uint8_t primary_phy,
                             uint8_t secondary_max_skip, uint8_t secondary_phy,
                             uint8_t advertising_sid,
                             uint8_t scan_request_notify_enable,
                             status_cb command_complete) = 0;
  virtual void SetAdvertisingData(uint8_t handle, uint8_t operation,
+72 −50
Original line number Diff line number Diff line
@@ -32,29 +32,30 @@
#include "btm_int_types.h"

using base::Bind;
using multiadv_cb = base::Callback<void(uint8_t /* status */)>;
extern void btm_gen_resolvable_private_addr(
    base::Callback<void(uint8_t[8])> cb);

extern fixed_queue_t* btu_general_alarm_queue;

struct AdvertisingInstance {
  uint8_t inst_id;
  bool in_use;
  uint8_t advertising_event_properties;
  BD_ADDR rpa;
  alarm_t* adv_raddr_timer;
  int8_t tx_power;
  int timeout_s;
  alarm_t* timeout_timer;
  uint8_t own_address_type;
  BD_ADDR own_address;

  AdvertisingInstance(int inst_id)
      : inst_id(inst_id),
        in_use(false),
        advertising_event_properties(0),
        rpa{0},
        tx_power(0),
        timeout_s(0),
        timeout_timer(nullptr) {
        timeout_timer(nullptr),
        own_address_type(0),
        own_address{0} {
    adv_raddr_timer = alarm_new_periodic("btm_ble.adv_raddr_timer");
  }

@@ -126,7 +127,8 @@ class BleAdvertisingManagerImpl
    }
  }

  void OnRpaGenerationComplete(uint8_t inst_id, uint8_t rand[8]) {
  void OnRpaGenerationComplete(uint8_t inst_id, base::Closure cb,
                               uint8_t rand[8]) {
    LOG(INFO) << "inst_id = " << +inst_id;

    AdvertisingInstance* p_inst = &adv_inst[inst_id];
@@ -134,9 +136,9 @@ class BleAdvertisingManagerImpl
    rand[2] &= (~BLE_RESOLVE_ADDR_MASK);
    rand[2] |= BLE_RESOLVE_ADDR_MSB;

    p_inst->rpa[2] = rand[0];
    p_inst->rpa[1] = rand[1];
    p_inst->rpa[0] = rand[2];
    p_inst->own_address[2] = rand[0];
    p_inst->own_address[1] = rand[1];
    p_inst->own_address[0] = rand[2];

    BT_OCTET16 irk;
    BTM_GetDeviceIDRoot(irk);
@@ -146,19 +148,31 @@ class BleAdvertisingManagerImpl
      LOG_ASSERT(false) << "SMP_Encrypt failed";

    /* set hash to be LSB of rpAddress */
    p_inst->rpa[5] = output.param_buf[0];
    p_inst->rpa[4] = output.param_buf[1];
    p_inst->rpa[3] = output.param_buf[2];
    p_inst->own_address[5] = output.param_buf[0];
    p_inst->own_address[4] = output.param_buf[1];
    p_inst->own_address[3] = output.param_buf[2];

    /* set it to controller */
    GetHciInterface()->SetRandomAddress(p_inst->inst_id, p_inst->rpa,
                                        Bind(DoNothing));
    cb.Run();
  }

  void ConfigureRpa(uint8_t inst_id) {
  void GenerateRpa(uint8_t inst_id, base::Closure cb) {
    btm_gen_resolvable_private_addr(
        Bind(&BleAdvertisingManagerImpl::OnRpaGenerationComplete,
             base::Unretained(this), inst_id));
             base::Unretained(this), inst_id, std::move(cb)));
  }

  void ConfigureRpa(AdvertisingInstance* p_inst) {
    GenerateRpa(p_inst->inst_id,
                Bind(
                    [](AdvertisingInstance* p_inst) {
                      /* set it to controller */
                      ((BleAdvertisingManagerImpl*)BleAdvertisingManager::Get())
                          ->GetHciInterface()
                          ->SetRandomAddress(p_inst->inst_id,
                                             p_inst->own_address,
                                             Bind(DoNothing));
                    },
                    p_inst));
  }

  void RegisterAdvertiser(
@@ -171,17 +185,30 @@ class BleAdvertisingManagerImpl
      p_inst->in_use = true;

#if (BLE_PRIVACY_SPT == TRUE)
      // configure the address, and set up periodic timer to update it.
      ConfigureRpa(p_inst->inst_id);

      // set up periodic timer to update address.
      if (BTM_BleLocalPrivacyEnabled()) {
        alarm_set_on_queue(p_inst->adv_raddr_timer, BTM_BLE_PRIVATE_ADDR_INT_MS,
                           btm_ble_adv_raddr_timer_timeout, p_inst,
                           btu_general_alarm_queue);
        p_inst->own_address_type = BLE_ADDR_RANDOM;
        GenerateRpa(p_inst->inst_id,
                    Bind(
                        [](AdvertisingInstance* p_inst,
                           base::Callback<void(uint8_t /* inst_id */,
                                               uint8_t /* status */)>
                               cb) {
                          alarm_set_on_queue(p_inst->adv_raddr_timer,
                                             BTM_BLE_PRIVATE_ADDR_INT_MS,
                                             btm_ble_adv_raddr_timer_timeout,
                                             p_inst, btu_general_alarm_queue);
                          cb.Run(p_inst->inst_id, BTM_BLE_MULTI_ADV_SUCCESS);
                        },
                        p_inst, cb));
      }
#endif
#else
      p_inst->own_address_type = BLE_ADDR_PUBLIC;
      memcpy(p_inst->own_address,
             controller_get_interface()->get_address()->address, BD_ADDR_LEN);

      cb.Run(p_inst->inst_id, BTM_BLE_MULTI_ADV_SUCCESS);
#endif
      return;
    }

@@ -231,6 +258,15 @@ class BleAdvertisingManagerImpl
          return;
        }

        BD_ADDR *rpa = &c->self->adv_inst[c->inst_id].own_address;
        c->self->GetHciInterface()->SetRandomAddress(c->inst_id, *rpa, Bind(
          [](c_type c, uint8_t status) {
            if (status != 0) {
              LOG(ERROR) << "setting random address failed, status: " << +status;
              c->cb.Run(status);
              return;
            }

            c->self->SetData(c->inst_id, false, std::move(c->advertise_data), Bind(
              [](c_type c, uint8_t status) {
                if (status != 0) {
@@ -252,6 +288,7 @@ class BleAdvertisingManagerImpl
                }, base::Passed(&c)));
            }, base::Passed(&c)));
        }, base::Passed(&c)));
    }, base::Passed(&c)));
    // clang-format on
  }

@@ -327,22 +364,6 @@ class BleAdvertisingManagerImpl
    // TODO: disable only if was enabled, currently no use scenario needs that,
    // we always set parameters before enabling
    // GetHciInterface()->Enable(false, inst_id, Bind(DoNothing));

    uint8_t own_address_type = BLE_ADDR_PUBLIC;
    BD_ADDR own_address;

#if (BLE_PRIVACY_SPT == TRUE)
    if (BTM_BleLocalPrivacyEnabled()) {
      own_address_type = BLE_ADDR_RANDOM;
      memcpy(own_address, p_inst->rpa, BD_ADDR_LEN);
    } else {
#else
    {
#endif
      memcpy(own_address, controller_get_interface()->get_address()->address,
             BD_ADDR_LEN);
    }

    p_inst->advertising_event_properties =
        p_params->advertising_event_properties;
    p_inst->tx_power = p_params->tx_power;
@@ -351,8 +372,9 @@ class BleAdvertisingManagerImpl
    GetHciInterface()->SetParameters(
        p_inst->inst_id, p_params->advertising_event_properties,
        p_params->adv_int_min, p_params->adv_int_max, p_params->channel_map,
        own_address_type, 0x00, peer_address, p_params->adv_filter_policy,
        p_inst->tx_power, p_params->primary_advertising_phy, 0x01, 0x01,
        p_inst->own_address_type, p_inst->own_address, 0x00, peer_address,
        p_params->adv_filter_policy, p_inst->tx_power,
        p_params->primary_advertising_phy, 0x01, 0x01,
        p_params->secondary_advertising_phy,
        p_params->scan_request_notification_enable, cb);

@@ -437,7 +459,7 @@ class BleAdvertisingManagerImpl
#if (BLE_PRIVACY_SPT == TRUE)
    if (BTM_BleLocalPrivacyEnabled() &&
        advertising_handle <= BTM_BLE_MULTI_ADV_MAX) {
      btm_acl_update_conn_addr(connection_handle, p_inst->rpa);
      btm_acl_update_conn_addr(connection_handle, p_inst->own_address);
    }
#endif

@@ -486,7 +508,7 @@ void BleAdvertisingManager::CleanUp() {

void btm_ble_adv_raddr_timer_timeout(void* data) {
  ((BleAdvertisingManagerImpl*)BleAdvertisingManager::Get())
      ->ConfigureRpa(((AdvertisingInstance*)data)->inst_id);
      ->ConfigureRpa((AdvertisingInstance*)data);
}

/**
+23 −22
Original line number Diff line number Diff line
@@ -80,24 +80,25 @@ class AdvertiserHciMock : public BleAdvertiserHciInterface {

  MOCK_METHOD9(SetParameters1,
               void(uint8_t, uint16_t, uint32_t, uint32_t, uint8_t, uint8_t,
                    uint8_t, BD_ADDR, uint8_t));
  MOCK_METHOD7(SetParameters2, void(int8_t, uint8_t, uint8_t, uint8_t, uint8_t,
                                    uint8_t, status_cb));
                    BD_ADDR, uint8_t, BD_ADDR));
  MOCK_METHOD8(SetParameters2, void(uint8_t, int8_t, uint8_t, uint8_t, uint8_t,
                                    uint8_t, uint8_t, status_cb));

  void SetParameters(uint8_t handle, uint16_t properties, uint32_t adv_int_min,
                     uint32_t adv_int_max, uint8_t channel_map,
                     uint8_t own_address_type, uint8_t peer_address_type,
                     BD_ADDR peer_address, uint8_t filter_policy,
                     int8_t tx_power, uint8_t primary_phy,
                     uint8_t secondary_max_skip, uint8_t secondary_phy,
                     uint8_t advertising_sid,
                     uint8_t own_address_type, BD_ADDR own_address,
                     uint8_t peer_address_type, BD_ADDR peer_address,
                     uint8_t filter_policy, int8_t tx_power,
                     uint8_t primary_phy, uint8_t secondary_max_skip,
                     uint8_t secondary_phy, uint8_t advertising_sid,
                     uint8_t scan_request_notify_enable,
                     status_cb cmd_complete) override {
    SetParameters1(handle, properties, adv_int_min, adv_int_max, channel_map,
                   own_address_type, peer_address_type, peer_address,
                   filter_policy);
    SetParameters2(tx_power, primary_phy, secondary_max_skip, secondary_phy,
                   advertising_sid, scan_request_notify_enable, cmd_complete);
                   own_address_type, own_address, peer_address_type,
                   peer_address);
    SetParameters2(filter_policy, tx_power, primary_phy, secondary_max_skip,
                   secondary_phy, advertising_sid, scan_request_notify_enable,
                   cmd_complete);
  };

 private:
@@ -185,9 +186,9 @@ TEST_F(BleAdvertisingManagerTest, test_android_flow) {
  tBTM_BLE_ADV_PARAMS params;
  EXPECT_CALL(*hci_mock, SetParameters1(advertiser_id, _, _, _, _, _, _, _, _))
      .Times(1);
  EXPECT_CALL(*hci_mock, SetParameters2(_, _, _, _, _, _, _))
  EXPECT_CALL(*hci_mock, SetParameters2(_, _, _, _, _, _, _, _))
      .Times(1)
      .WillOnce(SaveArg<6>(&set_params_cb));
      .WillOnce(SaveArg<7>(&set_params_cb));
  BleAdvertisingManager::Get()->SetParameters(
      advertiser_id, &params,
      base::Bind(&BleAdvertisingManagerTest::SetParametersCb,
@@ -250,9 +251,9 @@ TEST_F(BleAdvertisingManagerTest, test_adv_data_filling) {
  params.tx_power = -15;
  EXPECT_CALL(*hci_mock, SetParameters1(advertiser_id, _, _, _, _, _, _, _, _))
      .Times(1);
  EXPECT_CALL(*hci_mock, SetParameters2(params.tx_power, _, _, _, _, _, _))
  EXPECT_CALL(*hci_mock, SetParameters2(_, params.tx_power, _, _, _, _, _, _))
      .Times(1)
      .WillOnce(SaveArg<6>(&set_params_cb));
      .WillOnce(SaveArg<7>(&set_params_cb));
  BleAdvertisingManager::Get()->SetParameters(
      advertiser_id, &params,
      base::Bind(&BleAdvertisingManagerTest::SetParametersCb,
@@ -301,9 +302,9 @@ TEST_F(BleAdvertisingManagerTest, test_adv_data_not_filling) {
  EXPECT_CALL(*hci_mock, SetParameters1(advertiser_id, _, _, _, _, _, _, _, _))
      .Times(1);
  EXPECT_CALL(*hci_mock,
              SetParameters2((uint8_t)params.tx_power, _, _, _, _, _, _))
              SetParameters2(_, (uint8_t)params.tx_power, _, _, _, _, _, _))
      .Times(1)
      .WillOnce(SaveArg<6>(&set_params_cb));
      .WillOnce(SaveArg<7>(&set_params_cb));
  BleAdvertisingManager::Get()->SetParameters(
      advertiser_id, &params,
      base::Bind(&BleAdvertisingManagerTest::SetParametersCb,
@@ -379,9 +380,9 @@ TEST_F(BleAdvertisingManagerTest, test_start_advertising) {
  status_cb enable_cb;
  EXPECT_CALL(*hci_mock, SetParameters1(advertiser_id, _, _, _, _, _, _, _, _))
      .Times(1);
  EXPECT_CALL(*hci_mock, SetParameters2(_, _, _, _, _, _, _))
  EXPECT_CALL(*hci_mock, SetParameters2(_, _, _, _, _, _, _, _))
      .Times(1)
      .WillOnce(SaveArg<6>(&set_params_cb));
      .WillOnce(SaveArg<7>(&set_params_cb));
  EXPECT_CALL(*hci_mock, SetAdvertisingData(advertiser_id, _, _, _, _, _))
      .Times(1)
      .WillOnce(SaveArg<5>(&set_data_cb));
@@ -431,9 +432,9 @@ TEST_F(BleAdvertisingManagerTest, test_start_advertising_set_params_failed) {
  status_cb set_params_cb;
  EXPECT_CALL(*hci_mock, SetParameters1(advertiser_id, _, _, _, _, _, _, _, _))
      .Times(1);
  EXPECT_CALL(*hci_mock, SetParameters2(_, _, _, _, _, _, _))
  EXPECT_CALL(*hci_mock, SetParameters2(_, _, _, _, _, _, _, _))
      .Times(1)
      .WillOnce(SaveArg<6>(&set_params_cb));
      .WillOnce(SaveArg<7>(&set_params_cb));

  EXPECT_CALL(*hci_mock, SetAdvertisingData(advertiser_id, _, _, _, _, _))
      .Times(Exactly(0));