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

Commit 2537e47b authored by android-build-team Robot's avatar android-build-team Robot
Browse files

Snap for 5916059 from b3a3aa1d to rvc-release

Change-Id: Ib4eab45234c7ae618cbfeb1acd0e491d17b977dd
parents b71742f6 b3a3aa1d
Loading
Loading
Loading
Loading
+5 −5
Original line number Diff line number Diff line
@@ -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) {
@@ -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;
@@ -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);
  }
}

+1 −0
Original line number Diff line number Diff line
@@ -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));
+14 −2
Original line number Diff line number Diff line
@@ -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",
    ],
}

@@ -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",
    ],
+1 −1
Original line number Diff line number Diff line
@@ -26,7 +26,7 @@ namespace l2cap {

namespace internal {
class ClassicFixedChannelServiceManagerImpl;
}
}  // namespace internal

class ClassicFixedChannelService {
 public:
+92 −0
Original line number Diff line number Diff line
@@ -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"
@@ -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