X-Git-Url: https://gerrit.o-ran-sc.org/r/gitweb?a=blobdiff_plain;f=fhi_lib%2Flib%2Fapi%2Fxran_pkt.h;h=314b8d6b7d08f153369de5ad535702f50a574a35;hb=HEAD;hp=112ea41a197b770742ff2f166849b3495ebe0aaf;hpb=4745e5c88ba931c6d71cb6d8c681f76cf364eac5;p=o-du%2Fphy.git diff --git a/fhi_lib/lib/api/xran_pkt.h b/fhi_lib/lib/api/xran_pkt.h index 112ea41..314b8d6 100644 --- a/fhi_lib/lib/api/xran_pkt.h +++ b/fhi_lib/lib/api/xran_pkt.h @@ -1,6 +1,6 @@ /****************************************************************************** * -* Copyright (c) 2019 Intel. +* Copyright (c) 2020 Intel. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -16,7 +16,6 @@ * *******************************************************************************/ - /** * @brief Definitions and support functions to process XRAN packet * @file xran_pkt.h @@ -24,7 +23,9 @@ * @author Intel Corporation **/ -/* XRAN-FH.CUS.0-v02.01.03 xRAN Front haul Working Group Control, User and Synchronization Plane Specification */ +/* ORAN-WG4.CUS.0-v01.00 O-RAN Fronthaul Working Group + Control, User and Synchronization Plane Specification +*/ /* * Layer common to data and control packets @@ -33,11 +34,14 @@ #ifndef _XRAN_PKT_H_ #define _XRAN_PKT_H_ +#ifdef __cplusplus +extern "C" { +#endif + #include #include #include - /** ***************************************************************************** * @file xran_pkt.h @@ -60,6 +64,19 @@ #define VLAN_ID 0 /**< Default Tag protocol identifier (TPID)*/ #define VLAN_PCP 7 /**< U-Plane and C-Plane only see Table 3 5 : Quality of service classes */ +#define XRAN_MTU_DEFAULT RTE_ETHER_MTU +#define XRAN_APP_LAYER_MAX_SIZE_L2_DEFAUT (XRAN_MTU_DEFAULT - 8) /**< In case of L2 only solution, application layer maximum transmission unit size + is standard IEEE 802.3 Ethernet frame payload + size (1500 bytes) ? transport overhead (8 bytes) = 1492 bytes (or larger for Jumbo frames) */ + +#ifndef OK +#define OK 0 /* Function executed correctly */ +#endif +#ifndef FAIL +#define FAIL 1 /* Function failed to execute */ +#endif +#define NS_PER_SEC 1000000000LL + /** ****************************************************************************** * @ingroup xran_common_pkt @@ -83,6 +100,41 @@ enum ecpri_msg_type ECPRI_MSG_TYPE_MAX }; +/** + ****************************************************************************** + * @ingroup xran_common_pkt + * + * @description + * eCPRI Timestamp for one-way delay measurements format per IEEE-1588 + * clause 5.3.3. + *****************************************************************************/ + +typedef struct { + uint16_t secs_msb; // 6 bytes for seconds + uint32_t secs_lsb; + uint32_t ns; // 4 bytes for nanoseconds + } TimeStamp; + + +/** + ****************************************************************************** + * @ingroup xran_common_pkt + * + * @description + * eCPRI action types + * as per eCPRI spec Table 8 action Types + *****************************************************************************/ +enum ecpri_action_type +{ + ECPRI_REQUEST = 0x00, /* Uses Time Stamp T1 and Comp Delay 1 */ + ECPRI_REQUEST_W_FUP = 0x01, /* Uses 0 for Time Stamp and Comp Delay 1 */ + ECPRI_RESPONSE = 0x02, /* Uses Time Stamp T2 and Comp Delay 2 */ + ECPRI_REMOTE_REQ = 0x03, /* Uses 0 for Time Stamp and Comp Delay */ + ECPRI_REMOTE_REQ_W_FUP = 0x04, /* Uses 0 for Time Stamp and Comp Delay */ + ECPRI_FOLLOW_UP = 0x05, /* Uses Time Info and Comp Delay Info */ + ECPRI_ACTION_TYPE_MAX +}; + /** ****************************************************************************** * @ingroup xran_common_pkt @@ -90,13 +142,23 @@ enum ecpri_msg_type * @description * see 3.1.3.1.7 ecpriSeqid (message identifier) *****************************************************************************/ -struct ecpri_seq_id +union ecpri_seq_id +{ + struct { - uint8_t seq_id:8; /**< Sequence ID */ - uint8_t sub_seq_id:7; /**< Subsequence ID */ - uint8_t e_bit:1; /**< E bit */ + uint8_t seq_id:8; /**< Sequence ID */ + uint8_t sub_seq_id:7; /**< Subsequence ID */ + uint8_t e_bit:1; /**< E bit */ + } bits; + struct + { + uint16_t data_num_1; + } data; } __rte_packed; +#define ecpri_seq_id_bitfield_seq_id 0 +#define ecpri_seq_id_bitfield_sub_seq_id 8 +#define ecpri_seq_id_bitfield_e_bit 15 /** ****************************************************************************** @@ -106,70 +168,70 @@ struct ecpri_seq_id * Structure holds common eCPRI header as per * Table 3 1 : eCPRI Transport Header Field Definitions *****************************************************************************/ -struct xran_ecpri_hdr +union xran_ecpri_cmn_hdr { - uint8_t ecpri_concat:1; /**< This parameter indicates when eCPRI concatenation is in use - (allowing multiple eCPRI messages in a single Ethernet payload). - NOTE: This parameter is part of the eCPRI common header. */ - uint8_t ecpri_resv:3; /**< This parameter is reserved for eCPRI future use. - NOTE: This parameter is part of the eCPRI common header. */ - uint8_t ecpri_ver:4; /**< This parameter indicates the eCPRI protocol version. - NOTE: This parameter is part of the eCPRI common header. */ - uint8_t ecpri_mesg_type:8; /**< This parameter indicates the type of service conveyed by - the message type. NOTE: This parameter is part of the eCPRI - common header. NOTE: In this version of the specification, - only values "0000 0000b" and "0000 0010b" and "0000 0101b" are used. */ - rte_be16_t ecpri_payl_size:16; /**< This parameter is the size in bytes of the payload part - of the corresponding eCPRI message. It does not include any padding bytes - following the eCPRI message. The maximum supported payload size is 216-1, - but the actual size may be further limited by the maximum payload size of - the underlying transport network. NOTE: This parameter is part of the - eCPRI common header. */ - - rte_be16_t ecpri_xtc_id; /**< 3.1.3.1.6 This parameter is a component_eAxC identifier (c_eAxC ID) and - identifies the specific data flow associated with each C-Plane (ecpriRtcid) or - U-Plane (ecpriPcid) message. It is the analog of CPRI's "AxC" (antenna-carrier) - value so is designated here as "eAxC" ("e" for "extended" to accommodate multiple - bands and multiple component carriers). In addition, the "eAxC" is divided into - "component eAxC" parts (c_eAxC) because multiple lls-CU processors may contribute - to a single eAxC and must be identified for correct data routing. */ - - struct ecpri_seq_id ecpri_seq_id; /**< This parameter provides unique message identification and ordering on - two different levels. The first octet of this parameter is the Sequence ID, which is used to identify ordering of - messages within an eAxC message stream. The Sequence ID field increments and wraps independently for each U-Plane - eAxC DL, U-Plane eAxC UL, C-Plane eAxC DL, and C-Plane eAxC UL, even if they share the same eAxC ID. - The Sequence ID is used to verify that all messages are received and also to reorder messages that are received out of order. - The second octet of this parameter is the Subsequence ID. The Subsequence ID is used to verify ordering and implement - reordering when radio-transport-level (eCPRI or IEEE-1914.3) fragmentation occurs. - Radio-transport (eCPRI or IEEE-1914.3) fragmentation is a method of splitting U-plane messages containing one or - more sections whose length exceeds the maximum packet or message length of the underlying protocol. - The Subsequence ID field consists of a 7 bit Subsequence counter and a single bit field, called E-bit. - The Subsequence number increments starting from zero for each fragment of a U-plane message. The E bit - is used to indicate the last message of the radio-transport level fragments. It is always set to zero - except for the last message of the U-plane fragment. In the case of C-plane messages radio-transport - fragmentation is not allowed, therefore the Subsequence ID shall be set to zero, and the E bit set to one. - See Section 3.1.4 for a description of the fragmentation process. - NOTE: As an alternative to radio-transport-level fragmentation, application fragmentation can be implemented. - In this case the application can take the responsibility to ensure all transport messages are not too long - (fit within the necessary transport payload size). When this "application layer fragmentation" is used, - the subsequence identifier shall always be set to "0", and the E-bit set to "1" (See Section 3.1.4). */ - + struct +{ + uint8_t ecpri_concat:1; /**< 3.1.3.1.3 eCPRI concatenation indicator */ + uint8_t ecpri_resv:3; /**< 3.1.3.1.2 eCPRI reserved */ + uint8_t ecpri_ver:4; /**< 3.1.3.1.1 eCPRI protocol revision, defined in XRAN_ECPRI_VER */ + uint8_t ecpri_mesg_type; /**< 3.1.3.1.4 eCPRI message type, defined in ecpri_msg_type */ + uint16_t ecpri_payl_size; /**< 3.1.3.1.5 eCPRI payload size, without common header and any padding bytes */ + } bits; + struct + { + uint32_t data_num_1; + } data; } __rte_packed; +#define xran_ecpri_cmn_hdr_bitfield_EcpriVer 4 +#define xran_ecpri_cmn_hdr_bitfield_EcpriMsgType 8 /** ****************************************************************************** * @ingroup xran_common_pkt * * @description - * Structure holds complete xran packet header - * 3.1.1 Ethernet Encapsulation + * Structure holds common eCPRI delay measuurement header as per + * Table 2.17 : eCPRI One-Way delay measurement message *****************************************************************************/ -struct xran_pkt_hdr +struct xran_ecpri_delay_meas_pl { - struct ether_hdr eth_hdr; /**< Ethernet Header */ - struct vlan_hdr vlan_hdr; /**< VLAN Header */ - struct xran_ecpri_hdr ecpri_hdr; /**< eCPRI Transport Header */ -}; + uint8_t MeasurementID; /**< Table 2-17 Octet 5 */ + uint8_t ActionType; /**< Table 2-17 Octet 6 */ + TimeStamp ts; /**< Table 2-17 Octet 7-16 */ + int64_t CompensationValue; /**< Table 2-17 Octet 17 */ + uint8_t DummyBytes[1400]; /**< Table 2-17 Octet 25 */ +} /*__rte_packed*/; + +/** + ****************************************************************************** + * @ingroup xran_common_pkt + * + * @description + * Structure holds common eCPRI cmn header per eCPRI figure 8 and the measurement delay header and pl per + * eCPRI Figure 23 : eCPRI One-Way delay measurement message + *****************************************************************************/ + struct xran_ecpri_del_meas_pkt + { + union xran_ecpri_cmn_hdr cmnhdr; + struct xran_ecpri_delay_meas_pl deMeasPl; + }/*__rte_packed*/; + +/** + ****************************************************************************** + * @ingroup xran_common_pkt + * + * @description + * Structure holds eCPRI transport header as per + * Table 3 1 : eCPRI Transport Header Field Definitions + *****************************************************************************/ +struct xran_ecpri_hdr +{ + union xran_ecpri_cmn_hdr cmnhdr; + rte_be16_t ecpri_xtc_id; /**< 3.1.3.1.6 real time control data / IQ data transfer message series identifier */ + union ecpri_seq_id ecpri_seq_id; /**< 3.1.3.1.7 message identifier */ +} __rte_packed; + /** ****************************************************************************** @@ -198,6 +260,9 @@ enum xran_pkt_dir struct radio_app_common_hdr { /* Octet 9 */ + union { + uint8_t value; + struct { uint8_t filter_id:4; /**< This parameter defines an index to the channel filter to be used between IQ data and air interface, both in DL and UL. For most physical channels filterIndex =0000b is used which @@ -207,6 +272,8 @@ struct radio_app_common_hdr for the following IEs in the application layer. In this version of the specification payloadVersion=001b shall be used. */ uint8_t data_direction:1; /**< This parameter indicates the gNB data direction. */ + }; + }data_feature; /* Octet 10 */ uint8_t frame_id:8; /**< This parameter is a counter for 10 ms frames (wrapping period 2.56 seconds) */ @@ -241,11 +308,6 @@ struct radio_app_common_hdr *****************************************************************************/ struct compression_hdr { - uint8_t ud_iq_width:4; /**< Bit width of each I and each Q - 16 for udIqWidth=0, otherwise equals udIqWidth e.g. udIqWidth = 0000b means I and Q are each 16 bits wide; - e.g. udIQWidth = 0001b means I and Q are each 1 bit wide; - e.g. udIqWidth = 1111b means I and Q are each 15 bits wide - */ uint8_t ud_comp_meth:4; /**< udCompMeth| compression method |udIqWidth meaning ---------------+-----------------------------+-------------------------------------------- @@ -256,6 +318,29 @@ struct compression_hdr 0100b | modulation compression |bitwidth of each compressed I and Q value 0100b - 1111b | reserved for future methods |depends on the specific compression method */ + uint8_t ud_iq_width:4; /**< Bit width of each I and each Q + 16 for udIqWidth=0, otherwise equals udIqWidth e.g. udIqWidth = 0000b means I and Q are each 16 bits wide; + e.g. udIQWidth = 0001b means I and Q are each 1 bit wide; + e.g. udIqWidth = 1111b means I and Q are each 15 bits wide + */ +} __rte_packed; + +/** + ****************************************************************************** + * @ingroup xran_common_pkt + * + * @description + * Structure holds common xran packet header + * 3.1.1 Ethernet Encapsulation + *****************************************************************************/ +struct xran_pkt_comm_hdr +{ + struct rte_ether_hdr eth_hdr; /**< Ethernet Header */ + struct xran_ecpri_hdr ecpri_hdr; /**< eCPRI Transport Header */ } __rte_packed; +#ifdef __cplusplus +} +#endif + #endif