Fixed cell search for non-home PLMN

master
Ismael Gomez 7 years ago
parent b257ab96bf
commit 90553e830d

@ -580,7 +580,6 @@ public:
/* Cell search and selection procedures */ /* Cell search and selection procedures */
virtual void cell_search_start() = 0; virtual void cell_search_start() = 0;
virtual void cell_search_stop() = 0;
virtual void cell_search_next() = 0; virtual void cell_search_next() = 0;
virtual void cell_select(uint32_t earfcn, srslte_cell_t cell) = 0; virtual void cell_select(uint32_t earfcn, srslte_cell_t cell) = 0;
virtual bool cell_handover(srslte_cell_t cell) = 0; virtual bool cell_handover(srslte_cell_t cell) = 0;

@ -755,7 +755,9 @@ int srslte_ue_sync_zerocopy_multi(srslte_ue_sync_t *q, cf_t *input_buffer[SRSLTE
if (q->do_agc) { if (q->do_agc) {
srslte_agc_process(&q->agc, input_buffer[0], q->sf_len); srslte_agc_process(&q->agc, input_buffer[0], q->sf_len);
} }
INFO("SYNC FIND: sf_idx=%d, ret=%d, next_state=%d\n", q->sf_idx, ret, q->state);
break; break;
case SF_TRACK: case SF_TRACK:
@ -817,6 +819,9 @@ int srslte_ue_sync_zerocopy_multi(srslte_ue_sync_t *q, cf_t *input_buffer[SRSLTE
q->frame_total_cnt++; q->frame_total_cnt++;
} }
INFO("SYNC TRACK: sf_idx=%d, ret=%d, next_state=%d\n", q->sf_idx, ret, q->state);
break; break;
} }
} }

@ -61,7 +61,6 @@ public:
void reset_sync(); void reset_sync();
void cell_search_start(); void cell_search_start();
void cell_search_stop();
void cell_search_next(bool reset = false); void cell_search_next(bool reset = false);
void cell_select(uint32_t earfcn, srslte_cell_t cell); void cell_select(uint32_t earfcn, srslte_cell_t cell);
bool cell_handover(srslte_cell_t cell); bool cell_handover(srslte_cell_t cell);
@ -299,14 +298,16 @@ private:
const static uint32_t NOF_IN_SYNC_SF = 100; const static uint32_t NOF_IN_SYNC_SF = 100;
// State for primary cell // State for primary cell
enum { typedef enum {
IDLE = 0, IDLE = 0,
CELL_SEARCH, CELL_SEARCH,
CELL_SELECT, CELL_SELECT,
CELL_RESELECT, CELL_RESELECT,
CELL_MEASURE, CELL_MEASURE,
CELL_CAMP, CELL_CAMP,
} phy_state; } phy_state_t;
phy_state_t phy_state, prev_state;
bool is_in_idle; bool is_in_idle;
@ -330,7 +331,6 @@ private:
float ul_dl_factor; float ul_dl_factor;
uint32_t current_earfcn; uint32_t current_earfcn;
int cur_earfcn_index; int cur_earfcn_index;
bool cell_search_in_progress;
float dl_freq; float dl_freq;
float ul_freq; float ul_freq;

@ -85,7 +85,6 @@ public:
void sync_reset(); void sync_reset();
void configure_ul_params(bool pregen_disabled = false); void configure_ul_params(bool pregen_disabled = false);
void cell_search_start(); void cell_search_start();
void cell_search_stop();
void cell_search_next(); void cell_search_next();
void cell_select(uint32_t earfcn, srslte_cell_t phy_cell); void cell_select(uint32_t earfcn, srslte_cell_t phy_cell);
bool cell_handover(srslte_cell_t cell); bool cell_handover(srslte_cell_t cell);

@ -132,7 +132,6 @@ void phch_recv::reset()
next_offset = 0; next_offset = 0;
cell_is_set = false; cell_is_set = false;
srate_mode = SRATE_NONE; srate_mode = SRATE_NONE;
cell_search_in_progress = false;
current_earfcn = 0; current_earfcn = 0;
sfn_p.reset(); sfn_p.reset();
measure_p.reset(); measure_p.reset();
@ -262,17 +261,17 @@ void phch_recv::reset_sync() {
search_p.reset(); search_p.reset();
measure_p.reset(); measure_p.reset();
srslte_ue_sync_reset(&ue_sync); srslte_ue_sync_reset(&ue_sync);
Info("----- PHY RESET----\n");
phy_state = CELL_SELECT; phy_state = CELL_SELECT;
} }
void phch_recv::cell_search_inc() void phch_recv::cell_search_inc()
{ {
Info("cell_search_inc, cur_idx=%d, size=%d\n", cur_earfcn_index, earfcn.size());
cur_earfcn_index++; cur_earfcn_index++;
if (cur_earfcn_index >= 0) { if (cur_earfcn_index >= 0) {
if (cur_earfcn_index >= (int) earfcn.size()) { if (cur_earfcn_index >= (int) earfcn.size()) {
cur_earfcn_index = 0; cur_earfcn_index = 0;
cell_search_in_progress = false;
phy_state = IDLE; phy_state = IDLE;
rrc->earfcn_end(); rrc->earfcn_end();
} else { } else {
@ -281,20 +280,16 @@ void phch_recv::cell_search_inc()
current_earfcn = earfcn[cur_earfcn_index]; current_earfcn = earfcn[cur_earfcn_index];
set_frequency(); set_frequency();
} }
phy_state = CELL_SEARCH;
} }
} }
} }
void phch_recv::cell_search_next(bool reset) { void phch_recv::cell_search_next(bool reset) {
if (cell_search_in_progress || reset) { if (reset) {
cell_search_in_progress = false; cur_earfcn_index = -1;
if (reset) {
cur_earfcn_index = -1;
}
cell_search_inc();
phy_state = CELL_SEARCH;
cell_search_in_progress = true;
} }
cell_search_inc();
} }
void phch_recv::cell_search_start() { void phch_recv::cell_search_start() {
@ -311,11 +306,6 @@ void phch_recv::cell_search_start() {
} }
} }
void phch_recv::cell_search_stop() {
Info("SYNC: Stopping Cell Search procedure...\n");
cell_search_in_progress = false;
}
bool phch_recv::cell_handover(srslte_cell_t cell) bool phch_recv::cell_handover(srslte_cell_t cell)
{ {
int cnt = 0; int cnt = 0;
@ -369,19 +359,18 @@ void phch_recv::cell_reselect()
uint32_t earfcn = new_earfcn; uint32_t earfcn = new_earfcn;
srslte_cell_t cell = new_cell; srslte_cell_t cell = new_cell;
Info("Reset from cell_reselect\n");
reset_sync();
// If we are already in the new cell, just resynchronize // If we are already in the new cell, just resynchronize
if (earfcn == current_earfcn && this->cell.id == cell.id) { if (earfcn == current_earfcn && this->cell.id == cell.id) {
log_h->info("Cell Select: Already in cell EARFCN=%d\n", earfcn); log_h->info("Cell Select: Already in cell EARFCN=%d, PCI=%d\n", earfcn, cell.id);
cell_search_in_progress = false;
if (srate_mode != SRATE_CAMP) { if (srate_mode != SRATE_CAMP) {
set_sampling_rate(); set_sampling_rate();
log_h->info("Cell Select: Setting Camping sampling rate\n");
} }
phy_state = CELL_SELECT;
} else { } else {
/* If we are going to a new cell, configure it */
cell_search_in_progress = false;
if (earfcn != current_earfcn) { if (earfcn != current_earfcn) {
if (set_frequency()) { if (set_frequency()) {
log_h->error("Cell Select: Configuring cell in EARFCN=%d, PCI=%d\n", earfcn, cell.id); log_h->error("Cell Select: Configuring cell in EARFCN=%d, PCI=%d\n", earfcn, cell.id);
@ -394,7 +383,6 @@ void phch_recv::cell_reselect()
if (set_cell()) { if (set_cell()) {
log_h->info("Cell Select: Synchronizing on cell...\n"); log_h->info("Cell Select: Synchronizing on cell...\n");
phy_state = CELL_SELECT;
} }
} }
} }
@ -533,33 +521,29 @@ void phch_recv::run_thread()
sf_idx = tti%10; sf_idx = tti%10;
prev_state = phy_state;
switch (phy_state) { switch (phy_state) {
case CELL_SEARCH: case CELL_SEARCH:
if (cell_search_in_progress) switch(search_p.run(&cell))
{ {
switch(search_p.run(&cell)) case search::CELL_FOUND:
{ if (!srslte_cell_isvalid(&cell)) {
case search::CELL_FOUND: Error("SYNC: Detected invalid cell\n");
if (!srslte_cell_isvalid(&cell)) {
Error("SYNC: Detected invalid cell\n");
phy_state = IDLE;
break;
}
if (set_cell()) {
set_sampling_rate();
phy_state = CELL_SELECT;
}
break;
case search::CELL_NOT_FOUND:
if (cell_search_in_progress) {
cell_search_inc();
}
phy_state = IDLE; phy_state = IDLE;
break; break;
default:
radio_error();
break;
} }
if (set_cell()) {
set_sampling_rate();
phy_state = CELL_SELECT;
}
break;
case search::CELL_NOT_FOUND:
cell_search_inc();
break;
default:
radio_error();
break;
} }
break; break;
case CELL_RESELECT: case CELL_RESELECT:
@ -569,7 +553,7 @@ void phch_recv::run_thread()
switch (sfn_p.run_subframe(&cell, &tti)) switch (sfn_p.run_subframe(&cell, &tti))
{ {
case sfn_sync::SFN_FOUND: case sfn_sync::SFN_FOUND:
if (!cell_search_in_progress) { if (prev_state == CELL_SEARCH) {
log_h->info("Sync OK. Camping on cell PCI=%d...\n", cell.id); log_h->info("Sync OK. Camping on cell PCI=%d...\n", cell.id);
phy_state = CELL_CAMP; phy_state = CELL_CAMP;
rrc->cell_camping(earfcn[cur_earfcn_index], cell); rrc->cell_camping(earfcn[cur_earfcn_index], cell);
@ -580,13 +564,8 @@ void phch_recv::run_thread()
} }
break; break;
case sfn_sync::TIMEOUT: case sfn_sync::TIMEOUT:
if (cell_search_in_progress) { log_h->warning("SYNC: Timeout while synchronizing SFN. Going back to cell search\n");
log_h->warning("SYNC: Timeout while synchronizing SFN. Going back to cell search\n"); phy_state = CELL_SEARCH;
phy_state = CELL_SEARCH;
} else {
log_h->warning("SYNC: Timeout while synchronizing SFN. Reselecting cell\n");
phy_state = CELL_SELECT;
}
break; break;
case sfn_sync::IDLE: case sfn_sync::IDLE:
break; break;
@ -610,7 +589,6 @@ void phch_recv::run_thread()
log_h->info("SYNC: Measured OK. Camping on cell PCI=%d...\n", cell.id); log_h->info("SYNC: Measured OK. Camping on cell PCI=%d...\n", cell.id);
phy_state = CELL_CAMP; phy_state = CELL_CAMP;
cell_search_in_progress = false;
rrc->cell_camping(earfcn[cur_earfcn_index], cell, measure_p.rsrp()); rrc->cell_camping(earfcn[cur_earfcn_index], cell, measure_p.rsrp());
break; break;
case measure::IDLE: case measure::IDLE:
@ -833,6 +811,7 @@ phch_recv::search::ret_code phch_recv::search::run(srslte_cell_t *cell)
if (p->srate_mode != SRATE_FIND) { if (p->srate_mode != SRATE_FIND) {
p->srate_mode = SRATE_FIND; p->srate_mode = SRATE_FIND;
p->radio_h->set_rx_srate(1.92e6); p->radio_h->set_rx_srate(1.92e6);
Info("SYNC: Setting Cell Search sampling rate\n");
} }
/* Find a cell in the given N_id_2 or go through the 3 of them to find the strongest */ /* Find a cell in the given N_id_2 or go through the 3 of them to find the strongest */
@ -992,7 +971,7 @@ phch_recv::sfn_sync::ret_code phch_recv::sfn_sync::run_subframe(srslte_cell_t *c
} }
} }
} else { } else {
Debug("SYNC: PSS/SSS not found...\n"); Info("SYNC: PSS/SSS not found...\n");
} }
cnt++; cnt++;

@ -256,11 +256,6 @@ void phy::cell_search_start()
sf_recv.cell_search_start(); sf_recv.cell_search_start();
} }
void phy::cell_search_stop()
{
sf_recv.cell_search_stop();
}
void phy::cell_search_next() void phy::cell_search_next()
{ {
sf_recv.cell_search_next(); sf_recv.cell_search_next();

@ -161,14 +161,15 @@ void nas::plmn_found(LIBLTE_RRC_PLMN_IDENTITY_STRUCT plmn_id, uint16_t tracking_
// RRC indicates that the UE has gone through all EARFCN and finished PLMN selection // RRC indicates that the UE has gone through all EARFCN and finished PLMN selection
void nas::plmn_search_end() { void nas::plmn_search_end() {
if (known_plmns.size() > 0) { if (known_plmns.size() > 0) {
nas_log->info("Could not find Home PLMN Id=%s, trying to connect to PLMN Id=%s\n", if (home_plmn.mcc != known_plmns[0].mcc && home_plmn.mnc != known_plmns[0].mnc) {
plmn_id_to_string(home_plmn).c_str(), nas_log->info("Could not find Home PLMN Id=%s, trying to connect to PLMN Id=%s\n",
plmn_id_to_string(known_plmns[0]).c_str()); plmn_id_to_string(home_plmn).c_str(),
plmn_id_to_string(known_plmns[0]).c_str());
nas_log->console("Could not find Home PLMN Id=%s, trying to connect to PLMN Id=%s\n",
plmn_id_to_string(home_plmn).c_str(), nas_log->console("Could not find Home PLMN Id=%s, trying to connect to PLMN Id=%s\n",
plmn_id_to_string(known_plmns[0]).c_str()); plmn_id_to_string(home_plmn).c_str(),
plmn_id_to_string(known_plmns[0]).c_str());
}
rrc->plmn_select(known_plmns[0]); rrc->plmn_select(known_plmns[0]);
} else { } else {
nas_log->info("Finished searching PLMN in current EARFCN set but no networks were found.\n"); nas_log->info("Finished searching PLMN in current EARFCN set but no networks were found.\n");

@ -212,10 +212,8 @@ void rrc::run_thread() {
plmn_select_timeout++; plmn_select_timeout++;
if (plmn_select_timeout >= RRC_PLMN_SELECT_TIMEOUT) { if (plmn_select_timeout >= RRC_PLMN_SELECT_TIMEOUT) {
rrc_log->info("RRC PLMN Search: timeout expired\n"); rrc_log->info("RRC PLMN Search: timeout expired\n");
phy->cell_search_stop(); rrc_log->console("\nRRC PLMN Search: timeout expired.\n");
sleep(1); state = RRC_STATE_IDLE;
rrc_log->console("\nRRC PLMN Search: timeout expired. Searching again\n");
} }
break; break;
case RRC_STATE_CELL_SELECTING: case RRC_STATE_CELL_SELECTING:
@ -236,14 +234,13 @@ void rrc::run_thread() {
} }
} }
// Don't time out during reestablishment (T311 running) // Don't time out during reestablishment (T311 running)
if (!mac_timers->timer_get(t311)->is_running()) { if (!mac_timers->timer_get(t311)->is_running() || !phy->sync_status()) {
select_cell_timeout++; select_cell_timeout++;
if (select_cell_timeout >= RRC_SELECT_CELL_TIMEOUT) { if (select_cell_timeout >= RRC_SELECT_CELL_TIMEOUT) {
rrc_log->info("RRC Cell Selecting: timeout expired. Starting Cell Search...\n"); rrc_log->info("RRC Cell Selecting: timeout expired. Starting Cell Search...\n");
plmn_select_timeout = 0;
select_cell_timeout = 0; select_cell_timeout = 0;
state = RRC_STATE_PLMN_START;
serving_cell->in_sync = false; serving_cell->in_sync = false;
phy->cell_search_start();
} }
} }
break; break;
@ -457,17 +454,30 @@ void rrc::plmn_select_rrc(LIBLTE_RRC_PLMN_IDENTITY_STRUCT plmn_id) {
if (state == RRC_STATE_IDLE || state == RRC_STATE_CONNECTED || state == RRC_STATE_PLMN_SELECTION) { if (state == RRC_STATE_IDLE || state == RRC_STATE_CONNECTED || state == RRC_STATE_PLMN_SELECTION) {
if (phy->sync_status() && selected_plmn_id.mcc == plmn_id.mcc && selected_plmn_id.mnc == plmn_id.mnc) { if (phy->sync_status() && selected_plmn_id.mcc == plmn_id.mcc && selected_plmn_id.mnc == plmn_id.mnc) {
rrc_log->info("Already camping on selected PLMN, connecting...\n"); rrc_log->info("Already camping on selected PLMN, connecting...\n");
state = RRC_STATE_CELL_SELECTING;
select_cell_timeout = 0;
} else { } else {
rrc_log->info("PLMN Id=%s selected\n", plmn_id_to_string(plmn_id).c_str());
// Sort cells according to RSRP
selected_plmn_id = plmn_id; selected_plmn_id = plmn_id;
select_cell_timeout = 0;
state = RRC_STATE_CELL_SELECTING; if (serving_cell->plmn_equals(selected_plmn_id)) {
phy->cell_select(serving_cell->get_earfcn(), serving_cell->phy_cell);
} else {
bool found = false;
for (uint32_t i=0;i<neighbour_cells.size() && !found;i++) {
if (neighbour_cells[i]->plmn_equals(selected_plmn_id)) {
rrc_log->info("PLMN Id=%s selected, PCI=%d\n", plmn_id_to_string(plmn_id).c_str(), neighbour_cells[i]->get_pci());
phy->cell_select(neighbour_cells[i]->get_earfcn(), neighbour_cells[i]->phy_cell);
found = true;
}
}
if (!found) {
rrc_log->warning("Could not find any cell for the selected PLMN\n");
state = RRC_STATE_IDLE;
return;
}
}
} }
state = RRC_STATE_CELL_SELECTING;
select_cell_timeout = 0;
} else { } else {
rrc_log->warning("Requested PLMN select in incorrect state %s\n", rrc_state_text[state]); rrc_log->warning("Requested PLMN select in incorrect state %s\n", rrc_state_text[state]);
} }
@ -988,7 +998,6 @@ void rrc::send_con_restablish_request(LIBLTE_RRC_CON_REEST_REQ_CAUSE_ENUM cause,
break; break;
default: default:
rrc_log->info("Unsupported integrity algorithm during reestablishment\n"); rrc_log->info("Unsupported integrity algorithm during reestablishment\n");
return;
} }
// Prepare ConnectionRestalishmentRequest packet // Prepare ConnectionRestalishmentRequest packet

Loading…
Cancel
Save