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

Commit 5ba45c35 authored by Hansong Zhang's avatar Hansong Zhang
Browse files

GD L2cap: Add a way to enforce required mtu

Test: cert/run --host
Tag: #gd-refactor
Bug: 141555841
Change-Id: Iefe65f3105ced94a9e653d82a59e550687765df2
parent 3fc08245
Loading
Loading
Loading
Loading
+5 −0
Original line number Diff line number Diff line
@@ -42,6 +42,11 @@ struct DynamicChannelConfigurationOption {
   * Maximum SDU size that the L2CAP Channel user is able to process.
   */
  Mtu incoming_mtu = kDefaultClassicMtu;

  /**
   * Minimum MTU that we enforce the remote channel to have
   */
  Mtu minimal_remote_mtu = kMinimumClassicMtu;
};

}  // namespace classic
+0 −2
Original line number Diff line number Diff line
@@ -49,8 +49,6 @@ struct ChannelConfigurationState {
  };
  State state_ = State::WAIT_CONFIG_REQ_RSP;

  Mtu incoming_mtu_ = kDefaultClassicMtu;
  Mtu outgoing_mtu_ = kDefaultClassicMtu;
  RetransmissionAndFlowControlModeOption retransmission_and_flow_control_mode_;
  RetransmissionAndFlowControlConfigurationOption local_retransmission_and_flow_control_;
  RetransmissionAndFlowControlConfigurationOption remote_retransmission_and_flow_control_;
+6 −12
Original line number Diff line number Diff line
@@ -292,21 +292,21 @@ void ClassicSignallingManager::OnConfigurationRequest(SignalId signal_id, Cid ci
  ConfigurationResponseResult result = ConfigurationResponseResult::SUCCESS;
  auto remote_rfc_mode = RetransmissionAndFlowControlModeOption::L2CAP_BASIC;

  auto initial_config_option = dynamic_service_manager_->GetService(channel->GetPsm())->GetConfigOption();

  for (auto& option : options) {
    switch (option->type_) {
      case ConfigurationOptionType::MTU: {
        auto* config = MtuConfigurationOption::Specialize(option.get());
        if (config->mtu_ < kMinimumClassicMtu) {
          LOG_WARN("Configuration request with Invalid MTU");
          config->mtu_ = kDefaultClassicMtu;
        if (config->mtu_ < initial_config_option.minimal_remote_mtu) {
          LOG_WARN("Configuration request with unacceptable MTU");
          config->mtu_ = initial_config_option.minimal_remote_mtu;
          rsp_options.emplace_back(std::make_unique<MtuConfigurationOption>(*config));
          result = ConfigurationResponseResult::UNACCEPTABLE_PARAMETERS;
        }
        configuration_state.outgoing_mtu_ = config->mtu_;
        break;
      }
      case ConfigurationOptionType::FLUSH_TIMEOUT: {
        // TODO: Handle this configuration option
        break;
      }
      case ConfigurationOptionType::RETRANSMISSION_AND_FLOW_CONTROL: {
@@ -342,8 +342,6 @@ void ClassicSignallingManager::OnConfigurationRequest(SignalId signal_id, Cid ci
    }
  }

  auto initial_config_option = dynamic_service_manager_->GetService(channel->GetPsm())->GetConfigOption();

  if (remote_rfc_mode == RetransmissionAndFlowControlModeOption::L2CAP_BASIC &&
      initial_config_option.channel_mode ==
          DynamicChannelConfigurationOption::RetransmissionAndFlowControlMode::ENHANCED_RETRANSMISSION) {
@@ -380,7 +378,6 @@ void ClassicSignallingManager::SendInitialConfigRequest(Cid local_cid) {

  auto mtu_configuration = std::make_unique<MtuConfigurationOption>();
  mtu_configuration->mtu_ = initial_config.incoming_mtu;
  configuration_state.incoming_mtu_ = initial_config.incoming_mtu;

  auto fcs_option = std::make_unique<FrameCheckSequenceOption>();
  fcs_option->fcs_type_ = FcsType::NO_FCS;
@@ -433,7 +430,6 @@ void ClassicSignallingManager::negotiate_configuration(Cid cid, Continuation is_
        // MTU is non-negotiable option. Use default mtu size
        auto mtu_configuration = std::make_unique<MtuConfigurationOption>();
        mtu_configuration->mtu_ = kDefaultClassicMtu;
        configuration_state.incoming_mtu_ = kDefaultClassicMtu;
        negotiation_config.emplace_back(std::move(mtu_configuration));
        can_negotiate = true;
        break;
@@ -530,12 +526,10 @@ void ClassicSignallingManager::OnConfigurationResponse(SignalId signal_id, Cid c
  for (auto& option : options) {
    switch (option->type_) {
      case ConfigurationOptionType::MTU: {
        auto config = MtuConfigurationOption::Specialize(option.get());
        configuration_state.incoming_mtu_ = config->mtu_;
        // Since they accepted our MTU, no need to read the new value.
        break;
      }
      case ConfigurationOptionType::FLUSH_TIMEOUT: {
        // TODO: Handle this configuration option
        break;
      }
      case ConfigurationOptionType::RETRANSMISSION_AND_FLOW_CONTROL: {