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

Commit bee726f9 authored by Henri Chataing's avatar Henri Chataing Committed by Automerger Merge Worker
Browse files

Root-Canal: Implement support for SCO connections am: b660ed73

Original change: https://android-review.googlesource.com/c/platform/packages/modules/Bluetooth/+/1918633

Change-Id: Ice3409a9165e4c82679e501f073c5cd87aab7e77
parents 6e6af171 b660ed73
Loading
Loading
Loading
Loading
+4 −0
Original line number Diff line number Diff line
@@ -817,6 +817,10 @@ struct Controller::impl {
      OP_CODE_MAPPING(CONFIGURE_DATA_PATH)
      OP_CODE_MAPPING(ENHANCED_FLUSH)

      // deprecated
      case OpCode::ADD_SCO_CONNECTION:
        return false;

      // vendor specific
      case OpCode::LE_GET_VENDOR_CAPABILITIES:
        return vendor_capabilities_.is_supported_ == 0x01;
+11 −0
Original line number Diff line number Diff line
@@ -113,6 +113,7 @@ enum OpCode : 16 {
  EXIT_PERIODIC_INQUIRY_MODE = 0x0404,
  CREATE_CONNECTION = 0x0405,
  DISCONNECT = 0x0406,
  ADD_SCO_CONNECTION = 0x0407,
  CREATE_CONNECTION_CANCEL = 0x0408,
  ACCEPT_CONNECTION_REQUEST = 0x0409,
  REJECT_CONNECTION_REQUEST = 0x040A,
@@ -397,6 +398,7 @@ enum OpCodeIndex : 16 {
  EXIT_PERIODIC_INQUIRY_MODE = 3,
  CREATE_CONNECTION = 4,
  DISCONNECT = 5,
  ADD_SCO_CONNECTION = 6,
  CREATE_CONNECTION_CANCEL = 7,
  ACCEPT_CONNECTION_REQUEST = 10,
  REJECT_CONNECTION_REQUEST = 11,
@@ -967,6 +969,15 @@ packet Disconnect : AclCommand (op_code = DISCONNECT) {
packet DisconnectStatus : CommandStatus (command_op_code = DISCONNECT) {
}

packet AddScoConnection : ConnectionManagementCommand (op_code = ADD_SCO_CONNECTION) {
  connection_handle : 12,
  _reserved_ : 4,
  packet_type : 16,
}

packet AddScoConnectionStatus : CommandStatus (command_op_code = ADD_SCO_CONNECTION) {
}

packet CreateConnectionCancel : ConnectionManagementCommand (op_code = CREATE_CONNECTION_CANCEL) {
  bd_addr : Address,
}
+34 −7
Original line number Diff line number Diff line
@@ -142,7 +142,8 @@ bool AclConnectionHandler::Disconnect(uint16_t handle) {
  if (HasHandle(handle)) {
    // It is the responsibility of the caller to remove SCO connections
    // with connected peer first.
    ASSERT(GetScoHandle(GetAddress(handle).GetAddress()) == 0);
    uint16_t sco_handle = GetScoHandle(GetAddress(handle).GetAddress());
    ASSERT(!HasScoHandle(sco_handle));
    acl_connections_.erase(handle);
    return true;
  }
@@ -420,18 +421,40 @@ StreamParameters AclConnectionHandler::GetStreamParameters(
  return isochronous_connection_handler_.GetStreamParameters(handle);
}

void AclConnectionHandler::CreatePendingScoConnection(
  bluetooth::hci::Address addr, ScoConnectionParameters const &parameters) {
void AclConnectionHandler::CreateScoConnection(
  bluetooth::hci::Address addr, ScoConnectionParameters const &parameters,
  ScoState state, bool legacy) {

  uint16_t sco_handle = GetUnusedHandle();
  sco_connections_.emplace(
    sco_handle, ScoConnection(addr, parameters));
  sco_connections_.emplace(sco_handle,
      ScoConnection(addr, parameters, state, legacy));
}

bool AclConnectionHandler::HasPendingScoConnection(bluetooth::hci::Address addr) const {
  for (auto pair : sco_connections_) {
    if (std::get<ScoConnection>(pair).GetAddress() == addr) {
      return true;
      ScoState state = std::get<ScoConnection>(pair).GetState();
      return state == SCO_STATE_PENDING ||
             state == SCO_STATE_SENT_ESCO_CONNECTION_REQUEST ||
             state == SCO_STATE_SENT_SCO_CONNECTION_REQUEST;
    }
  }
  return false;
}

ScoState AclConnectionHandler::GetScoConnectionState(bluetooth::hci::Address addr) const {
  for (auto pair : sco_connections_) {
    if (std::get<ScoConnection>(pair).GetAddress() == addr) {
      return std::get<ScoConnection>(pair).GetState();
    }
  }
  return SCO_STATE_CLOSED;
}

bool AclConnectionHandler::IsLegacyScoConnection(bluetooth::hci::Address addr) const {
  for (auto pair : sco_connections_) {
    if (std::get<ScoConnection>(pair).GetAddress() == addr) {
      return std::get<ScoConnection>(pair).IsLegacy();
    }
  }
  return false;
@@ -452,6 +475,7 @@ bool AclConnectionHandler::AcceptPendingScoConnection(bluetooth::hci::Address ad
  for (auto pair : sco_connections_) {
    if (std::get<ScoConnection>(pair).GetAddress() == addr) {
      std::get<ScoConnection>(pair).SetLinkParameters(parameters);
      std::get<ScoConnection>(pair).SetState(ScoState::SCO_STATE_OPENED);
      return true;
    }
  }
@@ -463,7 +487,10 @@ bool AclConnectionHandler::AcceptPendingScoConnection(bluetooth::hci::Address ad

  for (auto pair : sco_connections_) {
    if (std::get<ScoConnection>(pair).GetAddress() == addr) {
      return std::get<ScoConnection>(pair).NegotiateLinkParameters(parameters);
      bool ok = std::get<ScoConnection>(pair).NegotiateLinkParameters(parameters);
      std::get<ScoConnection>(pair).SetState(
          ok ? ScoState::SCO_STATE_OPENED : ScoState::SCO_STATE_CLOSED);
      return ok;
    }
  }
  return false;
+4 −2
Original line number Diff line number Diff line
@@ -43,8 +43,10 @@ class AclConnectionHandler {
  bool AuthenticatePendingConnection() const;

  bool HasPendingScoConnection(bluetooth::hci::Address addr) const;
  void CreatePendingScoConnection(bluetooth::hci::Address addr,
    ScoConnectionParameters const &parameters);
  ScoState GetScoConnectionState(bluetooth::hci::Address addr) const;
  bool IsLegacyScoConnection(bluetooth::hci::Address addr) const;
  void CreateScoConnection(bluetooth::hci::Address addr,
    ScoConnectionParameters const &parameters, ScoState state, bool legacy = false);
  void CancelPendingScoConnection(bluetooth::hci::Address addr);
  bool AcceptPendingScoConnection(bluetooth::hci::Address addr,
    ScoLinkParameters const &parameters);
+17 −0
Original line number Diff line number Diff line
@@ -122,6 +122,7 @@ DualModeController::DualModeController(const std::string& properties_filename, u
  SET_SUPPORTED(SWITCH_ROLE, SwitchRole);
  SET_SUPPORTED(READ_REMOTE_SUPPORTED_FEATURES, ReadRemoteSupportedFeatures);
  SET_SUPPORTED(READ_CLOCK_OFFSET, ReadClockOffset);
  SET_HANDLER(ADD_SCO_CONNECTION, AddScoConnection);
  SET_SUPPORTED(SETUP_SYNCHRONOUS_CONNECTION, SetupSynchronousConnection);
  SET_SUPPORTED(ACCEPT_SYNCHRONOUS_CONNECTION, AcceptSynchronousConnection);
  SET_SUPPORTED(REJECT_SYNCHRONOUS_CONNECTION, RejectSynchronousConnection);
@@ -661,6 +662,22 @@ void DualModeController::ReadClockOffset(CommandView command) {
  send_event_(std::move(packet));
}

// Deprecated command, removed in v4.2.
// Support is provided to satisfy PTS tester requirements.
void DualModeController::AddScoConnection(CommandView command) {
  auto command_view = gd_hci::AddScoConnectionView::Create(
      gd_hci::ConnectionManagementCommandView::Create(
          gd_hci::AclCommandView::Create(command)));
  ASSERT(command_view.IsValid());

  auto status = link_layer_controller_.AddScoConnection(
      command_view.GetConnectionHandle(), command_view.GetPacketType());

  auto packet = bluetooth::hci::AddScoConnectionStatusBuilder::Create(
      status, kNumCommandPackets);
  send_event_(std::move(packet));
}

void DualModeController::SetupSynchronousConnection(CommandView command) {
  auto command_view = gd_hci::SetupSynchronousConnectionView::Create(
    gd_hci::ScoConnectionCommandView::Create(
Loading