In the case of Handover, postpone the activation of the CQI and SR config present in the HO command for after the RA proc completion to the target eNB

This commit is contained in:
Francisco Paisana 2020-08-27 17:14:15 +01:00
parent 641a4a5e79
commit fddcc3d8ea
5 changed files with 67 additions and 14 deletions

View File

@ -64,6 +64,7 @@ public:
asn1::rrc::meas_obj_to_add_mod_list_l& meas_objs() { return var_meas.meas_obj_list; }
asn1::rrc::report_cfg_to_add_mod_list_l& rep_cfgs() { return var_meas.report_cfg_list; }
asn1::rrc::meas_id_to_add_mod_list_l& meas_ids() { return var_meas.meas_id_list; }
std::string to_string() const;
static var_meas_cfg_t make(const asn1::rrc::meas_cfg_s& meas_cfg);

View File

@ -386,6 +386,13 @@ void var_meas_cfg_t::compute_diff_quant_cfg(const var_meas_cfg_t& target_cfg, as
}
}
std::string var_meas_cfg_t::to_string() const
{
asn1::json_writer js;
var_meas.to_json(js);
return js.to_string();
}
/**
* Convert MeasCfg asn1 struct to var_meas_cfg_t
* @param meas_cfg
@ -787,6 +794,8 @@ bool rrc::ue::rrc_mobility::update_ue_var_meas_cfg(const var_meas_cfg_t& source
// Update user varMeasCfg to target
rrc_ue->mobility_handler->ue_var_meas = target_var_ptr;
rrc_log->debug_long(
"New rnti=0x%x varMeasConfig: %s", rrc_ue->rnti, rrc_ue->mobility_handler->ue_var_meas->to_string().c_str());
return meas_cfg_present;
}
@ -1176,6 +1185,7 @@ bool rrc::ue::rrc_mobility::apply_ho_prep_cfg(const ho_prep_info_r8_ies_s& ho
// Save measConfig
ue_var_meas = std::make_shared<var_meas_cfg_t>(var_meas_cfg_t::make(ho_prep.as_cfg.source_meas_cfg));
rrc_log->debug_long("New rnti=0x%x varMeasConfig: %s", rrc_ue->rnti, ue_var_meas->to_string().c_str());
return true;
}

View File

@ -360,9 +360,10 @@ private:
void log_mac_config_dedicated();
void apply_rr_config_common(asn1::rrc::rr_cfg_common_s* config, bool send_lower_layers);
bool apply_rr_config_dedicated(const asn1::rrc::rr_cfg_ded_s* cnfg);
bool apply_rr_config_dedicated(const asn1::rrc::rr_cfg_ded_s* cnfg, bool is_handover = false);
bool apply_rr_config_dedicated_on_ho_complete(const asn1::rrc::rr_cfg_ded_s& cnfg);
void apply_scell_config(asn1::rrc::rrc_conn_recfg_r8_ies_s* reconfig_r8);
void apply_phy_config_dedicated(const asn1::rrc::phys_cfg_ded_s& phy_cnfg);
void apply_phy_config_dedicated(const asn1::rrc::phys_cfg_ded_s& phy_cnfg, bool is_handover);
void apply_phy_scell_config(const asn1::rrc::scell_to_add_mod_r10_s& scell_config);
void apply_mac_config_dedicated_default();

View File

@ -2016,9 +2016,14 @@ void rrc::set_phy_config_dedicated_default()
}
// Apply provided PHY config
void rrc::apply_phy_config_dedicated(const phys_cfg_ded_s& phy_cnfg)
void rrc::apply_phy_config_dedicated(const phys_cfg_ded_s& phy_cnfg, bool is_handover)
{
set_phy_cfg_t_dedicated_cfg(&current_phy_cfg, phy_cnfg);
if (is_handover) {
current_phy_cfg.ul_cfg.pucch.sr_configured = false;
current_phy_cfg.dl_cfg.cqi_report.periodic_configured = false;
current_phy_cfg.dl_cfg.cqi_report.aperiodic_configured = false;
}
log_phy_config_dedicated();
@ -2108,12 +2113,19 @@ void rrc::apply_mac_config_dedicated_default()
log_mac_config_dedicated();
}
bool rrc::apply_rr_config_dedicated(const rr_cfg_ded_s* cnfg)
/**
* Applies RadioResource Config changes to lower layers
* @param cnfg
* @param is_handover - whether the SR, CQI, SRS, measurement configs take effect immediately (see TS
* 36.331 5.3.5.4)
* @return
*/
bool rrc::apply_rr_config_dedicated(const rr_cfg_ded_s* cnfg, bool is_handover)
{
if (cnfg->phys_cfg_ded_present) {
apply_phy_config_dedicated(cnfg->phys_cfg_ded);
apply_phy_config_dedicated(cnfg->phys_cfg_ded, is_handover);
// Apply SR configuration to MAC
if (cnfg->phys_cfg_ded.sched_request_cfg_present) {
if (not is_handover and cnfg->phys_cfg_ded.sched_request_cfg_present) {
set_mac_cfg_t_sched_request_cfg(&current_mac_cfg, cnfg->phys_cfg_ded.sched_request_cfg);
}
}
@ -2125,7 +2137,7 @@ bool rrc::apply_rr_config_dedicated(const rr_cfg_ded_s* cnfg)
set_mac_cfg_t_main_cfg(&current_mac_cfg, cnfg->mac_main_cfg.explicit_value());
}
mac->set_config(current_mac_cfg);
} else if (cnfg->phys_cfg_ded.sched_request_cfg_present) {
} else if (not is_handover and cnfg->phys_cfg_ded.sched_request_cfg_present) {
// If MAC-main not set but SR config is set, use directly mac->set_config to update config
mac->set_config(current_mac_cfg);
log_mac_config_dedicated();
@ -2164,6 +2176,29 @@ bool rrc::apply_rr_config_dedicated(const rr_cfg_ded_s* cnfg)
return true;
}
bool rrc::apply_rr_config_dedicated_on_ho_complete(const rr_cfg_ded_s& cnfg)
{
// Apply SR+CQI configuration to PHY
if (cnfg.phys_cfg_ded_present) {
current_phy_cfg.ul_cfg.pucch.sr_configured = cnfg.phys_cfg_ded.sched_request_cfg_present;
if (cnfg.phys_cfg_ded.cqi_report_cfg_present) {
current_phy_cfg.dl_cfg.cqi_report.periodic_configured =
cnfg.phys_cfg_ded.cqi_report_cfg.cqi_report_periodic_present and
cnfg.phys_cfg_ded.cqi_report_cfg.cqi_report_periodic.type().value == setup_opts::setup;
current_phy_cfg.dl_cfg.cqi_report.aperiodic_configured =
cnfg.phys_cfg_ded.cqi_report_cfg.cqi_report_mode_aperiodic_present;
}
phy->set_config(current_phy_cfg);
}
// Apply SR configuration to MAC
if (cnfg.phys_cfg_ded.sched_request_cfg_present) {
set_mac_cfg_t_sched_request_cfg(&current_mac_cfg, cnfg.phys_cfg_ded.sched_request_cfg);
mac->set_config(current_mac_cfg);
}
return true;
}
/*
* Extracts and applies SCell configuration from an ASN.1 reconfiguration struct
*/

View File

@ -1486,7 +1486,8 @@ srslte::proc_outcome_t rrc::ho_proc::step()
rrc_ptr->apply_rr_config_common(&recfg_r8.mob_ctrl_info.rr_cfg_common, !recfg_r8.rr_cfg_ded_present);
if (recfg_r8.rr_cfg_ded_present) {
rrc_ptr->apply_rr_config_dedicated(&recfg_r8.rr_cfg_ded);
// Note: Disable SR config until RA completion
rrc_ptr->apply_rr_config_dedicated(&recfg_r8.rr_cfg_ded, true);
}
cell_t* target_cell =
@ -1515,22 +1516,27 @@ srslte::proc_outcome_t rrc::ho_proc::react(ra_completed_ev ev)
Warning("Received unexpected RA Complete Event\n");
return proc_outcome_t::yield;
}
bool ho_successful = ev.success and not sec_cfg_failed;
if (ev.success and not sec_cfg_failed) {
// 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 (ho_successful) {
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;
}
}
Info("HO %ssuccessful\n", ev.success ? "" : "un");
rrc_ptr->rrc_log->console("HO %ssuccessful\n", ev.success ? "" : "un");
return ev.success ? proc_outcome_t::success : proc_outcome_t::error;
return ho_successful ? proc_outcome_t::success : proc_outcome_t::error;
}
void rrc::ho_proc::then(const srslte::proc_state_t& result)
{
Info("Finished HO Preparation %s\n", result.is_success() ? "successfully" : "with error");
Info("HO %ssuccessful\n", result.is_success() ? "" : "un");
rrc_ptr->rrc_log->console("HO %ssuccessful\n", result.is_success() ? "" : "un");
if (result.is_success()) {
rrc_ptr->t304.stop();
} else if (rrc_ptr->t304.is_running()) {