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=34318ee20ece147e617a27b9379ad1745b07f489;hpb=f33e70cfac9c2fa3ffbbbdf2183b4c8876974b96;p=o-du%2Fl2.git diff --git a/src/du_app/du_ue_mgr.c b/src/du_app/du_ue_mgr.c index 34318ee20..df2d14c03 100644 --- a/src/du_app/du_ue_mgr.c +++ b/src/du_app/du_ue_mgr.c @@ -97,6 +97,13 @@ DuRlcUeDeleteReq packRlcUeDeleteReqOpts[] = packDuRlcUeDeleteReq /* Light weight-loose coupling */ }; +DuMacCellDeleteReq packMacCellDeleteReqOpts[] = +{ + packDuMacCellDeleteReq, /* Loose coupling */ + MacProcCellDeleteReq, /* TIght coupling */ + packDuMacCellDeleteReq /* Light weight-loose coupling */ +}; + /******************************************************************* * * @brief Function to fillDlUserDataInfo @@ -1137,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; @@ -1503,6 +1511,7 @@ 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; @@ -1640,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 */ @@ -2175,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; } } } @@ -2298,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; } } } @@ -2500,7 +2505,7 @@ uint8_t DuProcRlcDlRrcMsgRsp(Pst *pst, RlcDlRrcMsgRsp *dlRrcMsg) * * @details * - * Function : duProcUeContextSetupRequest + * Function : duProcUeContextSetupRequest * * Functionality: Process UE context setup request from CU * @@ -2774,138 +2779,157 @@ void deleteMacUeCfg(MacUeCfg *ueCfg) /******************************************************************* * -* @brief Handle UE delete response from MAC +* @brief delete UE Configuration of a particular UE * * @details * -* Function : DuProcMacUeDeleteRsp +* Function : deleteUeCfg * -* Functionality: Handle UE delete response from MAC +* Functionality: delete UE Configuration of a particular UE * -* @params[in] Pointer to MacUeDeleteRsp and Pst +* @params[in] uint16_t cellIdx, uint8_t ueIdx * @return ROK - success * RFAILED - failure * * ****************************************************************/ - -uint8_t DuProcMacUeDeleteRsp(Pst *pst, MacUeDeleteRsp *deleteRsp) +uint8_t deleteUeCfg(uint16_t cellIdx, uint8_t ueIdx) { - uint16_t cellIdx=0; - if(deleteRsp) + DuUeCb *ueCb = NULLP; + if(duCb.actvCellLst[cellIdx] != NULLP) { - if(deleteRsp->result == SUCCESS) + if((duCb.actvCellLst[cellIdx]->ueCb[ueIdx-1].macUeCfg.macUeCfgState == UE_DELETE_COMPLETE)\ + &&(duCb.actvCellLst[cellIdx]->ueCb[ueIdx-1].rlcUeCfg.rlcUeCfgState == UE_DELETE_COMPLETE)) { - DU_LOG("\nINFO --> DU APP : MAC UE Delete Response : SUCCESS [UE IDX : %d]", deleteRsp->ueIdx); - GET_CELL_IDX(deleteRsp->cellId, cellIdx); - if(duCb.actvCellLst[cellIdx]) + ueCb = &duCb.actvCellLst[cellIdx]->ueCb[ueIdx-1]; + deleteMacUeCfg(&ueCb->macUeCfg); + deleteRlcUeCfg(&ueCb->rlcUeCfg); + if(ueCb->f1UeDb !=NULLP) { - deleteMacUeCfg(&duCb.actvCellLst[cellIdx]->ueCb[deleteRsp->ueIdx -1].macUeCfg); + freeF1UeDb(ueCb->f1UeDb); } + duCb.actvCellLst[cellIdx]->numActvUes--; + memset(ueCb, 0, sizeof(DuUeCb)); } else { - DU_LOG("\nERROR --> DU APP : DuProcMacUeDeleteRsp(): MAC UE Delete Response : FAILURE [UE IDX : %d]",\ - deleteRsp->ueIdx); + DU_LOG("INFO --> DU APP : deleteUeCfg(): MAC or RLC UE configuration state not UE_DELETE_COMPLETE"); return 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"); + DU_LOG("ERROR --> DU APP : deleteUeCfg(): CellIdx[%d] is not found", cellIdx); return RFAILED; } return ROK; } + /******************************************************************* * -* @brief delete RlcUeCfg from duCb +* @brief Handle UE delete response from MAC * * @details * -* Function : deleteDuRlcUeCfg +* Function : DuProcMacUeDeleteRsp * -* Functionality: -* delete RlcUeCfg from duCb +* Functionality: Handle UE delete response from MAC * -* @params[in] Post structure -* Pointer to RlcUeCfg -* @return ROK - success -* RFAILED - failure +* @params[in] Pointer to MacUeDeleteRsp and Pst +* @return ROK - success +* RFAILED - failure * -*****************************************************************/ +* ****************************************************************/ -void deleteDuRlcUeCfg(RlcUeCfg *ueCfg) +uint8_t DuProcMacUeDeleteRsp(Pst *pst, MacUeDeleteRsp *deleteRsp) { - uint8_t lcIdx = 0; - RlcBearerCfg *lcCfg= NULLP; - if(ueCfg) + uint8_t ueIdx = 0,ret =ROK; + uint16_t cellIdx=0; + uint32_t gnbCuUeF1apId=0, gnbDuUeF1apId =0; + + if(deleteRsp) { - for(lcIdx =0 ; lcIdx < ueCfg->numLcs ; lcIdx++) + if(deleteRsp->result == SUCCESS) { - lcCfg = &ueCfg->rlcLcCfg[lcIdx]; - switch(lcCfg->rlcMode) + 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]) { - case RLC_AM : - { - DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL, lcCfg->u.amCfg, sizeof(AmBearerCfg)); - break; - } - case RLC_UM_BI_DIRECTIONAL : + 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) { - 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; + ret = BuildAndSendUeContextReleaseComplete(gnbCuUeF1apId, gnbDuUeF1apId); + if(ret !=ROK) + { + DU_LOG("\nERROR --> DU APP : DuProcMacUeDeleteRsp(): failed to send UE context release complete"); + } } } } - memset(ueCfg, 0, sizeof(RlcUeCfg)); + else + { + DU_LOG("\nERROR --> DU APP : DuProcMacUeDeleteRsp(): MAC UE Delete Response : FAILURE [UE IDX : %d]",\ + deleteRsp->ueIdx); + 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"); + ret = RFAILED; + } + return ret; } /******************************************************************* -* -* @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 -* -*****************************************************************/ + * + * @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; + 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) { - deleteDuRlcUeCfg(&duCb.actvCellLst[cellIdx]->ueCb[ueIdx-1].rlcUeCfg); + 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 @@ -2920,8 +2944,8 @@ uint8_t DuProcRlcUeDeleteRsp(Pst *pst, RlcUeDeleteRsp *delRsp) } /******************************************************************* -* -* @brief Sending UE Delete Req To Mac + * + * @brief Sending UE Delete Req To Mac * * @details * @@ -3029,40 +3053,283 @@ uint8_t sendUeDeleteReqToRlc(uint16_t cellId, uint8_t ueIdx) * * ****************************************************************/ -uint8_t duProcUeDeleteReq(uint16_t cellId, uint16_t crnti) +uint8_t duProcUeDeleteReq(uint16_t cellId) { - uint16_t cellIdx = 0; - uint8_t ueIdx = 0; + 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(sendUeDeleteReqToRlc(cellId, ueIdx) == 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; } - if(sendUeDeleteReqToMac(cellId, ueIdx, crnti) == 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; }