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)
2703 uint8_t ret = ROK, cellIdx = 0, crnti=0;
2704 DuUeCb *ueCb = NULLP;
2706 GET_CELL_IDX(cellId, cellIdx);
2707 ueCb = &duCb.actvCellLst[cellIdx]->ueCb[ueId-1];
2709 /*Filling RLC Ue Cfg */
2710 ueCb->duRlcUeCfg.cellId = cellId;
2711 ueCb->duRlcUeCfg.ueId = ueId;
2712 ret = duUpdateRlcLcCfg(&ueCb->duRlcUeCfg, ueCb->f1UeDb);
2715 /*Filling MAC Ue Cfg */
2716 GET_CRNTI(crnti, ueId);
2717 ueCb->duMacUeCfg.cellId = cellId;
2718 ueCb->duMacUeCfg.ueId = ueId;
2719 ueCb->duMacUeCfg.crnti = crnti;
2720 ret = duUpdateMacCfg(&ueCb->duMacUeCfg, ueCb->f1UeDb);
2722 DU_LOG("\nERROR --> DU APP : Failed while updating MAC LC Config at duUpdateDuUeCbCfg()");
2725 if(duUpdateTunnelCfgDb(ueId, cellId, &ueCb->f1UeDb->duUeCfg) != ROK)
2727 DU_LOG("\nERROR --> DU_APP : Failed to establish tunnel in duUpdateDuUeCbCfg()");
2733 DU_LOG("\nERROR --> DU APP : Failed while updating RLC LC Config at duUpdateDuUeCbCfg()");
2737 /*******************************************************************
2739 * @brief Handle UE create response from MAC
2743 * Function : DuProcMacUeCreateRsp
2745 * Functionality: Handle UE Create response from MAC
2747 * @params[in] Pointer to MacUeCreateRsp and Pst
2748 * @return ROK - success
2751 * ****************************************************************/
2752 uint8_t DuProcMacUeCreateRsp(Pst *pst, MacUeCreateRsp *cfgRsp)
2759 GET_CELL_IDX(cfgRsp->cellId, cellIdx);
2760 if(cfgRsp->result == MAC_DU_APP_RSP_OK)
2762 if(pst->event == EVENT_MAC_UE_CREATE_RSP)
2764 DU_LOG("\nINFO --> DU APP : MAC UE Create Response : SUCCESS [DU UE F1AP ID : %d]", cfgRsp->ueId);
2766 if(duCb.actvCellLst[cellIdx] && (duCb.actvCellLst[cellIdx]->ueCb[cfgRsp->ueId -1].gnbDuUeF1apId == cfgRsp->ueId))
2768 duCb.actvCellLst[cellIdx]->ueCb[cfgRsp->ueId -1].duMacUeCfg.macUeCfgState = UE_CREATE_COMPLETE;
2770 if((duCb.actvCellLst[cfgRsp->cellId -1]->ueCb[cfgRsp->ueId -1].ueState == UE_HANDIN_IN_PROGRESS) &&
2771 (duCb.actvCellLst[cfgRsp->cellId -1]->ueCb[cfgRsp->ueId -1].duMacUeCfg.macUeCfgState == UE_CREATE_COMPLETE) &&
2772 (duCb.actvCellLst[cfgRsp->cellId -1]->ueCb[cfgRsp->ueId -1].duRlcUeCfg.rlcUeCfgState == UE_CREATE_COMPLETE))
2774 if((ret = duUpdateDuUeCbCfg(cfgRsp->ueId, cfgRsp->cellId)) == ROK)
2776 /* If UE is in handover, RACH resource needs to be requested
2777 * from MAC for CFRA */
2778 if((duBuildAndSendRachRsrcReqToMac(cfgRsp->cellId, cfgRsp->ueId)) != ROK)
2780 DU_LOG("\nERROR --> DU APP : Failed to send RACH Resource Request to MAC");
2781 DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL, cfgRsp, sizeof(MacUeCreateRsp));
2787 DU_LOG("\nERROR -> DU APP : Failure in updating DU UE CB");
2788 DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL, cfgRsp, sizeof(MacUeCreateRsp));
2797 DU_LOG("\nERROR --> DU APP : MAC UE CFG Response for EVENT[%d]: FAILURE [DU UE F1AP ID : %d]", pst->event, cfgRsp->ueId);
2800 DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL, cfgRsp, sizeof(MacUeCreateRsp));
2804 DU_LOG("\nERROR --> DU APP : Received MAC Ue Config Response is NULL at DuProcMacUeCreateRsp()");
2810 /*******************************************************************
2812 * @brief Handle UE Reconfig response from MAC
2816 * Function : DuProcMacUeRecfgRsp
2818 * Functionality: Handle UE ReConfig response from MAC
2820 * @params[in] Pointer to MacUeRecfgRsp and Pst
2821 * @return ROK - success
2824 * ****************************************************************/
2825 uint8_t DuProcMacUeRecfgRsp(Pst *pst, MacUeRecfgRsp *reCfgRsp)
2832 GET_CELL_IDX(reCfgRsp->cellId, cellIdx);
2833 if(reCfgRsp->result == MAC_DU_APP_RSP_OK)
2835 if(pst->event == EVENT_MAC_UE_RECONFIG_RSP)
2837 DU_LOG("\nINFO --> DU APP : MAC UE Reconfig Response : SUCCESS [DU UE F1AP ID : %d]", reCfgRsp->ueId);
2838 if(duCb.actvCellLst[cellIdx] &&
2839 (duCb.actvCellLst[cellIdx]->ueCb[reCfgRsp->ueId -1].gnbDuUeF1apId == reCfgRsp->ueId))
2841 duCb.actvCellLst[cellIdx]->ueCb[reCfgRsp->ueId -1].duMacUeCfg.macUeCfgState = UE_RECFG_COMPLETE;
2842 if((duCb.actvCellLst[cellIdx]->ueCb[reCfgRsp->ueId -1].duMacUeCfg.macUeCfgState == UE_RECFG_COMPLETE) &&
2843 (duCb.actvCellLst[reCfgRsp->cellId -1]->ueCb[reCfgRsp->ueId -1].duRlcUeCfg.rlcUeCfgState == UE_RECFG_COMPLETE))
2845 if((ret = duUpdateDuUeCbCfg(reCfgRsp->ueId, reCfgRsp->cellId)) == ROK)
2847 if((BuildAndSendUeCtxtRsp(reCfgRsp->cellId, reCfgRsp->ueId)) != ROK)
2849 DU_LOG("\nERROR -> DU APP : Failure in BuildAndSendUeCtxtRsp()");
2850 DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL, reCfgRsp, sizeof(MacUeRecfgRsp));
2856 DU_LOG("\nERROR -> DU APP : Failure in updating DU UE CB");
2857 DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL, reCfgRsp, sizeof(MacUeRecfgRsp));
2866 DU_LOG("\nERROR --> DU APP : MAC UE RECFG Response for EVENT[%d]: FAILURE [DU UE F1AP ID : %d]", pst->event, reCfgRsp->ueId);
2867 if(pst->event == EVENT_MAC_UE_RECONFIG_RSP)
2869 //TODO: Send the failure case in Ue Context Setup Response
2873 DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL, reCfgRsp, sizeof(MacUeRecfgRsp));
2877 DU_LOG("\nERROR --> DU APP : Received MAC Ue ReConfig Response is NULL at DuProcMacUeRecfgRsp()");
2883 /*******************************************************************
2885 * @brief Processes UE create Req to RLC UL
2889 * Function : duBuildAndSendUeCreateReqToRlc
2892 * Processes UE create Req to RLC UL
2894 * @params[in] cellId,
2896 * Pointer to RlcUeCreate
2897 * @return ROK - success
2900 *****************************************************************/
2902 uint8_t duBuildAndSendUeCreateReqToRlc(uint16_t cellId, uint8_t gnbDuUeF1apId, DuUeCfg *ueCfgDb, DuRlcUeCfg *duRlcUeCfg)
2905 RlcUeCreate *rlcUeCfg = NULLP;
2908 ret = updateRlcUeCfg(cellId, gnbDuUeF1apId, ueCfgDb, duRlcUeCfg);
2911 DU_LOG("\nERROR --> DU APP : Failed to fill Rlc Ue Cfg at duBuildAndSendUeCreateReqToRlc()");
2915 FILL_PST_DUAPP_TO_RLC(pst, RLC_UL_INST, EVENT_RLC_UE_CREATE_REQ);
2916 /* Copying ueCfg to a sharable buffer */
2917 DU_ALLOC_SHRABL_BUF(rlcUeCfg, sizeof(RlcUeCreate));
2920 memset(rlcUeCfg, 0, sizeof(RlcUeCreate));
2921 fillRlcUeCfg(duRlcUeCfg, rlcUeCfg);
2923 /* Processing one Ue at a time to RLC */
2924 DU_LOG("\nDEBUG --> DU_APP: Sending UE create request to RLC UL");
2925 ret = (*packRlcUeCreateReqOpts[pst.selector])(&pst, rlcUeCfg);
2928 DU_LOG("\nERROR --> DU_APP : Failure in sending Ue Create Req to RLC");
2929 DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL, rlcUeCfg, sizeof(RlcUeCreate));
2935 DU_LOG("\n ERROR --> DU APP : Memory alloc failed at duBuildAndSendUeCreateReqToRlc()");
2941 /*******************************************************************
2943 * @brief Processes UE create Rsp received from RLC UL
2948 * Function : DuProcRlcUeCreateRsp
2951 * Processes UE create Rsp received from RLC UL
2953 * @params[in] Post structure
2954 * Pointer to RlcCfgCfm
2955 * @return ROK - success
2958 *****************************************************************/
2959 uint8_t DuProcRlcUeCreateRsp(Pst *pst, RlcUeCreateRsp *cfgRsp)
2965 if(cfgRsp->result == RLC_DU_APP_RSP_OK)
2967 if(pst->event == EVENT_RLC_UE_CREATE_RSP)
2969 DU_LOG("\nINFO --> DU_APP: RLC UE Create Response : SUCCESS [UE IDX:%d]", cfgRsp->ueId);
2970 duCb.actvCellLst[cfgRsp->cellId -1]->ueCb[cfgRsp->ueId -1].duRlcUeCfg.rlcUeCfgState = UE_CREATE_COMPLETE;
2972 if((duCb.actvCellLst[cfgRsp->cellId -1]->ueCb[cfgRsp->ueId -1].ueState == UE_HANDIN_IN_PROGRESS) &&
2973 (duCb.actvCellLst[cfgRsp->cellId -1]->ueCb[cfgRsp->ueId -1].duMacUeCfg.macUeCfgState == UE_CREATE_COMPLETE) &&
2974 (duCb.actvCellLst[cfgRsp->cellId -1]->ueCb[cfgRsp->ueId -1].duRlcUeCfg.rlcUeCfgState == UE_CREATE_COMPLETE))
2976 if((ret = duUpdateDuUeCbCfg(cfgRsp->ueId, cfgRsp->cellId)) == ROK)
2978 /* If UE is in handover, RACH resource needs to be requested
2979 * from MAC for CFRA */
2980 if((duBuildAndSendRachRsrcReqToMac(cfgRsp->cellId, cfgRsp->ueId)) != ROK)
2982 DU_LOG("\nERROR --> DU APP : Failed to send RACH Resource Request to MAC");
2983 DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL, cfgRsp, sizeof(RlcUeCreateRsp));
2989 DU_LOG("\nERROR --> DU APP : Failure in updating DU UE CB");
2990 DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL, cfgRsp, sizeof(RlcUeCreateRsp));
2998 DU_LOG("\nERROR --> DU_APP: RLC UE CREATE Response for EVENT[%d] : FAILED [UE IDX : %d, REASON :%d]",\
2999 pst->event, cfgRsp->ueId, cfgRsp->reason);
3002 DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL, cfgRsp, sizeof(RlcUeCreateRsp));
3006 DU_LOG("\nERROR --> DU_APP: Received RLC Ue Create Response is NULL at DuProcRlcUeCreateRsp()");
3012 /*******************************************************************
3014 * @brief Processes UE reconfig Rsp received from RLC UL
3019 * Function : DuProcRlcUeReconfigRsp
3022 * Processes UE reconfig Rsp received from RLC UL
3024 * @params[in] Post structure
3025 * Pointer to RlcCfgCfm
3026 * @return ROK - success
3029 *****************************************************************/
3030 uint8_t DuProcRlcUeReconfigRsp(Pst *pst, RlcUeReconfigRsp *cfgRsp)
3036 if(cfgRsp->result == RLC_DU_APP_RSP_OK)
3038 if(pst->event == EVENT_RLC_UE_RECONFIG_RSP)
3040 DU_LOG("\nINFO --> DU_APP: RLC UE Reconfig Response : SUCCESS [UE IDX:%d]", cfgRsp->ueId);
3042 duCb.actvCellLst[cfgRsp->cellId -1]->ueCb[cfgRsp->ueId -1].duRlcUeCfg.rlcUeCfgState = UE_RECFG_COMPLETE;
3043 if((duCb.actvCellLst[cfgRsp->cellId -1]->ueCb[cfgRsp->ueId -1].duMacUeCfg.macUeCfgState == UE_RECFG_COMPLETE) &&
3044 (duCb.actvCellLst[cfgRsp->cellId -1]->ueCb[cfgRsp->ueId -1].duRlcUeCfg.rlcUeCfgState == UE_RECFG_COMPLETE))
3046 if((ret = duUpdateDuUeCbCfg(cfgRsp->ueId, cfgRsp->cellId)) == ROK)
3048 if((BuildAndSendUeCtxtRsp(cfgRsp->cellId, cfgRsp->ueId)) != ROK)
3050 DU_LOG("\nERROR --> DU APP : Failure in BuildAndSendUeCtxtRsp");
3051 DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL, cfgRsp, sizeof(RlcUeReconfigRsp));
3057 DU_LOG("\nERROR --> DU APP : Failure in updating DU UE CB");
3058 DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL, cfgRsp, sizeof(RlcUeReconfigRsp));
3066 DU_LOG("\nERROR --> DU_APP: RLC UE RE-CFG Response for EVENT[%d] : FAILED [UE IDX : %d, REASON :%d]",\
3067 pst->event, cfgRsp->ueId, cfgRsp->reason);
3068 if((pst->event == EVENT_RLC_UE_RECONFIG_RSP))
3070 //TODO: update failure case in ue Context setup Response
3074 DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL, cfgRsp, sizeof(RlcUeReconfigRsp));
3078 DU_LOG("\nERROR --> DU_APP: Received RLC Ue ReConfig Response is NULL at DuProcRlcUeReconfigRsp()");
3083 /**********************************************************************************
3085 * @brief Fills Ue ReCfg from DU DB to RlcUeRecfg
3089 * Function : fillRlcUeRecfg
3091 * Functionality: fills ue ReCfg to be sent to RLC
3093 * @params[in] DuRlcUeCfg Pointer
3094 * RlcUeRecfg Pointer
3097 * *******************************************************************************/
3098 void fillRlcUeRecfg(DuRlcUeCfg *duRlcUeCfg, RlcUeRecfg *rlcUeRecfg)
3102 rlcUeRecfg->cellId = duRlcUeCfg->cellId;
3103 rlcUeRecfg->ueId = duRlcUeCfg->ueId;
3106 if(duRlcUeCfg->numLcs > 0)
3108 rlcUeRecfg->numLcsToAdd = 0;
3109 rlcUeRecfg->numLcsToMod = 0;
3110 rlcUeRecfg->numLcsToRel = 0;
3112 for(lcIdx = 0; lcIdx < duRlcUeCfg->numLcs; lcIdx++)
3114 if(duRlcUeCfg->rlcLcCfg[lcIdx].configType == CONFIG_ADD)
3116 memcpy(&rlcUeRecfg->rlcLcCfgAdd[rlcUeRecfg->numLcsToAdd], &duRlcUeCfg->rlcLcCfg[lcIdx].rlcBearerCfg, sizeof(RlcBearerCfg));
3117 rlcUeRecfg->numLcsToAdd++;
3119 if(duRlcUeCfg->rlcLcCfg[lcIdx].configType == CONFIG_MOD)
3121 memcpy(&rlcUeRecfg->rlcLcCfgMod[rlcUeRecfg->numLcsToMod], &duRlcUeCfg->rlcLcCfg[lcIdx].rlcBearerCfg, sizeof(RlcBearerCfg));
3122 rlcUeRecfg->numLcsToMod++;
3124 if(duRlcUeCfg->rlcLcCfg[lcIdx].configType == CONFIG_DEL)
3126 memcpy(&rlcUeRecfg->rlcLcCfgRel[rlcUeRecfg->numLcsToRel], &duRlcUeCfg->rlcLcCfg[lcIdx].rlcBearerCfg, sizeof(RlcBearerCfg));
3127 rlcUeRecfg->numLcsToRel++;
3134 /*******************************************************************
3136 * @brief Builds and Send Ue Reconfig Req to RLC
3140 * Function : duBuildAndSendUeRecfgReqToRLC
3142 * Functionality: Builds and Send Ue Reconfig Req to RLC
3144 * @params[in] cellId, crnti
3146 * RlcUeCreate *rlcUeCfg
3147 * @return ROK - success
3150 * ****************************************************************/
3152 uint8_t duBuildAndSendUeRecfgReqToRlc(uint8_t cellId, uint8_t gnbDuUeF1apId, uint8_t crnti, DuUeCfg *ueCfgDb)
3155 DuRlcUeCfg *duRlcUeCfg = NULLP;
3156 RlcUeRecfg *rlcUeRecfg = NULLP;
3158 DU_ALLOC(duRlcUeCfg, sizeof(DuRlcUeCfg));
3159 DU_ALLOC_SHRABL_BUF(rlcUeRecfg, sizeof(RlcUeRecfg));
3160 if(duRlcUeCfg && rlcUeRecfg)
3162 memset(duRlcUeCfg, 0, sizeof(DuRlcUeCfg));
3163 memset(rlcUeRecfg, 0, sizeof(RlcUeRecfg));
3165 ret = updateRlcUeCfg(cellId, gnbDuUeF1apId, ueCfgDb, duRlcUeCfg);
3168 DU_LOG("\nERROR --> DU APP : Failed at duBuildAndSendUeRecfgReqToRlc()");
3171 fillRlcUeRecfg(duRlcUeCfg, rlcUeRecfg);
3172 ret = sendUeRecfgReqToRlc(rlcUeRecfg);
3177 DU_LOG("\nERROR --> DU APP : Memory Alloc failed at duBuildAndSendUeRecfgReqToRlc()");
3180 DU_FREE(duRlcUeCfg, sizeof(DuRlcUeCfg));
3184 /**********************************************************************************
3186 * @brief Fills Ue ReCfg from DU DB to MacUeRecfg
3190 * Function : fillMacUeRecfg
3192 * Functionality: fills ue ReCfg to be sent to MAC
3194 * @params[in] DuMacUeCfg Pointer
3195 * MacUeRecfg Pointer
3198 * *******************************************************************************/
3199 void fillMacUeRecfg(DuMacUeCfg *duMacUeCfg, MacUeRecfg *macUeRecfg)
3203 macUeRecfg->cellId = duMacUeCfg->cellId;
3204 macUeRecfg->ueId = duMacUeCfg->ueId;
3205 macUeRecfg->crnti = duMacUeCfg->crnti;
3206 macUeRecfg->macCellGrpRecfgPres = duMacUeCfg->macCellGrpCfgPres;
3207 if(macUeRecfg->macCellGrpRecfgPres)
3209 memcpy(&macUeRecfg->macCellGrpRecfg, &duMacUeCfg->macCellGrpCfg, sizeof(MacCellGrpCfg));
3211 macUeRecfg->phyCellGrpRecfgPres = duMacUeCfg->phyCellGrpCfgPres;
3212 if(macUeRecfg->phyCellGrpRecfgPres)
3214 memcpy(&macUeRecfg->phyCellGrpRecfg, &duMacUeCfg->phyCellGrpCfg, sizeof(PhyCellGrpCfg));
3216 macUeRecfg->spCellRecfgPres = duMacUeCfg->spCellCfgPres;
3217 if(macUeRecfg->spCellRecfgPres)
3219 memcpy(&macUeRecfg->spCellRecfg, &duMacUeCfg->spCellCfg, sizeof(SpCellRecfg));
3221 if(duMacUeCfg->ambrCfg != NULLP)
3223 DU_ALLOC_SHRABL_BUF(macUeRecfg->ambrRecfg, sizeof(AmbrCfg));
3224 memcpy(macUeRecfg->ambrRecfg, duMacUeCfg->ambrCfg, sizeof(AmbrCfg));
3226 memcpy(&macUeRecfg->dlModInfo, &duMacUeCfg->dlModInfo, sizeof(ModulationInfo));
3227 memcpy(&macUeRecfg->ulModInfo, &duMacUeCfg->ulModInfo, sizeof(ModulationInfo));
3228 if(duMacUeCfg->numLcs > 0)
3230 macUeRecfg->numLcsToAdd = 0;
3231 macUeRecfg->numLcsToDel = 0;
3232 macUeRecfg->numLcsToMod = 0;
3234 for(lcIdx = 0; lcIdx < duMacUeCfg->numLcs; lcIdx++)
3236 if(duMacUeCfg->lcCfgList[lcIdx].configType == CONFIG_ADD)
3238 /*VS: To thoroughly check*/
3239 memcpy(&macUeRecfg->lcCfgAdd[macUeRecfg->numLcsToAdd], &duMacUeCfg->lcCfgList[lcIdx].lcConfig, sizeof(LcCfg));
3240 macUeRecfg->numLcsToAdd++;
3242 if(duMacUeCfg->lcCfgList[lcIdx].configType == CONFIG_DEL)
3244 /*VS: To thoroughly check*/
3245 macUeRecfg->lcIdToDel[macUeRecfg->numLcsToDel] = duMacUeCfg->lcCfgList[lcIdx].lcConfig.lcId;
3246 macUeRecfg->numLcsToDel++;
3248 if(duMacUeCfg->lcCfgList[lcIdx].configType == CONFIG_MOD)
3250 /*VS: To thoroughly check*/
3251 memcpy(&macUeRecfg->lcCfgMod[macUeRecfg->numLcsToMod], &duMacUeCfg->lcCfgList[lcIdx].lcConfig, sizeof(LcCfg));
3252 macUeRecfg->numLcsToMod++;
3256 macUeRecfg->transmissionAction = duMacUeCfg->transmissionAction;
3258 macUeRecfg->drxConfigIndicatorRelease = duMacUeCfg->drxConfigIndicatorRelease;
3262 /*******************************************************************
3264 * @brief Builds and Send Ue Reconfig Req to MAC
3268 * Function : duBuildAndSendUeRecfgReqToMac
3270 * Functionality: Builds and Send Ue Reconfig Req to MAC
3272 * @params[in] CellGroupConfigRrc_t *macCellGrpCfg
3274 * @return ROK - success
3277 * ****************************************************************/
3279 uint8_t duBuildAndSendUeRecfgReqToMac(uint8_t cellId, uint8_t duUeF1apId, uint8_t crnti, DuUeCfg *ueCfgDb)
3282 DuMacUeCfg *duMacUeCfg = NULLP;
3283 MacUeRecfg *macUeRecfg = NULLP;
3285 DU_ALLOC(duMacUeCfg, sizeof(DuMacUeCfg));
3286 DU_ALLOC_SHRABL_BUF(macUeRecfg, sizeof(MacUeRecfg));
3287 if(macUeRecfg && duMacUeCfg)
3289 memset(duMacUeCfg, 0, sizeof(DuMacUeCfg));
3290 memset(macUeRecfg, 0, sizeof(MacUeRecfg));
3292 ret = updateDuMacUeCfg(cellId, duUeF1apId, crnti, ueCfgDb, duMacUeCfg);
3294 DU_LOG("\nERROR --> DU APP : Failed to fill Mac Ue Cfg at duBuildAndSendUeRecfgReqToMac()");
3297 fillMacUeRecfg(duMacUeCfg, macUeRecfg);
3298 ret = sendUeRecfgReqToMac(macUeRecfg);
3303 DU_LOG("\nERROR --> DU APP : Memory alloc failed for macUeCfg at duBuildAndSendUeRecfgReqToMac()");
3306 DU_FREE(duMacUeCfg, sizeof(DuMacUeCfg));
3311 /*******************************************************************
3313 * @brief Build and Send Ue context setup request
3318 * Function : duBuildAndSendUeContextSetupReq
3321 * Build and Send Ue context setup request
3323 * @params[in] cellId, crnti, DuUeCfg pointer
3324 * @return ROK - success
3327 *****************************************************************/
3329 uint8_t duBuildAndSendUeContextSetupReq(uint16_t cellId, DuUeCb *ueCb)
3333 DuUeCfg *duUeCfg = NULLP;
3335 DU_LOG("\nDEBUG --> DU_APP: Processing Ue Context Setup Request for cellId [%d]", cellId);
3339 DU_LOG("\nERROR --> DU APP : UE Cb is NULL");
3343 crnti = ueCb->crnti;
3344 duUeCfg = &ueCb->f1UeDb->duUeCfg;
3346 /* If UE is being handed-in to this DU, UE context setup request will create
3347 * new UE context at MAC/SCH and RLC.
3348 * If UE is in active state, UE contex setup request will lead to
3349 * reconfiguration of UE at MAC/SCH and RLC
3351 if(ueCb->ueState == UE_HANDIN_IN_PROGRESS)
3353 /* Filling MAC UE Config */
3354 memset(&ueCb->duMacUeCfg, 0, sizeof(DuMacUeCfg));
3356 /* Since UE attach has not yet happened, crnti is unknow. Hence passing 0 */
3357 ret = duBuildAndSendUeCreateReqToMac(cellId, ueCb->gnbDuUeF1apId, 0, duUeCfg, &ueCb->duMacUeCfg);
3359 DU_LOG("\nERROR --> DU APP : Failed to send UE create request to MAC");
3361 ret = duBuildAndSendUeCreateReqToRlc(cellId, ueCb->gnbDuUeF1apId, duUeCfg, &ueCb->duRlcUeCfg);
3363 DU_LOG("\nERROR --> DU APP : Failed to send UE create request to RLC");
3368 /* Filling RLC UE Reconfig */
3369 ret = duBuildAndSendUeRecfgReqToRlc(cellId, ueCb->gnbDuUeF1apId, crnti, duUeCfg);
3371 DU_LOG("\nERROR --> DU APP : Failed to build ctxt setup req for RLC at duBuildAndSendUeContextSetupReq()");
3373 /* Filling MAC UE Reconfig */
3374 ret = duBuildAndSendUeRecfgReqToMac(cellId, ueCb->gnbDuUeF1apId, crnti, duUeCfg);
3376 DU_LOG("\nERROR --> DU APP : Failed at build ctxt setup req for MAC at duBuildAndSendUeContextSetupReq()");
3382 /*******************************************************************
3384 * @brief Processes DL Rsp received from RLC DL
3389 * Function : DuProcRlcDlRrcMsgRsp
3392 * Processes UE Rsp received from RLC DL
3394 * @params[in] Post structure
3395 * Pointer to RlcCfgCfm
3396 * @return ROK - success
3399 *****************************************************************/
3400 uint8_t DuProcRlcDlRrcMsgRsp(Pst *pst, RlcDlRrcMsgRsp *dlRrcMsg)
3402 uint8_t ret = ROK, ueId = 0;
3403 uint16_t cellId, crnti;
3404 DuUeCb *ueCb = NULLP;
3407 state = dlRrcMsg->state;
3408 cellId = dlRrcMsg->cellId;
3409 crnti = dlRrcMsg->crnti;
3410 DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL, dlRrcMsg, sizeof(RlcDlRrcMsgRsp));
3412 if(state == TRANSMISSION_COMPLETE)
3414 GET_UE_ID(crnti, ueId);
3415 ueCb = &duCb.actvCellLst[cellId -1]->ueCb[ueId -1];
3417 if(ueCb->f1UeDb && ueCb->f1UeDb->dlRrcMsgPres)
3419 if(ueCb->f1UeDb->actionType == UE_CTXT_SETUP)
3421 ret = duBuildAndSendUeContextSetupReq(cellId, ueCb);
3423 DU_LOG("\nERROR --> DU APP : Failed to process UE Context Setup Request in DuProcRlcDlRrcMsgRsp()");
3426 if(ueCb->f1UeDb->actionType == UE_CTXT_MOD)
3428 ret = duBuildAndSendUeContextModReq(cellId, ueCb->gnbDuUeF1apId, crnti, &ueCb->f1UeDb->duUeCfg);
3430 DU_LOG("\nERROR --> DU APP : Failed to process UE Context Mod Request in DuProcRlcDlRrcMsgRsp()");
3433 if(ueCb->f1UeDb->actionType == UE_CTXT_RELEASE && ueCb->ueState == UE_ACTIVE)
3435 ret = duBuildAndSendUeDeleteReq(cellId, crnti);
3438 DU_LOG("\nERROR --> DU APP : Failed to process UE Context Release Request in DuProcRlcDlRrcMsgRsp()");
3444 DU_LOG("\nERROR --> DU APP : Failed to transmit DL RRC Msg");
3448 /*******************************************************************
3450 * @brief Process UE context setup request from CU
3454 * Function : duProcUeContextSetupRequest
3456 * Functionality: Process UE context setup request from CU
3458 * @params[in] F1AP message
3459 * @return ROK - success
3462 * ****************************************************************/
3464 uint8_t duProcUeContextSetupRequest(DuUeCb *ueCb)
3466 uint8_t ret, cellId;
3471 cellId = duCb.actvCellLst[ueCb->f1UeDb->cellIdx]->cellId;
3473 /* Send DL RRC msg for security Mode */
3474 if(ueCb->f1UeDb->dlRrcMsg)
3476 if(ueCb->f1UeDb->dlRrcMsg->rrcMsgPdu)
3478 /* Sending DL RRC Message to RLC */
3479 ret = duBuildAndSendDlRrcMsgToRlc(cellId, ueCb->duRlcUeCfg, ueCb->f1UeDb->dlRrcMsg);
3482 DU_LOG("\nERROR --> DU APP : Failed to send DL RRC msg in duProcUeContextSetupRequest()");
3483 DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL, ueCb->f1UeDb->dlRrcMsg->rrcMsgPdu,\
3484 ueCb->f1UeDb->dlRrcMsg->rrcMsgSize);
3485 DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL, ueCb->f1UeDb->dlRrcMsg, sizeof(F1DlRrcMsg));
3489 else if(ueCb->f1UeDb->actionType == UE_CTXT_SETUP)
3491 ret = duBuildAndSendUeContextSetupReq(cellId, ueCb);
3494 DU_LOG("\nERROR --> DU APP : Failed to build ue context setup Req in duProcUeContextSetupRequest()");
3500 //TODO: To send the failure cause in UeContextSetupRsp
3501 DU_LOG("ERROR --> DU APP : Failed to process UE CNTXT SETUP REQ at duProcUeContextSetupRequest()");
3506 /*******************************************************************
3508 * @brief Build and Send Ue context mod request
3513 * Function : duBuildAndSendUeContextModReq
3516 * Build and Send Ue context mod request
3518 * @params[in] cellId, crnti, DuUeCfg pointer
3519 * @return ROK - success
3522 *****************************************************************/
3524 uint8_t duBuildAndSendUeContextModReq(uint16_t cellId, uint8_t gnbDuUeF1apId, uint16_t crnti, DuUeCfg *duUeCfg)
3528 DU_LOG("\nDEBUG --> DU_APP: Processing Ue Context Mod Request for cellId [%d]", cellId);
3529 /* Filling RLC Ue Reconfig */
3530 ret = duBuildAndSendUeRecfgReqToRlc(cellId, gnbDuUeF1apId, crnti, duUeCfg);
3532 DU_LOG("\nERROR --> DU APP : Failed to build ctxt setup req for RLC at duBuildAndSendUeContextModReq()");
3534 /* Filling MAC Ue Reconfig */
3535 ret = duBuildAndSendUeRecfgReqToMac(cellId, gnbDuUeF1apId, crnti, duUeCfg);
3537 DU_LOG("\nERROR --> DU APP : Failed at build ctxt setup req for MAC at duBuildAndSendUeContextModReq()");
3541 /*******************************************************************
3543 * @brief Processing Ue context mod request
3548 * Function : duProcUeContextModReq
3551 * Processing Ue context mod request
3553 * @params[in] DuUeCb *ueCb
3554 * @return ROK - success
3557 *****************************************************************/
3559 uint8_t duProcUeContextModReq(DuUeCb *ueCb)
3561 uint8_t ret, cellId;
3566 cellId = duCb.actvCellLst[ueCb->f1UeDb->cellIdx]->cellId;
3567 /* Send DL RRC msg for security Mode */
3568 if(ueCb->f1UeDb->dlRrcMsg)
3570 if(ueCb->f1UeDb->dlRrcMsg->rrcMsgPdu)
3572 /* Sending DL RRC Message to RLC */
3573 ret = duBuildAndSendDlRrcMsgToRlc(cellId, ueCb->duRlcUeCfg, ueCb->f1UeDb->dlRrcMsg);
3576 DU_LOG("\nERROR --> DU APP : Failed to send DL RRC msg in duProcUeContextModReq()");
3577 DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL, ueCb->f1UeDb->dlRrcMsg->rrcMsgPdu,\
3578 ueCb->f1UeDb->dlRrcMsg->rrcMsgSize);
3579 DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL, ueCb->f1UeDb->dlRrcMsg, sizeof(F1DlRrcMsg));
3583 else if(ueCb->f1UeDb->actionType == UE_CTXT_MOD)
3585 ret = duBuildAndSendUeContextModReq(cellId, ueCb->gnbDuUeF1apId, ueCb->crnti, &ueCb->f1UeDb->duUeCfg);
3588 DU_LOG("\nERROR --> DU APP : Failed to build ue context setup Req in duProcUeContextModReq()");
3592 else if((ueCb->f1UeDb->actionType == UE_CTXT_CFG_QUERY) || (ueCb->f1UeDb->actionType == UE_CTXT_RRC_RECFG_COMPLETE))
3594 if((BuildAndSendUeContextModRsp(ueCb) != ROK))
3596 DU_LOG("\nERROR --> DU APP : Failed to build UE Context modification response");
3603 //TODO: To send the failure cause in UeContextModRsp
3605 DU_LOG("ERROR --> DU APP : Failed to process UE CNTXT MOD REQ at duProcUeContextModReq()");
3611 /*******************************************************************
3613 * @brief Build and send dedicated RACH resource release request to MAC
3617 * Function : duBuildAndSendRachRsrcRelToMac
3619 * Functionality: Function to Build and send dedicated RACH resource
3620 * release request to MAC
3622 * @params[in] Cell ID
3624 * @return ROK - Success
3627 * ****************************************************************/
3628 uint8_t duBuildAndSendRachRsrcRelToMac(uint16_t cellId, DuUeCb *ueCb)
3631 MacRachRsrcRel *rachRsrcRel = NULLP;
3633 DU_ALLOC_SHRABL_BUF(rachRsrcRel, sizeof(MacRachRsrcRel));
3636 DU_LOG("\nERROR --> DU APP : Failed to allocate memory for RACH Resource Release in \
3637 duBuildAndSendRachRsrcRelToMac()");
3641 rachRsrcRel->cellId = cellId;
3642 rachRsrcRel->ueId = ueCb->gnbDuUeF1apId;
3643 rachRsrcRel->crnti = ueCb->crnti;
3646 FILL_PST_DUAPP_TO_MAC(pst, EVENT_MAC_RACH_RESOURCE_REL);
3648 if(((*packMacRachRsrcRelOpts[pst.selector])(&pst, rachRsrcRel)) != ROK)
3650 DU_LOG("\nERROR --> DU_APP : Failure in sending RACH Resource Release to MAC at \
3651 duBuildAndSendRachRsrcRelToMac()");
3652 DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL, rachRsrcRel, sizeof(MacRachRsrcRel));
3659 /*******************************************************************
3661 * @brief delete DuMacUeCfg from duCb
3665 * Function : deleteMacUeCfg
3667 * Functionality: delete DuMacUeCfg from duCb
3669 * @params[in] Pointer to DuMacUeCfg
3670 * @return ROK - success
3673 *******************************************************************/
3675 void deleteMacUeCfg(DuMacUeCfg *ueCfg)
3679 if(ueCfg->spCellCfgPres)
3681 freeUeRecfgCellGrpInfo(ueCfg);
3685 DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL,ueCfg->ambrCfg, sizeof(AmbrCfg));
3687 for(lcCfgIdx=0; lcCfgIdx< ueCfg->numLcs; lcCfgIdx++)
3689 freeMacLcCfg(&ueCfg->lcCfgList[lcCfgIdx].lcConfig);
3691 memset(ueCfg, 0, sizeof(DuMacUeCfg));
3694 /*******************************************************************
3696 * @brief delete UE Configuration of a particular UE
3700 * Function : deleteUeCfg
3702 * Functionality: delete UE Configuration of a particular UE
3704 * @params[in] uint16_t cellIdx, uint8_t ueId
3705 * @return ROK - success
3708 * ****************************************************************/
3709 uint8_t deleteUeCfg(uint16_t cellId, uint8_t ueId)
3712 uint16_t cellIdx = 0;
3713 DuUeCb *ueCb = NULLP;
3715 GET_CELL_IDX(cellId, cellIdx);
3716 if(duCb.actvCellLst[cellIdx] != NULLP)
3718 if((duCb.actvCellLst[cellIdx]->ueCb[ueId-1].duMacUeCfg.macUeCfgState == UE_DELETE_COMPLETE)\
3719 &&(duCb.actvCellLst[cellIdx]->ueCb[ueId-1].duRlcUeCfg.rlcUeCfgState == UE_DELETE_COMPLETE))
3721 ueCb = &duCb.actvCellLst[cellIdx]->ueCb[ueId-1];
3722 deleteMacUeCfg(&ueCb->duMacUeCfg);
3723 deleteRlcUeCfg(&ueCb->duRlcUeCfg);
3724 if(ueCb->f1UeDb !=NULLP)
3726 freeF1UeDb(ueCb->f1UeDb);
3728 for(tnlIdx = 0; tnlIdx < duCb.numTeId; )
3730 if(duCb.upTnlCfg[tnlIdx]->ueId == ueId)
3732 duCb.upTnlCfg[tnlIdx]->configType = CONFIG_DEL;
3733 duProcEgtpTunnelCfg(tnlIdx, duCb.upTnlCfg[tnlIdx], duCb.upTnlCfg[tnlIdx]);
3738 unsetBitInUeBitMap(cellId, ueId-1);
3739 duCb.actvCellLst[cellIdx]->numActvUes--;
3740 memset(ueCb, 0, sizeof(DuUeCb));
3749 DU_LOG("\nERROR --> DU APP : deleteUeCfg(): CellIdx[%d] is not found", cellIdx);
3756 /*******************************************************************
3758 * @brief Handle UE delete response from MAC
3762 * Function : DuProcMacUeDeleteRsp
3764 * Functionality: Handle UE delete response from MAC
3766 * @params[in] Pointer to MacUeDeleteRsp and Pst
3767 * @return ROK - success
3770 * ****************************************************************/
3772 uint8_t DuProcMacUeDeleteRsp(Pst *pst, MacUeDeleteRsp *deleteRsp)
3774 uint8_t ret =ROK,ueId=0;
3776 uint32_t gnbCuUeF1apId =0 , gnbDuUeF1apId =0;
3780 if(deleteRsp->status == SUCCESSFUL)
3782 DU_LOG("\nINFO --> DU APP : MAC UE Delete Response : SUCCESS [UE IDX : %d]", deleteRsp->ueId);
3783 GET_CELL_IDX(deleteRsp->cellId, cellIdx);
3784 if(duCb.actvCellLst[cellIdx])
3786 duCb.actvCellLst[cellIdx]->ueCb[deleteRsp->ueId -1].duMacUeCfg.macUeCfgState = UE_DELETE_COMPLETE;
3787 ueId = deleteRsp->ueId;
3788 gnbCuUeF1apId = duCb.actvCellLst[cellIdx]->ueCb[ueId-1].gnbCuUeF1apId;
3789 gnbDuUeF1apId = duCb.actvCellLst[cellIdx]->ueCb[ueId-1].gnbDuUeF1apId;
3790 if(deleteUeCfg(deleteRsp->cellId, ueId) == ROK)
3792 ret = BuildAndSendUeContextReleaseComplete(deleteRsp->cellId, gnbCuUeF1apId, gnbDuUeF1apId);
3795 DU_LOG("\nERROR --> DU APP : DuProcMacUeDeleteRsp(): failed to send UE context release complete");
3803 DU_LOG("\nERROR --> DU APP : DuProcMacUeDeleteRsp(): MAC UE Delete Response : FAILURE [UE IDX : %d]",\
3807 DU_FREE_SHRABL_BUF(pst->region, pst->pool, deleteRsp, sizeof(MacUeDeleteRsp));
3811 DU_LOG("\nERROR --> DU APP : DuProcMacUeDeleteRsp(): MAC UE Delete Response is null");
3817 /*******************************************************************
3819 * @brief Processes UE Delete Rsp received from RLC
3823 * Function : DuProcRlcUeDeleteRsp
3826 * Processes UE Delete Rsp received from RLC
3828 * @params[in] Post structure
3829 * Pointer to RlcUeDeleteRsp
3830 * @return ROK - success
3833 * *****************************************************************/
3835 uint8_t DuProcRlcUeDeleteRsp(Pst *pst, RlcUeDeleteRsp *delRsp)
3837 uint8_t ueId = 0, ret = ROK;
3838 uint16_t cellIdx = 0,crnti=0;
3842 ueId = delRsp->ueId;
3843 GET_CELL_IDX(delRsp->cellId, cellIdx);
3845 if(delRsp->status == SUCCESSFUL)
3847 DU_LOG("\nINFO --> DU_APP: RLC UE Delete Response : SUCCESS [UE IDX:%d]", ueId);
3848 if(duCb.actvCellLst[cellIdx]!=NULLP)
3850 duCb.actvCellLst[cellIdx]->ueCb[ueId-1].duRlcUeCfg.rlcUeCfgState = UE_DELETE_COMPLETE;
3851 GET_CRNTI(crnti, ueId);
3852 if(sendUeDeleteReqToMac(delRsp->cellId, ueId, crnti) == RFAILED)
3854 DU_LOG("\nERROR --> DU APP : duBuildAndSendUeDeleteReq(): Failed to build UE delete req for MAC ");
3862 DU_LOG("\nERROR --> DU_APP: RLC UE Delete Response : FAILED [UE IDX:%d]", ueId);
3865 DU_FREE_SHRABL_BUF(pst->region, pst->pool, delRsp, sizeof(RlcUeDeleteRsp));
3871 /*******************************************************************
3873 * @brief Sending UE Delete Req To Mac
3877 * Function : sendUeDeleteReqToMac
3880 * sending UE Delete Req To Mac
3882 * @params[in] cellId, ueId, crnti
3883 * @return ROK - success
3886 *****************************************************************/
3888 uint8_t sendUeDeleteReqToMac(uint16_t cellId, uint8_t ueId, uint16_t crnti)
3892 MacUeDelete *ueDelete = NULLP;
3894 DU_ALLOC_SHRABL_BUF(ueDelete, sizeof(MacUeDelete));
3897 ueDelete->cellId = cellId;
3898 ueDelete->ueId = ueId;
3899 ueDelete->crnti = crnti;
3900 FILL_PST_DUAPP_TO_MAC(pst, EVENT_MAC_UE_DELETE_REQ);
3902 DU_LOG("\nDEBUG --> DU_APP: Sending UE delete Request to MAC ");
3903 ret = (*packMacUeDeleteReqOpts[pst.selector])(&pst, ueDelete);
3906 DU_LOG("\nERROR --> DU_APP: sendUeDeleteReqToMac(): Failed to send UE delete Req to MAC");
3907 DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL, ueDelete, sizeof(MacUeDelete));
3912 DU_LOG("\nERROR --> DU_APP: sendUeDeleteReqToMac(): Failed to allocate memory");
3918 /*******************************************************************
3920 * @brief Sending UE Delete Req To Rlc
3924 * Function : sendUeDeleteReqToRlc
3927 * Sending UE Delete Req To Rlc
3929 * @params[in] cellId, ueId
3930 * @return ROK - success
3933 *****************************************************************/
3935 uint8_t sendUeDeleteReqToRlc(uint16_t cellId, uint8_t ueId)
3939 RlcUeDelete *ueDelete;
3941 DU_ALLOC_SHRABL_BUF(ueDelete, sizeof(RlcUeDelete));
3942 if(ueDelete !=NULLP)
3944 ueDelete->cellId = cellId;
3945 ueDelete->ueId = ueId;
3946 FILL_PST_DUAPP_TO_RLC(pst, RLC_UL_INST, EVENT_RLC_UE_DELETE_REQ);
3948 ret = (*packRlcUeDeleteReqOpts[pst.selector])(&pst, ueDelete);
3951 DU_LOG("\nERROR --> DU_APP : sendUeDeleteReqToRlc():Failed to send UE Delete Req to RLC");
3952 DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL, ueDelete, sizeof(RlcUeDelete));
3957 DU_LOG("\nERROR --> DU_APP: sendUeDeleteReqToRlc():Memory allocation failed");
3963 /*******************************************************************
3965 * @brief DU processes UE delete req from CU and sends to MAC and RLC
3969 * Function : duBuildAndSendUeDeleteReq
3971 * Functionality: DU processes UE delete req from CU and sends to MAC
3974 * @params[in] cellId, crnti
3975 * @return ROK - success
3978 * ****************************************************************/
3980 uint8_t duBuildAndSendUeDeleteReq(uint16_t cellId, uint16_t crnti)
3983 uint16_t cellIdx = 0;
3985 DU_LOG("\nDEBUG --> DU_APP: Processing UE Delete Request ");
3986 GET_CELL_IDX(cellId, cellIdx);
3987 GET_UE_ID(crnti, ueId);
3989 if(duCb.actvCellLst[cellIdx] != NULLP)
3991 if(crnti != duCb.actvCellLst[cellIdx]->ueCb[ueId - 1].crnti)
3993 DU_LOG("\nERROR --> DU APP : duBuildAndSendUeDeleteReq(): CRNTI [%d] not found", crnti);
3997 duCb.actvCellLst[cellIdx]->ueCb[ueId - 1].ueState = UE_DELETION_IN_PROGRESS;
3998 if(sendUeDeleteReqToRlc(cellId, ueId) == RFAILED)
4000 DU_LOG("\nERROR --> DU APP : DuProcMacUeDeleteRsp():Failed to build UE delete req for RLC ");
4006 DU_LOG("\nERROR --> DU APP : duBuildAndSendUeDeleteReq(): Cell Id is not found");
4013 /*******************************************************************
4015 * @brief delete RlcUeCreate from duCb
4019 * Function : deleteRlcUeCfg
4022 * delete RlcUeCreate from duCb
4024 * @params[in] RlcUeCreate *ueCfg
4026 * @return ROK - success
4029 *****************************************************************/
4031 void deleteRlcUeCfg(DuRlcUeCfg *ueCfg)
4034 RlcBearerCfg *lcCfg= NULLP;
4037 for(lcIdx =0 ; lcIdx < ueCfg->numLcs ; lcIdx++)
4039 lcCfg = &ueCfg->rlcLcCfg[lcIdx].rlcBearerCfg;
4040 switch(lcCfg->rlcMode)
4044 DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL, lcCfg->u.amCfg, sizeof(AmBearerCfg));
4047 case RLC_UM_BI_DIRECTIONAL :
4049 DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL, lcCfg->u.umBiDirCfg, sizeof(UmBiDirBearerCfg));
4052 case RLC_UM_UNI_DIRECTIONAL_UL :
4054 DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL, lcCfg->u.umUniDirUlCfg, sizeof(UmUniDirUlBearerCfg));
4057 case RLC_UM_UNI_DIRECTIONAL_DL :
4059 DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL, lcCfg->u.umUniDirDlCfg, sizeof(UmUniDirDlBearerCfg));
4063 DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL, lcCfg->snssai, sizeof(Snssai));
4065 memset(ueCfg, 0, sizeof(DuRlcUeCfg));
4069 /*******************************************************************
4071 * @brief Du process Ue Context Release Command
4075 * Function : duProcUeContextReleaseCommand
4077 * Functionality: Du process Ue Context Release Command
4079 * @params[in] DuUeCb *duUeCb
4080 * @return ROK - success
4083 * ****************************************************************/
4084 uint8_t duProcUeContextReleaseCommand(uint16_t cellId, DuUeCb *duUeCb)
4086 uint8_t ret =ROK, ueId=0;
4091 crnti = duUeCb->crnti;
4092 GET_UE_ID(crnti, ueId);
4096 /* Send DL RRC msg for RRC release */
4097 if(duUeCb->f1UeDb->dlRrcMsg)
4099 if(duUeCb->f1UeDb->dlRrcMsg->rrcMsgPdu != NULLP)
4101 ret = duBuildAndSendDlRrcMsgToRlc(cellId, duCb.actvCellLst[duUeCb->f1UeDb->cellIdx]->ueCb[ueId-1].duRlcUeCfg,\
4102 duUeCb->f1UeDb->dlRrcMsg);
4105 DU_LOG("\nERROR --> DU APP : duProcUeContextReleaseCommand() : Failed to send DL RRC msg");
4106 DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL, duUeCb->f1UeDb->dlRrcMsg->rrcMsgPdu,\
4107 duUeCb->f1UeDb->dlRrcMsg->rrcMsgSize);
4108 DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL, duUeCb->f1UeDb->dlRrcMsg, sizeof(F1DlRrcMsg));
4115 ret = duBuildAndSendUeDeleteReq(cellId,crnti);
4118 DU_LOG("\nERROR --> DU APP : duProcUeContextReleaseCommand(): Failed to build and send Ue Delete request");
4125 /*******************************************************************
4127 * @brief Sending UE Reset Req To Mac
4131 * Function : sendUeResetReqToMac
4134 * sending UE Reset Req To Mac
4136 * @params[in] cellId, ueId, crnti
4137 * @return ROK - success
4140 *****************************************************************/
4142 uint8_t sendUeResetReqToMac(uint16_t cellId, uint8_t ueId)
4146 MacUeResetReq *ueReset = NULLP;
4148 DU_ALLOC_SHRABL_BUF(ueReset, sizeof(MacUeResetReq));
4151 ueReset->cellId = cellId;
4152 ueReset->ueId = ueId;
4153 FILL_PST_DUAPP_TO_MAC(pst, EVENT_MAC_UE_RESET_REQ);
4155 DU_LOG("\nDEBUG --> DU_APP: Sending UE Reset Request to MAC ");
4156 ret = (*packMacUeResetReqOpts[pst.selector])(&pst, ueReset);
4159 DU_LOG("\nERROR --> DU_APP: sendUeResetReqToMac(): Failed to send UE Reset Req to MAC");
4160 DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL, ueReset, sizeof(MacUeResetReq));
4165 DU_LOG("\nERROR --> DU_APP: sendUeResetReqToMac(): Failed to allocate memory");
4171 /*******************************************************************
4173 * @brief DU processes UE reset req and send it to MAC
4177 * Function : duBuildAndSendUeResetReq
4179 * Functionality: DU processes UE reset req and send to MAC
4182 * @params[in] cellId, crnti
4183 * @return ROK - success
4186 * ****************************************************************/
4188 uint8_t duBuildAndSendUeResetReq(uint16_t cellId, uint16_t crnti)
4191 uint16_t cellIdx = 0;
4193 DU_LOG("\nDEBUG --> DU_APP : Building UE reset request");
4194 GET_CELL_IDX(cellId, cellIdx);
4195 GET_UE_ID(crnti, ueId);
4197 if(duCb.actvCellLst[cellIdx] != NULLP)
4199 if(crnti != duCb.actvCellLst[cellIdx]->ueCb[ueId - 1].crnti)
4201 DU_LOG("\nERROR --> DU APP : duBuildAndSendUeResetReq(): CRNTI [%d] not found", crnti);
4205 duCb.actvCellLst[cellIdx]->ueCb[ueId - 1].ueState = UE_RESET_IN_PROGRESS;
4206 if(sendUeResetReqToMac(cellId, ueId) == RFAILED)
4208 DU_LOG("\nERROR --> DU APP : DuProcMacUeResetRsp(): Failed to build UE reset req for MAC ");
4214 DU_LOG("\nERROR --> DU APP : duBuildAndSendUeResetReq(): Cell Id %d not found", cellId);
4221 /*******************************************************************
4223 * @brief Handle UE reset response from MAC
4227 * Function : DuProcMacUeResetRsp
4229 * Functionality: Handle UE reset response from MAC
4231 * @params[in] Pointer to MacUeResetRsp and Pst
4232 * @return ROK - success
4235 * ****************************************************************/
4237 uint8_t DuProcMacUeResetRsp(Pst *pst, MacUeResetRsp *resetRsp)
4244 if(resetRsp->status == SUCCESSFUL)
4246 DU_LOG("\nINFO --> DU APP : MAC UE Reset Response : SUCCESS [UE IDX : %d]", resetRsp->ueId);
4247 GET_CELL_IDX(resetRsp->cellId, cellIdx);
4248 if(duCb.actvCellLst[cellIdx])
4250 duCb.actvCellLst[cellIdx]->ueCb[resetRsp->ueId -1].duMacUeCfg.macUeCfgState = UE_RESET_COMPLETE;
4251 /*TODO - Complete the processing after receiving successfully reset rsp*/
4256 DU_LOG("\nERROR --> DU APP : DuProcMacUeResetRsp(): MAC UE Reset Response : FAILURE [UE IDX : %d]",resetRsp->ueId);
4259 DU_FREE_SHRABL_BUF(pst->region, pst->pool, resetRsp, sizeof(MacUeResetRsp));
4263 DU_LOG("\nERROR --> DU APP : DuProcMacUeResetRsp(): MAC UE Reset Response is null");
4269 /*******************************************************************
4271 * @brief Handle UE sync status indication from MAC
4275 * Function : DuProcMacUeSyncStatusInd
4277 * Functionality: Handle UE sync status indication from MAC
4279 * @params[in] Pointer to MacUeSyncStatusInd and Pst
4280 * @return ROK - success
4283 * ****************************************************************/
4285 uint8_t DuProcMacUeSyncStatusInd(Pst *pst, MacUeSyncStatusInd *ueSyncStatusInd)
4287 uint8_t ret =RFAILED;
4288 uint16_t cellIdx=0, crnti = 0;
4293 GET_CELL_IDX(ueSyncStatusInd->cellId, cellIdx);
4294 if(duCb.actvCellLst[cellIdx])
4296 GET_CRNTI(crnti, ueSyncStatusInd->ueId);
4297 if(duCb.actvCellLst[cellIdx]->ueCb[ueSyncStatusInd->ueId-1].crnti == crnti)
4299 switch(ueSyncStatusInd->status)
4306 status = "OUT_OF_SYNC";
4309 case OUT_OF_SUNC_MAX_RETRIES:
4310 status = "OUT_OF_SUNC_MAX_RETRIES";
4318 DU_LOG("\nINFO --> DU APP : MAC UE sync status for received UeId %d is %s", ueSyncStatusInd->ueId,status);
4322 DU_LOG("\nERROR --> DU APP : DuProcMacUeSyncStatusInd(): MAC UE sync status indication : Ue Id [%d] not found",ueSyncStatusInd->cellId);
4327 DU_LOG("\nERROR --> DU APP : DuProcMacUeSyncStatusInd(): MAC UE sync status indication : Cell Id [%d] not found",ueSyncStatusInd->cellId);
4329 DU_FREE_SHRABL_BUF(pst->region, pst->pool, ueSyncStatusInd, sizeof(MacUeSyncStatusInd));
4333 DU_LOG("\nERROR --> DU APP : DuProcMacUeSyncStatusInd(): MAC UE sync status indication is null");
4338 /*******************************************************************
4340 * @brief Sending UE Reestablishment Req To Rlc
4344 * Function : sendUeReestablishReqToRlc
4347 * Sending UE Reestablishment Req To Rlc
4349 * @params[in] cellId, ueId
4350 * @return ROK - success
4353 *****************************************************************/
4355 uint8_t sendUeReestablishReqToRlc(uint16_t cellId, uint8_t ueId, uint8_t numLcToReestablish, uint8_t *lcId)
4357 uint8_t ret=ROK,idx=0;
4359 RlcUeReestablishReq *ueReestablish;
4361 DU_ALLOC_SHRABL_BUF(ueReestablish, sizeof(RlcUeReestablishReq));
4362 if(ueReestablish !=NULLP)
4364 ueReestablish->cellId = cellId;
4365 ueReestablish->ueId = ueId;
4366 ueReestablish->numLcsToReestablish = numLcToReestablish;
4368 for(idx = 0;idx<numLcToReestablish; idx++)
4370 ueReestablish->lcToReestablish[idx]= lcId[idx];
4372 FILL_PST_DUAPP_TO_RLC(pst, RLC_UL_INST, EVENT_RLC_UE_REESTABLISH_REQ);
4374 ret = (*packRlcUeReestablishReqOpts[pst.selector])(&pst, ueReestablish);
4377 DU_LOG("\nERROR --> DU_APP : sendUeReestablishReqToRlc():Failed to send UE Reestablishment Req to RLC");
4378 DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL, ueReestablish, sizeof(RlcUeReestablishReq));
4383 DU_LOG("\nERROR --> DU_APP: sendUeReestablishReqToRlc():Memory allocation failed");
4389 /*******************************************************************
4391 * @brief DU processes UE reestablishment req and sends to MAC and RLC
4395 * Function : duBuildAndSendUeReestablishReq
4397 * Functionality: DU processes UE reestablishment req and sends to MAC
4400 * @params[in] cellId, crnti, numLcToReestablish, ListOflcid
4401 * @return ROK - success
4404 * ****************************************************************/
4406 uint8_t duBuildAndSendUeReestablishReq(uint16_t cellId, uint16_t crnti, uint8_t numLcToReestablish, uint8_t *lcId)
4409 uint16_t cellIdx = 0;
4411 DU_LOG("\nDEBUG --> DU_APP: Building UE Reestablishment Request ");
4412 GET_CELL_IDX(cellId, cellIdx);
4413 GET_UE_ID(crnti, ueId);
4415 if(duCb.actvCellLst[cellIdx] != NULLP)
4417 if(crnti != duCb.actvCellLst[cellIdx]->ueCb[ueId - 1].crnti)
4419 DU_LOG("\nERROR --> DU APP : duBuildAndSendUeReestablishReq(): CRNTI [%d] not found", crnti);
4423 if(sendUeReestablishReqToRlc(cellId, ueId, numLcToReestablish, lcId) == RFAILED)
4425 DU_LOG("\nERROR --> DU APP : duBuildAndSendUeReestablishReq(): Failed to send UE reestablishment req for RLC ");
4431 DU_LOG("\nERROR --> DU APP : duBuildAndSendUeReestablishReq(): Cell Id %d is not found", cellId);
4438 /*******************************************************************
4440 * @brief Processes UE Reestablishment Rsp received from RLC
4444 * Function : DuProcRlcUeReestablishRsp
4447 * Processes UE Reestablishment Rsp received from RLC
4449 * @params[in] Post structure
4450 * Pointer to RlcUeReestablishRsp
4451 * @return ROK - success
4454 * *****************************************************************/
4456 uint8_t DuProcRlcUeReestablishRsp(Pst *pst, RlcUeReestablishRsp *ueReestablishRsp)
4458 uint8_t ueId = 0, ret = RFAILED;
4459 uint16_t cellIdx = 0,crnti=0;
4461 if(ueReestablishRsp)
4463 ueId = ueReestablishRsp->ueId;
4464 GET_CELL_IDX(ueReestablishRsp->cellId, cellIdx);
4466 if(ueReestablishRsp->status == SUCCESSFUL)
4468 if(duCb.actvCellLst[cellIdx]!=NULLP)
4470 GET_CRNTI(crnti, ueId);
4471 if(duCb.actvCellLst[cellIdx]->ueCb[ueId-1].crnti == crnti)
4473 /*TODO: complete the processing of UE Reestablishment Response */
4474 DU_LOG("\nINFO --> DU_APP: RLC UE Reestablishment Response : SUCCESS [UE IDX:%d]", ueId);
4478 DU_LOG("\nERROR --> DU APP : duBuildAndSendUeReestablishRsp(): CRNTI [%d] not found", crnti);
4481 DU_LOG("\nERROR --> DU APP : duBuildAndSendUeReestablishRsp(): Cell Id[%d] is not found", ueReestablishRsp->cellId);
4486 DU_LOG("\nERROR --> DU_APP: RLC UE Reestablishment Response : FAILED [UE IDX:%d]", ueId);
4488 DU_FREE_SHRABL_BUF(pst->region, pst->pool, ueReestablishRsp, sizeof(RlcUeReestablishRsp));
4493 /**********************************************************************
4495 ***********************************************************************/