X-Git-Url: https://gerrit.o-ran-sc.org/r/gitweb?a=blobdiff_plain;f=src%2F5gnrsch%2Fsch_ue_mgr.c;h=a3a0c55298ac39696adcecd13474bc57b8f001e2;hb=47233d9133bc657fcb47df4a9d6a447a841a0967;hp=097e0808cde91d645c96af998acf178f5b245850;hpb=f0f283a72b3bdf0740cb49071a2f025159f0bf15;p=o-du%2Fl2.git diff --git a/src/5gnrsch/sch_ue_mgr.c b/src/5gnrsch/sch_ue_mgr.c index 097e0808c..a3a0c5529 100644 --- a/src/5gnrsch/sch_ue_mgr.c +++ b/src/5gnrsch/sch_ue_mgr.c @@ -37,7 +37,19 @@ SchUeCfgRspFunc SchUeCfgRspOpts[] = packSchUeCfgRsp /* LWLC */ }; +SchUeDeleteRspFunc SchUeDeleteRspOpts[] = +{ + packSchUeDeleteRsp, /* LC */ + MacProcSchUeDeleteRsp, /* TC */ + packSchUeDeleteRsp /* LWLC */ +}; +SchCellDeleteRspFunc SchCellDeleteRspOpts[]= +{ + packSchCellDeleteRsp, /* LC */ + MacProcSchCellDeleteRsp, /* TC */ + packSchCellDeleteRsp /* LWLC */ +}; /******************************************************************* * * @brief Fill and send UE cfg response to MAC @@ -616,6 +628,385 @@ uint8_t MacSchModUeConfigReq(Pst *pst, SchUeCfg *ueCfg) return ret; } +/******************************************************************* +* +* @brief Fill and send UE delete response to MAC +* +* @details +* +* Function : SchSendUeDeleteRspToMac +* +* Functionality: Fill and send UE delete response to MAC +* +* @params[in] Inst inst, SchUeDelete *ueDelete, SchMacRsp result, +* ErrorCause cause +* @return ROK - success +* RFAILED - failure +* +* ****************************************************************/ +void SchSendUeDeleteRspToMac(Inst inst, SchUeDelete *ueDelete, SchMacRsp result, ErrorCause cause) +{ + Pst rspPst; + SchUeDeleteRsp delRsp; + + memset(&delRsp, 0, sizeof(SchUeDeleteRsp)); + delRsp.cellId = ueDelete->cellId; + delRsp.crnti = ueDelete->crnti; + delRsp.rsp = result; + delRsp.cause = cause; + + /* Filling response post */ + memset(&rspPst, 0, sizeof(Pst)); + FILL_PST_SCH_TO_MAC(rspPst, inst); + rspPst.event = EVENT_UE_DELETE_RSP_TO_MAC; + SchUeDeleteRspOpts[rspPst.selector](&rspPst, &delRsp); +} + +/******************************************************************* +* +* @brief Function to delete Sch Pucch ResrcCfg +* +* @details +* +* Function : deleteSchPucchResrcCfg +* +* Functionality: Function to delete Sch Pucch ResrcCfg +* +* @params[in] SchPucchResrcCfg *resrc +* @return void +* +* ****************************************************************/ + +void deleteSchPucchResrcCfg(SchPucchResrcCfg *resrc) +{ + uint8_t rsrcIdx=0; + for(rsrcIdx=0; rsrcIdx < resrc->resrcToAddModListCount; rsrcIdx++) + { + switch(resrc->resrcToAddModList[rsrcIdx].pucchFormat) + { + case PUCCH_FORMAT_0: + { + SCH_FREE(resrc->resrcToAddModList[rsrcIdx].SchPucchFormat.format0,\ + sizeof(SchPucchFormat0)); + break; + } + case PUCCH_FORMAT_1: + { + SCH_FREE(resrc->resrcToAddModList[rsrcIdx].SchPucchFormat.format1,\ + sizeof(SchPucchFormat1)); + break; + } + case PUCCH_FORMAT_2: + { + SCH_FREE(resrc->resrcToAddModList[rsrcIdx].SchPucchFormat.format2,\ + sizeof(SchPucchFormat2_3)); + break; + } + case PUCCH_FORMAT_3: + { + SCH_FREE(resrc->resrcToAddModList[rsrcIdx].SchPucchFormat.format3,\ + sizeof(SchPucchFormat2_3)); + break; + } + case PUCCH_FORMAT_4: + { + SCH_FREE(resrc->resrcToAddModList[rsrcIdx].SchPucchFormat.format4,\ + sizeof(SchPucchFormat4)); + break; + } + } + } +} + +/******************************************************************* +* +* @brief Function to delete SCH Pdsch ServCellCfg +* +* @details +* +* Function : deleteSchPdschServCellCfg +* +* Functionality: Function to delete SCH Pdsch ServCellCfg +* +* @params[in] SchPdschServCellCfg *pdschServCellCfg +* @return void +* +* ****************************************************************/ + +void deleteSchPdschServCellCfg(SchPdschServCellCfg *pdschServCellCfg) +{ + SCH_FREE(pdschServCellCfg->maxMimoLayers, sizeof(uint8_t)); + SCH_FREE(pdschServCellCfg->maxCodeBlkGrpPerTb, sizeof(SchMaxCodeBlkGrpPerTB)); + SCH_FREE(pdschServCellCfg->codeBlkGrpFlushInd, sizeof(bool)); + SCH_FREE(pdschServCellCfg->xOverhead, sizeof(SchPdschXOverhead)); +} + +/******************************************************************* +* +* @brief Function to delete SCH UeCb +* +* @details +* +* Function : deleteSchUeCb +* +* Functionality: Function to delete SCH UeCb +* +* @params[in] +* @return ROK - success +* RFAILED - failure +* +* ****************************************************************/ +void deleteSchUeCb(SchUeCb *ueCb) +{ + SchPucchCfg *pucchCfg = NULLP; + if(ueCb) + { + SCH_FREE(ueCb->ueCfg.ambrCfg, sizeof(SchAmbrCfg)); + if(ueCb->ueCfg.spCellCfgPres) + { + if(ueCb->ueCfg.spCellCfg.servCellCfg.initUlBwp.pucchCfgPres == true) + { + pucchCfg = &ueCb->ueCfg.spCellCfg.servCellCfg.initUlBwp.pucchCfg; + SCH_FREE(pucchCfg->resrcSet,sizeof(SchPucchResrcSetCfg)); + if(pucchCfg->resrc) + { + deleteSchPucchResrcCfg(pucchCfg->resrc); + SCH_FREE(pucchCfg->resrc, sizeof(SchPucchResrcCfg)); + } + SCH_FREE(pucchCfg->format1, sizeof(SchPucchFormatCfg)); + SCH_FREE(pucchCfg->format2, sizeof(SchPucchFormatCfg)); + SCH_FREE(pucchCfg->format3, sizeof(SchPucchFormatCfg)); + SCH_FREE(pucchCfg->format4, sizeof(SchPucchFormatCfg)); + SCH_FREE(pucchCfg->schedReq, sizeof(SchPucchSchedReqCfg)); + SCH_FREE(pucchCfg->multiCsiCfg, sizeof(SchPucchMultiCsiCfg)); + SCH_FREE(pucchCfg->spatialInfo, sizeof(SchPucchSpatialCfg)); + SCH_FREE(pucchCfg->dlDataToUlAck, sizeof(SchPucchDlDataToUlAck)); + SCH_FREE(pucchCfg->powerControl,sizeof(SchPucchPowerControl)); + } + SCH_FREE(ueCb->ueCfg.spCellCfg.servCellCfg.bwpInactivityTmr, sizeof(uint8_t)); + deleteSchPdschServCellCfg(&ueCb->ueCfg.spCellCfg.servCellCfg.pdschServCellCfg); + } + memset(ueCb, 0, sizeof(SchUeCb)); + } +} + +/******************************************************************* +* +* @brief Function for Ue Delete request from MAC to SCH +* +* @details +* +* Function : MacSchUeDeleteReq +* +* Functionality: Function for Ue Delete request from MAC to SCH +* +* @params[in] Pst *pst, SchUeDelete *ueDelete +* @return ROK - success +* RFAILED - failure +* +* ****************************************************************/ +uint8_t MacSchUeDeleteReq(Pst *pst, SchUeDelete *ueDelete) +{ + uint8_t idx=0, ueIdx=0, ret=ROK; + ErrorCause result; + SchCellCb *cellCb = NULLP; + Inst inst = pst->dstInst - 1; + + if(!ueDelete) + { + DU_LOG("\nERROR --> SCH : MacSchUeDeleteReq(): Ue Delete request failed"); + ret = RFAILED; + } + DU_LOG("\nDEBUG --> SCH : Ue Delete request received for crnti[%d]", ueDelete->crnti); + + cellCb = schCb[inst].cells[idx]; + + if(cellCb->cellId != ueDelete->cellId) + { + DU_LOG("\nERROR --> SCH : MacSchUeDeleteReq(): cell Id is not available"); + result = INVALID_CELLID; + } + else + { + GET_UE_IDX(ueDelete->crnti, ueIdx); + if(( cellCb->ueCb[ueIdx-1].crnti == ueDelete->crnti) && ( cellCb->ueCb[ueIdx-1].state == SCH_UE_STATE_ACTIVE)) + { + deleteSchUeCb(&cellCb->ueCb[ueIdx-1]); + cellCb->numActvUe--; + result = NOT_APPLICABLE; + } + else + { + DU_LOG("\nERROR --> SCH : MacSchUeDeleteReq(): SchUeCb not found"); + result = INVALID_UEIDX; + } + } + + if(result == NOT_APPLICABLE) + { + SchSendUeDeleteRspToMac(inst, ueDelete, RSP_OK, result); + } + else + { + SchSendUeDeleteRspToMac(inst, ueDelete, RSP_NOK, result); + ret = RFAILED; + } + return ret; +} + +/******************************************************************* + * + * @brief Fill and send Cell delete response to MAC + * + * @details + * + * Function : SchSendCellDeleteRspToMac + * + * Functionality: Fill and send Cell delete response to MAC + * + * @params[in] SchCellDelete *ueDelete, Inst inst, SchMacRsp result + * @return ROK - success + * RFAILED - failure + * + * ****************************************************************/ +uint8_t SchSendCellDeleteRspToMac(SchCellDelete *ueDelete, Inst inst, SchMacRsp result) +{ + Pst rspPst; + uint8_t ret=0; + + SchCellDeleteRsp delRsp; + + DU_LOG("\nINFO --> SCH : Filling Cell Delete response"); + memset(&delRsp, 0, sizeof(SchCellDeleteRsp)); + delRsp.cellId = ueDelete->cellId; + delRsp.rsp = result; + + /* Filling response post */ + memset(&rspPst, 0, sizeof(Pst)); + FILL_PST_SCH_TO_MAC(rspPst, inst); + rspPst.event = EVENT_CELL_DELETE_RSP_TO_MAC; + ret = SchCellDeleteRspOpts[rspPst.selector](&rspPst, &delRsp); + if(ret == RFAILED) + { + DU_LOG("\nERROR --> SCH : SchSendCellDeleteRspToMac(): failed to send the Cell Delete response"); + return ret; + } + return ret; +} + +/******************************************************************* + * + * @brief Function for cellCb Deletion + * + * @details + * + * Function : deleteSchCellCb + * + * Functionality: Function for cellCb Deletion + * + * @params[in] SchCellDelete *cellDelete + * @return ROK - success + * RFAILED - failure + * + * ****************************************************************/ +void deleteSchCellCb(SchCellCb *cellCb) +{ + uint8_t idx=0; + if(cellCb->schDlSlotInfo) + { + for(idx=0; idxnumSlots; idx++) + { + if(cellCb->schDlSlotInfo[idx]) + { + SCH_FREE(cellCb->schDlSlotInfo[idx]->rarInfo, sizeof(RarInfo)); + if(cellCb->schDlSlotInfo[idx]->dlMsgInfo) + { + SCH_FREE(cellCb->schDlSlotInfo[idx]->dlMsgInfo->dlMsgPdu,\ + cellCb->schDlSlotInfo[idx]->dlMsgInfo->dlMsgPduLen); + SCH_FREE(cellCb->schDlSlotInfo[idx]->dlMsgInfo, sizeof(DlMsgInfo)); + } + SCH_FREE(cellCb->schDlSlotInfo[idx], sizeof(SchDlSlotInfo)); + } + } + SCH_FREE(cellCb->schDlSlotInfo, sizeof(SchDlSlotInfo)); + } + if(cellCb->schUlSlotInfo) + { + for(idx=0; idxnumSlots; idx++) + { + if(cellCb->schUlSlotInfo[idx]) + { + SCH_FREE(cellCb->schUlSlotInfo[idx]->schPuschInfo,sizeof(SchPuschInfo)); + SCH_FREE(cellCb->schUlSlotInfo[idx], sizeof(SchUlSlotInfo)); + } + } + SCH_FREE(cellCb->schUlSlotInfo, sizeof(SchUlSlotInfo)); + } + SCH_FREE(cellCb->cellCfg.sib1SchCfg.sib1PdcchCfg.dci.pdschCfg, sizeof(PdschCfg)); + memset(cellCb, 0, sizeof(SchCellCb)); +} + +/******************************************************************* + * + * @brief Function for cell Delete request from MAC to SCH + * + * @details + * + * Function : MacSchCellDeleteReq + * + * Functionality: Function for cell Delete request from MAC to SCH + * + * @params[in] Pst *pst, SchCellDelete *cellDelete + * @return ROK - success + * RFAILED - failure + * + * ****************************************************************/ + +uint8_t MacSchCellDeleteReq(Pst *pst, SchCellDelete *cellDelete) +{ + uint8_t cellIdx=0, ret = RFAILED; + Inst inst = pst->dstInst - 1; + SchMacRsp result= RSP_OK; + + if(!cellDelete) + { + DU_LOG("\nERROR --> SCH : MacSchCellDeleteReq(): Ue Delete request failed"); + } + else + { + GET_CELL_IDX(cellDelete->cellId, cellIdx); + if(schCb[inst].cells[cellIdx] == NULLP) + { + DU_LOG("\nERROR --> SCH : MacSchCellDeleteReq(): cell Id[%d] is not available", cellDelete->cellId); + result = RSP_NOK; + } + else + { + if(schCb[inst].cells[cellIdx]->cellId == cellDelete->cellId) + { + deleteSchCellCb(schCb[inst].cells[cellIdx]); + result = RSP_OK; + ret = ROK; + SCH_FREE(schCb[inst].cells[cellIdx], sizeof(SchCellCb)); + DU_LOG("\nINFO --> SCH : Sending Cell Delete response to MAC"); + } + else + { + DU_LOG("\nERROR --> SCH : MacSchCellDeleteReq(): cell Id[%d] is not available",cellDelete->cellId); + result = RSP_NOK; + } + } + + if(SchSendCellDeleteRspToMac(cellDelete, inst, result)!=ROK) + { + DU_LOG("\nERROR --> SCH : MacSchCellDeleteReq(): failed to send Cell Delete response"); + ret = RFAILED; + } + + } + return ret; +} + /********************************************************************** End of file **********************************************************************/