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"
39 #include "lphy_stub.h"
43 uint8_t numRlcDlSaps = 0;
45 uint8_t numRlcMacSaps = 0;
47 uint8_t macCfgInst = 0;
49 extern DuCfgParams duCfgParam;
50 extern uint8_t packRlcConfigReq(Pst *pst, RlcMngmt *cfg);
51 extern uint8_t cmPkLkwCntrlReq(Pst *pst, RlcMngmt *cfg);
52 extern uint8_t cmPkLrgCfgReq(Pst *pst, RgMngmt *cfg);
53 extern uint8_t BuildAndSendE2SetupReq();
54 extern uint8_t egtpHdlDatInd(EgtpMsg egtpMsg);
55 extern uint8_t BuildAndSendDUConfigUpdate();
56 extern uint16_t getTransId();
57 extern uint8_t cmPkLrgSchCfgReq(Pst * pst,RgMngmt * cfg);
59 packMacCellCfgReq packMacCellCfgOpts[] =
61 packMacCellCfg, /* packing for loosely coupled */
62 MacProcCellCfgReq, /* packing for tightly coupled */
63 packMacCellCfg, /* packing for light weight loosly coupled */
66 DuMacCellStartReq packMacCellStartReqOpts[] =
68 packMacCellStartReq, /* Loose coupling */
69 MacProcCellStartReq, /* TIght coupling */
70 packMacCellStartReq /* Light weight-loose coupling */
73 DuMacCellStopReq packMacCellStopReqOpts[] =
75 packMacCellStopReq, /* Loose coupling */
76 MacProcCellStopReq, /* TIght coupling */
77 packMacCellStopReq /* Light weight-loose coupling */
80 /**************************************************************************
81 * @brief Function to fill configs required by RLC
85 * Function : duBuildRlcCfg
88 * Initiates general Configs towards RLC
90 * @param[in] Inst Specifies if RLC UL or RLC DL instance
91 * @return ROK - success
94 ***************************************************************************/
95 uint8_t duBuildRlcCfg(Inst inst)
98 RlcGenCfg *genCfg = NULLP;
101 DU_SET_ZERO(&rlcMngmt, sizeof(RlcMngmt));
102 DU_SET_ZERO(&pst, sizeof(Pst));
104 genCfg = &(rlcMngmt.t.cfg.s.gen);
106 /*----------- Fill General Configuration Parameters ---------*/
107 genCfg->maxUe = duCfgParam.maxUe;
108 genCfg->maxKwuSaps = 2;
109 genCfg->maxUdxSaps = 1;
110 genCfg->rlcMode = (inst == RLC_UL_INST) ?
111 LKW_RLC_MODE_UL : LKW_RLC_MODE_DL;
113 genCfg->maxRguSaps = DEFAULT_CELLS;
115 /*----------- Fill lmPst
116 * Parameters ---------*/
117 genCfg->lmPst.dstProcId = DU_PROC;
118 genCfg->lmPst.srcProcId = DU_PROC;
119 genCfg->lmPst.dstEnt = ENTDUAPP;
120 genCfg->lmPst.dstInst = DU_INST;
121 genCfg->lmPst.srcEnt = ENTRLC;
122 genCfg->lmPst.srcInst = inst;
123 genCfg->lmPst.prior = PRIOR0;
124 genCfg->lmPst.route = RTESPEC;
125 genCfg->lmPst.region = (inst == RLC_UL_INST) ?
126 RLC_UL_MEM_REGION:RLC_DL_MEM_REGION;
127 genCfg->lmPst.pool = RLC_POOL;
128 genCfg->lmPst.selector = ODU_SELECTOR_LC;
131 rlcMngmt.hdr.msgType = TCFG;
132 rlcMngmt.hdr.msgLen = 0;
133 rlcMngmt.hdr.entId.ent = ENTRLC;
134 rlcMngmt.hdr.entId.inst = (Inst)0;
135 rlcMngmt.hdr.elmId.elmnt = STGEN;
136 rlcMngmt.hdr.seqNmb = 0;
137 rlcMngmt.hdr.version = 0;
138 rlcMngmt.hdr.transId = 0;
139 rlcMngmt.hdr.response.prior = PRIOR0;
140 rlcMngmt.hdr.response.route = RTESPEC;
141 rlcMngmt.hdr.response.mem.region = (inst == RLC_UL_INST) ?
142 RLC_UL_MEM_REGION:RLC_DL_MEM_REGION;
143 rlcMngmt.hdr.response.mem.pool = DU_POOL;
144 rlcMngmt.hdr.response.selector = ODU_SELECTOR_LC;
147 pst.selector = ODU_SELECTOR_LC;
148 pst.srcEnt = ENTDUAPP;
151 pst.dstProcId = DU_PROC;
152 pst.srcProcId = DU_PROC;
153 pst.region = duCb.init.region;
155 DU_LOG("\nDU_APP : RLC Gen Cfg Req sent for inst %d", inst);
157 /* Send the request to RLC */
158 packRlcConfigReq(&pst, &rlcMngmt);
163 /**************************************************************************
164 * @brief Function to fill configs required by RLC
168 * Function : duBuildRlcLsapCfg
171 * Initiates general Configs towards RLC
173 * @param[in] Inst Specifies if RLC UL or RLC DL instance
174 * @return ROK - success
177 ***************************************************************************/
178 uint8_t duBuildRlcLsapCfg(Ent ent, Inst inst, uint8_t lsapInst)
182 RlcSapCfg *lSap = NULLP;
185 DU_SET_ZERO(&rlcMngmt, sizeof(RlcMngmt));
186 DU_SET_ZERO(&pst, sizeof(Pst));
189 rlcMngmt.hdr.msgType = TCFG;
190 rlcMngmt.hdr.entId.ent = ENTRLC;
191 rlcMngmt.hdr.response.mem.region = (inst == RLC_UL_INST) ?
192 RLC_UL_MEM_REGION:RLC_DL_MEM_REGION;
194 rlcMngmt.hdr.response.mem.pool = RLC_POOL;
197 pst.selector = ODU_SELECTOR_LC;
198 pst.srcEnt = ENTDUAPP;
200 pst.dstProcId = DU_PROC;
202 pst.srcProcId = DU_PROC;
203 pst.region = duCb.init.region;
204 lSap = &(rlcMngmt.t.cfg.s.sap);
206 lSap->mem.region = (inst == RLC_UL_INST) ?
207 RLC_UL_MEM_REGION:RLC_DL_MEM_REGION;
208 lSap->mem.pool = RLC_POOL;
210 lSap->bndTmrIntvl = 10;
211 lSap->priority = PRIOR0;
212 lSap->route = RTESPEC;
215 lSap->procId = DU_PROC;
217 lSap->inst = lsapInst;
218 lSap->sapId = lsapInst; /* SapId will be stored as suId in MAC */
219 lSap->selector = (inst == RLC_UL_INST) ? ODU_SELECTOR_LWLC : ODU_SELECTOR_TC;
220 rlcMngmt.hdr.elmId.elmnt = STRGUSAP;
221 DU_LOG("\nDU_APP : RLC MAC Lower Sap Cfg Req sent for inst %d", inst);
226 lSap->procId = DU_PROC;
228 lSap->inst = (inst == RLC_UL_INST) ?
229 RLC_DL_INST : RLC_UL_INST;
231 lSap->selector = ODU_SELECTOR_LC;
232 rlcMngmt.hdr.elmId.elmnt = STUDXSAP;
233 DU_LOG("\nDU_APP : RLC DL/UL Lower Sap Cfg Req sent for inst %d", inst);
236 packRlcConfigReq(&pst, &rlcMngmt);
240 /**************************************************************************
241 * @brief Function to fill configs required by RLC
245 * Function : duBuildRlcUsapCfg
248 * Initiates general Configs towards RLC
250 * @param[in] Inst Specifies if RLC UL or RLC DL instance
251 * @return ROK - success
254 ***************************************************************************/
255 uint8_t duBuildRlcUsapCfg(uint8_t elemId, Ent ent, Inst inst)
258 RlcSapCfg *uSap = NULLP;
261 DU_SET_ZERO(&rlcMngmt, sizeof(RlcMngmt));
262 DU_SET_ZERO(&pst, sizeof(Pst));
264 uSap = &(rlcMngmt.t.cfg.s.sap);
266 uSap->selector = ODU_SELECTOR_LC;
267 uSap->mem.region = (inst == RLC_UL_INST) ?
268 RLC_UL_MEM_REGION:RLC_DL_MEM_REGION;
269 uSap->mem.pool = RLC_POOL;
272 uSap->procId = DU_PROC;
276 uSap->inst = (inst == RLC_UL_INST) ?
277 RLC_DL_INST : RLC_UL_INST;
278 uSap->bndTmrIntvl = 1000;
279 uSap->priority = PRIOR0;
280 uSap->route = RTESPEC;
283 rlcMngmt.hdr.msgType = TCFG;
284 rlcMngmt.hdr.entId.ent = ENTRLC;
285 rlcMngmt.hdr.elmId.elmnt = STUDXSAP;
286 rlcMngmt.hdr.response.mem.region = (inst == RLC_UL_INST) ?
287 RLC_UL_MEM_REGION:RLC_DL_MEM_REGION;
289 rlcMngmt.hdr.response.mem.pool = RLC_POOL;
292 pst.selector = ODU_SELECTOR_LC;
293 pst.srcEnt = ENTDUAPP;
295 pst.dstProcId = DU_PROC;
297 pst.srcProcId = DU_PROC;
298 pst.region = duCb.init.region;
300 DU_LOG("\nDU_APP : RLC Kwu Upper Sap Cfg Req sent for inst %d", inst);
301 packRlcConfigReq(&pst, &rlcMngmt);
306 /**************************************************************************
307 * @brief Function to populate internal DS of DU APP
311 * Function : duProcCfgComplete
314 * Populates internal data structures of DU APP after
315 * receiving configurations.
318 * @return ROK - success
321 ***************************************************************************/
322 uint8_t duProcCfgComplete()
325 static uint16_t cellId = 0;
327 for(idx=0; idx< DEFAULT_CELLS; idx++)
329 DuCellCb *cell = NULLP;
330 DU_ALLOC(cell, sizeof(DuCellCb))
333 DU_LOG("\nDU_APP : Memory Allocation failed in duProcCfgComplete");
340 memset(cell, 0, sizeof(DuCellCb));
341 cell->cellId = ++cellId;
342 cell->cellInfo.nrEcgi.plmn.mcc[0] = PLMN_MCC0;
343 cell->cellInfo.nrEcgi.plmn.mcc[1] = PLMN_MCC1;
344 cell->cellInfo.nrEcgi.plmn.mcc[2] = PLMN_MCC2;
345 cell->cellInfo.nrEcgi.plmn.mnc[0] = PLMN_MNC0;
346 cell->cellInfo.nrEcgi.plmn.mnc[1] = PLMN_MNC1;
347 cell->cellInfo.nrEcgi.plmn.mnc[2] = PLMN_MNC2;
348 cell->cellInfo.nrEcgi.cellId = NR_CELL_ID;
349 cell->cellInfo.nrPci = NR_PCI;
350 cell->cellInfo.fiveGsTac = DU_TAC;
351 for(idx1=0; idx1<MAX_PLMN; idx1++)
353 cell->cellInfo.plmn[idx1].mcc[0] = PLMN_MCC0;
354 cell->cellInfo.plmn[idx1].mcc[1] = PLMN_MCC1;
355 cell->cellInfo.plmn[idx1].mcc[2] = PLMN_MCC2;
356 cell->cellInfo.plmn[idx1].mnc[0] = PLMN_MNC0;
357 cell->cellInfo.plmn[idx1].mnc[1] = PLMN_MNC1;
358 cell->cellInfo.plmn[idx1].mnc[2] = PLMN_MNC2;
360 cell->cellInfo.maxUe = duCfgParam.maxUe;
361 cell->cellStatus = CELL_OUT_OF_SERVICE;
362 nci = (uint16_t)cell->cellInfo.nrEcgi.cellId;
364 duCb.cfgCellLst[nci-1] = cell;
370 //Start layer configs
371 ret = duSendRlcUlCfg();
375 /**************************************************************************
376 * @brief Function to invoke DU Layer Configs
380 * Function : duSendRlcUlCfg
383 * Initiates Configs towards layers of DU
386 * @return ROK - success
389 ***************************************************************************/
390 uint8_t duSendRlcUlCfg()
394 duBuildRlcCfg((Inst)RLC_UL_INST);
395 for(cellIdx = 0; cellIdx < DEFAULT_CELLS; cellIdx++)
397 duBuildRlcLsapCfg(ENTMAC, (Inst)RLC_UL_INST, cellIdx);
399 duBuildRlcLsapCfg(ENTRLC, (Inst)RLC_UL_INST, 0);
404 /**************************************************************************
405 * @brief Function to invoke DU Layer Configs
409 * Function : duSendRlcDlCfg
412 * Initiates Configs towards layers of DU
415 * @return ROK - success
418 ***************************************************************************/
419 uint8_t duSendRlcDlCfg()
423 duBuildRlcCfg((Inst)RLC_DL_INST);
424 duBuildRlcUsapCfg(STUDXSAP, ENTRLC, (Inst)RLC_DL_INST);
425 for(cellIdx = 0; cellIdx < DEFAULT_CELLS; cellIdx++)
427 duBuildRlcLsapCfg(ENTMAC, (Inst)RLC_DL_INST, cellIdx);
432 /**************************************************************************
433 * @brief Function to handle Config Confirm from RLC
437 * Function : DuHdlRlcCfgComplete
440 * Handles Gen Config Confirm from RLC
442 * @param[in] Pst *pst, Post structure of the primitive.
443 * @param[in] RlcMngmt *cfm, Unpacked primitive info received from RLC
444 * @return ROK - success
447 ***************************************************************************/
448 uint8_t DuHdlRlcCfgComplete(Pst *pst, RlcMngmt *cfm)
451 if (pst->srcInst == RLC_UL_INST)
453 ret = duProcRlcUlCfgComplete(pst, cfm);
457 ret = duProcRlcDlCfgComplete(pst, cfm);
462 /**************************************************************************
463 * @brief Function to handle Control Config Confirm from RLC
467 * Function : duHdlRlcCntrlCfgComplete
470 * Handles Control Config Confirm from RLC
472 * @param[in] Pst *pst, Post structure of the primitive.
473 * @param[in] RlcMngmt *cfm, Unpacked primitive info received from RLC
474 * @return ROK - success
477 ***************************************************************************/
478 uint8_t duHdlRlcCntrlCfgComplete(Pst *pst, RlcMngmt *cntrl)
482 if (cntrl->cfm.status == LCM_PRIM_OK)
484 switch (cntrl->hdr.elmId.elmnt)
488 if (pst->srcInst == RLC_DL_INST)
490 DU_LOG("\nDU_APP : BIND OF RLC DL TO MAC (RGU) SAP SUCCESSFUL");
492 if(macCfgInst < DEFAULT_CELLS)
495 duBindUnbindRlcToMacSap((Inst) RLC_DL_INST, ABND);
499 duBindUnbindRlcToMacSap((Inst) RLC_UL_INST, ABND);
504 DU_LOG("\nDU_APP : BIND OF RLC UL TO MAC (RGU) SAP SUCCESSFUL");
506 if(macCfgInst < DEFAULT_CELLS)
508 duBindUnbindRlcToMacSap((Inst) RLC_UL_INST, ABND);
522 /**************************************************************************
523 * @brief Function to handle Config Confirm from RLC UL
527 * Function : duHdlRlcUlCfgComplete
530 * Handles Config Confirm from RLC UL
532 * @param[in] Pst *pst, Post structure of the primitive.
533 * @param[in] RlcMngmt *cfm, Unpacked primitive info received from RLC UL
534 * @return ROK - success
537 ***************************************************************************/
538 uint8_t duProcRlcUlCfgComplete(Pst *pst, RlcMngmt *cfm)
542 DU_LOG("\nDU_APP : RLC UL Cfg Status %d", cfm->cfm.status);
543 if (cfm->cfm.status == LCM_PRIM_OK)
545 switch(cfm->hdr.elmId.elmnt)
549 rlcUlCfg |= RLC_GEN_CFG;
555 if(numRlcMacSaps == DEFAULT_CELLS)
557 rlcUlCfg |= RLC_MAC_SAP_CFG;
564 rlcUlCfg |= RLC_UDX_SAP_CFG;
571 DU_LOG("\nDU_APP : RLC UL Cfg Cfm received for the element %d ",cfm->hdr.elmId.elmnt);
572 if(rlcUlCfg == DU_RLC_UL_CONFIGURED)
576 //Start configuration of RLC DL
583 DU_LOG("\nDU_APP : Config confirm NOK from RLC UL");
589 /**************************************************************************
590 * @brief Function to handle Config Confirm from RLC DL
594 * Function : duHdlRlcDlCfgComplete
597 * Handles Config Confirm from RLC DL
599 * @param[in] Pst *pst, Post structure of the primitive.
600 * @param[in] RlcMngmt *cfm, Unpacked primitive info received from RLC DL
601 * @return ROK - success
604 ***************************************************************************/
605 uint8_t duProcRlcDlCfgComplete(Pst *pst, RlcMngmt *cfm)
607 DU_LOG("\nDU_APP : RLC DL Cfg Status %d", cfm->cfm.status);
608 if (cfm->cfm.status == LCM_PRIM_OK)
610 switch(cfm->hdr.elmId.elmnt)
614 rlcDlCfg |= RLC_GEN_CFG;
620 if(numRlcMacSaps == DEFAULT_CELLS)
622 rlcDlCfg |= RLC_MAC_SAP_CFG;
629 rlcDlCfg |= RLC_UDX_SAP_CFG;
637 DU_LOG("\nDU_APP : RLC DL Cfg Cfm received for the element %d ",cfm->hdr.elmId.elmnt);
638 if(rlcDlCfg == DU_RLC_DL_CONFIGURED)
641 //Start configuration of MAC
648 DU_LOG("\nDU_APP : Config confirm NOK from RLC DL");
653 /**************************************************************************
654 * @brief Function to send configs to MAC
658 * Function : duSendMacCfg
661 * Initiates Configs towards MAC layer
664 * @return ROK - success
667 ***************************************************************************/
668 uint8_t duSendMacCfg()
671 duBuildMacUsapCfg(RLC_UL_INST);
672 duBuildMacUsapCfg(RLC_DL_INST);
677 /**************************************************************************
678 * @brief Function to fill gen config required by MAC
682 * Function : duBuildMacGenCfg
685 * Initiates general Configs towards MAC
688 * @return ROK - success
691 ***************************************************************************/
692 uint8_t duBuildMacGenCfg()
695 RgGenCfg *genCfg=NULLP;
698 DU_SET_ZERO(&pst, sizeof(Pst));
699 DU_SET_ZERO(&rgMngmt, sizeof(RgMngmt));
701 genCfg = &(rgMngmt.t.cfg.s.genCfg);
703 /*----------- Fill General Configuration Parameters ---------*/
704 genCfg->mem.region = MAC_MEM_REGION;
705 genCfg->mem.pool = MAC_POOL;
707 genCfg->numRguSaps = 2;
709 genCfg->lmPst.dstProcId = DU_PROC;
710 genCfg->lmPst.srcProcId = DU_PROC;
711 genCfg->lmPst.dstEnt = ENTDUAPP;
712 genCfg->lmPst.dstInst = 0;
713 genCfg->lmPst.srcEnt = ENTMAC;
714 genCfg->lmPst.srcInst = macCfgInst;
715 genCfg->lmPst.prior = PRIOR0;
716 genCfg->lmPst.route = RTESPEC;
717 genCfg->lmPst.region = MAC_MEM_REGION;
718 genCfg->lmPst.pool = MAC_POOL;
719 genCfg->lmPst.selector = ODU_SELECTOR_LC;
722 rgMngmt.hdr.msgType = TCFG;
723 rgMngmt.hdr.msgLen = 0;
724 rgMngmt.hdr.entId.ent = ENTMAC;
725 rgMngmt.hdr.entId.inst = (Inst)0;
726 rgMngmt.hdr.elmId.elmnt = STGEN;
727 rgMngmt.hdr.seqNmb = 0;
728 rgMngmt.hdr.version = 0;
729 rgMngmt.hdr.transId = 0;
731 rgMngmt.hdr.response.prior = PRIOR0;
732 rgMngmt.hdr.response.route = RTESPEC;
733 rgMngmt.hdr.response.mem.region = MAC_MEM_REGION;
734 rgMngmt.hdr.response.mem.pool = MAC_POOL;
735 rgMngmt.hdr.response.selector = ODU_SELECTOR_LC;
738 pst.selector = ODU_SELECTOR_LC;
739 pst.srcEnt = ENTDUAPP;
741 pst.dstInst = macCfgInst;
742 pst.dstProcId = DU_PROC;
743 pst.srcProcId = DU_PROC;
744 pst.region = duCb.init.region;
746 DU_LOG("\nDU_APP : MAC Gen Cfg Req sent");
748 /* Send the request to MAC */
749 cmPkLrgCfgReq(&pst, &rgMngmt);
754 /**************************************************************************
755 * @brief Function to fill USAP config required by MAC
759 * Function : duBuildMacUsapCfg
762 * Initiates USAP Configs towards MAC
764 * @param[in] SpId Specifies if RLC UL or RLC DL instance
765 * @return ROK - success
768 ***************************************************************************/
769 uint8_t duBuildMacUsapCfg(SpId sapId)
772 RgUpSapCfg *uSap = NULLP;
775 DU_SET_ZERO(&pst, sizeof(Pst));
776 DU_SET_ZERO(&rgMngmt, sizeof(RgMngmt));
778 uSap = &(rgMngmt.t.cfg.s.rguSap);
780 uSap->mem.region = MAC_MEM_REGION;
781 uSap->mem.pool = MAC_POOL;
784 uSap->procId = DU_PROC;
787 uSap->prior = PRIOR0;
788 uSap->route = RTESPEC;
789 uSap->selector = ODU_SELECTOR_LC ;
792 rgMngmt.hdr.msgType = TCFG;
793 rgMngmt.hdr.entId.ent = ENTMAC;
794 rgMngmt.hdr.entId.inst = (Inst)0;
795 rgMngmt.hdr.elmId.elmnt = STRGUSAP;
796 rgMngmt.hdr.response.mem.region = MAC_MEM_REGION;
797 rgMngmt.hdr.response.mem.pool = MAC_POOL;
800 pst.selector = ODU_SELECTOR_LC;
801 pst.srcEnt = ENTDUAPP;
803 pst.dstInst = macCfgInst;
804 pst.dstProcId = DU_PROC;
805 pst.srcProcId = DU_PROC;
806 pst.region = duCb.init.region;
808 DU_LOG("\nDU_APP : MAC Rgu USap Cfg Req sent");
810 /* Send the request to MAC */
811 cmPkLrgCfgReq(&pst, &rgMngmt);
816 /**************************************************************************
817 * @brief Function to handle Config Confirm from MAC
821 * Function : duHdlMacCfgComplete
824 * Handles Gen Config Confirm from MAC
826 * @param[in] Pst *pst, Post structure of the primitive.
827 * @param[in] RgMngmt *cfm, Unpacked primitive info received from MAC
828 * @return ROK - success
831 ***************************************************************************/
832 uint8_t duHdlMacCfgComplete(Pst *pst, RgMngmt *cfm)
836 if (cfm->cfm.status == LCM_PRIM_OK)
838 switch (cfm->hdr.elmId.elmnt)
842 macCfg |= MAC_GEN_CFG;
847 macCfg |= MAC_SAP_CFG;
854 DU_LOG("\nDU_APP : MAC Cfg Cfm received for the element %d ",cfm->hdr.elmId.elmnt);
855 if(macCfg == MAC_CONFIGURED && numRlcMacSaps == MAX_MAC_SAP)
858 DU_LOG("\nDU_APP : Completed sending Configs");
860 duBindUnbindRlcToMacSap(RLC_DL_INST, ABND);
866 DU_LOG("\nDU_APP : Config confirm NOK from MAC");
872 /**************************************************************************
873 * @brief Function to bind/unbind RLC to MAC SAP
877 * Function : duBindUnbindRlcToMacSap
880 * Initiates Bind/Unbind from RLC to MAC
882 * @param[in] Inst Specifies if RLC UL or RLC DL instance
883 * @param[in] action Specifies if action is bind or unbind
884 * @return ROK - success
887 ***************************************************************************/
888 uint8_t duBindUnbindRlcToMacSap(uint8_t inst, uint8_t action)
890 RlcCntrl *cntrl = NULLP;
895 DU_SET_ZERO(&rlcMngmt, sizeof(RlcMngmt));
896 DU_SET_ZERO(&pst, sizeof(Pst));
900 DU_LOG("\nDU_APP : Cntrl Req to RLC inst %d to bind MAC sap", inst);
904 DU_LOG("\nDU_APP : Cntrl Req to RLC inst %d to unbind MAC sap", inst);
906 cntrl = &(rlcMngmt.t.cntrl);
908 cntrl->action = action;
909 cntrl->subAction = DU_ZERO_VAL;
910 cntrl->s.sapCntrl.suId = macCfgInst;
911 cntrl->s.sapCntrl.spId = inst;
914 rlcMngmt.hdr.msgType = TCNTRL;
915 rlcMngmt.hdr.entId.ent = ENTRLC;
916 rlcMngmt.hdr.entId.inst = inst;
917 rlcMngmt.hdr.elmId.elmnt = 186; /* ambiguous defines in lkw.h and lrg.h so direct hardcoded*/
918 rlcMngmt.hdr.response.mem.region = (inst == RLC_UL_INST) ?
919 RLC_UL_MEM_REGION:RLC_DL_MEM_REGION;
920 rlcMngmt.hdr.response.mem.pool = RLC_POOL;
923 pst.selector = ODU_SELECTOR_LC;
924 pst.srcEnt = ENTDUAPP;
926 pst.dstProcId = DU_PROC;
928 pst.srcProcId = DU_PROC;
929 pst.region = duCb.init.region;
931 cmPkLkwCntrlReq(&pst, &rlcMngmt);
935 /*******************************************************************
937 * @brief Handles SCTP notifications
941 * Function : duSctpNtfyHdl
944 * Handles SCTP notification
946 * @params[in] Message Buffer
949 * @return ROK - success
952 * ****************************************************************/
954 uint8_t duSctpNtfyHdl(Buffer *mBuf, CmInetSctpNotification *ntfy)
956 if(f1Params.assocId == ntfy->u.assocChange.assocId)
958 if(BuildAndSendF1SetupReq() != ROK)
963 else if(ricParams.assocId == ntfy->u.assocChange.assocId)
965 if(BuildAndSendE2SetupReq() != ROK)
972 DU_LOG("\nDU_APP : Invalid assocId %d received", ntfy->u.assocChange.assocId);
978 /*******************************************************************
980 * @brief Fills Pst struct for ENTEGTP
984 * Function : duFillEgtpPst
987 * Fills Pst struct for ENTEGTP
990 * @return ROK - success
993 * ****************************************************************/
994 uint8_t duFillEgtpPst(Pst *pst, Event event)
996 memset(pst, 0, sizeof(Pst));
997 pst->srcEnt = (Ent)ENTDUAPP;
998 pst->srcInst = (Inst)DU_INST;
999 pst->srcProcId = DU_PROC;
1000 pst->dstEnt = (Ent)ENTEGTP;
1001 pst->dstInst = (Inst)EGTP_INST;
1002 pst->dstProcId = pst->srcProcId;
1004 pst->selector = ODU_SELECTOR_LC;
1011 /*******************************************************************
1013 * @brief Function to configure EGTP
1017 * Function : duBuildEgtpCfgReq
1020 * Function to configure EGTP
1023 * @return ROK - success
1026 * ****************************************************************/
1028 uint8_t duBuildEgtpCfgReq()
1033 DU_LOG("\nDU_APP : Sending EGTP config request");
1035 memset(&egtpCfg, 0, sizeof(EgtpConfig));
1036 memcpy(&egtpCfg, &duCfgParam.egtpParams, sizeof(EgtpConfig));
1038 duFillEgtpPst(&pst, EVTCFGREQ);
1039 packEgtpCfgReq(&pst, egtpCfg);
1044 /*******************************************************************
1046 * @brief Function to configure EGTP
1050 * Function : duBuildEgtpCfgReq
1053 * Function to configure EGTP
1056 * @return ROK - success
1059 * ****************************************************************/
1060 uint8_t duHdlEgtpCfgComplete(CmStatus cfm)
1064 if(cfm.status == LCM_PRIM_OK)
1066 DU_LOG("\nDU_APP : EGTP configuraton complete");
1068 duSendEgtpSrvOpenReq();
1073 DU_LOG("\nDU_APP : EGTP configuraton failed");
1080 /*******************************************************************
1082 * @brief Sends server open request to EGTP
1086 * Function : duSendEgtpSrvOpenReq
1089 * Sends server open request to EGTP
1092 * @return ROK - success
1095 * ****************************************************************/
1097 uint8_t duSendEgtpSrvOpenReq()
1101 DU_LOG("\nDU_APP : Sending EGTP server open request");
1103 duFillEgtpPst(&pst, EVTSRVOPENREQ);
1104 packEgtpSrvOpenReq(&pst);
1109 /*******************************************************************
1111 * @brief Handles server open confirmation
1115 * Function : duHdlEgtpSrvOpenComplete
1118 * Handles server open confirmation
1121 * @return ROK - success
1124 *****************************************************************/
1126 uint8_t duHdlEgtpSrvOpenComplete(CmStatus cfm)
1130 if(cfm.status == LCM_PRIM_OK)
1132 DU_LOG("\nDU_APP : EGTP server opened successfully");
1134 duSendEgtpTnlMgmtReq(EGTP_TNL_MGMT_ADD, EGTP_LCL_TEID, EGTP_REM_TEID);
1139 DU_LOG("\nDU_APP : EGTP server opening failed");
1146 /*******************************************************************
1148 * @brief Sends tunnel management request
1152 * Function : duSendEgtpTnlMgmtReq
1155 * Builds and sends tunnel management request to EGTP
1157 * @params[in] Action
1158 * Local tunnel endpoint id
1159 * Remote tunnel endpoint id
1160 * @return ROK - success
1163 * ****************************************************************/
1165 uint8_t duSendEgtpTnlMgmtReq(uint8_t action, uint32_t lclTeid, uint32_t remTeid)
1170 tnlEvt.action = action;
1171 tnlEvt.lclTeid = lclTeid;
1172 tnlEvt.remTeid = remTeid;
1174 DU_LOG("\nDU_APP : Sending EGTP tunnel management request");
1176 duFillEgtpPst(&pst, EVTTNLMGMTREQ);
1177 packEgtpTnlMgmtReq(&pst, tnlEvt);
1182 /*******************************************************************
1184 * @brief Handles Tunnel management confirm
1188 * Function : duHdlEgtpTnlMgmtCfm
1191 * Handles tunnel management confirm received from Egtp
1193 * @params[in] Tunnel Event
1194 * @return ROK - success
1197 * ****************************************************************/
1198 uint8_t duHdlEgtpTnlMgmtCfm(EgtpTnlEvt tnlEvtCfm)
1202 if(tnlEvtCfm.cfmStatus.status == LCM_PRIM_OK)
1204 DU_LOG("\nDU_APP : Tunnel management confirm OK");
1208 DU_LOG("\nDU_APP : Tunnel management failed");
1215 uint8_t duSendEgtpDatInd(Buffer *mBuf)
1219 /* Fill EGTP header */
1220 egtpMsg.msgHdr.msgType = EGTPU_MSG_GPDU;
1221 egtpMsg.msgHdr.nPdu.pres = FALSE;
1222 egtpMsg.msgHdr.seqNum.pres = FALSE;
1223 egtpMsg.msgHdr.extHdr.udpPort.pres = FALSE;
1224 egtpMsg.msgHdr.extHdr.pdcpNmb.pres = FALSE;
1225 egtpMsg.msgHdr.teId = 1;
1228 egtpHdlDatInd(egtpMsg);
1235 /*******************************************************************
1237 * @brief Simulate UL Data for intial test
1241 * Function : duSendEgtpTestData
1244 * Simulate UL data for initial test
1247 * @return ROK - success
1250 * ****************************************************************/
1251 uint8_t duSendEgtpTestData()
1253 char data[30] = "This is EGTP data from DU";
1258 if(ODU_GET_MSG_BUF(DU_APP_MEM_REGION, DU_POOL, &mBuf) == ROK)
1260 if(ODU_ADD_POST_MSG_MULT((Data *)data, datSize, mBuf) != ROK)
1262 DU_LOG("\nDU_APP : ODU_ADD_POST_MSG_MULT failed");
1263 ODU_PUT_MSG_BUF(mBuf);
1269 DU_LOG("\nDU_APP : Failed to allocate memory");
1273 /* filling IPv4 header */
1278 ODU_GET_MSG_LEN(mBuf, &mLen);
1280 memset(&ipv4Hdr, 0, sizeof(CmIpv4Hdr));
1281 ipv4Hdr.length = CM_IPV4_HDRLEN + mLen;
1282 ipv4Hdr.hdrVer = 0x45;
1284 ipv4Hdr.srcAddr = CM_INET_NTOH_U32(duCfgParam.egtpParams.localIp.ipV4Addr);
1285 ipv4Hdr.destAddr = CM_INET_NTOH_U32(duCfgParam.egtpParams.destIp.ipV4Addr);
1287 /* Packing IPv4 header into buffer */
1288 uint8_t ret, cnt, idx;
1289 Data revPkArray[CM_IPV4_HDRLEN];
1290 Data pkArray[CM_IPV4_HDRLEN];
1292 /* initialize locals */
1294 memset(revPkArray, 0, CM_IPV4_HDRLEN);
1295 memset(pkArray, 0, CM_IPV4_HDRLEN);
1297 /* Pack Header Version */
1298 pkArray[cnt++] = ipv4Hdr.hdrVer;
1301 pkArray[cnt++] = ipv4Hdr.tos;
1303 pkArray[cnt++] = (Data)GetHiByte(ipv4Hdr.length);
1304 pkArray[cnt++] = (Data)GetLoByte(ipv4Hdr.length);
1307 pkArray[cnt++] = (Data) GetHiByte(ipv4Hdr.id);
1308 pkArray[cnt++] = (Data) GetLoByte(ipv4Hdr.id);
1311 pkArray[cnt++] = (Data)GetHiByte(ipv4Hdr.off);
1312 pkArray[cnt++] = (Data)GetLoByte(ipv4Hdr.off);
1315 pkArray[cnt++] = ipv4Hdr.ttl;
1318 pkArray[cnt++] = ipv4Hdr.proto;
1321 pkArray[cnt++] = (Data)GetHiByte(ipv4Hdr.chkSum);
1322 pkArray[cnt++] = (Data)GetLoByte(ipv4Hdr.chkSum);
1324 /* Pack Source Address */
1325 pkArray[cnt++] = (Data)GetHiByte(GetHiWord(ipv4Hdr.srcAddr));
1326 pkArray[cnt++] = (Data)GetLoByte(GetHiWord(ipv4Hdr.srcAddr));
1327 pkArray[cnt++] = (Data)GetHiByte(GetLoWord(ipv4Hdr.srcAddr));
1328 pkArray[cnt++] = (Data)GetLoByte(GetLoWord(ipv4Hdr.srcAddr));
1330 /* Pack Destination Address */
1331 pkArray[cnt++] = (Data)GetHiByte(GetHiWord(ipv4Hdr.destAddr));
1332 pkArray[cnt++] = (Data)GetLoByte(GetHiWord(ipv4Hdr.destAddr));
1333 pkArray[cnt++] = (Data)GetHiByte(GetLoWord(ipv4Hdr.destAddr));
1334 pkArray[cnt++] = (Data)GetLoByte(GetLoWord(ipv4Hdr.destAddr));
1336 for (idx = 0; idx < CM_IPV4_HDRLEN; idx++)
1337 revPkArray[idx] = pkArray[CM_IPV4_HDRLEN - idx -1];
1339 /* this function automatically reverses revPkArray */
1340 ret = ODU_ADD_PRE_MSG_MULT(revPkArray, (MsgLen)cnt, mBuf);
1342 duSendEgtpDatInd(mBuf);
1346 #endif /* EGTP_TEST */
1349 /**************************************************************************
1350 * @brief Function to send configs to SCH
1354 * Function : duSendSchCfg
1357 * Sends general config to Scheduler via MAC layer
1360 * @return ROK - success
1363 ***************************************************************************/
1364 uint8_t duSendSchCfg()
1367 RgSchInstCfg *cfg = NULLP;
1370 DU_SET_ZERO(&pst, sizeof(Pst));
1371 DU_SET_ZERO(&rgMngmt, sizeof(RgMngmt));
1373 cfg = &(rgMngmt.t.cfg.s.schInstCfg);
1375 /* Filling of Instance Id */
1376 cfg->instId = DEFAULT_CELLS + 1;
1377 /* Filling of Gen config */
1378 cfg->genCfg.mem.region = MAC_MEM_REGION;
1379 cfg->genCfg.mem.pool = MAC_POOL;
1380 cfg->genCfg.tmrRes = 10;
1383 cfg->genCfg.forceCntrlSrbBoOnPCel = FALSE;
1384 cfg->genCfg.isSCellActDeactAlgoEnable = TRUE;
1386 cfg->genCfg.startCellId = 1;
1387 cfg->genCfg.lmPst.dstProcId = DU_PROC;
1388 cfg->genCfg.lmPst.srcProcId = DU_PROC;
1389 cfg->genCfg.lmPst.dstEnt = ENTDUAPP;
1390 cfg->genCfg.lmPst.dstInst = DU_INST;
1391 cfg->genCfg.lmPst.srcEnt = ENTMAC;
1392 cfg->genCfg.lmPst.srcInst = DEFAULT_CELLS + 1;
1393 cfg->genCfg.lmPst.prior = PRIOR0;
1394 cfg->genCfg.lmPst.route = RTESPEC;
1395 cfg->genCfg.lmPst.region = MAC_MEM_REGION;
1396 cfg->genCfg.lmPst.pool = MAC_POOL;
1397 cfg->genCfg.lmPst.selector = ODU_SELECTOR_LC;
1400 rgMngmt.hdr.msgType = TCFG;
1401 rgMngmt.hdr.entId.ent = ENTMAC;
1402 rgMngmt.hdr.entId.inst = DU_INST;
1403 rgMngmt.hdr.elmId.elmnt = STSCHINST;
1404 rgMngmt.hdr.response.mem.region = MAC_MEM_REGION;
1405 rgMngmt.hdr.response.mem.pool = MAC_POOL;
1408 pst.selector = ODU_SELECTOR_LC;
1409 pst.srcEnt = ENTDUAPP;
1410 pst.dstEnt = ENTMAC;
1411 pst.dstProcId = DU_PROC;
1412 pst.srcProcId = DU_PROC;
1413 pst.srcInst = DU_INST;
1415 pst.region = duCb.init.region;
1416 pst.event = (Event) EVTMACSCHGENCFGREQ;
1418 DU_LOG("\nDU_APP : MAC Sch Cfg sent");
1420 /* Send the request to MAC */
1421 cmPkLrgSchCfgReq(&pst, &rgMngmt);
1427 /**************************************************************************
1428 * @brief Function to configure SCTP params and
1429 * responsible for F1 and E2 interfaces
1433 * Function : duLayerConfigComplete
1436 * Configures SCTP Params and responsible for handling
1437 * F1 and E2 interface.
1440 * @return ROK - success
1443 ***************************************************************************/
1444 uint8_t duLayerConfigComplete()
1448 DU_LOG("\nDU_APP : Configuring all Layer is complete");
1450 if((ret = duSctpCfgReq(duCfgParam.sctpParams)) != ROK)
1452 DU_LOG("\nDU_APP : Failed configuring Sctp Params");
1455 if((ret = duSctpAssocReq(F1_INTERFACE)) != ROK)
1457 DU_LOG("\nDU_APP : Failed to send AssocReq F1");
1460 if((ret = duSctpAssocReq(E2_INTERFACE)) != ROK)
1462 DU_LOG("\nDU_APP : Failed to send AssocReq E2");
1469 /**************************************************************************
1470 * @brief Function to handle SCH Config Confirm from MAC
1474 * Function : duHdlSchCfgComplete
1477 * Handles Scheduler Gen Config Confirm from MAC
1479 * @param[in] Pst *pst, Post structure of the primitive.
1480 * @param[in] RgMngmt *cfm, Unpacked primitive info received from MAC
1481 * @return ROK - success
1484 ***************************************************************************/
1485 uint8_t duHdlSchCfgComplete(Pst *pst, RgMngmt *cfm)
1487 if (cfm->cfm.status == LCM_PRIM_OK)
1489 switch (cfm->hdr.elmId.elmnt)
1493 DU_LOG("\nDU_APP : Received SCH CFG CFM at DU APP");
1500 duLayerConfigComplete();
1501 duBuildEgtpCfgReq();
1505 /*******************************************************************
1507 * @brief Sends Slot indication to EGTP
1511 * Function : duSendEgtpSlotInd
1514 * Sends Slot indication to EGTP
1517 * @return ROK - success
1520 * ****************************************************************/
1521 uint8_t duSendEgtpSlotInd()
1525 duFillEgtpPst(&pst, EVTSLOTIND);
1526 packEgtpSlotInd(&pst);
1532 /**************************************************************************
1533 * @brief Function to fill and send MacCellconfig
1537 * Function : duBuildAndSendMacCellCfg
1540 * Initiates MAC Configs towards MAC
1543 * @return ROK - success
1546 ***************************************************************************/
1547 uint8_t duBuildAndSendMacCellCfg()
1550 DU_SET_ZERO(&pst, sizeof(Pst));
1551 MacCellCfg *duMacCellCfg = NULLP;
1553 DU_ALLOC_SHRABL_BUF(duMacCellCfg, sizeof(MacCellCfg));
1554 if(duMacCellCfg == NULLP)
1559 /* store the address in the duCb so that we can free on confirm msg */
1560 duCb.duMacCellCfg = duMacCellCfg;
1562 /* copy the mac config structure from duCfgParams */
1563 memcpy(duMacCellCfg,&duCfgParam.macCellCfg,sizeof(MacCellCfg));
1566 FILL_PST_DUAPP_TO_MAC(pst, EVENT_MAC_CELL_CONFIG_REQ);
1568 /* Send MAC cell config to MAC */
1569 return (*packMacCellCfgOpts[pst.selector])(&pst, duMacCellCfg);
1572 /**************************************************************************
1573 * @brief Function to Handle MAC cell config confirm
1577 * Function : duHandleMacCellCfgCfm
1580 * Initiates general Configs towards MAC
1583 * @return ROK - success
1586 ***************************************************************************/
1587 uint8_t duHandleMacCellCfgCfm(Pst *pst, MacCellCfgCfm *macCellCfgCfm)
1589 uint8_t actvCellIdx = 0;
1592 if(macCellCfgCfm->rsp == ROK)
1594 for(actvCellIdx = 0 ; actvCellIdx <duCb.numActvCells ; actvCellIdx++)
1596 if(macCellCfgCfm->cellId == duCb.actvCellLst[actvCellIdx]->cellId)
1598 duCb.duMacCellCfg = NULLP;
1599 /* Build and send GNB-DU config update */
1600 ret = BuildAndSendDUConfigUpdate();
1602 /* TODO: Trigger cell start req once cell up slot ind is received*/
1603 /* Build and Send Cell Start Req to MAC */
1604 ret = duBuildAndSendMacCellStartReq();
1611 DU_LOG("\nMac cell cfg failed");
1617 /*******************************************************************
1619 * @brief Handles slot indication from MAC
1623 * Function : duHandleSlotInd
1626 * Handles slot indication from MAC
1628 * @params[in] Post structure pointer
1630 * @return ROK - success
1633 * ****************************************************************/
1634 uint8_t duHandleSlotInd(Pst *pst, SlotIndInfo *slotInfo)
1637 DU_LOG("\nDU APP : Slot Indication received");
1639 if(slotInfo->cellId <=0 || slotInfo->cellId > MAX_NUM_CELL)
1641 DU_LOG("\nDU APP : Invalid Cell Id %d", slotInfo->cellId);
1643 if(!duCb.actvCellLst[slotInfo->cellId-1]->firstSlotIndRcvd)
1645 duCb.actvCellLst[slotInfo->cellId-1]->firstSlotIndRcvd = true;
1646 if((duCb.actvCellLst[slotInfo->cellId-1] != NULL) && \
1647 (duCb.actvCellLst[slotInfo->cellId-1]->cellStatus == \
1648 ACTIVATION_IN_PROGRESS))
1650 DU_LOG("\nDU APP : 5G-NR Cell %d is UP", slotInfo->cellId);
1651 duCb.actvCellLst[slotInfo->cellId-1]->cellStatus = ACTIVATED;
1656 /* TODO : Slot Indication to be moved out of EGTP_TEST when
1657 * data path is established */
1659 duSendEgtpSlotInd();
1662 if((pst->selector == ODU_SELECTOR_LWLC) || (pst->selector == ODU_SELECTOR_TC))
1663 DU_FREE_SHRABL_BUF(MAC_MEM_REGION, pst->pool, slotInfo, sizeof(SlotIndInfo));
1668 /*******************************************************************
1670 * @brief Builds and sends cell start request to MAC
1674 * Function : duBuildAndSendMacCellStartReq
1677 * Builds and sends cell start request to MAC
1680 * @return ROK - success
1683 * ****************************************************************/
1684 uint8_t duBuildAndSendMacCellStartReq()
1687 MacCellStartInfo *cellStartInfo = NULL;
1689 DU_LOG("\nDU APP : Building and Sending cell start request to MAC");
1691 /* Send Cell Start Request to MAC */
1692 DU_ALLOC_SHRABL_BUF(cellStartInfo, sizeof(MacCellStartInfo));
1695 DU_LOG("\nDU APP : Memory alloc failed while building cell start request");
1699 for(uint8_t id = 0; id < MAX_NUM_CELL; id++)
1701 if(duCb.actvCellLst[id])
1703 duCb.actvCellLst[id]->firstSlotIndRcvd = FALSE;
1704 cellStartInfo->cellId = duCb.actvCellLst[id]->cellInfo.nrEcgi.cellId;
1707 FILL_PST_DUAPP_TO_MAC(pst, EVENT_MAC_CELL_START_REQ);
1709 return (*packMacCellStartReqOpts[pst.selector])(&pst, cellStartInfo);
1715 /*******************************************************************
1717 * @brief Builds and sends cell stop request to MAC
1721 * Function : duBuildAndSendMacCellStopReq
1724 * Builds and sends cell stop request to MAC
1727 * @return ROK - success
1730 * ****************************************************************/
1731 uint8_t duBuildAndSendMacCellStopReq()
1734 MacCellStopInfo *cellStopInfo = NULL;
1736 DU_LOG("\nDU APP : Building and Sending cell stop request to MAC");
1738 /* Send Cell Stop Request to MAC */
1739 DU_ALLOC_SHRABL_BUF(cellStopInfo, sizeof(MacCellStopInfo));
1742 DU_LOG("\nDU APP : Memory alloc failed while building cell stop request");
1745 cellStopInfo->cellId = duCb.actvCellLst[0]->cellId;
1748 FILL_PST_DUAPP_TO_MAC(pst, EVENT_MAC_CELL_STOP_REQ);
1750 return (*packMacCellStopReqOpts[pst.selector])(&pst, cellStopInfo);
1753 /*******************************************************************
1755 * @brief Handles stop indication from MAC
1759 * Function : duHandleStopInd
1762 * Handles stop indication from MAC
1764 * @params[in] Post structure pointer
1765 * @return ROK - success
1768 * ****************************************************************/
1769 uint8_t duHandleStopInd(Pst *pst, MacCellStopInfo *cellStopId)
1771 if(cellStopId->cellId <=0 || cellStopId->cellId > MAX_NUM_CELL)
1773 DU_LOG("\nDU APP : Invalid Cell Id %d", cellStopId->cellId);
1775 if(duCb.actvCellLst[cellStopId->cellId-1] != NULL)
1777 if(duCb.actvCellLst[cellStopId->cellId-1]->firstSlotIndRcvd)
1779 duCb.actvCellLst[cellStopId->cellId-1]->firstSlotIndRcvd = false;
1780 if((duCb.actvCellLst[cellStopId->cellId-1]->cellStatus == \
1783 DU_LOG("\nDU APP : 5G-NR Cell %d is DOWN", cellStopId->cellId);
1784 duCb.actvCellLst[cellStopId->cellId-1]->cellStatus = DELETION_IN_PROGRESS;
1788 if((pst->selector == ODU_SELECTOR_LWLC) || (pst->selector == ODU_SELECTOR_TC))
1789 DU_FREE_SHRABL_BUF(MAC_MEM_REGION, pst->pool, cellStopId, sizeof(MacCellStopInfo));
1794 /*******************************************************************
1796 * @brief Handles slot indication from MAC
1800 * Function : duHandleUlCcchInd
1803 * Handles UL CCCH indication from MAC
1805 * @params[in] Post structure pointer
1806 * UL CCCH Ind pointer
1807 * @return ROK - success
1810 * ****************************************************************/
1811 uint8_t duHandleUlCcchInd(Pst *pst, UlCcchIndInfo *ulCcchIndInfo)
1814 DU_LOG("\nDU APP : UL CCCH Indication received");
1816 return (duProcUlCcchInd(ulCcchIndInfo));
1819 /*******************************************************************
1821 * @brief Process UL RRC Message from RLC
1825 * Function : DuProcRlcUlRrcMsgTrans
1827 * Functionality: Process UL RRC Message from RLC
1829 * @params[in] Post structure
1830 * UL RRC Message Info
1831 * @return ROK - success
1834 * ****************************************************************/
1835 uint8_t DuProcRlcUlRrcMsgTrans(Pst *pst, RlcUlRrcMsgInfo *ulRrcMsgInfo)
1839 ueCb = duCb.actvCellLst[ulRrcMsgInfo->cellId -1]->ueCb[ulRrcMsgInfo->ueIdx -1];
1840 BuildAndSendULRRCMessageTransfer(ueCb, ulRrcMsgInfo->lcId, ulRrcMsgInfo->msgLen, \
1841 ulRrcMsgInfo->rrcMsg);
1843 DU_FREE_SHRABL_BUF(pst->region, pst->pool, ulRrcMsgInfo->rrcMsg, ulRrcMsgInfo->msgLen);
1844 DU_FREE_SHRABL_BUF(pst->region, pst->pool, ulRrcMsgInfo, sizeof(RlcUlRrcMsgInfo));
1848 /*******************************************************************
1850 * @brief Process RRC delivery report from RLC
1854 * Function : DuProcRlcRrcDeliveryReport
1856 * Functionality: Process RRC delivery Message from RLC
1858 * @params[in] Post structure
1859 * UL RRC Message Info
1860 * @return ROK - success
1863 * ****************************************************************/
1864 uint8_t DuProcRlcRrcDeliveryReport(Pst *pst, RrcDeliveryReport *rrcDeliveryReport)
1867 uint8_t ret = RFAILED;
1869 ueCb = duCb.actvCellLst[rrcDeliveryReport->cellId -1]->ueCb[rrcDeliveryReport->ueIdx -1];
1870 ret = BuildAndSendRrcDeliveryReport(ueCb.gnbCuUeF1apId, ueCb.gnbDuUeF1apId,rrcDeliveryReport);
1872 DU_FREE_SHRABL_BUF(pst->region, pst->pool, rrcDeliveryReport, sizeof(RrcDeliveryReport));
1877 /**********************************************************************
1879 **********************************************************************/