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 /********************************************************************20**
21 Name: NR RLC Layer - System Services Interface Functions
25 Desc: C source code for the interface to System Services
28 File: rlc_dl_msg_router.c
30 *********************************************************************21*/
32 /** @filerlc_dl_msg_router.c
33 @brief RLC System Services Interface
37 /* header (.h) include files */
38 #include "common_def.h"
39 #include "lkw.h" /* LKW defines */
40 #include "ckw.h" /* CKW defines */
41 #include "kwu.h" /* KWU defines */
42 #include "rgu.h" /* RGU defines */
43 #include "rlc_err.h" /* Err defines */
44 #include "rlc_env.h" /* RLC environment options */
48 /* extern (.x) include files */
49 #include "lkw.x" /* LKW */
50 #include "ckw.x" /* CKW */
51 #include "kwu.x" /* KWU */
52 #include "rgu.x" /* RGU */
54 #include "rlc_utils.h" /* RLC defines */
55 #include "rlc_dl_ul_inf.h"
57 #include "du_app_rlc_inf.h"
58 #include "rlc_mac_inf.h"
61 S16 rlcUtlDlBatchProcPkts(Void);
62 S16 rlcDlBatchProc(Void);
63 #if (defined(MAC_RLC_HARQ_STA_RBUF) && defined(LTE_L2_MEAS))
64 uint32_t isDatReqProcessed;
65 void rlcUtlDlBatchProcHqStaInd ARGS ((Void));
68 #if (defined(L2_L3_SPLIT) && defined(ICC_RECV_TSK_RBUF))
69 S16 rlcDlBatchProcSplit ARGS((Void));
73 uint32_t rlcAmmStaPduList[512] = {0};
74 S16 ssGetDBufOfSize ARGS((Region region, Size size, Buffer **dBuf));
76 S16 rlcDlInitExt ARGS (( Void ));
82 * <b> Initialize External </b>
85 * Initializes variables used to interface with Upper/Lower Layer
99 /***********************************************************************
100 System Service Interface Functions
101 ***********************************************************************/
106 * <b> Activates Initialization </b>
109 * This function is invoked by system services to initialize the NR RLC
110 * layer. This is an entry point used by LTE_RLC layer to initialize its
111 * global variables, before becoming operational.
113 * Allowable values for parameters are specified in ssi.h.
115 * @param[in] ent - Specify the entity id of the NR RLC task.
116 * @param[in] inst - Specify the entity id of the NR RLC task.
117 * @param[in] region - Specifies the memory region from which
118 * NR RLC should allocate structures and buffers.
119 * @param[in] reason - Specifies the reason for calling this
120 * initialization function.
128 Ent ent, /* entity */
129 Inst inst, /* instance */
130 Region region, /* region */
131 Reason reason /* reason */
136 if (inst >= MAX_RLC_INSTANCES)
138 /* intance greater than MAX instances */
142 if (rlcCb[inst] != NULLP)
147 if (SGetSBuf(region, 0, (Data **)&tRlcCb,
148 (Size)sizeof (RlcCb)) != ROK)
152 /* Initialize rlcCb */
153 RLC_MEM_SET(tRlcCb, 0, sizeof(RlcCb));
155 /* Initialize task configuration parameters */
156 tRlcCb->init.ent = ent; /* entity */
157 tRlcCb->init.inst = inst; /* instance */
158 tRlcCb->init.region = region; /* static region */
159 tRlcCb->init.pool = 0; /* static pool */
160 tRlcCb->init.reason = reason; /* reason */
161 tRlcCb->init.cfgDone = FALSE; /* configuration done */
162 tRlcCb->init.acnt = TRUE; /* enable accounting */
163 tRlcCb->init.usta = TRUE; /* enable unsolicited status */
164 tRlcCb->init.trc = FALSE; /* enable trace */
165 tRlcCb->init.procId = ODU_GET_PROCID();
167 rlcCb[inst] = tRlcCb;
171 for(int i = 0; i < 512; i++)
174 Buffer *bufPtr = NULL;
175 ODU_GET_MSG_BUF(1, 0 , &mBuf);
176 ssGetDBufOfSize(1 , 1800, &bufPtr);
177 SUpdMsg(mBuf, bufPtr, 0);
178 rlcAmmStaPduList[i] = (uint32_t)mBuf;
181 /* call external function for intialization */
191 #ifdef CALL_FLOW_DEBUG_LOG
197 * name : callFlowRlcDlActvTsk
200 * Function used to print values of src, dest, message
201 * received at the layer
203 * @param[in] pst - Pst Structure
207 void callFlowRlcDlActvTsk(Pst *pst)
210 char destTask[50]="ENTMAC";
216 strcpy(sourceTask,"ENTDUAPP");
220 case LKW_EVT_CFG_REQ:
222 strcpy(message,"LKW_EVT_CFG_REQ");
226 case LKW_EVT_CNTRL_REQ:
228 strcpy(message,"LKW_EVT_CNTRL_REQ");
232 case LKW_EVT_STS_REQ:
234 strcpy(message,"LKW_EVT_STS_REQ");
238 case LKW_EVT_STA_REQ:
240 strcpy(message,"LKW_EVT_STA_REQ");
243 /* kw005.201 added support for L2 Measurement */
247 case KWU_EVT_DAT_REQ: /* Data request */
249 strcpy(message,"KWU_EVT_DAT_REQ");
254 case EVENT_DL_RRC_MSG_TRANS_TO_RLC:
256 strcpy(message,"EVENT_DL_RRC_MSG_TRANS_TO_RLC");
259 case EVENT_DL_USER_DATA_TRANS_TO_RLC:
261 strcpy(message,"EVENT_DL_USER_DATA_TRANS_TO_RLC");
265 strcpy(message,"Invalid Event");
274 strcpy(sourceTask,"ENTRLC");
278 case UDX_EVT_BND_REQ: /* Bind request */
280 strcpy(message,"UDX_EVT_BND_REQ");
284 case UDX_EVT_UBND_REQ: /* Bind request */
286 strcpy(message,"UDX_EVT_UBND_REQ");
289 case UDX_EVT_CFG_REQ: /* Unbind request */
291 strcpy(message,"UDX_EVT_CFG_REQ");
295 case UDX_EVT_UEIDCHG_REQ: /* Configuration request */
297 strcpy(message,"UDX_EVT_UEIDCHG_REQ");
301 case UDX_EVT_STA_UPD_REQ: /* Configuration request */
303 strcpy(message,"UDX_EVT_STA_UPD_REQ");
307 case UDX_EVT_STA_PDU_REQ: /* Configuration request */
309 strcpy(message,"UDX_EVT_STA_PDU_REQ");
314 case UDX_EVT_DL_CLEANUP_MEM:
316 strcpy(message,"UDX_EVT_DL_CLEANUP_MEM");
321 strcpy(message,"Invalid Event");
330 strcpy(sourceTask,"ENTMAC");
334 case EVTRGUBNDCFM: /* Bind request */
336 strcpy(message,"EVTRGUBNDCFM");
339 case EVENT_SCHED_RESULT_TO_RLC:
341 strcpy(message,"EVENT_SCHED_RESULT_TO_RLC");
344 /* kw005.201 added support for L2 Measurement */
345 case EVTRGUFLOWCNTRLIND:
347 strcpy(message,"EVTRGUFLOWCNTRLIND");
351 #ifdef RLC_STA_PROC_IN_MAC/* RLC Status PDU Processing */
352 case UDX_EVT_STA_UPD_REQ: /* Configuration request */
354 strcpy(message,"UDX_EVT_STA_UPD_REQ");
359 strcpy(message,"Invalid Event");
367 strcpy(sourceTask,"Invalid Source Entity Id");
370 DU_LOG("\nCall Flow: %s -> %s : %s\n", sourceTask, destTask, message);
379 * <b> Activation Task </b>
382 * Processes events received for NR RLC layer via System Services from
385 * @param[in] pst - Pst Structure
386 * @param[in] mBuf - Message Buffer
392 #if (defined (MAC_FREE_RING_BUF) || defined (RLC_FREE_RING_BUF))
393 pthread_t gRlcTId = 0;
397 Pst *pst, /* pst structure */
398 Buffer *mBuf /* message buffer */
403 #ifdef RLC_FREE_RING_BUF
404 gRlcTId = pthread_self();
407 #ifdef CALL_FLOW_DEBUG_LOG
408 callFlowRlcDlActvTsk(pst);
418 case LKW_EVT_CFG_REQ:
420 ret = unpackRlcConfigReq(RlcMiRlcConfigReq, pst, mBuf);
424 case LKW_EVT_CNTRL_REQ:
426 ret = cmUnpkLkwCntrlReq(RlcMiLkwCntrlReq, pst, mBuf);
430 case LKW_EVT_STS_REQ:
432 ret = cmUnpkLkwStsReq(RlcMiLkwStsReq, pst, mBuf);
436 case LKW_EVT_STA_REQ:
438 ret = cmUnpkLkwStaReq(RlcMiLkwStaReq, pst, mBuf);
441 /* kw005.201 added support for L2 Measurement */
445 case KWU_EVT_DAT_REQ: /* Data request */
447 //ret = cmUnpkKwuDatReq(rlcProcDlData, pst, mBuf);
452 case EVENT_DL_RRC_MSG_TRANS_TO_RLC:
454 ret = unpackDlRrcMsgToRlc(RlcProcDlRrcMsgTransfer, pst, mBuf);
457 case EVENT_DL_USER_DATA_TRANS_TO_RLC:
459 ret = unpackRlcDlUserDataToRlc(RlcProcDlUserDataTransfer, pst, mBuf);
463 ODU_PUT_MSG_BUF(mBuf);
464 if (pst->dstInst < MAX_RLC_INSTANCES)
466 DU_LOG("\nERROR --> RLC_DL : Received Invalid Event[%d] from SM",
482 case UDX_EVT_BND_REQ: /* Bind request */
484 ret = cmUnpkUdxBndReq(rlcDlUdxBndReq, pst, mBuf );
488 case UDX_EVT_UBND_REQ: /* Bind request */
490 ret = cmUnpkUdxUbndReq(rlcDlUdxUbndReq, pst, mBuf );
493 case UDX_EVT_CFG_REQ: /* Unbind request */
495 ret = cmUnpkUdxCfgReq(rlcDlUdxCfgReq, pst, mBuf );
499 case UDX_EVT_UEIDCHG_REQ: /* Configuration request */
501 ret = cmUnpkUdxUeIdChgReq(rlcDlUdxUeIdChgReq, pst, mBuf);
505 case UDX_EVT_STA_UPD_REQ: /* Configuration request */
507 ret = cmUnpkUdxStaUpdReq(rlcDlUdxStaUpdReq, pst, mBuf);
511 case UDX_EVT_STA_PDU_REQ: /* Configuration request */
513 ret = cmUnpkUdxStaPduReq(rlcDlUdxStaPduReq, pst, mBuf);
518 case UDX_EVT_L2MEAS_REQ:
520 ret = cmUnpkUdxL2MeasReq(rlcDlUdxL2MeasReq, pst, mBuf);
523 case UDX_EVT_L2MEAS_SEND_REQ:
526 ret = cmUnpkUdxL2MeasSendReq(rlcDlUdxL2MeasSendReq, pst, mBuf);
530 case UDX_EVT_L2MEAS_STOP_REQ:
532 ret = cmUnpkUdxL2MeasStopReq(rlcDlUdxL2MeasStopReq, pst, mBuf);
538 case UDX_EVT_DL_CLEANUP_MEM:
540 rlcUtlFreeDlMemory(RLC_GET_RLCCB(pst->dstInst));
545 ODU_PUT_MSG_BUF(mBuf);
546 if (pst->dstInst < MAX_RLC_INSTANCES)
548 DU_LOG("\nERROR --> RLC_DL : Received Invalid Event[%d] from RLC UL",
563 case KWU_EVT_BND_REQ: /* Bind request */
565 ret = cmUnpkKwuBndReq(RlcUiKwuBndReq, pst, mBuf );
569 case KWU_EVT_UBND_REQ: /* Unbind request */
571 ret = cmUnpkKwuUbndReq(RlcUiKwuUbndReq, pst, mBuf );
575 case KWU_EVT_CPLANE_DAT_REQ: /* C-Plane Data request */
577 ret = cmUnpkKwuDatReq(rlcProcDlData, pst, mBuf);
581 case KWU_EVT_DAT_REQ: /* Data request */
583 //ret = cmUnpkKwuDatReq(rlcProcDlData, pst, mBuf);
587 case KWU_EVT_DISC_SDU_REQ: /* Discard SDU request */
589 ret = cmUnpkKwuDiscSduReq(RlcUiKwuDiscSduReq, pst, mBuf);
595 ODU_PUT_MSG_BUF(mBuf);
596 if (pst->dstInst < MAX_RLC_INSTANCES)
598 DU_LOG("\nERROR --> RLC_DL : Received Invalid Event[%d] from RRC",
613 case KWU_EVT_BND_REQ: /* Bind request */
615 ret = cmUnpkKwuBndReq(RlcUiKwuBndReq, pst, mBuf );
619 case KWU_EVT_UBND_REQ: /* Unbind request */
621 ret = cmUnpkKwuUbndReq(RlcUiKwuUbndReq, pst, mBuf );
625 case KWU_EVT_CPLANE_DAT_REQ: /* C-Plane Data request */
626 case KWU_EVT_UPLANE_DAT_REQ: /* U-Plane Data request */
628 ret = cmUnpkKwuDatReq(rlcProcDlData, pst, mBuf);
632 case KWU_EVT_DAT_REQ: /* Data request */
634 //ret = cmUnpkKwuDatReq(rlcProcDlData, pst, mBuf);
638 case KWU_EVT_DISC_SDU_REQ: /* Discard SDU request */
640 ret = cmUnpkKwuDiscSduReq(RlcUiKwuDiscSduReq, pst, mBuf);
645 ODU_PUT_MSG_BUF(mBuf);
646 if (pst->dstInst < MAX_RLC_INSTANCES)
648 DU_LOG("\nERROR --> RLC_DL : Received Invalid Event[%d] from PDCP",
663 case EVTRGUBNDCFM: /* Bind request */
665 ret = cmUnpkRguBndCfm(RlcLiRguBndCfm, pst, mBuf );
668 case EVENT_SCHED_RESULT_TO_RLC:
670 ret = unpackSchedResultRpt(RlcProcSchedResultRpt, pst, mBuf);
673 /* kw005.201 added support for L2 Measurement */
675 case EVTRGUHQSTAIND: /* Harq status indication */
677 ret = cmUnpkRguHqStaInd(RlcLiRguHqStaInd, pst, mBuf);
681 case EVTRGUFLOWCNTRLIND:
683 ret = cmUnpkRguFlowCntrlInd(RlcLiRguFlowCntrlInd,pst,mBuf);
687 #ifdef RLC_STA_PROC_IN_MAC/* RLC Status PDU Processing */
688 case UDX_EVT_STA_UPD_REQ: /* Configuration request */
690 ret = cmUnpkUdxStaUpdReq(rlcDlUdxStaUpdReq, pst, mBuf);
696 ODU_PUT_MSG_BUF(mBuf);
697 if (pst->dstInst < MAX_RLC_INSTANCES)
699 DU_LOG("\nERROR --> RLC_DL : Received Invalid Event[%d] from MAC",
712 case EVTCTFBTCHPROCTICK:
714 rlcUtlDlBatchProcPkts();
718 ODU_PUT_MSG_BUF(mBuf);
726 case KWU_EVT_TTI_IND:
728 #if (defined(L2_L3_SPLIT) && defined(ICC_RECV_TSK_RBUF))
729 rlcDlBatchProcSplit();
731 #if defined(PDCP_RLC_DL_RBUF)
736 #if (defined(SPLIT_RLC_DL_TASK) && defined(MAC_RLC_HARQ_STA_RBUF) && defined(LTE_L2_MEAS))
737 //RlcDlHarqStaBatchProc();
738 rlcUtlDlBatchProcHqStaInd();
740 #ifndef KWSELFPSTDLCLEAN
742 /* Moving Cleanup from self post event to TTI event */
746 ODU_PUT_MSG_BUF(mBuf);
756 if (pst->dstInst < MAX_RLC_INSTANCES)
758 /*RlcCb *tRlcCb = RLC_GET_RLCCB(pst->dstInst);*/
759 DU_LOG("\nERROR --> RLC_DL : Received Invalid Source Entity[%d]",
762 ODU_PUT_MSG_BUF(mBuf);
774 /********************************************************************30**
776 **********************************************************************/