Review cell selection and SCell configuration during HO

This commit is contained in:
Xavier Arteaga 2021-05-26 10:53:11 +02:00 committed by Xavier Arteaga
parent 65d51f5855
commit cc2a6dc269
3 changed files with 30 additions and 10 deletions

View File

@ -100,7 +100,6 @@ public:
std::unique_lock<std::mutex> lock(mutex); std::unique_lock<std::mutex> lock(mutex);
switch (activation_state) { switch (activation_state) {
case idle: case idle:
// waiting for receiving a command, do nothing // waiting for receiving a command, do nothing
break; break;
@ -114,7 +113,6 @@ public:
case transition: case transition:
// Detect when the TTI has increased enough to make sure there arent workers, set the configuration // Detect when the TTI has increased enough to make sure there arent workers, set the configuration
if (TTI_SUB(tti, activation_tti) >= activation_margin_tti) { if (TTI_SUB(tti, activation_tti) >= activation_margin_tti) {
// Reload cell states // Reload cell states
for (uint32_t i = 1; i < SRSRAN_MAX_CARRIERS; i++) { for (uint32_t i = 1; i < SRSRAN_MAX_CARRIERS; i++) {
// Get Activation command value // Get Activation command value
@ -149,7 +147,6 @@ public:
bool is_active(uint32_t cc_idx, uint32_t tti) const bool is_active(uint32_t cc_idx, uint32_t tti) const
{ {
if (cc_idx == 0) { if (cc_idx == 0) {
return true; return true;
} }
@ -171,7 +168,6 @@ public:
bool is_configured(uint32_t cc_idx) const bool is_configured(uint32_t cc_idx) const
{ {
if (cc_idx == 0) { if (cc_idx == 0) {
return true; return true;
} }
@ -185,6 +181,22 @@ public:
return scell_cfg[cc_idx].status != cfg::none; return scell_cfg[cc_idx].status != cfg::none;
} }
void reset(uint32_t cc_idx)
{
if (cc_idx == 0 or cc_idx >= SRSRAN_MAX_CARRIERS) {
return;
}
std::unique_lock<std::mutex> lock(mutex);
activation_state = idle;
cfg& e = scell_cfg[cc_idx];
e.status = cfg::none;
e.earfcn = 0;
e.pci = UINT32_MAX;
}
void reset() void reset()
{ {
std::unique_lock<std::mutex> lock(mutex); std::unique_lock<std::mutex> lock(mutex);

View File

@ -500,10 +500,10 @@ bool phy::set_scell(srsran_cell_t cell_info, uint32_t cc_idx, uint32_t earfcn)
// Set inter-frequency measurement // Set inter-frequency measurement
sfsync.set_inter_frequency_measurement(cc_idx, earfcn, cell_info); sfsync.set_inter_frequency_measurement(cc_idx, earfcn, cell_info);
// Store secondary serving cell EARFCN and PCI // Reset secondary serving cell state, prevents this component carrier from executing any PHY processing
common.cell_state.configure(cc_idx, earfcn, cell_info.id); common.cell_state.reset(cc_idx);
// Reset cell configuration // Reset secondary serving cell configuration
for (uint32_t i = 0; i < args.nof_phy_threads; i++) { for (uint32_t i = 0; i < args.nof_phy_threads; i++) {
lte_workers[i]->reset_cell_unlocked(cc_idx); lte_workers[i]->reset_cell_unlocked(cc_idx);
} }
@ -534,6 +534,9 @@ bool phy::set_scell(srsran_cell_t cell_info, uint32_t cc_idx, uint32_t earfcn)
logger_phy.info("Finished setting new SCell configuration cc_idx=%d, earfcn=%d", cc_idx, earfcn); logger_phy.info("Finished setting new SCell configuration cc_idx=%d, earfcn=%d", cc_idx, earfcn);
// Configure secondary serving cell, allows this component carrier to execute PHY processing
common.cell_state.configure(cc_idx, earfcn, cell_info.id);
stack->set_scell_complete(true); stack->set_scell_complete(true);
}); });
return true; return true;

View File

@ -301,7 +301,6 @@ bool sync::cell_select_init(phy_cell_t new_cell)
Info("Cell Select: Going to IDLE"); Info("Cell Select: Going to IDLE");
phy_state.go_idle(); phy_state.go_idle();
worker_com->reset();
// Stop intra-frequency measurements if need to change frequency // Stop intra-frequency measurements if need to change frequency
if ((int)new_cell.earfcn != current_earfcn) { if ((int)new_cell.earfcn != current_earfcn) {
@ -325,11 +324,11 @@ bool sync::cell_select_start(phy_cell_t new_cell)
rrc_proc_state = PROC_SELECT_RUNNING; rrc_proc_state = PROC_SELECT_RUNNING;
// Reset SFN and cell search FSMs. They can safely be done while it is CAMPING or IDLE
sfn_p.reset(); sfn_p.reset();
search_p.reset(); search_p.reset();
srsran_ue_sync_reset(&ue_sync);
/* Reconfigure cell if necessary */ // Reconfigure cell if necessary
cell.id = new_cell.pci; cell.id = new_cell.pci;
if (not set_cell(new_cell.cfo_hz)) { if (not set_cell(new_cell.cfo_hz)) {
Error("Cell Select: Reconfiguring cell"); Error("Cell Select: Reconfiguring cell");
@ -796,6 +795,12 @@ bool sync::set_cell(float cfo)
return false; return false;
} }
// Reset UE sync. Attention: doing this reset when the FSM is NOT IDLE can cause PSS/SSS out-of-sync
srsran_ue_sync_reset(&ue_sync);
// Reset worker once SYNC is IDLE to flush any worker states such as ACKs and pending grants
worker_com->reset();
if (!srsran_cell_isvalid(&cell)) { if (!srsran_cell_isvalid(&cell)) {
Error("SYNC: Setting cell: invalid cell (nof_prb=%d, pci=%d, ports=%d)", cell.nof_prb, cell.id, cell.nof_ports); Error("SYNC: Setting cell: invalid cell (nof_prb=%d, pci=%d, ports=%d)", cell.nof_prb, cell.id, cell.nof_ports);
return false; return false;