X-Git-Url: https://gerrit.o-ran-sc.org/r/gitweb?a=blobdiff_plain;f=src%2Fdu_app%2Fdu_ue_mgr.c;h=df2d14c03fc84a806f835d548d9ceb0c4b68283a;hb=5007af25423493fbc002e30d847aa05d44bc180e;hp=89780b0c8218a1a0746134ffb1bdaf691f6c57a3;hpb=05997c50c829f05baa575142f73500f1d7283233;p=o-du%2Fl2.git diff --git a/src/du_app/du_ue_mgr.c b/src/du_app/du_ue_mgr.c index 89780b0c8..df2d14c03 100644 --- a/src/du_app/du_ue_mgr.c +++ b/src/du_app/du_ue_mgr.c @@ -90,6 +90,19 @@ DuMacUeDeleteReq packMacUeDeleteReqOpts[] = packDuMacUeDeleteReq /* Light weight-loose coupling */ }; +DuRlcUeDeleteReq packRlcUeDeleteReqOpts[] = +{ + packDuRlcUeDeleteReq, /* Loose coupling */ + RlcProcUeDeleteReq, /* TIght coupling */ + packDuRlcUeDeleteReq /* Light weight-loose coupling */ +}; + +DuMacCellDeleteReq packMacCellDeleteReqOpts[] = +{ + packDuMacCellDeleteReq, /* Loose coupling */ + MacProcCellDeleteReq, /* TIght coupling */ + packDuMacCellDeleteReq /* Light weight-loose coupling */ +}; /******************************************************************* * @@ -1131,6 +1144,7 @@ uint8_t fillMacUeCfg(uint16_t cellId, uint8_t ueIdx, uint16_t crnti, \ /* Fetching MacDb from DuUeCb */ GET_CELL_IDX(cellId, cellIdx); duMacDb = &duCb.actvCellLst[cellIdx]->ueCb[ueIdx-1].macUeCfg; + duMacDb->macUeCfgState = UE_CFG_INPROGRESS; /* Fetching MaUeCfg List for ADD/MOD/DEL */ macUeCfg->cellId = cellId; macUeCfg->ueIdx = ueIdx; @@ -1152,8 +1166,10 @@ uint8_t fillMacUeCfg(uint16_t cellId, uint8_t ueIdx, uint16_t crnti, \ } } ret = fillAmbr(&macUeCfg->ambrCfg, ueCfgDb->ambrCfg); - - duFillModulationDetails(macUeCfg, duMacDb, ueCfgDb->ueNrCapability); + if(ueCfgDb->ueNrCapability != NULLP) + { + duFillModulationDetails(macUeCfg, duMacDb, ueCfgDb->ueNrCapability); + } } /* Filling LC Context */ @@ -1495,41 +1511,42 @@ uint8_t fillRlcUeCfg(uint16_t cellId, uint8_t ueIdx,\ /* Fetch RlcDb from DuUeCb */ GET_CELL_IDX(cellId, cellIdx); duRlcDb = &duCb.actvCellLst[cellIdx]->ueCb[ueIdx-1].rlcUeCfg; + duRlcDb->rlcUeCfgState = UE_CFG_INPROGRESS; /*Filling RlcUeCfg */ rlcUeCfg->cellId = cellId; rlcUeCfg->ueIdx = ueIdx; for(dbIdx = 0; (dbIdx < ueCfgDb->numRlcLcs && ret == ROK); dbIdx++) { - ret = fillDefaultRlcModeCfg(ueCfgDb->rlcLcCfg[dbIdx].rlcMode, &ueCfgDb->rlcLcCfg[dbIdx]); - if(ret == RFAILED) - { - DU_LOG("\n ERROR --> DU APP : Failed to fill Rlc Mode at fillRlcUeCfg()"); - memset(rlcUeCfg, 0, sizeof(RlcUeCfg)); - return ret; - } - /* Fill Rlc Ue Cfg List for ADD/MOD/DEL */ - for(lcIdx = 0; lcIdx < duRlcDb->numLcs; lcIdx++) - { - if(ueCfgDb->rlcLcCfg[dbIdx].lcId == duRlcDb->rlcLcCfg[lcIdx].lcId) - { - lcIdFound = true; - if((ueCfgDb->rlcLcCfg[dbIdx].configType == CONFIG_UNKNOWN)|| - (ueCfgDb->rlcLcCfg[dbIdx].configType == CONFIG_MOD)) - { - /* MOD */ - ueCfgDb->rlcLcCfg[dbIdx].configType = CONFIG_MOD; /* update Db for MOD type */ - memcpy(&rlcUeCfg->rlcLcCfg[dbIdx], &ueCfgDb->rlcLcCfg[dbIdx], sizeof(RlcBearerCfg)); - } - } - else - lcIdFound = false; - } - if(!lcIdFound) - { - /* ADD/ DEL Config Type */ - memcpy(&rlcUeCfg->rlcLcCfg[dbIdx], &ueCfgDb->rlcLcCfg[dbIdx], sizeof(RlcBearerCfg)); - } - rlcUeCfg->numLcs++; + ret = fillDefaultRlcModeCfg(ueCfgDb->rlcLcCfg[dbIdx].rlcMode, &ueCfgDb->rlcLcCfg[dbIdx]); + if(ret == RFAILED) + { + DU_LOG("\n ERROR --> DU APP : Failed to fill Rlc Mode at fillRlcUeCfg()"); + memset(rlcUeCfg, 0, sizeof(RlcUeCfg)); + return ret; + } + /* Fill Rlc Ue Cfg List for ADD/MOD/DEL */ + for(lcIdx = 0; lcIdx < duRlcDb->numLcs; lcIdx++) + { + if(ueCfgDb->rlcLcCfg[dbIdx].lcId == duRlcDb->rlcLcCfg[lcIdx].lcId) + { + lcIdFound = true; + if((ueCfgDb->rlcLcCfg[dbIdx].configType == CONFIG_UNKNOWN)|| + (ueCfgDb->rlcLcCfg[dbIdx].configType == CONFIG_MOD)) + { + /* MOD */ + ueCfgDb->rlcLcCfg[dbIdx].configType = CONFIG_MOD; /* update Db for MOD type */ + memcpy(&rlcUeCfg->rlcLcCfg[dbIdx], &ueCfgDb->rlcLcCfg[dbIdx], sizeof(RlcBearerCfg)); + } + } + else + lcIdFound = false; + } + if(!lcIdFound) + { + /* ADD/ DEL Config Type */ + memcpy(&rlcUeCfg->rlcLcCfg[dbIdx], &ueCfgDb->rlcLcCfg[dbIdx], sizeof(RlcBearerCfg)); + } + rlcUeCfg->numLcs++; } } return ret; @@ -1632,7 +1649,7 @@ uint8_t duBuildAndSendUeCreateReqToMac(uint16_t cellId, uint8_t ueIdx,\ if(macUeCfg) { memset(macUeCfg, 0, sizeof(MacUeCfg)); - memcpy(macUeCfg, &duCb.actvCellLst[cellId - 1]->ueCb[ueIdx -1].macUeCfg, sizeof(MacUeCfg)); + memcpy(macUeCfg, duMacUeCfg, sizeof(MacUeCfg)); DU_LOG("\nDEBUG --> DU_APP: Sending UE create request to MAC"); /* Processing one Ue at a time to MAC */ @@ -2167,8 +2184,6 @@ uint8_t DuProcMacUeCfgRsp(Pst *pst, MacUeCfgRsp *cfgRsp) if((ret = duUpdateDuUeCbCfg(cfgRsp->ueIdx, cfgRsp->cellId)) == ROK) { BuildAndSendUeCtxtRsp(cfgRsp->ueIdx, cfgRsp->cellId); - duCb.actvCellLst[cfgRsp->cellId -1]->ueCb[cfgRsp->ueIdx -1].\ - macUeCfg.macUeCfgState = 0; } } } @@ -2290,8 +2305,6 @@ uint8_t DuProcRlcUeCfgRsp(Pst *pst, RlcUeCfgRsp *cfgRsp) if((ret = duUpdateDuUeCbCfg(cfgRsp->ueIdx, cfgRsp->cellId)) == ROK) { BuildAndSendUeCtxtRsp(cfgRsp->ueIdx, cfgRsp->cellId); - duCb.actvCellLst[cfgRsp->cellId -1]->ueCb[cfgRsp->ueIdx -1].\ - rlcUeCfg.rlcUeCfgState = 0; } } } @@ -2492,7 +2505,7 @@ uint8_t DuProcRlcDlRrcMsgRsp(Pst *pst, RlcDlRrcMsgRsp *dlRrcMsg) * * @details * - * Function : duProcUeContextSetupRequest + * Function : duProcUeContextSetupRequest * * Functionality: Process UE context setup request from CU * @@ -2636,6 +2649,7 @@ uint8_t duProcUeContextModReq(DuUeCb *ueCb) } return ROK; } + /******************************************************************* * * @brief Function to delete Pdsch ServCellCfg @@ -2650,6 +2664,7 @@ uint8_t duProcUeContextModReq(DuUeCb *ueCb) * @return void * * ****************************************************************/ + void deletePdschServCellCfg(PdschServCellCfg *pdschServCellCfg) { DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL,pdschServCellCfg->maxMimoLayers, sizeof(uint8_t)); @@ -2673,6 +2688,7 @@ void deletePdschServCellCfg(PdschServCellCfg *pdschServCellCfg) * RFAILED - failure * *******************************************************************/ + void deleteMacUeCfg(MacUeCfg *ueCfg) { uint8_t lcCfgIdx; @@ -2760,6 +2776,55 @@ void deleteMacUeCfg(MacUeCfg *ueCfg) } memset(ueCfg, 0, sizeof(MacUeCfg)); } + +/******************************************************************* +* +* @brief delete UE Configuration of a particular UE +* +* @details +* +* Function : deleteUeCfg +* +* Functionality: delete UE Configuration of a particular UE +* +* @params[in] uint16_t cellIdx, uint8_t ueIdx +* @return ROK - success +* RFAILED - failure +* +* ****************************************************************/ +uint8_t deleteUeCfg(uint16_t cellIdx, uint8_t ueIdx) +{ + DuUeCb *ueCb = NULLP; + if(duCb.actvCellLst[cellIdx] != NULLP) + { + if((duCb.actvCellLst[cellIdx]->ueCb[ueIdx-1].macUeCfg.macUeCfgState == UE_DELETE_COMPLETE)\ + &&(duCb.actvCellLst[cellIdx]->ueCb[ueIdx-1].rlcUeCfg.rlcUeCfgState == UE_DELETE_COMPLETE)) + { + ueCb = &duCb.actvCellLst[cellIdx]->ueCb[ueIdx-1]; + deleteMacUeCfg(&ueCb->macUeCfg); + deleteRlcUeCfg(&ueCb->rlcUeCfg); + if(ueCb->f1UeDb !=NULLP) + { + freeF1UeDb(ueCb->f1UeDb); + } + duCb.actvCellLst[cellIdx]->numActvUes--; + memset(ueCb, 0, sizeof(DuUeCb)); + } + else + { + DU_LOG("INFO --> DU APP : deleteUeCfg(): MAC or RLC UE configuration state not UE_DELETE_COMPLETE"); + return RFAILED; + } + } + else + { + DU_LOG("ERROR --> DU APP : deleteUeCfg(): CellIdx[%d] is not found", cellIdx); + return RFAILED; + } + return ROK; +} + + /******************************************************************* * * @brief Handle UE delete response from MAC @@ -2775,38 +2840,112 @@ void deleteMacUeCfg(MacUeCfg *ueCfg) * RFAILED - failure * * ****************************************************************/ + uint8_t DuProcMacUeDeleteRsp(Pst *pst, MacUeDeleteRsp *deleteRsp) { + uint8_t ueIdx = 0,ret =ROK; uint16_t cellIdx=0; + uint32_t gnbCuUeF1apId=0, gnbDuUeF1apId =0; + if(deleteRsp) { if(deleteRsp->result == SUCCESS) { DU_LOG("\nINFO --> DU APP : MAC UE Delete Response : SUCCESS [UE IDX : %d]", deleteRsp->ueIdx); GET_CELL_IDX(deleteRsp->cellId, cellIdx); + ueIdx = deleteRsp->ueIdx; if(duCb.actvCellLst[cellIdx]) { - deleteMacUeCfg(&duCb.actvCellLst[cellIdx]->ueCb[deleteRsp->ueIdx -1].macUeCfg); + duCb.actvCellLst[cellIdx]->ueCb[deleteRsp->ueIdx -1].macUeCfg.macUeCfgState = UE_DELETE_COMPLETE; + gnbCuUeF1apId = duCb.actvCellLst[cellIdx]->ueCb[ueIdx-1].gnbDuUeF1apId; + gnbDuUeF1apId = duCb.actvCellLst[cellIdx]->ueCb[ueIdx-1].gnbCuUeF1apId; + if(deleteUeCfg(cellIdx, ueIdx) == ROK) + { + ret = BuildAndSendUeContextReleaseComplete(gnbCuUeF1apId, gnbDuUeF1apId); + if(ret !=ROK) + { + DU_LOG("\nERROR --> DU APP : DuProcMacUeDeleteRsp(): failed to send UE context release complete"); + } + } } } else { DU_LOG("\nERROR --> DU APP : DuProcMacUeDeleteRsp(): MAC UE Delete Response : FAILURE [UE IDX : %d]",\ deleteRsp->ueIdx); - return RFAILED; + ret = RFAILED; } DU_FREE_SHRABL_BUF(pst->region, pst->pool, deleteRsp, sizeof(MacUeDeleteRsp)); } else { DU_LOG("\nERROR --> DU APP : DuProcMacUeDeleteRsp(): MAC UE Delete Response is null"); - return RFAILED; + ret = RFAILED; } - return ROK; + return ret; } + /******************************************************************* -* -* @brief Sending UE Delete Req To Mac + * + * @brief Processes UE Delete Rsp received from RLC + * + * @details + * + * Function : DuProcRlcUeDeleteRsp + * + * Functionality: + * Processes UE Delete Rsp received from RLC + * + * @params[in] Post structure + * Pointer to RlcUeDeleteRsp + * @return ROK - success + * RFAILED - failure + * + * *****************************************************************/ + +uint8_t DuProcRlcUeDeleteRsp(Pst *pst, RlcUeDeleteRsp *delRsp) +{ + uint8_t ueIdx = 0, ret = ROK; + uint16_t cellIdx = 0; + uint32_t gnbCuUeF1apId=0, gnbDuUeF1apId =0; + + if(delRsp) + { + ueIdx = delRsp->ueIdx; + GET_CELL_IDX(delRsp->cellId, cellIdx); + + if(delRsp->result == SUCCESSFUL) + { + DU_LOG("\nINFO --> DU_APP: RLC UE Delete Response : SUCCESS [UE IDX:%d]", ueIdx); + if(duCb.actvCellLst[cellIdx]!=NULLP) + { + duCb.actvCellLst[cellIdx]->ueCb[ueIdx-1].rlcUeCfg.rlcUeCfgState = UE_DELETE_COMPLETE; + gnbCuUeF1apId = duCb.actvCellLst[cellIdx]->ueCb[ueIdx-1].gnbDuUeF1apId; + gnbDuUeF1apId = duCb.actvCellLst[cellIdx]->ueCb[ueIdx-1].gnbCuUeF1apId; + if(deleteUeCfg(cellIdx, ueIdx) == ROK) + { + ret = BuildAndSendUeContextReleaseComplete(gnbCuUeF1apId, gnbDuUeF1apId); + if(ret != ROK) + { + DU_LOG("\nERROR --> DU APP : DuProcMacUeDeleteRsp(): failed to send UE context release complete"); + } + } + } + } + else + { + DU_LOG("\nERROR --> DU_APP: RLC UE Delete Response : FAILED [UE IDX:%d]", ueIdx); + ret = RFAILED; + } + DU_FREE_SHRABL_BUF(pst->region, pst->pool, delRsp, sizeof(RlcUeDeleteRsp)); + + } + return ret; +} + +/******************************************************************* + * + * @brief Sending UE Delete Req To Mac * * @details * @@ -2815,7 +2954,7 @@ uint8_t DuProcMacUeDeleteRsp(Pst *pst, MacUeDeleteRsp *deleteRsp) * Functionality: * sending UE Delete Req To Mac * -* @params[in] uint8_t cellId, uint8_t ueId +* @params[in] cellId, ueIdx, crnti * @return ROK - success * RFAILED - failure * @@ -2826,7 +2965,7 @@ uint8_t sendUeDeleteReqToMac(uint16_t cellId, uint8_t ueIdx, uint16_t crnti) Pst pst; uint8_t ret=ROK; MacUeDelete *ueDelete = NULLP; - + DU_ALLOC_SHRABL_BUF(ueDelete, sizeof(MacUeDelete)); if(ueDelete) { @@ -2853,49 +2992,344 @@ uint8_t sendUeDeleteReqToMac(uint16_t cellId, uint8_t ueIdx, uint16_t crnti) } /******************************************************************* -* -* @brief Du preocess Ue Delete Req to MAC and RLC -* -* @details -* -* Function : duProcUeDeleteReq -* -* Functionality: Du process Ue Delete Req to MAC and RLC -* -* @params[in] cellId, crnti -* @return ROK - success -* RFAILED - failure -* -* ****************************************************************/ -uint8_t duProcUeDeleteReq(uint16_t cellId, uint16_t crnti) + * + * @brief Sending UE Delete Req To Rlc + * + * @details + * + * Function : sendUeDeleteReqToRlc + * + * Functionality: + * Sending UE Delete Req To Rlc + * + * @params[in] cellId, ueIdx + * @return ROK - success + * RFAILED - failure + * + *****************************************************************/ + +uint8_t sendUeDeleteReqToRlc(uint16_t cellId, uint8_t ueIdx) { - uint16_t cellIdx = 0; - uint8_t ueIdx = 0; + uint8_t ret; + Pst pst; + RlcUeDelete *ueDelete; + + DU_ALLOC_SHRABL_BUF(ueDelete, sizeof(RlcUeDelete)); + if(ueDelete !=NULLP) + { + ueDelete->cellId = cellId; + ueDelete->ueIdx = ueIdx; + FILL_PST_DUAPP_TO_RLC(pst, RLC_UL_INST, EVENT_RLC_UE_DELETE_REQ); + + ret = (*packRlcUeDeleteReqOpts[pst.selector])(&pst, ueDelete); + if(ret == RFAILED) + { + DU_LOG("\nERROR --> DU_APP : sendUeDeleteReqToRlc():Failed to send UE Delete Req to RLC"); + DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL, ueDelete, sizeof(RlcUeDelete)); + } + } + else + { + DU_LOG("\nERROR --> DU_APP: sendUeDeleteReqToRlc():Memory allocation failed"); + ret = RFAILED; + } + return ret; +} + +/******************************************************************* + * + * @brief DU processes UE delete req from CU and sends to MAC and RLC + * + * @details + * + * Function : duProcUeDeleteReq + * + * Functionality: DU processes UE delete req from CU and sends to MAC + * and RLC + * + * @params[in] cellId, crnti + * @return ROK - success + * RFAILED - failure + * + * ****************************************************************/ + +uint8_t duProcUeDeleteReq(uint16_t cellId) +{ + uint8_t ueIdx = 0, ueId =0; + uint16_t cellIdx = 0, crnti = 0; DU_LOG("\nDEBUG --> DU_APP: Processing UE Delete Request "); GET_CELL_IDX(cellId, cellIdx); - GET_UE_IDX(crnti, ueIdx); + GET_CRNTI(crnti,ueIdx); if(duCb.actvCellLst[cellIdx] != NULLP) { - if(duCb.actvCellLst[cellIdx]->ueCb[ueIdx-1].crnti == crnti) + for(ueIdx =0;ueIdx< duCb.actvCellLst[cellIdx]->numActvUes; ueIdx++) { - if(sendUeDeleteReqToMac(cellId, ueIdx, crnti) == RFAILED) + ueId = ueIdx+1; + if(sendUeDeleteReqToRlc(cellId, ueId) == RFAILED) + { + DU_LOG("\nERROR --> DU APP : duProcUeDeleteReq():Failed to build UE delete req for RLC "); + return RFAILED; + } + + GET_CRNTI(crnti,ueId); + if(sendUeDeleteReqToMac(cellId, ueId, crnti) == RFAILED) { DU_LOG("\nERROR --> DU APP : duProcUeDeleteReq(): Failed to build UE delete req for MAC "); return RFAILED; } + } + } + else + { + DU_LOG("\nERROR --> DU APP : duProcUeDeleteReq(): Cell Id is not found"); + return RFAILED; + } + + return ROK; +} + +/******************************************************************* + * + * @brief delete RlcUeCfg from duCb + * + * @details + * + * Function : deleteRlcUeCfg + * + * Functionality: + * delete RlcUeCfg from duCb + * + * @params[in] RlcUeCfg *ueCfg + * + * @return ROK - success + * RFAILED - failure + * + *****************************************************************/ + +void deleteRlcUeCfg(RlcUeCfg *ueCfg) +{ + uint8_t lcIdx = 0; + RlcBearerCfg *lcCfg= NULLP; + if(ueCfg) + { + for(lcIdx =0 ; lcIdx < ueCfg->numLcs ; lcIdx++) + { + lcCfg = &ueCfg->rlcLcCfg[lcIdx]; + switch(lcCfg->rlcMode) + { + case RLC_AM : + { + DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL, lcCfg->u.amCfg, sizeof(AmBearerCfg)); + break; + } + case RLC_UM_BI_DIRECTIONAL : + { + DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL, lcCfg->u.umBiDirCfg, sizeof(UmBiDirBearerCfg)); + break; + } + case RLC_UM_UNI_DIRECTIONAL_UL : + { + DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL, lcCfg->u.umUniDirUlCfg, sizeof(UmUniDirUlBearerCfg)); + break; + } + case RLC_UM_UNI_DIRECTIONAL_DL : + { + DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL, lcCfg->u.umUniDirDlCfg, sizeof(UmUniDirDlBearerCfg)); + break; + } + } + } + memset(ueCfg, 0, sizeof(RlcUeCfg)); + } +} + +/******************************************************************* + * + * @brief Delete DU CellCb information + * + * @details + * + * Function : deleteDuCellCb + * + * Functionality: Delete DU CellCb information + * + * @params[in] DuCellCb *cellCb + * @return ROK - success + * RFAILED - failure + * + * ****************************************************************/ + +void deleteDuCellCb(DuCellCb *cellCb) +{ + + if(cellCb->duMacCellCfg) + { + if(cellCb->duMacCellCfg->prachCfg.fdm[0].unsuedRootSeq) + { + DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL, cellCb->duMacCellCfg->prachCfg.fdm[0].unsuedRootSeq,\ + cellCb->duMacCellCfg->prachCfg.fdm[0].numUnusedRootSeq); + } + if(cellCb->duMacCellCfg->sib1Cfg.sib1Pdu) + { + DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL,cellCb->duMacCellCfg->sib1Cfg.sib1Pdu,\ + cellCb->duMacCellCfg->sib1Cfg.sib1PduLen); + } + DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL, cellCb->duMacCellCfg, sizeof(MacCellCfg)); + } + memset(cellCb, 0, sizeof(DuCellCb)); + +} + +/******************************************************************* + * + * @brief Handle Cell delete response from MAC + * + * @details + * + * Function : DuProcMacCellDeleteRsp + * + * Functionality: Handle Cell delete response from MAC + * + * @params[in] Pointer to MacCellDeleteRsp and Pst + * @return ROK - success + * RFAILED - failure + * + * ****************************************************************/ +uint8_t DuProcMacCellDeleteRsp(Pst *pst, MacCellDeleteRsp *deleteRsp) +{ + uint8_t ret = ROK; + uint16_t cellIdx=0; + if(deleteRsp) + { + if(deleteRsp->result == SUCCESSFUL_RSP) + { + GET_CELL_IDX(deleteRsp->cellId, cellIdx); + DU_LOG("\nINFO --> DU APP : MAC CELL Delete Response : SUCCESS [CELL IDX : %d]", deleteRsp->cellId); + if(duCb.actvCellLst[cellIdx]->cellId == deleteRsp->cellId) + { + deleteDuCellCb(duCb.actvCellLst[cellIdx]); + duCb.numActvCells--; + DU_FREE(duCb.actvCellLst[cellIdx], sizeof(DuCellCb)); + } + else + { + DU_LOG("\nERROR --> DU APP : DuProcMacCellDeleteRsp(): CellId [%d] doesnot exist", deleteRsp->cellId); + ret = RFAILED; + } } else { - DU_LOG("\nERROR --> DU APP : duProcUeDeleteReq(): crnti is not found"); + DU_LOG("\nERROR --> DU APP : DuProcMacCellDeleteRsp(): MAC CELL Delete Response : FAILED\ + [CELL IDX : %d]", deleteRsp->cellId); + ret = RFAILED; + } + DU_FREE_SHRABL_BUF(pst->region, pst->pool, deleteRsp, sizeof(MacUeDeleteRsp)); + } + else + { + DU_LOG("\nERROR --> DU APP : DuProcMacCellDeleteRsp(): Received MAC cell delete response is NULL"); + ret = RFAILED; + } + return ret; +} + +/******************************************************************* + * + * @brief Sending Cell Delete Req To Mac + * + * @details + * + * Function : sendCellDeleteReqToMac + * + * Functionality: + * sending Cell Delete Req To Mac + * + * @params[in] uint16_t cellId + * @return ROK - success + * RFAILED - failure + * + * + *****************************************************************/ + +uint8_t sendCellDeleteReqToMac(uint16_t cellId) +{ + Pst pst; + uint8_t ret=ROK; + MacCellDelete *cellDelete = NULLP; + + DU_ALLOC(cellDelete, sizeof(MacCellDelete)); + if(cellDelete) + { + cellDelete->cellId = cellId; + FILL_PST_DUAPP_TO_MAC(pst, EVENT_MAC_CELL_DELETE_REQ); + + DU_LOG("\nINFO --> DU APP : Sending Cell Delete Request to MAC"); + /* Processing one Cell at a time to MAC */ + ret = (*packMacCellDeleteReqOpts[pst.selector])(&pst, cellDelete); + if(ret == RFAILED) + { + DU_LOG("\nERROR --> DU APP : sendCellDeleteReqToMac(): Failed to send Cell delete Req to MAC"); + DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL, cellDelete, sizeof(MacCellDelete)); + } + } + else + { + DU_LOG("\nERROR --> DU APP : sendCellDeleteReqToMac(): Failed to allocate memory"); + ret = RFAILED; + } + return ret; +} + +/******************************************************************* + * + * @brief DU preocess Cell Delete Req to MAC + * + * @details + * + * Function : duProcCellDeleteReq + * + * Functionality: DU process Cell Delete Req to MAC + * + * @params[in] uint16_t cellId + * @return ROK - success + * RFAILED - failure + * + * ****************************************************************/ + +uint8_t duProcCellDeleteReq(uint16_t cellId) +{ + uint16_t cellIdx = 0; + + DU_LOG("\nINFO --> DU APP : Processing Cell Delete Request "); + GET_CELL_IDX(cellId, cellIdx); + + if(duCb.actvCellLst[cellIdx] != NULLP) + { + if(duBuildAndSendMacCellStop() == RFAILED) + { + DU_LOG("\nERROR --> DU APP : duProcCellDeleteReq(): Failed to process Cell delete req for cellId[%d]",cellId); + return RFAILED; + } + + if(duCb.actvCellLst[cellIdx]->numActvUes) + { + DU_LOG("\nERROR --> DU APP : duProcCellDeleteReq(): Active UEs present Failed to process cell Delete\ + Req for cellID[%d]", cellId); + return RFAILED; + } + if(sendCellDeleteReqToMac(cellId) == RFAILED) + { + DU_LOG("\nERROR --> DU APP : duProcCellDeleteReq(): Failed to build and send Cell delete req for MAC for\ + cellId[%d]",cellId); return RFAILED; } } else { - DU_LOG("\nERROR --> DU APP : duProcUeDeleteReq(): Cell Id is not found"); + DU_LOG("\nERROR --> DU APP : duProcCellDeleteReq(): CellId[%d] is not found", cellId); return RFAILED; } @@ -2904,4 +3338,4 @@ uint8_t duProcUeDeleteReq(uint16_t cellId, uint16_t crnti) /********************************************************************** End of file - ***********************************************************************/ +***********************************************************************/