Loading system/gd/shim/il2cap.h +2 −1 Original line number Original line Diff line number Diff line Loading @@ -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, Loading system/gd/shim/l2cap.cc +19 −12 Original line number Original line Diff line number Diff line Loading @@ -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, Loading Loading @@ -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"); }); }); } } Loading Loading @@ -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) { Loading system/gd/shim/l2cap.h +2 −1 Original line number Original line Diff line number Diff line Loading @@ -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, Loading system/main/shim/l2c_api.cc +6 −6 Original line number Original line Diff line number Diff line Loading @@ -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; Loading Loading @@ -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; } } Loading Loading @@ -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, Loading Loading @@ -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) { Loading system/main/shim/l2c_api.h +1 −1 Original line number Original line Diff line number Diff line Loading @@ -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 Loading
system/gd/shim/il2cap.h +2 −1 Original line number Original line Diff line number Diff line Loading @@ -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, Loading
system/gd/shim/l2cap.cc +19 −12 Original line number Original line Diff line number Diff line Loading @@ -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, Loading Loading @@ -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"); }); }); } } Loading Loading @@ -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) { Loading
system/gd/shim/l2cap.h +2 −1 Original line number Original line Diff line number Diff line Loading @@ -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, Loading
system/main/shim/l2c_api.cc +6 −6 Original line number Original line Diff line number Diff line Loading @@ -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; Loading Loading @@ -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; } } Loading Loading @@ -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, Loading Loading @@ -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) { Loading
system/main/shim/l2c_api.h +1 −1 Original line number Original line Diff line number Diff line Loading @@ -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