1 /*******************************************************************************
2 ################################################################################
3 # Copyright (c) [2017-2019] [Radisys] #
5 # Licensed under the Apache License, Version 2.0 (the "License"); #
6 # you may not use this file except in compliance with the License. #
7 # You may obtain a copy of the License at #
9 # http://www.apache.org/licenses/LICENSE-2.0 #
11 # Unless required by applicable law or agreed to in writing, software #
12 # distributed under the License is distributed on an "AS IS" BASIS, #
13 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. #
14 # See the License for the specific language governing permissions and #
15 # limitations under the License. #
16 ################################################################################
17 *******************************************************************************/
19 /* This file contains message handling functionality for DU APP */
20 #include "common_def.h"
28 #include "du_app_mac_inf.h"
29 #include "du_app_rlc_inf.h"
30 #include "du_e2ap_mgr.h"
32 #include "du_app_rlc_inf.h"
36 #include "du_f1ap_msg_hdl.h"
37 #include "du_ue_mgr.h"
41 #include "du_cell_mgr.h"
45 #include "AlarmInterface.h"
46 #include "CmInterface.h"
47 #include "PmInterface.h"
52 uint8_t numRlcDlSaps = 0;
54 uint8_t numRlcMacSaps = 0;
56 uint8_t macCfgInst = 0;
58 DuCfgParams duCfgParam;
59 uint8_t packRlcConfigReq(Pst *pst, RlcMngmt *cfg);
60 uint8_t cmPkLkwCntrlReq(Pst *pst, RlcMngmt *cfg);
61 uint8_t cmPkLrgCfgReq(Pst *pst, RgMngmt *cfg);
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);
68 packMacCellCfgReq packMacCellCfgOpts[] =
70 packMacCellCfg, /* packing for loosely coupled */
71 MacProcCellCfgReq, /* packing for tightly coupled */
72 packMacCellCfg, /* packing for light weight loosly coupled */
75 DuMacCellStart packMacCellStartOpts[] =
77 packMacCellStart, /* Loose coupling */
78 MacProcCellStart, /* TIght coupling */
79 packMacCellStart /* Light weight-loose coupling */
82 DuMacCellStop packMacCellStopOpts[] =
84 packMacCellStop, /* Loose coupling */
85 MacProcCellStop, /* TIght coupling */
86 packMacCellStop /* Light weight-loose coupling */
89 DuMacSliceCfgReq packMacSliceCfgReqOpts[] =
91 packDuMacSliceCfgReq, /* Loose coupling */
92 MacProcSliceCfgReq, /* TIght coupling */
93 packDuMacSliceCfgReq /* Light weight-loose coupling */
97 DuMacSliceRecfgReq packMacSliceRecfgReqOpts[] =
99 packDuMacSliceRecfgReq, /* Loose coupling */
100 MacProcSliceRecfgReq, /* TIght coupling */
101 packDuMacSliceRecfgReq /* Light weight-loose coupling */
103 /**************************************************************************
104 * @brief Function to fill configs required by RLC
108 * Function : duBuildRlcCfg
111 * Initiates general Configs towards RLC
113 * @param[in] Inst Specifies if RLC UL or RLC DL instance
114 * @return ROK - success
117 ***************************************************************************/
118 uint8_t duBuildRlcCfg(Inst inst)
121 RlcGenCfg *genCfg = NULLP;
124 DU_SET_ZERO(&rlcMngmt, sizeof(RlcMngmt));
125 DU_SET_ZERO(&pst, sizeof(Pst));
127 genCfg = &(rlcMngmt.t.cfg.s.gen);
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;
136 genCfg->maxRguSaps = DEFAULT_CELLS;
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;
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;
170 pst.selector = ODU_SELECTOR_LC;
171 pst.srcEnt = ENTDUAPP;
174 pst.dstProcId = DU_PROC;
175 pst.srcProcId = DU_PROC;
176 pst.region = duCb.init.region;
178 DU_LOG("\nDEBUG --> DU_APP : RLC Gen Cfg Req sent for inst %d", inst);
180 /* Send the request to RLC */
181 packRlcConfigReq(&pst, &rlcMngmt);
186 /**************************************************************************
187 * @brief Function to fill configs required by RLC
191 * Function : duBuildRlcLsapCfg
194 * Initiates general Configs towards RLC
196 * @param[in] Inst Specifies if RLC UL or RLC DL instance
197 * @return ROK - success
200 ***************************************************************************/
201 uint8_t duBuildRlcLsapCfg(Ent ent, Inst inst, uint8_t lsapInst)
205 RlcSapCfg *lSap = NULLP;
208 DU_SET_ZERO(&rlcMngmt, sizeof(RlcMngmt));
209 DU_SET_ZERO(&pst, sizeof(Pst));
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;
217 rlcMngmt.hdr.response.mem.pool = RLC_POOL;
220 pst.selector = ODU_SELECTOR_LC;
221 pst.srcEnt = ENTDUAPP;
223 pst.dstProcId = DU_PROC;
225 pst.srcProcId = DU_PROC;
226 pst.region = duCb.init.region;
227 lSap = &(rlcMngmt.t.cfg.s.sap);
229 lSap->mem.region = (inst == RLC_UL_INST) ?
230 RLC_UL_MEM_REGION:RLC_DL_MEM_REGION;
231 lSap->mem.pool = RLC_POOL;
233 lSap->bndTmrIntvl = 10;
234 lSap->priority = PRIOR0;
235 lSap->route = RTESPEC;
238 lSap->procId = DU_PROC;
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);
249 lSap->procId = DU_PROC;
251 lSap->inst = (inst == RLC_UL_INST) ?
252 RLC_DL_INST : RLC_UL_INST;
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);
259 packRlcConfigReq(&pst, &rlcMngmt);
263 /**************************************************************************
264 * @brief Function to fill configs required by RLC
268 * Function : duBuildRlcUsapCfg
271 * Initiates general Configs towards RLC
273 * @param[in] Inst Specifies if RLC UL or RLC DL instance
274 * @return ROK - success
277 ***************************************************************************/
278 uint8_t duBuildRlcUsapCfg(uint8_t elemId, Ent ent, Inst inst)
281 RlcSapCfg *uSap = NULLP;
284 DU_SET_ZERO(&rlcMngmt, sizeof(RlcMngmt));
285 DU_SET_ZERO(&pst, sizeof(Pst));
287 uSap = &(rlcMngmt.t.cfg.s.sap);
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;
295 uSap->procId = DU_PROC;
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;
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;
312 rlcMngmt.hdr.response.mem.pool = RLC_POOL;
315 pst.selector = ODU_SELECTOR_LC;
316 pst.srcEnt = ENTDUAPP;
318 pst.dstProcId = DU_PROC;
320 pst.srcProcId = DU_PROC;
321 pst.region = duCb.init.region;
323 DU_LOG("\nDEBUG --> DU_APP : RLC Kwu Upper Sap Cfg Req sent for inst %d", inst);
324 packRlcConfigReq(&pst, &rlcMngmt);
329 /**************************************************************************
330 * @brief Function to populate internal DS of DU APP
334 * Function : duProcCfgComplete
337 * Populates internal data structures of DU APP after
338 * receiving configurations.
341 * @return ROK - success
344 ***************************************************************************/
345 uint8_t duProcCfgComplete()
349 for(idx=0; idx< DEFAULT_CELLS; idx++)
351 DuCellCb *cell = NULLP;
352 DU_ALLOC(cell, sizeof(DuCellCb));
355 DU_LOG("\nERROR --> DU_APP : Memory Allocation failed in duProcCfgComplete");
361 memset(cell, 0, sizeof(DuCellCb));
362 cell->cellId = NR_CELL_ID; //++cellId;
363 memset(&cell->cellInfo.nrEcgi.plmn, 0, sizeof(Plmn));
364 cell->cellInfo.nrEcgi.plmn.mcc[0] = duCfgParam.srvdCellLst[0].duCellInfo.cellInfo.srvdPlmn[0].plmn.mcc[0];
365 cell->cellInfo.nrEcgi.plmn.mcc[1] = duCfgParam.srvdCellLst[0].duCellInfo.cellInfo.srvdPlmn[0].plmn.mcc[1];
366 cell->cellInfo.nrEcgi.plmn.mcc[2] = duCfgParam.srvdCellLst[0].duCellInfo.cellInfo.srvdPlmn[0].plmn.mcc[2];
367 cell->cellInfo.nrEcgi.plmn.mnc[0] = duCfgParam.srvdCellLst[0].duCellInfo.cellInfo.srvdPlmn[0].plmn.mnc[0];
368 cell->cellInfo.nrEcgi.plmn.mnc[1] = duCfgParam.srvdCellLst[0].duCellInfo.cellInfo.srvdPlmn[0].plmn.mnc[1];
369 cell->cellInfo.nrEcgi.plmn.mnc[2] = duCfgParam.srvdCellLst[0].duCellInfo.cellInfo.srvdPlmn[0].plmn.mnc[2];
370 cell->cellInfo.nrEcgi.cellId = cell->cellId;
371 cell->cellInfo.nrPci = duCfgParam.srvdCellLst[0].duCellInfo.cellInfo.nrPci;
372 cell->cellInfo.fiveGsTac = duCfgParam.srvdCellLst[0].duCellInfo.tac;
373 memset(&cell->cellInfo.plmn[idx1], 0, sizeof(Plmn));
374 for(idx1=0; idx1<MAX_PLMN; idx1++)
376 cell->cellInfo.plmn[idx1].mcc[0] = duCfgParam.srvdCellLst[0].duCellInfo.cellInfo.srvdPlmn[0].plmn.mcc[0];
377 cell->cellInfo.plmn[idx1].mcc[1] = duCfgParam.srvdCellLst[0].duCellInfo.cellInfo.srvdPlmn[0].plmn.mcc[1];
378 cell->cellInfo.plmn[idx1].mcc[2] = duCfgParam.srvdCellLst[0].duCellInfo.cellInfo.srvdPlmn[0].plmn.mcc[2];
379 cell->cellInfo.plmn[idx1].mnc[0] = duCfgParam.srvdCellLst[0].duCellInfo.cellInfo.srvdPlmn[0].plmn.mnc[0];
380 cell->cellInfo.plmn[idx1].mnc[1] = duCfgParam.srvdCellLst[0].duCellInfo.cellInfo.srvdPlmn[0].plmn.mnc[1];
381 cell->cellInfo.plmn[idx1].mnc[2] = duCfgParam.srvdCellLst[0].duCellInfo.cellInfo.srvdPlmn[0].plmn.mnc[2];
383 cell->cellInfo.maxUe = duCfgParam.maxUe;
384 cell->cellStatus = CELL_OUT_OF_SERVICE;
385 gCellStatus = CELL_DOWN;
386 duCb.cfgCellLst[duCb.numCfgCells] = cell;
392 //Start layer configs
393 ret = duSendRlcUlCfg();
397 /**************************************************************************
398 * @brief Function to invoke DU Layer Configs
402 * Function : duSendRlcUlCfg
405 * Initiates Configs towards layers of DU
408 * @return ROK - success
411 ***************************************************************************/
412 uint8_t duSendRlcUlCfg()
416 duBuildRlcCfg((Inst)RLC_UL_INST);
417 for(cellIdx = 0; cellIdx < DEFAULT_CELLS; cellIdx++)
419 duBuildRlcLsapCfg(ENTMAC, (Inst)RLC_UL_INST, cellIdx);
421 duBuildRlcLsapCfg(ENTRLC, (Inst)RLC_UL_INST, 0);
426 /**************************************************************************
427 * @brief Function to invoke DU Layer Configs
431 * Function : duSendRlcDlCfg
434 * Initiates Configs towards layers of DU
437 * @return ROK - success
440 ***************************************************************************/
441 uint8_t duSendRlcDlCfg()
445 duBuildRlcCfg((Inst)RLC_DL_INST);
446 duBuildRlcUsapCfg(STUDXSAP, ENTRLC, (Inst)RLC_DL_INST);
447 for(cellIdx = 0; cellIdx < DEFAULT_CELLS; cellIdx++)
449 duBuildRlcLsapCfg(ENTMAC, (Inst)RLC_DL_INST, cellIdx);
454 /**************************************************************************
455 * @brief Function to handle Config Confirm from RLC
459 * Function : DuHdlRlcCfgComplete
462 * Handles Gen Config Confirm from RLC
464 * @param[in] Pst *pst, Post structure of the primitive.
465 * @param[in] RlcMngmt *cfm, Unpacked primitive info received from RLC
466 * @return ROK - success
469 ***************************************************************************/
470 uint8_t DuHdlRlcCfgComplete(Pst *pst, RlcMngmt *cfm)
473 if (pst->srcInst == RLC_UL_INST)
475 ret = duProcRlcUlCfgComplete(pst, cfm);
479 ret = duProcRlcDlCfgComplete(pst, cfm);
484 /**************************************************************************
485 * @brief Function to handle Control Config Confirm from RLC
489 * Function : duHdlRlcCntrlCfgComplete
492 * Handles Control Config Confirm from RLC
494 * @param[in] Pst *pst, Post structure of the primitive.
495 * @param[in] RlcMngmt *cfm, Unpacked primitive info received from RLC
496 * @return ROK - success
499 ***************************************************************************/
500 uint8_t duHdlRlcCntrlCfgComplete(Pst *pst, RlcMngmt *cntrl)
504 if (cntrl->cfm.status == LCM_PRIM_OK)
506 switch (cntrl->hdr.elmId.elmnt)
510 if (pst->srcInst == RLC_DL_INST)
512 DU_LOG("\nDEBUG --> DU_APP : BIND OF RLC DL TO MAC (RGU) SAP SUCCESSFUL");
514 if(macCfgInst < DEFAULT_CELLS)
517 duBindUnbindRlcToMacSap((Inst) RLC_DL_INST, ABND);
521 duBindUnbindRlcToMacSap((Inst) RLC_UL_INST, ABND);
526 DU_LOG("\nDEBUG --> DU_APP : BIND OF RLC UL TO MAC (RGU) SAP SUCCESSFUL");
528 if(macCfgInst < DEFAULT_CELLS)
530 duBindUnbindRlcToMacSap((Inst) RLC_UL_INST, ABND);
544 /**************************************************************************
545 * @brief Function to handle Config Confirm from RLC UL
549 * Function : duHdlRlcUlCfgComplete
552 * Handles Config Confirm from RLC UL
554 * @param[in] Pst *pst, Post structure of the primitive.
555 * @param[in] RlcMngmt *cfm, Unpacked primitive info received from RLC UL
556 * @return ROK - success
559 ***************************************************************************/
560 uint8_t duProcRlcUlCfgComplete(Pst *pst, RlcMngmt *cfm)
564 DU_LOG("\nDEBUG --> DU_APP : RLC UL Cfg Status %d", cfm->cfm.status);
565 if (cfm->cfm.status == LCM_PRIM_OK)
567 switch(cfm->hdr.elmId.elmnt)
571 rlcUlCfg |= RLC_GEN_CFG;
577 if(numRlcMacSaps == DEFAULT_CELLS)
579 rlcUlCfg |= RLC_MAC_SAP_CFG;
586 rlcUlCfg |= RLC_UDX_SAP_CFG;
593 DU_LOG("\nDEBUG --> DU_APP : RLC UL Cfg Cfm received for the element %d ",cfm->hdr.elmId.elmnt);
594 if(rlcUlCfg == DU_RLC_UL_CONFIGURED)
598 //Start configuration of RLC DL
605 DU_LOG("\nERROR --> DU_APP : Config confirm NOK from RLC UL");
611 /**************************************************************************
612 * @brief Function to handle Config Confirm from RLC DL
616 * Function : duHdlRlcDlCfgComplete
619 * Handles Config Confirm from RLC DL
621 * @param[in] Pst *pst, Post structure of the primitive.
622 * @param[in] RlcMngmt *cfm, Unpacked primitive info received from RLC DL
623 * @return ROK - success
626 ***************************************************************************/
627 uint8_t duProcRlcDlCfgComplete(Pst *pst, RlcMngmt *cfm)
629 DU_LOG("\nDEBUG --> DU_APP : RLC DL Cfg Status %d", cfm->cfm.status);
630 if (cfm->cfm.status == LCM_PRIM_OK)
632 switch(cfm->hdr.elmId.elmnt)
636 rlcDlCfg |= RLC_GEN_CFG;
642 if(numRlcMacSaps == DEFAULT_CELLS)
644 rlcDlCfg |= RLC_MAC_SAP_CFG;
651 rlcDlCfg |= RLC_UDX_SAP_CFG;
659 DU_LOG("\nDEBUG --> DU_APP : RLC DL Cfg Cfm received for the element %d ",cfm->hdr.elmId.elmnt);
660 if(rlcDlCfg == DU_RLC_DL_CONFIGURED)
663 //Start configuration of MAC
670 DU_LOG("\nERROR --> DU_APP : Config confirm NOK from RLC DL");
675 /**************************************************************************
676 * @brief Function to send configs to MAC
680 * Function : duSendMacCfg
683 * Initiates Configs towards MAC layer
686 * @return ROK - success
689 ***************************************************************************/
690 uint8_t duSendMacCfg()
693 duBuildMacUsapCfg(RLC_UL_INST);
694 duBuildMacUsapCfg(RLC_DL_INST);
699 /**************************************************************************
700 * @brief Function to fill gen config required by MAC
704 * Function : duBuildMacGenCfg
707 * Initiates general Configs towards MAC
710 * @return ROK - success
713 ***************************************************************************/
714 uint8_t duBuildMacGenCfg()
717 RgGenCfg *genCfg=NULLP;
720 DU_SET_ZERO(&pst, sizeof(Pst));
721 DU_SET_ZERO(&rgMngmt, sizeof(RgMngmt));
723 genCfg = &(rgMngmt.t.cfg.s.genCfg);
725 /*----------- Fill General Configuration Parameters ---------*/
726 genCfg->mem.region = MAC_MEM_REGION;
727 genCfg->mem.pool = MAC_POOL;
729 genCfg->numRguSaps = 2;
731 genCfg->lmPst.dstProcId = DU_PROC;
732 genCfg->lmPst.srcProcId = DU_PROC;
733 genCfg->lmPst.dstEnt = ENTDUAPP;
734 genCfg->lmPst.dstInst = 0;
735 genCfg->lmPst.srcEnt = ENTMAC;
736 genCfg->lmPst.srcInst = macCfgInst;
737 genCfg->lmPst.prior = PRIOR0;
738 genCfg->lmPst.route = RTESPEC;
739 genCfg->lmPst.region = MAC_MEM_REGION;
740 genCfg->lmPst.pool = MAC_POOL;
741 genCfg->lmPst.selector = ODU_SELECTOR_LC;
744 rgMngmt.hdr.msgType = TCFG;
745 rgMngmt.hdr.msgLen = 0;
746 rgMngmt.hdr.entId.ent = ENTMAC;
747 rgMngmt.hdr.entId.inst = (Inst)0;
748 rgMngmt.hdr.elmId.elmnt = STGEN;
749 rgMngmt.hdr.seqNmb = 0;
750 rgMngmt.hdr.version = 0;
751 rgMngmt.hdr.transId = 0;
753 rgMngmt.hdr.response.prior = PRIOR0;
754 rgMngmt.hdr.response.route = RTESPEC;
755 rgMngmt.hdr.response.mem.region = MAC_MEM_REGION;
756 rgMngmt.hdr.response.mem.pool = MAC_POOL;
757 rgMngmt.hdr.response.selector = ODU_SELECTOR_LC;
760 pst.selector = ODU_SELECTOR_LC;
761 pst.srcEnt = ENTDUAPP;
763 pst.dstInst = macCfgInst;
764 pst.dstProcId = DU_PROC;
765 pst.srcProcId = DU_PROC;
766 pst.region = duCb.init.region;
768 DU_LOG("\nDEBUG --> DU_APP : MAC Gen Cfg Req sent");
770 /* Send the request to MAC */
771 cmPkLrgCfgReq(&pst, &rgMngmt);
776 /**************************************************************************
777 * @brief Function to fill USAP config required by MAC
781 * Function : duBuildMacUsapCfg
784 * Initiates USAP Configs towards MAC
786 * @param[in] SpId Specifies if RLC UL or RLC DL instance
787 * @return ROK - success
790 ***************************************************************************/
791 uint8_t duBuildMacUsapCfg(SpId sapId)
794 RgUpSapCfg *uSap = NULLP;
797 DU_SET_ZERO(&pst, sizeof(Pst));
798 DU_SET_ZERO(&rgMngmt, sizeof(RgMngmt));
800 uSap = &(rgMngmt.t.cfg.s.rguSap);
802 uSap->mem.region = MAC_MEM_REGION;
803 uSap->mem.pool = MAC_POOL;
806 uSap->procId = DU_PROC;
809 uSap->prior = PRIOR0;
810 uSap->route = RTESPEC;
811 uSap->selector = ODU_SELECTOR_LC ;
814 rgMngmt.hdr.msgType = TCFG;
815 rgMngmt.hdr.entId.ent = ENTMAC;
816 rgMngmt.hdr.entId.inst = (Inst)0;
817 rgMngmt.hdr.elmId.elmnt = STRGUSAP;
818 rgMngmt.hdr.response.mem.region = MAC_MEM_REGION;
819 rgMngmt.hdr.response.mem.pool = MAC_POOL;
822 pst.selector = ODU_SELECTOR_LC;
823 pst.srcEnt = ENTDUAPP;
825 pst.dstInst = macCfgInst;
826 pst.dstProcId = DU_PROC;
827 pst.srcProcId = DU_PROC;
828 pst.region = duCb.init.region;
830 DU_LOG("\nDEBUG --> DU_APP : MAC Rgu USap Cfg Req sent");
832 /* Send the request to MAC */
833 cmPkLrgCfgReq(&pst, &rgMngmt);
838 /**************************************************************************
839 * @brief Function to handle Config Confirm from MAC
843 * Function : duHdlMacCfgComplete
846 * Handles Gen Config Confirm from MAC
848 * @param[in] Pst *pst, Post structure of the primitive.
849 * @param[in] RgMngmt *cfm, Unpacked primitive info received from MAC
850 * @return ROK - success
853 ***************************************************************************/
854 uint8_t duHdlMacCfgComplete(Pst *pst, RgMngmt *cfm)
858 if (cfm->cfm.status == LCM_PRIM_OK)
860 switch (cfm->hdr.elmId.elmnt)
864 macCfg |= MAC_GEN_CFG;
869 macCfg |= MAC_SAP_CFG;
876 DU_LOG("\nDEBUG --> DU_APP : MAC Cfg Cfm received for the element %d ",cfm->hdr.elmId.elmnt);
877 if(macCfg == MAC_CONFIGURED && numRlcMacSaps == MAX_MAC_SAP)
880 DU_LOG("\nDEBUG --> DU_APP : Completed sending Configs");
882 duBindUnbindRlcToMacSap(RLC_DL_INST, ABND);
888 DU_LOG("\nERROR --> DU_APP : Config confirm NOK from MAC");
894 /**************************************************************************
895 * @brief Function to bind/unbind RLC to MAC SAP
899 * Function : duBindUnbindRlcToMacSap
902 * Initiates Bind/Unbind from RLC to MAC
904 * @param[in] Inst Specifies if RLC UL or RLC DL instance
905 * @param[in] action Specifies if action is bind or unbind
906 * @return ROK - success
909 ***************************************************************************/
910 uint8_t duBindUnbindRlcToMacSap(uint8_t inst, uint8_t action)
912 RlcCntrl *cntrl = NULLP;
917 DU_SET_ZERO(&rlcMngmt, sizeof(RlcMngmt));
918 DU_SET_ZERO(&pst, sizeof(Pst));
922 DU_LOG("\nDEBUG --> DU_APP : Cntrl Req to RLC inst %d to bind MAC sap", inst);
926 DU_LOG("\nDEBUG --> DU_APP : Cntrl Req to RLC inst %d to unbind MAC sap", inst);
928 cntrl = &(rlcMngmt.t.cntrl);
930 cntrl->action = action;
931 cntrl->subAction = DU_ZERO_VAL;
932 cntrl->s.sapCntrl.suId = macCfgInst;
933 cntrl->s.sapCntrl.spId = inst;
936 rlcMngmt.hdr.msgType = TCNTRL;
937 rlcMngmt.hdr.entId.ent = ENTRLC;
938 rlcMngmt.hdr.entId.inst = inst;
939 rlcMngmt.hdr.elmId.elmnt = 186; /* ambiguous defines in lkw.h and lrg.h so direct hardcoded*/
940 rlcMngmt.hdr.response.mem.region = (inst == RLC_UL_INST) ?
941 RLC_UL_MEM_REGION:RLC_DL_MEM_REGION;
942 rlcMngmt.hdr.response.mem.pool = RLC_POOL;
945 pst.selector = ODU_SELECTOR_LC;
946 pst.srcEnt = ENTDUAPP;
948 pst.dstProcId = DU_PROC;
950 pst.srcProcId = DU_PROC;
951 pst.region = duCb.init.region;
953 cmPkLkwCntrlReq(&pst, &rlcMngmt);
957 /*******************************************************************
959 * @brief Handles SCTP notifications
963 * Function : duSctpNtfyHdl
966 * Handles SCTP notification
968 * @params[in] Message Buffer
971 * @return ROK - success
974 * ****************************************************************/
976 uint8_t duSctpNtfyHdl(Buffer *mBuf, CmInetSctpNotification *ntfy)
978 if(f1Params.assocId == ntfy->u.assocChange.assocId)
980 if(BuildAndSendF1SetupReq() != ROK)
985 else if(ricParams.assocId == ntfy->u.assocChange.assocId)
991 DU_LOG("\nERROR --> DU_APP : Invalid assocId %d received", ntfy->u.assocChange.assocId);
997 /*******************************************************************
999 * @brief Fills Pst struct for ENTEGTP
1003 * Function : duFillEgtpPst
1006 * Fills Pst struct for ENTEGTP
1009 * @return ROK - success
1012 * ****************************************************************/
1013 uint8_t duFillEgtpPst(Pst *pst, Event event)
1015 memset(pst, 0, sizeof(Pst));
1016 pst->srcEnt = (Ent)ENTDUAPP;
1017 pst->srcInst = (Inst)DU_INST;
1018 pst->srcProcId = DU_PROC;
1019 pst->dstEnt = (Ent)ENTEGTP;
1020 pst->dstInst = (Inst)EGTP_INST;
1021 pst->dstProcId = pst->srcProcId;
1023 pst->selector = ODU_SELECTOR_LC;
1030 /*******************************************************************
1032 * @brief Function to configure EGTP
1036 * Function : duBuildEgtpCfgReq
1039 * Function to configure EGTP
1042 * @return ROK - success
1045 * ****************************************************************/
1047 uint8_t duBuildEgtpCfgReq()
1052 DU_LOG("\nDEBUG --> DU_APP : Sending EGTP config request");
1054 memset(&egtpCfg, 0, sizeof(EgtpConfig));
1055 memcpy(&egtpCfg, &duCfgParam.egtpParams, sizeof(EgtpConfig));
1057 duFillEgtpPst(&pst, EVTCFGREQ);
1058 packEgtpCfgReq(&pst, egtpCfg);
1063 /*******************************************************************
1065 * @brief Function to configure EGTP
1069 * Function : duBuildEgtpCfgReq
1072 * Function to configure EGTP
1075 * @return ROK - success
1078 * ****************************************************************/
1079 uint8_t duHdlEgtpCfgComplete(CmStatus cfm)
1083 if(cfm.status == LCM_PRIM_OK)
1085 DU_LOG("\nDEBUG --> DU_APP : EGTP configuraton complete");
1086 duSendEgtpSrvOpenReq();
1090 DU_LOG("\nERROR --> DU_APP : EGTP configuraton failed");
1097 /*******************************************************************
1099 * @brief Sends server open request to EGTP
1103 * Function : duSendEgtpSrvOpenReq
1106 * Sends server open request to EGTP
1109 * @return ROK - success
1112 * ****************************************************************/
1114 uint8_t duSendEgtpSrvOpenReq()
1118 DU_LOG("\nDEBUG --> DU_APP : Sending EGTP server open request");
1120 duFillEgtpPst(&pst, EVTSRVOPENREQ);
1121 packEgtpSrvOpenReq(&pst);
1126 /*******************************************************************
1128 * @brief Handles server open confirmation
1132 * Function : duHdlEgtpSrvOpenComplete
1135 * Handles server open confirmation
1138 * @return ROK - success
1141 *****************************************************************/
1143 uint8_t duHdlEgtpSrvOpenComplete(CmStatus cfm)
1147 if(cfm.status == LCM_PRIM_OK)
1149 DU_LOG("\nDEBUG --> DU_APP : EGTP server opened successfully");
1153 DU_LOG("\nERROR --> DU_APP : EGTP server opening failed");
1160 /*******************************************************************
1162 * @brief Sends tunnel management request
1166 * Function : duSendEgtpTnlMgmtReq
1169 * Builds and sends tunnel management request to EGTP
1171 * @params[in] Action
1172 * Local tunnel endpoint id
1173 * Remote tunnel endpoint id
1174 * @return ROK - success
1177 * ****************************************************************/
1179 uint8_t duSendEgtpTnlMgmtReq(uint8_t action, uint32_t teIdTobeMod, GtpTnlCfg *ueCbTnlCfg)
1185 DU_LOG("\nDEBUG --> DU_APP : Sending EGTP tunnel management request for teId [%d]", ueCbTnlCfg->teId);
1187 /* ADD/MOD/DEL per tunnel */
1188 tnlEvt.action = action;
1189 tnlEvt.remTeid = ueCbTnlCfg->teId;
1190 if(action != EGTP_TNL_MGMT_ADD)
1192 tnlEvt.lclTeid = teIdTobeMod;
1196 tnlEvt.lclTeid = ueCbTnlCfg->teId;
1198 duFillEgtpPst(&pst, EVTTNLMGMTREQ);
1199 ret = egtpTnlMgmtReq(&pst, tnlEvt);
1203 /*******************************************************************
1205 * @brief Handles Tunnel management confirm
1209 * Function : duHdlEgtpTnlMgmtCfm
1212 * Handles tunnel management confirm received from Egtp
1214 * @params[in] Tunnel Event
1215 * @return ROK - success
1218 * ****************************************************************/
1219 uint8_t duHdlEgtpTnlMgmtCfm(EgtpTnlEvt tnlEvtCfm)
1223 if(tnlEvtCfm.cfmStatus.status == LCM_PRIM_OK)
1225 DU_LOG("\nDEBUG --> DU_APP: Tunnel management confirm OK");
1229 DU_LOG("\nERROR --> DU_APP: Tunnel management failed");
1236 /*******************************************************************
1238 * @brief Sends UL user data over to EGTP
1242 * Function : duSendEgtpDatInd
1244 * Functionality: Sends UL user data over to EGTP
1246 * @params[in] UL data buffer
1247 * @return ROK - success
1250 * ****************************************************************/
1251 uint8_t duSendEgtpDatInd(Buffer *mBuf)
1255 /* Fill EGTP header */
1256 egtpMsg.msgHdr.msgType = EGTPU_MSG_GPDU;
1257 egtpMsg.msgHdr.nPdu.pres = FALSE;
1258 egtpMsg.msgHdr.seqNum.pres = FALSE;
1259 egtpMsg.msgHdr.extHdr.udpPort.pres = FALSE;
1260 egtpMsg.msgHdr.extHdr.pdcpNmb.pres = FALSE;
1261 egtpMsg.msgHdr.teId = 1;
1264 egtpHdlDatInd(egtpMsg);
1270 /**************************************************************************
1271 * @brief Function to send configs to SCH
1275 * Function : duSendSchCfg
1278 * Sends general config to Scheduler via MAC layer
1281 * @return ROK - success
1284 ***************************************************************************/
1285 uint8_t duSendSchCfg()
1288 RgSchInstCfg *cfg = NULLP;
1291 DU_SET_ZERO(&pst, sizeof(Pst));
1292 DU_SET_ZERO(&rgMngmt, sizeof(RgMngmt));
1294 cfg = &(rgMngmt.t.cfg.s.schInstCfg);
1296 /* Filling of Instance Id */
1297 cfg->instId = DEFAULT_CELLS + 1;
1298 /* Filling of Gen config */
1299 cfg->genCfg.mem.region = MAC_MEM_REGION;
1300 cfg->genCfg.mem.pool = MAC_POOL;
1301 cfg->genCfg.tmrRes = 10;
1304 cfg->genCfg.forceCntrlSrbBoOnPCel = FALSE;
1305 cfg->genCfg.isSCellActDeactAlgoEnable = TRUE;
1307 cfg->genCfg.startCellId = 1;
1308 cfg->genCfg.lmPst.dstProcId = DU_PROC;
1309 cfg->genCfg.lmPst.srcProcId = DU_PROC;
1310 cfg->genCfg.lmPst.dstEnt = ENTDUAPP;
1311 cfg->genCfg.lmPst.dstInst = DU_INST;
1312 cfg->genCfg.lmPst.srcEnt = ENTMAC;
1313 cfg->genCfg.lmPst.srcInst = DEFAULT_CELLS + 1;
1314 cfg->genCfg.lmPst.prior = PRIOR0;
1315 cfg->genCfg.lmPst.route = RTESPEC;
1316 cfg->genCfg.lmPst.region = MAC_MEM_REGION;
1317 cfg->genCfg.lmPst.pool = MAC_POOL;
1318 cfg->genCfg.lmPst.selector = ODU_SELECTOR_LC;
1321 rgMngmt.hdr.msgType = TCFG;
1322 rgMngmt.hdr.entId.ent = ENTMAC;
1323 rgMngmt.hdr.entId.inst = DU_INST;
1324 rgMngmt.hdr.elmId.elmnt = STSCHINST;
1325 rgMngmt.hdr.response.mem.region = MAC_MEM_REGION;
1326 rgMngmt.hdr.response.mem.pool = MAC_POOL;
1329 pst.selector = ODU_SELECTOR_LC;
1330 pst.srcEnt = ENTDUAPP;
1331 pst.dstEnt = ENTMAC;
1332 pst.dstProcId = DU_PROC;
1333 pst.srcProcId = DU_PROC;
1334 pst.srcInst = DU_INST;
1336 pst.region = duCb.init.region;
1337 pst.event = (Event) EVTMACSCHGENCFGREQ;
1339 DU_LOG("\nDEBUG --> DU_APP : MAC Sch Cfg sent");
1341 /* Send the request to MAC */
1342 cmPkLrgSchCfgReq(&pst, &rgMngmt);
1348 /**************************************************************************
1349 * @brief Function to configure SCTP params and
1350 * responsible for F1 and E2 interfaces
1354 * Function : duLayerConfigComplete
1357 * Configures SCTP Params and responsible for handling
1358 * F1 and E2 interface.
1361 * @return ROK - success
1364 ***************************************************************************/
1365 uint8_t duLayerConfigComplete()
1369 DU_LOG("\nINFO --> DU_APP : Configuring all Layer is complete");
1371 if((ret = duSctpCfgReq(duCfgParam.sctpParams)) != ROK)
1373 DU_LOG("\nERROR --> DU_APP : Failed configuring Sctp Params");
1376 if((ret = duSctpAssocReq(F1_INTERFACE)) != ROK)
1378 DU_LOG("\nERROR --> DU_APP : Failed to send AssocReq F1");
1381 if((ret = duSctpAssocReq(E2_INTERFACE)) != ROK)
1383 DU_LOG("\nERROR --> DU_APP : Failed to send AssocReq E2");
1390 /**************************************************************************
1391 * @brief Function to handle SCH Config Confirm from MAC
1395 * Function : duHdlSchCfgComplete
1398 * Handles Scheduler Gen Config Confirm from MAC
1400 * @param[in] Pst *pst, Post structure of the primitive.
1401 * @param[in] RgMngmt *cfm, Unpacked primitive info received from MAC
1402 * @return ROK - success
1405 ***************************************************************************/
1406 uint8_t duHdlSchCfgComplete(Pst *pst, RgMngmt *cfm)
1408 if (cfm->cfm.status == LCM_PRIM_OK)
1410 switch (cfm->hdr.elmId.elmnt)
1414 DU_LOG("\nDEBUG --> DU_APP : Received SCH CFG CFM at DU APP");
1421 duLayerConfigComplete();
1422 duBuildEgtpCfgReq();
1426 /**************************************************************************
1427 * @brief Function to fill and send MacCellconfig
1431 * Function : duBuildAndSendMacCellCfg
1434 * Initiates MAC Configs towards MAC
1437 * @return ROK - success
1440 ***************************************************************************/
1441 uint8_t duBuildAndSendMacCellCfg(uint16_t cellId)
1444 MacCellCfg *duMacCellCfg = NULLP;
1446 DU_ALLOC_SHRABL_BUF(duMacCellCfg, sizeof(MacCellCfg));
1447 if(duMacCellCfg == NULLP)
1452 /* store the address in the duCellCb so that we can free on confirm msg */
1453 if(duCb.actvCellLst[cellId-1])
1454 duCb.actvCellLst[cellId-1]->duMacCellCfg = duMacCellCfg;
1457 DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL, duMacCellCfg, sizeof(MacCellCfg));
1461 /* copy the mac config structure from duCfgParams */
1462 memcpy(duMacCellCfg,&duCfgParam.macCellCfg,sizeof(MacCellCfg));
1465 FILL_PST_DUAPP_TO_MAC(pst, EVENT_MAC_CELL_CONFIG_REQ);
1467 /* Send MAC cell config to MAC */
1468 return (*packMacCellCfgOpts[pst.selector])(&pst, duMacCellCfg);
1471 /**************************************************************************
1472 * @brief Function to Handle MAC cell config confirm
1476 * Function : duHandleMacCellCfgCfm
1479 * Initiates general Configs towards MAC
1482 * @return ROK - success
1485 ***************************************************************************/
1486 uint8_t duHandleMacCellCfgCfm(Pst *pst, MacCellCfgCfm *macCellCfgCfm)
1488 uint8_t actvCellIdx = 0;
1491 for(actvCellIdx = 0; actvCellIdx < MAX_NUM_CELL; actvCellIdx++)
1493 if((duCb.actvCellLst[actvCellIdx]) && (macCellCfgCfm->cellId == duCb.actvCellLst[actvCellIdx]->cellId))
1495 duCb.actvCellLst[actvCellIdx]->duMacCellCfg = NULLP;
1498 if(macCellCfgCfm->rsp == ROK)
1500 /* Build and send GNB-DU config update */
1501 ret = BuildAndSendDUConfigUpdate(SERV_CELL_TO_MODIFY);
1503 /* Build and Send Cell Start Req to MAC */
1504 ret = duBuildAndSendMacCellStart();
1508 /* TODO : Action to be taken if cell configuration fails.
1509 * Should CU be informed? */
1511 DU_LOG("\nERROR --> DU_APP : Mac cell cfg failed");
1517 /*******************************************************************
1519 * @brief Builds and sends cell start request to MAC
1523 * Function : duBuildAndSendMacCellStart
1526 * Builds and sends cell start request to MAC
1529 * @return ROK - success
1532 * ****************************************************************/
1533 uint8_t duBuildAndSendMacCellStart()
1536 CellStartInfo *cellStart = NULL;
1538 DU_LOG("\nINFO --> DU APP : Building and Sending cell start request to MAC");
1540 /* Send Cell Start Request to MAC */
1541 DU_ALLOC_SHRABL_BUF(cellStart, sizeof(CellStartInfo));
1544 DU_LOG("\nERROR --> DU APP : Memory alloc failed while building cell start request");
1548 for(uint8_t id = 0; id < MAX_NUM_CELL; id++)
1550 if(duCb.actvCellLst[id])
1552 cellStart->cellId = duCb.actvCellLst[id]->cellId;
1555 FILL_PST_DUAPP_TO_MAC(pst, EVENT_MAC_CELL_START);
1557 return (*packMacCellStartOpts[pst.selector])(&pst, cellStart);
1563 /*******************************************************************
1565 * @brief Builds and sends cell stop request to MAC
1569 * Function : duBuildAndSendMacCellStop
1572 * Builds and sends cell stop request to MAC
1575 * @return ROK - success
1578 * ****************************************************************/
1579 uint8_t duBuildAndSendMacCellStop(uint16_t cellId)
1583 CellStopInfo *cellStop = NULL;
1585 DU_LOG("\nINFO --> DU APP : Building and Sending cell stop request to MAC");
1587 GET_CELL_IDX(cellId, cellIdx);
1588 if(duCb.actvCellLst[cellIdx] != NULLP)
1590 /* Send Cell Stop Request to MAC */
1591 DU_ALLOC_SHRABL_BUF(cellStop, sizeof(CellStopInfo));
1594 DU_LOG("\nERROR --> DU APP : Memory alloc failed while building cell stop request");
1597 memset(cellStop, 0, sizeof(CellStopInfo));
1598 cellStop->cellId = duCb.actvCellLst[cellIdx]->cellId;
1601 FILL_PST_DUAPP_TO_MAC(pst, EVENT_MAC_CELL_STOP);
1603 return (*packMacCellStopOpts[pst.selector])(&pst, cellStop);
1607 DU_LOG("\nERROR --> DU APP : duBuildAndSendMacCellStop(): cellId[%d] doesnot exists", cellId);
1613 /*******************************************************************
1615 * @brief Handles stop indication from MAC
1619 * Function : duHandleStopInd
1622 * Handles stop indication from MAC
1624 * @params[in] Post structure pointer
1625 * @return ROK - success
1628 * ****************************************************************/
1629 uint8_t duHandleStopInd(Pst *pst, OduCellId *cellId)
1631 DuCellCb *cellCb = NULLP;
1633 if(cellId->cellId <=0 || cellId->cellId > MAX_NUM_CELL)
1635 DU_LOG("\nERROR --> DU APP : Invalid Cell Id %d in duHandleStopInd()", cellId->cellId);
1638 if(duGetCellCb(cellId->cellId, &cellCb) != ROK)
1641 if((cellCb->cellStatus == ACTIVATED) || (cellCb->cellStatus == DELETION_IN_PROGRESS))
1643 DU_LOG("\nINFO --> DU APP : 5G-NR Cell %d is DOWN", cellId->cellId);
1644 if(sendCellDeleteReqToMac(cellId->cellId) == RFAILED)
1646 DU_LOG("\nERROR --> DU APP : duHandleStopInd(): Failed to send Cell delete req to MAC for\
1647 cellId[%d]", cellId->cellId);
1653 DU_LOG("\nINFO --> DU APP : Raise cell down alarm for cell id=%d", cellId->cellId);
1654 raiseCellAlrm(CELL_DOWN_ALARM_ID, cellId->cellId);
1655 setCellOpState(cellId->cellId, DISABLED, INACTIVE);
1659 if((pst->selector == ODU_SELECTOR_LWLC) || (pst->selector == ODU_SELECTOR_TC))
1660 DU_FREE_SHRABL_BUF(MAC_MEM_REGION, pst->pool, cellId, sizeof(OduCellId));
1662 cellCb->cellStatus = CELL_OUT_OF_SERVICE; //TODO: cell status must be set to OOS after all UE and cell cleanup which is not
1668 /*******************************************************************
1670 * @brief Handles slot indication from MAC
1674 * Function : duHandleUlCcchInd
1677 * Handles UL CCCH indication from MAC
1679 * @params[in] Post structure pointer
1680 * UL CCCH Ind pointer
1681 * @return ROK - success
1684 * ****************************************************************/
1685 uint8_t duHandleUlCcchInd(Pst *pst, UlCcchIndInfo *ulCcchIndInfo)
1688 DU_LOG("\nINFO --> DU APP : UL CCCH Indication received");
1690 return (duProcUlCcchInd(ulCcchIndInfo));
1693 /*******************************************************************
1695 * @brief Process UL RRC Message from RLC
1699 * Function : DuProcRlcUlRrcMsgTrans
1701 * Functionality: Process UL RRC Message from RLC
1703 * @params[in] Post structure
1704 * UL RRC Message Info
1705 * @return ROK - success
1708 * ****************************************************************/
1709 uint8_t DuProcRlcUlRrcMsgTrans(Pst *pst, RlcUlRrcMsgInfo *ulRrcMsgInfo)
1712 DuCellCb *cellCb = NULLP;
1713 DuUeCb *ueCb = NULLP;
1715 duGetCellCb(ulRrcMsgInfo->cellId, &cellCb);
1718 if(ulRrcMsgInfo->ueId > 0)
1720 if(cellCb->ueCb[ulRrcMsgInfo->ueId -1].gnbDuUeF1apId == ulRrcMsgInfo->ueId)
1721 ueCb = &cellCb->ueCb[ulRrcMsgInfo->ueId -1];
1725 /* If UL message is received for a UE in handover, it signifies that UE is now
1726 * attached to GNB. Hence marking this UE as active and requesting MAC to
1727 * release the dedicated RACH resources */
1728 if(ueCb->ueState == UE_HANDIN_IN_PROGRESS)
1730 ueCb->ueState = UE_ACTIVE;
1731 cellCb->numActvUes++;
1733 /* Release RACH resources */
1734 memset(&ueCb->cfraResource, 0, sizeof(MacCfraResource));
1735 if(duBuildAndSendRachRsrcRelToMac(ulRrcMsgInfo->cellId, ueCb) != ROK)
1737 DU_LOG("\nERROR --> DU_APP : DuProcRlcUlRrcMsgTrans() : Failed to send RACH resource release to MAC");
1741 if(BuildAndSendULRRCMessageTransfer(ueCb, ulRrcMsgInfo->lcId, ulRrcMsgInfo->msgLen, ulRrcMsgInfo->rrcMsg) != ROK)
1743 DU_LOG("\nERROR --> DU_APP : DuProcRlcUlRrcMsgTrans() : Failed to build and send UL RRC Message Transfer");
1749 DU_LOG("\nERROR --> DU_APP : DuProcRlcUlRrcMsgTrans() : UE ID [%d] not found", ulRrcMsgInfo->ueId);
1755 DU_LOG("\nERROR --> DU_APP : DuProcRlcUlRrcMsgTrans() : Invalid UE ID [%d]", ulRrcMsgInfo->ueId);
1761 DU_LOG("\nERROR --> DU_APP : DuProcRlcUlRrcMsgTrans() : Cell ID [%d] not found", ulRrcMsgInfo->cellId);
1765 DU_FREE_SHRABL_BUF(pst->region, pst->pool, ulRrcMsgInfo->rrcMsg, ulRrcMsgInfo->msgLen);
1766 DU_FREE_SHRABL_BUF(pst->region, pst->pool, ulRrcMsgInfo, sizeof(RlcUlRrcMsgInfo));
1770 /*******************************************************************
1772 * @brief Process RRC delivery report from RLC
1776 * Function : DuProcRlcRrcDeliveryReport
1778 * Functionality: Process RRC delivery Message from RLC
1780 * @params[in] Post structure
1781 * UL RRC Message Info
1782 * @return ROK - success
1785 * ****************************************************************/
1786 uint8_t DuProcRlcRrcDeliveryReport(Pst *pst, RrcDeliveryReport *rrcDeliveryReport)
1788 DuCellCb *cellCb = NULLP;
1790 uint8_t ret = RFAILED;
1792 if(duGetCellCb(rrcDeliveryReport->cellId, &cellCb) != ROK)
1795 ueCb = cellCb->ueCb[rrcDeliveryReport->ueId -1];
1796 ret = BuildAndSendRrcDeliveryReport(ueCb.gnbCuUeF1apId, ueCb.gnbDuUeF1apId,rrcDeliveryReport);
1798 DU_FREE_SHRABL_BUF(pst->region, pst->pool, rrcDeliveryReport, sizeof(RrcDeliveryReport));
1802 /*******************************************************************
1804 * @brief Process UL user data from RLC
1808 * Function : DuProcRlcUlUserDataTrans
1810 * Functionality: Process UL user data from RLC
1812 * @params[in] Post structure
1814 * @return ROK - success
1817 * ****************************************************************/
1818 uint8_t DuProcRlcUlUserDataTrans(Pst *pst, RlcUlUserDatInfo *ulUserData)
1824 DU_LOG("\nDEBUG --> DU APP : Received UL user data");
1826 /* Fill EGTP header */
1827 egtpMsg.msgHdr.msgType = EGTPU_MSG_GPDU;
1828 egtpMsg.msgHdr.nPdu.pres = FALSE;
1829 egtpMsg.msgHdr.seqNum.pres = FALSE;
1830 egtpMsg.msgHdr.extHdr.udpPort.pres = FALSE;
1831 egtpMsg.msgHdr.extHdr.pdcpNmb.pres = FALSE;
1833 /* Fetch EGTP tunnel info */
1834 for(teIdx = 0; teIdx < duCb.numTeId; teIdx++)
1836 /*TODO: If multiple Cell Support is enables then CellId also needs to be validated alongwith ueId and DrbId*/
1837 if((duCb.upTnlCfg[teIdx] != NULLP) && (duCb.upTnlCfg[teIdx]->ueId == ulUserData->ueId) && \
1838 (duCb.upTnlCfg[teIdx]->drbId == ulUserData->rbId))
1840 if(duCb.upTnlCfg[teIdx]->tnlCfg1)
1842 egtpMsg.msgHdr.teId = duCb.upTnlCfg[teIdx]->tnlCfg1->teId; /*As we are supporting only 1 tunnel per DRB*/
1848 if (ODU_GET_MSG_BUF(DU_APP_MEM_REGION, DU_POOL, &mBuf) != ROK)
1850 DU_LOG("\nERROR --> DU APP : Failed to allocated buffer memory in DuProcRlcUlUserDataTrans");
1851 DU_FREE_SHRABL_BUF(pst->region, pst->pool, ulUserData->userData, ulUserData->msgLen);
1852 DU_FREE_SHRABL_BUF(pst->region, pst->pool, ulUserData, sizeof(RlcUlUserDatInfo));
1855 oduCpyFixBufToMsg(ulUserData->userData, mBuf, ulUserData->msgLen);
1856 ODU_PRINT_MSG(mBuf, 0, 0);
1858 egtpHdlDatInd(egtpMsg);
1860 DU_FREE_SHRABL_BUF(pst->region, pst->pool, ulUserData->userData, ulUserData->msgLen);
1861 DU_FREE_SHRABL_BUF(pst->region, pst->pool, ulUserData, sizeof(RlcUlUserDatInfo));
1865 /*******************************************************************
1867 * @brief process the slice cfg rsp received from MAC
1871 * Function : DuProcMacSliceCfgRsp
1873 * Functionality: process the slice cfg rsp received from MAC
1875 * @params[in] Post structure, MacSliceCfgRsp *cfgRsp
1877 * @return ROK - success
1880 **********************************************************************/
1881 uint8_t DuProcMacSliceCfgRsp(Pst *pst, MacSliceCfgRsp *cfgRsp)
1885 if(cfgRsp->rsp == MAC_DU_APP_RSP_OK)
1887 duCb.sliceState = SLICE_CONFIGURED;
1888 DU_LOG("\nINFO --> DU_APP : Slice configured successfully ");
1892 DU_LOG("\nERROR --> DU_APP : Slice not available");
1894 DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL, cfgRsp, sizeof(MacSliceCfgRsp));
1899 /*******************************************************************
1901 * @brief Fill the slice configration and rrm policy related
1902 * information received form O1
1906 * Function : BuildAndSendSliceConfigReq
1908 * Functionality: Fill the slice configration and rrm policy related
1910 * @params[in] RrmPolicy *rrmPolicy[], uint8_t totalRrmPolicy, uint8_t
1913 * @return ROK - success
1916 * ****************************************************************/
1917 uint8_t BuildAndSendSliceConfigReq()
1920 MacSliceCfgReq *sliceCfgReq;
1922 DU_ALLOC_SHRABL_BUF(sliceCfgReq, sizeof(MacSliceCfgReq));
1923 if(sliceCfgReq == NULLP)
1925 DU_LOG("\nERROR --> DU_APP : Memory allocation failed in BuildAndSendSliceConfigReq");
1930 memcpy(sliceCfgReq, &duCfgParam.tempSliceCfg, sizeof(MacSliceCfgReq));
1931 FILL_PST_DUAPP_TO_MAC(pst, EVENT_MAC_SLICE_CFG_REQ);
1933 DU_LOG("\nDEBUG --> DU_APP : Sending Slice Cfg Request to MAC ");
1934 if((*packMacSliceCfgReqOpts[pst.selector])(&pst, sliceCfgReq) == RFAILED)
1936 DU_LOG("\nERROR --> DU_APP : Failed to send Slice Cfg Req to MAC");
1937 DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL, sliceCfgReq, sizeof(MacSliceCfgReq));
1943 /*******************************************************************
1945 * @brief Fill the slice configration and rrm policy related
1946 * information received form O1
1950 * Function : BuildAndSendSliceRecfgReq
1952 * Functionality: Fill the slice configration and rrm policy related
1954 * @params[in] RrmPolicy rrmPolicy[], uint8_t totalSliceCount
1956 * @return ROK - success
1959 * ****************************************************************/
1960 uint8_t BuildAndSendSliceRecfgReq()
1963 MacSliceRecfgReq *sliceRecfgReq = NULLP;
1965 DU_LOG("\nINFO --> DU_APP : Slice ReConfiguration Request received");
1967 DU_ALLOC_SHRABL_BUF(sliceRecfgReq, sizeof(MacSliceRecfgReq));
1968 if(sliceRecfgReq == NULLP)
1970 DU_LOG("\nERROR --> DU_APP : Memory allocation failed to BuildAndSendSliceRecfgReq");
1975 memcpy(sliceRecfgReq, &duCfgParam.tempSliceCfg, sizeof(MacSliceRecfgReq));
1977 FILL_PST_DUAPP_TO_MAC(pst, EVENT_MAC_SLICE_RECFG_REQ);
1979 DU_LOG("\nDEBUG --> DU_APP: Sending Slice ReCfg Request to MAC ");
1980 if( (*packMacSliceRecfgReqOpts[pst.selector])(&pst, sliceRecfgReq) == RFAILED)
1982 DU_LOG("\nERROR --> DU_APP: Failed to send Slice ReCfg Req to MAC");
1983 DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL, sliceRecfgReq, sizeof(MacSliceRecfgReq));
1988 /*******************************************************************
1990 * @brief process the slice ReCfg rsp received from MAC
1994 * Function : DuProcMacSliceRecfgRsp
1996 * Functionality: process the slice ReCfg rsp received from MAC
1998 * @params[in] Post structure, MacSliceRecfgRsp *ReCfgRsp
2000 * @return ROK - success
2003 **********************************************************************/
2004 uint8_t DuProcMacSliceRecfgRsp(Pst *pst, MacSliceRecfgRsp *recfgRsp)
2008 if(recfgRsp->rsp == MAC_DU_APP_RSP_OK)
2010 duCb.sliceState = SLICE_RECONFIGURED;
2011 DU_LOG("\nINFO --> DU_APP : Slice Reconfigured successfully ");
2015 DU_LOG("\nERROR --> DU_APP : Slice not available");
2017 DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL, recfgRsp, sizeof(MacSliceCfgRsp));
2022 /*******************************************************************
2024 * @brief Handles received Slice Metrics from RLC and forward it to O1
2028 * Function : DuProcRlcSliceMetrics
2031 * Handles received Slice Metrics from RLC and forward it to O1
2033 * @params[in] Post structure pointer
2034 * SlicePmList *sliceStats
2036 * @return ROK - success
2039 * ****************************************************************/
2040 uint8_t DuProcRlcSliceMetrics(Pst *pst, SlicePmList *sliceStats)
2042 uint8_t sliceRecord = 0;
2044 DU_LOG("\nDEBUG --> DU APP : Received Slice Metrics");
2045 if(sliceStats == NULLP)
2047 DU_LOG("\nERROR --> DU APP : Empty Metrics");
2051 for(sliceRecord = 0; sliceRecord < sliceStats->numSlice; sliceRecord++)
2053 DU_LOG("\nINFO --> DU_APP: SliceId[SST-SD]:%d-%d, DlTput %.5lf, UlTput:%.5lf", sliceStats->sliceRecord[sliceRecord].networkSliceIdentifier.sst,\
2054 sliceStats->sliceRecord[sliceRecord].networkSliceIdentifier.sd,sliceStats->sliceRecord[sliceRecord].ThpDl,\
2055 sliceStats->sliceRecord[sliceRecord].ThpUl);
2060 sendSliceMetric((SliceMetricList*) sliceStats);
2064 DU_FREE_SHRABL_BUF(pst->region, pst->pool,sliceStats->sliceRecord, (sliceStats->numSlice) * (sizeof(SlicePm)));
2065 DU_FREE_SHRABL_BUF(pst->region, pst->pool,sliceStats, sizeof(SlicePmList));
2070 /**********************************************************************
2072 **********************************************************************/