schCellCfg.schRachCfg.rootSeqIdx = macCellCfg->prachCfg.fdm[0].rootSeqIdx;
schCellCfg.schRachCfg.numRootSeq = macCellCfg->prachCfg.fdm[0].numRootSeq;
schCellCfg.schRachCfg.k1 = macCellCfg->prachCfg.fdm[0].k1;
+ schCellCfg.schRachCfg.totalNumRaPreamble = macCellCfg->prachCfg.totalNumRaPreamble;
schCellCfg.schRachCfg.ssbPerRach = macCellCfg->prachCfg.ssbPerRach;
- schCellCfg.schRachCfg.prachMultCarrBand = \
- macCellCfg->prachCfg.prachMultCarrBand;
+ schCellCfg.schRachCfg.numCbPreamblePerSsb = macCellCfg->prachCfg.numCbPreamblePerSsb;
+ schCellCfg.schRachCfg.prachMultCarrBand = macCellCfg->prachCfg.prachMultCarrBand;
schCellCfg.schRachCfg.raContResTmr = macCellCfg->prachCfg.raContResTmr;
schCellCfg.schRachCfg.rsrpThreshSsb = macCellCfg->prachCfg.rsrpThreshSsb;
schCellCfg.schRachCfg.raRspWindow = macCellCfg->prachCfg.raRspWindow;
break;
#endif /* LCRGMILRG */
case EVENT_MAC_CELL_CONFIG_REQ:
- /* Process MAC cell config */
- unpackDuMacCellCfg(MacProcCellCfgReq, pst, mBuf);
- break;
+ {
+ /* Process MAC cell config */
+ unpackDuMacCellCfg(MacProcCellCfgReq, pst, mBuf);
+ break;
+ }
case EVENT_MAC_CELL_START:
- /* Process MAC cell start request */
- unpackMacCellStart(MacProcCellStart, pst, mBuf);
- break;
+ {
+ /* Process MAC cell start request */
+ unpackMacCellStart(MacProcCellStart, pst, mBuf);
+ break;
+ }
case EVENT_MAC_CELL_STOP:
- /* Process MAC cell stop request */
- unpackMacCellStop(MacProcCellStop, pst, mBuf);
- break;
+ {
+ /* Process MAC cell stop request */
+ unpackMacCellStop(MacProcCellStop, pst, mBuf);
+ break;
+ }
case EVENT_MAC_DL_CCCH_IND:
- /* Process DL CCCH Ind */
- unpackMacDlCcchInd(MacProcDlCcchInd, pst, mBuf);
- break;
+ {
+ /* Process DL CCCH Ind */
+ unpackMacDlCcchInd(MacProcDlCcchInd, pst, mBuf);
+ break;
+ }
case EVENT_MAC_UE_CREATE_REQ:
- /* Process Ue Create Request */
- unpackMacUeCreateReq(MacProcUeCreateReq, pst, mBuf);
- break;
+ {
+ /* Process Ue Create Request */
+ unpackMacUeCreateReq(MacProcUeCreateReq, pst, mBuf);
+ break;
+ }
case EVENT_MAC_UE_RECONFIG_REQ:
- /* Process Ue Reconfig Request */
- unpackMacUeReconfigReq(MacProcUeReconfigReq, pst, mBuf);
- break;
- case EVENT_MAC_UE_DELETE_REQ:
- {
- unpackMacUeDeleteReq(MacProcUeDeleteReq, pst, mBuf);
- break;
- }
- case EVENT_MAC_CELL_DELETE_REQ:
- {
- unpackMacCellDeleteReq(MacProcCellDeleteReq, pst, mBuf);
- break;
- }
- case EVENT_MAC_SLICE_CFG_REQ:
- {
- unpackMacSliceCfgReq(MacProcSliceCfgReq, pst, mBuf);
- break;
- }
- case EVENT_MAC_SLICE_RECFG_REQ:
- {
- unpackMacSliceCfgReq(MacProcSliceReCfgReq, pst, mBuf);
- break;
- }
- default:
+ {
+ /* Process Ue Reconfig Request */
+ unpackMacUeReconfigReq(MacProcUeReconfigReq, pst, mBuf);
+ break;
+ }
+ case EVENT_MAC_UE_DELETE_REQ:
+ {
+ /* Process UE Delete Request */
+ unpackMacUeDeleteReq(MacProcUeDeleteReq, pst, mBuf);
+ break;
+ }
+ case EVENT_MAC_CELL_DELETE_REQ:
+ {
+ /* Process Cell Delete Request */
+ unpackMacCellDeleteReq(MacProcCellDeleteReq, pst, mBuf);
+ break;
+ }
+ case EVENT_MAC_SLICE_CFG_REQ:
+ {
+ /* Process Slice Configuration Request */
+ unpackMacSliceCfgReq(MacProcSliceCfgReq, pst, mBuf);
+ break;
+ }
+ case EVENT_MAC_SLICE_RECFG_REQ:
+ {
+ /* Process Slice Reconfiguration Request */
+ unpackMacSliceCfgReq(MacProcSliceReCfgReq, pst, mBuf);
+ break;
+ }
+ case EVENT_MAC_RACH_RESOURCE_REQ:
+ {
+ /* Process Rach Resource Request */
+ unpackMacRachRsrcReq(MacProcRachRsrcReq, pst, mBuf);
+ break;
+ }
+
+ default:
RG_FREE_MSG(mBuf);
break;
}
/* Function pointer for sending rach ind from MAC to SCH */
MacSchRachIndFunc macSchRachIndOpts[]=
{
- packMacSchRachInd,
- MacSchRachInd,
- packMacSchRachInd
+ packMacSchRachInd, /* packing for loosely coupled */
+ MacSchRachInd, /* packing for tightly coupled */
+ packMacSchRachInd /* packing for light weight loosely coupled */
+};
+
+/* Function pointer for sending RACH resource request from MAC to SCH */
+MacSchRachRsrcReqFunc macSchRachRsrcReqOpts[] =
+{
+ packMacSchRachRsrcReq, /* packing for loosely coupled */
+ MacSchRachRsrcReq, /* packing for tightly coupled */
+ packMacSchRachRsrcReq /* packing for light weight loosely coupled */
+};
+
+/* Function pointer for sending RACH resource response from MAC to DU APP */
+MacDuRachRsrcRspFunc macDuRachRsrcRspOpts[] =
+{
+ packDuMacRachRsrcRsp, /* packing for loosely coupled */
+ DuProcMacRachRsrcRsp, /* packing for tightly coupled */
+ packDuMacRachRsrcRsp /* packing for light weight loosly coupled */
};
/*******************************************************************
rachIndInfo->slotIdx = rachInd->rachPdu[pduIdx].slotIdx;
rachIndInfo->symbolIdx = rachInd->rachPdu[pduIdx].symbolIdx;
rachIndInfo->freqIdx = rachInd->rachPdu[pduIdx].freqIdx;
- rachIndInfo->preambleIdx = \
- rachInd->rachPdu[pduIdx].preamInfo[preambleIdx].preamIdx;
- rachIndInfo->timingAdv = \
- rachInd->rachPdu[pduIdx].preamInfo[preambleIdx].timingAdv;
+ rachIndInfo->preambleIdx = rachInd->rachPdu[pduIdx].preamInfo[preambleIdx].preamIdx;
+ rachIndInfo->timingAdv = rachInd->rachPdu[pduIdx].preamInfo[preambleIdx].timingAdv;
/* Store the value in macRaCb */
createMacRaCb(rachIndInfo);
return(sendRachIndMacToSch(rachIndInfo));
}
+/*******************************************************************
+ *
+ * @brief Processes RACH Resource request from DU APP
+ *
+ * @details
+ *
+ * Function : MacProcRachRsrcReq
+ *
+ * Functionality: Processes RACH resource request from DU APP.
+ * Fills and sends RACH resource request towards SCH.
+ *
+ * @params[in] Post structure
+ * RACH resource request
+ * @return ROK - success
+ * RFAILED - failure
+ *
+ * ****************************************************************/
+uint8_t MacProcRachRsrcReq(Pst *pst, MacRachRsrcReq *rachRsrcReq)
+{
+ uint8_t ret = RFAILED;
+ uint16_t cellIdx = 0;
+ Pst schPst;
+ MacCellCb *cellCb = NULLP;
+ MacUeCb *ueCb = NULLP;
+ SchRachRsrcReq *schRachRsrcReq = NULLP;
+
+ DU_LOG("\nINFO --> MAC : Recieved RACH Resource Request for Cell ID [%d] UE ID [%d]",\
+ rachRsrcReq->cellId, rachRsrcReq->ueId);
+
+ /* Fetch Cell Cb */
+ GET_CELL_IDX(rachRsrcReq->cellId, cellIdx);
+ if(macCb.macCell[cellIdx] && (macCb.macCell[cellIdx]->cellId == rachRsrcReq->cellId))
+ {
+ cellCb = macCb.macCell[cellIdx];
+
+ /* Fetch UE Cb */
+ if(cellCb->ueCb[rachRsrcReq->ueId-1].ueId == rachRsrcReq->ueId)
+ {
+ ueCb = &cellCb->ueCb[rachRsrcReq->ueId-1];
+ /* Allocate memory to RACH resource request to be sent to SCH */
+ MAC_ALLOC(schRachRsrcReq, sizeof(SchRachRsrcReq));
+ if(schRachRsrcReq)
+ {
+ /* Fill SCH RACH resource request from information received from DU APP to MAC */
+ schRachRsrcReq->cellId = rachRsrcReq->cellId;
+ schRachRsrcReq->crnti = ueCb->crnti;
+ schRachRsrcReq->numSsb = rachRsrcReq->numSsb;
+ memcpy(schRachRsrcReq->ssbIdx, rachRsrcReq->ssbIdx, sizeof(schRachRsrcReq->ssbIdx));
+
+ /* Send RACH resource request from MAC to SCH */
+ FILL_PST_MAC_TO_SCH(schPst, EVENT_RACH_RESOURCE_REQUEST_TO_SCH);
+ ret = (*macSchRachRsrcReqOpts[schPst.selector])(&schPst, schRachRsrcReq);
+ }
+ else
+ DU_LOG("\nERROR --> MAC : Memory allocation failed for RACH resource request to SCH");
+ }
+ else
+ DU_LOG("\nERROR --> MAC : UE ID [%d] not found", rachRsrcReq->ueId);
+ }
+ else
+ DU_LOG("\nERROR --> MAC : Cell ID [%d] not found", rachRsrcReq->cellId);
+
+ /* Free sharable buffer used to send RACH reource request from DU APP to MAC */
+ MAC_FREE_SHRABL_BUF(pst->region, pst->pool, rachRsrcReq, sizeof(MacRachRsrcReq));
+ return ret;
+}
+
+/*******************************************************************
+ *
+ * @brief Processes RACH Resource response from SCH
+ *
+ * @details
+ *
+ * Function : MacProcSchRachRsrcRsp
+ *
+ * Functionality: Processes RACH resource response from SCH
+ * Fills and sends RACH resource response towards DU APP
+ *
+ * @params[in] Post structure
+ * RACH resource response
+ * @return ROK - success
+ * RFAILED - failure
+ *
+ * ****************************************************************/
+uint8_t MacProcSchRachRsrcRsp(Pst *pst, SchRachRsrcRsp *schRachRsrcRsp)
+{
+ uint16_t cellIdx = 0;
+ Pst rspPst;
+ MacRachRsrcRsp *rachRsrcRsp = NULLP;
+ MacCellCb *cellCb = NULLP;
+ MacUeCb *ueCb = NULLP;
+
+ DU_LOG("\nINFO --> MAC : Received RACH resource response from SCH : Cell ID [%d] CRNTI [%d]", \
+ schRachRsrcRsp->cellId, schRachRsrcRsp->crnti);
+
+ /* Fill RACH resource response to send to DU APP */
+ MAC_ALLOC_SHRABL_BUF(rachRsrcRsp, sizeof(MacRachRsrcRsp));
+ if(!rachRsrcRsp)
+ {
+ DU_LOG("\nERROR --> MAC : Memory allocation failed for RACH resource response");
+ MAC_FREE(schRachRsrcRsp, sizeof(SchRachRsrcRsp));
+ return RFAILED;
+ }
+ rachRsrcRsp->cellId = schRachRsrcRsp->cellId;
+ GET_UE_ID(schRachRsrcRsp->crnti, rachRsrcRsp->ueId);
+ rachRsrcRsp->result = MAC_DU_APP_RSP_OK;
+
+ /* Fill Pst structure to send RACH resource response from MAC to DU APP */
+ FILL_PST_MAC_TO_DUAPP(rspPst, EVENT_MAC_RACH_RESOURCE_RSP);
+
+ /* If negative response is received from SCH, send it further to DU APP */
+ if(schRachRsrcRsp->result == RSP_NOK)
+ {
+ DU_LOG("\nINFO --> MAC : RACH Resource response from SCH : Result [FAILURE]");
+ rachRsrcRsp->result = MAC_DU_APP_RSP_NOK;
+ }
+ else
+ {
+ DU_LOG("\nINFO --> MAC : RACH Resource response from SCH : Result [SUCCESS]");
+
+ /* Fetch Cell Cb */
+ GET_CELL_IDX(schRachRsrcRsp->cellId, cellIdx);
+ if(macCb.macCell[cellIdx] && (macCb.macCell[cellIdx]->cellId == schRachRsrcRsp->cellId))
+ {
+ cellCb = macCb.macCell[cellIdx];
+
+ /* Fetch UE Cb */
+ if(cellCb->ueCb[rachRsrcRsp->ueId-1].crnti == schRachRsrcRsp->crnti)
+ ueCb = &cellCb->ueCb[rachRsrcRsp->ueId-1];
+ else
+ {
+ DU_LOG("\nERROR --> MAC : CRNTI [%d] not found", schRachRsrcRsp->crnti);
+ rachRsrcRsp->result = MAC_DU_APP_RSP_NOK;
+ }
+ }
+ else
+ {
+ DU_LOG("\nERROR --> MAC : Cell ID [%d] not found", schRachRsrcRsp->cellId);
+ rachRsrcRsp->result = MAC_DU_APP_RSP_NOK;
+ }
+ }
+
+ /* TODO : Check if ra-preamble index is to be stored in UE CB */
+
+ /* Fill SSB RACH resource info if SCH has sent a positive response and
+ * processing of SCH RACH resource response at MAC has been successful so far */
+ if(rachRsrcRsp->result == MAC_DU_APP_RSP_OK)
+ {
+ rachRsrcRsp->newCrnti = ueCb->crnti;
+ rachRsrcRsp->cfraResource.numSsb = schRachRsrcRsp->cfraResource.numSsb;
+ memcpy(rachRsrcRsp->cfraResource.ssbResource, schRachRsrcRsp->cfraResource.ssbResource, \
+ rachRsrcRsp->cfraResource.numSsb * sizeof(MacCfraSsbResource));
+ }
+
+ /* Free SCH RACH resource response */
+ MAC_FREE(schRachRsrcRsp, sizeof(SchRachRsrcRsp));
+
+ /* Send RACH resource response to DU APP */
+ FILL_PST_MAC_TO_DUAPP(rspPst, EVENT_MAC_RACH_RESOURCE_RSP);
+ return (*macDuRachRsrcRspOpts[rspPst.selector])(&rspPst, rachRsrcRsp);
+}
+
/* spec-38.211 Table 6.3.3.1-7 */
uint8_t UnrestrictedSetNcsTable[MAX_ZERO_CORR_CFG_IDX] =
{0, 2, 4, 6, 8, 10, 12, 13, 15, 17, 19, 23, 27, 34, 46, 69};
if(ueCfg)
{
+ /* If CRNTI = 0, MAC must allot a CRNTI to this UE. This scenario hits in
+ * case of UE in handover */
+ if(ueCfg->crnti == 0)
+ {
+ GET_CRNTI(ueCfg->crnti, ueCfg->ueId);
+ }
+
/*Storing received ueCfg in ueCfgTmpData */
ret = copyToTmpData(ueCfg);
if(ret == ROK)
SchUeCfgCb ueCfg;
SchUeState state;
SchCellCb *cellCb;
+ SchCfraResource cfraResource;
bool srRcvd;
bool bsrRcvd;
BsrInfo bsrInfo[MAX_NUM_LOGICAL_CHANNEL_GROUPS];
SchCellCfg cellCfg; /*!< Cell ocnfiguration */
bool firstSsbTransmitted;
bool firstSib1Transmitted;
- uint8_t ssbStartSymbArr[SCH_MAX_SSB_BEAM]; /*!<start symbol per SSB beam */
+ uint8_t ssbStartSymbArr[SCH_MAX_SSB_BEAM]; /*!< start symbol per SSB beam */
+ uint64_t dedPreambleBitMap; /*!< Bit map to find used/free preambles index */
SchRaReq *raReq[MAX_NUM_UE]; /*!< Pending RA request */
SchRaCb raCb[MAX_NUM_UE]; /*!< RA Cb */
- uint16_t numActvUe; /*!<Number of active UEs */
- uint32_t actvUeBitMap; /*!<Bit map to find active UEs */
- uint32_t boIndBitMap; /*!<Bit map to indicate UEs that have recevied BO */
- SchUeCb ueCb[MAX_NUM_UE]; /*!<Pointer to UE contexts of this cell */
- CmLListCp ueToBeScheduled; /*!<Linked list to store UEs pending to be scheduled, */
- SchPageCb pageCb; /*!<Page Record at Schedular*/
+ uint16_t numActvUe; /*!< Number of active UEs */
+ uint32_t actvUeBitMap; /*!< Bit map to find active UEs */
+ uint32_t boIndBitMap; /*!< Bit map to indicate UEs that have recevied BO */
+ SchUeCb ueCb[MAX_NUM_UE]; /*!< Pointer to UE contexts of this cell */
+ CmLListCp ueToBeScheduled; /*!< Linked list to store UEs pending to be scheduled, */
+ SchPageCb pageCb; /*!< Page Record at Schedular*/
#ifdef NR_TDD
uint8_t numSlotsInPeriodicity; /*!< number of slots in configured periodicity and SCS */
uint32_t slotFrmtBitMap; /*!< 2 bits must be read together to determine D/U/S slots. 00-D, 01-U, 10-S */
#include "sch.h"
#include "sch_utils.h"
+SchRachRsrcRspFunc SchRachRsrcRspOpts[] =
+{
+ packSchRachRsrcRsp, /* LC */
+ MacProcSchRachRsrcRsp, /* TC */
+ packSchRachRsrcRsp /* LWLC */
+};
+
/**
* @brief Checks if PRACH can be scheduled in current slot
*
DU_LOG("\nINFO --> SCH : RACH occassion set for slot %d", prachOccasionTimingInfo.slot);
}
+/**
+ * @brief Process RACH resource request for CFRA
+ *
+ * @details
+ *
+ * Function : MacSchRachRsrcReq
+ *
+ * This function processes RACH resorce request
+ * from MAC for CFRA. It assigns a dedicated preamble
+ * to the UE and sends the same in RACH resource
+ * response
+ *
+ * @param[in] Post structure
+ * @param[in] RACH resource request
+ * @return ROK
+ * RFAILED
+ **/
+uint8_t MacSchRachRsrcReq(Pst *pst, SchRachRsrcReq *schRachRsrcReq)
+{
+ uint8_t ssbIdx = 0, cfraSsbIdx = 0;
+ uint8_t firstCFPreambleIndex = 0, lastCFPreambleIndex = 0;
+ uint16_t cellIdx = 0;
+ uint64_t mask = 0;
+ Pst rspPst;
+ Inst inst = pst->dstInst - SCH_INST_START;
+ SchCellCb *cellCb = NULLP;
+ SchUeCb *ueCb = NULLP;
+ SchRachRsrcRsp *rachRsrcRsp = NULLP;
+
+ DU_LOG("\nINFO --> SCH : Received RACH resource request for Cell ID [%d] CRNTI [%d]", \
+ schRachRsrcReq->cellId, schRachRsrcReq->crnti);
+
+ /* Fill RACH resource response to MAC */
+ SCH_ALLOC(rachRsrcRsp, sizeof(SchRachRsrcRsp));
+ if(!rachRsrcRsp)
+ {
+ DU_LOG("\nERROR --> SCH : Memory allocation failed for RACH resource response");
+ return RFAILED;
+ }
+ rachRsrcRsp->cellId = schRachRsrcReq->cellId;
+ rachRsrcRsp->crnti = schRachRsrcReq->crnti;
+ rachRsrcRsp->result = RSP_OK;
+
+ /* Fill SCH to MAC Pst structure */
+ memset(&rspPst, 0, sizeof(Pst));
+ FILL_PST_SCH_TO_MAC(rspPst, inst);
+ rspPst.event = EVENT_RACH_RESOURCE_RESPONSE_TO_MAC;
+
+ /* Fetch Cell CB */
+ for(cellIdx = 0; cellIdx < MAX_NUM_CELL; cellIdx++)
+ {
+ if((schCb[inst].cells[cellIdx]) && (schCb[inst].cells[cellIdx]->cellId == schRachRsrcReq->cellId))
+ {
+ cellCb = schCb[inst].cells[cellIdx];
+ break;
+ }
+ }
+
+ if(cellCb)
+ {
+ /* Fetch UE CB */
+ ueCb = schGetUeCb(cellCb, schRachRsrcReq->crnti);
+ if(ueCb->crnti != schRachRsrcReq->crnti)
+ {
+ DU_LOG("\nERROR --> SCH : CRNTI [%d] not found" ,schRachRsrcReq->crnti);
+ rachRsrcRsp->result = RSP_NOK;
+ }
+ }
+ else
+ {
+ DU_LOG("\nERROR --> SCH : Cell ID [%d] not found" ,schRachRsrcReq->cellId);
+ rachRsrcRsp->result = RSP_NOK;
+ }
+
+ /* Allocate SSB resource if no failure has occurred until this step */
+ if(rachRsrcRsp->result == RSP_OK)
+ {
+ /* Find first free preamble index from the pool CF preambles
+ * Preamble index from 0 to (numCbPreamblePerSsb-1) is used for CBRA
+ * Preamble index from numCbPreamblePerSsb to totalNumOfRAPreamble
+ * is used for CFRA */
+ firstCFPreambleIndex = cellCb->cellCfg.schRachCfg.numCbPreamblePerSsb;
+ lastCFPreambleIndex = cellCb->cellCfg.schRachCfg.totalNumRaPreamble;
+
+ /* Allocate resource for each SSB index requested */
+ for(ssbIdx = 0; ssbIdx < schRachRsrcReq->numSsb; ssbIdx++)
+ {
+ /* Find the first CF Preamble index not dedicated to any UE currently */
+ while(firstCFPreambleIndex <= lastCFPreambleIndex)
+ {
+ mask = 1 << firstCFPreambleIndex;
+ if(cellCb->dedPreambleBitMap & mask)
+ {
+ firstCFPreambleIndex++;
+ continue;
+ }
+ else
+ break;
+ }
+
+ /* If firstCFPreambleIndex > lastCFPreambleIndex, it means all
+ * dedicated preambles are in use currently. In such a case, CBRA
+ * should be initiated.
+ * If a dedicated preamble is found, use this for CFRA and mark it as
+ * IN-USE in the bitmap.
+ * Considering only CFRA scenario for now. */
+ if(firstCFPreambleIndex <= lastCFPreambleIndex)
+ {
+ ueCb->cfraResource.ssbResource[cfraSsbIdx].ssbIdx = schRachRsrcReq->ssbIdx[ssbIdx];
+ ueCb->cfraResource.ssbResource[cfraSsbIdx].raPreambleIdx = firstCFPreambleIndex;
+ SET_ONE_BIT(firstCFPreambleIndex, cellCb->dedPreambleBitMap);
+ cfraSsbIdx++;
+ firstCFPreambleIndex++;
+ }
+ else
+ {
+ DU_LOG("\nINFO : SCH : No dedicated preameble availble to assign to ssbIdx[%d]", schRachRsrcReq->ssbIdx[ssbIdx]);
+ /* Breaking out of for loop since no dedicated preambles are available
+ * for remaining ssbIdx too */
+ break;
+ }
+ } /* End of for */
+
+ ueCb->cfraResource.numSsb = cfraSsbIdx;
+
+ if(ueCb->cfraResource.numSsb == 0)
+ {
+ /* If numSsb is 0, it means no CFRA resource was alloacted for any of the
+ * SSB Idx, hence send a negative response */
+ rachRsrcRsp->result = RSP_NOK;
+ }
+ else
+ {
+ /* Send ssb resource information to MAC in RACH resource response */
+ rachRsrcRsp->cfraResource.numSsb = ueCb->cfraResource.numSsb;
+ memcpy(rachRsrcRsp->cfraResource.ssbResource, ueCb->cfraResource.ssbResource, \
+ ueCb->cfraResource.numSsb * sizeof(SchCfraSsbResource));
+ }
+ } /* End of if */
+
+ /* Free RACH resource request memory allocated by MAC */
+ SCH_FREE(schRachRsrcReq, sizeof(SchRachRsrcReq));
+
+ /* Send RACH resource response to MAC */
+ return (SchRachRsrcRspOpts[rspPst.selector](&rspPst, rachRsrcRsp));
+}
+
/**
* @brief calculate ra-rnti function.
*
ueCb->state = SCH_UE_STATE_ACTIVE;
}
else
+ {
ueCb->state = SCH_UE_HANDIN_IN_PROGRESS;
+ }
ueCb->cellCb = cellCb;
ueCb->srRcvd = false;
#define MAX_NUM_LC MAX_DRB_LCID + 1 /*Spec 38.331: Sec 6.4: maxLC-ID Keyword*/
#define MAX_NUM_SRB 3 /* Max. no of Srbs */
#define MAX_NUM_DRB 29 /* spec 38.331, maxDRB */
+#define MAX_NUM_SSB 64 /* spec 28.331, maxNrofSSBs */
/* 5G ORAN phy delay */
#define PHY_DELTA_DL 1
return ODU_POST_TASK(pst,mBuf);
}
+
/*******************************************************************
*
* @brief Unpacks UE Reconfig Request received from DU APP
return RFAILED;
}
+
+/*******************************************************************
+ *
+ * @brief Packs and Sends RACH Resource request from DUAPP to MAC
+ *
+ * @details
+ *
+ * Function : packDuMacRachRsrcReq
+ *
+ * Functionality:
+ * Packs and Sends RACH Resource request from DU APP to MAC
+ *
+ *
+ * @params[in] Post structure pointer
+ * MacRachRsrcReq pointer
+ * @return ROK - success
+ * RFAILED - failure
+ *
+ * ****************************************************************/
+uint8_t packDuMacRachRsrcReq(Pst *pst, MacRachRsrcReq *rachRsrcReq)
+{
+ Buffer *mBuf = NULLP;
+
+ if(pst->selector == ODU_SELECTOR_LWLC)
+ {
+ if (ODU_GET_MSG_BUF(pst->region, pst->pool, &mBuf) != ROK)
+ {
+ DU_LOG("\nERROR --> MAC : Memory allocation failed at packDuMacRachRsrcReq,");
+ return RFAILED;
+ }
+ /* pack the address of the structure */
+ CMCHKPK(oduPackPointer, (PTR)rachRsrcReq, mBuf);
+ }
+ else
+ {
+ DU_LOG("\nERROR --> MAC: Only LWLC supported for packDuMacRachRsrcReq");
+ return RFAILED;
+ }
+
+ return ODU_POST_TASK(pst,mBuf);
+}
+
+/*******************************************************************
+ *
+ * @brief Unpacks RACH resource Request received from DU APP
+ *
+ * @details
+ *
+ * Function : unpackMacRachRsrcReq
+ *
+ * Functionality:
+ * Unpacks RACH resource Request received from DU APP
+ *
+ * @params[in] Pointer to Handler
+ * Post structure pointer
+ * Message Buffer
+ * @return ROK - success
+ * RFAILED - failure
+ *
+ * ****************************************************************/
+uint8_t unpackMacRachRsrcReq(DuMacRachRsrcReq func, Pst *pst, Buffer *mBuf)
+{
+ if(pst->selector == ODU_SELECTOR_LWLC)
+ {
+ MacRachRsrcReq *rachRsrcReq;
+
+ /* unpack the address of the structure */
+ CMCHKUNPK(oduUnpackPointer, (PTR *)&rachRsrcReq, mBuf);
+ ODU_PUT_MSG_BUF(mBuf);
+ return (*func)(pst, rachRsrcReq);
+ }
+ else
+ {
+ /* Nothing to do for other selectors */
+ DU_LOG("\nERROR --> DU APP : Only LWLC supported for RACH resource Request ");
+ ODU_PUT_MSG_BUF(mBuf);
+ }
+
+ return RFAILED;
+}
+
+/*******************************************************************
+ *
+ * @brief Packs and Sends RACH Resource response from MAC to DU APP
+ *
+ * @details
+ *
+ * Function : packDuMacRachRsrcRsp
+ *
+ * Functionality:
+ * Packs and Sends RACH Resource response from MAC to DU APP
+ *
+ *
+ * @params[in] Post structure pointer
+ * MacRachRsrcRsp pointer
+ * @return ROK - success
+ * RFAILED - failure
+ *
+ * ****************************************************************/
+uint8_t packDuMacRachRsrcRsp(Pst *pst, MacRachRsrcRsp *rachRsrcRsp)
+{
+ Buffer *mBuf = NULLP;
+
+ if(pst->selector == ODU_SELECTOR_LWLC)
+ {
+ if (ODU_GET_MSG_BUF(pst->region, pst->pool, &mBuf) != ROK)
+ {
+ DU_LOG("\nERROR --> MAC : Memory allocation failed at packDuMacRachRsrcRsp");
+ return RFAILED;
+ }
+ /* pack the address of the structure */
+ CMCHKPK(oduPackPointer, (PTR)rachRsrcRsp, mBuf);
+ }
+ else
+ {
+ DU_LOG("\nERROR --> MAC: Only LWLC supported for packDuMacRachRsrcRsp");
+ return RFAILED;
+ }
+
+ return ODU_POST_TASK(pst,mBuf);
+}
+
+/*******************************************************************
+ *
+ * @brief Unpacks RACH resource Response received from MAC
+ *
+ * @details
+ *
+ * Function : unpackDuMacRachRsrcRsp
+ *
+ * Functionality:
+ * Unpacks RACH resource Response received from MAC
+ *
+ * @params[in] Pointer to Handler
+ * Post structure pointer
+ * Message Buffer
+ * @return ROK - success
+ * RFAILED - failure
+ *
+ * ****************************************************************/
+uint8_t unpackDuMacRachRsrcRsp(MacDuRachRsrcRspFunc func, Pst *pst, Buffer *mBuf)
+{
+ if(pst->selector == ODU_SELECTOR_LWLC)
+ {
+ MacRachRsrcRsp *rachRsrcRsp;
+
+ /* unpack the address of the structure */
+ CMCHKUNPK(oduUnpackPointer, (PTR *)&rachRsrcRsp, mBuf);
+ ODU_PUT_MSG_BUF(mBuf);
+ return (*func)(pst, rachRsrcRsp);
+ }
+ else
+ {
+ /* Nothing to do for other selectors */
+ DU_LOG("\nERROR --> DU APP : Only LWLC supported for RACH resource Response ");
+ ODU_PUT_MSG_BUF(mBuf);
+ }
+
+ return RFAILED;
+}
/*******************************************************************
*
* @brief Packs and Sends UE Delete Request from DUAPP to MAC
#define EVENT_MAC_SLICE_RECFG_REQ 218
#define EVENT_MAC_SLICE_RECFG_RSP 219
#define EVENT_MAC_SLOT_IND 220
+#define EVENT_MAC_RACH_RESOURCE_REQ 221
+#define EVENT_MAC_RACH_RESOURCE_RSP 222
#define BSR_PERIODIC_TIMER_SF_10 10
#define BSR_RETX_TIMER_SF_320 320
uint8_t msg1Fdm; /* PRACH FDM (1,2,4,8) */
uint8_t rootSeqLen; /* Root sequence length */
PrachFdmInfo fdm[8]; /* FDM info */
+ uint8_t totalNumRaPreamble; /* Total number of RA preambles */
uint8_t ssbPerRach; /* SSB per RACH occassion */
+ uint8_t numCbPreamblePerSsb; /* Number of CB preamble per SSB */
bool prachMultCarrBand; /* Multiple carriers in Band */
uint8_t prachRestrictedSet; /* Support for PRACH restricted set */
uint8_t raContResTmr; /* RA Contention Resoultion Timer */
SCellFailInfo *failedSCellList;
}MacUeCfgRsp;
+typedef struct rachRsrcReq
+{
+ uint16_t cellId;
+ uint16_t ueId;
+ uint8_t numSsb;
+ uint8_t ssbIdx[MAX_NUM_SSB];
+}MacRachRsrcReq;
+
+typedef struct macCfraSsbResource
+{
+ uint8_t ssbIdx;
+ uint8_t raPreambleIdx;
+}MacCfraSsbResource;
+
+typedef struct macCfraResource
+{
+ uint8_t numSsb;
+ MacCfraSsbResource ssbResource[MAX_NUM_SSB];
+}MacCfraResource;
+
+typedef struct macRachRsrcRsp
+{
+ uint16_t cellId;
+ uint16_t ueId;
+ MacRsp result;
+ uint16_t newCrnti; /* This parameter maps to 3GPP TS 38.331 newUE-Identity */
+ MacCfraResource cfraResource;
+}MacRachRsrcRsp;
+
typedef struct ueDelete
{
uint16_t cellId;
Pst *pst,
MacUeCfg *ueCfg ));
+/* RACH Resource Request from DU APP to MAC*/
+typedef uint8_t (*DuMacRachRsrcReq) ARGS((
+ Pst *pst,
+ MacRachRsrcReq *rachRsrcReq));
+
+/* RACH Resource Response from MAC to DU APP*/
+typedef uint8_t (*MacDuRachRsrcRspFunc) ARGS((
+ Pst *pst,
+ MacRachRsrcRsp *rachRsrcRsp));
+
/* UE Delete Request from DU APP to MAC*/
typedef uint8_t (*DuMacUeDeleteReq) ARGS((
Pst *pst,
uint8_t packDuMacUeReconfigReq(Pst *pst, MacUeCfg *ueCfg);
uint8_t unpackMacUeReconfigReq(DuMacUeReconfigReq func, Pst *pst, Buffer *mBuf);
uint8_t MacProcUeReconfigReq(Pst *pst, MacUeCfg *ueCfg);
+uint8_t packDuMacRachRsrcReq(Pst *pst, MacRachRsrcReq *rachRsrcReq);
+uint8_t unpackMacRachRsrcReq(DuMacRachRsrcReq func, Pst *pst, Buffer *mBuf);
+uint8_t MacProcRachRsrcReq(Pst *pst, MacRachRsrcReq *rachRsrcReq);
+uint8_t packDuMacRachRsrcRsp(Pst *pst, MacRachRsrcRsp *rachRsrcRsp);
+uint8_t unpackDuMacRachRsrcRsp(MacDuRachRsrcRspFunc func, Pst *pst, Buffer *mBuf);
+uint8_t DuProcMacRachRsrcRsp(Pst *pst, MacRachRsrcRsp *rachRsrcRsp);
uint8_t packDuMacUeDeleteReq(Pst *pst, MacUeDelete *ueDelete);
uint8_t MacProcUeDeleteReq(Pst *pst, MacUeDelete *ueDelete);
uint8_t unpackMacUeDeleteReq(DuMacUeDeleteReq func, Pst *pst, Buffer *mBuf);
return ROK;
}
+/*******************************************************************
+ *
+ * @brief Pack and Send RACH resource Request from MAC to SCH
+ *
+ * @details
+ *
+ * Function : packMacSchRachRsrcReq
+ *
+ * Functionality:
+ * Pack and Send RACH resouece Request from MAC to SCH
+ *
+ * @params[in] Post structure
+ * RACH resource request
+ * @return ROK - success
+ * RFAILED - failure
+ *
+ * ****************************************************************/
+uint8_t packMacSchRachRsrcReq(Pst *pst, SchRachRsrcReq *schRachRsrcReq)
+{
+ if((pst->selector == ODU_SELECTOR_LC) || (pst->selector == ODU_SELECTOR_LC))
+ {
+ /* TODO */
+ }
+ else
+ {
+ return RFAILED;
+ }
+ return ROK;
+}
+
+/*******************************************************************
+ *
+ * @brief Pack and Send RACH resource Response from SCH to MAC
+ *
+ * @details
+ *
+ * Function : packSchRachRsrcRsp
+ *
+ * Functionality:
+ * Pack and Send RACH resource Response from SCH to MAC
+ *
+ * @params[in] Post structure
+ * RACH resource response
+ * @return ROK - success
+ * RFAILED - failure
+ *
+ * ****************************************************************/
+uint8_t packSchRachRsrcRsp(Pst *pst, SchRachRsrcRsp *schRachRsrcRsp)
+{
+ if((pst->selector == ODU_SELECTOR_LC) || (pst->selector == ODU_SELECTOR_LC))
+ {
+ /* TODO */
+ }
+ else
+ {
+ return RFAILED;
+ }
+ return ROK;
+}
+
/*******************************************************************
*
* @brief Pack and Send UE Delete Request from MAC to SCH
#define EVENT_SLICE_CFG_RSP_TO_MAC 22
#define EVENT_SLICE_RECFG_REQ_TO_SCH 23
#define EVENT_SLICE_RECFG_RSP_TO_MAC 24
+#define EVENT_RACH_RESOURCE_REQUEST_TO_SCH 25
+#define EVENT_RACH_RESOURCE_RESPONSE_TO_MAC 26
/*macros*/
#define MAX_SSB_IDX 1 /* forcing it as 1 for now. Right value is 64 */
uint16_t rootSeqIdx; /* Root sequence index */
uint8_t numRootSeq; /* Number of root sequences required for FD */
uint16_t k1; /* Frequency Offset for each FD */
+ uint8_t totalNumRaPreamble; /* Total number of RA preambles */
uint8_t ssbPerRach; /* SSB per RACH occassion */
+ uint8_t numCbPreamblePerSsb; /* Number of CB preamble per SSB */
uint8_t prachMultCarrBand; /* Presence of Multiple carriers in Band */
uint8_t raContResTmr; /* RA Contention Resoultion Timer */
uint8_t rsrpThreshSsb; /* RSRP Threshold SSB */
SchFailureCause cause;
}SchUeCfgRsp;
+typedef struct schRachRsrcReq
+{
+ uint16_t cellId;
+ uint16_t crnti;
+ uint8_t numSsb;
+ uint8_t ssbIdx[MAX_NUM_SSB];
+}SchRachRsrcReq;
+
+typedef struct schCfraSsbResource
+{
+ uint8_t ssbIdx;
+ uint8_t raPreambleIdx;
+}SchCfraSsbResource;
+
+typedef struct schCfraRsrc
+{
+ uint8_t numSsb;
+ SchCfraSsbResource ssbResource[MAX_NUM_SSB];
+}SchCfraResource;
+
+typedef struct schRachRsrcRsp
+{
+ uint16_t cellId;
+ uint16_t crnti;
+ SchMacRsp result;
+ SchCfraResource cfraResource;
+}SchRachRsrcRsp;
+
typedef struct schUeDelete
{
uint16_t cellId;
Pst *pst, /* Post structure */
SchUeCfgRsp *cfgRsp)); /* Scheduler UE Cfg response */
+typedef uint8_t (*MacSchRachRsrcReqFunc) ARGS((
+ Pst *pst, /* Post structure */
+ SchRachRsrcReq *schRachRsrcReq)); /* RACH resource request to SCH */
+
+typedef uint8_t (*SchRachRsrcRspFunc) ARGS((
+ Pst *pst, /* Post structure */
+ SchRachRsrcRsp *schRachRsrcRsp)); /* RACH resource request to MAC */
+
typedef uint8_t (*MacSchUeDeleteReqFunc) ARGS((
Pst *pst, /* Post structure */
SchUeDelete *schUeDel)); /*Scheduler UE Del*/
Pst *pst, /* Post Structure */
SchSliceCfgRsp *schSliceReCfgRsp /* Cell ReCfg Cfm */
));
+
/* function declarations */
uint8_t packMacSchSlotInd(Pst *pst, SlotTimingInfo *slotInd);
uint8_t packSchMacDlAlloc(Pst *pst, DlSchedInfo *dlSchedInfo);
uint8_t MacSchModUeConfigReq(Pst *pst, SchUeCfg *ueCfgToSch);
uint8_t packSchUeReconfigRsp(Pst *pst, SchUeCfgRsp *cfgRsp);
uint8_t MacProcSchUeReconfigRsp(Pst *pst, SchUeCfgRsp *cfgRsp);
+uint8_t packMacSchRachRsrcReq(Pst *pst, SchRachRsrcReq *schRachRsrcReq);
+uint8_t MacSchRachRsrcReq(Pst *pst, SchRachRsrcReq *schRachRsrcReq);
+uint8_t packSchRachRsrcRsp(Pst *pst, SchRachRsrcRsp *schRachRsrcRsp);
+uint8_t MacProcSchRachRsrcRsp(Pst *pst, SchRachRsrcRsp *schRachRsrcRsp);
uint8_t packMacSchUeDeleteReq(Pst *pst, SchUeDelete *schUeDel);
uint8_t MacSchUeDeleteReq(Pst *pst, SchUeDelete *ueDelete);
uint8_t packSchUeDeleteRsp(Pst *pst, SchUeDeleteRsp *delRsp);
CellGroupConfigRrc_t cellGrpCfg, *cellGrpCfgMsg = NULLP;
asn_dec_rval_t rval; /* Decoder return value */
+ /* Copy the received container to UeCb */
+ memcpy(&ueCb->f1apMsgDb.duToCuContainer, &rrcCont, sizeof(OCTET_STRING_t));
+
/* Decoding DU to CU RRC container octet string to cell group config */
cellGrpCfgMsg = &cellGrpCfg;
memset(cellGrpCfgMsg, 0, sizeof(CellGroupConfigRrc_t));
CU_ALLOC(rrcRecfg->masterCellGroup, sizeof(OCTET_STRING_t));
if(!rrcRecfg->masterCellGroup)
{
+ DU_LOG("\nERROR --> F1AP : Memory allocation failed in fillRrcReconfigNonCriticalExt");
return RFAILED;
}
+ rrcRecfg->masterCellGroup->size = ueCb->f1apMsgDb.duToCuContainer.size;
+ CU_ALLOC(rrcRecfg->masterCellGroup->buf, rrcRecfg->masterCellGroup->size);
+ if(!rrcRecfg->masterCellGroup->buf)
+ {
+ DU_LOG("\nERROR --> F1AP : Memory allocation failed in fillRrcReconfigNonCriticalExt");
+ return RFAILED;
+ }
+ memcpy(rrcRecfg->masterCellGroup->buf, ueCb->f1apMsgDb.duToCuContainer.buf, rrcRecfg->masterCellGroup->size);
+
+#if 0
+ /* Use below code if masterCEllGroup is to be filled explicitly at CU rather than copying from DUToCURRCContainer
+ * received from DU */
if(fillCellGrpCfg(ueCb, rrcRecfg->masterCellGroup, updateAllRbCfg) != ROK)
{
+ DU_LOG("\nERROR --> F1AP : Failed to fill CellGroupCfg in fillRrcReconfigNonCriticalExt");
return RFAILED;
}
+#endif
return ROK;
}
DuDb *duDb = NULLP;
CuUeCb *ueCb = NULLP;
UEContextSetupResponse_t *ueCtxtSetupRsp = NULLP;
+ OCTET_STRING_t *duToCuRrcContainer;
SEARCH_DU_DB(duIdx, duId, duDb);
ueCtxtSetupRsp = &f1apMsg->choice.successfulOutcome->value.choice.UEContextSetupResponse;
case ProtocolIE_ID_id_DUtoCURRCInformation:
{
DU_LOG("\nINFO --> Received Du to Cu RRC Information ");
+ duToCuRrcContainer = &ueCtxtSetupRsp->protocolIEs.list.array[idx]->value.choice.\
+ DUtoCURRCInformation.cellGroupConfig;
if((extractDuToCuRrcCont(ueCb, ueCtxtSetupRsp->protocolIEs.list.array[idx]->value.choice.\
DUtoCURRCInformation.cellGroupConfig)) != ROK)
{
/* Store source DU info in the new UE context created in
* tareget DU */
ueCb->hoInfo.sourceDuId = srcDuDb->duId;
+
+ /* Copy the received container to UeCb */
+ memcpy(&ueCbInSrcDu->f1apMsgDb.duToCuContainer, duToCuRrcContainer, sizeof(OCTET_STRING_t));
+
if(BuildAndSendUeContextModificationReq(srcDuDb->duId, ueCbInSrcDu, STOP_DATA_TX) != ROK)
{
DU_LOG("\nERROR -> F1AP : Failed at BuildAndSendUeContextModificationReq()");
ueContextModifyReq->protocolIEs.list.array[ieIdx]->value.choice.TransmissionActionIndicator = \
TransmissionActionIndicator_restart;
}
+
ieIdx++;
ueContextModifyReq->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_RRCContainer;
ueContextModifyReq->protocolIEs.list.array[ieIdx]->criticality = Criticality_reject;
else
{
DU_LOG("\nDEBUG --> F1AP : Created APER encodedbuffer for ueContextModifyReq\n");
+#if 0
+ /* This for loop was going into an infinite loop even though encBufSize
+ * has a small value. Hence commented this
+ */
for(ieIdx=0; ieIdx< encBufSize; ieIdx++)
{
DU_LOG("%x",encBuf[ieIdx]);
}
+#endif
}
/* TODO : Hardcoding DU ID to 1 for messages other than F1 Setup Response. This will be made generic in future gerrit */
#define CU_IP_V6_ADDR "0000:0000:0000:0000:0000:0000:0000:0011"
#ifndef O1_ENABLE
-#define DU_IP_V4_ADDR (char*[]){"192.168.130.85", "192.168.130.83"}
+#define DU_IP_V4_ADDR (char*[]){"192.168.130.81", "192.168.130.83"}
#define DU_SCTP_PORT (int[]){38472, 38473}
-#define CU_IP_V4_ADDR "192.168.130.86"
+#define CU_IP_V4_ADDR "192.168.130.82"
#define CU_SCTP_PORT_TO_DU (int[]){38472, 38473}
#endif
#include "OCTET_STRING.h"
#include "BIT_STRING.h"
#include "odu_common_codec.h"
-#include "du_sys_info_hdl.h"
#include "MIB.h"
#include "SearchSpace.h"
#include "SIB-TypeInfo.h"
#include "RACH-ConfigCommon.h"
#include "BWP-DownlinkCommon.h"
#include "BWP-UplinkCommon.h"
+#include "TDD-UL-DL-ConfigCommon.h"
+#include "du_sys_info_hdl.h"
#ifdef O1_ENABLE
#include "CmInterface.h"
}
*(duCfgParam.macCellCfg.prachCfg.fdm[0].unsuedRootSeq) = UNUSED_ROOT_SEQ;
}
+
+ duCfgParam.macCellCfg.prachCfg.totalNumRaPreamble = NUM_RA_PREAMBLE;
duCfgParam.macCellCfg.prachCfg.ssbPerRach = SSB_PER_RACH;
+ duCfgParam.macCellCfg.prachCfg.numCbPreamblePerSsb = CB_PREAMBLE_PER_SSB;
duCfgParam.macCellCfg.prachCfg.prachMultCarrBand = PRACH_MULT_CARRIER_BAND;
duCfgParam.macCellCfg.prachCfg.raContResTmr = RA_CONT_RES_TIMER;
duCfgParam.macCellCfg.prachCfg.rsrpThreshSsb = RSRP_THRESHOLD_SSB;
PucchCfgCommon pucchCfg;
TddUlDlCfgCommon tddCfg;
+#ifdef O1_ENABLE
+ srvCellCfgComm->scs = convertScsValToScsEnum(cellParams.ssbSubCarrierSpacing);
+#else
+ srvCellCfgComm->scs = NR_SCS;
+#endif
+
/* Configuring DL Config Common for SIB1*/
srvCellCfgComm->dlCfg.freqBandInd = NR_FREQ_BAND;
srvCellCfgComm->dlCfg.offsetToPointA = OFFSET_TO_POINT_A;
pdcchCfg.searchSpcZero = SEARCHSPACE_0_INDEX;
pdcchCfg.searchSpcId = PDCCH_SEARCH_SPACE_ID;
pdcchCfg.ctrlRsrcSetId = PDCCH_CTRL_RSRC_SET_ID;
- pdcchCfg.monitorSlotPrdAndOffPresent = \
-
- SearchSpace__monitoringSlotPeriodicityAndOffset_PR_sl1;
+ pdcchCfg.monitorSlotPrdAndOffPresent = SearchSpace__monitoringSlotPeriodicityAndOffset_PR_sl1;
//pdcchCfg.monitorSlotPrdAndOff = \
SearchSpace__monitoringSlotPeriodicityAndOffset_PR_sl1;
pdcchCfg.monitorSymbolsInSlot[0] = 128;
pdschCfg.present = BWP_DownlinkCommon__pdsch_ConfigCommon_PR_setup;
pdschCfg.numTimeDomRsrcAlloc = 2;
pdschCfg.timeDomAlloc[0].k0 = PDSCH_K0_CFG1;
- pdschCfg.timeDomAlloc[0].mapType = \
- PDSCH_TimeDomainResourceAllocation__mappingType_typeA;
+ pdschCfg.timeDomAlloc[0].mapType = PDSCH_TimeDomainResourceAllocation__mappingType_typeA;
pdschCfg.timeDomAlloc[0].sliv = calcSliv(PDSCH_START_SYMBOL,PDSCH_LENGTH_SYMBOL);
pdschCfg.timeDomAlloc[1].k0 = PDSCH_K0_CFG2;
- pdschCfg.timeDomAlloc[1].mapType = \
- PDSCH_TimeDomainResourceAllocation__mappingType_typeA;
+ pdschCfg.timeDomAlloc[1].mapType = PDSCH_TimeDomainResourceAllocation__mappingType_typeA;
pdschCfg.timeDomAlloc[1].sliv = calcSliv(PDSCH_START_SYMBOL,PDSCH_LENGTH_SYMBOL);
srvCellCfgComm->dlCfg.pdschCfg = pdschCfg;
/* Configuring BCCH Config for SIB1 */
- srvCellCfgComm->dlCfg.bcchCfg.modPrdCoeff = \
- BCCH_Config__modificationPeriodCoeff_n16;
+ srvCellCfgComm->dlCfg.bcchCfg.modPrdCoeff = BCCH_Config__modificationPeriodCoeff_n16;
/* Configuring PCCH Config for SIB1 */
pcchCfg.dfltPagingCycle = convertPagingCycleEnumToValue(PagingCycle_rf256);
srvCellCfgComm->ulCfg.ulScsCarrier.scs = NR_SCS;
srvCellCfgComm->ulCfg.ulScsCarrier.scsBw = NR_BANDWIDTH;
#endif
+ srvCellCfgComm->ulCfg.freqBandInd = NR_FREQ_BAND;
srvCellCfgComm->ulCfg.pMax = UL_P_MAX;
srvCellCfgComm->ulCfg.locAndBw = FREQ_LOC_BW;
srvCellCfgComm->ulCfg.timeAlignTimerComm = TimeAlignmentTimer_infinity;
rachCfg.pwrRampingStep = RACH_ConfigGeneric__powerRampingStep_dB2;
rachCfg.raRspWindow = RACH_ConfigGeneric__ra_ResponseWindow_sl10;
rachCfg.numRaPreamble = NUM_RA_PREAMBLE;
- rachCfg.ssbPerRachOccPresent = \
- RACH_ConfigCommon__ssb_perRACH_OccasionAndCB_PreamblesPerSSB_PR_one;
- rachCfg.numSsbPerRachOcc = SSB_PER_RACH;
+ rachCfg.numSsbPerRachOcc = RACH_ConfigCommon__ssb_perRACH_OccasionAndCB_PreamblesPerSSB_PR_one;
+ rachCfg.numCbPreamblePerSsb = CB_PREAMBLE_PER_SSB;
rachCfg.contResTimer = RACH_ConfigCommon__ra_ContentionResolutionTimer_sf64;
rachCfg.rsrpThreshSsb = RSRP_THRESHOLD_SSB;
rachCfg.rootSeqIdxPresent = RACH_ConfigCommon__prach_RootSequenceIndex_PR_l139;
srvCellCfgComm->tddCfg = tddCfg;
srvCellCfgComm->ssbPosInBurst = 192;
- srvCellCfgComm->ssbPrdServingCell = SSB_PERIODICITY_20MS;
+ srvCellCfgComm->ssbPrdServingCell = SSB_PERIODICITY;
srvCellCfgComm->ssPbchBlockPwr = SSB_PBCH_PWR;
return ROK;
#define DU_ID 1
#ifndef O1_ENABLE
-
-#define DU_IP_V4_ADDR "192.168.130.85"
-#define CU_IP_V4_ADDR "192.168.130.86"
-#define RIC_IP_V4_ADDR "192.168.130.87"
+#define DU_IP_V4_ADDR "192.168.130.81"
+#define CU_IP_V4_ADDR "192.168.130.82"
+#define RIC_IP_V4_ADDR "192.168.130.80"
#define DU_PORT 38472
#define CU_PORT 38472
#define RIC_PORT 36421
#define NORMAL_CYCLIC_PREFIX 0
#define OFFSET_TO_POINT_A 24 /* PRB Offset to Point A */
#define BETA_PSS BETA_PSS_0DB
-#define SSB_PERIODICITY_5MS 5
-#define SSB_PERIODICITY_10MS 10
-#define SSB_PERIODICITY_20MS 20
-#define SSB_PERIODICITY_40MS 40
-#define SSB_PERIODICITY_80MS 80
-#define SSB_PERIODICITY_160MS 160
+#define SSB_PERIODICITY 20
#define SSB_SUBCARRIER_OFFSET 0
#define SSB_MULT_CARRIER_BAND FALSE
#define MULT_CELL_CARRIER FALSE
#define NUM_UNUSED_ROOT_SEQ 0
#define UNUSED_ROOT_SEQ 1
#define SSB_PER_RACH 1
+#define CB_PREAMBLE_PER_SSB 8
#define PRACH_MULT_CARRIER_BAND FALSE
#define PRACH_PREAMBLE_RCVD_TGT_PWR -74
#define NUM_RA_PREAMBLE 63
long pwrRampingStep; /* Power ramping steps for PRACH */
long raRspWindow; /* RA response window */
long numRaPreamble; /* Total num of preamble used in random access */
- uint8_t ssbPerRachOccPresent;
long numSsbPerRachOcc; /* Numer of SSBs per RACH Occassion */
+ long numCbPreamblePerSsb; /* Number of Contention-Based preamble per SSB */
long contResTimer; /* Contention resolution timer */
long rsrpThreshSsb;
uint8_t rootSeqIdxPresent;
typedef struct ulCfgCommon
{
+ long freqBandInd; /* Uplink frequency band indicator */
long pMax; /* Max UL transmission power that UE applies */
long locAndBw; /* Frequency location and bandwidth */
ScsSpecCarrier ulScsCarrier; /* SCS Specific carrier */
typedef struct srvCellCfgCommSib
{
+ long scs;
DlCfgCommon dlCfg;
UlCfgCommon ulCfg;
uint8_t ssbPosInBurst;
return PCCH_Config__ns_one;
}
}
+
+/************************************************************************
+ *
+ * @brief Converts actual values into enum value of SSB Periodicity in SIB
+ *
+ * @details
+ *
+ * Function : convertSsbPeriodicityValueToEnumForSib
+ *
+ * Functionality:
+ * Converts actual values into enum value of SSB Periodicity in SIB
+ *
+ *
+ * @params[in] Actual value of SSB Periodicity
+ * @return Enum value of SSB Periodicity
+ *
+ * **********************************************************************/
+e_ServingCellConfigCommonSIB__ssb_PeriodicityServingCell convertSsbPeriodicityValueToEnumForSib(uint16_t ssbPeriodicity)
+{
+ switch(ssbPeriodicity)
+ {
+ case 5:
+ return ServingCellConfigCommonSIB__ssb_PeriodicityServingCell_ms5;
+ case 10:
+ return ServingCellConfigCommonSIB__ssb_PeriodicityServingCell_ms10;
+ case 20:
+ return ServingCellConfigCommonSIB__ssb_PeriodicityServingCell_ms20;
+ case 40:
+ return ServingCellConfigCommonSIB__ssb_PeriodicityServingCell_ms40;
+ case 80:
+ return ServingCellConfigCommonSIB__ssb_PeriodicityServingCell_ms80;
+ case 160:
+ return ServingCellConfigCommonSIB__ssb_PeriodicityServingCell_ms160;
+ default:
+ return ServingCellConfigCommonSIB__ssb_PeriodicityServingCell_ms20;
+ }
+}
+
+/************************************************************************
+ *
+ * @brief Converts actual values into enum value of SSB Periodicity
+ *
+ * @details
+ *
+ * Function : convertSsbPeriodicityValueToEnum
+ *
+ * Functionality:
+ * Converts actual values into enum value of SSB Periodicity
+ *
+ *
+ * @params[in] Actual value of SSB Periodicity
+ * @return Enum value of SSB Periodicity
+ *
+ * **********************************************************************/
+e_ServingCellConfigCommon__ssb_periodicityServingCell convertSsbPeriodicityValueToEnum(uint16_t ssbPeriodicity)
+{
+ switch(ssbPeriodicity)
+ {
+ case 5:
+ return ServingCellConfigCommon__ssb_periodicityServingCell_ms5;
+ case 10:
+ return ServingCellConfigCommon__ssb_periodicityServingCell_ms10;
+ case 20:
+ return ServingCellConfigCommon__ssb_periodicityServingCell_ms20;
+ case 40:
+ return ServingCellConfigCommon__ssb_periodicityServingCell_ms40;
+ case 80:
+ return ServingCellConfigCommon__ssb_periodicityServingCell_ms80;
+ case 160:
+ return ServingCellConfigCommon__ssb_periodicityServingCell_ms160;
+ default:
+ return ServingCellConfigCommon__ssb_periodicityServingCell_ms20;
+ }
+}
+
+/************************************************************************
+ *
+ * @brief Converts actual values into enum value of SSB per RACH occassion
+ * for CFRA
+ *
+ * @details
+ *
+ * Function : convertCFRASsbPerRachOccasionValueToEnum
+ *
+ * Functionality:
+ * Converts actual values into enum value of SSB occasion per RACH
+ * occassion for CFRA
+ *
+ * @params[in] Actual value of SSB Occasion per RACH
+ * @return Enum value
+ *
+ * **********************************************************************/
+e_CFRA__occasions__ssb_perRACH_Occasion convertCFRASsbPerRachOccasionValueToEnum(uint8_t ssbOccPerRach)
+{
+ switch(ssbOccPerRach)
+ {
+ case 1:
+ return CFRA__occasions__ssb_perRACH_Occasion_one;
+ case 2:
+ return CFRA__occasions__ssb_perRACH_Occasion_two;
+ case 4:
+ return CFRA__occasions__ssb_perRACH_Occasion_four;
+ case 8:
+ return CFRA__occasions__ssb_perRACH_Occasion_eight;
+ case 16:
+ return CFRA__occasions__ssb_perRACH_Occasion_sixteen;
+ default:
+ return CFRA__occasions__ssb_perRACH_Occasion_one;
+ }
+}
+
+/************************************************************************
+ *
+ * @brief Converts actual values into enum value of CB Preamble per SSB
+ * for one SSB per RACH occassion
+ *
+ * @details
+ *
+ * Function : convertCbPreamblePerSsbValueToEnum
+ *
+ * Functionality:
+ * Converts actual values into enum value of CB Preamble per
+ * SSB for one SSB per RACH occasion
+ *
+ * @params[in] Actual value of CB preambles per SSB
+ * @return Enum value
+ *
+ * **********************************************************************/
+e_RACH_ConfigCommon__ssb_perRACH_OccasionAndCB_PreamblesPerSSB__one convertCbPreamblePerSsbValueToEnum(uint8_t numCbPreamblePerSsb)
+{
+ switch(numCbPreamblePerSsb)
+ {
+ case 4:
+ return RACH_ConfigCommon__ssb_perRACH_OccasionAndCB_PreamblesPerSSB__one_n4;
+ case 8:
+ return RACH_ConfigCommon__ssb_perRACH_OccasionAndCB_PreamblesPerSSB__one_n8;
+ case 12:
+ return RACH_ConfigCommon__ssb_perRACH_OccasionAndCB_PreamblesPerSSB__one_n12;
+ case 16:
+ return RACH_ConfigCommon__ssb_perRACH_OccasionAndCB_PreamblesPerSSB__one_n16;
+ case 20:
+ return RACH_ConfigCommon__ssb_perRACH_OccasionAndCB_PreamblesPerSSB__one_n20;
+ case 24:
+ return RACH_ConfigCommon__ssb_perRACH_OccasionAndCB_PreamblesPerSSB__one_n24;
+ case 28:
+ return RACH_ConfigCommon__ssb_perRACH_OccasionAndCB_PreamblesPerSSB__one_n28;
+ case 32:
+ return RACH_ConfigCommon__ssb_perRACH_OccasionAndCB_PreamblesPerSSB__one_n32;
+ case 36:
+ return RACH_ConfigCommon__ssb_perRACH_OccasionAndCB_PreamblesPerSSB__one_n36;
+ case 40:
+ return RACH_ConfigCommon__ssb_perRACH_OccasionAndCB_PreamblesPerSSB__one_n40;
+ case 44:
+ return RACH_ConfigCommon__ssb_perRACH_OccasionAndCB_PreamblesPerSSB__one_n44;
+ case 48:
+ return RACH_ConfigCommon__ssb_perRACH_OccasionAndCB_PreamblesPerSSB__one_n48;
+ case 52:
+ return RACH_ConfigCommon__ssb_perRACH_OccasionAndCB_PreamblesPerSSB__one_n52;
+ case 56:
+ return RACH_ConfigCommon__ssb_perRACH_OccasionAndCB_PreamblesPerSSB__one_n56;
+ case 60:
+ return RACH_ConfigCommon__ssb_perRACH_OccasionAndCB_PreamblesPerSSB__one_n60;
+ case 64:
+ return RACH_ConfigCommon__ssb_perRACH_OccasionAndCB_PreamblesPerSSB__one_n64;
+ default:
+ return RACH_ConfigCommon__ssb_perRACH_OccasionAndCB_PreamblesPerSSB__one_n8;
+ }
+}
+
+/************************************************************************
+ *
+ * @brief Converts actual values into enum value of DMRS Type A Position
+ * for CFRA
+ *
+ * @details
+ *
+ * Function : convertDmrsTypeAPosValueToEnum
+ *
+ * Functionality:
+ * Converts actual values into enum value of DMRS Type A Position
+ *
+ * @params[in] Actual value of DMRS Type A Position
+ * @return Enum value
+ *
+ * **********************************************************************/
+e_ServingCellConfigCommon__dmrs_TypeA_Position convertDmrsTypeAPosValueToEnum(uint8_t dmrsTypeAPos)
+{
+ switch(dmrsTypeAPos)
+ {
+ case 2:
+ return ServingCellConfigCommon__dmrs_TypeA_Position_pos2;
+ case 3:
+ return ServingCellConfigCommon__dmrs_TypeA_Position_pos3;
+ default:
+ return ServingCellConfigCommon__dmrs_TypeA_Position_pos2;
+ }
+}
+
/**********************************************************************
End of file
**********************************************************************/
#include "PUCCH-Resource.h"
#include "PagingDRX.h"
#include "PCCH-Config.h"
+#include "ServingCellConfigCommonSIB.h"
+#include "ServingCellConfigCommon.h"
+#include "CFRA.h"
+#include "RACH-ConfigCommon.h"
#include "du_app_rlc_inf.h"
RLC_BearerConfig__servedRadioBearer_PR covertRbTypeFromIntEnumToRrcEnum(RlcRbType rbType);
uint8_t convertNsEnumToValue(e_PCCH_Config__ns Ns);
e_PCCH_Config__ns convertNsValueToEnum(uint8_t numPO);
+e_ServingCellConfigCommonSIB__ssb_PeriodicityServingCell convertSsbPeriodicityValueToEnumForSib(uint16_t ssbPeriodicity);
+e_ServingCellConfigCommon__ssb_periodicityServingCell convertSsbPeriodicityValueToEnum(uint16_t ssbPeriodicity);
+e_CFRA__occasions__ssb_perRACH_Occasion convertCFRASsbPerRachOccasionValueToEnum(uint8_t ssbOccPerRach);
+e_ServingCellConfigCommon__dmrs_TypeA_Position convertDmrsTypeAPosValueToEnum(uint8_t dmrsTypeAPos);
+e_RACH_ConfigCommon__ssb_perRACH_OccasionAndCB_PreamblesPerSSB__one convertCbPreamblePerSsbValueToEnum(uint8_t numCbPreamblePerSsb);
+
/**********************************************************************
End of file
**********************************************************************/
#include "UPTransportLayerInformation.h"
#include "GTPTunnel.h"
#include "SupportedSULFreqBandItem.h"
-#include "du_sys_info_hdl.h"
#include "du_e2ap_msg_hdl.h"
#include "du_f1ap_conversions.h"
#include "CNUEPagingIdentity.h"
#include "PCCH-Config.h"
+#include "SCS-SpecificCarrier.h"
+#include "FrequencyInfoDL.h"
+#include "DownlinkConfigCommon.h"
+#include "FrequencyInfoUL.h"
+#include "UplinkConfigCommon.h"
+#include "TDD-UL-DL-ConfigCommon.h"
+#include "RACH-ConfigDedicated.h"
+#include "CFRA-SSB-Resource.h"
+#include "BWP-UplinkCommon.h"
+#include "ReconfigurationWithSync.h"
+#include "du_sys_info_hdl.h"
#ifdef O1_ENABLE
#include "CmInterface.h"
return ROK;
}
+
/*******************************************************************
*
- * @brief Builds Spcell config
+ * @brief Fills SCS specific carrier list in DL frequency info
*
* @details
*
- * Function : BuildSpCellCfg
+ * Function : BuildScsSpecificCarrierListDl
*
- * Functionality: Builds sp cell config in DuToCuRrcContainer
+ * Functionality: Fills SCS specific carrier list in DL frequency info
*
- * @params[in] SpCellConfig_t spCellCfg
+ * @params[in] Pointer to struct FrequencyInfoDL__scs_SpecificCarrierList
*
* @return ROK - success
* RFAILED - failure
*
* ****************************************************************/
-uint8_t BuildSpCellCfg(DuUeCb *ueCb, SpCellConfig_t *spCellCfg)
+uint8_t BuildScsSpecificCarrierListDl(struct FrequencyInfoDL__scs_SpecificCarrierList *scsCarrierList)
{
- spCellCfg->servCellIndex = NULLP;
- DU_ALLOC(spCellCfg->servCellIndex, sizeof(long));
- if(!spCellCfg->servCellIndex)
+ uint8_t elementCnt = 0, listIdx = 0;
+ ScsSpecCarrier duScsSpecCarrier = duCfgParam.sib1Params.srvCellCfgCommSib.dlCfg.dlScsCarrier;
+
+ elementCnt = ODU_VALUE_ONE;
+ scsCarrierList->list.count = elementCnt;
+ scsCarrierList->list.size = elementCnt * sizeof(SCS_SpecificCarrier_t *);
+
+ DU_ALLOC(scsCarrierList->list.array, scsCarrierList->list.size);
+ if(!scsCarrierList->list.array)
{
- DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildSpCellCfg");
+ DU_LOG("\nERROR --> DU APP : Memory allocation failed for scs carrier list array \
+ in BuildScsSpecificCarrierListDl()");
return RFAILED;
}
- if(ueCb == NULLP)
- *(spCellCfg->servCellIndex) = SERV_CELL_IDX;
- else
- *(spCellCfg->servCellIndex) = ueCb->macUeCfg.spCellCfg.servCellIdx;
+ for(listIdx = 0; listIdx < elementCnt; listIdx++)
+ {
+ DU_ALLOC(scsCarrierList->list.array[listIdx], sizeof(SCS_SpecificCarrier_t));
+ if(!scsCarrierList->list.array[listIdx])
+ {
+ DU_LOG("\nERROR --> DU APP : Memory allocation failed for SCS Specific Carrier list array \
+ element in BuildScsSpecificCarrierListDl()");
+ return RFAILED;
+ }
+ }
- spCellCfg->reconfigurationWithSync = NULLP;
- spCellCfg->rlf_TimersAndConstants = NULLP;
- spCellCfg->rlmInSyncOutOfSyncThreshold = NULLP;
+ listIdx = 0;
+ scsCarrierList->list.array[listIdx]->offsetToCarrier = duScsSpecCarrier.scsOffset;
+ scsCarrierList->list.array[listIdx]->subcarrierSpacing = duScsSpecCarrier.scs;
+ scsCarrierList->list.array[listIdx]->carrierBandwidth = duScsSpecCarrier.scsBw;
- DU_ALLOC(spCellCfg->rlmInSyncOutOfSyncThreshold, sizeof(long));
- if(!spCellCfg->rlmInSyncOutOfSyncThreshold)
+ return ROK;
+}
+
+/*******************************************************************
+ *
+ * @brief Fills DL frequency info in DL config common
+ *
+ * @details
+ *
+ * Function : BuildFreqInfoDl
+ *
+ * Functionality: Fills DL frequency info in DL config common
+ *
+ * @params[in] Pointer to DownlinkConfigCommon_t
+ *
+ * @return ROK - success
+ * RFAILED - failure
+ *
+ * ****************************************************************/
+uint8_t BuildFreqInfoDl(FrequencyInfoDL_t *frequencyInfoDL)
+{
+ uint8_t freqBandIdx = 0, elementCnt = 0;
+ DlCfgCommon dlCfg = duCfgParam.sib1Params.srvCellCfgCommSib.dlCfg;
+
+ /* TODO : Fill SSB Absolute Frequency */
+ /*
+ DU_ALLOC(frequencyInfoDL->absoluteFrequencySSB, sizeof(ARFCN_ValueNR_t));
+ if(!frequencyInfoDL->absoluteFrequencySSB)
+ {
+ DU_LOG("\nERROR --> DU APP : Memory allocation failed for SSB Absolute Frequency in BuildFreqInfoDl()");
+ return RFAILED;
+ }
+ frequencyInfoDL->absoluteFrequencySSB = ?;
+ */
+
+ /* NR Multi Frequency Band List */
+ elementCnt = ODU_VALUE_ONE;
+ frequencyInfoDL->frequencyBandList.list.count = elementCnt;
+ frequencyInfoDL->frequencyBandList.list.size = elementCnt * sizeof(FreqBandIndicatorNR_t *);
+
+ DU_ALLOC(frequencyInfoDL->frequencyBandList.list.array, frequencyInfoDL->frequencyBandList.list.size);
+ if(!frequencyInfoDL->frequencyBandList.list.array)
{
- DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildSpCellCfg");
+ DU_LOG("\nERROR --> DU APP : Memory allocation failed for Frequency Band List array in BuildFreqInfoDl()");
return RFAILED;
}
- *(spCellCfg->rlmInSyncOutOfSyncThreshold) = RLM_SYNC_OUT_SYNC_THRESHOLD;
- spCellCfg->spCellConfigDedicated = NULLP;
- DU_ALLOC(spCellCfg->spCellConfigDedicated, sizeof(ServingCellConfig_t));
- if(!spCellCfg->spCellConfigDedicated)
+ for(freqBandIdx = 0; freqBandIdx < elementCnt; freqBandIdx++)
{
- DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildSpCellCfg");
- return RFAILED;
+ DU_ALLOC(frequencyInfoDL->frequencyBandList.list.array[freqBandIdx], sizeof(FreqBandIndicatorNR_t));
+ if(!frequencyInfoDL->frequencyBandList.list.array[freqBandIdx])
+ {
+ DU_LOG("\nERROR --> DU APP : Memory allocation failed for frequency band array element in BuildFreqInfoDl()");
+ return RFAILED;
+ }
}
- if(BuildSpCellCfgDed(ueCb, spCellCfg->spCellConfigDedicated) != ROK)
+
+ freqBandIdx = 0;
+ *(frequencyInfoDL->frequencyBandList.list.array[freqBandIdx]) = dlCfg.freqBandInd;
+
+ /* TODO : Absolute Frequency to Point A */
+ //frequencyInfoDL->absoluteFrequencyPointA
+
+ /* Subcarrier Spacing specifc carrier List */
+ if((BuildScsSpecificCarrierListDl(&frequencyInfoDL->scs_SpecificCarrierList)) != ROK)
{
- DU_LOG("\nERROR --> F1AP : BuildSpCellCfgDed failed");
+ DU_LOG("\nERROR --> DU APP : Failed to fill SCS specific carrier list DL in BuildFreqInfoDl()");
return RFAILED;
}
return ROK;
+
}
/*******************************************************************
*
- * @brief Builds Phy cell group config
+ * @brief Fills DL config common in Serving cell config common
*
* @details
*
- * Function : BuildPhyCellGrpCfg
+ * Function : BuildDlConfigCommon
*
- * Functionality: Builds Phy cell group config in DuToCuRrcContainer
+ * Functionality: Fills DL config common in Serving cell config common
*
- * @params[in] PhysicalCellGroupConfig_t *phyCellGrpCfg
+ * @params[in] Pointer to DownlinkConfigCommon_t
*
* @return ROK - success
* RFAILED - failure
*
* ****************************************************************/
-uint8_t BuildPhyCellGrpCfg(DuUeCb *ueCb, PhysicalCellGroupConfig_t *phyCellGrpCfg)
+uint8_t BuildDlConfigCommon(DownlinkConfigCommon_t *dlCfgCommon)
{
- phyCellGrpCfg->harq_ACK_SpatialBundlingPUCCH = NULLP;
- phyCellGrpCfg->harq_ACK_SpatialBundlingPUSCH = NULLP;
-
- phyCellGrpCfg->p_NR_FR1 = NULLP;
- DU_ALLOC(phyCellGrpCfg->p_NR_FR1, sizeof(long));
- if(!phyCellGrpCfg->p_NR_FR1)
+ /* DL Frequency Info */
+ DU_ALLOC(dlCfgCommon->frequencyInfoDL, sizeof(FrequencyInfoDL_t));
+ if(!dlCfgCommon->frequencyInfoDL)
{
- DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildPhyCellGrpCfg");
+ DU_LOG("\nERROR --> DU APP : Memory allocation failed for DL frequency info in BuildDlConfigCommon()");
+ return RFAILED;
+ }
+ if((BuildFreqInfoDl(dlCfgCommon->frequencyInfoDL))!= ROK)
+ {
+ DU_LOG("\nERROR --> DU APP : Failed to fill DL frequency info in BuildDlConfigCommon()");
return RFAILED;
}
- if(ueCb == NULLP)
+ /* DL BWP config common */
+ DU_ALLOC(dlCfgCommon->initialDownlinkBWP, sizeof(BWP_DownlinkCommon_t));
+ if(!dlCfgCommon->initialDownlinkBWP)
{
- *(phyCellGrpCfg->p_NR_FR1) = P_NR_FR1;
- phyCellGrpCfg->pdsch_HARQ_ACK_Codebook = PDSCH_HARQ_ACK_CODEBOOK;
+ DU_LOG("\nERROR --> DU APP : Memory allocation failed for DL BWP config common in BuildDlConfigCommon()");
+ return RFAILED;
}
- else
+ if((BuildBwpDlCommon(dlCfgCommon->initialDownlinkBWP)) != ROK)
{
- *(phyCellGrpCfg->p_NR_FR1) = ueCb->macUeCfg.phyCellGrpCfg.pNrFr1;
- phyCellGrpCfg->pdsch_HARQ_ACK_Codebook = ueCb->macUeCfg.phyCellGrpCfg.pdschHarqAckCodebook;
+ DU_LOG("\nERROR --> DU APP : Failed to fill DL DWP config common in BuildDlConfigCommon()");
+ return RFAILED;
}
- phyCellGrpCfg->tpc_SRS_RNTI = NULLP;
- phyCellGrpCfg->tpc_PUCCH_RNTI = NULLP;
- phyCellGrpCfg->tpc_PUSCH_RNTI = NULLP;
- phyCellGrpCfg->sp_CSI_RNTI = NULLP;
- phyCellGrpCfg->cs_RNTI = NULLP;
- phyCellGrpCfg->ext1 = NULLP;
- phyCellGrpCfg->ext2 = NULLP;
+ return ROK;
+}
+
+/*******************************************************************
+ *
+ * @brief Fills SCS specific carrier list in UL frequency Info
+ *
+ * @details
+ *
+ * Function : BuildScsSpecificCarrierListUl
+ *
+ * Functionality: Fills SCS specific carrier list in UL frequency Info
+ *
+ * @params[in] Pointer to struct FrequencyInfoUL__scs_SpecificCarrierList
+ *
+ * @return ROK - success
+ * RFAILED - failure
+ *
+ * ****************************************************************/
+uint8_t BuildScsSpecificCarrierListUl(struct FrequencyInfoUL__scs_SpecificCarrierList *scsCarrierList)
+{
+ uint8_t elementCnt = 0, listIdx = 0;
+ ScsSpecCarrier duScsSpecCarrier = duCfgParam.sib1Params.srvCellCfgCommSib.ulCfg.ulScsCarrier;
+
+ elementCnt = ODU_VALUE_ONE;
+ scsCarrierList->list.count = elementCnt;
+ scsCarrierList->list.size = elementCnt * sizeof(SCS_SpecificCarrier_t *);
+
+ DU_ALLOC(scsCarrierList->list.array, scsCarrierList->list.size);
+ if(!scsCarrierList->list.array)
+ {
+ DU_LOG("\nERROR --> DU APP : SCS Specific Carrier list memory allocation failed");
+ return RFAILED;
+ }
+
+ for(listIdx = 0; listIdx < scsCarrierList->list.count; listIdx++)
+ {
+ DU_ALLOC(scsCarrierList->list.array[listIdx], sizeof(SCS_SpecificCarrier_t));
+ if(!scsCarrierList->list.array[listIdx])
+ {
+ DU_LOG("\nERROR --> DU APP : SCS Specific Carrier list memory allocation failed");
+ return RFAILED;
+ }
+ }
+ listIdx = 0;
+ scsCarrierList->list.array[listIdx]->offsetToCarrier = duScsSpecCarrier.scsOffset;
+ scsCarrierList->list.array[listIdx]->subcarrierSpacing = duScsSpecCarrier.scs;
+ scsCarrierList->list.array[listIdx]->carrierBandwidth = duScsSpecCarrier.scsBw;
return ROK;
}
/*******************************************************************
*
- * @brief Builds Mac cell group config
+ * @brief Fills frequency info in UL config common
*
* @details
*
- * Function : BuildMacCellGrpCfg
+ * Function : BuildFreqInfoUl
*
- * Functionality: Builds Mac cell group config in DuToCuRrcContainer
+ * Functionality: Fills frequency info in UL config common
*
- * @params[in] MAC_CellGroupConfig_t *macCellGrpCfg
+ * @params[in] Pointer to FrequencyInfoUL_t
*
* @return ROK - success
* RFAILED - failure
*
* ****************************************************************/
-uint8_t BuildMacCellGrpCfg(DuUeCb *ueCb, MAC_CellGroupConfig_t *macCellGrpCfg)
+uint8_t BuildFreqInfoUl(FrequencyInfoUL_t *frequencyInfoUL)
{
- macCellGrpCfg->drx_Config = NULLP;
- macCellGrpCfg->schedulingRequestConfig = NULLP;
- DU_ALLOC(macCellGrpCfg->schedulingRequestConfig, sizeof(struct SchedulingRequestConfig));
- if(!macCellGrpCfg->schedulingRequestConfig)
+ uint8_t elementCnt = 0, listIdx= 0;
+ UlCfgCommon ulCfg = duCfgParam.sib1Params.srvCellCfgCommSib.ulCfg;
+
+ /* NR Multi Frequency Band List */
+ DU_ALLOC(frequencyInfoUL->frequencyBandList, sizeof(MultiFrequencyBandListNR_t));
+ if(!frequencyInfoUL->frequencyBandList)
{
- DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildMacCellGrpCfg");
+ DU_LOG("\nERROR --> DU APP : Memory allocation failed for frequency band list in BuildFreqInfoUl()");
return RFAILED;
}
- if(BuildSchedulingReqConfig(ueCb, macCellGrpCfg->schedulingRequestConfig) != ROK)
+ elementCnt = ODU_VALUE_ONE;
+ frequencyInfoUL->frequencyBandList->list.count = elementCnt;
+ frequencyInfoUL->frequencyBandList->list.size = elementCnt * sizeof(FreqBandIndicatorNR_t *);
+
+ DU_ALLOC(frequencyInfoUL->frequencyBandList->list.array, frequencyInfoUL->frequencyBandList->list.size);
+ if(!frequencyInfoUL->frequencyBandList->list.array)
{
- DU_LOG("\nERROR --> F1AP : BuildSchedulingReqConfig failed");
+ DU_LOG("\nERROR --> DU APP : Memory allocation failed for frequency band array in BuildFreqInfoUl()");
return RFAILED;
}
- macCellGrpCfg->bsr_Config = NULLP;
- DU_ALLOC(macCellGrpCfg->bsr_Config, sizeof(struct BSR_Config));
- if(!macCellGrpCfg->bsr_Config)
+ for(listIdx = 0; listIdx < elementCnt; listIdx++)
{
- DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildMacCellGrpCfg");
+ DU_ALLOC(frequencyInfoUL->frequencyBandList->list.array[listIdx], sizeof(FreqBandIndicatorNR_t));
+ if(!frequencyInfoUL->frequencyBandList->list.array[listIdx])
+ {
+ DU_LOG("\nERROR --> DU APP : Memory allocation failed for frequency band array element in BuildFreqInfoUl()");
+ return RFAILED;
+ }
+ }
+
+ listIdx = 0;
+ *(frequencyInfoUL->frequencyBandList->list.array[listIdx]) = ulCfg.freqBandInd;
+
+ /* TODO : Fill Absolute frequency point A */
+ /*
+ DU_ALLOC(frequencyInfoUL->absoluteFrequencyPointA, sizeof(ARFCN_ValueNR_t));
+ if(!frequencyInfoUL->absoluteFrequencyPointA)
+ {
+ DU_LOG("\nERROR --> DU APP : Memory allocation failed for absolute frequency point A in BuildFreqInfoUl()");
+ return RFAILED;
+ }
+ *(frequencyInfoUL->absoluteFrequencyPointA) = ?;
+ */
+
+ /* Subcarrier Spacing specifc carrier */
+ if((BuildScsSpecificCarrierListUl(&frequencyInfoUL->scs_SpecificCarrierList)) != ROK)
+ {
+ DU_LOG("\nERROR --> DU APP : Failed to fill SCS Specific Carrier list UL in BuildFreqInfoUl()");
return RFAILED;
}
- if(BuildBsrConfig(ueCb, macCellGrpCfg->bsr_Config) != ROK)
+ /* P-MAX */
+ DU_ALLOC(frequencyInfoUL->p_Max, sizeof(P_Max_t));
+ if(!frequencyInfoUL->p_Max)
{
- DU_LOG("\nERROR --> F1AP : BuildBsrConfig failed");
+ DU_LOG("\nERROR --> DU APP : UL Frequency Infoo memory allocation failure");
return RFAILED;
}
+ *frequencyInfoUL->p_Max = ulCfg.pMax;
- macCellGrpCfg->tag_Config = NULLP;
- DU_ALLOC(macCellGrpCfg->tag_Config, sizeof(struct TAG_Config));
- if(!macCellGrpCfg->tag_Config)
+ return ROK;
+}
+
+/*******************************************************************
+ *
+ * @brief Fills UL config common in Serving cell config common
+ *
+ * @details
+ *
+ * Function : BuildUlConfigCommon
+ *
+ * Functionality: Fills UL config common in Serving cell config common
+ *
+ * @params[in] Pointer to UplinkConfigCommon_t
+ *
+ * @return ROK - success
+ * RFAILED - failure
+ *
+ * ****************************************************************/
+uint8_t BuildUlConfigCommon(UplinkConfigCommon_t *ulCfgCommon)
+{
+ /* UL Frequency Info */
+ DU_ALLOC(ulCfgCommon->frequencyInfoUL, sizeof(FrequencyInfoUL_t));
+ if(!ulCfgCommon->frequencyInfoUL)
{
- DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildMacCellGrpCfg");
+ DU_LOG("\nERROR --> DU APP : Memory allocation failed for UL frequency info in BuildUlConfigCommon()");
return RFAILED;
}
- if(BuildTagConfig(ueCb, macCellGrpCfg->tag_Config) != ROK)
+ if((BuildFreqInfoUl(ulCfgCommon->frequencyInfoUL)) != ROK)
{
- DU_LOG("\nERROR --> F1AP : BuildTagConfig failed");
+ DU_LOG("\nERROR --> DU APP : Failed to fill frequency info UL in BuildUlConfigCommon()");
return RFAILED;
}
- macCellGrpCfg->phr_Config = NULLP;
- DU_ALLOC(macCellGrpCfg->phr_Config, sizeof(struct MAC_CellGroupConfig__phr_Config));
- if(!macCellGrpCfg->phr_Config)
+ /* UL BWP common */
+ DU_ALLOC(ulCfgCommon->initialUplinkBWP, sizeof(BWP_UplinkCommon_t));
+ if(!ulCfgCommon->initialUplinkBWP)
{
- DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildMacCellGrpCfg");
+ DU_LOG("\nERROR --> DU APP : Memory allocation failed for initial UL BWP in BuildUlConfigCommon()");
return RFAILED;
}
- if(BuildPhrConfig(ueCb, macCellGrpCfg->phr_Config) != ROK)
+ if((BuildBwpUlCommon(ulCfgCommon->initialUplinkBWP)) != ROK)
{
- DU_LOG("\nERROR --> F1AP : BuildPhrConfig failed");
+ DU_LOG("\nERROR --> DU APP : Failed to fill BWP UL common in BuildUlConfigCommon()");
return RFAILED;
}
- macCellGrpCfg->skipUplinkTxDynamic = false;
- macCellGrpCfg->ext1 = NULLP;
+ /* Time Alignment timer */
+ ulCfgCommon->dummy = duCfgParam.sib1Params.srvCellCfgCommSib.ulCfg.timeAlignTimerComm;
return ROK;
}
+
/*******************************************************************
*
- * @brief Frees memeory allocated for SearchSpcToAddModList
+ * @brief Fills SSB position in burst in SP cell config common
*
* @details
*
- * Function : FreeSearchSpcToAddModList
+ * Function : BuildSsbPosInBurst
*
- * Functionality: Deallocating memory of SearchSpcToAddModList
+ * Functionality:
+ * Fills SSB position in burst in SP cell config common
*
- * @params[in] struct PDCCH_Config__searchSpacesToAddModList *searchSpcList
+ * @params[in] Pointer to struct ServingCellConfigCommon__ssb_PositionsInBurst
*
- * @return void
+ * @return ROK - success
+ * RFAILED - failure
*
- 4221 * ****************************************************************/
-void FreeSearchSpcToAddModList(struct PDCCH_Config__searchSpacesToAddModList *searchSpcList)
+ * ****************************************************************/
+uint8_t BuildSsbPosInBurst(struct ServingCellConfigCommon__ssb_PositionsInBurst *ssbPosInBurst)
{
- uint8_t idx1=0;
- uint8_t idx2=0;
- struct SearchSpace *searchSpc=NULLP;
+ uint8_t bitStringSizeInBytes = 0;
- if(searchSpcList->list.array)
+ ssbPosInBurst->present = ServingCellConfigCommon__ssb_PositionsInBurst_PR_mediumBitmap;
+
+ /* As per spec 38.331,in the definition of ServingCellConfigCommon */
+ bitStringSizeInBytes = 1;
+ ssbPosInBurst->choice.mediumBitmap.size = bitStringSizeInBytes * sizeof(uint8_t);
+
+ DU_ALLOC(ssbPosInBurst->choice.mediumBitmap.buf, ssbPosInBurst->choice.mediumBitmap.size);
+ if(!ssbPosInBurst->choice.mediumBitmap.buf)
{
- if(searchSpcList->list.array[idx2])
- {
- searchSpc = searchSpcList->list.array[idx2];
- if(searchSpc->controlResourceSetId)
- {
- if(searchSpc->monitoringSlotPeriodicityAndOffset)
- {
- if(searchSpc->monitoringSymbolsWithinSlot)
- {
- if(searchSpc->monitoringSymbolsWithinSlot->buf)
- {
- if(searchSpc->nrofCandidates)
- {
- if(searchSpc->searchSpaceType)
- {
- DU_FREE(searchSpc->searchSpaceType->choice.ue_Specific,\
- sizeof(struct SearchSpace__searchSpaceType__ue_Specific));
- DU_FREE(searchSpc->searchSpaceType, sizeof(struct
- SearchSpace__searchSpaceType));
- }
- DU_FREE(searchSpc->nrofCandidates,
- sizeof(struct SearchSpace__nrofCandidates));
- }
- DU_FREE(searchSpc->monitoringSymbolsWithinSlot->buf, \
- searchSpc->monitoringSymbolsWithinSlot->size);
- }
- DU_FREE(searchSpc->monitoringSymbolsWithinSlot,
- sizeof(BIT_STRING_t));
- }
- DU_FREE(searchSpc->monitoringSlotPeriodicityAndOffset, \
- sizeof(struct SearchSpace__monitoringSlotPeriodicityAndOffset));
- }
- DU_FREE(searchSpc->controlResourceSetId,
- sizeof(ControlResourceSetId_t));
- }
- }
- for(idx1 = 0; idx1 < searchSpcList->list.count; idx1++)
- {
- DU_FREE(searchSpcList->list.array[idx1],
- sizeof(struct SearchSpace));
- }
- DU_FREE(searchSpcList->list.array,searchSpcList->list.size);
+ DU_LOG("\nERROR --> DU APP : Memory Allocation failed for medium bit map buffer in BuildSsbPosInBurst()");
+ return RFAILED;
+ }
+
+ if((fillBitString(&ssbPosInBurst->choice.mediumBitmap, 0, bitStringSizeInBytes, \
+ duCfgParam.sib1Params.srvCellCfgCommSib.ssbPosInBurst)) != ROK)
+ {
+ DU_LOG("\nERROR --> DU APP : Failed to fill medium bit map in BuildSsbPosInBurst()");
+ return RFAILED;
}
+
+ return ROK;
}
+
/*******************************************************************
*
- * @brief Frees memory allocated for PdschTimeDomAllocList
+ * @brief Fills SP cell config common in Reconfig with Sync
*
* @details
*
- * Function : FreePdschTimeDomAllocList
+ * Function : BuildSpCellConfigCommon
*
- * Functionality: Deallocating memory of PdschTimeDomAllocList
+ * Functionality: Fills SP cell config common in Reconfig with Sync
*
- * @params[in] struct PDSCH_Config__pdsch_TimeDomainAllocationList *timeDomAllocList
+ * @params[in] Pointer to ServingCellConfigCommon_t
*
- * @return void
+ * @return ROK - success
+ * RFAILED - failure
*
* ****************************************************************/
-void FreePdschTimeDomAllocList( struct PDSCH_Config__pdsch_TimeDomainAllocationList *timeDomAllocList)
+uint8_t BuildSpCellConfigCommon(ServingCellConfigCommon_t *spCellConfigCommon)
+{
+ /* Physical Cell Identity */
+ DU_ALLOC(spCellConfigCommon->physCellId, sizeof(PhysCellId_t));
+ if(!spCellConfigCommon->physCellId)
+ {
+ DU_LOG("\nERROR --> DU APP : Failed to allocate memory for physical cell id in BuildSpCellConfigCommon()");
+ return RFAILED;
+ }
+ *(spCellConfigCommon->physCellId) = NR_PCI;
+
+ /* Downlink Config Common */
+ DU_ALLOC(spCellConfigCommon->downlinkConfigCommon, sizeof(DownlinkConfigCommon_t));
+ if(!spCellConfigCommon->downlinkConfigCommon)
+ {
+ DU_LOG("\nERROR --> DU APP : Failed to allocate memory for DL Config Common in BuildSpCellConfigCommon()");
+ return RFAILED;
+ }
+ if((BuildDlConfigCommon(spCellConfigCommon->downlinkConfigCommon)) != ROK)
+ {
+ DU_LOG("\nERROR --> DU APP : Failed to fill DL config commin in BuildSpCellConfigCommon()");
+ return RFAILED;
+ }
+
+ /* Uplinlink Config Common */
+ DU_ALLOC(spCellConfigCommon->uplinkConfigCommon, sizeof(UplinkConfigCommon_t));
+ if(!spCellConfigCommon->uplinkConfigCommon)
+ {
+ DU_LOG("\nERROR --> DU APP : Failed to allocate memory for UL Config Common in BuildSpCellConfigCommon()");
+ return RFAILED;
+ }
+ if((BuildUlConfigCommon(spCellConfigCommon->uplinkConfigCommon)) != ROK)
+ {
+ DU_LOG("\nERROR --> DU APP : Failed to fill UL config commin in BuildSpCellConfigCommon()");
+ return RFAILED;
+ }
+
+ /* Timing Advance offset */
+ DU_ALLOC(spCellConfigCommon->n_TimingAdvanceOffset, sizeof(long));
+ if(!spCellConfigCommon->n_TimingAdvanceOffset)
+ {
+ DU_LOG("\nERROR --> DU APP : Failed to allocate memory for Timing Advance Offset in BuildSpCellConfigCommon()");
+ return RFAILED;
+ }
+ *(spCellConfigCommon->n_TimingAdvanceOffset) = ServingCellConfigCommon__n_TimingAdvanceOffset_n0;
+
+ /* SSB Position In Burst */
+ DU_ALLOC(spCellConfigCommon->ssb_PositionsInBurst, sizeof(struct ServingCellConfigCommon__ssb_PositionsInBurst));
+ if(!spCellConfigCommon->ssb_PositionsInBurst)
+ {
+ DU_LOG("\nERROR --> DU APP : Failed to allocate memory for SSB Position In Burst in BuildSpCellConfigCommon()");
+ return RFAILED;
+ }
+ if((BuildSsbPosInBurst(spCellConfigCommon->ssb_PositionsInBurst)) != ROK)
+ {
+ DU_LOG("\nERROR --> DU APP : Failed to fill SSB Position In Burst in BuildSpCellConfigCommon()");
+ return RFAILED;
+ }
+
+ /* SSB Periodicity in Serving cell */
+ DU_ALLOC(spCellConfigCommon->ssb_periodicityServingCell, sizeof(long));
+ if(!spCellConfigCommon->ssb_periodicityServingCell)
+ {
+ DU_LOG("\nERROR --> DU APP : Failed to allocate memory for SSB Periodicity serving cell in \
+ BuildSpCellConfigCommon()");
+ return RFAILED;
+ }
+ *(spCellConfigCommon->ssb_periodicityServingCell) = \
+ convertSsbPeriodicityValueToEnum(duCfgParam.sib1Params.srvCellCfgCommSib.ssbPrdServingCell);
+
+ /* DMRS Type A position */
+ spCellConfigCommon->dmrs_TypeA_Position = convertDmrsTypeAPosValueToEnum(duCfgParam.macCellCfg.dmrsTypeAPos);
+
+ /* SSB subcarrier spacing */
+ DU_ALLOC(spCellConfigCommon->ssbSubcarrierSpacing, sizeof(SubcarrierSpacing_t));
+ if(!spCellConfigCommon->ssbSubcarrierSpacing)
+ {
+ DU_LOG("\nERROR --> DU APP : Failed to allocate memory for sub-carrier spacing in BuildSpCellConfigCommon()");
+ return RFAILED;
+ }
+ *(spCellConfigCommon->ssbSubcarrierSpacing) = duCfgParam.sib1Params.srvCellCfgCommSib.scs;
+
+ /* TDD UL-DL configuration common */
+ DU_ALLOC(spCellConfigCommon->tdd_UL_DL_ConfigurationCommon, sizeof(TDD_UL_DL_ConfigCommon_t));
+ if(!spCellConfigCommon->tdd_UL_DL_ConfigurationCommon)
+ {
+ DU_LOG("\nERROR --> DU APP : Memory allocation failed for TDD UL-DL config common in BuildSpCellConfigCommon()");
+ return RFAILED;
+ }
+ if((BuildTddUlDlCfgComm(spCellConfigCommon->tdd_UL_DL_ConfigurationCommon)) != ROK)
+ {
+ DU_LOG("\nERROR --> DU APP : Failed to fill TDD UL-DL config common in BuildSpCellConfigCommon()");
+ return RFAILED;
+ }
+
+ /* SS PBCH Block Power */
+ spCellConfigCommon->ss_PBCH_BlockPower = duCfgParam.sib1Params.srvCellCfgCommSib.ssPbchBlockPwr;
+
+ return ROK;
+}
+
+/*******************************************************************
+ *
+ * @brief Fills dedicated RACH configuration in Reconfiguration with sync
+ *
+ * @details
+ *
+ * Function : BuildRecfgWithSync
+ *
+ * Functionality:
+ * Fills dedicated RACH configuration in Reconfiguration with sync
+ *
+ * @params[in] DU UE CB
+ * Pointer to Rach config dedicated struct
+ *
+ * @return ROK - success
+ * RFAILED - failure
+ *
+ * ****************************************************************/
+uint8_t BuildRachConfigDedicated(DuUeCb *ueCb, struct ReconfigurationWithSync__rach_ConfigDedicated *rachCfgDed)
+{
+ uint8_t elementCnt = 0, listIdx = 0;
+ CFRA_t *cfra = NULLP;
+ struct CFRA__resources__ssb *ssbResource = NULLP;
+ RachCfgCommon duRachCfg = duCfgParam.sib1Params.srvCellCfgCommSib.ulCfg.rachCfg;
+
+ rachCfgDed->present = ReconfigurationWithSync__rach_ConfigDedicated_PR_uplink;
+
+ /* Uplink */
+ DU_ALLOC(rachCfgDed->choice.uplink, sizeof(RACH_ConfigDedicated_t));
+ if(!rachCfgDed->choice.uplink)
+ {
+ DU_LOG("\nERROR --> DU APP : Memory allocation failed for RACH uplink configuration in BuildRachConfigDedicated()");
+ return RFAILED;
+ }
+
+ /* CFRA : Contention free Random Access */
+ DU_ALLOC(rachCfgDed->choice.uplink->cfra, sizeof(CFRA_t));
+ if(!rachCfgDed->choice.uplink->cfra)
+ {
+ DU_LOG("\nERROR --> DU APP : Memory allocation failed for CFRA in BuildRachConfigDedicated()");
+ return RFAILED;
+ }
+ cfra = rachCfgDed->choice.uplink->cfra;
+
+ /* CFRA occassions */
+ DU_ALLOC(cfra->occasions, sizeof(struct CFRA__occasions));
+ if(!cfra->occasions)
+ {
+ DU_LOG("\nERROR --> DU APP : Memory allocation failed for CFRA occassion in BuildRachConfigDedicated()");
+ return RFAILED;
+ }
+
+ /* CFRA occassions : RACH generic configuration */
+ cfra->occasions->rach_ConfigGeneric.prach_ConfigurationIndex = duRachCfg.prachCfgIdx;
+ cfra->occasions->rach_ConfigGeneric.msg1_FDM = duRachCfg.msg1Fdm;
+ cfra->occasions->rach_ConfigGeneric.msg1_FrequencyStart = duRachCfg.msg1FreqStart;
+ cfra->occasions->rach_ConfigGeneric.zeroCorrelationZoneConfig = duRachCfg.zeroCorrZoneCfg;
+ cfra->occasions->rach_ConfigGeneric.preambleReceivedTargetPower = duRachCfg.preambleRcvdTgtPwr;
+ cfra->occasions->rach_ConfigGeneric.preambleTransMax = duRachCfg.preambleTransMax;
+ cfra->occasions->rach_ConfigGeneric.powerRampingStep = duRachCfg.pwrRampingStep;
+ cfra->occasions->rach_ConfigGeneric.ra_ResponseWindow = duRachCfg.raRspWindow;
+
+ /* CFRA occassions : SSB per RACH occasion */
+ DU_ALLOC(cfra->occasions->ssb_perRACH_Occasion, sizeof(long));
+ if(!cfra->occasions->ssb_perRACH_Occasion)
+ {
+ DU_LOG("\nERROR --> DU APP : Memory allocation failed for SSB per RACH occassion in BuildRachConfigDedicated()");
+ return RFAILED;
+ }
+ *(cfra->occasions->ssb_perRACH_Occasion) = convertCFRASsbPerRachOccasionValueToEnum(duCfgParam.macCellCfg.prachCfg.ssbPerRach);
+
+ /* CFRA resource */
+ cfra->resources.present = CFRA__resources_PR_ssb;
+
+ /* CFRA resource : SSB */
+ DU_ALLOC(cfra->resources.choice.ssb, sizeof(struct CFRA__resources__ssb));
+ if(!cfra->resources.choice.ssb)
+ {
+ DU_LOG("\nERROR --> DU APP : Memory allocation failed for CFRA resource - SSB in BuildRachConfigDedicated()");
+ return RFAILED;
+ }
+ ssbResource = cfra->resources.choice.ssb;
+
+ /* CFRA SSB resource list */
+ elementCnt = ueCb->cfraResource.numSsb;
+ ssbResource->ssb_ResourceList.list.count = elementCnt;
+ ssbResource->ssb_ResourceList.list.size = elementCnt * sizeof(CFRA_SSB_Resource_t *);
+
+ DU_ALLOC(ssbResource->ssb_ResourceList.list.array, ssbResource->ssb_ResourceList.list.size);
+ if(!ssbResource->ssb_ResourceList.list.array)
+ {
+ DU_LOG("\nERROR --> DU APP : Memory allocation failed for SSB resource list in BuildRachConfigDedicated()");
+ return RFAILED;
+ }
+
+ for(listIdx = 0; listIdx < elementCnt; listIdx++)
+ {
+ DU_ALLOC(ssbResource->ssb_ResourceList.list.array[listIdx], sizeof(CFRA_SSB_Resource_t));
+ if(!ssbResource->ssb_ResourceList.list.array[listIdx])
+ {
+ DU_LOG("\nERROR --> DU APP : Memory allocation failed for SSB resource list element in BuildRachConfigDedicated()");
+ return RFAILED;
+ }
+ ssbResource->ssb_ResourceList.list.array[listIdx]->ssb = ueCb->cfraResource.ssbResource[listIdx].ssbIdx;
+ ssbResource->ssb_ResourceList.list.array[listIdx]->ra_PreambleIndex = ueCb->cfraResource.ssbResource[listIdx].raPreambleIdx;
+ }
+
+ return ROK;
+}
+
+/*******************************************************************
+ *
+ * @brief Fills reconfiguration with sync in SP cell config
+ *
+ * @details
+ *
+ * Function : BuildRecfgWithSync
+ *
+ * Functionality: Fills reconfiguration with sync in SP cell config
+ *
+ * @params[in] DU UE CB
+ * Pointer to ReconfigurationWithSync_t
+ *
+ * @return ROK - success
+ * RFAILED - failure
+ *
+ * ****************************************************************/
+uint8_t BuildRecfgWithSync(DuUeCb *ueCb, ReconfigurationWithSync_t *recfgWithSync)
+{
+ /* SP Cell Config Common */
+ DU_ALLOC(recfgWithSync->spCellConfigCommon, sizeof(ServingCellConfigCommon_t));
+ if(!recfgWithSync->spCellConfigCommon)
+ {
+ DU_LOG("\nERROR --> DU APP : Failed to allocate memory for spCellConfigCommon in BuildRecfgWithSync()");
+ return RFAILED;
+ }
+
+ if((BuildSpCellConfigCommon(recfgWithSync->spCellConfigCommon)) != ROK)
+ {
+ DU_LOG("\nERROR --> DU APP : Failed to build SpCellConfigCommon in BuildRecfgWithSync()");
+ return RFAILED;
+ }
+
+ /* New UE Identity */
+ recfgWithSync->newUE_Identity = ueCb->crnti;
+
+ /* T304 timer */
+ recfgWithSync->t304 = ReconfigurationWithSync__t304_ms1000;
+
+ /* RACH configuration dedicated */
+ DU_ALLOC(recfgWithSync->rach_ConfigDedicated, sizeof(struct ReconfigurationWithSync__rach_ConfigDedicated));
+ if(!recfgWithSync->rach_ConfigDedicated)
+ {
+ DU_LOG("\nERROR --> DU APP : Failed to allocate memory for RACH config dedicated in BuildRecfgWithSync()");
+ return RFAILED;
+ }
+
+ if((BuildRachConfigDedicated(ueCb, recfgWithSync->rach_ConfigDedicated)) != ROK)
+ {
+ DU_LOG("\nERROR --> DU APP : Failed to build RACH config dedicated in BuildRecfgWithSync()");
+ return RFAILED;
+ }
+
+ return ROK;
+}
+
+/*******************************************************************
+ *
+ * @brief Builds Spcell config
+ *
+ * @details
+ *
+ * Function : BuildSpCellCfg
+ *
+ * Functionality: Builds sp cell config in DuToCuRrcContainer
+ *
+ * @params[in] SpCellConfig_t spCellCfg
+ *
+ * @return ROK - success
+ * RFAILED - failure
+ *
+ * ****************************************************************/
+uint8_t BuildSpCellCfg(DuUeCb *ueCb, SpCellConfig_t *spCellCfg)
+{
+ spCellCfg->servCellIndex = NULLP;
+ DU_ALLOC(spCellCfg->servCellIndex, sizeof(long));
+ if(!spCellCfg->servCellIndex)
+ {
+ DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildSpCellCfg");
+ return RFAILED;
+ }
+
+ if(ueCb == NULLP)
+ *(spCellCfg->servCellIndex) = SERV_CELL_IDX;
+ else
+ *(spCellCfg->servCellIndex) = ueCb->macUeCfg.spCellCfg.servCellIdx;
+
+ spCellCfg->reconfigurationWithSync = NULLP;
+ if(ueCb && (ueCb->ueState == UE_HANDIN_IN_PROGRESS))
+ {
+ DU_ALLOC(spCellCfg->reconfigurationWithSync, sizeof(ReconfigurationWithSync_t));
+ if(!spCellCfg->reconfigurationWithSync)
+ {
+ DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildSpCellCfg");
+ return RFAILED;
+ }
+
+ if((BuildRecfgWithSync(ueCb, spCellCfg->reconfigurationWithSync)) != ROK)
+ {
+ DU_LOG("\nERROR --> F1AP : Building of reconfiguration with sync failed at BuildSpCellCfg");
+ return RFAILED;
+ }
+ }
+
+ spCellCfg->rlf_TimersAndConstants = NULLP;
+ spCellCfg->rlmInSyncOutOfSyncThreshold = NULLP;
+
+ DU_ALLOC(spCellCfg->rlmInSyncOutOfSyncThreshold, sizeof(long));
+ if(!spCellCfg->rlmInSyncOutOfSyncThreshold)
+ {
+ DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildSpCellCfg");
+ return RFAILED;
+ }
+ *(spCellCfg->rlmInSyncOutOfSyncThreshold) = RLM_SYNC_OUT_SYNC_THRESHOLD;
+
+ spCellCfg->spCellConfigDedicated = NULLP;
+ DU_ALLOC(spCellCfg->spCellConfigDedicated, sizeof(ServingCellConfig_t));
+ if(!spCellCfg->spCellConfigDedicated)
+ {
+ DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildSpCellCfg");
+ return RFAILED;
+ }
+ if(BuildSpCellCfgDed(ueCb, spCellCfg->spCellConfigDedicated) != ROK)
+ {
+ DU_LOG("\nERROR --> F1AP : BuildSpCellCfgDed failed");
+ return RFAILED;
+ }
+
+ return ROK;
+}
+
+/*******************************************************************
+ *
+ * @brief Builds Phy cell group config
+ *
+ * @details
+ *
+ * Function : BuildPhyCellGrpCfg
+ *
+ * Functionality: Builds Phy cell group config in DuToCuRrcContainer
+ *
+ * @params[in] PhysicalCellGroupConfig_t *phyCellGrpCfg
+ *
+ * @return ROK - success
+ * RFAILED - failure
+ *
+ * ****************************************************************/
+uint8_t BuildPhyCellGrpCfg(DuUeCb *ueCb, PhysicalCellGroupConfig_t *phyCellGrpCfg)
+{
+ phyCellGrpCfg->harq_ACK_SpatialBundlingPUCCH = NULLP;
+ phyCellGrpCfg->harq_ACK_SpatialBundlingPUSCH = NULLP;
+
+ phyCellGrpCfg->p_NR_FR1 = NULLP;
+ DU_ALLOC(phyCellGrpCfg->p_NR_FR1, sizeof(long));
+ if(!phyCellGrpCfg->p_NR_FR1)
+ {
+ DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildPhyCellGrpCfg");
+ return RFAILED;
+ }
+
+ if(ueCb == NULLP)
+ {
+ *(phyCellGrpCfg->p_NR_FR1) = P_NR_FR1;
+ phyCellGrpCfg->pdsch_HARQ_ACK_Codebook = PDSCH_HARQ_ACK_CODEBOOK;
+ }
+ else
+ {
+ *(phyCellGrpCfg->p_NR_FR1) = ueCb->macUeCfg.phyCellGrpCfg.pNrFr1;
+ phyCellGrpCfg->pdsch_HARQ_ACK_Codebook = ueCb->macUeCfg.phyCellGrpCfg.pdschHarqAckCodebook;
+ }
+
+ phyCellGrpCfg->tpc_SRS_RNTI = NULLP;
+ phyCellGrpCfg->tpc_PUCCH_RNTI = NULLP;
+ phyCellGrpCfg->tpc_PUSCH_RNTI = NULLP;
+ phyCellGrpCfg->sp_CSI_RNTI = NULLP;
+ phyCellGrpCfg->cs_RNTI = NULLP;
+ phyCellGrpCfg->ext1 = NULLP;
+ phyCellGrpCfg->ext2 = NULLP;
+
+ return ROK;
+}
+
+/*******************************************************************
+ *
+ * @brief Builds Mac cell group config
+ *
+ * @details
+ *
+ * Function : BuildMacCellGrpCfg
+ *
+ * Functionality: Builds Mac cell group config in DuToCuRrcContainer
+ *
+ * @params[in] MAC_CellGroupConfig_t *macCellGrpCfg
+ *
+ * @return ROK - success
+ * RFAILED - failure
+ *
+ * ****************************************************************/
+uint8_t BuildMacCellGrpCfg(DuUeCb *ueCb, MAC_CellGroupConfig_t *macCellGrpCfg)
+{
+ macCellGrpCfg->drx_Config = NULLP;
+ macCellGrpCfg->schedulingRequestConfig = NULLP;
+ DU_ALLOC(macCellGrpCfg->schedulingRequestConfig, sizeof(struct SchedulingRequestConfig));
+ if(!macCellGrpCfg->schedulingRequestConfig)
+ {
+ DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildMacCellGrpCfg");
+ return RFAILED;
+ }
+
+ if(BuildSchedulingReqConfig(ueCb, macCellGrpCfg->schedulingRequestConfig) != ROK)
+ {
+ DU_LOG("\nERROR --> F1AP : BuildSchedulingReqConfig failed");
+ return RFAILED;
+ }
+
+ macCellGrpCfg->bsr_Config = NULLP;
+ DU_ALLOC(macCellGrpCfg->bsr_Config, sizeof(struct BSR_Config));
+ if(!macCellGrpCfg->bsr_Config)
+ {
+ DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildMacCellGrpCfg");
+ return RFAILED;
+ }
+
+ if(BuildBsrConfig(ueCb, macCellGrpCfg->bsr_Config) != ROK)
+ {
+ DU_LOG("\nERROR --> F1AP : BuildBsrConfig failed");
+ return RFAILED;
+ }
+
+ macCellGrpCfg->tag_Config = NULLP;
+ DU_ALLOC(macCellGrpCfg->tag_Config, sizeof(struct TAG_Config));
+ if(!macCellGrpCfg->tag_Config)
+ {
+ DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildMacCellGrpCfg");
+ return RFAILED;
+ }
+
+ if(BuildTagConfig(ueCb, macCellGrpCfg->tag_Config) != ROK)
+ {
+ DU_LOG("\nERROR --> F1AP : BuildTagConfig failed");
+ return RFAILED;
+ }
+
+ macCellGrpCfg->phr_Config = NULLP;
+ DU_ALLOC(macCellGrpCfg->phr_Config, sizeof(struct MAC_CellGroupConfig__phr_Config));
+ if(!macCellGrpCfg->phr_Config)
+ {
+ DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildMacCellGrpCfg");
+ return RFAILED;
+ }
+
+ if(BuildPhrConfig(ueCb, macCellGrpCfg->phr_Config) != ROK)
+ {
+ DU_LOG("\nERROR --> F1AP : BuildPhrConfig failed");
+ return RFAILED;
+ }
+
+ macCellGrpCfg->skipUplinkTxDynamic = false;
+ macCellGrpCfg->ext1 = NULLP;
+
+ return ROK;
+}
+/*******************************************************************
+ *
+ * @brief Frees memeory allocated for SearchSpcToAddModList
+ *
+ * @details
+ *
+ * Function : FreeSearchSpcToAddModList
+ *
+ * Functionality: Deallocating memory of SearchSpcToAddModList
+ *
+ * @params[in] struct PDCCH_Config__searchSpacesToAddModList *searchSpcList
+ *
+ * @return void
+ *
+ 4221 * ****************************************************************/
+void FreeSearchSpcToAddModList(struct PDCCH_Config__searchSpacesToAddModList *searchSpcList)
+{
+ uint8_t idx1=0;
+ uint8_t idx2=0;
+ struct SearchSpace *searchSpc=NULLP;
+
+ if(searchSpcList->list.array)
+ {
+ if(searchSpcList->list.array[idx2])
+ {
+ searchSpc = searchSpcList->list.array[idx2];
+ if(searchSpc->controlResourceSetId)
+ {
+ if(searchSpc->monitoringSlotPeriodicityAndOffset)
+ {
+ if(searchSpc->monitoringSymbolsWithinSlot)
+ {
+ if(searchSpc->monitoringSymbolsWithinSlot->buf)
+ {
+ if(searchSpc->nrofCandidates)
+ {
+ if(searchSpc->searchSpaceType)
+ {
+ DU_FREE(searchSpc->searchSpaceType->choice.ue_Specific,\
+ sizeof(struct SearchSpace__searchSpaceType__ue_Specific));
+ DU_FREE(searchSpc->searchSpaceType, sizeof(struct
+ SearchSpace__searchSpaceType));
+ }
+ DU_FREE(searchSpc->nrofCandidates,
+ sizeof(struct SearchSpace__nrofCandidates));
+ }
+ DU_FREE(searchSpc->monitoringSymbolsWithinSlot->buf, \
+ searchSpc->monitoringSymbolsWithinSlot->size);
+ }
+ DU_FREE(searchSpc->monitoringSymbolsWithinSlot,
+ sizeof(BIT_STRING_t));
+ }
+ DU_FREE(searchSpc->monitoringSlotPeriodicityAndOffset, \
+ sizeof(struct SearchSpace__monitoringSlotPeriodicityAndOffset));
+ }
+ DU_FREE(searchSpc->controlResourceSetId,
+ sizeof(ControlResourceSetId_t));
+ }
+ }
+ for(idx1 = 0; idx1 < searchSpcList->list.count; idx1++)
+ {
+ DU_FREE(searchSpcList->list.array[idx1],
+ sizeof(struct SearchSpace));
+ }
+ DU_FREE(searchSpcList->list.array,searchSpcList->list.size);
+ }
+}
+/*******************************************************************
+ *
+ * @brief Frees memory allocated for PdschTimeDomAllocList
+ *
+ * @details
+ *
+ * Function : FreePdschTimeDomAllocList
+ *
+ * Functionality: Deallocating memory of PdschTimeDomAllocList
+ *
+ * @params[in] struct PDSCH_Config__pdsch_TimeDomainAllocationList *timeDomAllocList
+ *
+ * @return void
+ *
+ * ****************************************************************/
+void FreePdschTimeDomAllocList( struct PDSCH_Config__pdsch_TimeDomainAllocationList *timeDomAllocList)
{
uint8_t idx1=0;
}
}
+/*******************************************************************
+ *
+ * @brief Free SCS specific carrier list in DL frequency info
+ *
+ * @details
+ *
+ * Function : FreeScsSpecificCarrierListDl
+ *
+ * Functionality: Free SCS specific carrier list in DL frequency info
+ *
+ * @params[in] Pointer to struct FrequencyInfoDL__scs_SpecificCarrierList
+ *
+ * @return void
+ *
+ * ****************************************************************/
+void FreeScsSpecificCarrierListDl(struct FrequencyInfoDL__scs_SpecificCarrierList *scsCarrierList)
+{
+ uint8_t listIdx = 0;
+
+ if(!scsCarrierList->list.array)
+ {
+ for(listIdx = 0; listIdx < scsCarrierList->list.count; listIdx++)
+ {
+ DU_FREE(scsCarrierList->list.array[listIdx], sizeof(SCS_SpecificCarrier_t));
+ }
+ DU_FREE(scsCarrierList->list.array, scsCarrierList->list.size);
+ }
+}
+
+/*******************************************************************
+ *
+ * @brief Free DL frequency info in DL config common
+ *
+ * @details
+ *
+ * Function : FreeFreqInfoDl
+ *
+ * Functionality: Free DL frequency info in DL config common
+ *
+ * @params[in] Pointer to DownlinkConfigCommon_t
+ *
+ * @return void
+ *
+ * ****************************************************************/
+void FreeFreqInfoDl(FrequencyInfoDL_t *frequencyInfoDL)
+{
+ uint8_t freqBandIdx = 0;
+
+ /* SSB Absolute Frequency */
+ DU_FREE(frequencyInfoDL->absoluteFrequencySSB, sizeof(ARFCN_ValueNR_t));
+
+ /* NR Multi Frequency Band List */
+ if(frequencyInfoDL->frequencyBandList.list.array)
+ {
+ for(freqBandIdx = 0; freqBandIdx < frequencyInfoDL->frequencyBandList.list.count; freqBandIdx++)
+ {
+ DU_FREE(frequencyInfoDL->frequencyBandList.list.array[freqBandIdx], sizeof(FreqBandIndicatorNR_t));
+ }
+ DU_FREE(frequencyInfoDL->frequencyBandList.list.array, frequencyInfoDL->frequencyBandList.list.size);
+ }
+
+ /* Subcarrier Spacing specifc carrier List */
+ FreeScsSpecificCarrierListDl(&frequencyInfoDL->scs_SpecificCarrierList);
+}
+
+/*******************************************************************
+ *
+ * @brief Free DL config common in Serving cell config common
+ *
+ * @details
+ *
+ * Function : FreeDlConfigCommon
+ *
+ * Functionality: Free DL config common in Serving cell config common
+ *
+ * @params[in] Pointer to DownlinkConfigCommon_t
+ *
+ * @return void
+ *
+ * ****************************************************************/
+void FreeDlConfigCommon(DownlinkConfigCommon_t *dlCfgCommon)
+{
+ /* DL Frequency Info */
+ if(dlCfgCommon->frequencyInfoDL)
+ {
+ FreeFreqInfoDl(dlCfgCommon->frequencyInfoDL);
+ DU_FREE(dlCfgCommon->frequencyInfoDL, sizeof(FrequencyInfoDL_t));
+ }
+
+ /* DL BWP config common */
+ if(dlCfgCommon->initialDownlinkBWP)
+ {
+ FreeBwpDlCommon(dlCfgCommon->initialDownlinkBWP);
+ DU_FREE(dlCfgCommon->initialDownlinkBWP, sizeof(BWP_DownlinkCommon_t));
+ }
+}
+
+/*******************************************************************
+ *
+ * @brief Free SCS specific carrier list in UL frequency Info
+ *
+ * @details
+ *
+ * Function : FreeScsSpecificCarrierListUl
+ *
+ * Functionality: Free SCS specific carrier list in UL frequency Info
+ *
+ * @params[in] Pointer to struct FrequencyInfoUL__scs_SpecificCarrierList
+ *
+ * @return void
+ *
+ * ****************************************************************/
+void FreeScsSpecificCarrierListUl(struct FrequencyInfoUL__scs_SpecificCarrierList *scsCarrierList)
+{
+ uint8_t listIdx = 0;
+
+ if(scsCarrierList->list.array)
+ {
+ for(listIdx = 0; listIdx < scsCarrierList->list.count; listIdx++)
+ {
+ DU_FREE(scsCarrierList->list.array[listIdx], sizeof(SCS_SpecificCarrier_t));
+ }
+ DU_FREE(scsCarrierList->list.array, scsCarrierList->list.size);
+ }
+}
+
+/*******************************************************************
+ *
+ * @brief Free frequency info in UL config common
+ *
+ * @details
+ *
+ * Function : FreeFreqInfoUl
+ *
+ * Functionality: Free frequency info in UL config common
+ *
+ * @params[in] Pointer to FrequencyInfoUL_t
+ *
+ * @return void
+ *
+ * ****************************************************************/
+void FreeFreqInfoUl(FrequencyInfoUL_t *frequencyInfoUL)
+{
+ uint8_t listIdx= 0;
+
+ /* NR Multi Frequency Band List */
+ if(!frequencyInfoUL->frequencyBandList)
+ {
+ if(frequencyInfoUL->frequencyBandList->list.array)
+ {
+ for(listIdx = 0; listIdx < frequencyInfoUL->frequencyBandList->list.count; listIdx++)
+ {
+ DU_FREE(frequencyInfoUL->frequencyBandList->list.array[listIdx], sizeof(FreqBandIndicatorNR_t));
+ }
+ DU_FREE(frequencyInfoUL->frequencyBandList->list.array, frequencyInfoUL->frequencyBandList->list.size);
+ }
+ DU_FREE(frequencyInfoUL->frequencyBandList, sizeof(MultiFrequencyBandListNR_t));
+ }
+
+ /* Absolute frequency point A */
+ DU_FREE(frequencyInfoUL->absoluteFrequencyPointA, sizeof(ARFCN_ValueNR_t));
+
+ /* Subcarrier Spacing specifc carrier */
+ FreeScsSpecificCarrierListUl(&frequencyInfoUL->scs_SpecificCarrierList);
+
+ /* P-MAX */
+ DU_FREE(frequencyInfoUL->p_Max, sizeof(P_Max_t));
+}
+
+/*******************************************************************
+ *
+ * @brief Free UL config common in Serving cell config common
+ *
+ * @details
+ *
+ * Function : FreeUlConfigCommon
+ *
+ * Functionality: Free UL config common in Serving cell config common
+ *
+ * @params[in] Pointer to UplinkConfigCommon_t
+ *
+ * @return void
+ *
+ * ****************************************************************/
+void FreeUlConfigCommon(UplinkConfigCommon_t *ulCfgCommon)
+{
+ /* UL Frequency Info */
+ if(ulCfgCommon->frequencyInfoUL)
+ {
+ FreeFreqInfoUl(ulCfgCommon->frequencyInfoUL);
+ DU_FREE(ulCfgCommon->frequencyInfoUL, sizeof(FrequencyInfoUL_t));
+ }
+
+ /* UL BWP common */
+ if(ulCfgCommon->initialUplinkBWP)
+ {
+ FreeBwpUlCommon(ulCfgCommon->initialUplinkBWP);
+ DU_FREE(ulCfgCommon->initialUplinkBWP, sizeof(BWP_UplinkCommon_t));
+ }
+}
+
+/*******************************************************************
+ *
+ * @brief Free SP cell config common in Reconfig with Sync
+ *
+ * @details
+ *
+ * Function : FreeSpCellConfigCommon
+ *
+ * Functionality: Free SP cell config common in Reconfig with Sync
+ *
+ * @params[in] Pointer to ServingCellConfigCommon_t
+ *
+ * @return void
+ *
+ * ****************************************************************/
+void FreeSpCellConfigCommon(ServingCellConfigCommon_t *spCellConfigCommon)
+{
+ /* Free Physical cell identity */
+ DU_FREE(spCellConfigCommon->physCellId, sizeof(PhysCellId_t));
+
+ /* Free Downlink Config common */
+ if(spCellConfigCommon->downlinkConfigCommon)
+ {
+ FreeDlConfigCommon(spCellConfigCommon->downlinkConfigCommon);
+ DU_FREE(spCellConfigCommon->downlinkConfigCommon, sizeof(DownlinkConfigCommon_t));
+ }
+
+ /* Free Uplink Config common */
+ if(spCellConfigCommon->uplinkConfigCommon)
+ {
+ FreeUlConfigCommon(spCellConfigCommon->uplinkConfigCommon);
+ DU_FREE(spCellConfigCommon->uplinkConfigCommon, sizeof(UplinkConfigCommon_t));
+ }
+
+ /* Free Timing Advance offset */
+ DU_FREE(spCellConfigCommon->n_TimingAdvanceOffset, sizeof(long));
+
+ /* Free SSB Position in Burst */
+ if(spCellConfigCommon->ssb_PositionsInBurst)
+ {
+ DU_FREE(spCellConfigCommon->ssb_PositionsInBurst->choice.mediumBitmap.buf, \
+ spCellConfigCommon->ssb_PositionsInBurst->choice.mediumBitmap.size);
+ DU_FREE(spCellConfigCommon->ssb_PositionsInBurst, sizeof(struct ServingCellConfigCommon__ssb_PositionsInBurst));
+ }
+
+ /* Free SSB Periodicity in Serving cell */
+ DU_FREE(spCellConfigCommon->ssb_periodicityServingCell, sizeof(long));
+
+ /* Free SSB subcarrier spacing */
+ DU_FREE(spCellConfigCommon->ssbSubcarrierSpacing, sizeof(SubcarrierSpacing_t));
+
+ /* TDD UL-DL configuration common */
+ DU_FREE(spCellConfigCommon->tdd_UL_DL_ConfigurationCommon, sizeof(TDD_UL_DL_ConfigCommon_t));
+}
+
+/*******************************************************************
+ *
+ * @brief Free dedicated RACH configuration in Reconfiguration with sync
+ *
+ * @details
+ *
+ * Function : FreeRecfgWithSync
+ *
+ * Functionality:
+ * Free dedicated RACH configuration in Reconfiguration with sync
+ *
+ * @params[in] Pinter to Rach config dedicated struct
+ *
+ * @return void
+ *
+ * ****************************************************************/
+void FreeRachConfigDedicated(struct ReconfigurationWithSync__rach_ConfigDedicated *rachCfgDed)
+{
+ uint8_t listIdx = 0;
+ CFRA_t *cfra = NULLP;
+ struct CFRA__resources__ssb *ssbResource = NULLP;
+
+ /* Uplink */
+ if(rachCfgDed->choice.uplink)
+ {
+ /* CFRA : Contention free Random Access */
+ if(rachCfgDed->choice.uplink->cfra)
+ {
+ cfra = rachCfgDed->choice.uplink->cfra;
+
+ /* CFRA occassions */
+ if(cfra->occasions)
+ {
+ /* CFRA occassions : SSB per RACH occasion */
+ DU_FREE(cfra->occasions->ssb_perRACH_Occasion, sizeof(long));
+ DU_FREE(cfra->occasions, sizeof(struct CFRA__occasions));
+ }
+
+ /* CFRA resource */
+ cfra->resources.present = CFRA__resources_PR_ssb;
+
+ /* CFRA resource : SSB */
+ if(cfra->resources.choice.ssb)
+ {
+ ssbResource = cfra->resources.choice.ssb;
+
+ /* CFRA SSB resource list */
+ if(ssbResource->ssb_ResourceList.list.array)
+ {
+ for(listIdx = 0; listIdx < ssbResource->ssb_ResourceList.list.count; listIdx++)
+ {
+ DU_FREE(ssbResource->ssb_ResourceList.list.array[listIdx], sizeof(CFRA_SSB_Resource_t));
+ }
+ DU_FREE(ssbResource->ssb_ResourceList.list.array, ssbResource->ssb_ResourceList.list.size);
+ }
+ DU_FREE(cfra->resources.choice.ssb, sizeof(struct CFRA__resources__ssb));
+ }
+ DU_FREE(rachCfgDed->choice.uplink->cfra, sizeof(CFRA_t));
+ }
+ DU_FREE(rachCfgDed->choice.uplink, sizeof(RACH_ConfigDedicated_t));
+ }
+}
+
+/*******************************************************************
+ *
+ * @brief Frees reconfiguration with sync in SP cell config
+ *
+ * @details
+ *
+ * Function : FreeRecfgWithSync
+ *
+ * Functionality: Fress reconfiguration with sync in SP cell config
+ *
+ * @params[in] Pointer to ReconfigurationWithSync_t
+ *
+ * @return void
+ *
+ * ****************************************************************/
+void FreeRecfgWithSync(ReconfigurationWithSync_t *recfgWithSync)
+{
+ /* Free SP Cell config common */
+ if(recfgWithSync->spCellConfigCommon)
+ {
+ FreeSpCellConfigCommon(recfgWithSync->spCellConfigCommon);
+ DU_FREE(recfgWithSync->spCellConfigCommon, sizeof(ServingCellConfigCommon_t));
+ }
+
+ /* Free Dedicated RACH configuration */
+ if(recfgWithSync->rach_ConfigDedicated)
+ {
+ FreeRachConfigDedicated(recfgWithSync->rach_ConfigDedicated);
+ DU_FREE(recfgWithSync->rach_ConfigDedicated, sizeof(struct ReconfigurationWithSync__rach_ConfigDedicated));
+ }
+}
+
/*******************************************************************
*
* @brief Frees emmory allocated for DUToCURRCContainer
spCellCfg = cellGrpCfg->spCellConfig;
if(spCellCfg)
{
- if(spCellCfg->servCellIndex)
+ /* Free serving cell index */
+ DU_FREE(spCellCfg->servCellIndex, sizeof(long));
+
+ /* Free Reconfiguration with sync */
+ if(spCellCfg->reconfigurationWithSync)
+ {
+ FreeRecfgWithSync(spCellCfg->reconfigurationWithSync);
+ DU_FREE(spCellCfg->reconfigurationWithSync, sizeof(ReconfigurationWithSync_t));
+ }
+
+ /* Free rlmInSyncOutOfSyncThreshold */
+ DU_FREE(spCellCfg->rlmInSyncOutOfSyncThreshold, sizeof(long));
+
+ /* Free SP Cell config dedicated */
+ if(spCellCfg->spCellConfigDedicated)
{
- if(spCellCfg->rlmInSyncOutOfSyncThreshold)
+ srvCellCfg = spCellCfg->spCellConfigDedicated;
+
+ /* Free TDD UL-DL config dedicated */
+ DU_FREE(srvCellCfg->tdd_UL_DL_ConfigurationDedicated, sizeof(TDD_UL_DL_ConfigDedicated_t));
+
+ /* Free Initial Downlink BWP */
+ if(srvCellCfg->initialDownlinkBWP)
{
- if(spCellCfg->spCellConfigDedicated)
+ dlBwp = srvCellCfg->initialDownlinkBWP;
+
+ /* Free DL BWP PDCCH Config */
+ if(dlBwp->pdcch_Config)
{
- srvCellCfg = spCellCfg->spCellConfigDedicated;
- if(srvCellCfg->tdd_UL_DL_ConfigurationDedicated)
- {
- if(srvCellCfg->initialDownlinkBWP)
- {
- dlBwp = srvCellCfg->initialDownlinkBWP;
- if(srvCellCfg->firstActiveDownlinkBWP_Id)
- {
- if(srvCellCfg->defaultDownlinkBWP_Id)
- {
- if(srvCellCfg->uplinkConfig)
- {
- if(srvCellCfg->pdsch_ServingCellConfig)
- {
- pdschCfg= srvCellCfg->pdsch_ServingCellConfig;
- if(pdschCfg->choice.setup)
- {
- DU_FREE(pdschCfg->choice.setup->nrofHARQ_ProcessesForPDSCH,sizeof(long));
- DU_FREE(pdschCfg->choice.setup, sizeof( struct PDSCH_ServingCellConfig));
- }
- DU_FREE(srvCellCfg->pdsch_ServingCellConfig, sizeof(struct
- ServingCellConfig__pdsch_ServingCellConfig));
- }
- FreeinitialUplinkBWP(srvCellCfg->uplinkConfig);
- DU_FREE(srvCellCfg->uplinkConfig, sizeof(UplinkConfig_t));
- }
- DU_FREE(srvCellCfg->defaultDownlinkBWP_Id, sizeof(long));
- }
- DU_FREE(srvCellCfg->firstActiveDownlinkBWP_Id, sizeof(long));
- }
- if(dlBwp->pdcch_Config)
- {
- if(dlBwp->pdsch_Config)
- {
- FreeBWPDlDedPdschCfg(dlBwp);
- DU_FREE(dlBwp->pdsch_Config, sizeof(struct BWP_DownlinkDedicated__pdsch_Config));
- }
- FreeBWPDlDedPdcchCfg(dlBwp);
- DU_FREE(dlBwp->pdcch_Config, sizeof(struct BWP_DownlinkDedicated__pdcch_Config));
- }
- DU_FREE(srvCellCfg->initialDownlinkBWP, sizeof(BWP_DownlinkDedicated_t));
- }
- DU_FREE(srvCellCfg->tdd_UL_DL_ConfigurationDedicated, sizeof(TDD_UL_DL_ConfigDedicated_t));
- }
- DU_FREE(spCellCfg->spCellConfigDedicated, sizeof(ServingCellConfig_t));
+ FreeBWPDlDedPdcchCfg(dlBwp);
+ DU_FREE(dlBwp->pdcch_Config, sizeof(struct BWP_DownlinkDedicated__pdcch_Config));
+ }
+
+ /* Free DL BWP PDSCH config */
+ if(dlBwp->pdsch_Config)
+ {
+ FreeBWPDlDedPdschCfg(dlBwp);
+ DU_FREE(dlBwp->pdsch_Config, sizeof(struct BWP_DownlinkDedicated__pdsch_Config));
+ }
+ DU_FREE(srvCellCfg->initialDownlinkBWP, sizeof(BWP_DownlinkDedicated_t));
+ }
+
+ /* Free First Active Downlink BWP */
+ DU_FREE(srvCellCfg->firstActiveDownlinkBWP_Id, sizeof(long));
+
+ /* Free Default downlink BWP */
+ DU_FREE(srvCellCfg->defaultDownlinkBWP_Id, sizeof(long));
+
+ /* Free Uplink config */
+ if(srvCellCfg->uplinkConfig)
+ {
+ FreeinitialUplinkBWP(srvCellCfg->uplinkConfig);
+ DU_FREE(srvCellCfg->uplinkConfig, sizeof(UplinkConfig_t));
+ }
+
+ /* Free PDSCH serving cell config */
+ if(srvCellCfg->pdsch_ServingCellConfig)
+ {
+ pdschCfg= srvCellCfg->pdsch_ServingCellConfig;
+ if(pdschCfg->choice.setup)
+ {
+ DU_FREE(pdschCfg->choice.setup->nrofHARQ_ProcessesForPDSCH,sizeof(long));
+ DU_FREE(pdschCfg->choice.setup, sizeof(struct PDSCH_ServingCellConfig));
}
- DU_FREE(spCellCfg->rlmInSyncOutOfSyncThreshold, sizeof(long));
+ DU_FREE(srvCellCfg->pdsch_ServingCellConfig, sizeof(struct ServingCellConfig__pdsch_ServingCellConfig));
}
- DU_FREE(spCellCfg->servCellIndex, sizeof(long));
+
+ DU_FREE(spCellCfg->spCellConfigDedicated, sizeof(ServingCellConfig_t));
}
DU_FREE(spCellCfg,sizeof(SpCellConfig_t));
}
uint32_t gnbCuUeF1apId; /* GNB CU UE F1AP ID */
uint32_t drbBitMap; /* Drb Bit Map */
UeState ueState; /* UE Active/ Ue Inactive state */
+ MacCfraResource cfraResource; /* CF-RA resource assigned by MAC/SCH */
MacUeCfg macUeCfg; /* Mac Ue Cfg */
RlcUeCfg rlcUeCfg; /* Rlc Ue Cfg */
}DuUeCb;
ret = unpackDuMacSliceReCfgRsp(DuProcMacSliceReCfgRsp, pst, mBuf);
break;
}
+ case EVENT_MAC_RACH_RESOURCE_RSP:
+ {
+ ret = unpackDuMacRachRsrcRsp(DuProcMacRachRsrcRsp, pst, mBuf);
+ break;
+ }
default:
{
DU_LOG("\nERROR --> DU_APP : Invalid event received at duActvTsk from ENTMAC");
*
* @details
*
- * Function : BuildScsSpecificCarrierListDl
+ * Function : BuildScsSpecificCarrierListDlSib
*
* Functionality:
* Builds Subcarrier specific carrier list for downlink
* RFAILED - failure
*
* ****************************************************************/
-uint8_t BuildScsSpecificCarrierListDl( struct FrequencyInfoDL_SIB__scs_SpecificCarrierList *scsCarrierList)
+uint8_t BuildScsSpecificCarrierListDlSib( struct FrequencyInfoDL_SIB__scs_SpecificCarrierList *scsCarrierList)
{
uint8_t idx;
ScsSpecCarrier duScsSpecCarrier;
scsCarrierList->list.array[idx]->carrierBandwidth = duScsSpecCarrier.scsBw;
return ROK;
-} /* End of BuildScsSpecificCarrierListDl */
+} /* End of BuildScsSpecificCarrierListDlSib */
/*******************************************************************
*
duPdcchCfg = duCfgParam.sib1Params.srvCellCfgCommSib.dlCfg.pdcchCfg;
- DU_ALLOC(searchSpclist->list.array, searchSpclist->list.size)
- if(!searchSpclist->list.array)
- {
- DU_LOG("\nERROR --> DU APP : Common search space list memory alloc failed");
- return RFAILED;
- }
+ DU_ALLOC(searchSpclist->list.array, searchSpclist->list.size);
+ if(!searchSpclist->list.array)
+ {
+ DU_LOG("\nERROR --> DU APP : Common search space list memory alloc failed");
+ return RFAILED;
+ }
for(idx = 0; idx < searchSpclist->list.count; idx++)
{
DU_LOG("\nERROR --> DU APP : Common search space list memory alloc failed");
return RFAILED;
}
- searchSpace->monitoringSlotPeriodicityAndOffset->present = \
- duPdcchCfg.monitorSlotPrdAndOffPresent;
+ searchSpace->monitoringSlotPeriodicityAndOffset->present = duPdcchCfg.monitorSlotPrdAndOffPresent;
+
switch(searchSpace->monitoringSlotPeriodicityAndOffset->present)
{
case SearchSpace__monitoringSlotPeriodicityAndOffset_PR_sl1:
}
/* Monitoring Symbols Within Slot */
- DU_ALLOC(searchSpace->monitoringSymbolsWithinSlot,\
- sizeof(BIT_STRING_t));
+ DU_ALLOC(searchSpace->monitoringSymbolsWithinSlot, sizeof(BIT_STRING_t));
if(!searchSpace->monitoringSymbolsWithinSlot)
{
DU_LOG("\nERROR --> DU APP : Common search space list memory alloc failed");
return RFAILED;
}
- searchSpace->monitoringSymbolsWithinSlot->size = 2*sizeof(uint8_t);
- DU_ALLOC(searchSpace->monitoringSymbolsWithinSlot->buf, \
- searchSpace->monitoringSymbolsWithinSlot->size );
+ searchSpace->monitoringSymbolsWithinSlot->size = 2 * sizeof(uint8_t);
+
+ DU_ALLOC(searchSpace->monitoringSymbolsWithinSlot->buf, searchSpace->monitoringSymbolsWithinSlot->size);
if(!searchSpace->monitoringSymbolsWithinSlot->buf)
{
DU_LOG("\nERROR --> DU APP : Common search space list memory alloc failed");
searchSpace->monitoringSymbolsWithinSlot->bits_unused = 2;
/* Number of candidates per aggregation level */
- DU_ALLOC(searchSpace->nrofCandidates,\
- sizeof(struct SearchSpace__nrofCandidates));
+ DU_ALLOC(searchSpace->nrofCandidates, sizeof(struct SearchSpace__nrofCandidates));
if(!searchSpace->nrofCandidates)
{
DU_LOG("\nERROR --> DU APP : Common search space list memory alloc failed");
searchSpace->nrofCandidates->aggregationLevel16 = duPdcchCfg.numCandAggLvl16;
/* Search Space type and DCI Format */
- DU_ALLOC(searchSpace->searchSpaceType,\
- sizeof( struct SearchSpace__searchSpaceType));
+ DU_ALLOC(searchSpace->searchSpaceType, sizeof( struct SearchSpace__searchSpaceType));
if(!searchSpace->searchSpaceType)
{
DU_LOG("\nERROR --> DU APP : Common search space list memory alloc failed");
return RFAILED;
}
- DU_ALLOC(searchSpace->searchSpaceType->choice.common->\
- dci_Format0_0_AndFormat1_0, sizeof(struct \
- SearchSpace__searchSpaceType__common__dci_Format0_0_AndFormat1_0));
+ DU_ALLOC(searchSpace->searchSpaceType->choice.common->dci_Format0_0_AndFormat1_0, \
+ sizeof(struct SearchSpace__searchSpaceType__common__dci_Format0_0_AndFormat1_0));
if(!searchSpace->searchSpaceType->choice.common->dci_Format0_0_AndFormat1_0)
{
DU_LOG("\nERROR --> DU APP : Common search space list memory alloc failed");
*pdcchSetup->searchSpaceZero = duPdcchCfg.searchSpcZero;
/* Common Search Space List */
- DU_ALLOC(pdcchSetup->commonSearchSpaceList,\
- sizeof(struct PDCCH_ConfigCommon__commonSearchSpaceList));
+ DU_ALLOC(pdcchSetup->commonSearchSpaceList, sizeof(struct PDCCH_ConfigCommon__commonSearchSpaceList));
if(!pdcchSetup->commonSearchSpaceList)
{
DU_LOG("\nERROR --> DU APP : PDCCH Config memory alloc failed");
ret = BuildCommonSerachSpaceList(pdcchSetup->commonSearchSpaceList);
if(ret != ROK)
{
+ DU_LOG("\nERROR --> DU APP : Failed to fill common search space list");
return RFAILED;
}
CommonSerachSpaceListret=ROK;
}
*pdcchSetup->searchSpaceSIB1 = duPdcchCfg.searchSpcSib1;
- /* Serach Space for Paging */
+ /* Search Space for Paging */
DU_ALLOC(pdcchSetup->pagingSearchSpace, sizeof(SearchSpaceId_t));
if(!pdcchSetup->pagingSearchSpace)
{
pdschSetup = pdschCfg->choice.setup;
/* Time Domain Allocation List */
- DU_ALLOC(pdschSetup->pdsch_TimeDomainAllocationList, \
- sizeof(PDSCH_TimeDomainResourceAllocationList_t));
+ DU_ALLOC(pdschSetup->pdsch_TimeDomainAllocationList, sizeof(PDSCH_TimeDomainResourceAllocationList_t));
if(!pdschSetup->pdsch_TimeDomainAllocationList)
{
DU_LOG("\nERROR --> DU APP : PDCCH Config memory alloc failed");
return RFAILED;
}
+
elementCnt = duPdschCfg.numTimeDomRsrcAlloc;
pdschSetup->pdsch_TimeDomainAllocationList->list.count = elementCnt;
- pdschSetup->pdsch_TimeDomainAllocationList->list.size = elementCnt * sizeof(PDSCH_TimeDomainResourceAllocation_t *);
+ pdschSetup->pdsch_TimeDomainAllocationList->list.size = \
+ elementCnt * sizeof(PDSCH_TimeDomainResourceAllocation_t *);
DU_ALLOC(pdschSetup->pdsch_TimeDomainAllocationList->list.array,\
pdschSetup->pdsch_TimeDomainAllocationList->list.size);
* ****************************************************************/
uint8_t BuildBwpDlCommon(BWP_DownlinkCommon_t *bwp)
{
- uint8_t ret;
- DlCfgCommon duDlCfg;
-
- duDlCfg = duCfgParam.sib1Params.srvCellCfgCommSib.dlCfg;
+ DlCfgCommon duDlCfg = duCfgParam.sib1Params.srvCellCfgCommSib.dlCfg;
+ /* Generic Parameters */
bwp->genericParameters.locationAndBandwidth = duDlCfg.locAndBw;
bwp->genericParameters.subcarrierSpacing = duDlCfg.dlScsCarrier.scs;
/* PDCCH Config Common */
- DU_ALLOC(bwp->pdcch_ConfigCommon, \
- sizeof(struct BWP_DownlinkCommon__pdcch_ConfigCommon));
+ DU_ALLOC(bwp->pdcch_ConfigCommon, sizeof(struct BWP_DownlinkCommon__pdcch_ConfigCommon));
if(!bwp->pdcch_ConfigCommon)
{
DU_LOG("\nERROR --> DU APP : DL BWP memory allocation failed");
return RFAILED;
}
- ret=BuildPdcchCfgCommon(bwp->pdcch_ConfigCommon);
- if(ret != ROK)
+ if((BuildPdcchCfgCommon(bwp->pdcch_ConfigCommon)) != ROK)
{
+ DU_LOG("\nERROR --> DU APP : Failed to fill PDCCH config common in BuildBwpDlCommon()");
return RFAILED;
}
+
/* PDSCH Config Common */
- DU_ALLOC(bwp->pdsch_ConfigCommon, \
- sizeof(struct BWP_DownlinkCommon__pdsch_ConfigCommon));
+ DU_ALLOC(bwp->pdsch_ConfigCommon, sizeof(struct BWP_DownlinkCommon__pdsch_ConfigCommon));
if(!bwp->pdsch_ConfigCommon)
{
DU_LOG("\nERROR --> DU APP : DL BWP memory allocation failed");
return RFAILED;
}
- ret=BuildPdschCfgCommon(bwp->pdsch_ConfigCommon);
- if(ret != ROK)
+
+ if((BuildPdschCfgCommon(bwp->pdsch_ConfigCommon)) != ROK)
{
+ DU_LOG("\nERROR --> DU APP : Failed to fill PDSCH config common in BuildBwpDlCommon()");
return RFAILED;
}
+
return ROK;
} /* BuildBwpDlCommon */
*
* @details
*
- * Function : BuildFreqInfoDl
+ * Function : BuildFreqInfoDlSib
*
* Functionality:
* Builds Frequency Info for Downlink
*
* ****************************************************************/
-uint8_t BuildFreqInfoDl(FrequencyInfoDL_SIB_t *frequencyInfoDL)
+uint8_t BuildFreqInfoDlSib(FrequencyInfoDL_SIB_t *frequencyInfoDL)
{
uint8_t ret;
uint8_t idx;
frequencyInfoDL->scs_SpecificCarrierList.list.count = elementCnt;
frequencyInfoDL->scs_SpecificCarrierList.list.size = \
elementCnt * sizeof(SCS_SpecificCarrier_t *);
- ret= BuildScsSpecificCarrierListDl(&frequencyInfoDL->scs_SpecificCarrierList);
+ ret= BuildScsSpecificCarrierListDlSib(&frequencyInfoDL->scs_SpecificCarrierList);
if(ret != ROK)
{
{
/* DL frequency info */
uint8_t ret;
- ret = BuildFreqInfoDl(&dlCfg->frequencyInfoDL);
+ ret = BuildFreqInfoDlSib(&dlCfg->frequencyInfoDL);
if(ret != ROK)
{
return RFAILED;
*
* @details
*
- * Function : BuildScsSpecificCarrierListUl
+ * Function : BuildScsSpecificCarrierListUlSib
*
* Functionality:
* Builds SCS specific carrier list for UL
*
* ****************************************************************/
- uint8_t BuildScsSpecificCarrierListUl
-(
- struct FrequencyInfoUL_SIB__scs_SpecificCarrierList *scsCarrierList
- )
+uint8_t BuildScsSpecificCarrierListUlSib(struct FrequencyInfoUL_SIB__scs_SpecificCarrierList *scsCarrierList)
{
uint8_t idx;
ScsSpecCarrier duScsSpecCarrier;
scsCarrierList->list.array[idx]->carrierBandwidth = duScsSpecCarrier.scsBw;
return ROK;
-} /* End of BuildScsSpecificCarrierListUl */
+} /* End of BuildScsSpecificCarrierListUlSib */
/*******************************************************************
*
*
* @details
*
- * Function : BuildFreqInfoUl
+ * Function : BuildFreqInfoUlSib
*
* Functionality:
* Builds frequency infor for UL
*
* ****************************************************************/
-uint8_t BuildFreqInfoUl(FrequencyInfoUL_SIB_t *frequencyInfoUL)
+uint8_t BuildFreqInfoUlSib(FrequencyInfoUL_SIB_t *frequencyInfoUL)
{
uint8_t elementCnt;
UlCfgCommon ulCfg;
frequencyInfoUL->scs_SpecificCarrierList.list.count = elementCnt;
frequencyInfoUL->scs_SpecificCarrierList.list.size = \
elementCnt * sizeof(SCS_SpecificCarrier_t *);
- ret=BuildScsSpecificCarrierListUl(&frequencyInfoUL->scs_SpecificCarrierList);
+ ret=BuildScsSpecificCarrierListUlSib(&frequencyInfoUL->scs_SpecificCarrierList);
if(ret != ROK)
{
return RFAILED;
*frequencyInfoUL->p_Max = ulCfg.pMax;
FreqInfoUlret=ROK;
return ROK;
-}/* BuildFreqInfoUl */
+}/* BuildFreqInfoUlSib */
/*******************************************************************
*
uint8_t BuildRachCfgCommon(struct BWP_UplinkCommon__rach_ConfigCommon *rachCfg)
{
- RachCfgCommon duRachCfg;
- RACH_ConfigCommon_t *setup;
-
- duRachCfg = duCfgParam.sib1Params.srvCellCfgCommSib.ulCfg.rachCfg;
+ RachCfgCommon duRachCfg = duCfgParam.sib1Params.srvCellCfgCommSib.ulCfg.rachCfg;
+ RACH_ConfigCommon_t *setup = NULLP;
rachCfg->present = duRachCfg.present;
switch(rachCfg->present)
DU_LOG("\nERROR --> DU APP : Rach Config memory alloc failed");
return RFAILED;
}
- setup->ssb_perRACH_OccasionAndCB_PreamblesPerSSB->present = \
- duRachCfg.ssbPerRachOccPresent;
+ setup->ssb_perRACH_OccasionAndCB_PreamblesPerSSB->present = duRachCfg.numSsbPerRachOcc;
+
switch(setup->ssb_perRACH_OccasionAndCB_PreamblesPerSSB->present)
{
case RACH_ConfigCommon__ssb_perRACH_OccasionAndCB_PreamblesPerSSB_PR_NOTHING:
}
case RACH_ConfigCommon__ssb_perRACH_OccasionAndCB_PreamblesPerSSB_PR_one:
{
- setup->ssb_perRACH_OccasionAndCB_PreamblesPerSSB->choice.one =\
- duRachCfg.numSsbPerRachOcc;
+ setup->ssb_perRACH_OccasionAndCB_PreamblesPerSSB->choice.one = \
+ convertCbPreamblePerSsbValueToEnum(duRachCfg.numCbPreamblePerSsb);
}
case RACH_ConfigCommon__ssb_perRACH_OccasionAndCB_PreamblesPerSSB_PR_two:
{
}
default:
{
- DU_LOG("\nERROR --> DU APP: Invalid value for \
- ssb_PerRach_OccassionAndCB_PreamblesPerSSB");
+ DU_LOG("\nERROR --> DU APP: Invalid value for ssb_PerRach_OccassionAndCB_PreamblesPerSSB");
return RFAILED;
}
}
uint8_t BuildPuschCfgCommon(struct BWP_UplinkCommon__pusch_ConfigCommon *puschCfg)
{
- uint8_t idx;
- uint8_t elementCnt;
- PuschCfgCommon duPuschCfg;
- PUSCH_ConfigCommon_t *setup;
- PUSCH_TimeDomainResourceAllocation_t *timeDomRsrcAllocInfo;
+ uint8_t idx = 0;
+ uint8_t elementCnt = 0;
+ PuschCfgCommon duPuschCfg = duCfgParam.sib1Params.srvCellCfgCommSib.ulCfg.puschCfg;
+ PUSCH_ConfigCommon_t *setup = NULLP;
+ PUSCH_TimeDomainResourceAllocation_t *timeDomRsrcAllocInfo = NULLP;
- duPuschCfg = duCfgParam.sib1Params.srvCellCfgCommSib.ulCfg.puschCfg;
puschCfg->present = duPuschCfg.puschCfgPresent;
switch(puschCfg->present)
setup = puschCfg->choice.setup;
/* Time Domain Resource Allocation List */
- DU_ALLOC(setup->pusch_TimeDomainAllocationList,\
- sizeof(PUSCH_TimeDomainResourceAllocationList_t));
+ DU_ALLOC(setup->pusch_TimeDomainAllocationList, sizeof(PUSCH_TimeDomainResourceAllocationList_t));
if(!setup->pusch_TimeDomainAllocationList)
{
DU_LOG("\nERROR --> DU APP : PUSCH Config memory alloc failed");
}
elementCnt = duPuschCfg.numTimeDomRsrcAlloc;
setup->pusch_TimeDomainAllocationList->list.count = elementCnt;
- setup->pusch_TimeDomainAllocationList->list.size = \
- elementCnt * sizeof(PUSCH_TimeDomainResourceAllocation_t *);
+ setup->pusch_TimeDomainAllocationList->list.size = elementCnt * sizeof(PUSCH_TimeDomainResourceAllocation_t *);
- DU_ALLOC(setup->pusch_TimeDomainAllocationList->list.array, \
- setup->pusch_TimeDomainAllocationList->list.size);
+ DU_ALLOC(setup->pusch_TimeDomainAllocationList->list.array, setup->pusch_TimeDomainAllocationList->list.size);
if(!setup->pusch_TimeDomainAllocationList->list.array)
{
DU_LOG("\nERROR --> DU APP : PUSCH Config memory alloc failed");
timeDomRsrcAllocInfo->mappingType = duPuschCfg.timeDomAllocList[idx].mapType;
timeDomRsrcAllocInfo->startSymbolAndLength = duPuschCfg.timeDomAllocList[idx].sliv;
}
+
/* Msg3 Delta Preamble */
DU_ALLOC(setup->msg3_DeltaPreamble, sizeof(long));
if(!setup->msg3_DeltaPreamble)
}
*setup->msg3_DeltaPreamble = duPuschCfg.msg3DeltaPreamble;
- /* P0 Nominal with grnat */
+ /* P0 Nominal with grant */
DU_ALLOC(setup->p0_NominalWithGrant, sizeof(long));
if(!setup->p0_NominalWithGrant)
{
uint8_t BuildBwpUlCommon(BWP_UplinkCommon_t *bwp)
{
- uint8_t ret;
- UlCfgCommon duUlCfg;
-
- duUlCfg = duCfgParam.sib1Params.srvCellCfgCommSib.ulCfg;
+ UlCfgCommon duUlCfg = duCfgParam.sib1Params.srvCellCfgCommSib.ulCfg;
+ /* Generic Parameters */
bwp->genericParameters.locationAndBandwidth = duUlCfg.locAndBw;
bwp->genericParameters.subcarrierSpacing = duUlCfg.ulScsCarrier.scs;
/* RACH Config Common */
- DU_ALLOC(bwp->rach_ConfigCommon,\
- sizeof(struct BWP_UplinkCommon__rach_ConfigCommon));
+ DU_ALLOC(bwp->rach_ConfigCommon, sizeof(struct BWP_UplinkCommon__rach_ConfigCommon));
if(!bwp->rach_ConfigCommon)
{
DU_LOG("\nERROR --> DU APP : UL BWP memory allocation failed");
return RFAILED;
}
- ret = BuildRachCfgCommon(bwp->rach_ConfigCommon);
- if(ret != ROK)
+
+ if((BuildRachCfgCommon(bwp->rach_ConfigCommon)) != ROK)
{
+ DU_LOG("\nERROR --> DU APP : Failed to fill RACH config common in BuildBwpUlCommon()");
return RFAILED;
}
RachCfgCommonret=ROK;
/* PUSCH Config Common */
- DU_ALLOC(bwp->pusch_ConfigCommon,\
- sizeof(struct BWP_UplinkCommon__pusch_ConfigCommon));
+ DU_ALLOC(bwp->pusch_ConfigCommon, sizeof(struct BWP_UplinkCommon__pusch_ConfigCommon));
if(!bwp->pusch_ConfigCommon)
{
DU_LOG("\nERROR --> DU APP : UL BWP memory allocation failed");
return RFAILED;
- }
- ret = BuildPuschCfgCommon(bwp->pusch_ConfigCommon);
- if(ret != ROK)
+ }
+
+ if((BuildPuschCfgCommon(bwp->pusch_ConfigCommon)) != ROK)
{
+ DU_LOG("\nERROR --> DU APP : Failed to fill PUSCH config common in BuildBwpUlCommon()");
return RFAILED;
}
PuschCfgCommonret = ROK;
/* PUCCH Config Common */
- DU_ALLOC(bwp->pucch_ConfigCommon,\
- sizeof(struct BWP_UplinkCommon__pucch_ConfigCommon));
+ DU_ALLOC(bwp->pucch_ConfigCommon, sizeof(struct BWP_UplinkCommon__pucch_ConfigCommon));
if(!bwp->pucch_ConfigCommon)
{
DU_LOG("\nERROR --> DU APP : UL BWP memory allocation failed");
return RFAILED;
- }
- ret = BuildPucchCfgCommon(bwp->pucch_ConfigCommon);
- if(ret != ROK)
+ }
+
+ if((BuildPucchCfgCommon(bwp->pucch_ConfigCommon)) != ROK)
{
+ DU_LOG("\nERROR --> DU APP : Failed to fill PUCCH config common in BuildBwpUlCommon()");
return RFAILED;
}
+
return ROK;
}/* BuildBwpUlCommon */
{
uint8_t ret;
/* UL frequency info */
- ret = BuildFreqInfoUl(&ulCfg->frequencyInfoUL);
+ ret = BuildFreqInfoUlSib(&ulCfg->frequencyInfoUL);
if(ret != ROK)
{
return RFAILED;
uint8_t BuildTddUlDlCfgComm(TDD_UL_DL_ConfigCommon_t *tddCfg)
{
- TddUlDlCfgCommon duTddCfg;
-
- duTddCfg = duCfgParam.sib1Params.srvCellCfgCommSib.tddCfg;
+ TddUlDlCfgCommon duTddCfg = duCfgParam.sib1Params.srvCellCfgCommSib.tddCfg;
/* Reference Subcarrier spacing */
tddCfg->referenceSubcarrierSpacing = duTddCfg.refScs;
ssbPosInBurst->buf[0] = duSrvCellCfg.ssbPosInBurst;
ssbPosInBurst->bits_unused = 0;
- switch(duSrvCellCfg.ssbPrdServingCell)
- {
- case SSB_PERIODICITY_5MS:
- srvCellCfg->ssb_PeriodicityServingCell = \
- ServingCellConfigCommonSIB__ssb_PeriodicityServingCell_ms5;
- break;
- case SSB_PERIODICITY_10MS:
- srvCellCfg->ssb_PeriodicityServingCell = \
- ServingCellConfigCommonSIB__ssb_PeriodicityServingCell_ms10;
- break;
- case SSB_PERIODICITY_20MS:
- srvCellCfg->ssb_PeriodicityServingCell = \
- ServingCellConfigCommonSIB__ssb_PeriodicityServingCell_ms20;
- break;
- case SSB_PERIODICITY_40MS:
- srvCellCfg->ssb_PeriodicityServingCell = \
- ServingCellConfigCommonSIB__ssb_PeriodicityServingCell_ms40;
- break;
- case SSB_PERIODICITY_80MS:
- srvCellCfg->ssb_PeriodicityServingCell = \
- ServingCellConfigCommonSIB__ssb_PeriodicityServingCell_ms80;
- break;
- case SSB_PERIODICITY_160MS:
- srvCellCfg->ssb_PeriodicityServingCell = \
- ServingCellConfigCommonSIB__ssb_PeriodicityServingCell_ms160;
- break;
- }
-
+ srvCellCfg->ssb_PeriodicityServingCell = convertSsbPeriodicityValueToEnumForSib(duSrvCellCfg.ssbPrdServingCell);
srvCellCfg->ss_PBCH_BlockPower = duSrvCellCfg.ssPbchBlockPwr;
/* Downlink config common */
*
* @details
*
- * Function : FreeFreqInfoDl
+ * Function : FreeFreqInfoDlSib
*
- * Functionality: Freeing memory of BuildFreqInfoDl
+ * Functionality: Freeing memory of BuildFreqInfoDlSib
*
* @params[in] : FrequencyInfoDL_SIB_t *frequencyInfoDL
* @return : void
*
*******************************************************************/
-void FreeFreqInfoDl(FrequencyInfoDL_SIB_t *frequencyInfoDL)
+void FreeFreqInfoDlSib(FrequencyInfoDL_SIB_t *frequencyInfoDL)
{
uint8_t idx=0;
uint8_t idx1=0;
DU_FREE(bwp->pdcch_ConfigCommon,sizeof(struct BWP_DownlinkCommon__pdcch_ConfigCommon));
}
}
+
/*******************************************************************
*
- * @brief deallocating the memory of BuildSib1Msg
+ * @brief Free PUCCH configuration common
*
* @details
*
- * Function: FreeUlCfgCommSib
+ * Function : FreePucchCfgCommon
*
- * Functionality deallocating the memory of BuildUlCfgCommSib
+ * Functionality:
+ * Free PUCCH configuration common
*
- * @params[in] : UplinkConfigCommonSIB_t *ulCfg
+ * @params[in] Pointer to struct BWP_UplinkCommon__pucch_ConfigCommon
+ * @return void
*
- * @return : void
+ * ****************************************************************/
+void FreePucchCfgCommon( struct BWP_UplinkCommon__pucch_ConfigCommon *pucchCfg)
+{
+ PUCCH_ConfigCommon_t *setup;
+
+ if(pucchCfg->choice.setup)
+ {
+ setup = pucchCfg->choice.setup;
+
+ /* Resource Common */
+ DU_FREE(setup->pucch_ResourceCommon, sizeof(long));
+
+ /* P0 nominal */
+ DU_FREE(setup->p0_nominal, sizeof(long));
+
+ DU_FREE(pucchCfg->choice.setup, sizeof(PUCCH_ConfigCommon_t));
+ }
+}/* FreePucchCfgCommon */
+
+/*******************************************************************
*
- *******************************************************************/
-void FreeUlCfgCommSib(UplinkConfigCommonSIB_t *ulCfg)
+ * @brief Free PUSCH configuration for common
+ *
+ * @details
+ *
+ * Function : FreePuschCfgCommon
+ *
+ * Functionality:
+ * Free PUSCH configuration for common
+ *
+ * @params[in] Pointer to struct BWP_UplinkCommon__pusch_ConfigCommon *puschCfg
+ * @return void
+ *
+ * ****************************************************************/
+void FreePuschCfgCommon(struct BWP_UplinkCommon__pusch_ConfigCommon *puschCfg)
{
- uint8_t idx=0,arrIdx;
- RACH_ConfigCommon_t *setup;
- BWP_UplinkCommon_t *bwp=&ulCfg->initialUplinkBWP;
- struct FrequencyInfoUL_SIB__scs_SpecificCarrierList *scsCarrierList;
- struct BWP_UplinkCommon__rach_ConfigCommon *rachCfg;
- struct BWP_UplinkCommon__pucch_ConfigCommon *pucchCfg;
- struct BWP_UplinkCommon__pusch_ConfigCommon *puschCfg;
- puschCfg=ulCfg->initialUplinkBWP.pusch_ConfigCommon;
- rachCfg =bwp->rach_ConfigCommon;
- scsCarrierList = &ulCfg->frequencyInfoUL.scs_SpecificCarrierList;
+ uint8_t idx = 0;
+ PUSCH_ConfigCommon_t *setup = NULLP;
+ PUSCH_TimeDomainResourceAllocation_t *timeDomRsrcAllocInfo = NULLP;
- if(scsCarrierList->list.array)
+ if(puschCfg->choice.setup)
{
- if(ulCfg->frequencyInfoUL.p_Max)
+ setup = puschCfg->choice.setup;
+
+ /* Time Domain Resource Allocation List */
+ if(setup->pusch_TimeDomainAllocationList)
{
- if(FreqInfoUlret == ROK)
+ if(setup->pusch_TimeDomainAllocationList->list.array)
{
- if(bwp->rach_ConfigCommon)
+ for(idx=0; idx < setup->pusch_TimeDomainAllocationList->list.count; idx++)
{
- if(RachCfgCommonret== ROK)
+ if(setup->pusch_TimeDomainAllocationList->list.array[idx])
{
- if(bwp->pusch_ConfigCommon)
- {
+ timeDomRsrcAllocInfo = setup->pusch_TimeDomainAllocationList->list.array[idx];
- if(PuschCfgCommonret==ROK)
- {
- if(bwp->pucch_ConfigCommon)
- {
- pucchCfg=bwp->pucch_ConfigCommon;
- switch(pucchCfg->present)
- {
- case BWP_UplinkCommon__pucch_ConfigCommon_PR_NOTHING:
- break;
- case BWP_UplinkCommon__pucch_ConfigCommon_PR_release:
- break;
- case BWP_UplinkCommon__pucch_ConfigCommon_PR_setup:
- {
- if(pucchCfg->choice.setup)
- {
+ /* K2 */
+ DU_FREE(timeDomRsrcAllocInfo->k2, sizeof(long));
+ DU_FREE(setup->pusch_TimeDomainAllocationList->list.array[idx],\
+ sizeof(PUSCH_TimeDomainResourceAllocation_t));
+ }
+ }
+ DU_FREE(setup->pusch_TimeDomainAllocationList->list.array, setup->pusch_TimeDomainAllocationList->list.size);
+ }
+ DU_FREE(setup->pusch_TimeDomainAllocationList, sizeof(PUSCH_TimeDomainResourceAllocationList_t));
+ }
- if(pucchCfg->choice.setup->pucch_ResourceCommon)
- {
- if(pucchCfg->choice.setup->p0_nominal)
- {
- DU_FREE(pucchCfg->choice.setup->p0_nominal,
- sizeof(long));
- }
- DU_FREE(pucchCfg->choice.setup->pucch_ResourceCommon,
- sizeof(long));
- }
- DU_FREE(pucchCfg->choice.setup,
- sizeof(PUCCH_ConfigCommon_t));
- }
- }
- default:
- break;
- }
- DU_FREE(bwp->pucch_ConfigCommon,\
- sizeof(struct BWP_UplinkCommon__pucch_ConfigCommon));
- }
- }
- switch(puschCfg->present)
- {
- case BWP_UplinkCommon__pusch_ConfigCommon_PR_NOTHING:
- break;
- case BWP_UplinkCommon__pusch_ConfigCommon_PR_release:
- break;
- case BWP_UplinkCommon__pusch_ConfigCommon_PR_setup:
- {
- if(puschCfg->choice.setup)
- {
+ /* Msg3 Delta Preamble */
+ DU_FREE(setup->msg3_DeltaPreamble, sizeof(long));
- if( puschCfg->choice.setup->pusch_TimeDomainAllocationList)
- {
- if( puschCfg->choice.setup->pusch_TimeDomainAllocationList->list.array)
- {
- for(arrIdx = 0; arrIdx<puschCfg->choice.setup->pusch_TimeDomainAllocationList->list.count; arrIdx++)
- {
- if(puschCfg->choice.setup->pusch_TimeDomainAllocationList->list.array[arrIdx])
- {
- if(puschCfg->choice.setup->pusch_TimeDomainAllocationList->list.array[arrIdx]->k2)
- {
- if( puschCfg->choice.setup->msg3_DeltaPreamble)
- {
- if(puschCfg->choice.setup->p0_NominalWithGrant)
- {
- DU_FREE(puschCfg->choice.setup->p0_NominalWithGrant,
- sizeof(long));
- }
- DU_FREE(puschCfg->choice.setup->msg3_DeltaPreamble,
- sizeof(long));
- }
- DU_FREE(puschCfg->choice.setup->pusch_TimeDomainAllocationList->list.\
- array[arrIdx]->k2, sizeof(long));
- }
- }
- }
- for(idx=0;
- idx<puschCfg->choice.setup->pusch_TimeDomainAllocationList->list.count;
- idx++)
- {
- if(puschCfg->choice.setup->pusch_TimeDomainAllocationList->list.array[idx])
- {
- DU_FREE(puschCfg->choice.setup->pusch_TimeDomainAllocationList->list.array[idx],\
- sizeof(PUSCH_TimeDomainResourceAllocation_t));
- }
- }
- DU_FREE(puschCfg->choice.setup->pusch_TimeDomainAllocationList->list.array,\
- puschCfg->choice.setup->pusch_TimeDomainAllocationList->list.size);
- }
- DU_FREE(puschCfg->choice.setup->pusch_TimeDomainAllocationList,\
- sizeof(PUSCH_TimeDomainResourceAllocationList_t));
- }
- DU_FREE(puschCfg->choice.setup,
- sizeof(PUSCH_ConfigCommon_t));
- }
- }
- default :
- break;
- }
+ /* P0 Nominal with grant */
+ DU_FREE(setup->p0_NominalWithGrant, sizeof(long));
- DU_FREE(bwp->pusch_ConfigCommon,\
- sizeof(struct BWP_UplinkCommon__pusch_ConfigCommon));
- }
- }
- switch(rachCfg->present)
- {
- case BWP_UplinkCommon__rach_ConfigCommon_PR_NOTHING:
- break;
- case BWP_UplinkCommon__rach_ConfigCommon_PR_release:
- break;
- case BWP_UplinkCommon__rach_ConfigCommon_PR_setup:
- {
- if(rachCfg->choice.setup)
- {
- setup = rachCfg->choice.setup;
- if(setup->totalNumberOfRA_Preambles)
- {
- if(setup->ssb_perRACH_OccasionAndCB_PreamblesPerSSB)
- {
- if(setup->rsrp_ThresholdSSB)
- {
- if(setup->msg1_SubcarrierSpacing)
- {
- DU_FREE(setup->msg1_SubcarrierSpacing,
- sizeof(SubcarrierSpacing_t));
- }
- DU_FREE(setup->rsrp_ThresholdSSB,
- sizeof(RSRP_Range_t));
- }
- DU_FREE(setup->ssb_perRACH_OccasionAndCB_PreamblesPerSSB,\
- sizeof(struct
- RACH_ConfigCommon__ssb_perRACH_OccasionAndCB_PreamblesPerSSB));
- }
- DU_FREE(setup->totalNumberOfRA_Preambles,
- sizeof(long));
- }
+ DU_ALLOC(puschCfg->choice.setup, sizeof(PUSCH_ConfigCommon_t));
+ }
+}/* BuildPuschCfgCommon */
- DU_FREE(rachCfg->choice.setup,
- sizeof(RACH_ConfigCommon_t));
- }
- }
- default:
- break;
- }
- DU_FREE(bwp->rach_ConfigCommon,\
- sizeof(struct BWP_UplinkCommon__rach_ConfigCommon));
- }
- }
- DU_FREE(ulCfg->frequencyInfoUL.p_Max, sizeof(P_Max_t));
- }
+/*******************************************************************
+ *
+ * @brief Free RACH configuration common
+ *
+ * @details
+ *
+ * Function : FreeRachCfgCommon
+ *
+ * Functionality:
+ * Free RACH configuration common
+ *
+ * @params[in] BWP_UplinkCommon__rach_ConfigCommon pointer
+ * @return void
+ *
+ * ****************************************************************/
+
+void FreeRachCfgCommon(struct BWP_UplinkCommon__rach_ConfigCommon *rachCfg)
+{
+ RACH_ConfigCommon_t *setup = NULLP;
+
+ if(rachCfg->choice.setup)
+ {
+ setup = rachCfg->choice.setup;
+
+ /* Total number of RA preambles */
+ DU_FREE(setup->totalNumberOfRA_Preambles, sizeof(long));
+
+ /* SSB per RACH occassion and CB Preambles per SSB */
+ DU_FREE(setup->ssb_perRACH_OccasionAndCB_PreamblesPerSSB,\
+ sizeof(struct RACH_ConfigCommon__ssb_perRACH_OccasionAndCB_PreamblesPerSSB));
+
+ /* RSRP Threshold SSB */
+ DU_FREE(setup->rsrp_ThresholdSSB, sizeof(RSRP_Range_t));
+
+ /* Msg 1 Subcarrier spacing */
+ DU_FREE(setup->msg1_SubcarrierSpacing, sizeof(SubcarrierSpacing_t));
+
+ DU_FREE(rachCfg->choice.setup, sizeof(RACH_ConfigCommon_t));
+ }
+}/* FreeRachCfgCommon */
+
+/*******************************************************************
+ *
+ * @brief Free UL BWP Common
+ *
+ * @details
+ *
+ * Function : FreeBwpUlCommon
+ *
+ * Functionality:
+ * Free UL BWP Common
+ *
+ * @params[in] BWP_UplinkCommon_t pointer
+ * @return void
+ *
+ * ****************************************************************/
+void FreeBwpUlCommon(BWP_UplinkCommon_t *bwp)
+{
+ /* RACH Config Common */
+ if(bwp->rach_ConfigCommon)
+ {
+ FreeRachCfgCommon(bwp->rach_ConfigCommon);
+ DU_FREE(bwp->rach_ConfigCommon, sizeof(struct BWP_UplinkCommon__rach_ConfigCommon));
+ }
+
+ /* PUSCH Config Common */
+ if(bwp->pusch_ConfigCommon)
+ {
+ FreePuschCfgCommon(bwp->pusch_ConfigCommon);
+ DU_FREE(bwp->pusch_ConfigCommon, sizeof(struct BWP_UplinkCommon__pusch_ConfigCommon));
+ }
+
+ /* PUCCH Config Common */
+ if(bwp->pucch_ConfigCommon)
+ {
+ FreePucchCfgCommon(bwp->pucch_ConfigCommon);
+ DU_FREE(bwp->pucch_ConfigCommon, sizeof(struct BWP_UplinkCommon__pucch_ConfigCommon));
+ }
+}/* FreeBwpUlCommon */
+
+/*******************************************************************
+ *
+ * @brief Free frequency infor for UL
+ *
+ * @details
+ *
+ * Function : FreeFreqInfoUlSib
+ *
+ * Functionality:
+ * Free frequency infor for UL
+ *
+ * @params[in] FrequencyInfoUL_SIB_t pointer
+ * @return void
+ *
+ * ****************************************************************/
+
+void FreeFreqInfoUlSib(FrequencyInfoUL_SIB_t *frequencyInfoUL)
+{
+ uint8_t idx = 0;
+ struct FrequencyInfoUL_SIB__scs_SpecificCarrierList *scsCarrierList = &frequencyInfoUL->scs_SpecificCarrierList;
+
+ /* Subcarrier Spacing specifc carrier */
+ if(scsCarrierList->list.array)
+ {
for(idx = 0; idx < scsCarrierList->list.count; idx++)
{
- if(scsCarrierList->list.array[idx])
- {
- DU_FREE(scsCarrierList->list.array[idx],
- sizeof(SCS_SpecificCarrier_t));
- }
+ DU_FREE(scsCarrierList->list.array[idx], sizeof(SCS_SpecificCarrier_t));
}
DU_FREE(scsCarrierList->list.array, scsCarrierList->list.size);
}
-}
+
+ /* P-MAX */
+ DU_FREE(frequencyInfoUL->p_Max, sizeof(P_Max_t));
+}/* FreeFreqInfoUlSib */
+
/*******************************************************************
*
* @brief : Deallocating memory of SIB1 message
*******************************************************************/
void FreeServCellCfgCommonSib(ServingCellConfigCommonSIB_t *srvCellCfg)
{
- BIT_STRING_t *ssbPosInBurst;
+ BIT_STRING_t *ssbPosInBurst = NULLP;
+ DownlinkConfigCommonSIB_t *dlCfg = NULLP;
+ UplinkConfigCommonSIB_t *ulCfg = NULLP;
+
+ /* SSB Position in Burst buffer */
ssbPosInBurst = &srvCellCfg->ssb_PositionsInBurst.inOneGroup;
- DownlinkConfigCommonSIB_t *dlCfg=&srvCellCfg->downlinkConfigCommon;
+ DU_FREE(ssbPosInBurst->buf, ssbPosInBurst->size * sizeof(uint8_t));
+
+ /* Free Donwlink config common SIB */
+ dlCfg = &srvCellCfg->downlinkConfigCommon;
+ FreeFreqInfoDlSib(&dlCfg->frequencyInfoDL);
+ FreeBwpDlCommon(&dlCfg->initialDownlinkBWP);
- if(ssbPosInBurst->buf)
+ /* Uplink Config Comm */
+ if(srvCellCfg->uplinkConfigCommon)
{
- /* Free DL frequency info */
- if(FreqInfoDlret == ROK)
- {
- if(DlCfgCommSibret == ROK)
- {
- /* Uplink Config Comm */
- if(srvCellCfg->uplinkConfigCommon)
- {
- if(UlCfgCommSibret==ROK)
- {
- /* TDD UL DL Config Comm */
- if(srvCellCfg->tdd_UL_DL_ConfigurationCommon)
- {
- DU_FREE(srvCellCfg->tdd_UL_DL_ConfigurationCommon,
- sizeof(TDD_UL_DL_ConfigCommon_t));
- }
- }
- FreeUlCfgCommSib(srvCellCfg->uplinkConfigCommon);
- DU_FREE(srvCellCfg->uplinkConfigCommon,
- sizeof(UplinkConfigCommonSIB_t));
- }
- }
- FreeBwpDlCommon(&dlCfg->initialDownlinkBWP);
- }
- FreeFreqInfoDl(&dlCfg->frequencyInfoDL);
- DU_FREE(ssbPosInBurst->buf, ssbPosInBurst->size * sizeof(uint8_t));
+ ulCfg = srvCellCfg->uplinkConfigCommon;
+ FreeFreqInfoUlSib(&ulCfg->frequencyInfoUL);
+ FreeBwpUlCommon(&ulCfg->initialUplinkBWP);
+ DU_FREE(srvCellCfg->uplinkConfigCommon, sizeof(UplinkConfigCommonSIB_t));
}
+
+ /* TDD UL DL Config Comm */
+ DU_FREE(srvCellCfg->tdd_UL_DL_ConfigurationCommon, sizeof(TDD_UL_DL_ConfigCommon_t));
}
+
/*******************************************************************
*
* @brief : Deallcating memory of the function BuildSib1Msg
uint8_t BuildMibPdu();
uint8_t BuildMibMsg();
uint8_t BuildSib1Msg();
+uint8_t BuildBwpDlCommon(BWP_DownlinkCommon_t *bwp);
+uint8_t BuildBwpUlCommon(BWP_UplinkCommon_t *bwp);
+uint8_t BuildTddUlDlCfgComm(TDD_UL_DL_ConfigCommon_t *tddCfg);
+void FreeBwpDlCommon(BWP_DownlinkCommon_t *bwp);
+void FreeBwpUlCommon(BWP_UplinkCommon_t *bwp);
+
char encBuf[ENC_BUF_MAX_LEN];
DuCfgParams duCfgParam;
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 */
};
DuMacUeDeleteReq packMacUeDeleteReqOpts[] =
* @return ROK/RFAILED
*
*****************************************************************/
-uint8_t fillMacUeCfg(uint16_t cellId, uint8_t gnbDuUef1apId, DuUeCfg *ueCfgDb, MacUeCfg *macUeCfg)
+uint8_t fillMacUeCfg(uint16_t cellId, uint8_t gnbDuUef1apId, uint16_t crnti, DuUeCfg *ueCfgDb, MacUeCfg *macUeCfg)
{
uint8_t ret = ROK, dbIdx = 0, lcIdx = 0, cellIdx = 0;
bool lcIdFound = false;
macUeCfg->cellId = cellId;
macUeCfg->ueId = gnbDuUef1apId;
- GET_CRNTI(macUeCfg->crnti, macUeCfg->ueId);
+ macUeCfg->crnti = crnti;
if(!ueCfgDb)
{
/* Filling Mac Ue Config */
memset(&duCb.actvCellLst[cellIdx]->ueCb[ueIdx].macUeCfg, 0, sizeof(MacUeCfg));
- ret = duBuildAndSendUeCreateReqToMac(ueCcchCtxt->cellId, ueCcchCtxt->gnbDuUeF1apId, NULL,
+ 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");
*
* ****************************************************************/
-uint8_t duBuildAndSendUeCreateReqToMac(uint16_t cellId, uint8_t gnbDuUeF1apId, DuUeCfg *ueCfgDb, MacUeCfg *duMacUeCfg)
+uint8_t duBuildAndSendUeCreateReqToMac(uint16_t cellId, uint8_t gnbDuUeF1apId, uint16_t crnti, DuUeCfg *ueCfgDb, MacUeCfg *duMacUeCfg)
{
uint8_t ret = ROK;
MacUeCfg *macUeCfg = NULLP;
memset(&pst, 0, sizeof(Pst));
- ret = fillMacUeCfg(cellId, gnbDuUeF1apId, ueCfgDb, duMacUeCfg);
+ ret = fillMacUeCfg(cellId, gnbDuUeF1apId, crnti, ueCfgDb, duMacUeCfg);
if(ret == RFAILED)
{
DU_LOG("\nERROR --> DU APP : Failed to fill MacUeCfg at duBuildAndSendUeCreateReqToMac()");
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 Process RACH resource response from MAC
+ *
+ * @details
+ *
+ * Function : DuProcMacRachRsrcRsp
+ * Functionality:
+ * Process RACH resource response from MAC
+ *
+ * @params[in] Post structure
+ * RACH resource response
+ * @return ROK - success
+ * RFAILED - failure
+ *
+ * ****************************************************************/
+uint8_t DuProcMacRachRsrcRsp(Pst *pst, MacRachRsrcRsp *rachRsrcRsp)
+{
+ uint8_t ret = RFAILED;
+ uint16_t cellIdx = 0;
+ DuCellCb *cellCb = NULLP;
+ DuUeCb *ueCb = NULLP;
+
+ DU_LOG("\nINFO --> DU APP : Received RACH Resource Response from MAC. Cell ID [%d] UE ID [%d]",
+ rachRsrcRsp->cellId, rachRsrcRsp->ueId);
+
+ if(rachRsrcRsp->result == MAC_DU_APP_RSP_OK)
+ {
+ DU_LOG("\nINFO : DU APP : RACH Resource Response from MAC : Result [SUCCESS]");
+
+ /* Fetch Cell Cb */
+ GET_CELL_IDX(rachRsrcRsp->cellId, cellIdx);
+ if(duCb.actvCellLst[cellIdx] && (duCb.actvCellLst[cellIdx]->cellId == rachRsrcRsp->cellId))
+ {
+ 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("\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;
+}
+
/*******************************************************************
*
* @brief To update DuUeCb Mac Cfg
{
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((BuildAndSendUeCtxtRsp(cfgRsp->cellId, cfgRsp->ueId)) != ROK)
- {
- DU_LOG("\nERROR -> DU APP : Failure in BuildAndSendUeCtxtRsp()");
- return RFAILED;
- }
- }
- else
- {
- DU_LOG("\nERROR -> DU APP : Failure in updating DU UE CB");
- return RFAILED;
- }
- }
+ 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)
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;
}
}
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))
+ (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((BuildAndSendUeCtxtRsp(cfgRsp->cellId, cfgRsp->ueId)) != 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 : Failure in BuildAndSendUeCtxtRsp");
+ 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;
}
}
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;
}
}
if(macUeCfg)
{
memset(macUeCfg, 0, sizeof(MacUeCfg));
- ret = fillMacUeCfg(cellId, duUeF1apId, 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
memset(&ueCb->macUeCfg, 0, sizeof(MacUeCfg));
/* Since UE attach has not yet happened, crnti is unknow. Hence passing 0 */
- ret = duBuildAndSendUeCreateReqToMac(cellId, ueCb->gnbDuUeF1apId, duUeCfg, &ueCb->macUeCfg);
+ 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");
uint8_t duHdlRlcUlData(Pst *pst, KwuDatIndInfo* datInd, Buffer *mBuf);
uint8_t cmPkRlcDatReq(Pst * pst,RlcDatReqInfo* datReq,Buffer * mBuf);
-uint8_t duBuildAndSendUeCreateReqToMac(uint16_t cellId, uint8_t duUeF1apId, DuUeCfg *ueCfgDb, MacUeCfg *duMacUeCfg);
+uint8_t duBuildAndSendUeCreateReqToMac(uint16_t cellId, uint8_t duUeF1apId, uint16_t crnti, DuUeCfg *ueCfgDb, MacUeCfg *duMacUeCfg);
uint8_t duBuildAndSendUeCreateReqToRlc(uint16_t cellId, uint8_t duUeF1apId, DuUeCfg *ueCfgDb, RlcUeCfg *duRlcUeCfg);
uint8_t duCreateUeCb(UeCcchCtxt *ueCcchCtxt, uint32_t gnbCuUeF1apId);
uint8_t duProcUlCcchInd(UlCcchIndInfo *ulCcchIndInfo);
#define RIC_IP_V6_ADDR "0000:0000:0000:0000:0000:0000:0000:0011"
#ifndef O1_ENABLE
-#define DU_IP_V4_ADDR (char*[]){"192.168.130.85", "192.168.130.83"}
+#define DU_IP_V4_ADDR (char*[]){"192.168.130.81", "192.168.130.83"}
#define DU_SCTP_PORT (int[]){36421, 36422}
-#define RIC_IP_V4_ADDR "192.168.130.87"
+#define RIC_IP_V4_ADDR "192.168.130.80"
#define RIC_SCTP_PORT_TO_DU (int[]){36421, 36422}
#endif