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,
29 *********************************************************************21*/
30 static const char* RLOG_MODULE_NAME="DBM";
31 static int RLOG_MODULE_ID=2048;
32 static int RLOG_FILE_ID=194;
35 /* header (.h) include files */
36 #include "envopt.h" /* environment options */
37 #include "envdep.h" /* environment dependent */
38 #include "envind.h" /* environment independent */
40 #include "gen.h" /* general */
41 #include "ssi.h" /* system services */
42 #include "cm5.h" /* common timer defines */
43 #include "cm_tkns.h" /* common tokens defines */
44 #include "cm_mblk.h" /* common memory allocation library defines */
45 #include "cm_llist.h" /* common link list defines */
46 #include "cm_hash.h" /* common hash list defines */
47 #include "cm_lte.h" /* common LTE defines */
48 #include "lkw.h" /* LKW defines */
49 #include "ckw.h" /* CKW defines */
50 #include "kwu.h" /* KWU defines */
51 #include "rgu.h" /* RGU defines */
52 #include "kw_err.h" /* Err defines */
53 #include "kw_env.h" /* RLC environment options */
55 #include "kw.h" /* RLC defines */
58 /* extern (.x) include files */
59 #include "gen.x" /* general */
60 #include "ssi.x" /* system services */
62 #include "cm5.x" /* common timer library */
63 #include "cm_tkns.x" /* common tokens */
64 #include "cm_mblk.x" /* common memory allocation */
65 #include "cm_llist.x" /* common link list */
66 #include "cm_hash.x" /* common hash list */
67 #include "cm_lte.x" /* common LTE includes */
68 #include "cm_lib.x" /* common memory allocation library */
69 #include "lkw.x" /* LKW */
70 #include "ckw.x" /* CKW */
71 #include "kwu.x" /* KWU */
72 #include "rgu.x" /* RGU */
79 * @brief RLC Uplink database module
82 #define KW_MODULE KW_DBGMASK_DUT
86 * @brief Handler to initialize hash list
89 * This function initializes the UeCb, CellCb and transactions hash lists
91 * @param[in] gCb RLC instance control block
98 PUBLIC S16 kwDbmUlInit
103 PUBLIC S16 kwDbmUlInit(gCb)
109 /* Initialize ueCb Hash List */
110 if(ROK != cmHashListInit(&(gCb->u.ulCb->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.ulCb->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.ulCb->ueLstCp);
132 RLOG0(L_ERROR, "CellLstCp Initialization Failed");
136 if(ROK != cmHashListInit(&(gCb->u.ulCb->transIdLstCp),
137 (U16) KW_TRANS_ID_LST_BKT_SIZE,
140 (U16) CM_HASH_KEYTYPE_CONID,
141 KW_GET_MEM_REGION(gCb),
142 KW_GET_MEM_POOL(gCb)))
144 cmHashListDeinit(&gCb->u.ulCb->ueLstCp);
145 cmHashListDeinit(&gCb->u.ulCb->cellLstCp);
146 RLOG0(L_ERROR, "transIdLstCp Initialization Failed");
150 /* kw005.201 added support for L2 Measurement */
152 /* Initialize qcI Hash List */
153 #endif /* LTE_L2_MEAS */
160 * @brief Handler to De initialize hash list
162 * @param[in] gCb RLC Instance Control Block
167 PUBLIC Void kwDbmUlDeInit
172 PUBLIC Void kwDbmUlDeInit(gCb)
179 /* De Initialize ueCb Hash List */
180 cmHashListDeinit(&(gCb->u.ulCb->ueLstCp));
182 /* De Initialize cellCb Hash List */
183 cmHashListDeinit(&(gCb->u.ulCb->cellLstCp));
185 /* De Initialize transaction Hash List */
186 cmHashListDeinit(&(gCb->u.ulCb->transIdLstCp));
187 /* kw005.201 added support for L2 Measurement */
188 #ifdef LTE_L2_MEAS_RLC
189 /* De Initialize qciCb Hash List */
190 cmHashListDeinit(&(kwCb.kwL2Cb.qciHlCp));
191 #endif /* LTE_L2_MEAS */
198 * @brief Handler to fetch rbCb by the rlcId
201 * This function is invoked by CFG to fetch rbCb from the cellCb/ueCb in
202 * the upper interface (CKW/KWU).
204 * @param[in] gCb RLC Instance Control Block
205 * @param[in] rlcId RLC Identifier
206 * @param[out] rbCb RB Control Block
211 PUBLIC Void kwDbmFetchUlRbCbByRbId
218 PUBLIC Void kwDbmFetchUlRbCbByRbId(gCb, rlcId, rbCb)
224 TRC3(kwDbmFetchUlRbCbByRbId)
228 /* Check for UE CB or CELL CB */
229 if (rlcId->ueId == 0)
233 if(rlcId->rbId >= KW_MAX_RB_PER_CELL)
235 RLOG_ARG3(L_ERROR,DBG_RBID,rlcId->rbId ,
236 "Invalid RbId, cellId:%d UEID:%d Max is [%d]",
243 kwDbmFetchUlCellCb(gCb,rlcId->cellId, &cellCb);
246 RLOG_ARG2(L_ERROR,DBG_CELLID,rlcId->cellId,
247 "CellCb not found RBID:%d UEID:%d",
253 *rbCb = cellCb->rbCb[rlcId->rbId];
259 if (!(KW_VALIDATE_UE_RBID(rlcId->rbType, rlcId->rbId)))
261 RLOG_ARG3(L_ERROR,DBG_RBID, rlcId->rbId,
262 "Invalid RbId for RbType[%d] CELLID:%d UEID:%d",
269 if (kwDbmFetchUlUeCb(gCb,rlcId->ueId, rlcId->cellId, &ueCb) != ROK)
271 RLOG_ARG2(L_ERROR,DBG_CELLID, rlcId->cellId,
272 "UeId [%d]: UeCb not found RBID:%d",
278 KW_DBM_GET_RBCB_FROM_UECB(rlcId->rbId, rlcId->rbType, ueCb, *rbCb);
281 } /* kwDbmFetchUlRbCbByRbId */
285 * @brief Handler to fetch rbCb from Local Channel Id
288 * This function is invoked by CFG to fetch rbCb from the cellCb/ueCb
289 * from local Channel Id (CKW/KWU).
291 * @param[in] gCb - RLC Instance Control Block
292 * @param[in] cellId - CELL Identifier
293 * @param[in] ueId - UE Identifier
294 * @param[in] lcId - Logical Channel Identifier
295 * @param[out] rbCb - RB Control Block
301 PUBLIC Void kwDbmFetchUlRbCbFromLchId
310 PUBLIC Void kwDbmFetchUlRbCbFromLchId(gCb, ueId, cellId, lcId, rbCb)
320 TRC3(kwDbmFetchUlRbCbFromLchId)
325 /* Check for UE CB or CELL CB */
330 kwDbmFetchUlCellCb(gCb,cellId, &cellCb);
333 RLOG_ARG1(L_ERROR,DBG_CELLID,cellId,"CellCb not found UEID:%d",ueId);
337 *rbCb = cellCb->lCh[lcId - 1].ulRbCb;
341 if (kwDbmFetchUlUeCb(gCb,ueId, cellId, &ueCb) != ROK)
343 RLOG_ARG1(L_ERROR,DBG_CELLID, cellId,"UeId [%d]: UeCb not found",ueId);
347 *rbCb = ueCb->lCh[lcId - 1].ulRbCb;
350 } /* kwDbmFetchRbCbFromLchId */
354 * @brief Handler to delete RbCb
357 * This function is invoked by CFG to remove RbCb from Ue/Cell hashlist
359 * @param[in] gCb - RLC Instance Control Block
360 * @param[in] rbCbLst - Rb Cb List
361 * @param[in] numRbCb - Number of rbCbs
367 PUBLIC Void kwDbmDelAllUlRb
374 PUBLIC Void kwDbmDelAllUlRb(gCb, rbCbLst, numRbCb)
382 TRC3(kwDbmDelAllUlRb)
385 for (idx = 0; idx < numRbCb; idx++)
387 if (rbCbLst[idx] != NULLP)
389 /* Free the Buffers of RbCb */
390 if( CM_LTE_MODE_UM == rbCbLst[idx]->mode )
392 kwUmmFreeUlRbCb(gCb,rbCbLst[idx]);
394 else if(CM_LTE_MODE_AM == rbCbLst[idx]->mode)
396 kwAmmFreeUlRbCb(gCb,rbCbLst[idx]);
399 KW_FREE (gCb,rbCbLst[idx], sizeof (KwUlRbCb));
404 } /* kwDbmDelAllRb */
408 * @brief Handler to create an UeCb
411 * This function is invoked by CFG to create UeCb and insert into the
412 * Ue hashlist of KwCb.
414 * @param[in] gCb RLC Instance Control Block
415 * @param[in] ueId UE Identifier
416 * @param[in] cellId Cell Identifier
417 * @param[in] ueCb UE Control Block
425 PUBLIC S16 kwDbmAddUlUeCb
433 PUBLIC S16 kwDbmAddUlUeCb(gCb, ueId, cellId, ueCb)
444 ueCb->cellId = cellId;
446 if(ROK != cmHashListInsert(&(gCb->u.ulCb->ueLstCp),
449 (U16) sizeof(CmLteRnti)))
451 RLOG_ARG1(L_ERROR,DBG_CELLID,cellId,
452 "UeId[%u] HashList Insertion Failed",
456 /* kw005.201 ccpu00117318, updating the statistics */
465 * @brief Handler to add a transaction
468 * This function adds a transaction.
470 * @param[in] gCb RLC Instance Control Block
471 * @param[in] cfg Configuration information
479 PUBLIC S16 kwDbmAddUlTransaction
485 PUBLIC S16 kwDbmAddUlTransaction(gCb, cfg)
490 TRC3(kwDbmAddUlTransaction)
493 RLOG1(L_DEBUG, "(transId(%ld)", cfg->transId);
495 RLOG1(L_DEBUG, "(transId(%d))", cfg->transId);
498 RETVALUE(cmHashListInsert(&(gCb->u.ulCb->transIdLstCp),
500 (U8 *)&(cfg->transId),
501 (U16) sizeof(cfg->transId)));
506 * @brief Handler to find a transaction
509 * This function find transaction using transaction Id
512 * @param[in] gCb RLC Instance Control Block
513 * @param[in] transId Transaction Id
514 * @param[out] cfg Configuration information attached to this transaction
522 PUBLIC S16 kwDbmFindUlTransaction
529 PUBLIC S16 kwDbmFindUlTransaction(gCb, cfg)
532 KwUlCfgTmpData **cfg;
535 TRC3(kwDbmFindUlTransaction)
537 if(ROK != cmHashListFind(&(gCb->u.ulCb->transIdLstCp),
540 KW_DEF_SEQ_NUM,(PTR *) cfg))
542 RLOG1(L_ERROR,"TransId [%ld] not found",transId);
551 * @brief Handler to delete a transaction
554 * This function deletes a transaction
557 * @param[in] gCb RLC Instance Control Block
558 * @param[in] cfg Configuration information
566 PUBLIC S16 kwDbmDelUlTransaction
572 PUBLIC S16 kwDbmDelUlTransaction(gCb, cfg)
577 TRC3(kwDbmDelUlTransaction)
580 if(cmHashListDelete(&(gCb->u.ulCb->transIdLstCp),(PTR) (cfg)) != ROK)
582 RLOG0(L_ERROR,"HashList Deletion failed");
591 * @brief Handler to delete all transaction
594 * This function deletes all transaction
596 * @param[in] gCb RLC Instance Control Block
604 PUBLIC S16 kwDbmDelAllUlTransactions
609 PUBLIC S16 kwDbmDelAllUlTransactions(gCb)
613 KwUlCfgTmpData *cfg = NULL;
615 TRC3(kwDbmDelAllUlTransctions)
617 /* Until no more ueCb is ueLstCp hash list get and delete ueCb */
618 while (ROK == cmHashListGetNext(&(gCb->u.ulCb->transIdLstCp),
622 if(kwDbmDelUlTransaction(gCb, cfg) != ROK)
635 * @brief Handler to Fetch an UeCb
638 * This function is invoked by CFG to fetch UeCb from the Ue hashlist
641 * @param[in] gCb RLC Instance Control Block
642 * @param[in] ueId UE Identifier
643 * @param[in] cellId Cell Identifier
644 * @param[out] ueCb UE Control Block
651 PUBLIC S16 kwDbmFetchUlUeCb
659 PUBLIC S16 kwDbmFetchUlUeCb(gCb,ueId, cellId, ueCb)
666 TRC3(kwDbmFetchUlUeCb)
669 RETVALUE(cmHashListFind(&(gCb->u.ulCb->ueLstCp),
670 (U8 *)&(ueId), sizeof(CmLteRnti),
677 * @brief Handler to delete an UeCb
680 * This function is invoked by CFG to delete UeCb from the Ue hashlist
684 * @param[in] gCb RLC Instance Control Block
685 * @param[in] ueCb UE Control Block
686 * @param[in] abrtFlag Abort Flag
692 PUBLIC Void kwDbmDelUlUeCb
699 PUBLIC Void kwDbmDelUlUeCb(gCb,eCb, abortFlag)
708 #if (!defined(KW_PDCP) || !(defined(PJ_SEC_ASYNC) || defined(PJ_CMP_ASYNC)))
710 #endif /* (!defined(KW_PDCP) || ! (defined(PJ_SEC_ASYNC) || defined(PJ_CMP_ASYNC)))*/
712 /* Delete all logical channels */
713 KW_MEM_ZERO(ueCb->lCh,sizeof(KwUlLch) * KW_MAX_LCH_PER_UE);
715 /* Delete all SRB RbCbs in UeCb */
716 kwDbmDelAllUlRb(gCb,ueCb->srbCb, KW_MAX_SRB_PER_UE);
718 /* Delete all DRB RbCbs in UeCb */
719 kwDbmDelAllUlRb(gCb,ueCb->drbCb, KW_MAX_DRB_PER_UE);
721 /* Delete ueCb entry from ueLstCp */
722 if(ROK != cmHashListDelete(&(gCb->u.ulCb->ueLstCp), (PTR) ueCb))
724 RLOG_ARG1(L_ERROR,DBG_UEID,ueCb->ueId,
725 "HashList Deletion Failed cellId(%d)",
728 /* kw005.201 ccpu00117318, updating the statistics */
730 /* Deallocate ueCb */
731 KW_FREE(gCb,ueCb, sizeof(KwUlUeCb));
737 * @brief Handler to delete all UeCbs
740 * This function is invoked by CFG to delete all UeCbs from the Ue
743 * @param[in] gCb RLC Instance Control Block
748 PUBLIC Void kwDbmDelAllUlUe
753 PUBLIC Void kwDbmDelAllUlUe(gCb)
757 KwUlUeCb *ueCb = NULLP; /* UE Control Block */
759 TRC3(kwDbmDelAllUlUe)
762 /* Until no more ueCb is ueLstCp hash list get and delete ueCb */
763 while (ROK == cmHashListGetNext(&(gCb->u.ulCb->ueLstCp),
767 kwDbmDelUlUeCb(gCb,ueCb, TRUE);
777 * @brief Handler to create CellCb
780 * This function is invoked by CFG to create CellCb and insert into
781 * the Cell hashlist of KwCb.
783 * @param[in] gCb RLC Instance Control Block
784 * @param[in] cellId Cell Identifier
785 * @param[in] cellCb Cell Control Block
792 PUBLIC S16 kwDbmAddUlCellCb
799 PUBLIC S16 kwDbmAddUlCellCb(gCb, cellId, cellCb)
807 TRC3(kwDbmAddUlCellCb)
812 tCellCb->cellId = cellId;
814 if(ROK != cmHashListInsert(&(gCb->u.ulCb->cellLstCp),
816 (U8 *)&(tCellCb->cellId),
817 (U16) sizeof(CmLteCellId)))
819 RLOG_ARG0(L_ERROR,DBG_CELLID,tCellCb->cellId,
820 "HashList Insertion Failed");
829 * @brief Handler to Fetch an CellCb
832 * This function is invoked by CFG to fetch UeCb from the Ue hashlist
835 * @param[in] gCb RLC Instance Control Block
836 * @param[in] cellId Cell Identifier
837 * @param[out] cellCb UE Control Block
845 PUBLIC Void kwDbmFetchUlCellCb
852 PUBLIC Void kwDbmFetchUlCellCb(gCb, cellId, cellCb)
858 TRC3(kwDbmFetchUlCellCb)
862 if(ROK != cmHashListFind(&(gCb->u.ulCb->cellLstCp),
863 (U8 *)&(cellId),sizeof(CmLteCellId),
864 KW_DEF_SEQ_NUM, (PTR*) cellCb))
866 RLOG_ARG0(L_ERROR,DBG_CELLID, cellId,"CellCb not found");
874 * @brief Handler to delete CellCb
877 * This function is invoked by CFG to delete CellCb from the Cell hashlist
880 * @param[in] gCb RLC Instance Control Block
881 * @param[in] cellCb Cell Control Block
886 PUBLIC Void kwDbmDelUlCellCb
892 PUBLIC Void kwDbmDelUlCellCb(gCb, cellCb)
897 TRC3(kwDbmDelUlCellCb)
900 /* Delete all rbCbs in cellCb */
901 kwDbmDelAllUlRb(gCb,cellCb->rbCb, KW_MAX_RB_PER_CELL);
903 /* Delete cellCb entry in hash list cellLstCp */
904 if(ROK != cmHashListDelete(&(gCb->u.ulCb->cellLstCp), (PTR) cellCb))
906 RLOG_ARG0(L_ERROR,DBG_CELLID,cellCb->cellId,
907 "HashList Deletion Failed");
909 /* Deallocate cellCb */
910 KW_FREE(gCb, cellCb, sizeof(KwUlCellCb));
913 } /* kwDbmDelCellCb */
917 * @brief Handler to delete all UeCbs
920 * This function is invoked by CFG to delete all UeCbs from the Ue
922 * @param[in] gCb RLC Instance Control Block
927 PUBLIC Void kwDbmDelAllUlCell
932 PUBLIC Void kwDbmDelAllUlCell(gCb)
936 KwUlCellCb *cellCb = NULLP; /* Cell Control Block */
938 TRC3(kwDbmDelAllUlCell)
941 /* Until no more cellCb is ueLstCp hash list get and delete cellCb */
942 while (ROK == cmHashListGetNext(&(gCb->u.ulCb->cellLstCp),
946 kwDbmDelUlCellCb(gCb,cellCb);
956 * @brief Handler to delete all UeCbs and CellCbs
959 * This function is invoked by LMM to delete all UeCbs from the Ue
960 * hashlist of KwCb and cellCbs from the Cell hashlist of kwCb.
962 * @param[in] gCb RLC Instance Control Block
966 PUBLIC Void kwDbmUlShutdown
971 PUBLIC Void kwDbmUlShutdown(gCb)
975 TRC3(kwDbmUlShutdown)
977 kwDbmDelAllUlCell(gCb);
979 kwDbmDelAllUlUe(gCb);
987 /********************************************************************30**
990 **********************************************************************/