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 */
22 #include<netinet/in.h>
31 #define DU_IP_V4_ADDR "168.168.31.12"
32 #define CU_IP_V4_ADDR "168.168.31.57"
33 #define DU_IP_V6_ADDR "0000:0000:0000:0000:0000:0000:0000:0001"
38 #define DU_NAME "Oran_OAM_DU"
39 #define CELL_DIR UL_DL
40 #define CELL_TYPE SMALL
41 #define DUPLEX_MODE DUP_MODE_TDD
49 #define NR_ARFCN 2079427
51 #define NR_FREQ_BAND 257
58 #define FREQ_SHIFT_7P5KHZ FALSE
59 #define SSB_PBCH_PWR 0
60 #define BCH_PAYLOAD MAC_GEN_FULL_PBCH_PAYLD
61 #define SUBCARRIER_SPACING 3
63 #define BETA_PSS BETA_PSS_0DB
64 #define SSB_PERIODICITTY SSB_PRDCTY_MS_20
65 #define SSB_SUBCARRIER_OFFSET 0
66 #define SSB_MULT_CARRIER_BAND FALSE
67 #define MULT_CELL_CARRIER FALSE
69 #define PRACH_SEQ_LEN SHORT_SEQUENCE
70 #define PRACH_SUBCARRIER_SPACING 3
71 #define PRACH_RESTRICTED_SET_CFG UNRESTRICTED
72 #define NUM_PRACH_FDM 1
73 #define ROOT_SEQ_IDX 0
74 #define NUM_ROOT_SEQ 1
75 #define ZERO_CORRELATION_ZONE_CFG 2
76 #define NUM_UNUSED_ROOT_SEQ 1
77 #define UNUSED_ROOT_SEQ 1
78 #define SSB_PER_RACH 3
79 #define PRACH_MULT_CARRIER_BAND FALSE
80 #define TDD_PERIODICITY TX_PRDCTY_MS_2P5
81 #define RSS_MEASUREMENT_UNIT DONT_REPORT_RSSI
83 extern DuCfgParams ducfgparam;
86 /* Filling Slot configuration as :
87 * 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
88 * 0 DL DL DL DL DL DL DL DL DL DL DL DL DL DL
89 * 1 DL DL DL DL DL DL DL DL DL DL DL DL DL DL
90 * 2 DL DL DL DL DL DL DL DL DL DL DL DL DL DL
91 * 3 DL DL DL DL DL DL DL DL DL DL GD GD GD UL
92 * 4 UL UL UL UL UL UL UL UL UL UL UL UL UL UL
95 /*******************************************************************
97 * @brief Fills the Slot configuration
101 * Function : fillSlotConfig
103 * Functionality:Fill the Slot configuration values
106 * @return ROK - success
109 * ****************************************************************/
112 void fillSlotConfig()
117 for(slot = 0; slot <= 3; slot++)
119 for(symbol = 0; symbol < MAX_SYMB_PER_SLOT; symbol++)
120 ducfgparam.clCellCfg.tddCfg.slotCfg[slot][symbol] = DL_SLOT;
123 ducfgparam.clCellCfg.tddCfg.slotCfg[3][10] = GUARD_SLOT;
124 ducfgparam.clCellCfg.tddCfg.slotCfg[3][11] = GUARD_SLOT;
125 ducfgparam.clCellCfg.tddCfg.slotCfg[3][12] = GUARD_SLOT;
126 ducfgparam.clCellCfg.tddCfg.slotCfg[3][13] = UL_SLOT;
128 for(symbol = 0; symbol < MAX_SYMB_PER_SLOT; symbol++)
129 ducfgparam.clCellCfg.tddCfg.slotCfg[4][symbol] = UL_SLOT;
133 /*******************************************************************
135 * @brief Reads the CL Configuration.
139 * Function : readClCfg
142 * - Fills up the cell configuration for CL.
143 * - Calls fillSlotConfig()
146 * @return ROK - success
149 * ****************************************************************/
152 /* This function is used to fill up the cell configuration for CL */
155 ducfgparam.clCellCfg.carrierId = CARRIER_IDX;
157 /* Cell configuration */
158 ducfgparam.clCellCfg.cellId = NR_CELL_ID;
159 ducfgparam.clCellCfg.phyCellId = NR_PCI;
160 ducfgparam.clCellCfg.dupType = DUPLEX_MODE;
162 /* DL carrier configuration */
163 ducfgparam.clCellCfg.dlCarrCfg.pres = TRUE;
164 ducfgparam.clCellCfg.dlCarrCfg.bw = SUL_ARFCN;
165 ducfgparam.clCellCfg.dlCarrCfg.freq = NR_ARFCN;
166 ducfgparam.clCellCfg.dlCarrCfg.k0[0] = 1;
167 ducfgparam.clCellCfg.dlCarrCfg.k0[1] = 1;
168 ducfgparam.clCellCfg.dlCarrCfg.k0[2] = 1;
169 ducfgparam.clCellCfg.dlCarrCfg.k0[3] = 1;
170 ducfgparam.clCellCfg.dlCarrCfg.k0[4] = 1;
171 ducfgparam.clCellCfg.dlCarrCfg.gridSize[0] = 1;
172 ducfgparam.clCellCfg.dlCarrCfg.gridSize[1] = 1;
173 ducfgparam.clCellCfg.dlCarrCfg.gridSize[2] = 1;
174 ducfgparam.clCellCfg.dlCarrCfg.gridSize[3] = 1;
175 ducfgparam.clCellCfg.dlCarrCfg.gridSize[4] = 1;
176 ducfgparam.clCellCfg.dlCarrCfg.numAnt = NUM_TX_ANT;
178 /* UL Carrier configuration */
179 ducfgparam.clCellCfg.ulCarrCfg.pres = TRUE;
180 ducfgparam.clCellCfg.ulCarrCfg.bw = SUL_ARFCN;
181 ducfgparam.clCellCfg.ulCarrCfg.freq = NR_ARFCN;
182 ducfgparam.clCellCfg.ulCarrCfg.k0[0] = 1;
183 ducfgparam.clCellCfg.ulCarrCfg.k0[1] = 1;
184 ducfgparam.clCellCfg.ulCarrCfg.k0[2] = 1;
185 ducfgparam.clCellCfg.ulCarrCfg.k0[3] = 1;
186 ducfgparam.clCellCfg.ulCarrCfg.k0[4] = 1;
187 ducfgparam.clCellCfg.ulCarrCfg.gridSize[0] = 1;
188 ducfgparam.clCellCfg.ulCarrCfg.gridSize[1] = 1;
189 ducfgparam.clCellCfg.ulCarrCfg.gridSize[2] = 1;
190 ducfgparam.clCellCfg.ulCarrCfg.gridSize[3] = 1;
191 ducfgparam.clCellCfg.ulCarrCfg.gridSize[4] = 1;
192 ducfgparam.clCellCfg.ulCarrCfg.numAnt = NUM_RX_ANT;
194 ducfgparam.clCellCfg.freqShft = FREQ_SHIFT_7P5KHZ;
196 /* SSB configuration */
197 ducfgparam.clCellCfg.ssbCfg.ssbPbchPwr = SSB_PBCH_PWR;
198 ducfgparam.clCellCfg.ssbCfg.bchPayload = BCH_PAYLOAD;
199 ducfgparam.clCellCfg.ssbCfg.scsCmn = SUBCARRIER_SPACING;
200 ducfgparam.clCellCfg.ssbCfg.ssbPrbOffset = PRB_OFFSET;
201 ducfgparam.clCellCfg.ssbCfg.betaPss = BETA_PSS;
202 ducfgparam.clCellCfg.ssbCfg.ssbPeriod = SSB_PERIODICITTY;
203 ducfgparam.clCellCfg.ssbCfg.ssbSubcOffset = SSB_SUBCARRIER_OFFSET;
204 ducfgparam.clCellCfg.ssbCfg.mibPdu = 104;
205 ducfgparam.clCellCfg.ssbCfg.nSSBMask[0] = 2162721;
206 ducfgparam.clCellCfg.ssbCfg.nSSBMask[1] = 0;
207 ducfgparam.clCellCfg.ssbCfg.multCarrBand = SSB_MULT_CARRIER_BAND;
208 ducfgparam.clCellCfg.ssbCfg.multCellCarr = MULT_CELL_CARRIER;
210 /* PRACH configuration */
211 ducfgparam.clCellCfg.prachCfg.pres = TRUE;
212 ducfgparam.clCellCfg.prachCfg.prachSeqLen = PRACH_SEQ_LEN;
213 ducfgparam.clCellCfg.prachCfg.prachSubcSpacing = PRACH_SUBCARRIER_SPACING;
214 ducfgparam.clCellCfg.prachCfg.prachRstSetCfg = PRACH_RESTRICTED_SET_CFG;
215 ducfgparam.clCellCfg.prachCfg.prachFdm = NUM_PRACH_FDM;
216 ducfgparam.clCellCfg.prachCfg.fdm[0].rootSeqIdx = ROOT_SEQ_IDX;
217 ducfgparam.clCellCfg.prachCfg.fdm[0].numRootSeq = NUM_ROOT_SEQ;
218 ducfgparam.clCellCfg.prachCfg.fdm[0].k1 = 1;
219 ducfgparam.clCellCfg.prachCfg.fdm[0].zeroCorrZoneCfg = ZERO_CORRELATION_ZONE_CFG;
220 ducfgparam.clCellCfg.prachCfg.fdm[0].numUnusedRootSeq = NUM_UNUSED_ROOT_SEQ;
221 *(ducfgparam.clCellCfg.prachCfg.fdm[0].unsuedRootSeq) = UNUSED_ROOT_SEQ;
222 ducfgparam.clCellCfg.prachCfg.ssbPerRach = SSB_PER_RACH;
223 ducfgparam.clCellCfg.prachCfg.prachMultCarrBand = PRACH_MULT_CARRIER_BAND;
225 /* TDD configuration */
226 ducfgparam.clCellCfg.tddCfg.pres = TRUE;
227 ducfgparam.clCellCfg.tddCfg.tddPeriod = TDD_PERIODICITY;
231 /* RSSI Measurement configuration */
232 ducfgparam.clCellCfg.rssiUnit = RSS_MEASUREMENT_UNIT;
234 /* This should be calculated based on
235 (number of mandatory parameters) + (number of otional parameters being filled) */
236 ducfgparam.clCellCfg.numTlv = 39;
239 /*******************************************************************
241 * @brief Configures the DU Parameters
248 * - Initializes the DuCfg members.
249 * - Calls readClCfg()
251 * @params[in] system task ID
252 * @return ROK - success
255 * ****************************************************************/
261 /* F1 DU IP Address and Port*/
262 ducfgparam.sctpParams.duIpAddr.ipV4Pres = TRUE;
263 strcpy(ducfgparam.sctpParams.duIpAddr.ipV4Addr, (char*)DU_IP_V4_ADDR);
264 ducfgparam.sctpParams.duIpAddr.ipV6Pres = FALSE;
265 strcpy(ducfgparam.sctpParams.duIpAddr.ipV6Addr, (char*)DU_IP_V6_ADDR);
266 ducfgparam.sctpParams.duPort = DU_PORT;
268 /* F1 CU IP Address and Port*/
269 ducfgparam.sctpParams.cuIpAddr.ipV4Pres = TRUE;
270 strcpy(ducfgparam.sctpParams.cuIpAddr.ipV4Addr, (char*)CU_IP_V4_ADDR);
271 ducfgparam.sctpParams.cuIpAddr.ipV6Pres = FALSE;
272 strcpy(ducfgparam.sctpParams.cuIpAddr.ipV6Addr, DU_IP_V6_ADDR);
273 ducfgparam.sctpParams.cuPort = CU_PORT;
276 ducfgparam.duId = DU_ID;
277 strcpy(ducfgparam.duName,DU_NAME);
279 for(i=0;i<MAXCELLINGNBDU;i++)
281 ducfgparam.srvdCellLst[i].duCellInfo.cellInfo.nrCgi.plmn.mcc[0] = PLMN_MCC0;
282 ducfgparam.srvdCellLst[i].duCellInfo.cellInfo.nrCgi.plmn.mcc[1] = PLMN_MCC1;
283 ducfgparam.srvdCellLst[i].duCellInfo.cellInfo.nrCgi.plmn.mcc[2] = PLMN_MCC2;
284 ducfgparam.srvdCellLst[i].duCellInfo.cellInfo.nrCgi.plmn.mnc[0] = PLMN_MNC0;
285 ducfgparam.srvdCellLst[i].duCellInfo.cellInfo.nrCgi.plmn.mnc[1] = PLMN_MNC1;
286 ducfgparam.srvdCellLst[i].duCellInfo.cellInfo.nrCgi.plmn.mnc[2] = PLMN_MNC2;
289 ducfgparam.srvdCellLst[i].duCellInfo.cellInfo.nrCgi.cellId = NR_CELL_ID;
290 ducfgparam.srvdCellLst[i].duCellInfo.cellInfo.nrPci = NR_PCI;
292 /* List of Available PLMN */
293 for(j=0;j<MAXNUMOFBPLMN;j++)
295 ducfgparam.srvdCellLst[i].duCellInfo.cellInfo.plmn[j].mcc[0] = PLMN_MCC0;
296 ducfgparam.srvdCellLst[i].duCellInfo.cellInfo.plmn[j].mcc[1] = PLMN_MCC1;
297 ducfgparam.srvdCellLst[i].duCellInfo.cellInfo.plmn[j].mcc[2] = PLMN_MCC2;
298 ducfgparam.srvdCellLst[i].duCellInfo.cellInfo.plmn[j].mnc[0] = PLMN_MNC0;
299 ducfgparam.srvdCellLst[i].duCellInfo.cellInfo.plmn[j].mnc[1] = PLMN_MNC1;
300 ducfgparam.srvdCellLst[i].duCellInfo.cellInfo.plmn[j].mnc[2] = PLMN_MNC2;
302 /* List of Extended PLMN */
303 for(j=0;j<MAXNUMOFBPLMN;j++)
305 ducfgparam.srvdCellLst[i].duCellInfo.cellInfo.extPlmn[j].mcc[0] = PLMN_MCC0;
306 ducfgparam.srvdCellLst[i].duCellInfo.cellInfo.extPlmn[j].mcc[1] = PLMN_MCC1;
307 ducfgparam.srvdCellLst[i].duCellInfo.cellInfo.extPlmn[j].mcc[2] = PLMN_MCC2;
308 ducfgparam.srvdCellLst[i].duCellInfo.cellInfo.extPlmn[j].mnc[0] = PLMN_MNC0;
309 ducfgparam.srvdCellLst[i].duCellInfo.cellInfo.extPlmn[j].mnc[1] = PLMN_MNC1;
310 ducfgparam.srvdCellLst[i].duCellInfo.cellInfo.extPlmn[j].mnc[2] = PLMN_MNC2;
314 ducfgparam.srvdCellLst[i].duCellInfo.tac.pres = TRUE;
315 ducfgparam.srvdCellLst[i].duCellInfo.tac.tac = DU_TAC;
316 ducfgparam.srvdCellLst[i].duCellInfo.epsTac.pres = TRUE; //to check and fill.
317 ducfgparam.srvdCellLst[i].duCellInfo.epsTac.tac =DU_TAC; //to check and fill
320 ducfgparam.srvdCellLst[i].duCellInfo.f1Mode.mode.tdd.nrFreqInfo.nrArfcn = NR_ARFCN;
321 ducfgparam.srvdCellLst[i].duCellInfo.f1Mode.mode.tdd.nrFreqInfo.sulInfo.pres = TRUE;
322 ducfgparam.srvdCellLst[i].duCellInfo.f1Mode.mode.tdd.nrFreqInfo.sulInfo.sulArfcn = SUL_ARFCN;
323 ducfgparam.srvdCellLst[i].duCellInfo.f1Mode.mode.tdd.nrFreqInfo.sulInfo.sulTxBw.nrScs = SCS_15;
324 ducfgparam.srvdCellLst[i].duCellInfo.f1Mode.mode.tdd.nrFreqInfo.sulInfo.sulTxBw.nrb = NRB_160;
326 for(j=0;j<MAXNRCELLBANDS;j++)
328 ducfgparam.srvdCellLst[i].duCellInfo.f1Mode.mode.tdd.nrFreqInfo.freqBand[j].nrFreqBand = NR_FREQ_BAND;
329 for(k=0;k<MAXNRCELLBANDS;k++)
331 ducfgparam.srvdCellLst[i].duCellInfo.f1Mode.mode.tdd.nrFreqInfo.freqBand[j].sulBand[k] = SUL_BAND;
335 ducfgparam.srvdCellLst[i].duCellInfo.f1Mode.mode.tdd.nrTxBw.nrScs = SCS_15;
336 ducfgparam.srvdCellLst[i].duCellInfo.f1Mode.mode.tdd.nrTxBw.nrb = NRB_160;
338 /*Measurement Config and Cell Config */
339 ducfgparam.srvdCellLst[i].duCellInfo.measTimeCfg = TIME_CFG;
341 ducfgparam.srvdCellLst[i].duCellInfo.cellDir = CELL_DIR;
343 ducfgparam.srvdCellLst[i].duCellInfo.cellType=CELL_TYPE;
345 /* Broadcast PLMN Identity */
346 for(j=0;j<MAXBPLMNNRMINUS1;j++)
348 for(k=0;j<MAXNUMOFBPLMN;k++)
350 ducfgparam.srvdCellLst[i].duCellInfo.brdcstPlmnInfo[j].plmn[k].mcc[0] = PLMN_MCC0;
351 ducfgparam.srvdCellLst[i].duCellInfo.brdcstPlmnInfo[j].plmn[k].mcc[1] = PLMN_MCC1;
352 ducfgparam.srvdCellLst[i].duCellInfo.brdcstPlmnInfo[j].plmn[k].mcc[2] = PLMN_MCC2;
353 ducfgparam.srvdCellLst[i].duCellInfo.brdcstPlmnInfo[j].plmn[k].mnc[0] = PLMN_MNC0;
354 ducfgparam.srvdCellLst[i].duCellInfo.brdcstPlmnInfo[j].plmn[k].mnc[1] = PLMN_MNC1;
355 ducfgparam.srvdCellLst[i].duCellInfo.brdcstPlmnInfo[j].plmn[k].mnc[2] = PLMN_MNC2;
357 /* Extended PLMN List */
358 for(k=0;j<MAXNUMOFBPLMN;k++)
360 ducfgparam.srvdCellLst[i].duCellInfo.brdcstPlmnInfo[j].extPlmn[k].mcc[0] = PLMN_MCC0;
361 ducfgparam.srvdCellLst[i].duCellInfo.brdcstPlmnInfo[j].extPlmn[k].mcc[1] = PLMN_MCC1;
362 ducfgparam.srvdCellLst[i].duCellInfo.brdcstPlmnInfo[j].extPlmn[k].mcc[2] = PLMN_MCC2;
363 ducfgparam.srvdCellLst[i].duCellInfo.brdcstPlmnInfo[j].extPlmn[k].mnc[0] = PLMN_MNC0;
364 ducfgparam.srvdCellLst[i].duCellInfo.brdcstPlmnInfo[j].extPlmn[k].mnc[1] = PLMN_MNC1;
365 ducfgparam.srvdCellLst[i].duCellInfo.brdcstPlmnInfo[j].extPlmn[k].mnc[2] = PLMN_MNC2;
368 ducfgparam.srvdCellLst[i].duCellInfo.brdcstPlmnInfo[j].tac.pres = TRUE;
369 ducfgparam.srvdCellLst[i].duCellInfo.brdcstPlmnInfo[j].tac.tac = DU_TAC;
370 ducfgparam.srvdCellLst[i].duCellInfo.brdcstPlmnInfo[j].nrCellId = NR_CELL_ID;
371 ducfgparam.srvdCellLst[i].duCellInfo.brdcstPlmnInfo[j].ranac = NR_RANAC;
374 /*gnb DU System Info */
375 //TODO: uncomment ducfgparam.srvdCellLst[i].duSysInfo.mibMsg; //to do
376 //TODO: uncomment ducfgparam.srvdCellLst[i].duSysInfo.sib1Msg; //to do
379 /* RRC Version,Extended RRC Version */
380 //TODO: uncomment ducfgparam.rrcVersion.rrcVer; //to do
381 //TODO: uncomment ducfgparam.rrcVersion.extRrcVer; //to do
387 /*******************************************************************
389 * @brief Reads config and posts message to du_app on completion
397 * - Post to du_app for further processing
400 * @return ROK - success
403 * ****************************************************************/
408 //Read configs into duCfgParams
412 cmMemset((U8 *)&(pst), 0, sizeof(Pst));
413 pst.srcEnt = (Ent)ENTDUAPP;
414 pst.srcInst = (Inst)DU_INST;
415 pst.srcProcId = DU_PROC;
416 pst.dstEnt = pst.srcEnt;
417 pst.dstInst = pst.srcInst;
418 pst.dstProcId = pst.srcProcId;
420 pst.selector = DU_SELECTOR_TC;
424 if(SGetMsg(DFLT_REGION, DU_POOL, &mBuf) != ROK)
426 printf("\nMemory allocation failed in duReadCfg");
430 if (SPstTsk(&pst, mBuf) != ROK)
432 printf("\nSPstTsk failed in duReadCfg");
439 /**********************************************************************
441 **********************************************************************/