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

Commit e16c454a authored by Ted Wang's avatar Ted Wang Committed by Hansong Zhang
Browse files

L2CAP respond configuration reqeust with options

Override retransmission timeout and monitor timeout with local timeout
if remote send 0

Bug: 145848834
Test: run_cert.sh test_respond_configuration_ertm
Change-Id: I0b68adce120c6a2334fadae305c482008b31d7b5
parent bfa14fe5
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_);
}
}