X-Git-Url: https://gerrit.o-ran-sc.org/r/gitweb?a=blobdiff_plain;f=src%2Fdu_app%2Fdu_ue_mgr.c;h=b6c333b87bdebafb59fef98f8e1d884abae633cd;hb=cbb5d8d83a41cbf191347d447a66c9cd062d4d81;hp=4d17af2ab2bf94480234e5ba6ac03a2d48878440;hpb=791615463ef2fcc0d6e0697d7860e6e6a56bd9a6;p=o-du%2Fl2.git diff --git a/src/du_app/du_ue_mgr.c b/src/du_app/du_ue_mgr.c index 4d17af2ab..b6c333b87 100644 --- a/src/du_app/du_ue_mgr.c +++ b/src/du_app/du_ue_mgr.c @@ -34,51 +34,169 @@ #include "du_f1ap_msg_hdl.h" #include "du_ue_mgr.h" -#ifdef EGTP_TEST -uint32_t sduId = 0; -#endif - DuMacDlCcchInd packMacDlCcchIndOpts[] = { - packMacDlCcchInd, /* Loose coupling */ - MacProcDlCcchInd, /* TIght coupling */ - packMacDlCcchInd /* Light weight-loose coupling */ + packMacDlCcchInd, /* Loose coupling */ + MacProcDlCcchInd, /* TIght coupling */ + packMacDlCcchInd /* Light weight-loose coupling */ }; DuMacUeCreateReq packMacUeCreateReqOpts[] = { packDuMacUeCreateReq, /* Loose coupling */ - MacProcUeCreateReq, /* TIght coupling */ - packDuMacUeCreateReq /* Light weight-loose coupling */ + MacProcUeCreateReq, /* TIght coupling */ + packDuMacUeCreateReq /* Light weight-loose coupling */ }; DuRlcUeCreateReq packRlcUeCreateReqOpts[] = { packDuRlcUeCreateReq, /* Loose coupling */ - RlcProcUeCreateReq, /* TIght coupling */ - packDuRlcUeCreateReq /* Light weight-loose coupling */ + RlcProcUeCreateReq, /* TIght coupling */ + packDuRlcUeCreateReq /* Light weight-loose coupling */ }; DuDlRrcMsgToRlcFunc duSendDlRrcMsgToRlcOpts[] = { packDlRrcMsgToRlc, /* Loose coupling */ - RlcProcDlRrcMsgTransfer, /* Tight coupling */ + RlcProcDlRrcMsgTransfer, /* Tight coupling */ packDlRrcMsgToRlc /* Light weight-loose coupling */ }; DuRlcUeReconfigReq packRlcUeReconfigReqOpts[] = { - packDuRlcUeReconfigReq, /* Loose coupling */ + packDuRlcUeReconfigReq, /* Loose coupling */ RlcProcUeReconfigReq, /* TIght coupling */ - packDuRlcUeReconfigReq /* Light weight-loose coupling */ + packDuRlcUeReconfigReq /* Light weight-loose coupling */ }; DuMacUeReconfigReq packMacUeReconfigReqOpts[] = { - packDuMacUeReconfigReq, /* Loose coupling */ + packDuMacUeReconfigReq, /* Loose coupling */ MacProcUeReconfigReq, /* TIght coupling */ - packDuMacUeReconfigReq /* Light weight-loose coupling */ + packDuMacUeReconfigReq /* Light weight-loose coupling */ +}; + +DuRlcDlUserDataToRlcFunc duSendRlcDlUserDataToRlcOpts[] = +{ + packRlcDlUserDataToRlc, /* Loose coupling */ + RlcProcDlUserDataTransfer, /* Tight coupling */ + packRlcDlUserDataToRlc /* Light weight-loose coupling */ +}; + +DuMacUeDeleteReq packMacUeDeleteReqOpts[] = +{ + packDuMacUeDeleteReq, /* Loose coupling */ + MacProcUeDeleteReq, /* TIght coupling */ + packDuMacUeDeleteReq /* Light weight-loose coupling */ +}; + +DuRlcUeDeleteReq packRlcUeDeleteReqOpts[] = +{ + packDuRlcUeDeleteReq, /* Loose coupling */ + RlcProcUeDeleteReq, /* TIght coupling */ + packDuRlcUeDeleteReq /* Light weight-loose coupling */ +}; + +DuMacCellDeleteReq packMacCellDeleteReqOpts[] = +{ + packDuMacCellDeleteReq, /* Loose coupling */ + MacProcCellDeleteReq, /* TIght coupling */ + packDuMacCellDeleteReq /* Light weight-loose coupling */ }; + +/******************************************************************* + * + * @brief Function to fillDlUserDataInfo + * + * @details + * + * Function : fillDlUserDataInfo + * + * Functionality: + * Function to fillDlUserDataInfo + * + * @params[in] teId, + * dlDataMsgInfo + * + * @return ROK - success + * RFAILED - failure + * + * ****************************************************************/ + +uint8_t fillDlUserDataInfo(uint32_t teId, RlcDlUserDataInfo *dlDataMsgInfo) +{ + uint8_t drbIdx; + + for(drbIdx = 0; drbIdx < duCb.numDrb; drbIdx++) + { + if(duCb.upTnlCfg[drbIdx] && (duCb.upTnlCfg[drbIdx]->tnlCfg1 != NULLP)) + { + if(duCb.upTnlCfg[drbIdx]->tnlCfg1->teId == teId) + { + dlDataMsgInfo->cellId = duCb.upTnlCfg[drbIdx]->cellId; + dlDataMsgInfo->ueIdx = duCb.upTnlCfg[drbIdx]->ueIdx; + dlDataMsgInfo->rbId = duCb.upTnlCfg[drbIdx]->drbId; + return ROK; + } + } + } + return RFAILED; +} + + /******************************************************************* + * + * @brief Build and Send DL Data Message transfer to RLC + * + * @details + * + * Function : duBuildAndSendDlUserDataToRlc + * + * Functionality: + * Build and Send DL Data Message transfer to RLC + * + * @params[in] Cell ID + * UE Index + * Logical Channgel ID + * RRC Message + * RRC Message Length + * @return ROK - success + * RFAILED - failure + * + * ****************************************************************/ + +uint8_t duBuildAndSendDlUserDataToRlc(uint16_t msgLen, EgtpMsg *egtpMsg) +{ + uint8_t ret = RFAILED; + Pst pst; + RlcDlUserDataInfo *dlDataMsgInfo = NULLP; + + DU_ALLOC_SHRABL_BUF(dlDataMsgInfo, sizeof(RlcDlUserDataInfo)); + if(!dlDataMsgInfo) + { + DU_LOG("\nERROR --> DU_APP : Memory allocation failed for dlDataMsgInfo in duHdlEgtpDlData()"); + return RFAILED; + } + memset(dlDataMsgInfo, 0, sizeof(RlcDlUserDataInfo)); + dlDataMsgInfo->dlMsg = egtpMsg->msg; + dlDataMsgInfo->msgLen = msgLen; + + /* Filling DL DATA Msg Info */ + if(fillDlUserDataInfo(egtpMsg->msgHdr.teId, dlDataMsgInfo) == ROK) + { + /* Filling post structure and sending msg */ + FILL_PST_DUAPP_TO_RLC(pst, RLC_DL_INST, EVENT_DL_USER_DATA_TRANS_TO_RLC); + DU_LOG("\nDEBUG --> DU_APP : Sending User Data Msg to RLC \n"); + ret = (*duSendRlcDlUserDataToRlcOpts[pst.selector])(&pst, dlDataMsgInfo); + } + if(ret != ROK) + { + DU_LOG("\nERROR --> DU_APP : Failed to send User Data to RLC in duHdlEgtpDlData()"); + ODU_PUT_MSG_BUF(dlDataMsgInfo->dlMsg); + DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL, dlDataMsgInfo, sizeof(RlcDlUserDataInfo)); + } + return ret; +} + /******************************************************************* * * @brief Handles EGTP data from CU @@ -97,36 +215,21 @@ DuMacUeReconfigReq packMacUeReconfigReqOpts[] = * ****************************************************************/ uint8_t duHdlEgtpDlData(EgtpMsg *egtpMsg) { - - /* TODO : Extract RbId/UeID/CellID/SduId from database - using tunnel id in egtp header */ - - DU_LOG("\nDU_APP : Processing DL data"); -#ifdef EGTP_TEST - Pst pst; - KwuDatReqInfo datReqInfo; - - datReqInfo.rlcId.rbId = RB_ID; - datReqInfo.rlcId.rbType = CM_LTE_DRB; - datReqInfo.rlcId.ueId = UE_ID; - datReqInfo.rlcId.cellId = NR_CELL_ID; - - datReqInfo.sduId = ++sduId; - datReqInfo.lcType = CM_LTE_LCH_DTCH; - - /* Filling pst and Sending to RLC DL */ - pst.selector = ODU_SELECTOR_LWLC; - pst.srcEnt = ENTDUAPP; - pst.dstEnt = ENTRLC; - pst.dstInst = RLC_DL_INST; - pst.dstProcId = DU_PROC; - pst.srcProcId = DU_PROC; - pst.region = duCb.init.region; - - cmPkKwuDatReq(&pst, &datReqInfo, egtpMsg->msg); -#else - //duBuildAndSendDlRrcMsgToRlc(); -#endif + uint16_t msgLen = 0; + DU_LOG("\nDEBUG --> DU_APP : Processing DL data in duHdlEgtpDlData()"); + + if(!egtpMsg->msg) + { + DU_LOG("\nERROR --> DU_APP : Recevied Dl Data is NULLP in duHdlEgtpDlData()"); + return RFAILED; + } + ODU_GET_MSG_LEN(egtpMsg->msg, (MsgLen *)&msgLen); + if(duBuildAndSendDlUserDataToRlc(msgLen, egtpMsg) != ROK) + { + DU_LOG("\nERROR --> DU_APP : Failed to build DL USer Data in duHdlEgtpDlData()"); + DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL, egtpMsg->msg, msgLen); + return RFAILED; + } return ROK; } @@ -153,13 +256,13 @@ uint8_t duBuildAndSendDlCcchInd(uint16_t *cellId, uint16_t *crnti, \ DlCcchIndInfo *dlCcchIndInfo = NULLP; Pst pst; - DU_LOG("\nDU APP : Building and Sending DL CCCH Ind to MAC"); + DU_LOG("\nDEBUG --> DU APP : Building and Sending DL CCCH Ind to MAC"); DU_ALLOC_SHRABL_BUF(dlCcchIndInfo, sizeof(DlCcchIndInfo)); if(!dlCcchIndInfo) { - DU_LOG("\nDU APP : Memory alloc failed while building DL CCCH Ind"); + DU_LOG("\nERROR --> DU APP : Memory alloc failed while building DL CCCH Ind"); return RFAILED; } @@ -171,7 +274,7 @@ uint8_t duBuildAndSendDlCcchInd(uint16_t *cellId, uint16_t *crnti, \ DU_ALLOC_SHRABL_BUF(dlCcchIndInfo->dlCcchMsg, dlCcchIndInfo->dlCcchMsgLen); if(!dlCcchIndInfo->dlCcchMsg) { - DU_LOG("\nDU APP : Memory alloc failed while building DL CCCH Ind"); + DU_LOG("\nERROR --> DU APP : Memory alloc failed while building DL CCCH Ind"); DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL, dlCcchIndInfo, sizeof(DlCcchIndInfo)); return RFAILED; } @@ -186,7 +289,7 @@ uint8_t duBuildAndSendDlCcchInd(uint16_t *cellId, uint16_t *crnti, \ ret = (*packMacDlCcchIndOpts[pst.selector])(&pst, dlCcchIndInfo); if(ret != ROK) { - DU_LOG("\nDU_APP : Failure in sending DL CCCH to MAC"); + DU_LOG("\nERROR --> DU_APP : Failure in sending DL CCCH to MAC"); DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL, dlCcchIndInfo->dlCcchMsg,\ dlCcchIndInfo->dlCcchMsgLen); DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL, dlCcchIndInfo, \ @@ -227,14 +330,14 @@ uint8_t duBuildAndSendDlRrcMsgToRlc(uint16_t cellId, RlcUeCfg ueCfg, F1DlRrcMsg if(!f1DlRrcMsg) { - DU_LOG("\nDU APP : Received Dl RRC Msg is NULL at duBuildAndSendDlRrcMsgToRlc()"); + DU_LOG("\nERROR --> DU APP : Received Dl RRC Msg is NULL at duBuildAndSendDlRrcMsgToRlc()"); return RFAILED; } DU_ALLOC_SHRABL_BUF(dlRrcMsgInfo, sizeof(RlcDlRrcMsgInfo)); if(!dlRrcMsgInfo) { - DU_LOG("\nDU APP : Memory allocation failed for dlRrcMsgInfo in \ + DU_LOG("\nERROR --> DU APP : Memory allocation failed for dlRrcMsgInfo in \ duBuildAndSendDlRrcMsgToRlc"); DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL, f1DlRrcMsg->rrcMsgPdu, f1DlRrcMsg->rrcMsgSize); return RFAILED; @@ -261,7 +364,7 @@ uint8_t duBuildAndSendDlRrcMsgToRlc(uint16_t cellId, RlcUeCfg ueCfg, F1DlRrcMsg /* Filling post structure and sending msg */ FILL_PST_DUAPP_TO_RLC(pst, RLC_DL_INST, EVENT_DL_RRC_MSG_TRANS_TO_RLC); - DU_LOG("\nDU_APP: Sending Dl RRC Msg to RLC \n"); + DU_LOG("\nDEBUG --> DU_APP: Sending Dl RRC Msg to RLC \n"); ret = (*duSendDlRrcMsgToRlcOpts[pst.selector])(&pst, dlRrcMsgInfo); if(ret != ROK) { @@ -318,7 +421,7 @@ uint8_t duProcDlRrcMsg(F1DlRrcMsg *dlRrcMsg) ret = duBuildAndSendDlCcchInd(&cellId, &crnti, RRC_SETUP, dlRrcMsg->rrcMsgSize, dlRrcMsg->rrcMsgPdu); if(ret == RFAILED) { - DU_LOG("\nDU_APP: Falied to build DlCcch Ind at procDlRrcMsgTrans()"); + DU_LOG("\nERROR --> DU APP : Failed to build DlCcch Ind at procDlRrcMsgTrans()"); } else { @@ -327,13 +430,13 @@ uint8_t duProcDlRrcMsg(F1DlRrcMsg *dlRrcMsg) ret = duCreateUeCb(&duCb.ueCcchCtxt[ueIdx], dlRrcMsg->gnbCuUeF1apId); if(ret == RFAILED) { - DU_LOG("\nDU_APP: Failed to createUeCb for cellId [%d] at procDlRrcMsgTrans()", \ + DU_LOG("\nERROR --> DU APP : Failed to createUeCb for cellId [%d] at procDlRrcMsgTrans()", \ duCb.ueCcchCtxt[ueIdx].cellId); } } else { - DU_LOG("\nDU_APP: Max Active UEs has reached at procDlRrcMsgTrans()"); + DU_LOG("\nERROR --> DU_APP: Max Active UEs has reached at procDlRrcMsgTrans()"); ret = RFAILED; } } @@ -417,7 +520,7 @@ uint8_t duProcUlCcchInd(UlCcchIndInfo *ulCcchIndInfo) ulCcchIndInfo->ulCcchMsg)); if(ret != ROK) { - DU_LOG("\nDU_APP : BuildAndSendInitialRrcMsgTransfer failed"); + DU_LOG("\nERROR --> DU_APP : BuildAndSendInitialRrcMsgTransfer failed"); } DU_FREE_SHRABL_BUF(MAC_MEM_REGION, MAC_POOL, ulCcchIndInfo->ulCcchMsg, ulCcchIndInfo->ulCcchMsgLen); @@ -605,7 +708,7 @@ void fillDefaultInitUlBwp(InitialUlBwp *initUlBwp) } else { - DU_LOG("\n DUAPP: Memory is NULL of InitalUlBwp"); + DU_LOG("\nERROR --> DU APP : Memory is NULL of InitalUlBwp"); } } @@ -619,14 +722,21 @@ void fillDefaultInitUlBwp(InitialUlBwp *initUlBwp) * * Functionality: Fills Sp Cell Group Info * - * @params[in] SpCellCfg *spCell + * @params[in] MacUeCfg *macUeCfg * @return void * *****************************************************************/ -void fillDefaultSpCellGrpInfo(SpCellCfg *spCell) +void fillDefaultSpCellGrpInfo(MacUeCfg *macUeCfg) { + SpCellCfg *spCell = NULL; + + if(macUeCfg) + spCell = &macUeCfg->spCellCfg; + if(spCell) { + macUeCfg->spCellCfgPres = true; + spCell->servCellIdx = SERV_CELL_IDX; /* Filling Initial Dl Bwp */ fillDefaultInitDlBwp(&spCell->servCellCfg.initDlBwp); @@ -648,7 +758,7 @@ void fillDefaultSpCellGrpInfo(SpCellCfg *spCell) } else { - DU_LOG("\n DU_APP: Memory is NULL for SpCellGrp"); + DU_LOG("\nERROR --> DU APP : Memory is NULL for SpCellGrp"); } } @@ -662,20 +772,26 @@ void fillDefaultSpCellGrpInfo(SpCellCfg *spCell) * * Functionality: Fills Physical Cell Group Info * - * @params[in] PhyCellGrpCfg *cellGrp + * @params[in] MacUeCfg *macUeCfg * @return void * *****************************************************************/ -void fillDefaultPhyCellGrpInfo(PhyCellGrpCfg *cellGrp) +void fillDefaultPhyCellGrpInfo(MacUeCfg *macUeCfg) { + PhyCellGrpCfg *cellGrp = NULL; + + if(macUeCfg) + cellGrp = &macUeCfg->phyCellGrpCfg; + if(cellGrp) { + macUeCfg->phyCellGrpCfgPres = true; cellGrp->pdschHarqAckCodebook = PDSCH_HARQ_ACK_CODEBOOK_DYNAMIC; cellGrp->pNrFr1 = P_NR_FR1; } else { - DU_LOG("\nDUAPP: Memory is NULL for Physical Cell Group"); + DU_LOG("\nERROR --> DU APP : Memory is NULL for Physical Cell Group"); } } @@ -689,16 +805,22 @@ void fillDefaultPhyCellGrpInfo(PhyCellGrpCfg *cellGrp) * * Functionality: Fills Mac Cell Group Info * - * @params[in] MacCellGrpCfg *cellGrp + * @params[in] MacUeCfg *macUeCfg * @return void * *****************************************************************/ -void fillDefaultMacCellGrpInfo(MacCellGrpCfg *cellGrp) +void fillDefaultMacCellGrpInfo(MacUeCfg *macUeCfg) { uint8_t idx; + MacCellGrpCfg *cellGrp = NULL; + + if(macUeCfg) + cellGrp = &macUeCfg->macCellGrpCfg; if(cellGrp) { + macUeCfg->macCellGrpCfgPres = true; + /* Filling Scheduling Request Config */ cellGrp->schReqCfg.addModListCount = 1; if(cellGrp->schReqCfg.addModListCount <= MAX_NUM_SR_CFG_PER_CELL_GRP) @@ -742,10 +864,36 @@ void fillDefaultMacCellGrpInfo(MacCellGrpCfg *cellGrp) } else { - DU_LOG("\nDUAPP: Memory is NULL for Master Cell Group"); + DU_LOG("\nERROR --> DU APP : Memory is NULL for Master Cell Group"); } } +/******************************************************************* + * + * @brief Fills default modulation info for a UE + * + * @details + * + * Function : fillDefaultModulation + * + * Functionality: Fills default modulation info for a UE + * + * @params[in] Pointer to MAC UE configuration + * @return ROK - success + * RFAILED - failure + * + * ****************************************************************/ +void fillDefaultModulation(MacUeCfg *ueCfg) +{ + ueCfg->dlModInfo.modOrder = MOD_ORDER_QPSK; + ueCfg->dlModInfo.mcsIndex = SIB1_MCS; + ueCfg->dlModInfo.mcsTable = MCS_TABLE_QAM64; /* Spec 38.214-Table 5.1.3.1-1 */ + + ueCfg->ulModInfo.modOrder = MOD_ORDER_QPSK; + ueCfg->ulModInfo.mcsIndex = SIB1_MCS; + ueCfg->ulModInfo.mcsTable = MCS_TABLE_QAM64; /* Spec 38.214-Table 5.1.3.1-1 */ +} + /****************************************************************** * * @brief Function to fill Mac Lc Cfg for SRB1 @@ -798,7 +946,7 @@ uint8_t fillMacLcCfgToAddMod(LcCfg *lcCfg, LcCfg *ueSetReqDb) DU_ALLOC_SHRABL_BUF(lcCfg->drbQos, sizeof(DrbQosInfo)); if(!lcCfg->drbQos) { - DU_LOG("\nDU APP: Memory Alloc failed at drQos at fillMacLcCfgToAddMod()"); + DU_LOG("\nERROR --> DU APP : Memory Alloc failed at drQos at fillMacLcCfgToAddMod()"); return RFAILED; } } @@ -821,7 +969,7 @@ uint8_t fillMacLcCfgToAddMod(LcCfg *lcCfg, LcCfg *ueSetReqDb) DU_ALLOC_SHRABL_BUF(lcCfg->snssai, sizeof(Snssai)); if(!lcCfg->snssai) { - DU_LOG("\nDU APP: Memory Alloc failed at snnsai at fillMacLcCfgToAddMod()"); + DU_LOG("\nERROR --> DU APP : Memory Alloc failed at snnsai at fillMacLcCfgToAddMod()"); ret = RFAILED; } } @@ -874,13 +1022,12 @@ uint8_t fillAmbr(AmbrCfg **macAmbr, AmbrCfg *ueDbAmbr) DU_ALLOC_SHRABL_BUF(*macAmbr, sizeof(AmbrCfg)); if(*macAmbr == NULLP) { - DU_LOG("\nDUAPP: Memory Alloc Failed at fillAmbr()"); + DU_LOG("\nERROR --> DU APP : Memory Alloc Failed at fillAmbr()"); return RFAILED; } } memset(*macAmbr, 0, sizeof(AmbrCfg)); (*macAmbr)->ulBr = ueDbAmbr->ulBr; - (*macAmbr)->dlBr = ueDbAmbr->dlBr; } else { @@ -916,17 +1063,17 @@ uint8_t sendUeReCfgReqToMac(MacUeCfg *macUeCfg) if(macUeCfg) { /* Processing one Ue at a time to MAC */ - DU_LOG("\nDU_APP: Sending Ue Reconfig Request to MAC"); + DU_LOG("\nDEBUG --> DU_APP: Sending Ue Reconfig Request to MAC"); ret = (*packMacUeReconfigReqOpts[pst.selector])(&pst, macUeCfg); if(ret == RFAILED) { - DU_LOG("\nDU_APP: Failed to send Reconfig Request to MAC at sendUeReCfgReqToMac()"); + DU_LOG("\nERROR --> DU APP : Failed to send Reconfig Request to MAC at sendUeReCfgReqToMac()"); DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL, macUeCfg, sizeof(MacUeCfg)); } } else { - DU_LOG("\n DU_APP: Received macUeCfg is NULLP at sendUeReCfgReqToMac()"); + DU_LOG("\nERROR --> DU_APP: Received macUeCfg is NULLP at sendUeReCfgReqToMac()"); ret = RFAILED; } return ret; @@ -963,7 +1110,7 @@ uint8_t getDrbLcId(uint32_t *drbBitMap) bitPos++; } } - DU_LOG("\nDU_APP: Max LC Reached in getDrbLcId()"); + DU_LOG("\nERROR --> DU_APP: Max LC Reached in getDrbLcId()"); return RFAILED; } @@ -997,10 +1144,12 @@ uint8_t fillMacUeCfg(uint16_t cellId, uint8_t ueIdx, uint16_t crnti, \ macUeCfg->cellId = cellId; macUeCfg->ueIdx = ueIdx; macUeCfg->crnti = crnti; - fillDefaultMacCellGrpInfo(&macUeCfg->macCellGrpCfg); - fillDefaultPhyCellGrpInfo(&macUeCfg->phyCellGrpCfg); - fillDefaultSpCellGrpInfo(&macUeCfg->spCellCfg); + + fillDefaultMacCellGrpInfo(macUeCfg); + fillDefaultPhyCellGrpInfo(macUeCfg); + fillDefaultSpCellGrpInfo(macUeCfg); macUeCfg->ambrCfg = NULLP; + fillDefaultModulation(macUeCfg); fillMacSrb1LcCfg(&macUeCfg->lcCfgList[0]); macUeCfg->numLcs++; } @@ -1009,6 +1158,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; @@ -1016,57 +1166,61 @@ uint8_t fillMacUeCfg(uint16_t cellId, uint8_t ueIdx, uint16_t crnti, \ ret = procUeReCfgCellInfo(macUeCfg, ueCfgDb->cellGrpCfg); if(ret == ROK) { - if(macUeCfg->spCellCfg.servCellCfg.initDlBwp.pdschPresent) - { - fillStartSymbolAndLen(macUeCfg->spCellCfg.servCellCfg.initDlBwp.pdschCfg.numTimeDomRsrcAlloc,\ - &macUeCfg->spCellCfg.servCellCfg.initDlBwp.pdschCfg, NULL); - } - if(macUeCfg->spCellCfg.servCellCfg.initUlBwp.puschPresent) + if(macUeCfg->spCellCfgPres == true) { - fillStartSymbolAndLen(macUeCfg->spCellCfg.servCellCfg.initUlBwp.puschCfg.numTimeDomRsrcAlloc,\ - NULL, &macUeCfg->spCellCfg.servCellCfg.initUlBwp.puschCfg); + if(macUeCfg->spCellCfg.servCellCfg.initDlBwp.pdschPresent) + { + fillStartSymbolAndLen(macUeCfg->spCellCfg.servCellCfg.initDlBwp.pdschCfg.numTimeDomRsrcAlloc,\ + &macUeCfg->spCellCfg.servCellCfg.initDlBwp.pdschCfg, NULL); + } + if(macUeCfg->spCellCfg.servCellCfg.initUlBwp.puschPresent) + { + fillStartSymbolAndLen(macUeCfg->spCellCfg.servCellCfg.initUlBwp.puschCfg.numTimeDomRsrcAlloc,\ + NULL, &macUeCfg->spCellCfg.servCellCfg.initUlBwp.puschCfg); + } } - ret = fillAmbr(&macUeCfg->ambrCfg, ueCfgDb->ambrCfg); + ret = fillAmbr(&macUeCfg->ambrCfg, ueCfgDb->ambrCfg); + duFillModulationDetails(macUeCfg, duMacDb, ueCfgDb->ueNrCapability); } /* Filling LC Context */ for(dbIdx = 0; (dbIdx < ueCfgDb->numMacLcs && ret == ROK); dbIdx++) { - if(!ueCfgDb->macLcCfg[dbIdx].ulLcCfgPres) - { - /* Filling default UL LC config in MAC if not present */ - ueCfgDb->macLcCfg[dbIdx].ulLcCfgPres = true; - fillDefaultUlLcCfg(&ueCfgDb->macLcCfg[dbIdx].ulLcCfg); - } - for(lcIdx = 0; lcIdx < duMacDb->numLcs; lcIdx++) - { - if(ueCfgDb->macLcCfg[dbIdx].lcId == duMacDb->lcCfgList[lcIdx].lcId) - { - lcIdFound = true; - if((ueCfgDb->macLcCfg[dbIdx].configType == CONFIG_UNKNOWN) || - (ueCfgDb->macLcCfg[dbIdx].configType == CONFIG_MOD)) - { - ueCfgDb->macLcCfg[dbIdx].configType = CONFIG_MOD; - ret = fillMacLcCfgToAddMod(&macUeCfg->lcCfgList[dbIdx], &ueCfgDb->macLcCfg[dbIdx]); - } - } - else - lcIdFound = false; - } - if(!lcIdFound) - { - /* ADD/DEL CONFIG */ - ret = fillMacLcCfgToAddMod(&macUeCfg->lcCfgList[dbIdx], &ueCfgDb->macLcCfg[dbIdx]); - } - if(ret == ROK) - { - macUeCfg->numLcs++; - } - else - { - DU_LOG("\n DU_APP: Failed to add Lc at Idx %d in fillMacUeCfg()", dbIdx); - break; - } + if(!ueCfgDb->macLcCfg[dbIdx].ulLcCfgPres) + { + /* Filling default UL LC config in MAC if not present */ + ueCfgDb->macLcCfg[dbIdx].ulLcCfgPres = true; + fillDefaultUlLcCfg(&ueCfgDb->macLcCfg[dbIdx].ulLcCfg); + } + for(lcIdx = 0; lcIdx < duMacDb->numLcs; lcIdx++) + { + if(ueCfgDb->macLcCfg[dbIdx].lcId == duMacDb->lcCfgList[lcIdx].lcId) + { + lcIdFound = true; + if((ueCfgDb->macLcCfg[dbIdx].configType == CONFIG_UNKNOWN) || + (ueCfgDb->macLcCfg[dbIdx].configType == CONFIG_MOD)) + { + ueCfgDb->macLcCfg[dbIdx].configType = CONFIG_MOD; + ret = fillMacLcCfgToAddMod(&macUeCfg->lcCfgList[dbIdx], &ueCfgDb->macLcCfg[dbIdx]); + } + } + else + lcIdFound = false; + } + if(!lcIdFound) + { + /* ADD/DEL CONFIG */ + ret = fillMacLcCfgToAddMod(&macUeCfg->lcCfgList[dbIdx], &ueCfgDb->macLcCfg[dbIdx]); + } + if(ret == ROK) + { + macUeCfg->numLcs++; + } + else + { + DU_LOG("\nERROR --> DU APP : Failed to add Lc at Idx %d in fillMacUeCfg()", dbIdx); + break; + } }/*End of Outer FOR loop */ } return ret; @@ -1090,15 +1244,15 @@ void fillDefaultAmInfo(AmBearerCfg *amCfg) { /* DL AM */ amCfg->dlAmCfg.snLenDl = AM_SIZE_12; - amCfg->dlAmCfg.pollRetxTmr = POLL_RETX_TMR_45MS; - amCfg->dlAmCfg.pollPdu = POLL_PDU_TMR_INFINITY; - amCfg->dlAmCfg.pollByte = POLL_BYTES_INFINITY; - amCfg->dlAmCfg.maxRetxTh = RETX_TH_8; + amCfg->dlAmCfg.pollRetxTmr = T_POLL_RETRANSMIT_VAL; + amCfg->dlAmCfg.pollPdu = POLL_PDU_VAL; + amCfg->dlAmCfg.pollByte = POLL_BYTE_VAL; + amCfg->dlAmCfg.maxRetxTh = MAX_RETX_THRESHOLD_VAL; /* UL AM */ amCfg->ulAmCfg.snLenUl = AM_SIZE_12; - amCfg->ulAmCfg.reAssemTmr = RE_ASM_40MS; - amCfg->ulAmCfg.statProhTmr = PROH_35MS; + amCfg->ulAmCfg.reAssemTmr = T_REASSEMBLY_VAL; + amCfg->ulAmCfg.statProhTmr = T_STATUS_PROHIBHIT_VAL; } /****************************************************************** @@ -1119,7 +1273,7 @@ void fillDefaultUmBiInfo(UmBiDirBearerCfg *umBiDirCfg) { /* UL UM BI DIR INFO */ umBiDirCfg->ulUmCfg.snLenUlUm = UM_SIZE_12; - umBiDirCfg->ulUmCfg.reAssemTmr = RE_ASM_40MS; + umBiDirCfg->ulUmCfg.reAssemTmr = T_REASSEMBLY_VAL; /* DL UM BI DIR INFO */ umBiDirCfg->dlUmCfg.snLenDlUm = UM_SIZE_12; @@ -1142,7 +1296,7 @@ void fillDefaultUmBiInfo(UmBiDirBearerCfg *umBiDirCfg) void fillDefaultUmUlInfo(UmUniDirUlBearerCfg *UmUlCfg) { UmUlCfg->ulUmCfg.snLenUlUm = UM_SIZE_12; - UmUlCfg->ulUmCfg.reAssemTmr = RE_ASM_40MS; + UmUlCfg->ulUmCfg.reAssemTmr = T_REASSEMBLY_VAL; } /****************************************************************** @@ -1195,7 +1349,7 @@ uint8_t fillDefaultRlcModeCfg(uint8_t rlcMode, RlcBearerCfg *lcCfg) fillDefaultAmInfo(lcCfg->u.amCfg); else { - DU_LOG("\n DU_APP: Memory Alloc failed at AmCfg at fillDefaultRlcModeCfg()"); + DU_LOG("\n ERROR --> DU APP : Memory Alloc failed at AmCfg at fillDefaultRlcModeCfg()"); return RFAILED; } } @@ -1210,7 +1364,7 @@ uint8_t fillDefaultRlcModeCfg(uint8_t rlcMode, RlcBearerCfg *lcCfg) fillDefaultUmBiInfo(lcCfg->u.umBiDirCfg); else { - DU_LOG("\n DU_APP: Memory Alloc failed at UmBiDirCfg at fillDefaultRlcModeCfg()"); + DU_LOG("\n ERROR --> DU APP : Memory Alloc failed at UmBiDirCfg at fillDefaultRlcModeCfg()"); return RFAILED; } } @@ -1225,7 +1379,7 @@ uint8_t fillDefaultRlcModeCfg(uint8_t rlcMode, RlcBearerCfg *lcCfg) fillDefaultUmUlInfo(lcCfg->u.umUniDirUlCfg); else { - DU_LOG("\n DU_APP: Memory Alloc failed at UmUniDirUlCfg at fillDefaultRlcModeCfg()"); + DU_LOG("\n ERROR --> DU APP : Memory Alloc failed at UmUniDirUlCfg at fillDefaultRlcModeCfg()"); return RFAILED; } } @@ -1240,21 +1394,21 @@ uint8_t fillDefaultRlcModeCfg(uint8_t rlcMode, RlcBearerCfg *lcCfg) fillDefaultUmDlInfo(lcCfg->u.umUniDirDlCfg); else { - DU_LOG("\n DU_APP: Memory Alloc failed at UmUniDirDlCfg at fillDefaultRlcModeCfg()"); + DU_LOG("\n ERROR --> DU APP : Memory Alloc failed at UmUniDirDlCfg at fillDefaultRlcModeCfg()"); return RFAILED; } } break; } default: - DU_LOG("\nDUAPP: Invalid rlcMode %d at extractRlcCfgToAddMod()", rlcMode); + DU_LOG("\nERROR --> DUAPP: Invalid rlcMode %d at extractRlcCfgToAddMod()", rlcMode); return RFAILED; } } else { - DU_LOG("\nDUAPP: Received Lc Config is NULL"); + DU_LOG("\nERROR --> DUAPP: Received LC Config is NULL"); return RFAILED; } return ROK; @@ -1316,17 +1470,17 @@ uint8_t sendUeReCfgReqToRlc(RlcUeCfg *rlcUeCfg) if(rlcUeCfg) { /* Processing one Ue at a time to RLC */ - DU_LOG("\nDU_APP: Sending Ue Reconfig Request to RLC UL"); + DU_LOG("\nDEBUG --> DU_APP: Sending Ue Reconfig Request to RLC UL"); ret = (*packRlcUeReconfigReqOpts[pst.selector])(&pst, rlcUeCfg); if(ret == RFAILED) { - DU_LOG("\nDU_APP : Failed to send Ue Reconfig Req to RLC at sendUeReCfgReqToRlc()"); + DU_LOG("\nERROR --> DU_APP : Failed to send Ue Reconfig Req to RLC at sendUeReCfgReqToRlc()"); DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL, rlcUeCfg, sizeof(RlcUeCfg)); } } else { - DU_LOG("\n DU_APP: Received RlcUeCfg is NULL at sendUeReCfgReqToRlc()"); + DU_LOG("\nERROR --> DU_APP: Received RlcUeCfg is NULL at sendUeReCfgReqToRlc()"); ret = RFAILED; } return ret; @@ -1368,41 +1522,42 @@ 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; for(dbIdx = 0; (dbIdx < ueCfgDb->numRlcLcs && ret == ROK); dbIdx++) { - ret = fillDefaultRlcModeCfg(ueCfgDb->rlcLcCfg[dbIdx].rlcMode, &ueCfgDb->rlcLcCfg[dbIdx]); - if(ret == RFAILED) - { - DU_LOG("\n DU_APP: Failed to fill Rlc Mode at fillRlcUeCfg()"); - memset(rlcUeCfg, 0, sizeof(RlcUeCfg)); - return ret; - } - /* Fill Rlc Ue Cfg List for ADD/MOD/DEL */ - for(lcIdx = 0; lcIdx < duRlcDb->numLcs; lcIdx++) - { - if(ueCfgDb->rlcLcCfg[dbIdx].lcId == duRlcDb->rlcLcCfg[lcIdx].lcId) - { - lcIdFound = true; - if((ueCfgDb->rlcLcCfg[dbIdx].configType == CONFIG_UNKNOWN)|| - (ueCfgDb->rlcLcCfg[dbIdx].configType == CONFIG_MOD)) - { - /* MOD */ - ueCfgDb->rlcLcCfg[dbIdx].configType = CONFIG_MOD; /* update Db for MOD type */ - memcpy(&rlcUeCfg->rlcLcCfg[dbIdx], &ueCfgDb->rlcLcCfg[dbIdx], sizeof(RlcBearerCfg)); - } - } - else - lcIdFound = false; - } - if(!lcIdFound) - { - /* ADD/ DEL Config Type */ - memcpy(&rlcUeCfg->rlcLcCfg[dbIdx], &ueCfgDb->rlcLcCfg[dbIdx], sizeof(RlcBearerCfg)); - } - rlcUeCfg->numLcs++; + ret = fillDefaultRlcModeCfg(ueCfgDb->rlcLcCfg[dbIdx].rlcMode, &ueCfgDb->rlcLcCfg[dbIdx]); + if(ret == RFAILED) + { + DU_LOG("\n ERROR --> DU APP : Failed to fill Rlc Mode at fillRlcUeCfg()"); + memset(rlcUeCfg, 0, sizeof(RlcUeCfg)); + return ret; + } + /* Fill Rlc Ue Cfg List for ADD/MOD/DEL */ + for(lcIdx = 0; lcIdx < duRlcDb->numLcs; lcIdx++) + { + if(ueCfgDb->rlcLcCfg[dbIdx].lcId == duRlcDb->rlcLcCfg[lcIdx].lcId) + { + lcIdFound = true; + if((ueCfgDb->rlcLcCfg[dbIdx].configType == CONFIG_UNKNOWN)|| + (ueCfgDb->rlcLcCfg[dbIdx].configType == CONFIG_MOD)) + { + /* MOD */ + ueCfgDb->rlcLcCfg[dbIdx].configType = CONFIG_MOD; /* update Db for MOD type */ + memcpy(&rlcUeCfg->rlcLcCfg[dbIdx], &ueCfgDb->rlcLcCfg[dbIdx], sizeof(RlcBearerCfg)); + } + } + else + lcIdFound = false; + } + if(!lcIdFound) + { + /* ADD/ DEL Config Type */ + memcpy(&rlcUeCfg->rlcLcCfg[dbIdx], &ueCfgDb->rlcLcCfg[dbIdx], sizeof(RlcBearerCfg)); + } + rlcUeCfg->numLcs++; } } return ret; @@ -1435,7 +1590,7 @@ uint8_t duCreateUeCb(UeCcchCtxt *ueCcchCtxt, uint32_t gnbCuUeF1apId) if(ueCcchCtxt->cellId == duCb.actvCellLst[cellIdx]->cellId) { GET_UE_IDX(ueCcchCtxt->crnti, ueIdx); - DU_LOG("\nDU_APP: Filling UeCb for ueIdx [%d]", ueIdx); + DU_LOG("\nDEBUG --> DU_APP: Filling UeCb for ueIdx [%d]", ueIdx); duCb.actvCellLst[cellIdx]->ueCb[ueIdx-1].f1UeDb = NULLP; duCb.actvCellLst[cellIdx]->ueCb[ueIdx-1].crnti = ueCcchCtxt->crnti; @@ -1449,14 +1604,14 @@ uint8_t duCreateUeCb(UeCcchCtxt *ueCcchCtxt, uint32_t gnbCuUeF1apId) ret = duBuildAndSendUeCreateReqToMac(ueCcchCtxt->cellId, ueIdx, ueCcchCtxt->crnti,\ &duCb.actvCellLst[cellIdx]->ueCb[ueIdx-1].macUeCfg); if(ret == RFAILED) - DU_LOG("\nDU_APP: Failed to send UE create request to MAC"); + DU_LOG("\nERROR --> DU APP : Failed to send UE create request to MAC"); /* Filling Rlc Ue Config */ memset(&duCb.actvCellLst[cellIdx]->ueCb[ueIdx-1].rlcUeCfg, 0, sizeof(RlcUeCfg)); ret = duBuildAndSendUeCreateReqToRlc(ueCcchCtxt->cellId, ueIdx, \ &duCb.actvCellLst[cellIdx]->ueCb[ueIdx-1].rlcUeCfg); if(ret == RFAILED) - DU_LOG("\nDU_APP: Failed to send UE create request to RLC"); + DU_LOG("\nERROR --> DU APP : Failed to send UE create request to RLC"); duCb.actvCellLst[cellIdx]->numActvUes++; memset(ueCcchCtxt, 0, sizeof(UeCcchCtxt)); @@ -1494,7 +1649,7 @@ uint8_t duBuildAndSendUeCreateReqToMac(uint16_t cellId, uint8_t ueIdx,\ ret = fillMacUeCfg(cellId, ueIdx, crnti, NULL, duMacUeCfg); if(ret == RFAILED) { - DU_LOG("\nDU APP: Failed to fill MacUeCfg at duBuildAndSendUeCreateReqToMac()"); + DU_LOG("\nERROR --> DU APP : Failed to fill MacUeCfg at duBuildAndSendUeCreateReqToMac()"); return RFAILED; } /* Fill Pst */ @@ -1505,20 +1660,20 @@ 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)); - DU_LOG("\nDU_APP: Sending UE create request to MAC"); + memcpy(macUeCfg, duMacUeCfg, sizeof(MacUeCfg)); + DU_LOG("\nDEBUG --> DU_APP: Sending UE create request to MAC"); /* Processing one Ue at a time to MAC */ ret = (*packMacUeCreateReqOpts[pst.selector])(&pst, macUeCfg); if(ret == RFAILED) { - DU_LOG("\nDU_APP : Failure in sending Ue Create Req to MAC at duBuildAndSendUeCreateReqToMac()"); + DU_LOG("\nERROR --> DU_APP : Failure in sending Ue Create Req to MAC at duBuildAndSendUeCreateReqToMac()"); DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL, macUeCfg, sizeof(MacUeCfg)); } } else { - DU_LOG("\n DU_APP: Memory alloc failed at duBuildAndSendUeCreateReqToMac()"); + DU_LOG("\n ERROR --> DU APP : Memory alloc failed at duBuildAndSendUeCreateReqToMac()"); ret = RFAILED; } return ret; @@ -1541,7 +1696,8 @@ uint8_t duBuildAndSendUeCreateReqToMac(uint16_t cellId, uint8_t ueIdx,\ * ****************************************************************/ uint8_t duUpdateMacCfg(MacUeCfg *macUeCfg, F1UeContextSetupDb *f1UeDb) { - uint8_t ret, lcIdx, dbIdx, numLcs, lcDelIdx; + uint8_t ret, lcIdx, dbIdx, numLcs, lcDelIdx, cellIdx; + MacUeCfg *oldMacUeCfg; ret = ROK; /*Filling Cell Group Cfg*/ @@ -1559,7 +1715,12 @@ uint8_t duUpdateMacCfg(MacUeCfg *macUeCfg, F1UeContextSetupDb *f1UeDb) NULL, &macUeCfg->spCellCfg.servCellCfg.initUlBwp.puschCfg); } ret = fillAmbr(&macUeCfg->ambrCfg, f1UeDb->duUeCfg.ambrCfg); + + GET_CELL_IDX(macUeCfg->cellId, cellIdx); + oldMacUeCfg = &duCb.actvCellLst[cellIdx]->ueCb[macUeCfg->ueIdx-1].macUeCfg; + duFillModulationDetails(macUeCfg, oldMacUeCfg, f1UeDb->duUeCfg.ueNrCapability); } + /* Filling LC Context */ for(dbIdx = 0; (dbIdx < f1UeDb->duUeCfg.numMacLcs && ret == ROK); dbIdx++) { @@ -1584,7 +1745,7 @@ uint8_t duUpdateMacCfg(MacUeCfg *macUeCfg, F1UeContextSetupDb *f1UeDb) freeMacLcCfg(&macUeCfg->lcCfgList[lcDelIdx+1]); if(ret == RFAILED) { - DU_LOG("\nDU_APP: Failed to delete LC at Idx %d in duUpdateMacCfg()", lcDelIdx); + DU_LOG("\nERROR --> DU APP : Failed to delete LC at Idx %d in duUpdateMacCfg()", lcDelIdx); break; } } @@ -1596,7 +1757,7 @@ uint8_t duUpdateMacCfg(MacUeCfg *macUeCfg, F1UeContextSetupDb *f1UeDb) ret = fillMacLcCfgToAddMod(&macUeCfg->lcCfgList[numLcs], &f1UeDb->duUeCfg.macLcCfg[dbIdx]); if(ret == RFAILED) { - DU_LOG("\nDU_APP: Failed to add LC at Idx %d in duUpdateMacCfg()", numLcs); + DU_LOG("\nERROR --> DU APP : Failed to add LC at Idx %d in duUpdateMacCfg()", numLcs); break; } macUeCfg->numLcs++; @@ -1690,7 +1851,7 @@ uint8_t fillRlcCfgToAddMod(RlcBearerCfg *lcCfg, RlcBearerCfg *f1UeDbLcCfg) break; } default: - DU_LOG("\nDU_APP: Invalid Rlc Mode %d at fillRlcCfgToAddMod()", lcCfg->rlcMode); + DU_LOG("\nERROR --> DU_APP: Invalid Rlc Mode %d at fillRlcCfgToAddMod()", lcCfg->rlcMode); return RFAILED; } return ROK; @@ -1739,7 +1900,7 @@ uint8_t duUpdateRlcLcCfg(RlcUeCfg *rlcUeCfg, F1UeContextSetupDb *f1UeDb) freeRlcLcCfg(&rlcUeCfg->rlcLcCfg[lcDelIdx+1]); if(ret == RFAILED) { - DU_LOG("\nDU_APP: Failed to delete LC at Idx %d in duUpdateRlcCfg()", lcDelIdx); + DU_LOG("\nERROR --> DU APP : Failed to delete LC at Idx %d in duUpdateRlcCfg()", lcDelIdx); break; } } @@ -1759,133 +1920,327 @@ uint8_t duUpdateRlcLcCfg(RlcUeCfg *rlcUeCfg, F1UeContextSetupDb *f1UeDb) /******************************************************************* * - * @brief @brief To update DuUeCb Mac and Rlc Ue Cfg + * @brief Function to fill Tunnel Config to Add/Mod * * * @details * - * Function : duUpdateDuUeCbCfg + * Function : fillTnlCfgToAddMod * - * Functionality: update DuUeCb Mac and Rlc Ue Cfg + * Functionality: Function to fill tunnel Config to Add/Mod * - * @params[in] ueIdx, cellIdx + * @params[in] Pointer to tnlCfgDb, + * pointer to f1TnlCfg * @return ROK - success * RFAILED - failure * * ****************************************************************/ - -uint8_t duUpdateDuUeCbCfg(uint8_t ueIdx, uint8_t cellId) +uint8_t fillTnlCfgToAddMod(UpTnlCfg **ueCbTnlCfg, UpTnlCfg *f1TnlCfg) { - uint8_t ret = ROK, cellIdx = 0, crnti=0; - DuUeCb *ueCb = NULLP; - - GET_CELL_IDX(cellId, cellIdx); - - if((duCb.actvCellLst[cellIdx]->ueCb[ueIdx-1].macUeCfg. \ - macUeCfgState == UE_RECFG_COMPLETE) && - (duCb.actvCellLst[cellIdx]->ueCb[ueIdx-1].rlcUeCfg. \ - rlcUeCfgState == UE_RECFG_COMPLETE)) + if(*ueCbTnlCfg == NULLP) { - ueCb = &duCb.actvCellLst[cellIdx]->ueCb[ueIdx-1]; - - /*Filling RLC Ue Cfg */ - ueCb->rlcUeCfg.cellId = cellId; - ueCb->rlcUeCfg.ueIdx = ueIdx; - ret = duUpdateRlcLcCfg(&ueCb->rlcUeCfg, ueCb->f1UeDb); - if(ret == ROK) + /* copying to DuCb Tnl Cfg */ + DU_ALLOC(*ueCbTnlCfg, sizeof(UpTnlCfg)); + if(*ueCbTnlCfg == NULLP) { - /*Filling MAC Ue Cfg */ - GET_CRNTI(crnti, ueIdx); - ueCb->macUeCfg.cellId = cellId; - ueCb->macUeCfg.ueIdx = ueIdx; - ueCb->macUeCfg.crnti = crnti; - ret = duUpdateMacCfg(&ueCb->macUeCfg, ueCb->f1UeDb); - if(ret == RFAILED) - DU_LOG("\nDU APP: Failed while updating MAC LC Config at duUpdateDuUeCbCfg()"); + DU_LOG("\nERROR --> DU_APP : fillTnlCfgToAddMod: Memory Alloc failed for drbId[%d]", f1TnlCfg->drbId); + return RFAILED; } - else - DU_LOG("\nDU APP: Failed while updating RLC LC Config at duUpdateDuUeCbCfg()"); } - else - ret = RFAILED; - return ret; + memset(*ueCbTnlCfg, 0, sizeof(UpTnlCfg)); + (*ueCbTnlCfg)->configType = f1TnlCfg->configType; + (*ueCbTnlCfg)->cellId = f1TnlCfg->cellId; + (*ueCbTnlCfg)->ueIdx = f1TnlCfg->ueIdx; + (*ueCbTnlCfg)->drbId = f1TnlCfg->drbId; + if(f1TnlCfg->tnlCfg1) + { + if((*ueCbTnlCfg)->tnlCfg1 == NULLP) + { + DU_ALLOC((*ueCbTnlCfg)->tnlCfg1, sizeof(GtpTnlCfg)); + if((*ueCbTnlCfg)->tnlCfg1 == NULLP) + { + DU_LOG("\nERROR --> DU_APP : fillTnlCfgToAddMod: Memory Alloc failed for tnlCfg1 for drbId[%d]", f1TnlCfg->drbId); + return RFAILED; + } + } + memset((*ueCbTnlCfg)->tnlCfg1, 0, sizeof(GtpTnlCfg)); + (*ueCbTnlCfg)->tnlCfg1->teId = f1TnlCfg->tnlCfg1->teId; + (*ueCbTnlCfg)->tnlCfg1->ulTnlAddress = f1TnlCfg->tnlCfg1->ulTnlAddress; + (*ueCbTnlCfg)->tnlCfg1->dlTnlAddress = f1TnlCfg->tnlCfg1->dlTnlAddress; + } + return ROK; } /******************************************************************* * - * @brief Handle UE config response from MAC - * + * @brief Processing the tunnel Request to EGTP + * * @details * - * Function : DuProcMacUeCfgRsp + * Function : duProcEgtpTunnelCfg * - * Functionality: Handle UE Config response from MAC + * Functionality: Processing the tunnel Request to EGTP * - * @params[in] Pointer to MacUeCfgRsp and Pst + * @params[in] UptnlCfg *duTnlCfg, UpTnlCfg *f1TnlCfg * @return ROK - success * RFAILED - failure * * ****************************************************************/ -uint8_t DuProcMacUeCfgRsp(Pst *pst, MacUeCfgRsp *cfgRsp) + +uint8_t duProcEgtpTunnelCfg(uint8_t ueCbIdx, UpTnlCfg *duTnlCfg, UpTnlCfg *f1TnlCfg) { - uint8_t ret = ROK; + uint8_t ret = RFAILED, delIdx; - if(cfgRsp) + if(f1TnlCfg->tnlCfg1 == NULLP) { - if(cfgRsp->result == MAC_DU_APP_RSP_OK) + DU_LOG("\nERROR --> DU_APP : Tunnel config not found"); + return ret; + } + + if(f1TnlCfg->configType == CONFIG_ADD) + { + if(duSendEgtpTnlMgmtReq(EGTP_TNL_MGMT_ADD, NULLP, f1TnlCfg->tnlCfg1) == ROK) { - if(pst->event == EVENT_MAC_UE_CREATE_RSP) + if(fillTnlCfgToAddMod(&duCb.upTnlCfg[duCb.numDrb], f1TnlCfg) == ROK) { - DU_LOG("\nDU APP : MAC UE Create Response : SUCCESS [UE IDX : %d]", cfgRsp->ueIdx); - duCb.actvCellLst[cfgRsp->cellId -1]->ueCb[cfgRsp->ueIdx -1].\ - macUeCfg.macUeCfgState = UE_CREATE_COMPLETE; + duCb.numDrb++; + ret = ROK; } - else if(pst->event == EVENT_MAC_UE_RECONFIG_RSP) - { - DU_LOG("\nDU APP : MAC UE Reconfig Response : SUCCESS [UE IDX : %d]", cfgRsp->ueIdx); - duCb.actvCellLst[cfgRsp->cellId -1]->ueCb[cfgRsp->ueIdx -1].\ - macUeCfg.macUeCfgState = UE_RECFG_COMPLETE; - if((ret = duUpdateDuUeCbCfg(cfgRsp->ueIdx, cfgRsp->cellId)) == ROK) - BuildAndSendUeCtxtRsp(cfgRsp->ueIdx, cfgRsp->cellId); - } - } - else + } + } + else if(f1TnlCfg->configType == CONFIG_MOD) + { + if(duSendEgtpTnlMgmtReq(EGTP_TNL_MGMT_MOD, duTnlCfg->tnlCfg1->teId, f1TnlCfg->tnlCfg1) == ROK) { - DU_LOG("\nDU APP : MAC UE CFG Response for EVENT[%d]: FAILURE [UE IDX : %d]", pst->event, cfgRsp->ueIdx); - if(pst->event == EVENT_MAC_UE_RECONFIG_RSP) + if(fillTnlCfgToAddMod(&duTnlCfg, f1TnlCfg) == ROK) { - //TODO: Send the failure case in Ue Context Setup Response + ret = ROK; } - ret = RFAILED; - } - DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL, cfgRsp, sizeof(MacUeCfgRsp)); + } } - else + else if(f1TnlCfg->configType == CONFIG_DEL) { - DU_LOG("\nDU APP : Received MAC Ue Config Response is NULL at DuProcMacUeCfgRsp()"); - ret = RFAILED; + if(duSendEgtpTnlMgmtReq(EGTP_TNL_MGMT_DEL, duTnlCfg->tnlCfg1->teId, f1TnlCfg->tnlCfg1) == ROK) + { + /* Free memory at drbIdx */ + DU_FREE(duTnlCfg->tnlCfg1, sizeof(GtpTnlCfg)); + DU_FREE(duTnlCfg, sizeof(UpTnlCfg)); + duCb.numDrb--; + for(delIdx = ueCbIdx; delIdx < duCb.numDrb; delIdx++) + { + /* moving all elements one index ahead */ + ret = fillTnlCfgToAddMod(&duCb.upTnlCfg[delIdx], duCb.upTnlCfg[delIdx+1]); + if(ret != ROK) + { + return ret; + } + } + } } return ret; } - -/******************************************************************* +/*********************************************************************** * - * @brief Processes UE create Req to RLC UL + * @brief Function to fill Tunnel Config + * and sends tunnel Req to EGTP + * * * @details * - * Function : duBuildAndSendUeCreateReqToRlc + * Function : duUpdateTunnelCfgDb * - * Functionality: - * Processes UE create Req to RLC UL - * - * @params[in] cellId, - * ueIdx, - * Pointer to RlcUeCfg - * @return ROK - success - * RFAILED - failure - * + * Functionality: Function to fill tunnel Config + * and sends tunnel Cfg Req to EGTP + * + * @params[in] ueIdx, cellId, DuUeCfg + * @return ROK - success + * RFAILED - failure + * + * ****************************************************************/ + +uint8_t duUpdateTunnelCfgDb(uint8_t ueIdx, uint8_t cellId, DuUeCfg *duUeCfg) +{ + uint8_t ret = ROK, drbIdx, duCbDrbIdx; + bool drbFound = false; + + /*If Add/Mod tunnels request for that DRB is successful in EGTP */ + /*then update drbId and tunnel Info in duCb */ + for(drbIdx=0; drbIdx < duUeCfg->numDrb; drbIdx++) + { + duUeCfg->upTnlInfo[drbIdx].cellId = cellId; + duUeCfg->upTnlInfo[drbIdx].ueIdx = ueIdx; + for(duCbDrbIdx = 0; duCbDrbIdx < duCb.numDrb; duCbDrbIdx++) + { + if(duCb.upTnlCfg[duCbDrbIdx]->drbId == duUeCfg->upTnlInfo[drbIdx].drbId) + { + drbFound = true; /* existing DRB */ + if(duProcEgtpTunnelCfg(duCbDrbIdx, duCb.upTnlCfg[duCbDrbIdx], &duUeCfg->upTnlInfo[drbIdx]) != ROK) + { + DU_LOG("\nERROR -> DU_APP : duUpdateTunnelCfgDb: Failed to modify tunnel req for Drb id[%d]", + duUeCfg->upTnlInfo[drbIdx].drbId); + ret = RFAILED; + } + break; + } + else + drbFound = false; + } + if(!drbFound && ret == ROK)/* new DRB to Add */ + { + if(duProcEgtpTunnelCfg(NULLP, NULLP, &duUeCfg->upTnlInfo[drbIdx]) != ROK) + { + DU_LOG("\nERROR -> DU_APP : duUpdateTunnelCfgDb: Failed to add tunnel req for Drb id[%d]", + duUeCfg->upTnlInfo[drbIdx].drbId); + ret = RFAILED; + break; + } + } + else + break; + } + return ret; +} + +/******************************************************************* + * + * @brief @brief To update DuUeCb Mac and Rlc Ue Cfg + * + * + * @details + * + * Function : duUpdateDuUeCbCfg + * + * Functionality: update DuUeCb Mac and Rlc Ue Cfg + * + * @params[in] ueIdx, cellIdx + * @return ROK - success + * RFAILED - failure + * + * ****************************************************************/ + +uint8_t duUpdateDuUeCbCfg(uint8_t ueIdx, uint8_t cellId) +{ + uint8_t ret = ROK, cellIdx = 0, crnti=0; + DuUeCb *ueCb = NULLP; + + GET_CELL_IDX(cellId, cellIdx); + + if((duCb.actvCellLst[cellIdx]->ueCb[ueIdx-1].macUeCfg. \ + macUeCfgState == UE_RECFG_COMPLETE) && + (duCb.actvCellLst[cellIdx]->ueCb[ueIdx-1].rlcUeCfg. \ + rlcUeCfgState == UE_RECFG_COMPLETE)) + { + ueCb = &duCb.actvCellLst[cellIdx]->ueCb[ueIdx-1]; + + /*Filling RLC Ue Cfg */ + ueCb->rlcUeCfg.cellId = cellId; + ueCb->rlcUeCfg.ueIdx = ueIdx; + ret = duUpdateRlcLcCfg(&ueCb->rlcUeCfg, ueCb->f1UeDb); + if(ret == ROK) + { + /*Filling MAC Ue Cfg */ + GET_CRNTI(crnti, ueIdx); + ueCb->macUeCfg.cellId = cellId; + ueCb->macUeCfg.ueIdx = ueIdx; + ueCb->macUeCfg.crnti = crnti; + ret = duUpdateMacCfg(&ueCb->macUeCfg, ueCb->f1UeDb); + if(ret == RFAILED) + DU_LOG("\nERROR --> DU APP : Failed while updating MAC LC Config at duUpdateDuUeCbCfg()"); + else + { + if(duUpdateTunnelCfgDb(ueIdx, cellId, &ueCb->f1UeDb->duUeCfg) != ROK) + { + DU_LOG("\nERROR --> DU_APP : Failed to establish tunnel in duUpdateDuUeCbCfg()"); + return RFAILED; + } + } + } + else + DU_LOG("\nERROR --> DU APP : Failed while updating RLC LC Config at duUpdateDuUeCbCfg()"); + } + else + ret = RFAILED; + return ret; +} + +/******************************************************************* + * + * @brief Handle UE config response from MAC + * + * @details + * + * Function : DuProcMacUeCfgRsp + * + * Functionality: Handle UE Config response from MAC + * + * @params[in] Pointer to MacUeCfgRsp and Pst + * @return ROK - success + * RFAILED - failure + * + * ****************************************************************/ +uint8_t DuProcMacUeCfgRsp(Pst *pst, MacUeCfgRsp *cfgRsp) +{ + uint8_t ret = ROK; + + if(cfgRsp) + { + if(cfgRsp->result == MAC_DU_APP_RSP_OK) + { + if(pst->event == EVENT_MAC_UE_CREATE_RSP) + { + DU_LOG("\nINFO --> DU APP : MAC UE Create Response : SUCCESS [UE IDX : %d]", cfgRsp->ueIdx); + duCb.actvCellLst[cfgRsp->cellId -1]->ueCb[cfgRsp->ueIdx -1].\ + macUeCfg.macUeCfgState = UE_CREATE_COMPLETE; + } + else if(pst->event == EVENT_MAC_UE_RECONFIG_RSP) + { + DU_LOG("\nINFO --> DU APP : MAC UE Reconfig Response : SUCCESS [UE IDX : %d]", cfgRsp->ueIdx); + duCb.actvCellLst[cfgRsp->cellId -1]->ueCb[cfgRsp->ueIdx -1].\ + macUeCfg.macUeCfgState = UE_RECFG_COMPLETE; + if((ret = duUpdateDuUeCbCfg(cfgRsp->ueIdx, cfgRsp->cellId)) == ROK) + { + BuildAndSendUeCtxtRsp(cfgRsp->cellId, cfgRsp->ueIdx); + } + } + } + else + { + DU_LOG("\nERROR --> DU APP : MAC UE CFG Response for EVENT[%d]: FAILURE [UE IDX : %d]", pst->event, cfgRsp->ueIdx); + if(pst->event == EVENT_MAC_UE_RECONFIG_RSP) + { + //TODO: Send the failure case in Ue Context Setup Response + } + ret = RFAILED; + } + DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL, cfgRsp, sizeof(MacUeCfgRsp)); + } + else + { + DU_LOG("\nERROR --> DU APP : Received MAC Ue Config Response is NULL at DuProcMacUeCfgRsp()"); + ret = RFAILED; + } + return ret; +} + + +/******************************************************************* + * + * @brief Processes UE create Req to RLC UL + * + * @details + * + * Function : duBuildAndSendUeCreateReqToRlc + * + * Functionality: + * Processes UE create Req to RLC UL + * + * @params[in] cellId, + * ueIdx, + * Pointer to RlcUeCfg + * @return ROK - success + * RFAILED - failure + * *****************************************************************/ uint8_t duBuildAndSendUeCreateReqToRlc(uint16_t cellId, uint8_t ueIdx,\ @@ -1898,7 +2253,7 @@ uint8_t duBuildAndSendUeCreateReqToRlc(uint16_t cellId, uint8_t ueIdx,\ ret = fillRlcUeCfg(cellId, ueIdx, NULL, duRlcUeCfg); if(ret == RFAILED) { - DU_LOG("\nDU_APP: Failed to fill Rlc Ue Cfg at duBuildAndSendUeCreateReqToRlc()"); + DU_LOG("\nERROR --> DU APP : Failed to fill Rlc Ue Cfg at duBuildAndSendUeCreateReqToRlc()"); return ret; } @@ -1910,18 +2265,18 @@ uint8_t duBuildAndSendUeCreateReqToRlc(uint16_t cellId, uint8_t ueIdx,\ memset(rlcUeCfg, 0, sizeof(RlcUeCfg)); memcpy(rlcUeCfg, duRlcUeCfg, sizeof(RlcUeCfg)); /* Processing one Ue at a time to RLC */ - DU_LOG("\nDU_APP: Sending UE create request to RLC UL"); + DU_LOG("\nDEBUG --> DU_APP: Sending UE create request to RLC UL"); ret = (*packRlcUeCreateReqOpts[pst.selector])(&pst, rlcUeCfg); if(ret == RFAILED) { - DU_LOG("\nDU_APP : Failure in sending Ue Create Req to RLC"); + DU_LOG("\nERROR --> DU_APP : Failure in sending Ue Create Req to RLC"); DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL, rlcUeCfg, sizeof(RlcUeCfg)); ret = RFAILED; } } else { - DU_LOG("\n DU_APP: Memory alloc failed at duBuildAndSendUeCreateReqToRlc()"); + DU_LOG("\n ERROR --> DU APP : Memory alloc failed at duBuildAndSendUeCreateReqToRlc()"); ret = RFAILED; } return ret; @@ -1954,35 +2309,37 @@ uint8_t DuProcRlcUeCfgRsp(Pst *pst, RlcUeCfgRsp *cfgRsp) if(cfgRsp->result == RLC_DU_APP_RSP_OK) { if(pst->event == EVENT_RLC_UE_CREATE_RSP) - { - DU_LOG("\nDU_APP: RLC UE Create Response : SUCCESS [UE IDX:%d]", cfgRsp->ueIdx); - duCb.actvCellLst[cfgRsp->cellId -1]->ueCb[cfgRsp->ueIdx -1].\ - rlcUeCfg.rlcUeCfgState = UE_CREATE_COMPLETE; - } - else if(pst->event == EVENT_RLC_UE_RECONFIG_RSP) - { - DU_LOG("\nDU_APP: RLC UE Reconfig Response : SUCCESS [UE IDX:%d]", cfgRsp->ueIdx); - duCb.actvCellLst[cfgRsp->cellId -1]->ueCb[cfgRsp->ueIdx -1].\ - rlcUeCfg.rlcUeCfgState = UE_RECFG_COMPLETE; - if((ret = duUpdateDuUeCbCfg(cfgRsp->ueIdx, cfgRsp->cellId)) == ROK) - BuildAndSendUeCtxtRsp(cfgRsp->ueIdx, cfgRsp->cellId); - } + { + DU_LOG("\nINFO --> DU_APP: RLC UE Create Response : SUCCESS [UE IDX:%d]", cfgRsp->ueIdx); + duCb.actvCellLst[cfgRsp->cellId -1]->ueCb[cfgRsp->ueIdx -1].\ + rlcUeCfg.rlcUeCfgState = UE_CREATE_COMPLETE; + } + else if(pst->event == EVENT_RLC_UE_RECONFIG_RSP) + { + DU_LOG("\nINFO --> DU_APP: RLC UE Reconfig Response : SUCCESS [UE IDX:%d]", cfgRsp->ueIdx); + duCb.actvCellLst[cfgRsp->cellId -1]->ueCb[cfgRsp->ueIdx -1].\ + rlcUeCfg.rlcUeCfgState = UE_RECFG_COMPLETE; + if((ret = duUpdateDuUeCbCfg(cfgRsp->ueIdx, cfgRsp->cellId)) == ROK) + { + BuildAndSendUeCtxtRsp(cfgRsp->cellId, cfgRsp->ueIdx); + } + } } else { - DU_LOG("\nDU_APP: RLC UE CFG Response for EVENT[%d] : FAILED [UE IDX : %d, REASON :%d]",\ - pst->event, cfgRsp->ueIdx, cfgRsp->reason); - if((pst->event == EVENT_RLC_UE_RECONFIG_RSP)) - { + DU_LOG("\nERROR --> DU_APP: RLC UE CFG Response for EVENT[%d] : FAILED [UE IDX : %d, REASON :%d]",\ + pst->event, cfgRsp->ueIdx, cfgRsp->reason); + if((pst->event == EVENT_RLC_UE_RECONFIG_RSP)) + { //TODO: update failure case in ue Context setup Response - } - ret = RFAILED; + } + ret = RFAILED; } DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL, cfgRsp, sizeof(RlcUeCfgRsp)); } else { - DU_LOG("\nDU_APP: Received RLC Ue Config Response is NULL at DuProcRlcUeCfgRsp()"); + DU_LOG("\nERROR --> DU_APP: Received RLC Ue Config Response is NULL at DuProcRlcUeCfgRsp()"); ret = RFAILED; } return ret; @@ -2018,13 +2375,13 @@ uint8_t duBuildAndSendUeReCfgReqToRlc(uint8_t cellId, uint8_t crnti, DuUeCfg *ue memset(rlcUeCfg, 0, sizeof(RlcUeCfg)); ret = fillRlcUeCfg(cellId, ueIdx, ueCfgDb, rlcUeCfg); if(ret == RFAILED) - DU_LOG("\nDU APP: Failed at duBuildAndSendUeReCfgReqToRlc()"); + DU_LOG("\nERROR --> DU APP : Failed at duBuildAndSendUeReCfgReqToRlc()"); else ret = sendUeReCfgReqToRlc(rlcUeCfg); } else { - DU_LOG("\nDU APP: Memory Alloc failed at duBuildAndSendUeReCfgReqToRlc()"); + DU_LOG("\nERROR --> DU APP : Memory Alloc failed at duBuildAndSendUeReCfgReqToRlc()"); ret = RFAILED; } return ret; @@ -2062,25 +2419,119 @@ uint8_t duBuildAndSendUeReCfgReqToMac(uint8_t cellId, uint8_t crnti, DuUeCfg *ue memset(macUeCfg, 0, sizeof(MacUeCfg)); ret = fillMacUeCfg(cellId, ueIdx, crnti, ueCfgDb, macUeCfg); if(ret == RFAILED) - DU_LOG("\nDU_APP: Failed to fill Mac Ue Cfg at duBuildAndSendUeReCfgReqToMac()"); + DU_LOG("\nERROR --> DU APP : Failed to fill Mac Ue Cfg at duBuildAndSendUeReCfgReqToMac()"); else ret = sendUeReCfgReqToMac(macUeCfg); } else { - DU_LOG("\nDU_APP: Memory alloc failed for macUeCfg at duBuildAndSendUeReCfgReqToMac()"); + DU_LOG("\nERROR --> DU APP : Memory alloc failed for macUeCfg at duBuildAndSendUeReCfgReqToMac()"); ret = RFAILED; } return ret; } +/******************************************************************* + * + * @brief Build and Send Ue context setup request + * + * @details + * + + * Function : duBuildAndSendUeContextSetupReq + * + * Functionality: + * Build and Send Ue context setup request + * + * @params[in] cellId, crnti, DuUeCfg pointer + * @return ROK - success + * RFAILED - failure + * + *****************************************************************/ + +uint8_t duBuildAndSendUeContextSetupReq(uint16_t cellId, uint16_t crnti, DuUeCfg *duUeCfg) +{ + uint8_t ret = ROK; + + DU_LOG("\nDEBUG --> DU_APP: Processing Ue Context Setup Request for cellId [%d]", cellId); + /* Filling RLC Ue Reconfig */ + ret = duBuildAndSendUeReCfgReqToRlc(cellId, crnti, duUeCfg); + if(ret == RFAILED) + DU_LOG("\nERROR --> DU APP : Failed to build ctxt setup req for RLC at duBuildAndSendUeContextSetupReq()"); + + /* Filling MAC Ue Reconfig */ + ret = duBuildAndSendUeReCfgReqToMac(cellId, crnti, duUeCfg); + if(ret == RFAILED) + DU_LOG("\nERROR --> DU APP : Failed at build ctxt setup req for MAC at duBuildAndSendUeContextSetupReq()"); + + return ret; +} + +/******************************************************************* + * + * @brief Processes DL Rsp received from RLC DL + * + * @details + * + + * Function : DuProcRlcDlRrcMsgRsp + * + * Functionality: + * Processes UE Rsp received from RLC DL + * + * @params[in] Post structure + * Pointer to RlcCfgCfm + * @return ROK - success + * RFAILED - failure + * + *****************************************************************/ +uint8_t DuProcRlcDlRrcMsgRsp(Pst *pst, RlcDlRrcMsgRsp *dlRrcMsg) +{ + uint8_t ret = ROK, ueIdx = 0; + DuUeCb *ueCb = NULLP; + + if(dlRrcMsg->state == TRANSMISSION_COMPLETE) + { + GET_UE_IDX(dlRrcMsg->crnti, ueIdx); + ueCb = &duCb.actvCellLst[dlRrcMsg->cellId -1]->ueCb[ueIdx -1]; + if(ueCb->f1UeDb && ueCb->f1UeDb->dlRrcMsgPres) + { + if(ueCb->f1UeDb->actionType == UE_CTXT_SETUP) + { + ret = duBuildAndSendUeContextSetupReq(dlRrcMsg->cellId, dlRrcMsg->crnti, &ueCb->f1UeDb->duUeCfg); + if(ret == RFAILED) + DU_LOG("\nERROR --> DU APP : Failed to process UE Context Setup Request in DuProcRlcDlRrcMsgRsp()"); + } + if(ueCb->f1UeDb->actionType == UE_CTXT_MOD) + { + ret = duBuildAndSendUeContextModReq(dlRrcMsg->cellId, dlRrcMsg->crnti, &ueCb->f1UeDb->duUeCfg); + if(ret == RFAILED) + DU_LOG("\nERROR --> DU APP : Failed to process UE Context Mod Request in DuProcRlcDlRrcMsgRsp()"); + } + if(ueCb->f1UeDb->actionType == UE_CTXT_RELEASE) + { + ret = duBuildAndSendUeDeleteReq(dlRrcMsg->cellId,dlRrcMsg->crnti); + if(ret == RFAILED) + { + DU_LOG("\nERROR --> DU APP : Failed to process UE Context Release Request in DuProcRlcDlRrcMsgRsp()"); + } + + } + } + } + else + DU_LOG("\nERROR --> DU APP : Failed to transmit DL RRC Msg"); + + DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL, dlRrcMsg, sizeof(RlcDlRrcMsgRsp)); + return ret; +} /******************************************************************* * * @brief Process UE context setup request from CU * * @details * - * Function : duProcUeContextSetupRequest + * Function : duProcUeContextSetupRequest * * Functionality: Process UE context setup request from CU * @@ -2093,7 +2544,7 @@ uint8_t duBuildAndSendUeReCfgReqToMac(uint8_t cellId, uint8_t crnti, DuUeCfg *ue uint8_t duProcUeContextSetupRequest(DuUeCb *ueCb) { uint8_t ret, cellId; - + ret = ROK; if(ueCb) { @@ -2107,35 +2558,868 @@ uint8_t duProcUeContextSetupRequest(DuUeCb *ueCb) ret = duBuildAndSendDlRrcMsgToRlc(cellId, ueCb->rlcUeCfg, ueCb->f1UeDb->dlRrcMsg); if(ret == RFAILED) { - DU_LOG("\nDU APP : Failed to send DL RRC msg in duProcUeContextSetupRequest()"); + DU_LOG("\nERROR --> DU APP : Failed to send DL RRC msg in duProcUeContextSetupRequest()"); DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL, ueCb->f1UeDb->dlRrcMsg->rrcMsgPdu,\ - ueCb->f1UeDb->dlRrcMsg->rrcMsgSize); + ueCb->f1UeDb->dlRrcMsg->rrcMsgSize); DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL, ueCb->f1UeDb->dlRrcMsg, sizeof(F1DlRrcMsg)); } } } - if(ret == ROK) + else if(ueCb->f1UeDb->actionType == UE_CTXT_SETUP) { - DU_LOG("\nDU_APP: Processing Ue Context Setup Request for cellId [%d]", cellId); - /* Filling RLC Ue Reconfig */ - ret = duBuildAndSendUeReCfgReqToRlc(cellId, ueCb->crnti, &ueCb->f1UeDb->duUeCfg); - if(ret == RFAILED) - DU_LOG("\nDU_APP: Failed to build ctxt setup req for RLC at duBuildAndSendUeReCfgReqToRlc()"); - - /* Filling MAC Ue Reconfig */ - ret = duBuildAndSendUeReCfgReqToMac(cellId, ueCb->crnti, &ueCb->f1UeDb->duUeCfg); + ret = duBuildAndSendUeContextSetupReq(cellId, ueCb->crnti, &ueCb->f1UeDb->duUeCfg); if(ret == RFAILED) - DU_LOG("\nDU_APP: Failed at build ctxt setup req for MAC at duBuildAndSendUeReCfgReqToMac()"); + { + DU_LOG("\nERROR --> DU APP : Failed to build ue context setup Req in duProcUeContextSetupRequest()"); + } } } else { //TODO: To send the failure cause in UeContextSetupRsp - DU_LOG("DU_APP: Failed to process UE CNTXT SETUP REQ at duProcUeContextSetupRequest()"); + DU_LOG("ERROR --> DU APP : Failed to process UE CNTXT SETUP REQ at duProcUeContextSetupRequest()"); + } + return ret; +} + +/******************************************************************* + * + * @brief Build and Send Ue context mod request + * + * @details + * + * + * Function : duBuildAndSendUeContextModReq + * + * Functionality: + * Build and Send Ue context mod request + * + * @params[in] cellId, crnti, DuUeCfg pointer + * @return ROK - success + * RFAILED - failure + * + *****************************************************************/ + +uint8_t duBuildAndSendUeContextModReq(uint16_t cellId, uint16_t crnti, DuUeCfg *duUeCfg) +{ + uint8_t ret = ROK; + + DU_LOG("\nDEBUG --> DU_APP: Processing Ue Context Mod Request for cellId [%d]", cellId); + /* Filling RLC Ue Reconfig */ + ret = duBuildAndSendUeReCfgReqToRlc(cellId, crnti, duUeCfg); + if(ret == RFAILED) + DU_LOG("\nERROR --> DU APP : Failed to build ctxt setup req for RLC at duBuildAndSendUeContextModReq()"); + + /* Filling MAC Ue Reconfig */ + ret = duBuildAndSendUeReCfgReqToMac(cellId, crnti, duUeCfg); + if(ret == RFAILED) + DU_LOG("\nERROR --> DU APP : Failed at build ctxt setup req for MAC at duBuildAndSendUeContextModReq()"); + + return ret; +} +/******************************************************************* + * + * @brief Processing Ue context mod request + * + * @details + * + * + * Function : duProcUeContextModReq + * + * Functionality: + * Processing Ue context mod request + * + * @params[in] DuUeCb *ueCb + * @return ROK - success + * RFAILED - failure + * + *****************************************************************/ + +uint8_t duProcUeContextModReq(DuUeCb *ueCb) +{ + uint8_t ret, cellId; + + ret = ROK; + if(ueCb) + { + cellId = duCb.actvCellLst[ueCb->f1UeDb->cellIdx]->cellId; + /* Send DL RRC msg for security Mode */ + if(ueCb->f1UeDb->dlRrcMsg) + { + if(ueCb->f1UeDb->dlRrcMsg->rrcMsgPdu) + { + /* Sending DL RRC Message to RLC */ + ret = duBuildAndSendDlRrcMsgToRlc(cellId, ueCb->rlcUeCfg, ueCb->f1UeDb->dlRrcMsg); + if(ret == RFAILED) + { + DU_LOG("\nERROR --> DU APP : Failed to send DL RRC msg in duProcUeContextModReq()"); + DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL, ueCb->f1UeDb->dlRrcMsg->rrcMsgPdu,\ + ueCb->f1UeDb->dlRrcMsg->rrcMsgSize); + DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL, ueCb->f1UeDb->dlRrcMsg, sizeof(F1DlRrcMsg)); + } + } + } + else + { + ret = duBuildAndSendUeContextModReq(cellId, ueCb->crnti, &ueCb->f1UeDb->duUeCfg); + if(ret == RFAILED) + { + DU_LOG("\nERROR --> DU APP : Failed to build ue context setup Req in duProcUeContextModReq()"); + } + } + } + else + { + //TODO: To send the failure cause in UeContextModRsp + DU_LOG("ERROR --> DU APP : Failed to process UE CNTXT MOD REQ at duProcUeContextModReq()"); + } + return ROK; +} + +/******************************************************************* +* +* @brief Function to delete Pdsch ServCellCfg +* +* @details +* +* Function : deletePdschServCellCfg +* +* Functionality: Function to delete Pdsch ServCellCfg +* +* @params[in] PdschServCellCfg *pdschServCellCfg +* @return void +* +* ****************************************************************/ + +void deletePdschServCellCfg(PdschServCellCfg *pdschServCellCfg) +{ + DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL,pdschServCellCfg->maxMimoLayers, sizeof(uint8_t)); + DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL,pdschServCellCfg->maxCodeBlkGrpPerTb, sizeof(MaxCodeBlkGrpPerTB)); + DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL,pdschServCellCfg->codeBlkGrpFlushInd, sizeof(bool)); + DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL,pdschServCellCfg->xOverhead, sizeof(PdschXOverhead)); +} + +/******************************************************************* + * +* @brief delete MacUeCfg from duCb +* +* @details +* +* Function : deleteMacUeCfg +* +* Functionality: delete MacUeCfg from duCb +* +* @params[in] Pointer to MacUeCfg +* @return ROK - success +* RFAILED - failure +* +*******************************************************************/ + +void deleteMacUeCfg(MacUeCfg *ueCfg) +{ + uint8_t lcCfgIdx; + uint8_t resrcIdx; + ServCellCfgInfo *servCellCfg; + PucchResrcInfo *resrcToAddModList; + + if(ueCfg) + { + DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL,ueCfg->ambrCfg, sizeof(AmbrCfg)); + if(ueCfg->spCellCfgPres) + { + servCellCfg = &ueCfg->spCellCfg.servCellCfg; + DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL,servCellCfg->bwpInactivityTmr, sizeof(uint8_t)); + DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL,servCellCfg->initUlBwp.pucchCfg.resrcSet,\ + sizeof(PucchResrcSetCfg)); + if(servCellCfg->initUlBwp.pucchCfg.resrc) + { + /*freeing the PucchResrcCfg*/ + for(resrcIdx= 0; resrcIdx< servCellCfg->initUlBwp.pucchCfg.resrc->resrcToAddModListCount; resrcIdx++) + { + resrcToAddModList=&servCellCfg->initUlBwp.pucchCfg.resrc->resrcToAddModList[resrcIdx]; + switch(resrcToAddModList->pucchFormat) + { + case PUCCH_FORMAT_0: + { + DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL,resrcToAddModList->PucchFormat.format0 ,\ + sizeof(PucchFormat0)); + break; + } + case PUCCH_FORMAT_1: + { + DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL,resrcToAddModList->PucchFormat.format1 ,\ + sizeof(PucchFormat1)); + break; + } + case PUCCH_FORMAT_2: + { + DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL,resrcToAddModList->PucchFormat.format2 ,\ + sizeof(PucchFormat2_3)); + break; + } + case PUCCH_FORMAT_3: + { + DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL,resrcToAddModList->PucchFormat.format3 ,\ + sizeof(PucchFormat2_3)); + break; + } + case PUCCH_FORMAT_4: + { + DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL,resrcToAddModList->PucchFormat.format4 ,\ + sizeof(PucchFormat4)); + break; + } + } + } + DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL,servCellCfg->initUlBwp.pucchCfg.resrc,\ + sizeof(PucchResrcCfg)); + } + DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL,servCellCfg->initUlBwp.pucchCfg.format1,\ + sizeof(PucchFormatCfg)); + DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL,servCellCfg->initUlBwp.pucchCfg.format2,\ + sizeof(PucchFormatCfg)); + DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL,servCellCfg->initUlBwp.pucchCfg.format3,\ + sizeof(PucchFormatCfg)); + DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL,servCellCfg->initUlBwp.pucchCfg.format4,\ + sizeof(PucchFormatCfg)); + DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL,servCellCfg->initUlBwp.pucchCfg.schedReq,\ + sizeof(PucchSchedReqCfg)); + DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL,servCellCfg->initUlBwp.pucchCfg.multiCsiCfg,\ + sizeof(PucchMultiCsiCfg)); + DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL,servCellCfg->initUlBwp.pucchCfg.spatialInfo,\ + sizeof(PucchSpatialCfg)); + DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL,servCellCfg->initUlBwp.pucchCfg.dlDataToUlAck ,\ + sizeof(PucchDlDataToUlAck)); + DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL,servCellCfg->initUlBwp.pucchCfg.powerControl,\ + sizeof(PucchPowerControl)); + deletePdschServCellCfg(&servCellCfg->pdschServCellCfg); + } + for(lcCfgIdx=0; lcCfgIdx< ueCfg->numLcs; lcCfgIdx++) + { + DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL,ueCfg->lcCfgList[lcCfgIdx].drbQos, sizeof(DrbQosInfo)); + DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL,ueCfg->lcCfgList[lcCfgIdx].snssai, sizeof(Snssai)); + } + } + memset(ueCfg, 0, sizeof(MacUeCfg)); +} + +/******************************************************************* +* +* @brief delete UE Configuration of a particular UE +* +* @details +* +* Function : deleteUeCfg +* +* Functionality: delete UE Configuration of a particular UE +* +* @params[in] uint16_t cellIdx, uint8_t ueIdx +* @return ROK - success +* RFAILED - failure +* +* ****************************************************************/ +uint8_t deleteUeCfg(uint16_t cellIdx, uint8_t ueIdx) +{ + DuUeCb *ueCb = NULLP; + if(duCb.actvCellLst[cellIdx] != NULLP) + { + if((duCb.actvCellLst[cellIdx]->ueCb[ueIdx-1].macUeCfg.macUeCfgState == UE_DELETE_COMPLETE)\ + &&(duCb.actvCellLst[cellIdx]->ueCb[ueIdx-1].rlcUeCfg.rlcUeCfgState == UE_DELETE_COMPLETE)) + { + ueCb = &duCb.actvCellLst[cellIdx]->ueCb[ueIdx-1]; + deleteMacUeCfg(&ueCb->macUeCfg); + deleteRlcUeCfg(&ueCb->rlcUeCfg); + if(ueCb->f1UeDb !=NULLP) + { + freeF1UeDb(ueCb->f1UeDb); + } + duCb.actvCellLst[cellIdx]->numActvUes--; + memset(ueCb, 0, sizeof(DuUeCb)); + } + else + { + return RFAILED; + } + } + else + { + DU_LOG("\nERROR --> DU APP : deleteUeCfg(): CellIdx[%d] is not found", cellIdx); + return RFAILED; + } + return ROK; +} + + +/******************************************************************* +* +* @brief Handle UE delete response from MAC +* +* @details +* +* Function : DuProcMacUeDeleteRsp +* +* Functionality: Handle UE delete response from MAC +* +* @params[in] Pointer to MacUeDeleteRsp and Pst +* @return ROK - success +* RFAILED - failure +* +* ****************************************************************/ + +uint8_t DuProcMacUeDeleteRsp(Pst *pst, MacUeDeleteRsp *deleteRsp) +{ + uint8_t ret =ROK; + uint16_t cellIdx=0; + + if(deleteRsp) + { + if(deleteRsp->result == SUCCESS) + { + DU_LOG("\nINFO --> DU APP : MAC UE Delete Response : SUCCESS [UE IDX : %d]", deleteRsp->ueId); + GET_CELL_IDX(deleteRsp->cellId, cellIdx); + if(duCb.actvCellLst[cellIdx]) + { + duCb.actvCellLst[cellIdx]->ueCb[deleteRsp->ueId -1].macUeCfg.macUeCfgState = UE_DELETE_COMPLETE; + if(sendUeDeleteReqToRlc(deleteRsp->cellId, deleteRsp->ueId) == RFAILED) + { + DU_LOG("\nERROR --> DU APP : DuProcMacUeDeleteRsp():Failed to build UE delete req for RLC "); + ret = RFAILED; + } + } + } + else + { + DU_LOG("\nERROR --> DU APP : DuProcMacUeDeleteRsp(): MAC UE Delete Response : FAILURE [UE IDX : %d]",\ + deleteRsp->ueId); + 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 + * + * *****************************************************************/ + +uint8_t DuProcRlcUeDeleteRsp(Pst *pst, RlcUeDeleteRsp *delRsp) +{ + uint8_t ueId = 0, ret = ROK; + uint16_t cellIdx = 0; + uint32_t gnbCuUeF1apId=0, gnbDuUeF1apId =0; + + if(delRsp) + { + ueId = delRsp->ueId; + GET_CELL_IDX(delRsp->cellId, cellIdx); + + if(delRsp->result == SUCCESSFUL) + { + DU_LOG("\nINFO --> DU_APP: RLC UE Delete Response : SUCCESS [UE IDX:%d]", ueId); + if(duCb.actvCellLst[cellIdx]!=NULLP) + { + duCb.actvCellLst[cellIdx]->ueCb[ueId-1].rlcUeCfg.rlcUeCfgState = UE_DELETE_COMPLETE; + gnbCuUeF1apId = duCb.actvCellLst[cellIdx]->ueCb[ueId-1].gnbDuUeF1apId; + gnbDuUeF1apId = duCb.actvCellLst[cellIdx]->ueCb[ueId-1].gnbCuUeF1apId; + if(deleteUeCfg(cellIdx, ueId) == ROK) + { + ret = BuildAndSendUeContextReleaseComplete(delRsp->cellId, gnbCuUeF1apId, gnbDuUeF1apId); + if(ret != ROK) + { + DU_LOG("\nERROR --> DU APP : DuProcMacUeDeleteRsp(): failed to send UE context release complete"); + } + } + } + } + else + { + DU_LOG("\nERROR --> DU_APP: RLC UE Delete Response : FAILED [UE IDX:%d]", ueId); + ret = RFAILED; + } + DU_FREE_SHRABL_BUF(pst->region, pst->pool, delRsp, sizeof(RlcUeDeleteRsp)); + + } + return ret; +} + +/******************************************************************* + * + * @brief Sending UE Delete Req To Mac +* +* @details +* +* Function : sendUeDeleteReqToMac +* +* Functionality: +* sending UE Delete Req To Mac +* +* @params[in] cellId, ueId, crnti +* @return ROK - success +* RFAILED - failure +* +*****************************************************************/ + +uint8_t sendUeDeleteReqToMac(uint16_t cellId, uint8_t ueId, uint16_t crnti) +{ + Pst pst; + uint8_t ret=ROK; + MacUeDelete *ueDelete = NULLP; + + DU_ALLOC_SHRABL_BUF(ueDelete, sizeof(MacUeDelete)); + if(ueDelete) + { + ueDelete->cellId = cellId; + ueDelete->ueId = ueId; + ueDelete->crnti = crnti; + FILL_PST_DUAPP_TO_MAC(pst, EVENT_MAC_UE_DELETE_REQ); + + DU_LOG("\nDEBUG --> DU_APP: Sending UE delete Request to MAC "); + ret = (*packMacUeDeleteReqOpts[pst.selector])(&pst, ueDelete); + if(ret == RFAILED) + { + DU_LOG("\nERROR --> DU_APP: sendUeDeleteReqToMac(): Failed to send UE delete Req to MAC"); + DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL, ueDelete, sizeof(MacUeDelete)); + } + } + else + { + DU_LOG("\nERROR --> DU_APP: sendUeDeleteReqToMac(): Failed to allocate memory"); + ret = RFAILED; + } + return ret; +} + +/******************************************************************* + * + * @brief Sending UE Delete Req To Rlc + * + * @details + * + * Function : sendUeDeleteReqToRlc + * + * Functionality: + * Sending UE Delete Req To Rlc + * + * @params[in] cellId, ueId + * @return ROK - success + * RFAILED - failure + * + *****************************************************************/ + +uint8_t sendUeDeleteReqToRlc(uint16_t cellId, uint8_t ueId) +{ + uint8_t ret; + Pst pst; + RlcUeDelete *ueDelete; + + DU_ALLOC_SHRABL_BUF(ueDelete, sizeof(RlcUeDelete)); + if(ueDelete !=NULLP) + { + ueDelete->cellId = cellId; + ueDelete->ueId = ueId; + FILL_PST_DUAPP_TO_RLC(pst, RLC_UL_INST, EVENT_RLC_UE_DELETE_REQ); + + ret = (*packRlcUeDeleteReqOpts[pst.selector])(&pst, ueDelete); + if(ret == RFAILED) + { + DU_LOG("\nERROR --> DU_APP : sendUeDeleteReqToRlc():Failed to send UE Delete Req to RLC"); + DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL, ueDelete, sizeof(RlcUeDelete)); + } + } + else + { + DU_LOG("\nERROR --> DU_APP: sendUeDeleteReqToRlc():Memory allocation failed"); + ret = RFAILED; + } + return ret; +} + +/******************************************************************* + * + * @brief DU processes UE delete req from CU and sends to MAC and RLC + * + * @details + * + * Function : duBuildAndSendUeDeleteReq + * + * Functionality: DU processes UE delete req from CU and sends to MAC + * and RLC + * + * @params[in] cellId, crnti + * @return ROK - success + * RFAILED - failure + * + * ****************************************************************/ + +uint8_t duBuildAndSendUeDeleteReq(uint16_t cellId, uint16_t crnti) +{ + uint8_t ueId =0; + uint16_t cellIdx = 0; + + DU_LOG("\nDEBUG --> DU_APP: Processing UE Delete Request "); + GET_CELL_IDX(cellId, cellIdx); + GET_UE_IDX(crnti, ueId); + + if(duCb.actvCellLst[cellIdx] != NULLP) + { + if(crnti != duCb.actvCellLst[cellIdx]->ueCb[ueId - 1].crnti) + { + DU_LOG("\nERROR --> DU APP : duBuildAndSendUeDeleteReq(): CRNTI [%d] not found", crnti); + return RFAILED; + } + + if(sendUeDeleteReqToMac(cellId, ueId, crnti) == RFAILED) + { + DU_LOG("\nERROR --> DU APP : duBuildAndSendUeDeleteReq(): Failed to build UE delete req for MAC "); + return RFAILED; + } + } + else + { + DU_LOG("\nERROR --> DU APP : duBuildAndSendUeDeleteReq(): 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]); + gCellStatus = CELL_DOWN; + 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 : DuProcMacCellDeleteRsp(): MAC CELL Delete Response : FAILED\ + [CELL IDX : %d]", deleteRsp->cellId); + ret = RFAILED; + } + DU_FREE_SHRABL_BUF(pst->region, pst->pool, deleteRsp, sizeof(MacCellDeleteRsp)); + } + 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 : duSendCellDeletReq + * + * Functionality: DU process Cell Delete Req to MAC + * + * @params[in] uint16_t cellId + * @return ROK - success + * RFAILED - failure + * + * ****************************************************************/ + +uint8_t duSendCellDeletReq(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) + { + DU_LOG("\nERROR --> DU APP : duSendCellDeletReq(): CellId[%d] is not found", cellId); + return RFAILED; + } + + if(duCb.actvCellLst[cellIdx]->cellId != cellId) + { + DU_LOG("\nERROR --> DU APP : duSendCellDeletReq(): CellId[%d] is not found", cellId); + return RFAILED; + + } + + if(duCb.actvCellLst[cellIdx]->cellStatus != DELETION_IN_PROGRESS) + { + DU_LOG("\nERROR --> DU APP : duSendCellDeletReq(): CellStatus[%d] of cellId[%d] is not correct.\ + Expected CellStatus is DELETION_IN_PROGRESS",duCb.actvCellLst[cellIdx]->cellStatus, cellId); + return RFAILED; + } + + if(duCb.actvCellLst[cellIdx]->numActvUes) + { + DU_LOG("\nERROR --> DU APP : duSendCellDeletReq(): Active UEs still present in cellId[%d].\ + Failed to delete cell", cellId); + return RFAILED; + } + + if(duBuildAndSendMacCellStop(cellId) == RFAILED) + { + DU_LOG("\nERROR --> DU APP : duSendCellDeletReq(): Failed to build and send cell stop request to MAC for\ + cellId[%d]",cellId); + return RFAILED; + } + + if(sendCellDeleteReqToMac(cellId) == RFAILED) + { + DU_LOG("\nERROR --> DU APP : duSendCellDeletReq(): Failed to send Cell delete req to MAC for\ + cellId[%d]",cellId); + return RFAILED; + } + + return ROK; +} +/******************************************************************* +* +* @brief Du process Ue Context Release Command +* +* @details +* +* Function : duProcUeContextReleaseCommand +* +* Functionality: Du process Ue Context Release Command +* +* @params[in] DuUeCb *duUeCb +* @return ROK - success +* RFAILED - failure +* +* ****************************************************************/ +uint8_t duProcUeContextReleaseCommand(DuUeCb *duUeCb) +{ + uint8_t ret =ROK, ueIdx=0; + uint16_t cellId=0,crnti =0; + if(duUeCb == NULLP) + { + DU_LOG("\nERROR --> DU APP : duProcUeContextReleaseCommand() : duUeCb is null"); + return RFAILED; + } + if(duUeCb->f1UeDb == NULLP) + { + DU_LOG("\nERROR --> DU APP : duProcUeContextReleaseCommand() : f1UeDb is null"); + return RFAILED; + } + + cellId = duCb.actvCellLst[duUeCb->f1UeDb->cellIdx]->cellId; + crnti = duUeCb->crnti; + /* Send DL RRC msg for RRC release */ + if(duUeCb->f1UeDb->dlRrcMsg) + { + if(duUeCb->f1UeDb->dlRrcMsg->rrcMsgPdu != NULLP) + { + ret = duBuildAndSendDlRrcMsgToRlc(cellId, duCb.actvCellLst[duUeCb->f1UeDb->cellIdx]->ueCb[ueIdx].rlcUeCfg,\ + duUeCb->f1UeDb->dlRrcMsg); + if(ret == RFAILED) + { + DU_LOG("\nERROR --> DU APP : duProcUeContextReleaseCommand() : Failed to send DL RRC msg"); + DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL, duUeCb->f1UeDb->dlRrcMsg->rrcMsgPdu,\ + duUeCb->f1UeDb->dlRrcMsg->rrcMsgSize); + DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL, duUeCb->f1UeDb->dlRrcMsg, sizeof(F1DlRrcMsg)); + } + } + } + else + { + ret = duBuildAndSendUeDeleteReq(cellId,crnti); + if(ret == RFAILED) + { + DU_LOG("\nERROR --> DU APP : duProcUeContextReleaseCommand(): Failed to build and send Ue Delete request"); + } } return ret; } /********************************************************************** End of file - ***********************************************************************/ +***********************************************************************/