/******************************************************************************
*
-* 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.
*
*******************************************************************************/
-
/**
* @brief Definitions and support functions to process XRAN packet
* @file xran_pkt.h
* @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
#ifndef _XRAN_PKT_H_
#define _XRAN_PKT_H_
+#ifdef __cplusplus
+extern "C" {
+#endif
+
#include <rte_common.h>
#include <rte_ether.h>
#include <rte_byteorder.h>
-
/**
*****************************************************************************
* @file xran_pkt.h
#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
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
* @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
/**
******************************************************************************
* 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;
+
/**
******************************************************************************
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
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) */
*****************************************************************************/
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
---------------+-----------------------------+--------------------------------------------
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