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 /**********************************************************************
29 **********************************************************************/
31 /* header (.h) include files */
32 #include "common_def.h"
33 #include "lkw.h" /* LKW defines */
34 #include "ckw.h" /* CKW defines */
35 #include "kwu.h" /* KWU defines */
36 #include "rgu.h" /* RGU defines */
37 #include "rlc_err.h" /* RLC error options */
38 #include "rlc_env.h" /* RLC environment options */
40 /* extern (.x) include files */
41 #include "lkw.x" /* LKW */
42 #include "ckw.x" /* CKW */
43 #include "kwu.x" /* KWU */
44 #include "rgu.x" /* RGU */
47 #include "l2_tenb_stats.x" /* Total EnodeB Stats declarations */
50 #include "rlc_utils.h" /* RLC defines */
54 TSL2CellStatsCb* l2CellStats[L2_STATS_MAX_CELLS];
55 TSL2UeStatsCb* l2UeStats[L2_STATS_MAX_UES];
56 CmLListCp freeL2UeStatsLst; /*!< Free Pool of UE stats Blocks */
57 CmLListCp inUseL2UeStatsLst;/*!< In Use Pool of UE stats Blocks */
61 * Fun: TSL2AllocStatsMem
63 * Desc: Pre-Allocate Memory for L2 stats BLOCKs
71 Void TSL2AllocStatsMem(Inst inst)
76 gCb = RLC_GET_RLCCB(inst);
77 cmLListInit(&inUseL2UeStatsLst);
78 cmLListInit(&freeL2UeStatsLst);
79 for (cnt=0; cnt < L2_STATS_MAX_CELLS; cnt++)
81 if(NULL == l2CellStats[cnt])
83 RLC_ALLOC(gCb, l2CellStats[cnt], (Size)sizeof (TSL2CellStatsCb));
84 if(l2CellStats[cnt] == NULL)
86 DU_LOG("\nERROR --> RLC : STATS Unexpected MEM Alloc Failure\n");
89 memset(l2CellStats[cnt], 0x00, sizeof(TSL2CellStatsCb));
92 for (cnt=0; cnt < L2_STATS_MAX_UES; cnt++)
94 TSL2UeStatsCb *statsCb = l2UeStats[cnt];
97 RLC_ALLOC(gCb, statsCb, (Size)sizeof (TSL2UeStatsCb));
100 DU_LOG("\nERROR --> RLC : STATS Unexpected MEM Alloc Failure at %d\n", (int)cnt);
103 memset(statsCb, 0x00, sizeof(TSL2UeStatsCb));
104 statsCb->lnk.node = (PTR)statsCb;
105 cmLListAdd2Tail(&freeL2UeStatsLst, &statsCb->lnk);
106 l2UeStats[cnt] = statsCb;
114 * Fun: TSL2AllocUeStatsBlk
116 * Desc: Assign Stats Block for this UE[RNTI]
124 TSL2UeStatsCb* TSL2AllocUeStatsBlk (uint16_t rnti)
126 CmLList *tmp = NULLP;
127 TSL2UeStatsCb *statsCb = NULLP;
129 tmp = freeL2UeStatsLst.first;
132 DU_LOG("\nERROR --> RLC : STATS Unexpected Mem BLK unavailable for UE %d\n", rnti);
134 cmLListDelFrm(&freeL2UeStatsLst, tmp);
135 statsCb = (TSL2UeStatsCb *)(tmp->node);
136 cmLListAdd2Tail(&inUseL2UeStatsLst, tmp);
138 statsCb->stats.rnti = (uint32_t)rnti;
139 statsCb->inUse = TRUE;
146 * Fun: TSL2DeallocUeStatsBlk
148 * Desc: Deassign Stats Block for this UE[RNTI]
156 Void TSL2DeallocUeStatsBlk(uint16_t rnti,TSL2UeStatsCb *statsCb)
158 statsCb->inUse = FALSE;
159 cmLListDelFrm(&inUseL2UeStatsLst, &statsCb->lnk);
160 freeL2UeStatsLst.crnt = freeL2UeStatsLst.first;
161 cmLListInsAfterCrnt(&freeL2UeStatsLst, &statsCb->lnk);
168 * Fun: TSL2AllocCellStatsBlk
170 * Desc: Assign Stats Block for this CELL[CELLID]
178 TSL2CellStatsCb* TSL2AllocCellStatsBlk(uint32_t cellId)
182 DU_LOG("\nERROR --> RLC : STATS Unexpected CellID = %d\n", (int)cellId);
185 return (l2CellStats[cellId-1]);
190 * Fun: TSL2DeallocCellStatsBlk
192 * Desc: Deassign Stats Block for this CELL[CELLID]
200 Void TSL2DeallocCellStatsBlk(uint32_t cellId)
208 * Fun: TSL2SendStatsToApp
210 * Desc: Collates and Sends STATS to Application
211 * Send UE STATS first. 10 UEs are grouped in one message.
212 * Followed by CELL Stats. All CELLS are grouped in one msg.
213 * At Reception of CELL stats APP assumes STATS reception cycle is complete.
221 Void TSL2SendStatsToApp(Pst *pst, SuId suId)
225 for (idx = 0; idx < L2_STATS_MAX_UES; idx++)
227 TSL2UeStatsCb *statsCb = l2UeStats[idx];
229 if (statsCb->inUse != TRUE)
233 if (pst->selector == 0)
236 TSInfPkSndL2UeStats(pst, suId, &statsCb->stats);
242 TSInfHdlL2UeStatsInd(pst, suId, &statsCb->stats);
245 rnti = statsCb->stats.rnti;
246 memset(&statsCb->stats.nonPersistent, 0x00, sizeof(statsCb->stats.nonPersistent));
247 /* memset(&statsCb->stats, 0x00, sizeof(TSInfL2UeStats)); */
248 statsCb->stats.rnti = rnti;
251 /* Allocate mBuf for CELLSTATS */
252 for (idx = 0; idx < L2_STATS_MAX_CELLS; idx++)
254 TSL2CellStatsCb *statsCellCb = l2CellStats[idx];
256 if (pst->selector == 0)
259 TSInfPkSndL2CellStats(pst, suId, l2CellStats[idx]);
265 TSInfHdlL2CellStatsInd(pst, suId, l2CellStats[idx]);
268 cellId = statsCellCb->cellId;
269 memset(l2CellStats[idx], 0x00, sizeof(TSInfL2CellStats));
270 statsCellCb->cellId = cellId;
274 #endif /* TENB_STATS */
275 /**********************************************************************
277 **********************************************************************/