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