Loading system/bta/av/bta_av_aact.cc +5 −5 Original line number Diff line number Diff line Loading @@ -3058,14 +3058,14 @@ void bta_av_open_at_inc(tBTA_AV_SCB* p_scb, tBTA_AV_DATA* p_data) { } void offload_vendor_callback(tBTM_VSC_CMPL* param) { uint8_t status = 0; tBTA_AV value{0}; uint8_t sub_opcode = 0; if (param->param_len) { APPL_TRACE_DEBUG("%s: param_len = %d status = %d", __func__, param->param_len, param->p_param_buf[0]); status = param->p_param_buf[0]; value.status = param->p_param_buf[0]; } if (status == 0) { if (value.status == 0) { sub_opcode = param->p_param_buf[1]; APPL_TRACE_DEBUG("%s: subopcode = %d", __func__, sub_opcode); switch (sub_opcode) { Loading @@ -3073,7 +3073,7 @@ void offload_vendor_callback(tBTM_VSC_CMPL* param) { APPL_TRACE_DEBUG("%s: VS_HCI_STOP_A2DP_MEDIA successful", __func__); break; case VS_HCI_A2DP_OFFLOAD_START: (*bta_av_cb.p_cback)(BTA_AV_OFFLOAD_START_RSP_EVT, (tBTA_AV*)&status); (*bta_av_cb.p_cback)(BTA_AV_OFFLOAD_START_RSP_EVT, &value); break; default: break; Loading @@ -3082,7 +3082,7 @@ void offload_vendor_callback(tBTM_VSC_CMPL* param) { APPL_TRACE_DEBUG("%s: Offload failed for subopcode= %d", __func__, sub_opcode); if (param->opcode != VS_HCI_A2DP_OFFLOAD_STOP) (*bta_av_cb.p_cback)(BTA_AV_OFFLOAD_START_RSP_EVT, (tBTA_AV*)&status); (*bta_av_cb.p_cback)(BTA_AV_OFFLOAD_START_RSP_EVT, &value); } } Loading system/gd/hci/acl_manager_mock.h +1 −0 Original line number Diff line number Diff line Loading @@ -37,6 +37,7 @@ class MockAclConnection : public AclConnection { class MockAclManager : public AclManager { public: MOCK_METHOD(void, RegisterCallbacks, (ConnectionCallbacks * callbacks, os::Handler* handler), (override)); MOCK_METHOD(void, RegisterLeCallbacks, (LeConnectionCallbacks * callbacks, os::Handler* handler), (override)); MOCK_METHOD(void, CreateConnection, (Address address), (override)); MOCK_METHOD(void, CreateLeConnection, (Address address, AddressType address_type), (override)); MOCK_METHOD(void, CancelConnect, (Address address), (override)); Loading system/gd/l2cap/Android.bp +14 −2 Original line number Diff line number Diff line Loading @@ -9,11 +9,18 @@ filegroup { "classic_fixed_channel.cc", "classic_fixed_channel_manager.cc", "classic_fixed_channel_service.cc", "internal/classic_fixed_channel_allocator.cc", "internal/classic_dynamic_channel_allocator.cc", "internal/classic_dynamic_channel_impl.cc", "internal/classic_fixed_channel_impl.cc", "internal/classic_fixed_channel_service_manager_impl.cc", "internal/classic_link_manager.cc", "internal/le_fixed_channel_impl.cc", "internal/le_fixed_channel_service_manager_impl.cc", "internal/le_link_manager.cc", "internal/scheduler_fifo.cc", "le_fixed_channel.cc", "le_fixed_channel_manager.cc", "le_fixed_channel_service.cc", ], } Loading @@ -21,10 +28,15 @@ filegroup { name: "BluetoothL2capTestSources", srcs: [ "l2cap_packet_test.cc", "internal/classic_fixed_channel_allocator_test.cc", "internal/classic_dynamic_channel_allocator_test.cc", "internal/classic_dynamic_channel_impl_test.cc", "internal/classic_fixed_channel_impl_test.cc", "internal/classic_fixed_channel_service_manager_test.cc", "internal/classic_link_manager_test.cc", "internal/fixed_channel_allocator_test.cc", "internal/le_fixed_channel_impl_test.cc", "internal/le_fixed_channel_service_manager_test.cc", "internal/le_link_manager_test.cc", "internal/scheduler_fifo_test.cc", "signal_id_test.cc", ], Loading system/gd/l2cap/classic_fixed_channel_service.h +1 −1 Original line number Diff line number Diff line Loading @@ -26,7 +26,7 @@ namespace l2cap { namespace internal { class ClassicFixedChannelServiceManagerImpl; } } // namespace internal class ClassicFixedChannelService { public: Loading system/gd/l2cap/internal/classic_fixed_channel_allocator.cc→system/gd/l2cap/internal/classic_dynamic_channel_allocator.cc +92 −0 Original line number Diff line number Diff line Loading @@ -16,9 +16,9 @@ #include <unordered_map> #include "classic_fixed_channel_allocator.h" #include "classic_dynamic_channel_allocator.h" #include "l2cap/cid.h" #include "l2cap/internal/classic_fixed_channel_allocator.h" #include "l2cap/internal/classic_dynamic_channel_allocator.h" #include "l2cap/internal/classic_link.h" #include "l2cap/security_policy.h" #include "os/handler.h" Loading @@ -28,54 +28,65 @@ namespace bluetooth { namespace l2cap { namespace internal { std::shared_ptr<ClassicFixedChannelImpl> ClassicFixedChannelAllocator::AllocateChannel(Cid cid, SecurityPolicy security_policy) { ASSERT_LOG(!IsChannelAllocated((cid)), "Cid 0x%x for device %s is already in use", cid, link_->GetDevice().ToString().c_str()); ASSERT_LOG(cid >= kFirstFixedChannel && cid <= kLastFixedChannel, "Cid %d out of bound", cid); auto elem = channels_.try_emplace(cid, std::make_shared<ClassicFixedChannelImpl>(cid, link_, l2cap_handler_)); ASSERT_LOG(elem.second, "Failed to create channel for cid 0x%x device %s", cid, std::shared_ptr<ClassicDynamicChannelImpl> ClassicDynamicChannelAllocator::AllocateChannel( Psm psm, Cid remote_cid, SecurityPolicy security_policy) { if (IsChannelAllocated((psm))) { LOG_INFO("Psm 0x%x for device %s is already in use", psm, link_->GetDevice().ToString().c_str()); return nullptr; } if (!IsPsmValid(psm)) { LOG_INFO("Psm 0x%x is invalid", psm); return nullptr; } if (used_remote_cid_.find(remote_cid) != used_remote_cid_.end()) { LOG_INFO("Remote cid 0x%x is used", remote_cid); return nullptr; } Cid cid = kFirstDynamicChannel; for (; cid <= kLastDynamicChannel; cid++) { LOG_INFO(); if (used_cid_.count(cid) == 0) break; } if (cid > kLastDynamicChannel) { LOG_WARN("All cid are used"); return nullptr; } auto elem = channels_.try_emplace( psm, std::make_shared<ClassicDynamicChannelImpl>(psm, cid, remote_cid, link_, l2cap_handler_)); ASSERT_LOG(elem.second, "Failed to create channel for psm 0x%x device %s", psm, link_->GetDevice().ToString().c_str()); ASSERT(elem.first->second != nullptr); used_cid_.insert(cid); used_remote_cid_.insert(remote_cid); return elem.first->second; } void ClassicFixedChannelAllocator::FreeChannel(Cid cid) { ASSERT_LOG(IsChannelAllocated(cid), "Channel is not in use: cid %d, device %s", cid, void ClassicDynamicChannelAllocator::FreeChannel(Psm psm) { ASSERT_LOG(IsChannelAllocated(psm), "Channel is not in use: psm %d, device %s", psm, link_->GetDevice().ToString().c_str()); channels_.erase(cid); channels_.erase(psm); } bool ClassicFixedChannelAllocator::IsChannelAllocated(Cid cid) const { return channels_.find(cid) != channels_.end(); bool ClassicDynamicChannelAllocator::IsChannelAllocated(Psm psm) const { return channels_.find(psm) != channels_.end(); } std::shared_ptr<ClassicFixedChannelImpl> ClassicFixedChannelAllocator::FindChannel(Cid cid) { ASSERT_LOG(IsChannelAllocated(cid), "Channel is not in use: cid %d, device %s", cid, std::shared_ptr<ClassicDynamicChannelImpl> ClassicDynamicChannelAllocator::FindChannel(Psm psm) { ASSERT_LOG(IsChannelAllocated(psm), "Channel is not in use: psm %d, device %s", psm, link_->GetDevice().ToString().c_str()); return channels_.find(cid)->second; return channels_.find(psm)->second; } size_t ClassicFixedChannelAllocator::NumberOfChannels() const { size_t ClassicDynamicChannelAllocator::NumberOfChannels() const { return channels_.size(); } void ClassicFixedChannelAllocator::OnAclDisconnected(hci::ErrorCode reason) { void ClassicDynamicChannelAllocator::OnAclDisconnected(hci::ErrorCode reason) { for (auto& elem : channels_) { elem.second->OnClosed(reason); } } int ClassicFixedChannelAllocator::GetRefCount() { int ref_count = 0; for (auto& elem : channels_) { if (elem.second->IsAcquired()) { ref_count++; } } return ref_count; } } // namespace internal } // namespace l2cap } // namespace bluetooth Loading
system/bta/av/bta_av_aact.cc +5 −5 Original line number Diff line number Diff line Loading @@ -3058,14 +3058,14 @@ void bta_av_open_at_inc(tBTA_AV_SCB* p_scb, tBTA_AV_DATA* p_data) { } void offload_vendor_callback(tBTM_VSC_CMPL* param) { uint8_t status = 0; tBTA_AV value{0}; uint8_t sub_opcode = 0; if (param->param_len) { APPL_TRACE_DEBUG("%s: param_len = %d status = %d", __func__, param->param_len, param->p_param_buf[0]); status = param->p_param_buf[0]; value.status = param->p_param_buf[0]; } if (status == 0) { if (value.status == 0) { sub_opcode = param->p_param_buf[1]; APPL_TRACE_DEBUG("%s: subopcode = %d", __func__, sub_opcode); switch (sub_opcode) { Loading @@ -3073,7 +3073,7 @@ void offload_vendor_callback(tBTM_VSC_CMPL* param) { APPL_TRACE_DEBUG("%s: VS_HCI_STOP_A2DP_MEDIA successful", __func__); break; case VS_HCI_A2DP_OFFLOAD_START: (*bta_av_cb.p_cback)(BTA_AV_OFFLOAD_START_RSP_EVT, (tBTA_AV*)&status); (*bta_av_cb.p_cback)(BTA_AV_OFFLOAD_START_RSP_EVT, &value); break; default: break; Loading @@ -3082,7 +3082,7 @@ void offload_vendor_callback(tBTM_VSC_CMPL* param) { APPL_TRACE_DEBUG("%s: Offload failed for subopcode= %d", __func__, sub_opcode); if (param->opcode != VS_HCI_A2DP_OFFLOAD_STOP) (*bta_av_cb.p_cback)(BTA_AV_OFFLOAD_START_RSP_EVT, (tBTA_AV*)&status); (*bta_av_cb.p_cback)(BTA_AV_OFFLOAD_START_RSP_EVT, &value); } } Loading
system/gd/hci/acl_manager_mock.h +1 −0 Original line number Diff line number Diff line Loading @@ -37,6 +37,7 @@ class MockAclConnection : public AclConnection { class MockAclManager : public AclManager { public: MOCK_METHOD(void, RegisterCallbacks, (ConnectionCallbacks * callbacks, os::Handler* handler), (override)); MOCK_METHOD(void, RegisterLeCallbacks, (LeConnectionCallbacks * callbacks, os::Handler* handler), (override)); MOCK_METHOD(void, CreateConnection, (Address address), (override)); MOCK_METHOD(void, CreateLeConnection, (Address address, AddressType address_type), (override)); MOCK_METHOD(void, CancelConnect, (Address address), (override)); Loading
system/gd/l2cap/Android.bp +14 −2 Original line number Diff line number Diff line Loading @@ -9,11 +9,18 @@ filegroup { "classic_fixed_channel.cc", "classic_fixed_channel_manager.cc", "classic_fixed_channel_service.cc", "internal/classic_fixed_channel_allocator.cc", "internal/classic_dynamic_channel_allocator.cc", "internal/classic_dynamic_channel_impl.cc", "internal/classic_fixed_channel_impl.cc", "internal/classic_fixed_channel_service_manager_impl.cc", "internal/classic_link_manager.cc", "internal/le_fixed_channel_impl.cc", "internal/le_fixed_channel_service_manager_impl.cc", "internal/le_link_manager.cc", "internal/scheduler_fifo.cc", "le_fixed_channel.cc", "le_fixed_channel_manager.cc", "le_fixed_channel_service.cc", ], } Loading @@ -21,10 +28,15 @@ filegroup { name: "BluetoothL2capTestSources", srcs: [ "l2cap_packet_test.cc", "internal/classic_fixed_channel_allocator_test.cc", "internal/classic_dynamic_channel_allocator_test.cc", "internal/classic_dynamic_channel_impl_test.cc", "internal/classic_fixed_channel_impl_test.cc", "internal/classic_fixed_channel_service_manager_test.cc", "internal/classic_link_manager_test.cc", "internal/fixed_channel_allocator_test.cc", "internal/le_fixed_channel_impl_test.cc", "internal/le_fixed_channel_service_manager_test.cc", "internal/le_link_manager_test.cc", "internal/scheduler_fifo_test.cc", "signal_id_test.cc", ], Loading
system/gd/l2cap/classic_fixed_channel_service.h +1 −1 Original line number Diff line number Diff line Loading @@ -26,7 +26,7 @@ namespace l2cap { namespace internal { class ClassicFixedChannelServiceManagerImpl; } } // namespace internal class ClassicFixedChannelService { public: Loading
system/gd/l2cap/internal/classic_fixed_channel_allocator.cc→system/gd/l2cap/internal/classic_dynamic_channel_allocator.cc +92 −0 Original line number Diff line number Diff line Loading @@ -16,9 +16,9 @@ #include <unordered_map> #include "classic_fixed_channel_allocator.h" #include "classic_dynamic_channel_allocator.h" #include "l2cap/cid.h" #include "l2cap/internal/classic_fixed_channel_allocator.h" #include "l2cap/internal/classic_dynamic_channel_allocator.h" #include "l2cap/internal/classic_link.h" #include "l2cap/security_policy.h" #include "os/handler.h" Loading @@ -28,54 +28,65 @@ namespace bluetooth { namespace l2cap { namespace internal { std::shared_ptr<ClassicFixedChannelImpl> ClassicFixedChannelAllocator::AllocateChannel(Cid cid, SecurityPolicy security_policy) { ASSERT_LOG(!IsChannelAllocated((cid)), "Cid 0x%x for device %s is already in use", cid, link_->GetDevice().ToString().c_str()); ASSERT_LOG(cid >= kFirstFixedChannel && cid <= kLastFixedChannel, "Cid %d out of bound", cid); auto elem = channels_.try_emplace(cid, std::make_shared<ClassicFixedChannelImpl>(cid, link_, l2cap_handler_)); ASSERT_LOG(elem.second, "Failed to create channel for cid 0x%x device %s", cid, std::shared_ptr<ClassicDynamicChannelImpl> ClassicDynamicChannelAllocator::AllocateChannel( Psm psm, Cid remote_cid, SecurityPolicy security_policy) { if (IsChannelAllocated((psm))) { LOG_INFO("Psm 0x%x for device %s is already in use", psm, link_->GetDevice().ToString().c_str()); return nullptr; } if (!IsPsmValid(psm)) { LOG_INFO("Psm 0x%x is invalid", psm); return nullptr; } if (used_remote_cid_.find(remote_cid) != used_remote_cid_.end()) { LOG_INFO("Remote cid 0x%x is used", remote_cid); return nullptr; } Cid cid = kFirstDynamicChannel; for (; cid <= kLastDynamicChannel; cid++) { LOG_INFO(); if (used_cid_.count(cid) == 0) break; } if (cid > kLastDynamicChannel) { LOG_WARN("All cid are used"); return nullptr; } auto elem = channels_.try_emplace( psm, std::make_shared<ClassicDynamicChannelImpl>(psm, cid, remote_cid, link_, l2cap_handler_)); ASSERT_LOG(elem.second, "Failed to create channel for psm 0x%x device %s", psm, link_->GetDevice().ToString().c_str()); ASSERT(elem.first->second != nullptr); used_cid_.insert(cid); used_remote_cid_.insert(remote_cid); return elem.first->second; } void ClassicFixedChannelAllocator::FreeChannel(Cid cid) { ASSERT_LOG(IsChannelAllocated(cid), "Channel is not in use: cid %d, device %s", cid, void ClassicDynamicChannelAllocator::FreeChannel(Psm psm) { ASSERT_LOG(IsChannelAllocated(psm), "Channel is not in use: psm %d, device %s", psm, link_->GetDevice().ToString().c_str()); channels_.erase(cid); channels_.erase(psm); } bool ClassicFixedChannelAllocator::IsChannelAllocated(Cid cid) const { return channels_.find(cid) != channels_.end(); bool ClassicDynamicChannelAllocator::IsChannelAllocated(Psm psm) const { return channels_.find(psm) != channels_.end(); } std::shared_ptr<ClassicFixedChannelImpl> ClassicFixedChannelAllocator::FindChannel(Cid cid) { ASSERT_LOG(IsChannelAllocated(cid), "Channel is not in use: cid %d, device %s", cid, std::shared_ptr<ClassicDynamicChannelImpl> ClassicDynamicChannelAllocator::FindChannel(Psm psm) { ASSERT_LOG(IsChannelAllocated(psm), "Channel is not in use: psm %d, device %s", psm, link_->GetDevice().ToString().c_str()); return channels_.find(cid)->second; return channels_.find(psm)->second; } size_t ClassicFixedChannelAllocator::NumberOfChannels() const { size_t ClassicDynamicChannelAllocator::NumberOfChannels() const { return channels_.size(); } void ClassicFixedChannelAllocator::OnAclDisconnected(hci::ErrorCode reason) { void ClassicDynamicChannelAllocator::OnAclDisconnected(hci::ErrorCode reason) { for (auto& elem : channels_) { elem.second->OnClosed(reason); } } int ClassicFixedChannelAllocator::GetRefCount() { int ref_count = 0; for (auto& elem : channels_) { if (elem.second->IsAcquired()) { ref_count++; } } return ref_count; } } // namespace internal } // namespace l2cap } // namespace bluetooth