--- /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 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_*/