X-Git-Url: https://gerrit.o-ran-sc.org/r/gitweb?p=o-du%2Fphy.git;a=blobdiff_plain;f=docs%2FxRAN-Library-Design_fh.rst;fp=docs%2FxRAN-Library-Design_fh.rst;h=07e2694c6b676242e1e1ab569dc98f6d62943f4e;hp=0000000000000000000000000000000000000000;hb=9d66fca5c45c8b3e0d6eab6d51a90c8e9d2614dc;hpb=2fbf70096f64af622da983e88c5a64e90ad9bdbd diff --git a/docs/xRAN-Library-Design_fh.rst b/docs/xRAN-Library-Design_fh.rst new file mode 100644 index 0000000..07e2694 --- /dev/null +++ b/docs/xRAN-Library-Design_fh.rst @@ -0,0 +1,1692 @@ +.. 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. + +.. |br| raw:: html + +
+ +xRAN Library Design +=================== + +.. contents:: + :depth: 3 + :local: + +The xRAN Library consists of multiple modules where different +functionality is encapsulated. The complete list of all \*.c and \*.h +files as well as Makefile for xRAN (aka FHI Lib Bronze Release) release is: + +├──fhi_lib + +│   ├── lib + +│   │   ├── api + +│   │   │   ├── xran_compression.h + +│   │   │   ├── xran_compression.hpp + +│   │   │   ├── xran_cp_api.h + +│   │   │   ├── xran_fh_o_du.h + +│   │   │   ├── xran_mlog_lnx.h + +│   │   │   ├── xran_pkt_cp.h + +│   │   │   ├── xran_pkt.h + +│   │   │   ├── xran_pkt_up.h + +│   │   │   ├── xran_sync_api.h + +│   │   │   ├── xran_timer.h + +│   │   │   ├── xran_transport.h + +│   │   │   └── xran_up_api.h + +│   │   ├── ethernet + +│   │   │   ├── ethdi.c + +│   │   │   ├── ethdi.h + +│   │   │   ├── ethernet.c + +│   │   │   └── ethernet.h + +│   │   ├── Makefile + +│   │   └── src + +│   │   │   ├── xran_app_frag.c + +│   │   │   ├── xran_app_frag.h + +│   │   │   ├── xran_common.c + +│   │   │   ├── xran_common.h + +│   │   │   ├── xran_compression.cpp + +│   │   │   ├── xran_cp_api.c + +│   │   │   ├── xran_frame_struct.c + +│   │   │   ├── xran_frame_struct.h + +│   │   │   ├── xran_lib_mlog_tasks_id.h + +│   │   │   ├── xran_main.c + +│   │   │   ├── xran_printf.h + +│   │   │   ├── xran_sync_api.c + +│   │   │   ├── xran_timer.c + +│   │   │   ├── xran_transport.c + +│   │   │   ├── xran_ul_tables.c + +│   │   │   └── xran_up_api.c + +│   ├── readme.txt + +│   ├── Licenses.txt + +│   ├── build.sh + +│   └── test + +│   │   ├── common + +│   │   │   ├── common.cpp + +│   │   │   ├── common.hpp + +│   │   │   ├── common_typedef_xran.h + +│   │   ├── xranlib_unit_test_main.cc + +│   │   └── xran_lib_wrap.hpp + +│   │   ├── master.py + +│   │   ├── readme.txt + +│   │   └── test_xran + +│   │   │   ├── chain_tests.cc + +│   │   │   ├── compander_functional.cc + +│   │   │   ├── conf.json + +│   │   │   ├── c_plane_tests.cc + +│   │   │   ├── init_sys_functional.cc + +│   │   │   ├── Makefile + +│   │   │   ├── prach_functional.cc + +│   │   │   ├── prach_performance.cc + +│   │   │   ├── unittests.cc + +│   │   │   ├── u_plane_functional.cc + +General Introduction +-------------------- + +The xRAN Library functionality is broken down into two main sections: + +- XRAN specific packet handling (src) + +- Ethernet and supporting functionality (Ethernet) + +External functions and structures are available via set of header files +in the API folder. + +This library depends on DPDK primitives to perform Ethernet networking +in userspace, including initialization and control of Ethernet ports. +Ethernet ports are expected to be SRIOV virtual functions (VF) but also +can be physical functions (PF) as well + +This library is expected to be included in the project via +xran_fh_o_du.h, statically compiled and linked with the L1 application +as well as DPDK libraries. The xRAN packet processing-specific +functionality is encapsulated into this library and not exposed to the +rest of the 5G NR pipeline. An abstract interface similar to the mmWave +front haul interface is defined in xran_fh_o_du.h to be available for +usage. + +This way, xRAN specific changes are decoupled from the 5G NR L1 +pipeline. As a result, the design and implementation of the 5G L1 +pipeline code and xRAN library can be done in parallel, provided the +defined interface is not modified. + +Ethernet consists of two modules: + +- Ethernet implements xRAN specific HW Ethernet initialization, close, + send and receive + +- ethdi provides Ethernet level software primitives to handle xRAN + packet exchange + +The xRAN layer implements the next set of functionalities: + +- Common code specific for both C-plane and U-plane as well as TX and + RX + +- Implementation of C-plane API available within the library and + externally + +- The primary function where general library initialization and + configuration performed + +- Module to provide the status of PTP synchronization + +- Timing module where system time is polled + +- eCPRI specific transport layer functions + +- APIs to handle U-plane packets + +- A set of utility modules for debugging (printf) and data tables are + included as well. + +.. image:: images/Illustration-of-xRAN-Sublayers.jpg + :width: 600 + :alt: Figure 24. Illustration of xRAN Sublayers + +Figure 24. Illustration of xRAN Sublayers + +A detailed description of functions and input/output arguments, as well +as key data structures, can be found in the Doxygen file for the FlexRAN +5G NR release. In this document supplemental information is provided +with respect to the overall design and implementation assumptions. + +Initialization and Close +------------------------ + +An example of the initialization sequence can be found in the sample +application code. It consists of the following steps: + +1.Setup structure struct xran_fh_init according to configuration. + +2.Call xran_init() to instantiate the xRAN lib memory model and +threads. The function returns a pointer to xRAN handle which is used +for consecutive configuration functions. + +3.Initialize memory buffers used for L1 and xRAN exchange of +information. + +4.Assign callback functions for (one) TTI event and for the reception +of half of the slot of symbols (7 symbols) and Full slot of symbols +14 symbols). + +5.Call xran_open() to initialize PRACH configuration, initialize DPDK, +and launch xRAN timing thread. + +6.Call xran_start() to start processing xRAN packets for DL and UL. + +After this is complete 5G L1 runs with xRAN Front haul interface. During +run time for every TTI event, the corresponding call back is called. For +packet reception on UL direction, the corresponding call back is called. +OTA time information such as frame id, subframe id and slot id can be +obtained as result synchronization of the L1 pipeline to GPS time is +performed. + +To stop and close the interface, perform this sequence of steps: + +7.Call xran_stop() to stop the processing of DL and UL. + +8.Call xran_close() to remove usage of xRAN resources. + +9.Call xran_mm_destroy() to destroy memory management subsystem. + +After this session is complete, a restart of the full L1 application is +required. The current version of the library does not support multiple +sessions without a restart of the full L1 application. + + +~~~~~~~~~~~~~ + +The xRAN library configuration is provided in the set of structures, +such as struct xran_fh_init and struct xran_fh_config. The sample +application gives an example of a test configuration used for mmWave. + +Some configuration options are not used in the Bronze Release and are reserved +for future use. + +The following options are available: + +**Structure** struct xran_fh_init\ **:** + +- Number of CC and corresponding settings for each + +- Core allocation for xRAN + +- Ethernet port allocation + +- O-DU and RU Ethernet Mac address + +- Timing constraints of O-DU and 0-RU + +- Debug features + +**Structure** struct xran_fh_config\ **:** + +- Number of eAxC + +- TTI Callback function and parameters + +- PRACH 5G NR specific settings + +- TDD frame configuration + +- BBU specific configuration + +- RU specific configuration + +**From an implementation perspective:** + +xran_init() performs init of the xRAN library and interface according to +struct xran_fh_init information as per the start of application +configuration.: + +- Init DPDK with corresponding networking ports and core assignment + +- Init mbuf pools + +- Init DPDK timers and DPDK rings for internal packet processing + +- Instantiate ORAH FH thread doing + +- Timing processing (xran_timing_source_thread()) + +- ETH PMD (process_dpdk_io()) + +- IO XRAN-PHY exchange (ring_processing_func()) + +**xran_open()** performs additional configuration as per run scenario: + +- PRACH configuration + +- C-plane initialization + +The Function **xran_close()** performs free of resources and allows potential +restart of front haul interface with a different scenario. + +Start/Stop +~~~~~~~~~~ + +The Functions **xran_start()/xran_stop()** enable/disable packet processing for +both DL and UL. This triggers execution of callbacks into the L1 +application. + +Data Exchange +~~~~~~~~~~~~~ + +Exchange of IQ samples, as well as C-plane specific information, is +performed using a set of buffers allocated by xRAN |br| +library from DPDK +memory and shared with the l1 application. Buffers are allocated as a +standard mbuf structure and DPDK pools are used to manage the allocation +and free resources. Shared buffers are allocated at the init stage and +are expected to be reused within 80 TTIs (10 ms). + +The xRAN protocol requires U-plane IQ data to be transferred in network +byte order, and the L1 application handles IQ sample data in CPU byte +order, requiring a swap. The PHY BBU pooling tasks perform copy and byte +order swap during packet processing. + +C-plane Information Settings +~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +The interface between the xRAN library and PHY is defined via struct +xran_prb_map and similar to the data plane. The same mbuf memory is used +to allocate memory map of PRBs for each TTI. + +/\* Beamforming weights for single stream for each PRBs given number of +Antenna elements \*/ + +struct xran_cp_bf_weight{ + +int16_t nAntElmTRx; /* num TRX for this allocation \*/ + +int8_t\* p_ext_section; /* pointer to form extType \*/ + +int16_t ext_section_sz; /* extType section size \*/ + +}; + +struct xran_cp_bf_attribute{ + +int16_t weight[4]; + +}; + +struct xran_cp_bf_precoding{ + +int16_t weight[4]; + +}; + +/\* section descriptor for given number of PRBs used on U-plane packet +creation \*/ + +struct xran_section_desc { + +uint16_t section_id; /* section id used for this element \*/ + +int16_t iq_buffer_offset; /* Offset in bytes for the content of IQs +with in main symb buffer \*/ + +int16_t iq_buffer_len; /* Length in bytes for the content of IQs with +in main symb buffer \*/ + +uint8_t \*pData; /* optional pointer to data buffer \*/ + +void \*pCtrl; /* optional poitner to mbuf \*/ + +}; + +/* PRB element structure \*/ + +struct xran_prb_elm { + +int16_t nRBStart; /* start RB of RB allocation \*/ + +int16_t nRBSize; /* number of RBs used \*/ + +int16_t nStartSymb; /* start symbol ID \*/ + +int16_t numSymb; /* number of symbols \*/ + +int16_t nBeamIndex; /* beam index for given PRB \*/ + +int16_t bf_weight_update; /* need to update beam weights or not \*/ + +int16_t compMethod; /* compression index for given PRB \*/ + +int16_t iqWidth; /* compression bit width for given PRB \*/ + +int16_t BeamFormingType; /* index based, weights based or +attribute-based beam forming*/ + +struct xran_section_desc \* p_sec_desc[XRAN_NUM_OF_SYMBOL_PER_SLOT]; +/* section desctiptors to U-plane data given RBs \*/ + +struct xran_cp_bf_weight bf_weight; /* beam forming information +relevant for given RBs \*/ + +union { + +struct xran_cp_bf_attribute bf_attribute; + +struct xran_cp_bf_precoding bf_precoding; + +}; + +}; + +/* PRB map structure \*/ + +struct xran_prb_map { + +uint8_t dir; /* DL or UL direction \*/ + +uint8_t xran_port; /* xran id of given RU [0-(XRAN_PORTS_NUM-1)] \*/ + +uint16_t band_id; /* xran band id \*/ + +uint16_t cc_id; /* componnent carrier id [0 - (XRAN_MAX_SECTOR_NR-1)] +\*/ + +uint16_t ru_port_id; /* RU device antenna portid [0 - +(XRAN_MAX_ANTENNA_NR-1)*/ + +uint16_t tti_id; /* xRAN slot id [0 - (max tti-1)] \*/ + +uint8_t start_sym_id; /* start symbol Id [0-13] \*/ + +uint32_t nPrbElm; /* total number of PRB elements for given map [0- +(XRAN_MAX_PRBS-1)] \*/ + +struct xran_prb_elm prbMap[XRAN_MAX_PRBS]; + +}; + +For the Bronze release C-plane sections are expected to be provided by L1 +pipeline. If 100% of RBs allocated at all times single element of RB map +is expected to be allocated across all symbols. Dynamic RB allocation is +performed base on C-plane configuration. + +The xRAN library will require that the content of the PRB map should be +sorted in increasing order of PRB first and then symbols. + +Memory Management +----------------- + +Memory used for the exchange of IQ data as well as control information, +is controlled by the xRAN library. L1 application at the init stage +performs: + +- init memory management subsystem + +- init buffer management subsystem (via DPDK pools) + +- allocate buffers (mbuf) for each CC, antenna, symbol, and direction \ + (DL, UL, PRACH) for XRAN_N_FE_BUF_LEN TTIs. + +- buffers are reused for every XRAN_N_FE_BUF_LEN TTIs + +After the session is completed, the application can free buffers and +destroy the memory management subsystem. + +From an implementation perspective, the xRAN library uses a standard +mbuf primitive and allocates a pool of buffers for each sector. This +function is performed using rte_pktmbuf_pool_create(), +rte_pktmbuf_alloc(), rte_pktmbuf_append() to allocate one buffer per +symbol for the mmWave case. More information on mbuf and DPDK pools can +be found in the DPDK documentation. + +In the current implementation, mbuf, the number of buffers shared with +the L1 application is the same number of buffers used to send to and +receive from the Ethernet port. Memory copy operations are not required +if the packet size is smaller than or equal to MTU. Future versions of +the xRAN library are required to remove the memory copy requirement for +packets where the size larger than MTU. + +External Interface Memory +~~~~~~~~~~~~~~~~~~~~~~~~~ + +The xRAN library header file defines a set of structures to simplify +access to memory buffers used for IQ data. + +struct xran_flat_buffer { + +uint32_t nElementLenInBytes; + +uint32_t nNumberOfElements; + +uint32_t nOffsetInBytes; + +uint32_t nIsPhyAddr; + +uint8_t \*pData; + +void \*pCtrl; + +}; + +struct xran_buffer_list { + +uint32_t nNumBuffers; + +struct xran_flat_buffer \*pBuffers; + +void \*pUserData; + +void \*pPrivateMetaData; + +}; + +typedef struct { + +int32_t bValid ; + +int32_t nSegToBeGen; + +int32_t nSegGenerated; + +int32_t nSegTransferred; + +struct rte_mbuf \*pData[N_MAX_BUFFER_SEGMENT]; + +struct xran_buffer_list sBufferList; + +} BbuIoBufCtrlStruct; + +There is no explicit requirement for user to organize a set of buffers +in this particular way. From a compatibility |br| +perspective it is useful to +follow the existing design of the 5G NR l1app used for Front Haul FPGA +and define structures shared between l1 and xRAN lib as shown: + +/\* io struct \*/ + +BbuIoBufCtrlStruct +sFrontHaulTxBbuIoBufCtrl[XRAN_N_FE_BUF_LEN][XRAN_MAX_SECTOR_NR]\ +[XRAN_MAX_ANTENNA_NR]; + +BbuIoBufCtrlStruct +sFrontHaulTxPrbMapBbuIoBufCtrl[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 +sFrontHaulRxPrbMapBbuIoBufCtrl[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]; + +/\* Cat B \*/ + +BbuIoBufCtrlStruct +sFHSrsRxBbuIoBufCtrl[XRAN_N_FE_BUF_LEN][XRAN_MAX_SECTOR_NR][XRAN_MAX_ANT_ARRAY_ELM_NR]; + +/\* buffers list \*/ + +struct xran_flat_buffer +sFrontHaulTxBuffers[XRAN_N_FE_BUF_LEN][XRAN_MAX_SECTOR_NR][XRAN_MAX_ANTENNA_NR][XRAN_NUM_OF_SYMBOL_PER_SLOT]; + +struct xran_flat_buffer +sFrontHaulTxPrbMapBuffers[XRAN_N_FE_BUF_LEN][XRAN_MAX_SECTOR_NR][XRAN_MAX_ANTENNA_NR][XRAN_NUM_OF_SYMBOL_PER_SLOT]; + +struct xran_flat_buffer +sFrontHaulRxBuffers[XRAN_N_FE_BUF_LEN][XRAN_MAX_SECTOR_NR][XRAN_MAX_ANTENNA_NR][XRAN_NUM_OF_SYMBOL_PER_SLOT]; + +struct xran_flat_buffer +sFrontHaulRxPrbMapBuffers[XRAN_N_FE_BUF_LEN][XRAN_MAX_SECTOR_NR][XRAN_MAX_ANTENNA_NR][XRAN_NUM_OF_SYMBOL_PER_SLOT]; + +struct xran_flat_buffer +sFHPrachRxBuffers[XRAN_N_FE_BUF_LEN][XRAN_MAX_SECTOR_NR][XRAN_MAX_ANTENNA_NR][XRAN_NUM_OF_SYMBOL_PER_SLOT]; + +/\* Cat B SRS buffers \*/ + +struct xran_flat_buffer +sFHSrsRxBuffers[XRAN_N_FE_BUF_LEN][XRAN_MAX_SECTOR_NR][XRAN_MAX_ANT_ARRAY_ELM_NR][XRAN_MAX_NUM_OF_SRS_SYMBOL_PER_SLOT]; + +Doxygen file and xran_fh_o_du.h provide more details on the definition +and usage of these structures. + +xRAN Specific Functionality +--------------------------- + +Front haul interface implementation in the general case is abstracted +away using the interface defined in xran_fh_o_du.h + +The L1 application is not required to access xRAN protocol primitives +(eCPRI header, application header, and others) directly. It is +recommended to use the interface to remove dependencies between +different software modules such as the l1 pipeline and xRAN library. + +External API +~~~~~~~~~~~~ + +The U-plane and C-plane APIs can be used directly from the application +if such an option is required. The set of header files can be exported +and called directly. + +xran_fh_o_du.h – xRAN main header file for O-DU scenario + +xran_cp_api.h – Control plane functions + +xran_pkt_cp.h – xRAN control plane packet definition + +xran_pkt.h – xRAN packet definition + +xran_pkt_up.h – xRAN User plane packet definition + +xran_sync_api.h – api functions to check PTP status + +xran_timer.h – API for timing + +xran_transport.h – eCPRI transport layer definition and api + +xran_up_api.h – user plane functions and definitions + +xran_compression.h – interface to compression/decompression functions + +Doxygen files provide detailed information on functions and structures +available. + +.. _c-plane-1: + +C-plane +~~~~~~~ + +Implementation of the C-plane set of functions is defined in +xran_cp_api.c and is used to prepare the content of C-plane packets +according to the given configuration. Users can enable/disable +generation of C-plane messages using enableCP field in struct +xran_fh_init structure during init of ORAN front haul. The time of +generation of C-plane message for DL and UL is done “Slot-based,” and +timing can be controlled using O-DU settings according to Table 4. + +The C-plane module contains: + +- initialization of C-plane database to keep track of allocation of + resources + +- code to prepare C-plane packet for TX (O-DU) + +- eCPRI header + +- append radio application header + +- append control section header + +- append control section + +- parser of C-plane packet for RX (O-RU emulation) + +- parses and checks Section 1 and Section 3 packet content + +Sending and receiving packets is performed using xRAN ethdi sublayer +functions. + +Creating a C-Plane Packet +^^^^^^^^^^^^^^^^^^^^^^^^^ + +API and Data Structures +''''''''''''''''''''''' + +A C-Plane message can be composed using the following API: + +int xran_prepare_ctrl_pkt(struct rte_mbuf \*mbuf, + +struct xran_cp_gen_params \*params, + +uint8_t CC_ID, uint8_t Ant_ID, uint8_t seq_id); + +mbuf is the pointer of a DPDK packet buffer, which is allocated from the +caller. + +params are the pointer of the structure which has the parameters to +create the message. + +CC_ID is the parameter to specify component carrier index, Ant_ID is the +parameters to specify the antenna port index (RU port index). + +seq_id is the sequence index for the message. + +params, the parameters to create a C-Plane message are defined as the +structure of xran_cp_gen_params with an |br| +example given below: + +struct xran_cp_gen_params { + +uint8_t dir; + +uint8_t sectionType; + +uint16_t numSections; + +struct xran_cp_header_params hdr; + +struct xran_section_gen_info \*sections; + +}; + +dir is the direction of the C-Plane message to be generated. Available +parameters are defined as XRAN_DIR_UL and XRAN_DIR_DL. + +sectionType is the section type for C-Plane message to generate, as ORAN +specification defines all sections in a C-Plane message shall have the +same section type. If different section types are required, they shall +be sent with separate C-Plane messages. Available types of sections are +defined as XRAN_CP_SECTIONTYPE_x. Please refer to the Table 5-2 Section +Types in chapter 5.4 of ORAN specification. + +numSections is the total number of sections to generate, i.e., the +number of the array in sections (struct xran_section_gen_info). + +hdr is the structure to hold the information to generate the radio +application and section header in the C-Plane message. It is defined as +the structure of xran_cp_header_params. Not all parameters in this +structure are used for the generation, and the required parameters are +slightly different by the type of section, as described in Table 10 and +Table 11. + +Table 10. struct xran_cp_header_params – Common Radio Application Header + ++------------+---------------------------------------------+---------+ +| | Description | Remarks | ++============+=============================================+=========+ +| filterIdx | Filter Index. Available values are defined | 5.4.4.3 | +| | as XRAN_FILTERINDEX_xxxxx. | | ++------------+---------------------------------------------+---------+ +| frameId | Frame Index. It is modulo 256 of frame | 5.4.4.4 | +| | number. | | ++------------+---------------------------------------------+---------+ +| subframeId | Sub-frame Index. | 5.4.4.5 | ++------------+---------------------------------------------+---------+ +| slotId | Slot Index. The maximum number is 15, as | 5.4.4.6 | +| | defined in the specification. | | ++------------+---------------------------------------------+---------+ +| startSymId | Start Symbol Index. | 5.4.4.7 | ++------------+---------------------------------------------+---------+ + +Table 11. struct xran_cp_header_params – Section Specific Parameters + ++----------+----------+----------+---------+---+---+---+---+----------+ +| | Des\ | Section | Remarks | | | | | | +| | cription | Type | | | | | | | +| | | ap\ | | | | | | | +| | | plicable | | | | | | | ++==========+==========+==========+=========+===+===+===+===+==========+ +| | | 0 | 1 | 3 | 5 | 6 | 7 | | ++----------+----------+----------+---------+---+---+---+---+----------+ +| fftSize | FFT size | X | | X | | | | 5.4.4.13 | +| | in frame | | | | | | | | +| | st\ | | | | | | | | +| | ructure. | | | | | | | | +| | A\ | | | | | | | | +| | vailable | | | | | | | | +| | values | | | | | | | | +| | are | | | | | | | | +| | defined | | | | | | | | +| | as | | | | | | | | +| | X\ | | | | | | | | +| | RAN_FFTS\| | | | | | | | +| | IZE_xxxx | | | | | | | | ++----------+----------+----------+---------+---+---+---+---+----------+ +| Scs | Su\ | X | | X | | | | 5.4.4.13 | +| | bcarrier | | | | | | | | +| | Spacing | | | | | | | | +| | in the | | | | | | | | +| | frame | | | | | | | | +| | st\ | | | | | | | | +| | ructure. | | | | | | | | +| | A\ | | | | | | | | +| | vailable | | | | | | | | +| | values | | | | | | | | +| | are | | | | | | | | +| | defined | | | | | | | | +| | as | | | | | | | | +| | XRAN_SCS\| | | | | | | | +| | _xxxx | | | | | | | | ++----------+----------+----------+---------+---+---+---+---+----------+ +| iqWidth | I/Q bit | | X | X | X | | | 5.4.4.10 | +| | width in | | | | | | | | +| | user | | | | | | | 6.3.3.13 | +| | data | | | | | | | | +| | com\ | | | | | | | | +| | pression | | | | | | | | +| | header. | | | | | | | | +| | Should | | | | | | | | +| | be set | | | | | | | | +| | by zero | | | | | | | | +| | for | | | | | | | | +| | 16bits | | | | | | | | ++----------+----------+----------+---------+---+---+---+---+----------+ +| compMeth | Com\ | | X | X | X | | | 5.4.4.10 | +| | pression | | | | | | | | +| | Method | | | | | | | 6.3.3.13 | +| | in user | | | | | | | | +| | data | | | | | | | | +| | com\ | | | | | | | | +| | pression | | | | | | | | +| | header. | | | | | | | | +| | A\ | | | | | | | | +| | vailable | | | | | | | | +| | values | | | | | | | | +| | are | | | | | | | | +| | defined | | | | | | | | +| | as | | | | | | | | +| | XRAN\ | | | | | | | | +| | _COMPMET\| | | | | | | | +| | HOD_xxxx | | | | | | | | ++----------+----------+----------+---------+---+---+---+---+----------+ +| numUEs | Number | | | | | X | | 5.4.4.11 | +| | of UEs. | | | | | | | | +| | Applies | | | | | | | | +| | to | | | | | | | | +| | section | | | | | | | | +| | type 6 | | | | | | | | +| | and not | | | | | | | | +| | s\ | | | | | | | | +| | upported | | | | | | | | +| | in this | | | | | | | | +| | release. | | | | | | | | ++----------+----------+----------+---------+---+---+---+---+----------+ +| ti\ | Time | X | | X | | | | 5.4.4.12 | +| meOffset | Offset. | | | | | | | | +| | Time | | | | | | | | +| | offset | | | | | | | | +| | from the | | | | | | | | +| | start of | | | | | | | | +| | the slot | | | | | | | | +| | to start | | | | | | | | +| | of | | | | | | | | +| | Cyclic | | | | | | | | +| | Prefix. | | | | | | | | ++----------+----------+----------+---------+---+---+---+---+----------+ +| cpLength | Cyclic | X | | X | | | | 5.4.4.14 | +| | Prefix | | | | | | | | +| | Length. | | | | | | | | ++----------+----------+----------+---------+---+---+---+---+----------+ + +**Only sections types 1 and 3 are supported in the current release.** + +Sections are the pointer to the array of structure which has the +parameters for section(s) and it is defined as below: + +struct xran_section_gen_info { + +struct xran_section_info info; + +uint32_t exDataSize; + +struct { + +uint16_t type; + +uint16_t len; + +void \*data; + +} exData[XRAN_MAX_NUM_EXTENSIONS]; + +}; + +info is the structure to hold the information to generate section and it +is defined as the structure of xran_section_info. Like +xran_cp_header_params, all parameters are not required to generate +section and Table 12 describes which |br| +parameters are required for each +section. + +Table 12. Parameters for Sections + ++-------+-------+-------+-------+-------+-------+-------+-------+ +| | D\ | Se\ | Re\ | | | | | +| | escri\| ction | marks | | | | | +| | ption | Type | | | | | | +| | | appli\| | | | | | +| | | cable | | | | | | ++=======+=======+=======+=======+=======+=======+=======+=======+ +| | | 0 | 1 | 3 | 5 | 6 | | ++-------+-------+-------+-------+-------+-------+-------+-------+ +| Id | Se\ | **X** | **X** | **X** | **X** | **X** | 5.\ | +| | ction | | | | | | 4.5.1 | +| | I\ | | | | | | | +| | denti\| | | | | | | +| | fier. | | | | | | | ++-------+-------+-------+-------+-------+-------+-------+-------+ +| Rb | Res\ | **X** | **X** | **X** | **X** | **X** | 5.\ | +| | ource | | | | | | 4.5.2 | +| | Block\| | | | | | | +| | Indic\| | | | | | | +| | ator. | | | | | | | +| | Avai\ | | | | | | | +| | lable | | | | | | | +| | v\ | | | | | | | +| | alues | | | | | | | +| | are | | | | | | | +| | de\ | | | | | | | +| | fined | | | | | | | +| | as | | | | | | | +| | XRAN\ | | | | | | | +| | _\ | | | | | | | +| | RBI\ | | | | | | | +| | ND_xx\| | | | | | | +| | xx. | | | | | | | ++-------+-------+-------+-------+-------+-------+-------+-------+ +| s\ | S\ | **X** | **X** | **X** | **X** | **X** | 5.\ | +| ymInc | ymbol | | | | | | 4.5.3 | +| | n\ | | | | | | | +| | umber | | | | | | | +| | Incr\ | | | | | | | +| | ement | | | | | | | +| | com\ | | | | | | | +| | mand. | | | | | | | +| | Avai\ | | | | | | | +| | lable | | | | | | | +| | v\ | | | | | | | +| | alues | | | | | | | +| | are | | | | | | | +| | de\ | | | | | | | +| | fined | | | | | | | +| | as | | | | | | | +| | XRA\ | | | | | | | +| | N_SYM\| | | | | | | +| | BOL\ | | | | | | | +| | NUMBE\| | | | | | | +| | R_xx\ | | | | | | | +| | xx. | | | | | | | ++-------+-------+-------+-------+-------+-------+-------+-------+ +| star\ | Sta\ | **X** | **X** | **X** | **X** | **X** | 5.\ | +| tPrbc | rting\| | | | | | 4.5.4 | +| | PRB | | | | | | | +| | of | | | | | | | +| | data | | | | | | | +| | se\ | | | | | | | +| | ction | | | | | | | +| | de\ | | | | | | | +| | scrip\| | | | | | | +| | tion. | | | | | | | ++-------+-------+-------+-------+-------+-------+-------+-------+ +| nu | The | **X** | **X** | **X** | **X** | **X** | 5.\ | +| mPrbc | n\ | | | | | | 4.5.6 | +| | umber | | | | | | | +| | of | | | | | | | +| | conti\| | | | | | | +| | guous | | | | | | | +| | PRBs | | | | | | | +| | per | | | | | | | +| | data | | | | | | | +| | se\ | | | | | | | +| | ction | | | | | | | +| | de\ | | | | | | | +| | scrip\| | | | | | | +| | tion. | | | | | | | +| | When | | | | | | | +| | nu\ | | | | | | | +| | mPrbc | | | | | | | +| | is | | | | | | | +| | gr\ | | | | | | | +| | eater | | | | | | | +| | than | | | | | | | +| | 255, | | | | | | | +| | it | | | | | | | +| | will | | | | | | | +| | be | | | | | | | +| | conv\ | | | | | | | +| | erted | | | | | | | +| | to | | | | | | | +| | zero | | | | | | | +| | by | | | | | | | +| | the | | | | | | | +| | macro | | | | | | | +| | (XR\ | | | | | | | +| | AN_CO\| | | | | | | +| | NVERT\| | | | | | | +| | _NUMP\| | | | | | | +| | RBC). | | | | | | | ++-------+-------+-------+-------+-------+-------+-------+-------+ +| r\ | Res\ | **X** | **X** | **X** | **X** | | 5.\ | +| eMask | ource\| | | | | | 4.5.5 | +| | El\ | | | | | | | +| | ement\| | | | | | | +| | Mask. | | | | | | | ++-------+-------+-------+-------+-------+-------+-------+-------+ +| numS\ | N\ | **X** | **X** | **X** | **X** | | 5.\ | +| ymbol | umber | | | | | | 4.5.7 | +| | of | | | | | | | +| | Sym\ | | | | | | | +| | bols. | | | | | | | ++-------+-------+-------+-------+-------+-------+-------+-------+ +| b\ | Beam\ | | **X** | **X** | | | 5.\ | +| eamId | I\ | | | | | | 4.5.9 | +| | denti\| | | | | | | +| | fier. | | | | | | | ++-------+-------+-------+-------+-------+-------+-------+-------+ +| freqO\| Freq\ | | | **X** | | | 5.4\ | +| ffset | uency\| | | | | | .5.11 | +| | Of\ | | | | | | | +| | fset. | | | | | | | ++-------+-------+-------+-------+-------+-------+-------+-------+ +| ueId | UE\ | | | | **X** | **X** | 5.4\ | +| | i\ | | | | | | .5.10 | +| | denti\| | | | | | | +| | fier. | | | | | | | +| | Not | | | | | | | +| | supp\ | | | | | | | +| | orted | | | | | | | +| | in | | | | | | | +| | this | | | | | | | +| | rel\ | | | | | | | +| | ease. | | | | | | | ++-------+-------+-------+-------+-------+-------+-------+-------+ +| regF\ | Regu\ | | | | | **X** | 5.4\ | +| actor | lariz\| | | | | | .5.12 | +| | ation | | | | | | | +| | Fa\ | | | | | | | +| | ctor. | | | | | | | +| | Not | | | | | | | +| | supp\ | | | | | | | +| | orted | | | | | | | +| | in | | | | | | | +| | this | | | | | | | +| | re\ | | | | | | | +| | lease | | | | | | | ++-------+-------+-------+-------+-------+-------+-------+-------+ +| Ef | Exte\ | | **X** | **X** | **X** | **X** | 5.\ | +| | nsion | | | | | | 4.5.8 | +| | Flag. | | | | | | | +| | Not | | | | | | | +| | supp\ | | | | | | | +| | orted | | | | | | | +| | in | | | | | | | +| | this | | | | | | | +| | rel\ | | | | | | | +| | ease. | | | | | | | ++-------+-------+-------+-------+-------+-------+-------+-------+ + +**Only sections types 1 and 3 are supported in the current release.** + +**The xran_section_info has more parameters – type, startSymId, iqWidth, +compMeth. These are the same parameters as those of radio application +or section header but need to be copied into this structure again for +the section data base.** + +exDataSize and exData are used to add section extensions for the +section. + +exDataSize is the number of elements in the exData array. The maximum +number of elements is defined as XRAN_MAX_NUM_EXTENSIONS and it is +defined by four in this release with the assumption that four different +types of section extensions can be added to a section (section extension +type 3 is excluded since it is not supported). exData.type is the type +of section extension and exData.len is the length of structure of +section extension parameter in exData.data. exData.data is the pointer +to the structure of section extensions and different structures are used +by the type of section extensions like below. + +struct xran_sectionext1_info { + +uint16_t rbNumber; /* number RBs to ext1 chain \*/ + +uint16_t bfwNumber; /* number of bf weights in this section \*/ + +uint8_t bfwiqWidth; + +uint8_t bfwCompMeth; + +int16_t \*p_bfwIQ; /* pointer to formed section extention \*/ + +int16_t bfwIQ_sz; /* size of buffer with section extention information +\*/ + +union { + +uint8_t exponent; + +uint8_t blockScaler; + +uint8_t compBitWidthShift; + +uint8_t activeBeamspaceCoeffMask[XRAN_MAX_BFW_N]; /\* ceil(N/8)*8, +should be multiple of 8 \*/ + +} bfwCompParam; + +}; + +For section extension type 1, the structure of xran_sectionext1_info is +used. Please note that the xRAN library will use bfwIQ (beamforming +weight) as-is, i.e., xRAN library will not perform the compression, so +the user should provide proper data to bfwIQ. + +struct xran_sectionext2_info { + +uint8_t bfAzPtWidth; + +uint8_t bfAzPt; + +uint8_t bfZePtWidth; + +uint8_t bfZePt; + +uint8_t bfAz3ddWidth; + +uint8_t bfAz3dd; + +uint8_t bfZe3ddWidth; + +uint8_t bfZe3dd; + +uint8_t bfAzSI; + +uint8_t bfZeSI; + +}; + +For section extension type 2, the structure of xran_sectionext2_info is +used. Each parameter will be packed as specified bit width. + +struct xran_sectionext4_info { + +uint8_t csf; + +uint8_t pad0; + +uint16_t modCompScaler; + +}; + +For section extension type 4, the structure of xran_sectionext4_info is +used. + +struct xran_sectionext5_info { + +uint8_t num_sets; + +struct { + +uint16_t csf; + +uint16_t mcScaleReMask; + +uint16_t mcScaleOffset; + +} mc[XRAN_MAX_MODCOMP_ADDPARMS]; + +}; + +For section extension type 5, the structure of xran_sectionext5_info is +used. Please note that current implementation supports maximum two sets +of additional parameters. + +**Section extensions type 3 is not supported since it is LTE specific.** + +Section Extensions are not fully verified in this release. + +Detail Procedures in API +'''''''''''''''''''''''' + +xran_prepare_ctrl_pkt() has several procedures to compose a C-Plane +packet. + +1. Append transport header + +- Reserve eCPRI header space in the packet buffer + +- eCPRI version is fixed by XRAN_ECPRI_VER (0x0001) + +- Concatenation and transport layer fragmentation is not supported. + + ecpri_concat=0, ecpri_seq_id.sub_seq_id=0 and ecpri_seq_id.e_bit=1 + +- The caller needs to provide a component carrier index, antenna index, + and message identifier through function arguments. + + CC_ID, Ant_ID and seq_id + +- ecpriRtcid (ecpri_xtc_id) is composed with CC_ID and Ant_ID by + xran_compose_cid. + +- DU port ID and band sector ID are fixed by zero in this release. + +- The output of xran_compose_cid is stored in network byte order. + +- The length of the payload is initialized by zero. + +2. Append radio application header: + +- xran_append_radioapp_header() checks the type of section through + params->sectionType and determines proper function to append + remaining header components. + +- Only section type 1 and 3 are supported, returns + XRAN_STATUS_INVALID_PARAM for other types. + +- Each section uses a different function to compose the remaining + header and size to calculate the total length in the transport + header. + +For section type 1, xran_prepare_section1_hdr() and sizeof(struct +xran_cp_radioapp_section1_header) + +For section type 3, xran_prepare_section3_hdr() and sizeof(struct +xran_cp_radioapp_section3_header) + +- Reserves the space of common radio application header and composes + header by xran_prepare_radioapp_common_header(). + +- The header is stored in network byte order. + +- Appends remaining header components by the selected function above + +- The header is stored in network byte order + +3. Append section header and section + +- xran_append_control_section() determines proper size and function to + append section header and contents. + +- For section type 1, xran_prepare_section1() and sizeof(struct + xran_cp_radioapp_section1) + +- For section type 3, xran_prepare_section3() and sizeof(struct + xran_cp_radioapp_section3) + +- Appends section header and section(s) by selected function above. + +- If multiple sections are configured, then those will be added. + +- Since fragmentation is not considered in this implementation, the + total length of a single C-Plane message shall not exceed MTU + size. + +- The header and section(s) are stored in network byte order. + +- Appends section extensions if it is set (ef=1) + +- xran_append_section_extensions() adds all configured extensions by + its type. + +- xran_prepare_sectionext_x() (x = 1,2,4,5) will be called by the + type from xran_append_section_extensions() and these functions + will create extension field. + +**Example Usage of API** +'''''''''''''''''''''''' + +There are two reference usages of API to generate C-Plane message in +lib/src/xran_common.c + +- generate_cpmsg_dlul() + +- generate_cpmsg_prach() + +generate_cpmsg_dlul() is to generate the C-Plane message with section +type 1 for DL or UL symbol data scheduling. + +This function has hardcoded values for some parameters such as: + +- The filter index is fixed to XRAN_FILTERINDEX_STANDARD. + +- RB indicator is fixed to XRAN_RBIND_EVERY. + +- Symbol increment is not used (XRAN_SYMBOLNUMBER_NOTINC) + +- Resource Element Mask is fixed to 0xfff + +The extension is not used. + +After C-Plane message generation, API send_cpmsg() is called. This +function also includes the implementation for these capabilities: + +- Send the generated packet to the TX ring after adding an Ethernet + header. + +- Add section information of generated C-Plane packet to section + database, to generate U-plane message by C-Plane configuration + +send_cpmsg_prach() is to generate the C-Plane message with section type +3 for PRACH scheduling. + +This functions also has some hardcoded values for the following +parameters: + +- RB indicator is fixed to XRAN_RBIND_EVERY. + +- Symbol increment is not used (XRAN_SYMBOLNUMBER_NOTINC). + +- Resource Element Mask is fixed to 0xfff. + +And similar to generate_cpmsg_dlul(), after this function generates the +message, send_cpmsg() sends the generated packet to the TX ring and adds +section information of the packet to the section database. Checking and +parsing received PRACH symbol data by section information from the +C-Plane are not implemented in this release. + +Example Configuration of C-Plane Messages +''''''''''''''''''''''''''''''''''''''''' + +C-Plane messages can be composed through API, and the sample application +shows several reference usages of the configuration for different +numerologies. + +Below are the examples of C-Plane message configuration with a sample +application for mmWave – numerology 3, 100 MHz bandwidth, TDD (DDDS) + +**C-Plane Message – downlink symbol data for a downlink slot** + +- Single CP message with the single section of section type 1 + +- Configures single CP message for all consecutive downlink symbols + +- Configures whole RBs (66) for a symbol + +- Compression and beamforming are not used + +**C-Plane Message – uplink symbol data for uplink slot** + +- Single CP message with the single section of section type 1 + +- Configures single CP message for all consecutive uplink symbols (UL + symbol starts from 3) + +- Configures whole RBs (66) for a symbol + +- Compression and beamforming are not used + +**C-Plane Message – PRACH** + +- Single CP message with the single section of section type 3 including + repetition + +- Configures PRACH format A3, config index 81, and detail parameters + are: + +- Filter Index : 3 + +- CP length : 0 + +- Time offset : 2026 + +- FFT size : 1024 + +- Subcarrier spacing : 120KHz + +- Start symbol index : 7 + +- Number of symbols : 6 + +- Number of PRBCs : 12 + +- Frequency offset : -792 + +- Compression and beamforming are not used + +Functions to Store/Retrieve Section Information +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +There are several functions to store/retrieve section information of +C-Plane messages. Since U-plane messages must be generated by the +information in the sections of a C-Plane message, it is required to +store and retrieve section |br| +information. + +**APIs and Data Structure** +''''''''''''''''''''''''''' + +APIs for initialization and release storage are: + +- int xran_cp_init_sectiondb(void \*pHandle); + +- int xran_cp_free_sectiondb(void \*pHandle); + +APIs to store and retrieve section information are: + +- int xran_cp_add_section_info(void \*pHandle, uint8_t dir, uint8_t + cc_id, uint8_t ruport_id, uint8_t ctx_id, struct xran_section_info + \*info); + +- int xran_cp_add_multisection_info(void \*pHandle, uint8_t cc_id, + uint8_t ruport_id, uint8_t ctx_id, struct xran_cp_gen_params + \*gen_info); + +- struct xran_section_info \*xran_cp_find_section_info(void \*pHandle, + uint8_t dir, uint8_t cc_id, uint8_t ruport_id, uint8_t ctx_id, + uint16_t section_id); + +- struct xran_section_info \*xran_cp_iterate_section_info(void + \*pHandle, uint8_t dir, uint8_t cc_id, uint8_t ruport_id, uint8_t + ctx_id, uint32_t \*next); + +- int xran_cp_getsize_section_info(void \*pHandle, uint8_t dir, uint8_t + cc_id, uint8_t ruport_id, uint8_t ctx_id); + +APIs to reset the storage for a new slot are: + +- int xran_cp_reset_section_info(void \*pHandle, uint8_t dir, uint8_t + cc_id, uint8_t ruport_id, uint8_t ctx_id); + +The structure of xran_section_info is used to store/retrieve +information. This is the same structure used to generate a C-Plane +message. Please refer to Section 5.4.2.1.1 for more details. + +The storage for section information is declared as a multi-dimensional +array and declared as a local static variable to limit direct access. +Each item is defined as the structure of xran_sectioninfo_db, and it has +the number of stored section information items (cur_index) and the array +of the information (list), as shown below. + +/* + +\* This structure to store the section information of C-Plane + +\* in order to generate and parse corresponding U-Plane \*/ + +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 \*/ + +}; + +static struct xran_sectioninfo_db +sectiondb[XRAN_MAX_SECTIONDB_CTX][XRAN_DIR_MAX][XRAN_COMPONENT_CARRIERS_MAX][XRAN_MAX_ANTENNA_NR*2 ++ XRAN_MAX_ANT_ARRAY_ELM_NR]; + +The maximum size of the array can be adjusted if required by system +configuration. Since transmission and reception window of U-Plane can be +overlapped with the start of new C-Plane for next slot, functions have +context index to identify and protect the information. Currently the +maximum number of context is defined by two and it can be adjusted if +needed. + +8. Since the context index is not managed by the library and APIs are +expecting it from the caller as a parameter, the caller shall +consider a proper method to manage it to avoid corruption. The +current reference implementation uses a slot and subframe index to +calculate the context index. + +**Example Usage of APIs** +''''''''''''''''''''''''' + +There are references to show the usage of APIs as below. + +- Initialization and release: + +- xran_cp_init_sectiondb(): xran_open() in lib/src/xran_main.c + +- xran_cp_free_sectiondb(): xran_close() in lib/src/xran_main.c + +- Store section information: + +- xran_cp_add_section_info(): send_cpmsg_dlul() and + send_cpmsg_prach()in lib/src/xran_main.c + +- Retrieve section information: + +- xran_cp_iterate_section_info(): xran_process_tx_sym() in + lib/src/xran_main.c + +- xran_cp_getsize_section_info(): xran_process_tx_sym() in + lib/src/xran_main.c + +- Reset the storage for a new slot: + +- xran_cp_reset_section_info(): tx_cp_dl_cb() and tx_cp_ul_cb() in + lib/src/xran_main.c + +**Function for RU emulation and Debug** +''''''''''''''''''''''''''''''''''''''' + +xran_parse_cp_pkt() is a function which can be utilized for RU emulation +or debug. It is defined below: + +int xran_parse_cp_pkt(struct rte_mbuf \*mbuf, + +struct xran_cp_gen_params \*result, + +struct xran_recv_packet_info \*pkt_info); + +It parses a received C-Plane packet and retrieves the information from +its headers and sections. + +The retrieved information is stored in the structures: + +struct xran_cp_gen_params: section information from received C-Plane +packet + +struct xran_recv_packet_info: transport layer header information (eCPRI +header) + +These functions can be utilized to debug or RU emulation purposes. + +.. _u-plane-1: + +U-plane +~~~~~~~ + +Single Section is the default mode of xRAN packet creation. It assumes +that there is only one section per packet, and all IQ samples are +attached to it. Compression is not supported. + +A message is built in mbuf space given as a parameter. The library +builds eCPRI header filling structure fields by taking the IQ sample +size and populating a particular packet length and sequence number. + +Currently, the supported IQ bit width is 16. + +Implementation of a U-plane set of functions is defined in xran_up_api.c +and is used to prepare U-plane packet content according to the given +configuration. + +The following list of functions is implemented for U-plane: + +- Build eCPRI header + +- Build application header + +- Build section header + +- Append IQ samples to packet + +- Prepare full symbol of xRAN data for single eAxC + +- Process RX packet per symbol. + +The time of generation of a U-plane message for DL and UL is +“symbol-based” and can be controlled using O-DU settings (O-RU), +according to Table 4. + +Supporting Code +--------------- + +The xRAN library has a set of functions used to assist in packet +processing and data exchange not directly used for xRAN packet +processing. + +Timing +~~~~~~ + +The sense of time for the xRAN protocol is obtained from system time, +where the system timer is synchronized to GPS time via PTP protocol +using the Linux PHP package. On the software side, a simple polling loop +is utilized to get time up to nanosecond precision and particular packet +processing jobs are scheduled via the DPDK timer. + +long poll_next_tick(int interval) + +{ + +struct timespec start_time; + +struct timespec cur_time; + +long target_time; + +long delta; + +clock_gettime(CLOCK_REALTIME, &start_time); + +target_time = (start_time.tv_sec \* NSEC_PER_SEC + start_time.tv_nsec + +interval \* NSEC_PER_USEC) / (interval \* NSEC_PER_USEC) \* interval; + +while(1) + +{ + +clock_gettime(CLOCK_REALTIME, &cur_time); + +delta = (cur_time.tv_sec \* NSEC_PER_SEC + cur_time.tv_nsec) - +target_time \* NSEC_PER_USEC; + +if(delta > 0 \|\| (delta < 0 && abs(delta) < THRESHOLD)) + +{ + +break; + +} + +} + +return delta; + +} + +Polling is used to achieve the required precision of symbol time. For +example, in the mmWave scenario, the symbol time is 125µs/14=~8.9µs. +Small deterministic tasks can be executed within the polling interval +provided. It’s smaller than the symbol interval time. + +DPDK Timers +~~~~~~~~~~~ + +DPDK provides sets of primitives (struct rte_rimer) and functions +(rte_timer_reset_sync() rte_timer_manage()) to |br| +schedule processing of +function as timer. The timer is based on the TSC clock and is not +synchronized to PTP time. As a |br| +result, this timer cannot be used as a +periodic timer because the TSC clock can drift substantially relative to +the system timer which in turn is synchronized to PTP (GPS) + +Only single-shot timers are used to schedule processing based on +particular events such as symbol time. The packet |br| +processing function +calls rte_timer_manage() in the loop, and the resulting execution of +timer function happens right |br| +after the timer was “armed”. + +xRAN Ethernet +~~~~~~~~~~~~~ + +xran_init_port() function performs initialization of DPDK ETH port. +Standard port configuration is used as per reference example from DPDK. + +Jumbo Frames are used by default. Mbufs size is extended to support 9600 +bytes packets. + +Mac address and VLAN tag are expected to be configured by Infrastructure +software. See Appendix A.4. + +From an implementation perspective, modules provide functions to handle: + +- Ethernet headers + +- VLAN tag + +- Send and Receive mbuf. + +xRAN Ethdi +~~~~~~~~~~ + +Ethdi provides functionality to work with the content of an Ethernet +packet and dispatch processing to/from the xRAN layer. Ethdi +instantiates a main PMD driver thread and dispatches packets between the +ring and RX/TX using rte_eth_rx_burst() and rte_eth_tx_burst() DPDK +functions. + +For received packets, it maintains a set of handlers for ethertype +handlers and xRAN layer register one xRAN ethtype |br| +0xAEFE, resulting in +packets with this ethertype being routed to the xRAN processing +function. This function checks the message type of the eCPRI header and +dispatches packet to either C-plane processing or U-plane processing. + +Initialization of memory pools, allocation and freeing of mbuf for +Ethernet packets occur in this layer. + + + + +