X-Git-Url: https://gerrit.o-ran-sc.org/r/gitweb?a=blobdiff_plain;f=src%2Fdu_app%2Fdu_ue_mgr.c;h=7900c625bd161710b6da2b332e2927860a56ebaf;hb=0ba7b600f85b2975e1d60e5b8ad1523349b5f396;hp=39569c92323d58908a2cf34e51eeefe636673234;hpb=62605166db94fd7d52f32de84dea8c7006e0f4c5;p=o-du%2Fl2.git diff --git a/src/du_app/du_ue_mgr.c b/src/du_app/du_ue_mgr.c index 39569c923..7900c625b 100644 --- a/src/du_app/du_ue_mgr.c +++ b/src/du_app/du_ue_mgr.c @@ -29,14 +29,14 @@ #include "du_app_mac_inf.h" #include "du_app_rlc_inf.h" #include "du_cfg.h" -#include "du_utils.h" #include "du_mgr.h" +#include "du_utils.h" #include "du_f1ap_msg_hdl.h" #include "du_ue_mgr.h" #ifdef O1_ENABLE #include "AlarmInterface.h" -#include "ConfigInterface.h" +#include "CmInterface.h" #endif DuMacDlCcchInd packMacDlCcchIndOpts[] = @@ -81,11 +81,25 @@ DuMacUeReconfigReq packMacUeReconfigReqOpts[] = packDuMacUeReconfigReq /* Light weight-loose coupling */ }; +DuMacRachRsrcReq packMacRachRsrcReqOpts[] = +{ + packDuMacRachRsrcReq, /* Loose coupling */ + MacProcRachRsrcReq, /* Tight coupling */ + packDuMacRachRsrcReq /* Light weight-loose coupling */ +}; + DuRlcDlUserDataToRlcFunc duSendRlcDlUserDataToRlcOpts[] = { - packRlcDlUserDataToRlc, /* Loose coupling */ + packRlcDlUserDataToRlc, /* Loose coupling */ RlcProcDlUserDataTransfer, /* Tight coupling */ - packRlcDlUserDataToRlc /* Light weight-loose coupling */ + packRlcDlUserDataToRlc /* Light weight-loose coupling */ +}; + +DuMacRachRsrcRel packMacRachRsrcRelOpts[] = +{ + packDuMacRachRsrcRel, /* Loose coupling */ + MacProcRachRsrcRel, /* Tight coupling */ + packDuMacRachRsrcRel /* Light weight-loose coupling */ }; DuMacUeDeleteReq packMacUeDeleteReqOpts[] = @@ -102,6 +116,43 @@ DuRlcUeDeleteReq packRlcUeDeleteReqOpts[] = packDuRlcUeDeleteReq /* Light weight-loose coupling */ }; +/****************************************************************** + * + * @brief Function to return Drb LcId + * + * @details + * + * Function : getDrbLcId + * + * Functionality: Function to return Drb LcId + * + * @params[in] drbBitMap + * + * Returns: lcId - SUCCESS + * RFAILED - FAILURE + *****************************************************************/ + +uint8_t getDrbLcId(uint32_t *drbBitMap) +{ + uint8_t bitMask = 1, bitPos = 0; + bitPos = MIN_DRB_LCID; + + while(bitPos <= MAX_DRB_LCID) + { + if((*drbBitMap & (bitMask << bitPos)) == 0) + { + *drbBitMap = ((bitMask << bitPos)| *drbBitMap); + return bitPos; + } + else + { + bitPos++; + } + } + DU_LOG("\nERROR --> DU_APP: Max LC Reached in getDrbLcId()"); + return RFAILED; +} + /******************************************************************* * * @brief Function to fillDlUserDataInfo @@ -123,19 +174,20 @@ DuRlcUeDeleteReq packRlcUeDeleteReqOpts[] = uint8_t fillDlUserDataInfo(uint32_t teId, RlcDlUserDataInfo *dlDataMsgInfo) { - uint8_t drbIdx; + uint8_t teIdx = 0; - for(drbIdx = 0; drbIdx < duCb.numDrb; drbIdx++) + /*Traversing the duCb to find the CellId, UeId, LCID corresponding to TEID*/ + for(teIdx = 0; teIdx < duCb.numTeId; teIdx++) { - if(duCb.upTnlCfg[drbIdx] && (duCb.upTnlCfg[drbIdx]->tnlCfg1 != NULLP)) + if(duCb.upTnlCfg[teIdx] && (duCb.upTnlCfg[teIdx]->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; - } + if(duCb.upTnlCfg[teIdx]->tnlCfg1->teId == teId) + { + dlDataMsgInfo->cellId = duCb.upTnlCfg[teIdx]->cellId; + dlDataMsgInfo->ueId = duCb.upTnlCfg[teIdx]->ueId; + dlDataMsgInfo->rbId = duCb.upTnlCfg[teIdx]->drbId; + return ROK; + } } } return RFAILED; @@ -183,7 +235,8 @@ uint8_t duBuildAndSendDlUserDataToRlc(uint16_t msgLen, EgtpMsg *egtpMsg) { /* 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"); + DU_LOG("\nDEBUG --> DU_APP : Sending User Data Msg to RLC [TEID, nPDU]:[%d, %d]\n",\ + egtpMsg->msgHdr.teId, egtpMsg->msgHdr.nPdu.val); ret = (*duSendRlcDlUserDataToRlcOpts[pst.selector])(&pst, dlDataMsgInfo); } if(ret != ROK) @@ -230,7 +283,6 @@ uint8_t duHdlEgtpDlData(EgtpMsg *egtpMsg) 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; @@ -348,7 +400,7 @@ uint8_t duBuildAndSendDlRrcMsgToRlc(uint16_t cellId, RlcUeCfg ueCfg, F1DlRrcMsg /* Filling up the RRC msg info */ dlRrcMsgInfo->cellId = cellId; - dlRrcMsgInfo->ueIdx = ueCfg.ueIdx; + dlRrcMsgInfo->ueId = ueCfg.ueId; for(lcIdx = 0; lcIdx <= MAX_NUM_LC; lcIdx++) { if(ueCfg.rlcLcCfg[lcIdx].lcId == f1DlRrcMsg->srbId) @@ -412,7 +464,7 @@ uint8_t duProcDlRrcMsg(F1DlRrcMsg *dlRrcMsg) { if(dlRrcMsg->gnbDuUeF1apId == duCb.ueCcchCtxt[ueIdx].gnbDuUeF1apId) { - ueCcchCtxtFound = true; + ueCcchCtxtFound = true; crnti = duCb.ueCcchCtxt[ueIdx].crnti; cellId = duCb.ueCcchCtxt[ueIdx].cellId; break; @@ -424,80 +476,58 @@ uint8_t duProcDlRrcMsg(F1DlRrcMsg *dlRrcMsg) ret = duBuildAndSendDlCcchInd(&cellId, &crnti, RRC_SETUP, dlRrcMsg->rrcMsgSize, dlRrcMsg->rrcMsgPdu); if(ret == RFAILED) { - DU_LOG("\nERROR --> DU APP : Failed to build DlCcch Ind at procDlRrcMsgTrans()"); + DU_LOG("\nERROR --> DU APP : Failed to build DlCcch Ind at procDlRrcMsgTrans()"); } else { - if(duCb.actvCellLst[cellId-1]->numActvUes < MAX_NUM_UE) - { - ret = duCreateUeCb(&duCb.ueCcchCtxt[ueIdx], dlRrcMsg->gnbCuUeF1apId); - if(ret == RFAILED) - { - DU_LOG("\nERROR --> DU APP : Failed to createUeCb for cellId [%d] at procDlRrcMsgTrans()", \ - duCb.ueCcchCtxt[ueIdx].cellId); - } - } - else - { - DU_LOG("\nERROR --> DU_APP: Max Active UEs has reached at procDlRrcMsgTrans()"); - ret = RFAILED; - } + if(duCb.actvCellLst[cellId-1] == NULLP) + { + DU_LOG("\nERROR --> DU APP : cellId [%d] does not exist", cellId); + ret = RFAILED; + } + if(duCb.actvCellLst[cellId-1]->numActvUes < MAX_NUM_UE) + { + ret = duCreateUeCb(&duCb.ueCcchCtxt[ueIdx], dlRrcMsg->gnbCuUeF1apId); + if(ret == RFAILED) + { + DU_LOG("\nERROR --> DU APP : Failed to createUeCb for cellId [%d] at procDlRrcMsgTrans()", \ + duCb.ueCcchCtxt[ueIdx].cellId); + } + } + else + { + DU_LOG("\nERROR --> DU_APP: Max Active UEs has reached at procDlRrcMsgTrans()"); + ret = RFAILED; + } } } else { for(cellIdx = 0; cellIdx < MAX_NUM_CELL; cellIdx++) { - for(ueIdx = 0 ; ueIdx < MAX_NUM_UE; ueIdx++) - { - if((dlRrcMsg->gnbCuUeF1apId == duCb.actvCellLst[cellIdx]->ueCb[ueIdx].gnbCuUeF1apId) - && (dlRrcMsg->gnbDuUeF1apId == duCb.actvCellLst[cellIdx]->ueCb[ueIdx].gnbDuUeF1apId)) - { - ueFound = true; - ret = duBuildAndSendDlRrcMsgToRlc(duCb.actvCellLst[cellIdx]->cellId, \ - duCb.actvCellLst[cellIdx]->ueCb[ueIdx].rlcUeCfg, dlRrcMsg); - break; - } - } - if(ueFound) - break; + for(ueIdx = 0 ; ueIdx < MAX_NUM_UE; ueIdx++) + { + if(duCb.actvCellLst[cellIdx] && (dlRrcMsg->gnbCuUeF1apId == duCb.actvCellLst[cellIdx]->ueCb[ueIdx].gnbCuUeF1apId) + && (dlRrcMsg->gnbDuUeF1apId == duCb.actvCellLst[cellIdx]->ueCb[ueIdx].gnbDuUeF1apId)) + { + ueFound = true; + ret = duBuildAndSendDlRrcMsgToRlc(duCb.actvCellLst[cellIdx]->cellId, \ + duCb.actvCellLst[cellIdx]->ueCb[ueIdx].rlcUeCfg, dlRrcMsg); + break; + } + } + if(ueFound) + break; } if(!ueFound) - ret = RFAILED; + { + DU_LOG("\nERROR --> DU_APP: UE ID [%d] not found", dlRrcMsg->gnbDuUeF1apId); + ret = RFAILED; + } } return ret; } -/****************************************************************** - * - * @brief Generates GNB DU Ue F1AP ID - * - * @details - * - * Function : genGnbDuUeF1apId - * - * Functionality: Generates GNB DU Ue F1AP ID - * - * @params[in] void - * @return gnbDuF1apId - * - * ****************************************************************/ -int32_t genGnbDuUeF1apId(uint8_t cellId) -{ - uint8_t cellIdx =0; - - GET_CELL_IDX(cellId, cellIdx); - if(duCb.actvCellLst[cellIdx]) - { - return ++duCb.actvCellLst[cellIdx]->gnbDuUeF1apIdGenerator; - } - else - { - DU_LOG("ERROR --> DU_APP : genGnbDuUeF1apId(): CellId[%d] does not exist", cellId); - } - return -1; -} - /****************************************************************** * * @brief Processes UL CCCH Ind recvd from MAC @@ -519,14 +549,16 @@ uint8_t duProcUlCcchInd(UlCcchIndInfo *ulCcchIndInfo) uint8_t ret = ROK; int32_t gnbDuUeF1apId = 0; - gnbDuUeF1apId = genGnbDuUeF1apId(ulCcchIndInfo->cellId); - - if(gnbDuUeF1apId == -1) + if(ulCcchIndInfo->crnti) { - DU_LOG("ERROR --> DU_APP : duProcUlCcchInd(): Received cellId[%d] does not exist", ulCcchIndInfo->cellId); + GET_UE_ID(ulCcchIndInfo->crnti, gnbDuUeF1apId); + } + else + { + DU_LOG("\nERROR --> DU_APP : Received invalid CRNTI [%d] ", ulCcchIndInfo->crnti); return RFAILED; } - + /* Store Ue mapping */ duCb.ueCcchCtxt[duCb.numUe].gnbDuUeF1apId = (uint32_t)gnbDuUeF1apId; duCb.ueCcchCtxt[duCb.numUe].crnti = ulCcchIndInfo->crnti; @@ -581,102 +613,100 @@ void fillDefaultUlLcCfg(UlLcCfg *ulLcCfg) * Functionality: Fills Initial DL Bandwidth Part * * @params[in] InitialDlBwp *initDlBwp - * @return void + * @return ROK - success + * RFAILED - failure * *****************************************************************/ -void fillDefaultInitDlBwp(InitialDlBwp *initDlBwp) +uint8_t fillDefaultInitDlBwp(InitialDlBwp *initDlBwp) { uint8_t idx = 0; uint8_t freqDomainResource[FREQ_DOM_RSRC_SIZE] = {0}; uint8_t coreset0EndPrb, coreset1StartPrb, coreset1NumPrb; - if(initDlBwp) { /* Filling PDCCH Config */ initDlBwp->pdcchPresent = TRUE; if(initDlBwp->pdcchPresent) { - initDlBwp->pdcchCfg.numCRsetToAddMod = PDCCH_CTRL_RSRC_SET_ONE_ID; - memset(initDlBwp->pdcchCfg.cRSetToAddModList, 0, MAX_NUM_CRSET); - if(initDlBwp->pdcchCfg.numCRsetToAddMod <= MAX_NUM_CRSET) - { - initDlBwp->pdcchCfg.cRSetToAddModList[idx].cRSetId = \ - PDCCH_CTRL_RSRC_SET_ONE_ID; - memset(initDlBwp->pdcchCfg.cRSetToAddModList[idx].freqDomainRsrc, 0,\ - FREQ_DOM_RSRC_SIZE); - coreset0EndPrb = CORESET0_END_PRB; - coreset1StartPrb = coreset0EndPrb +6; - coreset1NumPrb = CORESET1_NUM_PRB; - /* calculate the PRBs */ - freqDomRscAllocType0(((coreset1StartPrb)/6), (coreset1NumPrb/6), freqDomainResource); - memcpy(initDlBwp->pdcchCfg.cRSetToAddModList[idx].freqDomainRsrc, freqDomainResource, - FREQ_DOM_RSRC_SIZE); - - initDlBwp->pdcchCfg.cRSetToAddModList[idx].duration = \ - PDCCH_CTRL_RSRC_SET_ONE_DURATION; - initDlBwp->pdcchCfg.cRSetToAddModList[idx].cceRegMappingType = \ - CCE_REG_MAPPINGTYPE_PR_NONINTERLEAVED; - initDlBwp->pdcchCfg.cRSetToAddModList[idx].precoderGranularity = \ - ALL_CONTIGUOUS_RBS; - initDlBwp->pdcchCfg.cRSetToAddModList[idx].dmrsScramblingId = \ - SCRAMBLING_ID; - } - initDlBwp->pdcchCfg.numCRsetToRel = 0; - /* Filling Serach Space */ - initDlBwp->pdcchCfg.numSearchSpcToAddMod = PDCCH_CTRL_RSRC_SET_ONE_ID; - memset(initDlBwp->pdcchCfg.searchSpcToAddModList, 0, MAX_NUM_CRSET); - if(initDlBwp->pdcchCfg.numSearchSpcToAddMod <= MAX_NUM_CRSET) - { - initDlBwp->pdcchCfg.searchSpcToAddModList[idx].searchSpaceId =\ - PDCCH_SRCH_SPC_TWO_ID; - initDlBwp->pdcchCfg.searchSpcToAddModList[idx].cRSetId = \ - PDCCH_CTRL_RSRC_SET_ONE_ID; - initDlBwp->pdcchCfg.searchSpcToAddModList[idx].\ - mSlotPeriodicityAndOffset = SLOTPERIODICITYANDOFFSET_PR_SL1; - memset(initDlBwp->pdcchCfg.searchSpcToAddModList[idx].mSymbolsWithinSlot, 0,\ - MONITORING_SYMB_WITHIN_SLOT_SIZE); - initDlBwp->pdcchCfg.searchSpcToAddModList[idx].mSymbolsWithinSlot[idx] =\ - PDCCH_SYMBOL_WITHIN_SLOT; - initDlBwp->pdcchCfg.searchSpcToAddModList[idx].numCandidatesAggLevel1 =\ - AGGREGATIONLEVEL_N8; - initDlBwp->pdcchCfg.searchSpcToAddModList[idx].numCandidatesAggLevel2 =\ - AGGREGATIONLEVEL_N8; - initDlBwp->pdcchCfg.searchSpcToAddModList[idx].numCandidatesAggLevel4 =\ - AGGREGATIONLEVEL_N4; - initDlBwp->pdcchCfg.searchSpcToAddModList[idx].numCandidatesAggLevel8 =\ - AGGREGATIONLEVEL_N2; - initDlBwp->pdcchCfg.searchSpcToAddModList[idx].numCandidatesAggLevel16 =\ - AGGREGATIONLEVEL_N1; - initDlBwp->pdcchCfg.searchSpcToAddModList[idx].searchSpaceType = \ - SEARCHSPACETYPE_PR_UE_SPECIFIC; - initDlBwp->pdcchCfg.searchSpcToAddModList[idx].ueSpecificDciFormat =\ - PDCCH_SRCH_SPC_TWO_UE_SPEC_DCI_FORMAT; - - initDlBwp->pdcchCfg.numSearchSpcToRel = 0; + initDlBwp->pdcchCfg.numCRsetToAddMod = PDCCH_CTRL_RSRC_SET_ONE_ID; + memset(initDlBwp->pdcchCfg.cRSetToAddModList, 0, MAX_NUM_CRSET); + if(initDlBwp->pdcchCfg.numCRsetToAddMod <= MAX_NUM_CRSET) + { + initDlBwp->pdcchCfg.cRSetToAddModList[idx].cRSetId = PDCCH_CTRL_RSRC_SET_ONE_ID; + memset(initDlBwp->pdcchCfg.cRSetToAddModList[idx].freqDomainRsrc, 0, FREQ_DOM_RSRC_SIZE); + coreset0EndPrb = CORESET0_END_PRB; + coreset1StartPrb = coreset0EndPrb +6; + coreset1NumPrb = CORESET1_NUM_PRB; + /* calculate the PRBs */ + fillCoresetFeqDomAllocMap(((coreset1StartPrb)/6), (coreset1NumPrb/6), freqDomainResource); + memcpy(initDlBwp->pdcchCfg.cRSetToAddModList[idx].freqDomainRsrc, freqDomainResource, FREQ_DOM_RSRC_SIZE); + + initDlBwp->pdcchCfg.cRSetToAddModList[idx].duration = PDCCH_CTRL_RSRC_SET_ONE_DURATION; + initDlBwp->pdcchCfg.cRSetToAddModList[idx].cceRegMappingType = CCE_REG_MAPPINGTYPE_PR_NONINTERLEAVED; + initDlBwp->pdcchCfg.cRSetToAddModList[idx].precoderGranularity = ALL_CONTIGUOUS_RBS; + initDlBwp->pdcchCfg.cRSetToAddModList[idx].dmrsScramblingId = SCRAMBLING_ID; + } + initDlBwp->pdcchCfg.numCRsetToRel = 0; - } + /* Filling Serach Space */ + initDlBwp->pdcchCfg.numSearchSpcToAddMod = PDCCH_CTRL_RSRC_SET_ONE_ID; + memset(initDlBwp->pdcchCfg.searchSpcToAddModList, 0, MAX_NUM_CRSET); + if(initDlBwp->pdcchCfg.numSearchSpcToAddMod <= MAX_NUM_CRSET) + { + initDlBwp->pdcchCfg.searchSpcToAddModList[idx].searchSpaceId = PDCCH_SRCH_SPC_TWO_ID; + initDlBwp->pdcchCfg.searchSpcToAddModList[idx].cRSetId = PDCCH_CTRL_RSRC_SET_ONE_ID; + initDlBwp->pdcchCfg.searchSpcToAddModList[idx].mSlotPeriodicityAndOffset = SLOTPERIODICITYANDOFFSET_PR_SL1; + memset(initDlBwp->pdcchCfg.searchSpcToAddModList[idx].mSymbolsWithinSlot, 0, MONITORING_SYMB_WITHIN_SLOT_SIZE); + initDlBwp->pdcchCfg.searchSpcToAddModList[idx].mSymbolsWithinSlot[idx] = PDCCH_SYMBOL_WITHIN_SLOT; + initDlBwp->pdcchCfg.searchSpcToAddModList[idx].numCandidatesAggLevel1 = AGGREGATIONLEVEL_N8; + initDlBwp->pdcchCfg.searchSpcToAddModList[idx].numCandidatesAggLevel2 = AGGREGATIONLEVEL_N8; + initDlBwp->pdcchCfg.searchSpcToAddModList[idx].numCandidatesAggLevel4 = AGGREGATIONLEVEL_N4; + initDlBwp->pdcchCfg.searchSpcToAddModList[idx].numCandidatesAggLevel8 = AGGREGATIONLEVEL_N2; + initDlBwp->pdcchCfg.searchSpcToAddModList[idx].numCandidatesAggLevel16 = AGGREGATIONLEVEL_N1; + initDlBwp->pdcchCfg.searchSpcToAddModList[idx].searchSpaceType = SEARCHSPACETYPE_PR_UE_SPECIFIC; + initDlBwp->pdcchCfg.searchSpcToAddModList[idx].ueSpecificDciFormat = PDCCH_SRCH_SPC_TWO_UE_SPEC_DCI_FORMAT; + } + initDlBwp->pdcchCfg.numSearchSpcToRel = 0; } + /* Filling PDSCH Config */ initDlBwp->pdschPresent = TRUE; if(initDlBwp->pdschPresent) { - initDlBwp->pdschCfg.dmrsDlCfgForPdschMapTypeA.addPos = ADDITIONALPOSITION_POS0; - initDlBwp->pdschCfg.resourceAllocType = RESOURCEALLOCATION_TYPE1; - initDlBwp->pdschCfg.numTimeDomRsrcAlloc = 1; - initDlBwp->pdschCfg.timeDomRsrcAllociList[idx].mappingType = \ - MAPPING_TYPEA; - initDlBwp->pdschCfg.timeDomRsrcAllociList[idx].startSymbol = PDSCH_START_SYMBOL; - initDlBwp->pdschCfg.timeDomRsrcAllociList[idx].symbolLength = PDSCH_LENGTH_SYMBOL; - initDlBwp->pdschCfg.timeDomRsrcAllociList[idx].startSymbolAndLength = \ - calcSliv(PDSCH_START_SYMBOL, PDSCH_LENGTH_SYMBOL); - initDlBwp->pdschCfg.rbgSize = RBG_SIZE_CONFIG1; - initDlBwp->pdschCfg.numCodeWordsSchByDci = CODEWORDS_SCHED_BY_DCI_N1; - initDlBwp->pdschCfg.bundlingType = TYPE_STATIC_BUNDLING; - initDlBwp->pdschCfg.bundlingInfo.StaticBundling.size = 0; + initDlBwp->pdschCfg.dmrsDlCfgForPdschMapTypeA.addPos = ADDITIONALPOSITION_POS0; + initDlBwp->pdschCfg.resourceAllocType = RESOURCEALLOCATION_TYPE1; + + initDlBwp->pdschCfg.numTimeDomRsrcAlloc = NUM_TIME_DOM_RSRC_ALLOC; + + idx = 0; + initDlBwp->pdschCfg.timeDomRsrcAllociList[idx].mappingType = MAPPING_TYPEA; + initDlBwp->pdschCfg.timeDomRsrcAllociList[idx].startSymbol = PDSCH_START_SYMBOL; + initDlBwp->pdschCfg.timeDomRsrcAllociList[idx].symbolLength = PDSCH_LENGTH_SYMBOL; + initDlBwp->pdschCfg.timeDomRsrcAllociList[idx].startSymbolAndLength = calcSliv(PDSCH_START_SYMBOL, PDSCH_LENGTH_SYMBOL); + + idx++; + DU_ALLOC_SHRABL_BUF(initDlBwp->pdschCfg.timeDomRsrcAllociList[idx].k0, sizeof(uint8_t)); + if(initDlBwp->pdschCfg.timeDomRsrcAllociList[idx].k0 == NULLP) + { + DU_LOG("\nERROR --> DUAPP : Failed to allocate memory to K0 in fillDefaultInitDlBwp"); + return RFAILED; + } + if(initDlBwp->pdschCfg.timeDomRsrcAllociList[idx].k0) + *(initDlBwp->pdschCfg.timeDomRsrcAllociList[idx].k0) = 1; + initDlBwp->pdschCfg.timeDomRsrcAllociList[idx].mappingType = MAPPING_TYPEA; + initDlBwp->pdschCfg.timeDomRsrcAllociList[idx].startSymbol = PDSCH_START_SYMBOL; + initDlBwp->pdschCfg.timeDomRsrcAllociList[idx].symbolLength = PDSCH_LENGTH_SYMBOL; + initDlBwp->pdschCfg.timeDomRsrcAllociList[idx].startSymbolAndLength = calcSliv(PDSCH_START_SYMBOL, PDSCH_LENGTH_SYMBOL); + + initDlBwp->pdschCfg.rbgSize = RBG_SIZE_CONFIG1; + initDlBwp->pdschCfg.numCodeWordsSchByDci = CODEWORDS_SCHED_BY_DCI_N1; + initDlBwp->pdschCfg.bundlingType = TYPE_STATIC_BUNDLING; + initDlBwp->pdschCfg.bundlingInfo.StaticBundling.size = 0; } } + return ROK; } /****************************************************************** @@ -749,10 +779,11 @@ void fillDefaultInitUlBwp(InitialUlBwp *initUlBwp) * Functionality: Fills Sp Cell Group Info * * @params[in] MacUeCfg *macUeCfg - * @return void + * @return ROK - Success + * RFAILED - Failure * *****************************************************************/ -void fillDefaultSpCellGrpInfo(MacUeCfg *macUeCfg) +uint8_t fillDefaultSpCellGrpInfo(MacUeCfg *macUeCfg) { SpCellCfg *spCell = NULL; @@ -765,7 +796,11 @@ void fillDefaultSpCellGrpInfo(MacUeCfg *macUeCfg) spCell->servCellIdx = SERV_CELL_IDX; /* Filling Initial Dl Bwp */ - fillDefaultInitDlBwp(&spCell->servCellCfg.initDlBwp); + if((fillDefaultInitDlBwp(&spCell->servCellCfg.initDlBwp)) != ROK) + { + DU_LOG("\nERROR --> DUAPP : Failed in fillDefaultInitDlBwp"); + return RFAILED; + } spCell->servCellCfg.numDlBwpToAdd = 0; spCell->servCellCfg.firstActvDlBwpId = ACTIVE_DL_BWP_ID; @@ -775,8 +810,8 @@ void fillDefaultSpCellGrpInfo(MacUeCfg *macUeCfg) spCell->servCellCfg.pdschServCellCfg.maxCodeBlkGrpPerTb = NULLP; spCell->servCellCfg.pdschServCellCfg.codeBlkGrpFlushInd = NULLP; spCell->servCellCfg.pdschServCellCfg.xOverhead = NULLP; - spCell->servCellCfg.pdschServCellCfg.numHarqProcForPdsch =\ - NUM_HARQ_PROC_FOR_PDSCH_N_16; + spCell->servCellCfg.pdschServCellCfg.numHarqProcForPdsch = NUM_HARQ_PROC_FOR_PDSCH_N_16; + /* Filling Initial UL Bwp*/ fillDefaultInitUlBwp(&spCell->servCellCfg.initUlBwp); spCell->servCellCfg.numUlBwpToAdd = 0; @@ -785,7 +820,9 @@ void fillDefaultSpCellGrpInfo(MacUeCfg *macUeCfg) else { DU_LOG("\nERROR --> DU APP : Memory is NULL for SpCellGrp"); + return RFAILED; } + return ROK; } /****************************************************************** @@ -839,7 +876,7 @@ void fillDefaultMacCellGrpInfo(MacUeCfg *macUeCfg) { uint8_t idx; MacCellGrpCfg *cellGrp = NULL; - + if(macUeCfg) cellGrp = &macUeCfg->macCellGrpCfg; @@ -851,12 +888,12 @@ void fillDefaultMacCellGrpInfo(MacUeCfg *macUeCfg) cellGrp->schReqCfg.addModListCount = 1; if(cellGrp->schReqCfg.addModListCount <= MAX_NUM_SR_CFG_PER_CELL_GRP) { - for(idx = 0; idx < cellGrp->schReqCfg.addModListCount; idx++) - { - cellGrp->schReqCfg.addModList[idx].schedReqId = SCH_REQ_ID; - cellGrp->schReqCfg.addModList[idx].srProhibitTmr = SR_PROHIBIT_MS_32; - cellGrp->schReqCfg.addModList[idx].srTransMax = SR_TRANS_MAX_N_16; - } + for(idx = 0; idx < cellGrp->schReqCfg.addModListCount; idx++) + { + cellGrp->schReqCfg.addModList[idx].schedReqId = SCH_REQ_ID; + cellGrp->schReqCfg.addModList[idx].srProhibitTmr = SR_PROHIBIT_MS_32; + cellGrp->schReqCfg.addModList[idx].srTransMax = SR_TRANS_MAX_N_16; + } } cellGrp->schReqCfg.relListCount = 0; @@ -864,11 +901,11 @@ void fillDefaultMacCellGrpInfo(MacUeCfg *macUeCfg) cellGrp->tagCfg.addModListCount = 1; if(cellGrp->tagCfg.addModListCount <= MAC_NUM_TAGS) { - for(idx = 0; idx < cellGrp->tagCfg.addModListCount; idx++) - { - cellGrp->tagCfg.addModList[idx].tagId = TAG_ID; - cellGrp->tagCfg.addModList[idx].timeAlignTimer = TIME_ALIGNMENT_TIMER_INFINITY; - } + for(idx = 0; idx < cellGrp->tagCfg.addModListCount; idx++) + { + cellGrp->tagCfg.addModList[idx].tagId = TAG_ID; + cellGrp->tagCfg.addModList[idx].timeAlignTimer = TIME_ALIGNMENT_TIMER_INFINITY; + } } cellGrp->tagCfg.relListCount = 0; @@ -887,6 +924,31 @@ void fillDefaultMacCellGrpInfo(MacUeCfg *macUeCfg) cellGrp->phrCfg.phrType2OtherCell = false; cellGrp->phrCfg.phrOtherCG = PHR_MODE_OTHER_CG_REAL; + /* Filling Drx Config */ +#ifdef NR_DRX + cellGrp->drxCfg.drxOnDurationTimer.onDurationTimerValInMs = DRX_ONDURATION_TIMER_VALUE_PRESENT_IN_MS; + if(!cellGrp->drxCfg.drxOnDurationTimer.onDurationTimerValInMs) + cellGrp->drxCfg.drxOnDurationTimer.onDurationtimerValue.subMilliSeconds = \ + DRX_ONDURATION_TIMER_VALUE_IN_SUBMS; + else + cellGrp->drxCfg.drxOnDurationTimer.onDurationtimerValue.milliSeconds = \ + DRX_ONDURATION_TIMER_VALUE_IN_MS; + cellGrp->drxCfg.drxInactivityTimer = DRX_INACTIVITY_TIMER; + cellGrp->drxCfg.drxHarqRttTimerDl = DRX_HARQ_RTT_TIMER_DL; + cellGrp->drxCfg.drxHarqRttTimerUl = DRX_HARQ_RTT_TIMER_UL; + cellGrp->drxCfg.drxRetransmissionTimerDl = DRX_RETRANSMISSION_TIMER_DL; + cellGrp->drxCfg.drxRetransmissionTimerUl = DRX_RETRANSMISSION_TIMER_UL; + cellGrp->drxCfg.drxLongCycleStartOffset.drxLongCycleStartOffsetVal = DRX_LONG_CYCLE_START_OFFSET_VAL; + cellGrp->drxCfg.drxLongCycleStartOffset.drxLongCycleStartOffsetChoice = DRX_LONG_CYCLE_START_OFFSET_CHOICE; + cellGrp->drxCfg.shortDrxPres = DRX_SHORT_CYCLE_PRESENT; + if(cellGrp->drxCfg.shortDrxPres) + { + cellGrp->drxCfg.shortDrx.drxShortCycle = DRX_SHORT_CYCLE; + cellGrp->drxCfg.shortDrx.drxShortCycleTimer = DRX_SHORT_CYCLE_TIMER; + } + cellGrp->drxCfg.drxSlotOffset = DRX_SLOT_OFFSET; +#endif + } else { @@ -912,11 +974,11 @@ void fillDefaultMacCellGrpInfo(MacUeCfg *macUeCfg) void fillDefaultModulation(MacUeCfg *ueCfg) { ueCfg->dlModInfo.modOrder = MOD_ORDER_QPSK; - ueCfg->dlModInfo.mcsIndex = SIB1_MCS; + ueCfg->dlModInfo.mcsIndex = DEFAULT_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.mcsIndex = DEFAULT_MCS; ueCfg->ulModInfo.mcsTable = MCS_TABLE_QAM64; /* Spec 38.214-Table 5.1.3.1-1 */ } @@ -1051,25 +1113,28 @@ uint8_t fillAmbr(AmbrCfg **macAmbrCfgToSend, AmbrCfg *ueDbAmbr, AmbrCfg **oldMac { *macAmbrCfgToSend = ueDbAmbr; } - else + else if(oldMacAmbrCfg) *macAmbrCfgToSend = *oldMacAmbrCfg; } else { if(ueDbAmbr) { - if(*oldMacAmbrCfg) + if(oldMacAmbrCfg) { - DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL, *oldMacAmbrCfg, sizeof(AmbrCfg)); - } - DU_ALLOC_SHRABL_BUF(*oldMacAmbrCfg, sizeof(AmbrCfg)); - if(*oldMacAmbrCfg == NULLP) - { - DU_LOG("\nERROR --> DU APP : Memory Alloc Failed at fillAmbr()"); - return RFAILED; + if(*oldMacAmbrCfg) + { + DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL, *oldMacAmbrCfg, sizeof(AmbrCfg)); + } + DU_ALLOC_SHRABL_BUF(*oldMacAmbrCfg, sizeof(AmbrCfg)); + if(*oldMacAmbrCfg == NULLP) + { + DU_LOG("\nERROR --> DU APP : Memory Alloc Failed at fillAmbr()"); + return RFAILED; + } + memset(*oldMacAmbrCfg, 0, sizeof(AmbrCfg)); + (*oldMacAmbrCfg)->ulBr = ueDbAmbr->ulBr; } - memset(*oldMacAmbrCfg, 0, sizeof(AmbrCfg)); - (*oldMacAmbrCfg)->ulBr = ueDbAmbr->ulBr; } } @@ -1119,40 +1184,7 @@ uint8_t sendUeReCfgReqToMac(MacUeCfg *macUeCfg) return ret; } -/****************************************************************** - * - * @brief Function to return Drb LcId - * - * @details - * - * Function : getDrbLcId - * - * Functionality: Function to return Drb LcId - * - * Returns: lcId - SUCCESS - * RFAILED - FAILURE - *****************************************************************/ - -uint8_t getDrbLcId(uint32_t *drbBitMap) -{ - uint8_t bitMask = 1, bitPos = 0; - bitPos = MIN_DRB_LCID; - while(bitPos <= MAX_DRB_LCID) - { - if((*drbBitMap & (bitMask << bitPos)) == 0) - { - *drbBitMap = ((bitMask << bitPos)| *drbBitMap); - return bitPos; - } - else - { - bitPos++; - } - } - DU_LOG("\nERROR --> DU_APP: Max LC Reached in getDrbLcId()"); - return RFAILED; -} /****************************************************************** * @@ -1164,30 +1196,33 @@ uint8_t getDrbLcId(uint32_t *drbBitMap) * * Functionality: Fills MacUeCfg * - * @params[in] cellId, ueIdx, crnti, + * @params[in] cellId, ueId, crnti, * DuUeCfg pointer, * MacUeCfg pointer * @return ROK/RFAILED * *****************************************************************/ -uint8_t fillMacUeCfg(uint16_t cellId, uint8_t ueIdx, uint16_t crnti, \ - DuUeCfg *ueCfgDb, MacUeCfg *macUeCfg) +uint8_t fillMacUeCfg(uint16_t cellId, uint8_t gnbDuUef1apId, uint16_t crnti, DuUeCfg *ueCfgDb, MacUeCfg *macUeCfg) { - uint8_t ret, dbIdx, lcIdx, cellIdx; + uint8_t ret = ROK, dbIdx = 0, lcIdx = 0, cellIdx = 0; bool lcIdFound = false; MacUeCfg *duMacDb = NULLP; - ret =ROK; + macUeCfg->cellId = cellId; + macUeCfg->ueId = gnbDuUef1apId; + macUeCfg->crnti = crnti; if(!ueCfgDb) { - macUeCfg->cellId = cellId; - macUeCfg->ueIdx = ueIdx; - macUeCfg->crnti = crnti; - fillDefaultMacCellGrpInfo(macUeCfg); fillDefaultPhyCellGrpInfo(macUeCfg); - fillDefaultSpCellGrpInfo(macUeCfg); + + if((fillDefaultSpCellGrpInfo(macUeCfg)) != ROK) + { + DU_LOG("\nERROR --> DUAPP : Failed in fillDefaultSpCellGrpInfo"); + return RFAILED; + } + macUeCfg->ambrCfg = NULLP; fillDefaultModulation(macUeCfg); fillMacSrb1LcCfg(&macUeCfg->lcCfgList[0]); @@ -1195,33 +1230,73 @@ uint8_t fillMacUeCfg(uint16_t cellId, uint8_t ueIdx, uint16_t crnti, \ } else { - /* Fetching MacDb from DuUeCb */ + if(ueCfgDb->dataTransmissionAction == STOP_TRANSMISSION) + { + macUeCfg->transmissionAction = ueCfgDb->dataTransmissionAction; + return ROK; + } + GET_CELL_IDX(cellId, cellIdx); - duMacDb = &duCb.actvCellLst[cellIdx]->ueCb[ueIdx-1].macUeCfg; + if(duCb.actvCellLst[cellIdx]) + duMacDb = &duCb.actvCellLst[cellIdx]->ueCb[macUeCfg->ueId-1].macUeCfg; + else + { + DU_LOG("\nERROR --> DU APP : Cell Id [%d] does not exist", cellId); + return RFAILED; + } duMacDb->macUeCfgState = UE_CFG_INPROGRESS; - /* Fetching MaUeCfg List for ADD/MOD/DEL */ - macUeCfg->cellId = cellId; - macUeCfg->ueIdx = ueIdx; - macUeCfg->crnti = crnti; - ret = procUeReCfgCellInfo(macUeCfg, ueCfgDb->cellGrpCfg); - if(ret == ROK) + + if(ueCfgDb->cellGrpCfg) { - if(macUeCfg->spCellCfgPres == true) + ret = procUeReCfgCellInfo(macUeCfg, duMacDb, 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); + } } + + if(duMacDb) + ret = fillAmbr(&macUeCfg->ambrCfg, ueCfgDb->ambrCfg , &duMacDb->ambrCfg, FALSE); + else + ret = fillAmbr(&macUeCfg->ambrCfg, ueCfgDb->ambrCfg , NULL, FALSE); + + duFillModulationDetails(macUeCfg, duMacDb, ueCfgDb->ueNrCapability); + } + } + else + { + fillDefaultMacCellGrpInfo(macUeCfg); + fillDefaultPhyCellGrpInfo(macUeCfg); + fillDefaultSpCellGrpInfo(macUeCfg); + fillDefaultModulation(macUeCfg); + } + +#ifdef NR_DRX + if(ueCfgDb->drxCyclePres) + { + macUeCfg->macCellGrpCfg.drxCfg.drxLongCycleStartOffset.drxLongCycleStartOffsetChoice = ueCfgDb->drxCycle.drxLongCycleLength; + if(ueCfgDb->drxCycle.shortDrxCyclePres) + { + macUeCfg->macCellGrpCfg.drxCfg.shortDrxPres = true; + macUeCfg->macCellGrpCfg.drxCfg.shortDrx.drxShortCycle = ueCfgDb->drxCycle.shortDrxCycle.drxShortCycle; + macUeCfg->macCellGrpCfg.drxCfg.shortDrx.drxShortCycleTimer = ueCfgDb->drxCycle.shortDrxCycle.drxShortCycleTimer; + } + else + { + macUeCfg->macCellGrpCfg.drxCfg.shortDrxPres = false; } - ret = fillAmbr(&macUeCfg->ambrCfg, ueCfgDb->ambrCfg , &duMacDb->ambrCfg, FALSE); - duFillModulationDetails(macUeCfg, duMacDb, ueCfgDb->ueNrCapability); } +#endif /* Filling LC Context */ for(dbIdx = 0; (dbIdx < ueCfgDb->numMacLcs && ret == ROK); dbIdx++) @@ -1232,21 +1307,27 @@ uint8_t fillMacUeCfg(uint16_t cellId, uint8_t ueIdx, uint16_t crnti, \ ueCfgDb->macLcCfg[dbIdx].ulLcCfgPres = true; fillDefaultUlLcCfg(&ueCfgDb->macLcCfg[dbIdx].ulLcCfg); } - for(lcIdx = 0; lcIdx < duMacDb->numLcs; lcIdx++) + + if(duMacDb) { - if(ueCfgDb->macLcCfg[dbIdx].lcId == duMacDb->lcCfgList[lcIdx].lcId) + for(lcIdx = 0; lcIdx < duMacDb->numLcs; lcIdx++) { - lcIdFound = true; - if((ueCfgDb->macLcCfg[dbIdx].configType == CONFIG_UNKNOWN) || - (ueCfgDb->macLcCfg[dbIdx].configType == CONFIG_MOD)) + if(ueCfgDb->macLcCfg[dbIdx].lcId == duMacDb->lcCfgList[lcIdx].lcId) { - ueCfgDb->macLcCfg[dbIdx].configType = CONFIG_MOD; - ret = fillMacLcCfgToAddMod(&macUeCfg->lcCfgList[dbIdx], &ueCfgDb->macLcCfg[dbIdx], &duMacDb->lcCfgList[lcIdx], FALSE); + 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],\ + &duMacDb->lcCfgList[lcIdx], FALSE); + } } + else + lcIdFound = false; } - else - lcIdFound = false; } + if(!lcIdFound) { /* ADD/DEL CONFIG */ @@ -1262,6 +1343,7 @@ uint8_t fillMacUeCfg(uint16_t cellId, uint8_t ueIdx, uint16_t crnti, \ break; } }/*End of Outer FOR loop */ + memcpy(&ueCfgDb->copyOfmacUeCfg, macUeCfg, sizeof(MacUeCfg)); } return ret; } @@ -1375,69 +1457,68 @@ void fillDefaultUmDlInfo(UmUniDirDlBearerCfg *UmDlCfg) uint8_t fillDefaultRlcModeCfg(uint8_t rlcMode, RlcBearerCfg *lcCfg) { - if(lcCfg) { switch(rlcMode) { case RLC_AM : { - if(!lcCfg->u.amCfg) - { - DU_ALLOC_SHRABL_BUF(lcCfg->u.amCfg, sizeof(AmBearerCfg)); - if(lcCfg->u.amCfg) - fillDefaultAmInfo(lcCfg->u.amCfg); - else - { - DU_LOG("\n ERROR --> DU APP : Memory Alloc failed at AmCfg at fillDefaultRlcModeCfg()"); - return RFAILED; - } - } + if(!lcCfg->u.amCfg) + { + DU_ALLOC_SHRABL_BUF(lcCfg->u.amCfg, sizeof(AmBearerCfg)); + if(lcCfg->u.amCfg) + fillDefaultAmInfo(lcCfg->u.amCfg); + else + { + DU_LOG("\n ERROR --> DU APP : Memory Alloc failed at AmCfg at fillDefaultRlcModeCfg()"); + return RFAILED; + } + } break; } case RLC_UM_BI_DIRECTIONAL : { - if(!lcCfg->u.umBiDirCfg) - { - DU_ALLOC_SHRABL_BUF(lcCfg->u.umBiDirCfg, sizeof(UmBiDirBearerCfg)); - if(lcCfg->u.umBiDirCfg) - fillDefaultUmBiInfo(lcCfg->u.umBiDirCfg); - else - { - DU_LOG("\n ERROR --> DU APP : Memory Alloc failed at UmBiDirCfg at fillDefaultRlcModeCfg()"); - return RFAILED; - } - } + if(!lcCfg->u.umBiDirCfg) + { + DU_ALLOC_SHRABL_BUF(lcCfg->u.umBiDirCfg, sizeof(UmBiDirBearerCfg)); + if(lcCfg->u.umBiDirCfg) + fillDefaultUmBiInfo(lcCfg->u.umBiDirCfg); + else + { + DU_LOG("\n ERROR --> DU APP : Memory Alloc failed at UmBiDirCfg at fillDefaultRlcModeCfg()"); + return RFAILED; + } + } break; } case RLC_UM_UNI_DIRECTIONAL_UL : { - if(!lcCfg->u.umUniDirUlCfg) - { + if(!lcCfg->u.umUniDirUlCfg) + { DU_ALLOC_SHRABL_BUF(lcCfg->u.umUniDirUlCfg, sizeof(UmUniDirUlBearerCfg)); - if(lcCfg->u.umUniDirUlCfg) - fillDefaultUmUlInfo(lcCfg->u.umUniDirUlCfg); + if(lcCfg->u.umUniDirUlCfg) + fillDefaultUmUlInfo(lcCfg->u.umUniDirUlCfg); else - { + { DU_LOG("\n ERROR --> DU APP : Memory Alloc failed at UmUniDirUlCfg at fillDefaultRlcModeCfg()"); - return RFAILED; - } - } + return RFAILED; + } + } break; } case RLC_UM_UNI_DIRECTIONAL_DL : { - if(!lcCfg->u.umUniDirDlCfg) - { + if(!lcCfg->u.umUniDirDlCfg) + { DU_ALLOC_SHRABL_BUF(lcCfg->u.umUniDirDlCfg, sizeof(UmUniDirDlBearerCfg)); if(lcCfg->u.umUniDirDlCfg) - fillDefaultUmDlInfo(lcCfg->u.umUniDirDlCfg); + fillDefaultUmDlInfo(lcCfg->u.umUniDirDlCfg); else - { + { DU_LOG("\n ERROR --> DU APP : Memory Alloc failed at UmUniDirDlCfg at fillDefaultRlcModeCfg()"); - return RFAILED; - } - } + return RFAILED; + } + } break; } default: @@ -1481,6 +1562,7 @@ uint8_t fillRlcSrb1LcCfg(RlcBearerCfg *rlcLcCfg) rlcLcCfg->rlcMode = RLC_AM; rlcLcCfg->configType = CONFIG_ADD; ret = fillDefaultRlcModeCfg(rlcLcCfg->rlcMode, rlcLcCfg); + rlcLcCfg->isLcAddModRspSent = true; return ret; } @@ -1526,6 +1608,51 @@ uint8_t sendUeReCfgReqToRlc(RlcUeCfg *rlcUeCfg) return ret; } +/****************************************************************** + * + * @brief Fills Snssai information + * + * @details + * + * Function : fillSnssaiInfo + * + * Functionality: Fills Snssai information + * + * @params[in] LcCfg *snssaiTobeSend, LcCfg *snssaiDb, LcCfg *oldSnssai, + * Bool toUpdateg + * @return ROK - success + * RFAILED - failure + * + *****************************************************************/ +uint8_t fillSnssaiInfo(Snssai *snssaiTobeSend, Snssai *snssaiDb, Snssai **oldSnssai, Bool toUpdate) +{ + if(!toUpdate) + { + if(snssaiDb) + snssaiTobeSend = snssaiDb; + else if(oldSnssai) + snssaiTobeSend = *oldSnssai; + else + snssaiTobeSend = NULL; + } + else + { + if(snssaiDb) + { + if(*oldSnssai) + DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL, *oldSnssai, sizeof(Snssai)); + + DU_ALLOC_SHRABL_BUF(*oldSnssai, sizeof(Snssai)); + if(*oldSnssai == NULL) + { + DU_LOG("\nERROR --> DU APP : Memory Alloc Failed at fillSnssaiInfo()"); + return RFAILED; + } + memcpy(*oldSnssai, snssaiDb, sizeof(Snssai)); + } + } + return ROK; +} /****************************************************************** * * @brief Fills RlcBearerCfg structure @@ -1538,34 +1665,32 @@ uint8_t sendUeReCfgReqToRlc(RlcUeCfg *rlcUeCfg) * * *****************************************************************/ -uint8_t fillRlcUeCfg(uint16_t cellId, uint8_t ueIdx,\ - DuUeCfg *ueCfgDb, RlcUeCfg *rlcUeCfg) +uint8_t fillRlcUeCfg(uint16_t cellId, uint8_t duUeF1apId, DuUeCfg *ueCfgDb, RlcUeCfg *rlcUeCfg) { uint8_t ret, dbIdx, lcIdx, cellIdx; bool lcIdFound = false; RlcUeCfg *duRlcDb = NULLP; ret = ROK; + rlcUeCfg->cellId = cellId; + rlcUeCfg->ueId = duUeF1apId; + if(!ueCfgDb) { /* Initial RB being Added */ - rlcUeCfg->cellId = cellId; - rlcUeCfg->ueIdx = ueIdx; ret = fillRlcSrb1LcCfg(&rlcUeCfg->rlcLcCfg[0]); if(ret == ROK) rlcUeCfg->numLcs++; else - memset(rlcUeCfg, 0, sizeof(RlcUeCfg)); + memset(rlcUeCfg, 0, sizeof(RlcUeCfg)); } else { /* Fetch RlcDb from DuUeCb */ GET_CELL_IDX(cellId, cellIdx); - duRlcDb = &duCb.actvCellLst[cellIdx]->ueCb[ueIdx-1].rlcUeCfg; + duRlcDb = &duCb.actvCellLst[cellIdx]->ueCb[rlcUeCfg->ueId-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]); @@ -1575,27 +1700,35 @@ uint8_t fillRlcUeCfg(uint16_t cellId, uint8_t ueIdx,\ 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)) + + if(duRlcDb) + { + /* 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) { - /* MOD */ - ueCfgDb->rlcLcCfg[dbIdx].configType = CONFIG_MOD; /* update Db for MOD type */ - memcpy(&rlcUeCfg->rlcLcCfg[dbIdx], &ueCfgDb->rlcLcCfg[dbIdx], sizeof(RlcBearerCfg)); + 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)); + fillSnssaiInfo(rlcUeCfg->rlcLcCfg[dbIdx].snssai, ueCfgDb->rlcLcCfg[dbIdx].snssai,\ + &duRlcDb->rlcLcCfg[lcIdx].snssai,false); + } } + else + lcIdFound = false; } - else - lcIdFound = false; } + if(!lcIdFound) { /* ADD/ DEL Config Type */ memcpy(&rlcUeCfg->rlcLcCfg[dbIdx], &ueCfgDb->rlcLcCfg[dbIdx], sizeof(RlcBearerCfg)); + fillSnssaiInfo(rlcUeCfg->rlcLcCfg[dbIdx].snssai, ueCfgDb->rlcLcCfg[dbIdx].snssai, NULL, false); } rlcUeCfg->numLcs++; } @@ -1623,100 +1756,228 @@ uint8_t duCreateUeCb(UeCcchCtxt *ueCcchCtxt, uint32_t gnbCuUeF1apId) { uint8_t cellIdx = 0; uint8_t ret = ROK; - uint8_t ueIdx; + uint8_t ueId = 0, ueIdx = 0; for(cellIdx = 0; cellIdx < MAX_NUM_CELL; cellIdx++) { - if(ueCcchCtxt->cellId == duCb.actvCellLst[cellIdx]->cellId) + if(duCb.actvCellLst[cellIdx] && (ueCcchCtxt->cellId == duCb.actvCellLst[cellIdx]->cellId)) { - GET_UE_IDX(ueCcchCtxt->crnti, ueIdx); - DU_LOG("\nDEBUG --> DU_APP: Filling UeCb for ueIdx [%d]", ueIdx); + GET_UE_ID(ueCcchCtxt->crnti, ueId); + DU_LOG("\nDEBUG --> DU_APP: Filling UeCb for ueId [%d]", ueId); - duCb.actvCellLst[cellIdx]->ueCb[ueIdx-1].f1UeDb = NULLP; - duCb.actvCellLst[cellIdx]->ueCb[ueIdx-1].crnti = ueCcchCtxt->crnti; - duCb.actvCellLst[cellIdx]->ueCb[ueIdx-1].gnbDuUeF1apId = ueCcchCtxt->gnbDuUeF1apId; - duCb.actvCellLst[cellIdx]->ueCb[ueIdx-1].gnbCuUeF1apId = gnbCuUeF1apId; - duCb.actvCellLst[cellIdx]->ueCb[ueIdx-1].drbBitMap = NULLP; - duCb.actvCellLst[cellIdx]->ueCb[ueIdx-1].ueState = UE_ACTIVE; + ueIdx = ueId-1; + duCb.actvCellLst[cellIdx]->ueCb[ueIdx].f1UeDb = NULLP; + duCb.actvCellLst[cellIdx]->ueCb[ueIdx].crnti = ueCcchCtxt->crnti; + duCb.actvCellLst[cellIdx]->ueCb[ueIdx].gnbDuUeF1apId = ueCcchCtxt->gnbDuUeF1apId; + duCb.actvCellLst[cellIdx]->ueCb[ueIdx].gnbCuUeF1apId = gnbCuUeF1apId; + duCb.actvCellLst[cellIdx]->ueCb[ueIdx].drbBitMap = NULLP; + duCb.actvCellLst[cellIdx]->ueCb[ueIdx].ueState = UE_ACTIVE; - /* Filling Mac Ue Config */ - memset(&duCb.actvCellLst[cellIdx]->ueCb[ueIdx-1].macUeCfg, 0, sizeof(MacUeCfg)); - ret = duBuildAndSendUeCreateReqToMac(ueCcchCtxt->cellId, ueIdx, ueCcchCtxt->crnti,\ - &duCb.actvCellLst[cellIdx]->ueCb[ueIdx-1].macUeCfg); + /* Filling Mac Ue Config */ + memset(&duCb.actvCellLst[cellIdx]->ueCb[ueIdx].macUeCfg, 0, sizeof(MacUeCfg)); + ret = duBuildAndSendUeCreateReqToMac(ueCcchCtxt->cellId, ueCcchCtxt->gnbDuUeF1apId, ueCcchCtxt->crnti, NULL, + &duCb.actvCellLst[cellIdx]->ueCb[ueIdx].macUeCfg); if(ret == RFAILED) 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); + + /* Filling Rlc Ue Config */ + memset(&duCb.actvCellLst[cellIdx]->ueCb[ueIdx].rlcUeCfg, 0, sizeof(RlcUeCfg)); + ret = duBuildAndSendUeCreateReqToRlc(ueCcchCtxt->cellId, ueCcchCtxt->gnbDuUeF1apId, NULL, + &duCb.actvCellLst[cellIdx]->ueCb[ueIdx].rlcUeCfg); if(ret == RFAILED) DU_LOG("\nERROR --> DU APP : Failed to send UE create request to RLC"); - duCb.actvCellLst[cellIdx]->numActvUes++; - memset(ueCcchCtxt, 0, sizeof(UeCcchCtxt)); - duCb.numUe--; + duCb.actvCellLst[cellIdx]->numActvUes++; + memset(ueCcchCtxt, 0, sizeof(UeCcchCtxt)); + duCb.numUe--; + } + } + return ret; +} + +/****************************************************************** + * + * @brief Builds and Send UE Create Request to MAC + * + * @details + * + * Function : duBuildAndSendUeCreateReqToMac + * + * Functionality: Builds and Send UE Create Request to MAC + * + * @Params[in] cellId, + * ueId, + * crnti, + * UE config extracted from F1AP msg + * MAC UE config struct to be filled + * @return ROK - success + * RFAILED - failure + * + * ****************************************************************/ + +uint8_t duBuildAndSendUeCreateReqToMac(uint16_t cellId, uint8_t gnbDuUeF1apId, uint16_t crnti, DuUeCfg *ueCfgDb, MacUeCfg *duMacUeCfg) +{ + uint8_t ret = ROK; + MacUeCfg *macUeCfg = NULLP; + Pst pst; + memset(&pst, 0, sizeof(Pst)); + + + ret = fillMacUeCfg(cellId, gnbDuUeF1apId, crnti, ueCfgDb, duMacUeCfg); + if(ret == RFAILED) + { + DU_LOG("\nERROR --> DU APP : Failed to fill MacUeCfg at duBuildAndSendUeCreateReqToMac()"); + return RFAILED; + } + + /* Fill Pst */ + FILL_PST_DUAPP_TO_MAC(pst, EVENT_MAC_UE_CREATE_REQ); + + /* Copying ueCb to a sharable buffer */ + DU_ALLOC_SHRABL_BUF(macUeCfg, sizeof(MacUeCfg)); + if(macUeCfg) + { + memset(macUeCfg, 0, sizeof(MacUeCfg)); + 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("\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)); } } - return ret; + else + { + DU_LOG("\n ERROR --> DU APP : Memory alloc failed at duBuildAndSendUeCreateReqToMac()"); + ret = RFAILED; + } + return ret; +} + +/******************************************************************* + * + * @brief Build and send RACH Resource request to MAC + * + * @details + * + * Function : duBuildAndSendRachRsrcReqToMac + * Functionality: + * Build and send RACH Resource request to MAC + * + * @params[in] Cell Id + * UE Id + * @return ROK - success + * RFAILED - failure + * + * ****************************************************************/ +uint8_t duBuildAndSendRachRsrcReqToMac(uint16_t cellId, uint16_t ueId) +{ + uint16_t cellIdx = 0, ssbIdx = 0; + Pst pst; + MacRachRsrcReq *rachRsrcReq = NULLP; + + GET_CELL_IDX(cellId, cellIdx); + if(duCb.actvCellLst[cellIdx] == NULLP) + { + DU_LOG("\nERROR --> DU APP : Cell Id [%d] not found in duBuildAndSendRachRsrcReqToMac()", cellId); + return RFAILED; + } + + DU_ALLOC_SHRABL_BUF(rachRsrcReq, sizeof(MacRachRsrcReq)); + if(!rachRsrcReq) + { + DU_LOG("\nERROR --> DU APP : Failed to allocate memory for RACH Resource Request in \ + duBuildAndSendRachRsrcReqToMac()"); + return RFAILED; + } + + rachRsrcReq->cellId = cellId; + rachRsrcReq->ueId = ueId; + rachRsrcReq->numSsb = duCfgParam.macCellCfg.prachCfg.ssbPerRach; + for(ssbIdx = 0; ssbIdx < rachRsrcReq->numSsb; ssbIdx++) + { + rachRsrcReq->ssbIdx[ssbIdx] = ssbIdx; + } + + /* Fill Pst */ + FILL_PST_DUAPP_TO_MAC(pst, EVENT_MAC_RACH_RESOURCE_REQ); + + if(((*packMacRachRsrcReqOpts[pst.selector])(&pst, rachRsrcReq)) != ROK) + { + DU_LOG("\nERROR --> DU_APP : Failure in sending RACH Resource Request to MAC at \ + duBuildAndSendRachRsrcReqToMac()"); + DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL, rachRsrcReq, sizeof(MacRachRsrcReq)); + return RFAILED; + } + + return ROK; } -/****************************************************************** +/******************************************************************* * - * @brief Builds and Send UE Create Request to MAC + * @brief Process RACH resource response from MAC * * @details * - * Function : duBuildAndSendUeCreateReqToMac - * - * Functionality: Builds and Send UE Create Request to MAC + * Function : DuProcMacRachRsrcRsp + * Functionality: + * Process RACH resource response from MAC * - * @Params[in] cellId, - * ueIdx + * @params[in] Post structure + * RACH resource response * @return ROK - success * RFAILED - failure * * ****************************************************************/ - -uint8_t duBuildAndSendUeCreateReqToMac(uint16_t cellId, uint8_t ueIdx,\ - uint16_t crnti, MacUeCfg *duMacUeCfg) +uint8_t DuProcMacRachRsrcRsp(Pst *pst, MacRachRsrcRsp *rachRsrcRsp) { - uint8_t ret = ROK; - MacUeCfg *macUeCfg = NULLP; - Pst pst; - memset(&pst, 0, sizeof(Pst)); - + uint8_t ret = RFAILED; + uint16_t cellIdx = 0; + DuCellCb *cellCb = NULLP; + DuUeCb *ueCb = NULLP; - ret = fillMacUeCfg(cellId, ueIdx, crnti, NULL, duMacUeCfg); - if(ret == RFAILED) - { - DU_LOG("\nERROR --> DU APP : Failed to fill MacUeCfg at duBuildAndSendUeCreateReqToMac()"); - return RFAILED; - } - /* Fill Pst */ - FILL_PST_DUAPP_TO_MAC(pst, EVENT_MAC_UE_CREATE_REQ); + DU_LOG("\nINFO --> DU APP : Received RACH Resource Response from MAC. Cell ID [%d] UE ID [%d]", + rachRsrcRsp->cellId, rachRsrcRsp->ueId); - /* Copying ueCb to a sharable buffer */ - DU_ALLOC_SHRABL_BUF(macUeCfg, sizeof(MacUeCfg)); - if(macUeCfg) + if(rachRsrcRsp->result == MAC_DU_APP_RSP_OK) { - memset(macUeCfg, 0, sizeof(MacUeCfg)); - memcpy(macUeCfg, duMacUeCfg, sizeof(MacUeCfg)); - DU_LOG("\nDEBUG --> DU_APP: Sending UE create request to MAC"); + DU_LOG("\nINFO : DU APP : RACH Resource Response from MAC : Result [SUCCESS]"); - /* Processing one Ue at a time to MAC */ - ret = (*packMacUeCreateReqOpts[pst.selector])(&pst, macUeCfg); - if(ret == RFAILED) + /* Fetch Cell Cb */ + GET_CELL_IDX(rachRsrcRsp->cellId, cellIdx); + if(duCb.actvCellLst[cellIdx] && (duCb.actvCellLst[cellIdx]->cellId == rachRsrcRsp->cellId)) { - 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)); + cellCb = duCb.actvCellLst[cellIdx]; + + /* Fetch UE CB */ + if(cellCb->ueCb[rachRsrcRsp->ueId-1].gnbDuUeF1apId == rachRsrcRsp->ueId) + { + ueCb = &cellCb->ueCb[rachRsrcRsp->ueId-1]; + + /* Store CRNTI alloted to this UE by MAC */ + ueCb->crnti = rachRsrcRsp->newCrnti; + + /* Store the assigned CF-RA resources */ + memcpy(&ueCb->cfraResource, &rachRsrcRsp->cfraResource, sizeof(MacCfraResource)); + + /* RACH resources allocated to UE is sent to CU in UE Context Setup Response + * along with the result of UE Context setup requested by CU */ + if((ret = BuildAndSendUeCtxtRsp(rachRsrcRsp->cellId, rachRsrcRsp->ueId)) != ROK) + DU_LOG("\nERROR -> DU APP : Failure in BuildAndSendUeCtxtRsp()"); + } + else + DU_LOG("\nERROR --> DU APP : UE ID [%d] not found in DuProcMacRachRsrcRsp", rachRsrcRsp->ueId); } + else + DU_LOG("\nERROR --> DU APP : Cell ID [%d] not found in DuProcMacRachRsrcRsp", rachRsrcRsp->cellId); } else - { - DU_LOG("\n ERROR --> DU APP : Memory alloc failed at duBuildAndSendUeCreateReqToMac()"); - ret = RFAILED; - } + DU_LOG("\nINFO : DU APP : RACH Resource Response from MAC : Result [FAILURE]"); + + DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL, rachRsrcRsp, sizeof(MacRachRsrcRsp)); return ret; } @@ -1740,12 +2001,20 @@ uint8_t duUpdateMacCfg(MacUeCfg *macUeCfg, F1UeContextSetupDb *f1UeDb) uint8_t ret, lcIdx, dbIdx, numLcs, lcDelIdx, cellIdx; MacUeCfg *oldMacUeCfg; ret = ROK; - + GET_CELL_IDX(macUeCfg->cellId, cellIdx); - oldMacUeCfg = &duCb.actvCellLst[cellIdx]->ueCb[macUeCfg->ueIdx-1].macUeCfg; + if(duCb.actvCellLst[cellIdx] == NULLP) + { + DU_LOG("\nERROR --> DU APP: CellId[%d] not found", macUeCfg->cellId); + return RFAILED; + } + oldMacUeCfg = &duCb.actvCellLst[cellIdx]->ueCb[macUeCfg->ueId-1].macUeCfg; /*Filling Cell Group Cfg*/ - ret = procUeReCfgCellInfo(macUeCfg, f1UeDb->duUeCfg.cellGrpCfg); + ret = procUeReCfgCellInfo(macUeCfg, &f1UeDb->duUeCfg.copyOfmacUeCfg, f1UeDb->duUeCfg.cellGrpCfg); +#ifdef NR_DRX + memcpy(&macUeCfg->macCellGrpCfg.drxCfg, &f1UeDb->duUeCfg.copyOfmacUeCfg.macCellGrpCfg.drxCfg, sizeof(DrxCfg)); +#endif if(ret == ROK) { if(macUeCfg->spCellCfg.servCellCfg.initDlBwp.pdschPresent) @@ -1829,71 +2098,72 @@ uint8_t fillRlcCfgToAddMod(RlcBearerCfg *lcCfg, RlcBearerCfg *f1UeDbLcCfg) lcCfg->lcId = f1UeDbLcCfg->lcId; lcCfg->lcType = f1UeDbLcCfg->lcType; lcCfg->rlcMode = f1UeDbLcCfg->rlcMode; + switch(lcCfg->rlcMode) { case RLC_AM : - { - if(!lcCfg->u.amCfg) - { - DU_ALLOC_SHRABL_BUF(lcCfg->u.amCfg, sizeof(AmBearerCfg)); + { if(!lcCfg->u.amCfg) - return RFAILED; - } - /* DL AM */ - lcCfg->u.amCfg->dlAmCfg.snLenDl = f1UeDbLcCfg->u.amCfg->dlAmCfg.snLenDl; - lcCfg->u.amCfg->dlAmCfg.pollRetxTmr = f1UeDbLcCfg->u.amCfg->dlAmCfg.pollRetxTmr; - lcCfg->u.amCfg->dlAmCfg.pollPdu = f1UeDbLcCfg->u.amCfg->dlAmCfg.pollPdu; - lcCfg->u.amCfg->dlAmCfg.pollByte = f1UeDbLcCfg->u.amCfg->dlAmCfg.pollByte; - lcCfg->u.amCfg->dlAmCfg.maxRetxTh = f1UeDbLcCfg->u.amCfg->dlAmCfg.maxRetxTh; - - /* UL AM */ - lcCfg->u.amCfg->ulAmCfg.snLenUl = f1UeDbLcCfg->u.amCfg->ulAmCfg.snLenUl; - lcCfg->u.amCfg->ulAmCfg.reAssemTmr = f1UeDbLcCfg->u.amCfg->ulAmCfg.reAssemTmr; - lcCfg->u.amCfg->ulAmCfg.statProhTmr = f1UeDbLcCfg->u.amCfg->ulAmCfg.statProhTmr; - break; - } + { + DU_ALLOC_SHRABL_BUF(lcCfg->u.amCfg, sizeof(AmBearerCfg)); + if(!lcCfg->u.amCfg) + return RFAILED; + } + /* DL AM */ + lcCfg->u.amCfg->dlAmCfg.snLenDl = f1UeDbLcCfg->u.amCfg->dlAmCfg.snLenDl; + lcCfg->u.amCfg->dlAmCfg.pollRetxTmr = f1UeDbLcCfg->u.amCfg->dlAmCfg.pollRetxTmr; + lcCfg->u.amCfg->dlAmCfg.pollPdu = f1UeDbLcCfg->u.amCfg->dlAmCfg.pollPdu; + lcCfg->u.amCfg->dlAmCfg.pollByte = f1UeDbLcCfg->u.amCfg->dlAmCfg.pollByte; + lcCfg->u.amCfg->dlAmCfg.maxRetxTh = f1UeDbLcCfg->u.amCfg->dlAmCfg.maxRetxTh; + + /* UL AM */ + lcCfg->u.amCfg->ulAmCfg.snLenUl = f1UeDbLcCfg->u.amCfg->ulAmCfg.snLenUl; + lcCfg->u.amCfg->ulAmCfg.reAssemTmr = f1UeDbLcCfg->u.amCfg->ulAmCfg.reAssemTmr; + lcCfg->u.amCfg->ulAmCfg.statProhTmr = f1UeDbLcCfg->u.amCfg->ulAmCfg.statProhTmr; + break; + } case RLC_UM_BI_DIRECTIONAL : - { - if(!lcCfg->u.umBiDirCfg) - { - DU_ALLOC_SHRABL_BUF(lcCfg->u.umBiDirCfg, sizeof(UmBiDirBearerCfg)); - if(!lcCfg->u.umBiDirCfg) - return RFAILED; + { + if(!lcCfg->u.umBiDirCfg) + { + DU_ALLOC_SHRABL_BUF(lcCfg->u.umBiDirCfg, sizeof(UmBiDirBearerCfg)); + if(!lcCfg->u.umBiDirCfg) + return RFAILED; + } + /* UL UM BI DIR INFO */ + lcCfg->u.umBiDirCfg->ulUmCfg.snLenUlUm = f1UeDbLcCfg->u.umBiDirCfg->ulUmCfg.snLenUlUm; + lcCfg->u.umBiDirCfg->ulUmCfg.reAssemTmr = f1UeDbLcCfg->u.umBiDirCfg->ulUmCfg.reAssemTmr; + /* DL UM BI DIR INFO */ + lcCfg->u.umBiDirCfg->dlUmCfg.snLenDlUm = f1UeDbLcCfg->u.umBiDirCfg->dlUmCfg.snLenDlUm; + break; } - /* UL UM BI DIR INFO */ - lcCfg->u.umBiDirCfg->ulUmCfg.snLenUlUm = f1UeDbLcCfg->u.umBiDirCfg->ulUmCfg.snLenUlUm; - lcCfg->u.umBiDirCfg->ulUmCfg.reAssemTmr = f1UeDbLcCfg->u.umBiDirCfg->ulUmCfg.reAssemTmr; - /* DL UM BI DIR INFO */ - lcCfg->u.umBiDirCfg->dlUmCfg.snLenDlUm = f1UeDbLcCfg->u.umBiDirCfg->dlUmCfg.snLenDlUm; - break; - } case RLC_UM_UNI_DIRECTIONAL_UL : - { - if(!lcCfg->u.umUniDirUlCfg) - { - DU_ALLOC_SHRABL_BUF(lcCfg->u.umUniDirUlCfg, sizeof(UmUniDirUlBearerCfg)); - if(!lcCfg->u.umUniDirUlCfg) - return RFAILED; - } - lcCfg->u.umUniDirUlCfg->ulUmCfg.snLenUlUm = f1UeDbLcCfg->u.umUniDirUlCfg->ulUmCfg.snLenUlUm; - lcCfg->u.umUniDirUlCfg->ulUmCfg.reAssemTmr = f1UeDbLcCfg->u.umUniDirUlCfg->ulUmCfg.reAssemTmr; - break; + { + if(!lcCfg->u.umUniDirUlCfg) + { + DU_ALLOC_SHRABL_BUF(lcCfg->u.umUniDirUlCfg, sizeof(UmUniDirUlBearerCfg)); + if(!lcCfg->u.umUniDirUlCfg) + return RFAILED; + } + lcCfg->u.umUniDirUlCfg->ulUmCfg.snLenUlUm = f1UeDbLcCfg->u.umUniDirUlCfg->ulUmCfg.snLenUlUm; + lcCfg->u.umUniDirUlCfg->ulUmCfg.reAssemTmr = f1UeDbLcCfg->u.umUniDirUlCfg->ulUmCfg.reAssemTmr; + break; - } + } case RLC_UM_UNI_DIRECTIONAL_DL : - { - if(!lcCfg->u.umUniDirDlCfg) - { - DU_ALLOC_SHRABL_BUF(lcCfg->u.umUniDirDlCfg, sizeof(UmUniDirDlBearerCfg)); - if(!lcCfg->u.umUniDirDlCfg) - return RFAILED; + { + if(!lcCfg->u.umUniDirDlCfg) + { + DU_ALLOC_SHRABL_BUF(lcCfg->u.umUniDirDlCfg, sizeof(UmUniDirDlBearerCfg)); + if(!lcCfg->u.umUniDirDlCfg) + return RFAILED; + } + lcCfg->u.umUniDirDlCfg->dlUmCfg.snLenDlUm = f1UeDbLcCfg->u.umUniDirDlCfg->dlUmCfg.snLenDlUm; + break; } - lcCfg->u.umUniDirDlCfg->dlUmCfg.snLenDlUm = f1UeDbLcCfg->u.umUniDirDlCfg->dlUmCfg.snLenDlUm; - break; - } default: DU_LOG("\nERROR --> DU_APP: Invalid Rlc Mode %d at fillRlcCfgToAddMod()", lcCfg->rlcMode); - return RFAILED; + return RFAILED; } return ROK; } @@ -1924,41 +2194,52 @@ uint8_t duUpdateRlcLcCfg(RlcUeCfg *rlcUeCfg, F1UeContextSetupDb *f1UeDb) numLcs = rlcUeCfg->numLcs; for(lcIdx = 0; lcIdx < numLcs; lcIdx++) { - if(f1UeDb->duUeCfg.rlcLcCfg[dbIdx].lcId == rlcUeCfg->rlcLcCfg[lcIdx].lcId) - { - if(f1UeDb->duUeCfg.rlcLcCfg[dbIdx].configType == CONFIG_MOD) - { - ret = fillRlcCfgToAddMod(&rlcUeCfg->rlcLcCfg[lcIdx], &f1UeDb->duUeCfg.rlcLcCfg[dbIdx]); - } - else if(f1UeDb->duUeCfg.rlcLcCfg[dbIdx].configType == CONFIG_DEL) - { - /* Free memory at matched lcIdx index */ - freeRlcLcCfg(&rlcUeCfg->rlcLcCfg[lcIdx]); - rlcUeCfg->numLcs--; - for(lcDelIdx = lcIdx; lcDelIdx < rlcUeCfg->numLcs; lcDelIdx++) - { - ret = fillRlcCfgToAddMod(&rlcUeCfg->rlcLcCfg[lcDelIdx], &rlcUeCfg->rlcLcCfg[lcDelIdx+1]); - freeRlcLcCfg(&rlcUeCfg->rlcLcCfg[lcDelIdx+1]); - if(ret == RFAILED) - { + if(f1UeDb->duUeCfg.rlcLcCfg[dbIdx].lcId == rlcUeCfg->rlcLcCfg[lcIdx].lcId) + { + if(f1UeDb->duUeCfg.rlcLcCfg[dbIdx].configType == CONFIG_MOD) + { + ret = fillRlcCfgToAddMod(&rlcUeCfg->rlcLcCfg[lcIdx], &f1UeDb->duUeCfg.rlcLcCfg[dbIdx]); + if(ret == RFAILED) + { + DU_LOG("\nERROR --> DU APP : Failed to modify LC at Idx %d in duUpdateRlcCfg()", lcDelIdx); + break; + } + fillSnssaiInfo(NULL, f1UeDb->duUeCfg.rlcLcCfg[dbIdx].snssai, &rlcUeCfg->rlcLcCfg[lcIdx].snssai, true); + } + else if(f1UeDb->duUeCfg.rlcLcCfg[dbIdx].configType == CONFIG_DEL) + { + /* Free memory at matched lcIdx index */ + freeRlcLcCfg(&rlcUeCfg->rlcLcCfg[lcIdx]); + rlcUeCfg->numLcs--; + for(lcDelIdx = lcIdx; lcDelIdx < rlcUeCfg->numLcs; lcDelIdx++) + { + ret = fillRlcCfgToAddMod(&rlcUeCfg->rlcLcCfg[lcDelIdx], &rlcUeCfg->rlcLcCfg[lcDelIdx+1]); + fillSnssaiInfo(NULL, rlcUeCfg->rlcLcCfg[lcDelIdx+1].snssai, &rlcUeCfg->rlcLcCfg[lcDelIdx].snssai,\ + true); + freeRlcLcCfg(&rlcUeCfg->rlcLcCfg[lcDelIdx+1]); + if(ret == RFAILED) + { DU_LOG("\nERROR --> DU APP : Failed to delete LC at Idx %d in duUpdateRlcCfg()", lcDelIdx); - break; - } - } - } - } + break; + } + } + } + } } if(f1UeDb->duUeCfg.rlcLcCfg[dbIdx].configType == CONFIG_ADD) { - ret = fillRlcCfgToAddMod(&rlcUeCfg->rlcLcCfg[lcIdx], &f1UeDb->duUeCfg.rlcLcCfg[dbIdx]); - if(ret == ROK) - rlcUeCfg->numLcs++; + ret = fillRlcCfgToAddMod(&rlcUeCfg->rlcLcCfg[lcIdx], &f1UeDb->duUeCfg.rlcLcCfg[dbIdx]); + if(ret == ROK) + { + fillSnssaiInfo(NULL, f1UeDb->duUeCfg.rlcLcCfg[dbIdx].snssai, &rlcUeCfg->rlcLcCfg[ rlcUeCfg->numLcs].snssai,\ + true); + rlcUeCfg->numLcs++; + } } } return ret; } - /******************************************************************* * * @brief Function to fill Tunnel Config to Add/Mod @@ -1997,7 +2278,7 @@ uint8_t fillTnlCfgToAddMod(UpTnlCfg **ueCbTnlCfg, UpTnlCfg *f1TnlCfg) memset(*ueCbTnlCfg, 0, sizeof(UpTnlCfg)); (*ueCbTnlCfg)->configType = f1TnlCfg->configType; (*ueCbTnlCfg)->cellId = f1TnlCfg->cellId; - (*ueCbTnlCfg)->ueIdx = f1TnlCfg->ueIdx; + (*ueCbTnlCfg)->ueId = f1TnlCfg->ueId; (*ueCbTnlCfg)->drbId = f1TnlCfg->drbId; if(f1TnlCfg->tnlCfg1) { @@ -2048,9 +2329,9 @@ uint8_t duProcEgtpTunnelCfg(uint8_t ueCbIdx, UpTnlCfg *duTnlCfg, UpTnlCfg *f1Tnl { if(duSendEgtpTnlMgmtReq(EGTP_TNL_MGMT_ADD, NULLP, f1TnlCfg->tnlCfg1) == ROK) { - if(fillTnlCfgToAddMod(&duCb.upTnlCfg[duCb.numDrb], f1TnlCfg) == ROK) + if(fillTnlCfgToAddMod(&duCb.upTnlCfg[duCb.numTeId], f1TnlCfg) == ROK) { - duCb.numDrb++; + duCb.numTeId++; ret = ROK; } } @@ -2070,8 +2351,8 @@ uint8_t duProcEgtpTunnelCfg(uint8_t ueCbIdx, UpTnlCfg *duTnlCfg, UpTnlCfg *f1Tnl if(duSendEgtpTnlMgmtReq(EGTP_TNL_MGMT_DEL, duTnlCfg->tnlCfg1->teId, f1TnlCfg->tnlCfg1) == ROK) { /* Free memory at drbIdx */ - duCb.numDrb--; - for(delIdx = ueCbIdx; delIdx < duCb.numDrb; delIdx++) + duCb.numTeId--; + for(delIdx = ueCbIdx; delIdx < duCb.numTeId; delIdx++) { /* moving all elements one index ahead */ ret = fillTnlCfgToAddMod(&duCb.upTnlCfg[delIdx], duCb.upTnlCfg[delIdx+1]); @@ -2103,15 +2384,15 @@ uint8_t duProcEgtpTunnelCfg(uint8_t ueCbIdx, UpTnlCfg *duTnlCfg, UpTnlCfg *f1Tnl * Functionality: Function to fill tunnel Config * and sends tunnel Cfg Req to EGTP * - * @params[in] ueIdx, cellId, DuUeCfg + * @params[in] ueId, cellId, DuUeCfg * @return ROK - success * RFAILED - failure * * ****************************************************************/ -uint8_t duUpdateTunnelCfgDb(uint8_t ueIdx, uint8_t cellId, DuUeCfg *duUeCfg) +uint8_t duUpdateTunnelCfgDb(uint8_t ueId, uint8_t cellId, DuUeCfg *duUeCfg) { - uint8_t ret = ROK, drbIdx, duCbDrbIdx; + uint8_t ret = ROK, drbIdx, teIdx; bool drbFound = false; /*If Add/Mod tunnels request for that DRB is successful in EGTP */ @@ -2119,32 +2400,34 @@ uint8_t duUpdateTunnelCfgDb(uint8_t ueIdx, uint8_t cellId, DuUeCfg *duUeCfg) for(drbIdx=0; drbIdx < duUeCfg->numDrb; drbIdx++) { duUeCfg->upTnlInfo[drbIdx].cellId = cellId; - duUeCfg->upTnlInfo[drbIdx].ueIdx = ueIdx; - for(duCbDrbIdx = 0; duCbDrbIdx < duCb.numDrb; duCbDrbIdx++) + duUeCfg->upTnlInfo[drbIdx].ueId = ueId; + for(teIdx = 0; teIdx < duCb.numTeId; teIdx++) { - 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((duCb.upTnlCfg[teIdx]->ueId == duUeCfg->upTnlInfo[drbIdx].ueId) && \ + (duCb.upTnlCfg[teIdx]->drbId == duUeCfg->upTnlInfo[drbIdx].drbId)) + { + drbFound = true; /* existing DRB */ + if(duProcEgtpTunnelCfg(teIdx, duCb.upTnlCfg[teIdx], &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) - { + 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; - } + duUeCfg->upTnlInfo[drbIdx].drbId); + ret = RFAILED; + break; + } } else break; @@ -2163,54 +2446,45 @@ uint8_t duUpdateTunnelCfgDb(uint8_t ueIdx, uint8_t cellId, DuUeCfg *duUeCfg) * * Functionality: update DuUeCb Mac and Rlc Ue Cfg * - * @params[in] ueIdx, cellIdx + * @params[in] ueId, cellIdx * @return ROK - success * RFAILED - failure * * ****************************************************************/ -uint8_t duUpdateDuUeCbCfg(uint8_t ueIdx, uint8_t cellId) +uint8_t duUpdateDuUeCbCfg(uint8_t ueId, 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]; + ueCb = &duCb.actvCellLst[cellIdx]->ueCb[ueId-1]; - /*Filling RLC Ue Cfg */ - ueCb->rlcUeCfg.cellId = cellId; - ueCb->rlcUeCfg.ueIdx = ueIdx; - ret = duUpdateRlcLcCfg(&ueCb->rlcUeCfg, ueCb->f1UeDb); - if(ret == ROK) + /*Filling RLC Ue Cfg */ + ueCb->rlcUeCfg.cellId = cellId; + ueCb->rlcUeCfg.ueId = ueId; + ret = duUpdateRlcLcCfg(&ueCb->rlcUeCfg, ueCb->f1UeDb); + if(ret == ROK) + { + /*Filling MAC Ue Cfg */ + GET_CRNTI(crnti, ueId); + ueCb->macUeCfg.cellId = cellId; + ueCb->macUeCfg.ueId = ueId; + 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 { - /*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; - } - } + if(duUpdateTunnelCfgDb(ueId, 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; + DU_LOG("\nERROR --> DU APP : Failed while updating RLC LC Config at duUpdateDuUeCbCfg()"); return ret; } @@ -2232,31 +2506,77 @@ uint8_t duUpdateDuUeCbCfg(uint8_t ueIdx, uint8_t cellId) uint8_t DuProcMacUeCfgRsp(Pst *pst, MacUeCfgRsp *cfgRsp) { uint8_t ret = ROK; + uint16_t cellIdx; if(cfgRsp) { + GET_CELL_IDX(cfgRsp->cellId, cellIdx); 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; + DU_LOG("\nINFO --> DU APP : MAC UE Create Response : SUCCESS [DU UE F1AP ID : %d]", cfgRsp->ueId); + + if(duCb.actvCellLst[cellIdx] && (duCb.actvCellLst[cellIdx]->ueCb[cfgRsp->ueId -1].gnbDuUeF1apId == cfgRsp->ueId)) + { + duCb.actvCellLst[cellIdx]->ueCb[cfgRsp->ueId -1].macUeCfg.macUeCfgState = UE_CREATE_COMPLETE; + + if((duCb.actvCellLst[cfgRsp->cellId -1]->ueCb[cfgRsp->ueId -1].ueState == UE_HANDIN_IN_PROGRESS) && + (duCb.actvCellLst[cfgRsp->cellId -1]->ueCb[cfgRsp->ueId -1].macUeCfg.macUeCfgState == UE_CREATE_COMPLETE) && + (duCb.actvCellLst[cfgRsp->cellId -1]->ueCb[cfgRsp->ueId -1].rlcUeCfg.rlcUeCfgState == UE_CREATE_COMPLETE)) + { + if((ret = duUpdateDuUeCbCfg(cfgRsp->ueId, cfgRsp->cellId)) == ROK) + { + /* If UE is in handover, RACH resource needs to be requested + * from MAC for CFRA */ + if((duBuildAndSendRachRsrcReqToMac(cfgRsp->cellId, cfgRsp->ueId)) != ROK) + { + DU_LOG("\nERROR --> DU APP : Failed to send RACH Resource Request to MAC"); + DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL, cfgRsp, sizeof(MacUeCfgRsp)); + return RFAILED; + } + } + else + { + DU_LOG("\nERROR -> DU APP : Failure in updating DU UE CB"); + DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL, cfgRsp, sizeof(MacUeCfgRsp)); + return RFAILED; + } + } + } } 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) + DU_LOG("\nINFO --> DU APP : MAC UE Reconfig Response : SUCCESS [DU UE F1AP ID : %d]", cfgRsp->ueId); + if(duCb.actvCellLst[cellIdx] && + (duCb.actvCellLst[cellIdx]->ueCb[cfgRsp->ueId -1].gnbDuUeF1apId == cfgRsp->ueId)) { - BuildAndSendUeCtxtRsp(cfgRsp->cellId, cfgRsp->ueIdx); + duCb.actvCellLst[cellIdx]->ueCb[cfgRsp->ueId -1].macUeCfg.macUeCfgState = UE_RECFG_COMPLETE; + if((duCb.actvCellLst[cellIdx]->ueCb[cfgRsp->ueId -1].macUeCfg.macUeCfgState == UE_RECFG_COMPLETE) && + (duCb.actvCellLst[cfgRsp->cellId -1]->ueCb[cfgRsp->ueId -1].rlcUeCfg.rlcUeCfgState == UE_RECFG_COMPLETE)) + { + if((ret = duUpdateDuUeCbCfg(cfgRsp->ueId, cfgRsp->cellId)) == ROK) + { + if((BuildAndSendUeCtxtRsp(cfgRsp->cellId, cfgRsp->ueId)) != ROK) + { + DU_LOG("\nERROR -> DU APP : Failure in BuildAndSendUeCtxtRsp()"); + DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL, cfgRsp, sizeof(MacUeCfgRsp)); + return RFAILED; + } + } + else + { + DU_LOG("\nERROR -> DU APP : Failure in updating DU UE CB"); + DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL, cfgRsp, sizeof(MacUeCfgRsp)); + return RFAILED; + } + } } } } else { - DU_LOG("\nERROR --> DU APP : MAC UE CFG Response for EVENT[%d]: FAILURE [UE IDX : %d]", pst->event, cfgRsp->ueIdx); + DU_LOG("\nERROR --> DU APP : MAC UE CFG Response for EVENT[%d]: FAILURE [DU UE F1AP ID : %d]", pst->event, cfgRsp->ueId); if(pst->event == EVENT_MAC_UE_RECONFIG_RSP) { //TODO: Send the failure case in Ue Context Setup Response @@ -2286,21 +2606,20 @@ uint8_t DuProcMacUeCfgRsp(Pst *pst, MacUeCfgRsp *cfgRsp) * Processes UE create Req to RLC UL * * @params[in] cellId, - * ueIdx, + * ueId, * Pointer to RlcUeCfg * @return ROK - success * RFAILED - failure * *****************************************************************/ -uint8_t duBuildAndSendUeCreateReqToRlc(uint16_t cellId, uint8_t ueIdx,\ - RlcUeCfg *duRlcUeCfg) +uint8_t duBuildAndSendUeCreateReqToRlc(uint16_t cellId, uint8_t gnbDuUeF1apId, DuUeCfg *ueCfgDb, RlcUeCfg *duRlcUeCfg) { uint8_t ret = ROK; RlcUeCfg *rlcUeCfg = NULLP; Pst pst; - ret = fillRlcUeCfg(cellId, ueIdx, NULL, duRlcUeCfg); + ret = fillRlcUeCfg(cellId, gnbDuUeF1apId, ueCfgDb, duRlcUeCfg); if(ret == RFAILED) { DU_LOG("\nERROR --> DU APP : Failed to fill Rlc Ue Cfg at duBuildAndSendUeCreateReqToRlc()"); @@ -2360,25 +2679,63 @@ uint8_t DuProcRlcUeCfgRsp(Pst *pst, RlcUeCfgRsp *cfgRsp) { if(pst->event == EVENT_RLC_UE_CREATE_RSP) { - 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; + DU_LOG("\nINFO --> DU_APP: RLC UE Create Response : SUCCESS [UE IDX:%d]", cfgRsp->ueId); + duCb.actvCellLst[cfgRsp->cellId -1]->ueCb[cfgRsp->ueId -1].rlcUeCfg.rlcUeCfgState = UE_CREATE_COMPLETE; + + if((duCb.actvCellLst[cfgRsp->cellId -1]->ueCb[cfgRsp->ueId -1].ueState == UE_HANDIN_IN_PROGRESS) && + (duCb.actvCellLst[cfgRsp->cellId -1]->ueCb[cfgRsp->ueId -1].macUeCfg.macUeCfgState == UE_CREATE_COMPLETE) && + (duCb.actvCellLst[cfgRsp->cellId -1]->ueCb[cfgRsp->ueId -1].rlcUeCfg.rlcUeCfgState == UE_CREATE_COMPLETE)) + { + if((ret = duUpdateDuUeCbCfg(cfgRsp->ueId, cfgRsp->cellId)) == ROK) + { + /* If UE is in handover, RACH resource needs to be requested + * from MAC for CFRA */ + if((duBuildAndSendRachRsrcReqToMac(cfgRsp->cellId, cfgRsp->ueId)) != ROK) + { + DU_LOG("\nERROR --> DU APP : Failed to send RACH Resource Request to MAC"); + DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL, cfgRsp, sizeof(MacUeCfgRsp)); + DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL, cfgRsp, sizeof(RlcUeCfgRsp)); + return RFAILED; + } + } + else + { + DU_LOG("\nERROR --> DU APP : Failure in updating DU UE CB"); + DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL, cfgRsp, sizeof(RlcUeCfgRsp)); + return RFAILED; + } + } } 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) + DU_LOG("\nINFO --> DU_APP: RLC UE Reconfig Response : SUCCESS [UE IDX:%d]", cfgRsp->ueId); + + duCb.actvCellLst[cfgRsp->cellId -1]->ueCb[cfgRsp->ueId -1].rlcUeCfg.rlcUeCfgState = UE_RECFG_COMPLETE; + if((duCb.actvCellLst[cfgRsp->cellId -1]->ueCb[cfgRsp->ueId -1].macUeCfg.macUeCfgState == UE_RECFG_COMPLETE) && + (duCb.actvCellLst[cfgRsp->cellId -1]->ueCb[cfgRsp->ueId -1].rlcUeCfg.rlcUeCfgState == UE_RECFG_COMPLETE)) { - BuildAndSendUeCtxtRsp(cfgRsp->cellId, cfgRsp->ueIdx); - } + if((ret = duUpdateDuUeCbCfg(cfgRsp->ueId, cfgRsp->cellId)) == ROK) + { + if((BuildAndSendUeCtxtRsp(cfgRsp->cellId, cfgRsp->ueId)) != ROK) + { + DU_LOG("\nERROR --> DU APP : Failure in BuildAndSendUeCtxtRsp"); + DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL, cfgRsp, sizeof(RlcUeCfgRsp)); + return RFAILED; + } + } + else + { + DU_LOG("\nERROR --> DU APP : Failure in updating DU UE CB"); + DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL, cfgRsp, sizeof(RlcUeCfgRsp)); + return RFAILED; + } + } } } else { DU_LOG("\nERROR --> DU_APP: RLC UE CFG Response for EVENT[%d] : FAILED [UE IDX : %d, REASON :%d]",\ - pst->event, cfgRsp->ueIdx, cfgRsp->reason); + pst->event, cfgRsp->ueId, cfgRsp->reason); if((pst->event == EVENT_RLC_UE_RECONFIG_RSP)) { //TODO: update failure case in ue Context setup Response @@ -2413,17 +2770,16 @@ uint8_t DuProcRlcUeCfgRsp(Pst *pst, RlcUeCfgRsp *cfgRsp) * * ****************************************************************/ -uint8_t duBuildAndSendUeReCfgReqToRlc(uint8_t cellId, uint8_t crnti, DuUeCfg *ueCfgDb) +uint8_t duBuildAndSendUeReCfgReqToRlc(uint8_t cellId, uint8_t gnbDuUeF1apId, uint8_t crnti, DuUeCfg *ueCfgDb) { - uint8_t ret = ROK, ueIdx = 0; + uint8_t ret = ROK; RlcUeCfg *rlcUeCfg = NULLP; - GET_UE_IDX(crnti, ueIdx); DU_ALLOC_SHRABL_BUF(rlcUeCfg, sizeof(RlcUeCfg)); if(rlcUeCfg) { memset(rlcUeCfg, 0, sizeof(RlcUeCfg)); - ret = fillRlcUeCfg(cellId, ueIdx, ueCfgDb, rlcUeCfg); + ret = fillRlcUeCfg(cellId, gnbDuUeF1apId, ueCfgDb, rlcUeCfg); if(ret == RFAILED) DU_LOG("\nERROR --> DU APP : Failed at duBuildAndSendUeReCfgReqToRlc()"); else @@ -2455,19 +2811,16 @@ uint8_t duBuildAndSendUeReCfgReqToRlc(uint8_t cellId, uint8_t crnti, DuUeCfg *ue * * ****************************************************************/ -uint8_t duBuildAndSendUeReCfgReqToMac(uint8_t cellId, uint8_t crnti, DuUeCfg *ueCfgDb) +uint8_t duBuildAndSendUeReCfgReqToMac(uint8_t cellId, uint8_t duUeF1apId, uint8_t crnti, DuUeCfg *ueCfgDb) { - uint8_t ret, ueIdx = 0; + uint8_t ret = ROK; MacUeCfg *macUeCfg = NULLP; - ret = ROK; - GET_UE_IDX(crnti, ueIdx); - DU_ALLOC_SHRABL_BUF(macUeCfg, sizeof(MacUeCfg)); if(macUeCfg) { memset(macUeCfg, 0, sizeof(MacUeCfg)); - ret = fillMacUeCfg(cellId, ueIdx, crnti, ueCfgDb, macUeCfg); + ret = fillMacUeCfg(cellId, duUeF1apId, crnti, ueCfgDb, macUeCfg); if(ret == RFAILED) DU_LOG("\nERROR --> DU APP : Failed to fill Mac Ue Cfg at duBuildAndSendUeReCfgReqToMac()"); else @@ -2499,20 +2852,55 @@ uint8_t duBuildAndSendUeReCfgReqToMac(uint8_t cellId, uint8_t crnti, DuUeCfg *ue * *****************************************************************/ -uint8_t duBuildAndSendUeContextSetupReq(uint16_t cellId, uint16_t crnti, DuUeCfg *duUeCfg) +uint8_t duBuildAndSendUeContextSetupReq(uint16_t cellId, DuUeCb *ueCb) { uint8_t ret = ROK; + uint16_t crnti; + DuUeCfg *duUeCfg = NULLP; 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()"); + + if(!ueCb) + { + DU_LOG("\nERROR --> DU APP : UE Cb is NULL"); + return RFAILED; + } + + crnti = ueCb->crnti; + duUeCfg = &ueCb->f1UeDb->duUeCfg; + + /* If UE is being handed-in to this DU, UE context setup request will create + * new UE context at MAC/SCH and RLC. + * If UE is in active state, UE contex setup request will lead to + * reconfiguration of UE at MAC/SCH and RLC + */ + if(ueCb->ueState == UE_HANDIN_IN_PROGRESS) + { + /* Filling MAC UE Config */ + memset(&ueCb->macUeCfg, 0, sizeof(MacUeCfg)); + + /* Since UE attach has not yet happened, crnti is unknow. Hence passing 0 */ + ret = duBuildAndSendUeCreateReqToMac(cellId, ueCb->gnbDuUeF1apId, 0, duUeCfg, &ueCb->macUeCfg); + if(ret == RFAILED) + DU_LOG("\nERROR --> DU APP : Failed to send UE create request to MAC"); + + ret = duBuildAndSendUeCreateReqToRlc(cellId, ueCb->gnbDuUeF1apId, duUeCfg, &ueCb->rlcUeCfg); + if(ret == RFAILED) + DU_LOG("\nERROR --> DU APP : Failed to send UE create request to RLC"); + + } + else + { + /* Filling RLC UE Reconfig */ + ret = duBuildAndSendUeReCfgReqToRlc(cellId, ueCb->gnbDuUeF1apId, 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, ueCb->gnbDuUeF1apId, crnti, duUeCfg); + if(ret == RFAILED) + DU_LOG("\nERROR --> DU APP : Failed at build ctxt setup req for MAC at duBuildAndSendUeContextSetupReq()"); + } return ret; } @@ -2537,7 +2925,7 @@ uint8_t duBuildAndSendUeContextSetupReq(uint16_t cellId, uint16_t crnti, DuUeCfg *****************************************************************/ uint8_t DuProcRlcDlRrcMsgRsp(Pst *pst, RlcDlRrcMsgRsp *dlRrcMsg) { - uint8_t ret = ROK, ueIdx = 0; + uint8_t ret = ROK, ueId = 0; uint16_t cellId, crnti; DuUeCb *ueCb = NULLP; DlMsgState state; @@ -2549,21 +2937,21 @@ uint8_t DuProcRlcDlRrcMsgRsp(Pst *pst, RlcDlRrcMsgRsp *dlRrcMsg) if(state == TRANSMISSION_COMPLETE) { - GET_UE_IDX(crnti, ueIdx); - ueCb = &duCb.actvCellLst[cellId -1]->ueCb[ueIdx -1]; + GET_UE_ID(crnti, ueId); + ueCb = &duCb.actvCellLst[cellId -1]->ueCb[ueId -1]; if(ueCb->f1UeDb && ueCb->f1UeDb->dlRrcMsgPres) { if(ueCb->f1UeDb->actionType == UE_CTXT_SETUP) { - ret = duBuildAndSendUeContextSetupReq(cellId, crnti, &ueCb->f1UeDb->duUeCfg); + ret = duBuildAndSendUeContextSetupReq(cellId, ueCb); 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(cellId, crnti, &ueCb->f1UeDb->duUeCfg); + ret = duBuildAndSendUeContextModReq(cellId, ueCb->gnbDuUeF1apId, crnti, &ueCb->f1UeDb->duUeCfg); if(ret == RFAILED) DU_LOG("\nERROR --> DU APP : Failed to process UE Context Mod Request in DuProcRlcDlRrcMsgRsp()"); } @@ -2607,6 +2995,7 @@ uint8_t duProcUeContextSetupRequest(DuUeCb *ueCb) if(ueCb) { cellId = duCb.actvCellLst[ueCb->f1UeDb->cellIdx]->cellId; + /* Send DL RRC msg for security Mode */ if(ueCb->f1UeDb->dlRrcMsg) { @@ -2625,7 +3014,7 @@ uint8_t duProcUeContextSetupRequest(DuUeCb *ueCb) } else if(ueCb->f1UeDb->actionType == UE_CTXT_SETUP) { - ret = duBuildAndSendUeContextSetupReq(cellId, ueCb->crnti, &ueCb->f1UeDb->duUeCfg); + ret = duBuildAndSendUeContextSetupReq(cellId, ueCb); if(ret == RFAILED) { DU_LOG("\nERROR --> DU APP : Failed to build ue context setup Req in duProcUeContextSetupRequest()"); @@ -2658,18 +3047,18 @@ uint8_t duProcUeContextSetupRequest(DuUeCb *ueCb) * *****************************************************************/ -uint8_t duBuildAndSendUeContextModReq(uint16_t cellId, uint16_t crnti, DuUeCfg *duUeCfg) +uint8_t duBuildAndSendUeContextModReq(uint16_t cellId, uint8_t gnbDuUeF1apId, 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); + ret = duBuildAndSendUeReCfgReqToRlc(cellId, gnbDuUeF1apId, 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); + ret = duBuildAndSendUeReCfgReqToMac(cellId, gnbDuUeF1apId, crnti, duUeCfg); if(ret == RFAILED) DU_LOG("\nERROR --> DU APP : Failed at build ctxt setup req for MAC at duBuildAndSendUeContextModReq()"); @@ -2717,44 +3106,80 @@ uint8_t duProcUeContextModReq(DuUeCb *ueCb) } } } - else + else if(ueCb->f1UeDb->actionType == UE_CTXT_MOD) { - ret = duBuildAndSendUeContextModReq(cellId, ueCb->crnti, &ueCb->f1UeDb->duUeCfg); + ret = duBuildAndSendUeContextModReq(cellId, ueCb->gnbDuUeF1apId, ueCb->crnti, &ueCb->f1UeDb->duUeCfg); if(ret == RFAILED) { DU_LOG("\nERROR --> DU APP : Failed to build ue context setup Req in duProcUeContextModReq()"); + return RFAILED; + } + } + else if((ueCb->f1UeDb->actionType == UE_CTXT_CFG_QUERY) || (ueCb->f1UeDb->actionType == UE_CTXT_RRC_RECFG_COMPLETE)) + { + if((BuildAndSendUeContextModRsp(ueCb) != ROK)) + { + DU_LOG("\nERROR --> DU APP : Failed to build UE Context modification response"); + return RFAILED; } } } else { //TODO: To send the failure cause in UeContextModRsp + DU_LOG("ERROR --> DU APP : Failed to process UE CNTXT MOD REQ at duProcUeContextModReq()"); + return RFAILED; } return ROK; } /******************************************************************* * -* @brief Function to delete Pdsch ServCellCfg +* @brief Build and send dedicated RACH resource release request to MAC * * @details * -* Function : deletePdschServCellCfg +* Function : duBuildAndSendRachRsrcRelToMac * -* Functionality: Function to delete Pdsch ServCellCfg +* Functionality: Function to Build and send dedicated RACH resource +* release request to MAC * -* @params[in] PdschServCellCfg *pdschServCellCfg -* @return void +* @params[in] Cell ID +* UE CB +* @return ROK - Success +* RFAILED - Failure * * ****************************************************************/ - -void deletePdschServCellCfg(PdschServCellCfg *pdschServCellCfg) +uint8_t duBuildAndSendRachRsrcRelToMac(uint16_t cellId, DuUeCb *ueCb) { - 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)); + Pst pst; + MacRachRsrcRel *rachRsrcRel = NULLP; + + DU_ALLOC_SHRABL_BUF(rachRsrcRel, sizeof(MacRachRsrcRel)); + if(!rachRsrcRel) + { + DU_LOG("\nERROR --> DU APP : Failed to allocate memory for RACH Resource Release in \ + duBuildAndSendRachRsrcRelToMac()"); + return RFAILED; + } + + rachRsrcRel->cellId = cellId; + rachRsrcRel->ueId = ueCb->gnbDuUeF1apId; + rachRsrcRel->crnti = ueCb->crnti; + + /* Fill Pst */ + FILL_PST_DUAPP_TO_MAC(pst, EVENT_MAC_RACH_RESOURCE_REL); + + if(((*packMacRachRsrcRelOpts[pst.selector])(&pst, rachRsrcRel)) != ROK) + { + DU_LOG("\nERROR --> DU_APP : Failure in sending RACH Resource Release to MAC at \ + duBuildAndSendRachRsrcRelToMac()"); + DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL, rachRsrcRel, sizeof(MacRachRsrcRel)); + return RFAILED; + } + + return ROK; } /******************************************************************* @@ -2799,31 +3224,33 @@ void deleteMacUeCfg(MacUeCfg *ueCfg) * * Functionality: delete UE Configuration of a particular UE * -* @params[in] uint16_t cellIdx, uint8_t ueIdx +* @params[in] uint16_t cellIdx, uint8_t ueId * @return ROK - success * RFAILED - failure * * ****************************************************************/ -uint8_t deleteUeCfg(uint16_t cellIdx, uint8_t ueIdx) +uint8_t deleteUeCfg(uint16_t cellId, uint8_t ueId) { uint8_t tnlIdx = 0; + uint16_t cellIdx = 0; DuUeCb *ueCb = NULLP; + GET_CELL_IDX(cellId, cellIdx); 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)) + if((duCb.actvCellLst[cellIdx]->ueCb[ueId-1].macUeCfg.macUeCfgState == UE_DELETE_COMPLETE)\ + &&(duCb.actvCellLst[cellIdx]->ueCb[ueId-1].rlcUeCfg.rlcUeCfgState == UE_DELETE_COMPLETE)) { - ueCb = &duCb.actvCellLst[cellIdx]->ueCb[ueIdx-1]; + ueCb = &duCb.actvCellLst[cellIdx]->ueCb[ueId-1]; deleteMacUeCfg(&ueCb->macUeCfg); deleteRlcUeCfg(&ueCb->rlcUeCfg); if(ueCb->f1UeDb !=NULLP) { freeF1UeDb(ueCb->f1UeDb); } - for(tnlIdx = 0; tnlIdx < duCb.numDrb; ) + for(tnlIdx = 0; tnlIdx < duCb.numTeId; ) { - if(duCb.upTnlCfg[tnlIdx]->ueIdx == ueIdx) + if(duCb.upTnlCfg[tnlIdx]->ueId == ueId) { duCb.upTnlCfg[tnlIdx]->configType = CONFIG_DEL; duProcEgtpTunnelCfg(tnlIdx, duCb.upTnlCfg[tnlIdx], duCb.upTnlCfg[tnlIdx]); @@ -2831,6 +3258,7 @@ uint8_t deleteUeCfg(uint16_t cellIdx, uint8_t ueIdx) else tnlIdx++; } + unsetBitInUeBitMap(cellId, ueId-1); duCb.actvCellLst[cellIdx]->numActvUes--; memset(ueCb, 0, sizeof(DuUeCb)); } @@ -2872,7 +3300,7 @@ uint8_t DuProcMacUeDeleteRsp(Pst *pst, MacUeDeleteRsp *deleteRsp) if(deleteRsp) { - if(deleteRsp->result == SUCCESS) + if(deleteRsp->result == DEL_SUCCESSFUL) { DU_LOG("\nINFO --> DU APP : MAC UE Delete Response : SUCCESS [UE IDX : %d]", deleteRsp->ueId); GET_CELL_IDX(deleteRsp->cellId, cellIdx); @@ -2880,9 +3308,9 @@ uint8_t DuProcMacUeDeleteRsp(Pst *pst, MacUeDeleteRsp *deleteRsp) { duCb.actvCellLst[cellIdx]->ueCb[deleteRsp->ueId -1].macUeCfg.macUeCfgState = UE_DELETE_COMPLETE; ueId = deleteRsp->ueId; - gnbCuUeF1apId = duCb.actvCellLst[cellIdx]->ueCb[ueId-1].gnbDuUeF1apId; - gnbDuUeF1apId = duCb.actvCellLst[cellIdx]->ueCb[ueId-1].gnbCuUeF1apId; - if(deleteUeCfg(cellIdx, ueId) == ROK) + gnbCuUeF1apId = duCb.actvCellLst[cellIdx]->ueCb[ueId-1].gnbCuUeF1apId; + gnbDuUeF1apId = duCb.actvCellLst[cellIdx]->ueCb[ueId-1].gnbDuUeF1apId; + if(deleteUeCfg(deleteRsp->cellId, ueId) == ROK) { ret = BuildAndSendUeContextReleaseComplete(deleteRsp->cellId, gnbCuUeF1apId, gnbDuUeF1apId); if(ret != ROK) @@ -3079,7 +3507,7 @@ uint8_t duBuildAndSendUeDeleteReq(uint16_t cellId, uint16_t crnti) DU_LOG("\nDEBUG --> DU_APP: Processing UE Delete Request "); GET_CELL_IDX(cellId, cellIdx); - GET_UE_IDX(crnti, ueId); + GET_UE_ID(crnti, ueId); if(duCb.actvCellLst[cellIdx] != NULLP) { @@ -3155,6 +3583,7 @@ void deleteRlcUeCfg(RlcUeCfg *ueCfg) break; } } + DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL, lcCfg->snssai, sizeof(Snssai)); } memset(ueCfg, 0, sizeof(RlcUeCfg)); } @@ -3175,48 +3604,44 @@ void deleteRlcUeCfg(RlcUeCfg *ueCfg) * RFAILED - failure * * ****************************************************************/ -uint8_t duProcUeContextReleaseCommand(DuUeCb *duUeCb) +uint8_t duProcUeContextReleaseCommand(uint16_t cellId, 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) + uint8_t ret =ROK, ueId=0; + uint16_t crnti = 0; + + if(duUeCb != NULLP) { - if(duUeCb->f1UeDb->dlRrcMsg->rrcMsgPdu != NULLP) + crnti = duUeCb->crnti; + GET_UE_ID(crnti, ueId); + + if(duUeCb->f1UeDb) { - ret = duBuildAndSendDlRrcMsgToRlc(cellId, duCb.actvCellLst[duUeCb->f1UeDb->cellIdx]->ueCb[ueIdx].rlcUeCfg,\ - duUeCb->f1UeDb->dlRrcMsg); - if(ret == RFAILED) + /* Send DL RRC msg for RRC release */ + if(duUeCb->f1UeDb->dlRrcMsg) { - 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)); + if(duUeCb->f1UeDb->dlRrcMsg->rrcMsgPdu != NULLP) + { + ret = duBuildAndSendDlRrcMsgToRlc(cellId, duCb.actvCellLst[duUeCb->f1UeDb->cellIdx]->ueCb[ueId-1].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) + else { - DU_LOG("\nERROR --> DU APP : duProcUeContextReleaseCommand(): Failed to build and send Ue Delete request"); + ret = duBuildAndSendUeDeleteReq(cellId,crnti); + if(ret == RFAILED) + { + DU_LOG("\nERROR --> DU APP : duProcUeContextReleaseCommand(): Failed to build and send Ue Delete request"); + } } } - return ret; }