diff --git a/srsenb/hdr/stack/rrc/rrc_mobility.h b/srsenb/hdr/stack/rrc/rrc_mobility.h index e3f7ebdb0..f9be09e94 100644 --- a/srsenb/hdr/stack/rrc/rrc_mobility.h +++ b/srsenb/hdr/stack/rrc/rrc_mobility.h @@ -143,9 +143,10 @@ private: // states struct idle_st {}; struct intraenb_ho_st { - const cell_info_common* target_cell = nullptr; - const cell_info_common* source_cell = nullptr; - uint16_t last_temp_crnti = SRSLTE_INVALID_RNTI; + const cell_info_common* target_cell = nullptr; + const cell_info_common* source_cell = nullptr; + uint16_t last_temp_crnti = SRSLTE_INVALID_RNTI; + asn1::rrc::rrc_conn_recfg_r8_ies_s pending_ho_cmd; void enter(rrc_mobility* f, const ho_meas_report_ev& meas_report); }; diff --git a/srsenb/hdr/stack/rrc/rrc_ue.h b/srsenb/hdr/stack/rrc/rrc_ue.h index 1b75741bf..3bd406ec1 100644 --- a/srsenb/hdr/stack/rrc/rrc_ue.h +++ b/srsenb/hdr/stack/rrc/rrc_ue.h @@ -155,7 +155,7 @@ private: * * @param config ASN1 Common SIB struct carrying the common physical layer parameters */ - void apply_setup_phy_common(const asn1::rrc::rr_cfg_common_sib_s& config); + void apply_setup_phy_common(const asn1::rrc::rr_cfg_common_sib_s& config, bool update_phy); /** * Setups the PCell physical layer dedicated configuration of the UE. This method shall be called from the diff --git a/srsenb/src/stack/rrc/rrc_mobility.cc b/srsenb/src/stack/rrc/rrc_mobility.cc index f49e0054e..56de68852 100644 --- a/srsenb/src/stack/rrc/rrc_mobility.cc +++ b/srsenb/src/stack/rrc/rrc_mobility.cc @@ -878,6 +878,9 @@ void rrc::ue::rrc_mobility::fill_mobility_reconf_common(asn1::rrc::dl_dcch_msg_s recfg_r8.rr_cfg_ded.phys_cfg_ded_present = true; phys_cfg_ded_s& phy_cfg = recfg_r8.rr_cfg_ded.phys_cfg_ded; + phy_cfg.pusch_cfg_ded_present = true; + phy_cfg.pusch_cfg_ded = rrc_enb->cfg.pusch_cfg; + // Set SR in new CC phy_cfg.sched_request_cfg_present = true; auto& sr_setup = phy_cfg.sched_request_cfg.set_setup(); @@ -1324,6 +1327,7 @@ void rrc::ue::rrc_mobility::intraenb_ho_st::enter(rrc_mobility* f, const ho_meas /* Prepare RRC Reconf Message with mobility info */ dl_dcch_msg_s dl_dcch_msg; f->fill_mobility_reconf_common(dl_dcch_msg, *target_cell, source_cell->cell_cfg.dl_earfcn); + pending_ho_cmd = dl_dcch_msg.msg.c1().rrc_conn_recfg().crit_exts.c1().rrc_conn_recfg_r8(); // Send DL-DCCH Message via current PCell if (not f->rrc_ue->send_dl_dcch(&dl_dcch_msg)) { @@ -1346,7 +1350,8 @@ void rrc::ue::rrc_mobility::handle_crnti_ce(intraenb_ho_st& s, const user_crnti_ // Change PCell in MAC/Scheduler rrc_ue->mac_ctrl->handle_crnti_ce(ev.temp_crnti); - rrc_ue->apply_setup_phy_common(s.target_cell->sib2.rr_cfg_common); + rrc_ue->apply_setup_phy_common(s.target_cell->sib2.rr_cfg_common, false); + rrc_ue->apply_reconf_phy_config(s.pending_ho_cmd); rrc_ue->ue_security_cfg.regenerate_keys_handover(s.target_cell->cell_cfg.pci, s.target_cell->cell_cfg.dl_earfcn); rrc_ue->bearer_list.reest_bearers(); diff --git a/srsenb/src/stack/rrc/rrc_ue.cc b/srsenb/src/stack/rrc/rrc_ue.cc index 6a037537d..a3eedcbe0 100644 --- a/srsenb/src/stack/rrc/rrc_ue.cc +++ b/srsenb/src/stack/rrc/rrc_ue.cc @@ -53,7 +53,7 @@ rrc::ue::ue(rrc* outer_rrc, uint16_t rnti_, const sched_interface::ue_cfg_t& sch } // Configure - apply_setup_phy_common(parent->cfg.sibs[1].sib2().rr_cfg_common); + apply_setup_phy_common(parent->cfg.sibs[1].sib2().rr_cfg_common, true); activity_timer = outer_rrc->task_sched.get_unique_timer(); set_activity_timeout(MSG3_RX_TIMEOUT); // next UE response is Msg3 @@ -1148,7 +1148,8 @@ int rrc::ue::fill_scell_to_addmod_list(asn1::rrc::rrc_conn_recfg_r8_ies_s* conn_ scell_phy_rrc_ded.enb_cc_idx = cc_cfg->enb_cc_idx; // Append to PHY RRC config dedicated which will be applied further down - phy_rrc_dedicated_list.push_back(scell_phy_rrc_ded); + phy_rrc_dedicated_list.resize(scell_idx + 1); + phy_rrc_dedicated_list[scell_idx] = scell_phy_rrc_ded; } // Set DL HARQ Feedback mode @@ -1316,7 +1317,7 @@ bool rrc::ue::send_dl_dcch(const dl_dcch_msg_s* dl_dcch_msg, srslte::unique_byte return true; } -void rrc::ue::apply_setup_phy_common(const asn1::rrc::rr_cfg_common_sib_s& config) +void rrc::ue::apply_setup_phy_common(const asn1::rrc::rr_cfg_common_sib_s& config, bool update_phy) { // Return if no cell is supported if (phy_rrc_dedicated_list.empty()) { @@ -1337,7 +1338,7 @@ void rrc::ue::apply_setup_phy_common(const asn1::rrc::rr_cfg_common_sib_s& confi phy_rrc_dedicated_list[0].enb_cc_idx = get_ue_cc_cfg(UE_PCELL_CC_IDX)->enb_cc_idx; // Send configuration to physical layer - if (parent->phy != nullptr) { + if (parent->phy != nullptr and update_phy) { parent->phy->set_config(rnti, phy_rrc_dedicated_list); } }