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

Commit 60d24c05 authored by Grzegorz Kołodziejczyk's avatar Grzegorz Kołodziejczyk
Browse files

le_scanning_manager: Pass handle for PAST to avoid address issues

Requesting transfer sync or transfer set info a pseudo address may be
ussed for privacy using devices. ACL connections list keeps for the
first connection a pseudo address but after reconnection it uses a
identity addres. Upper layers like Broadcast Assistant etc. always uses
pseudo address. To avoid logic extension in stack, passing acl handle
to scan manager avoids missmatch with addres type vs handle.

Tag: #feature
Bug: 301555718
Test: atest LeScanningManagerAndroidHciTest
Change-Id: If1cc76923d78a118423bd4ad23d6833f5b5e261f
parent 373e5fbd
Loading
Loading
Loading
Loading
+25 −8
Original line number Diff line number Diff line
@@ -1252,14 +1252,18 @@ struct LeScanningManager::impl : public LeAddressManagerCallback {
    periodic_sync_manager_.CancelCreateSync(sid, address);
  }

  void transfer_sync(const Address& address, uint16_t service_data, uint16_t sync_handle, int pa_source) {
  void transfer_sync(
      const Address& address,
      uint16_t connection_handle,
      uint16_t service_data,
      uint16_t sync_handle,
      int pa_source) {
    if (!is_periodic_advertising_sync_transfer_sender_supported_) {
      LOG_WARN("PAST sender not supported on this device");
      int status = static_cast<int>(ErrorCode::UNSUPPORTED_FEATURE_OR_PARAMETER_VALUE);
      scanning_callbacks_->OnPeriodicSyncTransferred(pa_source, status, address);
      return;
    }
    uint16_t connection_handle = acl_manager_->HACK_GetLeHandle(address);
    if (connection_handle == 0xFFFF) {
      LOG_ERROR("[PAST]: Invalid connection handle or no LE ACL link");
      int status = static_cast<int>(ErrorCode::UNKNOWN_CONNECTION);
@@ -1269,14 +1273,18 @@ struct LeScanningManager::impl : public LeAddressManagerCallback {
    periodic_sync_manager_.TransferSync(address, service_data, sync_handle, pa_source, connection_handle);
  }

  void transfer_set_info(const Address& address, uint16_t service_data, uint8_t adv_handle, int pa_source) {
  void transfer_set_info(
      const Address& address,
      uint16_t connection_handle,
      uint16_t service_data,
      uint8_t adv_handle,
      int pa_source) {
    if (!is_periodic_advertising_sync_transfer_sender_supported_) {
      LOG_WARN("PAST sender not supported on this device");
      int status = static_cast<int>(ErrorCode::UNSUPPORTED_FEATURE_OR_PARAMETER_VALUE);
      scanning_callbacks_->OnPeriodicSyncTransferred(pa_source, status, address);
      return;
    }
    uint16_t connection_handle = acl_manager_->HACK_GetLeHandle(address);
    if (connection_handle == 0xFFFF) {
      LOG_ERROR("[PAST]:Invalid connection handle or no LE ACL link");
      int status = static_cast<int>(ErrorCode::UNKNOWN_CONNECTION);
@@ -1792,13 +1800,22 @@ void LeScanningManager::CancelCreateSync(uint8_t sid, const Address& address) {
}

void LeScanningManager::TransferSync(
    const Address& address, uint16_t service_data, uint16_t sync_handle, int pa_source) {
  CallOn(pimpl_.get(), &impl::transfer_sync, address, service_data, sync_handle, pa_source);
    const Address& address,
    uint16_t handle,
    uint16_t service_data,
    uint16_t sync_handle,
    int pa_source) {
  CallOn(pimpl_.get(), &impl::transfer_sync, address, handle, service_data, sync_handle, pa_source);
}

void LeScanningManager::TransferSetInfo(
    const Address& address, uint16_t service_data, uint8_t adv_handle, int pa_source) {
  CallOn(pimpl_.get(), &impl::transfer_set_info, address, service_data, adv_handle, pa_source);
    const Address& address,
    uint16_t handle,
    uint16_t service_data,
    uint8_t adv_handle,
    int pa_source) {
  CallOn(
      pimpl_.get(), &impl::transfer_set_info, address, handle, service_data, adv_handle, pa_source);
}

void LeScanningManager::SyncTxParameters(
+13 −3
Original line number Diff line number Diff line
@@ -84,9 +84,19 @@ class LeScanningManager : public bluetooth::Module {

  virtual void CancelCreateSync(uint8_t sid, const Address& address);

  virtual void TransferSync(const Address& address, uint16_t service_data, uint16_t sync_handle, int pa_source);

  virtual void TransferSetInfo(const Address& address, uint16_t service_data, uint8_t adv_handle, int pa_source);
  virtual void TransferSync(
      const Address& address,
      uint16_t handle,
      uint16_t service_data,
      uint16_t sync_handle,
      int pa_source);

  virtual void TransferSetInfo(
      const Address& address,
      uint16_t handle,
      uint16_t service_data,
      uint8_t adv_handle,
      int pa_source);

  virtual void SyncTxParameters(const Address& addr, uint8_t mode, uint16_t skip, uint16_t timeout, int reg_id);

+12 −2
Original line number Diff line number Diff line
@@ -65,8 +65,18 @@ class MockLeScanningManager : public LeScanningManager {
  MOCK_METHOD(void, StartSync, (uint8_t, const AddressWithType&, uint16_t, uint16_t, int));
  MOCK_METHOD(void, StopSync, (uint16_t));
  MOCK_METHOD(void, CancelCreateSync, (uint8_t, const Address&));
  MOCK_METHOD(void, TransferSync, (const Address&, uint16_t, uint16_t sync_handle, int pa_source));
  MOCK_METHOD(void, TransferSetInfo, (const Address&, uint16_t, uint8_t, int));
  MOCK_METHOD(
      void,
      TransferSync,
      (const Address&,
       uint16_t connection_handle,
       uint16_t service_data,
       uint16_t sync_handle,
       int pa_source));
  MOCK_METHOD(
      void,
      TransferSetInfo,
      (const Address&, uint16_t connection_handle, uint16_t service_data, uint8_t, int));
  MOCK_METHOD(void, SyncTxParameters, (const Address&, uint8_t, uint16_t, uint16_t, int));
};

+76 −0
Original line number Diff line number Diff line
@@ -135,6 +135,14 @@ class TestController : public Controller {
    support_ble_extended_advertising_ = support;
  }

  bool SupportsBlePeriodicAdvertisingSyncTransferSender() const override {
    return support_ble_periodic_advertising_sync_transfer_;
  }

  void SetBlePeriodicAdvertisingSyncTransferSenderSupport(bool support) {
    support_ble_periodic_advertising_sync_transfer_ = support;
  }

 protected:
  void Start() override {}
  void Stop() override {}
@@ -143,6 +151,7 @@ class TestController : public Controller {
 private:
  std::set<OpCode> supported_opcodes_{};
  bool support_ble_extended_advertising_ = false;
  bool support_ble_periodic_advertising_sync_transfer_ = false;
};

class TestLeAddressManager : public LeAddressManager {
@@ -319,6 +328,7 @@ class LeScanningManagerAndroidHciTest : public LeScanningManagerTest {
    test_controller_->AddSupported(OpCode::LE_EXTENDED_SCAN_PARAMS);
    test_controller_->AddSupported(OpCode::LE_ADV_FILTER);
    test_controller_->AddSupported(OpCode::LE_BATCH_SCAN);
    test_controller_->SetBlePeriodicAdvertisingSyncTransferSenderSupport(true);
    start_le_scanning_manager();
    ASSERT_TRUE(fake_registry_.IsStarted(&HciLayer::Factory));

@@ -579,6 +589,72 @@ TEST_F(LeScanningManagerAndroidHciTest, read_batch_scan_result) {
      uint8_t{1}, ErrorCode::SUCCESS, BatchScanDataRead::FULL_MODE_DATA, 0, {}));
}

TEST_F(LeScanningManagerAndroidHciTest, start_sync_test) {
  Address address;
  const uint16_t handle = 0x0001;
  const uint16_t service_data = 0x0000;
  const uint16_t sync_handle = 0x0002;
  const int pa_source = 3;

  Address::FromString("12:34:56:78:9a:bc", address);

  le_scanning_manager->TransferSync(address, handle, service_data, sync_handle, pa_source);
  sync_client_handler();

  ASSERT_EQ(
      OpCode::LE_PERIODIC_ADVERTISING_SYNC_TRANSFER, test_hci_layer_->GetCommand().GetOpCode());
}

TEST_F(LeScanningManagerAndroidHciTest, start_sync_invalid_handle_test) {
  Address address;
  const uint16_t handle = 0xFFFF;
  const uint16_t service_data = 0x0000;
  const uint16_t sync_handle = 0x0002;
  const int pa_source = 3;

  Address::FromString("12:34:56:78:9a:bc", address);

  EXPECT_CALL(
      mock_callbacks_,
      OnPeriodicSyncTransferred(
          pa_source, static_cast<int>(ErrorCode::UNKNOWN_CONNECTION), address));
  le_scanning_manager->TransferSync(address, handle, service_data, sync_handle, pa_source);
  sync_client_handler();
}

TEST_F(LeScanningManagerAndroidHciTest, set_info_test) {
  Address address;
  const uint16_t handle = 0x0001;
  const uint16_t service_data = 0x0000;
  const uint16_t sync_handle = 0x0002;
  const int pa_source = 3;

  Address::FromString("12:34:56:78:9a:bc", address);

  le_scanning_manager->TransferSetInfo(address, handle, service_data, sync_handle, pa_source);
  sync_client_handler();

  ASSERT_EQ(
      OpCode::LE_PERIODIC_ADVERTISING_SET_INFO_TRANSFER, test_hci_layer_->GetCommand().GetOpCode());
}

TEST_F(LeScanningManagerAndroidHciTest, set_info_invalid_handle_test) {
  Address address;
  const uint16_t handle = 0xFFFF;
  const uint16_t service_data = 0x0000;
  const uint16_t sync_handle = 0x0002;
  const int pa_source = 3;

  Address::FromString("12:34:56:78:9a:bc", address);

  EXPECT_CALL(
      mock_callbacks_,
      OnPeriodicSyncTransferred(
          pa_source, static_cast<int>(ErrorCode::UNKNOWN_CONNECTION), address));
  le_scanning_manager->TransferSetInfo(address, handle, service_data, sync_handle, pa_source);
  sync_client_handler();
}

TEST_F(LeScanningManagerExtendedTest, startup_teardown) {}

TEST_F(LeScanningManagerExtendedTest, start_scan_test) {
+8 −4
Original line number Diff line number Diff line
@@ -453,8 +453,10 @@ void BleScannerInterfaceImpl::TransferSync(RawAddress address,
        pa_source, BTM_MODE_UNSUPPORTED, address);
    return;
  }
  bluetooth::shim::GetScanning()->TransferSync(
      ToGdAddress(address), service_data, sync_handle, pa_source);

  bluetooth::shim::GetScanning()->TransferSync(ToGdAddress(address),
                                               p_acl->Handle(), service_data,
                                               sync_handle, pa_source);
}

void BleScannerInterfaceImpl::TransferSetInfo(RawAddress address,
@@ -470,8 +472,10 @@ void BleScannerInterfaceImpl::TransferSetInfo(RawAddress address,
        pa_source, BTM_MODE_UNSUPPORTED, address);
    return;
  }
  bluetooth::shim::GetScanning()->TransferSetInfo(
      ToGdAddress(address), service_data, adv_handle, pa_source);

  bluetooth::shim::GetScanning()->TransferSetInfo(ToGdAddress(address),
                                                  p_acl->Handle(), service_data,
                                                  adv_handle, pa_source);
}

void BleScannerInterfaceImpl::SyncTxParameters(RawAddress addr, uint8_t mode,