X-Git-Url: https://gerrit.o-ran-sc.org/r/gitweb?a=blobdiff_plain;f=src%2F5gnrrlc%2Fkw_tmr.c;fp=src%2F5gnrrlc%2Fkw_tmr.c;h=ae6333b7d9bf9ff8943d46876be740036b7acbc7;hb=8d826152497c92097ef9e8b06ef2390e712d0955;hp=dc5c79470f396087259828c2c9f505bc513d6b21;hpb=d75d1b078091768f45b83f2a745a25917e03b39d;p=o-du%2Fl2.git diff --git a/src/5gnrrlc/kw_tmr.c b/src/5gnrrlc/kw_tmr.c index dc5c79470..ae6333b7d 100755 --- a/src/5gnrrlc/kw_tmr.c +++ b/src/5gnrrlc/kw_tmr.c @@ -87,6 +87,7 @@ /* private function declarations */ static Void rlcBndTmrExpiry(PTR cb); +void rlcThptTmrExpiry(PTR cb); /** * @brief Handler to start timer @@ -180,6 +181,14 @@ void rlcStartTmr(RlcCb *gCb, PTR cb, int16_t tmrEvnt) break; } #endif + case EVENT_RLC_THROUGHPUT_TMR: + { + RlcThpt *thptCb = (RlcThpt *)cb; + RLC_TMR_CALCUATE_WAIT(arg.wait, ODU_THROUGHPUT_PRINT_TIME_INTERVAL, gCb->genCfg.timeRes); + arg.timers = &thptCb->thptTmr; + arg.max = RLC_MAX_THPT_TMR; + break; + } default: { DU_LOG("\nERROR --> RLC : rlcStartTmr: Invalid tmr Evnt [%d]", tmrEvnt); @@ -262,6 +271,11 @@ void rlcStopTmr(RlcCb *gCb, PTR cb, uint8_t tmrType) break; } #endif + case EVENT_RLC_THROUGHPUT_TMR: + { + arg.timers = &((RlcThpt *)cb)->thptTmr; + arg.max = RLC_MAX_THPT_TMR; + } default: { DU_LOG("\nERROR --> RLC : rlcStopTmr: Invalid tmr Evnt[%d]", tmrType); @@ -335,7 +349,11 @@ Void rlcTmrExpiry(PTR cb,S16 tmrEvnt) rlcBndTmrExpiry(cb); break; } - /* kw005.201 L2 Measurement support */ + case EVENT_RLC_THROUGHPUT_TMR: + { + rlcThptTmrExpiry(cb); + break; + } default: { break; @@ -385,6 +403,10 @@ bool rlcChkTmr(RlcCb *gCb, PTR cb, int16_t tmrEvnt) { return (((RlcRguSapCb *)cb)->bndTmr.tmrEvnt == EVENT_RLC_WAIT_BNDCFM); } + case EVENT_RLC_THROUGHPUT_TMR: + { + return (((RlcThpt *)cb)->thptTmr.tmrEvnt == EVENT_RLC_THROUGHPUT_TMR); + } default: { DU_LOG("\nERROR --> RLC : rlcChkTmr: Invalid tmr Evnt [%d]", tmrEvnt); @@ -453,6 +475,45 @@ static Void rlcBndTmrExpiry(PTR cb) return; } +/** + * @brief Handler to do processing on expiry of the throughput timer + * + * @details + * This function processes the RLC throughput timer expiry. + * + * @param[in] cb Pointer to the RLC throughput struct + * + * @return Void + */ +void rlcThptTmrExpiry(PTR cb) +{ + uint16_t ueIdx; + long double tpt; + RlcThpt *rlcThptCb = (RlcThpt*)cb; + + /* Print throughput */ + DU_LOG("\n===================== DL Throughput =============================="); + DU_LOG("\nNumber of UEs : %d", rlcThptCb->numActvUe); + for(ueIdx = 0; ueIdx < rlcThptCb->numActvUe; ueIdx++) + { + /* Spec 28.552, section 5.1.1.3 : + * Throughput in kilobits/sec = (dataVol in kiloBits * 1000)/time in milligseconds + * + * Since our dataVol is in bytes, multiplying 0.008 to covert into kilobits i.e. + * Throughput[kbits/sec] = (dataVol * 0.008 * 1000)/time in ms + */ + tpt = (double)(rlcThptCb->thptPerUe[ueIdx].dataVol * 8)/(double)ODU_THROUGHPUT_PRINT_TIME_INTERVAL; + + DU_LOG("\nUE Id : %d DL Tpt : %.2Lf", rlcThptCb->thptPerUe[ueIdx].ueIdx, tpt); + rlcThptCb->thptPerUe[ueIdx].dataVol = 0; + } + DU_LOG("\n=================================================================="); + + /* Restart timer */ + rlcStartTmr(RLC_GET_RLCCB(rlcThptCb->inst), (PTR)rlcThptCb, EVENT_RLC_THROUGHPUT_TMR); + + return; +} /********************************************************************30**