1 /*******************************************************************************
2 ################################################################################
3 # Copyright (c) [2017-2019] [Radisys] #
5 # Licensed under the Apache License, Version 2.0 (the "License"); #
6 # you may not use this file except in compliance with the License. #
7 # You may obtain a copy of the License at #
9 # http://www.apache.org/licenses/LICENSE-2.0 #
11 # Unless required by applicable law or agreed to in writing, software #
12 # distributed under the License is distributed on an "AS IS" BASIS, #
13 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. #
14 # See the License for the specific language governing permissions and #
15 # limitations under the License. #
16 ################################################################################
17 *******************************************************************************/
18 /* This file contains UE management handling functionality for DU APP */
19 #include "common_def.h"
29 #include "du_app_mac_inf.h"
30 #include "du_app_rlc_inf.h"
34 #include "du_f1ap_msg_hdl.h"
35 #include "du_ue_mgr.h"
38 #include "AlarmInterface.h"
39 #include "CmInterface.h"
42 DuRlcUeReestablishReq packRlcUeReestablishReqOpts[] =
44 packDuRlcUeReestablishReq, /* Loose coupling */
45 RlcProcUeReestablishReq, /* TIght coupling */
46 packDuRlcUeReestablishReq /* Light weight-loose coupling */
49 DuMacDlCcchInd packMacDlCcchIndOpts[] =
51 packMacDlCcchInd, /* Loose coupling */
52 MacProcDlCcchInd, /* TIght coupling */
53 packMacDlCcchInd /* Light weight-loose coupling */
56 DuMacUeCreateReq packMacUeCreateReqOpts[] =
58 packDuMacUeCreateReq, /* Loose coupling */
59 MacProcUeCreateReq, /* TIght coupling */
60 packDuMacUeCreateReq /* Light weight-loose coupling */
63 DuRlcUeCreateReq packRlcUeCreateReqOpts[] =
65 packDuRlcUeCreateReq, /* Loose coupling */
66 RlcProcUeCreateReq, /* TIght coupling */
67 packDuRlcUeCreateReq /* Light weight-loose coupling */
70 DuDlRrcMsgToRlcFunc duSendDlRrcMsgToRlcOpts[] =
72 packDlRrcMsgToRlc, /* Loose coupling */
73 RlcProcDlRrcMsgTransfer, /* Tight coupling */
74 packDlRrcMsgToRlc /* Light weight-loose coupling */
77 DuRlcUeReconfigReq packRlcUeReconfigReqOpts[] =
79 packDuRlcUeReconfigReq, /* Loose coupling */
80 RlcProcUeReconfigReq, /* TIght coupling */
81 packDuRlcUeReconfigReq /* Light weight-loose coupling */
84 DuMacUeReconfigReq packMacUeReconfigReqOpts[] =
86 packDuMacUeReconfigReq, /* Loose coupling */
87 MacProcUeReconfigReq, /* TIght coupling */
88 packDuMacUeReconfigReq /* Light weight-loose coupling */
91 DuMacRachRsrcReq packMacRachRsrcReqOpts[] =
93 packDuMacRachRsrcReq, /* Loose coupling */
94 MacProcRachRsrcReq, /* Tight coupling */
95 packDuMacRachRsrcReq /* Light weight-loose coupling */
98 DuRlcDlUserDataToRlcFunc duSendRlcDlUserDataToRlcOpts[] =
100 packRlcDlUserDataToRlc, /* Loose coupling */
101 RlcProcDlUserDataTransfer, /* Tight coupling */
102 packRlcDlUserDataToRlc /* Light weight-loose coupling */
105 DuMacRachRsrcRel packMacRachRsrcRelOpts[] =
107 packDuMacRachRsrcRel, /* Loose coupling */
108 MacProcRachRsrcRel, /* Tight coupling */
109 packDuMacRachRsrcRel /* Light weight-loose coupling */
112 DuMacUeDeleteReq packMacUeDeleteReqOpts[] =
114 packDuMacUeDeleteReq, /* Loose coupling */
115 MacProcUeDeleteReq, /* TIght coupling */
116 packDuMacUeDeleteReq /* Light weight-loose coupling */
119 DuRlcUeDeleteReq packRlcUeDeleteReqOpts[] =
121 packDuRlcUeDeleteReq, /* Loose coupling */
122 RlcProcUeDeleteReq, /* TIght coupling */
123 packDuRlcUeDeleteReq /* Light weight-loose coupling */
126 DuMacUeResetReq packMacUeResetReqOpts[] =
128 packDuMacUeResetReq, /* Loose coupling */
129 MacProcUeResetReq, /* TIght coupling */
130 packDuMacUeResetReq /* Light weight-loose coupling */
133 /*******************************************************************
135 * @brief Processes UE's max retransmission information received from RLC
139 * Function : DuProcRlcMaxRetransInd
142 * Processes max retransmission reached information received from RLC
144 * @params[in] Post structure
145 * Pointer to RlcMaxRetransInfo
146 * @return ROK - success
149 * *****************************************************************/
151 uint8_t DuProcRlcMaxRetransInd(Pst *pst, RlcMaxRetransInfo *maxRetransInfo)
153 uint8_t ueId = 0, ret = RFAILED;
154 uint16_t cellIdx = 0,crnti=0;
158 GET_CELL_IDX(maxRetransInfo->cellId, cellIdx);
160 if(duCb.actvCellLst[cellIdx]!=NULLP)
162 ueId = maxRetransInfo->ueId;
163 GET_CRNTI(crnti, ueId);
164 if(duCb.actvCellLst[cellIdx]->ueCb[ueId-1].crnti == crnti)
166 /*TODO: complete the processing of max retransmission */
170 DU_LOG("\nERROR --> DU APP : DuProcRlcMaxRetransInd(): CRNTI [%d] not found", crnti);
173 DU_LOG("\nERROR --> DU APP : DuProcRlcMaxRetransInd(): Cell Id[%d] is not found", maxRetransInfo->cellId);
175 DU_FREE_SHRABL_BUF(pst->region, pst->pool, maxRetransInfo, sizeof(RlcMaxRetransInfo));
181 /******************************************************************
183 * @brief Function to return Drb LcId
187 * Function : getDrbLcId
189 * Functionality: Function to return Drb LcId
191 * @params[in] drbBitMap
193 * Returns: lcId - SUCCESS
195 *****************************************************************/
197 uint8_t getDrbLcId(uint32_t *drbBitMap)
199 uint8_t bitMask = 1, bitPos = 0;
200 bitPos = MIN_DRB_LCID;
202 while(bitPos <= MAX_DRB_LCID)
204 if((*drbBitMap & (bitMask << bitPos)) == 0)
206 *drbBitMap = ((bitMask << bitPos)| *drbBitMap);
214 DU_LOG("\nERROR --> DU_APP: Max LC Reached in getDrbLcId()");
218 /*******************************************************************
220 * @brief Function to fillDlUserDataInfo
224 * Function : fillDlUserDataInfo
227 * Function to fillDlUserDataInfo
232 * @return ROK - success
235 * ****************************************************************/
237 uint8_t fillDlUserDataInfo(uint32_t teId, RlcDlUserDataInfo *dlDataMsgInfo)
241 /*Traversing the duCb to find the CellId, UeId, LCID corresponding to TEID*/
242 for(teIdx = 0; teIdx < duCb.numTeId; teIdx++)
244 if(duCb.upTnlCfg[teIdx] && (duCb.upTnlCfg[teIdx]->tnlCfg1 != NULLP))
246 if(duCb.upTnlCfg[teIdx]->tnlCfg1->teId == teId)
248 dlDataMsgInfo->cellId = duCb.upTnlCfg[teIdx]->cellId;
249 dlDataMsgInfo->ueId = duCb.upTnlCfg[teIdx]->ueId;
250 dlDataMsgInfo->rbId = duCb.upTnlCfg[teIdx]->drbId;
258 /*******************************************************************
260 * @brief Build and Send DL Data Message transfer to RLC
264 * Function : duBuildAndSendDlUserDataToRlc
267 * Build and Send DL Data Message transfer to RLC
269 * @params[in] Cell ID
271 * Logical Channgel ID
274 * @return ROK - success
277 * ****************************************************************/
279 uint8_t duBuildAndSendDlUserDataToRlc(uint16_t msgLen, EgtpMsg *egtpMsg)
281 uint8_t ret = RFAILED;
283 RlcDlUserDataInfo *dlDataMsgInfo = NULLP;
285 DU_ALLOC_SHRABL_BUF(dlDataMsgInfo, sizeof(RlcDlUserDataInfo));
288 DU_LOG("\nERROR --> DU_APP : Memory allocation failed for dlDataMsgInfo in duHdlEgtpDlData()");
291 memset(dlDataMsgInfo, 0, sizeof(RlcDlUserDataInfo));
292 dlDataMsgInfo->dlMsg = egtpMsg->msg;
293 dlDataMsgInfo->msgLen = msgLen;
295 /* Filling DL DATA Msg Info */
296 if(fillDlUserDataInfo(egtpMsg->msgHdr.teId, dlDataMsgInfo) == ROK)
298 /* Filling post structure and sending msg */
299 FILL_PST_DUAPP_TO_RLC(pst, RLC_DL_INST, EVENT_DL_USER_DATA_TRANS_TO_RLC);
300 DU_LOG("\nDEBUG --> DU_APP : Sending User Data Msg to RLC [TEID, nPDU]:[%d, %d]\n",\
301 egtpMsg->msgHdr.teId, egtpMsg->msgHdr.nPdu.val);
302 ret = (*duSendRlcDlUserDataToRlcOpts[pst.selector])(&pst, dlDataMsgInfo);
306 DU_LOG("\nERROR --> DU_APP : Failed to send User Data to RLC in duHdlEgtpDlData()");
307 ODU_PUT_MSG_BUF(dlDataMsgInfo->dlMsg);
308 DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL, dlDataMsgInfo, sizeof(RlcDlUserDataInfo));
313 /*******************************************************************
315 * @brief Handles EGTP data from CU
319 * Function : duHdlEgtpData
322 * Processes EGTP header and sends data to RLC
324 * @params[in] Pointer to EGTP Message
325 * @return ROK - success
328 * ****************************************************************/
329 uint8_t duHdlEgtpDlData(EgtpMsg *egtpMsg)
333 #ifdef CALL_FLOW_DEBUG_LOG
334 DU_LOG("\nCall Flow: ENTEGTP -> ENTDUAPP : EVENT_HDL_RECV_DL_DATA\n");
337 DU_LOG("\nDEBUG --> DU_APP : Processing DL data in duHdlEgtpDlData()");
341 DU_LOG("\nERROR --> DU_APP : Recevied Dl Data is NULLP in duHdlEgtpDlData()");
344 ODU_GET_MSG_LEN(egtpMsg->msg, (MsgLen *)&msgLen);
345 if(duBuildAndSendDlUserDataToRlc(msgLen, egtpMsg) != ROK)
347 DU_LOG("\nERROR --> DU_APP : Failed to build DL USer Data in duHdlEgtpDlData()");
353 /******************************************************************
355 * @brief Builds and Sends DL CCCH Ind to MAC
359 * Function : duBuildAndSendDlCcchInd
361 * Functionality: Builds and sends DL CCCH Ind Msg to MAC
363 * @params[in] dlCcchMsg - uint8_t*
364 * @return ROK - success
367 * ****************************************************************/
368 uint8_t duBuildAndSendDlCcchInd(uint16_t *cellId, uint16_t *crnti, \
369 DlCcchMsgType msgType, uint16_t dlCcchMsgSize, uint8_t *dlCcchMsg)
373 DlCcchIndInfo *dlCcchIndInfo = NULLP;
376 DU_LOG("\nDEBUG --> DU APP : Building and Sending DL CCCH Ind to MAC");
378 DU_ALLOC_SHRABL_BUF(dlCcchIndInfo, sizeof(DlCcchIndInfo));
382 DU_LOG("\nERROR --> DU APP : Memory alloc failed while building DL CCCH Ind");
386 dlCcchIndInfo->cellId = *cellId;
387 dlCcchIndInfo->crnti = *crnti;
388 dlCcchIndInfo->msgType = msgType;
389 dlCcchIndInfo->dlCcchMsgLen = dlCcchMsgSize;
391 DU_ALLOC_SHRABL_BUF(dlCcchIndInfo->dlCcchMsg, dlCcchIndInfo->dlCcchMsgLen);
392 if(!dlCcchIndInfo->dlCcchMsg)
394 DU_LOG("\nERROR --> DU APP : Memory alloc failed while building DL CCCH Ind");
395 DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL, dlCcchIndInfo, sizeof(DlCcchIndInfo));
398 for(idx2 = 0; idx2 < dlCcchIndInfo->dlCcchMsgLen; idx2++)
400 dlCcchIndInfo->dlCcchMsg[idx2] = dlCcchMsg[idx2];
402 DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL, dlCcchMsg, dlCcchMsgSize);
405 FILL_PST_DUAPP_TO_MAC(pst, EVENT_MAC_DL_CCCH_IND);
406 ret = (*packMacDlCcchIndOpts[pst.selector])(&pst, dlCcchIndInfo);
409 DU_LOG("\nERROR --> DU_APP : Failure in sending DL CCCH to MAC");
410 DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL, dlCcchIndInfo->dlCcchMsg,\
411 dlCcchIndInfo->dlCcchMsgLen);
412 DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL, dlCcchIndInfo, \
413 sizeof(DlCcchIndInfo));
421 /*******************************************************************
423 * @brief Build and Send DL RRC Message transfer to RLC
427 * Function : duBuildAndSendDlRrcMsgToRlc
430 * Build and Send DL RRC Message transfer to RLC
432 * @params[in] Cell ID
434 * Logical Channgel ID
437 * @return ROK - success
440 * ****************************************************************/
441 uint8_t duBuildAndSendDlRrcMsgToRlc(uint16_t cellId, DuRlcUeCfg ueCfg, F1DlRrcMsg *f1DlRrcMsg)
446 RlcDlRrcMsgInfo *dlRrcMsgInfo = NULLP;
450 DU_LOG("\nERROR --> DU APP : Received Dl RRC Msg is NULL at duBuildAndSendDlRrcMsgToRlc()");
454 /*As per Spec ORAN WG8 AAD, lcId for DL RRC range from 1...3*/
455 if((f1DlRrcMsg->srbId < SRB1_LCID) || (f1DlRrcMsg->srbId > SRB3_LCID))
457 DU_LOG("\nERROR --> DU APP : Received SRBID for this Dl RRC Msg is not valid");
461 DU_ALLOC_SHRABL_BUF(dlRrcMsgInfo, sizeof(RlcDlRrcMsgInfo));
465 DU_LOG("\nERROR --> DU APP : Memory allocation failed for dlRrcMsgInfo in \
466 duBuildAndSendDlRrcMsgToRlc");
467 DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL, f1DlRrcMsg->rrcMsgPdu, f1DlRrcMsg->rrcMsgSize);
471 /* Filling up the RRC msg info */
472 dlRrcMsgInfo->cellId = cellId;
473 dlRrcMsgInfo->ueId = ueCfg.ueId;
474 for(lcIdx = 0; lcIdx <= MAX_NUM_LC; lcIdx++)
476 if(ueCfg.rlcLcCfg[lcIdx].rlcBearerCfg.lcId == f1DlRrcMsg->srbId)
478 dlRrcMsgInfo->lcId = f1DlRrcMsg->srbId;
482 if(lcIdx == (MAX_NUM_LC + 1))
484 DU_LOG("\nERROR --> DU APP : (duBuildAndSendDlRrcMsgToRlc) SRB for this DL_RRC msg is not configured.");
485 DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL, f1DlRrcMsg->rrcMsgPdu, f1DlRrcMsg->rrcMsgSize);
489 dlRrcMsgInfo->execDup = f1DlRrcMsg->execDup;
490 dlRrcMsgInfo->deliveryStaRpt = f1DlRrcMsg->deliveryStatRpt;
491 dlRrcMsgInfo->msgLen = f1DlRrcMsg->rrcMsgSize;
492 dlRrcMsgInfo->rrcMsg = f1DlRrcMsg->rrcMsgPdu;
494 /* Filling post structure and sending msg */
495 FILL_PST_DUAPP_TO_RLC(pst, RLC_DL_INST, EVENT_DL_RRC_MSG_TRANS_TO_RLC);
496 DU_LOG("\nDEBUG --> DU_APP: Sending Dl RRC Msg to RLC \n");
497 ret = (*duSendDlRrcMsgToRlcOpts[pst.selector])(&pst, dlRrcMsgInfo);
500 DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL, f1DlRrcMsg->rrcMsgPdu, f1DlRrcMsg->rrcMsgSize);
501 DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL, dlRrcMsgInfo, sizeof(RlcDlRrcMsgInfo));
510 /******************************************************************
512 * @brief Process DL RRC Msg recevied from F1AP
516 * Function : duProcDlRrcMsg
518 * Functionality: Process DL RRC Msg recevied from F1AP
520 * @params[in] dlCcchMsg - uint8_t*
521 * @return ROK - success
524 * ****************************************************************/
526 uint8_t duProcDlRrcMsg(F1DlRrcMsg *dlRrcMsg)
529 uint16_t crnti, cellId, cellIdx;
530 bool ueCcchCtxtFound = false;
531 bool ueFound = false;
535 if(dlRrcMsg->srbId == SRB0_LCID) //RRC connection setup
537 for(ueIdx=0; ueIdx<duCb.numUe; ueIdx++)
539 if(dlRrcMsg->gnbDuUeF1apId == duCb.ueCcchCtxt[ueIdx].gnbDuUeF1apId)
541 ueCcchCtxtFound = true;
542 crnti = duCb.ueCcchCtxt[ueIdx].crnti;
543 cellId = duCb.ueCcchCtxt[ueIdx].cellId;
550 ret = duBuildAndSendDlCcchInd(&cellId, &crnti, RRC_SETUP, dlRrcMsg->rrcMsgSize, dlRrcMsg->rrcMsgPdu);
553 DU_LOG("\nERROR --> DU APP : Failed to build DlCcch Ind at procDlRrcMsgTrans()");
557 if(duCb.actvCellLst[cellId-1] == NULLP)
559 DU_LOG("\nERROR --> DU APP : cellId [%d] does not exist", cellId);
562 if(duCb.actvCellLst[cellId-1]->numActvUes < MAX_NUM_UE)
564 ret = duCreateUeCb(&duCb.ueCcchCtxt[ueIdx], dlRrcMsg->gnbCuUeF1apId);
567 DU_LOG("\nERROR --> DU APP : Failed to createUeCb for cellId [%d] at procDlRrcMsgTrans()", \
568 duCb.ueCcchCtxt[ueIdx].cellId);
573 DU_LOG("\nERROR --> DU_APP: Max Active UEs has reached at procDlRrcMsgTrans()");
580 for(cellIdx = 0; cellIdx < MAX_NUM_CELL; cellIdx++)
582 for(ueIdx = 0 ; ueIdx < MAX_NUM_UE; ueIdx++)
584 if(duCb.actvCellLst[cellIdx] && (dlRrcMsg->gnbCuUeF1apId == duCb.actvCellLst[cellIdx]->ueCb[ueIdx].gnbCuUeF1apId)
585 && (dlRrcMsg->gnbDuUeF1apId == duCb.actvCellLst[cellIdx]->ueCb[ueIdx].gnbDuUeF1apId))
588 ret = duBuildAndSendDlRrcMsgToRlc(duCb.actvCellLst[cellIdx]->cellId, \
589 duCb.actvCellLst[cellIdx]->ueCb[ueIdx].duRlcUeCfg, dlRrcMsg);
592 DU_LOG("\nERROR --> DU_APP: duBuildAndSendDlRrcMsgToRlc() Failed for UE ID:%d", dlRrcMsg->gnbDuUeF1apId);
603 DU_LOG("\nERROR --> DU_APP: UE ID [%d] not found", dlRrcMsg->gnbDuUeF1apId);
610 /******************************************************************
612 * @brief Processes UL CCCH Ind recvd from MAC
616 * Function : duProcUlCcchInd
618 * Functionality: Processes UL CCCH Ind recvd from MAC
620 * @params[in] UlCcchIndInfo *ulCcchIndInfo
621 * @return ROK - success
624 * ****************************************************************/
625 uint8_t duProcUlCcchInd(UlCcchIndInfo *ulCcchIndInfo)
629 int32_t gnbDuUeF1apId = 0;
631 if(ulCcchIndInfo->crnti)
633 GET_UE_ID(ulCcchIndInfo->crnti, gnbDuUeF1apId);
637 DU_LOG("\nERROR --> DU_APP : Received invalid CRNTI [%d] ", ulCcchIndInfo->crnti);
641 /* Store Ue mapping */
642 duCb.ueCcchCtxt[duCb.numUe].gnbDuUeF1apId = (uint32_t)gnbDuUeF1apId;
643 duCb.ueCcchCtxt[duCb.numUe].crnti = ulCcchIndInfo->crnti;
644 duCb.ueCcchCtxt[duCb.numUe].cellId = ulCcchIndInfo->cellId;
648 ret = (BuildAndSendInitialRrcMsgTransfer(gnbDuUeF1apId, ulCcchIndInfo->crnti, ulCcchIndInfo->ulCcchMsgLen,
649 ulCcchIndInfo->ulCcchMsg));
652 DU_LOG("\nERROR --> DU_APP : BuildAndSendInitialRrcMsgTransfer failed");
655 DU_FREE_SHRABL_BUF(MAC_MEM_REGION, MAC_POOL, ulCcchIndInfo->ulCcchMsg, ulCcchIndInfo->ulCcchMsgLen);
656 DU_FREE_SHRABL_BUF(MAC_MEM_REGION, MAC_POOL, ulCcchIndInfo, sizeof(UlCcchIndInfo));
662 /******************************************************************
664 * @brief Fills Default UL LC Cfg
668 * Function : fillDefaultUlLcCfg
670 * Functionality: Fills Default UL LC Cfg
672 * @params[in] UlLcCfg *ulLcCfg
674 *****************************************************************/
675 void fillDefaultUlLcCfg(UlLcCfg *ulLcCfg)
677 ulLcCfg->priority = LC_PRIORITY_1;
678 ulLcCfg->lcGroup = 0;
679 ulLcCfg->schReqId = 0;
680 ulLcCfg->pbr = PBR_KBPS_INFINITY;
681 ulLcCfg->bsd = BSD_MS_1000;
684 /******************************************************************
686 * @brief Fills Initial DL Bandwidth Part
690 * Function : fillDefaultInitDlBwp
692 * Functionality: Fills Initial DL Bandwidth Part
694 * @params[in] InitialDlBwp *initDlBwp
695 * @return ROK - success
698 *****************************************************************/
699 uint8_t fillDefaultInitDlBwp(InitialDlBwp *initDlBwp)
702 uint8_t freqDomainResource[FREQ_DOM_RSRC_SIZE] = {0};
703 uint8_t coreset0EndPrb, coreset1StartPrb, coreset1NumPrb;
707 /* Filling PDCCH Config */
708 initDlBwp->pdcchPresent = TRUE;
709 if(initDlBwp->pdcchPresent)
711 initDlBwp->pdcchCfg.numCRsetToAddMod = PDCCH_CTRL_RSRC_SET_ONE_ID;
712 memset(initDlBwp->pdcchCfg.cRSetToAddModList, 0, MAX_NUM_CRSET);
713 if(initDlBwp->pdcchCfg.numCRsetToAddMod <= MAX_NUM_CRSET)
715 initDlBwp->pdcchCfg.cRSetToAddModList[idx].cRSetId = PDCCH_CTRL_RSRC_SET_ONE_ID;
716 memset(initDlBwp->pdcchCfg.cRSetToAddModList[idx].freqDomainRsrc, 0, FREQ_DOM_RSRC_SIZE);
717 coreset0EndPrb = CORESET0_END_PRB;
718 coreset1StartPrb = coreset0EndPrb +6;
719 coreset1NumPrb = CORESET1_NUM_PRB;
720 /* calculate the PRBs */
721 fillCoresetFeqDomAllocMap(((coreset1StartPrb)/6), (coreset1NumPrb/6), freqDomainResource);
722 memcpy(initDlBwp->pdcchCfg.cRSetToAddModList[idx].freqDomainRsrc, freqDomainResource, FREQ_DOM_RSRC_SIZE);
724 initDlBwp->pdcchCfg.cRSetToAddModList[idx].duration = PDCCH_CTRL_RSRC_SET_ONE_DURATION;
725 initDlBwp->pdcchCfg.cRSetToAddModList[idx].cceRegMappingType = CCE_REG_MAPPINGTYPE_PR_NONINTERLEAVED;
726 initDlBwp->pdcchCfg.cRSetToAddModList[idx].precoderGranularity = ALL_CONTIGUOUS_RBS;
727 initDlBwp->pdcchCfg.cRSetToAddModList[idx].dmrsScramblingId = SCRAMBLING_ID;
729 initDlBwp->pdcchCfg.numCRsetToRel = 0;
731 /* Filling Serach Space */
732 initDlBwp->pdcchCfg.numSearchSpcToAddMod = PDCCH_CTRL_RSRC_SET_ONE_ID;
733 memset(initDlBwp->pdcchCfg.searchSpcToAddModList, 0, MAX_NUM_CRSET);
734 if(initDlBwp->pdcchCfg.numSearchSpcToAddMod <= MAX_NUM_CRSET)
736 initDlBwp->pdcchCfg.searchSpcToAddModList[idx].searchSpaceId = PDCCH_SRCH_SPC_TWO_ID;
737 initDlBwp->pdcchCfg.searchSpcToAddModList[idx].cRSetId = PDCCH_CTRL_RSRC_SET_ONE_ID;
738 initDlBwp->pdcchCfg.searchSpcToAddModList[idx].mSlotPeriodicityAndOffset = SLOTPERIODICITYANDOFFSET_PR_SL1;
739 memset(initDlBwp->pdcchCfg.searchSpcToAddModList[idx].mSymbolsWithinSlot, 0, MONITORING_SYMB_WITHIN_SLOT_SIZE);
740 initDlBwp->pdcchCfg.searchSpcToAddModList[idx].mSymbolsWithinSlot[idx] = PDCCH_SYMBOL_WITHIN_SLOT;
741 initDlBwp->pdcchCfg.searchSpcToAddModList[idx].numCandidatesAggLevel1 = AGGREGATIONLEVEL_N8;
742 initDlBwp->pdcchCfg.searchSpcToAddModList[idx].numCandidatesAggLevel2 = AGGREGATIONLEVEL_N8;
743 initDlBwp->pdcchCfg.searchSpcToAddModList[idx].numCandidatesAggLevel4 = AGGREGATIONLEVEL_N4;
744 initDlBwp->pdcchCfg.searchSpcToAddModList[idx].numCandidatesAggLevel8 = AGGREGATIONLEVEL_N2;
745 initDlBwp->pdcchCfg.searchSpcToAddModList[idx].numCandidatesAggLevel16 = AGGREGATIONLEVEL_N1;
746 initDlBwp->pdcchCfg.searchSpcToAddModList[idx].searchSpaceType = SEARCHSPACETYPE_PR_UE_SPECIFIC;
747 initDlBwp->pdcchCfg.searchSpcToAddModList[idx].ueSpecificDciFormat = PDCCH_SRCH_SPC_TWO_UE_SPEC_DCI_FORMAT;
749 initDlBwp->pdcchCfg.numSearchSpcToRel = 0;
752 /* Filling PDSCH Config */
753 initDlBwp->pdschPresent = TRUE;
754 if(initDlBwp->pdschPresent)
756 initDlBwp->pdschCfg.dmrsDlCfgForPdschMapTypeA.addPos = ADDITIONALPOSITION_POS0;
757 initDlBwp->pdschCfg.resourceAllocType = RESOURCEALLOCATION_TYPE1;
759 initDlBwp->pdschCfg.numTimeDomRsrcAlloc = NUM_TIME_DOM_RSRC_ALLOC;
762 initDlBwp->pdschCfg.timeDomRsrcAllociList[idx].mappingType = MAPPING_TYPEA;
763 initDlBwp->pdschCfg.timeDomRsrcAllociList[idx].startSymbol = PDSCH_START_SYMBOL;
764 initDlBwp->pdschCfg.timeDomRsrcAllociList[idx].symbolLength = PDSCH_LENGTH_SYMBOL;
765 initDlBwp->pdschCfg.timeDomRsrcAllociList[idx].startSymbolAndLength = calcSliv(PDSCH_START_SYMBOL, PDSCH_LENGTH_SYMBOL);
768 DU_ALLOC_SHRABL_BUF(initDlBwp->pdschCfg.timeDomRsrcAllociList[idx].k0, sizeof(uint8_t));
769 if(initDlBwp->pdschCfg.timeDomRsrcAllociList[idx].k0 == NULLP)
771 DU_LOG("\nERROR --> DUAPP : Failed to allocate memory to K0 in fillDefaultInitDlBwp");
774 if(initDlBwp->pdschCfg.timeDomRsrcAllociList[idx].k0)
776 *(initDlBwp->pdschCfg.timeDomRsrcAllociList[idx].k0) = 1;
778 initDlBwp->pdschCfg.timeDomRsrcAllociList[idx].mappingType = MAPPING_TYPEA;
779 initDlBwp->pdschCfg.timeDomRsrcAllociList[idx].startSymbol = PDSCH_START_SYMBOL;
780 initDlBwp->pdschCfg.timeDomRsrcAllociList[idx].symbolLength = PDSCH_LENGTH_SYMBOL;
781 initDlBwp->pdschCfg.timeDomRsrcAllociList[idx].startSymbolAndLength = calcSliv(PDSCH_START_SYMBOL, PDSCH_LENGTH_SYMBOL);
783 initDlBwp->pdschCfg.rbgSize = RBG_SIZE_CONFIG1;
784 initDlBwp->pdschCfg.numCodeWordsSchByDci = CODEWORDS_SCHED_BY_DCI_N1;
785 initDlBwp->pdschCfg.bundlingType = TYPE_STATIC_BUNDLING;
786 initDlBwp->pdschCfg.bundlingInfo.StaticBundling.size = 0;
793 /******************************************************************
795 * @brief Fills Initial UL Bandwidth Part
799 * Function : fillDefaultInitUlBwp
801 * Functionality: Fills Initial UL Bandwidth Part
803 * @params[in] InitialUlBwp *initUlBwp
806 *****************************************************************/
807 void fillDefaultInitUlBwp(InitialUlBwp *initUlBwp)
812 initUlBwp->pucchPresent = FALSE;
814 /*Filling PUSCH Config */
815 initUlBwp->puschPresent = TRUE;
816 if(initUlBwp->puschPresent)
818 initUlBwp->puschCfg.dataScramblingId = SCRAMBLING_ID;
819 initUlBwp->puschCfg.dmrsUlCfgForPuschMapTypeA.addPos = ADDITIONALPOSITION_POS0;
820 initUlBwp->puschCfg.dmrsUlCfgForPuschMapTypeA.transPrecodDisabled. \
821 scramblingId0 = SCRAMBLING_ID;
822 initUlBwp->puschCfg.resourceAllocType = RESOURCEALLOCATION_TYPE1;
823 initUlBwp->puschCfg.numTimeDomRsrcAlloc = 2;
825 if(initUlBwp->puschCfg.numTimeDomRsrcAlloc <= MAX_NUM_UL_ALLOC)
827 initUlBwp->puschCfg.timeDomRsrcAllocList[idx].k2 = PUSCH_K2_CFG1;
828 initUlBwp->puschCfg.timeDomRsrcAllocList[idx].mappingType =\
830 initUlBwp->puschCfg.timeDomRsrcAllocList[idx].startSymbol = PUSCH_START_SYMBOL;
831 initUlBwp->puschCfg.timeDomRsrcAllocList[idx].symbolLength = PUSCH_LENGTH_SYMBOL;
832 initUlBwp->puschCfg.timeDomRsrcAllocList[idx].startSymbolAndLength =\
833 calcSliv(PUSCH_START_SYMBOL, PUSCH_LENGTH_SYMBOL);
836 initUlBwp->puschCfg.timeDomRsrcAllocList[idx].k2 = PUSCH_K2_CFG2;
837 initUlBwp->puschCfg.timeDomRsrcAllocList[idx].mappingType = MAPPING_TYPEA;
838 initUlBwp->puschCfg.timeDomRsrcAllocList[idx].startSymbol = PUSCH_START_SYMBOL;
839 initUlBwp->puschCfg.timeDomRsrcAllocList[idx].symbolLength = PUSCH_LENGTH_SYMBOL;
840 initUlBwp->puschCfg.timeDomRsrcAllocList[idx].startSymbolAndLength =\
841 calcSliv(PUSCH_START_SYMBOL, PUSCH_LENGTH_SYMBOL);
843 initUlBwp->puschCfg.transformPrecoder = TRANSFORM_PRECODER_DISABLED;
848 DU_LOG("\nERROR --> DU APP : Memory is NULL of InitalUlBwp");
852 /******************************************************************
854 * @brief Fills SpCell Group Info
858 * Function : fillDefaultSpCellGrpInfo
860 * Functionality: Fills Sp Cell Group Info
862 * @params[in] DuMacUeCfg *macUeCfg
863 * @return ROK - Success
866 *****************************************************************/
867 uint8_t fillDefaultSpCellGrpInfo(DuMacUeCfg *macUeCfg)
869 SpCellRecfg *spCell = NULL;
872 spCell = &macUeCfg->spCellCfg;
876 macUeCfg->spCellCfgPres = true;
878 spCell->servCellIdx = SERV_CELL_IDX;
879 /* Filling Initial Dl Bwp */
880 if((fillDefaultInitDlBwp(&spCell->servCellCfg.initDlBwp)) != ROK)
882 DU_LOG("\nERROR --> DUAPP : Failed in fillDefaultInitDlBwp");
886 spCell->servCellCfg.numDlBwpToAddOrMod = 0;
887 spCell->servCellCfg.numDlBwpToRel = 0;
888 spCell->servCellCfg.firstActvDlBwpId = ACTIVE_DL_BWP_ID;
889 spCell->servCellCfg.defaultDlBwpId = ACTIVE_DL_BWP_ID;
890 spCell->servCellCfg.bwpInactivityTmr = NULLP;
891 spCell->servCellCfg.pdschServCellCfg.maxMimoLayers = NULLP;
892 spCell->servCellCfg.pdschServCellCfg.maxCodeBlkGrpPerTb = NULLP;
893 spCell->servCellCfg.pdschServCellCfg.codeBlkGrpFlushInd = NULLP;
894 spCell->servCellCfg.pdschServCellCfg.xOverhead = NULLP;
895 spCell->servCellCfg.pdschServCellCfg.numHarqProcForPdsch = NUM_HARQ_PROC_FOR_PDSCH_N_16;
897 /* Filling Initial UL Bwp*/
898 fillDefaultInitUlBwp(&spCell->servCellCfg.initUlBwp);
899 spCell->servCellCfg.numUlBwpToAddOrMod = 0;
900 spCell->servCellCfg.numUlBwpToRel = 0;
901 spCell->servCellCfg.firstActvUlBwpId = ACTIVE_DL_BWP_ID;
905 DU_LOG("\nERROR --> DU APP : Memory is NULL for SpCellGrp");
911 /******************************************************************
913 * @brief Fills Physical Cell Group Info
917 * Function : fillDefaultPhyCellGrpInfo
919 * Functionality: Fills Physical Cell Group Info
921 * @params[in] DuMacUeCfg *macUeCfg
924 *****************************************************************/
925 void fillDefaultPhyCellGrpInfo(DuMacUeCfg *macUeCfg)
927 PhyCellGrpCfg *cellGrp = NULL;
930 cellGrp = &macUeCfg->phyCellGrpCfg;
934 macUeCfg->phyCellGrpCfgPres = true;
935 cellGrp->pdschHarqAckCodebook = PDSCH_HARQ_ACK_CODEBOOK_DYNAMIC;
936 cellGrp->pNrFr1 = P_NR_FR1;
940 DU_LOG("\nERROR --> DU APP : Memory is NULL for Physical Cell Group");
944 /******************************************************************
946 * @brief Fills Mac Cell Group Info
950 * Function : fillDefaultMacCellGrpInfo
952 * Functionality: Fills Mac Cell Group Info
954 * @params[in] DuMacUeCfg *macUeCfg
957 *****************************************************************/
958 void fillDefaultMacCellGrpInfo(DuMacUeCfg *macUeCfg)
961 MacCellGrpCfg *cellGrp = NULL;
964 cellGrp = &macUeCfg->macCellGrpCfg;
968 macUeCfg->macCellGrpCfgPres = true;
970 /* Filling Scheduling Request Config */
971 cellGrp->schReqCfg.addModListCount = 1;
972 if(cellGrp->schReqCfg.addModListCount <= MAX_NUM_SR_CFG_PER_CELL_GRP)
974 for(idx = 0; idx < cellGrp->schReqCfg.addModListCount; idx++)
976 cellGrp->schReqCfg.addModList[idx].schedReqId = SCH_REQ_ID;
977 cellGrp->schReqCfg.addModList[idx].srProhibitTmr = SR_PROHIBIT_MS_32;
978 cellGrp->schReqCfg.addModList[idx].srTransMax = SR_TRANS_MAX_N_16;
981 cellGrp->schReqCfg.relListCount = 0;
983 /* Filling Tag config */
984 cellGrp->tagCfg.addModListCount = 1;
985 if(cellGrp->tagCfg.addModListCount <= MAC_NUM_TAGS)
987 for(idx = 0; idx < cellGrp->tagCfg.addModListCount; idx++)
989 cellGrp->tagCfg.addModList[idx].tagId = TAG_ID;
990 cellGrp->tagCfg.addModList[idx].timeAlignTimer = TIME_ALIGNMENT_TIMER_INFINITY;
993 cellGrp->tagCfg.relListCount = 0;
995 /* Filling BSR config */
996 cellGrp->bsrTmrCfg.periodicTimer = BSR_PERIODIC_TIMER_SF_10;
997 cellGrp->bsrTmrCfg.retxTimer = BSR_RETX_TIMER_SF_320;
998 cellGrp->bsrTmrCfg.srDelayTimer = BSR_SR_DELAY_TMR_2560;
1000 /* Filling PHR config */
1001 cellGrp->phrCfgSetupPres = true;
1002 cellGrp->phrCfg.periodicTimer = PHR_PERIODIC_TIMER_INFINITY;
1003 cellGrp->phrCfg.prohibitTimer = PHR_PROHIBIT_TIMER_SF_0;
1004 cellGrp->phrCfg.txPowerFactor = PHR_TX_PWR_FACTOR_CHANGE_INFINITY;
1005 cellGrp->phrCfg.multiplePHR = false;
1006 cellGrp->phrCfg.dummy = false;
1007 cellGrp->phrCfg.phrType2OtherCell = false;
1008 cellGrp->phrCfg.phrOtherCG = PHR_MODE_OTHER_CG_REAL;
1010 /* Filling Drx Config */
1012 cellGrp->drxCfg.drxOnDurationTimer.onDurationTimerValInMs = DRX_ONDURATION_TIMER_VALUE_PRESENT_IN_MS;
1013 if(!cellGrp->drxCfg.drxOnDurationTimer.onDurationTimerValInMs)
1014 cellGrp->drxCfg.drxOnDurationTimer.onDurationtimerValue.subMilliSeconds = \
1015 DRX_ONDURATION_TIMER_VALUE_IN_SUBMS;
1017 cellGrp->drxCfg.drxOnDurationTimer.onDurationtimerValue.milliSeconds = \
1018 DRX_ONDURATION_TIMER_VALUE_IN_MS;
1019 cellGrp->drxCfg.drxInactivityTimer = DRX_INACTIVITY_TIMER;
1020 cellGrp->drxCfg.drxHarqRttTimerDl = DRX_HARQ_RTT_TIMER_DL;
1021 cellGrp->drxCfg.drxHarqRttTimerUl = DRX_HARQ_RTT_TIMER_UL;
1022 cellGrp->drxCfg.drxRetransmissionTimerDl = DRX_RETRANSMISSION_TIMER_DL;
1023 cellGrp->drxCfg.drxRetransmissionTimerUl = DRX_RETRANSMISSION_TIMER_UL;
1024 cellGrp->drxCfg.drxLongCycleStartOffset.drxLongCycleStartOffsetVal = DRX_LONG_CYCLE_START_OFFSET_VAL;
1025 cellGrp->drxCfg.drxLongCycleStartOffset.drxLongCycleStartOffsetChoice = DRX_LONG_CYCLE_START_OFFSET_CHOICE;
1026 cellGrp->drxCfg.shortDrxPres = DRX_SHORT_CYCLE_PRESENT;
1027 if(cellGrp->drxCfg.shortDrxPres)
1029 cellGrp->drxCfg.shortDrx.drxShortCycle = DRX_SHORT_CYCLE;
1030 cellGrp->drxCfg.shortDrx.drxShortCycleTimer = DRX_SHORT_CYCLE_TIMER;
1032 cellGrp->drxCfg.drxSlotOffset = DRX_SLOT_OFFSET;
1038 DU_LOG("\nERROR --> DU APP : Memory is NULL for Master Cell Group");
1042 /*******************************************************************
1044 * @brief Fills default modulation info for a UE
1048 * Function : fillDefaultModulation
1050 * Functionality: Fills default modulation info for a UE
1052 * @params[in] Pointer to MAC UE configuration
1053 * @return ROK - success
1056 * ****************************************************************/
1057 void fillDefaultModulation(DuMacUeCfg *ueCfg)
1059 ueCfg->dlModInfo.modOrder = MOD_ORDER_QPSK;
1060 ueCfg->dlModInfo.mcsIndex = DEFAULT_MCS;
1061 ueCfg->dlModInfo.mcsTable = MCS_TABLE_QAM64; /* Spec 38.214-Table 5.1.3.1-1 */
1063 ueCfg->ulModInfo.modOrder = MOD_ORDER_QPSK;
1064 ueCfg->ulModInfo.mcsIndex = DEFAULT_MCS;
1065 ueCfg->ulModInfo.mcsTable = MCS_TABLE_QAM64; /* Spec 38.214-Table 5.1.3.1-1 */
1068 /******************************************************************
1070 * @brief Function to fill Mac Lc Cfg for SRB1
1074 * Function : fillMacSrb1LcCfg
1076 * Functionality: Function to fill Mac Lc cfg for SRB1
1078 * @params[in] LcCfg *lcCfg, LcCfg *ueSetReqDb
1080 *****************************************************************/
1082 void fillMacSrb1LcCfg(DuLcCfg *macLcCfg)
1084 macLcCfg->lcConfig.lcId = SRB1_LCID;
1085 macLcCfg->configType = CONFIG_ADD;
1086 macLcCfg->lcConfig.drbQos = NULLP;
1087 macLcCfg->lcConfig.snssai = NULLP;
1088 macLcCfg->lcConfig.ulLcCfgPres = true;
1089 fillDefaultUlLcCfg(&macLcCfg->lcConfig.ulLcCfg);
1092 /******************************************************************
1094 * @brief Function to fill the Lc cfg from ueSetupReqDb
1098 * Function : fillMacLcCfgToAddMod
1100 * Functionality: Function to fill the Lc cfg from ueSetupReqDb
1102 * @params[in] LcCfg *lcCfg, LcCfg *ueSetReqDb
1103 * @return ROK/RFAILED
1105 *****************************************************************/
1107 uint8_t fillMacLcCfgToAddMod(DuLcCfg *macLcCfgToSend, DuLcCfg *ueLcCfgDb, DuLcCfg *oldLcCfg, Bool toUpdate)
1113 macLcCfgToSend->lcConfig.lcId = ueLcCfgDb->lcConfig.lcId;
1114 macLcCfgToSend->configType = ueLcCfgDb->configType;
1116 if(ueLcCfgDb->lcConfig.drbQos)
1117 macLcCfgToSend->lcConfig.drbQos = ueLcCfgDb->lcConfig.drbQos;
1119 macLcCfgToSend->lcConfig.drbQos = oldLcCfg->lcConfig.drbQos;
1121 macLcCfgToSend->lcConfig.drbQos = NULL;
1123 if(ueLcCfgDb->lcConfig.snssai)
1124 macLcCfgToSend->lcConfig.snssai = ueLcCfgDb->lcConfig.snssai;
1126 macLcCfgToSend->lcConfig.snssai = oldLcCfg->lcConfig.snssai;
1128 macLcCfgToSend->lcConfig.snssai = NULL;
1130 macLcCfgToSend->lcConfig.ulLcCfgPres = ueLcCfgDb->lcConfig.ulLcCfgPres;
1131 memcpy(&macLcCfgToSend->lcConfig.ulLcCfg, &ueLcCfgDb->lcConfig.ulLcCfg, sizeof(UlLcCfg));
1132 memcpy(&macLcCfgToSend->lcConfig.dlLcCfg, &ueLcCfgDb->lcConfig.dlLcCfg, sizeof(DlLcCfg));
1137 oldLcCfg->lcConfig.lcId = ueLcCfgDb->lcConfig.lcId;
1138 oldLcCfg->configType = ueLcCfgDb->configType;
1140 if(ueLcCfgDb->lcConfig.drbQos)
1142 if(oldLcCfg->lcConfig.drbQos)
1143 DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL, oldLcCfg->lcConfig.drbQos, sizeof(DrbQosInfo));
1145 DU_ALLOC_SHRABL_BUF(oldLcCfg->lcConfig.drbQos, sizeof(DrbQosInfo));
1146 if(oldLcCfg->lcConfig.drbQos == NULL)
1148 DU_LOG("\nERROR --> DU APP : Memory Alloc Failed at fillMacLcCfgToAddMod()");
1151 memcpy(oldLcCfg->lcConfig.drbQos, ueLcCfgDb->lcConfig.drbQos, sizeof(DrbQosInfo));
1154 if(ueLcCfgDb->lcConfig.snssai)
1156 if(oldLcCfg->lcConfig.snssai)
1157 DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL, oldLcCfg->lcConfig.snssai, sizeof(Snssai));
1159 DU_ALLOC_SHRABL_BUF(oldLcCfg->lcConfig.snssai, sizeof(Snssai));
1160 if(oldLcCfg->lcConfig.snssai == NULL)
1162 DU_LOG("\nERROR --> DU APP : Memory Alloc Failed at fillMacLcCfgToAddMod()");
1163 DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL, oldLcCfg->lcConfig.drbQos, sizeof(DrbQosInfo));
1166 memcpy(oldLcCfg->lcConfig.snssai, ueLcCfgDb->lcConfig.snssai, sizeof(Snssai));
1169 oldLcCfg->lcConfig.ulLcCfgPres = ueLcCfgDb->lcConfig.ulLcCfgPres;
1170 memcpy(&oldLcCfg->lcConfig.ulLcCfg, &ueLcCfgDb->lcConfig.ulLcCfg, sizeof(UlLcCfg));
1171 memcpy(&oldLcCfg->lcConfig.dlLcCfg, &ueLcCfgDb->lcConfig.dlLcCfg, sizeof(DlLcCfg));
1176 /******************************************************************
1178 * @brief Function to copy the Bit rate from ueSetupReqDb
1182 * Function : fillAmbr
1184 * Functionality: Function to copy bit Rate from ueSetupReqDb
1186 * @params[in] AmbrCfg **macAmbr, AmbrCfg *ueDbAmbr
1187 * @return ROK/RFAILED
1189 *****************************************************************/
1191 uint8_t fillAmbr(AmbrCfg **macAmbrCfgToSend, AmbrCfg *ueDbAmbr, AmbrCfg **oldMacAmbrCfg, Bool toUpdate)
1197 *macAmbrCfgToSend = ueDbAmbr;
1199 else if(oldMacAmbrCfg)
1200 *macAmbrCfgToSend = *oldMacAmbrCfg;
1210 DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL, *oldMacAmbrCfg, sizeof(AmbrCfg));
1212 DU_ALLOC_SHRABL_BUF(*oldMacAmbrCfg, sizeof(AmbrCfg));
1213 if(*oldMacAmbrCfg == NULLP)
1215 DU_LOG("\nERROR --> DU APP : Memory Alloc Failed at fillAmbr()");
1218 memset(*oldMacAmbrCfg, 0, sizeof(AmbrCfg));
1219 (*oldMacAmbrCfg)->ulBr = ueDbAmbr->ulBr;
1227 /******************************************************************
1229 * @brief Builds and Send UE ReConfig Request to MAC
1233 * Function : sendUeRecfgReqToMac
1235 * Functionality: Builds and Send UE ReConfig Request to MAC
1237 * @Params[in] MacUeRecfg pointer
1238 * @return ROK - success
1241 * ****************************************************************/
1243 uint8_t sendUeRecfgReqToMac(MacUeRecfg *macUeRecfg)
1249 FILL_PST_DUAPP_TO_MAC(pst, EVENT_MAC_UE_RECONFIG_REQ);
1253 /* Processing one Ue at a time to MAC */
1254 DU_LOG("\nDEBUG --> DU_APP: Sending Ue Reconfig Request to MAC");
1255 ret = (*packMacUeReconfigReqOpts[pst.selector])(&pst, macUeRecfg);
1258 DU_LOG("\nERROR --> DU APP : Failed to send Reconfig Request to MAC at sendUeRecfgReqToMac()");
1259 DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL, macUeRecfg, sizeof(MacUeRecfg));
1264 DU_LOG("\nERROR --> DU_APP: Received macUeRecfg is NULLP at sendUeRecfgReqToMac()");
1272 /******************************************************************
1274 * @brief update DuMacUeCfg structure
1278 * Function : updateDuMacUeCfg
1280 * Functionality: Fills DuMacUeCfg
1282 * @params[in] cellId, ueId, crnti,
1284 * DuMacUeCfg pointer
1285 * @return ROK/RFAILED
1287 *****************************************************************/
1288 uint8_t updateDuMacUeCfg(uint16_t cellId, uint8_t gnbDuUef1apId, uint16_t crnti, DuUeCfg *ueCfgDb, DuMacUeCfg *duMacUeCfg)
1290 uint8_t ret = ROK, dbIdx = 0, lcIdx = 0, cellIdx = 0;
1291 bool lcIdFound = false;
1292 DuMacUeCfg *duMacDb = NULLP;
1294 duMacUeCfg->cellId = cellId;
1295 duMacUeCfg->ueId = gnbDuUef1apId;
1296 duMacUeCfg->crnti = crnti;
1300 fillDefaultMacCellGrpInfo(duMacUeCfg);
1301 fillDefaultPhyCellGrpInfo(duMacUeCfg);
1303 if((fillDefaultSpCellGrpInfo(duMacUeCfg)) != ROK)
1305 DU_LOG("\nERROR --> DUAPP : Failed in fillDefaultSpCellGrpInfo");
1309 duMacUeCfg->ambrCfg = NULLP;
1310 fillDefaultModulation(duMacUeCfg);
1311 fillMacSrb1LcCfg(&duMacUeCfg->lcCfgList[0]);
1312 duMacUeCfg->numLcs++;
1316 if(ueCfgDb->dataTransmissionAction == STOP_TRANSMISSION)
1318 duMacUeCfg->transmissionAction = ueCfgDb->dataTransmissionAction;
1322 GET_CELL_IDX(cellId, cellIdx);
1323 if(duCb.actvCellLst[cellIdx])
1324 duMacDb = &duCb.actvCellLst[cellIdx]->ueCb[duMacUeCfg->ueId-1].duMacUeCfg;
1327 DU_LOG("\nERROR --> DU APP : Cell Id [%d] does not exist", cellId);
1330 duMacDb->macUeCfgState = UE_CFG_INPROGRESS;
1332 if(ueCfgDb->cellGrpCfg)
1334 ret = procUeRecfgCellInfo(duMacUeCfg, duMacDb, ueCfgDb->cellGrpCfg);
1337 if(duMacUeCfg->spCellCfgPres == true)
1339 if(duMacUeCfg->spCellCfg.servCellCfg.initDlBwp.pdschPresent)
1341 fillStartSymbolAndLen(duMacUeCfg->spCellCfg.servCellCfg.initDlBwp.pdschCfg.numTimeDomRsrcAlloc,\
1342 &duMacUeCfg->spCellCfg.servCellCfg.initDlBwp.pdschCfg, NULL);
1344 if(duMacUeCfg->spCellCfg.servCellCfg.initUlBwp.puschPresent)
1346 fillStartSymbolAndLen(duMacUeCfg->spCellCfg.servCellCfg.initUlBwp.puschCfg.numTimeDomRsrcAlloc,\
1347 NULL, &duMacUeCfg->spCellCfg.servCellCfg.initUlBwp.puschCfg);
1352 ret = fillAmbr(&duMacUeCfg->ambrCfg, ueCfgDb->ambrCfg , &duMacDb->ambrCfg, FALSE);
1354 ret = fillAmbr(&duMacUeCfg->ambrCfg, ueCfgDb->ambrCfg , NULL, FALSE);
1356 duFillModulationDetails(duMacUeCfg, duMacDb, ueCfgDb->ueNrCapability);
1361 fillDefaultMacCellGrpInfo(duMacUeCfg);
1362 fillDefaultPhyCellGrpInfo(duMacUeCfg);
1363 fillDefaultSpCellGrpInfo(duMacUeCfg);
1364 fillDefaultModulation(duMacUeCfg);
1365 duMacUeCfg->ambrCfg = NULLP;
1370 duMacUeCfg->drxConfigIndicatorRelease = ueCfgDb->drxConfigIndicatorRelease;
1372 if(ueCfgDb->drxCyclePres)
1374 duMacUeCfg->macCellGrpCfg.drxCfg.drxLongCycleStartOffset.drxLongCycleStartOffsetChoice = ueCfgDb->drxCycle.drxLongCycleLength;
1375 if(ueCfgDb->drxCycle.shortDrxCyclePres)
1377 duMacUeCfg->macCellGrpCfg.drxCfg.shortDrxPres = true;
1378 duMacUeCfg->macCellGrpCfg.drxCfg.shortDrx.drxShortCycle = ueCfgDb->drxCycle.shortDrxCycle.drxShortCycle;
1379 duMacUeCfg->macCellGrpCfg.drxCfg.shortDrx.drxShortCycleTimer = ueCfgDb->drxCycle.shortDrxCycle.drxShortCycleTimer;
1383 duMacUeCfg->macCellGrpCfg.drxCfg.shortDrxPres = false;
1388 /* Filling LC Context */
1389 for(dbIdx = 0; (dbIdx < ueCfgDb->numMacLcs && ret == ROK); dbIdx++)
1391 if(!ueCfgDb->macLcCfg[dbIdx].lcConfig.ulLcCfgPres)
1393 /* Filling default UL LC config in MAC if not present */
1394 ueCfgDb->macLcCfg[dbIdx].lcConfig.ulLcCfgPres = true;
1395 fillDefaultUlLcCfg(&ueCfgDb->macLcCfg[dbIdx].lcConfig.ulLcCfg);
1400 for(lcIdx = 0; lcIdx < duMacDb->numLcs; lcIdx++)
1402 if(ueCfgDb->macLcCfg[dbIdx].lcConfig.lcId == duMacDb->lcCfgList[lcIdx].lcConfig.lcId)
1405 if((ueCfgDb->macLcCfg[dbIdx].configType == CONFIG_UNKNOWN) ||
1406 (ueCfgDb->macLcCfg[dbIdx].configType == CONFIG_MOD))
1408 ueCfgDb->macLcCfg[dbIdx].configType = CONFIG_MOD;
1409 ret = fillMacLcCfgToAddMod(&duMacUeCfg->lcCfgList[dbIdx], &ueCfgDb->macLcCfg[dbIdx],\
1410 &duMacDb->lcCfgList[lcIdx], FALSE);
1420 /* ADD/DEL CONFIG */
1421 ret = fillMacLcCfgToAddMod(&duMacUeCfg->lcCfgList[dbIdx], &ueCfgDb->macLcCfg[dbIdx], NULL, FALSE);
1425 duMacUeCfg->numLcs++;
1429 DU_LOG("\nERROR --> DU APP : Failed to add Lc at Idx %d in updateDuMacUeCfg()", dbIdx);
1432 }/*End of Outer FOR loop */
1433 memcpy(&ueCfgDb->copyOfmacUeCfg, duMacUeCfg, sizeof(DuMacUeCfg));
1438 /******************************************************************
1440 * @brief Fills Rlc AM Information
1444 * Function : fillDefaultAmInfo
1446 * Functionality: Fills Rlc AM Information
1448 * @params[in] AmBearerCfg *amCfg
1451 *****************************************************************/
1452 void fillDefaultAmInfo(AmBearerCfg *amCfg)
1455 amCfg->dlAmCfg.snLenDl = AM_SIZE_12;
1456 amCfg->dlAmCfg.pollRetxTmr = T_POLL_RETRANSMIT_VAL;
1457 amCfg->dlAmCfg.pollPdu = POLL_PDU_VAL;
1458 amCfg->dlAmCfg.pollByte = POLL_BYTE_VAL;
1459 amCfg->dlAmCfg.maxRetxTh = MAX_RETX_THRESHOLD_VAL;
1462 amCfg->ulAmCfg.snLenUl = AM_SIZE_12;
1463 amCfg->ulAmCfg.reAssemTmr = T_REASSEMBLY_VAL;
1464 amCfg->ulAmCfg.statProhTmr = T_STATUS_PROHIBHIT_VAL;
1467 /******************************************************************
1469 * @brief Fills RLC UM Bi Directional Information
1473 * Function : fillDefaultUmBiInfo
1475 * Functionality: Fills RLC UM Bi Directional Information
1477 * @params[in] UmBiDirBearerCfg *umBiDirCfg
1480 *****************************************************************/
1481 void fillDefaultUmBiInfo(UmBiDirBearerCfg *umBiDirCfg)
1483 /* UL UM BI DIR INFO */
1484 umBiDirCfg->ulUmCfg.snLenUlUm = UM_SIZE_12;
1485 umBiDirCfg->ulUmCfg.reAssemTmr = T_REASSEMBLY_VAL;
1487 /* DL UM BI DIR INFO */
1488 umBiDirCfg->dlUmCfg.snLenDlUm = UM_SIZE_12;
1491 /******************************************************************
1493 * @brief Fills RLC UM Uni Directional UL Information
1497 * Function : fillDefaultUmUlInfo
1499 * Functionality: Fills RLC UM Uni Directional Info
1501 * @params[in] UmUniDirUlBearerCfg *UmUlCfg
1504 *****************************************************************/
1505 void fillDefaultUmUlInfo(UmUniDirUlBearerCfg *UmUlCfg)
1507 UmUlCfg->ulUmCfg.snLenUlUm = UM_SIZE_12;
1508 UmUlCfg->ulUmCfg.reAssemTmr = T_REASSEMBLY_VAL;
1511 /******************************************************************
1513 * @brief Fills RLC UM Uni Directional DL Information
1517 * Function : fillDefaultUmDlInfo
1519 * Functionality: Fills RLC UM Uni Directional DL Info
1521 * @params[in] UmUniDirDlBearerCfg *UmDlCfg
1524 *****************************************************************/
1525 void fillDefaultUmDlInfo(UmUniDirDlBearerCfg *UmDlCfg)
1527 UmDlCfg->dlUmCfg.snLenDlUm = UM_SIZE_12;
1530 /******************************************************************
1532 * @brief Builds Rlc Mode Default Configuration
1536 * Function : fillDefaultRlcModeCfg
1538 * Functionality: Builds Rlc Mode Default Configuration
1540 * @params[in] rlcMode, RlcBearerCfg *lcCfg
1541 * @return ROK/RFAILED
1543 *****************************************************************/
1545 uint8_t fillDefaultRlcModeCfg(uint8_t rlcMode, RlcBearerCfg *lcCfg)
1555 DU_ALLOC_SHRABL_BUF(lcCfg->u.amCfg, sizeof(AmBearerCfg));
1557 fillDefaultAmInfo(lcCfg->u.amCfg);
1560 DU_LOG("\n ERROR --> DU APP : Memory Alloc failed at AmCfg at fillDefaultRlcModeCfg()");
1566 case RLC_UM_BI_DIRECTIONAL :
1568 if(!lcCfg->u.umBiDirCfg)
1570 DU_ALLOC_SHRABL_BUF(lcCfg->u.umBiDirCfg, sizeof(UmBiDirBearerCfg));
1571 if(lcCfg->u.umBiDirCfg)
1572 fillDefaultUmBiInfo(lcCfg->u.umBiDirCfg);
1575 DU_LOG("\n ERROR --> DU APP : Memory Alloc failed at UmBiDirCfg at fillDefaultRlcModeCfg()");
1581 case RLC_UM_UNI_DIRECTIONAL_UL :
1583 if(!lcCfg->u.umUniDirUlCfg)
1585 DU_ALLOC_SHRABL_BUF(lcCfg->u.umUniDirUlCfg, sizeof(UmUniDirUlBearerCfg));
1586 if(lcCfg->u.umUniDirUlCfg)
1587 fillDefaultUmUlInfo(lcCfg->u.umUniDirUlCfg);
1590 DU_LOG("\n ERROR --> DU APP : Memory Alloc failed at UmUniDirUlCfg at fillDefaultRlcModeCfg()");
1596 case RLC_UM_UNI_DIRECTIONAL_DL :
1598 if(!lcCfg->u.umUniDirDlCfg)
1600 DU_ALLOC_SHRABL_BUF(lcCfg->u.umUniDirDlCfg, sizeof(UmUniDirDlBearerCfg));
1601 if(lcCfg->u.umUniDirDlCfg)
1602 fillDefaultUmDlInfo(lcCfg->u.umUniDirDlCfg);
1605 DU_LOG("\n ERROR --> DU APP : Memory Alloc failed at UmUniDirDlCfg at fillDefaultRlcModeCfg()");
1612 DU_LOG("\nERROR --> DUAPP: Invalid rlcMode %d at extractRlcCfgToAddMod()", rlcMode);
1619 DU_LOG("\nERROR --> DUAPP: Received LC Config is NULL");
1625 /*******************************************************************
1627 * @brief Function to fill Rlc Lc Cfg for SRB1
1631 * Function : fillRlcSrb1LcCfg
1634 * Function to fill Rlc Lc Cfg for SRB1
1636 * @params[in] Pointer to RlcBearerCfg
1637 * @return ROK/RFAILED
1639 *****************************************************************/
1641 uint8_t fillRlcSrb1LcCfg(DuRlcBearerCfg *rlcLcCfg)
1645 rlcLcCfg->rlcBearerCfg.rbId = SRB1_LCID;
1646 rlcLcCfg->rlcBearerCfg.rbType = RB_TYPE_SRB;
1647 rlcLcCfg->rlcBearerCfg.lcId = SRB1_LCID;
1648 rlcLcCfg->rlcBearerCfg.lcType = LCH_DCCH;
1649 rlcLcCfg->rlcBearerCfg.rlcMode = RLC_AM;
1650 rlcLcCfg->configType = CONFIG_ADD;
1651 ret = fillDefaultRlcModeCfg(rlcLcCfg->rlcBearerCfg.rlcMode, &rlcLcCfg->rlcBearerCfg);
1652 rlcLcCfg->rlcBearerCfg.isLcAddModRspSent = true;
1656 /*******************************************************************
1658 * @brief Processes UE ReConfig Req to RLC UL
1662 * Function : sendUeRecfgReqToRlc
1665 * Processes UE Reconfig Req to RLC UL
1667 * @params[in] Pointer to RlcUeRecfg
1668 * @return ROK - success
1671 *****************************************************************/
1673 uint8_t sendUeRecfgReqToRlc(RlcUeRecfg *rlcUeRecfg)
1678 FILL_PST_DUAPP_TO_RLC(pst, RLC_UL_INST, EVENT_RLC_UE_RECONFIG_REQ);
1681 /* Processing one Ue at a time to RLC */
1682 DU_LOG("\nDEBUG --> DU_APP: Sending Ue Reconfig Request to RLC UL");
1683 ret = (*packRlcUeReconfigReqOpts[pst.selector])(&pst, rlcUeRecfg);
1686 DU_LOG("\nERROR --> DU_APP : Failed to send Ue Reconfig Req to RLC at sendUeRecfgReqToRlc()");
1687 DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL, rlcUeRecfg, sizeof(RlcUeRecfg));
1692 DU_LOG("\nERROR --> DU_APP: Received RlcUeRecfg is NULL at sendUeRecfgReqToRlc()");
1698 /******************************************************************
1700 * @brief Fills Snssai information
1704 * Function : fillSnssaiInfo
1706 * Functionality: Fills Snssai information
1708 * @params[in] LcCfg *snssaiTobeSend, LcCfg *snssaiDb, LcCfg *oldSnssai,
1710 * @return ROK - success
1713 *****************************************************************/
1714 uint8_t fillSnssaiInfo(Snssai *snssaiTobeSend, Snssai *snssaiDb, Snssai **oldSnssai, Bool toUpdate)
1719 snssaiTobeSend = snssaiDb;
1721 snssaiTobeSend = *oldSnssai;
1723 snssaiTobeSend = NULL;
1730 DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL, *oldSnssai, sizeof(Snssai));
1732 DU_ALLOC_SHRABL_BUF(*oldSnssai, sizeof(Snssai));
1733 if(*oldSnssai == NULL)
1735 DU_LOG("\nERROR --> DU APP : Memory Alloc Failed at fillSnssaiInfo()");
1738 memcpy(*oldSnssai, snssaiDb, sizeof(Snssai));
1743 /******************************************************************
1745 * @brief Fills RlcBearerCfg structure
1749 * Function : updateRlcUeCfg
1751 * Functionality: Fills Rlc Bearer Cfg
1754 *****************************************************************/
1755 uint8_t updateRlcUeCfg(uint16_t cellId, uint8_t duUeF1apId, DuUeCfg *ueCfgDb, DuRlcUeCfg *rlcUeCfg)
1757 uint8_t ret, dbIdx, lcIdx, cellIdx;
1758 bool lcIdFound = false;
1759 DuRlcUeCfg *duRlcDb = NULLP;
1762 rlcUeCfg->cellId = cellId;
1763 rlcUeCfg->ueId = duUeF1apId;
1767 /* Initial RB being Added */
1768 ret = fillRlcSrb1LcCfg(&rlcUeCfg->rlcLcCfg[0]);
1772 memset(rlcUeCfg, 0, sizeof(DuRlcUeCfg));
1776 /* Fetch RlcDb from DuUeCb */
1777 GET_CELL_IDX(cellId, cellIdx);
1778 duRlcDb = &duCb.actvCellLst[cellIdx]->ueCb[rlcUeCfg->ueId-1].duRlcUeCfg;
1779 duRlcDb->rlcUeCfgState = UE_CFG_INPROGRESS;
1781 for(dbIdx = 0; (dbIdx < ueCfgDb->numRlcLcs && ret == ROK); dbIdx++)
1783 ret = fillDefaultRlcModeCfg(ueCfgDb->rlcLcCfg[dbIdx].rlcBearerCfg.rlcMode, &ueCfgDb->rlcLcCfg[dbIdx].rlcBearerCfg);
1786 DU_LOG("\n ERROR --> DU APP : Failed to fill Rlc Mode at fillRlcUeCfg()");
1787 memset(rlcUeCfg, 0, sizeof(DuRlcUeCfg));
1793 /* Fill Rlc Ue Cfg List for ADD/MOD/DEL */
1794 for(lcIdx = 0; lcIdx < duRlcDb->numLcs; lcIdx++)
1796 if(ueCfgDb->rlcLcCfg[dbIdx].rlcBearerCfg.lcId == duRlcDb->rlcLcCfg[lcIdx].rlcBearerCfg.lcId)
1799 if((ueCfgDb->rlcLcCfg[dbIdx].configType == CONFIG_UNKNOWN)||
1800 (ueCfgDb->rlcLcCfg[dbIdx].configType == CONFIG_MOD))
1803 ueCfgDb->rlcLcCfg[dbIdx].configType = CONFIG_MOD; /* update Db for MOD type */
1804 memcpy(&rlcUeCfg->rlcLcCfg[dbIdx], &ueCfgDb->rlcLcCfg[dbIdx], sizeof(DuRlcBearerCfg));
1805 fillSnssaiInfo(rlcUeCfg->rlcLcCfg[dbIdx].rlcBearerCfg.snssai, ueCfgDb->rlcLcCfg[dbIdx].rlcBearerCfg.snssai,\
1806 &duRlcDb->rlcLcCfg[lcIdx].rlcBearerCfg.snssai,false);
1816 /* ADD/ DEL Config Type */
1817 memcpy(&rlcUeCfg->rlcLcCfg[dbIdx], &ueCfgDb->rlcLcCfg[dbIdx], sizeof(DuRlcBearerCfg));
1818 fillSnssaiInfo(rlcUeCfg->rlcLcCfg[dbIdx].rlcBearerCfg.snssai, ueCfgDb->rlcLcCfg[dbIdx].rlcBearerCfg.snssai, NULL, false);
1826 /******************************************************************
1828 * @brief creates UE context
1832 * Function : duCreateUeCb
1834 * Functionality: Creates UE Conetxt
1836 * @params[in] UeCcchCtxt Pointer
1839 * @return ROK - success
1841 * ****************************************************************/
1842 uint8_t duCreateUeCb(UeCcchCtxt *ueCcchCtxt, uint32_t gnbCuUeF1apId)
1844 uint8_t cellIdx = 0;
1846 uint8_t ueId = 0, ueIdx = 0;
1848 for(cellIdx = 0; cellIdx < MAX_NUM_CELL; cellIdx++)
1850 if(duCb.actvCellLst[cellIdx] && (ueCcchCtxt->cellId == duCb.actvCellLst[cellIdx]->cellId))
1852 GET_UE_ID(ueCcchCtxt->crnti, ueId);
1853 DU_LOG("\nDEBUG --> DU_APP: Filling UeCb for ueId [%d]", ueId);
1856 duCb.actvCellLst[cellIdx]->ueCb[ueIdx].f1UeDb = NULLP;
1857 duCb.actvCellLst[cellIdx]->ueCb[ueIdx].crnti = ueCcchCtxt->crnti;
1858 duCb.actvCellLst[cellIdx]->ueCb[ueIdx].gnbDuUeF1apId = ueCcchCtxt->gnbDuUeF1apId;
1859 duCb.actvCellLst[cellIdx]->ueCb[ueIdx].gnbCuUeF1apId = gnbCuUeF1apId;
1860 duCb.actvCellLst[cellIdx]->ueCb[ueIdx].drbBitMap = NULLP;
1861 duCb.actvCellLst[cellIdx]->ueCb[ueIdx].ueState = UE_ACTIVE;
1863 /* Filling Mac Ue Config */
1864 memset(&duCb.actvCellLst[cellIdx]->ueCb[ueIdx].duMacUeCfg, 0, sizeof(DuMacUeCfg));
1865 ret = duBuildAndSendUeCreateReqToMac(ueCcchCtxt->cellId, ueCcchCtxt->gnbDuUeF1apId, ueCcchCtxt->crnti, NULL,
1866 &duCb.actvCellLst[cellIdx]->ueCb[ueIdx].duMacUeCfg);
1868 DU_LOG("\nERROR --> DU APP : Failed to send UE create request to MAC");
1870 /* Filling Rlc Ue Config */
1871 memset(&duCb.actvCellLst[cellIdx]->ueCb[ueIdx].duRlcUeCfg, 0, sizeof(DuRlcUeCfg));
1872 ret = duBuildAndSendUeCreateReqToRlc(ueCcchCtxt->cellId, ueCcchCtxt->gnbDuUeF1apId, NULL,
1873 &duCb.actvCellLst[cellIdx]->ueCb[ueIdx].duRlcUeCfg);
1875 DU_LOG("\nERROR --> DU APP : Failed to send UE create request to RLC");
1877 duCb.actvCellLst[cellIdx]->numActvUes++;
1878 memset(ueCcchCtxt, 0, sizeof(UeCcchCtxt));
1885 /**********************************************************************************
1887 * @brief Fills Ue Cfg from DU DB to MacUeCreateReq
1891 * Function : fillMacUeCfg
1893 * Functionality: fills ue Cfg to be sent to MAC
1895 * @params[in] DuMacUeCfg Pointer
1896 * MacUeCreateReq Pointer
1898 * @return ROK - success
1900 * *******************************************************************************/
1901 void fillMacUeCfg(DuMacUeCfg *duMacUeCfg, MacUeCreateReq *macUeCfg)
1905 macUeCfg->cellId = duMacUeCfg->cellId;
1906 macUeCfg->ueId = duMacUeCfg->ueId;
1907 macUeCfg->crnti = duMacUeCfg->crnti;
1908 macUeCfg->macCellGrpCfgPres = duMacUeCfg->macCellGrpCfgPres;
1909 if(macUeCfg->macCellGrpCfgPres)
1911 memcpy(&macUeCfg->macCellGrpCfg, &duMacUeCfg->macCellGrpCfg, sizeof(MacCellGrpCfg));
1913 macUeCfg->phyCellGrpCfgPres = duMacUeCfg->phyCellGrpCfgPres;
1914 if(macUeCfg->phyCellGrpCfgPres)
1916 memcpy(&macUeCfg->phyCellGrpCfg, &duMacUeCfg->phyCellGrpCfg, sizeof(PhyCellGrpCfg));
1918 macUeCfg->spCellCfgPres = duMacUeCfg->spCellCfgPres;
1919 if(macUeCfg->spCellCfgPres)
1921 macUeCfg->spCellCfg.servCellIdx = duMacUeCfg->spCellCfg.servCellIdx;
1922 macUeCfg->spCellCfg.servCellCfg.initDlBwp = duMacUeCfg->spCellCfg.servCellCfg.initDlBwp;
1923 macUeCfg->spCellCfg.servCellCfg.numDlBwpToAdd = duMacUeCfg->spCellCfg.servCellCfg.numDlBwpToAddOrMod;
1924 if(macUeCfg->spCellCfg.servCellCfg.numDlBwpToAdd > 0)
1926 memcpy(macUeCfg->spCellCfg.servCellCfg.dlBwpToAddList, duMacUeCfg->spCellCfg.servCellCfg.dlBwpToAddOrModList, \
1927 (sizeof(DlBwpInfo) * MAX_NUM_BWP));
1929 macUeCfg->spCellCfg.servCellCfg.firstActvDlBwpId = duMacUeCfg->spCellCfg.servCellCfg.firstActvDlBwpId;
1930 macUeCfg->spCellCfg.servCellCfg.defaultDlBwpId = duMacUeCfg->spCellCfg.servCellCfg.defaultDlBwpId;
1931 macUeCfg->spCellCfg.servCellCfg.bwpInactivityTmr = duMacUeCfg->spCellCfg.servCellCfg.bwpInactivityTmr;
1932 memcpy(&macUeCfg->spCellCfg.servCellCfg.pdschServCellCfg, &duMacUeCfg->spCellCfg.servCellCfg.pdschServCellCfg, sizeof(PdschServCellCfg));
1933 memcpy(&macUeCfg->spCellCfg.servCellCfg.initUlBwp, &duMacUeCfg->spCellCfg.servCellCfg.initUlBwp, sizeof(InitialUlBwp));
1934 macUeCfg->spCellCfg.servCellCfg.numUlBwpToAdd = duMacUeCfg->spCellCfg.servCellCfg.numUlBwpToAddOrMod;
1935 if(macUeCfg->spCellCfg.servCellCfg.numUlBwpToAdd > 0)
1937 memcpy(macUeCfg->spCellCfg.servCellCfg.ulBwpToAddList, duMacUeCfg->spCellCfg.servCellCfg.ulBwpToAddOrModList,\
1938 (sizeof(UlBwpInfo) * MAX_NUM_BWP));
1940 macUeCfg->spCellCfg.servCellCfg.firstActvUlBwpId = duMacUeCfg->spCellCfg.servCellCfg.firstActvUlBwpId;
1942 if(duMacUeCfg->ambrCfg != NULLP)
1944 memcpy(macUeCfg->ambrCfg, duMacUeCfg->ambrCfg, sizeof(AmbrCfg));
1946 memcpy(&macUeCfg->dlModInfo, &duMacUeCfg->dlModInfo, sizeof(ModulationInfo));
1947 memcpy(&macUeCfg->ulModInfo, &duMacUeCfg->ulModInfo, sizeof(ModulationInfo));
1948 if(duMacUeCfg->numLcs > 0)
1950 macUeCfg->numLcs = 0;
1951 for(lcIdx = 0; lcIdx < duMacUeCfg->numLcs; lcIdx++)
1953 if(duMacUeCfg->lcCfgList[lcIdx].configType == CONFIG_ADD)
1955 //VS: To thoroughly check
1956 memcpy(&macUeCfg->lcCfgList[macUeCfg->numLcs], &duMacUeCfg->lcCfgList[lcIdx].lcConfig, sizeof(LcCfg));
1963 /**********************************************************************************
1965 * @brief Fills Ue Cfg from DU DB to RLCUeCfg
1969 * Function : fillRlcUeCfg
1971 * Functionality: fills ue Cfg to be sent to RLC
1973 * @params[in] DuRlcUeCfg Pointer
1974 * RlcUeCreate Pointer
1976 * @return ROK - success
1978 * *******************************************************************************/
1979 void fillRlcUeCfg(DuRlcUeCfg *duRlcUeCfg, RlcUeCreate *rlcUeCfg)
1983 rlcUeCfg->cellId = duRlcUeCfg->cellId;
1984 rlcUeCfg->ueId = duRlcUeCfg->ueId;
1986 rlcUeCfg->numLcsToAdd = 0;
1987 for(lcIdx = 0; lcIdx < duRlcUeCfg->numLcs; lcIdx++)
1989 if(duRlcUeCfg->rlcLcCfg[lcIdx].configType == CONFIG_ADD)
1991 memcpy(&rlcUeCfg->rlcLcCfgAdd[rlcUeCfg->numLcsToAdd], &duRlcUeCfg->rlcLcCfg[lcIdx].rlcBearerCfg, sizeof(RlcBearerCfg));
1992 rlcUeCfg->numLcsToAdd++;
1998 /******************************************************************
2000 * @brief Builds and Send UE Create Request to MAC
2004 * Function : duBuildAndSendUeCreateReqToMac
2006 * Functionality: Builds and Send UE Create Request to MAC
2008 * @Params[in] cellId,
2011 * UE config extracted from F1AP msg
2012 * MAC UE config struct to be filled
2013 * @return ROK - success
2016 * ****************************************************************/
2018 uint8_t duBuildAndSendUeCreateReqToMac(uint16_t cellId, uint8_t gnbDuUeF1apId, uint16_t crnti, DuUeCfg *ueCfgDb, DuMacUeCfg *duMacUeCfg)
2021 MacUeCreateReq *macUeCfg = NULLP;
2023 memset(&pst, 0, sizeof(Pst));
2026 ret = updateDuMacUeCfg(cellId, gnbDuUeF1apId, crnti, ueCfgDb, duMacUeCfg);
2029 DU_LOG("\nERROR --> DU APP : Failed to fill MacUeCfg at duBuildAndSendUeCreateReqToMac()");
2034 FILL_PST_DUAPP_TO_MAC(pst, EVENT_MAC_UE_CREATE_REQ);
2036 /* Copying ueCb to a sharable buffer */
2037 DU_ALLOC_SHRABL_BUF(macUeCfg, sizeof(MacUeCreateReq));
2040 memset(macUeCfg, 0, sizeof(MacUeCreateReq));
2041 fillMacUeCfg(duMacUeCfg, macUeCfg);
2042 DU_LOG("\nDEBUG --> DU_APP: Sending UE create request to MAC");
2044 /* Processing one Ue at a time to MAC */
2045 ret = (*packMacUeCreateReqOpts[pst.selector])(&pst, macUeCfg);
2048 DU_LOG("\nERROR --> DU_APP : Failure in sending Ue Create Req to MAC at duBuildAndSendUeCreateReqToMac()");
2049 DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL, macUeCfg, sizeof(MacUeCreateReq));
2054 DU_LOG("\n ERROR --> DU APP : Memory alloc failed at duBuildAndSendUeCreateReqToMac()");
2060 /*******************************************************************
2062 * @brief Build and send RACH Resource request to MAC
2066 * Function : duBuildAndSendRachRsrcReqToMac
2068 * Build and send RACH Resource request to MAC
2070 * @params[in] Cell Id
2072 * @return ROK - success
2075 * ****************************************************************/
2076 uint8_t duBuildAndSendRachRsrcReqToMac(uint16_t cellId, uint16_t ueId)
2078 uint16_t cellIdx = 0, ssbIdx = 0;
2080 MacRachRsrcReq *rachRsrcReq = NULLP;
2082 GET_CELL_IDX(cellId, cellIdx);
2083 if(duCb.actvCellLst[cellIdx] == NULLP)
2085 DU_LOG("\nERROR --> DU APP : Cell Id [%d] not found in duBuildAndSendRachRsrcReqToMac()", cellId);
2089 DU_ALLOC_SHRABL_BUF(rachRsrcReq, sizeof(MacRachRsrcReq));
2092 DU_LOG("\nERROR --> DU APP : Failed to allocate memory for RACH Resource Request in \
2093 duBuildAndSendRachRsrcReqToMac()");
2097 rachRsrcReq->cellId = cellId;
2098 rachRsrcReq->ueId = ueId;
2099 rachRsrcReq->numSsb = duCfgParam.macCellCfg.prachCfg.ssbPerRach;
2100 for(ssbIdx = 0; ssbIdx < rachRsrcReq->numSsb; ssbIdx++)
2102 rachRsrcReq->ssbIdx[ssbIdx] = ssbIdx;
2106 FILL_PST_DUAPP_TO_MAC(pst, EVENT_MAC_RACH_RESOURCE_REQ);
2108 if(((*packMacRachRsrcReqOpts[pst.selector])(&pst, rachRsrcReq)) != ROK)
2110 DU_LOG("\nERROR --> DU_APP : Failure in sending RACH Resource Request to MAC at \
2111 duBuildAndSendRachRsrcReqToMac()");
2112 DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL, rachRsrcReq, sizeof(MacRachRsrcReq));
2119 /*******************************************************************
2121 * @brief Process RACH resource response from MAC
2125 * Function : DuProcMacRachRsrcRsp
2127 * Process RACH resource response from MAC
2129 * @params[in] Post structure
2130 * RACH resource response
2131 * @return ROK - success
2134 * ****************************************************************/
2135 uint8_t DuProcMacRachRsrcRsp(Pst *pst, MacRachRsrcRsp *rachRsrcRsp)
2137 uint8_t ret = RFAILED;
2138 uint16_t cellIdx = 0;
2139 DuCellCb *cellCb = NULLP;
2140 DuUeCb *ueCb = NULLP;
2142 DU_LOG("\nINFO --> DU APP : Received RACH Resource Response from MAC. Cell ID [%d] UE ID [%d]",
2143 rachRsrcRsp->cellId, rachRsrcRsp->ueId);
2145 if(rachRsrcRsp->result == MAC_DU_APP_RSP_OK)
2147 DU_LOG("\nINFO : DU APP : RACH Resource Response from MAC : Result [SUCCESS]");
2150 GET_CELL_IDX(rachRsrcRsp->cellId, cellIdx);
2151 if(duCb.actvCellLst[cellIdx] && (duCb.actvCellLst[cellIdx]->cellId == rachRsrcRsp->cellId))
2153 cellCb = duCb.actvCellLst[cellIdx];
2156 if(cellCb->ueCb[rachRsrcRsp->ueId-1].gnbDuUeF1apId == rachRsrcRsp->ueId)
2158 ueCb = &cellCb->ueCb[rachRsrcRsp->ueId-1];
2160 /* Store CRNTI alloted to this UE by MAC */
2161 ueCb->crnti = rachRsrcRsp->newCrnti;
2163 /* Store the assigned CF-RA resources */
2164 memcpy(&ueCb->cfraResource, &rachRsrcRsp->cfraResource, sizeof(MacCfraResource));
2166 /* RACH resources allocated to UE is sent to CU in UE Context Setup Response
2167 * along with the result of UE Context setup requested by CU */
2168 if((ret = BuildAndSendUeCtxtRsp(rachRsrcRsp->cellId, rachRsrcRsp->ueId)) != ROK)
2169 DU_LOG("\nERROR -> DU APP : Failure in BuildAndSendUeCtxtRsp()");
2172 DU_LOG("\nERROR --> DU APP : UE ID [%d] not found in DuProcMacRachRsrcRsp", rachRsrcRsp->ueId);
2175 DU_LOG("\nERROR --> DU APP : Cell ID [%d] not found in DuProcMacRachRsrcRsp", rachRsrcRsp->cellId);
2178 DU_LOG("\nINFO : DU APP : RACH Resource Response from MAC : Result [FAILURE]");
2180 DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL, rachRsrcRsp, sizeof(MacRachRsrcRsp));
2184 /*******************************************************************
2186 * @brief fill k0 value in duCb
2190 * Function : fillK0Values
2191 * Functionality: update k0 value in duCb
2193 * @params[in] PdschConfig *cuPdschCfg, PdschConfig *storePdschCfg
2194 * @return ROK - success
2197 * ****************************************************************/
2199 uint8_t fillK0Values(PdschConfig *cuPdschCfg, PdschConfig *storePdschCfg)
2201 uint8_t numTimeDomRsrcAlloc, rsrcIdx;
2205 if(storePdschCfg->numTimeDomRsrcAlloc)
2207 numTimeDomRsrcAlloc = cuPdschCfg->numTimeDomRsrcAlloc;
2208 for(rsrcIdx =0 ; rsrcIdx<numTimeDomRsrcAlloc; rsrcIdx++)
2210 if(cuPdschCfg->timeDomRsrcAllociList[rsrcIdx].k0)
2212 if(storePdschCfg->timeDomRsrcAllociList[rsrcIdx].k0)
2214 *(storePdschCfg->timeDomRsrcAllociList[rsrcIdx].k0) = *(cuPdschCfg->timeDomRsrcAllociList[rsrcIdx].k0);
2215 if(storePdschCfg->timeDomRsrcAllociList[rsrcIdx].k0 != cuPdschCfg->timeDomRsrcAllociList[rsrcIdx].k0)
2216 DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL, cuPdschCfg->timeDomRsrcAllociList[rsrcIdx].k0, sizeof(uint8_t));
2220 (storePdschCfg->timeDomRsrcAllociList[rsrcIdx].k0) = (cuPdschCfg->timeDomRsrcAllociList[rsrcIdx].k0);
2229 /*******************************************************************
2231 * @brief To update DuUeCb Mac Cfg
2235 * Function : duUpdateMacCfg
2236 * Functionality: update DuUeCb MAC Cfg
2238 * @params[in] DuUeCb Pointer
2239 * F1UeContextSetupDb pointer
2240 * @return ROK - success
2243 * ****************************************************************/
2244 uint8_t duUpdateMacCfg(DuMacUeCfg *macUeCfg, F1UeContextSetupDb *f1UeDb)
2246 uint8_t ret, lcIdx, dbIdx, numLcs, lcDelIdx, cellIdx;
2247 DuMacUeCfg *oldMacUeCfg;
2250 GET_CELL_IDX(macUeCfg->cellId, cellIdx);
2251 if(duCb.actvCellLst[cellIdx] == NULLP)
2253 DU_LOG("\nERROR --> DU APP: CellId[%d] not found", macUeCfg->cellId);
2256 oldMacUeCfg = &duCb.actvCellLst[cellIdx]->ueCb[macUeCfg->ueId-1].duMacUeCfg;
2258 /*Filling Cell Group Cfg*/
2259 ret = procUeRecfgCellInfo(macUeCfg, &f1UeDb->duUeCfg.copyOfmacUeCfg, f1UeDb->duUeCfg.cellGrpCfg);
2261 memcpy(&macUeCfg->macCellGrpCfg.drxCfg, &f1UeDb->duUeCfg.copyOfmacUeCfg.macCellGrpCfg.drxCfg, sizeof(DrxCfg));
2265 if(macUeCfg->spCellCfg.servCellCfg.initDlBwp.pdschPresent)
2267 /* update k0 values */
2268 fillK0Values(&f1UeDb->duUeCfg.copyOfmacUeCfg.spCellCfg.servCellCfg.initDlBwp.pdschCfg, &macUeCfg->spCellCfg.servCellCfg.initDlBwp.pdschCfg);
2269 fillStartSymbolAndLen(macUeCfg->spCellCfg.servCellCfg.initDlBwp.pdschCfg.numTimeDomRsrcAlloc,\
2270 &macUeCfg->spCellCfg.servCellCfg.initDlBwp.pdschCfg, NULL);
2272 if(macUeCfg->spCellCfg.servCellCfg.initUlBwp.puschPresent)
2274 fillStartSymbolAndLen(macUeCfg->spCellCfg.servCellCfg.initUlBwp.puschCfg.numTimeDomRsrcAlloc,\
2275 NULL, &macUeCfg->spCellCfg.servCellCfg.initUlBwp.puschCfg);
2277 ret = fillAmbr(NULL, f1UeDb->duUeCfg.ambrCfg, &oldMacUeCfg->ambrCfg, true);
2278 duFillModulationDetails(macUeCfg, oldMacUeCfg, f1UeDb->duUeCfg.ueNrCapability);
2281 /* Filling LC Context */
2282 for(dbIdx = 0; (dbIdx < f1UeDb->duUeCfg.numMacLcs && ret == ROK); dbIdx++)
2284 numLcs = macUeCfg->numLcs;
2285 for(lcIdx = 0; lcIdx < numLcs; lcIdx++)
2287 if(f1UeDb->duUeCfg.macLcCfg[dbIdx].lcConfig.lcId == macUeCfg->lcCfgList[lcIdx].lcConfig.lcId)
2289 if(f1UeDb->duUeCfg.macLcCfg[dbIdx].configType == CONFIG_MOD)
2291 ret = fillMacLcCfgToAddMod(NULL, &f1UeDb->duUeCfg.macLcCfg[dbIdx], &macUeCfg->lcCfgList[lcIdx], true);
2293 else if(f1UeDb->duUeCfg.macLcCfg[dbIdx].configType == CONFIG_DEL)
2295 /* Free memory at matched lcIdx index */
2296 freeMacLcCfg(&macUeCfg->lcCfgList[lcIdx].lcConfig);
2298 for(lcDelIdx = lcIdx; lcDelIdx < macUeCfg->numLcs; lcDelIdx++)
2300 /* moving all elements one index ahead */
2301 ret = fillMacLcCfgToAddMod(NULL, &macUeCfg->lcCfgList[lcDelIdx+1], &macUeCfg->lcCfgList[lcDelIdx], true);
2302 freeMacLcCfg(&macUeCfg->lcCfgList[lcDelIdx+1].lcConfig);
2305 DU_LOG("\nERROR --> DU APP : Failed to delete LC at Idx %d in duUpdateMacCfg()", lcDelIdx);
2312 if(f1UeDb->duUeCfg.macLcCfg[dbIdx].configType == CONFIG_ADD)
2314 ret = fillMacLcCfgToAddMod(NULL, &f1UeDb->duUeCfg.macLcCfg[dbIdx], &macUeCfg->lcCfgList[numLcs], true);
2317 DU_LOG("\nERROR --> DU APP : Failed to add LC at Idx %d in duUpdateMacCfg()", numLcs);
2327 /******************************************************************
2329 * @brief Function to fill the RLC Lc cfg from ueSetupReqDb
2333 * Function : fillRlcCfgToAddMod
2335 * Functionality: Function to fill the RLC Lc cfg from ueSetupReqDb
2338 *****************************************************************/
2340 uint8_t fillRlcCfgToAddMod(DuRlcBearerCfg *lcCfg, DuRlcBearerCfg *f1UeDbLcCfg)
2342 lcCfg->configType = f1UeDbLcCfg->configType;
2343 lcCfg->rlcBearerCfg.rbId = f1UeDbLcCfg->rlcBearerCfg.rbId;
2344 lcCfg->rlcBearerCfg.rbType = f1UeDbLcCfg->rlcBearerCfg.rbType;
2345 lcCfg->rlcBearerCfg.lcId = f1UeDbLcCfg->rlcBearerCfg.lcId;
2346 lcCfg->rlcBearerCfg.lcType = f1UeDbLcCfg->rlcBearerCfg.lcType;
2347 lcCfg->rlcBearerCfg.rlcMode = f1UeDbLcCfg->rlcBearerCfg.rlcMode;
2349 switch(lcCfg->rlcBearerCfg.rlcMode)
2353 if(!lcCfg->rlcBearerCfg.u.amCfg)
2355 DU_ALLOC_SHRABL_BUF(lcCfg->rlcBearerCfg.u.amCfg, sizeof(AmBearerCfg));
2356 if(!lcCfg->rlcBearerCfg.u.amCfg)
2360 lcCfg->rlcBearerCfg.u.amCfg->dlAmCfg.snLenDl = f1UeDbLcCfg->rlcBearerCfg.u.amCfg->dlAmCfg.snLenDl;
2361 lcCfg->rlcBearerCfg.u.amCfg->dlAmCfg.pollRetxTmr = f1UeDbLcCfg->rlcBearerCfg.u.amCfg->dlAmCfg.pollRetxTmr;
2362 lcCfg->rlcBearerCfg.u.amCfg->dlAmCfg.pollPdu = f1UeDbLcCfg->rlcBearerCfg.u.amCfg->dlAmCfg.pollPdu;
2363 lcCfg->rlcBearerCfg.u.amCfg->dlAmCfg.pollByte = f1UeDbLcCfg->rlcBearerCfg.u.amCfg->dlAmCfg.pollByte;
2364 lcCfg->rlcBearerCfg.u.amCfg->dlAmCfg.maxRetxTh = f1UeDbLcCfg->rlcBearerCfg.u.amCfg->dlAmCfg.maxRetxTh;
2367 lcCfg->rlcBearerCfg.u.amCfg->ulAmCfg.snLenUl = f1UeDbLcCfg->rlcBearerCfg.u.amCfg->ulAmCfg.snLenUl;
2368 lcCfg->rlcBearerCfg.u.amCfg->ulAmCfg.reAssemTmr = f1UeDbLcCfg->rlcBearerCfg.u.amCfg->ulAmCfg.reAssemTmr;
2369 lcCfg->rlcBearerCfg.u.amCfg->ulAmCfg.statProhTmr = f1UeDbLcCfg->rlcBearerCfg.u.amCfg->ulAmCfg.statProhTmr;
2372 case RLC_UM_BI_DIRECTIONAL :
2374 if(!lcCfg->rlcBearerCfg.u.umBiDirCfg)
2376 DU_ALLOC_SHRABL_BUF(lcCfg->rlcBearerCfg.u.umBiDirCfg, sizeof(UmBiDirBearerCfg));
2377 if(!lcCfg->rlcBearerCfg.u.umBiDirCfg)
2380 /* UL UM BI DIR INFO */
2381 lcCfg->rlcBearerCfg.u.umBiDirCfg->ulUmCfg.snLenUlUm = f1UeDbLcCfg->rlcBearerCfg.u.umBiDirCfg->ulUmCfg.snLenUlUm;
2382 lcCfg->rlcBearerCfg.u.umBiDirCfg->ulUmCfg.reAssemTmr = f1UeDbLcCfg->rlcBearerCfg.u.umBiDirCfg->ulUmCfg.reAssemTmr;
2383 /* DL UM BI DIR INFO */
2384 lcCfg->rlcBearerCfg.u.umBiDirCfg->dlUmCfg.snLenDlUm = f1UeDbLcCfg->rlcBearerCfg.u.umBiDirCfg->dlUmCfg.snLenDlUm;
2387 case RLC_UM_UNI_DIRECTIONAL_UL :
2389 if(!lcCfg->rlcBearerCfg.u.umUniDirUlCfg)
2391 DU_ALLOC_SHRABL_BUF(lcCfg->rlcBearerCfg.u.umUniDirUlCfg, sizeof(UmUniDirUlBearerCfg));
2392 if(!lcCfg->rlcBearerCfg.u.umUniDirUlCfg)
2395 lcCfg->rlcBearerCfg.u.umUniDirUlCfg->ulUmCfg.snLenUlUm = f1UeDbLcCfg->rlcBearerCfg.u.umUniDirUlCfg->ulUmCfg.snLenUlUm;
2396 lcCfg->rlcBearerCfg.u.umUniDirUlCfg->ulUmCfg.reAssemTmr = f1UeDbLcCfg->rlcBearerCfg.u.umUniDirUlCfg->ulUmCfg.reAssemTmr;
2400 case RLC_UM_UNI_DIRECTIONAL_DL :
2402 if(!lcCfg->rlcBearerCfg.u.umUniDirDlCfg)
2404 DU_ALLOC_SHRABL_BUF(lcCfg->rlcBearerCfg.u.umUniDirDlCfg, sizeof(UmUniDirDlBearerCfg));
2405 if(!lcCfg->rlcBearerCfg.u.umUniDirDlCfg)
2408 lcCfg->rlcBearerCfg.u.umUniDirDlCfg->dlUmCfg.snLenDlUm = f1UeDbLcCfg->rlcBearerCfg.u.umUniDirDlCfg->dlUmCfg.snLenDlUm;
2412 DU_LOG("\nERROR --> DU_APP: Invalid Rlc Mode %d at fillRlcCfgToAddMod()", lcCfg->rlcBearerCfg.rlcMode);
2418 /*******************************************************************
2420 * @brief To update DuUeCb Rlc Lc Cfg
2424 * Function : duUpdateRlcLcCfg
2425 * Functionality: update DuUeCb Rlc Lc Cfg
2427 * @params[in] DuUeCb Pointer
2428 * F1UeContextSetupDb pointer
2429 * @return ROK - success
2432 * ****************************************************************/
2434 uint8_t duUpdateRlcLcCfg(DuRlcUeCfg *rlcUeCfg, F1UeContextSetupDb *f1UeDb)
2436 uint8_t ret, lcIdx, dbIdx, numLcs, lcDelIdx;
2439 for(dbIdx = 0; (dbIdx < f1UeDb->duUeCfg.numRlcLcs && ret ==ROK); dbIdx++)
2441 numLcs = rlcUeCfg->numLcs;
2442 for(lcIdx = 0; lcIdx < numLcs; lcIdx++)
2444 if(f1UeDb->duUeCfg.rlcLcCfg[dbIdx].rlcBearerCfg.lcId == rlcUeCfg->rlcLcCfg[lcIdx].rlcBearerCfg.lcId)
2446 if(f1UeDb->duUeCfg.rlcLcCfg[dbIdx].configType == CONFIG_MOD)
2448 ret = fillRlcCfgToAddMod(&rlcUeCfg->rlcLcCfg[lcIdx], &f1UeDb->duUeCfg.rlcLcCfg[dbIdx]);
2451 DU_LOG("\nERROR --> DU APP : Failed to modify LC at Idx %d in duUpdateRlcCfg()", lcDelIdx);
2454 fillSnssaiInfo(NULL, f1UeDb->duUeCfg.rlcLcCfg[dbIdx].rlcBearerCfg.snssai,\
2455 &rlcUeCfg->rlcLcCfg[lcIdx].rlcBearerCfg.snssai, true);
2457 else if(f1UeDb->duUeCfg.rlcLcCfg[dbIdx].configType == CONFIG_DEL)
2459 /* Free memory at matched lcIdx index */
2460 freeRlcLcCfg(&rlcUeCfg->rlcLcCfg[lcIdx].rlcBearerCfg);
2462 for(lcDelIdx = lcIdx; lcDelIdx < rlcUeCfg->numLcs; lcDelIdx++)
2464 ret = fillRlcCfgToAddMod(&rlcUeCfg->rlcLcCfg[lcDelIdx], &rlcUeCfg->rlcLcCfg[lcDelIdx+1]);
2465 fillSnssaiInfo(NULL, rlcUeCfg->rlcLcCfg[lcDelIdx+1].rlcBearerCfg.snssai,\
2466 &rlcUeCfg->rlcLcCfg[lcDelIdx].rlcBearerCfg.snssai, true);
2467 freeRlcLcCfg(&rlcUeCfg->rlcLcCfg[lcDelIdx+1].rlcBearerCfg);
2470 DU_LOG("\nERROR --> DU APP : Failed to delete LC at Idx %d in duUpdateRlcCfg()", lcDelIdx);
2477 if(f1UeDb->duUeCfg.rlcLcCfg[dbIdx].configType == CONFIG_ADD)
2479 ret = fillRlcCfgToAddMod(&rlcUeCfg->rlcLcCfg[lcIdx], &f1UeDb->duUeCfg.rlcLcCfg[dbIdx]);
2482 fillSnssaiInfo(NULL, f1UeDb->duUeCfg.rlcLcCfg[dbIdx].rlcBearerCfg.snssai,\
2483 &rlcUeCfg->rlcLcCfg[rlcUeCfg->numLcs].rlcBearerCfg.snssai, true);
2491 /*******************************************************************
2493 * @brief Function to fill Tunnel Config to Add/Mod
2498 * Function : fillTnlCfgToAddMod
2500 * Functionality: Function to fill tunnel Config to Add/Mod
2502 * @params[in] Pointer to tnlCfgDb,
2503 * pointer to f1TnlCfg
2504 * @return ROK - success
2507 * ****************************************************************/
2508 uint8_t fillTnlCfgToAddMod(UpTnlCfg **ueCbTnlCfg, UpTnlCfg *f1TnlCfg)
2512 DU_FREE((*ueCbTnlCfg)->tnlCfg1, sizeof(GtpTnlCfg));
2513 DU_FREE(*ueCbTnlCfg, sizeof(UpTnlCfg));
2516 if(*ueCbTnlCfg == NULLP)
2518 /* copying to DuCb Tnl Cfg */
2519 DU_ALLOC(*ueCbTnlCfg, sizeof(UpTnlCfg));
2520 if(*ueCbTnlCfg == NULLP)
2522 DU_LOG("\nERROR --> DU_APP : fillTnlCfgToAddMod: Memory Alloc failed for drbId[%d]", f1TnlCfg->drbId);
2526 memset(*ueCbTnlCfg, 0, sizeof(UpTnlCfg));
2527 (*ueCbTnlCfg)->configType = f1TnlCfg->configType;
2528 (*ueCbTnlCfg)->cellId = f1TnlCfg->cellId;
2529 (*ueCbTnlCfg)->ueId = f1TnlCfg->ueId;
2530 (*ueCbTnlCfg)->drbId = f1TnlCfg->drbId;
2531 if(f1TnlCfg->tnlCfg1)
2533 if((*ueCbTnlCfg)->tnlCfg1 == NULLP)
2535 DU_ALLOC((*ueCbTnlCfg)->tnlCfg1, sizeof(GtpTnlCfg));
2536 if((*ueCbTnlCfg)->tnlCfg1 == NULLP)
2538 DU_LOG("\nERROR --> DU_APP : fillTnlCfgToAddMod: Memory Alloc failed for tnlCfg1 for drbId[%d]", f1TnlCfg->drbId);
2542 memset((*ueCbTnlCfg)->tnlCfg1, 0, sizeof(GtpTnlCfg));
2543 (*ueCbTnlCfg)->tnlCfg1->teId = f1TnlCfg->tnlCfg1->teId;
2544 (*ueCbTnlCfg)->tnlCfg1->ulTnlAddress = f1TnlCfg->tnlCfg1->ulTnlAddress;
2545 (*ueCbTnlCfg)->tnlCfg1->dlTnlAddress = f1TnlCfg->tnlCfg1->dlTnlAddress;
2550 /*******************************************************************
2552 * @brief Processing the tunnel Request to EGTP
2556 * Function : duProcEgtpTunnelCfg
2558 * Functionality: Processing the tunnel Request to EGTP
2560 * @params[in] UptnlCfg *duTnlCfg, UpTnlCfg *f1TnlCfg
2561 * @return ROK - success
2564 * ****************************************************************/
2566 uint8_t duProcEgtpTunnelCfg(uint8_t ueCbIdx, UpTnlCfg *duTnlCfg, UpTnlCfg *f1TnlCfg)
2568 uint8_t ret = RFAILED, delIdx;
2570 if(f1TnlCfg->tnlCfg1 == NULLP)
2572 DU_LOG("\nERROR --> DU_APP : Tunnel config not found");
2576 if(f1TnlCfg->configType == CONFIG_ADD)
2578 if(duSendEgtpTnlMgmtReq(EGTP_TNL_MGMT_ADD, NULLP, f1TnlCfg->tnlCfg1) == ROK)
2580 if(fillTnlCfgToAddMod(&duCb.upTnlCfg[duCb.numTeId], f1TnlCfg) == ROK)
2587 else if(f1TnlCfg->configType == CONFIG_MOD)
2589 if(duSendEgtpTnlMgmtReq(EGTP_TNL_MGMT_MOD, duTnlCfg->tnlCfg1->teId, f1TnlCfg->tnlCfg1) == ROK)
2591 if(fillTnlCfgToAddMod(&duTnlCfg, f1TnlCfg) == ROK)
2597 else if(f1TnlCfg->configType == CONFIG_DEL)
2599 if(duSendEgtpTnlMgmtReq(EGTP_TNL_MGMT_DEL, duTnlCfg->tnlCfg1->teId, f1TnlCfg->tnlCfg1) == ROK)
2601 /* Free memory at drbIdx */
2603 for(delIdx = ueCbIdx; delIdx < duCb.numTeId; delIdx++)
2605 /* moving all elements one index ahead */
2606 ret = fillTnlCfgToAddMod(&duCb.upTnlCfg[delIdx], duCb.upTnlCfg[delIdx+1]);
2612 if(duCb.upTnlCfg[delIdx])
2614 DU_FREE(duCb.upTnlCfg[delIdx]->tnlCfg1, sizeof(GtpTnlCfg));
2615 DU_FREE(duCb.upTnlCfg[delIdx], sizeof(UpTnlCfg));
2622 /***********************************************************************
2624 * @brief Function to fill Tunnel Config
2625 * and sends tunnel Req to EGTP
2630 * Function : duUpdateTunnelCfgDb
2632 * Functionality: Function to fill tunnel Config
2633 * and sends tunnel Cfg Req to EGTP
2635 * @params[in] ueId, cellId, DuUeCfg
2636 * @return ROK - success
2639 * ****************************************************************/
2641 uint8_t duUpdateTunnelCfgDb(uint8_t ueId, uint8_t cellId, DuUeCfg *duUeCfg)
2643 uint8_t ret = ROK, drbIdx, teIdx;
2644 bool drbFound = false;
2646 /*If Add/Mod tunnels request for that DRB is successful in EGTP */
2647 /*then update drbId and tunnel Info in duCb */
2648 for(drbIdx=0; drbIdx < duUeCfg->numDrb; drbIdx++)
2650 duUeCfg->upTnlInfo[drbIdx].cellId = cellId;
2651 duUeCfg->upTnlInfo[drbIdx].ueId = ueId;
2652 for(teIdx = 0; teIdx < duCb.numTeId; teIdx++)
2654 if((duCb.upTnlCfg[teIdx]->ueId == duUeCfg->upTnlInfo[drbIdx].ueId) && \
2655 (duCb.upTnlCfg[teIdx]->drbId == duUeCfg->upTnlInfo[drbIdx].drbId))
2657 drbFound = true; /* existing DRB */
2658 if(duProcEgtpTunnelCfg(teIdx, duCb.upTnlCfg[teIdx], &duUeCfg->upTnlInfo[drbIdx]) != ROK)
2660 DU_LOG("\nERROR -> DU_APP : duUpdateTunnelCfgDb: Failed to modify tunnel req for Drb id[%d]",
2661 duUeCfg->upTnlInfo[drbIdx].drbId);
2670 if(!drbFound && ret == ROK)/* new DRB to Add */
2672 if(duProcEgtpTunnelCfg(NULLP, NULLP, &duUeCfg->upTnlInfo[drbIdx]) != ROK)
2674 DU_LOG("\nERROR -> DU_APP : duUpdateTunnelCfgDb: Failed to add tunnel req for Drb id[%d]",
2675 duUeCfg->upTnlInfo[drbIdx].drbId);
2684 /*******************************************************************
2686 * @brief @brief To update DuUeCb Mac and Rlc Ue Cfg
2691 * Function : duUpdateDuUeCbCfg
2693 * Functionality: update DuUeCb Mac and Rlc Ue Cfg
2695 * @params[in] ueId, cellIdx
2696 * @return ROK - success
2699 * ****************************************************************/
2701 uint8_t duUpdateDuUeCbCfg(uint8_t ueId, uint8_t cellId)
2704 uint16_t cellIdx = 0, crnti=0;
2705 DuUeCb *ueCb = NULLP;
2707 GET_CELL_IDX(cellId, cellIdx);
2708 ueCb = &duCb.actvCellLst[cellIdx]->ueCb[ueId-1];
2710 /*Filling RLC Ue Cfg */
2711 ueCb->duRlcUeCfg.cellId = cellId;
2712 ueCb->duRlcUeCfg.ueId = ueId;
2713 ret = duUpdateRlcLcCfg(&ueCb->duRlcUeCfg, ueCb->f1UeDb);
2716 /*Filling MAC Ue Cfg */
2717 GET_CRNTI(crnti, ueId);
2718 ueCb->duMacUeCfg.cellId = cellId;
2719 ueCb->duMacUeCfg.ueId = ueId;
2720 ueCb->duMacUeCfg.crnti = crnti;
2721 ret = duUpdateMacCfg(&ueCb->duMacUeCfg, ueCb->f1UeDb);
2723 DU_LOG("\nERROR --> DU APP : Failed while updating MAC LC Config at duUpdateDuUeCbCfg()");
2726 if(duUpdateTunnelCfgDb(ueId, cellId, &ueCb->f1UeDb->duUeCfg) != ROK)
2728 DU_LOG("\nERROR --> DU_APP : Failed to establish tunnel in duUpdateDuUeCbCfg()");
2734 DU_LOG("\nERROR --> DU APP : Failed while updating RLC LC Config at duUpdateDuUeCbCfg()");
2738 /*******************************************************************
2740 * @brief Handle UE create response from MAC
2744 * Function : DuProcMacUeCreateRsp
2746 * Functionality: Handle UE Create response from MAC
2748 * @params[in] Pointer to MacUeCreateRsp and Pst
2749 * @return ROK - success
2752 * ****************************************************************/
2753 uint8_t DuProcMacUeCreateRsp(Pst *pst, MacUeCreateRsp *cfgRsp)
2760 GET_CELL_IDX(cfgRsp->cellId, cellIdx);
2761 if(cfgRsp->result == MAC_DU_APP_RSP_OK)
2763 if(pst->event == EVENT_MAC_UE_CREATE_RSP)
2765 DU_LOG("\nINFO --> DU APP : MAC UE Create Response : SUCCESS [DU UE F1AP ID : %d]", cfgRsp->ueId);
2767 if(duCb.actvCellLst[cellIdx] && (duCb.actvCellLst[cellIdx]->ueCb[cfgRsp->ueId -1].gnbDuUeF1apId == cfgRsp->ueId))
2769 duCb.actvCellLst[cellIdx]->ueCb[cfgRsp->ueId -1].duMacUeCfg.macUeCfgState = UE_CREATE_COMPLETE;
2771 if((duCb.actvCellLst[cfgRsp->cellId -1]->ueCb[cfgRsp->ueId -1].ueState == UE_HANDIN_IN_PROGRESS) &&
2772 (duCb.actvCellLst[cfgRsp->cellId -1]->ueCb[cfgRsp->ueId -1].duMacUeCfg.macUeCfgState == UE_CREATE_COMPLETE) &&
2773 (duCb.actvCellLst[cfgRsp->cellId -1]->ueCb[cfgRsp->ueId -1].duRlcUeCfg.rlcUeCfgState == UE_CREATE_COMPLETE))
2775 if((ret = duUpdateDuUeCbCfg(cfgRsp->ueId, cfgRsp->cellId)) == ROK)
2777 /* If UE is in handover, RACH resource needs to be requested
2778 * from MAC for CFRA */
2779 if((duBuildAndSendRachRsrcReqToMac(cfgRsp->cellId, cfgRsp->ueId)) != ROK)
2781 DU_LOG("\nERROR --> DU APP : Failed to send RACH Resource Request to MAC");
2782 DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL, cfgRsp, sizeof(MacUeCreateRsp));
2788 DU_LOG("\nERROR -> DU APP : Failure in updating DU UE CB");
2789 DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL, cfgRsp, sizeof(MacUeCreateRsp));
2798 DU_LOG("\nERROR --> DU APP : MAC UE CFG Response for EVENT[%d]: FAILURE [DU UE F1AP ID : %d]", pst->event, cfgRsp->ueId);
2801 DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL, cfgRsp, sizeof(MacUeCreateRsp));
2805 DU_LOG("\nERROR --> DU APP : Received MAC Ue Config Response is NULL at DuProcMacUeCreateRsp()");
2811 /*******************************************************************
2813 * @brief Handle UE Reconfig response from MAC
2817 * Function : DuProcMacUeRecfgRsp
2819 * Functionality: Handle UE ReConfig response from MAC
2821 * @params[in] Pointer to MacUeRecfgRsp and Pst
2822 * @return ROK - success
2825 * ****************************************************************/
2826 uint8_t DuProcMacUeRecfgRsp(Pst *pst, MacUeRecfgRsp *reCfgRsp)
2833 GET_CELL_IDX(reCfgRsp->cellId, cellIdx);
2834 if(reCfgRsp->result == MAC_DU_APP_RSP_OK)
2836 if(pst->event == EVENT_MAC_UE_RECONFIG_RSP)
2838 DU_LOG("\nINFO --> DU APP : MAC UE Reconfig Response : SUCCESS [DU UE F1AP ID : %d]", reCfgRsp->ueId);
2839 if(duCb.actvCellLst[cellIdx] &&
2840 (duCb.actvCellLst[cellIdx]->ueCb[reCfgRsp->ueId -1].gnbDuUeF1apId == reCfgRsp->ueId))
2842 duCb.actvCellLst[cellIdx]->ueCb[reCfgRsp->ueId -1].duMacUeCfg.macUeCfgState = UE_RECFG_COMPLETE;
2843 if((duCb.actvCellLst[cellIdx]->ueCb[reCfgRsp->ueId -1].duMacUeCfg.macUeCfgState == UE_RECFG_COMPLETE) &&
2844 (duCb.actvCellLst[reCfgRsp->cellId -1]->ueCb[reCfgRsp->ueId -1].duRlcUeCfg.rlcUeCfgState == UE_RECFG_COMPLETE))
2846 if((ret = duUpdateDuUeCbCfg(reCfgRsp->ueId, reCfgRsp->cellId)) == ROK)
2848 if((BuildAndSendUeCtxtRsp(reCfgRsp->cellId, reCfgRsp->ueId)) != ROK)
2850 DU_LOG("\nERROR -> DU APP : Failure in BuildAndSendUeCtxtRsp()");
2851 DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL, reCfgRsp, sizeof(MacUeRecfgRsp));
2857 DU_LOG("\nERROR -> DU APP : Failure in updating DU UE CB");
2858 DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL, reCfgRsp, sizeof(MacUeRecfgRsp));
2867 DU_LOG("\nERROR --> DU APP : MAC UE RECFG Response for EVENT[%d]: FAILURE [DU UE F1AP ID : %d]", pst->event, reCfgRsp->ueId);
2868 if(pst->event == EVENT_MAC_UE_RECONFIG_RSP)
2870 //TODO: Send the failure case in Ue Context Setup Response
2874 DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL, reCfgRsp, sizeof(MacUeRecfgRsp));
2878 DU_LOG("\nERROR --> DU APP : Received MAC Ue ReConfig Response is NULL at DuProcMacUeRecfgRsp()");
2884 /*******************************************************************
2886 * @brief Processes UE create Req to RLC UL
2890 * Function : duBuildAndSendUeCreateReqToRlc
2893 * Processes UE create Req to RLC UL
2895 * @params[in] cellId,
2897 * Pointer to RlcUeCreate
2898 * @return ROK - success
2901 *****************************************************************/
2903 uint8_t duBuildAndSendUeCreateReqToRlc(uint16_t cellId, uint8_t gnbDuUeF1apId, DuUeCfg *ueCfgDb, DuRlcUeCfg *duRlcUeCfg)
2906 RlcUeCreate *rlcUeCfg = NULLP;
2909 ret = updateRlcUeCfg(cellId, gnbDuUeF1apId, ueCfgDb, duRlcUeCfg);
2912 DU_LOG("\nERROR --> DU APP : Failed to fill Rlc Ue Cfg at duBuildAndSendUeCreateReqToRlc()");
2916 FILL_PST_DUAPP_TO_RLC(pst, RLC_UL_INST, EVENT_RLC_UE_CREATE_REQ);
2917 /* Copying ueCfg to a sharable buffer */
2918 DU_ALLOC_SHRABL_BUF(rlcUeCfg, sizeof(RlcUeCreate));
2921 memset(rlcUeCfg, 0, sizeof(RlcUeCreate));
2922 fillRlcUeCfg(duRlcUeCfg, rlcUeCfg);
2924 /* Processing one Ue at a time to RLC */
2925 DU_LOG("\nDEBUG --> DU_APP: Sending UE create request to RLC UL");
2926 ret = (*packRlcUeCreateReqOpts[pst.selector])(&pst, rlcUeCfg);
2929 DU_LOG("\nERROR --> DU_APP : Failure in sending Ue Create Req to RLC");
2930 DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL, rlcUeCfg, sizeof(RlcUeCreate));
2936 DU_LOG("\n ERROR --> DU APP : Memory alloc failed at duBuildAndSendUeCreateReqToRlc()");
2942 /*******************************************************************
2944 * @brief Processes UE create Rsp received from RLC UL
2949 * Function : DuProcRlcUeCreateRsp
2952 * Processes UE create Rsp received from RLC UL
2954 * @params[in] Post structure
2955 * Pointer to RlcCfgCfm
2956 * @return ROK - success
2959 *****************************************************************/
2960 uint8_t DuProcRlcUeCreateRsp(Pst *pst, RlcUeCreateRsp *cfgRsp)
2966 if(cfgRsp->result == RLC_DU_APP_RSP_OK)
2968 if(pst->event == EVENT_RLC_UE_CREATE_RSP)
2970 DU_LOG("\nINFO --> DU_APP: RLC UE Create Response : SUCCESS [UE IDX:%d]", cfgRsp->ueId);
2971 duCb.actvCellLst[cfgRsp->cellId -1]->ueCb[cfgRsp->ueId -1].duRlcUeCfg.rlcUeCfgState = UE_CREATE_COMPLETE;
2973 if((duCb.actvCellLst[cfgRsp->cellId -1]->ueCb[cfgRsp->ueId -1].ueState == UE_HANDIN_IN_PROGRESS) &&
2974 (duCb.actvCellLst[cfgRsp->cellId -1]->ueCb[cfgRsp->ueId -1].duMacUeCfg.macUeCfgState == UE_CREATE_COMPLETE) &&
2975 (duCb.actvCellLst[cfgRsp->cellId -1]->ueCb[cfgRsp->ueId -1].duRlcUeCfg.rlcUeCfgState == UE_CREATE_COMPLETE))
2977 if((ret = duUpdateDuUeCbCfg(cfgRsp->ueId, cfgRsp->cellId)) == ROK)
2979 /* If UE is in handover, RACH resource needs to be requested
2980 * from MAC for CFRA */
2981 if((duBuildAndSendRachRsrcReqToMac(cfgRsp->cellId, cfgRsp->ueId)) != ROK)
2983 DU_LOG("\nERROR --> DU APP : Failed to send RACH Resource Request to MAC");
2984 DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL, cfgRsp, sizeof(RlcUeCreateRsp));
2990 DU_LOG("\nERROR --> DU APP : Failure in updating DU UE CB");
2991 DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL, cfgRsp, sizeof(RlcUeCreateRsp));
2999 DU_LOG("\nERROR --> DU_APP: RLC UE CREATE Response for EVENT[%d] : FAILED [UE IDX : %d, REASON :%d]",\
3000 pst->event, cfgRsp->ueId, cfgRsp->reason);
3003 DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL, cfgRsp, sizeof(RlcUeCreateRsp));
3007 DU_LOG("\nERROR --> DU_APP: Received RLC Ue Create Response is NULL at DuProcRlcUeCreateRsp()");
3013 /*******************************************************************
3015 * @brief Processes UE reconfig Rsp received from RLC UL
3020 * Function : DuProcRlcUeReconfigRsp
3023 * Processes UE reconfig Rsp received from RLC UL
3025 * @params[in] Post structure
3026 * Pointer to RlcCfgCfm
3027 * @return ROK - success
3030 *****************************************************************/
3031 uint8_t DuProcRlcUeReconfigRsp(Pst *pst, RlcUeReconfigRsp *cfgRsp)
3037 if(cfgRsp->result == RLC_DU_APP_RSP_OK)
3039 if(pst->event == EVENT_RLC_UE_RECONFIG_RSP)
3041 DU_LOG("\nINFO --> DU_APP: RLC UE Reconfig Response : SUCCESS [UE IDX:%d]", cfgRsp->ueId);
3043 duCb.actvCellLst[cfgRsp->cellId -1]->ueCb[cfgRsp->ueId -1].duRlcUeCfg.rlcUeCfgState = UE_RECFG_COMPLETE;
3044 if((duCb.actvCellLst[cfgRsp->cellId -1]->ueCb[cfgRsp->ueId -1].duMacUeCfg.macUeCfgState == UE_RECFG_COMPLETE) &&
3045 (duCb.actvCellLst[cfgRsp->cellId -1]->ueCb[cfgRsp->ueId -1].duRlcUeCfg.rlcUeCfgState == UE_RECFG_COMPLETE))
3047 if((ret = duUpdateDuUeCbCfg(cfgRsp->ueId, cfgRsp->cellId)) == ROK)
3049 if((BuildAndSendUeCtxtRsp(cfgRsp->cellId, cfgRsp->ueId)) != ROK)
3051 DU_LOG("\nERROR --> DU APP : Failure in BuildAndSendUeCtxtRsp");
3052 DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL, cfgRsp, sizeof(RlcUeReconfigRsp));
3058 DU_LOG("\nERROR --> DU APP : Failure in updating DU UE CB");
3059 DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL, cfgRsp, sizeof(RlcUeReconfigRsp));
3067 DU_LOG("\nERROR --> DU_APP: RLC UE RE-CFG Response for EVENT[%d] : FAILED [UE IDX : %d, REASON :%d]",\
3068 pst->event, cfgRsp->ueId, cfgRsp->reason);
3069 if((pst->event == EVENT_RLC_UE_RECONFIG_RSP))
3071 //TODO: update failure case in ue Context setup Response
3075 DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL, cfgRsp, sizeof(RlcUeReconfigRsp));
3079 DU_LOG("\nERROR --> DU_APP: Received RLC Ue ReConfig Response is NULL at DuProcRlcUeReconfigRsp()");
3084 /**********************************************************************************
3086 * @brief Fills Ue ReCfg from DU DB to RlcUeRecfg
3090 * Function : fillRlcUeRecfg
3092 * Functionality: fills ue ReCfg to be sent to RLC
3094 * @params[in] DuRlcUeCfg Pointer
3095 * RlcUeRecfg Pointer
3098 * *******************************************************************************/
3099 void fillRlcUeRecfg(DuRlcUeCfg *duRlcUeCfg, RlcUeRecfg *rlcUeRecfg)
3103 rlcUeRecfg->cellId = duRlcUeCfg->cellId;
3104 rlcUeRecfg->ueId = duRlcUeCfg->ueId;
3107 if(duRlcUeCfg->numLcs > 0)
3109 rlcUeRecfg->numLcsToAdd = 0;
3110 rlcUeRecfg->numLcsToMod = 0;
3111 rlcUeRecfg->numLcsToRel = 0;
3113 for(lcIdx = 0; lcIdx < duRlcUeCfg->numLcs; lcIdx++)
3115 if(duRlcUeCfg->rlcLcCfg[lcIdx].configType == CONFIG_ADD)
3117 memcpy(&rlcUeRecfg->rlcLcCfgAdd[rlcUeRecfg->numLcsToAdd], &duRlcUeCfg->rlcLcCfg[lcIdx].rlcBearerCfg, sizeof(RlcBearerCfg));
3118 rlcUeRecfg->numLcsToAdd++;
3120 if(duRlcUeCfg->rlcLcCfg[lcIdx].configType == CONFIG_MOD)
3122 memcpy(&rlcUeRecfg->rlcLcCfgMod[rlcUeRecfg->numLcsToMod], &duRlcUeCfg->rlcLcCfg[lcIdx].rlcBearerCfg, sizeof(RlcBearerCfg));
3123 rlcUeRecfg->numLcsToMod++;
3125 if(duRlcUeCfg->rlcLcCfg[lcIdx].configType == CONFIG_DEL)
3127 memcpy(&rlcUeRecfg->rlcLcCfgRel[rlcUeRecfg->numLcsToRel], &duRlcUeCfg->rlcLcCfg[lcIdx].rlcBearerCfg, sizeof(RlcBearerCfg));
3128 rlcUeRecfg->numLcsToRel++;
3135 /*******************************************************************
3137 * @brief Builds and Send Ue Reconfig Req to RLC
3141 * Function : duBuildAndSendUeRecfgReqToRLC
3143 * Functionality: Builds and Send Ue Reconfig Req to RLC
3145 * @params[in] uint16_t cellId,
3146 * uint6_t crnti #AS per 38.473 V15.3.0, Section 9.3.1.32 crnti
3147 * value range is b/w 0..65535#
3149 * RlcUeCreate *rlcUeCfg
3150 * @return ROK - success
3153 * ****************************************************************/
3155 uint8_t duBuildAndSendUeRecfgReqToRlc(uint16_t cellId, uint8_t gnbDuUeF1apId, uint16_t crnti, DuUeCfg *ueCfgDb)
3158 DuRlcUeCfg *duRlcUeCfg = NULLP;
3159 RlcUeRecfg *rlcUeRecfg = NULLP;
3161 DU_ALLOC(duRlcUeCfg, sizeof(DuRlcUeCfg));
3162 DU_ALLOC_SHRABL_BUF(rlcUeRecfg, sizeof(RlcUeRecfg));
3163 if(duRlcUeCfg && rlcUeRecfg)
3165 memset(duRlcUeCfg, 0, sizeof(DuRlcUeCfg));
3166 memset(rlcUeRecfg, 0, sizeof(RlcUeRecfg));
3168 ret = updateRlcUeCfg(cellId, gnbDuUeF1apId, ueCfgDb, duRlcUeCfg);
3171 DU_LOG("\nERROR --> DU APP : Failed at duBuildAndSendUeRecfgReqToRlc()");
3174 fillRlcUeRecfg(duRlcUeCfg, rlcUeRecfg);
3175 ret = sendUeRecfgReqToRlc(rlcUeRecfg);
3180 DU_LOG("\nERROR --> DU APP : Memory Alloc failed at duBuildAndSendUeRecfgReqToRlc()");
3183 DU_FREE(duRlcUeCfg, sizeof(DuRlcUeCfg));
3187 /**********************************************************************************
3189 * @brief Fills Ue ReCfg from DU DB to MacUeRecfg
3193 * Function : fillMacUeRecfg
3195 * Functionality: fills ue ReCfg to be sent to MAC
3197 * @params[in] DuMacUeCfg Pointer
3198 * MacUeRecfg Pointer
3201 * *******************************************************************************/
3202 void fillMacUeRecfg(DuMacUeCfg *duMacUeCfg, MacUeRecfg *macUeRecfg)
3206 macUeRecfg->cellId = duMacUeCfg->cellId;
3207 macUeRecfg->ueId = duMacUeCfg->ueId;
3208 macUeRecfg->crnti = duMacUeCfg->crnti;
3209 macUeRecfg->macCellGrpRecfgPres = duMacUeCfg->macCellGrpCfgPres;
3210 if(macUeRecfg->macCellGrpRecfgPres)
3212 memcpy(&macUeRecfg->macCellGrpRecfg, &duMacUeCfg->macCellGrpCfg, sizeof(MacCellGrpCfg));
3214 macUeRecfg->phyCellGrpRecfgPres = duMacUeCfg->phyCellGrpCfgPres;
3215 if(macUeRecfg->phyCellGrpRecfgPres)
3217 memcpy(&macUeRecfg->phyCellGrpRecfg, &duMacUeCfg->phyCellGrpCfg, sizeof(PhyCellGrpCfg));
3219 macUeRecfg->spCellRecfgPres = duMacUeCfg->spCellCfgPres;
3220 if(macUeRecfg->spCellRecfgPres)
3222 memcpy(&macUeRecfg->spCellRecfg, &duMacUeCfg->spCellCfg, sizeof(SpCellRecfg));
3224 if(duMacUeCfg->ambrCfg != NULLP)
3226 DU_ALLOC_SHRABL_BUF(macUeRecfg->ambrRecfg, sizeof(AmbrCfg));
3227 memcpy(macUeRecfg->ambrRecfg, duMacUeCfg->ambrCfg, sizeof(AmbrCfg));
3229 memcpy(&macUeRecfg->dlModInfo, &duMacUeCfg->dlModInfo, sizeof(ModulationInfo));
3230 memcpy(&macUeRecfg->ulModInfo, &duMacUeCfg->ulModInfo, sizeof(ModulationInfo));
3231 if(duMacUeCfg->numLcs > 0)
3233 macUeRecfg->numLcsToAdd = 0;
3234 macUeRecfg->numLcsToDel = 0;
3235 macUeRecfg->numLcsToMod = 0;
3237 for(lcIdx = 0; lcIdx < duMacUeCfg->numLcs; lcIdx++)
3239 if(duMacUeCfg->lcCfgList[lcIdx].configType == CONFIG_ADD)
3241 /*VS: To thoroughly check*/
3242 memcpy(&macUeRecfg->lcCfgAdd[macUeRecfg->numLcsToAdd], &duMacUeCfg->lcCfgList[lcIdx].lcConfig, sizeof(LcCfg));
3243 macUeRecfg->numLcsToAdd++;
3245 if(duMacUeCfg->lcCfgList[lcIdx].configType == CONFIG_DEL)
3247 /*VS: To thoroughly check*/
3248 macUeRecfg->lcIdToDel[macUeRecfg->numLcsToDel] = duMacUeCfg->lcCfgList[lcIdx].lcConfig.lcId;
3249 macUeRecfg->numLcsToDel++;
3251 if(duMacUeCfg->lcCfgList[lcIdx].configType == CONFIG_MOD)
3253 /*VS: To thoroughly check*/
3254 memcpy(&macUeRecfg->lcCfgMod[macUeRecfg->numLcsToMod], &duMacUeCfg->lcCfgList[lcIdx].lcConfig, sizeof(LcCfg));
3255 macUeRecfg->numLcsToMod++;
3259 macUeRecfg->transmissionAction = duMacUeCfg->transmissionAction;
3261 macUeRecfg->drxConfigIndicatorRelease = duMacUeCfg->drxConfigIndicatorRelease;
3265 /*******************************************************************
3267 * @brief Builds and Send Ue Reconfig Req to MAC
3271 * Function : duBuildAndSendUeRecfgReqToMac
3273 * Functionality: Builds and Send Ue Reconfig Req to MAC
3275 * @params[in] uint16_t cellId,
3276 * uint6_t crnti #AS per 38.473 V15.3.0, Section 9.3.1.32 crnti
3277 * value range is b/w 0..65535#
3278 * CellGroupConfigRrc_t *macCellGrpCfg
3280 * @return ROK - success
3283 * ****************************************************************/
3285 uint8_t duBuildAndSendUeRecfgReqToMac(uint16_t cellId, uint8_t duUeF1apId, uint16_t crnti, DuUeCfg *ueCfgDb)
3288 DuMacUeCfg *duMacUeCfg = NULLP;
3289 MacUeRecfg *macUeRecfg = NULLP;
3291 DU_ALLOC(duMacUeCfg, sizeof(DuMacUeCfg));
3292 DU_ALLOC_SHRABL_BUF(macUeRecfg, sizeof(MacUeRecfg));
3293 if(macUeRecfg && duMacUeCfg)
3295 memset(duMacUeCfg, 0, sizeof(DuMacUeCfg));
3296 memset(macUeRecfg, 0, sizeof(MacUeRecfg));
3298 ret = updateDuMacUeCfg(cellId, duUeF1apId, crnti, ueCfgDb, duMacUeCfg);
3300 DU_LOG("\nERROR --> DU APP : Failed to fill Mac Ue Cfg at duBuildAndSendUeRecfgReqToMac()");
3303 fillMacUeRecfg(duMacUeCfg, macUeRecfg);
3304 ret = sendUeRecfgReqToMac(macUeRecfg);
3309 DU_LOG("\nERROR --> DU APP : Memory alloc failed for macUeCfg at duBuildAndSendUeRecfgReqToMac()");
3312 DU_FREE(duMacUeCfg, sizeof(DuMacUeCfg));
3317 /*******************************************************************
3319 * @brief Build and Send Ue context setup request
3324 * Function : duBuildAndSendUeContextSetupReq
3327 * Build and Send Ue context setup request
3329 * @params[in] cellId, crnti, DuUeCfg pointer
3330 * @return ROK - success
3333 *****************************************************************/
3335 uint8_t duBuildAndSendUeContextSetupReq(uint16_t cellId, DuUeCb *ueCb)
3339 DuUeCfg *duUeCfg = NULLP;
3341 DU_LOG("\nDEBUG --> DU_APP: Processing Ue Context Setup Request for cellId [%d]", cellId);
3345 DU_LOG("\nERROR --> DU APP : UE Cb is NULL");
3349 crnti = ueCb->crnti;
3350 duUeCfg = &ueCb->f1UeDb->duUeCfg;
3352 /* If UE is being handed-in to this DU, UE context setup request will create
3353 * new UE context at MAC/SCH and RLC.
3354 * If UE is in active state, UE contex setup request will lead to
3355 * reconfiguration of UE at MAC/SCH and RLC
3357 if(ueCb->ueState == UE_HANDIN_IN_PROGRESS)
3359 /* Filling MAC UE Config */
3360 memset(&ueCb->duMacUeCfg, 0, sizeof(DuMacUeCfg));
3362 /* Since UE attach has not yet happened, crnti is unknow. Hence passing 0 */
3363 ret = duBuildAndSendUeCreateReqToMac(cellId, ueCb->gnbDuUeF1apId, 0, duUeCfg, &ueCb->duMacUeCfg);
3365 DU_LOG("\nERROR --> DU APP : Failed to send UE create request to MAC");
3367 ret = duBuildAndSendUeCreateReqToRlc(cellId, ueCb->gnbDuUeF1apId, duUeCfg, &ueCb->duRlcUeCfg);
3369 DU_LOG("\nERROR --> DU APP : Failed to send UE create request to RLC");
3374 /* Filling RLC UE Reconfig */
3375 ret = duBuildAndSendUeRecfgReqToRlc(cellId, ueCb->gnbDuUeF1apId, crnti, duUeCfg);
3377 DU_LOG("\nERROR --> DU APP : Failed to build ctxt setup req for RLC at duBuildAndSendUeContextSetupReq()");
3379 /* Filling MAC UE Reconfig */
3380 ret = duBuildAndSendUeRecfgReqToMac(cellId, ueCb->gnbDuUeF1apId, crnti, duUeCfg);
3382 DU_LOG("\nERROR --> DU APP : Failed at build ctxt setup req for MAC at duBuildAndSendUeContextSetupReq()");
3388 /*******************************************************************
3390 * @brief Processes DL Rsp received from RLC DL
3395 * Function : DuProcRlcDlRrcMsgRsp
3398 * Processes UE Rsp received from RLC DL
3400 * @params[in] Post structure
3401 * Pointer to RlcCfgCfm
3402 * @return ROK - success
3405 *****************************************************************/
3406 uint8_t DuProcRlcDlRrcMsgRsp(Pst *pst, RlcDlRrcMsgRsp *dlRrcMsg)
3408 uint8_t ret = ROK, ueId = 0;
3409 uint16_t cellId, crnti;
3410 DuUeCb *ueCb = NULLP;
3413 state = dlRrcMsg->state;
3414 cellId = dlRrcMsg->cellId;
3415 crnti = dlRrcMsg->crnti;
3416 DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL, dlRrcMsg, sizeof(RlcDlRrcMsgRsp));
3418 if(state == TRANSMISSION_COMPLETE)
3420 GET_UE_ID(crnti, ueId);
3421 ueCb = &duCb.actvCellLst[cellId -1]->ueCb[ueId -1];
3423 if(ueCb->f1UeDb && ueCb->f1UeDb->dlRrcMsgPres)
3425 if(ueCb->f1UeDb->actionType == UE_CTXT_SETUP)
3427 ret = duBuildAndSendUeContextSetupReq(cellId, ueCb);
3429 DU_LOG("\nERROR --> DU APP : Failed to process UE Context Setup Request in DuProcRlcDlRrcMsgRsp()");
3432 if(ueCb->f1UeDb->actionType == UE_CTXT_MOD)
3434 ret = duBuildAndSendUeContextModReq(cellId, ueCb->gnbDuUeF1apId, crnti, &ueCb->f1UeDb->duUeCfg);
3436 DU_LOG("\nERROR --> DU APP : Failed to process UE Context Mod Request in DuProcRlcDlRrcMsgRsp()");
3439 if(ueCb->f1UeDb->actionType == UE_CTXT_RELEASE && ueCb->ueState == UE_ACTIVE)
3441 ret = duBuildAndSendUeDeleteReq(cellId, crnti);
3444 DU_LOG("\nERROR --> DU APP : Failed to process UE Context Release Request in DuProcRlcDlRrcMsgRsp()");
3450 DU_LOG("\nERROR --> DU APP : Failed to transmit DL RRC Msg");
3454 /*******************************************************************
3456 * @brief Process UE context setup request from CU
3460 * Function : duProcUeContextSetupRequest
3462 * Functionality: Process UE context setup request from CU
3464 * @params[in] F1AP message
3465 * @return ROK - success
3468 * ****************************************************************/
3470 uint8_t duProcUeContextSetupRequest(DuUeCb *ueCb)
3472 uint8_t ret, cellId;
3477 cellId = duCb.actvCellLst[ueCb->f1UeDb->cellIdx]->cellId;
3479 /* Send DL RRC msg for security Mode */
3480 if(ueCb->f1UeDb->dlRrcMsg)
3482 if(ueCb->f1UeDb->dlRrcMsg->rrcMsgPdu)
3484 /* Sending DL RRC Message to RLC */
3485 ret = duBuildAndSendDlRrcMsgToRlc(cellId, ueCb->duRlcUeCfg, ueCb->f1UeDb->dlRrcMsg);
3488 DU_LOG("\nERROR --> DU APP : Failed to send DL RRC msg in duProcUeContextSetupRequest()");
3489 DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL, ueCb->f1UeDb->dlRrcMsg->rrcMsgPdu,\
3490 ueCb->f1UeDb->dlRrcMsg->rrcMsgSize);
3491 DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL, ueCb->f1UeDb->dlRrcMsg, sizeof(F1DlRrcMsg));
3495 else if(ueCb->f1UeDb->actionType == UE_CTXT_SETUP)
3497 ret = duBuildAndSendUeContextSetupReq(cellId, ueCb);
3500 DU_LOG("\nERROR --> DU APP : Failed to build ue context setup Req in duProcUeContextSetupRequest()");
3506 //TODO: To send the failure cause in UeContextSetupRsp
3507 DU_LOG("ERROR --> DU APP : Failed to process UE CNTXT SETUP REQ at duProcUeContextSetupRequest()");
3512 /*******************************************************************
3514 * @brief Build and Send Ue context mod request
3519 * Function : duBuildAndSendUeContextModReq
3522 * Build and Send Ue context mod request
3524 * @params[in] cellId, crnti, DuUeCfg pointer
3525 * @return ROK - success
3528 *****************************************************************/
3530 uint8_t duBuildAndSendUeContextModReq(uint16_t cellId, uint8_t gnbDuUeF1apId, uint16_t crnti, DuUeCfg *duUeCfg)
3534 DU_LOG("\nDEBUG --> DU_APP: Processing Ue Context Mod Request for cellId [%d]", cellId);
3535 /* Filling RLC Ue Reconfig */
3536 ret = duBuildAndSendUeRecfgReqToRlc(cellId, gnbDuUeF1apId, crnti, duUeCfg);
3538 DU_LOG("\nERROR --> DU APP : Failed to build ctxt setup req for RLC at duBuildAndSendUeContextModReq()");
3540 /* Filling MAC Ue Reconfig */
3541 ret = duBuildAndSendUeRecfgReqToMac(cellId, gnbDuUeF1apId, crnti, duUeCfg);
3543 DU_LOG("\nERROR --> DU APP : Failed at build ctxt setup req for MAC at duBuildAndSendUeContextModReq()");
3547 /*******************************************************************
3549 * @brief Processing Ue context mod request
3554 * Function : duProcUeContextModReq
3557 * Processing Ue context mod request
3559 * @params[in] DuUeCb *ueCb
3560 * @return ROK - success
3563 *****************************************************************/
3565 uint8_t duProcUeContextModReq(DuUeCb *ueCb)
3567 uint8_t ret, cellId;
3572 cellId = duCb.actvCellLst[ueCb->f1UeDb->cellIdx]->cellId;
3573 /* Send DL RRC msg for security Mode */
3574 if(ueCb->f1UeDb->dlRrcMsg)
3576 if(ueCb->f1UeDb->dlRrcMsg->rrcMsgPdu)
3578 /* Sending DL RRC Message to RLC */
3579 ret = duBuildAndSendDlRrcMsgToRlc(cellId, ueCb->duRlcUeCfg, ueCb->f1UeDb->dlRrcMsg);
3582 DU_LOG("\nERROR --> DU APP : Failed to send DL RRC msg in duProcUeContextModReq()");
3583 DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL, ueCb->f1UeDb->dlRrcMsg->rrcMsgPdu,\
3584 ueCb->f1UeDb->dlRrcMsg->rrcMsgSize);
3585 DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL, ueCb->f1UeDb->dlRrcMsg, sizeof(F1DlRrcMsg));
3589 else if(ueCb->f1UeDb->actionType == UE_CTXT_MOD)
3591 ret = duBuildAndSendUeContextModReq(cellId, ueCb->gnbDuUeF1apId, ueCb->crnti, &ueCb->f1UeDb->duUeCfg);
3594 DU_LOG("\nERROR --> DU APP : Failed to build ue context setup Req in duProcUeContextModReq()");
3598 else if((ueCb->f1UeDb->actionType == UE_CTXT_CFG_QUERY) || (ueCb->f1UeDb->actionType == UE_CTXT_RRC_RECFG_COMPLETE))
3600 if((BuildAndSendUeContextModRsp(ueCb) != ROK))
3602 DU_LOG("\nERROR --> DU APP : Failed to build UE Context modification response");
3609 //TODO: To send the failure cause in UeContextModRsp
3611 DU_LOG("ERROR --> DU APP : Failed to process UE CNTXT MOD REQ at duProcUeContextModReq()");
3617 /*******************************************************************
3619 * @brief Build and send dedicated RACH resource release request to MAC
3623 * Function : duBuildAndSendRachRsrcRelToMac
3625 * Functionality: Function to Build and send dedicated RACH resource
3626 * release request to MAC
3628 * @params[in] Cell ID
3630 * @return ROK - Success
3633 * ****************************************************************/
3634 uint8_t duBuildAndSendRachRsrcRelToMac(uint16_t cellId, DuUeCb *ueCb)
3637 MacRachRsrcRel *rachRsrcRel = NULLP;
3639 DU_ALLOC_SHRABL_BUF(rachRsrcRel, sizeof(MacRachRsrcRel));
3642 DU_LOG("\nERROR --> DU APP : Failed to allocate memory for RACH Resource Release in \
3643 duBuildAndSendRachRsrcRelToMac()");
3647 rachRsrcRel->cellId = cellId;
3648 rachRsrcRel->ueId = ueCb->gnbDuUeF1apId;
3649 rachRsrcRel->crnti = ueCb->crnti;
3652 FILL_PST_DUAPP_TO_MAC(pst, EVENT_MAC_RACH_RESOURCE_REL);
3654 if(((*packMacRachRsrcRelOpts[pst.selector])(&pst, rachRsrcRel)) != ROK)
3656 DU_LOG("\nERROR --> DU_APP : Failure in sending RACH Resource Release to MAC at \
3657 duBuildAndSendRachRsrcRelToMac()");
3658 DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL, rachRsrcRel, sizeof(MacRachRsrcRel));
3665 /*******************************************************************
3667 * @brief delete DuMacUeCfg from duCb
3671 * Function : deleteMacUeCfg
3673 * Functionality: delete DuMacUeCfg from duCb
3675 * @params[in] Pointer to DuMacUeCfg
3676 * @return ROK - success
3679 *******************************************************************/
3681 void deleteMacUeCfg(DuMacUeCfg *ueCfg)
3685 if(ueCfg->spCellCfgPres)
3687 freeUeRecfgCellGrpInfo(ueCfg);
3691 DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL,ueCfg->ambrCfg, sizeof(AmbrCfg));
3693 for(lcCfgIdx=0; lcCfgIdx< ueCfg->numLcs; lcCfgIdx++)
3695 freeMacLcCfg(&ueCfg->lcCfgList[lcCfgIdx].lcConfig);
3697 memset(ueCfg, 0, sizeof(DuMacUeCfg));
3700 /*******************************************************************
3702 * @brief delete UE Configuration of a particular UE
3706 * Function : deleteUeCfg
3708 * Functionality: delete UE Configuration of a particular UE
3710 * @params[in] uint16_t cellIdx, uint8_t ueId
3711 * @return ROK - success
3714 * ****************************************************************/
3715 uint8_t deleteUeCfg(uint16_t cellId, uint8_t ueId)
3718 uint16_t cellIdx = 0;
3719 DuUeCb *ueCb = NULLP;
3721 GET_CELL_IDX(cellId, cellIdx);
3722 if(duCb.actvCellLst[cellIdx] != NULLP)
3724 if((duCb.actvCellLst[cellIdx]->ueCb[ueId-1].duMacUeCfg.macUeCfgState == UE_DELETE_COMPLETE)\
3725 &&(duCb.actvCellLst[cellIdx]->ueCb[ueId-1].duRlcUeCfg.rlcUeCfgState == UE_DELETE_COMPLETE))
3727 ueCb = &duCb.actvCellLst[cellIdx]->ueCb[ueId-1];
3728 deleteMacUeCfg(&ueCb->duMacUeCfg);
3729 deleteRlcUeCfg(&ueCb->duRlcUeCfg);
3730 if(ueCb->f1UeDb !=NULLP)
3732 freeF1UeDb(ueCb->f1UeDb);
3734 for(tnlIdx = 0; tnlIdx < duCb.numTeId; )
3736 if(duCb.upTnlCfg[tnlIdx]->ueId == ueId)
3738 duCb.upTnlCfg[tnlIdx]->configType = CONFIG_DEL;
3739 duProcEgtpTunnelCfg(tnlIdx, duCb.upTnlCfg[tnlIdx], duCb.upTnlCfg[tnlIdx]);
3744 unsetBitInUeBitMap(cellId, ueId-1);
3745 duCb.actvCellLst[cellIdx]->numActvUes--;
3746 memset(ueCb, 0, sizeof(DuUeCb));
3755 DU_LOG("\nERROR --> DU APP : deleteUeCfg(): CellIdx[%d] is not found", cellIdx);
3762 /*******************************************************************
3764 * @brief Handle UE delete response from MAC
3768 * Function : DuProcMacUeDeleteRsp
3770 * Functionality: Handle UE delete response from MAC
3772 * @params[in] Pointer to MacUeDeleteRsp and Pst
3773 * @return ROK - success
3776 * ****************************************************************/
3778 uint8_t DuProcMacUeDeleteRsp(Pst *pst, MacUeDeleteRsp *deleteRsp)
3780 uint8_t ret =ROK,ueId=0;
3782 uint32_t gnbCuUeF1apId =0 , gnbDuUeF1apId =0;
3786 if(deleteRsp->status == SUCCESSFUL)
3788 DU_LOG("\nINFO --> DU APP : MAC UE Delete Response : SUCCESS [UE IDX : %d]", deleteRsp->ueId);
3789 GET_CELL_IDX(deleteRsp->cellId, cellIdx);
3790 if(duCb.actvCellLst[cellIdx])
3792 duCb.actvCellLst[cellIdx]->ueCb[deleteRsp->ueId -1].duMacUeCfg.macUeCfgState = UE_DELETE_COMPLETE;
3793 ueId = deleteRsp->ueId;
3794 gnbCuUeF1apId = duCb.actvCellLst[cellIdx]->ueCb[ueId-1].gnbCuUeF1apId;
3795 gnbDuUeF1apId = duCb.actvCellLst[cellIdx]->ueCb[ueId-1].gnbDuUeF1apId;
3796 if(deleteUeCfg(deleteRsp->cellId, ueId) == ROK)
3798 ret = BuildAndSendUeContextReleaseComplete(deleteRsp->cellId, gnbCuUeF1apId, gnbDuUeF1apId);
3801 DU_LOG("\nERROR --> DU APP : DuProcMacUeDeleteRsp(): failed to send UE context release complete");
3809 DU_LOG("\nERROR --> DU APP : DuProcMacUeDeleteRsp(): MAC UE Delete Response : FAILURE [UE IDX : %d]",\
3813 DU_FREE_SHRABL_BUF(pst->region, pst->pool, deleteRsp, sizeof(MacUeDeleteRsp));
3817 DU_LOG("\nERROR --> DU APP : DuProcMacUeDeleteRsp(): MAC UE Delete Response is null");
3823 /*******************************************************************
3825 * @brief Processes UE Delete Rsp received from RLC
3829 * Function : DuProcRlcUeDeleteRsp
3832 * Processes UE Delete Rsp received from RLC
3834 * @params[in] Post structure
3835 * Pointer to RlcUeDeleteRsp
3836 * @return ROK - success
3839 * *****************************************************************/
3841 uint8_t DuProcRlcUeDeleteRsp(Pst *pst, RlcUeDeleteRsp *delRsp)
3843 uint8_t ueId = 0, ret = ROK;
3844 uint16_t cellIdx = 0,crnti=0;
3848 ueId = delRsp->ueId;
3849 GET_CELL_IDX(delRsp->cellId, cellIdx);
3851 if(delRsp->status == SUCCESSFUL)
3853 DU_LOG("\nINFO --> DU_APP: RLC UE Delete Response : SUCCESS [UE IDX:%d]", ueId);
3854 if(duCb.actvCellLst[cellIdx]!=NULLP)
3856 duCb.actvCellLst[cellIdx]->ueCb[ueId-1].duRlcUeCfg.rlcUeCfgState = UE_DELETE_COMPLETE;
3857 GET_CRNTI(crnti, ueId);
3858 if(sendUeDeleteReqToMac(delRsp->cellId, ueId, crnti) == RFAILED)
3860 DU_LOG("\nERROR --> DU APP : duBuildAndSendUeDeleteReq(): Failed to build UE delete req for MAC ");
3868 DU_LOG("\nERROR --> DU_APP: RLC UE Delete Response : FAILED [UE IDX:%d]", ueId);
3871 DU_FREE_SHRABL_BUF(pst->region, pst->pool, delRsp, sizeof(RlcUeDeleteRsp));
3877 /*******************************************************************
3879 * @brief Sending UE Delete Req To Mac
3883 * Function : sendUeDeleteReqToMac
3886 * sending UE Delete Req To Mac
3888 * @params[in] cellId, ueId, crnti
3889 * @return ROK - success
3892 *****************************************************************/
3894 uint8_t sendUeDeleteReqToMac(uint16_t cellId, uint8_t ueId, uint16_t crnti)
3898 MacUeDelete *ueDelete = NULLP;
3900 DU_ALLOC_SHRABL_BUF(ueDelete, sizeof(MacUeDelete));
3903 ueDelete->cellId = cellId;
3904 ueDelete->ueId = ueId;
3905 ueDelete->crnti = crnti;
3906 FILL_PST_DUAPP_TO_MAC(pst, EVENT_MAC_UE_DELETE_REQ);
3908 DU_LOG("\nDEBUG --> DU_APP: Sending UE delete Request to MAC ");
3909 ret = (*packMacUeDeleteReqOpts[pst.selector])(&pst, ueDelete);
3912 DU_LOG("\nERROR --> DU_APP: sendUeDeleteReqToMac(): Failed to send UE delete Req to MAC");
3913 DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL, ueDelete, sizeof(MacUeDelete));
3918 DU_LOG("\nERROR --> DU_APP: sendUeDeleteReqToMac(): Failed to allocate memory");
3924 /*******************************************************************
3926 * @brief Sending UE Delete Req To Rlc
3930 * Function : sendUeDeleteReqToRlc
3933 * Sending UE Delete Req To Rlc
3935 * @params[in] cellId, ueId
3936 * @return ROK - success
3939 *****************************************************************/
3941 uint8_t sendUeDeleteReqToRlc(uint16_t cellId, uint8_t ueId)
3945 RlcUeDelete *ueDelete;
3947 DU_ALLOC_SHRABL_BUF(ueDelete, sizeof(RlcUeDelete));
3948 if(ueDelete !=NULLP)
3950 ueDelete->cellId = cellId;
3951 ueDelete->ueId = ueId;
3952 FILL_PST_DUAPP_TO_RLC(pst, RLC_UL_INST, EVENT_RLC_UE_DELETE_REQ);
3954 ret = (*packRlcUeDeleteReqOpts[pst.selector])(&pst, ueDelete);
3957 DU_LOG("\nERROR --> DU_APP : sendUeDeleteReqToRlc():Failed to send UE Delete Req to RLC");
3958 DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL, ueDelete, sizeof(RlcUeDelete));
3963 DU_LOG("\nERROR --> DU_APP: sendUeDeleteReqToRlc():Memory allocation failed");
3969 /*******************************************************************
3971 * @brief DU processes UE delete req from CU and sends to MAC and RLC
3975 * Function : duBuildAndSendUeDeleteReq
3977 * Functionality: DU processes UE delete req from CU and sends to MAC
3980 * @params[in] cellId, crnti
3981 * @return ROK - success
3984 * ****************************************************************/
3986 uint8_t duBuildAndSendUeDeleteReq(uint16_t cellId, uint16_t crnti)
3989 uint16_t cellIdx = 0;
3991 DU_LOG("\nDEBUG --> DU_APP: Processing UE Delete Request ");
3992 GET_CELL_IDX(cellId, cellIdx);
3993 GET_UE_ID(crnti, ueId);
3995 if(duCb.actvCellLst[cellIdx] != NULLP)
3997 if(crnti != duCb.actvCellLst[cellIdx]->ueCb[ueId - 1].crnti)
3999 DU_LOG("\nERROR --> DU APP : duBuildAndSendUeDeleteReq(): CRNTI [%d] not found", crnti);
4003 duCb.actvCellLst[cellIdx]->ueCb[ueId - 1].ueState = UE_DELETION_IN_PROGRESS;
4004 if(sendUeDeleteReqToRlc(cellId, ueId) == RFAILED)
4006 DU_LOG("\nERROR --> DU APP : DuProcMacUeDeleteRsp():Failed to build UE delete req for RLC ");
4012 DU_LOG("\nERROR --> DU APP : duBuildAndSendUeDeleteReq(): Cell Id is not found");
4019 /*******************************************************************
4021 * @brief delete RlcUeCreate from duCb
4025 * Function : deleteRlcUeCfg
4028 * delete RlcUeCreate from duCb
4030 * @params[in] RlcUeCreate *ueCfg
4032 * @return ROK - success
4035 *****************************************************************/
4037 void deleteRlcUeCfg(DuRlcUeCfg *ueCfg)
4040 RlcBearerCfg *lcCfg= NULLP;
4043 for(lcIdx =0 ; lcIdx < ueCfg->numLcs ; lcIdx++)
4045 lcCfg = &ueCfg->rlcLcCfg[lcIdx].rlcBearerCfg;
4046 switch(lcCfg->rlcMode)
4050 DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL, lcCfg->u.amCfg, sizeof(AmBearerCfg));
4053 case RLC_UM_BI_DIRECTIONAL :
4055 DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL, lcCfg->u.umBiDirCfg, sizeof(UmBiDirBearerCfg));
4058 case RLC_UM_UNI_DIRECTIONAL_UL :
4060 DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL, lcCfg->u.umUniDirUlCfg, sizeof(UmUniDirUlBearerCfg));
4063 case RLC_UM_UNI_DIRECTIONAL_DL :
4065 DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL, lcCfg->u.umUniDirDlCfg, sizeof(UmUniDirDlBearerCfg));
4069 DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL, lcCfg->snssai, sizeof(Snssai));
4071 memset(ueCfg, 0, sizeof(DuRlcUeCfg));
4075 /*******************************************************************
4077 * @brief Du process Ue Context Release Command
4081 * Function : duProcUeContextReleaseCommand
4083 * Functionality: Du process Ue Context Release Command
4085 * @params[in] DuUeCb *duUeCb
4086 * @return ROK - success
4089 * ****************************************************************/
4090 uint8_t duProcUeContextReleaseCommand(uint16_t cellId, DuUeCb *duUeCb)
4092 uint8_t ret =ROK, ueId=0;
4097 crnti = duUeCb->crnti;
4098 GET_UE_ID(crnti, ueId);
4102 /* Send DL RRC msg for RRC release */
4103 if(duUeCb->f1UeDb->dlRrcMsg)
4105 if(duUeCb->f1UeDb->dlRrcMsg->rrcMsgPdu != NULLP)
4107 ret = duBuildAndSendDlRrcMsgToRlc(cellId, duCb.actvCellLst[duUeCb->f1UeDb->cellIdx]->ueCb[ueId-1].duRlcUeCfg,\
4108 duUeCb->f1UeDb->dlRrcMsg);
4111 DU_LOG("\nERROR --> DU APP : duProcUeContextReleaseCommand() : Failed to send DL RRC msg");
4112 DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL, duUeCb->f1UeDb->dlRrcMsg->rrcMsgPdu,\
4113 duUeCb->f1UeDb->dlRrcMsg->rrcMsgSize);
4114 DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL, duUeCb->f1UeDb->dlRrcMsg, sizeof(F1DlRrcMsg));
4121 ret = duBuildAndSendUeDeleteReq(cellId,crnti);
4124 DU_LOG("\nERROR --> DU APP : duProcUeContextReleaseCommand(): Failed to build and send Ue Delete request");
4131 /*******************************************************************
4133 * @brief Sending UE Reset Req To Mac
4137 * Function : sendUeResetReqToMac
4140 * sending UE Reset Req To Mac
4142 * @params[in] cellId, ueId, crnti
4143 * @return ROK - success
4146 *****************************************************************/
4148 uint8_t sendUeResetReqToMac(uint16_t cellId, uint8_t ueId)
4152 MacUeResetReq *ueReset = NULLP;
4154 DU_ALLOC_SHRABL_BUF(ueReset, sizeof(MacUeResetReq));
4157 ueReset->cellId = cellId;
4158 ueReset->ueId = ueId;
4159 FILL_PST_DUAPP_TO_MAC(pst, EVENT_MAC_UE_RESET_REQ);
4161 DU_LOG("\nDEBUG --> DU_APP: Sending UE Reset Request to MAC ");
4162 ret = (*packMacUeResetReqOpts[pst.selector])(&pst, ueReset);
4165 DU_LOG("\nERROR --> DU_APP: sendUeResetReqToMac(): Failed to send UE Reset Req to MAC");
4166 DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL, ueReset, sizeof(MacUeResetReq));
4171 DU_LOG("\nERROR --> DU_APP: sendUeResetReqToMac(): Failed to allocate memory");
4177 /*******************************************************************
4179 * @brief DU processes UE reset req and send it to MAC
4183 * Function : duBuildAndSendUeResetReq
4185 * Functionality: DU processes UE reset req and send to MAC
4188 * @params[in] cellId, crnti
4189 * @return ROK - success
4192 * ****************************************************************/
4194 uint8_t duBuildAndSendUeResetReq(uint16_t cellId, uint16_t crnti)
4197 uint16_t cellIdx = 0;
4199 DU_LOG("\nDEBUG --> DU_APP : Building UE reset request");
4200 GET_CELL_IDX(cellId, cellIdx);
4201 GET_UE_ID(crnti, ueId);
4203 if(duCb.actvCellLst[cellIdx] != NULLP)
4205 if(crnti != duCb.actvCellLst[cellIdx]->ueCb[ueId - 1].crnti)
4207 DU_LOG("\nERROR --> DU APP : duBuildAndSendUeResetReq(): CRNTI [%d] not found", crnti);
4211 duCb.actvCellLst[cellIdx]->ueCb[ueId - 1].ueState = UE_RESET_IN_PROGRESS;
4212 if(sendUeResetReqToMac(cellId, ueId) == RFAILED)
4214 DU_LOG("\nERROR --> DU APP : DuProcMacUeResetRsp(): Failed to build UE reset req for MAC ");
4220 DU_LOG("\nERROR --> DU APP : duBuildAndSendUeResetReq(): Cell Id %d not found", cellId);
4227 /*******************************************************************
4229 * @brief Handle UE reset response from MAC
4233 * Function : DuProcMacUeResetRsp
4235 * Functionality: Handle UE reset response from MAC
4237 * @params[in] Pointer to MacUeResetRsp and Pst
4238 * @return ROK - success
4241 * ****************************************************************/
4243 uint8_t DuProcMacUeResetRsp(Pst *pst, MacUeResetRsp *resetRsp)
4250 if(resetRsp->status == SUCCESSFUL)
4252 DU_LOG("\nINFO --> DU APP : MAC UE Reset Response : SUCCESS [UE IDX : %d]", resetRsp->ueId);
4253 GET_CELL_IDX(resetRsp->cellId, cellIdx);
4254 if(duCb.actvCellLst[cellIdx])
4256 duCb.actvCellLst[cellIdx]->ueCb[resetRsp->ueId -1].duMacUeCfg.macUeCfgState = UE_RESET_COMPLETE;
4257 /*TODO - Complete the processing after receiving successfully reset rsp*/
4262 DU_LOG("\nERROR --> DU APP : DuProcMacUeResetRsp(): MAC UE Reset Response : FAILURE [UE IDX : %d]",resetRsp->ueId);
4265 DU_FREE_SHRABL_BUF(pst->region, pst->pool, resetRsp, sizeof(MacUeResetRsp));
4269 DU_LOG("\nERROR --> DU APP : DuProcMacUeResetRsp(): MAC UE Reset Response is null");
4275 /*******************************************************************
4277 * @brief Handle UE sync status indication from MAC
4281 * Function : DuProcMacUeSyncStatusInd
4283 * Functionality: Handle UE sync status indication from MAC
4285 * @params[in] Pointer to MacUeSyncStatusInd and Pst
4286 * @return ROK - success
4289 * ****************************************************************/
4291 uint8_t DuProcMacUeSyncStatusInd(Pst *pst, MacUeSyncStatusInd *ueSyncStatusInd)
4293 uint8_t ret =RFAILED;
4294 uint16_t cellIdx=0, crnti = 0;
4299 GET_CELL_IDX(ueSyncStatusInd->cellId, cellIdx);
4300 if(duCb.actvCellLst[cellIdx])
4302 GET_CRNTI(crnti, ueSyncStatusInd->ueId);
4303 if(duCb.actvCellLst[cellIdx]->ueCb[ueSyncStatusInd->ueId-1].crnti == crnti)
4305 switch(ueSyncStatusInd->status)
4312 status = "OUT_OF_SYNC";
4315 case OUT_OF_SUNC_MAX_RETRIES:
4316 status = "OUT_OF_SUNC_MAX_RETRIES";
4324 DU_LOG("\nINFO --> DU APP : MAC UE sync status for received UeId %d is %s", ueSyncStatusInd->ueId,status);
4328 DU_LOG("\nERROR --> DU APP : DuProcMacUeSyncStatusInd(): MAC UE sync status indication : Ue Id [%d] not found",ueSyncStatusInd->cellId);
4333 DU_LOG("\nERROR --> DU APP : DuProcMacUeSyncStatusInd(): MAC UE sync status indication : Cell Id [%d] not found",ueSyncStatusInd->cellId);
4335 DU_FREE_SHRABL_BUF(pst->region, pst->pool, ueSyncStatusInd, sizeof(MacUeSyncStatusInd));
4339 DU_LOG("\nERROR --> DU APP : DuProcMacUeSyncStatusInd(): MAC UE sync status indication is null");
4344 /*******************************************************************
4346 * @brief Sending UE Reestablishment Req To Rlc
4350 * Function : sendUeReestablishReqToRlc
4353 * Sending UE Reestablishment Req To Rlc
4355 * @params[in] cellId, ueId
4356 * @return ROK - success
4359 *****************************************************************/
4361 uint8_t sendUeReestablishReqToRlc(uint16_t cellId, uint8_t ueId, uint8_t numLcToReestablish, uint8_t *lcId)
4363 uint8_t ret=ROK,idx=0;
4365 RlcUeReestablishReq *ueReestablish;
4367 DU_ALLOC_SHRABL_BUF(ueReestablish, sizeof(RlcUeReestablishReq));
4368 if(ueReestablish !=NULLP)
4370 ueReestablish->cellId = cellId;
4371 ueReestablish->ueId = ueId;
4372 ueReestablish->numLcsToReestablish = numLcToReestablish;
4374 for(idx = 0;idx<numLcToReestablish; idx++)
4376 ueReestablish->lcToReestablish[idx]= lcId[idx];
4378 FILL_PST_DUAPP_TO_RLC(pst, RLC_UL_INST, EVENT_RLC_UE_REESTABLISH_REQ);
4380 ret = (*packRlcUeReestablishReqOpts[pst.selector])(&pst, ueReestablish);
4383 DU_LOG("\nERROR --> DU_APP : sendUeReestablishReqToRlc():Failed to send UE Reestablishment Req to RLC");
4384 DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL, ueReestablish, sizeof(RlcUeReestablishReq));
4389 DU_LOG("\nERROR --> DU_APP: sendUeReestablishReqToRlc():Memory allocation failed");
4395 /*******************************************************************
4397 * @brief DU processes UE reestablishment req and sends to MAC and RLC
4401 * Function : duBuildAndSendUeReestablishReq
4403 * Functionality: DU processes UE reestablishment req and sends to MAC
4406 * @params[in] cellId, crnti, numLcToReestablish, ListOflcid
4407 * @return ROK - success
4410 * ****************************************************************/
4412 uint8_t duBuildAndSendUeReestablishReq(uint16_t cellId, uint16_t crnti, uint8_t numLcToReestablish, uint8_t *lcId)
4415 uint16_t cellIdx = 0;
4417 DU_LOG("\nDEBUG --> DU_APP: Building UE Reestablishment Request ");
4418 GET_CELL_IDX(cellId, cellIdx);
4419 GET_UE_ID(crnti, ueId);
4421 if(duCb.actvCellLst[cellIdx] != NULLP)
4423 if(crnti != duCb.actvCellLst[cellIdx]->ueCb[ueId - 1].crnti)
4425 DU_LOG("\nERROR --> DU APP : duBuildAndSendUeReestablishReq(): CRNTI [%d] not found", crnti);
4429 if(sendUeReestablishReqToRlc(cellId, ueId, numLcToReestablish, lcId) == RFAILED)
4431 DU_LOG("\nERROR --> DU APP : duBuildAndSendUeReestablishReq(): Failed to send UE reestablishment req for RLC ");
4437 DU_LOG("\nERROR --> DU APP : duBuildAndSendUeReestablishReq(): Cell Id %d is not found", cellId);
4444 /*******************************************************************
4446 * @brief Processes UE Reestablishment Rsp received from RLC
4450 * Function : DuProcRlcUeReestablishRsp
4453 * Processes UE Reestablishment Rsp received from RLC
4455 * @params[in] Post structure
4456 * Pointer to RlcUeReestablishRsp
4457 * @return ROK - success
4460 * *****************************************************************/
4462 uint8_t DuProcRlcUeReestablishRsp(Pst *pst, RlcUeReestablishRsp *ueReestablishRsp)
4464 uint8_t ueId = 0, ret = RFAILED;
4465 uint16_t cellIdx = 0,crnti=0;
4467 if(ueReestablishRsp)
4469 ueId = ueReestablishRsp->ueId;
4470 GET_CELL_IDX(ueReestablishRsp->cellId, cellIdx);
4472 if(ueReestablishRsp->status == SUCCESSFUL)
4474 if(duCb.actvCellLst[cellIdx]!=NULLP)
4476 GET_CRNTI(crnti, ueId);
4477 if(duCb.actvCellLst[cellIdx]->ueCb[ueId-1].crnti == crnti)
4479 /*TODO: complete the processing of UE Reestablishment Response */
4480 DU_LOG("\nINFO --> DU_APP: RLC UE Reestablishment Response : SUCCESS [UE IDX:%d]", ueId);
4484 DU_LOG("\nERROR --> DU APP : duBuildAndSendUeReestablishRsp(): CRNTI [%d] not found", crnti);
4487 DU_LOG("\nERROR --> DU APP : duBuildAndSendUeReestablishRsp(): Cell Id[%d] is not found", ueReestablishRsp->cellId);
4492 DU_LOG("\nERROR --> DU_APP: RLC UE Reestablishment Response : FAILED [UE IDX:%d]", ueId);
4494 DU_FREE_SHRABL_BUF(pst->region, pst->pool, ueReestablishRsp, sizeof(RlcUeReestablishRsp));
4499 /**********************************************************************
4501 ***********************************************************************/