break;
}
#endif
- case EVENT_RLC_THROUGHPUT_TMR:
+ case EVENT_RLC_UE_THROUGHPUT_TMR:
{
RlcThpt *thptCb = (RlcThpt *)cb;
- RLC_TMR_CALCUATE_WAIT(arg.wait, ODU_THROUGHPUT_PRINT_TIME_INTERVAL, gCb->genCfg.timeRes);
- arg.timers = &thptCb->thptTmr;
+ RLC_TMR_CALCUATE_WAIT(arg.wait, ODU_UE_THROUGHPUT_PRINT_TIME_INTERVAL, gCb->genCfg.timeRes);
+ arg.timers = &thptCb->ueTputInfo.ueThptTmr;
arg.max = RLC_MAX_THPT_TMR;
break;
}
arg.max = RLC_MAX_UE_TMR;
break;
}
+ case EVENT_RLC_SNSSAI_THROUGHPUT_TMR:
+ {
+ RlcThpt *thptCb = (RlcThpt *)cb;
+ RLC_TMR_CALCUATE_WAIT(arg.wait, ODU_SNSSAI_THROUGHPUT_PRINT_TIME_INTERVAL, gCb->genCfg.timeRes);
+ arg.timers = &thptCb->snssaiTputInfo.snssaiThptTmr;
+ arg.max = RLC_MAX_THPT_TMR;
+ break;
+ }
default:
{
DU_LOG("\nERROR --> RLC : rlcStartTmr: Invalid tmr Evnt [%d]", tmrEvnt);
break;
}
#endif
- case EVENT_RLC_THROUGHPUT_TMR:
+ case EVENT_RLC_UE_THROUGHPUT_TMR:
{
- arg.timers = &((RlcThpt *)cb)->thptTmr;
+ arg.timers = &((RlcThpt *)cb)->ueTputInfo.ueThptTmr;
arg.max = RLC_MAX_THPT_TMR;
+ break;
}
case EVENT_RLC_UE_DELETE_TMR:
{
arg.timers = &((RlcUlUeCb*)cb)->ueDeleteInfo.ueDelTmr;
arg.max = EVENT_RLC_UE_DELETE_TMR;
+ break;
+ }
+ case EVENT_RLC_SNSSAI_THROUGHPUT_TMR:
+ {
+ arg.timers = &((RlcThpt *)cb)->snssaiTputInfo.snssaiThptTmr;
+ arg.max = RLC_MAX_THPT_TMR;
+ break;
}
default:
{
DU_LOG("\nERROR --> RLC : rlcStopTmr: Invalid tmr Evnt[%d]", tmrType);
+ break;
}
}
if (tmrType != TMR0)
rlcBndTmrExpiry(cb);
break;
}
- case EVENT_RLC_THROUGHPUT_TMR:
+ case EVENT_RLC_UE_THROUGHPUT_TMR:
{
- rlcThptTmrExpiry(cb);
+ rlcUeThptTmrExpiry(cb);
break;
}
case EVENT_RLC_UE_DELETE_TMR:
rlcUeDeleteTmrExpiry(cb);
break;
}
+ case EVENT_RLC_SNSSAI_THROUGHPUT_TMR:
+ {
+ rlcSnssaiThptTmrExpiry(cb);
+ break;
+ }
default:
{
break;
{
return (((RlcRguSapCb *)cb)->bndTmr.tmrEvnt == EVENT_RLC_WAIT_BNDCFM);
}
- case EVENT_RLC_THROUGHPUT_TMR:
+ case EVENT_RLC_UE_THROUGHPUT_TMR:
{
- return (((RlcThpt *)cb)->thptTmr.tmrEvnt == EVENT_RLC_THROUGHPUT_TMR);
+ return (((RlcThpt *)cb)->ueTputInfo.ueThptTmr.tmrEvnt == EVENT_RLC_UE_THROUGHPUT_TMR);
}
case EVENT_RLC_UE_DELETE_TMR:
{
return (((RlcUlUeCb *)cb)->ueDeleteInfo.ueDelTmr.tmrEvnt == EVENT_RLC_UE_DELETE_TMR);
}
+ case EVENT_RLC_SNSSAI_THROUGHPUT_TMR:
+ {
+ return (((RlcThpt *)cb)->snssaiTputInfo.snssaiThptTmr.tmrEvnt == EVENT_RLC_SNSSAI_THROUGHPUT_TMR);
+ }
default:
{
DU_LOG("\nERROR --> RLC : rlcChkTmr: Invalid tmr Evnt [%d]", tmrEvnt);
}
/**
- * @brief Handler to do processing on expiry of the throughput timer
+ * @brief Handler to do processing on expiry of UE throughput timer
*
* @details
- * This function processes the RLC throughput timer expiry.
+ * This function processes the RLC UE throughput timer expiry.
*
* @param[in] cb Pointer to the RLC throughput struct
*
* @return Void
*/
-void rlcThptTmrExpiry(PTR cb)
+void rlcUeThptTmrExpiry(PTR cb)
{
uint16_t ueIdx;
long double tpt;
if(gCellStatus != CELL_UP)
{
/* Restart timer */
- rlcStartTmr(RLC_GET_RLCCB(rlcThptCb->inst), (PTR)rlcThptCb, EVENT_RLC_THROUGHPUT_TMR);
+ rlcStartTmr(RLC_GET_RLCCB(rlcThptCb->inst), (PTR)(rlcThptCb), EVENT_RLC_UE_THROUGHPUT_TMR);
return;
}
/* If cell is up, print throughout for each UE attached to the cell */
- DU_LOG("\n===================== DL Throughput ==============================");
- DU_LOG("\nNumber of UEs : %d", rlcThptCb->numActvUe);
- if(rlcThptCb->numActvUe)
+ DU_LOG("\n===================== DL Throughput Per UE==============================");
+ DU_LOG("\nNumber of UEs : %d", rlcThptCb->ueTputInfo.numActvUe);
+ if(rlcThptCb->ueTputInfo.numActvUe)
{
for(ueIdx = 0; ueIdx < MAX_NUM_UE; ueIdx++)
{
- if(rlcThptCb->thptPerUe[ueIdx].ueId)
+ if(rlcThptCb->ueTputInfo.thptPerUe[ueIdx].ueId)
{
/* 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;
+ tpt = (double)(rlcThptCb->ueTputInfo.thptPerUe[ueIdx].dataVol * 8)/(double)ODU_UE_THROUGHPUT_PRINT_TIME_INTERVAL;
- DU_LOG("\nUE Id : %d DL Tpt : %.2Lf", rlcThptCb->thptPerUe[ueIdx].ueId, tpt);
- rlcThptCb->thptPerUe[ueIdx].dataVol = 0;
+ DU_LOG("\nUE Id : %d DL Tpt : %.2Lf", rlcThptCb->ueTputInfo.thptPerUe[ueIdx].ueId, tpt);
+ rlcThptCb->ueTputInfo.thptPerUe[ueIdx].dataVol = 0;
}
}
}
DU_LOG("\n==================================================================");
/* Restart timer */
- rlcStartTmr(RLC_GET_RLCCB(rlcThptCb->inst), (PTR)rlcThptCb, EVENT_RLC_THROUGHPUT_TMR);
+ rlcStartTmr(RLC_GET_RLCCB(rlcThptCb->inst), (PTR)rlcThptCb, EVENT_RLC_UE_THROUGHPUT_TMR);
return;
}
+/**
+ * @brief Handler to do processing on expiry of the SNSSAI throughput timer
+ *
+ * @details
+ * This function processes the RLC SNSSAI throughput timer expiry.
+ *
+ * @param[in] cb Pointer to the RLC throughput struct
+ *
+ * @return Void
+ */
+void rlcSnssaiThptTmrExpiry(PTR cb)
+{
+ long double tpt;
+ RlcThpt *rlcThptCb = (RlcThpt*)cb;
+
+ /* If cell is not up, throughput details cannot be printed */
+ if(gCellStatus != CELL_UP)
+ {
+ /* Restart timer */
+ rlcStartTmr(RLC_GET_RLCCB(rlcThptCb->inst), (PTR)(rlcThptCb), EVENT_RLC_SNSSAI_THROUGHPUT_TMR);
+ return;
+ }
+
+ DU_LOG("\n==================================================================");
+ if(rlcThptCb->snssaiTputInfo.tputPerSnssaiList != NULLP)
+ {
+ DU_LOG("\n===================== DL Throughput Per SNSSAI ==============================");
+
+ rlcCalculateTputPerSnssai(rlcThptCb->snssaiTputInfo.tputPerSnssaiList);
+ DU_LOG("\n==================================================================");
+ }
+ /* Restart timer */
+ rlcStartTmr(RLC_GET_RLCCB(rlcThptCb->inst), (PTR)rlcThptCb, EVENT_RLC_SNSSAI_THROUGHPUT_TMR);
+ return;
+}
/**
*
* @brief filling RLC UE delete configuration