X-Git-Url: https://gerrit.o-ran-sc.org/r/gitweb?a=blobdiff_plain;f=src%2F5gnrmac%2Fmac_mux.c;h=05ae55caa6d044b952e3623edc9a0b505271880f;hb=bb267bb17ec2897af706e7307790d3b1e5b3ea8d;hp=f55fb08bff21504c36a764965041cff866e00589;hpb=62605166db94fd7d52f32de84dea8c7006e0f4c5;p=o-du%2Fl2.git diff --git a/src/5gnrmac/mac_mux.c b/src/5gnrmac/mac_mux.c index f55fb08bf..05ae55caa 100644 --- a/src/5gnrmac/mac_mux.c +++ b/src/5gnrmac/mac_mux.c @@ -97,44 +97,31 @@ void packBytes(uint8_t *buf, uint16_t *bytePos, uint8_t *bitPos, uint32_t val, u void fillRarPdu(RarInfo *rarInfo) { uint8_t *rarPdu = rarInfo->rarPdu; - uint16_t bytePos= 0; uint8_t bitPos = 0; + uint16_t bytePos= 0, bwpSize = 0, rbStart = 0, rbLen = 0; + uint8_t numHopInfoBitsInFreqAlloc = 0; + uint8_t actualFreqRsrcAllocSize = 0; /* RAR subheader fields */ uint8_t EBit = 0; uint8_t TBit = 0; - uint8_t rapId = 0; /* RAR payload fields */ uint8_t RBit = 0; - uint16_t timeAdv = 0; - uint32_t ulGrant = 0; - uint16_t tmpCrnti = 0; + uint16_t msg3FreqResource = 0; uint8_t paddingLcid = 63; - /* Size(in bits) of RAR subheader files */ - uint8_t EBitSize = 1; - uint8_t TBitSize = 1; - uint8_t rapidSize = 6; - uint8_t paddingLcidSize = 6; + /* Considering 2 bytes of padding in RAR PDU. + * 1st byte is MAC sub-header for padding + * 2nd byte contains padding bits + */ uint8_t paddingSize = 8; - - /* Size(in bits) of RAR payload fields */ - uint8_t RBitSize = 1; - uint8_t timeAdvSize = 12; - uint8_t ulGrantSize = 27; - uint8_t tmpCrntiSize = 16; - /* Fill RAR pdu fields */ EBit = 0; TBit = 1; - rapId = rarInfo->RAPID; - RBit = 0; - timeAdv = rarInfo->ta; - ulGrant = 0; /* this will be done when implementing msg3 */ - tmpCrnti = rarInfo->tcrnti; + rarInfo->rarPduLen = RAR_PAYLOAD_SIZE; /* Initialize buffer */ @@ -145,58 +132,80 @@ void fillRarPdu(RarInfo *rarInfo) bitPos = 7; /* Packing fields into RAR PDU */ - packBytes(rarPdu, &bytePos, &bitPos, EBit, EBitSize); - packBytes(rarPdu, &bytePos, &bitPos, TBit, TBitSize); - packBytes(rarPdu, &bytePos, &bitPos, rapId, rapidSize); - packBytes(rarPdu, &bytePos, &bitPos, RBit, RBitSize); - packBytes(rarPdu, &bytePos, &bitPos, timeAdv, timeAdvSize); - packBytes(rarPdu, &bytePos, &bitPos, ulGrant, ulGrantSize); - packBytes(rarPdu, &bytePos, &bitPos, tmpCrnti, tmpCrntiSize); - - /* padding of 2 bytes */ - packBytes(rarPdu, &bytePos, &bitPos, RBit, RBitSize*2); - packBytes(rarPdu, &bytePos, &bitPos, paddingLcid, paddingLcidSize); - packBytes(rarPdu, &bytePos, &bitPos, 0, paddingSize); + packBytes(rarPdu, &bytePos, &bitPos, EBit, E_BIT_SIZE); + packBytes(rarPdu, &bytePos, &bitPos, TBit, T_BIT_SIZE); + packBytes(rarPdu, &bytePos, &bitPos, rarInfo->RAPID, RAPID_SIZE); + packBytes(rarPdu, &bytePos, &bitPos, RBit, R_BIT_SIZE); + packBytes(rarPdu, &bytePos, &bitPos, rarInfo->ta, TIMING_ADVANCE_SIZE); + + /* Packing MSG3 UL Grant in RAR */ + packBytes(rarPdu, &bytePos, &bitPos, rarInfo->ulGrant.freqHopFlag, FREQ_HOP_FLAG_SIZE); + + /* Calculating freq domain resource allocation field value + * bwpSize = Size of BWP + * RBStart = Starting Resource block + * RBLen = length of contiguously allocted RBs + * Spec 38.214 Sec 6.1.2.2.2 + */ + bwpSize = rarInfo->ulGrant.bwpSize; + rbStart = rarInfo->ulGrant.msg3FreqAlloc.startPrb; + rbLen = rarInfo->ulGrant.msg3FreqAlloc.numPrb; + + if((rbLen >=1) && (rbLen <= bwpSize - rbStart)) + { + if((rbLen - 1) <= floor(bwpSize / 2)) + msg3FreqResource = (bwpSize * (rbLen-1)) + rbStart; + else + msg3FreqResource = (bwpSize * (bwpSize - rbLen + 1)) \ + + (bwpSize - 1 - rbStart); + } -} + /* Calculating frequency domain resource allocation field size + * and packing frequency domain resource allocation accordingly + * Spec 38.213 Sec 8.3 + */ + if(bwpSize < 180) + { + actualFreqRsrcAllocSize = ceil(log2(bwpSize * (bwpSize + 1) / 2)); + packBytes(rarPdu, &bytePos, &bitPos, 0, FREQ_RSRC_ALLOC_SIZE - actualFreqRsrcAllocSize); + packBytes(rarPdu, &bytePos, &bitPos, msg3FreqResource, actualFreqRsrcAllocSize); + } + else + { + if(rarInfo->ulGrant.freqHopFlag == 0) + { + numHopInfoBitsInFreqAlloc = 1; + packBytes(rarPdu, &bytePos, &bitPos, 0, numHopInfoBitsInFreqAlloc); + + actualFreqRsrcAllocSize = abs(log2(bwpSize * (bwpSize + 1) / 2)); + packBytes(rarPdu, &bytePos, &bitPos, 0, actualFreqRsrcAllocSize - FREQ_RSRC_ALLOC_SIZE); + packBytes(rarPdu, &bytePos, &bitPos, msg3FreqResource, \ + actualFreqRsrcAllocSize - numHopInfoBitsInFreqAlloc); + } + else + { + /* TODO : If frequency hopping is supported, + * Fetch the Number of bits to store hopping information in frequency + * resource allocation field and the value to be filled from Spec 38.213, Table 8.3-1. + * Fill the frequency resource allocation field as described in Spec 38.213 sec 8.3 + */ + } + } -/******************************************************************* - * - * @brief Database required to form MAC PDU - * - * @details - * - * Function : createMacRaCb - * - * Functionality: - * stores the required params for muxing - * - * @params[in] Pointer to cellId, - * crnti - * @return void - * - * ****************************************************************/ -void createMacRaCb(RachIndInfo *rachIndInfo) -{ - uint8_t ueIdx = 0; - uint16_t crnti = 0; - uint16_t cellIdx = 0; + /* Packing time domain resource allocation for UL grant */ + packBytes(rarPdu, &bytePos, &bitPos, rarInfo->ulGrant.k2Index, TIME_RSRC_ALLOC_SIZE); - GET_CELL_IDX(rachIndInfo->cellId, cellIdx); - - crnti = getNewCrnti(&macCb.macCell[cellIdx]->crntiMap); - if(crnti == -1) - return; + packBytes(rarPdu, &bytePos, &bitPos, rarInfo->ulGrant.mcs, MCS_SIZE); + packBytes(rarPdu, &bytePos, &bitPos, rarInfo->ulGrant.tpc, TPC_COMMAND_SIZE); + packBytes(rarPdu, &bytePos, &bitPos, rarInfo->ulGrant.csiReq, CSI_REQUEST_SIZE); - GET_UE_IDX(crnti, ueIdx); - ueIdx = ueIdx -1; + packBytes(rarPdu, &bytePos, &bitPos, rarInfo->tcrnti, T_CRNTI_SIZE); - /* store in rach ind structure */ - rachIndInfo->crnti = crnti; + /* padding of 2 bytes */ + packBytes(rarPdu, &bytePos, &bitPos, RBit, R_BIT_SIZE*2); + packBytes(rarPdu, &bytePos, &bitPos, paddingLcid, LC_ID_SIZE); + packBytes(rarPdu, &bytePos, &bitPos, 0, paddingSize); - /* store in raCb */ - macCb.macCell[cellIdx]->macRaCb[ueIdx].cellId = rachIndInfo->cellId; - macCb.macCell[cellIdx]->macRaCb[ueIdx].crnti = crnti; } /************************************************* @@ -263,7 +272,7 @@ void macMuxPdu(MacDlData *dlData, MacCeInfo *macCeData, uint8_t *txPdu, uint16_t { uint16_t bytePos = 0; uint8_t bitPos = 7; - uint8_t idx = 0; + uint8_t pduIdx = 0; uint8_t macPdu[tbSize]; memset(macPdu, 0, (tbSize * sizeof(uint8_t))); @@ -282,62 +291,62 @@ void macMuxPdu(MacDlData *dlData, MacCeInfo *macCeData, uint8_t *txPdu, uint16_t /* PACK ALL MAC CE */ if(macCeData != NULLP) { - for(idx = 0; idx < macCeData->numCes; idx++) + for(pduIdx = 0; pduIdx < macCeData->numCes; pduIdx++) { - lcid = macCeData->macCe[idx].macCeLcid; - switch(lcid) - { - case MAC_LCID_CRI: - { - /* Packing fields into MAC PDU R/R/LCID */ - packBytes(macPdu, &bytePos, &bitPos, RBit, (RBitSize * 2)); - packBytes(macPdu, &bytePos, &bitPos, lcid, lcidSize); - memcpy(&macPdu[bytePos], macCeData->macCe[idx].macCeValue,\ - MAX_CRI_SIZE); - bytePos += MAX_CRI_SIZE; - break; - } - default: - DU_LOG("\nERROR --> MAC: Invalid LCID %d in mac pdu",lcid); - break; - } + lcid = macCeData->macCe[pduIdx].macCeLcid; + switch(lcid) + { + case MAC_LCID_CRI: + { + /* Packing fields into MAC PDU R/R/LCID */ + packBytes(macPdu, &bytePos, &bitPos, RBit, (RBitSize * 2)); + packBytes(macPdu, &bytePos, &bitPos, lcid, lcidSize); + memcpy(&macPdu[bytePos], macCeData->macCe[pduIdx].macCeValue,\ + MAX_CRI_SIZE); + bytePos += MAX_CRI_SIZE; + break; + } + default: + DU_LOG("\nERROR --> MAC: Invalid LCID %d in mac pdu",lcid); + break; + } } } /* PACK ALL MAC SDUs */ - for(idx = 0; idx < dlData->numPdu; idx++) + for(pduIdx = 0; pduIdx < dlData->numPdu; pduIdx++) { - lcid = dlData->pduInfo[idx].lcId; + lcid = dlData->pduInfo[pduIdx].lcId; switch(lcid) { - case MAC_LCID_CCCH: - case MAC_LCID_MIN ... MAC_LCID_MAX : - { - lenField = dlData->pduInfo[idx].pduLen; - if(dlData->pduInfo[idx].pduLen > 255) - { - FBit = 1; - lenFieldSize = 16; - - } - else - { - FBit = 0; - lenFieldSize = 8; - } - /* Packing fields into MAC PDU R/F/LCID/L */ - packBytes(macPdu, &bytePos, &bitPos, RBit, RBitSize); - packBytes(macPdu, &bytePos, &bitPos, FBit, FBitSize); - packBytes(macPdu, &bytePos, &bitPos, lcid, lcidSize); - packBytes(macPdu, &bytePos, &bitPos, lenField, lenFieldSize); - memcpy(&macPdu[bytePos], dlData->pduInfo[idx].dlPdu, lenField); - bytePos += lenField; - break; - } - - default: - DU_LOG("\nERROR --> MAC: Invalid LCID %d in mac pdu",lcid); - break; + case MAC_LCID_CCCH: + case MAC_LCID_MIN ... MAC_LCID_MAX : + { + lenField = dlData->pduInfo[pduIdx].pduLen; + if(dlData->pduInfo[pduIdx].pduLen > 255) + { + FBit = 1; + lenFieldSize = 16; + + } + else + { + FBit = 0; + lenFieldSize = 8; + } + /* Packing fields into MAC PDU R/F/LCID/L */ + packBytes(macPdu, &bytePos, &bitPos, RBit, RBitSize); + packBytes(macPdu, &bytePos, &bitPos, FBit, FBitSize); + packBytes(macPdu, &bytePos, &bitPos, lcid, lcidSize); + packBytes(macPdu, &bytePos, &bitPos, lenField, lenFieldSize); + memcpy(&macPdu[bytePos], dlData->pduInfo[pduIdx].dlPdu, lenField); + bytePos += lenField; + break; + } + + default: + DU_LOG("\nERROR --> MAC: Invalid LCID %d in mac pdu",lcid); + break; } } if(bytePos < tbSize && (tbSize-bytePos >= 1))