Merge "L2CAP Allow updating ERTM config and FCS" am: c82a7f9f15
am: 384975540b
Change-Id: I7c58fe5a16be810ac6e314dea37962c6604064d0
diff --git a/gd/l2cap/classic/internal/dynamic_channel_impl.cc b/gd/l2cap/classic/internal/dynamic_channel_impl.cc
index ba613a6..c0614f9 100644
--- a/gd/l2cap/classic/internal/dynamic_channel_impl.cc
+++ b/gd/l2cap/classic/internal/dynamic_channel_impl.cc
@@ -102,21 +102,17 @@
sender_ = sender;
}
-Mtu DynamicChannelImpl::GetIncomingMtu() const {
- return incoming_mtu_;
-}
-
void DynamicChannelImpl::SetIncomingMtu(Mtu mtu) {
- incoming_mtu_ = mtu;
+ sender_->SetIncomingMtu(mtu);
}
void DynamicChannelImpl::SetRetransmissionFlowControlConfig(
const RetransmissionAndFlowControlConfigurationOption& option) {
- sender_->SetChannelRetransmissionFlowControlMode(option.mode_);
+ sender_->SetChannelRetransmissionFlowControlMode(option);
}
void DynamicChannelImpl::SetFcsType(FcsType fcs_type) {
- fcs_type_ = fcs_type;
+ sender_->SetFcsType(fcs_type);
}
} // namespace internal
diff --git a/gd/l2cap/classic/internal/dynamic_channel_impl.h b/gd/l2cap/classic/internal/dynamic_channel_impl.h
index ac1f02c..95be5c7 100644
--- a/gd/l2cap/classic/internal/dynamic_channel_impl.h
+++ b/gd/l2cap/classic/internal/dynamic_channel_impl.h
@@ -82,7 +82,6 @@
*/
void SetSender(l2cap::internal::Sender* sender) override;
- virtual Mtu GetIncomingMtu() const;
virtual void SetIncomingMtu(Mtu mtu);
virtual void SetRetransmissionFlowControlConfig(const RetransmissionAndFlowControlConfigurationOption& mode);
@@ -114,9 +113,6 @@
ConfigurationStatus incoming_configuration_status_ = ConfigurationStatus::NOT_CONFIGURED;
l2cap::internal::Sender* sender_ = nullptr;
- Mtu incoming_mtu_ = kDefaultClassicMtu;
- // TODO: Add all RetransmissionAndFlowControlConfigurationOptions
- FcsType fcs_type_ = FcsType::DEFAULT;
DISALLOW_COPY_AND_ASSIGN(DynamicChannelImpl);
};
diff --git a/gd/l2cap/classic/internal/signalling_manager.cc b/gd/l2cap/classic/internal/signalling_manager.cc
index 66a3f51..7398c17 100644
--- a/gd/l2cap/classic/internal/signalling_manager.cc
+++ b/gd/l2cap/classic/internal/signalling_manager.cc
@@ -310,7 +310,6 @@
return;
}
- RetransmissionAndFlowControlConfigurationOption rfc_option;
channel->SetOutgoingConfigurationStatus(DynamicChannelImpl::ConfigurationStatus::CONFIGURED);
if (channel->GetIncomingConfigurationStatus() == DynamicChannelImpl::ConfigurationStatus::CONFIGURED) {
std::unique_ptr<DynamicChannel> user_channel = std::make_unique<DynamicChannel>(channel, handler_);
diff --git a/gd/l2cap/internal/basic_mode_channel_data_controller.h b/gd/l2cap/internal/basic_mode_channel_data_controller.h
index c19fb93..41d03fa 100644
--- a/gd/l2cap/internal/basic_mode_channel_data_controller.h
+++ b/gd/l2cap/internal/basic_mode_channel_data_controller.h
@@ -50,6 +50,9 @@
std::unique_ptr<BasicFrameBuilder> GetNextPacket() override;
+ void EnableFcs(bool enabled) override {}
+ void SetRetransmissionAndFlowControlOptions(const RetransmissionAndFlowControlConfigurationOption& option) override {}
+
private:
Cid cid_;
Cid remote_cid_;
diff --git a/gd/l2cap/internal/data_controller.h b/gd/l2cap/internal/data_controller.h
index 18cff2a..33bfbcf 100644
--- a/gd/l2cap/internal/data_controller.h
+++ b/gd/l2cap/internal/data_controller.h
@@ -38,6 +38,14 @@
// Used by Scheduler to get next PDU
virtual std::unique_ptr<BasicFrameBuilder> GetNextPacket() = 0;
+
+ // Set FCS mode. This only applies to some modes (ERTM).
+ virtual void EnableFcs(bool enabled) = 0;
+
+ // Set retransmission and flow control. Ignore the mode option because each DataController only handles one mode.
+ // This only applies to some modes (ERTM).
+ virtual void SetRetransmissionAndFlowControlOptions(
+ const RetransmissionAndFlowControlConfigurationOption& option) = 0;
};
} // namespace internal
diff --git a/gd/l2cap/internal/enhanced_retransmission_mode_channel_data_controller.cc b/gd/l2cap/internal/enhanced_retransmission_mode_channel_data_controller.cc
index 3e5042d..08a4bbe 100644
--- a/gd/l2cap/internal/enhanced_retransmission_mode_channel_data_controller.cc
+++ b/gd/l2cap/internal/enhanced_retransmission_mode_channel_data_controller.cc
@@ -875,11 +875,23 @@
}
}
+void ErtmController::EnableFcs(bool enabled) {
+ fcs_enabled_ = enabled;
+}
+
void ErtmController::send_pdu(std::unique_ptr<BasicFrameBuilder> pdu) {
pdu_queue_.emplace(std::move(pdu));
scheduler_->OnPacketsReady(cid_, 1);
}
+void ErtmController::SetRetransmissionAndFlowControlOptions(
+ const RetransmissionAndFlowControlConfigurationOption& option) {
+ local_tx_window_ = option.tx_window_size_;
+ local_max_transmit_ = option.max_transmit_;
+ local_retransmit_timeout_ms_ = option.retransmission_time_out_;
+ local_monitor_timeout_ms_ = option.monitor_time_out_;
+}
+
void ErtmController::close_channel() {
// TODO: Get a reference to signalling manager
}
diff --git a/gd/l2cap/internal/enhanced_retransmission_mode_channel_data_controller.h b/gd/l2cap/internal/enhanced_retransmission_mode_channel_data_controller.h
index 0566e0b..2038fd3 100644
--- a/gd/l2cap/internal/enhanced_retransmission_mode_channel_data_controller.h
+++ b/gd/l2cap/internal/enhanced_retransmission_mode_channel_data_controller.h
@@ -49,16 +49,17 @@
void OnSdu(std::unique_ptr<packet::BasePacketBuilder> sdu) override;
void OnPdu(BasicFrameView pdu) override;
std::unique_ptr<BasicFrameBuilder> GetNextPacket() override;
+ void EnableFcs(bool enabled) override;
+ void SetRetransmissionAndFlowControlOptions(const RetransmissionAndFlowControlConfigurationOption& option) override;
private:
- [[maybe_unused]] Cid cid_;
- [[maybe_unused]] Cid remote_cid_;
- [[maybe_unused]] os::EnqueueBuffer<UpperEnqueue> enqueue_buffer_;
- [[maybe_unused]] os::Handler* handler_;
+ Cid cid_;
+ Cid remote_cid_;
+ os::EnqueueBuffer<UpperEnqueue> enqueue_buffer_;
+ os::Handler* handler_;
std::queue<std::unique_ptr<BasicFrameBuilder>> pdu_queue_;
- [[maybe_unused]] Scheduler* scheduler_;
- // TODO: Support FCS
- [[maybe_unused]] FcsType fcs_type_ = FcsType::NO_FCS;
+ Scheduler* scheduler_;
+ bool fcs_enabled_ = false;
class PacketViewForReassembly : public packet::PacketView<kLittleEndian> {
public:
@@ -89,7 +90,6 @@
void close_channel();
// Configuration options
- // TODO: Configure these number
uint16_t local_tx_window_ = 10;
uint16_t local_max_transmit_ = 20;
uint16_t local_retransmit_timeout_ms_ = 2000;
diff --git a/gd/l2cap/internal/sender.cc b/gd/l2cap/internal/sender.cc
index ffe2755..7fe1dd7 100644
--- a/gd/l2cap/internal/sender.cc
+++ b/gd/l2cap/internal/sender.cc
@@ -55,22 +55,28 @@
return data_controller_->GetNextPacket();
}
-void Sender::SetChannelRetransmissionFlowControlMode(RetransmissionAndFlowControlModeOption mode) {
- if (mode_ == mode) {
+void Sender::SetChannelRetransmissionFlowControlMode(const RetransmissionAndFlowControlConfigurationOption& option) {
+ if (mode_ == option.mode_) {
return;
}
- if (mode == RetransmissionAndFlowControlModeOption::L2CAP_BASIC) {
+ if (option.mode_ == RetransmissionAndFlowControlModeOption::L2CAP_BASIC) {
data_controller_ =
std::make_unique<BasicModeDataController>(channel_id_, remote_channel_id_, queue_end_, handler_, scheduler_);
return;
}
- if (mode == RetransmissionAndFlowControlModeOption::ENHANCED_RETRANSMISSION) {
+ if (option.mode_ == RetransmissionAndFlowControlModeOption::ENHANCED_RETRANSMISSION) {
data_controller_ =
std::make_unique<ErtmController>(channel_id_, remote_channel_id_, queue_end_, handler_, scheduler_);
+ data_controller_->SetRetransmissionAndFlowControlOptions(option);
return;
}
}
+void Sender::SetFcsType(FcsType fcs_type) {
+ // TODO: FCS is enabled when "not both side explicitly disable it".
+ data_controller_->EnableFcs(fcs_type == FcsType::DEFAULT);
+}
+
void Sender::SetIncomingMtu(Mtu mtu) {
// TODO: Enforce MTU
}
diff --git a/gd/l2cap/internal/sender.h b/gd/l2cap/internal/sender.h
index 22f7737..850a88d 100644
--- a/gd/l2cap/internal/sender.h
+++ b/gd/l2cap/internal/sender.h
@@ -25,6 +25,7 @@
#include "l2cap/cid.h"
#include "l2cap/internal/channel_impl.h"
#include "l2cap/internal/data_controller.h"
+#include "l2cap/l2cap_packets.h"
#include "l2cap/mtu.h"
#include "os/handler.h"
#include "os/queue.h"
@@ -60,8 +61,8 @@
*/
std::unique_ptr<UpperDequeue> GetNextPacket();
- void SetChannelRetransmissionFlowControlMode(RetransmissionAndFlowControlModeOption mode);
-
+ void SetChannelRetransmissionFlowControlMode(const RetransmissionAndFlowControlConfigurationOption& option);
+ void SetFcsType(FcsType fcs_type);
void SetIncomingMtu(Mtu mtu);
DataController* GetDataController();