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 "common_def.h"
44 #include "lkw.h" /* LKW defines */
45 #include "ckw.h" /* CKW defines */
46 #include "kwu.h" /* KWU defines */
47 #include "rgu.h" /* RGU defines */
48 #include "kw_err.h" /* RLC error options */
49 #include "kw_env.h" /* RLC environment options */
50 #include "kw.h" /* RLC defines */
53 /* extern (.x) include files */
54 #include "lkw.x" /* LKW */
55 #include "ckw.x" /* CKW */
56 #include "kwu.x" /* KWU */
57 #include "rgu.x" /* RGU */
63 #include "l2_tenb_stats.x" /* Total EnodeB Stats declarations */
66 PUBLIC S16 kwValidateRbCfgParams (RlcCb *gCb, CmLteRnti ueId, CmLteCellId cellId,
67 RlcEntCfgInfo *cfgToValidate, CmStatus *status);
68 #define KW_MODULE KW_DBGMASK_CFG
72 * @brief Handle modification of UE ID for L2 Meas data structs
75 * @param[in] ueId ue ID
82 PRIVATE S16 kwHdlMeasUlUeIdChg(RlcCb *gCb, U8 cellId,U8 oldUeId, U8 newUeId)
84 KwL2MeasCb *measCb = NULLP;
88 for(cntr = 0; cntr < LKW_MAX_L2MEAS; cntr++)
90 measCb = &(gCb->u.ulCb->kwL2Cb.kwL2EvtCb[cntr].measCb);
92 if( measCb->measType & LKW_L2MEAS_UL_IP)
95 for(ueIdx = 0; ueIdx < measCb->val.ipThMeas.numUes; ueIdx++)
97 if((measCb->val.ipThMeas.ueInfoLst[ueIdx].ueId) == oldUeId)
99 measCb->val.ipThMeas.ueInfoLst[ueIdx].ueId = newUeId;
110 * @brief Handler to delete an UE's L2 Meas ctxt
113 * @param[in] ueId ue ID
120 PRIVATE S16 kwDelFrmUlL2Meas(RlcCb *gCb, U8 cellId,U8 ueId)
122 KwL2MeasCb *measCb = NULLP;
126 for(cntr = 0; cntr < LKW_MAX_L2MEAS; cntr++)
128 measCb = &(gCb->u.ulCb->kwL2Cb.kwL2EvtCb[cntr].measCb);
131 if( measCb->measType & LKW_L2MEAS_UL_IP)
134 for(ueIdx = 0; ueIdx < measCb->val.ipThMeas.numUes; ueIdx++)
136 if((measCb->val.ipThMeas.ueInfoLst[ueIdx].ueId) == ueId)
138 measCb->val.ipThMeas.ueInfoLst[ueIdx].isValid = FALSE;
139 if (measCb->val.ipThMeas.numUes-1 == ueIdx)
141 measCb->val.ipThMeas.numUes--;
151 S16 ret; /* Return value */
152 RlcUlUeCb *ueCb = NULL;
154 for (myIdx = 0; myIdx < measCb->val.ipThMeas.numUes; myIdx++)
157 ret = kwDbmFetchUlUeCb(gCb, measCb->val.ipThMeas.ueInfoLst[myIdx].ueId, cellId, &ueCb);
168 PRIVATE S16 kwAddToUlL2Meas(RlcCb *gCb, RlcUlRbCb *kwRbCb,U8 cellId,U8 ueId)
170 KwL2MeasCb *measCb = NULLP;
176 #ifndef XEON_SPECIFIC_CHANGES
177 U8 freeIdx = gCb->genCfg.maxUe;
179 U16 freeIdx = LKW_MAX_UE;
182 for(cntr = 0; cntr < LKW_MAX_L2MEAS; cntr++)
184 measCb = &(gCb->u.ulCb->kwL2Cb.kwL2EvtCb[cntr].measCb);
186 freeIdx = gCb->genCfg.maxUe;
188 if(measCb->measType & LKW_L2MEAS_ACT_UE )
190 for(cntr1 =0;cntr1<measCb->val.nonIpThMeas.numQci;cntr1++)
192 if(measCb->val.nonIpThMeas.qci[cntr1] != kwRbCb->qci)
194 measCb->val.nonIpThMeas.qci[cntr1] = kwRbCb->qci;
195 gCb->u.ulCb->kwL2Cb.measOn[kwRbCb->qci] |=measCb->measType;
201 if(((kwRbCb->rbL2Cb.measOn & measCb->measType) == LKW_L2MEAS_NONE))
203 #ifdef LTE_L2_MEAS_RLC
204 if (measCb->measType & LKW_L2MEAS_ACT_UE)
206 if((kwRbCb->mode == CM_LTE_MODE_UM) &&
207 (kwRbCb->dir & KW_DIR_DL ))
209 if (kwRbCb->m.um.umDl.sduQ.count)
211 if (kwRbCb->ueCb->numActRb[kwRbCb->qci] == 0)
213 kwRbCb->ueCb->numActRb[kwRbCb->qci]++;
214 gCb->u.ulCb->kwL2Cb.numActUe[kwRbCb->qci]++;
218 else if (kwRbCb->mode == CM_LTE_MODE_AM)
220 if ((kwRbCb->m.am.amDl.cntrlBo) ||
221 (kwRbCb->m.am.amDl.retxBo) ||
222 (kwRbCb->m.am.amDl.bo))
224 if (kwRbCb->ueCb->numActRb[kwRbCb->qci] == 0)
226 kwRbCb->ueCb->numActRb[kwRbCb->qci]++;
227 gCb->u.ulCb->kwL2Cb.numActUe[kwRbCb->qci]++;
234 if((measCb->measType & LKW_L2MEAS_UL_IP))
237 for(ueIdx = 0; ueIdx < measCb->val.ipThMeas.numUes; ueIdx++)
239 if ((freeIdx == gCb->genCfg.maxUe) &&
240 (measCb->val.ipThMeas.ueInfoLst[ueIdx].isValid == FALSE))
245 if((measCb->val.ipThMeas.ueInfoLst[ueIdx].ueId) == ueId)
251 if (ueIdx == measCb->val.ipThMeas.numUes)
253 if (gCb->genCfg.maxUe == measCb->val.ipThMeas.numUes)
257 if (gCb->genCfg.maxUe == freeIdx)
259 measCb->val.ipThMeas.numUes++;
265 measCb->val.ipThMeas.ueInfoLst[ueIdx].isValid = TRUE;
266 cmMemset((U8 *)&measCb->val.ipThMeas.ueInfoLst[ueIdx].measData[0],0x00,(sizeof(KwL2Cntr) *LKW_MAX_QCI));
267 measCb->val.ipThMeas.ueInfoLst[ueIdx].numQci = 0;
269 measCb->val.ipThMeas.ueInfoLst[ueIdx].ueId = ueId;
270 measCb->val.ipThMeas.ueInfoLst[ueIdx].cellId = cellId;
271 numQci = &(measCb->val.ipThMeas.ueInfoLst[ueIdx].numQci);
273 for (qciIdx =0; qciIdx < *numQci; qciIdx++)
275 if (measCb->val.ipThMeas.ueInfoLst[ueIdx].qci[qciIdx] == kwRbCb->qci)
281 if (qciIdx == *numQci)
283 measCb->val.ipThMeas.ueInfoLst[ueIdx].qci[qciIdx] = kwRbCb->qci;
287 kwUtlPlcMeasDatInL2Sts(&measCb->val.ipThMeas.ueInfoLst[ueIdx].measData[kwRbCb->qci],
288 &kwRbCb->rbL2Cb, measCb->measType);
290 kwRbCb->rbL2Cb.measOn |= measCb->measType;
294 #endif /*LTE_L2_MEAS*/
298 * This primitive fills the RbCb
300 * @param [in] gCb - RLC Instance Control Block
301 * @param [out] rbCb - RB Control Block
302 * @param [out] ueCb - UE Control Block
303 * @param [in] entCfg - RLC Entity configuration
310 PRIVATE S16 rlcCfgFillUlRbCb
315 RlcEntCfgInfo *entCfg
318 PRIVATE S16 rlcCfgFillUlRbCb(gCb,rbCb, ueCb, entCfg)
322 RlcEntCfgInfo *entCfg;
325 TRC3(rlcCfgFillUlRbCb)
327 RLOG_ARG3(L_DEBUG,DBG_UEID,rbCb->rlcId.ueId,
328 "rlcCfgFillRbCb(cellId(%d), rbId(%d), rbType(%d))",
333 /* Initialize according to entMode */
334 switch (entCfg->entMode)
338 rbCb->lch.lChId = entCfg->lCh[0].lChId;
339 rbCb->lch.lChType = entCfg->lCh[0].type;
340 rbCb->dir = entCfg->dir;
345 rbCb->lch.lChId = entCfg->lCh[0].lChId;
346 rbCb->lch.lChType = entCfg->lCh[0].type;
348 rbCb->dir = entCfg->dir;
350 rbCb->m.umUl.snLen = entCfg->m.umInfo.ul.snLen;
352 /* the bitmask for SN = 10 is 0x3ff and for SN = 5 is 0x1f */
353 rbCb->m.umUl.modBitMask = (rbCb->m.umUl.umWinSz << 1) - 1;
355 rbCb->m.umUl.reOrdTmrInt =
356 entCfg->m.umInfo.ul.reOrdTmr;
357 cmInitTimers(&(rbCb->m.umUl.reOrdTmr), 1);
358 ueCb->lCh[rbCb->lch.lChId - 1].ulRbCb = rbCb;
363 /* Down Link Information
364 * indx = 1 as Up Link */
365 rbCb->lch.lChId = entCfg->lCh[1].lChId;
366 rbCb->lch.lChType = entCfg->lCh[1].type;
367 rbCb->dir = KW_DIR_BOTH;
369 rbCb->m.amUl.staProhTmrInt = entCfg->m.amInfo.ul.staProhTmr;
370 rbCb->m.amUl.reOrdTmrInt = entCfg->m.amInfo.ul.reOrdTmr;
372 rbCb->m.amUl.snLen = entCfg->m.amInfo.ul.snLen; /* 5GNR */
374 if(KW_AM_CFG_12BIT_SN_LEN == rbCb->m.amUl.snLen)
376 rbCb->m.amUl.snModMask = (1 << KW_SN_LEN_12BITS) - 1; /* 5GNR */
380 rbCb->m.amUl.snModMask = (1 << KW_SN_LEN_18BITS) - 1; /* 5GNR */
383 cmInitTimers(&(rbCb->m.amUl.reOrdTmr), 1);
384 cmInitTimers(&(rbCb->m.amUl.staProhTmr), 1);
386 rbCb->m.amUl.vrMr = rbCb->m.amUl.rxNext + (KW_AM_GET_WIN_SZ(rbCb->m.amUl.snLen));
388 ueCb->lCh[rbCb->lch.lChId - 1].ulRbCb = rbCb;
394 RLOG_ARG2(L_ERROR,DBG_UEID,rbCb->rlcId.ueId,
395 "INVALID RB Mode cellId(%d), rbId(%d)",
401 rbCb->mode = entCfg->entMode;
408 * @brief This primitive Initializes the RB Cb
410 * @param [in] gCb - RLC Instance Control Block
411 * @param [out] rbCb - RB Control Block
412 * @param [in] ptr - Void pointer
413 * @param [in] entCfg - Entity Configuration
420 PRIVATE S16 rlcCfgUpdateUlRb
425 RlcEntCfgInfo *entCfg
428 PRIVATE S16 rlcCfgUpdateUlRb(gCb,rbCb, ptr, entCfg)
432 RlcEntCfgInfo *entCfg;
435 TRC3(rlcCfgUpdateUlRb)
441 RlcUlCellCb *cellCb = (RlcUlCellCb *)ptr;
442 rbCb->dir = entCfg->dir;
443 rbCb->lch.lChId = entCfg->lCh[0].lChId;
444 rbCb->lch.lChType = entCfg->lCh[0].type;
446 cellCb->lCh[rbCb->lch.lChId - 1].ulRbCb = rbCb;
451 RlcUlUeCb *ueCb = (RlcUlUeCb *)ptr;
452 ueCb->lCh[rbCb->lch.lChId - 1].ulRbCb = NULLP;
453 rlcCfgFillUlRbCb(gCb,rbCb, ueCb, entCfg);
458 RlcUlUeCb *ueCb = (RlcUlUeCb *)ptr;
460 ueCb->lCh[rbCb->lch.lChId - 1].ulRbCb = NULLP;
461 ueCb->lCh[entCfg->lCh[1].lChId - 1].ulRbCb = rbCb;
463 rbCb->lch.lChId = entCfg->lCh[1].lChId;
464 rbCb->lch.lChType = entCfg->lCh[1].type;
465 rbCb->m.amUl.staProhTmrInt = entCfg->m.amInfo.ul.staProhTmr;
466 rbCb->m.amUl.reOrdTmrInt = entCfg->m.amInfo.ul.reOrdTmr;
470 return (CKW_CFG_REAS_NONE);
476 * This primitive validates uplink Add RB Configuration and reserve memory
479 * @param [in] gCb - RLC Instance Control Block
480 * @param [in] ueId - UE Identifier
481 * @param [in] cellId - CELL Identifier
482 * @param [in] cfgToValidate - Entity Configuration needs to be validated.
483 * @param [out] status - status of configuration
490 PUBLIC S16 kwValidateRbCfgParams
495 RlcEntCfgInfo *cfgToValidate,
499 PUBLIC S16 kwValidateRbCfgParams(gCb,ueId, cellId, cfgToValidate, status)
503 RlcEntCfgInfo *cfgToValidate;
509 status->reason = CKW_CFG_REAS_CELL_UNKWN;
512 if ((cfgToValidate->rguSapId >= gCb->genCfg.maxRguSaps) || (cfgToValidate->rguSapId < 0))
514 KWDBGP_ERROR(gCb, "kwValidateRbCfgParams ueId (%u) cellId (%u) Invalid rguSapId (%d))\n",
515 ueId, cellId, cfgToValidate->rguSapId);
516 status->reason = CKW_CFG_REAS_INVALID_RGUSAP;
520 if((CKW_CFG_ADD == cfgToValidate->cfgType) ||
521 (CKW_CFG_MODIFY == cfgToValidate->cfgType))
523 /* Validate LChId for UM and AM modes */
524 if ((cfgToValidate->lCh[0].lChId <= 0) ||
525 ((cfgToValidate->entMode == CM_LTE_MODE_AM) &&
526 (cfgToValidate->lCh[1].lChId <= 0)))
528 status->reason = CKW_CFG_REAS_INVALID_LCHID;
531 if((cfgToValidate->entMode == CM_LTE_MODE_UM) &&
532 (cfgToValidate->m.umInfo.ul.snLen != KW_UM_CFG_5BIT_SN_LEN) &&
533 (cfgToValidate->m.umInfo.ul.snLen != KW_UM_CFG_10BIT_SN_LEN))
535 RLOG_ARG2(L_ERROR,DBG_UEID,ueId,
536 "CellId[%u]:UM Mode RB[%d],Invalid SN Len[%d]",
538 cfgToValidate->m.umInfo.ul.snLen);
539 status->reason = CKW_CFG_REAS_INVALID_SNLEN;
542 /* Process Adding new RB */
545 if(cfgToValidate->rbId >= KW_MAX_RB_PER_CELL)
547 status->reason = CKW_CFG_REAS_RB_UNKWN;
551 if ((cfgToValidate->lCh[0].type != CM_LTE_LCH_CCCH) &&
552 (cfgToValidate->entMode != CM_LTE_MODE_TM))
554 status->reason= (cfgToValidate->entMode != CM_LTE_MODE_TM)? CKW_CFG_REAS_RB_MODE_MIS:
555 CKW_CFG_REAS_LCHTYPE_MIS;
561 if (!(KW_VALIDATE_UE_RBID(cfgToValidate->rbType, cfgToValidate->rbId)))
563 status->reason = CKW_CFG_REAS_RB_UNKWN;
567 if(cfgToValidate->entMode == CM_LTE_MODE_TM)
569 status->reason = CKW_CFG_REAS_LCHTYPE_MIS;
572 if (!(((cfgToValidate->lCh[0].type == CM_LTE_LCH_DCCH) &&
573 (cfgToValidate->entMode != CM_LTE_MODE_UM))||
574 (cfgToValidate->lCh[0].type == CM_LTE_LCH_DTCH)) )
576 status->reason = CKW_CFG_REAS_RB_MODE_MIS;
581 else /* cfgType is CKW_CFG_DELETE */
585 if(cfgToValidate->rbId >= KW_MAX_RB_PER_CELL)
587 status->reason = CKW_CFG_REAS_RB_UNKWN;
594 if (!(KW_VALIDATE_UE_RBID(cfgToValidate->rbType, cfgToValidate->rbId)))
596 status->reason = CKW_CFG_REAS_RB_UNKWN;
607 * This primitive validates uplink Add RB Configuration and reserve memory
610 * @param [in] gCb - RLC Instance Control Block
611 * @param [in] cfgToValidate - Entity Configuration needs to be validated.
612 * @param [out] cfgEntData - Configuration Temporary Data Entity
613 * @param [out] cfgTmpData - Configuration Temporary Data
620 PUBLIC S16 rlcCfgValidateUlRb
623 RlcEntCfgInfo *cfgToValidate,
624 RlcUlEntTmpData *cfgEntData,
625 RlcUlCfgTmpData *cfgTmpData
628 PUBLIC S16 rlcCfgValidateUlRb(gCb,cfgToValidate, cfgEntData, cfgTmpData)
630 RlcEntCfgInfo *cfgToValidate;
631 RlcUlEntTmpData *cfgEntData;
632 RlcUlCfgTmpData *cfgTmpData;
635 TRC3(rlcCfgValidateUlRb)
637 RLOG_ARG2(L_DEBUG,DBG_UEID,cfgTmpData->ueId,
638 "cellId(%d), cfgType(%d)",
640 cfgToValidate->cfgType);
642 if(ROK != kwValidateRbCfgParams(gCb,
646 &cfgEntData->entUlCfgCfm.status))
651 cfgEntData->entUlCfgCfm.status.reason = CKW_CFG_REAS_NONE;
652 switch(cfgToValidate->cfgType)
656 if (cfgTmpData->ueId == 0)
658 /* Cell Cb is added if it not present , it is not roll backed if the
659 * configuration fails */
660 kwDbmFetchUlCellCb(gCb,cfgTmpData->cellId, &cfgTmpData->cellCb);
661 if(!cfgTmpData->cellCb)
663 /* cell cb does not exist we need to create a new one */
664 RLC_ALLOC(gCb,cfgTmpData->cellCb, sizeof(RlcUlCellCb));
665 if(!cfgTmpData->cellCb)
667 RLOG_ARG1(L_FATAL,DBG_UEID,cfgTmpData->ueId,
668 "Memory allocation failure CELLID:%d",
670 cfgEntData->entUlCfgCfm.status.reason = CKW_CFG_REAS_CELL_CREAT_FAIL;
673 kwDbmAddUlCellCb(gCb, cfgTmpData->cellId, cfgTmpData->cellCb);
677 if (( cfgTmpData->cellCb->rbCb[cfgToValidate->rbId] != NULLP))
679 cfgEntData->entUlCfgCfm.status.reason = CKW_CFG_REAS_RB_PRSNT;;
684 RLC_ALLOC(gCb,cfgEntData->rbCb, sizeof (RlcUlRbCb));
685 if (!cfgEntData->rbCb)
687 cfgEntData->entUlCfgCfm.status.reason = CKW_CFG_REAS_RB_CREAT_FAIL;
693 /* Ue Cb is added if it not present , it is not roll backed if the
694 * configuration fails */
695 kwDbmFetchUlUeCb(gCb,cfgTmpData->ueId, cfgTmpData->cellId, &cfgTmpData->ueCb);
696 if(!cfgTmpData->ueCb)
698 RLC_ALLOC(gCb,cfgTmpData->ueCb, sizeof(RlcUlUeCb));
699 if(!cfgTmpData->ueCb)
701 RLOG_ARG1(L_FATAL,DBG_UEID,cfgTmpData->ueId,
702 "Memory allocation failure CELLID:%d",
704 cfgEntData->entUlCfgCfm.status.reason = CKW_CFG_REAS_UE_CREAT_FAIL;
707 kwDbmAddUlUeCb(gCb, cfgTmpData->ueId, cfgTmpData->cellId, cfgTmpData->ueCb);
711 KW_DBM_GET_RBCB_FROM_UECB(cfgToValidate->rbId,
712 cfgToValidate->rbType,
715 if(cfgEntData->rbCb != NULLP)
717 cfgEntData->entUlCfgCfm.status.reason = CKW_CFG_REAS_RB_PRSNT;;
721 RLC_ALLOC(gCb,cfgEntData->rbCb, sizeof (RlcUlRbCb));
722 if (!cfgEntData->rbCb)
724 cfgEntData->entUlCfgCfm.status.reason = CKW_CFG_REAS_RB_CREAT_FAIL;
728 /*Allocating the memory for receive buffer */
729 if(CM_LTE_MODE_UM == cfgToValidate->entMode)
734 cfgEntData->rbCb->m.umUl.umWinSz = KW_POWER(2,
735 ((cfgToValidate->m.umInfo.ul.snLen *5)-1));
736 winLen = cfgEntData->rbCb->m.umUl.umWinSz << 1;
738 cfgEntData->rbCb->m.umUl.recBuf,
739 (winLen * sizeof(KwUmRecBuf*)));
741 else if(CM_LTE_MODE_AM == cfgToValidate->entMode)
746 cfgEntData->rbCb->m.amUl.recBufLst,
747 (KW_RCV_BUF_BIN_SIZE * sizeof(CmLListCp )));
748 for(hashIndex = 0; hashIndex < KW_RCV_BUF_BIN_SIZE; hashIndex++)
750 cmLListInit(&(cfgEntData->rbCb->m.amUl.recBufLst[hashIndex]));
759 if (cfgTmpData->ueId == 0)
761 /* Try to get the CellCb if it already exists */
762 kwDbmFetchUlCellCb(gCb,cfgTmpData->cellId, &cfgTmpData->cellCb);
763 if(!cfgTmpData->cellCb)
765 RLOG_ARG1(L_ERROR, DBG_CELLID,cfgTmpData->cellId,
766 "CellCb not found UEID:%d",
768 /*how can a modify request come for a cell which does not exist*/
769 cfgEntData->entUlCfgCfm.status.reason = CKW_CFG_REAS_CELL_UNKWN;
773 cfgEntData->rbCb = cfgTmpData->cellCb->rbCb[cfgToValidate->rbId];
774 if (!cfgEntData->rbCb)
776 /* something is wrong the rbId for this cell does not exist */
777 cfgEntData->entUlCfgCfm.status.reason = CKW_CFG_REAS_RB_UNKWN;
784 kwDbmFetchUlUeCb(gCb,cfgTmpData->ueId, cfgTmpData->cellId, &cfgTmpData->ueCb);
785 if(!cfgTmpData->ueCb)
787 RLOG_ARG1(L_ERROR,DBG_CELLID, cfgTmpData->cellId,
788 "UeId [%d]: UeCb not found",
790 cfgEntData->entUlCfgCfm.status.reason = CKW_CFG_REAS_UE_UNKWN;
795 KW_DBM_GET_RBCB_FROM_UECB(cfgToValidate->rbId,
796 cfgToValidate->rbType,
799 if ( cfgEntData->rbCb == NULLP)
801 cfgEntData->entUlCfgCfm.status.reason = CKW_CFG_REAS_RB_UNKWN;
810 if(cfgToValidate->cfgType == CKW_CFG_MODIFY)
812 if(cfgToValidate->entMode != cfgEntData->rbCb->mode)
814 cfgEntData->entUlCfgCfm.status.reason = CKW_CFG_REAS_RB_MODE_MIS;
818 if(cfgToValidate->m.umInfo.ul.snLen != cfgEntData->rbCb->m.umUl.snLen)
820 cfgEntData->entUlCfgCfm.status.reason = CKW_CFG_REAS_SNLEN_MIS;
830 * This primitive roll back the RB Configuration
832 * @param [in] gCb - RLC Instance Control Block
833 * @param [in] ueId - UE Identifier
834 * @param [in] cfg - Configuration entity.
835 * @param [out] cfgEntData - Configuration Temporary Data Entity
842 PUBLIC S16 rlcCfgRollBackUlRb
847 RlcUlEntTmpData *cfgEntData
850 PUBLIC S16 rlcCfgRollBackUlRb(gCb, cfg, cfgEntData)
855 RlcUlEntTmpData *cfgEntData;
859 TRC3(rlcCfgRollBackUlRb)
861 if(CKW_CFG_ADD == cfg->cfgType)
863 if(CM_LTE_MODE_UM == cfg->entMode)
866 cfgEntData->rbCb->m.umUl.recBuf,
867 (cfgEntData->rbCb->m.umUl.umWinSz << 1) * sizeof(KwUmRecBuf*));
869 else if(CM_LTE_MODE_AM == cfg->entMode)
872 RLC_FREE(gCb,cfgEntData->rbCb->m.amUl.recBufLst, (KW_RCV_BUF_BIN_SIZE * sizeof(CmLListCp)));
875 RLC_FREE(gCb,cfgEntData->rbCb, sizeof(RlcUlRbCb));
884 * This primitive apply RB Configuration.
886 * @param [in] gCb - RLC Instance Control Block
887 * @param [in] cfgToAply - Configuration to be applied
888 * @param [out] cfgEntData - Configuration Temporary Data Entity
889 * @param [out] cfgTmpData - Configuration Temporary Data
896 PUBLIC Void rlcCfgApplyUlRb
899 RlcEntCfgInfo *cfgToAply,
900 RlcUlEntTmpData *cfgEntData,
901 RlcUlCfgTmpData *cfgTmpData
904 PUBLIC Void rlcCfgApplyUlRb(gCb, cfgToApply, cfgEntData, cfgTmpData)
907 RlcEntCfgInfo *cfgToAply;
908 RlcUlEntTmpData *cfgEntData;
909 RlcUlCfgTmpData *cfgTmpData;
913 TRC3(rlcCfgApplyUlRb)
915 switch(cfgToAply->cfgType)
919 /* copy the RB Cb into UeCb */
920 cfgEntData->rbCb->rlcId.rbId = cfgToAply->rbId;
921 if (cfgTmpData->ueId == 0)
923 cfgTmpData->cellCb->rbCb[cfgToAply->rbId] = cfgEntData->rbCb;
924 cfgTmpData->cellCb->lCh[cfgToAply->lCh[0].lChId -1].ulRbCb = cfgEntData->rbCb;
928 if(cfgToAply->rbType == CM_LTE_SRB)
930 cfgTmpData->ueCb->srbCb[cfgToAply->rbId] = cfgEntData->rbCb;
934 cfgTmpData->ueCb->drbCb[cfgToAply->rbId] = cfgEntData->rbCb;
938 KW_LMM_RB_STS_INC(gCb);
940 cfgEntData->rbCb->rlcId.cellId = cfgTmpData->cellId;
941 cfgEntData->rbCb->rlcId.ueId = cfgTmpData->ueId;
942 cfgEntData->rbCb->rlcId.rbType = cfgToAply->rbType;
943 cfgEntData->rbCb->inst = gCb->init.inst;
946 rlcCfgFillUlRbCb(gCb,
952 cfgEntData->rbCb->qci = cfgToAply->qci;
953 cfgEntData->rbCb->ueCb = cfgTmpData->ueCb;
954 if (cfgToAply->lCh[1].type == CM_LTE_LCH_DTCH)
957 kwAddToUlL2Meas(gCb, cfgEntData->rbCb,
958 cfgTmpData->cellId,cfgTmpData->ueId);
960 #endif /* LTE_L2_MEAS */
965 if(cfgTmpData->ueId == 0)
967 rlcCfgUpdateUlRb(gCb,
969 (void *)cfgTmpData->cellCb,
974 rlcCfgUpdateUlRb(gCb,
976 (void*)cfgTmpData->ueCb,
983 if (cfgTmpData->ueId == 0)
985 cfgTmpData->cellCb->rbCb[cfgToAply->rbId] = NULLP;
986 cfgTmpData->cellCb->lCh[cfgEntData->rbCb->lch.lChId - 1].ulRbCb =
991 cfgTmpData->ueCb->lCh[cfgEntData->rbCb->lch.lChId - 1].ulRbCb =
994 /* Free the Buffers of RbCb */
995 if( CM_LTE_MODE_UM == cfgEntData->rbCb->mode )
997 kwUmmFreeUlRbCb(gCb, cfgEntData->rbCb);
999 else if(CM_LTE_MODE_AM == cfgEntData->rbCb->mode)
1001 kwAmmFreeUlRbCb(gCb,cfgEntData->rbCb);
1004 /* Assign NULLP to rbCb in rbCbLst */
1005 if ( cfgToAply->rbType == CM_LTE_SRB )
1007 cfgTmpData->ueCb->srbCb[cfgToAply->rbId] = NULLP;
1011 cfgTmpData->ueCb->drbCb[cfgToAply->rbId] = NULLP;
1015 RLC_FREE(gCb,cfgEntData->rbCb, sizeof(RlcUlRbCb));
1017 KW_LMM_RB_STS_DEC(gCb);
1027 * This primitive validates uplink Delete UE request
1030 * @param [in] gCb - RLC Instance Control Block
1031 * @param [in] cfgToValidate - Entity Configuration to be validated.
1032 * @param [out] cfgEntData - Configuration Temporary Data Entity
1033 * @param [out] cfgTmpData - Configuration Temporary Data
1040 PUBLIC S16 rlcCfgValidateDelUlUe
1043 RlcEntCfgInfo *cfgToValidate,
1044 RlcUlEntTmpData *cfgEntData,
1045 RlcUlCfgTmpData *cfgTmpData
1048 PUBLIC S16 rlcCfgValidateDelUlUe(gCb,cfgToValidate, cfgEntData,cfgTmpData)
1050 RlcEntCfgInfo *cfgToValidate;
1051 RlcUlEntTmpData *cfgEntData;
1052 RlcUlCfgTmpData *cfgTmpData;
1055 TRC3(rlcCfgValidateDelUlUe)
1057 RLOG_ARG2(L_DEBUG,DBG_UEID,cfgTmpData->ueId,
1058 "cellId(%d), cfgType(%d)",
1059 cfgTmpData->cellId,cfgToValidate->cfgType);
1061 /* Check for ueId is present or not */
1062 if ( cfgTmpData->ueId == 0 )
1064 cfgEntData->entUlCfgCfm.status.reason = CKW_CFG_REAS_UE_UNKWN;;
1065 RLOG_ARG1(L_ERROR,DBG_UEID,cfgTmpData->ueId,
1066 "UeId is 0 for CELLID;%d",
1067 cfgTmpData->cellId);
1072 if(ROK != kwDbmFetchUlUeCb(gCb,cfgTmpData->ueId, cfgTmpData->cellId, &cfgTmpData->ueCb))
1074 RLOG_ARG1(L_ERROR,DBG_CELLID, cfgTmpData->cellId,
1075 "UeId [%d]: UeCb not found",
1077 cfgEntData->entUlCfgCfm.status.reason = CKW_CFG_REAS_UE_UNKWN;;
1086 * This primitive apply Uplink Delete Ue request
1088 * @param [in] gCb - RLC Instance Control Block
1089 * @param [in] cfgTmpData - Configuration Temporary Data
1095 PUBLIC Void rlcCfgApplyDelUlUe
1098 RlcUlCfgTmpData *cfgTmpData
1101 PUBLIC Void rlcCfgApplyDelUlUe(gCb, cfgTmpData)
1104 RlcUlCfgTmpData *cfgTmpData;
1108 TRC3(rlcCfgApplyDelUlUe)
1111 kwDelFrmUlL2Meas(gCb,cfgTmpData->cellId,cfgTmpData->ueId);
1113 kwDbmDelUlUeCb(gCb,cfgTmpData->ueCb, FALSE);
1120 * This primitive validates uplink Delete UE request
1123 * @param [in] gCb - RLC Instance Control Block
1124 * @param [in] ueId - UE Identifier
1125 * @param [in] cfgToValidate - Entity Configuration to be done.
1126 * @param [in] cfgEntData - Configuration Temporary Data Entity
1127 * @param [in] cfgTmpData - Configuration Temporary Data
1134 PUBLIC S16 rlcCfgValidateDelUlCell
1138 RlcEntCfgInfo *cfgToValidate,
1139 RlcUlEntTmpData *cfgEntData,
1140 RlcUlCfgTmpData *cfgTmpData
1143 PUBLIC S16 rlcCfgValidateDelUlCell(gCb, cellId, cfgToValidate, cfgTmpData)
1146 RlcEntCfgInfo *cfgToValidate;
1147 RlcUlEntTmpData *cfgEntData;
1148 RlcUlCfgTmpData *cfgTmpData;
1151 TRC3(rlcCfgValidateDelUlCell)
1153 RLOG_ARG1(L_DEBUG,DBG_CELLID,cellId ,"cfgType(%d)",
1154 cfgToValidate->cfgType);
1156 cfgTmpData->cellCb = NULLP;
1158 /* Check for cellId is present or not */
1161 cfgEntData->entUlCfgCfm.status.reason = CKW_CFG_REAS_CELL_UNKWN;;
1162 RLOG_ARG0(L_ERROR,DBG_CELLID,cellId , "CellId is 0");
1167 kwDbmFetchUlCellCb(gCb,cellId, &cfgTmpData->cellCb);
1168 if (!cfgTmpData->cellCb)
1170 cfgEntData->entUlCfgCfm.status.reason = CKW_CFG_REAS_CELL_UNKWN;;
1171 RLOG_ARG0(L_ERROR, DBG_CELLID,cellId, "CellCb not found");
1180 * This primitive apply Uplink Delete Ue request
1182 * @param [in] gCb - RLC Instance Control Block
1183 * @param [in] cfgEntData - Temporary Data maintained for a transaction
1189 PUBLIC Void rlcCfgApplyDelUlCell
1192 RlcUlCfgTmpData *cfgInfo
1195 PUBLIC Void rlcCfgApplyDelUlCell(gCb, cfgEntData)
1198 RlcUlCfgTmpData *cfgInfo;
1202 TRC3(rlcCfgApplyDelUlCell)
1204 kwDbmDelUlCellCb(gCb,cfgInfo->cellCb);
1210 * This primitive validates reestablishment of RB.
1212 * @param [in] gCb - RLC Instance Control Block
1213 * @param [in] ueId - UE Identifier
1214 * @param [in] cellId - CELL Identifier
1215 * @param [in] cfgToValidate - Entity Configuration to be done.
1216 * @param [out] cfgEntData - Configuration Temporary Data Entity
1223 PUBLIC S16 rlcCfgValidateReEstRb
1228 RlcEntCfgInfo *cfgToValidate,
1229 RlcUlEntTmpData *cfgEntData
1232 PUBLIC S16 rlcCfgValidateReEstRb(gCb,ueId, cellId, cfgToValidate, cfgEntData)
1236 RlcEntCfgInfo *cfgToValidate;
1237 RlcUlEntTmpData *cfgEntData;
1240 CmLteRlcId rlcId; /* RLC Identifier */
1241 TRC3(rlcCfgValidateReEstRb)
1243 RLOG_ARG2(L_DEBUG, DBG_UEID,ueId,
1244 "cellId(%d) RBID:%d",
1246 cfgToValidate->rbId);
1250 rlcId.cellId = cellId;
1251 rlcId.rbId = cfgToValidate->rbId;
1252 rlcId.rbType = cfgToValidate->rbType;
1254 kwDbmFetchUlRbCbByRbId(gCb,&rlcId, &cfgEntData->rbCb);
1255 if (cfgEntData->rbCb == NULLP)
1257 RLOG_ARG2(L_WARNING, DBG_UEID,ueId,
1258 "CellId [%u]: rbId [%d] not found",
1260 cfgToValidate->rbId);
1261 cfgEntData->entUlCfgCfm.status.reason = CKW_CFG_REAS_RB_UNKWN;
1272 * This primitive apply reestablishment of RB.
1274 * @param [in] gCb - RLC Instance Control Block
1275 * @param [in] ueId - UE Identifier
1276 * @param [in] cellId - CELL Identifier
1277 * @param [in] sndReEstInd - ReEstablish Indication Flag
1278 * @param [in] cfgEntData - Configuration Temporary Data Entity
1284 PUBLIC Void rlcCfgApplyReEstUlRb
1290 RlcUlEntTmpData *cfgEntData
1293 PUBLIC Void rlcCfgApplyReEstUlRb(gCb, ueId, cellId, sndReEstInd, cfgEntData)
1299 RlcUlEntTmpData *cfgEntData;
1303 CmLteRlcId rlcId; /* RLC Identifier */
1304 TRC3(rlcCfgApplyReEstUlRb)
1307 rlcId.cellId = cellId;
1308 rlcId.rbId = cfgEntData->entUlCfgCfm.rbId;
1309 rlcId.rbType = cfgEntData->entUlCfgCfm.rbType;
1310 cfgEntData->rbCb->rlcId.ueId = ueId;
1311 switch (cfgEntData->rbCb->mode)
1313 case CM_LTE_MODE_TM:
1315 kwTmmUlReEstablish(gCb,cfgEntData->rbCb);
1319 case CM_LTE_MODE_UM:
1321 kwUmmUlReEstablish(gCb,&rlcId,cfgEntData->rbCb);
1325 case CM_LTE_MODE_AM:
1327 kwAmmUlReEstablish(gCb,rlcId,sndReEstInd,cfgEntData->rbCb);
1336 * This primitive validates reestablishment of RB.
1338 * @param [in] gCb - RLC Instance Control Block
1339 * @param [in] ueInfo - UE Identifier
1340 * @param [in] newUeInfo - CELL Identifier
1341 * @param [in] cfgTmpData - Configuration Temporary Data
1348 PUBLIC S16 rlcCfgValidateUeIdChng
1352 CkwUeInfo *newUeInfo,
1353 RlcUlCfgTmpData *cfgTmpData
1356 PUBLIC S16 rlcCfgValidateUeIdChng(gCb,ueInfo,newUeInfo,cfgTmpData)
1359 CkwUeInfo *newUeInfo;
1360 RlcUlCfgTmpData *cfgTmpData;
1364 TRC3(rlcCfgValidateUeIdChng)
1366 #define CFM_STATUS cfgTmpData->cfgEntData[0].entUlCfgCfm.status
1367 if ( (ueInfo->ueId == newUeInfo->ueId) &&
1368 (ueInfo->cellId == newUeInfo->cellId))
1370 CFM_STATUS.reason = CKW_CFG_REAS_SAME_UEID;
1371 CFM_STATUS.status = CKW_CFG_CFM_NOK;
1375 if(ROK == kwDbmFetchUlUeCb(gCb,newUeInfo->ueId, newUeInfo->cellId, &ueCb))
1377 RLOG_ARG1(L_ERROR, DBG_CELLID, newUeInfo->cellId,
1378 "NewUeId[%d]:ueCb already exists",
1380 CFM_STATUS.reason = CKW_CFG_REAS_UE_EXISTS;
1381 CFM_STATUS.status = CKW_CFG_CFM_NOK;
1385 if(ROK != kwDbmFetchUlUeCb(gCb,ueInfo->ueId, ueInfo->cellId,
1388 RLOG_ARG1(L_ERROR,DBG_CELLID, ueInfo->cellId,
1389 "UeId [%d]: UeCb not found",
1391 CFM_STATUS.reason = CKW_CFG_REAS_UE_UNKWN;
1392 CFM_STATUS.status = CKW_CFG_CFM_NOK;
1403 * This primitive apply reestablishment of RB.
1405 * @param [in] gCb - RLC Instance Control Block
1406 * @param [in] ueInfo - UE Identifier
1407 * @param [in] newUeInfo - CELL Identifier
1408 * @param [in] cfgTmpData - Configuration Temporary Data
1414 PUBLIC Void rlcCfgApplyUlUeIdChng
1418 CkwUeInfo *newUeInfo,
1419 RlcUlCfgTmpData *cfgTmpData
1422 PUBLIC Void rlcCfgApplyUlUeIdChng(gCb, ueId, cellId, cfgTmpData)
1426 CkwUeInfo *newUeInfo,
1427 RlcUlCfgTmpData *cfgTmpData;
1431 TRC3(rlcCfgApplyUlUeIdChng)
1434 kwHdlMeasUlUeIdChg(gCb, ueInfo->cellId, ueInfo->ueId, newUeInfo->ueId);
1436 cmHashListDelete(&(gCb->u.ulCb->ueLstCp), (PTR) cfgTmpData->ueCb);
1437 /* update the hash key with new values */
1438 cfgTmpData->ueCb->ueId = newUeInfo->ueId;
1439 cfgTmpData->ueCb->cellId =newUeInfo->cellId;
1440 if(ROK != cmHashListInsert(&(gCb->u.ulCb->ueLstCp),
1441 (PTR)cfgTmpData->ueCb,
1442 (U8 *)&(cfgTmpData->ueCb->ueId),
1443 (U16) sizeof(CmLteRnti)))
1446 RLOG_ARG1(L_ERROR,DBG_CELLID,newUeInfo->cellId,
1447 "UeId[%u] HashList Insertion Failed",
1453 /********************************************************************30**
1456 **********************************************************************/