<JIRA ID: ODUHIGH-389: DL Thproughput Per SNSSAI>
[o-du/l2.git] / src / 5gnrrlc / rlc_tmr.c
index bd7ccfe..0e1f789 100755 (executable)
@@ -177,11 +177,11 @@ void rlcStartTmr(RlcCb *gCb, PTR cb, int16_t tmrEvnt)
          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;
       }
@@ -193,6 +193,14 @@ void rlcStartTmr(RlcCb *gCb, PTR cb, int16_t tmrEvnt)
          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);
@@ -275,19 +283,28 @@ void rlcStopTmr(RlcCb *gCb, PTR cb, uint8_t tmrType)
          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)
@@ -358,9 +375,9 @@ Void rlcTmrExpiry(PTR cb,S16 tmrEvnt)
          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:
@@ -368,6 +385,11 @@ Void rlcTmrExpiry(PTR cb,S16 tmrEvnt)
          rlcUeDeleteTmrExpiry(cb);
          break;
       }
+      case EVENT_RLC_SNSSAI_THROUGHPUT_TMR:
+      {
+         rlcSnssaiThptTmrExpiry(cb);
+         break;
+      }
       default:
       {
          break;
@@ -417,14 +439,18 @@ bool rlcChkTmr(RlcCb *gCb, PTR cb, int16_t tmrEvnt)
       {
          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);
@@ -494,16 +520,16 @@ static Void rlcBndTmrExpiry(PTR cb)
 }
 
 /**
- * @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;
@@ -513,18 +539,18 @@ void rlcThptTmrExpiry(PTR cb)
    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
@@ -532,21 +558,56 @@ void rlcThptTmrExpiry(PTR cb)
              * 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