/** * Copyright 2013-2021 Software Radio Systems Limited * * This file is part of srsRAN. * * srsRAN is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as * published by the Free Software Foundation, either version 3 of * the License, or (at your option) any later version. * * srsRAN is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Affero General Public License for more details. * * A copy of the GNU Affero General Public License can be found in * the LICENSE file in the top-level directory of this distribution * and at http://www.gnu.org/licenses/. * */ #ifndef SRSRAN_UE_MEAS_CFG_H #define SRSRAN_UE_MEAS_CFG_H #include "srsran/asn1/rrc/meascfg.h" namespace srsenb { // fwd declarations struct rrc_cfg_t; struct meas_cell_cfg_t; class ue_cell_ded_list; using meas_obj_t = asn1::rrc::meas_obj_to_add_mod_s; using meas_obj_list = asn1::rrc::meas_obj_to_add_mod_list_l; using meas_cell_t = asn1::rrc::cells_to_add_mod_s; using report_cfg_t = asn1::rrc::report_cfg_to_add_mod_s; using report_cfg_list = asn1::rrc::report_cfg_to_add_mod_list_l; using meas_id_t = asn1::rrc::meas_id_to_add_mod_s; using meas_id_list = asn1::rrc::meas_id_to_add_mod_list_l; bool is_same_earfcn(const meas_obj_t& lhs, const meas_obj_t& rhs); /// Find MeasObj with same earfcn. Assumes ordered list meas_obj_t* find_meas_obj(meas_obj_list& l, uint32_t earfcn); const meas_obj_t* find_meas_obj(const meas_obj_list& l, uint32_t earfcn); /// Add EARFCN to the MeasObjToAddModList std::pair add_meas_obj(meas_obj_list& list, uint32_t dl_earfcn); std::tuple add_cell_enb_cfg(meas_obj_list& meas_obj_list, const meas_cell_cfg_t& cellcfg); report_cfg_t* add_report_cfg(report_cfg_list& list, const asn1::rrc::report_cfg_eutra_s& reportcfg); meas_id_t* add_measid_cfg(meas_id_list& meas_id_list, uint8_t measobjid, uint8_t measrepid); /** * Finds a cell in meas_obj_list based on pci and earfcn * @return pair of (meas_obj,cell_obj). If no cell has frequency==earfcn, meas_obj=nullptr */ std::pair find_cell(meas_obj_list& l, uint32_t earfcn, uint32_t pci); bool compute_diff_meascfg(const asn1::rrc::meas_cfg_s& current_meascfg, const asn1::rrc::meas_cfg_s& target_meascfg, asn1::rrc::meas_cfg_s& diff_meascfg); bool fill_meascfg_enb_cfg(asn1::rrc::meas_cfg_s& meascfg, const ue_cell_ded_list& ue_cell_list); /** * Computes diff measConfig based on the previous measConfig and the UE current cells * @param diff_meascfg resulting configuration to be added to the RRCConnectionReconf message * @param prev_meascfg measConfig sent in the last RRCConnectionReconfiguration to the UE * @param ue_cell_list contains the final list of cells configured in the UE after the Reconf procedure * @param prev_earfcn DL earfcn of Pcell in the last RRCReconf message * @param prev_pci pci of PCell in the last RRCReconf message * @return true if updates exist that have been registered in diff_meascfg */ bool apply_meascfg_updates(asn1::rrc::meas_cfg_s& diff_meascfg, asn1::rrc::meas_cfg_s& prev_meascfg, const ue_cell_ded_list& ue_cell_list, int prev_earfcn = -1, int prev_pci = -1); } // namespace srsenb #endif // SRSRAN_UE_MEAS_CFG_H