--- /dev/null
+/*******************************************************************************
+################################################################################
+# 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
+ **********************************************************************/
+
--- /dev/null
+/*******************************************************************************
+################################################################################
+# 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
+**********************************************************************/