--- /dev/null
+/*******************************************************************************
+################################################################################
+# 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. #
+################################################################################
+*******************************************************************************/
+
+/**********************************************************************
+
+ Name: LTE-PDCP Layer
+
+ Type: C file
+
+ Desc: Source code for PDCP Utility Module
+
+ This file contains following functions:
+
+ --PjLibObdCmpCfm
+ --PjLibObdIntProtCfm
+ --PjLibObdCipherCfm
+ --PjLibObdDecipherCfm
+ --PjLibObdIntVerCfm
+ --PjLibObdDecmpCfm
+ -- pjUtlCmpReq
+ -- pjUtlCipherReq
+ -- pjUtlIntProtReq
+
+ File: pj_dl_utl.c
+
+**********************************************************************/
+ static const char* RLOG_MODULE_NAME="PDCP";
+static int RLOG_MODULE_ID=1024;
+static int RLOG_FILE_ID=218;
+
+/** @file pj_dl_utl.c
+@brief PDCP Utility Module
+*/
+
+/* 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 "cpj.h" /* CPJ defines */
+#include "pju.h" /* PJU defines */
+#include "lpj.h" /* LPJ defines */
+
+#include "pj_env.h" /* RLC environment options */
+#include "pj.h" /* RLC defines */
+#include "pj_dl.h"
+#include "pj_err.h" /* Error defines */
+#include "pj_udx.h"
+#include "pj_ptsec.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 "cpj.x" /* CPJ */
+#include "pju.x" /* PJU */
+#include "lpj.x" /* LPJ */
+#include "pj.x"
+#include "pj_udx.h"
+#include "pj_udx.x"
+#include "pj_dl.x"
+#include "pj_lib.x" /* LIB */
+
+
+EXTERN CmLListCp pjMsCiphQ;
+EXTERN CmLListCp pjMsDeCiphQ;
+#ifndef XEON_SPECIFIC_CHANGES
+EXTERN U32 dbgPdcpMemCount,pdcpdrop, dbgSpaccThreshHoldDropCnt;
+EXTERN U32 dbgPdcpQSizeThreshHoldDropCnt;
+U32 spaccDropCount = 0;
+EXTERN U32 pjMsDlSpaccQCnt;
+EXTERN U32 pjMsUlSpaccQCnt;
+#endif
+#ifdef __cplusplus
+EXTERN "C" {
+#endif /* __cplusplus */
+
+#ifdef INTEL_SW_SEC
+EXTERN S16 PjLibObdSwCipherReq(PjLibTrans *libTrans, Buffer *mBuf, PjCb *gCb, Buffer **opSdu);
+
+EXTERN S16 pjSendToSwCipherFB ARGS((PjLibTrans *libTrans, FlatBuffer *mBuf,
+ PjCb *gCb, Buffer **opSdu));
+#endif
+
+PUBLIC S16 pjUtlReEstDl
+(
+PjCb *gCb,
+PjDlUeCb *ueCb /* UE Control Block */
+);
+
+PRIVATE S16 pjUtlDlHdlSecInitCfm ARGS((PjCb *gCb,PjDlUeCb *ueCb,
+ U16 txIdx,PjAsyncCfm *asyncCfm, UdxSecCfgCfmInfo *secCfgCfm,UdxReEstCfmInfo *reEstCfm));
+PRIVATE S16 pjUtlDlHdlCmpInitCfm ARGS((PjCb *gCb,PjDlUeCb *ueCb,
+ U16 txIdx,PjAsyncCfm *asyncCfm, UdxCfgCfmInfo *cfgCfm));
+
+/**
+ *
+ * @brief
+ *
+ * Handler to apply the new security algorithms and
+ * reset the compression unit.
+ *
+ * @b Description:
+ *
+ * This function
+ * 1. Creates new contexts for Control Plane Ciphering and Integrity.
+ * 2. Closes the old contexts for Control Plane Ciphering and Integrity.
+ *
+ * @param[in] ueCb UE Control Block
+ *
+ * @return S16
+ * -# ROK
+ * -# RFAILED
+ *
+ */
+#ifdef ANSI
+PUBLIC S16 pjUtlDlUpdUpSecKeys
+(
+PjCb *gCb,
+PjDlUeCb *ueCb /* UE Control Block */
+)
+#else
+PUBLIC S16 pjUtlDlUpdUpSecKeys(gCb,ueCb)
+PjCb *gCb;
+PjDlUeCb *ueCb; /* UE Control Block */
+#endif
+{
+ Void *tmpUpCxt;
+
+ TRC2(pjUtlDlUpdUpSecKeys);
+
+ RLOG2(L_DEBUG, "pjUtlReEstReconfig(ueCb(%d,%d))",
+ ueCb->key.ueId, ueCb->key.cellId);
+
+ if(ueCb->secInfo.secAct == TRUE)
+ {
+ /* Initialisation is done first followed by closure since we
+ * do not want the same ctxId to be returned for the new init.
+ * In ASYNC case, we drop packets if they are returned from a
+ * different ctxId. */
+
+#ifdef INTEL_QAT_DP
+ tmpUpCxt = ueCb->secInfo.upCiphSessCxtId;
+#else
+ tmpUpCxt = ueCb->secInfo.upCxtId;
+#endif
+
+ pjUtlDlUpInit(gCb,ueCb);
+ pjUtlDlCipherClose(gCb,tmpUpCxt);
+ }
+
+ RETVALUE(ROK);
+} /* pjUtlDlUpdUpSecKeys */
+
+/**
+ *
+ * @brief
+ *
+ * Handler to apply the new security algorithms and
+ * reset the compression unit.
+ *
+ * @b Description:
+ *
+ * This function
+ * 1. Creates new contexts for Control Plane Ciphering and Integrity.
+ * 2. Closes the old contexts for Control Plane Ciphering and Integrity.
+ *
+ * @param[in] ueCb UE Control Block
+ *
+ * @return S16
+ * -# ROK
+ * -# RFAILED
+ *
+ */
+#ifdef ANSI
+PUBLIC S16 pjUtlDlUpdCpSecKeys
+(
+PjCb *gCb,
+PjDlUeCb *ueCb /* UE Control Block */
+)
+#else
+PUBLIC S16 pjUtlDlUpdCpSecKeys(gCb,ueCb)
+PjCb *gCb;
+PjDlUeCb *ueCb; /* UE Control Block */
+#endif
+{
+ Void *tmpIntCxt;
+ Void *tmpCpCxt;
+
+ TRC2(pjUtlDlUpdCpSecKeys);
+
+ RLOG2(L_DEBUG, "pjUtlReEstReconfig(ueCb(%d,%d))",
+ ueCb->key.ueId, ueCb->key.cellId);
+
+ if(ueCb->secInfo.secAct == TRUE)
+ {
+ /* Initialisation is done first followed by closure since we
+ * do not want the same ctxId to be returned for the new init.
+ * In ASYNC case, we drop packets if they are returned from a
+ * different ctxId. */
+
+#ifdef INTEL_QAT_DP
+ tmpIntCxt = ueCb->secInfo.cpIntSessCxtId;
+ tmpCpCxt = ueCb->secInfo.cpCiphSessCxtId;
+#else
+ tmpIntCxt = ueCb->secInfo.intCxtId;
+ tmpCpCxt = ueCb->secInfo.cpCxtId;
+#endif
+
+ pjUtlDlCpInit(gCb,ueCb);
+ pjUtlDlIntInit(gCb,ueCb);
+
+ pjUtlDlIntClose(gCb,tmpIntCxt);
+ pjUtlDlCipherClose(gCb,tmpCpCxt);
+
+ }
+
+ RETVALUE(ROK);
+
+} /* pjUtlDlUpdCpSecKeys */
+
+/********************************************************************
+ * Utility Handler for Sending to Offboarding unit *
+ *******************************************************************/
+\f
+/**
+ *
+ * @brief
+ *
+ * Handler for opening the context with the compression unit (either
+ * synchronous or asynchronous) for RB within an UE.
+ *
+ * @b Description:
+ *
+ * This function opens the context with the compression unit per RB per
+ * UE, by sending ROHC configuration elements using synchronous / asynchronous
+ * function calls with relevant input parameters.
+ *
+ *
+ * @param[in] pjRbCb PDCP RbCb
+ *
+ * @return S16
+ * -# ROK
+ *
+ */
+#ifdef ANSI
+PUBLIC S16 pjUtlDlCmpInit
+(
+PjCb *gCb,
+PjDlRbCb *pjRbCb /* PDCP RbCb */
+)
+#else
+PUBLIC S16 pjUtlDlCmpInit(pjRbCb)
+PjCb *gCb;
+PjDlRbCb *pjRbCb; /* PDCP RbCb */
+#endif
+{
+ TRC3(pjUtlDlCmpInit)
+
+ RLOG2(L_DEBUG, "pjUtlDlCmpInit(pjRbCb(%d,%d))",pjRbCb->rbId, pjRbCb->rbType);
+#ifdef PJ_CMP_ASYNC
+
+ pjRbCb->ueCb->libInfo.tCmpInitBitMask |= (1 << (pjRbCb->rbId - 1));
+ pjRbCb->ueCb->libInfo.tLibInitBitMask |= PJ_LIB_COMP_BIT_MASK;
+ pjRbCb->cmpCxt.cfgTxId = pjRbCb->ueCb->libInfo.nxtAvlbTxId;
+
+ PjLibObdCmpInitReq(&gCb->pjGenCfg.obdPst.cmpPst,
+ pjRbCb->cmpCxt, pjRbCb->rohc);
+#else
+ pjLibCmpInitReq(pjRbCb->cmpCxt, pjRbCb->rohc, &(pjRbCb->cmpCxtId));
+#endif /* PJ_CMP_ASYNC */
+
+ RETVALUE(ROK);
+
+} /* end of pjUtlCmpInit */
+\f
+
+
+/**
+ *
+ * @brief
+ *
+ * Handler for opening the context with the Integration unit (either
+ * synchronous or asynchronous) for all SRBs of an UE.
+ *
+ * @b Description:
+ *
+ * This function opens the context with the security algo unit per UE
+ * for Integration protection/verification by sending the configured
+ * Integrity Info using synchronous / asynchronous function calls with
+ * relevant input parameters.
+ *
+ * @param[in] pjRbCb Pointer to RB control Block
+ *
+ *
+ * @return S16
+ * -# ROK
+ *
+ */
+#ifdef ANSI
+PUBLIC S16 pjUtlDlIntInit
+(
+PjCb *gCb,
+PjDlUeCb *ueCb /* UE CB Ptr */
+)
+#else
+PUBLIC S16 pjUtlDlIntInit(*gCb, *ueCb)
+PjCb *gCb;
+PjDlUeCb *ueCb; /* UE CB Ptr */
+#endif
+{
+
+ S16 ret=ROK;
+ Void *ctxId = NULLP;
+#ifdef PJ_SEC_ASYNC
+ U8 txIdx;
+ U32 *libInitBitMask = NULLP;
+#endif
+
+ TRC3(pjUtlDlIntInit)
+
+ RLOG2(L_DEBUG, "pjUtlDlIntInit(ueCb(%d,%d))",ueCb->key.ueId, ueCb->key.cellId);
+
+#ifdef PJ_SEC_ASYNC
+
+ if(ueCb->libInfo.state == PJ_STATE_REEST)
+ {
+ for(txIdx = 0; txIdx < PJ_MAX_ASYNC_CFM; txIdx++)
+ {
+ if((ueCb->libInfo.asyncCfm[txIdx] != NULLP) &&
+ (ueCb->libInfo.asyncCfm[txIdx]->cfmType == PJ_REEST_ASYNC_CFM))
+ {
+ libInitBitMask = &ueCb->libInfo.asyncCfm[txIdx]->libInitBitMask;
+ break;
+ }
+ }
+ }
+ else if(ueCb->libInfo.state == PJ_STATE_NORMAL)
+ {
+ libInitBitMask = &ueCb->libInfo.tLibInitBitMask;
+ }
+
+ if(libInitBitMask)
+ {
+ (*libInitBitMask) = (*libInitBitMask) | PJ_LIB_INT_BIT_MASK;
+ }
+
+ ret = PjLibObdIntInitReq(&gCb->pjGenCfg.obdPst.secPst,
+ ueCb->secInfo.secCxt, ueCb->secInfo.intInfo);
+#else
+#ifdef INTEL_QAT_DP
+#ifdef QAT_TWO_INSTANCE
+ pjLibIntInitReq(gCb->u.dlCb->instHndl, ueCb->secInfo.intInfo,&ctxId);
+#else
+ pjLibIntInitReq(gCb, ueCb->secInfo.intInfo,&ctxId);
+#endif
+ ueCb->secInfo.cpIntSessCxtId = ctxId;
+#else
+ pjLibIntInitReq(ueCb->secInfo.secCxt, ueCb->secInfo.intInfo,&(ctxId));
+ ueCb->secInfo.intCxtId = ctxId;
+#endif /* INTEL_QAT_DP */
+#endif /* PJ_SEC_ASYNC */
+
+ RETVALUE(ret);
+
+} /* end of pjUtlIntInit */
+\f
+/**
+ *
+ * @brief
+ *
+ * Handler for opening the context with the Ciphering unit (either
+ * synchronous or asynchronous) for SRBs of an UE.
+ *
+ * @b Description:
+ *
+ * This function opens the context with the security algo unit per UE
+ * for ciphering / deciphering by key by sending the configured
+ * Ciphering Info with control plane key using synchronous / asynchronous
+ * function calls with relevant input parameters.
+ *
+ * @param[in] pjRbCb Pointer to RB control Block
+ *
+ * @return S16
+ * -# ROK
+ *
+ */
+#ifdef ANSI
+PUBLIC S16 pjUtlDlCpInit
+(
+PjCb *gCb,
+PjDlUeCb *ueCb /* UE CB Ptr */
+)
+#else
+PUBLIC S16 pjUtlDlCpInit(*gCb, *ueCb)
+PjCb *gCb;
+PjDlUeCb *ueCb; /* UE CB Ptr */
+#endif
+{
+ Void *ctxId = NULLP;
+#ifdef PJ_SEC_ASYNC
+ U8 txIdx;
+ U32 *libInitBitMask = NULLP;
+#endif
+ S16 ret = ROK;
+
+ TRC3(pjUtlDlCpInit)
+
+ RLOG2(L_DEBUG, "pjUtlCpInit(ueCb(%d,%d))",ueCb->key.ueId, ueCb->key.cellId);
+
+#ifdef PJ_SEC_ASYNC
+
+ if(ueCb->libInfo.state == PJ_STATE_REEST)
+ {
+ for(txIdx = 0; txIdx < PJ_MAX_ASYNC_CFM; txIdx++)
+ {
+ if((ueCb->libInfo.asyncCfm[txIdx] != NULLP) &&
+ (ueCb->libInfo.asyncCfm[txIdx]->cfmType == PJ_REEST_ASYNC_CFM))
+ {
+ libInitBitMask = &ueCb->libInfo.asyncCfm[txIdx]->libInitBitMask;
+ break;
+ }
+ }
+ }
+ else if(ueCb->libInfo.state == PJ_STATE_NORMAL)
+ {
+ libInitBitMask = &ueCb->libInfo.tLibInitBitMask;
+ }
+
+ if(libInitBitMask)
+ {
+ (*libInitBitMask) = (*libInitBitMask) | PJ_LIB_CP_CIP_BIT_MASK;
+ }
+ ret = PjLibObdCpInitReq(&gCb->pjGenCfg.obdPst.secPst, ueCb->secInfo.secCxt,
+ ueCb->secInfo.cipherInfo.algoType, ueCb->secInfo.cipherInfo.cpKey);
+#else
+#ifdef INTEL_QAT_DP
+#ifdef QAT_TWO_INSTANCE
+ ret = pjLibCpInitReq(gCb->u.dlCb->instHndl, ueCb->secInfo.secCxt, ueCb->secInfo.cipherInfo.algoType,
+ ueCb->secInfo.cipherInfo.cpKey, &ctxId);
+#else
+ ret = pjLibCpInitReq(gCb, ueCb->secInfo.secCxt, ueCb->secInfo.cipherInfo.algoType,
+ ueCb->secInfo.cipherInfo.cpKey, &ctxId);
+#endif
+ ueCb->secInfo.cpCiphSessCxtId= ctxId;
+#else
+ ret = pjLibCpInitReq(ueCb->secInfo.secCxt, (U8)ueCb->secInfo.cipherInfo.algoType,
+ ueCb->secInfo.cipherInfo.cpKey, &ctxId); /*KW_FIX*/
+ ueCb->secInfo.cpCxtId = ctxId;
+#endif /* INTEL_QAT_DP */
+#endif /* PJ_SEC_ASYNC */
+
+ RETVALUE(ret);
+
+} /* end of pjUtlCpInit */
+
+/**
+ *
+ * @brief
+ *
+ * Handler for opening the context with the Ciphering unit (either
+ * synchronous or asynchronous) for DRBs of an UE.
+ *
+ * @b Description:
+ *
+ * This function opens the context with the security algo unit per UE
+ * for ciphering / deciphering by sending the configured
+ * Ciphering Info with user plane key using synchronous / asynchronous
+ * function calls with relevant input parameters.
+ *
+ * @param[in] pjRbCb Pointer to RB control Block
+ *
+ * @return S16
+ * -# ROK
+ *
+ */
+#ifdef ANSI
+PUBLIC S16 pjUtlDlUpInit
+(
+PjCb *gCb,
+PjDlUeCb *ueCb /* UE CB Ptr */
+)
+#else
+PUBLIC S16 pjUtlDlUpInit(*gCb,*ueCb)
+PjCb *gCb;
+PjDlUeCb *ueCb; /* UE CB Ptr */
+#endif
+{
+
+ Void *ctxId = NULLP;
+#ifdef PJ_SEC_ASYNC
+ U8 txIdx;
+ U32 *libInitBitMask = NULLP;
+#endif
+ S16 ret = ROK;
+
+ TRC3(pjUtlDlUpInit)
+
+ RLOG2(L_DEBUG, "pjUtlUpInit(ueCb(%d,%d))",ueCb->key.ueId, ueCb->key.cellId);
+
+#ifdef PJ_SEC_ASYNC
+
+ if(ueCb->libInfo.state == PJ_STATE_REEST)
+ {
+ for(txIdx = 0; txIdx < PJ_MAX_ASYNC_CFM; txIdx++)
+ {
+ if((ueCb->libInfo.asyncCfm[txIdx] != NULLP) &&
+ (ueCb->libInfo.asyncCfm[txIdx]->cfmType == PJ_REEST_ASYNC_CFM))
+ {
+ libInitBitMask = &ueCb->libInfo.asyncCfm[txIdx]->libInitBitMask;
+ break;
+ }
+ }
+ }
+ else if(ueCb->libInfo.state == PJ_STATE_NORMAL)
+ {
+ libInitBitMask = &ueCb->libInfo.tLibInitBitMask;
+ }
+
+ if(libInitBitMask)
+ (*libInitBitMask) = (*libInitBitMask) | PJ_LIB_UP_CIP_BIT_MASK;
+
+ ret = PjLibObdUpInitReq(&gCb->pjGenCfg.obdPst.secPst, ueCb->secInfo.secCxt,
+ ueCb->secInfo.cipherInfo.algoType, ueCb->secInfo.cipherInfo.upKey);
+#else
+#ifdef INTEL_QAT_DP
+#ifdef QAT_TWO_INSTANCE
+ pjLibUpInitReq(gCb->u.dlCb->instHndl, ueCb->secInfo.secCxt, ueCb->secInfo.cipherInfo.algoType,
+ ueCb->secInfo.cipherInfo.upKey, &ctxId);
+#else
+ pjLibUpInitReq(gCb, ueCb->secInfo.secCxt, ueCb->secInfo.cipherInfo.algoType,
+ ueCb->secInfo.cipherInfo.upKey, &ctxId);
+#endif
+ ueCb->secInfo.upCiphSessCxtId= ctxId;
+#else
+ pjLibUpInitReq(ueCb->secInfo.secCxt, (U8)ueCb->secInfo.cipherInfo.algoType,
+ ueCb->secInfo.cipherInfo.upKey, &ctxId); /*KW_FIX*/
+ ueCb->secInfo.upCxtId = ctxId;
+#endif /* INTEL_QAT_DP */
+#endif /* PJ_SEC_ASYNC */
+ RETVALUE(ret);
+} /* end of pjUtlUpInit */
+
+
+
+/**
+ *
+ * @brief
+ *
+ * Handler for redirecing ciphering request to either synchronous
+ * or asynchronous module.
+ *
+ * @b Description:
+ *
+ * This function sends ciphering protection request as either synchronous or
+ * asynchronous function calls with relevant input parameters.
+ *
+ * @param[in] pjRbCb PDCP RbCb
+ * @param[in] secInp Input parameters for deciphering
+ * @param[in] mBuf Data to be deciphered
+ * @param[in] opSdu Deciphered SDU
+ *
+ * @return S16
+ * -# ROK
+ *
+ */
+//#ifdef TENB_AS_SECURITY
+#ifdef ANSI
+PUBLIC S16 pjUtlCipherReq
+(
+PjCb *gCb,
+PjDlRbCb *pjRbCb, /* PDCP RbCb */
+U32 count, /* Input parameters for deciphering */
+Buffer *mBuf, /* Data to be deciphered */
+Buffer **opSdu /* Deciphered SDU */
+)
+#else
+PUBLIC S16 pjUtlCipherReq(gCb, pjRbCb, count, mBuf, opSdu)
+PjCb *gCb,
+PjDlRbCb *pjRbCb; /* PDCP RbCb */
+U32 count; /* Input parameters for deciphering */
+Buffer *mBuf; /* Data to be deciphered */
+Buffer **opSdu; /* Deciphered SDU */
+#endif
+{
+ S16 ret = ROK;
+ PjDlUeCb *dlUeCb;
+ PjLibTrans libTrans; /* Transaction Id for deciphering */
+
+#if PJ_SEC_ASYNC
+ Void *cxtId; /* Context Identifier */
+#endif
+
+ TRC3(pjUtlCipherReq)
+
+ dlUeCb = pjRbCb->ueCb;
+ libTrans.pdcpInstance = gCb->init.inst;
+ libTrans.count = count;
+
+ libTrans.rbId = pjRbCb->rbId - 1;
+ libTrans.dir = PJ_SEC_DIR_DL;
+ libTrans.rbType = pjRbCb->rbType;
+ libTrans.snLen = pjRbCb->snLen;
+ libTrans.ciphAlgoType = dlUeCb->secInfo.cipherInfo.algoType;
+ libTrans.ueCb = (PTR)dlUeCb;
+ libTrans.ueId = dlUeCb->key.ueId;
+ libTrans.cellId = dlUeCb->key.cellId;
+ if(PJ_SRB == pjRbCb->rbType)
+ {
+ libTrans.key = dlUeCb->secInfo.cipherInfo.cpKey;
+#ifdef INTEL_QAT_DP
+ libTrans.sessCxtId = dlUeCb->secInfo.cpCiphSessCxtId;
+#ifdef QAT_TWO_INSTANCE
+ libTrans.instHndl = gCb->u.dlCb->instHndl;
+#else
+ libTrans.instHndl = gCb->instHndl;
+#endif
+#endif
+ }
+ else
+ {
+ libTrans.key = dlUeCb->secInfo.cipherInfo.upKey;
+#ifdef INTEL_QAT_DP
+ libTrans.sessCxtId = dlUeCb->secInfo.upCiphSessCxtId;
+#ifdef QAT_TWO_INSTANCE
+ libTrans.instHndl = gCb->u.dlCb->instHndl;
+#else
+ libTrans.instHndl = gCb->instHndl;
+#endif
+#endif
+ }
+
+#ifdef PJ_SEC_ASYNC
+ /* Start the timer if it is not started already */
+ if((pjChkTmr(gCb, (PTR)pjRbCb, PJ_EVT_DL_OBD_TMR)) == FALSE)
+ {
+ pjStartTmr(gCb, (PTR)pjRbCb, PJ_EVT_DL_OBD_TMR);
+ }
+
+ if (pjRbCb->rbType == PJ_SRB)
+ {
+ cxtId = pjRbCb->ueCb->secInfo.cpCxtId;
+ }
+ else
+ {
+ cxtId = pjRbCb->ueCb->secInfo.upCxtId;
+ }
+
+ ret = PjLibObdCipherReq(&(gCb->pjGenCfg.obdPst.secPst), cxtId,
+ secInp, libTrans, mBuf);
+
+#else
+#ifdef INTEL_SW_SEC
+ ret = PjLibObdSwCipherReq(&libTrans, mBuf, gCb,opSdu);
+#else
+ ret = PjLibObdCipherReq(&libTrans, mBuf, opSdu);
+#endif /* INTEL_SW_SEC */
+#endif
+
+ RETVALUE(ret);
+
+}
+
+
+#ifdef FLAT_BUFFER_OPT
+/**
+ *
+ * @brief
+ *
+ * Handler for redirecing ciphering request to either synchronous
+ * or asynchronous module.
+ *
+ * @b Description:
+ *
+ * This function sends ciphering protection request as either synchronous or
+ * asynchronous function calls with relevant input parameters.
+ *
+ * @param[in] pjRbCb PDCP RbCb
+ * @param[in] secInp Input parameters for deciphering
+ * @param[in] mBuf Flat Buffer to be deciphered
+ * @param[in] opSdu Deciphered SDU
+ *
+ * @return S16
+ * -# ROK
+ *
+ */
+
+#ifdef ANSI
+PUBLIC S16 pjUtlCipherReqFB
+(
+PjCb *gCb,
+PjDlRbCb *pjRbCb, /* PDCP RbCb */
+U32 count, /* Input parameters for deciphering */
+FlatBuffer *mBuf, /* Data to be deciphered */
+Buffer **opSdu /* Deciphered SDU */
+)
+#else
+PUBLIC S16 pjUtlCipherReqFB(gCb, pjRbCb, count, mBuf, opSdu)
+PjCb *gCb,
+PjDlRbCb *pjRbCb; /* PDCP RbCb */
+U32 count; /* Input parameters for deciphering */
+FlatBuffer *mBuf; /* Data to be deciphered */
+Buffer **opSdu; /* Deciphered SDU */
+#endif
+{
+ S16 ret = ROK;
+#ifdef PJ_SEC_ASYNC
+ Void *cxtId; /* Context Identifier */
+#endif
+ PjDlUeCb *dlUeCb;
+ PjLibTrans libTrans;
+
+ TRC3(pjUtlCipherReqFB)
+
+#ifdef PJ_SEC_ASYNC
+ cxtId = pjRbCb->ueCb->secInfo.upCxtId;
+#endif
+
+ dlUeCb = pjRbCb->ueCb;
+ libTrans.pdcpInstance = gCb->init.inst;
+ libTrans.count = count;
+
+ libTrans.rbId = pjRbCb->rbId - 1;
+ libTrans.dir = PJ_SEC_DIR_DL;
+ libTrans.rbType = pjRbCb->rbType;
+ libTrans.snLen = pjRbCb->snLen;
+ libTrans.ciphAlgoType = dlUeCb->secInfo.cipherInfo.algoType;
+ libTrans.ueCb = (PTR)dlUeCb;
+ libTrans.ueId = dlUeCb->key.ueId;
+ libTrans.cellId = dlUeCb->key.cellId;
+ if(PJ_SRB == pjRbCb->rbType)
+ {
+ libTrans.key = dlUeCb->secInfo.cipherInfo.cpKey;
+#ifdef INTEL_QAT_DP
+ libTrans.sessCxtId = dlUeCb->secInfo.cpCiphSessCxtId;
+#ifdef QAT_TWO_INSTANCE
+ libTrans.instHndl = gCb->u.dlCb->instHndl;
+#else
+ libTrans.instHndl = gCb->instHndl;
+#endif
+#endif
+ }
+ else
+ {
+ libTrans.key = dlUeCb->secInfo.cipherInfo.upKey;
+#ifdef INTEL_QAT_DP
+ libTrans.sessCxtId = dlUeCb->secInfo.upCiphSessCxtId;
+#ifdef QAT_TWO_INSTANCE
+ libTrans.instHndl = gCb->u.dlCb->instHndl;
+#else
+ libTrans.instHndl = gCb->instHndl;
+#endif
+#endif
+ }
+
+#ifdef PJ_SEC_ASYNC
+ /* Start the timer if it is not started already */
+ if((pjChkTmr(gCb, (PTR)pjRbCb, PJ_EVT_DL_OBD_TMR)) == FALSE)
+ {
+ pjStartTmr(gCb, (PTR)pjRbCb, PJ_EVT_DL_OBD_TMR);
+ }
+
+ ret = PjLibObdCipherReq(&(gCb->pjGenCfg.obdPst.secPst), cxtId,
+ secInp, libTrans, mBuf);
+
+#else
+#ifndef INTEL_SW_SEC
+ ret = PjLibObdCipherReqFB(&libTrans, mBuf, opSdu);
+#else
+ ret = pjSendToSwCipherFB(&libTrans, mBuf,gCb,opSdu);
+#endif
+#endif
+
+ RETVALUE(ret);
+
+}
+#endif
+
+
+/**
+ *
+ * @brief
+ *
+ * Handler for redirecing Integration request to either synchronous
+ * or asynchronous module.
+ *
+ * @b Description:
+ *
+ * This function sends Intergrity protection request as either synchronous or
+ * asynchronous function calls with relevant input parameters.
+ *
+ * @param[in] pjRbCb PDCP RbCb
+ * @param[in] secInp Input parameters for integrity
+ * @param[in] mBuf SDU to be compressed
+ * @param[out] macI Message authentication code for the SDU
+ *
+ * @return S16
+ * -# ROK
+ *
+ */
+#ifdef ANSI
+PUBLIC S16 pjUtlIntProtReq
+(
+PjCb *gCb,
+PjDlRbCb *pjRbCb, /* PDCP RbCb */
+PjSecInp secInp, /* Input parameters for integrity */
+Buffer **mBuf /* SDU to be compressed */
+)
+#else
+PUBLIC S16 pjUtlIntProtReq(gCb, pjRbCb, secInp, mBuf)
+PjCb *gCb;
+PjDlRbCb *pjRbCb; /* PDCP RbCb */
+PjSecInp secInp; /* Input parameters for integrity */
+Buffer **mBuf; /* SDU to be compressed */
+#endif
+{
+ S16 ret = ROK;
+ PjDlUeCb *dlUeCb;
+ PjLibTrans libTrans;
+#if PJ_SEC_ASYNC
+ Void *cxtId; /* Context Identifier */
+#endif
+
+ TRC3(pjUtlIntProtReq)
+
+#if PJ_SEC_ASYNC
+ cxtId = pjRbCb->ueCb->secInfo.intCxtId;
+#endif
+
+ dlUeCb = pjRbCb->ueCb;
+ libTrans.pdcpInstance = gCb->init.inst;
+ libTrans.count = secInp.count;
+ libTrans.rbId = pjRbCb->rbId - 1;
+ libTrans.dir = secInp.dir;
+ libTrans.rbType = pjRbCb->rbType;
+ /*pSecInfo.snLen = pjRbCb->snLen;*/
+ libTrans.intAlgoType = dlUeCb->secInfo.intInfo.algoType;
+ libTrans.ueCb = (PTR)dlUeCb;
+ libTrans.ueId = dlUeCb->key.ueId;
+ libTrans.cellId = dlUeCb->key.cellId;
+ libTrans.key = &(dlUeCb->secInfo.intInfo.intKey[0]);
+ PJ_SEC_FILL_FRESH(libTrans.fresh, libTrans.rbId);
+
+#ifdef INTEL_QAT_DP
+ libTrans.sessCxtId = dlUeCb->secInfo.cpIntSessCxtId;
+#ifdef QAT_TWO_INSTNACES
+ libTrans.instHndl = gCb->u.dlCb->instHndl;
+#else
+ libTrans.instHndl = gCb->instHndl;
+#endif
+#endif
+
+#ifdef PJ_SEC_ASYNC
+ /* Start the timer if it is not started already */
+ if((pjChkTmr(gCb, (PTR)pjRbCb, PJ_EVT_DL_OBD_TMR)) == FALSE)
+ {
+ pjStartTmr(gCb, (PTR)pjRbCb, PJ_EVT_DL_OBD_TMR);
+ }
+
+ ret = PjLibObdIntProtReq(&(gCb->pjGenCfg.obdPst.secPst), cxtId,
+ secInp, libTrans, mBuf);
+
+#else
+#ifdef INTEL_SW_INTEG
+ ret = PjLibObdIntProtReq(gCb, &libTrans, mBuf);
+#else
+ ret = PjLibObdIntProtReq(&libTrans, mBuf);
+#endif /* INTEL_SW_INTEG */
+#endif
+
+ RETVALUE(ret);
+
+} /* end of pjUtlIntProtReq */
+
+//#endif
+
+
+/**
+ *
+ * @brief
+ *
+ * Handler for closing the DL context with the Ciphering unit (either
+ * synchronous or asynchronous) for SRBs of an UE.
+ *
+ * @b Description:
+ *
+ * This function closes an existing DL context with the security algo unit per UE
+ * for ciphering / deciphering with control plane key using synchronous / asynchronous
+ * function calls with relevant input parameters.
+ *
+ *
+ * @param[in] cpCxtId Context Id for Ciphering to be closed
+ *
+ * @return S16
+ * -# ROK
+ *
+ */
+#ifdef ANSI
+PUBLIC S16 pjUtlDlCipherClose
+(
+PjCb *gCb,
+Void *cpCxtId /* Context Id for Ciphering to be closed */
+)
+#else
+PUBLIC S16 pjUtlDlCipherClose(gCb, cpCxtId)
+PjCb *gCb;
+Void *cpCxtId; /* Context Id for Ciphering to be closed */
+#endif
+{
+#ifdef INTEL_QAT_DP
+ S16 ret;
+#endif
+ TRC3(pjUtlDlCipherClose)
+
+ RLOG0(L_DEBUG, "pjUtlDlCipherClose");
+
+#ifndef PJ_SEC_ASYNC
+#ifdef INTEL_QAT_DP
+#ifdef QAT_TWO_INSTANCE
+ ret = PjLibObdCipherCloseReq(gCb->u.dlCb->instHndl, cpCxtId);
+#else
+ ret = PjLibObdCipherCloseReq(gCb->instHndl, cpCxtId);
+#endif
+#else
+ PjLibObdCipherCloseReq(cpCxtId);
+#endif
+#else
+#ifdef INTEL_QAT_DP
+#ifdef QAT_TWO_INSTANCE
+ ret = PjLibObdCipherCloseReq(gCb->u.dlCb->instHndl, cpCxtId);
+#else
+ ret = PjLibObdCipherCloseReq(gCb->instHndl, cpCxtId);
+#endif
+#else
+ PjLibObdCipherCloseReq(&gCb->pjGenCfg.obdPst.secPst, cpCxtId);
+#endif
+#endif
+
+#ifdef INTEL_QAT_DP
+ RETVALUE(ret);
+#else
+ RETVALUE(ROK);
+#endif
+
+} /* end of pjUtlCipherClose */
+
+
+/**
+ *
+ * @brief
+ *
+ * Handler for closing the DL context with the Integration unit (either
+ * synchronous or asynchronous) for all RBs of an UE.
+ *
+ * @b Description:
+ *
+ * This function closes an existing DL context with the security algo unit per UE
+ * for Integration protection/verification using synchronous / asynchronous function
+ * calls with relevant input parameters.
+ *
+ *
+ * @param[in] intCxtId Integration CxtId to be closed
+ *
+ * @return S16
+ * -# ROK
+ *
+ */
+#ifdef ANSI
+PUBLIC S16 pjUtlDlIntClose
+(
+PjCb *gCb,
+Void *intCxtId /* Integration CxtId to be closed */
+)
+#else
+PUBLIC S16 pjUtlDlIntClose(gCb, intCxtId)
+PjCb *gCb;
+Void *intCxtId; /* Integration CxtId to be closed */
+#endif
+{
+#ifdef INTEL_QAT_DP
+ S16 ret = ROK;
+#endif
+ TRC3(pjUtlDlIntClose)
+
+ RLOG0(L_DEBUG, "pjUtlDlIntClose");
+
+#ifdef PJ_SEC_ASYNC
+ PjLibObdIntCloseReq(&gCb->pjGenCfg.obdPst.secPst,intCxtId);
+#else
+#ifdef INTEL_QAT_DP
+#ifdef QAT_TWO_INSTANCE
+ ret = PjLibObdIntCloseReq(gCb->u.dlCb->instHndl,intCxtId);
+#else
+ ret = PjLibObdIntCloseReq(gCb->instHndl,intCxtId);
+#endif
+#else
+ PjLibObdIntCloseReq(intCxtId);
+#endif /* INTEL_QAT_DP */
+#endif /* PJ_SEC_ASYNC */
+
+#ifdef INTEL_QAT_DP
+ RETVALUE(ret);
+#else
+ RETVALUE(ROK);
+#endif
+
+} /* end of pjUtlIntClose */
+
+
+/**
+ *
+ * @brief
+ *
+ * Handler for resetting the context with the compression unit (either
+ * synchronous or asynchronous) for RB within an UE.
+ *
+ * @b Description:
+ *
+ * This function resets the context with the compression unit per RB per
+ * UE by using synchronous / asynchronous function calls.
+ *
+ *
+ * @param[in] cmpCxtId Context to be reset for compression
+ *
+ * @return S16
+ * -# ROK
+ *
+ */
+#ifdef ANSI
+PUBLIC S16 pjUtlDlCmpReset
+(
+PjCb *gCb,
+PjDlRbCb *pjRbCb /* Context to be reset for compression */
+)
+#else
+PUBLIC S16 pjUtlDlCmpReset(pjRbCb)
+PjCb *gCb;
+PjDlRbCb *pjRbCb; /* Context to be reset for compression */
+#endif
+{
+ TRC3(pjUtlDlCmpReset)
+
+ RLOG2(L_DEBUG, "pjUtlCmpReset(pjRbCb(%d,%d))",pjRbCb->rbId, pjRbCb->rbType);
+
+#ifdef PJ_CMP_ASYNC
+ PjLibObdCmpResetReq(&gCb->pjGenCfg.obdPst.cmpPst, pjRbCb->cmpCxtId);
+#else
+ pjLibCmpResetReq(pjRbCb->cmpCxtId);
+#endif
+
+ RETVALUE(ROK);
+
+} /* end of pjUtlCmpReset */
+
+
+/**
+ *
+ * @brief
+ * Handle re-establishment on SRB1.
+ *
+ * @b Description:
+ * This function
+ * 1. Marks the state of the RBs as PJ_STATE_REEST.
+ * 2. Calculates the number of RBs undergoing reestablishment.
+ *
+ * @param[in] gCb PDCP Instance control block
+ * @param[in] pjRbCb Downlink Rb control block
+ *
+ * @return S16
+ * -# ROK
+ * -# RFAILED
+ *
+ */
+#ifdef ANSI
+PUBLIC S16 pjUtlDlReEstSrb1
+(
+PjCb *gCb,
+PjDlRbCb *pjRbCb /* PDCP Control Block Pointer */
+)
+#else
+PUBLIC S16 pjUtlDlReEstSrb1(gCb, pjRbCb)
+PjCb *gCb;
+PjDlRbCb *pjRbCb; /* PDCP Control Block Pointer */
+#endif
+{
+ PjDlUeCb *ueCb;
+
+ TRC2(pjUtlDlReEstSrb1)
+
+ RLOG2(L_DEBUG, "pjUtlReEstSrb1(pjRbCb(%d,%d))",pjRbCb->rbId, pjRbCb->rbType);
+
+ ueCb = pjRbCb->ueCb;
+
+ ueCb->libInfo.state = PJ_STATE_REEST;
+
+ /* SRB Reconfiguration we can update the control Plane keys and
+ the Integrity Keys in the OBD module */
+
+ pjUtlDlUpdCpSecKeys(gCb,ueCb);
+
+ /* Perform downlink reestablishment of SRB1 */
+ pjDlmReEstSrb(gCb,pjRbCb);
+
+ /* If Only SRB1 configured then we can update userplane
+ keys also */
+ if ((ueCb->numSrbs == 1) && (ueCb->numDrbs == 0))
+ {
+ pjUtlDlUpdUpSecKeys(gCb,ueCb);
+ }
+
+ RETVALUE(ROK);
+} /* pjUtlReEstSrb1 */
+
+\f
+/**
+ *
+ * @brief
+ *
+ * Handler to start reestablishment processing
+ *
+ * @b Description:
+ *
+ * This function
+ * 1. Marks the state of the RBs as PJ_STATE_REEST_HO.
+ * 2. Calculates the number of RBs undergoing reestablishment.
+ *
+ * @param[in] ueCb Number of RBs undergoing reestablishment
+ *
+ * @return S16
+ * -# ROK
+ * -# RFAILED
+ *
+ */
+#ifdef ANSI
+PUBLIC S16 pjUtlDlReEstHO
+(
+PjCb *gCb,
+PjDlUeCb *ueCb /* Number of RBs undergoing reestablishment*/
+)
+#else
+PUBLIC S16 pjUtlDlReEstHO(gCb,ueCb)
+PjCb *gCb;
+PjDlUeCb *ueCb; /* Number of RBs undergoing reestablishment*/
+#endif
+{
+ U8 rbCnt;
+ PjDlRbCb **rbCbLst;
+ PjDlRbCb * pjRbCb;
+
+ TRC2 (pjUtlDlReEstHO);
+
+#ifdef ALIGN_64BIT
+ RLOG2(L_DEBUG, "pjUtlReEstHO(ueCb(%d,%d))",ueCb->key.ueId, ueCb->key.cellId);
+#else
+ RLOG2(L_DEBUG, "pjUtlReEstHO(ueCb(%d,%d))",ueCb->key.ueId, ueCb->key.cellId);
+#endif
+
+ /* Initialisations */
+ ueCb->libInfo.numReEstDrb = 0;
+ ueCb->libInfo.state = PJ_STATE_REEST_HO;
+
+ /* Perform initialisations on the HO Info structure */
+ PJ_ALLOC(gCb,ueCb->hoInfo, sizeof(PjDlHoInfo));
+#if (ERRCLASS & ERRCLS_ADD_RES)
+ if (ueCb->hoInfo == NULLP)
+ {
+ RLOG0(L_FATAL, "Memory Allocation failed.");
+ RETVALUE(RFAILED);
+ }
+#endif /* ERRCLASS & ERRCLS_ADD_RES */
+
+ PJ_ALLOC(gCb,ueCb->hoInfo->hoCfmInfo, sizeof(PjDlHoCfmInfo) * PJ_MAX_DRB_PER_UE );
+#if (ERRCLASS & ERRCLS_ADD_RES)
+ if (ueCb->hoInfo->hoCfmInfo == NULLP )
+ {
+ /*ccpu00136858 */
+ PJ_PST_FREE(gCb->u.dlCb->udxDlSap[0].pst.region,
+ gCb->u.dlCb->udxDlSap[0].pst.pool,
+ ueCb->hoInfo, sizeof(PjDlHoInfo));
+ RLOG0(L_FATAL, "Memory Allocation failed.");
+ RETVALUE(RFAILED);
+ }
+#endif /* ERRCLASS & ERRCLS_ADD_RES */
+
+ /* Initialise the reestablishment states for the RBs */
+ rbCbLst = ueCb->drbCb;
+ for(rbCnt = 0; rbCnt < PJ_MAX_DRB_PER_UE; rbCnt ++)
+ {
+ /* Check of rbCb available */
+ if( (pjRbCb = rbCbLst[rbCnt]) == NULLP)
+ {
+ continue;
+ }
+
+ /* Fetch the rbCb and intialise the states */
+ pjRbCb->state = PJ_STATE_REEST_HO;
+
+ if(pjRbCb->mode == PJ_DRB_AM)
+ {
+ pjDlmReEstHoDrbAm(gCb, pjRbCb);
+ }
+
+ }/* for(rbCnt .. */
+
+ RETVALUE(ROK);
+} /* pjUtlReEstHO */
+
+
+/**
+ *
+ * @brief
+ *
+ * Called after the new security algorithms have been applied
+ * and header compression/decompression reset. It starts
+ * reestablishment procedures for downlink DRBs.
+ *
+ * @b Description:
+ *
+ * This function
+ * 1. Creates new contexts for Ciphering and Integrity.
+ * 2. Closes the old contexts for Ciphering and Integrity.
+ * 3. Resets the ROHC unit.
+ *
+ * @param[in] ueCb UE Control Block
+ *
+ * @return S16
+ * -# ROK
+ * -# RFAILED
+ *
+ */
+#ifdef ANSI
+PUBLIC S16 pjUtlReEstDl
+(
+PjCb *gCb,
+PjDlUeCb *ueCb /* UE Control Block */
+)
+#else
+PUBLIC S16 pjUtlReEstDl(gCb, ueCb)
+PjCb *gCb;
+PjDlUeCb *ueCb; /* UE Control Block */
+#endif
+{
+ TRC2(pjUtlReEstDl);
+
+ RLOG2(L_DEBUG, "pjUtlReEstDl(ueCb(%d,%d))",ueCb->key.ueId, ueCb->key.cellId);
+
+
+ /* Send Cfms and update the state only
+ when there is some cfgreq cfm is present for other RBs*/
+ if(ueCb->libInfo.state == PJ_STATE_REEST)
+ {
+ pjUtlDlSndReEstCfgCfm(gCb, ueCb);
+ }
+ else if(ueCb->libInfo.state == PJ_STATE_REEST_HO)
+ {
+ pjUtlDlSndSduStaCfm(gCb, ueCb);
+ }
+ ueCb->libInfo.state = PJ_STATE_NORMAL;
+
+ RETVALUE(ROK);
+
+} /* pjUtlReEstDl */
+
+
+
+\f
+/**
+ *
+ * @brief
+ *
+ * Function to sent the REESTABLISHMENT COMPPLETE
+ * to the RRC.
+ *
+ * @b Description:
+ *
+ * This function
+ * 1. Sends a ReEstablishment Confirm for normal reestablishment.
+ * 2. Sends a SDU status confirm for handover reestablishment.
+ *
+ * @param[in] ueCb UE Control Block
+ *
+ * @return S16
+ * -# ROK
+ * -# RFAILED
+ *
+ */
+#ifdef ANSI
+PUBLIC S16 pjUtlDlSndReEstCfgCfm
+(
+PjCb *gCb,
+PjDlUeCb *ueCb /* UE Control Block */
+)
+#else
+PUBLIC S16 pjUtlDlSndReEstCfgCfm(ueCb)
+PjCb *gCb;
+PjDlUeCb *ueCb; /* UE Control Block */
+#endif
+{
+ U8 rbCnt;
+ PjDlRbCb *tRbCb;
+ CpjCfgCfmInfo *cfgCfmInfo;
+ U8 txIdx;
+ PjAsyncCfm *asyncCfm = NULLP;
+ PjUdxDlSapCb *udxSap;
+ S16 ret = ROK;
+
+ TRC2(pjUtlDlSndReEstCfgCfm);
+
+ RLOG2(L_DEBUG, "pjUtlSndReEstCfgCfm(ueCb(%d,%d))",ueCb->key.ueId, ueCb->key.cellId);
+
+ ueCb->libInfo.state = PJ_STATE_NORMAL;
+
+ /* Pick up the confirm info */
+ for(txIdx = 0; txIdx < PJ_MAX_ASYNC_CFM; txIdx++)
+ {
+ if((ueCb->libInfo.asyncCfm[txIdx] != NULLP) &&
+ (ueCb->libInfo.asyncCfm[txIdx]->cfmType & PJ_CFG_REEST_ASYNC_CFM))
+ {
+ asyncCfm = ueCb->libInfo.asyncCfm[txIdx];
+ break;
+ }
+ }
+
+ /* its a reestablishment with only srb1 configured */
+ if(asyncCfm == NULLP)
+ {
+ RETVALUE(ROK);
+ }
+
+ for(rbCnt = 0; rbCnt < PJ_MAX_SRB_PER_UE; rbCnt ++)
+ {
+ if( ((tRbCb = ueCb->srbCb[rbCnt]) == NULLP) ||
+ (tRbCb->state == PJ_STATE_NORMAL))
+ {
+ continue;
+ }
+
+ /* Fetch the rbCb and intialise the states */
+ tRbCb->state = PJ_STATE_NORMAL;
+ }
+
+ /* Memory leak fix ccpu00135359 */
+ udxSap = &(gCb->u.dlCb->udxDlSap[0]);
+ PJ_ALLOC_BUF_SHRABL(udxSap->pst, cfgCfmInfo,
+ sizeof (CpjCfgCfmInfo), ret);
+ if(ret != ROK)
+ {
+ RLOG0(L_FATAL, "Memory Allocation failed.");
+ RETVALUE(RFAILED);
+ }
+
+ PJ_FILL_REEST_CFG_CFM_INFO(cfgCfmInfo, asyncCfm);
+ PJ_CLEAN_AND_UPD_ASYNCINFO(gCb,ueCb, txIdx);
+
+ PjDlUdxCfgCfm(&gCb->u.dlCb->udxDlSap[0].pst,
+ gCb->u.dlCb->udxDlSap[0].suId,
+ (UdxCfgCfmInfo *)cfgCfmInfo);
+
+ RETVALUE(ROK);
+} /* pjUtlSndReEstCfgCfm */
+
+
+/**
+ *
+ * @brief Handler to store the confirms while we wait for the init
+ * confirms from the off-board.
+ *
+ *
+ * @b Description
+ * This function is invoked during security config request,
+ * reestablishment request and config request if the libraries
+ * are off-boarded. This stores the entries in a confirm list
+ * while waiting for the confirm from the offboard.
+ *
+ * @return S16
+ * -# ROK
+ * -# RFAILED
+ *
+*/
+
+#ifdef ANSI
+PUBLIC S16 pjUtlDlSaveCfmInfo
+(
+PjCb *gCb,
+PjDlUeCb *ueCb, /* Pointer to UeCb */
+U8 cfmType, /* Confirm type */
+Bool startTmr, /* Start Timer */
+U8 entity, /* Confirm type */
+PTR cfmPtr, /* Pointer to the structure for confirm */
+PTR cfgPtr /* Pointer to the structure for request */
+)
+#else
+PUBLIC S16 pjUtlDlSaveCfmInfo(ueCb, cfmType, startTmr, entity, cfmPtr, cfgPtr)
+PjCb *gCb;
+PjDlUeCb *ueCb; /* Pointer to UeCb */
+U8 cfmType; /* Confirm type */
+Bool startTmr; /* Start Timer */
+U8 entity; /* Confirm type */
+PTR cfmPtr; /* Pointer to the structure for confirm */
+PTR cfgPtr; /* Pointer to the structure for request */
+#endif
+{
+ S16 ret; /* Return value */
+ CpjSecCfgCfmInfo *secCfm; /* Security confirm */
+ CpjReEstCfmInfo *reEstCfm; /* Reestablishment confirm */
+ CpjCfgCfmInfo *cfgCfm; /* Config confirm */
+ U16 txId; /* Transaction Id */
+ PjAsyncCfm *tAsyncCfm; /* Pointer to the async Cfm*/
+ CpjCfgReqInfo *cfgReq; /* Pointer to the config request */
+ U8 cfmIdx; /* index for loopoing */
+
+
+ TRC3(pjUtlDlSaveCfmInfo)
+
+ RLOG_ARG4(L_DEBUG,DBG_UEID,ueCb->key.ueId,
+ "pjUtlSaveCfmInfo cellId(%d),cfmType(%d),startTmr(%d),entity(%d))",
+ ueCb->key.cellId, cfmType, startTmr, entity);
+
+ /* Initialisations */
+ ret = ROK;
+ secCfm = NULLP;
+ reEstCfm = NULLP;
+ cfgCfm = NULLP;
+ cfgReq = NULLP;
+ txId = ueCb->libInfo.nxtAvlbTxId;
+
+ if(txId == PJ_MAX_ASYNC_CFM)
+ {
+ /* The entire list is full, have to return negative confirms */
+ RETVALUE(RFAILED);
+ }
+
+ /* is entry already present */
+ if(ueCb->libInfo.asyncCfm[txId] != NULLP)
+ {
+ RETVALUE(RFAILED);
+ }
+
+ /* Allocate the structure */
+ PJ_ALLOC(gCb,ueCb->libInfo.asyncCfm[txId], sizeof(PjAsyncCfm));
+ if(ueCb->libInfo.asyncCfm[txId]== NULLP)
+ {
+ RLOG0(L_FATAL, "Memory Allocation failed.");
+ RETVALUE(RFAILED);
+ }
+
+ /* Initialise the structure */
+ tAsyncCfm = ueCb->libInfo.asyncCfm[txId];
+ tAsyncCfm->libInitBitMask = ueCb->libInfo.tLibInitBitMask;
+ tAsyncCfm->cmpInitBitMask = ueCb->libInfo.tCmpInitBitMask;
+ tAsyncCfm->entity = entity;
+ tAsyncCfm->startTmr = startTmr;
+
+ ueCb->libInfo.tLibInitBitMask = 0;
+ ueCb->libInfo.tCmpInitBitMask = 0;
+
+ /* Assign the values */
+ if(cfmType == PJ_SEC_ASYNC_CFM)
+ {
+ secCfm = (CpjSecCfgCfmInfo *)cfmPtr;
+ tAsyncCfm->cfmType = cfmType;
+ tAsyncCfm->ueId = secCfm->ueId;
+ tAsyncCfm->cellId = secCfm->cellId;
+ tAsyncCfm->transId = secCfm->transId;
+ }
+ else if(cfmType == PJ_REEST_ASYNC_CFM)
+ {
+ reEstCfm = (CpjReEstCfmInfo *)cfmPtr;
+ tAsyncCfm->cfmType = cfmType;
+ tAsyncCfm->ueId = reEstCfm->ueId;
+ tAsyncCfm->cellId = reEstCfm->cellId;
+ tAsyncCfm->transId = reEstCfm->transId;
+ }
+ else if((cfmType & PJ_CFG_ASYNC_CFM) ||
+ (cfmType & PJ_CFG_REEST_ASYNC_CFM)||
+ (cfmType & PJ_CFG_UEDEL_ASYNC_CFM))
+ {
+ if(entity == ENTPJ)
+ {
+ cfgCfm = (CpjCfgCfmInfo *)cfmPtr;
+ cfgReq = (CpjCfgReqInfo *)cfgPtr;
+
+ tAsyncCfm->cfmType = cfmType;
+ tAsyncCfm->ueId = cfgCfm->ueId;
+ tAsyncCfm->cellId = cfgCfm->cellId;
+ tAsyncCfm->transId = cfgCfm->transId;
+ tAsyncCfm->numEnt = cfgReq->numEnt;
+
+ for ( cfmIdx = 0; cfmIdx < cfgReq->numEnt; cfmIdx++ )
+ {
+ tAsyncCfm->cfmEnt[cfmIdx].status = cfgCfm->cfmEnt[cfmIdx].status;
+ tAsyncCfm->cfmEnt[cfmIdx].reason = cfgCfm->cfmEnt[cfmIdx].reason;
+ tAsyncCfm->cfmEnt[cfmIdx].rbId = cfgCfm->cfmEnt[cfmIdx].rbId;
+ tAsyncCfm->cfmEnt[cfmIdx].rbType = cfgCfm->cfmEnt[cfmIdx].rbType;
+ tAsyncCfm->cfmEnt[cfmIdx].cfgType = cfgReq->cfgEnt[cfmIdx].cfgType;
+ }
+ }
+ else if(entity == ENTPJ)
+ {
+ CpjCfgCfmInfo *pjCfgCfm; /* Configuraiton Confirm */
+
+ pjCfgCfm = (CpjCfgCfmInfo *)cfmPtr;
+
+ tAsyncCfm->cfmType = cfmType;
+ tAsyncCfm->transId = pjCfgCfm->transId;
+ tAsyncCfm->ueId = pjCfgCfm->ueId;
+ tAsyncCfm->cellId = pjCfgCfm->cellId;
+ tAsyncCfm->numEnt = pjCfgCfm->numEnt;
+
+ for ( cfmIdx = 0; cfmIdx < pjCfgCfm->numEnt; cfmIdx++ )
+ {
+ tAsyncCfm->cfmEnt[cfmIdx].status =
+ pjCfgCfm->cfmEnt[cfmIdx].status;
+ tAsyncCfm->cfmEnt[cfmIdx].reason =
+ pjCfgCfm->cfmEnt[cfmIdx].reason;
+ tAsyncCfm->cfmEnt[cfmIdx].rbId =
+ pjCfgCfm->cfmEnt[cfmIdx].rbId;
+ tAsyncCfm->cfmEnt[cfmIdx].rbType =
+ pjCfgCfm->cfmEnt[cfmIdx].rbType;
+ }
+ }
+ }
+
+ /* Start timer */
+ /* Timer should not be started when SEC is SYNC for ReEst Req
+ * and for the subsequent config req for REEST. The config req
+ * after reest req can still start the timer in the case comp being
+ * async and sec being sync if it also adds a RB and a compInit has
+ * to be sent .
+ * */
+
+ if(tAsyncCfm->startTmr == TRUE)
+ {
+ if((pjChkTmr(gCb,(PTR)ueCb, PJ_EVT_OBD_WAIT_TMR)) == FALSE)
+ {
+ pjStartTmr(gCb,(PTR)ueCb, PJ_EVT_OBD_WAIT_TMR);
+ ueCb->libInfo.crntTmrTxId = ueCb->libInfo.nxtAvlbTxId;
+ }
+ }
+
+ /* update nxtAvlbTxId to the next empty slot */
+ for(cfmIdx = 0; cfmIdx < PJ_MAX_ASYNC_CFM; cfmIdx++)
+ {
+ ueCb->libInfo.nxtAvlbTxId =
+ (U16)((ueCb->libInfo.nxtAvlbTxId + 1) % PJ_MAX_ASYNC_CFM); /*KW_FIX*/
+
+ if(ueCb->libInfo.asyncCfm[ueCb->libInfo.nxtAvlbTxId] == NULLP)
+ {
+ break;
+ }
+ }
+
+ /* Cant find an empty slot ? */
+ if(cfmIdx == PJ_MAX_ASYNC_CFM)
+ {
+ ueCb->libInfo.nxtAvlbTxId = PJ_MAX_ASYNC_CFM;
+ }
+
+ RETVALUE(ret);
+}/* pjUtlSaveCfmInfo */
+\f
+/**
+ *
+ * @brief Handler to store update the bitmaks and send confirms if necessary.
+ *
+ *
+ * @b Description
+ * This function is invoked when receiving a InitCfm from Offboard.
+ * It updates the bit masks and checks if it is necesary to send a
+ * confirm.
+ *
+ * @return S16
+ * -# ROK
+ * -# RFAILED
+ *
+*/
+
+#ifdef ANSI
+PUBLIC S16 pjUtlDlHdlObdInitCfm
+(
+PjCb *gCb,
+PjDlUeCb *ueCb, /* Pointer to UeCb */
+U16 txIdx, /* Transaction Index for UeCb */
+U8 cfmType, /* Confirm type */
+U8 maskVal /* mask value */
+)
+#else
+PUBLIC S16 pjUtlDlHdlObdInitCfm(ueCb, txIdx, cfmType, maskVal)
+PjCb *gCb;
+PjDlUeCb *ueCb; /* Pointer to UeCb */
+U16 txIdx; /* Transaction Index for UeCb */
+U8 cfmType; /* Confirm type */
+U8 maskVal; /* mask value */
+#endif
+{
+ UdxSecCfgCfmInfo *secCfgCfm; /* Security config confirm */
+ UdxReEstCfmInfo *reEstCfm; /* Reest config confirm */
+ PjAsyncCfm *asyncCfm;
+ UdxCfgCfmInfo *cfgCfm;
+ U8 idx;
+ S16 ret;
+
+ TRC3(pjUtlDlHdlObdInitCfm)
+
+ RLOG_ARG4(L_DEBUG,DBG_UEID,ueCb->key.ueId,
+ "pjUtlHdlDlObdInitCfm cellId(%d), txIdx(%d), cfmType(%d), maskVal(%d))",
+ ueCb->key.cellId, txIdx, cfmType, maskVal);
+
+ /* Initialisations */
+ secCfgCfm = NULLP;
+ reEstCfm = NULLP;
+ cfgCfm = NULLP;
+ asyncCfm = NULLP;
+ ret = ROK;
+
+ if((txIdx == PJ_MAX_ASYNC_CFM) ||
+ (ueCb->libInfo.asyncCfm[txIdx] == NULLP))
+ {
+ RETVALUE(RFAILED);
+ }
+
+ asyncCfm = ueCb->libInfo.asyncCfm[txIdx];
+
+ if(cfmType & PJ_SEC_INIT_CFM)
+ {
+ /* Update bit mask and check if all confirms have been received */
+ asyncCfm->libInitBitMask ^= (maskVal);
+ ret = pjUtlDlHdlSecInitCfm(gCb,ueCb,txIdx,asyncCfm,secCfgCfm,reEstCfm);
+ }
+ else if(cfmType & PJ_CMP_INIT_CFM)
+ {
+ /* Check if all confirms have been received */
+ asyncCfm->cmpInitBitMask &= ~(1 << (maskVal - 1));
+
+ /* Update the status and reason for the received CmpInitCfm */
+ for ( idx = 0; idx < asyncCfm->numEnt; idx++ )
+ {
+ if ( asyncCfm->cfmEnt[idx].rbId == maskVal)
+ {
+ asyncCfm->cfmEnt[idx].status = CPJ_CFG_CFM_OK;
+ asyncCfm->cfmEnt[idx].reason = CPJ_CFG_REAS_NONE;
+ break;
+ }
+ }
+
+ /* Check if we can send confirm */
+ if(asyncCfm->cmpInitBitMask == 0)
+ {
+ ret = pjUtlDlHdlCmpInitCfm(gCb,ueCb,txIdx,asyncCfm,cfgCfm);
+ }
+ }
+ RETVALUE(ret);
+}/* pjUtlHdlDlObdInitCfm */
+\f
+/**
+ *
+ * @brief Handler for init off-board timer expiry.
+ *
+ *
+ * @b Description
+ * This function is called when the off-board timer expires for
+ * a Init Req of a channel (either for ciphering/integrity/compression).
+ * This function sends a confirm with failure for SecCfgReq if the
+ * state of the RB is normal. It sends a confirm with failure
+ * for config request(only for RBs with Re-establishment Req, a failure
+ * is stored in the confirm) if the state of the RB is re-establishment.
+ *
+ * @param[in] ueCb UE control block.
+ *
+ *
+ * @return S16
+ * -# ROK
+ */
+
+#ifdef ANSI
+PUBLIC S16 pjUtlDlHdlInitObdTmrExp
+(
+PjCb *gCb,
+PjDlUeCb *ueCb
+)
+#else
+PUBLIC S16 pjUtlDlHdlInitObdTmrExp(ueCb)
+PjCb *gCb;
+PjDlUeCb *ueCb;
+#endif
+{
+ S16 ret; /* Return Value */
+ UdxSecCfgCfmInfo *secCfgCfm; /* Security Cfg Confirm Info */
+ UdxCfgCfmInfo *cfgCfm; /* Config Confirm Info */
+ UdxReEstCfmInfo *reEstCfm; /* Reest config confirm */
+ UdxCfgCfmInfo *pjCfgCfm;
+ PjLibInfo *libInfo; /* Off-board Info */
+ PjAsyncCfm *asyncCfm; /* Async Cfm Info */
+ PjUdxDlSapCb *udxSap;
+ U16 txIdx; /* Tx Idx */
+ U16 idx; /* Index for looping */
+ U16 cfgIdx;
+
+ TRC3(pjUtlDlHdlInitObdTmrExp)
+
+ RLOG2(L_DEBUG, "pjUtlDlHdlInitObdTmrExp(ueCb(%d,%d))",
+ ueCb->key.ueId, ueCb->key.cellId);
+
+ ret = ROK;
+ udxSap = &(gCb->u.dlCb->udxDlSap[0]);
+ secCfgCfm = NULLP;
+ libInfo = &ueCb->libInfo;
+ txIdx = libInfo->crntTmrTxId;
+
+ /* Restart the timer */
+ PJ_CHK_RESTART_OBD_TIMER(gCb,ueCb, txIdx);
+
+ /* Shouldnt happen, nevertheless, check */
+ if( txIdx >= PJ_MAX_ASYNC_CFM || libInfo->asyncCfm[txIdx] == NULLP)
+ {
+ RETVALUE(ROK);
+ }
+
+ asyncCfm = libInfo->asyncCfm[txIdx];
+
+ /* Security confirm */
+ if(asyncCfm->cfmType & PJ_SEC_ASYNC_CFM)
+ {
+ PJ_ALLOC_BUF_SHRABL(udxSap->pst,secCfgCfm,
+ sizeof (UdxSecCfgCfmInfo), ret);
+ if(ret != ROK)
+ {
+ RLOG0(L_FATAL, "Memory Allocation failed.");
+ RETVALUE(RFAILED);
+ }
+ PJ_FILL_SEC_CFM_INFO(secCfgCfm, asyncCfm);
+ secCfgCfm->status = CPJ_CFG_CFM_NOK;
+ secCfgCfm->reason = CPJ_CFG_REAS_OBD_TIMEOUT;
+
+ PJ_CLEAN_AND_UPD_ASYNCINFO(gCb,ueCb, txIdx);
+
+ PjDlUdxSecCfgCfm((&udxSap->pst), udxSap->suId, secCfgCfm);
+ }
+
+ /* Configuration confirms */
+ else if ((asyncCfm->cfmType & PJ_CFG_ASYNC_CFM) ||
+ (asyncCfm->cfmType & PJ_CFG_REEST_ASYNC_CFM))
+ {
+ PJ_FILL_TIMEOUT_CFG_CFM_INFO(gCb,cfgCfm, asyncCfm);
+
+ PJ_CLEAN_AND_UPD_ASYNCINFO(gCb,ueCb, txIdx);
+
+ PjDlUdxCfgCfm(&(gCb->u.dlCb->udxDlSap[0].pst),
+ gCb->u.dlCb->udxDlSap[0].suId,
+ cfgCfm);
+ }
+ else if (asyncCfm->cfmType & PJ_REEST_ASYNC_CFM)
+ {
+ /* Send ReEstCfm */
+ /* Memory leak fix ccpu00135359 */
+ PJ_ALLOC_BUF_SHRABL(udxSap->pst,reEstCfm,
+ sizeof (UdxReEstCfmInfo), ret);
+ if(ret != ROK)
+ {
+ RLOG0(L_FATAL, "Memory Allocation failed.");
+ RETVALUE(RFAILED);
+ }
+ PJ_FILL_REEST_CFM_INFO(reEstCfm, asyncCfm, LCM_PRIM_NOK);
+
+ PJ_CLEAN_AND_UPD_ASYNCINFO(gCb,ueCb, txIdx);
+
+ PjDlUdxReEstCfm(&udxSap->pst,
+ udxSap->suId, reEstCfm);
+
+ /* Send the config confirm also if any exists */
+ cfgIdx = (U16)( txIdx + 1); /*KW_FIX*/
+
+ for(idx = 0; idx < PJ_MAX_ASYNC_CFM; idx++, cfgIdx++)
+ {
+ cfgIdx %= PJ_MAX_ASYNC_CFM;
+ if((libInfo->asyncCfm[cfgIdx] != NULLP) &&
+ (libInfo->asyncCfm[cfgIdx]->cfmType & PJ_CFG_REEST_ASYNC_CFM))
+ {
+ break;
+ }
+ }
+
+ /* This scenario occurs when only SRB1 is configured */
+ if(idx == PJ_MAX_ASYNC_CFM)
+ {
+ RETVALUE(ROK);
+ }
+
+ PJ_CHK_RESTART_OBD_TIMER(gCb,ueCb, cfgIdx);
+ asyncCfm = libInfo->asyncCfm[cfgIdx];
+
+ PJ_FILL_TIMEOUT_CFG_CFM_INFO(gCb,cfgCfm, asyncCfm);
+
+ PJ_CLEAN_AND_UPD_ASYNCINFO(gCb,ueCb, txIdx);
+
+ PjDlUdxCfgCfm(&gCb->u.dlCb->udxDlSap[0].pst,
+ gCb->u.dlCb->udxDlSap[0].suId, cfgCfm);
+ }
+ else if(asyncCfm->cfmType & PJ_CFG_UEDEL_ASYNC_CFM)
+ {
+ /* Delete ueCb entry from ueLstCp */
+ pjStopTmr(gCb,(PTR)ueCb, PJ_EVT_OBD_WAIT_TMR);
+ ret = cmHashListDelete(&(gCb->u.ulCb->ueLstCp), (PTR) ueCb);
+ if (ret != ROK)
+ {
+
+#ifdef DEBUGP
+ RLOG_ARG0(L_ERROR, DBG_UEID,ueCb->key.ueId,
+ "Hash List Delete Failed for DL ueCb");
+#endif
+ }
+
+ if ( asyncCfm->entity == ENTPJ )
+ {
+ PJ_ALLOC_BUF_SHRABL(udxSap->pst,cfgCfm,
+ sizeof (UdxCfgCfmInfo), ret);
+ if(ret != ROK)
+ {
+ RLOG0(L_FATAL, "Memory Allocation failed.");
+ RETVALUE(RFAILED);
+ }
+
+ for ( idx = 0; idx < asyncCfm->numEnt; idx++)
+ {
+ cfgCfm->cfmEnt[idx].status = asyncCfm->cfmEnt[idx].status;
+ cfgCfm->cfmEnt[idx].reason = asyncCfm->cfmEnt[idx].reason;
+ cfgCfm->cfmEnt[idx].rbId = asyncCfm->cfmEnt[idx].rbId;
+ cfgCfm->cfmEnt[idx].rbType = asyncCfm->cfmEnt[idx].rbType;
+ }
+ cfgCfm->ueId = asyncCfm->ueId;
+ cfgCfm->cellId = asyncCfm->cellId;
+ cfgCfm->transId = asyncCfm->transId;
+ cfgCfm->numEnt = asyncCfm->numEnt;
+
+ /* delete all confirms present there */
+ for(idx = 0; idx < PJ_MAX_ASYNC_CFM; idx++)
+ {
+ if(libInfo->asyncCfm[idx] != NULLP)
+ {
+ PJ_FREE(gCb,ueCb->libInfo.asyncCfm[idx], sizeof(PjAsyncCfm));
+ ueCb->libInfo.asyncCfm[idx] = NULLP;
+ }
+ }
+
+ PJ_FREE(gCb,ueCb, sizeof(PjDlUeCb));
+ PjDlUdxCfgCfm(&(udxSap->pst), udxSap->suId, cfgCfm);
+ }
+ else if ( asyncCfm->entity == ENTPJ )
+ {
+ /* Memory leak fix ccpu00135359 */
+ PJ_ALLOC_BUF_SHRABL(udxSap->pst,pjCfgCfm,
+ sizeof (UdxCfgCfmInfo), ret);
+ if(ret != ROK)
+ {
+ RLOG0(L_FATAL, "Memory Allocation failed.");
+ RETVALUE(RFAILED);
+ }
+ for ( idx = 0; idx < asyncCfm->numEnt; idx++)
+ {
+ pjCfgCfm->cfmEnt[idx].status = asyncCfm->cfmEnt[idx].status;
+ pjCfgCfm->cfmEnt[idx].reason = asyncCfm->cfmEnt[idx].reason;
+ pjCfgCfm->cfmEnt[idx].rbId = asyncCfm->cfmEnt[idx].rbId;
+ pjCfgCfm->cfmEnt[idx].rbType = asyncCfm->cfmEnt[idx].rbType;
+ }
+ pjCfgCfm->ueId = asyncCfm->ueId;
+ pjCfgCfm->cellId = asyncCfm->cellId;
+ pjCfgCfm->transId = asyncCfm->transId;
+ pjCfgCfm->numEnt = asyncCfm->numEnt;
+
+ /* delete all confirms present there */
+ for(idx = 0; idx < PJ_MAX_ASYNC_CFM; idx++)
+ {
+ if(libInfo->asyncCfm[idx] != NULLP)
+ {
+ PJ_FREE(gCb,ueCb->libInfo.asyncCfm[idx], sizeof(PjAsyncCfm));
+ ueCb->libInfo.asyncCfm[idx] = NULLP;
+ }
+ }
+
+ PJ_FREE(gCb,ueCb, sizeof(PjDlUeCb));
+ PjDlUdxCfgCfm(&(udxSap->pst), udxSap->suId, pjCfgCfm);
+ }
+ }
+
+ RETVALUE(ret);
+} /* pjHdlUeDelWaitTmrExp */
+
+\f
+/**
+ *
+ * @brief
+ *
+ * Function to sent the REESTABLISHMENT COMPPLETE
+ * to the RRC.
+ *
+ * @b Description:
+ *
+ * This function
+ * 1. Sends a ReEstablishment Confirm for normal reestablishment.
+ * 2. Sends a SDU status confirm for handover reestablishment.
+ *
+ * @param[in] ueCb UE Control Block
+ *
+ * @return S16
+ * -# ROK
+ * -# RFAILED
+ *
+ */
+#ifdef ANSI
+PUBLIC S16 pjUtlDlSndSduStaCfm
+(
+PjCb *gCb,
+PjDlUeCb *ueCb /* UE Control Block */
+)
+#else
+PUBLIC S16 pjUtlDlSndSduStaCfm(gCb, ueCb)
+PjCb *gCb;
+PjDlUeCb *ueCb; /* UE Control Block */
+#endif
+{
+ UdxSduStaCfmInfo *cfmInfo;
+ PjUdxDlSapCb *udxSap;
+ S16 ret = ROK;
+
+ TRC2(pjUtlDlSndSduStaCfm);
+
+ RLOG2(L_DEBUG, "pjUtlSndSduStaCfm(ueCb(%d,%d))",ueCb->key.ueId, ueCb->key.cellId);
+
+ /* Perform processing for filling up cfm structures */
+ /* Memory leak fix ccpu00135359 */
+ udxSap = &(gCb->u.dlCb->udxDlSap[0]);
+ PJ_ALLOC_BUF_SHRABL(udxSap->pst, cfmInfo,
+ sizeof (UdxSduStaCfmInfo), ret);
+ if( ret != ROK)
+ {
+ RLOG0(L_FATAL, "Memory Allocation failed.");
+ RETVALUE(RFAILED);
+ }
+ PJ_FILL_DL_SDU_CFM_INFO(gCb,cfmInfo, ueCb);
+
+ PjDlUdxSduStaCfm(&gCb->u.dlCb->udxDlSap[0].pst,
+ gCb->u.dlCb->udxDlSap[0].suId,
+ cfmInfo);
+
+ RETVALUE(ROK);
+
+} /* pjUtlSndSduStaCfm */
+
+/**
+ *
+ * @brief Handler to clean up all the PDCP Control Blocks.
+ *
+ *
+ * @b Description
+ * This function is invoked by LMM to shutdown the
+ * layer. This cleans up recBuf and txBuf of all the
+ * PDCP RBs in all the UEs.
+ *
+ * @return S16
+ * -# ROK
+ * -# RFAILED
+ *
+*/
+
+#ifdef ANSI
+PUBLIC S16 pjUtlDlShutdown
+(
+PjCb *gCb
+)
+#else
+PUBLIC S16 pjUtlDlShutdown()
+PjCb *gCb;
+#endif
+{
+ S16 ret; /* Return Value */
+ PjDlUeCb *ueCb; /* UE Control Block */
+ PjDlUeCb *prevUeCb; /* Previos UE Control Block */
+ PjDlRbCb *rbCb; /* RB Control Block */
+ PjDlRbCb **rbCbLst; /* RB Control Block List */
+ PjSec secInfo; /* Security info of UE */
+ U8 idx; /* Index for RBs */
+#ifdef LTE_L2_MEAS_COMMENT
+ PjL2MeasEvtCb *measEvtCb = NULLP;
+#endif
+ TRC3(pjUtlDlShutdown)
+
+ RLOG0(L_DEBUG, "pjUtlShutdown()");
+
+ ret = ROK;
+ ueCb = NULLP;
+ prevUeCb = NULLP;
+ rbCb = NULLP;
+ rbCbLst = NULLP;
+ idx = 0;
+
+ /* Until no more ueCb is ueLstCp hash list get and delete ueCb */
+ while (cmHashListGetNext(&(gCb->u.dlCb->ueLstCp), (PTR) prevUeCb, (PTR *)&ueCb) == ROK)
+ {
+ if ( ueCb != NULLP )
+ {
+#if (defined(PJ_SEC_ASYNC) || defined (PJ_CMP_ASYNC))
+ if (ueCb->libInfo.obdTmr.tmrEvnt == PJ_EVT_OBD_TMR)
+ {
+ pjStopTmr(gCb,(PTR)ueCb, PJ_EVT_OBD_TMR);
+ }
+#endif
+ rbCbLst = ueCb->srbCb;
+ for (idx = 0; idx < PJ_MAX_SRB_PER_UE; idx++)
+ {
+ rbCb = rbCbLst[idx];
+ if (rbCb != NULLP)
+ {
+ /* Free the Buffers of RbCb */
+ pjUtlDlFreeRb(gCb,rbCb);
+ }
+ }
+ rbCbLst = ueCb->drbCb;
+ for (idx = 0; idx < PJ_MAX_DRB_PER_UE; idx++)
+ {
+ rbCb = rbCbLst[idx];
+ if (rbCb != NULLP)
+ {
+ pjUtlDlFreeRb(gCb,rbCb);
+ }
+ }
+ /* Close all the context info for offboarding */
+ secInfo = ueCb->secInfo;
+#ifdef INTEL_QAT_DP
+ pjUtlDlIntClose(gCb,ueCb->secInfo.cpIntSessCxtId);
+ pjUtlDlCipherClose(gCb,ueCb->secInfo.cpCiphSessCxtId);
+ pjUtlDlCipherClose(gCb,ueCb->secInfo.upCiphSessCxtId);
+#else
+ pjUtlDlCipherClose(gCb,secInfo.cpCxtId);
+ pjUtlDlCipherClose(gCb,secInfo.upCxtId);
+ pjUtlDlIntClose(gCb,secInfo.intCxtId);
+#endif
+
+ /* Delete hoInfo if present */
+ if (ueCb->hoInfo != NULLP)
+ {
+ PJ_FREE(gCb,ueCb->hoInfo->hoCfmInfo,
+ (PJ_MAX_DRB_PER_UE * sizeof(PjDlHoCfmInfo)));
+ PJ_FREE(gCb,ueCb->hoInfo, sizeof(PjDlHoInfo));
+ }
+ }
+ prevUeCb = ueCb;
+ }
+#ifdef LTE_L2_MEAS_COMMENT
+ for(idx = 0; idx < PJ_MAX_L2MEAS_EVT; idx++)
+ {
+ if(gCb->u.dlCb->pjL2Cb.pjMeasEvtCb[idx] != NULLP)
+ {
+ measEvtCb = gCb->u.dlCb->pjL2Cb.pjMeasEvtCb[idx];
+ pjStopTmr((PTR)measEvtCb, PJ_EVT_L2_TMR);
+ gCb->u.dlCb->pjL2Cb.pjNumMeas--;
+ PJ_FREE(gCb,measEvtCb, sizeof(PjL2MeasEvtCb));
+ gCb->u.dlCb->pjL2Cb.pjMeasEvtCb[idx] = NULLP;
+ }
+ }
+#endif
+ ret = pjDbmDlDeInit(gCb);
+#if (ERRCLASS & ERRCLS_DEBUG)
+ if (ret != ROK)
+ {
+ RLOG0(L_FATAL, "PDCP DL DeInitialization Failed.");
+ }
+#endif /* ERRCLASS & ERRCLS_DEBUG */
+
+
+ /* commented this to use in deregister timer and kwusap */
+ /* gCb->init.cfgDone &= ~PJ_LMM_GENCFG_DONE; */
+ RETVALUE(ret);
+}
+
+/**
+ *
+ * @brief
+ *
+ * Handler to free a PDCP Control Block.
+ *
+ * @b Description:
+ *
+ * This function frees the txBuf and rxBuf in a PDCP control block.
+ * and closes the compression channel opened. It stops the timers
+ * of this control block if they are running.
+ *
+ * @param[in] pst Post structure
+ * @param[in] secCxt Context for Integrity protection/verification
+ * @param[in] ctxId Integrity Context Id
+ *
+ *
+ * @return S16
+ * -# ROK
+ *
+ */
+
+#ifdef ANSI
+PUBLIC Void pjUtlDlFreeRb
+(
+PjCb *gCb,
+PjDlRbCb *pjRbCb
+)
+#else
+PUBLIC Void pjUtlDlFreeRb(pjRbCb)
+PjCb *gCb;
+PjDlRbCb *pjRbCb;
+#endif
+{
+ TRC3(pjUtlDlFreeRb)
+ RLOG0(L_DEBUG, "pjUtlFreeRb()");
+
+
+#if (defined(PJ_SEC_ASYNC) || defined (PJ_CMP_ASYNC))
+ if (pjRbCb->dlCb.obdTmr.tmrEvnt == PJ_EVT_DL_OBD_TMR)
+ {
+ pjStopTmr(gCb,(PTR)pjRbCb, PJ_EVT_DL_OBD_TMR);
+ }
+#endif
+
+ pjUtlCmpClose(gCb,pjRbCb->cmpCxtId);
+ /*pj004.201 Adding of Missing Trace in LTE RLC PDCP*/
+ RETVOID;
+}
+
+/* pj005.201 added function to send data forward indication message */
+/**
+ *
+ * @brief
+ *
+ * Handler to send Data Fwd Indication
+ *
+ * @b Description:
+ * This function sends Data Fwd Indication message to PDCP user
+ *
+ * @param[in] pjRbCb PDCP RbCb
+ * @param[in] datFwdInd Data forward indication
+ *
+ *
+ * @return S16
+ * -# ROK
+ *
+ */
+
+#ifdef ANSI
+PUBLIC S16 pjUtlDlSndDatFwdInd
+(
+PjCb *gCb,
+PjDlRbCb *pjRbCb,
+PjuDatFwdIndInfo *datFwdInd
+)
+#else
+PUBLIC S16 pjUtlDlSndDatFwdInd(pjRbCb, datFwdInd)
+PjCb *gCb;
+PjDlRbCb *pjRbCb;
+PjuDatFwdIndInfo *datFwdInd;
+#endif
+{
+ CmLtePdcpId *pdcpId;
+ PjPjuSapCb *pjuSap;
+
+ TRC3(pjUtlDlSndDatFwdInd)
+
+ RLOG0(L_DEBUG, "pjUtlSndDatFwdInd()");
+
+ pjuSap = &(gCb->u.dlCb->pjuSap[PJ_DRB_SAP]);
+ CmLtePdcpId pdcpIdTmp;
+ pdcpId = &pdcpIdTmp;
+
+ if(pdcpId != NULLP)
+ {
+ pdcpId->ueId = pjRbCb->ueCb->key.ueId;
+ pdcpId->cellId = pjRbCb->ueCb->key.cellId;
+ pdcpId->rbId = pjRbCb->rbId;
+ pdcpId->rbType = pjRbCb->rbType;
+
+ gCb->pjGenSts.numPktsFrwd += datFwdInd->numSdus;
+ /* If trace flag is enabled send the trace indication */
+ if(gCb->init.trc == TRUE)
+ {
+ /* Populate the trace params */
+ pjLmmSendTrc(gCb,EVTPJUDATFWDIND, NULLP);
+ }
+ PjUiPjuDatFwdInd(&(pjuSap->pst), pjuSap->suId, pdcpId, datFwdInd);
+ }
+
+ RETVALUE(ROK);
+
+}/* end of pjUtlSndDatFwdInd */
+
+/* pj005.201 added support for L2 Measurement */
+#ifdef LTE_L2_MEAS
+/**
+ *
+ * @brief Function to initialise measurement
+ *
+ * @b Description
+ *
+ * @param[in] gCb PDCP Instance Control Block
+ *
+ * @return Void
+ *
+ */
+S16 pjUtlL2MeasDlInit(PjCb *gCb)
+{
+ U16 cntr;
+
+ gCb->u.dlCb->pjL2Cb.pjNumMeas=0;
+ for(cntr = 0; cntr < LPJ_MAX_L2MEAS; cntr++)
+ {
+ cmMemset((U8 *)&(gCb->u.dlCb->pjL2Cb.pjL2EvtCb[cntr]), 0, sizeof(PjL2MeasEvtCb));
+ }
+ gCb->u.dlCb->pjL2Cb.pjL2EvtCb[0].measCb.measType = LPJ_L2MEAS_DL_DISC;
+
+ RETVALUE(ROK);
+}
+\f
+/**
+ *
+ * @brief Handler for sending L2 Measurement report
+ *
+ * @b Description
+ *
+ * @param[in] gCb PDCP Instance Control Block.
+ * @param[in] measEvtCb Measurement Event Control Block.
+ *
+ *
+ * @return S16
+ * -# ROK
+ */
+
+#ifdef ANSI
+PUBLIC S16 pjUtlSndDlL2MeasCfm
+(
+PjCb *gCb,
+PjL2MeasEvtCb *measEvtCb
+)
+#else
+PUBLIC S16 pjUtlSndDlL2MeasCfm(measEvtCb)
+PjCb *gCb;
+PjL2MeasEvtCb *measEvtCb;
+#endif
+{
+ PjL2MeasCb *measCb;
+ PjL2MeasCfmEvt measCfmEvt;
+ U8 qciIdx;
+
+ TRC3(pjUtlSndDlL2MeasCfm)
+
+ measCb = &measEvtCb->measCb;
+ cmMemset((U8*)&measCfmEvt, 0, sizeof(PjL2MeasCfmEvt));
+
+ measCfmEvt.measType = measCb->measType;
+ measCfmEvt.status.status = LCM_PRIM_OK;
+ measCfmEvt.status.reason = LCM_REASON_NOT_APPL;
+ for(qciIdx = 0; qciIdx < (LPJ_MAX_QCI-1); qciIdx++)
+ {
+ measCfmEvt.measCfm[measCfmEvt.numQciCfm].qci = measCb->qci[qciIdx];
+ if(measCfmEvt.measCfm[measCfmEvt.numQciCfm].qci > 0)
+ {
+ if((measCb->measType & LPJ_L2MEAS_DL_DISC) &&
+ (measCb->measData[measCb->qci[qciIdx]].dlDisc.numPkts > 0))
+ {
+ /* dlDisc = num of Pkts Discarded * 10^6 / total no of pkts. */
+ measCfmEvt.measCfm[measCfmEvt.numQciCfm].dlDisc =
+ measCb->measData[measCb->qci[qciIdx]].dlDisc.val * (1000000) /
+ measCb->measData[measCb->qci[qciIdx]].dlDisc.numPkts;
+ /* Reset the counters */
+ measCb->measData[measCb->qci[qciIdx]].dlDisc.val = 0;
+ measCb->measData[measCb->qci[qciIdx]].dlDisc.numPkts =0;
+ }
+ measCfmEvt.numQciCfm++;
+ }
+ }
+
+ /* Send Measurement confirmation to layer manager */
+ PjMiLpjL2MeasCfm(&gCb->pjGenCfg.lmPst,&measCfmEvt);
+
+ RETVALUE(ROK);
+}
+\f
+
+/**
+ * @brief Validates the measurement request parameters.
+ *
+ * @details
+ *
+ * Function :pjUtlValidateL2Meas
+ *
+ * @param[in] PjL2MeasReqEvt measReqEvt
+ * @param[out] PjL2MeasCfmEvt measCfmEvt
+ **/
+/**
+ *
+ * @brief Handler for resetting the DL measurement counters
+ *
+ * Function :pjUtlResetDlL2MeasCntr
+ *
+ * @b Description
+ *
+ * @param[in] measCb Measurement Control Block.
+ *
+ *
+ * @return Void
+ */
+#ifdef ANSI
+
+PUBLIC Void pjUtlResetDlL2MeasCntr
+(
+PjCb *gCb,
+PjL2MeasCb *measCb,
+U8 measType
+)
+#else
+PUBLIC Void pjUtlResetDlL2MeasCntr(gCb, measCb, measType)
+PjCb *gCb;
+PjL2MeasCb *measCb;
+U8 measType;
+#endif
+{
+ /* for now the only meas should be DL discard in this case */
+ if (measCb->measType & LPJ_L2MEAS_DL_DISC)
+ {
+ U32 i;
+ for(i = 0; i < (LPJ_MAX_QCI - 1); i++)
+ {
+ U8 qciVal = measCb->qci[i];
+
+ measCb->measData[qciVal].dlDisc.val = 0;
+ measCb->measData[qciVal].dlDisc.numPkts = 0;
+ gCb->u.dlCb->pjL2Cb.measOn[qciVal] &= ~LPJ_L2MEAS_DL_DISC;
+ }
+
+ measCb->numQci = 0;
+ }
+}
+
+/**
+ *
+ * @brief Handler for storing address of MeasData in rbCb at right index
+ *
+ *
+ * @b Description
+ * This function is called when LM sends measReq message to RLC.
+ *
+ * @param[in]
+ * @param[out]
+ * @param[in]
+ *
+ *
+ * @return S16
+ * -# ROK
+ */
+#ifdef ANSI
+PUBLIC Void pjUtlPlcMeasDatInDlL2Sts
+(
+PjL2Cntr *measData,
+PjL2MeasRbCb *rbL2Cb,
+U8 measType
+)
+#else
+PUBLIC Void pjUtlPlcMeasDatInDlL2Sts(measData, rbL2Cb, measType)
+PjL2Cntr *measData;
+PjL2MeasRbCb *rbL2Cb;
+U8 measType;
+#endif
+{
+ TRC3(pjUtlPlcMeasDatInDlL2Sts)
+
+ /* We should check the number of measType in the request. This can be done
+ * by looking at each bit in the measType. Also store the measData in the
+ * correct index of l2Sts in RbCb.
+ * */
+
+ if(measType & LPJ_L2MEAS_DL_DISC)
+ {
+ rbL2Cb->l2Sts[PJ_L2MEAS_DL_DISC] = measData;
+ }
+
+}/* End of pjUtlPlcMeasDatInDlL2Sts */
+#endif /* LTE_L2_MEAS */
+
+void dumpPDCPDlRbInformation(PjDlRbCb* dlRbCb, U16 ueId)
+{
+ PjDlCb* dlCb = &dlRbCb->dlCb;
+ RLOG_ARG1(L_INFO,DBG_UEID,ueId, "PDCP DL RB numEntries = %lu",
+ dlCb->txBuf.numEntries);
+#ifndef ALIGN_64BIT
+ RTLIN_DUMP_DEBUG("UE [%u] PDCP DL RB numEntries = %lu",
+ ueId, dlCb->txBuf.numEntries);
+#else
+ RTLIN_DUMP_DEBUG("UE [%u] PDCP DL RB numEntries = %u",
+ ueId, dlCb->txBuf.numEntries);
+#endif
+}
+
+void DumpPDCPDlDebugInformation(void)
+{
+#ifndef RGL_SPECIFIC_CHANGES
+#ifdef TENB_T2K3K_SPECIFIC_CHANGES
+ void *iccHdl = NULLP;
+ U32 poolZeroFreeCnt;
+ U32 poolOneFreeCnt;
+ U32 poolTwoFreeCnt;
+ U32 poolThreeFreeCnt;
+#endif
+
+ PjCb* dlInst = pjCb[1]; /* TODO: check whether DL is 0 or 1 */
+ PjDlgCb* dlgCb = dlInst->u.dlCb;
+
+ PjDlUeCb *ueCb = NULLP;
+ RLOG0(L_INFO,"PDCP DL Information");
+ RLOG0(L_INFO,"===================");
+ RTLIN_DUMP_DEBUG("PDCP DL Information\n");
+ RTLIN_DUMP_DEBUG("===================\n");
+ /* Until no more ueCb is ueLstCp hash list get and delete ueCb */
+ while (ROK == cmHashListGetNext(&dlgCb->ueLstCp,
+ (PTR) ueCb,
+ (PTR *)&ueCb))
+ {
+ U32 i;
+ for(i = 0; i < PJ_MAX_SRB_PER_UE; i++)
+ {
+ PjDlRbCb* rbCb = ueCb->srbCb[i];
+ if(rbCb != NULLP)
+ {
+ dumpPDCPDlRbInformation(rbCb, ueCb->key.ueId);
+ }
+ }
+ for(i = 0; i < PJ_MAX_DRB_PER_UE; i++)
+ {
+ PjDlRbCb* rbCb = ueCb->drbCb[i];
+ if(rbCb != NULLP)
+ {
+ dumpPDCPDlRbInformation(rbCb, ueCb->key.ueId);
+ }
+ }
+ }/* end while */
+ /*printing ICC memory statistics*/
+#ifdef TENB_T2K3K_SPECIFIC_CHANGES
+ iccHdl = ssGetIccHdl(dlInst->init.region);
+ if(NULLP != iccHdl)
+ {
+ poolZeroFreeCnt = TL_GetFreeBlocks(iccHdl, ICC_POOL_ZERO_SIZE);
+ poolOneFreeCnt = TL_GetFreeBlocks(iccHdl, ICC_POOL_ONE_SIZE);
+ poolTwoFreeCnt = TL_GetFreeBlocks(iccHdl, ICC_POOL_TWO_SIZE);
+ poolThreeFreeCnt = TL_GetFreeBlocks(iccHdl, ICC_POOL_THREE_SIZE);
+ RLOG1(L_ALWAYS,"ICC pool zero free count = %lu", poolZeroFreeCnt);
+ RLOG1(L_ALWAYS,"ICC pool one free count = %lu", poolOneFreeCnt);
+ RLOG1(L_ALWAYS,"ICC pool two free count = %lu", poolTwoFreeCnt);
+ RLOG1(L_ALWAYS,"ICC pool three free count = %lu", poolThreeFreeCnt);
+ RTLIN_DUMP_DEBUG("ICC pool zero free count = %lu\n", poolZeroFreeCnt);
+ RTLIN_DUMP_DEBUG("ICC pool one free count = %lu\n", poolOneFreeCnt);
+ RTLIN_DUMP_DEBUG("ICC pool two free count = %lu\n", poolTwoFreeCnt);
+ RTLIN_DUMP_DEBUG("ICC pool three free count = %lu\n", poolThreeFreeCnt);
+ }
+ /*ccpu00136858 */
+ RLOG1(L_ALWAYS,"SPACC cipher Q num of entry = %lu ", pjMsCiphQ.count);
+ RLOG1(L_ALWAYS,"SPACC decipher Q num of entry = %lu ", pjMsDeCiphQ.count);
+ RTLIN_DUMP_DEBUG("SPACC cipher Q num of entry = %lu \n", pjMsCiphQ.count);
+ RTLIN_DUMP_DEBUG("SPACC decipher Q num of entry = %lu \n", pjMsDeCiphQ.count);
+#endif
+#endif
+}
+
+PUBLIC Void pjUtlEmptyDlPktList(PjCb *gCb, PjDlRbCb *pjRbCb)
+{
+ PjDlPkt *ulPkt;
+ CmLListCp *ulPktLst = &pjRbCb->dlCb.dlPktQ;
+ while(ulPktLst->first)
+ {
+ ulPkt = (PjDlPkt *)(ulPktLst->first->node);
+ cmLListDelFrm(ulPktLst, ulPktLst->first);
+ PJ_FREE_BUF(ulPkt->pdu);
+#ifdef FLAT_BUFFER_OPT
+ PJ_FREE_FLAT_BUF(gCb, &(ulPkt->fb))
+#endif
+ PJ_FREE(gCb, ulPkt, sizeof(PjDlPkt));
+ }
+ RETVOID;
+}
+
+void ResetPDCPStats(void)
+{
+ cmMemset((U8*)&gPdcpStats, 0, sizeof(PDCPStats));
+}
+
+#ifndef ALIGN_64BIT
+void PrintPDCPStats(void)
+{
+#ifdef TENB_T2K3K_SPECIFIC_CHANGES
+ /* UDAY */
+#ifdef XEON_SPECIFIC_CHANGES
+ RLOG3(L_INFO,"PDCP Stats: SDUs Dropped = (%ld),SDUs Queued for SPAcc Cipher = (%ld),"
+ "Decipher = (%ld)",
+ gPdcpStats.numPdcpSdusDiscarded, pjMsCiphQ.count, pjMsDeCiphQ.count);
+#else
+ RLOG3(L_INFO,"PDCP Stats: SDUs Dropped = (%ld),SDUs Queued for SPAcc Cipher = (%ld),"
+ "Decipher = (%ld)",
+ gPdcpStats.numPdcpSdusDiscarded, pjMsDlSpaccQCnt, pjMsUlSpaccQCnt);
+#endif
+#ifdef XEON_SPECIFIC_CHANGES
+ if((gPdcpStats.numPdcpSdusDiscarded > 0) || (pjMsCiphQ.count > 0) || (pjMsDeCiphQ.count > 0) )
+ {
+ RTLIN_DUMP_DEBUG("PDCP Stats: SDUs Dropped = (%d),"
+ "SDUs Queued for SPAcc Cipher = (%d), Decipher = (%d) \n",
+ gPdcpStats.numPdcpSdusDiscarded, pjMsCiphQ.count, pjMsDeCiphQ.count); /* UDAY */
+ }
+#else
+ RTLIN_DUMP_DEBUG("PDCP Stats: SDUs Dropped = (%ld),"
+ "SDUs Queued for SPAcc Cipher = (%ld), Decipher = (%ld) Rb Overload DROP = (%ld) dbgPdcpQSizeThreshHoldDropCnt is (%ld) MmThredHldDrp (%ld) spaccQDropCnt (%ld) dlSpaccPktDrop %ld\n",
+ gPdcpStats.numPdcpSdusDiscarded, pjMsDlSpaccQCnt, pjMsUlSpaccQCnt,dbgPdcpMemCount,dbgPdcpQSizeThreshHoldDropCnt,pdcpdrop, dbgSpaccThreshHoldDropCnt,spaccDropCount); /* UDAY */
+ dbgPdcpMemCount =0;
+ dbgPdcpQSizeThreshHoldDropCnt=0;
+ pdcpdrop = 0;
+
+ spaccDropCount = 0;
+ //pdcpDropMemTh=0;
+#endif
+#endif
+}
+#else
+void PrintPDCPStats(void)
+{
+ printf ("\n============================== PDCP STATS ===========================\n");
+ RTLIN_DUMP_DEBUG("SDUs Dropped = (%u) No of Reodering Tmr Exp (%u)",
+ gPdcpStats.numPdcpSdusDiscarded, gPdcpStats.numPdcpCellReorderTmrExp);
+}
+#endif
+
+#ifdef ANSI
+PRIVATE S16 pjUtlDlHdlSecInitCfm
+(
+PjCb *gCb, /* Pointer to PJ DL Control Block */
+PjDlUeCb *ueCb, /* Pointer to UeCb */
+U16 txIdx, /* Transaction Index for UeCb */
+PjAsyncCfm *asyncCfm,
+UdxSecCfgCfmInfo *secCfgCfm, /* Security config confirm */
+UdxReEstCfmInfo *reEstCfm /* Reest config confirm */
+)
+#else
+PRIVATE S16 pjUtlDlHdlSecInitCfm(gCb,ueCb,txIdx,secCfgCfm,reEstCfm)
+(
+PjCb *gCb; /* Pointer to PJ DL Control Block */
+PjDlUeCb *ueCb; /* Pointer to UeCb */
+U16 txIdx; /* Transaction Index for UeCb */
+PjAsyncCfm *asyncCfm;
+UdxSecCfgCfmInfo *secCfgCfm; /* Security config confirm */
+UdxReEstCfmInfo *reEstCfm; /* Reest config confirm */
+)
+#endif
+{
+ PjUdxDlSapCb *udxSap;
+ S16 ret = ROK;
+
+ TRC3(pjUtlDlHdlSecInitCfm)
+
+ if(asyncCfm->libInitBitMask == 0)
+ {
+ PJ_CHK_RESTART_OBD_TIMER(gCb,ueCb, txIdx);
+ if(ueCb->libInfo.state == PJ_STATE_NORMAL)
+ {
+ /* Send security config confirm */
+ /* Memory leak fix ccpu00135359 */
+ udxSap = &(gCb->u.dlCb->udxDlSap[0]);
+ PJ_ALLOC_BUF_SHRABL(udxSap->pst,secCfgCfm,
+ sizeof (UdxSecCfgCfmInfo), ret);
+ if(ret != ROK)
+ {
+ RLOG0(L_FATAL, "Memory Allocation failed.");
+ RETVALUE(RFAILED);
+ }
+ PJ_FILL_SEC_CFM_INFO(secCfgCfm, asyncCfm);
+
+ PJ_CLEAN_AND_UPD_ASYNCINFO(gCb,ueCb, txIdx);
+
+ PjDlUdxSecCfgCfm(&gCb->u.dlCb->udxDlSap[0].pst,
+ gCb->u.dlCb->udxDlSap[0].suId,
+ (UdxSecCfgCfmInfo *) secCfgCfm);
+ }
+ else if(ueCb->libInfo.state == PJ_STATE_REEST)
+ {
+ /* Send ReEstCfm */
+ /* Memory leak fix ccpu00135359 */
+ udxSap = &(gCb->u.dlCb->udxDlSap[0]);
+ PJ_ALLOC_BUF_SHRABL(udxSap->pst,reEstCfm,
+ sizeof (UdxReEstCfmInfo), ret);
+ if(ret != ROK)
+ {
+ RLOG0(L_FATAL, "Memory Allocation failed.");
+ RETVALUE(RFAILED);
+ }
+ PJ_FILL_REEST_CFM_INFO(reEstCfm, asyncCfm, LCM_PRIM_OK);
+
+ /* Some house keeping work */
+ PJ_CLEAN_AND_UPD_ASYNCINFO(gCb,ueCb, txIdx);
+
+ PjDlUdxReEstCfm(&gCb->u.dlCb->udxDlSap[0].pst,
+ gCb->u.dlCb->udxDlSap[0].suId, reEstCfm);
+
+ pjUtlReEstDl(gCb, ueCb);
+ }
+ }
+ RETVALUE(ROK);
+}
+
+
+#ifdef ANSI
+PRIVATE S16 pjUtlDlHdlCmpInitCfm
+(
+PjCb *gCb, /* Pointer to PJ DL Control Block */
+PjDlUeCb *ueCb, /* Pointer to UeCb */
+U16 txIdx, /* Transaction Index for UeCb */
+PjAsyncCfm *asyncCfm, /* Async Confirm */
+UdxCfgCfmInfo *cfgCfm /* UDX Config Confirm */
+)
+#else
+PRIVATE S16 pjUtlDlHdlCmpInitCfm(gCb,ueCb,txIdx,asyncCfm,cfgCfm)
+(
+PjCb *gCb; /* Pointer to PJ DL Control Block */
+PjDlUeCb *ueCb; /* Pointer to UeCb */
+U16 txIdx; /* Transaction Index for UeCb */
+PjAsyncCfm *asyncCfm; /* Async Confirm */
+UdxCfgCfmInfo *cfgCfm; /* UDX Config Confirm */
+)
+#endif
+{
+ PjUdxDlSapCb *udxSap;
+ U32 idx;
+ S16 ret = ROK;
+ TRC3(pjUtlDlHdlCmpInitCfm)
+
+ asyncCfm->libInitBitMask ^= (PJ_LIB_COMP_BIT_MASK);
+
+ if((asyncCfm->libInitBitMask == 0) &&
+ !(asyncCfm->cfmType & PJ_CFG_REEST_ASYNC_CFM))
+ {
+
+ /* Send config confirm */
+ /* Memory leak fix ccpu00135359 */
+ udxSap = &(gCb->u.dlCb->udxDlSap[0]);
+ PJ_ALLOC_BUF_SHRABL(udxSap->pst,cfgCfm,
+ sizeof (UdxCfgCfmInfo), ret);
+ if(ret != ROK)
+ {
+ RLOG0(L_FATAL, "Memory Allocation failed.");
+ RETVALUE(RFAILED);
+ }
+ cfgCfm->transId = asyncCfm->transId;
+ cfgCfm->ueId = asyncCfm->ueId;
+ cfgCfm->cellId = asyncCfm->cellId;
+ cfgCfm->numEnt = asyncCfm->numEnt;
+ for ( idx = 0; idx < asyncCfm->numEnt; idx++ )
+ {
+ cfgCfm->cfmEnt[idx].status = asyncCfm->cfmEnt[idx].status;
+ cfgCfm->cfmEnt[idx].reason = asyncCfm->cfmEnt[idx].reason;
+ cfgCfm->cfmEnt[idx].rbId = asyncCfm->cfmEnt[idx].rbId;
+ cfgCfm->cfmEnt[idx].rbType = asyncCfm->cfmEnt[idx].rbType;
+ }
+
+ /* Some house keeping work */
+ PJ_CHK_RESTART_OBD_TIMER(gCb,ueCb, txIdx);
+ PJ_CLEAN_AND_UPD_ASYNCINFO(gCb,ueCb, txIdx);
+
+ /* Send confirmtion to the User */
+ PjDlUdxCfgCfm(&(gCb->u.dlCb->udxDlSap[0].pst),
+ gCb->u.dlCb->udxDlSap[0].suId,
+ (UdxCfgCfmInfo *)cfgCfm);
+ }
+
+ RETVALUE(ROK);
+}
+
+
+
+#ifdef __cplusplus
+}
+#endif /* __cplusplus */
+/********************************************************************30**
+ End of file
+**********************************************************************/