Added missing files 70/2470/1
authorbalajihands <balaji.shankaran@radisys.com>
Tue, 11 Feb 2020 13:01:52 +0000 (18:31 +0530)
committerbalajihands <balaji.shankaran@radisys.com>
Tue, 11 Feb 2020 13:02:45 +0000 (18:32 +0530)
Change-Id: I8ecb31e93c5691f6cfd3e7c50f46320274381016
Signed-off-by: balajihands <balaji.shankaran@radisys.com>
src/du_app/du_cfg.c [new file with mode: 0644]
src/du_app/du_cfg.h [new file with mode: 0644]

diff --git a/src/du_app/du_cfg.c b/src/du_app/du_cfg.c
new file mode 100644 (file)
index 0000000..e4b8e06
--- /dev/null
@@ -0,0 +1,478 @@
+/*******************************************************************************
+################################################################################
+#   Copyright (c) [2017-2019] [Radisys]                                        #
+#                                                                              #
+#   Licensed under the Apache License, Version 2.0 (the "License");            #
+#   you may not use this file except in compliance with the License.           #
+#   You may obtain a copy of the License at                                    #
+#                                                                              #
+#       http://www.apache.org/licenses/LICENSE-2.0                             #
+#                                                                              #
+#   Unless required by applicable law or agreed to in writing, software        #
+#   distributed under the License is distributed on an "AS IS" BASIS,          #
+#   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.   #
+#   See the License for the specific language governing permissions and        #
+#   limitations under the License.                                             #
+################################################################################
+*******************************************************************************/
+
+/* This file contains all utility functions */
+#include "du_cfg.h"
+
+extern DuCfgParams duCfgParam;
+
+
+/* Filling Slot configuration as :
+ * 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
+ *   0   DL    DL    DL    DL    DL    DL    DL    DL    DL    DL    DL    DL    DL    DL
+ *   1   DL    DL    DL    DL    DL    DL    DL    DL    DL    DL    DL    DL    DL    DL
+ *   2   DL    DL    DL    DL    DL    DL    DL    DL    DL    DL    DL    DL    DL    DL
+ *   3   DL    DL    DL    DL    DL    DL    DL    DL    DL    DL    GD    GD    GD    UL
+ *   4   UL    UL    UL    UL    UL    UL    UL    UL    UL    UL    UL    UL    UL    UL
+*/
+
+/*******************************************************************
+ *
+ * @brief Fills the Slot configuration 
+ *
+ * @details
+ *
+ *    Function : fillSlotConfig
+ *
+ *    Functionality:Fill the Slot configuration values
+ * 
+ *  @params[in] void
+ * @return ROK     - success
+ *         RFAILED - failure
+ *
+ * ****************************************************************/
+void fillSlotConfig()
+{
+   U8 slot;
+   U8 symbol;
+
+   for(slot = 0; slot <= 3; slot++)
+   {
+      for(symbol = 0; symbol < MAX_SYMB_PER_SLOT; symbol++)
+         duCfgParam.clCellCfg.tddCfg.slotCfg[slot][symbol] = DL_SLOT;
+   }
+
+   duCfgParam.clCellCfg.tddCfg.slotCfg[3][10] = GUARD_SLOT;
+   duCfgParam.clCellCfg.tddCfg.slotCfg[3][11] = GUARD_SLOT;
+   duCfgParam.clCellCfg.tddCfg.slotCfg[3][12] = GUARD_SLOT;
+   duCfgParam.clCellCfg.tddCfg.slotCfg[3][13] = UL_SLOT;
+
+   for(symbol = 0; symbol < MAX_SYMB_PER_SLOT; symbol++)
+      duCfgParam.clCellCfg.tddCfg.slotCfg[4][symbol] = UL_SLOT;
+
+}
+
+/*******************************************************************
+ *
+ * @brief Reads the CL Configuration.
+ *
+ * @details
+ *
+ *    Function : readClCfg
+ *
+ *    Functionality:
+ *       - Fills up the cell configuration for CL.
+ *       - Calls fillSlotConfig()  
+ *
+ * @params[in] void
+ * @return ROK     - success
+ *         RFAILED - failure
+ *
+ * ****************************************************************/
+
+
+/* This function is used to fill up the cell configuration for CL */
+S16 readClCfg()
+{
+   duCfgParam.clCellCfg.carrierId = CARRIER_IDX;
+
+   /* Cell configuration */
+   duCfgParam.clCellCfg.cellId = NR_CELL_ID;
+   duCfgParam.clCellCfg.phyCellId = NR_PCI;
+   duCfgParam.clCellCfg.dupType = DUPLEX_MODE;
+
+   /* DL carrier configuration */
+   duCfgParam.clCellCfg.dlCarrCfg.pres = TRUE;
+   duCfgParam.clCellCfg.dlCarrCfg.bw = SUL_ARFCN;
+   duCfgParam.clCellCfg.dlCarrCfg.freq = NR_ARFCN;
+   duCfgParam.clCellCfg.dlCarrCfg.k0[0] = 1;
+   duCfgParam.clCellCfg.dlCarrCfg.k0[1] = 1;
+   duCfgParam.clCellCfg.dlCarrCfg.k0[2] = 1;
+   duCfgParam.clCellCfg.dlCarrCfg.k0[3] = 1;
+   duCfgParam.clCellCfg.dlCarrCfg.k0[4] = 1;
+   duCfgParam.clCellCfg.dlCarrCfg.gridSize[0] = 1;
+   duCfgParam.clCellCfg.dlCarrCfg.gridSize[1] = 1;
+   duCfgParam.clCellCfg.dlCarrCfg.gridSize[2] = 1;
+   duCfgParam.clCellCfg.dlCarrCfg.gridSize[3] = 1;
+   duCfgParam.clCellCfg.dlCarrCfg.gridSize[4] = 1;
+   duCfgParam.clCellCfg.dlCarrCfg.numAnt = NUM_TX_ANT;
+
+   /* UL Carrier configuration */
+   duCfgParam.clCellCfg.ulCarrCfg.pres = TRUE;
+   duCfgParam.clCellCfg.ulCarrCfg.bw = SUL_ARFCN;
+   duCfgParam.clCellCfg.ulCarrCfg.freq = NR_ARFCN;
+   duCfgParam.clCellCfg.ulCarrCfg.k0[0] = 1;
+   duCfgParam.clCellCfg.ulCarrCfg.k0[1] = 1;
+   duCfgParam.clCellCfg.ulCarrCfg.k0[2] = 1;
+   duCfgParam.clCellCfg.ulCarrCfg.k0[3] = 1;
+   duCfgParam.clCellCfg.ulCarrCfg.k0[4] = 1;
+   duCfgParam.clCellCfg.ulCarrCfg.gridSize[0] = 1;
+   duCfgParam.clCellCfg.ulCarrCfg.gridSize[1] = 1;
+   duCfgParam.clCellCfg.ulCarrCfg.gridSize[2] = 1;
+   duCfgParam.clCellCfg.ulCarrCfg.gridSize[3] = 1;
+   duCfgParam.clCellCfg.ulCarrCfg.gridSize[4] = 1;
+   duCfgParam.clCellCfg.ulCarrCfg.numAnt = NUM_RX_ANT;
+
+   duCfgParam.clCellCfg.freqShft = FREQ_SHIFT_7P5KHZ;
+
+   /* SSB configuration */
+   duCfgParam.clCellCfg.ssbCfg.ssbPbchPwr = SSB_PBCH_PWR;
+   duCfgParam.clCellCfg.ssbCfg.bchPayload = BCH_PAYLOAD;
+   duCfgParam.clCellCfg.ssbCfg.scsCmn = SUBCARRIER_SPACING;
+   duCfgParam.clCellCfg.ssbCfg.ssbPrbOffset = PRB_OFFSET;
+   duCfgParam.clCellCfg.ssbCfg.betaPss = BETA_PSS;
+   duCfgParam.clCellCfg.ssbCfg.ssbPeriod = SSB_PERIODICITTY;
+   duCfgParam.clCellCfg.ssbCfg.ssbSubcOffset = SSB_SUBCARRIER_OFFSET;
+   duCfgParam.clCellCfg.ssbCfg.mibPdu = 104;
+   duCfgParam.clCellCfg.ssbCfg.nSSBMask[0] = 2162721;
+   duCfgParam.clCellCfg.ssbCfg.nSSBMask[1] = 0;
+   duCfgParam.clCellCfg.ssbCfg.multCarrBand = SSB_MULT_CARRIER_BAND;
+   duCfgParam.clCellCfg.ssbCfg.multCellCarr = MULT_CELL_CARRIER;
+
+   /* PRACH configuration */
+   duCfgParam.clCellCfg.prachCfg.pres = TRUE;
+   duCfgParam.clCellCfg.prachCfg.prachSeqLen = PRACH_SEQ_LEN;
+   duCfgParam.clCellCfg.prachCfg.prachSubcSpacing = PRACH_SUBCARRIER_SPACING;
+   duCfgParam.clCellCfg.prachCfg.prachRstSetCfg = PRACH_RESTRICTED_SET_CFG;
+   duCfgParam.clCellCfg.prachCfg.prachFdm = NUM_PRACH_FDM;
+   duCfgParam.clCellCfg.prachCfg.fdm[0].rootSeqIdx = ROOT_SEQ_IDX;
+   duCfgParam.clCellCfg.prachCfg.fdm[0].numRootSeq = NUM_ROOT_SEQ;
+   duCfgParam.clCellCfg.prachCfg.fdm[0].k1 = 1;
+   duCfgParam.clCellCfg.prachCfg.fdm[0].zeroCorrZoneCfg = ZERO_CORRELATION_ZONE_CFG;
+   duCfgParam.clCellCfg.prachCfg.fdm[0].numUnusedRootSeq = NUM_UNUSED_ROOT_SEQ;
+   DU_ALLOC(duCfgParam.clCellCfg.prachCfg.fdm[0].unsuedRootSeq, NUM_UNUSED_ROOT_SEQ * sizeof(U8));
+   if(duCfgParam.clCellCfg.prachCfg.fdm[0].unsuedRootSeq == NULLP)
+   {
+      DU_LOG("\nDU_APP : Memory allocation failed");
+      RETVALUE(RFAILED);
+   }
+   *(duCfgParam.clCellCfg.prachCfg.fdm[0].unsuedRootSeq) = UNUSED_ROOT_SEQ;
+   duCfgParam.clCellCfg.prachCfg.ssbPerRach = SSB_PER_RACH;
+   duCfgParam.clCellCfg.prachCfg.prachMultCarrBand = PRACH_MULT_CARRIER_BAND;
+
+   /* TDD configuration */
+   duCfgParam.clCellCfg.tddCfg.pres = TRUE;
+   duCfgParam.clCellCfg.tddCfg.tddPeriod = TDD_PERIODICITY;
+
+   fillSlotConfig();
+
+   /* RSSI Measurement configuration */
+   duCfgParam.clCellCfg.rssiUnit = RSS_MEASUREMENT_UNIT;
+
+   /* This should be calculated based on
+      (number of mandatory parameters) + (number of otional parameters being filled) */
+   duCfgParam.clCellCfg.numTlv = 39;
+
+   RETVALUE(ROK);
+}
+/*******************************************************************
+ *
+ * @brief Configures the DU Parameters
+ *
+ * @details
+ *
+ *    Function : readCfg
+ *
+ *    Functionality:
+ *       - Initializes the DuCfg members.  
+ *       - Calls readClCfg()  
+ *
+ * @params[in] system task ID
+ * @return ROK     - success
+ *         RFAILED - failure
+ *
+ * ****************************************************************/
+
+S16 readCfg()
+{
+   U8 i,j,k;
+   U32 ipv4_du, ipv4_cu;
+
+   cmInetAddr((S8*)DU_IP_V4_ADDR, &ipv4_du);
+   cmInetAddr((S8*)CU_IP_V4_ADDR, &ipv4_cu);
+
+   /* F1 DU IP Address and Port*/
+   duCfgParam.sctpParams.duIpAddr.ipV4Pres = TRUE;
+   duCfgParam.sctpParams.duIpAddr.ipV4Addr = ipv4_du;
+   duCfgParam.sctpParams.duPort = DU_PORT;
+
+   /* F1 CU IP Address and Port*/
+   duCfgParam.sctpParams.cuIpAddr.ipV4Pres = TRUE;
+   duCfgParam.sctpParams.cuIpAddr.ipV4Addr = ipv4_cu;
+   duCfgParam.sctpParams.cuPort = CU_PORT;
+
+
+   /* EGTP Parameters */
+   duCfgParam.egtpParams.localIp.ipV4Pres = TRUE;
+   duCfgParam.egtpParams.localIp.ipV4Addr = ipv4_du;
+   duCfgParam.egtpParams.localPort = DU_EGTP_PORT;
+   duCfgParam.egtpParams.destIp.ipV4Pres = TRUE;
+   duCfgParam.egtpParams.destIp.ipV4Addr = ipv4_cu;
+   duCfgParam.egtpParams.destPort = CU_EGTP_PORT;
+   duCfgParam.egtpParams.minTunnelId = 0;
+   duCfgParam.egtpParams.maxTunnelId = 10;
+
+   duCfgParam.maxUe = 32; //TODO: Check
+   /* DU Info */       
+   duCfgParam.duId = DU_ID;    
+   strcpy((char*)duCfgParam.duName,DU_NAME);
+
+   for(i=0; i<DEFAULT_CELLS; i++)
+   { 
+      duCfgParam.srvdCellLst[i].duCellInfo.cellInfo.nrCgi.plmn.mcc[0] = PLMN_MCC0;
+      duCfgParam.srvdCellLst[i].duCellInfo.cellInfo.nrCgi.plmn.mcc[1] = PLMN_MCC1;
+      duCfgParam.srvdCellLst[i].duCellInfo.cellInfo.nrCgi.plmn.mcc[2] = PLMN_MCC2;
+      duCfgParam.srvdCellLst[i].duCellInfo.cellInfo.nrCgi.plmn.mnc[0] = PLMN_MNC0;
+      duCfgParam.srvdCellLst[i].duCellInfo.cellInfo.nrCgi.plmn.mnc[1] = PLMN_MNC1;
+      duCfgParam.srvdCellLst[i].duCellInfo.cellInfo.nrCgi.plmn.mnc[2] = PLMN_MNC2;
+
+      /*Cell ID */
+      duCfgParam.srvdCellLst[i].duCellInfo.cellInfo.nrCgi.cellId = NR_CELL_ID;
+      duCfgParam.srvdCellLst[i].duCellInfo.cellInfo.nrPci = NR_PCI;
+
+      /* List of Available PLMN */
+      for(j=0;j<MAX_PLMN;j++)
+      {
+         duCfgParam.srvdCellLst[i].duCellInfo.cellInfo.plmn[j].mcc[0] = PLMN_MCC0;
+         duCfgParam.srvdCellLst[i].duCellInfo.cellInfo.plmn[j].mcc[1] = PLMN_MCC1;
+         duCfgParam.srvdCellLst[i].duCellInfo.cellInfo.plmn[j].mcc[2] = PLMN_MCC2;
+         duCfgParam.srvdCellLst[i].duCellInfo.cellInfo.plmn[j].mnc[0] = PLMN_MNC0;
+         duCfgParam.srvdCellLst[i].duCellInfo.cellInfo.plmn[j].mnc[1] = PLMN_MNC1;
+         duCfgParam.srvdCellLst[i].duCellInfo.cellInfo.plmn[j].mnc[2] = PLMN_MNC2;
+      }
+      /* List of Extended PLMN */
+      for(j=0;j<MAX_PLMN;j++)
+      {
+         duCfgParam.srvdCellLst[i].duCellInfo.cellInfo.extPlmn[j].mcc[0] = PLMN_MCC0;
+         duCfgParam.srvdCellLst[i].duCellInfo.cellInfo.extPlmn[j].mcc[1] = PLMN_MCC1;
+         duCfgParam.srvdCellLst[i].duCellInfo.cellInfo.extPlmn[j].mcc[2] = PLMN_MCC2;
+         duCfgParam.srvdCellLst[i].duCellInfo.cellInfo.extPlmn[j].mnc[0] = PLMN_MNC0;
+         duCfgParam.srvdCellLst[i].duCellInfo.cellInfo.extPlmn[j].mnc[1] = PLMN_MNC1;
+         duCfgParam.srvdCellLst[i].duCellInfo.cellInfo.extPlmn[j].mnc[2] = PLMN_MNC2;
+      } 
+
+      /* TAC and EPSTAC */
+      duCfgParam.srvdCellLst[i].duCellInfo.tac = DU_TAC;
+      duCfgParam.srvdCellLst[i].duCellInfo.epsTac = DU_TAC; //to check and fill
+      /* NR Mode info */
+      duCfgParam.srvdCellLst[i].duCellInfo.f1Mode.mode.fdd.ulNrFreqInfo.nrArfcn = NR_ARFCN;
+      duCfgParam.srvdCellLst[i].duCellInfo.f1Mode.mode.fdd.ulNrFreqInfo.sulInfo.sulArfcn = SUL_ARFCN;
+      duCfgParam.srvdCellLst[i].duCellInfo.f1Mode.mode.fdd.ulNrFreqInfo.sulInfo.sulTxBw.nrScs = SCS_120;
+      duCfgParam.srvdCellLst[i].duCellInfo.f1Mode.mode.fdd.ulNrFreqInfo.sulInfo.sulTxBw.nrb = NRB_66;
+
+#if 0
+      /* NR Mode info */
+      duCfgParam.srvdCellLst[i].duCellInfo.f1Mode.mode.tdd.nrFreqInfo.nrArfcn = NR_ARFCN;
+      duCfgParam.srvdCellLst[i].duCellInfo.f1Mode.mode.tdd.nrFreqInfo.sulInfo.sulArfcn = SUL_ARFCN;
+      duCfgParam.srvdCellLst[i].duCellInfo.f1Mode.mode.tdd.nrFreqInfo.sulInfo.sulTxBw.nrScs = SCS_15;          
+      duCfgParam.srvdCellLst[i].duCellInfo.f1Mode.mode.tdd.nrFreqInfo.sulInfo.sulTxBw.nrb = NRB_160;          
+
+      for(j=0;j<MAXNRCELLBANDS;j++)
+      {
+         duCfgParam.srvdCellLst[i].duCellInfo.f1Mode.mode.tdd.nrFreqInfo.freqBand[j].nrFreqBand = NR_FREQ_BAND;
+         for(k=0;k<MAXNRCELLBANDS;k++)
+         {
+            duCfgParam.srvdCellLst[i].duCellInfo.f1Mode.mode.tdd.nrFreqInfo.freqBand[j].sulBand[k] = SUL_BAND;         
+         }
+      }
+#endif
+      for(j=0;j<MAXNRCELLBANDS;j++)
+      {
+         duCfgParam.srvdCellLst[i].duCellInfo.f1Mode.mode.fdd.ulNrFreqInfo.freqBand[j].nrFreqBand = NR_FREQ_BAND;
+         for(k=0;k<MAXNRCELLBANDS;k++)
+         {
+            duCfgParam.srvdCellLst[i].duCellInfo.f1Mode.mode.fdd.ulNrFreqInfo.freqBand[j].sulBand[k] = SUL_BAND;
+         }
+      }
+      duCfgParam.srvdCellLst[i].duCellInfo.f1Mode.mode.fdd.dlNrFreqInfo.nrArfcn = NR_ARFCN;
+      duCfgParam.srvdCellLst[i].duCellInfo.f1Mode.mode.fdd.dlNrFreqInfo.sulInfo.sulArfcn = SUL_ARFCN;
+      duCfgParam.srvdCellLst[i].duCellInfo.f1Mode.mode.fdd.dlNrFreqInfo.sulInfo.sulTxBw.nrScs = SCS_120;
+      duCfgParam.srvdCellLst[i].duCellInfo.f1Mode.mode.fdd.dlNrFreqInfo.sulInfo.sulTxBw.nrb = NRB_66;
+      for(j=0;j<MAXNRCELLBANDS;j++)
+      {
+         duCfgParam.srvdCellLst[i].duCellInfo.f1Mode.mode.fdd.dlNrFreqInfo.freqBand[j].nrFreqBand = NR_FREQ_BAND;
+         for(k=0;k<MAXNRCELLBANDS;k++)
+         {
+            duCfgParam.srvdCellLst[i].duCellInfo.f1Mode.mode.fdd.dlNrFreqInfo.freqBand[j].sulBand[k] = SUL_BAND;
+         }
+      }
+
+      duCfgParam.srvdCellLst[i].duCellInfo.f1Mode.mode.fdd.ulTxBw.nrScs = SCS_120;
+      duCfgParam.srvdCellLst[i].duCellInfo.f1Mode.mode.fdd.ulTxBw.nrb = NRB_66;
+
+      duCfgParam.srvdCellLst[i].duCellInfo.f1Mode.mode.fdd.dlTxBw.nrScs = SCS_120;
+      duCfgParam.srvdCellLst[i].duCellInfo.f1Mode.mode.fdd.dlTxBw.nrb = NRB_66;
+
+#if 0
+      duCfgParam.srvdCellLst[i].duCellInfo.f1Mode.mode.tdd.nrTxBw.nrScs = SCS_15;
+      duCfgParam.srvdCellLst[i].duCellInfo.f1Mode.mode.tdd.nrTxBw.nrb = NRB_160;
+#endif
+      /*Measurement Config and Cell Config */ 
+      duCfgParam.srvdCellLst[i].duCellInfo.measTimeCfg = TIME_CFG; 
+
+      duCfgParam.srvdCellLst[i].duCellInfo.cellDir = DL_UL; 
+
+      duCfgParam.srvdCellLst[i].duCellInfo.cellType=CELL_TYPE;
+
+      /* Broadcast PLMN Identity */
+      for(j=0;j<MAXBPLMNNRMINUS1;j++)
+      {  
+         for(k=0;k<MAX_PLMN;k++)
+         {
+            duCfgParam.srvdCellLst[i].duCellInfo.brdcstPlmnInfo[j].plmn[k].mcc[0] = PLMN_MCC0;
+            duCfgParam.srvdCellLst[i].duCellInfo.brdcstPlmnInfo[j].plmn[k].mcc[1] = PLMN_MCC1;
+            duCfgParam.srvdCellLst[i].duCellInfo.brdcstPlmnInfo[j].plmn[k].mcc[2] = PLMN_MCC2;
+            duCfgParam.srvdCellLst[i].duCellInfo.brdcstPlmnInfo[j].plmn[k].mnc[0] = PLMN_MNC0;
+            duCfgParam.srvdCellLst[i].duCellInfo.brdcstPlmnInfo[j].plmn[k].mnc[1] = PLMN_MNC1;                                         
+            duCfgParam.srvdCellLst[i].duCellInfo.brdcstPlmnInfo[j].plmn[k].mnc[2] = PLMN_MNC2;
+         }
+         /* Extended PLMN List */       
+         for(k=0;k<MAX_PLMN;k++)
+         {
+            duCfgParam.srvdCellLst[i].duCellInfo.brdcstPlmnInfo[j].extPlmn[k].mcc[0] = PLMN_MCC0;
+            duCfgParam.srvdCellLst[i].duCellInfo.brdcstPlmnInfo[j].extPlmn[k].mcc[1] = PLMN_MCC1;
+            duCfgParam.srvdCellLst[i].duCellInfo.brdcstPlmnInfo[j].extPlmn[k].mcc[2] = PLMN_MCC2;
+            duCfgParam.srvdCellLst[i].duCellInfo.brdcstPlmnInfo[j].extPlmn[k].mnc[0] = PLMN_MNC0;
+            duCfgParam.srvdCellLst[i].duCellInfo.brdcstPlmnInfo[j].extPlmn[k].mnc[1] = PLMN_MNC1;
+            duCfgParam.srvdCellLst[i].duCellInfo.brdcstPlmnInfo[j].extPlmn[k].mnc[2] = PLMN_MNC2;
+         }
+
+         duCfgParam.srvdCellLst[i].duCellInfo.brdcstPlmnInfo[j].tac = DU_TAC;
+         duCfgParam.srvdCellLst[i].duCellInfo.brdcstPlmnInfo[j].nrCellId = NR_CELL_ID;
+         duCfgParam.srvdCellLst[i].duCellInfo.brdcstPlmnInfo[j].ranac = NR_RANAC;
+      }
+
+      /*gnb DU System Info */
+      //TODO: uncomment duCfgParam.srvdCellLst[i].duSysInfo.mibMsg;  //to do
+      //TODO: uncomment duCfgParam.srvdCellLst[i].duSysInfo.sib1Msg; //to do
+   }
+
+   /* RRC Version,Extended RRC Version */
+   //TODO: uncomment duCfgParam.rrcVersion.rrcVer; //to do
+   //TODO: uncomment duCfgParam.rrcVersion.extRrcVer; //to do
+
+   if(readClCfg() != ROK)
+   {
+      DU_LOG("\nDU_APP : Failed while reading CL config");
+      RETVALUE(RFAILED);
+   }
+
+   RETVALUE(ROK);
+}
+
+/*******************************************************************
+ *
+ * @brief Reads config and posts message to du_app on completion
+ *
+ * @details
+ *
+ *    Function : main
+ *
+ *    Functionality:
+ *      - Calls readCfg()
+ *      - Post to du_app for further processing
+ *
+ * @params[in] void
+ * @return ROK     - success
+ *         RFAILED - failure
+ *
+ * ****************************************************************/
+S16 duReadCfg()
+{
+   Pst pst;
+   Buffer *mBuf;
+
+   cmMemset((U8 *)&duCfgParam, 0, sizeof(DuCfgParams));
+   //Read configs into duCfgParams
+   if(readCfg() != ROK)
+   {
+      DU_LOG("\nDU_APP : Reading configuration failed");
+      RETVALUE(RFAILED);
+   }
+
+   //Fill pst structure
+   cmMemset((U8 *)&(pst), 0, sizeof(Pst));
+   pst.srcEnt = (Ent)ENTDUAPP;
+   pst.srcInst = (Inst)DU_INST;
+   pst.srcProcId = DU_PROC;
+   pst.dstEnt = pst.srcEnt;
+   pst.dstInst = pst.srcInst;
+   pst.dstProcId = pst.srcProcId;
+   pst.event = EVTCFG;
+   pst.selector = DU_SELECTOR_TC;
+   pst.pool= DU_POOL;
+
+
+   if(SGetMsg(DFLT_REGION, DU_POOL, &mBuf) != ROK)
+   {
+      DU_LOG("\nDU_APP : Memory allocation failed in duReadCfg");
+      return RFAILED;
+   }
+
+   if (SPstTsk(&pst, mBuf) != ROK)
+   {
+      DU_LOG("\nDU_APP : SPstTsk failed in duReadCfg");
+      return RFAILED;
+   }
+
+   return ROK;
+}
+
+/*******************************************************************
+ *
+ * @brief Converts bit strings to integer
+ *
+ * @details
+ *
+ *    Function : bitStringToInt
+ *
+ *    Functionality:
+ *      - Converts ASN bit string format IEs to integer type
+ *
+ * @params[in] void
+ * @return ROK     - success
+ *         RFAILED - failure
+ *
+ * ****************************************************************/
+S16 bitStringToInt(BIT_STRING_t *bitString, U16 *val)
+{
+   U16 numOctets, idx;
+   if(bitString->buf == NULL || bitString->size <= 0)
+   {
+      DU_LOG("\nDU_APP : Bit string is empty");
+      return RFAILED;
+   }
+
+   numOctets = (bitString->size + 7 )/8;
+   for(idx=0; idx< numOctets; idx++)
+   {
+      *val |= bitString->buf[idx];
+      *val <<= 8;
+   }
+
+   *val |= bitString->buf[numOctets -1];
+   *val >>= ((numOctets * 8) - bitString->size);
+
+   return ROK;
+}
+
+
+/**********************************************************************
+  End of file
+ **********************************************************************/
+
diff --git a/src/du_app/du_cfg.h b/src/du_app/du_cfg.h
new file mode 100644 (file)
index 0000000..517ff7e
--- /dev/null
@@ -0,0 +1,897 @@
+/*******************************************************************************
+################################################################################
+#   Copyright (c) [2017-2019] [Radisys]                                        #
+#                                                                              #
+#   Licensed under the Apache License, Version 2.0 (the "License");            #
+#   you may not use this file except in compliance with the License.           #
+#   You may obtain a copy of the License at                                    #
+#                                                                              #
+#       http://www.apache.org/licenses/LICENSE-2.0                             #
+#                                                                              #
+#   Unless required by applicable law or agreed to in writing, software        #
+#   distributed under the License is distributed on an "AS IS" BASIS,          #
+#   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.   #
+#   See the License for the specific language governing permissions and        #
+#   limitations under the License.                                             #
+################################################################################
+*******************************************************************************/
+
+#ifndef __DU_CONFIG_H_
+#define __DU_CONFIG_H__
+
+#include "du_mgr.h"
+#include "lcl.h"
+#include "du_log.h"
+#include "BIT_STRING.h"
+
+/* MACROS */
+#define DU_INST 0
+#define DU_ID 1
+#define DU_IP_V4_ADDR "10.0.2.20"
+#define CU_IP_V4_ADDR "10.0.2.25"
+#define DU_PORT 38472
+#define CU_PORT 38472
+#define DU_EGTP_PORT  39001
+#define CU_EGTP_PORT  39002
+#define NR_PCI 1
+#define NR_CELL_ID 1
+#define DU_NAME "ORAN_OAM_DU"
+#define CELL_TYPE SMALL
+#define DUPLEX_MODE DUP_MODE_TDD
+#define DU_TAC 1
+#define PLMN_MCC0 3
+#define PLMN_MCC1 1
+#define PLMN_MCC2 1
+#define PLMN_MNC0 4
+#define PLMN_MNC1 8
+#define PLMN_MNC2 0
+#define NR_ARFCN  2079427
+#define SUL_ARFCN 100
+#define NR_FREQ_BAND 257
+#define SUL_BAND 2
+#define TIME_CFG 0
+#define CARRIER_IDX 1
+#define NUM_TX_ANT 2
+#define NUM_RX_ANT 2
+#define FREQ_SHIFT_7P5KHZ FALSE
+#define SSB_PBCH_PWR 0
+#define BCH_PAYLOAD MAC_GEN_FULL_PBCH_PAYLD
+#define SUBCARRIER_SPACING 3
+#define PRB_OFFSET 0
+#define BETA_PSS BETA_PSS_0DB
+#define SSB_PERIODICITTY SSB_PRDCTY_MS_20
+#define SSB_SUBCARRIER_OFFSET 0
+#define SSB_MULT_CARRIER_BAND FALSE
+#define MULT_CELL_CARRIER FALSE
+
+#define PRACH_SEQ_LEN SHORT_SEQUENCE
+#define PRACH_SUBCARRIER_SPACING 3
+#define PRACH_RESTRICTED_SET_CFG UNRESTRICTED
+#define NUM_PRACH_FDM 1
+#define ROOT_SEQ_IDX 0
+#define NUM_ROOT_SEQ 1
+#define ZERO_CORRELATION_ZONE_CFG 2
+#define NUM_UNUSED_ROOT_SEQ 1
+#define UNUSED_ROOT_SEQ 1
+#define SSB_PER_RACH 3
+#define PRACH_MULT_CARRIER_BAND FALSE
+#define TDD_PERIODICITY TX_PRDCTY_MS_2P5
+#define RSS_MEASUREMENT_UNIT DONT_REPORT_RSSI
+
+#define DU_PROC  0
+#define DU_INST 0
+#define DU_POOL  1
+
+#define SCTP_INST 0
+#define EGTP_INST 0
+
+/* Events */
+#define EVTCFG 0
+
+/* Selector */
+#define DU_SELECTOR_LC   0
+#define DU_SELECTOR_TC   1
+#define DU_SELECTOR_LWLC 2
+
+#ifdef EGTP_TEST
+/* Macro definitions for EGTP procedures */
+#define EGTP_LCL_TEID 1     /* EGTP local tunnel id */
+#define EGTP_REM_TEID 10    /* EGTP remote tinnel id */
+#endif
+
+
+/* Macro definitions for F1 procedures */
+#define CU_DU_NAME_LEN_MAX 30      /* Max length of CU/DU name string */
+#define MAX_F1_CONNECTIONS 65536    /* Max num of F1 connections */
+#define DU_MAX_CELLS       512      /* Max num of cells served by gNB-DU */
+#define MAX_PLMN           6        /* Max num of broadcast PLMN ids */
+#define MAXNRARFCN         3279165  /* Maximum values of NRAFCN */
+#define MAXNRCELLBANDS     2       /* Maximum number of frequency bands */
+#define MAXNUMOFSLICEITEMS 1024     /* Maximum number of signalled slice support items */
+#define MAXBPLMNNRMINUS1   1       /* Maximum number of PLMN Ids broadcast in an NR cell minus 1 */
+#define MAXNUMOFSIBTYPES   32       /* Maximum number of SIB types */
+#define MAX_UEID           512      /* Maximum number of UE Ids */
+#define MAX_TNL_ASSOC      32       /* Max num of TNL Assoc between CU and DU */
+#define MAXCELLINENB       256      /* Max num of cells served by eNB */
+#define MAXNUMOFUEID       65536    /* Max num of UEs served by DU */
+#define MAXNUMOFUACPLMN    12       /* Maximum number of PLMN ids*/
+#define MAXNUMOFUACPERPLMN 64       /* Maximum number of signalled categories per PLMN */
+#define DEFAULT_CELLS      1        /* Max num of broadcast PLMN ids */
+
+typedef enum
+{
+   GNBDU,
+   GNBCU 
+}F1Entity;
+
+typedef enum
+{
+   UNSPECIFIED,
+   RL_FAILURE_RLC,
+   INVALID_CU_UE_F1AP_ID,
+   INVALID_DU_UE_F1AP_ID,
+   INTERACTION_WITH_OTHER_PROC,
+   INVALID_QCI_VALUE,
+   RADIO_RELATED_REASON,
+   INSUFFICIENT_RADIO_RESOURCE,
+   PROCEDURE_CANCELLED,
+   NORMAL_RELEASE,
+   UNAVAILABLE_CELL,
+   RL_FAILURE_OTHERS,
+   UE_ACCESS_REJECTED,
+   SLICE_RESOURCE_UNAVAILABLE,
+   AMF_ABNORMAL_RELEASE,
+   INVALID_PLMN
+}RadioNwCause;
+
+typedef enum
+{
+   TRANS_CAUSE_UNSPECIFIED,
+   TRANSPORT_RESOURCE_UNAVAIL
+}TransLayerCause;
+
+typedef enum
+{
+   TRANSFER_SYNTAX_ERR,
+   ABSTRACT_SYNTAX_ERR_REJECT,
+   ABSTRACT_SYNTAX_ERR_NOTIFY,
+   INCOMPATIBLE_MESSAGE,
+   SEMANTIC_ERROR,
+   ABSTRACT_SYNTAX_ERR_MSG_CONSTRUCT,
+   PROTOCOL_CAUSE_UNSPECIFIED
+}ProtocolCause;
+
+typedef enum
+{
+   CONTROL_PROC_OVERLOAD,
+   INSUFF_USER_PLANE_RESOURCE,
+   HARDWARE_FAILURE,
+   O_AND_M_INTERVENTION,
+   MISC_CAUSE_UNSPECIFIED
+}MiscCause;
+
+typedef enum
+{
+  ALL
+}F1ResetAll;
+
+typedef enum 
+{
+  IN_SERVICE,
+  OUT_OF_SERVICE
+}SrvState;
+
+typedef enum
+{
+   INITIATING_MSG,
+   SUCCESSFUL_OUTCOME,
+   UNSUCCESSFUL_OUTCOME
+}F1TriggMsgVal;
+
+typedef enum
+{
+   CRIT_REJECT,
+   CRIT_IGNORE,
+   CRIT_NOTIFY
+}F1ProcCritVal;
+
+typedef enum
+{
+   NOT_UNDERSTOOD,
+   MISSING_IE
+}F1ErrorType;
+
+typedef enum
+{
+   SCS_15,
+   SCS_30,
+   SCS_60,
+   SCS_120
+}F1NrScs;
+
+typedef enum
+{
+   NRB_11,
+   NRB_18,
+   NRB_24,
+   NRB_25,
+   NRB_31,
+   NRB_32,
+   NRB_38,
+   NRB_51,
+   NRB_52,
+   NRB_65,
+   NRB_66,
+   NRB_78,
+   NRB_79,
+   NRB_93,
+   NRB_106,
+   NRB_107,
+   NRB_121,
+   NRB_132,
+   NRB_133,
+   NRB_135,
+   NRB_160,
+   NRB_162,
+   NRB_189,
+   NRB_216,
+   NRB_217,
+   NRB_245,
+   NRB_264,
+   NRB_270,
+   NRB_273
+}F1Nrb;
+
+typedef enum
+{
+   VERY_SMALL,
+   SMALL,
+   MEDIUM,
+   LARGE
+}F1CellType;
+
+typedef enum
+{
+   DL,
+   UL,
+   DL_UL
+}F1CellDir;
+
+typedef enum
+{
+   UE_USAGE,
+   NON_UE_USAGE,
+   BOTH
+}F1AssocUsage;
+
+typedef enum
+{
+   BARRED,
+   NOT_BARRED
+}CellBarred;
+
+typedef enum
+{
+   OFFER,
+   EXECUTION
+}F1ReqType;
+
+typedef enum
+{
+   IGNORE_YES,
+   IGNORE_NO
+}F1IgnoreReq;
+
+typedef enum
+{
+   OVERLOADED,
+   NOT_OVERLOADED
+}F1GnbDuOvrloadInfo;
+
+typedef enum
+{
+   REJECT_RRC_CONN_NON_EMERG_MODT,
+   REJECT_RRC_CONN_SIGNALLING,
+   PERMIT_EMERG_SESSION_AND_MOBILE_TERM_SERVICE,
+   PERMIT_HIGH_PRIOR_SESSION_AND_MOBILE_TERM_SERVICE
+}F1UacStandardAction;
+
+typedef struct f1RrcVersion
+{
+   char    rrcVer[30];     /* Latest RRC Version */
+   U32   extRrcVer;  /* Latest RRC version extended */
+}F1RrcVersion;
+
+typedef struct f1FailCause
+{
+   union
+   {
+      RadioNwCause      radioNwCause;     /* Radio Network Layer Cause */
+      TransLayerCause   transLayerCause;  /* Transport Layer Cause */
+      ProtocolCause     protCause;        /* Protocol Cause */
+      MiscCause         miscCause;        /* Miscellaneous Cause */
+   }cause;
+}F1FailCause;
+
+typedef struct f1ProcCode
+{
+   Bool   pres;
+   U8     value;
+}F1ProcCode;
+
+typedef struct f1TriggMsg
+{
+   Bool   pres;
+   F1TriggMsgVal   value;
+}F1TriggMsg;
+
+typedef struct f1ProcCrit
+{
+   Bool   pres;
+   F1ProcCritVal   value;
+}F1ProcCrit;
+
+typedef struct f1CritDignosIE
+{
+   F1ProcCritVal   ieCritVal;
+   U16             ieId;
+   F1ErrorType       type;
+}F1CritDignosIE;
+
+typedef struct f1CritDiagnostic
+{
+   Bool         pres;
+   F1ProcCode   procCode;      /* Procedure Code */
+   F1TriggMsg   triggeringMsg; /* Triggering Message */
+   F1ProcCrit   procCrit;      /* Criticality of Triggering msg/proc */
+   U32          transId;
+   F1CritDignosIE diagnosIE;
+}F1CritDiagnostic;
+
+typedef struct f1FailureIE
+{
+   U32                transId;        /* Uniquely identify transaction */
+   F1FailCause        cause;          /* Failure cause */
+   U8                 timeToWait;     /* Seconds to be waited before retry */
+   F1CritDiagnostic   critDiagnostic; /* Critical diagnostics */
+}F1FailureIE;
+
+typedef struct f1LogicalConnUeAssoc
+{
+   U32   gnbCuUeF1apId;
+   U32   gnbDuUeF1apId;
+}F1LogicalConnUeAssoc;
+
+typedef struct f1ResetType
+{
+   union
+   {
+      F1ResetAll             resetAll; /* Reset All */
+      F1LogicalConnUeAssoc   ueAssocLogicalConn[MAX_F1_CONNECTIONS]; /* In case of Partial Reset : UE associated logical F1 conn list*/
+   }type;
+}F1ResetType;
+
+typedef struct f1PLMN
+{
+  U8 mcc[3];
+  U8 mnc[3];
+}PlmnId;
+
+typedef struct nrEcgi
+{
+  PlmnId  plmn;
+  U16     cellId;
+}NrEcgi;
+
+typedef struct f1SibType
+{
+   U8   sibType;
+   U8   sibMsg;
+   U8   value;
+}F1SibType;
+
+typedef struct f1TxBw
+{
+   F1NrScs   nrScs; /* NR subcarrier spacing */
+   F1Nrb     nrb;   /* Transmission bandwidth expressed in units of RBs */
+}F1TxBw;
+
+typedef struct f1SulInfo
+{
+   U32      sulArfcn; /* SUL ARFCN */
+   F1TxBw   sulTxBw;  /* SUL transmission bandwidth */ 
+}F1SulInfo;
+
+typedef struct f1FreqBand
+{
+  U16   nrFreqBand;
+  U16   sulBand[MAXNRCELLBANDS];
+}F1FreqBand;
+
+typedef struct f1NrFreqInfo
+{
+   U32        nrArfcn;
+   F1SulInfo  sulInfo;
+   F1FreqBand freqBand[MAXNRCELLBANDS];
+}F1NrFreqInfo;
+
+typedef struct f1NrFddInfo
+{
+   F1NrFreqInfo   ulNrFreqInfo;  /* UL NR Frequency Info */
+   F1NrFreqInfo   dlNrFreqInfo;  /* DL NR Frequency Info */
+   F1TxBw         ulTxBw;        /* UL Transmission bandwidth */
+   F1TxBw         dlTxBw;        /* DL Transmission bandwidth */
+}F1NrFddInfo;
+
+typedef struct f1NrTddInfo
+{
+   F1NrFreqInfo   nrFreqInfo;   /* NR Frequency Info */
+   F1TxBw       nrTxBw;       /* NR Transmission Bandwidth */
+}F1NrTddInfo;
+
+typedef struct f1NrModeInfo
+{
+   union
+   {
+      F1NrFddInfo  fdd;
+      F1NrTddInfo  tdd;
+   }mode;
+}NrModeInfo;
+
+typedef struct f1EutraFddInfo
+{
+   U16   ulOffset;   /* UL offset to Point A */
+   U16   dlOffset;   /* DL offset to Point A */
+}F1EutraFDDInfo;
+
+typedef struct f1EutraTddInfo
+{
+   U16   tddOffset;  /* Offset to Point A */
+}F1EutraTDDInfo;
+
+typedef struct f1EutraModeInfo
+{
+   union
+   {
+      F1EutraFDDInfo  fdd;
+      F1EutraTDDInfo  tdd;
+   }mode;
+}F1EutraModeInfo;
+
+typedef struct f1Snsaai
+{
+   U8   sst;
+   U32  sd;
+}F1Snsaai;
+
+typedef struct epIpAddr
+{
+   char transportAddr[20]; /* Transport Layer Address */
+}EpIpAddr;
+
+typedef struct epIpAddrPort
+{
+    EpIpAddr epIpAddr;
+    char   port[2];
+}EpIpAddrPort;
+
+typedef struct f1TaiSliceSuppLst
+{
+   Bool       pres;
+   F1Snsaai   snssai[MAXNUMOFSLICEITEMS];   
+}F1TaiSliceSuppLst;
+
+typedef struct f1SrvdPlmn
+{
+   PlmnId              plmn;
+   F1TaiSliceSuppLst   taiSliceSuppLst;
+}F1SrvdPlmn;
+
+typedef struct f1BrdcstPlmnInfo
+{
+   PlmnId   plmn[MAX_PLMN];     /* PLMN id list */
+   PlmnId   extPlmn[MAX_PLMN];   /* Extended PLMN id list */
+   U16      tac;                     /* 5GS-TAC */
+   U32      nrCellId;                /* NR Cell id */
+   U8       ranac;                   /* RAN Area code */
+}F1BrdcstPlmnInfo;
+
+typedef struct f1CellInfo
+{
+   NrEcgi   nrCgi;                   /* Cell global Identity */
+   U32      nrPci;                   /* Physical Cell Identity */
+   PlmnId   plmn[MAX_PLMN];     /* Available PLMN list */
+   PlmnId   extPlmn[MAX_PLMN];  /* Extended available PLMN list */
+}F1CellInfo;
+
+typedef struct f1DuCellInfo
+{
+   F1CellInfo         cellInfo;     /* cell info */
+   U16                tac;          /* tracking area code */
+   U16                epsTac;       /* Configured EPS TAC */
+   NrModeInfo         f1Mode;       /* NR mode info : FDD/TDD */
+   U8                 measTimeCfg;  /* Measurement timing configuration */
+   F1CellDir          cellDir;      /* Cell Direction */
+   F1CellType         cellType;     /* Cell Type */
+   F1BrdcstPlmnInfo   brdcstPlmnInfo[MAXBPLMNNRMINUS1]; /* Broadcast PLMN Identity Info List */
+}F1DuCellInfo;
+
+typedef struct f1DuSysInfo
+{
+   U8   *mibMsg;   /* MIB message */
+   U8   *sib1Msg;  /* SIB1 message */
+}F1DuSysInfo;
+
+typedef struct f1CuSysInfo
+{
+   F1SibType   sibTypeToUpd[MAXNUMOFSIBTYPES];   /* SIB types to be updated */
+}F1CuSysInfo;
+
+typedef struct f1DuSrvdCellInfo
+{
+   F1DuCellInfo   duCellInfo;   /* gNB-DU served cell info */
+   F1DuSysInfo    duSysInfo;    /* gNB-DU System Information */
+}F1DuSrvdCellInfo;
+
+typedef struct f1DuSrvdCellToDel
+{
+   NrEcgi             oldNrCgi;     /* Old NR CGI */
+   F1DuSrvdCellInfo   srvdCellInfo; /* Info of served cell to be deleted */ 
+}F1DuSrvdCellToDel;
+
+typedef struct f1CuActCellInfo
+{
+   F1CellInfo    cuCellInfo;   /* gNB-CU available cell info */
+   F1CuSysInfo   cuSysInfo;    /* gNB-CU System Information */
+}F1CuActCellInfo;
+
+typedef struct f1ActCellFail
+{
+   NrEcgi        nrCgi;
+   F1FailCause   cause;
+}F1ActCellFail;
+
+typedef struct srvStatus
+{
+  SrvState    state;
+  Bool        switchOffOngoing;
+}SrvStatus;
+
+typedef struct f1CellStatus
+{
+   NrEcgi      nrEcgi;
+   SrvStatus   status;   /* Service status */
+}F1CellStatus;
+
+typedef struct f1DedSIDelUE
+{
+   U32      gnbCuUeF1apId;
+   NrEcgi   nrEcgi;
+}F1DedSIDelUE;
+
+typedef struct tnlAssocInfo
+{
+   Bool           pres;
+   EpIpAddr       epIpAddr;      /* Endpoint-IP Address */
+   EpIpAddrPort   epIpAddrport;  /* Endpoint-IP Address and Port */
+}F1TnlAssocAddr;
+
+typedef struct f1TnlAssocUsage
+{
+    Bool           pres;
+    F1AssocUsage   usage;
+}F1TnlAssocUsage;
+
+typedef struct f1TnlAssoc
+{
+   F1TnlAssocAddr   assocInfo;    /* TNL Assoc Transport Layer Info */
+   F1TnlAssocUsage  assocUsage;   /* TNL Assoc usage */
+}F1TnlAssoc;
+
+typedef struct f1TnlAssocToRmv
+{
+   F1TnlAssocAddr   assocInfoCu;   /* TNL Assoc Transport Layer Info of CU */
+   F1TnlAssocAddr   assocInfoDu;   /* TNL Assoc Transport Layer Info of DU */
+}F1TnlAssocToRmv;
+
+typedef struct f1TnlAssocSetupFail
+{
+   F1TnlAssocAddr   assocInfo;
+   F1FailCause      cause;
+}F1TnlAssocSetupFail;
+
+
+typedef struct f1CellBarred
+{
+   NrEcgi       nrcgi;
+   CellBarred   cellBarred;
+}F1CellBarred;
+
+typedef struct f1EutraCell
+{
+   U32                eutraCellId; /* EUTRA cell id */
+   F1EutraModeInfo    mode;        /* EUTRA mode info : FDD/TDD */
+   U8                 rsrcInd;     /* Protected EUTRA resource Indication */
+}F1EutraCell;
+
+typedef struct f1ProtectEUTRARsrc
+{
+   U32           specShareGrpId;               /* Spectrum sharing group id */
+   F1EutraCell   eutraCellList[MAXCELLINENB];  /* EUTRA cells list */
+}F1ProtectEUTRARsrc;
+
+typedef struct f1UacOperatorDefined
+{
+   U8   accessCategory;
+   U8   accessId; 
+}F1UacOperatorDefined;
+
+typedef struct f1UacCategoryType
+{
+   union
+   {
+      F1UacStandardAction    action;      /* UAC standardized action */
+      F1UacOperatorDefined   operatorDef; /* UAC operator defined */
+   }type;
+}F1UacCategoryType;
+
+typedef struct f1UacType
+{
+   U8                  uacReducInd;     /* Value 0 means no access rate reduction. Value 100 means full access rate reduction */
+   F1UacCategoryType   uacCategoryType; /* UAC Category type */
+}F1UacType;
+
+/* Unified Access Class Assistance Information */
+typedef struct f1UacAssistInfo
+{
+   PlmnId      plmn[MAXNUMOFUACPLMN];        /* UAC PLMN list */
+   F1UacType   uacType[MAXNUMOFUACPERPLMN];  /* UAC Type list */
+}F1UacAssistInfo;
+
+/* F1 setup related structures */
+
+typedef struct f1SetupReq
+{
+  U32                transId;                       /* Uniquely identify transaction */
+  U32                duId;                          /* DU ID */ 
+  char               duName[CU_DU_NAME_LEN_MAX];    /* DU name */
+  F1DuSrvdCellInfo   srvdCellLst[DU_MAX_CELLS];   /* Serving cell list */
+  F1RrcVersion       rrcVersion;                    /* RRC version */
+}F1SetupReq;
+
+typedef struct f1setupRsp
+{
+  U32               transId;                      /* Uniquely identify transaction */
+  char              cuName[CU_DU_NAME_LEN_MAX];   /* CU Name */
+  F1CuActCellInfo   actCellInfo;                  /* cells to be activated */
+  F1RrcVersion      rrcVersion;                   /* RRC version */
+}F1SetupRsp;
+
+typedef struct f1SetupFail
+{
+   F1FailureIE   setupFail;
+}F1SetupFail;
+
+/* At reception of the RESET message the gNB-DU shall release all allocated resources on F1 
+ * and radio resources related to the UE association(s) indicated explicitly or implicitly in 
+ * the RESET message and remove the indicated UE contexts including F1AP ID. */
+typedef struct f1Reset
+{
+  U32              transId;   /* Uniquely identify transaction */
+  F1FailCause      cause;     /* Failure cause */
+  F1ResetType      resetType; /* type of reset */
+}F1Reset;
+
+/* After the gNB-CU has released all assigned F1 resources and the UE F1AP IDs for all indicated
+ * UE associations which can be used for new UE-associated logical F1-connections over the F1 interface,
+ *  the gNB-CU shall respond with the RESET ACKNOWLEDGE message. */
+typedef struct f1ResetAck
+{
+  U32                    transId;         /* Uniquely identify transaction */
+  F1LogicalConnUeAssoc   ueAssocLogicalConn[MAX_F1_CONNECTIONS]; /* UE associated logical F1-connection list */
+  F1CritDiagnostic       critDiagnostic;  /* Critical diagnostics */
+}F1ResetAck;
+
+typedef struct f1ErrorInd
+{
+  U32                transId;         /* Uniquely identify transaction */
+  F1Entity           errorOrigin;     /* Specifies if error is originated at DU or CU */
+  F1FailCause        cause;           /* Failure cause */
+/* If failure is due to Ue related message. */
+  U32                gnbCuUeF1apId;   /* gNB-CU UE F1AP Id */
+  U32                gnbDuUeF1apId;   /* gNB-DU UE F1AP Id */
+  F1CritDiagnostic   critDiagnostic;  /* Critical diagnostics */
+}F1ErrorInd;
+
+typedef struct f1GnbDuCfgUpd
+{
+  U32                 transId;                             /* Uniquely identify transaction */
+  F1DuSrvdCellInfo    srvdCellLstAdd[DU_MAX_CELLS];      /* Served cell list to be added */
+  F1DuSrvdCellToDel   srvdCellLstMod[DU_MAX_CELLS];      /* Served cell list to be modified */
+  NrEcgi              srvdCellLstDel[DU_MAX_CELLS];      /* Served cell list to be deleted */
+  F1CellStatus        cellStatus[DU_MAX_CELLS];          /* Cell status */
+  F1DedSIDelUE        ueLst[MAX_UEID];                     /* Ue list that requires dedicated SI delivery */
+  U32                 gnbDuId;
+  F1TnlAssocToRmv     gnbDuTnlAssocRmv[MAX_TNL_ASSOC];  /* TNL Assoc list to remove */ 
+}F1GnbDuCfgUpd;
+
+typedef struct f1GnbDuCfgUpdAck
+{
+   U32                transId;                      /* Uniquely identify transaction */
+   F1CuActCellInfo    cellLstAct[DU_MAX_CELLS];    /* List of cells to be activated */   
+   F1CritDiagnostic   critDiagnostic;               /* Critical diagnostics */
+   NrEcgi             cellLstDeact[DU_MAX_CELLS]; /* List of cells to be deactivated */
+}F1GnbDuCfgUpdAck;
+
+typedef struct f1GnbDuCfgUpdFail
+{
+   F1FailureIE   gnbDuCfgUpdFail;
+}F1GnbDuCfgUpdFail;
+
+/* Sent by the gNB-CU to transfer updated information associated to an F1-C interface instance */
+typedef struct f1GnbCuCfgUpd
+{
+    U32                 transId;                            /* Uniquely identifies transaction */
+    F1CuActCellInfo     cellLstAct[DU_MAX_CELLS];         /* List of cells to be activated */
+    NrEcgi              cellLstDeact[DU_MAX_CELLS];       /* List of cells to be deactivated */
+    F1TnlAssoc          assocLstAdd[MAX_TNL_ASSOC];     /* List of TNL assocs to be added */
+    F1TnlAssoc          assocLstUpd[MAX_TNL_ASSOC];     /* List of TNL assocs to be updated */
+    F1TnlAssocToRmv     assocLstRmv[MAX_TNL_ASSOC];     /* List of TNL assocs to be removed */
+    F1CellBarred        cellToBarList[DU_MAX_CELLS];      /* List of Cells to be barred */
+    F1ProtectEUTRARsrc  protectEutraRsrcList[MAXCELLINENB]; /* List of Protected EUTRA resources */
+}F1GnbCuCfgUpd;
+
+/* Sent by a gNB-DU to a gNB-CU to acknowledge update of information
+ * associated to an F1-C interface instance */
+typedef struct f1GnbCuCfgUpdAck
+{
+    U32                   transId;                              /* Uniquely identify transaction */
+    F1ActCellFail         actCellFailList[DU_MAX_CELLS];      /* Cells failed to be activated list */
+    F1CritDiagnostic      critDiagnostic;                       /* Critical diagnostics */
+    F1TnlAssocAddr        assocSetupList[MAX_TNL_ASSOC];     /* TNL Assoc Setup list */
+    F1TnlAssocSetupFail   assocSetupFailList[MAX_TNL_ASSOC]; /* TNL Assoc Setup fail list */
+    F1DedSIDelUE          dedSiDelUelist[MAXNUMOFUEID];          /* Dedicated SI delivery needed UE list */
+}F1GnbCuCfgUpdAck;
+
+typedef struct f1GnbCuCfgUpdFail
+{
+    F1FailureIE   gnbCuCfgUpdFail;
+}F1GnbCuCfgUpdFail;
+
+/* This procedure enables coordination of radio resource allocation between a gNB-CU and
+ * a gNB-DU. Coordination request is sent by CU to DU */
+typedef struct f1GnbDuRsrcCoordReq
+{
+   U32           transId;              /* Uniquely identifies transaction */
+   F1ReqType     reqType;              /* Request type */
+   U8            cellResCoordReqCont;  /* Container for X2AP E-UTRA - NR cell resource coordination request */
+   F1IgnoreReq   ignoreReq;            /* Ignore coordination request */
+}F1GnbDuRsrcCoordReq;
+
+/* This message is sent by a gNB-DU to a gNB-CU, to express the desired resource allocation
+ * for data traffic, as a response to the GNB-DU RESOURCE COORDINATION REQUEST. */
+typedef struct f1GnbDuRsrcCoordRsp
+{
+    U32   transId;               /* Uniquely identifies transaction */
+    U8    cellResCoordRspCont;   /* Container for X2AP E-UTRA - NR cell resource coordination response */
+}F1GnbDuRsrcCoordRsp;
+
+/* This message is sent by the gNB-DU to indicate to the gNB-CU its status of overload */
+typedef struct f1GnbDuStatusInd
+{
+   U32                  transId;      /* Uniquely identifies transaction */
+   F1GnbDuOvrloadInfo   ovrloadInfo;  /* gNB-DU overloaded information */
+}F1GnbDuStatusInd;
+
+/* This message is sent by either the gNB-DU or the gNB-CU to intiate the removal
+ * of the interface instance and the related resources */
+typedef struct f1RmvReq
+{
+   U32   transId; /* Uniquely identifies transaction */
+}F1RmvReq;
+
+/* This message acknowledges the initiation of removal of the interface
+ * instance and the related resources */
+typedef struct f1RmvRsp
+{
+   U32                transId;     /* Uniquely identifies transaction */
+   F1CritDiagnostic   critDiagnos; /* Crititcality diagnostics */
+}F1RmvRsp;
+
+/* This message indicates that removing the interface instance and the related
+ * resources cannot be accepted */
+typedef struct f1RmvFail
+{
+   U32                transId;         /* Uniquely identifies transaction */
+   F1FailCause        cause;          /* Failure cause */
+   F1CritDiagnostic   critDiagnostic; /* Criticality diagnostics */
+}F1RmvFail;
+
+/* This message is sent by the gNB-CU to indicate to the gNB-DU a need to reduce
+ * the rate at which UEs access the network. */
+typedef struct f1NwkAccessRateRed
+{
+   U32               transId;        /* Uniquely identifies transaction */
+   F1UacAssistInfo   uacAssistInfo;  /* UAC Assistance Information */
+}F1NwkAccessRateRed;
+
+typedef struct f1Ipaddr
+{
+ Bool ipV4Pres;
+ U32  ipV4Addr; 
+}F1IpAddr;
+
+typedef struct f1SctpParams
+{
+   F1IpAddr  duIpAddr;
+   U16       duPort;
+   F1IpAddr  cuIpAddr;
+   U16       cuPort;
+}F1SctpParams;
+
+typedef struct f1EgtpParams
+{
+   F1IpAddr  localIp;      /* Ip address of local node */
+   U16       localPort;    /* Sender Port at local node */
+   F1IpAddr  destIp;       /* Ip address of peer node */
+   U16       destPort;     /* Sender port at peer node */
+   U32       minTunnelId;
+   U32       maxTunnelId;
+}F1EgtpParams;
+
+typedef struct cellCfgParams
+{
+   NrEcgi      nrEcgi;         /* ECGI */
+   U16         nrPci;          /* PCI */
+   U16         fiveGsTac;         /* 5gSTac */
+   PlmnId      plmn[MAX_PLMN]; /* List of serving PLMN IDs */
+   U8          ranac;          /* RAN Area Code */
+   U32         maxUe;          /* max UE per slot */
+}CellCfgParams;
+
+typedef struct schedulerCfg
+{
+   U8         numTxAntPorts;    /*!< Number of Tx antenna ports */
+   U8         ulSchdType;     /*!< Indicates which UL scheduler to use, range
+                               * is 0..(number of schedulers - 1) */
+   U8         dlSchdType;     /*!< Indicates which DL scheduler to use, range
+                               * is 0..(number of schedulers - 1) */
+   U8         numCells;       /*!< Max number of cells */
+   U8         maxUlUePerTti;  /*!< Max number of UE in UL per TTI */
+   U8         maxDlUePerTti;  /*!< Max number of UE in DL per TTI */
+}SchedulerCfg;
+
+typedef struct duCfgParams
+{
+   F1SctpParams       sctpParams;                    /* SCTP Params */
+   F1EgtpParams       egtpParams;                    /* EGTP Params */
+   U32                maxUe;
+   U32                duId;
+   U8                 duName[CU_DU_NAME_LEN_MAX];
+   SchedulerCfg       schedCfg;
+   CellCfgParams      cellCfg[DU_MAX_CELLS];  /* Cell info config*/
+   F1DuSrvdCellInfo   srvdCellLst[DU_MAX_CELLS];   /* Serving cell list *///TODO: this must be removed eventually
+   F1RrcVersion       rrcVersion;                    /* RRC version */
+   ClCellCfg          clCellCfg;                     /* CL cell configuration */
+
+}DuCfgParams;
+
+typedef struct duCellCb
+{
+   U32            cellId;      /* Internal cell Id */
+   CellCfgParams  cellInfo;    /* Cell info */
+   CellStatus     cellStatus;  /*Cell status */
+}DuCellCb;
+
+/*function declarations */
+void fillSlotConfig();
+S16 readClCfg();
+S16 readCfg();
+S16 duReadCfg(); 
+S16 bitStringToInt(BIT_STRING_t *bitString, U16 *val);
+
+#endif /* __DU_CONFIG_H__ */
+
+/**********************************************************************
+         End of file
+**********************************************************************/