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

Commit 34f8d1fe authored by Grzegorz Kolodziejczyk's avatar Grzegorz Kolodziejczyk Committed by Gerrit Code Review
Browse files

Merge "le_scanning_manager: Pass handle for PAST to avoid address issues" into main

parents 76173a0d 60d24c05
Loading
Loading
Loading
Loading
+25 −8
Original line number Diff line number Diff line
@@ -1270,14 +1270,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);
@@ -1287,14 +1291,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);
@@ -1811,13 +1819,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,