Fix the order of HO/reest measurement actions (#1696)

master
Ismael Gomez 4 years ago committed by GitHub
parent 33bb8388a5
commit f49fbd6d02
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

@ -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<uint32_t>& pci) = 0;
virtual void meas_stop() = 0;

@ -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<uint32_t>& pci) {}

@ -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);

@ -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();

@ -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<std::mutex> lock(meas_cfg_mutex);

@ -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;

@ -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;

Loading…
Cancel
Save