Loading system/gd/l2cap/classic/cert/api.proto +6 −0 Original line number Diff line number Diff line Loading @@ -107,6 +107,11 @@ message ConfigurationRequest { bool fcs = 5; } enum ConfigurationResult { SUCCESS = 0; NOT_SUCCESS = 1; } message SendConfigurationRequestResult {} message ConfigurationResponse { Loading @@ -115,6 +120,7 @@ message ConfigurationResponse { uint32 mtu = 3; ChannelRetransmissionFlowControlConfig retransmission_config = 4; bool fcs = 5; ConfigurationResult result = 6; } message SendConfigurationResponseResult {} Loading system/gd/l2cap/classic/cert/cert.cc +11 −0 Original line number Diff line number Diff line Loading @@ -376,6 +376,17 @@ class L2capClassicModuleCertService : public L2capClassicModuleCert::Service { FetchL2capLogResponse response; response.mutable_configuration_response()->set_signal_id(control_view.GetIdentifier()); response.mutable_configuration_response()->set_scid(view.GetSourceCid()); if (view.GetResult() == ConfigurationResponseResult::SUCCESS) { response.mutable_configuration_response()->set_result(ConfigurationResult::SUCCESS); } else { response.mutable_configuration_response()->set_result(ConfigurationResult::NOT_SUCCESS); } for (auto& option : view.GetConfig()) { if (option->type_ == ConfigurationOptionType::RETRANSMISSION_AND_FLOW_CONTROL) { response.mutable_configuration_response()->mutable_retransmission_config()->set_mode( ChannelRetransmissionFlowControlMode::ERTM); } } LogEvent(response); break; } Loading system/gd/l2cap/classic/cert/simple_l2cap_test.py +29 −0 Original line number Diff line number Diff line Loading @@ -651,3 +651,32 @@ class SimpleL2capTest(GdBaseTestClass): l2cap_event_asserts.assert_event_occurs( lambda log: log.HasField("data_packet") and log.data_packet.channel == scid and log.data_packet.payload == b'\x01\x0a' ) def test_respond_configuration_request_ertm(self): """ L2CAP/CMC/BV-02-C [Lower Tester Initiated Configuration of Enhanced Retransmission Mode] """ with EventCallbackStream( self.cert_device.l2cap.FetchL2capLog( empty_pb2.Empty())) as l2cap_log_stream: l2cap_event_asserts = EventAsserts(l2cap_log_stream) self._register_callbacks(l2cap_log_stream) self._setup_link(l2cap_event_asserts) psm = 1 scid = 0x0101 self.retransmission_mode = l2cap_facade_pb2.RetransmissionFlowControlMode.ERTM self.device_under_test.l2cap.SetDynamicChannel( l2cap_facade_pb2.SetEnableDynamicChannelRequest( psm=psm, retransmission_mode=self.retransmission_mode)) self.cert_device.l2cap.SendConnectionRequest( l2cap_cert_pb2.ConnectionRequest(scid=scid, psm=psm)) l2cap_event_asserts.assert_event_occurs( lambda log: is_configuration_request(log) and \ log.configuration_response.scid == scid and\ log.configuration_response.result == log.l2cap_cert_pb2.ConfigurationResult.SUCCESS and \ log.HasField("retransmission_config") and \ log.configuration_response.retransmission_config.mode == l2cap_cert_pb2.ChannelRetransmissionFlowControlMode.ERTM) system/gd/l2cap/classic/internal/signalling_manager.cc +9 −1 Original line number Diff line number Diff line Loading @@ -275,6 +275,7 @@ void ClassicSignallingManager::OnConfigurationRequest(SignalId signal_id, Cid ci } auto& configuration_state = channel_configuration_[cid]; std::vector<std::unique_ptr<ConfigurationOption>> rsp_options; for (auto& option : options) { switch (option->type_) { Loading @@ -289,7 +290,14 @@ void ClassicSignallingManager::OnConfigurationRequest(SignalId signal_id, Cid ci } case ConfigurationOptionType::RETRANSMISSION_AND_FLOW_CONTROL: { auto config = RetransmissionAndFlowControlConfigurationOption::Specialize(option.get()); if (config->retransmission_time_out_ == 0) { config->retransmission_time_out_ = 2000; } if (config->monitor_time_out_ == 0) { config->monitor_time_out_ = 12000; } configuration_state.remote_retransmission_and_flow_control_ = *config; rsp_options.emplace_back(std::move(config)); break; } case ConfigurationOptionType::FRAME_CHECK_SEQUENCE: { Loading Loading @@ -320,7 +328,7 @@ void ClassicSignallingManager::OnConfigurationRequest(SignalId signal_id, Cid ci } auto response = ConfigurationResponseBuilder::Create(signal_id.Value(), channel->GetRemoteCid(), is_continuation, ConfigurationResponseResult::SUCCESS, {}); ConfigurationResponseResult::SUCCESS, std::move(rsp_options)); enqueue_buffer_->Enqueue(std::move(response), handler_); } Loading Loading
system/gd/l2cap/classic/cert/api.proto +6 −0 Original line number Diff line number Diff line Loading @@ -107,6 +107,11 @@ message ConfigurationRequest { bool fcs = 5; } enum ConfigurationResult { SUCCESS = 0; NOT_SUCCESS = 1; } message SendConfigurationRequestResult {} message ConfigurationResponse { Loading @@ -115,6 +120,7 @@ message ConfigurationResponse { uint32 mtu = 3; ChannelRetransmissionFlowControlConfig retransmission_config = 4; bool fcs = 5; ConfigurationResult result = 6; } message SendConfigurationResponseResult {} Loading
system/gd/l2cap/classic/cert/cert.cc +11 −0 Original line number Diff line number Diff line Loading @@ -376,6 +376,17 @@ class L2capClassicModuleCertService : public L2capClassicModuleCert::Service { FetchL2capLogResponse response; response.mutable_configuration_response()->set_signal_id(control_view.GetIdentifier()); response.mutable_configuration_response()->set_scid(view.GetSourceCid()); if (view.GetResult() == ConfigurationResponseResult::SUCCESS) { response.mutable_configuration_response()->set_result(ConfigurationResult::SUCCESS); } else { response.mutable_configuration_response()->set_result(ConfigurationResult::NOT_SUCCESS); } for (auto& option : view.GetConfig()) { if (option->type_ == ConfigurationOptionType::RETRANSMISSION_AND_FLOW_CONTROL) { response.mutable_configuration_response()->mutable_retransmission_config()->set_mode( ChannelRetransmissionFlowControlMode::ERTM); } } LogEvent(response); break; } Loading
system/gd/l2cap/classic/cert/simple_l2cap_test.py +29 −0 Original line number Diff line number Diff line Loading @@ -651,3 +651,32 @@ class SimpleL2capTest(GdBaseTestClass): l2cap_event_asserts.assert_event_occurs( lambda log: log.HasField("data_packet") and log.data_packet.channel == scid and log.data_packet.payload == b'\x01\x0a' ) def test_respond_configuration_request_ertm(self): """ L2CAP/CMC/BV-02-C [Lower Tester Initiated Configuration of Enhanced Retransmission Mode] """ with EventCallbackStream( self.cert_device.l2cap.FetchL2capLog( empty_pb2.Empty())) as l2cap_log_stream: l2cap_event_asserts = EventAsserts(l2cap_log_stream) self._register_callbacks(l2cap_log_stream) self._setup_link(l2cap_event_asserts) psm = 1 scid = 0x0101 self.retransmission_mode = l2cap_facade_pb2.RetransmissionFlowControlMode.ERTM self.device_under_test.l2cap.SetDynamicChannel( l2cap_facade_pb2.SetEnableDynamicChannelRequest( psm=psm, retransmission_mode=self.retransmission_mode)) self.cert_device.l2cap.SendConnectionRequest( l2cap_cert_pb2.ConnectionRequest(scid=scid, psm=psm)) l2cap_event_asserts.assert_event_occurs( lambda log: is_configuration_request(log) and \ log.configuration_response.scid == scid and\ log.configuration_response.result == log.l2cap_cert_pb2.ConfigurationResult.SUCCESS and \ log.HasField("retransmission_config") and \ log.configuration_response.retransmission_config.mode == l2cap_cert_pb2.ChannelRetransmissionFlowControlMode.ERTM)
system/gd/l2cap/classic/internal/signalling_manager.cc +9 −1 Original line number Diff line number Diff line Loading @@ -275,6 +275,7 @@ void ClassicSignallingManager::OnConfigurationRequest(SignalId signal_id, Cid ci } auto& configuration_state = channel_configuration_[cid]; std::vector<std::unique_ptr<ConfigurationOption>> rsp_options; for (auto& option : options) { switch (option->type_) { Loading @@ -289,7 +290,14 @@ void ClassicSignallingManager::OnConfigurationRequest(SignalId signal_id, Cid ci } case ConfigurationOptionType::RETRANSMISSION_AND_FLOW_CONTROL: { auto config = RetransmissionAndFlowControlConfigurationOption::Specialize(option.get()); if (config->retransmission_time_out_ == 0) { config->retransmission_time_out_ = 2000; } if (config->monitor_time_out_ == 0) { config->monitor_time_out_ = 12000; } configuration_state.remote_retransmission_and_flow_control_ = *config; rsp_options.emplace_back(std::move(config)); break; } case ConfigurationOptionType::FRAME_CHECK_SEQUENCE: { Loading Loading @@ -320,7 +328,7 @@ void ClassicSignallingManager::OnConfigurationRequest(SignalId signal_id, Cid ci } auto response = ConfigurationResponseBuilder::Create(signal_id.Value(), channel->GetRemoteCid(), is_continuation, ConfigurationResponseResult::SUCCESS, {}); ConfigurationResponseResult::SUCCESS, std::move(rsp_options)); enqueue_buffer_->Enqueue(std::move(response), handler_); } Loading