Front Haul Interface Library first seed code contribution
[o-du/phy.git] / fhi_lib / lib / api / xran_fh_lls_cu.h
diff --git a/fhi_lib/lib/api/xran_fh_lls_cu.h b/fhi_lib/lib/api/xran_fh_lls_cu.h
new file mode 100644 (file)
index 0000000..24bacba
--- /dev/null
@@ -0,0 +1,822 @@
+/******************************************************************************
+*
+*   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 public interface to XRAN Front Haul layer implementation as defined in the
+ *      XRAN-FH.CUS.0-v02.00 spec. Implementation is specific to lls-CU node
+ *      for 5G NR Radio Access technology
+ *
+ * @file xran_fh_lls_cu.h
+ * @ingroup group_lte_source_xran
+ * @author Intel Corporation
+ *
+ **/
+
+#ifndef _XRAN_FH_LLS_CU_H_
+#define _XRAN_FH_LLS_CU_H_
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <stdint.h>
+#include <inttypes.h>
+#include <sys/types.h>
+#include <sys/queue.h>
+#include <netinet/in.h>
+#include <setjmp.h>
+#include <stdarg.h>
+#include <ctype.h>
+#include <errno.h>
+#include <getopt.h>
+#include <unistd.h>
+
+#define XRAN_STATUS_SUCCESS (0)
+/**<
+ *  @ingroup xran
+ *   Success status value. */
+#define XRAN_STATUS_FAIL (-1)
+/**<
+ *  @ingroup xran
+ *   Fail status value. */
+
+#define XRAN_STATUS_RETRY (-2)
+/**<
+ *  @ingroup xran
+ *  Retry status value. */
+
+#define XRAN_STATUS_RESOURCE (-3)
+/**<
+ *  @ingroup xran
+ *  The resource that has been requested is unavailable. Refer
+ *  to relevant sections of the API for specifics on what the suggested
+ *  course of action is. */
+
+#define XRAN_STATUS_INVALID_PARAM (-4)
+/**<
+ *  @ingroup xran
+ *  Invalid parameter has been passed in. */
+#define XRAN_STATUS_FATAL (-5)
+/**<
+ *  @ingroup xran
+ *  A serious error has occurred. Recommended course of action
+ *  is to shutdown and restart the component. */
+
+#define XRAN_STATUS_UNSUPPORTED (-6)
+/**<
+ *  @ingroup xran
+ *  The function is not supported, at least not with the specific
+ *  parameters supplied.  This may be because a particular
+ *  capability is not supported by the current implementation. */
+
+/** Macro to calculate TTI number [0:7999] from symbol index [0: 112000-1] used by timing thread */
+#define XranGetTtiNum(symIdx, numSymPerTti) (((uint32_t)symIdx / (uint32_t)numSymPerTti))
+/** Macro to calculate Symbol number [0:7] for given slot from symbol index [0: 112000-1] */
+#define XranGetSymNum(symIdx, numSymPerTti) (((uint32_t)symIdx % (uint32_t)numSymPerTti))
+/** Macro to calculate Frame number [0:99] for given tti [0: 7999] */
+#define XranGetFrameNum(tti,numSubFramePerSystemFrame, numSlotPerSubFrame)  ((uint32_t)tti / ((uint32_t)numSubFramePerSystemFrame * (uint32_t)numSlotPerSubFrame))
+/** Macro to calculate Subframe number [0:9] for given tti [0: 7999] */
+#define XranGetSubFrameNum(tti, numSlotPerSubFrame, numSubFramePerSystemFrame) (((uint32_t)tti/(uint32_t)numSlotPerSubFrame) % (uint32_t)numSubFramePerSystemFrame)
+/** Macro to calculate Slot number [0:7] for given tti [0: 7999] */
+#define XranGetSlotNum(tti, numSlotPerSfn) ((uint32_t)tti % ((uint32_t)numSlotPerSfn))
+
+#define XRAN_PORTS_NUM      (1) /**< number of XRAN ports supported */
+#define XRAN_N_FE_BUF_LEN   (80)/** Number of TTIs (slots) */
+#define XRAN_MAX_SECTOR_NR  (4) /**< Max sectors per XRAN port */
+#define XRAN_MAX_ANTENNA_NR (4) /**< Max antenna per port */
+#define XRAN_NUM_OF_SYMBOL_PER_SLOT          ( 14 ) /**< Number of symbols per slot */
+
+#define XRAN_MAX_CELLS_PER_PORT      (4) /**< Max cells mapped to XRAN port */
+#define XRAN_COMPONENT_CARRIERS_MAX  XRAN_MAX_SECTOR_NR /**< number of CCs */
+#define XRAN_NUM_OF_ANT_RADIO        16  /**< Max Number of Antennas supported for all CC on single XRAN port */
+
+#define XRAN_MAX_PKT_BURST (448+4) /**< 4x14x8 symbols per ms */
+#define XRAN_N_MAX_BUFFER_SEGMENT XRAN_MAX_PKT_BURST /**< Max number of segments per ms */
+
+#define XRAN_STRICT_PARM_CHECK      (1) /**< enable parameter check for C-plane */
+
+//#define _XRAN_DEBUG   /**< Enable debug log */
+//#define _XRAN_VERBOSE /**< Enable verbose log */
+
+#ifdef _XRAN_DEBUG
+    #define xran_log_dbg(fmt, ...)          \
+        fprintf(stderr,                     \
+            "DEBUG: %s(%d): " fmt "\n",     \
+            __FILE__,                       \
+            __LINE__, ##__VA_ARGS__)
+#else
+    #define xran_log_dbg(fmt, ...)
+#endif
+
+#if defined(_XRAN_DEBUG) || defined(_XRAN_VERBOSE)
+    #define xran_log_wrn(fmt, ...)          \
+        fprintf(                            \
+            stderr,                         \
+            "WARNING: %s(%d): " fmt "\n",   \
+            __FILE__,                       \
+            __LINE__, ##__VA_ARGS__)
+#else
+    #define xran_log_dbg(fmt, ...)
+    #define xran_log_wrn(fmt, ...)
+#endif
+
+#define xran_log_err(fmt, ...)          \
+    fprintf(stderr,                     \
+        "ERROR: %s(%d): " fmt "\n",     \
+        __FILE__,                       \
+        __LINE__, ##__VA_ARGS__)
+
+/**
+ ******************************************************************************
+ * @ingroup xran
+ *
+ * @description
+ *      Compression Method 6.3.3.13, Table 6-43
+ *****************************************************************************/
+enum xran_compression_method {
+    XRAN_COMPMETHOD_NONE        = 0,
+    XRAN_COMPMETHOD_BLKFLOAT    = 1,
+    XRAN_COMPMETHOD_BLKSCALE    = 2,
+    XRAN_COMPMETHOD_ULAW        = 3,
+    XRAN_COMPMETHOD_MODULATION  = 4,
+    XRAN_COMPMETHOD_MAX
+    };
+
+/**
+ ******************************************************************************
+ * @ingroup xran
+ *
+ * @description
+ *      Callback function type for symbol packet enum
+ *****************************************************************************/
+enum callback_to_phy_id
+{
+    XRAN_CB_TTI = 0, /**< callback on TTI boundary */
+    XRAN_CB_HALF_SLOT_RX =1, /**< callback on half slot (sym 7) packet arrival*/
+    XRAN_CB_FULL_SLOT_RX =2, /**< callback on full slot (sym 14) packet arrival */
+    XRAN_CB_MAX /**< max number of callbacks */
+};
+
+typedef int32_t XranStatusInt32; /**< Xran status return value */
+
+/** callback function type for Symbol packet */
+typedef void (*XRANFHSYMPROCCB)(void*);
+
+/** Callback function type for TTI event */
+typedef int (*XRANFHTTIPROCCB)(void* );
+
+/** Callback function type packet arrival from transport layer (ETH or IP) */
+typedef void (*XranTransportBlockCallbackFn)(void*, int32_t);
+
+/**
+* Component Carrier Initialization
+*/
+typedef struct tagXRANCCINIT
+{
+    uint32_t RadioMode; /**< XRAN mode Cat A or Cat B on given CC */
+    uint32_t nTxAnt;    /**< Number of TX antennas */
+    uint32_t nRxAnt;    /**< Number of RX antennas */
+    uint32_t radiobw;   /**< bandwidth id */
+    uint32_t dpdk_port; /**< networking layer port id */
+    char *dpdk_pcie_eth_dev; /**< pcie device for this cc */
+    char *ru_mac_str;       /**< mac address of RU */
+    uint32_t ulAgc;     /**< state of UL AGC (ON/OFF) */
+    uint32_t numCell;   /**< Number of Cells per port per CC */
+    uint32_t phyInsId[XRAN_MAX_CELLS_PER_PORT]; /**< Mapping of Cell ID to CC */
+    uint32_t dpdkRxCore; /**< DPDK RX Core */
+    uint32_t dpdkTxCore; /**< DPDK TX Core */
+}XRANCCINIT, *PXRANCCINIT;
+
+/** XRAN port enum */
+enum xran_vf_ports
+{
+    XRAN_UP_VF = 0, /**< port type for U-plane */
+    XRAN_CP_VF,     /**< port type for C-plane */
+    XRAN_VF_MAX
+};
+
+/** DPDK IO configuration for XRAN layer */
+typedef struct tagXRAN_IO_LOOP_CFG
+{
+    uint8_t id;
+    char *dpdk_dev[XRAN_VF_MAX];
+    int core;
+    int system_core;    /* Needed as DPDK will change your starting core. */
+    int pkt_proc_core;  /* Needed for packet processing thread. */
+    int pkt_aux_core;   /* Needed for debug purposes. */
+    int timing_core;    /* Needed for getting precise time */
+    int port[XRAN_VF_MAX];  /* This is auto-detected, no need to set. */
+}XRAN_IO_LOOP_CFG, *PXRAN_IO_LOOP_CFG;
+
+/** XRAN spec section 3.1.3.1.6 ecpriRtcid / ecpriPcid define */
+typedef struct tagXRANEAXCIDCONFIG
+{
+    uint16_t mask_cuPortId;     /**< Mask CU PortId */
+    uint16_t mask_bandSectorId; /**< Mask Band */
+    uint16_t mask_ccId;         /**< Mask CC */
+    uint16_t mask_ruPortId;     /**< Mask RU Port ID */
+
+    uint8_t bit_cuPortId;       /**< bandsectorId + ccId + ruportId */
+    uint8_t bit_bandSectorId;   /**< ccId + ruPortId */
+    uint8_t bit_ccId;           /**<  ruportId */
+    uint8_t bit_ruPortId;       /**<  0 */
+}XRANEAXCIDCONFIG, *PXRANEAXCIDCONFIG;
+
+/**
+* XRAN Front haul interface initialization settings
+*/
+typedef struct tagXRANFHINIT
+{
+    uint32_t llscuId;    /**< lls-cu ID */
+    uint32_t nSec;       /**< number of sectors, shall be 1 */
+    XRANCCINIT ccCfg[XRAN_COMPONENT_CARRIERS_MAX]; /**< configuration of each CCs */
+    XRANEAXCIDCONFIG eAxCId_conf; /**< config of ecpriRtcid/ecpriPcid */
+    uint32_t radio_iface;         /**< enable/disable radio */
+    uint32_t dpdkMasterCore;      /**< master core of DPDK */
+    uint32_t dpdkMemorySize;      /**< huge pages allocation for DPDK */
+    uint32_t dpdkIrqMode;         /**< DPDK IRQ or PMD mode */
+    uint32_t dpdkBasebandFecMode; /**< DPDK Baseband FEC device mode (0-SW, 1-HW) */
+    char *dpdkBasebandDevice;     /**< DPDK Baseband device address */
+    uint32_t singleThreadTxRx;
+    uint32_t bbuPoolCores;  /**< DPDK cores for BBU pool */
+    uint32_t radioEnabled;  /**< reserved */
+    uint32_t powerSaveEn;   /**< reserved */
+    char *filePrefix;       /**< DPDK prefix */
+    XRAN_IO_LOOP_CFG io_cfg;/**< DPDK IO for XRAN */
+    uint8_t xranMode;       /**< mode: lls-CU or RU */
+    int8_t *p_lls_cu_addr;  /**<  lls-CU Ethernet Mac Address */
+    int8_t *p_ru_addr;      /**<  RU Ethernet Mac Address */
+    uint32_t ttiPeriod;     /**< TTI period */
+
+    uint16_t Tadv_cp_dl;    /**< Table 2 7 : xRAN Delay Management Model Parameters */
+    uint16_t T2a_min_cp_dl; /**< Table 2 7 : xRAN Delay Management Model Parameters */
+    uint16_t T2a_max_cp_dl; /**< Table 2 7 : xRAN Delay Management Model Parameters */
+    uint16_t T2a_min_cp_ul; /**< Table 2 7 : xRAN Delay Management Model Parameters */
+    uint16_t T2a_max_cp_ul; /**< Table 2 7 : xRAN Delay Management Model Parameters */
+    uint16_t T2a_min_up;    /**< Table 2 7 : xRAN Delay Management Model Parameters */
+    uint16_t T2a_max_up;    /**< Table 2 7 : xRAN Delay Management Model Parameters */
+    uint16_t Ta3_min;       /**< Table 2 7 : xRAN Delay Management Model Parameters */
+    uint16_t Ta3_max;       /**< Table 2 7 : xRAN Delay Management Model Parameters */
+    uint16_t T1a_min_cp_dl; /**< Table 2 7 : xRAN Delay Management Model Parameters */
+    uint16_t T1a_max_cp_dl; /**< Table 2 7 : xRAN Delay Management Model Parameters */
+    uint16_t T1a_min_cp_ul; /**< Table 2 7 : xRAN Delay Management Model Parameters */
+    uint16_t T1a_max_cp_ul; /**< Table 2 7 : xRAN Delay Management Model Parameters */
+    uint16_t T1a_min_up;    /**< Table 2 7 : xRAN Delay Management Model Parameters */
+    uint16_t T1a_max_up;    /**< Table 2 7 : xRAN Delay Management Model Parameters */
+    uint16_t Ta4_min;       /**< Table 2 7 : xRAN Delay Management Model Parameters */
+    uint16_t Ta4_max;       /**< Table 2 7 : xRAN Delay Management Model Parameters */
+
+    uint8_t enableCP;    /**<  enable C-plane */
+    uint8_t cp_vlan_tag; /**<  C-plane vlan tag */
+    uint8_t up_vlan_tag; /**<  U-plane vlan tag */
+    int32_t debugStop;   /**<  enable auto stop */
+} XRANFHINIT, *PXRANFHINIT;
+
+/** XRAN Playback format */
+typedef enum {
+    XRAN_RADIO_PLAYBACK_TIME_DOMAIN = 0,
+    XRAN_RADIO_PLAYBACK_FREQ_DOMAIN = 1
+} XranPlaybackFormatEnum;
+
+/* PRACH config required for XRAN based FH */
+typedef struct tagXRANPRACHCONFIG
+{
+    /**** word 5 *****/
+    /* PRACH config*/
+    /** PRACH Configuration Index*/
+    uint8_t      nPrachConfIdx;
+    /** PRACH Sub-carrier spacing
+    Value:0->1
+    For below 6GHz the values indicate 15kHz or 30kHz
+    For above 6GHz the values indicate 60kHz or 120kHz*/
+    /*PRACH zeroCorrelationZoneConfig */
+    uint8_t      nPrachSubcSpacing;
+    /** PRACH zeroCorrelationZoneConfig */
+    uint8_t      nPrachZeroCorrConf;
+    /** PRACH restrictedSetConfig */
+    uint8_t      nPrachRestrictSet;
+
+    /**** word 6 *****/
+    /** PRACH Root Sequence Index */
+    uint16_t     nPrachRootSeqIdx;
+    /** PRACH prach-frequency-start  */
+    uint16_t     nPrachFreqStart;
+
+    /** PRACH prach-frequency-offset */
+    int32_t     nPrachFreqOffset;
+    /** PRACH Filter index */
+    uint8_t     nPrachFilterIdx;
+}XRANPRACHCONFIG, *PXRANPRACHCONFIG;
+
+/** XRAN front haul playback configuration (not supported in 19.03) */
+typedef struct tagXRANFHPLAYBACK
+{
+    XranPlaybackFormatEnum TxPlayFormatType; /**< type of play back files [Time|Freq] */
+
+    unsigned long TxPlayBufAddr[XRAN_NUM_OF_ANT_RADIO]; /**< pointer to buffers to play */
+    uint32_t TxPlayBufSize; /**< Buffer size */
+
+    char*      TxPlayFileName[XRAN_NUM_OF_ANT_RADIO]; /**< files to play */
+    uint32_t   TxPlayFileSize; /**< expected the same size for all Ant */
+
+}XRANPLAYBACKCONFIG,*PXRANPLAYBACKCONFIG;
+
+/** XRAN front haul logging configuration (not supported in 19.03) */
+typedef struct tagXRANFHLOGCONF
+{
+    /* logging */
+    unsigned long TxLogBufAddr;
+    uint32_t TxLogBufSize;
+
+    unsigned long TxLogIfftInAddr;
+    uint32_t  TxLogIfftInSize;
+
+    unsigned long TxLogIfft1200InAddr;
+    uint32_t  TxLogIfft1200InSize;
+
+    unsigned long RxLogFftOutAddr;
+    uint32_t  RxLogFftOutSize;
+
+    unsigned long RxLogFftOutExpAddr;
+    uint32_t  RxLogFftOutExpSize;
+
+    unsigned long RxLogFftOutGainAddr;
+    uint32_t  RxLogFftOutGainSize;
+
+    unsigned long RxLogBufAddr;
+    uint32_t  RxLogBufSize;
+
+    unsigned long RxLogAlawBufAddr;
+    uint32_t  RxLogAlawBufSize;
+
+    unsigned long RxLogPrachBufAddr;
+    uint32_t  RxLogPrachBufSize;
+
+    uint32_t  cfg_dl_iq_buf_enabled;
+    uint32_t  cfg_ul_iq_buf_enabled;
+
+}XRANFHLOGCONF, *PXRANFHLOGCONF;
+
+/** XRAN front haul frame config */
+typedef struct tagXRANFRAMECONFIG
+{
+    /** Frame Duplex type:  0 -> FDD, 1 -> TDD */
+    uint8_t      nFrameDuplexType;
+    /** Numerology, determine sub carrier spacing, Value: 0->4
+       0: 15khz,  1: 30khz,  2: 60khz
+       3: 120khz, 4: 240khz */
+    uint8_t      nNumerology;
+    /** TDD period */
+    uint8_t      nTddPeriod;
+}XRANFRAMECONFIG, *PXRANFRAMECONFIG;
+
+/** XRAN front haul BBU pooling config */
+typedef struct tagXRANBBUPOOLCONFIG
+{
+    uint32_t isBbuPool; /**< FH running with BBU pool */
+}XRANBBUPOOLCONFIG, *PXRANBBUPOOLCONFIG;
+
+/** XRAN front haul IQ compression settings */
+typedef struct tagXRANRUCONFIG
+{
+    uint8_t iqWidth;        /**< IQ bit width */
+    uint8_t compMeth;       /**< Compression method */
+    uint8_t fftSize;        /**< FFT Size */
+}XRANRUCONFIG, *PXRANRUCONFIG;
+
+/** XRAN front haul Phase compensation settings */
+typedef struct
+{
+    uint32_t nSecNum;
+    uint32_t nPhaseCompFlag;
+    uint32_t nDlArfcn[XRAN_MAX_SECTOR_NR];
+    uint32_t nUlArfcn[XRAN_MAX_SECTOR_NR];
+}XRANPHASECompConfig;
+
+/**
+ * @ingroup xran
+ *XRAN front haul general configuration */
+typedef struct tagXRANFHCONFIG
+{
+    uint32_t            dpdk_port; /**< DPDK port number used for FH */
+    uint32_t            sector_id; /**< Band sector ID for FH */
+    uint32_t            nCC;       /**< number of Component carriers supported on FH */
+    uint32_t            neAxc;     /**< number of eAxc supported on FH */
+    XRANPLAYBACKCONFIG  playback_conf;/**< configuration of playback of IQs supported with FH */
+    XRANFHLOGCONF       log_conf;     /**< config of logging functionality supported by FH */
+    XRANFHTTIPROCCB     ttiCb;        /**< call back for TTI event */
+    void                *ttiCbParam;  /**< parameters of call back function */
+    XRANPRACHCONFIG     prach_conf;   /**< PRACH specific configurations for FH */
+    XRANFRAMECONFIG     frame_conf;   /**< frame config */
+    XRANBBUPOOLCONFIG   bbu_conf;     /**< BBU pool config */
+    XRANRUCONFIG        ru_conf;      /**< config of RU as per XRAN spec */
+    XRANPHASECompConfig phase_compensation; /**< phase compensation settings */
+}XRANFHCONFIG, *PXRANFHCONFIG;
+
+
+/**
+ * @ingroup xran
+ * CC instance handle pointer type */
+typedef void * XranCcInstanceHandleVoidP;
+
+/**
+ *****************************************************************************
+ * @ingroup xran
+ *
+ * @description
+ *      A flat buffer structure. The data pointer, pData, is a virtual address.
+ *      The API requires the memory to by physically contiguous. Each flat
+ *      buffer segment may contain several equally sized elements.
+ *
+ *****************************************************************************/
+typedef struct XRANFlatBuffer
+{
+    uint32_t nElementLenInBytes;
+    /**< The Element length specified in bytes.
+     * This parameter specifies the size of a single element in the buffer.
+     * The total size of the buffer is described as
+     * bufferSize = nElementLenInBytes * nNumberOfElements */
+    uint32_t nNumberOfElements;
+    /**< The number of elements in the physical contiguous memory segment */
+    uint32_t nOffsetInBytes;
+    /**< Offset in bytes to the start of the data in the physical contiguous
+     * memory segment */
+    uint32_t nIsPhyAddr;
+    uint8_t *pData;
+    /**< The data pointer is a virtual address, however the actual data pointed
+     * to is required to be in contiguous physical memory unless the field
+     requiresPhysicallyContiguousMemory in CpaInstanceInfo is false. */
+} XRANFlatBufferStruct;
+
+/**
+ *****************************************************************************
+ * @ingroup xran
+ *      Scatter/Gather buffer list containing an array of Simple buffers.
+ *
+ * @description
+ *      A Scatter/Gather buffer list structure. It is expected that this buffer
+ *      structure will be used where more than one flat buffer can be provided
+ *      on a particular API.
+ *
+ *      IMPORTANT - The memory for the pPrivateMetaData member must be allocated
+ *      by the client as contiguous memory.  When allocating memory for
+ *      pPrivateMetaData a call to cpaCyBufferListGetMetaSize MUST be made to
+ *      determine the size of the Meta Data Buffer.  The returned size
+ *      (in bytes) may then be passed in a memory allocation routine to allocate
+ *      the pPrivateMetaData memory.
+ *
+ *****************************************************************************/
+typedef struct XRANBufferList
+{
+    uint32_t nNumBuffers;
+    /**< Number of pointers */
+    XRANFlatBufferStruct *pBuffers;
+    /**< Pointer to an unbounded array containing the number of CpaFlatBuffers
+     * defined by nNumBuffers */
+    void *pUserData;
+    /**< This is an opaque field that is not read or modified internally. */
+    void *pPrivateMetaData;
+    /**< Private Meta representation of this buffer List - the memory for this
+     * buffer needs to be allocated by the client as contiguous data.
+     * The amount of memory required is returned with a call to
+     * cpaCyBufferListGetMetaSize. If cpaCyBufferListGetMetaSize returns a size
+     * of zero no memory needs to be allocated, and this parameter can be NULL.
+     */
+} XRANBufferListStruct;
+
+/**
+ * @ingroup xran
+ * Initialize the XRAN Layer via DPDK.
+ *
+ * @param argc
+ *   A non-negative value.  If it is greater than 0, the array members
+ *   for argv[0] through argv[argc] (non-inclusive) shall contain pointers
+ *   to strings.
+ * @param argv
+ *   An array of strings.  The contents of the array, as well as the strings
+ *   which are pointed to by the array, may be modified by this function.
+ *
+ * @return
+ *   0 - on success
+ *   Error codes returned via rte_errno
+ */
+int32_t xran_init(int argc, char *argv[], PXRANFHINIT p_xran_fh_init, char *appName, void ** pHandle);
+
+/**
+ * @ingroup xran
+ *
+ *   Function returns handles for number of sectors supported by XRAN layer. Currently function
+ *   supports one handle XRAN layer where it supports only one CC
+ *
+ * @param pHandle
+ *   Pointer to XRAN layer handle
+ * @param nNumInstances
+ *   total number of instances of CC
+ * @param pSectorInstanceHandles
+ *   Pointer to XranCcInstanceHandleVoidP where to store Handle pointer
+ *
+ * @return
+ *   0 - on success
+ */
+int32_t xran_sector_get_instances (void * pHandle, uint16_t nNumInstances,
+               XranCcInstanceHandleVoidP * pSectorInstanceHandles);
+
+/**
+ * @ingroup xran
+ *
+ *   Function initialize Memory Management subsystem (mm) in order to handle memory buffers between XRAN layer
+ *   and PHY.
+ *
+ * @param pHandle
+ *   Pointer to XRAN layer handle for given CC
+ * @param nMemorySize
+ *   memory size of all segments
+ * @param nMemorySegmentSize
+ *   size of memory per segment
+ *
+ * @return
+ *   0 - on success
+ */
+int32_t xran_mm_init (void * pHandle, uint64_t nMemorySize, uint32_t nMemorySegmentSize);
+
+/**
+ * @ingroup xran
+ *
+ *   Function allocates buffer memory (bm) used between XRAN layer and PHY. In general case it's DPDK mbuf.
+ *   it uses Memory Management system to get memory chunk and define memory pool on top of it.
+ *
+ * @param pHandle
+ *   Pointer to XRAN layer handle for given CC
+ * @param nPoolIndex
+ *   pointer to buffer pool identification to be returned
+ * @param nNumberOfBuffers
+ *   number of buffer to allocate in the pool
+ * @param nBufferSize
+ *   buffer size to allocate
+ *
+ * @return
+ *   0 - on success
+ */
+int32_t xran_bm_init (void * pHandle, uint32_t * pPoolIndex, uint32_t nNumberOfBuffers, uint32_t nBufferSize);
+
+/**
+ * @ingroup xran
+ *
+ *   Function allocates buffer used between XRAN layer and PHY. In general case it's DPDK mbuf.
+ *
+ * @param pHandle
+ *   Pointer to XRAN layer handle for given CC
+ * @param nPoolIndex
+ *   buffer pool identification
+ * @param ppVirtAddr
+ *   Pointer to pointer where to store address of new buffer
+ *
+ * @return
+ *   0 - on success
+ */
+int32_t xran_bm_allocate_buffer(void * pHandle, uint32_t nPoolIndex, void **ppVirtAddr);
+
+/**
+ * @ingroup xran
+ *
+ *   Function frees buffer used between XRAN layer and PHY. In general case it's DPDK mbuf
+ *
+ * @param pHandle
+ *   Pointer to XRAN layer handle for given CC
+ * @param pVirtAddr
+ *   Pointer to buffer
+ *
+ * @return
+ *   0 - on success
+ */
+int32_t xran_bm_free_buffer(void * pHandle, void *pVirtAddr);
+
+/**
+ * @ingroup xran
+ *
+ *   Function destroys Memory Management (MM) layer of XRAN library
+ *
+ * @param pHandle
+ *   Pointer to XRAN layer handle for given CC
+ *
+ * @return
+ *   0 - on success
+ */
+int32_t xran_mm_destroy (void * pHandle);
+
+/**
+ * @ingroup xran
+ *
+ *   Function configures TX(DL) and RX(UL) output buffers and callback (UL only) for XRAN layer with
+ *   given handle
+ *
+ * @param pHandle
+ *   Pointer to XRAN layer handle for given CC
+ * @param pSrcBuffer
+ *   list of memory buffers to use to fetch IQs from PHY to XRAN layer (DL)
+ * @param pDstBuffer
+ *   list of memory buffers to use to deliver IQs from XRAN layer to PHY (UL)
+ * @param XranTransportBlockCallbackFn pCallback
+ *   Callback function to call with arrival of all packets for given CC for given symbol
+ * @param pCallbackTag
+ *   Parameters of Callback function
+ *
+ * @return
+ *   0  - on success
+ *   -1 - on error
+ */
+int32_t xran_5g_fronthault_config (void * pHandle,
+                XRANBufferListStruct *pSrcBuffer[XRAN_MAX_ANTENNA_NR][XRAN_N_FE_BUF_LEN],
+                XRANBufferListStruct *pDstBuffer[XRAN_MAX_ANTENNA_NR][XRAN_N_FE_BUF_LEN],
+                XranTransportBlockCallbackFn pCallback,
+                void *pCallbackTag);
+
+/**
+ * @ingroup xran
+ *
+ *   Function configures PRACH output buffers and callback for XRAN layer with given handle
+ *
+ * @param pHandle
+ *   Pointer to XRAN layer handle for given CC
+ * @param pDstBuffer
+ *   list of memory buffers to use to deliver PRACH IQs from xran layer to PHY
+ * @param XranTransportBlockCallbackFn pCallback
+ *   Callback function to call with arrival of PRACH packets for given CC
+ * @param pCallbackTag
+ *   Parameters of Callback function
+ *
+ * @return
+ *   0  - on success
+ *   -1 - on error
+ */
+int32_t xran_5g_prach_req (void *  pHandle,
+                XRANBufferListStruct *pDstBuffer[XRAN_MAX_ANTENNA_NR][XRAN_N_FE_BUF_LEN],
+                XranTransportBlockCallbackFn pCallback,
+                void *pCallbackTag);
+/**
+ * @ingroup xran
+ *
+ *   Function configures phase compensation for RU via XRAN layer with given handle
+ *
+ * @param pHandle
+ *   Pointer to XRAN layer handle for given CC
+ * @param nTxPhaseCps
+ *   TX(DL) phase compensation settings
+ * @param nTxPhaseCps
+ *   RX(UL) phase compensation settings
+ * @param nSectorId
+ *   Sector id to use with given settings
+ *
+ * @return
+ *   0 - on success
+ */
+int32_t xran_5g_pre_compenstor_cfg(void* pHandle,
+                uint32_t nTxPhaseCps,
+                uint32_t nRxPhaseCps,
+                uint8_t nSectorId);
+
+/**
+ * @ingroup xran
+ *
+ *   Function opens XRAN layer with given handle
+ *
+ * @param pHandle
+ *   Pointer to XRAN layer handle for given CC
+ * @param PXRANFHCONFIG pConf
+ *   Pointer to XRAN configuration structure with specific settings to use
+ *
+ * @return
+ *   0 - on success
+ */
+int32_t xran_open(void *pHandle, PXRANFHCONFIG pConf);
+
+/**
+ * @ingroup xran
+ *
+ *   Function starts XRAN layer with given handle
+ *
+ * @param pHandle
+ *   Pointer to XRAN layer handle for given CC
+ *
+ * @return
+ *   0 - on success
+ */
+int32_t xran_start(void *pHandle);
+
+/**
+ * @ingroup xran
+ *
+ *   Function stops XRAN layer with given handle
+ *
+ * @param pHandle
+ *   Pointer to XRAN layer handle for given CC
+ *
+ * @return
+ *   0 - on success
+ */
+int32_t xran_stop(void *pHandle);
+
+/**
+ * @ingroup xran
+ *
+ *   Function closes XRAN layer with given handle
+ *
+ * @param pHandle
+ *   Pointer to XRAN layer handle for given CC
+ *
+ * @return
+ *   0 - on success
+ */
+int32_t xran_close(void *pHandle);
+
+/**
+ * @ingroup xran
+ *
+ *   Function registers callback to XRAN layer. Function support callbacks aligned on packet arrival.
+ *
+ * @param pHandle
+ *   Pointer to XRAN layer handle for given CC
+ * @param symCb
+ *   pointer to callback function
+ * @param symCb
+ *   pointer to Callback Function parameters
+ * @param symb
+ *   symbol to be register for
+ * @param ant
+ *   Antenna number to trigger callback for packet arrival
+ *
+ * @return
+ *    0 - in case of success
+ *   -1 - in case of failure
+ */
+int32_t xran_reg_sym_cb(void *pHandle, XRANFHSYMPROCCB symCb, void * symCbParam, uint8_t symb, uint8_t ant);
+
+/**
+ * @ingroup xran
+ *
+ *   Function registers callback to XRAN layer. Function support callbacks align to OTA time. TTI even, half of slot,
+ *   full slot with respect to PTP time.
+ *
+ * @param pHandle
+ *   Pointer to XRAN layer handle for given CC
+ * @param Cb
+ *   pointer to callback function
+ * @param cbParam
+ *   pointer to Callback Function parameters
+ * @param skipTtiNum
+ *   number of calls to be skipped before first call
+ * @param callback_to_phy_id
+ *   call back time identification (see enum callback_to_phy_id)
+ *
+ * @return
+ *    0 - in case of success
+ *   -1 - in case of failure
+ */
+int32_t xran_reg_physide_cb(void *pHandle, XRANFHTTIPROCCB Cb, void *cbParam, int skipTtiNum, enum callback_to_phy_id);
+
+/**
+ * @ingroup xran
+ *
+ *   Function returns current TTI, Frame, Subframe, Slot Number as seen "Over air" base on PTP time
+ *
+ * @param nFrameIdx
+ *    Pointer to Frame number [0-99]
+ *
+ * @param nSubframeIdx
+ *    Pointer to Subframe number [0-10]
+ *
+ * @param nSlotIdx
+ *    Pointer to Slot number [0-7]
+ *
+ * @param nSecond
+ *    Pointer to current UTC second
+ *
+ * @return
+ *   current TTI number [0-7999]
+ */
+int32_t xran_get_slot_idx (uint32_t *nFrameIdx, uint32_t *nSubframeIdx,  uint32_t *nSlotIdx, uint64_t *nSecond);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _XRAN_FH_LLS_CU_H_*/