Loading system/gd/hci/le_scanning_manager.cc +25 −8 Original line number Diff line number Diff line Loading @@ -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); Loading @@ -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); Loading Loading @@ -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( Loading system/gd/hci/le_scanning_manager.h +13 −3 Original line number Diff line number Diff line Loading @@ -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); Loading system/gd/hci/le_scanning_manager_mock.h +12 −2 Original line number Diff line number Diff line Loading @@ -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)); }; Loading system/gd/hci/le_scanning_manager_test.cc +76 −0 Original line number Diff line number Diff line Loading @@ -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 {} Loading @@ -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 { Loading Loading @@ -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)); Loading Loading @@ -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) { Loading system/main/shim/le_scanning_manager.cc +8 −4 Original line number Diff line number Diff line Loading @@ -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, Loading @@ -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, Loading Loading
system/gd/hci/le_scanning_manager.cc +25 −8 Original line number Diff line number Diff line Loading @@ -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); Loading @@ -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); Loading Loading @@ -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( Loading
system/gd/hci/le_scanning_manager.h +13 −3 Original line number Diff line number Diff line Loading @@ -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); Loading
system/gd/hci/le_scanning_manager_mock.h +12 −2 Original line number Diff line number Diff line Loading @@ -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)); }; Loading
system/gd/hci/le_scanning_manager_test.cc +76 −0 Original line number Diff line number Diff line Loading @@ -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 {} Loading @@ -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 { Loading Loading @@ -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)); Loading Loading @@ -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) { Loading
system/main/shim/le_scanning_manager.cc +8 −4 Original line number Diff line number Diff line Loading @@ -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, Loading @@ -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, Loading