+ ODU_PUT_MSG_BUF(mBuf);
+
+ return ROK;
+}
+
+/******************************************************************
+ *
+ * @brief Builds and Sends DL CCCH Ind to MAC
+ *
+ * @details
+ *
+ * Function : duBuildAndSendDlCcchInd
+ *
+ * Functionality: Builds and sends DL CCCH Ind Msg to MAC
+ *
+ * @params[in] dlCcchMsg - uint8_t*
+ * @return ROK - success
+ * RFAILED - failure
+ *
+ * ****************************************************************/
+uint8_t duBuildAndSendDlCcchInd(uint16_t *cellId, uint16_t *crnti, \
+ DlCcchMsgType msgType, uint8_t *dlCcchMsg, uint16_t dlCcchMsgSize)
+{
+ uint8_t ret = ROK;
+ uint16_t idx2;
+ DlCcchIndInfo *dlCcchIndInfo = NULLP;
+ Pst pst;
+ memset(&pst, 0, sizeof(Pst));
+
+ DU_LOG("\nDU APP : Building and Sending DL CCCH Ind to MAC");
+
+ DU_ALLOC_SHRABL_BUF(dlCcchIndInfo, sizeof(DlCcchIndInfo));
+
+ if(!dlCcchIndInfo)
+ {
+ DU_LOG("\nDU APP : Memory alloc failed while building DL CCCH Ind");
+ return RFAILED;
+ }
+
+ dlCcchIndInfo->cellId = *cellId;
+ dlCcchIndInfo->crnti = *crnti;
+ dlCcchIndInfo->msgType = msgType;
+ dlCcchIndInfo->dlCcchMsgLen = dlCcchMsgSize;
+
+ DU_ALLOC_SHRABL_BUF(dlCcchIndInfo->dlCcchMsg, dlCcchIndInfo->dlCcchMsgLen);
+ if(!dlCcchIndInfo->dlCcchMsg)
+ {
+ DU_LOG("\nDU APP : Memory alloc failed while building DL CCCH Ind");
+ DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL, dlCcchIndInfo, sizeof(DlCcchIndInfo));
+ return RFAILED;
+ }
+ for(idx2 = 0; idx2 < dlCcchIndInfo->dlCcchMsgLen; idx2++)
+ {
+ dlCcchIndInfo->dlCcchMsg[idx2] = dlCcchMsg[idx2];
+ }
+ DU_FREE(dlCcchMsg, dlCcchMsgSize);
+
+ /* Fill Pst */
+ FILL_PST_DUAPP_TO_MAC(pst, EVENT_MAC_DL_CCCH_IND);
+ ret = (*packMacDlCcchIndOpts[pst.selector])(&pst, dlCcchIndInfo);
+ if(ret != ROK)
+ {
+ DU_LOG("\nDU_APP : Failure in sending DL CCCH to MAC");
+ DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL, dlCcchIndInfo->dlCcchMsg,\
+ dlCcchIndInfo->dlCcchMsgLen);
+ DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL, dlCcchIndInfo, \
+ sizeof(DlCcchIndInfo));
+ ret = RFAILED;
+ }
+
+ return ret;
+
+}
+
+/*******************************************************************
+ *
+ * @brief Build and Send DL RRC Message transfer to RLC
+ *
+ * @details
+ *
+ * Function : duBuildAndSendDlRrcMsgToRlc
+ *
+ * Functionality:
+ * Build and Send DL RRC Message transfer to RLC
+ *
+ * @params[in] Cell ID
+ * UE Index
+ * Logical Channgel ID
+ * RRC Message
+ * RRC Message Length
+ * @return ROK - success
+ * RFAILED - failure
+ *
+ * ****************************************************************/
+uint8_t duBuildAndSendDlRrcMsgToRlc(uint16_t cellId, RlcUeCfg ueCfg, \
+ uint8_t lcId, bool deliveryStaReq, uint16_t rrcMsgLen, uint8_t *rrcMsg)
+{
+ Pst pst;
+ uint8_t ret;
+ uint8_t lcIdx;
+ RlcDlRrcMsgInfo *dlRrcMsgInfo;
+
+ DU_ALLOC_SHRABL_BUF(dlRrcMsgInfo, sizeof(RlcDlRrcMsgInfo));
+ if(!dlRrcMsgInfo)
+ {
+ DU_LOG("\nDU APP : Memory allocation failed for dlRrcMsgInfo in \
+ duBuildAndSendDlRrcMsgToRlc");
+ DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL, rrcMsg, rrcMsgLen);
+ return RFAILED;
+ }
+
+ /* Filling up the RRC msg info */
+ dlRrcMsgInfo->cellId = cellId;
+ dlRrcMsgInfo->ueIdx = ueCfg.ueIdx;
+ for(lcIdx = 0; lcIdx <= MAX_NUM_LOGICAL_CHANNELS; lcIdx++)
+ {
+ if(ueCfg.rlcBearerCfg[lcIdx].lcId == lcId)
+ {
+ dlRrcMsgInfo->rbType = ueCfg.rlcBearerCfg[lcIdx].rbType;
+ dlRrcMsgInfo->rbId = ueCfg.rlcBearerCfg[lcIdx].rbId;
+ dlRrcMsgInfo->lcType = ueCfg.rlcBearerCfg[lcIdx].lcType;
+ dlRrcMsgInfo->lcId = ueCfg.rlcBearerCfg[lcIdx].lcId;
+ break;
+ }
+ }
+ dlRrcMsgInfo->execDup = false;
+ dlRrcMsgInfo->deliveryStaRpt = deliveryStaReq;
+ dlRrcMsgInfo->rrcMsg = rrcMsg;
+ dlRrcMsgInfo->msgLen = rrcMsgLen;
+
+ /* Filling post structure and sending msg */
+ memset(&pst, 0, sizeof(Pst));
+ FILL_PST_DUAPP_TO_RLC(pst, RLC_DL_INST, EVENT_DL_RRC_MSG_TRANS_TO_RLC);
+ ret = (*duSendDlRrcMsgToRlcOpts[pst.selector])(&pst, dlRrcMsgInfo);
+ if(ret != ROK)
+ {
+ DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL, rrcMsg, rrcMsgLen);
+ DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL, dlRrcMsgInfo, sizeof(RlcDlRrcMsgInfo));
+ return RFAILED;
+ }
+
+ return ROK;
+}
+
+/*******************************************************************
+ *
+ * @brief Process UE context setup request from CU
+ *
+ * @details
+ *
+ * Function : procUeCintextSetupReq
+ *
+ * Functionality: Process UE context setup request from CU
+ *
+ * @params[in] F1AP message
+ * @return ROK - success
+ * RFAILED - failure
+ *
+ * ****************************************************************/
+uint8_t procUeContextSetupReq(F1AP_PDU_t *f1apMsg)
+{
+ uint8_t ret = ROK;
+ uint8_t ieIdx, byteIdx, ueIdx;
+ uint8_t *rrcMsg = NULLP;
+ uint16_t rrcMsgLen;
+ uint16_t cellId, cellIdx;
+ uint32_t gnbDuUeF1apId; /* GNB DU UE F1AP ID */
+ uint32_t gnbCuUeF1apId; /* GNB CU UE F1AP ID */
+ bool deliveryStaReq = false; /* RRC msg delivery status request */
+ DuUeCb *ueCb = NULLP;
+ UEContextSetupRequest_t *ueSetReq = NULLP;
+
+ ueSetReq = &f1apMsg->choice.initiatingMessage->value.choice.UEContextSetupRequest;
+
+ /* TODO : fetch remaining values from f1ap msg */
+ for(ieIdx=0; ieIdx < ueSetReq->protocolIEs.list.count; ieIdx++)
+ {
+ switch(ueSetReq->protocolIEs.list.array[ieIdx]->id)
+ {
+ case ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID:
+ {
+ gnbCuUeF1apId = ueSetReq->protocolIEs.list.array[ieIdx]->value.choice.GNB_CU_UE_F1AP_ID;
+ break;
+ }
+ case ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID:
+ {
+ gnbDuUeF1apId = ueSetReq->protocolIEs.list.array[ieIdx]->value.choice.GNB_DU_UE_F1AP_ID;
+ break;
+ }
+ case ProtocolIE_ID_id_ServCellIndex:
+ {
+ cellIdx = ueSetReq->protocolIEs.list.array[ieIdx]->value.choice.ServCellIndex;
+ break;
+ }
+ case ProtocolIE_ID_id_RRCContainer:
+ {
+ rrcMsgLen = ueSetReq->protocolIEs.list.array[ieIdx]->value.choice.RRCContainer.size;
+ DU_ALLOC_SHRABL_BUF(rrcMsg, rrcMsgLen);
+ if(!rrcMsg)
+ {
+ DU_LOG("\nDU APP : Memory allocation failed for RRC Msg in procUeCtxtSetupReq");
+ return RFAILED;
+ }
+ memcpy(rrcMsg, ueSetReq->protocolIEs.list.array[ieIdx]->value.choice.RRCContainer.buf,\
+ rrcMsgLen);
+ break;
+ }
+ case ProtocolIE_ID_id_RRCDeliveryStatusRequest:
+ {
+ deliveryStaReq = true;
+ break;
+ }
+ default:
+ {
+ break;
+ }
+ }
+ }
+
+ cellId = duCb.actvCellLst[cellIdx]->cellId;
+ for(ueIdx = 0; ueIdx < MAX_NUM_UE; ueIdx++)
+ {
+ if((duCb.actvCellLst[cellIdx]->ueCb[ueIdx].gnbCuUeF1apId == gnbCuUeF1apId) &&
+ (duCb.actvCellLst[cellIdx]->ueCb[ueIdx].gnbDuUeF1apId == gnbDuUeF1apId &&
+ duCb.actvCellLst[cellIdx]->ueCb[ueIdx].ueState == UE_ACTIVE))
+ {
+ ueCb = &duCb.actvCellLst[cellIdx]->ueCb[ueIdx];
+ break;
+ }
+ }
+
+ /* TODO : send RB config to MAC/RLC */
+
+ /* Sending DL RRC Message to RLC */
+ if(ueIdx != MAX_NUM_UE)
+ {
+ ret = duBuildAndSendDlRrcMsgToRlc(cellId, ueCb->rlcUeCfg, SRB_ID_1, \
+ deliveryStaReq, rrcMsgLen, rrcMsg);
+ }
+ else
+ {
+ DU_LOG("\nDU APP : No UE found for CuUeF1apId[%d] and DuUeF1apId[%d]", \
+ gnbCuUeF1apId, gnbDuUeF1apId);
+ DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL, rrcMsg, rrcMsgLen);
+ ret = RFAILED;
+ }
+
+ return ret;
+}
+
+/******************************************************************
+ *
+ * @brief Processes DL RRC Message Transfer sent by CU
+ *
+ * @details
+ *
+ * Function : procDlRrcMsgTrans
+ *
+ * Functionality: Processes DL RRC Message Transfer sent by CU
+ *
+ * @params[in] F1AP_PDU_t ASN decoded F1AP message
+ * @return ROK - success
+ * RFAILED - failure
+ *
+ * ****************************************************************/
+uint8_t procDlRrcMsgTrans(F1AP_PDU_t *f1apMsg)
+{
+ DLRRCMessageTransfer_t *dlRrcMsg = NULLP;
+ uint8_t *dlCcchMsg = NULLP;
+ uint8_t idx, ret, srbId;
+ uint16_t idx2, crnti, cellId, dlCcchMsgSize;
+ uint32_t gnbCuUeF1apId, gnbDuUeF1apId;
+
+
+ DU_LOG("\nDU_APP : DL RRC message transfer Recevied");
+ dlRrcMsg = &f1apMsg->choice.initiatingMessage->value.choice.DLRRCMessageTransfer;
+
+ ret = ROK;
+
+ for(idx=0; idx<dlRrcMsg->protocolIEs.list.count; idx++)
+ {
+ switch(dlRrcMsg->protocolIEs.list.array[idx]->id)
+ {
+ case ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID:
+ {
+ gnbCuUeF1apId = dlRrcMsg->protocolIEs.list.array[idx]->value.choice.GNB_CU_UE_F1AP_ID;
+ break;
+ }
+ case ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID:
+ {
+ gnbDuUeF1apId = dlRrcMsg->protocolIEs.list.array[idx]->value.choice.GNB_DU_UE_F1AP_ID;
+ break;
+ }
+ case ProtocolIE_ID_id_SRBID:
+ {
+ srbId = dlRrcMsg->protocolIEs.list.array[idx]->value.choice.SRBID;
+ break;
+ }
+ case ProtocolIE_ID_id_ExecuteDuplication:
+ break;
+
+ case ProtocolIE_ID_id_RRCContainer:
+ {
+ if(dlRrcMsg->protocolIEs.list.array[idx]->value.choice.RRCContainer.size > 0)
+ {
+ dlCcchMsgSize = dlRrcMsg->protocolIEs.list.array[idx]->value.choice.RRCContainer.size;
+ DU_ALLOC(dlCcchMsg, dlCcchMsgSize);
+ for(idx2 = 0; idx2 < dlCcchMsgSize; idx2++)
+ {
+ dlCcchMsg[idx2] = \
+ dlRrcMsg->protocolIEs.list.array[idx]->value.choice.RRCContainer.buf[idx2];
+ }
+ }
+ else
+ {
+ DU_LOG("\nDU_APP : RRC Container Size is invalid:%ld",\
+ dlRrcMsg->protocolIEs.list.array[idx]->value.choice.RRCContainer.size);
+ }
+ break;
+ }
+
+ default:
+ DU_LOG("\nDU_APP : Invalid IE received in DL RRC Msg Transfer:%ld",
+ dlRrcMsg->protocolIEs.list.array[idx]->id);
+ }
+ }
+
+ for(idx=0; idx<duCb.numUe; idx++)
+ {
+ if(gnbDuUeF1apId == duCb.ueCcchCtxt[idx].gnbDuUeF1apId)
+ {
+ crnti = duCb.ueCcchCtxt[idx].crnti;
+ cellId = duCb.ueCcchCtxt[idx].cellId;
+ break;
+ }
+ }
+ if(srbId == SRB_ID_1) //RRC connection setup
+ {
+ ret = duBuildAndSendDlCcchInd(&cellId, &crnti, RRC_SETUP, dlCcchMsg, dlCcchMsgSize);
+ if(ret)
+ {
+ DU_LOG("\nDU_APP: Falied at duBuildAndSendDlCcchInd()");
+ }
+ else
+ {
+ if(duCb.actvCellLst[cellId-1]->numActvUes < MAX_NUM_UE)
+ {
+ ret = duCreateUeCb(&duCb.ueCcchCtxt[idx], gnbCuUeF1apId);
+ if(ret)
+ {
+ DU_LOG("\nDU_APP: Failed at duCreateUeCb for cellId [%d]", duCb.ueCcchCtxt[idx].cellId);
+ ret = RFAILED;
+ }
+ }
+ else
+ {
+ DU_LOG("\nDU_APP: Max Active UEs has reached");
+ ret = RFAILED;
+ }
+ }
+ }
+ return ret;
+}
+
+/******************************************************************
+ *
+ * @brief Generates GNB DU Ue F1AP ID
+ *
+ * @details
+ *
+ * Function : genGnbDuUeF1apId
+ *
+ * Functionality: Generates GNB DU Ue F1AP ID
+ *
+ * @params[in] void
+ * @return gnbDuF1apId
+ *
+ * ****************************************************************/
+uint32_t genGnbDuUeF1apId()
+{
+ static uint32_t gnbDuUeF1apId = 0;
+
+ return ++gnbDuUeF1apId;
+}
+
+/******************************************************************
+ *
+ * @brief Processes UL CCCH Ind recvd from MAC
+ *
+ * @details
+ *
+ * Function : duProcUlCcchInd
+ *
+ * Functionality: Processes UL CCCH Ind recvd from MAC
+ *
+ * @params[in] UlCcchIndInfo *ulCcchIndInfo
+ * @return ROK - success
+ * RFAILED - failure
+ *
+ * ****************************************************************/
+uint8_t duProcUlCcchInd(UlCcchIndInfo *ulCcchIndInfo)
+{
+
+ uint8_t ret = ROK;
+ uint32_t gnbDuUeF1apId = 0;
+
+ gnbDuUeF1apId = genGnbDuUeF1apId();
+
+ /* Store Ue mapping */
+ duCb.ueCcchCtxt[duCb.numUe].gnbDuUeF1apId = gnbDuUeF1apId;
+ duCb.ueCcchCtxt[duCb.numUe].crnti = ulCcchIndInfo->crnti;
+ duCb.ueCcchCtxt[duCb.numUe].cellId = ulCcchIndInfo->cellId;
+
+ duCb.numUe++;
+
+ ret = (BuildAndSendInitialRrcMsgTransfer(gnbDuUeF1apId, ulCcchIndInfo->crnti, ulCcchIndInfo->ulCcchMsgLen,
+ ulCcchIndInfo->ulCcchMsg));
+ if(ret != ROK)
+ {
+ DU_LOG("\nDU_APP : BuildAndSendInitialRrcMsgTransfer failed");
+ }
+
+ DU_FREE_SHRABL_BUF(MAC_MEM_REGION, MAC_POOL, ulCcchIndInfo->ulCcchMsg, ulCcchIndInfo->ulCcchMsgLen);
+ DU_FREE_SHRABL_BUF(MAC_MEM_REGION, MAC_POOL, ulCcchIndInfo, sizeof(UlCcchIndInfo));
+
+ return ret;
+
+}
+
+/******************************************************************
+ *
+ * @brief Fills Initial DL Bandwidth Part
+ *
+ * @details
+ *
+ * Function : fillInitDlBwp
+ *
+ * Functionality: Fills Initial DL Bandwidth Part
+ *
+ *
+ *****************************************************************/
+void fillInitDlBwp(InitialDlBwp *initDlBwp)
+{
+ uint8_t idx = 0;
+ uint8_t freqDomainResource[FREQ_DOM_RSRC_SIZE] = {0};
+ uint8_t coreset0EndPrb, coreset1StartPrb, coreset1NumPrb;
+
+
+ if(initDlBwp)
+ {
+ /* Filling PDCCH Config */
+ initDlBwp->pdcchPresent = TRUE;
+ if(initDlBwp->pdcchPresent)
+ {
+ initDlBwp->pdcchCfg.numCRsetToAddMod = PDCCH_CTRL_RSRC_SET_ONE_ID;
+ memset(initDlBwp->pdcchCfg.cRSetToAddModList, 0, MAX_NUM_CRSET);
+ if(initDlBwp->pdcchCfg.numCRsetToAddMod <= MAX_NUM_CRSET)
+ {
+ initDlBwp->pdcchCfg.cRSetToAddModList[idx].cRSetId = \
+ PDCCH_CTRL_RSRC_SET_ONE_ID;
+ memset(initDlBwp->pdcchCfg.cRSetToAddModList[idx].freqDomainRsrc, 0,\
+ FREQ_DOM_RSRC_SIZE);
+ coreset0EndPrb = CORESET0_END_PRB;
+ coreset1StartPrb = coreset0EndPrb +6;
+ coreset1NumPrb = CORESET1_NUM_PRB;
+ /* calculate the PRBs */
+ schAllocFreqDomRscType0(((coreset1StartPrb)/6), (coreset1NumPrb/6), freqDomainResource);
+ memcpy(initDlBwp->pdcchCfg.cRSetToAddModList[idx].freqDomainRsrc, freqDomainResource,
+ FREQ_DOM_RSRC_SIZE);
+
+ initDlBwp->pdcchCfg.cRSetToAddModList[idx].duration = \
+ PDCCH_CTRL_RSRC_SET_ONE_DURATION;
+ initDlBwp->pdcchCfg.cRSetToAddModList[idx].cceRegMappingType = \
+ CCE_REG_MAPPINGTYPE_PR_NONINTERLEAVED;
+ initDlBwp->pdcchCfg.cRSetToAddModList[idx].precoderGranularity = \
+ ALL_CONTIGUOUS_RBS;
+ initDlBwp->pdcchCfg.cRSetToAddModList[idx].dmrsScramblingId = \
+ SCRAMBLING_ID;
+ }
+ initDlBwp->pdcchCfg.numCRsetToRel = 0;
+ /* Filling Serach Space */
+ initDlBwp->pdcchCfg.numSearchSpcToAddMod = PDCCH_CTRL_RSRC_SET_ONE_ID;
+ memset(initDlBwp->pdcchCfg.searchSpcToAddModList, 0, MAX_NUM_CRSET);
+ if(initDlBwp->pdcchCfg.numSearchSpcToAddMod <= MAX_NUM_CRSET)
+ {
+ initDlBwp->pdcchCfg.searchSpcToAddModList[idx].searchSpaceId =\
+ PDCCH_SRCH_SPC_TWO_ID;
+ initDlBwp->pdcchCfg.searchSpcToAddModList[idx].cRSetId = \
+ PDCCH_CTRL_RSRC_SET_ONE_ID;
+ initDlBwp->pdcchCfg.searchSpcToAddModList[idx].\
+ mSlotPeriodicityAndOffset = SLOTPERIODICITYANDOFFSET_PR_SL1;
+ memset(initDlBwp->pdcchCfg.searchSpcToAddModList[idx].mSymbolsWithinSlot, 0,\
+ MONITORING_SYMB_WITHIN_SLOT_SIZE);
+ initDlBwp->pdcchCfg.searchSpcToAddModList[idx].mSymbolsWithinSlot[idx] =\
+ PDCCH_SYMBOL_WITHIN_SLOT;
+ initDlBwp->pdcchCfg.searchSpcToAddModList[idx].numCandidatesAggLevel1 =\
+ AGGREGATIONLEVEL_N8;
+ initDlBwp->pdcchCfg.searchSpcToAddModList[idx].numCandidatesAggLevel2 =\
+ AGGREGATIONLEVEL_N8;
+ initDlBwp->pdcchCfg.searchSpcToAddModList[idx].numCandidatesAggLevel4 =\
+ AGGREGATIONLEVEL_N4;
+ initDlBwp->pdcchCfg.searchSpcToAddModList[idx].numCandidatesAggLevel8 =\
+ AGGREGATIONLEVEL_N2;
+ initDlBwp->pdcchCfg.searchSpcToAddModList[idx].numCandidatesAggLevel16 =\
+ AGGREGATIONLEVEL_N1;
+ initDlBwp->pdcchCfg.searchSpcToAddModList[idx].searchSpaceType = \
+ SEARCHSPACETYPE_PR_UE_SPECIFIC;
+ initDlBwp->pdcchCfg.searchSpcToAddModList[idx].ueSpecificDciFormat =\
+ PDCCH_SRCH_SPC_TWO_UE_SPEC_DCI_FORMAT;
+
+ initDlBwp->pdcchCfg.numSearchSpcToRel = 0;
+
+ }
+ }
+ /* Filling PDSCH Config */
+ initDlBwp->pdschPresent = TRUE;
+ if(initDlBwp->pdschPresent)
+ {
+ initDlBwp->pdschCfg.dmrsDlCfgForPdschMapTypeA.addPos = ADDITIONALPOSITION_POS0;
+ initDlBwp->pdschCfg.resourceAllocType = RESOURCEALLOCATION_TYPE1;
+ initDlBwp->pdschCfg.numTimeDomRsrcAlloc = 1;
+ initDlBwp->pdschCfg.timeDomRsrcAllociList[idx].mappingType = \
+ MAPPING_TYPEA;
+ initDlBwp->pdschCfg.timeDomRsrcAllociList[idx].startSymbol = PDSCH_START_SYMBOL;
+ initDlBwp->pdschCfg.timeDomRsrcAllociList[idx].symbolLength = PDSCH_LENGTH_SYMBOL;
+ initDlBwp->pdschCfg.timeDomRsrcAllociList[idx].startSymbolAndLength = \
+ calcSliv(PDSCH_START_SYMBOL, PDSCH_LENGTH_SYMBOL);
+ initDlBwp->pdschCfg.rbgSize = RBG_SIZE_CONFIG1;
+ initDlBwp->pdschCfg.numCodeWordsSchByDci = CODEWORDS_SCHED_BY_DCI_N1;
+ initDlBwp->pdschCfg.bundlingType = TYPE_STATIC_BUNDLING;
+ }
+ }
+
+}
+
+/******************************************************************
+ *
+ * @brief Fills Initial UL Bandwidth Part
+ *
+ * @details
+ *
+ * Function : fillInitUlBwp
+ *
+ * Functionality: Fills Initial UL Bandwidth Part
+ *
+ *
+ *****************************************************************/
+void fillInitUlBwp(InitialUlBwp *initUlBwp)
+{
+ uint8_t idx;
+ if(initUlBwp)
+ {
+ initUlBwp->pucchPresent = FALSE;
+
+ /*Filling PUSCH Config */
+ initUlBwp->puschPresent = TRUE;
+ if(initUlBwp->puschPresent)
+ {
+ initUlBwp->puschCfg.dmrsUlCfgForPuschMapTypeA.addPos = ADDITIONALPOSITION_POS0;
+ initUlBwp->puschCfg.dmrsUlCfgForPuschMapTypeA.transPrecodDisabled. \
+ scramblingId0 = SCRAMBLING_ID;
+ initUlBwp->puschCfg.resourceAllocType = RESOURCEALLOCATION_TYPE1;
+ initUlBwp->puschCfg.numTimeDomRsrcAlloc = 1;
+ idx = 0;
+ if(initUlBwp->puschCfg.numTimeDomRsrcAlloc <= MAX_NUM_UL_ALLOC)
+ {
+ initUlBwp->puschCfg.timeDomRsrcAllocList[idx].k2 = PUSCH_K2;
+ initUlBwp->puschCfg.timeDomRsrcAllocList[idx].mappingType =\
+ MAPPING_TYPEA;
+ initUlBwp->puschCfg.timeDomRsrcAllocList[idx].startSymbol = PUSCH_START_SYMBOL;
+ initUlBwp->puschCfg.timeDomRsrcAllocList[idx].symbolLength = PUSCH_LENGTH_SYMBOL;
+ initUlBwp->puschCfg.timeDomRsrcAllocList[idx].startSymbolAndLength =\
+ calcSliv(PUSCH_START_SYMBOL, PUSCH_LENGTH_SYMBOL);
+ }
+ initUlBwp->puschCfg.transformPrecoder = TRANSFORM_PRECODER_DISABLED;
+ }
+ }
+ else
+ {
+ DU_LOG("\n DUAPP: Memory is NULL of InitalUlBwp");
+ }
+
+}
+/******************************************************************
+ *
+ * @brief Fills SpCell Group Info
+ *
+ * @details
+ *
+ * Function : fillSpCellGrpInfo
+ *
+ * Functionality: Fills Sp Cell Group Info
+ *
+ *
+ *****************************************************************/
+void fillSpCellGrpInfo(SpCellCfg *spCell)
+{
+ if(spCell)
+ {
+ spCell->servCellIdx = SERV_CELL_IDX;
+ /* Filling Initial Dl Bwp */
+ fillInitDlBwp(&spCell->servCellCfg.initDlBwp);
+
+ spCell->servCellCfg.numDlBwpToAdd = 0;
+ spCell->servCellCfg.firstActvDlBwpId = ACTIVE_DL_BWP_ID;
+ spCell->servCellCfg.defaultDlBwpId = ACTIVE_DL_BWP_ID;
+ spCell->servCellCfg.bwpInactivityTmr = NULLP;
+ spCell->servCellCfg.pdschServCellCfg.maxMimoLayers = NULLP;
+ spCell->servCellCfg.pdschServCellCfg.maxCodeBlkGrpPerTb = NULLP;
+ spCell->servCellCfg.pdschServCellCfg.codeBlkGrpFlushInd = NULLP;
+ spCell->servCellCfg.pdschServCellCfg.xOverhead = NULLP;
+ spCell->servCellCfg.pdschServCellCfg.numHarqProcForPdsch =\
+ NUM_HARQ_PROC_FOR_PDSCH_N_16;
+ /* Filling Initial UL Bwp*/
+ fillInitUlBwp(&spCell->servCellCfg.initUlBwp);
+ spCell->servCellCfg.numUlBwpToAdd = 0;
+ spCell->servCellCfg.firstActvUlBwpId = ACTIVE_DL_BWP_ID;
+ }
+ else
+ {
+ DU_LOG("\n DU_APP: Memory is NULL for SpCellGrp");
+ }
+}
+
+/******************************************************************
+ *
+ * @brief Fills Physical Cell Group Info
+ *
+ * @details
+ *
+ * Function : fillPhyCellGrpInfo
+ *
+ * Functionality: Fills Physical Cell Group Info
+ *
+ *
+ *****************************************************************/
+void fillPhyCellGrpInfo(PhyCellGrpCfg *cellGrp)
+{
+ if(cellGrp)
+ {
+ cellGrp->pdschHarqAckCodebook = PDSCH_HARQ_ACK_CODEBOOK_DYNAMIC;
+ cellGrp->pNrFr1 = P_NR_FR1;
+ }
+ else
+ {
+ DU_LOG("\nDUAPP: Memory is NULL for Physical Cell Group");
+ }
+}