+ /*******************************************************************************
+ ################################################################################
+ # 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