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 RLC_MODULE RLC_DBGMASK_DUT
88 * @brief Handler to initialize hash list
91 * This function initializes the UeCb, CellCb hash lists
103 S16 rlcDbmDlInit(gCb)
109 /* Initialize ueCb Hash List */
110 if(ROK != cmHashListInit(&(gCb->u.dlCb->ueLstCp),
111 (U16) RLC_UE_LIST_BUCKET_SIZE,
114 (U16) CM_HASH_KEYTYPE_CONID,
115 RLC_GET_MEM_REGION(gCb),
116 RLC_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) RLC_CELL_LIST_BUCKET_SIZE,
127 (U16) CM_HASH_KEYTYPE_CONID,
128 RLC_GET_MEM_REGION(gCb),
129 RLC_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.rlcL2Cb.qciHlCp),
140 (U16) RLC_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, "rlcDbmInit: cmHashListInit Failed for rlcCb.qciHlCp");
153 /* Initialize tbHlCp Hash List */
154 if(ROK != cmHashListInit(&(rlcCb.rlcL2Cb.tbHlCp),
155 (U16) RLC_TB_LIST_BUCKET_SIZE,
158 (U16) CM_HASH_KEYTYPE_DEF,
162 cmHashListDeinit(&rlcCb.rlcL2Cb.qciHlCp);
163 cmHashListDeinit(&gCb->u.dlCb->cellLstCp);
164 cmHashListDeinit(&gCb->u.dlCb->ueLstCp);
165 RLOG0(L_ERROR, "rlcDbmInit: 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
187 Void rlcDbmDlDeInit(gCb)
191 TRC3(rlcDbmDlDeInit);
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.rlcL2Cb.qciHlCp));
205 /* De Initialize tbHlCp Hash List */
206 cmHashListDeinit(&(rlcCb.rlcL2Cb.tbHlCp));
208 #endif /* LTE_L2_MEAS */
211 } /* rlcDbmDlDeInit */
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
227 void rlcDbmFetchDlRbCbByRbId(RlcCb *gCb,CmLteRlcId *rlcId, RlcDlRbCb **rbCb)
231 /* Check for UE CB or CELL CB */
232 if (rlcId->ueId == 0)
236 if(rlcId->rbId >= RLC_MAX_RB_PER_CELL)
238 DU_LOG("\nRLC : rlcDbmFetchDlRbCbByRbId : Invalid RbId, Max is [%d] \
239 UEID:%d CELLID:%d", RLC_MAX_RB_PER_CELL, rlcId->ueId, rlcId->cellId);
243 rlcDbmFetchDlCellCb(gCb,rlcId->cellId, &cellCb);
246 DU_LOG("\nRLC : rlcDbmFetchDlRbCbByRbId : CellCb[%d] not found UEID:%d \
247 RBID:%d", rlcId->cellId, rlcId->ueId, rlcId->rbId);
251 *rbCb = cellCb->rbCb[rlcId->rbId];
256 if (!(RLC_VALIDATE_UE_RBID(rlcId->rbType, rlcId->rbId)))
258 DU_LOG("\n rlcDbmFetchDlRbCbByRbId : Invalid RbId[%d] for RbType[%d] \
259 RBID:%d CELLID:%d", rlcId->rbId, rlcId->rbType, rlcId->ueId, rlcId->cellId);
263 if (ROK != rlcDbmFetchDlUeCb(gCb,rlcId->ueId, rlcId->cellId, &ueCb))
265 DU_LOG("\n rlcDbmFetchDlRbCbByRbId : UeId [%d]: UeCb not found RBID:%d",\
266 rlcId->ueId, rlcId->rbId);
270 RLC_DBM_GET_RBCB_FROM_UECB(rlcId->rbId, rlcId->rbType, ueCb, *rbCb);
274 } /* rlcDbmFetchDlRbCbByRbId */
278 * @brief Handler to fetch rbCb from Local Channel Id
281 * This function is invoked by CFG to fetch rbCb from the cellCb/ueCb
282 * from local Channel Id (CKW/KWU).
284 * @param[in] gCb - RLC Instance Control Block
285 * @param[in] cellId - CELL Identifier
286 * @param[in] ueId - UE Identifier
287 * @param[in] lcId - Logical Channel Identifier
288 * @param[out] rbCb - RB Control Block
293 void rlcDbmFetchDlRbCbFromLchId(RlcCb *gCb, CmLteRnti ueId, CmLteCellId cellId, \
294 CmLteLcId lcId, RlcDlRbCb **rbCb)
298 /* Check for UE CB or CELL CB */
303 rlcDbmFetchDlCellCb(gCb, cellId, &cellCb);
306 DU_LOG("\nRLC: rlcDbmFetchDlRbCbFromLchId: CellCb[%d] not found UEID:%d", \
311 *rbCb = cellCb->lCh[lcId - 1].dlRbCb;
315 if (rlcDbmFetchDlUeCb(gCb, ueId, cellId, &ueCb) != ROK)
317 DU_LOG("\nRLC: rlcDbmFetchDlRbCbFromLchId: UeId [%d]: UeCb not found",ueId);
321 *rbCb = ueCb->lCh[lcId - 1].dlRbCb;
324 } /* rlcDbmFetchDlRbCbFromLchId */
328 * @brief Handler to delete RbCb
331 * This function is invoked by CFG to remove RbCb from Ue/Cell hashlist
333 * @param[in] gCb - RLC Instance Control Block
334 * @param[in] rbCbLst - Rb Cb List
335 * @param[in] numRbCb - Number of rbCbs
341 Void rlcDbmDelAllDlRb
348 Void rlcDbmDelAllDlRb(gCb, rbCbLst, numRbCb)
356 TRC3(rlcDbmDelAllDlRb)
359 for (idx = 0; idx < numRbCb; idx++)
361 if (rbCbLst[idx] != NULLP)
364 RLC_UPD_L2_DECR_NONIP_PER_QCI_RB_COUNT(gCb, (rbCbLst[idx]));
366 if( CM_LTE_MODE_UM == rbCbLst[idx]->mode)
368 rlcUmmFreeDlRbCb(gCb,rbCbLst[idx]);
370 RLC_FREE (gCb,rbCbLst[idx], sizeof (RlcDlRbCb));
372 else if( CM_LTE_MODE_AM == rbCbLst[idx]->mode)
374 rlcAmmFreeDlRbCb(gCb,rbCbLst[idx]);
377 else if(CM_LTE_MODE_TM == rbCbLst[idx]->mode)
379 cmLListCatLList(&(gCb->u.dlCb->toBeFreed.sduLst),&(rbCbLst[idx]->m.tm.sduQ));
380 RLC_FREE (gCb,rbCbLst[idx], sizeof (RlcDlRbCb));
388 } /* rlcDbmDelAllDlRb */
392 * @brief Handler to create an UeCb
395 * This function is invoked by CFG to create UeCb and insert into the
396 * Ue hashlist of RlcCb.
398 * @param[in] gCb RLC Instance Control Block
399 * @param[in] ueId UE Identifier
400 * @param[in] cellId Cell Identifier
401 * @param[in] ueCb UE Control Block
409 S16 rlcDbmCreateDlUeCb
417 S16 rlcDbmCreateDlUeCb(gCb,ueId, cellId, ueCb)
426 TRC3(rlcDbmCreateDlUeCb)
429 RLC_ALLOC(gCb,*ueCb, sizeof(RlcDlUeCb));
431 #if (ERRCLASS & ERRCLS_ADD_RES)
434 RLOG_ARG1(L_FATAL,DBG_UEID,ueId,
435 "Memory allocation failed cellID:%d",
439 #endif /* ERRCLASS & ERRCLS_ADD_RES */
443 tUeCb->cellId = cellId;
445 if (ROK != cmHashListInsert(&(gCb->u.dlCb->ueLstCp),
447 (U8 *)&(tUeCb->ueId),
448 (U16) sizeof(CmLteRnti)))
450 RLOG_ARG1(L_ERROR,DBG_CELLID,cellId,
451 "UeId[%u] HashList Insertion Failed",
455 /* kw005.201 ccpu00117318, updating the statistics */
460 } /* kwDbmCreateUeCb */
464 * @brief Handler to Fetch an UeCb
467 * This function is invoked by CFG to fetch UeCb from the Ue hashlist
470 * @param[in] gCb RLC Instance Control Block
471 * @param[in] ueId UE Identifier
472 * @param[in] cellId Cell Identifier
473 * @param[out] ueCb UE Control Block
479 uint8_t rlcDbmFetchDlUeCb(RlcCb *gCb, CmLteRnti ueId, CmLteCellId cellId, RlcDlUeCb **ueCb)
481 return (cmHashListFind(&(gCb->u.dlCb->ueLstCp),
486 } /* rlcDbmFetchDlUeCb */
490 * @brief Handler to delete an UeCb
493 * This function is invoked by CFG to delete UeCb from the Ue hashlist
497 * @param[in] gCb RLC Instance Control Block
498 * @param[in] ueCb UE Control Block
499 * @param[in] abrtFlag Abort Flag
512 Void rlcDbmDelDlUeCb(gCb,eCb, abortFlag)
518 TRC3(rlcDbmDelDlUeCb)
521 #if (!defined(KW_PDCP) || !(defined(PJ_SEC_ASYNC) || defined(PJ_CMP_ASYNC)))
523 #endif /* (!defined(KW_PDCP) || ! (defined(PJ_SEC_ASYNC) ||
524 defined(PJ_CMP_ASYNC)))*/
526 /* Delete all logical channels */
527 RLC_MEM_ZERO(ueCb->lCh,sizeof(RlcDlLch) * RLC_MAX_LCH_PER_UE);
529 /* Delete all SRB RbCbs in UeCb */
530 rlcDbmDelAllDlRb(gCb,ueCb->srbCb, RLC_MAX_SRB_PER_UE);
532 /* Delete all DRB RbCbs in UeCb */
533 rlcDbmDelAllDlRb(gCb,ueCb->drbCb, RLC_MAX_DRB_PER_UE);
535 /* Delete ueCb entry from ueLstCp */
536 if(ROK != cmHashListDelete(&(gCb->u.dlCb->ueLstCp), (PTR) ueCb))
538 RLOG_ARG1(L_ERROR,DBG_CELLID,ueCb->cellId,
539 "UeId[%u] HashList Insertion Failed",
542 /* kw005.201 ccpu00117318, updating the statistics */
545 /* Deallocate ueCb */
546 RLC_FREE(gCb,ueCb, sizeof(RlcDlUeCb));
553 * @brief Handler to delete all UeCbs
556 * This function is invoked by CFG to delete all UeCbs from the Ue
559 * @param[in] gCb RLC Instance Control Block
564 Void rlcDbmDelAllDlUe
569 Void rlcDbmDelAllDlUe(gCb)
573 RlcDlUeCb *ueCb = NULLP;
575 TRC3(rlcDbmDelAllDlUe)
578 /* Until no more ueCb is ueLstCp hash list get and delete ueCb */
579 while (ROK == cmHashListGetNext(&(gCb->u.dlCb->ueLstCp),
584 rlcDbmDelDlUeCb(gCb,ueCb, TRUE);
590 } /* kwDbmDelAllUe */
592 /* kw005.201 added support for L2 Measurement */
595 Void rlcDbmDelAllDlL2MeasTbFrmUe
601 Void rlcDbmDelAllDlL2MeasTbFrmUe(gCb,ueCb)
607 RlcL2MeasTb *l2MeasTb = NULLP;
608 for(tbIdx = 0; tbIdx < RLC_MAX_TB_PER_UE; tbIdx++)
610 l2MeasTb = ueCb->l2MeasTbCb[tbIdx];
611 if(l2MeasTb != NULLP)
613 RLC_FREE(gCb,l2MeasTb, sizeof(RlcL2MeasTb));
614 ueCb->l2MeasTbCb[tbIdx] = NULLP;
618 }/* End of kwDbmDelL2MeasTb */
619 #endif /* LTE_L2_MEAS */
622 * @brief Handler to create CellCb
625 * This function is invoked by CFG to create CellCb and insert into
626 * the Cell hashlist of RlcCb.
628 * @param[in] gCb RLC Instance Control Block
629 * @param[in] cellId Cell Identifier
630 * @param[in] cellCb Cell Control Block
637 S16 rlcDbmCreateDlCellCb
644 S16 rlcDbmCreateDlCellCb(gCb,cellId, cellCb)
647 RlcDlCellCb **cellCb;
650 RlcDlCellCb *tCellCb;
652 TRC3(rlcDbmCreateDlCellCb)
654 RLC_ALLOC(gCb,*cellCb, sizeof(RlcDlCellCb));
655 #if (ERRCLASS & ERRCLS_ADD_RES)
656 if (*cellCb == NULLP)
658 RLOG_ARG0(L_FATAL, DBG_CELLID,cellId,"Memory allocation failed");
661 #endif /* ERRCLASS & ERRCLS_ADD_RES */
664 tCellCb->cellId = cellId;
666 if(ROK != cmHashListInsert(&(gCb->u.dlCb->cellLstCp),
668 (U8 *)&(tCellCb->cellId),
669 (U16) sizeof(CmLteCellId)))
671 RLOG_ARG0(L_ERROR,DBG_CELLID,cellId,"HashList Insertion Failed");
676 } /* rlcDbmCreateDlCellCb */
680 * @brief Handler to Fetch an CellCb
683 * This function is invoked by CFG to fetch UeCb from the Ue hashlist
686 * @param[in] gCb RLC Instance Control Block
687 * @param[in] cellId Cell Identifier
688 * @param[out] cellCb UE Control Block
695 uint8_t rlcDbmFetchDlCellCb(RlcCb *gCb, CmLteCellId cellId, RlcDlCellCb **cellCb)
699 if(ROK != cmHashListFind(&(gCb->u.dlCb->cellLstCp),
705 DU_LOG("\nRLC : CellCb [%d] not found", cellId);
710 } /* kwDbmFetchCellCb */
714 * @brief Handler to delete CellCb
717 * This function is invoked by CFG to delete CellCb from the Cell hashlist
720 * @param[in] gCb RLC Instance Control Block
721 * @param[in] cellCb Cell Control Block
726 Void rlcDbmDelDlCellCb
732 Void rlcDbmDelDlCellCb(gCb,cellCb)
737 TRC3(rlcDbmDelDlCellCb)
740 /* Delete all rbCbs in cellCb */
741 rlcDbmDelAllDlRb(gCb,cellCb->rbCb, RLC_MAX_RB_PER_CELL);
743 /* Delete cellCb entry in hash list cellLstCp */
744 if(ROK != cmHashListDelete(&(gCb->u.dlCb->cellLstCp), (PTR) cellCb))
746 RLOG_ARG0(L_ERROR,DBG_CELLID,cellCb->cellId,"HashList Deletion Failed");
749 /* Deallocate cellCb */
750 RLC_FREE(gCb, cellCb, sizeof(RlcDlCellCb));
753 } /* kwDbmDelCellCb */
757 * @brief Handler to delete all UeCbs
760 * This function is invoked by CFG to delete all UeCbs from the Ue
762 * @param[in] gCb RLC Instance Control Block
767 Void rlcDbmDelAllDlCell
772 Void rlcDbmDelAllDlCell(gCb)
776 RlcDlCellCb *cellCb = NULLP;
778 TRC3(rlcDbmDelAllDlCell)
781 /* Until no more cellCb is ueLstCp hash list get and delete cellCb */
782 while (ROK == cmHashListGetNext(&(gCb->u.dlCb->cellLstCp),
786 rlcDbmDelDlCellCb(gCb, cellCb);
792 } /* rlcDbmDelAllDlCell */
796 * @brief Handler to delete all UeCbs and CellCbs
799 * This function is invoked by LMM to delete all UeCbs from the Ue
800 * hashlist of RlcCb and cellCbs from the Cell hashlist of rlcCb.
802 * @param[in] gCb RLC Instance Control Block
812 S16 rlcDbmDlShutdown(gCb)
816 TRC3(rlcDbmDlShutdown)
818 rlcDbmDelAllDlCell(gCb);
820 rlcDbmDelAllDlUe(gCb);
826 } /* kwDbmShutdown */
829 /********************************************************************30**
832 **********************************************************************/