diff --git a/lib/include/srslte/interfaces/sched_interface.h b/lib/include/srslte/interfaces/sched_interface.h index a351293d1..737ef245d 100644 --- a/lib/include/srslte/interfaces/sched_interface.h +++ b/lib/include/srslte/interfaces/sched_interface.h @@ -145,6 +145,7 @@ public: std::vector supported_cc_list; ///< list of UE supported CCs. First index for PCell ant_info_ded_t dl_ant_info; bool use_tbs_index_alt = false; + bool support_ul_64qam = false; }; typedef struct { diff --git a/lib/src/asn1/rrc_utils.cc b/lib/src/asn1/rrc_utils.cc index 7c9698f2e..da3800162 100644 --- a/lib/src/asn1/rrc_utils.cc +++ b/lib/src/asn1/rrc_utils.cc @@ -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; if (rf_params.supported_band_list_eutra_v1250_present) { 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) { ue_cap.support_dl_256qam &= supported_band.dl_minus256_qam_r12_present; diff --git a/srsenb/hdr/stack/mac/scheduler_ue.h b/srsenb/hdr/stack/mac/scheduler_ue.h index ab9d48dcb..3b52737b0 100644 --- a/srsenb/hdr/stack/mac/scheduler_ue.h +++ b/srsenb/hdr/stack/mac/scheduler_ue.h @@ -73,9 +73,6 @@ struct cc_sched_ue { uint32_t ul_cqi_tti = 0; 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_aggr_level = 3; int fixed_mcs_ul = 0, fixed_mcs_dl = 0; diff --git a/srsenb/hdr/stack/rrc/mac_controller.h b/srsenb/hdr/stack/rrc/mac_controller.h index d5e0d1917..32f455919 100644 --- a/srsenb/hdr/stack/rrc/mac_controller.h +++ b/srsenb/hdr/stack/rrc/mac_controller.h @@ -43,11 +43,14 @@ public: void handle_con_setup_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_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); + void handle_target_enb_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); const ue_cfg_t& get_ue_sched_cfg() const { return current_sched_ue_cfg; } diff --git a/srsenb/src/stack/mac/scheduler_ue.cc b/srsenb/src/stack/mac/scheduler_ue.cc index e87638240..6ad84cef6 100644 --- a/srsenb/src/stack/mac/scheduler_ue.cc +++ b/srsenb/src/stack/mac/scheduler_ue.cc @@ -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) { - - uint32_t cqi = is_ul ? ul_cqi : dl_cqi; - uint32_t max_mcs = is_ul ? max_mcs_ul : (cfg->use_tbs_index_alt) ? max_mcs_dl_alt : max_mcs_dl; - uint32_t max_Qm = is_ul and not ul_64qam_enabled ? 4 : (not is_ul and use_tbs_index_alt ? 8 : 6); + uint32_t cqi, max_mcs, max_Qm; + float max_coderate; + if (is_ul) { + 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 - float max_coderate = srslte_cqi_to_coderate(std::min(cqi + 1u, 15u), use_tbs_index_alt); - int sel_mcs = max_mcs + 1; - float coderate = 99; - int tbs = 0; - uint32_t Qm = 0; + int sel_mcs = max_mcs + 1; + float coderate = 99; + int tbs = 0; + uint32_t Qm = 0; do { sel_mcs--; diff --git a/srsenb/src/stack/rrc/mac_controller.cc b/srsenb/src/stack/rrc/mac_controller.cc index 649d8df31..39eda7e34 100644 --- a/srsenb/src/stack/rrc/mac_controller.cc +++ b/srsenb/src/stack/rrc/mac_controller.cc @@ -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 * only take effect after the RRCReconfigurationComplete is received */ -void ue_cfg_apply_reconf_complete_updates(ue_cfg_t& ue_cfg, - const rrc_conn_recfg_r8_ies_s& conn_recfg, - const cell_ctxt_dedicated_list& ue_cell_list); +void ue_cfg_apply_reconf_complete_updates(ue_cfg_t& ue_cfg, + const rrc_conn_recfg_r8_ies_s& conn_recfg, + 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 @@ -191,7 +192,8 @@ void rrc::ue::mac_controller::handle_con_reest_complete() 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) { 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 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) 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) { 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; - 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) 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); } -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.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) { 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 // 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, - const rrc_conn_recfg_r8_ies_s& conn_recfg, - const cell_ctxt_dedicated_list& ue_cell_list) +void ue_cfg_apply_reconf_complete_updates(ue_cfg_t& ue_cfg, + const rrc_conn_recfg_r8_ies_s& conn_recfg, + const cell_ctxt_dedicated_list& ue_cell_list, + const srslte::rrc_ue_capabilities_t& uecaps) { // Configure RadioResourceConfigDedicated 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 diff --git a/srsenb/src/stack/rrc/rrc_mobility.cc b/srsenb/src/stack/rrc/rrc_mobility.cc index a08f67679..9f0b51c32 100644 --- a/srsenb/src/stack/rrc/rrc_mobility.cc +++ b/srsenb/src/stack/rrc/rrc_mobility.cc @@ -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_rlc_rb_updates(rrc_ue->current_rr_cfg); // 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 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(); // 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_reconf_phy_config(reconf_r8, false); diff --git a/srsenb/src/stack/rrc/rrc_ue.cc b/srsenb/src/stack/rrc/rrc_ue.cc index 833030506..c73716e1c 100644 --- a/srsenb/src/stack/rrc/rrc_ue.cc +++ b/srsenb/src/stack/rrc/rrc_ue.cc @@ -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); // UE MAC scheduler updates - mac_ctrl->handle_con_reconf(recfg_r8); + mac_ctrl->handle_con_reconf(recfg_r8, ue_capabilities); // Reuse same PDU 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) { 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_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 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 phy_rrc_dedicated_list[scell.scell_idx_r10] = scell_phy_rrc_ded; }