From 946ead06e804623a5ace1adb523d28d975593ab8 Mon Sep 17 00:00:00 2001 From: Francisco Paisana Date: Tue, 17 Sep 2019 17:09:57 +0100 Subject: [PATCH] using an interface between the stack and lower mac to process demux pdus. --- lib/include/srslte/interfaces/ue_interfaces.h | 7 ++ srsue/hdr/stack/mac/mac.h | 38 +++---- srsue/hdr/stack/ue_stack_lte.h | 6 +- srsue/src/stack/mac/mac.cc | 94 ++++------------ srsue/src/stack/ue_stack_lte.cc | 12 +- srsue/test/mac_test.cc | 104 ++++++++++-------- 6 files changed, 119 insertions(+), 142 deletions(-) diff --git a/lib/include/srslte/interfaces/ue_interfaces.h b/lib/include/srslte/interfaces/ue_interfaces.h index 826dfaa11..c9dc1011e 100644 --- a/lib/include/srslte/interfaces/ue_interfaces.h +++ b/lib/include/srslte/interfaces/ue_interfaces.h @@ -630,6 +630,13 @@ class gw_interface_stack : public gw_interface_nas, public gw_interface_rrc, pub { }; +// STACK interface for MAC +class stack_interface_mac +{ +public: + virtual void process_pdus() = 0; +}; + // Combined interface for PHY to access stack (MAC and RRC) class stack_interface_phy_lte : public mac_interface_phy_lte, public rrc_interface_phy_lte { diff --git a/srsue/hdr/stack/mac/mac.h b/srsue/hdr/stack/mac/mac.h index 822372bed..62d1bc381 100644 --- a/srsue/hdr/stack/mac/mac.h +++ b/srsue/hdr/stack/mac/mac.h @@ -51,7 +51,11 @@ class mac : public mac_interface_phy_lte, public: mac(srslte::log* log_); ~mac(); - bool init(phy_interface_mac_lte* phy, rlc_interface_mac* rlc, rrc_interface_mac* rrc, srslte::timers* timers_); + bool init(phy_interface_mac_lte* phy, + rlc_interface_mac* rlc, + rrc_interface_mac* rrc, + srslte::timers* timers_, + stack_interface_mac* stack); void stop(); void get_metrics(mac_metrics_t m[SRSLTE_MAX_CARRIERS]); @@ -95,9 +99,11 @@ public: void start_noncont_ho(uint32_t preamble_index, uint32_t prach_mask); void start_cont_ho(); - void get_rntis(ue_rnti_t *rntis); + void get_rntis(ue_rnti_t* rntis); void set_ho_rnti(uint16_t crnti, uint16_t target_pci); + void process_pdus(); + void start_pcap(srslte::mac_pcap* pcap); // Timer callback interface @@ -118,11 +124,12 @@ private: static const int MAC_MAIN_THREAD_PRIO = -1; // Use default high-priority below UHD static const int MAC_PDU_THREAD_PRIO = 5; - // Interaction with PHY - phy_interface_mac_lte *phy_h; - rlc_interface_mac *rlc_h; - rrc_interface_mac *rrc_h; - srslte::log *log_h; + // Interaction with PHY + phy_interface_mac_lte* phy_h = nullptr; + rlc_interface_mac* rlc_h = nullptr; + rrc_interface_mac* rrc_h = nullptr; + stack_interface_mac* stack_h = nullptr; + srslte::log* log_h; mac_interface_phy_lte::mac_phy_cfg_mbsfn_t phy_mbsfn_cfg; // RNTI search window scheduling @@ -172,23 +179,6 @@ private: mac_metrics_t metrics[SRSLTE_MAX_CARRIERS] = {}; bool initialized = false; - - /* Class to process MAC PDUs from DEMUX unit */ - class pdu_process : public thread { - public: - explicit pdu_process(demux* demux_unit); - ~pdu_process(); - void notify(); - void stop(); - private: - void run_thread() final; - bool running = false; - bool have_data = false; - std::mutex mutex; - std::condition_variable cvar; - demux* demux_unit = nullptr; - }; - pdu_process pdu_process_thread; }; } // namespace srsue diff --git a/srsue/hdr/stack/ue_stack_lte.h b/srsue/hdr/stack/ue_stack_lte.h index a90f7acee..efa4c7582 100644 --- a/srsue/hdr/stack/ue_stack_lte.h +++ b/srsue/hdr/stack/ue_stack_lte.h @@ -52,6 +52,7 @@ namespace srsue { class ue_stack_lte final : public ue_stack_base, public stack_interface_phy_lte, public stack_interface_gw, + public stack_interface_mac, public thread { public: @@ -111,6 +112,9 @@ public: bool is_lcid_enabled(uint32_t lcid) final { return pdcp.is_lcid_enabled(lcid); } + // Interface to upper MAC + void process_pdus() final; + private: void run_thread() final; void run_tti_impl(uint32_t tti); @@ -158,7 +162,7 @@ private: void operator()() { func(this); } }; srslte::multiqueue_handler pending_tasks; - int sync_queue_id = -1, ue_queue_id = -1, gw_queue_id = -1; + int sync_queue_id = -1, ue_queue_id = -1, gw_queue_id = -1, mac_queue_id = -1; }; } // namespace srsue diff --git a/srsue/src/stack/mac/mac.cc b/srsue/src/stack/mac/mac.cc index a03ec42ca..a32bb2e2d 100644 --- a/srsue/src/stack/mac/mac.cc +++ b/srsue/src/stack/mac/mac.cc @@ -37,13 +37,7 @@ using namespace asn1::rrc; namespace srsue { -mac::mac(srslte::log* log_) : - pdu_process_thread(&demux_unit), - mch_msg(10, log_), - mux_unit(log_), - demux_unit(log_), - pcap(nullptr), - log_h(log_) +mac::mac(srslte::log* log_) : mch_msg(10, log_), mux_unit(log_), demux_unit(log_), pcap(nullptr), log_h(log_) { // Create PCell HARQ entities auto ul = ul_harq_entity_ptr(new ul_harq_entity()); @@ -71,12 +65,17 @@ mac::~mac() srslte_softbuffer_rx_free(&mch_softbuffer); } -bool mac::init(phy_interface_mac_lte* phy, rlc_interface_mac* rlc, rrc_interface_mac* rrc, srslte::timers* timers_) +bool mac::init(phy_interface_mac_lte* phy, + rlc_interface_mac* rlc, + rrc_interface_mac* rrc, + srslte::timers* timers_, + stack_interface_mac* stack_) { - phy_h = phy; - rlc_h = rlc; - rrc_h = rrc; - timers = timers_; + phy_h = phy; + rlc_h = rlc; + rrc_h = rrc; + timers = timers_; + stack_h = stack_; timer_alignment = timers->get_unique_id(); uint32_t contention_resolution_timer = timers->get_unique_id(); @@ -107,7 +106,6 @@ bool mac::init(phy_interface_mac_lte* phy, rlc_interface_mac* rlc, rrc_interface void mac::stop() { if (initialized) { - pdu_process_thread.stop(); run_tti(0); // make sure it's not locked after last TTI initialized = false; } @@ -388,7 +386,7 @@ void mac::mch_decoded(uint32_t len, bool crc) } demux_unit.push_pdu_mch(mch_payload_buffer, len); - pdu_process_thread.notify(); + stack_h->process_pdus(); if (pcap) { pcap->write_dl_mch(mch_payload_buffer, len, true, phy_h->get_current_tti()); } @@ -415,7 +413,7 @@ void mac::tb_decoded(uint32_t cc_idx, mac_grant_dl_t grant, bool ack[SRSLTE_MAX_ } else { dl_harq.at(cc_idx)->tb_decoded(grant, ack); - pdu_process_thread.notify(); + stack_h->process_pdus(); for (uint32_t tb = 0; tb < SRSLTE_MAX_CODEWORDS; tb++) { if (grant.tb[tb].tbs) { @@ -461,6 +459,14 @@ void mac::new_grant_dl(uint32_t cc_idx, } } +void mac::process_pdus() +{ + bool have_data = true; + while (initialized and have_data) { + have_data = demux_unit.process_pdus(); + } +} + uint32_t mac::get_current_tti() { return phy_h->get_current_tti(); @@ -619,9 +625,7 @@ void mac::get_metrics(mac_metrics_t m[SRSLTE_MAX_CARRIERS]) int rx_brate = 0; int ul_buffer = 0; float dl_avg_ret = 0; - float ul_avg_ret = 0; int dl_avg_ret_count = 0; - int ul_avg_ret_count = 0; for (uint32_t r = 0; r < dl_harq.size(); r++) { tx_pkts += metrics[r].tx_pkts; @@ -674,58 +678,4 @@ uint32_t mac::timer_get_unique_id() return timers->get_unique_id(); } -/******************************************************** - * - * Class that runs a thread to process DL MAC PDUs from - * DEMUX unit - * - *******************************************************/ -mac::pdu_process::pdu_process(demux* demux_unit_) : thread("MAC_PDU_PROCESS"), demux_unit(demux_unit_) -{ - running = true; - start(MAC_PDU_THREAD_PRIO); -} - -mac::pdu_process::~pdu_process() -{ - if (running) { - stop(); - } -} - -void mac::pdu_process::stop() -{ - if (running) { - { - std::lock_guard ul(mutex); - running = false; - cvar.notify_all(); - } - wait_thread_finish(); - } -} - -void mac::pdu_process::notify() -{ - std::unique_lock ul(mutex); - have_data = true; - cvar.notify_all(); -} - -void mac::pdu_process::run_thread() -{ - while(running) { - have_data = demux_unit->process_pdus(); - if (!have_data) { - std::unique_lock ul(mutex); - while(!have_data && running) { - cvar.wait(ul); - } - } - } -} - -} - - - +} // namespace srsue diff --git a/srsue/src/stack/ue_stack_lte.cc b/srsue/src/stack/ue_stack_lte.cc index 30a694a16..c22b281eb 100644 --- a/srsue/src/stack/ue_stack_lte.cc +++ b/srsue/src/stack/ue_stack_lte.cc @@ -44,6 +44,7 @@ ue_stack_lte::ue_stack_lte() : ue_queue_id = pending_tasks.add_queue(); sync_queue_id = pending_tasks.add_queue(); gw_queue_id = pending_tasks.add_queue(); + mac_queue_id = pending_tasks.add_queue(); } ue_stack_lte::~ue_stack_lte() @@ -119,7 +120,7 @@ int ue_stack_lte::init(const stack_args_t& args_, srslte::logger* logger_) return SRSLTE_ERROR; } - mac.init(phy, &rlc, &rrc, &timers); + mac.init(phy, &rlc, &rrc, &timers, this); rlc.init(&pdcp, &rrc, &timers, 0 /* RB_ID_SRB0 */); pdcp.init(&rlc, &rrc, gw); nas.init(usim.get(), &rrc, gw, args.nas); @@ -269,4 +270,13 @@ void ue_stack_lte::run_tti_impl(uint32_t tti) timers.step_all(); } +/******************** + * low MAC Interface + *******************/ + +void ue_stack_lte::process_pdus() +{ + pending_tasks.push(mac_queue_id, task_t{[this](task_t*) { mac.process_pdus(); }}); +} + } // namespace srsue diff --git a/srsue/test/mac_test.cc b/srsue/test/mac_test.cc index 3be1fe742..b3826ac58 100644 --- a/srsue/test/mac_test.cc +++ b/srsue/test/mac_test.cc @@ -326,6 +326,11 @@ public: uint32_t rach_problem = 0; }; +class stack_dummy : public stack_interface_mac +{ + void process_pdus() final {} +}; + } // namespace srslte int mac_unpack_test() @@ -358,13 +363,14 @@ int mac_unpack_test() rlc_log.set_hex_limit(100000); // dummy layers - phy_dummy phy; - rlc_dummy rlc(&rlc_log); - rrc_dummy rrc; + phy_dummy phy; + rlc_dummy rlc(&rlc_log); + rrc_dummy rrc; + stack_dummy stack; // the actual MAC mac mac(&mac_log); - mac.init(&phy, &rlc, &rrc, &timers); + mac.init(&phy, &rlc, &rrc, &timers, &stack); // create dummy DL action and grant and push MAC PDU mac_interface_phy_lte::tb_action_dl_t dl_action; @@ -415,13 +421,14 @@ int mac_ul_sch_pdu_test1() srslte::timers timers(64); // dummy layers - phy_dummy phy; - rlc_dummy rlc(&rlc_log); - rrc_dummy rrc; + phy_dummy phy; + rlc_dummy rlc(&rlc_log); + rrc_dummy rrc; + stack_dummy stack; // the actual MAC mac mac(&mac_log); - mac.init(&phy, &rlc, &rrc, &timers); + mac.init(&phy, &rlc, &rrc, &timers, &stack); const uint16_t crnti = 0x1001; mac.set_ho_rnti(crnti, 0); @@ -483,13 +490,14 @@ int mac_ul_logical_channel_prioritization_test1() srslte::timers timers(64); // dummy layers - phy_dummy phy; - rlc_dummy rlc(&rlc_log); - rrc_dummy rrc; + phy_dummy phy; + rlc_dummy rlc(&rlc_log); + rrc_dummy rrc; + stack_dummy stack; // the actual MAC mac mac(&mac_log); - mac.init(&phy, &rlc, &rrc, &timers); + mac.init(&phy, &rlc, &rrc, &timers, &stack); const uint16_t crnti = 0x1001; mac.set_ho_rnti(crnti, 0); @@ -596,13 +604,14 @@ int mac_ul_logical_channel_prioritization_test2() srslte::timers timers(64); // dummy layers - phy_dummy phy; - rlc_dummy rlc(&rlc_log); - rrc_dummy rrc; + phy_dummy phy; + rlc_dummy rlc(&rlc_log); + rrc_dummy rrc; + stack_dummy stack; // the actual MAC mac mac(&mac_log); - mac.init(&phy, &rlc, &rrc, &timers); + mac.init(&phy, &rlc, &rrc, &timers, &stack); const uint16_t crnti = 0x1001; mac.set_ho_rnti(crnti, 0); @@ -696,13 +705,14 @@ int mac_ul_logical_channel_prioritization_test3() srslte::timers timers(64); // dummy layers - phy_dummy phy; - rlc_dummy rlc(&rlc_log); - rrc_dummy rrc; + phy_dummy phy; + rlc_dummy rlc(&rlc_log); + rrc_dummy rrc; + stack_dummy stack; // the actual MAC mac mac(&mac_log); - mac.init(&phy, &rlc, &rrc, &timers); + mac.init(&phy, &rlc, &rrc, &timers, &stack); const uint16_t crnti = 0x1001; mac.set_ho_rnti(crnti, 0); @@ -784,13 +794,14 @@ int mac_ul_sch_pdu_with_short_bsr_test() srslte::timers timers(64); // dummy layers - phy_dummy phy; - rlc_dummy rlc(&rlc_log); - rrc_dummy rrc; + phy_dummy phy; + rlc_dummy rlc(&rlc_log); + rrc_dummy rrc; + stack_dummy stack; // the actual MAC mac mac(&mac_log); - mac.init(&phy, &rlc, &rrc, &timers); + mac.init(&phy, &rlc, &rrc, &timers, &stack); const uint16_t crnti = 0x1001; mac.set_ho_rnti(crnti, 0); @@ -870,13 +881,14 @@ int mac_ul_sch_pdu_with_padding_bsr_test() srslte::timers timers(64); // dummy layers - phy_dummy phy; - rlc_dummy rlc(&rlc_log); - rrc_dummy rrc; + phy_dummy phy; + rlc_dummy rlc(&rlc_log); + rrc_dummy rrc; + stack_dummy stack; // the actual MAC mac mac(&mac_log); - mac.init(&phy, &rlc, &rrc, &timers); + mac.init(&phy, &rlc, &rrc, &timers, &stack); const uint16_t crnti = 0x1001; mac.set_ho_rnti(crnti, 0); @@ -965,13 +977,14 @@ int mac_ul_sch_pdu_one_byte_test() srslte::timers timers(64); // dummy layers - phy_dummy phy; - rlc_dummy rlc(&rlc_log); - rrc_dummy rrc; + phy_dummy phy; + rlc_dummy rlc(&rlc_log); + rrc_dummy rrc; + stack_dummy stack; // the actual MAC mac mac(&mac_log); - mac.init(&phy, &rlc, &rrc, &timers); + mac.init(&phy, &rlc, &rrc, &timers, &stack); const uint16_t crnti = 0x1001; mac.set_ho_rnti(crnti, 0); @@ -1025,13 +1038,14 @@ int mac_ul_sch_pdu_two_byte_test() srslte::timers timers(64); // dummy layers - phy_dummy phy; - rlc_dummy rlc(&rlc_log); - rrc_dummy rrc; + phy_dummy phy; + rlc_dummy rlc(&rlc_log); + rrc_dummy rrc; + stack_dummy stack; // the actual MAC mac mac(&mac_log); - mac.init(&phy, &rlc, &rrc, &timers); + mac.init(&phy, &rlc, &rrc, &timers, &stack); const uint16_t crnti = 0x1001; mac.set_ho_rnti(crnti, 0); @@ -1085,13 +1099,14 @@ int mac_ul_sch_pdu_three_byte_test() srslte::timers timers(64); // dummy layers - phy_dummy phy; - rlc_dummy rlc(&rlc_log); - rrc_dummy rrc; + phy_dummy phy; + rlc_dummy rlc(&rlc_log); + rrc_dummy rrc; + stack_dummy stack; // the actual MAC mac mac(&mac_log); - mac.init(&phy, &rlc, &rrc, &timers); + mac.init(&phy, &rlc, &rrc, &timers, &stack); const uint16_t crnti = 0x1001; mac.set_ho_rnti(crnti, 0); @@ -1329,11 +1344,12 @@ int mac_random_access_test() // dummy layers phy_dummy phy; phy.set_log(&phy_log); - rlc_dummy rlc(&rlc_log); - rrc_dummy rrc; + rlc_dummy rlc(&rlc_log); + rrc_dummy rrc; + stack_dummy stack; // Configure default RACH parameters - asn1::rrc::rach_cfg_common_s rach_cfg = {}; + asn1::rrc::rach_cfg_common_s rach_cfg = {}; rach_cfg.preamb_info.nof_ra_preambs = asn1::rrc::rach_cfg_common_s::preamb_info_s_::nof_ra_preambs_opts::n12; rach_cfg.ra_supervision_info.preamb_trans_max = asn1::rrc::preamb_trans_max_opts::n8; rach_cfg.ra_supervision_info.ra_resp_win_size = @@ -1344,7 +1360,7 @@ int mac_random_access_test() // Configure MAC mac mac(&mac_log); - mac.init(&phy, &rlc, &rrc, &timers); + mac.init(&phy, &rlc, &rrc, &timers, &stack); srslte::mac_cfg_t mac_cfg; set_mac_cfg_t_rach_cfg_common(&mac_cfg, rach_cfg); mac.set_config(mac_cfg);