+}
+
+/**********************************************************************************
+ *
+ * @brief Fills Ue Cfg from DU DB to RLCUeCfg
+ *
+ * @details
+ *
+ * Function : fillRlcUeCfg
+ *
+ * Functionality: fills ue Cfg to be sent to RLC
+ *
+ * @params[in] DuRlcUeCfg Pointer
+ * RlcUeCreate Pointer
+ *
+ * @return ROK - success
+ * RFAILED - failure
+ * *******************************************************************************/
+void fillRlcUeCfg(DuRlcUeCfg *duRlcUeCfg, RlcUeCreate *rlcUeCfg)
+{
+ uint8_t lcIdx = 0;
+
+ rlcUeCfg->cellId = duRlcUeCfg->cellId;
+ rlcUeCfg->ueId = duRlcUeCfg->ueId;
+
+ rlcUeCfg->numLcsToAdd = 0;
+ for(lcIdx = 0; lcIdx < duRlcUeCfg->numLcs; lcIdx++)
+ {
+ if(duRlcUeCfg->rlcLcCfg[lcIdx].configType == CONFIG_ADD)
+ {
+ memcpy(&rlcUeCfg->rlcLcCfgAdd[rlcUeCfg->numLcsToAdd], &duRlcUeCfg->rlcLcCfg[lcIdx].rlcBearerCfg, sizeof(RlcBearerCfg));
+ rlcUeCfg->numLcsToAdd++;
+ }
+ }
+ return;
+}
+
+/******************************************************************
+ *
+ * @brief Builds and Send UE Create Request to MAC
+ *
+ * @details
+ *
+ * Function : duBuildAndSendUeCreateReqToMac
+ *
+ * Functionality: Builds and Send UE Create Request to MAC
+ *
+ * @Params[in] cellId,
+ * ueId,
+ * crnti,
+ * UE config extracted from F1AP msg
+ * MAC UE config struct to be filled
+ * @return ROK - success
+ * RFAILED - failure
+ *
+ * ****************************************************************/
+
+uint8_t duBuildAndSendUeCreateReqToMac(uint16_t cellId, uint8_t gnbDuUeF1apId, uint16_t crnti, DuUeCfg *ueCfgDb, DuMacUeCfg *duMacUeCfg)
+{
+ uint8_t ret = ROK;
+ MacUeCreateReq *macUeCfg = NULLP;
+ Pst pst;
+ memset(&pst, 0, sizeof(Pst));
+
+
+ ret = updateDuMacUeCfg(cellId, gnbDuUeF1apId, crnti, ueCfgDb, duMacUeCfg);
+ if(ret == RFAILED)
+ {
+ DU_LOG("\nERROR --> DU APP : Failed to fill MacUeCfg at duBuildAndSendUeCreateReqToMac()");
+ return RFAILED;
+ }
+
+ /* Fill Pst */
+ FILL_PST_DUAPP_TO_MAC(pst, EVENT_MAC_UE_CREATE_REQ);
+
+ /* Copying ueCb to a sharable buffer */
+ DU_ALLOC_SHRABL_BUF(macUeCfg, sizeof(MacUeCreateReq));
+ if(macUeCfg)
+ {
+ memset(macUeCfg, 0, sizeof(MacUeCreateReq));
+ fillMacUeCfg(duMacUeCfg, macUeCfg);
+ DU_LOG("\nDEBUG --> DU_APP: Sending UE create request to MAC");
+
+ /* Processing one Ue at a time to MAC */
+ ret = (*packMacUeCreateReqOpts[pst.selector])(&pst, macUeCfg);
+ if(ret == RFAILED)
+ {
+ DU_LOG("\nERROR --> DU_APP : Failure in sending Ue Create Req to MAC at duBuildAndSendUeCreateReqToMac()");
+ DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL, macUeCfg, sizeof(MacUeCreateReq));
+ }
+ }
+ else
+ {
+ DU_LOG("\n ERROR --> DU APP : Memory alloc failed at duBuildAndSendUeCreateReqToMac()");
+ ret = RFAILED;
+ }
+ return ret;
+}
+
+/*******************************************************************
+ *
+ * @brief Build and send RACH Resource request to MAC
+ *
+ * @details
+ *
+ * Function : duBuildAndSendRachRsrcReqToMac
+ * Functionality:
+ * Build and send RACH Resource request to MAC
+ *
+ * @params[in] Cell Id
+ * UE Id
+ * @return ROK - success
+ * RFAILED - failure
+ *
+ * ****************************************************************/
+uint8_t duBuildAndSendRachRsrcReqToMac(uint16_t cellId, uint16_t ueId)
+{
+ uint16_t cellIdx = 0, ssbIdx = 0;
+ Pst pst;
+ MacRachRsrcReq *rachRsrcReq = NULLP;
+
+ GET_CELL_IDX(cellId, cellIdx);
+ if(duCb.actvCellLst[cellIdx] == NULLP)
+ {
+ DU_LOG("\nERROR --> DU APP : Cell Id [%d] not found in duBuildAndSendRachRsrcReqToMac()", cellId);
+ return RFAILED;
+ }
+
+ DU_ALLOC_SHRABL_BUF(rachRsrcReq, sizeof(MacRachRsrcReq));
+ if(!rachRsrcReq)
+ {
+ DU_LOG("\nERROR --> DU APP : Failed to allocate memory for RACH Resource Request in \
+ duBuildAndSendRachRsrcReqToMac()");
+ return RFAILED;
+ }
+
+ rachRsrcReq->cellId = cellId;
+ rachRsrcReq->ueId = ueId;
+ rachRsrcReq->numSsb = duCfgParam.macCellCfg.prachCfg.ssbPerRach;
+ for(ssbIdx = 0; ssbIdx < rachRsrcReq->numSsb; ssbIdx++)
+ {
+ rachRsrcReq->ssbIdx[ssbIdx] = ssbIdx;
+ }
+
+ /* Fill Pst */
+ FILL_PST_DUAPP_TO_MAC(pst, EVENT_MAC_RACH_RESOURCE_REQ);
+
+ if(((*packMacRachRsrcReqOpts[pst.selector])(&pst, rachRsrcReq)) != ROK)
+ {
+ DU_LOG("\nERROR --> DU_APP : Failure in sending RACH Resource Request to MAC at \
+ duBuildAndSendRachRsrcReqToMac()");
+ DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL, rachRsrcReq, sizeof(MacRachRsrcReq));
+ return RFAILED;
+ }
+
+ return ROK;
+}
+
+/*******************************************************************
+ *
+ * @brief Process RACH resource response from MAC
+ *
+ * @details
+ *
+ * Function : DuProcMacRachRsrcRsp
+ * Functionality:
+ * Process RACH resource response from MAC
+ *
+ * @params[in] Post structure
+ * RACH resource response
+ * @return ROK - success
+ * RFAILED - failure
+ *
+ * ****************************************************************/
+uint8_t DuProcMacRachRsrcRsp(Pst *pst, MacRachRsrcRsp *rachRsrcRsp)
+{
+ uint8_t ret = RFAILED;
+ uint16_t cellIdx = 0;
+ DuCellCb *cellCb = NULLP;
+ DuUeCb *ueCb = NULLP;
+
+ DU_LOG("\nINFO --> DU APP : Received RACH Resource Response from MAC. Cell ID [%d] UE ID [%d]",
+ rachRsrcRsp->cellId, rachRsrcRsp->ueId);
+
+ if(rachRsrcRsp->result == MAC_DU_APP_RSP_OK)
+ {
+ DU_LOG("\nINFO : DU APP : RACH Resource Response from MAC : Result [SUCCESS]");
+
+ /* Fetch Cell Cb */
+ GET_CELL_IDX(rachRsrcRsp->cellId, cellIdx);
+ if(duCb.actvCellLst[cellIdx] && (duCb.actvCellLst[cellIdx]->cellId == rachRsrcRsp->cellId))
+ {
+ cellCb = duCb.actvCellLst[cellIdx];
+
+ /* Fetch UE CB */
+ if(cellCb->ueCb[rachRsrcRsp->ueId-1].gnbDuUeF1apId == rachRsrcRsp->ueId)
+ {
+ ueCb = &cellCb->ueCb[rachRsrcRsp->ueId-1];
+
+ /* Store CRNTI alloted to this UE by MAC */
+ ueCb->crnti = rachRsrcRsp->newCrnti;
+
+ /* Store the assigned CF-RA resources */
+ memcpy(&ueCb->cfraResource, &rachRsrcRsp->cfraResource, sizeof(MacCfraResource));
+
+ /* RACH resources allocated to UE is sent to CU in UE Context Setup Response
+ * along with the result of UE Context setup requested by CU */
+ if((ret = BuildAndSendUeCtxtRsp(rachRsrcRsp->cellId, rachRsrcRsp->ueId)) != ROK)
+ DU_LOG("\nERROR -> DU APP : Failure in BuildAndSendUeCtxtRsp()");
+ }
+ else
+ DU_LOG("\nERROR --> DU APP : UE ID [%d] not found in DuProcMacRachRsrcRsp", rachRsrcRsp->ueId);
+ }
+ else
+ DU_LOG("\nERROR --> DU APP : Cell ID [%d] not found in DuProcMacRachRsrcRsp", rachRsrcRsp->cellId);
+ }
+ else
+ DU_LOG("\nINFO : DU APP : RACH Resource Response from MAC : Result [FAILURE]");
+
+ DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL, rachRsrcRsp, sizeof(MacRachRsrcRsp));
+ return ret;
+}
+
+/*******************************************************************
+ *
+ * @brief fill k0 value in duCb
+ *
+ * @details
+ *
+ * Function : fillK0Values
+ * Functionality: update k0 value in duCb
+ *
+ * @params[in] PdschConfig *cuPdschCfg, PdschConfig *storePdschCfg
+ * @return ROK - success
+ * RFAILED - failure
+ *
+ * ****************************************************************/
+
+uint8_t fillK0Values(PdschConfig *cuPdschCfg, PdschConfig *storePdschCfg)
+{
+ uint8_t numTimeDomRsrcAlloc, rsrcIdx;
+
+ if(cuPdschCfg)
+ {
+ if(storePdschCfg->numTimeDomRsrcAlloc)
+ {
+ numTimeDomRsrcAlloc = cuPdschCfg->numTimeDomRsrcAlloc;
+ for(rsrcIdx =0 ; rsrcIdx<numTimeDomRsrcAlloc; rsrcIdx++)
+ {
+ if(cuPdschCfg->timeDomRsrcAllociList[rsrcIdx].k0)
+ {
+ if(storePdschCfg->timeDomRsrcAllociList[rsrcIdx].k0)
+ {
+ *(storePdschCfg->timeDomRsrcAllociList[rsrcIdx].k0) = *(cuPdschCfg->timeDomRsrcAllociList[rsrcIdx].k0);
+ if(storePdschCfg->timeDomRsrcAllociList[rsrcIdx].k0 != cuPdschCfg->timeDomRsrcAllociList[rsrcIdx].k0)
+ DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL, cuPdschCfg->timeDomRsrcAllociList[rsrcIdx].k0, sizeof(uint8_t));
+ }
+ else
+ {
+ (storePdschCfg->timeDomRsrcAllociList[rsrcIdx].k0) = (cuPdschCfg->timeDomRsrcAllociList[rsrcIdx].k0);
+ }
+ }
+ }
+ }
+ }
+ return ROK;