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 - Configuration Manager file
25 Desc: It contains the following configuraiton primtives
33 *********************************************************************21*/
34 static const char* RLOG_MODULE_NAME="CFG";
35 static int RLOG_MODULE_ID=2048;
36 static int RLOG_FILE_ID=192;
38 @brief RLC Uplink Configuration Module
42 /* header (.h) include files */
43 #include "envopt.h" /* environment options */
44 #include "envdep.h" /* environment dependent */
45 #include "envind.h" /* environment independent */
47 #include "gen.h" /* general */
48 #include "ssi.h" /* system services */
49 #include "cm5.h" /* common timer defines */
50 #include "cm_tkns.h" /* common tokens defines */
51 #include "cm_mblk.h" /* common memory allocation library defines */
52 #include "cm_llist.h" /* common link list defines */
53 #include "cm_hash.h" /* common hash list defines */
54 #include "cm_lte.h" /* common LTE defines */
55 #include "lkw.h" /* LKW defines */
56 #include "ckw.h" /* CKW defines */
57 #include "kwu.h" /* KWU defines */
58 #include "rgu.h" /* RGU defines */
59 #include "kw_err.h" /* RLC error options */
60 #include "kw_env.h" /* RLC environment options */
61 #include "kw.h" /* RLC defines */
64 /* extern (.x) include files */
65 #include "gen.x" /* general */
66 #include "ssi.x" /* system services */
68 #include "cm5.x" /* common timer library */
69 #include "cm_tkns.x" /* common tokens */
70 #include "cm_mblk.x" /* common memory allocation */
71 #include "cm_llist.x" /* common link list */
72 #include "cm_hash.x" /* common hash list */
73 #include "cm_lte.x" /* common LTE includes */
74 #include "cm_lib.x" /* common memory allocation library */
75 #include "lkw.x" /* LKW */
76 #include "ckw.x" /* CKW */
77 #include "kwu.x" /* KWU */
78 #include "rgu.x" /* RGU */
84 #include "l2_tenb_stats.x" /* Total EnodeB Stats declarations */
87 PUBLIC S16 kwValidateRbCfgParams (KwCb *gCb, CmLteRnti ueId, CmLteCellId cellId,
88 CkwEntCfgInfo *cfgToValidate, CmStatus *status);
89 #define KW_MODULE KW_DBGMASK_CFG
93 * @brief Handle modification of UE ID for L2 Meas data structs
96 * @param[in] ueId ue ID
103 PRIVATE S16 kwHdlMeasUlUeIdChg(KwCb *gCb, U8 cellId,U8 oldUeId, U8 newUeId)
105 KwL2MeasCb *measCb = NULLP;
109 for(cntr = 0; cntr < LKW_MAX_L2MEAS; cntr++)
111 measCb = &(gCb->u.ulCb->kwL2Cb.kwL2EvtCb[cntr].measCb);
113 if( measCb->measType & LKW_L2MEAS_UL_IP)
116 for(ueIdx = 0; ueIdx < measCb->val.ipThMeas.numUes; ueIdx++)
118 if((measCb->val.ipThMeas.ueInfoLst[ueIdx].ueId) == oldUeId)
120 measCb->val.ipThMeas.ueInfoLst[ueIdx].ueId = newUeId;
131 * @brief Handler to delete an UE's L2 Meas ctxt
134 * @param[in] ueId ue ID
141 PRIVATE S16 kwDelFrmUlL2Meas(KwCb *gCb, U8 cellId,U8 ueId)
143 KwL2MeasCb *measCb = NULLP;
147 for(cntr = 0; cntr < LKW_MAX_L2MEAS; cntr++)
149 measCb = &(gCb->u.ulCb->kwL2Cb.kwL2EvtCb[cntr].measCb);
152 if( measCb->measType & LKW_L2MEAS_UL_IP)
155 for(ueIdx = 0; ueIdx < measCb->val.ipThMeas.numUes; ueIdx++)
157 if((measCb->val.ipThMeas.ueInfoLst[ueIdx].ueId) == ueId)
159 measCb->val.ipThMeas.ueInfoLst[ueIdx].isValid = FALSE;
160 if (measCb->val.ipThMeas.numUes-1 == ueIdx)
162 measCb->val.ipThMeas.numUes--;
172 S16 ret; /* Return value */
173 KwUlUeCb *ueCb = NULL;
175 for (myIdx = 0; myIdx < measCb->val.ipThMeas.numUes; myIdx++)
178 ret = kwDbmFetchUlUeCb(gCb, measCb->val.ipThMeas.ueInfoLst[myIdx].ueId, cellId, &ueCb);
189 PRIVATE S16 kwAddToUlL2Meas(KwCb *gCb, KwUlRbCb *kwRbCb,U8 cellId,U8 ueId)
191 KwL2MeasCb *measCb = NULLP;
197 #ifndef XEON_SPECIFIC_CHANGES
198 U8 freeIdx = gCb->genCfg.maxUe;
200 U16 freeIdx = LKW_MAX_UE;
203 for(cntr = 0; cntr < LKW_MAX_L2MEAS; cntr++)
205 measCb = &(gCb->u.ulCb->kwL2Cb.kwL2EvtCb[cntr].measCb);
207 freeIdx = gCb->genCfg.maxUe;
209 if(measCb->measType & LKW_L2MEAS_ACT_UE )
211 for(cntr1 =0;cntr1<measCb->val.nonIpThMeas.numQci;cntr1++)
213 if(measCb->val.nonIpThMeas.qci[cntr1] != kwRbCb->qci)
215 measCb->val.nonIpThMeas.qci[cntr1] = kwRbCb->qci;
216 gCb->u.ulCb->kwL2Cb.measOn[kwRbCb->qci] |=measCb->measType;
222 if(((kwRbCb->rbL2Cb.measOn & measCb->measType) == LKW_L2MEAS_NONE))
224 #ifdef LTE_L2_MEAS_RLC
225 if (measCb->measType & LKW_L2MEAS_ACT_UE)
227 if((kwRbCb->mode == CM_LTE_MODE_UM) &&
228 (kwRbCb->dir & KW_DIR_DL ))
230 if (kwRbCb->m.um.umDl.sduQ.count)
232 if (kwRbCb->ueCb->numActRb[kwRbCb->qci] == 0)
234 kwRbCb->ueCb->numActRb[kwRbCb->qci]++;
235 gCb->u.ulCb->kwL2Cb.numActUe[kwRbCb->qci]++;
239 else if (kwRbCb->mode == CM_LTE_MODE_AM)
241 if ((kwRbCb->m.am.amDl.cntrlBo) ||
242 (kwRbCb->m.am.amDl.retxBo) ||
243 (kwRbCb->m.am.amDl.bo))
245 if (kwRbCb->ueCb->numActRb[kwRbCb->qci] == 0)
247 kwRbCb->ueCb->numActRb[kwRbCb->qci]++;
248 gCb->u.ulCb->kwL2Cb.numActUe[kwRbCb->qci]++;
255 if((measCb->measType & LKW_L2MEAS_UL_IP))
258 for(ueIdx = 0; ueIdx < measCb->val.ipThMeas.numUes; ueIdx++)
260 if ((freeIdx == gCb->genCfg.maxUe) &&
261 (measCb->val.ipThMeas.ueInfoLst[ueIdx].isValid == FALSE))
266 if((measCb->val.ipThMeas.ueInfoLst[ueIdx].ueId) == ueId)
272 if (ueIdx == measCb->val.ipThMeas.numUes)
274 if (gCb->genCfg.maxUe == measCb->val.ipThMeas.numUes)
278 if (gCb->genCfg.maxUe == freeIdx)
280 measCb->val.ipThMeas.numUes++;
286 measCb->val.ipThMeas.ueInfoLst[ueIdx].isValid = TRUE;
287 cmMemset((U8 *)&measCb->val.ipThMeas.ueInfoLst[ueIdx].measData[0],0x00,(sizeof(KwL2Cntr) *LKW_MAX_QCI));
288 measCb->val.ipThMeas.ueInfoLst[ueIdx].numQci = 0;
290 measCb->val.ipThMeas.ueInfoLst[ueIdx].ueId = ueId;
291 measCb->val.ipThMeas.ueInfoLst[ueIdx].cellId = cellId;
292 numQci = &(measCb->val.ipThMeas.ueInfoLst[ueIdx].numQci);
294 for (qciIdx =0; qciIdx < *numQci; qciIdx++)
296 if (measCb->val.ipThMeas.ueInfoLst[ueIdx].qci[qciIdx] == kwRbCb->qci)
302 if (qciIdx == *numQci)
304 measCb->val.ipThMeas.ueInfoLst[ueIdx].qci[qciIdx] = kwRbCb->qci;
308 kwUtlPlcMeasDatInL2Sts(&measCb->val.ipThMeas.ueInfoLst[ueIdx].measData[kwRbCb->qci],
309 &kwRbCb->rbL2Cb, measCb->measType);
311 kwRbCb->rbL2Cb.measOn |= measCb->measType;
315 #endif /*LTE_L2_MEAS*/
319 * This primitive fills the RbCb
321 * @param [in] gCb - RLC Instance Control Block
322 * @param [out] rbCb - RB Control Block
323 * @param [out] ueCb - UE Control Block
324 * @param [in] entCfg - RLC Entity configuration
331 PRIVATE S16 kwCfgFillUlRbCb
336 CkwEntCfgInfo *entCfg
339 PRIVATE S16 kwCfgFillUlRbCb(gCb,rbCb, ueCb, entCfg)
343 CkwEntCfgInfo *entCfg;
346 TRC3(kwCfgFillUlRbCb)
348 RLOG_ARG3(L_DEBUG,DBG_UEID,rbCb->rlcId.ueId,
349 "kwCfgFillRbCb(cellId(%d), rbId(%d), rbType(%d))",
354 /* Initialize according to entMode */
355 switch (entCfg->entMode)
359 rbCb->lch.lChId = entCfg->lCh[0].lChId;
360 rbCb->lch.lChType = entCfg->lCh[0].type;
361 rbCb->dir = entCfg->dir;
366 rbCb->lch.lChId = entCfg->lCh[0].lChId;
367 rbCb->lch.lChType = entCfg->lCh[0].type;
369 rbCb->dir = entCfg->dir;
371 rbCb->m.umUl.snLen = entCfg->m.umInfo.ul.snLen;
373 /* the bitmask for SN = 10 is 0x3ff and for SN = 5 is 0x1f */
374 rbCb->m.umUl.modBitMask = (rbCb->m.umUl.umWinSz << 1) - 1;
376 rbCb->m.umUl.reOrdTmrInt =
377 entCfg->m.umInfo.ul.reOrdTmr;
378 cmInitTimers(&(rbCb->m.umUl.reOrdTmr), 1);
379 ueCb->lCh[rbCb->lch.lChId - 1].ulRbCb = rbCb;
384 /* Down Link Information
385 * indx = 1 as Up Link */
386 rbCb->lch.lChId = entCfg->lCh[1].lChId;
387 rbCb->lch.lChType = entCfg->lCh[1].type;
388 rbCb->dir = KW_DIR_BOTH;
390 rbCb->m.amUl.staProhTmrInt = entCfg->m.amInfo.ul.staProhTmr;
391 rbCb->m.amUl.reOrdTmrInt = entCfg->m.amInfo.ul.reOrdTmr;
393 rbCb->m.amUl.snLen = entCfg->m.amInfo.ul.snLen; /* 5GNR */
395 if(KW_AM_CFG_12BIT_SN_LEN == rbCb->m.amUl.snLen)
397 rbCb->m.amUl.snModMask = (1 << KW_SN_LEN_12BITS) - 1; /* 5GNR */
401 rbCb->m.amUl.snModMask = (1 << KW_SN_LEN_18BITS) - 1; /* 5GNR */
404 cmInitTimers(&(rbCb->m.amUl.reOrdTmr), 1);
405 cmInitTimers(&(rbCb->m.amUl.staProhTmr), 1);
407 rbCb->m.amUl.vrMr = rbCb->m.amUl.rxNext + (KW_AM_GET_WIN_SZ(rbCb->m.amUl.snLen));
409 ueCb->lCh[rbCb->lch.lChId - 1].ulRbCb = rbCb;
415 RLOG_ARG2(L_ERROR,DBG_UEID,rbCb->rlcId.ueId,
416 "INVALID RB Mode cellId(%d), rbId(%d)",
422 rbCb->mode = entCfg->entMode;
429 * @brief This primitive Initializes the RB Cb
431 * @param [in] gCb - RLC Instance Control Block
432 * @param [out] rbCb - RB Control Block
433 * @param [in] ptr - Void pointer
434 * @param [in] entCfg - Entity Configuration
441 PRIVATE S16 kwCfgUpdateUlRb
446 CkwEntCfgInfo *entCfg
449 PRIVATE S16 kwCfgUpdateUlRb(gCb,rbCb, ptr, entCfg)
453 CkwEntCfgInfo *entCfg;
456 TRC3(kwCfgUpdateUlRb)
462 KwUlCellCb *cellCb = (KwUlCellCb *)ptr;
463 rbCb->dir = entCfg->dir;
464 rbCb->lch.lChId = entCfg->lCh[0].lChId;
465 rbCb->lch.lChType = entCfg->lCh[0].type;
467 cellCb->lCh[rbCb->lch.lChId - 1].ulRbCb = rbCb;
472 KwUlUeCb *ueCb = (KwUlUeCb *)ptr;
473 ueCb->lCh[rbCb->lch.lChId - 1].ulRbCb = NULLP;
474 kwCfgFillUlRbCb(gCb,rbCb, ueCb, entCfg);
479 KwUlUeCb *ueCb = (KwUlUeCb *)ptr;
481 ueCb->lCh[rbCb->lch.lChId - 1].ulRbCb = NULLP;
482 ueCb->lCh[entCfg->lCh[1].lChId - 1].ulRbCb = rbCb;
484 rbCb->lch.lChId = entCfg->lCh[1].lChId;
485 rbCb->lch.lChType = entCfg->lCh[1].type;
486 rbCb->m.amUl.staProhTmrInt = entCfg->m.amInfo.ul.staProhTmr;
487 rbCb->m.amUl.reOrdTmrInt = entCfg->m.amInfo.ul.reOrdTmr;
491 RETVALUE(CKW_CFG_REAS_NONE);
497 * This primitive validates uplink Add RB Configuration and reserve memory
500 * @param [in] gCb - RLC Instance Control Block
501 * @param [in] ueId - UE Identifier
502 * @param [in] cellId - CELL Identifier
503 * @param [in] cfgToValidate - Entity Configuration needs to be validated.
504 * @param [out] status - status of configuration
511 PUBLIC S16 kwValidateRbCfgParams
516 CkwEntCfgInfo *cfgToValidate,
520 PUBLIC S16 kwValidateRbCfgParams(gCb,ueId, cellId, cfgToValidate, status)
524 CkwEntCfgInfo *cfgToValidate;
530 status->reason = CKW_CFG_REAS_CELL_UNKWN;
533 if ((cfgToValidate->rguSapId >= gCb->genCfg.maxRguSaps) || (cfgToValidate->rguSapId < 0))
535 KWDBGP_ERROR(gCb, "kwValidateRbCfgParams ueId (%u) cellId (%u) Invalid rguSapId (%d))\n",
536 ueId, cellId, cfgToValidate->rguSapId);
537 status->reason = CKW_CFG_REAS_INVALID_RGUSAP;
541 if((CKW_CFG_ADD == cfgToValidate->cfgType) ||
542 (CKW_CFG_MODIFY == cfgToValidate->cfgType))
544 /* Validate LChId for UM and AM modes */
545 if ((cfgToValidate->lCh[0].lChId <= 0) ||
546 ((cfgToValidate->entMode == CM_LTE_MODE_AM) &&
547 (cfgToValidate->lCh[1].lChId <= 0)))
549 status->reason = CKW_CFG_REAS_INVALID_LCHID;
552 if((cfgToValidate->entMode == CM_LTE_MODE_UM) &&
553 (cfgToValidate->m.umInfo.ul.snLen != KW_UM_CFG_5BIT_SN_LEN) &&
554 (cfgToValidate->m.umInfo.ul.snLen != KW_UM_CFG_10BIT_SN_LEN))
556 RLOG_ARG2(L_ERROR,DBG_UEID,ueId,
557 "CellId[%u]:UM Mode RB[%d],Invalid SN Len[%d]",
559 cfgToValidate->m.umInfo.ul.snLen);
560 status->reason = CKW_CFG_REAS_INVALID_SNLEN;
563 /* Process Adding new RB */
566 if(cfgToValidate->rbId >= KW_MAX_RB_PER_CELL)
568 status->reason = CKW_CFG_REAS_RB_UNKWN;
572 if ((cfgToValidate->lCh[0].type != CM_LTE_LCH_CCCH) &&
573 (cfgToValidate->entMode != CM_LTE_MODE_TM))
575 status->reason= (cfgToValidate->entMode != CM_LTE_MODE_TM)? CKW_CFG_REAS_RB_MODE_MIS:
576 CKW_CFG_REAS_LCHTYPE_MIS;
582 if (!(KW_VALIDATE_UE_RBID(cfgToValidate->rbType, cfgToValidate->rbId)))
584 status->reason = CKW_CFG_REAS_RB_UNKWN;
588 if(cfgToValidate->entMode == CM_LTE_MODE_TM)
590 status->reason = CKW_CFG_REAS_LCHTYPE_MIS;
593 if (!(((cfgToValidate->lCh[0].type == CM_LTE_LCH_DCCH) &&
594 (cfgToValidate->entMode != CM_LTE_MODE_UM))||
595 (cfgToValidate->lCh[0].type == CM_LTE_LCH_DTCH)) )
597 status->reason = CKW_CFG_REAS_RB_MODE_MIS;
602 else /* cfgType is CKW_CFG_DELETE */
606 if(cfgToValidate->rbId >= KW_MAX_RB_PER_CELL)
608 status->reason = CKW_CFG_REAS_RB_UNKWN;
615 if (!(KW_VALIDATE_UE_RBID(cfgToValidate->rbType, cfgToValidate->rbId)))
617 status->reason = CKW_CFG_REAS_RB_UNKWN;
628 * This primitive validates uplink Add RB Configuration and reserve memory
631 * @param [in] gCb - RLC Instance Control Block
632 * @param [in] cfgToValidate - Entity Configuration needs to be validated.
633 * @param [out] cfgEntData - Configuration Temporary Data Entity
634 * @param [out] cfgTmpData - Configuration Temporary Data
641 PUBLIC S16 kwCfgValidateUlRb
644 CkwEntCfgInfo *cfgToValidate,
645 KwUlEntTmpData *cfgEntData,
646 KwUlCfgTmpData *cfgTmpData
649 PUBLIC S16 kwCfgValidateUlRb(gCb,cfgToValidate, cfgEntData, cfgTmpData)
651 CkwEntCfgInfo *cfgToValidate;
652 KwUlEntTmpData *cfgEntData;
653 KwUlCfgTmpData *cfgTmpData;
656 TRC3(kwCfgValidateUlRb)
658 RLOG_ARG2(L_DEBUG,DBG_UEID,cfgTmpData->ueId,
659 "cellId(%d), cfgType(%d)",
661 cfgToValidate->cfgType);
663 if(ROK != kwValidateRbCfgParams(gCb,
667 &cfgEntData->entUlCfgCfm.status))
672 cfgEntData->entUlCfgCfm.status.reason = CKW_CFG_REAS_NONE;
673 switch(cfgToValidate->cfgType)
677 if (cfgTmpData->ueId == 0)
679 /* Cell Cb is added if it not present , it is not roll backed if the
680 * configuration fails */
681 kwDbmFetchUlCellCb(gCb,cfgTmpData->cellId, &cfgTmpData->cellCb);
682 if(!cfgTmpData->cellCb)
684 /* cell cb does not exist we need to create a new one */
685 KW_ALLOC(gCb,cfgTmpData->cellCb, sizeof(KwUlCellCb));
686 if(!cfgTmpData->cellCb)
688 RLOG_ARG1(L_FATAL,DBG_UEID,cfgTmpData->ueId,
689 "Memory allocation failure CELLID:%d",
691 cfgEntData->entUlCfgCfm.status.reason = CKW_CFG_REAS_CELL_CREAT_FAIL;
694 kwDbmAddUlCellCb(gCb, cfgTmpData->cellId, cfgTmpData->cellCb);
698 if (( cfgTmpData->cellCb->rbCb[cfgToValidate->rbId] != NULLP))
700 cfgEntData->entUlCfgCfm.status.reason = CKW_CFG_REAS_RB_PRSNT;;
705 KW_ALLOC(gCb,cfgEntData->rbCb, sizeof (KwUlRbCb));
706 if (!cfgEntData->rbCb)
708 cfgEntData->entUlCfgCfm.status.reason = CKW_CFG_REAS_RB_CREAT_FAIL;
714 /* Ue Cb is added if it not present , it is not roll backed if the
715 * configuration fails */
716 kwDbmFetchUlUeCb(gCb,cfgTmpData->ueId, cfgTmpData->cellId, &cfgTmpData->ueCb);
717 if(!cfgTmpData->ueCb)
719 KW_ALLOC(gCb,cfgTmpData->ueCb, sizeof(KwUlUeCb));
720 if(!cfgTmpData->ueCb)
722 RLOG_ARG1(L_FATAL,DBG_UEID,cfgTmpData->ueId,
723 "Memory allocation failure CELLID:%d",
725 cfgEntData->entUlCfgCfm.status.reason = CKW_CFG_REAS_UE_CREAT_FAIL;
728 kwDbmAddUlUeCb(gCb, cfgTmpData->ueId, cfgTmpData->cellId, cfgTmpData->ueCb);
732 KW_DBM_GET_RBCB_FROM_UECB(cfgToValidate->rbId,
733 cfgToValidate->rbType,
736 if(cfgEntData->rbCb != NULLP)
738 cfgEntData->entUlCfgCfm.status.reason = CKW_CFG_REAS_RB_PRSNT;;
742 KW_ALLOC(gCb,cfgEntData->rbCb, sizeof (KwUlRbCb));
743 if (!cfgEntData->rbCb)
745 cfgEntData->entUlCfgCfm.status.reason = CKW_CFG_REAS_RB_CREAT_FAIL;
749 /*Allocating the memory for receive buffer */
750 if(CM_LTE_MODE_UM == cfgToValidate->entMode)
755 cfgEntData->rbCb->m.umUl.umWinSz = KW_POWER(2,
756 ((cfgToValidate->m.umInfo.ul.snLen *5)-1));
757 winLen = cfgEntData->rbCb->m.umUl.umWinSz << 1;
759 cfgEntData->rbCb->m.umUl.recBuf,
760 (winLen * sizeof(KwUmRecBuf*)));
762 else if(CM_LTE_MODE_AM == cfgToValidate->entMode)
767 cfgEntData->rbCb->m.amUl.recBufLst,
768 (KW_RCV_BUF_BIN_SIZE * sizeof(CmLListCp )));
769 for(hashIndex = 0; hashIndex < KW_RCV_BUF_BIN_SIZE; hashIndex++)
771 cmLListInit(&(cfgEntData->rbCb->m.amUl.recBufLst[hashIndex]));
780 if (cfgTmpData->ueId == 0)
782 /* Try to get the CellCb if it already exists */
783 kwDbmFetchUlCellCb(gCb,cfgTmpData->cellId, &cfgTmpData->cellCb);
784 if(!cfgTmpData->cellCb)
786 RLOG_ARG1(L_ERROR, DBG_CELLID,cfgTmpData->cellId,
787 "CellCb not found UEID:%d",
789 /*how can a modify request come for a cell which does not exist*/
790 cfgEntData->entUlCfgCfm.status.reason = CKW_CFG_REAS_CELL_UNKWN;
794 cfgEntData->rbCb = cfgTmpData->cellCb->rbCb[cfgToValidate->rbId];
795 if (!cfgEntData->rbCb)
797 /* something is wrong the rbId for this cell does not exist */
798 cfgEntData->entUlCfgCfm.status.reason = CKW_CFG_REAS_RB_UNKWN;
805 kwDbmFetchUlUeCb(gCb,cfgTmpData->ueId, cfgTmpData->cellId, &cfgTmpData->ueCb);
806 if(!cfgTmpData->ueCb)
808 RLOG_ARG1(L_ERROR,DBG_CELLID, cfgTmpData->cellId,
809 "UeId [%d]: UeCb not found",
811 cfgEntData->entUlCfgCfm.status.reason = CKW_CFG_REAS_UE_UNKWN;
816 KW_DBM_GET_RBCB_FROM_UECB(cfgToValidate->rbId,
817 cfgToValidate->rbType,
820 if ( cfgEntData->rbCb == NULLP)
822 cfgEntData->entUlCfgCfm.status.reason = CKW_CFG_REAS_RB_UNKWN;
831 if(cfgToValidate->cfgType == CKW_CFG_MODIFY)
833 if(cfgToValidate->entMode != cfgEntData->rbCb->mode)
835 cfgEntData->entUlCfgCfm.status.reason = CKW_CFG_REAS_RB_MODE_MIS;
839 if(cfgToValidate->m.umInfo.ul.snLen != cfgEntData->rbCb->m.umUl.snLen)
841 cfgEntData->entUlCfgCfm.status.reason = CKW_CFG_REAS_SNLEN_MIS;
851 * This primitive roll back the RB Configuration
853 * @param [in] gCb - RLC Instance Control Block
854 * @param [in] ueId - UE Identifier
855 * @param [in] cfg - Configuration entity.
856 * @param [out] cfgEntData - Configuration Temporary Data Entity
863 PUBLIC S16 kwCfgRollBackUlRb
868 KwUlEntTmpData *cfgEntData
871 PUBLIC S16 kwCfgRollBackUlRb(gCb, cfg, cfgEntData)
876 KwUlEntTmpData *cfgEntData;
880 TRC3(kwCfgRollBackUlRb)
882 if(CKW_CFG_ADD == cfg->cfgType)
884 if(CM_LTE_MODE_UM == cfg->entMode)
887 cfgEntData->rbCb->m.umUl.recBuf,
888 (cfgEntData->rbCb->m.umUl.umWinSz << 1) * sizeof(KwUmRecBuf*));
890 else if(CM_LTE_MODE_AM == cfg->entMode)
893 KW_FREE(gCb,cfgEntData->rbCb->m.amUl.recBufLst, (KW_RCV_BUF_BIN_SIZE * sizeof(CmLListCp)));
896 KW_FREE(gCb,cfgEntData->rbCb, sizeof(KwUlRbCb));
905 * This primitive apply RB Configuration.
907 * @param [in] gCb - RLC Instance Control Block
908 * @param [in] cfgToAply - Configuration to be applied
909 * @param [out] cfgEntData - Configuration Temporary Data Entity
910 * @param [out] cfgTmpData - Configuration Temporary Data
917 PUBLIC Void kwCfgApplyUlRb
920 CkwEntCfgInfo *cfgToAply,
921 KwUlEntTmpData *cfgEntData,
922 KwUlCfgTmpData *cfgTmpData
925 PUBLIC Void kwCfgApplyUlRb(gCb, cfgToApply, cfgEntData, cfgTmpData)
928 CkwEntCfgInfo *cfgToAply;
929 KwUlEntTmpData *cfgEntData;
930 KwUlCfgTmpData *cfgTmpData;
936 switch(cfgToAply->cfgType)
940 /* copy the RB Cb into UeCb */
941 cfgEntData->rbCb->rlcId.rbId = cfgToAply->rbId;
942 if (cfgTmpData->ueId == 0)
944 cfgTmpData->cellCb->rbCb[cfgToAply->rbId] = cfgEntData->rbCb;
945 cfgTmpData->cellCb->lCh[cfgToAply->lCh[0].lChId -1].ulRbCb = cfgEntData->rbCb;
949 if(cfgToAply->rbType == CM_LTE_SRB)
951 cfgTmpData->ueCb->srbCb[cfgToAply->rbId] = cfgEntData->rbCb;
955 cfgTmpData->ueCb->drbCb[cfgToAply->rbId] = cfgEntData->rbCb;
959 KW_LMM_RB_STS_INC(gCb);
961 cfgEntData->rbCb->rlcId.cellId = cfgTmpData->cellId;
962 cfgEntData->rbCb->rlcId.ueId = cfgTmpData->ueId;
963 cfgEntData->rbCb->rlcId.rbType = cfgToAply->rbType;
964 cfgEntData->rbCb->inst = gCb->init.inst;
973 cfgEntData->rbCb->qci = cfgToAply->qci;
974 cfgEntData->rbCb->ueCb = cfgTmpData->ueCb;
975 if (cfgToAply->lCh[1].type == CM_LTE_LCH_DTCH)
978 kwAddToUlL2Meas(gCb, cfgEntData->rbCb,
979 cfgTmpData->cellId,cfgTmpData->ueId);
981 #endif /* LTE_L2_MEAS */
986 if(cfgTmpData->ueId == 0)
990 (void *)cfgTmpData->cellCb,
997 (void*)cfgTmpData->ueCb,
1002 case CKW_CFG_DELETE:
1004 if (cfgTmpData->ueId == 0)
1006 cfgTmpData->cellCb->rbCb[cfgToAply->rbId] = NULLP;
1007 cfgTmpData->cellCb->lCh[cfgEntData->rbCb->lch.lChId - 1].ulRbCb =
1012 cfgTmpData->ueCb->lCh[cfgEntData->rbCb->lch.lChId - 1].ulRbCb =
1015 /* Free the Buffers of RbCb */
1016 if( CM_LTE_MODE_UM == cfgEntData->rbCb->mode )
1018 kwUmmFreeUlRbCb(gCb, cfgEntData->rbCb);
1020 else if(CM_LTE_MODE_AM == cfgEntData->rbCb->mode)
1022 kwAmmFreeUlRbCb(gCb,cfgEntData->rbCb);
1025 /* Assign NULLP to rbCb in rbCbLst */
1026 if ( cfgToAply->rbType == CM_LTE_SRB )
1028 cfgTmpData->ueCb->srbCb[cfgToAply->rbId] = NULLP;
1032 cfgTmpData->ueCb->drbCb[cfgToAply->rbId] = NULLP;
1036 KW_FREE(gCb,cfgEntData->rbCb, sizeof(KwUlRbCb));
1038 KW_LMM_RB_STS_DEC(gCb);
1048 * This primitive validates uplink Delete UE request
1051 * @param [in] gCb - RLC Instance Control Block
1052 * @param [in] cfgToValidate - Entity Configuration to be validated.
1053 * @param [out] cfgEntData - Configuration Temporary Data Entity
1054 * @param [out] cfgTmpData - Configuration Temporary Data
1061 PUBLIC S16 kwCfgValidateDelUlUe
1064 CkwEntCfgInfo *cfgToValidate,
1065 KwUlEntTmpData *cfgEntData,
1066 KwUlCfgTmpData *cfgTmpData
1069 PUBLIC S16 kwCfgValidateDelUlUe(gCb,cfgToValidate, cfgEntData,cfgTmpData)
1071 CkwEntCfgInfo *cfgToValidate;
1072 KwUlEntTmpData *cfgEntData;
1073 KwUlCfgTmpData *cfgTmpData;
1076 TRC3(kwCfgValidateDelUlUe)
1078 RLOG_ARG2(L_DEBUG,DBG_UEID,cfgTmpData->ueId,
1079 "cellId(%d), cfgType(%d)",
1080 cfgTmpData->cellId,cfgToValidate->cfgType);
1082 /* Check for ueId is present or not */
1083 if ( cfgTmpData->ueId == 0 )
1085 cfgEntData->entUlCfgCfm.status.reason = CKW_CFG_REAS_UE_UNKWN;;
1086 RLOG_ARG1(L_ERROR,DBG_UEID,cfgTmpData->ueId,
1087 "UeId is 0 for CELLID;%d",
1088 cfgTmpData->cellId);
1093 if(ROK != kwDbmFetchUlUeCb(gCb,cfgTmpData->ueId, cfgTmpData->cellId, &cfgTmpData->ueCb))
1095 RLOG_ARG1(L_ERROR,DBG_CELLID, cfgTmpData->cellId,
1096 "UeId [%d]: UeCb not found",
1098 cfgEntData->entUlCfgCfm.status.reason = CKW_CFG_REAS_UE_UNKWN;;
1107 * This primitive apply Uplink Delete Ue request
1109 * @param [in] gCb - RLC Instance Control Block
1110 * @param [in] cfgTmpData - Configuration Temporary Data
1116 PUBLIC Void kwCfgApplyDelUlUe
1119 KwUlCfgTmpData *cfgTmpData
1122 PUBLIC Void kwCfgApplyDelUlUe(gCb, cfgTmpData)
1125 KwUlCfgTmpData *cfgTmpData;
1129 TRC3(kwCfgApplyDelUlUe)
1132 kwDelFrmUlL2Meas(gCb,cfgTmpData->cellId,cfgTmpData->ueId);
1134 kwDbmDelUlUeCb(gCb,cfgTmpData->ueCb, FALSE);
1141 * This primitive validates uplink Delete UE request
1144 * @param [in] gCb - RLC Instance Control Block
1145 * @param [in] ueId - UE Identifier
1146 * @param [in] cfgToValidate - Entity Configuration to be done.
1147 * @param [in] cfgEntData - Configuration Temporary Data Entity
1148 * @param [in] cfgTmpData - Configuration Temporary Data
1155 PUBLIC S16 kwCfgValidateDelUlCell
1159 CkwEntCfgInfo *cfgToValidate,
1160 KwUlEntTmpData *cfgEntData,
1161 KwUlCfgTmpData *cfgTmpData
1164 PUBLIC S16 kwCfgValidateDelUlCell(gCb, cellId, cfgToValidate, cfgTmpData)
1167 CkwEntCfgInfo *cfgToValidate;
1168 KwUlEntTmpData *cfgEntData;
1169 KwUlCfgTmpData *cfgTmpData;
1172 TRC3(kwCfgValidateDelUlCell)
1174 RLOG_ARG1(L_DEBUG,DBG_CELLID,cellId ,"cfgType(%d)",
1175 cfgToValidate->cfgType);
1177 cfgTmpData->cellCb = NULLP;
1179 /* Check for cellId is present or not */
1182 cfgEntData->entUlCfgCfm.status.reason = CKW_CFG_REAS_CELL_UNKWN;;
1183 RLOG_ARG0(L_ERROR,DBG_CELLID,cellId , "CellId is 0");
1188 kwDbmFetchUlCellCb(gCb,cellId, &cfgTmpData->cellCb);
1189 if (!cfgTmpData->cellCb)
1191 cfgEntData->entUlCfgCfm.status.reason = CKW_CFG_REAS_CELL_UNKWN;;
1192 RLOG_ARG0(L_ERROR, DBG_CELLID,cellId, "CellCb not found");
1201 * This primitive apply Uplink Delete Ue request
1203 * @param [in] gCb - RLC Instance Control Block
1204 * @param [in] cfgEntData - Temporary Data maintained for a transaction
1210 PUBLIC Void kwCfgApplyDelUlCell
1213 KwUlCfgTmpData *cfgInfo
1216 PUBLIC Void kwCfgApplyDelUlCell(gCb, cfgEntData)
1219 KwUlCfgTmpData *cfgInfo;
1223 TRC3(kwCfgApplyDelUlCell)
1225 kwDbmDelUlCellCb(gCb,cfgInfo->cellCb);
1231 * This primitive validates reestablishment of RB.
1233 * @param [in] gCb - RLC Instance Control Block
1234 * @param [in] ueId - UE Identifier
1235 * @param [in] cellId - CELL Identifier
1236 * @param [in] cfgToValidate - Entity Configuration to be done.
1237 * @param [out] cfgEntData - Configuration Temporary Data Entity
1244 PUBLIC S16 kwCfgValidateReEstRb
1249 CkwEntCfgInfo *cfgToValidate,
1250 KwUlEntTmpData *cfgEntData
1253 PUBLIC S16 kwCfgValidateReEstRb(gCb,ueId, cellId, cfgToValidate, cfgEntData)
1257 CkwEntCfgInfo *cfgToValidate;
1258 KwUlEntTmpData *cfgEntData;
1261 CmLteRlcId rlcId; /* RLC Identifier */
1262 TRC3(kwCfgValidateReEstRb)
1264 RLOG_ARG2(L_DEBUG, DBG_UEID,ueId,
1265 "cellId(%d) RBID:%d",
1267 cfgToValidate->rbId);
1271 rlcId.cellId = cellId;
1272 rlcId.rbId = cfgToValidate->rbId;
1273 rlcId.rbType = cfgToValidate->rbType;
1275 kwDbmFetchUlRbCbByRbId(gCb,&rlcId, &cfgEntData->rbCb);
1276 if (cfgEntData->rbCb == NULLP)
1278 RLOG_ARG2(L_WARNING, DBG_UEID,ueId,
1279 "CellId [%u]: rbId [%d] not found",
1281 cfgToValidate->rbId);
1282 cfgEntData->entUlCfgCfm.status.reason = CKW_CFG_REAS_RB_UNKWN;
1293 * This primitive apply reestablishment of RB.
1295 * @param [in] gCb - RLC Instance Control Block
1296 * @param [in] ueId - UE Identifier
1297 * @param [in] cellId - CELL Identifier
1298 * @param [in] sndReEstInd - ReEstablish Indication Flag
1299 * @param [in] cfgEntData - Configuration Temporary Data Entity
1305 PUBLIC Void kwCfgApplyReEstUlRb
1311 KwUlEntTmpData *cfgEntData
1314 PUBLIC Void kwCfgApplyReEstUlRb(gCb, ueId, cellId, sndReEstInd, cfgEntData)
1320 KwUlEntTmpData *cfgEntData;
1324 CmLteRlcId rlcId; /* RLC Identifier */
1325 TRC3(kwCfgApplyReEstUlRb)
1328 rlcId.cellId = cellId;
1329 rlcId.rbId = cfgEntData->entUlCfgCfm.rbId;
1330 rlcId.rbType = cfgEntData->entUlCfgCfm.rbType;
1331 cfgEntData->rbCb->rlcId.ueId = ueId;
1332 switch (cfgEntData->rbCb->mode)
1334 case CM_LTE_MODE_TM:
1336 kwTmmUlReEstablish(gCb,cfgEntData->rbCb);
1340 case CM_LTE_MODE_UM:
1342 kwUmmUlReEstablish(gCb,&rlcId,cfgEntData->rbCb);
1346 case CM_LTE_MODE_AM:
1348 kwAmmUlReEstablish(gCb,rlcId,sndReEstInd,cfgEntData->rbCb);
1357 * This primitive validates reestablishment of RB.
1359 * @param [in] gCb - RLC Instance Control Block
1360 * @param [in] ueInfo - UE Identifier
1361 * @param [in] newUeInfo - CELL Identifier
1362 * @param [in] cfgTmpData - Configuration Temporary Data
1369 PUBLIC S16 kwCfgValidateUeIdChng
1373 CkwUeInfo *newUeInfo,
1374 KwUlCfgTmpData *cfgTmpData
1377 PUBLIC S16 kwCfgValidateUeIdChng(gCb,ueInfo,newUeInfo,cfgTmpData)
1380 CkwUeInfo *newUeInfo;
1381 KwUlCfgTmpData *cfgTmpData;
1385 TRC3(kwCfgValidateUeIdChng)
1387 #define CFM_STATUS cfgTmpData->cfgEntData[0].entUlCfgCfm.status
1388 if ( (ueInfo->ueId == newUeInfo->ueId) &&
1389 (ueInfo->cellId == newUeInfo->cellId))
1391 CFM_STATUS.reason = CKW_CFG_REAS_SAME_UEID;
1392 CFM_STATUS.status = CKW_CFG_CFM_NOK;
1396 if(ROK == kwDbmFetchUlUeCb(gCb,newUeInfo->ueId, newUeInfo->cellId, &ueCb))
1398 RLOG_ARG1(L_ERROR, DBG_CELLID, newUeInfo->cellId,
1399 "NewUeId[%d]:ueCb already exists",
1401 CFM_STATUS.reason = CKW_CFG_REAS_UE_EXISTS;
1402 CFM_STATUS.status = CKW_CFG_CFM_NOK;
1406 if(ROK != kwDbmFetchUlUeCb(gCb,ueInfo->ueId, ueInfo->cellId,
1409 RLOG_ARG1(L_ERROR,DBG_CELLID, ueInfo->cellId,
1410 "UeId [%d]: UeCb not found",
1412 CFM_STATUS.reason = CKW_CFG_REAS_UE_UNKWN;
1413 CFM_STATUS.status = CKW_CFG_CFM_NOK;
1424 * This primitive apply reestablishment of RB.
1426 * @param [in] gCb - RLC Instance Control Block
1427 * @param [in] ueInfo - UE Identifier
1428 * @param [in] newUeInfo - CELL Identifier
1429 * @param [in] cfgTmpData - Configuration Temporary Data
1435 PUBLIC Void kwCfgApplyUlUeIdChng
1439 CkwUeInfo *newUeInfo,
1440 KwUlCfgTmpData *cfgTmpData
1443 PUBLIC Void kwCfgApplyUlUeIdChng(gCb, ueId, cellId, cfgTmpData)
1447 CkwUeInfo *newUeInfo,
1448 KwUlCfgTmpData *cfgTmpData;
1452 TRC3(kwCfgApplyUlUeIdChng)
1455 kwHdlMeasUlUeIdChg(gCb, ueInfo->cellId, ueInfo->ueId, newUeInfo->ueId);
1457 cmHashListDelete(&(gCb->u.ulCb->ueLstCp), (PTR) cfgTmpData->ueCb);
1458 /* update the hash key with new values */
1459 cfgTmpData->ueCb->ueId = newUeInfo->ueId;
1460 cfgTmpData->ueCb->cellId =newUeInfo->cellId;
1461 if(ROK != cmHashListInsert(&(gCb->u.ulCb->ueLstCp),
1462 (PTR)cfgTmpData->ueCb,
1463 (U8 *)&(cfgTmpData->ueCb->ueId),
1464 (U16) sizeof(CmLteRnti)))
1467 RLOG_ARG1(L_ERROR,DBG_CELLID,newUeInfo->cellId,
1468 "UeId[%u] HashList Insertion Failed",
1474 /********************************************************************30**
1477 **********************************************************************/