#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
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;
uint8_t duGetCellCb(uint16_t cellId, DuCellCb **cellCb)
{
uint8_t cellIdx = 0;
- for(cellIdx=0; cellIdx<duCb.numActvCells; cellIdx++)
+ for(cellIdx=0; cellIdx < MAX_NUM_CELL; cellIdx++)
{
- if(duCb.actvCellLst[cellIdx]->cellId == cellId)
+ if(duCb.actvCellLst[cellIdx] && (duCb.actvCellLst[cellIdx]->cellId == cellId))
+ {
*cellCb = duCb.actvCellLst[cellIdx];
- break;
+ break;
+ }
}
if(!*cellCb)
{
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;
* ****************************************************************/
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;
}
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)
{
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;
}
}
}
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);
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];
{
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];
}
/* 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));
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;
}
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;
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;
}
{
/* 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;
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);
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*/
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];