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

Commit 9c683386 authored by Ted Wang's avatar Ted Wang Committed by android-build-merger
Browse files

Merge "L2CAP respond configuration reqeust with options"

am: 3a16d2b1

Change-Id: If65395761a07b00908bd18801713a502e1cf30b9
parents b9eb3bee 3a16d2b1
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_);
}
}