Initial commit
[o-du/l2.git] / src / 5gnrrlc / kw_dl_ex_ms.c
diff --git a/src/5gnrrlc/kw_dl_ex_ms.c b/src/5gnrrlc/kw_dl_ex_ms.c
new file mode 100755 (executable)
index 0000000..2cbfe08
--- /dev/null
@@ -0,0 +1,624 @@
+/*******************************************************************************
+################################################################################
+#   Copyright (c) [2017-2019] [Radisys]                                        #
+#                                                                              #
+#   Licensed under the Apache License, Version 2.0 (the "License");            #
+#   you may not use this file except in compliance with the License.           #
+#   You may obtain a copy of the License at                                    #
+#                                                                              #
+#       http://www.apache.org/licenses/LICENSE-2.0                             #
+#                                                                              #
+#   Unless required by applicable law or agreed to in writing, software        #
+#   distributed under the License is distributed on an "AS IS" BASIS,          #
+#   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.   #
+#   See the License for the specific language governing permissions and        #
+#   limitations under the License.                                             #
+################################################################################
+*******************************************************************************/
+
+/********************************************************************20**
+  
+        Name:    LTE-RLC Layer - System Services Interface Functions
+    
+        Type:    C file
+  
+        Desc:    C source code for the interface to System Services
+                  of LTE-RLC
+        File:    kw_dl_ex_ms.c
+  
+*********************************************************************21*/
+static const char* RLOG_MODULE_NAME="RLC_DL";
+static int RLOG_MODULE_ID=2048;
+static int RLOG_FILE_ID=195;
+
+/** @filekw_dl_ex_ms.c 
+@brief RLC System Services Interface
+*/
+
+\f
+/* header (.h) include files */
+#include "envopt.h"        /* environment options */
+#include "envdep.h"        /* environment dependent */
+#include "envind.h"        /* environment independent */
+
+#include "gen.h"           /* general */
+#include "ssi.h"           /* system services */
+#include "cm5.h"           /* common timer defines */
+#include "cm_tkns.h"       /* common tokens defines */
+#include "cm_mblk.h"       /* common memory allocation library defines */
+#include "cm_llist.h"      /* common link list  defines  */
+#include "cm_hash.h"       /* common hash list  defines */
+#include "cm_lte.h"        /* common LTE defines */
+#include "lkw.h"           /* LKW defines */
+#include "ckw.h"           /* CKW defines */
+#include "kwu.h"           /* KWU defines */
+#include "rgu.h"           /* RGU defines */
+#include "kw_err.h"        /* Err defines */
+#include "kw_env.h"        /* RLC environment options */
+#include "kw.h"            /* RLC defines */
+#include "kw_udx.h"
+#include "kw_dl.h"
+
+
+/* extern (.x) include files */
+#include "gen.x"           /* general */
+#include "ssi.x"           /* system services */
+
+#include "cm5.x"           /* common timer library */
+#include "cm_tkns.x"       /* common tokens */
+#include "cm_mblk.x"       /* common memory allocation */
+#include "cm_llist.x"      /* common link list */
+#include "cm_hash.x"       /* common hash list */
+#include "cm_lte.x"        /* common LTE includes */
+#include "cm_lib.x"        /* common memory allocation library */
+#include "lkw.x"           /* LKW */
+#include "ckw.x"           /* CKW */
+#include "kwu.x"           /* KWU */
+#include "rgu.x"           /* RGU */
+#include "kw.x"
+#include "kw_udx.x"
+#include "kw_dl.x"
+
+#include "ctf.h"
+PUBLIC S16 kwUtlDlBatchProcPkts(Void);
+PUBLIC S16 kwDlBatchProc(Void);
+#if (defined(MAC_RLC_HARQ_STA_RBUF) && defined(LTE_L2_MEAS))
+U32 isDatReqProcessed;
+PUBLIC void kwUtlDlBatchProcHqStaInd ARGS ((Void));
+#endif
+
+#if (defined(L2_L3_SPLIT) && defined(ICC_RECV_TSK_RBUF))
+EXTERN S16 kwDlBatchProcSplit  ARGS((Void));
+#endif
+//UDAY
+#ifdef L2_OPTMZ
+U32 kwAmmStaPduList[512] = {0};
+EXTERN S16 ssGetDBufOfSize ARGS((Region region, Size size, Buffer **dBuf));
+#endif
+PUBLIC S16 kwDlInitExt ARGS (( Void ));
+\f
+/**
+ *
+ * @brief
+ *
+ *  <b> Initialize External </b>
+ *
+ *  @b Description:
+ *  Initializes variables used to interface with Upper/Lower Layer  
+ *
+ *  @return  S16
+ *      -# ROK 
+ *
+*/
+  
+#ifdef ANSI
+PUBLIC S16 kwDlInitExt 
+(
+)
+#else
+PUBLIC S16 kwDlInitExt()
+#endif
+{
+   TRC2(kwDlInitExt);
+
+   RETVALUE(ROK);
+} /* kwInitExt */
+
+
+\f
+/***********************************************************************
+                      System Service Interface Functions
+ ***********************************************************************/
+/**
+ *
+ * @brief
+ *
+ *    <b> Activates Initialization </b>
+ *
+ *    @b Description:
+ *    This function is invoked by system services to initialize the LTE-RLC
+ *    layer. This is an entry point used by LTE_RLC layer to initialize its
+ *    global variables, before becoming operational.
+ *
+ *    Allowable values for parameters are specified in ssi.h.
+ *
+ *    @param[in] ent    - Specify the entity id of the LTE-RLC task.
+ *    @param[in] inst   - Specify the entity id of the LTE-RLC task.
+ *    @param[in] region - Specifies the memory region from which
+ *                         LTE-RLC should allocate structures and buffers.
+ *    @param[in] reason - Specifies the reason for calling this
+ *                         initialization function.
+ *
+ *  @return  S16
+ *      -# ROK 
+ *
+ */
+#ifdef ANSI
+PUBLIC S16 kwDlActvInit
+(
+Ent    ent,                 /* entity */
+Inst   inst,                /* instance */
+Region region,              /* region */
+Reason reason               /* reason */
+)
+#else
+PUBLIC S16 kwDlActvInit(ent, inst, region, reason)
+Ent    ent;                 /* entity */
+Inst   inst;                /* instance */
+Region region;              /* region */
+Reason reason;              /* reason */
+#endif
+{
+   KwCb    *tKwCb;
+   TRC3(kwDlActvInit)
+
+   if (inst >= KW_MAX_RLC_INSTANCES)
+   {
+       /* intance greater than MAX instances */ 
+       RETVALUE(RFAILED); 
+   }
+
+   if (kwCb[inst] != NULLP)
+   {
+       RETVALUE (RFAILED);
+   }
+  
+   if (SGetSBuf(region, 0, (Data **)&tKwCb,
+                (Size)sizeof (KwCb)) != ROK)    
+   {                     
+      RETVALUE(RFAILED);
+   }
+   /* Initialize kwCb */
+   KW_MEM_SET(tKwCb, 0, sizeof(KwCb));
+
+   /* Initialize task configuration parameters */
+   tKwCb->init.ent     = ent;           /* entity */
+   tKwCb->init.inst    = inst;          /* instance */
+   tKwCb->init.region  = region;        /* static region */
+   tKwCb->init.pool    = 0;             /* static pool */
+   tKwCb->init.reason  = reason;        /* reason */
+   tKwCb->init.cfgDone = FALSE;         /* configuration done */
+   tKwCb->init.acnt    = TRUE;          /* enable accounting */
+   tKwCb->init.usta    = TRUE;          /* enable unsolicited status */
+   tKwCb->init.trc     = FALSE;         /* enable trace */
+   tKwCb->init.procId  = SFndProcId();
+
+   kwCb[inst] = tKwCb;
+
+//UDAY
+#ifdef L2_OPTMZ
+   for(int i = 0; i < 512; i++)
+   {
+      Buffer *mBuf = NULL;
+      Buffer *bufPtr = NULL;
+      SGetMsg(1, 0 , &mBuf);
+      ssGetDBufOfSize(1 , 1800, &bufPtr);
+      SUpdMsg(mBuf, bufPtr, 0);
+      kwAmmStaPduList[i] = (U32)mBuf; 
+   }
+#endif
+   /* call external function for intialization */
+   /*
+   kwInitExt();
+   */
+
+   
+
+   RETVALUE(ROK);
+} /* kwActvInit */
+
+\f
+/**
+ *
+ * @brief
+ *
+ *  <b> Activation Task </b>
+ *
+ *  @b Description:
+ *  Processes events received for MLTE-RLC layer via System Services from
+ *  other layers.
+ *
+ *  @param[in] pst   - Pst Structure
+ *  @param[in] mBuf  - Message Buffer
+ *
+ *  @return  S16
+ *      -# ROK 
+ *
+ */
+#if (defined (MAC_FREE_RING_BUF) || defined (RLC_FREE_RING_BUF))
+pthread_t gRlcTId = 0;
+#endif
+#ifdef ANSI
+PUBLIC S16 kwDlActvTsk
+(
+Pst *pst,              /* pst structure */
+Buffer *mBuf            /* message buffer */
+)
+#else
+PUBLIC S16 kwDlActvTsk(pst, mBuf)
+Pst *pst;              /* pst structure */
+Buffer *mBuf;           /* message buffer */
+#endif
+{
+   S16 ret = ROK;
+
+   TRC3(kwDlActvTsk);
+#ifdef RLC_FREE_RING_BUF
+   gRlcTId = pthread_self();
+#endif
+
+   switch(pst->srcEnt)
+   {
+      case ENTSM:
+         {
+            switch(pst->event)
+            {
+#ifdef LCLKW
+               case LKW_EVT_CFG_REQ:
+                  {
+                     ret = cmUnpkLkwCfgReq(KwMiLkwCfgReq, pst, mBuf);
+                     break;
+                  }
+
+               case LKW_EVT_CNTRL_REQ:
+                  {
+                     ret = cmUnpkLkwCntrlReq(KwMiLkwCntrlReq, pst, mBuf);
+                     break;
+                  }
+
+               case LKW_EVT_STS_REQ:
+                  {
+                     ret = cmUnpkLkwStsReq(KwMiLkwStsReq, pst, mBuf);
+                     break;
+                  }
+
+               case LKW_EVT_STA_REQ:
+                  {
+                     ret = cmUnpkLkwStaReq(KwMiLkwStaReq, pst, mBuf);
+                     break;
+                  }
+                  /* kw005.201 added support for L2 Measurement */
+#endif  /* LCLKW */
+               default:
+                  SPutMsg(mBuf);
+                  if (pst->dstInst < KW_MAX_RLC_INSTANCES)
+                  {
+                      RLOG1(L_ERROR,"Received Invalid Event[%d] from SM",
+                            pst->event);
+                  }
+                  ret = RFAILED;
+                  break;
+
+            }
+            break;
+         }
+
+      case ENTKW:
+         {
+
+            switch(pst->event)
+            {
+#ifdef LCUDX
+               case UDX_EVT_BND_REQ:              /* Bind request */
+                  {
+                     ret = cmUnpkUdxBndReq(KwDlUdxBndReq, pst, mBuf );
+                     break;
+                  }
+
+               case UDX_EVT_UBND_REQ:              /* Bind request */
+                  {
+                     ret = cmUnpkUdxUbndReq(KwDlUdxUbndReq, pst, mBuf );
+                     break;
+                  }
+               case UDX_EVT_CFG_REQ:             /* Unbind request */
+                  {
+                     ret = cmUnpkUdxCfgReq(KwDlUdxCfgReq, pst, mBuf );
+                     break;
+                  }
+
+               case UDX_EVT_UEIDCHG_REQ:              /* Configuration request */
+                  {
+                     ret = cmUnpkUdxUeIdChgReq(KwDlUdxUeIdChgReq, pst, mBuf);
+                     break;
+                  }
+
+               case UDX_EVT_STA_UPD_REQ:              /* Configuration request */
+                  {
+                     ret = cmUnpkUdxStaUpdReq(KwDlUdxStaUpdReq, pst, mBuf);
+                     break;
+                  }
+
+               case UDX_EVT_STA_PDU_REQ:              /* Configuration request */
+                  {
+                     ret = cmUnpkUdxStaPduReq(KwDlUdxStaPduReq, pst, mBuf);
+                     break;
+                  }
+
+#ifdef LTE_L2_MEAS
+               case UDX_EVT_L2MEAS_REQ:
+                  {
+                     ret = cmUnpkUdxL2MeasReq(KwDlUdxL2MeasReq, pst, mBuf);
+                     break;
+                  }
+               case UDX_EVT_L2MEAS_SEND_REQ:
+                 {
+
+                    ret = cmUnpkUdxL2MeasSendReq(KwDlUdxL2MeasSendReq, pst, mBuf); 
+  
+                     break;
+                 }
+               case UDX_EVT_L2MEAS_STOP_REQ:
+                 {
+                     ret = cmUnpkUdxL2MeasStopReq(KwDlUdxL2MeasStopReq, pst, mBuf);
+                     break;
+                 }
+#endif
+
+#endif  /* LCCKW */
+               case UDX_EVT_DL_CLEANUP_MEM:
+                  {
+                     kwUtlFreeDlMemory(KW_GET_KWCB(pst->dstInst));
+                     break;
+                  }
+               
+               default:
+                  SPutMsg(mBuf);
+                  if (pst->dstInst < KW_MAX_RLC_INSTANCES)
+                  {
+                      RLOG1(L_ERROR,"Received Invalid Event[%d] from RLC UL",
+                            pst->event);
+                  }
+                  ret = RFAILED;
+                  break;
+
+            }
+            break;
+         }
+
+      case ENTNH:
+         {
+            switch(pst->event)
+            {
+#ifdef LCKWU
+               case KWU_EVT_BND_REQ:              /* Bind request */
+                  {
+                     ret = cmUnpkKwuBndReq(KwUiKwuBndReq, pst, mBuf );
+                     break;
+                  }
+
+               case KWU_EVT_UBND_REQ:             /* Unbind request */
+                  {
+                     ret = cmUnpkKwuUbndReq(KwUiKwuUbndReq, pst, mBuf );
+                     break;
+                  }
+#ifdef L2_L3_SPLIT
+               case KWU_EVT_CPLANE_DAT_REQ:       /* C-Plane Data request */
+                  {
+                     ret = cmUnpkKwuDatReq(KwUiKwuDatReq, pst, mBuf);
+                     break;
+                  }
+#else
+               case KWU_EVT_DAT_REQ:              /* Data request */
+                  {
+                     ret = cmUnpkKwuDatReq(KwUiKwuDatReq, pst, mBuf);
+                     break;
+                  }
+#endif
+               case KWU_EVT_DISC_SDU_REQ:         /* Discard SDU request */
+                  {
+                     ret = cmUnpkKwuDiscSduReq(KwUiKwuDiscSduReq, pst, mBuf);
+                     break;
+                  }
+
+#endif  /* LCKWU */
+               default:
+                  SPutMsg(mBuf);
+                  if (pst->dstInst < KW_MAX_RLC_INSTANCES)
+                  {
+                      RLOG1(L_ERROR,"Received Invalid Event[%d] from RRC",
+                            pst->event);
+                  }
+                  ret = RFAILED;
+                  break;
+
+            }
+            break;
+         }
+
+      case ENTPJ:
+         {
+            switch(pst->event)
+            {
+#ifdef LCKWU
+               case KWU_EVT_BND_REQ:              /* Bind request */
+                  {
+                     ret = cmUnpkKwuBndReq(KwUiKwuBndReq, pst, mBuf );
+                     break;
+                  }
+
+               case KWU_EVT_UBND_REQ:             /* Unbind request */
+                  {
+                     ret = cmUnpkKwuUbndReq(KwUiKwuUbndReq, pst, mBuf );
+                     break;
+                  }
+#ifdef L2_L3_SPLIT
+               case KWU_EVT_CPLANE_DAT_REQ:       /* C-Plane Data request */
+               case KWU_EVT_UPLANE_DAT_REQ:       /* U-Plane Data request */
+                  {
+                     ret = cmUnpkKwuDatReq(KwUiKwuDatReq, pst, mBuf);
+                     break;
+                  }
+#else
+               case KWU_EVT_DAT_REQ:              /* Data request */
+                  {
+                     ret = cmUnpkKwuDatReq(KwUiKwuDatReq, pst, mBuf);
+                     break;
+                  }
+#endif
+               case KWU_EVT_DISC_SDU_REQ:         /* Discard SDU request */
+                  {
+                     ret = cmUnpkKwuDiscSduReq(KwUiKwuDiscSduReq, pst, mBuf);
+                     break;
+                  }
+
+               default:
+                  SPutMsg(mBuf);
+                  if (pst->dstInst < KW_MAX_RLC_INSTANCES)
+                  {
+                      RLOG1(L_ERROR,"Received Invalid Event[%d] from PDCP",
+                            pst->event);
+                  }
+                  ret = RFAILED;
+                  break;
+#endif  /* LCKWU */
+            }
+            break;
+         }
+
+      case ENTRG:
+         {
+            switch(pst->event)
+            {
+#ifdef LCRGU
+               case EVTRGUBNDCFM:     /* Bind request */
+                  {
+                     ret = cmUnpkRguBndCfm(KwLiRguBndCfm, pst, mBuf );
+                     break;
+                  }
+
+               case EVTRGUCSTAIND:    /* Coomon Channel Status Response */
+                  {
+                     ret = cmUnpkRguCStaInd(KwLiRguCStaInd, pst, mBuf);
+                     break;
+                  }
+
+               case EVTRGUDSTAIND:    /* Dedicated Channel Status Response */
+                  {
+                     ret = cmUnpkRguDStaInd(KwLiRguDStaInd, pst, mBuf);
+                     break;
+                  }
+                  /* kw005.201 added support for L2 Measurement */
+#ifdef LTE_L2_MEAS
+               case EVTRGUHQSTAIND:    /* Harq status indication */
+                  {
+                     ret = cmUnpkRguHqStaInd(KwLiRguHqStaInd, pst, mBuf);
+                     break;
+                  }
+#endif
+               case EVTRGUFLOWCNTRLIND:
+                  {
+                     ret = cmUnpkRguFlowCntrlInd(KwLiRguFlowCntrlInd,pst,mBuf);
+                     break;
+                  }   
+#endif  /* LCRGU */
+#ifdef RLC_STA_PROC_IN_MAC/* RLC Status PDU Processing */
+               case UDX_EVT_STA_UPD_REQ:              /* Configuration request */
+                  {
+                     ret = cmUnpkUdxStaUpdReq(KwDlUdxStaUpdReq, pst, mBuf);
+                     break;
+                  }
+#endif
+
+               default:
+                  SPutMsg(mBuf);
+                  if (pst->dstInst < KW_MAX_RLC_INSTANCES)
+                  {
+                      RLOG1(L_ERROR,"Received Invalid Event[%d] from MAC",
+                            pst->event);
+                  }
+                  ret = RFAILED;
+                  break;
+            }
+            break;
+         }
+#ifdef SS_RBUF 
+      case ENTTF:
+      {
+            switch(pst->event)
+            {
+               case EVTCTFBTCHPROCTICK:
+               {
+                  kwUtlDlBatchProcPkts();
+                  break;
+               }
+             }
+         SPutMsg(mBuf);
+         break;
+      }
+#endif
+      case ENTYS:
+         {
+            switch(pst->event)
+            {
+               case KWU_EVT_TTI_IND:
+                  {
+#if (defined(L2_L3_SPLIT) && defined(ICC_RECV_TSK_RBUF))
+                     kwDlBatchProcSplit();
+#else 
+#if defined(PDCP_RLC_DL_RBUF)
+                     kwDlBatchProc();
+#endif
+#endif
+
+#if (defined(SPLIT_RLC_DL_TASK) && defined(MAC_RLC_HARQ_STA_RBUF) && defined(LTE_L2_MEAS))
+                     //KwDlHarqStaBatchProc();
+                     kwUtlDlBatchProcHqStaInd();
+#endif 
+#ifndef KWSELFPSTDLCLEAN
+                     /* Revanth_chg */
+                     /* Moving Cleanup from self post event to TTI event */
+                     kwUtlFreeDlMem();
+#endif 
+
+                     SPutMsg(mBuf);
+                     break;
+                  }
+            }
+            break;
+         }
+
+
+      default:
+         {
+            if (pst->dstInst < KW_MAX_RLC_INSTANCES)
+            {
+               /*KwCb *tKwCb = KW_GET_KWCB(pst->dstInst);*/
+               RLOG1(L_ERROR, "Received Invalid Source Entity[%d]",
+                     pst->event);
+            }
+            SPutMsg(mBuf);
+            ret = RFAILED;
+            break;
+         }
+    }
+   SExitTsk();
+
+   RETVALUE(ret);
+} /* kwActvTsk */
+
+
+\f  
+/********************************************************************30**
+         End of file
+**********************************************************************/