diff --git a/srsue/hdr/stack/rrc/rrc_procedures.h b/srsue/hdr/stack/rrc/rrc_procedures.h index 7bf6e0177..7618d982f 100644 --- a/srsue/hdr/stack/rrc/rrc_procedures.h +++ b/srsue/hdr/stack/rrc/rrc_procedures.h @@ -239,17 +239,16 @@ public: static const char* name() { return "Connection re-establishment"; } private: - enum class state_t { init, cell_reselection, cell_configuration, cell_criteria, success, error } state; + enum class state_t { cell_reselection, cell_configuration } state; rrc* rrc_ptr = nullptr; asn1::rrc::reest_cause_e reest_cause = asn1::rrc::reest_cause_e::nulltype; uint16_t reest_rnti = 0; uint16_t reest_source_pci = 0; - void step_init(); - void step_cell_reselection(); - void step_cell_configuration(); - void step_cell_criteria(); + srslte::proc_outcome_t step_cell_reselection(); + srslte::proc_outcome_t step_cell_configuration(); + srslte::proc_outcome_t cell_criteria(); }; } // namespace srsue diff --git a/srsue/src/stack/rrc/rrc_procedures.cc b/srsue/src/stack/rrc/rrc_procedures.cc index 82c11c84c..f33f9faa2 100644 --- a/srsue/src/stack/rrc/rrc_procedures.cc +++ b/srsue/src/stack/rrc/rrc_procedures.cc @@ -873,7 +873,7 @@ proc_outcome_t rrc::cell_reselection_proc::step() * RRC Connection Re-establishment procedure *************************************/ -rrc::connection_reest_proc::connection_reest_proc(srsue::rrc* rrc_) : rrc_ptr(rrc_), state(state_t::init) {} +rrc::connection_reest_proc::connection_reest_proc(srsue::rrc* rrc_) : rrc_ptr(rrc_), state(state_t::cell_reselection) {} proc_outcome_t rrc::connection_reest_proc::init(asn1::rrc::reest_cause_e cause) { @@ -892,127 +892,119 @@ proc_outcome_t rrc::connection_reest_proc::init(asn1::rrc::reest_cause_e cause) // the initiation of reestablishment procedure as indicates in 3GPP 36.331 Section 5.3.7.2 // Cannot be called from here because it has PHY-MAC re-configuration that should be performed in a different thread - Info("Conditions are meet\n"); - state = state_t::init; + Info("Conditions are meet. Initiating RRC Connection Reestablishment Procedure\n"); - } else { - // 3GPP 36.331 Section 5.3.7.1 - // If AS security has not been activated, the UE does not initiate the procedure but instead - // moves to RRC_IDLE directly - Info("Conditions are NOT meet\n"); - rrc_ptr->start_go_idle(); - state = state_t::success; - } - - return proc_outcome_t::yield; -} - -void rrc::connection_reest_proc::step_init() -{ - // initiation of reestablishment procedure as indicates in 3GPP 36.331 Section 5.3.7.2 - Info("Initiating RRC Connection Reestablishment Procedure\n"); + // stop timer T310, if running; + rrc_ptr->t310.stop(); - // stop timer T310, if running; - rrc_ptr->t310.stop(); + // start timer T311; + rrc_ptr->t311.run(); - // start timer T311; - rrc_ptr->t311.run(); - - // Suspend all RB except SRB0 - for (int i = 1; i < SRSLTE_N_RADIO_BEARERS; i++) { - if (rrc_ptr->rlc->has_bearer(i)) { - rrc_ptr->rlc->suspend_bearer(i); + // Suspend all RB except SRB0 + for (int i = 1; i < SRSLTE_N_RADIO_BEARERS; i++) { + if (rrc_ptr->rlc->has_bearer(i)) { + rrc_ptr->rlc->suspend_bearer(i); + } } - } - // reset MAC; - rrc_ptr->mac->reset(); + // reset MAC; + rrc_ptr->mac->reset(); - // apply the default physical channel configuration as specified in 9.2.4; - rrc_ptr->set_phy_default_pucch_srs(); + // apply the default physical channel configuration as specified in 9.2.4; + rrc_ptr->set_phy_default_pucch_srs(); - // apply the default semi-persistent scheduling configuration as specified in 9.2.3; - // N.A. + // apply the default semi-persistent scheduling configuration as specified in 9.2.3; + // N.A. - // apply the default MAC main configuration as specified in 9.2.2; - rrc_ptr->apply_mac_config_dedicated_default(); + // apply the default MAC main configuration as specified in 9.2.2; + rrc_ptr->apply_mac_config_dedicated_default(); - // Launch cell reselection - if (rrc_ptr->cell_reselector.launch()) { + // Launch cell reselection + if (not rrc_ptr->cell_reselector.launch()) { + Error("Failed to initiate a Cell re-selection procedure...\n"); + return proc_outcome_t::error; + } state = state_t::cell_reselection; + } else { - Error("Failed to initiate a Cell re-selection procedure...\n"); - state = state_t::error; + // 3GPP 36.331 Section 5.3.7.1 + // If AS security has not been activated, the UE does not initiate the procedure but instead + // moves to RRC_IDLE directly + Info("Conditions are NOT meet\n"); + rrc_ptr->start_go_idle(); + return proc_outcome_t::success; } + + return proc_outcome_t::yield; } -void rrc::connection_reest_proc::step_cell_reselection() +srslte::proc_outcome_t rrc::connection_reest_proc::step_cell_reselection() { - if (!rrc_ptr->t311.is_running()) { - Info("During cell reselection, T311 expired. Aborting.\n"); - state = state_t::success; - } else if (rrc_ptr->cell_reselector.run()) { - // Keep running, do nothing - } else if (!rrc_ptr->serving_cell->in_sync) { - Info("Serving cell is out-of-sync, re-launching re-selection procedure\n"); - if (rrc_ptr->cell_reselector.launch()) { - state = state_t::cell_reselection; - } else { - // Error launching procedure - state = state_t::error; - } - } else if (rrc_ptr->serving_cell->has_sib1() && rrc_ptr->serving_cell->has_sib2() && - rrc_ptr->serving_cell->has_sib3()) { - Info("In-sync, SIBs available. Going to cell criteria\n"); - state = state_t::cell_criteria; - } else { - Info("SIBs missing (%d, %d, %d), launching serving cell configuration procedure\n", - rrc_ptr->serving_cell->has_sib1(), - rrc_ptr->serving_cell->has_sib2(), - rrc_ptr->serving_cell->has_sib3()); - std::vector required_sibs = {1, 2, 3}; - if (rrc_ptr->serv_cell_cfg.launch(required_sibs)) { - state = state_t::cell_configuration; + + // Run cell reselection + if (not rrc_ptr->cell_reselector.run()) { + // Cell reselection finished or not started + if (rrc_ptr->serving_cell->in_sync) { + // In-sync, check SIBs + if (rrc_ptr->serving_cell->has_sib1() && rrc_ptr->serving_cell->has_sib2() && rrc_ptr->serving_cell->has_sib3()) { + Info("In-sync, SIBs available. Going to cell criteria\n"); + return cell_criteria(); + } else { + Info("SIBs missing (%d, %d, %d), launching serving cell configuration procedure\n", + rrc_ptr->serving_cell->has_sib1(), + rrc_ptr->serving_cell->has_sib2(), + rrc_ptr->serving_cell->has_sib3()); + std::vector required_sibs = {1, 2, 3}; + if (!rrc_ptr->serv_cell_cfg.launch(required_sibs)) { + Error("Failed to initiate configure serving cell\n"); + return proc_outcome_t::error; + } + state = state_t::cell_configuration; + } } else { - Error("Failed to initiate configure serving cell\n"); - state = state_t::error; + // Out-of-sync, relaunch reselection + Info("Serving cell is out-of-sync, re-launching re-selection procedure\n"); + if (!rrc_ptr->cell_reselector.launch()) { + return proc_outcome_t::error; + } } } + + return proc_outcome_t::yield; } -void rrc::connection_reest_proc::step_cell_configuration() +proc_outcome_t rrc::connection_reest_proc::step_cell_configuration() { - if (!rrc_ptr->t311.is_running()) { - Info("During cell configuration, T311 expired. Aborting.\n"); - state = state_t::success; - } else if (rrc_ptr->serv_cell_cfg.run()) { - // Keep running, do nothing - } else if (!rrc_ptr->serving_cell->in_sync) { - Info("Serving cell is out-of-sync, re-launching re-selection procedure\n"); - if (rrc_ptr->cell_reselector.launch()) { - state = state_t::cell_reselection; + if (not rrc_ptr->serv_cell_cfg.run()) { + // SIBs adquisition not started or finished + if (rrc_ptr->serving_cell->in_sync) { + // In-sync + if (rrc_ptr->serving_cell->has_sib1() && rrc_ptr->serving_cell->has_sib2() && rrc_ptr->serving_cell->has_sib3()) { + // All SIBs are available + return cell_criteria(); + } else { + // Required SIBs are not available + Error("Failed to configure serving cell\n"); + return proc_outcome_t::error; + } } else { - Error("Failed to initiate a Cell re-selection procedure...\n"); - state = state_t::error; + // Out-of-sync, relaunch reselection + Info("Serving cell is out-of-sync, re-launching re-selection procedure\n"); + if (!rrc_ptr->cell_reselector.launch()) { + Error("Failed to initiate a Cell re-selection procedure...\n"); + return proc_outcome_t::error; + } + state = state_t::cell_reselection; } - } else if (rrc_ptr->serving_cell->has_sib1() && rrc_ptr->serving_cell->has_sib2() && - rrc_ptr->serving_cell->has_sib3()) { - Info("SIBs available. Going to cell criteria\n"); - state = state_t::cell_criteria; - } else { - Error("Failed to configure serving cell\n"); - state = state_t::error; } + + return proc_outcome_t::yield; } -void rrc::connection_reest_proc::step_cell_criteria() +srslte::proc_outcome_t rrc::connection_reest_proc::cell_criteria() { - // Wait until we're synced and have obtained SIBs // Perform cell selection in accordance to 36.304 - if (!rrc_ptr->t311.is_running()) { - Info("During cell selection criteria, T311 expired. Aborting.\n"); - state = state_t::success; - } else if (rrc_ptr->cell_selection_criteria(rrc_ptr->serving_cell->get_rsrp())) { + if (rrc_ptr->cell_selection_criteria(rrc_ptr->serving_cell->get_rsrp())) { // Actions following cell reselection while T311 is running 5.3.7.3 // Upon selecting a suitable E-UTRA cell, the UE shall: Info("Cell Selection criteria passed after %dms. Sending RRC Connection Reestablishment Request\n", @@ -1025,55 +1017,38 @@ void rrc::connection_reest_proc::step_cell_criteria() rrc_ptr->t301.run(); // apply the timeAlignmentTimerCommon included in SystemInformationBlockType2; - // TODO + // Not implemented yet. // initiate transmission of the RRCConnectionReestablishmentRequest message in accordance with 5.3.7.4; rrc_ptr->send_con_restablish_request(reest_cause, reest_rnti, reest_source_pci); } else { // Upon selecting an inter-RAT cell - Warning("Reestablishment Cell Selection criteria failed.\n"); + Info("Reestablishment Cell Selection criteria failed.\n"); rrc_ptr->leave_connected(); } - state = state_t::success; + return proc_outcome_t::success; } proc_outcome_t rrc::connection_reest_proc::step() { - proc_outcome_t proc_outcome = srslte::proc_outcome_t::yield; + // Abort procedure if T311 expires + if (!rrc_ptr->t311.is_running()) { + Info("T311 expired. Aborting.\n"); + return proc_outcome_t::success; + } /* * Implementation of procedure in 3GPP 36.331 Section 5.3.7.3: Actions following cell selection while T311 is running */ switch (state) { - - case state_t::init: - step_init(); - break; - case state_t::cell_reselection: - step_cell_reselection(); - break; + return step_cell_reselection(); case state_t::cell_configuration: - step_cell_configuration(); - break; - - case state_t::cell_criteria: - step_cell_criteria(); - break; - - case state_t::success: - Info("Finished successfully\n"); - proc_outcome = srslte::proc_outcome_t::success; - break; - - case state_t::error: - Info("Finished with error\n"); - proc_outcome = srslte::proc_outcome_t::error; - break; + return step_cell_configuration(); } - return proc_outcome; + return proc_outcome_t::error; } } // namespace srsue