mirror of https://github.com/PentHertz/srsLTE.git
Changes in Cell Selection Procedure (#1557)
* Fixes RRC cell reselection procedure
This commit is contained in:
parent
1eaf7efab0
commit
443dee7035
|
@ -520,24 +520,32 @@ proc_outcome_t rrc::cell_selection_proc::start_serv_cell_selection()
|
||||||
return proc_outcome_t::yield;
|
return proc_outcome_t::yield;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** Cell selection procedure defined in 36.304 5.2
|
||||||
|
* The procedure starts with Stored Information Cell Selection. In our implementation,
|
||||||
|
* we use known neighbour cells. If that fails, the procedure continues with Initial Cell Selection .
|
||||||
|
*
|
||||||
|
* The standard requires the UE to attach to any cell that meets the Cell Selection Criteria on any frequency.
|
||||||
|
* On each frequency, the UE shall select the strongest cell.
|
||||||
|
*
|
||||||
|
* In our implementation, we will try to select the strongest cell of all known frequencies, if they are still
|
||||||
|
* available, or the strongest of all available cells we've found on any frequency.
|
||||||
|
*/
|
||||||
proc_outcome_t rrc::cell_selection_proc::start_cell_selection()
|
proc_outcome_t rrc::cell_selection_proc::start_cell_selection()
|
||||||
{
|
{
|
||||||
// Neighbour cells are sorted in descending order of RSRP
|
// First of all, try to re-select the current serving cell if it meets the criteria
|
||||||
|
if (not serv_cell_select_attempted and
|
||||||
|
rrc_ptr->cell_selection_criteria(rrc_ptr->meas_cells.serving_cell().get_rsrp())) {
|
||||||
|
return start_serv_cell_selection();
|
||||||
|
}
|
||||||
|
|
||||||
|
// If serving is not available, use the stored information (known neighbours) to find the strongest
|
||||||
|
// cell that meets the selection criteria.
|
||||||
for (; neigh_index < rrc_ptr->meas_cells.nof_neighbours(); ++neigh_index) {
|
for (; neigh_index < rrc_ptr->meas_cells.nof_neighbours(); ++neigh_index) {
|
||||||
// If the serving cell is stronger, attempt to select it
|
|
||||||
if (not serv_cell_select_attempted and
|
|
||||||
rrc_ptr->cell_selection_criteria(rrc_ptr->meas_cells.serving_cell().get_rsrp()) and
|
|
||||||
rrc_ptr->meas_cells.serving_cell().greater(&rrc_ptr->meas_cells[neigh_index])) {
|
|
||||||
return start_serv_cell_selection();
|
|
||||||
}
|
|
||||||
|
|
||||||
/*TODO: CHECK that PLMN matches. Currently we don't receive SIB1 of neighbour cells
|
/*TODO: CHECK that PLMN matches. Currently we don't receive SIB1 of neighbour cells
|
||||||
* meas_cells[i]->plmn_equals(selected_plmn_id) && */
|
* meas_cells[i]->plmn_equals(selected_plmn_id) && */
|
||||||
// Matches S criteria
|
// Matches S criteria
|
||||||
float rsrp = rrc_ptr->meas_cells.at(neigh_index).get_rsrp();
|
if (rrc_ptr->cell_selection_criteria(rrc_ptr->meas_cells.at(neigh_index).get_rsrp())) {
|
||||||
|
|
||||||
if (not rrc_ptr->phy_ctrl->is_in_sync() or
|
|
||||||
(rrc_ptr->cell_selection_criteria(rsrp) and rsrp > rrc_ptr->meas_cells.serving_cell().get_rsrp() + 5)) {
|
|
||||||
// currently connected and verifies cell selection criteria
|
// currently connected and verifies cell selection criteria
|
||||||
// Try to select Cell
|
// Try to select Cell
|
||||||
rrc_ptr->set_serving_cell(rrc_ptr->meas_cells.at(neigh_index).phy_cell, discard_serving);
|
rrc_ptr->set_serving_cell(rrc_ptr->meas_cells.at(neigh_index).phy_cell, discard_serving);
|
||||||
|
@ -554,17 +562,9 @@ proc_outcome_t rrc::cell_selection_proc::start_cell_selection()
|
||||||
return proc_outcome_t::yield;
|
return proc_outcome_t::yield;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// Iteration over neighbor cells is over.
|
|
||||||
|
|
||||||
// If serving cell is weaker, but couldn't select neighbors
|
// If any of the known cells meets the selection criteria or could not be selected, search again.
|
||||||
if (serv_cell_select_attempted) {
|
Info("Could not select any kown cell. Searching new cells\n");
|
||||||
return proc_outcome_t::error;
|
|
||||||
} else if (rrc_ptr->cell_selection_criteria(rrc_ptr->meas_cells.serving_cell().get_rsrp())) {
|
|
||||||
return start_serv_cell_selection();
|
|
||||||
}
|
|
||||||
|
|
||||||
// If can not find any suitable cell, search again
|
|
||||||
Info("Cell selection and reselection in IDLE did not find any suitable cell. Searching again\n");
|
|
||||||
if (not rrc_ptr->cell_searcher.launch(&cell_search_fut)) {
|
if (not rrc_ptr->cell_searcher.launch(&cell_search_fut)) {
|
||||||
return proc_outcome_t::error;
|
return proc_outcome_t::error;
|
||||||
}
|
}
|
||||||
|
@ -607,7 +607,7 @@ srslte::proc_outcome_t rrc::cell_selection_proc::step_serv_cell_camp(const bool&
|
||||||
|
|
||||||
rrc_ptr->meas_cells.serving_cell().set_rsrp(-INFINITY);
|
rrc_ptr->meas_cells.serving_cell().set_rsrp(-INFINITY);
|
||||||
Warning("Could not camp on serving cell.\n");
|
Warning("Could not camp on serving cell.\n");
|
||||||
return neigh_index >= rrc_ptr->meas_cells.nof_neighbours() ? proc_outcome_t::error : proc_outcome_t::yield;
|
return start_cell_selection();
|
||||||
}
|
}
|
||||||
|
|
||||||
proc_outcome_t rrc::cell_selection_proc::step_cell_search()
|
proc_outcome_t rrc::cell_selection_proc::step_cell_search()
|
||||||
|
|
|
@ -101,7 +101,6 @@ public:
|
||||||
}
|
}
|
||||||
|
|
||||||
phy_interface_rrc_lte::phy_cell_t last_selected_cell = {};
|
phy_interface_rrc_lte::phy_cell_t last_selected_cell = {};
|
||||||
|
|
||||||
private:
|
private:
|
||||||
bool meas_reset_called = false;
|
bool meas_reset_called = false;
|
||||||
std::set<uint32_t> freqs_started;
|
std::set<uint32_t> freqs_started;
|
||||||
|
@ -313,15 +312,15 @@ int cell_select_test()
|
||||||
// Start cell selection procedure. The RRC will start with strongest cell
|
// Start cell selection procedure. The RRC will start with strongest cell
|
||||||
TESTASSERT(rrctest.start_cell_select() == SRSLTE_SUCCESS);
|
TESTASSERT(rrctest.start_cell_select() == SRSLTE_SUCCESS);
|
||||||
stack.run_pending_tasks();
|
stack.run_pending_tasks();
|
||||||
TESTASSERT(rrctest.phytest.last_selected_cell.earfcn == 1);
|
TESTASSERT(rrctest.phytest.last_selected_cell.earfcn == 2);
|
||||||
TESTASSERT(rrctest.phytest.last_selected_cell.pci == 1);
|
TESTASSERT(rrctest.phytest.last_selected_cell.pci == 2);
|
||||||
TESTASSERT(rrctest.has_neighbour_cell(2, 2));
|
TESTASSERT(!rrctest.has_neighbour_cell(2, 2));
|
||||||
TESTASSERT(!rrctest.has_neighbour_cell(1, 1));
|
TESTASSERT(rrctest.has_neighbour_cell(1, 1));
|
||||||
|
|
||||||
// PHY reports back the result
|
// PHY reports back the result
|
||||||
rrctest.cell_select_completed(true);
|
rrctest.cell_select_completed(true);
|
||||||
TESTASSERT(rrctest.has_neighbour_cell(2, 2));
|
TESTASSERT(!rrctest.has_neighbour_cell(2, 2));
|
||||||
TESTASSERT(!rrctest.has_neighbour_cell(1, 1));
|
TESTASSERT(rrctest.has_neighbour_cell(1, 1));
|
||||||
// Note: cell selection procedure is not done yet at this point.
|
// Note: cell selection procedure is not done yet at this point.
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue