Added code for MAC-PHY interface, DU_APP, F1AP, SCTP and CU stub
[o-du/l2.git] / src / cm / cm_tenb_stats.c
1 /*******************************************************************************
2 ################################################################################
3 #   Copyright (c) [2017-2019] [Radisys]                                        #
4 #                                                                              #
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                                    #
8 #                                                                              #
9 #       http://www.apache.org/licenses/LICENSE-2.0                             #
10 #                                                                              #
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 *******************************************************************************/
18
19 /**********************************************************************
20  
21     Name:  
22  
23     Type:   C include file
24  
25     Desc:   
26  
27     File:  cm_tenb_stats.c
28  
29 **********************************************************************/
30  
31 /** @file cm_tenb_stats.c
32 @brief This file contains 
33 */
34
35 /*
36 *     The defines in this file correspond to structures and variables 
37 *     used by the following TRILLIUM software:
38 *
39 *     part no.             description
40 *     --------     ----------------------------------------------
41 *
42 */
43 /* header include files (.h) */
44   
45 #include "envopt.h"             /* Environment options */  
46 #include "envdep.h"             /* Environment dependent */
47 #include "envind.h"             /* Environment independent */
48 #include "gen.h"                /* General */
49 #include "ssi.h"                /* System services interface */
50 #include "cm_lte.h"             /* Common LTE header file */
51 #include "cm_llist.h"           /* Linked list header file */
52 #include "cm_tkns.h"            /* Common tokens header file */
53
54
55 /* header/extern include files (.x) */
56
57 #include "gen.x"                /* General */
58 #include "ssi.x"                /* System services interface */
59 #include "cm_lib.x"             /* Common lib header file */
60 #include "cm_llist.x"           /* Linked list header file */
61 #include "cm_tkns.x"            /* Common tokens header file */
62 #include "cm_lte.x"             /* Common LTE header file */
63
64 #include "ss_queue.h"
65 #include "ss_queue.x"
66 #include "ss_task.x"
67 #include "ss_msg.x"
68 #include "cm_tenb_stats.x"    /* Total EnodeB Stats declarations */
69
70 #ifdef TENB_STATS
71 PRIVATE Void TSInfUtlPackUeInfo ARGS((
72  Buffer            *mBuf,
73  TSInfL2UeStats     *stats 
74 ));
75 PRIVATE Void TSInfUtlPackCellInfo ARGS((
76  Buffer              *mBuf,
77  TSInfL2CellStats     *stats 
78 ));
79 PRIVATE Void TSInfUtlUnpkUeInfo ARGS((
80  Buffer            *mBuf,
81  TSInfL2UeStats     *stats 
82 ));
83 PRIVATE Void TSInfUtlUnpkCellInfo ARGS((
84  Buffer              *mBuf,
85  TSInfL2CellStats     *stats
86 ));
87 PRIVATE Buffer* TSInfUtlAllocMsg ARGS((
88  Pst   *pst
89 ));
90  
91 /*
92 *
93 *       Fun:   TSInfTrigL2Stats 
94 *
95 *       Desc:  Indicate PDCP UL to initiate Stats procedure 
96 *
97 *       Ret:   
98 *
99 *       Notes: None
100 *
101 *
102 */
103 #ifdef ANSI
104 PRIVATE Void TSInfTrigL2Stats
105 (
106  Region    region,
107  Pool      pool
108 )
109 #else
110 PRIVATE Void TSInfTrigL2Stats(region, pool)
111  Region    region;
112  Pool      pool;
113 #endif
114 {
115    Buffer* pBuf;
116    Pst pst = {0};
117
118    TRC2(TSInfTrigL2Stats)
119
120    SGetMsg(region, pool, &pBuf);
121 //#if defined(SCH_STATS) || defined(TENB_STATS)
122    pst.dstEnt = STATS_DSTENT;
123    pst.dstInst = STATS_DSTINST;
124    pst.selector = CL_DSTENT_SELECTOR;
125
126    pst.srcProcId = STATS_SRCPROCID;
127    pst.dstProcId = STATS_DSTPROCID;
128    pst.srcEnt = STATS_SRCENT;
129    pst.event = TENBSTATSINIT; 
130    SPstTsk(&pst, pBuf);
131
132    RETVOID;
133 }
134
135 /*
136 *
137 *       Fun:   TSInfTrigStats
138 *
139 *       Desc:  Trigger Sending L2 Stats
140 *
141 *       Ret:   
142 *
143 *       Notes: None
144 *
145 *
146 */
147 #ifdef ANSI
148 PUBLIC Void TSInfTrigStats
149 (
150  Region    region,
151  Pool      pool
152 )
153 #else
154 PUBLIC Void TSInfTrigStats(region, pool)
155  Region    region;
156  Pool      pool;
157 #endif
158 {
159    TRC2(TSInfTrigStats)
160 //TODO
161    TSInfTrigL2Stats(region, pool);
162
163    RETVOID;
164 }
165
166          
167 #ifdef ANSI
168 PRIVATE Buffer* TSInfUtlAllocMsg
169 (
170  Pst   *pst
171 )
172 #else
173 PRIVATE Buffer* TSInfUtlAllocMsg(pst)
174  Pst   *pst;
175 #endif
176 {
177    Buffer *mBuf; 
178
179    TRC2(TSInfUtlAllocMsg)
180
181    if (SGetMsg(pst->region, pst->pool, &mBuf) != ROK) {
182       printf("\n MBuf Allocation failed\n");
183    }
184    RETVALUE(mBuf);
185 }
186
187 #ifdef ANSI
188 PRIVATE Void TSInfUtlPackUeInfo
189 (
190  Buffer            *mBuf,
191  TSInfL2UeStats     *stats
192 )
193 #else
194 PRIVATE Void TSInfUtlPackUeInfo(mBuf, stats)
195  Buffer            *mBuf;
196  TSInfL2UeStats     *stats; 
197 #endif
198 {
199    S32 i;
200    U32 k;
201
202    TRC2(TSInfUtlPackUeInfo)
203
204    CMCHKPK(SPkU32, stats->persistent.numDeactivation, mBuf);
205    CMCHKPK(SPkU32, stats->persistent.numActivation, mBuf);
206    CMCHKPK(SPkU32, stats->persistent.activatedSCells, mBuf);
207
208    CMCHKPK(SPkU32, stats->nonPersistent.rlc.dlMaxWindowSz, mBuf);
209    CMCHKPK(SPkU32, stats->nonPersistent.rlc.dlMaxPktsInSduQ, mBuf);
210    CMCHKPK(SPkU32, stats->nonPersistent.rlc.ulReOdrTmrExpCnt, mBuf);
211
212    CMCHKPK(SPkU32, stats->nonPersistent.pdcp.dlFlowCtrlDropCnt, mBuf);
213    CMCHKPK(SPkU32, stats->nonPersistent.pdcp.dlPdcpAckWaitDropCnt, mBuf);
214    CMCHKPK(SPkU32, stats->nonPersistent.pdcp.dlPdcpDropCnt, mBuf);
215
216
217    for (k = 0; k < L2_STATS_MAX_CELLS; k++)
218    {
219       CMCHKPK(SPkU32, stats->nonPersistent.sch[k].ulTpt, mBuf);
220       CMCHKPK(SPkU32, stats->nonPersistent.sch[k].ulNumiTbs, mBuf);
221       CMCHKPK(SPkU32, stats->nonPersistent.sch[k].ulSumiTbs, mBuf);
222       CMCHKPK(SPkU32, stats->nonPersistent.sch[k].ulNumCqi, mBuf);
223       CMCHKPK(SPkU32, stats->nonPersistent.sch[k].ulSumCqi, mBuf);
224       CMCHKPK(SPkU32, stats->nonPersistent.sch[k].ulDtxCnt, mBuf);
225       CMCHKPK(SPkU32, stats->nonPersistent.sch[k].ulNackCnt, mBuf);
226       CMCHKPK(SPkU32, stats->nonPersistent.sch[k].ulAckNackCnt, mBuf);
227       CMCHKPK(SPkU32, stats->nonPersistent.sch[k].ulPrbUsg, mBuf);
228       CMCHKPK(SPkU32, stats->nonPersistent.sch[k].ulRetxOccns, mBuf);
229       CMCHKPK(SPkU32, stats->nonPersistent.sch[k].ulTxOccns, mBuf);
230       CMCHKPK(SPkU32, stats->nonPersistent.sch[k].dlTpt, mBuf);
231       CMCHKPK(SPkU32, stats->nonPersistent.sch[k].dlBo, mBuf);
232       for (i=0; i<4; i++)
233       {
234          CMCHKPK(SPkU32, stats->nonPersistent.sch[k].riCnt[i], mBuf);
235       }
236       for (i=0; i<5; i++)
237       {
238          CMCHKPK(SPkU32, stats->nonPersistent.sch[k].dlPdbLvl[i], mBuf);
239       }
240       CMCHKPK(SPkU32, stats->nonPersistent.sch[k].cqiDropCnt, mBuf);
241       CMCHKPK(SPkU32, stats->nonPersistent.sch[k].dlNumCw1iTbs, mBuf);
242       CMCHKPK(SPkU32, stats->nonPersistent.sch[k].dlSumCw1iTbs, mBuf);
243       CMCHKPK(SPkU32, stats->nonPersistent.sch[k].dlNumCw0iTbs, mBuf);
244       CMCHKPK(SPkU32, stats->nonPersistent.sch[k].dlSumCw0iTbs, mBuf);
245       CMCHKPK(SPkU32, stats->nonPersistent.sch[k].dlNumCw1Cqi, mBuf);
246       CMCHKPK(SPkU32, stats->nonPersistent.sch[k].dlSumCw1Cqi, mBuf);
247       CMCHKPK(SPkU32, stats->nonPersistent.sch[k].dlNumCw0Cqi, mBuf);
248       CMCHKPK(SPkU32, stats->nonPersistent.sch[k].dlSumCw0Cqi, mBuf);
249       for (i=0; i<2; i++)
250       {
251          CMCHKPK(SPkU32, stats->nonPersistent.sch[k].dlDtxCnt[i], mBuf);
252       }
253       for (i=0; i<2; i++)
254       {
255          CMCHKPK(SPkU32, stats->nonPersistent.sch[k].dlAckNackCnt[i], mBuf);
256       }
257       for (i=0; i<2; i++)
258       {
259          CMCHKPK(SPkU32, stats->nonPersistent.sch[k].dlNackCnt[i], mBuf);
260       }
261       CMCHKPK(SPkU32, stats->nonPersistent.sch[k].dlPrbUsg, mBuf);
262       CMCHKPK(SPkU32, stats->nonPersistent.sch[k].dlRetxOccns, mBuf);
263       CMCHKPK(SPkU32, stats->nonPersistent.sch[k].dlTxOccns, mBuf);
264    }
265    CMCHKPK(SPkU32, stats->rnti, mBuf);
266    RETVOID;
267 }
268
269 #ifdef ANSI
270 PRIVATE Void TSInfUtlPackCellInfo
271 (
272  Buffer              *mBuf,
273  TSInfL2CellStats     *stats  
274 )
275 #else
276 PRIVATE Void TSInfUtlPackCellInfo(mBuf, stats)
277  Buffer              *mBuf;
278  TSInfL2CellStats     *stats; 
279 #endif
280 {
281    S32 i,j;
282
283    TRC2(TSInfUtlPackCellInfo)
284
285    CMCHKPK(SPkU32, stats->rlc.reOdrTmrExp, mBuf);
286    CMCHKPK(SPkU32, stats->rlc.maxRlcDrbRetxFail, mBuf);
287    CMCHKPK(SPkU32, stats->rlc.maxRlcSrbRetxFail, mBuf);
288
289    CMCHKPK(SPkU32, stats->sch.ulNumiTbs, mBuf);
290    CMCHKPK(SPkU32, stats->sch.ulSumiTbs, mBuf);
291    CMCHKPK(SPkU32, stats->sch.ulNumCqi, mBuf);
292    CMCHKPK(SPkU32, stats->sch.ulSumCqi, mBuf);
293 #ifdef RG_5GTF
294    CMCHKPK(SPkU32, stats->sch.ul5gtfRbAllocFail, mBuf);
295    CMCHKPK(SPkU32, stats->sch.ul5gtfPdcchSend, mBuf);
296    CMCHKPK(SPkU32, stats->sch.ul5gtfUeFnlzReAdd, mBuf);
297    CMCHKPK(SPkU32, stats->sch.ul5gtfUeRmvFnlzZeroBo, mBuf);
298    CMCHKPK(SPkU32, stats->sch.ul5gtfUeRbAllocDone, mBuf);
299    CMCHKPK(SPkU32, stats->sch.ul5gtfAllocAllocated, mBuf);
300    CMCHKPK(SPkU32, stats->sch.ul5gtfPdcchSchd, mBuf);
301    CMCHKPK(SPkU32, stats->sch.ul5gtfUeSchPick, mBuf);
302    CMCHKPK(SPkU32, stats->sch.ul5gtfBsrRecv, mBuf);
303    CMCHKPK(SPkU32, stats->sch.ul5gtfSrRecv, mBuf);
304
305    CMCHKPK(SPkU32, stats->sch.dl5gtfPdschCons, mBuf);
306    CMCHKPK(SPkU32, stats->sch.dl5gtfPdcchSend, mBuf);
307    CMCHKPK(SPkU32, stats->sch.dl5gtfBoUpd, mBuf);
308    CMCHKPK(SPkU32, stats->sch.dl5gtfFnlzFail, mBuf);
309    CMCHKPK(SPkU32, stats->sch.dl5gtfFnlzPass, mBuf);
310    CMCHKPK(SPkU32, stats->sch.dl5gtfRbAllocFail, mBuf);
311    CMCHKPK(SPkU32, stats->sch.dl5gtfRbAllocPass, mBuf);
312    CMCHKPK(SPkU32, stats->sch.dl5gtfUePick, mBuf);
313 #endif
314    CMCHKPK(SPkU32, stats->sch.cntTtiProcTime500, mBuf);
315    CMCHKPK(SPkU32, stats->sch.cntTtiProcTime600, mBuf);
316    CMCHKPK(SPkU32, stats->sch.cntTtiProcTime700, mBuf);
317    CMCHKPK(SPkU32, stats->sch.cntTtiProcTime800, mBuf);
318    CMCHKPK(SPkU32, stats->sch.cntTtiProcTime900, mBuf);
319    CMCHKPK(SPkU32, stats->sch.cntTtiProcTime1000, mBuf);
320    CMCHKPK(SPkU32, stats->sch.avgTtiProcTime, mBuf);
321    for (i=9; i>=0; i--)
322    {
323       CMCHKPK(SPkU32, stats->sch.dlPdbRatio[i], mBuf);
324    }
325    for (i=9; i>=0; i--)
326    {
327       CMCHKPK(SPkU32, stats->sch.ulPrbUsage[i], mBuf);
328    }
329    for (i=9; i>=0; i--)
330    {
331       CMCHKPK(SPkU32, stats->sch.dlPrbUsage[i], mBuf);
332    }
333    for (i=3; i>=0; i--)
334    {
335       CMCHKPK(SPkU32, stats->sch.ulDtx[i], mBuf);
336    }
337    for (i=3; i>=0; i--)
338    {
339       CMCHKPK(SPkU32, stats->sch.ulAckNack[i], mBuf);
340    }
341    for (i=3; i>=0; i--)
342    {
343       CMCHKPK(SPkU32, stats->sch.ulNack[i], mBuf);
344    }
345    for (i=1; i>=0; i--)
346    {
347       for (j=3; j>=0; j--)
348       {
349          CMCHKPK(SPkU32, stats->sch.dlDtx[i][j], mBuf);
350       }
351    }
352    for (i=1; i>=0; i--)
353    {
354       for (j=3; j>=0; j--)
355       {
356          CMCHKPK(SPkU32, stats->sch.dlAckNack[i][j], mBuf);
357       }
358    }
359    for (i=1; i>=0; i--)
360    {
361       for (j=3; j>=0; j--)
362       {
363          CMCHKPK(SPkU32, stats->sch.dlNack[i][j], mBuf);
364       }
365    }
366    for (i=3; i>=0; i--)
367    {
368       CMCHKPK(SPkU32, stats->sch.riCnt[i], mBuf);
369    }
370    CMCHKPK(SPkU32, stats->sch.dlNumCw1iTbs, mBuf);
371    CMCHKPK(SPkU32, stats->sch.dlSumCw1iTbs, mBuf);
372    CMCHKPK(SPkU32, stats->sch.dlNumCw0iTbs, mBuf);
373    CMCHKPK(SPkU32, stats->sch.dlSumCw0iTbs, mBuf);
374    CMCHKPK(SPkU32, stats->sch.dlNumCw1Cqi, mBuf);
375    CMCHKPK(SPkU32, stats->sch.dlSumCw1Cqi, mBuf);
376    CMCHKPK(SPkU32, stats->sch.dlNumCw0Cqi, mBuf);
377    CMCHKPK(SPkU32, stats->sch.dlSumCw0Cqi, mBuf);
378    CMCHKPK(SPkU32, stats->sch.msg3Fail, mBuf);
379    CMCHKPK(SPkU32, stats->sch.msg4Fail, mBuf);
380
381    CMCHKPK(SPkU32, stats->cellId, mBuf);
382
383    RETVOID;
384 }
385
386 #ifdef ANSI
387 PRIVATE Void TSInfUtlUnpkUeInfo
388 (
389  Buffer            *mBuf,
390  TSInfL2UeStats     *stats 
391 )
392 #else
393 PRIVATE Void TSInfUtlUnpkUeInfo(mBuf, stats)
394  Buffer            *mBuf;
395  TSInfL2UeStats     *stats; 
396 #endif
397 {
398    S32 i;
399    U32 k;
400
401    TRC2(TSInfUtlUnpkUeInfo)
402
403    CMCHKUNPK(SUnpkU32, &stats->rnti, mBuf);
404
405    for (k = L2_STATS_MAX_CELLS; k > 0; k--)
406    {
407       CMCHKUNPK(SUnpkU32, &stats->nonPersistent.sch[k-1].dlTxOccns, mBuf);
408       CMCHKUNPK(SUnpkU32, &stats->nonPersistent.sch[k-1].dlRetxOccns, mBuf);
409       CMCHKUNPK(SUnpkU32, &stats->nonPersistent.sch[k-1].dlPrbUsg, mBuf);
410       for (i=1; i>=0; i--)
411       {
412          CMCHKUNPK(SUnpkU32, &stats->nonPersistent.sch[k-1].dlNackCnt[i], mBuf);
413       }
414       for (i=1; i>=0; i--)
415       {
416          CMCHKUNPK(SUnpkU32, &stats->nonPersistent.sch[k-1].dlAckNackCnt[i], mBuf);
417       }
418       for (i=1; i>=0; i--)
419       {
420          CMCHKUNPK(SUnpkU32, &stats->nonPersistent.sch[k-1].dlDtxCnt[i], mBuf);
421       }
422       CMCHKUNPK(SUnpkU32, &stats->nonPersistent.sch[k-1].dlSumCw0Cqi, mBuf);
423       CMCHKUNPK(SUnpkU32, &stats->nonPersistent.sch[k-1].dlNumCw0Cqi, mBuf);
424       CMCHKUNPK(SUnpkU32, &stats->nonPersistent.sch[k-1].dlSumCw1Cqi, mBuf);
425       CMCHKUNPK(SUnpkU32, &stats->nonPersistent.sch[k-1].dlNumCw1Cqi, mBuf);
426       CMCHKUNPK(SUnpkU32, &stats->nonPersistent.sch[k-1].dlSumCw0iTbs, mBuf);
427       CMCHKUNPK(SUnpkU32, &stats->nonPersistent.sch[k-1].dlNumCw0iTbs, mBuf);
428       CMCHKUNPK(SUnpkU32, &stats->nonPersistent.sch[k-1].dlSumCw1iTbs, mBuf);
429       CMCHKUNPK(SUnpkU32, &stats->nonPersistent.sch[k-1].dlNumCw1iTbs, mBuf);
430       CMCHKUNPK(SUnpkU32, &stats->nonPersistent.sch[k-1].cqiDropCnt, mBuf);
431       for (i=4; i>=0; i--)
432       {
433          CMCHKUNPK(SUnpkU32, &stats->nonPersistent.sch[k-1].dlPdbLvl[i], mBuf);
434       }
435       for (i=3; i>=0; i--)
436       {
437          CMCHKUNPK(SUnpkU32, &stats->nonPersistent.sch[k-1].riCnt[i], mBuf);
438       }
439       CMCHKUNPK(SUnpkU32, &stats->nonPersistent.sch[k-1].dlBo, mBuf);
440       CMCHKUNPK(SUnpkU32, &stats->nonPersistent.sch[k-1].dlTpt, mBuf);
441       CMCHKUNPK(SUnpkU32, &stats->nonPersistent.sch[k-1].ulTxOccns, mBuf);
442       CMCHKUNPK(SUnpkU32, &stats->nonPersistent.sch[k-1].ulRetxOccns, mBuf);
443       CMCHKUNPK(SUnpkU32, &stats->nonPersistent.sch[k-1].ulPrbUsg, mBuf);
444       CMCHKUNPK(SUnpkU32, &stats->nonPersistent.sch[k-1].ulAckNackCnt, mBuf);
445       CMCHKUNPK(SUnpkU32, &stats->nonPersistent.sch[k-1].ulNackCnt, mBuf);
446       CMCHKUNPK(SUnpkU32, &stats->nonPersistent.sch[k-1].ulDtxCnt, mBuf);
447       CMCHKUNPK(SUnpkU32, &stats->nonPersistent.sch[k-1].ulSumCqi, mBuf);
448       CMCHKUNPK(SUnpkU32, &stats->nonPersistent.sch[k-1].ulNumCqi, mBuf);
449       CMCHKUNPK(SUnpkU32, &stats->nonPersistent.sch[k-1].ulSumiTbs, mBuf);
450       CMCHKUNPK(SUnpkU32, &stats->nonPersistent.sch[k-1].ulNumiTbs, mBuf);
451       CMCHKUNPK(SUnpkU32, &stats->nonPersistent.sch[k-1].ulTpt, mBuf);
452    }
453
454    CMCHKUNPK(SUnpkU32, &stats->nonPersistent.pdcp.dlPdcpDropCnt, mBuf);
455    CMCHKUNPK(SUnpkU32, &stats->nonPersistent.pdcp.dlPdcpAckWaitDropCnt, mBuf);
456    CMCHKUNPK(SUnpkU32, &stats->nonPersistent.pdcp.dlFlowCtrlDropCnt, mBuf);
457
458    CMCHKUNPK(SUnpkU32, &stats->nonPersistent.rlc.ulReOdrTmrExpCnt, mBuf);
459    CMCHKUNPK(SUnpkU32, &stats->nonPersistent.rlc.dlMaxPktsInSduQ, mBuf);
460    CMCHKUNPK(SUnpkU32, &stats->nonPersistent.rlc.dlMaxWindowSz, mBuf);
461
462    CMCHKUNPK(SUnpkU32, &stats->persistent.activatedSCells, mBuf);
463    CMCHKUNPK(SUnpkU32, &stats->persistent.numActivation, mBuf);
464    CMCHKUNPK(SUnpkU32, &stats->persistent.numDeactivation, mBuf);
465
466    RETVOID;
467 }
468
469 #ifdef ANSI
470 PRIVATE Void TSInfUtlUnpkCellInfo
471 (
472  Buffer              *mBuf,
473  TSInfL2CellStats     *stats 
474 )
475 #else
476 PRIVATE Void TSInfUtlUnpkCellInfo(mBuf, stats)
477  Buffer              *mBuf;
478  TSInfL2CellStats     *stats; 
479 #endif
480 {
481    S32 i,j;
482
483    TRC2(TSInfUtlUnpkCellInfo)
484
485       CMCHKUNPK(SUnpkU32, &stats->cellId, mBuf);
486
487    CMCHKUNPK(SUnpkU32, &stats->sch.msg4Fail, mBuf);
488    CMCHKUNPK(SUnpkU32, &stats->sch.msg3Fail, mBuf);
489    CMCHKUNPK(SUnpkU32, &stats->sch.dlSumCw0Cqi, mBuf);
490    CMCHKUNPK(SUnpkU32, &stats->sch.dlNumCw0Cqi, mBuf);
491    CMCHKUNPK(SUnpkU32, &stats->sch.dlSumCw1Cqi, mBuf);
492    CMCHKUNPK(SUnpkU32, &stats->sch.dlNumCw1Cqi, mBuf);
493    CMCHKUNPK(SUnpkU32, &stats->sch.dlSumCw0iTbs, mBuf);
494    CMCHKUNPK(SUnpkU32, &stats->sch.dlNumCw0iTbs, mBuf);
495    CMCHKUNPK(SUnpkU32, &stats->sch.dlSumCw1iTbs, mBuf);
496    CMCHKUNPK(SUnpkU32, &stats->sch.dlNumCw1iTbs, mBuf);
497    for (i=0; i<4; i++)
498    {
499       CMCHKUNPK(SUnpkU32, &stats->sch.riCnt[i], mBuf);
500    }
501    for (i=0; i<2; i++)
502    {
503       for (j=0; j<4; j++)
504       {
505          CMCHKUNPK(SUnpkU32, &stats->sch.dlNack[i][j], mBuf);
506       }
507    }
508    for (i=0; i<2; i++)
509    {
510       for (j=0; j<4; j++)
511       {
512          CMCHKUNPK(SUnpkU32, &stats->sch.dlAckNack[i][j], mBuf);
513       }
514    }
515    for (i=0; i<2; i++)
516    {
517       for (j=0; j<4; j++)
518       {
519          CMCHKUNPK(SUnpkU32, &stats->sch.dlDtx[i][j], mBuf);
520       }
521    }
522    for (i=0; i<4; i++)
523    {
524       CMCHKUNPK(SUnpkU32, &stats->sch.ulNack[i], mBuf);
525    }
526    for (i=0; i<4; i++)
527    {
528       CMCHKUNPK(SUnpkU32, &stats->sch.ulAckNack[i], mBuf);
529    }
530    for (i=0; i<4; i++)
531    {
532       CMCHKUNPK(SUnpkU32, &stats->sch.ulDtx[i], mBuf);
533    }
534    for (i=0; i<10; i++)
535    {
536       CMCHKUNPK(SUnpkU32, &stats->sch.dlPrbUsage[i], mBuf);
537    }
538    for (i=0; i<10; i++)
539    {
540       CMCHKUNPK(SUnpkU32, &stats->sch.ulPrbUsage[i], mBuf);
541    }
542    for (i=0; i<10; i++)
543    {
544       CMCHKUNPK(SUnpkU32, &stats->sch.dlPdbRatio[i], mBuf);
545    }
546    CMCHKUNPK(SUnpkU32, &stats->sch.avgTtiProcTime, mBuf);
547    CMCHKUNPK(SUnpkU32, &stats->sch.cntTtiProcTime1000, mBuf);
548    CMCHKUNPK(SUnpkU32, &stats->sch.cntTtiProcTime900, mBuf);
549    CMCHKUNPK(SUnpkU32, &stats->sch.cntTtiProcTime800, mBuf);
550    CMCHKUNPK(SUnpkU32, &stats->sch.cntTtiProcTime700, mBuf);
551    CMCHKUNPK(SUnpkU32, &stats->sch.cntTtiProcTime600, mBuf);
552    CMCHKUNPK(SUnpkU32, &stats->sch.cntTtiProcTime500, mBuf);
553 #ifdef RG_5GTF
554    CMCHKUNPK(SUnpkU32, &stats->sch.dl5gtfUePick, mBuf);
555    CMCHKUNPK(SUnpkU32, &stats->sch.dl5gtfRbAllocPass, mBuf);
556    CMCHKUNPK(SUnpkU32, &stats->sch.dl5gtfRbAllocFail, mBuf);
557    CMCHKUNPK(SUnpkU32, &stats->sch.dl5gtfFnlzPass, mBuf);
558    CMCHKUNPK(SUnpkU32, &stats->sch.dl5gtfFnlzFail, mBuf);
559    CMCHKUNPK(SUnpkU32, &stats->sch.dl5gtfBoUpd, mBuf);
560    CMCHKUNPK(SUnpkU32, &stats->sch.dl5gtfPdcchSend, mBuf);
561    CMCHKUNPK(SUnpkU32, &stats->sch.dl5gtfPdschCons, mBuf);
562
563    CMCHKUNPK(SUnpkU32, &stats->sch.ul5gtfSrRecv, mBuf);
564    CMCHKUNPK(SUnpkU32, &stats->sch.ul5gtfBsrRecv, mBuf);
565    CMCHKUNPK(SUnpkU32, &stats->sch.ul5gtfUeSchPick, mBuf);
566    CMCHKUNPK(SUnpkU32, &stats->sch.ul5gtfPdcchSchd, mBuf);
567    CMCHKUNPK(SUnpkU32, &stats->sch.ul5gtfAllocAllocated, mBuf);
568    CMCHKUNPK(SUnpkU32, &stats->sch.ul5gtfUeRbAllocDone, mBuf);
569    CMCHKUNPK(SUnpkU32, &stats->sch.ul5gtfUeRmvFnlzZeroBo, mBuf);
570    CMCHKUNPK(SUnpkU32, &stats->sch.ul5gtfUeFnlzReAdd, mBuf);
571    CMCHKUNPK(SUnpkU32, &stats->sch.ul5gtfPdcchSend, mBuf);
572    CMCHKUNPK(SUnpkU32, &stats->sch.ul5gtfRbAllocFail, mBuf);
573 #endif
574    CMCHKUNPK(SUnpkU32, &stats->sch.ulSumCqi, mBuf);
575    CMCHKUNPK(SUnpkU32, &stats->sch.ulNumCqi, mBuf);
576    CMCHKUNPK(SUnpkU32, &stats->sch.ulSumiTbs, mBuf);
577    CMCHKUNPK(SUnpkU32, &stats->sch.ulNumiTbs, mBuf);
578
579    CMCHKUNPK(SUnpkU32, &stats->rlc.maxRlcSrbRetxFail, mBuf);
580    CMCHKUNPK(SUnpkU32, &stats->rlc.maxRlcDrbRetxFail, mBuf);
581    CMCHKUNPK(SUnpkU32, &stats->rlc.reOdrTmrExp, mBuf);
582
583    RETVOID;
584 }
585
586 #ifdef ANSI
587 PUBLIC Void TSInfPkSndL2UeStats
588 (
589  Pst               *pst,
590  SuId              suId,
591  TSInfL2UeStats     *stats  
592 )
593 #else
594 PUBLIC Void TSInfPkSndL2UeStats(pst, suId, stats)
595  Pst               *pst;
596  SuId              suId;
597  TSInfL2UeStats     *stats;
598 #endif
599 {
600    Buffer *mBuf;
601
602    TRC2(TSInfPkSndL2UeStats)
603
604    mBuf = TSInfUtlAllocMsg(pst);
605    TSInfUtlPackUeInfo(mBuf, stats);
606    SPkS16(suId, mBuf);
607    pst->event = (Event) EVTTENBL2UESTATS;
608    SPstTsk(pst, mBuf);
609    RETVOID;
610 }
611
612 #ifdef ANSI
613 PUBLIC Void TSInfUnpkL2UeStats
614 (
615  TSInfL2UeStatsInd   func,
616  Pst                *pst,
617  Buffer             *mBuf
618 )
619 #else
620 PUBLIC Void TSInfUnpkL2UeStats(func, pst, mBuf)
621  TSInfL2UeStatsInd   func;
622  Pst                *pst;
623  Buffer             *mBuf;
624 #endif
625 {
626    SuId              suId;
627    TSInfL2UeStats     stats; 
628
629    TRC2(TSInfUnpkL2UeStats)
630
631    SUnpkS16(&suId, mBuf);
632    TSInfUtlUnpkUeInfo(mBuf, &stats);
633    SPutMsg(mBuf);
634    (*func)(pst, suId, &stats);
635    RETVOID;
636 }
637
638 #ifdef ANSI
639 PUBLIC Void TSInfPkSndL2CellStats
640 (
641  Pst                 *pst,
642  SuId                suId,
643  TSInfL2CellStats   *stats 
644 )
645 #else
646 PUBLIC Void TSInfPkSndL2CellStats(pst, suId, stats)
647  Pst                 *pst;
648  SuId                suId;
649  TSInfL2Cellstats   *stats;
650 #endif
651 {
652    Buffer *mBuf;
653
654    TRC2(TSInfPkSndL2CellStats)
655
656    mBuf = TSInfUtlAllocMsg(pst);
657    TSInfUtlPackCellInfo(mBuf, stats);
658    SPkS16(suId, mBuf);
659    pst->event = (Event) EVTTENBL2CELLSTATS;
660    SPstTsk(pst, mBuf);
661    RETVOID;
662 }
663
664 #ifdef ANSI
665 PUBLIC Void TSInfUnpkL2CellStats
666 (
667  TSInfL2CellStatsInd   func,
668  Pst                *pst,
669  Buffer             *mBuf
670 )
671 #else
672 PUBLIC Void TSInfUnpkL2CellStats(func, pst, mBuf)
673  TSInfL2CellStatsInd   func;
674  Pst                *pst;
675  Buffer             *mBuf;
676 #endif
677 {
678    SuId                suId;
679    TSInfL2CellStats    stats; 
680
681    TRC2(TSInfUnpkL2CellStats)
682
683    SUnpkS16(&suId, mBuf);
684    TSInfUtlUnpkCellInfo(mBuf, &stats);
685    SPutMsg(mBuf);
686    (*func)(pst, suId, &stats);
687    RETVOID;
688 }
689 #endif /* TENB_STATS */
690
691 /**********************************************************************
692          End of file
693  **********************************************************************/