[Epic-Id: ODUHIGH-576][Task-Id: ODUHIGH-594][SubTask-Id: ODUHIGH-615] | NFAPI_BRANCH... 76/13176/2
authorsvaidhya <svaidhya@radisys.com>
Mon, 15 Jul 2024 08:05:10 +0000 (13:35 +0530)
committersvaidhya <svaidhya@radisys.com>
Wed, 17 Jul 2024 07:50:48 +0000 (13:20 +0530)
Change-Id: I0fc2fa01de4daf1ec3c166713b63c1b43debd0d1
Signed-off-by: svaidhya <svaidhya@radisys.com>
src/5gnrmac/nfapi_p7_msg_hdl.c
src/intel_fapi/nfapi_interface.h
src/pnf_stub/pnf_stub.h
src/pnf_stub/pnf_stub_p7_msg_hdl.c
src/pnf_stub/pnf_stub_p7_msg_hdl.h

index d82a244..353717c 100644 (file)
@@ -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);
index 4497712..938a798 100644 (file)
@@ -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;
 
index d892140..b543030 100644 (file)
 
 #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;
 
index ad10793..0006795 100644 (file)
@@ -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);
index 12235d9..c24510b 100644 (file)
 ################################################################################
 *******************************************************************************/
 
+#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
 **********************************************************************/