SRSENB: minor format, renaming and interface changes

This commit is contained in:
Xavier Arteaga 2020-02-13 10:28:32 +01:00 committed by Xavier Arteaga
parent 67c07dfb56
commit 385102fa2d
11 changed files with 130 additions and 66 deletions

View File

@ -101,19 +101,48 @@ public:
virtual int sr_detected(uint32_t tti, uint16_t rnti) = 0;
virtual int rach_detected(uint32_t tti, uint32_t primary_cc_idx, uint32_t preamble_idx, uint32_t time_adv) = 0;
virtual int ri_info(uint32_t tti, uint16_t rnti, uint32_t ri_value) = 0;
virtual int pmi_info(uint32_t tti, uint16_t rnti, uint32_t pmi_value) = 0;
/**
* PHY callback for giving MAC the Rank Indicator information of a given RNTI for an eNb cell/carrier.
*
* @param tti the given TTI
* @param rnti the UE identifier in the eNb
* @param cc_idx The eNb Cell/Carrier where the measurement corresponds
* @param ri_value the actual Rank Indicator value, 0 for 1 layer, 1 for two layers and so on.
* @return SRSLTE_SUCCESS if no error occurs, SRSLTE_ERROR* if an error occurs
*/
virtual int ri_info(uint32_t tti, uint16_t rnti, uint32_t cc_idx, uint32_t ri_value) = 0;
/**
* PHY callback for giving MAC the Pre-coding Matrix Indicator information of a given RNTI for an eNb cell/carrier.
*
* @param tti the given TTI
* @param rnti the UE identifier in the eNb
* @param cc_idx The eNb Cell/Carrier where the measurement corresponds
* @param pmi_value the actual PMI value
* @return SRSLTE_SUCCESS if no error occurs, SRSLTE_ERROR* if an error occurs
*/
virtual int pmi_info(uint32_t tti, uint16_t rnti, uint32_t cc_idx, uint32_t pmi_value) = 0;
/**
* PHY callback for for giving MAC the Channel Quality information of a given RNTI, TTI and eNb cell/carrier
* @param tti the given TTI
* @param rnti the UE identifier in the eNb
* @param cc_idx The eNb Cell/Carrier where the measurement corresponds
* @param cqi_value the corresponding Channel Quality Information
* @return SRSLTE_SUCCESS if no error occurs, SRSLTE_ERROR* if an error occurs
*/
virtual int cqi_info(uint32_t tti, uint16_t rnti, uint32_t cc_idx, uint32_t cqi_value) = 0;
virtual int snr_info(uint32_t tti, uint16_t rnti, float snr_db) = 0;
/**
* PHY callback for giving MAC the SNR in dB of an UL transmission for a given RNTI at a given carrier
*
* @param tti The measurement was made
* @param rnti The UE identifier in the eNb
* @param cc_idx The eNb Cell/Carrier where the UL transmission was received
* @param snr_db The actual SNR of the received signal
* @return SRSLTE_SUCCESS if no error occurs, SRSLTE_ERROR* if an error occurs
*/
virtual int snr_info(uint32_t tti, uint16_t rnti, uint32_t cc_idx, float snr_db) = 0;
/**
* PHY callback for giving MAC the HARQ DL ACK/NACK feedback information for a given RNTI, TTI, eNb cell/carrier and
@ -127,7 +156,18 @@ public:
* @return SRSLTE_SUCCESS if no error occurs, SRSLTE_ERROR* if an error occurs
*/
virtual int ack_info(uint32_t tti, uint16_t rnti, uint32_t cc_idx, uint32_t tb_idx, bool ack) = 0;
virtual int crc_info(uint32_t tti, uint16_t rnti, uint32_t nof_bytes, bool crc_res) = 0;
/**
* Informs MAC about a received PUSCH transmission for given RNTI, TTI and eNb Cell/carrier.
*
* @param tti the given TTI
* @param rnti the UE identifier in the eNb
* @param cc_idx the eNb Cell/Carrier identifier
* @param nof_bytes the number of grants carrierd by the PUSCH message
* @param crc_res the CRC check, set to true if the message was decoded succesfully
* @return SRSLTE_SUCCESS if no error occurs, SRSLTE_ERROR* if an error occurs
*/
virtual int crc_info(uint32_t tti, uint16_t rnti, uint32_t cc_idx, uint32_t nof_bytes, bool crc_res) = 0;
virtual int get_dl_sched(uint32_t tti, dl_sched_list_t& dl_sched_res) = 0;
virtual int get_mch_sched(uint32_t tti, bool is_mcch, dl_sched_list_t& dl_sched_res) = 0;
@ -152,9 +192,29 @@ public:
* @param pcell_index Primary cell (PCell) index
* @param is_temporal Indicates whether the UE is temporal
*/
virtual int add_rnti(uint16_t rnti, uint32_t pcell_index, bool is_temporal) = 0;
virtual void rem_rnti(uint16_t rnti) = 0;
virtual void set_mch_period_stop(uint32_t stop) = 0;
virtual int add_rnti(uint16_t rnti, uint32_t pcell_index, bool is_temporal) = 0;
/**
* Removes an RNTI context from all the physical layer components, including secondary cells
* @param rnti identifier of the user
*/
virtual void rem_rnti(uint16_t rnti) = 0;
/**
*
* @param stop
*/
virtual void set_mch_period_stop(uint32_t stop) = 0;
/**
* Activates and/or deactivates Secondary Cells in the PHY for a given RNTI. Requires the RNTI of the given UE and a
* vector with the activation/deactivation values. Use true for activation and false for deactivation. The index 0 is
* reserved for PCell and will not be used.
*
* @param rnti identifier of the user
* @param activation vector with the activate/deactivate.
*/
virtual void set_activation_deactivation_scell(uint16_t rnti, bool activation[SRSLTE_MAX_CARRIERS]) = 0;
};
/* Interface RRC -> PHY */
@ -176,9 +236,9 @@ public:
configure_mbsfn(asn1::rrc::sib_type2_s* sib2, asn1::rrc::sib_type13_r9_s* sib13, asn1::rrc::mcch_msg_s mcch) = 0;
typedef struct {
bool active = false; ///< Indicates whether PHY shall consider using this or not
uint32_t cc_idx = 0; ///< eNb Cell index
srslte::phy_cfg_t phy_cfg = {}; ///< Dedicated physical layer configuration
bool configured = false; ///< Indicates whether PHY shall consider configuring this cell/carrier
uint32_t cc_idx = 0; ///< eNb Cell index
srslte::phy_cfg_t phy_cfg = {}; ///< Dedicated physical layer configuration
} phy_rrc_dedicated_t;
typedef std::vector<phy_rrc_dedicated_t> phy_rrc_dedicated_list_t;

View File

@ -75,7 +75,7 @@ srslte_pucch_format_t srslte_pucch_proc_select_format(const srslte_cell_t*
else if (total_ack == 2) {
format = SRSLTE_PUCCH_FORMAT_2B;
}
// CQI + 2-bit ACK + cyclic prefix
// CQI + 1-bit ACK + extended cyclic prefix
else if (total_ack == 1 && SRSLTE_CP_ISEXT(cell->cp)) {
format = SRSLTE_PUCCH_FORMAT_2B;
}

View File

@ -54,6 +54,7 @@ public:
int add_rnti(uint16_t rnti, uint32_t pcell_index, bool is_temporal) final;
void rem_rnti(uint16_t rnti) final;
void set_mch_period_stop(uint32_t stop) final;
void set_activation_deactivation_scell(uint16_t rnti, bool activation[SRSLTE_MAX_CARRIERS]);
/*RRC-PHY interface*/
void configure_mbsfn(asn1::rrc::sib_type2_s* sib2, asn1::rrc::sib_type13_r9_s* sib13, asn1::rrc::mcch_msg_s mcch);

View File

@ -141,9 +141,9 @@ public:
{
public:
pending_ack_t pending_ack[TTIMOD_SZ] = {};
uint8_t ri = 0;
uint8_t ri = 0;
uint32_t pcell_idx = 0;
srslte_ra_tb_t last_tb[SRSLTE_MAX_HARQ_PROC] = {};
srslte_ra_tb_t last_tb[SRSLTE_MAX_HARQ_PROC] = {};
std::map<uint32_t, uint32_t> scell_map;
};
@ -163,7 +163,7 @@ public:
*
* @param rnti identifier of the UE
*/
void ue_db_rem_rnti(uint16_t rnti);
void ue_db_rem_rnti(uint16_t rnti);
/**
* Removes all the pending ACKs of all the RNTIs for a given TTI

View File

@ -67,20 +67,29 @@ public:
{
return mac.rach_detected(tti, primary_cc_idx, preamble_idx, time_adv);
}
int ri_info(uint32_t tti, uint16_t rnti, uint32_t ri_value) final { return mac.ri_info(tti, rnti, ri_value); }
int pmi_info(uint32_t tti, uint16_t rnti, uint32_t pmi_value) final { return mac.pmi_info(tti, rnti, pmi_value); }
int ri_info(uint32_t tti, uint16_t rnti, uint32_t cc_idx, uint32_t ri_value) final
{
return mac.ri_info(tti, rnti, cc_idx, ri_value);
}
int pmi_info(uint32_t tti, uint16_t rnti, uint32_t cc_idx, uint32_t pmi_value) final
{
return mac.pmi_info(tti, rnti, cc_idx, pmi_value);
}
int cqi_info(uint32_t tti, uint16_t rnti, uint32_t cc_idx, uint32_t cqi_value) final
{
return mac.cqi_info(tti, rnti, cc_idx, cqi_value);
}
int snr_info(uint32_t tti, uint16_t rnti, float snr_db) final { return mac.snr_info(tti, rnti, snr_db); }
int snr_info(uint32_t tti, uint16_t rnti, uint32_t cc_idx, float snr_db) final
{
return mac.snr_info(tti, rnti, cc_idx, snr_db);
}
int ack_info(uint32_t tti, uint16_t rnti, uint32_t cc_idx, uint32_t tb_idx, bool ack) final
{
return mac.ack_info(tti, rnti, cc_idx, tb_idx, ack);
}
int crc_info(uint32_t tti, uint16_t rnti, uint32_t nof_bytes, bool crc_res) final
int crc_info(uint32_t tti, uint16_t rnti, uint32_t cc_idx, uint32_t nof_bytes, bool crc_res) final
{
return mac.crc_info(tti, rnti, nof_bytes, crc_res);
return mac.crc_info(tti, rnti, cc_idx, nof_bytes, crc_res);
}
int get_dl_sched(uint32_t tti, dl_sched_list_t& dl_sched_res) final { return mac.get_dl_sched(tti, dl_sched_res); }
int get_mch_sched(uint32_t tti, bool is_mcch, dl_sched_list_t& dl_sched_res) final

View File

@ -56,23 +56,23 @@ public:
int sr_detected(uint32_t tti, uint16_t rnti) final;
int rach_detected(uint32_t tti, uint32_t primary_cc_idx, uint32_t preamble_idx, uint32_t time_adv) final;
int ri_info(uint32_t tti, uint16_t rnti, uint32_t ri_value);
int pmi_info(uint32_t tti, uint16_t rnti, uint32_t pmi_value);
int ri_info(uint32_t tti, uint16_t rnti, uint32_t cc_idx, uint32_t ri_value) override;
int pmi_info(uint32_t tti, uint16_t rnti, uint32_t cc_idx, uint32_t pmi_value) override;
int cqi_info(uint32_t tti, uint16_t rnti, uint32_t cc_idx, uint32_t cqi_value) override;
int snr_info(uint32_t tti, uint16_t rnti, float snr);
int snr_info(uint32_t tti, uint16_t rnti, uint32_t cc_idx, float snr) override;
int ack_info(uint32_t tti, uint16_t rnti, uint32_t cc_idx, uint32_t tb_idx, bool ack) override;
int crc_info(uint32_t tti, uint16_t rnti, uint32_t nof_bytes, bool crc_res);
int crc_info(uint32_t tti, uint16_t rnti, uint32_t cc_idx, uint32_t nof_bytes, bool crc_res) override;
int get_dl_sched(uint32_t tti, dl_sched_list_t& dl_sched_res);
int get_ul_sched(uint32_t tti, ul_sched_list_t& ul_sched_res);
int get_mch_sched(uint32_t tti, bool is_mcch, dl_sched_list_t& dl_sched_res);
void set_sched_dl_tti_mask(uint8_t* tti_mask, uint32_t nof_sfs) final
int get_dl_sched(uint32_t tti, dl_sched_list_t& dl_sched_res) override;
int get_ul_sched(uint32_t tti, ul_sched_list_t& ul_sched_res) override;
int get_mch_sched(uint32_t tti, bool is_mcch, dl_sched_list_t& dl_sched_res) override;
void set_sched_dl_tti_mask(uint8_t* tti_mask, uint32_t nof_sfs) override
{
scheduler.set_dl_tti_mask(tti_mask, nof_sfs);
}
void build_mch_sched(uint32_t tbs);
void rl_failure(uint16_t rnti);
void rl_ok(uint16_t rnti);
void rl_failure(uint16_t rnti) override;
void rl_ok(uint16_t rnti) override;
/******** Interface from RRC (RRC -> MAC) ****************/
/* Provides cell configuration including SIB periodicity, etc. */

View File

@ -251,12 +251,12 @@ void cc_worker::set_config_dedicated(uint16_t rnti, const srslte::phy_cfg_t& ded
std::lock_guard<std::mutex> lock(mutex);
if (ue_db.count(rnti)) {
ue_db[rnti]->ul_cfg = dedicated.ul_cfg;
ue_db[rnti]->ul_cfg = dedicated.ul_cfg;
ue_db[rnti]->ul_cfg.pucch.threshold_format1 = SRSLTE_PUCCH_DEFAULT_THRESHOLD_FORMAT1;
ue_db[rnti]->ul_cfg.pucch.rnti = rnti;
ue_db[rnti]->ul_cfg.pusch.rnti = rnti;
ue_db[rnti]->dl_cfg = dedicated.dl_cfg;
ue_db[rnti]->dl_cfg.pdsch.rnti = rnti;
ue_db[rnti]->ul_cfg.pucch.rnti = rnti;
ue_db[rnti]->ul_cfg.pusch.rnti = rnti;
ue_db[rnti]->dl_cfg = dedicated.dl_cfg;
ue_db[rnti]->dl_cfg.pdsch.rnti = rnti;
} else {
Error("Setting config dedicated: rnti=0x%x does not exist\n", rnti);
}
@ -397,7 +397,7 @@ void cc_worker::send_uci_data(uint16_t rnti, srslte_uci_cfg_t* uci_cfg, srslte_u
phy->stack->cqi_info(tti_rx, rnti, 0, cqi_value);
}
if (uci_cfg->cqi.ri_len) {
phy->stack->ri_info(tti_rx, rnti, uci_value->ri);
phy->stack->ri_info(tti_rx, 0, rnti, uci_value->ri);
phy->ue_db_set_ri(rnti, uci_value->ri);
}
if (uci_cfg->cqi.pmi_present) {
@ -413,7 +413,7 @@ void cc_worker::send_uci_data(uint16_t rnti, srslte_uci_cfg_t* uci_cfg, srslte_u
Error("CQI type=%d not implemented for PMI\n", uci_cfg->cqi.type);
break;
}
phy->stack->pmi_info(tti_rx, rnti, pmi_value);
phy->stack->pmi_info(tti_rx, rnti, 0, pmi_value);
}
}
}
@ -466,7 +466,7 @@ int cc_worker::decode_pusch(stack_interface_phy_lte::ul_sched_grant_t* grants, u
// Notify MAC of RL status
if (snr_db >= PUSCH_RL_SNR_DB_TH) {
phy->stack->snr_info(ul_sf.tti, rnti, snr_db);
phy->stack->snr_info(ul_sf.tti, rnti, cc_idx, snr_db);
if (grants[i].dci.tb.rv == 0) {
if (!pusch_res.crc) {
@ -483,7 +483,7 @@ int cc_worker::decode_pusch(stack_interface_phy_lte::ul_sched_grant_t* grants, u
// Notify MAC new received data and HARQ Indication value
if (pusch_res.data) {
phy->stack->crc_info(tti_rx, rnti, grant->tb.tbs / 8, pusch_res.crc);
phy->stack->crc_info(tti_rx, rnti, cc_idx, grant->tb.tbs / 8, pusch_res.crc);
// Save metrics stats
ue_db[rnti]->metrics_ul(grants[i].dci.tb.mcs_idx, 0, snr_db, pusch_res.avg_iterations_block);

View File

@ -222,6 +222,11 @@ void phy::set_mch_period_stop(uint32_t stop)
workers_common.set_mch_period_stop(stop);
}
void phy::set_activation_deactivation_scell(uint16_t rnti, bool activation[SRSLTE_MAX_CARRIERS])
{
Info("Set activation/deactivation not implemented\n");
}
void phy::get_metrics(phy_metrics_t metrics[ENB_METRICS_MAX_USERS])
{
phy_metrics_t metrics_tmp[ENB_METRICS_MAX_USERS] = {};
@ -259,11 +264,9 @@ void phy::set_config_dedicated(uint16_t rnti, const phy_rrc_dedicated_list_t& de
// Create list, empty by default
std::vector<uint32_t> scell_idx_list;
for (uint32_t i = 0; i < dedicated_list.size(); i++) {
auto& config = dedicated_list[i];
for (const auto& config : dedicated_list) {
// Configure only if active, ignore otherwise
if (config.active) {
if (config.configured) {
// Set PCell/SCell index in list
scell_idx_list.push_back(config.cc_idx);

View File

@ -306,7 +306,6 @@ void mac::rl_ok(uint16_t rnti)
int mac::ack_info(uint32_t tti, uint16_t rnti, uint32_t cc_idx, uint32_t tb_idx, bool ack)
{
// TODO: add cc_idx to interface
pthread_rwlock_rdlock(&rwlock);
log_h->step(tti);
uint32_t nof_bytes = scheduler.dl_ack_info(tti, rnti, cc_idx, tb_idx, ack);
@ -322,10 +321,8 @@ int mac::ack_info(uint32_t tti, uint16_t rnti, uint32_t cc_idx, uint32_t tb_idx,
return 0;
}
int mac::crc_info(uint32_t tti, uint16_t rnti, uint32_t nof_bytes, bool crc)
int mac::crc_info(uint32_t tti, uint16_t rnti, uint32_t cc_idx, uint32_t nof_bytes, bool crc)
{
// TODO: add cc_idx to interface
uint32_t cc_idx = 0;
log_h->step(tti);
int ret = -1;
pthread_rwlock_rdlock(&rwlock);
@ -351,10 +348,8 @@ int mac::crc_info(uint32_t tti, uint16_t rnti, uint32_t nof_bytes, bool crc)
return ret;
}
int mac::ri_info(uint32_t tti, uint16_t rnti, uint32_t ri_value)
int mac::ri_info(uint32_t tti, uint16_t rnti, uint32_t cc_idx, uint32_t ri_value)
{
// TODO: add cc_idx to interface
uint32_t cc_idx = 0;
log_h->step(tti);
int ret = -1;
pthread_rwlock_rdlock(&rwlock);
@ -369,10 +364,8 @@ int mac::ri_info(uint32_t tti, uint16_t rnti, uint32_t ri_value)
return ret;
}
int mac::pmi_info(uint32_t tti, uint16_t rnti, uint32_t pmi_value)
int mac::pmi_info(uint32_t tti, uint16_t rnti, uint32_t cc_idx, uint32_t pmi_value)
{
// TODO: add cc_idx to interface
uint32_t cc_idx = 0;
log_h->step(tti);
pthread_rwlock_rdlock(&rwlock);
int ret = -1;
@ -404,10 +397,8 @@ int mac::cqi_info(uint32_t tti, uint16_t rnti, uint32_t cc_idx, uint32_t cqi_val
return ret;
}
int mac::snr_info(uint32_t tti, uint16_t rnti, float snr)
int mac::snr_info(uint32_t tti, uint16_t rnti, uint32_t cc_idx, float snr)
{
// TODO: add cc_idx to interface
uint32_t cc_idx = 0;
log_h->step(tti);
int ret = -1;
pthread_rwlock_rdlock(&rwlock);

View File

@ -2154,15 +2154,15 @@ void rrc::ue::apply_setup_phy_config(const asn1::rrc::phys_cfg_ded_s& phys_cfg_d
}
// Set PCell index
phy_rrc_dedicated_list[0].active = true;
phy_rrc_dedicated_list[0].cc_idx = current_sched_ue_cfg.supported_cc_list[0].enb_cc_idx;
phy_rrc_dedicated_list[0].configured = true;
phy_rrc_dedicated_list[0].cc_idx = current_sched_ue_cfg.supported_cc_list[0].enb_cc_idx;
// Load PCell dedicated configuration
srslte::set_phy_cfg_t_dedicated_cfg(&phy_rrc_dedicated_list[0].phy_cfg, phys_cfg_ded);
// Deactivates eNb/Cells for this UE
for (uint32_t cc = 1; cc < phy_rrc_dedicated_list.size(); cc++) {
phy_rrc_dedicated_list[cc].active = false;
phy_rrc_dedicated_list[cc].configured = false;
}
// Send configuration to physical layer
@ -2211,8 +2211,8 @@ void rrc::ue::apply_reconf_phy_config(const asn1::rrc::rrc_conn_recfg_r8_ies_s&
auto& phy_rrc_dedicated = phy_rrc_dedicated_list[scell_idx];
// Set eNb Cell/Carrier index
phy_rrc_dedicated.active = true;
phy_rrc_dedicated.cc_idx = current_sched_ue_cfg.supported_cc_list[scell_idx].enb_cc_idx;
phy_rrc_dedicated.configured = true;
phy_rrc_dedicated.cc_idx = current_sched_ue_cfg.supported_cc_list[scell_idx].enb_cc_idx;
// Set SCell configuration
srslte::set_phy_cfg_t_scell_config(&phy_rrc_dedicated.phy_cfg, scell_config);
@ -2233,7 +2233,7 @@ void rrc::ue::apply_reconf_phy_config(const asn1::rrc::rrc_conn_recfg_r8_ies_s&
parent->rrc_log->error("SCell index (%d) is reserved for PCell\n", scell_to_release);
} else if (scell_to_release < current_sched_ue_cfg.supported_cc_list.size()) {
// Deactivate cell configuration
phy_rrc_dedicated_list[scell_to_release].active = false;
phy_rrc_dedicated_list[scell_to_release].configured = false;
} else {
// Out of bounds, log error
parent->rrc_log->error("SCell index (%d) points out of the supported list (%ld)\n",

View File

@ -330,12 +330,12 @@ public:
notify_rach_detected();
return 0;
}
int ri_info(uint32_t tti, uint16_t rnti, uint32_t ri_value) override
int ri_info(uint32_t tti, uint16_t rnti, uint32_t cc_idx, uint32_t ri_value) override
{
notify_ri_info();
return 0;
}
int pmi_info(uint32_t tti, uint16_t rnti, uint32_t pmi_value) override
int pmi_info(uint32_t tti, uint16_t rnti, uint32_t cc_idx, uint32_t pmi_value) override
{
notify_pmi_info();
return 0;
@ -345,7 +345,7 @@ public:
notify_cqi_info();
return 0;
}
int snr_info(uint32_t tti, uint16_t rnti, float snr_db) override
int snr_info(uint32_t tti, uint16_t rnti, uint32_t cc_idx, float snr_db) override
{
notify_snr_info();
return 0;
@ -363,7 +363,7 @@ public:
notify_ack_info();
return 0;
}
int crc_info(uint32_t tti, uint16_t rnti, uint32_t nof_bytes, bool crc_res) override
int crc_info(uint32_t tti, uint16_t rnti, uint32_t cc_idx, uint32_t nof_bytes, bool crc_res) override
{
notify_crc_info();
return 0;
@ -769,7 +769,7 @@ public:
for (uint32_t i = 0; i < 4; i++) {
common_dedicated.dl_cfg.cqi_report.pmi_idx = 16 + i;
dedicated_list[i].cc_idx = (i + pcell_idx) % phy_cfg.phy_cell_cfg.size();
dedicated_list[i].active = true;
dedicated_list[i].configured = true;
dedicated_list[i].phy_cfg = common_dedicated;
// Disable SCell stuff