--- /dev/null
+/******************************************************************************
+*
+* Copyright (c) 2019 Intel.
+*
+* 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.
+*
+*******************************************************************************/
+
+
+/**
+ * @brief This file provides the definition of Control Plane Messages
+ * for XRAN Front Haul layer as defined in XRAN-FH.CUS.0-v02.01.
+ *
+ * @file xran_pkt_cp.h
+ * @ingroup group_lte_source_xran
+ * @author Intel Corporation
+ *
+ **/
+
+#ifndef _XRAN_PKT_CP_H_
+#define _XRAN_PKT_CP_H_
+
+
+/**********************************************************************
+ * Common structures for C/U-plane
+ **********************************************************************/
+/**
+ * @ingroup xran_cp_pkt
+ *
+ * @description
+ * user data compression header defined in 5.4.4.10 / 6.3.3.13
+ */
+struct xran_radioapp_udComp_header {
+ uint8_t udCompMeth:4; /**< Compression method, XRAN_COMPMETHOD_xxxx */
+ uint8_t udIqWidth:4; /**< IQ bit width, 1 ~ 16 */
+ } __attribute__((__packed__));
+
+
+/**********************************************************************
+ * Definition of C-Plane Protocol 5.4
+ **********************************************************************/
+/**
+ * @ingroup xran_cp_pkt
+ *
+ * @description
+ * Common Radio Application Header for C-Plane
+ */
+struct xran_cp_radioapp_common_header { /* 6bytes, first 4bytes need the conversion for byte order */
+ uint32_t startSymbolId:6; /**< 5.4.4.7 start symbol identifier */
+ uint32_t slotId:6; /**< 5.4.4.6 slot identifier */
+ uint32_t subframeId:4; /**< 5.4.4.5 subframe identifier */
+ uint32_t frameId:8; /**< 5.4.4.4 frame identifier */
+ uint32_t filterIndex:4; /**< 5.4.4.3 filter index, XRAN_FILTERINDEX_xxxx */
+ uint32_t payloadVer:3; /**< 5.4.4.2 payload version, should be 1 */
+ uint32_t dataDirection:1; /**< 5.4.4.1 data direction (gNB Tx/Rx) */
+ uint8_t numOfSections; /**< 5.4.4.8 number of sections */
+ uint8_t sectionType; /**< 5.4.4.9 section type */
+ } __attribute__((__packed__));
+
+/**
+ * @ingroup xran_cp_pkt
+ *
+ * @description
+ * frame structure defined in 5.4.4.13
+ */
+struct xran_cp_radioapp_frameStructure {
+ uint8_t uScs:4; /**< sub-carrier spacing, XRAN_SCS_xxx */
+ uint8_t fftSize:4; /**< FFT size, XRAN_FFTSIZE_xxx */
+ } __attribute__((__packed__));
+
+/**
+ * @ingroup xran_cp_pkt
+ *
+ * @description
+ * Section headers definition for C-Plane.
+ * Section type 6 and 7 are not present since those have different fields.
+ */
+struct xran_cp_radioapp_section_header { // 8bytes, need the conversion for byte order
+ union {
+ struct {
+ uint32_t reserved:16;
+ uint32_t numSymbol:4; /**< 5.4.5.7 number of symbols */
+ uint32_t reMask:12; /**< 5.4.5.5 resource element mask */
+ } s0;
+ struct {
+ uint32_t beamId:15; /**< 5.4.5.9 beam identifier */
+ uint32_t ef:1; /**< 5.4.5.8 extension flag */
+ uint32_t numSymbol:4; /**< 5.4.5.7 number of symbols */
+ uint32_t reMask:12; /**< 5.4.5.5 resource element mask */
+ } s1;
+ struct {
+ uint32_t beamId:15; /**< 5.4.5.9 beam identifier */
+ uint32_t ef:1; /**< 5.4.5.8 extension flag */
+ uint32_t numSymbol:4; /**< 5.4.5.7 number of symbols */
+ uint32_t reMask:12; /**< 5.4.5.5 resource element mask */
+ } s3;
+ struct {
+ uint32_t ueId:15; /**< 5.4.5.10 UE identifier */
+ uint32_t ef:1; /**< 5.4.5.8 extension flag */
+ uint32_t numSymbol:4; /**< 5.4.5.7 number of symbols */
+ uint32_t reMask:12; /**< 5.4.5.5 resource element mask */
+ } s5;
+ } u;
+
+ uint32_t numPrbc:8; /**< 5.4.5.6 number of contiguous PRBs per control section */
+ uint32_t startPrbc:10; /**< 5.4.5.4 starting PRB of control section */
+ uint32_t symInc:1; /**< 5.4.5.3 symbol number increment command XRAN_SYMBOLNUMBER_xxxx */
+ uint32_t rb:1; /**< 5.4.5.2 resource block indicator, XRAN_RBIND_xxx */
+ uint32_t sectionId:12; /**< 5.4.5.1 section identifier */
+ } __attribute__((__packed__));
+
+
+/**********************************************************
+ * Scheduling and Beam-forming Commands 5.4.2
+ **********************************************************/
+/**
+ * @ingroup xran_cp_pkt
+ *
+ * @description
+ * Section header definition for type 0
+ */
+struct xran_cp_radioapp_section0_header { // 12bytes (6+2+1+2+1)
+ struct xran_cp_radioapp_common_header cmnhdr;
+ uint16_t timeOffset; /**< 5.4.4.12 time offset */
+
+ struct xran_cp_radioapp_frameStructure frameStructure;
+ uint16_t cpLength; /**< 5.4.4.14 cyclic prefix length */
+ uint8_t reserved;
+ } __attribute__((__packed__));
+
+/**
+ * @ingroup xran_cp_pkt
+ *
+ * @description
+ * Section definition for type 0: Unused RB or Symbols in DL or UL (Table 5-2)
+ * Not supported in this release
+ */
+struct xran_cp_radioapp_section0 { // 8bytes (4+4)
+ struct xran_cp_radioapp_section_header hdr;
+ } __attribute__((__packed__));
+
+/**
+ * @ingroup xran_cp_pkt
+ *
+ * @description
+ * Section header definition for type 1
+ */
+struct xran_cp_radioapp_section1_header { // 8bytes (6+1+1)
+ struct xran_cp_radioapp_common_header cmnhdr;
+ struct xran_radioapp_udComp_header udComp;
+ uint8_t reserved;
+ } __attribute__((__packed__));
+
+/**
+ * @ingroup xran_cp_pkt
+ *
+ * @description
+ * Section definition for type 1: Most DL/UL Radio Channels (Table 5-3)
+ */
+struct xran_cp_radioapp_section1 { // 8bytes (4+4)
+ struct xran_cp_radioapp_section_header hdr;
+
+ // section extensions // 5.4.6 & 5.4.7
+ // .........
+ } __attribute__((__packed__));
+
+/**
+ * @ingroup xran_cp_pkt
+ *
+ * @description
+ * Section header definition for type 3
+ */
+struct xran_cp_radioapp_section3_header { // 12bytes (6+2+1+2+1)
+ struct xran_cp_radioapp_common_header cmnhdr;
+ uint16_t timeOffset; /**< 5.4.4.12 time offset */
+
+ struct xran_cp_radioapp_frameStructure frameStructure;
+ uint16_t cpLength; /**< 5.4.4.14 cyclic prefix length */
+ struct xran_radioapp_udComp_header udComp;
+ } __attribute__((__packed__));
+
+/**
+ * @ingroup xran_cp_pkt
+ *
+ * @description
+ * Section definition for type 3: PRACH and Mixed-numerology Channels (Table 5-4)
+ */
+struct xran_cp_radioapp_section3 { // 12bytes (4+4+4)
+ struct xran_cp_radioapp_section_header hdr;
+ uint32_t freqOffset:24; /**< 5.4.5.11 frequency offset */
+ uint32_t reserved:8;
+
+ // section extensions // 5.4.6 & 5.4.7
+ // .........
+ } __attribute__((__packed__));
+
+/**
+ * @ingroup xran_cp_pkt
+ *
+ * @description
+ * Section header definition for type 5
+ */
+struct xran_cp_radioapp_section5_header { // 8bytes (6+1+1)
+ struct xran_cp_radioapp_common_header cmnhdr;
+ struct xran_radioapp_udComp_header udComp;
+ uint8_t reserved;
+ } __attribute__((__packed__));
+
+/**
+ * @ingroup xran_cp_pkt
+ *
+ * @description
+ * Section definition for type 5: UE scheduling information (Table 5-5)
+ * Not supported in this release
+ */
+struct xran_cp_radioapp_section5 {
+ struct xran_cp_radioapp_section_header hdr;
+
+ // section extensions // 5.4.6 & 5.4.7
+ // .........
+ } __attribute__((__packed__));
+
+/**
+ * @ingroup xran_cp_pkt
+ *
+ * @description
+ * Section header definition for type 6
+ */
+struct xran_cp_radioapp_section6_header { // 8bytes (6+1+1)
+ struct xran_cp_radioapp_common_header cmnhdr;
+ uint8_t numberOfUEs; /**< 5.4.4.11 number of UEs */
+ uint8_t reserved;
+ } __attribute__((__packed__));
+
+/**
+ * @ingroup xran_cp_pkt
+ *
+ * @description
+ * Section definition for type 5: Channel Information (Table 5-6)
+ * Not supported in this release
+ */
+struct xran_cp_radioapp_section6 {
+ uint32_t regularizationFactor:16;/**< 5.4.5.12 regularization Factor */
+ uint32_t ueId:15; /**< 5.4.5.10 UE identifier */
+ uint32_t ef:1; /**< 5.4.5.8 extension flag */
+ uint8_t startPrbch:2; /**< 5.4.5.4 starting PRB of control section */
+ uint8_t symInc:1; /**< 5.4.5.3 symbol number increment command XRAN_SYMBOLNUMBER_xxxx */
+ uint8_t rb:1; /**< 5.4.5.2 resource block indicator, XRAN_RBIND_xxx */
+ uint8_t reserved:4;
+ uint8_t startPrbcl:8; /**< 5.4.5.4 starting PRB of control section */
+ uint8_t numPrbc:8; /**< 5.4.5.6 number of contiguous PRBs per control section */
+
+ // ciIQsamples start from here // 5.4.5.13 channel information I and Q values
+ // .........
+ //
+ // section extensions // 5.4.6 & 5.4.7
+ // .........
+ } __attribute__((__packed__));
+
+/**
+ * @ingroup xran_cp_pkt
+ *
+ * @description
+ * Section header definition for type 7: LAA
+ * Not supported in this release
+ */
+struct xran_cp_radioapp_section7_header {
+ struct xran_cp_radioapp_common_header cmnhdr;
+ uint16_t reserved;
+ uint8_t laaMsgLen:4; /**< 5.4.5.15 LAA message length */
+ uint8_t laaMsgType:4; /**< 5.4.5.14 LAA message type */
+
+ // Payload start from here // 5.4.5.16 ~ 5.4.5.32
+ } __attribute__((__packed__));
+
+
+#endif /* _XRAN_PKT_CP_H_ */