Loading system/stack/btm/btm_iso_impl.h +26 −1 Original line number Diff line number Diff line Loading @@ -172,6 +172,29 @@ struct iso_impl { base::Unretained(this))); } void on_status_establish_cis( struct iso_manager::cis_establish_params conn_params, uint8_t* stream, uint16_t len) { uint8_t status; LOG_ASSERT(len == 2) << "Invalid packet length: " << len; STREAM_TO_UINT16(status, stream); if (status == HCI_SUCCESS) { /* Wait for connection established event */ return; } for (auto cis : conn_params.conn_pairs) { cis_establish_cmpl_evt evt; evt.status = status; evt.cis_conn_hdl = cis.cis_conn_handle; evt.cig_id = 0xFF; cig_callbacks_->OnCisEvent(kIsoEventCisEstablishCmpl, &evt); } } void establish_cis(struct iso_manager::cis_establish_params conn_params) { for (auto& el : conn_params.conn_pairs) { auto cis = GetCisIfKnown(el.cis_conn_handle); Loading @@ -180,7 +203,9 @@ struct iso_impl { << "Already connected"; } btsnd_hcic_create_cis(conn_params.conn_pairs.size(), conn_params.conn_pairs.data()); conn_params.conn_pairs.data(), base::BindOnce(&iso_impl::on_status_establish_cis, base::Unretained(this), conn_params)); } void disconnect_cis(uint16_t cis_handle, uint8_t reason) { Loading system/stack/hcic/hciblecmds.cc +7 −10 Original line number Diff line number Diff line Loading @@ -865,16 +865,12 @@ void btsnd_hcic_set_cig_params( std::move(cb)); } void btsnd_hcic_create_cis(uint8_t num_cis, const EXT_CIS_CREATE_CFG* cis_cfg) { BT_HDR* p = (BT_HDR*)osi_malloc(HCI_CMD_BUF_SIZE); uint8_t* pp = (uint8_t*)(p + 1); const int param_len = 1 + num_cis * 4; p->len = HCIC_PREAMBLE_SIZE + param_len; p->offset = 0; void btsnd_hcic_create_cis(uint8_t num_cis, const EXT_CIS_CREATE_CFG* cis_cfg, base::OnceCallback<void(uint8_t*, uint16_t)> cb) { const int params_len = 1 + num_cis * 4; uint8_t param[params_len]; uint8_t* pp = param; UINT16_TO_STREAM(pp, HCI_LE_CREATE_CIS); UINT8_TO_STREAM(pp, param_len); UINT8_TO_STREAM(pp, num_cis); for (int i = 0; i < num_cis; i++) { Loading @@ -882,7 +878,8 @@ void btsnd_hcic_create_cis(uint8_t num_cis, const EXT_CIS_CREATE_CFG* cis_cfg) { UINT16_TO_STREAM(pp, cis_cfg[i].acl_conn_handle); } btu_hcif_send_cmd(LOCAL_BR_EDR_CONTROLLER_ID, p); btu_hcif_send_cmd_with_cb(FROM_HERE, HCI_LE_CREATE_CIS, param, params_len, std::move(cb)); } void btsnd_hcic_remove_cig(uint8_t cig_id, Loading system/stack/include/hcimsgs.h +3 −2 Original line number Diff line number Diff line Loading @@ -925,8 +925,9 @@ struct EXT_CIS_CREATE_CFG { uint16_t acl_conn_handle; }; extern void btsnd_hcic_create_cis(uint8_t num_cis, const EXT_CIS_CREATE_CFG* cis_create_cfg); extern void btsnd_hcic_create_cis( uint8_t num_cis, const EXT_CIS_CREATE_CFG* cis_create_cfg, base::OnceCallback<void(uint8_t*, uint16_t)> cb); extern void btsnd_hcic_remove_cig( uint8_t cig_id, base::OnceCallback<void(uint8_t*, uint16_t)> cb); Loading system/stack/test/btm_iso_test.cc +51 −9 Original line number Diff line number Diff line Loading @@ -143,7 +143,8 @@ class IsoManagerTest : public Test { // Default mock CreateCis action ON_CALL(hcic_interface_, CreateCis) .WillByDefault([](uint8_t num_cis, const EXT_CIS_CREATE_CFG* cis_cfg) { .WillByDefault([](uint8_t num_cis, const EXT_CIS_CREATE_CFG* cis_cfg, base::OnceCallback<void(uint8_t*, uint16_t)> cb) { for (const EXT_CIS_CREATE_CFG* cis = cis_cfg; num_cis != 0; num_cis--, cis++) { std::vector<uint8_t> buf(28); Loading Loading @@ -755,10 +756,12 @@ TEST_F(IsoManagerTest, EstablishCisHciCall) { } EXPECT_CALL(hcic_interface_, CreateCis(2, iso_matchers::EqPointedArray( CreateCis(2, iso_matchers::EqPointedArray( params.conn_pairs.data(), params.conn_pairs.size() * sizeof(params.conn_pairs.data()[0])))) sizeof(params.conn_pairs.data()[0])), _)) .Times(1); IsoManager::GetInstance()->EstablishCis(params); } Loading Loading @@ -796,8 +799,8 @@ TEST_F(IsoManagerDeathTest, EstablishCisInvalidResponsePacket) { volatile_test_cig_create_cmpl_evt_.cig_id, kDefaultCigParams); ON_CALL(hcic_interface_, CreateCis) .WillByDefault([this](uint8_t num_cis, const EXT_CIS_CREATE_CFG* cis_cfg) { .WillByDefault([this](uint8_t num_cis, const EXT_CIS_CREATE_CFG* cis_cfg, base::OnceCallback<void(uint8_t*, uint16_t)> cb) { for (auto& handle : volatile_test_cig_create_cmpl_evt_.conn_handles) { std::vector<uint8_t> buf(27); uint8_t* p = buf.data(); Loading Loading @@ -833,14 +836,53 @@ TEST_F(IsoManagerDeathTest, EstablishCisInvalidResponsePacket) { ::testing::KilledBySignal(SIGABRT), "Invalid packet length"); } TEST_F(IsoManagerTest, EstablishCisInvalidCommandStatus) { IsoManager::GetInstance()->CreateCig( volatile_test_cig_create_cmpl_evt_.cig_id, kDefaultCigParams); uint16_t invalid_status = 0x0001; ON_CALL(hcic_interface_, CreateCis) .WillByDefault([invalid_status]( uint8_t num_cis, const EXT_CIS_CREATE_CFG* cis_cfg, base::OnceCallback<void(uint8_t*, uint16_t)> cb) { std::move(cb).Run((uint8_t*)&invalid_status, sizeof(invalid_status)); return 0; }); EXPECT_CALL( *cig_callbacks_, OnCisEvent(bluetooth::hci::iso_manager::kIsoEventCisEstablishCmpl, _)) .Times(kDefaultCigParams.cis_cfgs.size()) .WillRepeatedly([this, invalid_status](uint8_t type, void* data) { bluetooth::hci::iso_manager::cis_establish_cmpl_evt* evt = static_cast<bluetooth::hci::iso_manager::cis_establish_cmpl_evt*>( data); ASSERT_EQ(evt->status, invalid_status); ASSERT_TRUE( std::find(volatile_test_cig_create_cmpl_evt_.conn_handles.begin(), volatile_test_cig_create_cmpl_evt_.conn_handles.end(), evt->cis_conn_hdl) != volatile_test_cig_create_cmpl_evt_.conn_handles.end()); }); // Establish all CISes bluetooth::hci::iso_manager::cis_establish_params params; for (auto& handle : volatile_test_cig_create_cmpl_evt_.conn_handles) { params.conn_pairs.push_back({handle, 1}); } IsoManager::GetInstance()->EstablishCis(params); } TEST_F(IsoManagerTest, EstablishCisInvalidStatus) { IsoManager::GetInstance()->CreateCig( volatile_test_cig_create_cmpl_evt_.cig_id, kDefaultCigParams); uint8_t invalid_status = 0x01; ON_CALL(hcic_interface_, CreateCis) .WillByDefault([this, invalid_status](uint8_t num_cis, const EXT_CIS_CREATE_CFG* cis_cfg) { .WillByDefault([this, invalid_status]( uint8_t num_cis, const EXT_CIS_CREATE_CFG* cis_cfg, base::OnceCallback<void(uint8_t*, uint16_t)> cb) { for (auto& handle : volatile_test_cig_create_cmpl_evt_.conn_handles) { std::vector<uint8_t> buf(28); uint8_t* p = buf.data(); Loading system/stack/test/common/mock_hcic_layer.cc +3 −2 Original line number Diff line number Diff line Loading @@ -46,8 +46,9 @@ void btsnd_hcic_remove_cig(uint8_t cig_id, hcic_interface->RemoveCig(cig_id, std::move(cb)); } void btsnd_hcic_create_cis(uint8_t num_cis, const EXT_CIS_CREATE_CFG* cis_cfg) { hcic_interface->CreateCis(num_cis, cis_cfg); void btsnd_hcic_create_cis(uint8_t num_cis, const EXT_CIS_CREATE_CFG* cis_cfg, base::OnceCallback<void(uint8_t*, uint16_t)> cb) { hcic_interface->CreateCis(num_cis, cis_cfg, std::move(cb)); } void btsnd_hcic_disconnect(uint16_t handle, uint8_t reason) { Loading Loading
system/stack/btm/btm_iso_impl.h +26 −1 Original line number Diff line number Diff line Loading @@ -172,6 +172,29 @@ struct iso_impl { base::Unretained(this))); } void on_status_establish_cis( struct iso_manager::cis_establish_params conn_params, uint8_t* stream, uint16_t len) { uint8_t status; LOG_ASSERT(len == 2) << "Invalid packet length: " << len; STREAM_TO_UINT16(status, stream); if (status == HCI_SUCCESS) { /* Wait for connection established event */ return; } for (auto cis : conn_params.conn_pairs) { cis_establish_cmpl_evt evt; evt.status = status; evt.cis_conn_hdl = cis.cis_conn_handle; evt.cig_id = 0xFF; cig_callbacks_->OnCisEvent(kIsoEventCisEstablishCmpl, &evt); } } void establish_cis(struct iso_manager::cis_establish_params conn_params) { for (auto& el : conn_params.conn_pairs) { auto cis = GetCisIfKnown(el.cis_conn_handle); Loading @@ -180,7 +203,9 @@ struct iso_impl { << "Already connected"; } btsnd_hcic_create_cis(conn_params.conn_pairs.size(), conn_params.conn_pairs.data()); conn_params.conn_pairs.data(), base::BindOnce(&iso_impl::on_status_establish_cis, base::Unretained(this), conn_params)); } void disconnect_cis(uint16_t cis_handle, uint8_t reason) { Loading
system/stack/hcic/hciblecmds.cc +7 −10 Original line number Diff line number Diff line Loading @@ -865,16 +865,12 @@ void btsnd_hcic_set_cig_params( std::move(cb)); } void btsnd_hcic_create_cis(uint8_t num_cis, const EXT_CIS_CREATE_CFG* cis_cfg) { BT_HDR* p = (BT_HDR*)osi_malloc(HCI_CMD_BUF_SIZE); uint8_t* pp = (uint8_t*)(p + 1); const int param_len = 1 + num_cis * 4; p->len = HCIC_PREAMBLE_SIZE + param_len; p->offset = 0; void btsnd_hcic_create_cis(uint8_t num_cis, const EXT_CIS_CREATE_CFG* cis_cfg, base::OnceCallback<void(uint8_t*, uint16_t)> cb) { const int params_len = 1 + num_cis * 4; uint8_t param[params_len]; uint8_t* pp = param; UINT16_TO_STREAM(pp, HCI_LE_CREATE_CIS); UINT8_TO_STREAM(pp, param_len); UINT8_TO_STREAM(pp, num_cis); for (int i = 0; i < num_cis; i++) { Loading @@ -882,7 +878,8 @@ void btsnd_hcic_create_cis(uint8_t num_cis, const EXT_CIS_CREATE_CFG* cis_cfg) { UINT16_TO_STREAM(pp, cis_cfg[i].acl_conn_handle); } btu_hcif_send_cmd(LOCAL_BR_EDR_CONTROLLER_ID, p); btu_hcif_send_cmd_with_cb(FROM_HERE, HCI_LE_CREATE_CIS, param, params_len, std::move(cb)); } void btsnd_hcic_remove_cig(uint8_t cig_id, Loading
system/stack/include/hcimsgs.h +3 −2 Original line number Diff line number Diff line Loading @@ -925,8 +925,9 @@ struct EXT_CIS_CREATE_CFG { uint16_t acl_conn_handle; }; extern void btsnd_hcic_create_cis(uint8_t num_cis, const EXT_CIS_CREATE_CFG* cis_create_cfg); extern void btsnd_hcic_create_cis( uint8_t num_cis, const EXT_CIS_CREATE_CFG* cis_create_cfg, base::OnceCallback<void(uint8_t*, uint16_t)> cb); extern void btsnd_hcic_remove_cig( uint8_t cig_id, base::OnceCallback<void(uint8_t*, uint16_t)> cb); Loading
system/stack/test/btm_iso_test.cc +51 −9 Original line number Diff line number Diff line Loading @@ -143,7 +143,8 @@ class IsoManagerTest : public Test { // Default mock CreateCis action ON_CALL(hcic_interface_, CreateCis) .WillByDefault([](uint8_t num_cis, const EXT_CIS_CREATE_CFG* cis_cfg) { .WillByDefault([](uint8_t num_cis, const EXT_CIS_CREATE_CFG* cis_cfg, base::OnceCallback<void(uint8_t*, uint16_t)> cb) { for (const EXT_CIS_CREATE_CFG* cis = cis_cfg; num_cis != 0; num_cis--, cis++) { std::vector<uint8_t> buf(28); Loading Loading @@ -755,10 +756,12 @@ TEST_F(IsoManagerTest, EstablishCisHciCall) { } EXPECT_CALL(hcic_interface_, CreateCis(2, iso_matchers::EqPointedArray( CreateCis(2, iso_matchers::EqPointedArray( params.conn_pairs.data(), params.conn_pairs.size() * sizeof(params.conn_pairs.data()[0])))) sizeof(params.conn_pairs.data()[0])), _)) .Times(1); IsoManager::GetInstance()->EstablishCis(params); } Loading Loading @@ -796,8 +799,8 @@ TEST_F(IsoManagerDeathTest, EstablishCisInvalidResponsePacket) { volatile_test_cig_create_cmpl_evt_.cig_id, kDefaultCigParams); ON_CALL(hcic_interface_, CreateCis) .WillByDefault([this](uint8_t num_cis, const EXT_CIS_CREATE_CFG* cis_cfg) { .WillByDefault([this](uint8_t num_cis, const EXT_CIS_CREATE_CFG* cis_cfg, base::OnceCallback<void(uint8_t*, uint16_t)> cb) { for (auto& handle : volatile_test_cig_create_cmpl_evt_.conn_handles) { std::vector<uint8_t> buf(27); uint8_t* p = buf.data(); Loading Loading @@ -833,14 +836,53 @@ TEST_F(IsoManagerDeathTest, EstablishCisInvalidResponsePacket) { ::testing::KilledBySignal(SIGABRT), "Invalid packet length"); } TEST_F(IsoManagerTest, EstablishCisInvalidCommandStatus) { IsoManager::GetInstance()->CreateCig( volatile_test_cig_create_cmpl_evt_.cig_id, kDefaultCigParams); uint16_t invalid_status = 0x0001; ON_CALL(hcic_interface_, CreateCis) .WillByDefault([invalid_status]( uint8_t num_cis, const EXT_CIS_CREATE_CFG* cis_cfg, base::OnceCallback<void(uint8_t*, uint16_t)> cb) { std::move(cb).Run((uint8_t*)&invalid_status, sizeof(invalid_status)); return 0; }); EXPECT_CALL( *cig_callbacks_, OnCisEvent(bluetooth::hci::iso_manager::kIsoEventCisEstablishCmpl, _)) .Times(kDefaultCigParams.cis_cfgs.size()) .WillRepeatedly([this, invalid_status](uint8_t type, void* data) { bluetooth::hci::iso_manager::cis_establish_cmpl_evt* evt = static_cast<bluetooth::hci::iso_manager::cis_establish_cmpl_evt*>( data); ASSERT_EQ(evt->status, invalid_status); ASSERT_TRUE( std::find(volatile_test_cig_create_cmpl_evt_.conn_handles.begin(), volatile_test_cig_create_cmpl_evt_.conn_handles.end(), evt->cis_conn_hdl) != volatile_test_cig_create_cmpl_evt_.conn_handles.end()); }); // Establish all CISes bluetooth::hci::iso_manager::cis_establish_params params; for (auto& handle : volatile_test_cig_create_cmpl_evt_.conn_handles) { params.conn_pairs.push_back({handle, 1}); } IsoManager::GetInstance()->EstablishCis(params); } TEST_F(IsoManagerTest, EstablishCisInvalidStatus) { IsoManager::GetInstance()->CreateCig( volatile_test_cig_create_cmpl_evt_.cig_id, kDefaultCigParams); uint8_t invalid_status = 0x01; ON_CALL(hcic_interface_, CreateCis) .WillByDefault([this, invalid_status](uint8_t num_cis, const EXT_CIS_CREATE_CFG* cis_cfg) { .WillByDefault([this, invalid_status]( uint8_t num_cis, const EXT_CIS_CREATE_CFG* cis_cfg, base::OnceCallback<void(uint8_t*, uint16_t)> cb) { for (auto& handle : volatile_test_cig_create_cmpl_evt_.conn_handles) { std::vector<uint8_t> buf(28); uint8_t* p = buf.data(); Loading
system/stack/test/common/mock_hcic_layer.cc +3 −2 Original line number Diff line number Diff line Loading @@ -46,8 +46,9 @@ void btsnd_hcic_remove_cig(uint8_t cig_id, hcic_interface->RemoveCig(cig_id, std::move(cb)); } void btsnd_hcic_create_cis(uint8_t num_cis, const EXT_CIS_CREATE_CFG* cis_cfg) { hcic_interface->CreateCis(num_cis, cis_cfg); void btsnd_hcic_create_cis(uint8_t num_cis, const EXT_CIS_CREATE_CFG* cis_cfg, base::OnceCallback<void(uint8_t*, uint16_t)> cb) { hcic_interface->CreateCis(num_cis, cis_cfg, std::move(cb)); } void btsnd_hcic_disconnect(uint16_t handle, uint8_t reason) { Loading