From b8171e493eebe6842b843fb017d73f7179f0c074 Mon Sep 17 00:00:00 2001 From: faluco Date: Wed, 20 Oct 2021 11:35:13 +0200 Subject: [PATCH] Fix crash in mac_nr when accesing the ue_db and not checking if the rnti is valid, while there fix a potential data race. Fix data race inside sched_nr when modifying per ue metrics. --- srsenb/hdr/stack/mac/nr/sched_nr_ue.h | 1 + srsenb/src/stack/mac/nr/mac_nr.cc | 7 +++++-- srsenb/src/stack/mac/nr/sched_nr.cc | 1 + srsenb/src/stack/mac/nr/sched_nr_worker.cc | 1 + 4 files changed, 8 insertions(+), 2 deletions(-) diff --git a/srsenb/hdr/stack/mac/nr/sched_nr_ue.h b/srsenb/hdr/stack/mac/nr/sched_nr_ue.h index 666eff1dd..21076a204 100644 --- a/srsenb/hdr/stack/mac/nr/sched_nr_ue.h +++ b/srsenb/hdr/stack/mac/nr/sched_nr_ue.h @@ -77,6 +77,7 @@ public: // metrics mac_ue_metrics_t metrics = {}; + std::mutex metrics_mutex; private: bwp_ue_cfg bwp_cfg; diff --git a/srsenb/src/stack/mac/nr/mac_nr.cc b/srsenb/src/stack/mac/nr/mac_nr.cc index 8949a3331..00d710dae 100644 --- a/srsenb/src/stack/mac/nr/mac_nr.cc +++ b/srsenb/src/stack/mac/nr/mac_nr.cc @@ -389,8 +389,11 @@ bool mac_nr::handle_uci_data(const uint16_t rnti, const srsran_uci_cfg_nr_t& cfg } // Process CQI - if (value.valid) { - ue_db[rnti]->metrics_dl_cqi(cfg_, value.csi->wideband_cri_ri_pmi_cqi.cqi); + { + srsran::rwlock_read_guard rw_lock(rwmutex); + if (ue_db.contains(rnti) && value.valid) { + ue_db[rnti]->metrics_dl_cqi(cfg_, value.csi->wideband_cri_ri_pmi_cqi.cqi); + } } return true; diff --git a/srsenb/src/stack/mac/nr/sched_nr.cc b/srsenb/src/stack/mac/nr/sched_nr.cc index 89cbff2b0..89b1dcf02 100644 --- a/srsenb/src/stack/mac/nr/sched_nr.cc +++ b/srsenb/src/stack/mac/nr/sched_nr.cc @@ -172,6 +172,7 @@ void sched_nr::dl_ack_info(uint16_t rnti, uint32_t cc, uint32_t pid, uint32_t tb sched_workers->enqueue_cc_feedback(rnti, cc, [this, pid, tb_idx, ack](ue_carrier& ue_cc) { int tbs = ue_cc.harq_ent.dl_ack_info(pid, tb_idx, ack); if (tbs >= 0) { + std::lock_guard lock(ue_cc.metrics_mutex); if (ack) { ue_cc.metrics.tx_brate += tbs; } else { diff --git a/srsenb/src/stack/mac/nr/sched_nr_worker.cc b/srsenb/src/stack/mac/nr/sched_nr_worker.cc index 97be29928..871e31117 100644 --- a/srsenb/src/stack/mac/nr/sched_nr_worker.cc +++ b/srsenb/src/stack/mac/nr/sched_nr_worker.cc @@ -375,6 +375,7 @@ void sched_worker_manager::get_metrics_nolocking(mac_metrics_t& metrics) for (mac_ue_metrics_t& ue_metric : metrics.ues) { if (ue_db.contains(ue_metric.rnti) and ue_db[ue_metric.rnti]->carriers[0] != nullptr) { auto& ue_cc = *ue_db[ue_metric.rnti]->carriers[0]; + std::lock_guard lock(ue_cc.metrics_mutex); ue_metric.tx_brate = ue_cc.metrics.tx_brate; ue_metric.tx_errors = ue_cc.metrics.tx_errors; ue_metric.tx_pkts = ue_cc.metrics.tx_pkts;