[Epic-ID: ODUHIGH-462][Task-ID: ODUHIGH-472] Implementation of drx timer
[o-du/l2.git] / src / du_app / du_ue_mgr.c
1 /*******************************************************************************
2 ################################################################################
3 #   Copyright (c) [2017-2019] [Radisys]                                        #
4 #                                                                              #
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                                    #
8 #                                                                              #
9 #       http://www.apache.org/licenses/LICENSE-2.0                             #
10 #                                                                              #
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"
20 #include "lrg.h"
21 #include "lrg.x"
22 #include "ckw.h"
23 #include "ckw.x"
24 #include "kwu.h"
25 #include "kwu.x"
26 #include "lkw.h"
27 #include "lkw.x"
28 #include "legtp.h"
29 #include "du_app_mac_inf.h"
30 #include "du_app_rlc_inf.h"
31 #include "du_cfg.h"
32 #include "du_mgr.h"
33 #include "du_utils.h"
34 #include "du_f1ap_msg_hdl.h"
35 #include "du_ue_mgr.h"
36
37 #ifdef O1_ENABLE
38 #include "AlarmInterface.h"
39 #include "CmInterface.h"
40 #endif
41
42 DuMacDlCcchInd packMacDlCcchIndOpts[] =
43 {
44    packMacDlCcchInd,           /* Loose coupling */
45    MacProcDlCcchInd,           /* TIght coupling */
46    packMacDlCcchInd            /* Light weight-loose coupling */
47 };
48
49 DuMacUeCreateReq packMacUeCreateReqOpts[] =
50 {
51    packDuMacUeCreateReq,       /* Loose coupling */
52    MacProcUeCreateReq,         /* TIght coupling */
53    packDuMacUeCreateReq        /* Light weight-loose coupling */
54 };
55
56 DuRlcUeCreateReq packRlcUeCreateReqOpts[] =
57 {
58    packDuRlcUeCreateReq,       /* Loose coupling */
59    RlcProcUeCreateReq,         /* TIght coupling */
60    packDuRlcUeCreateReq        /* Light weight-loose coupling */
61 };
62
63 DuDlRrcMsgToRlcFunc duSendDlRrcMsgToRlcOpts[] =
64 {
65    packDlRrcMsgToRlc,          /* Loose coupling */ 
66    RlcProcDlRrcMsgTransfer,    /* Tight coupling */
67    packDlRrcMsgToRlc           /* Light weight-loose coupling */
68 };
69
70 DuRlcUeReconfigReq packRlcUeReconfigReqOpts[] =
71 {
72    packDuRlcUeReconfigReq,     /* Loose coupling */
73    RlcProcUeReconfigReq,       /* TIght coupling */
74    packDuRlcUeReconfigReq      /* Light weight-loose coupling */
75 };
76
77 DuMacUeReconfigReq packMacUeReconfigReqOpts[] =
78 {
79    packDuMacUeReconfigReq,     /* Loose coupling */
80    MacProcUeReconfigReq,       /* TIght coupling */
81    packDuMacUeReconfigReq      /* Light weight-loose coupling */
82 };
83
84 DuMacRachRsrcReq packMacRachRsrcReqOpts[] = 
85 {
86    packDuMacRachRsrcReq,      /* Loose coupling */
87    MacProcRachRsrcReq,        /* Tight coupling */
88    packDuMacRachRsrcReq       /* Light weight-loose coupling */
89 };
90
91 DuRlcDlUserDataToRlcFunc duSendRlcDlUserDataToRlcOpts[] =
92 {
93    packRlcDlUserDataToRlc,     /* Loose coupling */ 
94    RlcProcDlUserDataTransfer,  /* Tight coupling */
95    packRlcDlUserDataToRlc      /* Light weight-loose coupling */
96 };
97
98 DuMacRachRsrcRel packMacRachRsrcRelOpts[] = 
99 {
100    packDuMacRachRsrcRel,      /* Loose coupling */
101    MacProcRachRsrcRel,        /* Tight coupling */
102    packDuMacRachRsrcRel       /* Light weight-loose coupling */
103 };
104
105 DuMacUeDeleteReq packMacUeDeleteReqOpts[] =
106 {
107    packDuMacUeDeleteReq,       /* Loose coupling */
108    MacProcUeDeleteReq,         /* TIght coupling */
109    packDuMacUeDeleteReq        /* Light weight-loose coupling */
110 };
111
112 DuRlcUeDeleteReq packRlcUeDeleteReqOpts[] =
113 {
114    packDuRlcUeDeleteReq,       /* Loose coupling */
115    RlcProcUeDeleteReq,         /* TIght coupling */
116    packDuRlcUeDeleteReq        /* Light weight-loose coupling */
117 };
118
119 /******************************************************************
120  *
121  * @brief Function to return Drb LcId
122  *
123  * @details
124  *
125  *    Function : getDrbLcId
126  *
127  *    Functionality: Function to return Drb LcId
128  *
129  * @params[in] drbBitMap
130  *
131  * Returns: lcId - SUCCESS
132  *         RFAILED - FAILURE
133  *****************************************************************/
134
135 uint8_t getDrbLcId(uint32_t *drbBitMap)
136 {
137    uint8_t bitMask = 1, bitPos = 0;
138    bitPos = MIN_DRB_LCID;
139
140    while(bitPos <= MAX_DRB_LCID)
141    {
142       if((*drbBitMap & (bitMask << bitPos)) == 0)
143       {
144          *drbBitMap = ((bitMask << bitPos)| *drbBitMap);
145          return bitPos;
146       }
147       else
148       {
149          bitPos++;
150       }
151    }
152    DU_LOG("\nERROR   -->  DU_APP: Max LC Reached in getDrbLcId()");
153    return RFAILED;
154 }
155
156 /*******************************************************************
157  *
158  * @brief Function to fillDlUserDataInfo
159  *
160  * @details
161  *
162  *    Function : fillDlUserDataInfo
163  *
164  *    Functionality:
165  *      Function to fillDlUserDataInfo
166  *
167  * @params[in] teId,
168  *             dlDataMsgInfo
169  *
170  * @return ROK     - success
171  *         RFAILED - failure
172  *
173  * ****************************************************************/
174
175 uint8_t fillDlUserDataInfo(uint32_t teId, RlcDlUserDataInfo *dlDataMsgInfo)
176 {
177    uint8_t teIdx = 0;
178
179    /*Traversing the duCb to find the CellId, UeId, LCID corresponding to TEID*/
180    for(teIdx = 0; teIdx < duCb.numTeId; teIdx++)
181    {
182       if(duCb.upTnlCfg[teIdx] && (duCb.upTnlCfg[teIdx]->tnlCfg1 != NULLP))
183       {
184          if(duCb.upTnlCfg[teIdx]->tnlCfg1->teId == teId)
185          {
186             dlDataMsgInfo->cellId = duCb.upTnlCfg[teIdx]->cellId;
187             dlDataMsgInfo->ueId = duCb.upTnlCfg[teIdx]->ueId;
188             dlDataMsgInfo->rbId = duCb.upTnlCfg[teIdx]->drbId;
189             return ROK;
190          }
191       }
192    }
193    return RFAILED;
194 }
195
196  /*******************************************************************
197  *
198  * @brief Build and Send DL Data Message transfer to RLC
199  *
200  * @details
201  *
202  *    Function : duBuildAndSendDlUserDataToRlc
203  *
204  *    Functionality:
205  *      Build and Send DL Data Message transfer to RLC
206  *
207  * @params[in] Cell ID
208  *             UE Index
209  *             Logical Channgel ID
210  *             RRC Message
211  *             RRC Message Length
212  * @return ROK     - success
213  *         RFAILED - failure
214  *
215  * ****************************************************************/
216
217 uint8_t duBuildAndSendDlUserDataToRlc(uint16_t msgLen, EgtpMsg *egtpMsg)
218 {
219    uint8_t ret = RFAILED;
220    Pst     pst;
221    RlcDlUserDataInfo *dlDataMsgInfo = NULLP;
222
223    DU_ALLOC_SHRABL_BUF(dlDataMsgInfo, sizeof(RlcDlUserDataInfo));
224    if(!dlDataMsgInfo)
225    {
226       DU_LOG("\nERROR  -->  DU_APP : Memory allocation failed for dlDataMsgInfo in duHdlEgtpDlData()");
227       return RFAILED;
228    }
229    memset(dlDataMsgInfo, 0, sizeof(RlcDlUserDataInfo));
230    dlDataMsgInfo->dlMsg = egtpMsg->msg;
231    dlDataMsgInfo->msgLen = msgLen;
232
233    /* Filling DL DATA Msg Info */
234    if(fillDlUserDataInfo(egtpMsg->msgHdr.teId, dlDataMsgInfo) == ROK)
235    {
236       /* Filling post structure and sending msg */ 
237       FILL_PST_DUAPP_TO_RLC(pst, RLC_DL_INST, EVENT_DL_USER_DATA_TRANS_TO_RLC);
238       DU_LOG("\nDEBUG  -->  DU_APP : Sending User Data Msg to RLC [TEID, nPDU]:[%d, %d]\n",\
239                        egtpMsg->msgHdr.teId, egtpMsg->msgHdr.nPdu.val);
240       ret = (*duSendRlcDlUserDataToRlcOpts[pst.selector])(&pst, dlDataMsgInfo);
241    }
242    if(ret != ROK)
243    {
244       DU_LOG("\nERROR  -->  DU_APP : Failed to send User Data to RLC in duHdlEgtpDlData()");
245       ODU_PUT_MSG_BUF(dlDataMsgInfo->dlMsg);
246       DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL, dlDataMsgInfo, sizeof(RlcDlUserDataInfo));
247    }
248    return ret;
249 }
250
251 /*******************************************************************
252  *
253  * @brief Handles EGTP data from CU 
254  *
255  * @details
256  *
257  *    Function : duHdlEgtpData
258  *
259  *    Functionality: 
260  *      Processes EGTP header and sends data to RLC
261  *
262  * @params[in]  Pointer to EGTP Message 
263  * @return ROK     - success
264  *         RFAILED - failure
265  *
266  * ****************************************************************/
267 uint8_t duHdlEgtpDlData(EgtpMsg  *egtpMsg)
268 {
269    uint16_t msgLen = 0;
270
271 #ifdef CALL_FLOW_DEBUG_LOG
272     DU_LOG("\nCall Flow: ENTEGTP -> ENTDUAPP : EVENT_HDL_RECV_DL_DATA\n");
273 #endif
274
275    DU_LOG("\nDEBUG  --> DU_APP : Processing DL data in duHdlEgtpDlData()");
276    
277    if(!egtpMsg->msg)
278    {
279       DU_LOG("\nERROR  -->  DU_APP : Recevied Dl Data is NULLP in duHdlEgtpDlData()");
280       return RFAILED;
281    }
282    ODU_GET_MSG_LEN(egtpMsg->msg, (MsgLen *)&msgLen);
283    if(duBuildAndSendDlUserDataToRlc(msgLen, egtpMsg) != ROK)
284    {
285       DU_LOG("\nERROR  -->  DU_APP : Failed to build DL USer Data in duHdlEgtpDlData()");
286       return RFAILED;
287    }
288    return ROK;
289 }
290
291 /******************************************************************
292  *
293  * @brief Builds and Sends DL CCCH Ind to MAC
294  *
295  * @details
296  *
297  *    Function : duBuildAndSendDlCcchInd 
298  *
299  *    Functionality: Builds and sends DL CCCH Ind Msg to MAC
300  *
301  * @params[in] dlCcchMsg - uint8_t*
302  * @return ROK     - success
303  *         RFAILED - failure
304  *
305  * ****************************************************************/
306 uint8_t duBuildAndSendDlCcchInd(uint16_t *cellId, uint16_t *crnti, \
307       DlCcchMsgType msgType, uint16_t dlCcchMsgSize, uint8_t *dlCcchMsg)
308 {
309    uint8_t  ret                  = ROK;
310    uint16_t idx2;
311    DlCcchIndInfo *dlCcchIndInfo = NULLP;
312    Pst pst;
313
314    DU_LOG("\nDEBUG   -->  DU APP : Building and Sending DL CCCH Ind to MAC");
315
316    DU_ALLOC_SHRABL_BUF(dlCcchIndInfo, sizeof(DlCcchIndInfo));
317
318    if(!dlCcchIndInfo)
319    {
320       DU_LOG("\nERROR  -->  DU APP : Memory alloc failed while building DL CCCH Ind");
321       return RFAILED;
322    }
323
324    dlCcchIndInfo->cellId = *cellId;
325    dlCcchIndInfo->crnti = *crnti;
326    dlCcchIndInfo->msgType = msgType;
327    dlCcchIndInfo->dlCcchMsgLen = dlCcchMsgSize;
328
329    DU_ALLOC_SHRABL_BUF(dlCcchIndInfo->dlCcchMsg, dlCcchIndInfo->dlCcchMsgLen);
330    if(!dlCcchIndInfo->dlCcchMsg)
331    {
332       DU_LOG("\nERROR  -->  DU APP : Memory alloc failed while building DL CCCH Ind");
333       DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL, dlCcchIndInfo, sizeof(DlCcchIndInfo));
334       return RFAILED;
335    }
336    for(idx2 = 0; idx2 < dlCcchIndInfo->dlCcchMsgLen; idx2++)
337    {
338       dlCcchIndInfo->dlCcchMsg[idx2] = dlCcchMsg[idx2];
339    }
340    DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL, dlCcchMsg, dlCcchMsgSize);
341
342    /* Fill Pst */
343    FILL_PST_DUAPP_TO_MAC(pst, EVENT_MAC_DL_CCCH_IND);
344    ret = (*packMacDlCcchIndOpts[pst.selector])(&pst, dlCcchIndInfo);
345    if(ret != ROK)
346    {
347       DU_LOG("\nERROR  -->  DU_APP : Failure in sending DL CCCH to MAC");
348       DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL, dlCcchIndInfo->dlCcchMsg,\
349             dlCcchIndInfo->dlCcchMsgLen);
350       DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL, dlCcchIndInfo, \
351             sizeof(DlCcchIndInfo));
352       ret = RFAILED; 
353    }
354
355    return ret;
356
357 }
358
359 /*******************************************************************
360  *
361  * @brief Build and Send DL RRC Message transfer to RLC
362  *
363  * @details
364  *
365  *    Function : duBuildAndSendDlRrcMsgToRlc
366  *
367  *    Functionality:
368  *      Build and Send DL RRC Message transfer to RLC
369  *
370  * @params[in] Cell ID
371  *             UE Index
372  *             Logical Channgel ID
373  *             RRC Message
374  *             RRC Message Length
375  * @return ROK     - success
376  *         RFAILED - failure
377  *
378  * ****************************************************************/
379 uint8_t duBuildAndSendDlRrcMsgToRlc(uint16_t cellId, RlcUeCfg ueCfg, F1DlRrcMsg *f1DlRrcMsg)
380 {
381    Pst     pst;
382    uint8_t ret;
383    uint8_t lcIdx;
384    RlcDlRrcMsgInfo  *dlRrcMsgInfo = NULLP;
385
386    if(!f1DlRrcMsg)
387    {
388       DU_LOG("\nERROR  -->  DU APP : Received Dl RRC Msg is NULL at duBuildAndSendDlRrcMsgToRlc()");
389       return RFAILED;
390    }
391
392    DU_ALLOC_SHRABL_BUF(dlRrcMsgInfo, sizeof(RlcDlRrcMsgInfo));
393    if(!dlRrcMsgInfo)
394    {
395       DU_LOG("\nERROR  -->  DU APP : Memory allocation failed for dlRrcMsgInfo in \
396          duBuildAndSendDlRrcMsgToRlc");
397       DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL, f1DlRrcMsg->rrcMsgPdu, f1DlRrcMsg->rrcMsgSize);
398       return RFAILED;
399    }
400    
401    /* Filling up the RRC msg info */
402    dlRrcMsgInfo->cellId = cellId;
403    dlRrcMsgInfo->ueId = ueCfg.ueId;
404    for(lcIdx = 0; lcIdx <= MAX_NUM_LC; lcIdx++)
405    {
406       if(ueCfg.rlcLcCfg[lcIdx].lcId == f1DlRrcMsg->srbId)
407       {
408          dlRrcMsgInfo->rbType = ueCfg.rlcLcCfg[lcIdx].rbType;
409          dlRrcMsgInfo->rbId   = ueCfg.rlcLcCfg[lcIdx].rbId;
410          dlRrcMsgInfo->lcType = ueCfg.rlcLcCfg[lcIdx].lcType;
411          dlRrcMsgInfo->lcId   = ueCfg.rlcLcCfg[lcIdx].lcId;
412          break;
413       }
414    }
415    dlRrcMsgInfo->execDup = f1DlRrcMsg->execDup;
416    dlRrcMsgInfo->deliveryStaRpt = f1DlRrcMsg->deliveryStatRpt;
417    dlRrcMsgInfo->msgLen = f1DlRrcMsg->rrcMsgSize;
418    dlRrcMsgInfo->rrcMsg = f1DlRrcMsg->rrcMsgPdu;
419
420    /* Filling post structure and sending msg */ 
421    FILL_PST_DUAPP_TO_RLC(pst, RLC_DL_INST, EVENT_DL_RRC_MSG_TRANS_TO_RLC);
422    DU_LOG("\nDEBUG   -->  DU_APP: Sending Dl RRC Msg to RLC \n");
423    ret = (*duSendDlRrcMsgToRlcOpts[pst.selector])(&pst, dlRrcMsgInfo);
424    if(ret != ROK)
425    {
426       DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL, f1DlRrcMsg->rrcMsgPdu, f1DlRrcMsg->rrcMsgSize);
427       DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL, dlRrcMsgInfo, sizeof(RlcDlRrcMsgInfo));
428       return RFAILED;
429    }
430
431    return ROK;
432
433
434
435
436 /******************************************************************
437  *
438  * @brief Process DL RRC Msg recevied from F1AP
439  *
440  * @details
441  *
442  *    Function : duProcDlRrcMsg
443  *
444  *    Functionality: Process DL RRC Msg recevied from F1AP
445  *
446  * @params[in] dlCcchMsg - uint8_t*
447  * @return ROK     - success
448  *         RFAILED - failure
449  *
450  * ****************************************************************/
451
452 uint8_t duProcDlRrcMsg(F1DlRrcMsg *dlRrcMsg)
453 {
454    uint8_t ueIdx, ret;
455    uint16_t crnti, cellId, cellIdx;
456    bool ueCcchCtxtFound = false;
457    bool ueFound = false;
458
459    ret = ROK;
460
461    if(dlRrcMsg->srbId == SRB0_LCID) //RRC connection setup
462    {
463       for(ueIdx=0; ueIdx<duCb.numUe; ueIdx++)
464       {
465          if(dlRrcMsg->gnbDuUeF1apId == duCb.ueCcchCtxt[ueIdx].gnbDuUeF1apId)
466          {
467             ueCcchCtxtFound = true;
468             crnti  = duCb.ueCcchCtxt[ueIdx].crnti;
469             cellId = duCb.ueCcchCtxt[ueIdx].cellId;
470             break;
471          }
472       }
473    }
474    if(ueCcchCtxtFound)
475    {
476       ret = duBuildAndSendDlCcchInd(&cellId, &crnti, RRC_SETUP, dlRrcMsg->rrcMsgSize, dlRrcMsg->rrcMsgPdu);
477       if(ret == RFAILED)
478       {
479          DU_LOG("\nERROR  -->  DU APP : Failed to build DlCcch Ind at procDlRrcMsgTrans()");
480       }
481       else
482       {
483          if(duCb.actvCellLst[cellId-1] == NULLP)
484          {
485             DU_LOG("\nERROR  -->  DU APP : cellId [%d] does not exist", cellId);
486             ret = RFAILED;
487          }
488          if(duCb.actvCellLst[cellId-1]->numActvUes < MAX_NUM_UE)
489          {
490             ret = duCreateUeCb(&duCb.ueCcchCtxt[ueIdx], dlRrcMsg->gnbCuUeF1apId);
491             if(ret == RFAILED)
492             {
493                DU_LOG("\nERROR  -->  DU APP : Failed to createUeCb for cellId [%d] at procDlRrcMsgTrans()", \
494                      duCb.ueCcchCtxt[ueIdx].cellId);
495             }
496          }
497          else
498          {
499             DU_LOG("\nERROR   -->  DU_APP: Max Active UEs has reached at procDlRrcMsgTrans()");
500             ret = RFAILED;
501          }
502       }
503    }
504    else
505    {
506       for(cellIdx = 0; cellIdx < MAX_NUM_CELL; cellIdx++)
507       {
508          for(ueIdx = 0 ; ueIdx < MAX_NUM_UE; ueIdx++)
509          {
510             if(duCb.actvCellLst[cellIdx] && (dlRrcMsg->gnbCuUeF1apId == duCb.actvCellLst[cellIdx]->ueCb[ueIdx].gnbCuUeF1apId)
511                   && (dlRrcMsg->gnbDuUeF1apId == duCb.actvCellLst[cellIdx]->ueCb[ueIdx].gnbDuUeF1apId))
512             {
513                ueFound = true;
514                ret = duBuildAndSendDlRrcMsgToRlc(duCb.actvCellLst[cellIdx]->cellId, \
515                      duCb.actvCellLst[cellIdx]->ueCb[ueIdx].rlcUeCfg, dlRrcMsg);
516                break; 
517             }
518          }
519          if(ueFound)
520             break;
521       }
522       if(!ueFound)
523       {
524          DU_LOG("\nERROR   -->  DU_APP: UE ID [%d] not found", dlRrcMsg->gnbDuUeF1apId);
525          ret = RFAILED;
526       }
527    }
528    return ret;
529 }
530
531 /******************************************************************
532  *
533  * @brief Processes UL CCCH Ind recvd from MAC
534  *
535  * @details
536  *
537  *    Function : duProcUlCcchInd
538  *
539  *    Functionality: Processes UL CCCH Ind recvd from MAC
540  *
541  * @params[in] UlCcchIndInfo *ulCcchIndInfo
542  * @return ROK     - success
543  *         RFAILED - failure
544  *
545  * ****************************************************************/
546 uint8_t duProcUlCcchInd(UlCcchIndInfo *ulCcchIndInfo)
547 {
548
549    uint8_t ret = ROK;
550    int32_t gnbDuUeF1apId = 0;
551
552    if(ulCcchIndInfo->crnti)
553    {
554       GET_UE_ID(ulCcchIndInfo->crnti, gnbDuUeF1apId);
555    }
556    else
557    {
558       DU_LOG("\nERROR  -->  DU_APP : Received invalid CRNTI [%d] ", ulCcchIndInfo->crnti);
559       return RFAILED;
560    }
561    
562    /* Store Ue mapping */
563    duCb.ueCcchCtxt[duCb.numUe].gnbDuUeF1apId = (uint32_t)gnbDuUeF1apId;
564    duCb.ueCcchCtxt[duCb.numUe].crnti         = ulCcchIndInfo->crnti;
565    duCb.ueCcchCtxt[duCb.numUe].cellId        = ulCcchIndInfo->cellId;
566
567    duCb.numUe++;
568
569    ret = (BuildAndSendInitialRrcMsgTransfer(gnbDuUeF1apId, ulCcchIndInfo->crnti, ulCcchIndInfo->ulCcchMsgLen,
570             ulCcchIndInfo->ulCcchMsg));
571    if(ret != ROK)
572    {
573       DU_LOG("\nERROR  -->  DU_APP : BuildAndSendInitialRrcMsgTransfer failed");
574    }
575
576    DU_FREE_SHRABL_BUF(MAC_MEM_REGION, MAC_POOL, ulCcchIndInfo->ulCcchMsg, ulCcchIndInfo->ulCcchMsgLen);
577    DU_FREE_SHRABL_BUF(MAC_MEM_REGION, MAC_POOL, ulCcchIndInfo, sizeof(UlCcchIndInfo));
578
579    return ret;
580
581 }
582
583 /******************************************************************
584  *
585  * @brief Fills Default UL LC Cfg
586  *
587  * @details
588  *
589  *    Function : fillDefaultUlLcCfg
590  *
591  *    Functionality: Fills Default UL LC Cfg
592  *
593  * @params[in]  UlLcCfg *ulLcCfg 
594  * @return void
595  *****************************************************************/
596 void fillDefaultUlLcCfg(UlLcCfg *ulLcCfg)
597 {
598    ulLcCfg->priority = LC_PRIORITY_1;
599    ulLcCfg->lcGroup =  0;
600    ulLcCfg->schReqId = 0;
601    ulLcCfg->pbr = PBR_KBPS_INFINITY;
602    ulLcCfg->bsd = BSD_MS_1000;
603 }
604
605 /******************************************************************
606  *
607  * @brief Fills Initial DL Bandwidth Part
608  *
609  * @details
610  *
611  *    Function : fillDefaultInitDlBwp
612  *
613  *    Functionality: Fills Initial DL Bandwidth Part
614  *
615  * @params[in]  InitialDlBwp *initDlBwp
616  * @return ROK - success
617  *         RFAILED - failure
618  *
619  *****************************************************************/
620 uint8_t fillDefaultInitDlBwp(InitialDlBwp *initDlBwp)
621 {
622    uint8_t idx = 0;
623    uint8_t freqDomainResource[FREQ_DOM_RSRC_SIZE] = {0};
624    uint8_t coreset0EndPrb, coreset1StartPrb, coreset1NumPrb;
625
626    if(initDlBwp)
627    {
628       /* Filling PDCCH Config */
629       initDlBwp->pdcchPresent = TRUE;
630       if(initDlBwp->pdcchPresent)
631       {
632          initDlBwp->pdcchCfg.numCRsetToAddMod = PDCCH_CTRL_RSRC_SET_ONE_ID;
633          memset(initDlBwp->pdcchCfg.cRSetToAddModList, 0, MAX_NUM_CRSET);
634          if(initDlBwp->pdcchCfg.numCRsetToAddMod <= MAX_NUM_CRSET)
635          {
636             initDlBwp->pdcchCfg.cRSetToAddModList[idx].cRSetId = PDCCH_CTRL_RSRC_SET_ONE_ID;
637             memset(initDlBwp->pdcchCfg.cRSetToAddModList[idx].freqDomainRsrc, 0, FREQ_DOM_RSRC_SIZE); 
638             coreset0EndPrb = CORESET0_END_PRB;
639             coreset1StartPrb = coreset0EndPrb +6;
640             coreset1NumPrb = CORESET1_NUM_PRB;
641             /* calculate the PRBs */
642             fillCoresetFeqDomAllocMap(((coreset1StartPrb)/6), (coreset1NumPrb/6), freqDomainResource);
643             memcpy(initDlBwp->pdcchCfg.cRSetToAddModList[idx].freqDomainRsrc, freqDomainResource, FREQ_DOM_RSRC_SIZE);
644
645             initDlBwp->pdcchCfg.cRSetToAddModList[idx].duration = PDCCH_CTRL_RSRC_SET_ONE_DURATION;
646             initDlBwp->pdcchCfg.cRSetToAddModList[idx].cceRegMappingType = CCE_REG_MAPPINGTYPE_PR_NONINTERLEAVED;
647             initDlBwp->pdcchCfg.cRSetToAddModList[idx].precoderGranularity = ALL_CONTIGUOUS_RBS;
648             initDlBwp->pdcchCfg.cRSetToAddModList[idx].dmrsScramblingId = SCRAMBLING_ID;
649          }
650          initDlBwp->pdcchCfg.numCRsetToRel = 0;
651
652          /* Filling Serach Space */
653          initDlBwp->pdcchCfg.numSearchSpcToAddMod = PDCCH_CTRL_RSRC_SET_ONE_ID;
654          memset(initDlBwp->pdcchCfg.searchSpcToAddModList, 0, MAX_NUM_CRSET);
655          if(initDlBwp->pdcchCfg.numSearchSpcToAddMod <= MAX_NUM_CRSET)
656          {
657             initDlBwp->pdcchCfg.searchSpcToAddModList[idx].searchSpaceId = PDCCH_SRCH_SPC_TWO_ID;
658             initDlBwp->pdcchCfg.searchSpcToAddModList[idx].cRSetId = PDCCH_CTRL_RSRC_SET_ONE_ID;
659             initDlBwp->pdcchCfg.searchSpcToAddModList[idx].mSlotPeriodicityAndOffset = SLOTPERIODICITYANDOFFSET_PR_SL1;
660             memset(initDlBwp->pdcchCfg.searchSpcToAddModList[idx].mSymbolsWithinSlot, 0, MONITORING_SYMB_WITHIN_SLOT_SIZE);
661             initDlBwp->pdcchCfg.searchSpcToAddModList[idx].mSymbolsWithinSlot[idx] = PDCCH_SYMBOL_WITHIN_SLOT;
662             initDlBwp->pdcchCfg.searchSpcToAddModList[idx].numCandidatesAggLevel1 = AGGREGATIONLEVEL_N8; 
663             initDlBwp->pdcchCfg.searchSpcToAddModList[idx].numCandidatesAggLevel2 = AGGREGATIONLEVEL_N8; 
664             initDlBwp->pdcchCfg.searchSpcToAddModList[idx].numCandidatesAggLevel4 = AGGREGATIONLEVEL_N4; 
665             initDlBwp->pdcchCfg.searchSpcToAddModList[idx].numCandidatesAggLevel8 = AGGREGATIONLEVEL_N2; 
666             initDlBwp->pdcchCfg.searchSpcToAddModList[idx].numCandidatesAggLevel16 = AGGREGATIONLEVEL_N1;
667             initDlBwp->pdcchCfg.searchSpcToAddModList[idx].searchSpaceType = SEARCHSPACETYPE_PR_UE_SPECIFIC;
668             initDlBwp->pdcchCfg.searchSpcToAddModList[idx].ueSpecificDciFormat = PDCCH_SRCH_SPC_TWO_UE_SPEC_DCI_FORMAT;
669          }
670          initDlBwp->pdcchCfg.numSearchSpcToRel = 0;
671       }
672
673       /* Filling PDSCH Config */
674       initDlBwp->pdschPresent = TRUE;
675       if(initDlBwp->pdschPresent)
676       {
677          initDlBwp->pdschCfg.dmrsDlCfgForPdschMapTypeA.addPos = ADDITIONALPOSITION_POS0;
678          initDlBwp->pdschCfg.resourceAllocType = RESOURCEALLOCATION_TYPE1;
679
680          initDlBwp->pdschCfg.numTimeDomRsrcAlloc = NUM_TIME_DOM_RSRC_ALLOC;
681
682          idx = 0; 
683          initDlBwp->pdschCfg.timeDomRsrcAllociList[idx].mappingType = MAPPING_TYPEA;
684          initDlBwp->pdschCfg.timeDomRsrcAllociList[idx].startSymbol = PDSCH_START_SYMBOL; 
685          initDlBwp->pdschCfg.timeDomRsrcAllociList[idx].symbolLength = PDSCH_LENGTH_SYMBOL;
686          initDlBwp->pdschCfg.timeDomRsrcAllociList[idx].startSymbolAndLength = calcSliv(PDSCH_START_SYMBOL, PDSCH_LENGTH_SYMBOL);
687
688          idx++;
689          DU_ALLOC_SHRABL_BUF(initDlBwp->pdschCfg.timeDomRsrcAllociList[idx].k0, sizeof(uint8_t));
690          if(initDlBwp->pdschCfg.timeDomRsrcAllociList[idx].k0 == NULLP)
691          {
692             DU_LOG("\nERROR  -->  DUAPP : Failed to allocate memory to K0 in fillDefaultInitDlBwp");
693             return RFAILED;
694          }
695          if(initDlBwp->pdschCfg.timeDomRsrcAllociList[idx].k0)
696             *(initDlBwp->pdschCfg.timeDomRsrcAllociList[idx].k0) = 1;
697          initDlBwp->pdschCfg.timeDomRsrcAllociList[idx].mappingType = MAPPING_TYPEA;
698          initDlBwp->pdschCfg.timeDomRsrcAllociList[idx].startSymbol = PDSCH_START_SYMBOL; 
699          initDlBwp->pdschCfg.timeDomRsrcAllociList[idx].symbolLength = PDSCH_LENGTH_SYMBOL;
700          initDlBwp->pdschCfg.timeDomRsrcAllociList[idx].startSymbolAndLength = calcSliv(PDSCH_START_SYMBOL, PDSCH_LENGTH_SYMBOL);
701
702          initDlBwp->pdschCfg.rbgSize = RBG_SIZE_CONFIG1;
703          initDlBwp->pdschCfg.numCodeWordsSchByDci = CODEWORDS_SCHED_BY_DCI_N1;
704          initDlBwp->pdschCfg.bundlingType = TYPE_STATIC_BUNDLING;
705          initDlBwp->pdschCfg.bundlingInfo.StaticBundling.size = 0;
706       }
707    }
708
709    return ROK;
710 }
711
712 /******************************************************************
713  *
714  * @brief Fills Initial UL Bandwidth Part
715  *
716  * @details
717  *
718  *    Function : fillDefaultInitUlBwp
719  *
720  *    Functionality: Fills Initial UL Bandwidth Part
721  *
722  * @params[in]  InitialUlBwp *initUlBwp
723  * @return void
724  *
725  *****************************************************************/
726 void fillDefaultInitUlBwp(InitialUlBwp *initUlBwp)
727 {
728    uint8_t idx;
729    if(initUlBwp)
730    {
731       initUlBwp->pucchPresent = FALSE;
732
733       /*Filling PUSCH Config */
734       initUlBwp->puschPresent = TRUE;
735       if(initUlBwp->puschPresent)
736       {
737          initUlBwp->puschCfg.dataScramblingId = SCRAMBLING_ID;
738          initUlBwp->puschCfg.dmrsUlCfgForPuschMapTypeA.addPos = ADDITIONALPOSITION_POS0; 
739          initUlBwp->puschCfg.dmrsUlCfgForPuschMapTypeA.transPrecodDisabled. \
740             scramblingId0 = SCRAMBLING_ID; 
741          initUlBwp->puschCfg.resourceAllocType = RESOURCEALLOCATION_TYPE1;
742          initUlBwp->puschCfg.numTimeDomRsrcAlloc = 2;
743          idx = 0;
744          if(initUlBwp->puschCfg.numTimeDomRsrcAlloc <= MAX_NUM_UL_ALLOC)
745          {
746             initUlBwp->puschCfg.timeDomRsrcAllocList[idx].k2 = PUSCH_K2_CFG1;
747             initUlBwp->puschCfg.timeDomRsrcAllocList[idx].mappingType =\
748                MAPPING_TYPEA;
749             initUlBwp->puschCfg.timeDomRsrcAllocList[idx].startSymbol = PUSCH_START_SYMBOL;
750             initUlBwp->puschCfg.timeDomRsrcAllocList[idx].symbolLength = PUSCH_LENGTH_SYMBOL;
751             initUlBwp->puschCfg.timeDomRsrcAllocList[idx].startSymbolAndLength =\
752                calcSliv(PUSCH_START_SYMBOL, PUSCH_LENGTH_SYMBOL);
753
754        idx++;
755        initUlBwp->puschCfg.timeDomRsrcAllocList[idx].k2 = PUSCH_K2_CFG2;
756        initUlBwp->puschCfg.timeDomRsrcAllocList[idx].mappingType = MAPPING_TYPEA;
757        initUlBwp->puschCfg.timeDomRsrcAllocList[idx].startSymbol = PUSCH_START_SYMBOL;
758        initUlBwp->puschCfg.timeDomRsrcAllocList[idx].symbolLength = PUSCH_LENGTH_SYMBOL;
759        initUlBwp->puschCfg.timeDomRsrcAllocList[idx].startSymbolAndLength =\
760           calcSliv(PUSCH_START_SYMBOL, PUSCH_LENGTH_SYMBOL);
761          }
762          initUlBwp->puschCfg.transformPrecoder = TRANSFORM_PRECODER_DISABLED;
763       }
764    }
765    else
766    {
767       DU_LOG("\nERROR  -->  DU APP : Memory is NULL of InitalUlBwp");
768    }
769
770 }
771 /******************************************************************
772  *
773  * @brief Fills SpCell Group Info
774  *
775  * @details
776  *
777  *    Function : fillDefaultSpCellGrpInfo
778  *
779  *    Functionality: Fills Sp Cell Group Info
780  *
781  * @params[in]  MacUeCfg *macUeCfg
782  * @return ROK - Success
783  *         RFAILED - Failure
784  *
785  *****************************************************************/
786 uint8_t fillDefaultSpCellGrpInfo(MacUeCfg *macUeCfg)
787 {
788    SpCellCfg *spCell = NULL;
789
790    if(macUeCfg)
791       spCell = &macUeCfg->spCellCfg;
792
793    if(spCell)
794    {
795       macUeCfg->spCellCfgPres = true;
796
797       spCell->servCellIdx = SERV_CELL_IDX;
798       /* Filling Initial Dl Bwp */
799       if((fillDefaultInitDlBwp(&spCell->servCellCfg.initDlBwp)) != ROK)
800       {
801          DU_LOG("\nERROR  -->  DUAPP : Failed in fillDefaultInitDlBwp");
802          return RFAILED;
803       }
804
805       spCell->servCellCfg.numDlBwpToAdd    = 0; 
806       spCell->servCellCfg.firstActvDlBwpId = ACTIVE_DL_BWP_ID;
807       spCell->servCellCfg.defaultDlBwpId   = ACTIVE_DL_BWP_ID;
808       spCell->servCellCfg.bwpInactivityTmr = NULLP;
809       spCell->servCellCfg.pdschServCellCfg.maxMimoLayers = NULLP;
810       spCell->servCellCfg.pdschServCellCfg.maxCodeBlkGrpPerTb = NULLP;
811       spCell->servCellCfg.pdschServCellCfg.codeBlkGrpFlushInd = NULLP;
812       spCell->servCellCfg.pdschServCellCfg.xOverhead = NULLP;
813       spCell->servCellCfg.pdschServCellCfg.numHarqProcForPdsch = NUM_HARQ_PROC_FOR_PDSCH_N_16;
814
815       /* Filling Initial UL Bwp*/
816       fillDefaultInitUlBwp(&spCell->servCellCfg.initUlBwp);
817       spCell->servCellCfg.numUlBwpToAdd     = 0; 
818       spCell->servCellCfg.firstActvUlBwpId  = ACTIVE_DL_BWP_ID; 
819    }
820    else
821    {
822       DU_LOG("\nERROR  -->  DU APP : Memory is NULL for SpCellGrp");
823       return RFAILED;
824    }
825    return ROK;
826 }
827
828 /******************************************************************
829  *
830  * @brief Fills Physical Cell Group Info
831  *
832  * @details
833  *
834  *    Function : fillDefaultPhyCellGrpInfo
835  *
836  *    Functionality: Fills Physical Cell Group Info
837  *
838  * @params[in]  MacUeCfg *macUeCfg
839  * @return void
840  *
841  *****************************************************************/
842 void fillDefaultPhyCellGrpInfo(MacUeCfg *macUeCfg)
843 {
844    PhyCellGrpCfg *cellGrp = NULL;
845
846    if(macUeCfg)
847       cellGrp = &macUeCfg->phyCellGrpCfg;
848
849    if(cellGrp)
850    {
851       macUeCfg->phyCellGrpCfgPres = true;
852       cellGrp->pdschHarqAckCodebook = PDSCH_HARQ_ACK_CODEBOOK_DYNAMIC;
853       cellGrp->pNrFr1 = P_NR_FR1;
854    }
855    else
856    {
857       DU_LOG("\nERROR  -->  DU APP : Memory is NULL for Physical Cell Group");
858    }
859 }
860
861 /******************************************************************
862  *
863  * @brief Fills Mac Cell Group Info
864  *
865  * @details
866  *
867  *    Function : fillDefaultMacCellGrpInfo
868  *
869  *    Functionality: Fills Mac Cell Group Info
870  *
871  * @params[in]  MacUeCfg *macUeCfg
872  * @return void
873  *
874  *****************************************************************/
875 void fillDefaultMacCellGrpInfo(MacUeCfg *macUeCfg)
876 {
877    uint8_t idx;
878    MacCellGrpCfg *cellGrp = NULL;
879    
880    if(macUeCfg)
881       cellGrp = &macUeCfg->macCellGrpCfg;
882
883    if(cellGrp)
884    {
885       macUeCfg->macCellGrpCfgPres = true;
886
887       /* Filling Scheduling Request Config */
888       cellGrp->schReqCfg.addModListCount = 1;
889       if(cellGrp->schReqCfg.addModListCount <= MAX_NUM_SR_CFG_PER_CELL_GRP)
890       {
891          for(idx = 0; idx < cellGrp->schReqCfg.addModListCount; idx++)
892          {
893             cellGrp->schReqCfg.addModList[idx].schedReqId    = SCH_REQ_ID;
894             cellGrp->schReqCfg.addModList[idx].srProhibitTmr = SR_PROHIBIT_MS_32;
895             cellGrp->schReqCfg.addModList[idx].srTransMax    = SR_TRANS_MAX_N_16;
896          }
897       }
898       cellGrp->schReqCfg.relListCount = 0;
899
900       /* Filling Tag config */
901       cellGrp->tagCfg.addModListCount = 1;
902       if(cellGrp->tagCfg.addModListCount <= MAC_NUM_TAGS)
903       {
904          for(idx = 0; idx < cellGrp->tagCfg.addModListCount; idx++)
905          {
906             cellGrp->tagCfg.addModList[idx].tagId = TAG_ID;
907             cellGrp->tagCfg.addModList[idx].timeAlignTimer = TIME_ALIGNMENT_TIMER_INFINITY;
908          }
909       }
910       cellGrp->tagCfg.relListCount = 0;
911
912       /* Filling BSR config */
913       cellGrp->bsrTmrCfg.periodicTimer = BSR_PERIODIC_TIMER_SF_10;
914       cellGrp->bsrTmrCfg.retxTimer = BSR_RETX_TIMER_SF_320;
915       cellGrp->bsrTmrCfg.srDelayTimer = BSR_SR_DELAY_TMR_2560;
916
917       /* Filling PHR config */
918       cellGrp->phrCfgSetupPres = true;
919       cellGrp->phrCfg.periodicTimer = PHR_PERIODIC_TIMER_INFINITY;
920       cellGrp->phrCfg.prohibitTimer = PHR_PROHIBIT_TIMER_SF_0;
921       cellGrp->phrCfg.txPowerFactor = PHR_TX_PWR_FACTOR_CHANGE_INFINITY;
922       cellGrp->phrCfg.multiplePHR   = false;
923       cellGrp->phrCfg.dummy         = false;
924       cellGrp->phrCfg.phrType2OtherCell = false;
925       cellGrp->phrCfg.phrOtherCG = PHR_MODE_OTHER_CG_REAL;  
926
927       /* Filling Drx Config */
928 #ifdef NR_DRX
929       cellGrp->drxCfg.drxOnDurationTimer.onDurationTimerValInMs = DRX_ONDURATION_TIMER_VALUE_PRESENT_IN_MS;
930       if(!cellGrp->drxCfg.drxOnDurationTimer.onDurationTimerValInMs)
931          cellGrp->drxCfg.drxOnDurationTimer.onDurationtimerValue.subMilliSeconds = \
932                                                                                    DRX_ONDURATION_TIMER_VALUE_IN_SUBMS;
933       else
934          cellGrp->drxCfg.drxOnDurationTimer.onDurationtimerValue.milliSeconds = \
935                                                                                 DRX_ONDURATION_TIMER_VALUE_IN_MS;
936       cellGrp->drxCfg.drxInactivityTimer = DRX_INACTIVITY_TIMER;
937       cellGrp->drxCfg.drxHarqRttTimerDl = DRX_HARQ_RTT_TIMER_DL;
938       cellGrp->drxCfg.drxHarqRttTimerUl = DRX_HARQ_RTT_TIMER_UL;
939       cellGrp->drxCfg.drxRetransmissionTimerDl = DRX_RETRANSMISSION_TIMER_DL;
940       cellGrp->drxCfg.drxRetransmissionTimerUl = DRX_RETRANSMISSION_TIMER_UL;
941       cellGrp->drxCfg.drxLongCycleStartOffset.drxLongCycleStartOffsetVal = DRX_LONG_CYCLE_START_OFFSET_VAL;
942       cellGrp->drxCfg.drxLongCycleStartOffset.drxLongCycleStartOffsetChoice = DRX_LONG_CYCLE_START_OFFSET_CHOICE;
943       cellGrp->drxCfg.shortDrxPres = DRX_SHORT_CYCLE_PRESENT;
944       if(cellGrp->drxCfg.shortDrxPres)
945       {
946          cellGrp->drxCfg.shortDrx.drxShortCycle = DRX_SHORT_CYCLE;
947          cellGrp->drxCfg.shortDrx.drxShortCycleTimer = DRX_SHORT_CYCLE_TIMER;
948       }
949       cellGrp->drxCfg.drxSlotOffset = DRX_SLOT_OFFSET;
950 #endif
951
952    }
953    else
954    {
955       DU_LOG("\nERROR  -->  DU APP : Memory is NULL for Master Cell Group");
956    }
957 }
958
959 /*******************************************************************
960  *
961  * @brief Fills default modulation info for a UE
962  *
963  * @details
964  *
965  *    Function : fillDefaultModulation
966  *
967  *    Functionality: Fills default modulation info for a UE
968  *
969  * @params[in] Pointer to MAC UE configuration
970  * @return ROK     - success
971  *         RFAILED - failure
972  *
973  * ****************************************************************/
974 void fillDefaultModulation(MacUeCfg *ueCfg)
975 {
976    ueCfg->dlModInfo.modOrder = MOD_ORDER_QPSK;
977    ueCfg->dlModInfo.mcsIndex = DEFAULT_MCS;
978    ueCfg->dlModInfo.mcsTable = MCS_TABLE_QAM64; /* Spec 38.214-Table 5.1.3.1-1 */
979
980    ueCfg->ulModInfo.modOrder = MOD_ORDER_QPSK;
981    ueCfg->ulModInfo.mcsIndex = DEFAULT_MCS;
982    ueCfg->ulModInfo.mcsTable = MCS_TABLE_QAM64; /* Spec 38.214-Table 5.1.3.1-1 */
983 }
984
985 /******************************************************************
986  *
987  * @brief Function to fill Mac Lc Cfg for SRB1
988  *
989  * @details
990  *
991  *    Function : fillMacSrb1LcCfg
992  *
993  *    Functionality: Function to fill Mac Lc cfg for SRB1
994  *
995  * @params[in]  LcCfg *lcCfg, LcCfg *ueSetReqDb
996  * @return void
997  *****************************************************************/
998
999 void fillMacSrb1LcCfg(LcCfg *macLcCfg)
1000 {
1001    macLcCfg->lcId   = SRB1_LCID;
1002    macLcCfg->configType = CONFIG_ADD;
1003    macLcCfg->drbQos = NULLP;
1004    macLcCfg->snssai = NULLP;
1005    macLcCfg->ulLcCfgPres = true;
1006    fillDefaultUlLcCfg(&macLcCfg->ulLcCfg);
1007 }
1008
1009 /******************************************************************
1010  *
1011  * @brief Function to fill the Lc cfg from ueSetupReqDb
1012  *
1013  * @details
1014  *
1015  *    Function : fillMacLcCfgToAddMod
1016  *
1017  *    Functionality: Function to fill the Lc cfg from ueSetupReqDb
1018  *
1019  * @params[in]  LcCfg *lcCfg, LcCfg *ueSetReqDb
1020  * @return ROK/RFAILED
1021  *
1022  *****************************************************************/
1023
1024 uint8_t fillMacLcCfgToAddMod(LcCfg *macLcCfgToSend, LcCfg *ueLcCfgDb, LcCfg *oldLcCfg, Bool toUpdate)
1025 {
1026    if(!toUpdate)
1027    {
1028       if(macLcCfgToSend)
1029       {
1030          macLcCfgToSend->lcId = ueLcCfgDb->lcId;
1031          macLcCfgToSend->configType = ueLcCfgDb->configType;
1032
1033          if(ueLcCfgDb->drbQos)
1034             macLcCfgToSend->drbQos = ueLcCfgDb->drbQos;
1035          else if(oldLcCfg)
1036             macLcCfgToSend->drbQos = oldLcCfg->drbQos;
1037          else
1038             macLcCfgToSend->drbQos = NULL;
1039
1040          if(ueLcCfgDb->snssai)
1041             macLcCfgToSend->snssai = ueLcCfgDb->snssai;
1042          else if(oldLcCfg)
1043             macLcCfgToSend->snssai = oldLcCfg->snssai;
1044          else
1045             macLcCfgToSend->snssai = NULL;
1046
1047          macLcCfgToSend->ulLcCfgPres = ueLcCfgDb->ulLcCfgPres;
1048          memcpy(&macLcCfgToSend->ulLcCfg, &ueLcCfgDb->ulLcCfg, sizeof(UlLcCfg));
1049          memcpy(&macLcCfgToSend->dlLcCfg, &ueLcCfgDb->dlLcCfg, sizeof(DlLcCfg));
1050       }
1051    }
1052    else
1053    {
1054       oldLcCfg->lcId = ueLcCfgDb->lcId;
1055       oldLcCfg->configType = ueLcCfgDb->configType;
1056
1057       if(ueLcCfgDb->drbQos)
1058       {
1059          if(oldLcCfg->drbQos)
1060             DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL, oldLcCfg->drbQos, sizeof(DrbQosInfo));
1061
1062          DU_ALLOC_SHRABL_BUF(oldLcCfg->drbQos, sizeof(DrbQosInfo));
1063          if(oldLcCfg->drbQos == NULL)
1064          {
1065             DU_LOG("\nERROR  -->  DU APP : Memory Alloc Failed at fillMacLcCfgToAddMod()");
1066             return RFAILED;
1067          }
1068          memcpy(oldLcCfg->drbQos, ueLcCfgDb->drbQos, sizeof(DrbQosInfo));
1069       }
1070
1071       if(ueLcCfgDb->snssai)
1072       {
1073          if(oldLcCfg->snssai)
1074             DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL, oldLcCfg->snssai, sizeof(Snssai));
1075
1076          DU_ALLOC_SHRABL_BUF(oldLcCfg->snssai, sizeof(Snssai));
1077          if(oldLcCfg->snssai == NULL)
1078          {
1079             DU_LOG("\nERROR  -->  DU APP : Memory Alloc Failed at fillMacLcCfgToAddMod()");
1080             DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL, oldLcCfg->drbQos, sizeof(DrbQosInfo));
1081             return RFAILED;
1082          }
1083          memcpy(oldLcCfg->snssai, ueLcCfgDb->snssai, sizeof(Snssai));
1084       }
1085
1086       oldLcCfg->ulLcCfgPres = ueLcCfgDb->ulLcCfgPres;
1087       memcpy(&oldLcCfg->ulLcCfg, &ueLcCfgDb->ulLcCfg, sizeof(UlLcCfg));
1088       memcpy(&oldLcCfg->dlLcCfg, &ueLcCfgDb->dlLcCfg, sizeof(DlLcCfg));
1089    }
1090    return ROK;
1091 }
1092
1093 /******************************************************************
1094  *
1095  * @brief Function to copy the Bit rate from ueSetupReqDb
1096  *
1097  * @details
1098  *
1099  *    Function : fillAmbr
1100  *
1101  *    Functionality: Function to copy bit Rate from ueSetupReqDb
1102  *
1103  * @params[in]  AmbrCfg **macAmbr, AmbrCfg  *ueDbAmbr
1104  * @return ROK/RFAILED
1105  *
1106  *****************************************************************/
1107
1108 uint8_t fillAmbr(AmbrCfg **macAmbrCfgToSend, AmbrCfg *ueDbAmbr, AmbrCfg **oldMacAmbrCfg, Bool toUpdate)
1109 {
1110    if(!toUpdate)
1111    {
1112       if(ueDbAmbr)
1113       {
1114          *macAmbrCfgToSend = ueDbAmbr;
1115       }
1116       else if(oldMacAmbrCfg)
1117          *macAmbrCfgToSend = *oldMacAmbrCfg;       
1118    }
1119    else
1120    {
1121       if(ueDbAmbr)
1122       {
1123          if(oldMacAmbrCfg)
1124          {
1125             if(*oldMacAmbrCfg)
1126             {
1127                DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL, *oldMacAmbrCfg, sizeof(AmbrCfg));
1128             }
1129             DU_ALLOC_SHRABL_BUF(*oldMacAmbrCfg, sizeof(AmbrCfg));
1130             if(*oldMacAmbrCfg == NULLP)
1131             {
1132                DU_LOG("\nERROR  -->  DU APP : Memory Alloc Failed at fillAmbr()");
1133                return RFAILED;
1134             }
1135             memset(*oldMacAmbrCfg, 0, sizeof(AmbrCfg));
1136             (*oldMacAmbrCfg)->ulBr = ueDbAmbr->ulBr;
1137          }
1138       }
1139    }
1140
1141    return ROK;
1142 }
1143
1144 /******************************************************************
1145  *
1146  * @brief Builds and Send UE ReConfig Request to MAC
1147  *
1148  * @details
1149  *
1150  *    Function : sendUeReCfgReqToMac
1151  *
1152  *    Functionality: Builds and Send UE ReConfig Request to MAC
1153  *
1154  * @Params[in]  MacUeCfg pointer
1155  * @return ROK     - success
1156  *         RFAILED - failure
1157  *
1158  * ****************************************************************/
1159
1160 uint8_t sendUeReCfgReqToMac(MacUeCfg *macUeCfg)
1161 {
1162    uint8_t ret = ROK;
1163    Pst pst;
1164    
1165    /* Fill Pst */
1166    FILL_PST_DUAPP_TO_MAC(pst, EVENT_MAC_UE_RECONFIG_REQ);
1167    
1168    if(macUeCfg)
1169    {
1170       /* Processing one Ue at a time to MAC */
1171       DU_LOG("\nDEBUG   -->  DU_APP: Sending Ue Reconfig Request to MAC");
1172       ret = (*packMacUeReconfigReqOpts[pst.selector])(&pst, macUeCfg);
1173       if(ret == RFAILED)
1174       {
1175          DU_LOG("\nERROR  -->  DU APP : Failed to send Reconfig Request to MAC at sendUeReCfgReqToMac()");
1176          DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL, macUeCfg, sizeof(MacUeCfg));
1177       }
1178    }
1179    else
1180    {
1181       DU_LOG("\nERROR  -->  DU_APP: Received macUeCfg is NULLP at sendUeReCfgReqToMac()");
1182       ret = RFAILED;
1183    }
1184    return ret;
1185 }
1186
1187
1188
1189 /******************************************************************
1190  *
1191  * @brief Fills MacUeCfg structure
1192  *
1193  * @details
1194  *
1195  *    Function : fillMacUeCfg
1196  *
1197  *    Functionality: Fills MacUeCfg
1198  *
1199  * @params[in]  cellId, ueId, crnti, 
1200  *              DuUeCfg  pointer,
1201  *              MacUeCfg pointer
1202  * @return ROK/RFAILED
1203  *
1204  *****************************************************************/
1205 uint8_t fillMacUeCfg(uint16_t cellId, uint8_t gnbDuUef1apId, uint16_t crnti, DuUeCfg *ueCfgDb, MacUeCfg *macUeCfg)
1206 {
1207    uint8_t ret = ROK, dbIdx = 0, lcIdx = 0, cellIdx = 0;
1208    bool lcIdFound = false;
1209    MacUeCfg *duMacDb = NULLP;
1210
1211    macUeCfg->cellId = cellId;
1212    macUeCfg->ueId = gnbDuUef1apId;
1213    macUeCfg->crnti = crnti;
1214
1215    if(!ueCfgDb)
1216    {
1217       fillDefaultMacCellGrpInfo(macUeCfg);
1218       fillDefaultPhyCellGrpInfo(macUeCfg);
1219
1220       if((fillDefaultSpCellGrpInfo(macUeCfg)) != ROK)
1221       {
1222          DU_LOG("\nERROR  --> DUAPP : Failed in fillDefaultSpCellGrpInfo");
1223          return RFAILED;
1224       }
1225
1226       macUeCfg->ambrCfg = NULLP;
1227       fillDefaultModulation(macUeCfg);
1228       fillMacSrb1LcCfg(&macUeCfg->lcCfgList[0]);
1229       macUeCfg->numLcs++;
1230    }
1231    else
1232    {
1233       if(ueCfgDb->dataTransmissionAction == STOP_TRANSMISSION)
1234       {
1235          macUeCfg->transmissionAction = ueCfgDb->dataTransmissionAction; 
1236          return ROK;
1237       }
1238
1239       GET_CELL_IDX(cellId, cellIdx);
1240       if(duCb.actvCellLst[cellIdx])
1241          duMacDb = &duCb.actvCellLst[cellIdx]->ueCb[macUeCfg->ueId-1].macUeCfg;
1242       else
1243       {
1244          DU_LOG("\nERROR  -->  DU APP : Cell Id [%d] does not exist", cellId);
1245          return RFAILED;
1246       }
1247       duMacDb->macUeCfgState = UE_CFG_INPROGRESS;
1248       
1249       if(ueCfgDb->cellGrpCfg)
1250       {
1251          ret = procUeReCfgCellInfo(macUeCfg, duMacDb, ueCfgDb->cellGrpCfg);
1252          if(ret == ROK)
1253          {
1254             if(macUeCfg->spCellCfgPres == true)
1255             {
1256                if(macUeCfg->spCellCfg.servCellCfg.initDlBwp.pdschPresent)
1257                {
1258                   fillStartSymbolAndLen(macUeCfg->spCellCfg.servCellCfg.initDlBwp.pdschCfg.numTimeDomRsrcAlloc,\
1259                         &macUeCfg->spCellCfg.servCellCfg.initDlBwp.pdschCfg, NULL);
1260                }
1261                if(macUeCfg->spCellCfg.servCellCfg.initUlBwp.puschPresent)
1262                {
1263                   fillStartSymbolAndLen(macUeCfg->spCellCfg.servCellCfg.initUlBwp.puschCfg.numTimeDomRsrcAlloc,\
1264                         NULL, &macUeCfg->spCellCfg.servCellCfg.initUlBwp.puschCfg);
1265                }
1266             }
1267
1268             if(duMacDb)
1269                ret = fillAmbr(&macUeCfg->ambrCfg, ueCfgDb->ambrCfg , &duMacDb->ambrCfg, FALSE);
1270             else
1271                ret = fillAmbr(&macUeCfg->ambrCfg, ueCfgDb->ambrCfg , NULL, FALSE);
1272
1273             duFillModulationDetails(macUeCfg, duMacDb, ueCfgDb->ueNrCapability);
1274          }
1275       }
1276       else
1277       {
1278          fillDefaultMacCellGrpInfo(macUeCfg);
1279          fillDefaultPhyCellGrpInfo(macUeCfg);
1280          fillDefaultSpCellGrpInfo(macUeCfg);
1281          fillDefaultModulation(macUeCfg);
1282          macUeCfg->ambrCfg = NULLP;
1283       }
1284
1285 #ifdef NR_DRX
1286       if(ueCfgDb->drxConfigIndicatorRelease == true)
1287      {
1288          macUeCfg->drxConfigIndicatorRelease = true;
1289       }
1290       
1291       if(ueCfgDb->drxCyclePres)
1292       {
1293          macUeCfg->macCellGrpCfg.drxCfg.drxLongCycleStartOffset.drxLongCycleStartOffsetChoice = ueCfgDb->drxCycle.drxLongCycleLength;
1294          if(ueCfgDb->drxCycle.shortDrxCyclePres)
1295          {
1296             macUeCfg->macCellGrpCfg.drxCfg.shortDrxPres = true;
1297             macUeCfg->macCellGrpCfg.drxCfg.shortDrx.drxShortCycle = ueCfgDb->drxCycle.shortDrxCycle.drxShortCycle;
1298             macUeCfg->macCellGrpCfg.drxCfg.shortDrx.drxShortCycleTimer = ueCfgDb->drxCycle.shortDrxCycle.drxShortCycleTimer;
1299          }
1300          else
1301          {
1302             macUeCfg->macCellGrpCfg.drxCfg.shortDrxPres = false;
1303          }
1304       }
1305 #endif
1306
1307       /* Filling LC Context */
1308       for(dbIdx = 0; (dbIdx < ueCfgDb->numMacLcs && ret == ROK); dbIdx++)
1309       {
1310          if(!ueCfgDb->macLcCfg[dbIdx].ulLcCfgPres)
1311          {
1312             /* Filling default UL LC config in MAC if not present */
1313             ueCfgDb->macLcCfg[dbIdx].ulLcCfgPres = true;
1314             fillDefaultUlLcCfg(&ueCfgDb->macLcCfg[dbIdx].ulLcCfg);
1315          }
1316
1317          if(duMacDb)
1318          {
1319             for(lcIdx = 0; lcIdx < duMacDb->numLcs; lcIdx++)
1320             {
1321                if(ueCfgDb->macLcCfg[dbIdx].lcId == duMacDb->lcCfgList[lcIdx].lcId)
1322                {
1323                   lcIdFound = true;
1324                   if((ueCfgDb->macLcCfg[dbIdx].configType == CONFIG_UNKNOWN) ||
1325                         (ueCfgDb->macLcCfg[dbIdx].configType == CONFIG_MOD))
1326                   {
1327                      ueCfgDb->macLcCfg[dbIdx].configType = CONFIG_MOD;
1328                      ret = fillMacLcCfgToAddMod(&macUeCfg->lcCfgList[dbIdx], &ueCfgDb->macLcCfg[dbIdx],\
1329                            &duMacDb->lcCfgList[lcIdx], FALSE);
1330                   }
1331                }
1332                else
1333                   lcIdFound = false;
1334             }
1335          }
1336
1337          if(!lcIdFound)
1338          {
1339             /* ADD/DEL CONFIG */
1340             ret = fillMacLcCfgToAddMod(&macUeCfg->lcCfgList[dbIdx], &ueCfgDb->macLcCfg[dbIdx], NULL, FALSE);
1341          }
1342          if(ret == ROK)
1343          {
1344             macUeCfg->numLcs++;
1345          }
1346          else
1347          {
1348             DU_LOG("\nERROR  -->  DU APP : Failed to add Lc at Idx %d in fillMacUeCfg()", dbIdx); 
1349             break;
1350          }
1351       }/*End of Outer FOR loop */
1352       memcpy(&ueCfgDb->copyOfmacUeCfg, macUeCfg, sizeof(MacUeCfg));
1353    }
1354    return ret;
1355 }
1356
1357 /******************************************************************
1358  *
1359  * @brief Fills Rlc AM Information
1360  *
1361  * @details
1362  *
1363  *    Function : fillDefaultAmInfo
1364  *
1365  *    Functionality: Fills Rlc AM Information
1366  *
1367  * @params[in]  AmBearerCfg *amCfg
1368  * @return void
1369  *
1370  *****************************************************************/
1371 void fillDefaultAmInfo(AmBearerCfg *amCfg)
1372 {
1373    /* DL AM */
1374    amCfg->dlAmCfg.snLenDl     = AM_SIZE_12;
1375    amCfg->dlAmCfg.pollRetxTmr = T_POLL_RETRANSMIT_VAL;
1376    amCfg->dlAmCfg.pollPdu     = POLL_PDU_VAL;
1377    amCfg->dlAmCfg.pollByte    = POLL_BYTE_VAL;
1378    amCfg->dlAmCfg.maxRetxTh   = MAX_RETX_THRESHOLD_VAL;   
1379  
1380    /* UL AM */
1381    amCfg->ulAmCfg.snLenUl     = AM_SIZE_12;
1382    amCfg->ulAmCfg.reAssemTmr  = T_REASSEMBLY_VAL; 
1383    amCfg->ulAmCfg.statProhTmr = T_STATUS_PROHIBHIT_VAL;
1384 }
1385
1386 /******************************************************************
1387  *
1388  * @brief Fills RLC UM Bi Directional Information
1389  *
1390  * @details
1391  *
1392  *    Function : fillDefaultUmBiInfo
1393  *
1394  *    Functionality: Fills RLC UM Bi Directional Information
1395  *
1396  * @params[in]  UmBiDirBearerCfg *umBiDirCfg
1397  * @return void
1398  *
1399  *****************************************************************/
1400 void fillDefaultUmBiInfo(UmBiDirBearerCfg *umBiDirCfg)
1401 {
1402    /* UL UM BI DIR INFO */
1403    umBiDirCfg->ulUmCfg.snLenUlUm = UM_SIZE_12;
1404    umBiDirCfg->ulUmCfg.reAssemTmr = T_REASSEMBLY_VAL;
1405
1406    /* DL UM BI DIR INFO */
1407    umBiDirCfg->dlUmCfg.snLenDlUm  = UM_SIZE_12;
1408 }
1409
1410 /******************************************************************
1411  *
1412  * @brief Fills RLC UM Uni Directional UL Information
1413  *
1414  * @details
1415  *
1416  *    Function : fillDefaultUmUlInfo
1417  *
1418  *    Functionality: Fills RLC UM Uni Directional Info
1419  *
1420  * @params[in]  UmUniDirUlBearerCfg *UmUlCfg
1421  * @return void
1422  *
1423  *****************************************************************/
1424 void fillDefaultUmUlInfo(UmUniDirUlBearerCfg *UmUlCfg)
1425 {
1426    UmUlCfg->ulUmCfg.snLenUlUm = UM_SIZE_12;
1427    UmUlCfg->ulUmCfg.reAssemTmr = T_REASSEMBLY_VAL;
1428 }
1429
1430 /******************************************************************
1431  *
1432  * @brief Fills RLC UM Uni Directional DL Information
1433  *
1434  * @details
1435  *
1436  *    Function : fillDefaultUmDlInfo
1437  *
1438  *    Functionality: Fills RLC UM Uni Directional DL Info
1439  *
1440  * @params[in]  UmUniDirDlBearerCfg *UmDlCfg
1441  * @return void
1442  *
1443  *****************************************************************/
1444 void fillDefaultUmDlInfo(UmUniDirDlBearerCfg *UmDlCfg)
1445 {
1446    UmDlCfg->dlUmCfg.snLenDlUm  = UM_SIZE_12;
1447 }
1448
1449 /******************************************************************
1450  *
1451  * @brief Builds Rlc Mode Default Configuration
1452  *
1453  * @details
1454  *
1455  *    Function : fillDefaultRlcModeCfg
1456  *
1457  *    Functionality: Builds Rlc Mode Default Configuration
1458  *
1459  * @params[in]  rlcMode, RlcBearerCfg *lcCfg
1460  * @return ROK/RFAILED
1461  *
1462  *****************************************************************/
1463
1464 uint8_t fillDefaultRlcModeCfg(uint8_t rlcMode, RlcBearerCfg *lcCfg)
1465 {
1466    if(lcCfg)
1467    {
1468       switch(rlcMode)
1469       {
1470          case RLC_AM :
1471             {
1472                if(!lcCfg->u.amCfg)
1473                {
1474                   DU_ALLOC_SHRABL_BUF(lcCfg->u.amCfg, sizeof(AmBearerCfg));
1475                   if(lcCfg->u.amCfg)
1476                      fillDefaultAmInfo(lcCfg->u.amCfg);
1477                   else
1478                   {
1479                      DU_LOG("\n ERROR  -->  DU APP : Memory Alloc failed at AmCfg at fillDefaultRlcModeCfg()");
1480                      return RFAILED;
1481                   }
1482                }
1483                break;
1484             }
1485          case RLC_UM_BI_DIRECTIONAL :
1486             {
1487                if(!lcCfg->u.umBiDirCfg)
1488                {
1489                   DU_ALLOC_SHRABL_BUF(lcCfg->u.umBiDirCfg, sizeof(UmBiDirBearerCfg));
1490                   if(lcCfg->u.umBiDirCfg)
1491                      fillDefaultUmBiInfo(lcCfg->u.umBiDirCfg);
1492                   else
1493                   {
1494                      DU_LOG("\n ERROR  -->  DU APP : Memory Alloc failed at UmBiDirCfg at fillDefaultRlcModeCfg()");
1495                      return RFAILED;
1496                   }
1497                }
1498                break;
1499             }
1500          case RLC_UM_UNI_DIRECTIONAL_UL :
1501             {
1502                if(!lcCfg->u.umUniDirUlCfg)
1503                {
1504                   DU_ALLOC_SHRABL_BUF(lcCfg->u.umUniDirUlCfg, sizeof(UmUniDirUlBearerCfg));
1505                   if(lcCfg->u.umUniDirUlCfg)
1506                      fillDefaultUmUlInfo(lcCfg->u.umUniDirUlCfg);
1507                   else
1508                   {
1509                      DU_LOG("\n ERROR  -->  DU APP : Memory Alloc failed at UmUniDirUlCfg at fillDefaultRlcModeCfg()");
1510                      return RFAILED;
1511                   }
1512                }
1513                break;
1514             }
1515          case RLC_UM_UNI_DIRECTIONAL_DL :
1516             {
1517                if(!lcCfg->u.umUniDirDlCfg)
1518                {
1519                   DU_ALLOC_SHRABL_BUF(lcCfg->u.umUniDirDlCfg, sizeof(UmUniDirDlBearerCfg));
1520                   if(lcCfg->u.umUniDirDlCfg)
1521                      fillDefaultUmDlInfo(lcCfg->u.umUniDirDlCfg);
1522                   else
1523                   {
1524                      DU_LOG("\n ERROR  -->  DU APP : Memory Alloc failed at UmUniDirDlCfg at fillDefaultRlcModeCfg()");
1525                      return RFAILED;
1526                   }
1527                }
1528                break;
1529             }
1530          default:
1531             DU_LOG("\nERROR  -->  DUAPP: Invalid rlcMode %d at extractRlcCfgToAddMod()", rlcMode);
1532             return RFAILED;
1533       }
1534
1535    }
1536    else
1537    {
1538       DU_LOG("\nERROR  -->  DUAPP: Received LC Config is NULL");
1539       return RFAILED;
1540    }
1541    return ROK;
1542 }
1543
1544 /*******************************************************************
1545  *
1546  * @brief Function to fill Rlc Lc Cfg for SRB1
1547  *
1548  * @details
1549  *
1550  *    Function : fillRlcSrb1LcCfg
1551  *
1552  *    Functionality: 
1553  *     Function to fill Rlc Lc Cfg for SRB1
1554  * 
1555  *  @params[in]     Pointer to RlcBearerCfg
1556  *  @return ROK/RFAILED
1557  * 
1558  *****************************************************************/
1559
1560 uint8_t fillRlcSrb1LcCfg(RlcBearerCfg *rlcLcCfg)
1561 {
1562    uint8_t ret = ROK;
1563
1564    rlcLcCfg->rbId   = SRB1_LCID;
1565    rlcLcCfg->rbType = RB_TYPE_SRB;
1566    rlcLcCfg->lcId   = SRB1_LCID;
1567    rlcLcCfg->lcType = LCH_DCCH;
1568    rlcLcCfg->rlcMode = RLC_AM;
1569    rlcLcCfg->configType = CONFIG_ADD;
1570    ret = fillDefaultRlcModeCfg(rlcLcCfg->rlcMode, rlcLcCfg);
1571    rlcLcCfg->isLcAddModRspSent = true;
1572    return ret;
1573 }
1574
1575 /*******************************************************************
1576  *
1577  * @brief Processes UE ReConfig Req to RLC UL
1578  *
1579  * @details
1580  *
1581  *    Function : sendUeReCfgReqToRlc
1582  *
1583  *    Functionality: 
1584  *     Processes UE Reconfig Req to RLC UL
1585  * 
1586  *  @params[in]     Pointer to RlcUeCfg
1587  *  @return ROK     - success
1588  *          RFAILED - failure
1589  * 
1590  *****************************************************************/
1591
1592 uint8_t sendUeReCfgReqToRlc(RlcUeCfg *rlcUeCfg)
1593 {
1594    uint8_t ret;
1595    Pst pst;
1596    
1597    FILL_PST_DUAPP_TO_RLC(pst, RLC_UL_INST, EVENT_RLC_UE_RECONFIG_REQ);
1598    if(rlcUeCfg)
1599    {
1600       /* Processing one Ue at a time to RLC */
1601       DU_LOG("\nDEBUG   -->  DU_APP: Sending Ue Reconfig Request to RLC UL");
1602       ret = (*packRlcUeReconfigReqOpts[pst.selector])(&pst, rlcUeCfg);
1603       if(ret == RFAILED)
1604       {
1605          DU_LOG("\nERROR  -->  DU_APP : Failed to send Ue Reconfig Req to RLC at sendUeReCfgReqToRlc()");
1606          DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL, rlcUeCfg, sizeof(RlcUeCfg));
1607       }
1608    }
1609    else
1610    {
1611       DU_LOG("\nERROR  -->   DU_APP: Received RlcUeCfg is NULL at sendUeReCfgReqToRlc()");
1612       ret = RFAILED;
1613    }
1614    return ret;
1615 }
1616
1617 /******************************************************************
1618  *
1619  * @brief Fills Snssai information
1620  *
1621  * @details
1622  *
1623  *    Function : fillSnssaiInfo
1624  *
1625  *    Functionality: Fills Snssai information
1626  *
1627  *  @params[in]    LcCfg *snssaiTobeSend, LcCfg *snssaiDb, LcCfg *oldSnssai,
1628  *  Bool toUpdateg
1629  *  @return ROK     - success
1630  *          RFAILED - failure
1631  * 
1632  *****************************************************************/
1633 uint8_t fillSnssaiInfo(Snssai *snssaiTobeSend, Snssai *snssaiDb, Snssai **oldSnssai, Bool toUpdate)
1634 {
1635    if(!toUpdate)
1636    {
1637       if(snssaiDb)
1638          snssaiTobeSend = snssaiDb;
1639       else if(oldSnssai)
1640          snssaiTobeSend = *oldSnssai;
1641       else
1642          snssaiTobeSend = NULL;
1643    }
1644    else
1645    {
1646       if(snssaiDb)
1647       {
1648          if(*oldSnssai)
1649             DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL, *oldSnssai, sizeof(Snssai));
1650
1651          DU_ALLOC_SHRABL_BUF(*oldSnssai, sizeof(Snssai));
1652          if(*oldSnssai == NULL)
1653          {
1654             DU_LOG("\nERROR  -->  DU APP : Memory Alloc Failed at fillSnssaiInfo()");
1655             return RFAILED;
1656          }
1657          memcpy(*oldSnssai, snssaiDb, sizeof(Snssai));
1658       }
1659    }
1660    return ROK;
1661 }
1662 /******************************************************************
1663  *
1664  * @brief Fills RlcBearerCfg structure
1665  *
1666  * @details
1667  *
1668  *    Function : fillRlcUeCfg
1669  *
1670  *    Functionality: Fills Rlc Bearer Cfg
1671  *
1672  *
1673  *****************************************************************/
1674 uint8_t fillRlcUeCfg(uint16_t cellId, uint8_t duUeF1apId, DuUeCfg *ueCfgDb, RlcUeCfg *rlcUeCfg)
1675 {
1676    uint8_t ret, dbIdx, lcIdx, cellIdx;
1677    bool lcIdFound = false;
1678    RlcUeCfg *duRlcDb = NULLP;
1679
1680    ret = ROK;
1681    rlcUeCfg->cellId       = cellId;
1682    rlcUeCfg->ueId         = duUeF1apId;
1683
1684    if(!ueCfgDb)
1685    {
1686       /* Initial RB being Added */ 
1687       ret = fillRlcSrb1LcCfg(&rlcUeCfg->rlcLcCfg[0]);
1688       if(ret == ROK)
1689          rlcUeCfg->numLcs++;
1690       else
1691          memset(rlcUeCfg, 0, sizeof(RlcUeCfg));
1692    }
1693    else
1694    {
1695       /* Fetch RlcDb from DuUeCb */ 
1696       GET_CELL_IDX(cellId, cellIdx);
1697       duRlcDb = &duCb.actvCellLst[cellIdx]->ueCb[rlcUeCfg->ueId-1].rlcUeCfg;
1698       duRlcDb->rlcUeCfgState = UE_CFG_INPROGRESS;
1699
1700       for(dbIdx = 0; (dbIdx < ueCfgDb->numRlcLcs && ret == ROK); dbIdx++)
1701       {
1702          ret = fillDefaultRlcModeCfg(ueCfgDb->rlcLcCfg[dbIdx].rlcMode, &ueCfgDb->rlcLcCfg[dbIdx]);
1703          if(ret == RFAILED)
1704          {
1705             DU_LOG("\n ERROR  -->  DU APP : Failed to fill Rlc Mode at fillRlcUeCfg()");
1706             memset(rlcUeCfg, 0, sizeof(RlcUeCfg));
1707             return ret;
1708          }
1709
1710          if(duRlcDb)
1711          {
1712             /* Fill Rlc Ue Cfg List for ADD/MOD/DEL */
1713             for(lcIdx = 0; lcIdx < duRlcDb->numLcs; lcIdx++)
1714             { 
1715                if(ueCfgDb->rlcLcCfg[dbIdx].lcId == duRlcDb->rlcLcCfg[lcIdx].lcId)
1716                {
1717                   lcIdFound = true;
1718                   if((ueCfgDb->rlcLcCfg[dbIdx].configType == CONFIG_UNKNOWN)||
1719                         (ueCfgDb->rlcLcCfg[dbIdx].configType == CONFIG_MOD))
1720                   {
1721                      /* MOD */ 
1722                      ueCfgDb->rlcLcCfg[dbIdx].configType = CONFIG_MOD; /* update Db for MOD type */
1723                      memcpy(&rlcUeCfg->rlcLcCfg[dbIdx], &ueCfgDb->rlcLcCfg[dbIdx], sizeof(RlcBearerCfg));
1724                      fillSnssaiInfo(rlcUeCfg->rlcLcCfg[dbIdx].snssai, ueCfgDb->rlcLcCfg[dbIdx].snssai,\
1725                            &duRlcDb->rlcLcCfg[lcIdx].snssai,false);
1726                   }
1727                }
1728                else
1729                   lcIdFound = false;
1730             }
1731          }
1732
1733          if(!lcIdFound)
1734          {
1735             /* ADD/ DEL Config Type */
1736             memcpy(&rlcUeCfg->rlcLcCfg[dbIdx], &ueCfgDb->rlcLcCfg[dbIdx], sizeof(RlcBearerCfg));
1737             fillSnssaiInfo(rlcUeCfg->rlcLcCfg[dbIdx].snssai, ueCfgDb->rlcLcCfg[dbIdx].snssai, NULL, false);
1738          }
1739          rlcUeCfg->numLcs++;
1740       }
1741    }
1742    return ret;
1743 }
1744
1745 /******************************************************************
1746  *
1747  * @brief creates UE context
1748  *
1749  * @details
1750  *
1751  *    Function : duCreateUeCb
1752  *
1753  *    Functionality: Creates UE Conetxt
1754  *
1755  * @params[in] UeCcchCtxt Pointer
1756  *             UeIdx Pointer
1757  *
1758  * @return ROK     - success
1759  *         RFAILED - failure
1760  * ****************************************************************/
1761 uint8_t duCreateUeCb(UeCcchCtxt *ueCcchCtxt, uint32_t gnbCuUeF1apId)
1762 {
1763    uint8_t cellIdx = 0;
1764    uint8_t ret     = ROK;
1765    uint8_t ueId = 0, ueIdx = 0;
1766
1767    for(cellIdx = 0; cellIdx < MAX_NUM_CELL; cellIdx++)
1768    {
1769       if(duCb.actvCellLst[cellIdx] && (ueCcchCtxt->cellId == duCb.actvCellLst[cellIdx]->cellId))
1770       {
1771          GET_UE_ID(ueCcchCtxt->crnti, ueId);
1772          DU_LOG("\nDEBUG   -->  DU_APP: Filling UeCb for ueId [%d]", ueId);
1773
1774          ueIdx = ueId-1;
1775          duCb.actvCellLst[cellIdx]->ueCb[ueIdx].f1UeDb        = NULLP;
1776          duCb.actvCellLst[cellIdx]->ueCb[ueIdx].crnti         = ueCcchCtxt->crnti;
1777          duCb.actvCellLst[cellIdx]->ueCb[ueIdx].gnbDuUeF1apId = ueCcchCtxt->gnbDuUeF1apId;
1778          duCb.actvCellLst[cellIdx]->ueCb[ueIdx].gnbCuUeF1apId = gnbCuUeF1apId;
1779          duCb.actvCellLst[cellIdx]->ueCb[ueIdx].drbBitMap     = NULLP;
1780          duCb.actvCellLst[cellIdx]->ueCb[ueIdx].ueState       = UE_ACTIVE;
1781
1782          /* Filling Mac Ue Config */ 
1783          memset(&duCb.actvCellLst[cellIdx]->ueCb[ueIdx].macUeCfg, 0, sizeof(MacUeCfg));
1784          ret = duBuildAndSendUeCreateReqToMac(ueCcchCtxt->cellId, ueCcchCtxt->gnbDuUeF1apId, ueCcchCtxt->crnti, NULL, 
1785                &duCb.actvCellLst[cellIdx]->ueCb[ueIdx].macUeCfg);
1786          if(ret == RFAILED)
1787             DU_LOG("\nERROR  -->  DU APP : Failed to send UE create request to MAC");
1788
1789          /* Filling Rlc Ue Config */
1790          memset(&duCb.actvCellLst[cellIdx]->ueCb[ueIdx].rlcUeCfg, 0, sizeof(RlcUeCfg));
1791          ret = duBuildAndSendUeCreateReqToRlc(ueCcchCtxt->cellId, ueCcchCtxt->gnbDuUeF1apId, NULL,
1792                &duCb.actvCellLst[cellIdx]->ueCb[ueIdx].rlcUeCfg);
1793          if(ret == RFAILED)
1794             DU_LOG("\nERROR  -->  DU APP : Failed to send UE create request to RLC");
1795
1796          duCb.actvCellLst[cellIdx]->numActvUes++;
1797          memset(ueCcchCtxt, 0, sizeof(UeCcchCtxt));
1798          duCb.numUe--;
1799       }
1800    }
1801    return ret;
1802 }
1803
1804 /******************************************************************
1805  *
1806  * @brief Builds and Send UE Create Request to MAC
1807  *
1808  * @details
1809  *
1810  *    Function : duBuildAndSendUeCreateReqToMac
1811  *
1812  *    Functionality: Builds and Send UE Create Request to MAC
1813  *
1814  * @Params[in]  cellId,
1815  *              ueId,
1816  *              crnti,
1817  *              UE config extracted from F1AP msg
1818  *              MAC UE config struct to be filled
1819  * @return ROK     - success
1820  *         RFAILED - failure
1821  *
1822  * ****************************************************************/
1823
1824 uint8_t duBuildAndSendUeCreateReqToMac(uint16_t cellId, uint8_t gnbDuUeF1apId, uint16_t crnti, DuUeCfg *ueCfgDb, MacUeCfg *duMacUeCfg)
1825 {
1826    uint8_t  ret = ROK;
1827    MacUeCfg *macUeCfg = NULLP;
1828    Pst       pst;
1829    memset(&pst, 0, sizeof(Pst));
1830
1831
1832    ret = fillMacUeCfg(cellId, gnbDuUeF1apId, crnti, ueCfgDb, duMacUeCfg);
1833    if(ret == RFAILED)
1834    {
1835       DU_LOG("\nERROR  -->  DU APP : Failed to fill MacUeCfg at duBuildAndSendUeCreateReqToMac()");
1836       return RFAILED;
1837    }
1838
1839    /* Fill Pst */
1840    FILL_PST_DUAPP_TO_MAC(pst, EVENT_MAC_UE_CREATE_REQ);
1841
1842    /* Copying ueCb to a sharable buffer */
1843    DU_ALLOC_SHRABL_BUF(macUeCfg, sizeof(MacUeCfg));
1844    if(macUeCfg)
1845    {
1846       memset(macUeCfg, 0, sizeof(MacUeCfg));
1847       memcpy(macUeCfg, duMacUeCfg, sizeof(MacUeCfg));
1848       DU_LOG("\nDEBUG   -->  DU_APP: Sending UE create request to MAC");
1849
1850       /* Processing one Ue at a time to MAC */
1851       ret = (*packMacUeCreateReqOpts[pst.selector])(&pst, macUeCfg);
1852       if(ret == RFAILED)
1853       {
1854          DU_LOG("\nERROR  -->  DU_APP : Failure in sending Ue Create Req to MAC at duBuildAndSendUeCreateReqToMac()");
1855          DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL, macUeCfg, sizeof(MacUeCfg));
1856       }
1857    }
1858    else
1859    {
1860       DU_LOG("\n ERROR  -->  DU APP : Memory alloc failed at duBuildAndSendUeCreateReqToMac()");
1861       ret = RFAILED;
1862    }
1863    return ret;
1864 }
1865
1866 /*******************************************************************
1867  *
1868  * @brief Build and send RACH Resource request to MAC
1869  *
1870  * @details
1871  *
1872  *    Function : duBuildAndSendRachRsrcReqToMac
1873  *    Functionality:
1874  *        Build and send RACH Resource request to MAC
1875  *
1876  * @params[in] Cell Id
1877  *             UE Id
1878  * @return ROK     - success
1879  *         RFAILED - failure
1880  *
1881  * ****************************************************************/
1882 uint8_t duBuildAndSendRachRsrcReqToMac(uint16_t cellId, uint16_t ueId)
1883 {
1884    uint16_t cellIdx = 0, ssbIdx = 0;
1885    Pst pst;
1886    MacRachRsrcReq *rachRsrcReq = NULLP;
1887
1888    GET_CELL_IDX(cellId, cellIdx);
1889    if(duCb.actvCellLst[cellIdx] == NULLP)
1890    {
1891       DU_LOG("\nERROR  -->  DU APP : Cell Id [%d] not found in duBuildAndSendRachRsrcReqToMac()", cellId);
1892       return RFAILED;
1893    }
1894
1895    DU_ALLOC_SHRABL_BUF(rachRsrcReq, sizeof(MacRachRsrcReq));
1896    if(!rachRsrcReq)
1897    {
1898       DU_LOG("\nERROR  -->  DU APP : Failed to allocate memory for RACH Resource Request in \
1899             duBuildAndSendRachRsrcReqToMac()");
1900       return RFAILED;
1901    }
1902
1903    rachRsrcReq->cellId = cellId;
1904    rachRsrcReq->ueId = ueId;
1905    rachRsrcReq->numSsb = duCfgParam.macCellCfg.prachCfg.ssbPerRach;
1906    for(ssbIdx = 0; ssbIdx < rachRsrcReq->numSsb; ssbIdx++)
1907    {
1908       rachRsrcReq->ssbIdx[ssbIdx] = ssbIdx;
1909    }
1910
1911    /* Fill Pst */
1912    FILL_PST_DUAPP_TO_MAC(pst, EVENT_MAC_RACH_RESOURCE_REQ);
1913    
1914    if(((*packMacRachRsrcReqOpts[pst.selector])(&pst, rachRsrcReq)) != ROK)
1915    {
1916       DU_LOG("\nERROR  -->  DU_APP : Failure in sending RACH Resource Request to MAC at \
1917             duBuildAndSendRachRsrcReqToMac()");
1918       DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL, rachRsrcReq, sizeof(MacRachRsrcReq));
1919       return RFAILED;
1920    }
1921
1922    return ROK;
1923 }
1924
1925 /*******************************************************************
1926  *
1927  * @brief Process RACH resource response from MAC
1928  *
1929  * @details
1930  *
1931  *    Function : DuProcMacRachRsrcRsp
1932  *    Functionality:
1933  *        Process RACH resource response from MAC
1934  *
1935  * @params[in] Post structure
1936  *             RACH resource response
1937  * @return ROK     - success
1938  *         RFAILED - failure
1939  *
1940  * ****************************************************************/
1941 uint8_t DuProcMacRachRsrcRsp(Pst *pst, MacRachRsrcRsp *rachRsrcRsp)
1942 {
1943    uint8_t  ret = RFAILED;
1944    uint16_t cellIdx = 0;
1945    DuCellCb *cellCb = NULLP;
1946    DuUeCb   *ueCb = NULLP;
1947
1948    DU_LOG("\nINFO  -->  DU APP : Received RACH Resource Response from MAC. Cell ID [%d] UE ID [%d]",
1949          rachRsrcRsp->cellId, rachRsrcRsp->ueId);
1950
1951    if(rachRsrcRsp->result == MAC_DU_APP_RSP_OK)
1952    {
1953       DU_LOG("\nINFO : DU APP : RACH Resource Response from MAC : Result [SUCCESS]");
1954
1955       /* Fetch Cell Cb */
1956       GET_CELL_IDX(rachRsrcRsp->cellId, cellIdx);
1957       if(duCb.actvCellLst[cellIdx] && (duCb.actvCellLst[cellIdx]->cellId == rachRsrcRsp->cellId))
1958       {
1959          cellCb = duCb.actvCellLst[cellIdx];
1960
1961          /* Fetch UE CB */
1962          if(cellCb->ueCb[rachRsrcRsp->ueId-1].gnbDuUeF1apId == rachRsrcRsp->ueId)
1963          {
1964             ueCb = &cellCb->ueCb[rachRsrcRsp->ueId-1];
1965
1966             /* Store CRNTI alloted to this UE by MAC */
1967             ueCb->crnti = rachRsrcRsp->newCrnti;
1968
1969             /* Store the assigned CF-RA resources */
1970             memcpy(&ueCb->cfraResource, &rachRsrcRsp->cfraResource, sizeof(MacCfraResource));
1971
1972             /* RACH resources allocated to UE is sent to CU in UE Context Setup Response
1973              * along with the result of UE Context setup requested by CU */
1974             if((ret = BuildAndSendUeCtxtRsp(rachRsrcRsp->cellId, rachRsrcRsp->ueId)) != ROK)
1975                DU_LOG("\nERROR  ->  DU APP : Failure in BuildAndSendUeCtxtRsp()");
1976          }
1977          else
1978             DU_LOG("\nERROR  -->  DU APP : UE ID [%d] not found in DuProcMacRachRsrcRsp", rachRsrcRsp->ueId);
1979       }
1980       else
1981          DU_LOG("\nERROR  -->  DU APP : Cell ID [%d] not found in DuProcMacRachRsrcRsp", rachRsrcRsp->cellId);
1982    }
1983    else
1984       DU_LOG("\nINFO : DU APP : RACH Resource Response from MAC : Result [FAILURE]");
1985
1986    DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL, rachRsrcRsp, sizeof(MacRachRsrcRsp));
1987    return ret;
1988 }
1989
1990 /*******************************************************************
1991  *
1992  * @brief To update DuUeCb Mac Cfg
1993  *
1994  * @details
1995  *
1996  *    Function : duUpdateMacCfg
1997  *    Functionality:  update DuUeCb MAC Cfg
1998  *
1999  * @params[in] DuUeCb Pointer
2000  *             F1UeContextSetupDb pointer 
2001  * @return ROK     - success
2002  *         RFAILED - failure
2003  *
2004  * ****************************************************************/
2005 uint8_t duUpdateMacCfg(MacUeCfg *macUeCfg, F1UeContextSetupDb *f1UeDb) 
2006 {
2007    uint8_t ret, lcIdx, dbIdx, numLcs, lcDelIdx, cellIdx;
2008    MacUeCfg *oldMacUeCfg;
2009    ret = ROK;
2010    
2011    GET_CELL_IDX(macUeCfg->cellId, cellIdx);
2012    if(duCb.actvCellLst[cellIdx] == NULLP)
2013    {
2014       DU_LOG("\nERROR  --> DU APP: CellId[%d] not found", macUeCfg->cellId);
2015       return RFAILED;
2016    }
2017    oldMacUeCfg = &duCb.actvCellLst[cellIdx]->ueCb[macUeCfg->ueId-1].macUeCfg;
2018
2019    /*Filling Cell Group Cfg*/
2020    ret =  procUeReCfgCellInfo(macUeCfg, &f1UeDb->duUeCfg.copyOfmacUeCfg, f1UeDb->duUeCfg.cellGrpCfg);
2021 #ifdef NR_DRX
2022    memcpy(&macUeCfg->macCellGrpCfg.drxCfg, &f1UeDb->duUeCfg.copyOfmacUeCfg.macCellGrpCfg.drxCfg, sizeof(DrxCfg));
2023 #endif
2024    if(ret == ROK)
2025    {
2026       if(macUeCfg->spCellCfg.servCellCfg.initDlBwp.pdschPresent)
2027       {
2028          fillStartSymbolAndLen(macUeCfg->spCellCfg.servCellCfg.initDlBwp.pdschCfg.numTimeDomRsrcAlloc,\
2029                &macUeCfg->spCellCfg.servCellCfg.initDlBwp.pdschCfg, NULL);
2030       }
2031       if(macUeCfg->spCellCfg.servCellCfg.initUlBwp.puschPresent)
2032       {
2033          fillStartSymbolAndLen(macUeCfg->spCellCfg.servCellCfg.initUlBwp.puschCfg.numTimeDomRsrcAlloc,\
2034                NULL, &macUeCfg->spCellCfg.servCellCfg.initUlBwp.puschCfg);
2035       }
2036       ret = fillAmbr(NULL, f1UeDb->duUeCfg.ambrCfg, &oldMacUeCfg->ambrCfg, true);
2037       duFillModulationDetails(macUeCfg, oldMacUeCfg, f1UeDb->duUeCfg.ueNrCapability);
2038    }
2039
2040    /* Filling LC Context */
2041    for(dbIdx = 0; (dbIdx < f1UeDb->duUeCfg.numMacLcs && ret == ROK); dbIdx++)
2042    {
2043       numLcs = macUeCfg->numLcs;
2044       for(lcIdx = 0; lcIdx < numLcs; lcIdx++)
2045       {
2046          if(f1UeDb->duUeCfg.macLcCfg[dbIdx].lcId ==  macUeCfg->lcCfgList[lcIdx].lcId)
2047          {
2048             if(f1UeDb->duUeCfg.macLcCfg[dbIdx].configType == CONFIG_MOD)
2049             {
2050                ret = fillMacLcCfgToAddMod(NULL, &f1UeDb->duUeCfg.macLcCfg[dbIdx], &macUeCfg->lcCfgList[lcIdx], true);
2051             }
2052             else if(f1UeDb->duUeCfg.macLcCfg[dbIdx].configType == CONFIG_DEL)
2053             {
2054                /* Free memory at matched  lcIdx index */
2055                freeMacLcCfg(&macUeCfg->lcCfgList[lcIdx]);
2056                macUeCfg->numLcs--;
2057                for(lcDelIdx = lcIdx; lcDelIdx < macUeCfg->numLcs; lcDelIdx++)
2058                {
2059                   /* moving all elements one index ahead */
2060                   ret = fillMacLcCfgToAddMod(NULL,  &macUeCfg->lcCfgList[lcDelIdx+1], &macUeCfg->lcCfgList[lcDelIdx], true);
2061                   freeMacLcCfg(&macUeCfg->lcCfgList[lcDelIdx+1]);
2062                   if(ret == RFAILED)
2063                   {
2064                      DU_LOG("\nERROR  -->  DU APP : Failed to delete LC at Idx %d in duUpdateMacCfg()", lcDelIdx);
2065                      break;
2066                   }
2067                }
2068             }
2069          }
2070       } 
2071       if(f1UeDb->duUeCfg.macLcCfg[dbIdx].configType == CONFIG_ADD)
2072       {
2073          ret = fillMacLcCfgToAddMod(NULL, &f1UeDb->duUeCfg.macLcCfg[dbIdx], &macUeCfg->lcCfgList[numLcs], true);
2074          if(ret == RFAILED)
2075          {
2076             DU_LOG("\nERROR  -->  DU APP : Failed to add LC at Idx %d in duUpdateMacCfg()", numLcs);
2077             break;
2078          }
2079          macUeCfg->numLcs++;
2080       }
2081                 
2082    }
2083    return ret;
2084 }
2085
2086 /******************************************************************
2087  *
2088  * @brief Function to fill the RLC Lc cfg from ueSetupReqDb
2089  *
2090  * @details
2091  *
2092  *    Function : fillRlcCfgToAddMod
2093  *
2094  *    Functionality: Function to fill the RLC Lc cfg from ueSetupReqDb
2095  *
2096  *
2097  *****************************************************************/
2098
2099 uint8_t fillRlcCfgToAddMod(RlcBearerCfg *lcCfg, RlcBearerCfg *f1UeDbLcCfg)
2100 {
2101    lcCfg->configType = f1UeDbLcCfg->configType;
2102    lcCfg->rbId       = f1UeDbLcCfg->rbId;
2103    lcCfg->rbType     = f1UeDbLcCfg->rbType;
2104    lcCfg->lcId       = f1UeDbLcCfg->lcId;
2105    lcCfg->lcType     = f1UeDbLcCfg->lcType;
2106    lcCfg->rlcMode    = f1UeDbLcCfg->rlcMode;
2107    
2108    switch(lcCfg->rlcMode)
2109    {
2110       case RLC_AM :
2111          {
2112             if(!lcCfg->u.amCfg)
2113             {
2114                DU_ALLOC_SHRABL_BUF(lcCfg->u.amCfg, sizeof(AmBearerCfg));
2115                if(!lcCfg->u.amCfg)
2116                   return RFAILED;
2117             }
2118             /* DL AM */
2119             lcCfg->u.amCfg->dlAmCfg.snLenDl     = f1UeDbLcCfg->u.amCfg->dlAmCfg.snLenDl;    
2120             lcCfg->u.amCfg->dlAmCfg.pollRetxTmr = f1UeDbLcCfg->u.amCfg->dlAmCfg.pollRetxTmr;
2121             lcCfg->u.amCfg->dlAmCfg.pollPdu     = f1UeDbLcCfg->u.amCfg->dlAmCfg.pollPdu;
2122             lcCfg->u.amCfg->dlAmCfg.pollByte    = f1UeDbLcCfg->u.amCfg->dlAmCfg.pollByte;   
2123             lcCfg->u.amCfg->dlAmCfg.maxRetxTh   = f1UeDbLcCfg->u.amCfg->dlAmCfg.maxRetxTh;   
2124
2125             /* UL AM */
2126             lcCfg->u.amCfg->ulAmCfg.snLenUl     = f1UeDbLcCfg->u.amCfg->ulAmCfg.snLenUl;
2127             lcCfg->u.amCfg->ulAmCfg.reAssemTmr  = f1UeDbLcCfg->u.amCfg->ulAmCfg.reAssemTmr; 
2128             lcCfg->u.amCfg->ulAmCfg.statProhTmr = f1UeDbLcCfg->u.amCfg->ulAmCfg.statProhTmr;
2129             break;
2130          }
2131       case RLC_UM_BI_DIRECTIONAL :
2132          {
2133             if(!lcCfg->u.umBiDirCfg)
2134             {
2135                DU_ALLOC_SHRABL_BUF(lcCfg->u.umBiDirCfg, sizeof(UmBiDirBearerCfg));
2136                if(!lcCfg->u.umBiDirCfg)
2137                   return RFAILED;
2138             }
2139             /* UL UM BI DIR INFO */
2140             lcCfg->u.umBiDirCfg->ulUmCfg.snLenUlUm  = f1UeDbLcCfg->u.umBiDirCfg->ulUmCfg.snLenUlUm;  
2141             lcCfg->u.umBiDirCfg->ulUmCfg.reAssemTmr = f1UeDbLcCfg->u.umBiDirCfg->ulUmCfg.reAssemTmr;
2142             /* DL UM BI DIR INFO */
2143             lcCfg->u.umBiDirCfg->dlUmCfg.snLenDlUm  = f1UeDbLcCfg->u.umBiDirCfg->dlUmCfg.snLenDlUm;
2144             break;
2145          }
2146       case RLC_UM_UNI_DIRECTIONAL_UL :
2147          {
2148             if(!lcCfg->u.umUniDirUlCfg)
2149             {
2150                DU_ALLOC_SHRABL_BUF(lcCfg->u.umUniDirUlCfg, sizeof(UmUniDirUlBearerCfg));
2151                if(!lcCfg->u.umUniDirUlCfg)
2152                   return RFAILED;
2153             }
2154             lcCfg->u.umUniDirUlCfg->ulUmCfg.snLenUlUm  = f1UeDbLcCfg->u.umUniDirUlCfg->ulUmCfg.snLenUlUm;  
2155             lcCfg->u.umUniDirUlCfg->ulUmCfg.reAssemTmr = f1UeDbLcCfg->u.umUniDirUlCfg->ulUmCfg.reAssemTmr;
2156             break;
2157
2158          }
2159       case RLC_UM_UNI_DIRECTIONAL_DL :
2160          {
2161             if(!lcCfg->u.umUniDirDlCfg)
2162             {
2163                DU_ALLOC_SHRABL_BUF(lcCfg->u.umUniDirDlCfg, sizeof(UmUniDirDlBearerCfg));
2164                if(!lcCfg->u.umUniDirDlCfg)
2165                   return RFAILED;
2166             }
2167             lcCfg->u.umUniDirDlCfg->dlUmCfg.snLenDlUm  = f1UeDbLcCfg->u.umUniDirDlCfg->dlUmCfg.snLenDlUm;
2168             break;
2169          }
2170       default:
2171          DU_LOG("\nERROR  -->  DU_APP: Invalid Rlc Mode %d at fillRlcCfgToAddMod()", lcCfg->rlcMode);
2172          return RFAILED;
2173    }
2174    return ROK;
2175 }
2176
2177 /*******************************************************************
2178  *
2179  * @brief To update DuUeCb Rlc Lc Cfg
2180  *
2181  * @details
2182  *
2183  *    Function : duUpdateRlcLcCfg
2184  *    Functionality:  update DuUeCb Rlc Lc Cfg
2185  *
2186  * @params[in] DuUeCb Pointer
2187  *             F1UeContextSetupDb pointer 
2188  * @return ROK     - success
2189  *         RFAILED - failure
2190  *
2191  * ****************************************************************/
2192
2193 uint8_t duUpdateRlcLcCfg(RlcUeCfg *rlcUeCfg, F1UeContextSetupDb *f1UeDb)
2194 {
2195    uint8_t ret, lcIdx, dbIdx, numLcs, lcDelIdx;
2196
2197    ret = ROK;
2198    for(dbIdx = 0; (dbIdx < f1UeDb->duUeCfg.numRlcLcs && ret ==ROK); dbIdx++)
2199    {
2200       numLcs = rlcUeCfg->numLcs;
2201       for(lcIdx = 0; lcIdx < numLcs; lcIdx++)
2202       {
2203          if(f1UeDb->duUeCfg.rlcLcCfg[dbIdx].lcId == rlcUeCfg->rlcLcCfg[lcIdx].lcId)
2204          {
2205             if(f1UeDb->duUeCfg.rlcLcCfg[dbIdx].configType == CONFIG_MOD)
2206             {
2207                ret = fillRlcCfgToAddMod(&rlcUeCfg->rlcLcCfg[lcIdx], &f1UeDb->duUeCfg.rlcLcCfg[dbIdx]);
2208                if(ret == RFAILED)
2209                {
2210                   DU_LOG("\nERROR  -->  DU APP : Failed to modify LC at Idx %d in duUpdateRlcCfg()", lcDelIdx);
2211                   break;
2212                }
2213                fillSnssaiInfo(NULL, f1UeDb->duUeCfg.rlcLcCfg[dbIdx].snssai, &rlcUeCfg->rlcLcCfg[lcIdx].snssai, true);
2214             }
2215             else if(f1UeDb->duUeCfg.rlcLcCfg[dbIdx].configType == CONFIG_DEL)
2216             {
2217                /* Free memory at matched lcIdx index */
2218                freeRlcLcCfg(&rlcUeCfg->rlcLcCfg[lcIdx]);
2219                rlcUeCfg->numLcs--;
2220                for(lcDelIdx = lcIdx; lcDelIdx < rlcUeCfg->numLcs; lcDelIdx++)
2221                {
2222                   ret = fillRlcCfgToAddMod(&rlcUeCfg->rlcLcCfg[lcDelIdx], &rlcUeCfg->rlcLcCfg[lcDelIdx+1]);
2223                   fillSnssaiInfo(NULL, rlcUeCfg->rlcLcCfg[lcDelIdx+1].snssai, &rlcUeCfg->rlcLcCfg[lcDelIdx].snssai,\
2224                   true);
2225                   freeRlcLcCfg(&rlcUeCfg->rlcLcCfg[lcDelIdx+1]);
2226                   if(ret == RFAILED)
2227                   {
2228                      DU_LOG("\nERROR  -->  DU APP : Failed to delete LC at Idx %d in duUpdateRlcCfg()", lcDelIdx);
2229                      break;
2230                   }
2231                }
2232             }
2233          }
2234       }
2235       if(f1UeDb->duUeCfg.rlcLcCfg[dbIdx].configType == CONFIG_ADD)
2236       {
2237          ret = fillRlcCfgToAddMod(&rlcUeCfg->rlcLcCfg[lcIdx], &f1UeDb->duUeCfg.rlcLcCfg[dbIdx]);
2238          if(ret == ROK)
2239          {    
2240             fillSnssaiInfo(NULL, f1UeDb->duUeCfg.rlcLcCfg[dbIdx].snssai, &rlcUeCfg->rlcLcCfg[ rlcUeCfg->numLcs].snssai,\
2241                   true);
2242             rlcUeCfg->numLcs++;
2243          }
2244       }
2245    }
2246    return ret;
2247 }
2248
2249 /*******************************************************************
2250  *
2251  * @brief Function to fill Tunnel Config to Add/Mod
2252  * 
2253  *
2254  * @details
2255  *
2256  *    Function : fillTnlCfgToAddMod
2257  *
2258  *    Functionality: Function to fill tunnel Config to Add/Mod
2259  *
2260  * @params[in] Pointer to tnlCfgDb,
2261  *             pointer to f1TnlCfg
2262  * @return ROK     - success
2263  *         RFAILED - failure
2264  *
2265  * ****************************************************************/
2266 uint8_t fillTnlCfgToAddMod(UpTnlCfg **ueCbTnlCfg, UpTnlCfg *f1TnlCfg)
2267 {
2268    if(*ueCbTnlCfg)
2269    {
2270       DU_FREE((*ueCbTnlCfg)->tnlCfg1, sizeof(GtpTnlCfg));
2271       DU_FREE(*ueCbTnlCfg, sizeof(UpTnlCfg));
2272    }
2273
2274    if(*ueCbTnlCfg == NULLP)
2275    {
2276       /* copying to DuCb Tnl Cfg */
2277       DU_ALLOC(*ueCbTnlCfg, sizeof(UpTnlCfg));
2278       if(*ueCbTnlCfg == NULLP)
2279       {
2280          DU_LOG("\nERROR  -->  DU_APP : fillTnlCfgToAddMod: Memory Alloc failed for drbId[%d]", f1TnlCfg->drbId);
2281          return RFAILED;
2282       }
2283    }
2284    memset(*ueCbTnlCfg, 0, sizeof(UpTnlCfg));
2285    (*ueCbTnlCfg)->configType = f1TnlCfg->configType;
2286    (*ueCbTnlCfg)->cellId    = f1TnlCfg->cellId;
2287    (*ueCbTnlCfg)->ueId      = f1TnlCfg->ueId;
2288    (*ueCbTnlCfg)->drbId     = f1TnlCfg->drbId;
2289    if(f1TnlCfg->tnlCfg1)
2290    {
2291       if((*ueCbTnlCfg)->tnlCfg1 == NULLP)
2292       {
2293          DU_ALLOC((*ueCbTnlCfg)->tnlCfg1, sizeof(GtpTnlCfg));
2294          if((*ueCbTnlCfg)->tnlCfg1 == NULLP)
2295          {
2296             DU_LOG("\nERROR  -->  DU_APP : fillTnlCfgToAddMod: Memory Alloc failed for tnlCfg1 for drbId[%d]", f1TnlCfg->drbId);
2297             return RFAILED;
2298          }
2299       }
2300       memset((*ueCbTnlCfg)->tnlCfg1, 0, sizeof(GtpTnlCfg));
2301       (*ueCbTnlCfg)->tnlCfg1->teId = f1TnlCfg->tnlCfg1->teId;
2302       (*ueCbTnlCfg)->tnlCfg1->ulTnlAddress = f1TnlCfg->tnlCfg1->ulTnlAddress;
2303       (*ueCbTnlCfg)->tnlCfg1->dlTnlAddress = f1TnlCfg->tnlCfg1->dlTnlAddress;
2304    }
2305    return ROK;
2306 }
2307
2308 /*******************************************************************
2309  *
2310  * @brief Processing the tunnel Request to EGTP
2311  *        
2312  * @details
2313  *
2314  *    Function : duProcEgtpTunnelCfg
2315  *
2316  *    Functionality: Processing the tunnel Request to EGTP
2317  *
2318  * @params[in] UptnlCfg *duTnlCfg, UpTnlCfg *f1TnlCfg 
2319  * @return ROK     - success
2320  *         RFAILED - failure
2321  *
2322  * ****************************************************************/
2323
2324 uint8_t duProcEgtpTunnelCfg(uint8_t ueCbIdx, UpTnlCfg *duTnlCfg, UpTnlCfg *f1TnlCfg)
2325 {
2326    uint8_t ret = RFAILED, delIdx;
2327
2328    if(f1TnlCfg->tnlCfg1 == NULLP)
2329    {
2330       DU_LOG("\nERROR  -->  DU_APP : Tunnel config not found");
2331       return ret;
2332    }
2333
2334    if(f1TnlCfg->configType == CONFIG_ADD)
2335    {
2336       if(duSendEgtpTnlMgmtReq(EGTP_TNL_MGMT_ADD, NULLP, f1TnlCfg->tnlCfg1) == ROK)
2337       {
2338          if(fillTnlCfgToAddMod(&duCb.upTnlCfg[duCb.numTeId], f1TnlCfg) == ROK)
2339          {
2340             duCb.numTeId++;
2341             ret = ROK;
2342          }
2343       }      
2344    }
2345    else if(f1TnlCfg->configType == CONFIG_MOD)
2346    {
2347       if(duSendEgtpTnlMgmtReq(EGTP_TNL_MGMT_MOD, duTnlCfg->tnlCfg1->teId, f1TnlCfg->tnlCfg1) == ROK)
2348       {
2349          if(fillTnlCfgToAddMod(&duTnlCfg, f1TnlCfg) == ROK)
2350          {
2351             ret = ROK;
2352          }
2353       }   
2354    }
2355    else if(f1TnlCfg->configType == CONFIG_DEL)
2356    {
2357       if(duSendEgtpTnlMgmtReq(EGTP_TNL_MGMT_DEL, duTnlCfg->tnlCfg1->teId, f1TnlCfg->tnlCfg1) == ROK)
2358       {    
2359          /* Free memory at drbIdx */
2360          duCb.numTeId--;
2361          for(delIdx = ueCbIdx; delIdx < duCb.numTeId; delIdx++)
2362          {
2363             /* moving all elements one index ahead */
2364             ret = fillTnlCfgToAddMod(&duCb.upTnlCfg[delIdx], duCb.upTnlCfg[delIdx+1]);
2365             if(ret != ROK)
2366             {
2367                return ret;
2368             }
2369          }
2370          if(duCb.upTnlCfg[delIdx])
2371          {
2372             DU_FREE(duCb.upTnlCfg[delIdx]->tnlCfg1, sizeof(GtpTnlCfg));
2373             DU_FREE(duCb.upTnlCfg[delIdx], sizeof(UpTnlCfg));
2374          }
2375       }   
2376    }
2377    return ret;
2378 }
2379
2380 /***********************************************************************
2381  *
2382  * @brief Function to fill Tunnel Config
2383  *        and sends tunnel Req to EGTP
2384  * 
2385  *
2386  * @details
2387  *
2388  *    Function : duUpdateTunnelCfgDb
2389  *
2390  *    Functionality: Function to fill tunnel Config
2391  *                   and sends tunnel Cfg Req to EGTP
2392  *
2393  * @params[in] ueId, cellId, DuUeCfg 
2394  * @return ROK     - success
2395  *         RFAILED - failure
2396  *
2397  * ****************************************************************/
2398
2399 uint8_t duUpdateTunnelCfgDb(uint8_t ueId, uint8_t cellId, DuUeCfg *duUeCfg)
2400 {
2401    uint8_t ret = ROK, drbIdx, teIdx;
2402    bool drbFound = false;
2403
2404    /*If Add/Mod tunnels request for that DRB is successful in EGTP */
2405    /*then update drbId and tunnel Info in duCb */
2406    for(drbIdx=0; drbIdx < duUeCfg->numDrb; drbIdx++)
2407    {
2408       duUeCfg->upTnlInfo[drbIdx].cellId = cellId;
2409       duUeCfg->upTnlInfo[drbIdx].ueId = ueId;
2410       for(teIdx = 0; teIdx < duCb.numTeId; teIdx++)
2411       {
2412          if((duCb.upTnlCfg[teIdx]->ueId == duUeCfg->upTnlInfo[drbIdx].ueId) && \
2413             (duCb.upTnlCfg[teIdx]->drbId == duUeCfg->upTnlInfo[drbIdx].drbId))
2414          {
2415             drbFound = true; /* existing DRB */
2416             if(duProcEgtpTunnelCfg(teIdx, duCb.upTnlCfg[teIdx], &duUeCfg->upTnlInfo[drbIdx]) != ROK)
2417             {
2418                DU_LOG("\nERROR  -> DU_APP : duUpdateTunnelCfgDb: Failed to modify tunnel req for Drb id[%d]",
2419                      duUeCfg->upTnlInfo[drbIdx].drbId);
2420                ret = RFAILED;
2421             }
2422             break;
2423          }
2424          else
2425             drbFound = false;
2426       }
2427
2428       if(!drbFound && ret == ROK)/* new DRB to Add */
2429       {
2430          if(duProcEgtpTunnelCfg(NULLP, NULLP, &duUeCfg->upTnlInfo[drbIdx]) != ROK)
2431          {
2432             DU_LOG("\nERROR  -> DU_APP : duUpdateTunnelCfgDb: Failed to add tunnel req for Drb id[%d]",
2433                   duUeCfg->upTnlInfo[drbIdx].drbId);
2434             ret = RFAILED;
2435             break;
2436          }
2437       }
2438       else
2439          break;
2440    }
2441    return ret;
2442 }
2443
2444 /*******************************************************************
2445  *
2446  * @brief @brief To update DuUeCb Mac and Rlc Ue Cfg
2447  * 
2448  *
2449  * @details
2450  *
2451  *    Function : duUpdateDuUeCbCfg
2452  *
2453  *    Functionality: update DuUeCb Mac and Rlc Ue Cfg
2454  *
2455  * @params[in] ueId, cellIdx 
2456  * @return ROK     - success
2457  *         RFAILED - failure
2458  *
2459  * ****************************************************************/
2460
2461 uint8_t duUpdateDuUeCbCfg(uint8_t ueId, uint8_t cellId)
2462 {
2463    uint8_t ret = ROK, cellIdx = 0, crnti=0;
2464    DuUeCb *ueCb = NULLP;
2465
2466    GET_CELL_IDX(cellId, cellIdx);
2467    ueCb = &duCb.actvCellLst[cellIdx]->ueCb[ueId-1];
2468
2469    /*Filling RLC Ue Cfg */
2470    ueCb->rlcUeCfg.cellId = cellId;
2471    ueCb->rlcUeCfg.ueId   = ueId;
2472    ret = duUpdateRlcLcCfg(&ueCb->rlcUeCfg, ueCb->f1UeDb);
2473    if(ret == ROK)
2474    {
2475       /*Filling MAC Ue Cfg */
2476       GET_CRNTI(crnti, ueId);
2477       ueCb->macUeCfg.cellId = cellId;
2478       ueCb->macUeCfg.ueId  = ueId;
2479       ueCb->macUeCfg.crnti  = crnti;
2480       ret = duUpdateMacCfg(&ueCb->macUeCfg, ueCb->f1UeDb);
2481       if(ret == RFAILED)
2482          DU_LOG("\nERROR  -->  DU APP : Failed while updating MAC LC Config at duUpdateDuUeCbCfg()");
2483       else
2484       {
2485          if(duUpdateTunnelCfgDb(ueId, cellId, &ueCb->f1UeDb->duUeCfg) != ROK)
2486          {
2487             DU_LOG("\nERROR  -->  DU_APP : Failed to establish tunnel in duUpdateDuUeCbCfg()");
2488             return RFAILED;
2489          }
2490       }
2491    }
2492    else
2493       DU_LOG("\nERROR  -->  DU APP : Failed while updating RLC LC Config at duUpdateDuUeCbCfg()");
2494    return ret;
2495 }
2496
2497 /*******************************************************************
2498  *
2499  * @brief Handle UE config response from MAC
2500  *
2501  * @details
2502  *
2503  *    Function : DuProcMacUeCfgRsp
2504  *
2505  *    Functionality: Handle UE Config response from MAC
2506  *
2507  * @params[in] Pointer to MacUeCfgRsp and Pst 
2508  * @return ROK     - success
2509  *         RFAILED - failure
2510  *
2511  * ****************************************************************/
2512 uint8_t DuProcMacUeCfgRsp(Pst *pst, MacUeCfgRsp *cfgRsp)
2513 {
2514    uint8_t ret = ROK;
2515    uint16_t cellIdx;
2516
2517    if(cfgRsp)
2518    {
2519       GET_CELL_IDX(cfgRsp->cellId, cellIdx);
2520       if(cfgRsp->result == MAC_DU_APP_RSP_OK)
2521       {
2522          if(pst->event == EVENT_MAC_UE_CREATE_RSP)
2523          {
2524             DU_LOG("\nINFO   -->  DU APP : MAC UE Create Response : SUCCESS [DU UE F1AP ID : %d]", cfgRsp->ueId);
2525
2526             if(duCb.actvCellLst[cellIdx] && (duCb.actvCellLst[cellIdx]->ueCb[cfgRsp->ueId -1].gnbDuUeF1apId == cfgRsp->ueId))
2527             {
2528                duCb.actvCellLst[cellIdx]->ueCb[cfgRsp->ueId -1].macUeCfg.macUeCfgState = UE_CREATE_COMPLETE;
2529
2530               if((duCb.actvCellLst[cfgRsp->cellId -1]->ueCb[cfgRsp->ueId -1].ueState == UE_HANDIN_IN_PROGRESS) && 
2531                     (duCb.actvCellLst[cfgRsp->cellId -1]->ueCb[cfgRsp->ueId -1].macUeCfg.macUeCfgState == UE_CREATE_COMPLETE) &&
2532                      (duCb.actvCellLst[cfgRsp->cellId -1]->ueCb[cfgRsp->ueId -1].rlcUeCfg.rlcUeCfgState == UE_CREATE_COMPLETE))
2533                {
2534                   if((ret = duUpdateDuUeCbCfg(cfgRsp->ueId, cfgRsp->cellId)) == ROK)
2535                   {
2536                      /* If UE is in handover, RACH resource needs to be requested
2537                       * from MAC for CFRA */
2538                      if((duBuildAndSendRachRsrcReqToMac(cfgRsp->cellId, cfgRsp->ueId)) != ROK)
2539                      {
2540                         DU_LOG("\nERROR  --> DU APP : Failed to send RACH Resource Request to MAC");
2541                         DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL, cfgRsp, sizeof(MacUeCfgRsp));
2542                         return RFAILED;
2543                      }
2544                   }
2545                   else
2546                   {
2547                      DU_LOG("\nERROR  ->  DU APP : Failure in updating DU UE CB");
2548                      DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL, cfgRsp, sizeof(MacUeCfgRsp));
2549                      return RFAILED;
2550                   }
2551                }
2552             }
2553          }
2554          else if(pst->event == EVENT_MAC_UE_RECONFIG_RSP)
2555          {
2556             DU_LOG("\nINFO   -->  DU APP : MAC UE Reconfig Response : SUCCESS [DU UE F1AP ID : %d]", cfgRsp->ueId);
2557             if(duCb.actvCellLst[cellIdx] && 
2558                   (duCb.actvCellLst[cellIdx]->ueCb[cfgRsp->ueId -1].gnbDuUeF1apId == cfgRsp->ueId))
2559             {
2560                duCb.actvCellLst[cellIdx]->ueCb[cfgRsp->ueId -1].macUeCfg.macUeCfgState = UE_RECFG_COMPLETE;
2561                if((duCb.actvCellLst[cellIdx]->ueCb[cfgRsp->ueId -1].macUeCfg.macUeCfgState == UE_RECFG_COMPLETE) &&
2562                      (duCb.actvCellLst[cfgRsp->cellId -1]->ueCb[cfgRsp->ueId -1].rlcUeCfg.rlcUeCfgState == UE_RECFG_COMPLETE))
2563                {
2564                   if((ret = duUpdateDuUeCbCfg(cfgRsp->ueId, cfgRsp->cellId)) == ROK)
2565                   {  
2566                      if((BuildAndSendUeCtxtRsp(cfgRsp->cellId, cfgRsp->ueId)) != ROK)
2567                      {
2568                         DU_LOG("\nERROR  ->  DU APP : Failure in BuildAndSendUeCtxtRsp()");
2569                         DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL, cfgRsp, sizeof(MacUeCfgRsp));
2570                         return RFAILED;
2571                      }
2572                   }
2573                   else
2574                   {
2575                      DU_LOG("\nERROR  ->  DU APP : Failure in updating DU UE CB");
2576                      DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL, cfgRsp, sizeof(MacUeCfgRsp));
2577                      return RFAILED;
2578                   }
2579                }
2580             }
2581          }
2582       }
2583       else
2584       {
2585          DU_LOG("\nERROR  -->  DU APP : MAC UE CFG Response for EVENT[%d]: FAILURE [DU UE F1AP ID : %d]", pst->event, cfgRsp->ueId);
2586          if(pst->event == EVENT_MAC_UE_RECONFIG_RSP)
2587          {
2588             //TODO: Send the failure case in Ue Context Setup Response
2589          }
2590          ret = RFAILED;
2591       }
2592       DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL, cfgRsp, sizeof(MacUeCfgRsp));
2593    }
2594    else
2595    {
2596       DU_LOG("\nERROR  -->  DU APP : Received MAC Ue Config Response is NULL at DuProcMacUeCfgRsp()");
2597       ret = RFAILED;
2598    }
2599    return ret;
2600 }
2601
2602
2603 /*******************************************************************
2604  *
2605  * @brief Processes UE create Req to RLC UL
2606  *
2607  * @details
2608  *
2609  *    Function : duBuildAndSendUeCreateReqToRlc
2610  *
2611  *    Functionality: 
2612  *     Processes UE create Req to RLC UL
2613  * 
2614  *  @params[in]  cellId,
2615  *               ueId,
2616  *               Pointer to RlcUeCfg
2617  *  @return ROK     - success
2618  *          RFAILED - failure
2619  * 
2620  *****************************************************************/
2621
2622 uint8_t duBuildAndSendUeCreateReqToRlc(uint16_t cellId, uint8_t gnbDuUeF1apId, DuUeCfg *ueCfgDb, RlcUeCfg *duRlcUeCfg)
2623 {
2624    uint8_t  ret = ROK;
2625    RlcUeCfg *rlcUeCfg = NULLP;
2626    Pst       pst;
2627   
2628    ret = fillRlcUeCfg(cellId, gnbDuUeF1apId, ueCfgDb, duRlcUeCfg);
2629    if(ret == RFAILED)
2630    {
2631       DU_LOG("\nERROR  -->  DU APP : Failed to fill Rlc Ue Cfg at duBuildAndSendUeCreateReqToRlc()");
2632       return ret;
2633    }
2634
2635    FILL_PST_DUAPP_TO_RLC(pst, RLC_UL_INST, EVENT_RLC_UE_CREATE_REQ);
2636    /* Copying ueCfg to a sharable buffer */
2637    DU_ALLOC_SHRABL_BUF(rlcUeCfg, sizeof(RlcUeCfg));
2638    if(rlcUeCfg)
2639    {
2640       memset(rlcUeCfg, 0, sizeof(RlcUeCfg));
2641       memcpy(rlcUeCfg, duRlcUeCfg, sizeof(RlcUeCfg));
2642       /* Processing one Ue at a time to RLC */
2643       DU_LOG("\nDEBUG   -->  DU_APP: Sending UE create request to RLC UL");
2644       ret = (*packRlcUeCreateReqOpts[pst.selector])(&pst, rlcUeCfg);
2645       if(ret == RFAILED)
2646       {
2647          DU_LOG("\nERROR  -->  DU_APP : Failure in sending Ue Create Req to RLC");
2648          DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL, rlcUeCfg, sizeof(RlcUeCfg));
2649          ret = RFAILED;
2650       }
2651    }
2652    else
2653    {
2654       DU_LOG("\n ERROR  -->  DU APP : Memory alloc failed at duBuildAndSendUeCreateReqToRlc()");
2655       ret = RFAILED;
2656    }
2657    return ret;
2658 }
2659
2660 /*******************************************************************
2661  *
2662  * @brief Processes UE create Rsp received from RLC UL
2663  *
2664  * @details
2665  *
2666  
2667  *    Function : DuProcRlcUeCfgRsp
2668  *
2669  *    Functionality: 
2670  *     Processes UE create Rsp received from RLC UL
2671  * 
2672  *  @params[in]  Post structure
2673  *               Pointer to RlcCfgCfm
2674  *  @return ROK     - success
2675  *          RFAILED - failure
2676  * 
2677  *****************************************************************/
2678 uint8_t DuProcRlcUeCfgRsp(Pst *pst, RlcUeCfgRsp *cfgRsp)
2679 {
2680    uint8_t ret = ROK;
2681
2682    if(cfgRsp)
2683    {
2684       if(cfgRsp->result == RLC_DU_APP_RSP_OK)
2685       {
2686          if(pst->event == EVENT_RLC_UE_CREATE_RSP)
2687          {
2688             DU_LOG("\nINFO   -->  DU_APP: RLC UE Create Response : SUCCESS [UE IDX:%d]", cfgRsp->ueId);
2689             duCb.actvCellLst[cfgRsp->cellId -1]->ueCb[cfgRsp->ueId -1].rlcUeCfg.rlcUeCfgState = UE_CREATE_COMPLETE;
2690
2691             if((duCb.actvCellLst[cfgRsp->cellId -1]->ueCb[cfgRsp->ueId -1].ueState == UE_HANDIN_IN_PROGRESS) &&
2692                   (duCb.actvCellLst[cfgRsp->cellId -1]->ueCb[cfgRsp->ueId -1].macUeCfg.macUeCfgState == UE_CREATE_COMPLETE) &&
2693                   (duCb.actvCellLst[cfgRsp->cellId -1]->ueCb[cfgRsp->ueId -1].rlcUeCfg.rlcUeCfgState == UE_CREATE_COMPLETE))
2694             {
2695                if((ret = duUpdateDuUeCbCfg(cfgRsp->ueId, cfgRsp->cellId)) == ROK)
2696                {
2697                   /* If UE is in handover, RACH resource needs to be requested
2698                    * from MAC for CFRA */
2699                   if((duBuildAndSendRachRsrcReqToMac(cfgRsp->cellId, cfgRsp->ueId)) != ROK)
2700                   {
2701                      DU_LOG("\nERROR  --> DU APP : Failed to send RACH Resource Request to MAC");
2702                      DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL, cfgRsp, sizeof(MacUeCfgRsp));
2703                      DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL, cfgRsp, sizeof(RlcUeCfgRsp));
2704                      return RFAILED;
2705                   }
2706                }
2707                else
2708                {
2709                   DU_LOG("\nERROR  -->  DU APP : Failure in updating DU UE CB");
2710                   DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL, cfgRsp, sizeof(RlcUeCfgRsp));
2711                   return RFAILED;
2712                }
2713             }
2714          }
2715          else if(pst->event == EVENT_RLC_UE_RECONFIG_RSP)
2716          {
2717             DU_LOG("\nINFO   -->  DU_APP: RLC UE Reconfig Response : SUCCESS [UE IDX:%d]", cfgRsp->ueId);
2718
2719             duCb.actvCellLst[cfgRsp->cellId -1]->ueCb[cfgRsp->ueId -1].rlcUeCfg.rlcUeCfgState = UE_RECFG_COMPLETE;
2720             if((duCb.actvCellLst[cfgRsp->cellId -1]->ueCb[cfgRsp->ueId -1].macUeCfg.macUeCfgState == UE_RECFG_COMPLETE) &&
2721                   (duCb.actvCellLst[cfgRsp->cellId -1]->ueCb[cfgRsp->ueId -1].rlcUeCfg.rlcUeCfgState == UE_RECFG_COMPLETE))
2722             {
2723                if((ret = duUpdateDuUeCbCfg(cfgRsp->ueId, cfgRsp->cellId)) == ROK)
2724                {
2725                   if((BuildAndSendUeCtxtRsp(cfgRsp->cellId, cfgRsp->ueId)) != ROK)
2726                   {
2727                      DU_LOG("\nERROR  -->  DU APP : Failure in BuildAndSendUeCtxtRsp");
2728                      DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL, cfgRsp, sizeof(RlcUeCfgRsp));
2729                      return RFAILED;
2730                   }
2731                }
2732                else
2733                {
2734                   DU_LOG("\nERROR  -->  DU APP : Failure in updating DU UE CB");
2735                   DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL, cfgRsp, sizeof(RlcUeCfgRsp));
2736                   return RFAILED;
2737                }
2738             }
2739          }
2740       }
2741       else
2742       {
2743          DU_LOG("\nERROR  -->  DU_APP: RLC UE CFG Response for EVENT[%d] : FAILED [UE IDX : %d, REASON :%d]",\
2744                pst->event, cfgRsp->ueId, cfgRsp->reason);
2745          if((pst->event == EVENT_RLC_UE_RECONFIG_RSP))
2746          {
2747             //TODO: update failure case in ue Context setup Response
2748          }
2749          ret = RFAILED;
2750       }
2751       DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL, cfgRsp, sizeof(RlcUeCfgRsp));
2752    }
2753    else
2754    {
2755       DU_LOG("\nERROR  -->  DU_APP: Received RLC Ue Config Response is NULL at DuProcRlcUeCfgRsp()");
2756       ret = RFAILED;
2757    }
2758    return ret;
2759 }
2760
2761 /*******************************************************************
2762  *
2763  * @brief Builds and Send Ue Reconfig Req to RLC
2764  *
2765  * @details
2766  *
2767  *    Function : duBuildAndSendUeReCfgReqToRLC
2768  *
2769  *    Functionality: Builds and Send Ue Reconfig Req to RLC
2770  *
2771  * @params[in] cellId, crnti
2772  *             DuUeCfg *ueCfgDb
2773  *             RlcUeCfg *rlcUeCfg
2774  * @return ROK     - success
2775  *         RFAILED - failure
2776  *
2777  * ****************************************************************/
2778
2779 uint8_t duBuildAndSendUeReCfgReqToRlc(uint8_t cellId, uint8_t gnbDuUeF1apId, uint8_t crnti, DuUeCfg *ueCfgDb)
2780 {
2781    uint8_t ret = ROK;
2782    RlcUeCfg *rlcUeCfg = NULLP;
2783
2784    DU_ALLOC_SHRABL_BUF(rlcUeCfg, sizeof(RlcUeCfg));
2785    if(rlcUeCfg)
2786    {
2787       memset(rlcUeCfg, 0, sizeof(RlcUeCfg));
2788       ret = fillRlcUeCfg(cellId, gnbDuUeF1apId, ueCfgDb, rlcUeCfg);
2789       if(ret == RFAILED)
2790          DU_LOG("\nERROR  -->  DU APP : Failed at duBuildAndSendUeReCfgReqToRlc()");
2791       else
2792          ret = sendUeReCfgReqToRlc(rlcUeCfg);
2793    }
2794    else
2795    {
2796       DU_LOG("\nERROR  -->  DU APP : Memory Alloc failed at duBuildAndSendUeReCfgReqToRlc()");
2797       ret = RFAILED;
2798    }
2799    return ret;
2800 }
2801
2802 /*******************************************************************
2803  *
2804  * @brief Builds and Send Ue Reconfig Req to MAC
2805  *
2806  * @details
2807  *
2808  *    Function : duBuildAndSendUeReCfgReqToMac
2809  *
2810  *    Functionality: Builds and Send Ue Reconfig Req to MAC
2811  *
2812  * @params[in] CellGroupConfigRrc_t *macCellGrpCfg
2813  *             DuUeCfg *ueCfgDb
2814  *             MacUeCfg    *macUeCfg
2815  * @return ROK     - success
2816  *         RFAILED - failure
2817  *
2818  * ****************************************************************/
2819
2820 uint8_t duBuildAndSendUeReCfgReqToMac(uint8_t cellId, uint8_t duUeF1apId, uint8_t crnti, DuUeCfg *ueCfgDb)
2821 {
2822    uint8_t ret = ROK;
2823    MacUeCfg *macUeCfg = NULLP;
2824
2825    DU_ALLOC_SHRABL_BUF(macUeCfg, sizeof(MacUeCfg));
2826    if(macUeCfg)
2827    {
2828       memset(macUeCfg, 0, sizeof(MacUeCfg));
2829       ret = fillMacUeCfg(cellId, duUeF1apId, crnti, ueCfgDb, macUeCfg);
2830       if(ret == RFAILED)
2831          DU_LOG("\nERROR  -->  DU APP : Failed to fill Mac Ue Cfg at duBuildAndSendUeReCfgReqToMac()");
2832       else
2833          ret = sendUeReCfgReqToMac(macUeCfg);
2834    }
2835    else
2836    {
2837       DU_LOG("\nERROR  -->  DU APP : Memory alloc failed for macUeCfg at duBuildAndSendUeReCfgReqToMac()");
2838       ret = RFAILED;
2839    }
2840    return ret;
2841 }
2842
2843 /*******************************************************************
2844  *
2845  * @brief Build and Send Ue context setup request
2846  *
2847  * @details
2848  *
2849  
2850  *    Function : duBuildAndSendUeContextSetupReq
2851  *
2852  *    Functionality: 
2853  *     Build and Send Ue context setup request
2854  * 
2855  *  @params[in]  cellId, crnti, DuUeCfg pointer
2856  *  @return ROK     - success
2857  *          RFAILED - failure
2858  * 
2859  *****************************************************************/
2860
2861 uint8_t duBuildAndSendUeContextSetupReq(uint16_t cellId, DuUeCb *ueCb)
2862 {
2863    uint8_t ret = ROK;
2864    uint16_t crnti; 
2865    DuUeCfg *duUeCfg = NULLP;
2866
2867    DU_LOG("\nDEBUG   -->  DU_APP: Processing Ue Context Setup Request for cellId [%d]", cellId);
2868
2869    if(!ueCb)
2870    {
2871       DU_LOG("\nERROR  -->  DU APP : UE Cb is NULL");
2872       return RFAILED;
2873    }
2874
2875    crnti = ueCb->crnti;
2876    duUeCfg = &ueCb->f1UeDb->duUeCfg;
2877
2878    /* If UE is being handed-in to this DU, UE context setup request will create
2879     * new UE context at MAC/SCH and RLC.
2880     * If UE is in active state, UE contex setup request will lead to
2881     * reconfiguration of UE at MAC/SCH and RLC
2882     */
2883    if(ueCb->ueState == UE_HANDIN_IN_PROGRESS)
2884    {
2885       /* Filling MAC UE Config */
2886       memset(&ueCb->macUeCfg, 0, sizeof(MacUeCfg));
2887
2888       /* Since UE attach has not yet happened, crnti is unknow. Hence passing 0 */
2889       ret = duBuildAndSendUeCreateReqToMac(cellId, ueCb->gnbDuUeF1apId, 0, duUeCfg, &ueCb->macUeCfg);
2890       if(ret == RFAILED)
2891          DU_LOG("\nERROR  -->  DU APP : Failed to send UE create request to MAC");
2892
2893       ret = duBuildAndSendUeCreateReqToRlc(cellId, ueCb->gnbDuUeF1apId, duUeCfg, &ueCb->rlcUeCfg);
2894       if(ret == RFAILED)
2895          DU_LOG("\nERROR  --> DU APP : Failed to send UE create request to RLC");
2896
2897    }
2898    else
2899    {
2900       /* Filling RLC UE Reconfig */ 
2901       ret = duBuildAndSendUeReCfgReqToRlc(cellId, ueCb->gnbDuUeF1apId, crnti, duUeCfg);
2902       if(ret == RFAILED)
2903          DU_LOG("\nERROR  -->  DU APP : Failed to build ctxt setup req for RLC at duBuildAndSendUeContextSetupReq()");
2904
2905       /* Filling MAC UE Reconfig */
2906       ret = duBuildAndSendUeReCfgReqToMac(cellId, ueCb->gnbDuUeF1apId, crnti, duUeCfg);
2907       if(ret == RFAILED)
2908          DU_LOG("\nERROR  -->  DU APP : Failed at build ctxt setup req for MAC at duBuildAndSendUeContextSetupReq()");
2909    }
2910
2911    return ret;
2912 }
2913
2914 /*******************************************************************
2915  *
2916  * @brief Processes DL Rsp received from RLC DL
2917  *
2918  * @details
2919  *
2920  
2921  *    Function : DuProcRlcDlRrcMsgRsp
2922  *
2923  *    Functionality: 
2924  *     Processes UE Rsp received from RLC DL
2925  * 
2926  *  @params[in]  Post structure
2927  *               Pointer to RlcCfgCfm
2928  *  @return ROK     - success
2929  *          RFAILED - failure
2930  * 
2931  *****************************************************************/
2932 uint8_t DuProcRlcDlRrcMsgRsp(Pst *pst, RlcDlRrcMsgRsp *dlRrcMsg)
2933 {
2934    uint8_t ret = ROK, ueId = 0;
2935    uint16_t cellId, crnti;
2936    DuUeCb *ueCb = NULLP;
2937    DlMsgState state;
2938
2939    state = dlRrcMsg->state;
2940    cellId = dlRrcMsg->cellId;
2941    crnti = dlRrcMsg->crnti;
2942    DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL, dlRrcMsg, sizeof(RlcDlRrcMsgRsp));
2943
2944    if(state == TRANSMISSION_COMPLETE)
2945    {
2946       GET_UE_ID(crnti, ueId);
2947       ueCb = &duCb.actvCellLst[cellId -1]->ueCb[ueId -1];
2948
2949       if(ueCb->f1UeDb && ueCb->f1UeDb->dlRrcMsgPres)
2950       {
2951          if(ueCb->f1UeDb->actionType == UE_CTXT_SETUP)
2952          {
2953             ret = duBuildAndSendUeContextSetupReq(cellId, ueCb);
2954             if(ret == RFAILED)
2955                DU_LOG("\nERROR  -->  DU APP : Failed to process UE Context Setup Request in DuProcRlcDlRrcMsgRsp()");
2956          }
2957          
2958          if(ueCb->f1UeDb->actionType == UE_CTXT_MOD)
2959          {
2960             ret = duBuildAndSendUeContextModReq(cellId, ueCb->gnbDuUeF1apId, crnti, &ueCb->f1UeDb->duUeCfg);
2961             if(ret == RFAILED)
2962                DU_LOG("\nERROR  -->  DU APP : Failed to process UE Context Mod Request in DuProcRlcDlRrcMsgRsp()");
2963          }
2964
2965          if(ueCb->f1UeDb->actionType == UE_CTXT_RELEASE && ueCb->ueState == UE_ACTIVE)
2966          {
2967             ret = duBuildAndSendUeDeleteReq(cellId, crnti);
2968             if(ret == RFAILED)
2969             {
2970                DU_LOG("\nERROR  -->  DU APP : Failed to process UE Context Release Request in DuProcRlcDlRrcMsgRsp()");
2971             }
2972          }
2973       }
2974    }
2975    else
2976       DU_LOG("\nERROR  -->  DU APP : Failed to transmit DL RRC Msg");
2977
2978    return ret;
2979 }
2980 /*******************************************************************
2981  *
2982  * @brief Process UE context setup request from CU
2983  *
2984  * @details
2985  *
2986  *    Function : duProcUeContextSetupRequest 
2987  *
2988  *    Functionality: Process UE context setup request from CU
2989  *
2990  * @params[in] F1AP message
2991  * @return ROK     - success
2992  *         RFAILED - failure
2993  *
2994  * ****************************************************************/
2995
2996 uint8_t duProcUeContextSetupRequest(DuUeCb *ueCb)
2997 {
2998    uint8_t ret, cellId;
2999
3000    ret = ROK;
3001    if(ueCb)
3002    {
3003       cellId = duCb.actvCellLst[ueCb->f1UeDb->cellIdx]->cellId;
3004
3005       /* Send DL RRC msg for security Mode */
3006       if(ueCb->f1UeDb->dlRrcMsg)
3007       {
3008          if(ueCb->f1UeDb->dlRrcMsg->rrcMsgPdu)
3009          {
3010             /* Sending DL RRC Message to RLC */
3011             ret = duBuildAndSendDlRrcMsgToRlc(cellId, ueCb->rlcUeCfg, ueCb->f1UeDb->dlRrcMsg);
3012             if(ret == RFAILED)
3013             {
3014                DU_LOG("\nERROR  -->  DU APP : Failed to send DL RRC msg in duProcUeContextSetupRequest()");
3015                DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL, ueCb->f1UeDb->dlRrcMsg->rrcMsgPdu,\
3016                      ueCb->f1UeDb->dlRrcMsg->rrcMsgSize);
3017                DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL, ueCb->f1UeDb->dlRrcMsg, sizeof(F1DlRrcMsg));
3018             }
3019          }
3020       }
3021       else if(ueCb->f1UeDb->actionType == UE_CTXT_SETUP)
3022       {
3023          ret = duBuildAndSendUeContextSetupReq(cellId, ueCb);
3024          if(ret == RFAILED)
3025          {
3026             DU_LOG("\nERROR  -->  DU APP : Failed to build ue context setup Req in duProcUeContextSetupRequest()");
3027          }
3028       }
3029    }
3030    else
3031    {
3032       //TODO: To send the failure cause in UeContextSetupRsp
3033       DU_LOG("ERROR  -->  DU APP : Failed to process UE CNTXT SETUP REQ at duProcUeContextSetupRequest()");
3034    }
3035    return ret;
3036 }
3037
3038 /*******************************************************************
3039  *
3040  * @brief Build and Send Ue context mod request
3041  *
3042  * @details
3043  *
3044  *
3045  *    Function : duBuildAndSendUeContextModReq
3046  *
3047  *    Functionality: 
3048  *     Build and Send Ue context mod request
3049  * 
3050  *  @params[in]  cellId, crnti, DuUeCfg pointer
3051  *  @return ROK     - success
3052  *          RFAILED - failure
3053  * 
3054  *****************************************************************/
3055
3056 uint8_t duBuildAndSendUeContextModReq(uint16_t cellId, uint8_t gnbDuUeF1apId, uint16_t crnti, DuUeCfg *duUeCfg)
3057 {
3058    uint8_t ret = ROK;
3059
3060    DU_LOG("\nDEBUG   -->  DU_APP: Processing Ue Context Mod Request for cellId [%d]", cellId);
3061    /* Filling RLC Ue Reconfig */ 
3062    ret = duBuildAndSendUeReCfgReqToRlc(cellId, gnbDuUeF1apId, crnti, duUeCfg);
3063    if(ret == RFAILED)
3064       DU_LOG("\nERROR  -->  DU APP : Failed to build ctxt setup req for RLC at duBuildAndSendUeContextModReq()");
3065    
3066    /* Filling MAC Ue Reconfig */
3067    ret = duBuildAndSendUeReCfgReqToMac(cellId, gnbDuUeF1apId, crnti, duUeCfg);
3068    if(ret == RFAILED)
3069       DU_LOG("\nERROR  -->  DU APP : Failed at build ctxt setup req for MAC at duBuildAndSendUeContextModReq()");
3070
3071    return ret;
3072 }
3073 /*******************************************************************
3074  *
3075  * @brief Processing Ue context mod request
3076  *
3077  * @details
3078  *
3079  *
3080  *    Function : duProcUeContextModReq 
3081  *
3082  *    Functionality:
3083  *        Processing  Ue context mod request
3084  *
3085  *  @params[in] DuUeCb *ueCb 
3086  *  @return ROK     - success
3087  *          RFAILED - failure
3088  *
3089  *****************************************************************/
3090
3091 uint8_t duProcUeContextModReq(DuUeCb *ueCb)
3092 {
3093    uint8_t ret, cellId;
3094
3095    ret = ROK;
3096    if(ueCb)
3097    {
3098       cellId = duCb.actvCellLst[ueCb->f1UeDb->cellIdx]->cellId;
3099       /* Send DL RRC msg for security Mode */
3100       if(ueCb->f1UeDb->dlRrcMsg)
3101       {
3102          if(ueCb->f1UeDb->dlRrcMsg->rrcMsgPdu)
3103          {
3104             /* Sending DL RRC Message to RLC */
3105             ret = duBuildAndSendDlRrcMsgToRlc(cellId, ueCb->rlcUeCfg, ueCb->f1UeDb->dlRrcMsg);
3106             if(ret == RFAILED)
3107             {
3108                DU_LOG("\nERROR  -->  DU APP : Failed to send DL RRC msg in duProcUeContextModReq()");
3109                DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL, ueCb->f1UeDb->dlRrcMsg->rrcMsgPdu,\
3110                      ueCb->f1UeDb->dlRrcMsg->rrcMsgSize);
3111                DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL, ueCb->f1UeDb->dlRrcMsg, sizeof(F1DlRrcMsg));
3112             }
3113          }
3114       }
3115       else if(ueCb->f1UeDb->actionType == UE_CTXT_MOD)
3116       {
3117          ret = duBuildAndSendUeContextModReq(cellId, ueCb->gnbDuUeF1apId, ueCb->crnti, &ueCb->f1UeDb->duUeCfg);
3118          if(ret == RFAILED)
3119          {
3120             DU_LOG("\nERROR  -->  DU APP : Failed to build ue context setup Req in duProcUeContextModReq()");
3121             return RFAILED;
3122          }
3123       }
3124       else if((ueCb->f1UeDb->actionType == UE_CTXT_CFG_QUERY) || (ueCb->f1UeDb->actionType == UE_CTXT_RRC_RECFG_COMPLETE))
3125       {
3126          if((BuildAndSendUeContextModRsp(ueCb) != ROK))
3127          {
3128             DU_LOG("\nERROR  -->  DU APP : Failed to build UE Context modification response");
3129             return RFAILED;
3130          }
3131       }
3132    }
3133    else
3134    {
3135       //TODO: To send the failure cause in UeContextModRsp
3136       
3137       DU_LOG("ERROR  -->  DU APP : Failed to process UE CNTXT MOD REQ at duProcUeContextModReq()");
3138       return RFAILED;
3139    }
3140    return ROK;
3141 }
3142
3143 /*******************************************************************
3144 *
3145 * @brief Build and send dedicated RACH resource release request to MAC
3146 *
3147 * @details
3148 *
3149 *    Function : duBuildAndSendRachRsrcRelToMac
3150 *
3151 *    Functionality: Function to Build and send dedicated RACH resource 
3152 *    release request to MAC
3153 *
3154 * @params[in] Cell ID
3155 *             UE CB
3156 * @return ROK - Success
3157 *         RFAILED - Failure
3158 *
3159 * ****************************************************************/
3160 uint8_t duBuildAndSendRachRsrcRelToMac(uint16_t cellId, DuUeCb *ueCb)
3161 {
3162    Pst pst;
3163    MacRachRsrcRel *rachRsrcRel = NULLP;
3164
3165    DU_ALLOC_SHRABL_BUF(rachRsrcRel, sizeof(MacRachRsrcRel));
3166    if(!rachRsrcRel)
3167    {
3168       DU_LOG("\nERROR  -->  DU APP : Failed to allocate memory for RACH Resource Release in \
3169             duBuildAndSendRachRsrcRelToMac()");
3170       return RFAILED;
3171    }
3172
3173    rachRsrcRel->cellId = cellId;
3174    rachRsrcRel->ueId = ueCb->gnbDuUeF1apId;
3175    rachRsrcRel->crnti = ueCb->crnti;
3176
3177    /* Fill Pst */
3178    FILL_PST_DUAPP_TO_MAC(pst, EVENT_MAC_RACH_RESOURCE_REL);
3179
3180    if(((*packMacRachRsrcRelOpts[pst.selector])(&pst, rachRsrcRel)) != ROK)
3181    {
3182       DU_LOG("\nERROR  -->  DU_APP : Failure in sending RACH Resource Release to MAC at \
3183             duBuildAndSendRachRsrcRelToMac()");
3184       DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL, rachRsrcRel, sizeof(MacRachRsrcRel));
3185       return RFAILED;
3186    }
3187
3188    return ROK;
3189 }
3190
3191 /*******************************************************************
3192  *
3193 * @brief delete MacUeCfg from duCb
3194 *
3195 * @details
3196 *
3197 *    Function : deleteMacUeCfg 
3198 *
3199 *    Functionality: delete MacUeCfg from duCb
3200 *
3201 * @params[in] Pointer to MacUeCfg 
3202 * @return ROK     - success
3203 *         RFAILED - failure
3204 *
3205 *******************************************************************/
3206
3207 void deleteMacUeCfg(MacUeCfg *ueCfg)
3208 {
3209    uint8_t lcCfgIdx=0;
3210    
3211    DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL,ueCfg->ambrCfg, sizeof(AmbrCfg));
3212    if(ueCfg->spCellCfgPres)
3213    {
3214       freeUeReCfgCellGrpInfo(ueCfg);
3215    }
3216    for(lcCfgIdx=0; lcCfgIdx< ueCfg->numLcs; lcCfgIdx++)
3217    {
3218       freeMacLcCfg(&ueCfg->lcCfgList[lcCfgIdx]);
3219    }
3220    memset(ueCfg, 0, sizeof(MacUeCfg));
3221 }
3222
3223 /*******************************************************************
3224 *
3225 * @brief delete UE Configuration of a particular UE
3226 *
3227 * @details
3228 *
3229 *    Function : deleteUeCfg 
3230 *
3231 *    Functionality: delete UE Configuration of a particular UE 
3232 *
3233 * @params[in] uint16_t cellIdx, uint8_t ueId
3234 * @return ROK     - success
3235 *         RFAILED - failure
3236 *
3237 * ****************************************************************/
3238 uint8_t  deleteUeCfg(uint16_t cellId, uint8_t ueId)
3239 {
3240    uint8_t tnlIdx = 0;
3241    uint16_t cellIdx = 0;
3242    DuUeCb *ueCb = NULLP;
3243    
3244    GET_CELL_IDX(cellId, cellIdx);
3245    if(duCb.actvCellLst[cellIdx] != NULLP)
3246    {
3247       if((duCb.actvCellLst[cellIdx]->ueCb[ueId-1].macUeCfg.macUeCfgState == UE_DELETE_COMPLETE)\
3248             &&(duCb.actvCellLst[cellIdx]->ueCb[ueId-1].rlcUeCfg.rlcUeCfgState == UE_DELETE_COMPLETE))
3249       {
3250          ueCb = &duCb.actvCellLst[cellIdx]->ueCb[ueId-1];
3251          deleteMacUeCfg(&ueCb->macUeCfg);
3252          deleteRlcUeCfg(&ueCb->rlcUeCfg);
3253          if(ueCb->f1UeDb !=NULLP)
3254          {
3255             freeF1UeDb(ueCb->f1UeDb);
3256          }
3257          for(tnlIdx = 0; tnlIdx < duCb.numTeId; )
3258          {
3259             if(duCb.upTnlCfg[tnlIdx]->ueId == ueId)
3260             {
3261                duCb.upTnlCfg[tnlIdx]->configType = CONFIG_DEL;
3262                duProcEgtpTunnelCfg(tnlIdx, duCb.upTnlCfg[tnlIdx], duCb.upTnlCfg[tnlIdx]);
3263             }
3264             else
3265                tnlIdx++;
3266          }
3267          unsetBitInUeBitMap(cellId, ueId-1);
3268          duCb.actvCellLst[cellIdx]->numActvUes--;
3269          memset(ueCb, 0, sizeof(DuUeCb));
3270       }
3271       else
3272       {
3273          return RFAILED;
3274       }
3275    }
3276    else
3277    {
3278       DU_LOG("\nERROR  --> DU APP : deleteUeCfg(): CellIdx[%d] is not found", cellIdx);
3279       return RFAILED;
3280    }
3281    return ROK;
3282 }
3283
3284
3285 /*******************************************************************
3286 *
3287 * @brief Handle UE delete response from MAC
3288 *
3289 * @details
3290 *
3291 *    Function : DuProcMacUeDeleteRsp
3292 *
3293 *    Functionality: Handle UE delete response from MAC
3294 *
3295 * @params[in] Pointer to MacUeDeleteRsp and Pst
3296 * @return ROK     - success
3297 *         RFAILED - failure
3298 *
3299 * ****************************************************************/
3300
3301 uint8_t DuProcMacUeDeleteRsp(Pst *pst, MacUeDeleteRsp *deleteRsp)
3302 {
3303    uint8_t  ret =ROK,ueId=0;
3304    uint16_t cellIdx=0;
3305    uint32_t gnbCuUeF1apId =0 , gnbDuUeF1apId =0;
3306    
3307    if(deleteRsp)
3308    {
3309       if(deleteRsp->result == DEL_SUCCESSFUL)
3310       {
3311          DU_LOG("\nINFO   -->  DU APP : MAC UE Delete Response : SUCCESS [UE IDX : %d]", deleteRsp->ueId);
3312          GET_CELL_IDX(deleteRsp->cellId, cellIdx);
3313          if(duCb.actvCellLst[cellIdx])
3314          {
3315             duCb.actvCellLst[cellIdx]->ueCb[deleteRsp->ueId -1].macUeCfg.macUeCfgState = UE_DELETE_COMPLETE;
3316             ueId = deleteRsp->ueId;
3317             gnbCuUeF1apId = duCb.actvCellLst[cellIdx]->ueCb[ueId-1].gnbCuUeF1apId;
3318             gnbDuUeF1apId = duCb.actvCellLst[cellIdx]->ueCb[ueId-1].gnbDuUeF1apId;
3319             if(deleteUeCfg(deleteRsp->cellId, ueId) == ROK)
3320             {
3321                ret = BuildAndSendUeContextReleaseComplete(deleteRsp->cellId, gnbCuUeF1apId, gnbDuUeF1apId);
3322                if(ret != ROK)
3323                {
3324                   DU_LOG("\nERROR  -->  DU APP : DuProcMacUeDeleteRsp(): failed to send UE context release complete");
3325                }
3326             }
3327
3328          }
3329       }
3330       else
3331       {
3332          DU_LOG("\nERROR  -->  DU APP : DuProcMacUeDeleteRsp(): MAC UE Delete Response : FAILURE [UE IDX : %d]",\
3333          deleteRsp->ueId);
3334          ret =  RFAILED;
3335       }
3336       DU_FREE_SHRABL_BUF(pst->region, pst->pool, deleteRsp, sizeof(MacUeDeleteRsp));
3337    }
3338    else
3339    {
3340       DU_LOG("\nERROR  -->  DU APP : DuProcMacUeDeleteRsp(): MAC UE Delete Response is null");
3341       ret = RFAILED;
3342    }
3343    return ret;
3344 }
3345
3346 /*******************************************************************
3347  *
3348  * @brief Processes UE Delete Rsp received from RLC 
3349  *
3350  * @details
3351  *
3352  *    Function : DuProcRlcUeDeleteRsp
3353  *
3354  *    Functionality:
3355  *     Processes UE Delete Rsp received from RLC 
3356  *
3357  *  @params[in]  Post structure
3358  *               Pointer to RlcUeDeleteRsp
3359  *  @return ROK     - success
3360  *          RFAILED - failure
3361  *
3362  * *****************************************************************/
3363
3364 uint8_t DuProcRlcUeDeleteRsp(Pst *pst, RlcUeDeleteRsp *delRsp)
3365 {
3366    uint8_t  ueId = 0, ret = ROK;
3367    uint16_t cellIdx = 0,crnti=0;
3368
3369    if(delRsp)
3370    {
3371       ueId = delRsp->ueId;
3372       GET_CELL_IDX(delRsp->cellId, cellIdx);
3373
3374       if(delRsp->result == SUCCESSFUL)
3375       {
3376          DU_LOG("\nINFO   -->  DU_APP: RLC UE Delete Response : SUCCESS [UE IDX:%d]", ueId);
3377          if(duCb.actvCellLst[cellIdx]!=NULLP)
3378          {
3379             duCb.actvCellLst[cellIdx]->ueCb[ueId-1].rlcUeCfg.rlcUeCfgState = UE_DELETE_COMPLETE;
3380             GET_CRNTI(crnti, ueId);
3381             if(sendUeDeleteReqToMac(delRsp->cellId, ueId, crnti) == RFAILED)
3382             {
3383                DU_LOG("\nERROR  -->  DU APP : duBuildAndSendUeDeleteReq(): Failed to build UE  delete req for MAC ");
3384                return RFAILED;
3385             }
3386
3387          }
3388       }
3389       else
3390       {
3391          DU_LOG("\nERROR   -->  DU_APP: RLC UE Delete Response : FAILED [UE IDX:%d]", ueId);
3392          ret = RFAILED;
3393       }
3394       DU_FREE_SHRABL_BUF(pst->region, pst->pool, delRsp, sizeof(RlcUeDeleteRsp));
3395
3396    }
3397    return ret;
3398 }
3399
3400 /*******************************************************************
3401  *
3402  * @brief Sending UE Delete Req To Mac
3403 *
3404 * @details
3405 *
3406 *    Function : sendUeDeleteReqToMac
3407 *
3408 *    Functionality:
3409 *     sending UE Delete Req To Mac
3410 *
3411 *  @params[in]    cellId, ueId, crnti 
3412 *  @return ROK     - success
3413 *          RFAILED - failure
3414 *
3415 *****************************************************************/
3416
3417 uint8_t sendUeDeleteReqToMac(uint16_t cellId, uint8_t ueId, uint16_t crnti)
3418 {
3419    Pst pst;
3420    uint8_t ret=ROK;
3421    MacUeDelete *ueDelete = NULLP;
3422
3423    DU_ALLOC_SHRABL_BUF(ueDelete, sizeof(MacUeDelete));
3424    if(ueDelete)
3425    {
3426       ueDelete->cellId = cellId;
3427       ueDelete->ueId   = ueId;
3428       ueDelete->crnti  = crnti;
3429       FILL_PST_DUAPP_TO_MAC(pst, EVENT_MAC_UE_DELETE_REQ);
3430
3431       DU_LOG("\nDEBUG  -->  DU_APP: Sending UE delete Request to MAC ");
3432       ret = (*packMacUeDeleteReqOpts[pst.selector])(&pst, ueDelete);
3433       if(ret == RFAILED)
3434       {
3435          DU_LOG("\nERROR  -->  DU_APP: sendUeDeleteReqToMac(): Failed to send UE delete Req to MAC");
3436          DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL, ueDelete, sizeof(MacUeDelete));
3437       }
3438    }
3439    else
3440    {
3441       DU_LOG("\nERROR  -->   DU_APP: sendUeDeleteReqToMac(): Failed to allocate memory"); 
3442       ret = RFAILED;
3443    }
3444    return ret;
3445 }
3446
3447 /*******************************************************************
3448  *
3449  * @brief Sending UE Delete Req To Rlc
3450  *
3451  * @details
3452  *
3453  *    Function : sendUeDeleteReqToRlc
3454  *
3455  *    Functionality:
3456  *     Sending UE Delete Req To Rlc
3457  *
3458  *  @params[in]  cellId, ueId 
3459  *  @return ROK     - success
3460  *          RFAILED - failure
3461  *
3462  *****************************************************************/
3463
3464 uint8_t sendUeDeleteReqToRlc(uint16_t cellId, uint8_t ueId)
3465 {
3466    uint8_t ret;
3467    Pst pst;
3468    RlcUeDelete *ueDelete;
3469
3470    DU_ALLOC_SHRABL_BUF(ueDelete, sizeof(RlcUeDelete));
3471    if(ueDelete !=NULLP)
3472    {
3473       ueDelete->cellId = cellId;
3474       ueDelete->ueId = ueId;
3475       FILL_PST_DUAPP_TO_RLC(pst, RLC_UL_INST, EVENT_RLC_UE_DELETE_REQ);
3476
3477       ret = (*packRlcUeDeleteReqOpts[pst.selector])(&pst, ueDelete);
3478       if(ret == RFAILED)
3479       {
3480          DU_LOG("\nERROR  -->  DU_APP : sendUeDeleteReqToRlc():Failed to send UE Delete  Req to RLC"); 
3481          DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL, ueDelete, sizeof(RlcUeDelete));
3482       }
3483    }
3484    else
3485    {
3486       DU_LOG("\nERROR  -->   DU_APP: sendUeDeleteReqToRlc():Memory allocation failed");
3487       ret = RFAILED;
3488    }
3489    return ret;
3490 }
3491
3492 /*******************************************************************
3493  *
3494  * @brief DU processes UE delete req from CU and sends to MAC and RLC 
3495  *
3496  * @details
3497  *
3498  *    Function : duBuildAndSendUeDeleteReq
3499  *
3500  *    Functionality: DU processes UE delete req from CU and sends to MAC 
3501  *                   and RLC 
3502  *
3503  * @params[in] cellId, crnti 
3504  * @return ROK     - success
3505  *         RFAILED - failure
3506  *
3507  * ****************************************************************/
3508
3509 uint8_t duBuildAndSendUeDeleteReq(uint16_t cellId, uint16_t crnti)
3510 {
3511    uint8_t  ueId =0;
3512    uint16_t cellIdx = 0;
3513
3514    DU_LOG("\nDEBUG  -->  DU_APP: Processing UE Delete Request ");
3515    GET_CELL_IDX(cellId, cellIdx);
3516    GET_UE_ID(crnti, ueId);
3517
3518    if(duCb.actvCellLst[cellIdx] != NULLP)
3519    {
3520       if(crnti != duCb.actvCellLst[cellIdx]->ueCb[ueId - 1].crnti)
3521       {
3522          DU_LOG("\nERROR  -->  DU APP : duBuildAndSendUeDeleteReq(): CRNTI [%d] not found", crnti);
3523          return RFAILED;
3524       }
3525
3526       duCb.actvCellLst[cellIdx]->ueCb[ueId - 1].ueState = UE_DELETION_IN_PROGRESS; 
3527       if(sendUeDeleteReqToRlc(cellId, ueId) == RFAILED)
3528       {
3529          DU_LOG("\nERROR  -->  DU APP : DuProcMacUeDeleteRsp():Failed to build UE  delete req for RLC ");
3530          return RFAILED;
3531       }
3532    }
3533    else
3534    {
3535       DU_LOG("\nERROR  -->  DU APP : duBuildAndSendUeDeleteReq(): Cell Id is not found");
3536       return RFAILED;
3537    }
3538
3539    return ROK;
3540 }
3541
3542 /*******************************************************************
3543  *
3544  * @brief delete RlcUeCfg from duCb
3545  *
3546  * @details
3547  *
3548  *    Function : deleteRlcUeCfg
3549  *
3550  *    Functionality:
3551  *       delete  RlcUeCfg from duCb
3552  *
3553  *  @params[in] RlcUeCfg *ueCfg 
3554  *               
3555  *  @return ROK     - success
3556  *          RFAILED - failure
3557  *
3558  *****************************************************************/
3559
3560 void deleteRlcUeCfg(RlcUeCfg *ueCfg)
3561 {
3562    uint8_t lcIdx = 0;
3563    RlcBearerCfg *lcCfg= NULLP;
3564    if(ueCfg)
3565    {
3566       for(lcIdx =0 ; lcIdx < ueCfg->numLcs ; lcIdx++)
3567       {
3568          lcCfg = &ueCfg->rlcLcCfg[lcIdx];
3569          switch(lcCfg->rlcMode)
3570          {
3571             case RLC_AM :
3572                {
3573                   DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL, lcCfg->u.amCfg, sizeof(AmBearerCfg));
3574                   break;
3575                }
3576             case RLC_UM_BI_DIRECTIONAL :
3577                {
3578                   DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL, lcCfg->u.umBiDirCfg, sizeof(UmBiDirBearerCfg));
3579                   break;
3580                }
3581             case RLC_UM_UNI_DIRECTIONAL_UL :
3582                {
3583                   DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL, lcCfg->u.umUniDirUlCfg, sizeof(UmUniDirUlBearerCfg));
3584                   break;
3585                }
3586             case RLC_UM_UNI_DIRECTIONAL_DL :
3587                {
3588                   DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL, lcCfg->u.umUniDirDlCfg, sizeof(UmUniDirDlBearerCfg));
3589                   break;
3590                }
3591          }
3592          DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL, lcCfg->snssai, sizeof(Snssai));
3593       }
3594       memset(ueCfg, 0, sizeof(RlcUeCfg));
3595    }
3596 }
3597
3598 /*******************************************************************
3599 *
3600 * @brief Du process Ue Context Release Command
3601 *
3602 * @details
3603 *
3604 *    Function : duProcUeContextReleaseCommand 
3605 *
3606 *    Functionality: Du process Ue Context Release Command 
3607 *
3608 * @params[in] DuUeCb *duUeCb 
3609 * @return ROK     - success
3610 *         RFAILED - failure
3611 *
3612 * ****************************************************************/
3613 uint8_t duProcUeContextReleaseCommand(uint16_t cellId, DuUeCb *duUeCb)
3614 {
3615    uint8_t ret =ROK, ueId=0;
3616    uint16_t crnti = 0;
3617
3618    if(duUeCb != NULLP)
3619    {
3620       crnti = duUeCb->crnti;
3621       GET_UE_ID(crnti, ueId);
3622       
3623       if(duUeCb->f1UeDb)
3624       {
3625          /* Send DL RRC msg for RRC release */
3626          if(duUeCb->f1UeDb->dlRrcMsg)
3627          {
3628             if(duUeCb->f1UeDb->dlRrcMsg->rrcMsgPdu != NULLP)
3629             {
3630                ret = duBuildAndSendDlRrcMsgToRlc(cellId, duCb.actvCellLst[duUeCb->f1UeDb->cellIdx]->ueCb[ueId-1].rlcUeCfg,\
3631                      duUeCb->f1UeDb->dlRrcMsg);
3632                if(ret == RFAILED)
3633                {
3634                   DU_LOG("\nERROR  -->  DU APP : duProcUeContextReleaseCommand() : Failed to send DL RRC msg");
3635                   DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL, duUeCb->f1UeDb->dlRrcMsg->rrcMsgPdu,\
3636                         duUeCb->f1UeDb->dlRrcMsg->rrcMsgSize);
3637                   DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL, duUeCb->f1UeDb->dlRrcMsg, sizeof(F1DlRrcMsg));
3638                }
3639             }
3640          }
3641       }
3642       else
3643       {
3644          ret = duBuildAndSendUeDeleteReq(cellId,crnti);
3645          if(ret == RFAILED)
3646          {
3647             DU_LOG("\nERROR  -->  DU APP : duProcUeContextReleaseCommand(): Failed to build and send Ue Delete request");
3648          }
3649       }
3650    }
3651    return ret;
3652 }
3653
3654 /**********************************************************************
3655   End of file
3656 ***********************************************************************/