Compare commits

...

23 Commits

Author SHA1 Message Date
Raymond Knopp
cfb1295750 small modification for ul_ahead which was put in RU_t 2022-03-21 10:48:38 +01:00
Raymond Knopp
90a77ddb7d Merge remote-tracking branch 'origin/tdd25period_for_MR' into mavenir-interop
Conflicts:
	cmake_targets/build_oai
	openair1/PHY/INIT/nr_init.c
	openair2/LAYER2/NR_MAC_gNB/config.c
2022-03-21 10:05:09 +01:00
Raymond Knopp
9d96fe3982 initial version for Mavenir interoperability 2022-03-21 09:53:52 +01:00
Sofia Pison
80ba29e045 Modiefied CMakeLists, Compilation Warning solved, No more modification of CMakeCache required. New Instructions to build 2022-02-18 19:24:53 +01:00
Sofia Pison
711c94240c xran_lib_wrap.hpp moved and split to have separation between headers and code 2022-02-09 22:59:31 +01:00
Sofia Pison
7f9a4af1be fix offset in RX compressed 2022-02-03 21:06:01 +01:00
Sofia Pison
d3913b5dc2 ORAN Tx and Rx implemented and validated with RUsample app. No timing yet. Code to be cleaned 2022-01-20 21:22:56 +01:00
Sofia Pison
87f045157a Correct number of samples per symbols (only 106 PRBs per symbol for now) 2022-01-14 21:53:58 +01:00
Sofia Pison
f035f67db9 Fix iq size error from previous commit 2021-12-16 21:33:44 +01:00
Sofia Pison
43251259be Progress in DL integration, not yet overwritting the TX shared buffer 2021-12-16 21:29:16 +01:00
Sofia Pison
c697e62554 sending according to the NIC light 2021-12-08 19:15:41 +01:00
Sofia Pison
b1fd315378 fixed few previously existing issues, now nr_softmodem runs. 2021-12-07 23:39:54 +01:00
Sofia Pison
fde44e79c1 update on NR oran_isolate.c 2021-12-04 22:45:31 +01:00
Sofia Pison
5ac65203d0 Delete NR oran.cc 2021-12-04 21:50:00 +01:00
Sofia Pison
7e5ac36827 Add first template for NR integration of O-RAN FHI Library. 2021-12-04 21:48:09 +01:00
Sofia Pison
61a73e52f3 add few notes in oran_isolate.c south_out 2021-12-02 15:00:20 +01:00
oba
ba8d796a29 Standalone DU simulator integrated to demonstrate the xRAN lib working with OAI. Same IQ samples of sample app are loaded from file and copied in xRAN buffer. Tested with sample app RU 2021-11-05 13:24:34 +01:00
Ting-An Lin
cb17950243 Init done: load FHI lib and DPDK lib in OAI 2021-09-27 18:49:48 +02:00
Ting-An-Lin
acc1487289 Create oran_isolate.c & link to libxran.so 2021-09-17 15:52:08 +02:00
Ting-An-Lin
d8a7a69571 casting in C++ file, rename debug.h in nFAPI 2021-09-13 19:31:56 +02:00
Ting-An-Lin
552c4b251a add targets/ARCH/ETHERNET/oran besides benetel 2021-09-06 14:05:30 +02:00
Ting-An-Lin
4ecce3f0e7 add targets/ARCH/ORAN_FHI/lib in OAI 2021-09-06 14:02:11 +02:00
Ting-An-Lin
e4634aa85a Slove ./build_oai -I failed 2021-09-06 13:56:07 +02:00
332 changed files with 45930 additions and 33 deletions

View File

@@ -160,6 +160,11 @@ set (OPENAIR_TARGETS ${OPENAIR_DIR}/targets)
set (OPENAIR3_DIR ${OPENAIR_DIR}/openair3)
set (OPENAIR_CMAKE ${OPENAIR_DIR}/cmake_targets)
set (OPENAIR_BIN_DIR ${CMAKE_CURRENT_BINARY_DIR}${CMAKE_FILES_DIRECTORY})
set (XRAN_DIR ${OPENAIR_DIR}/targets/ARCH/ORAN_FHI/lib)
set (XRAN_LIB_DIR /usr/local/xran)
set (INTEL_LIB_DIR /usr/local/intel64)
set (INTEL_LIB /usr/local/intel64)
set (DPDK_DIR /usr/local/dpdk_19_11/include/dpdk)
project (OpenAirInterface)
@@ -793,10 +798,34 @@ add_library(benetel_4g MODULE ${HWLIB_BENETEL_4G_SOURCE} )
set_target_properties(benetel_4g PROPERTIES COMPILE_FLAGS "-fvisibility=hidden -I$ENV{RTE_SDK}/$ENV{RTE_TARGET}/include")
SET(DPDK_LIBS "-Wl,-rpath,$ENV{RTE_SDK}/$ENV{RTE_TARGET}/lib -Wl,--whole-archive -L$ENV{RTE_SDK}/$ENV{RTE_TARGET}/lib -ldpdk -Wl,--no-whole-archive")
SET(DPDK_LIBS "-Wl,-rpath,$ENV{RTE_SDK}/$ENV{RTE_TARGET}/lib -Wl,--whole-archive -L$ENV{RTE_SDK}/$ENV{RTE_TARGET}/lib -L/usr/local/lib64/ -ldpdk -Wl,--no-whole-archive")
TARGET_LINK_LIBRARIES(benetel_4g ${DPDK_LIBS})
TARGET_LINK_LIBRARIES(benetel_4g pthread dl rt m numa)
# ORAN 4G library
######################################################################
include_directories("${XRAN_DIR}")
include_directories("${DPDK_DIR}")
include_directories("${INTEL_LIB}")
set(ORAN_FHLIB_4G_SOURCE
${OPENAIR_TARGETS}/ARCH/ETHERNET/oran/4g/oran.cpp
${OPENAIR_TARGETS}/ARCH/ETHERNET/oran/4g/shared_buffers.c
${OPENAIR_TARGETS}/ARCH/ETHERNET/oran/4g/low_oran.c
${OPENAIR_TARGETS}/ARCH/ETHERNET/oran/4g/low_dpdk_oran.c
${OPENAIR_TARGETS}/ARCH/ETHERNET/oran/4g/oran_isolate.c
)
add_library(oran_fhlib_4g MODULE ${ORAN_FHLIB_4G_SOURCE})
set_target_properties(oran_fhlib_4g PROPERTIES COMPILE_FLAGS "-fvisibility=hidden -march=native -I$ENV{RTE_SDK}/$ENV{RTE_TARGET}/include")
SET(DPDK_LIBS "-Wl,-rpath,$ENV{RTE_SDK}/$ENV{RTE_TARGET}/lib -Wl,--whole-archive -L$ENV{RTE_SDK}/$ENV{RTE_TARGET}/lib -ldpdk -Wl,--no-whole-archive")
TARGET_LINK_LIBRARIES(oran_fhlib_4g ${DPDK_LIBS})
TARGET_LINK_LIBRARIES(oran_fhlib_4g -L${XRAN_LIB_DIR} -lxran)
TARGET_LINK_LIBRARIES(oran_fhlib_4g -L${INTEL_LIB} -lirc)
TARGET_LINK_LIBRARIES(oran_fhlib_4g pthread dl rt m numa)
# Benetel 5G library
######################################################################
@@ -815,6 +844,36 @@ SET(DPDK_LIBS "-Wl,-rpath,$ENV{RTE_SDK}/$ENV{RTE_TARGET}/lib -Wl,--whole-archive
TARGET_LINK_LIBRARIES(benetel_5g ${DPDK_LIBS})
TARGET_LINK_LIBRARIES(benetel_5g pthread dl rt m numa)
# ORAN 5G library
######################################################################
include_directories("${XRAN_DIR}")
include_directories("${DPDK_DIR}")
include_directories("${INTEL_LIB_DIR}")
include_directories("${XRAN_LIB_DIR}")
set(ORAN_FHLIB_5G_SOURCE
${OPENAIR_TARGETS}/ARCH/ETHERNET/oran/5g/oran.cpp
${OPENAIR_TARGETS}/ARCH/ETHERNET/oran/5g/xran_lib_wrap.cpp
${OPENAIR_TARGETS}/ARCH/ETHERNET/oran/5g/common.cpp
${OPENAIR_TARGETS}/ARCH/ETHERNET/oran/5g/oran_isolate.c
)
add_library(oran_fhlib_5g MODULE ${ORAN_FHLIB_5G_SOURCE})
find_library(XRANFHI xran HINTS ${XRAN_LIB_DIR})
#find_library(INTELIRC irc HINTS ${INTEL_LIB_DIR})
set_target_properties(oran_fhlib_5g PROPERTIES COMPILE_FLAGS "-fvisibility=hidden -march=native -I$ENV{RTE_SDK}/$ENV{RTE_TARGET}/include")
#SET(DPDK_LIBS "-Wl,-rpath,$ENV{RTE_SDK}/$ENV{RTE_TARGET}/lib -Wl,--whole-archive -L$ENV{RTE_SDK}/$ENV{RTE_TARGET}/lib -L/usr/local/lib64 -ldpdk -Wl,--no-whole-archive")
execute_process(COMMAND pkg-config --libs libdpdk | sed --expression='s/[[:space:]]*$//' OUTPUT_VARIABLE DPDK_LIBS)
TARGET_LINK_LIBRARIES(oran_fhlib_5g ${DPDK_LIBS})
#TARGET_LINK_LIBRARIES(oran_fhlib_5g -L${XRAN_LIB_DIR} -lxran)
TARGET_LINK_LIBRARIES(oran_fhlib_5g -lxran)
#TARGET_LINK_LIBRARIES(oran_fhlib_5g -L${INTEL_LIB} -lirc)
#TARGET_LINK_LIBRARIES(oran_fhlib_5g ${INTELIRC})
TARGET_LINK_LIBRARIES(oran_fhlib_5g pthread dl rt m numa)
##########################################################
include_directories ("${OPENAIR_TARGETS}/ARCH/COMMON")

View File

@@ -117,6 +117,8 @@ Options
--run-group
runs only specified test cases specified here. This flag is only valid with -s
-V | --vcd
-t | --transport
Ethernet, benetel4g, benetel5g, oran_fhlib_4g, oran_fhlib_5g
Adds a debgging facility to the binary files: GUI with major internal synchronization events
-x | --xforms
Will compile with software oscilloscope features
@@ -256,7 +258,7 @@ function main() {
--RU)
RU=1
echo_info "Will compile RRU"
shift;;
shift;;
-a | --agent)
echo_info "FlexRAN support is always compiled into the eNB"
shift;;
@@ -299,7 +301,7 @@ function main() {
CMAKE_CMD="$CMAKE_CMD -DRF_BOARD=${HW}"
shift 2;;
-t | --transport)
TP=$2
TP=$2
shift 2;;
-P | --phy_simulators)
SIMUS_PHY=1
@@ -349,7 +351,7 @@ function main() {
echo_info "Setting CPU FLAGS from USER to: $2"
shift 2;;
--build-doxygen)
BUILD_DOXYGEN=1
BUILD_DOXYGEN=1
echo_info "Will build doxygen support"
shift;;
--build-coverity-scan)
@@ -419,7 +421,7 @@ function main() {
fi
done
done
if [ "${BUILD_OPTLIB## }" != "$2" ] ; then
if [ "${BUILD_OPTLIB## }" != "$2" ] ; then
echo_fatal "Unknown optional library in $2, valid libraries are $OPTIONAL_LIBRARIES"
fi
fi
@@ -443,8 +445,8 @@ function main() {
-h | --help)
print_help
exit 1;;
*)
print_help
*)
print_help
echo_fatal "Unknown option $1"
break;;
esac
@@ -470,13 +472,13 @@ function main() {
if [ "$eNB" = "1" -o "$eNBocp" = "1" -o "$gNB" = "1" ] ; then
if [ "$HW" = "None" -a "$TP" = "None" ] ; then
echo_info "No local radio head and no transport protocol selected"
echo_info "No local radio head and no transport protocol selected"
fi
if [ "$HW" = "None" ] ; then
echo_info "No radio head has been selected (HW set to $HW)"
echo_info "No radio head has been selected (HW set to $HW)"
fi
if [ "$TP" = "None" ] ; then
echo_info "No transport protocol has been selected (TP set to $TP)"
echo_info "No transport protocol has been selected (TP set to $TP)"
fi
fi
@@ -491,11 +493,11 @@ function main() {
if [ "$DEADLINE_SCHEDULER_FLAG_USER" = "" ]; then
case "$HW" in
"EXMIMO")
DEADLINE_SCHEDULER_FLAG_USER="True"
;;
DEADLINE_SCHEDULER_FLAG_USER="True"
;;
*)
DEADLINE_SCHEDULER_FLAG_USER="False"
;;
DEADLINE_SCHEDULER_FLAG_USER="False"
;;
esac
fi
@@ -695,7 +697,7 @@ function main() {
echo_info "Compiling physical unitary tests simulators"
# TODO: fix: dlsim_tm4 pucchsim prachsim pdcchsim pbchsim mbmssim
simlist="dlsim ulsim ldpctest polartest smallblocktest nr_pbchsim nr_dlschsim nr_ulschsim nr_dlsim nr_ulsim nr_pucchsim nr_prachsim"
# simlist="ldpctest"
# simlist="ldpctest"
for f in $simlist ; do
compilations \
ran_build $f \
@@ -734,9 +736,9 @@ function main() {
make -C $OPENAIR_DIR/cmake_targets/$BUILD_DIR/build oarf > $dlog/oarf.txt 2>&1
cp $OPENAIR_DIR/cmake_targets/$BUILD_DIR/build/*.oct $dbin
if [ -s $dbin/oarf_config_exmimo.oct ] ; then
echo_success "oarf tools compiled"
echo_success "oarf tools compiled"
else
echo_error "oarf tools compilation failed"
echo_error "oarf tools compilation failed"
fi
cp $OPENAIR_DIR/cmake_targets/tools/init_exmimo2 $dbin
fi
@@ -844,7 +846,7 @@ function main() {
ln -sf liboai_bladerfdevif.so liboai_device.so
ln -sf $dbin/liboai_bladerfdevif.so.$REL $dbin/liboai_device.so
echo_info "liboai_device.so is linked to BLADERF device library"
echo_info "liboai_device.so is linked to BLADERF device library"
elif [ "$HW" == "OAI_LMSSDR" ] ; then
# if [ -f "/usr/include/libbladeRF.h" ] ; then
compilations \
@@ -854,7 +856,7 @@ function main() {
ln -sf liboai_lmssdrdevif.so liboai_device.so
ln -sf $dbin/liboai_lmssdrdevif.so.$REL $dbin/liboai_device.so
echo_info "liboai_device.so is linked to LMSSDR device library"
echo_info "liboai_device.so is linked to LMSSDR device library"
elif [ "$HW" == "OAI_IRIS" ] ; then
compilations \
$BUILD_DIR oai_irisdevif \
@@ -906,30 +908,46 @@ function main() {
echo_info "Building transport protocol libraries"
rm -f liboai_transpro.so
rm -f $dbin/liboai_transpro.so
if [ "$TP" == "Ethernet" ]; then
if [ "$TP" == "Ethernet" ]; then
compilations \
$BUILD_DIR oai_eth_transpro \
liboai_eth_transpro.so $dbin/liboai_eth_transpro.so.$REL
$BUILD_DIR oai_eth_transpro \
liboai_eth_transpro.so $dbin/liboai_eth_transpro.so.$REL
ln -sf liboai_eth_transpro.so liboai_transpro.so
ln -sf $dbin/liboai_eth_transpro.so.$REL $dbin/liboai_transpro.so
echo_info "liboai_transpro.so is linked to ETHERNET transport"
fi
if [ "$TP" == "benetel4g" ]; then
fi
if [ "$TP" == "benetel4g" ]; then
compilations \
$BUILD_DIR benetel_4g \
libbenetel_4g.so $dbin/libbenetel_4g.$REL
ln -sf libbenetel_4g.so liboai_transpro.so
ln -sf $dbin/libbenetel_4g.so.$REL $dbin/liboai_transpro.so
echo_info "liboai_transpro.so is linked to BENETEL4G transport"
fi
if [ "$TP" == "benetel5g" ]; then
fi
if [ "$TP" == "benetel5g" ]; then
compilations \
$BUILD_DIR benetel_5g \
libbenetel_5g.so $dbin/libbenetel_5g.$REL
ln -sf libbenetel_5g.so liboai_transpro.so
ln -sf $dbin/libbenetel_5g.so.$REL $dbin/liboai_transpro.so
echo_info "liboai_transpro.so is linked to BENETEL4G transport"
fi
fi
if [ "$TP" == "oran_fhlib_4g" ]; then
compilations \
$build_dir oran_fhlib_4g \
liboran_fhlib_4g.so $dbin/liboran_fhlib_4g.$REL
ln -sf liboran_fhlib_4g.so liboai_transpro.so
ln -sf $dbin/liboran_fhlib_4g.so.$REL $dbin/liboai_transpro.so
echo_info "liboai_transpro.so is linked to oran_fhlib_4G transport"
fi
if [ "$TP" == "oran_fhlib_5g" ]; then
compilations \
$build_dir oran_fhlib_5g \
liboran_fhlib_5g.so $dbin/liboran_fhlib_5g.$REL
ln -sf liboran_fhlib_5g.so liboai_transpro.so
ln -sf $dbin/liboran_fhlib_5g.so.$REL $dbin/liboai_transpro.so
echo_info "liboai_transpro.so is linked to oran_fhlib_5G transport"
fi
fi
fi

View File

@@ -0,0 +1 @@
/home/eurecom/raymond/conf_mavenir.json

View File

@@ -46,7 +46,6 @@
#include "PHY/NR_REFSIG/ul_ref_seq_nr.h"
int l1_north_init_gNB() {
if (RC.nb_nr_L1_inst > 0 && RC.gNB != NULL) {

View File

@@ -679,6 +679,7 @@ typedef enum {
OAI_IF4p5_only =1,
OAI_IF5_and_IF4p5 =2,
MBP_IF5 =3,
ORAN_only =4,
MAX_FH_FMTs =4
} FH_fmt_options_t;

View File

@@ -46,6 +46,8 @@
#include "common_lib.h"
#include "ethernet_lib.h"
#include "../../oran/4g/oran.h"
int num_devices_eth = 0;
struct sockaddr_in dest_addr[MAX_INST];

View File

@@ -0,0 +1,99 @@
/*
* Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The OpenAirInterface Software Alliance licenses this file to You under
* the OAI Public License, Version 1.1 (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.openairinterface.org/?page_id=698
*
* 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.
*-------------------------------------------------------------------------------
* For more information about the OpenAirInterface (OAI) Software Alliance:
* contact@openairinterface.org
*/
#define _GNU_SOURCE
#include <sched.h>
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include "low_oran.h"
int oran_main(int argc, char **argv, oran_t *);
void *dpdk_thread(void *bs)
{
char *v[] = { "softmodem", "config_file_o_du.dat", "0000:81:0e.0", "0000:81:0e.1"};
oran_main(4, v, bs);
exit(1);
return 0;
}
void *oran_start_dpdk(char *ifname, shared_buffers *buffers)
{
oran_t *bs;
bs = calloc(1, sizeof(oran_t));
if (bs == NULL) {
printf("%s: out of memory\n", __FUNCTION__);
exit(1);
}
bs->buffers = buffers;
pthread_attr_t attr;
if (pthread_attr_init(&attr) != 0) {
printf("pthread_attr_init failed\n");
exit(1);
}
cpu_set_t cpuset;
CPU_ZERO(&cpuset);
CPU_SET(10,&cpuset);
if (pthread_attr_setaffinity_np(&attr, sizeof(cpu_set_t), &cpuset) != 0) {
printf("pthread_attr_setaffinity_np failed\n");
exit(1);
}
if (pthread_attr_setschedpolicy(&attr, SCHED_FIFO) != 0) {
printf("pthread_attr_setschedpolicy failed\n");
exit(1);
}
struct sched_param params;
params.sched_priority = sched_get_priority_max(SCHED_FIFO);
if (sched_get_priority_max(SCHED_FIFO) == -1) {
printf("sched_get_priority_max failed\n");
exit(1);
}
if (pthread_attr_setschedparam(&attr, &params) != 0) {
printf("pthread_setschedparam failed\n");
exit(1);
}
pthread_t t;
if (pthread_create(&t, &attr, dpdk_thread, bs) != 0) {
printf("%s: thread creation failed\n", __FUNCTION__);
exit(1);
}
if (pthread_attr_destroy(&attr) != 0) {
printf("pthread_attr_init failed\n");
exit(1);
}
return bs;
}

View File

@@ -0,0 +1,41 @@
/*
* Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The OpenAirInterface Software Alliance licenses this file to You under
* the OAI Public License, Version 1.1 (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.openairinterface.org/?page_id=698
*
* 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.
*-------------------------------------------------------------------------------
* For more information about the OpenAirInterface (OAI) Software Alliance:
* contact@openairinterface.org
*/
#include "low_oran.h"
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void *oran_start_dpdk(char *ifname, shared_buffers *buffers);
void *oran_start(char *ifname, shared_buffers *buffers)
{
printf("oran_start\n");
if (!strcmp(ifname, "dpdk"))
return oran_start_dpdk(ifname, buffers);
else
return NULL;
}

View File

@@ -0,0 +1,39 @@
/*
* Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The OpenAirInterface Software Alliance licenses this file to You under
* the OAI Public License, Version 1.1 (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.openairinterface.org/?page_id=698
*
* 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.
*-------------------------------------------------------------------------------
* For more information about the OpenAirInterface (OAI) Software Alliance:
* contact@openairinterface.org
*/
#include "shared_buffers.h"
#ifndef LOW_ORAN_H
#define LOW_ORAN_H
void *oran_start(char *ifname, shared_buffers *buffers);
typedef struct {
shared_buffers *buffers;
int next_subframe;
int next_symbol;
int expected_oran_frame;
} oran_t;
#endif

View File

@@ -0,0 +1,510 @@
/*
* Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The OpenAirInterface Software Alliance licenses this file to You under
* the OAI Public License, Version 1.1 (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.openairinterface.org/?page_id=698
*
* 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.
*-------------------------------------------------------------------------------
* For more information about the OpenAirInterface (OAI) Software Alliance:
* contact@openairinterface.org
*/
#include <stdio.h>
// #include "common_lib.h"
// #include "ethernet_lib.h"
#include "oran_isolate.h"
#include "shared_buffers.h"
#include "low_oran.h"
#include "xran_lib_wrap.hpp"
#include "common.hpp"
#include "xran_compression.h"
// Declare variable useful for the send buffer function
struct xran_device_ctx *p_xran_dev_ctx_2;
// Variable declaration useful for fill IQ samples from file
#define IQ_PLAYBACK_BUFFER_BYTES (XRAN_NUM_OF_SLOT_IN_TDD_LOOP*N_SYM_PER_SLOT*XRAN_MAX_PRBS*N_SC_PER_PRB*4L)
int16_t *p_tx_play_buffer[MAX_ANT_CARRIER_SUPPORTED];
int iq_playback_buffer_size_dl = IQ_PLAYBACK_BUFFER_BYTES;
int32_t tx_play_buffer_size[MAX_ANT_CARRIER_SUPPORTED];
int32_t tx_play_buffer_position[MAX_ANT_CARRIER_SUPPORTED];
// Declare the function useful to load IQs from file
int sys_load_file_to_buff(char *filename, char *bufname, unsigned char *pBuffer, unsigned int size, unsigned int buffers_num)
{
unsigned int file_size = 0;
int num= 0;
if (size)
{
if (filename && bufname)
{
FILE *file;
printf("Loading file %s to %s: ", filename, bufname);
file = fopen(filename, "rb");
if (file == NULL)
{
printf("can't open file %s!!!", filename);
exit(-1);
}
else
{
fseek(file, 0, SEEK_END);
file_size = ftell(file);
fseek(file, 0, SEEK_SET);
if ((file_size > size) || (file_size == 0))
file_size = size;
printf("Reading IQ samples from file: File Size: %d [Buffer Size: %d]\n", file_size, size);
num = fread(pBuffer, buffers_num, size, file);
fflush(file);
fclose(file);
printf("from addr (0x%lx) size (%d) bytes num (%d)", (uint64_t)pBuffer, file_size, num);
}
printf(" \n");
}
else
{
printf(" the file name, buffer name are not set!!!");
}
}
else
{
printf(" the %s is free: size = %d bytes!!!", bufname, size);
}
return num;
}
//------------------------------------------------------------------------
void xran_fh_rx_callback(void *pCallbackTag, xran_status_t status){
rte_pause();
}
void xran_fh_srs_callback(void *pCallbackTag, xran_status_t status){
rte_pause();
}
void xran_fh_rx_prach_callback(void *pCallbackTag, xran_status_t status){
rte_pause();
}
int physide_dl_tti_call_back(void * param)
{
rte_pause();
return 0;
}
int physide_ul_half_slot_call_back(void * param)
{
rte_pause();
return 0;
}
int physide_ul_full_slot_call_back(void * param)
{
rte_pause();
return 0;
}
//------------------------------------------------------------------------
#ifdef __cplusplus
extern "C"
{
#endif
void* define_oran_pointer(){
xranLibWraper *xranlib;
xranlib = new xranLibWraper;
//xranLibWraper *xranlib = (xranLibWraper*) calloc(1,sizeof(xranLibWraper));
return xranlib;
}
#ifdef __cplusplus
}
#endif
//------------------------------------------------------------------------
#ifdef __cplusplus
extern "C"
{
#endif
int setup_oran( void *xranlib_ ){
xranLibWraper *xranlib = ((xranLibWraper *) xranlib_);
if(xranlib->SetUp() < 0) {
return (-1);
}
return (0);
}
#ifdef __cplusplus
}
#endif
//------------------------------------------------------------------------
#ifdef __cplusplus
extern "C"
{
#endif
int open_oran_callback(void *xranlib_){
xranLibWraper *xranlib = ((xranLibWraper *) xranlib_);
xranlib->Open(nullptr,
nullptr,
(void *)xran_fh_rx_callback,
(void *)xran_fh_rx_prach_callback,
(void *)xran_fh_srs_callback);
return(0);
}
#ifdef __cplusplus
}
#endif
//------------------------------------------------------------------------
#ifdef __cplusplus
extern "C"
{
#endif
int open_oran(void *xranlib_){
xranLibWraper *xranlib = ((xranLibWraper *) xranlib_);
struct xran_fh_config *pCfg = (struct xran_fh_config*) malloc(sizeof(struct xran_fh_config));
assert(pCfg != NULL);
xranlib->get_cfg_fh(pCfg);
xran_open(xranlib->get_xranhandle(),pCfg);
return(0);
}
#ifdef __cplusplus
}
#endif
//------------------------------------------------------------------------
#ifdef __cplusplus
extern "C"
{
#endif
int initialize_oran(void *xranlib_){
xranLibWraper *xranlib = ((xranLibWraper *) xranlib_);
xranlib->Init();
return(0);
}
#ifdef __cplusplus
}
#endif
//------------------------------------------------------------------------
#ifdef __cplusplus
extern "C"
{
#endif
int start_oran(void *xranlib_){
xranLibWraper *xranlib = ((xranLibWraper *) xranlib_);
xranlib->Start();
return (0);
}
#ifdef __cplusplus
}
#endif
//------------------------------------------------------------------------
#ifdef __cplusplus
extern "C"
{
#endif
int register_physide_callbacks(void *xranlib_){
xranLibWraper *xranlib = ((xranLibWraper *) xranlib_);
xran_reg_physide_cb(xranlib->get_xranhandle(), physide_dl_tti_call_back, NULL, 10, XRAN_CB_TTI);
xran_reg_physide_cb(xranlib->get_xranhandle(), physide_ul_half_slot_call_back, NULL, 10, XRAN_CB_HALF_SLOT_RX);
xran_reg_physide_cb(xranlib->get_xranhandle(), physide_ul_full_slot_call_back, NULL, 10, XRAN_CB_FULL_SLOT_RX);
return (0);
}
#ifdef __cplusplus
}
#endif
//------------------------------------------------------------------------
#ifdef __cplusplus
extern "C"
{
#endif
int load_iq_from_file(void *xranlib_){
xranLibWraper *xranlib = ((xranLibWraper *) xranlib_);
int numCCPorts_ = xranlib->get_num_cc();
int num_eAxc_ = xranlib->get_num_eaxc();
printf("numCCPorts_ =%d, num_eAxc_=%d, MAX_ANT_CARRIER_SUPPORTED =%d\n",numCCPorts_,num_eAxc_,MAX_ANT_CARRIER_SUPPORTED);
int i;
char *IQ_filename[MAX_ANT_CARRIER_SUPPORTED];
for(i=0; i<MAX_ANT_CARRIER_SUPPORTED; i++){
if( (i==0) || (i==1) || (i==2) || (i==3) ){
IQ_filename[0] = "/home/oba/PISONS/phy/fhi_lib/app/usecase/mu0_5mhz/ant_0.bin";
IQ_filename[1] = "/home/oba/PISONS/phy/fhi_lib/app/usecase/mu0_5mhz/ant_1.bin";
IQ_filename[2] = "/home/oba/PISONS/phy/fhi_lib/app/usecase/mu0_5mhz/ant_2.bin";
IQ_filename[3] = "/home/oba/PISONS/phy/fhi_lib/app/usecase/mu0_5mhz/ant_3.bin";
}else{
IQ_filename[i] = "";
}
}
int32_t number_slots = 40; // According to wrapper.hpp uint32_t m_nSlots = 10; but for the file 5MHz is set to 40
uint32_t numerology = xranlib->get_numerology(); // According to the conf file is mu number
uint32_t bandwidth = 5; // According to the wrapper.hpp since we are reading the 5MHz files
uint32_t sub6 = xranlib->get_sub6();
iq_playback_buffer_size_dl = (number_slots * N_SYM_PER_SLOT * N_SC_PER_PRB * xranlib->get_num_rbs(numerology,bandwidth,sub6)*4L);
for(i = 0; i < MAX_ANT_CARRIER_SUPPORTED && i < (uint32_t)(numCCPorts_ * num_eAxc_); i++) {
if(((uint8_t *)IQ_filename[i])[0]!=0){
p_tx_play_buffer[i] = (int16_t*)malloc(iq_playback_buffer_size_dl);
assert (NULL != (p_tx_play_buffer[i]));
tx_play_buffer_size[i] = (int32_t)iq_playback_buffer_size_dl;
printf("Loading file [%d] %s \n",i,IQ_filename[i]);
tx_play_buffer_size[i] = sys_load_file_to_buff( IQ_filename[i],
"DL IFFT IN IQ Samples in binary format",
(uint8_t*) p_tx_play_buffer[i],
tx_play_buffer_size[i],
1);
tx_play_buffer_position[i] = 0;
} else {
p_tx_play_buffer[i]=(int16_t*)malloc(iq_playback_buffer_size_dl);
tx_play_buffer_size[i]=0;
tx_play_buffer_position[i] = 0;
}
}
return(0);
}
#ifdef __cplusplus
}
#endif
//------------------------------------------------------------------------
#ifdef __cplusplus
extern "C"
{
#endif
int xran_fh_tx_send_buffer(void *xranlib_){
xranLibWraper *xranlib = ((xranLibWraper *) xranlib_);
int32_t flowId;
void *ptr = NULL;
char *pos = NULL;
p_xran_dev_ctx_2 = xran_dev_get_ctx();
if (p_xran_dev_ctx_2 != NULL){
printf("p_xran_dev_ctx_2=%d\n",p_xran_dev_ctx_2);
}
int num_eaxc = xranlib->get_num_eaxc();
int num_eaxc_ul = xranlib->get_num_eaxc_ul();
uint32_t xran_max_antenna_nr = RTE_MAX(num_eaxc, num_eaxc_ul);
int ant_el_trx = xranlib->get_num_antelmtrx();
uint32_t xran_max_ant_array_elm_nr = RTE_MAX(ant_el_trx, xran_max_antenna_nr);
int32_t nSectorIndex[XRAN_MAX_SECTOR_NR];
int32_t nSectorNum;
for (nSectorNum = 0; nSectorNum < XRAN_MAX_SECTOR_NR; nSectorNum++)
{
nSectorIndex[nSectorNum] = nSectorNum;
}
nSectorNum = xranlib->get_num_cc();
int maxflowid = num_eaxc * (nSectorNum-1) + (xran_max_antenna_nr-1);
printf("the maximum flowID will be=%d\n",maxflowid);
for(uint16_t cc_id=0; cc_id<nSectorNum; cc_id++){
for(int32_t tti = 0; tti < XRAN_N_FE_BUF_LEN; tti++) {
for(uint8_t ant_id = 0; ant_id < xran_max_antenna_nr; ant_id++){
for(int32_t sym_idx = 0; sym_idx < XRAN_NUM_OF_SYMBOL_PER_SLOT; sym_idx++) {
flowId = num_eaxc * cc_id + ant_id;
uint8_t *pData = p_xran_dev_ctx_2->sFrontHaulTxBbuIoBufCtrl[tti % XRAN_N_FE_BUF_LEN][cc_id][ant_id].sBufferList.pBuffers[sym_idx%XRAN_NUM_OF_SYMBOL_PER_SLOT].pData;
uint8_t *pPrbMapData = p_xran_dev_ctx_2->sFrontHaulTxPrbMapBbuIoBufCtrl[tti % XRAN_N_FE_BUF_LEN][cc_id][ant_id].sBufferList.pBuffers->pData;
struct xran_prb_map *pPrbMap = (struct xran_prb_map *)pPrbMapData;
ptr = pData;
pos = ((char*)p_tx_play_buffer[flowId]) + tx_play_buffer_position[flowId];
uint8_t *u8dptr;
struct xran_prb_map *pRbMap = pPrbMap;
int32_t sym_id = sym_idx%XRAN_NUM_OF_SYMBOL_PER_SLOT;
if(ptr && pos){
int idxElm = 0;
u8dptr = (uint8_t*)ptr;
int16_t payload_len = 0;
uint8_t *dst = (uint8_t *)u8dptr;
uint8_t *src = (uint8_t *)pos;
struct xran_prb_elm* p_prbMapElm = &pRbMap->prbMap[idxElm];
dst = xran_add_hdr_offset(dst, p_prbMapElm->compMethod);
for (idxElm = 0; idxElm < pRbMap->nPrbElm; idxElm++) {
struct xran_section_desc *p_sec_desc = NULL;
p_prbMapElm = &pRbMap->prbMap[idxElm];
p_sec_desc = p_prbMapElm->p_sec_desc[sym_id];
if(p_sec_desc == NULL){
printf ("p_sec_desc == NULL\n");
exit(-1);
}
src = (uint8_t *)(pos + p_prbMapElm->nRBStart*N_SC_PER_PRB*4L);
if(p_prbMapElm->compMethod == XRAN_COMPMETHOD_NONE) {
payload_len = p_prbMapElm->nRBSize*N_SC_PER_PRB*4L;
rte_memcpy(dst, src, payload_len);
} else if (p_prbMapElm->compMethod == XRAN_COMPMETHOD_BLKFLOAT) {
printf("idxElm=%d, compMeth==BLKFLOAT\n",idxElm);
struct xranlib_compress_request bfp_com_req;
struct xranlib_compress_response bfp_com_rsp;
memset(&bfp_com_req, 0, sizeof(struct xranlib_compress_request));
memset(&bfp_com_rsp, 0, sizeof(struct xranlib_compress_response));
bfp_com_req.data_in = (int16_t*)src;
bfp_com_req.numRBs = p_prbMapElm->nRBSize;
bfp_com_req.len = p_prbMapElm->nRBSize*N_SC_PER_PRB*4L;
bfp_com_req.compMethod = p_prbMapElm->compMethod;
bfp_com_req.iqWidth = p_prbMapElm->iqWidth;
bfp_com_rsp.data_out = (int8_t*)dst;
bfp_com_rsp.len = 0;
xranlib_compress_avx512(&bfp_com_req, &bfp_com_rsp);
payload_len = bfp_com_rsp.len;
}else {
printf ("p_prbMapElm->compMethod == %d is not supported\n",
p_prbMapElm->compMethod);
exit(-1);
}
p_sec_desc->iq_buffer_offset = RTE_PTR_DIFF(dst, u8dptr);
p_sec_desc->iq_buffer_len = payload_len;
dst += payload_len;
dst = xran_add_hdr_offset(dst, p_prbMapElm->compMethod);
}
} else {
exit(-1);
printf("ptr ==NULL\n");
}
}
}
}
}
return(0);
}
#ifdef __cplusplus
}
#endif
//-----------------------------------------------------------------------
int64_t count_sec =0;
struct xran_common_counters x_counters;
uint64_t nTotalTime;
uint64_t nUsedTime;
uint32_t nCoreUsed;
float nUsedPercent;
long old_rx_counter = 0;
long old_tx_counter = 0;
#ifdef __cplusplus
extern "C"
{
#endif
int compute_xran_statistics(void *xranlib_){
xranLibWraper *xranlib = ((xranLibWraper *) xranlib_);
if(xran_get_common_counters(xranlib->get_xranhandle(), &x_counters) == XRAN_STATUS_SUCCESS) {
xran_get_time_stats(&nTotalTime, &nUsedTime, &nCoreUsed, 1);
nUsedPercent = ((float)nUsedTime * 100.0) / (float)nTotalTime;
printf("[rx %7ld pps %7ld kbps %7ld][tx %7ld pps %7ld kbps %7ld] [on_time %ld early %ld late %ld corrupt %ld pkt_dupl %ld Total %ld] IO Util: %5.2f %%\n",
x_counters.rx_counter,
x_counters.rx_counter-old_rx_counter,
x_counters.rx_bytes_per_sec*8/1000L,
x_counters.tx_counter,
x_counters.tx_counter-old_tx_counter,
x_counters.tx_bytes_per_sec*8/1000L,
x_counters.Rx_on_time,
x_counters.Rx_early,
x_counters.Rx_late,
x_counters.Rx_corrupt,
x_counters.Rx_pkt_dupl,
x_counters.Total_msgs_rcvd,
nUsedPercent);
if(x_counters.rx_counter > old_rx_counter)
old_rx_counter = x_counters.rx_counter;
if(x_counters.tx_counter > old_tx_counter)
old_tx_counter = x_counters.tx_counter;
} else {
printf("error xran_get_common_counters\n");
return(1);
}
return (0);
}
#ifdef __cplusplus
}
#endif

View File

@@ -0,0 +1,49 @@
/*
* Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The OpenAirInterface Software Alliance licenses this file to You under
* the OAI Public License, Version 1.1 (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.openairinterface.org/?page_id=698
*
* 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.
*-------------------------------------------------------------------------------
* For more information about the OpenAirInterface (OAI) Software Alliance:
* contact@openairinterface.org
*/
#ifndef _ORAN_H_
#define _ORAN_H_
#include "shared_buffers.h"
#include "common_lib.h"
void oran_fh_if4p5_south_out(RU_t *ru,
int frame,
int subframe,
uint64_t timestamp);
void oran_fh_if4p5_south_in(RU_t *ru,
int *frame,
int *subframe);
int transport_init(openair0_device *device,
openair0_config_t *openair0_cfg,
eth_params_t * eth_params );
typedef struct {
eth_state_t e;
shared_buffers buffers;
rru_config_msg_type_t last_msg;
int capabilities_sent;
void *oran_priv;
} oran_eth_state_t;
#endif /* _ORAN_H_ */

View File

@@ -0,0 +1,463 @@
/*
* Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The OpenAirInterface Software Alliance licenses this file to You under
* the OAI Public License, Version 1.1 (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.openairinterface.org/?page_id=698
*
* 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.
*-------------------------------------------------------------------------------
* For more information about the OpenAirInterface (OAI) Software Alliance:
* contact@openairinterface.org
*/
#include <stdio.h>
#include "common_lib.h"
#include "ethernet_lib.h"
#include "shared_buffers.h"
#include "low_oran.h"
#include "oran_isolate.h"
#include "common/utils/LOG/log.h"
#include "common/utils/LOG/vcd_signal_dumper.h"
typedef struct {
eth_state_t e;
shared_buffers buffers;
rru_config_msg_type_t last_msg;
int capabilities_sent;
void *oran_priv;
} oran_eth_state_t;
int trx_oran_start(openair0_device *device)
{
printf("ORAN: %s\n", __FUNCTION__);
return 0;
}
void trx_oran_end(openair0_device *device)
{
printf("ORAN: %s\n", __FUNCTION__);
}
int trx_oran_stop(openair0_device *device)
{
printf("ORAN: %s\n", __FUNCTION__);
return(0);
}
int trx_oran_set_freq(openair0_device* device,
openair0_config_t *openair0_cfg,
int exmimo_dump_config)
{
printf("ORAN: %s\n", __FUNCTION__);
return(0);
}
int trx_oran_set_gains(openair0_device* device,
openair0_config_t *openair0_cfg)
{
printf("ORAN: %s\n", __FUNCTION__);
return(0);
}
int trx_oran_get_stats(openair0_device* device)
{
printf("ORAN: %s\n", __FUNCTION__);
return(0);
}
int trx_oran_reset_stats(openair0_device* device)
{
printf("ORAN: %s\n", __FUNCTION__);
return(0);
}
int ethernet_tune(openair0_device *device,
unsigned int option,
int value)
{
printf("ORAN: %s\n", __FUNCTION__);
return 0;
}
int trx_oran_write_raw(openair0_device *device,
openair0_timestamp timestamp,
void **buff, int nsamps, int cc, int flags)
{
printf("ORAN: %s\n", __FUNCTION__);
return 0;
}
int trx_oran_read_raw(openair0_device *device,
openair0_timestamp *timestamp,
void **buff, int nsamps, int cc)
{
printf("ORAN: %s\n", __FUNCTION__);
return 0;
}
char *msg_type(int t)
{
static char *s[12] = {
"RAU_tick",
"RRU_capabilities",
"RRU_config",
"RRU_config_ok",
"RRU_start",
"RRU_stop",
"RRU_sync_ok",
"RRU_frame_resynch",
"RRU_MSG_max_num",
"RRU_check_sync",
"RRU_config_update",
"RRU_config_update_ok",
};
if (t < 0 || t > 11) return "UNKNOWN";
return s[t];
}
int trx_oran_ctlsend(openair0_device *device, void *msg, ssize_t msg_len)
{
RRU_CONFIG_msg_t *rru_config_msg = msg;
oran_eth_state_t *s = device->priv;
printf("ORAN: %s\n", __FUNCTION__);
printf(" rru_config_msg->type %d [%s]\n", rru_config_msg->type,
msg_type(rru_config_msg->type));
s->last_msg = rru_config_msg->type;
return msg_len;
}
int trx_oran_ctlrecv(openair0_device *device, void *msg, ssize_t msg_len)
{
RRU_CONFIG_msg_t *rru_config_msg = msg;
oran_eth_state_t *s = device->priv;
printf("ORAN: %s\n", __FUNCTION__);
if (s->last_msg == RAU_tick && s->capabilities_sent == 0) {
printf("Oran RAU_tick and capabilities sent\n");
RRU_capabilities_t *cap;
rru_config_msg->type = RRU_capabilities;
rru_config_msg->len = sizeof(RRU_CONFIG_msg_t)-MAX_RRU_CONFIG_SIZE+sizeof(RRU_capabilities_t);
cap = (RRU_capabilities_t*)&rru_config_msg->msg[0];
cap->FH_fmt = OAI_IF4p5_only;
cap->num_bands = 1;
cap->band_list[0] = 7;
cap->nb_rx[0] = device->openair0_cfg->rx_num_channels;
cap->nb_tx[0] = device->openair0_cfg->tx_num_channels;
cap->max_pdschReferenceSignalPower[0] = -27;
cap->max_rxgain[0] = 90;
s->capabilities_sent = 1;
return rru_config_msg->len;
}
if (s->last_msg == RRU_config) {
printf("Oran RRU_config\n");
rru_config_msg->type = RRU_config_ok;
return 0;
}
if (s->last_msg == RRU_start) {
// Folllow the same steps as in the wrapper
printf("Oran RRU_start\n");
// Check if the machine is PTP sync
check_xran_ptp_sync();
// SetUp
if ( setup_oran(s->oran_priv) !=0 ){
printf("%s:%d:%s: SetUp ORAN failed ... Exit\n",
__FILE__, __LINE__, __FUNCTION__);
exit(1);
}else{
printf("SetUp ORAN. Done\n");
}
// Load the IQ samples from file
load_iq_from_file(s->oran_priv);
printf("Load IQ from file. Done\n");
// Register physide callbacks
register_physide_callbacks(s->oran_priv);
printf("Register physide callbacks. Done\n");
// Open callbacks
open_oran_callback(s->oran_priv);
printf("Open Oran callbacks. Done\n");
// Init ORAN
initialize_oran(s->oran_priv);
printf("Init Oran. Done\n");
// Copy the loaded IQ to the xran buffer fro the tx
xran_fh_tx_send_buffer(s->oran_priv);
printf("ORAN FH send tx buffer filled in with loaded IQs. Done\n");
// Open ORAN
open_oran(s->oran_priv);
printf("xran_open. Done\n");
// Start ORAN
if ( start_oran(s->oran_priv) !=0 ){
printf("%s:%d:%s: Start ORAN failed ... Exit\n",
__FILE__, __LINE__, __FUNCTION__);
exit(1);
}else{
printf("Start ORAN. Done\n");
}
// Once xran library and thread started compute the statistics
while(1){
sleep(1);
compute_xran_statistics(s->oran_priv);
}
}
return(0);
}
/*This function reads the IQ samples from OAI, symbol by symbol.
It also handles the shared buffers. */
void oran_fh_if4p5_south_in(RU_t *ru,
int *frame,
int *subframe)
{
printf("ORAN: %s for UL. frame=%d, subframe=%d, \n", __FUNCTION__,frame,subframe);
oran_eth_state_t *s = ru->ifdevice.priv;
PHY_VARS_eNB **eNB_list = ru->eNB_list, *eNB;
LTE_DL_FRAME_PARMS *fp;
int symbol;
int32_t *rxdata;
int antenna;
lock_ul_buffer(&s->buffers, *subframe);
next:
while (!((s->buffers.ul_busy[0][*subframe] == 0x3fff &&
s->buffers.ul_busy[1][*subframe] == 0x3fff) ||
s->buffers.prach_busy[*subframe] == 1))
wait_ul_buffer(&s->buffers, *subframe);
if (s->buffers.prach_busy[*subframe] == 1) {
int i;
int antenna = 0;
uint16_t *in;
uint16_t *out;
in = (uint16_t *)s->buffers.prach[*subframe];
out = (uint16_t *)ru->prach_rxsigF[0][antenna];
for (i = 0; i < 840*2; i++)
out[i] = ntohs(in[i]);
s->buffers.prach_busy[*subframe] = 0;
ru->wakeup_prach_eNB(ru->eNB_list[0], ru, *frame, *subframe);
goto next;
}
eNB = eNB_list[0];
fp = &eNB->frame_parms;
for (antenna = 0; antenna < ru->nb_rx; antenna++) {
for (symbol = 0; symbol < 14; symbol++) {
int i;
uint16_t *p = (uint16_t *)(&s->buffers.ul[antenna][*subframe][symbol*1200*4]);
for (i = 0; i < 1200*2; i++) {
p[i] = htons(p[i]);
}
rxdata = &ru->common.rxdataF[antenna][symbol * fp->ofdm_symbol_size];
#if 1
memcpy(rxdata + 2048 - 600,
&s->buffers.ul[antenna][*subframe][symbol*1200*4],
600 * 4);
memcpy(rxdata,
&s->buffers.ul[antenna][*subframe][symbol*1200*4] + 600*4,
600 * 4);
#endif
}
}
s->buffers.ul_busy[0][*subframe] = 0;
s->buffers.ul_busy[1][*subframe] = 0;
signal_ul_buffer(&s->buffers, *subframe);
unlock_ul_buffer(&s->buffers, *subframe);
RU_proc_t *proc = &ru->proc;
extern uint16_t sf_ahead;
int f = *frame;
int sf = *subframe;
proc->tti_rx = sf;
proc->frame_rx = f;
proc->timestamp_rx = ((proc->frame_rx * 10) + proc->tti_rx ) * fp->samples_per_tti ;
if (get_nprocs()<=4) {
proc->tti_tx = (sf+sf_ahead)%10;
proc->frame_tx = (sf>(9-sf_ahead)) ? (f+1)&1023 : f;
}
VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME(VCD_SIGNAL_DUMPER_VARIABLES_FRAME_NUMBER_IF4P5_SOUTH_IN_RU+ru->idx,f);
VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME(VCD_SIGNAL_DUMPER_VARIABLES_SUBFRAME_NUMBER_IF4P5_SOUTH_IN_RU+ru->idx,sf);
proc->symbol_mask[sf] = 0;
VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME(VCD_SIGNAL_DUMPER_VARIABLES_TRX_TS, proc->timestamp_rx&0xffffffff);
}
void oran_fh_if4p5_south_out(RU_t *ru,
int frame,
int subframe,
uint64_t timestamp)
{
/*
* Romain:
* Questions:
* -Do we need a lock on the buffer? If yes, how should we implement it?
* -Why is the byte order changed in Benetel? Do we need to do the same?
*/
printf("ORAN: %s for DL. frame=%d, subframe=%d, \n", __FUNCTION__,frame,subframe);
oran_eth_state_t *s = ru->ifdevice.priv;
PHY_VARS_eNB **eNB_list = ru->eNB_list, *eNB;
LTE_DL_FRAME_PARMS *fp;
int symbol;
int32_t *txdata;
int aa;
VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_TRX_TST, ru->proc.timestamp_tx&0xffffffff );
// Romain: Lock on the DL buffer on given slot for avoiding concurrent write
lock_dl_buffer(&s->buffers, subframe);
if (s->buffers.dl_busy[0][subframe] ||
s->buffers.dl_busy[1][subframe]) {
printf("%s: fatal: DL buffer busy for subframe %d\n", __FUNCTION__, subframe);
unlock_dl_buffer(&s->buffers, subframe);
return;
}
// Romain: Configuration check
eNB = eNB_list[0];
fp = &eNB->frame_parms;
if (ru->num_eNB != 1 || fp->ofdm_symbol_size != 2048 ||
fp->Ncp != NORMAL || fp->symbols_per_tti != 14) {
printf("%s:%d:%s: unsupported configuration\n",
__FILE__, __LINE__, __FUNCTION__);
exit(1);
}
// Romain: Loop over antenas and symbols
for (aa = 0; aa < ru->nb_tx; aa++) {
for (symbol = 0; symbol < 14; symbol++) {
// Romain: txdata will hold the data from OAI to send on downlink. How are they presented?
txdata = &ru->common.txdataF_BF[aa][symbol * fp->ofdm_symbol_size];
#if 1
// Romain: For Benetel, '&s->buffers.dl' is the downlink buffer. Should we moove the data as it is done here?
memcpy(&s->buffers.dl[aa][subframe][symbol*1200*4],
txdata + 2048 - 600,
600 * 4);
memcpy(&s->buffers.dl[aa][subframe][symbol*1200*4] + 600*4,
txdata + 1,
600 * 4);
#endif
// Romain: Change byte order. Why?
int i;
uint16_t *p = (uint16_t *)(&s->buffers.dl[aa][subframe][symbol*1200*4]);
for (i = 0; i < 1200*2; i++) {
p[i] = htons(p[i]);
}
}
}
// Romain: Lock on the DL buffer on given slot for avoiding concurrent write
s->buffers.dl_busy[0][subframe] = 0x3fff;
s->buffers.dl_busy[1][subframe] = 0x3fff;
unlock_dl_buffer(&s->buffers, subframe);
VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME(VCD_SIGNAL_DUMPER_VARIABLES_FRAME_NUMBER_IF4P5_SOUTH_OUT_RU+ru->idx, ru->proc.frame_tx);
VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME(VCD_SIGNAL_DUMPER_VARIABLES_SUBFRAME_NUMBER_IF4P5_SOUTH_OUT_RU+ru->idx, ru->proc.tti_tx);
}
void *get_internal_parameter(char *name)
{
printf("ORAN: %s\n", __FUNCTION__);
if (!strcmp(name, "fh_if4p5_south_in"))
return (void *) oran_fh_if4p5_south_in;
if (!strcmp(name, "fh_if4p5_south_out"))
return (void *) oran_fh_if4p5_south_out;
return NULL;
}
__attribute__((__visibility__("default")))
int transport_init(openair0_device *device,
openair0_config_t *openair0_cfg,
eth_params_t * eth_params )
{
oran_eth_state_t *eth;
printf("ORAN: %s\n", __FUNCTION__);
device->Mod_id = 0;
device->transp_type = ETHERNET_TP;
device->trx_start_func = trx_oran_start;
device->trx_get_stats_func = trx_oran_get_stats;
device->trx_reset_stats_func = trx_oran_reset_stats;
device->trx_end_func = trx_oran_end;
device->trx_stop_func = trx_oran_stop;
device->trx_set_freq_func = trx_oran_set_freq;
device->trx_set_gains_func = trx_oran_set_gains;
device->trx_write_func = trx_oran_write_raw;
device->trx_read_func = trx_oran_read_raw;
device->trx_ctlsend_func = trx_oran_ctlsend;
device->trx_ctlrecv_func = trx_oran_ctlrecv;
device->get_internal_parameter = get_internal_parameter;
eth = (oran_eth_state_t *)calloc(1, sizeof(oran_eth_state_t));
if (eth == NULL) {
AssertFatal(0==1, "out of memory\n");
}
eth->e.flags = ETH_RAW_IF4p5_MODE;
eth->e.compression = NO_COMPRESS;
eth->e.if_name = eth_params->local_if_name;
eth->oran_priv = define_oran_pointer();
device->priv = eth;
device->openair0_cfg=&openair0_cfg[0];
eth->last_msg = (rru_config_msg_type_t)-1;
init_buffers(&eth->buffers);
return 0;
}

View File

@@ -0,0 +1,134 @@
/*
* Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The OpenAirInterface Software Alliance licenses this file to You under
* the OAI Public License, Version 1.1 (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.openairinterface.org/?page_id=698
*
* 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.
*-------------------------------------------------------------------------------
* For more information about the OpenAirInterface (OAI) Software Alliance:
* contact@openairinterface.org
*/
#ifndef _ORAN_ISOLATE_H_
#define _ORAN_ISOLATE_H_
#include <stdio.h>
#include "shared_buffers.h"
#include "low_oran.h"
#ifdef __cplusplus
extern "C"
{
#endif
void* define_oran_pointer();
#ifdef __cplusplus
}
#endif
#ifdef __cplusplus
extern "C"
{
#endif
int setup_oran( void *xranlib_ );
#ifdef __cplusplus
}
#endif
#ifdef __cplusplus
extern "C"
{
#endif
int open_oran_callback( void *xranlib_ );
#ifdef __cplusplus
}
#endif
#ifdef __cplusplus
extern "C"
{
#endif
int open_oran( void *xranlib_ );
#ifdef __cplusplus
}
#endif
#ifdef __cplusplus
extern "C"
{
#endif
int initialize_oran( void *xranlib_ );
#ifdef __cplusplus
}
#endif
#ifdef __cplusplus
extern "C"
{
#endif
int start_oran( void *xranlib_ );
#ifdef __cplusplus
}
#endif
#ifdef __cplusplus
extern "C"
{
#endif
int register_physide_callbacks(void *xranlib_);
#ifdef __cplusplus
}
#endif
#ifdef __cplusplus
extern "C"
{
#endif
int load_iq_from_file(void *xranlib_);
#ifdef __cplusplus
}
#endif
#ifdef __cplusplus
extern "C"
{
#endif
int xran_fh_tx_send_buffer(void *xranlib_);
#ifdef __cplusplus
}
#endif
#ifdef __cplusplus
extern "C"
{
#endif
int compute_xran_statistics(void *xranlib_);
#ifdef __cplusplus
}
#endif
#endif /* _ORAN_ISOLATE_H_ */

View File

@@ -0,0 +1,175 @@
/*
* Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The OpenAirInterface Software Alliance licenses this file to You under
* the OAI Public License, Version 1.1 (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.openairinterface.org/?page_id=698
*
* 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.
*-------------------------------------------------------------------------------
* For more information about the OpenAirInterface (OAI) Software Alliance:
* contact@openairinterface.org
*/
#include "shared_buffers.h"
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#if 0
void init_buffers(shared_buffers *s)
{
int subframe;
memset(s, 0, sizeof(*s));
for (subframe = 0; subframe < 10; subframe++) {
if (pthread_mutex_init(&s->m[subframe], NULL) != 0 ||
pthread_cond_init(&s->c[subframe], NULL) != 0) {
printf("%s: error initializing mutex/cond\n", __FUNCTION__);
exit(1);
}
}
/* in FDD the eNB's first transmitted DL subframe is 4 but the device
* needs to have subframes 1, 2 and 3 ready. Let's pretend there are ready.
*/
s->dl_busy[1] = 0x3fff;
s->dl_busy[2] = 0x3fff;
s->dl_busy[3] = 0x3fff;
}
void lock_buffers(shared_buffers *s, int subframe)
{
if (pthread_mutex_lock(&s->m[subframe]) != 0) {
printf("%s: fatal: lock fails\n", __FUNCTION__);
exit(1);
}
}
void unlock_buffers(shared_buffers *s, int subframe)
{
if (pthread_mutex_unlock(&s->m[subframe]) != 0) {
printf("%s: fatal: unlock fails\n", __FUNCTION__);
exit(1);
}
}
void wait_buffers(shared_buffers *s, int subframe)
{
if (pthread_cond_wait(&s->c[subframe], &s->m[subframe]) != 0) {
printf("%s: fatal: cond_wait fails\n", __FUNCTION__);
exit(1);
}
}
void signal_buffers(shared_buffers *s, int subframe)
{
if (pthread_cond_broadcast(&s->c[subframe]) != 0) {
printf("%s: fatal: cond_broadcast fails\n", __FUNCTION__);
exit(1);
}
}
#endif
void init_buffers(shared_buffers *s)
{
int subframe;
memset(s, 0, sizeof(*s));
for (subframe = 0; subframe < 10; subframe++) {
if (pthread_mutex_init(&s->m_dl[subframe], NULL) != 0 ||
pthread_cond_init(&s->c_dl[subframe], NULL) != 0 ||
pthread_mutex_init(&s->m_ul[subframe], NULL) != 0 ||
pthread_cond_init(&s->c_ul[subframe], NULL) != 0) {
printf("%s: error initializing mutex/cond\n", __FUNCTION__);
exit(1);
}
}
/* in FDD the eNB's first transmitted DL subframe is 4 but the device
* * needs to have subframes 1, 2 and 3 ready. Let's pretend there are ready.
* */
s->dl_busy[0][1] = 0x3fff;
s->dl_busy[0][2] = 0x3fff;
s->dl_busy[0][3] = 0x3fff;
s->dl_busy[1][1] = 0x3fff;
s->dl_busy[1][2] = 0x3fff;
s->dl_busy[1][3] = 0x3fff;
}
void lock_dl_buffer(shared_buffers *s, int subframe)
{
if (pthread_mutex_lock(&s->m_dl[subframe]) != 0) {
printf("%s: fatal: lock fails\n", __FUNCTION__);
exit(1);
}
}
void unlock_dl_buffer(shared_buffers *s, int subframe)
{
if (pthread_mutex_unlock(&s->m_dl[subframe]) != 0) {
printf("%s: fatal: unlock fails\n", __FUNCTION__);
exit(1);
}
}
void wait_dl_buffer(shared_buffers *s, int subframe)
{
if (pthread_cond_wait(&s->c_dl[subframe], &s->m_dl[subframe]) != 0) {
printf("%s: fatal: cond_wait fails\n", __FUNCTION__);
exit(1);
}
}
void signal_dl_buffer(shared_buffers *s, int subframe)
{
if (pthread_cond_broadcast(&s->c_dl[subframe]) != 0) {
printf("%s: fatal: cond_broadcast fails\n", __FUNCTION__);
exit(1);
}
}
void lock_ul_buffer(shared_buffers *s, int subframe)
{
if (pthread_mutex_lock(&s->m_ul[subframe]) != 0) {
printf("%s: fatal: lock fails\n", __FUNCTION__);
exit(1);
}
}
void unlock_ul_buffer(shared_buffers *s, int subframe)
{
if (pthread_mutex_unlock(&s->m_ul[subframe]) != 0) {
printf("%s: fatal: unlock fails\n", __FUNCTION__);
exit(1);
}
}
void wait_ul_buffer(shared_buffers *s, int subframe)
{
if (pthread_cond_wait(&s->c_ul[subframe], &s->m_ul[subframe]) != 0) {
printf("%s: fatal: cond_wait fails\n", __FUNCTION__);
exit(1);
}
}
void signal_ul_buffer(shared_buffers *s, int subframe)
{
if (pthread_cond_broadcast(&s->c_ul[subframe]) != 0) {
printf("%s: fatal: cond_broadcast fails\n", __FUNCTION__);
exit(1);
}
}

View File

@@ -0,0 +1,124 @@
/*
* Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The OpenAirInterface Software Alliance licenses this file to You under
* the OAI Public License, Version 1.1 (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.openairinterface.org/?page_id=698
*
* 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.
*-------------------------------------------------------------------------------
* For more information about the OpenAirInterface (OAI) Software Alliance:
* contact@openairinterface.org
*/
#ifndef _SHARED_BUFFERS_H_
#define _SHARED_BUFFERS_H_
#include <pthread.h>
#include <stdint.h>
#if 0
typedef struct {
unsigned char dl[10][14*1200*4];
unsigned char ul[10][14*1200*4];
uint16_t dl_busy[10];
uint16_t ul_busy[10];
pthread_mutex_t m[10];
pthread_cond_t c[10];
unsigned char prach[10][849*4];
unsigned char prach_busy[10];
/* statistics/error counting */
int ul_overflow;
int dl_underflow;
} shared_buffers;
void init_buffers(shared_buffers *s);
void lock_buffers(shared_buffers *s, int subframe);
void unlock_buffers(shared_buffers *s, int subframe);
void wait_buffers(shared_buffers *s, int subframe);
void signal_buffers(shared_buffers *s, int subframe);
typedef struct {
/* [2] is for two antennas */
unsigned char dl[2][10][14*1200*4];
unsigned char ul[2][10][14*1200*4];
uint16_t dl_busy[2][10];
uint16_t ul_busy[2][10];
pthread_mutex_t m_ul[10];
pthread_cond_t c_ul[10];
pthread_mutex_t m_dl[10];
pthread_cond_t c_dl[10];
unsigned char prach[10][849*4];
unsigned char prach_busy[10];
/* statistics/error counting */
int ul_overflow;
int dl_underflow;
} shared_buffers;
void init_buffers(shared_buffers *s);
void lock_dl_buffer(shared_buffers *s, int subframe);
void unlock_dl_buffer(shared_buffers *s, int subframe);
void wait_dl_buffer(shared_buffers *s, int subframe);
void signal_dl_buffer(shared_buffers *s, int subframe);
void lock_ul_buffer(shared_buffers *s, int subframe);
void unlock_ul_buffer(shared_buffers *s, int subframe);
void wait_ul_buffer(shared_buffers *s, int subframe);
void signal_ul_buffer(shared_buffers *s, int subframe);
#endif
typedef struct {
/* [2] is for two antennas */
unsigned char dl[2][10][14*1200*4];
unsigned char ul[2][10][14*1200*4];
uint16_t dl_busy[2][10];
uint16_t ul_busy[2][10];
pthread_mutex_t m_ul[10];
pthread_cond_t c_ul[10];
pthread_mutex_t m_dl[10];
pthread_cond_t c_dl[10];
unsigned char prach[10][849*4];
unsigned char prach_busy[10];
/* statistics/error counting */
int ul_overflow;
int dl_underflow;
} shared_buffers;
void init_buffers(shared_buffers *s);
void lock_dl_buffer(shared_buffers *s, int subframe);
void unlock_dl_buffer(shared_buffers *s, int subframe);
void wait_dl_buffer(shared_buffers *s, int subframe);
void signal_dl_buffer(shared_buffers *s, int subframe);
void lock_ul_buffer(shared_buffers *s, int subframe);
void unlock_ul_buffer(shared_buffers *s, int subframe);
void wait_ul_buffer(shared_buffers *s, int subframe);
void signal_ul_buffer(shared_buffers *s, int subframe);
#endif /* _SHARED_BUFFERS_H_ */

View File

@@ -0,0 +1,937 @@
/*
* Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The OpenAirInterface Software Alliance licenses this file to You under
* the OAI Public License, Version 1.1 (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.openairinterface.org/?page_id=698
*
* 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.
*-------------------------------------------------------------------------------
* For more information about the OpenAirInterface (OAI) Software Alliance:
* contact@openairinterface.org
*/
#include <stdio.h>
#include "oran_isolate.h"
#include "xran_lib_wrap.hpp"
#include "common.hpp"
#include "xran_compression.h"
#include "xran_sync_api.h"
// Declare variable useful for the send buffer function
struct xran_device_ctx *p_xran_dev_ctx_2;
// Variable declaration useful for fill IQ samples from file
#define IQ_PLAYBACK_BUFFER_BYTES (XRAN_NUM_OF_SLOT_IN_TDD_LOOP*N_SYM_PER_SLOT*XRAN_MAX_PRBS*N_SC_PER_PRB*4L)
int16_t *p_tx_play_buffer[MAX_ANT_CARRIER_SUPPORTED];
int iq_playback_buffer_size_dl = IQ_PLAYBACK_BUFFER_BYTES;
int32_t tx_play_buffer_size[MAX_ANT_CARRIER_SUPPORTED];
int32_t tx_play_buffer_position[MAX_ANT_CARRIER_SUPPORTED];
// Declare the function useful to load IQs from file
int sys_load_file_to_buff(char *filename, char *bufname, unsigned char *pBuffer, unsigned int size, unsigned int buffers_num)
{
unsigned int file_size = 0;
int num= 0;
if (size)
{
if (filename && bufname)
{
FILE *file;
printf("Loading file %s to %s: ", filename, bufname);
file = fopen(filename, "rb");
if (file == NULL)
{
printf("can't open file %s!!!", filename);
exit(-1);
}
else
{
fseek(file, 0, SEEK_END);
file_size = ftell(file);
fseek(file, 0, SEEK_SET);
if ((file_size > size) || (file_size == 0))
file_size = size;
printf("Reading IQ samples from file: File Size: %d [Buffer Size: %d]\n", file_size, size);
num = fread(pBuffer, buffers_num, size, file);
fflush(file);
fclose(file);
printf("from addr (0x%lx) size (%d) bytes num (%d)", (uint64_t)pBuffer, file_size, num);
}
printf(" \n");
}
else
{
printf(" the file name, buffer name are not set!!!");
}
}
else
{
printf(" the %s is free: size = %d bytes!!!", bufname, size);
}
return num;
}
//------------------------------------------------------------------------
void xran_fh_rx_callback(void *pCallbackTag, xran_status_t status){
rte_pause();
#if 0
xran_cb_tag *callback_tag = (xran_cb_tag *)pCallbackTag;
printf(" xran_fh_RX_callback::: cellId=%d\tslotiId=%d\tsymbol=%d\n",callback_tag->cellId,callback_tag->slotiId,callback_tag->symbol);
uint32_t frame,subFrame,slot;
int32_t tti;
uint64_t second;
tti = xran_get_slot_idx(&frame,&subFrame,&slot,&second);
printf(" tti=%d\tframe=%d\tsubFrame=%d\tslot=%d\tsecond=%ld\n",tti,frame,subFrame,slot,second);
if(callback_tag->slotiId==10){
exit(0);
}
#endif
}
void xran_fh_srs_callback(void *pCallbackTag, xran_status_t status){
rte_pause();
#if 0
xran_cb_tag *callback_tag = (xran_cb_tag *)pCallbackTag;
printf(" xran_fh_SRS_callback::: cellId=%d\tslotiId=%d\tsymbol=%d\n",callback_tag->cellId,callback_tag->slotiId,callback_tag->symbol);
#endif
}
void xran_fh_rx_prach_callback(void *pCallbackTag, xran_status_t status){
rte_pause();
#if 0
xran_cb_tag *callback_tag = (xran_cb_tag *)pCallbackTag;
printf(" xran_fh_rx_PRACH_callback::: cellId=%d\tslotiId=%d\tsymbol=%d\n",callback_tag->cellId,callback_tag->slotiId,callback_tag->symbol);
#endif
}
int physide_dl_tti_call_back(void * param)
{
rte_pause();
return 0;
}
int physide_ul_half_slot_call_back(void * param)
{
rte_pause();
return 0;
}
int physide_ul_full_slot_call_back(void * param)
{
rte_pause();
return 0;
}
//------------------------------------------------------------------------
#ifdef __cplusplus
extern "C"
{
#endif
void* define_oran_pointer(){
xranLibWraper *xranlib;
xranlib = new xranLibWraper;
//xranLibWraper *xranlib = (xranLibWraper*) calloc(1,sizeof(xranLibWraper));
return xranlib;
}
#ifdef __cplusplus
}
#endif
//------------------------------------------------------------------------
#ifdef __cplusplus
extern "C"
{
#endif
void dump_oran_config(void *xranlib_){
xranLibWraper *xranlib = ((xranLibWraper *) xranlib_);
int numerology = xranlib->get_numerology();
int duplex_type = xranlib->get_duplextype();
int num_cc = xranlib->get_num_cc();
int num_eaxc = xranlib->get_num_eaxc();
int num_eaxc_ul = xranlib->get_num_eaxc_ul();
int ndlrbs = xranlib->get_num_dlrbs();
int nulrbs = xranlib->get_num_ulrbs();
printf("**--**--**--**--**--**--**--**--**--**--**--**\n");
printf("Dump ORAN Configuration\n");
printf("* Numerology = %d\n", numerology);
printf("* Duplex Type = %d\n", duplex_type);
printf("* Number CC = %d\n", num_cc);
printf("* Number eAxc = %d\n", num_eaxc);
printf("* Number eAxc UL = %d\n", num_eaxc_ul);
printf("* Number RBs DL = %d\n", ndlrbs);
printf("* Number RBs UL = %d\n", nulrbs);
printf("**--**--**--**--**--**--**--**--**--**--**--**\n");
#if 0
printf("dump_oran_config exit program ...\n");
exit(-1);
#endif
}
#ifdef __cplusplus
}
#endif
//------------------------------------------------------------------------
#ifdef __cplusplus
extern "C"
{
#endif
int setup_oran( void *xranlib_ ){
xranLibWraper *xranlib = ((xranLibWraper *) xranlib_);
if(xranlib->SetUp() < 0) {
return (-1);
}
return (0);
}
#ifdef __cplusplus
}
#endif
//------------------------------------------------------------------------
#ifdef __cplusplus
extern "C"
{
#endif
int open_oran_callback(void *xranlib_){
xranLibWraper *xranlib = ((xranLibWraper *) xranlib_);
xranlib->Open(nullptr,
nullptr,
(void *)xran_fh_rx_callback,
(void *)xran_fh_rx_prach_callback,
(void *)xran_fh_srs_callback);
return(0);
}
#ifdef __cplusplus
}
#endif
//------------------------------------------------------------------------
#ifdef __cplusplus
extern "C"
{
#endif
int open_oran(void *xranlib_){
xranLibWraper *xranlib = ((xranLibWraper *) xranlib_);
struct xran_fh_config *pCfg = (struct xran_fh_config*) malloc(sizeof(struct xran_fh_config));
assert(pCfg != NULL);
xranlib->get_cfg_fh(pCfg);
xran_open(xranlib->get_xranhandle(),pCfg);
return(0);
}
#ifdef __cplusplus
}
#endif
//------------------------------------------------------------------------
#ifdef __cplusplus
extern "C"
{
#endif
int initialize_oran(void *xranlib_){
xranLibWraper *xranlib = ((xranLibWraper *) xranlib_);
xranlib->Init();
return(0);
}
#ifdef __cplusplus
}
#endif
//------------------------------------------------------------------------
#ifdef __cplusplus
extern "C"
{
#endif
int start_oran(void *xranlib_){
xranLibWraper *xranlib = ((xranLibWraper *) xranlib_);
xranlib->Start();
return (0);
}
#ifdef __cplusplus
}
#endif
//------------------------------------------------------------------------
#ifdef __cplusplus
extern "C"
{
#endif
int stop_oran(void *xranlib_){
xranLibWraper *xranlib = ((xranLibWraper *) xranlib_);
xranlib->Stop();
return (0);
}
#ifdef __cplusplus
}
#endif
//------------------------------------------------------------------------
#ifdef __cplusplus
extern "C"
{
#endif
int close_oran(void *xranlib_){
xranLibWraper *xranlib = ((xranLibWraper *) xranlib_);
xranlib->Close();
return (0);
}
#ifdef __cplusplus
}
#endif
//------------------------------------------------------------------------
#ifdef __cplusplus
extern "C"
{
#endif
int register_physide_callbacks(void *xranlib_){
xranLibWraper *xranlib = ((xranLibWraper *) xranlib_);
xran_reg_physide_cb(xranlib->get_xranhandle(), physide_dl_tti_call_back, NULL, 10, XRAN_CB_TTI);
xran_reg_physide_cb(xranlib->get_xranhandle(), physide_ul_half_slot_call_back, NULL, 10, XRAN_CB_HALF_SLOT_RX);
xran_reg_physide_cb(xranlib->get_xranhandle(), physide_ul_full_slot_call_back, NULL, 10, XRAN_CB_FULL_SLOT_RX);
return (0);
}
#ifdef __cplusplus
}
#endif
//------------------------------------------------------------------------
#ifdef __cplusplus
extern "C"
{
#endif
int load_iq_from_file(void *xranlib_){
xranLibWraper *xranlib = ((xranLibWraper *) xranlib_);
int numCCPorts_ = xranlib->get_num_cc();
int num_eAxc_ = xranlib->get_num_eaxc();
printf("numCCPorts_ =%d, num_eAxc_=%d, MAX_ANT_CARRIER_SUPPORTED =%d\n",numCCPorts_,num_eAxc_,MAX_ANT_CARRIER_SUPPORTED);
int i;
const char *IQ_filename[MAX_ANT_CARRIER_SUPPORTED];
for(i=0; i<MAX_ANT_CARRIER_SUPPORTED; i++){
if( (i==0) || (i==1) || (i==2) || (i==3) ){
IQ_filename[0] = "/home/oba/PISONS/phy/fhi_lib/app/usecase/mu0_5mhz/ant_0.bin";
IQ_filename[1] = "/home/oba/PISONS/phy/fhi_lib/app/usecase/mu0_5mhz/ant_1.bin";
IQ_filename[2] = "/home/oba/PISONS/phy/fhi_lib/app/usecase/mu0_5mhz/ant_2.bin";
IQ_filename[3] = "/home/oba/PISONS/phy/fhi_lib/app/usecase/mu0_5mhz/ant_3.bin";
}else{
IQ_filename[i] = "/0";
}
}
int32_t number_slots = 40; // According to wrapper.hpp uint32_t m_nSlots = 10; but for the file 5MHz is set to 40
uint32_t numerology = xranlib->get_numerology(); // According to the conf file is mu number
uint32_t bandwidth = 5; // According to the wrapper.hpp since we are reading the 5MHz files
uint32_t sub6 = xranlib->get_sub6();
iq_playback_buffer_size_dl = (number_slots * N_SYM_PER_SLOT * N_SC_PER_PRB * xranlib->get_num_rbs(numerology,bandwidth,sub6)*4L);
const char *string_msg = "DL IFFT IN IQ Samples in binary format";
for(i = 0; i < MAX_ANT_CARRIER_SUPPORTED && i < (int32_t)(numCCPorts_ * num_eAxc_); i++) {
char *name = const_cast<char*>(IQ_filename[i]);
char *string = const_cast<char*>(string_msg);
if(((uint8_t *)IQ_filename[i])[0]!=0){
p_tx_play_buffer[i] = (int16_t*)malloc(iq_playback_buffer_size_dl);
assert (NULL != (p_tx_play_buffer[i]));
tx_play_buffer_size[i] = (int32_t)iq_playback_buffer_size_dl;
printf("Loading file [%d] %s \n",i,IQ_filename[i]);
tx_play_buffer_size[i] = sys_load_file_to_buff( name,
string,
(uint8_t*) p_tx_play_buffer[i],
tx_play_buffer_size[i],
1);
tx_play_buffer_position[i] = 0;
} else {
p_tx_play_buffer[i]=(int16_t*)malloc(iq_playback_buffer_size_dl);
tx_play_buffer_size[i]=0;
tx_play_buffer_position[i] = 0;
}
}
return(0);
}
#ifdef __cplusplus
}
#endif
//------------------------------------------------------------------------
#ifdef __cplusplus
extern "C"
{
#endif
int xran_fh_tx_send_buffer(void *xranlib_){
xranLibWraper *xranlib = ((xranLibWraper *) xranlib_);
int32_t flowId;
void *ptr = NULL;
char *pos = NULL;
p_xran_dev_ctx_2 = xran_dev_get_ctx();
if (p_xran_dev_ctx_2 != NULL){
printf("p_xran_dev_ctx_2=%p\n",p_xran_dev_ctx_2);
}
int num_eaxc = xranlib->get_num_eaxc();
int num_eaxc_ul = xranlib->get_num_eaxc_ul();
uint32_t xran_max_antenna_nr = RTE_MAX(num_eaxc, num_eaxc_ul);
//uint32_t ant_el_trx = xranlib->get_num_antelmtrx();
//uint32_t xran_max_ant_array_elm_nr = RTE_MAX(ant_el_trx, xran_max_antenna_nr);
//int32_t nSectorIndex[XRAN_MAX_SECTOR_NR];
int32_t nSectorNum;
/*
for (nSectorNum = 0; nSectorNum < XRAN_MAX_SECTOR_NR; nSectorNum++)
{
nSectorIndex[nSectorNum] = nSectorNum;
}
*/
nSectorNum = xranlib->get_num_cc();
int maxflowid = num_eaxc * (nSectorNum-1) + (xran_max_antenna_nr-1);
printf("the maximum flowID will be=%d\n",maxflowid);
for(uint16_t cc_id=0; cc_id<nSectorNum; cc_id++){
for(int32_t tti = 0; tti < XRAN_N_FE_BUF_LEN; tti++) {
for(uint8_t ant_id = 0; ant_id < xran_max_antenna_nr; ant_id++){
for(int32_t sym_idx = 0; sym_idx < XRAN_NUM_OF_SYMBOL_PER_SLOT; sym_idx++) {
flowId = num_eaxc * cc_id + ant_id;
uint8_t *pData = p_xran_dev_ctx_2->sFrontHaulTxBbuIoBufCtrl[tti % XRAN_N_FE_BUF_LEN][cc_id][ant_id].sBufferList.pBuffers[sym_idx%XRAN_NUM_OF_SYMBOL_PER_SLOT].pData;
uint8_t *pPrbMapData = p_xran_dev_ctx_2->sFrontHaulTxPrbMapBbuIoBufCtrl[tti % XRAN_N_FE_BUF_LEN][cc_id][ant_id].sBufferList.pBuffers->pData;
struct xran_prb_map *pPrbMap = (struct xran_prb_map *)pPrbMapData;
ptr = pData;
pos = ((char*)p_tx_play_buffer[flowId]) + tx_play_buffer_position[flowId];
uint8_t *u8dptr;
struct xran_prb_map *pRbMap = pPrbMap;
int32_t sym_id = sym_idx%XRAN_NUM_OF_SYMBOL_PER_SLOT;
if(ptr && pos){
uint32_t idxElm = 0;
u8dptr = (uint8_t*)ptr;
int16_t payload_len = 0;
uint8_t *dst = (uint8_t *)u8dptr;
uint8_t *src = (uint8_t *)pos;
struct xran_prb_elm* p_prbMapElm = &pRbMap->prbMap[idxElm];
dst = xran_add_hdr_offset(dst, p_prbMapElm->compMethod);
for (idxElm = 0; idxElm < pRbMap->nPrbElm; idxElm++) {
struct xran_section_desc *p_sec_desc = NULL;
p_prbMapElm = &pRbMap->prbMap[idxElm];
p_sec_desc = p_prbMapElm->p_sec_desc[sym_id];
if(p_sec_desc == NULL){
printf ("p_sec_desc == NULL\n");
exit(-1);
}
src = (uint8_t *)(pos + p_prbMapElm->nRBStart*N_SC_PER_PRB*4L);
if(p_prbMapElm->compMethod == XRAN_COMPMETHOD_NONE) {
payload_len = p_prbMapElm->nRBSize*N_SC_PER_PRB*4L;
rte_memcpy(dst, src, payload_len);
} else if (p_prbMapElm->compMethod == XRAN_COMPMETHOD_BLKFLOAT) {
printf("idxElm=%d, compMeth==BLKFLOAT\n",idxElm);
struct xranlib_compress_request bfp_com_req;
struct xranlib_compress_response bfp_com_rsp;
memset(&bfp_com_req, 0, sizeof(struct xranlib_compress_request));
memset(&bfp_com_rsp, 0, sizeof(struct xranlib_compress_response));
bfp_com_req.data_in = (int16_t*)src;
bfp_com_req.numRBs = p_prbMapElm->nRBSize;
bfp_com_req.len = p_prbMapElm->nRBSize*N_SC_PER_PRB*4L;
bfp_com_req.compMethod = p_prbMapElm->compMethod;
bfp_com_req.iqWidth = p_prbMapElm->iqWidth;
bfp_com_rsp.data_out = (int8_t*)dst;
bfp_com_rsp.len = 0;
xranlib_compress_avx512(&bfp_com_req, &bfp_com_rsp);
payload_len = bfp_com_rsp.len;
}else {
printf ("p_prbMapElm->compMethod == %d is not supported\n",
p_prbMapElm->compMethod);
exit(-1);
}
p_sec_desc->iq_buffer_offset = RTE_PTR_DIFF(dst, u8dptr);
p_sec_desc->iq_buffer_len = payload_len;
dst += payload_len;
dst = xran_add_hdr_offset(dst, p_prbMapElm->compMethod);
}
} else {
exit(-1);
printf("ptr ==NULL\n");
}
}
}
}
}
return(0);
}
#ifdef __cplusplus
}
#endif
#ifdef __cplusplus
extern "C"
{
#endif
int xran_fh_rx_read_slot(void *xranlib_, ru_info_t *ru, int frame, int slot){
xranLibWraper *xranlib = ((xranLibWraper *) xranlib_);
int tti = /*frame*SUBFRAMES_PER_SYSTEMFRAME*SLOTNUM_PER_SUBFRAME+*/10*frame+slot; //commented out temporarily to check that compilation of oran 5g is working.
//int32_t flowId;
void *ptr = NULL;
int32_t *pos = NULL;
p_xran_dev_ctx_2 = xran_dev_get_ctx();
#if 0
if (p_xran_dev_ctx_2 != NULL){
printf("p_xran_dev_ctx_2=%d\n",p_xran_dev_ctx_2);
}
#endif
int num_eaxc = xranlib->get_num_eaxc();
int num_eaxc_ul = xranlib->get_num_eaxc_ul();
uint32_t xran_max_antenna_nr = RTE_MAX(num_eaxc, num_eaxc_ul);
//uint32_t ant_el_trx = xranlib->get_num_antelmtrx();
//uint32_t xran_max_ant_array_elm_nr = RTE_MAX(ant_el_trx, xran_max_antenna_nr);
//int32_t nSectorIndex[XRAN_MAX_SECTOR_NR];
//int32_t nSectorNum;
/*
for (nSectorNum = 0; nSectorNum < XRAN_MAX_SECTOR_NR; nSectorNum++)
{
nSectorIndex[nSectorNum] = nSectorNum;
}
*/
//nSectorNum = xranlib->get_num_cc();
//int maxflowid = num_eaxc * (nSectorNum-1) + (xran_max_antenna_nr-1);
for(uint16_t cc_id=0; cc_id<1/*nSectorNum*/; cc_id++){ // OAI does not support multiple CC yet.
for(uint8_t ant_id = 0; ant_id < xran_max_antenna_nr && ant_id<ru->nb_rx; ant_id++){
// This loop would better be more inner to avoid confusion and maybe also errors.
for(int32_t sym_idx = 0; sym_idx < XRAN_NUM_OF_SYMBOL_PER_SLOT; sym_idx++) {
//flowId = num_eaxc * cc_id + ant_id;
uint8_t *pData = p_xran_dev_ctx_2->sFrontHaulRxBbuIoBufCtrl[tti % XRAN_N_FE_BUF_LEN][cc_id][ant_id].sBufferList.pBuffers[sym_idx%XRAN_NUM_OF_SYMBOL_PER_SLOT].pData;
uint8_t *pPrbMapData = p_xran_dev_ctx_2->sFrontHaulRxPrbMapBbuIoBufCtrl[tti % XRAN_N_FE_BUF_LEN][cc_id][ant_id].sBufferList.pBuffers->pData;
struct xran_prb_map *pPrbMap = (struct xran_prb_map *)pPrbMapData;
ptr = pData;
pos = &ru->rxdataF[ant_id][sym_idx * 2048 /*fp->ofdm_symbol_size*/]; // We had to use a different ru structure than benetel so the access to the buffer is not the same.
uint8_t *u8dptr;
struct xran_prb_map *pRbMap = pPrbMap;
int32_t sym_id = sym_idx%XRAN_NUM_OF_SYMBOL_PER_SLOT;
if(ptr && pos){
uint32_t idxElm = 0;
u8dptr = (uint8_t*)ptr;
int16_t payload_len = 0;
uint8_t *src = (uint8_t *)u8dptr;
//uint8_t *dst = (uint8_t *)pos;
// first half
uint8_t *src1 = (uint8_t *)u8dptr;
uint8_t *dst1 = (uint8_t *)pos;
// second half
uint8_t *src2 = (uint8_t *)u8dptr;
uint8_t *dst2 = (uint8_t *)pos;
struct xran_prb_elm* p_prbMapElm = &pRbMap->prbMap[idxElm];
for (idxElm = 0; idxElm < pRbMap->nPrbElm; idxElm++) {
struct xran_section_desc *p_sec_desc = NULL;
p_prbMapElm = &pRbMap->prbMap[idxElm];
p_sec_desc = p_prbMapElm->p_sec_desc[sym_id];
if(pRbMap->nPrbElm==1 && idxElm==0){
src = pData;
}
else if(p_sec_desc->pData==NULL){
return -1;
}else{
src = p_sec_desc->pData;
}
src2 = src;
if(p_sec_desc == NULL){
printf ("p_sec_desc == NULL\n");
exit(-1);
}
// Calculation of the pointer for the section in the buffer.
// first half
dst1 = (uint8_t *)(pos + p_prbMapElm->nRBStart*N_SC_PER_PRB);
// second half
dst2 = (uint8_t *)(pos + (p_prbMapElm->nRBStart*N_SC_PER_PRB + 1272/2) + 2048 - 1272);
//printf("RRR: idxElm=%d\tcompMethod=%d\tiqWidth=%d\n",idxElm,p_prbMapElm->compMethod,p_prbMapElm->iqWidth);
if(p_prbMapElm->compMethod == XRAN_COMPMETHOD_NONE) {
payload_len = p_prbMapElm->nRBSize*N_SC_PER_PRB*4L;
src1 = src2 + payload_len/2;
rte_memcpy(dst1, src1, payload_len/2);
rte_memcpy(dst2, src2, payload_len/2);
} else if (p_prbMapElm->compMethod == XRAN_COMPMETHOD_BLKFLOAT) {
struct xranlib_decompress_request bfp_decom_req_2;
struct xranlib_decompress_response bfp_decom_rsp_2;
struct xranlib_decompress_request bfp_decom_req_1;
struct xranlib_decompress_response bfp_decom_rsp_1;
payload_len = (3* p_prbMapElm->iqWidth + 1)*p_prbMapElm->nRBSize;
memset(&bfp_decom_req_2, 0, sizeof(struct xranlib_decompress_request));
memset(&bfp_decom_rsp_2, 0, sizeof(struct xranlib_decompress_response));
memset(&bfp_decom_req_1, 0, sizeof(struct xranlib_decompress_request));
memset(&bfp_decom_rsp_1, 0, sizeof(struct xranlib_decompress_response));
bfp_decom_req_2.data_in = (int8_t*)src2;
bfp_decom_req_2.numRBs = p_prbMapElm->nRBSize/2;
bfp_decom_req_2.len = payload_len/2;
bfp_decom_req_2.compMethod = p_prbMapElm->compMethod;
bfp_decom_req_2.iqWidth = p_prbMapElm->iqWidth;
bfp_decom_rsp_2.data_out = (int16_t*)dst2;
bfp_decom_rsp_2.len = 0;
xranlib_decompress_avx512(&bfp_decom_req_2, &bfp_decom_rsp_2);
int16_t first_half_len = bfp_decom_rsp_2.len;
src1 = src2+(payload_len/2);
bfp_decom_req_1.data_in = (int8_t*)src1;
bfp_decom_req_1.numRBs = p_prbMapElm->nRBSize/2;
bfp_decom_req_1.len = payload_len/2;
bfp_decom_req_1.compMethod = p_prbMapElm->compMethod;
bfp_decom_req_1.iqWidth = p_prbMapElm->iqWidth;
bfp_decom_rsp_1.data_out = (int16_t*)dst1;
bfp_decom_rsp_1.len = 0;
xranlib_decompress_avx512(&bfp_decom_req_1, &bfp_decom_rsp_1);
payload_len = bfp_decom_rsp_1.len+first_half_len;
}else {
printf ("p_prbMapElm->compMethod == %d is not supported\n",
p_prbMapElm->compMethod);
exit(-1);
}
}
} else {
exit(-1);
printf("ptr ==NULL\n");
}
}
}
}
return(0);
}
#ifdef __cplusplus
}
#endif
#ifdef __cplusplus
extern "C"
{
#endif
int xran_fh_tx_send_slot(void *xranlib_, ru_info_t *ru, int frame, int slot, uint64_t timestamp){
xranLibWraper *xranlib = ((xranLibWraper *) xranlib_);
int tti = /*frame*SUBFRAMES_PER_SYSTEMFRAME*SLOTNUM_PER_SUBFRAME+*/10*frame+slot; //commented out temporarily to check that compilation of oran 5g is working.
//int32_t flowId;
void *ptr = NULL;
int32_t *pos = NULL;
p_xran_dev_ctx_2 = xran_dev_get_ctx();
#if 0
if (p_xran_dev_ctx_2 != NULL){
printf("p_xran_dev_ctx_2=%d\n",p_xran_dev_ctx_2);
}
#endif
int num_eaxc = xranlib->get_num_eaxc();
int num_eaxc_ul = xranlib->get_num_eaxc_ul();
uint32_t xran_max_antenna_nr = RTE_MAX(num_eaxc, num_eaxc_ul);
//uint32_t ant_el_trx = xranlib->get_num_antelmtrx();
//uint32_t xran_max_ant_array_elm_nr = RTE_MAX(ant_el_trx, xran_max_antenna_nr);
//int32_t nSectorIndex[XRAN_MAX_SECTOR_NR];
//int32_t nSectorNum;
/*
for (nSectorNum = 0; nSectorNum < XRAN_MAX_SECTOR_NR; nSectorNum++)
{
nSectorIndex[nSectorNum] = nSectorNum;
}
*/
//nSectorNum = xranlib->get_num_cc();
//int maxflowid = num_eaxc * (nSectorNum-1) + (xran_max_antenna_nr-1);
for(uint16_t cc_id=0; cc_id<1/*nSectorNum*/; cc_id++){ // OAI does not support multiple CC yet.
for(uint8_t ant_id = 0; ant_id < xran_max_antenna_nr && ant_id<ru->nb_tx; ant_id++){
// This loop would better be more inner to avoid confusion and maybe also errors.
for(int32_t sym_idx = 0; sym_idx < XRAN_NUM_OF_SYMBOL_PER_SLOT; sym_idx++) {
//flowId = num_eaxc * cc_id + ant_id;
uint8_t *pData = p_xran_dev_ctx_2->sFrontHaulTxBbuIoBufCtrl[tti % XRAN_N_FE_BUF_LEN][cc_id][ant_id].sBufferList.pBuffers[sym_idx%XRAN_NUM_OF_SYMBOL_PER_SLOT].pData;
uint8_t *pPrbMapData = p_xran_dev_ctx_2->sFrontHaulTxPrbMapBbuIoBufCtrl[tti % XRAN_N_FE_BUF_LEN][cc_id][ant_id].sBufferList.pBuffers->pData;
struct xran_prb_map *pPrbMap = (struct xran_prb_map *)pPrbMapData;
ptr = pData;
pos = &ru->txdataF_BF[ant_id][sym_idx * 2048 /*fp->ofdm_symbol_size*/]; // We had to use a different ru structure than benetel so the access to the buffer is not the same.
uint8_t *u8dptr;
struct xran_prb_map *pRbMap = pPrbMap;
int32_t sym_id = sym_idx%XRAN_NUM_OF_SYMBOL_PER_SLOT;
if(ptr && pos){
uint32_t idxElm = 0;
u8dptr = (uint8_t*)ptr;
int16_t payload_len = 0;
uint8_t *dst = (uint8_t *)u8dptr;
//uint8_t *src = (uint8_t *)pos;
// first half
uint8_t *dst1 = (uint8_t *)u8dptr;
uint8_t *src1 = (uint8_t *)pos;
// second half
uint8_t *dst2 = (uint8_t *)u8dptr;
uint8_t *src2 = (uint8_t *)pos;
struct xran_prb_elm* p_prbMapElm = &pRbMap->prbMap[idxElm];
//printf("RRR : nPrbElm=%d\n",pRbMap->nPrbElm);
for (idxElm = 0; idxElm < pRbMap->nPrbElm; idxElm++) {
struct xran_section_desc *p_sec_desc = NULL;
p_prbMapElm = &pRbMap->prbMap[idxElm];
p_sec_desc = p_prbMapElm->p_sec_desc[sym_id];
payload_len = p_prbMapElm->nRBSize*N_SC_PER_PRB*4L;
dst = xran_add_hdr_offset(dst, p_prbMapElm->compMethod);
dst2 = dst;
dst1 = dst2 + payload_len/2;
if(p_sec_desc == NULL){
printf ("p_sec_desc == NULL\n");
exit(-1);
}
// Calculation of the pointer for the section in the buffer.
// first half
src1 = (uint8_t *)(pos + p_prbMapElm->nRBStart*N_SC_PER_PRB);
// second half
src2 = (uint8_t *)(pos + (p_prbMapElm->nRBStart*N_SC_PER_PRB + 1272/2) + 2048 - 1272);
if(p_prbMapElm->compMethod == XRAN_COMPMETHOD_NONE) {
rte_memcpy(dst1, src1, payload_len/2);
rte_memcpy(dst2, src2, payload_len/2);
} else if (p_prbMapElm->compMethod == XRAN_COMPMETHOD_BLKFLOAT) {
printf("idxElm=%d, compMeth==BLKFLOAT\n",idxElm);
struct xranlib_compress_request bfp_com_req;
struct xranlib_compress_response bfp_com_rsp;
memset(&bfp_com_req, 0, sizeof(struct xranlib_compress_request));
memset(&bfp_com_rsp, 0, sizeof(struct xranlib_compress_response));
bfp_com_req.data_in = (int16_t*)src2;
bfp_com_req.numRBs = p_prbMapElm->nRBSize/2;
bfp_com_req.len = payload_len/2;
bfp_com_req.compMethod = p_prbMapElm->compMethod;
bfp_com_req.iqWidth = p_prbMapElm->iqWidth;
bfp_com_rsp.data_out = (int8_t*)dst2;
bfp_com_rsp.len = 0;
xranlib_compress_avx512(&bfp_com_req, &bfp_com_rsp);
int16_t first_half_len = bfp_com_rsp.len;
dst1 = dst2 + first_half_len;
bfp_com_req.data_in = (int16_t*)src1;
bfp_com_req.numRBs = p_prbMapElm->nRBSize/2;
bfp_com_req.len = payload_len/2;
bfp_com_req.compMethod = p_prbMapElm->compMethod;
bfp_com_req.iqWidth = p_prbMapElm->iqWidth;
bfp_com_rsp.data_out = (int8_t*)dst1;
bfp_com_rsp.len = 0;
xranlib_compress_avx512(&bfp_com_req, &bfp_com_rsp);
payload_len = bfp_com_rsp.len+first_half_len;
}else {
printf ("p_prbMapElm->compMethod == %d is not supported\n",
p_prbMapElm->compMethod);
exit(-1);
}
p_sec_desc->iq_buffer_offset = RTE_PTR_DIFF(dst, u8dptr);
p_sec_desc->iq_buffer_len = payload_len;
dst += payload_len;
dst = xran_add_hdr_offset(dst, p_prbMapElm->compMethod);
}
// The tti should be updated as it increased.
pRbMap->tti_id = tti;
} else {
exit(-1);
printf("ptr ==NULL\n");
}
}
}
}
return(0);
}
#ifdef __cplusplus
}
#endif
//-----------------------------------------------------------------------
int64_t count_sec =0;
struct xran_common_counters x_counters;
uint64_t nTotalTime;
uint64_t nUsedTime;
uint32_t nCoreUsed;
float nUsedPercent;
uint64_t old_rx_counter = 0;
uint64_t old_tx_counter = 0;
#ifdef __cplusplus
extern "C"
{
#endif
int compute_xran_statistics(void *xranlib_){
xranLibWraper *xranlib = ((xranLibWraper *) xranlib_);
if(xran_get_common_counters(xranlib->get_xranhandle(), &x_counters) == XRAN_STATUS_SUCCESS) {
xran_get_time_stats(&nTotalTime, &nUsedTime, &nCoreUsed, 1);
nUsedPercent = ((float)nUsedTime * 100.0) / (float)nTotalTime;
printf("[rx %7ld pps %7ld kbps %7ld][tx %7ld pps %7ld kbps %7ld] [on_time %ld early %ld late %ld corrupt %ld pkt_dupl %ld Total %ld] IO Util: %5.2f %%\n",
x_counters.rx_counter,
x_counters.rx_counter-old_rx_counter,
x_counters.rx_bytes_per_sec*8/1000L,
x_counters.tx_counter,
x_counters.tx_counter-old_tx_counter,
x_counters.tx_bytes_per_sec*8/1000L,
x_counters.Rx_on_time,
x_counters.Rx_early,
x_counters.Rx_late,
x_counters.Rx_corrupt,
x_counters.Rx_pkt_dupl,
x_counters.Total_msgs_rcvd,
nUsedPercent);
if(x_counters.rx_counter > old_rx_counter)
old_rx_counter = x_counters.rx_counter;
if(x_counters.tx_counter > old_tx_counter)
old_tx_counter = x_counters.tx_counter;
} else {
printf("error xran_get_common_counters\n");
return(1);
}
return (0);
}
#ifdef __cplusplus
}
#endif
#ifdef __cplusplus
extern "C"
{
#endif
void check_xran_ptp_sync(){
if (xran_is_synchronized() != 0)
printf("Machine is not synchronized using PTP!\n");
else
printf("Machine is synchronized using PTP!\n");
}
#ifdef __cplusplus
}
#endif

View File

@@ -0,0 +1,48 @@
/*
* * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
* * contributor license agreements. See the NOTICE file distributed with
* * this work for additional information regarding copyright ownership.
* * The OpenAirInterface Software Alliance licenses this file to You under
* * the OAI Public License, Version 1.1 (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.openairinterface.org/?page_id=698
* *
* * 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.
* *-------------------------------------------------------------------------------
* * For more information about the OpenAirInterface (OAI) Software Alliance:
* * contact@openairinterface.org
* */
#ifndef _ORAN_H_
#define _ORAN_H_
#include "shared_buffers.h"
#include "common_lib.h"
void oran_fh_if4p5_south_out(RU_t *ru,
int frame,
int slot,
uint64_t timestamp);
void oran_fh_if4p5_south_in(RU_t *ru,
int *frame,
int *slot);
int transport_init(openair0_device *device,
openair0_config_t *openair0_cfg,
eth_params_t * eth_params );
typedef struct {
eth_state_t e;
shared_buffers buffers;
rru_config_msg_type_t last_msg;
int capabilities_sent;
void *oran_priv;
} oran_eth_state_t;
#endif /* _ORAN_H_ */

View File

@@ -0,0 +1,567 @@
/*
* Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The OpenAirInterface Software Alliance licenses this file to You under
* the OAI Public License, Version 1.1 (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.openairinterface.org/?page_id=698
*
* 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.
*-------------------------------------------------------------------------------
* For more information about the OpenAirInterface (OAI) Software Alliance:
* contact@openairinterface.org
*/
#include <stdio.h>
#include "common_lib.h"
#include "ethernet_lib.h"
#include "oran_isolate.h"
#include "common/utils/LOG/log.h"
#include "common/utils/LOG/vcd_signal_dumper.h"
#include "openair1/PHY/defs_gNB.h"
typedef struct {
eth_state_t e;
rru_config_msg_type_t last_msg;
int capabilities_sent;
void *oran_priv;
} oran_eth_state_t;
int trx_oran_start(openair0_device *device)
{
printf("ORAN: %s\n", __FUNCTION__);
#if 1
oran_eth_state_t *s = device->priv;
// Start ORAN
if ( start_oran(s->oran_priv) !=0 ){
printf("%s:%d:%s: Start ORAN failed ... Exit\n",
__FILE__, __LINE__, __FUNCTION__);
exit(1);
}else{
printf("Start ORAN. Done\n");
}
#endif
return 0;
}
void trx_oran_end(openair0_device *device)
{
printf("ORAN: %s\n", __FUNCTION__);
oran_eth_state_t *s = device->priv;
stop_oran(s->oran_priv);
close_oran(s->oran_priv);
}
int trx_oran_stop(openair0_device *device)
{
printf("ORAN: %s\n", __FUNCTION__);
oran_eth_state_t *s = device->priv;
stop_oran(s->oran_priv);
return(0);
}
int trx_oran_set_freq(openair0_device* device,
openair0_config_t *openair0_cfg,
int exmimo_dump_config)
{
printf("ORAN: %s\n", __FUNCTION__);
return(0);
}
int trx_oran_set_gains(openair0_device* device,
openair0_config_t *openair0_cfg)
{
printf("ORAN: %s\n", __FUNCTION__);
return(0);
}
int trx_oran_get_stats(openair0_device* device)
{
printf("ORAN: %s\n", __FUNCTION__);
return(0);
}
int trx_oran_reset_stats(openair0_device* device)
{
printf("ORAN: %s\n", __FUNCTION__);
return(0);
}
int ethernet_tune(openair0_device *device,
unsigned int option,
int value)
{
printf("ORAN: %s\n", __FUNCTION__);
return 0;
}
int trx_oran_write_raw(openair0_device *device,
openair0_timestamp timestamp,
void **buff, int nsamps, int cc, int flags)
{
printf("ORAN: %s\n", __FUNCTION__);
return 0;
}
int trx_oran_read_raw(openair0_device *device,
openair0_timestamp *timestamp,
void **buff, int nsamps, int cc)
{
printf("ORAN: %s\n", __FUNCTION__);
return 0;
}
char *msg_type(int t)
{
static char *s[12] = {
"RAU_tick",
"RRU_capabilities",
"RRU_config",
"RRU_config_ok",
"RRU_start",
"RRU_stop",
"RRU_sync_ok",
"RRU_frame_resynch",
"RRU_MSG_max_num",
"RRU_check_sync",
"RRU_config_update",
"RRU_config_update_ok",
};
if (t < 0 || t > 11) return "UNKNOWN";
return s[t];
}
int trx_oran_ctlsend(openair0_device *device, void *msg, ssize_t msg_len)
{
RRU_CONFIG_msg_t *rru_config_msg = msg;
oran_eth_state_t *s = device->priv;
printf("ORAN: %s\n", __FUNCTION__);
printf(" rru_config_msg->type %d [%s]\n", rru_config_msg->type,
msg_type(rru_config_msg->type));
s->last_msg = rru_config_msg->type;
return msg_len;
}
int trx_oran_ctlrecv(openair0_device *device, void *msg, ssize_t msg_len)
{
RRU_CONFIG_msg_t *rru_config_msg = msg;
oran_eth_state_t *s = device->priv;
printf("ORAN: %s\n", __FUNCTION__);
if (s->last_msg == RAU_tick && s->capabilities_sent == 0) {
printf("CCCCC ORAN ctrlrcv RRU_tick received and send capabilities hard coded\n");
RRU_capabilities_t *cap;
rru_config_msg->type = RRU_capabilities;
rru_config_msg->len = sizeof(RRU_CONFIG_msg_t)-MAX_RRU_CONFIG_SIZE+sizeof(RRU_capabilities_t);
// Fill RRU capabilities (see openair1/PHY/defs_RU.h)
// For now they are hard coded - try to retreive the params from openari device
cap = (RRU_capabilities_t*)&rru_config_msg->msg[0];
cap->FH_fmt = OAI_IF4p5_only;
cap->num_bands = 1;
cap->band_list[0] = 78;
// cap->num_concurrent_bands = 1; component carriers
cap->nb_rx[0] = 1; //device->openair0_cfg->rx_num_channels;
cap->nb_tx[0] = 1; //device->openair0_cfg->tx_num_channels;
cap->max_pdschReferenceSignalPower[0] = -27;
cap->max_rxgain[0] = 90;
cap->N_RB_DL[0] = 106;
cap->N_RB_UL[0] = 106;
s->capabilities_sent = 1;
return rru_config_msg->len;
}
if (s->last_msg == RRU_config) {
printf("Oran RRU_config\n");
rru_config_msg->type = RRU_config_ok;
//return 0;
}
#if 0
if (s->last_msg == RRU_start) {
// Folllow the same steps as in the wrapper
printf("Oran RRU_start\n");
// Check if the machine is PTP sync
check_xran_ptp_sync();
// SetUp
if ( setup_oran(s->oran_priv) !=0 ){
printf("%s:%d:%s: SetUp ORAN failed ... Exit\n",
__FILE__, __LINE__, __FUNCTION__);
exit(1);
}else{
printf("SetUp ORAN. Done\n");
}
// Load the IQ samples from file
load_iq_from_file(s->oran_priv);
printf("Load IQ from file. Done\n");
// Register physide callbacks
register_physide_callbacks(s->oran_priv);
printf("Register physide callbacks. Done\n");
// Open callbacks
open_oran_callback(s->oran_priv);
printf("Open Oran callbacks. Done\n");
// Init ORAN
initialize_oran(s->oran_priv);
printf("Init Oran. Done\n");
// Copy the loaded IQ to the xran buffer fro the tx
xran_fh_tx_send_buffer(s->oran_priv);
printf("ORAN FH send tx buffer filled in with loaded IQs. Done\n");
// Open ORAN
open_oran(s->oran_priv);
printf("xran_open. Done\n");
// Start ORAN
if ( start_oran(s->oran_priv) !=0 ){
printf("%s:%d:%s: Start ORAN failed ... Exit\n",
__FILE__, __LINE__, __FUNCTION__);
exit(1);
}else{
printf("Start ORAN. Done\n");
}
#if 0
// Once xran library and thread started compute the statistics
while(1){
sleep(1);
compute_xran_statistics(s->oran_priv);
}
#endif
}
#endif
return 0;
}
void oran_fh_if4p5_south_in(RU_t *ru,
int *frame,
int *slot)
{
/*
if(*frame==0 && *slot==0){
printf("XXX oran_fh_if4p5_south_in %d %d\n", *frame, *slot);
// sleep(1);
}
*/
oran_eth_state_t *s = ru->ifdevice.priv;
NR_DL_FRAME_PARMS *fp;
int symbol;
int32_t *rxdata;
int antenna;
//printf("XXX ORAN_fh_if4p5_south_in %d %d\n", *frame, *slot);
ru_info_t ru_info;
ru_info.nb_rx = ru->nb_rx;
ru_info.rxdataF = ru->common.rxdataF;
int ret = xran_fh_rx_read_slot(s->oran_priv, &ru_info, *frame, *slot);
if (ret != 0){
printf("ORAN: ORAN_fh_if4p5_south_in ERROR in RX function \n");
}
#if 0
for (antenna = 0; antenna < ru->nb_rx; antenna++) {
for (symbol = 0; symbol < 14; symbol++) {
printf("\nantenna:%d\tsymbol=%d\n",antenna,symbol);
for(int sample = 0; sample < 2048; sample++){
printf("%x ",ru->common.rxdataF[antenna][symbol*2048+sample]);
}
}
}
#endif
#if 0
next:
while (!((s->buffers.ul_busy[0][*slot] == 0x3fff &&
s->buffers.ul_busy[1][*slot] == 0x3fff) ||
s->buffers.prach_busy[*slot] == 1))
wait_ul_buffer(&s->buffers, *slot);
if (s->buffers.prach_busy[*slot] == 1) {
int i;
int antenna = 0;
uint16_t *in;
uint16_t *out;
in = (uint16_t *)s->buffers.prach[*slot];
out = (uint16_t *)ru->prach_rxsigF[0][antenna];
for (i = 0; i < 839*2; i++)
out[i] = ntohs(in[i]);
s->buffers.prach_busy[*slot] = 0;
//printf("prach for f.sl %d.%d\n", *frame, *slot);
//ru->wakeup_prach_gNB(ru->gNB_list[0], ru, *frame, *slot);
goto next;
}
#endif
#if 1
fp = ru->nr_frame_parms;
for (antenna = 0; antenna < ru->nb_rx; antenna++) {
for (symbol = 0; symbol < 14; symbol++) {
/*
int i;
int16_t *p = (int16_t *)(&s->buffers.ul[antenna][*slot][symbol*1272*4]);
for (i = 0; i < 1272*2; i++) {
p[i] = (int16_t)(ntohs(p[i])) / 16;
}
*/
rxdata = &ru->common.rxdataF[antenna][symbol * fp->ofdm_symbol_size];
}
}
#endif
RU_proc_t *proc = &ru->proc;
int f = *frame;
int sl = *slot;
//calculate timestamp_rx, timestamp_tx based on frame and slot
proc->tti_rx = sl;
proc->frame_rx = f;
/* TODO: be sure of samples_per_slot0
FK: should use get_samples_per_slot(slot)
but for mu=1 its ok
*/
proc->timestamp_rx = ((proc->frame_rx * 20) + proc->tti_rx ) * fp->samples_per_slot0;
if (get_nprocs()<=4) {
// why? what if there are more?
proc->tti_tx = (sl+ru->sl_ahead)%20;
proc->frame_tx = (sl>(19-ru->sl_ahead)) ? (f+1)&1023 : f;
}
#if 0
printf("south_in:\ttimestamp_rx=%d{frame_rx=%d,tti_rx=%d}\ttti_tx=%d\tframe_tx=%d\n\n",proc->timestamp_rx,proc->frame_rx,proc->tti_rx,proc->tti_tx,proc->frame_tx);
if(proc->frame_rx ==20){
exit(-1);
}
#endif
}
void oran_fh_if4p5_south_out(RU_t *ru,
int frame,
int slot,
uint64_t timestamp)
{
openair0_device *device = &ru->ifdevice;
oran_eth_state_t *s = device->priv;
ru_info_t ru_info;
ru_info.nb_tx = ru->nb_tx;
ru_info.txdataF_BF = ru->common.txdataF_BF;
//printf("south_out:\tframe=%d\tslot=%d\ttimestamp=%ld\n",frame,slot,timestamp);
#if 0
//printf("\n ORAN south out frame:%d, slot:%d. ru->common.txdataF_BF and ru_info.txdataF_BF \n",frame,slot);
for(int hhh=0; hhh<(14); hhh++ ){
for(int jjj=0; jjj<2048; jjj++){
/// Try to set all the values of the buffer to 1
ru->common.txdataF_BF[0][hhh*2048+jjj] = 256;
/* if(ru->common.txdataF_BF[0][hhh*2048+jjj] > 0){
printf(" %d:%d:%d ",hhh*2048+jjj,ru->common.txdataF_BF[0][hhh*2048+jjj],ru_info.txdataF_BF[0][hhh*2048+jjj]);
}
*/
}
}
//printf(" \n");
//exit(-1);
#endif
int ret = xran_fh_tx_send_slot(s->oran_priv, &ru_info, frame, slot, timestamp);
if (ret != 0){
printf("ORAN: ORAN_fh_if4p5_south_out ERROR in TX function \n");
}
#if 0
if(frame==0 && slot<100){
printf("XXX oran_fh_if4p5_south_out %d %d %ld\n", frame, slot, timestamp);
}
#endif
#if 0
//printf("Sofia-Romain exit south out\n");
//exit(-1);
oran_eth_state_t *s = ru->ifdevice.priv;
NR_DL_FRAME_PARMS *fp;
int symbol;
int32_t *txdata;
int aa;
//printf("BENETEL: %s (f.sf %d.%d ts %ld)\n", __FUNCTION__, frame, slot, timestamp);
lock_dl_buffer(&s->buffers, slot);
if (s->buffers.dl_busy[0][slot] ||
s->buffers.dl_busy[1][slot]) {
printf("%s: fatal: DL buffer busy for subframe %d\n", __FUNCTION__, slot);
unlock_dl_buffer(&s->buffers, slot);
return;
}
fp = ru->nr_frame_parms;
if (ru->num_gNB != 1 || fp->ofdm_symbol_size != 2048 ||
fp->Ncp != NORMAL || fp->symbols_per_slot != 14) {
printf("%s:%d:%s: unsupported configuration\n",
__FILE__, __LINE__, __FUNCTION__);
exit(1);
}
for (aa = 0; aa < ru->nb_tx; aa++) {
for (symbol = 0; symbol < 14; symbol++) {
txdata = &ru->common.txdataF_BF[aa][symbol * fp->ofdm_symbol_size];
#if 1
memcpy(&s->buffers.dl[aa][slot][symbol*1272*4],
txdata + 2048 - (1272/2),
(1272/2) * 4);
memcpy(&s->buffers.dl[aa][slot][symbol*1272*4] + (1272/2)*4,
txdata,
(1272/2) * 4);
#endif
int i;
uint16_t *p = (uint16_t *)(&s->buffers.dl[aa][slot][symbol*1272*4]);
for (i = 0; i < 1272*2; i++) {
p[i] = htons(p[i]);
}
}
}
s->buffers.dl_busy[0][slot] = 0x3fff;
s->buffers.dl_busy[1][slot] = 0x3fff;
unlock_dl_buffer(&s->buffers, slot);
#endif
}
void *get_internal_parameter(char *name)
{
printf("ORAN: %s\n", __FUNCTION__);
if (!strcmp(name, "fh_if4p5_south_in"))
return (void *) oran_fh_if4p5_south_in;
if (!strcmp(name, "fh_if4p5_south_out"))
return (void *) oran_fh_if4p5_south_out;
return NULL;
}
__attribute__((__visibility__("default")))
int transport_init(openair0_device *device,
openair0_config_t *openair0_cfg,
eth_params_t * eth_params )
{
oran_eth_state_t *eth;
device->Mod_id = 0;
device->transp_type = ETHERNET_TP;
device->trx_start_func = trx_oran_start;
device->trx_get_stats_func = trx_oran_get_stats;
device->trx_reset_stats_func = trx_oran_reset_stats;
device->trx_end_func = trx_oran_end;
device->trx_stop_func = trx_oran_stop;
device->trx_set_freq_func = trx_oran_set_freq;
device->trx_set_gains_func = trx_oran_set_gains;
device->trx_write_func = trx_oran_write_raw;
device->trx_read_func = trx_oran_read_raw;
device->trx_ctlsend_func = trx_oran_ctlsend;
device->trx_ctlrecv_func = trx_oran_ctlrecv;
device->get_internal_parameter = get_internal_parameter;
eth = (oran_eth_state_t *)calloc(1, sizeof(oran_eth_state_t));
if (eth == NULL) {
AssertFatal(0==1, "out of memory\n");
}
eth->e.flags = ETH_RAW_IF4p5_MODE;
eth->e.compression = NO_COMPRESS;
eth->e.if_name = eth_params->local_if_name;
eth->oran_priv = define_oran_pointer();
device->priv = eth;
device->openair0_cfg=&openair0_cfg[0];
eth->last_msg = (rru_config_msg_type_t)-1;
#if 0
init_buffers(&eth->buffers);
#endif
#if 1
oran_eth_state_t *s = eth;
printf("ORAN: %s\n", __FUNCTION__);
// Check if the machine is PTP sync
check_xran_ptp_sync();
// SetUp
if ( setup_oran(s->oran_priv) !=0 ){
printf("%s:%d:%s: SetUp ORAN failed ... Exit\n",
__FILE__, __LINE__, __FUNCTION__);
exit(1);
}else{
printf("SetUp ORAN. Done\n");
}
// Dump ORAN config
dump_oran_config(s->oran_priv);
// Load the IQ samples from file
// load_iq_from_file(s->oran_priv);
// printf("Load IQ from file. Done\n");
// Register physide callbacks
register_physide_callbacks(s->oran_priv);
printf("Register physide callbacks. Done\n");
// Open callbacks
open_oran_callback(s->oran_priv);
printf("Open Oran callbacks. Done\n");
// Init ORAN
initialize_oran(s->oran_priv);
printf("Init Oran. Done\n");
// Copy the loaded IQ to the xran buffer fro the tx
// xran_fh_tx_send_buffer(s->oran_priv);
// printf("ORAN FH send tx buffer filled in with loaded IQs. Done\n");
// Open ORAN
open_oran(s->oran_priv);
printf("xran_open. Done\n");
#endif
return 0;
}

View File

@@ -0,0 +1,208 @@
/*
* Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The OpenAirInterface Software Alliance licenses this file to You under
* the OAI Public License, Version 1.1 (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.openairinterface.org/?page_id=698
*
* 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.
*-------------------------------------------------------------------------------
* For more information about the OpenAirInterface (OAI) Software Alliance:
* contact@openairinterface.org
*/
#ifndef _ORAN_ISOLATE_H_
#define _ORAN_ISOLATE_H_
#include <stdio.h>
#include <pthread.h>
#include <stdint.h>
//#include "shared_buffers.h"
//#include "low_oran.h"
/*
* Structure added to bear the information needed from OAI RU
*/
typedef struct ru_info_s{
// Needed for UL
int nb_rx;
int32_t **rxdataF;
// Needed for DL
int nb_tx;
int32_t **txdataF_BF;
} ru_info_t;
#ifdef __cplusplus
extern "C"
{
#endif
void* define_oran_pointer();
#ifdef __cplusplus
}
#endif
#ifdef __cplusplus
extern "C"
{
#endif
void dump_oran_config( void *xranlib_ );
#ifdef __cplusplus
}
#endif
#ifdef __cplusplus
extern "C"
{
#endif
int setup_oran( void *xranlib_ );
#ifdef __cplusplus
}
#endif
#ifdef __cplusplus
extern "C"
{
#endif
int open_oran_callback( void *xranlib_ );
#ifdef __cplusplus
}
#endif
#ifdef __cplusplus
extern "C"
{
#endif
int open_oran( void *xranlib_ );
#ifdef __cplusplus
}
#endif
#ifdef __cplusplus
extern "C"
{
#endif
int initialize_oran( void *xranlib_ );
#ifdef __cplusplus
}
#endif
#ifdef __cplusplus
extern "C"
{
#endif
int start_oran( void *xranlib_ );
#ifdef __cplusplus
}
#endif
#ifdef __cplusplus
extern "C"
{
#endif
int stop_oran( void *xranlib_ );
#ifdef __cplusplus
}
#endif
#ifdef __cplusplus
extern "C"
{
#endif
int close_oran( void *xranlib_ );
#ifdef __cplusplus
}
#endif
#ifdef __cplusplus
extern "C"
{
#endif
int register_physide_callbacks(void *xranlib_);
#ifdef __cplusplus
}
#endif
#ifdef __cplusplus
extern "C"
{
#endif
int load_iq_from_file(void *xranlib_);
#ifdef __cplusplus
}
#endif
#ifdef __cplusplus
extern "C"
{
#endif
int xran_fh_rx_read_slot(void *xranlib_, ru_info_t *ru, int frame, int slot);
#ifdef __cplusplus
}
#endif
#ifdef __cplusplus
extern "C"
{
#endif
int xran_fh_tx_send_buffer(void *xranlib_);
#ifdef __cplusplus
}
#endif
#ifdef __cplusplus
extern "C"
{
#endif
int xran_fh_tx_send_slot(void *xranlib_, ru_info_t *ru, int frame, int slot, uint64_t timestamp);
#ifdef __cplusplus
}
#endif
#ifdef __cplusplus
extern "C"
{
#endif
int compute_xran_statistics(void *xranlib_);
#ifdef __cplusplus
}
#endif
#ifdef __cplusplus
extern "C"
{
#endif
void check_xran_ptp_sync();
#ifdef __cplusplus
}
#endif
#endif /* _ORAN_ISOLATE_H_ */

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,271 @@
/*******************************************************************************
*
* <COPYRIGHT_TAG>
*
*******************************************************************************/
#ifndef XRAN_LIB_WRAP_HPP
#define XRAN_LIB_WRAP_HPP
#include <exception>
#include <random>
#include <string>
#include <utility>
#include <vector>
#include <malloc.h>
#include <stdint.h>
#include "common.hpp"
#include "xran_fh_o_du.h"
#include "xran_common.h"
#include "xran_frame_struct.h"
#define XRAN_UT_CFG_FILENAME "conf.json"
#define XRAN_UT_KEY_GLOBALCFG "GLOBAL"
#define XRAN_UT_KEY_GLOBALCFG_IO "io_cfg"
#define XRAN_UT_KEY_GLOBALCFG_EAXCID "eAxCId_cfg"
#define XRAN_UT_KEY_GLOBALCFG_PRACH "prach_cfg"
#define XRAN_UT_KEY_GLOBALCFG_RU "ru_cfg"
#define XRAN_UT_KEY_GLOBALCFG_SLOT "slotcfg_"
#define MAX_NUM_OF_XRAN_CTX (2)
#define SW_FPGA_TOTAL_BUFFER_LEN (4*1024*1024*1024)
#define SW_FPGA_SEGMENT_BUFFER_LEN (1*1024*1024*1024)
#define SW_FPGA_FH_TOTAL_BUFFER_LEN (1*1024*1024*1024)
#define FPGA_TO_SW_PRACH_RX_BUFFER_LEN (8192)
#define MAX_ANT_CARRIER_SUPPORTED (XRAN_MAX_SECTOR_NR*XRAN_MAX_ANTENNA_NR)
extern "C"
{
extern uint32_t xran_lib_ota_tti;
extern uint32_t xran_lib_ota_sym;
extern uint32_t xran_lib_ota_sym_idx;
void sym_ota_cb(struct rte_timer *tim, void *arg);
void tti_ota_cb(struct rte_timer *tim, void *arg);
}
class xranLibWraper
{
public:
typedef enum
{
XRANFTHTX_OUT = 0,
XRANFTHTX_PRB_MAP_OUT,
XRANFTHTX_SEC_DESC_OUT,
XRANFTHRX_IN,
XRANFTHRX_PRB_MAP_IN,
XRANFTHTX_SEC_DESC_IN,
XRANFTHRACH_IN,
#if 1
XRANSRS_IN, // Added this entry as in sample app
#endif
MAX_SW_XRAN_INTERFACE_NUM
} SWXRANInterfaceTypeEnum;
enum nChBw
{
PHY_BW_5MHZ = 5, PHY_BW_10MHZ = 10, PHY_BW_15MHZ = 15,
PHY_BW_20MHZ = 20, PHY_BW_25MHZ = 25, PHY_BW_30MHZ = 30,
PHY_BW_40MHZ = 40, PHY_BW_50MHZ = 50, PHY_BW_60MHZ = 60,
PHY_BW_70MHZ = 70, PHY_BW_80MHZ = 80, PHY_BW_90MHZ = 90,
PHY_BW_100MHZ = 100, PHY_BW_200MHZ = 200, PHY_BW_400MHZ = 400
};
// F1 Tables 38.101-1 Table 5.3.2-1. Maximum transmission bandwidth configuration NRB
const uint16_t nNumRbsPerSymF1[3][13] =
{
// 5MHz 10MHz 15MHz 20MHz 25MHz 30MHz 40MHz 50MHz 60MHz 70MHz 80MHz 90MHz 100MHz
{ 25, 52, 79, 106, 133, 160, 216, 270, 0, 0, 0, 0, 0 }, // Numerology 0 (15KHz)
{ 11, 24, 38, 51, 65, 78, 106, 133, 162, 0, 217, 245, 273 }, // Numerology 1 (30KHz)
{ 0, 11, 18, 24, 31, 38, 51, 65, 79, 0, 107, 121, 135 } // Numerology 2 (60KHz)
};
// F2 Tables 38.101-2 Table 5.3.2-1. Maximum transmission bandwidth configuration NRB
const uint16_t nNumRbsPerSymF2[2][4] =
{
// 50MHz 100MHz 200MHz 400MHz
{ 66, 132, 264, 0 }, // Numerology 2 (60KHz)
{ 32, 66, 132, 264 } // Numerology 3 (120KHz)
};
protected:
char argv[25] = {'u','n','i','t','t','e','s','t','\0'};
//char argv[25] = "unittest";
std::string m_dpdk_dev_up, m_dpdk_dev_cp, m_dpdk_bbdev;
void *m_xranhandle;
uint8_t m_du_mac[6]; // = { 0x00,0x11, 0x22, 0x33, 0x44, 0x55 }; // Sofia: this is hard coded here and then it is read from the conf file
uint8_t m_ru_mac[6]; //= { 0x00,0x11, 0x22, 0x33, 0x44, 0x66 }; // Sofia: this is hard coded here and then it is read from the conf file
bool m_bSub6;
uint32_t m_nSlots; // = 20;
struct xran_fh_config m_xranConf;
struct xran_fh_init m_xranInit;
struct xran_timer_ctx {
uint32_t tti_to_process;
} m_timer_ctx[MAX_NUM_OF_XRAN_CTX];
/* io struct */
BbuIoBufCtrlStruct m_sFrontHaulTxBbuIoBufCtrl[XRAN_N_FE_BUF_LEN][XRAN_MAX_SECTOR_NR][XRAN_MAX_ANTENNA_NR];
BbuIoBufCtrlStruct m_sFrontHaulTxPrbMapBbuIoBufCtrl[XRAN_N_FE_BUF_LEN][XRAN_MAX_SECTOR_NR][XRAN_MAX_ANTENNA_NR];
BbuIoBufCtrlStruct m_sFrontHaulRxBbuIoBufCtrl[XRAN_N_FE_BUF_LEN][XRAN_MAX_SECTOR_NR][XRAN_MAX_ANTENNA_NR];
BbuIoBufCtrlStruct m_sFrontHaulRxPrbMapBbuIoBufCtrl[XRAN_N_FE_BUF_LEN][XRAN_MAX_SECTOR_NR][XRAN_MAX_ANTENNA_NR];
BbuIoBufCtrlStruct m_sFHPrachRxBbuIoBufCtrl[XRAN_N_FE_BUF_LEN][XRAN_MAX_SECTOR_NR][XRAN_MAX_ANTENNA_NR];
/* Cat B */
BbuIoBufCtrlStruct m_sFHSrsRxBbuIoBufCtrl[XRAN_N_FE_BUF_LEN][XRAN_MAX_SECTOR_NR][XRAN_MAX_ANT_ARRAY_ELM_NR];
/* buffers lists */
struct xran_flat_buffer m_sFrontHaulTxBuffers[XRAN_N_FE_BUF_LEN][XRAN_MAX_SECTOR_NR][XRAN_MAX_ANTENNA_NR][XRAN_NUM_OF_SYMBOL_PER_SLOT];
struct xran_flat_buffer m_sFrontHaulTxPrbMapBuffers[XRAN_N_FE_BUF_LEN][XRAN_MAX_SECTOR_NR][XRAN_MAX_ANTENNA_NR];
struct xran_flat_buffer m_sFrontHaulRxBuffers[XRAN_N_FE_BUF_LEN][XRAN_MAX_SECTOR_NR][XRAN_MAX_ANTENNA_NR][XRAN_NUM_OF_SYMBOL_PER_SLOT];
struct xran_flat_buffer m_sFrontHaulRxPrbMapBuffers[XRAN_N_FE_BUF_LEN][XRAN_MAX_SECTOR_NR][XRAN_MAX_ANTENNA_NR];
struct xran_flat_buffer m_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 m_sFHSrsRxBuffers[XRAN_N_FE_BUF_LEN][XRAN_MAX_SECTOR_NR][XRAN_MAX_ANT_ARRAY_ELM_NR][XRAN_MAX_NUM_OF_SRS_SYMBOL_PER_SLOT];
void *m_nInstanceHandle[XRAN_PORTS_NUM][XRAN_MAX_SECTOR_NR]; // instance per sector
uint32_t m_nBufPoolIndex[XRAN_MAX_SECTOR_NR][MAX_SW_XRAN_INTERFACE_NUM]; // every api owns unique buffer pool
uint32_t m_nSW_ToFpga_FTH_TxBufferLen;
uint32_t m_nFpgaToSW_FTH_RxBufferLen;
int32_t m_nSectorIndex[XRAN_MAX_SECTOR_NR];
int iq_bfw_buffer_size_dl = 0;
int iq_bfw_buffer_size_ul = 0;
/* beamforming weights for UL (O-DU) */
int16_t *p_tx_dl_bfw_buffer[MAX_ANT_CARRIER_SUPPORTED];
int32_t tx_dl_bfw_buffer_size[MAX_ANT_CARRIER_SUPPORTED];
int32_t tx_dl_bfw_buffer_position[MAX_ANT_CARRIER_SUPPORTED];
/* beamforming weights for UL (O-DU) */
int16_t *p_tx_ul_bfw_buffer[MAX_ANT_CARRIER_SUPPORTED];
int32_t tx_ul_bfw_buffer_size[MAX_ANT_CARRIER_SUPPORTED];
int32_t tx_ul_bfw_buffer_position[MAX_ANT_CARRIER_SUPPORTED];
private:
json m_global_cfg;
template<typename T>
T get_globalcfg(const std::string &type, const std::string &parameter_name)
{
return m_global_cfg[XRAN_UT_KEY_GLOBALCFG][type][parameter_name];
}
template<typename T>
std::vector<T> get_globalcfg_array(const std::string &type, const std::string &parameter_name)
{
auto array_size = m_global_cfg[XRAN_UT_KEY_GLOBALCFG][type][parameter_name].size();
std::vector<T> result(array_size);
for(unsigned number = 0; number < array_size; number++)
result.at(number) = m_global_cfg[XRAN_UT_KEY_GLOBALCFG][type][parameter_name][number];
return result;
}
uint16_t get_eaxcid_mask(int numbit, int shift);
int init_memory();
public:
// Class constructor
xranLibWraper();
// Class Distructor
~xranLibWraper();
int SetUp();
void TearDown();
int Init(struct xran_fh_config *pCfg = nullptr);
void Cleanup();
void Open(xran_ethdi_mbuf_send_fn send_cp, xran_ethdi_mbuf_send_fn send_up,
void *fh_rx_callback, void *fh_rx_prach_callback, void *fh_srs_callback);
void Close();
int Start();
int Stop();
/* emulation of timer */
void update_tti();
void update_symbol_index();
int apply_cpenable(bool flag);
int get_slot_config(const std::string &cfgname, struct xran_frame_config *pCfg);
int get_num_rbs(uint32_t nNumerology, uint32_t nBandwidth, bool nSub6);
void *get_xranhandle();
void *get_timer_ctx();
int get_symbol_index();
bool is_running();
enum xran_category get_rucategory();
int get_numerology();
int get_duplextype();
uint32_t get_num_cc();
uint32_t get_num_eaxc();
uint32_t get_num_eaxc_ul();
uint32_t get_num_dlrbs();
uint32_t get_num_ulrbs();
uint32_t get_num_antelmtrx();
bool is_cpenable();
bool is_prachenable();
bool is_dynamicsection();
bool get_sub6();
void get_cfg_prach(struct xran_prach_config *pCfg);
void get_cfg_frame(struct xran_frame_config *pCfg);
void get_cfg_ru(struct xran_ru_config *pCfg);
void get_cfg_fh(struct xran_fh_config *pCfg);
};
/* external declaration for the instance */
extern xranLibWraper *xranlib;
#endif //XRAN_LIB_WRAP_HPP

View File

@@ -0,0 +1,833 @@
/*******************************************************************************
*
* <COPYRIGHT_TAG>
*
*******************************************************************************/
/* This is the new utility file for all tests, all new common functionality has to go here.
When contributing to the common.hpp please focus on readability and maintainability rather than
execution time. */
#ifndef XRANLIB_COMMON_HPP
#define XRANLIB_COMMON_HPP
/* Disable warnings generated by JSON parser */
#pragma warning(disable : 191)
#pragma warning(disable : 186)
#pragma warning(disable : 192)
#include <exception>
#include <random>
#include <string>
#include <utility>
#include <vector>
#include <immintrin.h>
#include <malloc.h>
#define _BBLIB_DPDK_
#ifdef _BBLIB_DPDK_
#include <rte_config.h>
#include <rte_malloc.h>
#endif
//#include "gtest/gtest.h"
#include "common_typedef_xran.h"
#include "json.hpp"
using json = nlohmann::json;
#define ASSERT_ARRAY_NEAR(reference, actual, size, precision) \
assert_array_near(reference, actual, size, precision)
#define ASSERT_ARRAY_EQ(reference, actual, size) \
assert_array_eq(reference, actual, size)
#define ASSERT_AVG_GREATER_COMPLEX(reference, actual, size, precision) \
assert_avg_greater_complex(reference, actual, size, precision)
struct BenchmarkParameters
{
static long repetition;
static long loop;
static unsigned cpu_id;
};
struct missing_config_file_exception : public std::exception
{
const char * what () const throw () override {
return "JSON file cannot be opened!";
}
};
struct reading_input_file_exception : public std::exception
{
const char * what () const throw () override {
return "Input file cannot be read!";
}
};
/*!
\brief Attach current process to the selected core.
\param [in] cpu Core number.
\return 0 on success, -1 otherwise.
*/
int bind_to_cpu(const unsigned cpu);
/*!
\brief Calculate the mean and variance from the result of the run_benchmark.
\param [in] values Vector with result values.
\return std::pair where the first element is mean and the second one is standard deviation.
\note It's not a general mean/stddev function it only works properly when feed with data from
the benchmark function.
*/
std::pair<double, double> calculate_statistics(const std::vector<long> values);
/*!
\brief For a given number return sequence of number from 0 to number - 1.
\param [in] number Positive integer value.
\return Vector with the sorted integer numbers between 0 and number - 1.
*/
std::vector<unsigned> get_sequence(const unsigned number);
/*!
\brief Read JSON from the given file.
\param [in] filename name of the .json file.
\return JSON object with data.
\throws missing_config_file_exception when file cannot be opened.
*/
json read_json_from_file(const std::string &filename);
/*!
\brief Read binary data from the file.
\param [in] filename name of the binary file.
\return Pointer to the allocated memory with data from the file.
\throws std::runtime_error when memory cannot be allocated.
*/
//char* read_data_to_aligned_array(const std::string &filename);
/*!
\brief Measure the TSC on the machine
\return Number of ticks per us
*/
unsigned long tsc_recovery();
/*!
\brief Return the current value of the TSC
\return Current TSC value
*/
unsigned long tsc_tick();
/*!
\class KernelTests
Each test class has to inherit from KernelTests class as it provides GTest support and does a lot
of setup (including JSON) an provides useful methods to operate on loaded JSON file.
Unfortunately GTest is limited in the way that all TEST_P within the class are called for all
cases/parameters, but we usually want two different data sets for functional and performance
tests (or maybe other types of tests). Because of that to use different data sets we need to
create separate classes, hence performance and functional test are in separate classes. it adds
an extra overhead, but adds much more flexibility. init_test(...) is used to select data set from
the JSON file.
Important note on the JSON file structure. Top JSON object can have as many section (JSON
objects) as needed, but each have to have a distinct name that is used by init_test. Then
each section must contain an array of objects (test cases) where each object has a name,
parameters and references. Everything inside parameters and references can be completely custom
as it's loaded by get_input/reference_parameter function. JSON values can be either literal
values, e.g. 1, 0.001, 5e-05, etc. or filename. Depends on the get type test framework can either
read the value or load data from the file - and it happens automatically (*pff* MAGIC!).
*/
#if 0 //Ann: we don't need this test in OAI, so we comment out all GTest dependencies to include xran_lib_wrap.hpp
class KernelTests : public testing::TestWithParam<unsigned>
{
public:
static json conf;
static std::string test_type;
static void SetUpTestCase()
{
test_type = "None";
try
{
conf = read_json_from_file("conf.json");
}
catch(missing_config_file_exception &e)
{
std::cout << "[----------] SetUpTestCase failed: " << e.what() << std::endl;
exit(-1);
}
tsc = tsc_recovery();
if(!tsc)
{
std::cout << "[----------] SetUpTestCase failed: TSC recovery failed" << std::endl;
exit(-1);
}
}
static void TearDownTestCase()
{
/* Free resources - nothing to free at the moment */
}
static unsigned get_number_of_cases(const std::string &type)
{
try
{
json json_data = read_json_from_file("conf.json");
return json_data[type].size();
}
catch(missing_config_file_exception &e)
{
std::cout << "[----------] get_number_of_cases failed: " << e.what() << std::endl;
exit(-1);
}
catch(std::domain_error &e)
{
std::cout << "[----------] get_number_of_cases failed: " << e.what() << std::endl;
std::cout << "[----------] Use a default value: 0" << std::endl;
return 0;
}
}
protected:
double division_factor = 1.0;
std::string result_units = "None";
int parallelization_factor = 1;
/*!
\brief Set division factor
\param [in] factor Division factor that divides mean and standard deviation.
*/
void set_division_factor(const double factor)
{
division_factor = factor;
}
/*!
\brief Set reults units
\param [in] units Units that are displayed in the report.
*/
void set_results_units(const std::string &units)
{
result_units = units;
}
/*!
\brief Set size of processed data
\param [in] size Size of processed data used to calculate module throughput.
*/
void set_parallelization_factor(const int factor)
{
parallelization_factor = factor;
}
/*!
\brief Run performance test case for a given function.
\param [in] isa Used Instruction Set.
\param [in] module_name name of the tested kernel.
\param [in] function function to be tested.
\param [in] args function's arguments.
*/
template <typename F, typename ... Args>
void performance(const std::string &isa, const std::string &module_name, F function,
Args ... args) {
ASSERT_EQ(0, bind_to_cpu(BenchmarkParameters::cpu_id)) << "Failed to bind to cpu!";
const auto result = run_benchmark(function, args ...);
const auto scaled_mean = result.first / division_factor / tsc;
const auto scaled_stddev = result.second / division_factor / tsc;
print_and_store_results(isa, get_case_name(), module_name, get_case_name(), result_units,
parallelization_factor, scaled_mean, scaled_stddev);
}
/*!
\brief Print unique test description to the results xml file
\param [in] isa Used Instruction Set.
\param [in] module_name name of the tested kernel.
\param [in] function function to be tested.
*/
void print_test_description(const std::string &isa, const std::string &module_name) {
print_and_store_results(isa, get_case_name(), module_name, get_case_name(), result_units,
parallelization_factor, 0, 0);
}
//! @{
/*!
\brief Load selected data from a JSON object.
get_input_parameter loads data from parameters section of the test case in JSON file and
get_reference_parameter does the same thing for references section.
Get parameter function uses template type to figure out how to load parameters. If type
is NOT a pointer it'll load value directly from the JSON. Otherwise path to the test
vector is expected and function will allocate memory, load data from the binary file to
this memory location and return pointer to it. For example in here we request to load
pointer to float so llrs filed is expected to be
a path to the binary file.
*/
template <typename T>
T get_input_parameter(const std::string &parameter_name)
{
try
{
return get_parameter<T>("parameters", parameter_name);
}
catch (std::domain_error &e)
{
std::cout << "[----------] get_input_parameter (" << parameter_name
<< ") failed: " << e.what()
<< ". Did you mispell the parameter name?" << std::endl;
throw;
}
catch(reading_input_file_exception &e)
{
std::cout << "[----------] get_input_parameter (" << parameter_name
<< ") failed: " << e.what() << std::endl;
throw;
}
}
template <typename T>
T get_input_parameter(const std::string &subsection_name, const std::string &parameter_name)
{
try
{
return get_parameter<T>("parameters", subsection_name, parameter_name);
}
catch (std::domain_error &e)
{
std::cout << "[----------] get_input_parameter (" << subsection_name << "." << parameter_name
<< ") failed: " << e.what()
<< ". Did you mispell the parameter name?" << std::endl;
throw;
}
catch(reading_input_file_exception &e)
{
std::cout << "[----------] get_input_parameter (" << subsection_name << "." << parameter_name
<< ") failed: " << e.what() << std::endl;
throw;
}
}
template <typename T>
T get_input_parameter(const std::string &subsection_name, const int index, const std::string &parameter_name)
{
try
{
return get_parameter<T>("parameters", subsection_name, index, parameter_name);
}
catch (std::domain_error &e)
{
std::cout << "[----------] get_input_parameter (" << subsection_name << "[" << index << "]." << parameter_name
<< ") failed: " << e.what()
<< ". Did you mispell the parameter name?" << std::endl;
throw;
}
catch(reading_input_file_exception &e)
{
std::cout << "[----------] get_input_parameter (" << subsection_name << "[" << index << "]." << parameter_name
<< ") failed: " << e.what() << std::endl;
throw;
}
}
int get_input_parameter_size(const std::string &subsection_name, const std::string &parameter_name)
{
try
{
auto array_size = conf[test_type][GetParam()]["parameters"][subsection_name][parameter_name].size();
return (array_size);
}
catch (std::domain_error &e)
{
std::cout << "[----------] get_input_parameter_size (" << subsection_name << "." << parameter_name
<< ") failed: " << e.what()
<< ". Did you mispell the parameter name?" << std::endl;
return (-1);
}
catch(reading_input_file_exception &e)
{
std::cout << "[----------] get_input_parameter_size (" << subsection_name << "." << parameter_name
<< ") failed: " << e.what() << std::endl;
throw;
}
}
int get_input_subsection_size(const std::string &subsection_name)
{
try
{
auto array_size = conf[test_type][GetParam()]["parameters"][subsection_name].size();
return (array_size);
}
catch (std::domain_error &e)
{
std::cout << "[----------] get_input_subsection_size (" << subsection_name
<< ") failed: " << e.what()
<< ". Did you mispell the subsection name?" << std::endl;
return (-1);
}
catch(reading_input_file_exception &e)
{
std::cout << "[----------] get_input_subsection_size (" << subsection_name
<< ") failed: " << e.what() << std::endl;
throw;
}
}
template <typename T>
T get_reference_parameter(const std::string &parameter_name)
{
try
{
return get_parameter<T>("references", parameter_name);
}
catch (std::domain_error &e)
{
std::cout << "[----------] get_reference_parameter (" << parameter_name
<< ") failed: " << e.what()
<< ". Did you mispell the parameter name?" << std::endl;
throw;
}
catch(reading_input_file_exception &e)
{
std::cout << "[----------] get_reference_parameter (" << parameter_name
<< ") failed: " << e.what() << std::endl;
throw;
}
}
//! @}
/*!
\brief Get name of the test case from JSON file.
\return Test'ss case name or a default name if name field is missing.
*/
const std::string get_case_name()
{
try
{
return conf[test_type][GetParam()]["name"];
}
catch (std::domain_error &e)
{
std::cout << "[----------] get_case_name failed: " << e.what()
<< ". Did you specify a test name in JSON?" << std::endl;
std::cout << "[----------] Using a default name instead" << std::endl;
return "Default test name";
}
}
/*!
\brief Defines section in the conf.json that is used to load parameters from.
\param [in] type Name of the section in the JSON file.
*/
void init_test(const std::string &type)
{
test_type = type;
const std::string name = get_case_name();
std::cout << "[----------] Test case: " << name << std::endl;
}
private:
static unsigned long tsc;
template<typename T>
struct data_reader {
static T read_parameter(const int index, const std::string &type,
const std::string &parameter_name)
{
return conf[test_type][index][type][parameter_name];
}
};
template<typename T>
struct data_reader<std::vector<T>> {
static std::vector<T> read_parameter(const int index, const std::string &type,
const std::string &parameter_name)
{
auto array_size = conf[test_type][index][type][parameter_name].size();
std::vector<T> result(array_size);
for(unsigned number = 0; number < array_size; number++)
result.at(number) = conf[test_type][index][type][parameter_name][number];
return result;
}
};
template<typename T>
struct data_reader<T*> {
static T* read_parameter(const int index, const std::string &type,
const std::string &parameter_name)
{
return (T*) read_data_to_aligned_array(conf[test_type][index][type][parameter_name]);
}
};
template <typename T>
T get_parameter(const std::string &type, const std::string &parameter_name)
{
return data_reader<T>::read_parameter(GetParam(), type, parameter_name);
}
template<typename T>
struct data_reader2 {
static T read_parameter(const int index, const std::string &type,
const std::string &subsection_name,
const std::string &parameter_name)
{
return conf[test_type][index][type][subsection_name][parameter_name];
}
};
template<typename T>
struct data_reader2<std::vector<T>> {
static std::vector<T> read_parameter(const int index, const std::string &type,
const std::string &subsection_name,
const std::string &parameter_name)
{
auto array_size = conf[test_type][index][type][subsection_name][parameter_name].size();
std::vector<T> result(array_size);
for(unsigned number = 0; number < array_size; number++)
result.at(number) = conf[test_type][index][type][subsection_name][parameter_name][number];
return result;
}
};
template<typename T>
struct data_reader2<T*> {
static T* read_parameter(const int index, const std::string &type,
const std::string &subsection_name,
const std::string &parameter_name)
{
return (T*) read_data_to_aligned_array(conf[test_type][index][type][subsection_name][parameter_name]);
}
};
template <typename T>
T get_parameter(const std::string &type, const std::string &subsection_name, const std::string &parameter_name)
{
return data_reader2<T>::read_parameter(GetParam(), type, subsection_name, parameter_name);
}
template<typename T>
struct data_reader3 {
static T read_parameter(const int index, const std::string &type,
const std::string &subsection_name,
const int subindex,
const std::string &parameter_name)
{
return conf[test_type][index][type][subsection_name][subindex][parameter_name];
}
};
template<typename T>
struct data_reader3<std::vector<T>> {
static std::vector<T> read_parameter(const int index, const std::string &type,
const std::string &subsection_name,
const int subindex,
const std::string &parameter_name)
{
auto array_size = conf[test_type][index][type][subsection_name][subindex][parameter_name].size();
std::vector<T> result(array_size);
for(unsigned number = 0; number < array_size; number++)
result.at(number) = conf[test_type][index][type][subsection_name][subindex][parameter_name][number];
return result;
}
};
template<typename T>
struct data_reader3<T*> {
static T* read_parameter(const int index, const std::string &type,
const std::string &subsection_name,
const int subindex,
const std::string &parameter_name)
{
return (T*) read_data_to_aligned_array(conf[test_type][index][type][subsection_name][subindex][parameter_name]);
}
};
template <typename T>
T get_parameter(const std::string &type, const std::string &subsection_name, const int subindex, const std::string &parameter_name)
{
return data_reader3<T>::read_parameter(GetParam(), type, subsection_name, subindex, parameter_name);
}
void print_and_store_results(const std::string &isa,
const std::string &parameters,
const std::string &module_name,
const std::string &test_name,
const std::string &unit,
const int para_factor,
const double mean,
const double stddev);
};
/*!
\brief Run the given function and return the mean run time and stddev.
\param [in] function Function to benchmark.
\param [in] args Function's arguments.
\return std::pair where the first element is mean and the second one is standard deviation.
*/
template <typename F, typename ... Args>
std::pair<double, double> run_benchmark(F function, Args ... args)
{
std::vector<long> results((unsigned long) BenchmarkParameters::repetition);
for(unsigned int outer_loop = 0; outer_loop < BenchmarkParameters::repetition; outer_loop++) {
const auto start_time = __rdtsc();
for (unsigned int inner_loop = 0; inner_loop < BenchmarkParameters::loop; inner_loop++) {
function(args ...);
}
const auto end_time = __rdtsc();
results.push_back(end_time - start_time);
}
return calculate_statistics(results);
};
/*!
\brief Assert elements of two arrays. It calls ASSERT_EQ for each element of the array.
\param [in] reference Array with reference values.
\param [in] actual Array with the actual output.
\param [in] size Size of the array.
*/
template <typename T>
void assert_array_eq(const T* reference, const T* actual, const int size)
{
for(int index = 0; index < size ; index++)
{
ASSERT_EQ(reference[index], actual[index])
<<"The wrong number is index: "<< index;
}
}
/*!
\brief Assert elements of two arrays. It calls ASSERT_NEAR for each element of the array.
\param [in] reference Array with reference values.
\param [in] actual Array with the actual output.
\param [in] size Size of the array.
\param [in] precision Precision fo the comparision used by ASSERT_NEAR.
*/
template <typename T>
void assert_array_near(const T* reference, const T* actual, const int size, const double precision)
{
for(int index = 0; index < size ; index++)
{
ASSERT_NEAR(reference[index], actual[index], precision)
<<"The wrong number is index: "<< index;
}
}
template <>
void assert_array_near<complex_float>(const complex_float* reference, const complex_float* actual, const int size, const double precision)
{
for(int index = 0; index < size ; index++)
{
ASSERT_NEAR(reference[index].re, actual[index].re, precision)
<<"The wrong number is RE, index: "<< index;
ASSERT_NEAR(reference[index].im, actual[index].im, precision)
<<"The wrong number is IM, index: "<< index;
}
}
/*!
\brief Assert average diff of two arrays. It calls ASSERT_GT to check the average.
\param [in] reference Array with reference values, interleaved IQ inputs.
\param [in] actual Array with the actual output, interleaved IQ inputs.
\param [in] size Size of the array, based on complex inputs.
\param [in] precision Precision for the comparison used by ASSERT_GT.
*/
template<typename T>
void assert_avg_greater_complex(const T* reference, const T* actual, const int size, const double precision)
{
float mseDB, MSE;
double avgMSEDB = 0.0;
for (int index = 0; index < size; index++) {
T refReal = reference[2*index];
T refImag = reference[(2*index)+1];
T resReal = actual[2*index];
T resImag = actual[(2*index)+1];
T errReal = resReal - refReal;
T errIm = resImag - refImag;
For some unit tests, e.g. PUCCH deomdulation, the expected output is 0. To avoid a
divide by zero error, check the reference results to determine if the expected result
is 0 and, if so, add a 1 to the division.
if (refReal == 0 && refImag == 0)
MSE = (float)(errReal*errReal + errIm*errIm)/(float)(refReal*refReal + refImag*refImag + 1);
else
MSE = (float)(errReal*errReal + errIm*errIm)/(float)(refReal*refReal + refImag*refImag);
if(MSE == 0)
mseDB = (float)(-100.0);
else
mseDB = (float)(10.0) * (float)log10(MSE);
avgMSEDB += (double)mseDB;
}
avgMSEDB /= size;
ASSERT_GT(precision, avgMSEDB);
}
/*!
\brief Allocates memory of the given size.
aligned_malloc is wrapper to functions that allocate memory:
'rte_malloc' from DPDK if hugepages are defined, 'memalign' otherwise.
Size is defined as a number of variables of given type e.g. floats, rather than bytes.
It hides sizeof(T) multiplication and cast hence makes things cleaner.
\param [in] size Size of the memory to allocate.
\param [in] alignment Bytes alignment of the allocated memory. If 0, the return is a pointer
that is suitably aligned for any kind of variable (in the same manner as malloc()).
Otherwise, the return is a pointer that is a multiple of align. In this case,
it must be a power of two. (Minimum alignment is the cacheline size, i.e. 64-bytes)
\return Pointer to the allocated memory.
*/
template <typename T>
T* aligned_malloc(const int size, const unsigned alignment)
{
#ifdef _BBLIB_DPDK_
return (T*) rte_malloc(NULL, sizeof(T) * size, alignment);
#else
#ifndef _WIN64
return (T*) memalign(alignment, sizeof(T) * size);
#else
return (T*)_aligned_malloc(sizeof(T)*size, alignment);
#endif
#endif
}
/*!
\brief Frees memory pointed by the given pointer.
aligned_free is a wrapper for functions that free memory allocated by
aligned_malloc: 'rte_free' from DPDK if hugepages are defined and 'free' otherwise.
\param [in] ptr Pointer to the allocated memory.
*/
template <typename T>
void aligned_free(T* ptr)
{
#ifdef _BBLIB_DPDK_
rte_free((void*)ptr);
#else
#ifndef _WIN64
free((void*)ptr);
#else
_aligned_free((void *)ptr);
#endif
#endif
}
/*!
\brief generate random numbers.
It allocates memory and populate it with random numbers using C++11 default engine and
uniform real / int distribution (where lo_range <= x <up_range). Don't forget to free
allocated memory!
\param [in] size Size of the memory to be filled with random data.
\param [in] alignment Bytes alignment of the memory.
\param [in] distribution Distribuiton for random generator.
\return Pointer to the allocated memory with random data.
*/
template <typename T, typename U>
T* generate_random_numbers(const long size, const unsigned alignment, U& distribution)
{
auto array = (T*) aligned_malloc<char>(size * sizeof(T), alignment);
std::random_device random_device;
std::default_random_engine generator(random_device());
for(long i = 0; i < size; i++)
array[i] = (T)distribution(generator);
return array;
}
/*!
\brief generate random data.
It allocates memory and populate it with random data using C++11 default engine and
uniform integer distribution (bytes not floats are uniformly distributed). Don't forget
to free allocated memory!
\param [in] size Size of the memory to be filled with random data.
\param [in] alignment Bytes alignment of the memory.
\return Pointer to the allocated memory with random data.
*/
template <typename T>
T* generate_random_data(const long size, const unsigned alignment)
{
std::uniform_int_distribution<> random(0, 255);
return (T*)generate_random_numbers<char, std::uniform_int_distribution<>>(size * sizeof(T), alignment, random);
}
/*!
\brief generate integer random numbers.
It allocates memory and populate it with random numbers using C++11 default engine and
uniform integer distribution (where lo_range <= x < up_range). Don't forget
to free allocated memory! The result type generated by the generator should be one of
int types.
\param [in] size Size of the memory to be filled with random data.
\param [in] alignment Bytes alignment of the memory.
\param [in] lo_range Lower bound of range of values returned by random generator.
\param [in] up_range Upper bound of range of values returned by random generator.
\return Pointer to the allocated memory with random data.
*/
template <typename T>
T* generate_random_int_numbers(const long size, const unsigned alignment, const T lo_range,
const T up_range)
{
std::uniform_int_distribution<T> random(lo_range, up_range);
return generate_random_numbers<T, std::uniform_int_distribution<T>>(size, alignment, random);
}
/*!
\brief generate real random numbers.
It allocates memory and populate it with random numbers using C++11 default engine and
uniform real distribution (where lo_range <= x <up_range). Don't forget to free
allocated memory! The result type generated by the generator should be one of
real types: float, double or long double.
\param [in] size Size of the memory to be filled with random data.
\param [in] alignment Bytes alignment of the memory.
\param [in] lo_range Lower bound of range of values returned by random generator.
\param [in] up_range Upper bound of range of values returned by random generator.
\return Pointer to the allocated memory with random data.
*/
template <typename T>
T* generate_random_real_numbers(const long size, const unsigned alignment, const T lo_range,
const T up_range)
{
std::uniform_real_distribution<T> distribution(lo_range, up_range);
return generate_random_numbers<T, std::uniform_real_distribution<T>>(size, alignment, distribution);
}
#endif
#endif //XRANLIB_COMMON_HPP

View File

@@ -0,0 +1,123 @@
/*******************************************************************************
*
* <COPYRIGHT_TAG>
*
*******************************************************************************/
/*! \file common_typedef_xran.h
\brief This header file defines those data type both used by eNB and UE.
*/
#ifndef _COMMON_TYPEDEF_XRAN_H_
#define _COMMON_TYPEDEF_XRAN_H_
#include <stdint.h>
#include <stdio.h>
#include <stdbool.h>
/*!
\struct COMPLEX32
\brief Defines 64-bit complex structure; both real part and image part have 32 bit width.
*/
typedef struct {
float re; /*!< 32-bit real part */
float im; /*!< 32-bit image part */
} COMPLEX32;
//! @{
/*!
\struct complex_int16_t
\brief Defines 32-bit complex structure; both real part and image part have 16 bit width.
\brief Same defines as COMPLEX16
*/
typedef struct {
int16_t re; /*!< 16-bit real part */
int16_t im; /*!< 16-bit image part */
}complex_int16_t,COMPLEX16;
//! @}
/*!
\struct complex_int32_t
\brief Defines 64-bit complex structure; both real part and image part have 32 bit width.
*/
typedef struct {
int32_t re; /*!< 32-bit real part */
int32_t im; /*!< 32-bit image part */
}complex_int32_t;
/*!
\struct complex_float
\brief Defines 64-bit complex structure; both real part and image part have 32 bit width.
*/
typedef struct {
float re; /*!< 32-bit real part */
float im; /*!< 32-bit image part */
}complex_float;
/*!
\struct complex_double
\brief Defines 128-bit complex structure; both real part and image part have 64 bit width.
*/
typedef struct {
double re; /*!< 64-bit real part */
double im; /*!< 64-bit image part */
}complex_double;
/*!
\typedef half
\brief half is a 16-bit IEEE floating-point standard number format.
\note In future this will be known as `short float' or `__fp16'.
\note Older compilers must provide proxy support for it as a plain 16-bit integer
*/
typedef int16_t half;
/*!
\struct complex_half
\brief Defines 32-bit complex structure; both real part and image part have 16 bit width.
*/
typedef struct {
half re; /*!< 16-bit real part */
half im; /*!< 16-bit image part */
}complex_half;
/*!
\enum instruction_cpu_support
\brief Define instruction the CPU can support.
*/
typedef enum{
CPU_GENERIC, /*!< C */
SSE4_2, /*!< SSE4_2 */
AVX, /*!< AVX */
AVX2, /*!< AVX2 */
AVX_512, /*!< AVX512 */
}instruction_cpu_support;
/*!
\enum bblib_modulation_order
\brief Common enums for modulation order.
*/
enum bblib_modulation_order {
BBLIB_BPSK = 1, /*!< BPSK */
BBLIB_QPSK = 2, /*!< QPSK */
BBLIB_PAM4 = 3, /*!< PAM4 */
BBLIB_QAM16 = 4, /*!< QAM16 */
BBLIB_PAM8 = 5, /*!< PAM8 */
BBLIB_QAM64 = 6, /*!< QAM64 */
BBLIB_PAM16 = 7, /*!< PAM16 */
BBLIB_QAM256 = 8 /*!< QAM256 */
};
#ifdef _WIN64
#define __align(x) __declspec(align(x))
#else
#define __align(x) __attribute__((aligned(x)))
#define _aligned_malloc(x,y) memalign(y,x)
#endif
/* Test time and loops for unit test */
#define TIME 40
#define LOOP 30
#endif /* #ifndef _COMMON_TYPEDEF_H_ */

View File

@@ -0,0 +1,148 @@
/******************************************************************************
*
* 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.
* 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
* @file
* @ingroup
* @author Intel Corporation
**/
#ifndef _SAMPLEAPP__CONFIG_H_
#define _SAMPLEAPP__CONFIG_H_
#include <stdint.h>
#include <rte_ether.h>
#include "xran_fh_o_du.h"
/** Run time configuration of application */
typedef struct _RuntimeConfig
{
uint8_t appMode; /**< Application mode: lls-CU or RU */
uint8_t xranTech; /**< Radio Access Technology (NR or LTE) */
uint8_t xranCat; /**< xran mode: NR Categoty A, NR Category B, LTE Cat A, LTE Cat B */
uint8_t numCC; /**< Number of CC per ports supported by RU */
uint8_t numAxc; /**< Number of Antenna Carriers per CC */
uint8_t numUlAxc; /**< Number of Antenna Carriers per CC for UL (Cat B) */
uint32_t antElmTRx; /**< Number of antenna elements for TX and RX */
uint32_t muMimoUEs; /**< Number of UEs (with 1 RX ant)/beams */
uint32_t DlLayersPerUe; /**< Number of DL layer per UE */
uint32_t UlLayersPerUe; /**< Number of UL layer per UE */
uint32_t ttiPeriod; /**< TTI period */
uint32_t testVect; /**< Test Signal to send */
struct rte_ether_addr o_du_addr[XRAN_VF_MAX]; /**< O-DU Ethernet Mac Address */
struct rte_ether_addr o_ru_addr[XRAN_VF_MAX]; /**< O-RU Ethernet Mac Address */
struct rte_ether_addr tmp_addr; /**< Temp Ethernet Mac Address */
uint32_t instance_id; /**< Instance ID of application */
uint32_t io_core; /**< Core used for IO */
uint64_t io_worker; /**< Mask for worker cores */
int32_t io_sleep; /**< enable sleep on PMD cores */
uint32_t system_core; /* house keeping core */
int iova_mode; /**< DPDK IOVA Mode */
uint32_t mtu; /**< maximum transmission unit (MTU) is the size of the largest protocol data unit (PDU) that can be communicated in a single
xRAN network layer transaction. supported 1500 bytes and 9600 bytes (Jumbo Frame) */
int numSlots; /**< number of slots in IQ vector */
char ant_file[XRAN_MAX_SECTOR_NR*XRAN_MAX_ANTENNA_NR][512]; /**< file to use for test vector */
char prach_file[XRAN_MAX_SECTOR_NR*XRAN_MAX_ANTENNA_NR][512]; /**< file to use for test vector */
char dl_bfw_file [XRAN_MAX_SECTOR_NR*XRAN_MAX_ANTENNA_NR][512]; /**< file with beamforming weights for DL streams */
char ul_bfw_file [XRAN_MAX_SECTOR_NR*XRAN_MAX_ANTENNA_NR][512]; /**< file with beamforming weights for UL streams */
char ul_srs_file [XRAN_MAX_SECTOR_NR*XRAN_MAX_ANT_ARRAY_ELM_NR][512]; /**< file with SRS content for UL antenna elements */
/* prach config */
uint8_t enablePrach; /**< enable PRACH */
uint8_t prachOffset; /**< Sets the PRACH position in frequency / subcarrier position, n_PRBoffset^RA and is expressed as a physical resource block number.
Set by SIB2, prach-FreqOffset in E-UTRA. */
uint8_t prachConfigIndex;/**< TS36.211 - Table 5.7.1-2 : PRACH Configuration Index */
uint8_t iqswap; /**< do swap of IQ before send to ETH */
uint8_t nebyteorderswap; /**< do swap of byte order from host byte order to network byte order. ETH */
uint8_t compression; /**< enable use case with compression */
uint8_t CompHdrType; /**< dynamic or static compression header */
uint16_t totalBfWeights; /**< The total number of beamforming weights on RU */
uint8_t enableSrs; /**< enable SRS (valid for Cat B only) */
uint16_t srsSymMask; /**< SRS symbol mask [014] within S/U slot [0-13] def is 13 */
uint16_t maxFrameId; /**< max value of frame id */
uint16_t Tadv_cp_dl;
uint16_t T2a_min_cp_dl;
uint16_t T2a_max_cp_dl;
uint16_t T2a_min_cp_ul;
uint16_t T2a_max_cp_ul;
uint16_t T2a_min_up;
uint16_t T2a_max_up;
uint16_t Ta3_min;
uint16_t Ta3_max;
uint16_t T1a_min_cp_dl;
uint16_t T1a_max_cp_dl;
uint16_t T1a_min_cp_ul;
uint16_t T1a_max_cp_ul;
uint16_t T1a_min_up;
uint16_t T1a_max_up;
uint16_t Ta4_min;
uint16_t Ta4_max;
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;
int32_t debugStopCount;
int32_t bbdevMode;
int32_t DynamicSectionEna;
int32_t GPS_Alpha;
int32_t GPS_Beta;
uint8_t mu_number; /**< Mu numner as per 3GPP */
uint32_t nDLAbsFrePointA; /**< Abs Freq Point A of the Carrier Center Frequency for in KHz Value: 450000->52600000 */
uint32_t nULAbsFrePointA; /**< Abs Freq Point A of the Carrier Center Frequency for in KHz Value: 450000->52600000 */
uint32_t nDLBandwidth; /**< Carrier bandwidth for in MHz. Value: 5->400 */
uint32_t nULBandwidth; /**< Carrier bandwidth for in MHz. Value: 5->400 */
uint32_t nDLFftSize; /**< DL FFT size */
uint32_t nULFftSize; /**< UL FFT size */
uint8_t nFrameDuplexType;
uint8_t nTddPeriod;
struct xran_slot_config sSlotConfig[XRAN_MAX_TDD_PERIODICITY];
struct xran_prb_map PrbMapDl;
struct xran_prb_map PrbMapUl;
int32_t DU_Port_ID_bitwidth;
int32_t BandSector_ID_bitwidth;
int32_t CC_ID_bitwidth;
int32_t RU_Port_ID_bitwidth;
} RuntimeConfig;
/**
* Parse application configuration file.
*
* @param filename The name of the configuration file to be parsed.
* @param config The configuration structure to be filled with parsed data. */
int parseConfigFile(char *filename, RuntimeConfig *config);
#endif /* _SAMPLEAPP__CONFIG_H_ */

View File

@@ -0,0 +1,81 @@
/******************************************************************************
*
* 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.
* 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
* @file
* @ingroup
* @author Intel Corporation
**/
#ifndef _SAMPLEAPP__DEBUG_H_
#define _SAMPLEAPP__DEBUG_H_
#include <stdio.h>
#include "config.h"
#define MAX_FILE_NAME_LEN (512)
#define MAX_PATH_NAME_LEN (1024)
#ifdef _DEBUG
#define log_dbg(fmt, ...) \
fprintf(stderr, \
"DEBUG: %s(%d): " fmt "\n", \
__FILE__, \
__LINE__, ##__VA_ARGS__)
#else
#define log_dbg(fmt, ...)
#endif
#if defined(_DEBUG) || defined(_VERBOSE)
#define log_wrn(fmt, ...) \
fprintf( \
stderr, \
"WARNING: %s(%d): " fmt "\n", \
__FILE__, \
__LINE__, ##__VA_ARGS__)
#else
#define log_dbg(fmt, ...)
#define log_wrn(fmt, ...)
#endif
#define log_err(fmt, ...) \
fprintf(stderr, \
"ERROR: %s(%d): " fmt "\n", \
__FILE__, \
__LINE__, ##__VA_ARGS__)
inline void ShowData(void* ptr, unsigned int size)
{
uint8_t *d = (uint8_t *)ptr;
unsigned int i;
for(i = 0; i < size; i++)
{
if ( !(i & 0xf) )
printf("\n");
printf("%02x ", d[i]);
}
printf("\n");
}
#endif /* _SAMPLEAPP__DEBUG_H_ */

View File

@@ -0,0 +1,140 @@
/******************************************************************************
*
* 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 has all definitions for the Ethernet Data Interface Layer
* @file ethdi.h
* @ingroup group_lte_source_auxlib
* @author Intel Corporation
**/
#ifndef _ETHDI_H_
#define _ETHDI_H_
#ifdef __cplusplus
extern "C" {
#endif
#include <rte_config.h>
#include <rte_mbuf.h>
#include <rte_timer.h>
/* comment this to enable PDUMP
* DPDK has to be compiled with
* CONFIG_RTE_LIBRTE_PMD_PCAP=y
* CONFIG_RTE_LIBRTE_PDUMP=y
*/
#undef RTE_LIBRTE_PDUMP
#ifdef RTE_LIBRTE_PDUMP
#include <rte_pdump.h>
#endif
#include "ethernet.h"
#include "xran_fh_o_du.h"
#define XRAN_THREAD_DEFAULT_PRIO (98)
/* If we're not receiving packets for more then this threshold... */
//#define SLEEP_THRESHOLD (rte_get_tsc_hz() / 30) /* = 33.3(3)ms */
/* we go to sleep for this long (usleep). Undef SLEEP_TRESHOLD to disable. */
#define SLEEP_TIME 200 /* (us) */
#define BCAST {0xff, 0xff, 0xff, 0xff, 0xff, 0xff}
#define TX_TIMER_INTERVAL ((rte_get_timer_hz() / 1000000000L)*interval_us*1000) /* nanosec */
#define TX_RX_LOOP_TIME rte_get_timer_hz() / 1
/* CAUTION: Keep in sync with the string table below. */
enum xran_entities_id
{
ID_O_DU,
ID_O_RU,
ID_BROADCAST,
ID_MAX
};
static char *const entity_names[] = {
"ORAN O-DU sim app",
"ORAN O-RU sim app",
};
typedef int (*PROCESS_CB)(void * arg);
/**
* Structure storing internal configuration of workers
*/
struct xran_worker_config {
lcore_function_t *f;
void *arg;
int32_t state;
};
struct xran_ethdi_ctx
{
struct xran_io_cfg io_cfg;
struct rte_ether_addr entities[XRAN_VF_MAX][ID_BROADCAST + 1];
struct rte_ring *tx_ring[XRAN_VF_MAX];
struct rte_ring *rx_ring[XRAN_VF_MAX];
struct rte_ring *pkt_dump_ring[XRAN_VF_MAX];
struct rte_timer timer_autodetect;
struct rte_timer timer_ping;
struct rte_timer timer_sync;
struct rte_timer timer_tx;
struct xran_worker_config pkt_wrk_cfg[RTE_MAX_LCORE];
unsigned pkt_stats[PKT_LAST + 1];
};
enum {
MBUF_KEEP,
MBUF_FREE
};
extern enum xran_if_state xran_if_current_state;
static inline struct xran_ethdi_ctx *xran_ethdi_get_ctx(void)
{
extern struct xran_ethdi_ctx g_ethdi_ctx;
return &g_ethdi_ctx;
}
typedef int (*xran_ethdi_handler)(struct rte_mbuf *, int sender, uint64_t rx_time);
typedef int (*ethertype_handler)(struct rte_mbuf *, uint64_t rx_time);
typedef int (*xran_ethdi_handler)(struct rte_mbuf *, int sender, uint64_t rx_time);
int xran_register_ethertype_handler(uint16_t ethertype, ethertype_handler callback);
int32_t xran_ethdi_init_dpdk_io(char *name, const struct xran_io_cfg *io_cfg,
int *lcore_id, struct rte_ether_addr *p_o_du_addr,
struct rte_ether_addr *p_ru_addr);
struct rte_mbuf *xran_ethdi_mbuf_alloc(void);
int32_t xran_ethdi_mbuf_send(struct rte_mbuf *mb, uint16_t ethertype, uint16_t vf_id);
int32_t xran_ethdi_mbuf_send_cp(struct rte_mbuf *mb, uint16_t ethertype, uint16_t vf_id);
int32_t xran_ethdi_filter_packet(struct rte_mbuf *pkt, uint64_t rx_time);
int32_t process_dpdk_io(void);
#ifdef __cplusplus
}
#endif
#endif /* #ifndef _ETHDI_H_ */

View File

@@ -0,0 +1,168 @@
/******************************************************************************
*
* 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 has all definitions for the Ethernet Data Interface Layer
* @file ethernet.h
* @ingroup group_lte_source_auxlib
* @author Intel Corporation
**/
#ifndef AUXLIB_ETHERNET_H
#define AUXLIB_ETHERNET_H
#ifdef __cplusplus
extern "C" {
#endif
#include <rte_config.h>
#include <rte_ether.h>
#include <rte_mbuf.h>
#define BURST_SIZE 4096
#define ETHER_TYPE_ETHDI RTE_ETHER_TYPE_IPV4 /* hack needed for jumbo frames */
#define ETHER_TYPE_ECPRI 0xAEFE
#define ETHER_TYPE_SYNC 0xBEFE
#define ETHER_TYPE_START_TX 0xCEFE
#define NUM_MBUFS 65535/*16383*/ /*65535*/ /** optimal is n = (2^q - 1) */
#define NUM_MBUFS_RING NUM_MBUFS+1 /** The size of the ring (must be a power of 2) */
#define MBUF_CACHE 256
#define MBUF_POOL_ELM_SMALL (1500 + RTE_PKTMBUF_HEADROOM )/* regular ethernet MTU, most compatible */
#define MBUF_POOL_ELEMENT (MAX_RX_LEN + RTE_PKTMBUF_HEADROOM)
#define MAX_RX_LEN 9600
#define MAX_TX_LEN (MAX_RX_LEN - 14) /* headroom for rx driver */
#define MAX_DATA_SIZE (MAX_TX_LEN - sizeof(struct ether_hdr) - \
sizeof(struct ethdi_hdr) - sizeof(struct burst_hdr))
/* Looks like mbuf size is limited to 16 bits - see the buf_len field. */
#define MBUF_POOL_ELM_BIG USHRT_MAX
#define NUM_MBUFS_BIG 64
#define DEFAULT_DUMP_LENGTH 96
extern struct rte_mempool *_eth_mbuf_pool;
extern struct rte_mempool *_eth_mbuf_pool_small;
extern struct rte_mempool *_eth_mbuf_pool_big;
extern struct rte_mempool *socket_direct_pool;
extern struct rte_mempool *socket_indirect_pool;
/* Do NOT change the order of this enum and below
* - need to be in sync with the table of handlers in testue.c */
enum pkt_type
{
PKT_ZERO,
PKT_EMPTY,
PKT_DISCOVER_REQUEST,
PKT_PING,
PKT_PONG,
PKT_DISCOVER_REPLY,
PKT_LTE_DATA,
PKT_LTE_CONTROL,
PKT_BURST,
PKT_DATATEST,
PKT_ADD_ETHDEV,
PKT_SYNC_START,
PKT_LAST,
};
/* Do NOT change the order. */
static char * const xran_pkt_descriptions[PKT_LAST + 1] = {
"ZERO",
"empty packet",
"discovery request packet",
"ping packet",
"pong packet",
"discovery reply packet",
"LTE data packet",
"LTE control packet",
"BURST packet",
"DATATEST packet",
"Add ethernet port command packet",
"SYNC-START packet",
"LAST packet",
};
struct burst_hdr {
int8_t pkt_idx;
int8_t total_pkts;
int8_t original_type;
int8_t data[];
};
struct ethdi_hdr {
uint8_t pkt_type;
uint8_t source_id;
uint8_t dest_id;
int8_t data[]; /* original raw data starts here! */
};
void xran_init_mbuf_pool(void);
void xran_init_port(int port);
void xran_add_eth_hdr_vlan(struct rte_ether_addr *dst, uint16_t ethertype, struct rte_mbuf *mb);
#if 0
void xran_memdump(void *addr, int len);
void xran_add_eth_hdr(struct ether_addr *dst, uint16_t ethertype, struct rte_mbuf *);
int xran_send_mbuf(struct ether_addr *dst, struct rte_mbuf *mb);
int xran_send_message_burst(int dst_id, int pkt_type, void *body, int len);
int xran_show_delayed_message(void);
#endif
/*
* Print a message after all critical processing done.
* Mt-safe. 4 variants - normal, warning, error and debug log.
*/
int __xran_delayed_msg(const char *fmt, ...);
#define nlog(m, ...) __xran_delayed_msg("%s(): " m "\n", __FUNCTION__, ##__VA_ARGS__)
#define delayed_message nlog /* this is the old alias for this function */
#define wlog(m, ...) nlog("WARNING: " m, ##__VA_ARGS__)
#define elog(m, ...) nlog("ERROR: " m, ##__VA_ARGS__)
#ifdef DEBUG
# define dlog(m, ...) nlog("DEBUG: " m, ##__VA_ARGS__)
#else
# define dlog(m, ...)
#endif
#define PANIC_ON(x, m, ...) do { if (unlikely(x)) \
rte_panic("%s: " m "\n", #x, ##__VA_ARGS__); } while (0)
/* Add mbuf to the TX ring. */
static inline int xran_enqueue_mbuf(struct rte_mbuf *mb, struct rte_ring *r)
{
if (rte_ring_enqueue(r, mb) == 0) {
return 1; /* success */
}
rte_pktmbuf_free(mb);
wlog("failed to enqueue packet on port %d (ring full)", mb->port);
return 0; /* fail */
}
#ifdef __cplusplus
}
#endif
#endif /* AUXLIB_ETHERNET_H */

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,61 @@
/******************************************************************************
*
* 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 Header file for functions to perform application level fragmentation
*
* @file xran_app_frag.h
* @ingroup group_source_xran
* @author Intel Corporation
**/
#ifndef _XRAN_APP_FRAG_
#define _XRAN_APP_FRAG_
#ifdef __cplusplus
extern "C" {
#endif
#include <stdint.h>
#include <stdio.h>
#include <rte_config.h>
#include <rte_malloc.h>
#include <rte_memory.h>
#include <rte_mempool.h>
#include <rte_byteorder.h>
#include "xran_fh_o_du.h"
#include "xran_cp_api.h"
int32_t xran_app_fragment_packet(struct rte_mbuf *pkt_in, /* eth hdr is prepended */
struct rte_mbuf **pkts_out,
uint16_t nb_pkts_out,
uint16_t mtu_size,
struct rte_mempool *pool_direct,
struct rte_mempool *pool_indirect,
struct xran_section_info *sectinfo,
uint8_t *seqid);
#ifdef __cplusplus
}
#endif
#endif /* _XRAN_APP_FRAG_ */

View File

@@ -0,0 +1,363 @@
/******************************************************************************
*
* 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 xRAN BFP compression/decompression utilities functions
*
* @file xran_bfp_utils.hpp
* @ingroup group_source_xran
* @author Intel Corporation
**/
#pragma once
#include <immintrin.h>
namespace BlockFloatCompander
{
/// Define function signatures for byte packing functions
typedef __m512i(*PackFunction)(const __m512i);
typedef __m512i(*UnpackFunction)(const uint8_t*);
typedef __m256i(*UnpackFunction256)(const uint8_t*);
/// Calculate exponent based on 16 max abs values using leading zero count.
inline __m512i
maskUpperWord(const __m512i inData)
{
const auto k_upperWordMask = _mm512_set_epi64(0x0000FFFF0000FFFF, 0x0000FFFF0000FFFF,
0x0000FFFF0000FFFF, 0x0000FFFF0000FFFF,
0x0000FFFF0000FFFF, 0x0000FFFF0000FFFF,
0x0000FFFF0000FFFF, 0x0000FFFF0000FFFF);
return _mm512_and_epi64(inData, k_upperWordMask);
}
/// Calculate exponent based on 16 max abs values using leading zero count.
inline __m512i
expLzCnt(const __m512i maxAbs, const __m512i totShiftBits)
{
/// Compute exponent
const auto lzCount = _mm512_lzcnt_epi32(maxAbs);
return _mm512_subs_epu16(totShiftBits, lzCount);
}
inline int
horizontalMax1x32(const __m512i maxAbsReg)
{
/// Swap each IQ pair in each lane (via 32b rotation) and compute max of
/// each pair.
const auto maxRot16 = _mm512_rol_epi32(maxAbsReg, BlockFloatCompander::k_numBitsIQ);
const auto maxAbsIQ = _mm512_max_epi16(maxAbsReg, maxRot16);
/// Convert to 32b by removing repeated values in maxAbs
const auto maxAbs32 = maskUpperWord(maxAbsIQ);
/// Return reduced max
return _mm512_reduce_max_epi32(maxAbs32);
}
/// Pack compressed 9 bit data in network byte order
/// See https://soco.intel.com/docs/DOC-2665619
inline __m512i
networkBytePack9b(const __m512i compData)
{
/// Logical shift left to align network order byte parts
const __m512i k_shiftLeft = _mm512_set_epi64(0x0000000100020003, 0x0004000500060007,
0x0000000100020003, 0x0004000500060007,
0x0000000100020003, 0x0004000500060007,
0x0000000100020003, 0x0004000500060007);
const auto compDataPacked = _mm512_sllv_epi16(compData, k_shiftLeft);
/// First epi8 shuffle of even indexed samples
const __m512i k_byteShuffleMask1 = _mm512_set_epi64(0x0000000000000000, 0x0C0D080904050001,
0x0000000000000000, 0x0C0D080904050001,
0x0000000000000000, 0x0C0D080904050001,
0x0000000000000000, 0x0C0D080904050001);
constexpr uint64_t k_byteMask1 = 0x00FF00FF00FF00FF;
const auto compDataShuff1 = _mm512_maskz_shuffle_epi8(k_byteMask1, compDataPacked, k_byteShuffleMask1);
/// Second epi8 shuffle of odd indexed samples
const __m512i k_byteShuffleMask2 = _mm512_set_epi64(0x000000000000000E, 0x0F0A0B0607020300,
0x000000000000000E, 0x0F0A0B0607020300,
0x000000000000000E, 0x0F0A0B0607020300,
0x000000000000000E, 0x0F0A0B0607020300);
constexpr uint64_t k_byteMask2 = 0x01FE01FE01FE01FE;
const auto compDataShuff2 = _mm512_maskz_shuffle_epi8(k_byteMask2, compDataPacked, k_byteShuffleMask2);
/// Ternary blend of the two shuffled results
const __m512i k_ternLogSelect = _mm512_set_epi64(0x00000000000000FF, 0x01FC07F01FC07F00,
0x00000000000000FF, 0x01FC07F01FC07F00,
0x00000000000000FF, 0x01FC07F01FC07F00,
0x00000000000000FF, 0x01FC07F01FC07F00);
return _mm512_ternarylogic_epi64(compDataShuff1, compDataShuff2, k_ternLogSelect, 0xd8);
}
/// Pack compressed 10 bit data in network byte order
/// See https://soco.intel.com/docs/DOC-2665619
inline __m512i
networkBytePack10b(const __m512i compData)
{
/// Logical shift left to align network order byte parts
const __m512i k_shiftLeft = _mm512_set_epi64(0x0000000200040006, 0x0000000200040006,
0x0000000200040006, 0x0000000200040006,
0x0000000200040006, 0x0000000200040006,
0x0000000200040006, 0x0000000200040006);
const auto compDataPacked = _mm512_sllv_epi16(compData, k_shiftLeft);
/// First epi8 shuffle of even indexed samples
const __m512i k_byteShuffleMask1 = _mm512_set_epi64(0x000000000000000C, 0x0D08090004050001,
0x000000000000000C, 0x0D08090004050001,
0x000000000000000C, 0x0D08090004050001,
0x000000000000000C, 0x0D08090004050001);
constexpr uint64_t k_byteMask1 = 0x01EF01EF01EF01EF;
const auto compDataShuff1 = _mm512_maskz_shuffle_epi8(k_byteMask1, compDataPacked, k_byteShuffleMask1);
/// Second epi8 shuffle of odd indexed samples
const __m512i k_byteShuffleMask2 = _mm512_set_epi64(0x0000000000000E0F, 0x0A0B000607020300,
0x0000000000000E0F, 0x0A0B000607020300,
0x0000000000000E0F, 0x0A0B000607020300,
0x0000000000000E0F, 0x0A0B000607020300);
constexpr uint64_t k_byteMask2 = 0x03DE03DE03DE03DE;
const auto compDataShuff2 = _mm512_maskz_shuffle_epi8(k_byteMask2, compDataPacked, k_byteShuffleMask2);
/// Ternary blend of the two shuffled results
const __m512i k_ternLogSelect = _mm512_set_epi64(0x000000000000FF03, 0xF03F00FF03F03F00,
0x000000000000FF03, 0xF03F00FF03F03F00,
0x000000000000FF03, 0xF03F00FF03F03F00,
0x000000000000FF03, 0xF03F00FF03F03F00);
return _mm512_ternarylogic_epi64(compDataShuff1, compDataShuff2, k_ternLogSelect, 0xd8);
}
/// Pack compressed 12 bit data in network byte order
/// See https://soco.intel.com/docs/DOC-2665619
inline __m512i
networkBytePack12b(const __m512i compData)
{
/// Logical shift left to align network order byte parts
const __m512i k_shiftLeft = _mm512_set_epi64(0x0000000400000004, 0x0000000400000004,
0x0000000400000004, 0x0000000400000004,
0x0000000400000004, 0x0000000400000004,
0x0000000400000004, 0x0000000400000004);
const auto compDataPacked = _mm512_sllv_epi16(compData, k_shiftLeft);
/// First epi8 shuffle of even indexed samples
const __m512i k_byteShuffleMask1 = _mm512_set_epi64(0x00000000000C0D00, 0x0809000405000001,
0x00000000000C0D00, 0x0809000405000001,
0x00000000000C0D00, 0x0809000405000001,
0x00000000000C0D00, 0x0809000405000001);
constexpr uint64_t k_byteMask1 = 0x06DB06DB06DB06DB;
const auto compDataShuff1 = _mm512_maskz_shuffle_epi8(k_byteMask1, compDataPacked, k_byteShuffleMask1);
/// Second epi8 shuffle of odd indexed samples
const __m512i k_byteShuffleMask2 = _mm512_set_epi64(0x000000000E0F000A, 0x0B00060700020300,
0x000000000E0F000A, 0x0B00060700020300,
0x000000000E0F000A, 0x0B00060700020300,
0x000000000E0F000A, 0x0B00060700020300);
constexpr uint64_t k_byteMask2 = 0x0DB60DB60DB60DB6;
const auto compDataShuff2 = _mm512_maskz_shuffle_epi8(k_byteMask2, compDataPacked, k_byteShuffleMask2);
/// Ternary blend of the two shuffled results
const __m512i k_ternLogSelect = _mm512_set_epi64(0x00000000FF0F00FF, 0x0F00FF0F00FF0F00,
0x00000000FF0F00FF, 0x0F00FF0F00FF0F00,
0x00000000FF0F00FF, 0x0F00FF0F00FF0F00,
0x00000000FF0F00FF, 0x0F00FF0F00FF0F00);
return _mm512_ternarylogic_epi64(compDataShuff1, compDataShuff2, k_ternLogSelect, 0xd8);
}
/// Unpack compressed 9 bit data in network byte order
/// See https://soco.intel.com/docs/DOC-2665619
inline __m512i
networkByteUnpack9b(const uint8_t* inData)
{
/// Align chunks of compressed bytes into lanes to allow for expansion
const __m512i* rawDataIn = reinterpret_cast<const __m512i*>(inData);
const auto k_expPerm = _mm512_set_epi32(9, 8, 7, 6, 7, 6, 5, 4,
5, 4, 3, 2, 3, 2, 1, 0);
const auto inLaneAlign = _mm512_permutexvar_epi32(k_expPerm, *rawDataIn);
/// Byte shuffle to get all bits for each sample into 16b chunks
/// Due to previous permute to get chunks of bytes into each lane, there is
/// a different shuffle offset in each lane
const __m512i k_byteShuffleMask = _mm512_set_epi64(0x0A0B090A08090708, 0x0607050604050304,
0x090A080907080607, 0x0506040503040203,
0x0809070806070506, 0x0405030402030102,
0x0708060705060405, 0x0304020301020001);
const auto inDatContig = _mm512_shuffle_epi8(inLaneAlign, k_byteShuffleMask);
/// Logical shift left to set sign bit
const __m512i k_slBits = _mm512_set_epi64(0x0007000600050004, 0x0003000200010000,
0x0007000600050004, 0x0003000200010000,
0x0007000600050004, 0x0003000200010000,
0x0007000600050004, 0x0003000200010000);
const auto inSetSign = _mm512_sllv_epi16(inDatContig, k_slBits);
/// Mask to zero unwanted bits
const __m512i k_expMask = _mm512_set1_epi16(0xFF80);
return _mm512_and_epi64(inSetSign, k_expMask);
}
/// Unpack compressed 10 bit data in network byte order
/// See https://soco.intel.com/docs/DOC-2665619
inline __m512i
networkByteUnpack10b(const uint8_t* inData)
{
/// Align chunks of compressed bytes into lanes to allow for expansion
const __m512i* rawDataIn = reinterpret_cast<const __m512i*>(inData);
const auto k_expPerm = _mm512_set_epi32(10, 9, 8, 7, 8, 7, 6, 5,
5, 4, 3, 2, 3, 2, 1, 0);
const auto inLaneAlign = _mm512_permutexvar_epi32(k_expPerm, *rawDataIn);
/// Byte shuffle to get all bits for each sample into 16b chunks
/// Due to previous permute to get chunks of bytes into each lane, lanes
/// 0 and 2 happen to be aligned, but lane 1 is offset by 2 bytes
const __m512i k_byteShuffleMask = _mm512_set_epi64(0x0A0B090A08090708, 0x0506040503040203,
0x0809070806070506, 0x0304020301020001,
0x0A0B090A08090708, 0x0506040503040203,
0x0809070806070506, 0x0304020301020001);
const auto inDatContig = _mm512_shuffle_epi8(inLaneAlign, k_byteShuffleMask);
/// Logical shift left to set sign bit
const __m512i k_slBits = _mm512_set_epi64(0x0006000400020000, 0x0006000400020000,
0x0006000400020000, 0x0006000400020000,
0x0006000400020000, 0x0006000400020000,
0x0006000400020000, 0x0006000400020000);
const auto inSetSign = _mm512_sllv_epi16(inDatContig, k_slBits);
/// Mask to zero unwanted bits
const __m512i k_expMask = _mm512_set1_epi16(0xFFC0);
return _mm512_and_epi64(inSetSign, k_expMask);
}
/// Unpack compressed 12 bit data in network byte order
/// See https://soco.intel.com/docs/DOC-2665619
inline __m512i
networkByteUnpack12b(const uint8_t* inData)
{
/// Align chunks of compressed bytes into lanes to allow for expansion
const __m512i* rawDataIn = reinterpret_cast<const __m512i*>(inData);
const auto k_expPerm = _mm512_set_epi32(12, 11, 10, 9, 9, 8, 7, 6,
6, 5, 4, 3, 3, 2, 1, 0);
const auto inLaneAlign = _mm512_permutexvar_epi32(k_expPerm, *rawDataIn);
/// Byte shuffle to get all bits for each sample into 16b chunks
/// For 12b mantissa all lanes post-permute are aligned and require same shuffle offset
const __m512i k_byteShuffleMask = _mm512_set_epi64(0x0A0B090A07080607, 0x0405030401020001,
0x0A0B090A07080607, 0x0405030401020001,
0x0A0B090A07080607, 0x0405030401020001,
0x0A0B090A07080607, 0x0405030401020001);
const auto inDatContig = _mm512_shuffle_epi8(inLaneAlign, k_byteShuffleMask);
/// Logical shift left to set sign bit
const __m512i k_slBits = _mm512_set_epi64(0x0004000000040000, 0x0004000000040000,
0x0004000000040000, 0x0004000000040000,
0x0004000000040000, 0x0004000000040000,
0x0004000000040000, 0x0004000000040000);
const auto inSetSign = _mm512_sllv_epi16(inDatContig, k_slBits);
/// Mask to zero unwanted bits
const __m512i k_expMask = _mm512_set1_epi16(0xFFF0);
return _mm512_and_epi64(inSetSign, k_expMask);
}
/// Unpack compressed 9 bit data in network byte order
/// See https://soco.intel.com/docs/DOC-2665619
/// This unpacking function is for 256b registers
inline __m256i
networkByteUnpack9b256(const uint8_t* inData)
{
/// Align chunks of compressed bytes into lanes to allow for expansion
const __m256i* rawDataIn = reinterpret_cast<const __m256i*>(inData);
const auto k_expPerm = _mm256_set_epi32(5, 4, 3, 2, 3, 2, 1, 0);
const auto inLaneAlign = _mm256_permutexvar_epi32(k_expPerm, *rawDataIn);
/// Byte shuffle to get all bits for each sample into 16b chunks
/// Due to previous permute to get chunks of bytes into each lane, there is
/// a different shuffle offset in each lane
const __m256i k_byteShuffleMask = _mm256_set_epi64x(0x0809070806070506, 0x0405030402030102,
0x0708060705060405, 0x0304020301020001);
const auto inDatContig = _mm256_shuffle_epi8(inLaneAlign, k_byteShuffleMask);
/// Logical shift left to set sign bit
const __m256i k_slBits = _mm256_set_epi64x(0x0007000600050004, 0x0003000200010000,
0x0007000600050004, 0x0003000200010000);
const auto inSetSign = _mm256_sllv_epi16(inDatContig, k_slBits);
/// Mask to zero unwanted bits
const __m256i k_expMask = _mm256_set1_epi16(0xFF80);
return _mm256_and_si256(inSetSign, k_expMask);
}
/// Unpack compressed 10 bit data in network byte order
/// See https://soco.intel.com/docs/DOC-2665619
/// This unpacking function is for 256b registers
inline __m256i
networkByteUnpack10b256(const uint8_t* inData)
{
/// Align chunks of compressed bytes into lanes to allow for expansion
const __m256i* rawDataIn = reinterpret_cast<const __m256i*>(inData);
const auto k_expPerm = _mm256_set_epi32(5, 4, 3, 2, 3, 2, 1, 0);
const auto inLaneAlign = _mm256_permutexvar_epi32(k_expPerm, *rawDataIn);
/// Byte shuffle to get all bits for each sample into 16b chunks
/// Due to previous permute to get chunks of bytes into each lane, lanes
/// 0 and 2 happen to be aligned, but lane 1 is offset by 2 bytes
const __m256i k_byteShuffleMask = _mm256_set_epi64x(0x0A0B090A08090708, 0x0506040503040203,
0x0809070806070506, 0x0304020301020001);
const auto inDatContig = _mm256_shuffle_epi8(inLaneAlign, k_byteShuffleMask);
/// Logical shift left to set sign bit
const __m256i k_slBits = _mm256_set_epi64x(0x0006000400020000, 0x0006000400020000,
0x0006000400020000, 0x0006000400020000);
const auto inSetSign = _mm256_sllv_epi16(inDatContig, k_slBits);
/// Mask to zero unwanted bits
const __m256i k_expMask = _mm256_set1_epi16(0xFFC0);
return _mm256_and_si256(inSetSign, k_expMask);
}
/// Unpack compressed 12 bit data in network byte order
/// See https://soco.intel.com/docs/DOC-2665619
/// This unpacking function is for 256b registers
inline __m256i
networkByteUnpack12b256(const uint8_t* inData)
{
/// Align chunks of compressed bytes into lanes to allow for expansion
const __m256i* rawDataIn = reinterpret_cast<const __m256i*>(inData);
const auto k_expPerm = _mm256_set_epi32(6, 5, 4, 3, 3, 2, 1, 0);
const auto inLaneAlign = _mm256_permutexvar_epi32(k_expPerm, *rawDataIn);
/// Byte shuffle to get all bits for each sample into 16b chunks
/// For 12b mantissa all lanes post-permute are aligned and require same shuffle offset
const __m256i k_byteShuffleMask = _mm256_set_epi64x(0x0A0B090A07080607, 0x0405030401020001,
0x0A0B090A07080607, 0x0405030401020001);
const auto inDatContig = _mm256_shuffle_epi8(inLaneAlign, k_byteShuffleMask);
/// Logical shift left to set sign bit
const __m256i k_slBits = _mm256_set_epi64x(0x0004000000040000, 0x0004000000040000,
0x0004000000040000, 0x0004000000040000);
const auto inSetSign = _mm256_sllv_epi16(inDatContig, k_slBits);
/// Mask to zero unwanted bits
const __m256i k_expMask = _mm256_set1_epi16(0xFFF0);
return _mm256_and_si256(inSetSign, k_expMask);
}
}

View File

@@ -0,0 +1,371 @@
/******************************************************************************
*
* 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 XRAN layer common functionality for both lls-CU and RU as well as C-plane and
* U-plane
* @file xran_common.h
* @ingroup group_source_xran
* @author Intel Corporation
**/
#ifndef _XRAN_COMMON_H_
#define _XRAN_COMMON_H_
#ifdef __cplusplus
extern "C" {
#endif
#include <stdio.h>
#include <unistd.h>
#include <sys/param.h>
#include <sys/queue.h>
#include <rte_common.h>
#include <rte_mbuf.h>
#include <rte_timer.h>
#include "xran_fh_o_du.h"
#include "xran_pkt_up.h"
#include "xran_cp_api.h"
#define O_DU 0
#define O_RU 1
#define N_SC_PER_PRB 12
#define MAX_N_FULLBAND_SC 273
#define N_SYM_PER_SLOT 14
#define SUBFRAME_DURATION_US 1000
#define SLOTNUM_PER_SUBFRAME (SUBFRAME_DURATION_US/interval_us)
#define SUBFRAMES_PER_SYSTEMFRAME 10
#define SLOTS_PER_SYSTEMFRAME (SLOTNUM_PER_SUBFRAME*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*14 (max) for short sequence. The payload length is 3356 octets.*/
#define PRACH_PLAYBACK_BUFFER_BYTES (144*14*4L)
#define PRACH_SRS_BUFFER_BYTES (144*14*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_MBUF_LEN 9600 /**< jumbo frame */
#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 XranDiffSymIdx(prevSymIdx, currSymIdx, numTotalSymIdx) ((prevSymIdx > currSymIdx) ? ((currSymIdx + numTotalSymIdx) - prevSymIdx) : (currSymIdx - prevSymIdx))
#define XRAN_MLOG_VAR 0 /**< enable debug variables to mlog */
/* 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;
struct xran_prach_cp_config
{
uint8_t filterIdx;
uint8_t startSymId;
uint16_t startPrbc;
uint8_t numPrbc;
uint8_t numSymbol;
uint16_t timeOffset;
int32_t freqOffset;
uint8_t nrofPrachInSlot;
uint8_t occassionsInPrachSlot;
uint8_t x;
uint8_t y[XRAN_PRACH_CANDIDATE_Y];
uint8_t isPRACHslot[XRAN_PRACH_CANDIDATE_SLOT];
uint8_t eAxC_offset; /**< starting eAxC for PRACH stream */
};
#define XRAN_MAX_POOLS_PER_SECTOR_NR 8 /**< 2x(TX_OUT, RX_IN, PRACH_IN, SRS_IN) with C-plane */
typedef struct sectorHandleInfo
{
/**< Structure that contains the information to describe the
* instance i.e service type, virtual function, package Id etc..*/
uint16_t nIndex;
uint16_t nXranPort;
/* 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_POOLS_PER_SECTOR_NR];
uint32_t bufferPoolElmSz[XRAN_MAX_POOLS_PER_SECTOR_NR];
uint32_t bufferPoolNumElm[XRAN_MAX_POOLS_PER_SECTOR_NR];
}XranSectorHandleInfo, *PXranSectorHandleInfo;
typedef void (*XranSymCallbackFn)(struct rte_timer *tim, void* arg);
struct cb_elem_entry{
XranSymCallbackFn pSymCallback;
void *pSymCallbackTag;
LIST_ENTRY(cb_elem_entry) pointers;
};
/* 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);
/*
* 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
struct xran_buffer_list sBufferList;
} BbuIoBufCtrlStruct;
#define XranIncrementJob(i) ((i >= (XRAN_SYM_JOB_SIZE-1)) ? 0 : (i+1))
#define XRAN_MAX_PKT_BURST_PER_SYM 32
#define XRAN_MAX_PACKET_FRAG 9
#define MBUF_TABLE_SIZE (2 * MAX(XRAN_MAX_PKT_BURST_PER_SYM, XRAN_MAX_PACKET_FRAG))
struct mbuf_table {
uint16_t len;
struct rte_mbuf *m_table[MBUF_TABLE_SIZE];
};
struct xran_device_ctx
{
uint8_t sector_id;
uint8_t xran_port_id;
struct xran_eaxcid_config eAxc_id_cfg;
struct xran_fh_init fh_init;
struct xran_fh_config fh_cfg;
struct xran_prach_cp_config PrachCPConfig;
uint32_t enablePrach;
uint32_t enableCP;
int32_t DynamicSectionEna;
int64_t offset_sec;
int64_t offset_nsec; //offset to GPS time calcuated based on alpha and beta
uint32_t enableSrs;
struct xran_srs_config srs_cfg; /** configuration of SRS */
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];
BbuIoBufCtrlStruct sFHSrsRxBbuIoBufCtrl[XRAN_N_FE_BUF_LEN][XRAN_MAX_SECTOR_NR][XRAN_MAX_ANT_ARRAY_ELM_NR];
/* buffers lists */
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];
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];
xran_transport_callback_fn pCallback[XRAN_MAX_SECTOR_NR];
void *pCallbackTag[XRAN_MAX_SECTOR_NR];
xran_transport_callback_fn pPrachCallback[XRAN_MAX_SECTOR_NR];
void *pPrachCallbackTag[XRAN_MAX_SECTOR_NR];
xran_transport_callback_fn pSrsCallback[XRAN_MAX_SECTOR_NR];
void *pSrsCallbackTag[XRAN_MAX_SECTOR_NR];
LIST_HEAD(sym_cb_elem_list, cb_elem_entry) sym_cb_list_head[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;
xran_fh_tti_callback_fn 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_prach_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 rx_packet_prach_callback_tracker[XRAN_N_FE_BUF_LEN][XRAN_MAX_SECTOR_NR];
int prach_start_symbol[XRAN_MAX_SECTOR_NR];
int prach_last_symbol[XRAN_MAX_SECTOR_NR];
int phy_tti_cb_done;
struct rte_mempool *direct_pool;
struct rte_mempool *indirect_pool;
struct mbuf_table tx_mbufs[RTE_MAX_ETHPORTS];
struct xran_common_counters fh_counters;
phy_encoder_poll_fn bbdev_enc; /**< call back to poll BBDev encoder */
phy_decoder_poll_fn bbdev_dec; /**< call back to poll BBDev decoder */
xran_ethdi_mbuf_send_fn send_cpmbuf2ring; /**< callback to send mbufs of C-Plane packets to the ring */
xran_ethdi_mbuf_send_fn send_upmbuf2ring; /**< callback to send mbufs of U-Plane packets to the ring */
uint32_t pkt_proc_core_id; /**< core used for processing DPDK timer cb */
};
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[13];
int process_mbuf(struct rte_mbuf *pkt);
int process_ring(struct rte_ring *r);
int ring_processing_thread(void *args);
int packets_dump_thread(void *args);
int send_symbol_ex(enum xran_pkt_dir direction,
uint16_t section_id,
struct rte_mbuf *mb,
struct rb_map *data,
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);
int32_t prepare_symbol_ex(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,
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);
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);
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);
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,
uint16_t beam_id, uint8_t cc_id, uint8_t prach_port_id, uint8_t seq_id);
struct xran_eaxcid_config *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);
uint8_t xran_get_conf_num_bfweights(void *pHandle);
uint8_t xran_get_num_cc(void *pHandle);
uint8_t xran_get_num_eAxc(void *pHandle);
uint8_t xran_get_num_eAxcUl(void *pHandle);
uint8_t xran_get_num_ant_elm(void *pHandle);
enum xran_category xran_get_ru_category(void *pHandle);
struct xran_device_ctx *xran_dev_get_ctx(void);
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);
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);
int xran_init_prach(struct xran_fh_config* pConf, struct xran_device_ctx * p_xran_dev_ctx);
void xran_updateSfnSecStart(void);
uint32_t xran_slotid_convert(uint16_t slot_id, uint16_t dir);
struct cb_elem_entry *xran_create_cb(XranSymCallbackFn cb_fn, void *cb_data);
int xran_destroy_cb(struct cb_elem_entry * cb_elm);
uint16_t xran_map_ecpriRtcid_to_vf(int32_t dir, int32_t cc_id, int32_t ru_port_id);
uint16_t xran_map_ecpriPcid_to_vf(int32_t dir, int32_t cc_id, int32_t ru_port_id);
#ifdef __cplusplus
}
#endif
#endif

View File

@@ -0,0 +1,144 @@
/******************************************************************************
*
* 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.
*
*******************************************************************************/
/*!
\file xran_compression.h
\brief External API for compading with the use BFP algorithm.
*/
#ifndef _XRAN_COMPRESSION_H_
#define _XRAN_COMPRESSION_H_
#include <stdint.h>
#ifdef __cplusplus
extern "C" {
#endif
/*!
\struct xranlib_compress_request
\brief Request structure containing pointer to data and its length.
*/
struct xranlib_compress_request {
int16_t *data_in; /*!< Pointer to data to compress. */
int16_t numRBs; /*!< numRBs */
int16_t numDataElements; /*!< number of elements in block process [UP: 24 i.e 12RE*2; CP: 16,32,64,128. i.e AntElm*2] */
int16_t compMethod; /*!< Compression method */
int16_t iqWidth; /*!< Bit size */
int32_t len; /*!< Length of input buffer in bytes */
};
/*!
\struct xranlib_compress_response
\brief Response structure containing pointer to data and its length.
*/
struct xranlib_compress_response {
int8_t *data_out; /*!< Pointer to data after compression. */
int32_t len; /*!< Length of output data. */
};
/*!
\struct xranlib_decompress_request
\brief Request structure containing pointer to data and its length.
*/
struct xranlib_decompress_request {
int8_t *data_in; /*!< Pointer to data to decompress. */
int16_t numRBs; /*!< numRBs */
int16_t numDataElements; /*!< number of elements in block process [UP: 24 i.e 12RE*2; CP: 16,32,64,128. i.e AntElm*2] */
int16_t compMethod; /*!< Compression method */
int16_t iqWidth; /*!< Bit size */
int32_t len; /*!< Length of input data. */
};
/*!
\struct xranlib_decompress_response
\brief Response structure containing pointer to data and its length.
*/
struct xranlib_decompress_response {
int16_t *data_out; /*!< Pointer to data after decompression. */
int32_t len; /*!< Length of output data. */
};
/*!
\brief Report the version number for the xranlib_companding library.
\param [in] version Pointer to a char buffer where the version string should be copied.
\param [in] buffer_size The length of the string buffer, must be at least
xranlib_SDK_VERSION_STRING_MAX_LEN characters.
\return 0 if the version string was populated, otherwise -1.
*/
int16_t
xranlib_companding_version(char *version, int buffer_size);
//! @{
/*!
\brief Compress functions - it converts a 16-bit linear PCM value to 8-bt A-law.
\param [in] request Structure containing the input data and data length.
\param [out] response Structure containing the output data and data length.
\return 0 for success, -1 for error
*/
int32_t
xranlib_compress(const struct xranlib_compress_request *request,
struct xranlib_compress_response *response);
int32_t
xranlib_compress_sse(const struct xranlib_compress_request *request,
struct xranlib_compress_response *response);
int32_t
xranlib_compress_avx2(const struct xranlib_compress_request *request,
struct xranlib_compress_response *response);
int32_t
xranlib_compress_avx512(const struct xranlib_compress_request *request,
struct xranlib_compress_response *response);
int32_t
xranlib_compress_avx512_bfw(const struct xranlib_compress_request *request,
struct xranlib_compress_response *response);
//! @}
//! @{
/*!
\brief Decompress function - it converts an A-law value to 16-bit linear PCM.
\param [in] request Structure containing the input data and data length.
\param [out] response Structure containing the output data and data length.
\return 0 for success, -1 for error.
**/
int32_t
xranlib_decompress(const struct xranlib_decompress_request *request,
struct xranlib_decompress_response *response);
int32_t
xranlib_decompress_sse(const struct xranlib_decompress_request *request,
struct xranlib_decompress_response *response);
int32_t
xranlib_decompress_avx2(const struct xranlib_decompress_request *request,
struct xranlib_decompress_response *response);
int32_t
xranlib_decompress_avx512(const struct xranlib_decompress_request *request,
struct xranlib_decompress_response *response);
int32_t
xranlib_decompress_avx512_bfw(const struct xranlib_decompress_request *request,
struct xranlib_decompress_response *response);
//! @}
#ifdef __cplusplus
}
#endif
#endif /* _XRAN_COMPRESSION_H_ */

View File

@@ -0,0 +1,117 @@
/******************************************************************************
*
* 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.
*
*******************************************************************************/
#pragma once
#include <stdint.h>
#include <immintrin.h>
// This configuration file sets global constants and macros which are
// of general use throughout the project.
// All current IA processors of interest align their cache lines on
// this boundary. If the cache alignment for future processors changes
// then the most restrictive alignment should be set.
constexpr unsigned k_cacheByteAlignment = 64;
// Force the data to which this macro is applied to be aligned on a cache line.
// For example:
//
// CACHE_ALIGNED float data[64];
#define CACHE_ALIGNED alignas(k_cacheByteAlignment)
// Hint to the compiler that the data to which this macro is applied
// can be assumed to be aligned to a cache line. This allows the
// compiler to generate improved code by using aligned reads and
// writes.
#define ASSUME_CACHE_ALIGNED(data)
// __assume_aligned(data, k_cacheByteAlignment);
/// Intel compiler frequently complains about templates not being declared in an external
/// header. Templates are used throughout this project's source files to define local type-specific
/// versions of functions. Defining every one of these in a header is unnecessary, so the warnings
/// about this are turned off globally.
#pragma warning(disable:1418)
#pragma warning(disable:1419)
namespace BlockFloatCompander
{
/// Compute 32 RB at a time
static constexpr int k_numBitsIQ = 16;
static constexpr int k_numBitsIQPair = 2 * k_numBitsIQ;
static constexpr int k_maxNumBlocks = 16;
static constexpr int k_maxNumElements = 128;
static constexpr int k_numSampsExpanded = k_maxNumBlocks * k_maxNumElements;
static constexpr int k_numSampsCompressed = (k_numSampsExpanded * 2) + k_maxNumBlocks;
struct CompressedData
{
/// Compressed data
CACHE_ALIGNED uint8_t dataCompressedDataOut[k_numSampsCompressed];
CACHE_ALIGNED uint8_t *dataCompressed;
/// Size of mantissa including sign bit
int iqWidth;
/// Number of BFP blocks in message
int numBlocks;
/// Number of data elements per compression block (only required for reference function)
int numDataElements;
};
struct ExpandedData
{
/// Expanded data or input data to compressor
CACHE_ALIGNED int16_t dataExpandedIn[k_numSampsExpanded];
CACHE_ALIGNED int16_t *dataExpanded;
/// Size of mantissa including sign bit
int iqWidth;
/// Number of BFP blocks in message
int numBlocks;
/// Number of data elements per compression block (only required for reference function)
int numDataElements;
};
/// Reference compression and expansion functions
void BFPCompressRef(const ExpandedData& dataIn, CompressedData* dataOut);
void BFPExpandRef(const CompressedData& dataIn, ExpandedData* dataOut);
/// User-Plane specific compression and expansion functions
void BFPCompressUserPlaneAvx512(const ExpandedData& dataIn, CompressedData* dataOut);
void BFPExpandUserPlaneAvx512(const CompressedData& dataIn, ExpandedData* dataOut);
/// Control-Plane specific compression and expansion functions for 8 antennas
void BFPCompressCtrlPlane8Avx512(const ExpandedData& dataIn, CompressedData* dataOut);
void BFPExpandCtrlPlane8Avx512(const CompressedData& dataIn, ExpandedData* dataOut);
/// Control-Plane specific compression and expansion functions for 16 antennas
void BFPCompressCtrlPlane16Avx512(const ExpandedData& dataIn, CompressedData* dataOut);
void BFPExpandCtrlPlane16Avx512(const CompressedData& dataIn, ExpandedData* dataOut);
/// Control-Plane specific compression and expansion functions for 32 antennas
void BFPCompressCtrlPlane32Avx512(const ExpandedData& dataIn, CompressedData* dataOut);
void BFPExpandCtrlPlane32Avx512(const CompressedData& dataIn, ExpandedData* dataOut);
/// Control-Plane specific compression and expansion functions for 64 antennas
void BFPCompressCtrlPlane64Avx512(const ExpandedData& dataIn, CompressedData* dataOut);
void BFPExpandCtrlPlane64Avx512(const CompressedData& dataIn, ExpandedData* dataOut);
}

View File

@@ -0,0 +1,408 @@
/******************************************************************************
*
* Copyright (c) 2019 Intel.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
*******************************************************************************/
/**
* @brief This file provides the definitions for Control Plane Messages APIs.
*
* @file xran_cp_api.h
* @ingroup group_lte_source_xran
* @author Intel Corporation
*
**/
#ifndef _XRAN_CP_API_H_
#define _XRAN_CP_API_H_
#ifdef __cplusplus
extern "C" {
#endif
#include "xran_fh_o_du.h"
#include "xran_pkt_cp.h"
#include "xran_transport.h"
#define XRAN_MAX_SECTIONDB_CTX 2
#define XRAN_MAX_NUM_EXTENSIONS XRAN_MAX_PRBS /* Maximum number of extensions in a section [up to 1 ext section per RB]*/
#define XRAN_MAX_NUM_UE 16 /* Maximum number of UEs/Lyaers */
#define XRAN_MAX_NUM_ANT_BF 64 /* Maximum number of beamforming antenna,
* could be defined as XRAN_MAX_ANTENNA_NR */
/* Maximum total number of beamforming weights (5.4.7.1.2) */
#define XRAN_MAX_BFW_N (XRAN_MAX_NUM_ANT_BF*XRAN_MAX_NUM_UE)
#define XRAN_MAX_MODCOMP_ADDPARMS 6 /* max should be even number */
#define XRAN_SECTIONEXT_ALIGN 4 /* alignment size in byte for section extension */
/** Control Plane section types, defined in 5.4 Table 5.1 */
enum xran_cp_sectiontype {
XRAN_CP_SECTIONTYPE_0 = 0, /**< Unused RB or Symbols in DL or UL, not supported */
XRAN_CP_SECTIONTYPE_1 = 1, /**< Most DL/UL Radio Channels */
XRAN_CP_SECTIONTYPE_3 = 3, /**< PRACH and Mixed-numerology Channels */
XRAN_CP_SECTIONTYPE_5 = 5, /**< UE scheduling information, not supported */
XRAN_CP_SECTIONTYPE_6 = 6, /**< Channel Information, not supported */
XRAN_CP_SECTIONTYPE_7 = 7, /**< LAA, not supported */
XRAN_CP_SECTIONTYPE_MAX
};
/** Filter index, defined in 5.4.4.3 */
enum xran_cp_filterindex {
XRAN_FILTERINDEX_STANDARD = 0, /**< UL filter for standard channel */
XRAN_FILTERINDEX_PRACH_012 = 1, /**< UL filter for PRACH preamble format 0, 1, 2 */
XRAN_FILTERINDEX_PRACH_3 = 2, /**< UL filter for PRACH preamble format 3 */
XRAN_FILTERINDEX_PRACH_ABC = 3, /**< UL filter for PRACH preamble format A1~3, B1~4, C0, C2 */
XRAN_FILTERINDEX_NPRACH = 4, /**< UL filter for NPRACH */
XRAN_FILTERINDEX_MAX
};
/** Maximum Slot Index, defined in 5.4.4.6 */
#define XRAN_SLOTID_MAX 16
/** FFT size in frame structure, defined in 5.4.4.13 Table 5.9 */
enum xran_cp_fftsize {
XRAN_FFTSIZE_128 = 7, /* 128 */
XRAN_FFTSIZE_256 = 8, /* 256 */
XRAN_FFTSIZE_512 = 9, /* 512 */
XRAN_FFTSIZE_1024 = 10, /* 1024 */
XRAN_FFTSIZE_2048 = 11, /* 2048 */
XRAN_FFTSIZE_4096 = 12, /* 4096 */
XRAN_FFTSIZE_1536 = 13, /* 1536 */
XRAN_FFTSIZE_MAX
};
/** Sub-carrier spacing, defined in 5.4.4.13 Table 5.10 */
enum xran_cp_subcarrierspacing { /*3GPP u, SCS, Nslot, Slot len */
XRAN_SCS_15KHZ = 0, /* 0, 15kHz, 1, 1ms */
XRAN_SCS_30KHZ = 1, /* 1, 30kHz, 2, 500us */
XRAN_SCS_60KHZ = 2, /* 2, 60kHz, 4, 250us */
XRAN_SCS_120KHZ = 3, /* 3, 120kHz, 8, 125us */
XRAN_SCS_240KHZ = 4, /* 4, 240kHz, 16, 62.5us */
XRAN_SCS_1P25KHZ = 12, /* NA, 1.25kHz, 1, 1ms */
XRAN_SCS_3P75KHZ = 13, /* NA, 3.75kHz, 1, 1ms */
XRAN_SCS_5KHZ = 14, /* NA, 5kHz, 1, 1ms */
XRAN_SCS_7P5KHZ = 15, /* NA, 7.5kHz, 1, 1ms */
XRAN_SCS_MAX
};
/** Resource block indicator, defined in 5.4.5.2 */
enum xran_cp_rbindicator {
XRAN_RBIND_EVERY = 0, /**< every RB used */
XRAN_RBIND_EVERYOTHER = 1, /**< every other RB used */
XRAN_RBIND_MAX
};
/** Symbol number increment command, defined in 5.4.5.3 */
enum xran_cp_symbolnuminc {
XRAN_SYMBOLNUMBER_NOTINC = 0, /**< do not increment the current symbol number */
XRAN_SYMBOLNUMBER_INC = 1, /**< increment the current symbol number and use that */
XRAN_SYMBOLNUMBER_INC_MAX
};
/** Macro to convert the number of PRBs as defined in 5.4.5.6 */
#define XRAN_CONVERT_NUMPRBC(x) ((x) > 255 ? 0 : (x))
#define XRAN_CONVERT_IQWIDTH(x) ((x) > 15 ? 0 : (x))
/** Minimum number of symbols, defined in 5.4.5.7 */
#define XRAN_SYMBOLNUMBER_MIN 1
/** Maximum number of symbols, defined in 5.4.5.7 */
#define XRAN_SYMBOLNUMBER_MAX 14
/* LAA message type 5.4.5.14 Table 5.11, not supported */
#define XRAN_LAAMSGTYPE_LBT_PDSCH_REQ 0
#define XRAN_LAAMSGTYPE_LBT_DRS_REQ 1
#define XRAN_LAAMSGTYPE_LBT_PDSCH_RSP 2
#define XRAN_LAAMSGTYPE_LBT_DRS_RSP 3
#define XRAN_LAAMSGTYPE_LBT_BUFFER_ERROR 4
#define XRAN_LAAMSGTYPE_LBT_CWCONFIG_REQ 5
#define XRAN_LAAMSGTYPE_LBT_CWCONFIG_RSP 6
#define XRAN_LBTMODE_FULL 0
#define XRAN_LBTMODE_PARTIAL25 1
#define XRAN_LBTMODE_PARTIAL34 2
#define XRAN_LBTMODE_FULLSTOP 3
#define XRAN_EF_F_LAST 0
#define XRAN_EF_F_ANOTHER_ONE 1
/** Control Plane section extension commands, defined in 5.4.6 Table 5.13 */
enum xran_cp_sectionextcmd {
XRAN_CP_SECTIONEXTCMD_0 = 0, /**< Reserved, for future use */
XRAN_CP_SECTIONEXTCMD_1 = 1, /**< Beamforming weights */
XRAN_CP_SECTIONEXTCMD_2 = 2, /**< Beamforming attributes */
XRAN_CP_SECTIONEXTCMD_3 = 3, /**< DL Precoding configuration parameters and indications, not supported */
XRAN_CP_SECTIONEXTCMD_4 = 4, /**< Modulation compression parameter */
XRAN_CP_SECTIONEXTCMD_5 = 5, /**< Modulation compression additional scaling parameters */
XRAN_CP_SECTIONEXTCMD_MAX /* 6~127 reserved for future use */
};
/** Macro to convert bfwIqWidth defined in 5.4.7.1.1, Table 5-15 */
#define XRAN_CONVERT_BFWIQWIDTH(x) ((x) > 15 ? 0 : (x))
/** Beamforming Weights Compression Method 5.4.7.1.1, Table 5-16 */
enum xran_cp_bfw_compression_method {
XRAN_BFWCOMPMETHOD_NONE = 0, /**< Uncopressed I/Q value */
XRAN_BFWCOMPMETHOD_BLKFLOAT = 1, /**< I/Q mantissa value */
XRAN_BFWCOMPMETHOD_BLKSCALE = 2, /**< I/Q scaled value */
XRAN_BFWCOMPMETHOD_ULAW = 3, /**< compressed I/Q value */
XRAN_BFWCOMPMETHOD_BEAMSPACE = 4, /**< beamspace I/Q coefficient */
XRAN_BFWCOMPMETHOD_MAX /* reserved for future methods */
};
/** Beamforming Attributes Bitwidth 5.4.7.2.1 */
enum xran_cp_bfa_bitwidth {
XRAN_BFABITWIDTH_NO = 0, /**< the filed is no applicable or the default value shall be used */
XRAN_BFABITWIDTH_2BIT = 1, /**< the filed is 2-bit bitwidth */
XRAN_BFABITWIDTH_3BIT = 2, /**< the filed is 3-bit bitwidth */
XRAN_BFABITWIDTH_4BIT = 3, /**< the filed is 4-bit bitwidth */
XRAN_BFABITWIDTH_5BIT = 4, /**< the filed is 5-bit bitwidth */
XRAN_BFABITWIDTH_6BIT = 5, /**< the filed is 6-bit bitwidth */
XRAN_BFABITWIDTH_7BIT = 6, /**< the filed is 7-bit bitwidth */
XRAN_BFABITWIDTH_8BIT = 7, /**< the filed is 8-bit bitwidth */
};
/** Layer ID for DL transmission in TM1-TM4 5.4.7.3.2 */
#define XRAN_LAYERID_0 0 /**< Layer 0 */
#define XRAN_LAYERID_1 1 /**< Layer 1 */
#define XRAN_LAYERID_2 2 /**< Layer 2 */
#define XRAN_LAYERID_3 3 /**< Layer 3 */
#define XRAN_LAYERID_TXD 0xf /**< TxD */
/** LTE Transmission Scheme for section extension type 3 5.4.7.3.3 */
#define XRAN_TXS_SMUXCDD 0 /**< Spatial Multiplexing (CDD) */
#define XRAN_TXS_SMUXNOCDD 1 /**< Spatial Multiplexing (no CDD) */
#define XRAN_TXS_TXDIV 2 /**< Transmit diversity */
/**
* This structure contains the information to generate the section body of C-Plane message */
struct xran_section_info {
uint8_t type; /* type of this section */
/* section type bit- */
/* 0 1 3 5 6 7 length */
uint8_t startSymId; /* X X X X X X 4bits */
uint8_t numSymbol; /* X X X X 4bits */
uint8_t symInc; /* X X X X X 1bit */
uint16_t id; /* X X X X X 12bits */
uint16_t reMask; /* X X X X 12bits */
uint16_t startPrbc; /* X X X X X 10bits */
uint16_t numPrbc; /* X X X X X 8bits */ /* will be converted to zero if >255 */
uint8_t rb; /* X X X X X 1bit */
uint8_t compMeth; /* X X X 4bits */
uint8_t iqWidth; /* X X X 4bits */
uint8_t ef; /* X X X X 1bit */
int32_t freqOffset; /* X 24bits */
uint16_t beamId; /* X X 15bits */
uint16_t ueId; /* X X 15bits */
uint16_t regFactor; /* X 16bits */
uint16_t pad0;
/** for U-plane */
struct xran_section_desc sec_desc[XRAN_NUM_OF_SYMBOL_PER_SLOT];
};
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;
};
struct xran_sectionext2_info {
uint8_t bfAzPtWidth; /* beamforming zenith beamwidth parameter */
uint8_t bfAzPt;
uint8_t bfZePtWidth; /* beamforming azimuth beamwidth parameter */
uint8_t bfZePt;
uint8_t bfAz3ddWidth; /* beamforming zenith pointing parameter */
uint8_t bfAz3dd;
uint8_t bfZe3ddWidth; /* beamforming azimuth pointing parameter */
uint8_t bfZe3dd;
uint8_t bfAzSI;
uint8_t bfZeSI;
};
struct xran_sectionext3_info {
uint8_t codebookIdx;
uint8_t layerId;
uint8_t numLayers;
uint8_t txScheme;
uint16_t crsReMask;
uint8_t crsShift;
uint8_t crsSymNum;
uint16_t numAntPort; /* number of antenna port - 2 or 4 */
uint16_t beamIdAP1;
uint16_t beamIdAP2;
uint16_t beamIdAP3;
};
struct xran_sectionext4_info {
uint8_t csf;
uint8_t pad0;
uint16_t modCompScaler;
};
struct xran_sectionext5_info {
uint8_t num_sets;
struct {
uint16_t csf;
uint16_t mcScaleReMask;
uint16_t mcScaleOffset;
} mc[XRAN_MAX_MODCOMP_ADDPARMS];
};
struct xran_sectionext_info {
uint16_t type;
uint16_t len;
void *data;
};
/**
* This structure contains the information to generate the section header of C-Plane message */
struct xran_cp_header_params {
// common parameters
uint8_t filterIdx;
uint8_t frameId;
uint8_t subframeId;
uint8_t slotId;
uint8_t startSymId;
/* section type bit- */
/* 0 1 3 5 6 7 length */
uint8_t fftSize; /* X X 4bits */
uint8_t scs; /* X X 4bits */
uint8_t iqWidth; /* X X X 4bits */
uint8_t compMeth; /* X X X 4bits */
uint8_t numUEs; /* X 8bits */
uint16_t timeOffset; /* X X 16bits */
uint16_t cpLength; /* X X 16bits */
};
/** The structure for the generation of section extension */
struct xran_section_ext_gen_info {
uint16_t type; /**< the type of section extension */
uint16_t len; /**< length of extension data */
void *data; /**< pointer to extension data */
};
/**
* This structure to hold the information to generate the sections of C-Plane message */
struct xran_section_gen_info {
struct xran_section_info info; /**< The information for section */
uint32_t exDataSize; /**< The number of Extensions or type 6/7 data */
/** the array to store section extension */
struct xran_section_ext_gen_info exData[XRAN_MAX_NUM_EXTENSIONS];
struct xran_sectionext1_info m_ext1[XRAN_MAX_NUM_EXTENSIONS];
struct xran_sectionext2_info m_ext2[XRAN_MAX_NUM_EXTENSIONS];
struct xran_sectionext3_info m_ext3[XRAN_MAX_NUM_EXTENSIONS];
struct xran_sectionext4_info m_ext4[XRAN_MAX_NUM_EXTENSIONS];
struct xran_sectionext5_info m_ext5[XRAN_MAX_NUM_EXTENSIONS];
};
/**
* This structure to hold the information to generate a C-Plane message */
struct xran_cp_gen_params {
uint8_t dir; /**< UL or DL */
uint8_t sectionType; /**< each section must have same type with this */
uint16_t numSections; /**< the number of sections to generate */
struct xran_cp_header_params hdr;
/**< The information for C-Plane message header */
struct xran_section_gen_info *sections;
/**< Array of the section information */
};
/**
* This structure to hold the information of RB allocation from PHY
* to send data for allocated RBs only. */
struct xran_cp_rbmap_list {
uint16_t grp_id; /**< group id for this entry, reserved for future use */
uint8_t sym_start; /**< Start symbol ID */
uint8_t sym_num; /**< Number of symbols */
uint16_t rb_start; /**< Start RB position */
uint16_t rb_num; /**< Number of RBs */
int16_t iq_buff_offset; /**< Offset within Sym for start of IQs */
int16_t iq_buff_len; /**< length IQs */
uint16_t beam_id; /**< Bean Index */
uint8_t iqWidth; /**< I and Q width in bits */
uint8_t comp_meth; /**< Compression method */
uint8_t pad0;
};
uint16_t xran_get_cplength(int cpLength);
int32_t xran_get_freqoffset(int freqOffset, int scs);
int32_t 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);
int32_t xran_parse_cp_pkt(struct rte_mbuf *mbuf,
struct xran_cp_gen_params *result,
struct xran_recv_packet_info *pkt_info);
int32_t xran_cp_init_sectiondb(void *pHandle);
int32_t xran_cp_free_sectiondb(void *pHandle);
int32_t 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);
int32_t 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);
int xran_cp_reset_section_info(void *pHandle, uint8_t dir, uint8_t cc_id, uint8_t ruport_id, uint8_t ctx_id);
int32_t xran_cp_populate_section_ext_1(int8_t *p_ext1_dst, /**< destination buffer */
uint16_t ext1_dst_len, /**< dest buffer size */
int16_t *p_bfw_iq_src, /**< source buffer of IQs */
uint16_t rbNumber, /**< number RBs to ext1 chain */
uint16_t bfwNumber, /**< number of bf weights in this set of sections */
uint8_t bfwiqWidth, /**< bit size of IQs */
uint8_t bfwCompMeth); /**< compression method */
struct rte_mbuf *xran_attach_cp_ext_buf(int8_t* p_ext_buff_start, int8_t* p_ext_buff, uint16_t ext_buff_len,
struct rte_mbuf_ext_shared_info * p_share_data);
#ifdef __cplusplus
}
#endif
#endif /* _XRAN_CP_API_H_ */

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,84 @@
/******************************************************************************
*
* 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 Header file for function to work with 5G NR frame structure and related
* routines
* @file xran_frame_struct.h
* @ingroup group_source_xran
* @author Intel Corporation
**/
#ifndef _XRAN_FRAME_STRUCT_
#define _XRAN_FRAME_STRUCT_
#ifdef __cplusplus
extern "C" {
#endif
#include "xran_fh_o_du.h"
uint32_t xran_fs_get_tti_interval(uint8_t nMu);
uint32_t xran_fs_get_scs(uint8_t nMu);
//-------------------------------------------------------------------------------------------
/** @ingroup group_nr5g_source_phy_common
*
* @param[in] nNumerology - Numerology determine sub carrier spacing, Value: 0->4 0: 15khz, 1: 30khz, 2: 60khz 3: 120khz, 4: 240khz
* @param[in] nBandwidth - Carrier bandwidth for in MHz. Value: 5->400
* @param[in] nAbsFrePointA - Abs Freq Point A of the Carrier Center Frequency for in KHz Value: 450000->52600000
*
* @return Number of RBs in cell
*
* @description
* Returns number of RBs based on 38.101-1 and 38.101-2 for the cell
*
**/
//-------------------------------------------------------------------------------------------
uint16_t xran_fs_get_num_rbs(uint32_t nNumerology, uint32_t nBandwidth, uint32_t nAbsFrePointA);
//-------------------------------------------------------------------------------------------
/** @ingroup phy_cal_nrarfcn
*
* @param[in] center frequency
*
* @return NR-ARFCN
*
* @description
* This calculates NR-ARFCN value according to center frequency
*
**/
//-------------------------------------------------------------------------------------------
uint32_t xran_fs_cal_nrarfcn(uint32_t nCenterFreq);
int32_t xran_fs_slot_limit(int32_t nSlotIdx);
void xran_fs_clear_slot_type(uint32_t nCcId);
int32_t xran_fs_set_slot_type(uint32_t nCcId, uint32_t nFrameDuplexType, uint32_t nTddPeriod, struct xran_slot_config* psSlotConfig);
int32_t xran_fs_get_slot_type(int32_t nCcId, int32_t nSlotIdx, int32_t nType);
uint32_t xran_fs_slot_limit_init(int32_t tti_interval_us);
uint32_t xran_fs_get_max_slot(void);
uint32_t xran_fs_get_max_slot_SFN(void);
int32_t xran_fs_get_symbol_type(int32_t nCellIdx, int32_t nSlotdx, int32_t nSymbIdx);
#ifdef __cplusplus
}
#endif
#endif /* _XRAN_FRAME_STRUCT_ */

View File

@@ -0,0 +1,119 @@
/******************************************************************************
*
* 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 has the System Debug Trace Logger (Mlog) Task IDs used by XRAN library
* @file mlog_task_id.h
* @ingroup group_lte_source_common
* @author Intel Corporation
**/
#ifndef _XRAN_TASK_ID_H_
#define _XRAN_TASK_ID_H_
#ifdef __cplusplus
extern "C" {
#endif
#define RESOURCE_CORE_0 0
#define RESOURCE_CORE_1 1
#define RESOURCE_CORE_2 2
#define RESOURCE_CORE_3 3
#define RESOURCE_CORE_4 4
#define RESOURCE_CORE_5 5
#define RESOURCE_CORE_6 6
#define RESOURCE_CORE_7 7
#define RESOURCE_CORE_8 8
#define RESOURCE_CORE_9 9
#define RESOURCE_CORE_10 10
#define RESOURCE_CORE_11 11
#define RESOURCE_CORE_12 12
#define RESOURCE_CORE_13 13
#define RESOURCE_CORE_14 14
#define RESOURCE_CORE_15 15
#define RESOURCE_CORE_16 16
#define RESOURCE_IA_CORE 100
//--------------------------------------------------------------------
// XRAN
//--------------------------------------------------------------------
//--------------------------------------------------------------------
// POLLING
//--------------------------------------------------------------------
#define PID_XRAN_BBDEV_DL_POLL 51
#define PID_XRAN_BBDEV_DL_POLL_DISPATCH 52
#define PID_XRAN_BBDEV_UL_POLL 53
#define PID_XRAN_BBDEV_UL_POLL_DISPATCH 54
#define PID_TTI_TIMER 2100
#define PID_TTI_CB 2101
#define PID_SYM_TIMER 2102
#define PID_GNB_PROC_TIMING_TIMEOUT 2103
#define PID_TIME_SYSTIME_POLL 2104
#define PID_TIME_SYSTIME_STOP 2105
#define PID_TIME_ARM_TIMER 2106
#define PID_TIME_ARM_TIMER_DEADLINE 2107
#define PID_RADIO_FREQ_RX_PKT 2400
#define PID_RADIO_RX_STOP 2401
#define PID_RADIO_RX_UL_IQ 2402
#define PID_RADIO_PRACH_PKT 2403
#define PID_RADIO_FE_COMPRESS 2404
#define PID_RADIO_FE_DECOMPRESS 2405
#define PID_RADIO_TX_BYPASS_PROC 2406
#define PID_RADIO_ETH_TX_BURST 2407
#define PID_RADIO_TX_DL_IQ 2408
#define PID_RADIO_RX_VALIDATE 2409
#define PID_RADIO_RX_IRQ_ON 2410
#define PID_RADIO_RX_IRQ_OFF 2411
#define PID_RADIO_RX_EPOLL_WAIT 2412
#define PID_RADIO_TX_LTEMODE_PROC 2413
#define PID_RADIO_RX_LTEMODE_PROC 2414
#define PID_RADIO_TX_PLAY_BACK_IQ 2415
#define PID_PROCESS_TX_SYM 2416
#define PID_CP_DL_CB 2500
#define PID_CP_UL_CB 2501
#define PID_UP_DL_CB 2502
#define PID_SYM_OTA_CB 2503
#define PID_TTI_CB_TO_PHY 2504
#define PID_HALF_SLOT_CB_TO_PHY 2505
#define PID_FULL_SLOT_CB_TO_PHY 2506
#define PID_UP_UL_HALF_DEAD_LINE_CB 2507
#define PID_UP_UL_FULL_DEAD_LINE_CB 2508
#define PID_PROCESS_UP_PKT 2600
#define PID_PROCESS_CP_PKT 2700
#ifdef __cplusplus
}
#endif
#endif /* _XRAN_TASK_ID_H_ */

View File

@@ -0,0 +1,62 @@
/******************************************************************************
*
* 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.
*
*******************************************************************************/
#ifndef _XRAN_MLOG_LNX_H_
#define _XRAN_MLOG_LNX_H_
#ifdef __cplusplus
extern "C"
{
#endif
#ifdef MLOG_ENABLED
#include <mlog_lnx.h>
#else
/* stubs for MLOG functions */
#define MLOG_FALSE ( 0 )
#define MLogOpen(a, b, c, d, e) MLOG_FALSE
#define MLogRestart(a) MLOG_FALSE
#define MLogPrint(a) MLOG_FALSE
#define MLogGetFileLocation() NULL
#define MLogGetFileSize() 0
#define MLogSetMask(a) MLOG_FALSE
#define MLogGetMask()
#define MLogRegisterTick()
#define MLogTick() 0
#define MLogIncrementCounter() 0
#define MLogTask(w,x,y) 0
#define MLogTaskCore(w,x,y,z) 0
#define MLogMark(x,y)
#define MLogDevInfo(x)
#define MLogRegisterFrameSubframe(x,y)
#define MLogAddVariables(x,y,z)
#define MLogGetStats(a, b, c, d, e) MLOG_FALSE
#define MLogGetAvgStats(a, b, c, d) MLOG_FALSE
#define MLogAddTestCase(a, b) MLOG_FALSE
#define MLogAddPowerStats(a, b, c, d, e) MLOG_FALSE
#endif /* MLOG_ENABLED */
#ifdef __cplusplus
}
#endif /* #ifdef __cplusplus */
#endif /* #ifndef _XRAN_MLOG_LNX_H_ */

View File

@@ -0,0 +1,69 @@
/******************************************************************************
*
* 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.
* 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 has the System Debug Trace Logger (Mlog) Task IDs used by PHY
* @file mlog_task_id.h
* @ingroup group_source_xran
* @author Intel Corporation
**/
#ifndef _XRAN_TASK_ID_H_
#define _XRAN_TASK_ID_H_
#ifdef __cplusplus
extern "C" {
#endif
#define RESOURCE_CORE_0 0
#define RESOURCE_CORE_1 1
#define RESOURCE_CORE_2 2
#define RESOURCE_CORE_3 3
#define RESOURCE_CORE_4 4
#define RESOURCE_CORE_5 5
#define RESOURCE_CORE_6 6
#define RESOURCE_CORE_7 7
#define RESOURCE_CORE_8 8
#define RESOURCE_CORE_9 9
#define RESOURCE_CORE_10 10
#define RESOURCE_CORE_11 11
#define RESOURCE_CORE_12 12
#define RESOURCE_CORE_13 13
#define RESOURCE_CORE_14 14
#define RESOURCE_CORE_15 15
#define RESOURCE_CORE_16 16
#define RESOURCE_IA_CORE 100
//--------------------------------------------------------------------
// XRAN APP
//--------------------------------------------------------------------
#define PID_GNB_PROC_TIMING 70
#define PID_GNB_PROC_TIMING_TIMEOUT 71
#define PID_GNB_SYM_CB 72
#define PID_GNB_PRACH_CB 73
#define PID_GNB_SRS_CB 74
#ifdef __cplusplus
}
#endif
#endif /* _XRAN_TASK_ID_H_ */

View File

@@ -0,0 +1,243 @@
/******************************************************************************
*
* 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 Definitions and support functions to process XRAN packet
* @file xran_pkt.h
* @ingroup group_source_xran
* @author Intel Corporation
**/
/* ORAN-WG4.CUS.0-v01.00 O-RAN Fronthaul Working Group
Control, User and Synchronization Plane Specification
*/
/*
* Layer common to data and control packets
*/
#ifndef _XRAN_PKT_H_
#define _XRAN_PKT_H_
#ifdef __cplusplus
extern "C" {
#endif
#include <rte_common.h>
#include <rte_ether.h>
#include <rte_byteorder.h>
/**
*****************************************************************************
* @file xran_pkt.h
*
* @defgroup xran_common_pkt XRAN Packet definitions and functions
* @ingroup xran
*
* @description
* Definitions and support functions to process XRAN packet
*****************************************************************************/
#define ECPRI_MAX_PAYLOAD_SIZE 65535 /**< Max packet size taken in this implementation */
/* XRAN spec: For this encapsulation, either the eCPRI Ethertype or the IEEE 1914.3 Ethertype shall be use */
#define XRAN_ETHER_TYPE 0xAEFE /**< defined by eCPRI Specification V1.1 */
#define XRAN_ECPRI_VER 0x0001 /**< eCPRI protocol revision 3.1.3.1.1 */
#define XRAN_PAYLOAD_VER 0x0001 /**< Payload version 5.4.4.2 */
#define VLAN_ID 0 /**< Default Tag protocol identifier (TPID)*/
#define VLAN_PCP 7 /**< U-Plane and C-Plane only see Table 3 5 : Quality of service classes */
/**
******************************************************************************
* @ingroup xran_common_pkt
*
* @description
* eCPRI message types
* as per eCPRI spec 3.2.4. Message Types
*****************************************************************************/
enum ecpri_msg_type
{
ECPRI_IQ_DATA = 0x00, /**< U-plane: IQ data */
ECPRI_BIT_SEQUENCE = 0x01, /* msg type is not supported */
ECPRI_RT_CONTROL_DATA = 0x02, /**< C-plane: Control */
/* Below msg types are not supported */
ECPRI_GEN_DATA_TRANSFER = 0x03,
ECPRI_REMOTE_MEM_ACCESS = 0x04,
ECPRI_DELAY_MEASUREMENT = 0x05,
ECPRI_REMOTE_RESET = 0x06,
ECPRI_EVENT_INDICATION = 0x07,
ECPRI_MSG_TYPE_MAX
};
/**
******************************************************************************
* @ingroup xran_common_pkt
*
* @description
* see 3.1.3.1.7 ecpriSeqid (message identifier)
*****************************************************************************/
struct ecpri_seq_id
{
uint8_t seq_id:8; /**< Sequence ID */
uint8_t sub_seq_id:7; /**< Subsequence ID */
uint8_t e_bit:1; /**< E bit */
} __rte_packed;
/**
******************************************************************************
* @ingroup xran_common_pkt
*
* @description
* Structure holds common eCPRI header as per
* Table 3 1 : eCPRI Transport Header Field Definitions
*****************************************************************************/
struct xran_ecpri_cmn_hdr
{
uint8_t ecpri_concat:1; /**< 3.1.3.1.3 eCPRI concatenation indicator */
uint8_t ecpri_resv:3; /**< 3.1.3.1.2 eCPRI reserved */
uint8_t ecpri_ver:4; /**< 3.1.3.1.1 eCPRI protocol revision, defined in XRAN_ECPRI_VER */
uint8_t ecpri_mesg_type; /**< 3.1.3.1.4 eCPRI message type, defined in ecpri_msg_type */
uint16_t ecpri_payl_size; /**< 3.1.3.1.5 eCPRI payload size, without common header and any padding bytes */
} __rte_packed;
/**
******************************************************************************
* @ingroup xran_common_pkt
*
* @description
* Structure holds eCPRI transport header as per
* Table 3 1 : eCPRI Transport Header Field Definitions
*****************************************************************************/
struct xran_ecpri_hdr
{
struct xran_ecpri_cmn_hdr cmnhdr;
rte_be16_t ecpri_xtc_id; /**< 3.1.3.1.6 real time control data / IQ data transfer message series identifier */
struct ecpri_seq_id ecpri_seq_id; /**< 3.1.3.1.7 message identifier */
} __rte_packed;
/**
******************************************************************************
* @ingroup xran_common_pkt
*
* @description
* Enum used to set xRAN packet data direction (gNB Tx/Rx 5.4.4.1)
* uplink or downlink
*****************************************************************************/
enum xran_pkt_dir
{
XRAN_DIR_UL = 0, /**< UL direction */
XRAN_DIR_DL = 1, /**< DL direction */
XRAN_DIR_MAX
};
/**
******************************************************************************
* @ingroup xran_common_pkt
*
* @description
* Structure holds components of radio application header
* 5.4.4 Coding of Information Elements - Application Layer, Common
* for U-plane as per 6.3.2 DL/UL Data
*****************************************************************************/
struct radio_app_common_hdr
{
/* Octet 9 */
uint8_t filter_id:4; /**< This parameter defines an index to the channel filter to be
used between IQ data and air interface, both in DL and UL.
For most physical channels filterIndex =0000b is used which
indexes the standard channel filter, e.g. 100MHz channel filter
for 100MHz nominal carrier bandwidth. (see 5.4.4.3 for more) */
uint8_t payl_ver:3; /**< This parameter defines the payload protocol version valid
for the following IEs in the application layer. In this version of
the specification payloadVersion=001b shall be used. */
uint8_t data_direction:1; /**< This parameter indicates the gNB data direction. */
/* Octet 10 */
uint8_t frame_id:8; /**< This parameter is a counter for 10 ms frames (wrapping period 2.56 seconds) */
/* Octet 11 */
/* Octet 12 */
union {
uint16_t value;
struct {
uint16_t symb_id:6; /**< This parameter identifies the first symbol number within slot,
to which the information of this message is applies. */
uint16_t slot_id:6; /**< This parameter is the slot number within a 1ms sub-frame. All slots in
one sub-frame are counted by this parameter, slotId running from 0 to Nslot-1.
In this version of the specification the maximum Nslot=16, All
other values of the 6 bits are reserved for future use. */
uint16_t subframe_id:4; /**< This parameter is a counter for 1 ms sub-frames within 10ms frame. */
};
}sf_slot_sym;
} __rte_packed;
/**
******************************************************************************
* @ingroup xran_common_pkt
*
* @description
* This parameter defines the compression method and IQ bit width for the
* user data in the data section. This field is absent from U-Plane messages
* when the static IQ format and compression method is configured via the M-Plane.
* In this way a single compression method and IQ bit width is provided
* (per UL and DL, per LTE and NR) without adding more overhead to U-Plane messages.
*****************************************************************************/
struct compression_hdr
{
uint8_t ud_comp_meth:4;
/**< udCompMeth| compression method |udIqWidth meaning
---------------+-----------------------------+--------------------------------------------
0000b | no compression |bitwidth of each uncompressed I and Q value
0001b | block floating point |bitwidth of each I and Q mantissa value
0010b | block scaling |bitwidth of each I and Q scaled value
0011b | mu-law |bitwidth of each compressed I and Q value
0100b | modulation compression |bitwidth of each compressed I and Q value
0100b - 1111b | reserved for future methods |depends on the specific compression method
*/
uint8_t ud_iq_width:4; /**< Bit width of each I and each Q
16 for udIqWidth=0, otherwise equals udIqWidth e.g. udIqWidth = 0000b means I and Q are each 16 bits wide;
e.g. udIQWidth = 0001b means I and Q are each 1 bit wide;
e.g. udIqWidth = 1111b means I and Q are each 15 bits wide
*/
} __rte_packed;
/**
******************************************************************************
* @ingroup xran_common_pkt
*
* @description
* Structure holds common xran packet header
* 3.1.1 Ethernet Encapsulation
*****************************************************************************/
struct xran_pkt_comm_hdr
{
struct rte_ether_hdr eth_hdr; /**< Ethernet Header */
struct xran_ecpri_hdr ecpri_hdr; /**< eCPRI Transport Header */
} __rte_packed;
#ifdef __cplusplus
}
#endif
#endif

View File

@@ -0,0 +1,452 @@
/******************************************************************************
*
* Copyright (c) 2019 Intel.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
*******************************************************************************/
/**
* @brief This file provides the definition of Control Plane Messages
* for XRAN Front Haul layer as defined in XRAN-FH.CUS.0-v02.01.
*
* @file xran_pkt_cp.h
* @ingroup group_lte_source_xran
* @author Intel Corporation
*
**/
#ifndef _XRAN_PKT_CP_H_
#define _XRAN_PKT_CP_H_
#ifdef __cplusplus
extern "C" {
#endif
/**********************************************************************
* Common structures for C/U-plane
**********************************************************************/
/**
* @ingroup xran_cp_pkt
*
* @description
* user data compression header defined in 5.4.4.10 / 6.3.3.13
*/
struct xran_radioapp_udComp_header {
uint8_t udCompMeth:4; /**< Compression method, XRAN_COMPMETHOD_xxxx */
uint8_t udIqWidth:4; /**< IQ bit width, 1 ~ 16 */
} __attribute__((__packed__));
/**********************************************************************
* Definition of C-Plane Protocol 5.4
**********************************************************************/
/**
* @ingroup xran_cp_pkt
*
* @description
* Common Radio Application Header for C-Plane
*/
struct xran_cp_radioapp_common_header { /* 6bytes, first 4bytes need the conversion for byte order */
uint32_t startSymbolId:6; /**< 5.4.4.7 start symbol identifier */
uint32_t slotId:6; /**< 5.4.4.6 slot identifier */
uint32_t subframeId:4; /**< 5.4.4.5 subframe identifier */
uint32_t frameId:8; /**< 5.4.4.4 frame identifier */
uint32_t filterIndex:4; /**< 5.4.4.3 filter index, XRAN_FILTERINDEX_xxxx */
uint32_t payloadVer:3; /**< 5.4.4.2 payload version, should be 1 */
uint32_t dataDirection:1; /**< 5.4.4.1 data direction (gNB Tx/Rx) */
uint8_t numOfSections; /**< 5.4.4.8 number of sections */
uint8_t sectionType; /**< 5.4.4.9 section type */
} __attribute__((__packed__));
/**
* @ingroup xran_cp_pkt
*
* @description
* frame structure defined in 5.4.4.13
*/
struct xran_cp_radioapp_frameStructure {
uint8_t uScs:4; /**< sub-carrier spacing, XRAN_SCS_xxx */
uint8_t fftSize:4; /**< FFT size, XRAN_FFTSIZE_xxx */
} __attribute__((__packed__));
/**
* @ingroup xran_cp_pkt
*
* @description
* Section headers definition for C-Plane.
* Section type 6 and 7 are not present since those have different fields.
*/
struct xran_cp_radioapp_section_header { /* 8bytes, need the conversion for byte order */
union {
struct {
uint32_t reserved:16;
uint32_t numSymbol:4; /**< 5.4.5.7 number of symbols */
uint32_t reMask:12; /**< 5.4.5.5 resource element mask */
} s0;
struct {
uint32_t beamId:15; /**< 5.4.5.9 beam identifier */
uint32_t ef:1; /**< 5.4.5.8 extension flag */
uint32_t numSymbol:4; /**< 5.4.5.7 number of symbols */
uint32_t reMask:12; /**< 5.4.5.5 resource element mask */
} s1;
struct {
uint32_t beamId:15; /**< 5.4.5.9 beam identifier */
uint32_t ef:1; /**< 5.4.5.8 extension flag */
uint32_t numSymbol:4; /**< 5.4.5.7 number of symbols */
uint32_t reMask:12; /**< 5.4.5.5 resource element mask */
} s3;
struct {
uint32_t ueId:15; /**< 5.4.5.10 UE identifier */
uint32_t ef:1; /**< 5.4.5.8 extension flag */
uint32_t numSymbol:4; /**< 5.4.5.7 number of symbols */
uint32_t reMask:12; /**< 5.4.5.5 resource element mask */
} s5;
} u;
uint32_t numPrbc:8; /**< 5.4.5.6 number of contiguous PRBs per control section 0000 0000b = all PRBs */
uint32_t startPrbc:10; /**< 5.4.5.4 starting PRB of control section */
uint32_t symInc:1; /**< 5.4.5.3 symbol number increment command XRAN_SYMBOLNUMBER_xxxx */
uint32_t rb:1; /**< 5.4.5.2 resource block indicator, XRAN_RBIND_xxx */
uint32_t sectionId:12; /**< 5.4.5.1 section identifier */
} __attribute__((__packed__));
struct xran_cp_radioapp_section_ext_hdr {
/* 12 bytes, need to convert byte order for two parts respectively
* - 2 and 8 bytes, reserved1 would be OK if it is zero
*/
uint16_t extLen:8; /**< 5.4.6.3 extension length, in 32bits words */
uint16_t extType:7; /**< 5.4.6.1 extension type */
uint16_t ef:1; /**< 5.4.6.2 extension flag */
} __attribute__((__packed__));
/**
* @ingroup xran_cp_pkt
*
* @description
* Beamforming Weights Extension Type(ExtType 1) defined in 5.4.7.1
* The structure is reordered for byte order conversion.
*/
struct xran_cp_radioapp_section_ext1 {
/* variable length, need to be careful to convert byte order
* - does not need to convert first 3 bytes */
uint8_t extType:7; /**< 5.4.6.1 extension type */
uint8_t ef:1; /**< 5.4.6.2 extension flag */
uint8_t extLen; /**< 5.4.6.3 extension length, in 32bits words */
/* bfwCompHdr */
uint8_t bfwCompMeth:4; /**< 5.4.7.1.1 Beamforming weight Compression method */
uint8_t bfwIqWidth:4; /**< 5.4.7.1.1 Beamforming weight IQ bit width */
/*
*
*
* bfwCompParam
* (bfwI, bfwQ)+
* ......
* zero padding for 4-byte alignment
*/
} __attribute__((__packed__));
/**
* @ingroup xran_cp_pkt
*
* @description
* Beamforming Attributes Extension Type(ExtType 2) defined in 5.4.7.2
* The structure is reordered for byte order conversion.
*/
struct xran_cp_radioapp_section_ext2 {
/* variable length, need to be careful to convert byte order
* - first 4 bytes can be converted at once
*/
uint32_t bfZe3ddWidth:3; /**< 5.4.7.2.1 beamforming zenith beamwidth parameter bitwidth, Table 5-21 */
uint32_t bfAz3ddWidth:3; /**< 5.4.7.2.1 beamforming azimuth beamwidth parameter bitwidth, Table 5-20 */
uint32_t bfaCompResv1:2;
uint32_t bfZePtWidth:3; /**< 5.4.7.2.1 beamforming zenith pointing parameter bitwidth, Table 5-19 */
uint32_t bfAzPtWidth:3; /**< 5.4.7.2.1 beamforming azimuth pointing parameter bitwidth, Table 5-18 */
uint32_t bfaCompResv0:2;
uint32_t extLen:8; /**< 5.4.6.3 extension length, in 32bits words */
uint32_t extType:7; /**< 5.4.6.1 extension type */
uint32_t ef:1; /**< 5.4.6.2 extension flag */
/*
* would be better to use bit manipulation directly to add these parameters
*
* bfAzPt: var by bfAzPtWidth
* bfZePt: var by bfZePtWidth
* bfAz3dd: var by bfAz3ddWidth
* bfZe3dd: var by bfZe3ddWidth
* bfAzSI:5 (including zero-padding for unused bits)
* bfZeSI:3
* padding for 4-byte alignment
*
*/
} __attribute__((__packed__));
/**
* @ingroup xran_cp_pkt
*
* @description
* DL Precoding Extension Type(ExtType 3) for first data layer.
* Defined in 5.4.7.3 Table 5-22.
* Only be used for LTE TM2-4 and not for other LTE TMs nor NR.
* The structure is reordered for byte order conversion.
*/
struct xran_cp_radioapp_section_ext3_first {
/* 16 bytes, need to convert byte order for two parts - 8/8 bytes */
uint64_t reserved1:8;
uint64_t crsSymNum:4; /**< 5.4.7.3.6 CRS symbol number indication */
uint64_t reserved0:3;
uint64_t crsShift:1; /**< 5.4.7.3.7 CRS shift used for DL transmission */
uint64_t crsReMask:12; /**< 5.4.7.3.5 CRS resource element mask */
uint64_t txScheme:4; /**< 5.4.7.3.3 transmission scheme */
uint64_t numLayers:4; /**< 5.4.7.3.4 number of layers used for DL transmission */
uint64_t layerId:4; /**< 5.4.7.3.2 Layer ID for DL transmission */
uint64_t codebookIndex:8; /**< 5.4.7.3.1 precoder codebook used for transmission */
uint64_t extLen:8; /**< 5.4.6.3 extension length, in 32bits words */
uint64_t extType:7; /**< 5.4.6.1 extension type */
uint64_t ef:1; /**< 5.4.6.2 extension flag */
uint64_t beamIdAP1:16; /**< 5.4.7.3.8 beam id to be used for antenna port 1 */
uint64_t beamIdAP2:16; /**< 5.4.7.3.9 beam id to be used for antenna port 2 */
uint64_t beamIdAP3:16; /**< 5.4.7.3.10 beam id to be used for antenna port 3 */
uint64_t reserved2:16;
} __attribute__((__packed__));
/**
* @ingroup xran_cp_pkt
*
* @description
* DL Precoding Extension Type(ExtType 3) for non-first data layer.
* Defined in 5.4.7.3 Table 5-23.
* Only be used for LTE TM2-4 and not for other LTE TMs nor NR.
* The structure is reordered for byte order conversion.
*/
struct xran_cp_radioapp_section_ext3_non_first {
/* 4 bytes, need to convert byte order at once */
uint32_t numLayers:4; /**< 5.4.7.3.4 number of layers used for DL transmission */
uint32_t layerId:4; /**< 5.4.7.3.2 Layer ID for DL transmission */
uint32_t codebookIndex:8; /**< 5.4.7.3.1 precoder codebook used for transmission */
uint32_t extLen:8; /**< 5.4.6.3 extension length, in 32bits words */
uint32_t extType:7; /**< 5.4.6.1 extension type */
uint32_t ef:1; /**< 5.4.6.2 extension flag */
} __attribute__((__packed__));
/**
* @ingroup xran_cp_pkt
*
* @description
* Modulation Compression Parameter Extension Type(ExtType 4), 5.4.7.4
* Only applies to section type 1 and 3.
* The structure is reordered for byte order conversion.
*/
struct xran_cp_radioapp_section_ext4 {
/* 4 bytes, need to convert byte order at once */
uint32_t modCompScaler:15; /**< 5.4.7.4.2 modulation compression scaler value */
uint32_t csf:1; /**< 5.4.7.4.1 constellation shift flag */
uint32_t extLen:8; /**< 5.4.6.3 extension length, in 32bits words */
uint32_t extType:7; /**< 5.4.6.1 extension type */
uint32_t ef:1; /**< 5.4.6.2 extension flag */
} __attribute__((__packed__));
/**
* @ingroup xran_cp_pkt
*
* @description
* Modulation Compression Additional Parameter Extension Type(ExtType 5) for one scaler value.
* Defined in 5.4.7.5 Table 5-26 and Table 5-27.
* Only applies to section type 1 3, and 5.
* The structure is reordered for byte order conversion.
*/
struct xran_cp_radioapp_section_ext5 {
uint32_t reserved0:8;
uint32_t mcScaleOffset2:15; /**< 5.4.7.5.3 scaling value for modulation compression */
uint32_t csf2:1; /**< 5.4.7.5.2 constellation shift flag */
uint32_t mcScaleReMask2:12; /**< 5.4.7.5.1 modulation compression power scale RE mask */
uint32_t mcScaleOffset1:15; /**< 5.4.7.5.3 scaling value for modulation compression */
uint32_t csf1:1; /**< 5.4.7.5.2 constellation shift flag */
uint32_t mcScaleReMask1:12; /**< 5.4.7.5.1 modulation compression power scale RE mask */
} __attribute__((__packed__));
/**********************************************************
* Scheduling and Beam-forming Commands 5.4.2
**********************************************************/
/**
* @ingroup xran_cp_pkt
*
* @description
* Section header definition for type 0
*/
struct xran_cp_radioapp_section0_header { // 12bytes (6+2+1+2+1)
struct xran_cp_radioapp_common_header cmnhdr;
uint16_t timeOffset; /**< 5.4.4.12 time offset */
struct xran_cp_radioapp_frameStructure frameStructure;
uint16_t cpLength; /**< 5.4.4.14 cyclic prefix length */
uint8_t reserved;
} __attribute__((__packed__));
/**
* @ingroup xran_cp_pkt
*
* @description
* Section definition for type 0: Unused RB or Symbols in DL or UL (Table 5-2)
* Not supported in this release
*/
struct xran_cp_radioapp_section0 { // 8bytes (4+4)
struct xran_cp_radioapp_section_header hdr;
} __attribute__((__packed__));
/**
* @ingroup xran_cp_pkt
*
* @description
* Section header definition for type 1
*/
struct xran_cp_radioapp_section1_header { // 8bytes (6+1+1)
struct xran_cp_radioapp_common_header cmnhdr;
struct xran_radioapp_udComp_header udComp;
uint8_t reserved;
} __attribute__((__packed__));
/**
* @ingroup xran_cp_pkt
*
* @description
* Section definition for type 1: Most DL/UL Radio Channels (Table 5-3)
*/
struct xran_cp_radioapp_section1 { // 8bytes (4+4)
struct xran_cp_radioapp_section_header hdr;
// section extensions // 5.4.6 & 5.4.7
// .........
} __attribute__((__packed__));
/**
* @ingroup xran_cp_pkt
*
* @description
* Section header definition for type 3
*/
struct xran_cp_radioapp_section3_header { // 12bytes (6+2+1+2+1)
struct xran_cp_radioapp_common_header cmnhdr;
uint16_t timeOffset; /**< 5.4.4.12 time offset */
struct xran_cp_radioapp_frameStructure frameStructure;
uint16_t cpLength; /**< 5.4.4.14 cyclic prefix length */
struct xran_radioapp_udComp_header udComp;
} __attribute__((__packed__));
/**
* @ingroup xran_cp_pkt
*
* @description
* Section definition for type 3: PRACH and Mixed-numerology Channels (Table 5-4)
*/
struct xran_cp_radioapp_section3 { // 12bytes (4+4+4)
struct xran_cp_radioapp_section_header hdr;
uint32_t freqOffset:24; /**< 5.4.5.11 frequency offset */
uint32_t reserved:8;
// section extensions // 5.4.6 & 5.4.7
// .........
} __attribute__((__packed__));
/**
* @ingroup xran_cp_pkt
*
* @description
* Section header definition for type 5
*/
struct xran_cp_radioapp_section5_header { // 8bytes (6+1+1)
struct xran_cp_radioapp_common_header cmnhdr;
struct xran_radioapp_udComp_header udComp;
uint8_t reserved;
} __attribute__((__packed__));
/**
* @ingroup xran_cp_pkt
*
* @description
* Section definition for type 5: UE scheduling information (Table 5-5)
* Not supported in this release
*/
struct xran_cp_radioapp_section5 {
struct xran_cp_radioapp_section_header hdr;
// section extensions // 5.4.6 & 5.4.7
// .........
} __attribute__((__packed__));
/**
* @ingroup xran_cp_pkt
*
* @description
* Section header definition for type 6
*/
struct xran_cp_radioapp_section6_header { // 8bytes (6+1+1)
struct xran_cp_radioapp_common_header cmnhdr;
uint8_t numberOfUEs; /**< 5.4.4.11 number of UEs */
uint8_t reserved;
} __attribute__((__packed__));
/**
* @ingroup xran_cp_pkt
*
* @description
* Section definition for type 6: Channel Information (Table 5-6)
* Not supported in this release
*/
struct xran_cp_radioapp_section6 {
uint32_t regularizationFactor:16;/**< 5.4.5.12 regularization Factor */
uint32_t ueId:15; /**< 5.4.5.10 UE identifier */
uint32_t ef:1; /**< 5.4.5.8 extension flag */
uint8_t startPrbch:2; /**< 5.4.5.4 starting PRB of control section */
uint8_t symInc:1; /**< 5.4.5.3 symbol number increment command XRAN_SYMBOLNUMBER_xxxx */
uint8_t rb:1; /**< 5.4.5.2 resource block indicator, XRAN_RBIND_xxx */
uint8_t reserved:4;
uint8_t startPrbcl:8; /**< 5.4.5.4 starting PRB of control section */
uint8_t numPrbc:8; /**< 5.4.5.6 number of contiguous PRBs per control section */
// ciIQsamples start from here // 5.4.5.13 channel information I and Q values
// .........
//
// section extensions // 5.4.6 & 5.4.7
// .........
} __attribute__((__packed__));
/**
* @ingroup xran_cp_pkt
*
* @description
* Section header definition for type 7: LAA
* Not supported in this release
*/
struct xran_cp_radioapp_section7_header {
struct xran_cp_radioapp_common_header cmnhdr;
uint16_t reserved;
uint8_t laaMsgLen:4; /**< 5.4.5.15 LAA message length */
uint8_t laaMsgType:4; /**< 5.4.5.14 LAA message type */
// Payload start from here // 5.4.5.16 ~ 5.4.5.32
} __attribute__((__packed__));
#ifdef __cplusplus
}
#endif
#endif /* _XRAN_PKT_CP_H_ */

View File

@@ -0,0 +1,179 @@
/******************************************************************************
*
* 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 Definitions and support functions to process XRAN packet
* @file xran_pkt_up.h
* @ingroup group_source_xran
* @author Intel Corporation
**/
/**
*****************************************************************************
* @file xran_pkt_up.h
*
* @defgroup xran_up_pkt U-Plane XRAN Packet definitions and functions
* @ingroup xran
*
* @description
* Structures relevant to U-plane packets only (data now only)
*****************************************************************************/
#ifndef _XRAN_PKT_UP_H_
#define _XRAN_PKT_UP_H_
#ifdef __cplusplus
extern "C" {
#endif
#include "xran_pkt.h"
#define IQ_PAIR_NUM_IN_RB 12
#define MAX_DATA_SECTIONS_NUM 273
#define MAX_IQ_BIT_WIDTH 16
/* currently library supports I and Q sizes of 8 and 16 bits each */
#define IQ_BITS MAX_IQ_BIT_WIDTH
/*
* Structure holding data section header fields
* It is repeated for every section ID in xRAN packet
*/
/**
******************************************************************************
* @ingroup xran_up_pkt
*
* @description
* Structure holding data section header fields
* It is repeated for every section ID in xRAN packet
* 5.4.5 Coding of Information Elements - Application Layer, Sections
* for U-plane as per 6.3.2 DL/UL Data
*****************************************************************************/
struct data_section_hdr {
union {
uint32_t all_bits;
struct {
uint32_t num_prbu:8; /**< 5.4.5.6 number of contiguous PRBs per control section */
uint32_t start_prbu:10; /**< 5.4.5.4 starting PRB of control section */
uint32_t sym_inc:1; /**< 5.4.5.3 symbol number increment command XRAN_SYMBOLNUMBER_xxxx */
uint32_t rb:1; /**< 5.4.5.2 resource block indicator, XRAN_RBIND_xxx */
uint32_t sect_id:12; /**< 5.4.5.1 section identifier */
};
}fields;
#ifdef FCN_ADAPT
uint8_t udCompHdr;
uint8_t reserved;
#endif
} __rte_packed;
/*
******************************************************************************
* @ingroup xran_up_pkt
*
* @description
* Structure holds compression header structure and field reserved for future use.
* reserved goes always with udCompHdr in u-plane pkt
* U-plane as per 6.3.2 DL/UL Data
*****************************************************************************/
struct data_section_compression_hdr
{
struct compression_hdr ud_comp_hdr;
uint8_t rsrvd; /**< This parameter provides 1 byte for future definition,
should be set to all zeros by the sender and ignored by the receiver.
This field is only present when udCompHdr is present, and is absent when
the static IQ format and compression method is configured via the M-Plane */
/* TODO: support for Block Floating Point compression */
/* udCompMeth 0000b = no compression absent*/
};
/*
******************************************************************************
* @ingroup xran_up_pkt
*
* @description
* Structure holds the compression parameters by the compression header.
* may not be present by udCompMeth in 6.3.3.13
*****************************************************************************/
union compression_params {
struct block_fl_point {
uint8_t exponent:4;
uint8_t reserved:4;
} blockFlPoint;
struct block_scaling {
uint8_t sblockScaler;
} blockScaling;
struct u_law {
uint8_t compShift:4;
uint8_t compBitWidth:4;
} uLaw;
} __rte_packed;
/*
******************************************************************************
* @ingroup xran_up_pkt
*
* @description
* Structure holds an IQ sample pair
* U-plane as per 6.3.2 DL/UL Data
* Each bit field size is defined with IQ_BITS macro
* Currently supported I and Q sizes are 8 and 16 bits
*****************************************************************************/
struct rb_map
{
int16_t i_sample:IQ_BITS; /**< This parameter is the In-phase sample value */
int16_t q_sample:IQ_BITS; /**< This parameter is the Quadrature sample value */
} __rte_packed;
/**
******************************************************************************
* @ingroup xran_common_pkt
*
* @description
* Structure holds complete xran u-plane packet header
* 3.1.1 Ethernet Encapsulation
*****************************************************************************/
struct xran_up_pkt_hdr
{
struct xran_ecpri_hdr ecpri_hdr; /**< eCPRI Transport Header */
struct radio_app_common_hdr app_hdr; /**< eCPRI Transport Header */
struct data_section_hdr data_sec_hdr;
} __rte_packed;
/**
******************************************************************************
* @ingroup xran_common_pkt
*
* @description
* Structure holds complete ethernet and xran u-plane packet header
* 3.1.1 Ethernet Encapsulation
*****************************************************************************/
struct eth_xran_up_pkt_hdr
{
struct rte_ether_hdr eth_hdr;
struct xran_up_pkt_hdr xran_hdr;
}__rte_packed;
#ifdef __cplusplus
}
#endif
#endif

View File

@@ -0,0 +1,118 @@
/******************************************************************************
*
* 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 Modules provide debug prints and utility functions
* @file xran_printf.h
* @ingroup group_source_xran
* @author Intel Corporation
**/
#ifndef XRAN_PRINTF_H
#define XRAN_PRINTF_H
#ifdef __cplusplus
extern "C" {
#endif
#include <stdio.h>
#include <stdlib.h>
#define PRINTF_LOG_OK
#define PRINTF_INF_OK
#define PRINTF_ERR_OK
//#define PRINTF_DBG_OK
#ifndef WIN32
#ifdef PRINTF_LOG_OK
#define print_log(fmt, args...) printf("%s:" fmt "\n", __FUNCTION__, ## args)
#else /* PRINTF_LOG_OK */
#define print_log(fmt, args...)
#endif /* PRINTF_LOG_OK */
#else
#define print_log(fmt, ...) printf("%s:" fmt "\n", __FUNCTION__, __VA_ARGS__)
#endif
#ifndef WIN32
#ifdef PRINTF_DBG_OK
#define print_dbg(fmt, args...) printf("%s:[dbg] " fmt "\n", __FUNCTION__, ## args)
#else /* PRINTF_LOG_OK */
#define print_dbg(fmt, args...)
#endif /* PRINTF_LOG_OK */
#else
#define print_dbg(fmt, ...) printf("%s:[dbg] " fmt "\n", __FUNCTION__, __VA_ARGS__)
#endif
#ifndef WIN32
#ifdef PRINTF_ERR_OK
#define print_err(fmt, args...) printf("%s:[err] " fmt "\n", __FUNCTION__, ## args)
#else /* PRINTF_LOG_OK */
#define print_err(fmt, args...)
#endif /* PRINTF_LOG_OK */
#else
#define print_err(fmt, ...) printf("%s:[err] " fmt "\n", __FUNCTION__, __VA_ARGS__)
#endif
#ifndef WIN32
#ifdef PRINTF_INF_OK
#define print_inf printf
#else /* PRINTF_LOG_OK */
#define print_inf
#endif /* PRINTF_LOG_OK */
#else
#define print_inf printf
#endif
#ifdef __cplusplus
}
#endif
#ifndef _IASSERT_
#define _IASSERT_
#ifdef _DEBUG
#define iAssert(p) if(!(p)){fprintf(stderr,\
"Assertion failed: %s, file %s, line %d, val %d\n",\
#p, __FILE__, __LINE__, p);exit(-1);}
#else /* _DEBUG */
#define iAssert(p)
#endif /* _DEBUG */
#ifndef PHY_APP
#ifndef _assert
#define _assert(x)
#endif
#endif
#endif /* _IASSERT_*/
#ifdef CHECK_PARAMS
#define CHECK_NOT_NULL(param, returnValue) \
if (param == NULL) \
{ \
print_err("%s is NULL!\n", #param); \
return returnValue; \
}
#else
#define CHECK_NOT_NULL(param, returnValue)
#endif
#ifdef __cplusplus
}
#endif
#endif // PHY_PRINTF_H

View File

@@ -0,0 +1,48 @@
/******************************************************************************
*
* 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 interface to synchronization related APIs (PTP/1588)
* for XRAN.
*
* @file xran_sync_api.h
* @ingroup group_lte_source_xran
* @author Intel Corporation
*
**/
#ifndef _XRAN_SYNC_API_H_
#define _XRAN_SYNC_API_H_
#ifdef __cplusplus
extern "C" {
#endif
/**
* @brief Function checks if machine is synchronized using PTP for Linux
* software.
*
* @return int Returns 0 if synchronized, otherwise positive.
*/
int xran_is_synchronized(void);
#ifdef __cplusplus
}
#endif
#endif /* _XRAN_SYNC_API_H_ */

View File

@@ -0,0 +1,58 @@
/******************************************************************************
*
* 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 interface to Timing for XRAN.
*
* @file xran_timer.h
* @ingroup group_lte_source_xran
* @author Intel Corporation
*
**/
#ifndef _XRAN_TIMER_H
#define _XRAN_TIMER_H
#ifdef __cplusplus
extern "C" {
#endif
#include <time.h>
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#define MSEC_PER_SEC 1000L
#define XranIncrementSymIdx(sym_idx, numSymPerMs) (((uint32_t)sym_idx >= (((uint32_t)numSymPerMs * MSEC_PER_SEC) - 1)) ? 0 : (uint32_t)sym_idx+1)
#define XranDecrementSymIdx(sym_idx, numSymPerMs) (((uint32_t)sym_idx == 0) ? (((uint32_t)numSymPerMs * MSEC_PER_SEC)) - 1) : (uint32_t)sym_idx-1)
uint64_t xran_tick(void);
unsigned long get_ticks_diff(unsigned long curr_tick, unsigned long last_tick);
long poll_next_tick(long interval_ns, unsigned long *used_tick);
long sleep_next_tick(long interval);
int timing_set_debug_stop(int value, int count);
int timing_get_debug_stop(void);
inline uint64_t timing_get_current_second(void);
int timing_set_numerology(uint8_t value);
#ifdef __cplusplus
}
#endif
#endif

View File

@@ -0,0 +1,78 @@
/******************************************************************************
*
* Copyright (c) 2019 Intel.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
*******************************************************************************/
/**
* @brief This file provides the definitions for Transport layer (eCPRI) API.
*
* @file xran_transport.h
* @ingroup group_lte_source_xran
* @author Intel Corporation
*
**/
#ifndef _XRAN_TRANSPORT_H_
#define _XRAN_TRANSPORT_H_
#ifdef __cplusplus
extern "C" {
#endif
#include <rte_common.h>
#include <rte_mbuf.h>
#include "xran_pkt.h"
struct xran_eaxc_info {
uint8_t cuPortId;
uint8_t bandSectorId;
uint8_t ccId;
uint8_t ruPortId;
};
struct xran_recv_packet_info {
int ecpri_version;
enum ecpri_msg_type msg_type;
int payload_len;
struct xran_eaxc_info eaxc;
int seq_id;
int subseq_id;
int ebit;
};
int xran_get_ecpri_hdr_size(void);
void xran_update_ecpri_payload_size(struct rte_mbuf *mbuf, int size);
uint16_t xran_compose_cid(uint8_t CU_Port_ID, uint8_t BandSector_ID, uint8_t CC_ID, uint8_t Ant_ID);
void xran_decompose_cid(uint16_t cid, struct xran_eaxc_info *result);
int xran_build_ecpri_hdr(struct rte_mbuf *mbuf,
uint8_t CC_ID, uint8_t Ant_ID,
uint8_t seq_id,
struct xran_ecpri_hdr **ecpri_hdr);
int xran_parse_ecpri_hdr(struct rte_mbuf *mbuf,
struct xran_ecpri_hdr **ecpri_hdr,
struct xran_recv_packet_info *pkt_info);
#ifdef __cplusplus
}
#endif
#endif

View File

@@ -0,0 +1,108 @@
/******************************************************************************
*
* Copyright (c) 2019 Intel.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
*******************************************************************************/
/**
* @brief This file provides the definitions for User Plane Messages APIs.
*
* @file xran_up_api.h
* @ingroup group_lte_source_xran
* @author Intel Corporation
*
**/
#ifndef _XRAN_UP_API_H_
#define _XRAN_UP_API_H_
#ifdef __cplusplus
extern "C" {
#endif
#include <rte_common.h>
#include <rte_mbuf.h>
#include "xran_pkt.h"
#include "xran_pkt_up.h"
/*
* structure used for storing packet parameters needed for generating
* a data packet
*/
struct xran_up_pkt_gen_params
{
struct radio_app_common_hdr app_params;
struct data_section_hdr sec_hdr;
struct data_section_compression_hdr compr_hdr_param;
union compression_params compr_param;
};
/*
* structure used for storing packet parameters needed for generating
* a data packet without compression
* Next fields are omitted:
* udCompHdr (not always present)
* reserved (not always present)
* udCompParam (not always present)
*/
struct xran_up_pkt_gen_no_compression_params
{
struct radio_app_common_hdr app_params;
struct data_section_hdr sec_hdr;
};
/**
* @brief Function extracts IQ samples from received mbuf packet.
*
* @param mbuf Packet with received data.
* @param iq_data_start Address of the first IQ sample in mbuf will be returned
* here
* @return int Bytes of IQ samples that have been extracted from mbuf.
*/
int32_t xran_extract_iq_samples(struct rte_mbuf *mbuf,
void **iq_data_start,
uint8_t *CC_ID,
uint8_t *Ant_ID,
uint8_t *frame_id,
uint8_t *subframe_id,
uint8_t *slot_id,
uint8_t *symb_id,
struct ecpri_seq_id *seq_id,
uint16_t *num_prbu,
uint16_t *start_prbu,
uint16_t *sym_inc,
uint16_t *rb,
uint16_t *sect_id,
int8_t expect_comp,
uint8_t *compMeth,
uint8_t *iqWidth);
int xran_prepare_iq_symbol_portion(
struct rte_mbuf *mbuf,
const void *iq_data_start,
const enum xran_input_byte_order iq_buf_byte_order,
const uint32_t iq_data_num_bytes,
struct xran_up_pkt_gen_params *params,
uint8_t CC_ID,
uint8_t Ant_ID,
uint8_t seq_id,
uint32_t do_copy);
#ifdef __cplusplus
}
#endif
#endif /* _XRAN_UP_API_H_ */

View File

@@ -0,0 +1,135 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
<meta http-equiv="X-UA-Compatible" content="IE=9"/>
<meta name="generator" content="Doxygen 1.8.5"/>
<title>OpenAirInterface: Data Structures</title>
<link href="tabs.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="jquery.js"></script>
<script type="text/javascript" src="dynsections.js"></script>
<link href="navtree.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="resize.js"></script>
<script type="text/javascript" src="navtree.js"></script>
<script type="text/javascript">
$(document).ready(initResizable);
$(window).load(resizeHeight);
</script>
<link href="search/search.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="search/search.js"></script>
<script type="text/javascript">
$(document).ready(function() { searchBox.OnSelectItem(0); });
</script>
<link href="doxygen.css" rel="stylesheet" type="text/css" />
</head>
<body>
<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
<div id="titlearea">
<table cellspacing="0" cellpadding="0">
<tbody>
<tr style="height: 56px;">
<td id="projectlogo"><img alt="Logo" src="oai_logo.png"/></td>
<td style="padding-left: 0.5em;">
<div id="projectname">OpenAirInterface
</div>
<div id="projectbrief">Full experimental OpenSource LTE implementation (Rel 8, partial Rel 10)</div>
</td>
</tr>
</tbody>
</table>
</div>
<!-- end header part -->
<!-- Generated by Doxygen 1.8.5 -->
<script type="text/javascript">
var searchBox = new SearchBox("searchBox", "search",false,'Search');
</script>
<div id="navrow1" class="tabs">
<ul class="tablist">
<li><a href="index.html"><span>Main&#160;Page</span></a></li>
<li><a href="modules.html"><span>Modules</span></a></li>
<li class="current"><a href="annotated.html"><span>Data&#160;Structures</span></a></li>
<li>
<div id="MSearchBox" class="MSearchBoxInactive">
<span class="left">
<img id="MSearchSelect" src="search/mag_sel.png"
onmouseover="return searchBox.OnSearchSelectShow()"
onmouseout="return searchBox.OnSearchSelectHide()"
alt=""/>
<input type="text" id="MSearchField" value="Search" accesskey="S"
onfocus="searchBox.OnSearchFieldFocus(true)"
onblur="searchBox.OnSearchFieldFocus(false)"
onkeyup="searchBox.OnSearchFieldChange(event)"/>
</span><span class="right">
<a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
</span>
</div>
</li>
</ul>
</div>
<div id="navrow2" class="tabs2">
<ul class="tablist">
<li class="current"><a href="annotated.html"><span>Data&#160;Structures</span></a></li>
<li><a href="functions.html"><span>Data&#160;Fields</span></a></li>
</ul>
</div>
</div><!-- top -->
<div id="side-nav" class="ui-resizable side-nav-resizable">
<div id="nav-tree">
<div id="nav-tree-contents">
<div id="nav-sync" class="sync"></div>
</div>
</div>
<div id="splitbar" style="-moz-user-select:none;"
class="ui-resizable-handle">
</div>
</div>
<script type="text/javascript">
$(document).ready(function(){initNavTree('annotated.html','');});
</script>
<div id="doc-content">
<!-- window showing the filter options -->
<div id="MSearchSelectWindow"
onmouseover="return searchBox.OnSearchSelectShow()"
onmouseout="return searchBox.OnSearchSelectHide()"
onkeydown="return searchBox.OnSearchSelectKey(event)">
<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Data Structures</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Typedefs</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Enumerations</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Enumerator</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(7)"><span class="SelectionMark">&#160;</span>Groups</a></div>
<!-- iframe showing the search results (closed by default) -->
<div id="MSearchResultsWindow">
<iframe src="javascript:void(0)" frameborder="0"
name="MSearchResults" id="MSearchResults">
</iframe>
</div>
<div class="header">
<div class="headertitle">
<div class="title">Data Structures</div> </div>
</div><!--header-->
<div class="contents">
<div class="textblock">Here are the data structures with brief descriptions:</div><div class="directory">
<table class="directory">
<tr id="row_0_" class="even"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="structbrf__state__t.html" target="_self">brf_state_t</a></td><td class="desc">BladeRF specific data structure </td></tr>
<tr id="row_1_"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="structeth__params__t.html" target="_self">eth_params_t</a></td><td class="desc"></td></tr>
<tr id="row_2_" class="even"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="structif__buffer__t.html" target="_self">if_buffer_t</a></td><td class="desc"></td></tr>
<tr id="row_3_"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="structopenair0__config__t.html" target="_self">openair0_config_t</a></td><td class="desc">RF frontend parameters set by application </td></tr>
<tr id="row_4_" class="even"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="structopenair0__device__t.html" target="_self">openair0_device_t</a></td><td class="desc">Structure holds the parameters to configure USRP devices </td></tr>
<tr id="row_5_"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="structopenair0__rf__map.html" target="_self">openair0_rf_map</a></td><td class="desc">RF mapping </td></tr>
<tr id="row_6_" class="even"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="structopenair0__thread__t.html" target="_self">openair0_thread_t</a></td><td class="desc"></td></tr>
<tr id="row_7_"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="structopenair0__write__package__t.html" target="_self">openair0_write_package_t</a></td><td class="desc"></td></tr>
<tr id="row_8_" class="even"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="structrx__gain__calib__table__t.html" target="_self">rx_gain_calib_table_t</a></td><td class="desc">RF Gain clibration </td></tr>
<tr id="row_9_"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="structsamplesBlockHeader__t.html" target="_self">samplesBlockHeader_t</a></td><td class="desc"></td></tr>
<tr id="row_10_" class="even"><td class="entry"><img src="ftv2lastnode.png" alt="\" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="structusrp__state__t.html" target="_self">usrp_state_t</a></td><td class="desc"></td></tr>
</table>
</div><!-- directory -->
</div><!-- contents -->
</div><!-- doc-content -->
<!-- start footer part -->
<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
<ul>
<li class="footer">Generated on Tue Sep 14 2021 15:56:44 for OpenAirInterface by
<a href="http://www.doxygen.org/index.html">
<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.5 </li>
</ul>
</div>
</body>
</html>

View File

@@ -0,0 +1,14 @@
var annotated =
[
[ "brf_state_t", "structbrf__state__t.html", "structbrf__state__t" ],
[ "eth_params_t", "structeth__params__t.html", "structeth__params__t" ],
[ "if_buffer_t", "structif__buffer__t.html", "structif__buffer__t" ],
[ "openair0_config_t", "structopenair0__config__t.html", "structopenair0__config__t" ],
[ "openair0_device_t", "structopenair0__device__t.html", "structopenair0__device__t" ],
[ "openair0_rf_map", "structopenair0__rf__map.html", "structopenair0__rf__map" ],
[ "openair0_thread_t", "structopenair0__thread__t.html", "structopenair0__thread__t" ],
[ "openair0_write_package_t", "structopenair0__write__package__t.html", "structopenair0__write__package__t" ],
[ "rx_gain_calib_table_t", "structrx__gain__calib__table__t.html", "structrx__gain__calib__table__t" ],
[ "samplesBlockHeader_t", "structsamplesBlockHeader__t.html", "structsamplesBlockHeader__t" ],
[ "usrp_state_t", "structusrp__state__t.html", "structusrp__state__t" ]
];

BIN
targets/DOCS/html/bc_s.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 676 B

BIN
targets/DOCS/html/bdwn.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 147 B

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,217 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
<meta http-equiv="X-UA-Compatible" content="IE=9"/>
<meta name="generator" content="Doxygen 1.8.5"/>
<title>OpenAirInterface: bladerf_lib.h Source File</title>
<link href="tabs.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="jquery.js"></script>
<script type="text/javascript" src="dynsections.js"></script>
<link href="navtree.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="resize.js"></script>
<script type="text/javascript" src="navtree.js"></script>
<script type="text/javascript">
$(document).ready(initResizable);
$(window).load(resizeHeight);
</script>
<link href="search/search.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="search/search.js"></script>
<script type="text/javascript">
$(document).ready(function() { searchBox.OnSelectItem(0); });
</script>
<link href="doxygen.css" rel="stylesheet" type="text/css" />
</head>
<body>
<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
<div id="titlearea">
<table cellspacing="0" cellpadding="0">
<tbody>
<tr style="height: 56px;">
<td id="projectlogo"><img alt="Logo" src="oai_logo.png"/></td>
<td style="padding-left: 0.5em;">
<div id="projectname">OpenAirInterface
</div>
<div id="projectbrief">Full experimental OpenSource LTE implementation (Rel 8, partial Rel 10)</div>
</td>
</tr>
</tbody>
</table>
</div>
<!-- end header part -->
<!-- Generated by Doxygen 1.8.5 -->
<script type="text/javascript">
var searchBox = new SearchBox("searchBox", "search",false,'Search');
</script>
<div id="navrow1" class="tabs">
<ul class="tablist">
<li><a href="index.html"><span>Main&#160;Page</span></a></li>
<li><a href="modules.html"><span>Modules</span></a></li>
<li><a href="annotated.html"><span>Data&#160;Structures</span></a></li>
<li>
<div id="MSearchBox" class="MSearchBoxInactive">
<span class="left">
<img id="MSearchSelect" src="search/mag_sel.png"
onmouseover="return searchBox.OnSearchSelectShow()"
onmouseout="return searchBox.OnSearchSelectHide()"
alt=""/>
<input type="text" id="MSearchField" value="Search" accesskey="S"
onfocus="searchBox.OnSearchFieldFocus(true)"
onblur="searchBox.OnSearchFieldFocus(false)"
onkeyup="searchBox.OnSearchFieldChange(event)"/>
</span><span class="right">
<a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
</span>
</div>
</li>
</ul>
</div>
</div><!-- top -->
<div id="side-nav" class="ui-resizable side-nav-resizable">
<div id="nav-tree">
<div id="nav-tree-contents">
<div id="nav-sync" class="sync"></div>
</div>
</div>
<div id="splitbar" style="-moz-user-select:none;"
class="ui-resizable-handle">
</div>
</div>
<script type="text/javascript">
$(document).ready(function(){initNavTree('bladerf__lib_8h_source.html','');});
</script>
<div id="doc-content">
<!-- window showing the filter options -->
<div id="MSearchSelectWindow"
onmouseover="return searchBox.OnSearchSelectShow()"
onmouseout="return searchBox.OnSearchSelectHide()"
onkeydown="return searchBox.OnSearchSelectKey(event)">
<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Data Structures</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Typedefs</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Enumerations</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Enumerator</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(7)"><span class="SelectionMark">&#160;</span>Groups</a></div>
<!-- iframe showing the search results (closed by default) -->
<div id="MSearchResultsWindow">
<iframe src="javascript:void(0)" frameborder="0"
name="MSearchResults" id="MSearchResults">
</iframe>
</div>
<div class="header">
<div class="headertitle">
<div class="title">bladerf_lib.h</div> </div>
</div><!--header-->
<div class="contents">
<div class="fragment"><div class="line"><a name="l00001"></a><span class="lineno"> 1</span>&#160;<span class="comment">/*</span></div>
<div class="line"><a name="l00002"></a><span class="lineno"> 2</span>&#160;<span class="comment"> * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more</span></div>
<div class="line"><a name="l00003"></a><span class="lineno"> 3</span>&#160;<span class="comment"> * contributor license agreements. See the NOTICE file distributed with</span></div>
<div class="line"><a name="l00004"></a><span class="lineno"> 4</span>&#160;<span class="comment"> * this work for additional information regarding copyright ownership.</span></div>
<div class="line"><a name="l00005"></a><span class="lineno"> 5</span>&#160;<span class="comment"> * The OpenAirInterface Software Alliance licenses this file to You under</span></div>
<div class="line"><a name="l00006"></a><span class="lineno"> 6</span>&#160;<span class="comment"> * the OAI Public License, Version 1.1 (the &quot;License&quot;); you may not use this file</span></div>
<div class="line"><a name="l00007"></a><span class="lineno"> 7</span>&#160;<span class="comment"> * except in compliance with the License.</span></div>
<div class="line"><a name="l00008"></a><span class="lineno"> 8</span>&#160;<span class="comment"> * You may obtain a copy of the License at</span></div>
<div class="line"><a name="l00009"></a><span class="lineno"> 9</span>&#160;<span class="comment"> *</span></div>
<div class="line"><a name="l00010"></a><span class="lineno"> 10</span>&#160;<span class="comment"> * http://www.openairinterface.org/?page_id=698</span></div>
<div class="line"><a name="l00011"></a><span class="lineno"> 11</span>&#160;<span class="comment"> *</span></div>
<div class="line"><a name="l00012"></a><span class="lineno"> 12</span>&#160;<span class="comment"> * Unless required by applicable law or agreed to in writing, software</span></div>
<div class="line"><a name="l00013"></a><span class="lineno"> 13</span>&#160;<span class="comment"> * distributed under the License is distributed on an &quot;AS IS&quot; BASIS,</span></div>
<div class="line"><a name="l00014"></a><span class="lineno"> 14</span>&#160;<span class="comment"> * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.</span></div>
<div class="line"><a name="l00015"></a><span class="lineno"> 15</span>&#160;<span class="comment"> * See the License for the specific language governing permissions and</span></div>
<div class="line"><a name="l00016"></a><span class="lineno"> 16</span>&#160;<span class="comment"> * limitations under the License.</span></div>
<div class="line"><a name="l00017"></a><span class="lineno"> 17</span>&#160;<span class="comment"> *-------------------------------------------------------------------------------</span></div>
<div class="line"><a name="l00018"></a><span class="lineno"> 18</span>&#160;<span class="comment"> * For more information about the OpenAirInterface (OAI) Software Alliance:</span></div>
<div class="line"><a name="l00019"></a><span class="lineno"> 19</span>&#160;<span class="comment"> * contact@openairinterface.org</span></div>
<div class="line"><a name="l00020"></a><span class="lineno"> 20</span>&#160;<span class="comment"> */</span></div>
<div class="line"><a name="l00021"></a><span class="lineno"> 21</span>&#160;</div>
<div class="line"><a name="l00027"></a><span class="lineno"> 27</span>&#160;<span class="preprocessor">#include &lt;libbladeRF.h&gt;</span></div>
<div class="line"><a name="l00028"></a><span class="lineno"> 28</span>&#160;</div>
<div class="line"><a name="l00029"></a><span class="lineno"> 29</span>&#160;<span class="preprocessor">#include &quot;common_lib.h&quot;</span></div>
<div class="line"><a name="l00030"></a><span class="lineno"> 30</span>&#160;<span class="preprocessor">#include &quot;LOG/log.h&quot;</span></div>
<div class="line"><a name="l00031"></a><span class="lineno"> 31</span>&#160;</div>
<div class="line"><a name="l00037"></a><span class="lineno"><a class="line" href="structbrf__state__t.html"> 37</a></span>&#160;<span class="keyword">typedef</span> <span class="keyword">struct </span>{</div>
<div class="line"><a name="l00038"></a><span class="lineno"> 38</span>&#160;</div>
<div class="line"><a name="l00040"></a><span class="lineno"><a class="line" href="structbrf__state__t.html#a836fa27c6f15033e5718092383e7f736"> 40</a></span>&#160; <span class="keyword">struct </span>bladerf *<a class="code" href="structbrf__state__t.html#a836fa27c6f15033e5718092383e7f736">dev</a>;</div>
<div class="line"><a name="l00041"></a><span class="lineno"> 41</span>&#160; </div>
<div class="line"><a name="l00043"></a><span class="lineno"><a class="line" href="structbrf__state__t.html#acc181d520431fef40205e6b3ade6df89"> 43</a></span>&#160; <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> <a class="code" href="structbrf__state__t.html#acc181d520431fef40205e6b3ade6df89">num_buffers</a>;</div>
<div class="line"><a name="l00045"></a><span class="lineno"><a class="line" href="structbrf__state__t.html#a94a4dfe352de99d40662872fd3f18991"> 45</a></span>&#160; <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> <a class="code" href="structbrf__state__t.html#a94a4dfe352de99d40662872fd3f18991">buffer_size</a>;</div>
<div class="line"><a name="l00047"></a><span class="lineno"><a class="line" href="structbrf__state__t.html#a28ab555ba98ee3a5cb9b4f8b4c9ac488"> 47</a></span>&#160; <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> <a class="code" href="structbrf__state__t.html#a28ab555ba98ee3a5cb9b4f8b4c9ac488">num_transfers</a>;</div>
<div class="line"><a name="l00049"></a><span class="lineno"><a class="line" href="structbrf__state__t.html#aa41420f268b9543eed1286038a917624"> 49</a></span>&#160; <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> <a class="code" href="structbrf__state__t.html#aa41420f268b9543eed1286038a917624">rx_timeout_ms</a>;</div>
<div class="line"><a name="l00051"></a><span class="lineno"><a class="line" href="structbrf__state__t.html#a07c0610d6bbc25388105c2265a0fb215"> 51</a></span>&#160; <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> <a class="code" href="structbrf__state__t.html#a07c0610d6bbc25388105c2265a0fb215">tx_timeout_ms</a>;</div>
<div class="line"><a name="l00053"></a><span class="lineno"><a class="line" href="structbrf__state__t.html#a0da54c96ce6b3e370a0af2e6e0b126ac"> 53</a></span>&#160; <span class="keyword">struct </span>bladerf_metadata meta_rx;</div>
<div class="line"><a name="l00055"></a><span class="lineno"><a class="line" href="structbrf__state__t.html#ab6b8b5b8a767ac0f63a3cc237a0ebe57"> 55</a></span>&#160; <span class="keyword">struct </span>bladerf_metadata meta_tx;</div>
<div class="line"><a name="l00057"></a><span class="lineno"><a class="line" href="structbrf__state__t.html#ae520095a0bf54e1f5b5c81394c08fe7a"> 57</a></span>&#160; <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> <a class="code" href="structbrf__state__t.html#ae520095a0bf54e1f5b5c81394c08fe7a">sample_rate</a>;</div>
<div class="line"><a name="l00059"></a><span class="lineno"><a class="line" href="structbrf__state__t.html#ae4fdc71c7a351a8b416b874743b35d9a"> 59</a></span>&#160; <span class="keywordtype">double</span> <a class="code" href="structbrf__state__t.html#ae4fdc71c7a351a8b416b874743b35d9a">tdiff</a>;</div>
<div class="line"><a name="l00061"></a><span class="lineno"><a class="line" href="structbrf__state__t.html#a836d5de48ea914ce97131d2b883b146c"> 61</a></span>&#160; <span class="keywordtype">int</span> <a class="code" href="structbrf__state__t.html#a836d5de48ea914ce97131d2b883b146c">tx_forward_nsamps</a>; <span class="comment">//166 for 20Mhz</span></div>
<div class="line"><a name="l00062"></a><span class="lineno"> 62</span>&#160;</div>
<div class="line"><a name="l00063"></a><span class="lineno"> 63</span>&#160;</div>
<div class="line"><a name="l00064"></a><span class="lineno"> 64</span>&#160; <span class="comment">// --------------------------------</span></div>
<div class="line"><a name="l00065"></a><span class="lineno"> 65</span>&#160; <span class="comment">// Debug and output control</span></div>
<div class="line"><a name="l00066"></a><span class="lineno"> 66</span>&#160; <span class="comment">// --------------------------------</span></div>
<div class="line"><a name="l00068"></a><span class="lineno"><a class="line" href="structbrf__state__t.html#a32d948ff2b5ccb90426414f0d43561cf"> 68</a></span>&#160;<span class="comment"></span> <span class="keywordtype">int</span> <a class="code" href="structbrf__state__t.html#a32d948ff2b5ccb90426414f0d43561cf">num_underflows</a>;</div>
<div class="line"><a name="l00070"></a><span class="lineno"><a class="line" href="structbrf__state__t.html#af446187faddf588c9f48945416d7bfef"> 70</a></span>&#160; <span class="keywordtype">int</span> <a class="code" href="structbrf__state__t.html#af446187faddf588c9f48945416d7bfef">num_overflows</a>;</div>
<div class="line"><a name="l00072"></a><span class="lineno"><a class="line" href="structbrf__state__t.html#aa878f3f5e78e7ca7adf74136f0c645ca"> 72</a></span>&#160; <span class="keywordtype">int</span> <a class="code" href="structbrf__state__t.html#aa878f3f5e78e7ca7adf74136f0c645ca">num_seq_errors</a>;</div>
<div class="line"><a name="l00074"></a><span class="lineno"><a class="line" href="structbrf__state__t.html#a77c4db96b0b2b07e9401f06e97041643"> 74</a></span>&#160; <span class="keywordtype">int</span> <a class="code" href="structbrf__state__t.html#a77c4db96b0b2b07e9401f06e97041643">num_rx_errors</a>;</div>
<div class="line"><a name="l00076"></a><span class="lineno"><a class="line" href="structbrf__state__t.html#ab74d12377c74ff3eb4be0bbd5e4b5a3b"> 76</a></span>&#160; <span class="keywordtype">int</span> <a class="code" href="structbrf__state__t.html#ab74d12377c74ff3eb4be0bbd5e4b5a3b">num_tx_errors</a>;</div>
<div class="line"><a name="l00077"></a><span class="lineno"> 77</span>&#160;</div>
<div class="line"><a name="l00079"></a><span class="lineno"><a class="line" href="structbrf__state__t.html#a107010dc90853b1373164ee9be124f0a"> 79</a></span>&#160; uint64_t <a class="code" href="structbrf__state__t.html#a107010dc90853b1373164ee9be124f0a">tx_current_ts</a>;</div>
<div class="line"><a name="l00081"></a><span class="lineno"><a class="line" href="structbrf__state__t.html#ada8cf98b7ac2d2cb10cee03ab1494eab"> 81</a></span>&#160; uint64_t <a class="code" href="structbrf__state__t.html#ada8cf98b7ac2d2cb10cee03ab1494eab">rx_current_ts</a>;</div>
<div class="line"><a name="l00083"></a><span class="lineno"><a class="line" href="structbrf__state__t.html#a188dc90a84fa838dc0bb15744ab77b89"> 83</a></span>&#160; uint64_t <a class="code" href="structbrf__state__t.html#a188dc90a84fa838dc0bb15744ab77b89">tx_actual_nsamps</a>;</div>
<div class="line"><a name="l00085"></a><span class="lineno"><a class="line" href="structbrf__state__t.html#a33fe94f323f1cc5bab3acafcb2c6ca5a"> 85</a></span>&#160; uint64_t <a class="code" href="structbrf__state__t.html#a33fe94f323f1cc5bab3acafcb2c6ca5a">rx_actual_nsamps</a>;</div>
<div class="line"><a name="l00087"></a><span class="lineno"><a class="line" href="structbrf__state__t.html#a7120d955244caabe03bba64d5060d08a"> 87</a></span>&#160; uint64_t <a class="code" href="structbrf__state__t.html#a7120d955244caabe03bba64d5060d08a">tx_nsamps</a>;</div>
<div class="line"><a name="l00089"></a><span class="lineno"><a class="line" href="structbrf__state__t.html#a6a58927f8f3ccf715950ab65c2b6b277"> 89</a></span>&#160; uint64_t <a class="code" href="structbrf__state__t.html#a6a58927f8f3ccf715950ab65c2b6b277">rx_nsamps</a>;</div>
<div class="line"><a name="l00091"></a><span class="lineno"><a class="line" href="structbrf__state__t.html#a06b59cb19636e64d4eabb714508ba621"> 91</a></span>&#160; uint64_t <a class="code" href="structbrf__state__t.html#a06b59cb19636e64d4eabb714508ba621">tx_count</a>;</div>
<div class="line"><a name="l00093"></a><span class="lineno"><a class="line" href="structbrf__state__t.html#a8ac92c1b2095a4d4def3ecbc0e80b11f"> 93</a></span>&#160; uint64_t <a class="code" href="structbrf__state__t.html#a8ac92c1b2095a4d4def3ecbc0e80b11f">rx_count</a>;</div>
<div class="line"><a name="l00095"></a><span class="lineno"><a class="line" href="structbrf__state__t.html#a872fdca56e9ff4c009821acbe7f47cb9"> 95</a></span>&#160; openair0_timestamp <a class="code" href="structbrf__state__t.html#a872fdca56e9ff4c009821acbe7f47cb9">rx_timestamp</a>;</div>
<div class="line"><a name="l00096"></a><span class="lineno"> 96</span>&#160;</div>
<div class="line"><a name="l00097"></a><span class="lineno"> 97</span>&#160;} <a class="code" href="structbrf__state__t.html">brf_state_t</a>;</div>
<div class="line"><a name="l00098"></a><span class="lineno"> 98</span>&#160;<span class="comment">/*</span></div>
<div class="line"><a name="l00099"></a><span class="lineno"> 99</span>&#160;<span class="comment"> * func prototypes </span></div>
<div class="line"><a name="l00100"></a><span class="lineno"> 100</span>&#160;<span class="comment"> */</span></div>
<div class="line"><a name="l00104"></a><span class="lineno"> 104</span>&#160;<span class="keywordtype">int</span> <a class="code" href="group____BLADERF__PHY__RF__INTERFACE__.html#gabcb074642fa0859cc8f239d459a4b5b9">trx_brf_init</a>(<a class="code" href="structopenair0__device__t.html">openair0_device</a> *device);</div>
<div class="line"><a name="l00105"></a><span class="lineno"> 105</span>&#160;</div>
<div class="line"><a name="l00110"></a><span class="lineno"> 110</span>&#160;openair0_timestamp <a class="code" href="group____BLADERF__PHY__RF__INTERFACE__.html#ga8ba70b63eb37de53dd1ce5a27408037e">trx_get_timestamp</a>(<a class="code" href="structopenair0__device__t.html">openair0_device</a> *device, bladerf_module module);</div>
<div class="line"><a name="l00111"></a><span class="lineno"> 111</span>&#160;</div>
<div class="line"><a name="l00116"></a><span class="lineno"> 116</span>&#160;<span class="keywordtype">int</span> <a class="code" href="group____BLADERF__PHY__RF__INTERFACE__.html#ga437a357941e20ad4b3c1f345f4872fc1">get_brf_log_level</a>(<span class="keywordtype">int</span> log_level);</div>
<div class="line"><a name="l00117"></a><span class="lineno"> 117</span>&#160;</div>
<div class="line"><a name="l00122"></a><span class="lineno"> 122</span>&#160;<span class="keywordtype">int</span> <a class="code" href="group____BLADERF__PHY__RF__INTERFACE__.html#ga7a9bb4437de1bd6839d3c752635c4bcf">brf_error</a>(<span class="keywordtype">int</span> status);</div>
<div class="line"><a name="l00123"></a><span class="lineno"> 123</span>&#160;</div>
<div class="ttc" id="structbrf__state__t_html_aa41420f268b9543eed1286038a917624"><div class="ttname"><a href="structbrf__state__t.html#aa41420f268b9543eed1286038a917624">brf_state_t::rx_timeout_ms</a></div><div class="ttdeci">unsigned int rx_timeout_ms</div><div class="ttdoc">RX timeout. </div><div class="ttdef"><b>Definition:</b> <a href="bladerf__lib_8h_source.html#l00049">bladerf_lib.h:49</a></div></div>
<div class="ttc" id="structbrf__state__t_html_a94a4dfe352de99d40662872fd3f18991"><div class="ttname"><a href="structbrf__state__t.html#a94a4dfe352de99d40662872fd3f18991">brf_state_t::buffer_size</a></div><div class="ttdeci">unsigned int buffer_size</div><div class="ttdoc">Buffer size. </div><div class="ttdef"><b>Definition:</b> <a href="bladerf__lib_8h_source.html#l00045">bladerf_lib.h:45</a></div></div>
<div class="ttc" id="structbrf__state__t_html_ada8cf98b7ac2d2cb10cee03ab1494eab"><div class="ttname"><a href="structbrf__state__t.html#ada8cf98b7ac2d2cb10cee03ab1494eab">brf_state_t::rx_current_ts</a></div><div class="ttdeci">uint64_t rx_current_ts</div><div class="ttdoc">timestamp of current RX </div><div class="ttdef"><b>Definition:</b> <a href="bladerf__lib_8h_source.html#l00081">bladerf_lib.h:81</a></div></div>
<div class="ttc" id="structbrf__state__t_html_a8ac92c1b2095a4d4def3ecbc0e80b11f"><div class="ttname"><a href="structbrf__state__t.html#a8ac92c1b2095a4d4def3ecbc0e80b11f">brf_state_t::rx_count</a></div><div class="ttdeci">uint64_t rx_count</div><div class="ttdoc">number of RX count </div><div class="ttdef"><b>Definition:</b> <a href="bladerf__lib_8h_source.html#l00093">bladerf_lib.h:93</a></div></div>
<div class="ttc" id="structopenair0__device__t_html"><div class="ttname"><a href="structopenair0__device__t.html">openair0_device_t</a></div><div class="ttdoc">structure holds the parameters to configure USRP devices </div><div class="ttdef"><b>Definition:</b> <a href="common__lib_8h_source.html#l00309">common_lib.h:309</a></div></div>
<div class="ttc" id="group____BLADERF__PHY__RF__INTERFACE___html_ga437a357941e20ad4b3c1f345f4872fc1"><div class="ttname"><a href="group____BLADERF__PHY__RF__INTERFACE__.html#ga437a357941e20ad4b3c1f345f4872fc1">get_brf_log_level</a></div><div class="ttdeci">int get_brf_log_level(int log_level)</div><div class="ttdoc">Get BladeRF log level. </div><div class="ttdef"><b>Definition:</b> <a href="bladerf__lib_8c_source.html#l01220">bladerf_lib.c:1220</a></div></div>
<div class="ttc" id="structbrf__state__t_html_a33fe94f323f1cc5bab3acafcb2c6ca5a"><div class="ttname"><a href="structbrf__state__t.html#a33fe94f323f1cc5bab3acafcb2c6ca5a">brf_state_t::rx_actual_nsamps</a></div><div class="ttdeci">uint64_t rx_actual_nsamps</div><div class="ttdoc">number of actual samples received </div><div class="ttdef"><b>Definition:</b> <a href="bladerf__lib_8h_source.html#l00085">bladerf_lib.h:85</a></div></div>
<div class="ttc" id="structbrf__state__t_html_a6a58927f8f3ccf715950ab65c2b6b277"><div class="ttname"><a href="structbrf__state__t.html#a6a58927f8f3ccf715950ab65c2b6b277">brf_state_t::rx_nsamps</a></div><div class="ttdeci">uint64_t rx_nsamps</div><div class="ttdoc">number of RX samples </div><div class="ttdef"><b>Definition:</b> <a href="bladerf__lib_8h_source.html#l00089">bladerf_lib.h:89</a></div></div>
<div class="ttc" id="structbrf__state__t_html_ae520095a0bf54e1f5b5c81394c08fe7a"><div class="ttname"><a href="structbrf__state__t.html#ae520095a0bf54e1f5b5c81394c08fe7a">brf_state_t::sample_rate</a></div><div class="ttdeci">unsigned int sample_rate</div><div class="ttdoc">Sample rate. </div><div class="ttdef"><b>Definition:</b> <a href="bladerf__lib_8h_source.html#l00057">bladerf_lib.h:57</a></div></div>
<div class="ttc" id="structbrf__state__t_html_aa878f3f5e78e7ca7adf74136f0c645ca"><div class="ttname"><a href="structbrf__state__t.html#aa878f3f5e78e7ca7adf74136f0c645ca">brf_state_t::num_seq_errors</a></div><div class="ttdeci">int num_seq_errors</div><div class="ttdoc">number of sequential errors </div><div class="ttdef"><b>Definition:</b> <a href="bladerf__lib_8h_source.html#l00072">bladerf_lib.h:72</a></div></div>
<div class="ttc" id="structbrf__state__t_html_a872fdca56e9ff4c009821acbe7f47cb9"><div class="ttname"><a href="structbrf__state__t.html#a872fdca56e9ff4c009821acbe7f47cb9">brf_state_t::rx_timestamp</a></div><div class="ttdeci">openair0_timestamp rx_timestamp</div><div class="ttdoc">timestamp of RX packet </div><div class="ttdef"><b>Definition:</b> <a href="bladerf__lib_8h_source.html#l00095">bladerf_lib.h:95</a></div></div>
<div class="ttc" id="structbrf__state__t_html_a107010dc90853b1373164ee9be124f0a"><div class="ttname"><a href="structbrf__state__t.html#a107010dc90853b1373164ee9be124f0a">brf_state_t::tx_current_ts</a></div><div class="ttdeci">uint64_t tx_current_ts</div><div class="ttdoc">timestamp of current TX </div><div class="ttdef"><b>Definition:</b> <a href="bladerf__lib_8h_source.html#l00079">bladerf_lib.h:79</a></div></div>
<div class="ttc" id="structbrf__state__t_html_acc181d520431fef40205e6b3ade6df89"><div class="ttname"><a href="structbrf__state__t.html#acc181d520431fef40205e6b3ade6df89">brf_state_t::num_buffers</a></div><div class="ttdeci">unsigned int num_buffers</div><div class="ttdoc">Number of buffers. </div><div class="ttdef"><b>Definition:</b> <a href="bladerf__lib_8h_source.html#l00043">bladerf_lib.h:43</a></div></div>
<div class="ttc" id="structbrf__state__t_html_a32d948ff2b5ccb90426414f0d43561cf"><div class="ttname"><a href="structbrf__state__t.html#a32d948ff2b5ccb90426414f0d43561cf">brf_state_t::num_underflows</a></div><div class="ttdeci">int num_underflows</div><div class="ttdoc">Number of underflows. </div><div class="ttdef"><b>Definition:</b> <a href="bladerf__lib_8h_source.html#l00068">bladerf_lib.h:68</a></div></div>
<div class="ttc" id="structbrf__state__t_html_a28ab555ba98ee3a5cb9b4f8b4c9ac488"><div class="ttname"><a href="structbrf__state__t.html#a28ab555ba98ee3a5cb9b4f8b4c9ac488">brf_state_t::num_transfers</a></div><div class="ttdeci">unsigned int num_transfers</div><div class="ttdoc">Number of transfers. </div><div class="ttdef"><b>Definition:</b> <a href="bladerf__lib_8h_source.html#l00047">bladerf_lib.h:47</a></div></div>
<div class="ttc" id="structbrf__state__t_html"><div class="ttname"><a href="structbrf__state__t.html">brf_state_t</a></div><div class="ttdoc">BladeRF specific data structure. </div><div class="ttdef"><b>Definition:</b> <a href="bladerf__lib_8h_source.html#l00037">bladerf_lib.h:37</a></div></div>
<div class="ttc" id="structbrf__state__t_html_a836fa27c6f15033e5718092383e7f736"><div class="ttname"><a href="structbrf__state__t.html#a836fa27c6f15033e5718092383e7f736">brf_state_t::dev</a></div><div class="ttdeci">struct bladerf * dev</div><div class="ttdoc">opaque BladeRF device struct. An empty (&amp;quot;&amp;quot;) or NULL device identifier will result in the first encoun...</div><div class="ttdef"><b>Definition:</b> <a href="bladerf__lib_8h_source.html#l00040">bladerf_lib.h:40</a></div></div>
<div class="ttc" id="structbrf__state__t_html_a06b59cb19636e64d4eabb714508ba621"><div class="ttname"><a href="structbrf__state__t.html#a06b59cb19636e64d4eabb714508ba621">brf_state_t::tx_count</a></div><div class="ttdeci">uint64_t tx_count</div><div class="ttdoc">number of TX count </div><div class="ttdef"><b>Definition:</b> <a href="bladerf__lib_8h_source.html#l00091">bladerf_lib.h:91</a></div></div>
<div class="ttc" id="structbrf__state__t_html_a77c4db96b0b2b07e9401f06e97041643"><div class="ttname"><a href="structbrf__state__t.html#a77c4db96b0b2b07e9401f06e97041643">brf_state_t::num_rx_errors</a></div><div class="ttdeci">int num_rx_errors</div><div class="ttdoc">number of RX errors </div><div class="ttdef"><b>Definition:</b> <a href="bladerf__lib_8h_source.html#l00074">bladerf_lib.h:74</a></div></div>
<div class="ttc" id="structbrf__state__t_html_a836d5de48ea914ce97131d2b883b146c"><div class="ttname"><a href="structbrf__state__t.html#a836d5de48ea914ce97131d2b883b146c">brf_state_t::tx_forward_nsamps</a></div><div class="ttdeci">int tx_forward_nsamps</div><div class="ttdoc">TX number of forward samples use brf_time_offset to get this value. </div><div class="ttdef"><b>Definition:</b> <a href="bladerf__lib_8h_source.html#l00061">bladerf_lib.h:61</a></div></div>
<div class="ttc" id="structbrf__state__t_html_ae4fdc71c7a351a8b416b874743b35d9a"><div class="ttname"><a href="structbrf__state__t.html#ae4fdc71c7a351a8b416b874743b35d9a">brf_state_t::tdiff</a></div><div class="ttdeci">double tdiff</div><div class="ttdoc">time offset between transmiter timestamp and receiver timestamp; </div><div class="ttdef"><b>Definition:</b> <a href="bladerf__lib_8h_source.html#l00059">bladerf_lib.h:59</a></div></div>
<div class="ttc" id="structbrf__state__t_html_ab74d12377c74ff3eb4be0bbd5e4b5a3b"><div class="ttname"><a href="structbrf__state__t.html#ab74d12377c74ff3eb4be0bbd5e4b5a3b">brf_state_t::num_tx_errors</a></div><div class="ttdeci">int num_tx_errors</div><div class="ttdoc">Number of TX errors. </div><div class="ttdef"><b>Definition:</b> <a href="bladerf__lib_8h_source.html#l00076">bladerf_lib.h:76</a></div></div>
<div class="ttc" id="structbrf__state__t_html_af446187faddf588c9f48945416d7bfef"><div class="ttname"><a href="structbrf__state__t.html#af446187faddf588c9f48945416d7bfef">brf_state_t::num_overflows</a></div><div class="ttdeci">int num_overflows</div><div class="ttdoc">Number of overflows. </div><div class="ttdef"><b>Definition:</b> <a href="bladerf__lib_8h_source.html#l00070">bladerf_lib.h:70</a></div></div>
<div class="ttc" id="group____BLADERF__PHY__RF__INTERFACE___html_ga8ba70b63eb37de53dd1ce5a27408037e"><div class="ttname"><a href="group____BLADERF__PHY__RF__INTERFACE__.html#ga8ba70b63eb37de53dd1ce5a27408037e">trx_get_timestamp</a></div><div class="ttdeci">openair0_timestamp trx_get_timestamp(openair0_device *device, bladerf_module module)</div><div class="ttdoc">get current timestamp </div><div class="ttdef"><b>Definition:</b> <a href="bladerf__lib_8c_source.html#l00067">bladerf_lib.c:67</a></div></div>
<div class="ttc" id="group____BLADERF__PHY__RF__INTERFACE___html_ga7a9bb4437de1bd6839d3c752635c4bcf"><div class="ttname"><a href="group____BLADERF__PHY__RF__INTERFACE__.html#ga7a9bb4437de1bd6839d3c752635c4bcf">brf_error</a></div><div class="ttdeci">int brf_error(int status)</div><div class="ttdoc">bladeRF error report </div><div class="ttdef"><b>Definition:</b> <a href="bladerf__lib_8c_source.html#l01176">bladerf_lib.c:1176</a></div></div>
<div class="ttc" id="structbrf__state__t_html_a7120d955244caabe03bba64d5060d08a"><div class="ttname"><a href="structbrf__state__t.html#a7120d955244caabe03bba64d5060d08a">brf_state_t::tx_nsamps</a></div><div class="ttdeci">uint64_t tx_nsamps</div><div class="ttdoc">number of TX samples </div><div class="ttdef"><b>Definition:</b> <a href="bladerf__lib_8h_source.html#l00087">bladerf_lib.h:87</a></div></div>
<div class="ttc" id="structbrf__state__t_html_a07c0610d6bbc25388105c2265a0fb215"><div class="ttname"><a href="structbrf__state__t.html#a07c0610d6bbc25388105c2265a0fb215">brf_state_t::tx_timeout_ms</a></div><div class="ttdeci">unsigned int tx_timeout_ms</div><div class="ttdoc">TX timeout. </div><div class="ttdef"><b>Definition:</b> <a href="bladerf__lib_8h_source.html#l00051">bladerf_lib.h:51</a></div></div>
<div class="ttc" id="group____BLADERF__PHY__RF__INTERFACE___html_gabcb074642fa0859cc8f239d459a4b5b9"><div class="ttname"><a href="group____BLADERF__PHY__RF__INTERFACE__.html#gabcb074642fa0859cc8f239d459a4b5b9">trx_brf_init</a></div><div class="ttdeci">int trx_brf_init(openair0_device *device)</div><div class="ttdoc">BladeRF Init function (not used at the moment) </div><div class="ttdef"><b>Definition:</b> <a href="bladerf__lib_8c_source.html#l00056">bladerf_lib.c:56</a></div></div>
<div class="ttc" id="structbrf__state__t_html_a188dc90a84fa838dc0bb15744ab77b89"><div class="ttname"><a href="structbrf__state__t.html#a188dc90a84fa838dc0bb15744ab77b89">brf_state_t::tx_actual_nsamps</a></div><div class="ttdeci">uint64_t tx_actual_nsamps</div><div class="ttdoc">number of actual samples transmitted </div><div class="ttdef"><b>Definition:</b> <a href="bladerf__lib_8h_source.html#l00083">bladerf_lib.h:83</a></div></div>
</div><!-- fragment --></div><!-- contents -->
</div><!-- doc-content -->
<!-- start footer part -->
<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
<ul>
<li class="navelem"><a class="el" href="dir_25f5d8fa9a1ce4c0c4650678e0447e10.html">ARCH</a></li><li class="navelem"><a class="el" href="dir_53a38f7b91caabdebd78263cee115e31.html">BLADERF</a></li><li class="navelem"><a class="el" href="dir_31fe4f88196f07d47da88c3165f9b109.html">USERSPACE</a></li><li class="navelem"><a class="el" href="dir_7dbc7ac1b70501c722463688f01c3543.html">LIB</a></li><li class="navelem"><b>bladerf_lib.h</b></li>
<li class="footer">Generated on Tue Sep 14 2021 15:56:44 for OpenAirInterface by
<a href="http://www.doxygen.org/index.html">
<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.5 </li>
</ul>
</div>
</body>
</html>

View File

@@ -0,0 +1,139 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
<meta http-equiv="X-UA-Compatible" content="IE=9"/>
<meta name="generator" content="Doxygen 1.8.5"/>
<title>OpenAirInterface: Data Structure Index</title>
<link href="tabs.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="jquery.js"></script>
<script type="text/javascript" src="dynsections.js"></script>
<link href="navtree.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="resize.js"></script>
<script type="text/javascript" src="navtree.js"></script>
<script type="text/javascript">
$(document).ready(initResizable);
$(window).load(resizeHeight);
</script>
<link href="search/search.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="search/search.js"></script>
<script type="text/javascript">
$(document).ready(function() { searchBox.OnSelectItem(0); });
</script>
<link href="doxygen.css" rel="stylesheet" type="text/css" />
</head>
<body>
<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
<div id="titlearea">
<table cellspacing="0" cellpadding="0">
<tbody>
<tr style="height: 56px;">
<td id="projectlogo"><img alt="Logo" src="oai_logo.png"/></td>
<td style="padding-left: 0.5em;">
<div id="projectname">OpenAirInterface
</div>
<div id="projectbrief">Full experimental OpenSource LTE implementation (Rel 8, partial Rel 10)</div>
</td>
</tr>
</tbody>
</table>
</div>
<!-- end header part -->
<!-- Generated by Doxygen 1.8.5 -->
<script type="text/javascript">
var searchBox = new SearchBox("searchBox", "search",false,'Search');
</script>
<div id="navrow1" class="tabs">
<ul class="tablist">
<li><a href="index.html"><span>Main&#160;Page</span></a></li>
<li><a href="modules.html"><span>Modules</span></a></li>
<li class="current"><a href="annotated.html"><span>Data&#160;Structures</span></a></li>
<li>
<div id="MSearchBox" class="MSearchBoxInactive">
<span class="left">
<img id="MSearchSelect" src="search/mag_sel.png"
onmouseover="return searchBox.OnSearchSelectShow()"
onmouseout="return searchBox.OnSearchSelectHide()"
alt=""/>
<input type="text" id="MSearchField" value="Search" accesskey="S"
onfocus="searchBox.OnSearchFieldFocus(true)"
onblur="searchBox.OnSearchFieldFocus(false)"
onkeyup="searchBox.OnSearchFieldChange(event)"/>
</span><span class="right">
<a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
</span>
</div>
</li>
</ul>
</div>
<div id="navrow2" class="tabs2">
<ul class="tablist">
<li><a href="annotated.html"><span>Data&#160;Structures</span></a></li>
<li><a href="functions.html"><span>Data&#160;Fields</span></a></li>
</ul>
</div>
</div><!-- top -->
<div id="side-nav" class="ui-resizable side-nav-resizable">
<div id="nav-tree">
<div id="nav-tree-contents">
<div id="nav-sync" class="sync"></div>
</div>
</div>
<div id="splitbar" style="-moz-user-select:none;"
class="ui-resizable-handle">
</div>
</div>
<script type="text/javascript">
$(document).ready(function(){initNavTree('classes.html','');});
</script>
<div id="doc-content">
<!-- window showing the filter options -->
<div id="MSearchSelectWindow"
onmouseover="return searchBox.OnSearchSelectShow()"
onmouseout="return searchBox.OnSearchSelectHide()"
onkeydown="return searchBox.OnSearchSelectKey(event)">
<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Data Structures</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Typedefs</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Enumerations</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Enumerator</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(7)"><span class="SelectionMark">&#160;</span>Groups</a></div>
<!-- iframe showing the search results (closed by default) -->
<div id="MSearchResultsWindow">
<iframe src="javascript:void(0)" frameborder="0"
name="MSearchResults" id="MSearchResults">
</iframe>
</div>
<div class="header">
<div class="headertitle">
<div class="title">Data Structure Index</div> </div>
</div><!--header-->
<div class="contents">
<div class="qindex"><a class="qindex" href="#letter_B">B</a>&#160;|&#160;<a class="qindex" href="#letter_E">E</a>&#160;|&#160;<a class="qindex" href="#letter_I">I</a>&#160;|&#160;<a class="qindex" href="#letter_O">O</a>&#160;|&#160;<a class="qindex" href="#letter_R">R</a>&#160;|&#160;<a class="qindex" href="#letter_S">S</a>&#160;|&#160;<a class="qindex" href="#letter_U">U</a></div>
<table style="margin: 10px; white-space: nowrap;" align="center" width="95%" border="0" cellspacing="0" cellpadding="0">
<tr><td rowspan="2" valign="bottom"><a name="letter_B"></a><table border="0" cellspacing="0" cellpadding="0"><tr><td><div class="ah">&#160;&#160;B&#160;&#160;</div></td></tr></table>
</td><td rowspan="2" valign="bottom"><a name="letter_I"></a><table border="0" cellspacing="0" cellpadding="0"><tr><td><div class="ah">&#160;&#160;I&#160;&#160;</div></td></tr></table>
</td><td valign="top"><a class="el" href="structopenair0__device__t.html">openair0_device_t</a>&#160;&#160;&#160;</td><td rowspan="2" valign="bottom"><a name="letter_S"></a><table border="0" cellspacing="0" cellpadding="0"><tr><td><div class="ah">&#160;&#160;S&#160;&#160;</div></td></tr></table>
</td><td></td></tr>
<tr><td valign="top"><a class="el" href="structopenair0__rf__map.html">openair0_rf_map</a>&#160;&#160;&#160;</td><td></td></tr>
<tr><td valign="top"><a class="el" href="structbrf__state__t.html">brf_state_t</a>&#160;&#160;&#160;</td><td valign="top"><a class="el" href="structif__buffer__t.html">if_buffer_t</a>&#160;&#160;&#160;</td><td valign="top"><a class="el" href="structopenair0__thread__t.html">openair0_thread_t</a>&#160;&#160;&#160;</td><td valign="top"><a class="el" href="structsamplesBlockHeader__t.html">samplesBlockHeader_t</a>&#160;&#160;&#160;</td><td></td></tr>
<tr><td rowspan="2" valign="bottom"><a name="letter_E"></a><table border="0" cellspacing="0" cellpadding="0"><tr><td><div class="ah">&#160;&#160;E&#160;&#160;</div></td></tr></table>
</td><td rowspan="2" valign="bottom"><a name="letter_O"></a><table border="0" cellspacing="0" cellpadding="0"><tr><td><div class="ah">&#160;&#160;O&#160;&#160;</div></td></tr></table>
</td><td valign="top"><a class="el" href="structopenair0__write__package__t.html">openair0_write_package_t</a>&#160;&#160;&#160;</td><td rowspan="2" valign="bottom"><a name="letter_U"></a><table border="0" cellspacing="0" cellpadding="0"><tr><td><div class="ah">&#160;&#160;U&#160;&#160;</div></td></tr></table>
</td><td></td></tr>
<tr><td rowspan="2" valign="bottom"><a name="letter_R"></a><table border="0" cellspacing="0" cellpadding="0"><tr><td><div class="ah">&#160;&#160;R&#160;&#160;</div></td></tr></table>
</td><td></td></tr>
<tr><td valign="top"><a class="el" href="structeth__params__t.html">eth_params_t</a>&#160;&#160;&#160;</td><td valign="top"><a class="el" href="structopenair0__config__t.html">openair0_config_t</a>&#160;&#160;&#160;</td><td valign="top"><a class="el" href="structusrp__state__t.html">usrp_state_t</a>&#160;&#160;&#160;</td><td></td></tr>
<tr><td></td><td></td><td valign="top"><a class="el" href="structrx__gain__calib__table__t.html">rx_gain_calib_table_t</a>&#160;&#160;&#160;</td><td></td><td></td></tr>
<tr><td></td><td></td><td></td><td></td><td></td></tr>
</table>
<div class="qindex"><a class="qindex" href="#letter_B">B</a>&#160;|&#160;<a class="qindex" href="#letter_E">E</a>&#160;|&#160;<a class="qindex" href="#letter_I">I</a>&#160;|&#160;<a class="qindex" href="#letter_O">O</a>&#160;|&#160;<a class="qindex" href="#letter_R">R</a>&#160;|&#160;<a class="qindex" href="#letter_S">S</a>&#160;|&#160;<a class="qindex" href="#letter_U">U</a></div>
</div><!-- contents -->
</div><!-- doc-content -->
<!-- start footer part -->
<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
<ul>
<li class="footer">Generated on Tue Sep 14 2021 15:56:44 for OpenAirInterface by
<a href="http://www.doxygen.org/index.html">
<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.5 </li>
</ul>
</div>
</body>
</html>

Binary file not shown.

After

Width:  |  Height:  |  Size: 132 B

View File

@@ -0,0 +1,603 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
<meta http-equiv="X-UA-Compatible" content="IE=9"/>
<meta name="generator" content="Doxygen 1.8.5"/>
<title>OpenAirInterface: common_lib.h Source File</title>
<link href="tabs.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="jquery.js"></script>
<script type="text/javascript" src="dynsections.js"></script>
<link href="navtree.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="resize.js"></script>
<script type="text/javascript" src="navtree.js"></script>
<script type="text/javascript">
$(document).ready(initResizable);
$(window).load(resizeHeight);
</script>
<link href="search/search.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="search/search.js"></script>
<script type="text/javascript">
$(document).ready(function() { searchBox.OnSelectItem(0); });
</script>
<link href="doxygen.css" rel="stylesheet" type="text/css" />
</head>
<body>
<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
<div id="titlearea">
<table cellspacing="0" cellpadding="0">
<tbody>
<tr style="height: 56px;">
<td id="projectlogo"><img alt="Logo" src="oai_logo.png"/></td>
<td style="padding-left: 0.5em;">
<div id="projectname">OpenAirInterface
</div>
<div id="projectbrief">Full experimental OpenSource LTE implementation (Rel 8, partial Rel 10)</div>
</td>
</tr>
</tbody>
</table>
</div>
<!-- end header part -->
<!-- Generated by Doxygen 1.8.5 -->
<script type="text/javascript">
var searchBox = new SearchBox("searchBox", "search",false,'Search');
</script>
<div id="navrow1" class="tabs">
<ul class="tablist">
<li><a href="index.html"><span>Main&#160;Page</span></a></li>
<li><a href="modules.html"><span>Modules</span></a></li>
<li><a href="annotated.html"><span>Data&#160;Structures</span></a></li>
<li>
<div id="MSearchBox" class="MSearchBoxInactive">
<span class="left">
<img id="MSearchSelect" src="search/mag_sel.png"
onmouseover="return searchBox.OnSearchSelectShow()"
onmouseout="return searchBox.OnSearchSelectHide()"
alt=""/>
<input type="text" id="MSearchField" value="Search" accesskey="S"
onfocus="searchBox.OnSearchFieldFocus(true)"
onblur="searchBox.OnSearchFieldFocus(false)"
onkeyup="searchBox.OnSearchFieldChange(event)"/>
</span><span class="right">
<a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
</span>
</div>
</li>
</ul>
</div>
</div><!-- top -->
<div id="side-nav" class="ui-resizable side-nav-resizable">
<div id="nav-tree">
<div id="nav-tree-contents">
<div id="nav-sync" class="sync"></div>
</div>
</div>
<div id="splitbar" style="-moz-user-select:none;"
class="ui-resizable-handle">
</div>
</div>
<script type="text/javascript">
$(document).ready(function(){initNavTree('common__lib_8h_source.html','');});
</script>
<div id="doc-content">
<!-- window showing the filter options -->
<div id="MSearchSelectWindow"
onmouseover="return searchBox.OnSearchSelectShow()"
onmouseout="return searchBox.OnSearchSelectHide()"
onkeydown="return searchBox.OnSearchSelectKey(event)">
<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Data Structures</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Typedefs</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Enumerations</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Enumerator</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(7)"><span class="SelectionMark">&#160;</span>Groups</a></div>
<!-- iframe showing the search results (closed by default) -->
<div id="MSearchResultsWindow">
<iframe src="javascript:void(0)" frameborder="0"
name="MSearchResults" id="MSearchResults">
</iframe>
</div>
<div class="header">
<div class="headertitle">
<div class="title">common_lib.h</div> </div>
</div><!--header-->
<div class="contents">
<div class="fragment"><div class="line"><a name="l00001"></a><span class="lineno"> 1</span>&#160;<span class="comment">/*</span></div>
<div class="line"><a name="l00002"></a><span class="lineno"> 2</span>&#160;<span class="comment"> * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more</span></div>
<div class="line"><a name="l00003"></a><span class="lineno"> 3</span>&#160;<span class="comment"> * contributor license agreements. See the NOTICE file distributed with</span></div>
<div class="line"><a name="l00004"></a><span class="lineno"> 4</span>&#160;<span class="comment"> * this work for additional information regarding copyright ownership.</span></div>
<div class="line"><a name="l00005"></a><span class="lineno"> 5</span>&#160;<span class="comment"> * The OpenAirInterface Software Alliance licenses this file to You under</span></div>
<div class="line"><a name="l00006"></a><span class="lineno"> 6</span>&#160;<span class="comment"> * the OAI Public License, Version 1.1 (the &quot;License&quot;); you may not use this file</span></div>
<div class="line"><a name="l00007"></a><span class="lineno"> 7</span>&#160;<span class="comment"> * except in compliance with the License.</span></div>
<div class="line"><a name="l00008"></a><span class="lineno"> 8</span>&#160;<span class="comment"> * You may obtain a copy of the License at</span></div>
<div class="line"><a name="l00009"></a><span class="lineno"> 9</span>&#160;<span class="comment"> *</span></div>
<div class="line"><a name="l00010"></a><span class="lineno"> 10</span>&#160;<span class="comment"> * http://www.openairinterface.org/?page_id=698</span></div>
<div class="line"><a name="l00011"></a><span class="lineno"> 11</span>&#160;<span class="comment"> *</span></div>
<div class="line"><a name="l00012"></a><span class="lineno"> 12</span>&#160;<span class="comment"> * Unless required by applicable law or agreed to in writing, software</span></div>
<div class="line"><a name="l00013"></a><span class="lineno"> 13</span>&#160;<span class="comment"> * distributed under the License is distributed on an &quot;AS IS&quot; BASIS,</span></div>
<div class="line"><a name="l00014"></a><span class="lineno"> 14</span>&#160;<span class="comment"> * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.</span></div>
<div class="line"><a name="l00015"></a><span class="lineno"> 15</span>&#160;<span class="comment"> * See the License for the specific language governing permissions and</span></div>
<div class="line"><a name="l00016"></a><span class="lineno"> 16</span>&#160;<span class="comment"> * limitations under the License.</span></div>
<div class="line"><a name="l00017"></a><span class="lineno"> 17</span>&#160;<span class="comment"> *-------------------------------------------------------------------------------</span></div>
<div class="line"><a name="l00018"></a><span class="lineno"> 18</span>&#160;<span class="comment"> * For more information about the OpenAirInterface (OAI) Software Alliance:</span></div>
<div class="line"><a name="l00019"></a><span class="lineno"> 19</span>&#160;<span class="comment"> * contact@openairinterface.org</span></div>
<div class="line"><a name="l00020"></a><span class="lineno"> 20</span>&#160;<span class="comment"> */</span></div>
<div class="line"><a name="l00021"></a><span class="lineno"> 21</span>&#160;</div>
<div class="line"><a name="l00033"></a><span class="lineno"> 33</span>&#160;<span class="preprocessor">#ifndef COMMON_LIB_H</span></div>
<div class="line"><a name="l00034"></a><span class="lineno"> 34</span>&#160;<span class="preprocessor"></span><span class="preprocessor">#define COMMON_LIB_H</span></div>
<div class="line"><a name="l00035"></a><span class="lineno"> 35</span>&#160;<span class="preprocessor"></span><span class="preprocessor">#include &lt;stdint.h&gt;</span></div>
<div class="line"><a name="l00036"></a><span class="lineno"> 36</span>&#160;<span class="preprocessor">#include &lt;stdio.h&gt;</span></div>
<div class="line"><a name="l00037"></a><span class="lineno"> 37</span>&#160;<span class="preprocessor">#include &lt;sys/types.h&gt;</span></div>
<div class="line"><a name="l00038"></a><span class="lineno"> 38</span>&#160;<span class="preprocessor">#include &lt;openair1/PHY/TOOLS/tools_defs.h&gt;</span></div>
<div class="line"><a name="l00039"></a><span class="lineno"> 39</span>&#160;<span class="preprocessor">#include &quot;record_player.h&quot;</span></div>
<div class="line"><a name="l00040"></a><span class="lineno"> 40</span>&#160;</div>
<div class="line"><a name="l00041"></a><span class="lineno"> 41</span>&#160;<span class="comment">/* default name of shared library implementing the radio front end */</span></div>
<div class="line"><a name="l00042"></a><span class="lineno"> 42</span>&#160;<span class="preprocessor">#define OAI_RF_LIBNAME &quot;oai_device&quot;</span></div>
<div class="line"><a name="l00043"></a><span class="lineno"> 43</span>&#160;<span class="preprocessor"></span><span class="comment">/* name of shared library implementing the transport */</span></div>
<div class="line"><a name="l00044"></a><span class="lineno"> 44</span>&#160;<span class="preprocessor">#define OAI_TP_LIBNAME &quot;oai_transpro&quot;</span></div>
<div class="line"><a name="l00045"></a><span class="lineno"> 45</span>&#160;<span class="preprocessor"></span><span class="comment">/* name of shared library implementing a third-party transport */</span></div>
<div class="line"><a name="l00046"></a><span class="lineno"> 46</span>&#160;<span class="preprocessor">#define OAI_THIRDPARTY_TP_LIBNAME &quot;thirdparty_transpro&quot;</span></div>
<div class="line"><a name="l00047"></a><span class="lineno"> 47</span>&#160;<span class="preprocessor"></span><span class="comment">/* name of shared library implementing the rf simulator */</span></div>
<div class="line"><a name="l00048"></a><span class="lineno"> 48</span>&#160;<span class="preprocessor">#define OAI_RFSIM_LIBNAME &quot;rfsimulator&quot;</span></div>
<div class="line"><a name="l00049"></a><span class="lineno"> 49</span>&#160;<span class="preprocessor"></span><span class="comment">/* name of shared library implementing the basic simulator */</span></div>
<div class="line"><a name="l00050"></a><span class="lineno"> 50</span>&#160;<span class="preprocessor">#define OAI_BASICSIM_LIBNAME &quot;tcp_bridge_oai&quot;</span></div>
<div class="line"><a name="l00051"></a><span class="lineno"> 51</span>&#160;<span class="preprocessor"></span><span class="comment">/* name of shared library implementing the iq player */</span></div>
<div class="line"><a name="l00052"></a><span class="lineno"> 52</span>&#160;<span class="preprocessor">#define OAI_IQPLAYER_LIBNAME &quot;oai_iqplayer&quot;</span></div>
<div class="line"><a name="l00053"></a><span class="lineno"> 53</span>&#160;<span class="preprocessor"></span></div>
<div class="line"><a name="l00054"></a><span class="lineno"> 54</span>&#160;<span class="comment">/* flags for BBU to determine whether the attached radio head is local or remote */</span></div>
<div class="line"><a name="l00055"></a><span class="lineno"> 55</span>&#160;<span class="preprocessor">#define RAU_LOCAL_RADIO_HEAD 0</span></div>
<div class="line"><a name="l00056"></a><span class="lineno"> 56</span>&#160;<span class="preprocessor"></span><span class="preprocessor">#define RAU_REMOTE_RADIO_HEAD 1</span></div>
<div class="line"><a name="l00057"></a><span class="lineno"> 57</span>&#160;<span class="preprocessor"></span><span class="preprocessor">#define RAU_REMOTE_THIRDPARTY_RADIO_HEAD 2</span></div>
<div class="line"><a name="l00058"></a><span class="lineno"> 58</span>&#160;<span class="preprocessor"></span><span class="preprocessor">#define MAX_WRITE_THREAD_PACKAGE 10</span></div>
<div class="line"><a name="l00059"></a><span class="lineno"> 59</span>&#160;<span class="preprocessor"></span><span class="preprocessor">#define MAX_WRITE_THREAD_BUFFER_SIZE 8</span></div>
<div class="line"><a name="l00060"></a><span class="lineno"> 60</span>&#160;<span class="preprocessor"></span><span class="preprocessor">#ifndef MAX_CARDS</span></div>
<div class="line"><a name="l00061"></a><span class="lineno"> 61</span>&#160;<span class="preprocessor"></span><span class="preprocessor"> #define MAX_CARDS 8</span></div>
<div class="line"><a name="l00062"></a><span class="lineno"> 62</span>&#160;<span class="preprocessor"></span><span class="preprocessor">#endif</span></div>
<div class="line"><a name="l00063"></a><span class="lineno"> 63</span>&#160;<span class="preprocessor"></span></div>
<div class="line"><a name="l00064"></a><span class="lineno"> 64</span>&#160;<span class="keyword">typedef</span> int64_t openair0_timestamp;</div>
<div class="line"><a name="l00065"></a><span class="lineno"> 65</span>&#160;<span class="keyword">typedef</span> <span class="keyword">volatile</span> int64_t openair0_vtimestamp;</div>
<div class="line"><a name="l00066"></a><span class="lineno"> 66</span>&#160;</div>
<div class="line"><a name="l00067"></a><span class="lineno"> 67</span>&#160;</div>
<div class="line"><a name="l00069"></a><span class="lineno"> 69</span>&#160;<span class="keyword">typedef</span> <span class="keyword">struct </span><a class="code" href="structopenair0__device__t.html">openair0_device_t</a> <a class="code" href="structopenair0__device__t.html">openair0_device</a>;</div>
<div class="line"><a name="l00070"></a><span class="lineno"> 70</span>&#160;</div>
<div class="line"><a name="l00071"></a><span class="lineno"> 71</span>&#160;<span class="comment">//#define USRP_GAIN_OFFSET (56.0) // 86 calibrated for USRP B210 @ 2.6 GHz to get equivalent RS EPRE in OAI to SMBV100 output</span></div>
<div class="line"><a name="l00072"></a><span class="lineno"> 72</span>&#160;</div>
<div class="line"><a name="l00073"></a><span class="lineno"> 73</span>&#160;<span class="keyword">typedef</span> <span class="keyword">enum</span> {</div>
<div class="line"><a name="l00074"></a><span class="lineno"> 74</span>&#160; max_gain=0,med_gain,byp_gain</div>
<div class="line"><a name="l00075"></a><span class="lineno"> 75</span>&#160;} rx_gain_t;</div>
<div class="line"><a name="l00076"></a><span class="lineno"> 76</span>&#160;</div>
<div class="line"><a name="l00077"></a><span class="lineno"> 77</span>&#160;<span class="keyword">typedef</span> <span class="keyword">enum</span> {</div>
<div class="line"><a name="l00078"></a><span class="lineno"> 78</span>&#160; duplex_mode_TDD=1,duplex_mode_FDD=0</div>
<div class="line"><a name="l00079"></a><span class="lineno"> 79</span>&#160;} duplex_mode_t;</div>
<div class="line"><a name="l00080"></a><span class="lineno"> 80</span>&#160;</div>
<div class="line"><a name="l00081"></a><span class="lineno"> 81</span>&#160;</div>
<div class="line"><a name="l00087"></a><span class="lineno"><a class="line" href="group____GENERIC__PHY__RF__INTERFACE__.html#gaaa5808d4b389abd0ffaa5a6bf8979b95"> 87</a></span>&#160;<span class="keyword">typedef</span> <span class="keyword">enum</span> {</div>
<div class="line"><a name="l00088"></a><span class="lineno"><a class="line" href="group____GENERIC__PHY__RF__INTERFACE__.html#ggaaa5808d4b389abd0ffaa5a6bf8979b95a5679adeb284555f47da34938e83238bc"> 88</a></span>&#160; <a class="code" href="group____GENERIC__PHY__RF__INTERFACE__.html#ggaaa5808d4b389abd0ffaa5a6bf8979b95a5679adeb284555f47da34938e83238bc">MIN_RF_DEV_TYPE</a> = 0,</div>
<div class="line"><a name="l00090"></a><span class="lineno"><a class="line" href="group____GENERIC__PHY__RF__INTERFACE__.html#ggaaa5808d4b389abd0ffaa5a6bf8979b95a81f2c35e30895729c96f88e44269c61c"> 90</a></span>&#160; <a class="code" href="group____GENERIC__PHY__RF__INTERFACE__.html#ggaaa5808d4b389abd0ffaa5a6bf8979b95a81f2c35e30895729c96f88e44269c61c">EXMIMO_DEV</a>,</div>
<div class="line"><a name="l00092"></a><span class="lineno"><a class="line" href="group____GENERIC__PHY__RF__INTERFACE__.html#ggaaa5808d4b389abd0ffaa5a6bf8979b95aba5e4e19cdc634e2cdd0a45c2cbfb64d"> 92</a></span>&#160; <a class="code" href="group____GENERIC__PHY__RF__INTERFACE__.html#ggaaa5808d4b389abd0ffaa5a6bf8979b95aba5e4e19cdc634e2cdd0a45c2cbfb64d">USRP_B200_DEV</a>,</div>
<div class="line"><a name="l00094"></a><span class="lineno"><a class="line" href="group____GENERIC__PHY__RF__INTERFACE__.html#ggaaa5808d4b389abd0ffaa5a6bf8979b95a9fcafa0a8b21be18eb3da34f21eca235"> 94</a></span>&#160; <a class="code" href="group____GENERIC__PHY__RF__INTERFACE__.html#ggaaa5808d4b389abd0ffaa5a6bf8979b95a9fcafa0a8b21be18eb3da34f21eca235">USRP_X300_DEV</a>,</div>
<div class="line"><a name="l00096"></a><span class="lineno"><a class="line" href="group____GENERIC__PHY__RF__INTERFACE__.html#ggaaa5808d4b389abd0ffaa5a6bf8979b95a6f20ecc6f7a6fc885b2c4c33428a360f"> 96</a></span>&#160; <a class="code" href="group____GENERIC__PHY__RF__INTERFACE__.html#ggaaa5808d4b389abd0ffaa5a6bf8979b95a6f20ecc6f7a6fc885b2c4c33428a360f">USRP_N300_DEV</a>,</div>
<div class="line"><a name="l00098"></a><span class="lineno"><a class="line" href="group____GENERIC__PHY__RF__INTERFACE__.html#ggaaa5808d4b389abd0ffaa5a6bf8979b95a426d2c2d06777d36f61a596180ba2bdb"> 98</a></span>&#160; <a class="code" href="group____GENERIC__PHY__RF__INTERFACE__.html#ggaaa5808d4b389abd0ffaa5a6bf8979b95a426d2c2d06777d36f61a596180ba2bdb">BLADERF_DEV</a>,</div>
<div class="line"><a name="l00100"></a><span class="lineno"><a class="line" href="group____GENERIC__PHY__RF__INTERFACE__.html#ggaaa5808d4b389abd0ffaa5a6bf8979b95ab0ccbf44555ba24374a291bc6bcc2169"> 100</a></span>&#160; <a class="code" href="group____GENERIC__PHY__RF__INTERFACE__.html#ggaaa5808d4b389abd0ffaa5a6bf8979b95ab0ccbf44555ba24374a291bc6bcc2169">LMSSDR_DEV</a>,</div>
<div class="line"><a name="l00102"></a><span class="lineno"><a class="line" href="group____GENERIC__PHY__RF__INTERFACE__.html#ggaaa5808d4b389abd0ffaa5a6bf8979b95a49c770758ffd580c1407ed4837d1b8de"> 102</a></span>&#160; <a class="code" href="group____GENERIC__PHY__RF__INTERFACE__.html#ggaaa5808d4b389abd0ffaa5a6bf8979b95a49c770758ffd580c1407ed4837d1b8de">IRIS_DEV</a>,</div>
<div class="line"><a name="l00104"></a><span class="lineno"><a class="line" href="group____GENERIC__PHY__RF__INTERFACE__.html#ggaaa5808d4b389abd0ffaa5a6bf8979b95a148c86a8baed1ac3ce6cb488670b5b4f"> 104</a></span>&#160; <a class="code" href="group____GENERIC__PHY__RF__INTERFACE__.html#ggaaa5808d4b389abd0ffaa5a6bf8979b95a148c86a8baed1ac3ce6cb488670b5b4f">NONE_DEV</a>,</div>
<div class="line"><a name="l00106"></a><span class="lineno"><a class="line" href="group____GENERIC__PHY__RF__INTERFACE__.html#ggaaa5808d4b389abd0ffaa5a6bf8979b95af767170db03446f909b630f652852a67"> 106</a></span>&#160; <a class="code" href="group____GENERIC__PHY__RF__INTERFACE__.html#ggaaa5808d4b389abd0ffaa5a6bf8979b95af767170db03446f909b630f652852a67">ADRV9371_ZC706_DEV</a>,</div>
<div class="line"><a name="l00108"></a><span class="lineno"><a class="line" href="group____GENERIC__PHY__RF__INTERFACE__.html#ggaaa5808d4b389abd0ffaa5a6bf8979b95ae4577ef9d478874f2f41b0b936822717"> 108</a></span>&#160; <a class="code" href="group____GENERIC__PHY__RF__INTERFACE__.html#ggaaa5808d4b389abd0ffaa5a6bf8979b95ae4577ef9d478874f2f41b0b936822717">UEDv2_DEV</a>,</div>
<div class="line"><a name="l00109"></a><span class="lineno"><a class="line" href="group____GENERIC__PHY__RF__INTERFACE__.html#ggaaa5808d4b389abd0ffaa5a6bf8979b95a869fbe11c32e1915a55fa98b4057efc1"> 109</a></span>&#160; <a class="code" href="group____GENERIC__PHY__RF__INTERFACE__.html#ggaaa5808d4b389abd0ffaa5a6bf8979b95a869fbe11c32e1915a55fa98b4057efc1">RFSIMULATOR</a>,</div>
<div class="line"><a name="l00110"></a><span class="lineno"><a class="line" href="group____GENERIC__PHY__RF__INTERFACE__.html#ggaaa5808d4b389abd0ffaa5a6bf8979b95a76289f688c5fc6574cfd86372e456c1d"> 110</a></span>&#160; <a class="code" href="group____GENERIC__PHY__RF__INTERFACE__.html#ggaaa5808d4b389abd0ffaa5a6bf8979b95a76289f688c5fc6574cfd86372e456c1d">MAX_RF_DEV_TYPE</a></div>
<div class="line"><a name="l00111"></a><span class="lineno"> 111</span>&#160;} <a class="code" href="group____GENERIC__PHY__RF__INTERFACE__.html#gaaa5808d4b389abd0ffaa5a6bf8979b95">dev_type_t</a>;</div>
<div class="line"><a name="l00112"></a><span class="lineno"><a class="line" href="group____GENERIC__PHY__RF__INTERFACE__.html#ga33d6c35c4484405707d457a52e354681"> 112</a></span>&#160;<span class="preprocessor">#define DEVTYPE_NAMES {&quot;&quot;,&quot;EXMIMO&quot;,&quot;USRP B200&quot;,&quot;USRP X300&quot;,&quot;USRP N300&quot;,&quot;BLADERF&quot;,&quot;LMSSDR&quot;,&quot;IRIS&quot;,&quot;No HW&quot;,&quot;ADRV9371_ZC706&quot;,&quot;UEDv2&quot;, &quot;RFSIMULATOR&quot;} </span></div>
<div class="line"><a name="l00113"></a><span class="lineno"> 113</span>&#160;<span class="preprocessor"></span></div>
<div class="line"><a name="l00115"></a><span class="lineno"><a class="line" href="group____GENERIC__PHY__RF__INTERFACE__.html#gab69560ebc82af819611d037a0121cc98"> 115</a></span>&#160;<span class="keyword">typedef</span> <span class="keyword">enum</span> {</div>
<div class="line"><a name="l00116"></a><span class="lineno"><a class="line" href="group____GENERIC__PHY__RF__INTERFACE__.html#ggab69560ebc82af819611d037a0121cc98a3f26f2223f4b3ca902685677ab696b01"> 116</a></span>&#160; <a class="code" href="group____GENERIC__PHY__RF__INTERFACE__.html#ggab69560ebc82af819611d037a0121cc98a3f26f2223f4b3ca902685677ab696b01">MIN_TRANSP_TYPE</a> = 0,</div>
<div class="line"><a name="l00118"></a><span class="lineno"><a class="line" href="group____GENERIC__PHY__RF__INTERFACE__.html#ggab69560ebc82af819611d037a0121cc98ad07d016205c095e107a8dbfbe0d14e98"> 118</a></span>&#160; <a class="code" href="group____GENERIC__PHY__RF__INTERFACE__.html#ggab69560ebc82af819611d037a0121cc98ad07d016205c095e107a8dbfbe0d14e98">ETHERNET_TP</a>,</div>
<div class="line"><a name="l00120"></a><span class="lineno"><a class="line" href="group____GENERIC__PHY__RF__INTERFACE__.html#ggab69560ebc82af819611d037a0121cc98a607502d097a12a8ee01fe4480cc00125"> 120</a></span>&#160; <a class="code" href="group____GENERIC__PHY__RF__INTERFACE__.html#ggab69560ebc82af819611d037a0121cc98a607502d097a12a8ee01fe4480cc00125">NONE_TP</a>,</div>
<div class="line"><a name="l00121"></a><span class="lineno"><a class="line" href="group____GENERIC__PHY__RF__INTERFACE__.html#ggab69560ebc82af819611d037a0121cc98aeec61428a26c9848938dff090c39800c"> 121</a></span>&#160; <a class="code" href="group____GENERIC__PHY__RF__INTERFACE__.html#ggab69560ebc82af819611d037a0121cc98aeec61428a26c9848938dff090c39800c">MAX_TRANSP_TYPE</a></div>
<div class="line"><a name="l00122"></a><span class="lineno"> 122</span>&#160;} <a class="code" href="group____GENERIC__PHY__RF__INTERFACE__.html#gab69560ebc82af819611d037a0121cc98">transport_type_t</a>;</div>
<div class="line"><a name="l00123"></a><span class="lineno"> 123</span>&#160;</div>
<div class="line"><a name="l00124"></a><span class="lineno"> 124</span>&#160;</div>
<div class="line"><a name="l00126"></a><span class="lineno"><a class="line" href="group____GENERIC__PHY__RF__INTERFACE__.html#ga2eaca82b72e3dce80fa4bc6f00405430"> 126</a></span>&#160;<span class="keyword">typedef</span> <span class="keyword">enum</span> {</div>
<div class="line"><a name="l00127"></a><span class="lineno"><a class="line" href="group____GENERIC__PHY__RF__INTERFACE__.html#gga2eaca82b72e3dce80fa4bc6f00405430a56fbb3ffdd6a54939bbf35358afec214"> 127</a></span>&#160; <a class="code" href="group____GENERIC__PHY__RF__INTERFACE__.html#gga2eaca82b72e3dce80fa4bc6f00405430a56fbb3ffdd6a54939bbf35358afec214">MIN_HOST_TYPE</a> = 0,</div>
<div class="line"><a name="l00129"></a><span class="lineno"><a class="line" href="group____GENERIC__PHY__RF__INTERFACE__.html#gga2eaca82b72e3dce80fa4bc6f00405430a95f66476b12559b0c2a27430b8eb47e9"> 129</a></span>&#160; <a class="code" href="group____GENERIC__PHY__RF__INTERFACE__.html#gga2eaca82b72e3dce80fa4bc6f00405430a95f66476b12559b0c2a27430b8eb47e9">RAU_HOST</a>,</div>
<div class="line"><a name="l00131"></a><span class="lineno"><a class="line" href="group____GENERIC__PHY__RF__INTERFACE__.html#gga2eaca82b72e3dce80fa4bc6f00405430aa091d53cb7c8ea5fe12a63d6072c8625"> 131</a></span>&#160; <a class="code" href="group____GENERIC__PHY__RF__INTERFACE__.html#gga2eaca82b72e3dce80fa4bc6f00405430aa091d53cb7c8ea5fe12a63d6072c8625">RRU_HOST</a>,</div>
<div class="line"><a name="l00132"></a><span class="lineno"><a class="line" href="group____GENERIC__PHY__RF__INTERFACE__.html#gga2eaca82b72e3dce80fa4bc6f00405430ab9881c2b3691fe35a8c4da225b86edf3"> 132</a></span>&#160; <a class="code" href="group____GENERIC__PHY__RF__INTERFACE__.html#gga2eaca82b72e3dce80fa4bc6f00405430ab9881c2b3691fe35a8c4da225b86edf3">MAX_HOST_TYPE</a></div>
<div class="line"><a name="l00133"></a><span class="lineno"> 133</span>&#160;} <a class="code" href="group____GENERIC__PHY__RF__INTERFACE__.html#ga2eaca82b72e3dce80fa4bc6f00405430">host_type_t</a>;</div>
<div class="line"><a name="l00134"></a><span class="lineno"> 134</span>&#160;</div>
<div class="line"><a name="l00135"></a><span class="lineno"> 135</span>&#160;</div>
<div class="line"><a name="l00137"></a><span class="lineno"><a class="line" href="structrx__gain__calib__table__t.html"> 137</a></span>&#160;<span class="keyword">typedef</span> <span class="keyword">struct </span>{</div>
<div class="line"><a name="l00139"></a><span class="lineno"><a class="line" href="structrx__gain__calib__table__t.html#ad573e88571a699ddf5b63efbdf01ae01"> 139</a></span>&#160; <span class="keywordtype">double</span> <a class="code" href="structrx__gain__calib__table__t.html#ad573e88571a699ddf5b63efbdf01ae01">freq</a>;</div>
<div class="line"><a name="l00141"></a><span class="lineno"><a class="line" href="structrx__gain__calib__table__t.html#acf2c89713a349fc21f822443a0f00774"> 141</a></span>&#160; <span class="keywordtype">double</span> <a class="code" href="structrx__gain__calib__table__t.html#acf2c89713a349fc21f822443a0f00774">offset</a>;</div>
<div class="line"><a name="l00142"></a><span class="lineno"> 142</span>&#160;} <a class="code" href="structrx__gain__calib__table__t.html">rx_gain_calib_table_t</a>;</div>
<div class="line"><a name="l00143"></a><span class="lineno"> 143</span>&#160;</div>
<div class="line"><a name="l00145"></a><span class="lineno"><a class="line" href="group____GENERIC__PHY__RF__INTERFACE__.html#ga306537444209dc91972f17fc71473ff5"> 145</a></span>&#160;<span class="keyword">typedef</span> <span class="keyword">enum</span> {</div>
<div class="line"><a name="l00147"></a><span class="lineno"><a class="line" href="group____GENERIC__PHY__RF__INTERFACE__.html#gga306537444209dc91972f17fc71473ff5ae027bc2a3779820d0ea9730b38850537"> 147</a></span>&#160; <a class="code" href="group____GENERIC__PHY__RF__INTERFACE__.html#gga306537444209dc91972f17fc71473ff5ae027bc2a3779820d0ea9730b38850537">unset</a>=-1,</div>
<div class="line"><a name="l00149"></a><span class="lineno"><a class="line" href="group____GENERIC__PHY__RF__INTERFACE__.html#gga306537444209dc91972f17fc71473ff5a8bbf5f5c3547f618366c4d293c6a3a8a"> 149</a></span>&#160; <span class="keyword">internal</span>=0,</div>
<div class="line"><a name="l00151"></a><span class="lineno"><a class="line" href="group____GENERIC__PHY__RF__INTERFACE__.html#gga306537444209dc91972f17fc71473ff5a6aef01ed9b1c198e6944f87e370f00b2"> 151</a></span>&#160; <a class="code" href="group____GENERIC__PHY__RF__INTERFACE__.html#gga306537444209dc91972f17fc71473ff5a6aef01ed9b1c198e6944f87e370f00b2">external</a>=1,</div>
<div class="line"><a name="l00153"></a><span class="lineno"><a class="line" href="group____GENERIC__PHY__RF__INTERFACE__.html#gga306537444209dc91972f17fc71473ff5ae2e00f1f847192ece7d24256cf9505b1"> 153</a></span>&#160; <a class="code" href="group____GENERIC__PHY__RF__INTERFACE__.html#gga306537444209dc91972f17fc71473ff5ae2e00f1f847192ece7d24256cf9505b1">gpsdo</a>=2</div>
<div class="line"><a name="l00154"></a><span class="lineno"> 154</span>&#160;} <a class="code" href="group____GENERIC__PHY__RF__INTERFACE__.html#ga306537444209dc91972f17fc71473ff5">clock_source_t</a>;</div>
<div class="line"><a name="l00155"></a><span class="lineno"> 155</span>&#160;</div>
<div class="line"><a name="l00156"></a><span class="lineno"> 156</span>&#160;</div>
<div class="line"><a name="l00158"></a><span class="lineno"><a class="line" href="structopenair0__config__t.html"> 158</a></span>&#160;<span class="keyword">typedef</span> <span class="keyword">struct </span>{</div>
<div class="line"><a name="l00160"></a><span class="lineno"><a class="line" href="structopenair0__config__t.html#a4f136a8b50b705ca17ce2e22b56ca809"> 160</a></span>&#160; <span class="keywordtype">int</span> <a class="code" href="structopenair0__config__t.html#a4f136a8b50b705ca17ce2e22b56ca809">Mod_id</a>;</div>
<div class="line"><a name="l00162"></a><span class="lineno"><a class="line" href="structopenair0__config__t.html#a45f7767d29c7ce903670581a7713eb3f"> 162</a></span>&#160; <span class="keywordtype">int</span> <a class="code" href="structopenair0__config__t.html#a45f7767d29c7ce903670581a7713eb3f">log_level</a>;</div>
<div class="line"><a name="l00164"></a><span class="lineno"><a class="line" href="structopenair0__config__t.html#af2a7bfacbf1df9d5570d1dbc37687584"> 164</a></span>&#160; duplex_mode_t <a class="code" href="structopenair0__config__t.html#af2a7bfacbf1df9d5570d1dbc37687584">duplex_mode</a>;</div>
<div class="line"><a name="l00166"></a><span class="lineno"><a class="line" href="structopenair0__config__t.html#a4a4e352be4ed03dc991e9b4fcd328014"> 166</a></span>&#160; <span class="keywordtype">int</span> <a class="code" href="structopenair0__config__t.html#a4a4e352be4ed03dc991e9b4fcd328014">num_rb_dl</a>;</div>
<div class="line"><a name="l00168"></a><span class="lineno"><a class="line" href="structopenair0__config__t.html#a493b219ffa776236a0ef44166898a5a6"> 168</a></span>&#160; <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> <a class="code" href="structopenair0__config__t.html#a493b219ffa776236a0ef44166898a5a6">samples_per_frame</a>;</div>
<div class="line"><a name="l00170"></a><span class="lineno"><a class="line" href="structopenair0__config__t.html#a4f84f7346865903d5279f6ff11bc17ed"> 170</a></span>&#160; <span class="keywordtype">double</span> <a class="code" href="structopenair0__config__t.html#a4f84f7346865903d5279f6ff11bc17ed">sample_rate</a>;</div>
<div class="line"><a name="l00172"></a><span class="lineno"><a class="line" href="structopenair0__config__t.html#a5c3b1f69d2e8ce2d25ceb4c61ea05fed"> 172</a></span>&#160; <span class="keywordtype">int</span> <a class="code" href="structopenair0__config__t.html#a5c3b1f69d2e8ce2d25ceb4c61ea05fed">mmapped_dma</a>;</div>
<div class="line"><a name="l00174"></a><span class="lineno"><a class="line" href="structopenair0__config__t.html#ac27d61589f6c306fb2041dc5ac6b0001"> 174</a></span>&#160; <span class="keywordtype">int</span> <a class="code" href="structopenair0__config__t.html#ac27d61589f6c306fb2041dc5ac6b0001">tx_sample_advance</a>;</div>
<div class="line"><a name="l00176"></a><span class="lineno"><a class="line" href="structopenair0__config__t.html#ab3b3593cfaa56b87b5d8e970d9ff98d6"> 176</a></span>&#160; <span class="keywordtype">int</span> <a class="code" href="structopenair0__config__t.html#ab3b3593cfaa56b87b5d8e970d9ff98d6">samples_per_packet</a>;</div>
<div class="line"><a name="l00178"></a><span class="lineno"><a class="line" href="structopenair0__config__t.html#aa9ecfb675c8232b8390f18c6cf42d93f"> 178</a></span>&#160; <span class="keywordtype">int</span> <a class="code" href="structopenair0__config__t.html#aa9ecfb675c8232b8390f18c6cf42d93f">rx_num_channels</a>;</div>
<div class="line"><a name="l00180"></a><span class="lineno"><a class="line" href="structopenair0__config__t.html#a23f0d9ffa88c0f68cd22b76a6a9e0e11"> 180</a></span>&#160; <span class="keywordtype">int</span> <a class="code" href="structopenair0__config__t.html#a23f0d9ffa88c0f68cd22b76a6a9e0e11">tx_num_channels</a>;</div>
<div class="line"><a name="l00182"></a><span class="lineno"><a class="line" href="structopenair0__config__t.html#a751a669ffe99c678e9ef178a196b4fe8"> 182</a></span>&#160; int32_t *rxbase[4];</div>
<div class="line"><a name="l00184"></a><span class="lineno"><a class="line" href="structopenair0__config__t.html#a130b67aa2519d907ad3b3e92e461ca50"> 184</a></span>&#160; int32_t *txbase[4];</div>
<div class="line"><a name="l00187"></a><span class="lineno"><a class="line" href="structopenair0__config__t.html#a33bc6fed66f352d3866d65eba5af7e10"> 187</a></span>&#160; <span class="keywordtype">double</span> rx_freq[4];</div>
<div class="line"><a name="l00190"></a><span class="lineno"><a class="line" href="structopenair0__config__t.html#a26ec880b2d9c96da24e1dd98144121ca"> 190</a></span>&#160; <span class="keywordtype">double</span> tx_freq[4];</div>
<div class="line"><a name="l00193"></a><span class="lineno"><a class="line" href="structopenair0__config__t.html#a36ca375b9b136199ab4385b27f95fccb"> 193</a></span>&#160; <a class="code" href="structrx__gain__calib__table__t.html">rx_gain_calib_table_t</a> *<a class="code" href="structopenair0__config__t.html#a36ca375b9b136199ab4385b27f95fccb">rx_gain_calib_table</a>;</div>
<div class="line"><a name="l00195"></a><span class="lineno"><a class="line" href="structopenair0__config__t.html#a4eb1fd1e5aa91b30533565c8e0beb793"> 195</a></span>&#160; rx_gain_t rxg_mode[4];</div>
<div class="line"><a name="l00198"></a><span class="lineno"><a class="line" href="structopenair0__config__t.html#af98936ed96027d70e62f2eefcc3617d8"> 198</a></span>&#160; <span class="keywordtype">double</span> rx_gain[4];</div>
<div class="line"><a name="l00201"></a><span class="lineno"><a class="line" href="structopenair0__config__t.html#a68c6c550053dbbe3e589c385219c0150"> 201</a></span>&#160; <span class="keywordtype">double</span> rx_gain_offset[4];</div>
<div class="line"><a name="l00203"></a><span class="lineno"><a class="line" href="structopenair0__config__t.html#af77d1f82e905783aaa3b71e8c1754432"> 203</a></span>&#160; <span class="keywordtype">double</span> tx_gain[4];</div>
<div class="line"><a name="l00205"></a><span class="lineno"><a class="line" href="structopenair0__config__t.html#ad6e124f006c1cf095930a902214ea054"> 205</a></span>&#160; <span class="keywordtype">double</span> <a class="code" href="structopenair0__config__t.html#ad6e124f006c1cf095930a902214ea054">rx_bw</a>;</div>
<div class="line"><a name="l00207"></a><span class="lineno"><a class="line" href="structopenair0__config__t.html#ab8c6d50adff71da2060f106112ebda88"> 207</a></span>&#160; <span class="keywordtype">double</span> <a class="code" href="structopenair0__config__t.html#ab8c6d50adff71da2060f106112ebda88">tx_bw</a>;</div>
<div class="line"><a name="l00209"></a><span class="lineno"><a class="line" href="structopenair0__config__t.html#aa90e61595a7f79ec50afb926c6612664"> 209</a></span>&#160; <a class="code" href="group____GENERIC__PHY__RF__INTERFACE__.html#ga306537444209dc91972f17fc71473ff5">clock_source_t</a> <a class="code" href="structopenair0__config__t.html#aa90e61595a7f79ec50afb926c6612664">clock_source</a>;</div>
<div class="line"><a name="l00211"></a><span class="lineno"><a class="line" href="structopenair0__config__t.html#a0aa51a114c5b62c53156ba4659b3447e"> 211</a></span>&#160; <a class="code" href="group____GENERIC__PHY__RF__INTERFACE__.html#ga306537444209dc91972f17fc71473ff5">clock_source_t</a> <a class="code" href="structopenair0__config__t.html#a0aa51a114c5b62c53156ba4659b3447e">time_source</a>;</div>
<div class="line"><a name="l00213"></a><span class="lineno"> 213</span>&#160; <span class="comment">//#if defined(EXMIMO) || defined(OAI_USRP) || defined(OAI_BLADERF) || defined(OAI_LMSSDR)</span></div>
<div class="line"><a name="l00214"></a><span class="lineno"><a class="line" href="structopenair0__config__t.html#a4360e61f7658a21efafc3b2ca75eb33c"> 214</a></span>&#160; <span class="keywordtype">char</span> *<a class="code" href="structopenair0__config__t.html#a4360e61f7658a21efafc3b2ca75eb33c">sdr_addrs</a>;</div>
<div class="line"><a name="l00216"></a><span class="lineno"><a class="line" href="structopenair0__config__t.html#a87d6ddac5743ff50869fd760936ee6ac"> 216</a></span>&#160; <span class="keywordtype">int</span> autocal[4];</div>
<div class="line"><a name="l00219"></a><span class="lineno"><a class="line" href="structopenair0__config__t.html#acb5f4a44bc209245a53c12a749541101"> 219</a></span>&#160; <span class="keywordtype">int</span> <a class="code" href="structopenair0__config__t.html#acb5f4a44bc209245a53c12a749541101">iq_txshift</a>;</div>
<div class="line"><a name="l00220"></a><span class="lineno"><a class="line" href="structopenair0__config__t.html#a309204c5cef2f024a413502b9053203d"> 220</a></span>&#160; <span class="keywordtype">int</span> <a class="code" href="structopenair0__config__t.html#a309204c5cef2f024a413502b9053203d">iq_rxrescale</a>;</div>
<div class="line"><a name="l00222"></a><span class="lineno"><a class="line" href="structopenair0__config__t.html#ad88c6a2684faa259c74515df4e5688b9"> 222</a></span>&#160; <span class="keywordtype">char</span> *<a class="code" href="structopenair0__config__t.html#ad88c6a2684faa259c74515df4e5688b9">configFilename</a>;</div>
<div class="line"><a name="l00224"></a><span class="lineno"><a class="line" href="structopenair0__config__t.html#af96c0d5571a1d2514ea0ab28e2e978ae"> 224</a></span>&#160; <span class="keywordtype">char</span> *<a class="code" href="structopenair0__config__t.html#af96c0d5571a1d2514ea0ab28e2e978ae">remote_addr</a>;</div>
<div class="line"><a name="l00226"></a><span class="lineno"><a class="line" href="structopenair0__config__t.html#ae00e0de09582b48b20c16c5f2c062c38"> 226</a></span>&#160; <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> <a class="code" href="structopenair0__config__t.html#ae00e0de09582b48b20c16c5f2c062c38">remote_port</a>;</div>
<div class="line"><a name="l00228"></a><span class="lineno"><a class="line" href="structopenair0__config__t.html#ae9b75daa2808da83e5fcd76c714454ee"> 228</a></span>&#160; <span class="keywordtype">char</span> *<a class="code" href="structopenair0__config__t.html#ae9b75daa2808da83e5fcd76c714454ee">my_addr</a>;</div>
<div class="line"><a name="l00230"></a><span class="lineno"><a class="line" href="structopenair0__config__t.html#a172d0e6c28acf03a69b4ca2a7cef1725"> 230</a></span>&#160; <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> <a class="code" href="structopenair0__config__t.html#a172d0e6c28acf03a69b4ca2a7cef1725">my_port</a>;</div>
<div class="line"><a name="l00232"></a><span class="lineno"><a class="line" href="structopenair0__config__t.html#a79af2dda514d36fbc3264fd5724795ae"> 232</a></span>&#160; uint32_t <a class="code" href="structopenair0__config__t.html#a79af2dda514d36fbc3264fd5724795ae">recplay_mode</a>;</div>
<div class="line"><a name="l00233"></a><span class="lineno"><a class="line" href="structopenair0__config__t.html#a95b1ab3fbef072586d640cdcbe84554a"> 233</a></span>&#160; recplay_conf_t *<a class="code" href="structopenair0__config__t.html#a95b1ab3fbef072586d640cdcbe84554a">recplay_conf</a>;</div>
<div class="line"><a name="l00235"></a><span class="lineno"><a class="line" href="structopenair0__config__t.html#ac691df2b1dacb97e28e5a531043fccc8"> 235</a></span>&#160; <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> <a class="code" href="structopenair0__config__t.html#ac691df2b1dacb97e28e5a531043fccc8">samples_per_tti</a>;</div>
<div class="line"><a name="l00237"></a><span class="lineno"><a class="line" href="structopenair0__config__t.html#ab1abed061a06f6fcd79bed1f914b68b5"> 237</a></span>&#160; <span class="keywordtype">double</span> <a class="code" href="structopenair0__config__t.html#ab1abed061a06f6fcd79bed1f914b68b5">rx_sample_rate</a>;</div>
<div class="line"><a name="l00239"></a><span class="lineno"><a class="line" href="structopenair0__config__t.html#a0c479543c8998390076751412aace631"> 239</a></span>&#160; <span class="keywordtype">double</span> <a class="code" href="structopenair0__config__t.html#a0c479543c8998390076751412aace631">tx_sample_rate</a>;</div>
<div class="line"><a name="l00241"></a><span class="lineno"><a class="line" href="structopenair0__config__t.html#ac723300aef5ada036a69bcd30bd54c8f"> 241</a></span>&#160; int8_t <a class="code" href="structopenair0__config__t.html#ac723300aef5ada036a69bcd30bd54c8f">threequarter_fs</a>;</div>
<div class="line"><a name="l00242"></a><span class="lineno"> 242</span>&#160;} <a class="code" href="structopenair0__config__t.html">openair0_config_t</a>;</div>
<div class="line"><a name="l00243"></a><span class="lineno"> 243</span>&#160;</div>
<div class="line"><a name="l00245"></a><span class="lineno"><a class="line" href="structopenair0__rf__map.html"> 245</a></span>&#160;<span class="keyword">typedef</span> <span class="keyword">struct </span>{</div>
<div class="line"><a name="l00247"></a><span class="lineno"><a class="line" href="structopenair0__rf__map.html#ae2842aac50ccd52cfb010413f45a1196"> 247</a></span>&#160; <span class="keywordtype">int</span> <a class="code" href="structopenair0__rf__map.html#ae2842aac50ccd52cfb010413f45a1196">card</a>;</div>
<div class="line"><a name="l00249"></a><span class="lineno"><a class="line" href="structopenair0__rf__map.html#a58606d900e601316a537bf35ddc744ef"> 249</a></span>&#160; <span class="keywordtype">int</span> <a class="code" href="structopenair0__rf__map.html#a58606d900e601316a537bf35ddc744ef">chain</a>;</div>
<div class="line"><a name="l00250"></a><span class="lineno"> 250</span>&#160;} <a class="code" href="structopenair0__rf__map.html">openair0_rf_map</a>;</div>
<div class="line"><a name="l00251"></a><span class="lineno"> 251</span>&#160;</div>
<div class="line"><a name="l00252"></a><span class="lineno"> 252</span>&#160;</div>
<div class="line"><a name="l00253"></a><span class="lineno"><a class="line" href="structeth__params__t.html"> 253</a></span>&#160;<span class="keyword">typedef</span> <span class="keyword">struct </span>{</div>
<div class="line"><a name="l00254"></a><span class="lineno"><a class="line" href="structeth__params__t.html#a28c524821470015a8508fd03cb2235c1"> 254</a></span>&#160; <span class="keywordtype">char</span> *<a class="code" href="structeth__params__t.html#a28c524821470015a8508fd03cb2235c1">remote_addr</a>;</div>
<div class="line"><a name="l00256"></a><span class="lineno"><a class="line" href="structeth__params__t.html#a986ad1aa4233de6ef8db939a7d3d1b83"> 256</a></span>&#160; uint16_t <a class="code" href="structeth__params__t.html#a986ad1aa4233de6ef8db939a7d3d1b83">remote_portc</a>;</div>
<div class="line"><a name="l00258"></a><span class="lineno"><a class="line" href="structeth__params__t.html#a6f884345f641384b8585bb3e0f8e8000"> 258</a></span>&#160; uint16_t <a class="code" href="structeth__params__t.html#a6f884345f641384b8585bb3e0f8e8000">remote_portd</a>;</div>
<div class="line"><a name="l00260"></a><span class="lineno"><a class="line" href="structeth__params__t.html#ad8098226503aa2e2ab27768c06a4def1"> 260</a></span>&#160; <span class="keywordtype">char</span> *<a class="code" href="structeth__params__t.html#ad8098226503aa2e2ab27768c06a4def1">my_addr</a>;</div>
<div class="line"><a name="l00262"></a><span class="lineno"><a class="line" href="structeth__params__t.html#a460c6aa8e7ac6ac7274c7352493e507d"> 262</a></span>&#160; uint16_t <a class="code" href="structeth__params__t.html#a460c6aa8e7ac6ac7274c7352493e507d">my_portc</a>;</div>
<div class="line"><a name="l00264"></a><span class="lineno"><a class="line" href="structeth__params__t.html#a44c3418e5aa10e5809d3a26830ce4c96"> 264</a></span>&#160; uint16_t <a class="code" href="structeth__params__t.html#a44c3418e5aa10e5809d3a26830ce4c96">my_portd</a>;</div>
<div class="line"><a name="l00266"></a><span class="lineno"><a class="line" href="structeth__params__t.html#af9c9cc896817467607bddb69045fae7c"> 266</a></span>&#160; <span class="keywordtype">char</span> *<a class="code" href="structeth__params__t.html#af9c9cc896817467607bddb69045fae7c">local_if_name</a>;</div>
<div class="line"><a name="l00268"></a><span class="lineno"><a class="line" href="structeth__params__t.html#a265c4ee5b215fbd4c4c4a4c47394c20f"> 268</a></span>&#160; uint8_t <a class="code" href="structeth__params__t.html#a265c4ee5b215fbd4c4c4a4c47394c20f">transp_preference</a>;</div>
<div class="line"><a name="l00270"></a><span class="lineno"><a class="line" href="structeth__params__t.html#a13deb519ea5f11320b3694cc1a20694f"> 270</a></span>&#160; uint8_t <a class="code" href="structeth__params__t.html#a13deb519ea5f11320b3694cc1a20694f">if_compress</a>;</div>
<div class="line"><a name="l00271"></a><span class="lineno"> 271</span>&#160;} <a class="code" href="structeth__params__t.html">eth_params_t</a>;</div>
<div class="line"><a name="l00272"></a><span class="lineno"> 272</span>&#160;</div>
<div class="line"><a name="l00273"></a><span class="lineno"><a class="line" href="structif__buffer__t.html"> 273</a></span>&#160;<span class="keyword">typedef</span> <span class="keyword">struct </span>{</div>
<div class="line"><a name="l00275"></a><span class="lineno"><a class="line" href="structif__buffer__t.html#ac450848eb036d004553f9da5335b7b0c"> 275</a></span>&#160; <span class="keywordtype">void</span> *tx[10];</div>
<div class="line"><a name="l00277"></a><span class="lineno"><a class="line" href="structif__buffer__t.html#a2547ae9b87c2defff57faf96a7640f36"> 277</a></span>&#160; <span class="keywordtype">void</span> *<a class="code" href="structif__buffer__t.html#a2547ae9b87c2defff57faf96a7640f36">tx_prach</a>;</div>
<div class="line"><a name="l00279"></a><span class="lineno"><a class="line" href="structif__buffer__t.html#afce30aa05ce77e0eb22d91a148e23233"> 279</a></span>&#160; <span class="keywordtype">void</span> *<a class="code" href="structif__buffer__t.html#afce30aa05ce77e0eb22d91a148e23233">rx</a>;</div>
<div class="line"><a name="l00280"></a><span class="lineno"> 280</span>&#160;} <a class="code" href="structif__buffer__t.html">if_buffer_t</a>;</div>
<div class="line"><a name="l00281"></a><span class="lineno"> 281</span>&#160;</div>
<div class="line"><a name="l00282"></a><span class="lineno"><a class="line" href="structopenair0__write__package__t.html"> 282</a></span>&#160;<span class="keyword">typedef</span> <span class="keyword">struct </span>{</div>
<div class="line"><a name="l00283"></a><span class="lineno"><a class="line" href="structopenair0__write__package__t.html#af754d0ce3e74bdaab788817fccd51c4b"> 283</a></span>&#160; openair0_timestamp <a class="code" href="structopenair0__write__package__t.html#af754d0ce3e74bdaab788817fccd51c4b">timestamp</a>;</div>
<div class="line"><a name="l00284"></a><span class="lineno"><a class="line" href="structopenair0__write__package__t.html#a89e50f347889b77f4041ff8ac3805778"> 284</a></span>&#160; <span class="keywordtype">void</span> *buff[MAX_WRITE_THREAD_BUFFER_SIZE];<span class="comment">// buffer to be write;</span></div>
<div class="line"><a name="l00285"></a><span class="lineno"><a class="line" href="structopenair0__write__package__t.html#ac5544809ab8750a746c4cec1c8a1ad8c"> 285</a></span>&#160; <span class="keywordtype">int</span> <a class="code" href="structopenair0__write__package__t.html#ac5544809ab8750a746c4cec1c8a1ad8c">nsamps</a>;</div>
<div class="line"><a name="l00286"></a><span class="lineno"><a class="line" href="structopenair0__write__package__t.html#a8cae5e7322eae32a710c66383ad38034"> 286</a></span>&#160; <span class="keywordtype">int</span> <a class="code" href="structopenair0__write__package__t.html#a8cae5e7322eae32a710c66383ad38034">cc</a>;</div>
<div class="line"><a name="l00287"></a><span class="lineno"><a class="line" href="structopenair0__write__package__t.html#a4ee00eecec7b5d7c898805e0abfee9cd"> 287</a></span>&#160; <span class="keywordtype">signed</span> <span class="keywordtype">char</span> <a class="code" href="structopenair0__write__package__t.html#a4ee00eecec7b5d7c898805e0abfee9cd">first_packet</a>;</div>
<div class="line"><a name="l00288"></a><span class="lineno"><a class="line" href="structopenair0__write__package__t.html#a0473807080beeaf26ce63b94e38d470d"> 288</a></span>&#160; <span class="keywordtype">signed</span> <span class="keywordtype">char</span> <a class="code" href="structopenair0__write__package__t.html#a0473807080beeaf26ce63b94e38d470d">last_packet</a>;</div>
<div class="line"><a name="l00289"></a><span class="lineno"><a class="line" href="structopenair0__write__package__t.html#a3b165b430763a3a13e184e86e3f75418"> 289</a></span>&#160; <span class="keywordtype">int</span> <a class="code" href="structopenair0__write__package__t.html#a3b165b430763a3a13e184e86e3f75418">flags_msb</a>;</div>
<div class="line"><a name="l00290"></a><span class="lineno"> 290</span>&#160;} <a class="code" href="structopenair0__write__package__t.html">openair0_write_package_t</a>;</div>
<div class="line"><a name="l00291"></a><span class="lineno"> 291</span>&#160;</div>
<div class="line"><a name="l00292"></a><span class="lineno"><a class="line" href="structopenair0__thread__t.html"> 292</a></span>&#160;<span class="keyword">typedef</span> <span class="keyword">struct </span>{</div>
<div class="line"><a name="l00293"></a><span class="lineno"><a class="line" href="structopenair0__thread__t.html#a13134e3b25221c5f1ecdad80cfad6570"> 293</a></span>&#160; <a class="code" href="structopenair0__write__package__t.html">openair0_write_package_t</a> write_package[MAX_WRITE_THREAD_PACKAGE];</div>
<div class="line"><a name="l00294"></a><span class="lineno"><a class="line" href="structopenair0__thread__t.html#a5c95792bc9ab981daffd94762b941c09"> 294</a></span>&#160; <span class="keywordtype">int</span> <a class="code" href="structopenair0__thread__t.html#a5c95792bc9ab981daffd94762b941c09">start</a>;</div>
<div class="line"><a name="l00295"></a><span class="lineno"><a class="line" href="structopenair0__thread__t.html#ae9612307d1e4bbfb38886dd60a2cd8ed"> 295</a></span>&#160; <span class="keywordtype">int</span> <a class="code" href="structopenair0__thread__t.html#ae9612307d1e4bbfb38886dd60a2cd8ed">end</a>;</div>
<div class="line"><a name="l00297"></a><span class="lineno"><a class="line" href="structopenair0__thread__t.html#abefca45c14975b7c330afc3fb8bf28a3"> 297</a></span>&#160; <span class="keywordtype">int</span> <a class="code" href="structopenair0__thread__t.html#abefca45c14975b7c330afc3fb8bf28a3">count_write</a>;</div>
<div class="line"><a name="l00299"></a><span class="lineno"><a class="line" href="structopenair0__thread__t.html#aa6078d75f5ca8457dc79360a2f83287e"> 299</a></span>&#160; pthread_t <a class="code" href="structopenair0__thread__t.html#aa6078d75f5ca8457dc79360a2f83287e">pthread_write</a>;</div>
<div class="line"><a name="l00301"></a><span class="lineno"><a class="line" href="structopenair0__thread__t.html#a4c3a935f1ecfe59a3788d36e4134d67f"> 301</a></span>&#160; pthread_attr_t <a class="code" href="structopenair0__thread__t.html#a4c3a935f1ecfe59a3788d36e4134d67f">attr_write</a>;</div>
<div class="line"><a name="l00303"></a><span class="lineno"><a class="line" href="structopenair0__thread__t.html#a844baf6d1fd5d8e6b308270c9f82c051"> 303</a></span>&#160; pthread_cond_t <a class="code" href="structopenair0__thread__t.html#a844baf6d1fd5d8e6b308270c9f82c051">cond_write</a>;</div>
<div class="line"><a name="l00305"></a><span class="lineno"><a class="line" href="structopenair0__thread__t.html#aeb4c7b74a599f1625e03ff5ad9ab8f54"> 305</a></span>&#160; pthread_mutex_t <a class="code" href="structopenair0__thread__t.html#aeb4c7b74a599f1625e03ff5ad9ab8f54">mutex_write</a>;</div>
<div class="line"><a name="l00306"></a><span class="lineno"> 306</span>&#160;} <a class="code" href="structopenair0__thread__t.html">openair0_thread_t</a>;</div>
<div class="line"><a name="l00307"></a><span class="lineno"> 307</span>&#160;</div>
<div class="line"><a name="l00309"></a><span class="lineno"><a class="line" href="structopenair0__device__t.html"> 309</a></span>&#160;<span class="keyword">struct </span><a class="code" href="structopenair0__device__t.html">openair0_device_t</a> {</div>
<div class="line"><a name="l00311"></a><span class="lineno"><a class="line" href="structopenair0__device__t.html#ac8c89901a17211bc9fc6726eeab7c6d5"> 311</a></span>&#160; <a class="code" href="structopenair0__thread__t.html">openair0_thread_t</a> <a class="code" href="structopenair0__device__t.html#ac8c89901a17211bc9fc6726eeab7c6d5">write_thread</a>;</div>
<div class="line"><a name="l00312"></a><span class="lineno"> 312</span>&#160;</div>
<div class="line"><a name="l00314"></a><span class="lineno"><a class="line" href="structopenair0__device__t.html#afd3417564d89c5940326c51b3f367ec2"> 314</a></span>&#160; <span class="keywordtype">int</span> <a class="code" href="structopenair0__device__t.html#afd3417564d89c5940326c51b3f367ec2">Mod_id</a>;</div>
<div class="line"><a name="l00315"></a><span class="lineno"> 315</span>&#160;</div>
<div class="line"><a name="l00317"></a><span class="lineno"><a class="line" href="structopenair0__device__t.html#a9058b8d7018f07f95fd09609689f0b44"> 317</a></span>&#160; <span class="keywordtype">int</span> <a class="code" href="structopenair0__device__t.html#a9058b8d7018f07f95fd09609689f0b44">CC_id</a>;</div>
<div class="line"><a name="l00318"></a><span class="lineno"> 318</span>&#160;</div>
<div class="line"><a name="l00320"></a><span class="lineno"><a class="line" href="structopenair0__device__t.html#af6d3431966004aabb2dea1d5d44ceda0"> 320</a></span>&#160; <a class="code" href="group____GENERIC__PHY__RF__INTERFACE__.html#gaaa5808d4b389abd0ffaa5a6bf8979b95">dev_type_t</a> <a class="code" href="structopenair0__device__t.html#af6d3431966004aabb2dea1d5d44ceda0">type</a>;</div>
<div class="line"><a name="l00321"></a><span class="lineno"> 321</span>&#160;</div>
<div class="line"><a name="l00323"></a><span class="lineno"><a class="line" href="structopenair0__device__t.html#aca56a70c10571b830ef148ff0ddddc59"> 323</a></span>&#160; <a class="code" href="group____GENERIC__PHY__RF__INTERFACE__.html#gab69560ebc82af819611d037a0121cc98">transport_type_t</a> <a class="code" href="structopenair0__device__t.html#aca56a70c10571b830ef148ff0ddddc59">transp_type</a>;</div>
<div class="line"><a name="l00324"></a><span class="lineno"> 324</span>&#160;</div>
<div class="line"><a name="l00326"></a><span class="lineno"><a class="line" href="structopenair0__device__t.html#a27b16daa24a6dd438ded9c9fbce19a27"> 326</a></span>&#160; <a class="code" href="group____GENERIC__PHY__RF__INTERFACE__.html#ga2eaca82b72e3dce80fa4bc6f00405430">host_type_t</a> <a class="code" href="structopenair0__device__t.html#a27b16daa24a6dd438ded9c9fbce19a27">host_type</a>;</div>
<div class="line"><a name="l00327"></a><span class="lineno"> 327</span>&#160;</div>
<div class="line"><a name="l00328"></a><span class="lineno"> 328</span>&#160; <span class="comment">/* !brief RF frontend parameters set by application */</span></div>
<div class="line"><a name="l00329"></a><span class="lineno"><a class="line" href="structopenair0__device__t.html#af31d194f4688283fa7e1dac964b20b5e"> 329</a></span>&#160; <a class="code" href="structopenair0__config__t.html">openair0_config_t</a> *<a class="code" href="structopenair0__device__t.html#af31d194f4688283fa7e1dac964b20b5e">openair0_cfg</a>;</div>
<div class="line"><a name="l00330"></a><span class="lineno"> 330</span>&#160;</div>
<div class="line"><a name="l00331"></a><span class="lineno"> 331</span>&#160; <span class="comment">/* !brief ETH params set by application */</span></div>
<div class="line"><a name="l00332"></a><span class="lineno"><a class="line" href="structopenair0__device__t.html#aae425138eefc6ed6d6205c6e942e2e3e"> 332</a></span>&#160; <a class="code" href="structeth__params__t.html">eth_params_t</a> *<a class="code" href="structopenair0__device__t.html#aae425138eefc6ed6d6205c6e942e2e3e">eth_params</a>;</div>
<div class="line"><a name="l00334"></a><span class="lineno"><a class="line" href="structopenair0__device__t.html#aec43dbef661454499203121bba63b043"> 334</a></span>&#160; recplay_state_t *<a class="code" href="structopenair0__device__t.html#aec43dbef661454499203121bba63b043">recplay_state</a>;</div>
<div class="line"><a name="l00335"></a><span class="lineno"> 335</span>&#160; <span class="comment">/* !brief Indicates if device already initialized */</span></div>
<div class="line"><a name="l00336"></a><span class="lineno"><a class="line" href="structopenair0__device__t.html#a5d01fbd97c3f4f7cae0945ab1d1c52aa"> 336</a></span>&#160; <span class="keywordtype">int</span> <a class="code" href="structopenair0__device__t.html#a5d01fbd97c3f4f7cae0945ab1d1c52aa">is_init</a>;</div>
<div class="line"><a name="l00337"></a><span class="lineno"> 337</span>&#160;</div>
<div class="line"><a name="l00338"></a><span class="lineno"> 338</span>&#160;</div>
<div class="line"><a name="l00340"></a><span class="lineno"><a class="line" href="structopenair0__device__t.html#a8561d9c34df9b5d74b974466721e6929"> 340</a></span>&#160; <span class="keywordtype">void</span> *<a class="code" href="structopenair0__device__t.html#a8561d9c34df9b5d74b974466721e6929">priv</a>;</div>
<div class="line"><a name="l00341"></a><span class="lineno"> 341</span>&#160;</div>
<div class="line"><a name="l00342"></a><span class="lineno"> 342</span>&#160; <span class="comment">/* Functions API, which are called by the application*/</span></div>
<div class="line"><a name="l00343"></a><span class="lineno"> 343</span>&#160;</div>
<div class="line"><a name="l00347"></a><span class="lineno"><a class="line" href="structopenair0__device__t.html#a2a3ad75f1ee39fba38aee3a2b9a0822a"> 347</a></span>&#160; int (*<a class="code" href="structopenair0__device__t.html#a2a3ad75f1ee39fba38aee3a2b9a0822a">trx_start_func</a>)(<a class="code" href="structopenair0__device__t.html">openair0_device</a> *device);</div>
<div class="line"><a name="l00348"></a><span class="lineno"> 348</span>&#160;</div>
<div class="line"><a name="l00354"></a><span class="lineno"><a class="line" href="structopenair0__device__t.html#ab12a26c3776e8a9b09bca0a507f43493"> 354</a></span>&#160; int (*<a class="code" href="structopenair0__device__t.html#ab12a26c3776e8a9b09bca0a507f43493">trx_config_func</a>)(<a class="code" href="structopenair0__device__t.html">openair0_device</a>* device, <a class="code" href="structopenair0__config__t.html">openair0_config_t</a> *<a class="code" href="structopenair0__device__t.html#af31d194f4688283fa7e1dac964b20b5e">openair0_cfg</a>);</div>
<div class="line"><a name="l00355"></a><span class="lineno"> 355</span>&#160;</div>
<div class="line"><a name="l00361"></a><span class="lineno"><a class="line" href="structopenair0__device__t.html#acc3a7d85604cb01ae1b5c2fd06d5977a"> 361</a></span>&#160; int (*<a class="code" href="structopenair0__device__t.html#acc3a7d85604cb01ae1b5c2fd06d5977a">trx_ctlsend_func</a>)(<a class="code" href="structopenair0__device__t.html">openair0_device</a> *device, <span class="keywordtype">void</span> *msg, ssize_t msg_len);</div>
<div class="line"><a name="l00362"></a><span class="lineno"> 362</span>&#160;</div>
<div class="line"><a name="l00368"></a><span class="lineno"><a class="line" href="structopenair0__device__t.html#a45b4e2287bfd6532cf5c1aebfa38dacf"> 368</a></span>&#160; int (*<a class="code" href="structopenair0__device__t.html#a45b4e2287bfd6532cf5c1aebfa38dacf">trx_ctlrecv_func</a>)(<a class="code" href="structopenair0__device__t.html">openair0_device</a> *device, <span class="keywordtype">void</span> *msg, ssize_t msg_len);</div>
<div class="line"><a name="l00369"></a><span class="lineno"> 369</span>&#160;</div>
<div class="line"><a name="l00378"></a><span class="lineno"><a class="line" href="structopenair0__device__t.html#ac36b80527a9850cc1a021f4f825c49d1"> 378</a></span>&#160; int (*<a class="code" href="structopenair0__device__t.html#ac36b80527a9850cc1a021f4f825c49d1">trx_write_func</a>)(<a class="code" href="structopenair0__device__t.html">openair0_device</a> *device, openair0_timestamp timestamp, <span class="keywordtype">void</span> **buff, <span class="keywordtype">int</span> nsamps,<span class="keywordtype">int</span> antenna_id, <span class="keywordtype">int</span> flags);</div>
<div class="line"><a name="l00379"></a><span class="lineno"> 379</span>&#160;</div>
<div class="line"><a name="l00388"></a><span class="lineno"><a class="line" href="structopenair0__device__t.html#a8ab0f07a3564d6de48302ffcae7f3537"> 388</a></span>&#160; int (*<a class="code" href="structopenair0__device__t.html#a8ab0f07a3564d6de48302ffcae7f3537">trx_write_func2</a>)(<a class="code" href="structopenair0__device__t.html">openair0_device</a> *device, openair0_timestamp timestamp, <span class="keywordtype">void</span> *buff, <span class="keywordtype">int</span> nsamps,<span class="keywordtype">int</span> antenna_id, <span class="keywordtype">int</span> flags);</div>
<div class="line"><a name="l00389"></a><span class="lineno"> 389</span>&#160;</div>
<div class="line"><a name="l00402"></a><span class="lineno"><a class="line" href="structopenair0__device__t.html#ae108d08f894211745ef8da1d6b3c8276"> 402</a></span>&#160; int (*<a class="code" href="structopenair0__device__t.html#ae108d08f894211745ef8da1d6b3c8276">trx_read_func</a>)(<a class="code" href="structopenair0__device__t.html">openair0_device</a> *device, openair0_timestamp *ptimestamp, <span class="keywordtype">void</span> **buff, <span class="keywordtype">int</span> nsamps,<span class="keywordtype">int</span> num_antennas);</div>
<div class="line"><a name="l00403"></a><span class="lineno"> 403</span>&#160;</div>
<div class="line"><a name="l00415"></a><span class="lineno"><a class="line" href="structopenair0__device__t.html#afec2fbe0d81987e2093c3daf8fc4355a"> 415</a></span>&#160; int (*<a class="code" href="structopenair0__device__t.html#afec2fbe0d81987e2093c3daf8fc4355a">trx_read_func2</a>)(<a class="code" href="structopenair0__device__t.html">openair0_device</a> *device, openair0_timestamp *ptimestamp, <span class="keywordtype">void</span> *buff, <span class="keywordtype">int</span> nsamps,<span class="keywordtype">int</span> *antenna_id);</div>
<div class="line"><a name="l00416"></a><span class="lineno"> 416</span>&#160;</div>
<div class="line"><a name="l00421"></a><span class="lineno"><a class="line" href="structopenair0__device__t.html#a1561d90fd09b7a80f2491abcbf3b1356"> 421</a></span>&#160; int (*<a class="code" href="structopenair0__device__t.html#a1561d90fd09b7a80f2491abcbf3b1356">trx_get_stats_func</a>)(<a class="code" href="structopenair0__device__t.html">openair0_device</a> *device);</div>
<div class="line"><a name="l00422"></a><span class="lineno"> 422</span>&#160;</div>
<div class="line"><a name="l00427"></a><span class="lineno"><a class="line" href="structopenair0__device__t.html#a259a8bb97c4750a6424ae41fa3c5c2ca"> 427</a></span>&#160; int (*<a class="code" href="structopenair0__device__t.html#a259a8bb97c4750a6424ae41fa3c5c2ca">trx_reset_stats_func</a>)(<a class="code" href="structopenair0__device__t.html">openair0_device</a> *device);</div>
<div class="line"><a name="l00428"></a><span class="lineno"> 428</span>&#160;</div>
<div class="line"><a name="l00432"></a><span class="lineno"><a class="line" href="structopenair0__device__t.html#a838459a1803d7aef9c17c48a3597149c"> 432</a></span>&#160; void (*<a class="code" href="structopenair0__device__t.html#a838459a1803d7aef9c17c48a3597149c">trx_end_func</a>)(<a class="code" href="structopenair0__device__t.html">openair0_device</a> *device);</div>
<div class="line"><a name="l00433"></a><span class="lineno"> 433</span>&#160;</div>
<div class="line"><a name="l00436"></a><span class="lineno"><a class="line" href="structopenair0__device__t.html#a14f2c5c56d3bfb67d360910c0b5a1abb"> 436</a></span>&#160; int (*<a class="code" href="structopenair0__device__t.html#a14f2c5c56d3bfb67d360910c0b5a1abb">trx_stop_func</a>)(<a class="code" href="structopenair0__device__t.html">openair0_device</a> *device);</div>
<div class="line"><a name="l00437"></a><span class="lineno"> 437</span>&#160;</div>
<div class="line"><a name="l00438"></a><span class="lineno"> 438</span>&#160; <span class="comment">/* Functions API related to UE*/</span></div>
<div class="line"><a name="l00439"></a><span class="lineno"> 439</span>&#160;</div>
<div class="line"><a name="l00446"></a><span class="lineno"><a class="line" href="structopenair0__device__t.html#a82b2a6b2961e16cf4266c701e6ff5562"> 446</a></span>&#160; int (*<a class="code" href="structopenair0__device__t.html#a82b2a6b2961e16cf4266c701e6ff5562">trx_set_freq_func</a>)(<a class="code" href="structopenair0__device__t.html">openair0_device</a> *device, <a class="code" href="structopenair0__config__t.html">openair0_config_t</a> *<a class="code" href="structopenair0__device__t.html#af31d194f4688283fa7e1dac964b20b5e">openair0_cfg</a>,<span class="keywordtype">int</span> exmimo_dump_config);</div>
<div class="line"><a name="l00447"></a><span class="lineno"> 447</span>&#160;</div>
<div class="line"><a name="l00453"></a><span class="lineno"><a class="line" href="structopenair0__device__t.html#a4f97ba8d1ae444a5392bb367909ba330"> 453</a></span>&#160; int (*<a class="code" href="structopenair0__device__t.html#a4f97ba8d1ae444a5392bb367909ba330">trx_set_gains_func</a>)(<a class="code" href="structopenair0__device__t.html">openair0_device</a> *device, <a class="code" href="structopenair0__config__t.html">openair0_config_t</a> *<a class="code" href="structopenair0__device__t.html#af31d194f4688283fa7e1dac964b20b5e">openair0_cfg</a>);</div>
<div class="line"><a name="l00454"></a><span class="lineno"> 454</span>&#160;</div>
<div class="line"><a name="l00459"></a><span class="lineno"><a class="line" href="structopenair0__device__t.html#afdb71036a18e7982ad077c235b28f1c7"> 459</a></span>&#160; void (*<a class="code" href="structopenair0__device__t.html#afdb71036a18e7982ad077c235b28f1c7">configure_rru</a>)(<span class="keywordtype">int</span> idx, <span class="keywordtype">void</span> *arg);</div>
<div class="line"><a name="l00460"></a><span class="lineno"> 460</span>&#160;</div>
<div class="line"><a name="l00464"></a><span class="lineno"><a class="line" href="structopenair0__device__t.html#a4e5d9334a5257be49bf8e50121094ea7"> 464</a></span>&#160; <span class="keywordtype">void</span> *<a class="code" href="structopenair0__device__t.html#a4e5d9334a5257be49bf8e50121094ea7">thirdparty_priv</a>;</div>
<div class="line"><a name="l00465"></a><span class="lineno"> 465</span>&#160;</div>
<div class="line"><a name="l00469"></a><span class="lineno"><a class="line" href="structopenair0__device__t.html#aa60512fadf8756ca8b6750fb37287ec2"> 469</a></span>&#160; int (*<a class="code" href="structopenair0__device__t.html#aa60512fadf8756ca8b6750fb37287ec2">thirdparty_init</a>)(<a class="code" href="structopenair0__device__t.html">openair0_device</a> *device);</div>
<div class="line"><a name="l00473"></a><span class="lineno"><a class="line" href="structopenair0__device__t.html#a2859ae1bcad26ea7c5c1829c36f3afaf"> 473</a></span>&#160; int (*<a class="code" href="structopenair0__device__t.html#a2859ae1bcad26ea7c5c1829c36f3afaf">thirdparty_cleanup</a>)(<a class="code" href="structopenair0__device__t.html">openair0_device</a> *device);</div>
<div class="line"><a name="l00474"></a><span class="lineno"> 474</span>&#160;</div>
<div class="line"><a name="l00478"></a><span class="lineno"><a class="line" href="structopenair0__device__t.html#a015023e826283e3de27ea20163187221"> 478</a></span>&#160; int (*<a class="code" href="structopenair0__device__t.html#a015023e826283e3de27ea20163187221">thirdparty_startstreaming</a>)(<a class="code" href="structopenair0__device__t.html">openair0_device</a> *device);</div>
<div class="line"><a name="l00479"></a><span class="lineno"> 479</span>&#160;</div>
<div class="line"><a name="l00484"></a><span class="lineno"><a class="line" href="structopenair0__device__t.html#accbaf10907905da0fb039af8908535d7"> 484</a></span>&#160; int (*<a class="code" href="structopenair0__device__t.html#accbaf10907905da0fb039af8908535d7">trx_write_init</a>)(<a class="code" href="structopenair0__device__t.html">openair0_device</a> *device);</div>
<div class="line"><a name="l00485"></a><span class="lineno"> 485</span>&#160; <span class="comment">/* \brief Get internal parameter</span></div>
<div class="line"><a name="l00486"></a><span class="lineno"> 486</span>&#160;<span class="comment"> * \param id parameter to get</span></div>
<div class="line"><a name="l00487"></a><span class="lineno"> 487</span>&#160;<span class="comment"> * \return a pointer to the parameter</span></div>
<div class="line"><a name="l00488"></a><span class="lineno"> 488</span>&#160;<span class="comment"> */</span></div>
<div class="line"><a name="l00489"></a><span class="lineno"><a class="line" href="structopenair0__device__t.html#a4a263d9326882818c7c833148a0b4792"> 489</a></span>&#160; <span class="keywordtype">void</span> *(*get_internal_parameter)(<span class="keywordtype">char</span> *id);</div>
<div class="line"><a name="l00490"></a><span class="lineno"> 490</span>&#160;};</div>
<div class="line"><a name="l00491"></a><span class="lineno"> 491</span>&#160;</div>
<div class="line"><a name="l00492"></a><span class="lineno"> 492</span>&#160;<span class="comment">/* type of device init function, implemented in shared lib */</span></div>
<div class="line"><a name="l00493"></a><span class="lineno"><a class="line" href="group____GENERIC__PHY__RF__INTERFACE__.html#gab546721d68ab48e07707dc3b0620d412"> 493</a></span>&#160;<span class="keyword">typedef</span> int(*<a class="code" href="group____GENERIC__PHY__RF__INTERFACE__.html#gab546721d68ab48e07707dc3b0620d412">oai_device_initfunc_t</a>)(<a class="code" href="structopenair0__device__t.html">openair0_device</a> *device, <a class="code" href="structopenair0__config__t.html">openair0_config_t</a> *openair0_cfg);</div>
<div class="line"><a name="l00494"></a><span class="lineno"> 494</span>&#160;<span class="comment">/* type of transport init function, implemented in shared lib */</span></div>
<div class="line"><a name="l00495"></a><span class="lineno"><a class="line" href="group____GENERIC__PHY__RF__INTERFACE__.html#ga5cd5ca6e07ca455ac31c2d8ded78385a"> 495</a></span>&#160;<span class="keyword">typedef</span> int(*<a class="code" href="group____GENERIC__PHY__RF__INTERFACE__.html#ga5cd5ca6e07ca455ac31c2d8ded78385a">oai_transport_initfunc_t</a>)(<a class="code" href="structopenair0__device__t.html">openair0_device</a> *device, <a class="code" href="structopenair0__config__t.html">openair0_config_t</a> *openair0_cfg, <a class="code" href="structeth__params__t.html">eth_params_t</a> *eth_params);</div>
<div class="line"><a name="l00496"></a><span class="lineno"><a class="line" href="group____GENERIC__PHY__RF__INTERFACE__.html#ga022ce7ddc9050e3c7baed6d96473aa4a"> 496</a></span>&#160;<span class="preprocessor">#define UE_MAGICDL 0xA5A5A5A5A5A5A5A5 // UE DL FDD record</span></div>
<div class="line"><a name="l00497"></a><span class="lineno"><a class="line" href="group____GENERIC__PHY__RF__INTERFACE__.html#ga38e28ba9589c01b3a92b8ff93ec5f6af"> 497</a></span>&#160;<span class="preprocessor"></span><span class="preprocessor">#define UE_MAGICUL 0x5A5A5A5A5A5A5A5A // UE UL FDD record</span></div>
<div class="line"><a name="l00498"></a><span class="lineno"> 498</span>&#160;<span class="preprocessor"></span></div>
<div class="line"><a name="l00499"></a><span class="lineno"><a class="line" href="group____GENERIC__PHY__RF__INTERFACE__.html#ga4139a42c4d7e44cf899d9c6f18108f18"> 499</a></span>&#160;<span class="preprocessor">#define ENB_MAGICDL 0xB5B5B5B5B5B5B5B5 // eNB DL FDD record</span></div>
<div class="line"><a name="l00500"></a><span class="lineno"><a class="line" href="group____GENERIC__PHY__RF__INTERFACE__.html#gaaf8339dffb26da7639ae8650651593b3"> 500</a></span>&#160;<span class="preprocessor"></span><span class="preprocessor">#define ENB_MAGICUL 0x5B5B5B5B5B5B5B5B // eNB UL FDD record</span></div>
<div class="line"><a name="l00501"></a><span class="lineno"> 501</span>&#160;<span class="preprocessor"></span></div>
<div class="line"><a name="l00502"></a><span class="lineno"><a class="line" href="group____GENERIC__PHY__RF__INTERFACE__.html#ga6c47321d0813193ce34b1d2de04de068"> 502</a></span>&#160;<span class="preprocessor">#define OPTION_LZ4 0x00000001 // LZ4 compression (option_value is set to compressed size)</span></div>
<div class="line"><a name="l00503"></a><span class="lineno"> 503</span>&#160;<span class="preprocessor"></span></div>
<div class="line"><a name="l00504"></a><span class="lineno"> 504</span>&#160;</div>
<div class="line"><a name="l00505"></a><span class="lineno"><a class="line" href="structsamplesBlockHeader__t.html"> 505</a></span>&#160;<span class="keyword">typedef</span> <span class="keyword">struct </span>{</div>
<div class="line"><a name="l00506"></a><span class="lineno"><a class="line" href="structsamplesBlockHeader__t.html#a9d6ff00928256884c753d8d1d6e5d242"> 506</a></span>&#160; uint64_t <a class="code" href="structsamplesBlockHeader__t.html#a9d6ff00928256884c753d8d1d6e5d242">magic</a>; <span class="comment">// Magic value (see defines above)</span></div>
<div class="line"><a name="l00507"></a><span class="lineno"><a class="line" href="structsamplesBlockHeader__t.html#a30015904d801460b2185c394ef6f4fab"> 507</a></span>&#160; uint32_t <a class="code" href="structsamplesBlockHeader__t.html#a30015904d801460b2185c394ef6f4fab">size</a>; <span class="comment">// Number of samples per antenna to follow this header</span></div>
<div class="line"><a name="l00508"></a><span class="lineno"><a class="line" href="structsamplesBlockHeader__t.html#aef4e02898cfb6b11cdf8d6b375ec7133"> 508</a></span>&#160; uint32_t <a class="code" href="structsamplesBlockHeader__t.html#aef4e02898cfb6b11cdf8d6b375ec7133">nbAnt</a>; <span class="comment">// Total number of antennas following this header</span></div>
<div class="line"><a name="l00509"></a><span class="lineno"> 509</span>&#160; <span class="comment">// Samples per antenna follow this header,</span></div>
<div class="line"><a name="l00510"></a><span class="lineno"> 510</span>&#160; <span class="comment">// i.e. nbAnt = 2 =&gt; this header+samples_antenna_0+samples_antenna_1</span></div>
<div class="line"><a name="l00511"></a><span class="lineno"> 511</span>&#160; <span class="comment">// data following this header in bytes is nbAnt*size*sizeof(sample_t)</span></div>
<div class="line"><a name="l00512"></a><span class="lineno"><a class="line" href="structsamplesBlockHeader__t.html#a8f4c789a1a4f7594c48f4e8653828dd5"> 512</a></span>&#160; uint64_t <a class="code" href="structsamplesBlockHeader__t.html#a8f4c789a1a4f7594c48f4e8653828dd5">timestamp</a>; <span class="comment">// Timestamp value of first sample</span></div>
<div class="line"><a name="l00513"></a><span class="lineno"><a class="line" href="structsamplesBlockHeader__t.html#a7ab7d7500a3de2cbf4cad56d9551a6c1"> 513</a></span>&#160; uint32_t <a class="code" href="structsamplesBlockHeader__t.html#a7ab7d7500a3de2cbf4cad56d9551a6c1">option_value</a>; <span class="comment">// Option value</span></div>
<div class="line"><a name="l00514"></a><span class="lineno"><a class="line" href="structsamplesBlockHeader__t.html#a868352b7fea04360892e1074fff65610"> 514</a></span>&#160; uint32_t <a class="code" href="structsamplesBlockHeader__t.html#a868352b7fea04360892e1074fff65610">option_flag</a>; <span class="comment">// Option flag</span></div>
<div class="line"><a name="l00515"></a><span class="lineno"> 515</span>&#160;} <a class="code" href="structsamplesBlockHeader__t.html">samplesBlockHeader_t</a>;</div>
<div class="line"><a name="l00516"></a><span class="lineno"> 516</span>&#160;</div>
<div class="line"><a name="l00517"></a><span class="lineno"> 517</span>&#160;<span class="preprocessor">#ifdef __cplusplus</span></div>
<div class="line"><a name="l00518"></a><span class="lineno"> 518</span>&#160;<span class="preprocessor"></span><span class="keyword">extern</span> <span class="stringliteral">&quot;C&quot;</span></div>
<div class="line"><a name="l00519"></a><span class="lineno"> 519</span>&#160;{</div>
<div class="line"><a name="l00520"></a><span class="lineno"> 520</span>&#160;<span class="preprocessor">#endif</span></div>
<div class="line"><a name="l00521"></a><span class="lineno"> 521</span>&#160;<span class="preprocessor"></span></div>
<div class="line"><a name="l00522"></a><span class="lineno"> 522</span>&#160;</div>
<div class="line"><a name="l00523"></a><span class="lineno"><a class="line" href="group____GENERIC__PHY__RF__INTERFACE__.html#ga76f2a4a93510cb1c139688780bba9087"> 523</a></span>&#160;<span class="preprocessor">#define DEVICE_SECTION &quot;device&quot;</span></div>
<div class="line"><a name="l00524"></a><span class="lineno"><a class="line" href="group____GENERIC__PHY__RF__INTERFACE__.html#ga4b4bf05f0ed33f257069e771d67bc242"> 524</a></span>&#160;<span class="preprocessor"></span><span class="preprocessor">#define CONFIG_HLP_DEVICE &quot;Identifies the oai device (the interface to RF) to use, the shared lib \&quot;lib_&lt;name&gt;.so\&quot; will be loaded&quot;</span></div>
<div class="line"><a name="l00525"></a><span class="lineno"> 525</span>&#160;<span class="preprocessor"></span></div>
<div class="line"><a name="l00526"></a><span class="lineno"><a class="line" href="group____GENERIC__PHY__RF__INTERFACE__.html#ga31bf6093e54db87ecf87c1b77934de5b"> 526</a></span>&#160;<span class="preprocessor">#define CONFIG_DEVICEOPT_NAME &quot;name&quot;</span></div>
<div class="line"><a name="l00527"></a><span class="lineno"> 527</span>&#160;<span class="preprocessor"></span></div>
<div class="line"><a name="l00528"></a><span class="lineno"> 528</span>&#160;<span class="comment">/* inclusion for device configuration */</span></div>
<div class="line"><a name="l00529"></a><span class="lineno"> 529</span>&#160;<span class="comment">/*---------------------------------------------------------------------------------------------------------------------------------------------------------------------------*/</span></div>
<div class="line"><a name="l00530"></a><span class="lineno"> 530</span>&#160;<span class="comment">/* config parameters for oai device */</span></div>
<div class="line"><a name="l00531"></a><span class="lineno"> 531</span>&#160;<span class="comment">/* optname helpstr paramflags XXXptr defXXXval type numelt */</span></div>
<div class="line"><a name="l00532"></a><span class="lineno"> 532</span>&#160;<span class="comment">/*---------------------------------------------------------------------------------------------------------------------------------------------------------------------------*/</span></div>
<div class="line"><a name="l00533"></a><span class="lineno"><a class="line" href="group____GENERIC__PHY__RF__INTERFACE__.html#gaf86e69cd28ad0a370753a72b0105564e"> 533</a></span>&#160;<span class="preprocessor">#define DEVICE_PARAMS_DESC {\</span></div>
<div class="line"><a name="l00534"></a><span class="lineno"> 534</span>&#160;<span class="preprocessor"> { CONFIG_DEVICEOPT_NAME, CONFIG_HLP_DEVICE, 0, strptr:&amp;devname, defstrval:NULL, TYPE_STRING, 0}\</span></div>
<div class="line"><a name="l00535"></a><span class="lineno"> 535</span>&#160;<span class="preprocessor">}</span></div>
<div class="line"><a name="l00536"></a><span class="lineno"> 536</span>&#160;<span class="preprocessor"></span></div>
<div class="line"><a name="l00537"></a><span class="lineno"> 537</span>&#160;</div>
<div class="line"><a name="l00538"></a><span class="lineno"> 538</span>&#160;</div>
<div class="line"><a name="l00540"></a><span class="lineno"> 540</span>&#160;<span class="keywordtype">char</span> *<a class="code" href="group____GENERIC__PHY__RF__INTERFACE__.html#ga1e5e97f01057673ab3efeb075b865852">get_devname</a>(<span class="keywordtype">int</span> devtype);</div>
<div class="line"><a name="l00542"></a><span class="lineno"> 542</span>&#160;<span class="keywordtype">int</span> <a class="code" href="group____GENERIC__PHY__RF__INTERFACE__.html#ga87add269f0f03ffb0e503c207cd3a32e">openair0_device_load</a>(<a class="code" href="structopenair0__device__t.html">openair0_device</a> *device, <a class="code" href="structopenair0__config__t.html">openair0_config_t</a> *openair0_cfg);</div>
<div class="line"><a name="l00544"></a><span class="lineno"> 544</span>&#160;<span class="keywordtype">int</span> <a class="code" href="group____GENERIC__PHY__RF__INTERFACE__.html#ga609a4ed6e49fa887fd5e5e54f9088c04">openair0_transport_load</a>(<a class="code" href="structopenair0__device__t.html">openair0_device</a> *device, <a class="code" href="structopenair0__config__t.html">openair0_config_t</a> *openair0_cfg, <a class="code" href="structeth__params__t.html">eth_params_t</a> *eth_params);</div>
<div class="line"><a name="l00545"></a><span class="lineno"> 545</span>&#160;</div>
<div class="line"><a name="l00546"></a><span class="lineno"> 546</span>&#160;</div>
<div class="line"><a name="l00550"></a><span class="lineno"> 550</span>&#160;openair0_timestamp <a class="code" href="group____GENERIC__PHY__RF__INTERFACE__.html#ga724be0de49ec67daba90f24750c9f193">get_usrp_time</a>(<a class="code" href="structopenair0__device__t.html">openair0_device</a> *device);</div>
<div class="line"><a name="l00551"></a><span class="lineno"> 551</span>&#160;</div>
<div class="line"><a name="l00557"></a><span class="lineno"> 557</span>&#160;<span class="keywordtype">int</span> <a class="code" href="group____GENERIC__PHY__RF__INTERFACE__.html#ga20a4c133c9e66fe5f391a7766b710cad">openair0_set_rx_frequencies</a>(<a class="code" href="structopenair0__device__t.html">openair0_device</a> *device, <a class="code" href="structopenair0__config__t.html">openair0_config_t</a> *openair0_cfg);</div>
<div class="line"><a name="l00559"></a><span class="lineno"> 559</span>&#160;<span class="keyword">extern</span> <span class="keywordtype">int</span> <a class="code" href="group____GENERIC__PHY__RF__INTERFACE__.html#ga5ef2a931dcd1fc7244a0011a55064548">read_recplayconfig</a>(recplay_conf_t **recplay_conf, recplay_state_t **recplay_state);</div>
<div class="line"><a name="l00561"></a><span class="lineno"> 561</span>&#160;<span class="keyword">extern</span> <span class="keywordtype">void</span> <a class="code" href="group____GENERIC__PHY__RF__INTERFACE__.html#ga1f06faff3079fd4bdd085f76ffde0c8b">iqrecorder_end</a>(<a class="code" href="structopenair0__device__t.html">openair0_device</a> *device);</div>
<div class="line"><a name="l00562"></a><span class="lineno"> 562</span>&#160;</div>
<div class="line"><a name="l00563"></a><span class="lineno"> 563</span>&#160;</div>
<div class="line"><a name="l00564"></a><span class="lineno"> 564</span>&#160;<span class="preprocessor">#include &lt;unistd.h&gt;</span></div>
<div class="line"><a name="l00565"></a><span class="lineno"> 565</span>&#160;<span class="preprocessor">#ifndef gettid</span></div>
<div class="line"><a name="l00566"></a><span class="lineno"><a class="line" href="group____GENERIC__PHY__RF__INTERFACE__.html#gaca759c5726c3d893725d485fbdd63048"> 566</a></span>&#160;<span class="preprocessor"></span><span class="preprocessor">#define gettid() syscall(__NR_gettid)</span></div>
<div class="line"><a name="l00567"></a><span class="lineno"> 567</span>&#160;<span class="preprocessor"></span><span class="preprocessor">#endif</span></div>
<div class="line"><a name="l00568"></a><span class="lineno"> 568</span>&#160;<span class="preprocessor"></span></div>
<div class="line"><a name="l00572"></a><span class="lineno"> 572</span>&#160;<span class="preprocessor">#ifdef __cplusplus</span></div>
<div class="line"><a name="l00573"></a><span class="lineno"> 573</span>&#160;<span class="preprocessor"></span>}</div>
<div class="line"><a name="l00574"></a><span class="lineno"> 574</span>&#160;<span class="preprocessor">#endif</span></div>
<div class="line"><a name="l00575"></a><span class="lineno"> 575</span>&#160;<span class="preprocessor"></span></div>
<div class="line"><a name="l00576"></a><span class="lineno"> 576</span>&#160;<span class="preprocessor">#endif // COMMON_LIB_H</span></div>
<div class="line"><a name="l00577"></a><span class="lineno"> 577</span>&#160;<span class="preprocessor"></span></div>
<div class="ttc" id="structopenair0__config__t_html_a95b1ab3fbef072586d640cdcbe84554a"><div class="ttname"><a href="structopenair0__config__t.html#a95b1ab3fbef072586d640cdcbe84554a">openair0_config_t::recplay_conf</a></div><div class="ttdeci">recplay_conf_t * recplay_conf</div><div class="ttdef"><b>Definition:</b> <a href="common__lib_8h_source.html#l00233">common_lib.h:233</a></div></div>
<div class="ttc" id="group____GENERIC__PHY__RF__INTERFACE___html_ga87add269f0f03ffb0e503c207cd3a32e"><div class="ttname"><a href="group____GENERIC__PHY__RF__INTERFACE__.html#ga87add269f0f03ffb0e503c207cd3a32e">openair0_device_load</a></div><div class="ttdeci">int openair0_device_load(openair0_device *device, openair0_config_t *openair0_cfg)</div><div class="ttdoc">Initialize openair RF target. It returns 0 if OK. </div></div>
<div class="ttc" id="structopenair0__config__t_html_a0aa51a114c5b62c53156ba4659b3447e"><div class="ttname"><a href="structopenair0__config__t.html#a0aa51a114c5b62c53156ba4659b3447e">openair0_config_t::time_source</a></div><div class="ttdeci">clock_source_t time_source</div><div class="ttdoc">timing_source </div><div class="ttdef"><b>Definition:</b> <a href="common__lib_8h_source.html#l00211">common_lib.h:211</a></div></div>
<div class="ttc" id="structopenair0__device__t_html_afdb71036a18e7982ad077c235b28f1c7"><div class="ttname"><a href="structopenair0__device__t.html#afdb71036a18e7982ad077c235b28f1c7">openair0_device_t::configure_rru</a></div><div class="ttdeci">void(* configure_rru)(int idx, void *arg)</div><div class="ttdoc">RRU Configuration callback. </div><div class="ttdef"><b>Definition:</b> <a href="common__lib_8h_source.html#l00459">common_lib.h:459</a></div></div>
<div class="ttc" id="structopenair0__device__t_html_a9058b8d7018f07f95fd09609689f0b44"><div class="ttname"><a href="structopenair0__device__t.html#a9058b8d7018f07f95fd09609689f0b44">openair0_device_t::CC_id</a></div><div class="ttdeci">int CC_id</div><div class="ttdef"><b>Definition:</b> <a href="common__lib_8h_source.html#l00317">common_lib.h:317</a></div></div>
<div class="ttc" id="structopenair0__config__t_html_ab1abed061a06f6fcd79bed1f914b68b5"><div class="ttname"><a href="structopenair0__config__t.html#ab1abed061a06f6fcd79bed1f914b68b5">openair0_config_t::rx_sample_rate</a></div><div class="ttdeci">double rx_sample_rate</div><div class="ttdoc">the sample rate for receive. </div><div class="ttdef"><b>Definition:</b> <a href="common__lib_8h_source.html#l00237">common_lib.h:237</a></div></div>
<div class="ttc" id="structopenair0__thread__t_html"><div class="ttname"><a href="structopenair0__thread__t.html">openair0_thread_t</a></div><div class="ttdef"><b>Definition:</b> <a href="common__lib_8h_source.html#l00292">common_lib.h:292</a></div></div>
<div class="ttc" id="structopenair0__config__t_html_a45f7767d29c7ce903670581a7713eb3f"><div class="ttname"><a href="structopenair0__config__t.html#a45f7767d29c7ce903670581a7713eb3f">openair0_config_t::log_level</a></div><div class="ttdeci">int log_level</div><div class="ttdoc">device log level </div><div class="ttdef"><b>Definition:</b> <a href="common__lib_8h_source.html#l00162">common_lib.h:162</a></div></div>
<div class="ttc" id="group____GENERIC__PHY__RF__INTERFACE___html_gaaa5808d4b389abd0ffaa5a6bf8979b95"><div class="ttname"><a href="group____GENERIC__PHY__RF__INTERFACE__.html#gaaa5808d4b389abd0ffaa5a6bf8979b95">dev_type_t</a></div><div class="ttdeci">dev_type_t</div><div class="ttdoc">RF device types. </div><div class="ttdef"><b>Definition:</b> <a href="common__lib_8h_source.html#l00087">common_lib.h:87</a></div></div>
<div class="ttc" id="structopenair0__config__t_html"><div class="ttname"><a href="structopenair0__config__t.html">openair0_config_t</a></div><div class="ttdoc">RF frontend parameters set by application. </div><div class="ttdef"><b>Definition:</b> <a href="common__lib_8h_source.html#l00158">common_lib.h:158</a></div></div>
<div class="ttc" id="structopenair0__device__t_html_a8ab0f07a3564d6de48302ffcae7f3537"><div class="ttname"><a href="structopenair0__device__t.html#a8ab0f07a3564d6de48302ffcae7f3537">openair0_device_t::trx_write_func2</a></div><div class="ttdeci">int(* trx_write_func2)(openair0_device *device, openair0_timestamp timestamp, void *buff, int nsamps, int antenna_id, int flags)</div><div class="ttdoc">Called to send samples to the RF target. </div><div class="ttdef"><b>Definition:</b> <a href="common__lib_8h_source.html#l00388">common_lib.h:388</a></div></div>
<div class="ttc" id="group____GENERIC__PHY__RF__INTERFACE___html_gga2eaca82b72e3dce80fa4bc6f00405430a56fbb3ffdd6a54939bbf35358afec214"><div class="ttname"><a href="group____GENERIC__PHY__RF__INTERFACE__.html#gga2eaca82b72e3dce80fa4bc6f00405430a56fbb3ffdd6a54939bbf35358afec214">MIN_HOST_TYPE</a></div><div class="ttdef"><b>Definition:</b> <a href="common__lib_8h_source.html#l00127">common_lib.h:127</a></div></div>
<div class="ttc" id="group____GENERIC__PHY__RF__INTERFACE___html_ggaaa5808d4b389abd0ffaa5a6bf8979b95a49c770758ffd580c1407ed4837d1b8de"><div class="ttname"><a href="group____GENERIC__PHY__RF__INTERFACE__.html#ggaaa5808d4b389abd0ffaa5a6bf8979b95a49c770758ffd580c1407ed4837d1b8de">IRIS_DEV</a></div><div class="ttdoc">device is Iris </div><div class="ttdef"><b>Definition:</b> <a href="common__lib_8h_source.html#l00102">common_lib.h:102</a></div></div>
<div class="ttc" id="structopenair0__device__t_html_a4e5d9334a5257be49bf8e50121094ea7"><div class="ttname"><a href="structopenair0__device__t.html#a4e5d9334a5257be49bf8e50121094ea7">openair0_device_t::thirdparty_priv</a></div><div class="ttdeci">void * thirdparty_priv</div><div class="ttdoc">Pointer to generic RRU private information. </div><div class="ttdef"><b>Definition:</b> <a href="common__lib_8h_source.html#l00464">common_lib.h:464</a></div></div>
<div class="ttc" id="structopenair0__device__t_html"><div class="ttname"><a href="structopenair0__device__t.html">openair0_device_t</a></div><div class="ttdoc">structure holds the parameters to configure USRP devices </div><div class="ttdef"><b>Definition:</b> <a href="common__lib_8h_source.html#l00309">common_lib.h:309</a></div></div>
<div class="ttc" id="structopenair0__device__t_html_a14f2c5c56d3bfb67d360910c0b5a1abb"><div class="ttname"><a href="structopenair0__device__t.html#a14f2c5c56d3bfb67d360910c0b5a1abb">openair0_device_t::trx_stop_func</a></div><div class="ttdeci">int(* trx_stop_func)(openair0_device *device)</div><div class="ttdoc">Stop operation of the transceiver. </div><div class="ttdef"><b>Definition:</b> <a href="common__lib_8h_source.html#l00436">common_lib.h:436</a></div></div>
<div class="ttc" id="group____GENERIC__PHY__RF__INTERFACE___html_ggaaa5808d4b389abd0ffaa5a6bf8979b95a9fcafa0a8b21be18eb3da34f21eca235"><div class="ttname"><a href="group____GENERIC__PHY__RF__INTERFACE__.html#ggaaa5808d4b389abd0ffaa5a6bf8979b95a9fcafa0a8b21be18eb3da34f21eca235">USRP_X300_DEV</a></div><div class="ttdoc">device is USRP X300/X310 </div><div class="ttdef"><b>Definition:</b> <a href="common__lib_8h_source.html#l00094">common_lib.h:94</a></div></div>
<div class="ttc" id="structeth__params__t_html_a28c524821470015a8508fd03cb2235c1"><div class="ttname"><a href="structeth__params__t.html#a28c524821470015a8508fd03cb2235c1">eth_params_t::remote_addr</a></div><div class="ttdeci">char * remote_addr</div><div class="ttdef"><b>Definition:</b> <a href="common__lib_8h_source.html#l00254">common_lib.h:254</a></div></div>
<div class="ttc" id="group____GENERIC__PHY__RF__INTERFACE___html_gga306537444209dc91972f17fc71473ff5a6aef01ed9b1c198e6944f87e370f00b2"><div class="ttname"><a href="group____GENERIC__PHY__RF__INTERFACE__.html#gga306537444209dc91972f17fc71473ff5a6aef01ed9b1c198e6944f87e370f00b2">external</a></div><div class="ttdoc">This tells the underlying hardware to use the external reference. </div><div class="ttdef"><b>Definition:</b> <a href="common__lib_8h_source.html#l00151">common_lib.h:151</a></div></div>
<div class="ttc" id="group____GENERIC__PHY__RF__INTERFACE___html_ga609a4ed6e49fa887fd5e5e54f9088c04"><div class="ttname"><a href="group____GENERIC__PHY__RF__INTERFACE__.html#ga609a4ed6e49fa887fd5e5e54f9088c04">openair0_transport_load</a></div><div class="ttdeci">int openair0_transport_load(openair0_device *device, openair0_config_t *openair0_cfg, eth_params_t *eth_params)</div><div class="ttdoc">Initialize transport protocol . It returns 0 if OK. </div></div>
<div class="ttc" id="structeth__params__t_html_a13deb519ea5f11320b3694cc1a20694f"><div class="ttname"><a href="structeth__params__t.html#a13deb519ea5f11320b3694cc1a20694f">eth_params_t::if_compress</a></div><div class="ttdeci">uint8_t if_compress</div><div class="ttdoc">compression enable (0: No comp/ 1: A-LAW) </div><div class="ttdef"><b>Definition:</b> <a href="common__lib_8h_source.html#l00270">common_lib.h:270</a></div></div>
<div class="ttc" id="structopenair0__device__t_html_a2a3ad75f1ee39fba38aee3a2b9a0822a"><div class="ttname"><a href="structopenair0__device__t.html#a2a3ad75f1ee39fba38aee3a2b9a0822a">openair0_device_t::trx_start_func</a></div><div class="ttdeci">int(* trx_start_func)(openair0_device *device)</div><div class="ttdoc">Called to start the transceiver. Return 0 if OK, &amp;lt; 0 if error. </div><div class="ttdef"><b>Definition:</b> <a href="common__lib_8h_source.html#l00347">common_lib.h:347</a></div></div>
<div class="ttc" id="structopenair0__device__t_html_a259a8bb97c4750a6424ae41fa3c5c2ca"><div class="ttname"><a href="structopenair0__device__t.html#a259a8bb97c4750a6424ae41fa3c5c2ca">openair0_device_t::trx_reset_stats_func</a></div><div class="ttdeci">int(* trx_reset_stats_func)(openair0_device *device)</div><div class="ttdoc">Reset device statistics. </div><div class="ttdef"><b>Definition:</b> <a href="common__lib_8h_source.html#l00427">common_lib.h:427</a></div></div>
<div class="ttc" id="structopenair0__config__t_html_a4f84f7346865903d5279f6ff11bc17ed"><div class="ttname"><a href="structopenair0__config__t.html#a4f84f7346865903d5279f6ff11bc17ed">openair0_config_t::sample_rate</a></div><div class="ttdeci">double sample_rate</div><div class="ttdoc">the sample rate for both transmit and receive. </div><div class="ttdef"><b>Definition:</b> <a href="common__lib_8h_source.html#l00170">common_lib.h:170</a></div></div>
<div class="ttc" id="structopenair0__thread__t_html_a844baf6d1fd5d8e6b308270c9f82c051"><div class="ttname"><a href="structopenair0__thread__t.html#a844baf6d1fd5d8e6b308270c9f82c051">openair0_thread_t::cond_write</a></div><div class="ttdeci">pthread_cond_t cond_write</div><div class="ttdoc">condition varible for trx write thread </div><div class="ttdef"><b>Definition:</b> <a href="common__lib_8h_source.html#l00303">common_lib.h:303</a></div></div>
<div class="ttc" id="structopenair0__config__t_html_ad88c6a2684faa259c74515df4e5688b9"><div class="ttname"><a href="structopenair0__config__t.html#ad88c6a2684faa259c74515df4e5688b9">openair0_config_t::configFilename</a></div><div class="ttdeci">char * configFilename</div><div class="ttdoc">Configuration file for LMS7002M. </div><div class="ttdef"><b>Definition:</b> <a href="common__lib_8h_source.html#l00222">common_lib.h:222</a></div></div>
<div class="ttc" id="group____GENERIC__PHY__RF__INTERFACE___html_ga5ef2a931dcd1fc7244a0011a55064548"><div class="ttname"><a href="group____GENERIC__PHY__RF__INTERFACE__.html#ga5ef2a931dcd1fc7244a0011a55064548">read_recplayconfig</a></div><div class="ttdeci">int read_recplayconfig(recplay_conf_t **recplay_conf, recplay_state_t **recplay_state)</div><div class="ttdoc">read the iq record/player configuration </div></div>
<div class="ttc" id="structopenair0__device__t_html_a45b4e2287bfd6532cf5c1aebfa38dacf"><div class="ttname"><a href="structopenair0__device__t.html#a45b4e2287bfd6532cf5c1aebfa38dacf">openair0_device_t::trx_ctlrecv_func</a></div><div class="ttdeci">int(* trx_ctlrecv_func)(openair0_device *device, void *msg, ssize_t msg_len)</div><div class="ttdoc">Called to receive a reply message between RAU-RRU on control port. </div><div class="ttdef"><b>Definition:</b> <a href="common__lib_8h_source.html#l00368">common_lib.h:368</a></div></div>
<div class="ttc" id="structopenair0__write__package__t_html_ac5544809ab8750a746c4cec1c8a1ad8c"><div class="ttname"><a href="structopenair0__write__package__t.html#ac5544809ab8750a746c4cec1c8a1ad8c">openair0_write_package_t::nsamps</a></div><div class="ttdeci">int nsamps</div><div class="ttdef"><b>Definition:</b> <a href="common__lib_8h_source.html#l00285">common_lib.h:285</a></div></div>
<div class="ttc" id="structopenair0__device__t_html_a4f97ba8d1ae444a5392bb367909ba330"><div class="ttname"><a href="structopenair0__device__t.html#a4f97ba8d1ae444a5392bb367909ba330">openair0_device_t::trx_set_gains_func</a></div><div class="ttdeci">int(* trx_set_gains_func)(openair0_device *device, openair0_config_t *openair0_cfg)</div><div class="ttdoc">Set gains. </div><div class="ttdef"><b>Definition:</b> <a href="common__lib_8h_source.html#l00453">common_lib.h:453</a></div></div>
<div class="ttc" id="structopenair0__config__t_html_a36ca375b9b136199ab4385b27f95fccb"><div class="ttname"><a href="structopenair0__config__t.html#a36ca375b9b136199ab4385b27f95fccb">openair0_config_t::rx_gain_calib_table</a></div><div class="ttdeci">rx_gain_calib_table_t * rx_gain_calib_table</div><div class="ttdoc">memory </div><div class="ttdef"><b>Definition:</b> <a href="common__lib_8h_source.html#l00193">common_lib.h:193</a></div></div>
<div class="ttc" id="structopenair0__device__t_html_ae108d08f894211745ef8da1d6b3c8276"><div class="ttname"><a href="structopenair0__device__t.html#ae108d08f894211745ef8da1d6b3c8276">openair0_device_t::trx_read_func</a></div><div class="ttdeci">int(* trx_read_func)(openair0_device *device, openair0_timestamp *ptimestamp, void **buff, int nsamps, int num_antennas)</div><div class="ttdoc">Receive samples from hardware. Read nsamps samples from each channel to buffers. buff[0] is the array...</div><div class="ttdef"><b>Definition:</b> <a href="common__lib_8h_source.html#l00402">common_lib.h:402</a></div></div>
<div class="ttc" id="structopenair0__config__t_html_a79af2dda514d36fbc3264fd5724795ae"><div class="ttname"><a href="structopenair0__config__t.html#a79af2dda514d36fbc3264fd5724795ae">openair0_config_t::recplay_mode</a></div><div class="ttdeci">uint32_t recplay_mode</div><div class="ttdoc">record player configuration, definition in record_player.h </div><div class="ttdef"><b>Definition:</b> <a href="common__lib_8h_source.html#l00232">common_lib.h:232</a></div></div>
<div class="ttc" id="group____GENERIC__PHY__RF__INTERFACE___html_gab69560ebc82af819611d037a0121cc98"><div class="ttname"><a href="group____GENERIC__PHY__RF__INTERFACE__.html#gab69560ebc82af819611d037a0121cc98">transport_type_t</a></div><div class="ttdeci">transport_type_t</div><div class="ttdoc">transport protocol types </div><div class="ttdef"><b>Definition:</b> <a href="common__lib_8h_source.html#l00115">common_lib.h:115</a></div></div>
<div class="ttc" id="structsamplesBlockHeader__t_html_a30015904d801460b2185c394ef6f4fab"><div class="ttname"><a href="structsamplesBlockHeader__t.html#a30015904d801460b2185c394ef6f4fab">samplesBlockHeader_t::size</a></div><div class="ttdeci">uint32_t size</div><div class="ttdef"><b>Definition:</b> <a href="common__lib_8h_source.html#l00507">common_lib.h:507</a></div></div>
<div class="ttc" id="structopenair0__thread__t_html_a5c95792bc9ab981daffd94762b941c09"><div class="ttname"><a href="structopenair0__thread__t.html#a5c95792bc9ab981daffd94762b941c09">openair0_thread_t::start</a></div><div class="ttdeci">int start</div><div class="ttdef"><b>Definition:</b> <a href="common__lib_8h_source.html#l00294">common_lib.h:294</a></div></div>
<div class="ttc" id="structopenair0__write__package__t_html_a3b165b430763a3a13e184e86e3f75418"><div class="ttname"><a href="structopenair0__write__package__t.html#a3b165b430763a3a13e184e86e3f75418">openair0_write_package_t::flags_msb</a></div><div class="ttdeci">int flags_msb</div><div class="ttdef"><b>Definition:</b> <a href="common__lib_8h_source.html#l00289">common_lib.h:289</a></div></div>
<div class="ttc" id="structopenair0__thread__t_html_aa6078d75f5ca8457dc79360a2f83287e"><div class="ttname"><a href="structopenair0__thread__t.html#aa6078d75f5ca8457dc79360a2f83287e">openair0_thread_t::pthread_write</a></div><div class="ttdeci">pthread_t pthread_write</div><div class="ttdoc">pthread struct for trx write thread </div><div class="ttdef"><b>Definition:</b> <a href="common__lib_8h_source.html#l00299">common_lib.h:299</a></div></div>
<div class="ttc" id="structopenair0__config__t_html_ae00e0de09582b48b20c16c5f2c062c38"><div class="ttname"><a href="structopenair0__config__t.html#ae00e0de09582b48b20c16c5f2c062c38">openair0_config_t::remote_port</a></div><div class="ttdeci">unsigned int remote_port</div><div class="ttdoc">remote port number for Ethernet interface </div><div class="ttdef"><b>Definition:</b> <a href="common__lib_8h_source.html#l00226">common_lib.h:226</a></div></div>
<div class="ttc" id="structopenair0__write__package__t_html_a4ee00eecec7b5d7c898805e0abfee9cd"><div class="ttname"><a href="structopenair0__write__package__t.html#a4ee00eecec7b5d7c898805e0abfee9cd">openair0_write_package_t::first_packet</a></div><div class="ttdeci">signed char first_packet</div><div class="ttdef"><b>Definition:</b> <a href="common__lib_8h_source.html#l00287">common_lib.h:287</a></div></div>
<div class="ttc" id="group____GENERIC__PHY__RF__INTERFACE___html_gga2eaca82b72e3dce80fa4bc6f00405430a95f66476b12559b0c2a27430b8eb47e9"><div class="ttname"><a href="group____GENERIC__PHY__RF__INTERFACE__.html#gga2eaca82b72e3dce80fa4bc6f00405430a95f66476b12559b0c2a27430b8eb47e9">RAU_HOST</a></div><div class="ttdoc">device functions within a RAU </div><div class="ttdef"><b>Definition:</b> <a href="common__lib_8h_source.html#l00129">common_lib.h:129</a></div></div>
<div class="ttc" id="structsamplesBlockHeader__t_html_a7ab7d7500a3de2cbf4cad56d9551a6c1"><div class="ttname"><a href="structsamplesBlockHeader__t.html#a7ab7d7500a3de2cbf4cad56d9551a6c1">samplesBlockHeader_t::option_value</a></div><div class="ttdeci">uint32_t option_value</div><div class="ttdef"><b>Definition:</b> <a href="common__lib_8h_source.html#l00513">common_lib.h:513</a></div></div>
<div class="ttc" id="structopenair0__config__t_html_a309204c5cef2f024a413502b9053203d"><div class="ttname"><a href="structopenair0__config__t.html#a309204c5cef2f024a413502b9053203d">openair0_config_t::iq_rxrescale</a></div><div class="ttdeci">int iq_rxrescale</div><div class="ttdef"><b>Definition:</b> <a href="common__lib_8h_source.html#l00220">common_lib.h:220</a></div></div>
<div class="ttc" id="group____GENERIC__PHY__RF__INTERFACE___html_ggaaa5808d4b389abd0ffaa5a6bf8979b95aba5e4e19cdc634e2cdd0a45c2cbfb64d"><div class="ttname"><a href="group____GENERIC__PHY__RF__INTERFACE__.html#ggaaa5808d4b389abd0ffaa5a6bf8979b95aba5e4e19cdc634e2cdd0a45c2cbfb64d">USRP_B200_DEV</a></div><div class="ttdoc">device is USRP B200/B210 </div><div class="ttdef"><b>Definition:</b> <a href="common__lib_8h_source.html#l00092">common_lib.h:92</a></div></div>
<div class="ttc" id="structopenair0__rf__map_html_ae2842aac50ccd52cfb010413f45a1196"><div class="ttname"><a href="structopenair0__rf__map.html#ae2842aac50ccd52cfb010413f45a1196">openair0_rf_map::card</a></div><div class="ttdeci">int card</div><div class="ttdoc">card id </div><div class="ttdef"><b>Definition:</b> <a href="common__lib_8h_source.html#l00247">common_lib.h:247</a></div></div>
<div class="ttc" id="structopenair0__device__t_html_a27b16daa24a6dd438ded9c9fbce19a27"><div class="ttname"><a href="structopenair0__device__t.html#a27b16daa24a6dd438ded9c9fbce19a27">openair0_device_t::host_type</a></div><div class="ttdeci">host_type_t host_type</div><div class="ttdef"><b>Definition:</b> <a href="common__lib_8h_source.html#l00326">common_lib.h:326</a></div></div>
<div class="ttc" id="structif__buffer__t_html_afce30aa05ce77e0eb22d91a148e23233"><div class="ttname"><a href="structif__buffer__t.html#afce30aa05ce77e0eb22d91a148e23233">if_buffer_t::rx</a></div><div class="ttdeci">void * rx</div><div class="ttdoc">Rx buffer for if device. </div><div class="ttdef"><b>Definition:</b> <a href="common__lib_8h_source.html#l00279">common_lib.h:279</a></div></div>
<div class="ttc" id="structopenair0__config__t_html_ac691df2b1dacb97e28e5a531043fccc8"><div class="ttname"><a href="structopenair0__config__t.html#ac691df2b1dacb97e28e5a531043fccc8">openair0_config_t::samples_per_tti</a></div><div class="ttdeci">unsigned int samples_per_tti</div><div class="ttdoc">number of samples per tti </div><div class="ttdef"><b>Definition:</b> <a href="common__lib_8h_source.html#l00235">common_lib.h:235</a></div></div>
<div class="ttc" id="structopenair0__write__package__t_html_af754d0ce3e74bdaab788817fccd51c4b"><div class="ttname"><a href="structopenair0__write__package__t.html#af754d0ce3e74bdaab788817fccd51c4b">openair0_write_package_t::timestamp</a></div><div class="ttdeci">openair0_timestamp timestamp</div><div class="ttdef"><b>Definition:</b> <a href="common__lib_8h_source.html#l00283">common_lib.h:283</a></div></div>
<div class="ttc" id="structopenair0__device__t_html_af31d194f4688283fa7e1dac964b20b5e"><div class="ttname"><a href="structopenair0__device__t.html#af31d194f4688283fa7e1dac964b20b5e">openair0_device_t::openair0_cfg</a></div><div class="ttdeci">openair0_config_t * openair0_cfg</div><div class="ttdef"><b>Definition:</b> <a href="common__lib_8h_source.html#l00329">common_lib.h:329</a></div></div>
<div class="ttc" id="structopenair0__device__t_html_acc3a7d85604cb01ae1b5c2fd06d5977a"><div class="ttname"><a href="structopenair0__device__t.html#acc3a7d85604cb01ae1b5c2fd06d5977a">openair0_device_t::trx_ctlsend_func</a></div><div class="ttdeci">int(* trx_ctlsend_func)(openair0_device *device, void *msg, ssize_t msg_len)</div><div class="ttdoc">Called to send a request message between RAU-RRU on control port. </div><div class="ttdef"><b>Definition:</b> <a href="common__lib_8h_source.html#l00361">common_lib.h:361</a></div></div>
<div class="ttc" id="structopenair0__thread__t_html_ae9612307d1e4bbfb38886dd60a2cd8ed"><div class="ttname"><a href="structopenair0__thread__t.html#ae9612307d1e4bbfb38886dd60a2cd8ed">openair0_thread_t::end</a></div><div class="ttdeci">int end</div><div class="ttdef"><b>Definition:</b> <a href="common__lib_8h_source.html#l00295">common_lib.h:295</a></div></div>
<div class="ttc" id="group____GENERIC__PHY__RF__INTERFACE___html_gab546721d68ab48e07707dc3b0620d412"><div class="ttname"><a href="group____GENERIC__PHY__RF__INTERFACE__.html#gab546721d68ab48e07707dc3b0620d412">oai_device_initfunc_t</a></div><div class="ttdeci">int(* oai_device_initfunc_t)(openair0_device *device, openair0_config_t *openair0_cfg)</div><div class="ttdef"><b>Definition:</b> <a href="common__lib_8h_source.html#l00493">common_lib.h:493</a></div></div>
<div class="ttc" id="group____GENERIC__PHY__RF__INTERFACE___html_ga20a4c133c9e66fe5f391a7766b710cad"><div class="ttname"><a href="group____GENERIC__PHY__RF__INTERFACE__.html#ga20a4c133c9e66fe5f391a7766b710cad">openair0_set_rx_frequencies</a></div><div class="ttdeci">int openair0_set_rx_frequencies(openair0_device *device, openair0_config_t *openair0_cfg)</div><div class="ttdoc">Set RX frequencies. </div><div class="ttdef"><b>Definition:</b> <a href="usrp__lib_8cpp_source.html#l00778">usrp_lib.cpp:778</a></div></div>
<div class="ttc" id="structopenair0__rf__map_html_a58606d900e601316a537bf35ddc744ef"><div class="ttname"><a href="structopenair0__rf__map.html#a58606d900e601316a537bf35ddc744ef">openair0_rf_map::chain</a></div><div class="ttdeci">int chain</div><div class="ttdoc">rf chain id </div><div class="ttdef"><b>Definition:</b> <a href="common__lib_8h_source.html#l00249">common_lib.h:249</a></div></div>
<div class="ttc" id="structsamplesBlockHeader__t_html"><div class="ttname"><a href="structsamplesBlockHeader__t.html">samplesBlockHeader_t</a></div><div class="ttdef"><b>Definition:</b> <a href="common__lib_8h_source.html#l00505">common_lib.h:505</a></div></div>
<div class="ttc" id="structopenair0__device__t_html_aae425138eefc6ed6d6205c6e942e2e3e"><div class="ttname"><a href="structopenair0__device__t.html#aae425138eefc6ed6d6205c6e942e2e3e">openair0_device_t::eth_params</a></div><div class="ttdeci">eth_params_t * eth_params</div><div class="ttdef"><b>Definition:</b> <a href="common__lib_8h_source.html#l00332">common_lib.h:332</a></div></div>
<div class="ttc" id="structopenair0__config__t_html_ae9b75daa2808da83e5fcd76c714454ee"><div class="ttname"><a href="structopenair0__config__t.html#ae9b75daa2808da83e5fcd76c714454ee">openair0_config_t::my_addr</a></div><div class="ttdeci">char * my_addr</div><div class="ttdoc">local IP/MAC addr for Ethernet interface (eNB/BBU, UE) </div><div class="ttdef"><b>Definition:</b> <a href="common__lib_8h_source.html#l00228">common_lib.h:228</a></div></div>
<div class="ttc" id="group____GENERIC__PHY__RF__INTERFACE___html_ggab69560ebc82af819611d037a0121cc98aeec61428a26c9848938dff090c39800c"><div class="ttname"><a href="group____GENERIC__PHY__RF__INTERFACE__.html#ggab69560ebc82af819611d037a0121cc98aeec61428a26c9848938dff090c39800c">MAX_TRANSP_TYPE</a></div><div class="ttdef"><b>Definition:</b> <a href="common__lib_8h_source.html#l00121">common_lib.h:121</a></div></div>
<div class="ttc" id="group____GENERIC__PHY__RF__INTERFACE___html_ggaaa5808d4b389abd0ffaa5a6bf8979b95a81f2c35e30895729c96f88e44269c61c"><div class="ttname"><a href="group____GENERIC__PHY__RF__INTERFACE__.html#ggaaa5808d4b389abd0ffaa5a6bf8979b95a81f2c35e30895729c96f88e44269c61c">EXMIMO_DEV</a></div><div class="ttdoc">device is ExpressMIMO </div><div class="ttdef"><b>Definition:</b> <a href="common__lib_8h_source.html#l00090">common_lib.h:90</a></div></div>
<div class="ttc" id="structopenair0__config__t_html_a0c479543c8998390076751412aace631"><div class="ttname"><a href="structopenair0__config__t.html#a0c479543c8998390076751412aace631">openair0_config_t::tx_sample_rate</a></div><div class="ttdeci">double tx_sample_rate</div><div class="ttdoc">the sample rate for transmit. </div><div class="ttdef"><b>Definition:</b> <a href="common__lib_8h_source.html#l00239">common_lib.h:239</a></div></div>
<div class="ttc" id="group____GENERIC__PHY__RF__INTERFACE___html_gga2eaca82b72e3dce80fa4bc6f00405430ab9881c2b3691fe35a8c4da225b86edf3"><div class="ttname"><a href="group____GENERIC__PHY__RF__INTERFACE__.html#gga2eaca82b72e3dce80fa4bc6f00405430ab9881c2b3691fe35a8c4da225b86edf3">MAX_HOST_TYPE</a></div><div class="ttdef"><b>Definition:</b> <a href="common__lib_8h_source.html#l00132">common_lib.h:132</a></div></div>
<div class="ttc" id="group____GENERIC__PHY__RF__INTERFACE___html_ggaaa5808d4b389abd0ffaa5a6bf8979b95a148c86a8baed1ac3ce6cb488670b5b4f"><div class="ttname"><a href="group____GENERIC__PHY__RF__INTERFACE__.html#ggaaa5808d4b389abd0ffaa5a6bf8979b95a148c86a8baed1ac3ce6cb488670b5b4f">NONE_DEV</a></div><div class="ttdoc">device is NONE </div><div class="ttdef"><b>Definition:</b> <a href="common__lib_8h_source.html#l00104">common_lib.h:104</a></div></div>
<div class="ttc" id="structopenair0__device__t_html_a82b2a6b2961e16cf4266c701e6ff5562"><div class="ttname"><a href="structopenair0__device__t.html#a82b2a6b2961e16cf4266c701e6ff5562">openair0_device_t::trx_set_freq_func</a></div><div class="ttdeci">int(* trx_set_freq_func)(openair0_device *device, openair0_config_t *openair0_cfg, int exmimo_dump_config)</div><div class="ttdoc">Set RX feaquencies. </div><div class="ttdef"><b>Definition:</b> <a href="common__lib_8h_source.html#l00446">common_lib.h:446</a></div></div>
<div class="ttc" id="structopenair0__config__t_html_ab3b3593cfaa56b87b5d8e970d9ff98d6"><div class="ttname"><a href="structopenair0__config__t.html#ab3b3593cfaa56b87b5d8e970d9ff98d6">openair0_config_t::samples_per_packet</a></div><div class="ttdeci">int samples_per_packet</div><div class="ttdoc">samples per packet on the fronthaul interface </div><div class="ttdef"><b>Definition:</b> <a href="common__lib_8h_source.html#l00176">common_lib.h:176</a></div></div>
<div class="ttc" id="structopenair0__config__t_html_a4360e61f7658a21efafc3b2ca75eb33c"><div class="ttname"><a href="structopenair0__config__t.html#a4360e61f7658a21efafc3b2ca75eb33c">openair0_config_t::sdr_addrs</a></div><div class="ttdeci">char * sdr_addrs</div><div class="ttdoc">Manual SDR IP address. </div><div class="ttdef"><b>Definition:</b> <a href="common__lib_8h_source.html#l00214">common_lib.h:214</a></div></div>
<div class="ttc" id="structopenair0__device__t_html_af6d3431966004aabb2dea1d5d44ceda0"><div class="ttname"><a href="structopenair0__device__t.html#af6d3431966004aabb2dea1d5d44ceda0">openair0_device_t::type</a></div><div class="ttdeci">dev_type_t type</div><div class="ttdef"><b>Definition:</b> <a href="common__lib_8h_source.html#l00320">common_lib.h:320</a></div></div>
<div class="ttc" id="structopenair0__device__t_html_aca56a70c10571b830ef148ff0ddddc59"><div class="ttname"><a href="structopenair0__device__t.html#aca56a70c10571b830ef148ff0ddddc59">openair0_device_t::transp_type</a></div><div class="ttdeci">transport_type_t transp_type</div><div class="ttdef"><b>Definition:</b> <a href="common__lib_8h_source.html#l00323">common_lib.h:323</a></div></div>
<div class="ttc" id="group____GENERIC__PHY__RF__INTERFACE___html_ggab69560ebc82af819611d037a0121cc98ad07d016205c095e107a8dbfbe0d14e98"><div class="ttname"><a href="group____GENERIC__PHY__RF__INTERFACE__.html#ggab69560ebc82af819611d037a0121cc98ad07d016205c095e107a8dbfbe0d14e98">ETHERNET_TP</a></div><div class="ttdoc">transport protocol ETHERNET </div><div class="ttdef"><b>Definition:</b> <a href="common__lib_8h_source.html#l00118">common_lib.h:118</a></div></div>
<div class="ttc" id="structopenair0__config__t_html_ac723300aef5ada036a69bcd30bd54c8f"><div class="ttname"><a href="structopenair0__config__t.html#ac723300aef5ada036a69bcd30bd54c8f">openair0_config_t::threequarter_fs</a></div><div class="ttdeci">int8_t threequarter_fs</div><div class="ttdoc">check for threequarter sampling rate </div><div class="ttdef"><b>Definition:</b> <a href="common__lib_8h_source.html#l00241">common_lib.h:241</a></div></div>
<div class="ttc" id="group____GENERIC__PHY__RF__INTERFACE___html_ga1e5e97f01057673ab3efeb075b865852"><div class="ttname"><a href="group____GENERIC__PHY__RF__INTERFACE__.html#ga1e5e97f01057673ab3efeb075b865852">get_devname</a></div><div class="ttdeci">char * get_devname(int devtype)</div><div class="ttdoc">get device name from device type </div></div>
<div class="ttc" id="structopenair0__config__t_html_a172d0e6c28acf03a69b4ca2a7cef1725"><div class="ttname"><a href="structopenair0__config__t.html#a172d0e6c28acf03a69b4ca2a7cef1725">openair0_config_t::my_port</a></div><div class="ttdeci">unsigned int my_port</div><div class="ttdoc">local port number for Ethernet interface (eNB/BBU, UE) </div><div class="ttdef"><b>Definition:</b> <a href="common__lib_8h_source.html#l00230">common_lib.h:230</a></div></div>
<div class="ttc" id="structopenair0__device__t_html_aec43dbef661454499203121bba63b043"><div class="ttname"><a href="structopenair0__device__t.html#aec43dbef661454499203121bba63b043">openair0_device_t::recplay_state</a></div><div class="ttdeci">recplay_state_t * recplay_state</div><div class="ttdoc">record player data, definition in record_player.h </div><div class="ttdef"><b>Definition:</b> <a href="common__lib_8h_source.html#l00334">common_lib.h:334</a></div></div>
<div class="ttc" id="structeth__params__t_html_a6f884345f641384b8585bb3e0f8e8000"><div class="ttname"><a href="structeth__params__t.html#a6f884345f641384b8585bb3e0f8e8000">eth_params_t::remote_portd</a></div><div class="ttdeci">uint16_t remote_portd</div><div class="ttdoc">remote port number for Ethernet interface (user) </div><div class="ttdef"><b>Definition:</b> <a href="common__lib_8h_source.html#l00258">common_lib.h:258</a></div></div>
<div class="ttc" id="structopenair0__device__t_html_afec2fbe0d81987e2093c3daf8fc4355a"><div class="ttname"><a href="structopenair0__device__t.html#afec2fbe0d81987e2093c3daf8fc4355a">openair0_device_t::trx_read_func2</a></div><div class="ttdeci">int(* trx_read_func2)(openair0_device *device, openair0_timestamp *ptimestamp, void *buff, int nsamps, int *antenna_id)</div><div class="ttdoc">Receive samples from hardware, this version provides a single antenna at a time and returns...</div><div class="ttdef"><b>Definition:</b> <a href="common__lib_8h_source.html#l00415">common_lib.h:415</a></div></div>
<div class="ttc" id="structopenair0__device__t_html_ac36b80527a9850cc1a021f4f825c49d1"><div class="ttname"><a href="structopenair0__device__t.html#ac36b80527a9850cc1a021f4f825c49d1">openair0_device_t::trx_write_func</a></div><div class="ttdeci">int(* trx_write_func)(openair0_device *device, openair0_timestamp timestamp, void **buff, int nsamps, int antenna_id, int flags)</div><div class="ttdoc">Called to send samples to the RF target. </div><div class="ttdef"><b>Definition:</b> <a href="common__lib_8h_source.html#l00378">common_lib.h:378</a></div></div>
<div class="ttc" id="structopenair0__device__t_html_a5d01fbd97c3f4f7cae0945ab1d1c52aa"><div class="ttname"><a href="structopenair0__device__t.html#a5d01fbd97c3f4f7cae0945ab1d1c52aa">openair0_device_t::is_init</a></div><div class="ttdeci">int is_init</div><div class="ttdef"><b>Definition:</b> <a href="common__lib_8h_source.html#l00336">common_lib.h:336</a></div></div>
<div class="ttc" id="structif__buffer__t_html"><div class="ttname"><a href="structif__buffer__t.html">if_buffer_t</a></div><div class="ttdef"><b>Definition:</b> <a href="common__lib_8h_source.html#l00273">common_lib.h:273</a></div></div>
<div class="ttc" id="structopenair0__device__t_html_afd3417564d89c5940326c51b3f367ec2"><div class="ttname"><a href="structopenair0__device__t.html#afd3417564d89c5940326c51b3f367ec2">openair0_device_t::Mod_id</a></div><div class="ttdeci">int Mod_id</div><div class="ttdef"><b>Definition:</b> <a href="common__lib_8h_source.html#l00314">common_lib.h:314</a></div></div>
<div class="ttc" id="structopenair0__device__t_html_accbaf10907905da0fb039af8908535d7"><div class="ttname"><a href="structopenair0__device__t.html#accbaf10907905da0fb039af8908535d7">openair0_device_t::trx_write_init</a></div><div class="ttdeci">int(* trx_write_init)(openair0_device *device)</div><div class="ttdoc">RRU Configuration callback. </div><div class="ttdef"><b>Definition:</b> <a href="common__lib_8h_source.html#l00484">common_lib.h:484</a></div></div>
<div class="ttc" id="structopenair0__device__t_html_a8561d9c34df9b5d74b974466721e6929"><div class="ttname"><a href="structopenair0__device__t.html#a8561d9c34df9b5d74b974466721e6929">openair0_device_t::priv</a></div><div class="ttdeci">void * priv</div><div class="ttdef"><b>Definition:</b> <a href="common__lib_8h_source.html#l00340">common_lib.h:340</a></div></div>
<div class="ttc" id="group____GENERIC__PHY__RF__INTERFACE___html_gga306537444209dc91972f17fc71473ff5ae2e00f1f847192ece7d24256cf9505b1"><div class="ttname"><a href="group____GENERIC__PHY__RF__INTERFACE__.html#gga306537444209dc91972f17fc71473ff5ae2e00f1f847192ece7d24256cf9505b1">gpsdo</a></div><div class="ttdoc">This tells the underlying hardware to use the gpsdo reference. </div><div class="ttdef"><b>Definition:</b> <a href="common__lib_8h_source.html#l00153">common_lib.h:153</a></div></div>
<div class="ttc" id="structeth__params__t_html_ad8098226503aa2e2ab27768c06a4def1"><div class="ttname"><a href="structeth__params__t.html#ad8098226503aa2e2ab27768c06a4def1">eth_params_t::my_addr</a></div><div class="ttdeci">char * my_addr</div><div class="ttdoc">local IP/MAC addr for Ethernet interface (eNB/RAU, UE) </div><div class="ttdef"><b>Definition:</b> <a href="common__lib_8h_source.html#l00260">common_lib.h:260</a></div></div>
<div class="ttc" id="structif__buffer__t_html_a2547ae9b87c2defff57faf96a7640f36"><div class="ttname"><a href="structif__buffer__t.html#a2547ae9b87c2defff57faf96a7640f36">if_buffer_t::tx_prach</a></div><div class="ttdeci">void * tx_prach</div><div class="ttdoc">Tx buffer (PRACH) for if device. </div><div class="ttdef"><b>Definition:</b> <a href="common__lib_8h_source.html#l00277">common_lib.h:277</a></div></div>
<div class="ttc" id="structopenair0__thread__t_html_a4c3a935f1ecfe59a3788d36e4134d67f"><div class="ttname"><a href="structopenair0__thread__t.html#a4c3a935f1ecfe59a3788d36e4134d67f">openair0_thread_t::attr_write</a></div><div class="ttdeci">pthread_attr_t attr_write</div><div class="ttdoc">pthread attributes for trx write thread </div><div class="ttdef"><b>Definition:</b> <a href="common__lib_8h_source.html#l00301">common_lib.h:301</a></div></div>
<div class="ttc" id="structopenair0__device__t_html_a838459a1803d7aef9c17c48a3597149c"><div class="ttname"><a href="structopenair0__device__t.html#a838459a1803d7aef9c17c48a3597149c">openair0_device_t::trx_end_func</a></div><div class="ttdeci">void(* trx_end_func)(openair0_device *device)</div><div class="ttdoc">Terminate operation of the transceiver free all associated resources. </div><div class="ttdef"><b>Definition:</b> <a href="common__lib_8h_source.html#l00432">common_lib.h:432</a></div></div>
<div class="ttc" id="structopenair0__device__t_html_ab12a26c3776e8a9b09bca0a507f43493"><div class="ttname"><a href="structopenair0__device__t.html#ab12a26c3776e8a9b09bca0a507f43493">openair0_device_t::trx_config_func</a></div><div class="ttdeci">int(* trx_config_func)(openair0_device *device, openair0_config_t *openair0_cfg)</div><div class="ttdoc">Called to configure the device. </div><div class="ttdef"><b>Definition:</b> <a href="common__lib_8h_source.html#l00354">common_lib.h:354</a></div></div>
<div class="ttc" id="group____GENERIC__PHY__RF__INTERFACE___html_ggaaa5808d4b389abd0ffaa5a6bf8979b95a426d2c2d06777d36f61a596180ba2bdb"><div class="ttname"><a href="group____GENERIC__PHY__RF__INTERFACE__.html#ggaaa5808d4b389abd0ffaa5a6bf8979b95a426d2c2d06777d36f61a596180ba2bdb">BLADERF_DEV</a></div><div class="ttdoc">device is BLADE RF </div><div class="ttdef"><b>Definition:</b> <a href="common__lib_8h_source.html#l00098">common_lib.h:98</a></div></div>
<div class="ttc" id="group____GENERIC__PHY__RF__INTERFACE___html_ggaaa5808d4b389abd0ffaa5a6bf8979b95a5679adeb284555f47da34938e83238bc"><div class="ttname"><a href="group____GENERIC__PHY__RF__INTERFACE__.html#ggaaa5808d4b389abd0ffaa5a6bf8979b95a5679adeb284555f47da34938e83238bc">MIN_RF_DEV_TYPE</a></div><div class="ttdef"><b>Definition:</b> <a href="common__lib_8h_source.html#l00088">common_lib.h:88</a></div></div>
<div class="ttc" id="group____GENERIC__PHY__RF__INTERFACE___html_gga2eaca82b72e3dce80fa4bc6f00405430aa091d53cb7c8ea5fe12a63d6072c8625"><div class="ttname"><a href="group____GENERIC__PHY__RF__INTERFACE__.html#gga2eaca82b72e3dce80fa4bc6f00405430aa091d53cb7c8ea5fe12a63d6072c8625">RRU_HOST</a></div><div class="ttdoc">device functions within a RRU </div><div class="ttdef"><b>Definition:</b> <a href="common__lib_8h_source.html#l00131">common_lib.h:131</a></div></div>
<div class="ttc" id="group____GENERIC__PHY__RF__INTERFACE___html_ga724be0de49ec67daba90f24750c9f193"><div class="ttname"><a href="group____GENERIC__PHY__RF__INTERFACE__.html#ga724be0de49ec67daba90f24750c9f193">get_usrp_time</a></div><div class="ttdeci">openair0_timestamp get_usrp_time(openair0_device *device)</div><div class="ttdoc">Get current timestamp of USRP. </div></div>
<div class="ttc" id="group____GENERIC__PHY__RF__INTERFACE___html_ga1f06faff3079fd4bdd085f76ffde0c8b"><div class="ttname"><a href="group____GENERIC__PHY__RF__INTERFACE__.html#ga1f06faff3079fd4bdd085f76ffde0c8b">iqrecorder_end</a></div><div class="ttdeci">void iqrecorder_end(openair0_device *device)</div><div class="ttdoc">store recorded iqs from memory to file. </div></div>
<div class="ttc" id="structsamplesBlockHeader__t_html_a8f4c789a1a4f7594c48f4e8653828dd5"><div class="ttname"><a href="structsamplesBlockHeader__t.html#a8f4c789a1a4f7594c48f4e8653828dd5">samplesBlockHeader_t::timestamp</a></div><div class="ttdeci">uint64_t timestamp</div><div class="ttdef"><b>Definition:</b> <a href="common__lib_8h_source.html#l00512">common_lib.h:512</a></div></div>
<div class="ttc" id="structopenair0__device__t_html_a1561d90fd09b7a80f2491abcbf3b1356"><div class="ttname"><a href="structopenair0__device__t.html#a1561d90fd09b7a80f2491abcbf3b1356">openair0_device_t::trx_get_stats_func</a></div><div class="ttdeci">int(* trx_get_stats_func)(openair0_device *device)</div><div class="ttdoc">print the device statistics </div><div class="ttdef"><b>Definition:</b> <a href="common__lib_8h_source.html#l00421">common_lib.h:421</a></div></div>
<div class="ttc" id="structopenair0__config__t_html_acb5f4a44bc209245a53c12a749541101"><div class="ttname"><a href="structopenair0__config__t.html#acb5f4a44bc209245a53c12a749541101">openair0_config_t::iq_txshift</a></div><div class="ttdeci">int iq_txshift</div><div class="ttdef"><b>Definition:</b> <a href="common__lib_8h_source.html#l00219">common_lib.h:219</a></div></div>
<div class="ttc" id="structopenair0__thread__t_html_abefca45c14975b7c330afc3fb8bf28a3"><div class="ttname"><a href="structopenair0__thread__t.html#abefca45c14975b7c330afc3fb8bf28a3">openair0_thread_t::count_write</a></div><div class="ttdeci">int count_write</div><div class="ttdef"><b>Definition:</b> <a href="common__lib_8h_source.html#l00297">common_lib.h:297</a></div></div>
<div class="ttc" id="structopenair0__config__t_html_aa9ecfb675c8232b8390f18c6cf42d93f"><div class="ttname"><a href="structopenair0__config__t.html#aa9ecfb675c8232b8390f18c6cf42d93f">openair0_config_t::rx_num_channels</a></div><div class="ttdeci">int rx_num_channels</div><div class="ttdoc">number of RX channels (=RX antennas) </div><div class="ttdef"><b>Definition:</b> <a href="common__lib_8h_source.html#l00178">common_lib.h:178</a></div></div>
<div class="ttc" id="group____GENERIC__PHY__RF__INTERFACE___html_ggaaa5808d4b389abd0ffaa5a6bf8979b95ae4577ef9d478874f2f41b0b936822717"><div class="ttname"><a href="group____GENERIC__PHY__RF__INTERFACE__.html#ggaaa5808d4b389abd0ffaa5a6bf8979b95ae4577ef9d478874f2f41b0b936822717">UEDv2_DEV</a></div><div class="ttdoc">device is UEDv2 </div><div class="ttdef"><b>Definition:</b> <a href="common__lib_8h_source.html#l00108">common_lib.h:108</a></div></div>
<div class="ttc" id="structopenair0__config__t_html_ad6e124f006c1cf095930a902214ea054"><div class="ttname"><a href="structopenair0__config__t.html#ad6e124f006c1cf095930a902214ea054">openair0_config_t::rx_bw</a></div><div class="ttdeci">double rx_bw</div><div class="ttdoc">RX bandwidth in Hz. </div><div class="ttdef"><b>Definition:</b> <a href="common__lib_8h_source.html#l00205">common_lib.h:205</a></div></div>
<div class="ttc" id="structopenair0__config__t_html_af2a7bfacbf1df9d5570d1dbc37687584"><div class="ttname"><a href="structopenair0__config__t.html#af2a7bfacbf1df9d5570d1dbc37687584">openair0_config_t::duplex_mode</a></div><div class="ttdeci">duplex_mode_t duplex_mode</div><div class="ttdoc">duplexing mode </div><div class="ttdef"><b>Definition:</b> <a href="common__lib_8h_source.html#l00164">common_lib.h:164</a></div></div>
<div class="ttc" id="structopenair0__device__t_html_a2859ae1bcad26ea7c5c1829c36f3afaf"><div class="ttname"><a href="structopenair0__device__t.html#a2859ae1bcad26ea7c5c1829c36f3afaf">openair0_device_t::thirdparty_cleanup</a></div><div class="ttdeci">int(* thirdparty_cleanup)(openair0_device *device)</div><div class="ttdoc">Callback for Third-party RRU Cleanup routine. </div><div class="ttdef"><b>Definition:</b> <a href="common__lib_8h_source.html#l00473">common_lib.h:473</a></div></div>
<div class="ttc" id="structopenair0__config__t_html_a493b219ffa776236a0ef44166898a5a6"><div class="ttname"><a href="structopenair0__config__t.html#a493b219ffa776236a0ef44166898a5a6">openair0_config_t::samples_per_frame</a></div><div class="ttdeci">unsigned int samples_per_frame</div><div class="ttdoc">number of samples per frame </div><div class="ttdef"><b>Definition:</b> <a href="common__lib_8h_source.html#l00168">common_lib.h:168</a></div></div>
<div class="ttc" id="structopenair0__config__t_html_af96c0d5571a1d2514ea0ab28e2e978ae"><div class="ttname"><a href="structopenair0__config__t.html#af96c0d5571a1d2514ea0ab28e2e978ae">openair0_config_t::remote_addr</a></div><div class="ttdeci">char * remote_addr</div><div class="ttdoc">remote IP/MAC addr for Ethernet interface </div><div class="ttdef"><b>Definition:</b> <a href="common__lib_8h_source.html#l00224">common_lib.h:224</a></div></div>
<div class="ttc" id="structrx__gain__calib__table__t_html"><div class="ttname"><a href="structrx__gain__calib__table__t.html">rx_gain_calib_table_t</a></div><div class="ttdoc">RF Gain clibration. </div><div class="ttdef"><b>Definition:</b> <a href="common__lib_8h_source.html#l00137">common_lib.h:137</a></div></div>
<div class="ttc" id="structopenair0__write__package__t_html_a8cae5e7322eae32a710c66383ad38034"><div class="ttname"><a href="structopenair0__write__package__t.html#a8cae5e7322eae32a710c66383ad38034">openair0_write_package_t::cc</a></div><div class="ttdeci">int cc</div><div class="ttdef"><b>Definition:</b> <a href="common__lib_8h_source.html#l00286">common_lib.h:286</a></div></div>
<div class="ttc" id="group____GENERIC__PHY__RF__INTERFACE___html_ggaaa5808d4b389abd0ffaa5a6bf8979b95a869fbe11c32e1915a55fa98b4057efc1"><div class="ttname"><a href="group____GENERIC__PHY__RF__INTERFACE__.html#ggaaa5808d4b389abd0ffaa5a6bf8979b95a869fbe11c32e1915a55fa98b4057efc1">RFSIMULATOR</a></div><div class="ttdef"><b>Definition:</b> <a href="common__lib_8h_source.html#l00109">common_lib.h:109</a></div></div>
<div class="ttc" id="structsamplesBlockHeader__t_html_a868352b7fea04360892e1074fff65610"><div class="ttname"><a href="structsamplesBlockHeader__t.html#a868352b7fea04360892e1074fff65610">samplesBlockHeader_t::option_flag</a></div><div class="ttdeci">uint32_t option_flag</div><div class="ttdef"><b>Definition:</b> <a href="common__lib_8h_source.html#l00514">common_lib.h:514</a></div></div>
<div class="ttc" id="structrx__gain__calib__table__t_html_ad573e88571a699ddf5b63efbdf01ae01"><div class="ttname"><a href="structrx__gain__calib__table__t.html#ad573e88571a699ddf5b63efbdf01ae01">rx_gain_calib_table_t::freq</a></div><div class="ttdeci">double freq</div><div class="ttdoc">Frequency for which RX chain was calibrated. </div><div class="ttdef"><b>Definition:</b> <a href="common__lib_8h_source.html#l00139">common_lib.h:139</a></div></div>
<div class="ttc" id="structopenair0__config__t_html_ac27d61589f6c306fb2041dc5ac6b0001"><div class="ttname"><a href="structopenair0__config__t.html#ac27d61589f6c306fb2041dc5ac6b0001">openair0_config_t::tx_sample_advance</a></div><div class="ttdeci">int tx_sample_advance</div><div class="ttdoc">offset in samples between TX and RX paths </div><div class="ttdef"><b>Definition:</b> <a href="common__lib_8h_source.html#l00174">common_lib.h:174</a></div></div>
<div class="ttc" id="structopenair0__config__t_html_a4a4e352be4ed03dc991e9b4fcd328014"><div class="ttname"><a href="structopenair0__config__t.html#a4a4e352be4ed03dc991e9b4fcd328014">openair0_config_t::num_rb_dl</a></div><div class="ttdeci">int num_rb_dl</div><div class="ttdoc">number of downlink resource blocks </div><div class="ttdef"><b>Definition:</b> <a href="common__lib_8h_source.html#l00166">common_lib.h:166</a></div></div>
<div class="ttc" id="structopenair0__write__package__t_html_a0473807080beeaf26ce63b94e38d470d"><div class="ttname"><a href="structopenair0__write__package__t.html#a0473807080beeaf26ce63b94e38d470d">openair0_write_package_t::last_packet</a></div><div class="ttdeci">signed char last_packet</div><div class="ttdef"><b>Definition:</b> <a href="common__lib_8h_source.html#l00288">common_lib.h:288</a></div></div>
<div class="ttc" id="group____GENERIC__PHY__RF__INTERFACE___html_ga306537444209dc91972f17fc71473ff5"><div class="ttname"><a href="group____GENERIC__PHY__RF__INTERFACE__.html#ga306537444209dc91972f17fc71473ff5">clock_source_t</a></div><div class="ttdeci">clock_source_t</div><div class="ttdoc">Clock source types. </div><div class="ttdef"><b>Definition:</b> <a href="common__lib_8h_source.html#l00145">common_lib.h:145</a></div></div>
<div class="ttc" id="structopenair0__device__t_html_ac8c89901a17211bc9fc6726eeab7c6d5"><div class="ttname"><a href="structopenair0__device__t.html#ac8c89901a17211bc9fc6726eeab7c6d5">openair0_device_t::write_thread</a></div><div class="ttdeci">openair0_thread_t write_thread</div><div class="ttdef"><b>Definition:</b> <a href="common__lib_8h_source.html#l00311">common_lib.h:311</a></div></div>
<div class="ttc" id="structeth__params__t_html_a265c4ee5b215fbd4c4c4a4c47394c20f"><div class="ttname"><a href="structeth__params__t.html#a265c4ee5b215fbd4c4c4a4c47394c20f">eth_params_t::transp_preference</a></div><div class="ttdeci">uint8_t transp_preference</div><div class="ttdoc">transport type preference (RAW/UDP) </div><div class="ttdef"><b>Definition:</b> <a href="common__lib_8h_source.html#l00268">common_lib.h:268</a></div></div>
<div class="ttc" id="structeth__params__t_html_a460c6aa8e7ac6ac7274c7352493e507d"><div class="ttname"><a href="structeth__params__t.html#a460c6aa8e7ac6ac7274c7352493e507d">eth_params_t::my_portc</a></div><div class="ttdeci">uint16_t my_portc</div><div class="ttdoc">local port number (control) for Ethernet interface (eNB/RAU, UE) </div><div class="ttdef"><b>Definition:</b> <a href="common__lib_8h_source.html#l00262">common_lib.h:262</a></div></div>
<div class="ttc" id="structeth__params__t_html_a44c3418e5aa10e5809d3a26830ce4c96"><div class="ttname"><a href="structeth__params__t.html#a44c3418e5aa10e5809d3a26830ce4c96">eth_params_t::my_portd</a></div><div class="ttdeci">uint16_t my_portd</div><div class="ttdoc">local port number (user) for Ethernet interface (eNB/RAU, UE) </div><div class="ttdef"><b>Definition:</b> <a href="common__lib_8h_source.html#l00264">common_lib.h:264</a></div></div>
<div class="ttc" id="structsamplesBlockHeader__t_html_a9d6ff00928256884c753d8d1d6e5d242"><div class="ttname"><a href="structsamplesBlockHeader__t.html#a9d6ff00928256884c753d8d1d6e5d242">samplesBlockHeader_t::magic</a></div><div class="ttdeci">uint64_t magic</div><div class="ttdef"><b>Definition:</b> <a href="common__lib_8h_source.html#l00506">common_lib.h:506</a></div></div>
<div class="ttc" id="structeth__params__t_html"><div class="ttname"><a href="structeth__params__t.html">eth_params_t</a></div><div class="ttdef"><b>Definition:</b> <a href="common__lib_8h_source.html#l00253">common_lib.h:253</a></div></div>
<div class="ttc" id="structopenair0__thread__t_html_aeb4c7b74a599f1625e03ff5ad9ab8f54"><div class="ttname"><a href="structopenair0__thread__t.html#aeb4c7b74a599f1625e03ff5ad9ab8f54">openair0_thread_t::mutex_write</a></div><div class="ttdeci">pthread_mutex_t mutex_write</div><div class="ttdoc">mutex for trx write thread </div><div class="ttdef"><b>Definition:</b> <a href="common__lib_8h_source.html#l00305">common_lib.h:305</a></div></div>
<div class="ttc" id="structopenair0__config__t_html_a23f0d9ffa88c0f68cd22b76a6a9e0e11"><div class="ttname"><a href="structopenair0__config__t.html#a23f0d9ffa88c0f68cd22b76a6a9e0e11">openair0_config_t::tx_num_channels</a></div><div class="ttdeci">int tx_num_channels</div><div class="ttdoc">number of TX channels (=TX antennas) </div><div class="ttdef"><b>Definition:</b> <a href="common__lib_8h_source.html#l00180">common_lib.h:180</a></div></div>
<div class="ttc" id="structsamplesBlockHeader__t_html_aef4e02898cfb6b11cdf8d6b375ec7133"><div class="ttname"><a href="structsamplesBlockHeader__t.html#aef4e02898cfb6b11cdf8d6b375ec7133">samplesBlockHeader_t::nbAnt</a></div><div class="ttdeci">uint32_t nbAnt</div><div class="ttdef"><b>Definition:</b> <a href="common__lib_8h_source.html#l00508">common_lib.h:508</a></div></div>
<div class="ttc" id="group____GENERIC__PHY__RF__INTERFACE___html_ga5cd5ca6e07ca455ac31c2d8ded78385a"><div class="ttname"><a href="group____GENERIC__PHY__RF__INTERFACE__.html#ga5cd5ca6e07ca455ac31c2d8ded78385a">oai_transport_initfunc_t</a></div><div class="ttdeci">int(* oai_transport_initfunc_t)(openair0_device *device, openair0_config_t *openair0_cfg, eth_params_t *eth_params)</div><div class="ttdef"><b>Definition:</b> <a href="common__lib_8h_source.html#l00495">common_lib.h:495</a></div></div>
<div class="ttc" id="structopenair0__config__t_html_a4f136a8b50b705ca17ce2e22b56ca809"><div class="ttname"><a href="structopenair0__config__t.html#a4f136a8b50b705ca17ce2e22b56ca809">openair0_config_t::Mod_id</a></div><div class="ttdeci">int Mod_id</div><div class="ttdoc">Module ID for this configuration. </div><div class="ttdef"><b>Definition:</b> <a href="common__lib_8h_source.html#l00160">common_lib.h:160</a></div></div>
<div class="ttc" id="group____GENERIC__PHY__RF__INTERFACE___html_ggab69560ebc82af819611d037a0121cc98a607502d097a12a8ee01fe4480cc00125"><div class="ttname"><a href="group____GENERIC__PHY__RF__INTERFACE__.html#ggab69560ebc82af819611d037a0121cc98a607502d097a12a8ee01fe4480cc00125">NONE_TP</a></div><div class="ttdoc">no transport protocol </div><div class="ttdef"><b>Definition:</b> <a href="common__lib_8h_source.html#l00120">common_lib.h:120</a></div></div>
<div class="ttc" id="group____GENERIC__PHY__RF__INTERFACE___html_ggaaa5808d4b389abd0ffaa5a6bf8979b95ab0ccbf44555ba24374a291bc6bcc2169"><div class="ttname"><a href="group____GENERIC__PHY__RF__INTERFACE__.html#ggaaa5808d4b389abd0ffaa5a6bf8979b95ab0ccbf44555ba24374a291bc6bcc2169">LMSSDR_DEV</a></div><div class="ttdoc">device is LMSSDR (SoDeRa) </div><div class="ttdef"><b>Definition:</b> <a href="common__lib_8h_source.html#l00100">common_lib.h:100</a></div></div>
<div class="ttc" id="structeth__params__t_html_a986ad1aa4233de6ef8db939a7d3d1b83"><div class="ttname"><a href="structeth__params__t.html#a986ad1aa4233de6ef8db939a7d3d1b83">eth_params_t::remote_portc</a></div><div class="ttdeci">uint16_t remote_portc</div><div class="ttdoc">remote port number for Ethernet interface (control) </div><div class="ttdef"><b>Definition:</b> <a href="common__lib_8h_source.html#l00256">common_lib.h:256</a></div></div>
<div class="ttc" id="group____GENERIC__PHY__RF__INTERFACE___html_ggaaa5808d4b389abd0ffaa5a6bf8979b95a6f20ecc6f7a6fc885b2c4c33428a360f"><div class="ttname"><a href="group____GENERIC__PHY__RF__INTERFACE__.html#ggaaa5808d4b389abd0ffaa5a6bf8979b95a6f20ecc6f7a6fc885b2c4c33428a360f">USRP_N300_DEV</a></div><div class="ttdoc">device is USRP N300/N310 </div><div class="ttdef"><b>Definition:</b> <a href="common__lib_8h_source.html#l00096">common_lib.h:96</a></div></div>
<div class="ttc" id="structopenair0__device__t_html_a015023e826283e3de27ea20163187221"><div class="ttname"><a href="structopenair0__device__t.html#a015023e826283e3de27ea20163187221">openair0_device_t::thirdparty_startstreaming</a></div><div class="ttdeci">int(* thirdparty_startstreaming)(openair0_device *device)</div><div class="ttdoc">Callback for Third-party start streaming routine. </div><div class="ttdef"><b>Definition:</b> <a href="common__lib_8h_source.html#l00478">common_lib.h:478</a></div></div>
<div class="ttc" id="group____GENERIC__PHY__RF__INTERFACE___html_ggab69560ebc82af819611d037a0121cc98a3f26f2223f4b3ca902685677ab696b01"><div class="ttname"><a href="group____GENERIC__PHY__RF__INTERFACE__.html#ggab69560ebc82af819611d037a0121cc98a3f26f2223f4b3ca902685677ab696b01">MIN_TRANSP_TYPE</a></div><div class="ttdef"><b>Definition:</b> <a href="common__lib_8h_source.html#l00116">common_lib.h:116</a></div></div>
<div class="ttc" id="group____GENERIC__PHY__RF__INTERFACE___html_ggaaa5808d4b389abd0ffaa5a6bf8979b95a76289f688c5fc6574cfd86372e456c1d"><div class="ttname"><a href="group____GENERIC__PHY__RF__INTERFACE__.html#ggaaa5808d4b389abd0ffaa5a6bf8979b95a76289f688c5fc6574cfd86372e456c1d">MAX_RF_DEV_TYPE</a></div><div class="ttdef"><b>Definition:</b> <a href="common__lib_8h_source.html#l00110">common_lib.h:110</a></div></div>
<div class="ttc" id="group____GENERIC__PHY__RF__INTERFACE___html_gga306537444209dc91972f17fc71473ff5ae027bc2a3779820d0ea9730b38850537"><div class="ttname"><a href="group____GENERIC__PHY__RF__INTERFACE__.html#gga306537444209dc91972f17fc71473ff5ae027bc2a3779820d0ea9730b38850537">unset</a></div><div class="ttdoc">this means the paramter has not been set </div><div class="ttdef"><b>Definition:</b> <a href="common__lib_8h_source.html#l00147">common_lib.h:147</a></div></div>
<div class="ttc" id="structrx__gain__calib__table__t_html_acf2c89713a349fc21f822443a0f00774"><div class="ttname"><a href="structrx__gain__calib__table__t.html#acf2c89713a349fc21f822443a0f00774">rx_gain_calib_table_t::offset</a></div><div class="ttdeci">double offset</div><div class="ttdoc">Offset to be applied to RX gain. </div><div class="ttdef"><b>Definition:</b> <a href="common__lib_8h_source.html#l00141">common_lib.h:141</a></div></div>
<div class="ttc" id="structopenair0__config__t_html_a5c3b1f69d2e8ce2d25ceb4c61ea05fed"><div class="ttname"><a href="structopenair0__config__t.html#a5c3b1f69d2e8ce2d25ceb4c61ea05fed">openair0_config_t::mmapped_dma</a></div><div class="ttdeci">int mmapped_dma</div><div class="ttdoc">flag to indicate that the device is doing mmapped DMA transfers </div><div class="ttdef"><b>Definition:</b> <a href="common__lib_8h_source.html#l00172">common_lib.h:172</a></div></div>
<div class="ttc" id="structeth__params__t_html_af9c9cc896817467607bddb69045fae7c"><div class="ttname"><a href="structeth__params__t.html#af9c9cc896817467607bddb69045fae7c">eth_params_t::local_if_name</a></div><div class="ttdeci">char * local_if_name</div><div class="ttdoc">local Ethernet interface (eNB/RAU, UE) </div><div class="ttdef"><b>Definition:</b> <a href="common__lib_8h_source.html#l00266">common_lib.h:266</a></div></div>
<div class="ttc" id="structopenair0__config__t_html_aa90e61595a7f79ec50afb926c6612664"><div class="ttname"><a href="structopenair0__config__t.html#aa90e61595a7f79ec50afb926c6612664">openair0_config_t::clock_source</a></div><div class="ttdeci">clock_source_t clock_source</div><div class="ttdoc">clock source </div><div class="ttdef"><b>Definition:</b> <a href="common__lib_8h_source.html#l00209">common_lib.h:209</a></div></div>
<div class="ttc" id="structopenair0__write__package__t_html"><div class="ttname"><a href="structopenair0__write__package__t.html">openair0_write_package_t</a></div><div class="ttdef"><b>Definition:</b> <a href="common__lib_8h_source.html#l00282">common_lib.h:282</a></div></div>
<div class="ttc" id="structopenair0__device__t_html_aa60512fadf8756ca8b6750fb37287ec2"><div class="ttname"><a href="structopenair0__device__t.html#aa60512fadf8756ca8b6750fb37287ec2">openair0_device_t::thirdparty_init</a></div><div class="ttdeci">int(* thirdparty_init)(openair0_device *device)</div><div class="ttdoc">Callback for Third-party RRU Initialization routine. </div><div class="ttdef"><b>Definition:</b> <a href="common__lib_8h_source.html#l00469">common_lib.h:469</a></div></div>
<div class="ttc" id="structopenair0__rf__map_html"><div class="ttname"><a href="structopenair0__rf__map.html">openair0_rf_map</a></div><div class="ttdoc">RF mapping. </div><div class="ttdef"><b>Definition:</b> <a href="common__lib_8h_source.html#l00245">common_lib.h:245</a></div></div>
<div class="ttc" id="group____GENERIC__PHY__RF__INTERFACE___html_ga2eaca82b72e3dce80fa4bc6f00405430"><div class="ttname"><a href="group____GENERIC__PHY__RF__INTERFACE__.html#ga2eaca82b72e3dce80fa4bc6f00405430">host_type_t</a></div><div class="ttdeci">host_type_t</div><div class="ttdoc">openair0 device host type </div><div class="ttdef"><b>Definition:</b> <a href="common__lib_8h_source.html#l00126">common_lib.h:126</a></div></div>
<div class="ttc" id="group____GENERIC__PHY__RF__INTERFACE___html_ggaaa5808d4b389abd0ffaa5a6bf8979b95af767170db03446f909b630f652852a67"><div class="ttname"><a href="group____GENERIC__PHY__RF__INTERFACE__.html#ggaaa5808d4b389abd0ffaa5a6bf8979b95af767170db03446f909b630f652852a67">ADRV9371_ZC706_DEV</a></div><div class="ttdoc">device is ADRV9371_ZC706 </div><div class="ttdef"><b>Definition:</b> <a href="common__lib_8h_source.html#l00106">common_lib.h:106</a></div></div>
<div class="ttc" id="structopenair0__config__t_html_ab8c6d50adff71da2060f106112ebda88"><div class="ttname"><a href="structopenair0__config__t.html#ab8c6d50adff71da2060f106112ebda88">openair0_config_t::tx_bw</a></div><div class="ttdeci">double tx_bw</div><div class="ttdoc">TX bandwidth in Hz. </div><div class="ttdef"><b>Definition:</b> <a href="common__lib_8h_source.html#l00207">common_lib.h:207</a></div></div>
</div><!-- fragment --></div><!-- contents -->
</div><!-- doc-content -->
<!-- start footer part -->
<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
<ul>
<li class="navelem"><a class="el" href="dir_25f5d8fa9a1ce4c0c4650678e0447e10.html">ARCH</a></li><li class="navelem"><a class="el" href="dir_6ef97c027e4c3715a348c26a4f7a7b29.html">COMMON</a></li><li class="navelem"><b>common_lib.h</b></li>
<li class="footer">Generated on Tue Sep 14 2021 15:56:44 for OpenAirInterface by
<a href="http://www.doxygen.org/index.html">
<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.5 </li>
</ul>
</div>
</body>
</html>

View File

@@ -0,0 +1,128 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
<meta http-equiv="X-UA-Compatible" content="IE=9"/>
<meta name="generator" content="Doxygen 1.8.5"/>
<title>OpenAirInterface: LMSSDR Directory Reference</title>
<link href="tabs.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="jquery.js"></script>
<script type="text/javascript" src="dynsections.js"></script>
<link href="navtree.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="resize.js"></script>
<script type="text/javascript" src="navtree.js"></script>
<script type="text/javascript">
$(document).ready(initResizable);
$(window).load(resizeHeight);
</script>
<link href="search/search.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="search/search.js"></script>
<script type="text/javascript">
$(document).ready(function() { searchBox.OnSelectItem(0); });
</script>
<link href="doxygen.css" rel="stylesheet" type="text/css" />
</head>
<body>
<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
<div id="titlearea">
<table cellspacing="0" cellpadding="0">
<tbody>
<tr style="height: 56px;">
<td id="projectlogo"><img alt="Logo" src="oai_logo.png"/></td>
<td style="padding-left: 0.5em;">
<div id="projectname">OpenAirInterface
</div>
<div id="projectbrief">Full experimental OpenSource LTE implementation (Rel 8, partial Rel 10)</div>
</td>
</tr>
</tbody>
</table>
</div>
<!-- end header part -->
<!-- Generated by Doxygen 1.8.5 -->
<script type="text/javascript">
var searchBox = new SearchBox("searchBox", "search",false,'Search');
</script>
<div id="navrow1" class="tabs">
<ul class="tablist">
<li><a href="index.html"><span>Main&#160;Page</span></a></li>
<li><a href="modules.html"><span>Modules</span></a></li>
<li><a href="annotated.html"><span>Data&#160;Structures</span></a></li>
<li>
<div id="MSearchBox" class="MSearchBoxInactive">
<span class="left">
<img id="MSearchSelect" src="search/mag_sel.png"
onmouseover="return searchBox.OnSearchSelectShow()"
onmouseout="return searchBox.OnSearchSelectHide()"
alt=""/>
<input type="text" id="MSearchField" value="Search" accesskey="S"
onfocus="searchBox.OnSearchFieldFocus(true)"
onblur="searchBox.OnSearchFieldFocus(false)"
onkeyup="searchBox.OnSearchFieldChange(event)"/>
</span><span class="right">
<a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
</span>
</div>
</li>
</ul>
</div>
</div><!-- top -->
<div id="side-nav" class="ui-resizable side-nav-resizable">
<div id="nav-tree">
<div id="nav-tree-contents">
<div id="nav-sync" class="sync"></div>
</div>
</div>
<div id="splitbar" style="-moz-user-select:none;"
class="ui-resizable-handle">
</div>
</div>
<script type="text/javascript">
$(document).ready(function(){initNavTree('dir_098b04cc954c8c09de9a119a2ea1eb51.html','');});
</script>
<div id="doc-content">
<!-- window showing the filter options -->
<div id="MSearchSelectWindow"
onmouseover="return searchBox.OnSearchSelectShow()"
onmouseout="return searchBox.OnSearchSelectHide()"
onkeydown="return searchBox.OnSearchSelectKey(event)">
<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Data Structures</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Typedefs</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Enumerations</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Enumerator</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(7)"><span class="SelectionMark">&#160;</span>Groups</a></div>
<!-- iframe showing the search results (closed by default) -->
<div id="MSearchResultsWindow">
<iframe src="javascript:void(0)" frameborder="0"
name="MSearchResults" id="MSearchResults">
</iframe>
</div>
<div class="header">
<div class="headertitle">
<div class="title">LMSSDR Directory Reference</div> </div>
</div><!--header-->
<div class="contents">
<div class="dynheader">
Directory dependency graph for LMSSDR:</div>
<div class="dyncontent">
<div class="center"><img src="dir_098b04cc954c8c09de9a119a2ea1eb51_dep.png" border="0" usemap="#dir__098b04cc954c8c09de9a119a2ea1eb51__dep" alt="LMSSDR"/></div>
<map name="dir__098b04cc954c8c09de9a119a2ea1eb51__dep" id="dir__098b04cc954c8c09de9a119a2ea1eb51__dep">
<area shape="rect" id="node2" href="dir_794236c285f66ea85b3b8f675a5dbe09.html" title="USERSPACE" alt="" coords="37,63,136,111"/><area shape="rect" id="clust2" href="dir_098b04cc954c8c09de9a119a2ea1eb51.html" alt="" coords="27,52,245,121"/><area shape="rect" id="clust1" href="dir_25f5d8fa9a1ce4c0c4650678e0447e10.html" title="ARCH" alt="" coords="16,16,256,132"/></map>
</div>
<table class="memberdecls">
<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="subdirs"></a>
Directories</h2></td></tr>
<tr class="memitem:dir_794236c285f66ea85b3b8f675a5dbe09"><td class="memItemLeft" align="right" valign="top">directory &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="dir_794236c285f66ea85b3b8f675a5dbe09.html">USERSPACE</a></td></tr>
<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
</table>
</div><!-- contents -->
</div><!-- doc-content -->
<!-- start footer part -->
<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
<ul>
<li class="navelem"><a class="el" href="dir_25f5d8fa9a1ce4c0c4650678e0447e10.html">ARCH</a></li><li class="navelem"><a class="el" href="dir_098b04cc954c8c09de9a119a2ea1eb51.html">LMSSDR</a></li>
<li class="footer">Generated on Tue Sep 14 2021 15:56:44 for OpenAirInterface by
<a href="http://www.doxygen.org/index.html">
<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.5 </li>
</ul>
</div>
</body>
</html>

View File

@@ -0,0 +1,5 @@
<map id="LMSSDR" name="LMSSDR">
<area shape="rect" id="node2" href="dir_794236c285f66ea85b3b8f675a5dbe09.html" title="USERSPACE" alt="" coords="37,63,136,111"/>
<area shape="rect" id="clust2" href="dir_098b04cc954c8c09de9a119a2ea1eb51.html" alt="" coords="27,52,245,121"/>
<area shape="rect" id="clust1" href="dir_25f5d8fa9a1ce4c0c4650678e0447e10.html" title="ARCH" alt="" coords="16,16,256,132"/>
</map>

View File

@@ -0,0 +1 @@
eab1705d3693f67ba4cf6e5ddfa5cc95

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.2 KiB

View File

@@ -0,0 +1,134 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
<meta http-equiv="X-UA-Compatible" content="IE=9"/>
<meta name="generator" content="Doxygen 1.8.5"/>
<title>OpenAirInterface: ARCH Directory Reference</title>
<link href="tabs.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="jquery.js"></script>
<script type="text/javascript" src="dynsections.js"></script>
<link href="navtree.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="resize.js"></script>
<script type="text/javascript" src="navtree.js"></script>
<script type="text/javascript">
$(document).ready(initResizable);
$(window).load(resizeHeight);
</script>
<link href="search/search.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="search/search.js"></script>
<script type="text/javascript">
$(document).ready(function() { searchBox.OnSelectItem(0); });
</script>
<link href="doxygen.css" rel="stylesheet" type="text/css" />
</head>
<body>
<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
<div id="titlearea">
<table cellspacing="0" cellpadding="0">
<tbody>
<tr style="height: 56px;">
<td id="projectlogo"><img alt="Logo" src="oai_logo.png"/></td>
<td style="padding-left: 0.5em;">
<div id="projectname">OpenAirInterface
</div>
<div id="projectbrief">Full experimental OpenSource LTE implementation (Rel 8, partial Rel 10)</div>
</td>
</tr>
</tbody>
</table>
</div>
<!-- end header part -->
<!-- Generated by Doxygen 1.8.5 -->
<script type="text/javascript">
var searchBox = new SearchBox("searchBox", "search",false,'Search');
</script>
<div id="navrow1" class="tabs">
<ul class="tablist">
<li><a href="index.html"><span>Main&#160;Page</span></a></li>
<li><a href="modules.html"><span>Modules</span></a></li>
<li><a href="annotated.html"><span>Data&#160;Structures</span></a></li>
<li>
<div id="MSearchBox" class="MSearchBoxInactive">
<span class="left">
<img id="MSearchSelect" src="search/mag_sel.png"
onmouseover="return searchBox.OnSearchSelectShow()"
onmouseout="return searchBox.OnSearchSelectHide()"
alt=""/>
<input type="text" id="MSearchField" value="Search" accesskey="S"
onfocus="searchBox.OnSearchFieldFocus(true)"
onblur="searchBox.OnSearchFieldFocus(false)"
onkeyup="searchBox.OnSearchFieldChange(event)"/>
</span><span class="right">
<a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
</span>
</div>
</li>
</ul>
</div>
</div><!-- top -->
<div id="side-nav" class="ui-resizable side-nav-resizable">
<div id="nav-tree">
<div id="nav-tree-contents">
<div id="nav-sync" class="sync"></div>
</div>
</div>
<div id="splitbar" style="-moz-user-select:none;"
class="ui-resizable-handle">
</div>
</div>
<script type="text/javascript">
$(document).ready(function(){initNavTree('dir_25f5d8fa9a1ce4c0c4650678e0447e10.html','');});
</script>
<div id="doc-content">
<!-- window showing the filter options -->
<div id="MSearchSelectWindow"
onmouseover="return searchBox.OnSearchSelectShow()"
onmouseout="return searchBox.OnSearchSelectHide()"
onkeydown="return searchBox.OnSearchSelectKey(event)">
<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Data Structures</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Typedefs</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Enumerations</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Enumerator</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(7)"><span class="SelectionMark">&#160;</span>Groups</a></div>
<!-- iframe showing the search results (closed by default) -->
<div id="MSearchResultsWindow">
<iframe src="javascript:void(0)" frameborder="0"
name="MSearchResults" id="MSearchResults">
</iframe>
</div>
<div class="header">
<div class="headertitle">
<div class="title">ARCH Directory Reference</div> </div>
</div><!--header-->
<div class="contents">
<div class="dynheader">
Directory dependency graph for ARCH:</div>
<div class="dyncontent">
<div class="center"><img src="dir_25f5d8fa9a1ce4c0c4650678e0447e10_dep.png" border="0" usemap="#dir__25f5d8fa9a1ce4c0c4650678e0447e10__dep" alt="ARCH"/></div>
<map name="dir__25f5d8fa9a1ce4c0c4650678e0447e10__dep" id="dir__25f5d8fa9a1ce4c0c4650678e0447e10__dep">
<area shape="rect" id="node2" href="dir_53a38f7b91caabdebd78263cee115e31.html" title="BLADERF" alt="" coords="329,27,409,75"/><area shape="rect" id="node3" href="dir_6ef97c027e4c3715a348c26a4f7a7b29.html" title="COMMON" alt="" coords="221,27,304,75"/><area shape="rect" id="node4" href="dir_098b04cc954c8c09de9a119a2ea1eb51.html" title="LMSSDR" alt="" coords="123,27,197,75"/><area shape="rect" id="node5" href="dir_fbb6f5609ed7ef16a1c0ea5756ca73b1.html" title="USRP" alt="" coords="27,27,99,75"/><area shape="rect" id="clust1" href="dir_25f5d8fa9a1ce4c0c4650678e0447e10.html" alt="" coords="16,16,517,85"/></map>
</div>
<table class="memberdecls">
<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="subdirs"></a>
Directories</h2></td></tr>
<tr class="memitem:dir_53a38f7b91caabdebd78263cee115e31"><td class="memItemLeft" align="right" valign="top">directory &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="dir_53a38f7b91caabdebd78263cee115e31.html">BLADERF</a></td></tr>
<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:dir_6ef97c027e4c3715a348c26a4f7a7b29"><td class="memItemLeft" align="right" valign="top">directory &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="dir_6ef97c027e4c3715a348c26a4f7a7b29.html">COMMON</a></td></tr>
<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:dir_098b04cc954c8c09de9a119a2ea1eb51"><td class="memItemLeft" align="right" valign="top">directory &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="dir_098b04cc954c8c09de9a119a2ea1eb51.html">LMSSDR</a></td></tr>
<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:dir_fbb6f5609ed7ef16a1c0ea5756ca73b1"><td class="memItemLeft" align="right" valign="top">directory &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="dir_fbb6f5609ed7ef16a1c0ea5756ca73b1.html">USRP</a></td></tr>
<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
</table>
</div><!-- contents -->
</div><!-- doc-content -->
<!-- start footer part -->
<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
<ul>
<li class="navelem"><a class="el" href="dir_25f5d8fa9a1ce4c0c4650678e0447e10.html">ARCH</a></li>
<li class="footer">Generated on Tue Sep 14 2021 15:56:44 for OpenAirInterface by
<a href="http://www.doxygen.org/index.html">
<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.5 </li>
</ul>
</div>
</body>
</html>

View File

@@ -0,0 +1,7 @@
<map id="ARCH" name="ARCH">
<area shape="rect" id="node2" href="dir_53a38f7b91caabdebd78263cee115e31.html" title="BLADERF" alt="" coords="329,27,409,75"/>
<area shape="rect" id="node3" href="dir_6ef97c027e4c3715a348c26a4f7a7b29.html" title="COMMON" alt="" coords="221,27,304,75"/>
<area shape="rect" id="node4" href="dir_098b04cc954c8c09de9a119a2ea1eb51.html" title="LMSSDR" alt="" coords="123,27,197,75"/>
<area shape="rect" id="node5" href="dir_fbb6f5609ed7ef16a1c0ea5756ca73b1.html" title="USRP" alt="" coords="27,27,99,75"/>
<area shape="rect" id="clust1" href="dir_25f5d8fa9a1ce4c0c4650678e0447e10.html" alt="" coords="16,16,517,85"/>
</map>

View File

@@ -0,0 +1 @@
2ff4c3cc939e1206b370fe75b381304f

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.6 KiB

View File

@@ -0,0 +1,128 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
<meta http-equiv="X-UA-Compatible" content="IE=9"/>
<meta name="generator" content="Doxygen 1.8.5"/>
<title>OpenAirInterface: LIB Directory Reference</title>
<link href="tabs.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="jquery.js"></script>
<script type="text/javascript" src="dynsections.js"></script>
<link href="navtree.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="resize.js"></script>
<script type="text/javascript" src="navtree.js"></script>
<script type="text/javascript">
$(document).ready(initResizable);
$(window).load(resizeHeight);
</script>
<link href="search/search.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="search/search.js"></script>
<script type="text/javascript">
$(document).ready(function() { searchBox.OnSelectItem(0); });
</script>
<link href="doxygen.css" rel="stylesheet" type="text/css" />
</head>
<body>
<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
<div id="titlearea">
<table cellspacing="0" cellpadding="0">
<tbody>
<tr style="height: 56px;">
<td id="projectlogo"><img alt="Logo" src="oai_logo.png"/></td>
<td style="padding-left: 0.5em;">
<div id="projectname">OpenAirInterface
</div>
<div id="projectbrief">Full experimental OpenSource LTE implementation (Rel 8, partial Rel 10)</div>
</td>
</tr>
</tbody>
</table>
</div>
<!-- end header part -->
<!-- Generated by Doxygen 1.8.5 -->
<script type="text/javascript">
var searchBox = new SearchBox("searchBox", "search",false,'Search');
</script>
<div id="navrow1" class="tabs">
<ul class="tablist">
<li><a href="index.html"><span>Main&#160;Page</span></a></li>
<li><a href="modules.html"><span>Modules</span></a></li>
<li><a href="annotated.html"><span>Data&#160;Structures</span></a></li>
<li>
<div id="MSearchBox" class="MSearchBoxInactive">
<span class="left">
<img id="MSearchSelect" src="search/mag_sel.png"
onmouseover="return searchBox.OnSearchSelectShow()"
onmouseout="return searchBox.OnSearchSelectHide()"
alt=""/>
<input type="text" id="MSearchField" value="Search" accesskey="S"
onfocus="searchBox.OnSearchFieldFocus(true)"
onblur="searchBox.OnSearchFieldFocus(false)"
onkeyup="searchBox.OnSearchFieldChange(event)"/>
</span><span class="right">
<a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
</span>
</div>
</li>
</ul>
</div>
</div><!-- top -->
<div id="side-nav" class="ui-resizable side-nav-resizable">
<div id="nav-tree">
<div id="nav-tree-contents">
<div id="nav-sync" class="sync"></div>
</div>
</div>
<div id="splitbar" style="-moz-user-select:none;"
class="ui-resizable-handle">
</div>
</div>
<script type="text/javascript">
$(document).ready(function(){initNavTree('dir_296a02205c002c198de4197a119f6c27.html','');});
</script>
<div id="doc-content">
<!-- window showing the filter options -->
<div id="MSearchSelectWindow"
onmouseover="return searchBox.OnSearchSelectShow()"
onmouseout="return searchBox.OnSearchSelectHide()"
onkeydown="return searchBox.OnSearchSelectKey(event)">
<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Data Structures</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Typedefs</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Enumerations</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Enumerator</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(7)"><span class="SelectionMark">&#160;</span>Groups</a></div>
<!-- iframe showing the search results (closed by default) -->
<div id="MSearchResultsWindow">
<iframe src="javascript:void(0)" frameborder="0"
name="MSearchResults" id="MSearchResults">
</iframe>
</div>
<div class="header">
<div class="headertitle">
<div class="title">LIB Directory Reference</div> </div>
</div><!--header-->
<div class="contents">
<div class="dynheader">
Directory dependency graph for LIB:</div>
<div class="dyncontent">
<div class="center"><img src="dir_296a02205c002c198de4197a119f6c27_dep.png" border="0" usemap="#dir__296a02205c002c198de4197a119f6c27__dep" alt="LIB"/></div>
<map name="dir__296a02205c002c198de4197a119f6c27__dep" id="dir__296a02205c002c198de4197a119f6c27__dep">
<area shape="rect" id="node1" href="dir_296a02205c002c198de4197a119f6c27.html" title="LIB" alt="" coords="29,52,101,100"/><area shape="rect" id="clust1" href="dir_5af472ecb62af5ad2ec90ab2e70223e1.html" title="USERSPACE" alt="" coords="16,16,115,111"/></map>
</div>
<table class="memberdecls">
<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="files"></a>
Files</h2></td></tr>
<tr class="memitem:usrp__lib_8cpp"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><b>usrp_lib.cpp</b> <a href="usrp__lib_8cpp_source.html">[code]</a></td></tr>
<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
</table>
</div><!-- contents -->
</div><!-- doc-content -->
<!-- start footer part -->
<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
<ul>
<li class="navelem"><a class="el" href="dir_25f5d8fa9a1ce4c0c4650678e0447e10.html">ARCH</a></li><li class="navelem"><a class="el" href="dir_fbb6f5609ed7ef16a1c0ea5756ca73b1.html">USRP</a></li><li class="navelem"><a class="el" href="dir_5af472ecb62af5ad2ec90ab2e70223e1.html">USERSPACE</a></li><li class="navelem"><a class="el" href="dir_296a02205c002c198de4197a119f6c27.html">LIB</a></li>
<li class="footer">Generated on Tue Sep 14 2021 15:56:44 for OpenAirInterface by
<a href="http://www.doxygen.org/index.html">
<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.5 </li>
</ul>
</div>
</body>
</html>

View File

@@ -0,0 +1,4 @@
<map id="LIB" name="LIB">
<area shape="rect" id="node1" href="dir_296a02205c002c198de4197a119f6c27.html" title="LIB" alt="" coords="29,52,101,100"/>
<area shape="rect" id="clust1" href="dir_5af472ecb62af5ad2ec90ab2e70223e1.html" title="USERSPACE" alt="" coords="16,16,115,111"/>
</map>

View File

@@ -0,0 +1 @@
f50bd1c094fef107092294f9097daf22

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.9 KiB

View File

@@ -0,0 +1,128 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
<meta http-equiv="X-UA-Compatible" content="IE=9"/>
<meta name="generator" content="Doxygen 1.8.5"/>
<title>OpenAirInterface: USERSPACE Directory Reference</title>
<link href="tabs.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="jquery.js"></script>
<script type="text/javascript" src="dynsections.js"></script>
<link href="navtree.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="resize.js"></script>
<script type="text/javascript" src="navtree.js"></script>
<script type="text/javascript">
$(document).ready(initResizable);
$(window).load(resizeHeight);
</script>
<link href="search/search.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="search/search.js"></script>
<script type="text/javascript">
$(document).ready(function() { searchBox.OnSelectItem(0); });
</script>
<link href="doxygen.css" rel="stylesheet" type="text/css" />
</head>
<body>
<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
<div id="titlearea">
<table cellspacing="0" cellpadding="0">
<tbody>
<tr style="height: 56px;">
<td id="projectlogo"><img alt="Logo" src="oai_logo.png"/></td>
<td style="padding-left: 0.5em;">
<div id="projectname">OpenAirInterface
</div>
<div id="projectbrief">Full experimental OpenSource LTE implementation (Rel 8, partial Rel 10)</div>
</td>
</tr>
</tbody>
</table>
</div>
<!-- end header part -->
<!-- Generated by Doxygen 1.8.5 -->
<script type="text/javascript">
var searchBox = new SearchBox("searchBox", "search",false,'Search');
</script>
<div id="navrow1" class="tabs">
<ul class="tablist">
<li><a href="index.html"><span>Main&#160;Page</span></a></li>
<li><a href="modules.html"><span>Modules</span></a></li>
<li><a href="annotated.html"><span>Data&#160;Structures</span></a></li>
<li>
<div id="MSearchBox" class="MSearchBoxInactive">
<span class="left">
<img id="MSearchSelect" src="search/mag_sel.png"
onmouseover="return searchBox.OnSearchSelectShow()"
onmouseout="return searchBox.OnSearchSelectHide()"
alt=""/>
<input type="text" id="MSearchField" value="Search" accesskey="S"
onfocus="searchBox.OnSearchFieldFocus(true)"
onblur="searchBox.OnSearchFieldFocus(false)"
onkeyup="searchBox.OnSearchFieldChange(event)"/>
</span><span class="right">
<a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
</span>
</div>
</li>
</ul>
</div>
</div><!-- top -->
<div id="side-nav" class="ui-resizable side-nav-resizable">
<div id="nav-tree">
<div id="nav-tree-contents">
<div id="nav-sync" class="sync"></div>
</div>
</div>
<div id="splitbar" style="-moz-user-select:none;"
class="ui-resizable-handle">
</div>
</div>
<script type="text/javascript">
$(document).ready(function(){initNavTree('dir_31fe4f88196f07d47da88c3165f9b109.html','');});
</script>
<div id="doc-content">
<!-- window showing the filter options -->
<div id="MSearchSelectWindow"
onmouseover="return searchBox.OnSearchSelectShow()"
onmouseout="return searchBox.OnSearchSelectHide()"
onkeydown="return searchBox.OnSearchSelectKey(event)">
<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Data Structures</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Typedefs</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Enumerations</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Enumerator</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(7)"><span class="SelectionMark">&#160;</span>Groups</a></div>
<!-- iframe showing the search results (closed by default) -->
<div id="MSearchResultsWindow">
<iframe src="javascript:void(0)" frameborder="0"
name="MSearchResults" id="MSearchResults">
</iframe>
</div>
<div class="header">
<div class="headertitle">
<div class="title">USERSPACE Directory Reference</div> </div>
</div><!--header-->
<div class="contents">
<div class="dynheader">
Directory dependency graph for USERSPACE:</div>
<div class="dyncontent">
<div class="center"><img src="dir_31fe4f88196f07d47da88c3165f9b109_dep.png" border="0" usemap="#dir__31fe4f88196f07d47da88c3165f9b109__dep" alt="USERSPACE"/></div>
<map name="dir__31fe4f88196f07d47da88c3165f9b109__dep" id="dir__31fe4f88196f07d47da88c3165f9b109__dep">
<area shape="rect" id="node2" href="dir_7dbc7ac1b70501c722463688f01c3543.html" title="LIB" alt="" coords="37,63,109,111"/><area shape="rect" id="clust2" href="dir_31fe4f88196f07d47da88c3165f9b109.html" alt="" coords="27,52,243,121"/><area shape="rect" id="clust1" href="dir_53a38f7b91caabdebd78263cee115e31.html" title="BLADERF" alt="" coords="16,16,253,132"/></map>
</div>
<table class="memberdecls">
<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="subdirs"></a>
Directories</h2></td></tr>
<tr class="memitem:dir_7dbc7ac1b70501c722463688f01c3543"><td class="memItemLeft" align="right" valign="top">directory &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="dir_7dbc7ac1b70501c722463688f01c3543.html">LIB</a></td></tr>
<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
</table>
</div><!-- contents -->
</div><!-- doc-content -->
<!-- start footer part -->
<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
<ul>
<li class="navelem"><a class="el" href="dir_25f5d8fa9a1ce4c0c4650678e0447e10.html">ARCH</a></li><li class="navelem"><a class="el" href="dir_53a38f7b91caabdebd78263cee115e31.html">BLADERF</a></li><li class="navelem"><a class="el" href="dir_31fe4f88196f07d47da88c3165f9b109.html">USERSPACE</a></li>
<li class="footer">Generated on Tue Sep 14 2021 15:56:44 for OpenAirInterface by
<a href="http://www.doxygen.org/index.html">
<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.5 </li>
</ul>
</div>
</body>
</html>

View File

@@ -0,0 +1,5 @@
<map id="USERSPACE" name="USERSPACE">
<area shape="rect" id="node2" href="dir_7dbc7ac1b70501c722463688f01c3543.html" title="LIB" alt="" coords="37,63,109,111"/>
<area shape="rect" id="clust2" href="dir_31fe4f88196f07d47da88c3165f9b109.html" alt="" coords="27,52,243,121"/>
<area shape="rect" id="clust1" href="dir_53a38f7b91caabdebd78263cee115e31.html" title="BLADERF" alt="" coords="16,16,253,132"/>
</map>

View File

@@ -0,0 +1 @@
271279b977a61d04f958c1238f7e74c6

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.9 KiB

View File

@@ -0,0 +1,128 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
<meta http-equiv="X-UA-Compatible" content="IE=9"/>
<meta name="generator" content="Doxygen 1.8.5"/>
<title>OpenAirInterface: BLADERF Directory Reference</title>
<link href="tabs.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="jquery.js"></script>
<script type="text/javascript" src="dynsections.js"></script>
<link href="navtree.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="resize.js"></script>
<script type="text/javascript" src="navtree.js"></script>
<script type="text/javascript">
$(document).ready(initResizable);
$(window).load(resizeHeight);
</script>
<link href="search/search.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="search/search.js"></script>
<script type="text/javascript">
$(document).ready(function() { searchBox.OnSelectItem(0); });
</script>
<link href="doxygen.css" rel="stylesheet" type="text/css" />
</head>
<body>
<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
<div id="titlearea">
<table cellspacing="0" cellpadding="0">
<tbody>
<tr style="height: 56px;">
<td id="projectlogo"><img alt="Logo" src="oai_logo.png"/></td>
<td style="padding-left: 0.5em;">
<div id="projectname">OpenAirInterface
</div>
<div id="projectbrief">Full experimental OpenSource LTE implementation (Rel 8, partial Rel 10)</div>
</td>
</tr>
</tbody>
</table>
</div>
<!-- end header part -->
<!-- Generated by Doxygen 1.8.5 -->
<script type="text/javascript">
var searchBox = new SearchBox("searchBox", "search",false,'Search');
</script>
<div id="navrow1" class="tabs">
<ul class="tablist">
<li><a href="index.html"><span>Main&#160;Page</span></a></li>
<li><a href="modules.html"><span>Modules</span></a></li>
<li><a href="annotated.html"><span>Data&#160;Structures</span></a></li>
<li>
<div id="MSearchBox" class="MSearchBoxInactive">
<span class="left">
<img id="MSearchSelect" src="search/mag_sel.png"
onmouseover="return searchBox.OnSearchSelectShow()"
onmouseout="return searchBox.OnSearchSelectHide()"
alt=""/>
<input type="text" id="MSearchField" value="Search" accesskey="S"
onfocus="searchBox.OnSearchFieldFocus(true)"
onblur="searchBox.OnSearchFieldFocus(false)"
onkeyup="searchBox.OnSearchFieldChange(event)"/>
</span><span class="right">
<a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
</span>
</div>
</li>
</ul>
</div>
</div><!-- top -->
<div id="side-nav" class="ui-resizable side-nav-resizable">
<div id="nav-tree">
<div id="nav-tree-contents">
<div id="nav-sync" class="sync"></div>
</div>
</div>
<div id="splitbar" style="-moz-user-select:none;"
class="ui-resizable-handle">
</div>
</div>
<script type="text/javascript">
$(document).ready(function(){initNavTree('dir_53a38f7b91caabdebd78263cee115e31.html','');});
</script>
<div id="doc-content">
<!-- window showing the filter options -->
<div id="MSearchSelectWindow"
onmouseover="return searchBox.OnSearchSelectShow()"
onmouseout="return searchBox.OnSearchSelectHide()"
onkeydown="return searchBox.OnSearchSelectKey(event)">
<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Data Structures</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Typedefs</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Enumerations</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Enumerator</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(7)"><span class="SelectionMark">&#160;</span>Groups</a></div>
<!-- iframe showing the search results (closed by default) -->
<div id="MSearchResultsWindow">
<iframe src="javascript:void(0)" frameborder="0"
name="MSearchResults" id="MSearchResults">
</iframe>
</div>
<div class="header">
<div class="headertitle">
<div class="title">BLADERF Directory Reference</div> </div>
</div><!--header-->
<div class="contents">
<div class="dynheader">
Directory dependency graph for BLADERF:</div>
<div class="dyncontent">
<div class="center"><img src="dir_53a38f7b91caabdebd78263cee115e31_dep.png" border="0" usemap="#dir__53a38f7b91caabdebd78263cee115e31__dep" alt="BLADERF"/></div>
<map name="dir__53a38f7b91caabdebd78263cee115e31__dep" id="dir__53a38f7b91caabdebd78263cee115e31__dep">
<area shape="rect" id="node2" href="dir_31fe4f88196f07d47da88c3165f9b109.html" title="USERSPACE" alt="" coords="37,63,136,111"/><area shape="rect" id="clust2" href="dir_53a38f7b91caabdebd78263cee115e31.html" alt="" coords="27,52,253,121"/><area shape="rect" id="clust1" href="dir_25f5d8fa9a1ce4c0c4650678e0447e10.html" title="ARCH" alt="" coords="16,16,264,132"/></map>
</div>
<table class="memberdecls">
<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="subdirs"></a>
Directories</h2></td></tr>
<tr class="memitem:dir_31fe4f88196f07d47da88c3165f9b109"><td class="memItemLeft" align="right" valign="top">directory &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="dir_31fe4f88196f07d47da88c3165f9b109.html">USERSPACE</a></td></tr>
<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
</table>
</div><!-- contents -->
</div><!-- doc-content -->
<!-- start footer part -->
<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
<ul>
<li class="navelem"><a class="el" href="dir_25f5d8fa9a1ce4c0c4650678e0447e10.html">ARCH</a></li><li class="navelem"><a class="el" href="dir_53a38f7b91caabdebd78263cee115e31.html">BLADERF</a></li>
<li class="footer">Generated on Tue Sep 14 2021 15:56:44 for OpenAirInterface by
<a href="http://www.doxygen.org/index.html">
<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.5 </li>
</ul>
</div>
</body>
</html>

View File

@@ -0,0 +1,5 @@
<map id="BLADERF" name="BLADERF">
<area shape="rect" id="node2" href="dir_31fe4f88196f07d47da88c3165f9b109.html" title="USERSPACE" alt="" coords="37,63,136,111"/>
<area shape="rect" id="clust2" href="dir_53a38f7b91caabdebd78263cee115e31.html" alt="" coords="27,52,253,121"/>
<area shape="rect" id="clust1" href="dir_25f5d8fa9a1ce4c0c4650678e0447e10.html" title="ARCH" alt="" coords="16,16,264,132"/>
</map>

View File

@@ -0,0 +1 @@
1e099e41ba5183a778874d202eeddc51

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.2 KiB

View File

@@ -0,0 +1,128 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
<meta http-equiv="X-UA-Compatible" content="IE=9"/>
<meta name="generator" content="Doxygen 1.8.5"/>
<title>OpenAirInterface: USERSPACE Directory Reference</title>
<link href="tabs.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="jquery.js"></script>
<script type="text/javascript" src="dynsections.js"></script>
<link href="navtree.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="resize.js"></script>
<script type="text/javascript" src="navtree.js"></script>
<script type="text/javascript">
$(document).ready(initResizable);
$(window).load(resizeHeight);
</script>
<link href="search/search.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="search/search.js"></script>
<script type="text/javascript">
$(document).ready(function() { searchBox.OnSelectItem(0); });
</script>
<link href="doxygen.css" rel="stylesheet" type="text/css" />
</head>
<body>
<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
<div id="titlearea">
<table cellspacing="0" cellpadding="0">
<tbody>
<tr style="height: 56px;">
<td id="projectlogo"><img alt="Logo" src="oai_logo.png"/></td>
<td style="padding-left: 0.5em;">
<div id="projectname">OpenAirInterface
</div>
<div id="projectbrief">Full experimental OpenSource LTE implementation (Rel 8, partial Rel 10)</div>
</td>
</tr>
</tbody>
</table>
</div>
<!-- end header part -->
<!-- Generated by Doxygen 1.8.5 -->
<script type="text/javascript">
var searchBox = new SearchBox("searchBox", "search",false,'Search');
</script>
<div id="navrow1" class="tabs">
<ul class="tablist">
<li><a href="index.html"><span>Main&#160;Page</span></a></li>
<li><a href="modules.html"><span>Modules</span></a></li>
<li><a href="annotated.html"><span>Data&#160;Structures</span></a></li>
<li>
<div id="MSearchBox" class="MSearchBoxInactive">
<span class="left">
<img id="MSearchSelect" src="search/mag_sel.png"
onmouseover="return searchBox.OnSearchSelectShow()"
onmouseout="return searchBox.OnSearchSelectHide()"
alt=""/>
<input type="text" id="MSearchField" value="Search" accesskey="S"
onfocus="searchBox.OnSearchFieldFocus(true)"
onblur="searchBox.OnSearchFieldFocus(false)"
onkeyup="searchBox.OnSearchFieldChange(event)"/>
</span><span class="right">
<a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
</span>
</div>
</li>
</ul>
</div>
</div><!-- top -->
<div id="side-nav" class="ui-resizable side-nav-resizable">
<div id="nav-tree">
<div id="nav-tree-contents">
<div id="nav-sync" class="sync"></div>
</div>
</div>
<div id="splitbar" style="-moz-user-select:none;"
class="ui-resizable-handle">
</div>
</div>
<script type="text/javascript">
$(document).ready(function(){initNavTree('dir_5af472ecb62af5ad2ec90ab2e70223e1.html','');});
</script>
<div id="doc-content">
<!-- window showing the filter options -->
<div id="MSearchSelectWindow"
onmouseover="return searchBox.OnSearchSelectShow()"
onmouseout="return searchBox.OnSearchSelectHide()"
onkeydown="return searchBox.OnSearchSelectKey(event)">
<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Data Structures</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Typedefs</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Enumerations</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Enumerator</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(7)"><span class="SelectionMark">&#160;</span>Groups</a></div>
<!-- iframe showing the search results (closed by default) -->
<div id="MSearchResultsWindow">
<iframe src="javascript:void(0)" frameborder="0"
name="MSearchResults" id="MSearchResults">
</iframe>
</div>
<div class="header">
<div class="headertitle">
<div class="title">USERSPACE Directory Reference</div> </div>
</div><!--header-->
<div class="contents">
<div class="dynheader">
Directory dependency graph for USERSPACE:</div>
<div class="dyncontent">
<div class="center"><img src="dir_5af472ecb62af5ad2ec90ab2e70223e1_dep.png" border="0" usemap="#dir__5af472ecb62af5ad2ec90ab2e70223e1__dep" alt="USERSPACE"/></div>
<map name="dir__5af472ecb62af5ad2ec90ab2e70223e1__dep" id="dir__5af472ecb62af5ad2ec90ab2e70223e1__dep">
<area shape="rect" id="node2" href="dir_296a02205c002c198de4197a119f6c27.html" title="LIB" alt="" coords="37,63,109,111"/><area shape="rect" id="clust2" href="dir_5af472ecb62af5ad2ec90ab2e70223e1.html" alt="" coords="27,52,243,121"/><area shape="rect" id="clust1" href="dir_fbb6f5609ed7ef16a1c0ea5756ca73b1.html" title="USRP" alt="" coords="16,16,253,132"/></map>
</div>
<table class="memberdecls">
<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="subdirs"></a>
Directories</h2></td></tr>
<tr class="memitem:dir_296a02205c002c198de4197a119f6c27"><td class="memItemLeft" align="right" valign="top">directory &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="dir_296a02205c002c198de4197a119f6c27.html">LIB</a></td></tr>
<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
</table>
</div><!-- contents -->
</div><!-- doc-content -->
<!-- start footer part -->
<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
<ul>
<li class="navelem"><a class="el" href="dir_25f5d8fa9a1ce4c0c4650678e0447e10.html">ARCH</a></li><li class="navelem"><a class="el" href="dir_fbb6f5609ed7ef16a1c0ea5756ca73b1.html">USRP</a></li><li class="navelem"><a class="el" href="dir_5af472ecb62af5ad2ec90ab2e70223e1.html">USERSPACE</a></li>
<li class="footer">Generated on Tue Sep 14 2021 15:56:44 for OpenAirInterface by
<a href="http://www.doxygen.org/index.html">
<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.5 </li>
</ul>
</div>
</body>
</html>

View File

@@ -0,0 +1,5 @@
<map id="USERSPACE" name="USERSPACE">
<area shape="rect" id="node2" href="dir_296a02205c002c198de4197a119f6c27.html" title="LIB" alt="" coords="37,63,109,111"/>
<area shape="rect" id="clust2" href="dir_5af472ecb62af5ad2ec90ab2e70223e1.html" alt="" coords="27,52,243,121"/>
<area shape="rect" id="clust1" href="dir_fbb6f5609ed7ef16a1c0ea5756ca73b1.html" title="USRP" alt="" coords="16,16,253,132"/>
</map>

View File

@@ -0,0 +1 @@
511fba4fadfbe97badae815a58edb387

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.7 KiB

View File

@@ -0,0 +1,129 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
<meta http-equiv="X-UA-Compatible" content="IE=9"/>
<meta name="generator" content="Doxygen 1.8.5"/>
<title>OpenAirInterface: COMMON Directory Reference</title>
<link href="tabs.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="jquery.js"></script>
<script type="text/javascript" src="dynsections.js"></script>
<link href="navtree.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="resize.js"></script>
<script type="text/javascript" src="navtree.js"></script>
<script type="text/javascript">
$(document).ready(initResizable);
$(window).load(resizeHeight);
</script>
<link href="search/search.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="search/search.js"></script>
<script type="text/javascript">
$(document).ready(function() { searchBox.OnSelectItem(0); });
</script>
<link href="doxygen.css" rel="stylesheet" type="text/css" />
</head>
<body>
<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
<div id="titlearea">
<table cellspacing="0" cellpadding="0">
<tbody>
<tr style="height: 56px;">
<td id="projectlogo"><img alt="Logo" src="oai_logo.png"/></td>
<td style="padding-left: 0.5em;">
<div id="projectname">OpenAirInterface
</div>
<div id="projectbrief">Full experimental OpenSource LTE implementation (Rel 8, partial Rel 10)</div>
</td>
</tr>
</tbody>
</table>
</div>
<!-- end header part -->
<!-- Generated by Doxygen 1.8.5 -->
<script type="text/javascript">
var searchBox = new SearchBox("searchBox", "search",false,'Search');
</script>
<div id="navrow1" class="tabs">
<ul class="tablist">
<li><a href="index.html"><span>Main&#160;Page</span></a></li>
<li><a href="modules.html"><span>Modules</span></a></li>
<li><a href="annotated.html"><span>Data&#160;Structures</span></a></li>
<li>
<div id="MSearchBox" class="MSearchBoxInactive">
<span class="left">
<img id="MSearchSelect" src="search/mag_sel.png"
onmouseover="return searchBox.OnSearchSelectShow()"
onmouseout="return searchBox.OnSearchSelectHide()"
alt=""/>
<input type="text" id="MSearchField" value="Search" accesskey="S"
onfocus="searchBox.OnSearchFieldFocus(true)"
onblur="searchBox.OnSearchFieldFocus(false)"
onkeyup="searchBox.OnSearchFieldChange(event)"/>
</span><span class="right">
<a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
</span>
</div>
</li>
</ul>
</div>
</div><!-- top -->
<div id="side-nav" class="ui-resizable side-nav-resizable">
<div id="nav-tree">
<div id="nav-tree-contents">
<div id="nav-sync" class="sync"></div>
</div>
</div>
<div id="splitbar" style="-moz-user-select:none;"
class="ui-resizable-handle">
</div>
</div>
<script type="text/javascript">
$(document).ready(function(){initNavTree('dir_6ef97c027e4c3715a348c26a4f7a7b29.html','');});
</script>
<div id="doc-content">
<!-- window showing the filter options -->
<div id="MSearchSelectWindow"
onmouseover="return searchBox.OnSearchSelectShow()"
onmouseout="return searchBox.OnSearchSelectHide()"
onkeydown="return searchBox.OnSearchSelectKey(event)">
<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Data Structures</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Typedefs</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Enumerations</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Enumerator</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(7)"><span class="SelectionMark">&#160;</span>Groups</a></div>
<!-- iframe showing the search results (closed by default) -->
<div id="MSearchResultsWindow">
<iframe src="javascript:void(0)" frameborder="0"
name="MSearchResults" id="MSearchResults">
</iframe>
</div>
<div class="header">
<div class="headertitle">
<div class="title">COMMON Directory Reference</div> </div>
</div><!--header-->
<div class="contents">
<div class="dynheader">
Directory dependency graph for COMMON:</div>
<div class="dyncontent">
<div class="center"><img src="dir_6ef97c027e4c3715a348c26a4f7a7b29_dep.png" border="0" usemap="#dir__6ef97c027e4c3715a348c26a4f7a7b29__dep" alt="COMMON"/></div>
<map name="dir__6ef97c027e4c3715a348c26a4f7a7b29__dep" id="dir__6ef97c027e4c3715a348c26a4f7a7b29__dep">
<area shape="rect" id="node1" href="dir_6ef97c027e4c3715a348c26a4f7a7b29.html" title="COMMON" alt="" coords="27,52,109,100"/><area shape="rect" id="clust1" href="dir_25f5d8fa9a1ce4c0c4650678e0447e10.html" title="ARCH" alt="" coords="16,16,120,111"/></map>
</div>
<table class="memberdecls">
<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="files"></a>
Files</h2></td></tr>
<tr class="memitem:common__lib_8h"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><b>common_lib.h</b> <a href="common__lib_8h_source.html">[code]</a></td></tr>
<tr class="memdesc:common__lib_8h"><td class="mdescLeft">&#160;</td><td class="mdescRight">common APIs for different RF frontend device <br/></td></tr>
<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
</table>
</div><!-- contents -->
</div><!-- doc-content -->
<!-- start footer part -->
<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
<ul>
<li class="navelem"><a class="el" href="dir_25f5d8fa9a1ce4c0c4650678e0447e10.html">ARCH</a></li><li class="navelem"><a class="el" href="dir_6ef97c027e4c3715a348c26a4f7a7b29.html">COMMON</a></li>
<li class="footer">Generated on Tue Sep 14 2021 15:56:44 for OpenAirInterface by
<a href="http://www.doxygen.org/index.html">
<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.5 </li>
</ul>
</div>
</body>
</html>

View File

@@ -0,0 +1,4 @@
<map id="COMMON" name="COMMON">
<area shape="rect" id="node1" href="dir_6ef97c027e4c3715a348c26a4f7a7b29.html" title="COMMON" alt="" coords="27,52,109,100"/>
<area shape="rect" id="clust1" href="dir_25f5d8fa9a1ce4c0c4650678e0447e10.html" title="ARCH" alt="" coords="16,16,120,111"/>
</map>

View File

@@ -0,0 +1 @@
fb7dca9c3acdff1d991aad4d8d99cdc8

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.9 KiB

View File

@@ -0,0 +1,128 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
<meta http-equiv="X-UA-Compatible" content="IE=9"/>
<meta name="generator" content="Doxygen 1.8.5"/>
<title>OpenAirInterface: USERSPACE Directory Reference</title>
<link href="tabs.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="jquery.js"></script>
<script type="text/javascript" src="dynsections.js"></script>
<link href="navtree.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="resize.js"></script>
<script type="text/javascript" src="navtree.js"></script>
<script type="text/javascript">
$(document).ready(initResizable);
$(window).load(resizeHeight);
</script>
<link href="search/search.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="search/search.js"></script>
<script type="text/javascript">
$(document).ready(function() { searchBox.OnSelectItem(0); });
</script>
<link href="doxygen.css" rel="stylesheet" type="text/css" />
</head>
<body>
<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
<div id="titlearea">
<table cellspacing="0" cellpadding="0">
<tbody>
<tr style="height: 56px;">
<td id="projectlogo"><img alt="Logo" src="oai_logo.png"/></td>
<td style="padding-left: 0.5em;">
<div id="projectname">OpenAirInterface
</div>
<div id="projectbrief">Full experimental OpenSource LTE implementation (Rel 8, partial Rel 10)</div>
</td>
</tr>
</tbody>
</table>
</div>
<!-- end header part -->
<!-- Generated by Doxygen 1.8.5 -->
<script type="text/javascript">
var searchBox = new SearchBox("searchBox", "search",false,'Search');
</script>
<div id="navrow1" class="tabs">
<ul class="tablist">
<li><a href="index.html"><span>Main&#160;Page</span></a></li>
<li><a href="modules.html"><span>Modules</span></a></li>
<li><a href="annotated.html"><span>Data&#160;Structures</span></a></li>
<li>
<div id="MSearchBox" class="MSearchBoxInactive">
<span class="left">
<img id="MSearchSelect" src="search/mag_sel.png"
onmouseover="return searchBox.OnSearchSelectShow()"
onmouseout="return searchBox.OnSearchSelectHide()"
alt=""/>
<input type="text" id="MSearchField" value="Search" accesskey="S"
onfocus="searchBox.OnSearchFieldFocus(true)"
onblur="searchBox.OnSearchFieldFocus(false)"
onkeyup="searchBox.OnSearchFieldChange(event)"/>
</span><span class="right">
<a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
</span>
</div>
</li>
</ul>
</div>
</div><!-- top -->
<div id="side-nav" class="ui-resizable side-nav-resizable">
<div id="nav-tree">
<div id="nav-tree-contents">
<div id="nav-sync" class="sync"></div>
</div>
</div>
<div id="splitbar" style="-moz-user-select:none;"
class="ui-resizable-handle">
</div>
</div>
<script type="text/javascript">
$(document).ready(function(){initNavTree('dir_794236c285f66ea85b3b8f675a5dbe09.html','');});
</script>
<div id="doc-content">
<!-- window showing the filter options -->
<div id="MSearchSelectWindow"
onmouseover="return searchBox.OnSearchSelectShow()"
onmouseout="return searchBox.OnSearchSelectHide()"
onkeydown="return searchBox.OnSearchSelectKey(event)">
<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Data Structures</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Typedefs</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Enumerations</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Enumerator</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(7)"><span class="SelectionMark">&#160;</span>Groups</a></div>
<!-- iframe showing the search results (closed by default) -->
<div id="MSearchResultsWindow">
<iframe src="javascript:void(0)" frameborder="0"
name="MSearchResults" id="MSearchResults">
</iframe>
</div>
<div class="header">
<div class="headertitle">
<div class="title">USERSPACE Directory Reference</div> </div>
</div><!--header-->
<div class="contents">
<div class="dynheader">
Directory dependency graph for USERSPACE:</div>
<div class="dyncontent">
<div class="center"><img src="dir_794236c285f66ea85b3b8f675a5dbe09_dep.png" border="0" usemap="#dir__794236c285f66ea85b3b8f675a5dbe09__dep" alt="USERSPACE"/></div>
<map name="dir__794236c285f66ea85b3b8f675a5dbe09__dep" id="dir__794236c285f66ea85b3b8f675a5dbe09__dep">
<area shape="rect" id="node2" href="dir_f426a0714932c70923effea88330c81e.html" title="LIB" alt="" coords="37,63,109,111"/><area shape="rect" id="clust2" href="dir_794236c285f66ea85b3b8f675a5dbe09.html" alt="" coords="27,52,243,121"/><area shape="rect" id="clust1" href="dir_098b04cc954c8c09de9a119a2ea1eb51.html" title="LMSSDR" alt="" coords="16,16,253,132"/></map>
</div>
<table class="memberdecls">
<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="subdirs"></a>
Directories</h2></td></tr>
<tr class="memitem:dir_f426a0714932c70923effea88330c81e"><td class="memItemLeft" align="right" valign="top">directory &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="dir_f426a0714932c70923effea88330c81e.html">LIB</a></td></tr>
<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
</table>
</div><!-- contents -->
</div><!-- doc-content -->
<!-- start footer part -->
<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
<ul>
<li class="navelem"><a class="el" href="dir_25f5d8fa9a1ce4c0c4650678e0447e10.html">ARCH</a></li><li class="navelem"><a class="el" href="dir_098b04cc954c8c09de9a119a2ea1eb51.html">LMSSDR</a></li><li class="navelem"><a class="el" href="dir_794236c285f66ea85b3b8f675a5dbe09.html">USERSPACE</a></li>
<li class="footer">Generated on Tue Sep 14 2021 15:56:44 for OpenAirInterface by
<a href="http://www.doxygen.org/index.html">
<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.5 </li>
</ul>
</div>
</body>
</html>

View File

@@ -0,0 +1,5 @@
<map id="USERSPACE" name="USERSPACE">
<area shape="rect" id="node2" href="dir_f426a0714932c70923effea88330c81e.html" title="LIB" alt="" coords="37,63,109,111"/>
<area shape="rect" id="clust2" href="dir_794236c285f66ea85b3b8f675a5dbe09.html" alt="" coords="27,52,243,121"/>
<area shape="rect" id="clust1" href="dir_098b04cc954c8c09de9a119a2ea1eb51.html" title="LMSSDR" alt="" coords="16,16,253,132"/>
</map>

View File

@@ -0,0 +1 @@
481447797c176c29b981d8ac7f0c2ab2

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.9 KiB

View File

@@ -0,0 +1,130 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
<meta http-equiv="X-UA-Compatible" content="IE=9"/>
<meta name="generator" content="Doxygen 1.8.5"/>
<title>OpenAirInterface: LIB Directory Reference</title>
<link href="tabs.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="jquery.js"></script>
<script type="text/javascript" src="dynsections.js"></script>
<link href="navtree.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="resize.js"></script>
<script type="text/javascript" src="navtree.js"></script>
<script type="text/javascript">
$(document).ready(initResizable);
$(window).load(resizeHeight);
</script>
<link href="search/search.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="search/search.js"></script>
<script type="text/javascript">
$(document).ready(function() { searchBox.OnSelectItem(0); });
</script>
<link href="doxygen.css" rel="stylesheet" type="text/css" />
</head>
<body>
<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
<div id="titlearea">
<table cellspacing="0" cellpadding="0">
<tbody>
<tr style="height: 56px;">
<td id="projectlogo"><img alt="Logo" src="oai_logo.png"/></td>
<td style="padding-left: 0.5em;">
<div id="projectname">OpenAirInterface
</div>
<div id="projectbrief">Full experimental OpenSource LTE implementation (Rel 8, partial Rel 10)</div>
</td>
</tr>
</tbody>
</table>
</div>
<!-- end header part -->
<!-- Generated by Doxygen 1.8.5 -->
<script type="text/javascript">
var searchBox = new SearchBox("searchBox", "search",false,'Search');
</script>
<div id="navrow1" class="tabs">
<ul class="tablist">
<li><a href="index.html"><span>Main&#160;Page</span></a></li>
<li><a href="modules.html"><span>Modules</span></a></li>
<li><a href="annotated.html"><span>Data&#160;Structures</span></a></li>
<li>
<div id="MSearchBox" class="MSearchBoxInactive">
<span class="left">
<img id="MSearchSelect" src="search/mag_sel.png"
onmouseover="return searchBox.OnSearchSelectShow()"
onmouseout="return searchBox.OnSearchSelectHide()"
alt=""/>
<input type="text" id="MSearchField" value="Search" accesskey="S"
onfocus="searchBox.OnSearchFieldFocus(true)"
onblur="searchBox.OnSearchFieldFocus(false)"
onkeyup="searchBox.OnSearchFieldChange(event)"/>
</span><span class="right">
<a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
</span>
</div>
</li>
</ul>
</div>
</div><!-- top -->
<div id="side-nav" class="ui-resizable side-nav-resizable">
<div id="nav-tree">
<div id="nav-tree-contents">
<div id="nav-sync" class="sync"></div>
</div>
</div>
<div id="splitbar" style="-moz-user-select:none;"
class="ui-resizable-handle">
</div>
</div>
<script type="text/javascript">
$(document).ready(function(){initNavTree('dir_7dbc7ac1b70501c722463688f01c3543.html','');});
</script>
<div id="doc-content">
<!-- window showing the filter options -->
<div id="MSearchSelectWindow"
onmouseover="return searchBox.OnSearchSelectShow()"
onmouseout="return searchBox.OnSearchSelectHide()"
onkeydown="return searchBox.OnSearchSelectKey(event)">
<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Data Structures</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Typedefs</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Enumerations</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Enumerator</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(7)"><span class="SelectionMark">&#160;</span>Groups</a></div>
<!-- iframe showing the search results (closed by default) -->
<div id="MSearchResultsWindow">
<iframe src="javascript:void(0)" frameborder="0"
name="MSearchResults" id="MSearchResults">
</iframe>
</div>
<div class="header">
<div class="headertitle">
<div class="title">LIB Directory Reference</div> </div>
</div><!--header-->
<div class="contents">
<div class="dynheader">
Directory dependency graph for LIB:</div>
<div class="dyncontent">
<div class="center"><img src="dir_7dbc7ac1b70501c722463688f01c3543_dep.png" border="0" usemap="#dir__7dbc7ac1b70501c722463688f01c3543__dep" alt="LIB"/></div>
<map name="dir__7dbc7ac1b70501c722463688f01c3543__dep" id="dir__7dbc7ac1b70501c722463688f01c3543__dep">
<area shape="rect" id="node1" href="dir_7dbc7ac1b70501c722463688f01c3543.html" title="LIB" alt="" coords="29,52,101,100"/><area shape="rect" id="clust1" href="dir_31fe4f88196f07d47da88c3165f9b109.html" title="USERSPACE" alt="" coords="16,16,115,111"/></map>
</div>
<table class="memberdecls">
<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="files"></a>
Files</h2></td></tr>
<tr class="memitem:bladerf__lib_8c"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><b>bladerf_lib.c</b> <a href="bladerf__lib_8c_source.html">[code]</a></td></tr>
<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:bladerf__lib_8h"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><b>bladerf_lib.h</b> <a href="bladerf__lib_8h_source.html">[code]</a></td></tr>
<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
</table>
</div><!-- contents -->
</div><!-- doc-content -->
<!-- start footer part -->
<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
<ul>
<li class="navelem"><a class="el" href="dir_25f5d8fa9a1ce4c0c4650678e0447e10.html">ARCH</a></li><li class="navelem"><a class="el" href="dir_53a38f7b91caabdebd78263cee115e31.html">BLADERF</a></li><li class="navelem"><a class="el" href="dir_31fe4f88196f07d47da88c3165f9b109.html">USERSPACE</a></li><li class="navelem"><a class="el" href="dir_7dbc7ac1b70501c722463688f01c3543.html">LIB</a></li>
<li class="footer">Generated on Tue Sep 14 2021 15:56:44 for OpenAirInterface by
<a href="http://www.doxygen.org/index.html">
<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.5 </li>
</ul>
</div>
</body>
</html>

View File

@@ -0,0 +1,4 @@
<map id="LIB" name="LIB">
<area shape="rect" id="node1" href="dir_7dbc7ac1b70501c722463688f01c3543.html" title="LIB" alt="" coords="29,52,101,100"/>
<area shape="rect" id="clust1" href="dir_31fe4f88196f07d47da88c3165f9b109.html" title="USERSPACE" alt="" coords="16,16,115,111"/>
</map>

View File

@@ -0,0 +1 @@
8fce55fc71d02f529c27e4d070957325

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.9 KiB

View File

@@ -0,0 +1,128 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
<meta http-equiv="X-UA-Compatible" content="IE=9"/>
<meta name="generator" content="Doxygen 1.8.5"/>
<title>OpenAirInterface: LIB Directory Reference</title>
<link href="tabs.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="jquery.js"></script>
<script type="text/javascript" src="dynsections.js"></script>
<link href="navtree.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="resize.js"></script>
<script type="text/javascript" src="navtree.js"></script>
<script type="text/javascript">
$(document).ready(initResizable);
$(window).load(resizeHeight);
</script>
<link href="search/search.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="search/search.js"></script>
<script type="text/javascript">
$(document).ready(function() { searchBox.OnSelectItem(0); });
</script>
<link href="doxygen.css" rel="stylesheet" type="text/css" />
</head>
<body>
<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
<div id="titlearea">
<table cellspacing="0" cellpadding="0">
<tbody>
<tr style="height: 56px;">
<td id="projectlogo"><img alt="Logo" src="oai_logo.png"/></td>
<td style="padding-left: 0.5em;">
<div id="projectname">OpenAirInterface
</div>
<div id="projectbrief">Full experimental OpenSource LTE implementation (Rel 8, partial Rel 10)</div>
</td>
</tr>
</tbody>
</table>
</div>
<!-- end header part -->
<!-- Generated by Doxygen 1.8.5 -->
<script type="text/javascript">
var searchBox = new SearchBox("searchBox", "search",false,'Search');
</script>
<div id="navrow1" class="tabs">
<ul class="tablist">
<li><a href="index.html"><span>Main&#160;Page</span></a></li>
<li><a href="modules.html"><span>Modules</span></a></li>
<li><a href="annotated.html"><span>Data&#160;Structures</span></a></li>
<li>
<div id="MSearchBox" class="MSearchBoxInactive">
<span class="left">
<img id="MSearchSelect" src="search/mag_sel.png"
onmouseover="return searchBox.OnSearchSelectShow()"
onmouseout="return searchBox.OnSearchSelectHide()"
alt=""/>
<input type="text" id="MSearchField" value="Search" accesskey="S"
onfocus="searchBox.OnSearchFieldFocus(true)"
onblur="searchBox.OnSearchFieldFocus(false)"
onkeyup="searchBox.OnSearchFieldChange(event)"/>
</span><span class="right">
<a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
</span>
</div>
</li>
</ul>
</div>
</div><!-- top -->
<div id="side-nav" class="ui-resizable side-nav-resizable">
<div id="nav-tree">
<div id="nav-tree-contents">
<div id="nav-sync" class="sync"></div>
</div>
</div>
<div id="splitbar" style="-moz-user-select:none;"
class="ui-resizable-handle">
</div>
</div>
<script type="text/javascript">
$(document).ready(function(){initNavTree('dir_f426a0714932c70923effea88330c81e.html','');});
</script>
<div id="doc-content">
<!-- window showing the filter options -->
<div id="MSearchSelectWindow"
onmouseover="return searchBox.OnSearchSelectShow()"
onmouseout="return searchBox.OnSearchSelectHide()"
onkeydown="return searchBox.OnSearchSelectKey(event)">
<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Data Structures</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Typedefs</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Enumerations</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Enumerator</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(7)"><span class="SelectionMark">&#160;</span>Groups</a></div>
<!-- iframe showing the search results (closed by default) -->
<div id="MSearchResultsWindow">
<iframe src="javascript:void(0)" frameborder="0"
name="MSearchResults" id="MSearchResults">
</iframe>
</div>
<div class="header">
<div class="headertitle">
<div class="title">LIB Directory Reference</div> </div>
</div><!--header-->
<div class="contents">
<div class="dynheader">
Directory dependency graph for LIB:</div>
<div class="dyncontent">
<div class="center"><img src="dir_f426a0714932c70923effea88330c81e_dep.png" border="0" usemap="#dir__f426a0714932c70923effea88330c81e__dep" alt="LIB"/></div>
<map name="dir__f426a0714932c70923effea88330c81e__dep" id="dir__f426a0714932c70923effea88330c81e__dep">
<area shape="rect" id="node1" href="dir_f426a0714932c70923effea88330c81e.html" title="LIB" alt="" coords="29,52,101,100"/><area shape="rect" id="clust1" href="dir_794236c285f66ea85b3b8f675a5dbe09.html" title="USERSPACE" alt="" coords="16,16,115,111"/></map>
</div>
<table class="memberdecls">
<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="files"></a>
Files</h2></td></tr>
<tr class="memitem:lms__lib_8cpp"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><b>lms_lib.cpp</b> <a href="lms__lib_8cpp_source.html">[code]</a></td></tr>
<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
</table>
</div><!-- contents -->
</div><!-- doc-content -->
<!-- start footer part -->
<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
<ul>
<li class="navelem"><a class="el" href="dir_25f5d8fa9a1ce4c0c4650678e0447e10.html">ARCH</a></li><li class="navelem"><a class="el" href="dir_098b04cc954c8c09de9a119a2ea1eb51.html">LMSSDR</a></li><li class="navelem"><a class="el" href="dir_794236c285f66ea85b3b8f675a5dbe09.html">USERSPACE</a></li><li class="navelem"><a class="el" href="dir_f426a0714932c70923effea88330c81e.html">LIB</a></li>
<li class="footer">Generated on Tue Sep 14 2021 15:56:44 for OpenAirInterface by
<a href="http://www.doxygen.org/index.html">
<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.5 </li>
</ul>
</div>
</body>
</html>

View File

@@ -0,0 +1,4 @@
<map id="LIB" name="LIB">
<area shape="rect" id="node1" href="dir_f426a0714932c70923effea88330c81e.html" title="LIB" alt="" coords="29,52,101,100"/>
<area shape="rect" id="clust1" href="dir_794236c285f66ea85b3b8f675a5dbe09.html" title="USERSPACE" alt="" coords="16,16,115,111"/>
</map>

View File

@@ -0,0 +1 @@
743a28dbff8100c97c4a778a41761778

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.9 KiB

View File

@@ -0,0 +1,128 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
<meta http-equiv="X-UA-Compatible" content="IE=9"/>
<meta name="generator" content="Doxygen 1.8.5"/>
<title>OpenAirInterface: USRP Directory Reference</title>
<link href="tabs.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="jquery.js"></script>
<script type="text/javascript" src="dynsections.js"></script>
<link href="navtree.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="resize.js"></script>
<script type="text/javascript" src="navtree.js"></script>
<script type="text/javascript">
$(document).ready(initResizable);
$(window).load(resizeHeight);
</script>
<link href="search/search.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="search/search.js"></script>
<script type="text/javascript">
$(document).ready(function() { searchBox.OnSelectItem(0); });
</script>
<link href="doxygen.css" rel="stylesheet" type="text/css" />
</head>
<body>
<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
<div id="titlearea">
<table cellspacing="0" cellpadding="0">
<tbody>
<tr style="height: 56px;">
<td id="projectlogo"><img alt="Logo" src="oai_logo.png"/></td>
<td style="padding-left: 0.5em;">
<div id="projectname">OpenAirInterface
</div>
<div id="projectbrief">Full experimental OpenSource LTE implementation (Rel 8, partial Rel 10)</div>
</td>
</tr>
</tbody>
</table>
</div>
<!-- end header part -->
<!-- Generated by Doxygen 1.8.5 -->
<script type="text/javascript">
var searchBox = new SearchBox("searchBox", "search",false,'Search');
</script>
<div id="navrow1" class="tabs">
<ul class="tablist">
<li><a href="index.html"><span>Main&#160;Page</span></a></li>
<li><a href="modules.html"><span>Modules</span></a></li>
<li><a href="annotated.html"><span>Data&#160;Structures</span></a></li>
<li>
<div id="MSearchBox" class="MSearchBoxInactive">
<span class="left">
<img id="MSearchSelect" src="search/mag_sel.png"
onmouseover="return searchBox.OnSearchSelectShow()"
onmouseout="return searchBox.OnSearchSelectHide()"
alt=""/>
<input type="text" id="MSearchField" value="Search" accesskey="S"
onfocus="searchBox.OnSearchFieldFocus(true)"
onblur="searchBox.OnSearchFieldFocus(false)"
onkeyup="searchBox.OnSearchFieldChange(event)"/>
</span><span class="right">
<a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
</span>
</div>
</li>
</ul>
</div>
</div><!-- top -->
<div id="side-nav" class="ui-resizable side-nav-resizable">
<div id="nav-tree">
<div id="nav-tree-contents">
<div id="nav-sync" class="sync"></div>
</div>
</div>
<div id="splitbar" style="-moz-user-select:none;"
class="ui-resizable-handle">
</div>
</div>
<script type="text/javascript">
$(document).ready(function(){initNavTree('dir_fbb6f5609ed7ef16a1c0ea5756ca73b1.html','');});
</script>
<div id="doc-content">
<!-- window showing the filter options -->
<div id="MSearchSelectWindow"
onmouseover="return searchBox.OnSearchSelectShow()"
onmouseout="return searchBox.OnSearchSelectHide()"
onkeydown="return searchBox.OnSearchSelectKey(event)">
<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Data Structures</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Typedefs</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Enumerations</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Enumerator</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(7)"><span class="SelectionMark">&#160;</span>Groups</a></div>
<!-- iframe showing the search results (closed by default) -->
<div id="MSearchResultsWindow">
<iframe src="javascript:void(0)" frameborder="0"
name="MSearchResults" id="MSearchResults">
</iframe>
</div>
<div class="header">
<div class="headertitle">
<div class="title">USRP Directory Reference</div> </div>
</div><!--header-->
<div class="contents">
<div class="dynheader">
Directory dependency graph for USRP:</div>
<div class="dyncontent">
<div class="center"><img src="dir_fbb6f5609ed7ef16a1c0ea5756ca73b1_dep.png" border="0" usemap="#dir__fbb6f5609ed7ef16a1c0ea5756ca73b1__dep" alt="USRP"/></div>
<map name="dir__fbb6f5609ed7ef16a1c0ea5756ca73b1__dep" id="dir__fbb6f5609ed7ef16a1c0ea5756ca73b1__dep">
<area shape="rect" id="node2" href="dir_5af472ecb62af5ad2ec90ab2e70223e1.html" title="USERSPACE" alt="" coords="37,63,136,111"/><area shape="rect" id="clust2" href="dir_fbb6f5609ed7ef16a1c0ea5756ca73b1.html" alt="" coords="27,52,243,121"/><area shape="rect" id="clust1" href="dir_25f5d8fa9a1ce4c0c4650678e0447e10.html" title="ARCH" alt="" coords="16,16,253,132"/></map>
</div>
<table class="memberdecls">
<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="subdirs"></a>
Directories</h2></td></tr>
<tr class="memitem:dir_5af472ecb62af5ad2ec90ab2e70223e1"><td class="memItemLeft" align="right" valign="top">directory &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="dir_5af472ecb62af5ad2ec90ab2e70223e1.html">USERSPACE</a></td></tr>
<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
</table>
</div><!-- contents -->
</div><!-- doc-content -->
<!-- start footer part -->
<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
<ul>
<li class="navelem"><a class="el" href="dir_25f5d8fa9a1ce4c0c4650678e0447e10.html">ARCH</a></li><li class="navelem"><a class="el" href="dir_fbb6f5609ed7ef16a1c0ea5756ca73b1.html">USRP</a></li>
<li class="footer">Generated on Tue Sep 14 2021 15:56:44 for OpenAirInterface by
<a href="http://www.doxygen.org/index.html">
<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.5 </li>
</ul>
</div>
</body>
</html>

View File

@@ -0,0 +1,5 @@
<map id="USRP" name="USRP">
<area shape="rect" id="node2" href="dir_5af472ecb62af5ad2ec90ab2e70223e1.html" title="USERSPACE" alt="" coords="37,63,136,111"/>
<area shape="rect" id="clust2" href="dir_fbb6f5609ed7ef16a1c0ea5756ca73b1.html" alt="" coords="27,52,243,121"/>
<area shape="rect" id="clust1" href="dir_25f5d8fa9a1ce4c0c4650678e0447e10.html" title="ARCH" alt="" coords="16,16,253,132"/>
</map>

View File

@@ -0,0 +1 @@
5bbf4a6b224919eb218247e80385ea1d

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.0 KiB

Some files were not shown because too many files have changed in this diff Show More