O-RAN E Maintenance Release contribution for ODULOW
[o-du/phy.git] / fhi_lib / lib / api / xran_pkt.h
index 112ea41..edf4352 100644 (file)
@@ -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
 #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) \96 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,54 +168,39 @@ 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
+{
+    struct
 {
-    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). */
+    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 common eCPRI delay measuurement header as per
+ *       Table 2.17 : eCPRI One-Way delay measurement message
+ *****************************************************************************/
+struct xran_ecpri_delay_meas_pl
+{
+    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;
 
 /**
@@ -161,15 +208,30 @@ struct xran_ecpri_hdr
  * @ingroup xran_common_pkt
  *
  * @description
- *       Structure holds complete xran packet header
- *       3.1.1 Ethernet Encapsulation
+ *       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_pkt_hdr
+ 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
 {
-    struct ether_hdr eth_hdr; /**< Ethernet Header */
-    struct vlan_hdr vlan_hdr; /**< VLAN Header */
-    struct xran_ecpri_hdr ecpri_hdr; /**< eCPRI Transport Header */
-};
+    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