diff --git a/srsenb/hdr/stack/rrc/rrc_endc.h b/srsenb/hdr/stack/rrc/rrc_endc.h index 9d41171ab..a580750a9 100644 --- a/srsenb/hdr/stack/rrc/rrc_endc.h +++ b/srsenb/hdr/stack/rrc/rrc_endc.h @@ -85,6 +85,11 @@ private: rrc* rrc_enb = nullptr; srslog::basic_logger& logger; + // nr ids to deactivate in second reconfig + uint32_t nr_meas_obj_id = 0; + uint32_t nr_report_cfg_id = 0; + uint32_t nr_meas_id = 0; + // vars bool endc_supported = false; rrc_endc_cfg_t endc_cfg = {}; @@ -111,8 +116,8 @@ private: private: srslog::basic_logger& logger; }; - struct wait_add_complete_st {}; // user needs to complete RA procedure and send C-RNTI CE - struct endc_activated_st {}; // user has enabled EN-DC successfully and is currently served + struct wait_add_complete_st {}; // user needs to complete RA procedure and send C-RNTI CE + struct endc_activated_st {}; // user has enabled EN-DC successfully and is currently served struct wait_sgnb_rel_req_resp_st {}; // release EN-DC // FSM guards @@ -141,7 +146,7 @@ protected: // transitions using fsm = rrc_endc; // clang-format off - using transitions = transition_table< + using transitions = transition_table< // Start Target Event Action Guard // +---------------------------+--------------------------+------------------------+------------------------------+-------------------------+ row< endc_deactivated_st, wait_sgnb_add_req_resp_st, sgnb_add_req_sent_ev, nullptr >, @@ -154,7 +159,7 @@ protected: // +---------------------------+--------------------------+------------------------+------------------------------+-------------------------+ row< endc_activated_st, wait_sgnb_rel_req_resp_st, sgnb_rel_req_ev, &fsm::handle_sgnb_rel_req >, row< wait_sgnb_rel_req_resp_st, endc_deactivated_st, sgnb_rel_req_ack_ev > - + >; // clang-format on }; diff --git a/srsenb/src/stack/rrc/rrc_endc.cc b/srsenb/src/stack/rrc/rrc_endc.cc index a0b16707a..ac2bc5d5e 100644 --- a/srsenb/src/stack/rrc/rrc_endc.cc +++ b/srsenb/src/stack/rrc/rrc_endc.cc @@ -62,8 +62,11 @@ bool rrc::ue::rrc_endc::fill_conn_recfg(asn1::rrc::rrc_conn_recfg_r8_ies_s* conn meas_cfg.meas_obj_to_add_mod_list_present = true; + // store id of nr meas object to remove it in second reconfiguration message + nr_meas_obj_id = meas_cfg.meas_obj_to_add_mod_list.size() + 1; + meas_obj_to_add_mod_s meas_obj = {}; - meas_obj.meas_obj_id = meas_cfg.meas_obj_to_add_mod_list.size() + 1; + meas_obj.meas_obj_id = nr_meas_obj_id; meas_obj.meas_obj.set_meas_obj_nr_r15(); auto& meas_obj_nr = meas_obj.meas_obj.meas_obj_nr_r15(); meas_obj_nr.carrier_freq_r15 = endc_cfg.abs_frequency_ssb; @@ -77,9 +80,12 @@ bool rrc::ue::rrc_endc::fill_conn_recfg(asn1::rrc::rrc_conn_recfg_r8_ies_s* conn // report config meas_cfg.report_cfg_to_add_mod_list_present = true; - report_cfg_to_add_mod_s report_cfg = {}; - report_cfg.report_cfg_id = meas_cfg.report_cfg_to_add_mod_list.size() + 1; + // store id of nr report config to remove it in second reconfiguration message + nr_report_cfg_id = meas_cfg.report_cfg_to_add_mod_list.size() + 1; + + report_cfg_to_add_mod_s report_cfg = {}; + report_cfg.report_cfg_id = nr_report_cfg_id; report_cfg.report_cfg.set_report_cfg_inter_rat(); report_cfg.report_cfg.report_cfg_inter_rat().trigger_type.set_event(); report_cfg.report_cfg.report_cfg_inter_rat().trigger_type.event().event_id.set_event_b1_nr_r15(); @@ -108,10 +114,14 @@ bool rrc::ue::rrc_endc::fill_conn_recfg(asn1::rrc::rrc_conn_recfg_r8_ies_s* conn // measIdToAddModList meas_cfg.meas_id_to_add_mod_list_present = true; - meas_id_to_add_mod_s meas_id = {}; - meas_id.meas_id = meas_cfg.meas_id_to_add_mod_list.size() + 1; - meas_id.meas_obj_id = meas_obj.meas_obj_id; - meas_id.report_cfg_id = report_cfg.report_cfg_id; + + // store id of nr meas to remove it in second reconfiguration message + nr_meas_id = meas_cfg.meas_id_to_add_mod_list.size() + 1; + + meas_id_to_add_mod_s meas_id = {}; + meas_id.meas_id = nr_meas_id; + meas_id.meas_obj_id = meas_obj.meas_obj_id; + meas_id.report_cfg_id = report_cfg.report_cfg_id; meas_cfg.meas_id_to_add_mod_list.push_back(meas_id); // quantityConfig @@ -125,10 +135,26 @@ bool rrc::ue::rrc_endc::fill_conn_recfg(asn1::rrc::rrc_conn_recfg_r8_ies_s* conn meas_quant[0].meas_quant_cell_nr_r15.filt_coeff_rsrp_r15 = filt_coef_opts::fc3; // measGapConfig - meas_cfg.meas_gap_cfg_present = true; + meas_cfg.meas_gap_cfg_present = false; // No LTE measGaps allowed while in NSA mode meas_cfg.meas_gap_cfg.set_setup(); meas_cfg.meas_gap_cfg.setup().gap_offset.set_gp0() = 16; } else if (is_in_state()) { + // Deactivate measurement reports, as we do not support measurements after NR activation + conn_recfg->meas_cfg_present = true; + meas_cfg_s& meas_cfg = conn_recfg->meas_cfg; + // Remove meas config + meas_cfg.meas_obj_to_rem_list_present = true; + meas_cfg.meas_obj_to_rem_list.resize(1); + meas_cfg.meas_obj_to_rem_list[0] = nr_meas_obj_id; + // remove report config + meas_cfg.report_cfg_to_rem_list_present = true; + meas_cfg.report_cfg_to_rem_list.resize(1); + meas_cfg.report_cfg_to_rem_list[0] = nr_report_cfg_id; + // remove meas id + meas_cfg.meas_id_to_rem_list_present = true; + meas_cfg.meas_id_to_rem_list.resize(1); + meas_cfg.meas_id_to_rem_list[0] = nr_meas_id; + // FIXME: use bearer manager to remove EUTRA DRB conn_recfg->rr_cfg_ded.drb_to_release_list_present = true; conn_recfg->rr_cfg_ded.drb_to_release_list.resize(1);