add UL 64QAM support to eNB RRC and scheduler

master
Francisco Paisana 4 years ago committed by Andre Puschmann
parent 5f7f818abb
commit bf7c587e4f

@ -145,6 +145,7 @@ public:
std::vector<cc_cfg_t> supported_cc_list; ///< list of UE supported CCs. First index for PCell std::vector<cc_cfg_t> supported_cc_list; ///< list of UE supported CCs. First index for PCell
ant_info_ded_t dl_ant_info; ant_info_ded_t dl_ant_info;
bool use_tbs_index_alt = false; bool use_tbs_index_alt = false;
bool support_ul_64qam = false;
}; };
typedef struct { typedef struct {

@ -878,6 +878,8 @@ static void set_rrc_ue_eutra_cap_t_gen(rrc_ue_capabilities_t&
const asn1::rrc::rf_params_v1250_s& rf_params = ue_eutra_cap.rf_params_v1250; const asn1::rrc::rf_params_v1250_s& rf_params = ue_eutra_cap.rf_params_v1250;
if (rf_params.supported_band_list_eutra_v1250_present) { if (rf_params.supported_band_list_eutra_v1250_present) {
ue_cap.support_dl_256qam = true; ue_cap.support_dl_256qam = true;
ue_cap.support_ul_64qam = (ue_cap.category == 5) or (ue_cap.category == 8 and ue_cap.release >= 10) or
(ue_cap.category_ul == 5 or ue_cap.category_ul == 13 and ue_cap.release >= 12);
for (const asn1::rrc::supported_band_eutra_v1250_s& supported_band : rf_params.supported_band_list_eutra_v1250) { for (const asn1::rrc::supported_band_eutra_v1250_s& supported_band : rf_params.supported_band_list_eutra_v1250) {
ue_cap.support_dl_256qam &= supported_band.dl_minus256_qam_r12_present; ue_cap.support_dl_256qam &= supported_band.dl_minus256_qam_r12_present;

@ -73,9 +73,6 @@ struct cc_sched_ue {
uint32_t ul_cqi_tti = 0; uint32_t ul_cqi_tti = 0;
bool dl_cqi_rx = false; bool dl_cqi_rx = false;
// Enables or disables uplink 64QAM. Not yet functional.
bool ul_64qam_enabled = false;
uint32_t max_mcs_dl = 28, max_mcs_dl_alt = 27, max_mcs_ul = 28; uint32_t max_mcs_dl = 28, max_mcs_dl_alt = 27, max_mcs_ul = 28;
uint32_t max_aggr_level = 3; uint32_t max_aggr_level = 3;
int fixed_mcs_ul = 0, fixed_mcs_dl = 0; int fixed_mcs_ul = 0, fixed_mcs_dl = 0;

@ -43,11 +43,14 @@ public:
void handle_con_setup_complete(); void handle_con_setup_complete();
void handle_con_reest_complete(); void handle_con_reest_complete();
void handle_con_reconf(const asn1::rrc::rrc_conn_recfg_r8_ies_s& conn_recfg); void handle_con_reconf(const asn1::rrc::rrc_conn_recfg_r8_ies_s& conn_recfg,
const srslte::rrc_ue_capabilities_t& uecaps);
void handle_con_reconf_complete(); void handle_con_reconf_complete();
void handle_target_enb_ho_cmd(const asn1::rrc::rrc_conn_recfg_r8_ies_s& conn_recfg); void handle_target_enb_ho_cmd(const asn1::rrc::rrc_conn_recfg_r8_ies_s& conn_recfg,
void handle_intraenb_ho_cmd(const asn1::rrc::rrc_conn_recfg_r8_ies_s& conn_recfg); const srslte::rrc_ue_capabilities_t& uecaps);
void handle_intraenb_ho_cmd(const asn1::rrc::rrc_conn_recfg_r8_ies_s& conn_recfg,
const srslte::rrc_ue_capabilities_t& uecaps);
void handle_ho_prep(const asn1::rrc::ho_prep_info_r8_ies_s& ho_prep); void handle_ho_prep(const asn1::rrc::ho_prep_info_r8_ies_s& ho_prep);
const ue_cfg_t& get_ue_sched_cfg() const { return current_sched_ue_cfg; } const ue_cfg_t& get_ue_sched_cfg() const { return current_sched_ue_cfg; }

@ -1239,17 +1239,25 @@ int sched_ue::enb_to_ue_cc_idx(uint32_t enb_cc_idx) const
int cc_sched_ue::cqi_to_tbs(uint32_t nof_prb, uint32_t nof_re, bool use_tbs_index_alt, bool is_ul, uint32_t* mcs) int cc_sched_ue::cqi_to_tbs(uint32_t nof_prb, uint32_t nof_re, bool use_tbs_index_alt, bool is_ul, uint32_t* mcs)
{ {
uint32_t cqi, max_mcs, max_Qm;
uint32_t cqi = is_ul ? ul_cqi : dl_cqi; float max_coderate;
uint32_t max_mcs = is_ul ? max_mcs_ul : (cfg->use_tbs_index_alt) ? max_mcs_dl_alt : max_mcs_dl; if (is_ul) {
uint32_t max_Qm = is_ul and not ul_64qam_enabled ? 4 : (not is_ul and use_tbs_index_alt ? 8 : 6); cqi = ul_cqi;
max_mcs = cfg->support_ul_64qam ? max_mcs_ul : std::min(max_mcs_ul, 20u);
max_Qm = cfg->support_ul_64qam ? 6 : 4;
max_coderate = srslte_cqi_to_coderate(std::min(cqi + 1u, 15u), false);
} else {
cqi = dl_cqi;
max_mcs = cfg->use_tbs_index_alt ? max_mcs_dl_alt : max_mcs_dl;
max_Qm = use_tbs_index_alt ? 8 : 6;
max_coderate = srslte_cqi_to_coderate(std::min(cqi + 1u, 15u), use_tbs_index_alt);
}
// Take the upper bound code-rate // Take the upper bound code-rate
float max_coderate = srslte_cqi_to_coderate(std::min(cqi + 1u, 15u), use_tbs_index_alt); int sel_mcs = max_mcs + 1;
int sel_mcs = max_mcs + 1; float coderate = 99;
float coderate = 99; int tbs = 0;
int tbs = 0; uint32_t Qm = 0;
uint32_t Qm = 0;
do { do {
sel_mcs--; sel_mcs--;

@ -62,9 +62,10 @@ void ue_cfg_apply_srb_updates(ue_cfg_t& ue_cfg, const srb_to_add_mod_list_l& srb
* Adds to sched_interface::ue_cfg_t the changes present in the asn1 RRCReconfiguration message that should * Adds to sched_interface::ue_cfg_t the changes present in the asn1 RRCReconfiguration message that should
* only take effect after the RRCReconfigurationComplete is received * only take effect after the RRCReconfigurationComplete is received
*/ */
void ue_cfg_apply_reconf_complete_updates(ue_cfg_t& ue_cfg, void ue_cfg_apply_reconf_complete_updates(ue_cfg_t& ue_cfg,
const rrc_conn_recfg_r8_ies_s& conn_recfg, const rrc_conn_recfg_r8_ies_s& conn_recfg,
const cell_ctxt_dedicated_list& ue_cell_list); const cell_ctxt_dedicated_list& ue_cell_list,
const srslte::rrc_ue_capabilities_t& uecaps);
/** /**
* Adds to sched_interface::ue_cfg_t the changes present in the asn1 RRCReconfiguration message related to * Adds to sched_interface::ue_cfg_t the changes present in the asn1 RRCReconfiguration message related to
@ -191,7 +192,8 @@ void rrc::ue::mac_controller::handle_con_reest_complete()
mac->phy_config_enabled(rrc_ue->rnti, true); mac->phy_config_enabled(rrc_ue->rnti, true);
} }
void rrc::ue::mac_controller::handle_con_reconf(const asn1::rrc::rrc_conn_recfg_r8_ies_s& conn_recfg) void rrc::ue::mac_controller::handle_con_reconf(const asn1::rrc::rrc_conn_recfg_r8_ies_s& conn_recfg,
const srslte::rrc_ue_capabilities_t& uecaps)
{ {
if (conn_recfg.rr_cfg_ded_present and conn_recfg.rr_cfg_ded.phys_cfg_ded_present) { if (conn_recfg.rr_cfg_ded_present and conn_recfg.rr_cfg_ded.phys_cfg_ded_present) {
ue_cfg_apply_phy_cfg_ded(current_sched_ue_cfg, conn_recfg.rr_cfg_ded.phys_cfg_ded, *rrc_cfg); ue_cfg_apply_phy_cfg_ded(current_sched_ue_cfg, conn_recfg.rr_cfg_ded.phys_cfg_ded, *rrc_cfg);
@ -199,7 +201,7 @@ void rrc::ue::mac_controller::handle_con_reconf(const asn1::rrc::rrc_conn_recfg_
// Store MAC updates that are applied once RRCReconfigurationComplete is received // Store MAC updates that are applied once RRCReconfigurationComplete is received
next_sched_ue_cfg = current_sched_ue_cfg; next_sched_ue_cfg = current_sched_ue_cfg;
ue_cfg_apply_reconf_complete_updates(next_sched_ue_cfg, conn_recfg, rrc_ue->cell_ded_list); ue_cfg_apply_reconf_complete_updates(next_sched_ue_cfg, conn_recfg, rrc_ue->cell_ded_list, uecaps);
// Temporarily freeze new allocations for DRBs (SRBs are needed to send RRC Reconf Message) // Temporarily freeze new allocations for DRBs (SRBs are needed to send RRC Reconf Message)
set_drb_activation(false); set_drb_activation(false);
@ -238,14 +240,15 @@ void rrc::ue::mac_controller::apply_current_bearers_cfg()
} }
} }
void rrc::ue::mac_controller::handle_target_enb_ho_cmd(const asn1::rrc::rrc_conn_recfg_r8_ies_s& conn_recfg) void rrc::ue::mac_controller::handle_target_enb_ho_cmd(const asn1::rrc::rrc_conn_recfg_r8_ies_s& conn_recfg,
const srslte::rrc_ue_capabilities_t& uecaps)
{ {
if (conn_recfg.rr_cfg_ded_present and conn_recfg.rr_cfg_ded.phys_cfg_ded_present) { if (conn_recfg.rr_cfg_ded_present and conn_recfg.rr_cfg_ded.phys_cfg_ded_present) {
ue_cfg_apply_phy_cfg_ded(current_sched_ue_cfg, conn_recfg.rr_cfg_ded.phys_cfg_ded, *rrc_cfg); ue_cfg_apply_phy_cfg_ded(current_sched_ue_cfg, conn_recfg.rr_cfg_ded.phys_cfg_ded, *rrc_cfg);
} }
next_sched_ue_cfg = current_sched_ue_cfg; next_sched_ue_cfg = current_sched_ue_cfg;
ue_cfg_apply_reconf_complete_updates(next_sched_ue_cfg, conn_recfg, rrc_ue->cell_ded_list); ue_cfg_apply_reconf_complete_updates(next_sched_ue_cfg, conn_recfg, rrc_ue->cell_ded_list, uecaps);
// Temporarily freeze new allocations for DRBs (SRBs are needed to send RRC Reconf Message) // Temporarily freeze new allocations for DRBs (SRBs are needed to send RRC Reconf Message)
set_drb_activation(false); set_drb_activation(false);
@ -255,7 +258,8 @@ void rrc::ue::mac_controller::handle_target_enb_ho_cmd(const asn1::rrc::rrc_conn
mac->phy_config_enabled(rrc_ue->rnti, false); mac->phy_config_enabled(rrc_ue->rnti, false);
} }
void rrc::ue::mac_controller::handle_intraenb_ho_cmd(const asn1::rrc::rrc_conn_recfg_r8_ies_s& conn_recfg) void rrc::ue::mac_controller::handle_intraenb_ho_cmd(const asn1::rrc::rrc_conn_recfg_r8_ies_s& conn_recfg,
const srslte::rrc_ue_capabilities_t& uecaps)
{ {
next_sched_ue_cfg = current_sched_ue_cfg; next_sched_ue_cfg = current_sched_ue_cfg;
next_sched_ue_cfg.supported_cc_list.resize(1); next_sched_ue_cfg.supported_cc_list.resize(1);
@ -265,7 +269,7 @@ void rrc::ue::mac_controller::handle_intraenb_ho_cmd(const asn1::rrc::rrc_conn_r
if (conn_recfg.rr_cfg_ded_present and conn_recfg.rr_cfg_ded.phys_cfg_ded_present) { if (conn_recfg.rr_cfg_ded_present and conn_recfg.rr_cfg_ded.phys_cfg_ded_present) {
ue_cfg_apply_phy_cfg_ded(next_sched_ue_cfg, conn_recfg.rr_cfg_ded.phys_cfg_ded, *rrc_cfg); ue_cfg_apply_phy_cfg_ded(next_sched_ue_cfg, conn_recfg.rr_cfg_ded.phys_cfg_ded, *rrc_cfg);
} }
ue_cfg_apply_reconf_complete_updates(next_sched_ue_cfg, conn_recfg, rrc_ue->cell_ded_list); ue_cfg_apply_reconf_complete_updates(next_sched_ue_cfg, conn_recfg, rrc_ue->cell_ded_list, uecaps);
// Freeze SCells // Freeze SCells
// NOTE: this avoids that the UE receives an HOCmd retx from target cell and do an incorrect RLC-level concatenation // NOTE: this avoids that the UE receives an HOCmd retx from target cell and do an incorrect RLC-level concatenation
@ -381,9 +385,10 @@ void ue_cfg_apply_srb_updates(ue_cfg_t& ue_cfg, const srb_to_add_mod_list_l& srb
} }
} }
void ue_cfg_apply_reconf_complete_updates(ue_cfg_t& ue_cfg, void ue_cfg_apply_reconf_complete_updates(ue_cfg_t& ue_cfg,
const rrc_conn_recfg_r8_ies_s& conn_recfg, const rrc_conn_recfg_r8_ies_s& conn_recfg,
const cell_ctxt_dedicated_list& ue_cell_list) const cell_ctxt_dedicated_list& ue_cell_list,
const srslte::rrc_ue_capabilities_t& uecaps)
{ {
// Configure RadioResourceConfigDedicated // Configure RadioResourceConfigDedicated
if (conn_recfg.rr_cfg_ded_present) { if (conn_recfg.rr_cfg_ded_present) {
@ -448,6 +453,11 @@ void ue_cfg_apply_reconf_complete_updates(ue_cfg_t& ue_cfg
} }
} }
} }
// Params non-dependent on Reconf message content
if (uecaps.support_ul_64qam) {
ue_cfg.support_ul_64qam = true;
}
} }
} // namespace srsenb } // namespace srsenb

@ -1105,7 +1105,7 @@ void rrc::ue::rrc_mobility::handle_ho_req(idle_st& s, const ho_req_rx_ev& ho_req
rrc_ue->apply_pdcp_srb_updates(rrc_ue->current_rr_cfg); rrc_ue->apply_pdcp_srb_updates(rrc_ue->current_rr_cfg);
rrc_ue->apply_rlc_rb_updates(rrc_ue->current_rr_cfg); rrc_ue->apply_rlc_rb_updates(rrc_ue->current_rr_cfg);
// Update MAC // Update MAC
rrc_ue->mac_ctrl->handle_target_enb_ho_cmd(recfg_r8); rrc_ue->mac_ctrl->handle_target_enb_ho_cmd(recfg_r8, rrc_ue->ue_capabilities);
// Apply PHY updates // Apply PHY updates
rrc_ue->apply_reconf_phy_config(recfg_r8, true); rrc_ue->apply_reconf_phy_config(recfg_r8, true);
@ -1286,7 +1286,7 @@ void rrc::ue::rrc_mobility::intraenb_ho_st::enter(rrc_mobility* f, const ho_meas
rrc_conn_recfg_r8_ies_s& reconf_r8 = dl_dcch_msg.msg.c1().rrc_conn_recfg().crit_exts.c1().rrc_conn_recfg_r8(); rrc_conn_recfg_r8_ies_s& reconf_r8 = dl_dcch_msg.msg.c1().rrc_conn_recfg().crit_exts.c1().rrc_conn_recfg_r8();
// Apply changes to the MAC scheduler // Apply changes to the MAC scheduler
f->rrc_ue->mac_ctrl->handle_intraenb_ho_cmd(reconf_r8); f->rrc_ue->mac_ctrl->handle_intraenb_ho_cmd(reconf_r8, f->rrc_ue->ue_capabilities);
f->rrc_ue->apply_setup_phy_common(f->rrc_enb->cfg.sibs[1].sib2().rr_cfg_common, false); f->rrc_ue->apply_setup_phy_common(f->rrc_enb->cfg.sibs[1].sib2().rr_cfg_common, false);
f->rrc_ue->apply_reconf_phy_config(reconf_r8, false); f->rrc_ue->apply_reconf_phy_config(reconf_r8, false);

@ -507,7 +507,7 @@ void rrc::ue::send_connection_reconf(srslte::unique_byte_buffer_t pdu, bool phy_
apply_rlc_rb_updates(recfg_r8.rr_cfg_ded); apply_rlc_rb_updates(recfg_r8.rr_cfg_ded);
// UE MAC scheduler updates // UE MAC scheduler updates
mac_ctrl->handle_con_reconf(recfg_r8); mac_ctrl->handle_con_reconf(recfg_r8, ue_capabilities);
// Reuse same PDU // Reuse same PDU
if (pdu != nullptr) { if (pdu != nullptr) {
@ -1012,6 +1012,7 @@ void rrc::ue::apply_reconf_phy_config(const rrc_conn_recfg_r8_ies_s& reconfig_r8
if (rr_cfg_ded.phys_cfg_ded_present) { if (rr_cfg_ded.phys_cfg_ded_present) {
auto& phys_cfg_ded = rr_cfg_ded.phys_cfg_ded; auto& phys_cfg_ded = rr_cfg_ded.phys_cfg_ded;
srslte::set_phy_cfg_t_dedicated_cfg(&phy_rrc_dedicated_list[0].phy_cfg, phys_cfg_ded); srslte::set_phy_cfg_t_dedicated_cfg(&phy_rrc_dedicated_list[0].phy_cfg, phys_cfg_ded);
srslte::set_phy_cfg_t_enable_64qam(&phy_rrc_dedicated_list[0].phy_cfg, ue_capabilities.support_ul_64qam);
} }
} }
@ -1044,6 +1045,9 @@ void rrc::ue::apply_reconf_phy_config(const rrc_conn_recfg_r8_ies_s& reconfig_r8
// Get corresponding eNB CC index // Get corresponding eNB CC index
scell_phy_rrc_ded.enb_cc_idx = ue_cc->cell_common->enb_cc_idx; scell_phy_rrc_ded.enb_cc_idx = ue_cc->cell_common->enb_cc_idx;
srslte::set_phy_cfg_t_enable_64qam(&phy_rrc_dedicated_list[scell.scell_idx_r10].phy_cfg,
ue_capabilities.support_ul_64qam);
// Append to PHY RRC config dedicated which will be applied further down // Append to PHY RRC config dedicated which will be applied further down
phy_rrc_dedicated_list[scell.scell_idx_r10] = scell_phy_rrc_ded; phy_rrc_dedicated_list[scell.scell_idx_r10] = scell_phy_rrc_ded;
} }

Loading…
Cancel
Save