From 92f0d58856c1459b947c16a4f112fee179d283ec Mon Sep 17 00:00:00 2001 From: Andre Puschmann Date: Fri, 28 Jun 2019 11:53:05 +0200 Subject: [PATCH] mac: move further init/config into ctor to allow early logging, etc. --- lib/include/srslte/common/pdu.h | 12 +++--- lib/src/common/pdu.cc | 10 ++++- lib/test/common/pdu_test.cc | 10 ++--- srsenb/hdr/stack/mac/ue.h | 57 +++++++++++++------------ srsenb/src/stack/mac/mac.cc | 6 +-- srsenb/src/stack/mac/ue.cc | 73 +++++++++++---------------------- srsue/hdr/stack/mac/demux.h | 13 +++--- srsue/hdr/stack/mac/mux.h | 4 +- srsue/src/stack/mac/demux.cc | 30 +++++++------- srsue/src/stack/mac/mac.cc | 13 ++++-- srsue/src/stack/mac/mux.cc | 5 +-- 11 files changed, 112 insertions(+), 121 deletions(-) diff --git a/lib/include/srslte/common/pdu.h b/lib/include/srslte/common/pdu.h index 8907e345d..e9d2261b3 100644 --- a/lib/include/srslte/common/pdu.h +++ b/lib/include/srslte/common/pdu.h @@ -37,9 +37,10 @@ template class pdu { public: - pdu(uint32_t max_subheaders_) : + pdu(uint32_t max_subheaders_, srslte::log* log_) : max_subheaders(max_subheaders_), subheaders(max_subheaders_), + log(log_), nof_subheaders(0), cur_idx(-1), pdu_len(0), @@ -152,6 +153,7 @@ protected: bool pdu_is_ul; byte_buffer_t* buffer_tx = nullptr; int last_sdu_idx; + srslte::log* log = nullptr; /* Prepares the PDU for parsing or writing by setting the number of subheaders to 0 and the pdu length */ virtual void init_(byte_buffer_t* buffer_tx_, uint32_t pdu_len_bytes, bool is_ulsch) @@ -291,11 +293,11 @@ private: class sch_pdu : public pdu { public: - sch_pdu(uint32_t max_subh) : pdu(max_subh) {} + sch_pdu(uint32_t max_subh, srslte::log* log) : pdu(max_subh, log) {} void parse_packet(uint8_t* ptr); uint8_t* write_packet(); - uint8_t* write_packet(srslte::log* log_h); + uint8_t* write_packet(srslte::log* log); bool has_space_ce(uint32_t nbytes, bool var_len = false); bool has_space_sdu(uint32_t nbytes); int get_pdu_len(); @@ -356,7 +358,7 @@ private: class rar_pdu : public pdu { public: - rar_pdu(uint32_t max_rars = 16); + rar_pdu(uint32_t max_rars = 16, srslte::log* log_ = nullptr); void set_backoff(uint8_t bi); bool has_backoff(); @@ -382,7 +384,7 @@ public: class mch_pdu : public sch_pdu { public: - mch_pdu(uint32_t max_subh) : sch_pdu(max_subh) {} + mch_pdu(uint32_t max_subh, srslte::log* log) : sch_pdu(max_subh, log) {} private: /* Prepares the PDU for parsing or writing by setting the number of subheaders to 0 and the pdu length */ diff --git a/lib/src/common/pdu.cc b/lib/src/common/pdu.cc index c7ccda989..ce76827fb 100644 --- a/lib/src/common/pdu.cc +++ b/lib/src/common/pdu.cc @@ -57,7 +57,13 @@ void sch_pdu::parse_packet(uint8_t* ptr) if (n_sub >= 0) { subheaders[nof_subheaders - 1].set_payload_size(n_sub); } else { - ERROR("Reading MAC PDU: negative payload for last subheader\n"); + ERROR("Corrupted MAC PDU (read_len=%d, pdu_len=%d)\n", read_len, pdu_len); + if (log) { + log->info_hex(ptr, pdu_len, "Corrupted MAC PDU (read_len=%d, pdu_len=%d)\n", read_len, pdu_len); + } + + // reset PDU + init_(buffer_tx, pdu_len, pdu_is_ul); } } } @@ -828,7 +834,7 @@ void rar_pdu::fprint(FILE* stream) pdu::fprint(stream); } -rar_pdu::rar_pdu(uint32_t max_rars_) : pdu(max_rars_) +rar_pdu::rar_pdu(uint32_t max_rars_, srslte::log* log_) : pdu(max_rars_, log_) { backoff_indicator = 0; has_backoff_indicator = false; diff --git a/lib/test/common/pdu_test.cc b/lib/test/common/pdu_test.cc index 18517fd44..c65f49fe9 100644 --- a/lib/test/common/pdu_test.cc +++ b/lib/test/common/pdu_test.cc @@ -193,7 +193,7 @@ int mac_sch_pdu_pack_test1() rlc.write_sdu(2, sdu_len); const uint32_t pdu_size = 25; - srslte::sch_pdu pdu(10); + srslte::sch_pdu pdu(10, &mac_log); byte_buffer_t buffer; pdu.init_tx(&buffer, pdu_size, true); @@ -256,7 +256,7 @@ int mac_sch_pdu_pack_test2() const uint32_t pdu_size = 21; - srslte::sch_pdu pdu(10); + srslte::sch_pdu pdu(10, &mac_log); byte_buffer_t buffer; pdu.init_tx(&buffer, pdu_size, true); @@ -323,7 +323,7 @@ int mac_sch_pdu_pack_test3() rlc.write_sdu(2, 130); const uint32_t pdu_size = 150; - srslte::sch_pdu pdu(10); + srslte::sch_pdu pdu(10, &mac_log); byte_buffer_t buffer; pdu.init_tx(&buffer, pdu_size, true); @@ -377,7 +377,7 @@ int mac_sch_pdu_pack_test4() mac_log.set_hex_limit(100000); const uint32_t pdu_size = 10; - srslte::sch_pdu pdu(10); + srslte::sch_pdu pdu(10, &mac_log); byte_buffer_t buffer; pdu.init_tx(&buffer, pdu_size, true); @@ -430,7 +430,7 @@ int mac_sch_pdu_pack_error_test() rlc.write_sdu(1, 8); const uint32_t pdu_size = 150; - srslte::sch_pdu pdu(10); + srslte::sch_pdu pdu(10, &mac_log); byte_buffer_t buffer; pdu.init_tx(&buffer, pdu_size, true); diff --git a/srsenb/hdr/stack/mac/ue.h b/srsenb/hdr/stack/mac/ue.h index 5546fb676..c97ec0192 100644 --- a/srsenb/hdr/stack/mac/ue.h +++ b/srsenb/hdr/stack/mac/ue.h @@ -37,12 +37,18 @@ class ue : public srslte::read_pdu_interface, public srslte::pdu_queue::process_callback { public: - ue(); + ue(uint16_t rnti, + uint32_t nof_prb, + sched_interface* sched, + rrc_interface_mac* rrc_, + rlc_interface_mac* rlc, + srslte::log* log_); virtual ~ue(); void reset(); void start_pcap(srslte::mac_pcap* pcap_); + void set_tti(uint32_t tti); void config(uint16_t rnti, uint32_t nof_prb, sched_interface *sched, rrc_interface_mac *rrc_, rlc_interface_mac *rlc, srslte::log *log_h); @@ -76,8 +82,7 @@ public: void metrics_dl_pmi(uint32_t dl_cqi); void metrics_dl_cqi(uint32_t dl_cqi); - - bool is_phy_added; + bool is_phy_added = false; int read_pdu(uint32_t lcid, uint8_t *payload, uint32_t requested_bytes); private: @@ -87,28 +92,28 @@ private: std::vector lc_groups[4]; - uint32_t phr_counter; - uint32_t dl_cqi_counter; - uint32_t dl_ri_counter; - uint32_t dl_pmi_counter; + uint32_t phr_counter = 0; + uint32_t dl_cqi_counter = 0; + uint32_t dl_ri_counter = 0; + uint32_t dl_pmi_counter = 0; mac_metrics_t metrics; - - srslte::mac_pcap* pcap; - - uint64_t conres_id; - - uint16_t rnti; - - uint32_t last_tti; - - uint32_t nof_failures; + + srslte::mac_pcap* pcap = nullptr; + + uint64_t conres_id = 0; + + uint16_t rnti = 0; + + uint32_t last_tti = 0; + + uint32_t nof_failures = 0; const static int NOF_RX_HARQ_PROCESSES = SRSLTE_FDD_NOF_HARQ; const static int NOF_TX_HARQ_PROCESSES = SRSLTE_FDD_NOF_HARQ * SRSLTE_MAX_TB; srslte_softbuffer_tx_t softbuffer_tx[NOF_TX_HARQ_PROCESSES]; srslte_softbuffer_rx_t softbuffer_rx[NOF_RX_HARQ_PROCESSES]; - uint8_t* pending_buffers[NOF_RX_HARQ_PROCESSES]; + uint8_t* pending_buffers[NOF_RX_HARQ_PROCESSES] = {nullptr}; // For DL there are two buffers, one for each Transport block srslte::byte_buffer_t tx_payload_buffer[SRSLTE_FDD_NOF_HARQ][SRSLTE_MAX_TB]; @@ -117,14 +122,14 @@ private: srslte::pdu_queue pdus; srslte::sch_pdu mac_msg_dl, mac_msg_ul; srslte::mch_pdu mch_mac_msg_dl; - - rlc_interface_mac *rlc; - rrc_interface_mac* rrc; - srslte::log *log_h; - sched_interface* sched; - - bool conres_id_available; - + + rlc_interface_mac* rlc = nullptr; + rrc_interface_mac* rrc = nullptr; + srslte::log* log_h = nullptr; + sched_interface* sched = nullptr; + + bool conres_id_available = false; + // Mutexes pthread_mutex_t mutex; diff --git a/srsenb/src/stack/mac/mac.cc b/srsenb/src/stack/mac/mac.cc index 96b32435e..02b168922 100644 --- a/srsenb/src/stack/mac/mac.cc +++ b/srsenb/src/stack/mac/mac.cc @@ -481,8 +481,7 @@ int mac::rach_detected(uint32_t tti, uint32_t preamble_idx, uint32_t time_adv) pthread_rwlock_rdlock(&rwlock); // Create new UE - ue_db[last_rnti] = new ue; - ue_db[last_rnti]->config(last_rnti, cell.nof_prb, &scheduler, rrc_h, rlc_h, log_h); + ue_db[last_rnti] = new ue(last_rnti, cell.nof_prb, &scheduler, rrc_h, rlc_h, log_h); // Set PCAP if available if (pcap) { @@ -985,8 +984,7 @@ void mac::write_mcch(sib_type2_s* sib2, sib_type13_r9_s* sib13, mcch_msg_s* mcch mcch->pack(bref); current_mcch_length = bref.distance_bytes(&mcch_payload_buffer[1]); current_mcch_length = current_mcch_length + rlc_header_len; - ue_db[SRSLTE_MRNTI] = new ue; - ue_db[SRSLTE_MRNTI]->config(SRSLTE_MRNTI, cell.nof_prb, &scheduler, rrc_h, rlc_h, log_h); + ue_db[SRSLTE_MRNTI] = new ue(SRSLTE_MRNTI, cell.nof_prb, &scheduler, rrc_h, rlc_h, log_h); rrc_h->add_user(SRSLTE_MRNTI); } diff --git a/srsenb/src/stack/mac/ue.cc b/srsenb/src/stack/mac/ue.cc index 4d77fd677..bd3e0d456 100644 --- a/srsenb/src/stack/mac/ue.cc +++ b/srsenb/src/stack/mac/ue.cc @@ -33,56 +33,28 @@ namespace srsenb { -ue::ue() : - mac_msg_dl(20), - mch_mac_msg_dl(10), - mac_msg_ul(20), - conres_id_available(false), - dl_ri_counter(0), - dl_pmi_counter(0), - conres_id(0), - last_tti(0), +ue::ue(uint16_t rnti_, + uint32_t nof_prb, + sched_interface* sched_, + rrc_interface_mac* rrc_, + rlc_interface_mac* rlc_, + srslte::log* log_) : + rnti(rnti_), + sched(sched_), + rrc(rrc_), + rlc(rlc_), + log_h(log_), + mac_msg_dl(20, log_h), + mch_mac_msg_dl(10, log_h), + mac_msg_ul(20, log_h), pdus(128) { - rrc = NULL; - sched = NULL; - rlc = NULL; - log_h = NULL; - rnti = 0; - pcap = NULL; - nof_failures = 0; - phr_counter = 0; - dl_cqi_counter = 0; - is_phy_added = false; - for (int i = 0; i < NOF_RX_HARQ_PROCESSES; i++) { - pending_buffers[i] = NULL; - } - bzero(&metrics, sizeof(mac_metrics_t)); bzero(&mutex, sizeof(pthread_mutex_t)); bzero(softbuffer_tx, sizeof(softbuffer_tx)); bzero(softbuffer_rx, sizeof(softbuffer_rx)); pthread_mutex_init(&mutex, NULL); -} -ue::~ue() -{ - for (int i = 0; i < NOF_RX_HARQ_PROCESSES; i++) { - srslte_softbuffer_rx_free(&softbuffer_rx[i]); - } - for (int i = 0; i < NOF_TX_HARQ_PROCESSES; i++) { - srslte_softbuffer_tx_free(&softbuffer_tx[i]); - } - pthread_mutex_destroy(&mutex); -} - -void ue::config(uint16_t rnti_, uint32_t nof_prb, sched_interface *sched_, rrc_interface_mac *rrc_, rlc_interface_mac *rlc_, srslte::log *log_h_) -{ - rnti = rnti_; - rlc = rlc_; - rrc = rrc_; - log_h = log_h_; - sched = sched_; pdus.init(this, log_h); for (int i = 0; i < NOF_RX_HARQ_PROCESSES; i++) { @@ -92,18 +64,23 @@ void ue::config(uint16_t rnti_, uint32_t nof_prb, sched_interface *sched_, rrc_i srslte_softbuffer_tx_init(&softbuffer_tx[i], nof_prb); } // don't need to reset because just initiated the buffers - bzero(&metrics, sizeof(mac_metrics_t)); - nof_failures = 0; - - for (int i = 0; i < NOF_RX_HARQ_PROCESSES; i++) { - pending_buffers[i] = NULL; - } // Set LCID group for SRB0 and SRB1 set_lcg(0, 0); set_lcg(1, 0); } +ue::~ue() +{ + for (int i = 0; i < NOF_RX_HARQ_PROCESSES; i++) { + srslte_softbuffer_rx_free(&softbuffer_rx[i]); + } + for (int i = 0; i < NOF_TX_HARQ_PROCESSES; i++) { + srslte_softbuffer_tx_free(&softbuffer_tx[i]); + } + pthread_mutex_destroy(&mutex); +} + void ue::reset() { bzero(&metrics, sizeof(mac_metrics_t)); diff --git a/srsue/hdr/stack/mac/demux.h b/srsue/hdr/stack/mac/demux.h index f9fe02a2b..b2ab6c1a9 100644 --- a/srsue/hdr/stack/mac/demux.h +++ b/srsue/hdr/stack/mac/demux.h @@ -43,11 +43,10 @@ public: class demux : public srslte::pdu_queue::process_callback { public: - demux(); + demux(srslte::log* log_); void init(phy_interface_mac_common* phy_h_, rlc_interface_mac* rlc, mac_interface_demux* mac, - srslte::log* log_h_, srslte::timers::timer* time_alignment_timer); bool process_pdus(); @@ -82,11 +81,11 @@ private: bool is_uecrid_successful; - phy_interface_mac_common* phy_h; - srslte::log* log_h; - srslte::timers::timer* time_alignment_timer; - rlc_interface_mac* rlc; - mac_interface_demux* mac; + phy_interface_mac_common* phy_h = nullptr; + srslte::log* log_h = nullptr; + srslte::timers::timer* time_alignment_timer = nullptr; + rlc_interface_mac* rlc = nullptr; + mac_interface_demux* mac = nullptr; // Buffer of PDUs srslte::pdu_queue pdus; diff --git a/srsue/hdr/stack/mac/mux.h b/srsue/hdr/stack/mac/mux.h index db51b6c2c..8282b79c0 100644 --- a/srsue/hdr/stack/mac/mux.h +++ b/srsue/hdr/stack/mac/mux.h @@ -54,10 +54,10 @@ namespace srsue { class mux { public: - mux(); + mux(srslte::log* log_); ~mux(){}; void reset(); - void init(rlc_interface_mac *rlc, srslte::log *log_h, bsr_interface_mux *bsr_procedure, phr_proc *phr_procedure_); + void init(rlc_interface_mac* rlc, bsr_interface_mux* bsr_procedure, phr_proc* phr_procedure_); void step(const uint32_t tti); diff --git a/srsue/src/stack/mac/demux.cc b/srsue/src/stack/mac/demux.cc index 50e751545..6967d1f09 100644 --- a/srsue/src/stack/mac/demux.cc +++ b/srsue/src/stack/mac/demux.cc @@ -30,30 +30,28 @@ namespace srsue { -demux::demux() : - mac_msg(20), - mch_mac_msg(20), - pending_mac_msg(20), +demux::demux(srslte::log* log_) : + mac_msg(20, log_), + mch_mac_msg(20, log_), + pending_mac_msg(20, log_), rlc(NULL), + log_h(log_), is_uecrid_successful(false), phy_h(nullptr), - log_h(nullptr), time_alignment_timer(nullptr), mac(nullptr) { } -void demux::init(phy_interface_mac_common* phy_h, - rlc_interface_mac* rlc, - mac_interface_demux* mac, - srslte::log* log_h, - srslte::timers::timer* time_alignment_timer) +void demux::init(phy_interface_mac_common* phy_, + rlc_interface_mac* rlc_, + mac_interface_demux* mac_, + srslte::timers::timer* time_alignment_timer_) { - this->phy_h = phy_h; - this->log_h = log_h; - this->rlc = rlc; - this->mac = mac; - this->time_alignment_timer = time_alignment_timer; + phy_h = phy_; + rlc = rlc_; + mac = mac_; + time_alignment_timer = time_alignment_timer_; pdus.init(this, log_h); bzero(&mch_lcids, SRSLTE_N_MCH_LCIDS); } @@ -177,7 +175,7 @@ void demux::process_pdu(uint8_t* mac_pdu, uint32_t nof_bytes, srslte::pdu_queue: void demux::process_sch_pdu_rt(uint8_t* buff, uint32_t nof_bytes) { - srslte::sch_pdu mac_msg_rt(20); + srslte::sch_pdu mac_msg_rt(20, log_h); mac_msg_rt.init_rx(nof_bytes); mac_msg_rt.parse_packet(buff); diff --git a/srsue/src/stack/mac/mac.cc b/srsue/src/stack/mac/mac.cc index 002a9fcb9..987f7e8c3 100644 --- a/srsue/src/stack/mac/mac.cc +++ b/srsue/src/stack/mac/mac.cc @@ -37,7 +37,14 @@ using namespace asn1::rrc; namespace srsue { -mac::mac(srslte::log* log_) : timers(64), pdu_process_thread(&demux_unit), mch_msg(10), pcap(nullptr), log_h(log_) +mac::mac(srslte::log* log_) : + timers(64), + pdu_process_thread(&demux_unit), + 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()); @@ -76,8 +83,8 @@ bool mac::init(phy_interface_mac_lte* phy, rlc_interface_mac* rlc, rrc_interface bsr_procedure.init(rlc_h, log_h, &timers); phr_procedure.init(phy_h, log_h, &timers); - mux_unit.init(rlc_h, log_h, &bsr_procedure, &phr_procedure); - demux_unit.init(phy_h, rlc_h, this, log_h, timers.get(timer_alignment)); + mux_unit.init(rlc_h, &bsr_procedure, &phr_procedure); + demux_unit.init(phy_h, rlc_h, this, timers.get(timer_alignment)); ra_procedure.init( phy_h, rrc, log_h, &uernti, timers.get(timer_alignment), timers.get(contention_resolution_timer), &mux_unit); sr_procedure.init(phy_h, rrc, log_h); diff --git a/srsue/src/stack/mac/mux.cc b/srsue/src/stack/mac/mux.cc index 9a2b8b782..388c5b048 100644 --- a/srsue/src/stack/mac/mux.cc +++ b/srsue/src/stack/mac/mux.cc @@ -32,14 +32,13 @@ namespace srsue { -mux::mux() : pdu_msg(MAX_NOF_SUBHEADERS) +mux::mux(srslte::log* log_) : pdu_msg(MAX_NOF_SUBHEADERS, log_), log_h(log_) { msg3_flush(); } -void mux::init(rlc_interface_mac *rlc_, srslte::log *log_h_, bsr_interface_mux *bsr_procedure_, phr_proc *phr_procedure_) +void mux::init(rlc_interface_mac* rlc_, bsr_interface_mux* bsr_procedure_, phr_proc* phr_procedure_) { - log_h = log_h_; rlc = rlc_; bsr_procedure = bsr_procedure_; phr_procedure = phr_procedure_;