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: RLC - Database module file
25 Desc: Source code for Database Module functions such as,
49 *********************************************************************21*/
50 static const char* RLOG_MODULE_NAME="DBM";
51 static int RLOG_MODULE_ID=2048;
52 static int RLOG_FILE_ID=193;
55 /* header (.h) include files */
56 #include "common_def.h"
57 #include "lkw.h" /* LKW defines */
58 #include "ckw.h" /* CKW defines */
59 #include "rgu.h" /* RGU defines */
60 #include "kwu.h" /* KWU defines */
61 #include "kw_err.h" /* Err defines */
62 #include "kw_env.h" /* RLC environment options */
63 #include "kw.h" /* RLC defines */
67 /* extern (.x) include files */
68 #include "lkw.x" /* LKW */
69 #include "ckw.x" /* CKW */
70 #include "rgu.x" /* RGU */
71 #include "kwu.x" /* KWU */
78 TSL2UeStatsCb* TSL2MapUeStatsBlk (uint16_t rnti);
82 * @brief RLC Downlink database module
84 #define RLC_MODULE RLC_DBGMASK_DUT
88 * @brief Handler to initialize hash list
91 * This function initializes the UeCb, CellCb hash lists
97 S16 rlcDbmDlInit(RlcCb *gCb)
100 /* Initialize ueCb Hash List */
101 if(ROK != cmHashListInit(&(gCb->u.dlCb->ueLstCp),
102 (uint16_t) RLC_UE_LIST_BUCKET_SIZE,
105 (uint16_t) CM_HASH_KEYTYPE_CONID,
106 RLC_GET_MEM_REGION(gCb),
107 RLC_GET_MEM_POOL(gCb)))
109 RLOG0(L_ERROR, "UeLstCp Initialization Failed");
113 /* Initialize cellCb Hash List */
114 if(ROK != cmHashListInit(&(gCb->u.dlCb->cellLstCp),
115 (uint16_t) RLC_CELL_LIST_BUCKET_SIZE,
118 (uint16_t) CM_HASH_KEYTYPE_CONID,
119 RLC_GET_MEM_REGION(gCb),
120 RLC_GET_MEM_POOL(gCb)))
122 cmHashListDeinit(&gCb->u.dlCb->ueLstCp);
123 RLOG0(L_ERROR, "CellLstCp Initialization Failed");
127 /* kw005.201 added support for L2 Measurement */
128 #ifdef LTE_L2_MEAS_RLC
129 /* Initialize qcI Hash List */
130 if(ROK != cmHashListInit(&(rlcCb.rlcL2Cb.qciHlCp),
131 (uint16_t) RLC_QCI_LIST_BUCKET_SIZE,
134 (uint16_t) CM_HASH_KEYTYPE_DEF,
138 cmHashListDeinit(&gCb->u.dlCb->cellLstCp);
139 cmHashListDeinit(&gCb->u.dlCb->ueLstCp);
140 RLOG0(L_ERROR, "rlcDbmInit: cmHashListInit Failed for rlcCb.qciHlCp");
144 /* Initialize tbHlCp Hash List */
145 if(ROK != cmHashListInit(&(rlcCb.rlcL2Cb.tbHlCp),
146 (uint16_t) RLC_TB_LIST_BUCKET_SIZE,
149 (uint16_t) CM_HASH_KEYTYPE_DEF,
153 cmHashListDeinit(&rlcCb.rlcL2Cb.qciHlCp);
154 cmHashListDeinit(&gCb->u.dlCb->cellLstCp);
155 cmHashListDeinit(&gCb->u.dlCb->ueLstCp);
156 RLOG0(L_ERROR, "rlcDbmInit: cmHashListInit Failed for rlcCb.tbHlCp");
159 #endif /* LTE_L2_MEAS */
166 * @brief Handler to De initialize hash list
168 * @param[in] gCb RLC Instance Control Block
172 Void rlcDbmDlDeInit(RlcCb *gCb)
176 /* De Initialize ueCb Hash List */
177 cmHashListDeinit(&(gCb->u.dlCb->ueLstCp));
179 /* De Initialize cellCb Hash List */
180 cmHashListDeinit(&(gCb->u.dlCb->cellLstCp));
182 /* kw005.201 added support for L2 Measurement */
183 #ifdef LTE_L2_MEAS_RLC
184 /* De Initialize qciCb Hash List */
185 cmHashListDeinit(&(rlcCb.rlcL2Cb.qciHlCp));
187 /* De Initialize tbHlCp Hash List */
188 cmHashListDeinit(&(rlcCb.rlcL2Cb.tbHlCp));
190 #endif /* LTE_L2_MEAS */
193 } /* rlcDbmDlDeInit */
197 * @brief Handler to fetch rbCb by the rlcId
200 * This function is invoked by CFG to fetch rbCb from the cellCb/ueCb in
201 * the upper interface (CKW/KWU).
203 * @param[in] gCb RLC Instance Control Block
204 * @param[in] rlcId RLC Identifier
205 * @param[out] rbCb RB Control Block
209 void rlcDbmFetchDlRbCbByRbId(RlcCb *gCb,CmLteRlcId *rlcId, RlcDlRbCb **rbCb)
213 /* Check for UE CB or CELL CB */
214 if (rlcId->ueId == 0)
218 if(rlcId->rbId >= RLC_MAX_RB_PER_CELL)
220 DU_LOG("\nRLC : rlcDbmFetchDlRbCbByRbId : Invalid RbId, Max is [%d] \
221 UEID:%d CELLID:%d", RLC_MAX_RB_PER_CELL, rlcId->ueId, rlcId->cellId);
225 rlcDbmFetchDlCellCb(gCb,rlcId->cellId, &cellCb);
228 DU_LOG("\nRLC : rlcDbmFetchDlRbCbByRbId : CellCb[%d] not found UEID:%d \
229 RBID:%d", rlcId->cellId, rlcId->ueId, rlcId->rbId);
233 *rbCb = cellCb->rbCb[rlcId->rbId];
238 if (!(RLC_VALIDATE_UE_RBID(rlcId->rbType, rlcId->rbId)))
240 DU_LOG("\n rlcDbmFetchDlRbCbByRbId : Invalid RbId[%d] for RbType[%d] \
241 RBID:%d CELLID:%d", rlcId->rbId, rlcId->rbType, rlcId->ueId, rlcId->cellId);
245 if (ROK != rlcDbmFetchDlUeCb(gCb,rlcId->ueId, rlcId->cellId, &ueCb))
247 DU_LOG("\n rlcDbmFetchDlRbCbByRbId : UeId [%d]: UeCb not found RBID:%d",\
248 rlcId->ueId, rlcId->rbId);
252 RLC_DBM_GET_RBCB_FROM_UECB(rlcId->rbId, rlcId->rbType, ueCb, *rbCb);
256 } /* rlcDbmFetchDlRbCbByRbId */
260 * @brief Handler to fetch rbCb from Local Channel Id
263 * This function is invoked by CFG to fetch rbCb from the cellCb/ueCb
264 * from local Channel Id (CKW/KWU).
266 * @param[in] gCb - RLC Instance Control Block
267 * @param[in] cellId - CELL Identifier
268 * @param[in] ueId - UE Identifier
269 * @param[in] lcId - Logical Channel Identifier
270 * @param[out] rbCb - RB Control Block
275 void rlcDbmFetchDlRbCbFromLchId(RlcCb *gCb, CmLteRnti ueId, CmLteCellId cellId, \
276 CmLteLcId lcId, RlcDlRbCb **rbCb)
280 /* Check for UE CB or CELL CB */
285 rlcDbmFetchDlCellCb(gCb, cellId, &cellCb);
288 DU_LOG("\nRLC: rlcDbmFetchDlRbCbFromLchId: CellCb[%d] not found UEID:%d", \
293 *rbCb = cellCb->lCh[lcId - 1].dlRbCb;
297 if (rlcDbmFetchDlUeCb(gCb, ueId, cellId, &ueCb) != ROK)
299 DU_LOG("\nRLC: rlcDbmFetchDlRbCbFromLchId: UeId [%d]: UeCb not found",ueId);
303 *rbCb = ueCb->lCh[lcId - 1].dlRbCb;
306 } /* rlcDbmFetchDlRbCbFromLchId */
310 * @brief Handler to delete RbCb
313 * This function is invoked by CFG to remove RbCb from Ue/Cell hashlist
315 * @param[in] gCb - RLC Instance Control Block
316 * @param[in] rbCbLst - Rb Cb List
317 * @param[in] numRbCb - Number of rbCbs
322 Void rlcDbmDelAllDlRb(RlcCb *gCb,RlcDlRbCb **rbCbLst,uint8_t numRbCb)
327 for (idx = 0; idx < numRbCb; idx++)
329 if (rbCbLst[idx] != NULLP)
332 RLC_UPD_L2_DECR_NONIP_PER_QCI_RB_COUNT(gCb, (rbCbLst[idx]));
334 if( RLC_MODE_UM == rbCbLst[idx]->mode)
336 rlcUmmFreeDlRbCb(gCb,rbCbLst[idx]);
338 RLC_FREE (gCb,rbCbLst[idx], sizeof (RlcDlRbCb));
340 else if( RLC_MODE_AM == rbCbLst[idx]->mode)
342 rlcAmmFreeDlRbCb(gCb,rbCbLst[idx]);
345 else if(RLC_MODE_TM == rbCbLst[idx]->mode)
347 cmLListCatLList(&(gCb->u.dlCb->toBeFreed.sduLst),&(rbCbLst[idx]->m.tm.sduQ));
348 RLC_FREE (gCb,rbCbLst[idx], sizeof (RlcDlRbCb));
356 } /* rlcDbmDelAllDlRb */
360 * @brief Handler to create an UeCb
363 * This function is invoked by CFG to create UeCb and insert into the
364 * Ue hashlist of RlcCb.
366 * @param[in] gCb RLC Instance Control Block
367 * @param[in] ueId UE Identifier
368 * @param[in] cellId Cell Identifier
369 * @param[in] ueCb UE Control Block
376 S16 rlcDbmCreateDlUeCb(RlcCb *gCb,CmLteRnti ueId,CmLteCellId cellId,RlcDlUeCb **ueCb)
380 RLC_ALLOC(gCb,*ueCb, sizeof(RlcDlUeCb));
382 #if (ERRCLASS & ERRCLS_ADD_RES)
385 RLOG_ARG1(L_FATAL,DBG_UEID,ueId,
386 "Memory allocation failed cellID:%d",
390 #endif /* ERRCLASS & ERRCLS_ADD_RES */
394 tUeCb->cellId = cellId;
396 if (ROK != cmHashListInsert(&(gCb->u.dlCb->ueLstCp),
398 (uint8_t *)&(tUeCb->ueId),
399 (uint16_t) sizeof(CmLteRnti)))
401 RLOG_ARG1(L_ERROR,DBG_CELLID,cellId,
402 "UeId[%u] HashList Insertion Failed",
406 /* kw005.201 ccpu00117318, updating the statistics */
411 } /* kwDbmCreateUeCb */
415 * @brief Handler to Fetch an UeCb
418 * This function is invoked by CFG to fetch UeCb from the Ue hashlist
421 * @param[in] gCb RLC Instance Control Block
422 * @param[in] ueId UE Identifier
423 * @param[in] cellId Cell Identifier
424 * @param[out] ueCb UE Control Block
430 uint8_t rlcDbmFetchDlUeCb(RlcCb *gCb, CmLteRnti ueId, CmLteCellId cellId, RlcDlUeCb **ueCb)
432 return (cmHashListFind(&(gCb->u.dlCb->ueLstCp),
437 } /* rlcDbmFetchDlUeCb */
441 * @brief Handler to delete an UeCb
444 * This function is invoked by CFG to delete UeCb from the Ue hashlist
448 * @param[in] gCb RLC Instance Control Block
449 * @param[in] ueCb UE Control Block
450 * @param[in] abrtFlag Abort Flag
455 Void rlcDbmDelDlUeCb(RlcCb *gCb,RlcDlUeCb *ueCb,Bool abortFlag)
458 #if (!defined(KW_PDCP) || !(defined(PJ_SEC_ASYNC) || defined(PJ_CMP_ASYNC)))
460 #endif /* (!defined(KW_PDCP) || ! (defined(PJ_SEC_ASYNC) ||
461 defined(PJ_CMP_ASYNC)))*/
463 /* Delete all logical channels */
464 RLC_MEM_ZERO(ueCb->lCh,sizeof(RlcDlLch) * RLC_MAX_LCH_PER_UE);
466 /* Delete all SRB RbCbs in UeCb */
467 rlcDbmDelAllDlRb(gCb,ueCb->srbCb, RLC_MAX_SRB_PER_UE);
469 /* Delete all DRB RbCbs in UeCb */
470 rlcDbmDelAllDlRb(gCb,ueCb->drbCb, RLC_MAX_DRB_PER_UE);
472 /* Delete ueCb entry from ueLstCp */
473 if(ROK != cmHashListDelete(&(gCb->u.dlCb->ueLstCp), (PTR) ueCb))
475 RLOG_ARG1(L_ERROR,DBG_CELLID,ueCb->cellId,
476 "UeId[%u] HashList Insertion Failed",
479 /* kw005.201 ccpu00117318, updating the statistics */
482 /* Deallocate ueCb */
483 RLC_FREE(gCb,ueCb, sizeof(RlcDlUeCb));
490 * @brief Handler to delete all UeCbs
493 * This function is invoked by CFG to delete all UeCbs from the Ue
496 * @param[in] gCb RLC Instance Control Block
500 Void rlcDbmDelAllDlUe(RlcCb *gCb)
502 RlcDlUeCb *ueCb = NULLP;
504 /* Until no more ueCb is ueLstCp hash list get and delete ueCb */
505 while (ROK == cmHashListGetNext(&(gCb->u.dlCb->ueLstCp),
510 rlcDbmDelDlUeCb(gCb,ueCb, TRUE);
516 } /* kwDbmDelAllUe */
518 /* kw005.201 added support for L2 Measurement */
520 Void rlcDbmDelAllDlL2MeasTbFrmUe(RlcCb *gCb,RlcDlUeCb *ueCb)
523 RlcL2MeasTb *l2MeasTb = NULLP;
524 for(tbIdx = 0; tbIdx < RLC_MAX_TB_PER_UE; tbIdx++)
526 l2MeasTb = ueCb->l2MeasTbCb[tbIdx];
527 if(l2MeasTb != NULLP)
529 RLC_FREE(gCb,l2MeasTb, sizeof(RlcL2MeasTb));
530 ueCb->l2MeasTbCb[tbIdx] = NULLP;
534 }/* End of kwDbmDelL2MeasTb */
535 #endif /* LTE_L2_MEAS */
538 * @brief Handler to create CellCb
541 * This function is invoked by CFG to create CellCb and insert into
542 * the Cell hashlist of RlcCb.
544 * @param[in] gCb RLC Instance Control Block
545 * @param[in] cellId Cell Identifier
546 * @param[in] cellCb Cell Control Block
552 S16 rlcDbmCreateDlCellCb(RlcCb *gCb,CmLteCellId cellId,RlcDlCellCb **cellCb)
554 RlcDlCellCb *tCellCb;
557 RLC_ALLOC(gCb,*cellCb, sizeof(RlcDlCellCb));
558 #if (ERRCLASS & ERRCLS_ADD_RES)
559 if (*cellCb == NULLP)
561 RLOG_ARG0(L_FATAL, DBG_CELLID,cellId,"Memory allocation failed");
564 #endif /* ERRCLASS & ERRCLS_ADD_RES */
567 tCellCb->cellId = cellId;
569 if(ROK != cmHashListInsert(&(gCb->u.dlCb->cellLstCp),
571 (uint8_t *)&(tCellCb->cellId),
572 (uint16_t) sizeof(CmLteCellId)))
574 RLOG_ARG0(L_ERROR,DBG_CELLID,cellId,"HashList Insertion Failed");
579 } /* rlcDbmCreateDlCellCb */
583 * @brief Handler to Fetch an CellCb
586 * This function is invoked by CFG to fetch UeCb from the Ue hashlist
589 * @param[in] gCb RLC Instance Control Block
590 * @param[in] cellId Cell Identifier
591 * @param[out] cellCb UE Control Block
598 uint8_t rlcDbmFetchDlCellCb(RlcCb *gCb, CmLteCellId cellId, RlcDlCellCb **cellCb)
602 if(ROK != cmHashListFind(&(gCb->u.dlCb->cellLstCp),
603 (uint8_t *)&(cellId),
608 DU_LOG("\nRLC : CellCb [%d] not found", cellId);
613 } /* kwDbmFetchCellCb */
617 * @brief Handler to delete CellCb
620 * This function is invoked by CFG to delete CellCb from the Cell hashlist
623 * @param[in] gCb RLC Instance Control Block
624 * @param[in] cellCb Cell Control Block
628 Void rlcDbmDelDlCellCb(RlcCb *gCb,RlcDlCellCb *cellCb)
631 /* Delete all rbCbs in cellCb */
632 rlcDbmDelAllDlRb(gCb,cellCb->rbCb, RLC_MAX_RB_PER_CELL);
634 /* Delete cellCb entry in hash list cellLstCp */
635 if(ROK != cmHashListDelete(&(gCb->u.dlCb->cellLstCp), (PTR) cellCb))
637 RLOG_ARG0(L_ERROR,DBG_CELLID,cellCb->cellId,"HashList Deletion Failed");
640 /* Deallocate cellCb */
641 RLC_FREE(gCb, cellCb, sizeof(RlcDlCellCb));
644 } /* kwDbmDelCellCb */
648 * @brief Handler to delete all UeCbs
651 * This function is invoked by CFG to delete all UeCbs from the Ue
653 * @param[in] gCb RLC Instance Control Block
657 Void rlcDbmDelAllDlCell(RlcCb *gCb)
659 RlcDlCellCb *cellCb = NULLP;
661 /* Until no more cellCb is ueLstCp hash list get and delete cellCb */
662 while (ROK == cmHashListGetNext(&(gCb->u.dlCb->cellLstCp),
666 rlcDbmDelDlCellCb(gCb, cellCb);
672 } /* rlcDbmDelAllDlCell */
676 * @brief Handler to delete all UeCbs and CellCbs
679 * This function is invoked by LMM to delete all UeCbs from the Ue
680 * hashlist of RlcCb and cellCbs from the Cell hashlist of rlcCb.
682 * @param[in] gCb RLC Instance Control Block
686 S16 rlcDbmDlShutdown(RlcCb *gCb)
689 rlcDbmDelAllDlCell(gCb);
691 rlcDbmDelAllDlUe(gCb);
697 } /* kwDbmShutdown */
700 /********************************************************************30**
703 **********************************************************************/