mac: update CQI in MAC with CSI reports from PHY

Signed-off-by: Carlo Galiotto <carlo@srs.io>
This commit is contained in:
Carlo Galiotto 2021-10-08 15:58:17 +02:00 committed by carlo-gal
parent 781ae4abfb
commit dc3e3a89f8
6 changed files with 37 additions and 17 deletions

View File

@ -31,19 +31,19 @@ private:
pthread_rwlock_t* rwlock;
};
// Shared lock guard that automatically unlocks rwlock on exit
// Shared lock guard that automatically unlocks rwmutex on exit
class rwlock_read_guard
{
public:
rwlock_read_guard(pthread_rwlock_t& rwlock_) : rwlock(&rwlock_) { pthread_rwlock_rdlock(rwlock); }
rwlock_read_guard(pthread_rwlock_t& rwlock_) : rwmutex(&rwlock_) { pthread_rwlock_rdlock(rwmutex); }
rwlock_read_guard(const rwlock_read_guard&) = delete;
rwlock_read_guard(rwlock_read_guard&&) = delete;
rwlock_read_guard& operator=(const rwlock_read_guard&) = delete;
rwlock_read_guard& operator=(rwlock_read_guard&&) = delete;
~rwlock_read_guard() { pthread_rwlock_unlock(rwlock); }
~rwlock_read_guard() { pthread_rwlock_unlock(rwmutex); }
private:
pthread_rwlock_t* rwlock;
pthread_rwlock_t* rwmutex;
};
} // namespace srsran

View File

@ -112,7 +112,7 @@ private:
srslog::basic_logger& logger;
// We use a rwlock in MAC to allow multiple workers to access MAC simultaneously. No conflicts will happen since
// We use a rwmutex in MAC to allow multiple workers to access MAC simultaneously. No conflicts will happen since
// access for different TTIs
pthread_rwlock_t rwlock = {};

View File

@ -59,7 +59,7 @@ public:
void metrics_phr(float phr);
void metrics_dl_ri(uint32_t dl_cqi);
void metrics_dl_pmi(uint32_t dl_cqi);
void metrics_dl_cqi(uint32_t dl_cqi);
void metrics_dl_cqi(const srsran_uci_cfg_nr_t& cfg_, uint32_t dl_cqi, bool valid_cqi);
void metrics_dl_mcs(uint32_t mcs);
void metrics_ul_mcs(uint32_t mcs);
void metrics_cnt();
@ -83,11 +83,12 @@ private:
std::atomic<bool> active_state{true};
uint32_t phr_counter = 0;
uint32_t dl_cqi_counter = 0;
uint32_t dl_ri_counter = 0;
uint32_t dl_pmi_counter = 0;
mac_ue_metrics_t ue_metrics = {};
uint32_t phr_counter = 0;
uint32_t dl_cqi_counter = 0;
uint32_t dl_cqi_valid_counter = 0;
uint32_t dl_ri_counter = 0;
uint32_t dl_pmi_counter = 0;
mac_ue_metrics_t ue_metrics = {};
// UE-specific buffer for MAC PDU packing, unpacking and handling
srsran::mac_sch_pdu_nr mac_pdu_dl, mac_pdu_ul;

View File

@ -996,7 +996,7 @@ void mac::write_mcch(const srsran::sib2_mbms_t* sib2_,
rrc_h->add_user(SRSRAN_MRNTI, {});
}
// Internal helper function, caller must hold UE DB rwlock
// Internal helper function, caller must hold UE DB rwmutex
bool mac::check_ue_active(uint16_t rnti)
{
if (not ue_db.contains(rnti)) {

View File

@ -365,6 +365,11 @@ bool mac_nr::handle_uci_data(const uint16_t rnti, const srsran_uci_cfg_nr_t& cfg
if (value.valid and value.sr > 0) {
sched.ul_sr_info(cfg_.pucch.rnti);
}
// Process CQI
srsran::rwlock_read_guard rw_lock(rwlock);
ue_db[rnti]->metrics_dl_cqi(cfg_, value.csi->wideband_cri_ri_pmi_cqi.cqi, value.valid);
return true;
}
@ -401,7 +406,6 @@ int mac_nr::pusch_info(const srsran_slot_cfg_t& slot_cfg, mac_interface_phy_nr::
srsran::rwlock_read_guard rw_lock(rwlock);
if (ue_db.contains(rnti)) {
ue_db[rnti]->metrics_rx(pusch_info.pusch_data.tb[0].crc, nof_bytes);
ue_db[rnti]->metrics_dl_cqi(15); // TODO extract correct CQI measurments
}
return SRSRAN_SUCCESS;
}

View File

@ -194,11 +194,26 @@ void ue_nr::metrics_read(mac_ue_metrics_t* metrics_)
ue_metrics = {};
}
void ue_nr::metrics_dl_cqi(uint32_t dl_cqi)
void ue_nr::metrics_dl_cqi(const srsran_uci_cfg_nr_t& cfg_, uint32_t dl_cqi, bool valid_cqi)
{
std::lock_guard<std::mutex> lock(metrics_mutex);
ue_metrics.dl_cqi = SRSRAN_VEC_CMA((float)dl_cqi, ue_metrics.dl_cqi, dl_cqi_counter);
dl_cqi_counter++;
// I think this is not necessary, as we locked from the calling function
// std::lock_guard<std::mutex> lock(metrics_mutex);
// Process CQI
for (uint32_t i = 0; i < cfg_.nof_csi; i++) {
// Increment CQI opportunity
dl_cqi_counter++;
// Skip if invalid or not supported CSI report
if (not valid_cqi or cfg_.csi[i].cfg.quantity != SRSRAN_CSI_REPORT_QUANTITY_CRI_RI_PMI_CQI or
cfg_.csi[i].cfg.freq_cfg != SRSRAN_CSI_REPORT_FREQ_WIDEBAND) {
continue;
}
// Add statistics
ue_metrics.dl_cqi = SRSRAN_VEC_SAFE_CMA(dl_cqi, ue_metrics.dl_cqi, dl_cqi_counter);
dl_cqi_valid_counter++;
}
}
void ue_nr::metrics_rx(bool crc, uint32_t tbs)