From aee59977d365d10701fb1f0843a49b0166ce8a33 Mon Sep 17 00:00:00 2001 From: Xavier Arteaga Date: Mon, 22 Jul 2019 17:58:31 +0200 Subject: [PATCH] SRSUE: Fixed inter-frequency Handover --- srsue/src/stack/rrc/rrc.cc | 29 ++++++++++++++++++----------- 1 file changed, 18 insertions(+), 11 deletions(-) diff --git a/srsue/src/stack/rrc/rrc.cc b/srsue/src/stack/rrc/rrc.cc index e7a9e5338..b7c666413 100644 --- a/srsue/src/stack/rrc/rrc.cc +++ b/srsue/src/stack/rrc/rrc.cc @@ -1074,9 +1074,19 @@ void rrc::sort_neighbour_cells() if (neighbour_cells.size() > 0) { char ordered[512]; int n=0; - n += snprintf(ordered, 512, "[pci=%d, rsrp=%.2f", neighbour_cells[0]->phy_cell.cell.id, neighbour_cells[0]->get_rsrp()); + n += snprintf(ordered, + 512, + "[earfcn=%d, pci=%d, rsrp=%.2f", + neighbour_cells[0]->get_earfcn(), + neighbour_cells[0]->phy_cell.cell.id, + neighbour_cells[0]->get_rsrp()); for (uint32_t i=1;iget_pci(), neighbour_cells[i]->get_rsrp()); + n += snprintf(&ordered[n], + 512 - n, + " | earfcn=%d, pci=%d, rsrp=%.2f", + neighbour_cells[i]->get_earfcn(), + neighbour_cells[i]->get_pci(), + neighbour_cells[i]->get_rsrp()); } rrc_log->info("Neighbours: %s]\n", ordered); } else { @@ -1467,7 +1477,9 @@ bool rrc::ho_prepare() asn1::rrc::mob_ctrl_info_s* mob_ctrl_info = &mob_reconf_r8->mob_ctrl_info; rrc_log->info("Processing HO command to target PCell=%d\n", mob_ctrl_info->target_pci); - int target_cell_idx = find_neighbour_cell(serving_cell->get_earfcn(), mob_ctrl_info->target_pci); + uint32_t target_earfcn = (mob_ctrl_info->carrier_freq_present) ? mob_ctrl_info->carrier_freq.dl_carrier_freq + : serving_cell->get_earfcn(); + int target_cell_idx = find_neighbour_cell(target_earfcn, mob_ctrl_info->target_pci); if (target_cell_idx < 0) { rrc_log->console("Received HO command to unknown PCI=%d\n", mob_ctrl_info->target_pci); rrc_log->error("Could not find target cell earfcn=%d, pci=%d\n", serving_cell->get_earfcn(), @@ -1478,11 +1490,6 @@ bool rrc::ho_prepare() // Section 5.3.5.4 mac_timers->timer_get(t310)->stop(); mac_timers->timer_get(t304)->set(this, mob_ctrl_info->t304.to_number()); - if (mob_ctrl_info->carrier_freq_present && - mob_ctrl_info->carrier_freq.dl_carrier_freq != serving_cell->get_earfcn()) { - rrc_log->error("Received mobilityControlInfo for inter-frequency handover\n"); - return false; - } // Save serving cell and current configuration ho_src_cell = *serving_cell; @@ -1508,9 +1515,6 @@ bool rrc::ho_prepare() apply_rr_config_dedicated(&mob_reconf_r8->rr_cfg_ded); } - // Extract and apply scell config if any - apply_scell_config(mob_reconf_r8); - if (!phy->cell_select(&neighbour_cells[target_cell_idx]->phy_cell)) { rrc_log->error("Could not synchronize with target cell pci=%d. Trying to return to source PCI\n", neighbour_cells[target_cell_idx]->get_pci()); @@ -1519,6 +1523,9 @@ bool rrc::ho_prepare() set_serving_cell(target_cell_idx); + // Extract and apply scell config if any + apply_scell_config(mob_reconf_r8); + if (mob_ctrl_info->rach_cfg_ded_present) { rrc_log->info("Starting non-contention based RA with preamble_idx=%d, mask_idx=%d\n", mob_ctrl_info->rach_cfg_ded.ra_preamb_idx, mob_ctrl_info->rach_cfg_ded.ra_prach_mask_idx);