<JIRA ID: ODUHIGH-390 : Ul throughput per SNSSAI (KPI)>
[o-du/l2.git] / src / 5gnrrlc / rlc_umm_ul.c
index 06119f1..4495f61 100755 (executable)
@@ -507,12 +507,13 @@ void rlcUmmProcessPdus(RlcCb *gCb, RlcUlRbCb *rbCb, KwPduInfo *pduInfo)
    RlcSn         tRxNextReassembly;
    RlcSn         tRxNextReassemblyNxt;
    RlcSn         tRxNextHighest;
+   RlcTptPerSnssai *snssaiTputNode = NULLP;
 
    count = 0;
 
    /* pduCount should be the min of RGU_MAX_PDU and pduInfo->numPdu */
    pduCount = (pduInfo->numPdu < RGU_MAX_PDU)? pduInfo->numPdu : RGU_MAX_PDU;
-   
+
    vrUh   = &(rbCb->m.umUl.vrUh);
    vrUr   = &(rbCb->m.umUl.vrUr);
    vrUx   = &(rbCb->m.umUl.vrUx);
@@ -523,6 +524,9 @@ void rlcUmmProcessPdus(RlcCb *gCb, RlcUlRbCb *rbCb, KwPduInfo *pduInfo)
       RlcSn   seqNum;
       Buffer  *pdu = pduInfo->mBuf[count];
 
+      pduSz = 0;  /*re-intialize the size*/
+      snssaiTputNode = NULLP;
+
       gCb->genSts.pdusRecv++;
 #ifndef RGL_SPECIFIC_CHANGES
 #ifndef TENB_ACC
@@ -538,16 +542,16 @@ void rlcUmmProcessPdus(RlcCb *gCb, RlcUlRbCb *rbCb, KwPduInfo *pduInfo)
 #ifndef RGL_SPECIFIC_CHANGES
 #ifndef TENB_ACC
 #ifndef LTE_PAL_ENB
-    /* Changed the condition to TRUE from ROK  */
+      /* Changed the condition to TRUE from ROK  */
 #ifndef XEON_SPECIFIC_CHANGES    
-     if(isMemThreshReached(rlcCb[0]->init.region) == TRUE)
-     {
-        uint32_t rlculdrop;
-        rlculdrop++;
-        ODU_PUT_MSG_BUF(pdu);
-        count++;
-        continue;
-     }
+      if(isMemThreshReached(rlcCb[0]->init.region) == TRUE)
+      {
+         uint32_t rlculdrop;
+         rlculdrop++;
+         ODU_PUT_MSG_BUF(pdu);
+         count++;
+         continue;
+      }
 #endif     
 #endif
 #endif
@@ -556,20 +560,32 @@ void rlcUmmProcessPdus(RlcCb *gCb, RlcUlRbCb *rbCb, KwPduInfo *pduInfo)
       if (rlcUmmExtractHdr(gCb, rbCb, pdu, &umHdr))  
       {
          DU_LOG("\nERROR  --> RLC_UL: rlcUmmProcessPdus: Header Extraction Failed UEID:%d CELLID:%d",\
-             rbCb->rlcId.ueId, rbCb->rlcId.cellId);
+               rbCb->rlcId.ueId, rbCb->rlcId.cellId);
          ODU_PUT_MSG_BUF(pdu);
          count++;
          gCb->genSts.errorPdusRecv++;
          continue;
       }
 
+      if(rbCb->snssai)
+      {
+         snssaiTputNode = rlcHandleSnssaiTputlist(gCb, rbCb->snssai, SEARCH, DIR_UL);
+         if(snssaiTputNode != NULLP)
+         {
+            ODU_GET_MSG_LEN(pdu, &pduSz);
+            snssaiTputNode->dataVol += (uint64_t)pduSz;
+            DU_LOG("\nINFO  -->  RLC_UL: UMM_UL SNSSAI List PduLen:%d, lcId:%d, total :%ld",\
+                  pduSz, rbCb->lch.lChId, snssaiTputNode->dataVol);
+         }
+      }
+
       /* Check if the PDU should be delivered to upper layer */
       if(umHdr.si == 0)
       {
          rlcUtlSendUlDataToDu(gCb, rbCb, pdu);
-        ODU_PUT_MSG_BUF(pdu);
-        count++;
-        continue;
+         ODU_PUT_MSG_BUF(pdu);
+         count++;
+         continue;
       }
 
       curSn = umHdr.sn;
@@ -582,7 +598,7 @@ void rlcUmmProcessPdus(RlcCb *gCb, RlcUlRbCb *rbCb, KwPduInfo *pduInfo)
       {
          /* PDU needs to be discarded */
          DU_LOG("\nINFO  -->  RLC_UL: rlcUmmProcessPdus: Received an unexpected pdu with sn %d \
-           UEID:%d CELLID:%d", curSn, rbCb->rlcId.ueId, rbCb->rlcId.cellId);
+               UEID:%d CELLID:%d", curSn, rbCb->rlcId.ueId, rbCb->rlcId.cellId);
 
          ODU_PUT_MSG_BUF(pdu);
          count++;
@@ -602,9 +618,9 @@ void rlcUmmProcessPdus(RlcCb *gCb, RlcUlRbCb *rbCb, KwPduInfo *pduInfo)
          if (recBuf == NULLP)
          {
             DU_LOG("\nERROR  -->  RLC_UL: rlcUmmProcessPdus: recBuf is NULLP UEID:%d CELLID:%d", \
-               rbCb->rlcId.ueId, rbCb->rlcId.cellId);
-           ODU_PUT_MSG_BUF(pdu);
-           count++;
+                  rbCb->rlcId.ueId, rbCb->rlcId.cellId);
+            ODU_PUT_MSG_BUF(pdu);
+            count++;
             continue;
          }
 
@@ -613,7 +629,7 @@ void rlcUmmProcessPdus(RlcCb *gCb, RlcUlRbCb *rbCb, KwPduInfo *pduInfo)
          {
             rlcUmmReAssembleSdus(gCb, rbCb, recBuf);
             DU_LOG("\nDEBUG  -->  RLC_UL: rlcUmmProcessPdus: Assembled the Sdus for  sn = %d UEID:%d CELLID:%d",\
-               umHdr.sn, rbCb->rlcId.ueId, rbCb->rlcId.cellId);
+                  umHdr.sn, rbCb->rlcId.ueId, rbCb->rlcId.cellId);
 
             /* if curSn is same as the RX_NEXT_Reassembly */
             if (seqNum == ur)
@@ -627,9 +643,9 @@ void rlcUmmProcessPdus(RlcCb *gCb, RlcUlRbCb *rbCb, KwPduInfo *pduInfo)
          else if (!rlcUmmCheckSnInReassemblyWindow(curSn,&RLC_UMUL))
          {  
             DU_LOG("\nDEBUG  -->  RLC_UL: rlcUmmProcessPdus: curent sn is outSide the re-Assembly window. \
-               sn = %d UEID:%d CELLID:%d", umHdr.sn, rbCb->rlcId.ueId, rbCb->rlcId.cellId);
+                  sn = %d UEID:%d CELLID:%d", umHdr.sn, rbCb->rlcId.ueId, rbCb->rlcId.cellId);
 
-           /* update RX_NEXT_Highest */
+            /* update RX_NEXT_Highest */
             *vrUh  = (curSn + 1) & RLC_UMUL.modBitMask;
 
             /* Discard all pdus outside the modified re-assembly window */
@@ -640,10 +656,10 @@ void rlcUmmProcessPdus(RlcCb *gCb, RlcUlRbCb *rbCb, KwPduInfo *pduInfo)
                RlcSn packetCount;
 
                /* Set RX_NEXT_Reassembly to next SN >= (RX_NEXT_Highest - windowSize) that has not been reassembled yet */
-              *vrUr = (*vrUh - RLC_UMUL.umWinSz) &  RLC_UMUL.modBitMask;
-              lowerEdge = *vrUr;
+               *vrUr = (*vrUh - RLC_UMUL.umWinSz) &  RLC_UMUL.modBitMask;
+               lowerEdge = *vrUr;
                packetCount = (lowerEdge - sn) & RLC_UMUL.modBitMask;
-            
+
                while (packetCount)
                {
                   recBuf = rlcUtlGetUmRecBuf(RLC_UMUL.recBufLst, sn);
@@ -655,57 +671,57 @@ void rlcUmmProcessPdus(RlcCb *gCb, RlcUlRbCb *rbCb, KwPduInfo *pduInfo)
                   sn = (sn + 1) & RLC_UMUL.modBitMask;
                   packetCount--;
                }
-              recBuf = rlcUtlGetUmRecBuf(RLC_UMUL.recBufLst, *vrUr);
-              if (recBuf != NULLP && recBuf->allSegRcvd)
-              {
-                 /* set rxNextReassembly to next SN > current rxNextReassembly which is not received */
-                 RlcSn nextRxNextReassembly = (*vrUr + 1) & RLC_UMUL.modBitMask;
-                 rlcUmmFindRxNextReassembly(gCb ,&RLC_UMUL, nextRxNextReassembly);
-              }
+               recBuf = rlcUtlGetUmRecBuf(RLC_UMUL.recBufLst, *vrUr);
+               if (recBuf != NULLP && recBuf->allSegRcvd)
+               {
+                  /* set rxNextReassembly to next SN > current rxNextReassembly which is not received */
+                  RlcSn nextRxNextReassembly = (*vrUr + 1) & RLC_UMUL.modBitMask;
+                  rlcUmmFindRxNextReassembly(gCb ,&RLC_UMUL, nextRxNextReassembly);
+               }
             }
          }
 
-        tmrRunning = rlcChkTmr(gCb,(PTR)rbCb, EVENT_RLC_UMUL_REASSEMBLE_TMR);
+         tmrRunning = rlcChkTmr(gCb,(PTR)rbCb, EVENT_RLC_UMUL_REASSEMBLE_TMR);
          tRxNextReassembly = RLC_UM_GET_VALUE(*vrUr ,RLC_UMUL);
          tRxNextReassemblyNxt = (*vrUr + 1) & rbCb->m.umUl.modBitMask;
          tRxNextHighest = RLC_UM_GET_VALUE(*vrUh, RLC_UMUL);
          tRxNextReassemblyNxt = RLC_UM_GET_VALUE(tRxNextReassemblyNxt ,RLC_UMUL);
 
-        /* If reassemby timer is running */
-        if (tmrRunning) 
-        {
-           RlcSn  tRxTimerTigger = RLC_UM_GET_VALUE(*vrUx, RLC_UMUL);
-           uint8_t ret = rlcUmmCheckSnInReassemblyWindow(*vrUx, &RLC_UMUL);
-           recBuf = rlcUtlGetUmRecBuf(RLC_UMUL.recBufLst,*vrUr);
+         /* If reassemby timer is running */
+         if (tmrRunning) 
+         {
+            RlcSn  tRxTimerTigger = RLC_UM_GET_VALUE(*vrUx, RLC_UMUL);
+            uint8_t ret = rlcUmmCheckSnInReassemblyWindow(*vrUx, &RLC_UMUL);
+            recBuf = rlcUtlGetUmRecBuf(RLC_UMUL.recBufLst,*vrUr);
 
             if ((tRxTimerTigger <= tRxNextReassembly) || ((!ret) && (tRxTimerTigger != tRxNextHighest)) ||
-                (tRxNextHighest ==  tRxNextReassemblyNxt && recBuf && recBuf->noMissingSeg))
+                  (tRxNextHighest ==  tRxNextReassemblyNxt && recBuf && recBuf->noMissingSeg))
             {
                rlcStopTmr(gCb,(PTR)rbCb, EVENT_RLC_UMUL_REASSEMBLE_TMR);             
                tmrRunning = FALSE;
                DU_LOG("\nINFO  --> RLC_UL: rlcUmmProcessPdus: Stopped ReAssembly Timer rxTimerTigger = %d \
-                  rxNextReassembly = %d rxNextHighest = %d ", tRxTimerTigger, tRxNextReassembly, tRxNextHighest);
+                     rxNextReassembly = %d rxNextHighest = %d ", tRxTimerTigger, tRxNextReassembly, tRxNextHighest);
             }
-        }
+         }
 
-        /* If Reassembly timer is not running */
-        if (!tmrRunning)
-        {
+         /* If Reassembly timer is not running */
+         if (!tmrRunning)
+         {
             recBuf = rlcUtlGetUmRecBuf(RLC_UMUL.recBufLst, curSn);
             if ((tRxNextHighest > tRxNextReassemblyNxt) || ((tRxNextHighest == tRxNextReassemblyNxt)
-                 && (recBuf && (!recBuf->noMissingSeg))))
+                     && (recBuf && (!recBuf->noMissingSeg))))
             {
-                DU_LOG("\nDEBUG  -->  RLC_UL: rlcUmmProcessPdus: Start ReAssembly Timer tRxNextReassemblyNxt = %d \
-                   tRxNextHighest %d", tRxNextReassemblyNxt, tRxNextHighest);
-                rlcStartTmr(gCb, (PTR)rbCb, EVENT_RLC_UMUL_REASSEMBLE_TMR); 
-                *vrUx = *vrUh;
+               DU_LOG("\nDEBUG  -->  RLC_UL: rlcUmmProcessPdus: Start ReAssembly Timer tRxNextReassemblyNxt = %d \
+                     tRxNextHighest %d", tRxNextReassemblyNxt, tRxNextHighest);
+               rlcStartTmr(gCb, (PTR)rbCb, EVENT_RLC_UMUL_REASSEMBLE_TMR); 
+               *vrUx = *vrUh;
             }
-        }
+         }
       }
       else
       {
          DU_LOG("\nERROR  -->  RLC_UL: rlcUmmProcessPdus:Failed to assemble the PDU for SN  = %d UEID:%d CELLID:%d",\
-            umHdr.sn, rbCb->rlcId.ueId, rbCb->rlcId.cellId);
+               umHdr.sn, rbCb->rlcId.ueId, rbCb->rlcId.cellId);
 
       }
       count++;