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

Commit 95a82cca authored by Hansong Zhang's avatar Hansong Zhang
Browse files

L2CAP: Store channel configuration on request

Bug: 141557006
Test: run_cert.sh
Change-Id: I4ce569097848ca829f1c0672ee9e3e379b21de5a
parent 3a7def0c
Loading
Loading
Loading
Loading
+32 −0
Original line number Diff line number Diff line
@@ -81,14 +81,46 @@ std::string DynamicChannelImpl::ToString() {
  return ss.str();
}

DynamicChannelImpl::ConfigurationStatus DynamicChannelImpl::GetOutgoingConfigurationStatus() const {
  return outgoing_configuration_status_;
}

void DynamicChannelImpl::SetOutgoingConfigurationStatus(ConfigurationStatus status) {
  outgoing_configuration_status_ = status;
}

DynamicChannelImpl::ConfigurationStatus DynamicChannelImpl::GetIncomingConfigurationStatus() const {
  return incoming_configuration_status_;
}

void DynamicChannelImpl::SetIncomingConfigurationStatus(ConfigurationStatus status) {
  incoming_configuration_status_ = status;
}

Mtu DynamicChannelImpl::GetIncomingMtu() const {
  return incoming_mtu_;
}

void DynamicChannelImpl::SetIncomingMtu(Mtu mtu) {
  incoming_mtu_ = mtu;
}

RetransmissionAndFlowControlModeOption DynamicChannelImpl::GetMode() const {
  return mode_;
}

void DynamicChannelImpl::SetMode(RetransmissionAndFlowControlModeOption mode) {
  mode_ = mode;
}

FcsType DynamicChannelImpl::GetFcsType() const {
  return fcs_type_;
}

void DynamicChannelImpl::SetFcsType(FcsType fcs_type) {
  fcs_type_ = fcs_type;
}

}  // namespace internal
}  // namespace classic
}  // namespace l2cap
+17 −6
Original line number Diff line number Diff line
@@ -20,6 +20,8 @@
#include "hci/address.h"
#include "l2cap/cid.h"
#include "l2cap/classic/dynamic_channel.h"
#include "l2cap/l2cap_packets.h"
#include "l2cap/mtu.h"
#include "l2cap/psm.h"
#include "os/handler.h"
#include "os/log.h"
@@ -67,16 +69,20 @@ class DynamicChannelImpl {

  enum class ConfigurationStatus { NOT_CONFIGURED, CONFIGURED };

  virtual ConfigurationStatus GetOutgoingConfigurationStatus() const;
  virtual void SetOutgoingConfigurationStatus(ConfigurationStatus status);

  virtual ConfigurationStatus GetIncomingConfigurationStatus() const;
  virtual void SetIncomingConfigurationStatus(ConfigurationStatus status);

  virtual ConfigurationStatus GetOutgoingConfigurationStatus() const {
    return outgoing_configuration_status_;
  }
  virtual Mtu GetIncomingMtu() const;
  virtual void SetIncomingMtu(Mtu mtu);

  virtual ConfigurationStatus GetIncomingConfigurationStatus() const {
    return incoming_configuration_status_;
  }
  virtual RetransmissionAndFlowControlModeOption GetMode() const;
  virtual void SetMode(RetransmissionAndFlowControlModeOption mode);

  virtual FcsType GetFcsType() const;
  virtual void SetFcsType(FcsType fcs_type);

 private:
  const Psm psm_;
@@ -99,6 +105,11 @@ class DynamicChannelImpl {
  ConfigurationStatus outgoing_configuration_status_ = ConfigurationStatus::NOT_CONFIGURED;
  ConfigurationStatus incoming_configuration_status_ = ConfigurationStatus::NOT_CONFIGURED;

  Mtu incoming_mtu_ = kDefaultClassicMtu;
  RetransmissionAndFlowControlModeOption mode_ = RetransmissionAndFlowControlModeOption::L2CAP_BASIC;
  // TODO: Add all RetransmissionAndFlowControlConfigurationOptions
  FcsType fcs_type_ = FcsType::NO_FCS;

  DISALLOW_COPY_AND_ASSIGN(DynamicChannelImpl);
};

+31 −1
Original line number Diff line number Diff line
@@ -183,12 +183,42 @@ void ClassicSignallingManager::OnConnectionResponse(SignalId signal_id, Cid remo
}

void ClassicSignallingManager::OnConfigurationRequest(SignalId signal_id, Cid cid, Continuation is_continuation,
                                                      std::vector<std::unique_ptr<ConfigurationOption>> option) {
                                                      std::vector<std::unique_ptr<ConfigurationOption>> options) {
  auto channel = channel_allocator_->FindChannelByCid(cid);
  if (channel == nullptr) {
    LOG_WARN("Configuration request for an unknown channel");
    return;
  }

  for (auto& option : options) {
    switch (option->type_) {
      case ConfigurationOptionType::MTU: {
        channel->SetIncomingMtu(MtuConfigurationOption::Specialize(option.get())->mtu_);
        break;
      }
      case ConfigurationOptionType::FLUSH_TIMEOUT: {
        // TODO: Handle this configuration option
        break;
      }
      case ConfigurationOptionType::RETRANSMISSION_AND_FLOW_CONTROL: {
        auto config = RetransmissionAndFlowControlConfigurationOption::Specialize(option.get());
        channel->SetMode(config->mode_);
        break;
      }
      case ConfigurationOptionType::FRAME_CHECK_SEQUENCE: {
        channel->SetFcsType(FrameCheckSequenceOption::Specialize(option.get())->fcs_type_);
        break;
      }
      default:
        LOG_WARN("Received some unsupported configuration option: %d", static_cast<int>(option->type_));
        auto response =
            ConfigurationResponseBuilder::Create(signal_id.Value(), channel->GetRemoteCid(), is_continuation,
                                                 ConfigurationResponseResult::UNKNOWN_OPTIONS, {});
        enqueue_buffer_->Enqueue(std::move(response), handler_);
        return;
    }
  }

  auto response = ConfigurationResponseBuilder::Create(signal_id.Value(), channel->GetRemoteCid(), is_continuation,
                                                       ConfigurationResponseResult::SUCCESS, {});
  enqueue_buffer_->Enqueue(std::move(response), handler_);