diff --git a/lib/include/srslte/interfaces/ue_interfaces.h b/lib/include/srslte/interfaces/ue_interfaces.h index 294961ac0..37b008927 100644 --- a/lib/include/srslte/interfaces/ue_interfaces.h +++ b/lib/include/srslte/interfaces/ue_interfaces.h @@ -589,6 +589,8 @@ public: virtual void set_config_mbsfn_sib13(const srslte::sib13_t& sib13) = 0; virtual void set_config_mbsfn_mcch(const srslte::mcch_msg_t& mcch) = 0; + virtual void set_activation_deactivation_scell(uint32_t cmd) = 0; + /* Measurements interface */ virtual void set_cells_to_meas(uint32_t earfcn, const std::set& pci) = 0; virtual void meas_stop() = 0; diff --git a/lib/include/srslte/test/ue_test_interfaces.h b/lib/include/srslte/test/ue_test_interfaces.h index f60882c97..548ef290c 100644 --- a/lib/include/srslte/test/ue_test_interfaces.h +++ b/lib/include/srslte/test/ue_test_interfaces.h @@ -74,6 +74,7 @@ class phy_dummy_interface : public phy_interface_rrc_lte void set_config_mbsfn_sib2(srslte::mbsfn_sf_cfg_t* cfg_list, uint32_t nof_cfgs) {} void set_config_mbsfn_sib13(const srslte::sib13_t& sib13) {} void set_config_mbsfn_mcch(const srslte::mcch_msg_t& mcch) {} + void set_activation_deactivation_scell(uint32_t cmd) {} /* Measurements interface */ void set_cells_to_meas(uint32_t earfcn, const std::set& pci) {} diff --git a/srsue/hdr/stack/rrc/rrc_meas.h b/srsue/hdr/stack/rrc/rrc_meas.h index 88e9f9834..604eacc12 100644 --- a/srsue/hdr/stack/rrc/rrc_meas.h +++ b/srsue/hdr/stack/rrc/rrc_meas.h @@ -45,6 +45,7 @@ public: void init(rrc* rrc_ptr); void reset(); bool parse_meas_config(const rrc_conn_recfg_r8_ies_s* meas_config, bool is_ho_reest = false, uint32_t src_earfcn = 0); + void ho_reest_actions(const uint32_t src_earfcn, const uint32_t dst_earfcn); void run_tti(); void update_phy(); float rsrp_filter(const float new_value, const float avg_value); diff --git a/srsue/src/stack/rrc/rrc.cc b/srsue/src/stack/rrc/rrc.cc index 4769cf03f..31a354e76 100644 --- a/srsue/src/stack/rrc/rrc.cc +++ b/srsue/src/stack/rrc/rrc.cc @@ -2310,6 +2310,9 @@ void rrc::handle_con_reest(const rrc_conn_reest_s& reest) // Resume SRB1 rlc->resume_bearer(1); + // perform the measurement related actions as specified in 5.5.6.1; + measurements->ho_reest_actions(get_serving_cell()->get_earfcn(), get_serving_cell()->get_earfcn()); + // Send ConnectionSetupComplete message send_con_restablish_complete(); diff --git a/srsue/src/stack/rrc/rrc_meas.cc b/srsue/src/stack/rrc/rrc_meas.cc index 713a64ebd..7cac8c4a7 100644 --- a/srsue/src/stack/rrc/rrc_meas.cc +++ b/srsue/src/stack/rrc/rrc_meas.cc @@ -90,19 +90,18 @@ bool rrc::rrc_meas::parse_meas_config(const rrc_conn_recfg_r8_ies_s* mob_reconf_ bool ret = true; if (mob_reconf_r8->meas_cfg_present) { ret = meas_cfg.parse_meas_config(&mob_reconf_r8->meas_cfg, is_ho_reest, src_earfcn); - } else { - cell_t* serv_cell = rrc_ptr->get_serving_cell(); - if (serv_cell != nullptr) { - // Run 5.5.6.1 if we don't receive Measurement configuration - meas_cfg.ho_reest_finish(src_earfcn, serv_cell->get_earfcn()); - } else { - log_h->warning("MEAS: Could not call ho_reest_finish because serving_cell is null\n"); - } + update_phy(); } - update_phy(); return ret; } +// Section 5.5.6.1 Actions upon handover and re-establishment +void rrc::rrc_meas::ho_reest_actions(const uint32_t src_earfcn, const uint32_t dst_earfcn) +{ + meas_cfg.ho_reest_finish(src_earfcn, dst_earfcn); + update_phy(); +} + void rrc::rrc_meas::run_tti() { std::lock_guard lock(meas_cfg_mutex); diff --git a/srsue/src/stack/rrc/rrc_procedures.cc b/srsue/src/stack/rrc/rrc_procedures.cc index 7a29c45a8..2cbe7b1fd 100644 --- a/srsue/src/stack/rrc/rrc_procedures.cc +++ b/srsue/src/stack/rrc/rrc_procedures.cc @@ -1382,7 +1382,7 @@ srslte::proc_outcome_t rrc::ho_proc::init(const asn1::rrc::rrc_conn_recfg_s& rrc rrc_ptr->mac->get_rntis(&uernti); ho_src_rnti = uernti.crnti; - // Section 5.3.5.4 + // Section 5.3.5.4. The implementation of the procedure follows in function step() rrc_ptr->t310.stop(); rrc_ptr->t304.set(mob_ctrl_info->t304.to_number(), [this](uint32_t tid) { rrc_ptr->timer_expired(tid); }); rrc_ptr->t304.run(); @@ -1480,6 +1480,12 @@ srslte::proc_outcome_t rrc::ho_proc::step() rrc_ptr->mac->reset(); rrc_ptr->phy->reset(); + // configure lower layers to consider the SCell(s), if configured, to be in deactivated state; + rrc_ptr->phy->set_activation_deactivation_scell(0); + + // Todo: perform radio configuration when fullConfig is enabled + + // apply the value of the newUE-Identity as the C-RNTI; rrc_ptr->mac->set_ho_rnti(recfg_r8.mob_ctrl_info.new_ue_id.to_number(), recfg_r8.mob_ctrl_info.target_pci); // Apply common config, but do not send to lower layers if Dedicated is present (to avoid sending twice) @@ -1493,6 +1499,15 @@ srslte::proc_outcome_t rrc::ho_proc::step() cell_t* target_cell = rrc_ptr->meas_cells.get_neighbour_cell_handle(target_earfcn, recfg_r8.mob_ctrl_info.target_pci); + // if the RRCConnectionReconfiguration message includes the measConfig: + if (not rrc_ptr->measurements->parse_meas_config(&recfg_r8, true, ho_src_cell.get_earfcn())) { + Error("Parsing measurementConfig. TODO: Send ReconfigurationReject\n"); + return proc_outcome_t::error; + } + + // perform the measurement related actions as specified in 5.5.6.1; + rrc_ptr->measurements->ho_reest_actions(ho_src_cell.get_earfcn(), rrc_ptr->get_serving_cell()->get_earfcn()); + Info("Starting cell selection of target cell %s\n", target_cell->to_string().c_str()); if (not rrc_ptr->phy_ctrl->start_cell_select(target_cell->phy_cell, rrc_ptr->ho_handler)) { @@ -1522,11 +1537,6 @@ srslte::proc_outcome_t rrc::ho_proc::react(ra_completed_ev ev) // TS 36.331, sec. 5.3.5.4, last "1>" rrc_ptr->t304.stop(); rrc_ptr->apply_rr_config_dedicated_on_ho_complete(recfg_r8.rr_cfg_ded); - - if (not rrc_ptr->measurements->parse_meas_config(&recfg_r8, true, ho_src_cell.get_earfcn())) { - Error("Parsing measurementConfig. TODO: Send ReconfigurationReject\n"); - ho_successful = false; - } } return ho_successful ? proc_outcome_t::success : proc_outcome_t::error; diff --git a/srsue/test/upper/rrc_meas_test.cc b/srsue/test/upper/rrc_meas_test.cc index ab71d0d93..d716d134a 100644 --- a/srsue/test/upper/rrc_meas_test.cc +++ b/srsue/test/upper/rrc_meas_test.cc @@ -54,6 +54,7 @@ public: void set_config_mbsfn_mcch(const srslte::mcch_msg_t& mcch) override {} cell_search_ret_t cell_search(phy_cell_t* cell) override { return {}; } bool cell_is_camping() override { return false; } + void set_activation_deactivation_scell(uint32_t cmd) override {} bool cell_select(const phy_cell_t* cell = nullptr) override { last_selected_cell = *cell;