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 S16 rlcValidateRbCfgParams (RlcCb *gCb, CmLteRnti ueId, CmLteCellId cellId,
67 RlcEntCfgInfo *cfgToValidate, CmStatus *status);
68 #define RLC_MODULE RLC_DBGMASK_CFG
72 * @brief Handle modification of UE ID for L2 Meas data structs
75 * @param[in] ueId ue ID
82 PRIVATE S16 rlcHdlMeasUlUeIdChg(RlcCb *gCb, uint8_t cellId,uint8_t oldUeId, uint8_t newUeId)
84 RlcL2MeasCb *measCb = NULLP;
88 for(cntr = 0; cntr < LKW_MAX_L2MEAS; cntr++)
90 measCb = &(gCb->u.ulCb->rlcL2Cb.rlcL2EvtCb[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 rlcDelFrmUlL2Meas(RlcCb *gCb, uint8_t cellId,uint8_t ueId)
122 RlcL2MeasCb *measCb = NULLP;
126 for(cntr = 0; cntr < LKW_MAX_L2MEAS; cntr++)
128 measCb = &(gCb->u.ulCb->rlcL2Cb.rlcL2EvtCb[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 = rlcDbmFetchUlUeCb(gCb, measCb->val.ipThMeas.ueInfoLst[myIdx].ueId, cellId, &ueCb);
168 PRIVATE S16 rlcAddToUlL2Meas(RlcCb *gCb, RlcUlRbCb *rlcRbCb,uint8_t cellId,uint8_t ueId)
170 RlcL2MeasCb *measCb = NULLP;
176 #ifndef XEON_SPECIFIC_CHANGES
177 uint8_t freeIdx = gCb->genCfg.maxUe;
179 uint16_t freeIdx = LKW_MAX_UE;
182 for(cntr = 0; cntr < LKW_MAX_L2MEAS; cntr++)
184 measCb = &(gCb->u.ulCb->rlcL2Cb.rlcL2EvtCb[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] != rlcRbCb->qci)
194 measCb->val.nonIpThMeas.qci[cntr1] = rlcRbCb->qci;
195 gCb->u.ulCb->rlcL2Cb.measOn[rlcRbCb->qci] |=measCb->measType;
201 if(((rlcRbCb->rbL2Cb.measOn & measCb->measType) == LKW_L2MEAS_NONE))
203 #ifdef LTE_L2_MEAS_RLC
204 if (measCb->measType & LKW_L2MEAS_ACT_UE)
206 if((rlcRbCb->mode == CM_LTE_MODE_UM) &&
207 (rlcRbCb->dir & RLC_DIR_DL ))
209 if (rlcRbCb->m.um.umDl.sduQ.count)
211 if (rlcRbCb->ueCb->numActRb[rlcRbCb->qci] == 0)
213 rlcRbCb->ueCb->numActRb[rlcRbCb->qci]++;
214 gCb->u.ulCb->rlcL2Cb.numActUe[rlcRbCb->qci]++;
218 else if (rlcRbCb->mode == CM_LTE_MODE_AM)
220 if ((rlcRbCb->m.am.amDl.cntrlBo) ||
221 (rlcRbCb->m.am.amDl.retxBo) ||
222 (rlcRbCb->m.am.amDl.bo))
224 if (rlcRbCb->ueCb->numActRb[rlcRbCb->qci] == 0)
226 rlcRbCb->ueCb->numActRb[rlcRbCb->qci]++;
227 gCb->u.ulCb->rlcL2Cb.numActUe[rlcRbCb->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 memset(&measCb->val.ipThMeas.ueInfoLst[ueIdx].measData[0],0x00,(sizeof(RlcL2Cntr) *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] == rlcRbCb->qci)
281 if (qciIdx == *numQci)
283 measCb->val.ipThMeas.ueInfoLst[ueIdx].qci[qciIdx] = rlcRbCb->qci;
287 rlcUtlPlcMeasDatInL2Sts(&measCb->val.ipThMeas.ueInfoLst[ueIdx].measData[rlcRbCb->qci],
288 &rlcRbCb->rbL2Cb, measCb->measType);
290 rlcRbCb->rbL2Cb.measOn |= measCb->measType;
293 }/*rlcAddToDlL2Meas*/
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;
326 RLOG_ARG3(L_DEBUG,DBG_UEID,rbCb->rlcId.ueId,
327 "rlcCfgFillRbCb(cellId(%d), rbId(%d), rbType(%d))",
332 /* Initialize according to entMode */
333 switch (entCfg->entMode)
337 rbCb->lch.lChId = entCfg->lCh[0].lChId;
338 rbCb->lch.lChType = entCfg->lCh[0].type;
339 rbCb->dir = entCfg->dir;
344 rbCb->lch.lChId = entCfg->lCh[0].lChId;
345 rbCb->lch.lChType = entCfg->lCh[0].type;
347 rbCb->dir = entCfg->dir;
349 rbCb->m.umUl.snLen = entCfg->m.umInfo.ul.snLen;
351 /* the bitmask for SN = 10 is 0x3ff and for SN = 5 is 0x1f */
352 rbCb->m.umUl.modBitMask = (rbCb->m.umUl.umWinSz << 1) - 1;
354 rbCb->m.umUl.reOrdTmrInt =
355 entCfg->m.umInfo.ul.reOrdTmr;
356 cmInitTimers(&(rbCb->m.umUl.reOrdTmr), 1);
357 ueCb->lCh[rbCb->lch.lChId - 1].ulRbCb = rbCb;
362 /* Down Link Information
363 * indx = 1 as Up Link */
364 rbCb->lch.lChId = entCfg->lCh[1].lChId;
365 rbCb->lch.lChType = entCfg->lCh[1].type;
366 rbCb->dir = RLC_DIR_BOTH;
368 rbCb->m.amUl.staProhTmrInt = entCfg->m.amInfo.ul.staProhTmr;
369 rbCb->m.amUl.reOrdTmrInt = entCfg->m.amInfo.ul.reOrdTmr;
371 rbCb->m.amUl.snLen = entCfg->m.amInfo.ul.snLen; /* 5GNR */
373 if(RLC_AM_CFG_12BIT_SN_LEN == rbCb->m.amUl.snLen)
375 rbCb->m.amUl.snModMask = (1 << RLC_SN_LEN_12BITS) - 1; /* 5GNR */
379 rbCb->m.amUl.snModMask = (1 << RLC_SN_LEN_18BITS) - 1; /* 5GNR */
382 cmInitTimers(&(rbCb->m.amUl.reOrdTmr), 1);
383 cmInitTimers(&(rbCb->m.amUl.staProhTmr), 1);
385 rbCb->m.amUl.vrMr = rbCb->m.amUl.rxNext + (RLC_AM_GET_WIN_SZ(rbCb->m.amUl.snLen));
387 ueCb->lCh[rbCb->lch.lChId - 1].ulRbCb = rbCb;
393 RLOG_ARG2(L_ERROR,DBG_UEID,rbCb->rlcId.ueId,
394 "INVALID RB Mode cellId(%d), rbId(%d)",
400 rbCb->mode = entCfg->entMode;
407 * @brief This primitive Initializes the RB Cb
409 * @param [in] gCb - RLC Instance Control Block
410 * @param [out] rbCb - RB Control Block
411 * @param [in] ptr - Void pointer
412 * @param [in] entCfg - Entity Configuration
419 PRIVATE S16 rlcCfgUpdateUlRb
424 RlcEntCfgInfo *entCfg
427 PRIVATE S16 rlcCfgUpdateUlRb(gCb,rbCb, ptr, entCfg)
431 RlcEntCfgInfo *entCfg;
439 RlcUlCellCb *cellCb = (RlcUlCellCb *)ptr;
440 rbCb->dir = entCfg->dir;
441 rbCb->lch.lChId = entCfg->lCh[0].lChId;
442 rbCb->lch.lChType = entCfg->lCh[0].type;
444 cellCb->lCh[rbCb->lch.lChId - 1].ulRbCb = rbCb;
449 RlcUlUeCb *ueCb = (RlcUlUeCb *)ptr;
450 ueCb->lCh[rbCb->lch.lChId - 1].ulRbCb = NULLP;
451 rlcCfgFillUlRbCb(gCb,rbCb, ueCb, entCfg);
456 RlcUlUeCb *ueCb = (RlcUlUeCb *)ptr;
458 ueCb->lCh[rbCb->lch.lChId - 1].ulRbCb = NULLP;
459 ueCb->lCh[entCfg->lCh[1].lChId - 1].ulRbCb = rbCb;
461 rbCb->lch.lChId = entCfg->lCh[1].lChId;
462 rbCb->lch.lChType = entCfg->lCh[1].type;
463 rbCb->m.amUl.staProhTmrInt = entCfg->m.amInfo.ul.staProhTmr;
464 rbCb->m.amUl.reOrdTmrInt = entCfg->m.amInfo.ul.reOrdTmr;
468 return (CKW_CFG_REAS_NONE);
474 * This primitive validates uplink Add RB Configuration and reserve memory
477 * @param [in] gCb - RLC Instance Control Block
478 * @param [in] ueId - UE Identifier
479 * @param [in] cellId - CELL Identifier
480 * @param [in] cfgToValidate - Entity Configuration needs to be validated.
481 * @param [out] status - status of configuration
488 S16 rlcValidateRbCfgParams
493 RlcEntCfgInfo *cfgToValidate,
497 S16 rlcValidateRbCfgParams(gCb,ueId, cellId, cfgToValidate, status)
501 RlcEntCfgInfo *cfgToValidate;
507 status->reason = CKW_CFG_REAS_CELL_UNKWN;
510 if ((cfgToValidate->rguSapId >= gCb->genCfg.maxRguSaps) || (cfgToValidate->rguSapId < 0))
512 RLCDBGP_ERROR(gCb, "rlcValidateRbCfgParams ueId (%u) cellId (%u) Invalid rguSapId (%d))\n",
513 ueId, cellId, cfgToValidate->rguSapId);
514 status->reason = CKW_CFG_REAS_INVALID_RGUSAP;
518 if((CKW_CFG_ADD == cfgToValidate->cfgType) ||
519 (CKW_CFG_MODIFY == cfgToValidate->cfgType))
521 /* Validate LChId for UM and AM modes */
522 if ((cfgToValidate->lCh[0].lChId <= 0) ||
523 ((cfgToValidate->entMode == CM_LTE_MODE_AM) &&
524 (cfgToValidate->lCh[1].lChId <= 0)))
526 status->reason = CKW_CFG_REAS_INVALID_LCHID;
529 if((cfgToValidate->entMode == CM_LTE_MODE_UM) &&
530 (cfgToValidate->m.umInfo.ul.snLen != RLC_UM_CFG_5BIT_SN_LEN) &&
531 (cfgToValidate->m.umInfo.ul.snLen != RLC_UM_CFG_10BIT_SN_LEN))
533 RLOG_ARG2(L_ERROR,DBG_UEID,ueId,
534 "CellId[%u]:UM Mode RB[%d],Invalid SN Len[%d]",
536 cfgToValidate->m.umInfo.ul.snLen);
537 status->reason = CKW_CFG_REAS_INVALID_SNLEN;
540 /* Process Adding new RB */
543 if(cfgToValidate->rbId >= RLC_MAX_RB_PER_CELL)
545 status->reason = CKW_CFG_REAS_RB_UNKWN;
549 if ((cfgToValidate->lCh[0].type != CM_LTE_LCH_CCCH) &&
550 (cfgToValidate->entMode != CM_LTE_MODE_TM))
552 status->reason= (cfgToValidate->entMode != CM_LTE_MODE_TM)? CKW_CFG_REAS_RB_MODE_MIS:
553 CKW_CFG_REAS_LCHTYPE_MIS;
559 if (!(RLC_VALIDATE_UE_RBID(cfgToValidate->rbType, cfgToValidate->rbId)))
561 status->reason = CKW_CFG_REAS_RB_UNKWN;
565 if(cfgToValidate->entMode == CM_LTE_MODE_TM)
567 status->reason = CKW_CFG_REAS_LCHTYPE_MIS;
570 if (!(((cfgToValidate->lCh[0].type == CM_LTE_LCH_DCCH) &&
571 (cfgToValidate->entMode != CM_LTE_MODE_UM))||
572 (cfgToValidate->lCh[0].type == CM_LTE_LCH_DTCH)) )
574 status->reason = CKW_CFG_REAS_RB_MODE_MIS;
579 else /* cfgType is CKW_CFG_DELETE */
583 if(cfgToValidate->rbId >= RLC_MAX_RB_PER_CELL)
585 status->reason = CKW_CFG_REAS_RB_UNKWN;
592 if (!(RLC_VALIDATE_UE_RBID(cfgToValidate->rbType, cfgToValidate->rbId)))
594 status->reason = CKW_CFG_REAS_RB_UNKWN;
605 * This primitive validates uplink Add RB Configuration and reserve memory
608 * @param [in] gCb - RLC Instance Control Block
609 * @param [in] cfgToValidate - Entity Configuration needs to be validated.
610 * @param [out] cfgEntData - Configuration Temporary Data Entity
611 * @param [out] cfgTmpData - Configuration Temporary Data
618 S16 rlcCfgValidateUlRb
621 RlcEntCfgInfo *cfgToValidate,
622 RlcUlEntTmpData *cfgEntData,
623 RlcUlCfgTmpData *cfgTmpData
626 S16 rlcCfgValidateUlRb(gCb,cfgToValidate, cfgEntData, cfgTmpData)
628 RlcEntCfgInfo *cfgToValidate;
629 RlcUlEntTmpData *cfgEntData;
630 RlcUlCfgTmpData *cfgTmpData;
634 RLOG_ARG2(L_DEBUG,DBG_UEID,cfgTmpData->ueId,
635 "cellId(%d), cfgType(%d)",
637 cfgToValidate->cfgType);
639 if(ROK != rlcValidateRbCfgParams(gCb,
643 &cfgEntData->entUlCfgCfm.status))
648 cfgEntData->entUlCfgCfm.status.reason = CKW_CFG_REAS_NONE;
649 switch(cfgToValidate->cfgType)
653 if (cfgTmpData->ueId == 0)
655 /* Cell Cb is added if it not present , it is not roll backed if the
656 * configuration fails */
657 rlcDbmFetchUlCellCb(gCb,cfgTmpData->cellId, &cfgTmpData->cellCb);
658 if(!cfgTmpData->cellCb)
660 /* cell cb does not exist we need to create a new one */
661 RLC_ALLOC(gCb,cfgTmpData->cellCb, sizeof(RlcUlCellCb));
662 if(!cfgTmpData->cellCb)
664 RLOG_ARG1(L_FATAL,DBG_UEID,cfgTmpData->ueId,
665 "Memory allocation failure CELLID:%d",
667 cfgEntData->entUlCfgCfm.status.reason = CKW_CFG_REAS_CELL_CREAT_FAIL;
670 rlcDbmAddUlCellCb(gCb, cfgTmpData->cellId, cfgTmpData->cellCb);
674 if (( cfgTmpData->cellCb->rbCb[cfgToValidate->rbId] != NULLP))
676 cfgEntData->entUlCfgCfm.status.reason = CKW_CFG_REAS_RB_PRSNT;
681 RLC_ALLOC(gCb,cfgEntData->rbCb, sizeof (RlcUlRbCb));
682 if (!cfgEntData->rbCb)
684 cfgEntData->entUlCfgCfm.status.reason = CKW_CFG_REAS_RB_CREAT_FAIL;
690 /* Ue Cb is added if it not present , it is not roll backed if the
691 * configuration fails */
692 rlcDbmFetchUlUeCb(gCb,cfgTmpData->ueId, cfgTmpData->cellId, &cfgTmpData->ueCb);
693 if(!cfgTmpData->ueCb)
695 RLC_ALLOC(gCb,cfgTmpData->ueCb, sizeof(RlcUlUeCb));
696 if(!cfgTmpData->ueCb)
698 RLOG_ARG1(L_FATAL,DBG_UEID,cfgTmpData->ueId,
699 "Memory allocation failure CELLID:%d",
701 cfgEntData->entUlCfgCfm.status.reason = CKW_CFG_REAS_UE_CREAT_FAIL;
704 rlcDbmAddUlUeCb(gCb, cfgTmpData->ueId, cfgTmpData->cellId, cfgTmpData->ueCb);
708 RLC_DBM_GET_RBCB_FROM_UECB(cfgToValidate->rbId,
709 cfgToValidate->rbType,
712 if(cfgEntData->rbCb != NULLP)
714 cfgEntData->entUlCfgCfm.status.reason = CKW_CFG_REAS_RB_PRSNT;
718 RLC_ALLOC(gCb,cfgEntData->rbCb, sizeof (RlcUlRbCb));
719 if (!cfgEntData->rbCb)
721 cfgEntData->entUlCfgCfm.status.reason = CKW_CFG_REAS_RB_CREAT_FAIL;
725 /*Allocating the memory for receive buffer */
726 if(CM_LTE_MODE_UM == cfgToValidate->entMode)
731 cfgEntData->rbCb->m.umUl.umWinSz = RLC_POWER(2,
732 ((cfgToValidate->m.umInfo.ul.snLen *5)-1));
733 winLen = cfgEntData->rbCb->m.umUl.umWinSz << 1;
735 cfgEntData->rbCb->m.umUl.recBuf,
736 (winLen * sizeof(RlcUmRecBuf*)));
738 else if(CM_LTE_MODE_AM == cfgToValidate->entMode)
743 cfgEntData->rbCb->m.amUl.recBufLst,
744 (RLC_RCV_BUF_BIN_SIZE * sizeof(CmLListCp )));
745 for(hashIndex = 0; hashIndex < RLC_RCV_BUF_BIN_SIZE; hashIndex++)
747 cmLListInit(&(cfgEntData->rbCb->m.amUl.recBufLst[hashIndex]));
756 if (cfgTmpData->ueId == 0)
758 /* Try to get the CellCb if it already exists */
759 rlcDbmFetchUlCellCb(gCb,cfgTmpData->cellId, &cfgTmpData->cellCb);
760 if(!cfgTmpData->cellCb)
762 RLOG_ARG1(L_ERROR, DBG_CELLID,cfgTmpData->cellId,
763 "CellCb not found UEID:%d",
765 /*how can a modify request come for a cell which does not exist*/
766 cfgEntData->entUlCfgCfm.status.reason = CKW_CFG_REAS_CELL_UNKWN;
770 cfgEntData->rbCb = cfgTmpData->cellCb->rbCb[cfgToValidate->rbId];
771 if (!cfgEntData->rbCb)
773 /* something is wrong the rbId for this cell does not exist */
774 cfgEntData->entUlCfgCfm.status.reason = CKW_CFG_REAS_RB_UNKWN;
781 rlcDbmFetchUlUeCb(gCb,cfgTmpData->ueId, cfgTmpData->cellId, &cfgTmpData->ueCb);
782 if(!cfgTmpData->ueCb)
784 RLOG_ARG1(L_ERROR,DBG_CELLID, cfgTmpData->cellId,
785 "UeId [%d]: UeCb not found",
787 cfgEntData->entUlCfgCfm.status.reason = CKW_CFG_REAS_UE_UNKWN;
792 RLC_DBM_GET_RBCB_FROM_UECB(cfgToValidate->rbId,
793 cfgToValidate->rbType,
796 if ( cfgEntData->rbCb == NULLP)
798 cfgEntData->entUlCfgCfm.status.reason = CKW_CFG_REAS_RB_UNKWN;
807 if(cfgToValidate->cfgType == CKW_CFG_MODIFY)
809 if(cfgToValidate->entMode != cfgEntData->rbCb->mode)
811 cfgEntData->entUlCfgCfm.status.reason = CKW_CFG_REAS_RB_MODE_MIS;
815 if(cfgToValidate->m.umInfo.ul.snLen != cfgEntData->rbCb->m.umUl.snLen)
817 cfgEntData->entUlCfgCfm.status.reason = CKW_CFG_REAS_SNLEN_MIS;
827 * This primitive roll back the RB Configuration
829 * @param [in] gCb - RLC Instance Control Block
830 * @param [in] ueId - UE Identifier
831 * @param [in] cfg - Configuration entity.
832 * @param [out] cfgEntData - Configuration Temporary Data Entity
839 S16 rlcCfgRollBackUlRb
844 RlcUlEntTmpData *cfgEntData
847 S16 rlcCfgRollBackUlRb(gCb, cfg, cfgEntData)
852 RlcUlEntTmpData *cfgEntData;
857 if(CKW_CFG_ADD == cfg->cfgType)
859 if(CM_LTE_MODE_UM == cfg->entMode)
862 cfgEntData->rbCb->m.umUl.recBuf,
863 (cfgEntData->rbCb->m.umUl.umWinSz << 1) * sizeof(RlcUmRecBuf*));
865 else if(CM_LTE_MODE_AM == cfg->entMode)
868 RLC_FREE(gCb,cfgEntData->rbCb->m.amUl.recBufLst, (RLC_RCV_BUF_BIN_SIZE * sizeof(CmLListCp)));
871 RLC_FREE(gCb,cfgEntData->rbCb, sizeof(RlcUlRbCb));
880 * This primitive apply RB Configuration.
882 * @param [in] gCb - RLC Instance Control Block
883 * @param [in] cfgToAply - Configuration to be applied
884 * @param [out] cfgEntData - Configuration Temporary Data Entity
885 * @param [out] cfgTmpData - Configuration Temporary Data
895 RlcEntCfgInfo *cfgToAply,
896 RlcUlEntTmpData *cfgEntData,
897 RlcUlCfgTmpData *cfgTmpData
900 Void rlcCfgApplyUlRb(gCb, cfgToApply, cfgEntData, cfgTmpData)
903 RlcEntCfgInfo *cfgToAply;
904 RlcUlEntTmpData *cfgEntData;
905 RlcUlCfgTmpData *cfgTmpData;
910 switch(cfgToAply->cfgType)
914 /* copy the RB Cb into UeCb */
915 cfgEntData->rbCb->rlcId.rbId = cfgToAply->rbId;
916 if (cfgTmpData->ueId == 0)
918 cfgTmpData->cellCb->rbCb[cfgToAply->rbId] = cfgEntData->rbCb;
919 cfgTmpData->cellCb->lCh[cfgToAply->lCh[0].lChId -1].ulRbCb = cfgEntData->rbCb;
923 if(cfgToAply->rbType == CM_LTE_SRB)
925 cfgTmpData->ueCb->srbCb[cfgToAply->rbId] = cfgEntData->rbCb;
929 cfgTmpData->ueCb->drbCb[cfgToAply->rbId] = cfgEntData->rbCb;
933 RLC_LMM_RB_STS_INC(gCb);
935 cfgEntData->rbCb->rlcId.cellId = cfgTmpData->cellId;
936 cfgEntData->rbCb->rlcId.ueId = cfgTmpData->ueId;
937 cfgEntData->rbCb->rlcId.rbType = cfgToAply->rbType;
938 cfgEntData->rbCb->inst = gCb->init.inst;
941 rlcCfgFillUlRbCb(gCb,
947 cfgEntData->rbCb->qci = cfgToAply->qci;
948 cfgEntData->rbCb->ueCb = cfgTmpData->ueCb;
949 if (cfgToAply->lCh[1].type == CM_LTE_LCH_DTCH)
952 rlcAddToUlL2Meas(gCb, cfgEntData->rbCb,
953 cfgTmpData->cellId,cfgTmpData->ueId);
955 #endif /* LTE_L2_MEAS */
960 if(cfgTmpData->ueId == 0)
962 rlcCfgUpdateUlRb(gCb,
964 (void *)cfgTmpData->cellCb,
969 rlcCfgUpdateUlRb(gCb,
971 (void*)cfgTmpData->ueCb,
978 if (cfgTmpData->ueId == 0)
980 cfgTmpData->cellCb->rbCb[cfgToAply->rbId] = NULLP;
981 cfgTmpData->cellCb->lCh[cfgEntData->rbCb->lch.lChId - 1].ulRbCb =
986 cfgTmpData->ueCb->lCh[cfgEntData->rbCb->lch.lChId - 1].ulRbCb =
989 /* Free the Buffers of RbCb */
990 if( CM_LTE_MODE_UM == cfgEntData->rbCb->mode )
992 rlcUmmFreeUlRbCb(gCb, cfgEntData->rbCb);
994 else if(CM_LTE_MODE_AM == cfgEntData->rbCb->mode)
996 rlcAmmFreeUlRbCb(gCb,cfgEntData->rbCb);
999 /* Assign NULLP to rbCb in rbCbLst */
1000 if ( cfgToAply->rbType == CM_LTE_SRB )
1002 cfgTmpData->ueCb->srbCb[cfgToAply->rbId] = NULLP;
1006 cfgTmpData->ueCb->drbCb[cfgToAply->rbId] = NULLP;
1010 RLC_FREE(gCb,cfgEntData->rbCb, sizeof(RlcUlRbCb));
1012 RLC_LMM_RB_STS_DEC(gCb);
1022 * This primitive validates uplink Delete UE request
1025 * @param [in] gCb - RLC Instance Control Block
1026 * @param [in] cfgToValidate - Entity Configuration to be validated.
1027 * @param [out] cfgEntData - Configuration Temporary Data Entity
1028 * @param [out] cfgTmpData - Configuration Temporary Data
1035 S16 rlcCfgValidateDelUlUe
1038 RlcEntCfgInfo *cfgToValidate,
1039 RlcUlEntTmpData *cfgEntData,
1040 RlcUlCfgTmpData *cfgTmpData
1043 S16 rlcCfgValidateDelUlUe(gCb,cfgToValidate, cfgEntData,cfgTmpData)
1045 RlcEntCfgInfo *cfgToValidate;
1046 RlcUlEntTmpData *cfgEntData;
1047 RlcUlCfgTmpData *cfgTmpData;
1051 RLOG_ARG2(L_DEBUG,DBG_UEID,cfgTmpData->ueId,
1052 "cellId(%d), cfgType(%d)",
1053 cfgTmpData->cellId,cfgToValidate->cfgType);
1055 /* Check for ueId is present or not */
1056 if ( cfgTmpData->ueId == 0 )
1058 cfgEntData->entUlCfgCfm.status.reason = CKW_CFG_REAS_UE_UNKWN;
1059 RLOG_ARG1(L_ERROR,DBG_UEID,cfgTmpData->ueId,
1060 "UeId is 0 for CELLID;%d",
1061 cfgTmpData->cellId);
1066 if(ROK != rlcDbmFetchUlUeCb(gCb,cfgTmpData->ueId, cfgTmpData->cellId, &cfgTmpData->ueCb))
1068 RLOG_ARG1(L_ERROR,DBG_CELLID, cfgTmpData->cellId,
1069 "UeId [%d]: UeCb not found",
1071 cfgEntData->entUlCfgCfm.status.reason = CKW_CFG_REAS_UE_UNKWN;
1080 * This primitive apply Uplink Delete Ue request
1082 * @param [in] gCb - RLC Instance Control Block
1083 * @param [in] cfgTmpData - Configuration Temporary Data
1089 Void rlcCfgApplyDelUlUe
1092 RlcUlCfgTmpData *cfgTmpData
1095 Void rlcCfgApplyDelUlUe(gCb, cfgTmpData)
1098 RlcUlCfgTmpData *cfgTmpData;
1104 rlcDelFrmUlL2Meas(gCb,cfgTmpData->cellId,cfgTmpData->ueId);
1106 rlcDbmDelUlUeCb(gCb,cfgTmpData->ueCb, FALSE);
1113 * This primitive validates uplink Delete UE request
1116 * @param [in] gCb - RLC Instance Control Block
1117 * @param [in] ueId - UE Identifier
1118 * @param [in] cfgToValidate - Entity Configuration to be done.
1119 * @param [in] cfgEntData - Configuration Temporary Data Entity
1120 * @param [in] cfgTmpData - Configuration Temporary Data
1127 S16 rlcCfgValidateDelUlCell
1131 RlcEntCfgInfo *cfgToValidate,
1132 RlcUlEntTmpData *cfgEntData,
1133 RlcUlCfgTmpData *cfgTmpData
1136 S16 rlcCfgValidateDelUlCell(gCb, cellId, cfgToValidate, cfgTmpData)
1139 RlcEntCfgInfo *cfgToValidate;
1140 RlcUlEntTmpData *cfgEntData;
1141 RlcUlCfgTmpData *cfgTmpData;
1145 RLOG_ARG1(L_DEBUG,DBG_CELLID,cellId ,"cfgType(%d)",
1146 cfgToValidate->cfgType);
1148 cfgTmpData->cellCb = NULLP;
1150 /* Check for cellId is present or not */
1153 cfgEntData->entUlCfgCfm.status.reason = CKW_CFG_REAS_CELL_UNKWN;
1154 RLOG_ARG0(L_ERROR,DBG_CELLID,cellId , "CellId is 0");
1159 rlcDbmFetchUlCellCb(gCb,cellId, &cfgTmpData->cellCb);
1160 if (!cfgTmpData->cellCb)
1162 cfgEntData->entUlCfgCfm.status.reason = CKW_CFG_REAS_CELL_UNKWN;
1163 RLOG_ARG0(L_ERROR, DBG_CELLID,cellId, "CellCb not found");
1172 * This primitive apply Uplink Delete Ue request
1174 * @param [in] gCb - RLC Instance Control Block
1175 * @param [in] cfgEntData - Temporary Data maintained for a transaction
1181 Void rlcCfgApplyDelUlCell
1184 RlcUlCfgTmpData *cfgInfo
1187 Void rlcCfgApplyDelUlCell(gCb, cfgEntData)
1190 RlcUlCfgTmpData *cfgInfo;
1195 rlcDbmDelUlCellCb(gCb,cfgInfo->cellCb);
1201 * This primitive validates reestablishment of RB.
1203 * @param [in] gCb - RLC Instance Control Block
1204 * @param [in] ueId - UE Identifier
1205 * @param [in] cellId - CELL Identifier
1206 * @param [in] cfgToValidate - Entity Configuration to be done.
1207 * @param [out] cfgEntData - Configuration Temporary Data Entity
1214 S16 rlcCfgValidateReEstRb
1219 RlcEntCfgInfo *cfgToValidate,
1220 RlcUlEntTmpData *cfgEntData
1223 S16 rlcCfgValidateReEstRb(gCb,ueId, cellId, cfgToValidate, cfgEntData)
1227 RlcEntCfgInfo *cfgToValidate;
1228 RlcUlEntTmpData *cfgEntData;
1231 CmLteRlcId rlcId; /* RLC Identifier */
1233 RLOG_ARG2(L_DEBUG, DBG_UEID,ueId,
1234 "cellId(%d) RBID:%d",
1236 cfgToValidate->rbId);
1240 rlcId.cellId = cellId;
1241 rlcId.rbId = cfgToValidate->rbId;
1242 rlcId.rbType = cfgToValidate->rbType;
1244 rlcDbmFetchUlRbCbByRbId(gCb,&rlcId, &cfgEntData->rbCb);
1245 if (cfgEntData->rbCb == NULLP)
1247 RLOG_ARG2(L_WARNING, DBG_UEID,ueId,
1248 "CellId [%u]: rbId [%d] not found",
1250 cfgToValidate->rbId);
1251 cfgEntData->entUlCfgCfm.status.reason = CKW_CFG_REAS_RB_UNKWN;
1262 * This primitive apply reestablishment of RB.
1264 * @param [in] gCb - RLC Instance Control Block
1265 * @param [in] ueId - UE Identifier
1266 * @param [in] cellId - CELL Identifier
1267 * @param [in] sndReEstInd - ReEstablish Indication Flag
1268 * @param [in] cfgEntData - Configuration Temporary Data Entity
1274 Void rlcCfgApplyReEstUlRb
1280 RlcUlEntTmpData *cfgEntData
1283 Void rlcCfgApplyReEstUlRb(gCb, ueId, cellId, sndReEstInd, cfgEntData)
1289 RlcUlEntTmpData *cfgEntData;
1293 CmLteRlcId rlcId; /* RLC Identifier */
1296 rlcId.cellId = cellId;
1297 rlcId.rbId = cfgEntData->entUlCfgCfm.rbId;
1298 rlcId.rbType = cfgEntData->entUlCfgCfm.rbType;
1299 cfgEntData->rbCb->rlcId.ueId = ueId;
1300 switch (cfgEntData->rbCb->mode)
1302 case CM_LTE_MODE_TM:
1304 rlcTmmUlReEstablish(gCb,cfgEntData->rbCb);
1308 case CM_LTE_MODE_UM:
1310 rlcUmmUlReEstablish(gCb,&rlcId,cfgEntData->rbCb);
1314 case CM_LTE_MODE_AM:
1316 rlcAmmUlReEstablish(gCb,rlcId,sndReEstInd,cfgEntData->rbCb);
1325 * This primitive validates reestablishment of RB.
1327 * @param [in] gCb - RLC Instance Control Block
1328 * @param [in] ueInfo - UE Identifier
1329 * @param [in] newUeInfo - CELL Identifier
1330 * @param [in] cfgTmpData - Configuration Temporary Data
1337 S16 rlcCfgValidateUeIdChng
1341 CkwUeInfo *newUeInfo,
1342 RlcUlCfgTmpData *cfgTmpData
1345 S16 rlcCfgValidateUeIdChng(gCb,ueInfo,newUeInfo,cfgTmpData)
1348 CkwUeInfo *newUeInfo;
1349 RlcUlCfgTmpData *cfgTmpData;
1354 #define CFM_STATUS cfgTmpData->cfgEntData[0].entUlCfgCfm.status
1355 if ( (ueInfo->ueId == newUeInfo->ueId) &&
1356 (ueInfo->cellId == newUeInfo->cellId))
1358 CFM_STATUS.reason = CKW_CFG_REAS_SAME_UEID;
1359 CFM_STATUS.status = CKW_CFG_CFM_NOK;
1363 if(ROK == rlcDbmFetchUlUeCb(gCb,newUeInfo->ueId, newUeInfo->cellId, &ueCb))
1365 RLOG_ARG1(L_ERROR, DBG_CELLID, newUeInfo->cellId,
1366 "NewUeId[%d]:ueCb already exists",
1368 CFM_STATUS.reason = CKW_CFG_REAS_UE_EXISTS;
1369 CFM_STATUS.status = CKW_CFG_CFM_NOK;
1373 if(ROK != rlcDbmFetchUlUeCb(gCb,ueInfo->ueId, ueInfo->cellId,
1376 RLOG_ARG1(L_ERROR,DBG_CELLID, ueInfo->cellId,
1377 "UeId [%d]: UeCb not found",
1379 CFM_STATUS.reason = CKW_CFG_REAS_UE_UNKWN;
1380 CFM_STATUS.status = CKW_CFG_CFM_NOK;
1391 * This primitive apply reestablishment of RB.
1393 * @param [in] gCb - RLC Instance Control Block
1394 * @param [in] ueInfo - UE Identifier
1395 * @param [in] newUeInfo - CELL Identifier
1396 * @param [in] cfgTmpData - Configuration Temporary Data
1402 Void rlcCfgApplyUlUeIdChng
1406 CkwUeInfo *newUeInfo,
1407 RlcUlCfgTmpData *cfgTmpData
1410 Void rlcCfgApplyUlUeIdChng(gCb, ueId, cellId, cfgTmpData)
1414 CkwUeInfo *newUeInfo,
1415 RlcUlCfgTmpData *cfgTmpData;
1421 rlcHdlMeasUlUeIdChg(gCb, ueInfo->cellId, ueInfo->ueId, newUeInfo->ueId);
1423 cmHashListDelete(&(gCb->u.ulCb->ueLstCp), (PTR) cfgTmpData->ueCb);
1424 /* update the hash key with new values */
1425 cfgTmpData->ueCb->ueId = newUeInfo->ueId;
1426 cfgTmpData->ueCb->cellId =newUeInfo->cellId;
1427 if(ROK != cmHashListInsert(&(gCb->u.ulCb->ueLstCp),
1428 (PTR)cfgTmpData->ueCb,
1429 (uint8_t *)&(cfgTmpData->ueCb->ueId),
1430 (uint16_t) sizeof(CmLteRnti)))
1433 RLOG_ARG1(L_ERROR,DBG_CELLID,newUeInfo->cellId,
1434 "UeId[%u] HashList Insertion Failed",
1440 /********************************************************************30**
1443 **********************************************************************/