1 /*******************************************************************************
2 ################################################################################
3 # Copyright (c) [2017-2019] [Radisys] #
5 # Licensed under the Apache License, Version 2.0 (the "License"); #
6 # you may not use this file except in compliance with the License. #
7 # You may obtain a copy of the License at #
9 # http://www.apache.org/licenses/LICENSE-2.0 #
11 # Unless required by applicable law or agreed to in writing, software #
12 # distributed under the License is distributed on an "AS IS" BASIS, #
13 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. #
14 # See the License for the specific language governing permissions and #
15 # limitations under the License. #
16 ################################################################################
17 *******************************************************************************/
19 /* This file contains all utility functions */
20 #include "common_def.h"
22 #include <libxml/parser.h>
23 #include <libxml/tree.h>
24 #include <libxml/xmlmemory.h>
25 #include <arpa/inet.h>
32 #include "du_app_mac_inf.h"
33 #include "du_app_rlc_inf.h"
34 #include "du_e2ap_mgr.h"
38 #include "du_f1ap_conversions.h"
39 #include "OCTET_STRING.h"
40 #include "BIT_STRING.h"
41 #include "odu_common_codec.h"
43 #include "SearchSpace.h"
44 #include "SIB-TypeInfo.h"
45 #include "SchedulingInfo.h"
46 #include "SI-SchedulingInfo.h"
47 #include "ConnEstFailureControl.h"
48 #include "PLMN-IdentityInfo.h"
49 #include "PDSCH-TimeDomainResourceAllocation.h"
50 #include "BCCH-Config.h"
51 #include "PagingCycle.h"
52 #include "PCCH-Config.h"
53 #include "TimeAlignmentTimer.h"
54 #include "BCCH-DL-SCH-Message.h"
55 #include "RACH-ConfigGeneric.h"
56 #include "PUSCH-TimeDomainResourceAllocation.h"
57 #include "PUCCH-ConfigCommon.h"
58 #include "SubcarrierSpacing.h"
59 #include "TDD-UL-DL-Pattern.h"
60 #include "RACH-ConfigCommon.h"
61 #include "BWP-DownlinkCommon.h"
62 #include "BWP-UplinkCommon.h"
63 #include "TDD-UL-DL-ConfigCommon.h"
64 #include "du_sys_info_hdl.h"
67 #include "CmInterface.h"
68 extern StartupConfig g_cfg;
69 extern NRCellDU cellParams;
72 char encBuf[ENC_BUF_MAX_LEN];
75 /* Filling Slot configuration as :
76 * Slot Sym 0 Sym 1 Sym 2 Sym 3 Sym 4 Sym 5 Sym 6 Sym 7 Sym 8 Sym 9 Sym10 Sym11 Sym12 Sym13
77 * 0 DL DL DL DL DL DL DL DL DL DL DL DL DL DL
78 * 1 DL DL DL DL DL DL DL DL DL DL DL DL DL DL
79 * 2 DL DL DL DL DL DL DL DL DL DL DL DL DL DL
80 3 DL DL DL DL DL DL DL DL DL DL DL DL DL DL
81 4 DL DL DL DL DL DL DL DL DL DL DL DL DL DL
82 5 DL DL DL DL DL DL DL DL DL DL DL DL DL DL
83 6 DL DL DL DL DL DL DL DL DL DL DL DL DL DL
84 7 DL DL DL DL DL DL DL DL DL DL DL DL F UL
85 8 UL UL UL UL UL UL UL UL UL UL UL UL UL UL
86 9 UL UL UL UL UL UL UL UL UL UL UL UL UL UL
89 /*******************************************************************
90 * @brief Reads the CL Configuration.
94 * Function : readMacCfg
97 * - Fills up the cell configuration for CL.
98 * - Calls FillSlotConfig()
101 * @return ROK - success
104 * ****************************************************************/
108 uint8_t idx=0, sliceIdx=0,plmnIdx = 0;
109 SupportedSliceList *taiSliceSuppLst;
111 /* DL carrier configuration */
113 duCfgParam.macCellCfg.cellId = cellParams.cellLocalId;
114 duCfgParam.macCellCfg.carrCfg.dlBw = cellParams.bSChannelBwDL;
115 duCfgParam.macCellCfg.carrCfg.arfcnDL = cellParams.arfcnDL;
117 duCfgParam.macCellCfg.cellId = NR_CELL_ID;
118 duCfgParam.macCellCfg.carrCfg.dlBw = NR_BANDWIDTH;
119 duCfgParam.macCellCfg.carrCfg.arfcnDL = NR_DL_ARFCN;
121 duCfgParam.macCellCfg.carrCfg.numTxAnt = NUM_TX_ANT;
122 /* UL Carrier configuration */
124 duCfgParam.macCellCfg.carrCfg.ulBw = cellParams.bSChannelBwUL;
125 duCfgParam.macCellCfg.carrCfg.arfcnUL = cellParams.arfcnUL;
127 duCfgParam.macCellCfg.carrCfg.ulBw = NR_BANDWIDTH;
128 duCfgParam.macCellCfg.carrCfg.arfcnUL = NR_UL_ARFCN;
130 duCfgParam.macCellCfg.carrCfg.numRxAnt = NUM_RX_ANT;
132 /* Cell configuration */
134 duCfgParam.macCellCfg.cellCfg.opState = cellParams.operationalState;
135 duCfgParam.macCellCfg.cellCfg.adminState = cellParams.administrativeState;
136 duCfgParam.macCellCfg.cellCfg.cellState = cellParams.cellState;
137 duCfgParam.macCellCfg.cellCfg.phyCellId = cellParams.nRPCI;
138 duCfgParam.macCellCfg.cellCfg.tac = cellParams.nRTAC;
139 duCfgParam.macCellCfg.cellCfg.ssbFreq = cellParams.ssbFrequency;
141 duCfgParam.macCellCfg.cellCfg.opState = OP_DISABLED;
142 duCfgParam.macCellCfg.cellCfg.adminState = ADMIN_UNLOCKED;
143 duCfgParam.macCellCfg.cellCfg.cellState = CELL_INACTIVE;
144 duCfgParam.macCellCfg.cellCfg.phyCellId = NR_PCI;
145 duCfgParam.macCellCfg.cellCfg.tac = DU_TAC;
146 duCfgParam.macCellCfg.cellCfg.ssbFreq = SSB_FREQUENCY;
148 /* Plmn And SNSSAI Configuration */
149 for(plmnIdx = 0; plmnIdx < MAX_PLMN; plmnIdx++)
151 memcpy(&duCfgParam.macCellCfg.cellCfg.plmnInfoList[plmnIdx].plmn, &duCfgParam.srvdCellLst[0].duCellInfo.cellInfo.srvdPlmn[plmnIdx].plmn,\
153 taiSliceSuppLst = &duCfgParam.srvdCellLst[0].duCellInfo.cellInfo.srvdPlmn[plmnIdx].taiSliceSuppLst;
154 duCfgParam.macCellCfg.cellCfg.plmnInfoList[plmnIdx].suppSliceList.numSupportedSlices = taiSliceSuppLst->numSupportedSlices;
155 if(taiSliceSuppLst->snssai)
157 DU_ALLOC_SHRABL_BUF(duCfgParam.macCellCfg.cellCfg.plmnInfoList[plmnIdx].suppSliceList.snssai, (duCfgParam.macCellCfg.cellCfg.plmnInfoList[plmnIdx].suppSliceList.numSupportedSlices) * sizeof(Snssai*));
158 if(duCfgParam.macCellCfg.cellCfg.plmnInfoList[plmnIdx].suppSliceList.snssai == NULLP)
160 DU_LOG("\nERROR --> DU_APP: Memory allocation failed at readMacCfg");
164 for(sliceIdx=0; sliceIdx < taiSliceSuppLst->numSupportedSlices; sliceIdx++)
166 if(taiSliceSuppLst->snssai[sliceIdx] != NULLP)
168 DU_ALLOC_SHRABL_BUF(duCfgParam.macCellCfg.cellCfg.plmnInfoList[plmnIdx].suppSliceList.snssai[sliceIdx], sizeof(Snssai));
169 if(duCfgParam.macCellCfg.cellCfg.plmnInfoList[plmnIdx].suppSliceList.snssai[sliceIdx] == NULLP)
171 DU_LOG("\nERROR --> DU_APP: Memory allocation failed at readMacCfg");
174 memcpy(duCfgParam.macCellCfg.cellCfg.plmnInfoList[plmnIdx].suppSliceList.snssai[sliceIdx], taiSliceSuppLst->snssai[sliceIdx], sizeof(Snssai));
178 duCfgParam.macCellCfg.cellCfg.subCarrSpacing = NR_SCS;
179 duCfgParam.macCellCfg.cellCfg.dupType = DUPLEX_MODE;
181 /* SSB configuration */
182 duCfgParam.macCellCfg.ssbCfg.ssbPbchPwr = SSB_PBCH_PWR;
183 duCfgParam.macCellCfg.ssbCfg.bchPayloadFlag = BCH_PAYLOAD;
184 duCfgParam.macCellCfg.ssbCfg.ssbOffsetPointA = OFFSET_TO_POINT_A;
185 duCfgParam.macCellCfg.ssbCfg.betaPss = BETA_PSS;
187 duCfgParam.macCellCfg.ssbCfg.scsCmn = convertScsValToScsEnum(cellParams.ssbSubCarrierSpacing);
188 duCfgParam.macCellCfg.ssbCfg.ssbPeriod = convertSSBPeriodicityToEnum(cellParams.ssbPeriodicity);
189 duCfgParam.macCellCfg.ssbCfg.ssbScOffset = cellParams.ssbOffset;
191 duCfgParam.macCellCfg.ssbCfg.scsCmn = NR_SCS;
192 duCfgParam.macCellCfg.ssbCfg.ssbPeriod = SSB_PRDCTY_MS_20;
193 duCfgParam.macCellCfg.ssbCfg.ssbScOffset = SSB_SUBCARRIER_OFFSET;
195 duCfgParam.macCellCfg.ssbCfg.ssbMask[0] = 1; /* only one SSB is transmitted */
196 if(BuildMibPdu() != ROK)
198 DU_LOG("\nERROR --> Failed to build MIB PDU");
199 memset(&duCfgParam.macCellCfg.ssbCfg.mibPdu, 0, 3*sizeof(uint8_t));
203 memcpy(&duCfgParam.macCellCfg.ssbCfg.mibPdu, encBuf,encBufSize);
206 /* PRACH configuration */
207 duCfgParam.macCellCfg.prachCfg.prachSeqLen = PRACH_SEQ_LEN;
208 duCfgParam.macCellCfg.prachCfg.prachSubcSpacing = convertScsEnumValToScsVal(PRACH_SUBCARRIER_SPACING);
209 duCfgParam.macCellCfg.prachCfg.prachCfgIdx = PRACH_CONFIG_IDX;
210 duCfgParam.macCellCfg.prachCfg.msg1Fdm = NUM_PRACH_FDM;
211 duCfgParam.macCellCfg.prachCfg.fdm[0].rootSeqIdx = ROOT_SEQ_IDX;
212 duCfgParam.macCellCfg.prachCfg.fdm[0].numRootSeq = NUM_ROOT_SEQ;
213 duCfgParam.macCellCfg.prachCfg.fdm[0].k1 = 0;
214 duCfgParam.macCellCfg.prachCfg.fdm[0].zeroCorrZoneCfg = ZERO_CORRELATION_ZONE_CFG;
215 duCfgParam.macCellCfg.prachCfg.prachRstSetCfg = PRACH_RESTRICTED_SET_CFG;
216 duCfgParam.macCellCfg.prachCfg.ssbPerRach = SSB_PER_RACH;
217 duCfgParam.macCellCfg.prachCfg.msg1FreqStart = PRACH_FREQ_START;
219 duCfgParam.macCellCfg.prachCfg.totalNumRaPreamble = NUM_RA_PREAMBLE;
220 duCfgParam.macCellCfg.prachCfg.numCbPreamblePerSsb = CB_PREAMBLE_PER_SSB;
221 duCfgParam.macCellCfg.prachCfg.raRspWindow = RA_RSP_WINDOW;
223 /* TDD configuration */
225 duCfgParam.macCellCfg.tddCfg.tddPeriod = TDD_PERIODICITY;
226 duCfgParam.macCellCfg.tddCfg.nrOfDlSlots = NUM_DL_SLOTS;
227 duCfgParam.macCellCfg.tddCfg.nrOfDlSymbols = NUM_DL_SYMBOLS;
228 duCfgParam.macCellCfg.tddCfg.nrOfUlSlots = NUM_UL_SLOTS;
229 duCfgParam.macCellCfg.tddCfg.nrOfUlSymbols = NUM_UL_SYMBOLS;
235 /* fill SIB1 configuration */
236 duCfgParam.macCellCfg.cellCfg.sib1Cfg.sib1PduLen = duCfgParam.srvdCellLst[0].duSysInfo.sib1Len;
237 DU_ALLOC_SHRABL_BUF(duCfgParam.macCellCfg.cellCfg.sib1Cfg.sib1Pdu,duCfgParam.srvdCellLst[0].duSysInfo.sib1Len);
238 memcpy(duCfgParam.macCellCfg.cellCfg.sib1Cfg.sib1Pdu, duCfgParam.srvdCellLst[0].duSysInfo.sib1Msg, \
239 duCfgParam.srvdCellLst[0].duSysInfo.sib1Len);
240 duCfgParam.macCellCfg.cellCfg.sib1Cfg.pdcchCfgSib1.coresetZeroIndex = CORESET_0_INDEX;
241 duCfgParam.macCellCfg.cellCfg.sib1Cfg.pdcchCfgSib1.searchSpaceZeroIndex = SEARCHSPACE_0_INDEX;
243 duCfgParam.macCellCfg.cellCfg.sib1Cfg.pagingCfg.numPO = duCfgParam.sib1Params.srvCellCfgCommSib.dlCfg.pcchCfg.ns;
244 if((duCfgParam.sib1Params.srvCellCfgCommSib.dlCfg.pcchCfg.firstPDCCHMontioringType != \
245 PCCH_Config__firstPDCCH_MonitoringOccasionOfPO_PR_NOTHING) && (duCfgParam.macCellCfg.cellCfg.sib1Cfg.pagingCfg.numPO != 0))
247 duCfgParam.macCellCfg.cellCfg.sib1Cfg.pagingCfg.poPresent = TRUE;
248 memcpy(duCfgParam.macCellCfg.cellCfg.sib1Cfg.pagingCfg.pagingOcc,
249 duCfgParam.sib1Params.srvCellCfgCommSib.dlCfg.pcchCfg.firstPDCCHMontioringInfo,MAX_PO_PER_PF);
253 duCfgParam.macCellCfg.cellCfg.sib1Cfg.pagingCfg.poPresent = FALSE;
256 /* fill Intial DL BWP */
257 duCfgParam.macCellCfg.cellCfg.initialDlBwp.bwp.firstPrb = 0;
258 duCfgParam.macCellCfg.cellCfg.initialDlBwp.bwp.numPrb = MAX_NUM_RB; /* configured to total BW */
259 duCfgParam.macCellCfg.cellCfg.initialDlBwp.bwp.scs = duCfgParam.macCellCfg.ssbCfg.scsCmn;
260 duCfgParam.macCellCfg.cellCfg.initialDlBwp.bwp.cyclicPrefix = NORMAL_CYCLIC_PREFIX;
261 duCfgParam.macCellCfg.cellCfg.initialDlBwp.pdcchCommon.commonSearchSpace.searchSpaceId = SEARCHSPACE_1_INDEX;
262 duCfgParam.macCellCfg.cellCfg.initialDlBwp.pdcchCommon.commonSearchSpace.coresetId = CORESET_0_INDEX;
263 duCfgParam.macCellCfg.cellCfg.initialDlBwp.pdcchCommon.commonSearchSpace.monitoringSlot =
264 SS_MONITORING_SLOT_SL1; /* sl1 - all slots */
265 duCfgParam.macCellCfg.cellCfg.initialDlBwp.pdcchCommon.commonSearchSpace.duration = 0;
266 duCfgParam.macCellCfg.cellCfg.initialDlBwp.pdcchCommon.commonSearchSpace.monitoringSymbol =
267 SS_MONITORING_SYMBOL;
268 duCfgParam.macCellCfg.cellCfg.initialDlBwp.pdcchCommon.commonSearchSpace.
269 candidate.aggLevel1 = 8;
270 duCfgParam.macCellCfg.cellCfg.initialDlBwp.pdcchCommon.commonSearchSpace.
271 candidate.aggLevel2 = 4;
272 duCfgParam.macCellCfg.cellCfg.initialDlBwp.pdcchCommon.commonSearchSpace.
273 candidate.aggLevel4 = 2;
274 duCfgParam.macCellCfg.cellCfg.initialDlBwp.pdcchCommon.commonSearchSpace.
275 candidate.aggLevel8 = 1;
276 duCfgParam.macCellCfg.cellCfg.initialDlBwp.pdcchCommon.commonSearchSpace.
277 candidate.aggLevel16 = 0;
279 duCfgParam.macCellCfg.cellCfg.initialDlBwp.pdschCommon.numTimeDomAlloc = NUM_TIME_DOM_RSRC_ALLOC;
281 duCfgParam.macCellCfg.cellCfg.initialDlBwp.pdschCommon.timeDomRsrcAllocList[idx].k0 = PDSCH_K0_CFG1;
282 duCfgParam.macCellCfg.cellCfg.initialDlBwp.pdschCommon.timeDomRsrcAllocList[idx].mappingType =
283 PDSCH_MAPPING_TYPE_A;
284 duCfgParam.macCellCfg.cellCfg.initialDlBwp.pdschCommon.timeDomRsrcAllocList[idx].startSymbol =
286 duCfgParam.macCellCfg.cellCfg.initialDlBwp.pdschCommon.timeDomRsrcAllocList[idx].lengthSymbol =
290 duCfgParam.macCellCfg.cellCfg.initialDlBwp.pdschCommon.timeDomRsrcAllocList[idx].k0 = PDSCH_K0_CFG2;
291 duCfgParam.macCellCfg.cellCfg.initialDlBwp.pdschCommon.timeDomRsrcAllocList[idx].mappingType =
292 PDSCH_MAPPING_TYPE_A;
293 duCfgParam.macCellCfg.cellCfg.initialDlBwp.pdschCommon.timeDomRsrcAllocList[idx].startSymbol =
295 duCfgParam.macCellCfg.cellCfg.initialDlBwp.pdschCommon.timeDomRsrcAllocList[idx].lengthSymbol =
298 /* ra-searchSpace ID is set to 1 */
299 duCfgParam.macCellCfg.cellCfg.initialDlBwp.pdcchCommon.raSearchSpaceId = SEARCHSPACE_1_INDEX;
301 /* fill Intial UL BWP */
302 duCfgParam.macCellCfg.cellCfg.initialUlBwp.bwp.firstPrb = 0;
303 duCfgParam.macCellCfg.cellCfg.initialUlBwp.bwp.numPrb = MAX_NUM_RB; /* configured to total BW */
304 duCfgParam.macCellCfg.cellCfg.initialUlBwp.bwp.scs = duCfgParam.macCellCfg.ssbCfg.scsCmn;
305 duCfgParam.macCellCfg.cellCfg.initialUlBwp.bwp.cyclicPrefix = NORMAL_CYCLIC_PREFIX;
306 duCfgParam.macCellCfg.cellCfg.initialUlBwp.puschCommon.numTimeDomRsrcAlloc = 2;
307 duCfgParam.macCellCfg.cellCfg.initialUlBwp.puschCommon.timeDomRsrcAllocList[0].k2 = PUSCH_K2_CFG1;
308 duCfgParam.macCellCfg.cellCfg.initialUlBwp.puschCommon.timeDomRsrcAllocList[0].mappingType =
309 PUSCH_MAPPING_TYPE_A;
310 duCfgParam.macCellCfg.cellCfg.initialUlBwp.puschCommon.timeDomRsrcAllocList[0].startSymbol =
312 duCfgParam.macCellCfg.cellCfg.initialUlBwp.puschCommon.timeDomRsrcAllocList[0].symbolLength =
315 duCfgParam.macCellCfg.cellCfg.initialUlBwp.puschCommon.timeDomRsrcAllocList[1].k2 = PUSCH_K2_CFG2;
316 duCfgParam.macCellCfg.cellCfg.initialUlBwp.puschCommon.timeDomRsrcAllocList[1].mappingType =
317 PUSCH_MAPPING_TYPE_A;
318 duCfgParam.macCellCfg.cellCfg.initialUlBwp.puschCommon.timeDomRsrcAllocList[1].startSymbol =
320 duCfgParam.macCellCfg.cellCfg.initialUlBwp.puschCommon.timeDomRsrcAllocList[1].symbolLength =
323 duCfgParam.macCellCfg.ssbCfg.dmrsTypeAPos = DMRS_TYPE_A_POS;
325 /* fill PUCCH config common */
326 duCfgParam.macCellCfg.cellCfg.initialUlBwp.pucchCommon.pucchResourceCommon = PUCCH_RSRC_COMMON;
327 duCfgParam.macCellCfg.cellCfg.initialUlBwp.pucchCommon.pucchGroupHopping = PUCCH_NEITHER_HOPPING;
332 /*******************************************************************
334 * @brief Configures the DU Parameters
338 * Function : calcSliv
341 * - calculate SLIV value from start and length field
343 * @params[in] start symbol
344 * @params[in] length of symbols
347 * ****************************************************************/
348 uint16_t calcSliv(uint8_t startSymbol, uint8_t lengthSymbol)
351 if((lengthSymbol-1) <= 7)
353 sliv = NUM_SYMBOLS_PER_SLOT * (lengthSymbol-1) + startSymbol;
357 sliv = NUM_SYMBOLS_PER_SLOT * (NUM_SYMBOLS_PER_SLOT - lengthSymbol + 1) \
358 + (NUM_SYMBOLS_PER_SLOT - 1 - startSymbol);
364 /*******************************************************************
366 * @brief Configures serving cell config common in sib1
370 * Function : fillServCellCfgCommSib
373 * - fills Serving cell config common for SIB1
375 * @params[in] SrvCellCfgCommSib pointer
376 * @return ROK - success
379 ** ****************************************************************/
380 uint8_t fillServCellCfgCommSib(SrvCellCfgCommSib *srvCellCfgComm)
382 PdcchCfgCommon pdcchCfg;
383 PdschCfgCommon pdschCfg;
385 RachCfgCommon rachCfg;
386 PuschCfgCommon puschCfg;
387 PucchCfgCommon pucchCfg;
388 TddUlDlCfgCommon tddCfg;
391 srvCellCfgComm->scs = convertScsValToScsEnum(cellParams.ssbSubCarrierSpacing);
393 srvCellCfgComm->scs = NR_SCS;
396 /* Configuring DL Config Common for SIB1*/
397 srvCellCfgComm->dlCfg.freqBandInd = NR_FREQ_BAND;
398 srvCellCfgComm->dlCfg.offsetToPointA = OFFSET_TO_POINT_A;
400 srvCellCfgComm->dlCfg.dlScsCarrier.scsOffset = cellParams.ssbOffset;
401 srvCellCfgComm->dlCfg.dlScsCarrier.scs = convertScsValToScsEnum(cellParams.ssbSubCarrierSpacing);
402 srvCellCfgComm->dlCfg.dlScsCarrier.scsBw = cellParams.bSChannelBwUL;
404 srvCellCfgComm->dlCfg.dlScsCarrier.scsOffset = SSB_SUBCARRIER_OFFSET;
405 srvCellCfgComm->dlCfg.dlScsCarrier.scs = NR_SCS;
406 srvCellCfgComm->dlCfg.dlScsCarrier.scsBw = NR_BANDWIDTH;
408 srvCellCfgComm->dlCfg.locAndBw = FREQ_LOC_BW;
410 /* Configuring PDCCH Config Common For SIB1 */
411 pdcchCfg.present = BWP_DownlinkCommon__pdcch_ConfigCommon_PR_setup;
412 pdcchCfg.ctrlRsrcSetZero = CORESET_0_INDEX;
413 pdcchCfg.searchSpcZero = SEARCHSPACE_0_INDEX;
414 pdcchCfg.searchSpcId = PDCCH_SEARCH_SPACE_ID;
415 pdcchCfg.ctrlRsrcSetId = PDCCH_CTRL_RSRC_SET_ID;
416 pdcchCfg.monitorSlotPrdAndOffPresent = SearchSpace__monitoringSlotPeriodicityAndOffset_PR_sl1;
417 //pdcchCfg.monitorSlotPrdAndOff = \
418 SearchSpace__monitoringSlotPeriodicityAndOffset_PR_sl1;
419 pdcchCfg.monitorSymbolsInSlot[0] = 128;
420 pdcchCfg.monitorSymbolsInSlot[1] = 0;
421 pdcchCfg.numCandAggLvl1 = SearchSpace__nrofCandidates__aggregationLevel1_n8;
422 pdcchCfg.numCandAggLvl2 = SearchSpace__nrofCandidates__aggregationLevel2_n4;
423 pdcchCfg.numCandAggLvl4 = SearchSpace__nrofCandidates__aggregationLevel4_n2;
424 pdcchCfg.numCandAggLvl8 = SearchSpace__nrofCandidates__aggregationLevel8_n1;
425 pdcchCfg.numCandAggLvl16 = SearchSpace__nrofCandidates__aggregationLevel16_n0;
426 pdcchCfg.searchSpcType = SearchSpace__searchSpaceType_PR_common;
427 pdcchCfg.commSrchSpcDciFrmt = PDCCH_SERACH_SPACE_DCI_FORMAT;
428 pdcchCfg.searchSpcSib1 = PDCCH_SEARCH_SPACE_ID_SIB1;
429 pdcchCfg.pagingSearchSpc = PDCCH_SEARCH_SPACE_ID_PAGING;
430 pdcchCfg.raSearchSpc = PDCCH_SEARCH_SPACE_ID_PAGING;
431 srvCellCfgComm->dlCfg.pdcchCfg = pdcchCfg;
433 /* Configuring PDSCH Config Common For SIB1 */
434 pdschCfg.present = BWP_DownlinkCommon__pdsch_ConfigCommon_PR_setup;
435 pdschCfg.numTimeDomRsrcAlloc = 2;
436 pdschCfg.timeDomAlloc[0].k0 = PDSCH_K0_CFG1;
437 pdschCfg.timeDomAlloc[0].mapType = PDSCH_TimeDomainResourceAllocation__mappingType_typeA;
438 pdschCfg.timeDomAlloc[0].sliv = calcSliv(PDSCH_START_SYMBOL,PDSCH_LENGTH_SYMBOL);
440 pdschCfg.timeDomAlloc[1].k0 = PDSCH_K0_CFG2;
441 pdschCfg.timeDomAlloc[1].mapType = PDSCH_TimeDomainResourceAllocation__mappingType_typeA;
442 pdschCfg.timeDomAlloc[1].sliv = calcSliv(PDSCH_START_SYMBOL,PDSCH_LENGTH_SYMBOL);
444 srvCellCfgComm->dlCfg.pdschCfg = pdschCfg;
446 /* Configuring BCCH Config for SIB1 */
447 srvCellCfgComm->dlCfg.bcchCfg.modPrdCoeff = BCCH_Config__modificationPeriodCoeff_n16;
449 /* Configuring PCCH Config for SIB1 */
450 pcchCfg.dfltPagingCycle = convertPagingCycleEnumToValue(PagingCycle_rf256);
451 pcchCfg.nAndPagingFrmOffsetType = PCCH_Config__nAndPagingFrameOffset_PR_oneT;
452 pcchCfg.pageFrameOffset = 0;
453 pcchCfg.ns = convertNsEnumToValue(PCCH_Config__ns_one);
454 pcchCfg.firstPDCCHMontioringType = PCCH_Config__firstPDCCH_MonitoringOccasionOfPO_PR_sCS30KHZoneT_SCS15KHZhalfT;
455 memset(pcchCfg.firstPDCCHMontioringInfo, 0, sizeof(uint16_t));
456 pcchCfg.firstPDCCHMontioringInfo[0] = 44;
458 srvCellCfgComm->dlCfg.pcchCfg = pcchCfg;
461 /* Configuring UL Config Common */
463 srvCellCfgComm->ulCfg.ulScsCarrier.scsOffset = cellParams.ssbOffset;
464 srvCellCfgComm->ulCfg.ulScsCarrier.scs = convertScsValToScsEnum(cellParams.ssbSubCarrierSpacing);
465 srvCellCfgComm->ulCfg.ulScsCarrier.scsBw = cellParams.bSChannelBwUL;
467 srvCellCfgComm->ulCfg.ulScsCarrier.scsOffset = SSB_SUBCARRIER_OFFSET;
468 srvCellCfgComm->ulCfg.ulScsCarrier.scs = NR_SCS;
469 srvCellCfgComm->ulCfg.ulScsCarrier.scsBw = NR_BANDWIDTH;
471 srvCellCfgComm->ulCfg.freqBandInd = NR_FREQ_BAND;
472 srvCellCfgComm->ulCfg.pMax = UL_P_MAX;
473 srvCellCfgComm->ulCfg.locAndBw = FREQ_LOC_BW;
474 srvCellCfgComm->ulCfg.timeAlignTimerComm = TimeAlignmentTimer_infinity;
476 /* Configuring RACH Config Common for SIB1 */
477 rachCfg.present = BWP_UplinkCommon__rach_ConfigCommon_PR_setup;
478 rachCfg.prachCfgIdx = PRACH_CONFIG_IDX;
479 rachCfg.msg1Fdm = RACH_ConfigGeneric__msg1_FDM_one;
480 rachCfg.msg1FreqStart = PRACH_FREQ_START;
481 rachCfg.zeroCorrZoneCfg = ZERO_CORRELATION_ZONE_CFG;
482 rachCfg.preambleRcvdTgtPwr = PRACH_PREAMBLE_RCVD_TGT_PWR;
483 rachCfg.preambleTransMax = RACH_ConfigGeneric__preambleTransMax_n200;
484 rachCfg.pwrRampingStep = RACH_ConfigGeneric__powerRampingStep_dB2;
485 rachCfg.raRspWindow = RACH_ConfigGeneric__ra_ResponseWindow_sl10;
486 rachCfg.numRaPreamble = NUM_RA_PREAMBLE;
487 rachCfg.numSsbPerRachOcc = RACH_ConfigCommon__ssb_perRACH_OccasionAndCB_PreamblesPerSSB_PR_one;
488 rachCfg.numCbPreamblePerSsb = CB_PREAMBLE_PER_SSB;
489 rachCfg.contResTimer = RACH_ConfigCommon__ra_ContentionResolutionTimer_sf64;
490 rachCfg.rsrpThreshSsb = RSRP_THRESHOLD_SSB;
491 rachCfg.rootSeqIdxPresent = RACH_ConfigCommon__prach_RootSequenceIndex_PR_l139;
492 rachCfg.rootSeqIdx = ROOT_SEQ_IDX;
493 rachCfg.msg1Scs = PRACH_SUBCARRIER_SPACING ;
494 rachCfg.restrictedSetCfg = PRACH_RESTRICTED_SET_CFG;
495 srvCellCfgComm->ulCfg.rachCfg = rachCfg;
497 /* Configuring PUSCH Config Common for SIB1 */
498 puschCfg.puschCfgPresent = BWP_UplinkCommon__pusch_ConfigCommon_PR_setup;
499 puschCfg.numTimeDomRsrcAlloc = 2;
500 puschCfg.timeDomAllocList[0].k2 = PUSCH_K2_CFG1;
501 puschCfg.timeDomAllocList[0].mapType = PUSCH_TimeDomainResourceAllocation__mappingType_typeA;
502 puschCfg.timeDomAllocList[0].sliv = calcSliv(PUSCH_START_SYMBOL,PUSCH_LENGTH_SYMBOL);
503 puschCfg.timeDomAllocList[1].k2 = PUSCH_K2_CFG2;
504 puschCfg.timeDomAllocList[1].mapType = PUSCH_TimeDomainResourceAllocation__mappingType_typeA;
505 puschCfg.timeDomAllocList[1].sliv = calcSliv(PUSCH_START_SYMBOL,PUSCH_LENGTH_SYMBOL);
506 puschCfg.msg3DeltaPreamble = PUSCH_MSG3_DELTA_PREAMBLE;
507 puschCfg.p0NominalWithGrant = PUSCH_P0_NOMINAL_WITH_GRANT;
508 srvCellCfgComm->ulCfg.puschCfg = puschCfg;
510 /* Configuring PUCCH Config Common for SIB1 */
511 pucchCfg.present = BWP_UplinkCommon__pucch_ConfigCommon_PR_setup;
512 pucchCfg.rsrcComm = PUCCH_RSRC_COMMON;
513 pucchCfg.grpHop = PUCCH_ConfigCommon__pucch_GroupHopping_neither;
514 pucchCfg.p0Nominal = PUCCH_P0_NOMINAL;
515 srvCellCfgComm->ulCfg.pucchCfg = pucchCfg;
517 /* Configuring TDD UL DL config common */
518 tddCfg.refScs = SubcarrierSpacing_kHz30;
519 tddCfg.txPrd = TDD_UL_DL_Pattern__dl_UL_TransmissionPeriodicity_ms5;
520 tddCfg.numDlSlots = NUM_DL_SLOTS;
521 tddCfg.numDlSymbols = NUM_DL_SYMBOLS;
522 tddCfg.numUlSlots = NUM_UL_SLOTS;
523 tddCfg.numUlSymbols = NUM_UL_SYMBOLS;
524 srvCellCfgComm->tddCfg = tddCfg;
526 srvCellCfgComm->ssbPosInBurst = 192;
527 srvCellCfgComm->ssbPrdServingCell = SSB_PERIODICITY;
528 srvCellCfgComm->ssPbchBlockPwr = SSB_PBCH_PWR;
533 /*******************************************************************
535 * @brief Configures the DU Parameters
542 * - Initializes the DuCfg members.
543 * - Calls readMacCfg()
545 * @params[in] system task ID
546 * @return ROK - success
549 * ****************************************************************/
554 uint8_t srvdCellIdx, bandIdx, sliceIdx, plmnIdx, ranFuncIdx, eventTriggerStyleIdx, reportStyleIdx, tnlAssocIdx;
555 uint8_t brdcstPlmnIdx, freqBandIdx, srvdPlmnIdx;
558 SupportedSliceList *taiSliceSuppLst;
559 uint8_t measurementInfoIdx =0, measurementInfoLen=0;
560 char shortName[] = SHORT_NAME;
561 char serviceModelOID[]= SERVICE_MODEL_OID;
562 char description[] = DESCRIPTION;
563 char event_trigger_style_name[]= EVENT_TRIGGER_STYLE_NAME;
564 char ric_report_style_name[]= REPORT_STYLE_NAME;
567 /* Note: Added these below variable for local testing*/
568 Snssai snssai[NUM_OF_SUPPORTED_SLICE] = {{1,{2,3,4}},{5,{6,7,8}}};
574 memset(&duCb.e2apDb, 0, sizeof(E2apDb));
575 duCb.e2apDb.e2NodeId = 1; //Will be removed as part of E2 config parser
576 duCb.e2apDb.e2TransInfo.transIdCounter = 0;
578 duCb.e2apDb.numOfTNLAssoc = 1;
579 for(tnlAssocIdx =0; tnlAssocIdx<duCb.e2apDb.numOfTNLAssoc; tnlAssocIdx++)
581 duCb.e2apDb.tnlAssoc[tnlAssocIdx].localIpAddress.ipV4Pres = duCfgParam.sctpParams.duIpAddr.ipV4Pres;
582 duCb.e2apDb.tnlAssoc[tnlAssocIdx].localIpAddress.ipV4Addr = duCfgParam.sctpParams.duIpAddr.ipV4Addr;
583 duCb.e2apDb.tnlAssoc[tnlAssocIdx].localPort = duCfgParam.sctpParams.duPort[E2_INTERFACE];
584 duCb.e2apDb.tnlAssoc[tnlAssocIdx].destIpAddress.ipV4Pres = duCfgParam.sctpParams.ricIpAddr.ipV4Pres;
585 duCb.e2apDb.tnlAssoc[tnlAssocIdx].destIpAddress.ipV4Addr = duCfgParam.sctpParams.ricIpAddr.ipV4Addr;
586 duCb.e2apDb.tnlAssoc[tnlAssocIdx].destPort = duCfgParam.sctpParams.ricPort;
587 duCb.e2apDb.tnlAssoc[tnlAssocIdx].usage = BOTH_FUNCTIONALITY;
589 duCb.e2apDb.numOfRanFunction = 1;
590 for(ranFuncIdx =0; ranFuncIdx<duCb.e2apDb.numOfRanFunction; ranFuncIdx++)
592 duCb.e2apDb.ranFunction[ranFuncIdx].id = ranFuncIdx + 1;
593 memcpy(&duCb.e2apDb.ranFunction[ranFuncIdx].name.shortName, shortName, sizeof(shortName));
594 memcpy(&duCb.e2apDb.ranFunction[ranFuncIdx].name.serviceModelOID, serviceModelOID, sizeof(serviceModelOID));
595 memcpy(&duCb.e2apDb.ranFunction[ranFuncIdx].name.description, description, sizeof(description));
596 duCb.e2apDb.ranFunction[ranFuncIdx].revisionCounter = 0;
598 duCb.e2apDb.ranFunction[ranFuncIdx].numOfEventTriggerStyleSupported = NUM_OF_EVENT_TRIGGER_STYLE_SUPPORTED;
599 for(eventTriggerStyleIdx=0; eventTriggerStyleIdx<duCb.e2apDb.ranFunction[ranFuncIdx].numOfEventTriggerStyleSupported; eventTriggerStyleIdx++)
601 duCb.e2apDb.ranFunction[ranFuncIdx].eventTriggerStyleList[eventTriggerStyleIdx].styleType = EVENT_TRIGGER_STYLE_TYPE;
602 duCb.e2apDb.ranFunction[ranFuncIdx].eventTriggerStyleList[eventTriggerStyleIdx].formatType = EVENT_TRIGGER_STYLE_FORMAT_TYPE;
603 memcpy(duCb.e2apDb.ranFunction[ranFuncIdx].eventTriggerStyleList[eventTriggerStyleIdx].name, event_trigger_style_name, sizeof(event_trigger_style_name));
606 duCb.e2apDb.ranFunction[ranFuncIdx].numOfReportStyleSupported= NUM_OF_RIC_REPORT_STYLE_SUPPORTED;
607 for(reportStyleIdx=0; reportStyleIdx<duCb.e2apDb.ranFunction[ranFuncIdx].numOfReportStyleSupported; reportStyleIdx++)
609 duCb.e2apDb.ranFunction[ranFuncIdx].reportStyleList[reportStyleIdx].reportStyle.styleType = REPORT_STYLE_TYPE;
610 duCb.e2apDb.ranFunction[ranFuncIdx].reportStyleList[reportStyleIdx].reportStyle.formatType = REPORT_ACTION_FORMAT_TYPE;
611 memcpy(duCb.e2apDb.ranFunction[ranFuncIdx].reportStyleList[reportStyleIdx].reportStyle.name, ric_report_style_name, sizeof(ric_report_style_name));
613 for(measurementInfoIdx =0; measurementInfoIdx<NUM_OF_MEASUREMENT_INFO_SUPPORTED(CONFIG_ADD); measurementInfoIdx++)
615 measurementInfoLen= strlen(MEASUREMENT_TYPE_NAME[measurementInfoIdx]);
616 MeasurementInfoForAction *measurementInfoForAction;
617 DU_ALLOC(measurementInfoForAction, sizeof(MeasurementInfoForAction));
618 if(measurementInfoForAction)
620 measurementInfoForAction->measurementTypeId = measurementInfoIdx+1;
621 memcpy(measurementInfoForAction->measurementTypeName, MEASUREMENT_TYPE_NAME[measurementInfoIdx], measurementInfoLen+1);
623 DU_ALLOC(node, sizeof(CmLList));
626 node->node = (PTR) measurementInfoForAction;
627 cmLListAdd2Tail(&duCb.e2apDb.ranFunction[ranFuncIdx].reportStyleList[reportStyleIdx].measurementInfoList, node);
632 DU_FREE(measurementInfoForAction, sizeof(MeasurementInfoForAction));
637 duCb.e2apDb.ranFunction[ranFuncIdx].ricIndicationHeaderFormat = RIC_INDICATION_HEADER_FORMAT;
638 duCb.e2apDb.ranFunction[ranFuncIdx].ricIndicationMessageFormat = RIC_INDICATION_MESSAGE_FORMAT;
640 cmLListInit(&duCb.e2apDb.ranFunction[ranFuncIdx].subscriptionList);
642 memset(duCb.e2apDb.e2TransInfo.e2InitTransaction, 0, MAX_NUM_TRANSACTION * sizeof(E2TransInfo));
643 memset(duCb.e2apDb.e2TransInfo.ricInitTransaction, 0, MAX_NUM_TRANSACTION * sizeof(E2TransInfo));
646 memset(&sib1.plmn, 0, sizeof(Plmn));
647 sib1.plmn.mcc[0] = PLMN_MCC0;
648 sib1.plmn.mcc[1] = PLMN_MCC1;
649 sib1.plmn.mcc[2] = PLMN_MCC2;
650 sib1.plmn.mnc[0] = PLMN_MNC0;
651 sib1.plmn.mnc[1] = PLMN_MNC1;
652 sib1.ranac = DU_RANAC;
655 sib1.tac = cellParams.nRTAC;
656 sib1.cellIdentity = CELL_IDENTITY * cellParams.cellLocalId;
657 DU_LOG("\nDEBUG --> DU_APP: readCfg(): OAM CellLocalId=%d", \
661 sib1.cellIdentity = CELL_IDENTITY * NR_CELL_ID;
663 sib1.cellResvdForOpUse = PLMN_IdentityInfo__cellReservedForOperatorUse_notReserved;
664 sib1.connEstFailCnt = ConnEstFailureControl__connEstFailCount_n3;
665 sib1.connEstFailOffValidity = ConnEstFailureControl__connEstFailOffsetValidity_s900;
666 sib1.connEstFailOffset = 15;
667 sib1.siSchedInfo.winLen = SI_SchedulingInfo__si_WindowLength_s5;
668 sib1.siSchedInfo.broadcastSta = SchedulingInfo__si_BroadcastStatus_broadcasting;
669 sib1.siSchedInfo.preiodicity = SchedulingInfo__si_Periodicity_rf8;
670 sib1.siSchedInfo.sibType = SIB_TypeInfo__type_sibType2;
671 sib1.siSchedInfo.sibValTag = SIB1_VALUE_TAG;
673 fillServCellCfgCommSib(&sib1.srvCellCfgCommSib);
675 duCfgParam.sib1Params = sib1;
677 for(srvdCellIdx=0; srvdCellIdx<DEFAULT_CELLS; srvdCellIdx++)
679 memset(&duCfgParam.srvdCellLst[srvdCellIdx].duCellInfo.cellInfo.nrCgi.plmn, 0, sizeof(Plmn));
680 duCfgParam.srvdCellLst[srvdCellIdx].duCellInfo.cellInfo.nrCgi.plmn.mcc[0] = PLMN_MCC0;
681 duCfgParam.srvdCellLst[srvdCellIdx].duCellInfo.cellInfo.nrCgi.plmn.mcc[1] = PLMN_MCC1;
682 duCfgParam.srvdCellLst[srvdCellIdx].duCellInfo.cellInfo.nrCgi.plmn.mcc[2] = PLMN_MCC2;
683 duCfgParam.srvdCellLst[srvdCellIdx].duCellInfo.cellInfo.nrCgi.plmn.mnc[0] = PLMN_MNC0;
684 duCfgParam.srvdCellLst[srvdCellIdx].duCellInfo.cellInfo.nrCgi.plmn.mnc[1] = PLMN_MNC1;
688 duCfgParam.srvdCellLst[srvdCellIdx].duCellInfo.cellInfo.nrPci = cellParams.nRPCI;
690 duCfgParam.srvdCellLst[srvdCellIdx].duCellInfo.cellInfo.nrPci = NR_PCI;
692 /* List of Available PLMN */
693 for(srvdPlmnIdx=0; srvdPlmnIdx<MAX_PLMN; srvdPlmnIdx++)
695 /* As per spec 38.473, Plmn identity consists of 3 digit from mcc
696 * followed by either 2 digit or 3 digits of mnc */
698 memset(&duCfgParam.srvdCellLst[srvdCellIdx].duCellInfo.cellInfo.srvdPlmn[srvdPlmnIdx].plmn, 0,\
701 duCfgParam.srvdCellLst[srvdCellIdx].duCellInfo.cellInfo.srvdPlmn[srvdPlmnIdx].plmn.mcc[0] = cellParams.plmnList[srvdPlmnIdx].mcc[0];
702 duCfgParam.srvdCellLst[srvdCellIdx].duCellInfo.cellInfo.srvdPlmn[srvdPlmnIdx].plmn.mcc[1] = cellParams.plmnList[srvdPlmnIdx].mcc[1];
703 duCfgParam.srvdCellLst[srvdCellIdx].duCellInfo.cellInfo.srvdPlmn[srvdPlmnIdx].plmn.mcc[2] = cellParams.plmnList[srvdPlmnIdx].mcc[2];
704 duCfgParam.srvdCellLst[srvdCellIdx].duCellInfo.cellInfo.srvdPlmn[srvdPlmnIdx].plmn.mnc[0] = cellParams.plmnList[srvdPlmnIdx].mnc[0];
705 duCfgParam.srvdCellLst[srvdCellIdx].duCellInfo.cellInfo.srvdPlmn[srvdPlmnIdx].plmn.mnc[1] = cellParams.plmnList[srvdPlmnIdx].mnc[1];
706 duCfgParam.srvdCellLst[srvdCellIdx].duCellInfo.cellInfo.srvdPlmn[srvdPlmnIdx].plmn.mnc[2] = cellParams.plmnList[srvdPlmnIdx].mnc[2];
708 duCfgParam.srvdCellLst[srvdCellIdx].duCellInfo.cellInfo.srvdPlmn[srvdPlmnIdx].plmn.mcc[0] = PLMN_MCC0;
709 duCfgParam.srvdCellLst[srvdCellIdx].duCellInfo.cellInfo.srvdPlmn[srvdPlmnIdx].plmn.mcc[1] = PLMN_MCC1;
710 duCfgParam.srvdCellLst[srvdCellIdx].duCellInfo.cellInfo.srvdPlmn[srvdPlmnIdx].plmn.mcc[2] = PLMN_MCC2;
711 duCfgParam.srvdCellLst[srvdCellIdx].duCellInfo.cellInfo.srvdPlmn[srvdPlmnIdx].plmn.mnc[0] = PLMN_MNC0;
712 duCfgParam.srvdCellLst[srvdCellIdx].duCellInfo.cellInfo.srvdPlmn[srvdPlmnIdx].plmn.mnc[1] = PLMN_MNC1;
715 /* List of Extended PLMN */
716 for(srvdPlmnIdx=0; srvdPlmnIdx<MAX_PLMN; srvdPlmnIdx++)
718 /* As per spec 38.473, Plmn identity consists of 3 digit from mcc
719 * followed by either 2 digit or 3 digits of mnc */
721 memset(&duCfgParam.srvdCellLst[srvdCellIdx].duCellInfo.cellInfo.srvdPlmn[srvdPlmnIdx].extPlmn, 0, sizeof(Plmn));
722 duCfgParam.srvdCellLst[srvdCellIdx].duCellInfo.cellInfo.srvdPlmn[srvdPlmnIdx].extPlmn.mcc[0] = PLMN_MCC0;
723 duCfgParam.srvdCellLst[srvdCellIdx].duCellInfo.cellInfo.srvdPlmn[srvdPlmnIdx].extPlmn.mcc[1] = PLMN_MCC1;
724 duCfgParam.srvdCellLst[srvdCellIdx].duCellInfo.cellInfo.srvdPlmn[srvdPlmnIdx].extPlmn.mcc[2] = PLMN_MCC2;
725 duCfgParam.srvdCellLst[srvdCellIdx].duCellInfo.cellInfo.srvdPlmn[srvdPlmnIdx].extPlmn.mnc[0] = PLMN_MNC0;
726 duCfgParam.srvdCellLst[srvdCellIdx].duCellInfo.cellInfo.srvdPlmn[srvdPlmnIdx].extPlmn.mnc[1] = PLMN_MNC1;
728 /* List of Supporting Slices */
729 for(srvdPlmnIdx=0; srvdPlmnIdx<MAX_PLMN; srvdPlmnIdx++)
731 taiSliceSuppLst = &duCfgParam.srvdCellLst[srvdCellIdx].duCellInfo.cellInfo.srvdPlmn[srvdPlmnIdx].\
734 /* TODO Calculte the exact number of supported slices once will get
735 * cell configuration from O1 */
736 taiSliceSuppLst->numSupportedSlices = NUM_OF_SUPPORTED_SLICE;
737 if(taiSliceSuppLst->numSupportedSlices > MAX_NUM_OF_SLICE_ITEMS)
739 DU_LOG("\nERROR --> DU_APP: readCfg(): Number of supported slice [%d] is more than 1024",\
740 taiSliceSuppLst->numSupportedSlices);
744 DU_ALLOC(taiSliceSuppLst->snssai, taiSliceSuppLst->numSupportedSlices*sizeof(Snssai*));
745 if(taiSliceSuppLst->snssai == NULLP)
747 DU_LOG("\nERROR --> DU_APP: readCfg():Memory allocation failed");
751 for(sliceIdx=0; sliceIdx<taiSliceSuppLst->numSupportedSlices; sliceIdx++)
753 DU_ALLOC(taiSliceSuppLst->snssai[sliceIdx], sizeof(Snssai));
754 if(taiSliceSuppLst->snssai[sliceIdx] == NULLP)
756 DU_LOG("\nERROR --> DU_APP: readCfg():Memory allocation failed");
760 memcpy(taiSliceSuppLst->snssai[sliceIdx]->sd, cellParams.plmnList[sliceIdx].sd, \
761 SD_SIZE*sizeof(uint8_t));
762 taiSliceSuppLst->snssai[sliceIdx]->sst = cellParams.plmnList[sliceIdx].sst;
764 memcpy(taiSliceSuppLst->snssai[sliceIdx], &snssai[sliceIdx], sizeof(Snssai));
771 /* NR TDD Mode info */
773 duCfgParam.srvdCellLst[srvdCellIdx].duCellInfo.f1Mode.mode.tdd.nrFreqInfo.nrArfcn = cellParams.arfcnUL;
774 duCfgParam.srvdCellLst[srvdCellIdx].duCellInfo.f1Mode.mode.tdd.nrFreqInfo.sulInfo.sulArfcn = cellParams.arfcnSUL;
775 duCfgParam.srvdCellLst[srvdCellIdx].duCellInfo.f1Mode.mode.tdd.nrFreqInfo.sulInfo.sulTxBw.nrScs = convertScsValToScsEnum(cellParams.ssbSubCarrierSpacing);
777 duCfgParam.srvdCellLst[srvdCellIdx].duCellInfo.f1Mode.mode.tdd.nrFreqInfo.nrArfcn = NR_UL_ARFCN;
778 duCfgParam.srvdCellLst[srvdCellIdx].duCellInfo.f1Mode.mode.tdd.nrFreqInfo.sulInfo.sulArfcn = SUL_ARFCN;
779 duCfgParam.srvdCellLst[srvdCellIdx].duCellInfo.f1Mode.mode.tdd.nrFreqInfo.sulInfo.sulTxBw.nrScs = NR_SCS;
781 duCfgParam.srvdCellLst[srvdCellIdx].duCellInfo.f1Mode.mode.tdd.nrFreqInfo.sulInfo.sulTxBw.nrb = NRB_273;
783 for(freqBandIdx=0; freqBandIdx<MAX_NRCELL_BANDS; freqBandIdx++)
785 duCfgParam.srvdCellLst[srvdCellIdx].duCellInfo.f1Mode.mode.tdd.nrFreqInfo.freqBand[freqBandIdx].nrFreqBand =\
787 for(bandIdx=0; bandIdx<MAX_NRCELL_BANDS; bandIdx++)
789 duCfgParam.srvdCellLst[srvdCellIdx].duCellInfo.f1Mode.mode.tdd.nrFreqInfo.freqBand[freqBandIdx].sulBand[bandIdx]\
794 /* NR FDD Mode info */
796 duCfgParam.srvdCellLst[srvdCellIdx].duCellInfo.f1Mode.mode.fdd.ulNrFreqInfo.nrArfcn = cellParams.arfcnUL;
797 duCfgParam.srvdCellLst[srvdCellIdx].duCellInfo.f1Mode.mode.fdd.ulNrFreqInfo.sulInfo.sulArfcn = cellParams.arfcnSUL;
798 duCfgParam.srvdCellLst[srvdCellIdx].duCellInfo.f1Mode.mode.fdd.ulTxBw.nrScs = convertScsValToScsEnum(cellParams.ssbSubCarrierSpacing);
799 duCfgParam.srvdCellLst[srvdCellIdx].duCellInfo.f1Mode.mode.fdd.ulNrFreqInfo.sulInfo.sulTxBw.nrScs = convertScsValToScsEnum(cellParams.ssbSubCarrierSpacing);
800 duCfgParam.srvdCellLst[srvdCellIdx].duCellInfo.f1Mode.mode.fdd.dlNrFreqInfo.nrArfcn = cellParams.arfcnDL;
801 duCfgParam.srvdCellLst[srvdCellIdx].duCellInfo.f1Mode.mode.fdd.dlNrFreqInfo.sulInfo.sulArfcn = cellParams.arfcnSUL;
802 duCfgParam.srvdCellLst[srvdCellIdx].duCellInfo.f1Mode.mode.fdd.dlNrFreqInfo.sulInfo.sulTxBw.nrScs = convertScsValToScsEnum(cellParams.ssbSubCarrierSpacing);
803 duCfgParam.srvdCellLst[srvdCellIdx].duCellInfo.f1Mode.mode.fdd.dlTxBw.nrScs = convertScsValToScsEnum(cellParams.ssbSubCarrierSpacing);
805 duCfgParam.srvdCellLst[srvdCellIdx].duCellInfo.f1Mode.mode.fdd.ulNrFreqInfo.nrArfcn = NR_UL_ARFCN;
806 duCfgParam.srvdCellLst[srvdCellIdx].duCellInfo.f1Mode.mode.fdd.ulNrFreqInfo.sulInfo.sulArfcn = SUL_ARFCN;
807 duCfgParam.srvdCellLst[srvdCellIdx].duCellInfo.f1Mode.mode.fdd.ulTxBw.nrScs = NR_SCS;
808 duCfgParam.srvdCellLst[srvdCellIdx].duCellInfo.f1Mode.mode.fdd.ulNrFreqInfo.sulInfo.sulTxBw.nrScs = NR_SCS;
809 duCfgParam.srvdCellLst[srvdCellIdx].duCellInfo.f1Mode.mode.fdd.dlNrFreqInfo.nrArfcn = NR_DL_ARFCN;
810 duCfgParam.srvdCellLst[srvdCellIdx].duCellInfo.f1Mode.mode.fdd.dlNrFreqInfo.sulInfo.sulArfcn = SUL_ARFCN;
811 duCfgParam.srvdCellLst[srvdCellIdx].duCellInfo.f1Mode.mode.fdd.dlNrFreqInfo.sulInfo.sulTxBw.nrScs = NR_SCS;
812 duCfgParam.srvdCellLst[srvdCellIdx].duCellInfo.f1Mode.mode.fdd.dlTxBw.nrScs = NR_SCS;
814 duCfgParam.srvdCellLst[srvdCellIdx].duCellInfo.f1Mode.mode.fdd.ulNrFreqInfo.sulInfo.sulTxBw.nrb = NRB_106;
815 for(freqBandIdx=0; freqBandIdx<MAX_NRCELL_BANDS; freqBandIdx++)
817 duCfgParam.srvdCellLst[srvdCellIdx].duCellInfo.f1Mode.mode.fdd.ulNrFreqInfo.freqBand[freqBandIdx].\
818 nrFreqBand = NR_FREQ_BAND;
819 for(bandIdx=0; bandIdx<MAX_NRCELL_BANDS; bandIdx++)
821 duCfgParam.srvdCellLst[srvdCellIdx].duCellInfo.f1Mode.mode.fdd.ulNrFreqInfo.freqBand[freqBandIdx].\
822 sulBand[bandIdx] = SUL_BAND;
825 duCfgParam.srvdCellLst[srvdCellIdx].duCellInfo.f1Mode.mode.fdd.dlNrFreqInfo.sulInfo.sulTxBw.nrb = NRB_106;
826 for(freqBandIdx=0; freqBandIdx<MAX_NRCELL_BANDS; freqBandIdx++)
828 duCfgParam.srvdCellLst[srvdCellIdx].duCellInfo.f1Mode.mode.fdd.dlNrFreqInfo.freqBand[freqBandIdx].\
829 nrFreqBand = NR_FREQ_BAND;
830 for(bandIdx=0; bandIdx<MAX_NRCELL_BANDS; bandIdx++)
832 duCfgParam.srvdCellLst[srvdCellIdx].duCellInfo.f1Mode.mode.fdd.dlNrFreqInfo.freqBand[freqBandIdx].\
833 sulBand[bandIdx] = SUL_BAND;
837 duCfgParam.srvdCellLst[srvdCellIdx].duCellInfo.f1Mode.mode.fdd.ulTxBw.nrb = NRB_106;
838 duCfgParam.srvdCellLst[srvdCellIdx].duCellInfo.f1Mode.mode.fdd.dlTxBw.nrb = NRB_106;
841 /*Measurement Config and Cell Config */
842 duCfgParam.srvdCellLst[srvdCellIdx].duCellInfo.measTimeCfgDuration = TIME_CFG;
844 duCfgParam.srvdCellLst[srvdCellIdx].duCellInfo.cellDir = DL_UL;
846 duCfgParam.srvdCellLst[srvdCellIdx].duCellInfo.cellType=CELL_TYPE;
848 /* Broadcast PLMN Identity */
849 for(brdcstPlmnIdx=0; brdcstPlmnIdx<MAX_BPLMN_NRCELL_MINUS_1; brdcstPlmnIdx++)
851 for(plmnIdx=0; plmnIdx<MAX_PLMN; plmnIdx++)
853 memset(&duCfgParam.srvdCellLst[srvdCellIdx].duCellInfo.brdcstPlmnInfo[brdcstPlmnIdx].plmn[plmnIdx],\
855 duCfgParam.srvdCellLst[srvdCellIdx].duCellInfo.brdcstPlmnInfo[brdcstPlmnIdx].plmn[plmnIdx].mcc[0] =\
857 duCfgParam.srvdCellLst[srvdCellIdx].duCellInfo.brdcstPlmnInfo[brdcstPlmnIdx].plmn[plmnIdx].mcc[1] =\
859 duCfgParam.srvdCellLst[srvdCellIdx].duCellInfo.brdcstPlmnInfo[brdcstPlmnIdx].plmn[plmnIdx].mcc[2] =\
861 duCfgParam.srvdCellLst[srvdCellIdx].duCellInfo.brdcstPlmnInfo[brdcstPlmnIdx].plmn[plmnIdx].mnc[0] =\
863 duCfgParam.srvdCellLst[srvdCellIdx].duCellInfo.brdcstPlmnInfo[brdcstPlmnIdx].plmn[plmnIdx].mnc[1] =\
866 /* Extended PLMN List */
867 for(plmnIdx=0; plmnIdx<MAX_PLMN; plmnIdx++)
869 memset(&duCfgParam.srvdCellLst[srvdCellIdx].duCellInfo.brdcstPlmnInfo[brdcstPlmnIdx].\
870 extPlmn[plmnIdx], 0, sizeof(Plmn));
871 duCfgParam.srvdCellLst[srvdCellIdx].duCellInfo.brdcstPlmnInfo[brdcstPlmnIdx].\
872 extPlmn[plmnIdx].mcc[0] = PLMN_MCC0;
873 duCfgParam.srvdCellLst[srvdCellIdx].duCellInfo.brdcstPlmnInfo[brdcstPlmnIdx].\
874 extPlmn[plmnIdx].mcc[1] = PLMN_MCC1;
875 duCfgParam.srvdCellLst[srvdCellIdx].duCellInfo.brdcstPlmnInfo[brdcstPlmnIdx].\
876 extPlmn[plmnIdx].mcc[2] = PLMN_MCC2;
877 duCfgParam.srvdCellLst[srvdCellIdx].duCellInfo.brdcstPlmnInfo[brdcstPlmnIdx].\
878 extPlmn[plmnIdx].mnc[0] = PLMN_MNC0;
879 duCfgParam.srvdCellLst[srvdCellIdx].duCellInfo.brdcstPlmnInfo[brdcstPlmnIdx].\
880 extPlmn[plmnIdx].mnc[1] = PLMN_MNC1;
883 duCfgParam.srvdCellLst[srvdCellIdx].duCellInfo.epsTac = cellParams.nRTAC; //TODO : to check and fill
884 duCfgParam.srvdCellLst[srvdCellIdx].duCellInfo.tac = cellParams.nRTAC;
885 duCfgParam.srvdCellLst[srvdCellIdx].duCellInfo.brdcstPlmnInfo[brdcstPlmnIdx].tac = cellParams.nRTAC;
886 duCfgParam.srvdCellLst[srvdCellIdx].duCellInfo.brdcstPlmnInfo[brdcstPlmnIdx].nrCellId = cellParams.cellLocalId;
888 duCfgParam.srvdCellLst[srvdCellIdx].duCellInfo.epsTac = DU_TAC; //TODO : to check and fill
889 duCfgParam.srvdCellLst[srvdCellIdx].duCellInfo.tac = DU_TAC;
890 duCfgParam.srvdCellLst[srvdCellIdx].duCellInfo.brdcstPlmnInfo[brdcstPlmnIdx].tac = DU_TAC;
891 duCfgParam.srvdCellLst[srvdCellIdx].duCellInfo.brdcstPlmnInfo[brdcstPlmnIdx].nrCellId = NR_CELL_ID;
893 duCfgParam.srvdCellLst[srvdCellIdx].duCellInfo.brdcstPlmnInfo[brdcstPlmnIdx].ranac = NR_RANAC;
896 /*gnb DU System Info mib msg*/
898 DU_ALLOC(duCfgParam.srvdCellLst[srvdCellIdx].duSysInfo.mibMsg, encBufSize);
899 if(!(duCfgParam.srvdCellLst[srvdCellIdx].duSysInfo.mibMsg))
901 DU_LOG("\nERROR --> DU APP : Memory allocation failure at readCfg");
904 memcpy(duCfgParam.srvdCellLst[srvdCellIdx].duSysInfo.mibMsg, encBuf, encBufSize);
905 duCfgParam.srvdCellLst[srvdCellIdx].duSysInfo.mibLen = encBufSize;
907 /*gnb DU System Info mib msg*/
909 DU_ALLOC(duCfgParam.srvdCellLst[srvdCellIdx].duSysInfo.sib1Msg,\
911 if(!(duCfgParam.srvdCellLst[srvdCellIdx].duSysInfo.sib1Msg))
913 DU_LOG("\nERROR --> DU APP : Memory allocation failure at readCfg");
916 memcpy(duCfgParam.srvdCellLst[srvdCellIdx].duSysInfo.sib1Msg,\
918 duCfgParam.srvdCellLst[srvdCellIdx].duSysInfo.sib1Len = encBufSize;
922 if(readMacCfg() != ROK)
924 DU_LOG("\nERROR --> DU_APP : Failed while reading MAC config");
931 /*******************************************************************
933 * @brief Copy Slice Cfg in temp structre in duCfgParams
937 * Function : cpyRrmPolicyInDuCfgParams
940 * - Copy Slice Cfg in temp structre in duCfgParams
942 * @params[in] RrmPolicy rrmPolicy[], uint8_t policyNum, uint8_t memberList
943 * @return ROK - success
946 * ****************************************************************/
947 uint8_t cpyRrmPolicyInDuCfgParams(RrmPolicyList rrmPolicy[], uint8_t policyNum, MacSliceCfgReq *tempSliceCfg)
949 uint8_t policyIdx = 0, memberListIdx = 0;
952 tempSliceCfg->numOfRrmPolicy = policyNum;
953 DU_ALLOC_SHRABL_BUF(tempSliceCfg->listOfRrmPolicy, tempSliceCfg->numOfRrmPolicy * sizeof(MacSliceRrmPolicy*));
954 if(!tempSliceCfg->listOfRrmPolicy)
956 DU_LOG("\nERROR --> DU APP : Memory allocation failed in cpyRrmPolicyInDuCfgParams");
960 for(policyIdx = 0; policyIdx<tempSliceCfg->numOfRrmPolicy; policyIdx++)
962 DU_ALLOC_SHRABL_BUF(tempSliceCfg->listOfRrmPolicy[policyIdx], sizeof(MacSliceRrmPolicy));
963 if(!tempSliceCfg->listOfRrmPolicy[policyIdx])
965 DU_LOG("\nERROR --> DU APP : Memory allocation failed in cpyRrmPolicyInDuCfgParams");
969 tempSliceCfg->listOfRrmPolicy[policyIdx]->resourceType = rrmPolicy[policyIdx].resourceType;
971 tempSliceCfg->listOfRrmPolicy[policyIdx]->numOfRrmPolicyMem = rrmPolicy[policyIdx].rRMMemberNum;
973 if(tempSliceCfg->listOfRrmPolicy[policyIdx]->numOfRrmPolicyMem)
975 DU_ALLOC_SHRABL_BUF(tempSliceCfg->listOfRrmPolicy[policyIdx]->rRMPolicyMemberList,\
976 tempSliceCfg->listOfRrmPolicy[policyIdx]->numOfRrmPolicyMem * sizeof(RrmPolicyMemberList*));
978 if(!tempSliceCfg->listOfRrmPolicy[policyIdx]->rRMPolicyMemberList)
980 DU_LOG("\nERROR --> DU APP : Memory allocation failed in cpyRrmPolicyInDuCfgParams");
985 for(memberListIdx = 0; memberListIdx<tempSliceCfg->listOfRrmPolicy[policyIdx]->numOfRrmPolicyMem; memberListIdx++)
987 DU_ALLOC_SHRABL_BUF(tempSliceCfg->listOfRrmPolicy[policyIdx]->rRMPolicyMemberList[memberListIdx], sizeof(RrmPolicyMemberList));
988 if(!tempSliceCfg->listOfRrmPolicy[policyIdx]->rRMPolicyMemberList[memberListIdx])
990 DU_LOG("\nERROR --> DU APP : Memory allocation failed in cpyRrmPolicyInDuCfgParams");
993 memcpy(&tempSliceCfg->listOfRrmPolicy[policyIdx]->rRMPolicyMemberList[memberListIdx]->snssai.sd,\
994 &rrmPolicy[policyIdx].rRMPolicyMemberList[memberListIdx].sd, 3 * sizeof(uint8_t));
995 memcpy(&tempSliceCfg->listOfRrmPolicy[policyIdx]->rRMPolicyMemberList[memberListIdx]->snssai.sst,\
996 &rrmPolicy[policyIdx].rRMPolicyMemberList[memberListIdx].sst, sizeof(uint8_t));
997 memcpy(&tempSliceCfg->listOfRrmPolicy[policyIdx]->rRMPolicyMemberList[memberListIdx]->plmn.mcc,\
998 &rrmPolicy[policyIdx].rRMPolicyMemberList[memberListIdx].mcc, 3 * sizeof(uint8_t));
999 memcpy(&tempSliceCfg->listOfRrmPolicy[policyIdx]->rRMPolicyMemberList[memberListIdx]->plmn.mnc,\
1000 &rrmPolicy[policyIdx].rRMPolicyMemberList[memberListIdx].mnc, 3 * sizeof(uint8_t));
1002 tempSliceCfg->listOfRrmPolicy[policyIdx]->policyRatio.maxRatio = rrmPolicy[policyIdx].rRMPolicyMaxRatio;
1003 tempSliceCfg->listOfRrmPolicy[policyIdx]->policyRatio.minRatio = rrmPolicy[policyIdx].rRMPolicyMinRatio;
1004 tempSliceCfg->listOfRrmPolicy[policyIdx]->policyRatio.dedicatedRatio = rrmPolicy[policyIdx].rRMPolicyDedicatedRatio;
1012 /*******************************************************************
1014 * @brief Fill SCTP Parameters
1018 * Function : parseSctpParams
1020 * Functionality: Fill SCTP Parameters
1022 * @params[in] XML document pointer
1024 * Current node in XML
1025 * Pointer to structure to be filled
1026 * @return ROK - success
1029 * ****************************************************************/
1030 uint8_t parseSctpParams(xmlDocPtr doc, xmlNsPtr ns, xmlNodePtr cur, SctpParams *sctp)
1032 uint8_t max_du_port = 0;
1033 uint16_t f1_sctp_port = 0;
1034 uint16_t e2_sctp_port = 0;
1036 memset(sctp, 0, sizeof(SctpParams));
1037 cur = cur->xmlChildrenNode;
1041 sctp->duPort[F1_INTERFACE] = g_cfg.DU_Port;
1042 sctp->duPort[E2_INTERFACE] = g_cfg.RIC_Port;
1043 sctp->cuPort = g_cfg.CU_Port;
1044 sctp->ricPort = g_cfg.RIC_Port;
1046 if ((!xmlStrcmp(cur->name, (const xmlChar *)"MAX_DU_PORT")) && (cur->ns == ns))
1048 max_du_port = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
1049 if (max_du_port == 2 )
1051 sctp->duPort[F1_INTERFACE] = f1_sctp_port; /* DU Port idx 0 */
1052 sctp->duPort[E2_INTERFACE] = e2_sctp_port; /* RIC Port idx 1 */
1056 if ((!xmlStrcmp(cur->name, (const xmlChar *)"F1_SCTP_PORT")) && (cur->ns == ns))
1058 f1_sctp_port = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
1060 if ((!xmlStrcmp(cur->name, (const xmlChar *)"E2_SCTP_PORT")) && (cur->ns == ns))
1062 e2_sctp_port = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
1065 sctp->cuPort = f1_sctp_port;
1066 sctp->ricPort = e2_sctp_port;
1073 /*******************************************************************
1075 * @brief Fill EGTP Parameters
1079 * Function : parseEgtpParams
1081 * Functionality: Fill EGTP Parmeters
1083 * @params[in] XML document pointer
1085 * Current node in XML
1086 * Pointer to structure to be filled
1087 * @return ROK - success
1090 * ****************************************************************/
1091 uint8_t parseEgtpParams(xmlDocPtr doc, xmlNsPtr ns, xmlNodePtr cur, F1EgtpParams *egtp)
1093 memset(egtp, 0, sizeof(F1EgtpParams));
1094 cur = cur->xmlChildrenNode;
1097 if ((!xmlStrcmp(cur->name, (const xmlChar *)"LOCAL_F1_EGTP_PORT")) && (cur->ns == ns))
1099 egtp->localPort = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
1101 if ((!xmlStrcmp(cur->name, (const xmlChar *)"DEST_F1_EGTP_PORT")) && (cur->ns == ns))
1103 egtp->destPort = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
1105 if ((!xmlStrcmp(cur->name, (const xmlChar *)"MIN_TEID")) && (cur->ns == ns))
1107 egtp->minTunnelId = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
1114 /*******************************************************************
1116 * @brief Fill MIB configuration
1120 * Function : parseMibParams
1122 * Functionality: Fill MIB configuration
1124 * @params[in] XML document pointer
1126 * Current node in XML
1127 * Pointer to structure to be filled
1128 * @return ROK - success
1131 * ****************************************************************/
1132 uint8_t parseMibParams(xmlDocPtr doc, xmlNsPtr ns, xmlNodePtr cur, MibParams *mib)
1134 memset(mib, 0, sizeof(MibParams));
1135 cur = cur -> xmlChildrenNode;
1138 if ((!xmlStrcmp(cur->name, (const xmlChar *)"SYS_FRAME_NUM")) && (cur->ns == ns))
1140 mib->sysFrmNum = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
1142 if ((!xmlStrcmp(cur->name, (const xmlChar *)"SUB_CARR_SPACE")) && (cur->ns == ns))
1144 mib->subCarrierSpacingCommon = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
1146 if ((!xmlStrcmp(cur->name, (const xmlChar *)"SSB_SC_OFFSET")) && (cur->ns == ns))
1148 mib->ssb_SubcarrierOffset = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
1150 if ((!xmlStrcmp(cur->name, (const xmlChar *)"DMRS_TYPEA_POSITION")) && (cur->ns == ns))
1152 mib->dmrs_TypeA_Position = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
1154 if ((!xmlStrcmp(cur->name, (const xmlChar *)"CORESET_0_INDEX")) && (cur->ns == ns))
1156 mib->controlResourceSetZero = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
1158 if ((!xmlStrcmp(cur->name, (const xmlChar *)"SEARCHSPACE_0_INDEX")) && (cur->ns == ns))
1160 mib->searchSpaceZero = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
1162 if ((!xmlStrcmp(cur->name, (const xmlChar *)"CELL_BARRED")) && (cur->ns == ns))
1164 mib->cellBarred = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
1166 if ((!xmlStrcmp(cur->name, (const xmlChar *)"INTRA_FREQ_RESELECT")) && (cur->ns == ns))
1168 mib->intraFreqReselection = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
1175 /*******************************************************************
1177 * @brief Fill PLMN ID
1181 * Function : parsePlmn
1183 * Functionality: Fill PLMN ID
1185 * @params[in] XML document pointer
1187 * Current node in XML
1188 * Pointer to structure to be filled
1189 * @return ROK - success
1192 * ****************************************************************/
1193 uint8_t parsePlmn(xmlDocPtr doc, xmlNsPtr ns, xmlNodePtr cur, Plmn *plmn)
1195 xmlNodePtr child = NULLP;
1197 memset(plmn, 0, sizeof(Plmn));
1198 cur = cur->xmlChildrenNode;
1201 if ((!xmlStrcmp(cur->name, (const xmlChar *)"MCC")) && (cur->ns == ns))
1203 child = cur->xmlChildrenNode;
1204 while (child != NULL)
1206 if ((!xmlStrcmp(child->name, (const xmlChar *)"PLMN_MCC0")) && (child->ns == ns))
1208 plmn->mcc[0] = atoi((char *)xmlNodeListGetString(doc, child->xmlChildrenNode, 1));
1211 if ((!xmlStrcmp(child->name, (const xmlChar *)"PLMN_MCC1")) && (child->ns == ns))
1213 plmn->mcc[1] = atoi((char *)xmlNodeListGetString(doc, child->xmlChildrenNode, 1));
1216 if ((!xmlStrcmp(child->name, (const xmlChar *)"PLMN_MCC2")) && (child->ns == ns))
1218 plmn->mcc[2] = atoi((char *)xmlNodeListGetString(doc, child->xmlChildrenNode, 1));
1221 child = child->next;
1225 if ((!xmlStrcmp(cur->name, (const xmlChar *)"MNC")) && (cur->ns == ns))
1227 child = cur->xmlChildrenNode;
1228 while (child != NULL)
1230 if ((!xmlStrcmp(child->name, (const xmlChar *)"PLMN_MNC0")) && (child->ns == ns))
1232 plmn->mnc[0] = atoi((char *)xmlNodeListGetString(doc, child->xmlChildrenNode, 1));
1235 if ((!xmlStrcmp(child->name, (const xmlChar *)"PLMN_MNC1")) && (child->ns == ns))
1237 plmn->mnc[1] = atoi((char *)xmlNodeListGetString(doc, child->xmlChildrenNode, 1));
1240 if ((!xmlStrcmp(child->name, (const xmlChar *)"PLMN_MNC2")) && (child->ns == ns))
1242 plmn->mnc[2] = atoi((char *)xmlNodeListGetString(doc, child->xmlChildrenNode, 1));
1245 child = child->next;
1254 /*******************************************************************
1256 * @brief Fill NR CGI
1260 * Function : parseNrCgi
1262 * Functionality: Fill NR CGI
1264 * @params[in] XML document pointer
1266 * Current node in XML
1267 * Pointer to structure to be filled
1268 * @return ROK - success
1271 * ****************************************************************/
1272 uint8_t parseNrCgi(xmlDocPtr doc, xmlNsPtr ns, xmlNodePtr cur, NrEcgi *nrCgi)
1274 memset(nrCgi, 0, sizeof(NrEcgi));
1275 cur = cur->xmlChildrenNode;
1278 if ((!xmlStrcmp(cur->name, (const xmlChar *)"PLMN")) && (cur->ns == ns))
1280 if(parsePlmn(doc, ns, cur, &nrCgi->plmn) != ROK)
1286 if ((!xmlStrcmp(cur->name, (const xmlChar *)"CELL_ID")) && (cur->ns == ns))
1288 nrCgi-> cellId = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
1296 /*******************************************************************
1298 * @brief Fill SNSSAI
1302 * Function : parseSnssai
1304 * Functionality: Fill SNSSAI
1306 * @params[in] XML document pointer
1308 * Current node in XML
1309 * Pointer to structure to be filled
1310 * @return ROK - success
1313 * ****************************************************************/
1314 uint8_t parseSnssai(xmlDocPtr doc, xmlNsPtr ns, xmlNodePtr cur, Snssai *snssai)
1319 memset(snssai, 0, sizeof(Snssai));
1320 cur = cur ->xmlChildrenNode;
1323 if ((!xmlStrcmp(cur->name, (const xmlChar *)"SST")) && (cur->ns == ns))
1325 snssai->sst = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
1328 if ((!xmlStrcmp(cur->name, (const xmlChar *)"SD_SIZE")) && (cur->ns == ns))
1330 child = cur->xmlChildrenNode;
1331 while(child != NULL)
1333 if ((!xmlStrcmp(child->name, (const xmlChar *)"SD")) && (child->ns == ns))
1335 snssai->sd[sdIdx] = atoi((char *)xmlNodeListGetString(doc, child->xmlChildrenNode, 1));
1338 child = child -> next;
1347 #ifdef XML_BASED_CONFIG
1348 /*******************************************************************
1350 * @brief Fill Supported Slice List
1354 * Function : parseSupportedSliceList
1356 * Functionality: Fill Supported Slice List
1358 * @params[in] XML document pointer
1360 * Current node in XML
1361 * Pointer to structure to be filled
1362 * @return ROK - success
1365 * ****************************************************************/
1366 uint8_t parseSupportedSliceList(xmlDocPtr doc, xmlNsPtr ns, xmlNodePtr cur, SupportedSliceList *sliceSuppLst)
1368 uint8_t sliceIdx = 0;
1369 xmlNodePtr child = NULLP;
1370 xmlNodePtr snssaiNode = NULLP;
1372 memset(sliceSuppLst, 0, sizeof(SupportedSliceList));
1373 cur = cur->xmlChildrenNode;
1376 if ((!xmlStrcmp(cur->name, (const xmlChar *)"NUM_SUPPORT_SLICE")) && (cur->ns == ns))
1378 sliceSuppLst->numSupportedSlices = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
1379 if(sliceSuppLst->numSupportedSlices > MAX_NUM_OF_SLICE_ITEMS)
1381 DU_LOG("\nERROR --> DU_APP: %s: Number of supported slice [%d] is more than 1024",\
1382 __func__, sliceSuppLst->numSupportedSlices);
1387 if ((!xmlStrcmp(cur->name, (const xmlChar *)"SNSSAI_LIST")) && (cur->ns == ns))
1389 DU_ALLOC_SHRABL_BUF(sliceSuppLst->snssai, (sliceSuppLst->numSupportedSlices) * sizeof(Snssai*));
1390 if (sliceSuppLst->snssai == NULLP)
1392 DU_LOG("\nERROR --> DU_APP: %s: Memory allocation failed at line %d", __func__, __LINE__);
1396 for (sliceIdx = 0; sliceIdx < sliceSuppLst->numSupportedSlices; sliceIdx++)
1398 DU_ALLOC_SHRABL_BUF(sliceSuppLst->snssai[sliceIdx], sizeof(Snssai));
1399 if (sliceSuppLst->snssai[sliceIdx] == NULLP)
1401 DU_LOG("\nERROR --> DU_APP: %s: Memory allocation failed at line %d", __func__, __LINE__);
1407 memcpy(sliceSuppLst->snssai[sliceIdx]->sd, cellParams.plmnList[sliceIdx].sd, SD_SIZE*sizeof(uint8_t));
1408 sliceSuppLst->snssai[sliceIdx]->sst = cellParams.plmnList[sliceIdx].sst;
1414 child = cur->xmlChildrenNode;
1415 while (child != NULL)
1417 if ((!xmlStrcmp(child->name, (const xmlChar *)"LIST")) && (child->ns == ns))
1420 snssaiNode = child->xmlChildrenNode;
1421 while (snssaiNode != NULL)
1423 if ((!xmlStrcmp(snssaiNode->name, (const xmlChar *)"SNSSAI")) && (snssaiNode->ns == ns))
1425 if(parseSnssai(doc, ns, snssaiNode, sliceSuppLst->snssai[sliceIdx]) != ROK)
1431 snssaiNode = snssaiNode->next;
1434 child = child->next;
1444 /*******************************************************************
1446 * @brief Fill Served PLMN
1450 * Function : parseF1SrvdPlmn
1452 * Functionality: Fill Served PLMN
1454 * @params[in] XML document pointer
1456 * Current node in XML
1457 * Pointer to structure to be filled
1458 * @return ROK - success
1461 * ****************************************************************/
1462 uint8_t parseF1SrvdPlmn(xmlDocPtr doc, xmlNsPtr ns, xmlNodePtr cur, F1SrvdPlmn *srvdPlmn, uint8_t srvdPlmnIdx)
1464 memset(srvdPlmn, 0, sizeof(F1SrvdPlmn));
1465 cur = cur->xmlChildrenNode;
1469 fillPlmnFromO1(&srvdPlmn ->plmn, srvdPlmnIdx);
1471 if ((!xmlStrcmp(cur->name, (const xmlChar *)"PLMN")) && (cur->ns == ns))
1473 if(parsePlmn(doc, ns, cur, &srvdPlmn->plmn) != ROK)
1480 if ((!xmlStrcmp(cur->name, (const xmlChar *)"EXT_PLMN")) && (cur->ns == ns))
1482 if(parsePlmn(doc, ns, cur, &srvdPlmn->extPlmn) != ROK)
1488 if ((!xmlStrcmp(cur->name, (const xmlChar *)"F1_SLICE_SUPP_LST")) && (cur->ns == ns))
1490 if(parseSupportedSliceList(doc, ns, cur, &srvdPlmn->taiSliceSuppLst) != ROK)
1501 /*******************************************************************
1503 * @brief Fill cell information
1507 * Function : parseF1CellInfo
1509 * Functionality: Fill cell information
1511 * @params[in] XML document pointer
1513 * Current node in XML
1514 * Pointer to structure to be filled
1515 * @return ROK - success
1518 * ****************************************************************/
1519 uint8_t parseF1CellInfo(xmlDocPtr doc, xmlNsPtr ns, xmlNodePtr cur, F1CellInfo *f1CellInfo)
1521 memset(f1CellInfo, 0, sizeof(F1CellInfo));
1522 cur = cur->xmlChildrenNode;
1525 if ((!xmlStrcmp(cur->name, (const xmlChar *)"NR_CGI")) && (cur->ns == ns))
1527 if(parseNrCgi(doc, ns, cur, &f1CellInfo->nrCgi) != ROK)
1534 f1CellInfo->nrPci = cellParams.nRPCI;
1536 if ((!xmlStrcmp(cur->name, (const xmlChar *)"NR_PCI")) && (cur->ns == ns))
1538 f1CellInfo->nrPci = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
1542 if ((!xmlStrcmp(cur->name, (const xmlChar *)"F1_SRVD_PLMN")) && (cur->ns == ns))
1544 if(parseF1SrvdPlmn(doc, ns, cur, &f1CellInfo->srvdPlmn[0], 0) != ROK)
1555 /*******************************************************************
1557 * @brief Fill Frequency Band
1561 * Function : parseF1FreqBand
1563 * Functionality: Fill Frequency Band
1565 * @params[in] XML document pointer
1567 * Current node in XML
1568 * Pointer to structure to be filled
1569 * @return ROK - success
1572 * ****************************************************************/
1573 uint8_t parseF1FreqBand(xmlDocPtr doc, xmlNsPtr ns, xmlNodePtr cur, F1FreqBand *freqBand)
1576 uint16_t sulValue = 0;
1578 xmlNodePtr sulChild;
1580 memset(freqBand, 0, sizeof(F1FreqBand));
1581 cur = cur->xmlChildrenNode;
1584 if ((!xmlStrcmp(cur->name, (const xmlChar *)"NR_FREQ_BAND")) && (cur->ns == ns))
1586 freqBand->nrFreqBand = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
1589 if ((!xmlStrcmp(cur->name, (const xmlChar *)"SUL_BAND_LIST")) && (cur->ns == ns))
1591 child = cur->xmlChildrenNode;
1592 while (child != NULL)
1594 if ((!xmlStrcmp(child->name, (const xmlChar *)"LIST")) && (child->ns == ns))
1596 sulChild = child->xmlChildrenNode;
1598 while (sulChild != NULL)
1600 if ((!xmlStrcmp(sulChild->name, (const xmlChar *)"SUL_BAND")) && (sulChild->ns == ns))
1602 sulValue = atoi((char *)xmlNodeListGetString(doc, sulChild->xmlChildrenNode, 1));
1603 if (sulIdx < MAX_NRCELL_BANDS)
1605 freqBand->sulBand[sulIdx] = sulValue;
1610 DU_LOG("ERROR --> DU_APP : %s : SUL_BAND array overflow\n", __func__);
1614 sulChild = sulChild->next;
1617 child = child->next;
1625 /*******************************************************************
1627 * @brief Fill Frequency Band List
1631 * Function : parseF1FreqBandList
1633 * Functionality: Fill Frequency Band List
1635 * @params[in] XML document pointer
1637 * Current node in XML
1638 * Pointer to structure to be filled
1639 * @return ROK - success
1642 * ****************************************************************/
1643 uint8_t parseF1FreqBandList(xmlDocPtr doc, xmlNsPtr ns, xmlNodePtr cur, F1NrFreqInfo *nrFreqInfo)
1648 cur = cur->xmlChildrenNode;
1651 if ((!xmlStrcmp(cur->name, (const xmlChar *)"LIST")) && (cur->ns == ns))
1653 child = cur->xmlChildrenNode;
1654 while(child != NULL)
1656 if ((!xmlStrcmp(child->name, (const xmlChar *)"F1_FREQ_BAND")) && (child->ns == ns))
1658 if(parseF1FreqBand(doc, ns, child, &nrFreqInfo->freqBand[idx]) != ROK)
1664 child = child -> next;
1673 /*******************************************************************
1675 * @brief Fill Transmission Bandwidth
1679 * Function : parseF1TxBw
1681 * Functionality: Fill Transmission Bandwidth
1683 * @params[in] XML document pointer
1685 * Current node in XML
1686 * Pointer to structure to be filled
1687 * @return ROK - success
1690 * ****************************************************************/
1691 uint8_t parseF1TxBw(xmlDocPtr doc, xmlNsPtr ns, xmlNodePtr cur, F1TxBw *txBw)
1693 memset(txBw, 0, sizeof(F1TxBw));
1694 cur = cur->xmlChildrenNode;
1697 if ((!xmlStrcmp(cur->name, (const xmlChar *)"F1_NR_SCS")) && (cur->ns == ns))
1699 txBw->nrScs = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
1702 if ((!xmlStrcmp(cur->name, (const xmlChar *)"F1_NRB")) && (cur->ns == ns))
1704 txBw->nrb = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
1712 /*******************************************************************
1714 * @brief Fill SUL Info
1718 * Function : parseF1SulInfo
1720 * Functionality: Fill SUL Info
1722 * @params[in] XML document pointer
1724 * Current node in XML
1725 * Pointer to structure to be filled
1726 * @return ROK - success
1729 * ****************************************************************/
1730 uint8_t parseF1SulInfo(xmlDocPtr doc, xmlNsPtr ns, xmlNodePtr cur, F1SulInfo *sulInfo)
1732 memset(sulInfo, 0, sizeof(F1SulInfo));
1733 cur = cur->xmlChildrenNode;
1736 if ((!xmlStrcmp(cur->name, (const xmlChar *)"SUL_ARFCN")) && (cur->ns == ns))
1738 sulInfo->sulArfcn = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
1741 if ((!xmlStrcmp(cur->name, (const xmlChar *)"F1_TX_BW")) && (cur->ns == ns))
1743 if(parseF1TxBw(doc, ns, cur, &sulInfo->sulTxBw) != ROK)
1754 /*******************************************************************
1756 * @brief Fill NR Frequency Info
1760 * Function : parseF1NrFreqInfo
1762 * Functionality: Fill NR Frequency Info
1764 * @params[in] XML document pointer
1766 * Current node in XML
1767 * Pointer to structure to be filled
1768 * @return ROK - success
1771 * ****************************************************************/
1772 uint8_t parseF1NrFreqInfo(xmlDocPtr doc, xmlNsPtr ns, xmlNodePtr cur, F1NrFreqInfo *nrFreqInfo)
1774 memset(nrFreqInfo, 0, sizeof(F1NrFreqInfo));
1775 cur = cur->xmlChildrenNode;
1778 if ((!xmlStrcmp(cur->name, (const xmlChar *)"NR_ARFCN")) && (cur->ns == ns))
1780 nrFreqInfo->nrArfcn = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
1783 if ((!xmlStrcmp(cur->name, (const xmlChar *)"F1_SUL_INFO")) && (cur->ns == ns))
1785 if(parseF1SulInfo(doc, ns, cur, &nrFreqInfo->sulInfo) != ROK)
1791 if ((!xmlStrcmp(cur->name, (const xmlChar *)"F1_FREQ_BAND_LIST")) && (cur->ns == ns))
1793 if(parseF1FreqBandList(doc, ns, cur, nrFreqInfo) != ROK)
1804 /*******************************************************************
1806 * @brief Fill NR FDD Info
1810 * Function : parseF1NrFddInfo
1812 * Functionality: Fill NR FDD Info
1814 * @params[in] XML document pointer
1816 * Current node in XML
1817 * Pointer to structure to be filled
1818 * @return ROK - success
1821 * ****************************************************************/
1822 uint8_t parseF1NrFddInfo(xmlDocPtr doc, xmlNsPtr ns, xmlNodePtr cur, F1NrFddInfo *fddInfo)
1824 memset(fddInfo, 0, sizeof(F1NrFddInfo));
1825 cur = cur->xmlChildrenNode;
1828 if ((!xmlStrcmp(cur->name, (const xmlChar *)"F1_NR_FREQ_INFO_UL")) && (cur->ns == ns))
1830 if(parseF1NrFreqInfo(doc, ns, cur, &fddInfo->ulNrFreqInfo) != ROK)
1836 if ((!xmlStrcmp(cur->name, (const xmlChar *)"F1_NR_FREQ_INFO_DL")) && (cur->ns == ns))
1838 if(parseF1NrFreqInfo(doc, ns, cur, &fddInfo->dlNrFreqInfo) != ROK)
1844 if ((!xmlStrcmp(cur->name, (const xmlChar *)"F1_TX_BW_UL")) && (cur->ns == ns))
1846 if(parseF1TxBw(doc, ns, cur, &fddInfo->ulTxBw) != ROK)
1852 if ((!xmlStrcmp(cur->name, (const xmlChar *)"F1_TX_BW_DL")) && (cur->ns == ns))
1854 if(parseF1TxBw(doc, ns, cur, &fddInfo->dlTxBw) != ROK)
1865 /*******************************************************************
1867 * @brief Fill NR TDD Info
1871 * Function : parseF1NrTddInfo
1873 * Functionality: Fill NR TDD Info
1875 * @params[in] XML document pointer
1877 * Current node in XML
1878 * Pointer to structure to be filled
1879 * @return ROK - success
1882 * ****************************************************************/
1883 uint8_t parseF1NrTddInfo(xmlDocPtr doc, xmlNsPtr ns, xmlNodePtr cur, F1NrTddInfo *tddInfo)
1885 memset(tddInfo, 0, sizeof(F1NrTddInfo));
1886 cur = cur->xmlChildrenNode;
1889 if ((!xmlStrcmp(cur->name, (const xmlChar *)"F1_NR_FREQ_INFO")) && (cur->ns == ns))
1891 if(parseF1NrFreqInfo(doc, ns, cur, &tddInfo->nrFreqInfo) != ROK)
1897 if ((!xmlStrcmp(cur->name, (const xmlChar *)"F1_TX_BW")) && (cur->ns == ns))
1899 if(parseF1TxBw(doc, ns, cur, &tddInfo->nrTxBw) != ROK)
1910 /*******************************************************************
1912 * @brief Fill NR Mode Info
1916 * Function : parseNrModeInfo
1918 * Functionality: Fill NR Mode Info
1920 * @params[in] XML document pointer
1922 * Current node in XML
1923 * Pointer to structure to be filled
1924 * @return ROK - success
1927 * ****************************************************************/
1928 uint8_t parseNrModeInfo(xmlDocPtr doc, xmlNsPtr ns, xmlNodePtr cur, NrModeInfo *nrModeInfo)
1932 memset(nrModeInfo, 0, sizeof(NrModeInfo));
1933 cur = cur->xmlChildrenNode;
1936 if ((!xmlStrcmp(cur->name, (const xmlChar *)"NR_MODE")) && (cur->ns == ns))
1938 strcpy((char*)modeCfg, (char*)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
1941 if ((!xmlStrcmp(cur->name, (const xmlChar *)"F1_NR_FDD_INFO")) && (cur->ns == ns))
1943 if(strcmp(modeCfg, "FDD") == 0)
1945 if(parseF1NrFddInfo(doc, ns, cur, &nrModeInfo->mode.fdd) != ROK)
1952 if ((!xmlStrcmp(cur->name, (const xmlChar *)"F1_NR_TDD_INFO")) && (cur->ns == ns))
1954 if(strcmp(modeCfg, "TDD") == 0)
1956 if(parseF1NrTddInfo(doc, ns, cur, &nrModeInfo->mode.tdd) != ROK)
1968 /*******************************************************************
1970 * @brief Fill Broadcast PLMN Information
1974 * Function : parseF1BrdcstPlmnInfo
1976 * Functionality: Fill Broadcast PLMN Information
1978 * @params[in] XML document pointer
1980 * Current node in XML
1981 * Pointer to structure to be filled
1982 * @return ROK - success
1985 * ****************************************************************/
1986 uint8_t parseF1BrdcstPlmnInfo(xmlDocPtr doc, xmlNsPtr ns, xmlNodePtr cur, F1BrdcstPlmnInfo *brdcstPlmnInfo)
1988 memset(brdcstPlmnInfo, 0, sizeof(F1BrdcstPlmnInfo));
1989 cur = cur->xmlChildrenNode;
1992 if ((!xmlStrcmp(cur->name, (const xmlChar *)"PLMN")) && (cur->ns == ns))
1994 if(parsePlmn(doc, ns, cur, &brdcstPlmnInfo->plmn[0]) != ROK)
2000 if ((!xmlStrcmp(cur->name, (const xmlChar *)"EXT_PLMN")) && (cur->ns == ns))
2002 if(parsePlmn(doc, ns, cur, &brdcstPlmnInfo->extPlmn[0]) != ROK)
2008 if ((!xmlStrcmp(cur->name, (const xmlChar *)"TAC")) && (cur->ns == ns))
2010 brdcstPlmnInfo->tac = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
2013 if ((!xmlStrcmp(cur->name, (const xmlChar *)"NR_CELL_ID")) && (cur->ns == ns))
2015 brdcstPlmnInfo->nrCellId = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
2018 if ((!xmlStrcmp(cur->name, (const xmlChar *)"NR_RANAC")) && (cur->ns == ns))
2020 brdcstPlmnInfo->ranac = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
2028 /*******************************************************************
2030 * @brief Fill DU Cell Information
2034 * Function : parseF1DuCellInfo
2036 * Functionality: Fill DU Cell Information
2038 * @params[in] XML document pointer
2040 * Current node in XML
2041 * Pointer to structure to be filled
2042 * @return ROK - success
2045 * ****************************************************************/
2046 uint8_t parseF1DuCellInfo(xmlDocPtr doc, xmlNsPtr ns, xmlNodePtr cur, F1DuCellInfo *duCellInfo)
2048 memset(duCellInfo, 0, sizeof(F1DuCellInfo));
2049 cur = cur->xmlChildrenNode;
2052 if ((!xmlStrcmp(cur->name, (const xmlChar *)"F1_CELL_INFO")) && (cur->ns == ns))
2054 if(parseF1CellInfo(doc, ns, cur, &duCellInfo->cellInfo) != ROK)
2060 if ((!xmlStrcmp(cur->name, (const xmlChar *)"TAC")) && (cur->ns == ns))
2062 duCellInfo->tac = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
2065 if ((!xmlStrcmp(cur->name, (const xmlChar *)"EPS_TAC")) && (cur->ns == ns))
2067 duCellInfo->epsTac = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
2070 if ((!xmlStrcmp(cur->name, (const xmlChar *)"NR_MODE_INFO")) && (cur->ns == ns))
2072 if(parseNrModeInfo(doc, ns, cur, &duCellInfo->f1Mode) != ROK)
2078 if ((!xmlStrcmp(cur->name, (const xmlChar *)"TIME_CFG")) && (cur->ns == ns))
2080 duCellInfo->measTimeCfgDuration = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
2083 if ((!xmlStrcmp(cur->name, (const xmlChar *)"F1_CELL_DIR")) && (cur->ns == ns))
2085 duCellInfo->cellDir = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
2088 if ((!xmlStrcmp(cur->name, (const xmlChar *)"F1_CELL_TYPE")) && (cur->ns == ns))
2090 duCellInfo->cellType = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
2093 if ((!xmlStrcmp(cur->name, (const xmlChar *)"F1_BRDCST_PLMN_INFO")) && (cur->ns == ns))
2095 if(parseF1BrdcstPlmnInfo(doc, ns, cur, &duCellInfo->brdcstPlmnInfo[0]) != ROK)
2106 /*******************************************************************
2108 * @brief Fill DU served cell information
2112 * Function : parseF1DuServedCellInfo
2114 * Functionality: Fill DU served cell information
2116 * @params[in] XML document pointer
2118 * Current node in XML
2119 * Pointer to structure to be filled
2120 * @return ROK - success
2123 * ****************************************************************/
2124 uint8_t parseF1DuServedCellInfo(xmlDocPtr doc, xmlNsPtr ns, xmlNodePtr cur, F1DuSrvdCellInfo *srvdCellInfo)
2126 memset(srvdCellInfo, 0, sizeof(F1DuSrvdCellInfo));
2127 cur = cur->xmlChildrenNode;
2130 if ((!xmlStrcmp(cur->name, (const xmlChar *)"F1_DU_CELL_INFO")) && (cur->ns == ns))
2132 if(parseF1DuCellInfo(doc, ns, cur, &srvdCellInfo->duCellInfo) != ROK)
2140 if(fillDuSrvdCellSysInfo(&srvdCellInfo->duSysInfo) != ROK)
2147 /*******************************************************************
2149 * @brief Fill DU Served Cell System Information
2153 * Function : fillDuSrvdCellSysInfo
2155 * Functionality: Fill DU Served Cell System Information
2157 * @params[in] Served Cell System Information
2158 * @return ROK - success
2161 * ****************************************************************/
2162 uint8_t fillDuSrvdCellSysInfo(F1DuSysInfo *sysInfo)
2164 /* GNB DU System Info MIB msg */
2166 DU_ALLOC(sysInfo->mibMsg, encBufSize);
2167 if(!(sysInfo->mibMsg))
2169 DU_LOG("\nERROR --> DU APP : %s : Memory allocation failure at line %d", __func__, __LINE__);
2172 memcpy(sysInfo->mibMsg, encBuf, encBufSize);
2173 sysInfo->mibLen = encBufSize;
2175 /* GNB DU System Info SIB1 msg */
2177 DU_ALLOC(sysInfo->sib1Msg, encBufSize);
2178 if(!(sysInfo->sib1Msg))
2180 DU_LOG("\nERROR --> DU APP : %s : Memory allocation failure at line %d", __func__, __LINE__);
2183 memcpy(sysInfo->sib1Msg, encBuf,encBufSize);
2184 sysInfo->sib1Len = encBufSize;
2190 /*******************************************************************
2192 * @brief Fill PLMN received from O1 interface
2196 * Function : fillPlmnFromO1
2198 * Functionality: Fill PLMN received from O1 interface
2200 * @params[in] XML document pointer
2202 * Current node in XML
2203 * Pointer to structure to be filled
2204 * @return ROK - success
2207 * ****************************************************************/
2208 void fillPlmnFromO1(Plmn *PLMN, uint8_t srvdPlmnIdx)
2210 PLMN->mcc[0] = cellParams.plmnList[srvdPlmnIdx].mcc[0];
2211 PLMN->mcc[1] = cellParams.plmnList[srvdPlmnIdx].mcc[1];
2212 PLMN->mcc[2] = cellParams.plmnList[srvdPlmnIdx].mcc[2];
2213 PLMN->mnc[0] = cellParams.plmnList[srvdPlmnIdx].mnc[0];
2214 PLMN->mnc[1] = cellParams.plmnList[srvdPlmnIdx].mnc[1];
2215 PLMN->mnc[2] = cellParams.plmnList[srvdPlmnIdx].mnc[2];
2219 /*******************************************************************
2221 * @brief Fill Beamforming Configuration
2225 * Function : parseBeamformingConfig
2227 * Functionality: Fill Beamforming Configuration
2229 * @params[in] XML document pointer
2231 * Current node in XML
2232 * Pointer to structure to be filled
2233 * @return ROK - success
2236 * ****************************************************************/
2237 uint8_t parseBeamformingConfig(xmlDocPtr doc, xmlNsPtr ns, xmlNodePtr cur, BeamformingConf *beamformingCfg)
2239 memset(beamformingCfg, 0, sizeof(BeamformingConf));
2240 cur = cur -> xmlChildrenNode;
2243 if ((!xmlStrcmp(cur->name, (const xmlChar *)"NUM_OF_BEAMS")) && (cur->ns == ns))
2245 beamformingCfg->numOfBeams = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
2248 if ((!xmlStrcmp(cur->name, (const xmlChar *)"NUM_TX_RUS")) && (cur->ns == ns))
2250 beamformingCfg->numTxRUs = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
2253 if ((!xmlStrcmp(cur->name, (const xmlChar *)"BEAM_IDX")) && (cur->ns == ns))
2255 beamformingCfg->beamIdx = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
2258 if ((!xmlStrcmp(cur->name, (const xmlChar *)"BEAM_TYPE")) && (cur->ns == ns))
2260 beamformingCfg->beamType = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
2263 if ((!xmlStrcmp(cur->name, (const xmlChar *)"BEAM_AZIMUTH")) && (cur->ns == ns))
2265 beamformingCfg->beamAzimuth = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
2268 if ((!xmlStrcmp(cur->name, (const xmlChar *)"BEAM_TILT")) && (cur->ns == ns))
2270 beamformingCfg->beamTilt = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
2273 if ((!xmlStrcmp(cur->name, (const xmlChar *)"BEAM_HORIZ_WIDTH")) && (cur->ns == ns))
2275 beamformingCfg->beamHorizWidth = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
2278 if ((!xmlStrcmp(cur->name, (const xmlChar *)"BEAM_VERT_WIDTH")) && (cur->ns == ns))
2280 beamformingCfg->beamVertWidth = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
2283 if ((!xmlStrcmp(cur->name, (const xmlChar *)"COVER_SHAPE")) && (cur->ns == ns))
2285 beamformingCfg->coverageShape = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
2288 if ((!xmlStrcmp(cur->name, (const xmlChar *)"DIGI_TILT")) && (cur->ns == ns))
2290 beamformingCfg->digitalTilt = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
2293 if ((!xmlStrcmp(cur->name, (const xmlChar *)"DIGI_AZIMUTH")) && (cur->ns == ns))
2295 beamformingCfg->digitalAzimuth = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
2303 /*******************************************************************
2305 * @brief Fill Precoding Configuration
2309 * Function : parsePrecodingConfig
2311 * Functionality: Fill Precoding Configuration
2313 * @params[in] XML document pointer
2315 * Current node in XML
2316 * Pointer to structure to be filled
2317 * @return ROK - success
2320 * ****************************************************************/
2321 uint8_t parsePrecodingConfig(xmlDocPtr doc, xmlNsPtr ns, xmlNodePtr cur, PrecodingConf *precodCfg)
2323 memset(precodCfg, 0, sizeof(PrecodingConf));
2324 cur = cur -> xmlChildrenNode;
2327 if ((!xmlStrcmp(cur->name, (const xmlChar *)"NUM_LAYERS")) && (cur->ns == ns))
2329 precodCfg->numLayers = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
2332 if ((!xmlStrcmp(cur->name, (const xmlChar *)"NUM_ANT_PORTS")) && (cur->ns == ns))
2334 precodCfg->numAntPorts = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
2342 /*******************************************************************
2344 * @brief Fill PRACH FDM Information
2348 * Function : parsePrachFdmInfo
2350 * Functionality: Fill PRACH FDM Information
2352 * @params[in] XML document pointer
2354 * Current node in XML
2355 * Pointer to structure to be filled
2356 * @return ROK - success
2359 * ****************************************************************/
2360 uint8_t parsePrachFdmInfo(xmlDocPtr doc, xmlNsPtr ns, xmlNodePtr cur,PrachFdmInfo *prachFdmInfo)
2362 memset(prachFdmInfo, 0, sizeof(PrachFdmInfo));
2363 cur = cur -> xmlChildrenNode;
2366 if ((!xmlStrcmp(cur->name, (const xmlChar *)"ROOT_SEQ_IDX")) && (cur->ns == ns))
2368 prachFdmInfo->rootSeqIdx = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
2371 if ((!xmlStrcmp(cur->name, (const xmlChar *)"NUM_ROOT_SEQ")) && (cur->ns == ns))
2373 prachFdmInfo->numRootSeq = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
2376 if ((!xmlStrcmp(cur->name, (const xmlChar *)"K1")) && (cur->ns == ns))
2378 prachFdmInfo->k1 = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
2381 if ((!xmlStrcmp(cur->name, (const xmlChar *)"ZERO_CORR_ZONE_CFG")) && (cur->ns == ns))
2383 prachFdmInfo->zeroCorrZoneCfg = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
2391 /*******************************************************************
2393 * @brief Fill PRACH configuration
2397 * Function : parsePrachCfg
2399 * Functionality: Fill PRACH configuration
2401 * @params[in] XML document pointer
2403 * Current node in XML
2404 * Pointer to structure to be filled
2405 * @return ROK - success
2408 * ****************************************************************/
2409 uint8_t parsePrachCfg(xmlDocPtr doc, xmlNsPtr ns, xmlNodePtr cur, PrachCfg *prachCfg)
2413 uint8_t maxNumRbs = 0;
2414 uint8_t prachMaxPrb = 0;
2416 memset(prachCfg, 0, sizeof(PrachCfg));
2417 cur = cur -> xmlChildrenNode;
2420 if ((!xmlStrcmp(cur->name, (const xmlChar *)"PRACH_SEQ_LEN")) && (cur->ns == ns))
2422 prachCfg->prachSeqLen = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
2425 if ((!xmlStrcmp(cur->name, (const xmlChar *)"NR_SCS")) && (cur->ns == ns))
2427 prachCfg->prachSubcSpacing = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
2430 if ((!xmlStrcmp(cur->name, (const xmlChar *)"PRACH_CONFIG_IDX")) && (cur->ns == ns))
2432 prachCfg->prachCfgIdx = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
2435 if ((!xmlStrcmp(cur->name, (const xmlChar *)"NUM_PRACH_FDM")) && (cur->ns == ns))
2437 prachCfg->msg1Fdm = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
2440 if ((!xmlStrcmp(cur->name, (const xmlChar *)"FDM_LIST")) && (cur->ns == ns))
2442 child = cur->xmlChildrenNode;
2443 while(child != NULL)
2445 if ((!xmlStrcmp(child->name, (const xmlChar *)"FDM_INFO")) && (child->ns == ns))
2447 if(parsePrachFdmInfo(doc, ns, child, &prachCfg->fdm[fdmIdx]) != ROK)
2453 child = child -> next;
2457 if ((!xmlStrcmp(cur->name, (const xmlChar *)"PRACH_RESTRICTED_SET_CFG")) && (cur->ns == ns))
2459 prachCfg->prachRstSetCfg = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
2462 if ((!xmlStrcmp(cur->name, (const xmlChar *)"SSB_PER_RACH")) && (cur->ns == ns))
2464 prachCfg->ssbPerRach = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
2467 if ((!xmlStrcmp(cur->name, (const xmlChar *)"NUM_RA_PREAMBLE")) && (cur->ns == ns))
2469 prachCfg->totalNumRaPreamble = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
2472 if ((!xmlStrcmp(cur->name, (const xmlChar *)"CB_PREAMBLE_PER_SSB")) && (cur->ns == ns))
2474 prachCfg->totalNumRaPreamble = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
2477 if ((!xmlStrcmp(cur->name, (const xmlChar *)"MAX_NUM_RB")) && (cur->ns == ns))
2479 maxNumRbs = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
2482 if ((!xmlStrcmp(cur->name, (const xmlChar *)"PRACH_MAX_PRB")) && (cur->ns == ns))
2484 prachMaxPrb = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
2487 if ((!xmlStrcmp(cur->name, (const xmlChar *)"RSRP_THRESHOLD_SSB")) && (cur->ns == ns))
2489 prachCfg->rsrpThreshSsb = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
2492 if ((!xmlStrcmp(cur->name, (const xmlChar *)"RA_RSP_WINDOW")) && (cur->ns == ns))
2494 prachCfg->raRspWindow = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
2500 prachCfg->msg1FreqStart = maxNumRbs - prachMaxPrb;
2504 /*******************************************************************
2506 * @brief Fill CSI RS configuration
2510 * Function : parseCsiRsCfg
2512 * Functionality: Fill CSI RS configuration
2514 * @params[in] XML document pointer
2516 * Current node in XML
2517 * Pointer to structure to be filled
2518 * @return ROK - success
2521 * ****************************************************************/
2522 uint8_t parseCsiRsCfg(xmlDocPtr doc, xmlNsPtr ns, xmlNodePtr cur, CsiRsCfg *csiRsCfg)
2524 memset(csiRsCfg, 0, sizeof(CsiRsCfg));
2525 cur = cur -> xmlChildrenNode;
2528 if ((!xmlStrcmp(cur->name, (const xmlChar *)"CSIRS_FREQ")) && (cur->ns == ns))
2530 csiRsCfg->csiFreqDomainAlloc = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
2533 if ((!xmlStrcmp(cur->name, (const xmlChar *)"CSIRS_PORTS")) && (cur->ns == ns))
2535 csiRsCfg->csiNrofPorts = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
2538 if ((!xmlStrcmp(cur->name, (const xmlChar *)"CSIRS_OFDM_PORT")) && (cur->ns == ns))
2540 csiRsCfg->csirsfirstOFDMSymbolInTimeDomain = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
2543 if ((!xmlStrcmp(cur->name, (const xmlChar *)"CSIRS_OFDM_PORT_2")) && (cur->ns == ns))
2545 csiRsCfg->csirsfirstOFDMSymbolInTimeDomain2 = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
2548 if ((!xmlStrcmp(cur->name, (const xmlChar *)"CSIRS_DM_TYPE")) && (cur->ns == ns))
2550 csiRsCfg->csirscdmType = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
2553 if ((!xmlStrcmp(cur->name, (const xmlChar *)"CSIRS_DENSITY")) && (cur->ns == ns))
2555 csiRsCfg->csirsdensity = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
2558 if ((!xmlStrcmp(cur->name, (const xmlChar *)"CSIRS_DENSITY_DOT_5")) && (cur->ns == ns))
2560 csiRsCfg->csirsdensitydot5 = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
2563 if ((!xmlStrcmp(cur->name, (const xmlChar *)"POWER_CONTROL_OFFSET")) && (cur->ns == ns))
2565 csiRsCfg->powerControlOffset = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
2568 if ((!xmlStrcmp(cur->name, (const xmlChar *)"POWER_CONTROL_OFFSET_SS")) && (cur->ns == ns))
2570 csiRsCfg->powerControlOffsetSS = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
2573 if ((!xmlStrcmp(cur->name, (const xmlChar *)"PERIODICITY_OFFSET")) && (cur->ns == ns))
2575 csiRsCfg->periodicityAndOffset = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
2583 /*******************************************************************
2585 * @brief Fill SSB Configuration
2589 * Function : parseSsbCfg
2591 * Functionality: Fill SSB Configuration
2593 * @params[in] XML document pointer
2595 * Current node in XML
2596 * Pointer to structure to be filled
2597 * @return ROK - success
2600 * ****************************************************************/
2601 uint8_t parseSsbCfg(xmlDocPtr doc, xmlNsPtr ns, xmlNodePtr cur, SsbCfg *ssbCfg)
2604 uint8_t ssbMaskIdx = 0;
2606 memset(ssbCfg, 0, sizeof( SsbCfg));
2607 cur = cur -> xmlChildrenNode;
2610 if ((!xmlStrcmp(cur->name, (const xmlChar *)"SSB_PBSC_PWR")) && (cur->ns == ns))
2612 ssbCfg->ssbPbchPwr = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
2615 if ((!xmlStrcmp(cur->name, (const xmlChar *)"SCS_CMN")) && (cur->ns == ns))
2617 ssbCfg->scsCmn = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
2620 if ((!xmlStrcmp(cur->name, (const xmlChar *)"SSB_OFF_PT_A")) && (cur->ns == ns))
2622 ssbCfg->ssbOffsetPointA = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
2625 if ((!xmlStrcmp(cur->name, (const xmlChar *)"SSB_PERIOD")) && (cur->ns == ns))
2627 ssbCfg->ssbPeriod = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
2630 if ((!xmlStrcmp(cur->name, (const xmlChar *)"SSB_SC_OFF")) && (cur->ns == ns))
2632 ssbCfg->ssbScOffset = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
2635 if ((!xmlStrcmp(cur->name, (const xmlChar *)"SSB_LIST")) && (cur->ns == ns))
2637 child = cur -> xmlChildrenNode;
2638 while(child != NULL)
2640 if ((!xmlStrcmp(child->name, (const xmlChar *)"SSB_MASK")) && (child->ns == ns))
2642 ssbCfg->ssbMask[ssbMaskIdx] = atoi((char *)xmlNodeListGetString(doc, child->xmlChildrenNode, 1));
2645 child = child -> next;
2649 if ((!xmlStrcmp(cur->name, (const xmlChar *)"BEAM_ID")) && (cur->ns == ns))
2651 ssbCfg->beamId[0] = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
2654 if ((!xmlStrcmp(cur->name, (const xmlChar *)"BETA_PSS")) && (cur->ns == ns))
2656 ssbCfg->betaPss = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
2659 if ((!xmlStrcmp(cur->name, (const xmlChar *)"BCH_PAY_FLAG")) && (cur->ns == ns))
2661 ssbCfg->bchPayloadFlag = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
2664 if ((!xmlStrcmp(cur->name, (const xmlChar *)"DMRS_TYPE_A_PROS")) && (cur->ns == ns))
2666 ssbCfg->dmrsTypeAPos = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
2674 /*******************************************************************
2676 * @brief Fill Carrier Configuration
2680 * Function : parseCarrierCfg
2682 * Functionality: Fill Carrier Configuration
2684 * @params[in] XML document pointer
2686 * Current node in XML
2687 * Pointer to structure to be filled
2688 * @return ROK - success
2691 * ****************************************************************/
2692 uint8_t parseCarrierCfg(xmlDocPtr doc, xmlNsPtr ns, xmlNodePtr cur,CarrierCfg *carrierCfg)
2694 memset(carrierCfg, 0, sizeof(CarrierCfg));
2695 cur = cur -> xmlChildrenNode;
2698 if ((!xmlStrcmp(cur->name, (const xmlChar *)"DL_BW")) && (cur->ns == ns))
2700 carrierCfg->dlBw = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
2703 if ((!xmlStrcmp(cur->name, (const xmlChar *)"NR_DL_ARFCN")) && (cur->ns == ns))
2705 carrierCfg->arfcnDL = convertArfcnToFreqKhz(atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1)));
2708 if ((!xmlStrcmp(cur->name, (const xmlChar *)"UL_BW")) && (cur->ns == ns))
2710 carrierCfg->ulBw = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
2713 if ((!xmlStrcmp(cur->name, (const xmlChar *)"NR_UL_ARFCN")) && (cur->ns == ns))
2715 carrierCfg->arfcnUL = convertArfcnToFreqKhz(atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1)));
2718 if ((!xmlStrcmp(cur->name, (const xmlChar *)"NUM_TX_ANT")) && (cur->ns == ns))
2720 carrierCfg->numTxAnt = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
2723 if ((!xmlStrcmp(cur->name, (const xmlChar *)"NUM_RX_ANT")) && (cur->ns == ns))
2725 carrierCfg->numRxAnt = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
2733 /*******************************************************************
2735 * @brief Fill PLMN Information List
2739 * Function : parsePlmnInfo
2741 * Functionality: Fill PLMN Information List
2743 * @params[in] XML document pointer
2745 * Current node in XML
2746 * Pointer to structure to be filled
2747 * @return ROK - success
2750 * ****************************************************************/
2751 uint8_t parsePlmnInfo(xmlDocPtr doc, xmlNsPtr ns, xmlNodePtr cur,PlmnInfoList *plmnInfoList)
2754 memset(plmnInfoList, 0, sizeof(PlmnInfoList));
2755 cur = cur -> xmlChildrenNode;
2758 if ((!xmlStrcmp(cur->name, (const xmlChar *)"PLMN")) && (cur->ns == ns))
2760 if(parsePlmn(doc, ns, cur,&plmnInfoList->plmn) != ROK)
2766 if ((!xmlStrcmp(cur->name, (const xmlChar *)"F1_SLICE_SUPP_LST")) && (cur->ns == ns))
2768 if(parseSupportedSliceList(doc, ns, cur,&plmnInfoList -> suppSliceList) != ROK)
2779 /*******************************************************************
2781 * @brief Fill PUCCH Configuration Common
2785 * Function : parsePucchConfigCommon
2787 * Functionality: Fill PUCCH Configuration Common
2789 * @params[in] XML document pointer
2791 * Current node in XML
2792 * Pointer to structure to be filled
2793 * @return ROK - success
2796 * ****************************************************************/
2797 uint8_t parsePucchConfigCommon(xmlDocPtr doc, xmlNsPtr ns, xmlNodePtr cur, PucchConfigCommon *pucchCfgCmn)
2799 memset(pucchCfgCmn, 0, sizeof(PucchConfigCommon));
2800 cur = cur -> xmlChildrenNode;
2803 if ((!xmlStrcmp(cur->name, (const xmlChar *)"PUCCH_RSRC_COMMON")) && (cur->ns == ns))
2805 pucchCfgCmn->pucchResourceCommon = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
2808 if ((!xmlStrcmp(cur->name, (const xmlChar *)"PUCCH_NEITHER_HOPPING")) && (cur->ns == ns))
2810 pucchCfgCmn->pucchGroupHopping = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
2818 /*******************************************************************
2820 * @brief Fill PUSCH Common Time Allocation
2824 * Function : parsePuschTimeDomRsrcAlloc
2826 * Functionality: Fill PUSCH Common Time Allocation
2828 * @params[in] XML document pointer
2830 * Current node in XML
2831 * Pointer to structure to be filled
2832 * @return ROK - success
2835 * ****************************************************************/
2836 uint8_t parsePuschTimeDomRsrcAlloc(xmlDocPtr doc, xmlNsPtr ns, xmlNodePtr cur,PuschTimeDomRsrcAlloc *puschTimeDomRsrsAlloc)
2838 memset(puschTimeDomRsrsAlloc, 0, sizeof(PuschTimeDomRsrcAlloc));
2839 cur = cur -> xmlChildrenNode;
2842 if ((!xmlStrcmp(cur->name, (const xmlChar *)"PUSCH_K2_CFG")) && (cur->ns == ns))
2844 puschTimeDomRsrsAlloc->k2 = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
2847 if ((!xmlStrcmp(cur->name, (const xmlChar *)"PUSCH_MAPPING_TYPE")) && (cur->ns == ns))
2849 puschTimeDomRsrsAlloc->mappingType = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
2852 if ((!xmlStrcmp(cur->name, (const xmlChar *)"PUSCH_START_SYMBOL")) && (cur->ns == ns))
2854 puschTimeDomRsrsAlloc->startSymbol = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
2857 if ((!xmlStrcmp(cur->name, (const xmlChar *)"PUSCH_LENGTH_SYMBOL")) && (cur->ns == ns))
2859 puschTimeDomRsrsAlloc->symbolLength= atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
2865 puschTimeDomRsrsAlloc -> startSymbolAndLength = \
2866 calcSliv(puschTimeDomRsrsAlloc->startSymbol, puschTimeDomRsrsAlloc->symbolLength);
2870 /*******************************************************************
2872 * @brief Fill PUSCH Configuration Common
2876 * Function : parsePuschConfigCommon
2878 * Functionality: Fill PUSCH Configuration Common
2880 * @params[in] XML document pointer
2882 * Current node in XML
2883 * Pointer to structure to be filled
2884 * @return ROK - success
2887 * ****************************************************************/
2888 uint8_t parsePuschConfigCommon(xmlDocPtr doc, xmlNsPtr ns, xmlNodePtr cur,PuschConfigCommon *puschCfgCmn)
2891 xmlNodePtr child = NULLP;
2892 xmlNodePtr pdschNode = NULLP;
2894 memset(puschCfgCmn, 0, sizeof(PuschConfigCommon));
2895 cur = cur -> xmlChildrenNode;
2898 if ((!xmlStrcmp(cur->name, (const xmlChar *)"NUM_TIME_DOM_RSRC_ALLOC")) && (cur->ns == ns))
2900 puschCfgCmn->numTimeDomRsrcAlloc = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
2903 if ((!xmlStrcmp(cur->name, (const xmlChar *)"PUSCH_COMM_TIME_ALLOC_LIST")) && (cur->ns == ns))
2905 child = cur->xmlChildrenNode;
2906 while(child != NULL)
2908 if ((!xmlStrcmp(cur->name, (const xmlChar *)"LIST")) && (cur->ns == ns))
2910 pdschNode = child->xmlChildrenNode;
2911 while(pdschNode != NULL)
2913 if ((!xmlStrcmp(pdschNode->name, (const xmlChar *)"PUSCH_COMM_TIME_ALLOC")) && (pdschNode->ns == ns))
2915 if(parsePuschTimeDomRsrcAlloc(doc, ns, child,&puschCfgCmn->timeDomRsrcAllocList[idx]) != ROK)
2921 pdschNode = pdschNode -> next;
2925 child = child -> next;
2933 /*******************************************************************
2935 * @brief Fill BWP Configuration
2939 * Function : parseBwp
2941 * Functionality: Fill BWP Configuration
2943 * @params[in] XML document pointer
2945 * Current node in XML
2946 * Pointer to structure to be filled
2947 * @return ROK - success
2950 * ****************************************************************/
2951 uint8_t parseBwp(xmlDocPtr doc, xmlNsPtr ns, xmlNodePtr cur,BwpParams *bwp)
2953 memset(bwp, 0, sizeof(BwpParams));
2954 cur = cur -> xmlChildrenNode;
2957 if ((!xmlStrcmp(cur->name, (const xmlChar *)"FIRST_PRB")) && (cur->ns == ns))
2959 bwp->firstPrb = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
2962 if ((!xmlStrcmp(cur->name, (const xmlChar *)"NUM_PRB")) && (cur->ns == ns))
2964 bwp->numPrb = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
2967 if ((!xmlStrcmp(cur->name, (const xmlChar *)"NR_SCS")) && (cur->ns == ns))
2969 bwp->scs = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
2972 if ((!xmlStrcmp(cur->name, (const xmlChar *)"NORMAL_CYCLIC_PREFIX")) && (cur->ns == ns))
2974 bwp->cyclicPrefix = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
2982 /*******************************************************************
2984 * @brief Fill UL BWP Configuration
2988 * Function : parseBwpULConfig
2990 * Functionality: Fill UL BWP Configuration
2992 * @params[in] XML document pointer
2994 * Current node in XML
2995 * Pointer to structure to be filled
2996 * @return ROK - success
2999 * ****************************************************************/
3000 uint8_t parseBwpULConfig(xmlDocPtr doc, xmlNsPtr ns, xmlNodePtr cur,BwpUlConfig *bwpUlCfg)
3002 memset(bwpUlCfg, 0, sizeof(BwpUlConfig));
3003 cur = cur -> xmlChildrenNode;
3006 if ((!xmlStrcmp(cur->name, (const xmlChar *)"BWP_PARAMS")) && (cur->ns == ns))
3008 if(parseBwp(doc, ns, cur, &bwpUlCfg->bwp) != ROK)
3014 if ((!xmlStrcmp(cur->name, (const xmlChar *)"PUCCH_CFG_COMMON")) && (cur->ns == ns))
3016 if(parsePucchConfigCommon(doc, ns, cur, &bwpUlCfg->pucchCommon) != ROK)
3022 if ((!xmlStrcmp(cur->name, (const xmlChar *)"PUSCH_CFG_COMMON")) && (cur->ns == ns))
3024 if(parsePuschConfigCommon(doc, ns, cur, &bwpUlCfg->puschCommon) != ROK)
3034 /*******************************************************************
3036 * @brief Fill Page Configuration
3040 * Function : parsePageCfg
3042 * Functionality: Fill Page Configuration
3044 * @params[in] XML document pointer
3046 * Current node in XML
3047 * Pointer to structure to be filled
3048 * @return ROK - success
3051 * ****************************************************************/
3052 uint8_t parsePageCfg(xmlDocPtr doc, xmlNsPtr ns, xmlNodePtr cur, SchPageCfg *pageCfg)
3056 memset(pageCfg, 0, sizeof(SchPageCfg));
3057 cur = cur -> xmlChildrenNode;
3060 if ((!xmlStrcmp(cur->name, (const xmlChar *)"NUM_PO")) && (cur->ns == ns))
3062 pageCfg->numPO = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
3065 if ((!xmlStrcmp(cur->name, (const xmlChar *)"PO_PRESENT")) && (cur->ns == ns))
3067 poPresent = (char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1);
3068 if(!strcmp(poPresent, "TRUE"))
3070 pageCfg->poPresent = true;
3074 pageCfg->poPresent = false;
3078 if ((!xmlStrcmp(cur->name, (const xmlChar *)"PAGING_OCC")) && (cur->ns == ns))
3080 pageCfg->pagingOcc[0] = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
3088 /*******************************************************************
3090 * @brief Fill SIB1 PDCCH Configuration
3094 * Function : parsePdcchCfgSib1
3096 * Functionality: Fill SIB1 PDCCH Configuration
3098 * @params[in] XML document pointer
3100 * Current node in XML
3101 * Pointer to structure to be filled
3102 * @return ROK - success
3105 * ****************************************************************/
3106 uint8_t parsePdcchCfgSib1(xmlDocPtr doc, xmlNsPtr ns, xmlNodePtr cur,PdcchConfigSib1 *pdcchConfigSib1)
3108 memset(pdcchConfigSib1, 0, sizeof(PdcchConfigSib1));
3109 cur = cur -> xmlChildrenNode;
3112 if ((!xmlStrcmp(cur->name, (const xmlChar *)"CORESET_ZERO_INDEX")) && (cur->ns == ns))
3114 pdcchConfigSib1->coresetZeroIndex = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
3117 if ((!xmlStrcmp(cur->name, (const xmlChar *)"SEARCH_SPACE_ZERO_INDEX")) && (cur->ns == ns))
3119 pdcchConfigSib1->searchSpaceZeroIndex = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
3127 /*******************************************************************
3129 * @brief Fill SIB1 Cell Configuration
3133 * Function : parseSib1CellCfg
3135 * Functionality: Fill SIB1 Cell Configuration
3137 * @params[in] XML document pointer
3139 * Current node in XML
3140 * Pointer to structure to be filled
3141 * @return ROK - success
3144 * ****************************************************************/
3145 uint8_t parseSib1CellCfg(xmlDocPtr doc, xmlNsPtr ns, xmlNodePtr cur, Sib1CellCfg *sib1CellCfg)
3147 memset(sib1CellCfg, 0, sizeof( Sib1CellCfg));
3148 cur = cur -> xmlChildrenNode;
3151 if ((!xmlStrcmp(cur->name, (const xmlChar *)"SCH_PAGE_CFG")) && (cur->ns == ns))
3153 if(parsePageCfg(doc, ns, cur, &sib1CellCfg->pagingCfg) != ROK)
3159 if ((!xmlStrcmp(cur->name, (const xmlChar *)"PDCCH_CONFIG_SIB1")) && (cur->ns == ns))
3161 if(parsePdcchCfgSib1(doc, ns, cur, &sib1CellCfg->pdcchCfgSib1) != ROK)
3172 /*******************************************************************
3174 * @brief Fill Aggregation Level Candidates Information
3178 * Function : parseCandidateInfo
3180 * Functionality: Fill Aggregation Level Candidates Information
3182 * @params[in] XML document pointer
3184 * Current node in XML
3185 * Pointer to structure to be filled
3186 * @return ROK - success
3189 * ****************************************************************/
3190 uint8_t parseCandidateInfo(xmlDocPtr doc, xmlNsPtr ns, xmlNodePtr cur,CandidatesInfo *candInfo)
3192 memset(candInfo, 0, sizeof(CandidatesInfo));
3193 cur = cur -> xmlChildrenNode;
3196 if ((!xmlStrcmp(cur->name, (const xmlChar *)"AGG_LEVEL1")) && (cur->ns == ns))
3198 candInfo->aggLevel1 = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
3201 if ((!xmlStrcmp(cur->name, (const xmlChar *)"AGG_LEVEL2")) && (cur->ns == ns))
3203 candInfo->aggLevel2 = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
3206 if ((!xmlStrcmp(cur->name, (const xmlChar *)"AGG_LEVEL4")) && (cur->ns == ns))
3208 candInfo->aggLevel4 = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
3211 if ((!xmlStrcmp(cur->name, (const xmlChar *)"AGG_LEVEL8")) && (cur->ns == ns))
3213 candInfo->aggLevel8 = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
3216 if ((!xmlStrcmp(cur->name, (const xmlChar *)"AGG_LEVEL16")) && (cur->ns == ns))
3218 candInfo->aggLevel16 = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
3226 /*******************************************************************
3228 * @brief Fill Search Space Connfiguration
3232 * Function : parseSearchSpaceCfg
3234 * Functionality: Fill Search Space Configuration
3236 * @params[in] XML document pointer
3238 * Current node in XML
3239 * Pointer to structure to be filled
3240 * @return ROK - success
3243 * ****************************************************************/
3244 uint8_t parseSearchSpaceCfg(xmlDocPtr doc, xmlNsPtr ns, xmlNodePtr cur,SearchSpaceCfg *searchSpaceCfg)
3246 memset(searchSpaceCfg, 0, sizeof(SearchSpaceCfg));
3247 cur = cur -> xmlChildrenNode;
3250 if ((!xmlStrcmp(cur->name, (const xmlChar *)"SEARCHSPACE_1_INDEX")) && (cur->ns == ns))
3252 searchSpaceCfg->searchSpaceId = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
3255 if ((!xmlStrcmp(cur->name, (const xmlChar *)"CORESET_0_INDEX")) && (cur->ns == ns))
3257 searchSpaceCfg->coresetId = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
3260 if ((!xmlStrcmp(cur->name, (const xmlChar *)"SS_MONITORING_SLOT_SL1")) && (cur->ns == ns))
3262 searchSpaceCfg->monitoringSlot = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
3265 if ((!xmlStrcmp(cur->name, (const xmlChar *)"DURATION")) && (cur->ns == ns))
3267 searchSpaceCfg->duration = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
3270 if ((!xmlStrcmp(cur->name, (const xmlChar *)"SS_MONITORING_SYMBOL")) && (cur->ns == ns))
3272 searchSpaceCfg->monitoringSymbol = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
3275 if ((!xmlStrcmp(cur->name, (const xmlChar *)"CANDIDATE_INFO")) && (cur->ns == ns))
3277 if(parseCandidateInfo(doc, ns, cur, &searchSpaceCfg->candidate) != ROK)
3288 /*******************************************************************
3290 * @brief Fill PDCCH Configuration Common
3294 * Function : parsePdcchCfgCommon
3296 * Functionality: Fill PDCCH Configuration Common
3298 * @params[in] XML document pointer
3300 * Current node in XML
3301 * Pointer to structure to be filled
3302 * @return ROK - success
3305 * ****************************************************************/
3306 uint8_t parsePdcchCfgCommon(xmlDocPtr doc, xmlNsPtr ns, xmlNodePtr cur,PdcchConfigCommon *pdcchCfgCm)
3308 memset(pdcchCfgCm, 0, sizeof(PdcchConfigCommon));
3309 cur = cur -> xmlChildrenNode;
3312 if ((!xmlStrcmp(cur->name, (const xmlChar *)"SEARCH_SPACE_CFG")) && (cur->ns == ns))
3314 if(parseSearchSpaceCfg(doc, ns, cur, &pdcchCfgCm->commonSearchSpace) != ROK)
3320 if ((!xmlStrcmp(cur->name, (const xmlChar *)"SEARCHSPACE_1_INDEX")) && (cur->ns == ns))
3322 pdcchCfgCm->raSearchSpaceId = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
3331 /*******************************************************************
3333 * @brief Fill PDSCH Common Time Domain Resource Allocation
3337 * Function : parsePdschCmnTimeDomRsrcAlloc
3339 * Functionality: Fill PDSCH Common Time Domain Resource Allocation
3341 * @params[in] XML document pointer
3343 * Current node in XML
3344 * Pointer to structure to be filled
3345 * @return ROK - success
3348 * ****************************************************************/
3349 uint8_t parsePdschCmnTimeDomRsrcAlloc(xmlDocPtr doc, xmlNsPtr ns, xmlNodePtr cur,\
3350 PdschCfgCommTimeDomRsrcAlloc *pdschTimeDomRsrcAlloc)
3352 memset(pdschTimeDomRsrcAlloc, 0, sizeof(PdschCfgCommTimeDomRsrcAlloc));
3353 cur = cur -> xmlChildrenNode;
3356 if ((!xmlStrcmp(cur->name, (const xmlChar *)"PDSCH_K0_CFG")) && (cur->ns == ns))
3358 pdschTimeDomRsrcAlloc->k0 = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
3360 if ((!xmlStrcmp(cur->name, (const xmlChar *)"PDSCH_MAPPING_TYPE")) && (cur->ns == ns))
3362 pdschTimeDomRsrcAlloc->mappingType = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
3364 if ((!xmlStrcmp(cur->name, (const xmlChar *)"PDSCH_START_SYMBOL")) && (cur->ns == ns))
3366 pdschTimeDomRsrcAlloc->startSymbol = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
3368 if ((!xmlStrcmp(cur->name, (const xmlChar *)"PDSCH_LENGTH_SYMBOL")) && (cur->ns == ns))
3370 pdschTimeDomRsrcAlloc->lengthSymbol = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
3378 /*******************************************************************
3380 * @brief Fill PDSCH Configuration Common
3384 * Function : parsePdschConfigCommon
3386 * Functionality: Fill PDSCH Configuration Common
3388 * @params[in] XML document pointer
3390 * Current node in XML
3391 * Pointer to structure to be filled
3392 * @return ROK - success
3395 * ****************************************************************/
3396 uint8_t parsePdschConfigCommon(xmlDocPtr doc, xmlNsPtr ns, xmlNodePtr cur, PdschConfigCommon *pdschCfgCmn)
3399 xmlNodePtr child = NULLP;
3400 xmlNodePtr pdschNode = NULLP;
3402 memset(pdschCfgCmn, 0, sizeof(PdschConfigCommon));
3403 cur = cur -> xmlChildrenNode;
3406 if ((!xmlStrcmp(cur->name, (const xmlChar *)"NUM_TIME_DOM_RSRC_ALLOC")) && (cur->ns == ns))
3408 pdschCfgCmn->numTimeDomAlloc = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
3411 if ((!xmlStrcmp(cur->name, (const xmlChar *)"PDSCH_COMM_TIME_ALLOC_LIST")) && (cur->ns == ns))
3413 child = cur->xmlChildrenNode;
3414 while(child != NULL)
3416 if ((!xmlStrcmp(cur->name, (const xmlChar *)"LIST")) && (cur->ns == ns))
3418 pdschNode = child->xmlChildrenNode;
3419 while(pdschNode != NULL)
3421 if ((!xmlStrcmp(pdschNode->name, (const xmlChar *)"PDSCH_COMM_TIME_ALLOC")) && (pdschNode->ns == ns))
3423 if(parsePdschCmnTimeDomRsrcAlloc(doc, ns, child, &pdschCfgCmn->timeDomRsrcAllocList[idx]) != ROK)
3429 pdschNode = pdschNode -> next;
3433 child = child -> next;
3441 /*******************************************************************
3443 * @brief Fill DL BWP Configuration
3447 * Function : parseBwpDLConfig
3449 * Functionality: Fill DL BWP Configuration
3451 * @params[in] XML document pointer
3453 * Current node in XML
3454 * Pointer to structure to be filled
3455 * @return ROK - success
3458 * ****************************************************************/
3459 uint8_t parseBwpDLConfig(xmlDocPtr doc, xmlNsPtr ns, xmlNodePtr cur,BwpDlConfig *bwpDlCfg)
3461 memset(bwpDlCfg, 0, sizeof(BwpDlConfig));
3462 cur = cur -> xmlChildrenNode;
3465 if ((!xmlStrcmp(cur->name, (const xmlChar *)"BWP_PARAMS")) && (cur->ns == ns))
3467 if(parseBwp(doc, ns, cur, &bwpDlCfg->bwp) != ROK)
3473 if ((!xmlStrcmp(cur->name, (const xmlChar *)"PDCCH_CFG_COMMON")) && (cur->ns == ns))
3475 if(parsePdcchCfgCommon(doc, ns, cur, &bwpDlCfg->pdcchCommon) != ROK)
3481 if ((!xmlStrcmp(cur->name, (const xmlChar *)"PDSCH_CFG_COMMON")) && (cur->ns == ns))
3483 if(parsePdschConfigCommon(doc, ns, cur, &bwpDlCfg->pdschCommon) != ROK)
3494 /*******************************************************************
3496 * @brief Fill Cell Configuration
3500 * Function : parseCellCfg
3502 * Functionality: Fill Cell Configuration
3504 * @params[in] XML document pointer
3506 * Current node in XML
3507 * Pointer to structure to be filled
3508 * @return ROK - success
3511 * ****************************************************************/
3512 uint8_t parseCellCfg(xmlDocPtr doc, xmlNsPtr ns, xmlNodePtr cur,CellCfg *cellCfg)
3514 memset(cellCfg, 0, sizeof(CellCfg));
3515 cur = cur -> xmlChildrenNode;
3518 if ((!xmlStrcmp(cur->name, (const xmlChar *)"MAC_OP_STATE")) && (cur->ns == ns))
3520 cellCfg->opState = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
3523 if ((!xmlStrcmp(cur->name, (const xmlChar *)"MAC_ADMIN_STATE")) && (cur->ns == ns))
3525 cellCfg->adminState = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
3528 if ((!xmlStrcmp(cur->name, (const xmlChar *)"MAC_CELL_STATE")) && (cur->ns == ns))
3530 cellCfg->cellState = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
3533 if ((!xmlStrcmp(cur->name, (const xmlChar *)"PLMN_INFO")) && (cur->ns == ns))
3535 if(parsePlmnInfo(doc, ns, cur, &cellCfg->plmnInfoList[0]) != ROK)
3541 if ((!xmlStrcmp(cur->name, (const xmlChar *)"NR_PCI")) && (cur->ns == ns))
3543 cellCfg->phyCellId = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
3546 if ((!xmlStrcmp(cur->name, (const xmlChar *)"TAC")) && (cur->ns == ns))
3548 cellCfg->tac = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
3551 if ((!xmlStrcmp(cur->name, (const xmlChar *)"SSB_FREQUENCY")) && (cur->ns == ns))
3553 cellCfg->ssbFreq = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
3556 if ((!xmlStrcmp(cur->name, (const xmlChar *)"NR_SCS")) && (cur->ns == ns))
3558 cellCfg->subCarrSpacing = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
3561 if ((!xmlStrcmp(cur->name, (const xmlChar *)"DUPLEX_MODE")) && (cur->ns == ns))
3563 cellCfg->dupType = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
3566 if ((!xmlStrcmp(cur->name, (const xmlChar *)"SIB1_CELL_CFG")) && (cur->ns == ns))
3568 if(parseSib1CellCfg(doc, ns, cur, &cellCfg->sib1Cfg) != ROK)
3574 if ((!xmlStrcmp(cur->name, (const xmlChar *)"BWP_DL_CFG")) && (cur->ns == ns))
3576 if(parseBwpDLConfig(doc, ns, cur, &cellCfg->initialDlBwp) != ROK)
3582 if ((!xmlStrcmp(cur->name, (const xmlChar *)"BWP_UL_CFG")) && (cur->ns == ns))
3584 if(parseBwpULConfig(doc, ns, cur, &cellCfg->initialUlBwp) != ROK)
3596 /*******************************************************************
3598 * @brief Fill TDD slot configuration
3602 * Function : parseTddCfg
3604 * Functionality: Fill TDD slot configuration
3606 * @params[in] XML document pointer
3608 * Current node in XML
3609 * Pointer to structure to be filled
3610 * @return ROK - success
3613 * ****************************************************************/
3614 uint8_t parseTddCfg(xmlDocPtr doc, xmlNsPtr ns, xmlNodePtr cur, TDDCfg *tddCfg)
3616 memset(tddCfg, 0, sizeof(TDDCfg));
3617 cur = cur -> xmlChildrenNode;
3620 if ((!xmlStrcmp(cur->name, (const xmlChar *)"TDD_PERIODICITY")) && (cur->ns == ns))
3622 tddCfg->tddPeriod = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
3625 if ((!xmlStrcmp(cur->name, (const xmlChar *)"NUM_DL_SLOTS")) && (cur->ns == ns))
3627 tddCfg->nrOfDlSlots = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
3630 if ((!xmlStrcmp(cur->name, (const xmlChar *)"NUM_DL_SYMBOLS")) && (cur->ns == ns))
3632 tddCfg->nrOfDlSymbols = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
3635 if ((!xmlStrcmp(cur->name, (const xmlChar *)"NUM_UL_SLOTS")) && (cur->ns == ns))
3637 tddCfg->nrOfUlSlots = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
3640 if ((!xmlStrcmp(cur->name, (const xmlChar *)"NUM_UL_SYMBOLS")) && (cur->ns == ns))
3642 tddCfg->nrOfUlSymbols = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
3651 /*******************************************************************
3653 * @brief Fill MAC Cell Configuration
3657 * Function : parseMacCellCfg
3659 * Functionality: Fill MAC Cell Configuration
3661 * @params[in] XML document pointer
3663 * Current node in XML
3664 * Pointer to structure to be filled
3665 * @return ROK - success
3668 * ****************************************************************/
3669 uint8_t parseMacCellCfg(xmlDocPtr doc, xmlNsPtr ns, xmlNodePtr cur,MacCellCfg *macCellCfg)
3671 memset(macCellCfg, 0, sizeof(MacCellCfg));
3672 cur = cur -> xmlChildrenNode;
3675 if ((!xmlStrcmp(cur->name, (const xmlChar *)"CELL_ID")) && (cur->ns == ns))
3677 macCellCfg->cellId = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
3680 if ((!xmlStrcmp(cur->name, (const xmlChar *)"CARRIER_CFG")) && (cur->ns == ns))
3682 if(parseCarrierCfg(doc, ns, cur, &macCellCfg->carrCfg) != ROK)
3688 if ((!xmlStrcmp(cur->name, (const xmlChar *)"CELL_CFG")) && (cur->ns == ns))
3690 if(parseCellCfg(doc, ns, cur, &macCellCfg->cellCfg) != ROK)
3696 if ((!xmlStrcmp(cur->name, (const xmlChar *)"SSB_CFG")) && (cur->ns == ns))
3698 if(parseSsbCfg(doc, ns, cur, &macCellCfg->ssbCfg) != ROK)
3704 if ((!xmlStrcmp(cur->name, (const xmlChar *)"CSIRS_CFG")) && (cur->ns == ns))
3706 if(parseCsiRsCfg(doc, ns, cur, &macCellCfg->csiRsCfg) != ROK)
3712 if ((!xmlStrcmp(cur->name, (const xmlChar *)"PRACH_CFG")) && (cur->ns == ns))
3714 if(parsePrachCfg(doc, ns, cur, &macCellCfg->prachCfg) != ROK)
3721 if ((!xmlStrcmp(cur->name, (const xmlChar *)"TDD_CFG")) && (cur->ns == ns))
3723 if(parseTddCfg(doc, ns, cur, &macCellCfg->tddCfg) != ROK)
3730 if ((!xmlStrcmp(cur->name, (const xmlChar *)"PRE_CODE_CFG")) && (cur->ns == ns))
3732 if(parsePrecodingConfig(doc, ns, cur, &macCellCfg->precodingConf) != ROK)
3738 if ((!xmlStrcmp(cur->name, (const xmlChar *)"BEAM_FORM_CFG")) && (cur->ns == ns))
3740 if(parseBeamformingConfig(doc, ns, cur, &macCellCfg->beamCfg) != ROK)
3751 /*******************************************************************
3753 * @brief Fill PUSCH Configuration Common Time Domain
3754 * Resource Allocation
3758 * Function : parsePuschCmnTimeDomRsrcAlloc
3760 * Functionality: Fill PUSCH Configuration Common Time Domain
3761 * Resource Allocation
3763 * @params[in] XML document pointer
3765 * Current node in XML
3766 * Pointer to structure to be filled
3767 * @return ROK - success
3770 * ****************************************************************/
3771 uint8_t parsePuschCmnTimeDomRsrcAlloc(xmlDocPtr doc, xmlNsPtr ns, xmlNodePtr cur,PuschCfgCmnTimeDomAlloc *puschCmnTimeDomAlloc)
3773 uint16_t startSymbol;
3776 memset(puschCmnTimeDomAlloc, 0, sizeof(PuschCfgCmnTimeDomAlloc));
3777 cur = cur -> xmlChildrenNode;
3780 if ((!xmlStrcmp(cur->name, (const xmlChar *)"K2")) && (cur->ns == ns))
3782 puschCmnTimeDomAlloc->k2 = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
3784 if ((!xmlStrcmp(cur->name, (const xmlChar *)"MAP_TYPE")) && (cur->ns == ns))
3786 puschCmnTimeDomAlloc->mapType = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
3788 if ((!xmlStrcmp(cur->name, (const xmlChar *)"PUSCH_START_SYMBOL")) && (cur->ns == ns))
3790 startSymbol = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
3792 if ((!xmlStrcmp(cur->name, (const xmlChar *)"PUSCH_LENGTH_SYMBOL")) && (cur->ns == ns))
3794 lenSymbol = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
3798 puschCmnTimeDomAlloc->sliv = calcSliv(startSymbol, lenSymbol);
3802 /*******************************************************************
3804 * @brief Fill PUSCH Configuration Common
3808 * Function : parsePuschCfgCommon
3810 * Functionality: Fill PUSCH Configuration Common
3812 * @params[in] XML document pointer
3814 * Current node in XML
3815 * Pointer to structure to be filled
3816 * @return ROK - success
3819 * ****************************************************************/
3820 uint8_t parsePuschCfgCommon(xmlDocPtr doc, xmlNsPtr ns, xmlNodePtr cur,PuschCfgCommon *puschCfgCmn)
3822 uint8_t rsrcIdx = 0;
3823 xmlNodePtr child = NULLP;
3824 xmlNodePtr rsrcNode = NULLP;
3826 memset(puschCfgCmn, 0, sizeof(PuschCfgCommon));
3827 cur = cur -> xmlChildrenNode;
3830 if ((!xmlStrcmp(cur->name, (const xmlChar *)"PUSCH_CFG_PRESENT")) && (cur->ns == ns))
3832 puschCfgCmn->puschCfgPresent = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
3835 if ((!xmlStrcmp(cur->name, (const xmlChar *)"PUSCH_MSG3_DELTA_PREAMBLE")) && (cur->ns == ns))
3837 puschCfgCmn->msg3DeltaPreamble = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
3840 if ((!xmlStrcmp(cur->name, (const xmlChar *)"PUSCH_P0_NOMINAL_WITH_GRANT")) && (cur->ns == ns))
3842 puschCfgCmn->p0NominalWithGrant = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
3845 if ((!xmlStrcmp(cur->name, (const xmlChar *)"NUM_TIME_DOM_RSRC_ALLOC")) && (cur->ns == ns))
3847 puschCfgCmn->numTimeDomRsrcAlloc = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
3850 if ((!xmlStrcmp(cur->name, (const xmlChar *)"PUSCH_TIME_DOM_RSRC_ALLOC_LIST")) && (cur->ns == ns))
3852 child = cur->xmlChildrenNode;
3853 while (child != NULL)
3855 if ((!xmlStrcmp(child->name, (const xmlChar *)"LIST")) && (child->ns == ns))
3857 rsrcNode = child->xmlChildrenNode;
3858 while (rsrcNode != NULL)
3860 if ((!xmlStrcmp(rsrcNode->name, (const xmlChar *)"PUSCH_TIME_DOM_RSRC_ALLOC")) \
3861 && (rsrcNode->ns == ns))
3863 if(parsePuschCmnTimeDomRsrcAlloc(doc, ns, rsrcNode, &puschCfgCmn->timeDomAllocList[rsrcIdx]) != ROK)
3869 rsrcNode = rsrcNode->next;
3872 child = child->next;
3880 /*******************************************************************
3882 * @brief Fill PUCCH Configuration Common
3886 * Function : parsePucchCfgCommon
3888 * Functionality: Fill PUCCH Configuration Common
3890 * @params[in] XML document pointer
3892 * Current node in XML
3893 * Pointer to structure to be filled
3894 * @return ROK - success
3897 * ****************************************************************/
3898 uint8_t parsePucchCfgCommon(xmlDocPtr doc, xmlNsPtr ns, xmlNodePtr cur,PucchCfgCommon *pucchCfgCmn)
3900 memset(pucchCfgCmn, 0, sizeof(PucchCfgCommon));
3901 cur = cur -> xmlChildrenNode;
3904 if ((!xmlStrcmp(cur->name, (const xmlChar *)"PRESENT")) && (cur->ns == ns))
3906 pucchCfgCmn->present = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
3909 if ((!xmlStrcmp(cur->name, (const xmlChar *)"PUCCH_RSRC_COMMON")) && (cur->ns == ns))
3911 pucchCfgCmn->rsrcComm = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
3914 if ((!xmlStrcmp(cur->name, (const xmlChar *)"GRP_HOP")) && (cur->ns == ns))
3916 pucchCfgCmn->grpHop = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
3919 if ((!xmlStrcmp(cur->name, (const xmlChar *)"PUCCH_P0_NOMINAL")) && (cur->ns == ns))
3921 pucchCfgCmn->p0Nominal = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
3929 /*******************************************************************
3931 * @brief Fill RACH Configuration Common
3935 * Function : parseRachCfgCommon
3937 * Functionality: Fill RACH Configuration Common
3939 * @params[in] XML document pointer
3941 * Current node in XML
3942 * Pointer to structure to be filled
3943 * @return ROK - success
3946 * ****************************************************************/
3947 uint8_t parseRachCfgCommon(xmlDocPtr doc, xmlNsPtr ns, xmlNodePtr cur, RachCfgCommon *rachCfgCmn)
3952 memset(rachCfgCmn, 0, sizeof(RachCfgCommon));
3953 cur = cur -> xmlChildrenNode;
3956 if ((!xmlStrcmp(cur->name, (const xmlChar *)"PRESENT")) && (cur->ns == ns))
3958 rachCfgCmn->present = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
3961 if ((!xmlStrcmp(cur->name, (const xmlChar *)"PRACH_CONFIG_IDX")) && (cur->ns == ns))
3963 rachCfgCmn->prachCfgIdx = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
3966 if ((!xmlStrcmp(cur->name, (const xmlChar *)"MSG_1_FDM")) && (cur->ns == ns))
3968 rachCfgCmn->msg1Fdm = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
3971 if ((!xmlStrcmp(cur->name, (const xmlChar *)"MAX_NUM_RB")) && (cur->ns == ns))
3973 maxNumRb = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
3975 if ((!xmlStrcmp(cur->name, (const xmlChar *)"PRACH_MAX_PRB")) && (cur->ns == ns))
3977 prachMaxPrb = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
3980 if ((!xmlStrcmp(cur->name, (const xmlChar *)"ZERO_CORRELATION_ZONE_CFG")) && (cur->ns == ns))
3982 rachCfgCmn->zeroCorrZoneCfg = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
3985 if ((!xmlStrcmp(cur->name, (const xmlChar *)"PRACH_PREAMBLE_RCVD_TGT_PWR")) && (cur->ns == ns))
3987 rachCfgCmn->preambleRcvdTgtPwr = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
3990 if ((!xmlStrcmp(cur->name, (const xmlChar *)"PREAMBLE_TRANS_MAX")) && (cur->ns == ns))
3992 rachCfgCmn->preambleTransMax = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
3995 if ((!xmlStrcmp(cur->name, (const xmlChar *)"PWR_RAMPING_STEP")) && (cur->ns == ns))
3997 rachCfgCmn->pwrRampingStep = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
4000 if ((!xmlStrcmp(cur->name, (const xmlChar *)"RA_RSP_WINDOW")) && (cur->ns == ns))
4002 rachCfgCmn->raRspWindow = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
4005 if ((!xmlStrcmp(cur->name, (const xmlChar *)"NUM_RA_PREAMBLE")) && (cur->ns == ns))
4007 rachCfgCmn->numRaPreamble = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
4010 if ((!xmlStrcmp(cur->name, (const xmlChar *)"NUM_SSB_PER_RACH_OCC")) && (cur->ns == ns))
4012 rachCfgCmn->numSsbPerRachOcc = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
4015 if ((!xmlStrcmp(cur->name, (const xmlChar *)"CB_PREAMBLE_PER_SSB")) && (cur->ns == ns))
4017 rachCfgCmn->numCbPreamblePerSsb = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
4020 if ((!xmlStrcmp(cur->name, (const xmlChar *)"CONT_RES_TIMER")) && (cur->ns == ns))
4022 rachCfgCmn->contResTimer = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
4025 if ((!xmlStrcmp(cur->name, (const xmlChar *)"RSRP_THRESHOLD_SSB")) && (cur->ns == ns))
4027 rachCfgCmn->rsrpThreshSsb = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
4030 if ((!xmlStrcmp(cur->name, (const xmlChar *)"ROOT_SEQ_IDX_PRESENT")) && (cur->ns == ns))
4032 rachCfgCmn->rootSeqIdxPresent = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
4035 if ((!xmlStrcmp(cur->name, (const xmlChar *)"ROOT_SEQ_IDX")) && (cur->ns == ns))
4037 rachCfgCmn->rootSeqIdx = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
4040 if ((!xmlStrcmp(cur->name, (const xmlChar *)"PRACH_SUBCARRIER_SPACING")) && (cur->ns == ns))
4042 rachCfgCmn->msg1Scs = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
4045 if ((!xmlStrcmp(cur->name, (const xmlChar *)"PRACH_RESTRICTED_SET_CFG")) && (cur->ns== ns))
4047 rachCfgCmn->restrictedSetCfg = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
4053 rachCfgCmn->msg1FreqStart = ((maxNumRb) - (prachMaxPrb));
4057 /*******************************************************************
4059 * @brief Fill SCS Specific Carrier
4063 * Function : parseScsSpecCarrier
4065 * Functionality: Fill SCS Specific Carrier
4067 * @params[in] XML document pointer
4069 * Current node in XML
4070 * Pointer to structure to be filled
4071 * @return ROK - success
4074 * ****************************************************************/
4075 uint8_t parseScsSpecCarrier(xmlDocPtr doc, xmlNsPtr ns, xmlNodePtr cur,ScsSpecCarrier *scsSpecCrr)
4077 memset(scsSpecCrr, 0, sizeof(ScsSpecCarrier));
4078 cur = cur -> xmlChildrenNode;
4081 if ((!xmlStrcmp(cur->name, (const xmlChar *)"SSB_SUBCARRIER_OFFSET")) && (cur->ns == ns))
4083 scsSpecCrr->scsOffset = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
4086 if ((!xmlStrcmp(cur->name, (const xmlChar *)"NR_SCS")) && (cur->ns == ns))
4088 scsSpecCrr->scs = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
4091 if ((!xmlStrcmp(cur->name, (const xmlChar *)"SCS_BW")) && (cur->ns == ns))
4093 scsSpecCrr->scsBw = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
4100 /*******************************************************************
4102 * @brief Fill UL Config Common
4106 * Function : parseUlCfgCommon
4108 * Functionality: Fill UL Config Common
4110 * @params[in] XML document pointer
4112 * Current node in XML
4113 * Pointer to structure to be filled
4114 * @return ROK - success
4117 * ****************************************************************/
4118 uint8_t parseUlCfgCommon(xmlDocPtr doc, xmlNsPtr ns, xmlNodePtr cur,UlCfgCommon *ulCfgCmn)
4120 memset(ulCfgCmn, 0, sizeof(UlCfgCommon));
4121 cur = cur -> xmlChildrenNode;
4124 if ((!xmlStrcmp(cur->name, (const xmlChar *)"NR_FREQ_BAND")) && (cur->ns == ns))
4126 ulCfgCmn->freqBandInd = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
4129 if ((!xmlStrcmp(cur->name, (const xmlChar *)"UL_P_MAX")) && (cur->ns == ns))
4131 ulCfgCmn->pMax = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
4134 if ((!xmlStrcmp(cur->name, (const xmlChar *)"FREQ_LOC_BW")) && (cur->ns == ns))
4136 ulCfgCmn->locAndBw = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
4139 if ((!xmlStrcmp(cur->name, (const xmlChar *)"TIME_ALLIGN_TIMER_COMM")) && (cur->ns == ns))
4141 ulCfgCmn->timeAlignTimerComm = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
4144 if ((!xmlStrcmp(cur->name, (const xmlChar *)"SCS_SPEC_CARRIER")) && (cur->ns == ns))
4146 if(parseScsSpecCarrier(doc, ns, cur, &ulCfgCmn->ulScsCarrier) != ROK)
4152 if ((!xmlStrcmp(cur->name, (const xmlChar *)"RACH_CFG_COMMON")) && (cur->ns == ns))
4154 if(parseRachCfgCommon(doc, ns, cur, &ulCfgCmn->rachCfg) != ROK)
4160 if ((!xmlStrcmp(cur->name, (const xmlChar *)"PUSCH_CFG_COMMON")) && (cur->ns == ns))
4162 if(parsePuschCfgCommon(doc, ns, cur, &ulCfgCmn->puschCfg) != ROK)
4168 if ((!xmlStrcmp(cur->name, (const xmlChar *)"PUCCH_CFG_COMMON")) && (cur->ns == ns))
4170 if(parsePucchCfgCommon(doc, ns, cur, &ulCfgCmn->pucchCfg) != ROK)
4181 /*******************************************************************
4183 * @brief Fill TDD UL DL Configuration Common
4187 * Function : parseTddUlDlCfgCommon
4189 * Functionality: Fill TDD UL DL Configuration Common
4191 * @params[in] XML document pointer
4193 * Current node in XML
4194 * Pointer to structure to be filled
4195 * @return ROK - success
4198 * ****************************************************************/
4199 uint8_t parseTddUlDlCfgCommon(xmlDocPtr doc, xmlNsPtr ns, xmlNodePtr cur, TddUlDlCfgCommon *tddUlDlCfgCmn)
4201 memset(tddUlDlCfgCmn, 0, sizeof(TddUlDlCfgCommon));
4202 cur = cur -> xmlChildrenNode;
4205 if ((!xmlStrcmp(cur->name, (const xmlChar *)"REF_SCS")) && (cur->ns == ns))
4207 tddUlDlCfgCmn->refScs = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
4210 if ((!xmlStrcmp(cur->name, (const xmlChar *)"TX_PRD")) && (cur->ns == ns))
4212 tddUlDlCfgCmn->txPrd = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
4215 if ((!xmlStrcmp(cur->name, (const xmlChar *)"NUM_DL_SLOTS")) && (cur->ns == ns))
4217 tddUlDlCfgCmn->numDlSlots = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
4220 if ((!xmlStrcmp(cur->name, (const xmlChar *)"NUM_DL_SYMBOLS")) && (cur->ns == ns))
4222 tddUlDlCfgCmn->numDlSymbols = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
4225 if ((!xmlStrcmp(cur->name, (const xmlChar *)"NUM_UL_SLOTS")) && (cur->ns == ns))
4227 tddUlDlCfgCmn->numUlSlots = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
4230 if ((!xmlStrcmp(cur->name, (const xmlChar *)"NUM_UL_SYMBOLS")) && (cur->ns == ns))
4232 tddUlDlCfgCmn->numUlSymbols = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
4240 /*******************************************************************
4242 * @brief Fill PCCH Configuration
4246 * Function : parsePcchCfg
4248 * Functionality: Fill PCCH Configuration
4250 * @params[in] XML document pointer
4252 * Current node in XML
4253 * Pointer to structure to be filled
4254 * @return ROK - success
4257 * ****************************************************************/
4258 uint8_t parsePcchCfg(xmlDocPtr doc, xmlNsPtr ns, xmlNodePtr cur,PcchCfg *pcchCfg)
4260 xmlNodePtr child = NULLP;
4261 xmlNodePtr firstPdcchNode = NULLP;
4264 memset(pcchCfg, 0, sizeof(PcchCfg));
4265 cur = cur -> xmlChildrenNode;
4268 if ((!xmlStrcmp(cur->name, (const xmlChar *)"DFLT_PAGING_CYCLE")) && (cur->ns == ns))
4270 pcchCfg->dfltPagingCycle = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
4273 if ((!xmlStrcmp(cur->name, (const xmlChar *)"NAND_PAGING_FRM_OFFSET")) && (cur->ns == ns))
4275 pcchCfg->nAndPagingFrmOffsetType = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
4278 if ((!xmlStrcmp(cur->name, (const xmlChar *)"PAGE_FRM_OFFSET")) && (cur->ns == ns))
4280 pcchCfg->pageFrameOffset = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
4283 if ((!xmlStrcmp(cur->name, (const xmlChar *)"NS")) && (cur->ns == ns))
4285 pcchCfg->ns = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
4288 if ((!xmlStrcmp(cur->name, (const xmlChar *)"FIRST_PDCCH_MONITORING_TYPE")) && (cur->ns == ns))
4290 pcchCfg->firstPDCCHMontioringType = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
4293 if ((!xmlStrcmp(cur->name, (const xmlChar *)"LIST")) && (cur->ns == ns))
4295 child = cur->xmlChildrenNode;
4296 while(child != NULL)
4298 if ((!xmlStrcmp(child->name, (const xmlChar *)"FIRST_PDCCH_LIST")) && (child->ns == ns))
4300 firstPdcchNode = child->xmlChildrenNode;
4301 while (firstPdcchNode != NULL)
4303 if ((!xmlStrcmp(firstPdcchNode->name, (const xmlChar *)"FIRST_PDCCH_MONITORING_INFO")) && (firstPdcchNode->ns == ns))
4305 pcchCfg->firstPDCCHMontioringInfo[idx] = atoi((char *)xmlNodeListGetString(doc, firstPdcchNode->xmlChildrenNode, 1));
4308 firstPdcchNode = firstPdcchNode->next;
4311 child = child -> next;
4319 /*******************************************************************
4321 * @brief Fill PDSCH Time Domain Resource Allocation
4325 * Function : parsePdschTimeDomRsrcAlloc
4327 * Functionality: Fill PDSCH Time Domain Resource Allocation
4329 * @params[in] XML document pointer
4331 * Current node in XML
4332 * Pointer to structure to be filled
4333 * @return ROK - success
4336 * ****************************************************************/
4337 uint8_t parsePdschTimeDomRsrcAlloc(xmlDocPtr doc, xmlNsPtr ns, xmlNodePtr cur,PdschTimeDomainRsrcAlloc *pdschTimeDomRsrcAlloc)
4339 uint16_t startSymbol;
4342 memset(pdschTimeDomRsrcAlloc, 0, sizeof(PdschTimeDomainRsrcAlloc));
4343 cur = cur -> xmlChildrenNode;
4346 if ((!xmlStrcmp(cur->name, (const xmlChar *)"K0")) && (cur->ns == ns))
4348 pdschTimeDomRsrcAlloc->k0 = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
4351 if ((!xmlStrcmp(cur->name, (const xmlChar *)"MAP_TYPE")) && (cur->ns == ns))
4353 pdschTimeDomRsrcAlloc->mapType = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
4356 if ((!xmlStrcmp(cur->name, (const xmlChar *)"PDSCH_START_SYMBOL")) && (cur->ns == ns))
4358 startSymbol = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
4361 if ((!xmlStrcmp(cur->name, (const xmlChar *)"PDSCH_LENGTH_SYMBOL")) && (cur->ns == ns))
4363 lenSymbol = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
4368 pdschTimeDomRsrcAlloc->sliv = calcSliv(startSymbol, lenSymbol);
4372 /*******************************************************************
4374 * @brief Fill PDSCH Configuration Common
4378 * Function : parsePdschCfgCommon
4380 * Functionality: Fill PDSCH Configuration Common
4382 * @params[in] XML document pointer
4384 * Current node in XML
4385 * Pointer to structure to be filled
4386 * @return ROK - success
4389 * ****************************************************************/
4390 uint8_t parsePdschCfgCommon(xmlDocPtr doc, xmlNsPtr ns, xmlNodePtr cur,PdschCfgCommon *pdschCfgCmn)
4393 xmlNodePtr child = NULLP;
4394 xmlNodePtr listChild = NULLP;
4396 memset(pdschCfgCmn, 0, sizeof(PdschCfgCommon));
4397 cur = cur -> xmlChildrenNode;
4400 if ((!xmlStrcmp(cur->name, (const xmlChar *)"PRESENT")) && (cur->ns == ns))
4402 pdschCfgCmn->present = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
4405 if ((!xmlStrcmp(cur->name, (const xmlChar *)"NUM_TIME_DOM_RSRS_ALLOC")) && (cur->ns == ns))
4407 pdschCfgCmn->numTimeDomRsrcAlloc = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
4410 if ((!xmlStrcmp(cur->name, (const xmlChar *)"PDSCH_TIME_DOM_RSRC_ALLOC_LIST")) && (cur->ns == ns))
4412 child = cur->xmlChildrenNode;
4413 while (child != NULL)
4415 if ((!xmlStrcmp(child->name, (const xmlChar *)"LIST")) && (child->ns == ns))
4417 listChild = child->xmlChildrenNode;
4418 while (listChild != NULL)
4420 if ((!xmlStrcmp(listChild->name, (const xmlChar *)"PDSCH_TIME_DOM_RSRC_ALLOC")) && (listChild->ns == ns))
4422 if(parsePdschTimeDomRsrcAlloc(doc, ns, listChild, &pdschCfgCmn->timeDomAlloc[idx]) != ROK)
4428 listChild = listChild->next;
4431 child = child->next;
4439 /*******************************************************************
4441 * @brief Fill BCCH Configuration
4445 * Function : parseBcchCfg
4447 * Functionality: Fill BCCH Configuration
4449 * @params[in] XML document pointer
4451 * Current node in XML
4452 * Pointer to structure to be filled
4453 * @return ROK - success
4456 * ****************************************************************/
4457 uint8_t parseBcchCfg(xmlDocPtr doc, xmlNsPtr ns, xmlNodePtr cur, BcchCfg *bcchCfg)
4459 memset(bcchCfg, 0, sizeof(BcchCfg));
4460 cur = cur -> xmlChildrenNode;
4463 if ((!xmlStrcmp(cur->name, (const xmlChar *)"MOB_PRD_COEFF")) && (cur->ns == ns))
4465 bcchCfg->modPrdCoeff = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
4472 /*******************************************************************
4474 * @brief Fill PDCCH Configuration Common
4478 * Function : parsePdcchConfigCommon
4480 * Functionality: Fill PDCCH Configuration Common
4482 * @params[in] XML document pointer
4484 * Current node in XML
4485 * Pointer to structure to be filled
4486 * @return ROK - success
4489 * ****************************************************************/
4490 uint8_t parsePdcchConfigCommon(xmlDocPtr doc, xmlNsPtr ns, xmlNodePtr cur, PdcchCfgCommon *pdccgCfgCmn)
4493 xmlNodePtr child = NULLP;
4494 xmlNodePtr listChild = NULLP;
4496 memset(pdccgCfgCmn, 0, sizeof( PdcchCfgCommon));
4497 cur = cur -> xmlChildrenNode;
4500 if ((!xmlStrcmp(cur->name, (const xmlChar *)"PRESENT")) && (cur->ns == ns))
4502 pdccgCfgCmn->present = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
4505 if ((!xmlStrcmp(cur->name, (const xmlChar *)"CORESET_0_INDEX")) && (cur->ns == ns))
4507 pdccgCfgCmn->ctrlRsrcSetZero = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
4510 if ((!xmlStrcmp(cur->name, (const xmlChar *)"SEARCHSPACE_0_INDEX")) && (cur->ns == ns))
4512 pdccgCfgCmn->searchSpcZero = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
4515 if ((!xmlStrcmp(cur->name, (const xmlChar *)"PDCCH_SEARCH_SPACE_ID")) && (cur->ns == ns))
4517 pdccgCfgCmn->searchSpcId = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
4520 if ((!xmlStrcmp(cur->name, (const xmlChar *)"PDCCH_CTRL_RSRC_SET_ID")) && (cur->ns == ns))
4522 pdccgCfgCmn->ctrlRsrcSetId = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
4525 if ((!xmlStrcmp(cur->name, (const xmlChar *)"MONITOR_SLOT_PRD_OFFPRESENT")) && (cur->ns == ns))
4527 pdccgCfgCmn->monitorSlotPrdAndOffPresent = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
4530 if ((!xmlStrcmp(cur->name, (const xmlChar *)"LIST")) && (cur->ns == ns))
4532 child = cur->xmlChildrenNode;
4535 if ((!xmlStrcmp(child->name, (const xmlChar *)"MONITOR_LIST")) && (child->ns == ns))
4537 listChild = child->xmlChildrenNode;
4538 while (listChild != NULL)
4540 if ((!xmlStrcmp(listChild->name, (const xmlChar *)"MONITOR_SYMBOL_INSLOT")) && (listChild->ns == ns))
4542 pdccgCfgCmn->monitorSymbolsInSlot[idx] = atoi((char *)xmlNodeListGetString(doc, listChild->xmlChildrenNode, 1));
4545 listChild = listChild->next;
4548 child = child->next;
4552 if ((!xmlStrcmp(cur->name, (const xmlChar *)"NUMC_AGG_LVL1")) && (cur->ns == ns))
4554 pdccgCfgCmn->numCandAggLvl1 = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
4557 if ((!xmlStrcmp(cur->name, (const xmlChar *)"NUMC_AGG_LVL2")) && (cur->ns == ns))
4559 pdccgCfgCmn->numCandAggLvl2 = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
4562 if ((!xmlStrcmp(cur->name, (const xmlChar *)"NUMC_AGG_LVL4")) && (cur->ns == ns))
4564 pdccgCfgCmn->numCandAggLvl4 = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
4567 if ((!xmlStrcmp(cur->name, (const xmlChar *)"NUMC_AGG_LVL8")) && (cur->ns == ns))
4569 pdccgCfgCmn->numCandAggLvl8 = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
4572 if ((!xmlStrcmp(cur->name, (const xmlChar *)"NUMC_AGG_LVL16")) && (cur->ns == ns))
4574 pdccgCfgCmn->numCandAggLvl16 = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
4577 if ((!xmlStrcmp(cur->name, (const xmlChar *)"SEARCH_SPC_TYPE")) && (cur->ns == ns))
4579 pdccgCfgCmn->searchSpcType = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
4582 if ((!xmlStrcmp(cur->name, (const xmlChar *)"PDCCH_SERACH_SPACE_DCI_FORMAT")) && (cur->ns == ns))
4584 pdccgCfgCmn->commSrchSpcDciFrmt = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
4587 if ((!xmlStrcmp(cur->name, (const xmlChar *)"PDCCH_SEARCH_SPACE_ID_SIB1")) && (cur->ns == ns))
4589 pdccgCfgCmn->searchSpcSib1 = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
4592 if ((!xmlStrcmp(cur->name, (const xmlChar *)"PDCCH_SEARCH_SPACE_ID_PAGING")) && (cur->ns == ns))
4594 pdccgCfgCmn->pagingSearchSpc = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
4597 if ((!xmlStrcmp(cur->name, (const xmlChar *)"RA_PDCCH_SEARCH_SPACE_ID_PAGING")) && (cur->ns == ns))
4599 pdccgCfgCmn->raSearchSpc = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
4607 /*******************************************************************
4609 * @brief Fill DL Configuration Common
4613 * Function : parseDlCfgCommon
4615 * Functionality: Fill DL Configuration Common
4617 * @params[in] XML document pointer
4619 * Current node in XML
4620 * Pointer to structure to be filled
4621 * @return ROK - success
4624 * ****************************************************************/
4625 uint8_t parseDlCfgCommon(xmlDocPtr doc, xmlNsPtr ns, xmlNodePtr cur,DlCfgCommon *dlCfgCmn)
4627 memset(dlCfgCmn, 0, sizeof(DlCfgCommon));
4628 cur = cur -> xmlChildrenNode;
4631 if ((!xmlStrcmp(cur->name, (const xmlChar *)"NR_FREQ_BAND")) && (cur->ns == ns))
4633 dlCfgCmn->freqBandInd = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
4636 if ((!xmlStrcmp(cur->name, (const xmlChar *)"OFFSET_TO_POINT_A")) && (cur->ns == ns))
4638 dlCfgCmn->offsetToPointA = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
4641 if ((!xmlStrcmp(cur->name, (const xmlChar *)"FREQ_LOC_BW")) && (cur->ns == ns))
4643 dlCfgCmn->locAndBw = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
4646 if ((!xmlStrcmp(cur->name, (const xmlChar *)"SCS_SPEC_CARRIER")) && (cur->ns == ns))
4648 if(parseScsSpecCarrier(doc, ns, cur, &dlCfgCmn->dlScsCarrier) != ROK)
4654 if ((!xmlStrcmp(cur->name, (const xmlChar *)"PDCCH_CFG_COMMON")) && (cur->ns == ns))
4656 if(parsePdcchConfigCommon(doc, ns, cur, &dlCfgCmn->pdcchCfg) != ROK)
4662 if ((!xmlStrcmp(cur->name, (const xmlChar *)"PDSCH_CFG_COMMON")) && (cur->ns == ns))
4664 if(parsePdschCfgCommon(doc, ns, cur, &dlCfgCmn->pdschCfg) != ROK)
4670 if ((!xmlStrcmp(cur->name, (const xmlChar *)"BCCH_CFG")) && (cur->ns == ns))
4672 if(parseBcchCfg(doc, ns, cur, &dlCfgCmn->bcchCfg) != ROK)
4678 if ((!xmlStrcmp(cur->name, (const xmlChar *)"PCCH_CFG")) && (cur->ns == ns))
4680 if(parsePcchCfg(doc, ns, cur, &dlCfgCmn->pcchCfg) != ROK)
4690 /*******************************************************************
4692 * @brief Fill Serving Cell Config Common SIB
4696 * Function : parseSrvCellCfgCmnSib
4698 * Functionality: Fill Serving Cell Config Common SIB
4700 * @params[in] XML document pointer
4702 * Current node in XML
4703 * Pointer to structure to be filled
4704 * @return ROK - success
4707 * ****************************************************************/
4708 uint8_t parseSrvCellCfgCmnSib(xmlDocPtr doc, xmlNsPtr ns, xmlNodePtr cur,SrvCellCfgCommSib *srvCellCfgCmnSib)
4710 memset(srvCellCfgCmnSib, 0, sizeof(SrvCellCfgCommSib));
4711 cur = cur -> xmlChildrenNode;
4714 if ((!xmlStrcmp(cur->name, (const xmlChar *)"NR_SCS")) && (cur->ns == ns))
4716 srvCellCfgCmnSib->scs = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
4719 if ((!xmlStrcmp(cur->name, (const xmlChar *)"SSB_POS_INBURST")) && (cur->ns == ns))
4721 srvCellCfgCmnSib->ssbPosInBurst = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
4724 if ((!xmlStrcmp(cur->name, (const xmlChar *)"SSB_PERIODICITY")) && (cur->ns == ns))
4726 srvCellCfgCmnSib->ssbPrdServingCell = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
4729 if ((!xmlStrcmp(cur->name, (const xmlChar *)"SSB_PBCH_PWR")) && (cur->ns == ns))
4731 srvCellCfgCmnSib->ssPbchBlockPwr = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
4734 if ((!xmlStrcmp(cur->name, (const xmlChar *)"DL_CFG_COMMON")) && (cur->ns == ns))
4736 if(parseDlCfgCommon(doc, ns, cur, &srvCellCfgCmnSib->dlCfg) != ROK)
4742 if ((!xmlStrcmp(cur->name, (const xmlChar *)"UL_CFG_COMMON")) && (cur->ns == ns))
4744 if(parseUlCfgCommon(doc, ns, cur, &srvCellCfgCmnSib->ulCfg) != ROK)
4750 if ((!xmlStrcmp(cur->name, (const xmlChar *)"TDD_UL_DL_CFG_COMMON")) && (cur->ns == ns))
4752 if(parseTddUlDlCfgCommon(doc, ns, cur, &srvCellCfgCmnSib->tddCfg) != ROK)
4763 /*******************************************************************
4765 * @brief Fill SI Scheduling Information
4769 * Function : parseSiSchedInfo
4771 * Functionality: Fill SI Scheduling Information
4773 * @params[in] XML document pointer
4775 * Current node in XML
4776 * Pointer to structure to be filled
4777 * @return ROK - success
4780 * ****************************************************************/
4781 uint8_t parseSiSchedInfo(xmlDocPtr doc, xmlNsPtr ns, xmlNodePtr cur,SiSchedInfo *siSchedInfo)
4783 memset(siSchedInfo, 0, sizeof(SiSchedInfo));
4784 cur = cur -> xmlChildrenNode;
4787 if ((!xmlStrcmp(cur->name, (const xmlChar *)"WIN_LEN")) && (cur->ns == ns))
4789 siSchedInfo->winLen = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
4792 if ((!xmlStrcmp(cur->name, (const xmlChar *)"BROADCAST_STA")) && (cur->ns == ns))
4794 siSchedInfo->broadcastSta = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
4797 if ((!xmlStrcmp(cur->name, (const xmlChar *)"PERIODICITY")) && (cur->ns == ns))
4799 siSchedInfo->preiodicity = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
4802 if ((!xmlStrcmp(cur->name, (const xmlChar *)"SIB_TYPE")) && (cur->ns == ns))
4804 siSchedInfo->sibType = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
4807 if ((!xmlStrcmp(cur->name, (const xmlChar *)"SIB1_VAL_TAG")) && (cur->ns == ns))
4809 siSchedInfo->sibValTag = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
4817 /*******************************************************************
4819 * @brief Fill SIB1 Parameters
4823 * Function : parseSib1Params
4825 * Functionality: Fill SIB1 Parameters
4827 * @params[in] XML document pointer
4829 * Current node in XML
4830 * Pointer to structure to be filled
4831 * @return ROK - success
4834 * ****************************************************************/
4835 uint8_t parseSib1Params(xmlDocPtr doc, xmlNsPtr ns, xmlNodePtr cur,Sib1Params *sib1Params)
4837 memset(sib1Params, 0, sizeof(Sib1Params));
4838 cur = cur -> xmlChildrenNode;
4841 if ((!xmlStrcmp(cur->name, (const xmlChar *)"PLMN")) && (cur->ns == ns))
4843 if(parsePlmn(doc, ns, cur, &sib1Params->plmn) != ROK)
4849 if ((!xmlStrcmp(cur->name, (const xmlChar *)"TAC")) && (cur->ns == ns))
4851 sib1Params-> tac = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
4854 if ((!xmlStrcmp(cur->name, (const xmlChar *)"RANAC")) && (cur->ns == ns))
4856 sib1Params->ranac = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
4859 if ((!xmlStrcmp(cur->name, (const xmlChar *)"CELL_IDENTITY")) && (cur->ns == ns))
4861 sib1Params->cellIdentity = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
4864 if ((!xmlStrcmp(cur->name, (const xmlChar *)"CELL_RESVD_OPUSE")) && (cur->ns == ns))
4866 sib1Params->cellResvdForOpUse = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
4869 if ((!xmlStrcmp(cur->name, (const xmlChar *)"CONN_EST_FAIL_CNT")) && (cur->ns == ns))
4871 sib1Params->connEstFailCnt = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
4874 if ((!xmlStrcmp(cur->name, (const xmlChar *)"CONN_EST_FAIL_OFF_VALID")) && (cur->ns == ns))
4876 sib1Params->connEstFailOffValidity = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
4879 if ((!xmlStrcmp(cur->name, (const xmlChar *)"CONN_EST_FAIL_OFFSET")) && (cur->ns == ns))
4881 sib1Params->connEstFailOffset = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
4884 if ((!xmlStrcmp(cur->name, (const xmlChar *)"SI_SHED_INFO")) && (cur->ns == ns))
4886 if(parseSiSchedInfo(doc, ns, cur, &sib1Params->siSchedInfo) != ROK)
4892 if ((!xmlStrcmp(cur->name, (const xmlChar *)"SRV_CELLCFG_COM_SIB")) && (cur->ns == ns))
4894 if(parseSrvCellCfgCmnSib(doc, ns, cur, &sib1Params->srvCellCfgCommSib) != ROK)
4907 /*******************************************************************
4909 * @brief Fill RRM Policy List
4913 * Function : parseRrmPolicyList
4915 * Functionality: Fill RRM Policy List
4917 * @params[in] XML document pointer
4919 * Current node in XML
4920 * Pointer to structure to be filled
4921 * @return ROK - success
4924 * ****************************************************************/
4925 uint8_t parseRrmPolicyList(xmlDocPtr doc, xmlNsPtr ns, xmlNodePtr cur,RrmPolicyMemberList *rrmPolicyMemberList)
4927 memset(rrmPolicyMemberList, 0, sizeof(RrmPolicyMemberList));
4928 cur = cur->xmlChildrenNode;
4931 if ((!xmlStrcmp(cur->name, (const xmlChar *)"PLMN")) && (cur->ns == ns))
4933 if(parsePlmn(doc, ns, cur, &rrmPolicyMemberList->plmn) != ROK)
4939 if ((!xmlStrcmp(cur->name, (const xmlChar *)"SNSSAI")) && (cur->ns == ns))
4941 if(parseSnssai(doc, ns, cur, &rrmPolicyMemberList->snssai) != ROK)
4952 /*******************************************************************
4954 * @brief Fill RRM Policy Ratio
4958 * Function : parseRrmPolicyRatio
4960 * Functionality: Fill RRM Policy Ratio
4962 * @params[in] XML document pointer
4964 * Current node in XML
4965 * Pointer to structure to be filled
4966 * @return ROK - success
4969 * ****************************************************************/
4970 uint8_t parseRrmPolicyRatio(xmlDocPtr doc, xmlNsPtr ns, xmlNodePtr cur, RrmPolicyRatio *rrmPolicyRatio)
4972 memset(rrmPolicyRatio, 0, sizeof(RrmPolicyRatio));
4973 cur = cur -> xmlChildrenNode;
4976 if ((!xmlStrcmp(cur->name, (const xmlChar *)"MAX_RATIO")) && (cur->ns == ns))
4978 rrmPolicyRatio->maxRatio = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
4981 if ((!xmlStrcmp(cur->name, (const xmlChar *)"MIN_RATIO")) && (cur->ns == ns))
4983 rrmPolicyRatio->minRatio = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
4986 if ((!xmlStrcmp(cur->name, (const xmlChar *)"DEDICATED_RATIO")) && (cur->ns == ns))
4988 rrmPolicyRatio->dedicatedRatio = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
4996 /*******************************************************************
4998 * @brief Fill MAC Slice RRM Policy
5002 * Function : parseMacSliceRrmPolicy
5004 * Functionality: Fill MAC Slice RRM Policy
5006 * @params[in] XML document pointer
5008 * Current node in XML
5009 * Pointer to structure to be filled
5010 * @return ROK - success
5013 * ****************************************************************/
5014 uint8_t parseMacSliceRrmPolicy(xmlDocPtr doc, xmlNsPtr ns, xmlNodePtr cur, MacSliceRrmPolicy *rrmPolicy)
5018 memset(rrmPolicy, 0, sizeof(MacSliceRrmPolicy));
5019 cur = cur -> xmlChildrenNode;
5022 if ((!xmlStrcmp(cur->name, (const xmlChar *)"RESOURCE_TYPE")) && (cur->ns == ns))
5024 rrmPolicy->resourceType = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
5027 if ((!xmlStrcmp(cur->name, (const xmlChar *)"NUM_RRM_POLICY_MEMBER")) && (cur->ns == ns))
5029 rrmPolicy->numOfRrmPolicyMem = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
5032 if ((!xmlStrcmp(cur->name, (const xmlChar *)"RRM_POLICY_MEMBER_LIST")) && (cur->ns == ns))
5034 DU_ALLOC_SHRABL_BUF(rrmPolicy->rRMPolicyMemberList,\
5035 rrmPolicy->numOfRrmPolicyMem * sizeof(RrmPolicyMemberList*));
5037 if(!rrmPolicy->rRMPolicyMemberList)
5039 DU_LOG("\nERROR --> DU APP : %s: Memory allocation failed at line %d", __func__, __LINE__);
5043 for(memIdx = 0; memIdx < rrmPolicy->numOfRrmPolicyMem; memIdx++)
5045 DU_ALLOC_SHRABL_BUF(rrmPolicy->rRMPolicyMemberList[memIdx], sizeof(RrmPolicyMemberList));
5046 if (rrmPolicy->rRMPolicyMemberList[memIdx] == NULLP)
5048 DU_LOG("\nERROR --> DU_APP: %s: Memory allocation failed at line %d", __func__, __LINE__);
5052 if(parseRrmPolicyList(doc, ns, cur, rrmPolicy->rRMPolicyMemberList[memIdx]) != ROK)
5059 if ((!xmlStrcmp(cur->name, (const xmlChar *)"RRM_POLICY_RATIO")) && (cur->ns == ns))
5061 if(parseRrmPolicyRatio(doc, ns, cur, &rrmPolicy->policyRatio) != ROK)
5072 /*******************************************************************
5074 * @brief Fill MAC Slice Configuration
5078 * Function : parseMacSliceCfgReq
5080 * Functionality: Fill MAC Slice Configuration
5082 * @params[in] XML document pointer
5084 * Current node in XML
5085 * Pointer to structure to be filled
5086 * @return ROK - success
5089 * ****************************************************************/
5090 uint8_t parseMacSliceCfgReq(xmlDocPtr doc, xmlNsPtr ns, xmlNodePtr cur,MacSliceCfgReq *macSliceCfgReq)
5092 uint8_t policyIdx = 0;
5093 memset(macSliceCfgReq, 0, sizeof(MacSliceCfgReq));
5094 cur = cur -> xmlChildrenNode;
5097 if ((!xmlStrcmp(cur->name, (const xmlChar *)"NUM_RRM_POLICY")) && (cur->ns == ns))
5099 macSliceCfgReq->numOfRrmPolicy = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
5102 if ((!xmlStrcmp(cur->name, (const xmlChar *)"MAC_SLICE_RRM_POLICY")) && (cur->ns == ns))
5104 DU_ALLOC_SHRABL_BUF(macSliceCfgReq->listOfRrmPolicy, macSliceCfgReq->numOfRrmPolicy * sizeof(MacSliceRrmPolicy*));
5105 if(!macSliceCfgReq->listOfRrmPolicy)
5107 DU_LOG("\nERROR --> DU APP: %s: Memory allocation failed at line %d", __func__, __LINE__);
5111 for(policyIdx = 0; policyIdx < macSliceCfgReq->numOfRrmPolicy; policyIdx++)
5113 DU_ALLOC_SHRABL_BUF(macSliceCfgReq->listOfRrmPolicy[policyIdx], sizeof(MacSliceRrmPolicy));
5114 if (macSliceCfgReq->listOfRrmPolicy[policyIdx] == NULLP)
5116 DU_LOG("\nERROR --> DU_APP: %s: Memory allocation failed at line %d", __func__, __LINE__);
5119 if(parseMacSliceRrmPolicy(doc, ns, cur, macSliceCfgReq->listOfRrmPolicy[policyIdx]) != ROK)
5131 #ifdef THREAD_AFFINITY
5132 /*******************************************************************
5134 * @brief Set thread affinity to the core configured via XML file
5138 * Function : parseThreadAffinity
5140 * Functionality: Set thread affinity to the core configured
5143 * @params[in] XML document pointer
5145 * Current node in XML
5146 * Thread information
5147 * @return ROK - success
5150 * ****************************************************************/
5151 uint8_t parseThreadAffinity(xmlDocPtr doc, xmlNsPtr ns, xmlNodePtr cur, ThreadInfo *threads)
5153 cur = cur -> xmlChildrenNode;
5156 if ((!xmlStrcmp(cur->name, (const xmlChar *)"DU_APP_CORE")) && (cur->ns == ns))
5158 threads->duAppCoreId = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
5159 ODU_SET_THREAD_AFFINITY(&threads->duAppSTskId, SS_AFFINITY_MODE_EXCL, threads->duAppCoreId, 0);
5162 if ((!xmlStrcmp(cur->name, (const xmlChar *)"EGTP_CORE")) && (cur->ns == ns))
5164 threads->egtpCoreId = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
5165 ODU_SET_THREAD_AFFINITY(&threads->egtpSTskId, SS_AFFINITY_MODE_EXCL, threads->egtpCoreId, 0);
5168 if ((!xmlStrcmp(cur->name, (const xmlChar *)"RLC_MAC_CORE")) && (cur->ns == ns))
5170 threads->rlcMacCoreId = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
5171 ODU_SET_THREAD_AFFINITY(&threads->rlcMacSTskId, SS_AFFINITY_MODE_EXCL, threads->rlcMacCoreId, 0);
5174 if ((!xmlStrcmp(cur->name, (const xmlChar *)"RLC_UL_CORE")) && (cur->ns == ns))
5176 threads->rlcUlCoreId = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
5177 ODU_SET_THREAD_AFFINITY(&threads->rlcUlSTskId, SS_AFFINITY_MODE_EXCL, threads->rlcUlCoreId, 0);
5180 if ((!xmlStrcmp(cur->name, (const xmlChar *)"SCH_CORE")) && (cur->ns == ns))
5182 threads->schCoreId = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
5183 ODU_SET_THREAD_AFFINITY(&threads->schSTskId, SS_AFFINITY_MODE_EXCL, threads->schCoreId, 0);
5186 if ((!xmlStrcmp(cur->name, (const xmlChar *)"SCTP_CORE")) && (cur->ns == ns))
5188 threads->sctpCoreId = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
5189 ODU_SET_THREAD_AFFINITY(&threads->sctpSTskId, SS_AFFINITY_MODE_EXCL, threads->sctpCoreId, 0);
5192 if ((!xmlStrcmp(cur->name, (const xmlChar *)"LOWER_MAC_CORE")) && (cur->ns == ns))
5194 threads->lwrMacCoreId = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
5195 ODU_SET_THREAD_AFFINITY(&threads->lwrMacSTskId, SS_AFFINITY_MODE_EXCL, threads->lwrMacCoreId, 0);
5204 /*******************************************************************
5206 * @brief Fill DU Config Parmeters
5210 * Function : parseDuCfgParams
5214 * @params[in] XML document pointer
5216 * Current node in XML
5217 * @return ROK - success
5220 * ****************************************************************/
5221 uint8_t parseDuCfgParams(xmlDocPtr doc, xmlNsPtr ns, xmlNodePtr cur)
5223 char *tempDuName = "";
5231 cur = cur->xmlChildrenNode;
5234 if ((!xmlStrcmp(cur->name, (const xmlChar *)"THREAD_AFFINITY")) && (cur->ns == ns))
5236 #ifdef THREAD_AFFINITY
5237 if(parseThreadAffinity(doc, ns, cur, &duCfgParam.threadInfo) != ROK)
5244 if ((!xmlStrcmp(cur->name, (const xmlChar *)"DU_ID")) && (cur->ns == ns))
5246 duCfgParam.duId = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
5249 if ((!xmlStrcmp(cur->name, (const xmlChar *)"DU_NAME")) && (cur->ns == ns))
5251 tempDuName =(char*) xmlNodeListGetString(doc, cur->xmlChildrenNode, 1);
5252 DU_ALLOC(duCfgParam.duName, strlen(tempDuName));
5253 if(!duCfgParam.duName)
5255 DU_LOG("\nERROR --> DU_APP: %s: Memory allocation failed at line %d", __func__, __LINE__);
5258 strcpy((char*)duCfgParam.duName, tempDuName);
5261 if ((!xmlStrcmp(cur->name, (const xmlChar *)"MAX_NUM_DRB")) && (cur->ns == ns))
5263 duCfgParam.maxNumDrb = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
5266 if ((!xmlStrcmp(cur->name, (const xmlChar *)"MAX_NUM_UE_SUPPORTED")) && (cur->ns == ns))
5268 duCfgParam.maxSupportedUes = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
5271 if ((!xmlStrcmp(cur->name, (const xmlChar *)"MAX_NUM_UE")) && (cur->ns == ns))
5273 duCfgParam.maxUe = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
5277 if( getStartupConfig(&g_cfg) != ROK )
5281 cmInetAddr((S8*)g_cfg.DU_IPV4_Addr, &duIp);
5282 cmInetAddr((S8*)g_cfg.CU_IPV4_Addr, &cuIp);
5283 cmInetAddr((S8*)g_cfg.RIC_IPV4_Addr, &ricIp);
5286 if ((!xmlStrcmp(cur->name, (const xmlChar *)"DU_IP_V4_ADDR")) && (cur->ns == ns))
5288 duIpV4Addr = (char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1);
5289 cmInetAddr(duIpV4Addr, &(duIp));
5292 if ((!xmlStrcmp(cur->name, (const xmlChar *)"CU_IP_V4_ADDR")) && (cur->ns == ns))
5294 cuIpV4Addr = (char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1);
5295 cmInetAddr(cuIpV4Addr, &(cuIp));
5298 if ((!xmlStrcmp(cur->name, (const xmlChar *)"RIC_IP_V4_ADDR")) && (cur->ns == ns))
5300 ricIpV4Addr = (char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1);
5301 cmInetAddr(ricIpV4Addr, &(ricIp));
5305 if ((!xmlStrcmp(cur->name, (const xmlChar *)"SCTP")) && (cur->ns == ns))
5307 if(parseSctpParams(doc, ns, cur, &duCfgParam.sctpParams) != ROK)
5311 duCfgParam.sctpParams.duIpAddr.ipV4Pres = true;
5312 duCfgParam.sctpParams.duIpAddr.ipV4Addr = duIp;
5313 duCfgParam.sctpParams.cuIpAddr.ipV4Pres = true;
5314 duCfgParam.sctpParams.cuIpAddr.ipV4Addr = cuIp;
5315 duCfgParam.sctpParams.ricIpAddr.ipV4Pres = true;
5316 duCfgParam.sctpParams.ricIpAddr.ipV4Addr = ricIp;
5319 if ((!xmlStrcmp(cur->name, (const xmlChar *)"EGTP")) && (cur->ns == ns))
5321 if(parseEgtpParams(doc, ns, cur, &duCfgParam.egtpParams) != ROK)
5325 duCfgParam.egtpParams.localIp.ipV4Addr = duIp;
5326 duCfgParam.egtpParams.localIp.ipV4Pres = true;
5327 duCfgParam.egtpParams.destIp.ipV4Pres = true;
5328 duCfgParam.egtpParams.destIp.ipV4Addr = cuIp;
5329 duCfgParam.egtpParams.maxTunnelId = duCfgParam.maxNumDrb * duCfgParam.maxSupportedUes;
5332 if ((!xmlStrcmp(cur->name, (const xmlChar *)"MIB_PARAMS")) && (cur->ns == ns))
5334 if(parseMibParams(doc, ns, cur, &duCfgParam.mibParams) != ROK)
5340 #ifdef XML_BASED_CONFIG
5341 if ((!xmlStrcmp(cur->name, (const xmlChar *)"SIB1_PARAMS")) && (cur->ns == ns))
5343 if(parseSib1Params(doc, ns, cur, &duCfgParam.sib1Params) != ROK)
5349 if ((!xmlStrcmp(cur->name, (const xmlChar *)"F1_DU_SRVD_CELL_INFO")) && (cur->ns == ns))
5351 if(parseF1DuServedCellInfo(doc, ns, cur, &duCfgParam.srvdCellLst[0]) != ROK)
5357 if ((!xmlStrcmp(cur->name, (const xmlChar *)"MAC_CELL_CFG")) && (cur->ns == ns))
5359 if(parseMacCellCfg(doc, ns, cur, &duCfgParam.macCellCfg) != ROK)
5367 if ((!xmlStrcmp(cur->name, (const xmlChar *)"SLICE_CFG")) && (cur->ns == ns))
5369 if(parseMacSliceCfgReq(doc, ns, cur, &duCfgParam.tempSliceCfg) != ROK)
5381 /*******************************************************************
5383 * @brief Reads config and posts message to du_app on completion
5387 * Function : duReadCfg
5390 * - Reads configuration from xml file and stores in DB
5391 * - Post to du_app for further processing
5394 * @return ROK - success
5397 * ****************************************************************/
5400 const char *filename = "../build/config/odu_config.xml";
5401 xmlDocPtr doc = NULLP;
5402 xmlNodePtr cur = NULLP;
5403 xmlNsPtr ns = NULLP;
5405 doc = xmlParseFile(filename);
5408 DU_LOG("\nERROR --> DU_APP: Failed to parse the XML file");
5412 cur = xmlDocGetRootElement(doc);
5413 ns = xmlSearchNsByHref(doc, cur, (const xmlChar *)"urn:o-ran:odu:configuration");
5416 DU_LOG("\nERROR --> DU_APP: XML Namespace not found.\n");
5422 parseDuCfgParams(doc, ns, cur);
5430 /* Read configs into duCfgParams */
5431 if(readCfg() != ROK)
5433 DU_LOG("\nERROR --> DU_APP : Reading configuration failed");
5438 /* Fill pst structure */
5439 memset(&(pst), 0, sizeof(Pst));
5440 pst.srcEnt = (Ent)ENTDUAPP;
5441 pst.srcInst = (Inst)DU_INST;
5442 pst.srcProcId = DU_PROC;
5443 pst.dstEnt = pst.srcEnt;
5444 pst.dstInst = pst.srcInst;
5445 pst.dstProcId = pst.srcProcId;
5447 pst.selector = ODU_SELECTOR_TC;
5450 /* Initialize the timer blocks */
5451 cmInitTimers(&(duCb.e2apDb.e2TimersInfo.e2Timers.e2SetupTimer), 1);
5452 cmInitTimers(&(duCb.e2apDb.e2TimersInfo.e2Timers.ricServiceUpdateTimer.timer), 1);
5453 cmInitTimers(&(duCb.e2apDb.e2TimersInfo.e2Timers.e2NodeConfigUpdate.timer), 1);
5455 /* Initialzie the timer queue */
5456 memset(&(duCb.duTimersInfo.tmrTq), 0, sizeof(CmTqType) * DU_TQ_SIZE);
5458 /* Initialize the timer control point */
5459 memset(&(duCb.duTimersInfo.tmrTqCp), 0, sizeof(CmTqCp));
5460 duCb.duTimersInfo.tmrTqCp.tmrLen = DU_TQ_SIZE;
5462 /* Initialize the timer resolution */
5463 duCb.duTimersInfo.tmrRes = DU_TIMER_RESOLUTION;
5465 /* Timer Registration request to system services */
5466 if (ODU_REG_TMR_MT(pst.srcEnt, pst.srcInst, duCb.duTimersInfo.tmrRes, duActvTmr) != ROK)
5468 DU_LOG("\nERROR --> DU_APP : Failed to register timer");
5472 if(ODU_GET_MSG_BUF(DFLT_REGION, DU_POOL, &mBuf) != ROK)
5474 DU_LOG("\nERROR --> DU_APP : Memory allocation failed in duReadCfg");
5478 if (ODU_POST_TASK(&pst, mBuf) != ROK)
5480 DU_LOG("\nERROR --> DU_APP : ODU_POST_TASK failed in duReadCfg");
5487 /*******************************************************************
5489 * @brief Prints all DU Configuration
5493 * Function : printDuConfig
5496 * - Prints all DU configurations
5501 * ****************************************************************/
5502 void printDuConfig()
5504 uint8_t sliceIdx = 0, pfIdx = 0, rsrcIdx = 0, ssbMaskIdx = 0, fdmIdx = 0;
5505 uint8_t monitoringSymbIdx = 0, poIdx = 0, policyIdx = 0, memIdx = 0;
5506 __attribute__((unused)) SctpParams *sctp;
5507 __attribute__((unused)) F1EgtpParams *egtp;
5508 __attribute__((unused)) MibParams *mib;
5509 __attribute__((unused)) F1RrcVersion *f1RrcVersion;
5510 F1DuCellInfo *f1DuCellInfo;
5511 F1CellInfo *f1CellInfo;
5512 __attribute__((unused)) F1DuSysInfo *duSysInfo;
5513 __attribute__((unused)) F1BrdcstPlmnInfo *brdcstPlmnInfo;
5514 NrModeInfo *nrModeInfo;
5515 __attribute__((unused)) F1NrFddInfo *f1NrFddInfo;
5516 F1SrvdPlmn *srvdPlmn;
5517 SupportedSliceList *sliceSuppLst;
5518 MacCellCfg *macCellCfg;
5519 __attribute__((unused)) CarrierCfg *carrierCfg;
5521 PlmnInfoList *plmnInfoList;
5522 Sib1CellCfg *sib1Cfg;
5523 SchPageCfg *pageCfg;
5524 __attribute__((unused)) PdcchConfigSib1 *pdcchConfigSib1;
5525 BwpDlConfig *bwpDlCfg;
5526 __attribute__((unused)) BwpParams *bwp;
5527 PdcchConfigCommon *pdcchCfgCmn;
5528 SearchSpaceCfg *searchSpaceCfg;
5529 __attribute__((unused)) CandidatesInfo *candidateInfo;
5530 PdschConfigCommon *pdschCfgCmn;
5531 __attribute__((unused)) PdschCfgCommTimeDomRsrcAlloc *pdschCmnTimeDomRsrcAlloc;
5532 BwpUlConfig *bwpUlCfg;
5533 __attribute__((unused)) PucchConfigCommon *pucchCfgCmn;
5534 PuschConfigCommon *puschCfgCmn;
5535 __attribute__((unused)) PuschTimeDomRsrcAlloc *puschTimeDomRsrcAlloc;
5536 __attribute__((unused)) SsbCfg *ssbCfg;
5537 __attribute__((unused)) CsiRsCfg *csiRsCfg;
5539 __attribute__((unused)) PrachFdmInfo *prachFdmInfo;
5540 __attribute__((unused)) PrecodingConf *precodCfg;
5541 __attribute__((unused)) BeamformingConf *beamFormingCfg;
5542 Sib1Params *sib1Params;
5543 __attribute__((unused)) SiSchedInfo *siSchedInfo;
5544 SrvCellCfgCommSib *srvCellCfgCmnSib;
5545 DlCfgCommon *dlCfgCmn;
5546 PdcchCfgCommon *pdcchCfgCommon;
5547 PdschCfgCommon *pdschCfgCommon;
5548 __attribute__((unused)) PdschTimeDomainRsrcAlloc *pdschTimeDomRsrcAlloc;
5549 __attribute__((unused)) BcchCfg *bcchCfg;
5550 __attribute__((unused)) PcchCfg *pcchCfg;
5551 UlCfgCommon *ulCfgCmn;
5552 RachCfgCommon *rachCfgCmn;
5553 PuschCfgCommon *puschCfgCommon;
5554 __attribute__((unused)) PuschCfgCmnTimeDomAlloc *puschCmnTimeDomRsrsAlloc;
5555 PucchCfgCommon *pucchCfgCommon;
5556 __attribute__((unused)) TddUlDlCfgCommon *tddUlDlCfgCmn;
5557 MacSliceCfgReq *macSliceCfg;
5558 MacSliceRrmPolicy *rrmPolicy;
5559 __attribute__((unused)) RrmPolicyRatio *rrmPolicyRatio;
5560 __attribute__((unused)) RrmPolicyMemberList *rrmPolicyMemberList;
5563 F1NrTddInfo *f1NrTddInfo;
5567 DU_LOG("\n ** DU CONFIGURATION ** \n");
5568 DU_LOG("DU ID %d\n", duCfgParam.duId);
5569 DU_LOG("DU Name %s\n", duCfgParam.duName);
5571 DU_LOG("\n ** Thread Affinity ** \n");
5572 DU_LOG("DU APP CORE ID %d\n", duCfgParam.threadInfo.duAppCoreId);
5573 DU_LOG("EGTP CORE ID %d\n", duCfgParam.threadInfo.egtpCoreId);
5574 DU_LOG("SCTP CORE ID %d\n", duCfgParam.threadInfo.sctpCoreId);
5575 DU_LOG("RLC-UL CORE ID %d\n", duCfgParam.threadInfo.rlcUlCoreId);
5576 DU_LOG("RLC-DL and MAC CORE ID %d\n", duCfgParam.threadInfo.rlcMacCoreId);
5577 DU_LOG("SCH CORE ID %d\n", duCfgParam.threadInfo.schCoreId);
5578 DU_LOG("Lower MAC CORE ID %d\n", duCfgParam.threadInfo.lwrMacCoreId);
5580 DU_LOG("MAX NUM DRB %d\n", duCfgParam.maxNumDrb);
5581 DU_LOG("MAX SUPPORTED UE %d\n", duCfgParam.maxSupportedUes);
5582 DU_LOG("MAX UE %d\n",duCfgParam.maxUe);
5584 sctp = &duCfgParam.sctpParams;
5585 DU_LOG("\n ** SCTP PARAMETER ** \n");
5586 DU_LOG("DU IPv4 Address present %u\n", sctp->duIpAddr.ipV4Pres);
5587 DU_LOG("DU IP Address %u\n", sctp->duIpAddr.ipV4Addr);
5588 DU_LOG("CU IPv4 Address present %u\n", sctp->cuIpAddr.ipV4Pres);
5589 DU_LOG("CU IP Address %u\n", sctp->cuIpAddr.ipV4Addr);
5590 DU_LOG("RIC IPv4 Address present %u\n", sctp->ricIpAddr.ipV4Pres);
5591 DU_LOG("RIC IP Address %u\n", sctp->ricIpAddr.ipV4Addr);
5592 DU_LOG("SCTP Port at DU for F1 Interface %d\n", sctp->duPort[F1_INTERFACE]);
5593 DU_LOG("SCTP Port at CU for F1 Interface %d\n", sctp->cuPort);
5594 DU_LOG("SCTP Port at DU for E2 Interface %d\n", sctp->duPort[E2_INTERFACE]);
5595 DU_LOG("SCTP Port at RIC for E2 Interface %d\n", sctp->ricPort);
5597 egtp = &duCfgParam.egtpParams;
5598 DU_LOG("\n ** EGTP PARAMETER ** \n");
5599 DU_LOG("DU IP Address %d\n", egtp->localIp.ipV4Addr);
5600 DU_LOG("CU IP Address %d\n", egtp->destIp.ipV4Addr);
5601 DU_LOG("EGTP Port at DU %d\n", egtp->localPort);
5602 DU_LOG("EGTP Port at CU %d\n", egtp->destPort);
5603 DU_LOG("Minimum Tunnel ID %d\n", egtp->minTunnelId);
5604 DU_LOG("Maximum Tunnel ID %d\n",egtp->maxTunnelId);
5606 mib = &duCfgParam.mibParams;
5607 DU_LOG("\n ** MIB PARAMETER ** \n");
5608 DU_LOG("System Frame Number %d\n", mib->sysFrmNum);
5609 DU_LOG("Subcarrier Spacing Common %ld\n", mib->subCarrierSpacingCommon);
5610 DU_LOG("SSB Subcarrier Offset %ld\n", mib->ssb_SubcarrierOffset);
5611 DU_LOG("DMRS Type-A Position %ld\n", mib->dmrs_TypeA_Position);
5612 DU_LOG("Control Resource Set Zero %ld\n", mib->controlResourceSetZero);
5613 DU_LOG("Search Space Zero %ld\n", mib->searchSpaceZero);
5614 DU_LOG("Cell Barred %ld\n", mib->cellBarred);
5615 DU_LOG("Intra Frequency Reselection %ld\n", mib->intraFreqReselection);
5617 duSysInfo = &duCfgParam.srvdCellLst[0].duSysInfo;
5618 DU_LOG("\n ** DU System Information ** \n");
5619 DU_LOG("MIB length %d\n", duSysInfo->mibLen);
5620 DU_LOG("MIB message %s\n", duSysInfo->mibMsg);
5621 DU_LOG("SIB1 length %d\n", duSysInfo->sib1Len);
5622 DU_LOG("SIB1 message %s\n", duSysInfo->sib1Msg);
5624 f1DuCellInfo = &duCfgParam.srvdCellLst[0].duCellInfo;
5625 DU_LOG("\n ** DU Cell Information ** \n");
5627 f1CellInfo = &f1DuCellInfo->cellInfo;
5628 DU_LOG("NR PCI %d\n", f1CellInfo->nrPci);
5629 DU_LOG("DU TAC %d\n", f1DuCellInfo->tac);
5630 DU_LOG("EPS TAC %d\n", f1DuCellInfo->epsTac);
5631 DU_LOG("Measurement Time Configuration Duration %d\n", f1DuCellInfo->measTimeCfgDuration);
5632 DU_LOG("Cell Direction %d\n", f1DuCellInfo->cellDir);
5633 DU_LOG("Cell Type %d\n", f1DuCellInfo->cellType);
5635 DU_LOG("\n ** Cell Info : NR CGI ** \n");
5636 DU_LOG("Cell Id %d\n",f1CellInfo->nrCgi.cellId);
5637 DU_LOG("PLMN : mcc[0] %d\n", f1CellInfo->nrCgi.plmn.mcc[0]);
5638 DU_LOG("PLMN : mcc[1] %d\n", f1CellInfo->nrCgi.plmn.mcc[1]);
5639 DU_LOG("PLMN : mcc[2] %d\n", f1CellInfo->nrCgi.plmn.mcc[2]);
5640 DU_LOG("PLMN : mnc[0] %d\n", f1CellInfo->nrCgi.plmn.mnc[0]);
5641 DU_LOG("PLMN : mnc[1] %d\n", f1CellInfo->nrCgi.plmn.mnc[1]);
5642 DU_LOG("PLMN : mnc[2] %d\n", f1CellInfo->nrCgi.plmn.mnc[2]);
5644 srvdPlmn = &f1CellInfo->srvdPlmn[0];
5645 DU_LOG("\n ** Cell Info : Served PLMN ** \n");
5646 DU_LOG("PLMN : mcc[0] %d\n", srvdPlmn->plmn.mcc[0]);
5647 DU_LOG("PLMN : mcc[1] %d\n", srvdPlmn->plmn.mcc[1]);
5648 DU_LOG("PLMN : mcc[2] %d\n", srvdPlmn->plmn.mcc[2]);
5649 DU_LOG("PLMN : mnc[0] %d\n", srvdPlmn->plmn.mnc[0]);
5650 DU_LOG("PLMN : mnc[1] %d\n", srvdPlmn->plmn.mnc[1]);
5651 DU_LOG("PLMN : mnc[2] %d\n", srvdPlmn->plmn.mnc[2]);
5652 DU_LOG("EXT_PLMN : mcc[0] %d\n", srvdPlmn->extPlmn.mcc[0]);
5653 DU_LOG("EXT_PLMN : mcc[1] %d\n", srvdPlmn->extPlmn.mcc[1]);
5654 DU_LOG("EXT_PLMN : mcc[2] %d\n", srvdPlmn->extPlmn.mcc[2]);
5655 DU_LOG("EXT_PLMN : mnc[0] %d\n", srvdPlmn->extPlmn.mnc[0]);
5656 DU_LOG("EXT_PLMN : mnc[1] %d\n", srvdPlmn->extPlmn.mnc[1]);
5657 DU_LOG("EXT_PLMN : mnc[2] %d\n", srvdPlmn->extPlmn.mnc[2]);
5659 sliceSuppLst = &srvdPlmn->taiSliceSuppLst;
5660 DU_LOG("\n ** Cell Info : Served PLMN : Supported Slice List ** \n");
5661 DU_LOG("Number of Slices supported %d\n", sliceSuppLst->numSupportedSlices);
5662 for (sliceIdx = 0; sliceIdx < sliceSuppLst->numSupportedSlices; sliceIdx++)
5665 DU_LOG("\tSST %d\n", (*sliceSuppLst->snssai[sliceIdx]).sst);
5666 DU_LOG("\tSD %d %d %d\n", (*sliceSuppLst->snssai[sliceIdx]).sd[0], (*sliceSuppLst->snssai[sliceIdx]).sd[1], \
5667 (*sliceSuppLst->snssai[sliceIdx]).sd[2]);
5670 brdcstPlmnInfo = &f1DuCellInfo->brdcstPlmnInfo[0];
5671 DU_LOG("\n ** DU Cell Information : Broadcast PLMN Info ** \n");
5672 DU_LOG("TAC %d\n", brdcstPlmnInfo->tac);
5673 DU_LOG("NR Cell Id %d\n", brdcstPlmnInfo->nrCellId);
5674 DU_LOG("RANAC %d\n", brdcstPlmnInfo->ranac);
5676 DU_LOG("PLMN : mcc[0] %d\n", brdcstPlmnInfo->plmn[0].mcc[0]);
5677 DU_LOG("PLMN : mcc[1] %d\n", brdcstPlmnInfo->plmn[0].mcc[1]);
5678 DU_LOG("PLMN : mcc[2] %d\n", brdcstPlmnInfo->plmn[0].mcc[2]);
5679 DU_LOG("PLMN : mnc[0] %d\n", brdcstPlmnInfo->plmn[0].mnc[0]);
5680 DU_LOG("PLMN : mnc[1] %d\n", brdcstPlmnInfo->plmn[0].mnc[1]);
5681 DU_LOG("PLMN : mnc[2] %d\n", brdcstPlmnInfo->plmn[0].mnc[2]);
5683 DU_LOG("EXT_PLMN : mcc[0] %d\n", brdcstPlmnInfo->extPlmn[0].mcc[0]);
5684 DU_LOG("EXT_PLMN : mcc[1] %d\n", brdcstPlmnInfo->extPlmn[0].mcc[1]);
5685 DU_LOG("EXT_PLMN : mcc[2] %d\n", brdcstPlmnInfo->extPlmn[0].mcc[2]);
5686 DU_LOG("EXT_PLMN : mnc[0] %d\n", brdcstPlmnInfo->extPlmn[0].mnc[0]);
5687 DU_LOG("EXT_PLMN : mnc[1] %d\n", brdcstPlmnInfo->extPlmn[0].mnc[1]);
5688 DU_LOG("EXT_PLMN : mnc[2] %d\n", brdcstPlmnInfo->extPlmn[0].mnc[2]);
5690 nrModeInfo = &f1DuCellInfo->f1Mode;
5691 f1NrFddInfo = &nrModeInfo->mode.fdd;
5692 DU_LOG("\n ** DU Cell Information : NR Mode Info ** \n");
5694 DU_LOG("\n ** NR Mode Info : FDD ** \n");
5695 DU_LOG("\n ** NR Mode Info : FDD : UL NR Frequency ** \n");
5696 DU_LOG("NR ARFCN %d\n", f1NrFddInfo->ulNrFreqInfo.nrArfcn);
5697 DU_LOG("SUL : ARFCN %d\n",f1NrFddInfo->ulNrFreqInfo.sulInfo.sulArfcn);
5698 DU_LOG("SUL : Transmission BW Subcarrier Spacing %d\n", f1NrFddInfo->ulNrFreqInfo.sulInfo.sulTxBw.nrScs);
5699 DU_LOG("SUL : Number of RBs in Transmission BW %d\n", f1NrFddInfo->ulNrFreqInfo.sulInfo.sulTxBw.nrb);
5700 DU_LOG("NR Frequency Band %d\n", f1NrFddInfo->ulNrFreqInfo.freqBand[0].nrFreqBand);
5701 DU_LOG("SUL Band %d\n", f1NrFddInfo->ulNrFreqInfo.freqBand[0].sulBand[0]);
5703 DU_LOG("\n ** NR Mode Info : FDD : DL NR Frequency ** \n");
5704 DU_LOG("NR ARFCN %d\n", f1NrFddInfo->dlNrFreqInfo.nrArfcn);
5705 DU_LOG("SUL : ARFCN %d\n",f1NrFddInfo->dlNrFreqInfo.sulInfo.sulArfcn);
5706 DU_LOG("SUL : Transmission BW Subcarrier Sapcing %d\n", f1NrFddInfo->dlNrFreqInfo.sulInfo.sulTxBw.nrScs);
5707 DU_LOG("SUL : Number of RBs in Transmission BW %d\n", f1NrFddInfo->dlNrFreqInfo.sulInfo.sulTxBw.nrb);
5708 DU_LOG("NR Frequency Band %d\n", f1NrFddInfo->dlNrFreqInfo.freqBand[0].nrFreqBand);
5709 DU_LOG("SUL Band %d\n", f1NrFddInfo->dlNrFreqInfo.freqBand[0].sulBand[0]);
5711 DU_LOG("\n ** NR Mode Info : FDD : UL Transmission Bandwidth ** \n");
5712 DU_LOG("Subscarrier spacing %d\n", f1NrFddInfo->ulTxBw.nrScs);
5713 DU_LOG("Number of RBs %d\n", f1NrFddInfo->ulTxBw.nrb);
5715 DU_LOG("\n ** NR Mode Info : FDD : DL Transmission Bandwidth ** \n");
5716 DU_LOG("Subcarrier Spacing %d\n", f1NrFddInfo->dlTxBw.nrScs);
5717 DU_LOG("Number of RBs %d\n", f1NrFddInfo->dlTxBw.nrb);
5721 f1NrTddInfo = &nrModeInfo ->mode.tdd;
5723 DU_LOG("\n ** NR Mode Info : TDD : NR Frequency ** \n");
5724 DU_LOG("NR ARFCN %d\n", f1NrTddInfo->nrFreqInfo.nrArfcn);
5725 DU_LOG("SUL : ARFCN %d\n",f1NrTddInfo->nrFreqInfo.sulInfo.sulArfcn);
5726 DU_LOG("SUL : Transmission BW Subscarrier Spacing %d\n", f1NrTddInfo->nrFreqInfo.sulInfo.sulTxBw.nrScs);
5727 DU_LOG("SUL : Number of RBs in Transmission BW %d\n", f1NrTddInfo->nrFreqInfo.sulInfo.sulTxBw.nrb);
5728 DU_LOG("NR Frequency Band %d\n", f1NrTddInfo->nrFreqInfo.freqBand[0].nrFreqBand);
5729 DU_LOG("SUL Band %d\n", f1NrTddInfo->nrFreqInfo.freqBand[0].sulBand[0]);
5731 DU_LOG("\n ** NR Mode Info : TDD : NR Transmission Bandwidth ** \n");
5732 DU_LOG("Subcarrier Spacing %d\n", f1NrTddInfo->nrTxBw.nrScs);
5733 DU_LOG("Number of RBs %d\n", f1NrTddInfo->nrTxBw.nrb);
5736 macCellCfg = &duCfgParam.macCellCfg;
5737 DU_LOG("\n ** MAC CELL CONFIGURATION ** \n");
5738 DU_LOG("Cell Id %d\n", macCellCfg->cellId);
5740 DU_LOG("\n ** MAC Cell Configuration : Carrier Configuration ** \n");
5741 carrierCfg = &macCellCfg ->carrCfg;
5742 DU_LOG("DL Bandwidth %d\n", carrierCfg->dlBw);
5743 DU_LOG("DL ARFCN %d\n", carrierCfg->arfcnDL);
5744 DU_LOG("UL Bandwidth %d\n", carrierCfg->ulBw);
5745 DU_LOG("UL ARFCN %d\n", carrierCfg->arfcnUL);
5746 DU_LOG("Number of Transmission Antenna %d\n", carrierCfg->numTxAnt);
5747 DU_LOG("Number of Received Antenna %d\n", carrierCfg->numRxAnt);
5749 DU_LOG("\n ** MAC Cell Configuration : Cell Configuration ** \n");
5750 cellCfg = &macCellCfg ->cellCfg;
5751 DU_LOG("Operational State %d\n", cellCfg->opState);
5752 DU_LOG("Administration State %d\n", cellCfg->adminState);
5753 DU_LOG("Cell Current State %d\n", cellCfg->cellState);
5754 DU_LOG("NR PCI %d\n", cellCfg->phyCellId);
5755 DU_LOG("TAC: %d\n", cellCfg->tac);
5756 DU_LOG("SSB Freqeuncy %d\n", cellCfg->ssbFreq);
5757 DU_LOG("Subcarrier Spacing: %d\n", cellCfg->subCarrSpacing);
5758 DU_LOG("Duplex Mode %d\n", cellCfg->dupType);
5760 DU_LOG("\n ** MAC Cell Configuration : Cell Configuration : PLMN Info List ** \n");
5761 plmnInfoList = &cellCfg ->plmnInfoList[0];
5762 DU_LOG("PLMN : mcc[0] %d\n", plmnInfoList->plmn.mcc[0]);
5763 DU_LOG("PLMN : mcc[1] %d\n", plmnInfoList->plmn.mcc[1]);
5764 DU_LOG("PLMN : mcc[2] %d\n", plmnInfoList->plmn.mcc[2]);
5765 DU_LOG("PLMN : mnc[0] %d\n", plmnInfoList->plmn.mnc[0]);
5766 DU_LOG("PLMN : mnc[1] %d\n", plmnInfoList->plmn.mnc[1]);
5767 DU_LOG("PLMN : mnc[2] %d\n", plmnInfoList->plmn.mnc[2]);
5769 DU_LOG("Number of Slice supported %d\n", plmnInfoList->suppSliceList.numSupportedSlices);
5770 for(sliceIdx = 0; sliceIdx < plmnInfoList->suppSliceList.numSupportedSlices; sliceIdx++)
5773 DU_LOG("\nSST %d\n", (*plmnInfoList->suppSliceList.snssai[sliceIdx]).sst);
5774 DU_LOG("\nSD %d %d %d\n", (*plmnInfoList->suppSliceList.snssai[sliceIdx]).sd[0], \
5775 (*plmnInfoList->suppSliceList.snssai[sliceIdx]).sd[1],(*plmnInfoList->suppSliceList.snssai[sliceIdx]).sd[2]);
5778 DU_LOG("\n ** MAC Cell Configuration : Cell Configuration : SIB1 ** \n");
5779 sib1Cfg = &cellCfg->sib1Cfg;
5780 DU_LOG("SIB1 PDU Length %d", sib1Cfg->sib1PduLen);
5781 DU_LOG("SIB1 PDU %s", sib1Cfg->sib1Pdu);
5783 DU_LOG("\n ** MAC Cell Configuration : Cell Configuration : SIB1 : Paging Configuration ** \n");
5784 pageCfg = &sib1Cfg->pagingCfg;
5786 DU_LOG("Number of Paging Occassion %d\n", pageCfg->numPO);
5787 if (pageCfg->poPresent == true)
5788 DU_LOG("FirstPDCCH-Monitoring Paging Occassion present : TRUE\n");
5790 DU_LOG("FirstPDCCH-Monitoring Paging Occassion present : FALSE\n");
5792 for(pfIdx = 0; pfIdx < MAX_PO_PER_PF; pfIdx++)
5794 DU_LOG("Paging Occassion at Paging Frame [%d] : %d\n", pfIdx, pageCfg->pagingOcc[pfIdx]);
5797 pdcchConfigSib1 = &sib1Cfg->pdcchCfgSib1;
5798 DU_LOG("\n ** MAC Cell Configuration : Cell Configuration : SIB1 : PDCCH ** \n");
5799 DU_LOG("Coreset Zero Index %d\n", pdcchConfigSib1->coresetZeroIndex);
5800 DU_LOG("Search Space Zero Index %d\n", pdcchConfigSib1->searchSpaceZeroIndex);
5802 bwpDlCfg = &cellCfg->initialDlBwp;
5803 DU_LOG("\n ** MAC Cell Configuration : Cell Configuration : DL BWP Configuration ** \n");
5805 DU_LOG("\n ** MAC Cell Configuration : Cell Configuration : DL BWP : BWP ** \n");
5806 bwp = &bwpDlCfg->bwp;
5807 DU_LOG("First PRB %d\n", bwp->firstPrb);
5808 DU_LOG("Number of PRBs %d\n", bwp->numPrb);
5809 DU_LOG("Subcarrier Spacing %d\n", bwp->scs);
5810 DU_LOG("Cyclic Perfix %d\n", bwp->cyclicPrefix);
5812 DU_LOG("\n ** MAC Cell Configuration : Cell Configuration : DL BWP : PDCCH Config Common ** \n");
5813 pdcchCfgCmn = &bwpDlCfg->pdcchCommon;
5814 DU_LOG("RA Search Space ID %d\n", pdcchCfgCmn->raSearchSpaceId);
5816 DU_LOG("\n ** MAC Cell Configuration : Cell Configuration : DL BWP : PDCCH Config Common : Search Space ** \n");
5817 searchSpaceCfg = &pdcchCfgCmn->commonSearchSpace;
5818 DU_LOG("Search Space ID %d\n", searchSpaceCfg->searchSpaceId);
5819 DU_LOG("Coreset ID %d\n", searchSpaceCfg->coresetId);
5820 DU_LOG("Monitoring Slot %d\n", searchSpaceCfg->monitoringSlot);
5821 DU_LOG("Duration %d\n", searchSpaceCfg->duration);
5822 DU_LOG("Monitoring Symbol %x\n", searchSpaceCfg->monitoringSymbol);
5824 candidateInfo = &searchSpaceCfg->candidate;
5825 DU_LOG("Number of Candidates in Aggregation Level_1 %d\n", candidateInfo->aggLevel1);
5826 DU_LOG("Number of Candidates in Aggregation Level_2 %d\n", candidateInfo->aggLevel2);
5827 DU_LOG("Number of Candidates in Aggregation Level_4 %d\n", candidateInfo->aggLevel4);
5828 DU_LOG("Number of Candidates in Aggregation Level_8 %d\n", candidateInfo->aggLevel8);
5829 DU_LOG("Number of Candidates in Aggregation Level_16 %d\n", candidateInfo->aggLevel16);
5831 DU_LOG("\n ** MAC Cell Configuration : Cell Configuration : DL BWP : PDSCH Config Common ** \n");
5832 pdschCfgCmn = &bwpDlCfg->pdschCommon;
5833 DU_LOG("Number of Time Domain Resource Allocation %d\n", pdschCfgCmn->numTimeDomAlloc);
5835 for (rsrcIdx = 0; rsrcIdx < pdschCfgCmn->numTimeDomAlloc; rsrcIdx++)
5837 DU_LOG("Time Domain Resource Allocation Idx %d\n", rsrcIdx);
5838 pdschCmnTimeDomRsrcAlloc = &pdschCfgCmn->timeDomRsrcAllocList[rsrcIdx];
5839 DU_LOG("\tK0 %d\n", pdschCmnTimeDomRsrcAlloc->k0);
5840 DU_LOG("\tPDSCH Mapping Type %d\n", pdschCmnTimeDomRsrcAlloc->mappingType);
5841 DU_LOG("\tPDSCH Start Symbol %d\n", pdschCmnTimeDomRsrcAlloc->startSymbol);
5842 DU_LOG("\tPDSCH Symbol Length %d\n", pdschCmnTimeDomRsrcAlloc->lengthSymbol);
5845 DU_LOG("\n ** MAC Cell Configuration : Cell Configuration : UL BWP Configuration ** \n");
5846 bwpUlCfg = &cellCfg->initialUlBwp;
5848 DU_LOG("\n ** MAC Cell Configuration : Cell Configuration : UL BWP : BWP ** \n");
5849 DU_LOG("First PRB %d\n", bwpUlCfg->bwp.firstPrb);
5850 DU_LOG("Number of PRBs %d\n", bwpUlCfg->bwp.numPrb);
5851 DU_LOG("Subcarrier Spacing %d\n", bwpUlCfg->bwp.scs);
5852 DU_LOG("Cyclic Prefix %d\n", bwpUlCfg->bwp.cyclicPrefix);
5854 DU_LOG("\n ** MAC Cell Configuration : Cell Configuration : UL BWP : PUCCH Config Common ** \n");
5855 pucchCfgCmn = &bwpUlCfg->pucchCommon;
5856 DU_LOG("PUCCH Resource Common %d\n", pucchCfgCmn->pucchResourceCommon);
5857 DU_LOG("Group Hopping %d\n", pucchCfgCmn->pucchGroupHopping);
5859 DU_LOG("\n ** MAC Cell Configuration : Cell Configuration : UL BWP : PUSCH Config Common ** \n");
5860 puschCfgCmn = &bwpUlCfg ->puschCommon;
5861 DU_LOG("Number of Time Domain Resource Allocation %d\n", puschCfgCmn->numTimeDomRsrcAlloc);
5862 for (rsrcIdx = 0; rsrcIdx < puschCfgCmn->numTimeDomRsrcAlloc; rsrcIdx++)
5864 DU_LOG("Time Domain Resource Allocation Idx %d\n", rsrcIdx);
5865 puschTimeDomRsrcAlloc = &puschCfgCmn->timeDomRsrcAllocList[rsrcIdx];
5866 DU_LOG("\tK2 %d\n", puschTimeDomRsrcAlloc->k2);
5867 DU_LOG("\tPUSCH Mapping Type %d\n", puschTimeDomRsrcAlloc->mappingType);
5868 DU_LOG("\tPUSCH Start Symbol %d\n", puschTimeDomRsrcAlloc->startSymbol);
5869 DU_LOG("\tPUSCH Symbol Length %d\n", puschTimeDomRsrcAlloc->symbolLength);
5870 DU_LOG("\tPUSCH Start Symbol And Length %d\n", puschTimeDomRsrcAlloc->startSymbolAndLength);
5873 DU_LOG("\n ** MAC Cell Configuration : SSB Configuration** \n");
5874 ssbCfg = &macCellCfg ->ssbCfg;
5875 DU_LOG("SSB PDCH Power %d\n", ssbCfg->ssbPbchPwr);
5876 DU_LOG("Subcarrier Spacing Common %d\n", ssbCfg->scsCmn);
5877 DU_LOG("SSB Offset from Point A %d\n", ssbCfg->ssbOffsetPointA);
5878 DU_LOG("SSB Periodicity in msec %d\n", ssbCfg->ssbPeriod);
5879 DU_LOG("SSB Subcarrier Offset %d\n", ssbCfg->ssbScOffset);
5880 for (ssbMaskIdx = 0; ssbMaskIdx < SSB_MASK_SIZE; ssbMaskIdx++)
5882 DU_LOG("SSB Mask[%d] :%d\n", ssbMaskIdx, ssbCfg->ssbMask[ssbMaskIdx]);
5884 DU_LOG("Beam ID %d\n", ssbCfg->beamId[0]);
5885 DU_LOG("BETA PSS %d\n", ssbCfg->betaPss);
5886 DU_LOG("BCH Payloag Flag %d\n", ssbCfg->bchPayloadFlag);
5887 DU_LOG("MIB PDU %d %d %d", ssbCfg->mibPdu[0], ssbCfg->mibPdu[1], ssbCfg->mibPdu[2]);
5888 DU_LOG("DMRS Type-A Position %d\n", ssbCfg->dmrsTypeAPos);
5890 DU_LOG("\n ** MAC Cell Configuration : CSI RS Configuration ** \n");
5891 csiRsCfg = &macCellCfg->csiRsCfg;
5892 DU_LOG("Frequency Domain Allocation %s\n", csiRsCfg->csiFreqDomainAlloc);
5893 DU_LOG("Number of Ports %d\n", csiRsCfg->csiNrofPorts);
5894 DU_LOG("First OFDM Symbol in Time Domain %d\n", csiRsCfg->csirsfirstOFDMSymbolInTimeDomain);
5895 DU_LOG("First OFDM Symbol in Timer Domain 2 %d\n", csiRsCfg->csirsfirstOFDMSymbolInTimeDomain2);
5896 DU_LOG("CDM Type %d\n", csiRsCfg->csirscdmType);
5897 DU_LOG("Density %d\n", csiRsCfg->csirsdensity);
5898 DU_LOG("Density dot 5:%d\n", csiRsCfg->csirsdensitydot5);
5899 DU_LOG("Power Control Offset %d\n", csiRsCfg->powerControlOffset);
5900 DU_LOG("Power Control Offset Search Space %d\n", csiRsCfg->powerControlOffsetSS);
5901 DU_LOG("Periodicity And Offset %d\n", csiRsCfg->periodicityAndOffset);
5903 DU_LOG("\n ** MAC Cell Configuration : PRACH Configuration ** \n");
5904 prachCfg = &macCellCfg->prachCfg;
5905 DU_LOG("PRACH Sequence Length %d\n", prachCfg->prachSeqLen);
5906 DU_LOG("Subcarrier Spacing %d\n", prachCfg->prachSubcSpacing);
5907 DU_LOG("Number of PRACH FDM %d\n", prachCfg->msg1Fdm);
5908 DU_LOG("PRACH Configuration Index %d\n", prachCfg->prachCfgIdx);
5909 DU_LOG("PRACH Restricted Set Configuration %d\n", prachCfg->prachRstSetCfg);
5910 DU_LOG("Number of SSB per RACH occassion %d\n", prachCfg->ssbPerRach);
5911 DU_LOG("Number of RA preambles %d\n", prachCfg->totalNumRaPreamble);
5912 DU_LOG("Number of Contention Based Preamble per SSB %d\n", prachCfg->numCbPreamblePerSsb);
5913 DU_LOG("PRACH Frequeny Start Offset %d\n", prachCfg->msg1FreqStart);
5914 DU_LOG("RA Contention Resolution Timer %d\n", prachCfg->raContResTmr);
5915 DU_LOG("RSRP Threshold %d\n", prachCfg->rsrpThreshSsb);
5916 DU_LOG("RA Response Window %d\n", prachCfg->raRspWindow);
5917 for(fdmIdx = 0; fdmIdx < prachCfg->msg1Fdm; fdmIdx++)
5919 prachFdmInfo = &prachCfg->fdm[fdmIdx];
5920 DU_LOG("FDM[%d]\n", fdmIdx);
5921 DU_LOG("\tRoot Sequence Index %d\n", prachFdmInfo->rootSeqIdx);
5922 DU_LOG("\tNumber of Root Sequence %d\n", prachFdmInfo->numRootSeq);
5923 DU_LOG("\tK1 %d\n", prachFdmInfo->k1);
5924 DU_LOG("\tZero Correlation Zone Configuration %d\n", prachFdmInfo->zeroCorrZoneCfg);
5928 DU_LOG("\n ** MAC Cell Configuration : TDD Configuration ** \n");
5929 tddCfg = &macCellCfg->tddCfg;
5930 DU_LOG("TDD Slot Periodicity %d\n", tddCfg->tddPeriod);
5931 DU_LOG("Number of DL Slots %d\n", tddCfg->nrOfDlSlots);
5932 DU_LOG("Number of DL Symbols %d\n", tddCfg->nrOfDlSymbols);
5933 DU_LOG("Number of UL Slots %d\n", tddCfg->nrOfUlSlots);
5934 DU_LOG("Number of UL Symbols %d\n", tddCfg->nrOfUlSymbols);
5937 DU_LOG("\n ** MAC Cell Configuration : Precoding Configuration ** \n");
5938 precodCfg = &macCellCfg->precodingConf;
5939 DU_LOG("Number of Layers %d\n", precodCfg->numLayers);
5940 DU_LOG("Number of Antenna Ports %d\n", precodCfg->numAntPorts);
5942 DU_LOG("\n ** MAC Cell Config : BEAM FORMING CFG ** \n");
5943 beamFormingCfg = &macCellCfg ->beamCfg;
5944 DU_LOG("Number of Beams %d\n", beamFormingCfg->numOfBeams);
5945 DU_LOG("Number of Tx RUs %d\n", beamFormingCfg->numTxRUs);
5946 DU_LOG("Beam Index %d\n", beamFormingCfg->beamIdx);
5947 DU_LOG("Beam Type %d\n", beamFormingCfg->beamType);
5948 DU_LOG("Beam Azimuth %d\n", beamFormingCfg->beamAzimuth);
5949 DU_LOG("Beam Tilt %d\n", beamFormingCfg->beamTilt);
5950 DU_LOG("Beam Horizontal Width %d\n", beamFormingCfg->beamHorizWidth);
5951 DU_LOG("Beam Vertical Width %d\n", beamFormingCfg->beamVertWidth);
5952 DU_LOG("Coverage Shape %d\n", beamFormingCfg->coverageShape);
5953 DU_LOG("Digitak Tilt %d\n",beamFormingCfg ->digitalTilt);
5954 DU_LOG("Digital Azimuth %d\n", beamFormingCfg->digitalAzimuth);
5956 DU_LOG("\n ** SIB1 Configuration ** \n");
5957 sib1Params = &duCfgParam.sib1Params;
5958 DU_LOG("TAC %d\n", sib1Params->tac);
5959 DU_LOG("RANAC %ld\n", sib1Params->ranac);
5960 DU_LOG("Cell ID %d\n", sib1Params->cellIdentity);
5961 DU_LOG("Cell Reserved for Operational Use %ld\n", sib1Params->cellResvdForOpUse);
5962 DU_LOG("Connection Establishment Failure Count %ld\n", sib1Params->connEstFailCnt);
5963 DU_LOG("Connection Establishment Failure Offset Valid %ld\n", sib1Params->connEstFailOffValidity);
5964 DU_LOG("Connection Establishment Failure Offset %ld\n", sib1Params->connEstFailOffset);
5965 DU_LOG("PLMN : mcc[0] %d\n", sib1Params->plmn.mcc[0]);
5966 DU_LOG("PLMN : mcc[1] %d\n", sib1Params->plmn.mcc[1]);
5967 DU_LOG("PLMN : mcc[2] %d\n", sib1Params->plmn.mcc[2]);
5968 DU_LOG("PLMN : mnc[0] %d\n", sib1Params->plmn.mnc[0]);
5969 DU_LOG("PLMN : mnc[1] %d\n", sib1Params->plmn.mnc[1]);
5970 DU_LOG("PLMN : mnc[2] %d\n", sib1Params->plmn.mnc[2]);
5972 DU_LOG("\n ** SIB1 : SI Scheduling Info ** \n");
5973 siSchedInfo = &sib1Params ->siSchedInfo;
5974 DU_LOG("Windown Length %ld\n", siSchedInfo->winLen);
5975 DU_LOG("Broadcast Status %ld\n", siSchedInfo->broadcastSta);
5976 DU_LOG("Periodicity %ld\n", siSchedInfo->preiodicity);
5977 DU_LOG("SIB Type %ld\n", siSchedInfo->sibType);
5978 DU_LOG("SIB Value Tag %ld\n", siSchedInfo->sibValTag);
5980 DU_LOG("\n ** SIB1 : Serving Cell Configuration Common SIB ** \n");
5981 srvCellCfgCmnSib = &sib1Params->srvCellCfgCommSib;
5982 DU_LOG("Subcarrier Spacing %ld\n", srvCellCfgCmnSib->scs);
5983 DU_LOG("SSB Position in Burst %d\n", srvCellCfgCmnSib->ssbPosInBurst);
5984 DU_LOG("SSB Periodicity %ld\n", srvCellCfgCmnSib->ssbPrdServingCell);
5985 DU_LOG("SS PBCH Power %ld\n", srvCellCfgCmnSib->ssPbchBlockPwr);
5987 DU_LOG("\n ** SIB1 : Serving Cell Config Common SIB : DL Config Common ** \n");
5988 dlCfgCmn = &srvCellCfgCmnSib->dlCfg;
5989 DU_LOG("Frequency Band Indicator %ld\n", dlCfgCmn->freqBandInd);
5990 DU_LOG("Offset to Point A %ld\n", dlCfgCmn->offsetToPointA);
5991 DU_LOG("Frequency Location And Bandwidth %ld\n", dlCfgCmn->locAndBw);
5992 DU_LOG("Offset to Point A considering Subcarrier Spacing %ld\n", dlCfgCmn->dlScsCarrier.scsOffset);
5993 DU_LOG("Subcarrier Spacing %ld\n", dlCfgCmn->dlScsCarrier.scs);
5994 DU_LOG("Bandwidth considering Subcarrier Spacing %ld\n", dlCfgCmn->dlScsCarrier.scsBw);
5996 DU_LOG("\n ** SIB1 : Serving Cell Config Common SIB : DL Config Common : PDCCH Config Common ** \n");
5997 pdcchCfgCommon = &dlCfgCmn->pdcchCfg;
5998 if(pdcchCfgCommon->present)
6000 DU_LOG("Control Resource Set Zero Index %ld\n", pdcchCfgCommon->ctrlRsrcSetZero);
6001 DU_LOG("Search Space Zero Index %ld\n", pdcchCfgCommon->searchSpcZero);
6002 DU_LOG("Search Space ID %ld\n", pdcchCfgCommon->searchSpcId);
6003 DU_LOG("Control Resource Set ID %ld\n", pdcchCfgCommon->ctrlRsrcSetId);
6004 DU_LOG("Monitoring Slot Periodicity and Offset Present %d\n", pdcchCfgCommon->monitorSlotPrdAndOffPresent);
6005 DU_LOG("Monitoring Slot Periodicity and Offset %ld\n", pdcchCfgCommon->monitorSlotPrdAndOff);
6006 for (monitoringSymbIdx = 0; monitoringSymbIdx < 2; monitoringSymbIdx++)
6008 DU_LOG("Monitoring Symbols in Slot [%d] %d\n",monitoringSymbIdx, pdcchCfgCommon->monitorSymbolsInSlot[monitoringSymbIdx]);
6010 DU_LOG("Number of Candidates for Aggregation Level_1 %ld\n", pdcchCfgCommon->numCandAggLvl1);
6011 DU_LOG("Number of Candidates for Aggregation Level_2 %ld\n", pdcchCfgCommon->numCandAggLvl2);
6012 DU_LOG("Number of Candidates for Aggregation Level_4 %ld\n", pdcchCfgCommon->numCandAggLvl4);
6013 DU_LOG("Number of Candidates for Aggregation Level_8 %ld\n", pdcchCfgCommon->numCandAggLvl8);
6014 DU_LOG("Number of Candidates for Aggregation Level_16 %ld\n", pdcchCfgCommon->numCandAggLvl16);
6015 DU_LOG("Seach Space Type %d\n", pdcchCfgCommon->searchSpcType);
6016 DU_LOG("Common Search Space DCI Format %d\n", pdcchCfgCommon->commSrchSpcDciFrmt);
6017 DU_LOG("SIB1 Search Space ID %ld\n", pdcchCfgCommon->searchSpcSib1);
6018 DU_LOG("Paging Search Space ID %ld\n", pdcchCfgCommon->pagingSearchSpc);
6019 DU_LOG("RA Search Space ID %ld\n", pdcchCfgCommon->raSearchSpc);
6023 DU_LOG("PDCCH Config Common not Present");
6026 DU_LOG("\n ** SIB1 : Serving Cell Config Common : DL Config Common : PDSCH Config Common ** \n");
6027 pdschCfgCommon = &dlCfgCmn->pdschCfg;
6028 DU_LOG("PDSCH Config Common Present %d\n", pdschCfgCommon->present);
6029 if(pdschCfgCommon->present)
6031 DU_LOG("Number of Time Domain Resource Allocation %d\n", pdschCfgCommon->numTimeDomRsrcAlloc);
6032 for (rsrcIdx = 0; rsrcIdx < pdschCfgCommon->numTimeDomRsrcAlloc; rsrcIdx++)
6034 pdschTimeDomRsrcAlloc = &pdschCfgCommon->timeDomAlloc[rsrcIdx];
6035 DU_LOG("PDSCH Timer Domain Resource Allocation [%d]", rsrcIdx);
6036 DU_LOG("K0 %ld\n", pdschTimeDomRsrcAlloc->k0);
6037 DU_LOG("MappingType %ld\n", pdschTimeDomRsrcAlloc->mapType);
6038 DU_LOG("SLIV %d\n", pdschTimeDomRsrcAlloc->sliv);
6043 DU_LOG("PDSCH Config Common not Present");
6046 DU_LOG("\n ** SIB1 : Serving Cell Config Common : DL Config Common : BCCH Config Common ** \n");
6047 bcchCfg = &dlCfgCmn->bcchCfg;
6048 DU_LOG("Modification Period Coefficient %ld\n", bcchCfg->modPrdCoeff);
6050 DU_LOG("\n ** SIB1 : Serving Cell Config Common : DL Config Common : PCCH Config Common ** \n");
6051 pcchCfg = &dlCfgCmn->pcchCfg;
6052 DU_LOG("Default Paging Cycle %d\n", pcchCfg->dfltPagingCycle);
6053 DU_LOG("Number of PF in Paging Cycle %d\n", pcchCfg->nAndPagingFrmOffsetType);
6054 DU_LOG("PF Offset %d\n", pcchCfg->pageFrameOffset);
6055 DU_LOG("NS - Number of P0 in PF %d\n", pcchCfg->ns);
6056 DU_LOG("First PDCCH Monitoring Occassion of each P0 Type %d\n", pcchCfg->firstPDCCHMontioringType);
6057 for (poIdx = 0; poIdx < MAX_PO_PER_PF; poIdx++)
6059 DU_LOG("First PDCCH Monitoring Occassion in P0 [%d] %d\n", poIdx, pcchCfg->firstPDCCHMontioringInfo[poIdx]);
6062 DU_LOG("\n ** SIB1 : Serving Cell Config Common : UL Config Common ** \n");
6063 ulCfgCmn = &srvCellCfgCmnSib->ulCfg;
6064 DU_LOG("Frequency Band Indicator %ld\n", ulCfgCmn->freqBandInd);
6065 DU_LOG("Maximum Transmission Power %ld\n", ulCfgCmn->pMax);
6066 DU_LOG("Frequency Location and Bandwidth %ld\n", ulCfgCmn->locAndBw);
6067 DU_LOG("Time Alignment Timer %ld\n", ulCfgCmn->timeAlignTimerComm);
6068 DU_LOG("Offset to Point A considering Subcarrier Spacing %ld\n", ulCfgCmn->ulScsCarrier.scsOffset);
6069 DU_LOG("Subcarrier Spacing %ld\n", ulCfgCmn->ulScsCarrier.scs);
6070 DU_LOG("Carrier BW considering Subcarrier Spacing %ld\n", ulCfgCmn->ulScsCarrier.scsBw);
6072 DU_LOG("\n ** SIB1 : Serving Cell Config Common : UL Config Common : RACH Config Common ** \n");
6073 rachCfgCmn = &ulCfgCmn ->rachCfg;
6074 if(rachCfgCmn->present)
6076 DU_LOG("PRACH Configuration Index %ld\n", rachCfgCmn->prachCfgIdx);
6077 DU_LOG("Number of PRACH FDM %ld\n", rachCfgCmn->msg1Fdm);
6078 DU_LOG("PRACH Frequeny Start Offset %ld\n", rachCfgCmn->msg1FreqStart);
6079 DU_LOG("Zero Correaltion Zone Configuration %ld\n", rachCfgCmn->zeroCorrZoneCfg);
6080 DU_LOG("Target Power Level of Received Preamble %ld\n", rachCfgCmn->preambleRcvdTgtPwr);
6081 DU_LOG("Maximum number of Preamble Transmission %ld\n", rachCfgCmn->preambleTransMax);
6082 DU_LOG("Power Ramping Step %ld\n", rachCfgCmn->pwrRampingStep);
6083 DU_LOG("RA Response Window %ld\n", rachCfgCmn->raRspWindow);
6084 DU_LOG("Total Number of RA Preambles %ld\n", rachCfgCmn->numRaPreamble);
6085 DU_LOG("Number of SSB per RACH Occassion %ld\n", rachCfgCmn->numSsbPerRachOcc);
6086 DU_LOG("Number of Contention Based Preamble per SSB %ld\n", rachCfgCmn->numCbPreamblePerSsb);
6087 DU_LOG("Contention Resolution Timer %ld\n", rachCfgCmn->contResTimer);
6088 DU_LOG("RSRP Threshold %ld\n", rachCfgCmn->rsrpThreshSsb);
6089 DU_LOG("Root Sequence Index Present %d\n", rachCfgCmn->rootSeqIdxPresent);
6090 DU_LOG("Root Sequence Index %ld\n", rachCfgCmn->rootSeqIdx);
6091 DU_LOG("Subcarrier Spacing %ld\n", rachCfgCmn->msg1Scs);
6092 DU_LOG("Restricted Set Configuration %ld\n", rachCfgCmn->restrictedSetCfg);
6096 DU_LOG("RACH Config Common not present\n");
6099 DU_LOG("\n ** SIB1 : Serving Cell Config Common : UL Config Common : PUSCH Config Common ** \n");
6100 puschCfgCommon = &ulCfgCmn ->puschCfg;
6101 if(puschCfgCommon->puschCfgPresent)
6103 DU_LOG("MSG3 Delta from RACH Preamble %ld\n", puschCfgCommon->msg3DeltaPreamble);
6104 DU_LOG("P0 Nominal With Grant %ld\n", puschCfgCommon->p0NominalWithGrant);
6105 DU_LOG("Number of Time Domain Resource Allocation %d\n", puschCfgCommon->numTimeDomRsrcAlloc);
6106 for(rsrcIdx = 0; rsrcIdx < puschCfgCommon->numTimeDomRsrcAlloc; rsrcIdx++)
6108 puschCmnTimeDomRsrsAlloc = &puschCfgCommon ->timeDomAllocList[rsrcIdx];
6109 DU_LOG("Time Domain Resource Alloc [%d]", rsrcIdx);
6110 DU_LOG("\tK2 %ld\n", puschCmnTimeDomRsrsAlloc->k2);
6111 DU_LOG("\tMapping Type %ld\n", puschCmnTimeDomRsrsAlloc->mapType);
6112 DU_LOG("\tSLIV %d\n", puschCmnTimeDomRsrsAlloc->sliv);
6117 DU_LOG("PUSCH Config Common not present\n");
6120 DU_LOG("\n ** SIB1 : Serving Cell Config Common : UL Config Common : PUCCH Config Common **\n");
6121 pucchCfgCommon = &ulCfgCmn->pucchCfg;
6122 if(pucchCfgCommon->present)
6124 DU_LOG("Resource Common %ld\n", pucchCfgCommon->rsrcComm);
6125 DU_LOG("Group Hopping %ld\n", pucchCfgCommon->grpHop);
6126 DU_LOG("P0 Nominal %ld\n", pucchCfgCommon->p0Nominal);
6130 DU_LOG("PUCCH Config Common not present\n");
6133 DU_LOG("\n ** SIB1 : Serving Cell Config Common : TDD UL DL Config Common ** \n");
6134 tddUlDlCfgCmn = &srvCellCfgCmnSib->tddCfg;
6135 DU_LOG("Reference Subcarrier Spacing %ld\n", tddUlDlCfgCmn->refScs);
6136 DU_LOG("Transmission Periodicity %ld\n", tddUlDlCfgCmn->txPrd);
6137 DU_LOG("Number of DL Slots %ld\n", tddUlDlCfgCmn->numDlSlots);
6138 DU_LOG("Number of DL Symbols %ld\n", tddUlDlCfgCmn->numDlSymbols);
6139 DU_LOG("Number of UL Slots %ld\n", tddUlDlCfgCmn->numUlSlots);
6140 DU_LOG("Number of UL Symbols %ld\n", tddUlDlCfgCmn->numUlSymbols);
6142 DU_LOG("\n ** MAC SLICE CONFIG REQUEST ** \n");
6143 macSliceCfg = &duCfgParam.tempSliceCfg;
6144 DU_LOG("Number of RRM Policy %d\n",macSliceCfg->numOfRrmPolicy);
6146 for(policyIdx = 0; policyIdx < macSliceCfg->numOfRrmPolicy; policyIdx++)
6148 rrmPolicy = macSliceCfg->listOfRrmPolicy[policyIdx];
6149 DU_LOG("RRM Policy [%d]\n", policyIdx);
6150 DU_LOG("\tResource Type %d\n", rrmPolicy->resourceType);
6152 rrmPolicyRatio = &rrmPolicy ->policyRatio;
6153 DU_LOG("\tPolicy Maximum Ratio %d\n", rrmPolicyRatio->maxRatio);
6154 DU_LOG("\tPolicy Minimum Ratio %d\n", rrmPolicyRatio->minRatio);
6155 DU_LOG("\tPolicy Deidcated Ration %d\n", rrmPolicyRatio->dedicatedRatio);
6156 DU_LOG("\tNumber of RRM Policy Member %d\n", rrmPolicy->numOfRrmPolicyMem);
6158 for(memIdx = 0; memIdx < rrmPolicy->numOfRrmPolicyMem; memIdx++)
6160 rrmPolicyMemberList = rrmPolicy->rRMPolicyMemberList[memIdx];
6161 DU_LOG("\tRRM Policy Member [%d]\n", memIdx);
6162 DU_LOG("\t\tPLMN : mcc[0] %d\n", rrmPolicyMemberList->plmn.mcc[0]);
6163 DU_LOG("\t\tPLMN : mcc[1] %d\n", rrmPolicyMemberList->plmn.mcc[1]);
6164 DU_LOG("\t\tPLMN : mcc[2] %d\n", rrmPolicyMemberList->plmn.mcc[2]);
6165 DU_LOG("\t\tPLMN : mnc[0] %d\n", rrmPolicyMemberList->plmn.mnc[0]);
6166 DU_LOG("\t\tPLMN : mnc[1] %d\n", rrmPolicyMemberList->plmn.mnc[1]);
6167 DU_LOG("\t\tPLMN : mnc[2] %d\n", rrmPolicyMemberList->plmn.mnc[2]);
6168 DU_LOG("\t\tSST %d\n",rrmPolicyMemberList->snssai.sst);
6169 DU_LOG("\t\tSD %d %d %d\n",rrmPolicyMemberList->snssai.sd[0],rrmPolicyMemberList->snssai.sd[1],rrmPolicyMemberList->snssai.sd[2]);
6174 /**********************************************************************
6176 **********************************************************************/