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

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

Merge "L2CAP respond configuration reqeust with options"

parents bb42a8c9 e16c454a
Loading
Loading
Loading
Loading
+6 −0
Original line number Original line Diff line number Diff line
@@ -107,6 +107,11 @@ message ConfigurationRequest {
  bool fcs = 5;
  bool fcs = 5;
}
}


enum ConfigurationResult {
  SUCCESS = 0;
  NOT_SUCCESS = 1;
}

message SendConfigurationRequestResult {}
message SendConfigurationRequestResult {}


message ConfigurationResponse {
message ConfigurationResponse {
@@ -115,6 +120,7 @@ message ConfigurationResponse {
  uint32 mtu = 3;
  uint32 mtu = 3;
  ChannelRetransmissionFlowControlConfig retransmission_config = 4;
  ChannelRetransmissionFlowControlConfig retransmission_config = 4;
  bool fcs = 5;
  bool fcs = 5;
  ConfigurationResult result = 6;
}
}


message SendConfigurationResponseResult {}
message SendConfigurationResponseResult {}
+11 −0
Original line number Original line Diff line number Diff line
@@ -376,6 +376,17 @@ class L2capClassicModuleCertService : public L2capClassicModuleCert::Service {
        FetchL2capLogResponse response;
        FetchL2capLogResponse response;
        response.mutable_configuration_response()->set_signal_id(control_view.GetIdentifier());
        response.mutable_configuration_response()->set_signal_id(control_view.GetIdentifier());
        response.mutable_configuration_response()->set_scid(view.GetSourceCid());
        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);
        LogEvent(response);
        break;
        break;
      }
      }
+29 −0
Original line number Original line Diff line number Diff line
@@ -651,3 +651,32 @@ class SimpleL2capTest(GdBaseTestClass):
            l2cap_event_asserts.assert_event_occurs(
            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'
                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)
+9 −1
Original line number Original line Diff line number Diff line
@@ -275,6 +275,7 @@ void ClassicSignallingManager::OnConfigurationRequest(SignalId signal_id, Cid ci
  }
  }


  auto& configuration_state = channel_configuration_[cid];
  auto& configuration_state = channel_configuration_[cid];
  std::vector<std::unique_ptr<ConfigurationOption>> rsp_options;


  for (auto& option : options) {
  for (auto& option : options) {
    switch (option->type_) {
    switch (option->type_) {
@@ -289,7 +290,14 @@ void ClassicSignallingManager::OnConfigurationRequest(SignalId signal_id, Cid ci
      }
      }
      case ConfigurationOptionType::RETRANSMISSION_AND_FLOW_CONTROL: {
      case ConfigurationOptionType::RETRANSMISSION_AND_FLOW_CONTROL: {
        auto config = RetransmissionAndFlowControlConfigurationOption::Specialize(option.get());
        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;
        configuration_state.remote_retransmission_and_flow_control_ = *config;
        rsp_options.emplace_back(std::move(config));
        break;
        break;
      }
      }
      case ConfigurationOptionType::FRAME_CHECK_SEQUENCE: {
      case ConfigurationOptionType::FRAME_CHECK_SEQUENCE: {
@@ -320,7 +328,7 @@ void ClassicSignallingManager::OnConfigurationRequest(SignalId signal_id, Cid ci
  }
  }


  auto response = ConfigurationResponseBuilder::Create(signal_id.Value(), channel->GetRemoteCid(), is_continuation,
  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_);
  enqueue_buffer_->Enqueue(std::move(response), handler_);
}
}