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 EXTERN TSL2UeStatsCb* TSL2MapUeStatsBlk (U16 rnti);
82 * @brief RLC Downlink database module
84 #define KW_MODULE KW_DBGMASK_DUT
88 * @brief Handler to initialize hash list
91 * This function initializes the UeCb, CellCb hash lists
98 PUBLIC S16 kwDbmDlInit
103 PUBLIC S16 kwDbmDlInit(gCb)
109 /* Initialize ueCb Hash List */
110 if(ROK != cmHashListInit(&(gCb->u.dlCb->ueLstCp),
111 (U16) KW_UE_LIST_BUCKET_SIZE,
114 (U16) CM_HASH_KEYTYPE_CONID,
115 KW_GET_MEM_REGION(gCb),
116 KW_GET_MEM_POOL(gCb)))
118 RLOG0(L_ERROR, "UeLstCp Initialization Failed");
122 /* Initialize cellCb Hash List */
123 if(ROK != cmHashListInit(&(gCb->u.dlCb->cellLstCp),
124 (U16) KW_CELL_LIST_BUCKET_SIZE,
127 (U16) CM_HASH_KEYTYPE_CONID,
128 KW_GET_MEM_REGION(gCb),
129 KW_GET_MEM_POOL(gCb)))
131 cmHashListDeinit(&gCb->u.dlCb->ueLstCp);
132 RLOG0(L_ERROR, "CellLstCp Initialization Failed");
136 /* kw005.201 added support for L2 Measurement */
137 #ifdef LTE_L2_MEAS_RLC
138 /* Initialize qcI Hash List */
139 if(ROK != cmHashListInit(&(rlcCb.kwL2Cb.qciHlCp),
140 (U16) KW_QCI_LIST_BUCKET_SIZE,
143 (U16) CM_HASH_KEYTYPE_DEF,
147 cmHashListDeinit(&gCb->u.dlCb->cellLstCp);
148 cmHashListDeinit(&gCb->u.dlCb->ueLstCp);
149 RLOG0(L_ERROR, "kwDbmInit: cmHashListInit Failed for rlcCb.qciHlCp");
153 /* Initialize tbHlCp Hash List */
154 if(ROK != cmHashListInit(&(rlcCb.kwL2Cb.tbHlCp),
155 (U16) KW_TB_LIST_BUCKET_SIZE,
158 (U16) CM_HASH_KEYTYPE_DEF,
162 cmHashListDeinit(&rlcCb.kwL2Cb.qciHlCp);
163 cmHashListDeinit(&gCb->u.dlCb->cellLstCp);
164 cmHashListDeinit(&gCb->u.dlCb->ueLstCp);
165 RLOG0(L_ERROR, "kwDbmInit: cmHashListInit Failed for rlcCb.tbHlCp");
168 #endif /* LTE_L2_MEAS */
175 * @brief Handler to De initialize hash list
177 * @param[in] gCb RLC Instance Control Block
182 PUBLIC Void kwDbmDlDeInit
187 PUBLIC Void kwDbmDlDeInit(gCb)
194 /* De Initialize ueCb Hash List */
195 cmHashListDeinit(&(gCb->u.dlCb->ueLstCp));
197 /* De Initialize cellCb Hash List */
198 cmHashListDeinit(&(gCb->u.dlCb->cellLstCp));
200 /* kw005.201 added support for L2 Measurement */
201 #ifdef LTE_L2_MEAS_RLC
202 /* De Initialize qciCb Hash List */
203 cmHashListDeinit(&(rlcCb.kwL2Cb.qciHlCp));
205 /* De Initialize tbHlCp Hash List */
206 cmHashListDeinit(&(rlcCb.kwL2Cb.tbHlCp));
208 #endif /* LTE_L2_MEAS */
211 } /* kwDbmDlDeInit */
215 * @brief Handler to fetch rbCb by the rlcId
218 * This function is invoked by CFG to fetch rbCb from the cellCb/ueCb in
219 * the upper interface (CKW/KWU).
221 * @param[in] gCb RLC Instance Control Block
222 * @param[in] rlcId RLC Identifier
223 * @param[out] rbCb RB Control Block
228 PUBLIC Void kwDbmFetchDlRbCbByRbId
235 PUBLIC Void kwDbmFetchDlRbCbByRbId(gCb, rlcId, rbCb)
241 TRC3(kwDbmFetchDlRbCbByRbId)
245 /* Check for UE CB or CELL CB */
246 if (rlcId->ueId == 0)
250 if(rlcId->rbId >= KW_MAX_RB_PER_CELL)
252 RLOG_ARG3(L_ERROR,DBG_RBID,rlcId->rbId ,
253 "Invalid RbId, Max is [%d] UEID:%d CELLID:%d",
260 kwDbmFetchDlCellCb(gCb,rlcId->cellId, &cellCb);
263 RLOG_ARG2(L_ERROR,DBG_CELLID,rlcId->cellId,
264 "CellCb not found UEID:%d RBID:%d",
270 *rbCb = cellCb->rbCb[rlcId->rbId];
275 if (!(KW_VALIDATE_UE_RBID(rlcId->rbType, rlcId->rbId)))
277 RLOG_ARG3(L_ERROR,DBG_RBID, rlcId->rbId,
278 "Invalid RbId for RbType[%d] RBID:%d CELLID:%d",
285 if (ROK != kwDbmFetchDlUeCb(gCb,rlcId->ueId, rlcId->cellId, &ueCb))
287 RLOG_ARG2(L_ERROR,DBG_CELLID, rlcId->cellId,
288 "UeId [%d]: UeCb not found RBID:%d",
294 KW_DBM_GET_RBCB_FROM_UECB(rlcId->rbId, rlcId->rbType, ueCb, *rbCb);
298 } /* kwDbmFetchDlRbCbByRbId */
302 * @brief Handler to fetch rbCb from Local Channel Id
305 * This function is invoked by CFG to fetch rbCb from the cellCb/ueCb
306 * from local Channel Id (CKW/KWU).
308 * @param[in] gCb - RLC Instance Control Block
309 * @param[in] cellId - CELL Identifier
310 * @param[in] ueId - UE Identifier
311 * @param[in] lcId - Logical Channel Identifier
312 * @param[out] rbCb - RB Control Block
318 PUBLIC Void kwDbmFetchDlRbCbFromLchId
327 PUBLIC Void kwDbmFetchDlRbCbFromLchId(gCb, ueId, cellId, lcId, rbCb)
337 TRC3(kwDbmFetchDlRbCbFromLchId)
340 /* Check for UE CB or CELL CB */
345 kwDbmFetchDlCellCb(gCb, cellId, &cellCb);
348 RLOG_ARG1(L_ERROR,DBG_CELLID,cellId,"CellCb not found UEID:%d",ueId);
352 *rbCb = cellCb->lCh[lcId - 1].dlRbCb;
356 if (kwDbmFetchDlUeCb(gCb, ueId, cellId, &ueCb) != ROK)
358 RLOG_ARG1(L_ERROR,DBG_CELLID, cellId,"UeId [%d]: UeCb not found",ueId);
362 *rbCb = ueCb->lCh[lcId - 1].dlRbCb;
365 } /* kwDbmFetchDlRbCbFromLchId */
369 * @brief Handler to delete RbCb
372 * This function is invoked by CFG to remove RbCb from Ue/Cell hashlist
374 * @param[in] gCb - RLC Instance Control Block
375 * @param[in] rbCbLst - Rb Cb List
376 * @param[in] numRbCb - Number of rbCbs
382 PUBLIC Void kwDbmDelAllDlRb
389 PUBLIC Void kwDbmDelAllDlRb(gCb, rbCbLst, numRbCb)
397 TRC3(kwDbmDelAllDlRb)
400 for (idx = 0; idx < numRbCb; idx++)
402 if (rbCbLst[idx] != NULLP)
405 KW_UPD_L2_DECR_NONIP_PER_QCI_RB_COUNT(gCb, (rbCbLst[idx]));
407 if( CM_LTE_MODE_UM == rbCbLst[idx]->mode)
409 kwUmmFreeDlRbCb(gCb,rbCbLst[idx]);
411 RLC_FREE (gCb,rbCbLst[idx], sizeof (RlcDlRbCb));
413 else if( CM_LTE_MODE_AM == rbCbLst[idx]->mode)
415 kwAmmFreeDlRbCb(gCb,rbCbLst[idx]);
418 else if(CM_LTE_MODE_TM == rbCbLst[idx]->mode)
420 cmLListCatLList(&(gCb->u.dlCb->toBeFreed.sduLst),&(rbCbLst[idx]->m.tm.sduQ));
421 RLC_FREE (gCb,rbCbLst[idx], sizeof (RlcDlRbCb));
429 } /* kwDbmDelAllDlRb */
433 * @brief Handler to create an UeCb
436 * This function is invoked by CFG to create UeCb and insert into the
437 * Ue hashlist of RlcCb.
439 * @param[in] gCb RLC Instance Control Block
440 * @param[in] ueId UE Identifier
441 * @param[in] cellId Cell Identifier
442 * @param[in] ueCb UE Control Block
450 PUBLIC S16 kwDbmCreateDlUeCb
458 PUBLIC S16 kwDbmCreateDlUeCb(gCb,ueId, cellId, ueCb)
467 TRC3(kwDbmCreateDlUeCb)
470 RLC_ALLOC(gCb,*ueCb, sizeof(RlcDlUeCb));
472 #if (ERRCLASS & ERRCLS_ADD_RES)
475 RLOG_ARG1(L_FATAL,DBG_UEID,ueId,
476 "Memory allocation failed cellID:%d",
480 #endif /* ERRCLASS & ERRCLS_ADD_RES */
484 tUeCb->cellId = cellId;
486 if (ROK != cmHashListInsert(&(gCb->u.dlCb->ueLstCp),
488 (U8 *)&(tUeCb->ueId),
489 (U16) sizeof(CmLteRnti)))
491 RLOG_ARG1(L_ERROR,DBG_CELLID,cellId,
492 "UeId[%u] HashList Insertion Failed",
496 /* kw005.201 ccpu00117318, updating the statistics */
501 } /* kwDbmCreateUeCb */
505 * @brief Handler to Fetch an UeCb
508 * This function is invoked by CFG to fetch UeCb from the Ue hashlist
511 * @param[in] gCb RLC Instance Control Block
512 * @param[in] ueId UE Identifier
513 * @param[in] cellId Cell Identifier
514 * @param[out] ueCb UE Control Block
521 PUBLIC S16 kwDbmFetchDlUeCb
529 PUBLIC S16 kwDbmFetchDlUeCb(gCb,ueId, cellId, ueCb)
537 TRC3(kwDbmFetchDlUeCb)
540 return (cmHashListFind(&(gCb->u.dlCb->ueLstCp),
545 } /* kwDbmFetchDlUeCb */
549 * @brief Handler to delete an UeCb
552 * This function is invoked by CFG to delete UeCb from the Ue hashlist
556 * @param[in] gCb RLC Instance Control Block
557 * @param[in] ueCb UE Control Block
558 * @param[in] abrtFlag Abort Flag
564 PUBLIC Void kwDbmDelDlUeCb
571 PUBLIC Void kwDbmDelDlUeCb(gCb,eCb, abortFlag)
580 #if (!defined(KW_PDCP) || !(defined(PJ_SEC_ASYNC) || defined(PJ_CMP_ASYNC)))
582 #endif /* (!defined(KW_PDCP) || ! (defined(PJ_SEC_ASYNC) ||
583 defined(PJ_CMP_ASYNC)))*/
585 /* Delete all logical channels */
586 KW_MEM_ZERO(ueCb->lCh,sizeof(RlcDlLch) * KW_MAX_LCH_PER_UE);
588 /* Delete all SRB RbCbs in UeCb */
589 kwDbmDelAllDlRb(gCb,ueCb->srbCb, KW_MAX_SRB_PER_UE);
591 /* Delete all DRB RbCbs in UeCb */
592 kwDbmDelAllDlRb(gCb,ueCb->drbCb, KW_MAX_DRB_PER_UE);
594 /* Delete ueCb entry from ueLstCp */
595 if(ROK != cmHashListDelete(&(gCb->u.dlCb->ueLstCp), (PTR) ueCb))
597 RLOG_ARG1(L_ERROR,DBG_CELLID,ueCb->cellId,
598 "UeId[%u] HashList Insertion Failed",
601 /* kw005.201 ccpu00117318, updating the statistics */
604 /* Deallocate ueCb */
605 RLC_FREE(gCb,ueCb, sizeof(RlcDlUeCb));
612 * @brief Handler to delete all UeCbs
615 * This function is invoked by CFG to delete all UeCbs from the Ue
618 * @param[in] gCb RLC Instance Control Block
623 PUBLIC Void kwDbmDelAllDlUe
628 PUBLIC Void kwDbmDelAllDlUe(gCb)
632 RlcDlUeCb *ueCb = NULLP;
634 TRC3(kwDbmDelAllDlUe)
637 /* Until no more ueCb is ueLstCp hash list get and delete ueCb */
638 while (ROK == cmHashListGetNext(&(gCb->u.dlCb->ueLstCp),
643 kwDbmDelDlUeCb(gCb,ueCb, TRUE);
649 } /* kwDbmDelAllUe */
651 /* kw005.201 added support for L2 Measurement */
654 PUBLIC Void kwDbmDelAllDlL2MeasTbFrmUe
660 PUBLIC Void kwDbmDelAllDlL2MeasTbFrmUe(gCb,ueCb)
666 KwL2MeasTb *l2MeasTb = NULLP;
667 for(tbIdx = 0; tbIdx < KW_MAX_TB_PER_UE; tbIdx++)
669 l2MeasTb = ueCb->l2MeasTbCb[tbIdx];
670 if(l2MeasTb != NULLP)
672 RLC_FREE(gCb,l2MeasTb, sizeof(KwL2MeasTb));
673 ueCb->l2MeasTbCb[tbIdx] = NULLP;
677 }/* End of kwDbmDelL2MeasTb */
678 #endif /* LTE_L2_MEAS */
681 * @brief Handler to create CellCb
684 * This function is invoked by CFG to create CellCb and insert into
685 * the Cell hashlist of RlcCb.
687 * @param[in] gCb RLC Instance Control Block
688 * @param[in] cellId Cell Identifier
689 * @param[in] cellCb Cell Control Block
696 PUBLIC S16 kwDbmCreateDlCellCb
703 PUBLIC S16 kwDbmCreateDlCellCb(gCb,cellId, cellCb)
706 RlcDlCellCb **cellCb;
709 RlcDlCellCb *tCellCb;
711 TRC3(kwDbmCreateDlCellCb)
713 RLC_ALLOC(gCb,*cellCb, sizeof(RlcDlCellCb));
714 #if (ERRCLASS & ERRCLS_ADD_RES)
715 if (*cellCb == NULLP)
717 RLOG_ARG0(L_FATAL, DBG_CELLID,cellId,"Memory allocation failed");
720 #endif /* ERRCLASS & ERRCLS_ADD_RES */
723 tCellCb->cellId = cellId;
725 if(ROK != cmHashListInsert(&(gCb->u.dlCb->cellLstCp),
727 (U8 *)&(tCellCb->cellId),
728 (U16) sizeof(CmLteCellId)))
730 RLOG_ARG0(L_ERROR,DBG_CELLID,cellId,"HashList Insertion Failed");
735 } /* kwDbmCreateDlCellCb */
739 * @brief Handler to Fetch an CellCb
742 * This function is invoked by CFG to fetch UeCb from the Ue hashlist
745 * @param[in] gCb RLC Instance Control Block
746 * @param[in] cellId Cell Identifier
747 * @param[out] cellCb UE Control Block
755 PUBLIC S16 kwDbmFetchDlCellCb
762 PUBLIC S16 kwDbmFetchDlCellCb(gCb,cellId, cellCb)
765 RlcDlCellCb **cellCb;
768 TRC3(kwDbmFetchDlCellCb)
773 if(ROK != cmHashListFind(&(gCb->u.dlCb->cellLstCp),
779 RLOG_ARG0(L_ERROR,DBG_CELLID, cellId,"CellCb not found");
784 } /* kwDbmFetchCellCb */
788 * @brief Handler to delete CellCb
791 * This function is invoked by CFG to delete CellCb from the Cell hashlist
794 * @param[in] gCb RLC Instance Control Block
795 * @param[in] cellCb Cell Control Block
800 PUBLIC Void kwDbmDelDlCellCb
806 PUBLIC Void kwDbmDelDlCellCb(gCb,cellCb)
811 TRC3(kwDbmDelDlCellCb)
814 /* Delete all rbCbs in cellCb */
815 kwDbmDelAllDlRb(gCb,cellCb->rbCb, KW_MAX_RB_PER_CELL);
817 /* Delete cellCb entry in hash list cellLstCp */
818 if(ROK != cmHashListDelete(&(gCb->u.dlCb->cellLstCp), (PTR) cellCb))
820 RLOG_ARG0(L_ERROR,DBG_CELLID,cellCb->cellId,"HashList Deletion Failed");
823 /* Deallocate cellCb */
824 RLC_FREE(gCb, cellCb, sizeof(RlcDlCellCb));
827 } /* kwDbmDelCellCb */
831 * @brief Handler to delete all UeCbs
834 * This function is invoked by CFG to delete all UeCbs from the Ue
836 * @param[in] gCb RLC Instance Control Block
841 PUBLIC Void kwDbmDelAllDlCell
846 PUBLIC Void kwDbmDelAllDlCell(gCb)
850 RlcDlCellCb *cellCb = NULLP;
852 TRC3(kwDbmDelAllDlCell)
855 /* Until no more cellCb is ueLstCp hash list get and delete cellCb */
856 while (ROK == cmHashListGetNext(&(gCb->u.dlCb->cellLstCp),
860 kwDbmDelDlCellCb(gCb, cellCb);
866 } /* kwDbmDelAllDlCell */
870 * @brief Handler to delete all UeCbs and CellCbs
873 * This function is invoked by LMM to delete all UeCbs from the Ue
874 * hashlist of RlcCb and cellCbs from the Cell hashlist of rlcCb.
876 * @param[in] gCb RLC Instance Control Block
881 PUBLIC S16 kwDbmDlShutdown
886 PUBLIC S16 kwDbmDlShutdown(gCb)
890 TRC3(kwDbmDlShutdown)
892 kwDbmDelAllDlCell(gCb);
894 kwDbmDelAllDlUe(gCb);
900 } /* kwDbmShutdown */
903 /********************************************************************30**
906 **********************************************************************/