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"
31 #include "du_app_rlc_inf.h"
35 #include "du_f1ap_msg_hdl.h"
36 #include "du_ue_mgr.h"
40 #include "du_cell_mgr.h"
44 #include "AlarmInterface.h"
45 #include "CmInterface.h"
46 #include "PmInterface.h"
51 uint8_t numRlcDlSaps = 0;
53 uint8_t numRlcMacSaps = 0;
55 uint8_t macCfgInst = 0;
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);
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()
350 for(idx=0; idx< DEFAULT_CELLS; idx++)
352 DuCellCb *cell = NULLP;
353 DU_ALLOC(cell, sizeof(DuCellCb));
356 DU_LOG("\nERROR --> DU_APP : Memory Allocation failed in duProcCfgComplete");
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++)
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];
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;
394 //Start layer configs
395 ret = duSendRlcUlCfg();
399 /**************************************************************************
400 * @brief Function to invoke DU Layer Configs
404 * Function : duSendRlcUlCfg
407 * Initiates Configs towards layers of DU
410 * @return ROK - success
413 ***************************************************************************/
414 uint8_t duSendRlcUlCfg()
418 duBuildRlcCfg((Inst)RLC_UL_INST);
419 for(cellIdx = 0; cellIdx < DEFAULT_CELLS; cellIdx++)
421 duBuildRlcLsapCfg(ENTMAC, (Inst)RLC_UL_INST, cellIdx);
423 duBuildRlcLsapCfg(ENTRLC, (Inst)RLC_UL_INST, 0);
428 /**************************************************************************
429 * @brief Function to invoke DU Layer Configs
433 * Function : duSendRlcDlCfg
436 * Initiates Configs towards layers of DU
439 * @return ROK - success
442 ***************************************************************************/
443 uint8_t duSendRlcDlCfg()
447 duBuildRlcCfg((Inst)RLC_DL_INST);
448 duBuildRlcUsapCfg(STUDXSAP, ENTRLC, (Inst)RLC_DL_INST);
449 for(cellIdx = 0; cellIdx < DEFAULT_CELLS; cellIdx++)
451 duBuildRlcLsapCfg(ENTMAC, (Inst)RLC_DL_INST, cellIdx);
456 /**************************************************************************
457 * @brief Function to handle Config Confirm from RLC
461 * Function : DuHdlRlcCfgComplete
464 * Handles Gen Config Confirm from RLC
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
471 ***************************************************************************/
472 uint8_t DuHdlRlcCfgComplete(Pst *pst, RlcMngmt *cfm)
475 if (pst->srcInst == RLC_UL_INST)
477 ret = duProcRlcUlCfgComplete(pst, cfm);
481 ret = duProcRlcDlCfgComplete(pst, cfm);
486 /**************************************************************************
487 * @brief Function to handle Control Config Confirm from RLC
491 * Function : duHdlRlcCntrlCfgComplete
494 * Handles Control Config Confirm from RLC
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
501 ***************************************************************************/
502 uint8_t duHdlRlcCntrlCfgComplete(Pst *pst, RlcMngmt *cntrl)
506 if (cntrl->cfm.status == LCM_PRIM_OK)
508 switch (cntrl->hdr.elmId.elmnt)
512 if (pst->srcInst == RLC_DL_INST)
514 DU_LOG("\nDEBUG --> DU_APP : BIND OF RLC DL TO MAC (RGU) SAP SUCCESSFUL");
516 if(macCfgInst < DEFAULT_CELLS)
519 duBindUnbindRlcToMacSap((Inst) RLC_DL_INST, ABND);
523 duBindUnbindRlcToMacSap((Inst) RLC_UL_INST, ABND);
528 DU_LOG("\nDEBUG --> DU_APP : BIND OF RLC UL TO MAC (RGU) SAP SUCCESSFUL");
530 if(macCfgInst < DEFAULT_CELLS)
532 duBindUnbindRlcToMacSap((Inst) RLC_UL_INST, ABND);
546 /**************************************************************************
547 * @brief Function to handle Config Confirm from RLC UL
551 * Function : duHdlRlcUlCfgComplete
554 * Handles Config Confirm from RLC UL
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
561 ***************************************************************************/
562 uint8_t duProcRlcUlCfgComplete(Pst *pst, RlcMngmt *cfm)
566 DU_LOG("\nDEBUG --> DU_APP : RLC UL Cfg Status %d", cfm->cfm.status);
567 if (cfm->cfm.status == LCM_PRIM_OK)
569 switch(cfm->hdr.elmId.elmnt)
573 rlcUlCfg |= RLC_GEN_CFG;
579 if(numRlcMacSaps == DEFAULT_CELLS)
581 rlcUlCfg |= RLC_MAC_SAP_CFG;
588 rlcUlCfg |= RLC_UDX_SAP_CFG;
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)
600 //Start configuration of RLC DL
607 DU_LOG("\nERROR --> DU_APP : Config confirm NOK from RLC UL");
613 /**************************************************************************
614 * @brief Function to handle Config Confirm from RLC DL
618 * Function : duHdlRlcDlCfgComplete
621 * Handles Config Confirm from RLC DL
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
628 ***************************************************************************/
629 uint8_t duProcRlcDlCfgComplete(Pst *pst, RlcMngmt *cfm)
631 DU_LOG("\nDEBUG --> DU_APP : RLC DL Cfg Status %d", cfm->cfm.status);
632 if (cfm->cfm.status == LCM_PRIM_OK)
634 switch(cfm->hdr.elmId.elmnt)
638 rlcDlCfg |= RLC_GEN_CFG;
644 if(numRlcMacSaps == DEFAULT_CELLS)
646 rlcDlCfg |= RLC_MAC_SAP_CFG;
653 rlcDlCfg |= RLC_UDX_SAP_CFG;
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)
665 //Start configuration of MAC
672 DU_LOG("\nERROR --> DU_APP : Config confirm NOK from RLC DL");
677 /**************************************************************************
678 * @brief Function to send configs to MAC
682 * Function : duSendMacCfg
685 * Initiates Configs towards MAC layer
688 * @return ROK - success
691 ***************************************************************************/
692 uint8_t duSendMacCfg()
695 duBuildMacUsapCfg(RLC_UL_INST);
696 duBuildMacUsapCfg(RLC_DL_INST);
701 /**************************************************************************
702 * @brief Function to fill gen config required by MAC
706 * Function : duBuildMacGenCfg
709 * Initiates general Configs towards MAC
712 * @return ROK - success
715 ***************************************************************************/
716 uint8_t duBuildMacGenCfg()
719 RgGenCfg *genCfg=NULLP;
722 DU_SET_ZERO(&pst, sizeof(Pst));
723 DU_SET_ZERO(&rgMngmt, sizeof(RgMngmt));
725 genCfg = &(rgMngmt.t.cfg.s.genCfg);
727 /*----------- Fill General Configuration Parameters ---------*/
728 genCfg->mem.region = MAC_MEM_REGION;
729 genCfg->mem.pool = MAC_POOL;
731 genCfg->numRguSaps = 2;
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;
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;
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;
762 pst.selector = ODU_SELECTOR_LC;
763 pst.srcEnt = ENTDUAPP;
765 pst.dstInst = macCfgInst;
766 pst.dstProcId = DU_PROC;
767 pst.srcProcId = DU_PROC;
768 pst.region = duCb.init.region;
770 DU_LOG("\nDEBUG --> DU_APP : MAC Gen Cfg Req sent");
772 /* Send the request to MAC */
773 cmPkLrgCfgReq(&pst, &rgMngmt);
778 /**************************************************************************
779 * @brief Function to fill USAP config required by MAC
783 * Function : duBuildMacUsapCfg
786 * Initiates USAP Configs towards MAC
788 * @param[in] SpId Specifies if RLC UL or RLC DL instance
789 * @return ROK - success
792 ***************************************************************************/
793 uint8_t duBuildMacUsapCfg(SpId sapId)
796 RgUpSapCfg *uSap = NULLP;
799 DU_SET_ZERO(&pst, sizeof(Pst));
800 DU_SET_ZERO(&rgMngmt, sizeof(RgMngmt));
802 uSap = &(rgMngmt.t.cfg.s.rguSap);
804 uSap->mem.region = MAC_MEM_REGION;
805 uSap->mem.pool = MAC_POOL;
808 uSap->procId = DU_PROC;
811 uSap->prior = PRIOR0;
812 uSap->route = RTESPEC;
813 uSap->selector = ODU_SELECTOR_LC ;
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;
824 pst.selector = ODU_SELECTOR_LC;
825 pst.srcEnt = ENTDUAPP;
827 pst.dstInst = macCfgInst;
828 pst.dstProcId = DU_PROC;
829 pst.srcProcId = DU_PROC;
830 pst.region = duCb.init.region;
832 DU_LOG("\nDEBUG --> DU_APP : MAC Rgu USap Cfg Req sent");
834 /* Send the request to MAC */
835 cmPkLrgCfgReq(&pst, &rgMngmt);
840 /**************************************************************************
841 * @brief Function to handle Config Confirm from MAC
845 * Function : duHdlMacCfgComplete
848 * Handles Gen Config Confirm from MAC
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
855 ***************************************************************************/
856 uint8_t duHdlMacCfgComplete(Pst *pst, RgMngmt *cfm)
860 if (cfm->cfm.status == LCM_PRIM_OK)
862 switch (cfm->hdr.elmId.elmnt)
866 macCfg |= MAC_GEN_CFG;
871 macCfg |= MAC_SAP_CFG;
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)
882 DU_LOG("\nDEBUG --> DU_APP : Completed sending Configs");
884 duBindUnbindRlcToMacSap(RLC_DL_INST, ABND);
890 DU_LOG("\nERROR --> DU_APP : Config confirm NOK from MAC");
896 /**************************************************************************
897 * @brief Function to bind/unbind RLC to MAC SAP
901 * Function : duBindUnbindRlcToMacSap
904 * Initiates Bind/Unbind from RLC to MAC
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
911 ***************************************************************************/
912 uint8_t duBindUnbindRlcToMacSap(uint8_t inst, uint8_t action)
914 RlcCntrl *cntrl = NULLP;
919 DU_SET_ZERO(&rlcMngmt, sizeof(RlcMngmt));
920 DU_SET_ZERO(&pst, sizeof(Pst));
924 DU_LOG("\nDEBUG --> DU_APP : Cntrl Req to RLC inst %d to bind MAC sap", inst);
928 DU_LOG("\nDEBUG --> DU_APP : Cntrl Req to RLC inst %d to unbind MAC sap", inst);
930 cntrl = &(rlcMngmt.t.cntrl);
932 cntrl->action = action;
933 cntrl->subAction = DU_ZERO_VAL;
934 cntrl->s.sapCntrl.suId = macCfgInst;
935 cntrl->s.sapCntrl.spId = inst;
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;
947 pst.selector = ODU_SELECTOR_LC;
948 pst.srcEnt = ENTDUAPP;
950 pst.dstProcId = DU_PROC;
952 pst.srcProcId = DU_PROC;
953 pst.region = duCb.init.region;
955 cmPkLkwCntrlReq(&pst, &rlcMngmt);
959 /*******************************************************************
961 * @brief Handles SCTP notifications
965 * Function : duSctpNtfyHdl
968 * Handles SCTP notification
970 * @params[in] Message Buffer
973 * @return ROK - success
976 * ****************************************************************/
978 uint8_t duSctpNtfyHdl(Buffer *mBuf, CmInetSctpNotification *ntfy)
980 if(f1Params.assocId == ntfy->u.assocChange.assocId)
982 if(BuildAndSendF1SetupReq() != ROK)
987 else if(ricParams.assocId == ntfy->u.assocChange.assocId)
993 DU_LOG("\nERROR --> DU_APP : Invalid assocId %d received", ntfy->u.assocChange.assocId);
999 /*******************************************************************
1001 * @brief Fills Pst struct for ENTEGTP
1005 * Function : duFillEgtpPst
1008 * Fills Pst struct for ENTEGTP
1011 * @return ROK - success
1014 * ****************************************************************/
1015 uint8_t duFillEgtpPst(Pst *pst, Event event)
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;
1025 pst->selector = ODU_SELECTOR_LC;
1032 /*******************************************************************
1034 * @brief Function to configure EGTP
1038 * Function : duBuildEgtpCfgReq
1041 * Function to configure EGTP
1044 * @return ROK - success
1047 * ****************************************************************/
1049 uint8_t duBuildEgtpCfgReq()
1054 DU_LOG("\nDEBUG --> DU_APP : Sending EGTP config request");
1056 memset(&egtpCfg, 0, sizeof(EgtpConfig));
1057 memcpy(&egtpCfg, &duCfgParam.egtpParams, sizeof(EgtpConfig));
1059 duFillEgtpPst(&pst, EVTCFGREQ);
1060 packEgtpCfgReq(&pst, egtpCfg);
1065 /*******************************************************************
1067 * @brief Function to configure EGTP
1071 * Function : duBuildEgtpCfgReq
1074 * Function to configure EGTP
1077 * @return ROK - success
1080 * ****************************************************************/
1081 uint8_t duHdlEgtpCfgComplete(CmStatus cfm)
1085 if(cfm.status == LCM_PRIM_OK)
1087 DU_LOG("\nDEBUG --> DU_APP : EGTP configuraton complete");
1088 duSendEgtpSrvOpenReq();
1092 DU_LOG("\nERROR --> DU_APP : EGTP configuraton failed");
1099 /*******************************************************************
1101 * @brief Sends server open request to EGTP
1105 * Function : duSendEgtpSrvOpenReq
1108 * Sends server open request to EGTP
1111 * @return ROK - success
1114 * ****************************************************************/
1116 uint8_t duSendEgtpSrvOpenReq()
1120 DU_LOG("\nDEBUG --> DU_APP : Sending EGTP server open request");
1122 duFillEgtpPst(&pst, EVTSRVOPENREQ);
1123 packEgtpSrvOpenReq(&pst);
1128 /*******************************************************************
1130 * @brief Handles server open confirmation
1134 * Function : duHdlEgtpSrvOpenComplete
1137 * Handles server open confirmation
1140 * @return ROK - success
1143 *****************************************************************/
1145 uint8_t duHdlEgtpSrvOpenComplete(CmStatus cfm)
1149 if(cfm.status == LCM_PRIM_OK)
1151 DU_LOG("\nDEBUG --> DU_APP : EGTP server opened successfully");
1155 DU_LOG("\nERROR --> DU_APP : EGTP server opening failed");
1162 /*******************************************************************
1164 * @brief Sends tunnel management request
1168 * Function : duSendEgtpTnlMgmtReq
1171 * Builds and sends tunnel management request to EGTP
1173 * @params[in] Action
1174 * Local tunnel endpoint id
1175 * Remote tunnel endpoint id
1176 * @return ROK - success
1179 * ****************************************************************/
1181 uint8_t duSendEgtpTnlMgmtReq(uint8_t action, uint32_t teIdTobeMod, GtpTnlCfg *ueCbTnlCfg)
1187 DU_LOG("\nDEBUG --> DU_APP : Sending EGTP tunnel management request for teId [%d]", ueCbTnlCfg->teId);
1189 /* ADD/MOD/DEL per tunnel */
1190 tnlEvt.action = action;
1191 tnlEvt.remTeid = ueCbTnlCfg->teId;
1192 if(action != EGTP_TNL_MGMT_ADD)
1194 tnlEvt.lclTeid = teIdTobeMod;
1198 tnlEvt.lclTeid = ueCbTnlCfg->teId;
1200 duFillEgtpPst(&pst, EVTTNLMGMTREQ);
1201 ret = egtpTnlMgmtReq(&pst, tnlEvt);
1205 /*******************************************************************
1207 * @brief Handles Tunnel management confirm
1211 * Function : duHdlEgtpTnlMgmtCfm
1214 * Handles tunnel management confirm received from Egtp
1216 * @params[in] Tunnel Event
1217 * @return ROK - success
1220 * ****************************************************************/
1221 uint8_t duHdlEgtpTnlMgmtCfm(EgtpTnlEvt tnlEvtCfm)
1225 if(tnlEvtCfm.cfmStatus.status == LCM_PRIM_OK)
1227 DU_LOG("\nDEBUG --> DU_APP: Tunnel management confirm OK");
1231 DU_LOG("\nERROR --> DU_APP: Tunnel management failed");
1238 /*******************************************************************
1240 * @brief Sends UL user data over to EGTP
1244 * Function : duSendEgtpDatInd
1246 * Functionality: Sends UL user data over to EGTP
1248 * @params[in] UL data buffer
1249 * @return ROK - success
1252 * ****************************************************************/
1253 uint8_t duSendEgtpDatInd(Buffer *mBuf)
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;
1266 egtpHdlDatInd(egtpMsg);
1272 /**************************************************************************
1273 * @brief Function to send configs to SCH
1277 * Function : duSendSchCfg
1280 * Sends general config to Scheduler via MAC layer
1283 * @return ROK - success
1286 ***************************************************************************/
1287 uint8_t duSendSchCfg()
1290 RgSchInstCfg *cfg = NULLP;
1293 DU_SET_ZERO(&pst, sizeof(Pst));
1294 DU_SET_ZERO(&rgMngmt, sizeof(RgMngmt));
1296 cfg = &(rgMngmt.t.cfg.s.schInstCfg);
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;
1306 cfg->genCfg.forceCntrlSrbBoOnPCel = FALSE;
1307 cfg->genCfg.isSCellActDeactAlgoEnable = TRUE;
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;
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;
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;
1338 pst.region = duCb.init.region;
1339 pst.event = (Event) EVTMACSCHGENCFGREQ;
1341 DU_LOG("\nDEBUG --> DU_APP : MAC Sch Cfg sent");
1343 /* Send the request to MAC */
1344 cmPkLrgSchCfgReq(&pst, &rgMngmt);
1350 /**************************************************************************
1351 * @brief Function to configure SCTP params and
1352 * responsible for F1 and E2 interfaces
1356 * Function : duLayerConfigComplete
1359 * Configures SCTP Params and responsible for handling
1360 * F1 and E2 interface.
1363 * @return ROK - success
1366 ***************************************************************************/
1367 uint8_t duLayerConfigComplete()
1371 DU_LOG("\nINFO --> DU_APP : Configuring all Layer is complete");
1373 if((ret = duSctpCfgReq(duCfgParam.sctpParams)) != ROK)
1375 DU_LOG("\nERROR --> DU_APP : Failed configuring Sctp Params");
1378 if((ret = duSctpAssocReq(F1_INTERFACE)) != ROK)
1380 DU_LOG("\nERROR --> DU_APP : Failed to send AssocReq F1");
1383 if((ret = duSctpAssocReq(E2_INTERFACE)) != ROK)
1385 DU_LOG("\nERROR --> DU_APP : Failed to send AssocReq E2");
1392 /**************************************************************************
1393 * @brief Function to handle SCH Config Confirm from MAC
1397 * Function : duHdlSchCfgComplete
1400 * Handles Scheduler Gen Config Confirm from MAC
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
1407 ***************************************************************************/
1408 uint8_t duHdlSchCfgComplete(Pst *pst, RgMngmt *cfm)
1410 if (cfm->cfm.status == LCM_PRIM_OK)
1412 switch (cfm->hdr.elmId.elmnt)
1416 DU_LOG("\nDEBUG --> DU_APP : Received SCH CFG CFM at DU APP");
1423 duLayerConfigComplete();
1424 duBuildEgtpCfgReq();
1428 /**************************************************************************
1429 * @brief Function to fill and send MacCellconfig
1433 * Function : duBuildAndSendMacCellCfg
1436 * Initiates MAC Configs towards MAC
1439 * @return ROK - success
1442 ***************************************************************************/
1443 uint8_t duBuildAndSendMacCellCfg(uint16_t cellId)
1446 MacCellCfg *duMacCellCfg = NULLP;
1448 DU_ALLOC_SHRABL_BUF(duMacCellCfg, sizeof(MacCellCfg));
1449 if(duMacCellCfg == NULLP)
1454 /* store the address in the duCellCb so that we can free on confirm msg */
1455 duCb.actvCellLst[cellId-1]->duMacCellCfg = duMacCellCfg;
1457 /* copy the mac config structure from duCfgParams */
1458 memcpy(duMacCellCfg,&duCfgParam.macCellCfg,sizeof(MacCellCfg));
1461 FILL_PST_DUAPP_TO_MAC(pst, EVENT_MAC_CELL_CONFIG_REQ);
1463 /* Send MAC cell config to MAC */
1464 return (*packMacCellCfgOpts[pst.selector])(&pst, duMacCellCfg);
1467 /**************************************************************************
1468 * @brief Function to Handle MAC cell config confirm
1472 * Function : duHandleMacCellCfgCfm
1475 * Initiates general Configs towards MAC
1478 * @return ROK - success
1481 ***************************************************************************/
1482 uint8_t duHandleMacCellCfgCfm(Pst *pst, MacCellCfgCfm *macCellCfgCfm)
1484 uint8_t actvCellIdx = 0;
1487 for(actvCellIdx = 0; actvCellIdx < MAX_NUM_CELL; actvCellIdx++)
1489 if(macCellCfgCfm->cellId == duCb.actvCellLst[actvCellIdx]->cellId)
1491 duCb.actvCellLst[actvCellIdx]->duMacCellCfg = NULLP;
1494 if(macCellCfgCfm->rsp == ROK)
1496 /* Build and send GNB-DU config update */
1497 ret = BuildAndSendDUConfigUpdate(SERV_CELL_TO_MODIFY);
1499 /* Build and Send Cell Start Req to MAC */
1500 ret = duBuildAndSendMacCellStart();
1504 /* TODO : Action to be taken if cell configuration fails.
1505 * Should CU be informed? */
1507 DU_LOG("\nERROR --> DU_APP : Mac cell cfg failed");
1513 /*******************************************************************
1515 * @brief Builds and sends cell start request to MAC
1519 * Function : duBuildAndSendMacCellStart
1522 * Builds and sends cell start request to MAC
1525 * @return ROK - success
1528 * ****************************************************************/
1529 uint8_t duBuildAndSendMacCellStart()
1532 OduCellId *cellId = NULL;
1534 DU_LOG("\nINFO --> DU APP : Building and Sending cell start request to MAC");
1536 /* Send Cell Start Request to MAC */
1537 DU_ALLOC_SHRABL_BUF(cellId, sizeof(OduCellId));
1540 DU_LOG("\nERROR --> DU APP : Memory alloc failed while building cell start request");
1544 for(uint8_t id = 0; id < duCb.numActvCells; id++)
1546 if(duCb.actvCellLst[id])
1548 cellId->cellId = duCb.actvCellLst[id]->cellId;
1551 FILL_PST_DUAPP_TO_MAC(pst, EVENT_MAC_CELL_START);
1553 return (*packMacCellStartOpts[pst.selector])(&pst, cellId);
1559 /*******************************************************************
1561 * @brief Builds and sends cell stop request to MAC
1565 * Function : duBuildAndSendMacCellStop
1568 * Builds and sends cell stop request to MAC
1571 * @return ROK - success
1574 * ****************************************************************/
1575 uint8_t duBuildAndSendMacCellStop(uint16_t cellId)
1579 OduCellId *oduCellId = NULL;
1581 DU_LOG("\nINFO --> DU APP : Building and Sending cell stop request to MAC");
1583 GET_CELL_IDX(cellId, cellIdx);
1584 if(duCb.actvCellLst[cellIdx] != NULLP)
1586 /* Send Cell Stop Request to MAC */
1587 DU_ALLOC_SHRABL_BUF(oduCellId, sizeof(OduCellId));
1590 DU_LOG("\nERROR --> DU APP : duBuildAndSendMacCellStop(): Memory allocation failed ");
1593 memset(oduCellId, 0, sizeof(OduCellId));
1594 oduCellId->cellId = duCb.actvCellLst[cellIdx]->cellId;
1597 FILL_PST_DUAPP_TO_MAC(pst, EVENT_MAC_CELL_STOP);
1599 return (*packMacCellStopOpts[pst.selector])(&pst, oduCellId);
1603 DU_LOG("\nERROR --> DU APP : duBuildAndSendMacCellStop(): cellId[%d] doesnot exists", cellId);
1609 /*******************************************************************
1611 * @brief Handles stop indication from MAC
1615 * Function : duHandleStopInd
1618 * Handles stop indication from MAC
1620 * @params[in] Post structure pointer
1621 * @return ROK - success
1624 * ****************************************************************/
1625 uint8_t duHandleStopInd(Pst *pst, OduCellId *cellId)
1627 DuCellCb *cellCb = NULLP;
1629 if(cellId->cellId <=0 || cellId->cellId > MAX_NUM_CELL)
1631 DU_LOG("\nERROR --> DU APP : Invalid Cell Id %d in duHandleStopInd()", cellId->cellId);
1634 if(duGetCellCb(cellId->cellId, &cellCb) != ROK)
1637 if((cellCb->cellStatus == ACTIVATED) || (cellCb->cellStatus == DELETION_IN_PROGRESS))
1639 DU_LOG("\nINFO --> DU APP : 5G-NR Cell %d is DOWN", cellId->cellId);
1640 if(sendCellDeleteReqToMac(cellId->cellId) == RFAILED)
1642 DU_LOG("\nERROR --> DU APP : duHandleStopInd(): Failed to send Cell delete req to MAC for\
1643 cellId[%d]", cellId->cellId);
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);
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));
1658 cellCb->cellStatus = CELL_OUT_OF_SERVICE; //TODO: cell status must be set to OOS after all UE and cell cleanup which is not
1664 /*******************************************************************
1666 * @brief Handles slot indication from MAC
1670 * Function : duHandleUlCcchInd
1673 * Handles UL CCCH indication from MAC
1675 * @params[in] Post structure pointer
1676 * UL CCCH Ind pointer
1677 * @return ROK - success
1680 * ****************************************************************/
1681 uint8_t duHandleUlCcchInd(Pst *pst, UlCcchIndInfo *ulCcchIndInfo)
1684 DU_LOG("\nINFO --> DU APP : UL CCCH Indication received");
1686 return (duProcUlCcchInd(ulCcchIndInfo));
1689 /*******************************************************************
1691 * @brief Process UL RRC Message from RLC
1695 * Function : DuProcRlcUlRrcMsgTrans
1697 * Functionality: Process UL RRC Message from RLC
1699 * @params[in] Post structure
1700 * UL RRC Message Info
1701 * @return ROK - success
1704 * ****************************************************************/
1705 uint8_t DuProcRlcUlRrcMsgTrans(Pst *pst, RlcUlRrcMsgInfo *ulRrcMsgInfo)
1707 DuCellCb *cellCb = NULLP;
1710 if(duGetCellCb(ulRrcMsgInfo->cellId, &cellCb) != ROK)
1712 if(ulRrcMsgInfo->ueId > 0)
1714 ueCb = cellCb->ueCb[ulRrcMsgInfo->ueId -1];
1717 BuildAndSendULRRCMessageTransfer(ueCb, ulRrcMsgInfo->lcId, ulRrcMsgInfo->msgLen, ulRrcMsgInfo->rrcMsg);
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));
1725 /*******************************************************************
1727 * @brief Process RRC delivery report from RLC
1731 * Function : DuProcRlcRrcDeliveryReport
1733 * Functionality: Process RRC delivery Message from RLC
1735 * @params[in] Post structure
1736 * UL RRC Message Info
1737 * @return ROK - success
1740 * ****************************************************************/
1741 uint8_t DuProcRlcRrcDeliveryReport(Pst *pst, RrcDeliveryReport *rrcDeliveryReport)
1743 DuCellCb *cellCb = NULLP;
1745 uint8_t ret = RFAILED;
1747 if(duGetCellCb(rrcDeliveryReport->cellId, &cellCb) != ROK)
1750 ueCb = cellCb->ueCb[rrcDeliveryReport->ueId -1];
1751 ret = BuildAndSendRrcDeliveryReport(ueCb.gnbCuUeF1apId, ueCb.gnbDuUeF1apId,rrcDeliveryReport);
1753 DU_FREE_SHRABL_BUF(pst->region, pst->pool, rrcDeliveryReport, sizeof(RrcDeliveryReport));
1757 /*******************************************************************
1759 * @brief Process UL user data from RLC
1763 * Function : DuProcRlcUlUserDataTrans
1765 * Functionality: Process UL user data from RLC
1767 * @params[in] Post structure
1769 * @return ROK - success
1772 * ****************************************************************/
1773 uint8_t DuProcRlcUlUserDataTrans(Pst *pst, RlcUlUserDatInfo *ulUserData)
1779 DU_LOG("\nDEBUG --> DU APP : Received UL user data");
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;
1788 /* Fetch EGTP tunnel info */
1789 for(teIdx = 0; teIdx < duCb.numTeId; teIdx++)
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))
1795 if(duCb.upTnlCfg[teIdx]->tnlCfg1)
1797 egtpMsg.msgHdr.teId = duCb.upTnlCfg[teIdx]->tnlCfg1->teId; /*As we are supporting only 1 tunnel per DRB*/
1803 if (ODU_GET_MSG_BUF(DU_APP_MEM_REGION, DU_POOL, &mBuf) != ROK)
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));
1810 oduCpyFixBufToMsg(ulUserData->userData, mBuf, ulUserData->msgLen);
1811 ODU_PRINT_MSG(mBuf, 0, 0);
1813 egtpHdlDatInd(egtpMsg);
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));
1820 /*******************************************************************
1822 * @brief Free tempSLiceCfg stored in duCfgParams
1826 * Function : duFreeTempSliceCfg
1828 * Functionality: Free tempSLiceCfg stored in duCfgParams
1830 * @params[in] Post structure,
1834 * ****************************************************************/
1836 void duFreeTempSliceCfg()
1838 uint8_t policyIdx = 0, memberListTdx =0;
1839 CopyOfRecvdSliceCfg *tempSliceCfg = &duCfgParam.tempSliceCfg;
1841 if(tempSliceCfg->totalRrmPolicy)
1843 for(policyIdx = 0; policyIdx<tempSliceCfg->totalRrmPolicy; policyIdx++)
1845 if(tempSliceCfg->rrmPolicy[policyIdx]->numMemberList)
1847 for(memberListTdx = 0; memberListTdx<tempSliceCfg->rrmPolicy[policyIdx]->numMemberList; memberListTdx++)
1849 DU_FREE(tempSliceCfg->rrmPolicy[policyIdx]->memberList[memberListTdx], sizeof(PolicyMemberList));
1851 DU_FREE(tempSliceCfg->rrmPolicy[policyIdx]->memberList, (tempSliceCfg->rrmPolicy[policyIdx]->numMemberList) * sizeof(PolicyMemberList*));
1853 DU_FREE(tempSliceCfg->rrmPolicy[policyIdx], sizeof(RrmPolicy));
1855 DU_FREE(tempSliceCfg->rrmPolicy, tempSliceCfg->totalRrmPolicy* sizeof(RrmPolicy*));
1857 memset(tempSliceCfg, 0, sizeof(CopyOfRecvdSliceCfg));
1860 /*******************************************************************
1862 * @brief free the slice cfg rsp
1866 * Function : duFreeSliceCfgRsp
1868 * Functionality: free the slice cfg rsp
1870 * @params[in] Post structure, MacSliceCfgRsp *cfgRsp
1872 * @return ROK - success
1875 **********************************************************************/
1876 void duFreeSliceCfgRsp(Pst *pst, MacSliceCfgRsp *cfgRsp)
1882 if(cfgRsp->numSliceCfgRsp)
1884 for(cfgIdx = 0; cfgIdx<cfgRsp->numSliceCfgRsp; cfgIdx++)
1886 DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL, cfgRsp->listOfSliceCfgRsp[cfgIdx], sizeof(MacSliceRsp));
1888 DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL, cfgRsp->listOfSliceCfgRsp, cfgRsp->numSliceCfgRsp * sizeof(MacSliceRsp*));
1890 DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL, cfgRsp, sizeof(MacSliceCfgRsp));
1895 /*******************************************************************
1897 * @brief process the slice cfg rsp received from MAC
1901 * Function : DuProcMacSliceCfgRsp
1903 * Functionality: process the slice cfg rsp received from MAC
1905 * @params[in] Post structure, MacSliceCfgRsp *cfgRsp
1907 * @return ROK - success
1910 **********************************************************************/
1911 uint8_t DuProcMacSliceCfgRsp(Pst *pst, MacSliceCfgRsp *cfgRsp)
1917 if(cfgRsp->listOfSliceCfgRsp)
1919 for(cfgIdx = 0; cfgIdx<cfgRsp->numSliceCfgRsp; cfgIdx++)
1921 if(cfgRsp->listOfSliceCfgRsp[cfgIdx]->rsp == MAC_DU_APP_RSP_OK)
1923 duCb.sliceState = SLICE_CONFIGURED;
1926 DU_LOG("\nINFO --> DU_APP : Slice Configuration is done sucessfully ");
1928 duFreeSliceCfgRsp(pst, cfgRsp);
1930 duFreeTempSliceCfg();
1934 /*******************************************************************
1936 * @brief Fill the slice configration and rrm policy ratio
1937 * information received form O1
1941 * Function : fillSliceCfgReCfgInfo
1943 * Functionality: Fill the slice configration and recfg info
1945 * @params[in] Post structure
1947 * @return ROK - success
1950 * ****************************************************************/
1952 uint8_t fillSliceCfgReCfgInfo(MacSliceCfgReq *sliceCfgReq, RrmPolicy *rrmPolicy[], uint8_t totalRrmPolicy, uint8_t totalSliceCount)
1954 uint8_t sliceIdx = 0, cfgIdx = 0, memberListIdx = 0;
1958 DU_ALLOC_SHRABL_BUF(sliceCfgReq->listOfSliceCfg, totalSliceCount*sizeof(MacSliceRrmPolicy*));
1959 if(sliceCfgReq->listOfSliceCfg == NULLP)
1961 DU_LOG("\nERROR --> DU_APP : Memory allocation failed in fillSliceCfgReCfgInfo");
1965 for(sliceIdx = 0; sliceIdx<totalRrmPolicy; sliceIdx++)
1967 for(memberListIdx = 0; memberListIdx<rrmPolicy[sliceIdx]->numMemberList; memberListIdx++)
1969 DU_ALLOC_SHRABL_BUF(sliceCfgReq->listOfSliceCfg[cfgIdx], sizeof(MacSliceRrmPolicy));
1970 if(sliceCfgReq->listOfSliceCfg[cfgIdx] == NULLP)
1972 DU_LOG("\nERROR --> DU_APP : Memory allocation failed in fillSliceCfgReCfgInfo");
1977 memcpy(&sliceCfgReq->listOfSliceCfg[cfgIdx]->snssai, &rrmPolicy[sliceIdx]->memberList[memberListIdx]->snssai, sizeof(Snssai));
1979 DU_ALLOC_SHRABL_BUF(sliceCfgReq->listOfSliceCfg[cfgIdx]->rrmPolicyRatio, sizeof(RrmPolicyRatio));
1980 if(sliceCfgReq->listOfSliceCfg[cfgIdx]->rrmPolicyRatio == NULLP)
1982 DU_LOG("\nERROR --> DU_APP : Memory allocation failed in fillSliceCfgReCfgInfo");
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++;
1997 /*******************************************************************
1999 * @brief Fill the slice configration and rrm policy related
2000 * information received form O1
2004 * Function : BuildAndSendSliceConfigReq
2006 * Functionality: Fill the slice configration and rrm policy related
2008 * @params[in] RrmPolicy *rrmPolicy[], uint8_t totalRrmPolicy, uint8_t
2011 * @return ROK - success
2014 * ****************************************************************/
2015 uint8_t BuildAndSendSliceConfigReq(RrmPolicy *rrmPolicy[], uint8_t totalRrmPolicy, uint8_t totalSliceCnt)
2018 MacSliceCfgReq *sliceCfgReq;
2020 DU_ALLOC_SHRABL_BUF(sliceCfgReq, sizeof(MacSliceCfgReq));
2021 if(sliceCfgReq == NULLP)
2023 DU_LOG("\nERROR --> DU_APP : Memory allocation failed in BuildAndSendSliceConfigReq");
2028 if(fillSliceCfgReCfgInfo(sliceCfgReq, rrmPolicy, totalRrmPolicy, totalSliceCnt) != ROK)
2030 DU_LOG("\nERROR --> DU_APP : Failed to fill slice Configuration info in MacSliceCfgReq");
2033 FILL_PST_DUAPP_TO_MAC(pst, EVENT_MAC_SLICE_CFG_REQ);
2035 DU_LOG("\nDEBUG --> DU_APP : Sending Slice Cfg Request to MAC ");
2036 if((*packMacSliceCfgReqOpts[pst.selector])(&pst, sliceCfgReq) == RFAILED)
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));
2046 /*******************************************************************
2048 * @brief Fill the slice configration and rrm policy related
2049 * information received form O1
2053 * Function : BuildAndSendSliceReCfgReq
2055 * Functionality: Fill the slice configration and rrm policy related
2057 * @params[in] RrmPolicy rrmPolicy[], uint8_t totalSliceCount
2059 * @return ROK - success
2062 * ****************************************************************/
2063 uint8_t BuildAndSendSliceReCfgReq(RrmPolicy *rrmPolicy[], uint8_t totalRrmPolicy, uint8_t totalSliceCount)
2066 MacSliceCfgReq *sliceReCfgReq = NULLP;
2068 DU_LOG("\nINFO --> DU_APP : Slice ReConfiguration Request received");
2070 DU_ALLOC_SHRABL_BUF(sliceReCfgReq, sizeof(MacSliceCfgReq));
2071 if(sliceReCfgReq == NULLP)
2073 DU_LOG("\nERROR --> DU_APP : Memory allocation failed to BuildAndSendSliceReCfgReq");
2078 if(fillSliceCfgReCfgInfo(sliceReCfgReq, rrmPolicy, totalRrmPolicy, totalSliceCount) != ROK)
2080 DU_LOG("\nERROR --> DU_APP: Failed to fill slice cfg request info");
2083 FILL_PST_DUAPP_TO_MAC(pst, EVENT_MAC_SLICE_RECFG_REQ);
2085 DU_LOG("\nDEBUG --> DU_APP: Sending Slice ReCfg Request to MAC ");
2086 if( (*packMacSliceReCfgReqOpts[pst.selector])(&pst, sliceReCfgReq) == RFAILED)
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));
2094 /*******************************************************************
2096 * @brief process the slice ReCfg rsp received from MAC
2100 * Function : DuProcMacSliceReCfgRsp
2102 * Functionality: process the slice ReCfg rsp received from MAC
2104 * @params[in] Post structure, MacSliceCfgRsp *ReCfgRsp
2106 * @return ROK - success
2109 **********************************************************************/
2110 uint8_t DuProcMacSliceReCfgRsp(Pst *pst, MacSliceCfgRsp *reCfgRsp)
2112 uint8_t cfgIdx = 0, sliceIdx =0;
2116 if(reCfgRsp->listOfSliceCfgRsp)
2118 for(cfgIdx = 0; cfgIdx < reCfgRsp->numSliceCfgRsp; cfgIdx++)
2120 if(reCfgRsp->listOfSliceCfgRsp[cfgIdx]->rsp == MAC_DU_APP_RSP_OK)
2122 duCb.sliceState = SLICE_RECONFIGURED;
2126 DU_LOG("\nERROR --> DU_APP : Slice not available");
2129 DU_LOG("\nINFO --> DU_APP : Slice ReCOnfiguration response received");
2131 duFreeSliceCfgRsp(pst, reCfgRsp);
2133 duFreeTempSliceCfg();
2137 /*******************************************************************
2139 * @brief Handles received Slice Metrics from RLC and forward it to O1
2143 * Function : DuProcRlcSliceMetrics
2146 * Handles received Slice Metrics from RLC and forward it to O1
2148 * @params[in] Post structure pointer
2149 * SlicePmList *sliceStats
2151 * @return ROK - success
2154 * ****************************************************************/
2155 uint8_t DuProcRlcSliceMetrics(Pst *pst, SlicePmList *sliceStats)
2157 uint8_t sliceRecord = 0;
2159 DU_LOG("\nDEBUG --> DU APP : Received Slice Metrics");
2160 if(sliceStats == NULLP)
2162 DU_LOG("\nERROR --> DU APP : Empty Metrics");
2166 for(sliceRecord = 0; sliceRecord < sliceStats->numSlice; sliceRecord++)
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);
2174 sendSliceMetric((SliceMetricList*) sliceStats);
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));
2184 /**********************************************************************
2186 **********************************************************************/