From dbd4e21a0ea25e4f7b6ff7b0eb8029a2d0382a35 Mon Sep 17 00:00:00 2001 From: "lal.harshita" Date: Fri, 25 Feb 2022 14:43:30 +0530 Subject: [PATCH] [Epic-ID: ODUHIGH-406][Task-ID: ODUHIGH-423] Fixes in DU APP to support cell ID other than 1 Signed-off-by: lal.harshita Change-Id: Id8a0aab76e6311c27a29facbeec8261fdbd6f3db Signed-off-by: lal.harshita --- src/cm/common_def.h | 2 +- src/du_app/du_cell_mgr.c | 16 +++++---- src/du_app/du_f1ap_msg_hdl.c | 71 ++++++++++++++++++++++----------------- src/du_app/du_msg_hdl.c | 22 +++++++----- src/du_app/du_ue_mgr.c | 79 ++++++++++++++++++++++++++------------------ 5 files changed, 112 insertions(+), 78 deletions(-) diff --git a/src/cm/common_def.h b/src/cm/common_def.h index fc51869d2..aad5bfdae 100644 --- a/src/cm/common_def.h +++ b/src/cm/common_def.h @@ -55,7 +55,7 @@ #define RADIO_FRAME_DURATION 10 /* Time duration of a radio frame in ms */ /* MAX values */ -#define MAX_NUM_CELL 1 +#define MAX_NUM_CELL 2 /* Changed to 2 to support cell Id 2 even if there is only one cell in DU */ #define MAX_NUM_MU 4 #define MAX_NUM_UE 3 #define MAX_NUM_UE_PER_TTI 1 diff --git a/src/du_app/du_cell_mgr.c b/src/du_app/du_cell_mgr.c index b81ddca81..a86d418f2 100644 --- a/src/du_app/du_cell_mgr.c +++ b/src/du_app/du_cell_mgr.c @@ -87,13 +87,15 @@ uint8_t duProcCellsToBeActivated(uint8_t *plmnStr, uint16_t nci, uint16_t nRPci) cellCb->cellStatus = ACTIVATION_IN_PROGRESS; cellCb->cellInfo.nrPci = nRPci; - duCb.actvCellLst[duCb.numActvCells++] = cellCb; + duCb.actvCellLst[cellCb->cellId -1] = cellCb; + duCb.numActvCells++; if(duBuildAndSendMacCellCfg(cellCb->cellId) != ROK) { DU_LOG("\nERROR --> DU APP : macCellCfg build and send failed"); /* Delete cell from actvCellList */ - duCb.actvCellLst[--(duCb.numActvCells)] = NULLP; + duCb.actvCellLst[cellCb->cellId -1] = NULLP; + --(duCb.numActvCells); ret = RFAILED; } return ret; @@ -138,11 +140,13 @@ void duProcF1SetupRsp() uint8_t duGetCellCb(uint16_t cellId, DuCellCb **cellCb) { uint8_t cellIdx = 0; - for(cellIdx=0; cellIdxcellId == cellId) + if(duCb.actvCellLst[cellIdx] && (duCb.actvCellLst[cellIdx]->cellId == cellId)) + { *cellCb = duCb.actvCellLst[cellIdx]; - break; + break; + } } if(!*cellCb) @@ -254,7 +258,7 @@ uint8_t DuProcMacCellDeleteRsp(Pst *pst, MacCellDeleteRsp *deleteRsp) { 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) + if(duCb.actvCellLst[cellIdx] && (duCb.actvCellLst[cellIdx]->cellId == deleteRsp->cellId)) { memset(duCb.actvCellLst[cellIdx], 0, sizeof(DuCellCb)); gCellStatus = CELL_DOWN; diff --git a/src/du_app/du_f1ap_msg_hdl.c b/src/du_app/du_f1ap_msg_hdl.c index 543c65e02..2a8cbad50 100644 --- a/src/du_app/du_f1ap_msg_hdl.c +++ b/src/du_app/du_f1ap_msg_hdl.c @@ -11799,7 +11799,7 @@ void freeAperDecodeF1UeContextSetupReq(UEContextSetupRequest_t *ueSetReq) * ****************************************************************/ uint8_t procF1UeContextSetupReq(F1AP_PDU_t *f1apMsg) { - uint8_t ret=0, ieIdx=0, ueIdx=0, cellIdx=0; + uint8_t ret=0, ieIdx=0, ueIdx=0, cellIdx=0, servCellIdx = 0; bool ueCbFound = false; uint32_t gnbCuUeF1apId=0, gnbDuUeF1apId=0, bitRateSize=0; DuUeCb *duUeCb = NULL; @@ -11825,31 +11825,36 @@ uint8_t procF1UeContextSetupReq(F1AP_PDU_t *f1apMsg) } case ProtocolIE_ID_id_ServCellIndex: { - cellIdx = ueSetReq->protocolIEs.list.array[ieIdx]->value.choice.ServCellIndex; - for(ueIdx = 0; ueIdx < MAX_NUM_UE; ueIdx++) + servCellIdx = ueSetReq->protocolIEs.list.array[ieIdx]->value.choice.ServCellIndex; + for(cellIdx = 0; cellIdx < MAX_NUM_CELL; cellIdx++) { - if((duCb.actvCellLst[cellIdx]->ueCb[ueIdx].gnbDuUeF1apId == gnbDuUeF1apId)&&\ - (duCb.actvCellLst[cellIdx]->ueCb[ueIdx].gnbCuUeF1apId == gnbCuUeF1apId)) + for(ueIdx = 0; ueIdx < MAX_NUM_UE; ueIdx++) { - ueCbFound = true; - duUeCb = &duCb.actvCellLst[cellIdx]->ueCb[ueIdx]; - DU_ALLOC(duUeCb->f1UeDb, sizeof(F1UeContextSetupDb)); - if(duUeCb->f1UeDb) + if(duCb.actvCellLst[cellIdx] && (duCb.actvCellLst[cellIdx]->ueCb[ueIdx].gnbDuUeF1apId == gnbDuUeF1apId)&&\ + (duCb.actvCellLst[cellIdx]->ueCb[ueIdx].gnbCuUeF1apId == gnbCuUeF1apId)) { - memset(duUeCb->f1UeDb, 0, sizeof(F1UeContextSetupDb)); - duUeCb->f1UeDb->actionType = UE_CTXT_SETUP; - duUeCb->f1UeDb->cellIdx = cellIdx; + ueCbFound = true; + duUeCb = &duCb.actvCellLst[cellIdx]->ueCb[ueIdx]; + DU_ALLOC(duUeCb->f1UeDb, sizeof(F1UeContextSetupDb)); + if(duUeCb->f1UeDb) + { + memset(duUeCb->f1UeDb, 0, sizeof(F1UeContextSetupDb)); + duUeCb->f1UeDb->actionType = UE_CTXT_SETUP; + duUeCb->f1UeDb->cellIdx = cellIdx; + } + else + { + DU_LOG("\nERROR --> F1AP: Memory Alloc Failed at procF1UeContextSetupReq()"); + ret = RFAILED; + } + break; } else - { - DU_LOG("\nERROR --> F1AP: Memory Alloc Failed at procF1UeContextSetupReq()"); - ret = RFAILED; - } - break; - } - else - ueCbFound = false; + ueCbFound = false; + } + if(ueCbFound) + break; } if(!ueCbFound) { @@ -14425,19 +14430,23 @@ uint8_t procF1UeContextModificationReq(F1AP_PDU_t *f1apMsg) case ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID: { gnbDuUeF1apId = ueContextModifyReq->protocolIEs.list.array[ieIdx]->value.choice.GNB_DU_UE_F1AP_ID; - for(cellIdx = 0; cellIdx < duCb.numActvCells; cellIdx++) + for(cellIdx = 0; cellIdx < MAX_NUM_CELL; cellIdx++) { - for(ueIdx = 0; ueIdx < duCb.actvCellLst[cellIdx]->numActvUes; ueIdx++) + if(duCb.actvCellLst[cellIdx]) { - if((duCb.actvCellLst[cellIdx]->ueCb[ueIdx].gnbDuUeF1apId == gnbDuUeF1apId)&&\ - (duCb.actvCellLst[cellIdx]->ueCb[ueIdx].gnbCuUeF1apId == gnbCuUeF1apId)) + for(ueIdx = 0; ueIdx < duCb.actvCellLst[cellIdx]->numActvUes; ueIdx++) { - duUeCb = &duCb.actvCellLst[cellIdx]->ueCb[ueIdx]; - if(duUeCb->f1UeDb == NULLP) + if((duCb.actvCellLst[cellIdx]->ueCb[ueIdx].gnbDuUeF1apId == gnbDuUeF1apId)&&\ + (duCb.actvCellLst[cellIdx]->ueCb[ueIdx].gnbCuUeF1apId == gnbCuUeF1apId)) { - DU_ALLOC(duUeCb->f1UeDb, sizeof(F1UeContextSetupDb)); + duUeCb = &duCb.actvCellLst[cellIdx]->ueCb[ueIdx]; + if(duUeCb->f1UeDb == NULLP) + { + DU_ALLOC(duUeCb->f1UeDb, sizeof(F1UeContextSetupDb)); + duUeCb->f1UeDb->cellIdx = cellIdx; + } + break; } - break; } } } @@ -14853,7 +14862,7 @@ uint8_t BuildAndSendUeContextReleaseComplete(uint16_t cellId, uint32_t gnbCuUeF1 break; }while(true); - if(ret == ROK && (duCb.actvCellLst[cellId-1]->numActvUes == 0)) + if(ret == ROK && duCb.actvCellLst[cellId-1] && (duCb.actvCellLst[cellId-1]->numActvUes == 0)) { duCb.actvCellLst[cellId-1]->cellStatus = DELETION_IN_PROGRESS; ret = duSendCellDeletReq(cellId); @@ -14976,11 +14985,11 @@ uint8_t procF1UeContextReleaseCommand(F1AP_PDU_t *f1apMsg) case ProtocolIE_ID_id_RRCContainer: { - for(cellIdx = 0; cellIdx < duCb.numActvCells; cellIdx++) + for(cellIdx = 0; cellIdx < MAX_NUM_CELL; cellIdx++) { for(ueIdx = 0; ueIdx < MAX_NUM_UE; ueIdx++) { - if((duCb.actvCellLst[cellIdx]->ueCb[ueIdx].gnbDuUeF1apId == gnbDuUeF1apId)&&\ + if(duCb.actvCellLst[cellIdx] && (duCb.actvCellLst[cellIdx]->ueCb[ueIdx].gnbDuUeF1apId == gnbDuUeF1apId)&&\ (duCb.actvCellLst[cellIdx]->ueCb[ueIdx].gnbCuUeF1apId == gnbCuUeF1apId)) { duUeCb = &duCb.actvCellLst[cellIdx]->ueCb[ueIdx]; diff --git a/src/du_app/du_msg_hdl.c b/src/du_app/du_msg_hdl.c index 07aa5e09e..c1826e1e4 100644 --- a/src/du_app/du_msg_hdl.c +++ b/src/du_app/du_msg_hdl.c @@ -359,7 +359,7 @@ uint8_t duProcCfgComplete() { uint8_t idx1=0; memset(cell, 0, sizeof(DuCellCb)); - cell->cellId = ++cellId; + cell->cellId = NR_CELL_ID; //++cellId; memset(&cell->cellInfo.nrEcgi.plmn, 0, sizeof(Plmn)); cell->cellInfo.nrEcgi.plmn.mcc[0] = duCfgParam.srvdCellLst[0].duCellInfo.cellInfo.srvdPlmn[0].plmn.mcc[0]; cell->cellInfo.nrEcgi.plmn.mcc[1] = duCfgParam.srvdCellLst[0].duCellInfo.cellInfo.srvdPlmn[0].plmn.mcc[1]; @@ -1450,7 +1450,13 @@ uint8_t duBuildAndSendMacCellCfg(uint16_t cellId) } /* store the address in the duCellCb so that we can free on confirm msg */ - duCb.actvCellLst[cellId-1]->duMacCellCfg = duMacCellCfg; + if(duCb.actvCellLst[cellId-1]) + duCb.actvCellLst[cellId-1]->duMacCellCfg = duMacCellCfg; + else + { + DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL, duMacCellCfg, sizeof(MacCellCfg)); + return RFAILED; + } /* copy the mac config structure from duCfgParams */ memcpy(duMacCellCfg,&duCfgParam.macCellCfg,sizeof(MacCellCfg)); @@ -1484,7 +1490,7 @@ uint8_t duHandleMacCellCfgCfm(Pst *pst, MacCellCfgCfm *macCellCfgCfm) for(actvCellIdx = 0; actvCellIdx < MAX_NUM_CELL; actvCellIdx++) { - if(macCellCfgCfm->cellId == duCb.actvCellLst[actvCellIdx]->cellId) + if((duCb.actvCellLst[actvCellIdx]) && (macCellCfgCfm->cellId == duCb.actvCellLst[actvCellIdx]->cellId)) { duCb.actvCellLst[actvCellIdx]->duMacCellCfg = NULLP; } @@ -1539,16 +1545,16 @@ uint8_t duBuildAndSendMacCellStart() return RFAILED; } - for(uint8_t id = 0; id < duCb.numActvCells; id++) + for(uint8_t id = 0; id < MAX_NUM_CELL; id++) { if(duCb.actvCellLst[id]) { - cellId->cellId = duCb.actvCellLst[id]->cellId; + cellId->cellId = duCb.actvCellLst[id]->cellId; - /* Fill Pst */ - FILL_PST_DUAPP_TO_MAC(pst, EVENT_MAC_CELL_START); + /* Fill Pst */ + FILL_PST_DUAPP_TO_MAC(pst, EVENT_MAC_CELL_START); - return (*packMacCellStartOpts[pst.selector])(&pst, cellId); + return (*packMacCellStartOpts[pst.selector])(&pst, cellId); } } return ROK; diff --git a/src/du_app/du_ue_mgr.c b/src/du_app/du_ue_mgr.c index 28c657a1b..f0212001e 100644 --- a/src/du_app/du_ue_mgr.c +++ b/src/du_app/du_ue_mgr.c @@ -462,41 +462,47 @@ 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; - } - } + 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; } @@ -1201,7 +1207,13 @@ uint8_t fillMacUeCfg(uint16_t cellId, uint8_t ueId, uint16_t crnti, DuUeCfg *ueC { /* Fetching MacDb from DuUeCb */ GET_CELL_IDX(cellId, cellIdx); - duMacDb = &duCb.actvCellLst[cellIdx]->ueCb[ueId-1].macUeCfg; + if(duCb.actvCellLst[cellIdx]) + duMacDb = &duCb.actvCellLst[cellIdx]->ueCb[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; @@ -1679,7 +1691,7 @@ uint8_t duCreateUeCb(UeCcchCtxt *ueCcchCtxt, uint32_t gnbCuUeF1apId) 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_ID(ueCcchCtxt->crnti, ueId); DU_LOG("\nDEBUG --> DU_APP: Filling UeCb for ueId [%d]", ueId); @@ -1796,6 +1808,11 @@ uint8_t duUpdateMacCfg(MacUeCfg *macUeCfg, F1UeContextSetupDb *f1UeDb) ret = ROK; GET_CELL_IDX(macUeCfg->cellId, cellIdx); + 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*/ @@ -2244,10 +2261,8 @@ uint8_t duUpdateDuUeCbCfg(uint8_t ueId, uint8_t cellId) GET_CELL_IDX(cellId, cellIdx); - if((duCb.actvCellLst[cellIdx]->ueCb[ueId-1].macUeCfg. \ - macUeCfgState == UE_RECFG_COMPLETE) && - (duCb.actvCellLst[cellIdx]->ueCb[ueId-1].rlcUeCfg. \ - rlcUeCfgState == UE_RECFG_COMPLETE)) + if(duCb.actvCellLst[cellIdx] && (duCb.actvCellLst[cellIdx]->ueCb[ueId-1].macUeCfg.macUeCfgState == UE_RECFG_COMPLETE) && + (duCb.actvCellLst[cellIdx]->ueCb[ueId-1].rlcUeCfg.rlcUeCfgState == UE_RECFG_COMPLETE)) { ueCb = &duCb.actvCellLst[cellIdx]->ueCb[ueId-1]; -- 2.16.6