diff --git a/cmake_targets/CMakeLists.txt b/cmake_targets/CMakeLists.txt index 17e2072d00ebcaebece57149f3005d3461ea82f5..5efb13594f5f0bea5dba30a590d1b3e5d9235391 100644 --- a/cmake_targets/CMakeLists.txt +++ b/cmake_targets/CMakeLists.txt @@ -1880,9 +1880,13 @@ endif (${T_TRACER}) #This rule and the following deal with it. add_custom_command ( OUTPUT ${OPENAIR_DIR}/common/utils/T/T_IDs.h - COMMAND make + COMMAND $(MAKE) clean + COMMAND $(MAKE) + COMMAND $(MAKE) check_vcd WORKING_DIRECTORY ${OPENAIR_DIR}/common/utils/T DEPENDS ${OPENAIR_DIR}/common/utils/T/T_messages.txt + ${OPENAIR_DIR}/common/utils/LOG/vcd_signal_dumper.c + ${OPENAIR_DIR}/common/utils/LOG/vcd_signal_dumper.h ) #This rule is specifically needed to generate T files @@ -2187,7 +2191,8 @@ if (${T_TRACER}) oai_eth_transpro FLPT_MSG ASYNC_IF FLEXRAN_AGENT HASHTABLE MSC UTIL OMG_SUMO SECU_OSA SECU_CN SCHED_LIB PHY L2 default_sched remote_sched RAL CN_UTILS - GTPV1U SCTP_CLIENT UDP LIB_NAS_UE LFDS LFDS7 SIMU OPENAIR0_LIB PHY_MEX) + GTPV1U SCTP_CLIENT UDP LIB_NAS_UE LFDS LFDS7 SIMU OPENAIR0_LIB PHY_MEX + coding) if (TARGET ${i}) add_dependencies(${i} generate_T) endif() @@ -2230,7 +2235,7 @@ function(make_driver name dir) endforeach() CONFIGURE_FILE(${OPENAIR_CMAKE}/tools/Kbuild.cmake ${OPENAIR_BIN_DIR}/${name}/Kbuild) add_custom_command(OUTPUT ${name}.ko - COMMAND make -C ${module_build_path} M=${OPENAIR_BIN_DIR}/${name} + COMMAND $(MAKE) -C ${module_build_path} M=${OPENAIR_BIN_DIR}/${name} WORKING_DIRECTORY ${OPENAIR_BIN_DIR}/${name} COMMENT "building ${module}.ko" VERBATIM diff --git a/cmake_targets/tools/build_helper b/cmake_targets/tools/build_helper index 5ddce2340bebafaeb8894aae33ca7714fd36f7a0..3363bd2e7658feef8f91ec18b80f738b43cc440b 100755 --- a/cmake_targets/tools/build_helper +++ b/cmake_targets/tools/build_helper @@ -683,7 +683,7 @@ install_asn1c_from_source(){ # better to use a given commit than a branch in case the branch # is updated and requires modifications in the source of OAI #git checkout velichkov_s1ap_plus_option_group - git checkout ec830d70bbb014b769810355a2f321a91ccd8a58 + git checkout 73d6b23dcec9ab36605b4af884143824392134c1 autoreconf -iv ./configure make -j`nproc` diff --git a/common/utils/LOG/vcd_signal_dumper.h b/common/utils/LOG/vcd_signal_dumper.h index 3c722ac49aa1335b18497e360e142b46040f4f9c..749978bb48da6a0cae665968d04db65b97800925 100644 --- a/common/utils/LOG/vcd_signal_dumper.h +++ b/common/utils/LOG/vcd_signal_dumper.h @@ -39,7 +39,7 @@ /* WARNING: if you edit the enums below, update also string definitions in vcd_signal_dumper.c */ typedef enum { - VCD_SIGNAL_DUMPER_VARIABLES_FRAME_NUMBER_TX0_ENB = 0, + VCD_SIGNAL_DUMPER_VARIABLES_FRAME_NUMBER_TX0_ENB=0, VCD_SIGNAL_DUMPER_VARIABLES_FRAME_NUMBER_TX1_ENB, VCD_SIGNAL_DUMPER_VARIABLES_FRAME_NUMBER_RX0_ENB, VCD_SIGNAL_DUMPER_VARIABLES_FRAME_NUMBER_RX1_ENB, @@ -91,12 +91,12 @@ typedef enum { VCD_SIGNAL_DUMPER_VARIABLES_TX_SEQ_NUM, VCD_SIGNAL_DUMPER_VARIABLES_CNT, VCD_SIGNAL_DUMPER_VARIABLES_DUMMY_DUMP, - VCD_SIGNAL_DUMPER_VARIABLE_ITTI_SEND_MSG, - VCD_SIGNAL_DUMPER_VARIABLE_ITTI_POLL_MSG, - VCD_SIGNAL_DUMPER_VARIABLE_ITTI_RECV_MSG, - VCD_SIGNAL_DUMPER_VARIABLE_ITTI_ALLOC_MSG, - VCD_SIGNAL_DUMPER_VARIABLE_MP_ALLOC, - VCD_SIGNAL_DUMPER_VARIABLE_MP_FREE, + VCD_SIGNAL_DUMPER_VARIABLES_ITTI_SEND_MSG, + VCD_SIGNAL_DUMPER_VARIABLES_ITTI_POLL_MSG, + VCD_SIGNAL_DUMPER_VARIABLES_ITTI_RECV_MSG, + VCD_SIGNAL_DUMPER_VARIABLES_ITTI_ALLOC_MSG, + VCD_SIGNAL_DUMPER_VARIABLES_MP_ALLOC, + VCD_SIGNAL_DUMPER_VARIABLES_MP_FREE, VCD_SIGNAL_DUMPER_VARIABLES_UE_INST_CNT_RX, VCD_SIGNAL_DUMPER_VARIABLES_UE_INST_CNT_TX, VCD_SIGNAL_DUMPER_VARIABLES_DCI_INFO, diff --git a/common/utils/T/.gitignore b/common/utils/T/.gitignore index 817780592428b38fd48b57f26be6b3a73868ae63..d754ff7c38730801afa6f6629ef45b9c9d4dcc03 100644 --- a/common/utils/T/.gitignore +++ b/common/utils/T/.gitignore @@ -15,4 +15,5 @@ tracer/to_vcd tracer/extract_input_subframe tracer/extract_output_subframe tracer/extract +tracer/multi tracee/tracee diff --git a/common/utils/T/Makefile b/common/utils/T/Makefile index 5e1785ea91695ae36e08acab486c14c6b6b79e83..87a6e34c5d1e0ecd4636439d9eccf8aeacd26d38 100644 --- a/common/utils/T/Makefile +++ b/common/utils/T/Makefile @@ -18,6 +18,15 @@ T_messages.txt.h: T_messages.txt T_IDs.h: $(GENIDS) T_messages.txt ./$(GENIDS) T_messages.txt T_IDs.h +check_vcd: + gcc -Wall -I. -I.. -I../itti -Itracer -o _check_vcd check_vcd.c tracer/database.c tracer/utils.c -lm -pthread + ./_check_vcd || (rm -f ./_check_vcd ./T_IDs.h ./T_messages.txt.h && false) + rm -f ./_check_vcd + +.PHONY: check_vcd + clean: - rm -f *.o $(GENIDS) core T_IDs.h T_messages.txt.h - cd tracer && make clean + rm -f *.o $(GENIDS) core T_IDs.h T_messages.txt.h _check_vcd + +cleanall: clean + cd tracer && $(MAKE) clean diff --git a/common/utils/T/T.c b/common/utils/T/T.c index 8679a4185fdf2905b2850ce7115641827aef05a9..fbd3f75a0c195fbb9d41e927fe6b3bf13150ee41 100644 --- a/common/utils/T/T.c +++ b/common/utils/T/T.c @@ -31,6 +31,12 @@ volatile int _T_freelist_head; volatile int *T_freelist_head = &_T_freelist_head; T_cache_t *T_cache; +#if BASIC_SIMULATOR +/* global variables used by T_GET_SLOT, see in T.h */ +volatile uint64_t T_next_id; +volatile uint64_t T_active_id; +#endif + static void get_message(int s) { char t; @@ -91,7 +97,7 @@ static void new_thread(void *(*f)(void *), void *data) /* defined in local_tracer.c */ void T_local_tracer_main(int remote_port, int wait_for_tracer, - int local_socket, char *shm_file); + int local_socket, void *shm_array); /* We monitor the tracee and the local tracer processes. * When one dies we forcefully kill the other. @@ -114,22 +120,31 @@ void T_init(int remote_port, int wait_for_tracer, int dont_fork) { int socket_pair[2]; int s; - int T_shm_fd; int child1, child2; - char shm_file[128]; - - sprintf(shm_file, "/%s%d", T_SHM_FILENAME, getpid()); + int i; if (socketpair(AF_UNIX, SOCK_STREAM, 0, socket_pair)) { perror("socketpair"); abort(); } + /* setup shared memory */ + T_cache = mmap(NULL, T_CACHE_SIZE * sizeof(T_cache_t), + PROT_READ | PROT_WRITE, MAP_SHARED | MAP_ANONYMOUS, -1, 0); + if (T_cache == MAP_FAILED) + { perror("mmap"); abort(); } + + /* let's garbage the memory to catch some potential problems + * (think multiprocessor sync issues, barriers, etc.) + */ + memset(T_cache, 0x55, T_CACHE_SIZE * sizeof(T_cache_t)); + for (i = 0; i < T_CACHE_SIZE; i++) T_cache[i].busy = 0; + /* child1 runs the local tracer and child2 (or main) runs the tracee */ child1 = fork(); if (child1 == -1) abort(); if (child1 == 0) { close(socket_pair[1]); T_local_tracer_main(remote_port, wait_for_tracer, socket_pair[0], - shm_file); + T_cache); exit(0); } close(socket_pair[0]); @@ -138,6 +153,7 @@ void T_init(int remote_port, int wait_for_tracer, int dont_fork) child2 = fork(); if (child2 == -1) abort(); if (child2 != 0) { close(socket_pair[1]); + munmap(T_cache, T_CACHE_SIZE * sizeof(T_cache_t)); monitor_and_kill(child1, child2); } } @@ -148,34 +164,29 @@ void T_init(int remote_port, int wait_for_tracer, int dont_fork) T_socket = s; - /* setup shared memory */ - T_shm_fd = shm_open(shm_file, O_RDWR /*| O_SYNC*/, 0666); - shm_unlink(shm_file); - if (T_shm_fd == -1) { perror(shm_file); abort(); } - T_cache = mmap(NULL, T_CACHE_SIZE * sizeof(T_cache_t), - PROT_READ | PROT_WRITE, MAP_SHARED, T_shm_fd, 0); - if (T_cache == MAP_FAILED) - { perror(shm_file); abort(); } - close(T_shm_fd); - new_thread(T_receive_thread, NULL); } void T_Config_Init(void) { -int T_port; /* by default we wait for the tracer */ -int T_nowait; /* default port to listen to to wait for the tracer */ -int T_dont_fork; /* default is to fork, see 'T_init' to understand */ + int T_port; /* by default we wait for the tracer */ + int T_nowait; /* default port to listen to to wait for the tracer */ + int T_dont_fork; /* default is to fork, see 'T_init' to understand */ -paramdef_t ttraceparams[] = CMDLINE_TTRACEPARAMS_DESC ; + paramdef_t ttraceparams[] = CMDLINE_TTRACEPARAMS_DESC; -/* for a cleaner config file, TTracer params should be defined in a specific section... */ - config_get( ttraceparams,sizeof(ttraceparams)/sizeof(paramdef_t),TTRACER_CONFIG_PREFIX); + /* for a cleaner config file, TTracer params should be defined in a + * specific section... + */ + config_get(ttraceparams, + sizeof(ttraceparams) / sizeof(paramdef_t), + TTRACER_CONFIG_PREFIX); -/* compatibility: look for TTracer command line options in root section */ - config_process_cmdline( ttraceparams,sizeof(ttraceparams)/sizeof(paramdef_t),NULL); + /* compatibility: look for TTracer command line options in root section */ + config_process_cmdline(ttraceparams, + sizeof(ttraceparams) / sizeof(paramdef_t), + NULL); - if (T_stdout == 0) { + if (T_stdout == 0) T_init(T_port, 1-T_nowait, T_dont_fork); - } } diff --git a/common/utils/T/T.h b/common/utils/T/T.h index 755f5d4e3981fa0424a3a89436e343c6b7c83adc..18e4a590d9444d12257d5207b4e00446d2811f6b 100644 --- a/common/utils/T/T.h +++ b/common/utils/T/T.h @@ -112,13 +112,37 @@ extern volatile int *T_freelist_head; extern T_cache_t *T_cache; extern int *T_active; /* When running the basic simulator, we may fill the T cache too fast. - * Let's not crash if it's full, just wait. + * Let's serialize write accesses to the T cache. For that, we use a + * 'ticket' mechanism. To acquire a T slot the caller needs to own the + * current active ticket. We also wait for the slot to be free if + * it is already in use. */ #if BASIC_SIMULATOR -# define T_BASIC_SIMULATOR_WAIT \ - while (T_cache[T_LOCAL_slot].busy) usleep(100) +# define T_GET_SLOT \ + do { \ + extern volatile uint64_t T_next_id; \ + extern volatile uint64_t T_active_id; \ + uint64_t id; \ + /* get a ticket */ \ + id = __sync_fetch_and_add(&T_next_id, 1); \ + /* wait for our turn */ \ + while (id != __sync_fetch_and_add(&T_active_id, 0)) /* busy wait */; \ + /* this is our turn, try to acquire the slot until it's free */ \ + do { \ + T_LOCAL_busy = __sync_fetch_and_or(&T_cache[T_LOCAL_slot].busy, 0x01); \ + if (T_LOCAL_busy & 0x01) usleep(100); \ + } while (T_LOCAL_busy & 0x01); \ + /* check that there are still some tickets */ \ + if (__sync_fetch_and_add(&T_active_id, 0) == 0xffffffffffffffff) { \ + printf("T: reached the end of times, bye...\n"); \ + abort(); \ + } \ + /* free our ticket, which signals the next waiter that it's its turn */ \ + (void)__sync_fetch_and_add(&T_active_id, 1); \ + } while (0) #else -# define T_BASIC_SIMULATOR_WAIT /* */ +# define T_GET_SLOT \ + T_LOCAL_busy = __sync_fetch_and_or(&T_cache[T_LOCAL_slot].busy, 0x01); #endif /* used at header of Tn, allocates buffer */ @@ -126,11 +150,12 @@ extern int *T_active; char *T_LOCAL_buf; \ int T_LOCAL_size = 0; \ int T_LOCAL_slot; \ + int T_LOCAL_busy; \ T_LOCAL_slot = __sync_fetch_and_add(T_freelist_head, 1) \ & (T_CACHE_SIZE - 1); \ (void)__sync_fetch_and_and(T_freelist_head, T_CACHE_SIZE - 1); \ - T_BASIC_SIMULATOR_WAIT; \ - if (T_cache[T_LOCAL_slot].busy) { \ + T_GET_SLOT; \ + if (T_LOCAL_busy & 0x01) { \ printf("%s:%d:%s: T cache is full - consider increasing its size\n", \ __FILE__, __LINE__, __FUNCTION__); \ abort(); \ @@ -142,7 +167,7 @@ extern int *T_active; #define T_COMMIT() \ T_cache[T_LOCAL_slot].length = T_LOCAL_size; \ __sync_synchronize(); \ - T_cache[T_LOCAL_slot].busy = 1; \ + (void)__sync_fetch_and_or(&T_cache[T_LOCAL_slot].busy, 0x02); #define T_CHECK_SIZE(len, argnum) \ if (T_LOCAL_size + (len) > T_BUFFER_MAX) { \ @@ -578,10 +603,10 @@ extern int *T_active; /* optname helpstr paramflags XXXptr defXXXval type numelt */ /*------------------------------------------------------------------------------------------------------------------------------------------*/ #define CMDLINE_TTRACEPARAMS_DESC { \ -{"T_port", CONFIG_HLP_TPORT, 0, iptr:&T_port, defintval:2021, TYPE_INT, 0}, \ -{"T_nowait", CONFIG_HLP_NOTWAIT, PARAMFLAG_BOOL, iptr:&T_nowait, defintval:0, TYPE_INT, 0}, \ -{"T_dont_fork", CONFIG_HLP_TNOFORK, PARAMFLAG_BOOL, iptr:&T_dont_fork, defintval:0, TYPE_INT, 0}, \ -{"T_stdout", CONFIG_HLP_STDOUT, PARAMFLAG_BOOL, iptr:&T_stdout, defintval:1, TYPE_INT, 0}, \ +{"T_port", CONFIG_HLP_TPORT, 0, iptr:&T_port, defintval:2021, TYPE_INT, 0}, \ +{"T_nowait", CONFIG_HLP_NOTWAIT, PARAMFLAG_BOOL, iptr:&T_nowait, defintval:0, TYPE_INT, 0}, \ +{"T_dont_fork", CONFIG_HLP_TNOFORK, PARAMFLAG_BOOL, iptr:&T_dont_fork, defintval:0, TYPE_INT, 0}, \ +{"T_stdout", CONFIG_HLP_STDOUT, PARAMFLAG_BOOL, iptr:&T_stdout, defintval:1, TYPE_INT, 0}, \ } diff --git a/common/utils/T/T_defs.h b/common/utils/T/T_defs.h index b0b9940c30b669832edfe1a817d1f56ebec3a096..83a380662d025fcc8056375667d0d1f0f752998d 100644 --- a/common/utils/T/T_defs.h +++ b/common/utils/T/T_defs.h @@ -31,13 +31,15 @@ #endif typedef struct { + /* 'busy' is a bit field + * bit 0: 1 means that slot is acquired by writer + * bit 1: 1 means that slot is ready for consumption + */ volatile int busy; char buffer[T_BUFFER_MAX]; int length; } T_cache_t; -#define T_SHM_FILENAME "/T_shm_segment" - /* number of VCD functions (to be kept up to date! see in T_messages.txt) */ #define VCD_NUM_FUNCTIONS 190 diff --git a/common/utils/T/T_messages.txt b/common/utils/T/T_messages.txt index fd4425063b66a9d60f411e4a10560b5825caedce..676f329a0eb08fc4c2fb8e4efb2c69345e671f0e 100644 --- a/common/utils/T/T_messages.txt +++ b/common/utils/T/T_messages.txt @@ -749,6 +749,7 @@ ID = LEGACY_OSA_TRACE DESC = OSA legacy logs - trace level GROUP = ALL:LEGACY_OSA:LEGACY_GROUP_TRACE:LEGACY FORMAT = string,log + ID = LEGACY_SIM_INFO DESC = SIM legacy logs - info level GROUP = ALL:LEGACY_SIM:LEGACY_GROUP_INFO:LEGACY @@ -769,6 +770,7 @@ ID = LEGACY_SIM_TRACE DESC = SIM legacy logs - trace level GROUP = ALL:LEGACY_SIM:LEGACY_GROUP_TRACE:LEGACY FORMAT = string,log + # this is a bad hack but I won't fix (function util_print_hex_octets # in openairinterface5g/openair2/LAYER2/PDCP_v10.1.0/pdcp_util.c # does funky things with the LOG_x macros but we work on the C pre-processor @@ -922,30 +924,9 @@ ID = buf_test #VCD variables and functions #be careful! this must be synchronized with the code! -#also keep up to date VCD_NUM_VARIABLES and VCD_NUM_FUNCTIONS in T_defs.h - -#to synchronize: copy/paste from openair2/UTIL/LOG/vcd_signal_dumper.h -#the variables and functions name, replace "SIGNAL_DUMPER_VARIABLES" by -#"VARIABLE" and "SIGNAL_DUMPER_FUNCTIONS" by "FUNCTION" (check that -#everything is fine! for example we have -#VCD_SIGNAL_DUMPER_VARIABLE_ITTI_SEND_MSG that has VARIABLE without S) -#and then process with sed - -#to generate variables: -#sed -e "s/ VCD_VARIABLE_\(.*\)/ID = VCD_VARIABLE_\1\n DESC = VCD variable \1\n GROUP = ALL:VCD:ENB\n FORMAT = ulong,value/" < VCD >> T_messages.txt - -#to generate functions: -#sed -e "s/ VCD_FUNCTION_\(.*\)/ID = VCD_FUNCTION_\1\n DESC = VCD function \1\n GROUP = ALL:VCD:ENB\n FORMAT = int,value/" < VCD.functions >> T_messages.txt - -#you may want to manually edit groups for UE instead of eNB - -#then count functions and variables and update VCD_NUM_FUNCTIONS and -#VCD_NUM_VARIABLES in T_defs.h - -#also verify that VCD_FIRST_FUNCTION and VCD_FIRST_VARIABLE are correct -#in T_defs.h. They have to point to the first function and variable -#as defined below. Note also that the order of the VCD functions -#and variables must be the same as in the code. +#also keep up to date VCD_NUM_VARIABLES, VCD_NUM_FUNCTIONS, +#VCD_FIRST_FUNCTION and VCD_FIRST_VARIABLE in T_defs.h +#to check that everything is correct you can run: make _check_vcd #variables @@ -953,514 +934,642 @@ ID = VCD_VARIABLE_FRAME_NUMBER_TX0_ENB DESC = VCD variable FRAME_NUMBER_TX0_ENB GROUP = ALL:VCD:ENB:VCD_VARIABLE FORMAT = ulong,value + VCD_NAME = frame_number_TX0_eNB ID = VCD_VARIABLE_FRAME_NUMBER_TX1_ENB DESC = VCD variable FRAME_NUMBER_TX1_ENB GROUP = ALL:VCD:ENB:VCD_VARIABLE FORMAT = ulong,value + VCD_NAME = frame_number_TX1_eNB ID = VCD_VARIABLE_FRAME_NUMBER_RX0_ENB DESC = VCD variable FRAME_NUMBER_RX0_ENB GROUP = ALL:VCD:ENB:VCD_VARIABLE FORMAT = ulong,value + VCD_NAME = frame_number_RX0_eNB ID = VCD_VARIABLE_FRAME_NUMBER_RX1_ENB DESC = VCD variable FRAME_NUMBER_RX1_ENB GROUP = ALL:VCD:ENB:VCD_VARIABLE FORMAT = ulong,value + VCD_NAME = frame_number_RX1_eNB ID = VCD_VARIABLE_SUBFRAME_NUMBER_TX0_ENB DESC = VCD variable SUBFRAME_NUMBER_TX0_ENB GROUP = ALL:VCD:ENB:VCD_VARIABLE FORMAT = ulong,value + VCD_NAME = subframe_number_TX0_eNB ID = VCD_VARIABLE_SUBFRAME_NUMBER_TX1_ENB DESC = VCD variable SUBFRAME_NUMBER_TX1_ENB GROUP = ALL:VCD:ENB:VCD_VARIABLE FORMAT = ulong,value + VCD_NAME = subframe_number_TX1_eNB ID = VCD_VARIABLE_SUBFRAME_NUMBER_RX0_ENB DESC = VCD variable SUBFRAME_NUMBER_RX0_ENB GROUP = ALL:VCD:ENB:VCD_VARIABLE FORMAT = ulong,value + VCD_NAME = subframe_number_RX0_eNB ID = VCD_VARIABLE_SUBFRAME_NUMBER_RX1_ENB DESC = VCD variable SUBFRAME_NUMBER_RX1_ENB GROUP = ALL:VCD:ENB:VCD_VARIABLE FORMAT = ulong,value + VCD_NAME = subframe_number_RX1_eNB ID = VCD_VARIABLE_FRAME_NUMBER_TX0_RU DESC = VCD variable FRAME_NUMBER_TX0_RU GROUP = ALL:VCD:ENB:VCD_VARIABLE FORMAT = ulong,value + VCD_NAME = frame_number_TX0_RU ID = VCD_VARIABLE_FRAME_NUMBER_TX1_RU DESC = VCD variable FRAME_NUMBER_TX1_RU GROUP = ALL:VCD:ENB:VCD_VARIABLE FORMAT = ulong,value + VCD_NAME = frame_number_TX1_RU ID = VCD_VARIABLE_FRAME_NUMBER_RX0_RU DESC = VCD variable FRAME_NUMBER_RX0_RU GROUP = ALL:VCD:ENB:VCD_VARIABLE FORMAT = ulong,value + VCD_NAME = frame_number_RX0_RU ID = VCD_VARIABLE_FRAME_NUMBER_RX1_RU DESC = VCD variable FRAME_NUMBER_RX1_RU GROUP = ALL:VCD:ENB:VCD_VARIABLE FORMAT = ulong,value + VCD_NAME = frame_number_RX1_RU ID = VCD_VARIABLE_SUBFRAME_NUMBER_TX0_RU DESC = VCD variable SUBFRAME_NUMBER_TX0_RU GROUP = ALL:VCD:ENB:VCD_VARIABLE FORMAT = ulong,value + VCD_NAME = subframe_number_TX0_RU ID = VCD_VARIABLE_SUBFRAME_NUMBER_TX1_RU DESC = VCD variable SUBFRAME_NUMBER_TX1_RU GROUP = ALL:VCD:ENB:VCD_VARIABLE FORMAT = ulong,value + VCD_NAME = subframe_number_TX1_RU ID = VCD_VARIABLE_SUBFRAME_NUMBER_RX0_RU DESC = VCD variable SUBFRAME_NUMBER_RX0_RU GROUP = ALL:VCD:ENB:VCD_VARIABLE FORMAT = ulong,value + VCD_NAME = subframe_number_RX0_RU ID = VCD_VARIABLE_SUBFRAME_NUMBER_RX1_RU DESC = VCD variable SUBFRAME_NUMBER_RX1_RU GROUP = ALL:VCD:ENB:VCD_VARIABLE FORMAT = ulong,value + VCD_NAME = subframe_number_RX1_RU ID = VCD_VARIABLE_RUNTIME_TX_ENB DESC = VCD variable RUNTIME_TX_ENB GROUP = ALL:VCD:ENB:VCD_VARIABLE FORMAT = ulong,value + VCD_NAME = runtime_TX_eNB ID = VCD_VARIABLE_RUNTIME_RX_ENB DESC = VCD variable RUNTIME_RX_ENB GROUP = ALL:VCD:ENB:VCD_VARIABLE FORMAT = ulong,value + VCD_NAME = runtime_RX_eNB ID = VCD_VARIABLE_FRAME_NUMBER_TX0_UE DESC = VCD variable FRAME_NUMBER_TX0_UE GROUP = ALL:VCD:UE:VCD_VARIABLE FORMAT = ulong,value + VCD_NAME = frame_number_TX0_UE ID = VCD_VARIABLE_FRAME_NUMBER_TX1_UE DESC = VCD variable FRAME_NUMBER_TX1_UE GROUP = ALL:VCD:UE:VCD_VARIABLE FORMAT = ulong,value + VCD_NAME = frame_number_TX1_UE ID = VCD_VARIABLE_FRAME_NUMBER_RX0_UE DESC = VCD variable FRAME_NUMBER_RX0_UE GROUP = ALL:VCD:UE:VCD_VARIABLE FORMAT = ulong,value + VCD_NAME = frame_number_RX0_UE ID = VCD_VARIABLE_FRAME_NUMBER_RX1_UE DESC = VCD variable FRAME_NUMBER_RX1_UE GROUP = ALL:VCD:UE:VCD_VARIABLE FORMAT = ulong,value + VCD_NAME = frame_number_RX1_UE ID = VCD_VARIABLE_SUBFRAME_NUMBER_TX0_UE DESC = VCD variable SUBFRAME_NUMBER_TX0_UE GROUP = ALL:VCD:UE:VCD_VARIABLE FORMAT = ulong,value + VCD_NAME = subframe_TX0_UE ID = VCD_VARIABLE_SUBFRAME_NUMBER_TX1_UE DESC = VCD variable SUBFRAME_NUMBER_TX1_UE GROUP = ALL:VCD:UE:VCD_VARIABLE FORMAT = ulong,value + VCD_NAME = subframe_TX1_UE ID = VCD_VARIABLE_SUBFRAME_NUMBER_RX0_UE DESC = VCD variable SUBFRAME_NUMBER_RX0_UE GROUP = ALL:VCD:UE:VCD_VARIABLE FORMAT = ulong,value + VCD_NAME = subframe_RX0_UE ID = VCD_VARIABLE_SUBFRAME_NUMBER_RX1_UE DESC = VCD variable SUBFRAME_NUMBER_RX1_UE GROUP = ALL:VCD:UE:VCD_VARIABLE FORMAT = ulong,value + VCD_NAME = subframe_RX1_UE ID = VCD_VARIABLE_UE_RX_OFFSET DESC = VCD variable UE_RX_OFFSET GROUP = ALL:VCD:UE:VCD_VARIABLE FORMAT = ulong,value + VCD_NAME = ue_rx_offset ID = VCD_VARIABLE_DIFF DESC = VCD variable DIFF GROUP = ALL:VCD:ENB:VCD_VARIABLE FORMAT = ulong,value + VCD_NAME = diff2 ID = VCD_VARIABLE_HW_SUBFRAME DESC = VCD variable HW_SUBFRAME GROUP = ALL:VCD:ENB:VCD_VARIABLE FORMAT = ulong,value + VCD_NAME = hw_subframe ID = VCD_VARIABLE_HW_FRAME DESC = VCD variable HW_FRAME GROUP = ALL:VCD:ENB:VCD_VARIABLE FORMAT = ulong,value + VCD_NAME = hw_frame ID = VCD_VARIABLE_HW_SUBFRAME_RX DESC = VCD variable HW_SUBFRAME_RX GROUP = ALL:VCD:ENB:VCD_VARIABLE FORMAT = ulong,value + VCD_NAME = hw_subframe_rx ID = VCD_VARIABLE_HW_FRAME_RX DESC = VCD variable HW_FRAME_RX GROUP = ALL:VCD:ENB:VCD_VARIABLE FORMAT = ulong,value + VCD_NAME = hw_frame_rx ID = VCD_VARIABLE_TXCNT DESC = VCD variable TXCNT GROUP = ALL:VCD:ENB:VCD_VARIABLE FORMAT = ulong,value + VCD_NAME = txcnt ID = VCD_VARIABLE_RXCNT DESC = VCD variable RXCNT GROUP = ALL:VCD:ENB:VCD_VARIABLE FORMAT = ulong,value + VCD_NAME = rxcnt ID = VCD_VARIABLE_TRX_TS DESC = VCD variable TRX_TS GROUP = ALL:VCD:ENB:VCD_VARIABLE FORMAT = ulong,value + VCD_NAME = trx_ts ID = VCD_VARIABLE_TRX_TST DESC = VCD variable TRX_TST GROUP = ALL:VCD:ENB:VCD_VARIABLE FORMAT = ulong,value + VCD_NAME = trx_tst ID = VCD_VARIABLE_TRX_TS_UE DESC = VCD variable TRX_TS_UE GROUP = ALL:VCD:UE:VCD_VARIABLE FORMAT = ulong,value + VCD_NAME = trx_ts_ue ID = VCD_VARIABLE_TRX_TST_UE DESC = VCD variable TRX_TST_UE GROUP = ALL:VCD:UE:VCD_VARIABLE FORMAT = ulong,value + VCD_NAME = trx_tst_ue ID = VCD_VARIABLE_TRX_WRITE_FLAGS DESC = VCD variable TRX_WRITE_FLAGS GROUP = ALL:VCD:ENB:VCD_VARIABLE FORMAT = ulong,value + VCD_NAME = trx_write_flags ID = VCD_VARIABLE_TX_TS DESC = VCD variable TX_TS GROUP = ALL:VCD:ENB:VCD_VARIABLE FORMAT = ulong,value + VCD_NAME = tx_ts ID = VCD_VARIABLE_RX_TS DESC = VCD variable RX_TS GROUP = ALL:VCD:ENB:VCD_VARIABLE FORMAT = ulong,value + VCD_NAME = rx_ts ID = VCD_VARIABLE_RX_HWCNT DESC = VCD variable RX_HWCNT GROUP = ALL:VCD:ENB:VCD_VARIABLE FORMAT = ulong,value + VCD_NAME = hw_cnt_rx ID = VCD_VARIABLE_RX_LHWCNT DESC = VCD variable RX_LHWCNT GROUP = ALL:VCD:ENB:VCD_VARIABLE FORMAT = ulong,value + VCD_NAME = lhw_cnt_rx ID = VCD_VARIABLE_TX_HWCNT DESC = VCD variable TX_HWCNT GROUP = ALL:VCD:ENB:VCD_VARIABLE FORMAT = ulong,value + VCD_NAME = hw_cnt_tx ID = VCD_VARIABLE_TX_LHWCNT DESC = VCD variable TX_LHWCNT GROUP = ALL:VCD:ENB:VCD_VARIABLE FORMAT = ulong,value + VCD_NAME = lhw_cnt_tx ID = VCD_VARIABLE_RX_PCK DESC = VCD variable RX_PCK GROUP = ALL:VCD:ENB:VCD_VARIABLE FORMAT = ulong,value + VCD_NAME = pck_rx ID = VCD_VARIABLE_TX_PCK DESC = VCD variable TX_PCK GROUP = ALL:VCD:ENB:VCD_VARIABLE FORMAT = ulong,value + VCD_NAME = pck_tx ID = VCD_VARIABLE_RX_SEQ_NUM DESC = VCD variable RX_SEQ_NUM GROUP = ALL:VCD:ENB:VCD_VARIABLE FORMAT = ulong,value + VCD_NAME = rx_seq_num ID = VCD_VARIABLE_RX_SEQ_NUM_PRV DESC = VCD variable RX_SEQ_NUM_PRV GROUP = ALL:VCD:ENB:VCD_VARIABLE FORMAT = ulong,value + VCD_NAME = rx_seq_num_prv ID = VCD_VARIABLE_TX_SEQ_NUM DESC = VCD variable TX_SEQ_NUM GROUP = ALL:VCD:ENB:VCD_VARIABLE FORMAT = ulong,value + VCD_NAME = tx_seq_num ID = VCD_VARIABLE_CNT DESC = VCD variable CNT GROUP = ALL:VCD:ENB:VCD_VARIABLE FORMAT = ulong,value + VCD_NAME = cnt ID = VCD_VARIABLE_DUMMY_DUMP DESC = VCD variable DUMMY_DUMP GROUP = ALL:VCD:ENB:VCD_VARIABLE FORMAT = ulong,value + VCD_NAME = dummy_dump ID = VCD_VARIABLE_ITTI_SEND_MSG DESC = VCD variable ITTI_SEND_MSG GROUP = ALL:VCD:ENB:VCD_VARIABLE FORMAT = ulong,value + VCD_NAME = itti_send_msg ID = VCD_VARIABLE_ITTI_POLL_MSG DESC = VCD variable ITTI_POLL_MSG GROUP = ALL:VCD:ENB:VCD_VARIABLE FORMAT = ulong,value + VCD_NAME = itti_poll_msg ID = VCD_VARIABLE_ITTI_RECV_MSG DESC = VCD variable ITTI_RECV_MSG GROUP = ALL:VCD:ENB:VCD_VARIABLE FORMAT = ulong,value + VCD_NAME = itti_recv_msg ID = VCD_VARIABLE_ITTI_ALLOC_MSG DESC = VCD variable ITTI_ALLOC_MSG GROUP = ALL:VCD:ENB:VCD_VARIABLE FORMAT = ulong,value + VCD_NAME = itti_alloc_msg ID = VCD_VARIABLE_MP_ALLOC DESC = VCD variable MP_ALLOC GROUP = ALL:VCD:ENB:VCD_VARIABLE FORMAT = ulong,value + VCD_NAME = mp_alloc ID = VCD_VARIABLE_MP_FREE DESC = VCD variable MP_FREE GROUP = ALL:VCD:ENB:VCD_VARIABLE FORMAT = ulong,value + VCD_NAME = mp_free ID = VCD_VARIABLE_UE_INST_CNT_RX DESC = VCD variable UE_INST_CNT_RX GROUP = ALL:VCD:UE:VCD_VARIABLE FORMAT = ulong,value + VCD_NAME = ue_inst_cnt_rx ID = VCD_VARIABLE_UE_INST_CNT_TX DESC = VCD variable UE_INST_CNT_TX GROUP = ALL:VCD:UE:VCD_VARIABLE FORMAT = ulong,value + VCD_NAME = ue_inst_cnt_tx ID = VCD_VARIABLE_DCI_INFO DESC = VCD variable DCI_INFO GROUP = ALL:VCD:ENB:VCD_VARIABLE FORMAT = ulong,value + VCD_NAME = dci_info ID = VCD_VARIABLE_UE0_BSR DESC = VCD variable UE0_BSR GROUP = ALL:VCD:ENB:VCD_VARIABLE FORMAT = ulong,value + VCD_NAME = ue0_BSR ID = VCD_VARIABLE_UE0_BO DESC = VCD variable UE0_BO GROUP = ALL:VCD:ENB:VCD_VARIABLE FORMAT = ulong,value + VCD_NAME = ue0_BO ID = VCD_VARIABLE_UE0_SCHEDULED DESC = VCD variable UE0_SCHEDULED GROUP = ALL:VCD:ENB:VCD_VARIABLE FORMAT = ulong,value + VCD_NAME = ue0_scheduled ID = VCD_VARIABLE_UE0_TIMING_ADVANCE DESC = VCD variable UE0_TIMING_ADVANCE GROUP = ALL:VCD:ENB:VCD_VARIABLE FORMAT = ulong,value + VCD_NAME = ue0_timing_advance ID = VCD_VARIABLE_UE0_SR_ENERGY DESC = VCD variable UE0_SR_ENERGY GROUP = ALL:VCD:ENB:VCD_VARIABLE FORMAT = ulong,value + VCD_NAME = ue0_SR_ENERGY ID = VCD_VARIABLE_UE0_SR_THRES DESC = VCD variable UE0_SR_THRES GROUP = ALL:VCD:ENB:VCD_VARIABLE FORMAT = ulong,value + VCD_NAME = ue0_SR_THRES ID = VCD_VARIABLE_UE0_RSSI0 DESC = VCD variable UE0_RSSI0 GROUP = ALL:VCD:ENB:VCD_VARIABLE FORMAT = ulong,value + VCD_NAME = ue0_rssi0 ID = VCD_VARIABLE_UE0_RSSI1 DESC = VCD variable UE0_RSSI1 GROUP = ALL:VCD:ENB:VCD_VARIABLE FORMAT = ulong,value + VCD_NAME = ue0_rssi1 ID = VCD_VARIABLE_UE0_RSSI2 DESC = VCD variable UE0_RSSI2 GROUP = ALL:VCD:ENB:VCD_VARIABLE FORMAT = ulong,value + VCD_NAME = ue0_rssi2 ID = VCD_VARIABLE_UE0_RSSI3 DESC = VCD variable UE0_RSSI3 GROUP = ALL:VCD:ENB:VCD_VARIABLE FORMAT = ulong,value + VCD_NAME = ue0_rssi3 ID = VCD_VARIABLE_UE0_RSSI4 DESC = VCD variable UE0_RSSI4 GROUP = ALL:VCD:ENB:VCD_VARIABLE FORMAT = ulong,value + VCD_NAME = ue0_rssi4 ID = VCD_VARIABLE_UE0_RSSI5 DESC = VCD variable UE0_RSSI5 GROUP = ALL:VCD:ENB:VCD_VARIABLE FORMAT = ulong,value + VCD_NAME = ue0_rssi5 ID = VCD_VARIABLE_UE0_RSSI6 DESC = VCD variable UE0_RSSI6 GROUP = ALL:VCD:ENB:VCD_VARIABLE FORMAT = ulong,value + VCD_NAME = ue0_rssi6 ID = VCD_VARIABLE_UE0_RSSI7 DESC = VCD variable UE0_RSSI7 GROUP = ALL:VCD:ENB:VCD_VARIABLE FORMAT = ulong,value + VCD_NAME = ue0_rssi7 ID = VCD_VARIABLE_UE0_RES0 DESC = VCD variable UE0_RES0 GROUP = ALL:VCD:ENB:VCD_VARIABLE FORMAT = ulong,value + VCD_NAME = ue0_res0 ID = VCD_VARIABLE_UE0_RES1 DESC = VCD variable UE0_RES1 GROUP = ALL:VCD:ENB:VCD_VARIABLE FORMAT = ulong,value + VCD_NAME = ue0_res1 ID = VCD_VARIABLE_UE0_RES2 DESC = VCD variable UE0_RES2 GROUP = ALL:VCD:ENB:VCD_VARIABLE FORMAT = ulong,value + VCD_NAME = ue0_res2 ID = VCD_VARIABLE_UE0_RES3 DESC = VCD variable UE0_RES3 GROUP = ALL:VCD:ENB:VCD_VARIABLE FORMAT = ulong,value + VCD_NAME = ue0_res3 ID = VCD_VARIABLE_UE0_RES4 DESC = VCD variable UE0_RES4 GROUP = ALL:VCD:ENB:VCD_VARIABLE FORMAT = ulong,value + VCD_NAME = ue0_res4 ID = VCD_VARIABLE_UE0_RES5 DESC = VCD variable UE0_RES5 GROUP = ALL:VCD:ENB:VCD_VARIABLE FORMAT = ulong,value + VCD_NAME = ue0_res5 ID = VCD_VARIABLE_UE0_RES6 DESC = VCD variable UE0_RES6 GROUP = ALL:VCD:ENB:VCD_VARIABLE FORMAT = ulong,value + VCD_NAME = ue0_res6 ID = VCD_VARIABLE_UE0_RES7 DESC = VCD variable UE0_RES7 GROUP = ALL:VCD:ENB:VCD_VARIABLE FORMAT = ulong,value + VCD_NAME = ue0_res7 ID = VCD_VARIABLE_UE0_MCS0 DESC = VCD variable UE0_MCS0 GROUP = ALL:VCD:ENB:VCD_VARIABLE FORMAT = ulong,value + VCD_NAME = ue0_MCS0 ID = VCD_VARIABLE_UE0_MCS1 DESC = VCD variable UE0_MCS1 GROUP = ALL:VCD:ENB:VCD_VARIABLE FORMAT = ulong,value + VCD_NAME = ue0_MCS1 ID = VCD_VARIABLE_UE0_MCS2 DESC = VCD variable UE0_MCS2 GROUP = ALL:VCD:ENB:VCD_VARIABLE FORMAT = ulong,value + VCD_NAME = ue0_MCS2 ID = VCD_VARIABLE_UE0_MCS3 DESC = VCD variable UE0_MCS3 GROUP = ALL:VCD:ENB:VCD_VARIABLE FORMAT = ulong,value + VCD_NAME = ue0_MCS3 ID = VCD_VARIABLE_UE0_MCS4 DESC = VCD variable UE0_MCS4 GROUP = ALL:VCD:ENB:VCD_VARIABLE FORMAT = ulong,value + VCD_NAME = ue0_MCS4 ID = VCD_VARIABLE_UE0_MCS5 DESC = VCD variable UE0_MCS5 GROUP = ALL:VCD:ENB:VCD_VARIABLE FORMAT = ulong,value + VCD_NAME = ue0_MCS5 ID = VCD_VARIABLE_UE0_MCS6 DESC = VCD variable UE0_MCS6 GROUP = ALL:VCD:ENB:VCD_VARIABLE FORMAT = ulong,value + VCD_NAME = ue0_MCS6 ID = VCD_VARIABLE_UE0_MCS7 DESC = VCD variable UE0_MCS7 GROUP = ALL:VCD:ENB:VCD_VARIABLE FORMAT = ulong,value + VCD_NAME = ue0_MCS7 ID = VCD_VARIABLE_UE0_RB0 DESC = VCD variable UE0_RB0 GROUP = ALL:VCD:ENB:VCD_VARIABLE FORMAT = ulong,value + VCD_NAME = ue0_RB0 ID = VCD_VARIABLE_UE0_RB1 DESC = VCD variable UE0_RB1 GROUP = ALL:VCD:ENB:VCD_VARIABLE FORMAT = ulong,value + VCD_NAME = ue0_RB1 ID = VCD_VARIABLE_UE0_RB2 DESC = VCD variable UE0_RB2 GROUP = ALL:VCD:ENB:VCD_VARIABLE FORMAT = ulong,value + VCD_NAME = ue0_RB2 ID = VCD_VARIABLE_UE0_RB3 DESC = VCD variable UE0_RB3 GROUP = ALL:VCD:ENB:VCD_VARIABLE FORMAT = ulong,value + VCD_NAME = ue0_RB3 ID = VCD_VARIABLE_UE0_RB4 DESC = VCD variable UE0_RB4 GROUP = ALL:VCD:ENB:VCD_VARIABLE FORMAT = ulong,value + VCD_NAME = ue0_RB4 ID = VCD_VARIABLE_UE0_RB5 DESC = VCD variable UE0_RB5 GROUP = ALL:VCD:ENB:VCD_VARIABLE FORMAT = ulong,value + VCD_NAME = ue0_RB5 ID = VCD_VARIABLE_UE0_RB6 DESC = VCD variable UE0_RB6 GROUP = ALL:VCD:ENB:VCD_VARIABLE FORMAT = ulong,value + VCD_NAME = ue0_RB6 ID = VCD_VARIABLE_UE0_RB7 DESC = VCD variable UE0_RB7 GROUP = ALL:VCD:ENB:VCD_VARIABLE FORMAT = ulong,value + VCD_NAME = ue0_RB7 ID = VCD_VARIABLE_UE0_ROUND0 DESC = VCD variable UE0_ROUND0 GROUP = ALL:VCD:ENB:VCD_VARIABLE FORMAT = ulong,value + VCD_NAME = ue0_ROUND0 ID = VCD_VARIABLE_UE0_ROUND1 DESC = VCD variable UE0_ROUND1 GROUP = ALL:VCD:ENB:VCD_VARIABLE FORMAT = ulong,value + VCD_NAME = ue0_ROUND1 ID = VCD_VARIABLE_UE0_ROUND2 DESC = VCD variable UE0_ROUND2 GROUP = ALL:VCD:ENB:VCD_VARIABLE FORMAT = ulong,value + VCD_NAME = ue0_ROUND2 ID = VCD_VARIABLE_UE0_ROUND3 DESC = VCD variable UE0_ROUND3 GROUP = ALL:VCD:ENB:VCD_VARIABLE FORMAT = ulong,value + VCD_NAME = ue0_ROUND3 ID = VCD_VARIABLE_UE0_ROUND4 DESC = VCD variable UE0_ROUND4 GROUP = ALL:VCD:ENB:VCD_VARIABLE FORMAT = ulong,value + VCD_NAME = ue0_ROUND4 ID = VCD_VARIABLE_UE0_ROUND5 DESC = VCD variable UE0_ROUND5 GROUP = ALL:VCD:ENB:VCD_VARIABLE FORMAT = ulong,value + VCD_NAME = ue0_ROUND5 ID = VCD_VARIABLE_UE0_ROUND6 DESC = VCD variable UE0_ROUND6 GROUP = ALL:VCD:ENB:VCD_VARIABLE FORMAT = ulong,value + VCD_NAME = ue0_ROUND6 ID = VCD_VARIABLE_UE0_ROUND7 DESC = VCD variable UE0_ROUND7 GROUP = ALL:VCD:ENB:VCD_VARIABLE FORMAT = ulong,value + VCD_NAME = ue0_ROUND7 ID = VCD_VARIABLE_UE0_SFN0 DESC = VCD variable UE0_SFN0 GROUP = ALL:VCD:ENB:VCD_VARIABLE FORMAT = ulong,value + VCD_NAME = ue0_SFN0 ID = VCD_VARIABLE_UE0_SFN1 DESC = VCD variable UE0_SFN1 GROUP = ALL:VCD:ENB:VCD_VARIABLE FORMAT = ulong,value + VCD_NAME = ue0_SFN1 ID = VCD_VARIABLE_UE0_SFN2 DESC = VCD variable UE0_SFN2 GROUP = ALL:VCD:ENB:VCD_VARIABLE FORMAT = ulong,value + VCD_NAME = ue0_SFN2 ID = VCD_VARIABLE_UE0_SFN3 DESC = VCD variable UE0_SFN3 GROUP = ALL:VCD:ENB:VCD_VARIABLE FORMAT = ulong,value + VCD_NAME = ue0_SFN3 ID = VCD_VARIABLE_UE0_SFN4 DESC = VCD variable UE0_SFN4 GROUP = ALL:VCD:ENB:VCD_VARIABLE FORMAT = ulong,value + VCD_NAME = ue0_SFN4 ID = VCD_VARIABLE_UE0_SFN5 DESC = VCD variable UE0_SFN5 GROUP = ALL:VCD:ENB:VCD_VARIABLE FORMAT = ulong,value + VCD_NAME = ue0_SFN5 ID = VCD_VARIABLE_UE0_SFN6 DESC = VCD variable UE0_SFN6 GROUP = ALL:VCD:ENB:VCD_VARIABLE FORMAT = ulong,value + VCD_NAME = ue0_SFN6 ID = VCD_VARIABLE_UE0_SFN7 DESC = VCD variable UE0_SFN7 GROUP = ALL:VCD:ENB:VCD_VARIABLE FORMAT = ulong,value + VCD_NAME = ue0_SFN7 ID = VCD_VARIABLE_SEND_IF4_SYMBOL DESC = VCD variable SEND_IF4_SYMBOL GROUP = ALL:VCD:ENB:VCD_VARIABLE FORMAT = ulong,value + VCD_NAME = send_if4_symbol ID = VCD_VARIABLE_RECV_IF4_SYMBOL DESC = VCD variable RECV_IF4_SYMBOL GROUP = ALL:VCD:ENB:VCD_VARIABLE FORMAT = ulong,value + VCD_NAME = recv_if4_symbol ID = VCD_VARIABLE_SEND_IF5_PKT_ID DESC = VCD variable SEND_IF5_PKT_ID GROUP = ALL:VCD:ENB:VCD_VARIABLE FORMAT = ulong,value + VCD_NAME = send_if5_pkt_id ID = VCD_VARIABLE_RECV_IF5_PKT_ID DESC = VCD variable RECV_IF5_PKT_ID GROUP = ALL:VCD:ENB:VCD_VARIABLE FORMAT = ulong,value + VCD_NAME = recv_if5_pkt_id ID = VCD_VARIABLE_UE_PDCP_FLUSH_SIZE DESC = VCD variable UE_PDCP_FLUSH_SIZE GROUP = ALL:VCD:ENB:UE:VCD_VARIABLE FORMAT = ulong,value + VCD_NAME = ue_pdcp_flush_size ID = VCD_VARIABLE_UE_PDCP_FLUSH_ERR DESC = VCD variable UE_PDCP_FLUSH_ERR GROUP = ALL:VCD:ENB:UE:VCD_VARIABLE FORMAT = ulong,value + VCD_NAME = ue_pdcp_flush_err ID = VCD_VARIABLE_UE0_TRX_READ_NS DESC = VCD variable UE0_TRX_READ_NS GROUP = ALL:VCD:UE:VCD_VARIABLE FORMAT = ulong,value + VCD_NAME = ue0_trx_read_ns ID = VCD_VARIABLE_UE0_TRX_WRITE_NS DESC = VCD variable UE0_TRX_WRITE_NS GROUP = ALL:VCD:UE:VCD_VARIABLE FORMAT = ulong,value + VCD_NAME = ue0_trx_write_ns ID = VCD_VARIABLE_UE0_TRX_READ_NS_MISSING DESC = VCD variable UE0_TRX_READ_NS_MISSING GROUP = ALL:VCD:UE:VCD_VARIABLE FORMAT = ulong,value + VCD_NAME = ue0_trx_read_ns_missing ID = VCD_VARIABLE_UE0_TRX_WRITE_NS_MISSING DESC = VCD variable UE0_TRX_WRITE_NS_MISSING GROUP = ALL:VCD:UE:VCD_VARIABLE FORMAT = ulong,value + VCD_NAME = ue0_trx_write_ns_missing ID = VCD_VARIABLE_CPUID_ENB_THREAD_RXTX DESC = VCD variable CPUID_ENB_THREAD_RXTX GROUP = ALL:VCD:ENB:VCD_VARIABLE FORMAT = ulong,value + VCD_NAME = enb_thread_rxtx_CPUID ID = VCD_VARIABLE_CPUID_RU_THREAD DESC = VCD variable CPUID_RU_THREAD GROUP = ALL:VCD:ENB:VCD_VARIABLE FORMAT = ulong,value + VCD_NAME = ru_thread_CPUID ID = VCD_VARIABLE_CPUID_RU_THREAD_TX DESC = VCD variable CPUID_RU_THREAD_TX GROUP = ALL:VCD:ENB:VCD_VARIABLE FORMAT = ulong,value + VCD_NAME = ru_thread_tx_CPUID #functions @@ -1468,763 +1577,954 @@ ID = VCD_FUNCTION_RT_SLEEP DESC = VCD function RT_SLEEP GROUP = ALL:VCD:ENB:VCD_FUNCTION FORMAT = int,value + VCD_NAME = rt_sleep ID = VCD_FUNCTION_TRX_READ DESC = VCD function TRX_READ GROUP = ALL:VCD:ENB:VCD_FUNCTION FORMAT = int,value + VCD_NAME = trx_read ID = VCD_FUNCTION_TRX_WRITE DESC = VCD function TRX_WRITE GROUP = ALL:VCD:ENB:VCD_FUNCTION FORMAT = int,value + VCD_NAME = trx_write ID = VCD_FUNCTION_TRX_READ_UE DESC = VCD function TRX_READ_UE GROUP = ALL:VCD:UE:VCD_FUNCTION FORMAT = int,value + VCD_NAME = trx_read_ue ID = VCD_FUNCTION_TRX_WRITE_UE DESC = VCD function TRX_WRITE_UE GROUP = ALL:VCD:UE:VCD_FUNCTION FORMAT = int,value + VCD_NAME = trx_write_ue ID = VCD_FUNCTION_TRX_READ_IF DESC = VCD function TRX_READ_IF GROUP = ALL:VCD:ENB:VCD_FUNCTION FORMAT = int,value + VCD_NAME = trx_read_if ID = VCD_FUNCTION_TRX_WRITE_IF DESC = VCD function TRX_WRITE_IF GROUP = ALL:VCD:ENB:VCD_FUNCTION FORMAT = int,value + VCD_NAME = trx_write_if ID = VCD_FUNCTION_eNB_PROC_RXTX0 DESC = VCD function eNB_PROC_RXTX0 GROUP = ALL:VCD:ENB:VCD_FUNCTION FORMAT = int,value + VCD_NAME = eNB_thread_rxtx0 ID = VCD_FUNCTION_eNB_PROC_RXTX1 DESC = VCD function eNB_PROC_RXTX1 GROUP = ALL:VCD:ENB:VCD_FUNCTION FORMAT = int,value + VCD_NAME = eNB_thread_rxtx1 ID = VCD_FUNCTION_UE_THREAD_SYNCH DESC = VCD function UE_THREAD_SYNCH GROUP = ALL:VCD:UE:VCD_FUNCTION FORMAT = int,value + VCD_NAME = ue_thread_synch ID = VCD_FUNCTION_UE_THREAD_RXTX0 DESC = VCD function UE_THREAD_RXTX0 GROUP = ALL:VCD:UE:VCD_FUNCTION FORMAT = int,value + VCD_NAME = ue_thread_rxtx0 ID = VCD_FUNCTION_UE_THREAD_RXTX1 DESC = VCD function UE_THREAD_RXTX1 GROUP = ALL:VCD:UE:VCD_FUNCTION FORMAT = int,value + VCD_NAME = ue_thread_rxtx1 ID = VCD_FUNCTION_TRX_READ_SF9 DESC = VCD function TRX_READ_SF9 GROUP = ALL:VCD:UE:VCD_FUNCTION FORMAT = int,value + VCD_NAME = trx_read_sf9 ID = VCD_FUNCTION_TRX_WRITE_SF9 DESC = VCD function TRX_WRITE_SF9 GROUP = ALL:VCD:UE:VCD_FUNCTION FORMAT = int,value + VCD_NAME = trx_write_sf9 ID = VCD_FUNCTION_UE_SIGNAL_COND_RXTX0 DESC = VCD function UE_SIGNAL_COND_RXTX0 GROUP = ALL:VCD:UE:VCD_FUNCTION FORMAT = int,value + VCD_NAME = ue_signal_cond_rxtx0 ID = VCD_FUNCTION_UE_SIGNAL_COND_RXTX1 DESC = VCD function UE_SIGNAL_COND_RXTX1 GROUP = ALL:VCD:UE:VCD_FUNCTION FORMAT = int,value + VCD_NAME = ue_signal_cond_rxtx1 ID = VCD_FUNCTION_UE_WAIT_COND_RXTX0 DESC = VCD function UE_WAIT_COND_RXTX0 GROUP = ALL:VCD:UE:VCD_FUNCTION FORMAT = int,value + VCD_NAME = ue_wait_cond_rxtx0 ID = VCD_FUNCTION_UE_WAIT_COND_RXTX1 DESC = VCD function UE_WAIT_COND_RXTX1 GROUP = ALL:VCD:UE:VCD_FUNCTION FORMAT = int,value + VCD_NAME = ue_wait_cond_rxtx1 ID = VCD_FUNCTION_UE_LOCK_MUTEX_RXTX_FOR_COND_WAIT0 DESC = VCD function UE_LOCK_MUTEX_RXTX_FOR_COND_WAIT0 GROUP = ALL:VCD:UE:VCD_FUNCTION FORMAT = int,value + VCD_NAME = ue_lock_mutex_rxtx_for_cond_wait0 ID = VCD_FUNCTION_UE_LOCK_MUTEX_RXTX_FOR_COND_WAIT1 DESC = VCD function UE_LOCK_MUTEX_RXTX_FOR_COND_WAIT1 GROUP = ALL:VCD:UE:VCD_FUNCTION FORMAT = int,value + VCD_NAME = ue_lock_mutex_rxtx_for_cond_wait1 ID = VCD_FUNCTION_UE_LOCK_MUTEX_RXTX_FOR_CNT_DECREMENT0 DESC = VCD function UE_LOCK_MUTEX_RXTX_FOR_CNT_DECREMENT0 GROUP = ALL:VCD:UE:VCD_FUNCTION FORMAT = int,value + VCD_NAME = ue_lock_mutex_rxtx_for_cnt_decrement0 ID = VCD_FUNCTION_UE_LOCK_MUTEX_RXTX_FOR_CNT_DECREMENT1 DESC = VCD function UE_LOCK_MUTEX_RXTX_FOR_CNT_DECREMENT1 GROUP = ALL:VCD:UE:VCD_FUNCTION FORMAT = int,value + VCD_NAME = ue_lock_mutex_rxtx_for_cnt_decrement1 ID = VCD_FUNCTION_UE_LOCK_MUTEX_RXTX_FOR_CNT_INCREMENT0 DESC = VCD function UE_LOCK_MUTEX_RXTX_FOR_CNT_INCREMENT0 GROUP = ALL:VCD:UE:VCD_FUNCTION FORMAT = int,value + VCD_NAME = ue_lock_mutex_rxtx_for_cnt_increment0 ID = VCD_FUNCTION_UE_LOCK_MUTEX_RXTX_FOR_CNT_INCREMENT1 DESC = VCD function UE_LOCK_MUTEX_RXTX_FOR_CNT_INCREMENT1 GROUP = ALL:VCD:UE:VCD_FUNCTION FORMAT = int,value + VCD_NAME = ue_lock_mutex_rxtx_for_cnt_increment1 ID = VCD_FUNCTION_SIM_DO_DL_SIGNAL DESC = VCD function SIM_DO_DL_SIGNAL GROUP = ALL:VCD:ENB:VCD_FUNCTION FORMAT = int,value + VCD_NAME = do_DL_sig ID = VCD_FUNCTION_SIM_DO_UL_SIGNAL DESC = VCD function SIM_DO_UL_SIGNAL GROUP = ALL:VCD:ENB:VCD_FUNCTION FORMAT = int,value + VCD_NAME = do_UL_sig ID = VCD_FUNCTION_SIM_UE_TRX_READ DESC = VCD function SIM_UE_TRX_READ GROUP = ALL:VCD:ENB:VCD_FUNCTION FORMAT = int,value + VCD_NAME = UE_trx_read ID = VCD_FUNCTION_eNB_TX DESC = VCD function eNB_TX GROUP = ALL:VCD:ENB:VCD_FUNCTION FORMAT = int,value + VCD_NAME = eNB_tx ID = VCD_FUNCTION_eNB_RX DESC = VCD function eNB_RX GROUP = ALL:VCD:ENB:VCD_FUNCTION FORMAT = int,value + VCD_NAME = eNB_rx ID = VCD_FUNCTION_eNB_TRX DESC = VCD function eNB_TRX GROUP = ALL:VCD:ENB:VCD_FUNCTION FORMAT = int,value + VCD_NAME = eNB_trx ID = VCD_FUNCTION_eNB_TM DESC = VCD function eNB_TM GROUP = ALL:VCD:ENB:VCD_FUNCTION FORMAT = int,value + VCD_NAME = eNB_tm ID = VCD_FUNCTION_eNB_RX_SLEEP DESC = VCD function eNB_RX_SLEEP GROUP = ALL:VCD:ENB:VCD_FUNCTION FORMAT = int,value + VCD_NAME = eNB_rx_sleep ID = VCD_FUNCTION_eNB_TX_SLEEP DESC = VCD function eNB_TX_SLEEP GROUP = ALL:VCD:ENB:VCD_FUNCTION FORMAT = int,value + VCD_NAME = eNB_tx_sleep ID = VCD_FUNCTION_eNB_PROC_SLEEP DESC = VCD function eNB_PROC_SLEEP GROUP = ALL:VCD:ENB:VCD_FUNCTION FORMAT = int,value + VCD_NAME = eNB_proc_sleep ID = VCD_FUNCTION_TRX_READ_RF DESC = VCD function TRX_READ_RF GROUP = ALL:VCD:ENB:VCD_FUNCTION FORMAT = int,value + VCD_NAME = trx_read_rf ID = VCD_FUNCTION_TRX_WRITE_RF DESC = VCD function TRX_WRITE_RF GROUP = ALL:VCD:ENB:VCD_FUNCTION FORMAT = int,value + VCD_NAME = trx_write_rf ID = VCD_FUNCTION_UE_SYNCH DESC = VCD function UE_SYNCH GROUP = ALL:VCD:UE:VCD_FUNCTION FORMAT = int,value + VCD_NAME = ue_synch ID = VCD_FUNCTION_UE_SLOT_FEP DESC = VCD function UE_SLOT_FEP GROUP = ALL:VCD:UE:VCD_FUNCTION FORMAT = int,value + VCD_NAME = ue_slot_fep ID = VCD_FUNCTION_UE_RRC_MEASUREMENTS DESC = VCD function UE_RRC_MEASUREMENTS GROUP = ALL:VCD:UE:VCD_FUNCTION FORMAT = int,value + VCD_NAME = ue_rrc_measurements ID = VCD_FUNCTION_UE_GAIN_CONTROL DESC = VCD function UE_GAIN_CONTROL GROUP = ALL:VCD:UE:VCD_FUNCTION FORMAT = int,value + VCD_NAME = ue_gain_control ID = VCD_FUNCTION_UE_ADJUST_SYNCH DESC = VCD function UE_ADJUST_SYNCH GROUP = ALL:VCD:UE:VCD_FUNCTION FORMAT = int,value + VCD_NAME = ue_adjust_synch ID = VCD_FUNCTION_UE_MEASUREMENT_PROCEDURES DESC = VCD function UE_MEASUREMENT_PROCEDURES GROUP = ALL:VCD:UE:VCD_FUNCTION FORMAT = int,value + VCD_NAME = lte_ue_measurement_procedures ID = VCD_FUNCTION_UE_PDCCH_PROCEDURES DESC = VCD function UE_PDCCH_PROCEDURES GROUP = ALL:VCD:UE:VCD_FUNCTION FORMAT = int,value + VCD_NAME = lte_ue_pdcch_procedures ID = VCD_FUNCTION_UE_PBCH_PROCEDURES DESC = VCD function UE_PBCH_PROCEDURES GROUP = ALL:VCD:UE:VCD_FUNCTION FORMAT = int,value + VCD_NAME = lte_ue_pbch_procedures ID = VCD_FUNCTION_PHY_PROCEDURES_ENB_TX DESC = VCD function PHY_PROCEDURES_ENB_TX GROUP = ALL:VCD:ENB:VCD_FUNCTION FORMAT = int,value + VCD_NAME = phy_procedures_eNb_tx0 ID = VCD_FUNCTION_PHY_PROCEDURES_ENB_TX1 DESC = VCD function PHY_PROCEDURES_ENB_TX1 GROUP = ALL:VCD:ENB:VCD_FUNCTION FORMAT = int,value + VCD_NAME = phy_procedures_eNb_tx1 ID = VCD_FUNCTION_PHY_PROCEDURES_RU_FEPRX DESC = VCD function PHY_PROCEDURES_RU_FEPRX GROUP = ALL:VCD:ENB:VCD_FUNCTION FORMAT = int,value + VCD_NAME = phy_procedures_ru_feprx0 ID = VCD_FUNCTION_PHY_PROCEDURES_RU_FEPRX1 DESC = VCD function PHY_PROCEDURES_RU_FEPRX1 GROUP = ALL:VCD:ENB:VCD_FUNCTION FORMAT = int,value + VCD_NAME = phy_procedures_ru_feprx1 ID = VCD_FUNCTION_PHY_PROCEDURES_RU_FEPTX_OFDM DESC = VCD function PHY_PROCEDURES_RU_FEPTX_OFDM GROUP = ALL:VCD:ENB:VCD_FUNCTION FORMAT = int,value + VCD_NAME = phy_procedures_ru_feptx_ofdm0 ID = VCD_FUNCTION_PHY_PROCEDURES_RU_FEPTX_OFDM1 DESC = VCD function PHY_PROCEDURES_RU_FEPTX_OFDM1 GROUP = ALL:VCD:ENB:VCD_FUNCTION FORMAT = int,value + VCD_NAME = phy_procedures_ru_feptx_ofdm1 ID = VCD_FUNCTION_PHY_PROCEDURES_RU_FEPTX_PREC DESC = VCD function PHY_PROCEDURES_RU_FEPTX_PREC GROUP = ALL:VCD:ENB:VCD_FUNCTION FORMAT = int,value + VCD_NAME = phy_procedures_ru_feptx_prec0 ID = VCD_FUNCTION_PHY_PROCEDURES_RU_FEPTX_PREC1 DESC = VCD function PHY_PROCEDURES_RU_FEPTX_PREC1 GROUP = ALL:VCD:ENB:VCD_FUNCTION FORMAT = int,value + VCD_NAME = phy_procedures_ru_feptx_prec1 ID = VCD_FUNCTION_PHY_PROCEDURES_ENB_RX_UESPEC DESC = VCD function PHY_PROCEDURES_ENB_RX_UESPEC GROUP = ALL:VCD:ENB:VCD_FUNCTION FORMAT = int,value + VCD_NAME = phy_procedures_eNb_rx_uespec0 ID = VCD_FUNCTION_PHY_PROCEDURES_ENB_RX_UESPEC1 DESC = VCD function PHY_PROCEDURES_ENB_RX_UESPEC1 GROUP = ALL:VCD:ENB:VCD_FUNCTION FORMAT = int,value + VCD_NAME = phy_procedures_eNb_rx_uespec1 ID = VCD_FUNCTION_PHY_PROCEDURES_UE_TX DESC = VCD function PHY_PROCEDURES_UE_TX GROUP = ALL:VCD:UE:VCD_FUNCTION FORMAT = int,value + VCD_NAME = phy_procedures_ue_tx ID = VCD_FUNCTION_PHY_PROCEDURES_UE_RX DESC = VCD function PHY_PROCEDURES_UE_RX GROUP = ALL:VCD:UE:VCD_FUNCTION FORMAT = int,value + VCD_NAME = phy_procedures_ue_rx ID = VCD_FUNCTION_PHY_PROCEDURES_UE_TX_ULSCH_UESPEC DESC = VCD function PHY_PROCEDURES_UE_TX_ULSCH_UESPEC GROUP = ALL:VCD:UE:VCD_FUNCTION FORMAT = int,value + VCD_NAME = phy_procedures_ue_tx_ulsch_uespec ID = VCD_FUNCTION_PHY_PROCEDURES_UE_TX_PUCCH DESC = VCD function PHY_PROCEDURES_UE_TX_PUCCH GROUP = ALL:VCD:UE:VCD_FUNCTION FORMAT = int,value + VCD_NAME = phy_procedures_ue_tx_pucch ID = VCD_FUNCTION_PHY_PROCEDURES_UE_TX_ULSCH_COMMON DESC = VCD function PHY_PROCEDURES_UE_TX_ULSCH_COMMON GROUP = ALL:VCD:UE:VCD_FUNCTION FORMAT = int,value + VCD_NAME = phy_procedures_ue_tx_ulsch_common ID = VCD_FUNCTION_PHY_PROCEDURES_UE_TX_PRACH DESC = VCD function PHY_PROCEDURES_UE_TX_PRACH GROUP = ALL:VCD:UE:VCD_FUNCTION FORMAT = int,value + VCD_NAME = phy_procedures_ue_tx_prach ID = VCD_FUNCTION_PHY_PROCEDURES_UE_TX_ULSCH_RAR DESC = VCD function PHY_PROCEDURES_UE_TX_ULSCH_RAR GROUP = ALL:VCD:UE:VCD_FUNCTION FORMAT = int,value + VCD_NAME = phy_procedures_ue_tx_ulsch_rar ID = VCD_FUNCTION_PHY_PROCEDURES_ENB_LTE DESC = VCD function PHY_PROCEDURES_ENB_LTE GROUP = ALL:VCD:ENB:VCD_FUNCTION FORMAT = int,value + VCD_NAME = phy_procedures_eNB_lte ID = VCD_FUNCTION_PHY_PROCEDURES_UE_LTE DESC = VCD function PHY_PROCEDURES_UE_LTE GROUP = ALL:VCD:UE:VCD_FUNCTION FORMAT = int,value + VCD_NAME = phy_procedures_UE_lte ID = VCD_FUNCTION_PDSCH_THREAD DESC = VCD function PDSCH_THREAD GROUP = ALL:VCD:ENB:VCD_FUNCTION FORMAT = int,value + VCD_NAME = pdsch_thread ID = VCD_FUNCTION_DLSCH_THREAD0 DESC = VCD function DLSCH_THREAD0 GROUP = ALL:VCD:ENB:VCD_FUNCTION FORMAT = int,value + VCD_NAME = dlsch_thread0 ID = VCD_FUNCTION_DLSCH_THREAD1 DESC = VCD function DLSCH_THREAD1 GROUP = ALL:VCD:ENB:VCD_FUNCTION FORMAT = int,value + VCD_NAME = dlsch_thread1 ID = VCD_FUNCTION_DLSCH_THREAD2 DESC = VCD function DLSCH_THREAD2 GROUP = ALL:VCD:ENB:VCD_FUNCTION FORMAT = int,value + VCD_NAME = dlsch_thread2 ID = VCD_FUNCTION_DLSCH_THREAD3 DESC = VCD function DLSCH_THREAD3 GROUP = ALL:VCD:ENB:VCD_FUNCTION FORMAT = int,value + VCD_NAME = dlsch_thread3 ID = VCD_FUNCTION_DLSCH_THREAD4 DESC = VCD function DLSCH_THREAD4 GROUP = ALL:VCD:ENB:VCD_FUNCTION FORMAT = int,value + VCD_NAME = dlsch_thread4 ID = VCD_FUNCTION_DLSCH_THREAD5 DESC = VCD function DLSCH_THREAD5 GROUP = ALL:VCD:ENB:VCD_FUNCTION FORMAT = int,value + VCD_NAME = dlsch_thread5 ID = VCD_FUNCTION_DLSCH_THREAD6 DESC = VCD function DLSCH_THREAD6 GROUP = ALL:VCD:ENB:VCD_FUNCTION FORMAT = int,value + VCD_NAME = dlsch_thread6 ID = VCD_FUNCTION_DLSCH_THREAD7 DESC = VCD function DLSCH_THREAD7 GROUP = ALL:VCD:ENB:VCD_FUNCTION FORMAT = int,value + VCD_NAME = dlsch_thread7 ID = VCD_FUNCTION_DLSCH_DECODING0 DESC = VCD function DLSCH_DECODING0 GROUP = ALL:VCD:ENB:VCD_FUNCTION FORMAT = int,value + VCD_NAME = dlsch_decoding0 ID = VCD_FUNCTION_DLSCH_DECODING1 DESC = VCD function DLSCH_DECODING1 GROUP = ALL:VCD:ENB:VCD_FUNCTION FORMAT = int,value + VCD_NAME = dlsch_decoding1 ID = VCD_FUNCTION_DLSCH_DECODING2 DESC = VCD function DLSCH_DECODING2 GROUP = ALL:VCD:ENB:VCD_FUNCTION FORMAT = int,value + VCD_NAME = dlsch_decoding2 ID = VCD_FUNCTION_DLSCH_DECODING3 DESC = VCD function DLSCH_DECODING3 GROUP = ALL:VCD:ENB:VCD_FUNCTION FORMAT = int,value + VCD_NAME = dlsch_decoding3 ID = VCD_FUNCTION_DLSCH_DECODING4 DESC = VCD function DLSCH_DECODING4 GROUP = ALL:VCD:ENB:VCD_FUNCTION FORMAT = int,value + VCD_NAME = dlsch_decoding4 ID = VCD_FUNCTION_DLSCH_DECODING5 DESC = VCD function DLSCH_DECODING5 GROUP = ALL:VCD:ENB:VCD_FUNCTION FORMAT = int,value + VCD_NAME = dlsch_decoding5 ID = VCD_FUNCTION_DLSCH_DECODING6 DESC = VCD function DLSCH_DECODING6 GROUP = ALL:VCD:ENB:VCD_FUNCTION FORMAT = int,value + VCD_NAME = dlsch_decoding6 ID = VCD_FUNCTION_DLSCH_DECODING7 DESC = VCD function DLSCH_DECODING7 GROUP = ALL:VCD:ENB:VCD_FUNCTION FORMAT = int,value + VCD_NAME = dlsch_decoding7 ID = VCD_FUNCTION_RX_PDCCH DESC = VCD function RX_PDCCH GROUP = ALL:VCD:ENB:VCD_FUNCTION FORMAT = int,value + VCD_NAME = rx_pdcch ID = VCD_FUNCTION_DCI_DECODING DESC = VCD function DCI_DECODING GROUP = ALL:VCD:ENB:VCD_FUNCTION FORMAT = int,value + VCD_NAME = dci_decoding ID = VCD_FUNCTION_RX_PHICH DESC = VCD function RX_PHICH GROUP = ALL:VCD:ENB:VCD_FUNCTION FORMAT = int,value + VCD_NAME = rx_phich ID = VCD_FUNCTION_PDSCH_PROC DESC = VCD function PDSCH_PROC GROUP = ALL:VCD:UE:VCD_FUNCTION FORMAT = int,value + VCD_NAME = pdsch_procedures ID = VCD_FUNCTION_PDSCH_PROC_SI DESC = VCD function PDSCH_PROC_SI GROUP = ALL:VCD:UE:VCD_FUNCTION FORMAT = int,value + VCD_NAME = pdsch_procedures_si ID = VCD_FUNCTION_PDSCH_PROC_P DESC = VCD function PDSCH_PROC_P GROUP = ALL:VCD:UE:VCD_FUNCTION FORMAT = int,value + VCD_NAME = pdsch_procedures_p ID = VCD_FUNCTION_PDSCH_PROC_RA DESC = VCD function PDSCH_PROC_RA GROUP = ALL:VCD:UE:VCD_FUNCTION FORMAT = int,value + VCD_NAME = pdsch_procedures_ra ID = VCD_FUNCTION_PHY_UE_CONFIG_SIB2 DESC = VCD function PHY_UE_CONFIG_SIB2 GROUP = ALL:VCD:UE:VCD_FUNCTION FORMAT = int,value + VCD_NAME = phy_ue_config_sib2 ID = VCD_FUNCTION_PHY_CONFIG_SIB1_ENB DESC = VCD function PHY_CONFIG_SIB1_ENB GROUP = ALL:VCD:ENB:VCD_FUNCTION FORMAT = int,value + VCD_NAME = macxface_phy_config_sib1_eNB ID = VCD_FUNCTION_PHY_CONFIG_SIB2_ENB DESC = VCD function PHY_CONFIG_SIB2_ENB GROUP = ALL:VCD:ENB:VCD_FUNCTION FORMAT = int,value + VCD_NAME = macxface_phy_config_sib2_eNB ID = VCD_FUNCTION_PHY_CONFIG_DEDICATED_ENB DESC = VCD function PHY_CONFIG_DEDICATED_ENB GROUP = ALL:VCD:ENB:VCD_FUNCTION FORMAT = int,value + VCD_NAME = macxface_phy_config_dedicated_eNB ID = VCD_FUNCTION_PHY_UE_COMPUTE_PRACH DESC = VCD function PHY_UE_COMPUTE_PRACH GROUP = ALL:VCD:UE:VCD_FUNCTION FORMAT = int,value + VCD_NAME = phy_ue_compute_prach ID = VCD_FUNCTION_PHY_ENB_ULSCH_MSG3 DESC = VCD function PHY_ENB_ULSCH_MSG3 GROUP = ALL:VCD:ENB:VCD_FUNCTION FORMAT = int,value + VCD_NAME = phy_enb_ulsch_msg3 ID = VCD_FUNCTION_PHY_ENB_ULSCH_DECODING0 DESC = VCD function PHY_ENB_ULSCH_DECODING0 GROUP = ALL:VCD:ENB:VCD_FUNCTION FORMAT = int,value + VCD_NAME = phy_enb_ulsch_decoding0 ID = VCD_FUNCTION_PHY_ENB_ULSCH_DECODING1 DESC = VCD function PHY_ENB_ULSCH_DECODING1 GROUP = ALL:VCD:ENB:VCD_FUNCTION FORMAT = int,value + VCD_NAME = phy_enb_ulsch_decoding1 ID = VCD_FUNCTION_PHY_ENB_ULSCH_DECODING2 DESC = VCD function PHY_ENB_ULSCH_DECODING2 GROUP = ALL:VCD:ENB:VCD_FUNCTION FORMAT = int,value + VCD_NAME = phy_enb_ulsch_decoding2 ID = VCD_FUNCTION_PHY_ENB_ULSCH_DECODING3 DESC = VCD function PHY_ENB_ULSCH_DECODING3 GROUP = ALL:VCD:ENB:VCD_FUNCTION FORMAT = int,value + VCD_NAME = phy_enb_ulsch_decoding3 ID = VCD_FUNCTION_PHY_ENB_ULSCH_DECODING4 DESC = VCD function PHY_ENB_ULSCH_DECODING4 GROUP = ALL:VCD:ENB:VCD_FUNCTION FORMAT = int,value + VCD_NAME = phy_enb_ulsch_decoding4 ID = VCD_FUNCTION_PHY_ENB_ULSCH_DECODING5 DESC = VCD function PHY_ENB_ULSCH_DECODING5 GROUP = ALL:VCD:ENB:VCD_FUNCTION FORMAT = int,value + VCD_NAME = phy_enb_ulsch_decoding5 ID = VCD_FUNCTION_PHY_ENB_ULSCH_DECODING6 DESC = VCD function PHY_ENB_ULSCH_DECODING6 GROUP = ALL:VCD:ENB:VCD_FUNCTION FORMAT = int,value + VCD_NAME = phy_enb_ulsch_decoding6 ID = VCD_FUNCTION_PHY_ENB_ULSCH_DECODING7 DESC = VCD function PHY_ENB_ULSCH_DECODING7 GROUP = ALL:VCD:ENB:VCD_FUNCTION FORMAT = int,value + VCD_NAME = phy_enb_ulsch_decoding7 ID = VCD_FUNCTION_PHY_ENB_SFGEN DESC = VCD function PHY_ENB_SFGEN GROUP = ALL:VCD:ENB:VCD_FUNCTION FORMAT = int,value + VCD_NAME = phy_enb_sfgen ID = VCD_FUNCTION_PHY_ENB_PRACH_RX DESC = VCD function PHY_ENB_PRACH_RX GROUP = ALL:VCD:ENB:VCD_FUNCTION FORMAT = int,value + VCD_NAME = phy_enb_prach_rx ID = VCD_FUNCTION_PHY_RU_PRACH_RX DESC = VCD function PHY_RU_PRACH_RX GROUP = ALL:VCD:ENB:VCD_FUNCTION FORMAT = int,value + VCD_NAME = phy_ru_prach_rx ID = VCD_FUNCTION_PHY_ENB_PDCCH_TX DESC = VCD function PHY_ENB_PDCCH_TX GROUP = ALL:VCD:ENB:VCD_FUNCTION FORMAT = int,value + VCD_NAME = phy_enb_pdcch_tx ID = VCD_FUNCTION_PHY_ENB_RS_TX DESC = VCD function PHY_ENB_RS_TX GROUP = ALL:VCD:ENB:VCD_FUNCTION FORMAT = int,value + VCD_NAME = phy_enb_rs_tx ID = VCD_FUNCTION_UE_GENERATE_PRACH DESC = VCD function UE_GENERATE_PRACH GROUP = ALL:VCD:UE:VCD_FUNCTION FORMAT = int,value + VCD_NAME = phy_ue_generate_prach ID = VCD_FUNCTION_UE_ULSCH_MODULATION DESC = VCD function UE_ULSCH_MODULATION GROUP = ALL:VCD:UE:VCD_FUNCTION FORMAT = int,value + VCD_NAME = phy_ue_ulsch_modulation ID = VCD_FUNCTION_UE_ULSCH_ENCODING DESC = VCD function UE_ULSCH_ENCODING GROUP = ALL:VCD:UE:VCD_FUNCTION FORMAT = int,value + VCD_NAME = phy_ue_ulsch_encoding ID = VCD_FUNCTION_UE_ULSCH_ENCODING_FILL_CQI DESC = VCD function UE_ULSCH_ENCODING_FILL_CQI GROUP = ALL:VCD:UE:VCD_FUNCTION FORMAT = int,value + VCD_NAME = phy_ue_ulsch_encoding_fill_cqi ID = VCD_FUNCTION_UE_ULSCH_SCRAMBLING DESC = VCD function UE_ULSCH_SCRAMBLING GROUP = ALL:VCD:UE:VCD_FUNCTION FORMAT = int,value + VCD_NAME = phy_ue_ulsch_scrambling ID = VCD_FUNCTION_ENB_DLSCH_MODULATION DESC = VCD function ENB_DLSCH_MODULATION GROUP = ALL:VCD:ENB:VCD_FUNCTION FORMAT = int,value + VCD_NAME = phy_eNB_dlsch_modulation ID = VCD_FUNCTION_ENB_DLSCH_ENCODING DESC = VCD function ENB_DLSCH_ENCODING GROUP = ALL:VCD:ENB:VCD_FUNCTION FORMAT = int,value + VCD_NAME = phy_eNB_dlsch_encoding ID = VCD_FUNCTION_ENB_DLSCH_ENCODING_W DESC = VCD function ENB_DLSCH_ENCODING_W GROUP = ALL:VCD:ENB:VCD_FUNCTION FORMAT = int,value + VCD_NAME = phy_eNB_dlsch_encoding_w ID = VCD_FUNCTION_ENB_DLSCH_SCRAMBLING DESC = VCD function ENB_DLSCH_SCRAMBLING GROUP = ALL:VCD:ENB:VCD_FUNCTION FORMAT = int,value + VCD_NAME = phy_eNB_dlsch_scrambling ID = VCD_FUNCTION_ENB_BEAM_PRECODING DESC = VCD function ENB_BEAM_PRECODING GROUP = ALL:VCD:ENB:VCD_FUNCTION FORMAT = int,value + VCD_NAME = phy_eNB_beam_precoding ID = VCD_FUNCTION_ENB_OFDM_MODULATION DESC = VCD function ENB_OFDM_MODULATION GROUP = ALL:VCD:ENB:VCD_FUNCTION FORMAT = int,value + VCD_NAME = phy_eNB_ofdm_mod_l ID = VCD_FUNCTION_MACPHY_INIT DESC = VCD function MACPHY_INIT GROUP = ALL:VCD:ENB:VCD_FUNCTION FORMAT = int,value + VCD_NAME = macxface_macphy_init ID = VCD_FUNCTION_MACPHY_EXIT DESC = VCD function MACPHY_EXIT GROUP = ALL:VCD:ENB:VCD_FUNCTION FORMAT = int,value + VCD_NAME = macxface_macphy_exit ID = VCD_FUNCTION_ENB_DLSCH_ULSCH_SCHEDULER DESC = VCD function ENB_DLSCH_ULSCH_SCHEDULER GROUP = ALL:VCD:ENB:VCD_FUNCTION FORMAT = int,value + VCD_NAME = macxface_eNB_dlsch_ulsch_scheduler ID = VCD_FUNCTION_FILL_RAR DESC = VCD function FILL_RAR GROUP = ALL:VCD:ENB:VCD_FUNCTION FORMAT = int,value + VCD_NAME = macxface_fill_rar ID = VCD_FUNCTION_TERMINATE_RA_PROC DESC = VCD function TERMINATE_RA_PROC GROUP = ALL:VCD:ENB:VCD_FUNCTION FORMAT = int,value + VCD_NAME = macxface_terminate_ra_proc ID = VCD_FUNCTION_INITIATE_RA_PROC DESC = VCD function INITIATE_RA_PROC GROUP = ALL:VCD:ENB:VCD_FUNCTION FORMAT = int,value + VCD_NAME = macxface_initiate_ra_proc ID = VCD_FUNCTION_CANCEL_RA_PROC DESC = VCD function CANCEL_RA_PROC GROUP = ALL:VCD:ENB:VCD_FUNCTION FORMAT = int,value + VCD_NAME = macxface_cancel_ra_proc ID = VCD_FUNCTION_GET_DCI_SDU DESC = VCD function GET_DCI_SDU GROUP = ALL:VCD:ENB:VCD_FUNCTION FORMAT = int,value + VCD_NAME = macxface_get_dci_sdu ID = VCD_FUNCTION_GET_DLSCH_SDU DESC = VCD function GET_DLSCH_SDU GROUP = ALL:VCD:ENB:VCD_FUNCTION FORMAT = int,value + VCD_NAME = macxface_get_dlsch_sdu ID = VCD_FUNCTION_RX_SDU DESC = VCD function RX_SDU GROUP = ALL:VCD:ENB:VCD_FUNCTION FORMAT = int,value + VCD_NAME = macxface_rx_sdu ID = VCD_FUNCTION_MRBCH_PHY_SYNC_FAILURE DESC = VCD function MRBCH_PHY_SYNC_FAILURE GROUP = ALL:VCD:ENB:VCD_FUNCTION FORMAT = int,value + VCD_NAME = macxface_mrbch_phy_sync_failure ID = VCD_FUNCTION_SR_INDICATION DESC = VCD function SR_INDICATION GROUP = ALL:VCD:ENB:VCD_FUNCTION FORMAT = int,value + VCD_NAME = macxface_SR_indication ID = VCD_FUNCTION_DLSCH_PREPROCESSOR DESC = VCD function DLSCH_PREPROCESSOR GROUP = ALL:VCD:ENB:VCD_FUNCTION FORMAT = int,value + VCD_NAME = mac_dlsch_preprocessor ID = VCD_FUNCTION_SCHEDULE_DLSCH DESC = VCD function SCHEDULE_DLSCH GROUP = ALL:VCD:ENB:VCD_FUNCTION FORMAT = int,value + VCD_NAME = mac_schedule_dlsch ID = VCD_FUNCTION_FILL_DLSCH_DCI DESC = VCD function FILL_DLSCH_DCI GROUP = ALL:VCD:ENB:VCD_FUNCTION FORMAT = int,value + VCD_NAME = mac_fill_dlsch_dci ID = VCD_FUNCTION_OUT_OF_SYNC_IND DESC = VCD function OUT_OF_SYNC_IND GROUP = ALL:VCD:ENB:VCD_FUNCTION FORMAT = int,value + VCD_NAME = macxface_out_of_sync_ind ID = VCD_FUNCTION_UE_DECODE_SI DESC = VCD function UE_DECODE_SI GROUP = ALL:VCD:UE:VCD_FUNCTION FORMAT = int,value + VCD_NAME = macxface_ue_decode_si ID = VCD_FUNCTION_UE_DECODE_PCCH DESC = VCD function UE_DECODE_PCCH GROUP = ALL:VCD:UE:VCD_FUNCTION FORMAT = int,value + VCD_NAME = macxface_ue_decode_pcch ID = VCD_FUNCTION_UE_DECODE_CCCH DESC = VCD function UE_DECODE_CCCH GROUP = ALL:VCD:UE:VCD_FUNCTION FORMAT = int,value + VCD_NAME = macxface_ue_decode_ccch ID = VCD_FUNCTION_UE_DECODE_BCCH DESC = VCD function UE_DECODE_BCCH GROUP = ALL:VCD:UE:VCD_FUNCTION FORMAT = int,value + VCD_NAME = macxface_ue_decode_bcch ID = VCD_FUNCTION_UE_SEND_SDU DESC = VCD function UE_SEND_SDU GROUP = ALL:VCD:UE:VCD_FUNCTION FORMAT = int,value + VCD_NAME = macxface_ue_send_sdu ID = VCD_FUNCTION_UE_GET_SDU DESC = VCD function UE_GET_SDU GROUP = ALL:VCD:UE:VCD_FUNCTION FORMAT = int,value + VCD_NAME = macxface_ue_get_sdu ID = VCD_FUNCTION_UE_GET_RACH DESC = VCD function UE_GET_RACH GROUP = ALL:VCD:UE:VCD_FUNCTION FORMAT = int,value + VCD_NAME = macxface_ue_get_rach ID = VCD_FUNCTION_UE_PROCESS_RAR DESC = VCD function UE_PROCESS_RAR GROUP = ALL:VCD:UE:VCD_FUNCTION FORMAT = int,value + VCD_NAME = macxface_ue_process_rar ID = VCD_FUNCTION_UE_SCHEDULER DESC = VCD function UE_SCHEDULER GROUP = ALL:VCD:UE:VCD_FUNCTION FORMAT = int,value + VCD_NAME = macxface_ue_scheduler ID = VCD_FUNCTION_UE_GET_SR DESC = VCD function UE_GET_SR GROUP = ALL:VCD:UE:VCD_FUNCTION FORMAT = int,value + VCD_NAME = macxface_ue_get_sr ID = VCD_FUNCTION_UE_SEND_MCH_SDU DESC = VCD function UE_SEND_MCH_SDU GROUP = ALL:VCD:UE:VCD_FUNCTION FORMAT = int,value + VCD_NAME = ue_send_mch_sdu ID = VCD_FUNCTION_RLC_DATA_REQ DESC = VCD function RLC_DATA_REQ GROUP = ALL:VCD:ENB:VCD_FUNCTION FORMAT = int,value + VCD_NAME = rlc_data_req #ID = VCD_FUNCTION_RLC_DATA_IND # DESC = VCD function RLC_DATA_IND # GROUP = ALL:VCD:ENB:VCD_FUNCTION # FORMAT = int,value +# VCD_NAME = rlc_data_ind ID = VCD_FUNCTION_MAC_RLC_STATUS_IND DESC = VCD function MAC_RLC_STATUS_IND GROUP = ALL:VCD:ENB:VCD_FUNCTION FORMAT = int,value + VCD_NAME = mac_rlc_status_ind ID = VCD_FUNCTION_MAC_RLC_DATA_REQ DESC = VCD function MAC_RLC_DATA_REQ GROUP = ALL:VCD:ENB:VCD_FUNCTION FORMAT = int,value + VCD_NAME = mac_rlc_data_req ID = VCD_FUNCTION_MAC_RLC_DATA_IND DESC = VCD function MAC_RLC_DATA_IND GROUP = ALL:VCD:ENB:VCD_FUNCTION FORMAT = int,value + VCD_NAME = mac_rlc_data_ind ID = VCD_FUNCTION_RLC_UM_TRY_REASSEMBLY DESC = VCD function RLC_UM_TRY_REASSEMBLY GROUP = ALL:VCD:ENB:VCD_FUNCTION FORMAT = int,value + VCD_NAME = rlc_um_try_reassembly ID = VCD_FUNCTION_RLC_UM_CHECK_TIMER_DAR_TIME_OUT DESC = VCD function RLC_UM_CHECK_TIMER_DAR_TIME_OUT GROUP = ALL:VCD:ENB:VCD_FUNCTION FORMAT = int,value + VCD_NAME = rlc_um_check_timer_dar_time_out ID = VCD_FUNCTION_RLC_UM_RECEIVE_PROCESS_DAR DESC = VCD function RLC_UM_RECEIVE_PROCESS_DAR GROUP = ALL:VCD:ENB:VCD_FUNCTION FORMAT = int,value + VCD_NAME = rlc_um_receive_process_dar ID = VCD_FUNCTION_PDCP_RUN DESC = VCD function PDCP_RUN GROUP = ALL:VCD:ENB:VCD_FUNCTION FORMAT = int,value + VCD_NAME = pdcp_run ID = VCD_FUNCTION_PDCP_DATA_REQ DESC = VCD function PDCP_DATA_REQ GROUP = ALL:VCD:ENB:VCD_FUNCTION FORMAT = int,value + VCD_NAME = pdcp_data_req ID = VCD_FUNCTION_PDCP_DATA_IND DESC = VCD function PDCP_DATA_IND GROUP = ALL:VCD:ENB:VCD_FUNCTION FORMAT = int,value + VCD_NAME = pdcp_data_ind ID = VCD_FUNCTION_PDCP_APPLY_SECURITY DESC = VCD function PDCP_APPLY_SECURITY GROUP = ALL:VCD:ENB:VCD_FUNCTION FORMAT = int,value + VCD_NAME = pdcp_apply_security ID = VCD_FUNCTION_PDCP_VALIDATE_SECURITY DESC = VCD function PDCP_VALIDATE_SECURITY GROUP = ALL:VCD:ENB:VCD_FUNCTION FORMAT = int,value + VCD_NAME = pdcp_validate_security ID = VCD_FUNCTION_PDCP_FIFO_READ DESC = VCD function PDCP_FIFO_READ GROUP = ALL:VCD:ENB:VCD_FUNCTION FORMAT = int,value + VCD_NAME = pdcp_fifo_read ID = VCD_FUNCTION_PDCP_FIFO_READ_BUFFER DESC = VCD function PDCP_FIFO_READ_BUFFER GROUP = ALL:VCD:ENB:VCD_FUNCTION FORMAT = int,value + VCD_NAME = pdcp_fifo_read_buffer ID = VCD_FUNCTION_PDCP_FIFO_FLUSH DESC = VCD function PDCP_FIFO_FLUSH GROUP = ALL:VCD:ENB:VCD_FUNCTION FORMAT = int,value + VCD_NAME = pdcp_fifo_flush ID = VCD_FUNCTION_PDCP_FIFO_FLUSH_BUFFER DESC = VCD function PDCP_FIFO_FLUSH_BUFFER GROUP = ALL:VCD:ENB:VCD_FUNCTION FORMAT = int,value + VCD_NAME = pdcp_fifo_flush_buffer ID = VCD_FUNCTION_RRC_RX_TX DESC = VCD function RRC_RX_TX GROUP = ALL:VCD:ENB:VCD_FUNCTION FORMAT = int,value + VCD_NAME = rrc_rx_tx ID = VCD_FUNCTION_RRC_MAC_CONFIG DESC = VCD function RRC_MAC_CONFIG GROUP = ALL:VCD:ENB:VCD_FUNCTION FORMAT = int,value + VCD_NAME = rrc_mac_config_req ID = VCD_FUNCTION_RRC_UE_DECODE_SIB1 DESC = VCD function RRC_UE_DECODE_SIB1 GROUP = ALL:VCD:UE:VCD_FUNCTION FORMAT = int,value + VCD_NAME = rrc_ue_decode_sib1 ID = VCD_FUNCTION_RRC_UE_DECODE_SI DESC = VCD function RRC_UE_DECODE_SI GROUP = ALL:VCD:UE:VCD_FUNCTION FORMAT = int,value + VCD_NAME = rrc_ue_decode_si ID = VCD_FUNCTION_GTPV1U_ENB_TASK DESC = VCD function GTPV1U_ENB_TASK GROUP = ALL:VCD:ENB:VCD_FUNCTION FORMAT = int,value + VCD_NAME = gtpv1u_enb_task ID = VCD_FUNCTION_GTPV1U_PROCESS_UDP_REQ DESC = VCD function GTPV1U_PROCESS_UDP_REQ GROUP = ALL:VCD:ENB:VCD_FUNCTION FORMAT = int,value + VCD_NAME = gtpv1u_process_udp_req ID = VCD_FUNCTION_GTPV1U_PROCESS_TUNNEL_DATA_REQ DESC = VCD function GTPV1U_PROCESS_TUNNEL_DATA_REQ GROUP = ALL:VCD:ENB:VCD_FUNCTION FORMAT = int,value + VCD_NAME = gtpv1u_process_tunnel_data_req ID = VCD_FUNCTION_UDP_ENB_TASK DESC = VCD function UDP_ENB_TASK GROUP = ALL:VCD:ENB:VCD_FUNCTION FORMAT = int,value + VCD_NAME = udp_enb_task ID = VCD_FUNCTION_EMU_TRANSPORT DESC = VCD function EMU_TRANSPORT GROUP = ALL:VCD:ENB:VCD_FUNCTION FORMAT = int,value + VCD_NAME = emu_transport ID = VCD_FUNCTION_LOG_RECORD DESC = VCD function LOG_RECORD GROUP = ALL:VCD:ENB:VCD_FUNCTION FORMAT = int,value + VCD_NAME = log_record ID = VCD_FUNCTION_ITTI_ENQUEUE_MESSAGE DESC = VCD function ITTI_ENQUEUE_MESSAGE GROUP = ALL:VCD:ENB:VCD_FUNCTION FORMAT = int,value + VCD_NAME = itti_enqueue_message ID = VCD_FUNCTION_ITTI_DUMP_ENQUEUE_MESSAGE DESC = VCD function ITTI_DUMP_ENQUEUE_MESSAGE GROUP = ALL:VCD:ENB:VCD_FUNCTION FORMAT = int,value + VCD_NAME = itti_dump_enqueue_message ID = VCD_FUNCTION_ITTI_DUMP_ENQUEUE_MESSAGE_MALLOC DESC = VCD function ITTI_DUMP_ENQUEUE_MESSAGE_MALLOC GROUP = ALL:VCD:ENB:VCD_FUNCTION FORMAT = int,value + VCD_NAME = itti_dump_enqueue_message_malloc ID = VCD_FUNCTION_ITTI_RELAY_THREAD DESC = VCD function ITTI_RELAY_THREAD GROUP = ALL:VCD:ENB:VCD_FUNCTION FORMAT = int,value + VCD_NAME = itti_relay_thread ID = VCD_FUNCTION_TEST DESC = VCD function TEST GROUP = ALL:VCD:ENB:VCD_FUNCTION FORMAT = int,value + VCD_NAME = test ID = VCD_FUNCTION_SEND_IF4 DESC = VCD function SEND_IF4 GROUP = ALL:VCD:ENB:VCD_FUNCTION FORMAT = int,value + VCD_NAME = send_if4 ID = VCD_FUNCTION_RECV_IF4 DESC = VCD function RECV_IF4 GROUP = ALL:VCD:ENB:VCD_FUNCTION FORMAT = int,value + VCD_NAME = recv_if4 ID = VCD_FUNCTION_SEND_IF5 DESC = VCD function SEND_IF5 GROUP = ALL:VCD:ENB:VCD_FUNCTION FORMAT = int,value + VCD_NAME = send_if5 ID = VCD_FUNCTION_RECV_IF5 DESC = VCD function RECV_IF5 GROUP = ALL:VCD:ENB:VCD_FUNCTION FORMAT = int,value + VCD_NAME = recv_if5 ID = VCD_FUNCTION_TRX_COMPR_IF DESC = VCD function TRX_COMPR_IF GROUP = ALL:VCD:ENB:VCD_FUNCTION FORMAT = int,value + VCD_NAME = compress_if ID = VCD_FUNCTION_TRX_DECOMPR_IF DESC = VCD function TRX_DECOMPR_IF GROUP = ALL:VCD:ENB:VCD_FUNCTION FORMAT = int,value + VCD_NAME = decompress_if ID = VCD_FUNCTION_NFAPI DESC = VCD function NFAPI GROUP = ALL:VCD:ENB:VCD_FUNCTION FORMAT = int,value + VCD_NAME = nfapi_subframe ID = VCD_FUNCTION_GENERATE_PCFICH DESC = VCD function GENERATE_PCFICH GROUP = ALL:VCD:ENB:VCD_FUNCTION FORMAT = int,value + VCD_NAME = generate_pcfich ID = VCD_FUNCTION_GENERATE_DCI0 DESC = VCD function GENERATE_DCI0 GROUP = ALL:VCD:ENB:VCD_FUNCTION FORMAT = int,value + VCD_NAME = generate_dci0 ID = VCD_FUNCTION_GENERATE_DLSCH DESC = VCD function GENERATE_DLSCH GROUP = ALL:VCD:ENB:VCD_FUNCTION FORMAT = int,value + VCD_NAME = generate_dlsch ID = VCD_FUNCTION_GENERATE_PHICH DESC = VCD function GENERATE_PHICH GROUP = ALL:VCD:ENB:VCD_FUNCTION FORMAT = int,value + VCD_NAME = generate_phich ID = VCD_FUNCTION_PDCCH_SCRAMBLING DESC = VCD function PDCCH_SCRAMBLING GROUP = ALL:VCD:ENB:VCD_FUNCTION FORMAT = int,value + VCD_NAME = pdcch_scrambling ID = VCD_FUNCTION_PDCCH_MODULATION DESC = VCD function PDCCH_MODULATION GROUP = ALL:VCD:ENB:VCD_FUNCTION FORMAT = int,value + VCD_NAME = pdcch_modulation ID = VCD_FUNCTION_PDCCH_INTERLEAVING DESC = VCD function PDCCH_INTERLEAVING GROUP = ALL:VCD:ENB:VCD_FUNCTION FORMAT = int,value + VCD_NAME = pdcch_interleaving ID = VCD_FUNCTION_PDCCH_TX DESC = VCD function PDCCH_TX GROUP = ALL:VCD:ENB:VCD_FUNCTION FORMAT = int,value + VCD_NAME = pdcch_tx diff --git a/common/utils/T/check_vcd.c b/common/utils/T/check_vcd.c new file mode 100644 index 0000000000000000000000000000000000000000..1460d7e20a7dd861f39e4a45150e91377e0ed0da --- /dev/null +++ b/common/utils/T/check_vcd.c @@ -0,0 +1,249 @@ +/* + * To disable the checks done by this program, see below at the beginning + * of the function 'main'. + */ + +#include <stdio.h> +#include <string.h> +#include <stdarg.h> + +#include "database.h" + +#define T_TRACER 1 +#include "T.h" + +/* VCD specific defines and includes + * If the codebase changes, it may need to be updated + */ +#define ENB_MODE +#define ENABLE_USE_CPU_EXECUTION_TIME +#include "../LOG/vcd_signal_dumper.c" + +void err(char *fmt, ...) __attribute__ ((format (printf, 1, 2))); +void err(char *fmt, ...) +{ + va_list ap; + + va_start(ap, fmt); + + printf("\x1b[31m"); + printf("error: "); + vprintf(fmt, ap); + printf("\n" +"\x1b[33m\n" +"You probably added a VCD trace (variable or function) but you did not\n" +"update T_messages.txt and/or T_defs.h in common/utils/T/\n" +"\n" +"Be sure to add the new trace to T_messages.txt, at the right place in the\n" +"file. Do not forget to define VCD_NAME with an identical value as found\n" +"in the array eurecomVariablesNames or eurecomFunctionsNames.\n" +"\n" +"Be sure to update VCD_NUM_FUNCTIONS, VCD_NUM_VARIABLES, VCD_FIRST_FUNCTION\n" +"and VCD_FIRST_VARIABLE in T_defs.h\n" +"\n" +"The same procedure has to be followed when you delete a VCD trace.\n" +"Delete it in T_messages.txt as well and update T_defs.h\n" +"\n" +"You can disable those VCD checks at development time.\n" +"To disable the VCD checks see the file common/utils/T/check_vcd.c\n" +"Do not push any modification that disables the VCD checks to the\n" +"main repository.\n"); + + printf("\x1b[m\n"); + + va_end(ap); + + exit(1); +} + +int main(void) +{ + /* to disable the checks done by this program, uncomment the following + * line, ie. remove the leading '//' + */ + //return 0; + + void *database = parse_database("T_messages.txt"); + int number_of_events; + int first_var = -1; + int last_var; + int first_fun = -1; + int last_fun; + char *prefix; + int prefix_len; + char *name; + char *vcd_name; + int i; + FILE *in; + char *l = NULL; + size_t lsize; + + if (database == NULL) err("something wrong with T_messages.txt"); + + /* check the value of VCD_NUM_FUNCTIONS */ + if (VCD_NUM_FUNCTIONS != sizeof(eurecomFunctionsNames) / sizeof(char *)) + err("VCD_NUM_FUNCTIONS (%d) must be equal to %zd", + VCD_NUM_FUNCTIONS, + sizeof(eurecomFunctionsNames) / sizeof(char *)); + + /* check the value of VCD_NUM_VARIABLES */ + if (VCD_NUM_VARIABLES != sizeof(eurecomVariablesNames) / sizeof(char *)) + err("VCD_NUM_VARIABLES (%d) must be equal to %zd", + VCD_NUM_VARIABLES, + sizeof(eurecomVariablesNames) / sizeof(char *)); + + number_of_events = number_of_ids(database); + if (number_of_events == 0) err("no event defined in T_messages.txt"); + + /* T_messages.txt ends with VCD VARIABLES followed by VCD FUNCTIONS + * followed by nothing. + * Let's check. + */ + + /* check VCD VARIABLES traces in T_messages.txt */ + prefix = "VCD_VARIABLE_"; + prefix_len = strlen(prefix); + + for (i = 0; i < number_of_events; i++) { + name = event_name_from_id(database, i); + if (strncmp(name, prefix, prefix_len)) continue; + first_var = i; + break; + } + if (first_var == -1) + err("no VCD_VARIABLE_ found in T_messages.txt"); + for (; i < number_of_events; i++) { + name = event_name_from_id(database, i); + if (strncmp(name, prefix, prefix_len)) break; + } + last_var = i-1; + + /* check VCD FUNCTIONS traces in T_messages.txt */ + if (i == number_of_events) + err("no VCD_FUNCTION_ found in T_messages.txt"); + + prefix = "VCD_FUNCTION_"; + prefix_len = strlen(prefix); + + first_fun = i; + + name = event_name_from_id(database, i); + if (strncmp(name, prefix, prefix_len)) + err("last VCD_VARIABLE_ not followed by a VCD_FUNCTION_ in T_messages.txt"); + + for (; i < number_of_events; i++) { + name = event_name_from_id(database, i); + if (strncmp(name, prefix, prefix_len)) break; + } + + if (i != number_of_events) + err("T_messages.txt does not end with a VCD_FUNCTION_ trace"); + + last_fun = i-1; + + if (first_var != (unsigned)VCD_FIRST_VARIABLE) + err("VCD_FIRST_VARIABLE is not correct in T_defs.h"); + if (first_fun != (unsigned)VCD_FIRST_FUNCTION) + err("VCD_FIRST_FUNCTION is not correct in T_defs.h"); + if (last_var-first_var+1 != VCD_NUM_VARIABLES) + err("VCD_NUM_VARIABLES is not correct in T_defs.h"); + if (last_fun-first_fun+1 != VCD_NUM_FUNCTIONS) + err("VCD_NUM_FUNCTIONS is not correct in T_defs.h"); + + /* check that VCD_NAME is identical to + * eurecomVariablesNames[x]/eurecomFunctionsNames[x] + */ + prefix = "VCD_VARIABLE_"; + prefix_len = strlen(prefix); + + for (i = 0; i < number_of_events; i++) { + name = event_name_from_id(database, i); + if (strncmp(name, prefix, prefix_len)) continue; + vcd_name = event_vcd_name_from_id(database, i); + if (vcd_name == NULL) + err("%s has no VCD_NAME in T_messages.txt", name); + if (strcmp(vcd_name, eurecomVariablesNames[i - first_var])) + err("%s has a wrong VCD_NAME in T_messages.txt", name); + } + + prefix = "VCD_FUNCTION_"; + prefix_len = strlen(prefix); + + for (i = 0; i < number_of_events; i++) { + name = event_name_from_id(database, i); + if (strncmp(name, prefix, prefix_len)) continue; + vcd_name = event_vcd_name_from_id(database, i); + if (vcd_name == NULL) + err("%s has no VCD_NAME in T_messages.txt", name); + if (strcmp(vcd_name, eurecomFunctionsNames[i - first_fun])) + err("%s has a wrong VCD_NAME in T_messages.txt", name); + } + + /* check IDs - these checks are difficult because we parse + * common/utils/LOG/vcd_signal_dumper.h which is expected to + * be formatted as is: + * - define vcd_signal_dump_variables then vcd_signal_dump_functions + * - one VCD_XXXX per line starting with two spaces + * followed by ',' or '=' with no space in between + * - no #ifdef / #if is taken into account + * - we require VCD_SIGNAL_DUMPER_VARIABLES_END and + * VCD_SIGNAL_DUMPER_FUNCTIONS_END at the end of each array, + * each on a line of its own with two spaces before and nothing after. + * + * If these checks fail, consider formatting + * common/utils/LOG/vcd_signal_dumper.h as expected here, if + * it makes sense of course. Otherwise, change the code below. + * + * In common/utils/LOG/vcd_signal_dumper.h a valid name is + * either VCD_SIGNAL_DUMPER_VARIABLES_ABC or + * VCD_SIGNAL_DUMPER_FUNCTIONS_XYZ + * and in T_messages.txt the corresponding name has to be + * VCD_VARIABLE_ABC or VCD_FUNCTION_XYZ + */ + i = first_var; + in = fopen("../LOG/vcd_signal_dumper.h", "r"); + if (in == NULL) err("could not open ../LOG/vcd_signal_dumper.h"); + while (1) { + char *x = " VCD_SIGNAL_DUMPER_VARIABLES_"; + ssize_t r; + free(l); + l = NULL; + lsize = 0; + r = getline(&l, &lsize, in); + if (r == -1) break; + if (!strcmp(l, " VCD_SIGNAL_DUMPER_VARIABLES_END\n")) break; + /* remove ',' or '=' if found */ + { char *s=l; while (*s) { if (*s==','||*s=='=') { *s=0; break; } s++; } } + if (strncmp(l, x, strlen(x))) continue; + if (!(i >= first_var && i <= last_var)) + err("T_messages.txt is not correct with respect to VCD VARIABLES"); + name = event_name_from_id(database, i); + if (strcmp(l+strlen(x), name+strlen("VCD_VARIABLE_"))) + err("%s is not correct in T_messages.txt", name); + i++; + } + if (i != last_var + 1) err("VCD VARIABLES wrong in T_messages.txt"); + while (1) { + char *x = " VCD_SIGNAL_DUMPER_FUNCTIONS_"; + ssize_t r; + free(l); + l = NULL; + lsize = 0; + r = getline(&l, &lsize, in); + if (r == -1) break; + if (!strcmp(l, " VCD_SIGNAL_DUMPER_FUNCTIONS_END\n")) break; + /* remove ',' or '=' if found */ + { char *s=l; while (*s) { if (*s==','||*s=='=') { *s=0; break; } s++; } } + if (strncmp(l, x, strlen(x))) continue; + if (!(i >= first_fun && i <= last_fun)) + err("T_messages.txt is not correct with respect to VCD FUNCTIONS"); + name = event_name_from_id(database, i); + if (strcmp(l+strlen(x), name+strlen("VCD_FUNCTION_"))) + err("%s is not correct in T_messages.txt", name); + i++; + } + fclose(in); + if (i != last_fun + 1) err("VCD FUNCTIONS wrong in T_messages.txt"); + + return 0; +} diff --git a/common/utils/T/genids.c b/common/utils/T/genids.c index 734c506368ac348ba9db9ae2eae8048fcec929d6..8e5adbf587081322fc2d6047c7b4d246841bdc94 100644 --- a/common/utils/T/genids.c +++ b/common/utils/T/genids.c @@ -14,21 +14,21 @@ int cmp(const void *p1, const void *p2) } /* return 1 if s was not already known, 0 if it was */ -int new_unique_id(char *s) +int new_unique_id(char *s, char *input_file) { if (unique_ids_size) if (bsearch(&s, unique_ids, unique_ids_size, sizeof(char *), cmp) != NULL) { - printf("FATAL: ID %s is not unique\n", s); + printf("error: ID %s is not unique in %s\n", s, input_file); return 0; } if (unique_ids_size == unique_ids_maxsize) { unique_ids_maxsize += 256; unique_ids = realloc(unique_ids, unique_ids_maxsize * sizeof(char *)); - if (unique_ids == NULL) { printf("out of memory\n"); abort(); } + if (unique_ids == NULL) { printf("erorr: out of memory\n"); abort(); } } unique_ids[unique_ids_size] = strdup(s); if (unique_ids[unique_ids_size] == NULL) - { printf("out of memory\n"); abort(); } + { printf("erorr: out of memory\n"); abort(); } unique_ids_size++; qsort(unique_ids, unique_ids_size, sizeof(char *), cmp); return 1; @@ -43,7 +43,8 @@ void putname(int c) if (bufname_size == bufname_maxsize) { bufname_maxsize += 256; bufname = realloc(bufname, bufname_maxsize); - if (bufname == NULL) { printf("memory allocation error\n"); exit(1); } + if (bufname == NULL) + { printf("erorr: memory allocation error\n"); exit(1); } } bufname[bufname_size] = c; bufname_size++; @@ -58,7 +59,8 @@ void putvalue(int c) if (bufvalue_size == bufvalue_maxsize) { bufvalue_maxsize += 256; bufvalue = realloc(bufvalue, bufvalue_maxsize); - if (bufvalue == NULL) { printf("memory allocation error\n"); exit(1); } + if (bufvalue == NULL) + { printf("error: memory allocation error\n"); exit(1); } } bufvalue[bufvalue_size] = c; bufvalue_size++; @@ -119,7 +121,7 @@ int main(int n, char **v) char *in_name; char *out_name; - if (n != 3) { printf("gimme <source> <dest>\n"); exit(1); } + if (n != 3) { printf("error: gimme <source> <dest>\n"); exit(1); } n = 0; @@ -134,14 +136,13 @@ int main(int n, char **v) while (1) { get_line(in, &name, &value); if (name == NULL) break; - printf("name '%s' value '%s'\n", name, value); if (isspace(value[strlen(value)-1])) { - printf("bad value '%s' (no space at the end please!)\n", value); + printf("error: bad value '%s' (no space at the end please!)\n", value); unlink(out_name); exit(1); } if (!strcmp(name, "ID")) { - if (!new_unique_id(value)) { unlink(out_name); exit(1); } + if (!new_unique_id(value, in_name)) { unlink(out_name); exit(1); } fprintf(out, "#define T_%s T_ID(%d)\n", value, n); n++; } diff --git a/common/utils/T/local_tracer.c b/common/utils/T/local_tracer.c index c331daa4a9f0410d918ea317466b738479328d0a..f8e92881a96e79a000e57fcad814e8440719a895 100644 --- a/common/utils/T/local_tracer.c +++ b/common/utils/T/local_tracer.c @@ -337,54 +337,34 @@ static void forward(void *_forwarder, char *buf, int size) static void wait_message(void) { - while (T_local_cache[T_busylist_head].busy == 0) usleep(1000); -} - -static void init_shm(char *shm_file) -{ - int i; - int s = shm_open(shm_file, O_RDWR | O_CREAT /*| O_SYNC*/, 0666); - if (s == -1) { perror(shm_file); abort(); } - if (ftruncate(s, T_CACHE_SIZE * sizeof(T_cache_t))) - { perror(shm_file); abort(); } - T_local_cache = mmap(NULL, T_CACHE_SIZE * sizeof(T_cache_t), - PROT_READ | PROT_WRITE, MAP_SHARED, s, 0); - if (T_local_cache == MAP_FAILED) - { perror(shm_file); abort(); } - close(s); - - /* let's garbage the memory to catch some potential problems - * (think multiprocessor sync issues, barriers, etc.) - */ - memset(T_local_cache, 0x55, T_CACHE_SIZE * sizeof(T_cache_t)); - for (i = 0; i < T_CACHE_SIZE; i++) T_local_cache[i].busy = 0; + while ((T_local_cache[T_busylist_head].busy & 0x02) == 0) usleep(1000); } void T_local_tracer_main(int remote_port, int wait_for_tracer, - int local_socket, char *shm_file) + int local_socket, void *shm_array) { int s; int port = remote_port; int dont_wait = wait_for_tracer ? 0 : 1; void *f; - printf("local tracer starting\n"); + /* write on a socket fails if the other end is closed and we get SIGPIPE */ - if (signal(SIGPIPE, SIG_IGN) == SIG_ERR){ + if (signal(SIGPIPE, SIG_IGN) == SIG_ERR) { printf("local tracer received SIGPIPE\n"); abort(); - } + } + + T_local_cache = shm_array; - init_shm(shm_file); s = local_socket; - printf("local tracer starting step 2\n"); + if (dont_wait) { char t = 2; - printf("local tracer in no wait mode \n"); if (write(s, &t, 1) != 1) abort(); } - printf("local tracer starting step 3\n"); + f = forwarder(port, s); - printf("local tracer main loop.... \n"); + /* read messages */ while (1) { wait_message(); diff --git a/common/utils/T/tracer/Makefile b/common/utils/T/tracer/Makefile index 1c4a77587c3916c9140a9ef71465b08e8a9313aa..3da4aa13a17528cc1396f5eedc2e40eee91c2cb1 100644 --- a/common/utils/T/tracer/Makefile +++ b/common/utils/T/tracer/Makefile @@ -7,7 +7,7 @@ LIBS=-lm XLIBS=-lX11 -lpng -lXft all: record replay extract_config textlog enb ue vcd macpdu2wireshark \ - extract_input_subframe extract_output_subframe to_vcd extract + extract_input_subframe extract_output_subframe to_vcd extract multi record: utils.o record.o database.o config.o $(CC) $(CFLAGS) -o record $^ $(LIBS) @@ -57,19 +57,22 @@ macpdu2wireshark: macpdu2wireshark.o database.o utils.o handler.o event.o \ config.o $(CC) $(CFLAGS) -o $@ $^ $(LIBS) +multi: multi.o utils.o database.o config.o + $(CC) $(CFLAGS) -o multi $^ $(LIBS) + .PHONY: all gui/gui.a view/view.a logger/logger.a filter/filter.a gui/gui.a: - cd gui && make + cd gui && $(MAKE) view/view.a: - cd view && make + cd view && $(MAKE) logger/logger.a: - cd logger && make + cd logger && $(MAKE) filter/filter.a: - cd filter && make + cd filter && $(MAKE) %.o: %.c $(CC) $(CFLAGS) -c -o $@ $< @@ -77,9 +80,9 @@ filter/filter.a: clean: rm -f *.o core tracer_remote textlog enb ue vcd record replay rm -f extract_config macpdu2wireshark extract_input_subframe - rm -f extract_output_subframe to_vcd extract - cd gui && make clean - cd view && make clean - cd logger && make clean - cd filter && make clean - cd hacks && make clean + rm -f extract_output_subframe to_vcd extract multi + cd gui && $(MAKE) clean + cd view && $(MAKE) clean + cd logger && $(MAKE) clean + cd filter && $(MAKE) clean + cd hacks && $(MAKE) clean diff --git a/common/utils/T/tracer/config.c b/common/utils/T/tracer/config.c index f88966ed79a111b2ab2d09d7110ae9da0c3781ea..723902ec9c8bbe518ca2eaad902c1903771e87f4 100644 --- a/common/utils/T/tracer/config.c +++ b/common/utils/T/tracer/config.c @@ -60,3 +60,9 @@ void verify_config(void) abort(); } } + +void get_local_config(char **txt, int *len) +{ + *txt = local; + *len = local_size; +} diff --git a/common/utils/T/tracer/config.h b/common/utils/T/tracer/config.h index f90869eb6621f89c5be80fc012e4edc7102a4652..07290c71a35c5605596ff3770a34db40ce5dbc0a 100644 --- a/common/utils/T/tracer/config.h +++ b/common/utils/T/tracer/config.h @@ -5,5 +5,6 @@ void clear_remote_config(void); void append_received_config_chunk(char *buf, int length); void load_config_file(char *filename); void verify_config(void); +void get_local_config(char **txt, int *len); #endif /* _CONFIG_H_ */ diff --git a/common/utils/T/tracer/database.c b/common/utils/T/tracer/database.c index f0908948e23cb81ac2809faa14b8856f53492075..543ab666640309719c2599ad00e7b4ff6b66caea 100644 --- a/common/utils/T/tracer/database.c +++ b/common/utils/T/tracer/database.c @@ -13,6 +13,7 @@ typedef struct { char **arg_type; char **arg_name; int asize; + char *vcd_name; int id; } id; @@ -138,6 +139,7 @@ id *add_id(database *r, char *idname, int i) r->i[r->isize].arg_type = NULL; r->i[r->isize].arg_name = NULL; r->i[r->isize].asize = 0; + r->i[r->isize].vcd_name = NULL; r->i[r->isize].id = i; r->isize++; qsort(r->i, r->isize, sizeof(id), id_cmp); @@ -224,6 +226,12 @@ void add_desc(id *i, char *desc) i->desc = strdup(desc); if (i->desc == NULL) abort(); } +void add_vcd_name(id *i, char *vcd_name) +{ + if (i == NULL) {printf("ERROR: VCD_NAME line before ID line\n");exit(1);} + i->vcd_name = strdup(vcd_name); if (i->vcd_name == NULL) abort(); +} + char *format_get_next_token(char **cur) { char *start; @@ -320,6 +328,7 @@ void *parse_database(char *filename) if (!strcmp(name, "GROUP")) add_groups(r, last_id, value); if (!strcmp(name, "DESC")) add_desc(last_id, value); if (!strcmp(name, "FORMAT")) add_format(last_id, value); + if (!strcmp(name, "VCD_NAME")) add_vcd_name(last_id, value); } fclose(in); @@ -424,6 +433,12 @@ char *event_name_from_id(void *_database, int id) return d->i[d->id_to_pos[id]].name; } +char *event_vcd_name_from_id(void *_database, int id) +{ + database *d = _database; + return d->i[d->id_to_pos[id]].vcd_name; +} + int event_id_from_name(void *_database, char *name) { database *d = _database; diff --git a/common/utils/T/tracer/database.h b/common/utils/T/tracer/database.h index c5cab05d9f7be0da0cc8d50fcf3fda243aec556a..9fdbaed7c685fb77979167f243fdd5732597566b 100644 --- a/common/utils/T/tracer/database.h +++ b/common/utils/T/tracer/database.h @@ -8,6 +8,7 @@ void list_ids(void *database); void list_groups(void *database); void on_off(void *d, char *item, int *a, int onoff); char *event_name_from_id(void *database, int id); +char *event_vcd_name_from_id(void *_database, int id); int event_id_from_name(void *database, char *name); int number_of_ids(void *database); int database_get_ids(void *database, char ***ids); diff --git a/common/utils/T/tracer/enb.c b/common/utils/T/tracer/enb.c index a30366faf1eb8e645d5efba1cf664985cc60c255..ea499a68f831b5e7d7bbecb144815e2d9ddc81d6 100644 --- a/common/utils/T/tracer/enb.c +++ b/common/utils/T/tracer/enb.c @@ -878,6 +878,7 @@ int main(int n, char **v) restart: clear_remote_config(); + if (enb_data.socket != -1) close(enb_data.socket); enb_data.socket = connect_to(ip, port); /* send the first message - activate selected traces */ diff --git a/common/utils/T/tracer/multi.c b/common/utils/T/tracer/multi.c new file mode 100644 index 0000000000000000000000000000000000000000..6a9de838c674b1473e54d99a147d91c9d431311e --- /dev/null +++ b/common/utils/T/tracer/multi.c @@ -0,0 +1,385 @@ +#include <stdio.h> +#include <stdlib.h> +#include <signal.h> +#include <string.h> +#include <poll.h> +#include <sys/socket.h> +#include <unistd.h> +#include "database.h" +#include "utils.h" +#include "../T.h" +#include "config.h" + +#define DEFAULT_LOCAL_PORT 2022 + +typedef struct { + int id; /* increases at each new tracer's connection */ + int s; /* socket */ + int *is_on; /* local vision of is_on for this tracer */ + int poll_id; /* -1: invalid, otherwise index in fds array */ +} ti_t; + +typedef struct { + ti_t *ti; /* data for tracers */ + int ti_size; + int ti_maxsize; +} multi_t; + +void set_is_on(int *is_on, int pos, int val) +{ + if (val) is_on[pos]++; else is_on[pos]--; + /* TODO: remove check? */ + if (is_on[pos] < 0) { printf("%s:%d:nonono\n",__FILE__,__LINE__); abort(); } +} + +int send_messages_txt(int s, char *T_messages_txt, int T_messages_txt_len) +{ + char buf[T_BUFFER_MAX]; + char *T_LOCAL_buf = buf; + int32_t T_LOCAL_size; + unsigned char *src; + int src_len; + + /* trace T_message.txt + * Send several messages -1 with content followed by message -2. + */ + src = (unsigned char *)T_messages_txt; + src_len = T_messages_txt_len; + while (src_len) { + int send_size = src_len; + if (send_size > T_PAYLOAD_MAXSIZE - sizeof(int)) + send_size = T_PAYLOAD_MAXSIZE - sizeof(int); + /* TODO: be careful, we use internal T stuff, to rewrite? */ + T_LOCAL_size = 0; + T_HEADER(T_ID(-1)); + T_PUT_buffer(1, ((T_buffer){addr:(src), length:(send_size)})); + if (socket_send(s, &T_LOCAL_size, 4) == -1) return -1; + if (socket_send(s, buf, T_LOCAL_size) == -1) return -1; + src += send_size; + src_len -= send_size; + } + T_LOCAL_size = 0; + T_HEADER(T_ID(-2)); + if (socket_send(s, &T_LOCAL_size, 4) == -1) return -1; + return socket_send(s, buf, T_LOCAL_size); +} + +void new_tracer(multi_t *m, int s, int is_on_size, char *t, int t_size, int id) +{ + if (send_messages_txt(s, t, t_size) == -1) { + printf("error sending T_messages.txt to new tracer %d => remove tracer\n", + id); + return; + } + if (m->ti_size == m->ti_maxsize) { + m->ti_maxsize += 64; + m->ti = realloc(m->ti, m->ti_maxsize * sizeof(ti_t)); + if (m->ti == NULL) abort(); + } + m->ti[m->ti_size].id = id; + m->ti[m->ti_size].s = s; + m->ti[m->ti_size].is_on = calloc(is_on_size, sizeof(int)); + if (m->ti[m->ti_size].is_on == NULL) abort(); + m->ti[m->ti_size].poll_id = -1; + m->ti_size++; +} + +void remove_tracer(multi_t *m, int t) +{ + free(m->ti[t].is_on); + shutdown(m->ti[t].s, SHUT_RDWR); + close(m->ti[t].s); + m->ti_size--; + memmove(&m->ti[t], &m->ti[t+1], (m->ti_size - t) * sizeof(ti_t)); +} + +int send_is_on(int socket, int number_of_events, int *is_on) +{ + int i; + char mt = 1; + if (socket_send(socket, &mt, 1) == -1 || + socket_send(socket, &number_of_events, sizeof(int)) == -1) return -1; + for (i = 0; i < number_of_events; i++) { + int v = is_on[i] ? 1 : 0; + if (socket_send(socket, &v, sizeof(int)) == -1) return -1; + } + return 0; +} + +int read_tracee(int s, OBUF *ebuf, int *_type, int32_t *_length) +{ + int type; + int32_t length; + char *v; + int vpos = 0; + + if (fullread(s, &length, 4) == -1) return -1; + if (ebuf->omaxsize < length) { + ebuf->omaxsize = (length + 65535) & ~65535; + ebuf->obuf = realloc(ebuf->obuf, ebuf->omaxsize); + if (ebuf->obuf == NULL) { printf("out of memory\n"); exit(1); } + } + v = ebuf->obuf; + memcpy(v+vpos, &length, 4); + vpos += 4; +#ifdef T_SEND_TIME + if (fullread(s,v+vpos,sizeof(struct timespec))==-1) return -1; + vpos += sizeof(struct timespec); + length -= sizeof(struct timespec); +#endif + if (fullread(s, &type, sizeof(int)) == -1) return -1; + memcpy(v+vpos, &type, sizeof(int)); + vpos += sizeof(int); + length -= sizeof(int); + if (fullread(s, v+vpos, length) == -1) return -1; + vpos += length; + + ebuf->osize = vpos; + + *_type = type; + *_length = length; + return 0; +} + +void forward_event(multi_t *m, int number_of_events, OBUF *ebuf, int type) +{ + int i; + + if (type < 0 || type >= number_of_events) + { printf("error: bad type of event to forward %d\n", type); abort(); } + + for (i = 0; i < m->ti_size; i++) { + if (!m->ti[i].is_on[type]) continue; + if (socket_send(m->ti[i].s, ebuf->obuf, ebuf->osize) == -1) + printf("warning: error forwarding event to tracer %d\n", m->ti[i].id); + } +} + +int connect_to_tracee(char *ip, int port, int number_of_events, int *is_on) +{ + int s; + + printf("connecting to %s:%d\n", ip, port); + + s = try_connect_to(ip, port); + if (s == -1) return -1; + + if (send_is_on(s, number_of_events, is_on) == -1) { + shutdown(s, SHUT_RDWR); + close(s); + return -1; + } + + return s; +} + +void usage(void) +{ + printf( +"options:\n" +" -d <database file> this option is mandatory\n" +" -ip <host> connect to given IP address (default %s)\n" +" -p <port> connect to given port (default %d)\n" +" -lp <port> listen on local port (default %d)\n", + DEFAULT_REMOTE_IP, + DEFAULT_REMOTE_PORT, + DEFAULT_LOCAL_PORT + ); + exit(1); +} + +int main(int n, char **v) +{ + char *database_filename = NULL; + void *database; + char *ip = DEFAULT_REMOTE_IP; + int port = DEFAULT_REMOTE_PORT; + int local_port = DEFAULT_LOCAL_PORT; + int *is_on; + int number_of_events; + int i, j; + char *T_messages_txt; + int T_messages_txt_len; + int l; /* listen socket for tracers' connections */ + int s = -1; /* socket connected to tracee. -1 if not connected */ + multi_t m; + int is_on_changed; + int current_nfd; + struct pollfd *fds = NULL; + int next_id = 0; + + memset(&m, 0, sizeof(m)); + + /* write on a socket fails if the other end is closed and we get SIGPIPE */ + if (signal(SIGPIPE, SIG_IGN) == SIG_ERR) abort(); + + for (i = 1; i < n; i++) { + if (!strcmp(v[i], "-h") || !strcmp(v[i], "--help")) usage(); + if (!strcmp(v[i], "-d")) + { if (i > n-2) usage(); database_filename = v[++i]; continue; } + if (!strcmp(v[i], "-ip")) { if (i > n-2) usage(); ip = v[++i]; continue; } + if (!strcmp(v[i], "-p")) + { if (i > n-2) usage(); port = atoi(v[++i]); continue; } + if (!strcmp(v[i], "-lp")) + { if (i > n-2) usage(); local_port = atoi(v[++i]); continue; } + usage(); + } + + if (database_filename == NULL) { + printf("ERROR: provide a database file (-d)\n"); + exit(1); + } + + database = parse_database(database_filename); + + load_config_file(database_filename); + get_local_config(&T_messages_txt, &T_messages_txt_len); + + number_of_events = number_of_ids(database); + is_on = calloc(number_of_events, sizeof(int)); + if (is_on == NULL) abort(); + + /* create listener socket */ + l = create_listen_socket("0.0.0.0", local_port); + + OBUF ebuf = { osize: 0, omaxsize: 0, obuf: NULL }; + + current_nfd = 0; + + while (1) { + int nfd; + int timeout; + + if (s == -1) s = connect_to_tracee(ip, port, number_of_events, is_on); + + /* poll on s (if there), l, and all tracers' sockets */ + nfd = 1 + (s != -1) + m.ti_size; + if (nfd != current_nfd) { + current_nfd = nfd; + free(fds); + fds = calloc(nfd, sizeof(struct pollfd)); + if (fds == NULL) { perror("calloc"); exit(1); } + } + i = 0; + fds[i].fd = l; + fds[i].events = POLLIN; + i++; + if (s != -1) { + fds[i].fd = s; + fds[i].events = POLLIN; + i++; + } + for (j = 0; j < m.ti_size; j++) { + m.ti[j].poll_id = i; + fds[i].fd = m.ti[j].s; + fds[i].events = POLLIN; + i++; + } + if (s == -1) timeout = 1000; else timeout = -1; + if (poll(fds, nfd, timeout) == -1) { perror("poll"); exit(1); } + + if (fds[0].revents & ~POLLIN) { + printf("TODO: error on listen socket?\n"); + exit(1); + } + + /* new tracer connecting? */ + if (fds[0].revents & POLLIN) { + int t; + printf("tracer %d connecting\n", next_id); + t = socket_accept(l); + if (t == -1) perror("accept"); + else new_tracer(&m, t, number_of_events, + T_messages_txt, T_messages_txt_len, next_id); + next_id++; + } + + if (s != -1 && fds[1].revents & ~POLLIN) { + printf("TODO: error on tracee socket?\n"); + exit(1); + } + + /* data from tracee */ + if (s != -1 && fds[1].revents & POLLIN) { + int type; + int32_t length; + if (read_tracee(s, &ebuf, &type, &length) == -1) { + clear_remote_config(); + shutdown(s, SHUT_RDWR); + close(s); + s = -1; + } else { + if (type == -1) + append_received_config_chunk(ebuf.obuf+ebuf.osize-length, length); + else if (type == -2) verify_config(); + else forward_event(&m, number_of_events, &ebuf, type); + } + } + + /* status of each tracer */ + is_on_changed = 0; + for (j = 0; j < m.ti_size; j++) { + int l; + int s; + int *t_is_on; + if (m.ti[j].poll_id == -1) continue; + i = m.ti[j].poll_id; + s = m.ti[j].s; + t_is_on = m.ti[j].is_on; + if (fds[i].revents & (POLLHUP | POLLERR)) goto tracer_error; + /* error? */ + if (fds[i].revents & ~POLLIN) { + printf("TODO: error with tracer?\n"); + exit(1); + } + /* data in */ + if (fds[i].revents & POLLIN) { + char t; + int len; + int v; + if (fullread(s, &t, 1) != 1) goto tracer_error; + switch (t) { + case 0: + is_on_changed = 1; + if (fullread(s, &len, sizeof(int)) == -1) goto tracer_error; + for (l = 0; l < len; l++) { + if (fullread(s, &v, sizeof(int)) == -1) goto tracer_error; + if (v < 0 || v >= number_of_events) goto tracer_error; + t_is_on[v] = 1 - t_is_on[v]; + set_is_on(is_on, v, t_is_on[v]); + } + break; + case 1: + is_on_changed = 1; + if (fullread(s, &len, sizeof(int)) == -1) goto tracer_error; + if (len < 0 || len > number_of_events) goto tracer_error; + for (l = 0; l < len; l++) { + if (fullread(s, &v, sizeof(int)) == -1) goto tracer_error; + if (v < 0 || v > 1) goto tracer_error; + if (t_is_on[l] != v) set_is_on(is_on, l, v); + t_is_on[l] = v; + } + break; + case 2: break; + default: printf("error: unhandled message type %d\n", t); //abort(); + } + } + continue; +tracer_error: + printf("remove tracer %d\n", m.ti[j].id); + for (l = 0; l < number_of_events; l++) + if (m.ti[j].is_on[l]) { is_on_changed = 1; set_is_on(is_on, l, 0); } + remove_tracer(&m, j); + j--; + } + if (is_on_changed && s != -1) + if (send_is_on(s, number_of_events, is_on) == -1) { + clear_remote_config(); + shutdown(s, SHUT_RDWR); + close(s); + s = -1; + } + } + + return 0; +} diff --git a/common/utils/T/tracer/to_vcd.c b/common/utils/T/tracer/to_vcd.c index 1a67a9d4ffa6b631c59f9246516d61fe8e0efb12..998649af01543a531193640112832731657082d9 100644 --- a/common/utils/T/tracer/to_vcd.c +++ b/common/utils/T/tracer/to_vcd.c @@ -12,7 +12,14 @@ #include "logger/logger.h" #include "view/view.h" +enum var_type { + DEFAULT, + VCD_FUNCTION, + VCD_VARIABLE +}; + typedef struct { + enum var_type type; char *event; char *arg; char *vcd_name; @@ -44,16 +51,39 @@ void vcd_write_header(vcd_vars *v, int n) "$version\n" " to_vcd\n" "$end\n" -"$timescale 1ns $end\n" +"$timescale 1ns $end\n") <= 0) abort(); + + if (fprintf(out, "$scope module logic $end\n") <= 0) abort(); + for (i = 0; i < n; i++) + if (v[i].type == DEFAULT) + if (fprintf(out, "$var wire %d %s %s $end\n", + v[i].boolean ? 1 : 64, + v[i].vcd_name, v[i].vcd_name) <= 0) abort(); + if (fprintf(out, +"$upscope $end\n") <= 0) abort(); + if (fprintf(out, +"$scope module functions $end\n") <= 0) abort(); + for (i = 0; i < n; i++) + if (v[i].type == VCD_FUNCTION) + if (fprintf(out, "$var wire %d %s %s $end\n", + v[i].boolean ? 1 : 64, + v[i].vcd_name, v[i].vcd_name) <= 0) abort(); + if (fprintf(out, +"$upscope $end\n") <= 0) abort(); + + if (fprintf(out, +"$scope module variables $end\n") <= 0) abort(); for (i = 0; i < n; i++) - if (fprintf(out, "$var wire %d %s %s $end\n", - v[i].boolean ? 1 : 64, - v[i].vcd_name, v[i].vcd_name) <= 0) abort(); + if (v[i].type == VCD_VARIABLE) + if (fprintf(out, "$var wire %d %s %s $end\n", + v[i].boolean ? 1 : 64, + v[i].vcd_name, v[i].vcd_name) <= 0) abort(); + if (fprintf(out, +"$upscope $end\n") <= 0) abort(); if (fprintf(out, -"$upscope $end\n" "$enddefinitions $end\n" "$dumpvars\n") <= 0) abort(); @@ -194,12 +224,13 @@ void force_stop(int x) } vcd_vars *add_var(vcd_vars *vars, int nvars, - char *event, char *arg, char *vcd_name, int is_boolean) + char *event, char *arg, char *vcd_name, int is_boolean, enum var_type t) { if (nvars % 64 == 0) { vars = realloc(vars, (nvars+64) * sizeof(vcd_vars)); if (vars == NULL) abort(); } + vars[nvars].type = t; vars[nvars].event = event; vars[nvars].arg = arg; vars[nvars].vcd_name = vcd_name; @@ -240,7 +271,7 @@ int main(int n, char **v) char *event = v[++i]; char *arg = v[++i]; char *vcd_name = v[++i]; - vars = add_var(vars, nvars, event, arg, vcd_name, 1); + vars = add_var(vars, nvars, event, arg, vcd_name, 1, DEFAULT); nvars++; continue; } @@ -248,7 +279,7 @@ int main(int n, char **v) char *event = v[++i]; char *arg = v[++i]; char *vcd_name = v[++i]; - vars = add_var(vars, nvars, event, arg, vcd_name, 0); + vars = add_var(vars, nvars, event, arg, vcd_name, 0, DEFAULT); nvars++; continue; } @@ -283,20 +314,30 @@ int main(int n, char **v) /* activate all VCD traces */ for (i = 0; i < number_of_events; i++) { int is_boolean; + enum var_type type; int prefix_length; char *name = event_name_from_id(database, i); + char *vcd_name; char *var_prefix = "VCD_VARIABLE_"; char *fun_prefix = "VCD_FUNCTION_"; if (!strncmp(name, var_prefix, strlen(var_prefix))) { prefix_length = strlen(var_prefix); is_boolean = 0; + type = VCD_VARIABLE; } else if (!strncmp(name, fun_prefix, strlen(fun_prefix))) { prefix_length = strlen(fun_prefix); is_boolean = 1; + type = VCD_FUNCTION; } else continue; + vcd_name = event_vcd_name_from_id(database, i); + if (vcd_name == NULL) { + vcd_name = name+prefix_length; + printf("WARNING: ID %s does not define VCD_NAME in the file %s, using %s\n", + name, database_filename, vcd_name); + } vars = add_var(vars, nvars, - name, "value", name+prefix_length, is_boolean); + name, "value", vcd_name, is_boolean, type); nvars++; } } diff --git a/common/utils/T/tracer/ue.c b/common/utils/T/tracer/ue.c index 6a7d03c897357c5e0d2cbbe07239fcb2bf2ebcfc..7b03210cd2cb3d7884fa57c6531e08d58a3aa141 100644 --- a/common/utils/T/tracer/ue.c +++ b/common/utils/T/tracer/ue.c @@ -857,6 +857,7 @@ int main(int n, char **v) restart: clear_remote_config(); + if (ue_data.socket != -1) close(ue_data.socket); ue_data.socket = connect_to(ip, port); /* send the first message - activate selected traces */ diff --git a/common/utils/T/tracer/utils.c b/common/utils/T/tracer/utils.c index 507154673538a4570c058f1af5ecf4db8771871d..7f58b6f5aa0061189d01a5107d8e6dcea035138a 100644 --- a/common/utils/T/tracer/utils.c +++ b/common/utils/T/tracer/utils.c @@ -79,6 +79,36 @@ list *list_append(list *l, void *data) /* socket */ /****************************************************************************/ +int create_listen_socket(char *addr, int port) +{ + struct sockaddr_in a; + int s; + int v; + + s = socket(AF_INET, SOCK_STREAM, 0); + if (s == -1) { perror("socket"); exit(1); } + v = 1; + if (setsockopt(s, SOL_SOCKET, SO_REUSEADDR, &v, sizeof(int))) + { perror("setsockopt"); exit(1); } + + a.sin_family = AF_INET; + a.sin_port = htons(port); + a.sin_addr.s_addr = inet_addr(addr); + + if (bind(s, (struct sockaddr *)&a, sizeof(a))) { perror("bind"); exit(1); } + if (listen(s, 5)) { perror("listen"); exit(1); } + + return s; +} + +int socket_accept(int s) +{ + struct sockaddr_in a; + socklen_t alen; + alen = sizeof(a); + return accept(s, (struct sockaddr *)&a, &alen); +} + int socket_send(int socket, void *buffer, int size) { char *x = buffer; @@ -94,26 +124,13 @@ int socket_send(int socket, void *buffer, int size) int get_connection(char *addr, int port) { - struct sockaddr_in a; - socklen_t alen; int s, t; printf("waiting for connection on %s:%d\n", addr, port); - s = socket(AF_INET, SOCK_STREAM, 0); - if (s == -1) { perror("socket"); exit(1); } - t = 1; - if (setsockopt(s, SOL_SOCKET, SO_REUSEADDR, &t, sizeof(int))) - { perror("setsockopt"); exit(1); } - - a.sin_family = AF_INET; - a.sin_port = htons(port); - a.sin_addr.s_addr = inet_addr(addr); + s = create_listen_socket(addr, port); - if (bind(s, (struct sockaddr *)&a, sizeof(a))) { perror("bind"); exit(1); } - if (listen(s, 5)) { perror("bind"); exit(1); } - alen = sizeof(a); - t = accept(s, (struct sockaddr *)&a, &alen); + t = socket_accept(s); if (t == -1) { perror("accept"); exit(1); } close(s); @@ -137,14 +154,11 @@ int fullread(int fd, void *_buf, int count) return ret; } -int connect_to(char *addr, int port) +int try_connect_to(char *addr, int port) { int s; struct sockaddr_in a; - printf("connecting to %s:%d\n", addr, port); - -again: s = socket(AF_INET, SOCK_STREAM, 0); if (s == -1) { perror("socket"); exit(1); } @@ -155,6 +169,21 @@ again: if (connect(s, (struct sockaddr *)&a, sizeof(a)) == -1) { perror("connect"); close(s); + return -1; + } + + return s; +} + +int connect_to(char *addr, int port) +{ + int s; + + printf("connecting to %s:%d\n", addr, port); + +again: + s = try_connect_to(addr, port); + if (s == -1) { printf("trying again in 1s\n"); sleep(1); goto again; diff --git a/common/utils/T/tracer/utils.h b/common/utils/T/tracer/utils.h index 3be6cfe1a7f67af65282d7494c7d1a172fc163d7..6784117fa6cf66d3ffc33e191924f385dacc888d 100644 --- a/common/utils/T/tracer/utils.h +++ b/common/utils/T/tracer/utils.h @@ -24,11 +24,14 @@ list *list_append(list *l, void *data); #define DEFAULT_REMOTE_IP "127.0.0.1" #define DEFAULT_REMOTE_PORT 2021 +int create_listen_socket(char *addr, int port); +int socket_accept(int s); /* socket_send: return 0 if okay, -1 on error */ int socket_send(int socket, void *buffer, int size); int get_connection(char *addr, int port); /* fullread: return length read if okay (that is: 'count'), -1 on error */ int fullread(int fd, void *_buf, int count); +int try_connect_to(char *addr, int port); int connect_to(char *addr, int port); /****************************************************************************/ diff --git a/common/utils/itti/intertask_interface.c b/common/utils/itti/intertask_interface.c index 2e38b660d7e9256d4de3c88ab6acffe9186b7561..d088b59c041b8abeaf2408f0369a98588574537a 100644 --- a/common/utils/itti/intertask_interface.c +++ b/common/utils/itti/intertask_interface.c @@ -745,7 +745,7 @@ void itti_exit_task(void) #if defined(OAI_EMU) || defined(RTAI) if (task_id > TASK_UNKNOWN) { - VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME(VCD_SIGNAL_DUMPER_VARIABLE_ITTI_RECV_MSG, + VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME(VCD_SIGNAL_DUMPER_VARIABLES_ITTI_RECV_MSG, __sync_and_and_fetch (&itti_desc.vcd_receive_msg, ~(1L << task_id))); } #endif diff --git a/openair1/PHY/LTE_UE_TRANSPORT/dlsch_demodulation.c b/openair1/PHY/LTE_UE_TRANSPORT/dlsch_demodulation.c index a693cb55e4ce0a0922520b28b7540963458061cf..50b09102d88857b2b1a2cabf439e2e81a28f2d70 100644 --- a/openair1/PHY/LTE_UE_TRANSPORT/dlsch_demodulation.c +++ b/openair1/PHY/LTE_UE_TRANSPORT/dlsch_demodulation.c @@ -40,8 +40,14 @@ #include<math.h> #include <stdlib.h> #include <string.h> +#include <linux/version.h> +#if RHEL_RELEASE_CODE >= 1796 +#include <lapacke/lapacke_utils.h> +#include <lapacke/lapacke.h> +#else #include <lapacke_utils.h> #include <lapacke.h> +#endif #include <cblas.h> #include "linear_preprocessing_rec.h" diff --git a/openair1/PHY/LTE_UE_TRANSPORT/linear_preprocessing_rec.c b/openair1/PHY/LTE_UE_TRANSPORT/linear_preprocessing_rec.c index d85d440193757044eedadaf820ef4d46b47eddb6..7d063e326effc919180e5ebe12c02fa19d85b6a2 100644 --- a/openair1/PHY/LTE_UE_TRANSPORT/linear_preprocessing_rec.c +++ b/openair1/PHY/LTE_UE_TRANSPORT/linear_preprocessing_rec.c @@ -13,9 +13,14 @@ data storage. */ #include <stdlib.h> #include <cblas.h> #include <string.h> +#include <linux/version.h> +#if RHEL_RELEASE_CODE >= 1796 +#include <lapacke/lapacke_utils.h> +#include <lapacke/lapacke.h> +#else #include <lapacke_utils.h> #include <lapacke.h> - +#endif //#define DEBUG_PREPROC @@ -366,4 +371,4 @@ float sqrt_float(float x, float sqrt_x) { sqrt_x = (float)(sqrt((double)(x))); return sqrt_x; -} \ No newline at end of file +} diff --git a/openair2/ENB_APP/enb_config.c b/openair2/ENB_APP/enb_config.c index 2b6931effa66453a2df29a73b0342053d4fccf4e..737397d8d497f1b99252427ccb84c6a42d1a02f1 100644 --- a/openair2/ENB_APP/enb_config.c +++ b/openair2/ENB_APP/enb_config.c @@ -2355,12 +2355,12 @@ int RCconfig_S1(MessageDef *msg_p, uint32_t i) { #endif } if (strcmp(*(S1ParamList.paramarray[l][ENB_MME_IP_ADDRESS_PREFERENCE_IDX].strptr), "ipv4") == 0) { - S1AP_REGISTER_ENB_REQ (msg_p).mme_ip_address[j].ipv4 = 1; + S1AP_REGISTER_ENB_REQ (msg_p).mme_ip_address[l].ipv4 = 1; } else if (strcmp(*(S1ParamList.paramarray[l][ENB_MME_IP_ADDRESS_PREFERENCE_IDX].strptr), "ipv6") == 0) { - S1AP_REGISTER_ENB_REQ (msg_p).mme_ip_address[j].ipv6 = 1; + S1AP_REGISTER_ENB_REQ (msg_p).mme_ip_address[l].ipv6 = 1; } else if (strcmp(*(S1ParamList.paramarray[l][ENB_MME_IP_ADDRESS_PREFERENCE_IDX].strptr), "no") == 0) { - S1AP_REGISTER_ENB_REQ (msg_p).mme_ip_address[j].ipv4 = 1; - S1AP_REGISTER_ENB_REQ (msg_p).mme_ip_address[j].ipv6 = 1; + S1AP_REGISTER_ENB_REQ (msg_p).mme_ip_address[l].ipv4 = 1; + S1AP_REGISTER_ENB_REQ (msg_p).mme_ip_address[l].ipv6 = 1; } } diff --git a/openair2/LAYER2/MAC/eNB_scheduler_dlsch.c b/openair2/LAYER2/MAC/eNB_scheduler_dlsch.c index 05498e4377b0abb24a883da61da4a027cebed93c..df52b83d729b4087ba4d137da71bfcb339440252 100644 --- a/openair2/LAYER2/MAC/eNB_scheduler_dlsch.c +++ b/openair2/LAYER2/MAC/eNB_scheduler_dlsch.c @@ -386,6 +386,7 @@ set_ul_DAI(int module_idP, int UE_idP, int CC_idP, int frameP, UE_list->UE_template[CC_idP][UE_idP].DAI_ul[3] = DAI; break; } + break; case 2: // if ((subframeP==3)||(subframeP==8)) diff --git a/openair2/NETWORK_DRIVER/MESH/device.c b/openair2/NETWORK_DRIVER/MESH/device.c index f8a420697a95d043d2f5870d2c55ca8279567ed5..f5d31742bc400c4cc055d8950ae633c65b9beec0 100644 --- a/openair2/NETWORK_DRIVER/MESH/device.c +++ b/openair2/NETWORK_DRIVER/MESH/device.c @@ -324,7 +324,11 @@ static const struct net_device_ops nasmesh_netdev_ops = { .ndo_set_mac_address = NULL, .ndo_set_config = nas_set_config, .ndo_do_ioctl = nas_CTL_ioctl, +#if RHEL_RELEASE_CODE>=1797 + .extended.ndo_change_mtu = nas_change_mtu, +#else .ndo_change_mtu = nas_change_mtu, +#endif .ndo_tx_timeout = nas_tx_timeout, }; diff --git a/openair2/NETWORK_DRIVER/UE_IP/device.c b/openair2/NETWORK_DRIVER/UE_IP/device.c index d9a91496859a70cb62c4d699206ce5178f259dfe..47c820fe775330dd0aa9de35052667f31e4b0266 100644 --- a/openair2/NETWORK_DRIVER/UE_IP/device.c +++ b/openair2/NETWORK_DRIVER/UE_IP/device.c @@ -349,7 +349,11 @@ static const struct net_device_ops ue_ip_netdev_ops = { .ndo_set_mac_address = ue_ip_set_mac_address, .ndo_set_config = ue_ip_set_config, .ndo_do_ioctl = NULL, - .ndo_change_mtu = ue_ip_change_mtu, +#if RHEL_RELEASE_CODE>=1797 + .extended.ndo_change_mtu = ue_ip_change_mtu, +#else + .ndo_change_mtu = ue_ip_change_mtu, +#endif .ndo_tx_timeout = ue_ip_tx_timeout, .ndo_change_rx_flags = ue_ip_change_rx_flags, }; diff --git a/openair3/S1AP/MESSAGES/ASN1/R15/s1ap-15.2.0.asn1 b/openair3/S1AP/MESSAGES/ASN1/R15/s1ap-15.2.0.asn1 index db1f1b59150a5d17de2764d473ddd2627dc91d23..97d0a6de871ff1b8c4dd48a45df457f7d423223a 100755 --- a/openair3/S1AP/MESSAGES/ASN1/R15/s1ap-15.2.0.asn1 +++ b/openair3/S1AP/MESSAGES/ASN1/R15/s1ap-15.2.0.asn1 @@ -6881,3 +6881,201 @@ id-EDT-Session ProtocolIE-ID ::= 281 id-CNTypeRestrictions ProtocolIE-ID ::= 282 END + +-- ************************************************************** +-- +-- Container definitions +-- +-- ************************************************************** + +S1AP-Containers { +itu-t (0) identified-organization (4) etsi (0) mobileDomain (0) +eps-Access (21) modules (3) s1ap (1) version1 (1) s1ap-Containers (5) } + +DEFINITIONS AUTOMATIC TAGS ::= + +BEGIN + +-- ************************************************************** +-- +-- IE parameter types from other modules. +-- +-- ************************************************************** + +IMPORTS + Criticality, + Presence, + PrivateIE-ID, + ProtocolExtensionID, + ProtocolIE-ID +FROM S1AP-CommonDataTypes + + maxPrivateIEs, + maxProtocolExtensions, + maxProtocolIEs +FROM S1AP-Constants; + +-- ************************************************************** +-- +-- Class Definition for Protocol IEs +-- +-- ************************************************************** + +S1AP-PROTOCOL-IES ::= CLASS { + &id ProtocolIE-ID UNIQUE, + &criticality Criticality, + &Value, + &presence Presence +} +WITH SYNTAX { + ID &id + CRITICALITY &criticality + TYPE &Value + PRESENCE &presence +} + +-- ************************************************************** +-- +-- Class Definition for Protocol IEs +-- +-- ************************************************************** + +S1AP-PROTOCOL-IES-PAIR ::= CLASS { + &id ProtocolIE-ID UNIQUE, + &firstCriticality Criticality, + &FirstValue, + &secondCriticality Criticality, + &SecondValue, + &presence Presence +} +WITH SYNTAX { + ID &id + FIRST CRITICALITY &firstCriticality + FIRST TYPE &FirstValue + SECOND CRITICALITY &secondCriticality + SECOND TYPE &SecondValue + PRESENCE &presence +} + +-- ************************************************************** +-- +-- Class Definition for Protocol Extensions +-- +-- ************************************************************** + +S1AP-PROTOCOL-EXTENSION ::= CLASS { + &id ProtocolExtensionID UNIQUE, + &criticality Criticality, + &Extension, + &presence Presence +} +WITH SYNTAX { + ID &id + CRITICALITY &criticality + EXTENSION &Extension + PRESENCE &presence +} + +-- ************************************************************** +-- +-- Class Definition for Private IEs +-- +-- ************************************************************** + +S1AP-PRIVATE-IES ::= CLASS { + &id PrivateIE-ID, + &criticality Criticality, + &Value, + &presence Presence +} +WITH SYNTAX { + ID &id + CRITICALITY &criticality + TYPE &Value + PRESENCE &presence +} + +-- ************************************************************** +-- +-- Container for Protocol IEs +-- +-- ************************************************************** + +ProtocolIE-Container {S1AP-PROTOCOL-IES : IEsSetParam} ::= + SEQUENCE (SIZE (0..maxProtocolIEs)) OF + ProtocolIE-Field {{IEsSetParam}} + +ProtocolIE-SingleContainer {S1AP-PROTOCOL-IES : IEsSetParam} ::= + ProtocolIE-Field {{IEsSetParam}} + +ProtocolIE-Field {S1AP-PROTOCOL-IES : IEsSetParam} ::= SEQUENCE { + id S1AP-PROTOCOL-IES.&id ({IEsSetParam}), + criticality S1AP-PROTOCOL-IES.&criticality ({IEsSetParam}{@id}), + value S1AP-PROTOCOL-IES.&Value ({IEsSetParam}{@id}) +} + +-- ************************************************************** +-- +-- Container for Protocol IE Pairs +-- +-- ************************************************************** + +ProtocolIE-ContainerPair {S1AP-PROTOCOL-IES-PAIR : IEsSetParam} ::= + SEQUENCE (SIZE (0..maxProtocolIEs)) OF + ProtocolIE-FieldPair {{IEsSetParam}} + +ProtocolIE-FieldPair {S1AP-PROTOCOL-IES-PAIR : IEsSetParam} ::= SEQUENCE { + id S1AP-PROTOCOL-IES-PAIR.&id ({IEsSetParam}), + firstCriticality S1AP-PROTOCOL-IES-PAIR.&firstCriticality ({IEsSetParam}{@id}), + firstValue S1AP-PROTOCOL-IES-PAIR.&FirstValue ({IEsSetParam}{@id}), + secondCriticality S1AP-PROTOCOL-IES-PAIR.&secondCriticality ({IEsSetParam}{@id}), + secondValue S1AP-PROTOCOL-IES-PAIR.&SecondValue ({IEsSetParam}{@id}) +} + +-- ************************************************************** +-- +-- Container Lists for Protocol IE Containers +-- +-- ************************************************************** + +ProtocolIE-ContainerList {INTEGER : lowerBound, INTEGER : upperBound, S1AP-PROTOCOL-IES : IEsSetParam} ::= + SEQUENCE (SIZE (lowerBound..upperBound)) OF + ProtocolIE-SingleContainer {{IEsSetParam}} + +ProtocolIE-ContainerPairList {INTEGER : lowerBound, INTEGER : upperBound, S1AP-PROTOCOL-IES-PAIR : IEsSetParam} ::= + SEQUENCE (SIZE (lowerBound..upperBound)) OF + ProtocolIE-ContainerPair {{IEsSetParam}} + +-- ************************************************************** +-- +-- Container for Protocol Extensions +-- +-- ************************************************************** + +ProtocolExtensionContainer {S1AP-PROTOCOL-EXTENSION : ExtensionSetParam} ::= + SEQUENCE (SIZE (1..maxProtocolExtensions)) OF + ProtocolExtensionField {{ExtensionSetParam}} + +ProtocolExtensionField {S1AP-PROTOCOL-EXTENSION : ExtensionSetParam} ::= SEQUENCE { + id S1AP-PROTOCOL-EXTENSION.&id ({ExtensionSetParam}), + criticality S1AP-PROTOCOL-EXTENSION.&criticality ({ExtensionSetParam}{@id}), + extensionValue S1AP-PROTOCOL-EXTENSION.&Extension ({ExtensionSetParam}{@id}) +} + +-- ************************************************************** +-- +-- Container for Private IEs +-- +-- ************************************************************** + +PrivateIE-Container {S1AP-PRIVATE-IES : IEsSetParam } ::= + SEQUENCE (SIZE (1.. maxPrivateIEs)) OF + PrivateIE-Field {{IEsSetParam}} + +PrivateIE-Field {S1AP-PRIVATE-IES : IEsSetParam} ::= SEQUENCE { + id S1AP-PRIVATE-IES.&id ({IEsSetParam}), + criticality S1AP-PRIVATE-IES.&criticality ({IEsSetParam}{@id}), + value S1AP-PRIVATE-IES.&Value ({IEsSetParam}{@id}) +} + +END diff --git a/targets/RT/USER/lte-ru.c b/targets/RT/USER/lte-ru.c index 891dd9e272ff29cbe523236a3eff4b1cc206df4f..a0339e8f0f738ce18ab909710d7c01d73e8ca9fb 100644 --- a/targets/RT/USER/lte-ru.c +++ b/targets/RT/USER/lte-ru.c @@ -121,7 +121,7 @@ extern int emulate_rf; extern int numerology; extern int fepw; extern int single_thread_flag; - +extern clock_source_t clock_source; extern void phy_init_RU(RU_t*); extern void phy_free_RU(RU_t*); @@ -1411,7 +1411,8 @@ void fill_rf_config(RU_t *ru, char *rf_config_file) { cfg->num_rb_dl=fp->N_RB_DL; cfg->tx_num_channels=ru->nb_tx; cfg->rx_num_channels=ru->nb_rx; - + cfg->clock_source=clock_source; + for (i=0; i<ru->nb_tx; i++) { cfg->tx_freq[i] = (double)fp->dl_CarrierFreq; diff --git a/targets/RT/USER/lte-softmodem.c b/targets/RT/USER/lte-softmodem.c index 7ff57fee3e4572ecf899aa1596f658760ad2b43f..e84f99e67f4126d2a6ee8b0efe49099a12022a34 100644 --- a/targets/RT/USER/lte-softmodem.c +++ b/targets/RT/USER/lte-softmodem.c @@ -130,7 +130,7 @@ volatile int start_UE = 0; #endif volatile int oai_exit = 0; -static clock_source_t clock_source = internal; +clock_source_t clock_source = internal; static int wait_for_sync = 0; unsigned int mmapped_dma=0; @@ -942,7 +942,7 @@ int main( int argc, char **argv ) printf("Reading in command-line options\n"); - get_options (); + get_options (); if (CONFIG_ISFLAGSET(CONFIG_ABORT) ) { fprintf(stderr,"Getting configuration failed\n"); exit(-1); @@ -1131,13 +1131,6 @@ int main( int argc, char **argv ) rt_sleep_ns(10*100000000ULL); - if (nfapi_mode) { - - printf("NFAPI*** - mutex and cond created - will block shortly for completion of PNF connection\n"); - pthread_cond_init(&sync_cond,NULL); - pthread_mutex_init(&sync_mutex, NULL); - } - if (nfapi_mode) { printf("NFAPI*** - mutex and cond created - will block shortly for completion of PNF connection\n"); diff --git a/targets/RT/USER/lte-softmodem.h b/targets/RT/USER/lte-softmodem.h index 5590e3a93196c273014e630004a66e4798e8ab12..2f8209f2d311ab5214952e670f4d6c4c19335b51 100644 --- a/targets/RT/USER/lte-softmodem.h +++ b/targets/RT/USER/lte-softmodem.h @@ -65,7 +65,7 @@ #define CONFIG_HLP_UELOOP "get softmodem (UE) to loop through memory instead of acquiring from HW\n" #define CONFIG_HLP_PHYTST "test UE phy layer, mac disabled\n" #define CONFIG_HLP_DMAMAP "sets flag for improved EXMIMO UE performance\n" -#define CONFIG_HLP_EXCCLK "tells hardware to use an external clock reference\n" +#define CONFIG_HLP_CLK "tells hardware to use a clock reference (0:internal, 1:external, 2:gpsdo)\n" #define CONFIG_HLP_USIM "use XOR autentication algo in case of test usim mode\n" #define CONFIG_HLP_NOSNGLT "Disables single-thread mode in lte-softmodem\n" #define CONFIG_HLP_TADV "Set timing_advance\n" @@ -161,7 +161,7 @@ {"phy-test", CONFIG_HLP_PHYTST, PARAMFLAG_BOOL, iptr:&phy_test, defintval:0, TYPE_INT, 0}, \ {"usim-test", CONFIG_HLP_USIM, PARAMFLAG_BOOL, u8ptr:&usim_test, defintval:0, TYPE_UINT8, 0}, \ {"mmapped-dma", CONFIG_HLP_DMAMAP, PARAMFLAG_BOOL, uptr:&mmapped_dma, defintval:0, TYPE_INT, 0}, \ -{"external-clock", CONFIG_HLP_EXCCLK, PARAMFLAG_BOOL, uptr:&clock_source, defintval:0, TYPE_INT, 0}, \ +{"clock", CONFIG_HLP_CLK, 0, uptr:&clock_source, defintval:0, TYPE_UINT, 0}, \ {"wait-for-sync", NULL, PARAMFLAG_BOOL, iptr:&wait_for_sync, defintval:0, TYPE_INT, 0}, \ {"single-thread-enable", CONFIG_HLP_NOSNGLT, PARAMFLAG_BOOL, iptr:&single_thread_flag, defintval:0, TYPE_INT, 0}, \ {"threadIQ", NULL, 0, iptr:&(threads.iq), defintval:1, TYPE_INT, 0}, \ diff --git a/targets/RT/USER/lte-uesoftmodem.c b/targets/RT/USER/lte-uesoftmodem.c index 03283beb985f1afe7111c99822a843f537c51ce3..a2a12f9dd9f301a43c0f6a9767db995bc5d2f8a6 100644 --- a/targets/RT/USER/lte-uesoftmodem.c +++ b/targets/RT/USER/lte-uesoftmodem.c @@ -136,7 +136,7 @@ volatile int start_UE = 0; #endif volatile int oai_exit = 0; -static clock_source_t clock_source = internal; +clock_source_t clock_source = internal; static int wait_for_sync = 0; unsigned int mmapped_dma=0;