1 /*******************************************************************************
2 ################################################################################
3 # Copyright (c) [2017-2019] [Radisys] #
5 # Licensed under the Apache License, Version 2.0 (the "License"); #
6 # you may not use this file except in compliance with the License. #
7 # You may obtain a copy of the License at #
9 # http://www.apache.org/licenses/LICENSE-2.0 #
11 # Unless required by applicable law or agreed to in writing, software #
12 # distributed under the License is distributed on an "AS IS" BASIS, #
13 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. #
14 # See the License for the specific language governing permissions and #
15 # limitations under the License. #
16 ################################################################################
17 *******************************************************************************/
19 /********************************************************************20**
21 Name: LTE-RLC Layer - Upper Interface Functions
25 Desc: Source code for RLC Upper Interface Module
26 This file contains following functions
39 **********************************************************************/
40 static const char* RLOG_MODULE_NAME="UIM";
41 static int RLOG_MODULE_ID=2048;
42 static int RLOG_FILE_ID=205;
46 * @brief RLC Upper Interface Module
49 #define KW_MODULE KW_DBGMASK_INF
52 /* header (.h) include files */
53 #include "envopt.h" /* environment options */
54 #include "envdep.h" /* environment dependent */
55 #include "envind.h" /* environment independent */
57 #include "gen.h" /* general */
58 #include "ssi.h" /* system services */
59 #include "cm5.h" /* common timer defines */
60 #include "cm_tkns.h" /* common tokens defines */
61 #include "cm_mblk.h" /* common memory allocation library defines */
62 #include "cm_llist.h" /* common link list defines */
63 #include "cm_hash.h" /* common hash list defines */
64 #include "cm_lte.h" /* common LTE defines */
65 #include "lkw.h" /* LKW defines */
66 #include "ckw.h" /* CKW defines */
67 #include "kwu.h" /* KWU defines */
68 #include "rgu.h" /* RGU defines */
69 #include "kw_env.h" /* RLC environment options */
70 #include "kw.h" /* RLC defines */
75 /* extern (.x) include files */
76 #include "gen.x" /* general */
77 #include "ssi.x" /* system services */
79 #include "cm5.x" /* common timer library */
80 #include "cm_tkns.x" /* common tokens */
81 #include "cm_mblk.x" /* common memory allocation */
82 #include "cm_llist.x" /* common link list */
83 #include "cm_hash.x" /* common hash list */
84 #include "cm_lte.x" /* common LTE includes */
85 #include "cm_lib.x" /* common memory allocation library */
86 #include "lkw.x" /* LKW */
87 #include "ckw.x" /* CKW */
88 #include "kwu.x" /* KWU */
89 #include "rgu.x" /* RGU */
97 /*****************************************************************************
99 ****************************************************************************/
103 * Handler for binding the RLC upper layer service user with
107 * This function is used by RLC user to request for binding to
108 * RLC. This function is called by the CKW interface to bind
109 * RLC's SAP (identified by spId) with the service user's
110 * SAP (identified by suId).
112 * @param[in] pst Post structure
113 * @param[in] suId Service User ID
114 * @param[in] spId Service provider ID
122 PUBLIC S16 KwUiCkwBndReq
129 PUBLIC S16 KwUiCkwBndReq (pst, suId, spId)
140 #if (ERRCLASS & ERRCLS_INT_PAR)
141 if (pst->dstInst >= KW_MAX_RLC_INSTANCES)
147 tKwCb = KW_GET_KWCB(pst->dstInst);
149 RLOG2(L_DEBUG, "spId(%d), suId(%d)", spId, suId);
150 ckwSap = &(tKwCb->u.ulCb->ckwSap);
151 /* Take action based on the current state of the SAP */
152 switch(ckwSap->state)
154 /* SAP is configured but not bound */
158 /* copy bind configuration parameters in SSAP sap */
160 ckwSap->pst.dstProcId = pst->srcProcId;
161 ckwSap->pst.dstEnt = pst->srcEnt;
162 ckwSap->pst.dstInst = pst->srcInst;
164 /* Update the State */
165 ckwSap->state = KW_SAP_BND;
167 RLOG1(L_DEBUG, "KwUiCkwBndReq: state (%d)", ckwSap->state);
172 /* Sap is already bound check source, destination Entity and
174 if (ckwSap->pst.dstProcId != pst->srcProcId ||
175 ckwSap->pst.dstEnt != pst->srcEnt ||
176 ckwSap->pst.dstInst != pst->srcInst ||
177 ckwSap->suId != suId)
179 KW_SEND_SAPID_ALARM(tKwCb,
181 LKW_EVENT_CKW_BND_REQ,
182 LCM_CAUSE_INV_PAR_VAL);
184 RLOG0(L_ERROR, "CKW SAP already Bound");
185 KwUiCkwBndCfm(&(ckwSap->pst), ckwSap->suId, CM_BND_NOK);
192 #if (ERRCLASS & ERRCLS_INT_PAR)
193 RLOG0(L_ERROR, "Invalid CKW SAP State in Bind Req");
194 KW_SEND_SAPID_ALARM(tKwCb,
196 LKW_EVENT_CKW_BND_REQ,
197 LCM_CAUSE_INV_STATE);
198 #endif /* ERRCLASS & ERRCLS_INT_PAR */
199 KwUiCkwBndCfm(&(ckwSap->pst), ckwSap->suId, CM_BND_NOK);
205 KwUiCkwBndCfm(&(ckwSap->pst), ckwSap->suId, CM_BND_OK);
212 * Handler for unbinding the RLC upper layer service user CKW with
216 * This function is used by RLC user to request for unbinding
217 * with RLC.This function is called by the CKW interface to
220 * @param[in] pst Post structure
221 * @param[in] spId Service provider SAP ID
222 * @param[in] reason Reason for Unbinding
229 PUBLIC S16 KwUiCkwUbndReq
236 PUBLIC S16 KwUiCkwUbndReq(pst, spId, reason)
246 #if (ERRCLASS & ERRCLS_INT_PAR)
247 if (pst->dstInst >= KW_MAX_RLC_INSTANCES)
251 #endif /* ERRCLASS & ERRCLS_INT_PAR */
252 tKwCb = KW_GET_KWCB(pst->dstInst);
254 RLOG2(L_DEBUG,"spId(%d), reason(%d)",
260 #if (ERRCLASS & ERRCLS_INT_PAR)
261 KW_GET_AND_VALIDATE_CKWSAP(tKwCb,
262 (&(tKwCb->u.ulCb->ckwSap)),
265 #endif /* ERRCLASS & ERRCLS_INT_PAR */
267 /* disable upper sap (CKW) */
268 tKwCb->u.ulCb->ckwSap.state = KW_SAP_CFG;
272 /*******************************************************************
274 * @brief Handler for UE create request
278 * Function : RlcDuappProcUeCreateReq
281 * Handler for UE create request
283 * @params[in] pst - Post Structure
284 * cfg - Configuration information for one or more RLC entities
285 * @return ROK - success
288 * ****************************************************************/
289 PUBLIC S16 RlcDuappProcUeCreateReq(Pst *pst, CkwCfgInfo *ueCfg)
295 for(idx = 0; idx < ueCfg->numEnt; idx++)
297 ueCfg->entCfg[idx].cfgType = CKW_CFG_ADD;
300 KwUiCkwCfgReq(pst, ueCfg);
301 } /* RlcDuappUeCreateReq */
306 * Handler for configuring RLC entities.
309 * This function is used by RRC to configure(add/delete/modify)
310 * one or more RLC entities.
312 * @param[in] pst - Post structure
313 * @param[in] spId - Serive Provider ID
314 * @param[in] cfg - Configuration information for one or more RLC entities.
321 PUBLIC S16 KwUiCkwCfgReq
328 //PUBLIC S16 KwUiCkwCfgReq(pst, spId, cfg)
329 PUBLIC S16 KwUiCkwCfgReq(pst, cfg)
337 KwUlCfgTmpData *cfgTmpData;
339 static U32 transCount;
344 #if (ERRCLASS & ERRCLS_INT_PAR)
345 if (pst->dstInst >= KW_MAX_RLC_INSTANCES)
347 KW_PST_FREE(pst->region, pst->pool, cfg, sizeof(CkwCfgInfo));
351 tKwCb = KW_GET_KWCB(pst->dstInst);
355 RLOG1(L_DEBUG, "spId(%d)", spId);
357 /* Validate SAP ID under ERRORCLS */
358 KW_VALDATE_SAP(tKwCb, spId, (&(tKwCb->u.ulCb->ckwSap)), ret);
361 KW_PST_FREE(pst->region, pst->pool, cfg, sizeof(CkwCfgInfo));
366 KW_ALLOC(tKwCb, cfgTmpData, sizeof (KwUlCfgTmpData));
368 if (cfgTmpData == NULLP)
370 KW_PST_FREE(pst->region, pst->pool, cfg, sizeof(CkwCfgInfo));
375 cfgTmpData->uprLyrTransId = cfg->transId; /*Save User TransId*/
376 cfgTmpData->transId = ++transCount; /*Generate new TransId*/
377 cfg->transId = cfgTmpData->transId;
378 cfgTmpData->cfgInfo = cfg;
380 if (kwDbmAddUlTransaction(tKwCb, cfgTmpData) != ROK)
382 RLOG0(L_ERROR, "Addition to UL transId Lst Failed");
383 KW_PST_FREE(pst->region, pst->pool, cfg, sizeof(CkwCfgInfo));
388 kwHdlUiCkwUlCfgReq(tKwCb, cfgTmpData, cfg);
390 KwUlUdxCfgReq(&(KW_GET_UDX_SAP(tKwCb)->pst),KW_GET_UDX_SAP(tKwCb)->spId,cfg);
397 * Handler to change the UeId
400 * This primitive is used by RRC to change the UeId for the existing UE
403 * @param[in] pst - Point to the pst structure
404 * @param[in] spId - The ID of the service provider SAP in the RLC layer
405 * @param[in] transId - Transaction ID. This field uniquily identifies
406 * transaction between RRC and RLC
407 * @param[in] ueInfo - Old UE Id Info for which the change request has come
408 * @param[in] newUeInfo - New UE Id Info for existing UE context
415 PUBLIC S16 KwUiCkwUeIdChgReq
424 PUBLIC S16 KwUiCkwUeIdChgReq(pst, spId, transId, ueInfo, newUeInfo)
429 CkwUeInfo *newUeInfo;
434 KwUlCfgTmpData *cfgTmpData = NULLP;
436 TRC3(KwUiCkwUeIdChgReq)
440 #if (ERRCLASS & ERRCLS_INT_PAR)
441 if (pst->dstInst >= KW_MAX_RLC_INSTANCES)
448 tKwCb = KW_GET_KWCB(pst->dstInst);
450 RLOG_ARG2(L_DEBUG,DBG_CELLID,newUeInfo->cellId,
451 "KwUiCkwUeIdChgReq(pst, spId(%d), transId(%ld))",
455 RLOG_ARG2(L_DEBUG,DBG_CELLID,newUeInfo->cellId,
456 "KwUiCkwUeIdChgReq(pst, spId(%d), transId(%d))\n",
461 KW_ALLOC(tKwCb, cfgTmpData, sizeof (KwUlCfgTmpData));
468 cfgTmpData->transId = transId;
469 cfgTmpData->ueInfo = ueInfo;
470 cfgTmpData->newUeInfo = newUeInfo;
472 if (kwDbmAddUlTransaction(tKwCb, cfgTmpData))
474 RLOG0(L_ERROR, "Addition to UL transId Lst Failed");
482 /* there was an error in the processing, free up all the memory
483 * that was passed and could have been allocated in this function
485 /* Freeing from proper region */
486 KW_PST_FREE(pst->region, pst->pool, newUeInfo, sizeof(CkwUeInfo));
487 KW_PST_FREE(pst->region, pst->pool, ueInfo, sizeof(CkwUeInfo));
491 KW_FREE(tKwCb, cfgTmpData, sizeof (KwUlCfgTmpData));
496 if(ROK != kwCfgValidateUeIdChng(tKwCb,ueInfo,newUeInfo,cfgTmpData))
498 RLOG_ARG0(L_ERROR,DBG_CELLID,cfgTmpData->ueInfo->cellId,
499 "Validation Failure for UeId change");
502 KwUlUdxUeIdChgReq(&(KW_GET_UDX_SAP(tKwCb)->pst),
503 KW_GET_UDX_SAP(tKwCb)->spId,
514 * Handler for Configuration Request
516 * @param[in] gCb RLC Instance Control Block
517 * @param[in] cfgTmpData Configuration stored in Transaction Block
518 * @param[in] cfg Configuration block
525 PUBLIC Void kwHdlUiCkwUlCfgReq
528 KwUlCfgTmpData *cfgTmpData,
532 PUBLIC Void kwHdlUiCkwUlCfgReq(gCb, cfgTmpData, cfg)
534 KwUlCfgTmpData *cfgTmpData;
540 TRC3(kwHdlUiCkwUlCfgReq)
542 cfgTmpData->ueId = cfg->ueId;
543 cfgTmpData->cellId = cfg->cellId;
544 for (idx = 0; idx < cfg->numEnt; idx++)
546 cfgTmpData->cfgEntData[idx].entUlCfgCfm.status.status = CKW_CFG_CFM_OK;
547 cfgTmpData->cfgEntData[idx].entUlCfgCfm.rbId = cfg->entCfg[idx].rbId;
548 cfgTmpData->cfgEntData[idx].entUlCfgCfm.rbType = cfg->entCfg[idx].rbType;
549 switch(cfg->entCfg[idx].cfgType)
556 if(cfg->entCfg[idx].dir & KW_DIR_UL)
558 /* Configuration is for UL , thus validating */
559 if(ROK != kwCfgValidateUlRb(gCb,
561 &cfgTmpData->cfgEntData[idx],
564 RLOG_ARG2(L_ERROR,DBG_UEID, cfgTmpData->ueId,
565 "CELLID [%u]:Validation Failure for UL RB [%d]",
566 cfg->cellId,cfg->entCfg[idx].rbId);
567 cfgTmpData->cfgEntData[idx].entUlCfgCfm.status.status = CKW_CFG_CFM_NOK;
568 /*Validation is getting failed so no need to do configuration at DL.
569 *Set dir as UL, so that no configuration is done at DL */
570 cfg->entCfg[idx].dir = KW_DIR_UL;
573 if(cfg->entCfg[idx].dir == KW_DIR_UL)
575 /*If the configuration is for UL only then apply it */
576 if (cfgTmpData->cfgEntData[idx].entUlCfgCfm.status.status == CKW_CFG_CFM_OK)
580 &cfgTmpData->cfgEntData[idx],
586 case CKW_CFG_REESTABLISH:
588 if(cfg->entCfg[idx].dir & KW_DIR_UL)
590 if(ROK != kwCfgValidateReEstRb(gCb,
594 &cfgTmpData->cfgEntData[idx]))
596 RLOG_ARG2(L_ERROR,DBG_UEID,cfg->ueId,
597 "CellID [%u]:Validation Failure for Reest UL RB [%d]",
598 cfg->cellId,cfg->entCfg[idx].rbId);
599 cfgTmpData->cfgEntData[idx].entUlCfgCfm.status.status = CKW_CFG_CFM_NOK;
600 /* Setting dir as UL, so that no configuration is done at DL */
601 cfg->entCfg[idx].dir = KW_DIR_UL;
605 if(cfg->entCfg[idx].dir == KW_DIR_UL)
607 /*If the configuration is for UL only then apply it */
608 if (cfgTmpData->cfgEntData[idx].entUlCfgCfm.status.status == CKW_CFG_CFM_OK)
610 kwCfgApplyReEstUlRb(gCb,
614 &cfgTmpData->cfgEntData[idx]);
619 case CKW_CFG_DELETE_UE :
621 if(ROK != kwCfgValidateDelUlUe(gCb,
623 &cfgTmpData->cfgEntData[idx],
626 RLOG_ARG1(L_ERROR,DBG_CELLID,cfg->cellId,
627 "UL UEID [%d]:Validation Failure",
629 cfgTmpData->cfgEntData[idx].entUlCfgCfm.status.status = CKW_CFG_CFM_NOK;
630 /* Setting dir as UL, so that no configuration is done at DL */
631 cfg->entCfg[idx].dir = KW_DIR_UL;
635 case CKW_CFG_DELETE_CELL :
637 if(ROK != kwCfgValidateDelUlCell(gCb,
640 &cfgTmpData->cfgEntData[idx],
643 RLOG_ARG0(L_ERROR,DBG_CELLID,cfg->cellId,
644 "Del UL Cell Validation Failure");
645 cfgTmpData->cfgEntData[idx].entUlCfgCfm.status.status = CKW_CFG_CFM_NOK;
646 /* Setting dir as UL, so that no configuration is done at DL */
647 cfg->entCfg[idx].dir = KW_DIR_UL;
657 /*****************************************************************************
659 ****************************************************************************/
662 * Handler for binding the RLC upper layer service user with
666 * This function is used by RLC user to request for binding to
667 * RLC.This function is called by the KWU interface to bind
668 * RLC's SAP (identified by spId) with the service user's
669 * SAP (identified by suId).
671 * @param[in] pst Post structure
672 * @param[in] suId Service user SAP ID
673 * @param[in] spId Service provider ID
681 PUBLIC S16 KwUiKwuBndReq
688 PUBLIC S16 KwUiKwuBndReq (pst, suId, spId)
694 KwKwuSapCb *kwuSap; /* SAP Config Block */
699 #if (ERRCLASS & ERRCLS_INT_PAR)
700 if (pst->dstInst >= KW_MAX_RLC_INSTANCES)
705 tKwCb = KW_GET_KWCB(pst->dstInst);
706 RLOG2(L_DEBUG, "KwUiKwuBndReq(pst, spId(%d), suId(%d))", spId, suId);
708 /* Validation of input parameters */
709 #if (ERRCLASS & ERRCLS_INT_PAR)
710 if(!((spId < (S16) tKwCb->genCfg.maxKwuSaps) && (spId >=0)))
712 RLOG0(L_ERROR,"Invalid spId");
713 KW_SEND_SAPID_ALARM(tKwCb,spId, LKW_EVENT_KWU_BND_REQ, LCM_CAUSE_INV_SAP);
718 /* Get Sap control block */
719 kwuSap = (tKwCb->genCfg.rlcMode == LKW_RLC_MODE_DL) ?
720 (tKwCb->u.dlCb->kwuDlSap + spId):
721 (tKwCb->u.ulCb->kwuUlSap + spId);
723 /* Take action based on the current state of the SAP */
724 switch(kwuSap->state)
726 /* SAP is configured but not bound */
730 /* copy bind configuration parameters in sap */
732 kwuSap->pst.dstProcId = pst->srcProcId;
733 kwuSap->pst.dstEnt = pst->srcEnt;
734 kwuSap->pst.dstInst = pst->srcInst;
736 /* Update the State */
737 kwuSap->state = KW_SAP_BND;
739 RLOG1(L_DEBUG, "KwUiKwuBndReq: state (%d)", kwuSap->state);
744 /* Sap is already bound check source, destination Entity and Proc Id */
745 if (kwuSap->pst.dstProcId != pst->srcProcId ||
746 kwuSap->pst.dstEnt != pst->srcEnt ||
747 kwuSap->pst.dstInst != pst->srcInst ||
748 kwuSap->suId != suId)
750 KW_SEND_SAPID_ALARM(tKwCb,
752 LKW_EVENT_KWU_BND_REQ,
753 LCM_CAUSE_INV_PAR_VAL);
754 RLOG1(L_ERROR,"RLC Mode [%d] : KWU SAP already Bound",
755 tKwCb->genCfg.rlcMode);
756 KwUiKwuBndCfm(&(kwuSap->pst), kwuSap->suId, CM_BND_NOK);
764 #if (ERRCLASS & ERRCLS_INT_PAR)
765 RLOG1(L_ERROR,"RLC Mode [%d]:Invalid KWU SAP State in Bind Req",
766 tKwCb->genCfg.rlcMode);
767 KW_SEND_SAPID_ALARM(tKwCb,
769 LKW_EVENT_KWU_BND_REQ,
770 LCM_CAUSE_INV_STATE);
771 #endif /* ERRCLASS & ERRCLS_INT_PAR */
772 KwUiKwuBndCfm(&(kwuSap->pst), kwuSap->suId, CM_BND_NOK);
776 KwUiKwuBndCfm(&(kwuSap->pst), kwuSap->suId, CM_BND_OK);
783 * Handler for unbinding the RLC upper layer service user with
787 * This function is used by RLC user to request for unbinding
788 * with RLC.This function is called by the KWU interface to
791 * @param[in] pst Post structure
792 * @param[in] spId Service provider SAP ID
793 * @param[in] reason Reason for Unbinding
800 PUBLIC S16 KwUiKwuUbndReq
807 PUBLIC S16 KwUiKwuUbndReq(pst, spId, reason)
813 KwKwuSapCb *kwuSap; /* KWU SAP control block */
818 #if (ERRCLASS & ERRCLS_INT_PAR)
819 if ((pst->dstInst >= KW_MAX_RLC_INSTANCES) ||
820 (spId >= (S16) kwCb[pst->dstInst]->genCfg.maxKwuSaps) ||
827 tKwCb = KW_GET_KWCB(pst->dstInst);
829 RLOG2(L_DEBUG, "spId(%d), reason(%d)",
833 /* Get Sap control block */
834 kwuSap = (tKwCb->genCfg.rlcMode == LKW_RLC_MODE_DL) ?
835 (tKwCb->u.dlCb->kwuDlSap + spId):
836 (tKwCb->u.ulCb->kwuUlSap + spId);
838 kwuSap->state = KW_SAP_CFG;
844 * @brief Handler for receiving the data(SDU) from upper layer.
847 * This function is used by RLC service user (PDCP) to
848 * transfer data (SDU) to RLC.
850 * @param[in] pst Post structure
851 * @param[in] spId Service Provider SAP ID
852 * @param[in] datreq Data Request Information
853 * @param[in] mBuf Data Buffer (SDU)
860 PUBLIC S16 KwUiKwuDatReq
864 KwuDatReqInfo *datReq,
868 PUBLIC S16 KwUiKwuDatReq(pst, spId, datReq, mBuf)
871 KwuDatReqInfo *datReq;
875 S16 ret = ROK; /* Return Value */
876 KwDlRbCb *rbCb; /* RB Control Block */
877 KwKwuSapCb *kwuSap; /* SAP Config Block */
882 #if (ERRCLASS & ERRCLS_INT_PAR)
883 if ((pst->dstInst >= KW_MAX_RLC_INSTANCES) ||
884 (spId >= (S16) kwCb[pst->dstInst]->genCfg.maxKwuSaps) ||
892 tKwCb = KW_GET_KWCB(pst->dstInst);
894 /* Get Sap control block */
895 kwuSap = tKwCb->u.dlCb->kwuDlSap + spId;
897 /* Validate SAP ID under ERRORCLS */
898 KW_VALDATE_SAP(tKwCb,spId, kwuSap, ret);
906 kwDbmFetchDlRbCbByRbId(tKwCb, &datReq->rlcId, &rbCb);
909 RLOG_ARG2(L_WARNING, DBG_UEID,datReq->rlcId.ueId, "CellId[%u]:DL RbId [%d] not found",
910 datReq->rlcId.cellId,datReq->rlcId.rbId);
916 /* kw005.201 update the spId received in datReq to update statistics */
917 rbCb->kwuSapId = spId;
918 /* Dispatch according to mode of the rbCb */
923 /* Verify the user */
924 if (pst->srcEnt != ENTNH)
926 /* kw002.201 Freeing from proper region */
927 KW_SHRABL_STATIC_BUF_FREE(pst->region, pst->pool, datReq,
928 sizeof(KwuDatReqInfo));
934 kwTmmQSdu(tKwCb,rbCb, datReq, mBuf);
935 /* kw005.201 ccpu00117318, updated statistics */
941 kwUmmQSdu(tKwCb,rbCb, datReq, mBuf);
943 /* kw005.201 ccpu00117318, updated statistics */
949 kwAmmQSdu(tKwCb,rbCb, mBuf, datReq);
950 /* kw005.201 ccpu00117318, updated statistics */
956 RLOG0(L_ERROR, "Invalid RB Mode");
966 * Handler for discarding a SDU.
969 * This function is used by RLC AM and RLC UM entities.
970 * This function is called by the service user to discard a particular
971 * RLC SDU if it is present in the SDU queue of the RB control block
972 * and if it is not mapped to any PDU.
974 * @param[in] pst Post structure
975 * @param[in] spId Service Provider SAP ID
976 * @param[in] discSdu SDU discard Information
983 PUBLIC S16 KwUiKwuDiscSduReq
987 KwuDiscSduInfo *discSdu
990 PUBLIC S16 KwUiKwuDiscSduReq(pst, spId, discSdu)
993 KwuDiscSduInfo *discSdu;
996 KW_SHRABL_STATIC_BUF_FREE(pst->region, pst->pool, discSdu, sizeof(KwuDiscSduInfo));
1000 /********************************************************************30**
1002 **********************************************************************/