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"
29 #include "du_f1ap_msg_hdl.h"
30 #include "du_ue_mgr.h"
33 #include "lphy_stub.h"
42 extern DuCfgParams duCfgParam;
43 extern S16 cmPkLkwCfgReq(Pst *pst, KwMngmt *cfg);
44 extern S16 cmPkLkwCntrlReq(Pst *pst, KwMngmt *cfg);
45 extern S16 cmPkLrgCfgReq(Pst *pst, RgMngmt *cfg);
46 extern S16 BuildAndSendE2SetupReq();
47 extern S16 egtpHdlDatInd(EgtpMsg egtpMsg);
48 extern uint8_t BuildAndSendDUConfigUpdate();
49 extern U16 getTransId();
50 extern S16 cmPkLrgSchCfgReq(Pst * pst,RgMngmt * cfg);
52 packMacCellCfgReq packMacCellCfgOpts[] =
54 packMacCellCfg, /* packing for loosely coupled */
55 MacHdlCellCfgReq, /* packing for tightly coupled */
56 packMacCellCfg, /* packing for light weight loosly coupled */
59 DuMacCellStartReq packMacCellStartReqOpts[] =
61 packMacCellStartReq, /* Loose coupling */
62 MacHdlCellStartReq, /* TIght coupling */
63 packMacCellStartReq /* Light weight-loose coupling */
66 DuMacCellStopReq packMacCellStopReqOpts[] =
68 packMacCellStopReq, /* Loose coupling */
69 MacHdlCellStopReq, /* TIght coupling */
70 packMacCellStopReq /* Light weight-loose coupling */
73 /**************************************************************************
74 * @brief Function to fill configs required by RLC
78 * Function : duBuildRlcCfg
81 * Initiates general Configs towards RLC
83 * @param[in] Inst Specifies if RLC UL or RLC DL instance
84 * @return ROK - success
87 ***************************************************************************/
88 S16 duBuildRlcCfg(Inst inst)
91 KwGenCfg *genCfg = NULLP;
94 DU_SET_ZERO(&kwMngmt, sizeof(KwMngmt));
95 DU_SET_ZERO(&pst, sizeof(Pst));
97 genCfg = &(kwMngmt.t.cfg.s.gen);
99 /*----------- Fill General Configuration Parameters ---------*/
100 genCfg->maxUe = duCfgParam.maxUe;
101 genCfg->maxKwuSaps = 2;
102 genCfg->maxUdxSaps = 1;
103 genCfg->rlcMode = (inst == RLC_UL_INST) ?
104 LKW_RLC_MODE_UL : LKW_RLC_MODE_DL;
106 genCfg->maxRguSaps = DEFAULT_CELLS;
108 /*----------- Fill lmPst
109 * Parameters ---------*/
110 genCfg->lmPst.dstProcId = DU_PROC;
111 genCfg->lmPst.srcProcId = DU_PROC;
112 genCfg->lmPst.dstEnt = ENTDUAPP;
113 genCfg->lmPst.dstInst = DU_INST;
114 genCfg->lmPst.srcEnt = ENTKW;
115 genCfg->lmPst.srcInst = inst;
116 genCfg->lmPst.prior = PRIOR0;
117 genCfg->lmPst.route = RTESPEC;
118 genCfg->lmPst.region = (inst == RLC_UL_INST) ?
119 RLC_UL_MEM_REGION:RLC_DL_MEM_REGION;
120 genCfg->lmPst.pool = RLC_POOL;
121 genCfg->lmPst.selector = ODU_SELECTOR_LC;
124 kwMngmt.hdr.msgType = TCFG;
125 kwMngmt.hdr.msgLen = 0;
126 kwMngmt.hdr.entId.ent = ENTKW;
127 kwMngmt.hdr.entId.inst = (Inst)0;
128 kwMngmt.hdr.elmId.elmnt = STGEN;
129 kwMngmt.hdr.seqNmb = 0;
130 kwMngmt.hdr.version = 0;
131 kwMngmt.hdr.transId = 0;
132 kwMngmt.hdr.response.prior = PRIOR0;
133 kwMngmt.hdr.response.route = RTESPEC;
134 kwMngmt.hdr.response.mem.region = (inst == RLC_UL_INST) ?
135 RLC_UL_MEM_REGION:RLC_DL_MEM_REGION;
136 kwMngmt.hdr.response.mem.pool = DU_POOL;
137 kwMngmt.hdr.response.selector = ODU_SELECTOR_LC;
140 pst.selector = ODU_SELECTOR_LC;
141 pst.srcEnt = ENTDUAPP;
144 pst.dstProcId = DU_PROC;
145 pst.srcProcId = DU_PROC;
146 pst.region = duCb.init.region;
148 DU_LOG("\nDU_APP : RLC Gen Cfg Req sent for inst %d", inst);
150 /* Send the request to RLC */
151 cmPkLkwCfgReq(&pst, &kwMngmt);
156 /**************************************************************************
157 * @brief Function to fill configs required by RLC
161 * Function : duBuildRlcLsapCfg
164 * Initiates general Configs towards RLC
166 * @param[in] Inst Specifies if RLC UL or RLC DL instance
167 * @return ROK - success
170 ***************************************************************************/
171 S16 duBuildRlcLsapCfg(Ent ent, Inst inst, U8 lsapInst)
175 KwSapCfg *lSap = NULLP;
178 DU_SET_ZERO(&kwMngmt, sizeof(KwMngmt));
179 DU_SET_ZERO(&pst, sizeof(Pst));
182 kwMngmt.hdr.msgType = TCFG;
183 kwMngmt.hdr.entId.ent = ENTKW;
184 kwMngmt.hdr.response.mem.region = (inst == RLC_UL_INST) ?
185 RLC_UL_MEM_REGION:RLC_DL_MEM_REGION;
187 kwMngmt.hdr.response.mem.pool = RLC_POOL;
190 pst.selector = ODU_SELECTOR_LC;
191 pst.srcEnt = ENTDUAPP;
193 pst.dstProcId = DU_PROC;
195 pst.srcProcId = DU_PROC;
196 pst.region = duCb.init.region;
197 lSap = &(kwMngmt.t.cfg.s.sap);
199 lSap->mem.region = (inst == RLC_UL_INST) ?
200 RLC_UL_MEM_REGION:RLC_DL_MEM_REGION;
201 lSap->mem.pool = RLC_POOL;
203 lSap->bndTmrIntvl = 10;
204 lSap->priority = PRIOR0;
205 lSap->route = RTESPEC;
208 lSap->procId = DU_PROC;
210 lSap->inst = lsapInst;
211 lSap->sapId = lsapInst; /* SapId will be stored as suId in MAC */
212 lSap->selector = (inst == RLC_UL_INST) ? ODU_SELECTOR_LWLC : ODU_SELECTOR_TC;
213 kwMngmt.hdr.elmId.elmnt = STRGUSAP;
214 DU_LOG("\nDU_APP : RLC MAC Lower Sap Cfg Req sent for inst %d", inst);
219 lSap->procId = DU_PROC;
221 lSap->inst = (inst == RLC_UL_INST) ?
222 RLC_DL_INST : RLC_UL_INST;
224 lSap->selector = ODU_SELECTOR_LC;
225 kwMngmt.hdr.elmId.elmnt = STUDXSAP;
226 DU_LOG("\nDU_APP : RLC DL/UL Lower Sap Cfg Req sent for inst %d", inst);
229 cmPkLkwCfgReq(&pst, &kwMngmt);
233 /**************************************************************************
234 * @brief Function to fill configs required by RLC
238 * Function : duBuildRlcUsapCfg
241 * Initiates general Configs towards RLC
243 * @param[in] Inst Specifies if RLC UL or RLC DL instance
244 * @return ROK - success
247 ***************************************************************************/
248 S16 duBuildRlcUsapCfg(U8 elemId, Ent ent, Inst inst)
251 KwSapCfg *uSap = NULLP;
254 DU_SET_ZERO(&kwMngmt, sizeof(KwMngmt));
255 DU_SET_ZERO(&pst, sizeof(Pst));
257 uSap = &(kwMngmt.t.cfg.s.sap);
259 uSap->selector = ODU_SELECTOR_LC;
260 uSap->mem.region = (inst == RLC_UL_INST) ?
261 RLC_UL_MEM_REGION:RLC_DL_MEM_REGION;
262 uSap->mem.pool = RLC_POOL;
265 uSap->procId = DU_PROC;
269 uSap->inst = (inst == RLC_UL_INST) ?
270 RLC_DL_INST : RLC_UL_INST;
271 uSap->bndTmrIntvl = 1000;
272 uSap->priority = PRIOR0;
273 uSap->route = RTESPEC;
276 kwMngmt.hdr.msgType = TCFG;
277 kwMngmt.hdr.entId.ent = ENTKW;
278 kwMngmt.hdr.elmId.elmnt = STUDXSAP;
279 kwMngmt.hdr.response.mem.region = (inst == RLC_UL_INST) ?
280 RLC_UL_MEM_REGION:RLC_DL_MEM_REGION;
282 kwMngmt.hdr.response.mem.pool = RLC_POOL;
285 pst.selector = ODU_SELECTOR_LC;
286 pst.srcEnt = ENTDUAPP;
288 pst.dstProcId = DU_PROC;
290 pst.srcProcId = DU_PROC;
291 pst.region = duCb.init.region;
293 DU_LOG("\nDU_APP : RLC Kwu Upper Sap Cfg Req sent for inst %d", inst);
294 cmPkLkwCfgReq(&pst, &kwMngmt);
299 /**************************************************************************
300 * @brief Function to populate internal DS of DU APP
304 * Function : duProcCfgComplete
307 * Populates internal data structures of DU APP after
308 * receiving configurations.
311 * @return ROK - success
314 ***************************************************************************/
315 S16 duProcCfgComplete()
318 static U16 cellId = 0;
320 for(idx=0; idx< DEFAULT_CELLS; idx++)
322 DuCellCb *cell = NULLP;
323 DU_ALLOC(cell, sizeof(DuCellCb))
326 DU_LOG("\nDU_APP : Memory Allocation failed in duProcCfgComplete");
333 memset(cell, 0, sizeof(DuCellCb));
334 cell->cellId = ++cellId;
335 cell->cellInfo.nrEcgi.plmn.mcc[0] = PLMN_MCC0;
336 cell->cellInfo.nrEcgi.plmn.mcc[1] = PLMN_MCC1;
337 cell->cellInfo.nrEcgi.plmn.mcc[2] = PLMN_MCC2;
338 cell->cellInfo.nrEcgi.plmn.mnc[0] = PLMN_MNC0;
339 cell->cellInfo.nrEcgi.plmn.mnc[1] = PLMN_MNC1;
340 cell->cellInfo.nrEcgi.plmn.mnc[2] = PLMN_MNC2;
341 cell->cellInfo.nrEcgi.cellId = NR_CELL_ID;
342 cell->cellInfo.nrPci = NR_PCI;
343 cell->cellInfo.fiveGsTac = DU_TAC;
344 for(idx1=0; idx1<MAX_PLMN; idx1++)
346 cell->cellInfo.plmn[idx1].mcc[0] = PLMN_MCC0;
347 cell->cellInfo.plmn[idx1].mcc[1] = PLMN_MCC1;
348 cell->cellInfo.plmn[idx1].mcc[2] = PLMN_MCC2;
349 cell->cellInfo.plmn[idx1].mnc[0] = PLMN_MNC0;
350 cell->cellInfo.plmn[idx1].mnc[1] = PLMN_MNC1;
351 cell->cellInfo.plmn[idx1].mnc[2] = PLMN_MNC2;
353 cell->cellInfo.maxUe = duCfgParam.maxUe;
354 cell->cellStatus = CELL_OUT_OF_SERVICE;
355 nci = (U16)cell->cellInfo.nrEcgi.cellId;
357 duCb.cfgCellLst[nci-1] = cell;
362 //Start layer configs
363 ret = duSendRlcUlCfg();
367 /**************************************************************************
368 * @brief Function to invoke DU Layer Configs
372 * Function : duSendRlcUlCfg
375 * Initiates Configs towards layers of DU
378 * @return ROK - success
381 ***************************************************************************/
386 duBuildRlcCfg((Inst)RLC_UL_INST);
387 for(cellIdx = 0; cellIdx < DEFAULT_CELLS; cellIdx++)
389 duBuildRlcLsapCfg(ENTRG, (Inst)RLC_UL_INST, cellIdx);
391 duBuildRlcLsapCfg(ENTKW, (Inst)RLC_UL_INST, 0);
396 /**************************************************************************
397 * @brief Function to invoke DU Layer Configs
401 * Function : duSendRlcDlCfg
404 * Initiates Configs towards layers of DU
407 * @return ROK - success
410 ***************************************************************************/
415 duBuildRlcCfg((Inst)RLC_DL_INST);
416 duBuildRlcUsapCfg(STUDXSAP, ENTKW, (Inst)RLC_DL_INST);
417 for(cellIdx = 0; cellIdx < DEFAULT_CELLS; cellIdx++)
419 duBuildRlcLsapCfg(ENTRG, (Inst)RLC_DL_INST, cellIdx);
424 /**************************************************************************
425 * @brief Function to handle Config Confirm from RLC
429 * Function : duHdlRlcCfgComplete
432 * Handles Gen Config Confirm from RLC
434 * @param[in] Pst *pst, Post structure of the primitive.
435 * @param[in] KwMngmt *cfm, Unpacked primitive info received from RLC
436 * @return ROK - success
439 ***************************************************************************/
440 S16 duHdlRlcCfgComplete(Pst *pst, KwMngmt *cfm)
443 if (pst->srcInst == RLC_UL_INST)
445 ret = duProcRlcUlCfgComplete(pst, cfm);
449 ret = duProcRlcDlCfgComplete(pst, cfm);
454 /**************************************************************************
455 * @brief Function to handle Control Config Confirm from RLC
459 * Function : duHdlRlcCntrlCfgComplete
462 * Handles Control Config Confirm from RLC
464 * @param[in] Pst *pst, Post structure of the primitive.
465 * @param[in] KwMngmt *cfm, Unpacked primitive info received from RLC
466 * @return ROK - success
469 ***************************************************************************/
470 S16 duHdlRlcCntrlCfgComplete(Pst *pst, KwMngmt *cntrl)
474 if (cntrl->cfm.status == LCM_PRIM_OK)
476 switch (cntrl->hdr.elmId.elmnt)
480 if (pst->srcInst == RLC_DL_INST)
482 DU_LOG("\nDU_APP : BIND OF RLC DL TO MAC (RGU) SAP SUCCESSFUL");
484 if(macCfgInst < DEFAULT_CELLS)
487 duBindUnbindRlcToMacSap((Inst) RLC_DL_INST, ABND);
491 duBindUnbindRlcToMacSap((Inst) RLC_UL_INST, ABND);
496 DU_LOG("\nDU_APP : BIND OF RLC UL TO MAC (RGU) SAP SUCCESSFUL");
498 if(macCfgInst < DEFAULT_CELLS)
500 duBindUnbindRlcToMacSap((Inst) RLC_UL_INST, ABND);
514 /**************************************************************************
515 * @brief Function to handle Config Confirm from RLC UL
519 * Function : duHdlRlcUlCfgComplete
522 * Handles Config Confirm from RLC UL
524 * @param[in] Pst *pst, Post structure of the primitive.
525 * @param[in] KwMngmt *cfm, Unpacked primitive info received from RLC UL
526 * @return ROK - success
529 ***************************************************************************/
530 S16 duProcRlcUlCfgComplete(Pst *pst, KwMngmt *cfm)
534 DU_LOG("\nDU_APP : RLC UL Cfg Status %d", cfm->cfm.status);
535 if (cfm->cfm.status == LCM_PRIM_OK)
537 switch(cfm->hdr.elmId.elmnt)
541 rlcUlCfg |= RLC_GEN_CFG;
547 if(numRlcMacSaps == DEFAULT_CELLS)
549 rlcUlCfg |= RLC_MAC_SAP_CFG;
556 rlcUlCfg |= RLC_UDX_SAP_CFG;
563 DU_LOG("\nDU_APP : RLC UL Cfg Cfm received for the element %d ",cfm->hdr.elmId.elmnt);
564 if(rlcUlCfg == DU_RLC_UL_CONFIGURED)
568 //Start configuration of RLC DL
575 DU_LOG("\nDU_APP : Config confirm NOK from RLC UL");
581 /**************************************************************************
582 * @brief Function to handle Config Confirm from RLC DL
586 * Function : duHdlRlcDlCfgComplete
589 * Handles Config Confirm from RLC DL
591 * @param[in] Pst *pst, Post structure of the primitive.
592 * @param[in] KwMngmt *cfm, Unpacked primitive info received from RLC DL
593 * @return ROK - success
596 ***************************************************************************/
597 S16 duProcRlcDlCfgComplete(Pst *pst, KwMngmt *cfm)
599 DU_LOG("\nDU_APP : RLC DL Cfg Status %d", cfm->cfm.status);
600 if (cfm->cfm.status == LCM_PRIM_OK)
602 switch(cfm->hdr.elmId.elmnt)
606 rlcDlCfg |= RLC_GEN_CFG;
612 if(numRlcMacSaps == DEFAULT_CELLS)
614 rlcDlCfg |= RLC_MAC_SAP_CFG;
621 rlcDlCfg |= RLC_UDX_SAP_CFG;
629 DU_LOG("\nDU_APP : RLC DL Cfg Cfm received for the element %d ",cfm->hdr.elmId.elmnt);
630 if(rlcDlCfg == DU_RLC_DL_CONFIGURED)
633 //Start configuration of MAC
640 DU_LOG("\nDU_APP : Config confirm NOK from RLC DL");
645 /**************************************************************************
646 * @brief Function to send configs to MAC
650 * Function : duSendMacCfg
653 * Initiates Configs towards MAC layer
656 * @return ROK - success
659 ***************************************************************************/
663 duBuildMacUsapCfg(RLC_UL_INST);
664 duBuildMacUsapCfg(RLC_DL_INST);
669 /**************************************************************************
670 * @brief Function to fill gen config required by MAC
674 * Function : duBuildMacGenCfg
677 * Initiates general Configs towards MAC
680 * @return ROK - success
683 ***************************************************************************/
684 S16 duBuildMacGenCfg()
687 RgGenCfg *genCfg=NULLP;
690 DU_SET_ZERO(&pst, sizeof(Pst));
691 DU_SET_ZERO(&rgMngmt, sizeof(RgMngmt));
693 genCfg = &(rgMngmt.t.cfg.s.genCfg);
695 /*----------- Fill General Configuration Parameters ---------*/
696 genCfg->mem.region = MAC_MEM_REGION;
697 genCfg->mem.pool = RG_POOL;
699 genCfg->numRguSaps = 2;
701 genCfg->lmPst.dstProcId = DU_PROC;
702 genCfg->lmPst.srcProcId = DU_PROC;
703 genCfg->lmPst.dstEnt = ENTDUAPP;
704 genCfg->lmPst.dstInst = 0;
705 genCfg->lmPst.srcEnt = ENTRG;
706 genCfg->lmPst.srcInst = macCfgInst;
707 genCfg->lmPst.prior = PRIOR0;
708 genCfg->lmPst.route = RTESPEC;
709 genCfg->lmPst.region = MAC_MEM_REGION;
710 genCfg->lmPst.pool = RG_POOL;
711 genCfg->lmPst.selector = ODU_SELECTOR_LC;
714 rgMngmt.hdr.msgType = TCFG;
715 rgMngmt.hdr.msgLen = 0;
716 rgMngmt.hdr.entId.ent = ENTRG;
717 rgMngmt.hdr.entId.inst = (Inst)0;
718 rgMngmt.hdr.elmId.elmnt = STGEN;
719 rgMngmt.hdr.seqNmb = 0;
720 rgMngmt.hdr.version = 0;
721 rgMngmt.hdr.transId = 0;
723 rgMngmt.hdr.response.prior = PRIOR0;
724 rgMngmt.hdr.response.route = RTESPEC;
725 rgMngmt.hdr.response.mem.region = MAC_MEM_REGION;
726 rgMngmt.hdr.response.mem.pool = RG_POOL;
727 rgMngmt.hdr.response.selector = ODU_SELECTOR_LC;
730 pst.selector = ODU_SELECTOR_LC;
731 pst.srcEnt = ENTDUAPP;
733 pst.dstInst = macCfgInst;
734 pst.dstProcId = DU_PROC;
735 pst.srcProcId = DU_PROC;
736 pst.region = duCb.init.region;
738 DU_LOG("\nDU_APP : MAC Gen Cfg Req sent");
740 /* Send the request to MAC */
741 cmPkLrgCfgReq(&pst, &rgMngmt);
746 /**************************************************************************
747 * @brief Function to fill USAP config required by MAC
751 * Function : duBuildMacUsapCfg
754 * Initiates USAP Configs towards MAC
756 * @param[in] SpId Specifies if RLC UL or RLC DL instance
757 * @return ROK - success
760 ***************************************************************************/
761 S16 duBuildMacUsapCfg(SpId sapId)
764 RgUpSapCfg *uSap = NULLP;
767 DU_SET_ZERO(&pst, sizeof(Pst));
768 DU_SET_ZERO(&rgMngmt, sizeof(RgMngmt));
770 uSap = &(rgMngmt.t.cfg.s.rguSap);
772 uSap->mem.region = MAC_MEM_REGION;
773 uSap->mem.pool = RG_POOL;
776 uSap->procId = DU_PROC;
779 uSap->prior = PRIOR0;
780 uSap->route = RTESPEC;
781 uSap->selector = ODU_SELECTOR_LC ;
784 rgMngmt.hdr.msgType = TCFG;
785 rgMngmt.hdr.entId.ent = ENTRG;
786 rgMngmt.hdr.entId.inst = (Inst)0;
787 rgMngmt.hdr.elmId.elmnt = STRGUSAP;
788 rgMngmt.hdr.response.mem.region = MAC_MEM_REGION;
789 rgMngmt.hdr.response.mem.pool = RG_POOL;
792 pst.selector = ODU_SELECTOR_LC;
793 pst.srcEnt = ENTDUAPP;
795 pst.dstInst = macCfgInst;
796 pst.dstProcId = DU_PROC;
797 pst.srcProcId = DU_PROC;
798 pst.region = duCb.init.region;
800 DU_LOG("\nDU_APP : MAC Rgu USap Cfg Req sent");
802 /* Send the request to MAC */
803 cmPkLrgCfgReq(&pst, &rgMngmt);
808 /**************************************************************************
809 * @brief Function to handle Config Confirm from MAC
813 * Function : duHdlMacCfgComplete
816 * Handles Gen Config Confirm from MAC
818 * @param[in] Pst *pst, Post structure of the primitive.
819 * @param[in] RgMngmt *cfm, Unpacked primitive info received from MAC
820 * @return ROK - success
823 ***************************************************************************/
824 S16 duHdlMacCfgComplete(Pst *pst, RgMngmt *cfm)
828 if (cfm->cfm.status == LCM_PRIM_OK)
830 switch (cfm->hdr.elmId.elmnt)
834 macCfg |= MAC_GEN_CFG;
839 macCfg |= MAC_SAP_CFG;
846 DU_LOG("\nDU_APP : MAC Cfg Cfm received for the element %d ",cfm->hdr.elmId.elmnt);
847 if(macCfg == MAC_CONFIGURED && numRlcMacSaps == MAX_MAC_SAP)
850 DU_LOG("\nDU_APP : Completed sending Configs");
852 duBindUnbindRlcToMacSap(RLC_DL_INST, ABND);
858 DU_LOG("\nDU_APP : Config confirm NOK from MAC");
864 /**************************************************************************
865 * @brief Function to bind/unbind RLC to MAC SAP
869 * Function : duBindUnbindRlcToMacSap
872 * Initiates Bind/Unbind from RLC to MAC
874 * @param[in] Inst Specifies if RLC UL or RLC DL instance
875 * @param[in] action Specifies if action is bind or unbind
876 * @return ROK - success
879 ***************************************************************************/
880 S16 duBindUnbindRlcToMacSap(U8 inst, U8 action)
882 KwCntrl *cntrl = NULLP;
886 TRC2(smBindKwToRguSap)
888 DU_SET_ZERO(&kwMngmt, sizeof(KwMngmt));
889 DU_SET_ZERO(&pst, sizeof(Pst));
893 DU_LOG("\nDU_APP : Cntrl Req to RLC inst %d to bind MAC sap", inst);
897 DU_LOG("\nDU_APP : Cntrl Req to RLC inst %d to unbind MAC sap", inst);
899 cntrl = &(kwMngmt.t.cntrl);
901 cntrl->action = action;
902 cntrl->subAction = DU_ZERO_VAL;
903 cntrl->s.sapCntrl.suId = macCfgInst;
904 cntrl->s.sapCntrl.spId = inst;
907 kwMngmt.hdr.msgType = TCNTRL;
908 kwMngmt.hdr.entId.ent = ENTKW;
909 kwMngmt.hdr.entId.inst = inst;
910 kwMngmt.hdr.elmId.elmnt = 186; /* ambiguous defines in lkw.h and lrg.h so direct hardcoded*/
911 kwMngmt.hdr.response.mem.region = (inst == RLC_UL_INST) ?
912 RLC_UL_MEM_REGION:RLC_DL_MEM_REGION;
913 kwMngmt.hdr.response.mem.pool = RLC_POOL;
916 pst.selector = ODU_SELECTOR_LC;
917 pst.srcEnt = ENTDUAPP;
919 pst.dstProcId = DU_PROC;
921 pst.srcProcId = DU_PROC;
922 pst.region = duCb.init.region;
924 cmPkLkwCntrlReq(&pst, &kwMngmt);
928 /*******************************************************************
930 * @brief Handles SCTP notifications
934 * Function : duSctpNtfyHdl
937 * Handles SCTP notification
939 * @params[in] Message Buffer
942 * @return ROK - success
945 * ****************************************************************/
947 S16 duSctpNtfyHdl(Buffer *mBuf, CmInetSctpNotification *ntfy)
949 if(f1Params.assocId == ntfy->u.assocChange.assocId)
951 if(BuildAndSendF1SetupReq() != ROK)
956 else if(ricParams.assocId == ntfy->u.assocChange.assocId)
958 if(BuildAndSendE2SetupReq() != ROK)
965 DU_LOG("\nDU_APP : Invalid assocId %d received", ntfy->u.assocChange.assocId);
971 /*******************************************************************
973 * @brief Fills Pst struct for ENTEGTP
977 * Function : duFillEgtpPst
980 * Fills Pst struct for ENTEGTP
983 * @return ROK - success
986 * ****************************************************************/
987 S16 duFillEgtpPst(Pst *pst, Event event)
989 cmMemset((U8 *)pst, 0, sizeof(Pst));
990 pst->srcEnt = (Ent)ENTDUAPP;
991 pst->srcInst = (Inst)DU_INST;
992 pst->srcProcId = DU_PROC;
993 pst->dstEnt = (Ent)ENTEGTP;
994 pst->dstInst = (Inst)EGTP_INST;
995 pst->dstProcId = pst->srcProcId;
997 pst->selector = ODU_SELECTOR_LC;
1004 /*******************************************************************
1006 * @brief Function to configure EGTP
1010 * Function : duBuildEgtpCfgReq
1013 * Function to configure EGTP
1016 * @return ROK - success
1019 * ****************************************************************/
1021 S16 duBuildEgtpCfgReq()
1026 DU_LOG("\nDU_APP : Sending EGTP config request");
1028 cmMemset((U8 *)&egtpCfg, 0, sizeof(EgtpConfig));
1029 cmMemcpy((U8 *)&egtpCfg, (U8 *)&duCfgParam.egtpParams, (PTR)sizeof(EgtpConfig));
1031 duFillEgtpPst(&pst, EVTCFGREQ);
1032 packEgtpCfgReq(&pst, egtpCfg);
1037 /*******************************************************************
1039 * @brief Function to configure EGTP
1043 * Function : duBuildEgtpCfgReq
1046 * Function to configure EGTP
1049 * @return ROK - success
1052 * ****************************************************************/
1053 S16 duHdlEgtpCfgComplete(CmStatus cfm)
1057 if(cfm.status == LCM_PRIM_OK)
1059 DU_LOG("\nDU_APP : EGTP configuraton complete");
1061 duSendEgtpSrvOpenReq();
1066 DU_LOG("\nDU_APP : EGTP configuraton failed");
1073 /*******************************************************************
1075 * @brief Sends server open request to EGTP
1079 * Function : duSendEgtpSrvOpenReq
1082 * Sends server open request to EGTP
1085 * @return ROK - success
1088 * ****************************************************************/
1090 S16 duSendEgtpSrvOpenReq()
1094 DU_LOG("\nDU_APP : Sending EGTP server open request");
1096 duFillEgtpPst(&pst, EVTSRVOPENREQ);
1097 packEgtpSrvOpenReq(&pst);
1102 /*******************************************************************
1104 * @brief Handles server open confirmation
1108 * Function : duHdlEgtpSrvOpenComplete
1111 * Handles server open confirmation
1114 * @return ROK - success
1117 *****************************************************************/
1119 S16 duHdlEgtpSrvOpenComplete(CmStatus cfm)
1123 if(cfm.status == LCM_PRIM_OK)
1125 DU_LOG("\nDU_APP : EGTP server opened successfully");
1127 duSendEgtpTnlMgmtReq(EGTP_TNL_MGMT_ADD, EGTP_LCL_TEID, EGTP_REM_TEID);
1132 DU_LOG("\nDU_APP : EGTP server opening failed");
1139 /*******************************************************************
1141 * @brief Sends tunnel management request
1145 * Function : duSendEgtpTnlMgmtReq
1148 * Builds and sends tunnel management request to EGTP
1150 * @params[in] Action
1151 * Local tunnel endpoint id
1152 * Remote tunnel endpoint id
1153 * @return ROK - success
1156 * ****************************************************************/
1158 S16 duSendEgtpTnlMgmtReq(U8 action, U32 lclTeid, U32 remTeid)
1163 tnlEvt.action = action;
1164 tnlEvt.lclTeid = lclTeid;
1165 tnlEvt.remTeid = remTeid;
1167 DU_LOG("\nDU_APP : Sending EGTP tunnel management request");
1169 duFillEgtpPst(&pst, EVTTNLMGMTREQ);
1170 packEgtpTnlMgmtReq(&pst, tnlEvt);
1175 /*******************************************************************
1177 * @brief Handles Tunnel management confirm
1181 * Function : duHdlEgtpTnlMgmtCfm
1184 * Handles tunnel management confirm received from Egtp
1186 * @params[in] Tunnel Event
1187 * @return ROK - success
1190 * ****************************************************************/
1191 S16 duHdlEgtpTnlMgmtCfm(EgtpTnlEvt tnlEvtCfm)
1195 if(tnlEvtCfm.cfmStatus.status == LCM_PRIM_OK)
1197 DU_LOG("\nDU_APP : Tunnel management confirm OK");
1200 duSendUeCreateReqToRlc();
1202 duSendEgtpTestData();
1207 DU_LOG("\nDU_APP : Tunnel management failed");
1214 S16 duSendEgtpDatInd(Buffer *mBuf)
1218 /* Fill EGTP header */
1219 egtpMsg.msgHdr.msgType = EGTPU_MSG_GPDU;
1220 egtpMsg.msgHdr.nPdu.pres = FALSE;
1221 egtpMsg.msgHdr.seqNum.pres = FALSE;
1222 egtpMsg.msgHdr.extHdr.udpPort.pres = FALSE;
1223 egtpMsg.msgHdr.extHdr.pdcpNmb.pres = FALSE;
1224 egtpMsg.msgHdr.teId = 1;
1227 egtpHdlDatInd(egtpMsg);
1234 /*******************************************************************
1236 * @brief Simulate UL Data for intial test
1240 * Function : duSendEgtpTestData
1243 * Simulate UL data for initial test
1246 * @return ROK - success
1249 * ****************************************************************/
1250 S16 duSendEgtpTestData()
1252 char data[30] = "This is EGTP data from DU";
1257 if(SGetMsg(DU_APP_MEM_REGION, DU_POOL, &mBuf) == ROK)
1259 if(SAddPstMsgMult((Data *)data, datSize, mBuf) != ROK)
1261 DU_LOG("\nDU_APP : SAddPstMsgMult failed");
1268 DU_LOG("\nDU_APP : Failed to allocate memory");
1272 /* filling IPv4 header */
1277 SFndLenMsg(mBuf, &mLen);
1279 cmMemset((U8 *)&ipv4Hdr, 0, sizeof(CmIpv4Hdr));
1280 ipv4Hdr.length = CM_IPV4_HDRLEN + mLen;
1281 ipv4Hdr.hdrVer = 0x45;
1283 ipv4Hdr.srcAddr = CM_INET_NTOH_U32(duCfgParam.egtpParams.localIp.ipV4Addr);
1284 ipv4Hdr.destAddr = CM_INET_NTOH_U32(duCfgParam.egtpParams.destIp.ipV4Addr);
1286 /* Packing IPv4 header into buffer */
1288 Data revPkArray[CM_IPV4_HDRLEN];
1289 Data pkArray[CM_IPV4_HDRLEN];
1291 /* initialize locals */
1293 cmMemset(revPkArray, 0, CM_IPV4_HDRLEN);
1294 cmMemset(pkArray, 0, CM_IPV4_HDRLEN);
1296 /* Pack Header Version */
1297 pkArray[cnt++] = ipv4Hdr.hdrVer;
1300 pkArray[cnt++] = ipv4Hdr.tos;
1302 pkArray[cnt++] = (Data)GetHiByte(ipv4Hdr.length);
1303 pkArray[cnt++] = (Data)GetLoByte(ipv4Hdr.length);
1306 pkArray[cnt++] = (Data) GetHiByte(ipv4Hdr.id);
1307 pkArray[cnt++] = (Data) GetLoByte(ipv4Hdr.id);
1310 pkArray[cnt++] = (Data)GetHiByte(ipv4Hdr.off);
1311 pkArray[cnt++] = (Data)GetLoByte(ipv4Hdr.off);
1314 pkArray[cnt++] = ipv4Hdr.ttl;
1317 pkArray[cnt++] = ipv4Hdr.proto;
1320 pkArray[cnt++] = (Data)GetHiByte(ipv4Hdr.chkSum);
1321 pkArray[cnt++] = (Data)GetLoByte(ipv4Hdr.chkSum);
1323 /* Pack Source Address */
1324 pkArray[cnt++] = (Data)GetHiByte(GetHiWord(ipv4Hdr.srcAddr));
1325 pkArray[cnt++] = (Data)GetLoByte(GetHiWord(ipv4Hdr.srcAddr));
1326 pkArray[cnt++] = (Data)GetHiByte(GetLoWord(ipv4Hdr.srcAddr));
1327 pkArray[cnt++] = (Data)GetLoByte(GetLoWord(ipv4Hdr.srcAddr));
1329 /* Pack Destination Address */
1330 pkArray[cnt++] = (Data)GetHiByte(GetHiWord(ipv4Hdr.destAddr));
1331 pkArray[cnt++] = (Data)GetLoByte(GetHiWord(ipv4Hdr.destAddr));
1332 pkArray[cnt++] = (Data)GetHiByte(GetLoWord(ipv4Hdr.destAddr));
1333 pkArray[cnt++] = (Data)GetLoByte(GetLoWord(ipv4Hdr.destAddr));
1335 for (idx = 0; idx < CM_IPV4_HDRLEN; idx++)
1336 revPkArray[idx] = pkArray[CM_IPV4_HDRLEN - idx -1];
1338 /* this function automatically reverses revPkArray */
1339 ret = SAddPreMsgMult(revPkArray, (MsgLen)cnt, mBuf);
1341 duSendEgtpDatInd(mBuf);
1345 #endif /* EGTP_TEST */
1348 /**************************************************************************
1349 * @brief Function to send configs to SCH
1353 * Function : duSendSchCfg
1356 * Sends general config to Scheduler via MAC layer
1359 * @return ROK - success
1362 ***************************************************************************/
1366 RgSchInstCfg *cfg = NULLP;
1369 DU_SET_ZERO(&pst, sizeof(Pst));
1370 DU_SET_ZERO(&rgMngmt, sizeof(RgMngmt));
1372 cfg = &(rgMngmt.t.cfg.s.schInstCfg);
1374 /* Filling of Instance Id */
1375 cfg->instId = DEFAULT_CELLS + 1;
1376 /* Filling of Gen config */
1377 cfg->genCfg.mem.region = MAC_MEM_REGION;
1378 cfg->genCfg.mem.pool = RG_POOL;
1379 cfg->genCfg.tmrRes = 10;
1382 cfg->genCfg.forceCntrlSrbBoOnPCel = FALSE;
1383 cfg->genCfg.isSCellActDeactAlgoEnable = TRUE;
1385 cfg->genCfg.startCellId = 1;
1386 cfg->genCfg.lmPst.dstProcId = DU_PROC;
1387 cfg->genCfg.lmPst.srcProcId = DU_PROC;
1388 cfg->genCfg.lmPst.dstEnt = ENTDUAPP;
1389 cfg->genCfg.lmPst.dstInst = DU_INST;
1390 cfg->genCfg.lmPst.srcEnt = ENTRG;
1391 cfg->genCfg.lmPst.srcInst = DEFAULT_CELLS + 1;
1392 cfg->genCfg.lmPst.prior = PRIOR0;
1393 cfg->genCfg.lmPst.route = RTESPEC;
1394 cfg->genCfg.lmPst.region = MAC_MEM_REGION;
1395 cfg->genCfg.lmPst.pool = RG_POOL;
1396 cfg->genCfg.lmPst.selector = ODU_SELECTOR_LC;
1399 rgMngmt.hdr.msgType = TCFG;
1400 rgMngmt.hdr.entId.ent = ENTRG;
1401 rgMngmt.hdr.entId.inst = DU_INST;
1402 rgMngmt.hdr.elmId.elmnt = STSCHINST;
1403 rgMngmt.hdr.response.mem.region = MAC_MEM_REGION;
1404 rgMngmt.hdr.response.mem.pool = RG_POOL;
1407 pst.selector = ODU_SELECTOR_LC;
1408 pst.srcEnt = ENTDUAPP;
1410 pst.dstProcId = DU_PROC;
1411 pst.srcProcId = DU_PROC;
1412 pst.srcInst = DU_INST;
1414 pst.region = duCb.init.region;
1415 pst.event = (Event) EVTMACSCHGENCFGREQ;
1417 DU_LOG("\nDU_APP : MAC Sch Cfg sent");
1419 /* Send the request to MAC */
1420 cmPkLrgSchCfgReq(&pst, &rgMngmt);
1426 /**************************************************************************
1427 * @brief Function to configure SCTP params and
1428 * responsible for F1 and E2 interfaces
1432 * Function : duLayerConfigComplete
1435 * Configures SCTP Params and responsible for handling
1436 * F1 and E2 interface.
1439 * @return ROK - success
1442 ***************************************************************************/
1443 S16 duLayerConfigComplete()
1447 DU_LOG("\nDU_APP : Configuring all Layer is complete");
1449 if((ret = duSctpCfgReq(duCfgParam.sctpParams)) != ROK)
1451 DU_LOG("\nDU_APP : Failed configuring Sctp Params");
1454 if((ret = duSctpAssocReq(F1_INTERFACE)) != ROK)
1456 DU_LOG("\nDU_APP : Failed to send AssocReq F1");
1459 if((ret = duSctpAssocReq(E2_INTERFACE)) != ROK)
1461 DU_LOG("\nDU_APP : Failed to send AssocReq E2");
1468 /**************************************************************************
1469 * @brief Function to handle SCH Config Confirm from MAC
1473 * Function : duHdlSchCfgComplete
1476 * Handles Scheduler Gen Config Confirm from MAC
1478 * @param[in] Pst *pst, Post structure of the primitive.
1479 * @param[in] RgMngmt *cfm, Unpacked primitive info received from MAC
1480 * @return ROK - success
1483 ***************************************************************************/
1484 S16 duHdlSchCfgComplete(Pst *pst, RgMngmt *cfm)
1486 if (cfm->cfm.status == LCM_PRIM_OK)
1488 switch (cfm->hdr.elmId.elmnt)
1492 DU_LOG("\nDU_APP : Received SCH CFG CFM at DU APP");
1499 duLayerConfigComplete();
1500 duBuildEgtpCfgReq();
1504 /*******************************************************************
1506 * @brief Sends Slot indication to EGTP
1510 * Function : duSendEgtpSlotInd
1513 * Sends Slot indication to EGTP
1516 * @return ROK - success
1519 * ****************************************************************/
1520 S16 duSendEgtpSlotInd()
1524 duFillEgtpPst(&pst, EVTSLOTIND);
1525 packEgtpSlotInd(&pst);
1531 /**************************************************************************
1532 * @brief Function to fill and send MacCellconfig
1536 * Function : duBuildAndSendMacCellCfg
1539 * Initiates MAC Configs towards MAC
1542 * @return ROK - success
1545 ***************************************************************************/
1546 S16 duBuildAndSendMacCellCfg()
1549 DU_SET_ZERO(&pst, sizeof(Pst));
1550 MacCellCfg *duMacCellCfg = NULLP;
1552 DU_ALLOC(duMacCellCfg, sizeof(MacCellCfg));
1553 if(duMacCellCfg == NULLP)
1558 /* store the address in the duCb so that we can free on confirm msg */
1559 duCb.duMacCellCfg = duMacCellCfg;
1561 /* copy the mac config structure from duCfgParams */
1562 memcpy(duMacCellCfg,&duCfgParam.macCellCfg,sizeof(MacCellCfg));
1564 duMacCellCfg->transId = getTransId(); /* transaction ID */
1567 pst.selector = ODU_SELECTOR_LWLC;
1568 pst.srcEnt = ENTDUAPP;
1572 pst.dstProcId = DU_PROC;
1573 pst.srcProcId = DU_PROC;
1574 pst.region = duCb.init.region;
1575 pst.event = EVENT_MAC_CELL_CONFIG_REQ;
1577 /* Send MAC cell config to MAC */
1578 return (*packMacCellCfgOpts[pst.selector])(&pst, duMacCellCfg);
1581 /**************************************************************************
1582 * @brief Function to Handle MAC cell config confirm
1586 * Function : duHandleMacCellCfgCfm
1589 * Initiates general Configs towards MAC
1592 * @return ROK - success
1595 ***************************************************************************/
1596 int duHandleMacCellCfgCfm(Pst *pst, MacCellCfgCfm *macCellCfgCfm)
1600 if(macCellCfgCfm->rsp == ROK)
1602 if(macCellCfgCfm->transId == duCb.duMacCellCfg->transId)
1604 /* free the memory allocated during sending macCellCfg request */
1605 DU_FREE(duCb.duMacCellCfg->sib1Cfg.sib1Pdu, duCfgParam.srvdCellLst[0].duSysInfo.sib1Len);
1606 DU_FREE(duCb.duMacCellCfg,sizeof(MacCellCfg));
1607 duCb.duMacCellCfg = NULLP;
1609 /* Build and send GNB-DU config update */
1610 ret = BuildAndSendDUConfigUpdate();
1612 /* TODO: Trigger cell start req once cell up slot ind is received*/
1613 /* Build and Send Cell Start Req to MAC */
1614 ret = duBuildAndSendMacCellStartReq();
1619 /* transaction ID missmatch */
1620 DU_LOG("\n transaction ID mismatch in macCellCfg");
1626 DU_LOG("\nMac cell cfg failed");
1632 /*******************************************************************
1634 * @brief Handles slot indication from MAC
1638 * Function : duHandleSlotInd
1641 * Handles slot indication from MAC
1643 * @params[in] Post structure pointer
1645 * @return ROK - success
1648 * ****************************************************************/
1649 uint16_t duHandleSlotInd(Pst *pst, SlotInfo *slotInfo)
1652 DU_LOG("\nDU APP : Slot Indication received");
1654 if(slotInfo->cellId <=0 || slotInfo->cellId > DU_MAX_CELLS)
1656 DU_LOG("\nDU APP : Invalid Cell Id %d", slotInfo->cellId);
1658 if(!duCb.actvCellLst[slotInfo->cellId-1]->firstSlotIndRcvd)
1660 duCb.actvCellLst[slotInfo->cellId-1]->firstSlotIndRcvd = true;
1661 if((duCb.actvCellLst[slotInfo->cellId-1] != NULL) && \
1662 (duCb.actvCellLst[slotInfo->cellId-1]->cellStatus == \
1663 ACTIVATION_IN_PROGRESS))
1665 DU_LOG("\nDU APP : 5G-NR Cell %d is UP", slotInfo->cellId);
1666 duCb.actvCellLst[slotInfo->cellId-1]->cellStatus = ACTIVATED;
1671 /* TODO : Slot Indication to be moved out of EGTP_TEST when
1672 * data path is established */
1674 duSendEgtpSlotInd();
1677 if((pst->selector == ODU_SELECTOR_LWLC) || (pst->selector == ODU_SELECTOR_TC))
1678 DU_FREE_SHRABL_BUF(MAC_MEM_REGION, pst->pool, slotInfo, sizeof(SlotInfo));
1683 /*******************************************************************
1685 * @brief Builds and sends cell start request to MAC
1689 * Function : duBuildAndSendMacCellStartReq
1692 * Builds and sends cell start request to MAC
1695 * @return ROK - success
1698 * ****************************************************************/
1699 uint16_t duBuildAndSendMacCellStartReq()
1702 MacCellStartInfo *cellStartInfo = NULL;
1704 DU_LOG("\nDU APP : Building and Sending cell start request to MAC");
1706 /* Send Cell Start Request to MAC */
1707 DU_ALLOC_SHRABL_BUF(cellStartInfo, sizeof(MacCellStartInfo));
1710 DU_LOG("\nDU APP : Memory alloc failed while building cell start request");
1714 for(uint8_t id = 0; id < DU_MAX_CELLS; id++)
1716 if(duCb.actvCellLst[id])
1718 duCb.actvCellLst[id]->firstSlotIndRcvd = FALSE;
1719 cellStartInfo->cellId = duCb.actvCellLst[id]->cellInfo.nrEcgi.cellId;
1722 pst.selector = ODU_SELECTOR_LWLC;
1723 pst.srcEnt = ENTDUAPP;
1727 pst.dstProcId = DU_PROC;
1728 pst.srcProcId = DU_PROC;
1729 pst.region = DU_APP_MEM_REGION;
1731 pst.event = EVENT_MAC_CELL_START_REQ;
1733 return (*packMacCellStartReqOpts[pst.selector])(&pst, cellStartInfo);
1739 /*******************************************************************
1741 * @brief Builds and sends cell stop request to MAC
1745 * Function : duBuildAndSendMacCellStopReq
1748 * Builds and sends cell stop request to MAC
1751 * @return ROK - success
1754 * ****************************************************************/
1755 uint16_t duBuildAndSendMacCellStopReq()
1758 MacCellStopInfo *cellStopInfo = NULL;
1760 DU_LOG("\nDU APP : Building and Sending cell stop request to MAC");
1762 /* Send Cell Stop Request to MAC */
1763 DU_ALLOC_SHRABL_BUF(cellStopInfo, sizeof(MacCellStopInfo));
1766 DU_LOG("\nDU APP : Memory alloc failed while building cell stop request");
1769 cellStopInfo->cellId = duCb.actvCellLst[0]->cellId;
1772 pst.selector = ODU_SELECTOR_LWLC;
1773 pst.srcEnt = ENTDUAPP;
1777 pst.dstProcId = DU_PROC;
1778 pst.srcProcId = DU_PROC;
1779 pst.region = DU_APP_MEM_REGION;
1781 pst.event = EVENT_MAC_CELL_STOP_REQ;
1783 return (*packMacCellStopReqOpts[pst.selector])(&pst, cellStopInfo);
1786 /*******************************************************************
1788 * @brief Handles stop indication from MAC
1792 * Function : duHandleStopInd
1795 * Handles stop indication from MAC
1797 * @params[in] Post structure pointer
1798 * @return ROK - success
1801 * ****************************************************************/
1802 uint16_t duHandleStopInd(Pst *pst, MacCellStopInfo *cellStopId)
1804 if(cellStopId->cellId <=0 || cellStopId->cellId > DU_MAX_CELLS)
1806 DU_LOG("\nDU APP : Invalid Cell Id %d", cellStopId->cellId);
1808 if(duCb.actvCellLst[cellStopId->cellId-1] != NULL)
1810 if(duCb.actvCellLst[cellStopId->cellId-1]->firstSlotIndRcvd)
1812 duCb.actvCellLst[cellStopId->cellId-1]->firstSlotIndRcvd = false;
1813 if((duCb.actvCellLst[cellStopId->cellId-1]->cellStatus == \
1816 DU_LOG("\nDU APP : 5G-NR Cell %d is DOWN", cellStopId->cellId);
1817 duCb.actvCellLst[cellStopId->cellId-1]->cellStatus = DELETION_IN_PROGRESS;
1821 if((pst->selector == ODU_SELECTOR_LWLC) || (pst->selector == ODU_SELECTOR_TC))
1822 DU_FREE_SHRABL_BUF(MAC_MEM_REGION, pst->pool, cellStopId, sizeof(MacCellStopInfo));
1827 /*******************************************************************
1829 * @brief Handles slot indication from MAC
1833 * Function : duHandleUlCcchInd
1836 * Handles UL CCCH indication from MAC
1838 * @params[in] Post structure pointer
1839 * UL CCCH Ind pointer
1840 * @return ROK - success
1843 * ****************************************************************/
1844 uint16_t duHandleUlCcchInd(Pst *pst, UlCcchIndInfo *ulCcchIndInfo)
1847 DU_LOG("\nDU APP : UL CCCH Indication received");
1849 return (duProcUlCcchInd(ulCcchIndInfo));
1853 /**********************************************************************
1855 **********************************************************************/