dda60e2ae567e9d538cbec6972ecb84390080c18
[o-du/l2.git] / src / du_app / du_msg_hdl.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
19 /* This file contains message handling functionality for DU APP */
20 #include "common_def.h"
21 #include "lrg.h"
22 #include "legtp.h"
23 #include "lkw.h"
24 #include "kwu.h"
25 #include "lrg.x"
26 #include "lkw.x"
27 #include "kwu.x"
28 #include "du_app_mac_inf.h"
29 #include "du_app_rlc_inf.h"
30 #include "du_cfg.h"
31 #include "du_app_rlc_inf.h"
32 #include "du_mgr.h"
33 #include "du_sctp.h"
34 #include "F1AP-PDU.h"
35 #include "du_f1ap_msg_hdl.h"
36 #include "du_ue_mgr.h"
37 #include "lsctp.h"
38 #include "legtp.h"
39 #include "du_utils.h"
40 #include "du_cell_mgr.h" 
41
42 #ifdef O1_ENABLE
43
44 #include "AlarmInterface.h"
45 #include "CmInterface.h"
46 #include "PmInterface.h"
47
48 #endif 
49
50 uint8_t rlcDlCfg = 0;
51 uint8_t numRlcDlSaps = 0;
52 uint8_t rlcUlCfg = 0;
53 uint8_t numRlcMacSaps = 0;
54 uint8_t macCfg = 0;
55 uint8_t macCfgInst = 0;
56
57 DuCfgParams duCfgParam;
58 uint8_t packRlcConfigReq(Pst *pst, RlcMngmt *cfg);
59 uint8_t cmPkLkwCntrlReq(Pst *pst, RlcMngmt *cfg);
60 uint8_t cmPkLrgCfgReq(Pst *pst, RgMngmt *cfg);
61 uint8_t BuildAndSendE2SetupReq();
62 uint8_t egtpHdlDatInd(EgtpMsg egtpMsg);
63 uint8_t BuildAndSendDUConfigUpdate();
64 uint16_t getTransId();
65 uint8_t cmPkLrgSchCfgReq(Pst * pst,RgMngmt * cfg);
66 uint8_t sendCellDeleteReqToMac(uint16_t cellId);
67
68 packMacCellCfgReq packMacCellCfgOpts[] =
69 {
70    packMacCellCfg, /* packing for loosely coupled */
71    MacProcCellCfgReq, /* packing for tightly coupled */
72    packMacCellCfg, /* packing for light weight loosly coupled */
73 };
74
75 DuMacCellStart packMacCellStartOpts[] =
76 {
77    packMacCellStart,   /* Loose coupling */
78    MacProcCellStart,   /* TIght coupling */
79    packMacCellStart    /* Light weight-loose coupling */
80 };
81
82 DuMacCellStop packMacCellStopOpts[] =
83 {
84    packMacCellStop,   /* Loose coupling */
85    MacProcCellStop,   /* TIght coupling */
86    packMacCellStop    /* Light weight-loose coupling */
87 };
88
89 DuMacSliceCfgReq packMacSliceCfgReqOpts[] =
90 {
91    packDuMacSliceCfgReq,       /* Loose coupling */
92    MacProcSliceCfgReq,         /* TIght coupling */
93    packDuMacSliceCfgReq        /* Light weight-loose coupling */
94 };
95
96
97 DuMacSliceRecfgReq packMacSliceReCfgReqOpts[] =
98 {
99    packDuMacSliceRecfgReq,       /* Loose coupling */
100    MacProcSliceReCfgReq,         /* TIght coupling */
101    packDuMacSliceRecfgReq        /* Light weight-loose coupling */
102 };
103 /**************************************************************************
104  * @brief Function to fill configs required by RLC
105  *
106  * @details
107  *
108  *      Function : duBuildRlcCfg 
109  * 
110  *      Functionality:
111  *           Initiates general Configs towards RLC 
112  *     
113  * @param[in] Inst  Specifies if RLC UL or RLC DL instance 
114  * @return ROK     - success
115  *         RFAILED - failure
116  *
117  ***************************************************************************/
118 uint8_t duBuildRlcCfg(Inst inst)
119 {
120    RlcMngmt   rlcMngmt;
121    RlcGenCfg  *genCfg = NULLP;
122    Pst pst;
123
124    DU_SET_ZERO(&rlcMngmt, sizeof(RlcMngmt));
125    DU_SET_ZERO(&pst, sizeof(Pst));
126
127    genCfg   = &(rlcMngmt.t.cfg.s.gen);
128
129    /*----------- Fill General Configuration Parameters ---------*/
130    genCfg->maxUe       = duCfgParam.maxUe;
131    genCfg->maxKwuSaps  = 2;
132    genCfg->maxUdxSaps  = 1; 
133    genCfg->rlcMode     = (inst == RLC_UL_INST) ?
134       LKW_RLC_MODE_UL : LKW_RLC_MODE_DL;
135    genCfg->timeRes     = 1; 
136    genCfg->maxRguSaps  = DEFAULT_CELLS;
137
138    /*----------- Fill lmPst
139     * Parameters ---------*/
140    genCfg->lmPst.dstProcId = DU_PROC;
141    genCfg->lmPst.srcProcId = DU_PROC;
142    genCfg->lmPst.dstEnt    = ENTDUAPP;
143    genCfg->lmPst.dstInst   = DU_INST;
144    genCfg->lmPst.srcEnt    = ENTRLC;
145    genCfg->lmPst.srcInst   = inst;
146    genCfg->lmPst.prior     = PRIOR0;
147    genCfg->lmPst.route     = RTESPEC;
148    genCfg->lmPst.region    = (inst == RLC_UL_INST) ?
149       RLC_UL_MEM_REGION:RLC_DL_MEM_REGION;
150    genCfg->lmPst.pool      = RLC_POOL;
151    genCfg->lmPst.selector  = ODU_SELECTOR_LC;
152
153    /* Fill Header */
154    rlcMngmt.hdr.msgType             = TCFG;
155    rlcMngmt.hdr.msgLen              = 0;
156    rlcMngmt.hdr.entId.ent           = ENTRLC;
157    rlcMngmt.hdr.entId.inst          = (Inst)0;
158    rlcMngmt.hdr.elmId.elmnt         = STGEN;
159    rlcMngmt.hdr.seqNmb              = 0;
160    rlcMngmt.hdr.version             = 0;
161    rlcMngmt.hdr.transId             = 0;
162    rlcMngmt.hdr.response.prior      = PRIOR0;
163    rlcMngmt.hdr.response.route      = RTESPEC;
164    rlcMngmt.hdr.response.mem.region = (inst == RLC_UL_INST) ?
165       RLC_UL_MEM_REGION:RLC_DL_MEM_REGION;
166    rlcMngmt.hdr.response.mem.pool   = DU_POOL;
167    rlcMngmt.hdr.response.selector   = ODU_SELECTOR_LC;
168
169    /* Fill Pst */
170    pst.selector  = ODU_SELECTOR_LC;
171    pst.srcEnt    = ENTDUAPP;
172    pst.dstEnt    = ENTRLC;
173    pst.dstInst   = inst;
174    pst.dstProcId = DU_PROC;
175    pst.srcProcId = DU_PROC;
176    pst.region    = duCb.init.region;
177
178    DU_LOG("\nDEBUG   -->  DU_APP : RLC Gen Cfg Req sent for inst %d", inst);
179
180    /* Send the request to RLC */
181    packRlcConfigReq(&pst, &rlcMngmt);
182
183    return ROK;
184 }
185
186 /**************************************************************************
187  * @brief Function to fill configs required by RLC
188  *
189  * @details
190  *
191  *      Function : duBuildRlcLsapCfg 
192  * 
193  *      Functionality:
194  *           Initiates general Configs towards RLC 
195  *     
196  * @param[in] Inst  Specifies if RLC UL or RLC DL instance 
197  * @return ROK     - success
198  *         RFAILED - failure
199  *
200  ***************************************************************************/
201 uint8_t duBuildRlcLsapCfg(Ent ent, Inst inst, uint8_t lsapInst)
202 {
203
204    RlcMngmt   rlcMngmt;
205    RlcSapCfg  *lSap = NULLP;
206    Pst        pst;
207
208    DU_SET_ZERO(&rlcMngmt, sizeof(RlcMngmt));
209    DU_SET_ZERO(&pst, sizeof(Pst));
210
211    /* Fill Header */
212    rlcMngmt.hdr.msgType             = TCFG;
213    rlcMngmt.hdr.entId.ent           = ENTRLC;
214    rlcMngmt.hdr.response.mem.region = (inst == RLC_UL_INST) ?
215       RLC_UL_MEM_REGION:RLC_DL_MEM_REGION;
216
217    rlcMngmt.hdr.response.mem.pool   = RLC_POOL;
218
219    /* Fill Pst */
220    pst.selector  = ODU_SELECTOR_LC;
221    pst.srcEnt    = ENTDUAPP;
222    pst.dstEnt    = ENTRLC;
223    pst.dstProcId = DU_PROC;
224    pst.dstInst   = inst;
225    pst.srcProcId = DU_PROC;
226    pst.region    = duCb.init.region;
227    lSap   = &(rlcMngmt.t.cfg.s.sap);
228
229    lSap->mem.region = (inst == RLC_UL_INST) ?
230       RLC_UL_MEM_REGION:RLC_DL_MEM_REGION;
231    lSap->mem.pool    = RLC_POOL;
232    lSap->mem.spare   = 0;
233    lSap->bndTmrIntvl = 10;
234    lSap->priority    = PRIOR0;
235    lSap->route       = RTESPEC;
236    if (ent == ENTMAC)
237    {
238       lSap->procId      = DU_PROC;
239       lSap->ent         = ENTMAC;
240       lSap->inst        = lsapInst;
241       lSap->sapId       = lsapInst;      /* SapId will be stored as suId in MAC */
242       lSap->selector    = (inst == RLC_UL_INST) ? ODU_SELECTOR_LWLC : ODU_SELECTOR_TC;
243       rlcMngmt.hdr.elmId.elmnt  = STRGUSAP;
244       DU_LOG("\nDEBUG   -->  DU_APP : RLC MAC Lower Sap Cfg Req sent for inst %d", inst);
245
246    }
247    else
248    {
249       lSap->procId    = DU_PROC;
250       lSap->ent       = ENTRLC;
251       lSap->inst      = (inst == RLC_UL_INST) ?
252          RLC_DL_INST : RLC_UL_INST;
253       lSap->sapId       = 0;
254       lSap->selector = ODU_SELECTOR_LC;
255       rlcMngmt.hdr.elmId.elmnt  = STUDXSAP;
256       DU_LOG("\nDEBUG   -->  DU_APP : RLC DL/UL Lower Sap Cfg Req sent for inst %d", inst);
257    }
258
259    packRlcConfigReq(&pst, &rlcMngmt);
260    return ROK;
261 }
262
263 /**************************************************************************
264  * @brief Function to fill configs required by RLC
265  *
266  * @details
267  *
268  *      Function : duBuildRlcUsapCfg 
269  * 
270  *      Functionality:
271  *           Initiates general Configs towards RLC 
272  *     
273  * @param[in] Inst  Specifies if RLC UL or RLC DL instance 
274  * @return ROK     - success
275  *         RFAILED - failure
276  *
277  ***************************************************************************/
278 uint8_t duBuildRlcUsapCfg(uint8_t elemId, Ent ent, Inst inst)
279 {
280    RlcMngmt   rlcMngmt;
281    RlcSapCfg  *uSap = NULLP;
282    Pst        pst;
283
284    DU_SET_ZERO(&rlcMngmt, sizeof(RlcMngmt));
285    DU_SET_ZERO(&pst, sizeof(Pst));
286
287    uSap   = &(rlcMngmt.t.cfg.s.sap);
288
289    uSap->selector   = ODU_SELECTOR_LC;
290    uSap->mem.region = (inst == RLC_UL_INST) ?
291       RLC_UL_MEM_REGION:RLC_DL_MEM_REGION;
292    uSap->mem.pool = RLC_POOL;
293    uSap->mem.spare = 0;
294
295    uSap->procId = DU_PROC;
296    uSap->ent = ENTRLC;
297    uSap->sapId = 0;
298
299    uSap->inst = (inst == RLC_UL_INST) ?
300       RLC_DL_INST : RLC_UL_INST;
301    uSap->bndTmrIntvl = 1000;
302    uSap->priority = PRIOR0;
303    uSap->route = RTESPEC;
304
305    /* Fill Header */
306    rlcMngmt.hdr.msgType             = TCFG;
307    rlcMngmt.hdr.entId.ent           = ENTRLC;
308    rlcMngmt.hdr.elmId.elmnt         = STUDXSAP;
309    rlcMngmt.hdr.response.mem.region = (inst == RLC_UL_INST) ?
310       RLC_UL_MEM_REGION:RLC_DL_MEM_REGION;
311
312    rlcMngmt.hdr.response.mem.pool   = RLC_POOL;
313
314    /* Fill Pst */
315    pst.selector  = ODU_SELECTOR_LC;
316    pst.srcEnt    = ENTDUAPP;
317    pst.dstEnt    = ENTRLC;
318    pst.dstProcId = DU_PROC;
319    pst.dstInst = inst;
320    pst.srcProcId = DU_PROC;
321    pst.region = duCb.init.region;
322
323    DU_LOG("\nDEBUG   -->  DU_APP : RLC Kwu Upper Sap Cfg Req sent for inst %d", inst);
324    packRlcConfigReq(&pst, &rlcMngmt);
325
326    return ROK;
327 }
328
329 /**************************************************************************
330  * @brief Function to populate internal DS of DU APP
331  *
332  * @details
333  *
334  *      Function : duProcCfgComplete
335  * 
336  *      Functionality:
337  *           Populates internal data structures of DU APP after 
338  *           receiving configurations.
339  *     
340  * @param[in]  void
341  * @return ROK     - success
342  *         RFAILED - failure
343  *
344  ***************************************************************************/
345 uint8_t duProcCfgComplete()
346 {
347    uint8_t         ret = ROK;
348    uint16_t        cellId = 0;
349    uint16_t        idx;
350    for(idx=0; idx< DEFAULT_CELLS; idx++)
351    {
352       DuCellCb *cell = NULLP;
353       DU_ALLOC(cell, sizeof(DuCellCb));
354       if(cell == NULLP)
355       {
356          DU_LOG("\nERROR  -->  DU_APP : Memory Allocation failed in duProcCfgComplete");
357          ret = RFAILED;
358       }
359       else
360       {
361          uint8_t idx1=0; 
362          memset(cell, 0, sizeof(DuCellCb));
363          cell->cellId = ++cellId;
364          memset(&cell->cellInfo.nrEcgi.plmn, 0, sizeof(Plmn));
365          cell->cellInfo.nrEcgi.plmn.mcc[0] = duCfgParam.srvdCellLst[0].duCellInfo.cellInfo.srvdPlmn[0].plmn.mcc[0];
366          cell->cellInfo.nrEcgi.plmn.mcc[1] = duCfgParam.srvdCellLst[0].duCellInfo.cellInfo.srvdPlmn[0].plmn.mcc[1];
367          cell->cellInfo.nrEcgi.plmn.mcc[2] = duCfgParam.srvdCellLst[0].duCellInfo.cellInfo.srvdPlmn[0].plmn.mcc[2];
368          cell->cellInfo.nrEcgi.plmn.mnc[0] = duCfgParam.srvdCellLst[0].duCellInfo.cellInfo.srvdPlmn[0].plmn.mnc[0];
369          cell->cellInfo.nrEcgi.plmn.mnc[1] = duCfgParam.srvdCellLst[0].duCellInfo.cellInfo.srvdPlmn[0].plmn.mnc[1];
370          cell->cellInfo.nrEcgi.plmn.mnc[2] = duCfgParam.srvdCellLst[0].duCellInfo.cellInfo.srvdPlmn[0].plmn.mnc[2];
371          cell->cellInfo.nrEcgi.cellId = cell->cellId;
372          cell->cellInfo.nrPci = duCfgParam.srvdCellLst[0].duCellInfo.cellInfo.nrPci; 
373          cell->cellInfo.fiveGsTac = duCfgParam.srvdCellLst[0].duCellInfo.tac;
374          memset(&cell->cellInfo.plmn[idx1], 0, sizeof(Plmn));
375          for(idx1=0; idx1<MAX_PLMN; idx1++)
376          {
377             cell->cellInfo.plmn[idx1].mcc[0] = duCfgParam.srvdCellLst[0].duCellInfo.cellInfo.srvdPlmn[0].plmn.mcc[0];
378             cell->cellInfo.plmn[idx1].mcc[1] = duCfgParam.srvdCellLst[0].duCellInfo.cellInfo.srvdPlmn[0].plmn.mcc[1];
379             cell->cellInfo.plmn[idx1].mcc[2] = duCfgParam.srvdCellLst[0].duCellInfo.cellInfo.srvdPlmn[0].plmn.mcc[2];
380             cell->cellInfo.plmn[idx1].mnc[0] = duCfgParam.srvdCellLst[0].duCellInfo.cellInfo.srvdPlmn[0].plmn.mnc[0];
381             cell->cellInfo.plmn[idx1].mnc[1] = duCfgParam.srvdCellLst[0].duCellInfo.cellInfo.srvdPlmn[0].plmn.mnc[1];
382             cell->cellInfo.plmn[idx1].mnc[2] = duCfgParam.srvdCellLst[0].duCellInfo.cellInfo.srvdPlmn[0].plmn.mnc[2];
383          }
384          cell->cellInfo.maxUe = duCfgParam.maxUe;
385          cell->cellStatus = CELL_OUT_OF_SERVICE;
386          gCellStatus = CELL_DOWN;
387          cell->gnbDuUeF1apIdGenerator = 0;
388          duCb.cfgCellLst[duCb.numCfgCells] = cell;
389          duCb.numCfgCells++;
390       }
391    }
392    if(ret != RFAILED)
393    {
394       //Start layer configs
395       ret = duSendRlcUlCfg();
396    }
397    return ret;
398 }
399 /**************************************************************************
400  * @brief Function to invoke DU Layer Configs
401  *
402  * @details
403  *
404  *      Function : duSendRlcUlCfg 
405  * 
406  *      Functionality:
407  *           Initiates Configs towards layers of DU
408  *     
409  * @param[in]  void
410  * @return ROK     - success
411  *         RFAILED - failure
412  *
413  ***************************************************************************/
414 uint8_t duSendRlcUlCfg()
415 {
416    uint8_t cellIdx; 
417
418    duBuildRlcCfg((Inst)RLC_UL_INST);
419    for(cellIdx = 0; cellIdx < DEFAULT_CELLS; cellIdx++)
420    {
421       duBuildRlcLsapCfg(ENTMAC, (Inst)RLC_UL_INST, cellIdx);
422    }
423    duBuildRlcLsapCfg(ENTRLC, (Inst)RLC_UL_INST, 0);
424
425    return ROK;
426 }
427
428 /**************************************************************************
429  * @brief Function to invoke DU Layer Configs
430  *
431  * @details
432  *
433  *      Function : duSendRlcDlCfg 
434  * 
435  *      Functionality:
436  *           Initiates Configs towards layers of DU
437  *     
438  * @param[in]  void
439  * @return ROK     - success
440  *         RFAILED - failure
441  *
442  ***************************************************************************/
443 uint8_t duSendRlcDlCfg()
444 {
445    uint8_t cellIdx; 
446
447    duBuildRlcCfg((Inst)RLC_DL_INST);
448    duBuildRlcUsapCfg(STUDXSAP, ENTRLC, (Inst)RLC_DL_INST);
449    for(cellIdx = 0; cellIdx < DEFAULT_CELLS; cellIdx++)
450    {
451       duBuildRlcLsapCfg(ENTMAC, (Inst)RLC_DL_INST, cellIdx);
452    }
453
454    return ROK;
455 }
456 /**************************************************************************
457  * @brief Function to handle Config Confirm from RLC
458  *
459  * @details
460  *
461  *      Function : DuHdlRlcCfgComplete 
462  * 
463  *      Functionality:
464  *           Handles Gen Config Confirm from RLC
465  *     
466  * @param[in]  Pst     *pst, Post structure of the primitive.     
467  * @param[in]  RlcMngmt *cfm, Unpacked primitive info received from RLC
468  * @return ROK     - success
469  *         RFAILED - failure
470  *
471  ***************************************************************************/
472 uint8_t DuHdlRlcCfgComplete(Pst *pst, RlcMngmt *cfm)
473 {
474    uint8_t ret = ROK;
475    if (pst->srcInst == RLC_UL_INST)
476    {
477       ret = duProcRlcUlCfgComplete(pst, cfm);
478    }
479    else
480    {
481       ret = duProcRlcDlCfgComplete(pst, cfm);
482    }
483    return ret;
484 }
485
486 /**************************************************************************
487  * @brief Function to handle Control Config Confirm from RLC
488  *
489  * @details
490  *
491  *      Function : duHdlRlcCntrlCfgComplete 
492  * 
493  *      Functionality:
494  *           Handles Control Config Confirm from RLC
495  *     
496  * @param[in]  Pst     *pst, Post structure of the primitive.     
497  * @param[in]  RlcMngmt *cfm, Unpacked primitive info received from RLC
498  * @return ROK     - success
499  *         RFAILED - failure
500  *
501  ***************************************************************************/
502 uint8_t duHdlRlcCntrlCfgComplete(Pst *pst, RlcMngmt *cntrl)
503 {
504    uint8_t ret = ROK;
505
506    if (cntrl->cfm.status == LCM_PRIM_OK)
507    {
508       switch (cntrl->hdr.elmId.elmnt)
509       {
510          case  STRGUSAP:
511             {
512                if (pst->srcInst == RLC_DL_INST)
513                {
514                   DU_LOG("\nDEBUG   -->  DU_APP : BIND OF RLC DL TO MAC (RGU) SAP SUCCESSFUL");
515                   macCfgInst++;
516                   if(macCfgInst < DEFAULT_CELLS)
517                   {
518                      macCfgInst = 0;
519                      duBindUnbindRlcToMacSap((Inst) RLC_DL_INST, ABND);
520                   }
521                   else
522                   {
523                      duBindUnbindRlcToMacSap((Inst) RLC_UL_INST, ABND);
524                   }
525                }
526                else
527                {
528                   DU_LOG("\nDEBUG   -->  DU_APP : BIND OF RLC UL TO MAC (RGU) SAP SUCCESSFUL");
529                   macCfgInst++;
530                   if(macCfgInst < DEFAULT_CELLS)
531                   {
532                      duBindUnbindRlcToMacSap((Inst) RLC_UL_INST, ABND);
533                   }
534                   else
535                   {
536                      duSendSchCfg();
537                   }
538                   break;
539                }
540             }
541
542       }
543    }
544    return ret;
545 }
546 /**************************************************************************
547  * @brief Function to handle Config Confirm from RLC UL
548  *
549  * @details
550  *
551  *      Function : duHdlRlcUlCfgComplete 
552  * 
553  *      Functionality:
554  *           Handles Config Confirm from RLC UL
555  *     
556  * @param[in]  Pst     *pst, Post structure of the primitive.     
557  * @param[in]  RlcMngmt *cfm, Unpacked primitive info received from RLC UL
558  * @return ROK     - success
559  *         RFAILED - failure
560  *
561  ***************************************************************************/
562 uint8_t duProcRlcUlCfgComplete(Pst *pst, RlcMngmt *cfm)
563 {
564    uint8_t ret;
565
566    DU_LOG("\nDEBUG   -->  DU_APP : RLC UL Cfg Status %d", cfm->cfm.status);
567    if (cfm->cfm.status == LCM_PRIM_OK)
568    {
569       switch(cfm->hdr.elmId.elmnt)
570       {
571          case STGEN:
572             {
573                rlcUlCfg |= RLC_GEN_CFG;
574                break;
575             }
576          case STRGUSAP:
577             {
578                numRlcMacSaps++;
579                if(numRlcMacSaps == DEFAULT_CELLS)
580                {
581                   rlcUlCfg |= RLC_MAC_SAP_CFG;
582                   numRlcMacSaps = 0;
583                }
584                break;
585             }
586          case STUDXSAP:
587             {
588                rlcUlCfg |= RLC_UDX_SAP_CFG;
589                break;
590
591             }
592          default:
593             break;
594       }
595       DU_LOG("\nDEBUG   -->  DU_APP : RLC UL Cfg Cfm received for the element %d ",cfm->hdr.elmId.elmnt);
596       if(rlcUlCfg == DU_RLC_UL_CONFIGURED)
597       {
598          rlcUlCfg = 0;
599          numRlcMacSaps = 0;
600          //Start configuration of RLC DL
601          duSendRlcDlCfg();
602
603       }
604    }
605    else
606    {
607       DU_LOG("\nERROR  -->  DU_APP : Config confirm NOK from RLC UL");
608       ret = RFAILED;
609    }
610    return ret;
611 }
612
613 /**************************************************************************
614  * @brief Function to handle Config Confirm from RLC DL
615  *
616  * @details
617  *
618  *      Function : duHdlRlcDlCfgComplete 
619  * 
620  *      Functionality:
621  *           Handles Config Confirm from RLC DL
622  *     
623  * @param[in]  Pst     *pst, Post structure of the primitive.     
624  * @param[in]  RlcMngmt *cfm, Unpacked primitive info received from RLC DL
625  * @return ROK     - success
626  *         RFAILED - failure
627  *
628  ***************************************************************************/
629 uint8_t duProcRlcDlCfgComplete(Pst *pst, RlcMngmt *cfm)
630 {
631    DU_LOG("\nDEBUG   -->  DU_APP : RLC DL Cfg Status %d", cfm->cfm.status);
632    if (cfm->cfm.status == LCM_PRIM_OK)
633    {
634       switch(cfm->hdr.elmId.elmnt)
635       {
636          case STGEN:
637             {
638                rlcDlCfg |= RLC_GEN_CFG;
639                break;
640             }
641          case STRGUSAP:
642             {
643                numRlcMacSaps++;
644                if(numRlcMacSaps == DEFAULT_CELLS)
645                {
646                   rlcDlCfg |= RLC_MAC_SAP_CFG;
647                   numRlcMacSaps = 0;
648                }
649                break;
650             }
651          case STUDXSAP:
652             {
653                rlcDlCfg |= RLC_UDX_SAP_CFG;
654                break;
655
656             }
657          default:
658             break;
659
660       }
661       DU_LOG("\nDEBUG   -->  DU_APP : RLC DL Cfg Cfm received for the element %d ",cfm->hdr.elmId.elmnt);
662       if(rlcDlCfg == DU_RLC_DL_CONFIGURED)
663       {
664          rlcDlCfg = 0;
665          //Start configuration of MAC
666          duSendMacCfg();
667
668       }
669    }
670    else
671    {
672       DU_LOG("\nERROR  -->  DU_APP : Config confirm NOK from RLC DL");
673    }
674    return ROK;
675 }
676
677 /**************************************************************************
678  * @brief Function to send configs to MAC
679  *
680  * @details
681  *
682  *      Function : duSendMacCfg 
683  * 
684  *      Functionality:
685  *           Initiates Configs towards MAC layer
686  *     
687  * @param[in]  void
688  * @return ROK     - success
689  *         RFAILED - failure
690  *
691  ***************************************************************************/
692 uint8_t duSendMacCfg()
693 {
694    duBuildMacGenCfg();
695    duBuildMacUsapCfg(RLC_UL_INST);
696    duBuildMacUsapCfg(RLC_DL_INST);
697
698    return ROK;
699 }
700
701 /**************************************************************************
702  * @brief Function to fill gen config required by MAC
703  *
704  * @details
705  *
706  *      Function : duBuildMacGenCfg 
707  * 
708  *      Functionality:
709  *           Initiates general Configs towards MAC
710  *     
711  * @param[in] void
712  * @return ROK     - success
713  *         RFAILED - failure
714  *
715  ***************************************************************************/
716 uint8_t duBuildMacGenCfg()
717 {
718    RgMngmt       rgMngmt;
719    RgGenCfg      *genCfg=NULLP;
720    Pst           pst;
721
722    DU_SET_ZERO(&pst, sizeof(Pst));
723    DU_SET_ZERO(&rgMngmt, sizeof(RgMngmt));
724
725    genCfg   = &(rgMngmt.t.cfg.s.genCfg);
726
727    /*----------- Fill General Configuration Parameters ---------*/
728    genCfg->mem.region = MAC_MEM_REGION;
729    genCfg->mem.pool   = MAC_POOL;
730    genCfg->tmrRes     = 10;
731    genCfg->numRguSaps = 2;
732
733    genCfg->lmPst.dstProcId = DU_PROC;
734    genCfg->lmPst.srcProcId = DU_PROC;
735    genCfg->lmPst.dstEnt    = ENTDUAPP;
736    genCfg->lmPst.dstInst   = 0;
737    genCfg->lmPst.srcEnt    = ENTMAC;
738    genCfg->lmPst.srcInst   = macCfgInst;
739    genCfg->lmPst.prior     = PRIOR0;
740    genCfg->lmPst.route     = RTESPEC;
741    genCfg->lmPst.region    = MAC_MEM_REGION;
742    genCfg->lmPst.pool      = MAC_POOL;
743    genCfg->lmPst.selector  = ODU_SELECTOR_LC;
744
745    /* Fill Header */
746    rgMngmt.hdr.msgType             = TCFG;
747    rgMngmt.hdr.msgLen              = 0;
748    rgMngmt.hdr.entId.ent           = ENTMAC;
749    rgMngmt.hdr.entId.inst          = (Inst)0;
750    rgMngmt.hdr.elmId.elmnt         = STGEN;
751    rgMngmt.hdr.seqNmb              = 0;
752    rgMngmt.hdr.version             = 0;
753    rgMngmt.hdr.transId             = 0;
754
755    rgMngmt.hdr.response.prior      = PRIOR0;
756    rgMngmt.hdr.response.route      = RTESPEC;
757    rgMngmt.hdr.response.mem.region = MAC_MEM_REGION;
758    rgMngmt.hdr.response.mem.pool   = MAC_POOL;
759    rgMngmt.hdr.response.selector   = ODU_SELECTOR_LC;
760
761    /* Fill Pst */
762    pst.selector  = ODU_SELECTOR_LC;
763    pst.srcEnt    = ENTDUAPP;
764    pst.dstEnt    = ENTMAC;
765    pst.dstInst   = macCfgInst;
766    pst.dstProcId = DU_PROC;
767    pst.srcProcId = DU_PROC;
768    pst.region = duCb.init.region;
769
770    DU_LOG("\nDEBUG   -->  DU_APP : MAC Gen Cfg Req sent");
771
772    /* Send the request to MAC */
773    cmPkLrgCfgReq(&pst, &rgMngmt);
774
775    return ROK;
776 }
777
778 /**************************************************************************
779  * @brief Function to fill USAP config required by MAC
780  *
781  * @details
782  *
783  *      Function : duBuildMacUsapCfg 
784  * 
785  *      Functionality:
786  *           Initiates USAP Configs towards MAC
787  *     
788  * @param[in] SpId  Specifies if RLC UL or RLC DL instance 
789  * @return ROK     - success
790  *         RFAILED - failure
791  *
792  ***************************************************************************/
793 uint8_t duBuildMacUsapCfg(SpId sapId)
794 {
795    RgMngmt     rgMngmt;
796    RgUpSapCfg  *uSap = NULLP;
797    Pst         pst;
798
799    DU_SET_ZERO(&pst, sizeof(Pst));
800    DU_SET_ZERO(&rgMngmt, sizeof(RgMngmt));
801
802    uSap   = &(rgMngmt.t.cfg.s.rguSap);
803
804    uSap->mem.region = MAC_MEM_REGION;
805    uSap->mem.pool   = MAC_POOL;
806    uSap->suId       = 0;
807    uSap->spId       = sapId;
808    uSap->procId     = DU_PROC;
809    uSap->ent        = ENTRLC;
810    uSap->inst       = sapId;
811    uSap->prior      = PRIOR0;
812    uSap->route      = RTESPEC;
813    uSap->selector   = ODU_SELECTOR_LC ;
814
815    /* fill header */
816    rgMngmt.hdr.msgType             = TCFG;
817    rgMngmt.hdr.entId.ent           = ENTMAC;
818    rgMngmt.hdr.entId.inst          = (Inst)0;
819    rgMngmt.hdr.elmId.elmnt         = STRGUSAP;
820    rgMngmt.hdr.response.mem.region = MAC_MEM_REGION;
821    rgMngmt.hdr.response.mem.pool   = MAC_POOL;
822
823    /* fill pst */
824    pst.selector  = ODU_SELECTOR_LC;
825    pst.srcEnt    = ENTDUAPP;
826    pst.dstEnt    = ENTMAC;
827    pst.dstInst   = macCfgInst;
828    pst.dstProcId = DU_PROC;
829    pst.srcProcId = DU_PROC;
830    pst.region    = duCb.init.region;
831
832    DU_LOG("\nDEBUG  -->  DU_APP : MAC Rgu USap Cfg Req sent");
833
834    /* Send the request to MAC */
835    cmPkLrgCfgReq(&pst, &rgMngmt);
836
837    return ROK;
838 }
839
840 /**************************************************************************
841  * @brief Function to handle Config Confirm from MAC
842  *
843  * @details
844  *
845  *      Function : duHdlMacCfgComplete 
846  * 
847  *      Functionality:
848  *           Handles Gen Config Confirm from MAC
849  *     
850  * @param[in]  Pst     *pst, Post structure of the primitive.     
851  * @param[in]  RgMngmt *cfm, Unpacked primitive info received from MAC
852  * @return ROK     - success
853  *         RFAILED - failure
854  *
855  ***************************************************************************/
856 uint8_t duHdlMacCfgComplete(Pst *pst, RgMngmt *cfm)
857 {
858    uint8_t ret = ROK;
859
860    if (cfm->cfm.status == LCM_PRIM_OK)
861    {
862       switch (cfm->hdr.elmId.elmnt)
863       {
864          case STGEN:
865             {
866                macCfg |= MAC_GEN_CFG;
867                break;
868             }
869          case STRGUSAP:
870             {
871                macCfg |= MAC_SAP_CFG;
872                numRlcMacSaps++;
873                break;
874             }
875          default:
876             break;
877       }
878       DU_LOG("\nDEBUG   -->  DU_APP : MAC Cfg Cfm received for the element %d ",cfm->hdr.elmId.elmnt);
879       if(macCfg == MAC_CONFIGURED && numRlcMacSaps == MAX_MAC_SAP)
880       {
881          macCfg = 0;
882          DU_LOG("\nDEBUG   -->  DU_APP : Completed sending Configs");
883          macCfgInst = 0;
884          duBindUnbindRlcToMacSap(RLC_DL_INST, ABND);
885       }
886
887    }
888    else
889    {
890       DU_LOG("\nERROR  -->  DU_APP : Config confirm NOK from MAC");
891       ret = RFAILED;
892    }
893    return ret;
894 }
895
896 /**************************************************************************
897  * @brief Function to bind/unbind RLC to MAC SAP
898  *
899  * @details
900  *
901  *      Function : duBindUnbindRlcToMacSap 
902  * 
903  *      Functionality:
904  *           Initiates Bind/Unbind from RLC to MAC
905  *     
906  * @param[in] Inst   Specifies if RLC UL or RLC DL instance 
907  * @param[in] action Specifies if action is bind or unbind
908  * @return ROK     - success
909  *         RFAILED - failure
910  *
911  ***************************************************************************/
912 uint8_t duBindUnbindRlcToMacSap(uint8_t inst, uint8_t action)
913 {
914    RlcCntrl  *cntrl = NULLP;
915    RlcMngmt  rlcMngmt;
916    Pst      pst;
917
918
919    DU_SET_ZERO(&rlcMngmt, sizeof(RlcMngmt));
920    DU_SET_ZERO(&pst, sizeof(Pst));
921
922    if (action == ABND)
923    {
924       DU_LOG("\nDEBUG   -->  DU_APP : Cntrl Req to RLC inst %d to bind MAC sap", inst);
925    }
926    else
927    {
928       DU_LOG("\nDEBUG   -->  DU_APP : Cntrl Req to RLC inst %d to unbind MAC sap", inst);
929    }
930    cntrl = &(rlcMngmt.t.cntrl);
931
932    cntrl->action            =  action;
933    cntrl->subAction         =  DU_ZERO_VAL;
934    cntrl->s.sapCntrl.suId   =  macCfgInst;
935    cntrl->s.sapCntrl.spId   =  inst;
936
937    /* Fill header */
938    rlcMngmt.hdr.msgType             = TCNTRL;
939    rlcMngmt.hdr.entId.ent           = ENTRLC;
940    rlcMngmt.hdr.entId.inst          = inst;
941    rlcMngmt.hdr.elmId.elmnt         = 186; /* ambiguous defines in lkw.h and lrg.h so direct hardcoded*/
942    rlcMngmt.hdr.response.mem.region = (inst == RLC_UL_INST) ?
943       RLC_UL_MEM_REGION:RLC_DL_MEM_REGION;
944    rlcMngmt.hdr.response.mem.pool   = RLC_POOL;
945
946    /* Fill pst */
947    pst.selector  = ODU_SELECTOR_LC;
948    pst.srcEnt    = ENTDUAPP;
949    pst.dstEnt    = ENTRLC;
950    pst.dstProcId = DU_PROC;
951    pst.dstInst   = inst;
952    pst.srcProcId = DU_PROC;
953    pst.region    = duCb.init.region;
954
955    cmPkLkwCntrlReq(&pst, &rlcMngmt);
956
957    return ROK;
958 }
959 /*******************************************************************
960  *
961  * @brief Handles SCTP notifications
962  *
963  * @details
964  *
965  *    Function : duSctpNtfyHdl
966  *
967  *    Functionality:
968  *         Handles SCTP notification
969  *
970  * @params[in] Message Buffer
971  *             SCTP notification
972  *
973  * @return ROK     - success
974  *         RFAILED - failure
975  *
976  * ****************************************************************/
977
978 uint8_t duSctpNtfyHdl(Buffer *mBuf, CmInetSctpNotification *ntfy)
979 {
980    if(f1Params.assocId == ntfy->u.assocChange.assocId)
981    {
982       if(BuildAndSendF1SetupReq() != ROK)
983       {
984          return RFAILED;
985       }
986    }
987    else if(ricParams.assocId == ntfy->u.assocChange.assocId)
988    {
989        return ROK;
990    }
991    else
992    {
993       DU_LOG("\nERROR  -->  DU_APP : Invalid assocId %d received", ntfy->u.assocChange.assocId);
994       return RFAILED;
995    }
996    return ROK;
997 }
998
999 /*******************************************************************
1000  *
1001  * @brief  Fills Pst struct for ENTEGTP
1002  *
1003  * @details
1004  *
1005  *    Function : duFillEgtpPst
1006  *
1007  *    Functionality:
1008  *       Fills Pst struct for ENTEGTP
1009  *
1010  * @params[in] 
1011  * @return ROK     - success
1012  *         RFAILED - failure
1013  *
1014  * ****************************************************************/
1015 uint8_t duFillEgtpPst(Pst *pst, Event event)
1016 {
1017    memset(pst, 0, sizeof(Pst));
1018    pst->srcEnt = (Ent)ENTDUAPP;
1019    pst->srcInst = (Inst)DU_INST;
1020    pst->srcProcId = DU_PROC;
1021    pst->dstEnt = (Ent)ENTEGTP;
1022    pst->dstInst = (Inst)EGTP_INST;
1023    pst->dstProcId = pst->srcProcId;
1024    pst->event = event;
1025    pst->selector = ODU_SELECTOR_LC;
1026    pst->pool= DU_POOL;
1027
1028    return ROK;
1029 }
1030
1031
1032 /*******************************************************************
1033  *
1034  * @brief  Function to configure EGTP
1035  *
1036  * @details
1037  *
1038  *    Function : duBuildEgtpCfgReq
1039  *
1040  *    Functionality:
1041  *       Function to configure EGTP
1042  *
1043  * @params[in] 
1044  * @return ROK     - success
1045  *         RFAILED - failure
1046  *
1047  * ****************************************************************/
1048
1049 uint8_t duBuildEgtpCfgReq()
1050 {
1051    Pst pst;
1052    EgtpConfig egtpCfg;
1053
1054    DU_LOG("\nDEBUG   -->  DU_APP : Sending EGTP config request");
1055
1056    memset(&egtpCfg, 0, sizeof(EgtpConfig));
1057    memcpy(&egtpCfg, &duCfgParam.egtpParams, sizeof(EgtpConfig));
1058
1059    duFillEgtpPst(&pst, EVTCFGREQ);
1060    packEgtpCfgReq(&pst, egtpCfg);
1061
1062    return ROK;
1063 }
1064
1065 /*******************************************************************
1066  *
1067  * @brief  Function to configure EGTP
1068  *
1069  * @details
1070  *
1071  *    Function : duBuildEgtpCfgReq
1072  *
1073  *    Functionality:
1074  *       Function to configure EGTP
1075  *
1076  * @params[in] 
1077  * @return ROK     - success
1078  *         RFAILED - failure
1079  *
1080  * ****************************************************************/
1081 uint8_t duHdlEgtpCfgComplete(CmStatus cfm)
1082 {
1083    uint8_t ret = ROK;
1084
1085    if(cfm.status == LCM_PRIM_OK)
1086    {
1087       DU_LOG("\nDEBUG   -->  DU_APP : EGTP configuraton complete");
1088       duSendEgtpSrvOpenReq();
1089    }
1090    else
1091    {
1092       DU_LOG("\nERROR  -->  DU_APP : EGTP configuraton failed");
1093       ret = RFAILED;
1094    }
1095
1096    return (ret);
1097 }
1098
1099 /*******************************************************************
1100  *
1101  * @brief  Sends server open request to EGTP
1102  *
1103  * @details
1104  *
1105  *    Function : duSendEgtpSrvOpenReq
1106  *
1107  *    Functionality:
1108  *       Sends server open request to EGTP
1109  *
1110  * @params[in] 
1111  * @return ROK     - success
1112  *         RFAILED - failure
1113  *
1114  * ****************************************************************/
1115
1116 uint8_t duSendEgtpSrvOpenReq()
1117 {
1118    Pst pst;
1119
1120    DU_LOG("\nDEBUG   -->  DU_APP : Sending EGTP server open request");
1121
1122    duFillEgtpPst(&pst, EVTSRVOPENREQ);
1123    packEgtpSrvOpenReq(&pst);
1124
1125    return ROK;
1126 }
1127
1128 /*******************************************************************
1129  *
1130  * @brief Handles server open confirmation
1131  *
1132  * @details
1133  *
1134  *    Function : duHdlEgtpSrvOpenComplete
1135  *
1136  *    Functionality:
1137  *        Handles server open confirmation
1138  *
1139  * @params[in] 
1140  * @return ROK     - success
1141  *         RFAILED - failure
1142  *
1143  *****************************************************************/
1144
1145 uint8_t duHdlEgtpSrvOpenComplete(CmStatus cfm)
1146 {
1147    uint8_t ret = ROK;
1148
1149    if(cfm.status == LCM_PRIM_OK)
1150    {
1151       DU_LOG("\nDEBUG   -->  DU_APP : EGTP server opened successfully");
1152    }
1153    else
1154    {
1155       DU_LOG("\nERROR  -->  DU_APP : EGTP server opening failed");
1156       ret = RFAILED;
1157    }
1158
1159    return (ret);
1160 }
1161
1162 /*******************************************************************
1163  *
1164  * @brief Sends tunnel management request
1165  *
1166  * @details
1167  *
1168  *    Function : duSendEgtpTnlMgmtReq 
1169  *
1170  *    Functionality:
1171  *        Builds and sends tunnel management request to EGTP
1172  *
1173  * @params[in] Action
1174  *             Local tunnel endpoint id
1175  *             Remote tunnel endpoint id 
1176  * @return ROK     - success
1177  *         RFAILED - failure
1178  *
1179  * ****************************************************************/
1180
1181 uint8_t duSendEgtpTnlMgmtReq(uint8_t action, uint32_t teIdTobeMod, GtpTnlCfg *ueCbTnlCfg)
1182 {
1183    uint8_t ret =ROK;
1184    Pst pst;
1185    EgtpTnlEvt tnlEvt;
1186
1187    DU_LOG("\nDEBUG   -->  DU_APP : Sending EGTP tunnel management request for teId [%d]", ueCbTnlCfg->teId);
1188
1189    /* ADD/MOD/DEL per tunnel */
1190    tnlEvt.action = action;
1191    tnlEvt.remTeid = ueCbTnlCfg->teId;
1192    if(action != EGTP_TNL_MGMT_ADD)
1193    {
1194       tnlEvt.lclTeid = teIdTobeMod;
1195    }
1196    else
1197    {
1198       tnlEvt.lclTeid = ueCbTnlCfg->teId;
1199    }
1200    duFillEgtpPst(&pst, EVTTNLMGMTREQ);
1201    ret = egtpTnlMgmtReq(&pst, tnlEvt);
1202    return ret;
1203 }
1204
1205 /*******************************************************************
1206  *
1207  * @brief Handles Tunnel management confirm 
1208  *
1209  * @details
1210  *
1211  *    Function : duHdlEgtpTnlMgmtCfm
1212  *
1213  *    Functionality:
1214  *      Handles tunnel management confirm received from Egtp
1215  *
1216  * @params[in] Tunnel Event  
1217  * @return ROK     - success
1218  *         RFAILED - failure
1219  *
1220  * ****************************************************************/
1221 uint8_t duHdlEgtpTnlMgmtCfm(EgtpTnlEvt tnlEvtCfm)
1222 {
1223    uint8_t ret = ROK;
1224
1225    if(tnlEvtCfm.cfmStatus.status == LCM_PRIM_OK)
1226    {
1227       DU_LOG("\nDEBUG  -->  DU_APP: Tunnel management confirm OK");
1228    }
1229    else
1230    {
1231       DU_LOG("\nERROR  -->  DU_APP: Tunnel management failed");
1232       ret = RFAILED;
1233    }
1234
1235    return (ret);
1236 }
1237
1238 /*******************************************************************
1239  *
1240  * @brief Sends UL user data over to EGTP
1241  *
1242  * @details
1243  *
1244  *    Function : duSendEgtpDatInd
1245  *
1246  *    Functionality: Sends UL user data over to EGTP
1247  *
1248  * @params[in] UL data buffer
1249  * @return ROK     - success
1250  *         RFAILED - failure
1251  *
1252  * ****************************************************************/
1253 uint8_t duSendEgtpDatInd(Buffer *mBuf)
1254 {
1255    EgtpMsg  egtpMsg;
1256
1257    /* Fill EGTP header */
1258    egtpMsg.msgHdr.msgType = EGTPU_MSG_GPDU;
1259    egtpMsg.msgHdr.nPdu.pres = FALSE;
1260    egtpMsg.msgHdr.seqNum.pres = FALSE;
1261    egtpMsg.msgHdr.extHdr.udpPort.pres = FALSE;
1262    egtpMsg.msgHdr.extHdr.pdcpNmb.pres = FALSE;
1263    egtpMsg.msgHdr.teId = 1;
1264    egtpMsg.msg = mBuf;
1265    
1266    egtpHdlDatInd(egtpMsg);
1267
1268    return ROK;
1269
1270 }
1271
1272 /**************************************************************************
1273  * @brief Function to send configs to SCH
1274  *
1275  * @details
1276  *
1277  *      Function : duSendSchCfg 
1278  * 
1279  *      Functionality:
1280  *           Sends general config to Scheduler via MAC layer
1281  *     
1282  * @param[in]  void
1283  * @return ROK     - success
1284  *         RFAILED - failure
1285  *
1286  ***************************************************************************/
1287 uint8_t duSendSchCfg()
1288 {
1289    RgMngmt       rgMngmt;
1290    RgSchInstCfg  *cfg = NULLP;
1291    Pst           pst;
1292
1293    DU_SET_ZERO(&pst, sizeof(Pst));
1294    DU_SET_ZERO(&rgMngmt, sizeof(RgMngmt));
1295
1296    cfg = &(rgMngmt.t.cfg.s.schInstCfg);
1297
1298    /* Filling of Instance Id */
1299    cfg->instId = DEFAULT_CELLS + 1;
1300    /* Filling of Gen config */
1301    cfg->genCfg.mem.region = MAC_MEM_REGION;
1302    cfg->genCfg.mem.pool = MAC_POOL;
1303    cfg->genCfg.tmrRes = 10;
1304
1305 #ifdef LTE_ADV
1306    cfg->genCfg.forceCntrlSrbBoOnPCel = FALSE;
1307    cfg->genCfg.isSCellActDeactAlgoEnable = TRUE;
1308 #endif/*LTE_ADV*/
1309    cfg->genCfg.startCellId     = 1;
1310    cfg->genCfg.lmPst.dstProcId = DU_PROC;
1311    cfg->genCfg.lmPst.srcProcId = DU_PROC;
1312    cfg->genCfg.lmPst.dstEnt    = ENTDUAPP;
1313    cfg->genCfg.lmPst.dstInst   = DU_INST;
1314    cfg->genCfg.lmPst.srcEnt    = ENTMAC;
1315    cfg->genCfg.lmPst.srcInst   = DEFAULT_CELLS + 1;
1316    cfg->genCfg.lmPst.prior     = PRIOR0;
1317    cfg->genCfg.lmPst.route     = RTESPEC;
1318    cfg->genCfg.lmPst.region    = MAC_MEM_REGION;
1319    cfg->genCfg.lmPst.pool      = MAC_POOL;
1320    cfg->genCfg.lmPst.selector  = ODU_SELECTOR_LC;
1321
1322    /* Fill Header */
1323    rgMngmt.hdr.msgType             = TCFG;
1324    rgMngmt.hdr.entId.ent           = ENTMAC;
1325    rgMngmt.hdr.entId.inst          = DU_INST;
1326    rgMngmt.hdr.elmId.elmnt         = STSCHINST;
1327    rgMngmt.hdr.response.mem.region = MAC_MEM_REGION;
1328    rgMngmt.hdr.response.mem.pool   = MAC_POOL;
1329
1330    /* Fill Pst */
1331    pst.selector  = ODU_SELECTOR_LC;
1332    pst.srcEnt    = ENTDUAPP;
1333    pst.dstEnt    = ENTMAC;
1334    pst.dstProcId = DU_PROC;
1335    pst.srcProcId = DU_PROC;
1336    pst.srcInst   = DU_INST;
1337    pst.dstInst   = 0;
1338    pst.region    = duCb.init.region;
1339    pst.event    = (Event) EVTMACSCHGENCFGREQ;
1340
1341    DU_LOG("\nDEBUG   -->  DU_APP : MAC Sch Cfg sent");
1342
1343    /* Send the request to MAC */
1344    cmPkLrgSchCfgReq(&pst, &rgMngmt);
1345
1346    return ROK;
1347 }
1348
1349
1350 /**************************************************************************
1351  * @brief Function to configure SCTP params and 
1352  *  responsible for F1 and E2 interfaces
1353  *
1354  * @details
1355  *
1356  *      Function : duLayerConfigComplete
1357  * 
1358  *      Functionality:
1359  *           Configures SCTP Params and responsible for handling
1360  *           F1 and E2 interface.
1361  *     
1362  * @param[in]  void
1363  * @return ROK     - success
1364  *         RFAILED - failure
1365  *
1366  ***************************************************************************/
1367 uint8_t duLayerConfigComplete()
1368 {
1369    uint8_t ret = ROK;
1370
1371    DU_LOG("\nINFO   -->  DU_APP : Configuring all Layer is complete");
1372
1373    if((ret = duSctpCfgReq(duCfgParam.sctpParams)) != ROK)
1374    {
1375       DU_LOG("\nERROR  -->  DU_APP : Failed configuring Sctp Params");
1376       ret = RFAILED;
1377    }
1378    if((ret = duSctpAssocReq(F1_INTERFACE)) != ROK)
1379    {
1380       DU_LOG("\nERROR  -->  DU_APP : Failed to send AssocReq F1");
1381       ret = RFAILED;
1382    }
1383    if((ret = duSctpAssocReq(E2_INTERFACE)) != ROK)
1384    {
1385       DU_LOG("\nERROR  -->  DU_APP : Failed to send AssocReq E2");
1386       ret = RFAILED;
1387    }
1388
1389    return (ret); 
1390
1391
1392 /**************************************************************************
1393  * @brief Function to handle  SCH Config Confirm from MAC
1394  *
1395  * @details
1396  *
1397  *      Function : duHdlSchCfgComplete 
1398  * 
1399  *      Functionality:
1400  *           Handles Scheduler Gen Config Confirm from MAC
1401  *     
1402  * @param[in]  Pst     *pst, Post structure of the primitive.     
1403  * @param[in]  RgMngmt *cfm, Unpacked primitive info received from MAC
1404  * @return ROK     - success
1405  *         RFAILED - failure
1406  *
1407  ***************************************************************************/
1408 uint8_t duHdlSchCfgComplete(Pst *pst, RgMngmt *cfm)
1409 {
1410    if (cfm->cfm.status == LCM_PRIM_OK)
1411    {
1412       switch (cfm->hdr.elmId.elmnt)
1413       {
1414          case STSCHINST:
1415             {
1416                DU_LOG("\nDEBUG   -->  DU_APP : Received SCH CFG CFM at DU APP");
1417                break;
1418             }
1419          default:
1420             break;
1421       }
1422    }
1423    duLayerConfigComplete();
1424    duBuildEgtpCfgReq();
1425    return ROK;
1426 }
1427
1428 /**************************************************************************
1429  * @brief Function to fill and send MacCellconfig
1430  *
1431  * @details
1432  *
1433  *      Function : duBuildAndSendMacCellCfg 
1434  * 
1435  *      Functionality:
1436  *           Initiates MAC Configs towards MAC
1437  *     
1438  * @param[in]cell id
1439  * @return ROK     - success
1440  *         RFAILED - failure
1441  *
1442  ***************************************************************************/
1443 uint8_t duBuildAndSendMacCellCfg(uint16_t cellId)
1444 {
1445    Pst pst;
1446    MacCellCfg *duMacCellCfg = NULLP;
1447
1448    DU_ALLOC_SHRABL_BUF(duMacCellCfg, sizeof(MacCellCfg));
1449    if(duMacCellCfg == NULLP)
1450    {
1451       return RFAILED;
1452    }
1453
1454    /* store the address in the duCellCb so that we can free on confirm msg */
1455    duCb.actvCellLst[cellId-1]->duMacCellCfg = duMacCellCfg;
1456
1457    /* copy the mac config structure from duCfgParams */
1458    memcpy(duMacCellCfg,&duCfgParam.macCellCfg,sizeof(MacCellCfg));
1459
1460    /* Fill Pst */
1461    FILL_PST_DUAPP_TO_MAC(pst, EVENT_MAC_CELL_CONFIG_REQ);
1462
1463    /* Send MAC cell config to MAC */
1464    return (*packMacCellCfgOpts[pst.selector])(&pst, duMacCellCfg);
1465 }
1466
1467 /**************************************************************************
1468  * @brief Function to Handle MAC cell config confirm
1469  *
1470  * @details
1471  *
1472  *      Function : duHandleMacCellCfgCfm 
1473  * 
1474  *      Functionality:
1475  *           Initiates general Configs towards MAC
1476  *     
1477  * @param[in] void
1478  * @return ROK     - success
1479  *         RFAILED - failure
1480  *
1481  ***************************************************************************/
1482 uint8_t  duHandleMacCellCfgCfm(Pst *pst, MacCellCfgCfm *macCellCfgCfm)
1483 {
1484    uint8_t  actvCellIdx  = 0;
1485    uint8_t  ret          = ROK;
1486
1487    for(actvCellIdx = 0; actvCellIdx < MAX_NUM_CELL; actvCellIdx++)
1488    {
1489       if(macCellCfgCfm->cellId == duCb.actvCellLst[actvCellIdx]->cellId)
1490       {
1491          duCb.actvCellLst[actvCellIdx]->duMacCellCfg = NULLP;
1492       }
1493    }
1494    if(macCellCfgCfm->rsp == ROK)
1495    {
1496       /* Build and send GNB-DU config update */
1497       ret = BuildAndSendDUConfigUpdate(SERV_CELL_TO_MODIFY);
1498
1499       /* Build and Send Cell Start Req to MAC */
1500       ret = duBuildAndSendMacCellStart();
1501    }
1502    else
1503    {
1504       /* TODO : Action to be taken if cell configuration fails. 
1505        * Should CU be informed? */
1506
1507       DU_LOG("\nERROR  -->  DU_APP : Mac cell cfg failed");
1508       ret = RFAILED;
1509    }
1510    return ret;
1511 }
1512
1513 /*******************************************************************
1514  *
1515  * @brief Builds and sends cell start request to MAC
1516  *
1517  * @details
1518  *
1519  *    Function : duBuildAndSendMacCellStart
1520  *
1521  *    Functionality:
1522  *       Builds and sends cell start request to MAC
1523  *
1524  * @params[in] 
1525  * @return ROK     - success
1526  *         RFAILED - failure
1527  *
1528  * ****************************************************************/
1529 uint8_t duBuildAndSendMacCellStart()
1530 {
1531    Pst pst;
1532    OduCellId *cellId = NULL;
1533
1534    DU_LOG("\nINFO   -->  DU APP : Building and Sending cell start request to MAC");
1535
1536    /* Send Cell Start Request to MAC */
1537    DU_ALLOC_SHRABL_BUF(cellId, sizeof(OduCellId));
1538    if(!cellId)
1539    {
1540       DU_LOG("\nERROR  -->  DU APP : Memory alloc failed while building cell start request");
1541       return RFAILED;
1542    }
1543
1544    for(uint8_t id = 0; id < duCb.numActvCells; id++) 
1545    {
1546       if(duCb.actvCellLst[id])
1547       {
1548          cellId->cellId = duCb.actvCellLst[id]->cellId;
1549
1550          /* Fill Pst */
1551          FILL_PST_DUAPP_TO_MAC(pst, EVENT_MAC_CELL_START);
1552
1553          return (*packMacCellStartOpts[pst.selector])(&pst, cellId);
1554       }
1555    }
1556    return ROK;
1557 }
1558
1559 /*******************************************************************
1560  *
1561  * @brief Builds and sends cell stop request to MAC
1562  *
1563  * @details
1564  *
1565  *    Function : duBuildAndSendMacCellStop 
1566  *
1567  *    Functionality:
1568  *       Builds and sends cell stop request to MAC
1569  *
1570  * @params[in] 
1571  * @return ROK     - success
1572  *         RFAILED - failure
1573  *
1574  * ****************************************************************/
1575 uint8_t duBuildAndSendMacCellStop(uint16_t cellId)
1576 {
1577    Pst pst;
1578    uint16_t cellIdx=0;
1579    OduCellId *oduCellId = NULL;
1580    
1581    DU_LOG("\nINFO   -->  DU APP : Building and Sending cell stop request to MAC");
1582
1583    GET_CELL_IDX(cellId, cellIdx);
1584    if(duCb.actvCellLst[cellIdx] != NULLP)
1585    {
1586       /* Send Cell Stop Request to MAC */
1587       DU_ALLOC_SHRABL_BUF(oduCellId, sizeof(OduCellId));
1588       if(!oduCellId)
1589       {
1590          DU_LOG("\nERROR  -->  DU APP : duBuildAndSendMacCellStop():  Memory allocation failed ");
1591          return RFAILED;
1592       }
1593       memset(oduCellId, 0, sizeof(OduCellId));
1594       oduCellId->cellId = duCb.actvCellLst[cellIdx]->cellId;
1595
1596       /* Fill Pst */
1597       FILL_PST_DUAPP_TO_MAC(pst, EVENT_MAC_CELL_STOP);
1598
1599       return (*packMacCellStopOpts[pst.selector])(&pst, oduCellId);
1600    }
1601    else
1602    {
1603       DU_LOG("\nERROR  -->  DU APP : duBuildAndSendMacCellStop(): cellId[%d] doesnot exists", cellId);
1604       return RFAILED;
1605    }
1606    return ROK;
1607 }
1608
1609 /*******************************************************************
1610  *
1611  * @brief Handles stop indication from MAC
1612  *
1613  * @details
1614  *
1615  *    Function : duHandleStopInd
1616  *
1617  *    Functionality:
1618  *      Handles stop indication from MAC
1619  *
1620  * @params[in] Post structure pointer
1621  * @return ROK     - success
1622  *         RFAILED - failure
1623  *
1624  * ****************************************************************/
1625 uint8_t duHandleStopInd(Pst *pst, OduCellId *cellId)
1626 {
1627    DuCellCb *cellCb = NULLP;
1628
1629    if(cellId->cellId <=0 || cellId->cellId > MAX_NUM_CELL)
1630    {
1631       DU_LOG("\nERROR  -->  DU APP : Invalid Cell Id %d in duHandleStopInd()", cellId->cellId);
1632    }
1633
1634    if(duGetCellCb(cellId->cellId, &cellCb) != ROK)
1635       return RFAILED;
1636
1637    if((cellCb->cellStatus == ACTIVATED) || (cellCb->cellStatus == DELETION_IN_PROGRESS))
1638    {
1639       DU_LOG("\nINFO   -->  DU APP : 5G-NR Cell %d is DOWN", cellId->cellId);
1640       if(sendCellDeleteReqToMac(cellId->cellId) == RFAILED)
1641       {
1642          DU_LOG("\nERROR  -->  DU APP : duHandleStopInd(): Failed to send Cell delete req to MAC for\
1643                cellId[%d]", cellId->cellId);
1644          return RFAILED;
1645       }
1646
1647
1648 #ifdef O1_ENABLE
1649       DU_LOG("\nINFO   -->  DU APP : Raise cell down alarm for cell id=%d", cellId->cellId);
1650       raiseCellAlrm(CELL_DOWN_ALARM_ID, cellId->cellId);
1651       setCellOpState(cellId->cellId, DISABLED, INACTIVE);
1652 #endif
1653    }
1654
1655    if((pst->selector == ODU_SELECTOR_LWLC) || (pst->selector == ODU_SELECTOR_TC))
1656       DU_FREE_SHRABL_BUF(MAC_MEM_REGION, pst->pool, cellId, sizeof(OduCellId));
1657
1658    cellCb->cellStatus = CELL_OUT_OF_SERVICE; //TODO: cell status must be set to OOS after all UE and cell cleanup which is not
1659                                              //supported now
1660
1661    return ROK;
1662 }
1663
1664 /*******************************************************************
1665  *
1666  * @brief Handles slot indication from MAC
1667  *
1668  * @details
1669  *
1670  *    Function : duHandleUlCcchInd
1671  *
1672  *    Functionality:
1673  *      Handles UL CCCH indication from MAC
1674  *
1675  * @params[in] Post structure pointer
1676  *             UL CCCH Ind pointer
1677  * @return ROK     - success
1678  *         RFAILED - failure
1679  *
1680  * ****************************************************************/
1681 uint8_t duHandleUlCcchInd(Pst *pst, UlCcchIndInfo *ulCcchIndInfo)
1682 {
1683
1684    DU_LOG("\nINFO  -->  DU APP : UL CCCH Indication received");
1685
1686    return (duProcUlCcchInd(ulCcchIndInfo));
1687 }
1688
1689 /*******************************************************************
1690  *
1691  * @brief Process UL RRC Message from RLC
1692  *
1693  * @details
1694  *
1695  *    Function : DuProcRlcUlRrcMsgTrans
1696  *
1697  *    Functionality: Process UL RRC Message from RLC
1698  *
1699  * @params[in] Post structure
1700  *             UL RRC Message Info
1701  * @return ROK     - success
1702  *         RFAILED - failure
1703  *
1704  * ****************************************************************/
1705 uint8_t DuProcRlcUlRrcMsgTrans(Pst *pst, RlcUlRrcMsgInfo *ulRrcMsgInfo)
1706 {
1707    DuCellCb *cellCb = NULLP;
1708    DuUeCb   ueCb ={0};
1709   
1710    if(duGetCellCb(ulRrcMsgInfo->cellId, &cellCb) != ROK)
1711       return RFAILED;
1712    if(ulRrcMsgInfo->ueId > 0)
1713    {
1714    ueCb = cellCb->ueCb[ulRrcMsgInfo->ueId -1];
1715
1716
1717    BuildAndSendULRRCMessageTransfer(ueCb, ulRrcMsgInfo->lcId, ulRrcMsgInfo->msgLen, ulRrcMsgInfo->rrcMsg);
1718
1719    DU_FREE_SHRABL_BUF(pst->region, pst->pool, ulRrcMsgInfo->rrcMsg, ulRrcMsgInfo->msgLen);
1720    DU_FREE_SHRABL_BUF(pst->region, pst->pool, ulRrcMsgInfo, sizeof(RlcUlRrcMsgInfo));
1721    }
1722    return ROK;
1723 }
1724
1725 /*******************************************************************
1726 *
1727 * @brief Process RRC delivery report from RLC
1728 *
1729 * @details
1730 *
1731 *    Function : DuProcRlcRrcDeliveryReport
1732 *
1733 *    Functionality: Process RRC delivery Message from RLC
1734 *
1735 * @params[in] Post structure
1736 *             UL RRC Message Info
1737 * @return ROK     - success
1738 *         RFAILED - failure
1739 *
1740 * ****************************************************************/
1741 uint8_t DuProcRlcRrcDeliveryReport(Pst *pst, RrcDeliveryReport *rrcDeliveryReport)
1742 {
1743    DuCellCb *cellCb = NULLP;
1744    DuUeCb   ueCb;
1745    uint8_t  ret = RFAILED;
1746
1747    if(duGetCellCb(rrcDeliveryReport->cellId, &cellCb) != ROK)
1748       return RFAILED;
1749    
1750    ueCb = cellCb->ueCb[rrcDeliveryReport->ueId -1];
1751    ret = BuildAndSendRrcDeliveryReport(ueCb.gnbCuUeF1apId, ueCb.gnbDuUeF1apId,rrcDeliveryReport);
1752
1753    DU_FREE_SHRABL_BUF(pst->region, pst->pool, rrcDeliveryReport, sizeof(RrcDeliveryReport));
1754    return ret;
1755 }
1756
1757 /*******************************************************************
1758  *
1759  * @brief Process UL user data from RLC
1760  *
1761  * @details
1762  *
1763  *    Function : DuProcRlcUlUserDataTrans
1764  *
1765  *    Functionality: Process UL user data from RLC
1766  *
1767  * @params[in] Post structure
1768  *             UL user data
1769  * @return ROK     - success
1770  *         RFAILED - failure
1771  *
1772  * ****************************************************************/
1773 uint8_t DuProcRlcUlUserDataTrans(Pst *pst, RlcUlUserDatInfo *ulUserData)
1774 {
1775    uint8_t  teIdx = 0;
1776    EgtpMsg  egtpMsg;
1777    Buffer   *mBuf;
1778
1779    DU_LOG("\nDEBUG  -->  DU APP : Received UL user data");
1780
1781    /* Fill EGTP header */
1782    egtpMsg.msgHdr.msgType = EGTPU_MSG_GPDU;
1783    egtpMsg.msgHdr.nPdu.pres = FALSE;
1784    egtpMsg.msgHdr.seqNum.pres = FALSE;
1785    egtpMsg.msgHdr.extHdr.udpPort.pres = FALSE;
1786    egtpMsg.msgHdr.extHdr.pdcpNmb.pres = FALSE;
1787
1788    /* Fetch EGTP tunnel info */
1789    for(teIdx = 0; teIdx < duCb.numTeId; teIdx++)
1790    {
1791       /*TODO: If multiple Cell Support is enables then CellId also needs to be validated alongwith ueId and DrbId*/
1792       if((duCb.upTnlCfg[teIdx] != NULLP) && (duCb.upTnlCfg[teIdx]->ueId == ulUserData->ueId) && \
1793          (duCb.upTnlCfg[teIdx]->drbId == ulUserData->rbId))
1794       {
1795          if(duCb.upTnlCfg[teIdx]->tnlCfg1)
1796          {
1797             egtpMsg.msgHdr.teId = duCb.upTnlCfg[teIdx]->tnlCfg1->teId; /*As we are supporting only 1 tunnel per DRB*/
1798             break;
1799          }
1800       }
1801    }
1802
1803    if (ODU_GET_MSG_BUF(DU_APP_MEM_REGION, DU_POOL, &mBuf) != ROK)
1804    {
1805       DU_LOG("\nERROR  -->  DU APP : Failed to allocated buffer memory in DuProcRlcUlUserDataTrans");
1806       DU_FREE_SHRABL_BUF(pst->region, pst->pool, ulUserData->userData, ulUserData->msgLen);
1807       DU_FREE_SHRABL_BUF(pst->region, pst->pool, ulUserData, sizeof(RlcUlUserDatInfo));
1808       return RFAILED;
1809    }
1810    oduCpyFixBufToMsg(ulUserData->userData, mBuf, ulUserData->msgLen);
1811    ODU_PRINT_MSG(mBuf, 0, 0);
1812    egtpMsg.msg = mBuf;
1813    egtpHdlDatInd(egtpMsg);
1814
1815    DU_FREE_SHRABL_BUF(pst->region, pst->pool, ulUserData->userData, ulUserData->msgLen);
1816    DU_FREE_SHRABL_BUF(pst->region, pst->pool, ulUserData, sizeof(RlcUlUserDatInfo));
1817    return ROK;
1818 }
1819
1820 /*******************************************************************
1821  *
1822  * @brief Free tempSLiceCfg stored in duCfgParams
1823  *
1824  * @details
1825  *
1826  *    Function :  duFreeTempSliceCfg
1827  *
1828  *    Functionality: Free tempSLiceCfg stored in duCfgParams 
1829  *
1830  * @params[in] Post structure, 
1831  *             
1832  * @return Void
1833  *
1834  * ****************************************************************/
1835
1836 void duFreeTempSliceCfg()
1837 {
1838     uint8_t policyIdx = 0, memberListTdx =0;
1839     CopyOfRecvdSliceCfg *tempSliceCfg = &duCfgParam.tempSliceCfg;
1840     
1841     if(tempSliceCfg->totalRrmPolicy)
1842     {
1843        for(policyIdx = 0; policyIdx<tempSliceCfg->totalRrmPolicy; policyIdx++)
1844        {
1845           if(tempSliceCfg->rrmPolicy[policyIdx]->numMemberList)
1846           {
1847              for(memberListTdx = 0; memberListTdx<tempSliceCfg->rrmPolicy[policyIdx]->numMemberList; memberListTdx++)
1848              {
1849                  DU_FREE(tempSliceCfg->rrmPolicy[policyIdx]->memberList[memberListTdx], sizeof(PolicyMemberList));
1850              }
1851              DU_FREE(tempSliceCfg->rrmPolicy[policyIdx]->memberList, (tempSliceCfg->rrmPolicy[policyIdx]->numMemberList) * sizeof(PolicyMemberList*));
1852           }
1853           DU_FREE(tempSliceCfg->rrmPolicy[policyIdx], sizeof(RrmPolicy));
1854        }
1855        DU_FREE(tempSliceCfg->rrmPolicy, tempSliceCfg->totalRrmPolicy* sizeof(RrmPolicy*));
1856     }
1857     memset(tempSliceCfg, 0, sizeof(CopyOfRecvdSliceCfg));
1858 }
1859
1860 /*******************************************************************
1861  *
1862  * @brief  free the slice cfg rsp
1863  *
1864  * @details
1865  *
1866  *    Function : duFreeSliceCfgRsp 
1867  *
1868  *    Functionality: free the slice cfg rsp 
1869  *
1870  * @params[in] Post structure, MacSliceCfgRsp  *cfgRsp
1871  *             
1872  * @return ROK     - success
1873  *         RFAILED - failure
1874  *
1875  **********************************************************************/
1876 void duFreeSliceCfgRsp(Pst *pst,  MacSliceCfgRsp *cfgRsp) 
1877 {
1878    uint8_t cfgIdx;
1879
1880    if(cfgRsp)
1881    {
1882       if(cfgRsp->numSliceCfgRsp)
1883       {
1884          for(cfgIdx = 0; cfgIdx<cfgRsp->numSliceCfgRsp; cfgIdx++)
1885          {
1886             DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL, cfgRsp->listOfSliceCfgRsp[cfgIdx], sizeof(MacSliceRsp)); 
1887          }
1888          DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL, cfgRsp->listOfSliceCfgRsp, cfgRsp->numSliceCfgRsp * sizeof(MacSliceRsp*)); 
1889       }
1890       DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL, cfgRsp, sizeof(MacSliceCfgRsp)); 
1891    }
1892    return ROK;
1893 }
1894
1895 /*******************************************************************
1896  *
1897  * @brief process the slice cfg rsp received from MAC
1898  *
1899  * @details
1900  *
1901  *    Function : DuProcMacSliceCfgRsp
1902  *
1903  *    Functionality: process the slice cfg rsp received from MAC
1904  *
1905  * @params[in] Post structure, MacSliceCfgRsp  *cfgRsp
1906  *             
1907  * @return ROK     - success
1908  *         RFAILED - failure
1909  *
1910  **********************************************************************/
1911 uint8_t DuProcMacSliceCfgRsp(Pst *pst,  MacSliceCfgRsp *cfgRsp)
1912 {
1913     uint8_t cfgIdx = 0;
1914     
1915     if(cfgRsp)
1916     {
1917         if(cfgRsp->listOfSliceCfgRsp)
1918         {
1919             for(cfgIdx = 0; cfgIdx<cfgRsp->numSliceCfgRsp; cfgIdx++)
1920             {
1921                 if(cfgRsp->listOfSliceCfgRsp[cfgIdx]->rsp ==  MAC_DU_APP_RSP_OK)
1922                 {
1923                     duCb.sliceState = SLICE_CONFIGURED;
1924                 }
1925             }
1926             DU_LOG("\nINFO  -->  DU_APP : Slice Configuration is done sucessfully ");
1927         }
1928         duFreeSliceCfgRsp(pst, cfgRsp);
1929     }
1930     duFreeTempSliceCfg();
1931     return ROK;
1932 }
1933
1934 /*******************************************************************
1935  *
1936  * @brief Fill the slice configration and rrm policy ratio 
1937  *    information received form O1
1938  *
1939  * @details
1940  *
1941  *    Function : fillSliceCfgReCfgInfo 
1942  *
1943  *    Functionality: Fill the slice configration and recfg info 
1944  *
1945  * @params[in] Post structure
1946  *             
1947  * @return ROK     - success
1948  *         RFAILED - failure
1949  *
1950  * ****************************************************************/
1951
1952 uint8_t fillSliceCfgReCfgInfo(MacSliceCfgReq *sliceCfgReq, RrmPolicy *rrmPolicy[], uint8_t totalRrmPolicy, uint8_t totalSliceCount)
1953 {
1954    uint8_t sliceIdx = 0, cfgIdx = 0, memberListIdx = 0;
1955    
1956    if(totalRrmPolicy)
1957    {
1958       DU_ALLOC_SHRABL_BUF(sliceCfgReq->listOfSliceCfg, totalSliceCount*sizeof(MacSliceRrmPolicy*)); 
1959       if(sliceCfgReq->listOfSliceCfg == NULLP)
1960       {
1961          DU_LOG("\nERROR  -->  DU_APP : Memory allocation failed in fillSliceCfgReCfgInfo");
1962          return RFAILED;
1963       }
1964
1965       for(sliceIdx = 0; sliceIdx<totalRrmPolicy; sliceIdx++)
1966       {
1967          for(memberListIdx = 0; memberListIdx<rrmPolicy[sliceIdx]->numMemberList; memberListIdx++)
1968          {
1969             DU_ALLOC_SHRABL_BUF(sliceCfgReq->listOfSliceCfg[cfgIdx], sizeof(MacSliceRrmPolicy));
1970             if(sliceCfgReq->listOfSliceCfg[cfgIdx] == NULLP)
1971             { 
1972                DU_LOG("\nERROR  -->  DU_APP : Memory allocation failed in fillSliceCfgReCfgInfo");
1973                return RFAILED;
1974             }
1975
1976
1977             memcpy(&sliceCfgReq->listOfSliceCfg[cfgIdx]->snssai, &rrmPolicy[sliceIdx]->memberList[memberListIdx]->snssai, sizeof(Snssai));
1978
1979             DU_ALLOC_SHRABL_BUF(sliceCfgReq->listOfSliceCfg[cfgIdx]->rrmPolicyRatio, sizeof(RrmPolicyRatio));
1980             if(sliceCfgReq->listOfSliceCfg[cfgIdx]->rrmPolicyRatio == NULLP)
1981             { 
1982                DU_LOG("\nERROR  -->  DU_APP : Memory allocation failed in fillSliceCfgReCfgInfo");
1983                return RFAILED;
1984             }
1985
1986             sliceCfgReq->listOfSliceCfg[cfgIdx]->rrmPolicyRatio->policyMaxRatio = rrmPolicy[sliceIdx]->policyMaxRatio;
1987             sliceCfgReq->listOfSliceCfg[cfgIdx]->rrmPolicyRatio->policyMinRatio = rrmPolicy[sliceIdx]->policyMinRatio;
1988             sliceCfgReq->listOfSliceCfg[cfgIdx]->rrmPolicyRatio->policyDedicatedRatio = rrmPolicy[sliceIdx]->policyDedicatedRatio; 
1989             sliceCfgReq->numOfConfiguredSlice++;
1990             cfgIdx++;
1991          }
1992       }
1993    }
1994    return ROK;
1995 }
1996
1997 /*******************************************************************
1998  *
1999  * @brief Fill the slice configration and rrm policy related
2000  *    information received form O1
2001  *
2002  * @details
2003  *
2004  *    Function : BuildAndSendSliceConfigReq 
2005  *
2006  *    Functionality: Fill the slice configration and rrm policy related 
2007  *
2008  * @params[in] RrmPolicy *rrmPolicy[], uint8_t totalRrmPolicy, uint8_t
2009  * totalSliceCnt 
2010  *             
2011  * @return ROK     - success
2012  *         RFAILED - failure
2013  *
2014  * ****************************************************************/
2015 uint8_t BuildAndSendSliceConfigReq(RrmPolicy *rrmPolicy[], uint8_t totalRrmPolicy, uint8_t totalSliceCnt)
2016 {
2017    Pst pst;
2018    MacSliceCfgReq *sliceCfgReq;
2019
2020    DU_ALLOC_SHRABL_BUF(sliceCfgReq, sizeof(MacSliceCfgReq));
2021    if(sliceCfgReq == NULLP)
2022    {
2023       DU_LOG("\nERROR  -->  DU_APP : Memory allocation failed in BuildAndSendSliceConfigReq");
2024       return RFAILED;
2025    }
2026    else
2027    {
2028       if(fillSliceCfgReCfgInfo(sliceCfgReq, rrmPolicy, totalRrmPolicy, totalSliceCnt) != ROK)
2029       {   
2030          DU_LOG("\nERROR  -->  DU_APP : Failed to fill slice Configuration info in MacSliceCfgReq");
2031          return RFAILED;
2032       }
2033       FILL_PST_DUAPP_TO_MAC(pst, EVENT_MAC_SLICE_CFG_REQ);
2034
2035       DU_LOG("\nDEBUG  -->  DU_APP : Sending Slice Cfg Request to MAC ");
2036       if((*packMacSliceCfgReqOpts[pst.selector])(&pst, sliceCfgReq) == RFAILED)
2037       {
2038          DU_LOG("\nERROR  -->  DU_APP : Failed to send Slice Cfg Req to MAC");
2039          DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL, sliceCfgReq, sizeof(MacSliceCfgReq));
2040       }
2041    }
2042    return ROK;  
2043 }
2044
2045
2046 /*******************************************************************
2047  *
2048  * @brief Fill the slice configration and rrm policy related
2049  *    information received form O1
2050  *
2051  * @details
2052  *
2053  *    Function : BuildAndSendSliceReCfgReq 
2054  *
2055  *    Functionality: Fill the slice configration and rrm policy related 
2056  *
2057  * @params[in] RrmPolicy rrmPolicy[], uint8_t totalSliceCount 
2058  *             
2059  * @return ROK     - success
2060  *         RFAILED - failure
2061  *
2062  * ****************************************************************/
2063 uint8_t BuildAndSendSliceReCfgReq(RrmPolicy *rrmPolicy[], uint8_t totalRrmPolicy, uint8_t totalSliceCount)
2064 {
2065    Pst pst;
2066    MacSliceCfgReq *sliceReCfgReq = NULLP;
2067    
2068    DU_LOG("\nINFO  --> DU_APP : Slice ReConfiguration Request received");
2069
2070    DU_ALLOC_SHRABL_BUF(sliceReCfgReq, sizeof(MacSliceCfgReq));
2071    if(sliceReCfgReq == NULLP)
2072    {
2073       DU_LOG("\nERROR  -->  DU_APP : Memory allocation failed to BuildAndSendSliceReCfgReq");
2074       return RFAILED;
2075    }
2076    else
2077    {
2078       if(fillSliceCfgReCfgInfo(sliceReCfgReq, rrmPolicy, totalRrmPolicy, totalSliceCount) != ROK)
2079       {
2080          DU_LOG("\nERROR  -->  DU_APP: Failed to fill slice cfg request info");
2081          return RFAILED;
2082       }
2083       FILL_PST_DUAPP_TO_MAC(pst, EVENT_MAC_SLICE_RECFG_REQ);
2084
2085       DU_LOG("\nDEBUG  -->  DU_APP: Sending Slice ReCfg Request to MAC ");
2086       if( (*packMacSliceReCfgReqOpts[pst.selector])(&pst, sliceReCfgReq) == RFAILED)
2087       {
2088          DU_LOG("\nERROR  -->  DU_APP: Failed to send Slice ReCfg Req to MAC");
2089          DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL, sliceReCfgReq, sizeof(MacSliceCfgReq));
2090       }
2091    }
2092    return ROK;  
2093 }
2094 /*******************************************************************
2095  *
2096  * @brief process the slice ReCfg rsp received from MAC
2097  *
2098  * @details
2099  *
2100  *    Function : DuProcMacSliceReCfgRsp
2101  *
2102  *    Functionality: process the slice ReCfg rsp received from MAC
2103  *
2104  * @params[in] Post structure, MacSliceCfgRsp  *ReCfgRsp
2105  *             
2106  * @return ROK     - success
2107  *         RFAILED - failure
2108  *
2109  **********************************************************************/
2110 uint8_t DuProcMacSliceReCfgRsp(Pst *pst,  MacSliceCfgRsp *reCfgRsp)
2111 {
2112    uint8_t cfgIdx = 0, sliceIdx =0;
2113    
2114    if(reCfgRsp)
2115    {
2116       if(reCfgRsp->listOfSliceCfgRsp)
2117       {
2118          for(cfgIdx = 0; cfgIdx < reCfgRsp->numSliceCfgRsp; cfgIdx++)
2119          {
2120             if(reCfgRsp->listOfSliceCfgRsp[cfgIdx]->rsp == MAC_DU_APP_RSP_OK)
2121             {
2122                duCb.sliceState = SLICE_RECONFIGURED; 
2123             }
2124             else
2125             {
2126                DU_LOG("\nERROR  -->  DU_APP : Slice not available");
2127             }
2128          }
2129          DU_LOG("\nINFO  --> DU_APP : Slice ReCOnfiguration response received");
2130       }
2131       duFreeSliceCfgRsp(pst, reCfgRsp);
2132    }
2133    duFreeTempSliceCfg();
2134    return ROK;
2135 }
2136
2137 /*******************************************************************
2138 *
2139 * @brief Handles received Slice Metrics from RLC and forward it to O1 
2140 *
2141 * @details
2142 *
2143 *    Function : DuProcRlcSliceMetrics
2144 *
2145 *    Functionality:
2146 *      Handles received Slice Metrics from RLC and forward it to O1
2147 *
2148 * @params[in] Post structure pointer
2149 *              SlicePmList *sliceStats
2150 *
2151 * @return ROK     - success
2152 *         RFAILED - failure
2153 *
2154 * ****************************************************************/
2155 uint8_t DuProcRlcSliceMetrics(Pst *pst, SlicePmList *sliceStats)
2156 {
2157     uint8_t sliceRecord = 0;
2158
2159     DU_LOG("\nDEBUG  -->  DU APP : Received Slice Metrics");
2160     if(sliceStats == NULLP)
2161     {
2162        DU_LOG("\nERROR  -->  DU APP : Empty Metrics");
2163        return RFAILED;
2164     }
2165     
2166     for(sliceRecord = 0; sliceRecord < sliceStats->numSlice; sliceRecord++)
2167     {
2168        DU_LOG("\nINFO   -->  DU_APP: SliceIndx:%d, DlTput %.5lf, UlTput:%.5lf", sliceStats->sliceRecord[sliceRecord].networkSliceIdentifier,\
2169                         sliceStats->sliceRecord[sliceRecord].ThpDl, sliceStats->sliceRecord[sliceRecord].ThpUl);
2170     }
2171 #ifdef O1_ENABLE
2172     if(sliceStats)
2173     {
2174        sendSliceMetric((SliceMetricList*) sliceStats);
2175     }
2176 #endif
2177
2178    DU_FREE_SHRABL_BUF(pst->region, pst->pool,sliceStats->sliceRecord, (sliceStats->numSlice) * (sizeof(SlicePm)));
2179    DU_FREE_SHRABL_BUF(pst->region, pst->pool,sliceStats, sizeof(SlicePmList));
2180
2181    return ROK;
2182 }
2183
2184 /**********************************************************************
2185   End of file
2186  **********************************************************************/