X-Git-Url: https://gerrit.o-ran-sc.org/r/gitweb?a=blobdiff_plain;f=src%2F5gnrsch%2Fsch_ue_mgr.c;h=f1de4f44c31636393c83a14f9ea1e4461ee865b8;hb=7f6d859aef2f454e8521a921000b37a4571f1e02;hp=7b4c4e4c9b9c074b718e9882843b85cd11a81b63;hpb=53088c437fc01fb772f221e228ba7475fb5131d5;p=o-du%2Fl2.git diff --git a/src/5gnrsch/sch_ue_mgr.c b/src/5gnrsch/sch_ue_mgr.c index 7b4c4e4c9..f1de4f44c 100644 --- a/src/5gnrsch/sch_ue_mgr.c +++ b/src/5gnrsch/sch_ue_mgr.c @@ -39,11 +39,17 @@ SchUeCfgRspFunc SchUeCfgRspOpts[] = SchUeDeleteRspFunc SchUeDeleteRspOpts[] = { - packSchUeDeleteRsp, /* LC */ - MacProcSchUeDeleteRsp, /* TC */ - packSchUeDeleteRsp /* LWLC */ + packSchUeDeleteRsp, /* LC */ + MacProcSchUeDeleteRsp, /* TC */ + packSchUeDeleteRsp /* LWLC */ }; +SchCellDeleteRspFunc SchCellDeleteRspOpts[]= +{ + packSchCellDeleteRsp, /* LC */ + MacProcSchCellDeleteRsp, /* TC */ + packSchCellDeleteRsp /* LWLC */ +}; /******************************************************************* * * @brief Fill and send UE cfg response to MAC @@ -108,6 +114,18 @@ void fillSchDlLcCtxt(SchDlLcCtxt *ueCbLcCfg, SchLcCfg *lcCfg) ueCbLcCfg->lcp = lcCfg->dlLcCfg.lcp; ueCbLcCfg->lcState = SCH_LC_STATE_ACTIVE; ueCbLcCfg->bo = 0; + if(lcCfg->drbQos) + { + ueCbLcCfg->pduSessionId = lcCfg->drbQos->pduSessionId; + } + if(lcCfg->snssai) + { + if(ueCbLcCfg->snssai == NULLP)/*In CONFIG_MOD case, no need to allocate SNSSAI memory*/ + { + SCH_ALLOC(ueCbLcCfg->snssai, sizeof(Snssai)); + } + memcpy(ueCbLcCfg->snssai, lcCfg->snssai,sizeof(Snssai)); + } } /******************************************************************* @@ -136,6 +154,19 @@ void fillSchUlLcCtxt(SchUlLcCtxt *ueCbLcCfg, SchLcCfg *lcCfg) ueCbLcCfg->pbr = lcCfg->ulLcCfg.pbr; ueCbLcCfg->bsd = lcCfg->ulLcCfg.bsd; + if(lcCfg->drbQos) + { + ueCbLcCfg->pduSessionId = lcCfg->drbQos->pduSessionId; + } + if(lcCfg->snssai) + { + /*In CONFIG_MOD case, no need to allocate SNSSAI memory again*/ + if(ueCbLcCfg->snssai == NULLP) + { + SCH_ALLOC(ueCbLcCfg->snssai, sizeof(Snssai)); + } + memcpy(ueCbLcCfg->snssai, lcCfg->snssai,sizeof(Snssai)); + } } /******************************************************************* @@ -161,6 +192,20 @@ void updateSchUlCb(uint8_t delIdx, SchUlCb *ulInfo) memcpy(&ulInfo->ulLcCtxt[lcIdx], &ulInfo->ulLcCtxt[lcIdx+1], sizeof(SchUlLcCtxt)); memset(&ulInfo->ulLcCtxt[lcIdx+1], 0, sizeof(SchUlLcCtxt)); } + /*Leakage of Last Index*/ + /*Last index of ulLcCtxt(before deletion) should be void*/ + if(ulInfo->ulLcCtxt[ulInfo->numUlLc].snssai != NULLP) + { + DU_LOG("ERROR --> SCH: updateSchUlCb Last index:%d (Before Deletion) memory is leaking",\ + ulInfo->numUlLc); + SCH_FREE(ulInfo->ulLcCtxt[ulInfo->numUlLc].snssai, sizeof(Snssai)); + } + else + { + DU_LOG("INFO --> SCH: updateSchUlCb Last index:%d (before deletion) memory is freed successfully",\ + ulInfo->numUlLc); + + } } /******************************************************************* @@ -186,6 +231,19 @@ void updateSchDlCb(uint8_t delIdx, SchDlCb *dlInfo) memcpy(&dlInfo->dlLcCtxt[lcIdx], &dlInfo->dlLcCtxt[lcIdx+1], sizeof(SchDlLcCtxt)); memset(&dlInfo->dlLcCtxt[lcIdx+1], 0, sizeof(SchDlLcCtxt)); } + /*Leakage of Last Index*/ + /*Last index of ulLcCtxt(before deletion) should be void*/ + if(dlInfo->dlLcCtxt[dlInfo->numDlLc].snssai != NULLP) + { + DU_LOG("ERROR --> SCH: updateSchDlCb Last index:%d (before deletion) memory is leaking: Delete the S-NSSAI memory",\ + dlInfo->numDlLc); + SCH_FREE(dlInfo->dlLcCtxt[dlInfo->numDlLc].snssai, sizeof(Snssai)); + } + else + { + DU_LOG("INFO --> SCH: updateSchDlCb Last index:%d (before deletion) memory is freed successfully",\ + dlInfo->numDlLc); + } } /******************************************************************* @@ -207,7 +265,9 @@ void updateSchDlCb(uint8_t delIdx, SchDlCb *dlInfo) uint8_t fillSchUeCb(SchUeCb *ueCb, SchUeCfg *ueCfg) { uint8_t lcIdx, ueLcIdx; - + SchPdschCfgCmn pdschCfg; + SchPucchDlDataToUlAck *dlDataToUlAck; + ueCb->ueCfg.cellId = ueCfg->cellId; ueCb->ueCfg.crnti = ueCfg->crnti; if(ueCfg->macCellGrpCfgPres == true) @@ -226,14 +286,27 @@ uint8_t fillSchUeCb(SchUeCb *ueCb, SchUeCfg *ueCfg) { memcpy(&ueCb->ueCfg.spCellCfg , &ueCfg->spCellCfg, sizeof(SchSpCellCfg)); ueCb->ueCfg.spCellCfgPres = true; + dlDataToUlAck = ueCfg->spCellCfg.servCellCfg.initUlBwp.pucchCfg.dlDataToUlAck; + if(ueCb->cellCb) + { + if(dlDataToUlAck) + { + BuildK0K1Table(ueCb->cellCb, &ueCb->ueCfg.spCellCfg.servCellCfg.initDlBwp.k0K1InfoTbl, false, pdschCfg,\ + ueCfg->spCellCfg.servCellCfg.initDlBwp.pdschCfg, dlDataToUlAck->dlDataToUlAckListCount,\ + dlDataToUlAck->dlDataToUlAckList); + BuildK2InfoTable(ueCb->cellCb, ueCfg->spCellCfg.servCellCfg.initUlBwp.puschCfg.timeDomRsrcAllocList,\ + ueCfg->spCellCfg.servCellCfg.initUlBwp.puschCfg.numTimeDomRsrcAlloc,\ + NULLP, &ueCb->ueCfg.spCellCfg.servCellCfg.initUlBwp.k2InfoTbl); + } + } } + ueCb->state = SCH_UE_STATE_ACTIVE; - if(ueCfg->ambrCfg != NULLP) + if(ueCfg->ambrCfg) { - SCH_ALLOC(ueCb->ueCfg.ambrCfg , sizeof(SchAmbrCfg)); - memcpy(&ueCb->ueCfg.ambrCfg->ulBr , &ueCfg->ambrCfg->ulBr, sizeof(SchAmbrCfg)); + SCH_FREE(ueCb->ueCfg.ambrCfg, sizeof(SchAmbrCfg)); + ueCb->ueCfg.ambrCfg = ueCfg->ambrCfg; } - memcpy(&ueCb->ueCfg.dlModInfo, &ueCfg->dlModInfo , sizeof(SchModulationInfo)); memcpy(&ueCb->ueCfg.ulModInfo, &ueCfg->ulModInfo , sizeof(SchModulationInfo)); @@ -256,14 +329,32 @@ uint8_t fillSchUeCb(SchUeCb *ueCb, SchUeCfg *ueCfg) if(ueCfg->schLcCfg[lcIdx].configType == CONFIG_MOD) { fillSchUlLcCtxt(&ueCb->ulInfo.ulLcCtxt[ueLcIdx], &ueCfg->schLcCfg[lcIdx]); - fillSchDlLcCtxt(&ueCb->dlInfo.dlLcCtxt[ueLcIdx], &ueCfg->schLcCfg[lcIdx]); break; } - if(ueCfg->schLcCfg[ueLcIdx].configType == CONFIG_DEL) + /*BUG: ueCfg using lcIdx (Looping around numLCs in ueCfg whereas + * ueLcIdx Loops around numUlLc in SCH UL DB*/ + if(ueCfg->schLcCfg[lcIdx].configType == CONFIG_DEL) { memset(&ueCb->ulInfo.ulLcCtxt[ueLcIdx], 0, sizeof(SchUlLcCtxt)); ueCb->ulInfo.numUlLc--; - updateSchUlCb(ueLcIdx, &ueCb->ulInfo); //moving arr elements one idx ahead + updateSchUlCb(ueLcIdx, &ueCb->ulInfo); //moving arr elements one idx ahead + + break; + } + } + }/*End of inner for loop */ + + for(ueLcIdx = 0; ueLcIdx < ueCb->dlInfo.numDlLc; ueLcIdx++) //searching for Lc to be Mod + { + if(ueCb->dlInfo.dlLcCtxt[ueLcIdx].lcId == ueCfg->schLcCfg[lcIdx].lcId) + { + if(ueCfg->schLcCfg[lcIdx].configType == CONFIG_MOD) + { + fillSchDlLcCtxt(&ueCb->dlInfo.dlLcCtxt[ueLcIdx], &ueCfg->schLcCfg[lcIdx]); + break; + } + if(ueCfg->schLcCfg[lcIdx].configType == CONFIG_DEL) + { memset(&ueCb->dlInfo.dlLcCtxt[ueLcIdx], 0, sizeof(SchDlLcCtxt)); ueCb->dlInfo.numDlLc--; updateSchDlCb(ueLcIdx, &ueCb->dlInfo); //moving arr elements one idx ahead @@ -272,6 +363,10 @@ uint8_t fillSchUeCb(SchUeCb *ueCb, SchUeCfg *ueCfg) } }/*End of inner for loop */ } + + SCH_FREE(ueCfg->schLcCfg[lcIdx].drbQos, sizeof(SchDrbQosInfo)); + SCH_FREE(ueCfg->schLcCfg[lcIdx].snssai, sizeof(Snssai)); + }/* End of outer for loop */ return ROK; } @@ -347,6 +442,10 @@ uint8_t MacSchAddUeConfigReq(Pst *pst, SchUeCfg *ueCfg) SchUeCfgRsp cfgRsp; Inst inst = pst->dstInst - 1; memset(&cfgRsp, 0, sizeof(SchUeCfgRsp)); + +#ifdef CALL_FLOW_DEBUG_LOG + DU_LOG("\nCall Flow: ENTMAC -> ENTSCH : EVENT_ADD_UE_CONFIG_REQ_TO_SCH\n"); +#endif if(!ueCfg) { @@ -416,13 +515,12 @@ uint8_t schFillPuschAlloc(SchUeCb *ueCb, uint16_t pdcchSlot, uint32_t dataVol, S uint16_t puschSlot = 0; uint16_t startRb = 0; uint8_t numRb = 0; - uint8_t numPdschSymbols= 14; uint16_t tbSize = 0; uint8_t buffer = 5; uint8_t idx = 0; SchCellCb *cellCb = ueCb->cellCb; SchUlSlotInfo *schUlSlotInfo = NULLP; - uint8_t k2=0, startSymb=0 , symbLen=0; + uint8_t k2=0, startSymb=0 , symbLen=11; if(ueCb->ueCfg.spCellCfgPres == true) { @@ -434,7 +532,7 @@ uint8_t schFillPuschAlloc(SchUeCb *ueCb, uint16_t pdcchSlot, uint32_t dataVol, S startRb = cellCb->schUlSlotInfo[puschSlot]->puschCurrentPrb; tbSize = schCalcTbSize(dataVol + buffer); /* 2 bytes header + some buffer */ - numRb = schCalcNumPrb(tbSize, ueCb->ueCfg.ulModInfo.mcsIndex, numPdschSymbols); + numRb = schCalcNumPrb(tbSize, ueCb->ueCfg.ulModInfo.mcsIndex, symbLen); /* increment PUSCH PRB */ cellCb->schUlSlotInfo[puschSlot]->puschCurrentPrb += numRb; @@ -459,7 +557,7 @@ uint8_t schFillPuschAlloc(SchUeCb *ueCb, uint16_t pdcchSlot, uint32_t dataVol, S /* Update pusch in cell */ for(idx=startSymb; idxschUlSlotInfo[puschSlot]->assignedPrb[idx] = startRb + numRb; + //cellCb->schUlSlotInfo[puschSlot]->assignedPrb[idx] = startRb + numRb; } schUlSlotInfo = cellCb->schUlSlotInfo[puschSlot]; @@ -586,6 +684,10 @@ uint8_t MacSchModUeConfigReq(Pst *pst, SchUeCfg *ueCfg) SchUeCfgRsp cfgRsp; Inst inst = pst->dstInst - 1; memset(&cfgRsp, 0, sizeof(SchUeCfgRsp)); + +#ifdef CALL_FLOW_DEBUG_LOG + DU_LOG("\nCall Flow: ENTMAC -> ENTSCH : EVENT_MODIFY_UE_CONFIG_REQ_TO_SCH\n"); +#endif if(!ueCfg) { @@ -621,6 +723,7 @@ uint8_t MacSchModUeConfigReq(Pst *pst, SchUeCfg *ueCfg) } return ret; } + /******************************************************************* * * @brief Fill and send UE delete response to MAC @@ -654,6 +757,7 @@ void SchSendUeDeleteRspToMac(Inst inst, SchUeDelete *ueDelete, SchMacRsp result rspPst.event = EVENT_UE_DELETE_RSP_TO_MAC; SchUeDeleteRspOpts[rspPst.selector](&rspPst, &delRsp); } + /******************************************************************* * * @brief Function to delete Sch Pucch ResrcCfg @@ -709,6 +813,7 @@ void deleteSchPucchResrcCfg(SchPucchResrcCfg *resrc) } } } + /******************************************************************* * * @brief Function to delete SCH Pdsch ServCellCfg @@ -731,6 +836,7 @@ void deleteSchPdschServCellCfg(SchPdschServCellCfg *pdschServCellCfg) SCH_FREE(pdschServCellCfg->codeBlkGrpFlushInd, sizeof(bool)); SCH_FREE(pdschServCellCfg->xOverhead, sizeof(SchPdschXOverhead)); } + /******************************************************************* * * @brief Function to delete SCH UeCb @@ -748,12 +854,22 @@ void deleteSchPdschServCellCfg(SchPdschServCellCfg *pdschServCellCfg) * ****************************************************************/ void deleteSchUeCb(SchUeCb *ueCb) { + uint8_t timeDomRsrcIdx = 0, ueLcIdx = 0; SchPucchCfg *pucchCfg = NULLP; + SchPdschConfig *pdschCfg = NULLP; + if(ueCb) { SCH_FREE(ueCb->ueCfg.ambrCfg, sizeof(SchAmbrCfg)); if(ueCb->ueCfg.spCellCfgPres) { + if(ueCb->ueCfg.spCellCfg.servCellCfg.initDlBwp.pdschCfgPres == true) + { + pdschCfg = &ueCb->ueCfg.spCellCfg.servCellCfg.initDlBwp.pdschCfg; + for(timeDomRsrcIdx = 0; timeDomRsrcIdx < pdschCfg->numTimeDomRsrcAlloc; timeDomRsrcIdx++) + SCH_FREE(pdschCfg->timeDomRsrcAllociList[timeDomRsrcIdx].k0, sizeof(uint8_t)); + } + if(ueCb->ueCfg.spCellCfg.servCellCfg.initUlBwp.pucchCfgPres == true) { pucchCfg = &ueCb->ueCfg.spCellCfg.servCellCfg.initUlBwp.pucchCfg; @@ -776,9 +892,19 @@ void deleteSchUeCb(SchUeCb *ueCb) SCH_FREE(ueCb->ueCfg.spCellCfg.servCellCfg.bwpInactivityTmr, sizeof(uint8_t)); deleteSchPdschServCellCfg(&ueCb->ueCfg.spCellCfg.servCellCfg.pdschServCellCfg); } + /*Need to Free the memory allocated for S-NSSAI*/ + for(ueLcIdx = 0; ueLcIdx < ueCb->ulInfo.numUlLc; ueLcIdx++) + { + SCH_FREE(ueCb->ulInfo.ulLcCtxt[ueLcIdx].snssai, sizeof(Snssai)); + } + for(ueLcIdx = 0; ueLcIdx < ueCb->dlInfo.numDlLc; ueLcIdx++) + { + SCH_FREE(ueCb->dlInfo.dlLcCtxt[ueLcIdx].snssai, sizeof(Snssai)); + } memset(ueCb, 0, sizeof(SchUeCb)); } } + /******************************************************************* * * @brief Function for Ue Delete request from MAC to SCH @@ -799,9 +925,12 @@ uint8_t MacSchUeDeleteReq(Pst *pst, SchUeDelete *ueDelete) uint8_t idx=0, ueIdx=0, ret=ROK; ErrorCause result; SchCellCb *cellCb = NULLP; - SchUeCb ueCb ; Inst inst = pst->dstInst - 1; - + +#ifdef CALL_FLOW_DEBUG_LOG + DU_LOG("\nCall Flow: ENTMAC -> ENTSCH : EVENT_UE_DELETE_REQ_TO_SCH\n"); +#endif + if(!ueDelete) { DU_LOG("\nERROR --> SCH : MacSchUeDeleteReq(): Ue Delete request failed"); @@ -819,10 +948,10 @@ uint8_t MacSchUeDeleteReq(Pst *pst, SchUeDelete *ueDelete) else { GET_UE_IDX(ueDelete->crnti, ueIdx); - ueCb = cellCb->ueCb[ueIdx-1]; - if((ueCb.crnti == ueDelete->crnti) && (ueCb.state == SCH_UE_STATE_ACTIVE)) + if(( cellCb->ueCb[ueIdx-1].crnti == ueDelete->crnti) && ( cellCb->ueCb[ueIdx-1].state == SCH_UE_STATE_ACTIVE)) { - deleteSchUeCb(&ueCb); + deleteSchUeCb(&cellCb->ueCb[ueIdx-1]); + cellCb->numActvUe--; result = NOT_APPLICABLE; } else @@ -844,6 +973,159 @@ uint8_t MacSchUeDeleteReq(Pst *pst, SchUeDelete *ueDelete) 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 sliceIdx=0, slotIdx=0; + if(cellCb->schDlSlotInfo) + { + for(slotIdx=0; slotIdxnumSlots; slotIdx++) + { + SCH_FREE(cellCb->schDlSlotInfo[slotIdx], sizeof(SchDlSlotInfo)); + } + SCH_FREE(cellCb->schDlSlotInfo, cellCb->numSlots *sizeof(SchDlSlotInfo*)); + } + if(cellCb->schUlSlotInfo) + { + for(slotIdx=0; slotIdxnumSlots; slotIdx++) + { + SCH_FREE(cellCb->schUlSlotInfo[slotIdx], sizeof(SchUlSlotInfo)); + } + SCH_FREE(cellCb->schUlSlotInfo, cellCb->numSlots * sizeof(SchUlSlotInfo*)); + } + + if(cellCb->cellCfg.snssai) + { + for(sliceIdx=0; sliceIdxcellCfg.numSliceSupport; sliceIdx++) + { + SCH_FREE(cellCb->cellCfg.snssai[sliceIdx], sizeof(Snssai)); + } + SCH_FREE(cellCb->cellCfg.snssai, cellCb->cellCfg.numSliceSupport*sizeof(Snssai*)); + } + SCH_FREE(cellCb->cellCfg.rrmPolicy, sizeof(SchRrmPolicy)); + 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; + +#ifdef CALL_FLOW_DEBUG_LOG + DU_LOG("\nCall Flow: ENTMAC -> ENTSCH : EVENT_CELL_DELETE_REQ_TO_SCH\n"); +#endif + + 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 **********************************************************************/