X-Git-Url: https://gerrit.o-ran-sc.org/r/gitweb?a=blobdiff_plain;f=src%2F5gnrmac%2Fmac_demux.c;h=02b9e113b94439c273970e0ae541a8bcc10290e8;hb=f78bb742344bb919e27f38c2d7bc2d11fc37b184;hp=ae4082797c262f6fd3f448bf5d73c494ce55ea9f;hpb=aa4e78164447b8cad6f38791047377640fd0c6f2;p=o-du%2Fl2.git diff --git a/src/5gnrmac/mac_demux.c b/src/5gnrmac/mac_demux.c index ae4082797..02b9e113b 100644 --- a/src/5gnrmac/mac_demux.c +++ b/src/5gnrmac/mac_demux.c @@ -44,12 +44,13 @@ * RFAILED * * ****************************************************************/ -uint8_t unpackRxData(uint16_t cellId, SlotIndInfo slotInfo, RxDataIndPdu *rxDataIndPdu) +uint8_t unpackRxData(uint16_t cellId, SlotTimingInfo slotInfo, RxDataIndPdu *rxDataIndPdu) { + 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 idx = 0; /* Iterator for received PDU */ + 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 */ @@ -58,161 +59,204 @@ uint8_t unpackRxData(uint16_t cellId, SlotIndInfo slotInfo, RxDataIndPdu *rxData 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_IDX(rxDataIndPdu->rnti, ueIdx); - ueIdx = ueIdx -1; + 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[idx]; + 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("\nERROR --> MAC : UL CCCH PDU memory allocation failed"); - return RFAILED; - } - idx++; - memcpy(pdu, &rxDataPdu[idx], length); - pduLen -= length; - idx = idx + length; - - /* 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--; - 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("\nERROR --> MAC : 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; - - case MAC_LCID_CCCH_48BIT : - break; - - case MAC_LCID_BIT_RATE_QUERY : - break; - - case MAC_LCID_MULT_PHR_FOUR_OCT : - break; - - case MAC_LCID_CFG_GRANT_CFM : - break; - - case MAC_LCID_MULT_PHR_ONE_OCT: - break; - - case MAC_LCID_SINGLE_PHR : - break; - - case MAC_LCID_CRNTI : - break; - - case MAC_LCID_SHORT_TRUNC_BSR : - break; - - case MAC_LCID_LONG_TRUNC_BSR : - break; - - case MAC_LCID_SHORT_BSR : - { - uint8_t lcgId = 0; - uint8_t bufferSizeIdx = 0; - uint8_t crnti = 0; - uint32_t bufferSize = 0; - - pduLen--; - - 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("\nERROR --> MAC : Invalid LC Id %d", lcId); - return RFAILED; - } + 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("\nERROR --> MAC : UL CCCH PDU memory allocation failed"); + return RFAILED; + } + rxPduIdx++; + memcpy(pdu, &rxDataPdu[rxPduIdx], length); + pduLen -= length; + rxPduIdx = rxPduIdx + length; + + /* 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; + + /* 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; + + case MAC_LCID_CCCH_48BIT : + break; + + case MAC_LCID_BIT_RATE_QUERY : + break; + + case MAC_LCID_MULT_PHR_FOUR_OCT : + break; + + case MAC_LCID_CFG_GRANT_CFM : + break; + + case MAC_LCID_MULT_PHR_ONE_OCT: + break; + + case MAC_LCID_SINGLE_PHR : + break; + + case MAC_LCID_CRNTI : + break; + + case MAC_LCID_SHORT_TRUNC_BSR : + break; + + case MAC_LCID_LONG_TRUNC_BSR : + break; + + case MAC_LCID_SHORT_BSR : + { + uint8_t lcgId = 0; + uint8_t bufferSizeIdx = 0; + uint16_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 : + { + DataVolInfo dataVolInfo[MAX_NUM_LOGICAL_CHANNEL_GROUPS]; + memset(dataVolInfo, 0,MAX_NUM_LOGICAL_CHANNEL_GROUPS * sizeof(DataVolInfo)); + uint8_t lcgIdx = 0; + uint16_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("\nERROR --> MAC : Invalid LC Id %d", lcId); + return RFAILED; + } } /* End of switch */ if(lcId == MAC_LCID_PADDING) { - break; + break; } } /* End of While */