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