diff --git a/srsenb/hdr/stack/mac/common/sched_config.h b/srsenb/hdr/stack/mac/common/sched_config.h new file mode 100644 index 000000000..94bdf663c --- /dev/null +++ b/srsenb/hdr/stack/mac/common/sched_config.h @@ -0,0 +1,37 @@ +/** + * + * \section COPYRIGHT + * + * Copyright 2013-2021 Software Radio Systems Limited + * + * By using this file, you agree to the terms and conditions set + * forth in the LICENSE file which can be found at the top level of + * the distribution. + * + */ + +#ifndef SRSRAN_SCHED_CONFIG_H +#define SRSRAN_SCHED_CONFIG_H + +#include + +namespace srsenb { + +/** + * Structure used in UE logical channel configuration + */ +struct logical_channel_cfg_t { + enum direction_t { IDLE = 0, UL, DL, BOTH } direction = IDLE; + int priority = 1; // channel priority (1 is highest) + uint32_t bsd = 1000; // msec + uint32_t pbr = -1; // prioritised bit rate + int group = 0; // logical channel group + + bool is_active() const { return direction != IDLE; } + bool is_dl() const { return direction == DL or direction == BOTH; } + bool is_ul() const { return direction == UL or direction == BOTH; } +}; + +} // namespace srsenb + +#endif // SRSRAN_SCHED_CONFIG_H diff --git a/srsenb/hdr/stack/mac/nr/sched_nr_ue.h b/srsenb/hdr/stack/mac/nr/sched_nr_ue.h index 678708486..79f0d503e 100644 --- a/srsenb/hdr/stack/mac/nr/sched_nr_ue.h +++ b/srsenb/hdr/stack/mac/nr/sched_nr_ue.h @@ -16,6 +16,7 @@ #include "sched_nr_cfg.h" #include "sched_nr_harq.h" #include "sched_nr_interface.h" +#include "sched_nr_ue_buffer_manager.h" #include "srsran/adt/circular_map.h" #include "srsran/adt/move_callback.h" #include "srsran/adt/pool/cached_alloc.h" @@ -52,8 +53,8 @@ public: slot_point uci_slot; uint32_t dl_cqi = 0; uint32_t ul_cqi = 0; - dl_harq_proc* h_dl = nullptr; - ul_harq_proc* h_ul = nullptr; + dl_harq_proc* h_dl = nullptr; + ul_harq_proc* h_ul = nullptr; }; class ue_carrier @@ -88,6 +89,7 @@ public: const ue_cfg_t& cfg() const { return ue_cfg; } void ul_sr_info(slot_point slot_rx) { pending_sr = true; } + void ul_bsr(uint32_t lcg, uint32_t bsr_val) { buffers.ul_bsr(lcg, bsr_val); } bool has_ca() const { return ue_cfg.carriers.size() > 1; } uint32_t pcell_cc() const { return ue_cfg.carriers[0].cc; } @@ -98,7 +100,8 @@ private: const uint16_t rnti; const sched_params& sched_cfg; - bool pending_sr = false; + bool pending_sr = false; + ue_buffer_manager buffers; ue_cfg_t ue_cfg; }; diff --git a/srsenb/hdr/stack/mac/nr/sched_nr_ue_buffer_manager.h b/srsenb/hdr/stack/mac/nr/sched_nr_ue_buffer_manager.h new file mode 100644 index 000000000..ec88132c0 --- /dev/null +++ b/srsenb/hdr/stack/mac/nr/sched_nr_ue_buffer_manager.h @@ -0,0 +1,66 @@ +/** + * + * \section COPYRIGHT + * + * Copyright 2013-2021 Software Radio Systems Limited + * + * By using this file, you agree to the terms and conditions set + * forth in the LICENSE file which can be found at the top level of + * the distribution. + * + */ + +#ifndef SRSRAN_SCHED_NR_UE_BUFFER_MANAGER_H +#define SRSRAN_SCHED_NR_UE_BUFFER_MANAGER_H + +#include "srsenb/hdr/stack/mac/common/sched_config.h" +#include "srsran/srslog/srslog.h" +#include "srsran/support/srsran_assert.h" + +namespace srsenb { +namespace sched_nr_impl { + +class ue_buffer_manager +{ + const static uint32_t MAX_LCG_ID = 7; + const static uint32_t MAX_LC_ID = 32; + const static uint32_t MAX_SRB_LC_ID = 3; + +public: + explicit ue_buffer_manager(srslog::basic_logger& logger_); + + // Configuration getters + bool is_channel_active(uint32_t lcid) const { return get_cfg(lcid).is_active(); } + bool is_bearer_ul(uint32_t lcid) const { return get_cfg(lcid).is_ul(); } + bool is_bearer_dl(uint32_t lcid) const { return get_cfg(lcid).is_dl(); } + const logical_channel_cfg_t& get_cfg(uint32_t lcid) const + { + srsran_assert(lcid < MAX_LC_ID, "Provided LCID=%d is above limit=%d", lcid, MAX_LC_ID); + return channels[lcid].cfg; + } + + // Buffer Status update + void ul_bsr(uint32_t lcg_id, uint32_t val); + void dl_buffer_state(uint8_t lcid, uint32_t tx_queue, uint32_t retx_queue); + + // UL BSR methods + bool is_lcg_active(uint32_t lcg) const; + int get_bsr(uint32_t lcg) const; + +private: + srslog::basic_logger& logger; + + struct logical_channel { + logical_channel_cfg_t cfg; + int buf_tx = 0; + int buf_retx = 0; + }; + std::array channels; + + std::array lcg_bsr{0}; +}; + +} // namespace sched_nr_impl +} // namespace srsenb + +#endif // SRSRAN_SCHED_NR_UE_BUFFER_MANAGER_H diff --git a/srsenb/src/stack/mac/nr/CMakeLists.txt b/srsenb/src/stack/mac/nr/CMakeLists.txt index 7d3c3f536..5ca49c739 100644 --- a/srsenb/src/stack/mac/nr/CMakeLists.txt +++ b/srsenb/src/stack/mac/nr/CMakeLists.txt @@ -19,6 +19,7 @@ set(SOURCES mac_nr.cc sched_nr_cell.cc sched_nr_rb.cc sched_nr_time_rr.cc - harq_softbuffer.cc) + harq_softbuffer.cc + sched_nr_ue_buffer_manager.cc) add_library(srsgnb_mac STATIC ${SOURCES}) diff --git a/srsenb/src/stack/mac/nr/sched_nr_ue.cc b/srsenb/src/stack/mac/nr/sched_nr_ue.cc index f0ad196d9..6d3cf5509 100644 --- a/srsenb/src/stack/mac/nr/sched_nr_ue.cc +++ b/srsenb/src/stack/mac/nr/sched_nr_ue.cc @@ -12,6 +12,7 @@ #include "srsenb/hdr/stack/mac/nr/sched_nr_ue.h" #include "srsenb/hdr/stack/mac/nr/sched_nr_pdcch.h" +#include "srsran/common/string_helpers.h" namespace srsenb { namespace sched_nr_impl { @@ -83,7 +84,7 @@ slot_ue ue_carrier::try_reserve(slot_point pdcch_slot) /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// ue::ue(uint16_t rnti_, const ue_cfg_t& cfg, const sched_params& sched_cfg_) : - rnti(rnti_), sched_cfg(sched_cfg_), ue_cfg(cfg) + rnti(rnti_), sched_cfg(sched_cfg_), ue_cfg(cfg), buffers(srslog::fetch_basic_logger(sched_cfg_.sched_cfg.logger_name)) { for (uint32_t cc = 0; cc < cfg.carriers.size(); ++cc) { if (cfg.carriers[cc].active) { diff --git a/srsenb/src/stack/mac/nr/sched_nr_ue_buffer_manager.cc b/srsenb/src/stack/mac/nr/sched_nr_ue_buffer_manager.cc new file mode 100644 index 000000000..ac0a27b55 --- /dev/null +++ b/srsenb/src/stack/mac/nr/sched_nr_ue_buffer_manager.cc @@ -0,0 +1,70 @@ +/** + * + * \section COPYRIGHT + * + * Copyright 2013-2021 Software Radio Systems Limited + * + * By using this file, you agree to the terms and conditions set + * forth in the LICENSE file which can be found at the top level of + * the distribution. + * + */ + +#include "srsenb/hdr/stack/mac/nr/sched_nr_ue_buffer_manager.h" +#include "srsran/common/string_helpers.h" +#include "srsran/srslog/bundled/fmt/format.h" +#include "srsran/srslog/bundled/fmt/ranges.h" + +namespace srsenb { +namespace sched_nr_impl { + +ue_buffer_manager::ue_buffer_manager(srslog::basic_logger& logger_) : logger(logger_) {} + +bool ue_buffer_manager::is_lcg_active(uint32_t lcg) const +{ + if (lcg == 0) { + return true; + } + for (uint32_t lcid = 0; lcid < MAX_LC_ID; ++lcid) { + if (is_bearer_ul(lcid) and channels[lcid].cfg.group == (int)lcg) { + return true; + } + } + return false; +} + +int ue_buffer_manager::get_bsr(uint32_t lcg) const +{ + return is_lcg_active(lcg) ? lcg_bsr[lcg] : 0; +} + +void ue_buffer_manager::ul_bsr(uint32_t lcg_id, uint32_t val) +{ + srsran_assert(lcg_id < MAX_LCG_ID, "Provided LCG_ID=%d is above its limit=%d", lcg_id, MAX_LCG_ID); + lcg_bsr[lcg_id] = val; + + if (logger.debug.enabled()) { + fmt::memory_buffer str_buffer; + fmt::format_to(str_buffer, "{}", lcg_bsr); + logger.debug("SCHED: lcg_id=%d, bsr=%s. Current state=%s", lcg_id, val, srsran::to_c_str(str_buffer)); + } +} + +void ue_buffer_manager::dl_buffer_state(uint8_t lcid, uint32_t tx_queue, uint32_t retx_queue) +{ + if (lcid >= MAX_LC_ID) { + logger.warning("The provided lcid=%d is not valid", lcid); + return; + } + if (lcid <= MAX_SRB_LC_ID and + (channels[lcid].buf_tx != (int)tx_queue or channels[lcid].buf_retx != (int)retx_queue)) { + logger.info("SCHED: DL lcid=%d buffer_state=%d,%d", lcid, tx_queue, retx_queue); + } else { + logger.debug("SCHED: DL lcid=%d buffer_state=%d,%d", lcid, tx_queue, retx_queue); + } + channels[lcid].buf_retx = retx_queue; + channels[lcid].buf_tx = tx_queue; +} + +} // namespace sched_nr_impl +} // namespace srsenb