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 = TOTAL_PRB_20MHZ_MU0; /* 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 = TOTAL_PRB_20MHZ_MU0; /* 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_GROUP_HOPPING;
332 /*Note: Static Configuration, when O1 is not configuring the RRM policy*/
333 RrmPolicyList rrmPolicy;
335 rrmPolicy.resourceType = PRB;
336 rrmPolicy.rRMMemberNum = 1;
337 memcpy(rrmPolicy.rRMPolicyMemberList[0].mcc,duCfgParam.macCellCfg.cellCfg.plmnInfoList[0].plmn.mcc, 3*sizeof(uint8_t));
338 memcpy(rrmPolicy.rRMPolicyMemberList[0].mnc,duCfgParam.macCellCfg.cellCfg.plmnInfoList[0].plmn.mnc, 3*sizeof(uint8_t));
339 rrmPolicy.rRMPolicyMemberList[0].sst = 1;
340 rrmPolicy.rRMPolicyMemberList[0].sd[0] = 2;
341 rrmPolicy.rRMPolicyMemberList[0].sd[1] = 3;
342 rrmPolicy.rRMPolicyMemberList[0].sd[2] = 4;
343 rrmPolicy.rRMPolicyMaxRatio = 90;
344 rrmPolicy.rRMPolicyMinRatio = 30;
345 rrmPolicy.rRMPolicyDedicatedRatio = 10;
347 cpyRrmPolicyInDuCfgParams(&rrmPolicy, 1, &duCfgParam.tempSliceCfg);
354 /*******************************************************************
356 * @brief Configures the DU Parameters
360 * Function : fillDuPort
363 * - fills the DU Ports.
365 * @params[in] duPort array to be filled
366 * @return ROK - success
369 * ****************************************************************/
370 uint8_t fillDuPort(uint16_t *duPort)
374 duPort[F1_INTERFACE] = g_cfg.DU_Port;
375 duPort[E2_INTERFACE] = g_cfg.RIC_Port;
377 duPort[F1_INTERFACE] = F1_SCTP_PORT; /* DU Port idx 0 38472 */
378 duPort[E2_INTERFACE] = E2_SCTP_PORT; /* RIC Port idx 1 36421 */
383 /*******************************************************************
385 * @brief Configures the DU Parameters
389 * Function : calcSliv
392 * - calculate SLIV value from start and length field
394 * @params[in] start symbol
395 * @params[in] length of symbols
398 * ****************************************************************/
399 uint16_t calcSliv(uint8_t startSymbol, uint8_t lengthSymbol)
402 if((lengthSymbol-1) <= 7)
404 sliv = NUM_SYMBOLS_PER_SLOT * (lengthSymbol-1) + startSymbol;
408 sliv = NUM_SYMBOLS_PER_SLOT * (NUM_SYMBOLS_PER_SLOT - lengthSymbol + 1) \
409 + (NUM_SYMBOLS_PER_SLOT - 1 - startSymbol);
415 /*******************************************************************
417 * @brief Configures serving cell config common in sib1
421 * Function : fillServCellCfgCommSib
424 * - fills Serving cell config common for SIB1
426 * @params[in] SrvCellCfgCommSib pointer
427 * @return ROK - success
430 ** ****************************************************************/
431 uint8_t fillServCellCfgCommSib(SrvCellCfgCommSib *srvCellCfgComm)
433 PdcchCfgCommon pdcchCfg;
434 PdschCfgCommon pdschCfg;
436 RachCfgCommon rachCfg;
437 PuschCfgCommon puschCfg;
438 PucchCfgCommon pucchCfg;
439 TddUlDlCfgCommon tddCfg;
442 srvCellCfgComm->scs = convertScsValToScsEnum(cellParams.ssbSubCarrierSpacing);
444 srvCellCfgComm->scs = NR_SCS;
447 /* Configuring DL Config Common for SIB1*/
448 srvCellCfgComm->dlCfg.freqBandInd = NR_FREQ_BAND;
449 srvCellCfgComm->dlCfg.offsetToPointA = OFFSET_TO_POINT_A;
451 srvCellCfgComm->dlCfg.dlScsCarrier.scsOffset = cellParams.ssbOffset;
452 srvCellCfgComm->dlCfg.dlScsCarrier.scs = convertScsValToScsEnum(cellParams.ssbSubCarrierSpacing);
453 srvCellCfgComm->dlCfg.dlScsCarrier.scsBw = cellParams.bSChannelBwUL;
455 srvCellCfgComm->dlCfg.dlScsCarrier.scsOffset = SSB_SUBCARRIER_OFFSET;
456 srvCellCfgComm->dlCfg.dlScsCarrier.scs = NR_SCS;
457 srvCellCfgComm->dlCfg.dlScsCarrier.scsBw = NR_BANDWIDTH;
459 srvCellCfgComm->dlCfg.locAndBw = FREQ_LOC_BW;
461 /* Configuring PDCCH Config Common For SIB1 */
462 pdcchCfg.present = BWP_DownlinkCommon__pdcch_ConfigCommon_PR_setup;
463 pdcchCfg.ctrlRsrcSetZero = CORESET_0_INDEX;
464 pdcchCfg.searchSpcZero = SEARCHSPACE_0_INDEX;
465 pdcchCfg.searchSpcId = PDCCH_SEARCH_SPACE_ID;
466 pdcchCfg.ctrlRsrcSetId = PDCCH_CTRL_RSRC_SET_ID;
467 pdcchCfg.monitorSlotPrdAndOffPresent = SearchSpace__monitoringSlotPeriodicityAndOffset_PR_sl1;
468 //pdcchCfg.monitorSlotPrdAndOff = \
469 SearchSpace__monitoringSlotPeriodicityAndOffset_PR_sl1;
470 pdcchCfg.monitorSymbolsInSlot[0] = 128;
471 pdcchCfg.monitorSymbolsInSlot[1] = 0;
472 pdcchCfg.numCandAggLvl1 = SearchSpace__nrofCandidates__aggregationLevel1_n8;
473 pdcchCfg.numCandAggLvl2 = SearchSpace__nrofCandidates__aggregationLevel2_n4;
474 pdcchCfg.numCandAggLvl4 = SearchSpace__nrofCandidates__aggregationLevel4_n2;
475 pdcchCfg.numCandAggLvl8 = SearchSpace__nrofCandidates__aggregationLevel8_n1;
476 pdcchCfg.numCandAggLvl16 = SearchSpace__nrofCandidates__aggregationLevel16_n0;
477 pdcchCfg.searchSpcType = SearchSpace__searchSpaceType_PR_common;
478 pdcchCfg.commSrchSpcDciFrmt = PDCCH_SERACH_SPACE_DCI_FORMAT;
479 pdcchCfg.searchSpcSib1 = PDCCH_SEARCH_SPACE_ID_SIB1;
480 pdcchCfg.pagingSearchSpc = PDCCH_SEARCH_SPACE_ID_PAGING;
481 pdcchCfg.raSearchSpc = PDCCH_SEARCH_SPACE_ID_PAGING;
482 srvCellCfgComm->dlCfg.pdcchCfg = pdcchCfg;
484 /* Configuring PDSCH Config Common For SIB1 */
485 pdschCfg.present = BWP_DownlinkCommon__pdsch_ConfigCommon_PR_setup;
486 pdschCfg.numTimeDomRsrcAlloc = 2;
487 pdschCfg.timeDomAlloc[0].k0 = PDSCH_K0_CFG1;
488 pdschCfg.timeDomAlloc[0].mapType = PDSCH_TimeDomainResourceAllocation__mappingType_typeA;
489 pdschCfg.timeDomAlloc[0].sliv = calcSliv(PDSCH_START_SYMBOL,PDSCH_LENGTH_SYMBOL);
491 pdschCfg.timeDomAlloc[1].k0 = PDSCH_K0_CFG2;
492 pdschCfg.timeDomAlloc[1].mapType = PDSCH_TimeDomainResourceAllocation__mappingType_typeA;
493 pdschCfg.timeDomAlloc[1].sliv = calcSliv(PDSCH_START_SYMBOL,PDSCH_LENGTH_SYMBOL);
495 srvCellCfgComm->dlCfg.pdschCfg = pdschCfg;
497 /* Configuring BCCH Config for SIB1 */
498 srvCellCfgComm->dlCfg.bcchCfg.modPrdCoeff = BCCH_Config__modificationPeriodCoeff_n16;
500 /* Configuring PCCH Config for SIB1 */
501 pcchCfg.dfltPagingCycle = convertPagingCycleEnumToValue(PagingCycle_rf256);
502 pcchCfg.nAndPagingFrmOffsetType = PCCH_Config__nAndPagingFrameOffset_PR_oneT;
503 pcchCfg.pageFrameOffset = 0;
504 pcchCfg.ns = convertNsEnumToValue(PCCH_Config__ns_one);
505 pcchCfg.firstPDCCHMontioringType = PCCH_Config__firstPDCCH_MonitoringOccasionOfPO_PR_sCS30KHZoneT_SCS15KHZhalfT;
506 memset(pcchCfg.firstPDCCHMontioringInfo, 0, sizeof(uint16_t));
507 pcchCfg.firstPDCCHMontioringInfo[0] = 44;
509 srvCellCfgComm->dlCfg.pcchCfg = pcchCfg;
512 /* Configuring UL Config Common */
514 srvCellCfgComm->ulCfg.ulScsCarrier.scsOffset = cellParams.ssbOffset;
515 srvCellCfgComm->ulCfg.ulScsCarrier.scs = convertScsValToScsEnum(cellParams.ssbSubCarrierSpacing);
516 srvCellCfgComm->ulCfg.ulScsCarrier.scsBw = cellParams.bSChannelBwUL;
518 srvCellCfgComm->ulCfg.ulScsCarrier.scsOffset = SSB_SUBCARRIER_OFFSET;
519 srvCellCfgComm->ulCfg.ulScsCarrier.scs = NR_SCS;
520 srvCellCfgComm->ulCfg.ulScsCarrier.scsBw = NR_BANDWIDTH;
522 srvCellCfgComm->ulCfg.freqBandInd = NR_FREQ_BAND;
523 srvCellCfgComm->ulCfg.pMax = UL_P_MAX;
524 srvCellCfgComm->ulCfg.locAndBw = FREQ_LOC_BW;
525 srvCellCfgComm->ulCfg.timeAlignTimerComm = TimeAlignmentTimer_infinity;
527 /* Configuring RACH Config Common for SIB1 */
528 rachCfg.present = BWP_UplinkCommon__rach_ConfigCommon_PR_setup;
529 rachCfg.prachCfgIdx = PRACH_CONFIG_IDX;
530 rachCfg.msg1Fdm = RACH_ConfigGeneric__msg1_FDM_one;
531 rachCfg.msg1FreqStart = PRACH_FREQ_START;
532 rachCfg.zeroCorrZoneCfg = ZERO_CORRELATION_ZONE_CFG;
533 rachCfg.preambleRcvdTgtPwr = PRACH_PREAMBLE_RCVD_TGT_PWR;
534 rachCfg.preambleTransMax = RACH_ConfigGeneric__preambleTransMax_n200;
535 rachCfg.pwrRampingStep = RACH_ConfigGeneric__powerRampingStep_dB2;
536 rachCfg.raRspWindow = RACH_ConfigGeneric__ra_ResponseWindow_sl10;
537 rachCfg.numRaPreamble = NUM_RA_PREAMBLE;
538 rachCfg.numSsbPerRachOcc = RACH_ConfigCommon__ssb_perRACH_OccasionAndCB_PreamblesPerSSB_PR_one;
539 rachCfg.numCbPreamblePerSsb = CB_PREAMBLE_PER_SSB;
540 rachCfg.contResTimer = RACH_ConfigCommon__ra_ContentionResolutionTimer_sf64;
541 rachCfg.rsrpThreshSsb = RSRP_THRESHOLD_SSB;
542 rachCfg.rootSeqIdxPresent = RACH_ConfigCommon__prach_RootSequenceIndex_PR_l139;
543 rachCfg.rootSeqIdx = ROOT_SEQ_IDX;
544 rachCfg.msg1Scs = PRACH_SUBCARRIER_SPACING ;
545 rachCfg.restrictedSetCfg = PRACH_RESTRICTED_SET_CFG;
546 srvCellCfgComm->ulCfg.rachCfg = rachCfg;
548 /* Configuring PUSCH Config Common for SIB1 */
549 puschCfg.puschCfgPresent = BWP_UplinkCommon__pusch_ConfigCommon_PR_setup;
550 puschCfg.numTimeDomRsrcAlloc = 2;
551 puschCfg.timeDomAllocList[0].k2 = PUSCH_K2_CFG1;
552 puschCfg.timeDomAllocList[0].mapType = PUSCH_TimeDomainResourceAllocation__mappingType_typeA;
553 puschCfg.timeDomAllocList[0].sliv = calcSliv(PUSCH_START_SYMBOL,PUSCH_LENGTH_SYMBOL);
554 puschCfg.timeDomAllocList[1].k2 = PUSCH_K2_CFG2;
555 puschCfg.timeDomAllocList[1].mapType = PUSCH_TimeDomainResourceAllocation__mappingType_typeA;
556 puschCfg.timeDomAllocList[1].sliv = calcSliv(PUSCH_START_SYMBOL,PUSCH_LENGTH_SYMBOL);
557 puschCfg.msg3DeltaPreamble = PUSCH_MSG3_DELTA_PREAMBLE;
558 puschCfg.p0NominalWithGrant = PUSCH_P0_NOMINAL_WITH_GRANT;
559 srvCellCfgComm->ulCfg.puschCfg = puschCfg;
561 /* Configuring PUCCH Config Common for SIB1 */
562 pucchCfg.present = BWP_UplinkCommon__pucch_ConfigCommon_PR_setup;
563 pucchCfg.rsrcComm = PUCCH_RSRC_COMMON;
564 pucchCfg.grpHop = PUCCH_ConfigCommon__pucch_GroupHopping_neither;
565 pucchCfg.p0Nominal = PUCCH_P0_NOMINAL;
566 srvCellCfgComm->ulCfg.pucchCfg = pucchCfg;
568 /* Configuring TDD UL DL config common */
569 tddCfg.refScs = SubcarrierSpacing_kHz30;
570 tddCfg.txPrd = TDD_UL_DL_Pattern__dl_UL_TransmissionPeriodicity_ms5;
571 tddCfg.numDlSlots = NUM_DL_SLOTS;
572 tddCfg.numDlSymbols = NUM_DL_SYMBOLS;
573 tddCfg.numUlSlots = NUM_UL_SLOTS;
574 tddCfg.numUlSymbols = NUM_UL_SYMBOLS;
575 srvCellCfgComm->tddCfg = tddCfg;
577 srvCellCfgComm->ssbPosInBurst = 192;
578 srvCellCfgComm->ssbPrdServingCell = SSB_PERIODICITY;
579 srvCellCfgComm->ssPbchBlockPwr = SSB_PBCH_PWR;
584 /*******************************************************************
586 * @brief Configures the DU Parameters
593 * - Initializes the DuCfg members.
594 * - Calls readMacCfg()
596 * @params[in] system task ID
597 * @return ROK - success
600 * ****************************************************************/
605 uint8_t srvdCellIdx, bandIdx, sliceIdx, plmnIdx, ranFuncIdx, eventTriggerStyleIdx, reportStyleIdx, tnlAssocIdx;
606 uint8_t brdcstPlmnIdx, freqBandIdx, srvdPlmnIdx;
607 uint32_t ipv4_du, ipv4_cu, ipv4_ric;
610 SupportedSliceList *taiSliceSuppLst;
611 uint8_t measurementInfoIdx =0, measurementInfoLen=0;
612 char shortName[] = SHORT_NAME;
613 char serviceModelOID[]= SERVICE_MODEL_OID;
614 char description[] = DESCRIPTION;
615 char event_trigger_style_name[]= EVENT_TRIGGER_STYLE_NAME;
616 char ric_report_style_name[]= REPORT_STYLE_NAME;
619 /* Note: Added these below variable for local testing*/
620 Snssai snssai[NUM_OF_SUPPORTED_SLICE] = {{1,{2,3,4}},{5,{6,7,8}}};
627 if( getStartupConfig(&g_cfg) != ROK )
631 cmInetAddr((S8*)g_cfg.DU_IPV4_Addr, &ipv4_du);
632 cmInetAddr((S8*)g_cfg.CU_IPV4_Addr, &ipv4_cu);
633 cmInetAddr((S8*)g_cfg.RIC_IPV4_Addr, &ipv4_ric);
635 duCfgParam.sctpParams.cuPort = g_cfg.CU_Port;
636 duCfgParam.sctpParams.ricPort = g_cfg.RIC_Port;
638 cmInetAddr((S8*)DU_IP_V4_ADDR, &ipv4_du);
639 cmInetAddr((S8*)CU_IP_V4_ADDR, &ipv4_cu);
640 cmInetAddr((S8*)RIC_IP_V4_ADDR, &ipv4_ric);
642 duCfgParam.sctpParams.cuPort = F1_SCTP_PORT;
643 duCfgParam.sctpParams.ricPort = E2_SCTP_PORT;
646 fillDuPort(duCfgParam.sctpParams.duPort);
648 /* F1 DU IP Address and Port*/
649 duCfgParam.sctpParams.duIpAddr.ipV4Addr = ipv4_du;
651 /* F1 CU IP Address and Port*/
652 duCfgParam.sctpParams.cuIpAddr.ipV4Addr = ipv4_cu;
654 /* Fill RIC Params */
655 duCfgParam.sctpParams.ricIpAddr.ipV4Addr = ipv4_ric;
657 /* EGTP Parameters */
658 duCfgParam.egtpParams.localIp.ipV4Pres = TRUE;
659 duCfgParam.egtpParams.localIp.ipV4Addr = ipv4_du;
660 duCfgParam.egtpParams.localPort = F1_EGTP_PORT;
661 duCfgParam.egtpParams.destIp.ipV4Pres = TRUE;
662 duCfgParam.egtpParams.destIp.ipV4Addr = ipv4_cu;
663 duCfgParam.egtpParams.destPort = F1_EGTP_PORT;
664 duCfgParam.egtpParams.minTunnelId = MIN_TEID;
665 duCfgParam.egtpParams.maxTunnelId = MAX_TEID;
667 duCfgParam.maxUe = 32; //TODO: Check
670 duCfgParam.duId = DU_ID;
671 DU_ALLOC(duCfgParam.duName, sizeof(DU_NAME));
672 if(!duCfgParam.duName)
674 DU_LOG("\nDEBUG --> DU_APP: readCfg(): Memory allocation failure for DU name");
677 strcpy((char*)duCfgParam.duName,DU_NAME);
679 memset(&duCb.e2apDb, 0, sizeof(E2apDb));
680 duCb.e2apDb.e2NodeId = DU_ID;
681 duCb.e2apDb.e2TransInfo.transIdCounter = 0;
683 duCb.e2apDb.numOfTNLAssoc = 1;
684 for(tnlAssocIdx =0; tnlAssocIdx<duCb.e2apDb.numOfTNLAssoc; tnlAssocIdx++)
686 duCb.e2apDb.tnlAssoc[tnlAssocIdx].localIpAddress.ipV4Pres = duCfgParam.sctpParams.duIpAddr.ipV4Pres;
687 duCb.e2apDb.tnlAssoc[tnlAssocIdx].localIpAddress.ipV4Addr = duCfgParam.sctpParams.duIpAddr.ipV4Addr;
688 duCb.e2apDb.tnlAssoc[tnlAssocIdx].localPort = duCfgParam.sctpParams.duPort[E2_INTERFACE];
689 duCb.e2apDb.tnlAssoc[tnlAssocIdx].destIpAddress.ipV4Pres = duCfgParam.sctpParams.ricIpAddr.ipV4Pres;
690 duCb.e2apDb.tnlAssoc[tnlAssocIdx].destIpAddress.ipV4Addr = duCfgParam.sctpParams.ricIpAddr.ipV4Addr;
691 duCb.e2apDb.tnlAssoc[tnlAssocIdx].destPort = duCfgParam.sctpParams.ricPort;
692 duCb.e2apDb.tnlAssoc[tnlAssocIdx].usage = BOTH_FUNCTIONALITY;
694 duCb.e2apDb.numOfRanFunction = 1;
695 for(ranFuncIdx =0; ranFuncIdx<duCb.e2apDb.numOfRanFunction; ranFuncIdx++)
697 duCb.e2apDb.ranFunction[ranFuncIdx].id = ranFuncIdx + 1;
698 memcpy(&duCb.e2apDb.ranFunction[ranFuncIdx].name.shortName, shortName, sizeof(shortName));
699 memcpy(&duCb.e2apDb.ranFunction[ranFuncIdx].name.serviceModelOID, serviceModelOID, sizeof(serviceModelOID));
700 memcpy(&duCb.e2apDb.ranFunction[ranFuncIdx].name.description, description, sizeof(description));
701 duCb.e2apDb.ranFunction[ranFuncIdx].revisionCounter = 0;
703 duCb.e2apDb.ranFunction[ranFuncIdx].numOfEventTriggerStyleSupported = NUM_OF_EVENT_TRIGGER_STYLE_SUPPORTED;
704 for(eventTriggerStyleIdx=0; eventTriggerStyleIdx<duCb.e2apDb.ranFunction[ranFuncIdx].numOfEventTriggerStyleSupported; eventTriggerStyleIdx++)
706 duCb.e2apDb.ranFunction[ranFuncIdx].eventTriggerStyleList[eventTriggerStyleIdx].styleType = EVENT_TRIGGER_STYLE_TYPE;
707 duCb.e2apDb.ranFunction[ranFuncIdx].eventTriggerStyleList[eventTriggerStyleIdx].formatType = EVENT_TRIGGER_STYLE_FORMAT_TYPE;
708 memcpy(duCb.e2apDb.ranFunction[ranFuncIdx].eventTriggerStyleList[eventTriggerStyleIdx].name, event_trigger_style_name, sizeof(event_trigger_style_name));
711 duCb.e2apDb.ranFunction[ranFuncIdx].numOfReportStyleSupported= NUM_OF_RIC_REPORT_STYLE_SUPPORTED;
712 for(reportStyleIdx=0; reportStyleIdx<duCb.e2apDb.ranFunction[ranFuncIdx].numOfReportStyleSupported; reportStyleIdx++)
714 duCb.e2apDb.ranFunction[ranFuncIdx].reportStyleList[reportStyleIdx].reportStyle.styleType = REPORT_STYLE_TYPE;
715 duCb.e2apDb.ranFunction[ranFuncIdx].reportStyleList[reportStyleIdx].reportStyle.formatType = REPORT_ACTION_FORMAT_TYPE;
716 memcpy(duCb.e2apDb.ranFunction[ranFuncIdx].reportStyleList[reportStyleIdx].reportStyle.name, ric_report_style_name, sizeof(ric_report_style_name));
718 for(measurementInfoIdx =0; measurementInfoIdx<NUM_OF_MEASUREMENT_INFO_SUPPORTED(CONFIG_ADD); measurementInfoIdx++)
720 measurementInfoLen= strlen(MEASUREMENT_TYPE_NAME[measurementInfoIdx]);
721 MeasurementInfoForAction *measurementInfoForAction;
722 DU_ALLOC(measurementInfoForAction, sizeof(MeasurementInfoForAction));
723 if(measurementInfoForAction)
725 measurementInfoForAction->measurementTypeId = measurementInfoIdx+1;
726 memcpy(measurementInfoForAction->measurementTypeName, MEASUREMENT_TYPE_NAME[measurementInfoIdx], measurementInfoLen+1);
728 DU_ALLOC(node, sizeof(CmLList));
731 node->node = (PTR) measurementInfoForAction;
732 cmLListAdd2Tail(&duCb.e2apDb.ranFunction[ranFuncIdx].reportStyleList[reportStyleIdx].measurementInfoList, node);
737 DU_FREE(measurementInfoForAction, sizeof(MeasurementInfoForAction));
742 duCb.e2apDb.ranFunction[ranFuncIdx].ricIndicationHeaderFormat = RIC_INDICATION_HEADER_FORMAT;
743 duCb.e2apDb.ranFunction[ranFuncIdx].ricIndicationMessageFormat = RIC_INDICATION_MESSAGE_FORMAT;
745 cmLListInit(&duCb.e2apDb.ranFunction[ranFuncIdx].subscriptionList);
747 memset(duCb.e2apDb.e2TransInfo.e2InitTransaction, 0, MAX_NUM_TRANSACTION * sizeof(E2TransInfo));
748 memset(duCb.e2apDb.e2TransInfo.ricInitTransaction, 0, MAX_NUM_TRANSACTION * sizeof(E2TransInfo));
751 mib.sysFrmNum = SYS_FRAME_NUM;
753 mib.subCarrierSpacingCommon = MIB__subCarrierSpacingCommon_scs30or120;
755 mib.subCarrierSpacingCommon = MIB__subCarrierSpacingCommon_scs15or60;
757 mib.ssb_SubcarrierOffset = SSB_SC_OFFSET; //Kssb
758 mib.dmrs_TypeA_Position = MIB__dmrs_TypeA_Position_pos2;
759 mib.controlResourceSetZero = CORESET_0_INDEX;
760 mib.searchSpaceZero = SEARCHSPACE_0_INDEX;
761 mib.cellBarred = MIB__cellBarred_notBarred;
762 mib.intraFreqReselection = MIB__intraFreqReselection_notAllowed;
763 duCfgParam.mibParams = mib;
766 memset(&sib1.plmn, 0, sizeof(Plmn));
767 sib1.plmn.mcc[0] = PLMN_MCC0;
768 sib1.plmn.mcc[1] = PLMN_MCC1;
769 sib1.plmn.mcc[2] = PLMN_MCC2;
770 sib1.plmn.mnc[0] = PLMN_MNC0;
771 sib1.plmn.mnc[1] = PLMN_MNC1;
772 sib1.ranac = DU_RANAC;
775 sib1.tac = cellParams.nRTAC;
776 sib1.cellIdentity = CELL_IDENTITY * cellParams.cellLocalId;
777 DU_LOG("\nDEBUG --> DU_APP: readCfg(): OAM CellLocalId=%d", \
781 sib1.cellIdentity = CELL_IDENTITY * NR_CELL_ID;
783 sib1.cellResvdForOpUse = PLMN_IdentityInfo__cellReservedForOperatorUse_notReserved;
784 sib1.connEstFailCnt = ConnEstFailureControl__connEstFailCount_n3;
785 sib1.connEstFailOffValidity = ConnEstFailureControl__connEstFailOffsetValidity_s900;
786 sib1.connEstFailOffset = 15;
787 sib1.siSchedInfo.winLen = SI_SchedulingInfo__si_WindowLength_s5;
788 sib1.siSchedInfo.broadcastSta = SchedulingInfo__si_BroadcastStatus_broadcasting;
789 sib1.siSchedInfo.preiodicity = SchedulingInfo__si_Periodicity_rf8;
790 sib1.siSchedInfo.sibType = SIB_TypeInfo__type_sibType2;
791 sib1.siSchedInfo.sibValTag = SIB1_VALUE_TAG;
793 fillServCellCfgCommSib(&sib1.srvCellCfgCommSib);
795 duCfgParam.sib1Params = sib1;
797 for(srvdCellIdx=0; srvdCellIdx<DEFAULT_CELLS; srvdCellIdx++)
799 memset(&duCfgParam.srvdCellLst[srvdCellIdx].duCellInfo.cellInfo.nrCgi.plmn, 0, sizeof(Plmn));
800 duCfgParam.srvdCellLst[srvdCellIdx].duCellInfo.cellInfo.nrCgi.plmn.mcc[0] = PLMN_MCC0;
801 duCfgParam.srvdCellLst[srvdCellIdx].duCellInfo.cellInfo.nrCgi.plmn.mcc[1] = PLMN_MCC1;
802 duCfgParam.srvdCellLst[srvdCellIdx].duCellInfo.cellInfo.nrCgi.plmn.mcc[2] = PLMN_MCC2;
803 duCfgParam.srvdCellLst[srvdCellIdx].duCellInfo.cellInfo.nrCgi.plmn.mnc[0] = PLMN_MNC0;
804 duCfgParam.srvdCellLst[srvdCellIdx].duCellInfo.cellInfo.nrCgi.plmn.mnc[1] = PLMN_MNC1;
808 duCfgParam.srvdCellLst[srvdCellIdx].duCellInfo.cellInfo.nrPci = cellParams.nRPCI;
810 duCfgParam.srvdCellLst[srvdCellIdx].duCellInfo.cellInfo.nrPci = NR_PCI;
812 /* List of Available PLMN */
813 for(srvdPlmnIdx=0; srvdPlmnIdx<MAX_PLMN; srvdPlmnIdx++)
815 /* As per spec 38.473, Plmn identity consists of 3 digit from mcc
816 * followed by either 2 digit or 3 digits of mnc */
818 memset(&duCfgParam.srvdCellLst[srvdCellIdx].duCellInfo.cellInfo.srvdPlmn[srvdPlmnIdx].plmn, 0,\
821 duCfgParam.srvdCellLst[srvdCellIdx].duCellInfo.cellInfo.srvdPlmn[srvdPlmnIdx].plmn.mcc[0] = cellParams.plmnList[srvdPlmnIdx].mcc[0];
822 duCfgParam.srvdCellLst[srvdCellIdx].duCellInfo.cellInfo.srvdPlmn[srvdPlmnIdx].plmn.mcc[1] = cellParams.plmnList[srvdPlmnIdx].mcc[1];
823 duCfgParam.srvdCellLst[srvdCellIdx].duCellInfo.cellInfo.srvdPlmn[srvdPlmnIdx].plmn.mcc[2] = cellParams.plmnList[srvdPlmnIdx].mcc[2];
824 duCfgParam.srvdCellLst[srvdCellIdx].duCellInfo.cellInfo.srvdPlmn[srvdPlmnIdx].plmn.mnc[0] = cellParams.plmnList[srvdPlmnIdx].mnc[0];
825 duCfgParam.srvdCellLst[srvdCellIdx].duCellInfo.cellInfo.srvdPlmn[srvdPlmnIdx].plmn.mnc[1] = cellParams.plmnList[srvdPlmnIdx].mnc[1];
826 duCfgParam.srvdCellLst[srvdCellIdx].duCellInfo.cellInfo.srvdPlmn[srvdPlmnIdx].plmn.mnc[2] = cellParams.plmnList[srvdPlmnIdx].mnc[2];
828 duCfgParam.srvdCellLst[srvdCellIdx].duCellInfo.cellInfo.srvdPlmn[srvdPlmnIdx].plmn.mcc[0] = PLMN_MCC0;
829 duCfgParam.srvdCellLst[srvdCellIdx].duCellInfo.cellInfo.srvdPlmn[srvdPlmnIdx].plmn.mcc[1] = PLMN_MCC1;
830 duCfgParam.srvdCellLst[srvdCellIdx].duCellInfo.cellInfo.srvdPlmn[srvdPlmnIdx].plmn.mcc[2] = PLMN_MCC2;
831 duCfgParam.srvdCellLst[srvdCellIdx].duCellInfo.cellInfo.srvdPlmn[srvdPlmnIdx].plmn.mnc[0] = PLMN_MNC0;
832 duCfgParam.srvdCellLst[srvdCellIdx].duCellInfo.cellInfo.srvdPlmn[srvdPlmnIdx].plmn.mnc[1] = PLMN_MNC1;
835 /* List of Extended PLMN */
836 for(srvdPlmnIdx=0; srvdPlmnIdx<MAX_PLMN; srvdPlmnIdx++)
838 /* As per spec 38.473, Plmn identity consists of 3 digit from mcc
839 * followed by either 2 digit or 3 digits of mnc */
841 memset(&duCfgParam.srvdCellLst[srvdCellIdx].duCellInfo.cellInfo.srvdPlmn[srvdPlmnIdx].extPlmn, 0, sizeof(Plmn));
842 duCfgParam.srvdCellLst[srvdCellIdx].duCellInfo.cellInfo.srvdPlmn[srvdPlmnIdx].extPlmn.mcc[0] = PLMN_MCC0;
843 duCfgParam.srvdCellLst[srvdCellIdx].duCellInfo.cellInfo.srvdPlmn[srvdPlmnIdx].extPlmn.mcc[1] = PLMN_MCC1;
844 duCfgParam.srvdCellLst[srvdCellIdx].duCellInfo.cellInfo.srvdPlmn[srvdPlmnIdx].extPlmn.mcc[2] = PLMN_MCC2;
845 duCfgParam.srvdCellLst[srvdCellIdx].duCellInfo.cellInfo.srvdPlmn[srvdPlmnIdx].extPlmn.mnc[0] = PLMN_MNC0;
846 duCfgParam.srvdCellLst[srvdCellIdx].duCellInfo.cellInfo.srvdPlmn[srvdPlmnIdx].extPlmn.mnc[1] = PLMN_MNC1;
848 /* List of Supporting Slices */
849 for(srvdPlmnIdx=0; srvdPlmnIdx<MAX_PLMN; srvdPlmnIdx++)
851 taiSliceSuppLst = &duCfgParam.srvdCellLst[srvdCellIdx].duCellInfo.cellInfo.srvdPlmn[srvdPlmnIdx].\
854 /* TODO Calculte the exact number of supported slices once will get
855 * cell configuration from O1 */
856 taiSliceSuppLst->numSupportedSlices = NUM_OF_SUPPORTED_SLICE;
857 if(taiSliceSuppLst->numSupportedSlices > MAX_NUM_OF_SLICE_ITEMS)
859 DU_LOG("\nERROR --> DU_APP: readCfg(): Number of supported slice [%d] is more than 1024",\
860 taiSliceSuppLst->numSupportedSlices);
864 DU_ALLOC(taiSliceSuppLst->snssai, taiSliceSuppLst->numSupportedSlices*sizeof(Snssai*));
865 if(taiSliceSuppLst->snssai == NULLP)
867 DU_LOG("\nERROR --> DU_APP: readCfg():Memory allocation failed");
871 for(sliceIdx=0; sliceIdx<taiSliceSuppLst->numSupportedSlices; sliceIdx++)
873 DU_ALLOC(taiSliceSuppLst->snssai[sliceIdx], sizeof(Snssai));
874 if(taiSliceSuppLst->snssai[sliceIdx] == NULLP)
876 DU_LOG("\nERROR --> DU_APP: readCfg():Memory allocation failed");
880 memcpy(taiSliceSuppLst->snssai[sliceIdx]->sd, cellParams.plmnList[sliceIdx].sd, \
881 SD_SIZE*sizeof(uint8_t));
882 taiSliceSuppLst->snssai[sliceIdx]->sst = cellParams.plmnList[sliceIdx].sst;
884 memcpy(taiSliceSuppLst->snssai[sliceIdx], &snssai[sliceIdx], sizeof(Snssai));
891 /* NR TDD Mode info */
893 duCfgParam.srvdCellLst[srvdCellIdx].duCellInfo.f1Mode.mode.tdd.nrFreqInfo.nrArfcn = cellParams.arfcnUL;
894 duCfgParam.srvdCellLst[srvdCellIdx].duCellInfo.f1Mode.mode.tdd.nrFreqInfo.sulInfo.sulArfcn = cellParams.arfcnSUL;
895 duCfgParam.srvdCellLst[srvdCellIdx].duCellInfo.f1Mode.mode.tdd.nrFreqInfo.sulInfo.sulTxBw.nrScs = convertScsValToScsEnum(cellParams.ssbSubCarrierSpacing);
897 duCfgParam.srvdCellLst[srvdCellIdx].duCellInfo.f1Mode.mode.tdd.nrFreqInfo.nrArfcn = NR_UL_ARFCN;
898 duCfgParam.srvdCellLst[srvdCellIdx].duCellInfo.f1Mode.mode.tdd.nrFreqInfo.sulInfo.sulArfcn = SUL_ARFCN;
899 duCfgParam.srvdCellLst[srvdCellIdx].duCellInfo.f1Mode.mode.tdd.nrFreqInfo.sulInfo.sulTxBw.nrScs = NR_SCS;
901 duCfgParam.srvdCellLst[srvdCellIdx].duCellInfo.f1Mode.mode.tdd.nrFreqInfo.sulInfo.sulTxBw.nrb = NRB_273;
903 for(freqBandIdx=0; freqBandIdx<MAX_NRCELL_BANDS; freqBandIdx++)
905 duCfgParam.srvdCellLst[srvdCellIdx].duCellInfo.f1Mode.mode.tdd.nrFreqInfo.freqBand[freqBandIdx].nrFreqBand =\
907 for(bandIdx=0; bandIdx<MAX_NRCELL_BANDS; bandIdx++)
909 duCfgParam.srvdCellLst[srvdCellIdx].duCellInfo.f1Mode.mode.tdd.nrFreqInfo.freqBand[freqBandIdx].sulBand[bandIdx]\
914 /* NR FDD Mode info */
916 duCfgParam.srvdCellLst[srvdCellIdx].duCellInfo.f1Mode.mode.fdd.ulNrFreqInfo.nrArfcn = cellParams.arfcnUL;
917 duCfgParam.srvdCellLst[srvdCellIdx].duCellInfo.f1Mode.mode.fdd.ulNrFreqInfo.sulInfo.sulArfcn = cellParams.arfcnSUL;
918 duCfgParam.srvdCellLst[srvdCellIdx].duCellInfo.f1Mode.mode.fdd.ulTxBw.nrScs = convertScsValToScsEnum(cellParams.ssbSubCarrierSpacing);
919 duCfgParam.srvdCellLst[srvdCellIdx].duCellInfo.f1Mode.mode.fdd.ulNrFreqInfo.sulInfo.sulTxBw.nrScs = convertScsValToScsEnum(cellParams.ssbSubCarrierSpacing);
920 duCfgParam.srvdCellLst[srvdCellIdx].duCellInfo.f1Mode.mode.fdd.dlNrFreqInfo.nrArfcn = cellParams.arfcnDL;
921 duCfgParam.srvdCellLst[srvdCellIdx].duCellInfo.f1Mode.mode.fdd.dlNrFreqInfo.sulInfo.sulArfcn = cellParams.arfcnSUL;
922 duCfgParam.srvdCellLst[srvdCellIdx].duCellInfo.f1Mode.mode.fdd.dlNrFreqInfo.sulInfo.sulTxBw.nrScs = convertScsValToScsEnum(cellParams.ssbSubCarrierSpacing);
923 duCfgParam.srvdCellLst[srvdCellIdx].duCellInfo.f1Mode.mode.fdd.dlTxBw.nrScs = convertScsValToScsEnum(cellParams.ssbSubCarrierSpacing);
925 duCfgParam.srvdCellLst[srvdCellIdx].duCellInfo.f1Mode.mode.fdd.ulNrFreqInfo.nrArfcn = NR_UL_ARFCN;
926 duCfgParam.srvdCellLst[srvdCellIdx].duCellInfo.f1Mode.mode.fdd.ulNrFreqInfo.sulInfo.sulArfcn = SUL_ARFCN;
927 duCfgParam.srvdCellLst[srvdCellIdx].duCellInfo.f1Mode.mode.fdd.ulTxBw.nrScs = NR_SCS;
928 duCfgParam.srvdCellLst[srvdCellIdx].duCellInfo.f1Mode.mode.fdd.ulNrFreqInfo.sulInfo.sulTxBw.nrScs = NR_SCS;
929 duCfgParam.srvdCellLst[srvdCellIdx].duCellInfo.f1Mode.mode.fdd.dlNrFreqInfo.nrArfcn = NR_DL_ARFCN;
930 duCfgParam.srvdCellLst[srvdCellIdx].duCellInfo.f1Mode.mode.fdd.dlNrFreqInfo.sulInfo.sulArfcn = SUL_ARFCN;
931 duCfgParam.srvdCellLst[srvdCellIdx].duCellInfo.f1Mode.mode.fdd.dlNrFreqInfo.sulInfo.sulTxBw.nrScs = NR_SCS;
932 duCfgParam.srvdCellLst[srvdCellIdx].duCellInfo.f1Mode.mode.fdd.dlTxBw.nrScs = NR_SCS;
934 duCfgParam.srvdCellLst[srvdCellIdx].duCellInfo.f1Mode.mode.fdd.ulNrFreqInfo.sulInfo.sulTxBw.nrb = NRB_106;
935 for(freqBandIdx=0; freqBandIdx<MAX_NRCELL_BANDS; freqBandIdx++)
937 duCfgParam.srvdCellLst[srvdCellIdx].duCellInfo.f1Mode.mode.fdd.ulNrFreqInfo.freqBand[freqBandIdx].\
938 nrFreqBand = NR_FREQ_BAND;
939 for(bandIdx=0; bandIdx<MAX_NRCELL_BANDS; bandIdx++)
941 duCfgParam.srvdCellLst[srvdCellIdx].duCellInfo.f1Mode.mode.fdd.ulNrFreqInfo.freqBand[freqBandIdx].\
942 sulBand[bandIdx] = SUL_BAND;
945 duCfgParam.srvdCellLst[srvdCellIdx].duCellInfo.f1Mode.mode.fdd.dlNrFreqInfo.sulInfo.sulTxBw.nrb = NRB_106;
946 for(freqBandIdx=0; freqBandIdx<MAX_NRCELL_BANDS; freqBandIdx++)
948 duCfgParam.srvdCellLst[srvdCellIdx].duCellInfo.f1Mode.mode.fdd.dlNrFreqInfo.freqBand[freqBandIdx].\
949 nrFreqBand = NR_FREQ_BAND;
950 for(bandIdx=0; bandIdx<MAX_NRCELL_BANDS; bandIdx++)
952 duCfgParam.srvdCellLst[srvdCellIdx].duCellInfo.f1Mode.mode.fdd.dlNrFreqInfo.freqBand[freqBandIdx].\
953 sulBand[bandIdx] = SUL_BAND;
957 duCfgParam.srvdCellLst[srvdCellIdx].duCellInfo.f1Mode.mode.fdd.ulTxBw.nrb = NRB_106;
958 duCfgParam.srvdCellLst[srvdCellIdx].duCellInfo.f1Mode.mode.fdd.dlTxBw.nrb = NRB_106;
961 /*Measurement Config and Cell Config */
962 duCfgParam.srvdCellLst[srvdCellIdx].duCellInfo.measTimeCfgDuration = TIME_CFG;
964 duCfgParam.srvdCellLst[srvdCellIdx].duCellInfo.cellDir = DL_UL;
966 duCfgParam.srvdCellLst[srvdCellIdx].duCellInfo.cellType=CELL_TYPE;
968 /* Broadcast PLMN Identity */
969 for(brdcstPlmnIdx=0; brdcstPlmnIdx<MAX_BPLMN_NRCELL_MINUS_1; brdcstPlmnIdx++)
971 for(plmnIdx=0; plmnIdx<MAX_PLMN; plmnIdx++)
973 memset(&duCfgParam.srvdCellLst[srvdCellIdx].duCellInfo.brdcstPlmnInfo[brdcstPlmnIdx].plmn[plmnIdx],\
975 duCfgParam.srvdCellLst[srvdCellIdx].duCellInfo.brdcstPlmnInfo[brdcstPlmnIdx].plmn[plmnIdx].mcc[0] =\
977 duCfgParam.srvdCellLst[srvdCellIdx].duCellInfo.brdcstPlmnInfo[brdcstPlmnIdx].plmn[plmnIdx].mcc[1] =\
979 duCfgParam.srvdCellLst[srvdCellIdx].duCellInfo.brdcstPlmnInfo[brdcstPlmnIdx].plmn[plmnIdx].mcc[2] =\
981 duCfgParam.srvdCellLst[srvdCellIdx].duCellInfo.brdcstPlmnInfo[brdcstPlmnIdx].plmn[plmnIdx].mnc[0] =\
983 duCfgParam.srvdCellLst[srvdCellIdx].duCellInfo.brdcstPlmnInfo[brdcstPlmnIdx].plmn[plmnIdx].mnc[1] =\
986 /* Extended PLMN List */
987 for(plmnIdx=0; plmnIdx<MAX_PLMN; plmnIdx++)
989 memset(&duCfgParam.srvdCellLst[srvdCellIdx].duCellInfo.brdcstPlmnInfo[brdcstPlmnIdx].\
990 extPlmn[plmnIdx], 0, sizeof(Plmn));
991 duCfgParam.srvdCellLst[srvdCellIdx].duCellInfo.brdcstPlmnInfo[brdcstPlmnIdx].\
992 extPlmn[plmnIdx].mcc[0] = PLMN_MCC0;
993 duCfgParam.srvdCellLst[srvdCellIdx].duCellInfo.brdcstPlmnInfo[brdcstPlmnIdx].\
994 extPlmn[plmnIdx].mcc[1] = PLMN_MCC1;
995 duCfgParam.srvdCellLst[srvdCellIdx].duCellInfo.brdcstPlmnInfo[brdcstPlmnIdx].\
996 extPlmn[plmnIdx].mcc[2] = PLMN_MCC2;
997 duCfgParam.srvdCellLst[srvdCellIdx].duCellInfo.brdcstPlmnInfo[brdcstPlmnIdx].\
998 extPlmn[plmnIdx].mnc[0] = PLMN_MNC0;
999 duCfgParam.srvdCellLst[srvdCellIdx].duCellInfo.brdcstPlmnInfo[brdcstPlmnIdx].\
1000 extPlmn[plmnIdx].mnc[1] = PLMN_MNC1;
1003 duCfgParam.srvdCellLst[srvdCellIdx].duCellInfo.epsTac = cellParams.nRTAC; //TODO : to check and fill
1004 duCfgParam.srvdCellLst[srvdCellIdx].duCellInfo.tac = cellParams.nRTAC;
1005 duCfgParam.srvdCellLst[srvdCellIdx].duCellInfo.brdcstPlmnInfo[brdcstPlmnIdx].tac = cellParams.nRTAC;
1006 duCfgParam.srvdCellLst[srvdCellIdx].duCellInfo.brdcstPlmnInfo[brdcstPlmnIdx].nrCellId = cellParams.cellLocalId;
1008 duCfgParam.srvdCellLst[srvdCellIdx].duCellInfo.epsTac = DU_TAC; //TODO : to check and fill
1009 duCfgParam.srvdCellLst[srvdCellIdx].duCellInfo.tac = DU_TAC;
1010 duCfgParam.srvdCellLst[srvdCellIdx].duCellInfo.brdcstPlmnInfo[brdcstPlmnIdx].tac = DU_TAC;
1011 duCfgParam.srvdCellLst[srvdCellIdx].duCellInfo.brdcstPlmnInfo[brdcstPlmnIdx].nrCellId = NR_CELL_ID;
1013 duCfgParam.srvdCellLst[srvdCellIdx].duCellInfo.brdcstPlmnInfo[brdcstPlmnIdx].ranac = NR_RANAC;
1016 /*gnb DU System Info mib msg*/
1018 DU_ALLOC(duCfgParam.srvdCellLst[srvdCellIdx].duSysInfo.mibMsg, encBufSize);
1019 if(!(duCfgParam.srvdCellLst[srvdCellIdx].duSysInfo.mibMsg))
1021 DU_LOG("\nERROR --> DU APP : Memory allocation failure at readCfg");
1024 memcpy(duCfgParam.srvdCellLst[srvdCellIdx].duSysInfo.mibMsg, encBuf, encBufSize);
1025 duCfgParam.srvdCellLst[srvdCellIdx].duSysInfo.mibLen = encBufSize;
1027 /*gnb DU System Info mib msg*/
1029 DU_ALLOC(duCfgParam.srvdCellLst[srvdCellIdx].duSysInfo.sib1Msg,\
1031 if(!(duCfgParam.srvdCellLst[srvdCellIdx].duSysInfo.sib1Msg))
1033 DU_LOG("\nERROR --> DU APP : Memory allocation failure at readCfg");
1036 memcpy(duCfgParam.srvdCellLst[srvdCellIdx].duSysInfo.sib1Msg,\
1038 duCfgParam.srvdCellLst[srvdCellIdx].duSysInfo.sib1Len = encBufSize;
1042 if(readMacCfg() != ROK)
1044 DU_LOG("\nERROR --> DU_APP : Failed while reading MAC config");
1051 /*******************************************************************
1053 * @brief Copy Slice Cfg in temp structre in duCfgParams
1057 * Function : cpyRrmPolicyInDuCfgParams
1060 * - Copy Slice Cfg in temp structre in duCfgParams
1062 * @params[in] RrmPolicy rrmPolicy[], uint8_t policyNum, uint8_t memberList
1063 * @return ROK - success
1066 * ****************************************************************/
1067 uint8_t cpyRrmPolicyInDuCfgParams(RrmPolicyList rrmPolicy[], uint8_t policyNum, MacSliceCfgReq *tempSliceCfg)
1069 uint8_t policyIdx = 0, memberListIdx = 0;
1072 tempSliceCfg->numOfRrmPolicy = policyNum;
1073 DU_ALLOC_SHRABL_BUF(tempSliceCfg->listOfRrmPolicy, tempSliceCfg->numOfRrmPolicy * sizeof(MacSliceRrmPolicy*));
1074 if(!tempSliceCfg->listOfRrmPolicy)
1076 DU_LOG("\nERROR --> DU APP : Memory allocation failed in cpyRrmPolicyInDuCfgParams");
1080 for(policyIdx = 0; policyIdx<tempSliceCfg->numOfRrmPolicy; policyIdx++)
1082 DU_ALLOC_SHRABL_BUF(tempSliceCfg->listOfRrmPolicy[policyIdx], sizeof(MacSliceRrmPolicy));
1083 if(!tempSliceCfg->listOfRrmPolicy[policyIdx])
1085 DU_LOG("\nERROR --> DU APP : Memory allocation failed in cpyRrmPolicyInDuCfgParams");
1089 tempSliceCfg->listOfRrmPolicy[policyIdx]->resourceType = rrmPolicy[policyIdx].resourceType;
1091 tempSliceCfg->listOfRrmPolicy[policyIdx]->numOfRrmPolicyMem = rrmPolicy[policyIdx].rRMMemberNum;
1093 if(tempSliceCfg->listOfRrmPolicy[policyIdx]->numOfRrmPolicyMem)
1095 DU_ALLOC_SHRABL_BUF(tempSliceCfg->listOfRrmPolicy[policyIdx]->rRMPolicyMemberList,\
1096 tempSliceCfg->listOfRrmPolicy[policyIdx]->numOfRrmPolicyMem * sizeof(RrmPolicyMemberList*));
1098 if(!tempSliceCfg->listOfRrmPolicy[policyIdx]->rRMPolicyMemberList)
1100 DU_LOG("\nERROR --> DU APP : Memory allocation failed in cpyRrmPolicyInDuCfgParams");
1105 for(memberListIdx = 0; memberListIdx<tempSliceCfg->listOfRrmPolicy[policyIdx]->numOfRrmPolicyMem; memberListIdx++)
1107 DU_ALLOC_SHRABL_BUF(tempSliceCfg->listOfRrmPolicy[policyIdx]->rRMPolicyMemberList[memberListIdx], sizeof(RrmPolicyMemberList));
1108 if(!tempSliceCfg->listOfRrmPolicy[policyIdx]->rRMPolicyMemberList[memberListIdx])
1110 DU_LOG("\nERROR --> DU APP : Memory allocation failed in cpyRrmPolicyInDuCfgParams");
1113 memcpy(&tempSliceCfg->listOfRrmPolicy[policyIdx]->rRMPolicyMemberList[memberListIdx]->snssai.sd,\
1114 &rrmPolicy[policyIdx].rRMPolicyMemberList[memberListIdx].sd, 3 * sizeof(uint8_t));
1115 memcpy(&tempSliceCfg->listOfRrmPolicy[policyIdx]->rRMPolicyMemberList[memberListIdx]->snssai.sst,\
1116 &rrmPolicy[policyIdx].rRMPolicyMemberList[memberListIdx].sst, sizeof(uint8_t));
1117 memcpy(&tempSliceCfg->listOfRrmPolicy[policyIdx]->rRMPolicyMemberList[memberListIdx]->plmn.mcc,\
1118 &rrmPolicy[policyIdx].rRMPolicyMemberList[memberListIdx].mcc, 3 * sizeof(uint8_t));
1119 memcpy(&tempSliceCfg->listOfRrmPolicy[policyIdx]->rRMPolicyMemberList[memberListIdx]->plmn.mnc,\
1120 &rrmPolicy[policyIdx].rRMPolicyMemberList[memberListIdx].mnc, 3 * sizeof(uint8_t));
1122 tempSliceCfg->listOfRrmPolicy[policyIdx]->policyRatio.maxRatio = rrmPolicy[policyIdx].rRMPolicyMaxRatio;
1123 tempSliceCfg->listOfRrmPolicy[policyIdx]->policyRatio.minRatio = rrmPolicy[policyIdx].rRMPolicyMinRatio;
1124 tempSliceCfg->listOfRrmPolicy[policyIdx]->policyRatio.dedicatedRatio = rrmPolicy[policyIdx].rRMPolicyDedicatedRatio;
1132 #ifdef XML_BASED_CONFIG
1133 /*******************************************************************
1135 * @brief Fill SCTP Parameters
1139 * Function : parseSctpParams
1141 * Functionality: Fill SCTP Parameters
1143 * @params[in] XML document pointer
1145 * Current node in XML
1146 * Pointer to structure to be filled
1147 * @return ROK - success
1150 * ****************************************************************/
1151 uint8_t parseSctpParams(xmlDocPtr doc, xmlNsPtr ns, xmlNodePtr cur, SctpParams *sctp)
1153 uint8_t max_du_port;
1154 uint16_t f1_sctp_port;
1155 uint16_t e2_sctp_port;
1157 memset(sctp, 0, sizeof(SctpParams));
1158 cur = cur->xmlChildrenNode;
1161 if ((!xmlStrcmp(cur->name, (const xmlChar *)"MAX_DU_PORT")) && (cur->ns == ns))
1163 max_du_port = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
1164 if (max_du_port == 2 )
1166 sctp->duPort[F1_INTERFACE] = f1_sctp_port; /* DU Port idx 0 */
1167 sctp->duPort[E2_INTERFACE] = e2_sctp_port; /* RIC Port idx 1 */
1170 if ((!xmlStrcmp(cur->name, (const xmlChar *)"F1_SCTP_PORT")) && (cur->ns == ns))
1172 f1_sctp_port = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
1174 if ((!xmlStrcmp(cur->name, (const xmlChar *)"E2_SCTP_PORT")) && (cur->ns == ns))
1176 e2_sctp_port = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
1180 sctp->cuPort = g_cfg.CU_Port;
1181 sctp->ricPort = g_cfg.RIC_Port;
1183 sctp->cuPort = f1_sctp_port;
1184 sctp->ricPort = e2_sctp_port;
1191 /*******************************************************************
1193 * @brief Fill EGTP Parameters
1197 * Function : parseEgtpParams
1199 * Functionality: Fill EGTP Parmeters
1201 * @params[in] XML document pointer
1203 * Current node in XML
1204 * Pointer to structure to be filled
1205 * @return ROK - success
1208 * ****************************************************************/
1209 uint8_t parseEgtpParams(xmlDocPtr doc, xmlNsPtr ns, xmlNodePtr cur, F1EgtpParams *egtp)
1211 memset(egtp, 0, sizeof(F1EgtpParams));
1212 cur = cur->xmlChildrenNode;
1215 if ((!xmlStrcmp(cur->name, (const xmlChar *)"LOCAL_F1_EGTP_PORT")) && (cur->ns == ns))
1217 egtp->localPort = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
1219 if ((!xmlStrcmp(cur->name, (const xmlChar *)"DEST_F1_EGTP_PORT")) && (cur->ns == ns))
1221 egtp->destPort = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
1223 if ((!xmlStrcmp(cur->name, (const xmlChar *)"MIN_TEID")) && (cur->ns == ns))
1225 egtp->minTunnelId = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
1232 /*******************************************************************
1234 * @brief Fill MIB configuration
1238 * Function : parseMibParams
1240 * Functionality: Fill MIB configuration
1242 * @params[in] XML document pointer
1244 * Current node in XML
1245 * Pointer to structure to be filled
1246 * @return ROK - success
1249 * ****************************************************************/
1250 uint8_t parseMibParams(xmlDocPtr doc, xmlNsPtr ns, xmlNodePtr cur, MibParams *mib)
1252 memset(mib, 0, sizeof(MibParams));
1253 cur = cur -> xmlChildrenNode;
1256 if ((!xmlStrcmp(cur->name, (const xmlChar *)"SYS_FRAME_NUM")) && (cur->ns == ns))
1258 mib->sysFrmNum = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
1260 if ((!xmlStrcmp(cur->name, (const xmlChar *)"SUB_CARR_SPACE")) && (cur->ns == ns))
1262 mib->subCarrierSpacingCommon = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
1264 if ((!xmlStrcmp(cur->name, (const xmlChar *)"SSB_SC_OFFSET")) && (cur->ns == ns))
1266 mib->ssb_SubcarrierOffset = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
1268 if ((!xmlStrcmp(cur->name, (const xmlChar *)"DMRS_TYPEA_POSITION")) && (cur->ns == ns))
1270 mib->dmrs_TypeA_Position = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
1272 if ((!xmlStrcmp(cur->name, (const xmlChar *)"CORESET_0_INDEX")) && (cur->ns == ns))
1274 mib->controlResourceSetZero = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
1276 if ((!xmlStrcmp(cur->name, (const xmlChar *)"SEARCHSPACE_0_INDEX")) && (cur->ns == ns))
1278 mib->searchSpaceZero = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
1280 if ((!xmlStrcmp(cur->name, (const xmlChar *)"CELL_BARRED")) && (cur->ns == ns))
1282 mib->cellBarred = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
1284 if ((!xmlStrcmp(cur->name, (const xmlChar *)"INTRA_FREQ_RESELECT")) && (cur->ns == ns))
1286 mib->intraFreqReselection = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
1293 /*******************************************************************
1295 * @brief Fill RRC version
1299 * Function : parseF1RrcVersion
1301 * Functionality: Fill RRC version
1303 * @params[in] XML document pointer
1305 * Current node in XML
1306 * Pointer to structure to be filled
1307 * @return ROK - success
1310 * ****************************************************************/
1311 uint8_t parseF1RrcVersion(xmlDocPtr doc, xmlNsPtr ns, xmlNodePtr cur,F1RrcVersion *f1RrcVersion)
1313 memset(f1RrcVersion, 0, sizeof(F1RrcVersion));
1314 cur = cur->xmlChildrenNode;
1317 if((!xmlStrcmp(cur->name, (const xmlChar *)"RRC_VER")) && (cur->ns == ns))
1319 strcpy((char*)f1RrcVersion->rrcVer, (char*)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
1322 if((!xmlStrcmp(cur->name, (const xmlChar *)"EXT_RRC_VER")) && (cur->ns == ns))
1324 f1RrcVersion->extRrcVer = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
1331 /*******************************************************************
1333 * @brief Fill PLMN ID
1337 * Function : parsePlmn
1339 * Functionality: Fill PLMN ID
1341 * @params[in] XML document pointer
1343 * Current node in XML
1344 * Pointer to structure to be filled
1345 * @return ROK - success
1348 * ****************************************************************/
1349 uint8_t parsePlmn(xmlDocPtr doc, xmlNsPtr ns, xmlNodePtr cur, Plmn *plmn)
1351 xmlNodePtr child = NULLP;
1353 memset(plmn, 0, sizeof(Plmn));
1354 cur = cur->xmlChildrenNode;
1357 if ((!xmlStrcmp(cur->name, (const xmlChar *)"MCC")) && (cur->ns == ns))
1359 child = cur->xmlChildrenNode;
1360 while (child != NULL)
1362 if ((!xmlStrcmp(child->name, (const xmlChar *)"plmn_MCC0")) && (child->ns == ns))
1364 plmn->mcc[0] = atoi((char *)xmlNodeListGetString(doc, child->xmlChildrenNode, 1));
1367 if ((!xmlStrcmp(child->name, (const xmlChar *)"plmn_MCC1")) && (child->ns == ns))
1369 plmn->mcc[1] = atoi((char *)xmlNodeListGetString(doc, child->xmlChildrenNode, 1));
1372 if ((!xmlStrcmp(child->name, (const xmlChar *)"plmn_MCC2")) && (child->ns == ns))
1374 plmn->mcc[2] = atoi((char *)xmlNodeListGetString(doc, child->xmlChildrenNode, 1));
1377 child = child->next;
1381 if ((!xmlStrcmp(cur->name, (const xmlChar *)"MNC")) && (cur->ns == ns))
1383 child = cur->xmlChildrenNode;
1384 while (child != NULL)
1386 if ((!xmlStrcmp(child->name, (const xmlChar *)"plmn_MNC0")) && (child->ns == ns))
1388 plmn->mnc[0] = atoi((char *)xmlNodeListGetString(doc, child->xmlChildrenNode, 1));
1391 if ((!xmlStrcmp(child->name, (const xmlChar *)"plmn_MNC1")) && (child->ns == ns))
1393 plmn->mnc[1] = atoi((char *)xmlNodeListGetString(doc, child->xmlChildrenNode, 1));
1396 if ((!xmlStrcmp(child->name, (const xmlChar *)"plmn_MNC2")) && (child->ns == ns))
1398 plmn->mnc[2] = atoi((char *)xmlNodeListGetString(doc, child->xmlChildrenNode, 1));
1401 child = child->next;
1410 /*******************************************************************
1412 * @brief Fill NR CGI
1416 * Function : parseNrCgi
1418 * Functionality: Fill NR CGI
1420 * @params[in] XML document pointer
1422 * Current node in XML
1423 * Pointer to structure to be filled
1424 * @return ROK - success
1427 * ****************************************************************/
1428 uint8_t parseNrCgi(xmlDocPtr doc, xmlNsPtr ns, xmlNodePtr cur, NrEcgi *nrCgi)
1430 memset(nrCgi, 0, sizeof(NrEcgi));
1431 cur = cur->xmlChildrenNode;
1434 if ((!xmlStrcmp(cur->name, (const xmlChar *)"PLMN")) && (cur->ns == ns))
1436 if(parsePlmn(doc, ns, cur, &nrCgi->plmn) != ROK)
1442 if ((!xmlStrcmp(cur->name, (const xmlChar *)"CELL_ID")) && (cur->ns == ns))
1444 nrCgi-> cellId = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
1452 /*******************************************************************
1454 * @brief Fill SNSSAI
1458 * Function : parseSnssai
1460 * Functionality: Fill SNSSAI
1462 * @params[in] XML document pointer
1464 * Current node in XML
1465 * Pointer to structure to be filled
1466 * @return ROK - success
1469 * ****************************************************************/
1470 uint8_t parseSnssai(xmlDocPtr doc, xmlNsPtr ns, xmlNodePtr cur, Snssai *snssai)
1475 memset(snssai, 0, sizeof(Snssai));
1476 cur = cur ->xmlChildrenNode;
1479 if ((!xmlStrcmp(cur->name, (const xmlChar *)"SST")) && (cur->ns == ns))
1481 snssai->sst = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
1484 if ((!xmlStrcmp(cur->name, (const xmlChar *)"SD_SIZE")) && (cur->ns == ns))
1486 child = cur->xmlChildrenNode;
1487 while(child != NULL)
1489 if ((!xmlStrcmp(child->name, (const xmlChar *)"SD")) && (child->ns == ns))
1491 snssai->sd[sdIdx] = atoi((char *)xmlNodeListGetString(doc, child->xmlChildrenNode, 1));
1494 child = child -> next;
1503 /*******************************************************************
1505 * @brief Fill Supported Slice List
1509 * Function : parseSupportedSliceList
1511 * Functionality: Fill Supported Slice List
1513 * @params[in] XML document pointer
1515 * Current node in XML
1516 * Pointer to structure to be filled
1517 * @return ROK - success
1520 * ****************************************************************/
1521 uint8_t parseSupportedSliceList(xmlDocPtr doc, xmlNsPtr ns, xmlNodePtr cur, SupportedSliceList *sliceSuppLst)
1523 uint8_t sliceIdx = 0;
1524 xmlNodePtr child = NULLP;
1525 xmlNodePtr snssaiNode = NULLP;
1527 memset(sliceSuppLst, 0, sizeof(SupportedSliceList));
1528 cur = cur->xmlChildrenNode;
1531 if ((!xmlStrcmp(cur->name, (const xmlChar *)"NUM_SUPPORT_SLICE")) && (cur->ns == ns))
1533 sliceSuppLst->numSupportedSlices = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
1534 if(sliceSuppLst->numSupportedSlices > MAX_NUM_OF_SLICE_ITEMS)
1536 DU_LOG("\nERROR --> DU_APP: %s: Number of supported slice [%d] is more than 1024",\
1537 __func__, sliceSuppLst->numSupportedSlices);
1542 if ((!xmlStrcmp(cur->name, (const xmlChar *)"SNSSAI_LIST")) && (cur->ns == ns))
1544 DU_ALLOC_SHRABL_BUF(sliceSuppLst->snssai, (sliceSuppLst->numSupportedSlices) * sizeof(Snssai*));
1545 if (sliceSuppLst->snssai == NULLP)
1547 DU_LOG("\nERROR --> DU_APP: %s: Memory allocation failed at line %d", __func__, __LINE__);
1551 for (sliceIdx = 0; sliceIdx < sliceSuppLst->numSupportedSlices; sliceIdx++)
1553 DU_ALLOC_SHRABL_BUF(sliceSuppLst->snssai[sliceIdx], sizeof(Snssai));
1554 if (sliceSuppLst->snssai[sliceIdx] == NULLP)
1556 DU_LOG("\nERROR --> DU_APP: %s: Memory allocation failed at line %d", __func__, __LINE__);
1562 memcpy(sliceSuppLst->snssai[sliceIdx]->sd, cellParams.plmnList[sliceIdx].sd, SD_SIZE*sizeof(uint8_t));
1563 sliceSuppLst->snssai[sliceIdx]->sst = cellParams.plmnList[sliceIdx].sst;
1569 child = cur->xmlChildrenNode;
1570 while (child != NULL)
1572 if ((!xmlStrcmp(child->name, (const xmlChar *)"LIST")) && (child->ns == ns))
1575 snssaiNode = child->xmlChildrenNode;
1576 while (snssaiNode != NULL)
1578 if ((!xmlStrcmp(snssaiNode->name, (const xmlChar *)"SNSSAI")) && (snssaiNode->ns == ns))
1580 if(parseSnssai(doc, ns, snssaiNode, sliceSuppLst->snssai[sliceIdx]) != ROK)
1586 snssaiNode = snssaiNode->next;
1589 child = child->next;
1599 /*******************************************************************
1601 * @brief Fill Served PLMN
1605 * Function : parseF1SrvdPlmn
1607 * Functionality: Fill Served PLMN
1609 * @params[in] XML document pointer
1611 * Current node in XML
1612 * Pointer to structure to be filled
1613 * @return ROK - success
1616 * ****************************************************************/
1617 uint8_t parseF1SrvdPlmn(xmlDocPtr doc, xmlNsPtr ns, xmlNodePtr cur, F1SrvdPlmn *srvdPlmn, uint8_t srvdPlmnIdx)
1619 memset(srvdPlmn, 0, sizeof(F1SrvdPlmn));
1620 cur = cur->xmlChildrenNode;
1624 fillPlmnFromO1(&srvdPlmn ->plmn, srvdPlmnIdx);
1626 if ((!xmlStrcmp(cur->name, (const xmlChar *)"PLMN")) && (cur->ns == ns))
1628 if(parsePlmn(doc, ns, cur, &srvdPlmn->plmn) != ROK)
1635 if ((!xmlStrcmp(cur->name, (const xmlChar *)"EXT_PLMN")) && (cur->ns == ns))
1637 if(parsePlmn(doc, ns, cur, &srvdPlmn->extPlmn) != ROK)
1643 if ((!xmlStrcmp(cur->name, (const xmlChar *)"F1_SLICE_SUPP_LST")) && (cur->ns == ns))
1645 if(parseSupportedSliceList(doc, ns, cur, &srvdPlmn->taiSliceSuppLst) != ROK)
1656 /*******************************************************************
1658 * @brief Fill cell information
1662 * Function : parseF1CellInfo
1664 * Functionality: Fill cell information
1666 * @params[in] XML document pointer
1668 * Current node in XML
1669 * Pointer to structure to be filled
1670 * @return ROK - success
1673 * ****************************************************************/
1674 uint8_t parseF1CellInfo(xmlDocPtr doc, xmlNsPtr ns, xmlNodePtr cur, F1CellInfo *f1CellInfo)
1676 memset(f1CellInfo, 0, sizeof(F1CellInfo));
1677 cur = cur->xmlChildrenNode;
1680 if ((!xmlStrcmp(cur->name, (const xmlChar *)"NR_CGI")) && (cur->ns == ns))
1682 if(parseNrCgi(doc, ns, cur, &f1CellInfo->nrCgi) != ROK)
1689 f1CellInfo->nrPci = cellParams.nRPCI;
1691 if ((!xmlStrcmp(cur->name, (const xmlChar *)"NR_PCI")) && (cur->ns == ns))
1693 f1CellInfo->nrPci = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
1697 if ((!xmlStrcmp(cur->name, (const xmlChar *)"F1_SRVD_PLMN")) && (cur->ns == ns))
1699 if(parseF1SrvdPlmn(doc, ns, cur, &f1CellInfo->srvdPlmn[0], 0) != ROK)
1710 /*******************************************************************
1712 * @brief Fill Frequency Band
1716 * Function : parseF1FreqBand
1718 * Functionality: Fill Frequency Band
1720 * @params[in] XML document pointer
1722 * Current node in XML
1723 * Pointer to structure to be filled
1724 * @return ROK - success
1727 * ****************************************************************/
1728 uint8_t parseF1FreqBand(xmlDocPtr doc, xmlNsPtr ns, xmlNodePtr cur, F1FreqBand *freqBand)
1731 uint16_t sulValue = 0;
1733 xmlNodePtr sulChild;
1735 memset(freqBand, 0, sizeof(F1FreqBand));
1736 cur = cur->xmlChildrenNode;
1739 if ((!xmlStrcmp(cur->name, (const xmlChar *)"NR_FREQ_BAND")) && (cur->ns == ns))
1741 freqBand->nrFreqBand = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
1744 if ((!xmlStrcmp(cur->name, (const xmlChar *)"SUL_BAND_LIST")) && (cur->ns == ns))
1746 child = cur->xmlChildrenNode;
1747 while (child != NULL)
1749 if ((!xmlStrcmp(child->name, (const xmlChar *)"LIST")) && (child->ns == ns))
1751 sulChild = child->xmlChildrenNode;
1753 while (sulChild != NULL)
1755 if ((!xmlStrcmp(sulChild->name, (const xmlChar *)"SUL_BAND")) && (sulChild->ns == ns))
1757 sulValue = atoi((char *)xmlNodeListGetString(doc, sulChild->xmlChildrenNode, 1));
1758 if (sulIdx < MAX_NRCELL_BANDS)
1760 freqBand->sulBand[sulIdx] = sulValue;
1765 DU_LOG("ERROR --> DU_APP : %s : SUL_BAND array overflow\n", __func__);
1769 sulChild = sulChild->next;
1772 child = child->next;
1780 /*******************************************************************
1782 * @brief Fill Frequency Band List
1786 * Function : parseF1FreqBandList
1788 * Functionality: Fill Frequency Band List
1790 * @params[in] XML document pointer
1792 * Current node in XML
1793 * Pointer to structure to be filled
1794 * @return ROK - success
1797 * ****************************************************************/
1798 uint8_t parseF1FreqBandList(xmlDocPtr doc, xmlNsPtr ns, xmlNodePtr cur, F1NrFreqInfo *nrFreqInfo)
1803 cur = cur->xmlChildrenNode;
1806 if ((!xmlStrcmp(cur->name, (const xmlChar *)"LIST")) && (cur->ns == ns))
1808 child = cur->xmlChildrenNode;
1809 while(child != NULL)
1811 if ((!xmlStrcmp(child->name, (const xmlChar *)"F1_FREQ_BAND")) && (child->ns == ns))
1813 if(parseF1FreqBand(doc, ns, child, &nrFreqInfo->freqBand[idx]) != ROK)
1819 child = child -> next;
1828 /*******************************************************************
1830 * @brief Fill Transmission Bandwidth
1834 * Function : parseF1TxBw
1836 * Functionality: Fill Transmission Bandwidth
1838 * @params[in] XML document pointer
1840 * Current node in XML
1841 * Pointer to structure to be filled
1842 * @return ROK - success
1845 * ****************************************************************/
1846 uint8_t parseF1TxBw(xmlDocPtr doc, xmlNsPtr ns, xmlNodePtr cur, F1TxBw *txBw)
1848 memset(txBw, 0, sizeof(F1TxBw));
1849 cur = cur->xmlChildrenNode;
1852 if ((!xmlStrcmp(cur->name, (const xmlChar *)"F1_NR_SCS")) && (cur->ns == ns))
1854 txBw->nrScs = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
1857 if ((!xmlStrcmp(cur->name, (const xmlChar *)"F1_NRB")) && (cur->ns == ns))
1859 txBw->nrb = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
1867 /*******************************************************************
1869 * @brief Fill SUL Info
1873 * Function : parseF1SulInfo
1875 * Functionality: Fill SUL Info
1877 * @params[in] XML document pointer
1879 * Current node in XML
1880 * Pointer to structure to be filled
1881 * @return ROK - success
1884 * ****************************************************************/
1885 uint8_t parseF1SulInfo(xmlDocPtr doc, xmlNsPtr ns, xmlNodePtr cur, F1SulInfo *sulInfo)
1887 memset(sulInfo, 0, sizeof(F1SulInfo));
1888 cur = cur->xmlChildrenNode;
1891 if ((!xmlStrcmp(cur->name, (const xmlChar *)"SUL_ARFCN")) && (cur->ns == ns))
1893 sulInfo->sulArfcn = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
1896 if ((!xmlStrcmp(cur->name, (const xmlChar *)"F1_TX_BW")) && (cur->ns == ns))
1898 if(parseF1TxBw(doc, ns, cur, &sulInfo->sulTxBw) != ROK)
1909 /*******************************************************************
1911 * @brief Fill NR Frequency Info
1915 * Function : parseF1NrFreqInfo
1917 * Functionality: Fill NR Frequency Info
1919 * @params[in] XML document pointer
1921 * Current node in XML
1922 * Pointer to structure to be filled
1923 * @return ROK - success
1926 * ****************************************************************/
1927 uint8_t parseF1NrFreqInfo(xmlDocPtr doc, xmlNsPtr ns, xmlNodePtr cur, F1NrFreqInfo *nrFreqInfo)
1929 memset(nrFreqInfo, 0, sizeof(F1NrFreqInfo));
1930 cur = cur->xmlChildrenNode;
1933 if ((!xmlStrcmp(cur->name, (const xmlChar *)"NR_ARFCN")) && (cur->ns == ns))
1935 nrFreqInfo->nrArfcn = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
1938 if ((!xmlStrcmp(cur->name, (const xmlChar *)"F1_SUL_INFO")) && (cur->ns == ns))
1940 if(parseF1SulInfo(doc, ns, cur, &nrFreqInfo->sulInfo) != ROK)
1946 if ((!xmlStrcmp(cur->name, (const xmlChar *)"F1_FREQ_BAND_LIST")) && (cur->ns == ns))
1948 if(parseF1FreqBandList(doc, ns, cur, nrFreqInfo) != ROK)
1959 /*******************************************************************
1961 * @brief Fill NR FDD Info
1965 * Function : parseF1NrFddInfo
1967 * Functionality: Fill NR FDD Info
1969 * @params[in] XML document pointer
1971 * Current node in XML
1972 * Pointer to structure to be filled
1973 * @return ROK - success
1976 * ****************************************************************/
1977 uint8_t parseF1NrFddInfo(xmlDocPtr doc, xmlNsPtr ns, xmlNodePtr cur, F1NrFddInfo *fddInfo)
1979 memset(fddInfo, 0, sizeof(F1NrFddInfo));
1980 cur = cur->xmlChildrenNode;
1983 if ((!xmlStrcmp(cur->name, (const xmlChar *)"F1_NR_FREQ_INFO_UL")) && (cur->ns == ns))
1985 if(parseF1NrFreqInfo(doc, ns, cur, &fddInfo->ulNrFreqInfo) != ROK)
1991 if ((!xmlStrcmp(cur->name, (const xmlChar *)"F1_NR_FREQ_INFO_DL")) && (cur->ns == ns))
1993 if(parseF1NrFreqInfo(doc, ns, cur, &fddInfo->dlNrFreqInfo) != ROK)
1999 if ((!xmlStrcmp(cur->name, (const xmlChar *)"F1_TX_BW_UL")) && (cur->ns == ns))
2001 if(parseF1TxBw(doc, ns, cur, &fddInfo->ulTxBw) != ROK)
2007 if ((!xmlStrcmp(cur->name, (const xmlChar *)"F1_TX_BW_DL")) && (cur->ns == ns))
2009 if(parseF1TxBw(doc, ns, cur, &fddInfo->dlTxBw) != ROK)
2020 /*******************************************************************
2022 * @brief Fill NR TDD Info
2026 * Function : parseF1NrTddInfo
2028 * Functionality: Fill NR TDD Info
2030 * @params[in] XML document pointer
2032 * Current node in XML
2033 * Pointer to structure to be filled
2034 * @return ROK - success
2037 * ****************************************************************/
2038 uint8_t parseF1NrTddInfo(xmlDocPtr doc, xmlNsPtr ns, xmlNodePtr cur, F1NrTddInfo *tddInfo)
2040 memset(tddInfo, 0, sizeof(F1NrTddInfo));
2041 cur = cur->xmlChildrenNode;
2044 if ((!xmlStrcmp(cur->name, (const xmlChar *)"F1_NR_FREQ_INFO")) && (cur->ns == ns))
2046 if(parseF1NrFreqInfo(doc, ns, cur, &tddInfo->nrFreqInfo) != ROK)
2052 if ((!xmlStrcmp(cur->name, (const xmlChar *)"F1_TX_BW")) && (cur->ns == ns))
2054 if(parseF1TxBw(doc, ns, cur, &tddInfo->nrTxBw) != ROK)
2065 /*******************************************************************
2067 * @brief Fill NR Mode Info
2071 * Function : parseNrModeInfo
2073 * Functionality: Fill NR Mode Info
2075 * @params[in] XML document pointer
2077 * Current node in XML
2078 * Pointer to structure to be filled
2079 * @return ROK - success
2082 * ****************************************************************/
2083 uint8_t parseNrModeInfo(xmlDocPtr doc, xmlNsPtr ns, xmlNodePtr cur, NrModeInfo *nrModeInfo)
2087 memset(nrModeInfo, 0, sizeof(NrModeInfo));
2088 cur = cur->xmlChildrenNode;
2091 if ((!xmlStrcmp(cur->name, (const xmlChar *)"NR_MODE")) && (cur->ns == ns))
2093 strcpy((char*)modeCfg, (char*)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
2096 if ((!xmlStrcmp(cur->name, (const xmlChar *)"F1_NR_FDD_INFO")) && (cur->ns == ns))
2098 if(strcmp(modeCfg, "FDD") == 0)
2100 if(parseF1NrFddInfo(doc, ns, cur, &nrModeInfo->mode.fdd) != ROK)
2107 if ((!xmlStrcmp(cur->name, (const xmlChar *)"F1_NR_TDD_INFO")) && (cur->ns == ns))
2109 if(strcmp(modeCfg, "TDD") == 0)
2111 if(parseF1NrTddInfo(doc, ns, cur, &nrModeInfo->mode.tdd) != ROK)
2123 /*******************************************************************
2125 * @brief Fill Broadcast PLMN Information
2129 * Function : parseF1BrdcstPlmnInfo
2131 * Functionality: Fill Broadcast PLMN Information
2133 * @params[in] XML document pointer
2135 * Current node in XML
2136 * Pointer to structure to be filled
2137 * @return ROK - success
2140 * ****************************************************************/
2141 uint8_t parseF1BrdcstPlmnInfo(xmlDocPtr doc, xmlNsPtr ns, xmlNodePtr cur, F1BrdcstPlmnInfo *brdcstPlmnInfo)
2143 memset(brdcstPlmnInfo, 0, sizeof(F1BrdcstPlmnInfo));
2144 cur = cur->xmlChildrenNode;
2147 if ((!xmlStrcmp(cur->name, (const xmlChar *)"PLMN")) && (cur->ns == ns))
2149 if(parsePlmn(doc, ns, cur, &brdcstPlmnInfo->plmn[0]) != ROK)
2155 if ((!xmlStrcmp(cur->name, (const xmlChar *)"EXT_PLMN")) && (cur->ns == ns))
2157 if(parsePlmn(doc, ns, cur, &brdcstPlmnInfo->extPlmn[0]) != ROK)
2163 if ((!xmlStrcmp(cur->name, (const xmlChar *)"TAC")) && (cur->ns == ns))
2165 brdcstPlmnInfo->tac = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
2168 if ((!xmlStrcmp(cur->name, (const xmlChar *)"NR_CELL_ID")) && (cur->ns == ns))
2170 brdcstPlmnInfo->nrCellId = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
2173 if ((!xmlStrcmp(cur->name, (const xmlChar *)"NR_RANAC")) && (cur->ns == ns))
2175 brdcstPlmnInfo->ranac = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
2183 /*******************************************************************
2185 * @brief Fill DU Cell Information
2189 * Function : parseF1DuCellInfo
2191 * Functionality: Fill DU Cell Information
2193 * @params[in] XML document pointer
2195 * Current node in XML
2196 * Pointer to structure to be filled
2197 * @return ROK - success
2200 * ****************************************************************/
2201 uint8_t parseF1DuCellInfo(xmlDocPtr doc, xmlNsPtr ns, xmlNodePtr cur, F1DuCellInfo *duCellInfo)
2203 memset(duCellInfo, 0, sizeof(F1DuCellInfo));
2204 cur = cur->xmlChildrenNode;
2207 if ((!xmlStrcmp(cur->name, (const xmlChar *)"F1_CELL_INFO")) && (cur->ns == ns))
2209 if(parseF1CellInfo(doc, ns, cur, &duCellInfo->cellInfo) != ROK)
2215 if ((!xmlStrcmp(cur->name, (const xmlChar *)"TAC")) && (cur->ns == ns))
2217 duCellInfo->tac = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
2220 if ((!xmlStrcmp(cur->name, (const xmlChar *)"EPS_TAC")) && (cur->ns == ns))
2222 duCellInfo->epsTac = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
2225 if ((!xmlStrcmp(cur->name, (const xmlChar *)"NR_MODE_INFO")) && (cur->ns == ns))
2227 if(parseNrModeInfo(doc, ns, cur, &duCellInfo->f1Mode) != ROK)
2233 if ((!xmlStrcmp(cur->name, (const xmlChar *)"TIME_CFG")) && (cur->ns == ns))
2235 duCellInfo->measTimeCfgDuration = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
2238 if ((!xmlStrcmp(cur->name, (const xmlChar *)"F1_CELL_DIR")) && (cur->ns == ns))
2240 duCellInfo->cellDir = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
2243 if ((!xmlStrcmp(cur->name, (const xmlChar *)"F1_CELL_TYPE")) && (cur->ns == ns))
2245 duCellInfo->cellType = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
2248 if ((!xmlStrcmp(cur->name, (const xmlChar *)"F1_BRDCST_PLMN_INFO")) && (cur->ns == ns))
2250 if(parseF1BrdcstPlmnInfo(doc, ns, cur, &duCellInfo->brdcstPlmnInfo[0]) != ROK)
2261 /*******************************************************************
2263 * @brief Fill DU served cell information
2267 * Function : parseF1DuServedCellInfo
2269 * Functionality: Fill DU served cell information
2271 * @params[in] XML document pointer
2273 * Current node in XML
2274 * Pointer to structure to be filled
2275 * @return ROK - success
2278 * ****************************************************************/
2279 uint8_t parseF1DuServedCellInfo(xmlDocPtr doc, xmlNsPtr ns, xmlNodePtr cur, F1DuSrvdCellInfo *srvdCellInfo)
2281 memset(srvdCellInfo, 0, sizeof(F1DuSrvdCellInfo));
2282 cur = cur->xmlChildrenNode;
2285 if ((!xmlStrcmp(cur->name, (const xmlChar *)"F1_DU_CELL_INFO")) && (cur->ns == ns))
2287 if(parseF1DuCellInfo(doc, ns, cur, &srvdCellInfo->duCellInfo) != ROK)
2295 if(fillDuSrvdCellSysInfo(&srvdCellInfo->duSysInfo) != ROK)
2302 /*******************************************************************
2304 * @brief Fill DU Served Cell System Information
2308 * Function : fillDuSrvdCellSysInfo
2310 * Functionality: Fill DU Served Cell System Information
2312 * @params[in] Served Cell System Information
2313 * @return ROK - success
2316 * ****************************************************************/
2317 uint8_t fillDuSrvdCellSysInfo(F1DuSysInfo *sysInfo)
2319 /* GNB DU System Info MIB msg */
2321 DU_ALLOC(sysInfo->mibMsg, encBufSize);
2322 if(!(sysInfo->mibMsg))
2324 DU_LOG("\nERROR --> DU APP : %s : Memory allocation failure at line %d", __func__, __LINE__);
2327 memcpy(sysInfo->mibMsg, encBuf, encBufSize);
2328 sysInfo->mibLen = encBufSize;
2330 /* GNB DU System Info SIB1 msg */
2332 DU_ALLOC(sysInfo->sib1Msg, encBufSize);
2333 if(!(sysInfo->sib1Msg))
2335 DU_LOG("\nERROR --> DU APP : %s : Memory allocation failure at line %d", __func__, __LINE__);
2338 memcpy(sysInfo->sib1Msg, encBuf,encBufSize);
2339 sysInfo->sib1Len = encBufSize;
2345 /*******************************************************************
2347 * @brief Fill PLMN received from O1 interface
2351 * Function : fillPlmnFromO1
2353 * Functionality: Fill PLMN received from O1 interface
2355 * @params[in] XML document pointer
2357 * Current node in XML
2358 * Pointer to structure to be filled
2359 * @return ROK - success
2362 * ****************************************************************/
2363 void fillPlmnFromO1(Plmn *PLMN, uint8_t srvdPlmnIdx)
2365 PLMN->mcc[0] = cellParams.plmnList[srvdPlmnIdx].mcc[0];
2366 PLMN->mcc[1] = cellParams.plmnList[srvdPlmnIdx].mcc[1];
2367 PLMN->mcc[2] = cellParams.plmnList[srvdPlmnIdx].mcc[2];
2368 PLMN->mnc[0] = cellParams.plmnList[srvdPlmnIdx].mnc[0];
2369 PLMN->mnc[1] = cellParams.plmnList[srvdPlmnIdx].mnc[1];
2370 PLMN->mnc[2] = cellParams.plmnList[srvdPlmnIdx].mnc[2];
2374 /*******************************************************************
2376 * @brief Fill Beamforming Configuration
2380 * Function : parseBeamformingConfig
2382 * Functionality: Fill Beamforming Configuration
2384 * @params[in] XML document pointer
2386 * Current node in XML
2387 * Pointer to structure to be filled
2388 * @return ROK - success
2391 * ****************************************************************/
2392 uint8_t parseBeamformingConfig(xmlDocPtr doc, xmlNsPtr ns, xmlNodePtr cur, BeamformingConf *beamformingCfg)
2394 memset(beamformingCfg, 0, sizeof(BeamformingConf));
2395 cur = cur -> xmlChildrenNode;
2398 if ((!xmlStrcmp(cur->name, (const xmlChar *)"NUM_OF_BEAMS")) && (cur->ns == ns))
2400 beamformingCfg->numOfBeams = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
2403 if ((!xmlStrcmp(cur->name, (const xmlChar *)"NUM_TX_RUS")) && (cur->ns == ns))
2405 beamformingCfg->numTxRUs = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
2408 if ((!xmlStrcmp(cur->name, (const xmlChar *)"BEAM_IDX")) && (cur->ns == ns))
2410 beamformingCfg->beamIdx = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
2413 if ((!xmlStrcmp(cur->name, (const xmlChar *)"BEAM_TYPE")) && (cur->ns == ns))
2415 beamformingCfg->beamType = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
2418 if ((!xmlStrcmp(cur->name, (const xmlChar *)"BEAM_AZIMUTH")) && (cur->ns == ns))
2420 beamformingCfg->beamAzimuth = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
2423 if ((!xmlStrcmp(cur->name, (const xmlChar *)"BEAM_TILT")) && (cur->ns == ns))
2425 beamformingCfg->beamTilt = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
2428 if ((!xmlStrcmp(cur->name, (const xmlChar *)"BEAM_HORIZ_WIDTH")) && (cur->ns == ns))
2430 beamformingCfg->beamHorizWidth = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
2433 if ((!xmlStrcmp(cur->name, (const xmlChar *)"BEAM_VERT_WIDTH")) && (cur->ns == ns))
2435 beamformingCfg->beamVertWidth = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
2438 if ((!xmlStrcmp(cur->name, (const xmlChar *)"COVER_SHAPE")) && (cur->ns == ns))
2440 beamformingCfg->coverageShape = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
2443 if ((!xmlStrcmp(cur->name, (const xmlChar *)"DIGI_TILT")) && (cur->ns == ns))
2445 beamformingCfg->digitalTilt = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
2448 if ((!xmlStrcmp(cur->name, (const xmlChar *)"DIGI_AZIMUTH")) && (cur->ns == ns))
2450 beamformingCfg->digitalAzimuth = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
2458 /*******************************************************************
2460 * @brief Fill Precoding Configuration
2464 * Function : parsePrecodingConfig
2466 * Functionality: Fill Precoding Configuration
2468 * @params[in] XML document pointer
2470 * Current node in XML
2471 * Pointer to structure to be filled
2472 * @return ROK - success
2475 * ****************************************************************/
2476 uint8_t parsePrecodingConfig(xmlDocPtr doc, xmlNsPtr ns, xmlNodePtr cur, PrecodingConf *precodCfg)
2478 memset(precodCfg, 0, sizeof(PrecodingConf));
2479 cur = cur -> xmlChildrenNode;
2482 if ((!xmlStrcmp(cur->name, (const xmlChar *)"NUM_LAYERS")) && (cur->ns == ns))
2484 precodCfg->numLayers = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
2487 if ((!xmlStrcmp(cur->name, (const xmlChar *)"NUM_ANT_PORTS")) && (cur->ns == ns))
2489 precodCfg->numAntPorts = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
2497 /*******************************************************************
2499 * @brief Fill PRACH FDM Information
2503 * Function : parsePrachFdmInfo
2505 * Functionality: Fill PRACH FDM Information
2507 * @params[in] XML document pointer
2509 * Current node in XML
2510 * Pointer to structure to be filled
2511 * @return ROK - success
2514 * ****************************************************************/
2515 uint8_t parsePrachFdmInfo(xmlDocPtr doc, xmlNsPtr ns, xmlNodePtr cur,PrachFdmInfo *prachFdmInfo)
2517 memset(prachFdmInfo, 0, sizeof(PrachFdmInfo));
2518 cur = cur -> xmlChildrenNode;
2521 if ((!xmlStrcmp(cur->name, (const xmlChar *)"ROOT_SEQ_IDX")) && (cur->ns == ns))
2523 prachFdmInfo->rootSeqIdx = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
2526 if ((!xmlStrcmp(cur->name, (const xmlChar *)"NUM_ROOT_SEQ")) && (cur->ns == ns))
2528 prachFdmInfo->numRootSeq = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
2531 if ((!xmlStrcmp(cur->name, (const xmlChar *)"K1")) && (cur->ns == ns))
2533 prachFdmInfo->k1 = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
2536 if ((!xmlStrcmp(cur->name, (const xmlChar *)"ZERO_CORR_ZONE_CFG")) && (cur->ns == ns))
2538 prachFdmInfo->zeroCorrZoneCfg = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
2546 /*******************************************************************
2548 * @brief Fill PRACH configuration
2552 * Function : parsePrachCfg
2554 * Functionality: Fill PRACH configuration
2556 * @params[in] XML document pointer
2558 * Current node in XML
2559 * Pointer to structure to be filled
2560 * @return ROK - success
2563 * ****************************************************************/
2564 uint8_t parsePrachCfg(xmlDocPtr doc, xmlNsPtr ns, xmlNodePtr cur, PrachCfg *prachCfg)
2568 uint8_t maxNumRbs = 0;
2569 uint8_t prachMaxPrb = 0;
2571 memset(prachCfg, 0, sizeof(PrachCfg));
2572 cur = cur -> xmlChildrenNode;
2575 if ((!xmlStrcmp(cur->name, (const xmlChar *)"PRACH_SEQ_LEN")) && (cur->ns == ns))
2577 prachCfg->prachSeqLen = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
2580 if ((!xmlStrcmp(cur->name, (const xmlChar *)"NR_SCS")) && (cur->ns == ns))
2582 prachCfg->prachSubcSpacing = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
2585 if ((!xmlStrcmp(cur->name, (const xmlChar *)"PRACH_CONFIG_IDX")) && (cur->ns == ns))
2587 prachCfg->prachCfgIdx = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
2590 if ((!xmlStrcmp(cur->name, (const xmlChar *)"NUM_PRACH_FDM")) && (cur->ns == ns))
2592 prachCfg->msg1Fdm = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
2595 if ((!xmlStrcmp(cur->name, (const xmlChar *)"FDM_LIST")) && (cur->ns == ns))
2597 child = cur->xmlChildrenNode;
2598 while(child != NULL)
2600 if ((!xmlStrcmp(child->name, (const xmlChar *)"FDM_INFO")) && (child->ns == ns))
2602 if(parsePrachFdmInfo(doc, ns, child, &prachCfg->fdm[fdmIdx]) != ROK)
2608 child = child -> next;
2612 if ((!xmlStrcmp(cur->name, (const xmlChar *)"PRACH_RESTRICTED_SET_CFG")) && (cur->ns == ns))
2614 prachCfg->prachRstSetCfg = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
2617 if ((!xmlStrcmp(cur->name, (const xmlChar *)"SSB_PER_RACH")) && (cur->ns == ns))
2619 prachCfg->ssbPerRach = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
2622 if ((!xmlStrcmp(cur->name, (const xmlChar *)"NUM_RA_PREAMBLE")) && (cur->ns == ns))
2624 prachCfg->totalNumRaPreamble = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
2627 if ((!xmlStrcmp(cur->name, (const xmlChar *)"CB_PREAMBLE_PER_SSB")) && (cur->ns == ns))
2629 prachCfg->totalNumRaPreamble = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
2632 if ((!xmlStrcmp(cur->name, (const xmlChar *)"MAX_NUM_RB")) && (cur->ns == ns))
2634 maxNumRbs = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
2637 if ((!xmlStrcmp(cur->name, (const xmlChar *)"PRACH_MAX_PRB")) && (cur->ns == ns))
2639 prachMaxPrb = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
2642 if ((!xmlStrcmp(cur->name, (const xmlChar *)"RSRP_THRESHOLD_SSB")) && (cur->ns == ns))
2644 prachCfg->rsrpThreshSsb = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
2647 if ((!xmlStrcmp(cur->name, (const xmlChar *)"RA_RSP_WINDOW")) && (cur->ns == ns))
2649 prachCfg->raRspWindow = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
2655 prachCfg->msg1FreqStart = maxNumRbs - prachMaxPrb;
2659 /*******************************************************************
2661 * @brief Fill CSI RS configuration
2665 * Function : parseCsiRsCfg
2667 * Functionality: Fill CSI RS configuration
2669 * @params[in] XML document pointer
2671 * Current node in XML
2672 * Pointer to structure to be filled
2673 * @return ROK - success
2676 * ****************************************************************/
2677 uint8_t parseCsiRsCfg(xmlDocPtr doc, xmlNsPtr ns, xmlNodePtr cur, CsiRsCfg *csiRsCfg)
2679 memset(csiRsCfg, 0, sizeof(CsiRsCfg));
2680 cur = cur -> xmlChildrenNode;
2683 if ((!xmlStrcmp(cur->name, (const xmlChar *)"CSIRS_FREQ")) && (cur->ns == ns))
2685 csiRsCfg->csiFreqDomainAlloc = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
2688 if ((!xmlStrcmp(cur->name, (const xmlChar *)"CSIRS_PORTS")) && (cur->ns == ns))
2690 csiRsCfg->csiNrofPorts = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
2693 if ((!xmlStrcmp(cur->name, (const xmlChar *)"CSIRS_OFDM_PORT")) && (cur->ns == ns))
2695 csiRsCfg->csirsfirstOFDMSymbolInTimeDomain = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
2698 if ((!xmlStrcmp(cur->name, (const xmlChar *)"CSIRS_OFDM_PORT_2")) && (cur->ns == ns))
2700 csiRsCfg->csirsfirstOFDMSymbolInTimeDomain2 = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
2703 if ((!xmlStrcmp(cur->name, (const xmlChar *)"CSIRS_DM_TYPE")) && (cur->ns == ns))
2705 csiRsCfg->csirscdmType = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
2708 if ((!xmlStrcmp(cur->name, (const xmlChar *)"CSIRS_DENSITY")) && (cur->ns == ns))
2710 csiRsCfg->csirsdensity = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
2713 if ((!xmlStrcmp(cur->name, (const xmlChar *)"CSIRS_DENSITY_DOT_5")) && (cur->ns == ns))
2715 csiRsCfg->csirsdensitydot5 = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
2718 if ((!xmlStrcmp(cur->name, (const xmlChar *)"POWER_CONTROL_OFFSET")) && (cur->ns == ns))
2720 csiRsCfg->powerControlOffset = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
2723 if ((!xmlStrcmp(cur->name, (const xmlChar *)"POWER_CONTROL_OFFSET_SS")) && (cur->ns == ns))
2725 csiRsCfg->powerControlOffsetSS = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
2728 if ((!xmlStrcmp(cur->name, (const xmlChar *)"PERIODICITY_OFFSET")) && (cur->ns == ns))
2730 csiRsCfg->periodicityAndOffset = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
2738 /*******************************************************************
2740 * @brief Fill SSB Configuration
2744 * Function : parseSsbCfg
2746 * Functionality: Fill SSB Configuration
2748 * @params[in] XML document pointer
2750 * Current node in XML
2751 * Pointer to structure to be filled
2752 * @return ROK - success
2755 * ****************************************************************/
2756 uint8_t parseSsbCfg(xmlDocPtr doc, xmlNsPtr ns, xmlNodePtr cur, SsbCfg *ssbCfg)
2759 uint8_t ssbMaskIdx = 0;
2761 memset(ssbCfg, 0, sizeof( SsbCfg));
2762 cur = cur -> xmlChildrenNode;
2765 if ((!xmlStrcmp(cur->name, (const xmlChar *)"SSB_PBSC_PWR")) && (cur->ns == ns))
2767 ssbCfg->ssbPbchPwr = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
2770 if ((!xmlStrcmp(cur->name, (const xmlChar *)"SCS_CMN")) && (cur->ns == ns))
2772 ssbCfg->scsCmn = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
2775 if ((!xmlStrcmp(cur->name, (const xmlChar *)"SSB_OFF_PT_A")) && (cur->ns == ns))
2777 ssbCfg->ssbOffsetPointA = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
2780 if ((!xmlStrcmp(cur->name, (const xmlChar *)"SSB_PERIOD")) && (cur->ns == ns))
2782 ssbCfg->ssbPeriod = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
2785 if ((!xmlStrcmp(cur->name, (const xmlChar *)"SSB_SC_OFF")) && (cur->ns == ns))
2787 ssbCfg->ssbScOffset = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
2790 if ((!xmlStrcmp(cur->name, (const xmlChar *)"SSB_LIST")) && (cur->ns == ns))
2792 child = cur -> xmlChildrenNode;
2793 while(child != NULL)
2795 if ((!xmlStrcmp(child->name, (const xmlChar *)"SSB_MASK")) && (child->ns == ns))
2797 ssbCfg->ssbMask[ssbMaskIdx] = atoi((char *)xmlNodeListGetString(doc, child->xmlChildrenNode, 1));
2800 child = child -> next;
2804 if ((!xmlStrcmp(cur->name, (const xmlChar *)"BEAM_ID")) && (cur->ns == ns))
2806 ssbCfg->beamId[0] = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
2809 if ((!xmlStrcmp(cur->name, (const xmlChar *)"BETA_PSS")) && (cur->ns == ns))
2811 ssbCfg->betaPss = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
2814 if ((!xmlStrcmp(cur->name, (const xmlChar *)"BCH_PAY_FLAG")) && (cur->ns == ns))
2816 ssbCfg->bchPayloadFlag = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
2819 if ((!xmlStrcmp(cur->name, (const xmlChar *)"DMRS_TYPE_A_PROS")) && (cur->ns == ns))
2821 ssbCfg->dmrsTypeAPos = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
2829 /*******************************************************************
2831 * @brief Fill Carrier Configuration
2835 * Function : parseCarrierCfg
2837 * Functionality: Fill Carrier Configuration
2839 * @params[in] XML document pointer
2841 * Current node in XML
2842 * Pointer to structure to be filled
2843 * @return ROK - success
2846 * ****************************************************************/
2847 uint8_t parseCarrierCfg(xmlDocPtr doc, xmlNsPtr ns, xmlNodePtr cur,CarrierCfg *carrierCfg)
2849 memset(carrierCfg, 0, sizeof(CarrierCfg));
2850 cur = cur -> xmlChildrenNode;
2853 if ((!xmlStrcmp(cur->name, (const xmlChar *)"DL_BW")) && (cur->ns == ns))
2855 carrierCfg->dlBw = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
2858 if ((!xmlStrcmp(cur->name, (const xmlChar *)"NR_DL_ARFCN")) && (cur->ns == ns))
2860 carrierCfg->arfcnDL = convertArfcnToFreqKhz(atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1)));
2863 if ((!xmlStrcmp(cur->name, (const xmlChar *)"UL_BW")) && (cur->ns == ns))
2865 carrierCfg->ulBw = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
2868 if ((!xmlStrcmp(cur->name, (const xmlChar *)"NR_UL_ARFCN")) && (cur->ns == ns))
2870 carrierCfg->arfcnUL = convertArfcnToFreqKhz(atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1)));
2873 if ((!xmlStrcmp(cur->name, (const xmlChar *)"NUM_TX_ANT")) && (cur->ns == ns))
2875 carrierCfg->numTxAnt = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
2878 if ((!xmlStrcmp(cur->name, (const xmlChar *)"NUM_RX_ANT")) && (cur->ns == ns))
2880 carrierCfg->numRxAnt = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
2888 /*******************************************************************
2890 * @brief Fill PLMN Information List
2894 * Function : parsePlmnInfo
2896 * Functionality: Fill PLMN Information List
2898 * @params[in] XML document pointer
2900 * Current node in XML
2901 * Pointer to structure to be filled
2902 * @return ROK - success
2905 * ****************************************************************/
2906 uint8_t parsePlmnInfo(xmlDocPtr doc, xmlNsPtr ns, xmlNodePtr cur,PlmnInfoList *plmnInfoList)
2909 memset(plmnInfoList, 0, sizeof(PlmnInfoList));
2910 cur = cur -> xmlChildrenNode;
2913 if ((!xmlStrcmp(cur->name, (const xmlChar *)"PLMN")) && (cur->ns == ns))
2915 if(parsePlmn(doc, ns, cur,&plmnInfoList->plmn) != ROK)
2921 if ((!xmlStrcmp(cur->name, (const xmlChar *)"F1_SLICE_SUPP_LST")) && (cur->ns == ns))
2923 if(parseSupportedSliceList(doc, ns, cur,&plmnInfoList -> suppSliceList) != ROK)
2934 /*******************************************************************
2936 * @brief Fill PUCCH Configuration Common
2940 * Function : parsePucchConfigCommon
2942 * Functionality: Fill PUCCH Configuration Common
2944 * @params[in] XML document pointer
2946 * Current node in XML
2947 * Pointer to structure to be filled
2948 * @return ROK - success
2951 * ****************************************************************/
2952 uint8_t parsePucchConfigCommon(xmlDocPtr doc, xmlNsPtr ns, xmlNodePtr cur, PucchConfigCommon *pucchCfgCmn)
2954 memset(pucchCfgCmn, 0, sizeof(PucchConfigCommon));
2955 cur = cur -> xmlChildrenNode;
2958 if ((!xmlStrcmp(cur->name, (const xmlChar *)"PUCCH_RSRC_COMMON")) && (cur->ns == ns))
2960 pucchCfgCmn->pucchResourceCommon = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
2963 if ((!xmlStrcmp(cur->name, (const xmlChar *)"PUCCH_GROUP_HOPPING")) && (cur->ns == ns))
2965 pucchCfgCmn->pucchGroupHopping = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
2973 /*******************************************************************
2975 * @brief Fill PUSCH Common Time Allocation
2979 * Function : parsePuschTimeDomRsrcAlloc
2981 * Functionality: Fill PUSCH Common Time Allocation
2983 * @params[in] XML document pointer
2985 * Current node in XML
2986 * Pointer to structure to be filled
2987 * @return ROK - success
2990 * ****************************************************************/
2991 uint8_t parsePuschTimeDomRsrcAlloc(xmlDocPtr doc, xmlNsPtr ns, xmlNodePtr cur,PuschTimeDomRsrcAlloc *puschTimeDomRsrsAlloc)
2993 memset(puschTimeDomRsrsAlloc, 0, sizeof(PuschTimeDomRsrcAlloc));
2994 cur = cur -> xmlChildrenNode;
2997 if ((!xmlStrcmp(cur->name, (const xmlChar *)"PUSCH_K2_CFG")) && (cur->ns == ns))
2999 puschTimeDomRsrsAlloc->k2 = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
3002 if ((!xmlStrcmp(cur->name, (const xmlChar *)"PUSCH_MAPPING_TYPE")) && (cur->ns == ns))
3004 puschTimeDomRsrsAlloc->mappingType = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
3007 if ((!xmlStrcmp(cur->name, (const xmlChar *)"PUSCH_START_SYMBOL")) && (cur->ns == ns))
3009 puschTimeDomRsrsAlloc->startSymbol = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
3012 if ((!xmlStrcmp(cur->name, (const xmlChar *)"PUSCH_LENGTH_SYMBOL")) && (cur->ns == ns))
3014 puschTimeDomRsrsAlloc->symbolLength= atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
3020 puschTimeDomRsrsAlloc -> startSymbolAndLength = \
3021 calcSliv(puschTimeDomRsrsAlloc->startSymbol, puschTimeDomRsrsAlloc->symbolLength);
3025 /*******************************************************************
3027 * @brief Fill PUSCH Configuration Common
3031 * Function : parsePuschConfigCommon
3033 * Functionality: Fill PUSCH Configuration Common
3035 * @params[in] XML document pointer
3037 * Current node in XML
3038 * Pointer to structure to be filled
3039 * @return ROK - success
3042 * ****************************************************************/
3043 uint8_t parsePuschConfigCommon(xmlDocPtr doc, xmlNsPtr ns, xmlNodePtr cur,PuschConfigCommon *puschCfgCmn)
3046 xmlNodePtr child = NULLP;
3047 xmlNodePtr pdschNode = NULLP;
3049 memset(puschCfgCmn, 0, sizeof(PuschConfigCommon));
3050 cur = cur -> xmlChildrenNode;
3053 if ((!xmlStrcmp(cur->name, (const xmlChar *)"NUM_TIME_DOM_RSRC_ALLOC")) && (cur->ns == ns))
3055 puschCfgCmn->numTimeDomRsrcAlloc = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
3058 if ((!xmlStrcmp(cur->name, (const xmlChar *)"PUSCH_COMM_TIME_ALLOC_LIST")) && (cur->ns == ns))
3060 child = cur->xmlChildrenNode;
3061 while(child != NULL)
3063 if ((!xmlStrcmp(cur->name, (const xmlChar *)"LIST")) && (cur->ns == ns))
3065 pdschNode = child->xmlChildrenNode;
3066 while(pdschNode != NULL)
3068 if ((!xmlStrcmp(pdschNode->name, (const xmlChar *)"PUSCH_COMM_TIME_ALLOC")) && (pdschNode->ns == ns))
3070 if(parsePuschTimeDomRsrcAlloc(doc, ns, child,&puschCfgCmn->timeDomRsrcAllocList[idx]) != ROK)
3076 pdschNode = pdschNode -> next;
3080 child = child -> next;
3088 /*******************************************************************
3090 * @brief Fill BWP Configuration
3094 * Function : parseBwp
3096 * Functionality: Fill BWP 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 parseBwp(xmlDocPtr doc, xmlNsPtr ns, xmlNodePtr cur,BwpParams *bwp)
3108 memset(bwp, 0, sizeof(BwpParams));
3109 cur = cur -> xmlChildrenNode;
3112 if ((!xmlStrcmp(cur->name, (const xmlChar *)"FIRST_PRB")) && (cur->ns == ns))
3114 bwp->firstPrb = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
3117 if ((!xmlStrcmp(cur->name, (const xmlChar *)"NUM_PRB")) && (cur->ns == ns))
3119 bwp->numPrb = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
3122 if ((!xmlStrcmp(cur->name, (const xmlChar *)"NR_SCS")) && (cur->ns == ns))
3124 bwp->scs = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
3127 if ((!xmlStrcmp(cur->name, (const xmlChar *)"NORMAL_CYCLIC_PREFIX")) && (cur->ns == ns))
3129 bwp->cyclicPrefix = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
3137 /*******************************************************************
3139 * @brief Fill UL BWP Configuration
3143 * Function : parseBwpULConfig
3145 * Functionality: Fill UL BWP Configuration
3147 * @params[in] XML document pointer
3149 * Current node in XML
3150 * Pointer to structure to be filled
3151 * @return ROK - success
3154 * ****************************************************************/
3155 uint8_t parseBwpULConfig(xmlDocPtr doc, xmlNsPtr ns, xmlNodePtr cur,BwpUlConfig *bwpUlCfg)
3157 memset(bwpUlCfg, 0, sizeof(BwpUlConfig));
3158 cur = cur -> xmlChildrenNode;
3161 if ((!xmlStrcmp(cur->name, (const xmlChar *)"BWP_PARAMS")) && (cur->ns == ns))
3163 if(parseBwp(doc, ns, cur, &bwpUlCfg->bwp) != ROK)
3169 if ((!xmlStrcmp(cur->name, (const xmlChar *)"PUCCH_CFG_COMMON")) && (cur->ns == ns))
3171 if(parsePucchConfigCommon(doc, ns, cur, &bwpUlCfg->pucchCommon) != ROK)
3177 if ((!xmlStrcmp(cur->name, (const xmlChar *)"PUSCH_CFG_COMMON")) && (cur->ns == ns))
3179 if(parsePuschConfigCommon(doc, ns, cur, &bwpUlCfg->puschCommon) != ROK)
3189 /*******************************************************************
3191 * @brief Fill Page Configuration
3195 * Function : parsePageCfg
3197 * Functionality: Fill Page Configuration
3199 * @params[in] XML document pointer
3201 * Current node in XML
3202 * Pointer to structure to be filled
3203 * @return ROK - success
3206 * ****************************************************************/
3207 uint8_t parsePageCfg(xmlDocPtr doc, xmlNsPtr ns, xmlNodePtr cur, SchPageCfg *pageCfg)
3211 memset(pageCfg, 0, sizeof(SchPageCfg));
3212 cur = cur -> xmlChildrenNode;
3215 if ((!xmlStrcmp(cur->name, (const xmlChar *)"NUM_PO")) && (cur->ns == ns))
3217 pageCfg->numPO = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
3220 if ((!xmlStrcmp(cur->name, (const xmlChar *)"PO_PRESENT")) && (cur->ns == ns))
3222 poPresent = (char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1);
3223 if(!strcmp(poPresent, "TRUE"))
3225 pageCfg->poPresent = true;
3229 pageCfg->poPresent = false;
3233 if ((!xmlStrcmp(cur->name, (const xmlChar *)"PAGING_OCC")) && (cur->ns == ns))
3235 pageCfg->pagingOcc[0] = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
3243 /*******************************************************************
3245 * @brief Fill SIB1 PDCCH Configuration
3249 * Function : parsePdcchCfgSib1
3251 * Functionality: Fill SIB1 PDCCH Configuration
3253 * @params[in] XML document pointer
3255 * Current node in XML
3256 * Pointer to structure to be filled
3257 * @return ROK - success
3260 * ****************************************************************/
3261 uint8_t parsePdcchCfgSib1(xmlDocPtr doc, xmlNsPtr ns, xmlNodePtr cur,PdcchConfigSib1 *pdcchConfigSib1)
3263 memset(pdcchConfigSib1, 0, sizeof(PdcchConfigSib1));
3264 cur = cur -> xmlChildrenNode;
3267 if ((!xmlStrcmp(cur->name, (const xmlChar *)"CORESET_ZERO_INDEX")) && (cur->ns == ns))
3269 pdcchConfigSib1->coresetZeroIndex = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
3272 if ((!xmlStrcmp(cur->name, (const xmlChar *)"SEARCH_SPACE_ZERO_INDEX")) && (cur->ns == ns))
3274 pdcchConfigSib1->searchSpaceZeroIndex = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
3282 /*******************************************************************
3284 * @brief Fill SIB1 Cell Configuration
3288 * Function : parseSib1CellCfg
3290 * Functionality: Fill SIB1 Cell Configuration
3292 * @params[in] XML document pointer
3294 * Current node in XML
3295 * Pointer to structure to be filled
3296 * @return ROK - success
3299 * ****************************************************************/
3300 uint8_t parseSib1CellCfg(xmlDocPtr doc, xmlNsPtr ns, xmlNodePtr cur, Sib1CellCfg *sib1CellCfg)
3302 memset(sib1CellCfg, 0, sizeof( Sib1CellCfg));
3303 cur = cur -> xmlChildrenNode;
3306 if ((!xmlStrcmp(cur->name, (const xmlChar *)"SCH_PAGE_CFG")) && (cur->ns == ns))
3308 if(parsePageCfg(doc, ns, cur, &sib1CellCfg->pagingCfg) != ROK)
3314 if ((!xmlStrcmp(cur->name, (const xmlChar *)"PDCCH_CONFIG_SIB1")) && (cur->ns == ns))
3316 if(parsePdcchCfgSib1(doc, ns, cur, &sib1CellCfg->pdcchCfgSib1) != ROK)
3327 /*******************************************************************
3329 * @brief Fill Aggregation Level Candidates Information
3333 * Function : parseCandidateInfo
3335 * Functionality: Fill Aggregation Level Candidates Information
3337 * @params[in] XML document pointer
3339 * Current node in XML
3340 * Pointer to structure to be filled
3341 * @return ROK - success
3344 * ****************************************************************/
3345 uint8_t parseCandidateInfo(xmlDocPtr doc, xmlNsPtr ns, xmlNodePtr cur,CandidatesInfo *candInfo)
3347 memset(candInfo, 0, sizeof(CandidatesInfo));
3348 cur = cur -> xmlChildrenNode;
3351 if ((!xmlStrcmp(cur->name, (const xmlChar *)"AGG_LEVEL1")) && (cur->ns == ns))
3353 candInfo->aggLevel1 = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
3356 if ((!xmlStrcmp(cur->name, (const xmlChar *)"AGG_LEVEL2")) && (cur->ns == ns))
3358 candInfo->aggLevel2 = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
3361 if ((!xmlStrcmp(cur->name, (const xmlChar *)"AGG_LEVEL4")) && (cur->ns == ns))
3363 candInfo->aggLevel4 = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
3366 if ((!xmlStrcmp(cur->name, (const xmlChar *)"AGG_LEVEL8")) && (cur->ns == ns))
3368 candInfo->aggLevel8 = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
3371 if ((!xmlStrcmp(cur->name, (const xmlChar *)"AGG_LEVEL16")) && (cur->ns == ns))
3373 candInfo->aggLevel16 = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
3381 /*******************************************************************
3383 * @brief Fill Search Space Connfiguration
3387 * Function : parseSearchSpaceCfg
3389 * Functionality: Fill Search Space Configuration
3391 * @params[in] XML document pointer
3393 * Current node in XML
3394 * Pointer to structure to be filled
3395 * @return ROK - success
3398 * ****************************************************************/
3399 uint8_t parseSearchSpaceCfg(xmlDocPtr doc, xmlNsPtr ns, xmlNodePtr cur,SearchSpaceCfg *searchSpaceCfg)
3401 memset(searchSpaceCfg, 0, sizeof(SearchSpaceCfg));
3402 cur = cur -> xmlChildrenNode;
3405 if ((!xmlStrcmp(cur->name, (const xmlChar *)"SEARCHSPACE_1_INDEX")) && (cur->ns == ns))
3407 searchSpaceCfg->searchSpaceId = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
3410 if ((!xmlStrcmp(cur->name, (const xmlChar *)"CORESET_0_INDEX")) && (cur->ns == ns))
3412 searchSpaceCfg->coresetId = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
3415 if ((!xmlStrcmp(cur->name, (const xmlChar *)"SS_MONITORING_SLOT_SL1")) && (cur->ns == ns))
3417 searchSpaceCfg->monitoringSlot = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
3420 if ((!xmlStrcmp(cur->name, (const xmlChar *)"DURATION")) && (cur->ns == ns))
3422 searchSpaceCfg->duration = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
3425 if ((!xmlStrcmp(cur->name, (const xmlChar *)"SS_MONITORING_SYMBOL")) && (cur->ns == ns))
3427 searchSpaceCfg->monitoringSymbol = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
3430 if ((!xmlStrcmp(cur->name, (const xmlChar *)"CANDIDATE_INFO")) && (cur->ns == ns))
3432 if(parseCandidateInfo(doc, ns, cur, &searchSpaceCfg->candidate) != ROK)
3443 /*******************************************************************
3445 * @brief Fill PDCCH Configuration Common
3449 * Function : parsePdcchCfgCommon
3451 * Functionality: Fill PDCCH Configuration Common
3453 * @params[in] XML document pointer
3455 * Current node in XML
3456 * Pointer to structure to be filled
3457 * @return ROK - success
3460 * ****************************************************************/
3461 uint8_t parsePdcchCfgCommon(xmlDocPtr doc, xmlNsPtr ns, xmlNodePtr cur,PdcchConfigCommon *pdcchCfgCm)
3463 memset(pdcchCfgCm, 0, sizeof(PdcchConfigCommon));
3464 cur = cur -> xmlChildrenNode;
3467 if ((!xmlStrcmp(cur->name, (const xmlChar *)"SEARCH_SPACE_CFG")) && (cur->ns == ns))
3469 if(parseSearchSpaceCfg(doc, ns, cur, &pdcchCfgCm->commonSearchSpace) != ROK)
3475 if ((!xmlStrcmp(cur->name, (const xmlChar *)"SEARCHSPACE_1_INDEX")) && (cur->ns == ns))
3477 pdcchCfgCm->raSearchSpaceId = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
3486 /*******************************************************************
3488 * @brief Fill PDSCH Common Time Domain Resource Allocation
3492 * Function : parsePdschCmnTimeDomRsrcAlloc
3494 * Functionality: Fill PDSCH Common Time Domain Resource Allocation
3496 * @params[in] XML document pointer
3498 * Current node in XML
3499 * Pointer to structure to be filled
3500 * @return ROK - success
3503 * ****************************************************************/
3504 uint8_t parsePdschCmnTimeDomRsrcAlloc(xmlDocPtr doc, xmlNsPtr ns, xmlNodePtr cur,\
3505 PdschCfgCommTimeDomRsrcAlloc *pdschTimeDomRsrcAlloc)
3507 memset(pdschTimeDomRsrcAlloc, 0, sizeof(PdschCfgCommTimeDomRsrcAlloc));
3508 cur = cur -> xmlChildrenNode;
3511 if ((!xmlStrcmp(cur->name, (const xmlChar *)"PDSCH_K0_CFG")) && (cur->ns == ns))
3513 pdschTimeDomRsrcAlloc->k0 = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
3515 if ((!xmlStrcmp(cur->name, (const xmlChar *)"PDSCH_MAPPING_TYPE")) && (cur->ns == ns))
3517 pdschTimeDomRsrcAlloc->mappingType = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
3519 if ((!xmlStrcmp(cur->name, (const xmlChar *)"PDSCH_START_SYMBOL")) && (cur->ns == ns))
3521 pdschTimeDomRsrcAlloc->startSymbol = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
3523 if ((!xmlStrcmp(cur->name, (const xmlChar *)"PDSCH_LENGTH_SYMBOL")) && (cur->ns == ns))
3525 pdschTimeDomRsrcAlloc->lengthSymbol = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
3533 /*******************************************************************
3535 * @brief Fill PDSCH Configuration Common
3539 * Function : parsePdschConfigCommon
3541 * Functionality: Fill PDSCH Configuration Common
3543 * @params[in] XML document pointer
3545 * Current node in XML
3546 * Pointer to structure to be filled
3547 * @return ROK - success
3550 * ****************************************************************/
3551 uint8_t parsePdschConfigCommon(xmlDocPtr doc, xmlNsPtr ns, xmlNodePtr cur, PdschConfigCommon *pdschCfgCmn)
3554 xmlNodePtr child = NULLP;
3555 xmlNodePtr pdschNode = NULLP;
3557 memset(pdschCfgCmn, 0, sizeof(PdschConfigCommon));
3558 cur = cur -> xmlChildrenNode;
3561 if ((!xmlStrcmp(cur->name, (const xmlChar *)"NUM_TIME_DOM_RSRC_ALLOC")) && (cur->ns == ns))
3563 pdschCfgCmn->numTimeDomAlloc = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
3566 if ((!xmlStrcmp(cur->name, (const xmlChar *)"PDSCH_COMM_TIME_ALLOC_LIST")) && (cur->ns == ns))
3568 child = cur->xmlChildrenNode;
3569 while(child != NULL)
3571 if ((!xmlStrcmp(cur->name, (const xmlChar *)"LIST")) && (cur->ns == ns))
3573 pdschNode = child->xmlChildrenNode;
3574 while(pdschNode != NULL)
3576 if ((!xmlStrcmp(pdschNode->name, (const xmlChar *)"PDSCH_COMM_TIME_ALLOC")) && (pdschNode->ns == ns))
3578 if(parsePdschCmnTimeDomRsrcAlloc(doc, ns, child, &pdschCfgCmn->timeDomRsrcAllocList[idx]) != ROK)
3584 pdschNode = pdschNode -> next;
3588 child = child -> next;
3596 /*******************************************************************
3598 * @brief Fill DL BWP Configuration
3602 * Function : parseBwpDLConfig
3604 * Functionality: Fill DL BWP 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 parseBwpDLConfig(xmlDocPtr doc, xmlNsPtr ns, xmlNodePtr cur,BwpDlConfig *bwpDlCfg)
3616 memset(bwpDlCfg, 0, sizeof(BwpDlConfig));
3617 cur = cur -> xmlChildrenNode;
3620 if ((!xmlStrcmp(cur->name, (const xmlChar *)"BWP_PARAMS")) && (cur->ns == ns))
3622 if(parseBwp(doc, ns, cur, &bwpDlCfg->bwp) != ROK)
3628 if ((!xmlStrcmp(cur->name, (const xmlChar *)"PDCCH_CFG_COMMON")) && (cur->ns == ns))
3630 if(parsePdcchCfgCommon(doc, ns, cur, &bwpDlCfg->pdcchCommon) != ROK)
3636 if ((!xmlStrcmp(cur->name, (const xmlChar *)"PDSCH_CFG_COMMON")) && (cur->ns == ns))
3638 if(parsePdschConfigCommon(doc, ns, cur, &bwpDlCfg->pdschCommon) != ROK)
3649 /*******************************************************************
3651 * @brief Fill Cell Configuration
3655 * Function : parseCellCfg
3657 * Functionality: Fill Cell Configuration
3659 * @params[in] XML document pointer
3661 * Current node in XML
3662 * Pointer to structure to be filled
3663 * @return ROK - success
3666 * ****************************************************************/
3667 uint8_t parseCellCfg(xmlDocPtr doc, xmlNsPtr ns, xmlNodePtr cur,CellCfg *cellCfg)
3669 memset(cellCfg, 0, sizeof(CellCfg));
3670 cur = cur -> xmlChildrenNode;
3673 if ((!xmlStrcmp(cur->name, (const xmlChar *)"MAC_OP_STATE")) && (cur->ns == ns))
3675 cellCfg->opState = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
3678 if ((!xmlStrcmp(cur->name, (const xmlChar *)"MAC_ADMIN_STATE")) && (cur->ns == ns))
3680 cellCfg->adminState = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
3683 if ((!xmlStrcmp(cur->name, (const xmlChar *)"MAC_CELL_STATE")) && (cur->ns == ns))
3685 cellCfg->cellState = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
3688 if ((!xmlStrcmp(cur->name, (const xmlChar *)"PLMN_INFO")) && (cur->ns == ns))
3690 if(parsePlmnInfo(doc, ns, cur, &cellCfg->plmnInfoList[0]) != ROK)
3696 if ((!xmlStrcmp(cur->name, (const xmlChar *)"NR_PCI")) && (cur->ns == ns))
3698 cellCfg->phyCellId = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
3701 if ((!xmlStrcmp(cur->name, (const xmlChar *)"TAC")) && (cur->ns == ns))
3703 cellCfg->tac = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
3706 if ((!xmlStrcmp(cur->name, (const xmlChar *)"SSB_FREQUENCY")) && (cur->ns == ns))
3708 cellCfg->ssbFreq = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
3711 if ((!xmlStrcmp(cur->name, (const xmlChar *)"NR_SCS")) && (cur->ns == ns))
3713 cellCfg->subCarrSpacing = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
3716 if ((!xmlStrcmp(cur->name, (const xmlChar *)"DUPLEX_MODE")) && (cur->ns == ns))
3718 cellCfg->dupType = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
3721 if ((!xmlStrcmp(cur->name, (const xmlChar *)"SIB1_CELL_CFG")) && (cur->ns == ns))
3723 if(parseSib1CellCfg(doc, ns, cur, &cellCfg->sib1Cfg) != ROK)
3729 if ((!xmlStrcmp(cur->name, (const xmlChar *)"BWP_DL_CFG")) && (cur->ns == ns))
3731 if(parseBwpDLConfig(doc, ns, cur, &cellCfg->initialDlBwp) != ROK)
3737 if ((!xmlStrcmp(cur->name, (const xmlChar *)"BWP_UL_CFG")) && (cur->ns == ns))
3739 if(parseBwpULConfig(doc, ns, cur, &cellCfg->initialUlBwp) != ROK)
3751 /*******************************************************************
3753 * @brief Fill TDD slot configuration
3757 * Function : parseTddCfg
3759 * Functionality: Fill TDD slot configuration
3761 * @params[in] XML document pointer
3763 * Current node in XML
3764 * Pointer to structure to be filled
3765 * @return ROK - success
3768 * ****************************************************************/
3769 uint8_t parseTddCfg(xmlDocPtr doc, xmlNsPtr ns, xmlNodePtr cur, TDDCfg *tddCfg)
3771 memset(tddCfg, 0, sizeof(TDDCfg));
3772 cur = cur -> xmlChildrenNode;
3775 if ((!xmlStrcmp(cur->name, (const xmlChar *)"TDD_PERIODICITY")) && (cur->ns == ns))
3777 tddCfg->tddPeriod = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
3780 if ((!xmlStrcmp(cur->name, (const xmlChar *)"NUM_DL_SLOTS")) && (cur->ns == ns))
3782 tddCfg->nrOfDlSlots = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
3785 if ((!xmlStrcmp(cur->name, (const xmlChar *)"NUM_DL_SYMBOLS")) && (cur->ns == ns))
3787 tddCfg->nrOfDlSymbols = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
3790 if ((!xmlStrcmp(cur->name, (const xmlChar *)"NUM_UL_SLOTS")) && (cur->ns == ns))
3792 tddCfg->nrOfUlSlots = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
3795 if ((!xmlStrcmp(cur->name, (const xmlChar *)"NUM_UL_SYMBOLS")) && (cur->ns == ns))
3797 tddCfg->nrOfUlSymbols = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
3806 /*******************************************************************
3808 * @brief Fill MAC Cell Configuration
3812 * Function : parseMacCellCfg
3814 * Functionality: Fill MAC Cell Configuration
3816 * @params[in] XML document pointer
3818 * Current node in XML
3819 * Pointer to structure to be filled
3820 * @return ROK - success
3823 * ****************************************************************/
3824 uint8_t parseMacCellCfg(xmlDocPtr doc, xmlNsPtr ns, xmlNodePtr cur,MacCellCfg *macCellCfg)
3826 memset(macCellCfg, 0, sizeof(MacCellCfg));
3827 cur = cur -> xmlChildrenNode;
3830 if ((!xmlStrcmp(cur->name, (const xmlChar *)"CELL_ID")) && (cur->ns == ns))
3832 macCellCfg->cellId = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
3835 if ((!xmlStrcmp(cur->name, (const xmlChar *)"CARRIER_CFG")) && (cur->ns == ns))
3837 if(parseCarrierCfg(doc, ns, cur, &macCellCfg->carrCfg) != ROK)
3843 if ((!xmlStrcmp(cur->name, (const xmlChar *)"CELL_CFG")) && (cur->ns == ns))
3845 if(parseCellCfg(doc, ns, cur, &macCellCfg->cellCfg) != ROK)
3851 if ((!xmlStrcmp(cur->name, (const xmlChar *)"SSB_CFG")) && (cur->ns == ns))
3853 if(parseSsbCfg(doc, ns, cur, &macCellCfg->ssbCfg) != ROK)
3859 if ((!xmlStrcmp(cur->name, (const xmlChar *)"CSIRS_CFG")) && (cur->ns == ns))
3861 if(parseCsiRsCfg(doc, ns, cur, &macCellCfg->csiRsCfg) != ROK)
3867 if ((!xmlStrcmp(cur->name, (const xmlChar *)"PRACH_CFG")) && (cur->ns == ns))
3869 if(parsePrachCfg(doc, ns, cur, &macCellCfg->prachCfg) != ROK)
3876 if ((!xmlStrcmp(cur->name, (const xmlChar *)"TDD_CFG")) && (cur->ns == ns))
3878 if(parseTddCfg(doc, ns, cur, &macCellCfg->tddCfg) != ROK)
3885 if ((!xmlStrcmp(cur->name, (const xmlChar *)"PRE_CODE_CFG")) && (cur->ns == ns))
3887 if(parsePrecodingConfig(doc, ns, cur, &macCellCfg->precodingConf) != ROK)
3893 if ((!xmlStrcmp(cur->name, (const xmlChar *)"BEAM_FORM_CFG")) && (cur->ns == ns))
3895 if(parseBeamformingConfig(doc, ns, cur, &macCellCfg->beamCfg) != ROK)
3906 /*******************************************************************
3908 * @brief Fill PUSCH Configuration Common Time Domain
3909 * Resource Allocation
3913 * Function : parsePuschCmnTimeDomRsrcAlloc
3915 * Functionality: Fill PUSCH Configuration Common Time Domain
3916 * Resource Allocation
3918 * @params[in] XML document pointer
3920 * Current node in XML
3921 * Pointer to structure to be filled
3922 * @return ROK - success
3925 * ****************************************************************/
3926 uint8_t parsePuschCmnTimeDomRsrcAlloc(xmlDocPtr doc, xmlNsPtr ns, xmlNodePtr cur,PuschCfgCmnTimeDomAlloc *puschCmnTimeDomAlloc)
3928 uint16_t startSymbol;
3931 memset(puschCmnTimeDomAlloc, 0, sizeof(PuschCfgCmnTimeDomAlloc));
3932 cur = cur -> xmlChildrenNode;
3935 if ((!xmlStrcmp(cur->name, (const xmlChar *)"K2")) && (cur->ns == ns))
3937 puschCmnTimeDomAlloc->k2 = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
3939 if ((!xmlStrcmp(cur->name, (const xmlChar *)"MAP_TYPE")) && (cur->ns == ns))
3941 puschCmnTimeDomAlloc->mapType = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
3943 if ((!xmlStrcmp(cur->name, (const xmlChar *)"PUSCH_START_SYMBOL")) && (cur->ns == ns))
3945 startSymbol = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
3947 if ((!xmlStrcmp(cur->name, (const xmlChar *)"PUSCH_LENGTH_SYMBOL")) && (cur->ns == ns))
3949 lenSymbol = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
3953 puschCmnTimeDomAlloc->sliv = calcSliv(startSymbol, lenSymbol);
3957 /*******************************************************************
3959 * @brief Fill PUSCH Configuration Common
3963 * Function : parsePuschCfgCommon
3965 * Functionality: Fill PUSCH Configuration Common
3967 * @params[in] XML document pointer
3969 * Current node in XML
3970 * Pointer to structure to be filled
3971 * @return ROK - success
3974 * ****************************************************************/
3975 uint8_t parsePuschCfgCommon(xmlDocPtr doc, xmlNsPtr ns, xmlNodePtr cur,PuschCfgCommon *puschCfgCmn)
3977 uint8_t rsrcIdx = 0;
3978 xmlNodePtr child = NULLP;
3979 xmlNodePtr rsrcNode = NULLP;
3981 memset(puschCfgCmn, 0, sizeof(PuschCfgCommon));
3982 cur = cur -> xmlChildrenNode;
3985 if ((!xmlStrcmp(cur->name, (const xmlChar *)"PUSCH_CFG_PRESENT")) && (cur->ns == ns))
3987 puschCfgCmn->puschCfgPresent = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
3990 if ((!xmlStrcmp(cur->name, (const xmlChar *)"PUSCH_MSG3_DELTA_PREAMBLE")) && (cur->ns == ns))
3992 puschCfgCmn->msg3DeltaPreamble = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
3995 if ((!xmlStrcmp(cur->name, (const xmlChar *)"PUSCH_P0_NOMINAL_WITH_GRANT")) && (cur->ns == ns))
3997 puschCfgCmn->p0NominalWithGrant = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
4000 if ((!xmlStrcmp(cur->name, (const xmlChar *)"NUM_TIME_DOM_RSRC_ALLOC")) && (cur->ns == ns))
4002 puschCfgCmn->numTimeDomRsrcAlloc = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
4005 if ((!xmlStrcmp(cur->name, (const xmlChar *)"PUSCH_TIME_DOM_RSRC_ALLOC_LIST")) && (cur->ns == ns))
4007 child = cur->xmlChildrenNode;
4008 while (child != NULL)
4010 if ((!xmlStrcmp(child->name, (const xmlChar *)"LIST")) && (child->ns == ns))
4012 rsrcNode = child->xmlChildrenNode;
4013 while (rsrcNode != NULL)
4015 if ((!xmlStrcmp(rsrcNode->name, (const xmlChar *)"PUSCH_TIME_DOM_RSRC_ALLOC")) \
4016 && (rsrcNode->ns == ns))
4018 if(parsePuschCmnTimeDomRsrcAlloc(doc, ns, rsrcNode, &puschCfgCmn->timeDomAllocList[rsrcIdx]) != ROK)
4024 rsrcNode = rsrcNode->next;
4027 child = child->next;
4035 /*******************************************************************
4037 * @brief Fill PUCCH Configuration Common
4041 * Function : parsePucchCfgCommon
4043 * Functionality: Fill PUCCH Configuration Common
4045 * @params[in] XML document pointer
4047 * Current node in XML
4048 * Pointer to structure to be filled
4049 * @return ROK - success
4052 * ****************************************************************/
4053 uint8_t parsePucchCfgCommon(xmlDocPtr doc, xmlNsPtr ns, xmlNodePtr cur,PucchCfgCommon *pucchCfgCmn)
4055 memset(pucchCfgCmn, 0, sizeof(PucchCfgCommon));
4056 cur = cur -> xmlChildrenNode;
4059 if ((!xmlStrcmp(cur->name, (const xmlChar *)"PRESENT")) && (cur->ns == ns))
4061 pucchCfgCmn->present = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
4064 if ((!xmlStrcmp(cur->name, (const xmlChar *)"PUCCH_RSRC_COMMON")) && (cur->ns == ns))
4066 pucchCfgCmn->rsrcComm = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
4069 if ((!xmlStrcmp(cur->name, (const xmlChar *)"GRP_HOP")) && (cur->ns == ns))
4071 pucchCfgCmn->grpHop = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
4074 if ((!xmlStrcmp(cur->name, (const xmlChar *)"PUCCH_P0_NOMINAL")) && (cur->ns == ns))
4076 pucchCfgCmn->p0Nominal = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
4084 /*******************************************************************
4086 * @brief Fill RACH Configuration Common
4090 * Function : parseRachCfgCommon
4092 * Functionality: Fill RACH Configuration Common
4094 * @params[in] XML document pointer
4096 * Current node in XML
4097 * Pointer to structure to be filled
4098 * @return ROK - success
4101 * ****************************************************************/
4102 uint8_t parseRachCfgCommon(xmlDocPtr doc, xmlNsPtr ns, xmlNodePtr cur, RachCfgCommon *rachCfgCmn)
4107 memset(rachCfgCmn, 0, sizeof(RachCfgCommon));
4108 cur = cur -> xmlChildrenNode;
4111 if ((!xmlStrcmp(cur->name, (const xmlChar *)"PRESENT")) && (cur->ns == ns))
4113 rachCfgCmn->present = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
4116 if ((!xmlStrcmp(cur->name, (const xmlChar *)"PRACH_CONFIG_IDX")) && (cur->ns == ns))
4118 rachCfgCmn->prachCfgIdx = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
4121 if ((!xmlStrcmp(cur->name, (const xmlChar *)"MSG_1_FDM")) && (cur->ns == ns))
4123 rachCfgCmn->msg1Fdm = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
4126 if ((!xmlStrcmp(cur->name, (const xmlChar *)"MAX_NUM_RB")) && (cur->ns == ns))
4128 maxNumRb = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
4130 if ((!xmlStrcmp(cur->name, (const xmlChar *)"PRACH_MAX_PRB")) && (cur->ns == ns))
4132 prachMaxPrb = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
4135 if ((!xmlStrcmp(cur->name, (const xmlChar *)"ZERO_CORRELATION_ZONE_CFG")) && (cur->ns == ns))
4137 rachCfgCmn->zeroCorrZoneCfg = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
4140 if ((!xmlStrcmp(cur->name, (const xmlChar *)"PRACH_PREAMBLE_RCVD_TGT_PWR")) && (cur->ns == ns))
4142 rachCfgCmn->preambleRcvdTgtPwr = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
4145 if ((!xmlStrcmp(cur->name, (const xmlChar *)"PREAMBLE_TRANS_MAX")) && (cur->ns == ns))
4147 rachCfgCmn->preambleTransMax = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
4150 if ((!xmlStrcmp(cur->name, (const xmlChar *)"PWR_RAMPING_STEP")) && (cur->ns == ns))
4152 rachCfgCmn->pwrRampingStep = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
4155 if ((!xmlStrcmp(cur->name, (const xmlChar *)"RA_RSP_WINDOW")) && (cur->ns == ns))
4157 rachCfgCmn->raRspWindow = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
4160 if ((!xmlStrcmp(cur->name, (const xmlChar *)"NUM_RA_PREAMBLE")) && (cur->ns == ns))
4162 rachCfgCmn->numRaPreamble = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
4165 if ((!xmlStrcmp(cur->name, (const xmlChar *)"NUM_SSB_PER_RACH_OCC")) && (cur->ns == ns))
4167 rachCfgCmn->numSsbPerRachOcc = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
4170 if ((!xmlStrcmp(cur->name, (const xmlChar *)"CB_PREAMBLE_PER_SSB")) && (cur->ns == ns))
4172 rachCfgCmn->numCbPreamblePerSsb = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
4175 if ((!xmlStrcmp(cur->name, (const xmlChar *)"CONT_RES_TIMER")) && (cur->ns == ns))
4177 rachCfgCmn->contResTimer = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
4180 if ((!xmlStrcmp(cur->name, (const xmlChar *)"RSRP_THRESHOLD_SSB")) && (cur->ns == ns))
4182 rachCfgCmn->rsrpThreshSsb = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
4185 if ((!xmlStrcmp(cur->name, (const xmlChar *)"ROOT_SEQ_IDX_PRESENT")) && (cur->ns == ns))
4187 rachCfgCmn->rootSeqIdxPresent = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
4190 if ((!xmlStrcmp(cur->name, (const xmlChar *)"ROOT_SEQ_IDX")) && (cur->ns == ns))
4192 rachCfgCmn->rootSeqIdx = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
4195 if ((!xmlStrcmp(cur->name, (const xmlChar *)"PRACH_SUBCARRIER_SPACING")) && (cur->ns == ns))
4197 rachCfgCmn->msg1Scs = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
4200 if ((!xmlStrcmp(cur->name, (const xmlChar *)"PRACH_RESTRICTED_SET_CFG")) && (cur->ns== ns))
4202 rachCfgCmn->restrictedSetCfg = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
4208 rachCfgCmn->msg1FreqStart = ((maxNumRb) - (prachMaxPrb));
4212 /*******************************************************************
4214 * @brief Fill SCS Specific Carrier
4218 * Function : parseScsSpecCarrier
4220 * Functionality: Fill SCS Specific Carrier
4222 * @params[in] XML document pointer
4224 * Current node in XML
4225 * Pointer to structure to be filled
4226 * @return ROK - success
4229 * ****************************************************************/
4230 uint8_t parseScsSpecCarrier(xmlDocPtr doc, xmlNsPtr ns, xmlNodePtr cur,ScsSpecCarrier *scsSpecCrr)
4232 memset(scsSpecCrr, 0, sizeof(ScsSpecCarrier));
4233 cur = cur -> xmlChildrenNode;
4236 if ((!xmlStrcmp(cur->name, (const xmlChar *)"SSB_SUBCARRIER_OFFSET")) && (cur->ns == ns))
4238 scsSpecCrr->scsOffset = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
4241 if ((!xmlStrcmp(cur->name, (const xmlChar *)"NR_SCS")) && (cur->ns == ns))
4243 scsSpecCrr->scs = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
4246 if ((!xmlStrcmp(cur->name, (const xmlChar *)"SCS_BW")) && (cur->ns == ns))
4248 scsSpecCrr->scsBw = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
4255 /*******************************************************************
4257 * @brief Fill UL Config Common
4261 * Function : parseUlCfgCommon
4263 * Functionality: Fill UL Config Common
4265 * @params[in] XML document pointer
4267 * Current node in XML
4268 * Pointer to structure to be filled
4269 * @return ROK - success
4272 * ****************************************************************/
4273 uint8_t parseUlCfgCommon(xmlDocPtr doc, xmlNsPtr ns, xmlNodePtr cur,UlCfgCommon *ulCfgCmn)
4275 memset(ulCfgCmn, 0, sizeof(UlCfgCommon));
4276 cur = cur -> xmlChildrenNode;
4279 if ((!xmlStrcmp(cur->name, (const xmlChar *)"NR_FREQ_BAND")) && (cur->ns == ns))
4281 ulCfgCmn->freqBandInd = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
4284 if ((!xmlStrcmp(cur->name, (const xmlChar *)"UL_P_MAX")) && (cur->ns == ns))
4286 ulCfgCmn->pMax = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
4289 if ((!xmlStrcmp(cur->name, (const xmlChar *)"FREQ_LOC_BW")) && (cur->ns == ns))
4291 ulCfgCmn->locAndBw = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
4294 if ((!xmlStrcmp(cur->name, (const xmlChar *)"TIME_ALLIGN_TIMER_COMM")) && (cur->ns == ns))
4296 ulCfgCmn->timeAlignTimerComm = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
4299 if ((!xmlStrcmp(cur->name, (const xmlChar *)"SCS_SPEC_CARRIER")) && (cur->ns == ns))
4301 if(parseScsSpecCarrier(doc, ns, cur, &ulCfgCmn->ulScsCarrier) != ROK)
4307 if ((!xmlStrcmp(cur->name, (const xmlChar *)"RACH_CFG_COMMON")) && (cur->ns == ns))
4309 if(parseRachCfgCommon(doc, ns, cur, &ulCfgCmn->rachCfg) != ROK)
4315 if ((!xmlStrcmp(cur->name, (const xmlChar *)"PUSCH_CFG_COMMON")) && (cur->ns == ns))
4317 if(parsePuschCfgCommon(doc, ns, cur, &ulCfgCmn->puschCfg) != ROK)
4323 if ((!xmlStrcmp(cur->name, (const xmlChar *)"PUCCH_CFG_COMMON")) && (cur->ns == ns))
4325 if(parsePucchCfgCommon(doc, ns, cur, &ulCfgCmn->pucchCfg) != ROK)
4336 /*******************************************************************
4338 * @brief Fill TDD UL DL Configuration Common
4342 * Function : parseTddUlDlCfgCommon
4344 * Functionality: Fill TDD UL DL Configuration Common
4346 * @params[in] XML document pointer
4348 * Current node in XML
4349 * Pointer to structure to be filled
4350 * @return ROK - success
4353 * ****************************************************************/
4354 uint8_t parseTddUlDlCfgCommon(xmlDocPtr doc, xmlNsPtr ns, xmlNodePtr cur, TddUlDlCfgCommon *tddUlDlCfgCmn)
4356 memset(tddUlDlCfgCmn, 0, sizeof(TddUlDlCfgCommon));
4357 cur = cur -> xmlChildrenNode;
4360 if ((!xmlStrcmp(cur->name, (const xmlChar *)"REF_SCS")) && (cur->ns == ns))
4362 tddUlDlCfgCmn->refScs = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
4365 if ((!xmlStrcmp(cur->name, (const xmlChar *)"TX_PRD")) && (cur->ns == ns))
4367 tddUlDlCfgCmn->txPrd = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
4370 if ((!xmlStrcmp(cur->name, (const xmlChar *)"NUM_DL_SLOTS")) && (cur->ns == ns))
4372 tddUlDlCfgCmn->numDlSlots = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
4375 if ((!xmlStrcmp(cur->name, (const xmlChar *)"NUM_DL_SYMBOLS")) && (cur->ns == ns))
4377 tddUlDlCfgCmn->numDlSymbols = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
4380 if ((!xmlStrcmp(cur->name, (const xmlChar *)"NUM_UL_SLOTS")) && (cur->ns == ns))
4382 tddUlDlCfgCmn->numUlSlots = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
4385 if ((!xmlStrcmp(cur->name, (const xmlChar *)"NUM_UL_SYMBOLS")) && (cur->ns == ns))
4387 tddUlDlCfgCmn->numUlSymbols = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
4395 /*******************************************************************
4397 * @brief Fill PCCH Configuration
4401 * Function : parsePcchCfg
4403 * Functionality: Fill PCCH Configuration
4405 * @params[in] XML document pointer
4407 * Current node in XML
4408 * Pointer to structure to be filled
4409 * @return ROK - success
4412 * ****************************************************************/
4413 uint8_t parsePcchCfg(xmlDocPtr doc, xmlNsPtr ns, xmlNodePtr cur,PcchCfg *pcchCfg)
4415 xmlNodePtr child = NULLP;
4416 xmlNodePtr firstPdcchNode = NULLP;
4419 memset(pcchCfg, 0, sizeof(PcchCfg));
4420 cur = cur -> xmlChildrenNode;
4423 if ((!xmlStrcmp(cur->name, (const xmlChar *)"DFLT_PAGING_CYCLE")) && (cur->ns == ns))
4425 pcchCfg->dfltPagingCycle = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
4428 if ((!xmlStrcmp(cur->name, (const xmlChar *)"NAND_PAGING_FRM_OFFSET")) && (cur->ns == ns))
4430 pcchCfg->nAndPagingFrmOffsetType = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
4433 if ((!xmlStrcmp(cur->name, (const xmlChar *)"PAGE_FRM_OFFSET")) && (cur->ns == ns))
4435 pcchCfg->pageFrameOffset = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
4438 if ((!xmlStrcmp(cur->name, (const xmlChar *)"NS")) && (cur->ns == ns))
4440 pcchCfg->ns = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
4443 if ((!xmlStrcmp(cur->name, (const xmlChar *)"FIRST_PDCCH_MONITORING_TYPE")) && (cur->ns == ns))
4445 pcchCfg->firstPDCCHMontioringType = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
4448 if ((!xmlStrcmp(cur->name, (const xmlChar *)"LIST")) && (cur->ns == ns))
4450 child = cur->xmlChildrenNode;
4451 while(child != NULL)
4453 if ((!xmlStrcmp(child->name, (const xmlChar *)"FIRST_PDCCH_LIST")) && (child->ns == ns))
4455 firstPdcchNode = child->xmlChildrenNode;
4456 while (firstPdcchNode != NULL)
4458 if ((!xmlStrcmp(firstPdcchNode->name, (const xmlChar *)"FIRST_PDCCH_MONITORING_INFO")) && (firstPdcchNode->ns == ns))
4460 pcchCfg->firstPDCCHMontioringInfo[idx] = atoi((char *)xmlNodeListGetString(doc, firstPdcchNode->xmlChildrenNode, 1));
4463 firstPdcchNode = firstPdcchNode->next;
4466 child = child -> next;
4474 /*******************************************************************
4476 * @brief Fill PDSCH Time Domain Resource Allocation
4480 * Function : parsePdschTimeDomRsrcAlloc
4482 * Functionality: Fill PDSCH Time Domain Resource Allocation
4484 * @params[in] XML document pointer
4486 * Current node in XML
4487 * Pointer to structure to be filled
4488 * @return ROK - success
4491 * ****************************************************************/
4492 uint8_t parsePdschTimeDomRsrcAlloc(xmlDocPtr doc, xmlNsPtr ns, xmlNodePtr cur,PdschTimeDomainRsrcAlloc *pdschTimeDomRsrcAlloc)
4494 uint16_t startSymbol;
4497 memset(pdschTimeDomRsrcAlloc, 0, sizeof(PdschTimeDomainRsrcAlloc));
4498 cur = cur -> xmlChildrenNode;
4501 if ((!xmlStrcmp(cur->name, (const xmlChar *)"K0")) && (cur->ns == ns))
4503 pdschTimeDomRsrcAlloc->k0 = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
4506 if ((!xmlStrcmp(cur->name, (const xmlChar *)"MAP_TYPE")) && (cur->ns == ns))
4508 pdschTimeDomRsrcAlloc->mapType = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
4511 if ((!xmlStrcmp(cur->name, (const xmlChar *)"PDSCH_START_SYMBOL")) && (cur->ns == ns))
4513 startSymbol = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
4516 if ((!xmlStrcmp(cur->name, (const xmlChar *)"PDSCH_LENGTH_SYMBOL")) && (cur->ns == ns))
4518 lenSymbol = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
4523 pdschTimeDomRsrcAlloc->sliv = calcSliv(startSymbol, lenSymbol);
4527 /*******************************************************************
4529 * @brief Fill PDSCH Configuration Common
4533 * Function : parsePdschCfgCommon
4535 * Functionality: Fill PDSCH Configuration Common
4537 * @params[in] XML document pointer
4539 * Current node in XML
4540 * Pointer to structure to be filled
4541 * @return ROK - success
4544 * ****************************************************************/
4545 uint8_t parsePdschCfgCommon(xmlDocPtr doc, xmlNsPtr ns, xmlNodePtr cur,PdschCfgCommon *pdschCfgCmn)
4548 xmlNodePtr child = NULLP;
4549 xmlNodePtr listChild = NULLP;
4551 memset(pdschCfgCmn, 0, sizeof(PdschCfgCommon));
4552 cur = cur -> xmlChildrenNode;
4555 if ((!xmlStrcmp(cur->name, (const xmlChar *)"PRESENT")) && (cur->ns == ns))
4557 pdschCfgCmn->present = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
4560 if ((!xmlStrcmp(cur->name, (const xmlChar *)"NUM_TIME_DOM_RSRS_ALLOC")) && (cur->ns == ns))
4562 pdschCfgCmn->numTimeDomRsrcAlloc = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
4565 if ((!xmlStrcmp(cur->name, (const xmlChar *)"PDSCH_TIME_DOM_RSRC_ALLOC_LIST")) && (cur->ns == ns))
4567 child = cur->xmlChildrenNode;
4568 while (child != NULL)
4570 if ((!xmlStrcmp(child->name, (const xmlChar *)"LIST")) && (child->ns == ns))
4572 listChild = child->xmlChildrenNode;
4573 while (listChild != NULL)
4575 if ((!xmlStrcmp(listChild->name, (const xmlChar *)"PDSCH_TIME_DOM_RSRC_ALLOC")) && (listChild->ns == ns))
4577 if(parsePdschTimeDomRsrcAlloc(doc, ns, listChild, &pdschCfgCmn->timeDomAlloc[idx]) != ROK)
4583 listChild = listChild->next;
4586 child = child->next;
4594 /*******************************************************************
4596 * @brief Fill BCCH Configuration
4600 * Function : parseBcchCfg
4602 * Functionality: Fill BCCH Configuration
4604 * @params[in] XML document pointer
4606 * Current node in XML
4607 * Pointer to structure to be filled
4608 * @return ROK - success
4611 * ****************************************************************/
4612 uint8_t parseBcchCfg(xmlDocPtr doc, xmlNsPtr ns, xmlNodePtr cur, BcchCfg *bcchCfg)
4614 memset(bcchCfg, 0, sizeof(BcchCfg));
4615 cur = cur -> xmlChildrenNode;
4618 if ((!xmlStrcmp(cur->name, (const xmlChar *)"MOB_PRD_COEFF")) && (cur->ns == ns))
4620 bcchCfg->modPrdCoeff = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
4627 /*******************************************************************
4629 * @brief Fill PDCCH Configuration Common
4633 * Function : parsePdcchConfigCommon
4635 * Functionality: Fill PDCCH Configuration Common
4637 * @params[in] XML document pointer
4639 * Current node in XML
4640 * Pointer to structure to be filled
4641 * @return ROK - success
4644 * ****************************************************************/
4645 uint8_t parsePdcchConfigCommon(xmlDocPtr doc, xmlNsPtr ns, xmlNodePtr cur, PdcchCfgCommon *pdccgCfgCmn)
4648 xmlNodePtr child = NULLP;
4649 xmlNodePtr listChild = NULLP;
4651 memset(pdccgCfgCmn, 0, sizeof( PdcchCfgCommon));
4652 cur = cur -> xmlChildrenNode;
4655 if ((!xmlStrcmp(cur->name, (const xmlChar *)"PRESENT")) && (cur->ns == ns))
4657 pdccgCfgCmn->present = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
4660 if ((!xmlStrcmp(cur->name, (const xmlChar *)"CORESET_0_INDEX")) && (cur->ns == ns))
4662 pdccgCfgCmn->ctrlRsrcSetZero = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
4665 if ((!xmlStrcmp(cur->name, (const xmlChar *)"SEARCHSPACE_0_INDEX")) && (cur->ns == ns))
4667 pdccgCfgCmn->searchSpcZero = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
4670 if ((!xmlStrcmp(cur->name, (const xmlChar *)"PDCCH_SEARCH_SPACE_ID")) && (cur->ns == ns))
4672 pdccgCfgCmn->searchSpcId = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
4675 if ((!xmlStrcmp(cur->name, (const xmlChar *)"PDCCH_CTRL_RSRC_SET_ID")) && (cur->ns == ns))
4677 pdccgCfgCmn->ctrlRsrcSetId = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
4680 if ((!xmlStrcmp(cur->name, (const xmlChar *)"MONITOR_SLOT_PRD_OFFPRESENT")) && (cur->ns == ns))
4682 pdccgCfgCmn->monitorSlotPrdAndOffPresent = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
4685 if ((!xmlStrcmp(cur->name, (const xmlChar *)"LIST")) && (cur->ns == ns))
4687 child = cur->xmlChildrenNode;
4690 if ((!xmlStrcmp(child->name, (const xmlChar *)"MONITOR_LIST")) && (child->ns == ns))
4692 listChild = child->xmlChildrenNode;
4693 while (listChild != NULL)
4695 if ((!xmlStrcmp(listChild->name, (const xmlChar *)"MONITOR_SYMBOL_INSLOT")) && (listChild->ns == ns))
4697 pdccgCfgCmn->monitorSymbolsInSlot[idx] = atoi((char *)xmlNodeListGetString(doc, listChild->xmlChildrenNode, 1));
4700 listChild = listChild->next;
4703 child = child->next;
4707 if ((!xmlStrcmp(cur->name, (const xmlChar *)"NUMC_AGG_LVL1")) && (cur->ns == ns))
4709 pdccgCfgCmn->numCandAggLvl1 = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
4712 if ((!xmlStrcmp(cur->name, (const xmlChar *)"NUMC_AGG_LVL2")) && (cur->ns == ns))
4714 pdccgCfgCmn->numCandAggLvl2 = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
4717 if ((!xmlStrcmp(cur->name, (const xmlChar *)"NUMC_AGG_LVL4")) && (cur->ns == ns))
4719 pdccgCfgCmn->numCandAggLvl4 = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
4722 if ((!xmlStrcmp(cur->name, (const xmlChar *)"NUMC_AGG_LVL8")) && (cur->ns == ns))
4724 pdccgCfgCmn->numCandAggLvl8 = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
4727 if ((!xmlStrcmp(cur->name, (const xmlChar *)"NUMC_AGG_LVL16")) && (cur->ns == ns))
4729 pdccgCfgCmn->numCandAggLvl16 = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
4732 if ((!xmlStrcmp(cur->name, (const xmlChar *)"SEARCH_SPC_TYPE")) && (cur->ns == ns))
4734 pdccgCfgCmn->searchSpcType = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
4737 if ((!xmlStrcmp(cur->name, (const xmlChar *)"PDCCH_SERACH_SPACE_DCI_FORMAT")) && (cur->ns == ns))
4739 pdccgCfgCmn->commSrchSpcDciFrmt = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
4742 if ((!xmlStrcmp(cur->name, (const xmlChar *)"PDCCH_SEARCH_SPACE_ID_SIB1")) && (cur->ns == ns))
4744 pdccgCfgCmn->searchSpcSib1 = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
4747 if ((!xmlStrcmp(cur->name, (const xmlChar *)"PDCCH_SEARCH_SPACE_ID_PAGING")) && (cur->ns == ns))
4749 pdccgCfgCmn->pagingSearchSpc = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
4752 if ((!xmlStrcmp(cur->name, (const xmlChar *)"RA_PDCCH_SEARCH_SPACE_ID_PAGING")) && (cur->ns == ns))
4754 pdccgCfgCmn->raSearchSpc = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
4762 /*******************************************************************
4764 * @brief Fill DL Configuration Common
4768 * Function : parseDlCfgCommon
4770 * Functionality: Fill DL Configuration Common
4772 * @params[in] XML document pointer
4774 * Current node in XML
4775 * Pointer to structure to be filled
4776 * @return ROK - success
4779 * ****************************************************************/
4780 uint8_t parseDlCfgCommon(xmlDocPtr doc, xmlNsPtr ns, xmlNodePtr cur,DlCfgCommon *dlCfgCmn)
4782 memset(dlCfgCmn, 0, sizeof(DlCfgCommon));
4783 cur = cur -> xmlChildrenNode;
4786 if ((!xmlStrcmp(cur->name, (const xmlChar *)"NR_FREQ_BAND")) && (cur->ns == ns))
4788 dlCfgCmn->freqBandInd = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
4791 if ((!xmlStrcmp(cur->name, (const xmlChar *)"OFFSET_TO_POINT_A")) && (cur->ns == ns))
4793 dlCfgCmn->offsetToPointA = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
4796 if ((!xmlStrcmp(cur->name, (const xmlChar *)"FREQ_LOC_BW")) && (cur->ns == ns))
4798 dlCfgCmn->locAndBw = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
4801 if ((!xmlStrcmp(cur->name, (const xmlChar *)"SCS_SPEC_CARRIER")) && (cur->ns == ns))
4803 if(parseScsSpecCarrier(doc, ns, cur, &dlCfgCmn->dlScsCarrier) != ROK)
4809 if ((!xmlStrcmp(cur->name, (const xmlChar *)"PDCCH_CFG_COMMON")) && (cur->ns == ns))
4811 if(parsePdcchConfigCommon(doc, ns, cur, &dlCfgCmn->pdcchCfg) != ROK)
4817 if ((!xmlStrcmp(cur->name, (const xmlChar *)"PDSCH_CFG_COMMON")) && (cur->ns == ns))
4819 if(parsePdschCfgCommon(doc, ns, cur, &dlCfgCmn->pdschCfg) != ROK)
4825 if ((!xmlStrcmp(cur->name, (const xmlChar *)"BCCH_CFG")) && (cur->ns == ns))
4827 if(parseBcchCfg(doc, ns, cur, &dlCfgCmn->bcchCfg) != ROK)
4833 if ((!xmlStrcmp(cur->name, (const xmlChar *)"PCCH_CFG")) && (cur->ns == ns))
4835 if(parsePcchCfg(doc, ns, cur, &dlCfgCmn->pcchCfg) != ROK)
4845 /*******************************************************************
4847 * @brief Fill Serving Cell Config Common SIB
4851 * Function : parseSrvCellCfgCmnSib
4853 * Functionality: Fill Serving Cell Config Common SIB
4855 * @params[in] XML document pointer
4857 * Current node in XML
4858 * Pointer to structure to be filled
4859 * @return ROK - success
4862 * ****************************************************************/
4863 uint8_t parseSrvCellCfgCmnSib(xmlDocPtr doc, xmlNsPtr ns, xmlNodePtr cur,SrvCellCfgCommSib *srvCellCfgCmnSib)
4865 memset(srvCellCfgCmnSib, 0, sizeof(SrvCellCfgCommSib));
4866 cur = cur -> xmlChildrenNode;
4869 if ((!xmlStrcmp(cur->name, (const xmlChar *)"NR_SCS")) && (cur->ns == ns))
4871 srvCellCfgCmnSib->scs = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
4874 if ((!xmlStrcmp(cur->name, (const xmlChar *)"SSB_POS_INBURST")) && (cur->ns == ns))
4876 srvCellCfgCmnSib->ssbPosInBurst = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
4879 if ((!xmlStrcmp(cur->name, (const xmlChar *)"SSB_PERIODICITY")) && (cur->ns == ns))
4881 srvCellCfgCmnSib->ssbPrdServingCell = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
4884 if ((!xmlStrcmp(cur->name, (const xmlChar *)"SSB_PBCH_PWR")) && (cur->ns == ns))
4886 srvCellCfgCmnSib->ssPbchBlockPwr = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
4889 if ((!xmlStrcmp(cur->name, (const xmlChar *)"DL_CFG_COMMON")) && (cur->ns == ns))
4891 if(parseDlCfgCommon(doc, ns, cur, &srvCellCfgCmnSib->dlCfg) != ROK)
4897 if ((!xmlStrcmp(cur->name, (const xmlChar *)"UL_CFG_COMMON")) && (cur->ns == ns))
4899 if(parseUlCfgCommon(doc, ns, cur, &srvCellCfgCmnSib->ulCfg) != ROK)
4905 if ((!xmlStrcmp(cur->name, (const xmlChar *)"TDD_UL_DL_CFG_COMMON")) && (cur->ns == ns))
4907 if(parseTddUlDlCfgCommon(doc, ns, cur, &srvCellCfgCmnSib->tddCfg) != ROK)
4918 /*******************************************************************
4920 * @brief Fill SI Scheduling Information
4924 * Function : parseSiSchedInfo
4926 * Functionality: Fill SI Scheduling Information
4928 * @params[in] XML document pointer
4930 * Current node in XML
4931 * Pointer to structure to be filled
4932 * @return ROK - success
4935 * ****************************************************************/
4936 uint8_t parseSiSchedInfo(xmlDocPtr doc, xmlNsPtr ns, xmlNodePtr cur,SiSchedInfo *siSchedInfo)
4938 memset(siSchedInfo, 0, sizeof(SiSchedInfo));
4939 cur = cur -> xmlChildrenNode;
4942 if ((!xmlStrcmp(cur->name, (const xmlChar *)"WIN_LEN")) && (cur->ns == ns))
4944 siSchedInfo->winLen = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
4947 if ((!xmlStrcmp(cur->name, (const xmlChar *)"BROADCAST_STA")) && (cur->ns == ns))
4949 siSchedInfo->broadcastSta = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
4952 if ((!xmlStrcmp(cur->name, (const xmlChar *)"PERIODICITY")) && (cur->ns == ns))
4954 siSchedInfo->preiodicity = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
4957 if ((!xmlStrcmp(cur->name, (const xmlChar *)"SIB_TYPE")) && (cur->ns == ns))
4959 siSchedInfo->sibType = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
4962 if ((!xmlStrcmp(cur->name, (const xmlChar *)"SIB1_VAL_TAG")) && (cur->ns == ns))
4964 siSchedInfo->sibValTag = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
4972 /*******************************************************************
4974 * @brief Fill SIB1 Parameters
4978 * Function : parseSib1Params
4980 * Functionality: Fill SIB1 Parameters
4982 * @params[in] XML document pointer
4984 * Current node in XML
4985 * Pointer to structure to be filled
4986 * @return ROK - success
4989 * ****************************************************************/
4990 uint8_t parseSib1Params(xmlDocPtr doc, xmlNsPtr ns, xmlNodePtr cur,Sib1Params *sib1Params)
4992 memset(sib1Params, 0, sizeof(Sib1Params));
4993 cur = cur -> xmlChildrenNode;
4996 if ((!xmlStrcmp(cur->name, (const xmlChar *)"PLMN")) && (cur->ns == ns))
4998 if(parsePlmn(doc, ns, cur, &sib1Params->plmn) != ROK)
5004 if ((!xmlStrcmp(cur->name, (const xmlChar *)"TAC")) && (cur->ns == ns))
5006 sib1Params-> tac = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
5009 if ((!xmlStrcmp(cur->name, (const xmlChar *)"RANAC")) && (cur->ns == ns))
5011 sib1Params->ranac = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
5014 if ((!xmlStrcmp(cur->name, (const xmlChar *)"CELL_IDENTITY")) && (cur->ns == ns))
5016 sib1Params->cellIdentity = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
5019 if ((!xmlStrcmp(cur->name, (const xmlChar *)"CELL_RESVD_OPUSE")) && (cur->ns == ns))
5021 sib1Params->cellResvdForOpUse = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
5024 if ((!xmlStrcmp(cur->name, (const xmlChar *)"CONN_EST_FAIL_CNT")) && (cur->ns == ns))
5026 sib1Params->connEstFailCnt = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
5029 if ((!xmlStrcmp(cur->name, (const xmlChar *)"CONN_EST_FAIL_OFF_VALID")) && (cur->ns == ns))
5031 sib1Params->connEstFailOffValidity = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
5034 if ((!xmlStrcmp(cur->name, (const xmlChar *)"CONN_EST_FAIL_OFFSET")) && (cur->ns == ns))
5036 sib1Params->connEstFailOffset = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
5039 if ((!xmlStrcmp(cur->name, (const xmlChar *)"SI_SHED_INFO")) && (cur->ns == ns))
5041 if(parseSiSchedInfo(doc, ns, cur, &sib1Params->siSchedInfo) != ROK)
5047 if ((!xmlStrcmp(cur->name, (const xmlChar *)"SRV_CELLCFG_COM_SIB")) && (cur->ns == ns))
5049 if(parseSrvCellCfgCmnSib(doc, ns, cur, &sib1Params->srvCellCfgCommSib) != ROK)
5060 /*******************************************************************
5062 * @brief Fill RRM Policy List
5066 * Function : parseRrmPolicyList
5068 * Functionality: Fill RRM Policy List
5070 * @params[in] XML document pointer
5072 * Current node in XML
5073 * Pointer to structure to be filled
5074 * @return ROK - success
5077 * ****************************************************************/
5078 uint8_t parseRrmPolicyList(xmlDocPtr doc, xmlNsPtr ns, xmlNodePtr cur,RrmPolicyMemberList *rrmPolicyMemberList)
5080 memset(rrmPolicyMemberList, 0, sizeof(RrmPolicyMemberList));
5081 cur = cur->xmlChildrenNode;
5084 if ((!xmlStrcmp(cur->name, (const xmlChar *)"PLMN")) && (cur->ns == ns))
5086 if(parsePlmn(doc, ns, cur, &rrmPolicyMemberList->plmn) != ROK)
5092 if ((!xmlStrcmp(cur->name, (const xmlChar *)"SNSSAI")) && (cur->ns == ns))
5094 if(parseSnssai(doc, ns, cur, &rrmPolicyMemberList->snssai) != ROK)
5105 /*******************************************************************
5107 * @brief Fill RRM Policy Ratio
5111 * Function : parseRrmPolicyRatio
5113 * Functionality: Fill RRM Policy Ratio
5115 * @params[in] XML document pointer
5117 * Current node in XML
5118 * Pointer to structure to be filled
5119 * @return ROK - success
5122 * ****************************************************************/
5123 uint8_t parseRrmPolicyRatio(xmlDocPtr doc, xmlNsPtr ns, xmlNodePtr cur, RrmPolicyRatio *rrmPolicyRatio)
5125 memset(rrmPolicyRatio, 0, sizeof(RrmPolicyRatio));
5126 cur = cur -> xmlChildrenNode;
5129 if ((!xmlStrcmp(cur->name, (const xmlChar *)"MAX_RATIO")) && (cur->ns == ns))
5131 rrmPolicyRatio->maxRatio = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
5134 if ((!xmlStrcmp(cur->name, (const xmlChar *)"MIN_RATIO")) && (cur->ns == ns))
5136 rrmPolicyRatio->minRatio = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
5139 if ((!xmlStrcmp(cur->name, (const xmlChar *)"DEDICATED_RATIO")) && (cur->ns == ns))
5141 rrmPolicyRatio->dedicatedRatio = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
5149 /*******************************************************************
5150 /*******************************************************************
5152 * @brief Fill MAC Slice RRM Policy
5156 * Function : parseMacSliceRrmPolicy
5158 * Functionality: Fill MAC Slice RRM Policy
5160 * @params[in] XML document pointer
5162 * Current node in XML
5163 * Pointer to structure to be filled
5164 * @return ROK - success
5167 * ****************************************************************/
5168 uint8_t parseMacSliceRrmPolicy(xmlDocPtr doc, xmlNsPtr ns, xmlNodePtr cur, MacSliceRrmPolicy *rrmPolicy)
5172 memset(rrmPolicy, 0, sizeof(MacSliceRrmPolicy));
5173 cur = cur -> xmlChildrenNode;
5176 if ((!xmlStrcmp(cur->name, (const xmlChar *)"RESOURCE_TYPE")) && (cur->ns == ns))
5178 rrmPolicy->resourceType = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
5181 if ((!xmlStrcmp(cur->name, (const xmlChar *)"NUM_RRC_POLICY_MEM")) && (cur->ns == ns))
5183 rrmPolicy->numOfRrmPolicyMem = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
5186 if ((!xmlStrcmp(cur->name, (const xmlChar *)"RRM_POLICY_MUM_LIST")) && (cur->ns == ns))
5188 DU_ALLOC_SHRABL_BUF(rrmPolicy->rRMPolicyMemberList,\
5189 rrmPolicy->numOfRrmPolicyMem * sizeof(RrmPolicyMemberList*));
5191 if(!rrmPolicy->rRMPolicyMemberList)
5193 DU_LOG("\nERROR --> DU APP : %s: Memory allocation failed at line %d", __func__, __LINE__);
5197 for(memIdx = 0; memIdx < rrmPolicy->numOfRrmPolicyMem; memIdx++)
5199 DU_ALLOC_SHRABL_BUF(rrmPolicy->rRMPolicyMemberList[memIdx], sizeof(RrmPolicyMemberList));
5200 if (rrmPolicy->rRMPolicyMemberList[memIdx] == NULLP)
5202 DU_LOG("\nERROR --> DU_APP: %s: Memory allocation failed at line %d", __func__, __LINE__);
5206 if(parseRrmPolicyList(doc, ns, cur, rrmPolicy->rRMPolicyMemberList[memIdx]) != ROK)
5213 if ((!xmlStrcmp(cur->name, (const xmlChar *)"RRM_POLICY_RATIO")) && (cur->ns == ns))
5215 if(parseRrmPolicyRatio(doc, ns, cur, &rrmPolicy->policyRatio) != ROK)
5226 /*******************************************************************
5228 * @brief Fill MAC Slice Configuration
5232 * Function : parseMacSliceCfgReq
5234 * Functionality: Fill MAC Slice Configuration
5236 * @params[in] XML document pointer
5238 * Current node in XML
5239 * Pointer to structure to be filled
5240 * @return ROK - success
5243 * ****************************************************************/
5244 uint8_t parseMacSliceCfgReq(xmlDocPtr doc, xmlNsPtr ns, xmlNodePtr cur,MacSliceCfgReq *macSliceCfgReq)
5246 uint8_t policyIdx = 0;
5247 memset(macSliceCfgReq, 0, sizeof(MacSliceCfgReq));
5248 cur = cur -> xmlChildrenNode;
5251 if ((!xmlStrcmp(cur->name, (const xmlChar *)"NUM_RRC_POLICY")) && (cur->ns == ns))
5253 macSliceCfgReq->numOfRrmPolicy = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
5256 if ((!xmlStrcmp(cur->name, (const xmlChar *)"MAC_SLICE_RRM_POLICY")) && (cur->ns == ns))
5258 DU_ALLOC_SHRABL_BUF(macSliceCfgReq->listOfRrmPolicy, macSliceCfgReq->numOfRrmPolicy * sizeof(MacSliceRrmPolicy*));
5259 if(!macSliceCfgReq->listOfRrmPolicy)
5261 DU_LOG("\nERROR --> DU APP: %s: Memory allocation failed at line %d", __func__, __LINE__);
5265 for(policyIdx = 0; policyIdx < macSliceCfgReq->numOfRrmPolicy; policyIdx++)
5267 DU_ALLOC_SHRABL_BUF(macSliceCfgReq->listOfRrmPolicy[policyIdx], sizeof(MacSliceRrmPolicy));
5268 if (macSliceCfgReq->listOfRrmPolicy[policyIdx] == NULLP)
5270 DU_LOG("\nERROR --> DU_APP: %s: Memory allocation failed at line %d", __func__, __LINE__);
5273 if(parseMacSliceRrmPolicy(doc, ns, cur, macSliceCfgReq->listOfRrmPolicy[policyIdx]) != ROK)
5285 #ifdef THREAD_AFFINITY
5286 /*******************************************************************
5288 * @brief Set thread affinity to the core configured via XML file
5292 * Function : parseThreadAffinity
5294 * Functionality: Set thread affinity to the core configured
5297 * @params[in] XML document pointer
5299 * Current node in XML
5300 * Thread information
5301 * @return ROK - success
5304 * ****************************************************************/
5305 uint8_t parseThreadAffinity(xmlDocPtr doc, xmlNsPtr ns, xmlNodePtr cur, ThreadInfo *threads)
5307 cur = cur -> xmlChildrenNode;
5310 if ((!xmlStrcmp(cur->name, (const xmlChar *)"DU_APP_CORE")) && (cur->ns == ns))
5312 threads->duAppCoreId = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
5313 ODU_SET_THREAD_AFFINITY(&threads->duAppSTskId, SS_AFFINITY_MODE_EXCL, threads->duAppCoreId, 0);
5316 if ((!xmlStrcmp(cur->name, (const xmlChar *)"EGTP_CORE")) && (cur->ns == ns))
5318 threads->egtpCoreId = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
5319 ODU_SET_THREAD_AFFINITY(&threads->egtpSTskId, SS_AFFINITY_MODE_EXCL, threads->egtpCoreId, 0);
5322 if ((!xmlStrcmp(cur->name, (const xmlChar *)"RLC_MAC_CORE")) && (cur->ns == ns))
5324 threads->rlcMacCoreId = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
5325 ODU_SET_THREAD_AFFINITY(&threads->rlcMacSTskId, SS_AFFINITY_MODE_EXCL, threads->rlcMacCoreId, 0);
5328 if ((!xmlStrcmp(cur->name, (const xmlChar *)"RLC_UL_CORE")) && (cur->ns == ns))
5330 threads->rlcUlCoreId = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
5331 ODU_SET_THREAD_AFFINITY(&threads->rlcUlSTskId, SS_AFFINITY_MODE_EXCL, threads->rlcUlCoreId, 0);
5334 if ((!xmlStrcmp(cur->name, (const xmlChar *)"SCH_CORE")) && (cur->ns == ns))
5336 threads->schCoreId = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
5337 ODU_SET_THREAD_AFFINITY(&threads->schSTskId, SS_AFFINITY_MODE_EXCL, threads->schCoreId, 0);
5340 if ((!xmlStrcmp(cur->name, (const xmlChar *)"SCTP_CORE")) && (cur->ns == ns))
5342 threads->sctpCoreId = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
5343 ODU_SET_THREAD_AFFINITY(&threads->sctpSTskId, SS_AFFINITY_MODE_EXCL, threads->sctpCoreId, 0);
5346 if ((!xmlStrcmp(cur->name, (const xmlChar *)"LOWER_MAC_CORE")) && (cur->ns == ns))
5348 threads->lwrMacCoreId = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
5349 ODU_SET_THREAD_AFFINITY(&threads->lwrMacSTskId, SS_AFFINITY_MODE_EXCL, threads->lwrMacCoreId, 0);
5358 /*******************************************************************
5360 * @brief Fill DU Config Parmeters
5364 * Function : parseDuCfgParams
5368 * @params[in] XML document pointer
5370 * Current node in XML
5371 * @return ROK - success
5374 * ****************************************************************/
5375 uint8_t parseDuCfgParams(xmlDocPtr doc, xmlNsPtr ns, xmlNodePtr cur)
5377 char *tempDuName = "";
5385 cur = cur->xmlChildrenNode;
5388 if ((!xmlStrcmp(cur->name, (const xmlChar *)"THREAD_AFFINITY")) && (cur->ns == ns))
5390 #ifdef THREAD_AFFINITY
5391 if(parseThreadAffinity(doc, ns, cur, &duCfgParam.threadInfo) != ROK)
5398 #ifdef XML_BASED_CONFIG
5399 if ((!xmlStrcmp(cur->name, (const xmlChar *)"MAX_NUM_DRB")) && (cur->ns == ns))
5401 duCfgParam.maxNumDrb = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
5404 if ((!xmlStrcmp(cur->name, (const xmlChar *)"MAX_NUM_UE_SUPPORTED")) && (cur->ns == ns))
5406 duCfgParam.maxSupportedUes = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
5409 if ((!xmlStrcmp(cur->name, (const xmlChar *)"DU_ID")) && (cur->ns == ns))
5411 duCfgParam.duId = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
5414 if ((!xmlStrcmp(cur->name, (const xmlChar *)"DU_NAME")) && (cur->ns == ns))
5416 tempDuName =(char*) xmlNodeListGetString(doc, cur->xmlChildrenNode, 1);
5417 DU_ALLOC(duCfgParam.duName, strlen(tempDuName));
5418 if(!duCfgParam.duName)
5420 DU_LOG("\nERROR --> DU_APP: %s: Memory allocation failed at line %d", __func__, __LINE__);
5423 strcpy((char*)duCfgParam.duName, tempDuName);
5426 if ((!xmlStrcmp(cur->name, (const xmlChar *)"MAX_NUM_UE")) && (cur->ns == ns))
5428 duCfgParam.maxUe = atoi((char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
5432 if( getStartupConfig(&g_cfg) != ROK )
5436 cmInetAddr((S8*)g_cfg.DU_IPV4_Addr, &duIp);
5437 cmInetAddr((S8*)g_cfg.CU_IPV4_Addr, &cuIp);
5438 cmInetAddr((S8*)g_cfg.RIC_IPV4_Addr, &ricIp);
5441 if ((!xmlStrcmp(cur->name, (const xmlChar *)"DU_IP_V4_ADDR")) && (cur->ns == ns))
5443 duIpV4Addr = (char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1);
5444 cmInetAddr(duIpV4Addr, &(duIp));
5447 if ((!xmlStrcmp(cur->name, (const xmlChar *)"CU_IP_V4_ADDR")) && (cur->ns == ns))
5449 cuIpV4Addr = (char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1);
5450 cmInetAddr(cuIpV4Addr, &(cuIp));
5453 if ((!xmlStrcmp(cur->name, (const xmlChar *)"RIC_IP_V4_ADDR")) && (cur->ns == ns))
5455 ricIpV4Addr = (char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1);
5456 cmInetAddr(ricIpV4Addr, &(ricIp));
5460 if ((!xmlStrcmp(cur->name, (const xmlChar *)"SCTP")) && (cur->ns == ns))
5462 if(parseSctpParams(doc, ns, cur, &duCfgParam.sctpParams) != ROK)
5466 duCfgParam.sctpParams.duIpAddr.ipV4Pres = true;
5467 duCfgParam.sctpParams.duIpAddr.ipV4Addr = duIp;
5468 duCfgParam.sctpParams.cuIpAddr.ipV4Pres = true;
5469 duCfgParam.sctpParams.cuIpAddr.ipV4Addr = cuIp;
5470 duCfgParam.sctpParams.ricIpAddr.ipV4Pres = true;
5471 duCfgParam.sctpParams.ricIpAddr.ipV4Addr = ricIp;
5474 if ((!xmlStrcmp(cur->name, (const xmlChar *)"EGTP")) && (cur->ns == ns))
5476 if(parseEgtpParams(doc, ns, cur, &duCfgParam.egtpParams) != ROK)
5480 duCfgParam.egtpParams.localIp.ipV4Addr = duIp;
5481 duCfgParam.egtpParams.localIp.ipV4Pres = true;
5482 duCfgParam.egtpParams.destIp.ipV4Pres = true;
5483 duCfgParam.egtpParams.destIp.ipV4Addr = cuIp;
5484 duCfgParam.egtpParams.maxTunnelId = duCfgParam.maxNumDrb * duCfgParam.maxSupportedUes;
5487 if ((!xmlStrcmp(cur->name, (const xmlChar *)"MIB_PARAMS")) && (cur->ns == ns))
5489 if(parseMibParams(doc, ns, cur, &duCfgParam.mibParams) != ROK)
5495 if ((!xmlStrcmp(cur->name, (const xmlChar *)"F1_RRC_VERSION")) && (cur->ns == ns))
5497 if(parseF1RrcVersion(doc, ns, cur, &duCfgParam.rrcVersion) != ROK)
5503 if ((!xmlStrcmp(cur->name, (const xmlChar *)"F1_DU_SRVD_CELL_INFO")) && (cur->ns == ns))
5505 if(parseF1DuServedCellInfo(doc, ns, cur, &duCfgParam.srvdCellLst[0]) != ROK)
5511 if ((!xmlStrcmp(cur->name, (const xmlChar *)"MAC_CELL_CFG")) && (cur->ns == ns))
5513 if(parseMacCellCfg(doc, ns, cur, &duCfgParam.macCellCfg) != ROK)
5519 if ((!xmlStrcmp(cur->name, (const xmlChar *)"SIB1_PARAMS")) && (cur->ns == ns))
5521 if(parseSib1Params(doc, ns, cur, &duCfgParam.sib1Params) != ROK)
5527 if ((!xmlStrcmp(cur->name, (const xmlChar *)"SLICE_CFG")) && (cur->ns == ns))
5529 if(parseMacSliceCfgReq(doc, ns, cur, &duCfgParam.tempSliceCfg) != ROK)
5541 /*******************************************************************
5543 * @brief Reads config and posts message to du_app on completion
5547 * Function : duReadCfg
5550 * - Reads configuration from xml file and stores in DB
5551 * - Post to du_app for further processing
5554 * @return ROK - success
5557 * ****************************************************************/
5560 const char *filename = "../build/config/odu_config.xml";
5561 xmlDocPtr doc = NULLP;
5562 xmlNodePtr cur = NULLP;
5563 xmlNsPtr ns = NULLP;
5565 doc = xmlParseFile(filename);
5568 DU_LOG("\nERROR --> DU_APP: Failed to parse the XML file");
5572 cur = xmlDocGetRootElement(doc);
5573 ns = xmlSearchNsByHref(doc, cur, (const xmlChar *)"urn:o-ran:odu:configuration");
5576 DU_LOG("\nERROR --> DU_APP: XML Namespace not found.\n");
5582 parseDuCfgParams(doc, ns, cur);
5590 /* Read configs into duCfgParams */
5591 if(readCfg() != ROK)
5593 DU_LOG("\nERROR --> DU_APP : Reading configuration failed");
5598 /* Fill pst structure */
5599 memset(&(pst), 0, sizeof(Pst));
5600 pst.srcEnt = (Ent)ENTDUAPP;
5601 pst.srcInst = (Inst)DU_INST;
5602 pst.srcProcId = DU_PROC;
5603 pst.dstEnt = pst.srcEnt;
5604 pst.dstInst = pst.srcInst;
5605 pst.dstProcId = pst.srcProcId;
5607 pst.selector = ODU_SELECTOR_TC;
5610 /* Initialize the timer blocks */
5611 cmInitTimers(&(duCb.e2apDb.e2TimersInfo.e2Timers.e2SetupTimer), 1);
5612 cmInitTimers(&(duCb.e2apDb.e2TimersInfo.e2Timers.ricServiceUpdateTimer.timer), 1);
5613 cmInitTimers(&(duCb.e2apDb.e2TimersInfo.e2Timers.e2NodeConfigUpdate.timer), 1);
5615 /* Initialzie the timer queue */
5616 memset(&(duCb.duTimersInfo.tmrTq), 0, sizeof(CmTqType) * DU_TQ_SIZE);
5618 /* Initialize the timer control point */
5619 memset(&(duCb.duTimersInfo.tmrTqCp), 0, sizeof(CmTqCp));
5620 duCb.duTimersInfo.tmrTqCp.tmrLen = DU_TQ_SIZE;
5622 /* Initialize the timer resolution */
5623 duCb.duTimersInfo.tmrRes = DU_TIMER_RESOLUTION;
5625 /* Timer Registration request to system services */
5626 if (ODU_REG_TMR_MT(pst.srcEnt, pst.srcInst, duCb.duTimersInfo.tmrRes, duActvTmr) != ROK)
5628 DU_LOG("\nERROR --> DU_APP : Failed to register timer");
5632 if(ODU_GET_MSG_BUF(DFLT_REGION, DU_POOL, &mBuf) != ROK)
5634 DU_LOG("\nERROR --> DU_APP : Memory allocation failed in duReadCfg");
5638 if (ODU_POST_TASK(&pst, mBuf) != ROK)
5640 DU_LOG("\nERROR --> DU_APP : ODU_POST_TASK failed in duReadCfg");
5647 /*******************************************************************
5649 * @brief Prints all DU Configuration
5653 * Function : printDuConfig
5656 * - Prints all DU configurations
5661 * ****************************************************************/
5662 void printDuConfig()
5664 uint8_t sliceIdx = 0, pfIdx = 0, rsrcIdx = 0, ssbMaskIdx = 0, fdmIdx = 0;
5665 uint8_t monitoringSymbIdx = 0, poIdx = 0, policyIdx = 0, memIdx = 0;
5666 __attribute__((unused)) SctpParams *sctp;
5667 __attribute__((unused)) F1EgtpParams *egtp;
5668 __attribute__((unused)) MibParams *mib;
5669 __attribute__((unused)) F1RrcVersion *f1RrcVersion;
5670 F1DuCellInfo *f1DuCellInfo;
5671 F1CellInfo *f1CellInfo;
5672 __attribute__((unused)) F1DuSysInfo *duSysInfo;
5673 __attribute__((unused)) F1BrdcstPlmnInfo *brdcstPlmnInfo;
5674 NrModeInfo *nrModeInfo;
5675 __attribute__((unused)) F1NrFddInfo *f1NrFddInfo;
5676 F1SrvdPlmn *srvdPlmn;
5677 SupportedSliceList *sliceSuppLst;
5678 MacCellCfg *macCellCfg;
5679 __attribute__((unused)) CarrierCfg *carrierCfg;
5681 PlmnInfoList *plmnInfoList;
5682 Sib1CellCfg *sib1Cfg;
5683 SchPageCfg *pageCfg;
5684 __attribute__((unused)) PdcchConfigSib1 *pdcchConfigSib1;
5685 BwpDlConfig *bwpDlCfg;
5686 __attribute__((unused)) BwpParams *bwp;
5687 PdcchConfigCommon *pdcchCfgCmn;
5688 SearchSpaceCfg *searchSpaceCfg;
5689 __attribute__((unused)) CandidatesInfo *candidateInfo;
5690 PdschConfigCommon *pdschCfgCmn;
5691 __attribute__((unused)) PdschCfgCommTimeDomRsrcAlloc *pdschCmnTimeDomRsrcAlloc;
5692 BwpUlConfig *bwpUlCfg;
5693 __attribute__((unused)) PucchConfigCommon *pucchCfgCmn;
5694 PuschConfigCommon *puschCfgCmn;
5695 __attribute__((unused)) PuschTimeDomRsrcAlloc *puschTimeDomRsrcAlloc;
5696 __attribute__((unused)) SsbCfg *ssbCfg;
5697 __attribute__((unused)) CsiRsCfg *csiRsCfg;
5699 __attribute__((unused)) PrachFdmInfo *prachFdmInfo;
5700 __attribute__((unused)) PrecodingConf *precodCfg;
5701 __attribute__((unused)) BeamformingConf *beamFormingCfg;
5702 Sib1Params *sib1Params;
5703 __attribute__((unused)) SiSchedInfo *siSchedInfo;
5704 SrvCellCfgCommSib *srvCellCfgCmnSib;
5705 DlCfgCommon *dlCfgCmn;
5706 PdcchCfgCommon *pdcchCfgCommon;
5707 PdschCfgCommon *pdschCfgCommon;
5708 __attribute__((unused)) PdschTimeDomainRsrcAlloc *pdschTimeDomRsrcAlloc;
5709 __attribute__((unused)) BcchCfg *bcchCfg;
5710 __attribute__((unused)) PcchCfg *pcchCfg;
5711 UlCfgCommon *ulCfgCmn;
5712 RachCfgCommon *rachCfgCmn;
5713 PuschCfgCommon *puschCfgCommon;
5714 __attribute__((unused)) PuschCfgCmnTimeDomAlloc *puschCmnTimeDomRsrsAlloc;
5715 PucchCfgCommon *pucchCfgCommon;
5716 __attribute__((unused)) TddUlDlCfgCommon *tddUlDlCfgCmn;
5717 MacSliceCfgReq *macSliceCfg;
5718 MacSliceRrmPolicy *rrmPolicy;
5719 __attribute__((unused)) RrmPolicyRatio *rrmPolicyRatio;
5720 __attribute__((unused)) RrmPolicyMemberList *rrmPolicyMemberList;
5723 F1NrTddInfo *f1NrTddInfo;
5727 DU_LOG("\n ** DU CONFIGURATION ** \n");
5728 DU_LOG("DU ID %d\n", duCfgParam.duId);
5729 DU_LOG("DU Name %s\n", duCfgParam.duName);
5731 DU_LOG("\n ** Thread Affinity ** \n");
5732 DU_LOG("DU APP CORE ID %d\n", duCfgParam.threadInfo.duAppCoreId);
5733 DU_LOG("EGTP CORE ID %d\n", duCfgParam.threadInfo.egtpCoreId);
5734 DU_LOG("SCTP CORE ID %d\n", duCfgParam.threadInfo.sctpCoreId);
5735 DU_LOG("RLC-UL CORE ID %d\n", duCfgParam.threadInfo.rlcUlCoreId);
5736 DU_LOG("RLC-DL and MAC CORE ID %d\n", duCfgParam.threadInfo.rlcMacCoreId);
5737 DU_LOG("SCH CORE ID %d\n", duCfgParam.threadInfo.schCoreId);
5738 DU_LOG("Lower MAC CORE ID %d\n", duCfgParam.threadInfo.lwrMacCoreId);
5740 DU_LOG("MAX NUM DRB %d\n", duCfgParam.maxNumDrb);
5741 DU_LOG("MAX SUPPORTED UE %d\n", duCfgParam.maxSupportedUes);
5742 DU_LOG("MAX UE %d\n",duCfgParam.maxUe);
5744 sctp = &duCfgParam.sctpParams;
5745 DU_LOG("\n ** SCTP PARAMETER ** \n");
5746 DU_LOG("DU IPv4 Address present %u\n", sctp->duIpAddr.ipV4Pres);
5747 DU_LOG("DU IP Address %u\n", sctp->duIpAddr.ipV4Addr);
5748 DU_LOG("CU IPv4 Address present %u\n", sctp->cuIpAddr.ipV4Pres);
5749 DU_LOG("CU IP Address %u\n", sctp->cuIpAddr.ipV4Addr);
5750 DU_LOG("RIC IPv4 Address present %u\n", sctp->ricIpAddr.ipV4Pres);
5751 DU_LOG("RIC IP Address %u\n", sctp->ricIpAddr.ipV4Addr);
5752 DU_LOG("SCTP Port at DU for F1 Interface %d\n", sctp->duPort[F1_INTERFACE]);
5753 DU_LOG("SCTP Port at CU for F1 Interface %d\n", sctp->cuPort);
5754 DU_LOG("SCTP Port at DU for E2 Interface %d\n", sctp->duPort[E2_INTERFACE]);
5755 DU_LOG("SCTP Port at RIC for E2 Interface %d\n", sctp->ricPort);
5757 egtp = &duCfgParam.egtpParams;
5758 DU_LOG("\n ** EGTP PARAMETER ** \n");
5759 DU_LOG("DU IP Address %d\n", egtp->localIp.ipV4Addr);
5760 DU_LOG("CU IP Address %d\n", egtp->destIp.ipV4Addr);
5761 DU_LOG("EGTP Port at DU %d\n", egtp->localPort);
5762 DU_LOG("EGTP Port at CU %d\n", egtp->destPort);
5763 DU_LOG("Minimum Tunnel ID %d\n", egtp->minTunnelId);
5764 DU_LOG("Maximum Tunnel ID %d\n",egtp->maxTunnelId);
5766 mib = &duCfgParam.mibParams;
5767 DU_LOG("\n ** MIB PARAMETER ** \n");
5768 DU_LOG("System Frame Number %d\n", mib->sysFrmNum);
5769 DU_LOG("Subcarrier Spacing Common %ld\n", mib->subCarrierSpacingCommon);
5770 DU_LOG("SSB Subcarrier Offset %ld\n", mib->ssb_SubcarrierOffset);
5771 DU_LOG("DMRS Type-A Position %ld\n", mib->dmrs_TypeA_Position);
5772 DU_LOG("Control Resource Set Zero %ld\n", mib->controlResourceSetZero);
5773 DU_LOG("Search Space Zero %ld\n", mib->searchSpaceZero);
5774 DU_LOG("Cell Barred %ld\n", mib->cellBarred);
5775 DU_LOG("Intra Frequency Reselection %ld\n", mib->intraFreqReselection);
5777 f1RrcVersion = &duCfgParam.rrcVersion;
5778 DU_LOG("\n ** RRC Version ** \n");
5779 DU_LOG("RRC Version %s\n", f1RrcVersion->rrcVer);
5780 DU_LOG("Extended RRC Version %d\n", f1RrcVersion->extRrcVer);
5782 duSysInfo = &duCfgParam.srvdCellLst[0].duSysInfo;
5783 DU_LOG("\n ** DU System Information ** \n");
5784 DU_LOG("MIB length %d\n", duSysInfo->mibLen);
5785 DU_LOG("MIB message %s\n", duSysInfo->mibMsg);
5786 DU_LOG("SIB1 length %d\n", duSysInfo->sib1Len);
5787 DU_LOG("SIB1 message %s\n", duSysInfo->sib1Msg);
5789 f1DuCellInfo = &duCfgParam.srvdCellLst[0].duCellInfo;
5790 DU_LOG("\n ** DU Cell Information ** \n");
5792 f1CellInfo = &f1DuCellInfo->cellInfo;
5793 DU_LOG("NR PCI %d\n", f1CellInfo->nrPci);
5794 DU_LOG("DU TAC %d\n", f1DuCellInfo->tac);
5795 DU_LOG("EPS TAC %d\n", f1DuCellInfo->epsTac);
5796 DU_LOG("Measurement Time Configuration Duration %d\n", f1DuCellInfo->measTimeCfgDuration);
5797 DU_LOG("Cell Direction %d\n", f1DuCellInfo->cellDir);
5798 DU_LOG("Cell Type %d\n", f1DuCellInfo->cellType);
5800 DU_LOG("\n ** Cell Info : NR CGI ** \n");
5801 DU_LOG("Cell Id %d\n",f1CellInfo->nrCgi.cellId);
5802 DU_LOG("PLMN : mcc[0] %d\n", f1CellInfo->nrCgi.plmn.mcc[0]);
5803 DU_LOG("PLMN : mcc[1] %d\n", f1CellInfo->nrCgi.plmn.mcc[1]);
5804 DU_LOG("PLMN : mcc[2] %d\n", f1CellInfo->nrCgi.plmn.mcc[2]);
5805 DU_LOG("PLMN : mnc[0] %d\n", f1CellInfo->nrCgi.plmn.mnc[0]);
5806 DU_LOG("PLMN : mnc[1] %d\n", f1CellInfo->nrCgi.plmn.mnc[1]);
5807 DU_LOG("PLMN : mnc[2] %d\n", f1CellInfo->nrCgi.plmn.mnc[2]);
5809 srvdPlmn = &f1CellInfo->srvdPlmn[0];
5810 DU_LOG("\n ** Cell Info : Served PLMN ** \n");
5811 DU_LOG("PLMN : mcc[0] %d\n", srvdPlmn->plmn.mcc[0]);
5812 DU_LOG("PLMN : mcc[1] %d\n", srvdPlmn->plmn.mcc[1]);
5813 DU_LOG("PLMN : mcc[2] %d\n", srvdPlmn->plmn.mcc[2]);
5814 DU_LOG("PLMN : mnc[0] %d\n", srvdPlmn->plmn.mnc[0]);
5815 DU_LOG("PLMN : mnc[1] %d\n", srvdPlmn->plmn.mnc[1]);
5816 DU_LOG("PLMN : mnc[2] %d\n", srvdPlmn->plmn.mnc[2]);
5817 DU_LOG("EXT_PLMN : mcc[0] %d\n", srvdPlmn->extPlmn.mcc[0]);
5818 DU_LOG("EXT_PLMN : mcc[1] %d\n", srvdPlmn->extPlmn.mcc[1]);
5819 DU_LOG("EXT_PLMN : mcc[2] %d\n", srvdPlmn->extPlmn.mcc[2]);
5820 DU_LOG("EXT_PLMN : mnc[0] %d\n", srvdPlmn->extPlmn.mnc[0]);
5821 DU_LOG("EXT_PLMN : mnc[1] %d\n", srvdPlmn->extPlmn.mnc[1]);
5822 DU_LOG("EXT_PLMN : mnc[2] %d\n", srvdPlmn->extPlmn.mnc[2]);
5824 sliceSuppLst = &srvdPlmn->taiSliceSuppLst;
5825 DU_LOG("\n ** Cell Info : Served PLMN : Supported Slice List ** \n");
5826 DU_LOG("Number of Slices supported %d\n", sliceSuppLst->numSupportedSlices);
5827 for (sliceIdx = 0; sliceIdx < sliceSuppLst->numSupportedSlices; sliceIdx++)
5830 DU_LOG("\tSST %d\n", (*sliceSuppLst->snssai[sliceIdx]).sst);
5831 DU_LOG("\tSD %d %d %d\n", (*sliceSuppLst->snssai[sliceIdx]).sd[0], (*sliceSuppLst->snssai[sliceIdx]).sd[1], \
5832 (*sliceSuppLst->snssai[sliceIdx]).sd[2]);
5835 brdcstPlmnInfo = &f1DuCellInfo->brdcstPlmnInfo[0];
5836 DU_LOG("\n ** DU Cell Information : Broadcast PLMN Info ** \n");
5837 DU_LOG("TAC %d\n", brdcstPlmnInfo->tac);
5838 DU_LOG("NR Cell Id %d\n", brdcstPlmnInfo->nrCellId);
5839 DU_LOG("RANAC %d\n", brdcstPlmnInfo->ranac);
5841 DU_LOG("PLMN : mcc[0] %d\n", brdcstPlmnInfo->plmn[0].mcc[0]);
5842 DU_LOG("PLMN : mcc[1] %d\n", brdcstPlmnInfo->plmn[0].mcc[1]);
5843 DU_LOG("PLMN : mcc[2] %d\n", brdcstPlmnInfo->plmn[0].mcc[2]);
5844 DU_LOG("PLMN : mnc[0] %d\n", brdcstPlmnInfo->plmn[0].mnc[0]);
5845 DU_LOG("PLMN : mnc[1] %d\n", brdcstPlmnInfo->plmn[0].mnc[1]);
5846 DU_LOG("PLMN : mnc[2] %d\n", brdcstPlmnInfo->plmn[0].mnc[2]);
5848 DU_LOG("EXT_PLMN : mcc[0] %d\n", brdcstPlmnInfo->extPlmn[0].mcc[0]);
5849 DU_LOG("EXT_PLMN : mcc[1] %d\n", brdcstPlmnInfo->extPlmn[0].mcc[1]);
5850 DU_LOG("EXT_PLMN : mcc[2] %d\n", brdcstPlmnInfo->extPlmn[0].mcc[2]);
5851 DU_LOG("EXT_PLMN : mnc[0] %d\n", brdcstPlmnInfo->extPlmn[0].mnc[0]);
5852 DU_LOG("EXT_PLMN : mnc[1] %d\n", brdcstPlmnInfo->extPlmn[0].mnc[1]);
5853 DU_LOG("EXT_PLMN : mnc[2] %d\n", brdcstPlmnInfo->extPlmn[0].mnc[2]);
5855 nrModeInfo = &f1DuCellInfo->f1Mode;
5856 f1NrFddInfo = &nrModeInfo->mode.fdd;
5857 DU_LOG("\n ** DU Cell Information : NR Mode Info ** \n");
5859 DU_LOG("\n ** NR Mode Info : FDD ** \n");
5860 DU_LOG("\n ** NR Mode Info : FDD : UL NR Frequency ** \n");
5861 DU_LOG("NR ARFCN %d\n", f1NrFddInfo->ulNrFreqInfo.nrArfcn);
5862 DU_LOG("SUL : ARFCN %d\n",f1NrFddInfo->ulNrFreqInfo.sulInfo.sulArfcn);
5863 DU_LOG("SUL : Transmission BW Subcarrier Spacing %d\n", f1NrFddInfo->ulNrFreqInfo.sulInfo.sulTxBw.nrScs);
5864 DU_LOG("SUL : Number of RBs in Transmission BW %d\n", f1NrFddInfo->ulNrFreqInfo.sulInfo.sulTxBw.nrb);
5865 DU_LOG("NR Frequency Band %d\n", f1NrFddInfo->ulNrFreqInfo.freqBand[0].nrFreqBand);
5866 DU_LOG("SUL Band %d\n", f1NrFddInfo->ulNrFreqInfo.freqBand[0].sulBand[0]);
5868 DU_LOG("\n ** NR Mode Info : FDD : DL NR Frequency ** \n");
5869 DU_LOG("NR ARFCN %d\n", f1NrFddInfo->dlNrFreqInfo.nrArfcn);
5870 DU_LOG("SUL : ARFCN %d\n",f1NrFddInfo->dlNrFreqInfo.sulInfo.sulArfcn);
5871 DU_LOG("SUL : Transmission BW Subcarrier Sapcing %d\n", f1NrFddInfo->dlNrFreqInfo.sulInfo.sulTxBw.nrScs);
5872 DU_LOG("SUL : Number of RBs in Transmission BW %d\n", f1NrFddInfo->dlNrFreqInfo.sulInfo.sulTxBw.nrb);
5873 DU_LOG("NR Frequency Band %d\n", f1NrFddInfo->dlNrFreqInfo.freqBand[0].nrFreqBand);
5874 DU_LOG("SUL Band %d\n", f1NrFddInfo->dlNrFreqInfo.freqBand[0].sulBand[0]);
5876 DU_LOG("\n ** NR Mode Info : FDD : UL Transmission Bandwidth ** \n");
5877 DU_LOG("Subscarrier spacing %d\n", f1NrFddInfo->ulTxBw.nrScs);
5878 DU_LOG("Number of RBs %d\n", f1NrFddInfo->ulTxBw.nrb);
5880 DU_LOG("\n ** NR Mode Info : FDD : DL Transmission Bandwidth ** \n");
5881 DU_LOG("Subcarrier Spacing %d\n", f1NrFddInfo->dlTxBw.nrScs);
5882 DU_LOG("Number of RBs %d\n", f1NrFddInfo->dlTxBw.nrb);
5886 f1NrTddInfo = &nrModeInfo ->mode.tdd;
5888 DU_LOG("\n ** NR Mode Info : TDD : NR Frequency ** \n");
5889 DU_LOG("NR ARFCN %d\n", f1NrTddInfo->nrFreqInfo.nrArfcn);
5890 DU_LOG("SUL : ARFCN %d\n",f1NrTddInfo->nrFreqInfo.sulInfo.sulArfcn);
5891 DU_LOG("SUL : Transmission BW Subscarrier Spacing %d\n", f1NrTddInfo->nrFreqInfo.sulInfo.sulTxBw.nrScs);
5892 DU_LOG("SUL : Number of RBs in Transmission BW %d\n", f1NrTddInfo->nrFreqInfo.sulInfo.sulTxBw.nrb);
5893 DU_LOG("NR Frequency Band %d\n", f1NrTddInfo->nrFreqInfo.freqBand[0].nrFreqBand);
5894 DU_LOG("SUL Band %d\n", f1NrTddInfo->nrFreqInfo.freqBand[0].sulBand[0]);
5896 DU_LOG("\n ** NR Mode Info : TDD : NR Transmission Bandwidth ** \n");
5897 DU_LOG("Subcarrier Spacing %d\n", f1NrTddInfo->nrTxBw.nrScs);
5898 DU_LOG("Number of RBs %d\n", f1NrTddInfo->nrTxBw.nrb);
5901 macCellCfg = &duCfgParam.macCellCfg;
5902 DU_LOG("\n ** MAC CELL CONFIGURATION ** \n");
5903 DU_LOG("Cell Id %d\n", macCellCfg->cellId);
5905 DU_LOG("\n ** MAC Cell Configuration : Carrier Configuration ** \n");
5906 carrierCfg = &macCellCfg ->carrCfg;
5907 DU_LOG("DL Bandwidth %d\n", carrierCfg->dlBw);
5908 DU_LOG("DL ARFCN %d\n", carrierCfg->arfcnDL);
5909 DU_LOG("UL Bandwidth %d\n", carrierCfg->ulBw);
5910 DU_LOG("UL ARFCN %d\n", carrierCfg->arfcnUL);
5911 DU_LOG("Number of Transmission Antenna %d\n", carrierCfg->numTxAnt);
5912 DU_LOG("Number of Received Antenna %d\n", carrierCfg->numRxAnt);
5914 DU_LOG("\n ** MAC Cell Configuration : Cell Configuration ** \n");
5915 cellCfg = &macCellCfg ->cellCfg;
5916 DU_LOG("Operational State %d\n", cellCfg->opState);
5917 DU_LOG("Administration State %d\n", cellCfg->adminState);
5918 DU_LOG("Cell Current State %d\n", cellCfg->cellState);
5919 DU_LOG("NR PCI %d\n", cellCfg->phyCellId);
5920 DU_LOG("TAC: %d\n", cellCfg->tac);
5921 DU_LOG("SSB Freqeuncy %d\n", cellCfg->ssbFreq);
5922 DU_LOG("Subcarrier Spacing: %d\n", cellCfg->subCarrSpacing);
5923 DU_LOG("Duplex Mode %d\n", cellCfg->dupType);
5925 DU_LOG("\n ** MAC Cell Configuration : Cell Configuration : PLMN Info List ** \n");
5926 plmnInfoList = &cellCfg ->plmnInfoList[0];
5927 DU_LOG("PLMN : mcc[0] %d\n", plmnInfoList->plmn.mcc[0]);
5928 DU_LOG("PLMN : mcc[1] %d\n", plmnInfoList->plmn.mcc[1]);
5929 DU_LOG("PLMN : mcc[2] %d\n", plmnInfoList->plmn.mcc[2]);
5930 DU_LOG("PLMN : mnc[0] %d\n", plmnInfoList->plmn.mnc[0]);
5931 DU_LOG("PLMN : mnc[1] %d\n", plmnInfoList->plmn.mnc[1]);
5932 DU_LOG("PLMN : mnc[2] %d\n", plmnInfoList->plmn.mnc[2]);
5934 DU_LOG("Number of Slice supported %d\n", plmnInfoList->suppSliceList.numSupportedSlices);
5935 for(sliceIdx = 0; sliceIdx < plmnInfoList->suppSliceList.numSupportedSlices; sliceIdx++)
5938 DU_LOG("\nSST %d\n", (*plmnInfoList->suppSliceList.snssai[sliceIdx]).sst);
5939 DU_LOG("\nSD %d %d %d\n", (*plmnInfoList->suppSliceList.snssai[sliceIdx]).sd[0], \
5940 (*plmnInfoList->suppSliceList.snssai[sliceIdx]).sd[1],(*plmnInfoList->suppSliceList.snssai[sliceIdx]).sd[2]);
5943 DU_LOG("\n ** MAC Cell Configuration : Cell Configuration : SIB1 ** \n");
5944 sib1Cfg = &cellCfg->sib1Cfg;
5945 DU_LOG("SIB1 PDU Length %d", sib1Cfg->sib1PduLen);
5946 DU_LOG("SIB1 PDU %s", sib1Cfg->sib1Pdu);
5948 DU_LOG("\n ** MAC Cell Configuration : Cell Configuration : SIB1 : Paging Configuration ** \n");
5949 pageCfg = &sib1Cfg->pagingCfg;
5951 DU_LOG("Number of Paging Occassion %d\n", pageCfg->numPO);
5952 if (pageCfg->poPresent == true)
5953 DU_LOG("FirstPDCCH-Monitoring Paging Occassion present : TRUE\n");
5955 DU_LOG("FirstPDCCH-Monitoring Paging Occassion present : FALSE\n");
5957 for(pfIdx = 0; pfIdx < MAX_PO_PER_PF; pfIdx++)
5959 DU_LOG("Paging Occassion at Paging Frame [%d] : %d\n", pfIdx, pageCfg->pagingOcc[pfIdx]);
5962 pdcchConfigSib1 = &sib1Cfg->pdcchCfgSib1;
5963 DU_LOG("\n ** MAC Cell Configuration : Cell Configuration : SIB1 : PDCCH ** \n");
5964 DU_LOG("Coreset Zero Index %d\n", pdcchConfigSib1->coresetZeroIndex);
5965 DU_LOG("Search Space Zero Index %d\n", pdcchConfigSib1->searchSpaceZeroIndex);
5967 bwpDlCfg = &cellCfg->initialDlBwp;
5968 DU_LOG("\n ** MAC Cell Configuration : Cell Configuration : DL BWP Configuration ** \n");
5970 DU_LOG("\n ** MAC Cell Configuration : Cell Configuration : DL BWP : BWP ** \n");
5971 bwp = &bwpDlCfg->bwp;
5972 DU_LOG("First PRB %d\n", bwp->firstPrb);
5973 DU_LOG("Number of PRBs %d\n", bwp->numPrb);
5974 DU_LOG("Subcarrier Spacing %d\n", bwp->scs);
5975 DU_LOG("Cyclic Perfix %d\n", bwp->cyclicPrefix);
5977 DU_LOG("\n ** MAC Cell Configuration : Cell Configuration : DL BWP : PDCCH Config Common ** \n");
5978 pdcchCfgCmn = &bwpDlCfg->pdcchCommon;
5979 DU_LOG("RA Search Space ID %d\n", pdcchCfgCmn->raSearchSpaceId);
5981 DU_LOG("\n ** MAC Cell Configuration : Cell Configuration : DL BWP : PDCCH Config Common : Search Space ** \n");
5982 searchSpaceCfg = &pdcchCfgCmn->commonSearchSpace;
5983 DU_LOG("Search Space ID %d\n", searchSpaceCfg->searchSpaceId);
5984 DU_LOG("Coreset ID %d\n", searchSpaceCfg->coresetId);
5985 DU_LOG("Monitoring Slot %d\n", searchSpaceCfg->monitoringSlot);
5986 DU_LOG("Duration %d\n", searchSpaceCfg->duration);
5987 DU_LOG("Monitoring Symbol %x\n", searchSpaceCfg->monitoringSymbol);
5989 candidateInfo = &searchSpaceCfg->candidate;
5990 DU_LOG("Number of Candidates in Aggregation Level_1 %d\n", candidateInfo->aggLevel1);
5991 DU_LOG("Number of Candidates in Aggregation Level_2 %d\n", candidateInfo->aggLevel2);
5992 DU_LOG("Number of Candidates in Aggregation Level_4 %d\n", candidateInfo->aggLevel4);
5993 DU_LOG("Number of Candidates in Aggregation Level_8 %d\n", candidateInfo->aggLevel8);
5994 DU_LOG("Number of Candidates in Aggregation Level_16 %d\n", candidateInfo->aggLevel16);
5996 DU_LOG("\n ** MAC Cell Configuration : Cell Configuration : DL BWP : PDSCH Config Common ** \n");
5997 pdschCfgCmn = &bwpDlCfg->pdschCommon;
5998 DU_LOG("Number of Time Domain Resource Allocation %d\n", pdschCfgCmn->numTimeDomAlloc);
6000 for (rsrcIdx = 0; rsrcIdx < pdschCfgCmn->numTimeDomAlloc; rsrcIdx++)
6002 DU_LOG("Time Domain Resource Allocation Idx %d\n", rsrcIdx);
6003 pdschCmnTimeDomRsrcAlloc = &pdschCfgCmn->timeDomRsrcAllocList[rsrcIdx];
6004 DU_LOG("\tK0 %d\n", pdschCmnTimeDomRsrcAlloc->k0);
6005 DU_LOG("\tPDSCH Mapping Type %d\n", pdschCmnTimeDomRsrcAlloc->mappingType);
6006 DU_LOG("\tPDSCH Start Symbol %d\n", pdschCmnTimeDomRsrcAlloc->startSymbol);
6007 DU_LOG("\tPDSCH Symbol Length %d\n", pdschCmnTimeDomRsrcAlloc->lengthSymbol);
6010 DU_LOG("\n ** MAC Cell Configuration : Cell Configuration : UL BWP Configuration ** \n");
6011 bwpUlCfg = &cellCfg->initialUlBwp;
6013 DU_LOG("\n ** MAC Cell Configuration : Cell Configuration : UL BWP : BWP ** \n");
6014 DU_LOG("First PRB %d\n", bwpUlCfg->bwp.firstPrb);
6015 DU_LOG("Number of PRBs %d\n", bwpUlCfg->bwp.numPrb);
6016 DU_LOG("Subcarrier Spacing %d\n", bwpUlCfg->bwp.scs);
6017 DU_LOG("Cyclic Prefix %d\n", bwpUlCfg->bwp.cyclicPrefix);
6019 DU_LOG("\n ** MAC Cell Configuration : Cell Configuration : UL BWP : PUCCH Config Common ** \n");
6020 pucchCfgCmn = &bwpUlCfg->pucchCommon;
6021 DU_LOG("PUCCH Resource Common %d\n", pucchCfgCmn->pucchResourceCommon);
6022 DU_LOG("Group Hopping %d\n", pucchCfgCmn->pucchGroupHopping);
6024 DU_LOG("\n ** MAC Cell Configuration : Cell Configuration : UL BWP : PUSCH Config Common ** \n");
6025 puschCfgCmn = &bwpUlCfg ->puschCommon;
6026 DU_LOG("Number of Time Domain Resource Allocation %d\n", puschCfgCmn->numTimeDomRsrcAlloc);
6027 for (rsrcIdx = 0; rsrcIdx < puschCfgCmn->numTimeDomRsrcAlloc; rsrcIdx++)
6029 DU_LOG("Time Domain Resource Allocation Idx %d\n", rsrcIdx);
6030 puschTimeDomRsrcAlloc = &puschCfgCmn->timeDomRsrcAllocList[rsrcIdx];
6031 DU_LOG("\tK2 %d\n", puschTimeDomRsrcAlloc->k2);
6032 DU_LOG("\tPUSCH Mapping Type %d\n", puschTimeDomRsrcAlloc->mappingType);
6033 DU_LOG("\tPUSCH Start Symbol %d\n", puschTimeDomRsrcAlloc->startSymbol);
6034 DU_LOG("\tPUSCH Symbol Length %d\n", puschTimeDomRsrcAlloc->symbolLength);
6035 DU_LOG("\tPUSCH Start Symbol And Length %d\n", puschTimeDomRsrcAlloc->startSymbolAndLength);
6038 DU_LOG("\n ** MAC Cell Configuration : SSB Configuration** \n");
6039 ssbCfg = &macCellCfg ->ssbCfg;
6040 DU_LOG("SSB PDCH Power %d\n", ssbCfg->ssbPbchPwr);
6041 DU_LOG("Subcarrier Spacing Common %d\n", ssbCfg->scsCmn);
6042 DU_LOG("SSB Offset from Point A %d\n", ssbCfg->ssbOffsetPointA);
6043 DU_LOG("SSB Periodicity in msec %d\n", ssbCfg->ssbPeriod);
6044 DU_LOG("SSB Subcarrier Offset %d\n", ssbCfg->ssbScOffset);
6045 for (ssbMaskIdx = 0; ssbMaskIdx < SSB_MASK_SIZE; ssbMaskIdx++)
6047 DU_LOG("SSB Mask[%d] :%d\n", ssbMaskIdx, ssbCfg->ssbMask[ssbMaskIdx]);
6049 DU_LOG("Beam ID %d\n", ssbCfg->beamId[0]);
6050 DU_LOG("BETA PSS %d\n", ssbCfg->betaPss);
6051 DU_LOG("BCH Payloag Flag %d\n", ssbCfg->bchPayloadFlag);
6052 DU_LOG("MIB PDU %d %d %d", ssbCfg->mibPdu[0], ssbCfg->mibPdu[1], ssbCfg->mibPdu[2]);
6053 DU_LOG("DMRS Type-A Position %d\n", ssbCfg->dmrsTypeAPos);
6055 DU_LOG("\n ** MAC Cell Configuration : CSI RS Configuration ** \n");
6056 csiRsCfg = &macCellCfg->csiRsCfg;
6057 DU_LOG("Frequency Domain Allocation %s\n", csiRsCfg->csiFreqDomainAlloc);
6058 DU_LOG("Number of Ports %d\n", csiRsCfg->csiNrofPorts);
6059 DU_LOG("First OFDM Symbol in Time Domain %d\n", csiRsCfg->csirsfirstOFDMSymbolInTimeDomain);
6060 DU_LOG("First OFDM Symbol in Timer Domain 2 %d\n", csiRsCfg->csirsfirstOFDMSymbolInTimeDomain2);
6061 DU_LOG("CDM Type %d\n", csiRsCfg->csirscdmType);
6062 DU_LOG("Density %d\n", csiRsCfg->csirsdensity);
6063 DU_LOG("Density dot 5:%d\n", csiRsCfg->csirsdensitydot5);
6064 DU_LOG("Power Control Offset %d\n", csiRsCfg->powerControlOffset);
6065 DU_LOG("Power Control Offset Search Space %d\n", csiRsCfg->powerControlOffsetSS);
6066 DU_LOG("Periodicity And Offset %d\n", csiRsCfg->periodicityAndOffset);
6068 DU_LOG("\n ** MAC Cell Configuration : PRACH Configuration ** \n");
6069 prachCfg = &macCellCfg->prachCfg;
6070 DU_LOG("PRACH Sequence Length %d\n", prachCfg->prachSeqLen);
6071 DU_LOG("Subcarrier Spacing %d\n", prachCfg->prachSubcSpacing);
6072 DU_LOG("Number of PRACH FDM %d\n", prachCfg->msg1Fdm);
6073 DU_LOG("PRACH Configuration Index %d\n", prachCfg->prachCfgIdx);
6074 DU_LOG("PRACH Restricted Set Configuration %d\n", prachCfg->prachRstSetCfg);
6075 DU_LOG("Number of SSB per RACH occassion %d\n", prachCfg->ssbPerRach);
6076 DU_LOG("Number of RA preambles %d\n", prachCfg->totalNumRaPreamble);
6077 DU_LOG("Number of Contention Based Preamble per SSB %d\n", prachCfg->numCbPreamblePerSsb);
6078 DU_LOG("PRACH Frequeny Start Offset %d\n", prachCfg->msg1FreqStart);
6079 DU_LOG("RA Contention Resolution Timer %d\n", prachCfg->raContResTmr);
6080 DU_LOG("RSRP Threshold %d\n", prachCfg->rsrpThreshSsb);
6081 DU_LOG("RA Response Window %d\n", prachCfg->raRspWindow);
6082 for(fdmIdx = 0; fdmIdx < prachCfg->msg1Fdm; fdmIdx++)
6084 prachFdmInfo = &prachCfg->fdm[fdmIdx];
6085 DU_LOG("FDM[%d]\n", fdmIdx);
6086 DU_LOG("\tRoot Sequence Index %d\n", prachFdmInfo->rootSeqIdx);
6087 DU_LOG("\tNumber of Root Sequence %d\n", prachFdmInfo->numRootSeq);
6088 DU_LOG("\tK1 %d\n", prachFdmInfo->k1);
6089 DU_LOG("\tZero Correlation Zone Configuration %d\n", prachFdmInfo->zeroCorrZoneCfg);
6093 DU_LOG("\n ** MAC Cell Configuration : TDD Configuration ** \n");
6094 tddCfg = &macCellCfg->tddCfg;
6095 DU_LOG("TDD Slot Periodicity %d\n", tddCfg->tddPeriod);
6096 DU_LOG("Number of DL Slots %d\n", tddCfg->nrOfDlSlots);
6097 DU_LOG("Number of DL Symbols %d\n", tddCfg->nrOfDlSymbols);
6098 DU_LOG("Number of UL Slots %d\n", tddCfg->nrOfUlSlots);
6099 DU_LOG("Number of UL Symbols %d\n", tddCfg->nrOfUlSymbols);
6102 DU_LOG("\n ** MAC Cell Configuration : Precoding Configuration ** \n");
6103 precodCfg = &macCellCfg->precodingConf;
6104 DU_LOG("Number of Layers %d\n", precodCfg->numLayers);
6105 DU_LOG("Number of Antenna Ports %d\n", precodCfg->numAntPorts);
6107 DU_LOG("\n ** MAC Cell Config : BEAM FORMING CFG ** \n");
6108 beamFormingCfg = &macCellCfg ->beamCfg;
6109 DU_LOG("Number of Beams %d\n", beamFormingCfg->numOfBeams);
6110 DU_LOG("Number of Tx RUs %d\n", beamFormingCfg->numTxRUs);
6111 DU_LOG("Beam Index %d\n", beamFormingCfg->beamIdx);
6112 DU_LOG("Beam Type %d\n", beamFormingCfg->beamType);
6113 DU_LOG("Beam Azimuth %d\n", beamFormingCfg->beamAzimuth);
6114 DU_LOG("Beam Tilt %d\n", beamFormingCfg->beamTilt);
6115 DU_LOG("Beam Horizontal Width %d\n", beamFormingCfg->beamHorizWidth);
6116 DU_LOG("Beam Vertical Width %d\n", beamFormingCfg->beamVertWidth);
6117 DU_LOG("Coverage Shape %d\n", beamFormingCfg->coverageShape);
6118 DU_LOG("Digitak Tilt %d\n",beamFormingCfg ->digitalTilt);
6119 DU_LOG("Digital Azimuth %d\n", beamFormingCfg->digitalAzimuth);
6121 DU_LOG("\n ** SIB1 Configuration ** \n");
6122 sib1Params = &duCfgParam.sib1Params;
6123 DU_LOG("TAC %d\n", sib1Params->tac);
6124 DU_LOG("RANAC %ld\n", sib1Params->ranac);
6125 DU_LOG("Cell ID %d\n", sib1Params->cellIdentity);
6126 DU_LOG("Cell Reserved for Operational Use %ld\n", sib1Params->cellResvdForOpUse);
6127 DU_LOG("Connection Establishment Failure Count %ld\n", sib1Params->connEstFailCnt);
6128 DU_LOG("Connection Establishment Failure Offset Valid %ld\n", sib1Params->connEstFailOffValidity);
6129 DU_LOG("Connection Establishment Failure Offset %ld\n", sib1Params->connEstFailOffset);
6130 DU_LOG("PLMN : mcc[0] %d\n", sib1Params->plmn.mcc[0]);
6131 DU_LOG("PLMN : mcc[1] %d\n", sib1Params->plmn.mcc[1]);
6132 DU_LOG("PLMN : mcc[2] %d\n", sib1Params->plmn.mcc[2]);
6133 DU_LOG("PLMN : mnc[0] %d\n", sib1Params->plmn.mnc[0]);
6134 DU_LOG("PLMN : mnc[1] %d\n", sib1Params->plmn.mnc[1]);
6135 DU_LOG("PLMN : mnc[2] %d\n", sib1Params->plmn.mnc[2]);
6137 DU_LOG("\n ** SIB1 : SI Scheduling Info ** \n");
6138 siSchedInfo = &sib1Params ->siSchedInfo;
6139 DU_LOG("Windown Length %ld\n", siSchedInfo->winLen);
6140 DU_LOG("Broadcast Status %ld\n", siSchedInfo->broadcastSta);
6141 DU_LOG("Periodicity %ld\n", siSchedInfo->preiodicity);
6142 DU_LOG("SIB Type %ld\n", siSchedInfo->sibType);
6143 DU_LOG("SIB Value Tag %ld\n", siSchedInfo->sibValTag);
6145 DU_LOG("\n ** SIB1 : Serving Cell Configuration Common SIB ** \n");
6146 srvCellCfgCmnSib = &sib1Params->srvCellCfgCommSib;
6147 DU_LOG("Subcarrier Spacing %ld\n", srvCellCfgCmnSib->scs);
6148 DU_LOG("SSB Position in Burst %d\n", srvCellCfgCmnSib->ssbPosInBurst);
6149 DU_LOG("SSB Periodicity %ld\n", srvCellCfgCmnSib->ssbPrdServingCell);
6150 DU_LOG("SS PBCH Power %ld\n", srvCellCfgCmnSib->ssPbchBlockPwr);
6152 DU_LOG("\n ** SIB1 : Serving Cell Config Common SIB : DL Config Common ** \n");
6153 dlCfgCmn = &srvCellCfgCmnSib->dlCfg;
6154 DU_LOG("Frequency Band Indicator %ld\n", dlCfgCmn->freqBandInd);
6155 DU_LOG("Offset to Point A %ld\n", dlCfgCmn->offsetToPointA);
6156 DU_LOG("Frequency Location And Bandwidth %ld\n", dlCfgCmn->locAndBw);
6157 DU_LOG("Offset to Point A considering Subcarrier Spacing %ld\n", dlCfgCmn->dlScsCarrier.scsOffset);
6158 DU_LOG("Subcarrier Spacing %ld\n", dlCfgCmn->dlScsCarrier.scs);
6159 DU_LOG("Bandwidth considering Subcarrier Spacing %ld\n", dlCfgCmn->dlScsCarrier.scsBw);
6161 DU_LOG("\n ** SIB1 : Serving Cell Config Common SIB : DL Config Common : PDCCH Config Common ** \n");
6162 pdcchCfgCommon = &dlCfgCmn->pdcchCfg;
6163 if(pdcchCfgCommon->present)
6165 DU_LOG("Control Resource Set Zero Index %ld\n", pdcchCfgCommon->ctrlRsrcSetZero);
6166 DU_LOG("Search Space Zero Index %ld\n", pdcchCfgCommon->searchSpcZero);
6167 DU_LOG("Search Space ID %ld\n", pdcchCfgCommon->searchSpcId);
6168 DU_LOG("Control Resource Set ID %ld\n", pdcchCfgCommon->ctrlRsrcSetId);
6169 DU_LOG("Monitoring Slot Periodicity and Offset Present %d\n", pdcchCfgCommon->monitorSlotPrdAndOffPresent);
6170 DU_LOG("Monitoring Slot Periodicity and Offset %ld\n", pdcchCfgCommon->monitorSlotPrdAndOff);
6171 for (monitoringSymbIdx = 0; monitoringSymbIdx < 2; monitoringSymbIdx++)
6173 DU_LOG("Monitoring Symbols in Slot [%d] %d\n",monitoringSymbIdx, pdcchCfgCommon->monitorSymbolsInSlot[monitoringSymbIdx]);
6175 DU_LOG("Number of Candidates for Aggregation Level_1 %ld\n", pdcchCfgCommon->numCandAggLvl1);
6176 DU_LOG("Number of Candidates for Aggregation Level_2 %ld\n", pdcchCfgCommon->numCandAggLvl2);
6177 DU_LOG("Number of Candidates for Aggregation Level_4 %ld\n", pdcchCfgCommon->numCandAggLvl4);
6178 DU_LOG("Number of Candidates for Aggregation Level_8 %ld\n", pdcchCfgCommon->numCandAggLvl8);
6179 DU_LOG("Number of Candidates for Aggregation Level_16 %ld\n", pdcchCfgCommon->numCandAggLvl16);
6180 DU_LOG("Seach Space Type %d\n", pdcchCfgCommon->searchSpcType);
6181 DU_LOG("Common Search Space DCI Format %d\n", pdcchCfgCommon->commSrchSpcDciFrmt);
6182 DU_LOG("SIB1 Search Space ID %ld\n", pdcchCfgCommon->searchSpcSib1);
6183 DU_LOG("Paging Search Space ID %ld\n", pdcchCfgCommon->pagingSearchSpc);
6184 DU_LOG("RA Search Space ID %ld\n", pdcchCfgCommon->raSearchSpc);
6188 DU_LOG("PDCCH Config Common not Present");
6191 DU_LOG("\n ** SIB1 : Serving Cell Config Common : DL Config Common : PDSCH Config Common ** \n");
6192 pdschCfgCommon = &dlCfgCmn->pdschCfg;
6193 DU_LOG("PDSCH Config Common Present %d\n", pdschCfgCommon->present);
6194 if(pdschCfgCommon->present)
6196 DU_LOG("Number of Time Domain Resource Allocation %d\n", pdschCfgCommon->numTimeDomRsrcAlloc);
6197 for (rsrcIdx = 0; rsrcIdx < pdschCfgCommon->numTimeDomRsrcAlloc; rsrcIdx++)
6199 pdschTimeDomRsrcAlloc = &pdschCfgCommon->timeDomAlloc[rsrcIdx];
6200 DU_LOG("PDSCH Timer Domain Resource Allocation [%d]", rsrcIdx);
6201 DU_LOG("K0 %ld\n", pdschTimeDomRsrcAlloc->k0);
6202 DU_LOG("MappingType %ld\n", pdschTimeDomRsrcAlloc->mapType);
6203 DU_LOG("SLIV %d\n", pdschTimeDomRsrcAlloc->sliv);
6208 DU_LOG("PDSCH Config Common not Present");
6211 DU_LOG("\n ** SIB1 : Serving Cell Config Common : DL Config Common : BCCH Config Common ** \n");
6212 bcchCfg = &dlCfgCmn->bcchCfg;
6213 DU_LOG("Modification Period Coefficient %ld\n", bcchCfg->modPrdCoeff);
6215 DU_LOG("\n ** SIB1 : Serving Cell Config Common : DL Config Common : PCCH Config Common ** \n");
6216 pcchCfg = &dlCfgCmn->pcchCfg;
6217 DU_LOG("Default Paging Cycle %d\n", pcchCfg->dfltPagingCycle);
6218 DU_LOG("Number of PF in Paging Cycle %d\n", pcchCfg->nAndPagingFrmOffsetType);
6219 DU_LOG("PF Offset %d\n", pcchCfg->pageFrameOffset);
6220 DU_LOG("NS - Number of P0 in PF %d\n", pcchCfg->ns);
6221 DU_LOG("First PDCCH Monitoring Occassion of each P0 Type %d\n", pcchCfg->firstPDCCHMontioringType);
6222 for (poIdx = 0; poIdx < MAX_PO_PER_PF; poIdx++)
6224 DU_LOG("First PDCCH Monitoring Occassion in P0 [%d] %d\n", poIdx, pcchCfg->firstPDCCHMontioringInfo[poIdx]);
6227 DU_LOG("\n ** SIB1 : Serving Cell Config Common : UL Config Common ** \n");
6228 ulCfgCmn = &srvCellCfgCmnSib->ulCfg;
6229 DU_LOG("Frequency Band Indicator %ld\n", ulCfgCmn->freqBandInd);
6230 DU_LOG("Maximum Transmission Power %ld\n", ulCfgCmn->pMax);
6231 DU_LOG("Frequency Location and Bandwidth %ld\n", ulCfgCmn->locAndBw);
6232 DU_LOG("Time Alignment Timer %ld\n", ulCfgCmn->timeAlignTimerComm);
6233 DU_LOG("Offset to Point A considering Subcarrier Spacing %ld\n", ulCfgCmn->ulScsCarrier.scsOffset);
6234 DU_LOG("Subcarrier Spacing %ld\n", ulCfgCmn->ulScsCarrier.scs);
6235 DU_LOG("Carrier BW considering Subcarrier Spacing %ld\n", ulCfgCmn->ulScsCarrier.scsBw);
6237 DU_LOG("\n ** SIB1 : Serving Cell Config Common : UL Config Common : RACH Config Common ** \n");
6238 rachCfgCmn = &ulCfgCmn ->rachCfg;
6239 if(rachCfgCmn->present)
6241 DU_LOG("PRACH Configuration Index %ld\n", rachCfgCmn->prachCfgIdx);
6242 DU_LOG("Number of PRACH FDM %ld\n", rachCfgCmn->msg1Fdm);
6243 DU_LOG("PRACH Frequeny Start Offset %ld\n", rachCfgCmn->msg1FreqStart);
6244 DU_LOG("Zero Correaltion Zone Configuration %ld\n", rachCfgCmn->zeroCorrZoneCfg);
6245 DU_LOG("Target Power Level of Received Preamble %ld\n", rachCfgCmn->preambleRcvdTgtPwr);
6246 DU_LOG("Maximum number of Preamble Transmission %ld\n", rachCfgCmn->preambleTransMax);
6247 DU_LOG("Power Ramping Step %ld\n", rachCfgCmn->pwrRampingStep);
6248 DU_LOG("RA Response Window %ld\n", rachCfgCmn->raRspWindow);
6249 DU_LOG("Total Number of RA Preambles %ld\n", rachCfgCmn->numRaPreamble);
6250 DU_LOG("Number of SSB per RACH Occassion %ld\n", rachCfgCmn->numSsbPerRachOcc);
6251 DU_LOG("Number of Contention Based Preamble per SSB %ld\n", rachCfgCmn->numCbPreamblePerSsb);
6252 DU_LOG("Contention Resolution Timer %ld\n", rachCfgCmn->contResTimer);
6253 DU_LOG("RSRP Threshold %ld\n", rachCfgCmn->rsrpThreshSsb);
6254 DU_LOG("Root Sequence Index Present %d\n", rachCfgCmn->rootSeqIdxPresent);
6255 DU_LOG("Root Sequence Index %ld\n", rachCfgCmn->rootSeqIdx);
6256 DU_LOG("Subcarrier Spacing %ld\n", rachCfgCmn->msg1Scs);
6257 DU_LOG("Restricted Set Configuration %ld\n", rachCfgCmn->restrictedSetCfg);
6261 DU_LOG("RACH Config Common not present\n");
6264 DU_LOG("\n ** SIB1 : Serving Cell Config Common : UL Config Common : PUSCH Config Common ** \n");
6265 puschCfgCommon = &ulCfgCmn ->puschCfg;
6266 if(puschCfgCommon->puschCfgPresent)
6268 DU_LOG("MSG3 Delta from RACH Preamble %ld\n", puschCfgCommon->msg3DeltaPreamble);
6269 DU_LOG("P0 Nominal With Grant %ld\n", puschCfgCommon->p0NominalWithGrant);
6270 DU_LOG("Number of Time Domain Resource Allocation %d\n", puschCfgCommon->numTimeDomRsrcAlloc);
6271 for(rsrcIdx = 0; rsrcIdx < puschCfgCommon->numTimeDomRsrcAlloc; rsrcIdx++)
6273 puschCmnTimeDomRsrsAlloc = &puschCfgCommon ->timeDomAllocList[rsrcIdx];
6274 DU_LOG("Time Domain Resource Alloc [%d]", rsrcIdx);
6275 DU_LOG("\tK2 %ld\n", puschCmnTimeDomRsrsAlloc->k2);
6276 DU_LOG("\tMapping Type %ld\n", puschCmnTimeDomRsrsAlloc->mapType);
6277 DU_LOG("\tSLIV %d\n", puschCmnTimeDomRsrsAlloc->sliv);
6282 DU_LOG("PUSCH Config Common not present\n");
6285 DU_LOG("\n ** SIB1 : Serving Cell Config Common : UL Config Common : PUCCH Config Common **\n");
6286 pucchCfgCommon = &ulCfgCmn->pucchCfg;
6287 if(pucchCfgCommon->present)
6289 DU_LOG("Resource Common %ld\n", pucchCfgCommon->rsrcComm);
6290 DU_LOG("Group Hopping %ld\n", pucchCfgCommon->grpHop);
6291 DU_LOG("P0 Nominal %ld\n", pucchCfgCommon->p0Nominal);
6295 DU_LOG("PUCCH Config Common not present\n");
6298 DU_LOG("\n ** SIB1 : Serving Cell Config Common : TDD UL DL Config Common ** \n");
6299 tddUlDlCfgCmn = &srvCellCfgCmnSib->tddCfg;
6300 DU_LOG("Reference Subcarrier Spacing %ld\n", tddUlDlCfgCmn->refScs);
6301 DU_LOG("Transmission Periodicity %ld\n", tddUlDlCfgCmn->txPrd);
6302 DU_LOG("Number of DL Slots %ld\n", tddUlDlCfgCmn->numDlSlots);
6303 DU_LOG("Number of DL Symbols %ld\n", tddUlDlCfgCmn->numDlSymbols);
6304 DU_LOG("Number of UL Slots %ld\n", tddUlDlCfgCmn->numUlSlots);
6305 DU_LOG("Number of UL Symbols %ld\n", tddUlDlCfgCmn->numUlSymbols);
6307 DU_LOG("\n ** MAC SLICE CONFIG REQUEST ** \n");
6308 macSliceCfg = &duCfgParam.tempSliceCfg;
6309 DU_LOG("Number of RRM Policy %d\n",macSliceCfg->numOfRrmPolicy);
6311 for(policyIdx = 0; policyIdx < macSliceCfg->numOfRrmPolicy; policyIdx++)
6313 rrmPolicy = macSliceCfg->listOfRrmPolicy[policyIdx];
6314 DU_LOG("RRM Policy [%d]", policyIdx);
6315 DU_LOG("\tResource Type %d\n", rrmPolicy->resourceType);
6317 rrmPolicyRatio = &rrmPolicy ->policyRatio;
6318 DU_LOG("\tPolicy Maximum Ratio %d\n", rrmPolicyRatio->maxRatio);
6319 DU_LOG("\tPolicy Minimum Ratio %d\n", rrmPolicyRatio->minRatio);
6320 DU_LOG("\tPolicy Deidcated Ration %d\n", rrmPolicyRatio->dedicatedRatio);
6321 DU_LOG("\tNumber of RRM Policy Member %d\n", rrmPolicy->numOfRrmPolicyMem);
6323 for(memIdx = 0; memIdx < rrmPolicy->numOfRrmPolicyMem; memIdx++)
6325 rrmPolicyMemberList = rrmPolicy->rRMPolicyMemberList[memIdx];
6326 DU_LOG("\tRRM Policy Member [%d]", memIdx);
6327 DU_LOG("\t\tPLMN : mcc[0] %d\n", rrmPolicyMemberList->plmn.mcc[0]);
6328 DU_LOG("\t\tPLMN : mcc[1] %d\n", rrmPolicyMemberList->plmn.mcc[1]);
6329 DU_LOG("\t\tPLMN : mcc[2] %d\n", rrmPolicyMemberList->plmn.mcc[2]);
6330 DU_LOG("\t\tPLMN : mnc[0] %d\n", rrmPolicyMemberList->plmn.mnc[0]);
6331 DU_LOG("\t\tPLMN : mnc[1] %d\n", rrmPolicyMemberList->plmn.mnc[1]);
6332 DU_LOG("\t\tPLMN : mnc[2] %d\n", rrmPolicyMemberList->plmn.mnc[2]);
6333 DU_LOG("\t\tSST %d\n",rrmPolicyMemberList->snssai.sst);
6334 DU_LOG("\t\tSD %d %d %d\n",rrmPolicyMemberList->snssai.sd[0],rrmPolicyMemberList->snssai.sd[1],rrmPolicyMemberList->snssai.sd[2]);
6339 /**********************************************************************
6341 **********************************************************************/