Merge "[Epic-ID: ODUHIGH-576][Task-ID: ODUHIGH-579] | Databse Creation"
authorSangeeta Vaidhyanathan <svaidhya@radisys.com>
Mon, 22 Apr 2024 04:56:31 +0000 (04:56 +0000)
committerGerrit Code Review <gerrit@o-ran-sc.org>
Mon, 22 Apr 2024 04:56:31 +0000 (04:56 +0000)
build/odu/makefile
src/5gnrmac/lwr_mac_fsm.c
src/5gnrmac/lwr_mac_nfapi.h [new file with mode: 0644]
src/du_app/du_sctp.c
src/du_app/du_sctp.h
src/intel_fapi/nfapi_interface.h [new file with mode: 0644]

index 8b78b85..e1b0d40 100644 (file)
@@ -74,7 +74,7 @@ endif
 # macro for output file name and makefile name
 #
 
-PLTFRM_FLAGS=-UMSPD -DODU -DINTEL_FAPI -UODU_MEMORY_DEBUG_LOG -DDEBUG_ASN_PRINT -UDEBUG_PRINT -DERROR_PRINT -USTART_DL_UL_DATA -UNR_DRX -UCALL_FLOW_DEBUG_LOG -UODU_SLOT_IND_DEBUG_LOG 
+PLTFRM_FLAGS=-UMSPD -DODU -DINTEL_FAPI -UODU_MEMORY_DEBUG_LOG -DDEBUG_ASN_PRINT -UDEBUG_PRINT -DERROR_PRINT -USTART_DL_UL_DATA -UNR_DRX -UCALL_FLOW_DEBUG_LOG -UODU_SLOT_IND_DEBUG_LOG -UNFAPI_ENABLED
 
 ifeq ($(MODE),TDD)
    PLTFRM_FLAGS += -DNR_TDD
index be9a690..c747827 100644 (file)
@@ -37,6 +37,7 @@
 #include "lwr_mac_phy.h"
 #include "lwr_mac_utils.h"
 #include "mac_utils.h"
+#include "nfapi_interface.h"
 
 #define MIB_SFN_BITMASK 0xFC
 #define PDCCH_PDU_TYPE 0
diff --git a/src/5gnrmac/lwr_mac_nfapi.h b/src/5gnrmac/lwr_mac_nfapi.h
new file mode 100644 (file)
index 0000000..199f5bb
--- /dev/null
@@ -0,0 +1,85 @@
+ /*******************************************************************************
+ ################################################################################
+ #   Copyright (c) [2017-2019] [Radisys]                                        #
+ #                                                                              #
+ #   Licensed under the Apache License, Version 2.0 (the "License");            #
+ #   you may not use this file except in compliance with the License.           #
+ #   You may obtain a copy of the License at                                    #
+ #                                                                              #
+ #       http://www.apache.org/licenses/LICENSE-2.0                             #
+ #                                                                              #
+ #   Unless required by applicable law or agreed to in writing, software        #
+ #   distributed under the License is distributed on an "AS IS" BASIS,          #
+ #   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.   #
+ #   See the License for the specific language governing permissions and        #
+ #   limitations under the License.                                             #
+ ################################################################################
+ *******************************************************************************/
+
+ #ifndef _LWR_MAC_NFAPI_H_
+ #define _LWR_MAC_NFAPI_H_
+
+#include "nfapi_interface.h"
+
+typedef struct nfapiTransportInfo
+{
+   uint32_t         assocId;
+   uint8_t          srcIpv4Address[4];   /*Src :: PNF Address Details*/
+   uint16_t         srcIpv4Port;          
+   uint8_t          destIpv4Address[4];  /*Dest :: VNF Address Details*/
+   uint16_t         destIpv4Port;
+   CmInetFd         sockFd;           /* Socket file descriptor */
+   CmInetNetAddrLst addrLst;      /* Refers to the destinaiton Addr Lst in CmInetNetAddrLst format */
+   CmInetNetAddr    ipNetAddr;    /* Refers to the destination Addr in CmInetNet Addr format */
+   
+   /*TODO: later also add the IPV6 support*/
+
+}NfapiTransportInfo;
+
+typedef struct nfapiTimingInfo
+{
+   uint32_t  dl_tti_offset;
+   uint32_t  ul_tti_offset;
+   uint32_t  ul_dci_offset;
+   uint32_t  tx_data_offset;
+   uint16_t  timingWindow;
+   uint8_t   timingInfoMode;
+
+}NfapiTimingInfo;
+
+typedef struct nfapiPnfConfig
+{
+   nFapi_pnf_state  pnfState;
+   uint16_t         max_phys;
+   NfapiTimingInfo  vnfTimingCfg;
+}NfapiPnfConfig;
+
+typedef struct nfapiSyncInfo
+{
+    uint8_t   phyId;
+    uint8_t   inSync;
+    uint32_t  prev_t1;
+    uint32_t  prev_t2;
+    uint32_t  prev_t3;
+    uint8_t       sfn;
+    uint8_t       slot;
+    NfapiSyncInfo *next;
+}NfapiSyncInfo;
+
+typedef struct nfapiP7VnfInfo
+{
+   uint32_t      sfnStartTime;
+   uint32_t      slotStartTime;
+   NfapiSyncInfo *p7SyncInfo;
+}NfapiP7VnfInfo;
+
+typedef struct nfapiVnfDb
+{
+   NfapiTransportInfo  p5TransInfo;
+   NfapiTransportInfo  p7TransInfo;
+   NfapiPnfConfig      pnfConfig;
+   NfapiSyncInfo       vnfSynchInfo;
+   NfapiP7VnfInfo      vnfP7Info;   
+}NfapiVnfDb;
+
+ #endif
index 6a6d566..f4c7499 100644 (file)
@@ -222,7 +222,6 @@ uint8_t duSctpCfgReq(SctpParams sctpCfg)
    f1Params.destPort             = sctpCfg.cuPort;
    f1Params.itfState             = DU_SCTP_DOWN;
    f1Params.srcPort              = sctpCfg.duPort[F1_INTERFACE];
-   f1Params.recvMsgSet           = ROK;
    memset (&f1Params.sockFd, -1, sizeof(CmInetFd));
    fillDestNetAddr(&f1Params.destIpNetAddr, &f1Params.destIpAddr);
    fillAddrLst(&f1Params.destAddrLst, &f1Params.destIpAddr);
@@ -233,7 +232,6 @@ uint8_t duSctpCfgReq(SctpParams sctpCfg)
    ricParams.destPort            = sctpCfg.ricPort;
    ricParams.itfState            = DU_SCTP_DOWN;
    ricParams.srcPort             = sctpCfg.duPort[E2_INTERFACE];
-   ricParams.recvMsgSet          = ROK;
    memset (&ricParams.sockFd, -1, sizeof(CmInetFd));
    fillDestNetAddr(&ricParams.destIpNetAddr, &ricParams.destIpAddr);
    fillAddrLst(&ricParams.destAddrLst, &ricParams.destIpAddr);
@@ -692,14 +690,14 @@ uint8_t sctpNtfyHdlr(CmInetSctpNotification *ntfy, uint8_t *itfState, uint8_t in
  * @params[in]  Params required for polling
  * @params[in]  SockFd for file descriptor
  * @params[in]  timeoutPtr indicates the timeout value
- * @params[in]  MemInfo, recvMsgSet
+ * @params[in]  MemInfo
  *
  * @return ROK     - success
  *         RFAILED - failure
  *
  * ****************************************************************/
 
-uint8_t  processPolling(sctpSockPollParams *pollParams, CmInetFd *sockFd, uint32_t *timeoutPtr, CmInetMemInfo *memInfo, bool recvMsgSet)
+uint8_t  processPolling(sctpSockPollParams *pollParams, CmInetFd *sockFd, uint32_t *timeoutPtr, CmInetMemInfo *memInfo)
 {
    uint8_t ret = ROK;
    CM_INET_FD_SET(sockFd, &pollParams->readFd);
@@ -712,7 +710,6 @@ uint8_t  processPolling(sctpSockPollParams *pollParams, CmInetFd *sockFd, uint32
       if(ret != ROK)
       {
          DU_LOG("\nERROR   -->  SCTP: Failed to receive sctp msg for sockFd[%d]\n", sockFd->fd);
-         recvMsgSet = RFAILED;
       }
       else
       {
@@ -761,7 +758,7 @@ uint8_t  processPolling(sctpSockPollParams *pollParams, CmInetFd *sockFd, uint32
          }
       }
   }
-  return ROK;
+  return ret;
 }
 /*******************************************************************
  *
@@ -812,14 +809,14 @@ uint8_t sctpSockPoll()
    {
       if(f1Params.itfState)
       {
-         if((ret = processPolling(&f1PollParams, &f1Params.sockFd, timeout_Ptr, &memInfo, f1Params.recvMsgSet)) != ROK)
+         if((ret = processPolling(&f1PollParams, &f1Params.sockFd, timeout_Ptr, &memInfo)) != ROK)
          {
             DU_LOG("\nERROR  -->  SCTP : Failed to RecvMsg for F1\n");
          }
       }
       if(ricParams.itfState)
       {
-         if((ret = processPolling(&e2PollParams, &ricParams.sockFd, timeout_Ptr, &memInfo, ricParams.recvMsgSet)) != ROK)
+         if((ret = processPolling(&e2PollParams, &ricParams.sockFd, timeout_Ptr, &memInfo)) != ROK)
          {
             DU_LOG("\nERROR  -->  SCTP : Failed to RecvMsg for E2\n");
          }
index 94e0c0c..0b5d36f 100644 (file)
@@ -53,7 +53,6 @@ typedef struct
    uint16_t              destPort;         /* Refers to the destination port of F1/E2 */
    uint16_t              srcPort;          /* Refers to respective src port of DU */
    uint32_t              assocId;          
-   bool             recvMsgSet;
    F1IpAddr         destIpAddr;       /* Refers to te destination Ip Address */
    CmInetFd         sockFd;           /* Socket file descriptor */
    CmInetNetAddrLst destAddrLst;      /* Refers to the destinaiton Addr Lst in CmInetNetAddrLst format */
@@ -77,7 +76,7 @@ uint8_t establishReq(DuSctpDestCb *paramPtr);
 uint8_t duSctpAssocReq(uint8_t itfType);
 uint8_t duFillSctpPst(Pst *pst, Event event);
 uint8_t sctpSetSockOpts(CmInetFd *sock_Fd);
-uint8_t processPolling(sctpSockPollParams *pollParams, CmInetFd *sockFd, uint32_t *timeoutPtr, CmInetMemInfo *memInfo, bool recvMsgSet);
+uint8_t processPolling(sctpSockPollParams *pollParams, CmInetFd *sockFd, uint32_t *timeoutPtr, CmInetMemInfo *memInfo);
 uint8_t sctpSockPoll();
 
 #endif
diff --git a/src/intel_fapi/nfapi_interface.h b/src/intel_fapi/nfapi_interface.h
new file mode 100644 (file)
index 0000000..d29c9ef
--- /dev/null
@@ -0,0 +1,464 @@
+ /*******************************************************************************
+ ################################################################################
+ #   Copyright (c) [2017-2019] [Radisys]                                        #
+ #                                                                              #
+ #   Licensed under the Apache License, Version 2.0 (the "License");            #
+ #   you may not use this file except in compliance with the License.           #
+ #   You may obtain a copy of the License at                                    #
+ #                                                                              #
+ #       http://www.apache.org/licenses/LICENSE-2.0                             #
+ #                                                                              #
+ #   Unless required by applicable law or agreed to in writing, software        #
+ #   distributed under the License is distributed on an "AS IS" BASIS,          #
+ #   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.   #
+ #   See the License for the specific language governing permissions and        #
+ #   limitations under the License.                                             #
+ ################################################################################
+ *******************************************************************************/
+
+/*Reference: SCF225_5G_NFAPI_SPECIFICATION, v225.2.1, Issue Date: 23 Nov 2021*/
+
+#ifndef _NFAPI_INTERFACE_H
+#define _NFAPI_INTERFACE_H
+
+#include "fapi_interface.h"
+/*Table 2-7 Dedicated NFAPI message IDs*/
+
+/*P5 Messages*/
+#define NFAPI_PNF_PARAM_REQ    0x0100
+#define NFAPI_PNF_PARAM_RESP   0x0101
+#define NFAPI_PNF_CONFIG_REQ   0x0102
+#define NFAPI_PNF_CONFIG_RESP  0x0103
+#define NFAPI_PNF_START_REQ    0x0104
+#define NFAPI_PNF_START_RESP   0x0105
+#define NFAPI_PNF_STOP_REQ     0x0106
+#define NFAPI_PNF_STOP_RESP    0x0107
+#define NFAPI_START_RESPONSE         0x0108
+#define NFAPI_PNF_READY_IND    0x0109
+
+/*Reserved for P5 Dedicated NFAPI Messages 0x010A - 0x017F */
+
+/*P7 messages*/
+#define NFAPI_DL_NODE_SYNC     0x0180
+#define NFAPI_UL_NODE_SYNC     0x0181
+#define NFAPI_TIMING_INFO      0x0182
+
+/*Reserved for P7 Dedicated NFAPI Messages 0x0183 - 0x01ff*/
+/*RESERVED for Vendor Extension messages 0x0300 - 0x03ff*/
+
+/*Table 3-16 nFAPI TLVs included in PARAM.response and 
+ *Table 3-19 nFAPI TLVs included in CONFIG.request*/
+//PNF and VNF Parameters
+#define NFAPI_P7_VNF_ADD_IPV4              0x0100
+#define NFAPI_P7_VNF_ADD_IPV6              0x0101
+#define NFAPI_P7_VNF_PORT                  0x0102
+#define NFAPI_P7_PNF_ADD_IPV4              0x0103
+#define NFAPI_P7_PNF_ADD_IPV6              0x0104
+#define NFAPI_P7_PNF_PORT                  0x0105
+//TTI Related Parameters
+#define NFAPI_DL_TTI_TIMING_OFFSET         0x0106
+#define NFAPI_UL_TTI_TIMING_OFFSET         0x0107
+#define NFAPI_UL_DCI_TIMING_OFFSET         0x0108
+#define NFAPI_TX_DATA_TIMING_OFFSET        0x0109
+//Timing Related Parameters
+#define NFAPI_TIMING_WINDOW                0x011E
+#define NFAPI_TIMING_INFO_MODE             0x011F
+#define NFAPI_TIMING_INFO_PERIOD           0x0120
+//P7 Transport Related Parameters
+#define NFAPI_P7_IP_FRAGMENTATION_ALLOWED  0x0121
+#define NFAPI_P7_TRANSPORT                 0x0122
+#define NFAPI_P7_PNF_ETHERNET_ADD          0x0123
+#define NFAPI_P7_VNF_ETHERNET_ADD          0x0124
+//CPRI Related Parameters
+#define NFAPI_ECPRI_MSG_TYPE               0x0125
+#define NFAPI_ECPRI_PHY_TRANSPORT_ID       0x0126
+
+#define NFAPI_5G_FAPI_MSG_BODY             0x0F00
+
+/*Table 3-2*/
+#define NFAPI_PNF_PARAM_GENERAL            0x1000 
+
+/*As per Table 3-15 and Table 3-17*/
+#define MAX_NUM_TLV_IN_PARAM_RESP          19
+/*As per Table 3-19*/
+#define MAX_NUM_TLV_IN_CONFIG_REQ          9
+
+typedef enum {
+   PNF_STATE_IDLE = 0,
+   PNF_STATE_CONFIGURED,
+   PNF_STATE_RUNNING
+}nFapi_pnf_state;
+
+/*Table 3-4 and Table 3-7*/
+typedef enum {
+   NFAPI_MSG_OK = 0,
+   NFAPI_MSG_INVALID_STATE,
+   NFAPI_MSG_INVALID_CONFIG
+}nFapi_error_code;
+
+/*Table 3-21: "Timing info mode"*/
+typedef enum {
+   NFAPI_TIMING_INFO_MODE_DISABLE = 0,
+   NFAPI_TIMING_INFO_MODE_PERIODIC,
+   NFAPI_TIMING_INFO_MODE_APERIODIC,
+   NFAPI_TIMING_INFO_MODE_PERIODIC_APERIODIC
+}nFapi_timing_info_mode;
+
+
+/*Table 2-3*/
+typedef struct nFapi_p5_hdr_t{
+   uint16_t seg_len;       /*Segment Length*/
+   uint8_t  more_segNum;   /*Combination of MORE(1 bit = MSB) and SEGMENT NUMBER(7 bits)*/
+   uint8_t  seq_num;       /*Sequence Number*/
+   uint32_t timeStamp;     /*Transit TimeStamp*/
+}nFapi_p5_hdr;
+
+/*Table 2-5*/
+typedef struct nFapi_p7_hdr_t{
+   uint16_t seq_num;       /*Sequence Number*/
+   uint16_t pad;           /*Padding for Byte alignment*/
+   uint32_t tot_SDU_len;   /*Total SDU length*/
+   uint32_t byteOffset;    /*Byte Offset: Offset specifying the start of a segment*/
+   uint32_t timeStamp;     /*Transit TimeStamp*/
+}nFapi_p7_hdr;
+
+/*Table 2-4*/
+typedef struct nFapi_msg_header_t{
+   uint8_t  sRU_termination_type;  /*RU termination Type: 0x01 = P5/P7 msgs*/
+   uint8_t  phy_id;                /*PHY instance: [1..ā€¯Maximum Number Of PHYs]*/
+   uint16_t msg_id;                /*msg ID of FAPI or NFAPI msg*/
+   uint32_t length;                /*len of msg body in octets excluding msg hdr.*/
+}nFapi_msg_header;
+
+typedef struct {
+   uint16_t tag;
+   uint16_t length;
+   void     *value;
+}nFapi_tlv;
+
+//Section 2.1.1 P5 PNF Procedures
+/*Table 3-1*/
+typedef struct nFapi_pnf_ready_ind_t{
+   nFapi_p5_hdr      nFapiP5Hdr;
+   nFapi_msg_header  nFapiMsghdr;
+   uint32_t          versionInfo;
+}nFapi_pnf_ready_ind;
+
+typedef struct nFapi_pnf_param_req_t{
+   nFapi_p5_hdr      nFapiP5Hdr;
+   nFapi_msg_header  nFapiMsghdr;
+}nFapi_pnf_param_req;
+
+/*Table 3-3*/
+typedef struct nFapi_pnf_param_general_t{
+   uint8_t   nFapi_sync_mode;
+   uint8_t   loc_mode;
+   uint8_t   *loc_coordinates; /*Spec 38.455, 'NG-RANAccessPointPosition'*/
+   uint16_t  max_num_phy;
+   uint8_t   oui[3];
+   uint16_t  numRfInstances;
+   uint16_t  numDfeInstances;
+}nFapi_pnf_param_general;
+
+/*Table 3-2*/
+typedef struct nFapi_pnf_param_resp_t{
+   nFapi_p5_hdr      nFapiP5Hdr;
+   nFapi_msg_header  nFapiMsghdr;
+   nFapi_error_code  errCode;
+   uint8_t           numTLVs;
+   nFapi_tlv         tlvs[1]; /*As per Spec only 1 TLV is defined (nFapi_pnf_param_general)*/
+}nFapi_pnf_param_resp;
+
+/*Table 3-5*/
+typedef struct nFapi_pnf_config_req_t{
+   nFapi_p5_hdr      nFapiP5Hdr;
+   nFapi_msg_header  nFapiMsghdr;
+   uint8_t           numTLVs;
+}nFapi_pnf_config_req;
+
+/*Table 3-6*/
+typedef struct nFapi_pnf_config_resp_t{
+   nFapi_p5_hdr      nFapiP5Hdr;
+   nFapi_msg_header  nFapiMsghdr;
+   nFapi_error_code  errCode;
+}nFapi_pnf_config_resp;
+
+typedef struct nFapi_pnf_start_req_t{
+   nFapi_p5_hdr      nFapiP5Hdr;
+   nFapi_msg_header  nFapiMsghdr;
+}nFapi_pnf_start_req;
+
+/*Table 3-9*/
+typedef struct nFapi_pnf_start_resp_t{
+   nFapi_p5_hdr      nFapiP5Hdr;
+   nFapi_msg_header  nFapiMsghdr;
+   nFapi_error_code  errCode;
+}nFapi_pnf_start_resp;
+
+typedef struct nFapi_pnf_stop_req_t{
+   nFapi_p5_hdr      nFapiP5Hdr;
+   nFapi_msg_header  nFapiMsghdr;
+}nFapi_pnf_stop_req;
+
+/*Table 3-10*/
+typedef struct nFapi_pnf_stop_resp_t{
+   nFapi_p5_hdr      nFapiP5Hdr;
+   nFapi_msg_header  nFapiMsghdr;
+   nFapi_error_code  errCode;
+}nFapi_pnf_stop_resp;
+
+//Section 2.1.2 P5 PHY Procedures
+typedef struct nFapi_param_req_t{
+   nFapi_p5_hdr      nFapiP5Hdr;
+   nFapi_msg_header  nFapiMsghdr;
+   uint8_t           *fapiMsgBody; /*SCF222 v222.10.03, Table 3-5*/ 
+}nFapi_param_req;
+
+/*Table 3-14*/
+typedef struct nFapi_param_resp_t{
+   nFapi_p5_hdr      nFapiP5Hdr;
+   nFapi_msg_header  nFapiMsghdr;
+   nFapi_error_code  errCode;
+   uint8_t           numTLVs;
+   nFapi_tlv         tlvs[MAX_NUM_TLV_IN_PARAM_RESP];
+}nFapi_param_resp;
+
+/*Table 3-18*/
+typedef struct nFapi_config_req_t{
+   nFapi_p5_hdr      nFapiP5Hdr;
+   nFapi_msg_header  nFapiMsghdr;
+   uint8_t           numTLVs;
+   nFapi_tlv         tlvs[MAX_NUM_TLV_IN_CONFIG_REQ];
+}nFapi_config_req;
+
+typedef struct nFapi_config_resp_t{
+   nFapi_p5_hdr      nFapiP5Hdr;
+   nFapi_msg_header  nFapiMsghdr;
+   uint8_t           *fapiMsgBody; /*SCF222 v222.10.03, Table 3-27*/ 
+}nFapi_config_resp;
+
+typedef struct nFapi_start_req_t{
+   nFapi_p5_hdr      nFapiP5Hdr;
+   nFapi_msg_header  nFapiMsghdr;
+   uint8_t           *fapiMsgBody; /*SCF222 v222.10.03, Sec 3.3.4.1*/
+}nFapi_start_req;
+
+/*Table 3-12*/
+typedef struct nFapi_start_resp_t{
+   nFapi_p5_hdr      nFapiP5Hdr;
+   nFapi_msg_header  nFapiMsghdr;
+   nFapi_error_code  errCode;
+}nFapi_start_resp;
+
+typedef struct nFapi_error_ind_t{
+   nFapi_p5_hdr      nFapiP5Hdr;
+   nFapi_msg_header  nFapiMsghdr;
+   uint8_t           *fapiMsgBody; /*SCF222 v222.10.03, Sec 3.3.6.1*/
+}nFapi_error_ind;
+
+typedef struct nFapi_stop_req_t{
+   nFapi_p5_hdr      nFapiP5Hdr;
+   nFapi_msg_header  nFapiMsghdr;
+   uint8_t           *fapiMsgBody; /*SCF222 v222.10.03, Sec 3.3.5.1*/
+}nFapi_stop_req;
+
+typedef struct nFapi_stop_ind_t{
+   nFapi_p5_hdr      nFapiP5Hdr;
+   nFapi_msg_header  nFapiMsghdr;
+   uint8_t           *fapiMsgBody; /*SCF222 v222.10.03, Sec 3.3.5.2*/
+}nFapi_stop_ind;
+
+//P7 Procedures
+/*Table 4-1*/
+typedef struct nFapi_dl_node_sync_info_t{
+   uint32_t t1;   /*In micro-sec, timeDiff between [VNF's SFN 0/0] and [DL NodeSYnc Tx time]*/
+   int32_t  delta_sfnSlot;
+   uint8_t  scs;
+}nFapi_dl_node_sync_info;
+
+typedef struct nFapi_dl_node_sync_t{
+   nFapi_p7_hdr             nFapiP7Hdr;
+   nFapi_msg_header         nFapiMsghdr;
+   nFapi_dl_node_sync_info  dlNodeSyncInfo;
+}nFapi_dl_node_sync;
+
+/*Table 4-2*/
+typedef struct nFapi_ul_node_sync_info_t{
+   uint32_t t1;   /*In micro-sec, timeDiff between [VNF's SFN 0/0] and [DL NodeSYnc Tx time]*/
+   uint32_t t2;   /*In micro-sec, timeDiff between [PNF's SFN 0/0] and [DL NodeSYnc Rx time]*/
+   uint32_t t3;   /*In micro-sec, timeDiff between [PNF's SFN 0/0] and [UL NodeSYnc Tx time]*/
+}nFapi_ul_node_sync_info;
+
+typedef struct nFapi_ul_node_sync_t{
+   nFapi_p7_hdr             nFapiP7Hdr;
+   nFapi_msg_header         nFapiMsghdr;
+   nFapi_ul_node_sync_info  ulNodeSyncInfo;
+}nFapi_ul_node_sync;
+
+/*Table 4-3*/
+typedef struct nFapi_timing_parameter_t{
+   uint16_t lastSFN;
+   uint16_t lastSlot;
+   uint32_t time_elapsed; /*In ms, Time since the last timing Info*/
+   uint32_t dl_tti_jitter;  /*Units: micro-sec(ms)*/
+   uint32_t tx_data_jitter; /*Units: ms*/
+   uint32_t ul_tti_jitter;  /*Units: ms*/
+   uint32_t ul_dci_jitter;  /*Units: ms*/
+   int32_t  dl_tti_latest_delay; /*Units: ms*/
+   int32_t  tx_data_latest_delay;
+   int32_t  ul_tti_latest_delay; /*Units: ms*/
+   int32_t  ul_dci_latest_delay; /*Units: ms*/
+   int32_t  dl_tti_early_arr; /*Units: ms*/
+   int32_t  tx_data_early_arr; /*Units: ms*/
+   int32_t  ul_tti_early_arr; /*Units: ms*/
+   int32_t  ul_dci_early_arr; /*Units: ms*/
+   uint8_t  subCarrierSpacing;
+}nFapi_timing_parameter;
+
+typedef struct nFapi_timing_info_t{
+   nFapi_p7_hdr             nFapiP7Hdr;
+   nFapi_msg_header         nFapiMsghdr;
+   nFapi_timing_parameter   timingParam;
+}nFapi_timing_info;
+
+/*SCF222 v222.10.03, Table 3-54*/
+typedef struct fapi_dl_tti_req_msg_body_t{
+   uint16_t sfn;
+   uint16_t slot;
+   uint8_t nPdus;
+   uint8_t nGroup;
+   uint8_t pad[2];
+   fapi_dl_tti_req_pdu_t pdus[FAPI_MAX_PDUS_PER_SLOT]; // 5G FAPI Table 3-35
+   fapi_ue_info_t ue_grp_info[FAPI_MAX_NUMBER_OF_GROUPS_PER_TTI];
+}fapi_dl_tti_req_msg_body;
+
+typedef struct nFapi_dl_tti_req_t{
+   nFapi_p7_hdr              nFapiP7Hdr;
+   nFapi_msg_header          nFapiMsghdr;
+   fapi_dl_tti_req_msg_body  fapiMsgBody;
+}nFapi_dl_tti_req;
+
+typedef struct nFapi_dl_tti_resp_t{
+   nFapi_p7_hdr       nFapiP7Hdr;
+   nFapi_msg_header   nFapiMsghdr;
+   uint8_t            *fapiMsgBody; /*TODO: In fapi_interface.h, dl_tti_resp not present*/
+}nFapi_dl_tti_resp;
+
+typedef struct fapi_ul_tti_req_msg_body_t{
+   uint16_t sfn;
+   uint16_t slot;
+   uint8_t nPdus;
+   uint8_t rachPresent;
+   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;
+
+typedef struct nFapi_ul_tti_req_t{
+   nFapi_p7_hdr              nFapiP7Hdr;
+   nFapi_msg_header          nFapiMsghdr;
+   fapi_ul_tti_req_msg_body  fapiMsgBody;
+}nFapi_ul_tti_req;
+
+typedef struct fapi_ul_dci_req_msg_body_t{
+   uint16_t sfn;
+   uint16_t slot;
+   uint8_t numPdus;
+   uint8_t pad[3];
+   fapi_dci_pdu_t pdus[FAPI_MAX_NUMBER_UCI_PDUS_PER_SLOT]; // 5G FAPI Table 3-54
+}fapi_ul_dci_req_msg_body;
+
+typedef struct nFapi_ul_dci_req_t{
+   nFapi_p7_hdr              nFapiP7Hdr;
+   nFapi_msg_header          nFapiMsghdr;
+   fapi_ul_dci_req_msg_body  fapiMsgBody;
+}nFapi_ul_dci_req;
+
+typedef struct fapi_tx_data_req_msg_body_t{ 
+   uint16_t sfn;
+   uint16_t slot;
+   uint16_t num_pdus;
+   uint8_t pad[2];
+   fapi_tx_pdu_desc_t pdu_desc[FAPI_MAX_NUMBER_DL_PDUS_PER_TTI];   // 5G FAPI Table 3-58
+}fapi_tx_data_req_msg_body;
+
+typedef struct nFapi_tx_data_req_t{
+   nFapi_p7_hdr               nFapiP7Hdr;
+   nFapi_msg_header           nFapiMsghdr;
+   fapi_tx_data_req_msg_body  fapiMsgBody;
+}nFapi_tx_data_req;
+
+typedef struct fapi_rx_data_ind_msg_body_t{
+   uint16_t sfn;
+   uint16_t slot;
+   uint16_t numPdus;
+   uint8_t pad[2];
+   fapi_pdu_ind_info_t pdus[FAPI_MAX_NUMBER_OF_ULSCH_PDUS_PER_SLOT];   // 5G FAPI Table 3-61
+}fapi_rx_data_ind_msg_body;
+
+typedef struct nFapi_rx_data_ind_t{
+   nFapi_p7_hdr               nFapiP7Hdr;
+   nFapi_msg_header           nFapiMsghdr;
+   fapi_rx_data_ind_msg_body  fapiMsgBody;
+}nFapi_rx_data_ind;
+
+typedef struct fapi_crc_ind_msg_body_t{
+   uint16_t sfn;
+   uint16_t slot;
+   uint16_t numCrcs;
+   uint8_t pad[2];
+   fapi_crc_ind_info_t crc[FAPI_MAX_NUMBER_OF_CRCS_PER_SLOT];  // 5G FAPI Table 3-62
+}fapi_crc_ind_msg_body;
+
+typedef struct nFapi_crc_ind_t{
+   nFapi_p7_hdr           nFapiP7Hdr;
+   nFapi_msg_header       nFapiMsghdr;
+   fapi_crc_ind_msg_body  fapiMsgBody;
+}nFapi_crc_ind;
+
+typedef struct fapi_uci_ind_msg_body_t{
+   uint16_t sfn;
+   uint16_t slot;
+   uint16_t numUcis;       // 5G FAPI Table 3-63
+   uint8_t pad[2];
+   fapi_uci_pdu_info_t uciPdu[FAPI_MAX_NUMBER_UCI_PDUS_PER_SLOT];
+}fapi_uci_ind_msg_body;
+
+typedef struct nFapi_uci_ind_t{
+   nFapi_p7_hdr           nFapiP7Hdr;
+   nFapi_msg_header       nFapiMsghdr;
+   fapi_uci_ind_msg_body  fapiMsgBody;
+}nFapi_uci_ind;
+
+typedef struct fapi_srs_ind_msg_body_t{
+   uint16_t sfn;
+   uint16_t slot;
+   uint8_t numPdus;
+   uint8_t pad[3];
+   fapi_srs_pdu_t srsPdus[FAPI_MAX_NUMBER_SRS_PDUS_PER_SLOT];  // 5G FAPI Table 3-73
+}fapi_srs_ind_msg_body;
+
+typedef struct nFapi_srs_ind_t{
+   nFapi_p7_hdr           nFapiP7Hdr;
+   nFapi_msg_header       nFapiMsghdr;
+   fapi_srs_ind_msg_body  fapiMsgBody;
+}nFapi_srs_ind;
+
+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;
+
+typedef struct nFapi_rach_ind_t{
+   nFapi_p7_hdr           nFapiP7Hdr;
+   nFapi_msg_header       nFapiMsghdr;
+   fapi_rach_ind_msg_body  fapiMsgBody;
+}nFapi_rach_ind;
+
+#endif