/******************************************************************************* ################################################################################ # Copyright (c) [2017-2019] [Radisys] # # # # Licensed under the Apache License, Version 2.0 (the "License"); # # you may not use this file except in compliance with the License. # # You may obtain a copy of the License at # # # # http://www.apache.org/licenses/LICENSE-2.0 # # # # Unless required by applicable law or agreed to in writing, software # # distributed under the License is distributed on an "AS IS" BASIS, # # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # # See the License for the specific language governing permissions and # # limitations under the License. # ################################################################################ *******************************************************************************/ /************************************************************************ Name: LTE-MAC layer Type: C source file Desc: C source code for Entry point fucntions File: rg_dbm.c **********************************************************************/ /** @file rg_dbm.c @brief This file contains the APIs exposed for the insertion/fetching/deletion of cellCb/ueCb and traversal of LcCbLst. */ /* header include files -- defines (.h) */ #include "common_def.h" #include "tfu.h" #include "du_app_mac_inf.h" #include "lrg.h" #include "crg.h" #include "rgu.h" #include "rg_sch_inf.h" #include "rg_env.h" #include "rg.h" /* header/extern include files (.x) */ #include "tfu.x" #include "lrg.x" #include "crg.x" #include "rgu.x" #include "rg_sch_inf.x" #include "rg_prg.x" /* PRG interface typedefs*/ #include "rg.x" /* local defines */ static S16 rgDBMInitUeCbLst ARGS(( RgCellCb *cellCb, uint16_t numBins)); static Void rgDBMInitDedLcLst ARGS((RgUeCb *ueCb)); static Void rgDBMInitCmnLcLst ARGS((RgCellCb *cellCb)); static Void rgDBMInitRachLst ARGS((RgCellCb *cellCb)); #ifdef LTEMAC_SPS static S16 rgDBMInitSpsUeCbLst ARGS(( RgCellCb *cellCb, uint16_t numBins )); #endif /* local typedefs */ /* local externs */ /* forward references */ /** * @brief Handler for Initializing the cell. * * @details * * Function : rgDBMInitCell * * Initializes the lists belonging to the cell. * * * @param[in] RgCellCb *cellCb * @return S16 * -# ROK * -# RFAILED **/ S16 rgDBMInitCell ( RgCellCb *cellCb ) { S16 ret; /* Initialize ue list */ if ((ret = rgDBMInitUeCbLst(cellCb, RG_MAX_UE_BIN_PER_CELL)) != ROK) return (ret); #ifdef LTEMAC_SPS /* Initialize SPS Ue list */ if ((ret = rgDBMInitSpsUeCbLst(cellCb, RG_MAX_UE_BIN_PER_CELL)) != ROK) return (ret); #endif /* LTEMAC_SPS */ /* Initialize BCCH/PCCH logical channels */ rgDBMInitCmnLcLst(cellCb); /* Initialize rach ue list */ rgDBMInitRachLst(cellCb); return (ret); } /* rgDBMInitCell */ /** * @brief Handler for initializing the ueCbLst under the cellCb. * * @details * * Function : rgDBMInitUeCbLst * * * @param[in] *cellCb * @param[in] numBins * @return S16 * -# ROK * -# RFAILED **/ static S16 rgDBMInitUeCbLst ( RgCellCb *cellCb, uint16_t numBins ) { Inst inst = cellCb->macInst - RG_INST_START; RgUeCb ue; return (cmHashListInit(&cellCb->ueLst, numBins, (uint16_t)((PTR)&(ue.ueLstEnt) - (PTR)&ue), FALSE, CM_HASH_KEYTYPE_CONID, rgCb[inst].rgInit.region, rgCb[inst].rgInit.pool)); } /* rgDBMInitUeCbLst */ /** * @brief Handler for de-initializing the ueCbLst under the cellCb. * * @details * * Function : rgDBMDeInitUeCbLst * * * @param[in] *cellCb * @return S16 * -# ROK * -# RFAILED **/ S16 rgDBMDeInitUeCbLst(RgCellCb *cellCb) { return (cmHashListDeinit(&cellCb->ueLst)); } /* rgDBMDeInitUeCbLst */ #ifdef LTEMAC_SPS /** * @brief Handler for initializing the spsUeCbLst under the cellCb. * * @details * * Function : rgDBMInitSpsUeCbLst * * * @param[in] *cellCb * @param[in] numBins * @return S16 * -# ROK * -# RFAILED **/ static S16 rgDBMInitSpsUeCbLst(RgCellCb *cellCb,uint16_t numBins) { Inst inst = cellCb->macInst - RG_INST_START; RgUeCb ue; return (cmHashListInit(&cellCb->spsUeLst, numBins, (uint16_t) ((PTR) &(ue.spsUeLstEnt) - (PTR) &ue), FALSE, CM_HASH_KEYTYPE_CONID, rgCb[inst].rgInit.region, rgCb[inst].rgInit.pool)); } /* rgDBMInitSpsUeCbLst */ /** * @brief Handler for de-initializing the spsUeCbLst under the cellCb. * * @details * * Function : rgDBMDeInitSpsUeCbLst * * * @param[in] *cellCb * @return S16 * -# ROK * -# RFAILED **/ S16 rgDBMDeInitSpsUeCbLst(RgCellCb *cellCb) { return (cmHashListDeinit(&cellCb->spsUeLst)); } /* rgDBMDeInitSpsUeCbLst */ #endif /* LTEMAC_SPS */ /** * @brief Handler for inserting the ueCb in to the ueCbLst under the cellCb. * * @details * * Function : rgDBMInsUeCb * * * @param[in] *cellCb * @param[in] *ueCb * @return S16 * -# ROK * -# RFAILED **/ S16 rgDBMInsUeCb(RgCellCb *cellCb,RgUeCb *ueCb) { return (cmHashListInsert(&cellCb->ueLst, (PTR)ueCb, (uint8_t *)&ueCb->ueId, (uint16_t)sizeof(ueCb->ueId))); } /* rgDBMInsUeCb */ #ifdef LTEMAC_SPS /** * @brief Handler for inserting the ueCb in to the spsUeCbLst under the cellCb. * * @details * * Function : rgDBMInsSpsUeCb * * * @param[in] *cellCb * @param[in] *ueCb * @return S16 * -# ROK * -# RFAILED **/ S16 rgDBMInsSpsUeCb(RgCellCb *cellCb,RgUeCb *ueCb) { return (cmHashListInsert(&cellCb->spsUeLst, (PTR)ueCb, (uint8_t *)&ueCb->spsRnti, (uint16_t)sizeof(ueCb->spsRnti))); } /* end of rgDBMInsSpsUeCb */ #endif /* LTEMAC_SPS */ /** * @brief Handler for accessing the existing ueCb identified by the key ueId * in the ueCbLst under the cellCb. * * @details * * Function : rgDBMGetUeCb * * * @param[in] *cellCb * @param[in] ueId * @return RgUeCb* **/ RgUeCb* rgDBMGetUeCb(RgCellCb *cellCb, CmLteRnti ueId) { RgUeCb *ueCb = NULLP; cmHashListFind(&cellCb->ueLst, (uint8_t *)&ueId, sizeof(ueId), 0, (PTR *)&ueCb); return (ueCb); } /* rgDBMGetUeCb */ #ifdef LTEMAC_SPS /** * @brief Handler for accessing the ueCb identified by the key sps-rnti * in the spsUeLst under the cellCb. * * @details * * Function : rgDBMGetSpsUeCb * * * @param[in] *cellCb * @param[in] ueId * @return RgUeCb* **/ RgUeCb* rgDBMGetSpsUeCb(RgCellCb *cellCb, CmLteRnti spsRnti) { RgUeCb *ueCb = NULLP; cmHashListFind(&cellCb->spsUeLst, (uint8_t *)&spsRnti, sizeof(spsRnti), 0, (PTR *)&ueCb); return (ueCb); } /* rgDBMGetSpsUeCb */ #endif /* LTEMAC_SPS */ /** * @brief Handler for accessing the existing next ueCb in the ueCbLst under the * cellCb. * * @details * * Function : rgDBMGetNextUeCb * * * @param[in] *cellCb * @param[in] *ueCb * @return RgUeCb* **/ RgUeCb* rgDBMGetNextUeCb(RgCellCb *cellCb, RgUeCb *ueCb) { RgUeCb *nextUeCb = NULLP; cmHashListGetNext(&cellCb->ueLst, (PTR) ueCb, (PTR *)&nextUeCb); return (nextUeCb); } /* rgDBMGetNextUeCb */ #ifdef LTEMAC_SPS /** * @brief Handler for accessing the existing next ueCb stored in the spsUeCbLst * using SPS-Rnti under the cellCb. * * @details * * Function : rgDBMGetNextSpsUeCb * * * @param[in] *cellCb * @param[in] *ueCb * @return RgUeCb* **/ RgUeCb* rgDBMGetNextSpsUeCb(RgCellCb *cellCb, RgUeCb *ueCb) { RgUeCb *nextUeCb = NULLP; cmHashListGetNext(&cellCb->spsUeLst, (PTR) ueCb, (PTR *)&nextUeCb); return (nextUeCb); } /* end of rgDBMGetNextSpsUeCb */ #endif /* LTEMAC_SPS */ /** * @brief Handler for deleting the existing ueCb from the ueCbLst under the * cellCb. * * @details * * Function : rgDBMDelUeCb * * * @param[in] *cellCb * @param[in] *ueCb * @return S16 * -# ROK * -# RFAILED **/ S16 rgDBMDelUeCb(RgCellCb *cellCb, RgUeCb *ueCb) { return (cmHashListDelete(&cellCb->ueLst, (PTR)ueCb)); } /* rgDBMDelUeCb */ #ifdef LTEMAC_SPS /** * @brief Handler for deleting the existing ueCb from the spsUeCbLst under the * cellCb. * * @details * * Function : rgDBMDelSpsUeCb * * * @param[in] *cellCb * @param[in] *ueCb * @return S16 * -# ROK * -# RFAILED **/ S16 rgDBMDelSpsUeCb(RgCellCb *cellCb, RgUeCb *ueCb) { return (cmHashListDelete(&cellCb->spsUeLst, (PTR)ueCb)); } /* end of rgDBMDelSpsUeCb */ #endif /* LTEMAC_SPS */ /** * @brief Handler for Initializing the UE. * * @details * * Function : rgDBMInitUe * * Initializes the lists belonging to the UE. * * * @param[in] RgUeCb *ueCb * @return S16 * -# ROK * -# RFAILED **/ Void rgDBMInitUe(RgUeCb *ueCb) { #ifdef LTEMAC_SPS uint8_t idx; #endif /* Initialize Dedicated logical channels */ rgDBMInitDedLcLst(ueCb); #ifdef LTEMAC_SPS /* Initialize the SPS LC Ids */ for (idx=0; idx < RG_MAX_LC_PER_UE; idx++) { ueCb->ul.spsLcId[idx] = FALSE; } #endif return; } /* rgDBMInitUe */ /** * @brief Handler for Initializing the dedicated logical channels. * * @details * * Function : rgDBMInitDedLcLst * * Initializes dedicated logical channels. * * @param[in] RgUeCb *ueCb * @return Void **/ static Void rgDBMInitDedLcLst(RgUeCb *ueCb) { uint8_t idx; for (idx = 0; idx < RG_MAX_LC_PER_UE; ++idx) { /* Set Dedicated LCs as not configured */ ueCb->ul.lcCb[idx].lcId = RG_INVALID_LC_ID; ueCb->ul.lcCb[idx].lcgId = RG_INVALID_LCG_ID; ueCb->dl.lcCb[idx].lcId = RG_INVALID_LC_ID; } for (idx = 0; idx < RG_MAX_LCG_PER_UE; ++idx) { /* Set LCGs as not configured */ ueCb->ul.lcgArr[idx].lcgId = RG_INVALID_LCG_ID; ueCb->ul.lcgArr[idx].lcCount = 0; } /* Stack Crash problem for TRACE5 Changes. Added the return below */ return; } /* rgDBMInitDedLcLst */ /** * @brief Handler for Initializing the common logical channel list of the cell. * * @details * * Function : rgDBMInitCmnLcLst * * Initializes following common logical channels belonging to the cell. * - BCCH on BCH * - BCCH on DLSCH * - PCCH * * @param[in] RgCellCb *cellCb * @return Void **/ static Void rgDBMInitCmnLcLst(RgCellCb *cellCb) { uint8_t idx; cellCb->bcchBchInfo.lcId = RG_INVALID_LC_ID; cellCb->pcchInfo.lcId = RG_INVALID_LC_ID; cellCb->numBcchDlschInfo = 0; for (idx = 0; idx < RG_MAX_BCCH_DLSCH; idx++) { cellCb->bcchDlschInfo[idx].lcId = RG_INVALID_LC_ID; cellCb->bcchDlschInfo[idx].tb = NULLP; } /* Stack Crash problem for TRACE5 Changes. Added the return below */ return; } /* rgDBMInitCmnLcLst */ /** * @brief Handler for Initializing the common logical channel list of the cell. * * @details * * Function : rgDBMFreeCmnLcLst * * Initializes following common logical channels belonging to the cell. * - BCCH on BCH * - BCCH on DLSCH * - PCCH * * @param[in] RgCellCb *cellCb * @return Void **/ Void rgDBMFreeCmnLcLst(RgCellCb *cellCb) { uint8_t idx; cellCb->bcchBchInfo.lcId = RG_INVALID_LC_ID; cellCb->pcchInfo.lcId = RG_INVALID_LC_ID; for (idx = 0; idx < cellCb->numBcchDlschInfo; idx++) { cellCb->bcchDlschInfo[idx].lcId = RG_INVALID_LC_ID; RG_FREE_MSG(cellCb->bcchDlschInfo[idx].tb); } cellCb->numBcchDlschInfo = 0; /* Stack Crash problem for TRACE5 Changes. Added the return below */ return; } /* rgDBMFreeCmnLcLst */ /** * @brief Handler for inserting dedicated DL logical channel. * * @details * * Function : rgDBMInsDlDedLcCb * * @param[in] RgUeCb *ueCb * @param[in] RgDlLcCb* dlLcCb * @return Void **/ Void rgDBMInsDlDedLcCb(RgUeCb *ueCb, CmLteLcId idx) { if( idx >= RG_DEDLC_MIN_LCID ) { ueCb->dl.lcCb[idx-1].lcId = idx; } /* Stack Crash problem for TRACE5 Changes. Added the return below */ return; } /* rgDBMInsDlDedLcCb */ /** * @brief Handler for deleting dedicated DL logical channel. * * @details * * Function : rgDBMDelDlDedLcCb * * @param[in] RgUeCb *ueCb * @param[in] RgDlLcCb* dlLcCb * @return Void **/ Void rgDBMDelDlDedLcCb(RgUeCb *ueCb, RgDlLcCb *dlLcCb) { ueCb->dl.lcCb[dlLcCb->lcId - 1].lcId = RG_INVALID_LC_ID; /* Stack Crash problem for TRACE5 Changes. Added the return below */ return; } /* rgDBMDelDlDedLcCb */ /** * @brief Handler for accessing the existing DL dedicated lcCb at idx in the * lcCbLst of the ueCb. * * @details * * Function : rgDBMGetDlDedLcCb * * @param[in] *ueCb * @param[in] idx * @return RgDlLcCb* **/ RgDlLcCb* rgDBMGetDlDedLcCb(RgUeCb *ueCb, CmLteLcId idx) { if (idx > RG_DEDLC_MAX_LCID || idx <= 0) { return (NULLP); } if(ueCb->dl.lcCb[idx-1].lcId == RG_INVALID_LC_ID) { return (NULLP); } return (&ueCb->dl.lcCb[idx-1]); } /* rgDBMGetDlDedLcCb */ /** * @brief Handler for inserting dedicated UL logical channel. * * @details * * Function : rgDBMInsUlDedLcCb * * * @param[in] RgUeCb *ueCb * @param[in] CmLteLcId idx * @param[in] LteLcgId gId * @return Void **/ #ifdef LTE_L2_MEAS Void rgDBMInsUlDedLcCb ( RgUeCb *ueCb, CmLteLcId idx, LteLcgId gId, uint8_t qci ) #else Void rgDBMInsUlDedLcCb ( RgUeCb *ueCb, CmLteLcId idx, LteLcgId gId ) #endif { if ( idx >= RG_DEDLC_MIN_LCID) { ueCb->ul.lcCb[idx - 1].lcId = idx; ueCb->ul.lcCb[idx - 1].lcgId = gId; #ifdef LTE_L2_MEAS ueCb->ul.lcCb[idx - 1].qci = qci; #endif } if(ueCb->ul.lcgArr[gId].lcgId == RG_INVALID_LCG_ID) { ueCb->ul.lcgArr[gId].lcgId = gId; } ueCb->ul.lcgArr[gId].lcCount = ueCb->ul.lcgArr[gId].lcCount + 1; /* Stack Crash problem for TRACE5 Changes. Added the return below */ return; } /* rgDBMInsUlDedLcCb */ /** * @brief Handler for deleting the dedicated UL logical channel. * * @details * * Function : rgDBMUpdUlDedLcCb * * * @param[in] RgUeCb *ueCb * @param[in] RgUlLcCb* ulLcCb * @param[in] LteLcgId gId * @return Void **/ Void rgDBMUpdUlDedLcCb ( RgUeCb *ueCb, RgUlLcCb *ulLcCb, LteLcgId gId ) { ueCb->ul.lcgArr[ulLcCb->lcgId].lcCount = ueCb->ul.lcgArr[ulLcCb->lcgId].lcCount - 1; if(ueCb->ul.lcgArr[ulLcCb->lcgId].lcCount == 0) { ueCb->ul.lcgArr[ulLcCb->lcgId].lcgId = RG_INVALID_LCG_ID; } ueCb->ul.lcCb[ulLcCb->lcId - 1].lcgId = gId; if(ueCb->ul.lcgArr[gId].lcgId == RG_INVALID_LCG_ID) { ueCb->ul.lcgArr[gId].lcgId = gId; } ueCb->ul.lcgArr[gId].lcCount = ueCb->ul.lcgArr[gId].lcCount + 1; /* Stack Crash problem for TRACE5 Changes. Added the return below */ return; } /* rgDBMUpdUlDedLcCb */ /** * @brief Handler for updating the dedicated UL logical channel. * * @details * * Function : rgDBMDelUlDedLcCb * * * @param[in] RgUeCb *ueCb * @param[in] RgUlLcCb* ulLcCb * @return Void **/ Void rgDBMDelUlDedLcCb(RgUeCb *ueCb, RgUlLcCb *ulLcCb) { ueCb->ul.lcgArr[ulLcCb->lcgId].lcCount = ueCb->ul.lcgArr[ulLcCb->lcgId].lcCount - 1; if(ueCb->ul.lcgArr[ulLcCb->lcgId].lcCount == 0) { ueCb->ul.lcgArr[ulLcCb->lcgId].lcgId = RG_INVALID_LCG_ID; } ueCb->ul.lcCb[ulLcCb->lcId - 1].lcgId = RG_INVALID_LCG_ID; ueCb->ul.lcCb[ulLcCb->lcId - 1].lcId = RG_INVALID_LC_ID; /* Stack Crash problem for TRACE5 Changes. Added the return below */ return; } /* rgDBMDelUlDedLcCb */ /** * @brief Handler for accessing the existing UL dedicated lcCb at idx in the * lcCbLst of the ueCb. * * @details * * Function : rgDBMGetUlDedLcCb * * * @param[in] *ueCb * @param[in] idx * @return RgUlLcCb* **/ RgUlLcCb* rgDBMGetUlDedLcCb(RgUeCb *ueCb, CmLteLcId idx) { if (idx > RG_DEDLC_MAX_LCID || idx < RG_DEDLC_MIN_LCID) { return (NULLP); } if(ueCb->ul.lcCb[idx-1].lcId == RG_INVALID_LC_ID) { return (NULLP); } return (&ueCb->ul.lcCb[idx-1]); } /* rgDBMGetDlDedLcCb */ /** * @brief Handler for accessing the existing DL common lcCb identified by the key lcId * in the lcCbLst of the ueCb. * * @details * * Function : rgDBMChkCmnLcCb * * * @param[in] *cellCb * @param[in] lcId * @return S16 * -# ROK * -# RFAILED **/ S16 rgDBMChkCmnLcCb(RgCellCb *cellCb, CmLteLcId lcId) { uint8_t idx; if(cellCb->bcchBchInfo.lcId == lcId) { return ROK; } if(cellCb->pcchInfo.lcId == lcId) { return ROK; } for (idx = 0; idx < cellCb->numBcchDlschInfo; idx++) { if(cellCb->bcchDlschInfo[idx].lcId == lcId) { return ROK; } } return RFAILED; } /* rgDBMChkCmnLcCb */ /** * @brief Handler for accessing the existing BCCH mapped on to BCH in the * lcCbLst of the ueCb. * * @details * * Function : rgDBMGetBcchOnBch * * * @param[in] *cellCb * @return RgBcchBchLcCb* **/ RgBcchBchLcCb* rgDBMGetBcchOnBch(RgCellCb *cellCb) { if(cellCb->bcchBchInfo.lcId != RG_INVALID_LC_ID) { return (&(cellCb->bcchBchInfo)); } return (NULLP); } /* rgDBMGetBcchOnBch */ /** * @brief Handler for accessing the existing BCCH mapped on to DLSCH in the * lcCbLst of the ueCb. * * @details * * Function : rgDBMGetBcchOnDlsch * * * @param[in] *cellCb * @param[in] lcId * @return RgBcchDlschLcCb* **/ RgBcchDlschLcCb* rgDBMGetBcchOnDlsch(RgCellCb *cellCb,CmLteLcId lcId) { uint8_t idx; for (idx = 0; idx < RG_MAX_BCCH_DLSCH; idx++) { if(cellCb->bcchDlschInfo[idx].lcId == lcId) { return (&(cellCb->bcchDlschInfo[idx])); } } return (NULLP); } /* rgDBMGetBcchOnDlsch */ /** * @brief Handler for accessing the existing PCCH in the lcCbLst of the ueCb. * * @details * * Function : rgDBMGetPcch * * * @param[in] *cellCb * @return RgPcchLcCb* **/ RgPcchLcCb* rgDBMGetPcch(RgCellCb *cellCb) { if(cellCb->pcchInfo.lcId != RG_INVALID_LC_ID) { return (&(cellCb->pcchInfo)); } return (NULLP); } /* rgDBMGetPcch */ /** * @brief Handler for inserting the BCCH mapped on to BCH in the * lcCbLst of the ueCb. * * @details * * Function : rgDBMInsBcchOnBch * * * @param[in] *cellCb * @return Void **/ Void rgDBMInsBcchOnBch(RgCellCb *cellCb, CmLteLcId idx) { cellCb->bcchBchInfo.lcId = idx; /* Stack Crash problem for TRACE5 Changes. Added the return below */ return; } /* rgDBMInsBcchOnBch */ /** * @brief Handler for inserting the BCCH mapped on to DLSCH in the * lcCbLst of the ueCb. * * @details * * Function : rgDBMInsBcchOnDlsch * * * @param[in] *cellCb * @return Void **/ Void rgDBMInsBcchOnDlsch(RgCellCb *cellCb, CmLteLcId idx) { cellCb->bcchDlschInfo[cellCb->numBcchDlschInfo].lcId = idx; cellCb->numBcchDlschInfo++; /* Stack Crash problem for TRACE5 Changes. Added the return below */ return; } /* rgDBMInsBcchOnDlsch */ /** * @brief Handler for inserting the PCCH in the lcCbLst of the ueCb. * * @details * * Function : rgDBMInsPcch * * * @param[in] *cellCb * @return Void **/ Void rgDBMInsPcch(RgCellCb *cellCb, CmLteLcId idx) { cellCb->pcchInfo.lcId = idx; /* Stack Crash problem for TRACE5 Changes. Added the return below */ return; } /* rgDBMInsPcch */ /** * @brief Handler for initializing the rachLst * * @details * * Function : rgDBMInitRachLst * * * @param[in] *cellCb * @return Void **/ static Void rgDBMInitRachLst(RgCellCb *cellCb) { cmLListInit(&cellCb->raInfo.ueRachLst); return; } /* rgDBMInitRachLst */ /** * @brief Handler for inserting the ueCb in the rachLst. * * @details * * Function : rgDBMInsUeCbInRachLst * * * @param[in] *cellCb * @param[in] *ueCb * @return Void **/ Void rgDBMInsUeCbInRachLst(RgCellCb *cellCb, RgUeCb *ueCb) { cmLListAdd2Tail(&cellCb->raInfo.ueRachLst,&ueCb->rachLstEnt); return; } /* rgDBMInsUeCbInRachLst */ /** * @brief Handler for accessing the existing raCb in the rachLst. * * @details * * Function : rgDBMGetUeCbFromRachLst * * * @param[in] *cellCb * @param[in] key * @return RgUeCb* **/ RgUeCb* rgDBMGetUeCbFromRachLst(RgCellCb *cellCb, CmLteRnti key) { CmLList *tmpNode; CM_LLIST_FIRST_NODE(&cellCb->raInfo.ueRachLst,tmpNode); while(tmpNode) { if(((RgUeCb *)tmpNode->node)->ueId == key) { return ((RgUeCb *)(tmpNode->node)); } CM_LLIST_NEXT_NODE(&cellCb->raInfo.ueRachLst,tmpNode); } return (NULLP); } /* rgDBMGetUeCbFromRachLst */ /** * @brief Handler for accessing the existing ueCb from rachLst. * * @details * * Function : rgDBMGetNextUeCbFromRachLst * * * @param[in] *cellCb * @param[in] *ueCb * @return RgUeCb* **/ RgUeCb* rgDBMGetNextUeCbFromRachLst(RgCellCb *cellCb,RgUeCb *ueCb) { if(!ueCb) { return ( cellCb->raInfo.ueRachLst.first ? (RgUeCb *)(cellCb->raInfo.ueRachLst.first->node) : NULLP ); } return ( ueCb->rachLstEnt.next ? (RgUeCb *)(ueCb->rachLstEnt.next->node) : NULLP ); } /* rgDBMGetNextUeCbFromRachLst */ /** * @brief Handler for deleting the existing ueCb in the rachLst. * * @details * * Function : rgDBMDelUeCbFromRachLst * * * @param[in] *cellCb * @param[in] key * @return RgUeCb* **/ Void rgDBMDelUeCbFromRachLst(RgCellCb *cellCb, RgUeCb *ueCb) { cmLListDelFrm(&cellCb->raInfo.ueRachLst, &ueCb->rachLstEnt); return; } /* rgDBMDelUeCbFromRachLst */ /********************************************************************** End of file **********************************************************************/