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 "envopt.h" /* environment options */
57 #include "envdep.h" /* environment dependent */
58 #include "envind.h" /* environment independent */
60 #include "gen.h" /* general */
61 #include "ssi.h" /* system services */
62 #include "cm5.h" /* common timer defines */
63 #include "cm_tkns.h" /* common tokens defines */
64 #include "cm_mblk.h" /* common memory allocation library defines */
65 #include "cm_llist.h" /* common link list defines */
66 #include "cm_hash.h" /* common hash list defines */
67 #include "cm_lte.h" /* common LTE defines */
68 #include "lkw.h" /* LKW defines */
69 #include "ckw.h" /* CKW defines */
70 #include "kwu.h" /* KWU defines */
71 #include "rgu.h" /* RGU defines */
72 #include "kw_err.h" /* Err defines */
73 #include "kw_env.h" /* RLC environment options */
75 #include "kw.h" /* RLC defines */
79 /* extern (.x) include files */
80 #include "gen.x" /* general */
81 #include "ssi.x" /* system services */
83 #include "cm5.x" /* common timer library */
84 #include "cm_tkns.x" /* common tokens */
85 #include "cm_mblk.x" /* common memory allocation */
86 #include "cm_llist.x" /* common link list */
87 #include "cm_hash.x" /* common hash list */
88 #include "cm_lte.x" /* common LTE includes */
89 #include "cm_lib.x" /* common memory allocation library */
90 #include "lkw.x" /* LKW */
91 #include "ckw.x" /* CKW */
92 #include "kwu.x" /* KWU */
93 #include "rgu.x" /* RGU */
101 EXTERN TSL2UeStatsCb* TSL2MapUeStatsBlk (U16 rnti);
105 * @brief RLC Downlink database module
107 #define KW_MODULE KW_DBGMASK_DUT
111 * @brief Handler to initialize hash list
114 * This function initializes the UeCb, CellCb hash lists
121 PUBLIC S16 kwDbmDlInit
126 PUBLIC S16 kwDbmDlInit(gCb)
132 /* Initialize ueCb Hash List */
133 if(ROK != cmHashListInit(&(gCb->u.dlCb->ueLstCp),
134 (U16) KW_UE_LIST_BUCKET_SIZE,
137 (U16) CM_HASH_KEYTYPE_CONID,
138 KW_GET_MEM_REGION(gCb),
139 KW_GET_MEM_POOL(gCb)))
141 RLOG0(L_ERROR, "UeLstCp Initialization Failed");
145 /* Initialize cellCb Hash List */
146 if(ROK != cmHashListInit(&(gCb->u.dlCb->cellLstCp),
147 (U16) KW_CELL_LIST_BUCKET_SIZE,
150 (U16) CM_HASH_KEYTYPE_CONID,
151 KW_GET_MEM_REGION(gCb),
152 KW_GET_MEM_POOL(gCb)))
154 cmHashListDeinit(&gCb->u.dlCb->ueLstCp);
155 RLOG0(L_ERROR, "CellLstCp Initialization Failed");
159 /* kw005.201 added support for L2 Measurement */
160 #ifdef LTE_L2_MEAS_RLC
161 /* Initialize qcI Hash List */
162 if(ROK != cmHashListInit(&(kwCb.kwL2Cb.qciHlCp),
163 (U16) KW_QCI_LIST_BUCKET_SIZE,
166 (U16) CM_HASH_KEYTYPE_DEF,
170 cmHashListDeinit(&gCb->u.dlCb->cellLstCp);
171 cmHashListDeinit(&gCb->u.dlCb->ueLstCp);
172 RLOG0(L_ERROR, "kwDbmInit: cmHashListInit Failed for kwCb.qciHlCp");
176 /* Initialize tbHlCp Hash List */
177 if(ROK != cmHashListInit(&(kwCb.kwL2Cb.tbHlCp),
178 (U16) KW_TB_LIST_BUCKET_SIZE,
181 (U16) CM_HASH_KEYTYPE_DEF,
185 cmHashListDeinit(&kwCb.kwL2Cb.qciHlCp);
186 cmHashListDeinit(&gCb->u.dlCb->cellLstCp);
187 cmHashListDeinit(&gCb->u.dlCb->ueLstCp);
188 RLOG0(L_ERROR, "kwDbmInit: cmHashListInit Failed for kwCb.tbHlCp");
191 #endif /* LTE_L2_MEAS */
198 * @brief Handler to De initialize hash list
200 * @param[in] gCb RLC Instance Control Block
205 PUBLIC Void kwDbmDlDeInit
210 PUBLIC Void kwDbmDlDeInit(gCb)
217 /* De Initialize ueCb Hash List */
218 cmHashListDeinit(&(gCb->u.dlCb->ueLstCp));
220 /* De Initialize cellCb Hash List */
221 cmHashListDeinit(&(gCb->u.dlCb->cellLstCp));
223 /* kw005.201 added support for L2 Measurement */
224 #ifdef LTE_L2_MEAS_RLC
225 /* De Initialize qciCb Hash List */
226 cmHashListDeinit(&(kwCb.kwL2Cb.qciHlCp));
228 /* De Initialize tbHlCp Hash List */
229 cmHashListDeinit(&(kwCb.kwL2Cb.tbHlCp));
231 #endif /* LTE_L2_MEAS */
234 } /* kwDbmDlDeInit */
238 * @brief Handler to fetch rbCb by the rlcId
241 * This function is invoked by CFG to fetch rbCb from the cellCb/ueCb in
242 * the upper interface (CKW/KWU).
244 * @param[in] gCb RLC Instance Control Block
245 * @param[in] rlcId RLC Identifier
246 * @param[out] rbCb RB Control Block
251 PUBLIC Void kwDbmFetchDlRbCbByRbId
258 PUBLIC Void kwDbmFetchDlRbCbByRbId(gCb, rlcId, rbCb)
264 TRC3(kwDbmFetchDlRbCbByRbId)
268 /* Check for UE CB or CELL CB */
269 if (rlcId->ueId == 0)
273 if(rlcId->rbId >= KW_MAX_RB_PER_CELL)
275 RLOG_ARG3(L_ERROR,DBG_RBID,rlcId->rbId ,
276 "Invalid RbId, Max is [%d] UEID:%d CELLID:%d",
283 kwDbmFetchDlCellCb(gCb,rlcId->cellId, &cellCb);
286 RLOG_ARG2(L_ERROR,DBG_CELLID,rlcId->cellId,
287 "CellCb not found UEID:%d RBID:%d",
293 *rbCb = cellCb->rbCb[rlcId->rbId];
298 if (!(KW_VALIDATE_UE_RBID(rlcId->rbType, rlcId->rbId)))
300 RLOG_ARG3(L_ERROR,DBG_RBID, rlcId->rbId,
301 "Invalid RbId for RbType[%d] RBID:%d CELLID:%d",
308 if (ROK != kwDbmFetchDlUeCb(gCb,rlcId->ueId, rlcId->cellId, &ueCb))
310 RLOG_ARG2(L_ERROR,DBG_CELLID, rlcId->cellId,
311 "UeId [%d]: UeCb not found RBID:%d",
317 KW_DBM_GET_RBCB_FROM_UECB(rlcId->rbId, rlcId->rbType, ueCb, *rbCb);
321 } /* kwDbmFetchDlRbCbByRbId */
325 * @brief Handler to fetch rbCb from Local Channel Id
328 * This function is invoked by CFG to fetch rbCb from the cellCb/ueCb
329 * from local Channel Id (CKW/KWU).
331 * @param[in] gCb - RLC Instance Control Block
332 * @param[in] cellId - CELL Identifier
333 * @param[in] ueId - UE Identifier
334 * @param[in] lcId - Logical Channel Identifier
335 * @param[out] rbCb - RB Control Block
341 PUBLIC Void kwDbmFetchDlRbCbFromLchId
350 PUBLIC Void kwDbmFetchDlRbCbFromLchId(gCb, ueId, cellId, lcId, rbCb)
360 TRC3(kwDbmFetchDlRbCbFromLchId)
363 /* Check for UE CB or CELL CB */
368 kwDbmFetchDlCellCb(gCb, cellId, &cellCb);
371 RLOG_ARG1(L_ERROR,DBG_CELLID,cellId,"CellCb not found UEID:%d",ueId);
375 *rbCb = cellCb->lCh[lcId - 1].dlRbCb;
379 if (kwDbmFetchDlUeCb(gCb, ueId, cellId, &ueCb) != ROK)
381 RLOG_ARG1(L_ERROR,DBG_CELLID, cellId,"UeId [%d]: UeCb not found",ueId);
385 *rbCb = ueCb->lCh[lcId - 1].dlRbCb;
388 } /* kwDbmFetchDlRbCbFromLchId */
392 * @brief Handler to delete RbCb
395 * This function is invoked by CFG to remove RbCb from Ue/Cell hashlist
397 * @param[in] gCb - RLC Instance Control Block
398 * @param[in] rbCbLst - Rb Cb List
399 * @param[in] numRbCb - Number of rbCbs
405 PUBLIC Void kwDbmDelAllDlRb
412 PUBLIC Void kwDbmDelAllDlRb(gCb, rbCbLst, numRbCb)
420 TRC3(kwDbmDelAllDlRb)
423 for (idx = 0; idx < numRbCb; idx++)
425 if (rbCbLst[idx] != NULLP)
428 KW_UPD_L2_DECR_NONIP_PER_QCI_RB_COUNT(gCb, (rbCbLst[idx]));
430 if( CM_LTE_MODE_UM == rbCbLst[idx]->mode)
432 kwUmmFreeDlRbCb(gCb,rbCbLst[idx]);
434 KW_FREE (gCb,rbCbLst[idx], sizeof (KwDlRbCb));
436 else if( CM_LTE_MODE_AM == rbCbLst[idx]->mode)
438 kwAmmFreeDlRbCb(gCb,rbCbLst[idx]);
441 else if(CM_LTE_MODE_TM == rbCbLst[idx]->mode)
443 cmLListCatLList(&(gCb->u.dlCb->toBeFreed.sduLst),&(rbCbLst[idx]->m.tm.sduQ));
444 KW_FREE (gCb,rbCbLst[idx], sizeof (KwDlRbCb));
452 } /* kwDbmDelAllDlRb */
456 * @brief Handler to create an UeCb
459 * This function is invoked by CFG to create UeCb and insert into the
460 * Ue hashlist of KwCb.
462 * @param[in] gCb RLC Instance Control Block
463 * @param[in] ueId UE Identifier
464 * @param[in] cellId Cell Identifier
465 * @param[in] ueCb UE Control Block
473 PUBLIC S16 kwDbmCreateDlUeCb
481 PUBLIC S16 kwDbmCreateDlUeCb(gCb,ueId, cellId, ueCb)
490 TRC3(kwDbmCreateDlUeCb)
493 KW_ALLOC(gCb,*ueCb, sizeof(KwDlUeCb));
495 #if (ERRCLASS & ERRCLS_ADD_RES)
498 RLOG_ARG1(L_FATAL,DBG_UEID,ueId,
499 "Memory allocation failed cellID:%d",
503 #endif /* ERRCLASS & ERRCLS_ADD_RES */
507 tUeCb->cellId = cellId;
509 if (ROK != cmHashListInsert(&(gCb->u.dlCb->ueLstCp),
511 (U8 *)&(tUeCb->ueId),
512 (U16) sizeof(CmLteRnti)))
514 RLOG_ARG1(L_ERROR,DBG_CELLID,cellId,
515 "UeId[%u] HashList Insertion Failed",
519 /* kw005.201 ccpu00117318, updating the statistics */
524 } /* kwDbmCreateUeCb */
528 * @brief Handler to Fetch an UeCb
531 * This function is invoked by CFG to fetch UeCb from the Ue hashlist
534 * @param[in] gCb RLC Instance Control Block
535 * @param[in] ueId UE Identifier
536 * @param[in] cellId Cell Identifier
537 * @param[out] ueCb UE Control Block
544 PUBLIC S16 kwDbmFetchDlUeCb
552 PUBLIC S16 kwDbmFetchDlUeCb(gCb,ueId, cellId, ueCb)
560 TRC3(kwDbmFetchDlUeCb)
563 RETVALUE(cmHashListFind(&(gCb->u.dlCb->ueLstCp),
568 } /* kwDbmFetchDlUeCb */
572 * @brief Handler to delete an UeCb
575 * This function is invoked by CFG to delete UeCb from the Ue hashlist
579 * @param[in] gCb RLC Instance Control Block
580 * @param[in] ueCb UE Control Block
581 * @param[in] abrtFlag Abort Flag
587 PUBLIC Void kwDbmDelDlUeCb
594 PUBLIC Void kwDbmDelDlUeCb(gCb,eCb, abortFlag)
603 #if (!defined(KW_PDCP) || !(defined(PJ_SEC_ASYNC) || defined(PJ_CMP_ASYNC)))
605 #endif /* (!defined(KW_PDCP) || ! (defined(PJ_SEC_ASYNC) ||
606 defined(PJ_CMP_ASYNC)))*/
608 /* Delete all logical channels */
609 KW_MEM_ZERO(ueCb->lCh,sizeof(KwDlLch) * KW_MAX_LCH_PER_UE);
611 /* Delete all SRB RbCbs in UeCb */
612 kwDbmDelAllDlRb(gCb,ueCb->srbCb, KW_MAX_SRB_PER_UE);
614 /* Delete all DRB RbCbs in UeCb */
615 kwDbmDelAllDlRb(gCb,ueCb->drbCb, KW_MAX_DRB_PER_UE);
617 /* Delete ueCb entry from ueLstCp */
618 if(ROK != cmHashListDelete(&(gCb->u.dlCb->ueLstCp), (PTR) ueCb))
620 RLOG_ARG1(L_ERROR,DBG_CELLID,ueCb->cellId,
621 "UeId[%u] HashList Insertion Failed",
624 /* kw005.201 ccpu00117318, updating the statistics */
627 /* Deallocate ueCb */
628 KW_FREE(gCb,ueCb, sizeof(KwDlUeCb));
635 * @brief Handler to delete all UeCbs
638 * This function is invoked by CFG to delete all UeCbs from the Ue
641 * @param[in] gCb RLC Instance Control Block
646 PUBLIC Void kwDbmDelAllDlUe
651 PUBLIC Void kwDbmDelAllDlUe(gCb)
655 KwDlUeCb *ueCb = NULLP;
657 TRC3(kwDbmDelAllDlUe)
660 /* Until no more ueCb is ueLstCp hash list get and delete ueCb */
661 while (ROK == cmHashListGetNext(&(gCb->u.dlCb->ueLstCp),
666 kwDbmDelDlUeCb(gCb,ueCb, TRUE);
672 } /* kwDbmDelAllUe */
674 /* kw005.201 added support for L2 Measurement */
677 PUBLIC Void kwDbmDelAllDlL2MeasTbFrmUe
683 PUBLIC Void kwDbmDelAllDlL2MeasTbFrmUe(gCb,ueCb)
689 KwL2MeasTb *l2MeasTb = NULLP;
690 for(tbIdx = 0; tbIdx < KW_MAX_TB_PER_UE; tbIdx++)
692 l2MeasTb = ueCb->l2MeasTbCb[tbIdx];
693 if(l2MeasTb != NULLP)
695 KW_FREE(gCb,l2MeasTb, sizeof(KwL2MeasTb));
696 ueCb->l2MeasTbCb[tbIdx] = NULLP;
700 }/* End of kwDbmDelL2MeasTb */
701 #endif /* LTE_L2_MEAS */
704 * @brief Handler to create CellCb
707 * This function is invoked by CFG to create CellCb and insert into
708 * the Cell hashlist of KwCb.
710 * @param[in] gCb RLC Instance Control Block
711 * @param[in] cellId Cell Identifier
712 * @param[in] cellCb Cell Control Block
719 PUBLIC S16 kwDbmCreateDlCellCb
726 PUBLIC S16 kwDbmCreateDlCellCb(gCb,cellId, cellCb)
734 TRC3(kwDbmCreateDlCellCb)
736 KW_ALLOC(gCb,*cellCb, sizeof(KwDlCellCb));
737 #if (ERRCLASS & ERRCLS_ADD_RES)
738 if (*cellCb == NULLP)
740 RLOG_ARG0(L_FATAL, DBG_CELLID,cellId,"Memory allocation failed");
743 #endif /* ERRCLASS & ERRCLS_ADD_RES */
746 tCellCb->cellId = cellId;
748 if(ROK != cmHashListInsert(&(gCb->u.dlCb->cellLstCp),
750 (U8 *)&(tCellCb->cellId),
751 (U16) sizeof(CmLteCellId)))
753 RLOG_ARG0(L_ERROR,DBG_CELLID,cellId,"HashList Insertion Failed");
758 } /* kwDbmCreateDlCellCb */
762 * @brief Handler to Fetch an CellCb
765 * This function is invoked by CFG to fetch UeCb from the Ue hashlist
768 * @param[in] gCb RLC Instance Control Block
769 * @param[in] cellId Cell Identifier
770 * @param[out] cellCb UE Control Block
778 PUBLIC S16 kwDbmFetchDlCellCb
785 PUBLIC S16 kwDbmFetchDlCellCb(gCb,cellId, cellCb)
791 TRC3(kwDbmFetchDlCellCb)
796 if(ROK != cmHashListFind(&(gCb->u.dlCb->cellLstCp),
802 RLOG_ARG0(L_ERROR,DBG_CELLID, cellId,"CellCb not found");
807 } /* kwDbmFetchCellCb */
811 * @brief Handler to delete CellCb
814 * This function is invoked by CFG to delete CellCb from the Cell hashlist
817 * @param[in] gCb RLC Instance Control Block
818 * @param[in] cellCb Cell Control Block
823 PUBLIC Void kwDbmDelDlCellCb
829 PUBLIC Void kwDbmDelDlCellCb(gCb,cellCb)
834 TRC3(kwDbmDelDlCellCb)
837 /* Delete all rbCbs in cellCb */
838 kwDbmDelAllDlRb(gCb,cellCb->rbCb, KW_MAX_RB_PER_CELL);
840 /* Delete cellCb entry in hash list cellLstCp */
841 if(ROK != cmHashListDelete(&(gCb->u.dlCb->cellLstCp), (PTR) cellCb))
843 RLOG_ARG0(L_ERROR,DBG_CELLID,cellCb->cellId,"HashList Deletion Failed");
846 /* Deallocate cellCb */
847 KW_FREE(gCb, cellCb, sizeof(KwDlCellCb));
850 } /* kwDbmDelCellCb */
854 * @brief Handler to delete all UeCbs
857 * This function is invoked by CFG to delete all UeCbs from the Ue
859 * @param[in] gCb RLC Instance Control Block
864 PUBLIC Void kwDbmDelAllDlCell
869 PUBLIC Void kwDbmDelAllDlCell(gCb)
873 KwDlCellCb *cellCb = NULLP;
875 TRC3(kwDbmDelAllDlCell)
878 /* Until no more cellCb is ueLstCp hash list get and delete cellCb */
879 while (ROK == cmHashListGetNext(&(gCb->u.dlCb->cellLstCp),
883 kwDbmDelDlCellCb(gCb, cellCb);
889 } /* kwDbmDelAllDlCell */
893 * @brief Handler to delete all UeCbs and CellCbs
896 * This function is invoked by LMM to delete all UeCbs from the Ue
897 * hashlist of KwCb and cellCbs from the Cell hashlist of kwCb.
899 * @param[in] gCb RLC Instance Control Block
904 PUBLIC S16 kwDbmDlShutdown
909 PUBLIC S16 kwDbmDlShutdown(gCb)
913 TRC3(kwDbmDlShutdown)
915 kwDbmDelAllDlCell(gCb);
917 kwDbmDelAllDlUe(gCb);
923 } /* kwDbmShutdown */
926 /********************************************************************30**
929 **********************************************************************/