+uint8_t duUpdateRlcLcCfg(DuRlcUeCfg *rlcUeCfg, F1UeContextSetupDb *f1UeDb)
+{
+ uint8_t ret, lcIdx, dbIdx, numLcs, lcDelIdx;
+
+ ret = ROK;
+ for(dbIdx = 0; (dbIdx < f1UeDb->duUeCfg.numRlcLcs && ret ==ROK); dbIdx++)
+ {
+ numLcs = rlcUeCfg->numLcs;
+ for(lcIdx = 0; lcIdx < numLcs; lcIdx++)
+ {
+ if(f1UeDb->duUeCfg.rlcLcCfg[dbIdx].rlcBearerCfg.lcId == rlcUeCfg->rlcLcCfg[lcIdx].rlcBearerCfg.lcId)
+ {
+ if(f1UeDb->duUeCfg.rlcLcCfg[dbIdx].configType == CONFIG_MOD)
+ {
+ ret = fillRlcCfgToAddMod(&rlcUeCfg->rlcLcCfg[lcIdx], &f1UeDb->duUeCfg.rlcLcCfg[dbIdx]);
+ if(ret == RFAILED)
+ {
+ DU_LOG("\nERROR --> DU APP : Failed to modify LC at Idx %d in duUpdateRlcCfg()", lcDelIdx);
+ break;
+ }
+ fillSnssaiInfo(NULL, f1UeDb->duUeCfg.rlcLcCfg[dbIdx].rlcBearerCfg.snssai,\
+ &rlcUeCfg->rlcLcCfg[lcIdx].rlcBearerCfg.snssai, true);
+ }
+ else if(f1UeDb->duUeCfg.rlcLcCfg[dbIdx].configType == CONFIG_DEL)
+ {
+ /* Free memory at matched lcIdx index */
+ freeRlcLcCfg(&rlcUeCfg->rlcLcCfg[lcIdx].rlcBearerCfg);
+ rlcUeCfg->numLcs--;
+ for(lcDelIdx = lcIdx; lcDelIdx < rlcUeCfg->numLcs; lcDelIdx++)
+ {
+ ret = fillRlcCfgToAddMod(&rlcUeCfg->rlcLcCfg[lcDelIdx], &rlcUeCfg->rlcLcCfg[lcDelIdx+1]);
+ fillSnssaiInfo(NULL, rlcUeCfg->rlcLcCfg[lcDelIdx+1].rlcBearerCfg.snssai,\
+ &rlcUeCfg->rlcLcCfg[lcDelIdx].rlcBearerCfg.snssai, true);
+ freeRlcLcCfg(&rlcUeCfg->rlcLcCfg[lcDelIdx+1].rlcBearerCfg);
+ if(ret == RFAILED)
+ {
+ DU_LOG("\nERROR --> DU APP : Failed to delete LC at Idx %d in duUpdateRlcCfg()", lcDelIdx);
+ break;
+ }
+ }
+ }
+ }
+ }
+ if(f1UeDb->duUeCfg.rlcLcCfg[dbIdx].configType == CONFIG_ADD)
+ {
+ ret = fillRlcCfgToAddMod(&rlcUeCfg->rlcLcCfg[lcIdx], &f1UeDb->duUeCfg.rlcLcCfg[dbIdx]);
+ if(ret == ROK)
+ {
+ fillSnssaiInfo(NULL, f1UeDb->duUeCfg.rlcLcCfg[dbIdx].rlcBearerCfg.snssai,\
+ &rlcUeCfg->rlcLcCfg[rlcUeCfg->numLcs].rlcBearerCfg.snssai, true);
+ rlcUeCfg->numLcs++;
+ }
+ }
+ }
+ return ret;
+}
+
+/*******************************************************************
+ *
+ * @brief Function to fill Tunnel Config to Add/Mod
+ *
+ *
+ * @details
+ *
+ * Function : fillTnlCfgToAddMod
+ *
+ * Functionality: Function to fill tunnel Config to Add/Mod
+ *
+ * @params[in] Pointer to tnlCfgDb,
+ * pointer to f1TnlCfg
+ * @return ROK - success
+ * RFAILED - failure
+ *
+ * ****************************************************************/
+uint8_t fillTnlCfgToAddMod(UpTnlCfg **ueCbTnlCfg, UpTnlCfg *f1TnlCfg)
+{
+ if(*ueCbTnlCfg)
+ {
+ DU_FREE((*ueCbTnlCfg)->tnlCfg1, sizeof(GtpTnlCfg));
+ DU_FREE(*ueCbTnlCfg, sizeof(UpTnlCfg));
+ }
+
+ if(*ueCbTnlCfg == NULLP)
+ {
+ /* copying to DuCb Tnl Cfg */
+ DU_ALLOC(*ueCbTnlCfg, sizeof(UpTnlCfg));
+ if(*ueCbTnlCfg == NULLP)
+ {
+ DU_LOG("\nERROR --> DU_APP : fillTnlCfgToAddMod: Memory Alloc failed for drbId[%d]", f1TnlCfg->drbId);
+ return RFAILED;
+ }
+ }
+ memset(*ueCbTnlCfg, 0, sizeof(UpTnlCfg));
+ (*ueCbTnlCfg)->configType = f1TnlCfg->configType;
+ (*ueCbTnlCfg)->cellId = f1TnlCfg->cellId;
+ (*ueCbTnlCfg)->ueId = f1TnlCfg->ueId;
+ (*ueCbTnlCfg)->drbId = f1TnlCfg->drbId;
+ if(f1TnlCfg->tnlCfg1)
+ {
+ if((*ueCbTnlCfg)->tnlCfg1 == NULLP)
+ {
+ DU_ALLOC((*ueCbTnlCfg)->tnlCfg1, sizeof(GtpTnlCfg));
+ if((*ueCbTnlCfg)->tnlCfg1 == NULLP)
+ {
+ DU_LOG("\nERROR --> DU_APP : fillTnlCfgToAddMod: Memory Alloc failed for tnlCfg1 for drbId[%d]", f1TnlCfg->drbId);
+ return RFAILED;
+ }
+ }
+ memset((*ueCbTnlCfg)->tnlCfg1, 0, sizeof(GtpTnlCfg));
+ (*ueCbTnlCfg)->tnlCfg1->teId = f1TnlCfg->tnlCfg1->teId;
+ (*ueCbTnlCfg)->tnlCfg1->ulTnlAddress = f1TnlCfg->tnlCfg1->ulTnlAddress;
+ (*ueCbTnlCfg)->tnlCfg1->dlTnlAddress = f1TnlCfg->tnlCfg1->dlTnlAddress;
+ }
+ return ROK;
+}
+
+/*******************************************************************
+ *
+ * @brief Processing the tunnel Request to EGTP
+ *
+ * @details
+ *
+ * Function : duProcEgtpTunnelCfg
+ *
+ * Functionality: Processing the tunnel Request to EGTP
+ *
+ * @params[in] UptnlCfg *duTnlCfg, UpTnlCfg *f1TnlCfg
+ * @return ROK - success
+ * RFAILED - failure
+ *
+ * ****************************************************************/
+
+uint8_t duProcEgtpTunnelCfg(uint8_t ueCbIdx, UpTnlCfg *duTnlCfg, UpTnlCfg *f1TnlCfg)
+{
+ uint8_t ret = RFAILED, delIdx;
+
+ if(f1TnlCfg->tnlCfg1 == NULLP)
+ {
+ DU_LOG("\nERROR --> DU_APP : Tunnel config not found");
+ return ret;
+ }
+
+ if(f1TnlCfg->configType == CONFIG_ADD)
+ {
+ if(duSendEgtpTnlMgmtReq(EGTP_TNL_MGMT_ADD, NULLP, f1TnlCfg->tnlCfg1) == ROK)
+ {
+ if(fillTnlCfgToAddMod(&duCb.upTnlCfg[duCb.numTeId], f1TnlCfg) == ROK)
+ {
+ duCb.numTeId++;
+ ret = ROK;
+ }
+ }
+ }
+ else if(f1TnlCfg->configType == CONFIG_MOD)
+ {
+ if(duSendEgtpTnlMgmtReq(EGTP_TNL_MGMT_MOD, duTnlCfg->tnlCfg1->teId, f1TnlCfg->tnlCfg1) == ROK)
+ {
+ if(fillTnlCfgToAddMod(&duTnlCfg, f1TnlCfg) == ROK)
+ {
+ ret = ROK;
+ }
+ }
+ }
+ else if(f1TnlCfg->configType == CONFIG_DEL)
+ {
+ if(duSendEgtpTnlMgmtReq(EGTP_TNL_MGMT_DEL, duTnlCfg->tnlCfg1->teId, f1TnlCfg->tnlCfg1) == ROK)
+ {
+ /* Free memory at drbIdx */
+ duCb.numTeId--;
+ for(delIdx = ueCbIdx; delIdx < duCb.numTeId; delIdx++)
+ {
+ /* moving all elements one index ahead */
+ ret = fillTnlCfgToAddMod(&duCb.upTnlCfg[delIdx], duCb.upTnlCfg[delIdx+1]);
+ if(ret != ROK)
+ {
+ return ret;
+ }
+ }
+ if(duCb.upTnlCfg[delIdx])
+ {
+ DU_FREE(duCb.upTnlCfg[delIdx]->tnlCfg1, sizeof(GtpTnlCfg));
+ DU_FREE(duCb.upTnlCfg[delIdx], sizeof(UpTnlCfg));
+ }
+ }
+ }
+ return ret;
+}
+
+/***********************************************************************
+ *
+ * @brief Function to fill Tunnel Config
+ * and sends tunnel Req to EGTP
+ *
+ *
+ * @details
+ *
+ * Function : duUpdateTunnelCfgDb
+ *
+ * Functionality: Function to fill tunnel Config
+ * and sends tunnel Cfg Req to EGTP
+ *
+ * @params[in] ueId, cellId, DuUeCfg
+ * @return ROK - success
+ * RFAILED - failure
+ *
+ * ****************************************************************/
+
+uint8_t duUpdateTunnelCfgDb(uint8_t ueId, uint8_t cellId, DuUeCfg *duUeCfg)
+{
+ uint8_t ret = ROK, drbIdx, teIdx;
+ bool drbFound = false;
+
+ /*If Add/Mod tunnels request for that DRB is successful in EGTP */
+ /*then update drbId and tunnel Info in duCb */
+ for(drbIdx=0; drbIdx < duUeCfg->numDrb; drbIdx++)
+ {
+ duUeCfg->upTnlInfo[drbIdx].cellId = cellId;
+ duUeCfg->upTnlInfo[drbIdx].ueId = ueId;
+ for(teIdx = 0; teIdx < duCb.numTeId; teIdx++)
+ {
+ if((duCb.upTnlCfg[teIdx]->ueId == duUeCfg->upTnlInfo[drbIdx].ueId) && \
+ (duCb.upTnlCfg[teIdx]->drbId == duUeCfg->upTnlInfo[drbIdx].drbId))
+ {
+ drbFound = true; /* existing DRB */
+ if(duProcEgtpTunnelCfg(teIdx, duCb.upTnlCfg[teIdx], &duUeCfg->upTnlInfo[drbIdx]) != ROK)
+ {
+ DU_LOG("\nERROR -> DU_APP : duUpdateTunnelCfgDb: Failed to modify tunnel req for Drb id[%d]",
+ duUeCfg->upTnlInfo[drbIdx].drbId);
+ ret = RFAILED;
+ }
+ break;
+ }
+ else
+ drbFound = false;
+ }
+
+ if(!drbFound && ret == ROK)/* new DRB to Add */
+ {
+ if(duProcEgtpTunnelCfg(NULLP, NULLP, &duUeCfg->upTnlInfo[drbIdx]) != ROK)
+ {
+ DU_LOG("\nERROR -> DU_APP : duUpdateTunnelCfgDb: Failed to add tunnel req for Drb id[%d]",
+ duUeCfg->upTnlInfo[drbIdx].drbId);
+ ret = RFAILED;
+ break;
+ }
+ }
+ }
+ return ret;
+}
+
+/*******************************************************************
+ *
+ * @brief @brief To update DuUeCb Mac and Rlc Ue Cfg
+ *
+ *
+ * @details
+ *
+ * Function : duUpdateDuUeCbCfg
+ *
+ * Functionality: update DuUeCb Mac and Rlc Ue Cfg
+ *
+ * @params[in] ueId, cellIdx
+ * @return ROK - success
+ * RFAILED - failure
+ *
+ * ****************************************************************/
+
+uint8_t duUpdateDuUeCbCfg(uint8_t ueId, uint8_t cellId)
+{
+ uint8_t ret = ROK, cellIdx = 0, crnti=0;
+ DuUeCb *ueCb = NULLP;
+
+ GET_CELL_IDX(cellId, cellIdx);
+ ueCb = &duCb.actvCellLst[cellIdx]->ueCb[ueId-1];
+
+ /*Filling RLC Ue Cfg */
+ ueCb->duRlcUeCfg.cellId = cellId;
+ ueCb->duRlcUeCfg.ueId = ueId;
+ ret = duUpdateRlcLcCfg(&ueCb->duRlcUeCfg, ueCb->f1UeDb);
+ if(ret == ROK)
+ {
+ /*Filling MAC Ue Cfg */
+ GET_CRNTI(crnti, ueId);
+ ueCb->duMacUeCfg.cellId = cellId;
+ ueCb->duMacUeCfg.ueId = ueId;
+ ueCb->duMacUeCfg.crnti = crnti;
+ ret = duUpdateMacCfg(&ueCb->duMacUeCfg, ueCb->f1UeDb);
+ if(ret == RFAILED)
+ DU_LOG("\nERROR --> DU APP : Failed while updating MAC LC Config at duUpdateDuUeCbCfg()");
+ else
+ {
+ if(duUpdateTunnelCfgDb(ueId, cellId, &ueCb->f1UeDb->duUeCfg) != ROK)
+ {
+ DU_LOG("\nERROR --> DU_APP : Failed to establish tunnel in duUpdateDuUeCbCfg()");
+ return RFAILED;
+ }
+ }
+ }
+ else
+ DU_LOG("\nERROR --> DU APP : Failed while updating RLC LC Config at duUpdateDuUeCbCfg()");
+ return ret;
+}
+
+/*******************************************************************
+ *
+ * @brief Handle UE config response from MAC
+ *
+ * @details
+ *
+ * Function : DuProcMacUeCfgRsp
+ *
+ * Functionality: Handle UE Config response from MAC
+ *
+ * @params[in] Pointer to MacUeCfgRsp and Pst
+ * @return ROK - success
+ * RFAILED - failure
+ *
+ * ****************************************************************/
+uint8_t DuProcMacUeCfgRsp(Pst *pst, MacUeCfgRsp *cfgRsp)
+{
+ uint8_t ret = ROK;
+ uint16_t cellIdx;
+
+ if(cfgRsp)
+ {
+ GET_CELL_IDX(cfgRsp->cellId, cellIdx);
+ if(cfgRsp->result == MAC_DU_APP_RSP_OK)
+ {
+ if(pst->event == EVENT_MAC_UE_CREATE_RSP)
+ {
+ DU_LOG("\nINFO --> DU APP : MAC UE Create Response : SUCCESS [DU UE F1AP ID : %d]", cfgRsp->ueId);
+
+ if(duCb.actvCellLst[cellIdx] && (duCb.actvCellLst[cellIdx]->ueCb[cfgRsp->ueId -1].gnbDuUeF1apId == cfgRsp->ueId))
+ {
+ duCb.actvCellLst[cellIdx]->ueCb[cfgRsp->ueId -1].duMacUeCfg.macUeCfgState = UE_CREATE_COMPLETE;
+
+ if((duCb.actvCellLst[cfgRsp->cellId -1]->ueCb[cfgRsp->ueId -1].ueState == UE_HANDIN_IN_PROGRESS) &&
+ (duCb.actvCellLst[cfgRsp->cellId -1]->ueCb[cfgRsp->ueId -1].duMacUeCfg.macUeCfgState == UE_CREATE_COMPLETE) &&
+ (duCb.actvCellLst[cfgRsp->cellId -1]->ueCb[cfgRsp->ueId -1].duRlcUeCfg.rlcUeCfgState == UE_CREATE_COMPLETE))
+ {
+ if((ret = duUpdateDuUeCbCfg(cfgRsp->ueId, cfgRsp->cellId)) == ROK)
+ {
+ /* If UE is in handover, RACH resource needs to be requested
+ * from MAC for CFRA */
+ if((duBuildAndSendRachRsrcReqToMac(cfgRsp->cellId, cfgRsp->ueId)) != ROK)
+ {
+ DU_LOG("\nERROR --> DU APP : Failed to send RACH Resource Request to MAC");
+ DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL, cfgRsp, sizeof(MacUeCfgRsp));
+ return RFAILED;
+ }
+ }
+ else
+ {
+ DU_LOG("\nERROR -> DU APP : Failure in updating DU UE CB");
+ DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL, cfgRsp, sizeof(MacUeCfgRsp));
+ return RFAILED;
+ }
+ }
+ }
+ }
+ }
+ else
+ {
+ DU_LOG("\nERROR --> DU APP : MAC UE CFG Response for EVENT[%d]: FAILURE [DU UE F1AP ID : %d]", pst->event, cfgRsp->ueId);
+ ret = RFAILED;
+ }
+ DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL, cfgRsp, sizeof(MacUeCfgRsp));
+ }
+ else
+ {
+ DU_LOG("\nERROR --> DU APP : Received MAC Ue Config Response is NULL at DuProcMacUeCfgRsp()");
+ ret = RFAILED;
+ }
+ return ret;
+}
+
+/*******************************************************************
+ *
+ * @brief Handle UE Reconfig response from MAC
+ *
+ * @details
+ *
+ * Function : DuProcMacUeRecfgRsp
+ *
+ * Functionality: Handle UE ReConfig response from MAC
+ *
+ * @params[in] Pointer to MacUeRecfgRsp and Pst
+ * @return ROK - success
+ * RFAILED - failure
+ *
+ * ****************************************************************/
+uint8_t DuProcMacUeRecfgRsp(Pst *pst, MacUeRecfgRsp *reCfgRsp)
+{
+ uint8_t ret = ROK;
+ uint16_t cellIdx;
+
+ if(reCfgRsp)
+ {
+ GET_CELL_IDX(reCfgRsp->cellId, cellIdx);
+ if(reCfgRsp->result == MAC_DU_APP_RSP_OK)
+ {
+ if(pst->event == EVENT_MAC_UE_RECONFIG_RSP)
+ {
+ DU_LOG("\nINFO --> DU APP : MAC UE Reconfig Response : SUCCESS [DU UE F1AP ID : %d]", reCfgRsp->ueId);
+ if(duCb.actvCellLst[cellIdx] &&
+ (duCb.actvCellLst[cellIdx]->ueCb[reCfgRsp->ueId -1].gnbDuUeF1apId == reCfgRsp->ueId))
+ {
+ duCb.actvCellLst[cellIdx]->ueCb[reCfgRsp->ueId -1].duMacUeCfg.macUeCfgState = UE_RECFG_COMPLETE;
+ if((duCb.actvCellLst[cellIdx]->ueCb[reCfgRsp->ueId -1].duMacUeCfg.macUeCfgState == UE_RECFG_COMPLETE) &&
+ (duCb.actvCellLst[reCfgRsp->cellId -1]->ueCb[reCfgRsp->ueId -1].duRlcUeCfg.rlcUeCfgState == UE_RECFG_COMPLETE))
+ {
+ if((ret = duUpdateDuUeCbCfg(reCfgRsp->ueId, reCfgRsp->cellId)) == ROK)
+ {
+ if((BuildAndSendUeCtxtRsp(reCfgRsp->cellId, reCfgRsp->ueId)) != ROK)
+ {
+ DU_LOG("\nERROR -> DU APP : Failure in BuildAndSendUeCtxtRsp()");
+ DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL, reCfgRsp, sizeof(MacUeRecfgRsp));
+ return RFAILED;
+ }
+ }
+ else
+ {
+ DU_LOG("\nERROR -> DU APP : Failure in updating DU UE CB");
+ DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL, reCfgRsp, sizeof(MacUeRecfgRsp));
+ return RFAILED;
+ }
+ }
+ }
+ }
+ }
+ else
+ {
+ DU_LOG("\nERROR --> DU APP : MAC UE RECFG Response for EVENT[%d]: FAILURE [DU UE F1AP ID : %d]", pst->event, reCfgRsp->ueId);
+ if(pst->event == EVENT_MAC_UE_RECONFIG_RSP)
+ {
+ //TODO: Send the failure case in Ue Context Setup Response
+ }
+ ret = RFAILED;
+ }
+ DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL, reCfgRsp, sizeof(MacUeRecfgRsp));
+ }
+ else
+ {
+ DU_LOG("\nERROR --> DU APP : Received MAC Ue ReConfig Response is NULL at DuProcMacUeRecfgRsp()");
+ ret = RFAILED;
+ }
+ return ret;
+}
+
+/*******************************************************************
+ *
+ * @brief Processes UE create Req to RLC UL
+ *
+ * @details
+ *
+ * Function : duBuildAndSendUeCreateReqToRlc
+ *
+ * Functionality:
+ * Processes UE create Req to RLC UL
+ *
+ * @params[in] cellId,
+ * ueId,
+ * Pointer to RlcUeCfg
+ * @return ROK - success
+ * RFAILED - failure
+ *
+ *****************************************************************/
+
+uint8_t duBuildAndSendUeCreateReqToRlc(uint16_t cellId, uint8_t gnbDuUeF1apId, DuUeCfg *ueCfgDb, DuRlcUeCfg *duRlcUeCfg)
+{
+ uint8_t ret = ROK;
+ RlcUeCfg *rlcUeCfg = NULLP;
+ Pst pst;
+
+ ret = updateRlcUeCfg(cellId, gnbDuUeF1apId, ueCfgDb, duRlcUeCfg);
+ if(ret == RFAILED)
+ {
+ DU_LOG("\nERROR --> DU APP : Failed to fill Rlc Ue Cfg at duBuildAndSendUeCreateReqToRlc()");
+ return ret;
+ }
+
+ FILL_PST_DUAPP_TO_RLC(pst, RLC_UL_INST, EVENT_RLC_UE_CREATE_REQ);
+ /* Copying ueCfg to a sharable buffer */
+ DU_ALLOC_SHRABL_BUF(rlcUeCfg, sizeof(RlcUeCfg));
+ if(rlcUeCfg)
+ {
+ memset(rlcUeCfg, 0, sizeof(RlcUeCfg));
+ fillRlcUeCfg(duRlcUeCfg, rlcUeCfg);
+
+ /* Processing one Ue at a time to RLC */
+ DU_LOG("\nDEBUG --> DU_APP: Sending UE create request to RLC UL");
+ ret = (*packRlcUeCreateReqOpts[pst.selector])(&pst, rlcUeCfg);
+ if(ret == RFAILED)
+ {
+ DU_LOG("\nERROR --> DU_APP : Failure in sending Ue Create Req to RLC");
+ DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL, rlcUeCfg, sizeof(RlcUeCfg));
+ ret = RFAILED;
+ }
+ }
+ else
+ {
+ DU_LOG("\n ERROR --> DU APP : Memory alloc failed at duBuildAndSendUeCreateReqToRlc()");
+ ret = RFAILED;
+ }
+ return ret;
+}
+
+/*******************************************************************
+ *
+ * @brief Processes UE create Rsp received from RLC UL
+ *
+ * @details
+ *
+
+ * Function : DuProcRlcUeCfgRsp
+ *
+ * Functionality:
+ * Processes UE create Rsp received from RLC UL
+ *
+ * @params[in] Post structure
+ * Pointer to RlcCfgCfm
+ * @return ROK - success
+ * RFAILED - failure
+ *
+ *****************************************************************/
+uint8_t DuProcRlcUeCfgRsp(Pst *pst, RlcUeCfgRsp *cfgRsp)
+{
+ uint8_t ret = ROK;
+
+ if(cfgRsp)
+ {
+ if(cfgRsp->result == RLC_DU_APP_RSP_OK)
+ {
+ if(pst->event == EVENT_RLC_UE_CREATE_RSP)
+ {
+ DU_LOG("\nINFO --> DU_APP: RLC UE Create Response : SUCCESS [UE IDX:%d]", cfgRsp->ueId);
+ duCb.actvCellLst[cfgRsp->cellId -1]->ueCb[cfgRsp->ueId -1].duRlcUeCfg.rlcUeCfgState = UE_CREATE_COMPLETE;
+
+ if((duCb.actvCellLst[cfgRsp->cellId -1]->ueCb[cfgRsp->ueId -1].ueState == UE_HANDIN_IN_PROGRESS) &&
+ (duCb.actvCellLst[cfgRsp->cellId -1]->ueCb[cfgRsp->ueId -1].duMacUeCfg.macUeCfgState == UE_CREATE_COMPLETE) &&
+ (duCb.actvCellLst[cfgRsp->cellId -1]->ueCb[cfgRsp->ueId -1].duRlcUeCfg.rlcUeCfgState == UE_CREATE_COMPLETE))
+ {
+ if((ret = duUpdateDuUeCbCfg(cfgRsp->ueId, cfgRsp->cellId)) == ROK)
+ {
+ /* If UE is in handover, RACH resource needs to be requested
+ * from MAC for CFRA */
+ if((duBuildAndSendRachRsrcReqToMac(cfgRsp->cellId, cfgRsp->ueId)) != ROK)
+ {
+ DU_LOG("\nERROR --> DU APP : Failed to send RACH Resource Request to MAC");
+ DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL, cfgRsp, sizeof(MacUeCfgRsp));
+ DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL, cfgRsp, sizeof(RlcUeCfgRsp));
+ return RFAILED;
+ }
+ }
+ else
+ {
+ DU_LOG("\nERROR --> DU APP : Failure in updating DU UE CB");
+ DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL, cfgRsp, sizeof(RlcUeCfgRsp));
+ return RFAILED;
+ }
+ }
+ }
+ else if(pst->event == EVENT_RLC_UE_RECONFIG_RSP)
+ {
+ DU_LOG("\nINFO --> DU_APP: RLC UE Reconfig Response : SUCCESS [UE IDX:%d]", cfgRsp->ueId);
+
+ duCb.actvCellLst[cfgRsp->cellId -1]->ueCb[cfgRsp->ueId -1].duRlcUeCfg.rlcUeCfgState = UE_RECFG_COMPLETE;
+ if((duCb.actvCellLst[cfgRsp->cellId -1]->ueCb[cfgRsp->ueId -1].duMacUeCfg.macUeCfgState == UE_RECFG_COMPLETE) &&
+ (duCb.actvCellLst[cfgRsp->cellId -1]->ueCb[cfgRsp->ueId -1].duRlcUeCfg.rlcUeCfgState == UE_RECFG_COMPLETE))
+ {
+ if((ret = duUpdateDuUeCbCfg(cfgRsp->ueId, cfgRsp->cellId)) == ROK)
+ {
+ if((BuildAndSendUeCtxtRsp(cfgRsp->cellId, cfgRsp->ueId)) != ROK)
+ {
+ DU_LOG("\nERROR --> DU APP : Failure in BuildAndSendUeCtxtRsp");
+ DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL, cfgRsp, sizeof(RlcUeCfgRsp));
+ return RFAILED;
+ }
+ }
+ else
+ {
+ DU_LOG("\nERROR --> DU APP : Failure in updating DU UE CB");
+ DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL, cfgRsp, sizeof(RlcUeCfgRsp));
+ return RFAILED;
+ }
+ }
+ }
+ }
+ else
+ {
+ DU_LOG("\nERROR --> DU_APP: RLC UE CFG Response for EVENT[%d] : FAILED [UE IDX : %d, REASON :%d]",\
+ pst->event, cfgRsp->ueId, cfgRsp->reason);
+ if((pst->event == EVENT_RLC_UE_RECONFIG_RSP))
+ {
+ //TODO: update failure case in ue Context setup Response
+ }
+ ret = RFAILED;
+ }
+ DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL, cfgRsp, sizeof(RlcUeCfgRsp));
+ }
+ else
+ {
+ DU_LOG("\nERROR --> DU_APP: Received RLC Ue Config Response is NULL at DuProcRlcUeCfgRsp()");
+ ret = RFAILED;
+ }
+ return ret;
+}
+
+/**********************************************************************************
+ *
+ * @brief Fills Ue ReCfg from DU DB to RlcUeRecfg
+ *
+ * @details
+ *
+ * Function : fillRlcUeRecfg
+ *
+ * Functionality: fills ue ReCfg to be sent to RLC
+ *
+ * @params[in] DuRlcUeCfg Pointer
+ * RlcUeRecfg Pointer
+ *
+ * @return void
+ * *******************************************************************************/
+void fillRlcUeRecfg(DuRlcUeCfg *duRlcUeCfg, RlcUeRecfg *rlcUeRecfg)
+{
+ uint8_t lcIdx = 0;
+
+ rlcUeRecfg->cellId = duRlcUeCfg->cellId;
+ rlcUeRecfg->ueId = duRlcUeCfg->ueId;
+
+
+ if(duRlcUeCfg->numLcs > 0)
+ {
+ rlcUeRecfg->numLcsToAdd = 0;
+ rlcUeRecfg->numLcsToMod = 0;
+ rlcUeRecfg->numLcsToRel = 0;
+
+ for(lcIdx = 0; lcIdx < duRlcUeCfg->numLcs; lcIdx++)
+ {
+ if(duRlcUeCfg->rlcLcCfg[lcIdx].configType == CONFIG_ADD)
+ {
+ memcpy(&rlcUeRecfg->rlcLcCfgAdd[rlcUeRecfg->numLcsToAdd], &duRlcUeCfg->rlcLcCfg[lcIdx].rlcBearerCfg, sizeof(RlcBearerCfg));
+ rlcUeRecfg->numLcsToAdd++;
+ }
+ if(duRlcUeCfg->rlcLcCfg[lcIdx].configType == CONFIG_MOD)
+ {
+ memcpy(&rlcUeRecfg->rlcLcCfgMod[rlcUeRecfg->numLcsToMod], &duRlcUeCfg->rlcLcCfg[lcIdx].rlcBearerCfg, sizeof(RlcBearerCfg));
+ rlcUeRecfg->numLcsToMod++;
+ }
+ if(duRlcUeCfg->rlcLcCfg[lcIdx].configType == CONFIG_DEL)
+ {
+ memcpy(&rlcUeRecfg->rlcLcCfgRel[rlcUeRecfg->numLcsToRel], &duRlcUeCfg->rlcLcCfg[lcIdx].rlcBearerCfg, sizeof(RlcBearerCfg));
+ rlcUeRecfg->numLcsToRel++;
+ }
+ }
+ }
+ return;
+}
+
+/*******************************************************************
+ *
+ * @brief Builds and Send Ue Reconfig Req to RLC
+ *
+ * @details
+ *
+ * Function : duBuildAndSendUeRecfgReqToRLC
+ *
+ * Functionality: Builds and Send Ue Reconfig Req to RLC
+ *
+ * @params[in] cellId, crnti
+ * DuUeCfg *ueCfgDb
+ * RlcUeCfg *rlcUeCfg
+ * @return ROK - success
+ * RFAILED - failure
+ *
+ * ****************************************************************/
+
+uint8_t duBuildAndSendUeRecfgReqToRlc(uint8_t cellId, uint8_t gnbDuUeF1apId, uint8_t crnti, DuUeCfg *ueCfgDb)
+{
+ uint8_t ret = ROK;
+ DuRlcUeCfg *duRlcUeCfg = NULLP;
+ RlcUeRecfg *rlcUeRecfg = NULLP;
+
+ DU_ALLOC(duRlcUeCfg, sizeof(DuRlcUeCfg));
+ DU_ALLOC_SHRABL_BUF(rlcUeRecfg, sizeof(RlcUeRecfg));
+ if(duRlcUeCfg && rlcUeRecfg)
+ {
+ memset(duRlcUeCfg, 0, sizeof(DuRlcUeCfg));
+ memset(rlcUeRecfg, 0, sizeof(RlcUeRecfg));
+
+ ret = updateRlcUeCfg(cellId, gnbDuUeF1apId, ueCfgDb, duRlcUeCfg);
+
+ if(ret == RFAILED)
+ DU_LOG("\nERROR --> DU APP : Failed at duBuildAndSendUeRecfgReqToRlc()");
+ else
+ {
+ fillRlcUeRecfg(duRlcUeCfg, rlcUeRecfg);
+ ret = sendUeRecfgReqToRlc(rlcUeRecfg);
+ }
+ }
+ else
+ {
+ DU_LOG("\nERROR --> DU APP : Memory Alloc failed at duBuildAndSendUeRecfgReqToRlc()");
+ ret = RFAILED;
+ }
+ DU_FREE(duRlcUeCfg, sizeof(DuRlcUeCfg));
+ return ret;
+}
+
+/**********************************************************************************
+ *
+ * @brief Fills Ue ReCfg from DU DB to MacUeRecfg
+ *
+ * @details
+ *
+ * Function : fillMacUeRecfg
+ *
+ * Functionality: fills ue ReCfg to be sent to MAC
+ *
+ * @params[in] DuMacUeCfg Pointer
+ * MacUeRecfg Pointer
+ *
+ * @return void
+ * *******************************************************************************/
+void fillMacUeRecfg(DuMacUeCfg *duMacUeCfg, MacUeRecfg *macUeRecfg)
+{
+ uint8_t lcIdx = 0;
+
+ macUeRecfg->cellId = duMacUeCfg->cellId;
+ macUeRecfg->ueId = duMacUeCfg->ueId;
+ macUeRecfg->crnti = duMacUeCfg->crnti;
+ macUeRecfg->macCellGrpRecfgPres = duMacUeCfg->macCellGrpCfgPres;
+ if(macUeRecfg->macCellGrpRecfgPres)
+ {
+ memcpy(&macUeRecfg->macCellGrpRecfg, &duMacUeCfg->macCellGrpCfg, sizeof(MacCellGrpCfg));
+ }
+ macUeRecfg->phyCellGrpRecfgPres = duMacUeCfg->phyCellGrpCfgPres;
+ if(macUeRecfg->phyCellGrpRecfgPres)
+ {
+ memcpy(&macUeRecfg->phyCellGrpRecfg, &duMacUeCfg->phyCellGrpCfg, sizeof(PhyCellGrpCfg));
+ }
+ macUeRecfg->spCellRecfgPres = duMacUeCfg->spCellCfgPres;
+ if(macUeRecfg->spCellRecfgPres)
+ {
+ memcpy(&macUeRecfg->spCellRecfg, &duMacUeCfg->spCellCfg, sizeof(SpCellRecfg));
+ }
+ if(duMacUeCfg->ambrCfg != NULLP)
+ {
+ DU_ALLOC_SHRABL_BUF(macUeRecfg->ambrRecfg, sizeof(AmbrCfg));
+ memcpy(macUeRecfg->ambrRecfg, duMacUeCfg->ambrCfg, sizeof(AmbrCfg));
+ }
+ memcpy(&macUeRecfg->dlModInfo, &duMacUeCfg->dlModInfo, sizeof(ModulationInfo));
+ memcpy(&macUeRecfg->ulModInfo, &duMacUeCfg->ulModInfo, sizeof(ModulationInfo));
+ if(duMacUeCfg->numLcs > 0)
+ {
+ macUeRecfg->numLcsToAdd = 0;
+ macUeRecfg->numLcsToDel = 0;
+ macUeRecfg->numLcsToMod = 0;
+
+ for(lcIdx = 0; lcIdx < duMacUeCfg->numLcs; lcIdx++)
+ {
+ if(duMacUeCfg->lcCfgList[lcIdx].configType == CONFIG_ADD)
+ {
+ /*VS: To thoroughly check*/
+ memcpy(&macUeRecfg->lcCfgAdd[macUeRecfg->numLcsToAdd], &duMacUeCfg->lcCfgList[lcIdx].lcConfig, sizeof(LcCfg));
+ macUeRecfg->numLcsToAdd++;
+ }
+ if(duMacUeCfg->lcCfgList[lcIdx].configType == CONFIG_DEL)
+ {
+ /*VS: To thoroughly check*/
+ macUeRecfg->lcIdToDel[macUeRecfg->numLcsToDel] = duMacUeCfg->lcCfgList[lcIdx].lcConfig.lcId;
+ macUeRecfg->numLcsToDel++;
+ }
+ if(duMacUeCfg->lcCfgList[lcIdx].configType == CONFIG_MOD)
+ {
+ /*VS: To thoroughly check*/
+ memcpy(&macUeRecfg->lcCfgMod[macUeRecfg->numLcsToMod], &duMacUeCfg->lcCfgList[lcIdx].lcConfig, sizeof(LcCfg));
+ macUeRecfg->numLcsToMod++;
+ }
+ }
+ }
+ macUeRecfg->transmissionAction = duMacUeCfg->transmissionAction;
+#ifdef NR_DRX
+ macUeRecfg->drxConfigIndicatorRelease = duMacUeCfg->drxConfigIndicatorRelease;
+#endif
+}
+
+/*******************************************************************
+ *
+ * @brief Builds and Send Ue Reconfig Req to MAC
+ *
+ * @details
+ *
+ * Function : duBuildAndSendUeRecfgReqToMac
+ *
+ * Functionality: Builds and Send Ue Reconfig Req to MAC
+ *
+ * @params[in] CellGroupConfigRrc_t *macCellGrpCfg
+ * DuUeCfg *ueCfgDb
+ * @return ROK - success
+ * RFAILED - failure
+ *
+ * ****************************************************************/
+
+uint8_t duBuildAndSendUeRecfgReqToMac(uint8_t cellId, uint8_t duUeF1apId, uint8_t crnti, DuUeCfg *ueCfgDb)
+{
+ uint8_t ret = ROK;
+ DuMacUeCfg *duMacUeCfg = NULLP;
+ MacUeRecfg *macUeRecfg = NULLP;
+
+ DU_ALLOC(duMacUeCfg, sizeof(DuMacUeCfg));
+ DU_ALLOC_SHRABL_BUF(macUeRecfg, sizeof(MacUeRecfg));
+ if(macUeRecfg && duMacUeCfg)
+ {
+ memset(duMacUeCfg, 0, sizeof(DuMacUeCfg));
+ memset(macUeRecfg, 0, sizeof(MacUeRecfg));
+
+ ret = updateDuMacUeCfg(cellId, duUeF1apId, crnti, ueCfgDb, duMacUeCfg);
+ if(ret == RFAILED)
+ DU_LOG("\nERROR --> DU APP : Failed to fill Mac Ue Cfg at duBuildAndSendUeRecfgReqToMac()");
+ else
+ {
+ fillMacUeRecfg(duMacUeCfg, macUeRecfg);
+ ret = sendUeRecfgReqToMac(macUeRecfg);
+ }
+ }
+ else
+ {
+ DU_LOG("\nERROR --> DU APP : Memory alloc failed for macUeCfg at duBuildAndSendUeRecfgReqToMac()");
+ ret = RFAILED;
+ }
+ DU_FREE(duMacUeCfg, sizeof(DuMacUeCfg));
+
+ return ret;
+}
+
+/*******************************************************************
+ *
+ * @brief Build and Send Ue context setup request
+ *
+ * @details
+ *
+
+ * Function : duBuildAndSendUeContextSetupReq
+ *
+ * Functionality:
+ * Build and Send Ue context setup request
+ *
+ * @params[in] cellId, crnti, DuUeCfg pointer
+ * @return ROK - success
+ * RFAILED - failure
+ *
+ *****************************************************************/
+
+uint8_t duBuildAndSendUeContextSetupReq(uint16_t cellId, DuUeCb *ueCb)
+{
+ uint8_t ret = ROK;
+ uint16_t crnti;
+ DuUeCfg *duUeCfg = NULLP;
+
+ DU_LOG("\nDEBUG --> DU_APP: Processing Ue Context Setup Request for cellId [%d]", cellId);
+
+ if(!ueCb)
+ {
+ DU_LOG("\nERROR --> DU APP : UE Cb is NULL");
+ return RFAILED;
+ }
+
+ crnti = ueCb->crnti;
+ duUeCfg = &ueCb->f1UeDb->duUeCfg;
+
+ /* If UE is being handed-in to this DU, UE context setup request will create
+ * new UE context at MAC/SCH and RLC.
+ * If UE is in active state, UE contex setup request will lead to
+ * reconfiguration of UE at MAC/SCH and RLC
+ */
+ if(ueCb->ueState == UE_HANDIN_IN_PROGRESS)
+ {
+ /* Filling MAC UE Config */
+ memset(&ueCb->duMacUeCfg, 0, sizeof(DuMacUeCfg));
+
+ /* Since UE attach has not yet happened, crnti is unknow. Hence passing 0 */
+ ret = duBuildAndSendUeCreateReqToMac(cellId, ueCb->gnbDuUeF1apId, 0, duUeCfg, &ueCb->duMacUeCfg);
+ if(ret == RFAILED)
+ DU_LOG("\nERROR --> DU APP : Failed to send UE create request to MAC");
+
+ ret = duBuildAndSendUeCreateReqToRlc(cellId, ueCb->gnbDuUeF1apId, duUeCfg, &ueCb->duRlcUeCfg);
+ if(ret == RFAILED)
+ DU_LOG("\nERROR --> DU APP : Failed to send UE create request to RLC");
+
+ }
+ else
+ {
+ /* Filling RLC UE Reconfig */
+ ret = duBuildAndSendUeRecfgReqToRlc(cellId, ueCb->gnbDuUeF1apId, crnti, duUeCfg);
+ if(ret == RFAILED)
+ DU_LOG("\nERROR --> DU APP : Failed to build ctxt setup req for RLC at duBuildAndSendUeContextSetupReq()");
+
+ /* Filling MAC UE Reconfig */
+ ret = duBuildAndSendUeRecfgReqToMac(cellId, ueCb->gnbDuUeF1apId, crnti, duUeCfg);
+ if(ret == RFAILED)
+ DU_LOG("\nERROR --> DU APP : Failed at build ctxt setup req for MAC at duBuildAndSendUeContextSetupReq()");
+ }
+
+ return ret;
+}
+
+/*******************************************************************
+ *
+ * @brief Processes DL Rsp received from RLC DL
+ *
+ * @details
+ *
+
+ * Function : DuProcRlcDlRrcMsgRsp
+ *
+ * Functionality:
+ * Processes UE Rsp received from RLC DL
+ *
+ * @params[in] Post structure
+ * Pointer to RlcCfgCfm
+ * @return ROK - success
+ * RFAILED - failure
+ *
+ *****************************************************************/
+uint8_t DuProcRlcDlRrcMsgRsp(Pst *pst, RlcDlRrcMsgRsp *dlRrcMsg)
+{
+ uint8_t ret = ROK, ueId = 0;
+ uint16_t cellId, crnti;
+ DuUeCb *ueCb = NULLP;
+ DlMsgState state;
+
+ state = dlRrcMsg->state;
+ cellId = dlRrcMsg->cellId;
+ crnti = dlRrcMsg->crnti;
+ DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL, dlRrcMsg, sizeof(RlcDlRrcMsgRsp));
+
+ if(state == TRANSMISSION_COMPLETE)
+ {
+ GET_UE_ID(crnti, ueId);
+ ueCb = &duCb.actvCellLst[cellId -1]->ueCb[ueId -1];
+
+ if(ueCb->f1UeDb && ueCb->f1UeDb->dlRrcMsgPres)
+ {
+ if(ueCb->f1UeDb->actionType == UE_CTXT_SETUP)
+ {
+ ret = duBuildAndSendUeContextSetupReq(cellId, ueCb);
+ if(ret == RFAILED)
+ DU_LOG("\nERROR --> DU APP : Failed to process UE Context Setup Request in DuProcRlcDlRrcMsgRsp()");
+ }
+
+ if(ueCb->f1UeDb->actionType == UE_CTXT_MOD)
+ {
+ ret = duBuildAndSendUeContextModReq(cellId, ueCb->gnbDuUeF1apId, crnti, &ueCb->f1UeDb->duUeCfg);
+ if(ret == RFAILED)
+ DU_LOG("\nERROR --> DU APP : Failed to process UE Context Mod Request in DuProcRlcDlRrcMsgRsp()");
+ }
+
+ if(ueCb->f1UeDb->actionType == UE_CTXT_RELEASE && ueCb->ueState == UE_ACTIVE)
+ {
+ ret = duBuildAndSendUeDeleteReq(cellId, crnti);
+ if(ret == RFAILED)
+ {
+ DU_LOG("\nERROR --> DU APP : Failed to process UE Context Release Request in DuProcRlcDlRrcMsgRsp()");
+ }
+ }
+ }
+ }
+ else
+ DU_LOG("\nERROR --> DU APP : Failed to transmit DL RRC Msg");
+
+ return ret;
+}
+/*******************************************************************
+ *
+ * @brief Process UE context setup request from CU
+ *
+ * @details
+ *
+ * Function : duProcUeContextSetupRequest
+ *
+ * Functionality: Process UE context setup request from CU
+ *
+ * @params[in] F1AP message
+ * @return ROK - success
+ * RFAILED - failure
+ *
+ * ****************************************************************/
+
+uint8_t duProcUeContextSetupRequest(DuUeCb *ueCb)
+{
+ uint8_t ret, cellId;
+
+ ret = ROK;
+ if(ueCb)
+ {
+ cellId = duCb.actvCellLst[ueCb->f1UeDb->cellIdx]->cellId;
+
+ /* Send DL RRC msg for security Mode */
+ if(ueCb->f1UeDb->dlRrcMsg)
+ {
+ if(ueCb->f1UeDb->dlRrcMsg->rrcMsgPdu)
+ {
+ /* Sending DL RRC Message to RLC */
+ ret = duBuildAndSendDlRrcMsgToRlc(cellId, ueCb->duRlcUeCfg, ueCb->f1UeDb->dlRrcMsg);
+ if(ret == RFAILED)
+ {
+ DU_LOG("\nERROR --> DU APP : Failed to send DL RRC msg in duProcUeContextSetupRequest()");
+ DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL, ueCb->f1UeDb->dlRrcMsg->rrcMsgPdu,\
+ ueCb->f1UeDb->dlRrcMsg->rrcMsgSize);
+ DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL, ueCb->f1UeDb->dlRrcMsg, sizeof(F1DlRrcMsg));
+ }
+ }
+ }
+ else if(ueCb->f1UeDb->actionType == UE_CTXT_SETUP)
+ {
+ ret = duBuildAndSendUeContextSetupReq(cellId, ueCb);
+ if(ret == RFAILED)
+ {
+ DU_LOG("\nERROR --> DU APP : Failed to build ue context setup Req in duProcUeContextSetupRequest()");
+ }
+ }
+ }
+ else
+ {
+ //TODO: To send the failure cause in UeContextSetupRsp
+ DU_LOG("ERROR --> DU APP : Failed to process UE CNTXT SETUP REQ at duProcUeContextSetupRequest()");
+ }
+ return ret;
+}
+
+/*******************************************************************
+ *
+ * @brief Build and Send Ue context mod request
+ *
+ * @details
+ *
+ *
+ * Function : duBuildAndSendUeContextModReq
+ *
+ * Functionality:
+ * Build and Send Ue context mod request
+ *
+ * @params[in] cellId, crnti, DuUeCfg pointer
+ * @return ROK - success
+ * RFAILED - failure
+ *
+ *****************************************************************/
+
+uint8_t duBuildAndSendUeContextModReq(uint16_t cellId, uint8_t gnbDuUeF1apId, uint16_t crnti, DuUeCfg *duUeCfg)
+{
+ uint8_t ret = ROK;
+
+ DU_LOG("\nDEBUG --> DU_APP: Processing Ue Context Mod Request for cellId [%d]", cellId);
+ /* Filling RLC Ue Reconfig */
+ ret = duBuildAndSendUeRecfgReqToRlc(cellId, gnbDuUeF1apId, crnti, duUeCfg);
+ if(ret == RFAILED)
+ DU_LOG("\nERROR --> DU APP : Failed to build ctxt setup req for RLC at duBuildAndSendUeContextModReq()");
+
+ /* Filling MAC Ue Reconfig */
+ ret = duBuildAndSendUeRecfgReqToMac(cellId, gnbDuUeF1apId, crnti, duUeCfg);
+ if(ret == RFAILED)
+ DU_LOG("\nERROR --> DU APP : Failed at build ctxt setup req for MAC at duBuildAndSendUeContextModReq()");
+
+ return ret;
+}
+/*******************************************************************
+ *
+ * @brief Processing Ue context mod request
+ *
+ * @details
+ *
+ *
+ * Function : duProcUeContextModReq
+ *
+ * Functionality:
+ * Processing Ue context mod request
+ *
+ * @params[in] DuUeCb *ueCb
+ * @return ROK - success
+ * RFAILED - failure
+ *
+ *****************************************************************/
+
+uint8_t duProcUeContextModReq(DuUeCb *ueCb)
+{
+ uint8_t ret, cellId;
+
+ ret = ROK;
+ if(ueCb)
+ {
+ cellId = duCb.actvCellLst[ueCb->f1UeDb->cellIdx]->cellId;
+ /* Send DL RRC msg for security Mode */
+ if(ueCb->f1UeDb->dlRrcMsg)
+ {
+ if(ueCb->f1UeDb->dlRrcMsg->rrcMsgPdu)
+ {
+ /* Sending DL RRC Message to RLC */
+ ret = duBuildAndSendDlRrcMsgToRlc(cellId, ueCb->duRlcUeCfg, ueCb->f1UeDb->dlRrcMsg);
+ if(ret == RFAILED)
+ {
+ DU_LOG("\nERROR --> DU APP : Failed to send DL RRC msg in duProcUeContextModReq()");
+ DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL, ueCb->f1UeDb->dlRrcMsg->rrcMsgPdu,\
+ ueCb->f1UeDb->dlRrcMsg->rrcMsgSize);
+ DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL, ueCb->f1UeDb->dlRrcMsg, sizeof(F1DlRrcMsg));
+ }
+ }
+ }
+ else if(ueCb->f1UeDb->actionType == UE_CTXT_MOD)
+ {
+ ret = duBuildAndSendUeContextModReq(cellId, ueCb->gnbDuUeF1apId, ueCb->crnti, &ueCb->f1UeDb->duUeCfg);
+ if(ret == RFAILED)
+ {
+ DU_LOG("\nERROR --> DU APP : Failed to build ue context setup Req in duProcUeContextModReq()");
+ return RFAILED;
+ }
+ }
+ else if((ueCb->f1UeDb->actionType == UE_CTXT_CFG_QUERY) || (ueCb->f1UeDb->actionType == UE_CTXT_RRC_RECFG_COMPLETE))
+ {
+ if((BuildAndSendUeContextModRsp(ueCb) != ROK))
+ {
+ DU_LOG("\nERROR --> DU APP : Failed to build UE Context modification response");
+ return RFAILED;
+ }
+ }
+ }
+ else
+ {
+ //TODO: To send the failure cause in UeContextModRsp
+
+ DU_LOG("ERROR --> DU APP : Failed to process UE CNTXT MOD REQ at duProcUeContextModReq()");
+ return RFAILED;
+ }
+ return ROK;
+}
+
+/*******************************************************************
+*
+* @brief Build and send dedicated RACH resource release request to MAC
+*
+* @details
+*
+* Function : duBuildAndSendRachRsrcRelToMac
+*
+* Functionality: Function to Build and send dedicated RACH resource
+* release request to MAC
+*
+* @params[in] Cell ID
+* UE CB
+* @return ROK - Success
+* RFAILED - Failure
+*
+* ****************************************************************/
+uint8_t duBuildAndSendRachRsrcRelToMac(uint16_t cellId, DuUeCb *ueCb)
+{
+ Pst pst;
+ MacRachRsrcRel *rachRsrcRel = NULLP;
+
+ DU_ALLOC_SHRABL_BUF(rachRsrcRel, sizeof(MacRachRsrcRel));
+ if(!rachRsrcRel)
+ {
+ DU_LOG("\nERROR --> DU APP : Failed to allocate memory for RACH Resource Release in \
+ duBuildAndSendRachRsrcRelToMac()");
+ return RFAILED;
+ }
+
+ rachRsrcRel->cellId = cellId;
+ rachRsrcRel->ueId = ueCb->gnbDuUeF1apId;
+ rachRsrcRel->crnti = ueCb->crnti;