#include "mac.h"
#include "mac_utils.h"
+
/*******************************************************************
*
* @brief De-mux of MAC-Sub PDUs from Rx Data Ind Pdu
* RFAILED
*
* ****************************************************************/
-uint8_t unpackRxData(uint16_t cellId, RxDataIndPdu *rxDataIndPdu)
+uint8_t unpackRxData(uint16_t cellId, SlotIndInfo slotInfo, RxDataIndPdu *rxDataIndPdu)
{
- uint8_t lcId;
- uint8_t idx = 0;
- uint16_t length;
- uint8_t *pdu;
- uint16_t pduLen;
- uint8_t *rxDataPdu;
- uint16_t cellIdx;
+ uint8_t ueIdx; /* Iterator for UE list */
+ uint8_t lcId; /* LC ID of a sub pdu */
+ uint8_t fBit = 0; /* Value of F Bit in MAC sub-header */
+ uint8_t idx = 0; /* Iterator for received PDU */
+ uint16_t length; /* Length of payload in a sub-PDU */
+ uint8_t *pdu; /* Payload in sub-PDU */
+ uint16_t pduLen; /* Length of undecoded PDU */
+ uint8_t *rxDataPdu; /* Received PDU in Rx Data Ind */
+ uint16_t cellIdx; /* Cell Index */
+ uint8_t ret =ROK;
GET_CELL_IDX(cellId, cellIdx);
pduLen = rxDataIndPdu->pduLength;
rxDataPdu = rxDataIndPdu->pduData;
+ GET_UE_IDX(rxDataIndPdu->rnti, ueIdx);
+ ueIdx = ueIdx -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[idx];
+
/* LC id is the 6 LSB in 1st octet */
lcId = (~((~0) << 6)) & rxDataPdu[idx];
idx = idx + length;
/* store msg3 pdu in macRaCb for CRI value */
- memcpy(macCb.macCell[cellIdx]->macRaCb[0].msg3Pdu, pdu, length);
+ memcpy(macCb.macCell[cellIdx]->macRaCb[ueIdx].msg3Pdu, pdu, length);
/* Send UL-CCCH Indication to DU APP */
- macSendUlCcchInd(pdu, macCb.macCell[cellIdx]->cellId, rxDataIndPdu->rnti);
+ ret = macProcUlCcchInd(macCb.macCell[cellIdx]->cellId, rxDataIndPdu->rnti, length, pdu);
break;
}
- case MAC_DEDLC_MIN_LCID ... MAC_DEDLC_MAX_LCID :
- break;
+ case MAC_LCID_MIN ... MAC_LCID_MAX :
+ {
+ DU_LOG("\nMAC : PDU received for LC ID %d", lcId);
+ pduLen--;
+ idx++;
+
+ length = rxDataPdu[idx];
+ if(fBit)
+ {
+ pduLen--;
+ idx++;
+ length = (length << 8) & rxDataPdu[idx];
+ }
+
+ /* Copying the payload to send to RLC */
+ MAC_ALLOC_SHRABL_BUF(pdu, length);
+ if(!pdu)
+ {
+ DU_LOG("\nMAC : Memory allocation failed while demuxing Rx Data PDU");
+ return RFAILED;
+ }
+ pduLen--;
+ idx++;
+ memcpy(pdu, &rxDataPdu[idx], length);
+ pduLen -= length;
+ idx = idx + 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);
+ 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;
break;
case MAC_LCID_SHORT_BSR :
- break;
+ {
+ uint8_t lcgId = 0;
+ uint8_t bufferSizeIdx = 0;
+ uint8_t crnti = 0;
+ uint32_t bufferSize = 0;
- case MAC_LCID_LONG_BSR :
- break;
+ pduLen--;
- case MAC_LCID_PADDING :
- {
+ idx++;
+ crnti = rxDataIndPdu->rnti;
+ /* 5 LSB bits in pdu represent buffer size */
+ bufferSizeIdx = (~((~0) << 5)) & rxDataPdu[idx];
+ /* first 3 MSB bits in pdu represent LCGID */
+ lcgId = (rxDataPdu[idx]) >> 5;
+ /* determine actual number of bytes requested */
+ bufferSize = shortBsrBytesTable[bufferSizeIdx];
+ ret = macProcShortBsr(macCb.macCell[cellIdx]->cellId, crnti, lcgId, bufferSize);
+ pduLen--;
+ idx++;
+
break;
}
+ case MAC_LCID_LONG_BSR :
+ break;
+
+ case MAC_LCID_PADDING :
+ break;
+
default:
{
DU_LOG("\nMAC : Invalid LC Id %d", lcId);
} /* End of switch */
if(lcId == MAC_LCID_PADDING)
+ {
break;
-
+ }
} /* End of While */
- return ROK;
+ return ret;
} /* End of unpackRxData */
/**********************************************************************