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 /************************************************************************
25 Desc: C source code for Entry point fucntions
29 **********************************************************************/
32 @brief This file contains the APIs exposed for the insertion/fetching/deletion of cellCb/ueCb and traversal of LcCbLst.
35 /* header include files -- defines (.h) */
36 #include "common_def.h"
38 #include "du_app_mac_inf.h"
42 #include "rg_sch_inf.h"
46 /* header/extern include files (.x) */
51 #include "rg_sch_inf.x"
52 #include "rg_prg.x" /* PRG interface typedefs*/
56 static S16 rgDBMInitUeCbLst ARGS(( RgCellCb *cellCb, uint16_t numBins));
57 static Void rgDBMInitDedLcLst ARGS((RgUeCb *ueCb));
58 static Void rgDBMInitCmnLcLst ARGS((RgCellCb *cellCb));
59 static Void rgDBMInitRachLst ARGS((RgCellCb *cellCb));
61 static S16 rgDBMInitSpsUeCbLst ARGS((
71 /* forward references */
74 * @brief Handler for Initializing the cell.
78 * Function : rgDBMInitCell
80 * Initializes the lists belonging to the cell.
83 * @param[in] RgCellCb *cellCb
94 S16 rgDBMInitCell(cellCb)
100 /* Initialize ue list */
101 if ((ret = rgDBMInitUeCbLst(cellCb, RG_MAX_UE_BIN_PER_CELL)) != ROK)
105 /* Initialize SPS Ue list */
106 if ((ret = rgDBMInitSpsUeCbLst(cellCb, RG_MAX_UE_BIN_PER_CELL)) != ROK)
108 #endif /* LTEMAC_SPS */
110 /* Initialize BCCH/PCCH logical channels */
111 rgDBMInitCmnLcLst(cellCb);
114 /* Initialize rach ue list */
115 rgDBMInitRachLst(cellCb);
119 } /* rgDBMInitCell */
122 * @brief Handler for initializing the ueCbLst under the cellCb.
126 * Function : rgDBMInitUeCbLst
136 static S16 rgDBMInitUeCbLst
142 static S16 rgDBMInitUeCbLst(cellCb, numBins)
147 Inst inst = cellCb->macInst - RG_INST_START;
150 return (cmHashListInit(&cellCb->ueLst, numBins, (uint16_t)((PTR)&(ue.ueLstEnt) - (PTR)&ue), FALSE,
151 CM_HASH_KEYTYPE_CONID, rgCb[inst].rgInit.region, rgCb[inst].rgInit.pool));
153 } /* rgDBMInitUeCbLst */
156 * @brief Handler for de-initializing the ueCbLst under the cellCb.
160 * Function : rgDBMDeInitUeCbLst
169 S16 rgDBMDeInitUeCbLst
174 S16 rgDBMDeInitUeCbLst(cellCb)
179 return (cmHashListDeinit(&cellCb->ueLst));
181 } /* rgDBMDeInitUeCbLst */
185 * @brief Handler for initializing the spsUeCbLst under the cellCb.
189 * Function : rgDBMInitSpsUeCbLst
199 static S16 rgDBMInitSpsUeCbLst
205 static S16 rgDBMInitSpsUeCbLst(cellCb, numBins)
210 Inst inst = cellCb->macInst - RG_INST_START;
213 return (cmHashListInit(&cellCb->spsUeLst, numBins, (uint16_t) ((PTR) &(ue.spsUeLstEnt) - (PTR) &ue), FALSE,
214 CM_HASH_KEYTYPE_CONID, rgCb[inst].rgInit.region, rgCb[inst].rgInit.pool));
216 } /* rgDBMInitSpsUeCbLst */
219 * @brief Handler for de-initializing the spsUeCbLst under the cellCb.
223 * Function : rgDBMDeInitSpsUeCbLst
232 S16 rgDBMDeInitSpsUeCbLst
237 S16 rgDBMDeInitSpsUeCbLst(cellCb)
242 return (cmHashListDeinit(&cellCb->spsUeLst));
244 } /* rgDBMDeInitSpsUeCbLst */
246 #endif /* LTEMAC_SPS */
249 * @brief Handler for inserting the ueCb in to the ueCbLst under the cellCb.
253 * Function : rgDBMInsUeCb
269 S16 rgDBMInsUeCb(cellCb, ueCb)
274 return (cmHashListInsert(&cellCb->ueLst, (PTR)ueCb,
275 (uint8_t *)&ueCb->ueId, (uint16_t)sizeof(ueCb->ueId)));
281 * @brief Handler for inserting the ueCb in to the spsUeCbLst under the cellCb.
285 * Function : rgDBMInsSpsUeCb
301 S16 rgDBMInsSpsUeCb(cellCb, ueCb)
307 return (cmHashListInsert(&cellCb->spsUeLst, (PTR)ueCb,
308 (uint8_t *)&ueCb->spsRnti, (uint16_t)sizeof(ueCb->spsRnti)));
310 } /* end of rgDBMInsSpsUeCb */
312 #endif /* LTEMAC_SPS */
315 * @brief Handler for accessing the existing ueCb identified by the key ueId
316 * in the ueCbLst under the cellCb.
320 * Function : rgDBMGetUeCb
334 RgUeCb* rgDBMGetUeCb(cellCb, ueId)
339 RgUeCb *ueCb = NULLP;
341 cmHashListFind(&cellCb->ueLst, (uint8_t *)&ueId,
342 sizeof(ueId), 0, (PTR *)&ueCb);
348 * @brief Handler for accessing the ueCb identified by the key sps-rnti
349 * in the spsUeLst under the cellCb.
353 * Function : rgDBMGetSpsUeCb
361 RgUeCb* rgDBMGetSpsUeCb
367 RgUeCb* rgDBMGetSpsUeCb(cellCb, spsRnti)
372 RgUeCb *ueCb = NULLP;
374 cmHashListFind(&cellCb->spsUeLst, (uint8_t *)&spsRnti,
375 sizeof(spsRnti), 0, (PTR *)&ueCb);
377 } /* rgDBMGetSpsUeCb */
379 #endif /* LTEMAC_SPS */
382 * @brief Handler for accessing the existing next ueCb in the ueCbLst under the
387 * Function : rgDBMGetNextUeCb
395 RgUeCb* rgDBMGetNextUeCb
401 RgUeCb* rgDBMGetNextUeCb(cellCb, ueCb)
406 RgUeCb *nextUeCb = NULLP;
408 cmHashListGetNext(&cellCb->ueLst, (PTR) ueCb, (PTR *)&nextUeCb);
410 } /* rgDBMGetNextUeCb */
414 * @brief Handler for accessing the existing next ueCb stored in the spsUeCbLst
415 * using SPS-Rnti under the cellCb.
419 * Function : rgDBMGetNextSpsUeCb
427 RgUeCb* rgDBMGetNextSpsUeCb
433 RgUeCb* rgDBMGetNextSpsUeCb(cellCb, ueCb)
438 RgUeCb *nextUeCb = NULLP;
440 cmHashListGetNext(&cellCb->spsUeLst, (PTR) ueCb, (PTR *)&nextUeCb);
442 } /* end of rgDBMGetNextSpsUeCb */
444 #endif /* LTEMAC_SPS */
448 * @brief Handler for deleting the existing ueCb from the ueCbLst under the
453 * Function : rgDBMDelUeCb
469 S16 rgDBMDelUeCb(cellCb, ueCb)
474 return (cmHashListDelete(&cellCb->ueLst, (PTR)ueCb));
479 * @brief Handler for deleting the existing ueCb from the spsUeCbLst under the
484 * Function : rgDBMDelSpsUeCb
500 S16 rgDBMDelSpsUeCb(cellCb, ueCb)
506 return (cmHashListDelete(&cellCb->spsUeLst, (PTR)ueCb));
507 } /* end of rgDBMDelSpsUeCb */
509 #endif /* LTEMAC_SPS */
512 * @brief Handler for Initializing the UE.
516 * Function : rgDBMInitUe
518 * Initializes the lists belonging to the UE.
521 * @param[in] RgUeCb *ueCb
532 Void rgDBMInitUe(ueCb)
540 /* Initialize Dedicated logical channels */
541 rgDBMInitDedLcLst(ueCb);
544 /* Initialize the SPS LC Ids */
545 for (idx=0; idx < RG_MAX_LC_PER_UE; idx++)
547 ueCb->ul.spsLcId[idx] = FALSE;
556 * @brief Handler for Initializing the dedicated logical channels.
560 * Function : rgDBMInitDedLcLst
562 * Initializes dedicated logical channels.
564 * @param[in] RgUeCb *ueCb
568 static Void rgDBMInitDedLcLst
573 static Void rgDBMInitDedLcLst(ueCb)
579 for (idx = 0; idx < RG_MAX_LC_PER_UE; ++idx)
581 /* Set Dedicated LCs as not configured */
582 ueCb->ul.lcCb[idx].lcId = RG_INVALID_LC_ID;
583 ueCb->ul.lcCb[idx].lcgId = RG_INVALID_LCG_ID;
584 ueCb->dl.lcCb[idx].lcId = RG_INVALID_LC_ID;
587 for (idx = 0; idx < RG_MAX_LCG_PER_UE; ++idx)
589 /* Set LCGs as not configured */
590 ueCb->ul.lcgArr[idx].lcgId = RG_INVALID_LCG_ID;
591 ueCb->ul.lcgArr[idx].lcCount = 0;
594 /* Stack Crash problem for TRACE5 Changes. Added the return below */
596 } /* rgDBMInitDedLcLst */
599 * @brief Handler for Initializing the common logical channel list of the cell.
603 * Function : rgDBMInitCmnLcLst
605 * Initializes following common logical channels belonging to the cell.
610 * @param[in] RgCellCb *cellCb
614 static Void rgDBMInitCmnLcLst
619 static Void rgDBMInitCmnLcLst(cellCb)
625 cellCb->bcchBchInfo.lcId = RG_INVALID_LC_ID;
626 cellCb->pcchInfo.lcId = RG_INVALID_LC_ID;
628 cellCb->numBcchDlschInfo = 0;
629 for (idx = 0; idx < RG_MAX_BCCH_DLSCH; idx++)
631 cellCb->bcchDlschInfo[idx].lcId = RG_INVALID_LC_ID;
632 cellCb->bcchDlschInfo[idx].tb = NULLP;
635 /* Stack Crash problem for TRACE5 Changes. Added the return below */
637 } /* rgDBMInitCmnLcLst */
640 * @brief Handler for Initializing the common logical channel list of the cell.
644 * Function : rgDBMFreeCmnLcLst
646 * Initializes following common logical channels belonging to the cell.
651 * @param[in] RgCellCb *cellCb
655 Void rgDBMFreeCmnLcLst
660 Void rgDBMFreeCmnLcLst(cellCb)
666 cellCb->bcchBchInfo.lcId = RG_INVALID_LC_ID;
667 cellCb->pcchInfo.lcId = RG_INVALID_LC_ID;
669 for (idx = 0; idx < cellCb->numBcchDlschInfo; idx++)
671 cellCb->bcchDlschInfo[idx].lcId = RG_INVALID_LC_ID;
672 RG_FREE_MSG(cellCb->bcchDlschInfo[idx].tb);
674 cellCb->numBcchDlschInfo = 0;
676 /* Stack Crash problem for TRACE5 Changes. Added the return below */
678 } /* rgDBMFreeCmnLcLst */
681 * @brief Handler for inserting dedicated DL logical channel.
685 * Function : rgDBMInsDlDedLcCb
687 * @param[in] RgUeCb *ueCb
688 * @param[in] RgDlLcCb* dlLcCb
692 Void rgDBMInsDlDedLcCb
698 Void rgDBMInsDlDedLcCb(ueCb, idx)
703 if( idx >= RG_DEDLC_MIN_LCID )
705 ueCb->dl.lcCb[idx-1].lcId = idx;
707 /* Stack Crash problem for TRACE5 Changes. Added the return below */
709 } /* rgDBMInsDlDedLcCb */
712 * @brief Handler for deleting dedicated DL logical channel.
716 * Function : rgDBMDelDlDedLcCb
718 * @param[in] RgUeCb *ueCb
719 * @param[in] RgDlLcCb* dlLcCb
723 Void rgDBMDelDlDedLcCb
729 Void rgDBMDelDlDedLcCb(ueCb, dlLcCb)
734 ueCb->dl.lcCb[dlLcCb->lcId - 1].lcId = RG_INVALID_LC_ID;
736 /* Stack Crash problem for TRACE5 Changes. Added the return below */
739 } /* rgDBMDelDlDedLcCb */
742 * @brief Handler for accessing the existing DL dedicated lcCb at idx in the
743 * lcCbLst of the ueCb.
747 * Function : rgDBMGetDlDedLcCb
754 RgDlLcCb* rgDBMGetDlDedLcCb
760 RgDlLcCb* rgDBMGetDlDedLcCb(ueCb, idx)
765 if (idx > RG_DEDLC_MAX_LCID || idx <= 0)
769 if(ueCb->dl.lcCb[idx-1].lcId == RG_INVALID_LC_ID)
774 return (&ueCb->dl.lcCb[idx-1]);
776 } /* rgDBMGetDlDedLcCb */
779 * @brief Handler for inserting dedicated UL logical channel.
783 * Function : rgDBMInsUlDedLcCb
786 * @param[in] RgUeCb *ueCb
787 * @param[in] CmLteLcId idx
788 * @param[in] LteLcgId gId
793 Void rgDBMInsUlDedLcCb
801 Void rgDBMInsUlDedLcCb(ueCb, idx, gId, qci)
809 Void rgDBMInsUlDedLcCb
816 Void rgDBMInsUlDedLcCb(ueCb, idx, gId)
823 if ( idx >= RG_DEDLC_MIN_LCID)
825 ueCb->ul.lcCb[idx - 1].lcId = idx;
826 ueCb->ul.lcCb[idx - 1].lcgId = gId;
828 ueCb->ul.lcCb[idx - 1].qci = qci;
831 if(ueCb->ul.lcgArr[gId].lcgId == RG_INVALID_LCG_ID)
833 ueCb->ul.lcgArr[gId].lcgId = gId;
835 ueCb->ul.lcgArr[gId].lcCount = ueCb->ul.lcgArr[gId].lcCount + 1;
838 /* Stack Crash problem for TRACE5 Changes. Added the return below */
841 } /* rgDBMInsUlDedLcCb */
844 * @brief Handler for deleting the dedicated UL logical channel.
848 * Function : rgDBMUpdUlDedLcCb
851 * @param[in] RgUeCb *ueCb
852 * @param[in] RgUlLcCb* ulLcCb
853 * @param[in] LteLcgId gId
857 Void rgDBMUpdUlDedLcCb
864 Void rgDBMUpdUlDedLcCb(ueCb, ulLcCb, gId)
870 ueCb->ul.lcgArr[ulLcCb->lcgId].lcCount =
871 ueCb->ul.lcgArr[ulLcCb->lcgId].lcCount - 1;
872 if(ueCb->ul.lcgArr[ulLcCb->lcgId].lcCount == 0)
874 ueCb->ul.lcgArr[ulLcCb->lcgId].lcgId = RG_INVALID_LCG_ID;
876 ueCb->ul.lcCb[ulLcCb->lcId - 1].lcgId = gId;
878 if(ueCb->ul.lcgArr[gId].lcgId == RG_INVALID_LCG_ID)
880 ueCb->ul.lcgArr[gId].lcgId = gId;
882 ueCb->ul.lcgArr[gId].lcCount = ueCb->ul.lcgArr[gId].lcCount + 1;
884 /* Stack Crash problem for TRACE5 Changes. Added the return below */
886 } /* rgDBMUpdUlDedLcCb */
889 * @brief Handler for updating the dedicated UL logical channel.
893 * Function : rgDBMDelUlDedLcCb
896 * @param[in] RgUeCb *ueCb
897 * @param[in] RgUlLcCb* ulLcCb
901 Void rgDBMDelUlDedLcCb
907 Void rgDBMDelUlDedLcCb(ueCb, ulLcCb)
913 ueCb->ul.lcgArr[ulLcCb->lcgId].lcCount =
914 ueCb->ul.lcgArr[ulLcCb->lcgId].lcCount - 1;
915 if(ueCb->ul.lcgArr[ulLcCb->lcgId].lcCount == 0)
917 ueCb->ul.lcgArr[ulLcCb->lcgId].lcgId = RG_INVALID_LCG_ID;
919 ueCb->ul.lcCb[ulLcCb->lcId - 1].lcgId = RG_INVALID_LCG_ID;
920 ueCb->ul.lcCb[ulLcCb->lcId - 1].lcId = RG_INVALID_LC_ID;
922 /* Stack Crash problem for TRACE5 Changes. Added the return below */
924 } /* rgDBMDelUlDedLcCb */
927 * @brief Handler for accessing the existing UL dedicated lcCb at idx in the
928 * lcCbLst of the ueCb.
932 * Function : rgDBMGetUlDedLcCb
940 RgUlLcCb* rgDBMGetUlDedLcCb
946 RgUlLcCb* rgDBMGetUlDedLcCb(ueCb, idx)
952 if (idx > RG_DEDLC_MAX_LCID || idx < RG_DEDLC_MIN_LCID)
956 if(ueCb->ul.lcCb[idx-1].lcId == RG_INVALID_LC_ID)
961 return (&ueCb->ul.lcCb[idx-1]);
962 } /* rgDBMGetDlDedLcCb */
965 * @brief Handler for accessing the existing DL common lcCb identified by the key lcId
966 * in the lcCbLst of the ueCb.
970 * Function : rgDBMChkCmnLcCb
986 S16 rgDBMChkCmnLcCb(cellCb, lcId)
993 if(cellCb->bcchBchInfo.lcId == lcId)
997 if(cellCb->pcchInfo.lcId == lcId)
1002 for (idx = 0; idx < cellCb->numBcchDlschInfo; idx++)
1004 if(cellCb->bcchDlschInfo[idx].lcId == lcId)
1010 } /* rgDBMChkCmnLcCb */
1013 * @brief Handler for accessing the existing BCCH mapped on to BCH in the
1014 * lcCbLst of the ueCb.
1018 * Function : rgDBMGetBcchOnBch
1021 * @param[in] *cellCb
1022 * @return RgBcchBchLcCb*
1025 RgBcchBchLcCb* rgDBMGetBcchOnBch
1030 RgBcchBchLcCb* rgDBMGetBcchOnBch(cellCb)
1035 if(cellCb->bcchBchInfo.lcId != RG_INVALID_LC_ID)
1037 return (&(cellCb->bcchBchInfo));
1040 } /* rgDBMGetBcchOnBch */
1043 * @brief Handler for accessing the existing BCCH mapped on to DLSCH in the
1044 * lcCbLst of the ueCb.
1048 * Function : rgDBMGetBcchOnDlsch
1051 * @param[in] *cellCb
1053 * @return RgBcchDlschLcCb*
1056 RgBcchDlschLcCb* rgDBMGetBcchOnDlsch
1062 RgBcchDlschLcCb* rgDBMGetBcchOnDlsch(cellCb,lcId)
1069 for (idx = 0; idx < RG_MAX_BCCH_DLSCH; idx++)
1071 if(cellCb->bcchDlschInfo[idx].lcId == lcId)
1073 return (&(cellCb->bcchDlschInfo[idx]));
1077 } /* rgDBMGetBcchOnDlsch */
1080 * @brief Handler for accessing the existing PCCH in the lcCbLst of the ueCb.
1084 * Function : rgDBMGetPcch
1087 * @param[in] *cellCb
1088 * @return RgPcchLcCb*
1091 RgPcchLcCb* rgDBMGetPcch
1096 RgPcchLcCb* rgDBMGetPcch(cellCb)
1101 if(cellCb->pcchInfo.lcId != RG_INVALID_LC_ID)
1103 return (&(cellCb->pcchInfo));
1106 } /* rgDBMGetPcch */
1109 * @brief Handler for inserting the BCCH mapped on to BCH in the
1110 * lcCbLst of the ueCb.
1114 * Function : rgDBMInsBcchOnBch
1117 * @param[in] *cellCb
1121 Void rgDBMInsBcchOnBch
1127 Void rgDBMInsBcchOnBch(cellCb, idx)
1133 cellCb->bcchBchInfo.lcId = idx;
1135 /* Stack Crash problem for TRACE5 Changes. Added the return below */
1137 } /* rgDBMInsBcchOnBch */
1140 * @brief Handler for inserting the BCCH mapped on to DLSCH in the
1141 * lcCbLst of the ueCb.
1145 * Function : rgDBMInsBcchOnDlsch
1148 * @param[in] *cellCb
1152 Void rgDBMInsBcchOnDlsch
1158 Void rgDBMInsBcchOnDlsch(cellCb, idx)
1164 cellCb->bcchDlschInfo[cellCb->numBcchDlschInfo].lcId = idx;
1165 cellCb->numBcchDlschInfo++;
1167 /* Stack Crash problem for TRACE5 Changes. Added the return below */
1169 } /* rgDBMInsBcchOnDlsch */
1173 * @brief Handler for inserting the PCCH in the lcCbLst of the ueCb.
1177 * Function : rgDBMInsPcch
1180 * @param[in] *cellCb
1190 Void rgDBMInsPcch(cellCb, idx)
1196 cellCb->pcchInfo.lcId = idx;
1198 /* Stack Crash problem for TRACE5 Changes. Added the return below */
1200 } /* rgDBMInsPcch */
1203 * @brief Handler for initializing the rachLst
1207 * Function : rgDBMInitRachLst
1210 * @param[in] *cellCb
1214 static Void rgDBMInitRachLst
1219 static Void rgDBMInitRachLst(cellCb)
1224 cmLListInit(&cellCb->raInfo.ueRachLst);
1226 } /* rgDBMInitRachLst */
1229 * @brief Handler for inserting the ueCb in the rachLst.
1233 * Function : rgDBMInsUeCbInRachLst
1236 * @param[in] *cellCb
1241 Void rgDBMInsUeCbInRachLst
1247 Void rgDBMInsUeCbInRachLst(cellCb, ueCb)
1253 cmLListAdd2Tail(&cellCb->raInfo.ueRachLst,&ueCb->rachLstEnt);
1256 } /* rgDBMInsUeCbInRachLst */
1259 * @brief Handler for accessing the existing raCb in the rachLst.
1263 * Function : rgDBMGetUeCbFromRachLst
1266 * @param[in] *cellCb
1271 RgUeCb* rgDBMGetUeCbFromRachLst
1277 RgUeCb* rgDBMGetUeCbFromRachLst(cellCb, key)
1284 CM_LLIST_FIRST_NODE(&cellCb->raInfo.ueRachLst,tmpNode);
1287 if(((RgUeCb *)tmpNode->node)->ueId == key)
1289 return ((RgUeCb *)(tmpNode->node));
1291 CM_LLIST_NEXT_NODE(&cellCb->raInfo.ueRachLst,tmpNode);
1294 } /* rgDBMGetUeCbFromRachLst */
1297 * @brief Handler for accessing the existing ueCb from rachLst.
1301 * Function : rgDBMGetNextUeCbFromRachLst
1304 * @param[in] *cellCb
1309 RgUeCb* rgDBMGetNextUeCbFromRachLst
1315 RgUeCb* rgDBMGetNextUeCbFromRachLst(cellCb, ueCb)
1323 return ( cellCb->raInfo.ueRachLst.first ?
1324 (RgUeCb *)(cellCb->raInfo.ueRachLst.first->node) : NULLP );
1326 return ( ueCb->rachLstEnt.next ?
1327 (RgUeCb *)(ueCb->rachLstEnt.next->node) : NULLP );
1328 } /* rgDBMGetNextUeCbFromRachLst */
1331 * @brief Handler for deleting the existing ueCb in the rachLst.
1335 * Function : rgDBMDelUeCbFromRachLst
1338 * @param[in] *cellCb
1343 Void rgDBMDelUeCbFromRachLst
1349 Void rgDBMDelUeCbFromRachLst(cellCb, ueCb)
1355 cmLListDelFrm(&cellCb->raInfo.ueRachLst, &ueCb->rachLstEnt);
1357 } /* rgDBMDelUeCbFromRachLst */
1359 /**********************************************************************
1362 **********************************************************************/