From 051dbee05b924d7ed129ee6d93aac6d52e37eb6e Mon Sep 17 00:00:00 2001 From: svaidhya Date: Mon, 15 Jul 2024 13:35:10 +0530 Subject: [PATCH] [Epic-Id: ODUHIGH-576][Task-Id: ODUHIGH-594][SubTask-Id: ODUHIGH-615] | NFAPI_BRANCH | UL_TTI_REQ Change-Id: I0fc2fa01de4daf1ec3c166713b63c1b43debd0d1 Signed-off-by: svaidhya --- src/5gnrmac/nfapi_p7_msg_hdl.c | 395 ++++++++++++++++++++++++++++++++++++- src/intel_fapi/nfapi_interface.h | 2 - src/pnf_stub/pnf_stub.h | 36 ++++ src/pnf_stub/pnf_stub_p7_msg_hdl.c | 344 ++++++++++++++++++++++++++++++-- src/pnf_stub/pnf_stub_p7_msg_hdl.h | 11 ++ 5 files changed, 764 insertions(+), 24 deletions(-) diff --git a/src/5gnrmac/nfapi_p7_msg_hdl.c b/src/5gnrmac/nfapi_p7_msg_hdl.c index d82a244ae..353717cb0 100644 --- a/src/5gnrmac/nfapi_p7_msg_hdl.c +++ b/src/5gnrmac/nfapi_p7_msg_hdl.c @@ -23,7 +23,9 @@ #include "common_def.h" #include "mac_utils.h" #include "lwr_mac.h" +#include "lwr_mac_utils.h" #include "lwr_mac_fsm.h" +#include "lwr_mac_upr_inf.h" #include "fapi_vendor_extension.h" #include "nfapi_interface.h" #include "nfapi_common.h" @@ -37,7 +39,7 @@ extern NfapiVnfDb vnfDb; * * @details * - * Function : nfapiFillPrecodingBeamform + * Function : nfapiFillDlPrecodingBeamform * * Functionality: * Pack parameters of Precoding and Beamforming and fill it in MsgBuffer @@ -48,7 +50,7 @@ extern NfapiVnfDb vnfDb; * * ********************************************************************/ -void nfapiFillPrecodingBeamform(fapi_precoding_bmform_t *preCodingAndBeamforming, Buffer *mBuf) +void nfapiFillDlPrecodingBeamform(fapi_precoding_bmform_t *preCodingAndBeamforming, Buffer *mBuf) { CMCHKPK(oduPackPostUInt16, preCodingAndBeamforming->numPrgs, mBuf); CMCHKPK(oduPackPostUInt16, preCodingAndBeamforming->prgSize, mBuf); @@ -99,7 +101,7 @@ uint8_t nfapiBuildAndSendDlTtiReq(void *fapiMsg, uint32_t msgLen) if(ODU_GET_MSG_BUF(MAC_MEM_REGION, MAC_POOL, &mBuf) != ROK) { - DU_LOG("\nERROR --> NFAPI_VNF : Memory allocation failed in packPnfParamReq"); + DU_LOG("\nERROR --> NFAPI_VNF : Memory allocation failed in nfapiBuildAndSendDlTtiReq"); return RFAILED; } @@ -144,7 +146,7 @@ uint8_t nfapiBuildAndSendDlTtiReq(void *fapiMsg, uint32_t msgLen) CMCHKPK(oduPackPostUInt8, dlTtiReq->pdus[pduIdx].pdu.pdcch_pdu.dlDci[dciIndex].cceIndex, mBuf); CMCHKPK(oduPackPostUInt8, dlTtiReq->pdus[pduIdx].pdu.pdcch_pdu.dlDci[dciIndex].aggregationLevel, mBuf); - nfapiFillPrecodingBeamform(&dlTtiReq->pdus[pduIdx].pdu.pdcch_pdu.dlDci[dciIndex].pc_and_bform, mBuf); + nfapiFillDlPrecodingBeamform(&dlTtiReq->pdus[pduIdx].pdu.pdcch_pdu.dlDci[dciIndex].pc_and_bform, mBuf); CMCHKPK(oduPackPostUInt8, dlTtiReq->pdus[pduIdx].pdu.pdcch_pdu.dlDci[dciIndex].beta_pdcch_1_0, mBuf); CMCHKPK(oduPackPostUInt8, dlTtiReq->pdus[pduIdx].pdu.pdcch_pdu.dlDci[dciIndex].powerControlOffsetSS, mBuf); @@ -214,7 +216,7 @@ uint8_t nfapiBuildAndSendDlTtiReq(void *fapiMsg, uint32_t msgLen) CMCHKPK(oduPackPostUInt8, dlTtiReq->pdus[pduIdx].pdu.pdsch_pdu.ptrsReOffset, mBuf); CMCHKPK(oduPackPostUInt8, dlTtiReq->pdus[pduIdx].pdu.pdsch_pdu.nEpreRatioOfPdschToPtrs, mBuf); - nfapiFillPrecodingBeamform(&dlTtiReq->pdus[pduIdx].pdu.pdsch_pdu.preCodingAndBeamforming, mBuf); + nfapiFillDlPrecodingBeamform(&dlTtiReq->pdus[pduIdx].pdu.pdsch_pdu.preCodingAndBeamforming, mBuf); CMCHKPK(oduPackPostUInt8, dlTtiReq->pdus[pduIdx].pdu.pdsch_pdu.powerControlOffset, mBuf); CMCHKPK(oduPackPostUInt8, dlTtiReq->pdus[pduIdx].pdu.pdsch_pdu.powerControlOffsetSS, mBuf); @@ -241,7 +243,7 @@ uint8_t nfapiBuildAndSendDlTtiReq(void *fapiMsg, uint32_t msgLen) CMCHKPK(oduPackPostUInt8, dlTtiReq->pdus[pduIdx].pdu.ssb_pdu.bchPayload.phyMibPdu.cellBarred, mBuf); CMCHKPK(oduPackPostUInt8, dlTtiReq->pdus[pduIdx].pdu.ssb_pdu.bchPayload.phyMibPdu.intraFreqReselection, mBuf); - nfapiFillPrecodingBeamform(&dlTtiReq->pdus[pduIdx].pdu.ssb_pdu.preCodingAndBeamforming, mBuf); + nfapiFillDlPrecodingBeamform(&dlTtiReq->pdus[pduIdx].pdu.ssb_pdu.preCodingAndBeamforming, mBuf); break; } @@ -271,6 +273,257 @@ uint8_t nfapiBuildAndSendDlTtiReq(void *fapiMsg, uint32_t msgLen) return ret; } +/*********************************************************************** + * + * @brief Pack parameters of UL Precoding and Beamforming + * + * @details + * + * Function : nfapiFillUlPrecodingBeamform + * + * Functionality: + * Pack parameters of Precoding and Beamforming and fill it in MsgBuffer + * of NFAPI + * + * @params[in] Buffer *mBuf, preCodingAndBeamforming + * @return void + * + * ********************************************************************/ + +void nfapiFillUlRxBeamforming(fapi_ul_rx_bmform_pdu_t *ulBmform, Buffer *mBuf) +{ + CMCHKPK(oduPackPostUInt16, ulBmform->numPrgs, mBuf); + CMCHKPK(oduPackPostUInt16, ulBmform->prgSize, mBuf); + CMCHKPK(oduPackPostUInt8, ulBmform->digBfInterface, mBuf); + for(uint8_t padIdx = 0; padIdx < 3; padIdx++) + { + CMCHKPK(oduPackPostUInt8, ulBmform->pad[padIdx], mBuf); + } + for(uint8_t prgIdx = 0; prgIdx < ulBmform->numPrgs; prgIdx++) + { + for(uint8_t digBfIdx = 0; digBfIdx < ulBmform->digBfInterface; digBfIdx++) + { + CMCHKPK(oduPackPostUInt16, ulBmform->rx_bfi[prgIdx].beamIdx[digBfIdx].beamidx, mBuf); + } + } +} + +/*********************************************************************** + * + * @brief Fill P7 UL TTI REQ and send via UDP + * + * @details + * + * Function : nfapiBuildAndSendUlTtiReq + * + * Functionality: + * Fill P7 UL TTI REQ by packing each element of FAPI_UL_TTI_REQ + * + * @params[in] FapiMsgBody, MsgLength + * @return ROK - success + * RFAILED - failure + * + * ********************************************************************/ + +uint8_t nfapiBuildAndSendUlTtiReq(void *fapiMsg, uint32_t msgLen) +{ + Buffer *mBuf = NULLP; + uint8_t pduIdx = 0, ueGrpIdx = 0; + uint8_t ret = ROK; + + p_fapi_api_queue_elem_t ulTtiElem = (p_fapi_api_queue_elem_t)fapiMsg; + fapi_ul_tti_req_t *ulTtiReq = (fapi_ul_tti_req_t *)(ulTtiElem +1); + + if(ODU_GET_MSG_BUF(MAC_MEM_REGION, MAC_POOL, &mBuf) != ROK) + { + DU_LOG("\nERROR --> NFAPI_VNF : Memory allocation failed in nfapiBuildAndSendUlTtiReq"); + return RFAILED; + } + + nfapiFillP7Hdr(mBuf,(sizeof(fapi_ul_tti_req_msg_body) + sizeof(nFapi_msg_header)), 0, 0); + nfapiFillMsgHdr(mBuf, vnfDb.vnfP7Info.p7SyncInfo.phyId, FAPI_UL_TTI_REQUEST, sizeof(fapi_ul_tti_req_msg_body)); + + CMCHKPK(oduPackPostUInt16, ulTtiReq->sfn, mBuf); + CMCHKPK(oduPackPostUInt16, ulTtiReq->slot, mBuf); + CMCHKPK(oduPackPostUInt8, ulTtiReq->nPdus, mBuf); + CMCHKPK(oduPackPostUInt8, ulTtiReq->rachPresent, mBuf); + CMCHKPK(oduPackPostUInt8, ulTtiReq->nUlsch, mBuf); + CMCHKPK(oduPackPostUInt8, ulTtiReq->nUlcch, mBuf); + CMCHKPK(oduPackPostUInt8, ulTtiReq->nGroup, mBuf); + + for(pduIdx = 0; pduIdx < ulTtiReq->nPdus; pduIdx++) + { + CMCHKPK(oduPackPostUInt16, ulTtiReq->pdus[pduIdx].pduType, mBuf); + CMCHKPK(oduPackPostUInt16, ulTtiReq->pdus[pduIdx].pduSize, mBuf); + switch(ulTtiReq->pdus[pduIdx].pduType) + { + case PRACH_PDU_TYPE: + { + CMCHKPK(oduPackPostUInt16, ulTtiReq->pdus[pduIdx].pdu.prach_pdu.physCellId, mBuf); + CMCHKPK(oduPackPostUInt8, ulTtiReq->pdus[pduIdx].pdu.prach_pdu.numPrachOcas, mBuf); + CMCHKPK(oduPackPostUInt8, ulTtiReq->pdus[pduIdx].pdu.prach_pdu.prachFormat, mBuf); + CMCHKPK(oduPackPostUInt8, ulTtiReq->pdus[pduIdx].pdu.prach_pdu.numRa, mBuf); + CMCHKPK(oduPackPostUInt8, ulTtiReq->pdus[pduIdx].pdu.prach_pdu.prachStartSymbol, mBuf); + CMCHKPK(oduPackPostUInt16, ulTtiReq->pdus[pduIdx].pdu.prach_pdu.numCs, mBuf); + nfapiFillUlRxBeamforming(&ulTtiReq->pdus[pduIdx].pdu.prach_pdu.beamforming, mBuf); + break; + } + case PUSCH_PDU_TYPE: + { + CMCHKPK(oduPackPostUInt16, ulTtiReq->pdus[pduIdx].pdu.pusch_pdu.pduBitMap, mBuf); + CMCHKPK(oduPackPostUInt16, ulTtiReq->pdus[pduIdx].pdu.pusch_pdu.rnti, mBuf); + CMCHKPK(oduPackPostUInt32, ulTtiReq->pdus[pduIdx].pdu.pusch_pdu.handle, mBuf); + CMCHKPK(oduPackPostUInt16, ulTtiReq->pdus[pduIdx].pdu.pusch_pdu.bwpSize, mBuf); + CMCHKPK(oduPackPostUInt16, ulTtiReq->pdus[pduIdx].pdu.pusch_pdu.bwpStart, mBuf); + CMCHKPK(oduPackPostUInt8, ulTtiReq->pdus[pduIdx].pdu.pusch_pdu.subCarrierSpacing, mBuf); + CMCHKPK(oduPackPostUInt8, ulTtiReq->pdus[pduIdx].pdu.pusch_pdu.cyclicPrefix, mBuf); + CMCHKPK(oduPackPostUInt8, ulTtiReq->pdus[pduIdx].pdu.pusch_pdu.mcsIndex, mBuf); + CMCHKPK(oduPackPostUInt8, ulTtiReq->pdus[pduIdx].pdu.pusch_pdu.mcsTable, mBuf); + CMCHKPK(oduPackPostUInt16, ulTtiReq->pdus[pduIdx].pdu.pusch_pdu.targetCodeRate, mBuf); + CMCHKPK(oduPackPostUInt8, ulTtiReq->pdus[pduIdx].pdu.pusch_pdu.qamModOrder, mBuf); + CMCHKPK(oduPackPostUInt8, ulTtiReq->pdus[pduIdx].pdu.pusch_pdu.transformPrecoding, mBuf); + CMCHKPK(oduPackPostUInt16, ulTtiReq->pdus[pduIdx].pdu.pusch_pdu.dataScramblingId, mBuf); + CMCHKPK(oduPackPostUInt8, ulTtiReq->pdus[pduIdx].pdu.pusch_pdu.nrOfLayers, mBuf); + CMCHKPK(oduPackPostUInt8, ulTtiReq->pdus[pduIdx].pdu.pusch_pdu.dmrsConfigType, mBuf); + CMCHKPK(oduPackPostUInt16, ulTtiReq->pdus[pduIdx].pdu.pusch_pdu.ulDmrsSymbPos, mBuf); + CMCHKPK(oduPackPostUInt16, ulTtiReq->pdus[pduIdx].pdu.pusch_pdu.ulDmrsScramblingId, mBuf); + CMCHKPK(oduPackPostUInt8, ulTtiReq->pdus[pduIdx].pdu.pusch_pdu.scid, mBuf); + CMCHKPK(oduPackPostUInt8, ulTtiReq->pdus[pduIdx].pdu.pusch_pdu.numDmrsCdmGrpsNoData, mBuf); + CMCHKPK(oduPackPostUInt16, ulTtiReq->pdus[pduIdx].pdu.pusch_pdu.dmrsPorts, mBuf); + CMCHKPK(oduPackPostUInt16, ulTtiReq->pdus[pduIdx].pdu.pusch_pdu.nTpPuschId, mBuf); + CMCHKPK(oduPackPostUInt16, ulTtiReq->pdus[pduIdx].pdu.pusch_pdu.tpPi2Bpsk, mBuf); + for(uint8_t rbBitMapIdx = 0; rbBitMapIdx < 36; rbBitMapIdx++) + { + CMCHKPK(oduPackPostUInt8, ulTtiReq->pdus[pduIdx].pdu.pusch_pdu.rbBitmap[rbBitMapIdx], mBuf); + } + CMCHKPK(oduPackPostUInt16, ulTtiReq->pdus[pduIdx].pdu.pusch_pdu.rbStart, mBuf); + CMCHKPK(oduPackPostUInt16, ulTtiReq->pdus[pduIdx].pdu.pusch_pdu.rbSize, mBuf); + CMCHKPK(oduPackPostUInt8, ulTtiReq->pdus[pduIdx].pdu.pusch_pdu.vrbToPrbMapping, mBuf); + CMCHKPK(oduPackPostUInt8, ulTtiReq->pdus[pduIdx].pdu.pusch_pdu.frequencyHopping, mBuf); + CMCHKPK(oduPackPostUInt16, ulTtiReq->pdus[pduIdx].pdu.pusch_pdu.txDirectCurrentLocation, mBuf); + CMCHKPK(oduPackPostUInt8, ulTtiReq->pdus[pduIdx].pdu.pusch_pdu.resourceAlloc, mBuf); + CMCHKPK(oduPackPostUInt8, ulTtiReq->pdus[pduIdx].pdu.pusch_pdu.uplinkFrequencyShift7p5khz, mBuf); + CMCHKPK(oduPackPostUInt8, ulTtiReq->pdus[pduIdx].pdu.pusch_pdu.startSymbIndex, mBuf); + CMCHKPK(oduPackPostUInt8, ulTtiReq->pdus[pduIdx].pdu.pusch_pdu.nrOfSymbols, mBuf); + CMCHKPK(oduPackPostUInt8, ulTtiReq->pdus[pduIdx].pdu.pusch_pdu.mappingType, mBuf); + CMCHKPK(oduPackPostUInt8, ulTtiReq->pdus[pduIdx].pdu.pusch_pdu.nrOfDmrsSymbols, mBuf); + CMCHKPK(oduPackPostUInt8, ulTtiReq->pdus[pduIdx].pdu.pusch_pdu.dmrsAddPos, mBuf); + CMCHKPK(oduPackPostUInt8, ulTtiReq->pdus[pduIdx].pdu.pusch_pdu.pad, mBuf); + + //Fill fapi_pusch_data_t + CMCHKPK(oduPackPostUInt8, ulTtiReq->pdus[pduIdx].pdu.pusch_pdu.puschData.rvIndex, mBuf); + CMCHKPK(oduPackPostUInt8, ulTtiReq->pdus[pduIdx].pdu.pusch_pdu.puschData.harqProcessId, mBuf); + CMCHKPK(oduPackPostUInt8, ulTtiReq->pdus[pduIdx].pdu.pusch_pdu.puschData.newDataIndicator, mBuf); + CMCHKPK(oduPackPostUInt8, ulTtiReq->pdus[pduIdx].pdu.pusch_pdu.puschData.pad, mBuf); + CMCHKPK(oduPackPostUInt32, ulTtiReq->pdus[pduIdx].pdu.pusch_pdu.puschData.tbSize, mBuf); + CMCHKPK(oduPackPostUInt16, ulTtiReq->pdus[pduIdx].pdu.pusch_pdu.puschData.numCb, mBuf); + CMCHKPK(oduPackPostUInt8, ulTtiReq->pdus[pduIdx].pdu.pusch_pdu.puschData.cbPresentAndPosition[0], mBuf); + CMCHKPK(oduPackPostUInt8, ulTtiReq->pdus[pduIdx].pdu.pusch_pdu.puschData.cbPresentAndPosition[1], mBuf); + + //Fill fapi_pusch_uci_t + CMCHKPK(oduPackPostUInt16, ulTtiReq->pdus[pduIdx].pdu.pusch_pdu.puschUci.harqAckBitLength, mBuf); + CMCHKPK(oduPackPostUInt16, ulTtiReq->pdus[pduIdx].pdu.pusch_pdu.puschUci.csiPart1BitLength, mBuf); + CMCHKPK(oduPackPostUInt16, ulTtiReq->pdus[pduIdx].pdu.pusch_pdu.puschUci.csiPart2BitLength, mBuf); + CMCHKPK(oduPackPostUInt8, ulTtiReq->pdus[pduIdx].pdu.pusch_pdu.puschUci.alphaScaling, mBuf); + CMCHKPK(oduPackPostUInt8, ulTtiReq->pdus[pduIdx].pdu.pusch_pdu.puschUci.betaOffsetHarqAck, mBuf); + CMCHKPK(oduPackPostUInt8, ulTtiReq->pdus[pduIdx].pdu.pusch_pdu.puschUci.betaOffsetCsi1, mBuf); + CMCHKPK(oduPackPostUInt8, ulTtiReq->pdus[pduIdx].pdu.pusch_pdu.puschUci.betaOffsetCsi2, mBuf); + CMCHKPK(oduPackPostUInt8, ulTtiReq->pdus[pduIdx].pdu.pusch_pdu.puschUci.pad[0], mBuf); + CMCHKPK(oduPackPostUInt8, ulTtiReq->pdus[pduIdx].pdu.pusch_pdu.puschUci.pad[1], mBuf); + + //Fill fapi_pusch_ptrs_t + CMCHKPK(oduPackPostUInt8, ulTtiReq->pdus[pduIdx].pdu.pusch_pdu.puschPtrs.numPtrsPorts, mBuf); + CMCHKPK(oduPackPostUInt8, ulTtiReq->pdus[pduIdx].pdu.pusch_pdu.puschPtrs.ptrsTimeDensity, mBuf); + CMCHKPK(oduPackPostUInt8, ulTtiReq->pdus[pduIdx].pdu.pusch_pdu.puschPtrs.ptrsFreqDensity, mBuf); + CMCHKPK(oduPackPostUInt8, ulTtiReq->pdus[pduIdx].pdu.pusch_pdu.puschPtrs.ulPtrsPower, mBuf); + for(uint8_t portIdx = 0; portIdx < ulTtiReq->pdus[pduIdx].pdu.pusch_pdu.puschPtrs.numPtrsPorts; portIdx++) + { + CMCHKPK(oduPackPostUInt16, ulTtiReq->pdus[pduIdx].pdu.pusch_pdu.puschPtrs.ptrsInfo[portIdx].ptrsPortIndex, mBuf); + CMCHKPK(oduPackPostUInt8, ulTtiReq->pdus[pduIdx].pdu.pusch_pdu.puschPtrs.ptrsInfo[portIdx].ptrsDmrsPort, mBuf); + CMCHKPK(oduPackPostUInt8, ulTtiReq->pdus[pduIdx].pdu.pusch_pdu.puschPtrs.ptrsInfo[portIdx].ptrsReOffset, mBuf); + } + + //Fill fapi_dfts_ofdm_t + CMCHKPK(oduPackPostUInt16, ulTtiReq->pdus[pduIdx].pdu.pusch_pdu.dftsOfdm.lowPaprSequenceNumber, mBuf); + CMCHKPK(oduPackPostUInt8, ulTtiReq->pdus[pduIdx].pdu.pusch_pdu.dftsOfdm.lowPaprGroupNumber, mBuf); + CMCHKPK(oduPackPostUInt8, ulTtiReq->pdus[pduIdx].pdu.pusch_pdu.dftsOfdm.ulPtrsSampleDensity, mBuf); + CMCHKPK(oduPackPostUInt8, ulTtiReq->pdus[pduIdx].pdu.pusch_pdu.dftsOfdm.ulPtrsTimeDensityTransformPrecoding, mBuf); + CMCHKPK(oduPackPostUInt8, ulTtiReq->pdus[pduIdx].pdu.pusch_pdu.dftsOfdm.pad, mBuf); + + //Fill fapi_ul_rx_bmform_pdu_t + nfapiFillUlRxBeamforming(&ulTtiReq->pdus[pduIdx].pdu.pusch_pdu.beamforming, mBuf); + break; + } + case PUCCH_PDU_TYPE: + { + CMCHKPK(oduPackPostUInt16, ulTtiReq->pdus[pduIdx].pdu.pucch_pdu.rnti, mBuf); + CMCHKPK(oduPackPostUInt8, ulTtiReq->pdus[pduIdx].pdu.pucch_pdu.pad1[0], mBuf); + CMCHKPK(oduPackPostUInt8, ulTtiReq->pdus[pduIdx].pdu.pucch_pdu.pad1[1], mBuf); + CMCHKPK(oduPackPostUInt32, ulTtiReq->pdus[pduIdx].pdu.pucch_pdu.handle, mBuf); + CMCHKPK(oduPackPostUInt16, ulTtiReq->pdus[pduIdx].pdu.pucch_pdu.bwpSize, mBuf); + CMCHKPK(oduPackPostUInt16, ulTtiReq->pdus[pduIdx].pdu.pucch_pdu.bwpStart, mBuf); + CMCHKPK(oduPackPostUInt8, ulTtiReq->pdus[pduIdx].pdu.pucch_pdu.subCarrierSpacing, mBuf); + CMCHKPK(oduPackPostUInt8, ulTtiReq->pdus[pduIdx].pdu.pucch_pdu.cyclicPrefix, mBuf); + CMCHKPK(oduPackPostUInt8, ulTtiReq->pdus[pduIdx].pdu.pucch_pdu.formatType, mBuf); + CMCHKPK(oduPackPostUInt8, ulTtiReq->pdus[pduIdx].pdu.pucch_pdu.multiSlotTxIndicator, mBuf); + CMCHKPK(oduPackPostUInt8, ulTtiReq->pdus[pduIdx].pdu.pucch_pdu.pi2Bpsk, mBuf); + CMCHKPK(oduPackPostUInt8, ulTtiReq->pdus[pduIdx].pdu.pucch_pdu.pad2, mBuf); + CMCHKPK(oduPackPostUInt16, ulTtiReq->pdus[pduIdx].pdu.pucch_pdu.prbStart, mBuf); + CMCHKPK(oduPackPostUInt16, ulTtiReq->pdus[pduIdx].pdu.pucch_pdu.prbSize, mBuf); + CMCHKPK(oduPackPostUInt8, ulTtiReq->pdus[pduIdx].pdu.pucch_pdu.startSymbolIndex, mBuf); + CMCHKPK(oduPackPostUInt8, ulTtiReq->pdus[pduIdx].pdu.pucch_pdu.nrOfSymbols, mBuf); + CMCHKPK(oduPackPostUInt8, ulTtiReq->pdus[pduIdx].pdu.pucch_pdu.freqHopFlag, mBuf); + CMCHKPK(oduPackPostUInt8, ulTtiReq->pdus[pduIdx].pdu.pucch_pdu.groupHopFlag, mBuf); + CMCHKPK(oduPackPostUInt8, ulTtiReq->pdus[pduIdx].pdu.pucch_pdu.sequenceHopFlag, mBuf); + CMCHKPK(oduPackPostUInt8, ulTtiReq->pdus[pduIdx].pdu.pucch_pdu.pad3, mBuf); + CMCHKPK(oduPackPostUInt16, ulTtiReq->pdus[pduIdx].pdu.pucch_pdu.secondHopPrb, mBuf); + CMCHKPK(oduPackPostUInt16, ulTtiReq->pdus[pduIdx].pdu.pucch_pdu.hoppingId, mBuf); + CMCHKPK(oduPackPostUInt16, ulTtiReq->pdus[pduIdx].pdu.pucch_pdu.initialCyclicShift, mBuf); + CMCHKPK(oduPackPostUInt16, ulTtiReq->pdus[pduIdx].pdu.pucch_pdu.dataScramblingId, mBuf); + CMCHKPK(oduPackPostUInt8, ulTtiReq->pdus[pduIdx].pdu.pucch_pdu.timeDomainOccIdx, mBuf); + CMCHKPK(oduPackPostUInt8, ulTtiReq->pdus[pduIdx].pdu.pucch_pdu.preDftOccIdx, mBuf); + CMCHKPK(oduPackPostUInt8, ulTtiReq->pdus[pduIdx].pdu.pucch_pdu.preDftOccLen, mBuf); + CMCHKPK(oduPackPostUInt8, ulTtiReq->pdus[pduIdx].pdu.pucch_pdu.addDmrsFlag, mBuf); + CMCHKPK(oduPackPostUInt16, ulTtiReq->pdus[pduIdx].pdu.pucch_pdu.dmrsScramblingId, mBuf); + CMCHKPK(oduPackPostUInt8, ulTtiReq->pdus[pduIdx].pdu.pucch_pdu.dmrsCyclicShift, mBuf); + CMCHKPK(oduPackPostUInt8, ulTtiReq->pdus[pduIdx].pdu.pucch_pdu.srFlag, mBuf); + CMCHKPK(oduPackPostUInt16, ulTtiReq->pdus[pduIdx].pdu.pucch_pdu.bitLenHarq, mBuf); + CMCHKPK(oduPackPostUInt8, ulTtiReq->pdus[pduIdx].pdu.pucch_pdu.pad4[0], mBuf); + CMCHKPK(oduPackPostUInt8, ulTtiReq->pdus[pduIdx].pdu.pucch_pdu.pad4[1], mBuf); + CMCHKPK(oduPackPostUInt16, ulTtiReq->pdus[pduIdx].pdu.pucch_pdu.bitLenCsiPart1, mBuf); + CMCHKPK(oduPackPostUInt16, ulTtiReq->pdus[pduIdx].pdu.pucch_pdu.bitLenCsiPart2, mBuf); + + //Fill fapi_ul_rx_bmform_pdu_t + nfapiFillUlRxBeamforming(&ulTtiReq->pdus[pduIdx].pdu.pucch_pdu.beamforming, mBuf); + + break; + } + default: + { + DU_LOG("ERROR --> NFAPI_VNF: Incorrect PDUTYPE:%d",ulTtiReq->pdus[pduIdx].pduType); + ODU_PUT_MSG_BUF(mBuf); + return RFAILED; + } + } + } + for(ueGrpIdx = 0; ueGrpIdx < ulTtiReq->nGroup; ueGrpIdx++) + { + CMCHKPK(oduPackPostUInt8, ulTtiReq->ueGrpInfo[ueGrpIdx].nUe, mBuf); + for(uint8_t padIdx = 0; padIdx < 3; padIdx++) + { + CMCHKPK(oduPackPostUInt8, ulTtiReq->ueGrpInfo[ueGrpIdx].pad[padIdx], mBuf); + } + for(uint8_t ueIdx = 0; ueIdx < ulTtiReq->ueGrpInfo[ueGrpIdx].nUe; ueIdx++) + { + CMCHKPK(oduPackPostUInt8, ulTtiReq->ueGrpInfo[ueGrpIdx].pduIdx[ueIdx], mBuf); + } + } + + ret = nfapiP7UdpSendMsg(mBuf); + + return ret; +} + /*********************************************************************** * * @brief Fill P7 Transparent Msgs and Build NFAPI msg and send via UDP @@ -290,22 +543,31 @@ uint8_t nfapiBuildAndSendDlTtiReq(void *fapiMsg, uint32_t msgLen) uint8_t nfapiFillAndSendP7TransMsg(uint8_t msgType, uint32_t msgLen, void *fapiP7Msg) { + uint8_t ret = ROK; + switch(msgType) { case FAPI_DL_TTI_REQUEST: { DU_LOG("\nINFO --> NFAPI_VNF:DL_TTI_REQ received from LWR_MAC as FAPI_MSG_BODY"); - nfapiBuildAndSendDlTtiReq(fapiP7Msg, msgLen); + ret = nfapiBuildAndSendDlTtiReq(fapiP7Msg, msgLen); + break; + } + case FAPI_UL_TTI_REQUEST: + { + DU_LOG("\nINFO --> NFAPI_VNF:UL_TTI_REQ received from LWR_MAC as FAPI_MSG_BODY"); + ret = nfapiBuildAndSendUlTtiReq(fapiP7Msg, msgLen); break; } default: { DU_LOG("\nERROR --> NFAPI_VNF: Incorrect MsgType:%d",msgType); + ret = RFAILED; break; } } LWR_MAC_FREE(fapiP7Msg, msgLen); - return ROK; + return ret; } /******************************************************************* @@ -462,6 +724,114 @@ uint8_t nfapiP7ProcUlNodeSync(Buffer *mBuf) return ret; } +/******************************************************************* + * + * @brief Build and Sends EVENT_RACH_IND to MAC + * + * @details + * + * Function nfapiSendRachIndToMac + * + * Functionality: + * Build and Posts RACH_IND event to MAC + * + * @params[in] fapi_rach_ind_msg_body(received from PNF) + * @return ROK - success + * RFAILED - failure + * + * ****************************************************************/ + +uint8_t nfapiSendRachIndToMac(fapi_rach_ind_msg_body *nfapiRachInd) +{ + Pst pst; + uint8_t pduIdx = 0, ret = ROK; + uint8_t prmbleIdx; + RachPduInfo *rachPdu = NULLP; + RachInd *rachInd = NULLP; + + MAC_ALLOC_SHRABL_BUF(rachInd, sizeof(RachInd)); + if(!rachInd) + { + DU_LOG("ERROR --> NFAPI_VNF : Memory Allocation failed in nfapiSendRachIndToMac"); + return RFAILED; + } + rachInd->cellId = vnfDb.cellId; + rachInd->timingInfo.sfn = nfapiRachInd->sfn; + rachInd->timingInfo.slot = nfapiRachInd->slot; + rachInd->numPdu = nfapiRachInd->numPdus; + for(pduIdx=0; pduIdx < rachInd->numPdu; pduIdx++) + { + rachPdu = &rachInd->rachPdu[pduIdx]; + rachPdu->pci = nfapiRachInd->rachPdu[pduIdx].phyCellId; + rachPdu->symbolIdx = nfapiRachInd->rachPdu[pduIdx].symbolIndex; + rachPdu->slotIdx = nfapiRachInd->rachPdu[pduIdx].slotIndex; + rachPdu->freqIdx = nfapiRachInd->rachPdu[pduIdx].freqIndex; + rachPdu->numPream = nfapiRachInd->rachPdu[pduIdx].numPreamble; + for(prmbleIdx=0; prmbleIdx < rachPdu->numPream; prmbleIdx++) + { + rachPdu->preamInfo[prmbleIdx].preamIdx = \ + nfapiRachInd->rachPdu[pduIdx].preambleInfo[prmbleIdx].preambleIndex; + rachPdu->preamInfo[prmbleIdx].timingAdv = \ + nfapiRachInd->rachPdu[pduIdx].preambleInfo[prmbleIdx].timingAdvance; + } + } + /* Fill post and sent to MAC */ + FILL_PST_LWR_MAC_TO_MAC(pst, EVENT_RACH_IND_TO_MAC); + pst.selector = ODU_SELECTOR_LWLC; + ret = packRachInd(&pst, rachInd); + return ret; +} + +/******************************************************************* + * + * @brief Process FAPI_RACH_IND from PNF + * + * @details + * + * Function : nfapiP7ProcRachInd + * + * Functionality: + * Processes FAPI_RACH_IND received from PNF + * Parametes can be referred from SCF222v2222.10.03, Sec 3.4.11 + * + * @params[in] UDP Buffer + * @return ROK - success + * RFAILED - failure + * + * ****************************************************************/ + +uint8_t nfapiP7ProcRachInd(Buffer *mBuf) +{ + uint8_t pduCnt = 0, preambleCnt = 0, ret = ROK; + fapi_rach_ind_msg_body nfapiRachInd; + + CMCHKPK(oduUnpackUInt16, &(nfapiRachInd.sfn), mBuf); + CMCHKPK(oduUnpackUInt16, &(nfapiRachInd.slot), mBuf); + CMCHKPK(oduUnpackUInt8, &(nfapiRachInd.numPdus), mBuf); + + //Extract fapi_rach_pdu_t + for(pduCnt = 0; pduCnt < nfapiRachInd.numPdus; pduCnt++) + { + CMCHKPK(oduUnpackUInt16, &(nfapiRachInd.rachPdu[pduCnt].phyCellId), mBuf); + CMCHKPK(oduUnpackUInt8, &(nfapiRachInd.rachPdu[pduCnt].symbolIndex), mBuf); + CMCHKPK(oduUnpackUInt8, &(nfapiRachInd.rachPdu[pduCnt].slotIndex), mBuf); + CMCHKPK(oduUnpackUInt8, &(nfapiRachInd.rachPdu[pduCnt].freqIndex), mBuf); + CMCHKPK(oduUnpackUInt8, &(nfapiRachInd.rachPdu[pduCnt].avgRssi), mBuf); + CMCHKPK(oduUnpackUInt8, &(nfapiRachInd.rachPdu[pduCnt].avgSnr), mBuf); + CMCHKPK(oduUnpackUInt8, &(nfapiRachInd.rachPdu[pduCnt].numPreamble), mBuf); + for(preambleCnt = 0; preambleCnt < nfapiRachInd.rachPdu[pduCnt].numPreamble; preambleCnt++) + { + CMCHKPK(oduUnpackUInt8, &(nfapiRachInd.rachPdu[pduCnt].preambleInfo[preambleCnt].preambleIndex), mBuf); + CMCHKPK(oduUnpackUInt8, &(nfapiRachInd.rachPdu[pduCnt].preambleInfo[preambleCnt].pad), mBuf); + CMCHKPK(oduUnpackUInt16, &(nfapiRachInd.rachPdu[pduCnt].preambleInfo[preambleCnt].timingAdvance), mBuf); + CMCHKPK(oduUnpackUInt32, &(nfapiRachInd.rachPdu[pduCnt].preambleInfo[preambleCnt].preamblePwr), mBuf); + } + } + + ret = nfapiSendRachIndToMac(&nfapiRachInd); + return ret; +} + /******************************************************************* * * @brief Processed the NFAPI P7 message from UDP socket @@ -480,7 +850,7 @@ uint8_t nfapiP7ProcUlNodeSync(Buffer *mBuf) * RFAILED - failure * * ****************************************************************/ -uint8_t nfapiP7MsgHandler(Buffer *mBuf) +uint8_t nfapiP7MsgHandler(Buffer *mBuf) { nFapi_p7_hdr p7Hdr; nFapi_msg_header msgHdr; @@ -496,7 +866,12 @@ uint8_t nfapiP7MsgHandler(Buffer *mBuf) nfapiP7ProcUlNodeSync(mBuf); break; } - + case FAPI_RACH_INDICATION: + { + DU_LOG("INFO --> NFAPI_VNF: Received RACH INDICATIOn"); + nfapiP7ProcRachInd(mBuf); + break; + } default: { DU_LOG("ERROR --> NFAPI_VNF: Wrong MsgId:%d", msgHdr.msg_id); diff --git a/src/intel_fapi/nfapi_interface.h b/src/intel_fapi/nfapi_interface.h index 449771292..938a798cf 100644 --- a/src/intel_fapi/nfapi_interface.h +++ b/src/intel_fapi/nfapi_interface.h @@ -344,7 +344,6 @@ typedef struct fapi_ul_tti_req_msg_body_t{ uint8_t nUlsch; uint8_t nUlcch; uint8_t nGroup; - uint8_t pad[3]; fapi_ul_tti_req_pdu_t pdus[FAPI_MAX_NUMBER_UL_PDUS_PER_TTI]; // 5G FAPI Table 3-44 fapi_ue_info_t ueGrpInfo[FAPI_MAX_NUMBER_OF_GROUPS_PER_TTI]; }fapi_ul_tti_req_msg_body; @@ -443,7 +442,6 @@ typedef struct fapi_rach_ind_msg_body_t{ uint16_t sfn; uint16_t slot; uint8_t numPdus; - uint8_t pad[3]; fapi_rach_pdu_t rachPdu[FAPI_MAX_NUMBER_RACH_PDUS_PER_SLOT]; // 5G FAPI Table 3-74 }fapi_rach_ind_msg_body; diff --git a/src/pnf_stub/pnf_stub.h b/src/pnf_stub/pnf_stub.h index d892140f5..b5430304c 100644 --- a/src/pnf_stub/pnf_stub.h +++ b/src/pnf_stub/pnf_stub.h @@ -67,6 +67,21 @@ #define NUMEROLOGY 0 +/*UE Ids for RACH IND*/ +#define UE_IDX_0 0 +#define UE_IDX_1 1 +#define UE_IDX_2 2 + +/* Default RA Preamble index to be used when Rach Indication is triggered from + PHY stub */ +#define CB_RA_PREAMBLE_IDX 3 /* For contention based RA */ +#define CF_RA_PREAMBLE_IDX 8 /* For contention free RA */ + +#define NR_PCI 1 +#define PRACH_PDU_TYPE 0 +#define PUSCH_PDU_TYPE 1 +#define PUCCH_PDU_TYPE 2 + uint32_t PER_TTI_TIME_USEC; uint8_t NUM_SLOTS_PER_SUBFRAME; @@ -97,12 +112,33 @@ typedef struct pnfP7Info uint32_t t_ref_ns; }PnfP7Info; +typedef struct pnfUeCb +{ + uint8_t ueId; + uint16_t crnti; + bool rachIndSent; + bool isCFRA; + bool msg3Sent; + bool msg5ShortBsrSent; + bool msg5Sent; + bool dlDedMsg; + bool msgNasAuthenticationComp; + bool msgNasSecurityModeComp; + bool msgRrcSecurityModeComp; + bool msgRrcReconfigComp; + bool msgRegistrationComp; + uint8_t rlcSnForSrb1; /* Sequence number of PDU at RLC for AM mode */ + uint8_t pdcpSn; /* Sequence number of PDU at PDCP */ +}PnfUeCb; + typedef struct pnfGlobalCb { PnfCfgParams pnfCfgParams; PnfSlotInfo pnfSlotInfo; PnfP7Info pnfP7Info; uint8_t numDu; + uint8_t numActiveUe; + PnfUeCb pnfUeCb[MAX_NUM_UE]; //DuDb duInfo[MAX_DU_SUPPORTED]; /*TODO: VNF Database can be added*/ }PnfGlobalCb; diff --git a/src/pnf_stub/pnf_stub_p7_msg_hdl.c b/src/pnf_stub/pnf_stub_p7_msg_hdl.c index ad1079367..00067956f 100644 --- a/src/pnf_stub/pnf_stub_p7_msg_hdl.c +++ b/src/pnf_stub/pnf_stub_p7_msg_hdl.c @@ -176,6 +176,321 @@ uint8_t pnfDlTtiReq(Buffer *mBuf) return ROK; } +/********************************************************************************* + * @Brief: Unpackng Ul RxBeamforming received in UL_TTI_REQ + * + * @Function: pnfUnpackUlRxBeamforming + * + * @Description: Unpackng Ul RxBeamforming received in UL_TTI_REQ from VNF + * + * @Params [IN]: fapi_ul_rx_bmform_pdu_t, Buffer + * [OUT]: void + * + * ******************************************************************************/ + +void pnfUnpackUlRxBeamforming(fapi_ul_rx_bmform_pdu_t *ulBmform, Buffer *mBuf) +{ + CMCHKPK(oduUnpackUInt16, &ulBmform->numPrgs, mBuf); + CMCHKPK(oduUnpackUInt16, &ulBmform->prgSize, mBuf); + CMCHKPK(oduUnpackUInt8, &ulBmform->digBfInterface, mBuf); + for(uint8_t padIdx = 0; padIdx < 3; padIdx++) + { + CMCHKPK(oduUnpackUInt8, &ulBmform->pad[padIdx], mBuf); + } + for(uint8_t prgIdx = 0; prgIdx < ulBmform->numPrgs; prgIdx++) + { + for(uint8_t digBfIdx = 0; digBfIdx < ulBmform->digBfInterface; digBfIdx++) + { + CMCHKPK(oduUnpackUInt16, &ulBmform->rx_bfi[prgIdx].beamIdx[digBfIdx].beamidx, mBuf); + } + } +} + +/********************************************************************************* + * @Brief: Build And Send FAPI_RACH_IND to VNF (MSG1/RACH) + * + * @Function: pnfBuildAndSendRachInd + * + * @Description: Build And Send FAPI_RACH_IND to VNF + * + * @Params [IN]: Sfn, Slot, raPreambleIdx + * [OUT]: void + * + * ******************************************************************************/ + +uint8_t pnfBuildAndSendRachInd(uint16_t slot, uint16_t sfn, uint8_t raPreambleIdx) +{ + Buffer *mBuf = NULLP; + + if (ODU_GET_MSG_BUF(PNF_APP_MEM_REG, PNF_POOL, &mBuf) != ROK) + { + DU_LOG("ERROR --> NFAPI_PNF : Memory allocation failed in start response"); + return RFAILED; + } + nfapiFillP7Hdr(mBuf, (sizeof(fapi_rach_ind_msg_body) + sizeof(nFapi_msg_header)), 0, 0); + nfapiFillMsgHdr(mBuf, 1, FAPI_RACH_INDICATION, sizeof(fapi_rach_ind_msg_body)); + + CMCHKPK(oduPackPostUInt16, sfn, mBuf); + CMCHKPK(oduPackPostUInt16, slot, mBuf); + CMCHKPK(oduPackPostUInt8, 1, mBuf); //numPdus + + //fapi_rach_pdu_t + CMCHKPK(oduPackPostUInt16, NR_PCI, mBuf); //phyCellId + CMCHKPK(oduPackPostUInt8, 0, mBuf); //symbolIndex + CMCHKPK(oduPackPostUInt8, slot, mBuf); //slotIndex + CMCHKPK(oduPackPostUInt8, 0, mBuf); //freqIndex + CMCHKPK(oduPackPostUInt8, 0, mBuf); //avgRssi + CMCHKPK(oduPackPostUInt8, 0, mBuf); //avgSnr + CMCHKPK(oduPackPostUInt8, 1, mBuf); //numPreamble + + //fapi_preamble_info_t + CMCHKPK(oduPackPostUInt8, raPreambleIdx, mBuf); //preambleIndex + CMCHKPK(oduPackPostUInt8, 0, mBuf); //pad + CMCHKPK(oduPackPostUInt16, 0, mBuf); //timingAdvance + CMCHKPK(oduPackPostUInt32, 0, mBuf); //preamblePwr + + /* Sending RACH indication to VNF */ + DU_LOG("INFO --> NFAPI_PNF: Sending RACH Indication to VNF"); + + if(pnfP7UdpSendMsg(mBuf) != ROK) + { + return RFAILED; + } + return ROK; +} + +/********************************************************************************* + * @Brief: Processes UL_TTI_REQ received from VNF + * + * @Function: pnfProcUlTtiReq + * + * @Description: Processes UL_TTI_REQ received from VNF and based on PDU type + * received, PNF proceeds with the next steps for UE attach + * + * @Params [IN]: fapi_ul_tti_req_msg_body + * [OUT]: void + * + * ******************************************************************************/ + +void pnfProcUlTtiReq(fapi_ul_tti_req_msg_body *pnfUlTtiReq) +{ + uint8_t numPdus = pnfUlTtiReq->nPdus; + + while(numPdus) + { + if(pnfUlTtiReq->pdus[numPdus-1].pduType == PRACH_PDU_TYPE) + { + DU_LOG("INFO --> NFAPI_PNF: PRACH PDU"); + if(pnfCb.pnfUeCb[UE_IDX_0].rachIndSent == false) + { + pnfCb.pnfUeCb[UE_IDX_0].isCFRA = false; + pnfCb.pnfUeCb[UE_IDX_0].rachIndSent = true; + pnfBuildAndSendRachInd(pnfUlTtiReq->slot, pnfUlTtiReq->sfn, CB_RA_PREAMBLE_IDX); + pnfCb.numActiveUe++; + } + } + if(pnfUlTtiReq->pdus[numPdus-1].pduType == PUSCH_PDU_TYPE) + { + DU_LOG("INFO --> NFAPI_PNF: PUSCH PDU"); + /*TODO: CRC_IND and RX_DATA_IND to be built and Sent*/ + } + if(pnfUlTtiReq->pdus[numPdus-1].pduType == PUCCH_PDU_TYPE) + { + DU_LOG("INFO --> NFAPI_PNF: PUCCH PDU"); + /*TODO: UCI_IND to be built and sent*/ + } + numPdus--; + } + return ROK; +} + +/********************************************************************************* + * + * @Function Name: pnfUlTtiReq + * + * + * @Functionality: + * Handles the P7 UL TTI REQ by unpacking the MsgBuffer received + * + * @Params [IN]: Message Buffer received at UDP NFAPI P7 Interface + * + * *******************************************************************************/ +uint8_t pnfUlTtiReq(Buffer *mBuf) +{ + uint8_t pduCnt = 0; + fapi_ul_tti_req_msg_body fapiMsgBody; + + CMCHKPK(oduUnpackUInt16, &fapiMsgBody.sfn, mBuf); + CMCHKPK(oduUnpackUInt16, &fapiMsgBody.slot, mBuf); + CMCHKPK(oduUnpackUInt8, &fapiMsgBody.nPdus, mBuf); + CMCHKPK(oduUnpackUInt8, &fapiMsgBody.rachPresent, mBuf); + CMCHKPK(oduUnpackUInt8, &fapiMsgBody.nUlsch, mBuf); + CMCHKPK(oduUnpackUInt8, &fapiMsgBody.nUlcch, mBuf); + CMCHKPK(oduUnpackUInt8, &fapiMsgBody.nGroup, mBuf); + + + DU_LOG("INFO --> NFAPI_PNF: UL_TTI_REQ SFN/SLOT:%d/%d, nPdu:%d",fapiMsgBody.sfn, fapiMsgBody.slot, fapiMsgBody.nPdus); + + for(pduCnt = 0; pduCnt < fapiMsgBody.nPdus; pduCnt++) + { + CMCHKPK(oduUnpackUInt16, &fapiMsgBody.pdus[pduCnt].pduType, mBuf); + CMCHKPK(oduUnpackUInt16, &fapiMsgBody.pdus[pduCnt].pduSize, mBuf); + switch(fapiMsgBody.pdus[pduCnt].pduType) + { + case PRACH_PDU_TYPE: + { + CMCHKPK(oduUnpackUInt16, &fapiMsgBody.pdus[pduCnt].pdu.prach_pdu.physCellId, mBuf); + CMCHKPK(oduUnpackUInt8, &fapiMsgBody.pdus[pduCnt].pdu.prach_pdu.numPrachOcas, mBuf); + CMCHKPK(oduUnpackUInt8, &fapiMsgBody.pdus[pduCnt].pdu.prach_pdu.prachFormat, mBuf); + CMCHKPK(oduUnpackUInt8, &fapiMsgBody.pdus[pduCnt].pdu.prach_pdu.numRa, mBuf); + CMCHKPK(oduUnpackUInt8, &fapiMsgBody.pdus[pduCnt].pdu.prach_pdu.prachStartSymbol, mBuf); + CMCHKPK(oduUnpackUInt16, &fapiMsgBody.pdus[pduCnt].pdu.prach_pdu.numCs, mBuf); + pnfUnpackUlRxBeamforming(&fapiMsgBody.pdus[pduCnt].pdu.prach_pdu.beamforming, mBuf); + break; + break; + } + case PUSCH_PDU_TYPE: + { + CMCHKPK(oduUnpackUInt16, &fapiMsgBody.pdus[pduCnt].pdu.pusch_pdu.pduBitMap, mBuf); + CMCHKPK(oduUnpackUInt16, &fapiMsgBody.pdus[pduCnt].pdu.pusch_pdu.rnti, mBuf); + CMCHKPK(oduUnpackUInt32, &fapiMsgBody.pdus[pduCnt].pdu.pusch_pdu.handle, mBuf); + CMCHKPK(oduUnpackUInt16, &fapiMsgBody.pdus[pduCnt].pdu.pusch_pdu.bwpSize, mBuf); + CMCHKPK(oduUnpackUInt16, &fapiMsgBody.pdus[pduCnt].pdu.pusch_pdu.bwpStart, mBuf); + CMCHKPK(oduUnpackUInt8, &fapiMsgBody.pdus[pduCnt].pdu.pusch_pdu.subCarrierSpacing, mBuf); + CMCHKPK(oduUnpackUInt8, &fapiMsgBody.pdus[pduCnt].pdu.pusch_pdu.cyclicPrefix, mBuf); + CMCHKPK(oduUnpackUInt8, &fapiMsgBody.pdus[pduCnt].pdu.pusch_pdu.mcsIndex, mBuf); + CMCHKPK(oduUnpackUInt8, &fapiMsgBody.pdus[pduCnt].pdu.pusch_pdu.mcsTable, mBuf); + CMCHKPK(oduUnpackUInt16, &fapiMsgBody.pdus[pduCnt].pdu.pusch_pdu.targetCodeRate, mBuf); + CMCHKPK(oduUnpackUInt8, &fapiMsgBody.pdus[pduCnt].pdu.pusch_pdu.qamModOrder, mBuf); + CMCHKPK(oduUnpackUInt8, &fapiMsgBody.pdus[pduCnt].pdu.pusch_pdu.transformPrecoding, mBuf); + CMCHKPK(oduUnpackUInt16, &fapiMsgBody.pdus[pduCnt].pdu.pusch_pdu.dataScramblingId, mBuf); + CMCHKPK(oduUnpackUInt8, &fapiMsgBody.pdus[pduCnt].pdu.pusch_pdu.nrOfLayers, mBuf); + CMCHKPK(oduUnpackUInt8, &fapiMsgBody.pdus[pduCnt].pdu.pusch_pdu.dmrsConfigType, mBuf); + CMCHKPK(oduUnpackUInt16, &fapiMsgBody.pdus[pduCnt].pdu.pusch_pdu.ulDmrsSymbPos, mBuf); + CMCHKPK(oduUnpackUInt16, &fapiMsgBody.pdus[pduCnt].pdu.pusch_pdu.ulDmrsScramblingId, mBuf); + CMCHKPK(oduUnpackUInt8, &fapiMsgBody.pdus[pduCnt].pdu.pusch_pdu.scid, mBuf); + CMCHKPK(oduUnpackUInt8, &fapiMsgBody.pdus[pduCnt].pdu.pusch_pdu.numDmrsCdmGrpsNoData, mBuf); + CMCHKPK(oduUnpackUInt16, &fapiMsgBody.pdus[pduCnt].pdu.pusch_pdu.dmrsPorts, mBuf); + CMCHKPK(oduUnpackUInt16, &fapiMsgBody.pdus[pduCnt].pdu.pusch_pdu.nTpPuschId, mBuf); + CMCHKPK(oduUnpackUInt16, &fapiMsgBody.pdus[pduCnt].pdu.pusch_pdu.tpPi2Bpsk, mBuf); + for(uint8_t rbBitMapIdx = 0; rbBitMapIdx < 36; rbBitMapIdx++) + { + CMCHKPK(oduUnpackUInt8, &fapiMsgBody.pdus[pduCnt].pdu.pusch_pdu.rbBitmap[rbBitMapIdx], mBuf); + } + CMCHKPK(oduUnpackUInt16, &fapiMsgBody.pdus[pduCnt].pdu.pusch_pdu.rbStart, mBuf); + CMCHKPK(oduUnpackUInt16, &fapiMsgBody.pdus[pduCnt].pdu.pusch_pdu.rbSize, mBuf); + CMCHKPK(oduUnpackUInt8, &fapiMsgBody.pdus[pduCnt].pdu.pusch_pdu.vrbToPrbMapping, mBuf); + CMCHKPK(oduUnpackUInt8, &fapiMsgBody.pdus[pduCnt].pdu.pusch_pdu.frequencyHopping, mBuf); + CMCHKPK(oduUnpackUInt16, &fapiMsgBody.pdus[pduCnt].pdu.pusch_pdu.txDirectCurrentLocation, mBuf); + CMCHKPK(oduUnpackUInt8, &fapiMsgBody.pdus[pduCnt].pdu.pusch_pdu.resourceAlloc, mBuf); + CMCHKPK(oduUnpackUInt8, &fapiMsgBody.pdus[pduCnt].pdu.pusch_pdu.uplinkFrequencyShift7p5khz, mBuf); + CMCHKPK(oduUnpackUInt8, &fapiMsgBody.pdus[pduCnt].pdu.pusch_pdu.startSymbIndex, mBuf); + CMCHKPK(oduUnpackUInt8, &fapiMsgBody.pdus[pduCnt].pdu.pusch_pdu.nrOfSymbols, mBuf); + CMCHKPK(oduUnpackUInt8, &fapiMsgBody.pdus[pduCnt].pdu.pusch_pdu.mappingType, mBuf); + CMCHKPK(oduUnpackUInt8, &fapiMsgBody.pdus[pduCnt].pdu.pusch_pdu.nrOfDmrsSymbols, mBuf); + CMCHKPK(oduUnpackUInt8, &fapiMsgBody.pdus[pduCnt].pdu.pusch_pdu.dmrsAddPos, mBuf); + CMCHKPK(oduUnpackUInt8, &fapiMsgBody.pdus[pduCnt].pdu.pusch_pdu.pad, mBuf); + + //Fill fapi_pusch_data_t + CMCHKPK(oduUnpackUInt8, &fapiMsgBody.pdus[pduCnt].pdu.pusch_pdu.puschData.rvIndex, mBuf); + CMCHKPK(oduUnpackUInt8, &fapiMsgBody.pdus[pduCnt].pdu.pusch_pdu.puschData.harqProcessId, mBuf); + CMCHKPK(oduUnpackUInt8, &fapiMsgBody.pdus[pduCnt].pdu.pusch_pdu.puschData.newDataIndicator, mBuf); + CMCHKPK(oduUnpackUInt8, &fapiMsgBody.pdus[pduCnt].pdu.pusch_pdu.puschData.pad, mBuf); + CMCHKPK(oduUnpackUInt32, &fapiMsgBody.pdus[pduCnt].pdu.pusch_pdu.puschData.tbSize, mBuf); + CMCHKPK(oduUnpackUInt16, &fapiMsgBody.pdus[pduCnt].pdu.pusch_pdu.puschData.numCb, mBuf); + CMCHKPK(oduUnpackUInt8, &fapiMsgBody.pdus[pduCnt].pdu.pusch_pdu.puschData.cbPresentAndPosition[0], mBuf); + CMCHKPK(oduUnpackUInt8, &fapiMsgBody.pdus[pduCnt].pdu.pusch_pdu.puschData.cbPresentAndPosition[1], mBuf); + + //Fill fapi_pusch_uci_t + CMCHKPK(oduUnpackUInt16, &fapiMsgBody.pdus[pduCnt].pdu.pusch_pdu.puschUci.harqAckBitLength, mBuf); + CMCHKPK(oduUnpackUInt16, &fapiMsgBody.pdus[pduCnt].pdu.pusch_pdu.puschUci.csiPart1BitLength, mBuf); + CMCHKPK(oduUnpackUInt16, &fapiMsgBody.pdus[pduCnt].pdu.pusch_pdu.puschUci.csiPart2BitLength, mBuf); + CMCHKPK(oduUnpackUInt8, &fapiMsgBody.pdus[pduCnt].pdu.pusch_pdu.puschUci.alphaScaling, mBuf); + CMCHKPK(oduUnpackUInt8, &fapiMsgBody.pdus[pduCnt].pdu.pusch_pdu.puschUci.betaOffsetHarqAck, mBuf); + CMCHKPK(oduUnpackUInt8, &fapiMsgBody.pdus[pduCnt].pdu.pusch_pdu.puschUci.betaOffsetCsi1, mBuf); + CMCHKPK(oduUnpackUInt8, &fapiMsgBody.pdus[pduCnt].pdu.pusch_pdu.puschUci.betaOffsetCsi2, mBuf); + CMCHKPK(oduUnpackUInt8, &fapiMsgBody.pdus[pduCnt].pdu.pusch_pdu.puschUci.pad[0], mBuf); + CMCHKPK(oduUnpackUInt8, &fapiMsgBody.pdus[pduCnt].pdu.pusch_pdu.puschUci.pad[1], mBuf); + + //Fill fapi_pusch_ptrs_t + CMCHKPK(oduUnpackUInt8, &fapiMsgBody.pdus[pduCnt].pdu.pusch_pdu.puschPtrs.numPtrsPorts, mBuf); + CMCHKPK(oduUnpackUInt8, &fapiMsgBody.pdus[pduCnt].pdu.pusch_pdu.puschPtrs.ptrsTimeDensity, mBuf); + CMCHKPK(oduUnpackUInt8, &fapiMsgBody.pdus[pduCnt].pdu.pusch_pdu.puschPtrs.ptrsFreqDensity, mBuf); + CMCHKPK(oduUnpackUInt8, &fapiMsgBody.pdus[pduCnt].pdu.pusch_pdu.puschPtrs.ulPtrsPower, mBuf); + for(uint8_t portIdx = 0; portIdx < fapiMsgBody.pdus[pduCnt].pdu.pusch_pdu.puschPtrs.numPtrsPorts; portIdx++) + { + CMCHKPK(oduUnpackUInt16, &fapiMsgBody.pdus[pduCnt].pdu.pusch_pdu.puschPtrs.ptrsInfo[portIdx].ptrsPortIndex, mBuf); + CMCHKPK(oduUnpackUInt8, &fapiMsgBody.pdus[pduCnt].pdu.pusch_pdu.puschPtrs.ptrsInfo[portIdx].ptrsDmrsPort, mBuf); + CMCHKPK(oduUnpackUInt8, &fapiMsgBody.pdus[pduCnt].pdu.pusch_pdu.puschPtrs.ptrsInfo[portIdx].ptrsReOffset, mBuf); + } + + //Fill fapi_dfts_ofdm_t + CMCHKPK(oduUnpackUInt16, &fapiMsgBody.pdus[pduCnt].pdu.pusch_pdu.dftsOfdm.lowPaprSequenceNumber, mBuf); + CMCHKPK(oduUnpackUInt8, &fapiMsgBody.pdus[pduCnt].pdu.pusch_pdu.dftsOfdm.lowPaprGroupNumber, mBuf); + CMCHKPK(oduUnpackUInt8, &fapiMsgBody.pdus[pduCnt].pdu.pusch_pdu.dftsOfdm.ulPtrsSampleDensity, mBuf); + CMCHKPK(oduUnpackUInt8, &fapiMsgBody.pdus[pduCnt].pdu.pusch_pdu.dftsOfdm.ulPtrsTimeDensityTransformPrecoding, mBuf); + CMCHKPK(oduUnpackUInt8, &fapiMsgBody.pdus[pduCnt].pdu.pusch_pdu.dftsOfdm.pad, mBuf); + + //Fill fapi_ul_rx_bmform_pdu_t + pnfUnpackUlRxBeamforming(&fapiMsgBody.pdus[pduCnt].pdu.pusch_pdu.beamforming, mBuf); + break; + } + case PUCCH_PDU_TYPE: + { + CMCHKPK(oduUnpackUInt16, &fapiMsgBody.pdus[pduCnt].pdu.pucch_pdu.rnti, mBuf); + CMCHKPK(oduUnpackUInt8, &fapiMsgBody.pdus[pduCnt].pdu.pucch_pdu.pad1[0], mBuf); + CMCHKPK(oduUnpackUInt8, &fapiMsgBody.pdus[pduCnt].pdu.pucch_pdu.pad1[1], mBuf); + CMCHKPK(oduUnpackUInt32, &fapiMsgBody.pdus[pduCnt].pdu.pucch_pdu.handle, mBuf); + CMCHKPK(oduUnpackUInt16, &fapiMsgBody.pdus[pduCnt].pdu.pucch_pdu.bwpSize, mBuf); + CMCHKPK(oduUnpackUInt16, &fapiMsgBody.pdus[pduCnt].pdu.pucch_pdu.bwpStart, mBuf); + CMCHKPK(oduUnpackUInt8, &fapiMsgBody.pdus[pduCnt].pdu.pucch_pdu.subCarrierSpacing, mBuf); + CMCHKPK(oduUnpackUInt8, &fapiMsgBody.pdus[pduCnt].pdu.pucch_pdu.cyclicPrefix, mBuf); + CMCHKPK(oduUnpackUInt8, &fapiMsgBody.pdus[pduCnt].pdu.pucch_pdu.formatType, mBuf); + CMCHKPK(oduUnpackUInt8, &fapiMsgBody.pdus[pduCnt].pdu.pucch_pdu.multiSlotTxIndicator, mBuf); + CMCHKPK(oduUnpackUInt8, &fapiMsgBody.pdus[pduCnt].pdu.pucch_pdu.pi2Bpsk, mBuf); + CMCHKPK(oduUnpackUInt8, &fapiMsgBody.pdus[pduCnt].pdu.pucch_pdu.pad2, mBuf); + CMCHKPK(oduUnpackUInt16, &fapiMsgBody.pdus[pduCnt].pdu.pucch_pdu.prbStart, mBuf); + CMCHKPK(oduUnpackUInt16, &fapiMsgBody.pdus[pduCnt].pdu.pucch_pdu.prbSize, mBuf); + CMCHKPK(oduUnpackUInt8, &fapiMsgBody.pdus[pduCnt].pdu.pucch_pdu.startSymbolIndex, mBuf); + CMCHKPK(oduUnpackUInt8, &fapiMsgBody.pdus[pduCnt].pdu.pucch_pdu.nrOfSymbols, mBuf); + CMCHKPK(oduUnpackUInt8, &fapiMsgBody.pdus[pduCnt].pdu.pucch_pdu.freqHopFlag, mBuf); + CMCHKPK(oduUnpackUInt8, &fapiMsgBody.pdus[pduCnt].pdu.pucch_pdu.groupHopFlag, mBuf); + CMCHKPK(oduUnpackUInt8, &fapiMsgBody.pdus[pduCnt].pdu.pucch_pdu.sequenceHopFlag, mBuf); + CMCHKPK(oduUnpackUInt8, &fapiMsgBody.pdus[pduCnt].pdu.pucch_pdu.pad3, mBuf); + CMCHKPK(oduUnpackUInt16, &fapiMsgBody.pdus[pduCnt].pdu.pucch_pdu.secondHopPrb, mBuf); + CMCHKPK(oduUnpackUInt16, &fapiMsgBody.pdus[pduCnt].pdu.pucch_pdu.hoppingId, mBuf); + CMCHKPK(oduUnpackUInt16, &fapiMsgBody.pdus[pduCnt].pdu.pucch_pdu.initialCyclicShift, mBuf); + CMCHKPK(oduUnpackUInt16, &fapiMsgBody.pdus[pduCnt].pdu.pucch_pdu.dataScramblingId, mBuf); + CMCHKPK(oduUnpackUInt8, &fapiMsgBody.pdus[pduCnt].pdu.pucch_pdu.timeDomainOccIdx, mBuf); + CMCHKPK(oduUnpackUInt8, &fapiMsgBody.pdus[pduCnt].pdu.pucch_pdu.preDftOccIdx, mBuf); + CMCHKPK(oduUnpackUInt8, &fapiMsgBody.pdus[pduCnt].pdu.pucch_pdu.preDftOccLen, mBuf); + CMCHKPK(oduUnpackUInt8, &fapiMsgBody.pdus[pduCnt].pdu.pucch_pdu.addDmrsFlag, mBuf); + CMCHKPK(oduUnpackUInt16, &fapiMsgBody.pdus[pduCnt].pdu.pucch_pdu.dmrsScramblingId, mBuf); + CMCHKPK(oduUnpackUInt8, &fapiMsgBody.pdus[pduCnt].pdu.pucch_pdu.dmrsCyclicShift, mBuf); + CMCHKPK(oduUnpackUInt8, &fapiMsgBody.pdus[pduCnt].pdu.pucch_pdu.srFlag, mBuf); + CMCHKPK(oduUnpackUInt16, &fapiMsgBody.pdus[pduCnt].pdu.pucch_pdu.bitLenHarq, mBuf); + CMCHKPK(oduUnpackUInt8, &fapiMsgBody.pdus[pduCnt].pdu.pucch_pdu.pad4[0], mBuf); + CMCHKPK(oduUnpackUInt8, &fapiMsgBody.pdus[pduCnt].pdu.pucch_pdu.pad4[1], mBuf); + CMCHKPK(oduUnpackUInt16, &fapiMsgBody.pdus[pduCnt].pdu.pucch_pdu.bitLenCsiPart1, mBuf); + CMCHKPK(oduUnpackUInt16, &fapiMsgBody.pdus[pduCnt].pdu.pucch_pdu.bitLenCsiPart2, mBuf); + + //Unpack fapi_ul_rx_bmform_pdu_t + pnfUnpackUlRxBeamforming(&fapiMsgBody.pdus[pduCnt].pdu.pucch_pdu.beamforming, mBuf); + + break; + } + default: + { + DU_LOG("ERROR --> NFAPI_VNF: Incorrect PduType:%d",fapiMsgBody.pdus[pduCnt].pduType); + return; + } + } + } + + pnfProcUlTtiReq(&fapiMsgBody); + + return ROK; +} /********************************************************************************* * * @Function Name: pnfP7MsgHandler @@ -199,18 +514,23 @@ uint8_t pnfP7MsgHandler(Buffer *mBuf) switch(msgHdr.msg_id) { case TAG_NFAPI_DL_NODE_SYNC: - { - DU_LOG("INFO --> NFAPI_PNF: DL_NODE_SYNC recevied."); - ret = pnfDlNodeSyncHandler(mBuf); - break; - } - - case FAPI_DL_TTI_REQUEST: - { - DU_LOG("\nINFO --> NFAPI_PNF: DL_TTI_REQ recevied."); - ret = pnfDlTtiReq(mBuf); - break; - } + { + DU_LOG("INFO --> NFAPI_PNF: DL_NODE_SYNC recevied."); + ret = pnfDlNodeSyncHandler(mBuf); + break; + } + case FAPI_DL_TTI_REQUEST: + { + DU_LOG("\nINFO --> NFAPI_PNF: DL_TTI_REQ recevied."); + ret = pnfDlTtiReq(mBuf); + break; + } + case FAPI_UL_TTI_REQUEST: + { + DU_LOG("\nINFO --> NFAPI_PNF: UL_TTI_REQ recevied."); + ret = pnfUlTtiReq(mBuf); + break; + } default: { DU_LOG("ERROR --> NFAPI_PNF: Wrong MSGID of NFAPI P7 Message:%d",msgHdr.msg_id); diff --git a/src/pnf_stub/pnf_stub_p7_msg_hdl.h b/src/pnf_stub/pnf_stub_p7_msg_hdl.h index 12235d9a2..c24510bb3 100644 --- a/src/pnf_stub/pnf_stub_p7_msg_hdl.h +++ b/src/pnf_stub/pnf_stub_p7_msg_hdl.h @@ -17,8 +17,19 @@ ################################################################################ *******************************************************************************/ +#ifndef _PNF_STUB_P7_MSG_HDL_H_ +#define _PNF_STUB_P7_MSG_HDL_H_ + +#define PDCCH_PDU_TYPE 0 +#define PDSCH_PDU_TYPE 1 +#define SSB_PDU_TYPE 3 +#define PRACH_PDU_TYPE 0 +#define PUSCH_PDU_TYPE 1 +#define PUCCH_PDU_TYPE 2 + uint8_t pnfP7MsgHandler(Buffer *mBuf); +#endif /********************************************************************** End of file **********************************************************************/ -- 2.16.6