Initial commit
[o-du/l2.git] / src / 5gnrrlc / kw_ptui.c
diff --git a/src/5gnrrlc/kw_ptui.c b/src/5gnrrlc/kw_ptui.c
new file mode 100755 (executable)
index 0000000..99e00b0
--- /dev/null
@@ -0,0 +1,1729 @@
+/*******************************************************************************
+################################################################################
+#   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 - Upper Interface
+    
+        Type:    C file
+  
+        Desc:    C source code for the upper interface of LTE-RLC
+        File:    kw_ptui.c
+  
+*********************************************************************21*/
+static const char* RLOG_MODULE_NAME="UIM";
+static int RLOG_MODULE_ID=2048;
+static int RLOG_FILE_ID=199;
+
+/** @file kw_ptui.c
+@brief RLC Upper 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"
+#include "kw_env.h"        /* RLC environment options */
+#include "kw.h"            /* RLC defines */
+
+/* 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 */
+#if defined(MAC_RLC_UL_RBUF) || (defined(L2_L3_SPLIT) && defined(ICC_RECV_TSK_RBUF)) || defined(SS_RBUF)
+#include "ss_rbuf.h"
+#include "ss_rbuf.x"
+#endif
+#include "kw.x"
+#if defined(L2_L3_SPLIT) && defined(ICC_RECV_TSK_RBUF)
+#include "mt_plat_t33.h"
+#include "mt_plat_t33.x"
+#endif
+
+#ifndef LCKWUIKWU
+#define PTKWKWU
+#endif
+
+#ifndef LCKWUICKW
+#define PTKWCKW
+#endif
+
+#ifndef NH
+#define PTKWKWU
+#define PTKWCKW
+#endif
+
+#ifndef PJ 
+#define PTKWKWU
+#define PTKWCKW
+#endif
+
+
+#ifdef __cplusplus
+EXTERN "C" {
+#endif /* __cplusplus */
+
+\f  
+/*********************************************************************
+ *             Forward Declartion for KWU Porting Functions
+ ********************************************************************/
+#if defined(PDCP_RLC_DL_RBUF) || defined(SS_RBUF)
+PUBLIC S16 kwDlBatchProc ARGS ((Void));
+PUBLIC S16 kwUtlDlFreeRlcRBuf ARGS((Void));
+EXTERN void kwUtlDlBatchProcHqStaInd ARGS ((Void));
+EXTERN Void kwUtlFreeDlMem ARGS((Void));
+EXTERN SsRngBufCnt rngCb;
+EXTERN S16 kwUtlDlBatchProcPkts ARGS((Void));
+#endif
+
+#if (defined(L2_L3_SPLIT) && defined(ICC_RECV_TSK_RBUF))
+PUBLIC S16 kwDlBatchProcSplit  ARGS((Void));
+#endif
+
+#ifdef PTKWKWU
+PRIVATE S16 PtUiKwuBndCfm  ARGS ((
+Pst *pst,                       /* post structure */
+SuId suId,                      /* Service User Id */
+U8 status                       /* status */
+));
+
+#endif /* PTKWKWU */
+
+PUBLIC S16 PtUiKwuDatCfm ARGS ((
+Pst               *pst,
+SuId              suId,
+KwuDatCfmInfo         *datCfm
+));
+
+PUBLIC S16 PtUiKwuStaInd ARGS ((
+Pst               *pst,
+SuId              suId,
+KwuStaIndInfo     *staInd
+));
+
+PUBLIC S16 PtUiKwuReEstCmpInd ARGS ((
+Pst               *pst,
+SuId              suId,
+CmLteRlcId        rlcId
+));
+/* kw005.201 added support for L2 Measurement */
+PUBLIC S16 PtUiKwuDiscSduCfm ARGS((
+Pst               *pst,
+SuId              suId,
+KwuDiscSduInfo    *discCfm
+));
+PUBLIC S16 PtUiKwuFlowCntrlInd ARGS((
+Pst                    *pst,
+SuId                   suId,
+KwuFlowCntrlIndInfo    *flowCntrlIndInfo
+));
+#ifdef LTE_L2_MEAS
+PUBLIC S16 PtUiKwuDatAckInd ARGS((
+Pst               *pst,
+SuId              suId,
+KwuDatAckInfo     *datAckInd
+));
+#endif
+#if (defined(PTKWKWU) || defined(KW_PDCP))
+PUBLIC S16 PtUiKwuDatInd ARGS ((
+Pst               *pst,
+SuId              suId,
+KwuDatIndInfo     *datInd,
+Buffer            *mBuf
+));
+#endif /* PTKWKWU || KW_PDCP */
+
+
+\f  
+/*********************************************************************
+ *             Forward Declartion for CKW Porting Functions
+ ********************************************************************/
+#ifdef PTKWCKW
+PRIVATE S16 PtUiCkwBndCfm  ARGS ((
+Pst *pst,                       /* post structure */
+SuId suId,                      /* Service User Id */
+U8 status                       /* status */
+));
+
+PUBLIC S16 PtUiCkwCfgCfm ARGS ((
+Pst            *pst,                      /* post structure */
+SuId           suId,                      /* Service User Id */
+CkwCfgCfmInfo  *cfmInfo                    /* Configuration Confirm */
+));
+
+PUBLIC S16 PtUiCkwUeIdChgCfm ARGS((
+Pst            *pst,                      /* post structure */
+SuId           suId,                      /* Service User Id */
+U32            transId,
+CkwUeInfo      *ueInfo,
+CmStatus       status
+));
+
+#endif /* PTKWCKW */
+
+
+\f  
+/*********************************************************************
+ *             Primitives for KWU interface 
+ ********************************************************************/
+
+/* KWU Bind Confirm primitive */
+
+PUBLIC KwuBndCfm kwUiKwuBndCfmMt[] =
+{
+#ifdef LCKWUIKWU
+   cmPkKwuBndCfm,            /* 0 - loosely coupled */
+#else
+   PtUiKwuBndCfm,            /* 0 - loosely coupled, portable  */
+#endif /* LCKWUIKWU */
+#ifdef NH
+   NhLiKwuBndCfm,            /* 1 - tightly coupled, RRC  */
+#else
+   PtUiKwuBndCfm,            /* 1 - tightly coupled, portable */
+#endif /* NH */
+#ifndef KW_PDCP
+#ifdef PJ
+   PjLiKwuBndCfm,            /* 2 - tightly coupled, PDCP */
+#else
+   PtUiKwuBndCfm,      /* 2 - tightly coupled, portable */ 
+#endif /* NH */
+#endif /* KW_PDCP */
+#ifndef TENB_ACC
+#ifdef LWLCKWUIKWU
+   cmPkKwuBndCfm,      /* 3 - light weight loosely coupled */ 
+#else
+   PtUiKwuBndCfm,      /* 3 - light weight loosely coupled, portable */
+#endif /* LCKWUIKWU */
+#endif /*TENB_ACC*/
+};
+
+/* KWU Data Indication primitive */
+
+PUBLIC KwuDatInd kwUiKwuDatIndMt[] =
+{
+#ifdef LCKWUIKWU
+   cmPkKwuDatInd,            /* 0 - loosely coupled */
+#else
+   PtUiKwuDatInd,            /* 0 - loosely coupled, portable  */
+#endif /* LCKWUIKWU */
+#ifdef NH
+   NhLiKwuDatInd,            /* 1 - tightly coupled, RRC  */
+#else
+   PtUiKwuDatInd,            /* 1 - tightly coupled, portable */
+#endif /* NH */
+#ifdef KW_PDCP
+#else
+#ifdef PJ
+   PjLiKwuDatInd,            /* 2 - tightly coupled, PDCP */
+#else
+   PtUiKwuDatInd,         /* 2 - tightly coupled, portable */ 
+#endif /* NH */
+#ifndef TENB_ACC
+#ifdef LWLCKWUIKWU
+   cmPkKwuDatInd,         /* 3 - light weight loosely coupled */ 
+#else
+   PtUiKwuDatInd,         /* 3 - light weight loosely coupled, portable */
+#endif /* LCKWUIKWU */
+#endif /*TENB_ACC*/
+#endif /* KW_PDCP */
+};
+
+#ifndef KW_PDCP
+PUBLIC KwuDatCfm kwUiKwuDatCfmMt[] =
+{
+#ifdef LCKWUIKWU
+   cmPkKwuDatCfm,            /* 0 - loosely coupled */
+#else
+   PtUiKwuDatCfm,            /* 0 - loosely coupled, portable  */
+#endif /* LCKWUIKWU */
+   PtUiKwuDatCfm,            /* 1 - tightly coupled, portable */
+#ifdef PJ
+   PjLiKwuDatCfm,            /* 2 - tightly coupled, PDCP */
+#else
+   PtUiKwuDatCfm,            /* 2 - tightly coupled, portable */
+#endif /* PJ */
+#ifndef TENB_ACC
+#ifdef LWLCKWUIKWU
+   cmPkKwuDatCfm,         /* 3 - light weight loosely coupled */ 
+#else
+   PtUiKwuDatCfm,         /* 3 - light weight loosely coupled, portable */
+#endif /* LCKWUIKWU */
+#endif /*TENB_ACC*/
+};
+
+/* KWU AM Status Indication primitive */
+
+PUBLIC KwuStaInd kwUiKwuStaIndMt[] =
+{
+#ifdef LCKWUIKWU
+   cmPkKwuStaInd,            /* 0 - loosely coupled */
+#else
+   PtUiKwuStaInd,            /* 0 - loosely coupled, portable  */
+#endif /* LCKWUIKWU */
+   PtUiKwuStaInd,            /* 2 - tightly coupled, portable */
+#ifdef PJ
+   PjLiKwuStaInd,            /* 2 - tightly coupled, PDCP */
+#else
+   PtUiKwuStaInd,            /* 2 - tightly coupled, portable */
+#endif /* PJ */
+#ifndef TENB_ACC
+#ifdef LWLCKWUIKWU
+   cmPkKwuStaInd,         /* 3 - light weight loosely coupled */ 
+#else
+   PtUiKwuStaInd,         /* 3 - light weight loosely coupled, portable */
+#endif /* LCKWUIKWU */
+#endif /*TENB_ACC*/
+};
+
+PUBLIC KwuReEstCmpInd kwUiKwuReEstCmpIndMt[] =
+{
+#ifdef LCKWUIKWU
+   cmPkKwuReEstCmpInd,            /* 0 - loosely coupled */
+#else
+   PtUiKwuReEstCmpInd,            /* 0 - loosely coupled, portable  */
+#endif /* LCKWUIKWU */
+   PtUiKwuReEstCmpInd,            /* 1 - loosely coupled, portable  */
+#ifdef PJ
+   PjLiKwuReEstCmpInd,            /* 2 - tightly coupled, PDCP */
+#else
+   PtUiKwuReEstCmpInd,            /* 2 - tightly coupled, portable */
+#endif /* PJ */
+#ifndef TENB_ACC
+#ifdef LWLCKWUIKWU
+   cmPkKwuReEstCmpInd,    /* 3 - light weight loosely coupled */ 
+#else
+   PtUiKwuReEstCmpInd,    /* 3 - light weight loosely coupled, portable */
+#endif /* LCKWUIKWU */
+#endif /*TENB_ACC*/
+};
+
+/* kw005.201 added support for L2 measurement */
+PUBLIC KwuDiscSduCfm kwUiKwuDiscSduCfmMt[] =
+{
+#ifdef LCKWUIKWU
+   cmPkKwuDiscSduCfm,            /* 0 - loosely coupled */
+#else
+   PtUiKwuDiscSduCfm,            /* 0 - loosely coupled, portable  */
+#endif /* LCKWUIKWU */
+   PtUiKwuDiscSduCfm,            /* 1 - loosely coupled portable */
+#ifdef PJ
+   PjLiKwuDiscSduCfm,            /* 2 - tightly coupled, PDCP */
+#else
+   PtUiKwuDiscSduCfm,    /* 2 - tightly coupled, PDCP */     
+#endif
+#ifndef TENB_ACC
+#ifdef LWLCKWUIKWU
+   cmPkKwuDiscSduCfm,    /* 3 - light weight loosely coupled */    
+#else
+   PtUiKwuDiscSduCfm,    /* 3 - light weight loosely coupled, portable */  
+#endif /* PJ */
+#endif /*TENB_ACC*/
+};
+PUBLIC KwuFlowCntrlInd kwUiKwuFlowCntrlIndMt[] =
+{
+#ifdef LCKWUIKWU
+   cmPkKwuFlowCntrlInd,            /* 0 - loosely coupled */
+#else
+   PtUiKwuFlowCntrlInd,            /* 0 - loosely coupled, portable  */
+#endif /* LCKWUIKWU */
+   PtUiKwuFlowCntrlInd,            /* 1 - loosely coupled portable */
+#ifdef PJ
+   PjLiKwuFlowCntrlInd,            /* 2 - tightly coupled, PDCP */
+#else
+   PtUiKwuFlowCntrlInd,            /* 2 - tightly coupled, portable */
+#endif /* PJ */
+#ifdef LCKWUIKWU
+   cmPkKwuFlowCntrlInd,            /* 3 - light weight loosely coupled */
+#else
+   PtUiKwuFlowCntrlInd,            /* 3 - light weight loosely coupled, portable  */
+#endif /* LCKWUIKWU */
+};
+#ifdef LTE_L2_MEAS
+PUBLIC KwuDatAckInd kwUiKwuDatAckIndMt[] =
+{
+#ifdef LCKWUIKWU
+   cmPkKwuDatAckInd,            /* 0 - loosely coupled */
+#else
+   PtUiKwuDatAckInd,            /* 0 - loosely coupled, portable  */
+#endif /* LCKWUIKWU */
+   PtUiKwuDatAckInd,            /* 1 - loosely coupled, portable  */
+#ifdef PJ
+   PjLiKwuDatAckInd,            /* 2 - tightly coupled, PDCP */
+#else
+   PtUiKwuDatAckInd,     /* 1 - tightly coupled, portable */  
+#endif /* PJ */
+#ifndef TENB_ACC
+#ifdef LWLCKWUIKWU
+   cmPkKwuDatAckInd,     /* 3 - light weight loosely coupled, portable */          
+#else
+   PtUiKwuDatAckInd,     /* 3 - light weight loosely coupled */        
+#endif /* PJ */
+#endif /*TENB_ACC*/
+};
+#endif /* LTE_L2_MEAS */
+/* KWU AM Data confirm primitive */
+
+#endif /* KW_PDCP */
+
+\f  
+/****************************************************************************
+ *                         KWU Interface Mt functions
+ ***************************************************************************/\f
+/**
+ *
+ * @brief 
+ *
+ *        Handler for confirming  the bind request received from KWU
+ *        interface.
+ *
+ * @b Description:
+ *
+ *        This function send the bind confirm primitive to the RLC user,
+ *        when it receives a bind request from its service user.
+ *
+ *  @param[in] pst     Post structure  
+ *  @param[in] suId    Service user SAP ID 
+ *  @param[in] status  Status of Confirmation 
+ *
+ *  @return  S16
+ *      -# ROK 
+ *
+ */
+#ifdef ANSI
+PUBLIC S16 KwUiKwuBndCfm
+(
+Pst *pst,                       /* post structure */
+SuId suId,                      /* Service User Id */
+U8   status                     /* Status */
+)
+#else
+PUBLIC S16 KwUiKwuBndCfm(pst, suId, status)
+Pst *pst;                       /* post structure */
+SuId suId;                      /* Service User Id */
+U8   status;                    /* Status */
+#endif
+{
+   TRC3(KwUiKwuBndCfm)
+
+   /* jump to specific primitive depending on configured selector */
+   (*kwUiKwuBndCfmMt[pst->selector])(pst, suId, status);
+
+   RETVALUE(ROK);
+
+} /* end of KwUiKwuBndCfm */
+
+\f
+/**
+ *
+ * @brief 
+ *
+ *        Handler for sending the data(SDU) from upper layer. 
+ *
+ * @b Description:
+ *
+ *        This function is used to transfer a SDU received from the peer
+ *        RLC entity to the service user(RRC/PDCP).
+ *
+ *  @param[in] pst         Post structure  
+ *  @param[in] suId        Service User SAP ID 
+ *  @param[in] datIndInfo  Data Request Information
+ *  @param[in] mBuf         Data Buffer (SDU) 
+ *
+ *  @return  S16
+ *      -# ROK 
+ *      -# RFAILED
+ */
+#ifdef ANSI
+PUBLIC S16 KwUiKwuDatInd
+(
+Pst               *pst,
+SuId              suId,
+KwuDatIndInfo     *datInd,
+Buffer            *mBuf
+)
+#else
+PUBLIC S16 KwUiKwuDatInd(pst, suId, datInd, mBuf)
+Pst               *pst;
+SuId              suId;
+KwuDatIndInfo     *datInd;
+Buffer            *mBuf;
+#endif
+{
+   TRC3(KwUiKwuDatInd)
+
+   /* jump to specific primitive depending on configured selector */
+   (*kwUiKwuDatIndMt[pst->selector])(pst, suId, datInd, mBuf);
+
+   RETVALUE(ROK);
+
+} /* end of KwUiKwuDatInd */
+
+   PUBLIC int rlcDatCfmsSent = 0;
+\f
+#ifndef KW_PDCP
+/**
+ *
+ * @brief 
+ *
+ *        Handler for sending the data confirmation to upper layer. 
+ *
+ * @b Description:
+ *
+ *        This function is used to send a confirmation to the service
+ *        user about the data received by the peer RLC entity. 
+ *
+ *  @param[in] pst         Post structure  
+ *  @param[in] suId        Service User SAP ID 
+ *  @param[in] datCfmInfo  Data Confirmation Information
+ *
+ *  @return  S16
+ *      -# ROK 
+ *      -# RFAILED
+ */
+#ifdef ANSI
+PUBLIC S16 KwUiKwuDatCfm
+(
+Pst               *pst,
+SuId              suId,
+KwuDatCfmInfo     *datCfm
+)
+#else
+PUBLIC S16 KwUiKwuDatCfm(pst, suId, datCfm)
+Pst               *pst;
+SuId              suId;
+KwuDatCfmInfo     *datCfm;
+#endif
+{
+   rlcDatCfmsSent++;
+   TRC3(KwUiKwuDatCfm)
+
+   /* jump to specific primitive depending on configured selector */
+   (*kwUiKwuDatCfmMt[pst->selector])(pst, suId, datCfm);
+
+   RETVALUE(ROK);
+
+} /* end of KwUiKwuDatCfm */
+
+\f
+/**
+ *
+ * @brief 
+ *
+ *        Handler for sending the Status Indication to the upper layer. 
+ *
+ * @b Description:
+ *
+ *        This function is used only by RLC AM entity.It send status 
+ *        indication to the upper layer about the maximum number of 
+ *        re-transmissions reached for a RLC AM entity. 
+ *
+ *  @param[in] pst         Post structure  
+ *  @param[in] suId        Service User SAP ID 
+ *  @param[in] staInd      RLC Entity Id  
+ *
+ *  @return  S16
+ *      -# ROK 
+ *      -# RFAILED
+ */
+#ifdef ANSI
+PUBLIC S16 KwUiKwuStaInd
+(
+Pst               *pst,
+SuId              suId,
+KwuStaIndInfo     *staInd
+)
+#else
+PUBLIC S16 KwUiKwuStaInd(pst, suId, staInd)
+Pst               *pst;
+SuId              suId;
+KwuStaIndInfo     *staInd;
+#endif
+{
+   TRC3(KwUiKwuStaInd)
+
+   /* jump to specific primitive depending on configured selector */
+   (*kwUiKwuStaIndMt[pst->selector])(pst, suId, staInd);
+
+   RETVALUE(ROK);
+
+} /* end of KwUiKwuStaInd */
+
+\f
+/**
+ *
+ * @brief 
+ *
+ *        Handler for sending the Status Indication to the upper layer. 
+ *
+ * @b Description:
+ *
+ *        This function is used only by RLC AM entity.It send status 
+ *        indication to the upper layer about the maximum number of 
+ *        re-transmissions reached for a RLC AM entity. 
+ *
+ *  @param[in] pst         Post structure  
+ *  @param[in] suId        Service User SAP ID 
+ *  @param[in] staInd      RLC Entity Id  
+ *
+ *  @return  S16
+ *      -# ROK 
+ *      -# RFAILED
+ */
+#ifdef ANSI
+PUBLIC S16 KwUiKwuReEstCmpInd
+(
+Pst               *pst,
+SuId              suId,
+CmLteRlcId        rlcId
+)
+#else
+PUBLIC S16 KwUiKwuReEstCmpInd(pst, suId, rlcId)
+Pst               *pst;
+SuId              suId;
+CmLteRlcId        rlcId;
+#endif
+{
+   TRC3(KwUiKwuReEstCmpInd)
+   RLOG0(L_DEBUG, "In KwUiKwuReEstCmpInd");
+
+   /* jump to specific primitive depending on configured selector */
+   (*kwUiKwuReEstCmpIndMt[pst->selector])(pst, suId, rlcId);
+
+   RETVALUE(ROK);
+
+} /* end of KwUiKwuReEstCmpInd */
+/* kw005.201 added support for L2 Measurement */
+\f
+/**
+ *
+ * @brief 
+ *
+ *        Handler for sending the Sdu Disc Cfm  to the upper layer. 
+ *
+ * @b Description:
+ *       
+ *       This function confirms the discard of an SDU .
+ *
+ *  @param[in] pst         Post structure  
+ *  @param[in] suId        Service User SAP ID 
+ *  @param[in] discCfm     Disc information.
+ *
+ *  @return  S16
+ *      -# ROK 
+ *      -# RFAILED
+ */
+#ifdef ANSI
+PUBLIC S16 KwUiKwuDiscSduCfm
+(
+Pst               *pst,
+SuId              suId,
+KwuDiscSduInfo    *discCfm
+)
+#else
+PUBLIC S16 KwUiKwuDiscSduCfm(pst, suId, discCfm)
+Pst               *pst;
+SuId              suId;
+KwuDiscSduInfo    *discCfm;
+#endif
+{
+   TRC3(KwUiKwuDiscSduCfm)
+
+   /* jump to specific primitive depending on configured selector */
+   (*kwUiKwuDiscSduCfmMt[pst->selector])(pst, suId, discCfm);
+
+   RETVALUE(ROK);
+
+} /* end of KwUiKwuDiscSduCfm */ 
+
+/**
+ *
+ * @brief 
+ *
+ *        Handler for sending Flow indication to the upper layer. 
+ *
+ * @b Description:
+ *       
+ *       This function indicates to PDCP if packets need to be stopped or
+ *       started for a particular RB
+ *
+ *  @param[in] pst                Post structure  
+ *  @param[in] suId               Service User SAP ID 
+ *  @param[in] flowCntrlIndInfo   Flow control information.
+ *
+ *  @return  S16
+ *      -# ROK 
+ *      -# RFAILED
+ */
+#ifdef ANSI
+PUBLIC S16 KwUiKwuFlowCntrlInd
+(
+Pst                   *pst,
+SuId                  suId,
+KwuFlowCntrlIndInfo   *flowCntrlIndInfo
+)
+#else
+PUBLIC S16 KwUiKwuFlowCntrlInd(pst, suId, flowCntrlIndInfo)
+Pst                   *pst;
+SuId                  suId;
+KwuFlowCntrlIndInfo   *flowCntrlIndInfo;
+#endif
+{
+   TRC3(KwUiKwuFlowCntrlInd)
+
+   /* jump to specific primitive depending on configured selector */
+   (*kwUiKwuFlowCntrlIndMt[pst->selector])(pst, suId, flowCntrlIndInfo);
+
+   RETVALUE(ROK);
+
+} /* end of KwUiKwuFlowCntrlInd */ 
+#ifdef LTE_L2_MEAS
+\f
+/**
+ *
+ * @brief 
+ *
+ *        Handler for sending the Data ack indication  to the upper layer. 
+ *
+ * @b Description:
+ *       
+ *       This function confirms the succesfull transmission of SDU
+ *
+ *  @param[in] pst         Post structure  
+ *  @param[in] suId        Service User SAP ID 
+ *  @param[in] datAckInd   DatAckInd
+ *
+ *  @return  S16
+ *      -# ROK 
+ *      -# RFAILED
+ */
+#ifdef ANSI
+PUBLIC S16 KwUiKwuDatAckInd
+(
+Pst               *pst,
+SuId              suId,
+KwuDatAckInfo     *datAckInd
+)
+#else
+PUBLIC S16 KwUiKwuDatAckInd(pst, suId, datAckInd)
+Pst               *pst;
+SuId              suId;
+KwuDatAckInfo     *datAckInd;
+#endif
+{
+   TRC3(KwUiKwuDatAckInd)
+
+   /* jump to specific primitive depending on configured selector */
+   (*kwUiKwuDatAckIndMt[pst->selector])(pst, suId, datAckInd);
+
+   RETVALUE(ROK);
+
+} /* end of KwUiKwuDatAckInd */ 
+#endif /* LTE_L2_MEAS */
+#endif /* KW_PDCP */
+
+\f
+#ifdef PTKWKWU
+/*************************************************************************
+ *                         KWU Porting Functions
+ ************************************************************************/
+/**
+ *
+ * @brief 
+ *
+ *        PtUiKwuBndCfm - Portable SAP bind confirm
+ *
+ *  @param[in] pst      - Post structure  
+ *  @param[in] suId     - Service user SAP ID 
+ *  @param[in] status   - Status
+ *
+ *  @return  S16
+ *      -# ROK 
+ */
+#ifdef ANSI
+PRIVATE S16 PtUiKwuBndCfm 
+(
+Pst *pst,                       /* post structure */
+SuId suId,                      /* Service User Id */
+U8 status                       /* status */
+)
+#else
+PRIVATE S16 PtUiKwuBndCfm(pst, suId, status)
+Pst *pst;                       /* post structure */
+SuId suId;                      /* Service User Id */
+U8 status;                      /* status */
+#endif
+{
+#if (ERRCLASS & ERRCLS_DEBUG)
+   KwCb   *tKwCb;
+#endif
+   TRC3(PtUiKwuBndCfm);
+
+   UNUSED(suId);
+   UNUSED(status);
+#if (ERRCLASS & ERRCLS_DEBUG)
+   if (pst->srcInst >= KW_MAX_RLC_INSTANCES)
+   {
+      RETVALUE(RFAILED);
+   }
+   
+   tKwCb = KW_GET_KWCB(pst->srcInst);
+   RLOG0(L_ERROR, "Improper selector value");
+#endif /* (ERRCLASS & ERRCLS_DEBUG) */
+
+   RETVALUE(ROK);
+} /* end of PtUiKwuBndCfm */
+#endif /* PTKWKWU */
+
+\f
+/**
+ *
+ * @brief 
+ *
+ *        PtUiKwuDatCfm - Portable common channel data request
+ *
+ *  @param[in] pst    -  Post structure  
+ *  @param[in] suId   -  Service user SAP ID 
+ *  @param[in] datCfm -  Data Request
+ *
+ *  @return  S16
+ *      -# ROK 
+ */
+#ifdef ANSI
+PUBLIC S16 PtUiKwuDatCfm
+(
+Pst               *pst,
+SuId              suId,
+KwuDatCfmInfo    *datCfm
+)
+#else
+PUBLIC S16 PtUiKwuDatCfm(pst, suId, datCfm)
+Pst               *pst;
+SuId              suId;
+KwuDatCfmInfo     *datCfm;
+#endif
+{
+#if (ERRCLASS & ERRCLS_DEBUG)
+   KwCb   *tKwCb;
+#endif
+   TRC3(PtUiKwuDatCfm)
+
+   UNUSED(pst);
+   UNUSED(suId);
+   UNUSED(datCfm);
+#if (ERRCLASS & ERRCLS_DEBUG)
+   if (pst->srcInst >= KW_MAX_RLC_INSTANCES)
+   {
+      RETVALUE(RFAILED);
+   }
+   tKwCb = KW_GET_KWCB(pst->srcInst);
+   RLOG0(L_ERROR, "Improper selector value");
+#endif /* (ERRCLASS & ERRCLS_DEBUG) */
+
+   RETVALUE(ROK);
+
+} /* end of PtUiKwuDatCfm */
+
+\f
+/**
+ *
+ * @brief 
+ *
+ *        PtUiKwuStaInd - Portable common channel data request
+ *
+ *  @param[in] pst    -  Post structure  
+ *  @param[in] suId   -  Service user SAP ID 
+ *  @param[in] staInd -  Data Request
+ *
+ *  @return  S16
+ *      -# ROK 
+ */
+#ifdef ANSI
+PUBLIC S16 PtUiKwuStaInd
+(
+Pst               *pst,
+SuId              suId,
+KwuStaIndInfo     *staInd
+)
+#else
+PUBLIC S16 PtUiKwuStaInd(pst, suId, staInd)
+Pst               *pst;
+SuId              suId;
+KwuStaIndInfo     *staInd;
+#endif
+{
+#if (ERRCLASS & ERRCLS_DEBUG)
+   KwCb   *tKwCb;
+#endif
+   TRC3(PtUiKwuStaInd)
+
+   UNUSED(pst);
+   UNUSED(suId);
+   UNUSED(staInd);
+
+#if (ERRCLASS & ERRCLS_DEBUG)
+   if (pst->srcInst >= KW_MAX_RLC_INSTANCES)
+   {
+      RETVALUE(RFAILED);
+   }
+   tKwCb = KW_GET_KWCB(pst->srcInst);
+   RLOG0(L_ERROR, "Improper selector value");
+#endif /* (ERRCLASS & ERRCLS_DEBUG) */
+
+   RETVALUE(ROK);
+
+} /* end of PtUiKwuStaInd */
+
+\f
+/**
+ *
+ * @brief 
+ *
+ *        PtUiKwuReEstCmpInd - Portable common channel data request
+ *
+ *  @param[in] pst    -  Post structure  
+ *  @param[in] suId   -  Service user SAP ID 
+ *  @param[in] staInd -  Data Request
+ *
+ *  @return  S16
+ *      -# ROK 
+ */
+#ifdef ANSI
+PUBLIC S16 PtUiKwuReEstCmpInd
+(
+Pst               *pst,
+SuId              suId,
+CmLteRlcId        rlcId
+)
+#else
+PUBLIC S16 PtUiKwuReEstCmpInd(pst, suId, rlcId)
+Pst               *pst;
+SuId              suId;
+CmLteRlcId        rlcId;
+#endif
+{
+#if (ERRCLASS & ERRCLS_DEBUG)
+   KwCb   *tKwCb;
+#endif
+   TRC3(PtUiKwuReEstCmpInd)
+
+   UNUSED(pst);
+   UNUSED(suId);
+   UNUSED(rlcId);
+
+#if (ERRCLASS & ERRCLS_DEBUG)
+   if (pst->srcInst >= KW_MAX_RLC_INSTANCES)
+   {
+      RETVALUE(RFAILED);
+   }
+   tKwCb = KW_GET_KWCB(pst->srcInst);
+   RLOG0(L_ERROR, "Improper selector value");
+#endif /* (ERRCLASS & ERRCLS_DEBUG) */
+
+   RETVALUE(ROK);
+
+} /* end of PtUiKwuReEstCmpInd */
+
+/* kw005.201 added support for L2 Measurement */
+/*
+ * @brief 
+ *
+ *        PtUiKwuDiscSduCfm - Portable common channel data request
+ *
+ *  @param[in] pst    -  Post structure  
+ *  @param[in] suId   -  Service user SAP ID 
+ *  @param[in] staInd -  Data Request
+ *
+ *  @return  S16
+ *      -# ROK 
+ */
+#ifdef ANSI
+PUBLIC S16 PtUiKwuDiscSduCfm
+(
+Pst               *pst,
+SuId              suId,
+KwuDiscSduInfo    *discCfm
+)
+#else
+PUBLIC S16 PtUiKwuDiscSduCfm(pst, suId, discCfm)
+Pst               *pst;
+SuId              suId;
+KwuDiscSduInfo    *discCfm;
+#endif
+{
+#if (ERRCLASS & ERRCLS_DEBUG)
+   KwCb   *tKwCb;
+#endif
+   TRC3(PtUiKwuDiscSduCfm)
+
+   UNUSED(pst);
+   UNUSED(suId);
+   UNUSED(discCfm);
+
+#if (ERRCLASS & ERRCLS_DEBUG)
+   if (pst->srcInst >= KW_MAX_RLC_INSTANCES)
+   {
+      RETVALUE(RFAILED);
+   }
+   tKwCb = KW_GET_KWCB(pst->srcInst);
+   RLOG0(L_ERROR, "Improper selector value");
+#endif /* (ERRCLASS & ERRCLS_DEBUG) */
+
+   RETVALUE(ROK);
+
+} /* end of PtUiKwuDiscSduCfm */
+
+/*
+ * @brief 
+ *
+ *        PtUiKwuFlowCntrlInd - Portable Flow control idication
+ *
+ *  @param[in] pst          -  Post structure  
+ *  @param[in] suId         -  Service user SAP ID 
+ *  @param[in] flowCntrlInd -  Flow control information
+ *
+ *  @return  S16
+ *      -# ROK 
+ */
+#ifdef ANSI
+PUBLIC S16 PtUiKwuFlowCntrlInd
+(
+Pst                    *pst,
+SuId                   suId,
+KwuFlowCntrlIndInfo    *flowCntrlIndInfo
+)
+#else
+PUBLIC S16 PtUiKwuFlowCntrlInd(pst, suId, flowCntrlIndInfo)
+Pst                    *pst;
+SuId                   suId;
+KwuFlowCntrlIndInfo    *flowCntrlIndInfo;
+#endif
+{
+#if (ERRCLASS & ERRCLS_DEBUG)
+   KwCb   *tKwCb;
+#endif
+   TRC3(PtUiKwuFlowCntrlInd)
+
+   UNUSED(pst);
+   UNUSED(suId);
+   UNUSED(flowCntrlIndInfo);
+
+#if (ERRCLASS & ERRCLS_DEBUG)
+   if (pst->srcInst >= KW_MAX_RLC_INSTANCES)
+   {
+      RETVALUE(RFAILED);
+   }
+   tKwCb = KW_GET_KWCB(pst->srcInst);
+   RLOG0(L_ERROR, "Improper selector value");
+#endif /* (ERRCLASS & ERRCLS_DEBUG) */
+
+   RETVALUE(ROK);
+
+} /* end of PtUiKwuFlowCntrlInd */
+#ifdef LTE_L2_MEAS
+\f
+/**
+ *
+ * @brief 
+ *
+ *        Handler for sending the Data ack indication  to the upper layer. 
+ *
+ * @b Description:
+ *       
+ *       This function confirms the succesfull transmission of SDU
+ *
+ *  @param[in] pst         Post structure  
+ *  @param[in] suId        Service User SAP ID 
+ *  @param[in] datAckInd   DatAckInd
+ *
+ *  @return  S16
+ *      -# ROK 
+ *      -# RFAILED
+ */
+#ifdef ANSI
+PUBLIC S16 PtUiKwuDatAckInd
+(
+Pst               *pst,
+SuId              suId,
+KwuDatAckInfo     *datAckInd
+)
+#else
+PUBLIC S16 PtUiKwuDatAckInd(pst, suId, datAckInd)
+Pst               *pst;
+SuId              suId;
+KwuDatAckInfo     *datAckInd;
+#endif
+{
+#if (ERRCLASS & ERRCLS_DEBUG)
+   KwCb   *tKwCb;
+#endif
+   TRC3(PtUiKwuDatAckInd)
+   
+   UNUSED(pst);
+   UNUSED(suId);
+   UNUSED(datAckInd);
+#if (ERRCLASS & ERRCLS_DEBUG)
+   if (pst->srcInst >= KW_MAX_RLC_INSTANCES)
+   {
+      RETVALUE(RFAILED);
+   }
+   tKwCb = KW_GET_KWCB(pst->srcInst);
+
+   RLOG0(L_ERROR, "Improper selector value");
+#endif /* (ERRCLASS & ERRCLS_DEBUG) */
+   RETVALUE(ROK);
+}/* end of PtUiKwuDatAckInd */
+#endif /* LTE_L2_MEAS */
+#if (defined(PTKWKWU) || defined(KW_PDCP))
+\f
+/**
+ *
+ * @brief 
+ *
+ *        PtUiKwuDatInd - Portable common channel data request
+ *
+ *  @param[in] pst    -  Post structure  
+ *  @param[in] suId   -  Service user SAP ID 
+ *  @param[in] datInd -  Data Request
+ *
+ *  @return  S16
+ *      -# ROK 
+ */
+#ifdef ANSI
+PUBLIC S16 PtUiKwuDatInd
+(
+Pst               *pst,
+SuId              suId,
+KwuDatIndInfo     *datInd,
+Buffer            *mBuf
+)
+#else
+PUBLIC S16 PtUiKwuDatInd(pst, suId, datInd, mBuf)
+Pst               *pst;
+SuId              suId;
+KwuDatIndInfo     *datInd;
+Buffer            *mBuf;
+#endif
+{
+#if (ERRCLASS & ERRCLS_DEBUG)
+   KwCb   *tKwCb;
+#endif
+   TRC3(PtUiKwuDatInd)
+
+   UNUSED(pst);
+   UNUSED(suId);
+   UNUSED(datInd);
+   UNUSED(mBuf);
+
+#if (ERRCLASS & ERRCLS_DEBUG)
+   if (pst->srcInst >= KW_MAX_RLC_INSTANCES)
+   {
+      RETVALUE(RFAILED);
+   }
+   tKwCb = KW_GET_KWCB(pst->srcInst);
+   RLOG0(L_ERROR, "Improper selector value");
+#endif /* (ERRCLASS & ERRCLS_DEBUG) */
+
+   RETVALUE(ROK);
+
+} /* end of PtUiKwuDatInd */
+#endif /* PTKWKWU || KW_PDCP */
+
+
+\f  
+/*********************************************************************
+ *             Primitives for CKW interface 
+ ********************************************************************/
+
+/* CKW Bind Confirm primitive */
+
+PUBLIC CkwBndCfm kwUiCkwBndCfmMt[] =
+{
+#ifdef LCKWUICKW
+   cmPkCkwBndCfm,            /* 0 - loosely coupled */
+#else
+   PtUiCkwBndCfm,            /* 0 - loosely coupled, portable  */
+#endif /* LCCKUICKW */
+#ifdef NH
+   NhLiCkwBndCfm,            /* 1 - tightly coupled, RRC  */
+#else
+   PtUiCkwBndCfm,            /* 1 - tightly coupled, portable */
+#endif /* NH */
+};
+
+/* CKW Configuration confirm primitive */
+
+PUBLIC CkwCfgCfm kwUiCkwCfgCfmMt[] =
+{
+#ifdef LCKWUICKW
+   cmPkCkwCfgCfm,            /* 0 - loosely coupled */
+#else
+   PtUiCkwCfgCfm,            /* 0 - loosely coupled, portable  */
+#endif /* LCKWUICKW */
+#ifdef NH
+   NhLiCkwCfgCfm,            /* 1 - tightly coupled, RRC  */
+#else
+   PtUiCkwCfgCfm,            /* 1 - tightly coupled, portable */
+#endif /* NH */
+};
+
+PUBLIC CkwUeIdChgCfm kwUiCkwUeIdChgCfmMt[] =
+{
+#ifdef LCKWUICKW
+   cmPkCkwUeIdChgCfm,            /* 0 - loosely coupled */
+#else
+   PtUiCkwUeIdChgCfm,            /* 0 - loosely coupled, portable  */
+#endif /* LCKWUICKW */
+#ifdef NH
+   NhLiCkwUeIdChgCfm,            /* 1 - tightly coupled, RRC  */
+#else
+   PtUiCkwUeIdChgCfm,            /* 1 - tightly coupled, portable */
+#endif /* NH */
+};
+
+
+\f  
+/****************************************************************************
+ *                         CKW Interface Mt functions
+ ***************************************************************************/
+/**
+ *
+ * @brief 
+ *
+ *        Handler for confirming  the bind request received from CKW
+ *        interface.
+ *
+ * @b Description:
+ *
+ *        This function send the bind confirm primitive to the RLC user,
+ *        when it receives a bind request from its service user.
+ *
+ *  @param[in] pst      - Post structure  
+ *  @param[in] suId     - Service user SAP ID 
+ *  @param[in] status   - Status
+ *
+ *  @return  S16
+ *      -# ROK 
+ */
+#ifdef ANSI
+PUBLIC S16 KwUiCkwBndCfm
+(
+Pst *pst,                       /* post structure */
+SuId suId,                      /* Service User Id */
+U8   status                     /* Status */
+)
+#else
+PUBLIC S16 KwUiCkwBndCfm(pst, suId, status)
+Pst *pst;                       /* post structure */
+SuId suId;                      /* Service User Id */
+U8   status;                    /* Status */
+#endif
+{
+   TRC3(KwUiCkwBndCfm)
+
+   /* jump to specific primitive depending on configured selector */
+   (*kwUiCkwBndCfmMt[pst->selector])(pst, suId, status);
+
+   RETVALUE(ROK);
+
+} /* end of KwUiCkwBndCfm */
+
+\f
+/**
+ *
+ * @brief 
+ *
+ *        Handler for sending a configuration confirm to RRC.
+ *
+ * @b Description:
+ *
+ *        This function is used by RLC user to send a configuration
+ *        confirmation to RRC after configuring(add/delete/modify)
+ *        the RLC entities. 
+ *
+ *  @param[in] pst      Post structure  
+ *  @param[in] transId  Transaction Id 
+ *  @param[in] cfmInfo  Config Confirmation Info 
+ *
+ *  @return  S16
+ *      -# ROK 
+ *
+ */
+#ifdef ANSI
+PUBLIC S16 KwUiCkwCfgCfm
+(
+Pst            *pst,                      /* post structure */
+SuId           suId,                      /* Service User Id */
+CkwCfgCfmInfo  *cfmInfo                    /* Configuration Confirm */
+)
+#else
+PUBLIC S16 KwUiCkwCfgCfm(pst, suId, cfmInfo)
+Pst            *pst;                      /* post structure */
+SuId           suId;                      /* Service User Id */
+CkwCfgCfmInfo  *cfmInfo;                   /* Configuration Confirm */
+#endif
+{
+   TRC3(KwUiCkwCfgCfm)
+
+   /* jump to specific primitive depending on configured selector */
+   (*kwUiCkwCfgCfmMt[pst->selector])(pst, suId, cfmInfo);
+
+   RETVALUE(ROK);
+
+} /* end of KwUiCkwCfgCfm */
+
+\f
+/**
+ *
+ * @brief 
+ *
+ *        Handler for sending a configuration for UE ID change.
+ *
+ * @b Description:
+ *
+ *        This function is used by RLC to send a configuration
+ *        confirm for UE ID change.
+ *
+ *  @param[in] pst      Post structure  
+ *  @param[in] suId     Service User Id
+ *  @param[in] transId  Transaction Id 
+ *  @param[in] cfmInfo  Config Confirmation Info 
+ *
+ *  @return  S16
+ *      -# ROK 
+ *
+ */
+#ifdef ANSI
+PUBLIC S16 KwUiCkwUeIdChgCfm 
+(
+Pst            *pst,                      /* post structure */
+SuId           suId,                      /* Service User Id */
+U32            transId,
+CkwUeInfo      *ueInfo,
+CmStatus       status
+)
+#else
+PUBLIC S16 KwUiCkwUeIdChgCfm(pst, suId, transId,ueInfo,status)
+Pst            *pst;                      /* post structure */
+SuId           suId;                      /* Service User Id */
+U32            transId;
+CkwUeInfo      *ueInfo;
+CmStatus       status;
+#endif
+{
+   TRC3(KwUiCkwUeIdChgCfm)
+
+   /* jump to specific primitive depending on configured selector */
+   (*kwUiCkwUeIdChgCfmMt[pst->selector])(pst, suId, transId, ueInfo, status);
+
+   RETVALUE(ROK);
+
+} /* end of KwUiCkwCfgCfm */
+
+\f
+#ifdef PTKWCKW
+/*************************************************************************
+ *                         CKW Porting Functions
+ ************************************************************************/
+/**
+ *
+ * @brief 
+ *
+ *        KwUiCkwBndCfm - CKW SAP bind confirm
+ *
+ *  @param[in] pst      - Post structure  
+ *  @param[in] suId     - Service user SAP ID 
+ *  @param[in] status   - Status
+ *
+ *  @return  S16
+ *      -# ROK 
+ */
+#ifdef ANSI
+PRIVATE S16 PtUiCkwBndCfm 
+(
+Pst *pst,                       /* post structure */
+SuId suId,                      /* Service User Id */
+U8 status                       /* status */
+)
+#else
+PRIVATE S16 PtUiCkwBndCfm(pst, suId, status)
+Pst *pst;                       /* post structure */
+SuId suId;                      /* Service User Id */
+U8 status;                      /* status */
+#endif
+{
+#if (ERRCLASS & ERRCLS_DEBUG)
+   KwCb   *tKwCb;
+#endif
+   TRC3(PtUiCkwBndCfm);
+
+   UNUSED(pst);
+   UNUSED(suId);
+   UNUSED(status);
+
+#if (ERRCLASS & ERRCLS_DEBUG)
+   if (pst->srcInst >= KW_MAX_RLC_INSTANCES)
+   {
+      RETVALUE(RFAILED);
+   }
+   tKwCb = KW_GET_KWCB(pst->srcInst);
+   RLOG0(L_ERROR, "Improper selector value");
+#endif /* (ERRCLASS & ERRCLS_DEBUG) */
+
+   RETVALUE(ROK);
+} /* end of PtUiCkwBndCfm */
+
+\f
+/**
+ *
+ * @brief 
+ *
+ *        PtUiCkwCfgCfm - KWU SAP bind confirm
+ *
+ *  @param[in] pst      - Post structure  
+ *  @param[in] suId     - Service user SAP ID 
+ *  @param[in] cfmInfo  - Configuration confirm
+ *
+ *  @return  S16
+ *      -# ROK 
+ */
+#ifdef ANSI
+PUBLIC S16 PtUiCkwCfgCfm
+(
+Pst            *pst,                      /* post structure */
+SuId           suId,                      /* Service User Id */
+CkwCfgCfmInfo  *cfmInfo                    /* Configuration Confirm */
+)
+#else
+PUBLIC S16 PtUiCkwCfgCfm(pst, suId, cfmInfo)
+Pst            *pst;                      /* post structure */
+SuId           suId;                      /* Service User Id */
+CkwCfgCfmInfo  *cfmInfo;                   /* Configuration Confirm */
+#endif
+{
+#if (ERRCLASS & ERRCLS_DEBUG)
+   KwCb   *tKwCb;
+#endif
+   TRC3(PtUiCkwCfgCfm);
+
+   UNUSED(pst);
+   UNUSED(suId);
+   UNUSED(cfmInfo);
+
+#if (ERRCLASS & ERRCLS_DEBUG)
+   if (pst->srcInst >= KW_MAX_RLC_INSTANCES)
+   {
+      RETVALUE(RFAILED);
+   }
+   tKwCb = KW_GET_KWCB(pst->srcInst);
+   RLOG0(L_ERROR, "Improper selector value");
+#endif /* (ERRCLASS & ERRCLS_DEBUG) */
+
+   RETVALUE(ROK);
+
+} /* end of PtUiCkwCfgCfm */
+
+#ifdef ANSI
+PUBLIC S16 PtUiCkwUeIdChgCfm 
+(
+Pst            *pst,                      /* post structure */
+SuId           suId,                      /* Service User Id */
+U32            transId,
+CkwUeInfo      *ueInfo,
+CmStatus       status
+)
+#else
+PUBLIC S16 PtUiCkwUeIdChgCfm(pst, suId,transId,ueInfo,status)
+Pst            *pst;                      /* post structure */
+SuId           suId;                      /* Service User Id */
+U32            transId;
+CkwUeInfo      *ueInfo;
+CmStatus       status;
+#endif
+{
+#if (ERRCLASS & ERRCLS_DEBUG)
+   KwCb   *tKwCb;
+#endif
+   TRC3(PtUiCkwUeIdChgCfm);
+
+   UNUSED(pst);
+   UNUSED(suId);
+   UNUSED(transId);
+   UNUSED(ueInfo);
+   UNUSED(status);
+
+#if (ERRCLASS & ERRCLS_DEBUG)
+   if (pst->srcInst >= KW_MAX_RLC_INSTANCES)
+   {
+      RETVALUE(RFAILED);
+   }
+   tKwCb = KW_GET_KWCB(pst->srcInst);
+   RLOG0(L_ERROR, "Improper selector value");
+#endif /* (ERRCLASS & ERRCLS_DEBUG) */
+
+   RETVALUE(ROK);
+
+} /* end of PtUiCkwUeIdChgCfm */
+#endif /* PTKWCKW */
+
+#if (defined(L2_L3_SPLIT) && defined(ICC_RECV_TSK_RBUF))
+/**
+ *
+ * @brief 
+ *
+ *        kwDlBatchProcSplit- process rbug messages
+ *
+ *  @return  S16
+ *      -# ROK 
+ */
+#ifdef ANSI
+PUBLIC S16 kwDlBatchProcSplit 
+(
+Void
+)
+#else
+PUBLIC S16 kwDlBatchProcSplit()
+Void;
+#endif
+{
+
+/* Read from Ring Buffer and process PDCP packets */
+   Void *elmIndx = NULLP;
+   RxmBufReq *datReq = NULLP;
+#ifdef LTE_ADV
+   U32 dlPktCount = 0;
+#endif
+   U8 rngBufDeqIndx = 0;
+   U32 rngBufDeqMaxCnt;
+   U32 rngBufCurrCnt;
+
+   rngBufDeqMaxCnt = SS_RNG_MAX_DLPDCP_TO_DLRLC_DQ_CNT;
+#ifdef TENB_T2K3K_SPECIFIC_CHANGES
+   rngBufCurrCnt = SGetNumElemInRng(SS_RNG_BUF_RX_TO_DLRLC);
+   if ( rngBufCurrCnt > (3 * SS_RNG_MAX_DLPDCP_TO_DLRLC_DQ_CNT))
+   {
+      if ( rngBufCurrCnt > (6 * SS_RNG_MAX_DLPDCP_TO_DLRLC_DQ_CNT))
+      {
+         /* Restablishment scenario */
+         rngBufDeqMaxCnt = (4 * SS_RNG_MAX_DLPDCP_TO_DLRLC_DQ_CNT);
+      }
+      else
+      {
+         rngBufDeqMaxCnt = (3 * SS_RNG_MAX_DLPDCP_TO_DLRLC_DQ_CNT)/2;
+      }
+   }
+#endif
+   elmIndx = SRngGetRIndx(SS_RNG_BUF_RX_TO_DLRLC);
+   while(NULLP != elmIndx)
+   {
+      datReq = (RxmBufReq *)elmIndx;
+      if(datReq->mBuf != NULLP)
+      {
+        cmUnpkKwuDatReq(KwUiKwuDatReq, &datReq->pst, datReq->mBuf);
+      }
+      else
+      {
+         RLOG0(L_ERROR, "mBuf is NULL");
+         if(datReq->mBuf)
+          cmUnpkKwuDatReq(KwUiKwuDatReq, &datReq->pst, datReq->mBuf);
+
+      }
+      SsRngInfoTbl[SS_RNG_BUF_RX_TO_DLRLC].nPktProc++;//Number of pkt processed in tti
+      datReq->mBuf = NULLP;
+      SRngIncrRIndx(SS_RNG_BUF_RX_TO_DLRLC);
+      rngBufDeqIndx++;
+      if(rngBufDeqIndx >= rngBufDeqMaxCnt)
+      {
+         break;
+      }
+#ifdef LTE_ADV
+      {
+        dlPktCount++;
+        if(dlPktCount > 75)
+        {
+           break;
+        }
+      }
+#endif
+      if((elmIndx = SRngGetRIndx(SS_RNG_BUF_RX_TO_DLRLC)) == NULLP)
+      {
+         break;
+      }
+   }
+
+   RETVALUE(ROK);
+}
+#endif
+
+#if defined(PDCP_RLC_DL_RBUF) || defined(SS_RBUF)
+#ifdef ANSI
+PUBLIC S16 kwDlBatchProc
+(
+Void
+)
+#else
+PUBLIC S16 kwDlBatchProc()
+Void;
+#endif
+{
+/* Read from Ring Buffer and process PDCP packets */
+
+   U8 rngBufDeqIndx = 0;
+   U32 rngBufDeqMaxCnt;
+#ifdef TENB_T2K3K_SPECIFIC_CHANGES
+   U32 rngBufCurrCnt;
+#endif
+   /* Memory regions different for BRCM and Intel */
+   /*dstProcId,srcProcId,dstEnt,dstInst,srcEnt,srcInst,prior,route,event,region,pool,selector*/
+#ifdef SS_RBUF
+   PRIVATE Pst rlcDlRbfuPst ={1,1,ENTKW,1,ENTPJ,1,PRIOR0,RTESPEC,KWU_EVT_DAT_REQ,1,1,0,0};
+#else
+   PRIVATE Pst rlcDlRbfuPst ={1,1,ENTKW,1,ENTPJ,1,PRIOR0,RTESPEC,KWU_EVT_DAT_REQ,2,1,0,0};
+#endif
+   Void *elmIndx = NULLP;
+   KwuDatReqDetl *kwuDatReqDetl = NULLP;
+   KwuDatReqInfo datReq;
+
+   rngBufDeqMaxCnt = SS_RNG_MAX_DLPDCP_TO_DLRLC_DQ_CNT;
+#ifdef TENB_T2K3K_SPECIFIC_CHANGES
+   rngBufCurrCnt = SGetNumElemInRng(SS_RNG_BUF_DLPDCP_TO_DLRLC);
+   if ( rngBufCurrCnt > (3 * SS_RNG_MAX_DLPDCP_TO_DLRLC_DQ_CNT))
+   {
+      if ( rngBufCurrCnt > (5 * SS_RNG_MAX_DLPDCP_TO_DLRLC_DQ_CNT))
+      {
+         /* Restablishment scenario */
+         rngBufDeqMaxCnt = (4 * SS_RNG_MAX_DLPDCP_TO_DLRLC_DQ_CNT);
+      }
+      else
+      {
+         rngBufDeqMaxCnt = (2 * SS_RNG_MAX_DLPDCP_TO_DLRLC_DQ_CNT);
+      }
+   }
+#endif
+   elmIndx = SRngGetRIndx(SS_RNG_BUF_DLPDCP_TO_DLRLC);
+   while(NULLP != elmIndx)
+   {
+      kwuDatReqDetl = (KwuDatReqDetl *)elmIndx;
+      datReq.rlcId = kwuDatReqDetl->rlcId;
+      datReq.sduId = kwuDatReqDetl->sduId;
+      datReq.lcType = kwuDatReqDetl->lcType;
+      SsRngInfoTbl[SS_RNG_BUF_DLPDCP_TO_DLRLC].nPktProc++;;//Number of pkt processed in tti
+      if(kwuDatReqDetl->mBuf != NULLP)
+      {
+         KwUiKwuDatReq(&rlcDlRbfuPst, kwuDatReqDetl->spId, &datReq, kwuDatReqDetl->mBuf);
+      }
+      SRngIncrRIndx(SS_RNG_BUF_DLPDCP_TO_DLRLC);
+      rngBufDeqIndx++;
+
+      if(rngBufDeqIndx >= rngBufDeqMaxCnt)
+      {
+         break;
+      }
+      elmIndx = (Void *)SRngGetRIndx(SS_RNG_BUF_DLPDCP_TO_DLRLC);
+   }
+
+   RETVALUE(ROK);
+}
+
+
+#ifdef ANSI
+PUBLIC S16 kwUtlDlBatchProcPkts
+(
+Void
+)
+#else
+PUBLIC S16 kwUtlDlBatchProcPkts
+Void;
+#endif
+{
+    kwDlBatchProc();
+#ifdef SS_RBUF
+#ifdef LTE_L2_MEAS
+    kwUtlDlBatchProcHqStaInd();
+#endif
+    kwUtlFreeDlMem();
+#endif
+    RETVALUE(ROK);
+}   
+
+
+#ifdef ANSI
+PUBLIC S16 kwUtlDlFreeRlcRBuf
+(
+Void
+)
+#else
+PUBLIC S16 kwUtlDlFreeRlcRBuf
+Void;
+#endif
+{
+/* Read from Ring Buffer and process PDCP packets */
+   Void *elmIndx = NULLP;
+   KwuDatReqDetl *kwuDatReqDetl = NULLP;
+   /* Free SS_RNG_BUF_DLPDCP_TO_DLRLC  */
+   elmIndx = SRngGetRIndx(SS_RNG_BUF_DLPDCP_TO_DLRLC);
+   while(NULLP != elmIndx)
+   {
+      kwuDatReqDetl = (KwuDatReqDetl *)elmIndx;
+      SRngIncrRIndx(SS_RNG_BUF_DLPDCP_TO_DLRLC);
+      SsRngInfoTbl[SS_RNG_BUF_DLPDCP_TO_DLRLC].nPktProc++;
+      SPutMsg(kwuDatReqDetl->mBuf);
+      elmIndx = NULLP;
+      kwuDatReqDetl = NULLP;
+      if((elmIndx = SRngGetRIndx(SS_RNG_BUF_DLPDCP_TO_DLRLC)) == NULLP)
+      break;
+   }
+   RETVALUE(ROK);
+}
+
+
+#endif 
+#ifdef __cplusplus
+}
+#endif /* __cplusplus */
+/********************************************************************30**
+         End of file
+**********************************************************************/