make cell reselection periodic and with period of 20msec

master
Francisco Paisana 5 years ago
parent 504e3a1b7a
commit d12b037e0d

@ -579,7 +579,6 @@ private:
void leave_connected();
void stop_timers();
void start_con_restablishment(asn1::rrc::reest_cause_e cause);
void start_cell_reselection();
void log_rr_config_common();
void log_phy_config_dedicated();

@ -259,6 +259,7 @@ public:
srslte::proc_outcome_t step();
srslte::proc_outcome_t react(bool timeout);
static const char* name() { return "Go Idle"; }
void then(const srslte::proc_state_t& result);
private:
static const uint32_t rlc_flush_timeout_ms = 60; // TS 36.331 Sec 5.3.8.3
@ -270,15 +271,19 @@ private:
class rrc::cell_reselection_proc
{
public:
const static uint32_t cell_reselection_periodicity_ms = 20;
cell_reselection_proc(rrc* rrc_);
srslte::proc_outcome_t init();
srslte::proc_outcome_t step();
static const char* name() { return "Cell Reselection"; }
void then(const srslte::proc_state_t& result);
private:
rrc* rrc_ptr;
srslte::proc_future_t<cs_result_t> cell_selection_fut;
srslte::timer_handler::unique_timer reselection_timer;
srslte::proc_future_t<cs_result_t> cell_selection_fut;
};
class rrc::connection_reest_proc

@ -253,16 +253,6 @@ void rrc::run_tti()
// Run state machine
switch (state) {
case RRC_STATE_IDLE:
/* CAUTION: The execution of cell_search() and cell_selection() take more than 1 ms
* and will slow down MAC TTI ticks. This has no major effect at the moment because
* the UE is in IDLE but we could consider splitting MAC and RRC threads to avoid this
*/
// If attached but not camping on the cell, perform cell reselection
if (nas->is_attached()) {
start_cell_reselection();
}
break;
case RRC_STATE_CONNECTED:
measurements->run_tti();
@ -1251,24 +1241,6 @@ void rrc::start_con_restablishment(reest_cause_e cause)
callback_list.add_proc(connection_reest);
}
void rrc::start_cell_reselection()
{
if (neighbour_cells.empty() and phy_sync_state == phy_in_sync and phy->cell_is_camping()) {
// don't bother with cell selection if there are no neighbours and we are already camping
return;
}
if (cell_reselector.is_busy()) {
// it is already running
return;
}
if (not cell_reselector.launch()) {
rrc_log->error("Failed to initiate a Cell Reselection procedure...\n");
}
callback_list.add_proc(cell_reselector);
}
void rrc::cell_search_completed(const phy_interface_rrc_lte::cell_search_ret_t& cs_ret,
const phy_interface_rrc_lte::phy_cell_t& found_cell)
{

@ -1101,14 +1101,44 @@ proc_outcome_t rrc::go_idle_proc::step()
return proc_outcome_t::yield;
}
void rrc::go_idle_proc::then(const srslte::proc_state_t& result)
{
if (not rrc_ptr->cell_reselector.launch()) {
rrc_ptr->rrc_log->error("Failed to initiate a Cell Reselection procedure...\n");
return;
}
rrc_ptr->callback_list.add_proc(rrc_ptr->cell_reselector);
}
/**************************************
* Cell Reselection procedure
*************************************/
rrc::cell_reselection_proc::cell_reselection_proc(srsue::rrc* rrc_) : rrc_ptr(rrc_) {}
rrc::cell_reselection_proc::cell_reselection_proc(srsue::rrc* rrc_) : rrc_ptr(rrc_)
{
// Timer for cell reselection procedure to self-relaunch periodically
reselection_timer = rrc_ptr->stack->get_unique_timer();
reselection_timer.set(cell_reselection_periodicity_ms, [this](uint32_t tid) {
if (not rrc_ptr->cell_reselector.launch()) {
rrc_ptr->rrc_log->error("Failed to initiate a Cell Reselection procedure...\n");
return;
}
rrc_ptr->callback_list.add_proc(rrc_ptr->cell_reselector);
});
}
proc_outcome_t rrc::cell_reselection_proc::init()
{
if (not rrc_ptr->nas->is_attached() or rrc_ptr->is_connected()) {
// check if rrc is still idle
return proc_outcome_t::success;
}
if (rrc_ptr->neighbour_cells.empty() and rrc_ptr->phy_sync_state == phy_in_sync and rrc_ptr->phy->cell_is_camping()) {
// don't bother with cell selection if there are no neighbours and we are already camping
return proc_outcome_t::success;
}
Info("Starting...\n");
if (not rrc_ptr->cell_selector.launch(&cell_selection_fut)) {
Error("Failed to initiate a Cell Selection procedure...\n");
@ -1150,6 +1180,14 @@ proc_outcome_t rrc::cell_reselection_proc::step()
return srslte::proc_outcome_t::success;
}
void rrc::cell_reselection_proc::then(const srslte::proc_state_t& result)
{
// Schedule cell reselection periodically, while rrc is idle
if (not rrc_ptr->is_connected() and rrc_ptr->nas->is_attached()) {
reselection_timer.run();
}
}
/**************************************
* RRC Connection Re-establishment procedure
*************************************/

Loading…
Cancel
Save