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

Commit bfa14fe5 authored by Treehugger Robot's avatar Treehugger Robot Committed by Gerrit Code Review
Browse files

Merge "L2CAP: Integrate ERTM to shim"

parents 51fad0a7 9abc4c4c
Loading
Loading
Loading
Loading
+2 −1
Original line number Original line Diff line number Diff line
@@ -32,7 +32,8 @@ using ConnectionOpenCallback = std::function<void(std::string string_address, ui
using ReadDataReadyCallback = std::function<void(uint16_t cid, std::vector<const uint8_t> data)>;
using ReadDataReadyCallback = std::function<void(uint16_t cid, std::vector<const uint8_t> data)>;


struct IL2cap {
struct IL2cap {
  virtual void RegisterService(uint16_t psm, ConnectionOpenCallback on_open, std::promise<void> completed) = 0;
  virtual void RegisterService(uint16_t psm, bool use_ertm, uint16_t mtu, ConnectionOpenCallback on_open,
                               std::promise<void> completed) = 0;
  virtual void UnregisterService(uint16_t psm) = 0;
  virtual void UnregisterService(uint16_t psm) = 0;


  virtual void CreateConnection(uint16_t psm, const std::string address, ConnectionOpenCallback on_open,
  virtual void CreateConnection(uint16_t psm, const std::string address, ConnectionOpenCallback on_open,
+19 −12
Original line number Original line Diff line number Diff line
@@ -355,7 +355,8 @@ class ServiceInterface {
};
};


struct L2cap::impl {
struct L2cap::impl {
  void RegisterService(l2cap::Psm psm, ConnectionOpenCallback on_open, std::promise<void> completed);
  void RegisterService(l2cap::Psm psm, l2cap::classic::DynamicChannelConfigurationOption option,
                       ConnectionOpenCallback on_open, std::promise<void> completed);
  void UnregisterService(l2cap::Psm psm);
  void UnregisterService(l2cap::Psm psm);


  void CreateConnection(l2cap::Psm psm, hci::Address address, ConnectionOpenCallback on_open,
  void CreateConnection(l2cap::Psm psm, hci::Address address, ConnectionOpenCallback on_open,
@@ -389,21 +390,20 @@ L2cap::impl::impl(L2cap& module, l2cap::classic::L2capClassicModule* l2cap_modul
  dynamic_channel_manager_ = l2cap_module_->GetDynamicChannelManager();
  dynamic_channel_manager_ = l2cap_module_->GetDynamicChannelManager();
}
}


void L2cap::impl::RegisterService(l2cap::Psm psm, ConnectionOpenCallback on_open, std::promise<void> completed) {
void L2cap::impl::RegisterService(l2cap::Psm psm, l2cap::classic::DynamicChannelConfigurationOption option,
                                  ConnectionOpenCallback on_open, std::promise<void> completed) {
  ASSERT(psm_to_service_interface_map_.find(psm) == psm_to_service_interface_map_.end());
  ASSERT(psm_to_service_interface_map_.find(psm) == psm_to_service_interface_map_.end());


  auto service_interface =
  auto service_interface =
      std::make_shared<ServiceInterface>(&connection_interface_manager_, psm, on_open, std::move(completed));
      std::make_shared<ServiceInterface>(&connection_interface_manager_, psm, on_open, std::move(completed));
  psm_to_service_interface_map_.emplace(psm, service_interface);
  psm_to_service_interface_map_.emplace(psm, service_interface);


  // TODO(cmanton): Use the configuration option from user
  service_interface->RegisterService(
  service_interface->RegisterService(
      [this](l2cap::Psm psm, l2cap::SecurityPolicy security_policy,
      [this, option](l2cap::Psm psm, l2cap::SecurityPolicy security_policy,
                     l2cap::classic::DynamicChannelManager::OnRegistrationCompleteCallback on_registration_complete,
                     l2cap::classic::DynamicChannelManager::OnRegistrationCompleteCallback on_registration_complete,
                     l2cap::classic::DynamicChannelManager::OnConnectionOpenCallback on_connection_open) {
                     l2cap::classic::DynamicChannelManager::OnConnectionOpenCallback on_connection_open) {
        bool rc = dynamic_channel_manager_->RegisterService(psm, l2cap::classic::DynamicChannelConfigurationOption(),
        bool rc = dynamic_channel_manager_->RegisterService(
                                                            security_policy, std::move(on_registration_complete),
            psm, option, security_policy, std::move(on_registration_complete), on_connection_open, handler_);
                                                            on_connection_open, handler_);
        ASSERT_LOG(rc == true, "Failed to register classic service");
        ASSERT_LOG(rc == true, "Failed to register classic service");
      });
      });
}
}
@@ -449,10 +449,17 @@ void L2cap::impl::SendLoopbackResponse(std::function<void()> function) {
  function();
  function();
}
}


void L2cap::RegisterService(uint16_t raw_psm, ConnectionOpenCallback on_open, std::promise<void> completed) {
void L2cap::RegisterService(uint16_t raw_psm, bool use_ertm, uint16_t mtu, ConnectionOpenCallback on_open,
                            std::promise<void> completed) {
  l2cap::Psm psm{raw_psm};
  l2cap::Psm psm{raw_psm};
  GetHandler()->Post(common::BindOnce(&L2cap::impl::RegisterService, common::Unretained(pimpl_.get()), psm, on_open,
  l2cap::classic::DynamicChannelConfigurationOption option;
                                      std::move(completed)));
  if (use_ertm) {
    option.channel_mode =
        l2cap::classic::DynamicChannelConfigurationOption::RetransmissionAndFlowControlMode::ENHANCED_RETRANSMISSION;
  }
  option.incoming_mtu = mtu;
  GetHandler()->Post(common::BindOnce(&L2cap::impl::RegisterService, common::Unretained(pimpl_.get()), psm, option,
                                      on_open, std::move(completed)));
}
}


void L2cap::UnregisterService(uint16_t raw_psm) {
void L2cap::UnregisterService(uint16_t raw_psm) {
+2 −1
Original line number Original line Diff line number Diff line
@@ -29,7 +29,8 @@ namespace shim {


class L2cap : public bluetooth::Module, public bluetooth::shim::IL2cap {
class L2cap : public bluetooth::Module, public bluetooth::shim::IL2cap {
 public:
 public:
  void RegisterService(uint16_t psm, ConnectionOpenCallback on_open, std::promise<void> completed) override;
  void RegisterService(uint16_t psm, bool use_ertm, uint16_t mtu, ConnectionOpenCallback on_open,
                       std::promise<void> completed) override;
  void UnregisterService(uint16_t psm) override;
  void UnregisterService(uint16_t psm) override;


  void CreateConnection(uint16_t psm, const std::string address_string, ConnectionOpenCallback on_open,
  void CreateConnection(uint16_t psm, const std::string address_string, ConnectionOpenCallback on_open,
+6 −6
Original line number Original line Diff line number Diff line
@@ -28,7 +28,8 @@ static bluetooth::legacy::shim::L2cap shim_l2cap;
 */
 */
uint16_t bluetooth::shim::L2CA_Register(uint16_t client_psm,
uint16_t bluetooth::shim::L2CA_Register(uint16_t client_psm,
                                        tL2CAP_APPL_INFO* callbacks,
                                        tL2CAP_APPL_INFO* callbacks,
                                        bool enable_snoop) {
                                        bool enable_snoop,
                                        tL2CAP_ERTM_INFO* p_ertm_info) {
  if (L2C_INVALID_PSM(client_psm)) {
  if (L2C_INVALID_PSM(client_psm)) {
    LOG_ERROR(LOG_TAG, "%s Invalid classic psm:%hd", __func__, client_psm);
    LOG_ERROR(LOG_TAG, "%s Invalid classic psm:%hd", __func__, client_psm);
    return 0;
    return 0;
@@ -60,7 +61,7 @@ uint16_t bluetooth::shim::L2CA_Register(uint16_t client_psm,
  LOG_INFO(LOG_TAG, "%s classic client_psm:%hd psm:%hd", __func__, client_psm,
  LOG_INFO(LOG_TAG, "%s classic client_psm:%hd psm:%hd", __func__, client_psm,
           psm);
           psm);


  shim_l2cap.RegisterService(psm, callbacks, enable_snoop);
  shim_l2cap.RegisterService(psm, callbacks, enable_snoop, p_ertm_info);


  return client_psm;
  return client_psm;
}
}
@@ -114,14 +115,12 @@ void bluetooth::shim::L2CA_FreeLePSM(uint16_t psm) {
uint16_t bluetooth::shim::L2CA_ErtmConnectReq(uint16_t psm,
uint16_t bluetooth::shim::L2CA_ErtmConnectReq(uint16_t psm,
                                              const RawAddress& raw_address,
                                              const RawAddress& raw_address,
                                              tL2CAP_ERTM_INFO* p_ertm_info) {
                                              tL2CAP_ERTM_INFO* p_ertm_info) {
  CHECK(p_ertm_info == nullptr)
      << "UNIMPLEMENTED set enhanced retransmission mode config";
  return shim_l2cap.CreateConnection(psm, raw_address);
  return shim_l2cap.CreateConnection(psm, raw_address);
}
}


uint16_t bluetooth::shim::L2CA_ConnectReq(uint16_t psm,
uint16_t bluetooth::shim::L2CA_ConnectReq(uint16_t psm,
                                          const RawAddress& raw_address) {
                                          const RawAddress& raw_address) {
  return bluetooth::shim::L2CA_ErtmConnectReq(psm, raw_address, nullptr);
  return shim_l2cap.CreateConnection(psm, raw_address);
}
}


bool bluetooth::shim::L2CA_ErtmConnectRsp(const RawAddress& p_bd_addr,
bool bluetooth::shim::L2CA_ErtmConnectRsp(const RawAddress& p_bd_addr,
@@ -252,7 +251,8 @@ bool bluetooth::shim::L2CA_GetPeerFeatures(const RawAddress& bd_addr,
}
}


/**
/**
 * Fixed Channel APIs
 * Fixed Channel APIs. Note: Classic fixed channel (connectionless and BR SMP)
 * is not supported
 */
 */
bool bluetooth::shim::L2CA_RegisterFixedChannel(uint16_t fixed_cid,
bool bluetooth::shim::L2CA_RegisterFixedChannel(uint16_t fixed_cid,
                                                tL2CAP_FIXED_CHNL_REG* p_freg) {
                                                tL2CAP_FIXED_CHNL_REG* p_freg) {
+1 −1
Original line number Original line Diff line number Diff line
@@ -40,7 +40,7 @@ namespace shim {
 *
 *
 ******************************************************************************/
 ******************************************************************************/
uint16_t L2CA_Register(uint16_t psm, tL2CAP_APPL_INFO* p_cb_info,
uint16_t L2CA_Register(uint16_t psm, tL2CAP_APPL_INFO* p_cb_info,
                       bool enable_snoop);
                       bool enable_snoop, tL2CAP_ERTM_INFO* p_ertm_info);


/*******************************************************************************
/*******************************************************************************
 *
 *
Loading