X-Git-Url: https://gerrit.o-ran-sc.org/r/gitweb?a=blobdiff_plain;f=src%2F5gnrmac%2Fmac_ue_mgr.c;h=8262eeef993fcd060a3f7a699a1ce7e2f1272937;hb=5007af25423493fbc002e30d847aa05d44bc180e;hp=7ede4a5de2210d2a1047c813ac83a2b19ac7b02c;hpb=f0f283a72b3bdf0740cb49071a2f025159f0bf15;p=o-du%2Fl2.git diff --git a/src/5gnrmac/mac_ue_mgr.c b/src/5gnrmac/mac_ue_mgr.c index 7ede4a5de..8262eeef9 100644 --- a/src/5gnrmac/mac_ue_mgr.c +++ b/src/5gnrmac/mac_ue_mgr.c @@ -50,6 +50,34 @@ MacSchModUeConfigReqFunc macSchModUeConfigReqOpts[] = packMacSchModUeConfigReq /* packing for light weight loosely coupled */ }; +MacSchUeDeleteReqFunc macSchUeDeleteReqOpts[] = +{ + packMacSchUeDeleteReq, /* packing for loosely coupled */ + MacSchUeDeleteReq, /* packing for tightly coupled */ + packMacSchUeDeleteReq /* packing for light weight loosely coupled */ +}; + +MacDuUeDeleteRspFunc macDuUeDeleteRspOpts[] = +{ + packDuMacUeDeleteRsp, /* packing for loosely coupled */ + DuProcMacUeDeleteRsp, /* packing for tightly coupled */ + packDuMacUeDeleteRsp /* packing for light weight loosly coupled */ +}; + +MacSchCellDeleteReqFunc macSchCellDeleteReqOpts[]= +{ + packMacSchCellDeleteReq, /* packing for loosely coupled */ + MacSchCellDeleteReq, /* packing for tightly coupled */ + packMacSchCellDeleteReq /* packing for light weight loosely coupled */ +}; + +MacDuCellDeleteRspFunc macDuCellDeleteRspOpts[] = +{ + packDuMacCellDeleteRsp, /* packing for loosely coupled */ + DuProcMacCellDeleteRsp, /* packing for tightly coupled */ + packDuMacCellDeleteRsp /* packing for light weight loosly coupled */ +}; + /******************************************************************* * * @brief Fills mac cell group config to be sent to scheduler @@ -2403,6 +2431,611 @@ uint8_t MacProcUeReconfigReq(Pst *pst, MacUeCfg *ueCfg) return ROK; } +/******************************************************************* +* +* @brief Fill and Send UE Delete response from MAC to DU APP +* +* @details +* +* Function : MacSendUeDeleteRsp +* +* Functionality: Fill and Send UE Delete response from MAC to DUAPP +* +* @params[in] MAC UE delete result +* SCH UE delete response +* @return ROK - success +* RFAILED - failure +* +* ****************************************************************/ + +uint8_t MacSendUeDeleteRsp(uint16_t cellId, uint16_t crnti, UeDeleteStatus result) +{ + MacUeDeleteRsp *deleteRsp; + Pst rspPst; + + MAC_ALLOC_SHRABL_BUF(deleteRsp, sizeof(MacUeDeleteRsp)); + if(!deleteRsp) + { + DU_LOG("\nERROR --> MAC : Memory allocation for UE delete response failed"); + return RFAILED; + } + + /* Filling UE delete response */ + deleteRsp->cellId = cellId; + GET_UE_IDX(crnti,deleteRsp->ueIdx); + deleteRsp->result = result; + + /* Fill Post structure and send UE delete response*/ + memset(&rspPst, 0, sizeof(Pst)); + FILL_PST_MAC_TO_DUAPP(rspPst, EVENT_MAC_UE_DELETE_RSP); + return (*macDuUeDeleteRspOpts[rspPst.selector])(&rspPst, deleteRsp); +} + +/******************************************************************* +* +* @brief freeing the Pucch Resrc Cfg +* +* @details +* +* Function : deletePucchResourcesCfg +* +* Functionality: freeing the Pucch Resrc Cfg +* +* @params[in] PucchResrcCfg *resrcCfg +* @return ROK - success +* RFAILED - failure +* +* ****************************************************************/ + +void deletePucchResourcesCfg(PucchResrcCfg *resrcCfg) +{ + uint8_t resrcIdx; + for(resrcIdx =0; resrcIdx< resrcCfg->resrcToAddModListCount;resrcIdx++) + { + switch(resrcCfg->resrcToAddModList[resrcIdx].pucchFormat) + { + case PUCCH_FORMAT_0: + { + MAC_FREE(resrcCfg->resrcToAddModList[resrcIdx].PucchFormat.format0, sizeof(PucchFormat0)); + break; + } + case PUCCH_FORMAT_1: + { + MAC_FREE(resrcCfg->resrcToAddModList[resrcIdx].PucchFormat.format1, sizeof(PucchFormat1)); + break; + } + case PUCCH_FORMAT_2: + { + MAC_FREE(resrcCfg->resrcToAddModList[resrcIdx].PucchFormat.format2, sizeof(PucchFormat2_3)); + break; + } + case PUCCH_FORMAT_3: + { + MAC_FREE(resrcCfg->resrcToAddModList[resrcIdx].PucchFormat.format3, sizeof(PucchFormat2_3)); + break; + } + case PUCCH_FORMAT_4: + { + MAC_FREE(resrcCfg->resrcToAddModList[resrcIdx].PucchFormat.format4, sizeof(PucchFormat4)); + break; + } + } + } + +} + +/******************************************************************* +* +* @brief Function to delete MAC Pdsch ServCellCfg +* +* @details +* +* Function : deleteMacPdschServCellCfg +* +* Functionality: Function to delete MAC Pdsch ServCellCfg +* +* @params[in] PdschServCellCfg *pdschServCellCfg +* @return void +* +* ****************************************************************/ + +void deleteMacPdschServCellCfg(PdschServCellCfg *pdschServCellCfg) +{ + MAC_FREE(pdschServCellCfg->maxMimoLayers, sizeof(uint8_t)); + MAC_FREE(pdschServCellCfg->maxCodeBlkGrpPerTb, sizeof(MaxCodeBlkGrpPerTB)); + MAC_FREE(pdschServCellCfg->codeBlkGrpFlushInd, sizeof(bool)); + MAC_FREE(pdschServCellCfg->xOverhead, sizeof(PdschXOverhead)); +} + +/******************************************************************* +* +* @brief Handles UE Delete requst from DU APP +* +* @details +* +* Function : deleteMacUeCb +* +* Functionality: Handles UE Delete requst from DU APP +* +* @params[in] MacCellCb *cellCb,uint16_t ueIdx +* @return ROK - success +* RFAILED - failure +* +* ****************************************************************/ + +void deleteMacUeCb(MacUeCb *ueCb) +{ + MacUeCfg *ueCfg = NULLP; + ServCellCfgInfo *servCellCfg; + + if(ueCb->cellCb) + { + MAC_FREE(ueCb->cellCb->macRaCb[ueCb->ueIdx-1].msg4Pdu, ueCb->cellCb->macRaCb[ueCb->ueIdx-1].msg4PduLen); + MAC_FREE(ueCb->cellCb->macRaCb[ueCb->ueIdx-1].msg4TxPdu, ueCb->cellCb->macRaCb[ueCb->ueIdx-1].msg4TbSize); + + if(ueCb->cellCb->ueCfgTmpData[ueCb->ueIdx-1]) + { + ueCfg =ueCb->cellCb->ueCfgTmpData[ueCb->ueIdx-1]; + MAC_FREE(ueCfg->ambrCfg, sizeof(AmbrCfg)); + if(ueCfg->spCellCfgPres) + { + servCellCfg = &ueCfg->spCellCfg.servCellCfg; + MAC_FREE(servCellCfg->bwpInactivityTmr, sizeof(uint8_t)); + + if(servCellCfg->initUlBwp.pucchPresent) + { + MAC_FREE(servCellCfg->initUlBwp.pucchCfg.resrcSet, sizeof(PucchResrcSetCfg)); + + if(servCellCfg->initUlBwp.pucchCfg.resrc) + { + deletePucchResourcesCfg(servCellCfg->initUlBwp.pucchCfg.resrc); + MAC_FREE(servCellCfg->initUlBwp.pucchCfg.resrc, sizeof(PucchResrcCfg)); + } + MAC_FREE(servCellCfg->initUlBwp.pucchCfg.format1, sizeof(PucchFormatCfg)); + MAC_FREE(servCellCfg->initUlBwp.pucchCfg.format2, sizeof(PucchFormatCfg)); + MAC_FREE(servCellCfg->initUlBwp.pucchCfg.format3, sizeof(PucchFormatCfg)); + MAC_FREE(servCellCfg->initUlBwp.pucchCfg.format4, sizeof(PucchFormatCfg)); + MAC_FREE(servCellCfg->initUlBwp.pucchCfg.schedReq, sizeof(PucchSchedReqCfg)); + MAC_FREE(servCellCfg->initUlBwp.pucchCfg.multiCsiCfg, sizeof(PucchMultiCsiCfg)); + MAC_FREE(servCellCfg->initUlBwp.pucchCfg.spatialInfo, sizeof(PucchSpatialCfg)); + MAC_FREE(servCellCfg->initUlBwp.pucchCfg.dlDataToUlAck , sizeof(PucchDlDataToUlAck)); + MAC_FREE(servCellCfg->initUlBwp.pucchCfg.powerControl, sizeof(PucchPowerControl)); + deleteMacPdschServCellCfg(&servCellCfg->pdschServCellCfg); + } + } + for(uint8_t idx=0 ;idx < ueCfg->numLcs; idx++) + { + MAC_FREE(ueCfg->lcCfgList[idx].drbQos, sizeof(DrbQosInfo)); + MAC_FREE(ueCfg->lcCfgList[idx].snssai, sizeof(Snssai)); + } + MAC_FREE(ueCb->cellCb->ueCfgTmpData[ueCb->ueIdx-1],sizeof(MacUeCfg)); + } + } + memset(ueCb, 0, sizeof(MacUeCb)); +} + +/******************************************************************* +* +* @brief Processes UE delete response from scheduler +* +* @details +* +* Function : MacProcSchUeCfgRsp +* +* Functionality: +* Processes UE create delete from scheduler +* +* @params[in] Pst : Post structure +* schUeDelRsp : Scheduler UE delete respons +* @return ROK - success +* RFAILED - failure +* +* ****************************************************************/ + +uint8_t MacProcSchUeDeleteRsp(Pst *pst, SchUeDeleteRsp *schUeDelRsp) +{ + uint8_t ueIdx =0; + uint16_t cellIdx=0; + uint8_t ret = RFAILED; + UeDeleteStatus result; + + if(schUeDelRsp) + { + if(schUeDelRsp->rsp == RSP_OK) + { + DU_LOG("\nINFO --> MAC : SCH UE Delete response for CRNTI[%d] is successful", schUeDelRsp->crnti); + GET_CELL_IDX(schUeDelRsp->cellId, cellIdx); + if(macCb.macCell[cellIdx]) + { + GET_UE_IDX(schUeDelRsp->crnti, ueIdx); + if(macCb.macCell[cellIdx]->ueCb[ueIdx -1].crnti == schUeDelRsp->crnti) + { + deleteMacUeCb(&macCb.macCell[cellIdx]->ueCb[ueIdx -1]); + macCb.macCell[cellIdx]->numActvUe--; + result = SUCCESS; + ret = ROK; + } + else + { + DU_LOG("\nERROR --> MAC : MacProcSchUeDeleteRsp(): crnti[%d] does not exist ",schUeDelRsp->crnti); + result = UEIDX_INVALID; + } + } + else + { + DU_LOG("\nERROR --> MAC : MacProcSchUeDeleteRsp(): cellId[%d] does not exist ",schUeDelRsp->cellId); + result = CELLID_INVALID; + } + } + else + { + result = (schUeDelRsp->cause == INVALID_CELLID) ? CELLID_INVALID : UEIDX_INVALID; + } + if(MacSendUeDeleteRsp(schUeDelRsp->cellId, schUeDelRsp->crnti, result) != ROK) + { + DU_LOG("\nERROR --> MAC: MacProcSchUeDeleteRsp(): Failed to send UE delete response"); + } + } + else + { + DU_LOG("\nERROR --> MAC: MacProcSchUeDeleteRsp(): Failed to receive UE delete response by SCH"); + ret = RFAILED; + } + return ret; +} + +/******************************************************************* +* +* @brief Sends UE delete req to Scheduler +* +* @details +* +* Function : sendUeDelReqToSch +* +* Functionality: sends UE delete req to Scheduler +* +* @params[in] Pst *pst, MacUeDelete *ueDelete +* @return ROK - success +* RFAILED - failure +* +* ****************************************************************/ + +uint8_t sendUeDelReqToSch(Pst *pst, MacUeDelete *ueDelete) +{ + if(ueDelete != NULLP) + { + Pst schPst; + SchUeDelete schUeDel; + + memset(&schUeDel, 0, sizeof(SchUeDelete)); + schUeDel.cellId = ueDelete->cellId; + schUeDel.crnti = ueDelete->crnti; + MAC_FREE_SHRABL_BUF(pst->region, pst->pool, ueDelete, sizeof(MacUeDelete)); + FILL_PST_MAC_TO_SCH(schPst, EVENT_UE_DELETE_REQ_TO_SCH); + return(*macSchUeDeleteReqOpts[schPst.selector])(&schPst, &schUeDel); + } + else + { + DU_LOG("\nERROR --> SCH: sendUeDelReqToSch():MAC Ue Delete is NULL"); + return RFAILED; + } + return ROK; +} + +/******************************************************************* + * + * @brief Handles UE Delete requst from DU APP + * + * @details + * + * Function : MacProcUeDeleteReq + * + * Functionality: Handles UE Delete requst from DU APP + * + * @params[in] Pst *pst, MacUeDelete *ueDelete + * @return ROK - success + * RFAILED - failure + * + * ****************************************************************/ + +uint8_t MacProcUeDeleteReq(Pst *pst, MacUeDelete *ueDelete) +{ + uint8_t ret = ROK; + uint8_t cellIdx=0; + UeDeleteStatus result=SUCCESS; + MacUeCb *ueCb = NULLP; + MacCellCb *cellCb = NULLP; + + DU_LOG("\nINFO --> MAC : UE Delete Request received for ueIdx[%d]", ueDelete->ueIdx); + + if(ueDelete) + { + GET_CELL_IDX(ueDelete->cellId, cellIdx); + cellCb = macCb.macCell[cellIdx]; + if(cellCb) + { + ueCb = &cellCb->ueCb[ueDelete->ueIdx-1]; + if(ueCb->crnti == ueDelete->crnti) + { + ret = sendUeDelReqToSch(pst, ueDelete); + if(ret != ROK) + { + DU_LOG("\nERROR --> MAC : MacProcUeDeleteReq(): Failed to send UE Delete Request to SCH"); + ret = RFAILED; + } + } + else + { + DU_LOG("\nERROR --> MAC : MacProcUeDeleteReq(): CRNTI is not matched"); + result = UEIDX_INVALID; + } + } + else + { + DU_LOG("\nERROR --> MAC : MacProcUeDeleteReq(): Failed to find the MacUeCb of UeIdx = %d",ueDelete->ueIdx); + result = CELLID_INVALID; + } + + if(result != SUCCESS) + { + MacSendUeDeleteRsp(ueDelete->cellId, ueDelete->crnti, result); + MAC_FREE_SHRABL_BUF(pst->region, pst->pool, ueDelete, sizeof(MacUeDelete)); + ret = RFAILED; + } + } + else + { + DU_LOG("\nERROR --> MAC : MacProcUeDeleteReq(): MAC UE delete request processing failed"); + ret = RFAILED; + } + return ret; +} + +/******************************************************************* + * + * @brief Fill and Send Cell Delete response from MAC to DU APP + * + * @details + * + * Function : MacSendCellDeleteRsp + * + * Functionality: Fill and Send Cell Delete response from MAC to DUAPP + * + * @params[in] MAC Cell delete result + * SCH Cell delete response + * @return ROK - success + * RFAILED - failure + * + * ****************************************************************/ +uint8_t MacSendCellDeleteRsp(CellDeleteStatus result, uint8_t cellId) +{ + MacCellDeleteRsp *deleteRsp=NULLP; + Pst rspPst; + + MAC_ALLOC_SHRABL_BUF(deleteRsp, sizeof(MacCellDeleteRsp)); + if(!deleteRsp) + { + DU_LOG("\nERROR --> MAC : MacSendCellDeleteRsp(): Memory allocation for Cell delete response failed"); + return RFAILED; + } + + /* Filling CELL delete response */ + deleteRsp->cellId = cellId; + deleteRsp->result = result; + + /* Fill Post structure and send CELL delete response*/ + memset(&rspPst, 0, sizeof(Pst)); + FILL_PST_MAC_TO_DUAPP(rspPst, EVENT_MAC_CELL_DELETE_RSP); + return (*macDuCellDeleteRspOpts[rspPst.selector])(&rspPst, deleteRsp); +} + +/******************************************************************* + * + * @brief delete MAC CellCb information + * + * @details + * + * Function : deleteMacCellCb + * + * Functionality: + * delete MAC CellCb information + * + * @params[in] MacCellCb * cellCb + * + * @return ROK - success + * RFAILED - failure + * + * ****************************************************************/ +void deleteMacCellCb(MacCellCb * cellCb) +{ + uint8_t idx; + for(idx=0; idxdlSlot[idx].dlInfo.rarAlloc, sizeof(RarAlloc)); + if(cellCb->dlSlot[idx].dlInfo.ulGrant) + { + MAC_FREE(cellCb->dlSlot[idx].dlInfo.ulGrant->dciInfo.pdschCfg, sizeof(PdschCfg)); + MAC_FREE(cellCb->dlSlot[idx].dlInfo.ulGrant, sizeof(DciInfo)); + } + if(cellCb->dlSlot[idx].dlInfo.dlMsgAlloc) + { + MAC_FREE(cellCb->dlSlot[idx].dlInfo.dlMsgAlloc->dlMsgInfo.dlMsgPdu,\ + cellCb->dlSlot[idx].dlInfo.dlMsgAlloc->dlMsgInfo.dlMsgPduLen); + MAC_FREE(cellCb->dlSlot[idx].dlInfo.dlMsgAlloc, sizeof(DlMsgAlloc)); + } + } + + memset(cellCb, 0, sizeof(MacCellCb)); +} + +/******************************************************************* + * + * @brief Processes CELL delete response from scheduler + * + * @details + * + * Function : MacProcSchCellDeleteRsp + * + * Functionality: + * Processes CELL delete from scheduler + * + * @params[in] Pst : Post structure + * schCellDelRsp : Scheduler CELL delete respons + * @return ROK - success + * RFAILED - failure + * + * * ****************************************************************/ +uint8_t MacProcSchCellDeleteRsp(Pst *pst, SchCellDeleteRsp *schCellDelRsp) +{ + uint8_t ret = ROK; + uint16_t cellIdx=0; + CellDeleteStatus status; + + if(schCellDelRsp) + { + if(schCellDelRsp->rsp == RSP_OK) + { + DU_LOG("\nINFO --> MAC : SCH CELL Delete response for cellId[%d] is successful ", \ + schCellDelRsp->cellId); + GET_CELL_IDX(schCellDelRsp->cellId, cellIdx); + if(macCb.macCell[cellIdx]) + { + if(macCb.macCell[cellIdx]->cellId == schCellDelRsp->cellId) + { + deleteMacCellCb(macCb.macCell[cellIdx]); + status = SUCCESSFUL_RSP; + MAC_FREE(macCb.macCell[cellIdx], sizeof(MacCellCb)); + } + else + { + DU_LOG("ERROR --> MAC : MacProcSchCellDeleteRsp(): CellId[%d] does not exists", schCellDelRsp->cellId); + status = CELL_ID_INVALID; + ret = RFAILED; + } + } + else + { + DU_LOG("ERROR --> MAC : MacProcSchCellDeleteRsp(): CellId[%d] does not exists", schCellDelRsp->cellId); + status = CELL_ID_INVALID; + ret = RFAILED; + } + } + else + { + DU_LOG("ERROR --> MAC : MacProcSchCellDeleteRsp(): CellId[%d] does not exists", schCellDelRsp->cellId); + status = CELL_ID_INVALID; + ret = RFAILED; + } + if(MacSendCellDeleteRsp(status, schCellDelRsp->cellId) != ROK) + { + DU_LOG("\nERROR --> MAC: MacProcSchCellDeleteRsp(): Failed to send CELL delete response"); + ret = RFAILED; + } + + } + else + { + DU_LOG("\nERROR --> MAC: MacProcSchCellDeleteRsp(): schCellDelRsp is NULL"); + ret = RFAILED; + } + return ret; +} + +/******************************************************************* + * + * @brief Sends Cell delete req to Scheduler + * + * @details + * + * Function : sendCellDelReqToSch + * + * Functionality: sends Cell delete req to Scheduler + * + * @params[in] SchCellDelete *schCellDel + * @return ROK - success + * RFAILED - failure + * + * ****************************************************************/ + +uint8_t sendCellDelReqToSch(SchCellDelete *schCellDel) +{ + Pst schPst; + FILL_PST_MAC_TO_SCH(schPst, EVENT_CELL_DELETE_REQ_TO_SCH); + return(*macSchCellDeleteReqOpts[schPst.selector])(&schPst, schCellDel); +} + +/******************************************************************* + * + * @brief Handles CELL Delete requst from DU APP + * + * @details + * + * Function : MacProcCellDeleteReq + * + * Functionality: Handles CELL Delete requst from DU APP + * + * @params[in] Pst *pst, MacCellDelete *cellDelete + * @return ROK - success + * RFAILED - failure + * + * + * ****************************************************************/ +uint8_t MacProcCellDeleteReq(Pst *pst, MacCellDelete *cellDelete) +{ + uint8_t ret = ROK, cellIdx=0; + SchCellDelete schCellDelete; + + DU_LOG("\nINFO --> MAC : Cell Delete Request received for cellId[%d]", cellDelete->cellId); + + if(cellDelete) + { + GET_CELL_IDX(cellDelete->cellId, cellIdx); + if(macCb.macCell[cellIdx]) + { + if(macCb.macCell[cellIdx]->cellId == cellDelete->cellId) + { + memset(&schCellDelete, 0, sizeof(SchCellDelete)); + schCellDelete.cellId = cellDelete->cellId; + ret = sendCellDelReqToSch(&schCellDelete); + if(ret != ROK) + { + DU_LOG("\nERROR --> MAC : MacProcCellDeleteReq(): Failed to send UE Delete Request to SCH"); + ret = RFAILED; + } + } + else + { + DU_LOG("\nERROR --> MAC : MacProcCellDeleteReq(): Failed to find the MacUeCb of CellId = %d",\ + cellDelete->cellId); + ret = RFAILED; + } + } + else + { + DU_LOG("\nERROR --> MAC : MacProcCellDeleteReq(): Failed to find the MacUeCb of CellId = %d",\ + cellDelete->cellId); + ret = RFAILED; + } + + if(ret == RFAILED) + { + DU_LOG("\nERROR --> MAC : MacProcCellDeleteReq(): Sending failure response to DU"); + if(MacSendCellDeleteRsp(CELL_ID_INVALID, cellDelete->cellId) != ROK) + { + DU_LOG("\nERROR --> MAC : MacProcCellDeleteReq(): failed to send cell delete rsp for cellID[%d]",\ + cellDelete->cellId); + } + + } + MAC_FREE_SHRABL_BUF(pst->region, pst->pool, cellDelete, sizeof(MacCellDelete)); + } + else + { + DU_LOG("\nERROR --> MAC : MacProcCellDeleteReq(): Received MacCellDelete is NULL"); + ret = RFAILED; + } + return ret; +} /********************************************************************** End of file