Renaming GET_UE_IDX to GET_UE_ID in 5gnrmac [Issue-ID: ODUHIGH-401]
[o-du/l2.git] / src / 5gnrmac / mac_demux.c
index bcb3cef..d244d57 100644 (file)
 #   limitations under the License.                                             #
 ################################################################################
 *******************************************************************************/ 
-#include <stdlib.h>
-#include <stdint.h>
-#include <stdbool.h>
 
 /* header include files -- defines (.h) */
-#include "envopt.h"        /* environment options */
-#include "envdep.h"        /* environment dependent */
-#include "envind.h"        /* environment independent */
-#include "gen.h"           /* general layer */
-#include "ssi.h"           /* system service interface */
-#include "cm_hash.h"       /* common hash list */
-#include "cm_mblk.h"       /* common memory link list library */
-#include "cm_llist.h"      /* common linked list library */
-#include "cm_err.h"        /* common error */
-#include "cm_lte.h"        /* common LTE */
+#include "common_def.h"
 #include "lrg.h"           /* Layer manager interface includes*/
-#include "crg.h"           /* CRG interface includes*/
-#include "rgu.h"           /* RGU interface includes*/
-#include "tfu.h"           /* TFU interface includes */
-#include "rg_sch_inf.h"    /* SCH interface includes */
-#include "rg_prg.h"       /* PRG (MAC-MAC) interface includes*/
-#include "rg_env.h"       /* MAC environmental includes*/
-#include "rg.h"           /* MAC includes*/
-#include "rg_err.h"       /* MAC error includes*/
-#include "du_log.h"
-
-/* header/extern include files (.x) */
-#include "gen.x"           /* general layer typedefs */
-#include "ssi.x"           /* system services typedefs */
-#include "cm5.x"           /* common timers */
-#include "cm_hash.x"       /* common hash list */
-#include "cm_lib.x"        /* common library */
-#include "cm_llist.x"      /* common linked list */
-#include "cm_mblk.x"       /* memory management */
-#include "cm_tkns.x"       /* common tokens */
-#include "cm_lte.x"       /* common tokens */
-#include "rgu.x"           /* RGU types */
-#include "tfu.x"           /* RGU types */
 #include "lrg.x"           /* layer management typedefs for MAC */
-#include "crg.x"           /* CRG interface includes */
-#include "rg_sch_inf.x"    /* SCH interface typedefs */
-#include "rg_prg.x"        /* PRG (MAC-MAC) Interface typedefs */
 #include "du_app_mac_inf.h"
+#include "mac_sch_interface.h"
+#include "lwr_mac_upr_inf.h"
 #include "mac.h"
-#include "rg.x"            /* typedefs for MAC */
+#include "mac_utils.h"
+
 
 /*******************************************************************
  *
  *         RFAILED
  *
  * ****************************************************************/
-int unpackRxData(RxDataIndPdu *rxDataIndPdu)
+uint8_t unpackRxData(uint16_t cellId, SlotTimingInfo slotInfo, RxDataIndPdu *rxDataIndPdu)
 {
-   uint8_t   lcId;
-   uint8_t   idx = 0;
-   uint16_t  length;
-   uint8_t   *pdu;
-   uint16_t  pduLen;
-   uint8_t   *rxDataPdu;
+   uint8_t   ueId = 0;        /* UE Identity */
+   uint8_t   ueIdx = 0;       /* Iterator for UE list */
+   uint8_t   lcId = 0;        /* LC ID of a sub pdu */
+   uint8_t   fBit = 0;        /* Value of F Bit in MAC sub-header */
+   uint8_t   rxPduIdx = 0;    /* Iterator for received PDU */
+   uint16_t  length = 0;      /* Length of payload in a sub-PDU */ 
+   uint8_t   *pdu = NULLP;    /* Payload in sub-PDU */
+   uint16_t  pduLen = 0;      /* Length of undecoded PDU */
+   uint8_t   *rxDataPdu = NULLP;  /* Received PDU in Rx Data Ind */
+   uint16_t  cellIdx = 0;     /* Cell Index */
+   uint8_t   ret =ROK;
+
+   GET_CELL_IDX(cellId, cellIdx);
+   
+   if(rxDataIndPdu == NULLP)
+   {
+      DU_LOG("\nERROR --> MAC: Rx Data is empty");
+      return RFAILED;        
+   }
 
+   if(macCb.macCell[cellIdx] == NULLP)
+   {
+      DU_LOG("\nERROR --> CellId :%d is not created, as CellCB is empty", cellId);
+      return RFAILED;
+   }
    pduLen = rxDataIndPdu->pduLength;
    rxDataPdu = rxDataIndPdu->pduData;
+   GET_UE_ID(rxDataIndPdu->rnti, ueId);
+   ueIdx = ueId -1;
 
    while(pduLen > 0)
    {
+      /* MSB in 1st octet is Reserved bit. Hence not decoding it. 
+         2nd MSB in 1st octet is R/F bit depending upon type of payload */
+      fBit = (1 << 7) & rxDataPdu[rxPduIdx];
+
       /* LC id is the 6 LSB in 1st octet */
-      lcId = (~((~0) << 6)) & rxDataPdu[idx];
+      lcId = (~((~0) << 6)) & rxDataPdu[rxPduIdx];
 
+      pdu = NULLP;
       switch(lcId)
       {
          case MAC_LCID_CCCH :
-         {
-                          pduLen--;
-
-                           /* for UL CCCH,fixed length of MAC SDU */
-                          length = 6;
-            
-            /*  Allocating sharable memory to send ul ccch msg to du app*/
-            MAC_ALLOC_SHRABL_BUF(pdu, length);
-            if(!pdu)
             {
-               DU_LOG("\nMAC : UL CCCH PDU memory allocation failed");
-               return RFAILED;
-            }  
-            idx++;
-            memcpy(pdu, &rxDataPdu[idx], length);
-            pduLen -= length;
-            idx = idx + length;
+               pduLen--;
 
-            /* store msg3 pdu in macRaCb for CRI value */
-            memcpy(macCb.macCell->macRaCb[0].msg3Pdu, pdu, length);
+               /* for UL CCCH,fixed length of MAC SDU */
+               length = 6;
+              
+               /*  Allocating sharable memory to send ul ccch msg to du app*/
+               MAC_ALLOC_SHRABL_BUF(pdu, length);
+               if(!pdu)
+               {
+                  DU_LOG("\nERROR  -->  MAC : UL CCCH PDU memory allocation failed");
+                  return RFAILED;
+               }  
+               rxPduIdx++;
+               memcpy(pdu, &rxDataPdu[rxPduIdx], length);
+               pduLen -= length;
+               rxPduIdx = rxPduIdx + length;
 
-            /* Send UL-CCCH Indication to DU APP */
-                               macSendUlCcchInd(pdu, macCb.macCell->cellId, rxDataIndPdu->rnti); 
-            break;
-         }
-         
-         case MAC_DEDLC_MIN_LCID ... MAC_DEDLC_MAX_LCID :
-            break;
+               /* store msg3 pdu in macRaCb for CRI value */
+               memcpy(macCb.macCell[cellIdx]->macRaCb[ueIdx].msg3Pdu, pdu, length);
 
+               /* Send UL-CCCH Indication to DU APP */
+               ret = macProcUlCcchInd(macCb.macCell[cellIdx]->cellId, rxDataIndPdu->rnti, length, pdu);
+               break;
+            }
+
+         case MAC_LCID_MIN ... MAC_LCID_MAX :
+            {
+               DU_LOG("\nINFO   -->  MAC : PDU received for LC ID %d", lcId);
+               pduLen--;
+               rxPduIdx++;
+
+               length = rxDataPdu[rxPduIdx];
+               if(fBit)
+               {
+                  pduLen--;
+                  rxPduIdx++;
+                  length = (length << 8) & rxDataPdu[rxPduIdx];
+               }
+
+               pdu = NULLP;
+               /*  Copying the payload to send to RLC */
+               MAC_ALLOC_SHRABL_BUF(pdu, length);
+               if(!pdu)
+               {
+                  DU_LOG("\nERROR  -->  MAC : Memory allocation failed while demuxing Rx Data PDU");
+                  return RFAILED;
+               }
+               pduLen--;
+               rxPduIdx++;
+               memcpy(pdu, &rxDataPdu[rxPduIdx], length);
+               pduLen -= length;
+               rxPduIdx = rxPduIdx + length;
+
+               /* Delete RA cb once RRC setup complete received */
+               if(macCb.macCell[cellIdx]->macRaCb[ueIdx].crnti == rxDataIndPdu->rnti)
+               {
+                  MAC_FREE(macCb.macCell[cellIdx]->macRaCb[ueIdx].msg4Pdu, \
+                        macCb.macCell[cellIdx]->macRaCb[ueIdx].msg4PduLen);
+                  MAC_FREE(macCb.macCell[cellIdx]->macRaCb[ueIdx].msg4TxPdu, \
+                        macCb.macCell[cellIdx]->macRaCb[ueIdx].msg4TbSize - TX_PAYLOAD_HDR_LEN);
+                  memset(&macCb.macCell[cellIdx]->macRaCb[ueIdx], 0, sizeof(MacRaCbInfo));
+               }
+
+               /* Send UL Data to RLC */
+               ret = macProcUlData(cellId, rxDataIndPdu->rnti, slotInfo, lcId, length, pdu);
+
+               break;
+            }
          case MAC_LCID_RESERVED_MIN ... MAC_LCID_RESERVED_MAX :
             break;
 
@@ -158,31 +189,90 @@ int unpackRxData(RxDataIndPdu *rxDataIndPdu)
             break;
 
          case MAC_LCID_SHORT_BSR :
-            break;
+            {
+               uint8_t  lcgId         = 0;
+               uint8_t  bufferSizeIdx = 0;
+               uint8_t  crnti         = 0;
+               uint32_t bufferSize    = 0;
+
+               pduLen--;
+
+               rxPduIdx++;
+               crnti = rxDataIndPdu->rnti;
+               /* 5 LSB bits in pdu represent buffer size */
+               bufferSizeIdx = (~((~0) << 5)) & rxDataPdu[rxPduIdx];
+               /* first 3 MSB bits in pdu represent LCGID */
+               lcgId = (rxDataPdu[rxPduIdx]) >> 5;
+               /* determine actual number of bytes requested */
+               bufferSize = shortBsrBytesTable[bufferSizeIdx];
+               ret = macProcShortBsr(macCb.macCell[cellIdx]->cellId, crnti, lcgId, bufferSize);
+               pduLen--;
+               rxPduIdx++;
+
+               break;
+            }
 
          case MAC_LCID_LONG_BSR :
-            break;
-         
+            {
+               DataVolInfo dataVolInfo[MAX_NUM_LOGICAL_CHANNEL_GROUPS];
+               memset(dataVolInfo, 0,MAX_NUM_LOGICAL_CHANNEL_GROUPS * sizeof(DataVolInfo));
+               uint8_t  lcgIdx        = 0;
+               uint8_t  crnti         = 0;
+               uint8_t  numLcg        = 0;
+               uint8_t  lcgIdxPos     = 0;
+               pduLen--;
+
+               rxPduIdx++;/*To reach the Octet where lcgIdx will be present*/
+               crnti = rxDataIndPdu->rnti;
+
+               lcgIdxPos = rxPduIdx;
+
+               pduLen--;
+               rxPduIdx++;/*To reach the Octet where bsrIdx starts*/
+               for(lcgIdx = 0; lcgIdx < MAX_NUM_LOGICAL_CHANNEL_GROUPS; lcgIdx++)
+               {
+                  if(rxDataPdu[lcgIdxPos]  & (1 << lcgIdx))
+                  {
+                     if(rxDataPdu[rxPduIdx] > 0 && rxDataPdu[rxPduIdx] < MAX_LONG_BSR_TABLE_ENTRIES)
+                     {
+                        dataVolInfo[numLcg].dataVol = longBsrBytesTable[rxDataPdu[rxPduIdx]];
+                        dataVolInfo[numLcg].lcgId = lcgIdx;
+                        numLcg++;
+                     }
+                     else
+                     {
+                        DU_LOG("\nERROR  -->  MAC: Invalid BsrIdx:%d rcvd for lcgIdx:%d",lcgIdx,rxDataPdu[rxPduIdx]);
+                     }
+                     /*next byte in PDU*/
+                     pduLen--;
+                     rxPduIdx++;
+                  }
+               }
+
+               ret = macProcLongBsr(macCb.macCell[cellIdx]->cellId, crnti, numLcg, dataVolInfo);
+
+               break;
+            }
+
          case MAC_LCID_PADDING :
-         {
             break;
-         }
 
          default:
-         {
-            DU_LOG("\nMAC : Invalid LC Id %d", lcId);
-            return RFAILED;
-         }
+            {
+               DU_LOG("\nERROR  -->  MAC : Invalid LC Id %d", lcId);
+               return RFAILED;
+            }
       } /* End of switch */
 
-               if(lcId == MAC_LCID_PADDING)
-                  break;
-
+      if(lcId == MAC_LCID_PADDING)
+      {
+         break;
+      }
    } /* End of While */
 
-   return ROK;
+   return ret;
 } /* End of unpackRxData */
 
 /**********************************************************************
-         End of file
-**********************************************************************/
+  End of file
+ **********************************************************************/