From 02539344fbacc749a20292d305efe9aff157a122 Mon Sep 17 00:00:00 2001 From: Francisco Date: Fri, 26 Feb 2021 15:14:11 +0000 Subject: [PATCH] move rx used buffers of mac::ue to separate cc buffer handler class --- srsenb/hdr/stack/mac/ue.h | 9 +++++---- srsenb/src/stack/mac/ue.cc | 26 +++++++++++++------------- 2 files changed, 18 insertions(+), 17 deletions(-) diff --git a/srsenb/hdr/stack/mac/ue.h b/srsenb/hdr/stack/mac/ue.h index 98df8d68e..ed5a3e88a 100644 --- a/srsenb/hdr/stack/mac/ue.h +++ b/srsenb/hdr/stack/mac/ue.h @@ -46,16 +46,18 @@ public: cc_softbuffer_tx_list_t& get_tx_softbuffer() { return softbuffer_tx; } cc_softbuffer_rx_list_t& get_rx_softbuffer() { return softbuffer_rx; } - - srslte::byte_buffer_t* get_tx_payload_buffer(size_t harq_pid, size_t tb) + srslte::byte_buffer_t* get_tx_payload_buffer(size_t harq_pid, size_t tb) { return tx_payload_buffer[harq_pid][tb].get(); } + std::map& get_rx_used_buffers() { return rx_used_buffers; } private: cc_softbuffer_tx_list_t softbuffer_tx; ///< List of softbuffer lists for Tx cc_softbuffer_rx_list_t softbuffer_rx; ///< List of softbuffer lists for Rx + std::map rx_used_buffers; + // One buffer per TB per HARQ process and per carrier is needed for each UE. std::array, SRSLTE_FDD_NOF_HARQ> tx_payload_buffer; }; @@ -146,8 +148,7 @@ private: std::vector cc_buffers; - std::mutex rx_buffers_mutex; - std::vector > rx_used_buffers; + std::mutex rx_buffers_mutex; srslte::block_queue pending_ta_commands; ta ta_fsm; diff --git a/srsenb/src/stack/mac/ue.cc b/srsenb/src/stack/mac/ue.cc index 7894eda88..ae81f2669 100644 --- a/srsenb/src/stack/mac/ue.cc +++ b/srsenb/src/stack/mac/ue.cc @@ -56,7 +56,6 @@ ue::ue(uint16_t rnti_, pdus(logger, 128), nof_rx_harq_proc(nof_rx_harq_proc_), nof_tx_harq_proc(nof_tx_harq_proc_), - rx_used_buffers(nof_cells_), ta_fsm(this) { cc_buffers.resize(nof_cells_); @@ -80,11 +79,11 @@ ue::~ue() } { std::unique_lock lock(rx_buffers_mutex); - for (auto& rx_buffers_cc : rx_used_buffers) { - for (auto& q : rx_buffers_cc) { + for (auto& cc : cc_buffers) { + for (auto& q : cc.get_rx_used_buffers()) { pdus.deallocate(q.second); } - rx_buffers_cc.clear(); + cc.get_rx_softbuffer().clear(); } } } @@ -163,10 +162,10 @@ uint8_t* ue::request_buffer(uint32_t tti, uint32_t ue_cc_idx, const uint32_t len uint8_t* pdu = nullptr; if (len > 0) { // Deallocate oldest buffer if we didn't deallocate it - if (!rx_used_buffers.at(ue_cc_idx).count(tti)) { + if (!cc_buffers.at(ue_cc_idx).get_rx_used_buffers().count(tti)) { pdu = pdus.request(len); if (pdu) { - rx_used_buffers.at(ue_cc_idx).emplace(tti, pdu); + cc_buffers.at(ue_cc_idx).get_rx_used_buffers().emplace(tti, pdu); } else { logger.error("UE buffers: Requesting buffer from pool"); } @@ -184,7 +183,8 @@ void ue::clear_old_buffers(uint32_t tti) std::unique_lock lock(rx_buffers_mutex); // remove old buffers - for (auto& rx_buffer_cc : rx_used_buffers) { + for (auto& cc : cc_buffers) { + auto& rx_buffer_cc = cc.get_rx_used_buffers(); for (auto it = rx_buffer_cc.begin(); it != rx_buffer_cc.end();) { if (srslte_tti_interval(tti, it->first) > 20 && srslte_tti_interval(tti, it->first) < 500) { logger.warning("UE buffers: Removing old buffer tti=%d, rnti=%d, now is %d, interval=%d", @@ -325,9 +325,9 @@ void ue::deallocate_pdu(uint32_t tti, uint32_t ue_cc_idx) { std::unique_lock lock(rx_buffers_mutex); - if (rx_used_buffers.at(ue_cc_idx).count(tti)) { - pdus.deallocate(rx_used_buffers.at(ue_cc_idx).at(tti)); - rx_used_buffers.at(ue_cc_idx).erase(tti); + if (cc_buffers.at(ue_cc_idx).get_rx_used_buffers().count(tti)) { + pdus.deallocate(cc_buffers.at(ue_cc_idx).get_rx_used_buffers().at(tti)); + cc_buffers.at(ue_cc_idx).get_rx_used_buffers().erase(tti); } else { logger.warning("UE buffers: Null RX PDU pointer in deallocate_pdu for rnti=0x%x pid=%d cc_idx=%d", rnti, @@ -339,13 +339,13 @@ void ue::deallocate_pdu(uint32_t tti, uint32_t ue_cc_idx) void ue::push_pdu(uint32_t tti, uint32_t ue_cc_idx, uint32_t len) { std::unique_lock lock(rx_buffers_mutex); - if (rx_used_buffers.at(ue_cc_idx).count(tti)) { + if (cc_buffers.at(ue_cc_idx).get_rx_used_buffers().count(tti)) { if (len > 0) { - pdus.push(rx_used_buffers.at(ue_cc_idx).at(tti), len); + pdus.push(cc_buffers.at(ue_cc_idx).get_rx_used_buffers().at(tti), len); } else { logger.error("Error pushing PDU: null length"); } - rx_used_buffers.at(ue_cc_idx).erase(tti); + cc_buffers.at(ue_cc_idx).get_rx_used_buffers().erase(tti); } else { logger.warning("UE buffers: Null RX PDU pointer in push_pdu for rnti=0x%x pid=%d cc_idx=%d", rnti,