X-Git-Url: https://gerrit.o-ran-sc.org/r/gitweb?a=blobdiff_plain;f=fhi_lib%2Flib%2Fsrc%2Fxran_common.h;h=04076fd1e5f6dd2f63d9aebfb5875eeffa8b4ce9;hb=892daba4c616407f16506415d5a69549519ef11d;hp=ad17c1e219adb8e3352c133f0addd0414e870964;hpb=4745e5c88ba931c6d71cb6d8c681f76cf364eac5;p=o-du%2Fphy.git diff --git a/fhi_lib/lib/src/xran_common.h b/fhi_lib/lib/src/xran_common.h index ad17c1e..04076fd 100644 --- a/fhi_lib/lib/src/xran_common.h +++ b/fhi_lib/lib/src/xran_common.h @@ -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 XRAN layer common functionality for both lls-CU and RU as well as C-plane and * U-plane @@ -28,235 +27,133 @@ #ifndef _XRAN_COMMON_H_ #define _XRAN_COMMON_H_ +#ifdef __cplusplus +extern "C" { +#endif + #include #include +#include +#include #include #include #include +#include -#include "xran_fh_lls_cu.h" +#include "xran_fh_o_du.h" #include "xran_pkt_up.h" +#include "xran_cp_api.h" +#include "xran_dev.h" +#include "xran_pkt.h" + + +extern uint64_t interval_us; +#define O_DU 0 +#define O_RU 1 -#define APP_LLS_CU 0 -#define APP_RU 1 -#define NUM_OF_PRB_IN_FULL_BAND (66) #define N_SC_PER_PRB 12 +#define MAX_N_FULLBAND_SC 273 #define N_SYM_PER_SLOT 14 -#define N_FULLBAND_SC (NUM_OF_PRB_IN_FULL_BAND*N_SC_PER_PRB) -#define MAX_ANT_CARRIER_SUPPORTED 16 -/* 0.125, just for testing */ -#define SLOTNUM_PER_SUBFRAME 8 +#define SUBFRAME_DURATION_US 1000 +#define SLOTNUM_PER_SUBFRAME(interval) (SUBFRAME_DURATION_US/(interval)) #define SUBFRAMES_PER_SYSTEMFRAME 10 -#define SLOTS_PER_SYSTEMFRAME (SLOTNUM_PER_SUBFRAME*SUBFRAMES_PER_SYSTEMFRAME) -#define PDSCH_PAYLOAD_SIZE (N_FULLBAND_SC*4) -#define NUM_OF_SLOT_IN_TDD_LOOP (80) -#define IQ_PLAYBACK_BUFFER_BYTES (NUM_OF_SLOT_IN_TDD_LOOP*N_SYM_PER_SLOT*N_FULLBAND_SC*4L) +#define SLOTS_PER_SYSTEMFRAME(interval) ((SLOTNUM_PER_SUBFRAME(interval))*SUBFRAMES_PER_SYSTEMFRAME) + +/* PRACH data samples are 32 bits wide, 16bits for I and 16bits for Q. Each packet contains 839 samples for long sequence or 144 for short sequence. The payload length is 840*16*2/8 octets.*/ +#ifdef FCN_1_2_6_EARLIER +#define PRACH_PLAYBACK_BUFFER_BYTES (144*4L) +#else +#define PRACH_PLAYBACK_BUFFER_BYTES (840*4L) +#endif +#define PRACH_SRS_BUFFER_BYTES (144*14*4L) -/* PRACH data samples are 32 bits wide, 16bits for I and 16bits for Q. Each packet contains 839 samples. The payload length is 3356 octets.*/ -#define PRACH_PLAYBACK_BUFFER_BYTES (10*839*4L) +/**< this is the configuration of M-plane */ +#define XRAN_MAX_NUM_SECTIONS (N_SYM_PER_SLOT* (XRAN_MAX_ANTENNA_NR*2) + XRAN_MAX_ANT_ARRAY_ELM_NR) -#define XRAN_MAX_NUM_SECTIONS (NUM_OF_PRB_IN_FULL_BAND) // TODO: need to decide proper value +#define XRAN_PAYLOAD_1_RB_SZ(iqWidth) (((iqWidth == 0) || (iqWidth == 16)) ? \ + (N_SC_PER_PRB*(MAX_IQ_BIT_WIDTH/8)*2) : (3 * iqWidth + 1)) -#define XRAN_MAX_MBUF_LEN 9600 /**< jummbo frame */ -#define NSEC_PER_SEC 1000000000 +#define XRAN_MAX_MBUF_LEN (13168 + XRAN_MAX_SECTIONS_PER_SYM* (RTE_PKTMBUF_HEADROOM + sizeof(struct rte_ether_hdr) + sizeof(struct xran_ecpri_hdr) + sizeof(struct radio_app_common_hdr) + sizeof(struct data_section_hdr))) +#define NSEC_PER_SEC 1000000000L #define TIMER_RESOLUTION_CYCLES 1596*1 /* 1us */ #define XRAN_RING_SIZE 512 /*4*14*8 pow of 2 */ #define XRAN_NAME_MAX_LEN (64) #define XRAN_RING_NUM (3) -#define MAX_NUM_OF_XRAN_CTX (2) +#define XranDiffSymIdx(prevSymIdx, currSymIdx, numTotalSymIdx) ((prevSymIdx > currSymIdx) ? ((currSymIdx + numTotalSymIdx) - prevSymIdx) : (currSymIdx - prevSymIdx)) + +#define XRAN_MLOG_VAR 0 /**< enable debug variables to mlog */ + + +#define DIV_ROUND_OFFSET(X,Y) ( X/Y + ((X%Y)?1:0) ) + +#define MAX_NUM_OF_XRAN_CTX (2) #define XranIncrementCtx(ctx) ((ctx >= (MAX_NUM_OF_XRAN_CTX-1)) ? 0 : (ctx+1)) #define XranDecrementCtx(ctx) ((ctx == 0) ? (MAX_NUM_OF_XRAN_CTX-1) : (ctx-1)) -#define XranDiffSymIdx(prevSymIdx, currSymIdx, numTotalSymIdx) ((prevSymIdx > currSymIdx) ? ((currSymIdx + numTotalSymIdx) - prevSymIdx) : (currSymIdx - prevSymIdx)) - -#define XRAN_SYM_JOB_SIZE 512 +#define MAX_NUM_OF_DPDK_TIMERS (10) +#define DpdkTimerIncrementCtx(ctx) ((ctx >= (MAX_NUM_OF_DPDK_TIMERS-1)) ? 0 : (ctx+1)) +#define DpdkTimerDecrementCtx(ctx) ((ctx == 0) ? (MAX_NUM_OF_DPDK_TIMERS-1) : (ctx-1)) -struct send_symbol_cb_args -{ - struct rb_map *samp_buf; - uint8_t *symb_id; -}; +/* Callback function to send mbuf to the ring */ +typedef int (*xran_ethdi_mbuf_send_fn)(struct rte_mbuf *mb, uint16_t ethertype, uint16_t vf_id); -struct pkt_dump -{ - int num_samp; - int num_bytes; - uint8_t symb; - struct ecpri_seq_id seq; -} __rte_packed; - -/* PRACH configuration table defines */ -#define XRAN_PRACH_CANDIDATE_PREAMBLE (2) -#define XRAN_PRACH_CANDIDATE_Y (2) -#define XRAN_PRACH_CANDIDATE_SLOT (40) -#define XRAN_PRACH_CONFIG_TABLE_SIZE (256) -#define XRAN_PRACH_PREAMBLE_FORMAT_OF_ABC (9) -typedef enum -{ - FORMAT_0 = 0, - FORMAT_1, - FORMAT_2, - FORMAT_3, - FORMAT_A1, - FORMAT_A2, - FORMAT_A3, - FORMAT_B1, - FORMAT_B2, - FORMAT_B3, - FORMAT_B4, - FORMAT_C0, - FORMAT_C2, - FORMAT_LAST -}PreambleFormatEnum; - -/* add PRACH used config table, same structure as used in refPHY */ -typedef struct -{ - uint8_t prachConfigIdx; - uint8_t preambleFmrt[XRAN_PRACH_CANDIDATE_PREAMBLE]; - uint8_t x; - uint8_t y[XRAN_PRACH_CANDIDATE_Y]; - uint8_t slotNr[XRAN_PRACH_CANDIDATE_SLOT]; - uint8_t slotNrNum; - uint8_t startingSym; - uint8_t nrofPrachInSlot; - uint8_t occassionsInPrachSlot; - uint8_t duration; -} xRANPrachConfigTableStruct; - -typedef struct -{ - uint8_t preambleFmrt; - uint16_t lRALen; - uint8_t fRA; - uint32_t nu; - uint16_t nRaCp; -}xRANPrachPreambleLRAStruct; - -typedef struct -{ - uint8_t filterIdx; - uint8_t startSymId; - uint16_t startPrbc; - uint8_t numPrbc; - uint8_t numSymbol; - uint16_t timeOffset; - int32_t freqOffset; - uint8_t occassionsInPrachSlot; - uint8_t x; - uint8_t y[XRAN_PRACH_CANDIDATE_Y]; - uint8_t isPRACHslot[XRAN_PRACH_CANDIDATE_SLOT]; -}xRANPrachCPConfigStruct; - - -typedef struct DeviceHandleInfo -{ - /**< Structure that contains the information to describe the - * instance i.e service type, virtual function, package Id etc..*/ - uint16_t nIndex; - /* Unique ID of an handle shared between phy layer and library */ - /**< number of antennas supported per link*/ - uint32_t nBufferPoolIndex; - /**< Buffer poolIndex*/ - struct rte_mempool * p_bufferPool[XRAN_MAX_SECTOR_NR]; - uint32_t bufferPoolElmSz[XRAN_MAX_SECTOR_NR]; - uint32_t bufferPoolNumElm[XRAN_MAX_SECTOR_NR]; - -}XranLibHandleInfoStruct; - -typedef void (*XranSymCallbackFn)(struct rte_timer *tim, void* arg); - -/* - * manage one cell's all Ethernet frames for one DL or UL LTE subframe - */ -typedef struct { - /* -1-this subframe is not used in current frame format - 0-this subframe can be transmitted, i.e., data is ready - 1-this subframe is waiting transmission, i.e., data is not ready - 10 - DL transmission missing deadline. When FE needs this subframe data but bValid is still 1, - set bValid to 10. - */ - int32_t bValid ; // when UL rx, it is subframe index. - int32_t nSegToBeGen; - int32_t nSegGenerated; // how many date segment are generated by DL LTE processing or received from FE - // -1 means that DL packet to be transmitted is not ready in BS - int32_t nSegTransferred; // number of data segments has been transmitted or received - struct rte_mbuf *pData[XRAN_N_MAX_BUFFER_SEGMENT]; // point to DPDK allocated memory pool - XRANBufferListStruct sBufferList; -} BbuIoBufCtrlStruct; - -struct xran_sym_job { - uint32_t sym_idx; - uint32_t status; -}__rte_cache_aligned; #define XranIncrementJob(i) ((i >= (XRAN_SYM_JOB_SIZE-1)) ? 0 : (i+1)) -struct xran_lib_ctx -{ - uint8_t llscu_id; - uint8_t sector_id; - XRANEAXCIDCONFIG eAxc_id_cfg; - XRANFHINIT xran_init_cfg; - XRANFHCONFIG xran_fh_cfg; - XranLibHandleInfoStruct* pDevHandle; - xRANPrachCPConfigStruct PrachCPConfig; - uint32_t enableCP; - char ring_name[XRAN_RING_NUM][XRAN_MAX_SECTOR_NR][RTE_RING_NAMESIZE]; - struct rte_ring *dl_sym_idx_ring[XRAN_MAX_SECTOR_NR]; - struct rte_ring *xran2phy_ring[XRAN_MAX_SECTOR_NR]; - struct rte_ring *xran2prach_ring[XRAN_MAX_SECTOR_NR]; - - struct xran_sym_job sym_job[XRAN_SYM_JOB_SIZE]; - uint32_t sym_job_idx; - - BbuIoBufCtrlStruct sFrontHaulTxBbuIoBufCtrl[XRAN_N_FE_BUF_LEN][XRAN_MAX_SECTOR_NR][XRAN_MAX_ANTENNA_NR]; - BbuIoBufCtrlStruct sFrontHaulRxBbuIoBufCtrl[XRAN_N_FE_BUF_LEN][XRAN_MAX_SECTOR_NR][XRAN_MAX_ANTENNA_NR]; - BbuIoBufCtrlStruct sFHPrachRxBbuIoBufCtrl[XRAN_N_FE_BUF_LEN][XRAN_MAX_SECTOR_NR][XRAN_MAX_ANTENNA_NR]; - - /* buffers lists */ - XRANFlatBufferStruct sFrontHaulTxBuffers[XRAN_N_FE_BUF_LEN][XRAN_MAX_SECTOR_NR][XRAN_MAX_ANTENNA_NR][XRAN_NUM_OF_SYMBOL_PER_SLOT]; - XRANFlatBufferStruct sFrontHaulRxBuffers[XRAN_N_FE_BUF_LEN][XRAN_MAX_SECTOR_NR][XRAN_MAX_ANTENNA_NR][XRAN_NUM_OF_SYMBOL_PER_SLOT]; - XRANFlatBufferStruct sFHPrachRxBuffers[XRAN_N_FE_BUF_LEN][XRAN_MAX_SECTOR_NR][XRAN_MAX_ANTENNA_NR][XRAN_NUM_OF_SYMBOL_PER_SLOT]; - - XranTransportBlockCallbackFn pCallback[XRAN_MAX_SECTOR_NR]; - void *pCallbackTag[XRAN_MAX_SECTOR_NR]; - - XranTransportBlockCallbackFn pPrachCallback[XRAN_MAX_SECTOR_NR]; - void *pPrachCallbackTag[XRAN_MAX_SECTOR_NR]; - - XranSymCallbackFn pSymCallback[XRAN_MAX_SECTOR_NR][XRAN_NUM_OF_SYMBOL_PER_SLOT]; - void *pSymCallbackTag[XRAN_MAX_SECTOR_NR][XRAN_NUM_OF_SYMBOL_PER_SLOT]; - - int32_t sym_up; /**< when we start sym 0 of up with respect to OTA time as measured in symbols */ - int32_t sym_up_ul; - - XRANFHTTIPROCCB ttiCb[XRAN_CB_MAX]; - void *TtiCbParam[XRAN_CB_MAX]; - uint32_t SkipTti[XRAN_CB_MAX]; - - int xran2phy_mem_ready; - - int rx_packet_symb_tracker[XRAN_N_FE_BUF_LEN][XRAN_MAX_SECTOR_NR][XRAN_NUM_OF_SYMBOL_PER_SLOT]; - int rx_packet_callback_tracker[XRAN_N_FE_BUF_LEN][XRAN_MAX_SECTOR_NR]; - int phy_tti_cb_done; +/** Worker task function type */ +typedef int32_t (*worker_task_fn)(void*); + +/** worker thread context structure */ +struct xran_worker_th_ctx { + pthread_t *pThread; + + struct sched_param sched_param; + char worker_name[32]; + int32_t worker_id; + uint64_t worker_core_id; + int32_t worker_policy; + int32_t worker_status; + + /* task */ + worker_task_fn task_func; + void* task_arg; }; -extern const xRANPrachConfigTableStruct gxranPrachDataTable_sub6_fdd[XRAN_PRACH_CONFIG_TABLE_SIZE]; -extern const xRANPrachConfigTableStruct gxranPrachDataTable_sub6_tdd[XRAN_PRACH_CONFIG_TABLE_SIZE]; -extern const xRANPrachConfigTableStruct gxranPrachDataTable_mmw[XRAN_PRACH_CONFIG_TABLE_SIZE]; -extern const xRANPrachPreambleLRAStruct gxranPreambleforLRA[XRAN_PRACH_PREAMBLE_FORMAT_OF_ABC]; +struct xran_sectioninfo_db { + uint32_t cur_index; /**< Current index to store for this eAXC */ + struct xran_section_info list[XRAN_MAX_NUM_SECTIONS]; /**< The array of section information */ +}; -int process_mbuf(struct rte_mbuf *pkt); -int process_ring(struct rte_ring *r); +int32_t xran_generic_worker_thread(void *args); + +int process_mbuf(struct rte_mbuf *pkt, void* handle, struct xran_eaxc_info *p_cid); +int process_mbuf_batch(struct rte_mbuf* pkt[], void* handle, int16_t num, struct xran_eaxc_info *p_cid, uint32_t* ret); +int process_ring(struct rte_ring *r, uint16_t ring_id, uint16_t q_id); int ring_processing_thread(void *args); int packets_dump_thread(void *args); - -int send_symbol_ex(enum xran_pkt_dir direction, +// Support for 1-way eCPRI delay measurement per section 3.2.4.6 of eCPRI Specification V2.0 +int32_t xran_ecpri_port_update_required(struct xran_io_cfg * cfg, uint16_t port_id); +int xran_ecpri_one_way_delay_measurement_transmitter(uint16_t port_id, void* handle); +int xran_generate_delay_meas(uint16_t port_id, void* handle, uint8_t actionType, uint8_t MeasurementID ); +int process_delay_meas(struct rte_mbuf *pkt, void* handle, uint16_t port_id); +int xran_process_delmeas_request(struct rte_mbuf *pkt, void* handle, struct xran_ecpri_del_meas_pkt*, uint16_t port_id); +int xran_process_delmeas_request_w_fup(struct rte_mbuf *pkt, void* handle, struct xran_ecpri_del_meas_pkt*, uint16_t port_id); +int xran_process_delmeas_response(struct rte_mbuf *pkt, void* handle, struct xran_ecpri_del_meas_pkt*, uint16_t port_id); +int xran_process_delmeas_rem_request(struct rte_mbuf *pkt, void* handle, struct xran_ecpri_del_meas_pkt*, uint16_t port_id); +int xran_process_delmeas_rem_request_w_fup(struct rte_mbuf *pkt, void* handle, struct xran_ecpri_del_meas_pkt*, uint16_t port_id); +int xran_process_delmeas_follow_up(struct rte_mbuf *pkt, void* handle, struct xran_ecpri_del_meas_pkt*, uint16_t port_id); +void xran_initialize_ecpri_del_meas_port(struct xran_ecpri_del_meas_cmn* pCmn, struct xran_ecpri_del_meas_port* pPort,uint16_t full_init); + +int send_symbol_mult_section_ex(void* handle, + enum xran_pkt_dir direction, uint16_t section_id, - struct rb_map *data, + struct rte_mbuf *mb, + uint8_t *data, + uint8_t compMeth, + uint8_t iqWidth, + const enum xran_input_byte_order iq_buf_byte_order, uint8_t frame_id, uint8_t subframe_id, uint8_t slot_id, @@ -267,34 +164,96 @@ int send_symbol_ex(enum xran_pkt_dir direction, uint8_t RU_Port_ID, uint8_t seq_id); -int send_cpmsg_dlul(void *pHandle, enum xran_pkt_dir dir, - uint8_t frame_id, uint8_t subframe_id, uint8_t slot_id, - uint8_t startsym, uint8_t numsym, int prb_num, - uint16_t beam_id, uint8_t cc_id, uint8_t ru_port_id, +int send_symbol_ex(void* handle, + enum xran_pkt_dir direction, + uint16_t section_id, + struct rte_mbuf *mb, + uint8_t *data, + uint8_t compMeth, + uint8_t iqWidth, + const enum xran_input_byte_order iq_buf_byte_order, + uint8_t frame_id, + uint8_t subframe_id, + uint8_t slot_id, + uint8_t symbol_no, + int prb_start, + int prb_num, + uint8_t CC_ID, + uint8_t RU_Port_ID, uint8_t seq_id); -int send_cpmsg_prach(void *pHandle, - uint8_t frame_id, uint8_t subframe_id, uint8_t slot_id, - uint16_t beam_id, uint8_t cc_id, uint8_t prach_port_id, - uint8_t seq_id); +int32_t prepare_symbol_ex(enum xran_pkt_dir direction, + uint16_t section_id, + struct rte_mbuf *mb, + uint8_t *data, + uint8_t compMeth, + uint8_t iqWidth, + const enum xran_input_byte_order iq_buf_byte_order, + uint8_t frame_id, + uint8_t subframe_id, + uint8_t slot_id, + uint8_t symbol_no, + int prb_start, + int prb_num, + uint8_t CC_ID, + uint8_t RU_Port_ID, + uint8_t seq_id, + uint32_t do_copy, + enum xran_comp_hdr_type staticEn, + uint16_t num_sections, + uint16_t iq_buffer_offset); +int32_t prepare_sf_slot_sym (enum xran_pkt_dir direction, + uint8_t frame_id, + uint8_t subframe_id, + uint8_t slot_id, + uint8_t symbol_no, + struct xran_up_pkt_gen_params *xp); + +static inline int32_t prepare_symbol_opt(enum xran_pkt_dir direction, + uint16_t section_id, + struct rte_mbuf *mb, + struct rb_map *data, + uint8_t compMeth, + uint8_t iqWidth, + const enum xran_input_byte_order iq_buf_byte_order, + int prb_start, + int prb_num, + uint8_t CC_ID, + uint8_t RU_Port_ID, + uint8_t seq_id, + uint32_t do_copy, + struct xran_up_pkt_gen_params *xp, + enum xran_comp_hdr_type staticEn); + + +int send_cpmsg(void *pHandle, struct rte_mbuf *mbuf,struct xran_cp_gen_params *params, + struct xran_section_gen_info *sect_geninfo, uint8_t cc_id, uint8_t ru_port_id, uint8_t seq_id); -uint8_t xran_get_max_sections(void *pHandle); +int32_t generate_cpmsg_dlul(void *pHandle, struct xran_cp_gen_params *params, struct xran_section_gen_info *sect_geninfo, struct rte_mbuf *mbuf, + enum xran_pkt_dir dir, uint8_t frame_id, uint8_t subframe_id, uint8_t slot_id, + uint8_t startsym, uint8_t numsym, uint16_t prb_start, uint16_t prb_num,int16_t iq_buffer_offset, int16_t iq_buffer_len, + uint16_t beam_id, uint8_t cc_id, uint8_t ru_port_id, uint8_t comp_method, uint8_t iqWidth, uint8_t seq_id, uint8_t symInc); -XRANEAXCIDCONFIG *xran_get_conf_eAxC(void *pHandle); -uint8_t xran_get_conf_prach_scs(void *pHandle); -uint8_t xran_get_conf_fftsize(void *pHandle); -uint8_t xran_get_conf_numerology(void *pHandle); -uint8_t xran_get_conf_iqwidth(void *pHandle); -uint8_t xran_get_conf_compmethod(void *pHandle); +int generate_cpmsg_prach(void *pHandle, struct xran_cp_gen_params *params, struct xran_section_gen_info *sect_geninfo, struct rte_mbuf *mbuf, struct xran_device_ctx *pxran_lib_ctx, + uint8_t frame_id, uint8_t subframe_id, uint8_t slot_id, int tti, + uint16_t beam_id, uint8_t cc_id, uint8_t prach_port_id, uint16_t occasionid, uint8_t seq_id); -uint8_t xran_get_num_cc(void *pHandle); -uint8_t xran_get_num_eAxc(void *pHandle); -uint8_t xran_get_llscuid(void *pHandle); -uint8_t xran_get_sectorid(void *pHandle); -struct xran_lib_ctx *xran_lib_get_ctx(void); +struct xran_eaxcid_config *xran_get_conf_eAxC(void *pHandle); +int xran_register_cb_mbuf2ring(xran_ethdi_mbuf_send_fn mbuf_send_cp, xran_ethdi_mbuf_send_fn mbuf_send_up); -uint16_t xran_alloc_sectionid(void *pHandle, uint8_t dir, uint8_t cc_id, uint8_t ant_id, uint8_t slot_id); +//uint16_t xran_alloc_sectionid(void *pHandle, uint8_t dir, uint8_t cc_id, uint8_t ant_id, uint8_t slot_id); uint8_t xran_get_seqid(void *pHandle, uint8_t dir, uint8_t cc_id, uint8_t ant_id, uint8_t slot_id); +int32_t ring_processing_func(void* arg); +int xran_init_prach(struct xran_fh_config* pConf, struct xran_device_ctx * p_xran_dev_ctx, enum xran_ran_tech xran_tech); +void xran_updateSfnSecStart(void); +uint32_t xran_slotid_convert(uint16_t slot_id, uint16_t dir); + +uint16_t xran_map_ecpriRtcid_to_vf(struct xran_device_ctx *p_dev_ctx, int32_t dir, int32_t cc_id, int32_t ru_port_id); +uint16_t xran_map_ecpriPcid_to_vf(struct xran_device_ctx *p_dev_ctx, int32_t dir, int32_t cc_id, int32_t ru_port_id); + +#ifdef __cplusplus +} +#endif #endif