X-Git-Url: https://gerrit.o-ran-sc.org/r/gitweb?a=blobdiff_plain;f=src%2F5gnrsch%2Fsch_ue_mgr.c;h=e2ce9f9d4519e4239c12d1abae06506a4d1607aa;hb=62605166db94fd7d52f32de84dea8c7006e0f4c5;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..e2ce9f9d4 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 @@ -227,13 +233,13 @@ uint8_t fillSchUeCb(SchUeCb *ueCb, SchUeCfg *ueCfg) memcpy(&ueCb->ueCfg.spCellCfg , &ueCfg->spCellCfg, sizeof(SchSpCellCfg)); ueCb->ueCfg.spCellCfgPres = true; } + 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)); @@ -272,6 +278,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(SchSnssai)); + }/* End of outer for loop */ return ROK; } @@ -347,6 +357,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 +430,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 +447,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; @@ -586,6 +599,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 +638,7 @@ uint8_t MacSchModUeConfigReq(Pst *pst, SchUeCfg *ueCfg) } return ret; } + /******************************************************************* * * @brief Fill and send UE delete response to MAC @@ -654,6 +672,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 +728,7 @@ void deleteSchPucchResrcCfg(SchPucchResrcCfg *resrc) } } } + /******************************************************************* * * @brief Function to delete SCH Pdsch ServCellCfg @@ -731,6 +751,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 +769,22 @@ void deleteSchPdschServCellCfg(SchPdschServCellCfg *pdschServCellCfg) * ****************************************************************/ void deleteSchUeCb(SchUeCb *ueCb) { + uint8_t timeDomRsrcIdx; 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; @@ -779,6 +810,7 @@ void deleteSchUeCb(SchUeCb *ueCb) memset(ueCb, 0, sizeof(SchUeCb)); } } + /******************************************************************* * * @brief Function for Ue Delete request from MAC to SCH @@ -799,9 +831,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 +854,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 +879,155 @@ 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 idx=0; + if(cellCb->schDlSlotInfo) + { + for(idx=0; idxnumSlots; idx++) + { + if(cellCb->schDlSlotInfo[idx]) + { + SCH_FREE(cellCb->schDlSlotInfo[idx], sizeof(SchDlSlotInfo)); + } + } + SCH_FREE(cellCb->schDlSlotInfo, cellCb->numSlots *sizeof(SchDlSlotInfo*)); + } + if(cellCb->schUlSlotInfo) + { + for(idx=0; idxnumSlots; idx++) + { + if(cellCb->schUlSlotInfo[idx]) + { + SCH_FREE(cellCb->schUlSlotInfo[idx], sizeof(SchUlSlotInfo)); + } + } + SCH_FREE(cellCb->schUlSlotInfo, cellCb->numSlots * sizeof(SchUlSlotInfo*)); + } + 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 **********************************************************************/