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*/
52 /* header (.h) include files */
53 #include "common_def.h"
54 #include "lkw.h" /* LKW defines */
55 #include "ckw.h" /* CKW defines */
56 #include "rgu.h" /* RGU defines */
57 #include "kwu.h" /* KWU defines */
58 #include "rlc_err.h" /* Err defines */
59 #include "rlc_env.h" /* RLC environment options */
62 /* extern (.x) include files */
63 #include "lkw.x" /* LKW */
64 #include "ckw.x" /* CKW */
65 #include "rgu.x" /* RGU */
66 #include "kwu.x" /* KWU */
68 #include "rlc_utils.h" /* RLC defines */
69 #include "rlc_dl_ul_inf.h"
73 TSL2UeStatsCb* TSL2MapUeStatsBlk (uint16_t rnti);
77 * @brief RLC Downlink database module
79 #define RLC_MODULE RLC_DBGMASK_DUT
83 * @brief Handler to initialize hash list
86 * This function initializes the UeCb, CellCb hash lists
92 S16 rlcDbmDlInit(RlcCb *gCb)
95 /* Initialize ueCb Hash List */
96 if(ROK != cmHashListInit(&(gCb->u.dlCb->ueLstCp),
97 (uint16_t) RLC_UE_LIST_BUCKET_SIZE,
100 (uint16_t) CM_HASH_KEYTYPE_CONID,
101 RLC_GET_MEM_REGION(gCb),
102 RLC_GET_MEM_POOL(gCb)))
104 DU_LOG("\nERROR --> RLC_DL : UeLstCp Initialization Failed");
108 /* Initialize cellCb Hash List */
109 if(ROK != cmHashListInit(&(gCb->u.dlCb->cellLstCp),
110 (uint16_t) RLC_CELL_LIST_BUCKET_SIZE,
113 (uint16_t) CM_HASH_KEYTYPE_CONID,
114 RLC_GET_MEM_REGION(gCb),
115 RLC_GET_MEM_POOL(gCb)))
117 cmHashListDeinit(&gCb->u.dlCb->ueLstCp);
118 DU_LOG("\nERROR --> RLC_DL : CellLstCp Initialization Failed");
122 /* kw005.201 added support for L2 Measurement */
123 #ifdef LTE_L2_MEAS_RLC
124 /* Initialize qcI Hash List */
125 if(ROK != cmHashListInit(&(rlcCb.rlcL2Cb.qciHlCp),
126 (uint16_t) RLC_QCI_LIST_BUCKET_SIZE,
129 (uint16_t) CM_HASH_KEYTYPE_DEF,
133 cmHashListDeinit(&gCb->u.dlCb->cellLstCp);
134 cmHashListDeinit(&gCb->u.dlCb->ueLstCp);
135 DU_LOG("\nERROR --> RLC_DL : rlcDbmInit: cmHashListInit Failed for rlcCb.qciHlCp");
139 /* Initialize tbHlCp Hash List */
140 if(ROK != cmHashListInit(&(rlcCb.rlcL2Cb.tbHlCp),
141 (uint16_t) RLC_TB_LIST_BUCKET_SIZE,
144 (uint16_t) CM_HASH_KEYTYPE_DEF,
148 cmHashListDeinit(&rlcCb.rlcL2Cb.qciHlCp);
149 cmHashListDeinit(&gCb->u.dlCb->cellLstCp);
150 cmHashListDeinit(&gCb->u.dlCb->ueLstCp);
151 DU_LOG("\nERROR --> RLC_DL : rlcDbmInit: cmHashListInit Failed for rlcCb.tbHlCp");
154 #endif /* LTE_L2_MEAS */
161 * @brief Handler to De initialize hash list
163 * @param[in] gCb RLC Instance Control Block
167 Void rlcDbmDlDeInit(RlcCb *gCb)
171 /* De Initialize ueCb Hash List */
172 cmHashListDeinit(&(gCb->u.dlCb->ueLstCp));
174 /* De Initialize cellCb Hash List */
175 cmHashListDeinit(&(gCb->u.dlCb->cellLstCp));
177 /* kw005.201 added support for L2 Measurement */
178 #ifdef LTE_L2_MEAS_RLC
179 /* De Initialize qciCb Hash List */
180 cmHashListDeinit(&(rlcCb.rlcL2Cb.qciHlCp));
182 /* De Initialize tbHlCp Hash List */
183 cmHashListDeinit(&(rlcCb.rlcL2Cb.tbHlCp));
185 #endif /* LTE_L2_MEAS */
188 } /* rlcDbmDlDeInit */
192 * @brief Handler to fetch rbCb by the rlcId
195 * This function is invoked by CFG to fetch rbCb from the cellCb/ueCb in
196 * the upper interface (CKW/KWU).
198 * @param[in] gCb RLC Instance Control Block
199 * @param[in] rlcId RLC Identifier
200 * @param[out] rbCb RB Control Block
204 void rlcDbmFetchDlRbCbByRbId(RlcCb *gCb,CmLteRlcId *rlcId, RlcDlRbCb **rbCb)
208 /* Check for UE CB or CELL CB */
209 if (rlcId->ueId == 0)
213 if(rlcId->rbId >= RLC_MAX_RB_PER_CELL)
215 DU_LOG("\nERROR --> RLC_DL : rlcDbmFetchDlRbCbByRbId : Invalid RbId, Max is [%d] \
216 UEID:%d CELLID:%d", RLC_MAX_RB_PER_CELL, rlcId->ueId, rlcId->cellId);
220 rlcDbmFetchDlCellCb(gCb,rlcId->cellId, &cellCb);
223 DU_LOG("\nERROR --> RLC_DL : rlcDbmFetchDlRbCbByRbId : CellCb[%d] not found UEID:%d \
224 RBID:%d", rlcId->cellId, rlcId->ueId, rlcId->rbId);
228 *rbCb = cellCb->rbCb[rlcId->rbId];
233 if (!(RLC_VALIDATE_UE_RBID(rlcId->rbType, rlcId->rbId)))
235 DU_LOG("\nERROR --> RLC_DL : rlcDbmFetchDlRbCbByRbId : Invalid RbId[%d] for RbType[%d] \
236 RBID:%d CELLID:%d", rlcId->rbId, rlcId->rbType, rlcId->ueId, rlcId->cellId);
240 if (ROK != rlcDbmFetchDlUeCb(gCb,rlcId->ueId, rlcId->cellId, &ueCb))
242 DU_LOG("\nERROR --> RLC_DL : rlcDbmFetchDlRbCbByRbId : UeId [%d]: UeCb not found RBID:%d",\
243 rlcId->ueId, rlcId->rbId);
247 RLC_DBM_GET_RBCB_FROM_UECB(rlcId->rbId, rlcId->rbType, ueCb, *rbCb);
251 } /* rlcDbmFetchDlRbCbByRbId */
255 * @brief Handler to fetch rbCb from Local Channel Id
258 * This function is invoked by CFG to fetch rbCb from the cellCb/ueCb
259 * from local Channel Id (CKW/KWU).
261 * @param[in] gCb - RLC Instance Control Block
262 * @param[in] cellId - CELL Identifier
263 * @param[in] ueId - UE Identifier
264 * @param[in] lcId - Logical Channel Identifier
265 * @param[out] rbCb - RB Control Block
270 void rlcDbmFetchDlRbCbFromLchId(RlcCb *gCb, CmLteRnti ueId, CmLteCellId cellId, \
271 CmLteLcId lcId, RlcDlRbCb **rbCb)
275 /* Check for UE CB or CELL CB */
280 rlcDbmFetchDlCellCb(gCb, cellId, &cellCb);
283 DU_LOG("\nERROR --> RLC_DL : rlcDbmFetchDlRbCbFromLchId: CellCb[%d] not found UEID:%d", \
288 *rbCb = cellCb->lCh[lcId - 1].dlRbCb;
292 if (rlcDbmFetchDlUeCb(gCb, ueId, cellId, &ueCb) != ROK)
294 DU_LOG("\nERROR --> RLC_DL : rlcDbmFetchDlRbCbFromLchId: UeId [%d]: UeCb not found",ueId);
298 *rbCb = ueCb->lCh[lcId - 1].dlRbCb;
301 } /* rlcDbmFetchDlRbCbFromLchId */
305 * @brief Handler to delete RbCb
308 * This function is invoked by CFG to remove RbCb from Ue/Cell hashlist
310 * @param[in] gCb - RLC Instance Control Block
311 * @param[in] rbCbLst - Rb Cb List
312 * @param[in] numRbCb - Number of rbCbs
317 Void rlcDbmDelAllDlRb(RlcCb *gCb,RlcDlRbCb **rbCbLst,uint8_t numRbCb)
322 for (idx = 0; idx < numRbCb; idx++)
324 if (rbCbLst[idx] != NULLP)
327 RLC_UPD_L2_DECR_NONIP_PER_QCI_RB_COUNT(gCb, (rbCbLst[idx]));
329 if( RLC_MODE_UM == rbCbLst[idx]->mode)
331 rlcUmmFreeDlRbCb(gCb,rbCbLst[idx]);
333 RLC_FREE (gCb,rbCbLst[idx], sizeof (RlcDlRbCb));
335 else if( RLC_MODE_AM == rbCbLst[idx]->mode)
337 rlcAmmFreeDlRbCb(gCb,rbCbLst[idx]);
340 else if(RLC_MODE_TM == rbCbLst[idx]->mode)
342 cmLListCatLList(&(gCb->u.dlCb->toBeFreed.sduLst),&(rbCbLst[idx]->m.tm.sduQ));
343 RLC_FREE (gCb,rbCbLst[idx], sizeof (RlcDlRbCb));
351 } /* rlcDbmDelAllDlRb */
355 * @brief Handler to create an UeCb
358 * This function is invoked by CFG to create UeCb and insert into the
359 * Ue hashlist of RlcCb.
361 * @param[in] gCb RLC Instance Control Block
362 * @param[in] ueId UE Identifier
363 * @param[in] cellId Cell Identifier
364 * @param[in] ueCb UE Control Block
371 S16 rlcDbmCreateDlUeCb(RlcCb *gCb,CmLteRnti ueId,CmLteCellId cellId,RlcDlUeCb **ueCb)
375 RLC_ALLOC(gCb,*ueCb, sizeof(RlcDlUeCb));
377 #if (ERRCLASS & ERRCLS_ADD_RES)
380 DU_LOG("\nERROR --> RLC_DL : Memory allocation failed cellID:%d",
384 #endif /* ERRCLASS & ERRCLS_ADD_RES */
388 tUeCb->cellId = cellId;
390 if (ROK != cmHashListInsert(&(gCb->u.dlCb->ueLstCp),
392 (uint8_t *)&(tUeCb->ueId),
393 (uint16_t) sizeof(CmLteRnti)))
395 DU_LOG("\nERROR --> RLC_DL : UeId[%u] HashList Insertion Failed",
399 /* kw005.201 ccpu00117318, updating the statistics */
404 } /* kwDbmCreateUeCb */
408 * @brief Handler to Fetch an UeCb
411 * This function is invoked by CFG to fetch UeCb from the Ue hashlist
414 * @param[in] gCb RLC Instance Control Block
415 * @param[in] ueId UE Identifier
416 * @param[in] cellId Cell Identifier
417 * @param[out] ueCb UE Control Block
423 uint8_t rlcDbmFetchDlUeCb(RlcCb *gCb, CmLteRnti ueId, CmLteCellId cellId, RlcDlUeCb **ueCb)
425 return (cmHashListFind(&(gCb->u.dlCb->ueLstCp),
430 } /* rlcDbmFetchDlUeCb */
434 * @brief Handler to delete an UeCb
437 * This function is invoked by CFG to delete UeCb from the Ue hashlist
441 * @param[in] gCb RLC Instance Control Block
442 * @param[in] ueCb UE Control Block
443 * @param[in] abrtFlag Abort Flag
448 Void rlcDbmDelDlUeCb(RlcCb *gCb,RlcDlUeCb *ueCb,Bool abortFlag)
451 #if (!defined(KW_PDCP) || !(defined(PJ_SEC_ASYNC) || defined(PJ_CMP_ASYNC)))
453 #endif /* (!defined(KW_PDCP) || ! (defined(PJ_SEC_ASYNC) ||
454 defined(PJ_CMP_ASYNC)))*/
456 /* Delete all logical channels */
457 RLC_MEM_ZERO(ueCb->lCh,sizeof(RlcDlLch) * RLC_MAX_LCH_PER_UE);
459 /* Delete all SRB RbCbs in UeCb */
460 rlcDbmDelAllDlRb(gCb,ueCb->srbCb, RLC_MAX_SRB_PER_UE);
462 /* Delete all DRB RbCbs in UeCb */
463 rlcDbmDelAllDlRb(gCb,ueCb->drbCb, RLC_MAX_DRB_PER_UE);
465 /* Delete ueCb entry from ueLstCp */
466 if(ROK != cmHashListDelete(&(gCb->u.dlCb->ueLstCp), (PTR) ueCb))
468 DU_LOG("\nERROR --> RLC_DL : UeId[%u] HashList Insertion Failed",
471 /* kw005.201 ccpu00117318, updating the statistics */
474 /* Deallocate ueCb */
475 RLC_FREE(gCb,ueCb, sizeof(RlcDlUeCb));
482 * @brief Handler to delete all UeCbs
485 * This function is invoked by CFG to delete all UeCbs from the Ue
488 * @param[in] gCb RLC Instance Control Block
492 Void rlcDbmDelAllDlUe(RlcCb *gCb)
494 RlcDlUeCb *ueCb = NULLP;
496 /* Until no more ueCb is ueLstCp hash list get and delete ueCb */
497 while (ROK == cmHashListGetNext(&(gCb->u.dlCb->ueLstCp),
502 rlcDbmDelDlUeCb(gCb,ueCb, TRUE);
508 } /* kwDbmDelAllUe */
510 /* kw005.201 added support for L2 Measurement */
512 Void rlcDbmDelAllDlL2MeasTbFrmUe(RlcCb *gCb,RlcDlUeCb *ueCb)
515 RlcL2MeasTb *l2MeasTb = NULLP;
516 for(tbIdx = 0; tbIdx < RLC_MAX_TB_PER_UE; tbIdx++)
518 l2MeasTb = ueCb->l2MeasTbCb[tbIdx];
519 if(l2MeasTb != NULLP)
521 RLC_FREE(gCb,l2MeasTb, sizeof(RlcL2MeasTb));
522 ueCb->l2MeasTbCb[tbIdx] = NULLP;
526 }/* End of kwDbmDelL2MeasTb */
527 #endif /* LTE_L2_MEAS */
530 * @brief Handler to create CellCb
533 * This function is invoked by CFG to create CellCb and insert into
534 * the Cell hashlist of RlcCb.
536 * @param[in] gCb RLC Instance Control Block
537 * @param[in] cellId Cell Identifier
538 * @param[in] cellCb Cell Control Block
544 S16 rlcDbmCreateDlCellCb(RlcCb *gCb,CmLteCellId cellId,RlcDlCellCb **cellCb)
546 RlcDlCellCb *tCellCb;
549 RLC_ALLOC(gCb,*cellCb, sizeof(RlcDlCellCb));
550 #if (ERRCLASS & ERRCLS_ADD_RES)
551 if (*cellCb == NULLP)
553 DU_LOG("\nERROR --> RLC_DL : Memory allocation failed");
556 #endif /* ERRCLASS & ERRCLS_ADD_RES */
559 tCellCb->cellId = cellId;
561 if(ROK != cmHashListInsert(&(gCb->u.dlCb->cellLstCp),
563 (uint8_t *)&(tCellCb->cellId),
564 (uint16_t) sizeof(CmLteCellId)))
566 DU_LOG("\nERROR --> RLC_DL : HashList Insertion Failed");
571 } /* rlcDbmCreateDlCellCb */
575 * @brief Handler to Fetch an CellCb
578 * This function is invoked by CFG to fetch UeCb from the Ue hashlist
581 * @param[in] gCb RLC Instance Control Block
582 * @param[in] cellId Cell Identifier
583 * @param[out] cellCb UE Control Block
590 uint8_t rlcDbmFetchDlCellCb(RlcCb *gCb, CmLteCellId cellId, RlcDlCellCb **cellCb)
594 if(ROK != cmHashListFind(&(gCb->u.dlCb->cellLstCp),
595 (uint8_t *)&(cellId),
600 DU_LOG("\nERROR --> RLC_DL : CellCb [%d] not found", cellId);
605 } /* kwDbmFetchCellCb */
609 * @brief Handler to delete CellCb
612 * This function is invoked by CFG to delete CellCb from the Cell hashlist
615 * @param[in] gCb RLC Instance Control Block
616 * @param[in] cellCb Cell Control Block
620 Void rlcDbmDelDlCellCb(RlcCb *gCb,RlcDlCellCb *cellCb)
623 /* Delete all rbCbs in cellCb */
624 rlcDbmDelAllDlRb(gCb,cellCb->rbCb, RLC_MAX_RB_PER_CELL);
626 /* Delete cellCb entry in hash list cellLstCp */
627 if(ROK != cmHashListDelete(&(gCb->u.dlCb->cellLstCp), (PTR) cellCb))
629 DU_LOG("\nERROR --> RLC_DL : HashList Deletion Failed");
632 /* Deallocate cellCb */
633 RLC_FREE(gCb, cellCb, sizeof(RlcDlCellCb));
636 } /* kwDbmDelCellCb */
640 * @brief Handler to delete all UeCbs
643 * This function is invoked by CFG to delete all UeCbs from the Ue
645 * @param[in] gCb RLC Instance Control Block
649 Void rlcDbmDelAllDlCell(RlcCb *gCb)
651 RlcDlCellCb *cellCb = NULLP;
653 /* Until no more cellCb is ueLstCp hash list get and delete cellCb */
654 while (ROK == cmHashListGetNext(&(gCb->u.dlCb->cellLstCp),
658 rlcDbmDelDlCellCb(gCb, cellCb);
664 } /* rlcDbmDelAllDlCell */
668 * @brief Handler to delete all UeCbs and CellCbs
671 * This function is invoked by LMM to delete all UeCbs from the Ue
672 * hashlist of RlcCb and cellCbs from the Cell hashlist of rlcCb.
674 * @param[in] gCb RLC Instance Control Block
678 S16 rlcDbmDlShutdown(RlcCb *gCb)
681 rlcDbmDelAllDlCell(gCb);
683 rlcDbmDelAllDlUe(gCb);
689 } /* kwDbmShutdown */
692 /********************************************************************30**
695 **********************************************************************/