Commit 351ca5e7 authored by Cedric Roux's avatar Cedric Roux

Merge remote-tracking branch 'origin/basic-simulator' into develop_integration_2018_w19

Conflicts:
	openair1/PHY/LTE_TRANSPORT/prach.c
	targets/RT/USER/lte-ue.c
parents 7da4367c 727b368d
...@@ -243,6 +243,7 @@ add_boolean_option(UE_TIMING_TRACE False "Activate UE timing trace") ...@@ -243,6 +243,7 @@ add_boolean_option(UE_TIMING_TRACE False "Activate UE timing trace")
add_boolean_option(DISABLE_LOG_X False "Deactivate all LOG_* macros") add_boolean_option(DISABLE_LOG_X False "Deactivate all LOG_* macros")
add_boolean_option(USRP_REC_PLAY False "Enable USRP record playback mode") add_boolean_option(USRP_REC_PLAY False "Enable USRP record playback mode")
add_boolean_option(UE_NAS_USE_TUN False "Enable UE NAS TUN device instead of ue_ip.ko") add_boolean_option(UE_NAS_USE_TUN False "Enable UE NAS TUN device instead of ue_ip.ko")
add_boolean_option(BASIC_SIMULATOR False "Has to be True when building the basic simulator, False otherwise")
add_boolean_option(DEBUG_CONSOLE False "makes debugging easier, disables stdout/stderr buffering") add_boolean_option(DEBUG_CONSOLE False "makes debugging easier, disables stdout/stderr buffering")
...@@ -563,14 +564,26 @@ add_library(oai_mobipass MODULE ${TPLIB_MOBIPASS_SOURCE} ) ...@@ -563,14 +564,26 @@ add_library(oai_mobipass MODULE ${TPLIB_MOBIPASS_SOURCE} )
get_target_property(mobipas_cflags oai_mobipass COMPILE_FLAGS) get_target_property(mobipas_cflags oai_mobipass COMPILE_FLAGS)
set_target_properties(oai_mobipass PROPERTIES COMPILE_FLAGS "${mobipass_cflags} -fvisibility=hidden") set_target_properties(oai_mobipass PROPERTIES COMPILE_FLAGS "${mobipass_cflags} -fvisibility=hidden")
# TCP bridge libraries
######################################################################
# this one is for internal use at Eurecom and is not documented
set(HWLIB_TCP_BRIDGE_SOURCE set(HWLIB_TCP_BRIDGE_SOURCE
${OPENAIR_TARGETS}/ARCH/tcp_bridge/tcp_bridge.c ${OPENAIR_TARGETS}/ARCH/tcp_bridge/tcp_bridge.c
) )
add_library(oai_tcp_bridge MODULE ${HWLIB_TCP_BRIDGE_SOURCE} ) add_library(tcp_bridge MODULE ${HWLIB_TCP_BRIDGE_SOURCE} )
#get_target_property(tcp_bridge_cflags oai_tcp_bridge COMPILE_FLAGS) #get_target_property(tcp_bridge_cflags tcp_bridge COMPILE_FLAGS)
#set_target_properties(oai_tcp_bridge PROPERTIES COMPILE_FLAGS "${tcp_bridge_cflags} -fvisibility=hidden") #set_target_properties(tcp_bridge PROPERTIES COMPILE_FLAGS "${tcp_bridge_cflags} -fvisibility=hidden")
set_target_properties(oai_tcp_bridge PROPERTIES COMPILE_FLAGS "-fvisibility=hidden") set_target_properties(tcp_bridge PROPERTIES COMPILE_FLAGS "-fvisibility=hidden")
# this one is to connect OAI eNB and OAI UE in the basic simulator
# see targets/ARCH/tcp_bridge/README.tcp_bridge_oai for usage
set(HWLIB_TCP_BRIDGE_OAI_SOURCE
${OPENAIR_TARGETS}/ARCH/tcp_bridge/tcp_bridge_oai.c
)
add_library(tcp_bridge_oai MODULE ${HWLIB_TCP_BRIDGE_OAI_SOURCE} )
set_target_properties(tcp_bridge_oai PROPERTIES COMPILE_FLAGS "-fvisibility=hidden")
########################################################## ##########################################################
......
...@@ -68,6 +68,7 @@ DISABLE_LOG_X="False" ...@@ -68,6 +68,7 @@ DISABLE_LOG_X="False"
USRP_REC_PLAY="False" USRP_REC_PLAY="False"
BUILD_ECLIPSE=0 BUILD_ECLIPSE=0
UE_NAS_USE_TUN="False" UE_NAS_USE_TUN="False"
BASIC_SIMULATOR=0
trap handle_ctrl_c INT trap handle_ctrl_c INT
function print_help() { function print_help() {
...@@ -159,6 +160,9 @@ Options ...@@ -159,6 +160,9 @@ Options
Build for I/Q record-playback modes Build for I/Q record-playback modes
--ue-nas-use-tun --ue-nas-use-tun
Use TUN devices for the UEs instead of ue_ip.ko Use TUN devices for the UEs instead of ue_ip.ko
--basic-simulator
Generates a basic [1 UE + 1 eNB + no channel] simulator.
See targets/ARCH/tcp_bridge/README.tcp_bridge_oai for documentation.
Usage (first build): Usage (first build):
oaisim (eNB + UE): ./build_oai -I --oaisim -x --install-system-files oaisim (eNB + UE): ./build_oai -I --oaisim -x --install-system-files
Eurecom EXMIMO + COTS UE : ./build_oai -I --eNB -x --install-system-files Eurecom EXMIMO + COTS UE : ./build_oai -I --eNB -x --install-system-files
...@@ -354,6 +358,10 @@ function main() { ...@@ -354,6 +358,10 @@ function main() {
UE_NAS_USE_TUN="True" UE_NAS_USE_TUN="True"
echo_info "Enabling UE NAS TUN device usage instead of ue_ip.ko" echo_info "Enabling UE NAS TUN device usage instead of ue_ip.ko"
shift 1;; shift 1;;
--basic-simulator)
BASIC_SIMULATOR=1
echo_info "Compiling the basic simulator"
shift 1;;
-h | --help) -h | --help)
print_help print_help
exit 1;; exit 1;;
...@@ -919,6 +927,96 @@ fi ...@@ -919,6 +927,96 @@ fi
else else
echo_info "10. Bypassing the Tests ..." echo_info "10. Bypassing the Tests ..."
fi fi
# basic simulator
#####################
if [ "$BASIC_SIMULATOR" = "1" ]; then
echo_info "Build basic simulator"
[ "$CLEAN" = "1" ] && rm -rf $OPENAIR_DIR/cmake_targets/basic_simulator
mkdir -p $OPENAIR_DIR/cmake_targets/basic_simulator
mkdir -p $OPENAIR_DIR/cmake_targets/basic_simulator/enb
mkdir -p $OPENAIR_DIR/cmake_targets/basic_simulator/ue
# enb
cmake_file=$OPENAIR_DIR/cmake_targets/basic_simulator/enb/CMakeLists.txt
echo "cmake_minimum_required(VERSION 2.8)" > $cmake_file
echo "set ( CMAKE_BUILD_TYPE $CMAKE_BUILD_TYPE )" >> $cmake_file
echo "set ( CFLAGS_PROCESSOR_USER \"$CFLAGS_PROCESSOR_USER\" )" >> $cmake_file
echo "set ( RRC_ASN1_VERSION \"${REL}\")" >> $cmake_file
echo "set ( ENABLE_VCD_FIFO $VCD_TIMING )" >> $cmake_file
echo "set ( XFORMS $XFORMS )" >> $cmake_file
echo "set ( RF_BOARD \"OAI_USRP\")" >> $cmake_file
echo "set ( TRANSP_PRO \"None\")" >> $cmake_file
echo "set(PACKAGE_NAME \"simulator_enb\")" >> $cmake_file
echo "set (DEADLINE_SCHEDULER \"False\" )" >> $cmake_file
echo "set (CPU_AFFINITY \"False\" )" >> $cmake_file
echo "set ( T_TRACER \"True\" )" >> $cmake_file
echo "set (UE_AUTOTEST_TRACE $UE_AUTOTEST_TRACE)" >> $cmake_file
echo "set (UE_DEBUG_TRACE $UE_DEBUG_TRACE)" >> $cmake_file
echo "set (UE_TIMING_TRACE $UE_TIMING_TRACE)" >> $cmake_file
echo "set (DISABLE_LOG_X $DISABLE_LOG_X)" >> $cmake_file
echo "set (USRP_REC_PLAY $USRP_REC_PLAY)" >> $cmake_file
echo "set (BASIC_SIMULATOR \"True\" )" >> $cmake_file
echo 'include(${CMAKE_CURRENT_SOURCE_DIR}/../../CMakeLists.txt)' >> $cmake_file
echo_info "Build eNB"
echo_info "logs are in $dlog/basic_simulator_enb.txt"
{
cd $OPENAIR_DIR/cmake_targets/basic_simulator/enb
cmake .
make -j`nproc` coding params_libconfig tcp_bridge_oai lte-softmodem
ln -sf libtcp_bridge_oai.so liboai_device.so
cd ../..
} > $dlog/basic_simulator_enb.txt 2>&1
check_warnings "$dlog/basic_simulator_enb.txt"
# ue
echo_info "Compile conf2uedata"
compilations \
nas_sim_tools conf2uedata \
conf2uedata $dbin/conf2uedata
cmake_file=$OPENAIR_DIR/cmake_targets/basic_simulator/ue/CMakeLists.txt
echo "cmake_minimum_required(VERSION 2.8)" > $cmake_file
echo "set ( CMAKE_BUILD_TYPE $CMAKE_BUILD_TYPE )" >> $cmake_file
echo "set ( CFLAGS_PROCESSOR_USER \"$CFLAGS_PROCESSOR_USER\" )" >> $cmake_file
echo "set ( RRC_ASN1_VERSION \"${REL}\")" >> $cmake_file
echo "set ( ENABLE_VCD_FIFO $VCD_TIMING )" >> $cmake_file
echo "set ( XFORMS $XFORMS )" >> $cmake_file
echo "set ( RF_BOARD \"OAI_USRP\")" >> $cmake_file
echo "set ( TRANSP_PRO \"None\")" >> $cmake_file
echo "set(PACKAGE_NAME \"simulator_ue\")" >> $cmake_file
echo "set (DEADLINE_SCHEDULER \"False\" )" >> $cmake_file
echo "set (CPU_AFFINITY \"False\" )" >> $cmake_file
echo "set ( T_TRACER \"False\" )" >> $cmake_file
echo "set (UE_AUTOTEST_TRACE $UE_AUTOTEST_TRACE)" >> $cmake_file
echo "set (UE_DEBUG_TRACE $UE_DEBUG_TRACE)" >> $cmake_file
echo "set (UE_TIMING_TRACE $UE_TIMING_TRACE)" >> $cmake_file
echo "set (DISABLE_LOG_X $DISABLE_LOG_X)" >> $cmake_file
echo "set (USRP_REC_PLAY $USRP_REC_PLAY)" >> $cmake_file
echo "set (LINUX True )" >> $cmake_file
echo "set (PDCP_USE_NETLINK True )" >> $cmake_file
echo "set (BASIC_SIMULATOR \"True\" )" >> $cmake_file
echo "set (UE_NAS_USE_TUN \"True\" )" >> $cmake_file
echo 'include(${CMAKE_CURRENT_SOURCE_DIR}/../../CMakeLists.txt)' >> $cmake_file
echo_info "Build UE"
echo_info "logs are in $dlog/basic_simulator_ue.txt"
{
cd $OPENAIR_DIR/cmake_targets/basic_simulator/ue
cmake .
make -j`nproc` coding params_libconfig tcp_bridge_oai lte-uesoftmodem
ln -sf libtcp_bridge_oai.so liboai_device.so
cd ../..
} > $dlog/basic_simulator_ue.txt 2>&1
check_warnings "$dlog/basic_simulator_ue.txt"
echo_info "Generate UE SIM data"
$OPENAIR_DIR/targets/bin/conf2uedata -c $OPENAIR_DIR/openair3/NAS/TOOLS/ue_eurecom_test_sfr.conf -o $OPENAIR_DIR/cmake_targets/basic_simulator/ue
fi
} }
main "$@" main "$@"
...@@ -110,6 +110,16 @@ typedef struct { ...@@ -110,6 +110,16 @@ typedef struct {
extern volatile int *T_freelist_head; extern volatile int *T_freelist_head;
extern T_cache_t *T_cache; extern T_cache_t *T_cache;
/* When running the basic simulator, we may fill the T cache too fast.
* Let's not crash if it's full, just wait.
*/
#if BASIC_SIMULATOR
# define T_BASIC_SIMULATOR_WAIT \
while (T_cache[T_LOCAL_slot].busy) usleep(100)
#else
# define T_BASIC_SIMULATOR_WAIT /* */
#endif
/* used at header of Tn, allocates buffer */ /* used at header of Tn, allocates buffer */
#define T_LOCAL_DATA \ #define T_LOCAL_DATA \
char *T_LOCAL_buf; \ char *T_LOCAL_buf; \
...@@ -118,6 +128,7 @@ extern T_cache_t *T_cache; ...@@ -118,6 +128,7 @@ extern T_cache_t *T_cache;
T_LOCAL_slot = __sync_fetch_and_add(T_freelist_head, 1) \ T_LOCAL_slot = __sync_fetch_and_add(T_freelist_head, 1) \
& (T_CACHE_SIZE - 1); \ & (T_CACHE_SIZE - 1); \
(void)__sync_fetch_and_and(T_freelist_head, 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) { \ if (T_cache[T_LOCAL_slot].busy) { \
printf("%s:%d:%s: T cache is full - consider increasing its size\n", \ printf("%s:%d:%s: T cache is full - consider increasing its size\n", \
__FILE__, __LINE__, __FUNCTION__); \ __FILE__, __LINE__, __FUNCTION__); \
......
...@@ -8,10 +8,20 @@ ...@@ -8,10 +8,20 @@
#define T_MAX_ARGS 16 #define T_MAX_ARGS 16
/* maximum size of a message - increase if needed */ /* maximum size of a message - increase if needed */
#define T_BUFFER_MAX (1024*64) #if BASIC_SIMULATOR
/* let's have 100 RBs functional for the basic simulator */
# define T_BUFFER_MAX (1024*64*2)
#else
# define T_BUFFER_MAX (1024*64)
#endif
/* size of the local cache for messages (must be pow(2,something)) */ /* size of the local cache for messages (must be pow(2,something)) */
#define T_CACHE_SIZE (8192 * 2) #if BASIC_SIMULATOR
/* we don't need much space for the basic simulator */
# define T_CACHE_SIZE 1024
#else
# define T_CACHE_SIZE (8192 * 2)
#endif
/* maximum number of bytes a message can contain */ /* maximum number of bytes a message can contain */
#ifdef T_SEND_TIME #ifdef T_SEND_TIME
......
...@@ -300,6 +300,20 @@ static void forward(void *_forwarder, char *buf, int size) ...@@ -300,6 +300,20 @@ static void forward(void *_forwarder, char *buf, int size)
if (f->tail != NULL) f->tail->next = new; if (f->tail != NULL) f->tail->next = new;
f->tail = new; f->tail = new;
#if BASIC_SIMULATOR
/* When runnng the basic simulator, the tracer may be too slow.
* Let's not take too much memory in the tracee and
* wait if there is too much data to send. 200MB is
* arbitrary.
*/
while (f->memusage > 200 * 1024 * 1024) {
if (pthread_cond_signal(&f->cond)) abort();
if (pthread_mutex_unlock(&f->lock)) abort();
usleep(1000);
if (pthread_mutex_lock(&f->lock)) abort();
}
#endif /* BASIC_SIMULATOR */
f->memusage += size+4; f->memusage += size+4;
/* warn every 100MB */ /* warn every 100MB */
if (f->memusage > f->last_warning_memusage && if (f->memusage > f->last_warning_memusage &&
......
...@@ -12,7 +12,6 @@ ...@@ -12,7 +12,6 @@
#include "gui/gui.h" #include "gui/gui.h"
#include "filter/filter.h" #include "filter/filter.h"
#include "utils.h" #include "utils.h"
#include "../T_defs.h"
#include "event_selector.h" #include "event_selector.h"
#include "openair_logo.h" #include "openair_logo.h"
#include "config.h" #include "config.h"
...@@ -875,6 +874,8 @@ int main(int n, char **v) ...@@ -875,6 +874,8 @@ int main(int n, char **v)
if (pthread_mutex_init(&enb_data.lock, NULL)) abort(); if (pthread_mutex_init(&enb_data.lock, NULL)) abort();
setup_event_selector(g, database, is_on, is_on_changed, &enb_data); setup_event_selector(g, database, is_on, is_on_changed, &enb_data);
OBUF ebuf = { osize: 0, omaxsize: 0, obuf: NULL };
restart: restart:
clear_remote_config(); clear_remote_config();
enb_data.socket = connect_to(ip, port); enb_data.socket = connect_to(ip, port);
...@@ -884,9 +885,8 @@ restart: ...@@ -884,9 +885,8 @@ restart:
/* read messages */ /* read messages */
while (1) { while (1) {
char v[T_BUFFER_MAX];
event e; event e;
e = get_event(enb_data.socket, v, database); e = get_event(enb_data.socket, &ebuf, database);
if (e.type == -1) goto restart; if (e.type == -1) goto restart;
if (pthread_mutex_lock(&enb_data.lock)) abort(); if (pthread_mutex_lock(&enb_data.lock)) abort();
handle_event(h, e); handle_event(h, e);
......
...@@ -6,7 +6,7 @@ ...@@ -6,7 +6,7 @@
#include <stdlib.h> #include <stdlib.h>
#include <string.h> #include <string.h>
event get_event(int socket, char *event_buffer, void *database) event get_event(int socket, OBUF *event_buffer, void *database)
{ {
#ifdef T_SEND_TIME #ifdef T_SEND_TIME
struct timespec t; struct timespec t;
...@@ -29,17 +29,23 @@ again: ...@@ -29,17 +29,23 @@ again:
#endif #endif
if (fullread(socket, &type, sizeof(int)) == -1) goto read_error; if (fullread(socket, &type, sizeof(int)) == -1) goto read_error;
length -= sizeof(int); length -= sizeof(int);
if (fullread(socket, event_buffer, length) == -1) goto read_error; if (event_buffer->omaxsize < length) {
event_buffer->omaxsize = (length + 65535) & ~65535;
event_buffer->obuf = realloc(event_buffer->obuf, event_buffer->omaxsize);
if (event_buffer->obuf == NULL) { printf("out of memory\n"); exit(1); }
}
if (fullread(socket, event_buffer->obuf, length) == -1) goto read_error;
event_buffer->osize = length;
if (type == -1) append_received_config_chunk(event_buffer, length); if (type == -1) append_received_config_chunk(event_buffer->obuf, length);
if (type == -2) verify_config(); if (type == -2) verify_config();
if (type == -1 || type == -2) goto again; if (type == -1 || type == -2) goto again;
#ifdef T_SEND_TIME #ifdef T_SEND_TIME
return new_event(t, type, length, event_buffer, database); return new_event(t, type, length, event_buffer->obuf, database);
#else #else
return new_event(type, length, event_buffer, database); return new_event(type, length, event_buffer->obuf, database);
#endif #endif
read_error: read_error:
......
#ifndef _EVENT_H_ #ifndef _EVENT_H_
#define _EVENT_H_ #define _EVENT_H_
#include "utils.h"
#include "../T_defs.h" #include "../T_defs.h"
#ifdef T_SEND_TIME #ifdef T_SEND_TIME
#include <time.h> #include <time.h>
...@@ -37,7 +38,7 @@ typedef struct { ...@@ -37,7 +38,7 @@ typedef struct {
int ecount; int ecount;
} event; } event;
event get_event(int s, char *v, void *d); event get_event(int s, OBUF *v, void *d);
#ifdef T_SEND_TIME #ifdef T_SEND_TIME
event new_event(struct timespec sending_time, int type, event new_event(struct timespec sending_time, int type,
......
...@@ -99,10 +99,11 @@ int main(int n, char **v) ...@@ -99,10 +99,11 @@ int main(int n, char **v)
found = 0; found = 0;
OBUF ebuf = { osize: 0, omaxsize: 0, obuf: NULL };
while (1) { while (1) {
char v[T_BUFFER_MAX];
event e; event e;
e = get_event(fd, v, database); e = get_event(fd, &ebuf, database);
if (e.type == -1) break; if (e.type == -1) break;
if (e.type != input_event_id) continue; if (e.type != input_event_id) continue;
for (i = 0; i < filter_count; i++) for (i = 0; i < filter_count; i++)
......
#include <stdio.h> #include <stdio.h>
#include <stdlib.h> #include <stdlib.h>
#include <string.h> #include <string.h>
#include "utils.h"
#include "../T_defs.h" #include "../T_defs.h"
void usage(void) void usage(void)
...@@ -35,14 +36,22 @@ int main(int n, char **v) ...@@ -35,14 +36,22 @@ int main(int n, char **v)
in = fopen(input_filename, "r"); in = fopen(input_filename, "r");
if (in == NULL) { perror(input_filename); abort(); } if (in == NULL) { perror(input_filename); abort(); }
OBUF ebuf = { osize: 0, omaxsize: 0, obuf: NULL };
while (1) { while (1) {
int type; int type;
int32_t length; int32_t length;
char v[T_BUFFER_MAX]; char *v;
int vpos = 0; int vpos = 0;
/* read event from file */ /* read event from file */
if (fread(&length, 4, 1, in) != 1) break; if (fread(&length, 4, 1, in) != 1) break;
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); memcpy(v+vpos, &length, 4);
vpos += 4; vpos += 4;
#ifdef T_SEND_TIME #ifdef T_SEND_TIME
......
...@@ -104,11 +104,12 @@ err: ...@@ -104,11 +104,12 @@ err:
fd = open(file, O_RDONLY); fd = open(file, O_RDONLY);
if (fd == -1) { perror(file); exit(1); } if (fd == -1) { perror(file); exit(1); }
OBUF ebuf = { osize: 0, omaxsize: 0, obuf: NULL };
/* get wanted frame/subframe */ /* get wanted frame/subframe */
while (1) { while (1) {
char v[T_BUFFER_MAX];
event e; event e;
e = get_event(fd, v, database); e = get_event(fd, &ebuf, database);
if (e.type == -1) break; if (e.type == -1) break;
if (e.type != input_event_id) continue; if (e.type != input_event_id) continue;
if (verbose) if (verbose)
......
...@@ -100,10 +100,12 @@ err: ...@@ -100,10 +100,12 @@ err:
int last_frame = -1; int last_frame = -1;
int last_subframe = -1; int last_subframe = -1;
int subframe_written = 0; int subframe_written = 0;
OBUF ebuf = { osize: 0, omaxsize: 0, obuf: NULL };
while (1) { while (1) {
char v[T_BUFFER_MAX];
event e; event e;
e = get_event(fd, v, database); e = get_event(fd, &ebuf, database);
if (e.type == -1) break; if (e.type == -1) break;
if (e.type != output_event_id) continue; if (e.type != output_event_id) continue;
if (verbose) if (verbose)
......
...@@ -73,17 +73,22 @@ int main(int n, char **v) ...@@ -73,17 +73,22 @@ int main(int n, char **v)
socket_send(socket, is_on, number_of_events * sizeof(int)) == -1) socket_send(socket, is_on, number_of_events * sizeof(int)) == -1)
abort(); abort();
OBUF ebuf = { osize: 0, omaxsize: 0, obuf: NULL };
char dump[10][T_BUFFER_MAX]; char dump[10][T_BUFFER_MAX];
event dump_ev[10]; event dump_ev[10];
FILE *z = fopen("/tmp/dd", "w"); if (z == NULL) abort(); FILE *z = fopen("/tmp/dd", "w"); if (z == NULL) abort();
while (1) { while (1) {
char v[T_BUFFER_MAX]; char *v;
event e; event e;
e = get_event(socket, v, database); e = get_event(socket, &ebuf, database);
v = ebuf.obuf;
if (e.type == -1) break; if (e.type == -1) break;
if (e.type == ev_input) { if (e.type == ev_input) {
int sf = e.e[2].i; int sf = e.e[2].i;
memcpy(dump[sf], v, T_BUFFER_MAX); if (ebuf.osize > T_BUFFER_MAX)
{ printf("event size too big\n"); exit(1); }
memcpy(dump[sf], ebuf.obuf, ebuf.osize);
dump_ev[sf] = e; dump_ev[sf] = e;
printf("input %d/%d\n", e.e[1].i, sf); printf("input %d/%d\n", e.e[1].i, sf);
if (fwrite(dump_ev[sf].e[4].b, dump_ev[sf].e[4].bsize, 1, z) != 1) abort(); if (fwrite(dump_ev[sf].e[4].b, dump_ev[sf].e[4].bsize, 1, z) != 1) abort();
......
...@@ -84,11 +84,12 @@ int main(int n, char **v) ...@@ -84,11 +84,12 @@ int main(int n, char **v)
socket_send(socket, is_on, number_of_events * sizeof(int)) == -1) socket_send(socket, is_on, number_of_events * sizeof(int)) == -1)
abort(); abort();
OBUF ebuf = { osize: 0, omaxsize: 0, obuf: NULL };
while (1) { while (1) {
char v[T_BUFFER_MAX];
event e; event e;
int on_off; int on_off;
e = get_event(socket, v, database); e = get_event(socket, &ebuf, database);
if (e.type == -1) break; if (e.type == -1) break;
if (e.type != ev_fun) if (e.type != ev_fun)
{ printf("unhandled event %d\n", e.type); continue; } { printf("unhandled event %d\n", e.type); continue; }
......
...@@ -246,11 +246,12 @@ int main(int n, char **v) ...@@ -246,11 +246,12 @@ int main(int n, char **v)
new_thread(receiver, &d); new_thread(receiver, &d);
OBUF ebuf = { osize: 0, omaxsize: 0, obuf: NULL };
/* read messages */ /* read messages */
while (1) { while (1) {
char v[T_BUFFER_MAX];
event e; event e;
e = get_event(in, v, database); e = get_event(in, &ebuf, database);
if (e.type == -1) break; if (e.type == -1) break;
if (!(e.type == ul_id || e.type == dl_id)) continue; if (!(e.type == ul_id || e.type == dl_id)) continue;
handle_event(h, e); handle_event(h, e);
......
...@@ -123,14 +123,22 @@ int main(int n, char **v) ...@@ -123,14 +123,22 @@ int main(int n, char **v)
if (signal(SIGINT, force_stop) == SIG_ERR) abort(); if (signal(SIGINT, force_stop) == SIG_ERR) abort();
if (signal(SIGTSTP, force_stop) == SIG_ERR) abort(); if (signal(SIGTSTP, force_stop) == SIG_ERR) abort();
OBUF ebuf = { osize: 0, omaxsize: 0, obuf: NULL };
/* read messages */ /* read messages */
while (run) { while (run) {
int type; int type;
int32_t length; int32_t length;
char v[T_BUFFER_MAX]; char *v;
int vpos = 0; int vpos = 0;
if (fullread(socket, &length, 4) == -1) goto read_error; if (fullread(socket, &length, 4) == -1) goto read_error;
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); memcpy(v+vpos, &length, 4);
vpos += 4; vpos += 4;
#ifdef T_SEND_TIME #ifdef T_SEND_TIME
......
...@@ -136,14 +136,22 @@ int main(int n, char **v) ...@@ -136,14 +136,22 @@ int main(int n, char **v)
new_thread(get_message_thread, &socket); new_thread(get_message_thread, &socket);
OBUF ebuf = { osize: 0, omaxsize: 0, obuf: NULL };
while (1) { while (1) {
int type; int type;
int32_t length; int32_t length;
char v[T_BUFFER_MAX]; char *v;
int vpos = 0; int vpos = 0;
/* read event from file */ /* read event from file */
if (fread(&length, 4, 1, in) != 1) break; if (fread(&length, 4, 1, in) != 1) break;
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); memcpy(v+vpos, &length, 4);
vpos += 4; vpos += 4;
#ifdef T_SEND_TIME #ifdef T_SEND_TIME
......
...@@ -10,7 +10,6 @@ ...@@ -10,7 +10,6 @@
#include "view/view.h" #include "view/view.h"
#include "gui/gui.h" #include "gui/gui.h"
#include "utils.h" #include "utils.h"
#include "../T_defs.h"
#include "event_selector.h" #include "event_selector.h"
#include "config.h" #include "config.h"
...@@ -182,11 +181,12 @@ int main(int n, char **v) ...@@ -182,11 +181,12 @@ int main(int n, char **v)
/* send the first message - activate selected traces */ /* send the first message - activate selected traces */
is_on_changed(&textlog_data); is_on_changed(&textlog_data);
OBUF ebuf = { osize: 0, omaxsize: 0, obuf: NULL };
/* read messages */ /* read messages */
while (1) { while (1) {
char v[T_BUFFER_MAX];
event e; event e;
e = get_event(textlog_data.socket, v, database); e = get_event(textlog_data.socket, &ebuf, database);
if (e.type == -1) abort(); if (e.type == -1) abort();
handle_event(h, e); handle_event(h, e);
} }
......
...@@ -287,11 +287,12 @@ int main(int n, char **v) ...@@ -287,11 +287,12 @@ int main(int n, char **v)
if (signal(SIGINT, force_stop) == SIG_ERR) abort(); if (signal(SIGINT, force_stop) == SIG_ERR) abort();
if (signal(SIGTSTP, force_stop) == SIG_ERR) abort(); if (signal(SIGTSTP, force_stop) == SIG_ERR) abort();
OBUF ebuf = { osize: 0, omaxsize: 0, obuf: NULL };
/* read messages */ /* read messages */
while (run) { while (run) {
char v[T_BUFFER_MAX];
event e; event e;
e = get_event(socket, v, database); e = get_event(socket, &ebuf, database);
if (e.type == -1) { printf("disconnected? let's quit gently\n"); break; } if (e.type == -1) { printf("disconnected? let's quit gently\n"); break; }
handle_event(h, e); handle_event(h, e);
} }
......
...@@ -12,7 +12,6 @@ ...@@ -12,7 +12,6 @@
#include "gui/gui.h" #include "gui/gui.h"
#include "filter/filter.h" #include "filter/filter.h"
#include "utils.h" #include "utils.h"
#include "../T_defs.h"
#include "event_selector.h" #include "event_selector.h"
#include "openair_logo.h" #include "openair_logo.h"
#include "config.h" #include "config.h"
...@@ -854,6 +853,8 @@ int main(int n, char **v) ...@@ -854,6 +853,8 @@ int main(int n, char **v)
if (pthread_mutex_init(&ue_data.lock, NULL)) abort(); if (pthread_mutex_init(&ue_data.lock, NULL)) abort();
setup_event_selector(g, database, is_on, is_on_changed, &ue_data); setup_event_selector(g, database, is_on, is_on_changed, &ue_data);
OBUF ebuf = { osize: 0, omaxsize: 0, obuf: NULL };
restart: restart:
clear_remote_config(); clear_remote_config();
ue_data.socket = connect_to(ip, port); ue_data.socket = connect_to(ip, port);
...@@ -863,9 +864,8 @@ restart: ...@@ -863,9 +864,8 @@ restart:
/* read messages */ /* read messages */
while (1) { while (1) {
char v[T_BUFFER_MAX];
event e; event e;
e = get_event(ue_data.socket, v, database); e = get_event(ue_data.socket, &ebuf, database);
if (e.type == -1) goto restart; if (e.type == -1) goto restart;
if (pthread_mutex_lock(&ue_data.lock)) abort(); if (pthread_mutex_lock(&ue_data.lock)) abort();
handle_event(h, e); handle_event(h, e);
......
...@@ -10,7 +10,6 @@ ...@@ -10,7 +10,6 @@
#include "view/view.h" #include "view/view.h"
#include "gui/gui.h" #include "gui/gui.h"
#include "utils.h" #include "utils.h"
#include "../T_defs.h"
#include "event_selector.h" #include "event_selector.h"
#include "config.h" #include "config.h"
...@@ -188,11 +187,12 @@ int main(int n, char **v) ...@@ -188,11 +187,12 @@ int main(int n, char **v)
/* send the first message - activate selected traces */ /* send the first message - activate selected traces */
is_on_changed(&vcd_data); is_on_changed(&vcd_data);
OBUF ebuf = { osize: 0, omaxsize: 0, obuf: NULL };
/* read messages */ /* read messages */
while (1) { while (1) {
char v[T_BUFFER_MAX];
event e; event e;
e = get_event(vcd_data.socket, v, database); e = get_event(vcd_data.socket, &ebuf, database);
if (e.type == -1) abort(); if (e.type == -1) abort();
handle_event(h, e); handle_event(h, e);
} }
......
...@@ -858,6 +858,9 @@ int init_lte_ue_signal(PHY_VARS_UE *ue, ...@@ -858,6 +858,9 @@ int init_lte_ue_signal(PHY_VARS_UE *ue,
(*pdcch_vars_th)[th_id][eNB_id]->rho = (int32_t**)malloc16( fp->nb_antennas_rx*sizeof(int32_t*) ); (*pdcch_vars_th)[th_id][eNB_id]->rho = (int32_t**)malloc16( fp->nb_antennas_rx*sizeof(int32_t*) );
(*pdcch_vars_th)[th_id][eNB_id]->rxdataF_ext = (int32_t**)malloc16_clear( 8*sizeof(int32_t*) ); (*pdcch_vars_th)[th_id][eNB_id]->rxdataF_ext = (int32_t**)malloc16_clear( 8*sizeof(int32_t*) );
(*pdcch_vars_th)[th_id][eNB_id]->dl_ch_estimates_ext = (int32_t**)malloc16_clear( 8*sizeof(int32_t*) ); (*pdcch_vars_th)[th_id][eNB_id]->dl_ch_estimates_ext = (int32_t**)malloc16_clear( 8*sizeof(int32_t*) );
(*pdcch_vars_th)[th_id][eNB_id]->dciFormat = 0;
(*pdcch_vars_th)[th_id][eNB_id]->agregationLevel = 0xFF;
} }
for (i=0; i<fp->nb_antennas_rx; i++) { for (i=0; i<fp->nb_antennas_rx; i++) {
......
...@@ -85,6 +85,11 @@ void lte_adjust_synch(LTE_DL_FRAME_PARMS *frame_parms, ...@@ -85,6 +85,11 @@ void lte_adjust_synch(LTE_DL_FRAME_PARMS *frame_parms,
{ {
diff = max_pos_fil - (frame_parms->nb_prefix_samples>>3); diff = max_pos_fil - (frame_parms->nb_prefix_samples>>3);
#if BASIC_SIMULATOR
/* a hack without which the UE does not connect (to be fixed somehow) */
diff = 0;
#endif
if ( abs(diff) < SYNCH_HYST ) if ( abs(diff) < SYNCH_HYST )
ue->rx_offset = 0; ue->rx_offset = 0;
else else
......
...@@ -75,6 +75,11 @@ int generate_pss(int32_t **txdataF, ...@@ -75,6 +75,11 @@ int generate_pss(int32_t **txdataF,
a = (frame_parms->nb_antenna_ports_eNB == 1) ? amp: (amp*ONE_OVER_SQRT2_Q15)>>15; a = (frame_parms->nb_antenna_ports_eNB == 1) ? amp: (amp*ONE_OVER_SQRT2_Q15)>>15;
//printf("[PSS] amp=%d, a=%d\n",amp,a); //printf("[PSS] amp=%d, a=%d\n",amp,a);
#if BASIC_SIMULATOR
/* a hack to remove at some point (the UE doesn't synch with 100 RBs) */
a = (frame_parms->nb_antenna_ports_eNB == 1) ? 4*amp: (amp*ONE_OVER_SQRT2_Q15)>>15;
#endif
Nsymb = (frame_parms->Ncp==NORMAL)?14:12; Nsymb = (frame_parms->Ncp==NORMAL)?14:12;
for (aa=0; aa<frame_parms->nb_antenna_ports_eNB; aa++) { for (aa=0; aa<frame_parms->nb_antenna_ports_eNB; aa++) {
......
...@@ -486,19 +486,19 @@ int32_t generate_prach( PHY_VARS_UE *ue, uint8_t eNB_id, uint8_t subframe, uint1 ...@@ -486,19 +486,19 @@ int32_t generate_prach( PHY_VARS_UE *ue, uint8_t eNB_id, uint8_t subframe, uint1
AssertFatal(prach_fmt<4, AssertFatal(prach_fmt<4,
"prach_fmt4 not fully implemented" ); "prach_fmt4 not fully implemented" );
#if defined(EXMIMO) || defined(OAI_USRP) #if defined(EXMIMO) || defined(OAI_USRP) || defined(OAI_BLADERF) || defined(OAI_LMSSDR)
int j; int j;
int overflow = prach_start + prach_len - LTE_NUMBER_OF_SUBFRAMES_PER_FRAME*ue->frame_parms.samples_per_tti; int overflow = prach_start + prach_len - LTE_NUMBER_OF_SUBFRAMES_PER_FRAME*ue->frame_parms.samples_per_tti;
LOG_I( PHY, "prach_start=%d, overflow=%d\n", prach_start, overflow ); LOG_I( PHY, "prach_start=%d, overflow=%d\n", prach_start, overflow );
for (i=prach_start,j=0; i<min(ue->frame_parms.samples_per_tti*LTE_NUMBER_OF_SUBFRAMES_PER_FRAME,prach_start+prach_len); i++,j++) { for (i=prach_start,j=0; i<min(ue->frame_parms.samples_per_tti*LTE_NUMBER_OF_SUBFRAMES_PER_FRAME,prach_start+prach_len); i++,j++) {
((int16_t*)ue->common_vars.txdata[0])[2*i] = prach[2*j]<<4; ((int16_t*)ue->common_vars.txdata[0])[2*i] = prach[2*j];
((int16_t*)ue->common_vars.txdata[0])[2*i+1] = prach[2*j+1]<<4; ((int16_t*)ue->common_vars.txdata[0])[2*i+1] = prach[2*j+1];
} }
for (i=0; i<overflow; i++,j++) { for (i=0; i<overflow; i++,j++) {
((int16_t*)ue->common_vars.txdata[0])[2*i] = prach[2*j]<<4; ((int16_t*)ue->common_vars.txdata[0])[2*i] = prach[2*j];
((int16_t*)ue->common_vars.txdata[0])[2*i+1] = prach[2*j+1]<<4; ((int16_t*)ue->common_vars.txdata[0])[2*i+1] = prach[2*j+1];
} }
#if defined(EXMIMO) #if defined(EXMIMO)
// handle switch before 1st TX subframe, guarantee that the slot prior to transmission is switch on // handle switch before 1st TX subframe, guarantee that the slot prior to transmission is switch on
......
...@@ -1324,13 +1324,13 @@ void ulsch_common_procedures(PHY_VARS_UE *ue, UE_rxtx_proc_t *proc, uint8_t empt ...@@ -1324,13 +1324,13 @@ void ulsch_common_procedures(PHY_VARS_UE *ue, UE_rxtx_proc_t *proc, uint8_t empt
for (k=ulsch_start,l=0; k<cmin(frame_parms->samples_per_tti*LTE_NUMBER_OF_SUBFRAMES_PER_FRAME,ulsch_start+frame_parms->samples_per_tti); k++,l++) { for (k=ulsch_start,l=0; k<cmin(frame_parms->samples_per_tti*LTE_NUMBER_OF_SUBFRAMES_PER_FRAME,ulsch_start+frame_parms->samples_per_tti); k++,l++) {
((short*)ue->common_vars.txdata[aa])[2*k] = ((short*)dummy_tx_buffer)[2*l]<<4; ((short*)ue->common_vars.txdata[aa])[2*k] = ((short*)dummy_tx_buffer)[2*l];
((short*)ue->common_vars.txdata[aa])[2*k+1] = ((short*)dummy_tx_buffer)[2*l+1]<<4; ((short*)ue->common_vars.txdata[aa])[2*k+1] = ((short*)dummy_tx_buffer)[2*l+1];
} }
for (k=0; k<overflow; k++,l++) { for (k=0; k<overflow; k++,l++) {
((short*)ue->common_vars.txdata[aa])[2*k] = ((short*)dummy_tx_buffer)[2*l]<<4; ((short*)ue->common_vars.txdata[aa])[2*k] = ((short*)dummy_tx_buffer)[2*l];
((short*)ue->common_vars.txdata[aa])[2*k+1] = ((short*)dummy_tx_buffer)[2*l+1]<<4; ((short*)ue->common_vars.txdata[aa])[2*k+1] = ((short*)dummy_tx_buffer)[2*l+1];
} }
#if defined(EXMIMO) #if defined(EXMIMO)
// handle switch before 1st TX subframe, guarantee that the slot prior to transmission is switch on // handle switch before 1st TX subframe, guarantee that the slot prior to transmission is switch on
......
...@@ -107,9 +107,7 @@ int netlink_init(void) ...@@ -107,9 +107,7 @@ int netlink_init(void)
if (nas_sock_fd[i] == -1) { if (nas_sock_fd[i] == -1) {
printf("[NETLINK] Error opening socket %d (%d:%s)\n",nas_sock_fd[i],errno, strerror(errno)); printf("[NETLINK] Error opening socket %d (%d:%s)\n",nas_sock_fd[i],errno, strerror(errno));
#if defined(LINK_ENB_PDCP_TO_IP_DRIVER)
exit(1); exit(1);
#endif
} }
printf("[NETLINK]Opened socket with fd %d\n",nas_sock_fd[i]); printf("[NETLINK]Opened socket with fd %d\n",nas_sock_fd[i]);
......
...@@ -451,7 +451,11 @@ int pdcp_fifo_read_input_sdus (const protocol_ctxt_t* const ctxt_pP) ...@@ -451,7 +451,11 @@ int pdcp_fifo_read_input_sdus (const protocol_ctxt_t* const ctxt_pP)
pdcp_data_req(&ctxt, SRB_FLAG_NO, rab_id, RLC_MUI_UNDEFINED, pdcp_data_req(&ctxt, SRB_FLAG_NO, rab_id, RLC_MUI_UNDEFINED,
RLC_SDU_CONFIRM_NO, len, nl_rx_buf, RLC_SDU_CONFIRM_NO, len, nl_rx_buf,
PDCP_TRANSMISSION_MODE_DATA); PDCP_TRANSMISSION_MODE_DATA
#ifdef Rel14
, NULL, NULL
#endif
);
} else { } else {
MSC_LOG_RX_DISCARDED_MESSAGE( MSC_LOG_RX_DISCARDED_MESSAGE(
(ctxt_pP->enb_flag == ENB_FLAG_YES) ? MSC_PDCP_ENB:MSC_PDCP_UE, (ctxt_pP->enb_flag == ENB_FLAG_YES) ? MSC_PDCP_ENB:MSC_PDCP_UE,
......
The driver tcp_bridge_oai.c is to be used with the basic simulator.
To build the basic simulator:
cd [openair top directory]
. oaienv
cd cmake_targets
./build_oai --basic-simulator
cd ../common/utils/T/tracer
make
To use it, you need to run the eNB and the UE.
The eNB requires the T tracer.
Open two terminals.
In one terminal, run:
cd [openair top directory]
cd common/utils/T/tracer
./enb -d ../T_messages.txt
In the other terminal, run:
cd [openair top directory]
cd cmake_targets/basic_simulator/enb
export ENODEB=1
sudo -E ./lte-softmodem -O [configuration file]
[configuration file] is just a regular configuration file.
The eNB needs an EPC.
To run the UE, open a terminal and run:
cd [openair top directory]
cd cmake_targets/basic_simulator/ue
sudo ./lte-uesoftmodem -C 2680000000 -r 25
Adapt the value of -r, it has to match the value N_RB_DL in the configuration
file of the eNB. (Same for -C which should match the value downlink_frequency
in the configuration file.)
The UE configuration (security keys) is generated from the file
openair3/NAS/TOOLS/ue_eurecom_test_sfr.conf. You need to configure
your EPC to know about the UE. If you change the file
openair3/NAS/TOOLS/ue_eurecom_test_sfr.conf then you need to
regenerate the configuration files using the program targets/bin/conf2uedata.
You run it as:
$OPENAIR_DIR/targets/bin/conf2uedata -c $OPENAIR_DIR/openair3/NAS/TOOLS/ue_eurecom_test_sfr.conf -o $OPENAIR_DIR/cmake_targets/basic_simulator/ue
This diff is collapsed.
...@@ -790,6 +790,9 @@ static void *UE_thread_rxn_txnp4(void *arg) { ...@@ -790,6 +790,9 @@ static void *UE_thread_rxn_txnp4(void *arg) {
exit_fun("noting to add"); exit_fun("noting to add");
} }
proc->instance_cnt_rxtx--; proc->instance_cnt_rxtx--;
#if BASIC_SIMULATOR
if (pthread_cond_signal(&proc->cond_rxtx) != 0) abort();
#endif
if (pthread_mutex_unlock(&proc->mutex_rxtx) != 0) { if (pthread_mutex_unlock(&proc->mutex_rxtx) != 0) {
LOG_E( PHY, "[SCHED][UE] error unlocking mutex for UE RXTX\n" ); LOG_E( PHY, "[SCHED][UE] error unlocking mutex for UE RXTX\n" );
exit_fun("noting to add"); exit_fun("noting to add");
...@@ -1433,6 +1436,12 @@ void *UE_thread(void *arg) { ...@@ -1433,6 +1436,12 @@ void *UE_thread(void *arg) {
AssertFatal ( 0== pthread_mutex_unlock(&UE->proc.mutex_synch), ""); AssertFatal ( 0== pthread_mutex_unlock(&UE->proc.mutex_synch), "");
if (is_synchronized == 0) { if (is_synchronized == 0) {
#if BASIC_SIMULATOR
while (!((instance_cnt_synch = UE->proc.instance_cnt_synch) < 0)) {
printf("ue sync not ready\n");
usleep(500*1000);
}
#endif
if (instance_cnt_synch < 0) { // we can invoke the synch if (instance_cnt_synch < 0) { // we can invoke the synch
// grab 10 ms of signal and wakeup synch thread // grab 10 ms of signal and wakeup synch thread
for (int i=0; i<UE->frame_parms.nb_antennas_rx; i++) for (int i=0; i<UE->frame_parms.nb_antennas_rx; i++)
...@@ -1515,6 +1524,17 @@ void *UE_thread(void *arg) { ...@@ -1515,6 +1524,17 @@ void *UE_thread(void *arg) {
// update thread index for received subframe // update thread index for received subframe
UE->current_thread_id[sub_frame] = thread_idx; UE->current_thread_id[sub_frame] = thread_idx;
#if BASIC_SIMULATOR
{
int t;
for (t = 0; t < 2; t++) {
UE_rxtx_proc_t *proc = &UE->proc.proc_rxtx[t];
pthread_mutex_lock(&proc->mutex_rxtx);
while (proc->instance_cnt_rxtx >= 0) pthread_cond_wait( &proc->cond_rxtx, &proc->mutex_rxtx );
pthread_mutex_unlock(&proc->mutex_rxtx);
}
}
#endif
LOG_D(PHY,"Process Subframe %d thread Idx %d \n", sub_frame, UE->current_thread_id[sub_frame]); LOG_D(PHY,"Process Subframe %d thread Idx %d \n", sub_frame, UE->current_thread_id[sub_frame]);
thread_idx++; thread_idx++;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment