Merge remote-tracking branch 'origin/282-flags-cleanup' into develop_integration_2018_w04
Conflicts: openair1/PHY/LTE_TRANSPORT/ulsch_decoding.c openair1/SCHED/defs.h openair2/LAYER2/PDCP_v10.1.0/pdcp.c openair2/RRC/LITE/rrc_eNB.c
This commit is contained in:
@@ -1,5 +1,5 @@
|
||||
CC = gcc
|
||||
CFLAGS = -DUSER_MODE -DEXMIMO -g
|
||||
CFLAGS = -DEXMIMO -g
|
||||
XTRA_CFLAGS = -msse -msse2 -mssse3 -fPIC
|
||||
|
||||
#ifndef OPENAIR0_DIR
|
||||
|
||||
@@ -1,35 +0,0 @@
|
||||
|
||||
|
||||
build:
|
||||
./build_oai.bash -c -m
|
||||
|
||||
build_rtai:
|
||||
./build_oai.bash -c -b -eRTAI -tSOFTMODEM -m
|
||||
|
||||
build_usrp_rtai:
|
||||
./build_oai.bash -c -b -eRTAI -tSOFTMODEM -wUSRP -m
|
||||
|
||||
|
||||
help:
|
||||
@echo make check1 performs a simple sanity check
|
||||
@echo make check2 performs another simple sanity check
|
||||
@echo make check does both the above checks
|
||||
|
||||
all: help
|
||||
|
||||
check1:
|
||||
@echo Doing 1 eNB 1 UE test
|
||||
(cd SIMU/EXAMPLES/VIRT_EMUL_1eNB && make one_eNB_one_UE )
|
||||
|
||||
check2:
|
||||
@echo Doing 1 eNB 4 UE test
|
||||
(cd SIMU/EXAMPLES/VIRT_EMUL_1eNB && make one_eNB_four_UE )
|
||||
|
||||
install:
|
||||
@echo Generating ASN1 files
|
||||
@sh SCRIPTS/install_asn1.sh
|
||||
|
||||
check: check1 check2
|
||||
|
||||
clean:
|
||||
(cd SIMU/USER && make clean)
|
||||
@@ -86,7 +86,6 @@ endif
|
||||
|
||||
ifeq ($(ENABLE_ITTI),1)
|
||||
COMMON_CFLAGS += -DENABLE_ITTI
|
||||
COMMON_CFLAGS += -DUSER_MODE
|
||||
COMMON_CFLAGS += -I$(OPENAIR1_DIR)
|
||||
COMMON_CFLAGS += -I$(OPENAIR2_DIR)/NAS
|
||||
COMMON_CFLAGS += $(L2_incl)
|
||||
|
||||
@@ -61,8 +61,8 @@ echo_success "\n###############################"
|
||||
echo_success "# COMPILE oaisim"
|
||||
echo_success "###############################"
|
||||
cd $OPENAIR_TARGETS/SIMU/USER
|
||||
echo_success "Executing: make oaisim NAS=1 OAI_NW_DRIVER_TYPE_ETHERNET=1 ENABLE_ITTI=1 USER_MODE=1 OPENAIR2=1 Rel10=1 -j`grep -c ^processor /proc/cpuinfo `"
|
||||
make oaisim NAS=1 OAI_NW_DRIVER_TYPE_ETHERNET=1 ENABLE_ITTI=1 USER_MODE=1 OPENAIR2=1 Rel10=1 -j`grep -c ^processor /proc/cpuinfo `
|
||||
echo_success "Executing: make oaisim NAS=1 OAI_NW_DRIVER_TYPE_ETHERNET=1 ENABLE_ITTI=1 OPENAIR2=1 Rel10=1 -j`grep -c ^processor /proc/cpuinfo `"
|
||||
make oaisim NAS=1 OAI_NW_DRIVER_TYPE_ETHERNET=1 ENABLE_ITTI=1 OPENAIR2=1 Rel10=1 -j`grep -c ^processor /proc/cpuinfo `
|
||||
if [[ $? -eq 2 ]] ; then
|
||||
exit 1
|
||||
fi
|
||||
|
||||
@@ -1,124 +0,0 @@
|
||||
# command line flags are automatically exported and thus passed down to any sub-make.
|
||||
# here we set the default flags in case on command line flags are provided
|
||||
# these flags have to be explicitely exported so that the sub-make is aware of them
|
||||
|
||||
|
||||
include $(OPENAIR_DIR)/common/utils/Makefile.inc
|
||||
ifndef OPENAIR_LTE
|
||||
export OPENAIR_LTE=1
|
||||
export OPENAIR_EMU=0
|
||||
endif
|
||||
|
||||
ifndef OPENAIR1
|
||||
export OPENAIR1=0
|
||||
endif
|
||||
|
||||
ifndef OPENAIR2
|
||||
export OPENAIR2=0
|
||||
endif
|
||||
|
||||
ifndef OPENAIR3
|
||||
export OPENAIR3=0
|
||||
endif
|
||||
|
||||
ifndef EMOS
|
||||
export EMOS=0
|
||||
endif
|
||||
|
||||
ifndef rrc_cellular
|
||||
export rrc_cellular = 0
|
||||
export rrc_cellular_eNB = 0
|
||||
export rrc_cellular_UE = 0
|
||||
else
|
||||
export rrc_cellular = 1
|
||||
ifeq ($(eNB_flag),1)
|
||||
export rrc_cellular_eNB=1
|
||||
endif
|
||||
ifeq ($(UE_flag),1)
|
||||
export rrc_cellular_UE=1
|
||||
endif
|
||||
endif
|
||||
|
||||
all: openair_rf_cbmimo1_softmodem.ko asn1_msg_kern.ko nasmesh.ko rb_tool openair_rf scope
|
||||
|
||||
openair_rf_cbmimo1_softmodem.ko:
|
||||
(cd $(OPENAIR1_DIR)/ARCH/CBMIMO1/DEVICE_DRIVER && $(MAKE) -C $(KERNEL_DIR)/build V=1 M=`pwd` RTAI=1 CBMIMO1=1 && mv openair_rf.ko $(CURDIR)/openair_rf_softmodem.ko)
|
||||
|
||||
oai_user_cbmimo1.ko:
|
||||
(cd $(OPENAIR1_DIR)/ARCH/CBMIMO1/DEVICE_DRIVER && $(MAKE) -C $(KERNEL_DIR)/build V=1 M=`pwd` RTAI=1 CBMIMO1=1 BIT8_TX=1 OPENAIR1=0 OPENAIR2=0 && mv openair_rf.ko $(CURDIR)/openair_rf_softmodem.ko)
|
||||
|
||||
oai_user_exmimo.ko:
|
||||
(cd $(OPENAIR1_DIR)/ARCH/CBMIMO1/DEVICE_DRIVER && $(MAKE) -C $(KERNEL_DIR)/build V=1 M=`pwd` RTAI=1 CBMIMO1=1 OPENAIR1=0 OPENAIR2=0 && mv openair_rf.ko $(CURDIR)/openair_rf_softmodem.ko)
|
||||
|
||||
asn1_msg_kern.ko:
|
||||
(cd $(OPENAIR2_DIR)/RRC/LITE/MESSAGES && $(MAKE) -C $(KERNEL_DIR)/build V=0 M=`pwd` RTAI=1 -j2 && mv asn1_msg_kern.ko $(CURDIR)/asn1_msg_kern.ko)
|
||||
|
||||
nasmesh.ko:
|
||||
(cd $(OPENAIR2_DIR)/NAS/DRIVER/MESH && $(MAKE) V=1 -C $(KERNEL_DIR)/build M=`pwd` && mv nasmesh.ko $(CURDIR)/nasmesh.ko)
|
||||
|
||||
rb_tool:
|
||||
(cd $(OPENAIR2_DIR)/NAS/DRIVER/MESH/RB_TOOL && $(MAKE))
|
||||
|
||||
openair_rf:
|
||||
(cd $(OPENAIR1_DIR)/USERSPACE_TOOLS/OPENAIR_RF && $(MAKE) clean CBMIMO1=1 && $(MAKE) all CBMIMO1=1 && $(MAKE) clean CBMIMO1=1)
|
||||
|
||||
scope:
|
||||
(cd $(OPENAIR1_DIR)/USERSPACE_TOOLS/SCOPE && $(MAKE) clean && $(MAKE) all && $(MAKE) clean )
|
||||
|
||||
#Remove all but source files
|
||||
cleanall:
|
||||
(cd $(OPENAIR1_DIR) && $(MAKE) cleanall)
|
||||
(cd $(OPENAIR2_DIR) && $(MAKE) cleanall)
|
||||
|
||||
fifos:
|
||||
@for i in `seq 0 64`;\
|
||||
do \
|
||||
have_rtfX=`ls /dev/ |grep -c rtf$$i`;\
|
||||
if [ "$$have_rtfX" -eq 0 ] ;then \
|
||||
mknod -m 666 /dev/rtf$$i c 150 $$i; \
|
||||
fi;\
|
||||
done
|
||||
|
||||
openair0:
|
||||
mknod /dev/openair0 c 127 0
|
||||
chmod a+rw /dev/openair0
|
||||
|
||||
install_oai_user:
|
||||
make fifos
|
||||
insmod openair_rf_softmodem.ko
|
||||
|
||||
updatefw:
|
||||
$(OPENAIR1_DIR)/USERSPACE_TOOLS/OAI_FW_INIT/updatefw -f $$OPENAIR0_DIR/express-mimo/software/sdr/main -s 0x43fffff0
|
||||
|
||||
boot_exmimo:
|
||||
sudo make install_oai_user
|
||||
$(OPENAIR1_DIR)/USERSPACE_TOOLS/OAI_FW_INIT/updatefw -f $$OPENAIR0_DIR/express-mimo/software/sdr/main -s 0x43fffff0
|
||||
sleep 1
|
||||
sudo rmmod openair_rf
|
||||
sudo make install_oai_user
|
||||
|
||||
reboot_exmimo:
|
||||
$(OPENAIR1_DIR)/USERSPACE_TOOLS/OAI_FW_INIT/updatefw -f $$OPENAIR0_DIR/express-mimo/software/sdr/main -s 0x43fffff0 -b
|
||||
sudo rmmod openair_rf
|
||||
sudo make install_oai_user
|
||||
|
||||
install_softmodem:
|
||||
make fifos
|
||||
ifeq ($(OPENAIR2),1)
|
||||
insmod asn1_msg_kern.ko
|
||||
endif
|
||||
insmod openair_rf_softmodem.ko
|
||||
|
||||
remove:
|
||||
rmmod openair_rf
|
||||
ifeq ($(OPENAIR2),1)
|
||||
rmmod asn1_msg_kern
|
||||
endif
|
||||
|
||||
test:
|
||||
(cd $(OPENAIR1_DIR)/ARCH/CBMIMO1/DEVICE_DRIVER && $(MAKE) test RTAI=1 CBMIMO1=1)
|
||||
(cd $(OPENAIR2_DIR)/RRC/LITE/MESSAGES && $(MAKE) test)
|
||||
|
||||
clean:
|
||||
(cd $(OPENAIR1_DIR)/ARCH/CBMIMO1/DEVICE_DRIVER && $(MAKE) clean RTAI=1 CBMIMO1=1)
|
||||
(cd $(OPENAIR2_DIR)/RRC/LITE/MESSAGES && $(MAKE) clean)
|
||||
@@ -1,447 +0,0 @@
|
||||
# Include some shared directives
|
||||
include $(OPENAIR_TARGETS)/Makerules
|
||||
|
||||
default: lte-softmodem
|
||||
all: lte-softmodem rrh
|
||||
|
||||
include $(OPENAIR_TARGETS)/Makefile.common
|
||||
|
||||
KERNEL_VERSION:=$(shell echo `uname -r | cut -d. -f-2`)
|
||||
KERNEL_TYPE:=$(shell echo `uname -r | cut -d. -f-3 | cut -d- -f3`)
|
||||
DEADLINE_SCHEDULER_KERNEL:=$(shell if [ $(KERNEL_TYPE) = "lowlatency" ]; then echo "1" ; else echo "0" ; fi)
|
||||
|
||||
include $(OPENAIR2_DIR)/RRC/LITE/MESSAGES/Makefile.inc
|
||||
|
||||
ifdef EXMIMO
|
||||
#ifdef DEADLINE_SCHEDULER # this ifdef is to be removed after the debugging
|
||||
ifeq ($(DEADLINE_SCHEDULER_KERNEL),1)
|
||||
CFLAGS+=-DDEADLINE_SCHEDULER
|
||||
endif
|
||||
#endif
|
||||
endif
|
||||
|
||||
ifndef USRP
|
||||
USRP=0
|
||||
endif
|
||||
|
||||
CFLAGS += -DDRIVER2013 -I$(OPENAIR_TARGETS)/ARCH/COMMON -I.
|
||||
|
||||
ifndef OPENAIR2
|
||||
OPENAIR2=1
|
||||
endif
|
||||
|
||||
ifdef DEBUG
|
||||
DISABLE_XER_PRINT=0
|
||||
MSG_PRINT=1
|
||||
endif
|
||||
|
||||
ifdef Rel10
|
||||
CFLAGS += -DRel10
|
||||
endif
|
||||
|
||||
ifeq ($(EXMIMO),1)
|
||||
CFLAGS += -I$(OPENAIR_TARGETS)/ARCH/EXMIMO/USERSPACE/LIB/ -I$(OPENAIR_TARGETS)/ARCH/EXMIMO/DEFS -DENABLE_VCD_FIFO
|
||||
endif
|
||||
|
||||
ifeq ($(ETHERNET),1)
|
||||
CFLAGS += -I$(OPENAIR_TARGETS)/ARCH/ETHERNET/USERSPACE/LIB/ -DETHERNET
|
||||
endif
|
||||
|
||||
ifeq ($(DEBUG),1)
|
||||
CFLAGS += -g -ggdb
|
||||
#CFLAGS += -DRRC_MSG_PRINT
|
||||
#CFLAGS += -DPDCP_MSG_PRINT
|
||||
else
|
||||
CFLAGS += -O2
|
||||
endif
|
||||
|
||||
ifdef ($(MSG_PRINT),1)
|
||||
CFLAGS += -DRRC_MSG_PRINT
|
||||
CFLAGS += -DPDCP_MSG_PRINT
|
||||
endif
|
||||
|
||||
SRC = synctest.c condtest.c
|
||||
|
||||
ifndef RTAI
|
||||
RTAI=1
|
||||
endif
|
||||
|
||||
ifeq ($(LOCALIZATION), 1)
|
||||
CFLAGS += -DLOCALIZATION
|
||||
endif
|
||||
|
||||
ifeq ($(LINUX_LIST), 1)
|
||||
CFLAGS += -DLINUX_LIST
|
||||
endif
|
||||
|
||||
ifeq ($(RTAI),1)
|
||||
CFLAGS += -DENABLE_RTAI_CLOCK
|
||||
CFLAGS += -DCONFIG_RTAI_LXRT_INLINE #remend the RTAI warning
|
||||
RTAI_OBJ = sched_dlsch.o sched_rx_pdsch.o rt_wrapper.o
|
||||
else #RTAI
|
||||
CFLAGS += -DENABLE_USE_CPU_EXECUTION_TIME
|
||||
OBJ += sched_dlsch.o sched_rx_pdsch.o rt_wrapper.o
|
||||
endif
|
||||
|
||||
OBJ += $(OPENAIR1_DIR)/SIMULATION/TOOLS/taus.o $(OPENAIR_TARGETS)/SIMU/USER/init_lte.o
|
||||
|
||||
ifeq ($(EXMIMO),1)
|
||||
OBJ += $(OPENAIR_TARGETS)/ARCH/EXMIMO/USERSPACE/LIB/openair0_lib.o $(OPENAIR_TARGETS)/ARCH/EXMIMO/USERSPACE/LIB/gain_control.o
|
||||
CFLAGS += -DDRIVER2013 -I$(OPENAIR_TARGETS)/ARCH/EXMIMO/USERSPACE/LIB/ -I$(OPENAIR_TARGETS)/ARCH/EXMIMO/DEFS
|
||||
endif
|
||||
|
||||
CFLAGS += -DENABLE_VCD_FIFO
|
||||
|
||||
|
||||
TOP_DIR = $(OPENAIR1_DIR)
|
||||
include $(OPENAIR1_DIR)/PHY/Makefile.inc
|
||||
include $(OPENAIR1_DIR)/SCHED/Makefile.inc
|
||||
|
||||
OBJ += $(PHY_OBJS)
|
||||
ifeq ($(RTAI),1)
|
||||
RTAI_OBJ += $(SCHED_OBJS)
|
||||
else
|
||||
OBJ += $(SCHED_OBJS)
|
||||
endif
|
||||
|
||||
OPENAIR2_TOP = $(OPENAIR2_DIR)
|
||||
include $(OPENAIR2_DIR)/LAYER2/Makefile.inc
|
||||
include $(OPENAIR2_DIR)/UTIL/Makefile.inc
|
||||
include $(OPENAIR2_DIR)/RRC/NAS/Makefile.inc
|
||||
include $(OPENAIR2_DIR)/ENB_APP/Makefile.inc
|
||||
|
||||
ifeq ($(USRP),1)
|
||||
|
||||
include $(OPENAIR_TARGETS)/ARCH/USRP/USERSPACE/LIB/Makefile.inc
|
||||
#CFLAGS += -I/opt/include/uhd -L/opt/lib -luhd -lpthread -lstdc++
|
||||
CFLAGS += -I/usr/include/uhd -L/usr/lib -luhd -lpthread -lstdc++
|
||||
CFLAGS += -DOAI_USRP
|
||||
#LDFLAGS += -L/opt/lib -luhd -lpthread -lstdc++
|
||||
LDFLAGS += -L/usr/lib/ -luhd -lpthread -lstdc++
|
||||
endif
|
||||
|
||||
ifeq ($(ETHERNET),1)
|
||||
include $(OPENAIR_TARGETS)/ARCH/ETHERNET/USERSPACE/LIB/Makefile.inc
|
||||
LDFLAGS += -lpthread
|
||||
endif
|
||||
|
||||
OBJ += $(ENB_APP_OBJS)
|
||||
|
||||
ifeq ($(RTAI),1)
|
||||
CFLAGS += -I/usr/realtime/include -I/usr/realtime/include/asm
|
||||
LOG_OBJS=
|
||||
RTAI_OBJ+=$(LOG_DIR)/vcd_signal_dumper.o
|
||||
RTAI_OBJ+=$(LOG_DIR)/log.o
|
||||
endif
|
||||
|
||||
|
||||
OBJ += $(LOG_OBJS)
|
||||
|
||||
ifeq ($(OPENAIR2),1)
|
||||
ASN1_MSG_OBJS1=$(addprefix $(OPENAIR2_DIR)/RRC/LITE/MESSAGES/, $(ASN1_MSG_OBJS))
|
||||
OBJ += $(L2_OBJS) $(LIST_OBJ) $(TIMER_OBJ) $(MEM_OBJ) $(OTG_OBJS) $(MATH_OBJS) $(OSA_OBJS) $(OPT_OBJS)
|
||||
OBJ += $(OPENAIR1_DIR)/SIMULATION/ETH_TRANSPORT/netlink_init.o
|
||||
#OBJ += $(PDCP_DIR)/pdcp_thread.o
|
||||
CFLAGS += -DOPENAIR2 -DNO_RRM -DPUCCH -DMAC_CONTEXT=1
|
||||
endif
|
||||
|
||||
#ifdef ENABLE_ITTI
|
||||
RTAI_OBJ += $(UTILS_OBJS)
|
||||
#else
|
||||
#OBJ += $(UTILS_OBJS)
|
||||
#endif
|
||||
|
||||
ifdef SPECTRA
|
||||
CFLAGS += -DSPECTRA
|
||||
endif
|
||||
|
||||
#ifdef ENABLE_ITTI
|
||||
CFLAGS += -DEXMIMO_IOT
|
||||
#endif
|
||||
|
||||
CFLAGS += $(L2_incl) $(ENB_APP_incl) $(UTIL_incl) $(UTILS_incl)
|
||||
|
||||
CFLAGS += -I$(OPENAIR1_DIR) -I$(OPENAIR2_DIR)/RRC/LITE/MESSAGES #-I$(OPENAIR3_DIR)/MESH -I$(OPENAIR3_DIR)/MESH/RRM
|
||||
|
||||
CFLAGS += -DNEW_FFT -DLOG_NO_THREAD
|
||||
|
||||
ifeq ($(XFORMS),1)
|
||||
CFLAGS += -DXFORMS -I/usr/include/X11
|
||||
LDFLAGS += -lforms
|
||||
OBJ += $(OPENAIR1_DIR)/PHY/TOOLS/lte_phy_scope.o
|
||||
OBJ += stats.o
|
||||
endif
|
||||
|
||||
OBJ_SYNC = $(OPENAIR_TARGETS)/ARCH/EXMIMO/USERSPACE/LIB/openair0_lib.o rt_wrapper.o $(OPENAIR2_DIR)/UTIL/LOG/log.o $(OPENAIR2_DIR)/UTIL/LOG/vcd_signal_dumper.o
|
||||
|
||||
ifdef SMBV
|
||||
CFLAGS += -DSMBV
|
||||
endif
|
||||
|
||||
CFLAGS += -DPHYSIM -DUSER_MODE -DPC_TARGET -DPC_DSP -DNB_ANTENNAS_RX=2 -DNB_ANTENNAS_TXRX=2 -DNB_ANTENNAS_TX=2 -DPHY_CONTEXT=1
|
||||
CFLAGS += -DOPENAIR_LTE -DENABLE_FXP -DOPENAIR1 #-DDLSCH_THREAD #-DULSCH_THREAD
|
||||
|
||||
|
||||
ifeq ($(EXMIMO),1)
|
||||
CFLAGS += -DEXMIMO
|
||||
#CFLAGS += -DEXMIMO -DTIMING_ADVANCE_HW=138 #this is for ExpressMIMO 1
|
||||
#CFLAGS += -DEXMIMO -DTIMING_ADVANCE_HW=45 #this is for ExpressMIMO 2
|
||||
endif
|
||||
|
||||
ifeq ($(HARD_RT),1)
|
||||
CFLAGS += -DHARD_RT
|
||||
endif
|
||||
|
||||
ifeq ($(EMOS),1)
|
||||
CFLAGS += -D_FILE_OFFSET_BITS=64 #-DEMOS -DEMOS_CHANNEL
|
||||
LDFLAGS += -lgps
|
||||
endif
|
||||
|
||||
|
||||
ifeq ($(LINK_ENB_PDCP_TO_GTPV1U), 1)
|
||||
CFLAGS += -DLINK_ENB_PDCP_TO_GTPV1U
|
||||
endif
|
||||
|
||||
ifeq ($(LINK_ENB_PDCP_TO_IP_DRIVER), 1)
|
||||
CFLAGS += -DPDCP_USE_NETLINK -DLINUX
|
||||
OBJ += $(NAS_OBJS)
|
||||
NAS_FLAG=1
|
||||
endif
|
||||
|
||||
LDFLAGS += -lpthread -lm -lforms -lconfig -lrt
|
||||
ifeq ($(RTAI),1)
|
||||
RTAI_CFLAGS += $(shell rtai-config --lxrt-cflags) -DRTAI
|
||||
LDFLAGS += $(shell rtai-config --lxrt-ldflags)
|
||||
endif
|
||||
|
||||
#ifeq ($(USRP),1)
|
||||
#CFLAGS += -I/opt/uhd/include -L/opt/uhd/lib -luhd -lpthread -lstdc++
|
||||
#CFLAGS += -DOAI_USRP
|
||||
#endif
|
||||
#CFLAGS += -I/usr/include/c++/4.6 -I/usr/include/c++/4.6/x86_64-linux-gnu -I/usr/include/rtai/
|
||||
|
||||
LFDS_OBJ_DIR = $(subst $(OPENAIR_DIR),$(OBJS_DIR),$(LFDS_DIR))
|
||||
LFDS_LIB = $(LFDS_OBJ_DIR)/bin/liblfds611.a
|
||||
LIBS += $(LFDS_LIB)
|
||||
SHARED_DEPENDENCIES += $(LFDS_LIB)
|
||||
|
||||
-include $(OBJ:.o=.d)
|
||||
-include $(ASN1_MSG_OBJS1:.o=.d)
|
||||
-include $(RTAI_OBJ:.o=.d)
|
||||
-include lte-softmodem.d
|
||||
-include lte-ue.d
|
||||
-include rrh.d
|
||||
|
||||
$(LFDS_LIB):
|
||||
@if [ ! -d $(LFDS_OBJ_DIR)/bin ]; then mkdir -p $(LFDS_OBJ_DIR)/bin; fi;
|
||||
@if [ ! -d $(LFDS_OBJ_DIR)/obj ]; then mkdir -p $(LFDS_OBJ_DIR)/obj; fi;
|
||||
$(MAKE) -C $(LFDS_DIR) -f makefile.linux OUTDIR=$(LFDS_OBJ_DIR)
|
||||
|
||||
ifeq ($(USRP),1)
|
||||
$(USRP_OBJ):$(USRP_FILE_OBJ)
|
||||
@echo Compiling $<
|
||||
@$(CXX) -c -g -ggdb $(USRP_CFLAGS) $(USRP_FILE_OBJ) -o $(USRP_OBJ)
|
||||
endif
|
||||
|
||||
ifeq ($(ETHERNET),1)
|
||||
$(ETHERNET_OBJ):$(ETHERNET_FILE_OBJ)
|
||||
@echo Compiling $<
|
||||
@$(CC) -c -g -ggdb $(ETHERNET_CFLAGS) $(ETHERNET_FILE_OBJ) -o $(ETHERNET_OBJ)
|
||||
endif
|
||||
|
||||
ifeq ($(RTAI),1)
|
||||
$(RTAI_OBJ) lte-softmodem.o lte-ue.o: %.o : %.c
|
||||
else
|
||||
$(RTAI_OBJ): %.o : %.c
|
||||
endif
|
||||
@echo Compiling $< ...
|
||||
@$(CC) -c $(CFLAGS) $(EXTRA_CFLAGS) $(RTAI_CFLAGS) -o $@ $<
|
||||
@$(CC) -MM $(CFLAGS) $(EXTRA_CFLAGS) $(RTAI_CFLAGS) $< > $*.d
|
||||
@mv -f $*.d $*.d.tmp
|
||||
@sed -e 's|.*:|$*.o:|' < $*.d.tmp > $*.d
|
||||
@sed -e 's/.*://' -e 's/\\$$//' < $*.d.tmp | fmt -1 | \
|
||||
sed -e 's/^ *//' -e 's/$$/:/' >> $*.d
|
||||
@rm -f $*.d.tmp
|
||||
|
||||
ifdef ENABLE_ITTI
|
||||
$(OBJ) $(RTAI_OBJ): $(ITTI_MESSAGES_H)
|
||||
endif
|
||||
|
||||
ifeq ($(RTAI),1)
|
||||
$(OBJ) $(ASN1_MSG_OBJS1): %.o : %.c
|
||||
else
|
||||
$(OBJ) $(ASN1_MSG_OBJS1) lte-softmodem.o lte-ue.o: %.o : %.c
|
||||
endif
|
||||
|
||||
rrh.o: %.o : %.c
|
||||
|
||||
@echo Compiling $< ...
|
||||
@$(CC) -c $(CFLAGS) $(EXTRA_CFLAGS) -o $@ $<
|
||||
@$(CC) -MM $(CFLAGS) $(EXTRA_CFLAGS) $< > $*.d
|
||||
@mv -f $*.d $*.d.tmp
|
||||
@sed -e 's|.*:|$*.o:|' < $*.d.tmp > $*.d
|
||||
@sed -e 's/.*://' -e 's/\\$$//' < $*.d.tmp | fmt -1 | \
|
||||
sed -e 's/^ *//' -e 's/$$/:/' >> $*.d
|
||||
@rm -f $*.d.tmp
|
||||
|
||||
OBJ_EMOS = $(OPENAIR_TARGETS)/ARCH/EXMIMO/USERSPACE/LIB/openair0_lib.o $(OPENAIR_TARGETS)/ARCH/EXMIMO/USERSPACE/LIB/gain_control.o rt_wrapper.o $(OPENAIR2_DIR)/UTIL/LOG/log.o $(OPENAIR2_DIR)/UTIL/LOG/vcd_signal_dumper.o $(OPENAIR1_DIR)/PHY/TOOLS/signal_energy.o $(OPENAIR1_DIR)/PHY/TOOLS/dB_routines.o
|
||||
ifeq ($(XFORMS),1)
|
||||
OBJ_EMOS+=lte_scope.o
|
||||
endif
|
||||
|
||||
condtest: condtest.c
|
||||
$(CC) $(CFLAGS) $(LDFLAGS) condtest.c -o condtest
|
||||
|
||||
synctest: $(OBJ_SYNC) $(SHARED_DEPENDENCIES) synctest.c
|
||||
$(CC) $(CFLAGS) $(EXTRA_CFLAGS) $(RTAI_CFLAGS) $(OBJ_SYNC) -o synctest synctest.c $(LDFLAGS) $(LIBS)
|
||||
|
||||
sleeptest: rt_wrapper.o sleeptest.c
|
||||
$(CC) $(CFLAGS) $(EXTRA_CFLAGS) $(RTAI_CFLAGS) rt_wrapper.o -o sleeptest sleeptest.c $(LDFLAGS)
|
||||
|
||||
lte-softmodem: $(OBJ) $(USRP_OBJ) $(ETHERNET_OBJ) $(ASN1_MSG_OBJS1) $(RTAI_OBJ) lte-ue.o lte-softmodem.o $(SHARED_DEPENDENCIES)
|
||||
@echo Linking $@
|
||||
@$(CC) $(CFLAGS) $(EXTRA_CFLAGS) $(OBJ) $(USRP_OBJ) $(ETHERNET_OBJ) $(RTAI_OBJ) $(ASN1_MSG_OBJS1) lte-ue.o lte-softmodem.o -o lte-softmodem $(LDFLAGS) $(LIBS)
|
||||
|
||||
rrh: rrh.o
|
||||
@$(CC) $(CFLAGS) $(EXTRA_CFLAGS) rrh.o -o rrh -lpthread -lrt
|
||||
|
||||
emos-raw: $(SHARED_DEPENDENCIES) $(OBJ_EMOS) emos-raw.c
|
||||
@$(CC) $(CFLAGS) $(EXTRA_CFLAGS) $(RTAI_CFLAGS) $(OBJ_EMOS) -o emos-raw emos-raw.c $(LDFLAGS) $(LIBS)
|
||||
|
||||
|
||||
synctest_eNB: synctest
|
||||
cp synctest synctest_eNB
|
||||
|
||||
synctest_UE: synctest
|
||||
cp synctest synctest_UE
|
||||
|
||||
drivers:
|
||||
# cd $(OPENAIR2_DIR) && make clean && make nasmesh_netlink.ko
|
||||
# cd $(OPENAIR2_DIR)/NAS/DRIVER/MESH/RB_TOOL && make clean && make
|
||||
cd $(OPENAIR_TARGETS)/ARCH/EXMIMO/DRIVER/eurecom && make clean && make
|
||||
cd $(OPENAIR_TARGETS)/ARCH/EXMIMO/USERSPACE/OAI_FW_INIT && make clean && make
|
||||
cp $(OPENAIR_TARGETS)/ARCH/EXMIMO/USERSPACE/OAI_FW_INIT/updatefw $(OPENAIR_TARGETS)/bin/.
|
||||
|
||||
run: condtest
|
||||
rtai-load condtest --verbose
|
||||
|
||||
run_eNB_test:
|
||||
rtai-load eNB_test --verbose
|
||||
|
||||
run_eNB:
|
||||
rtai-load eNB --verbose
|
||||
|
||||
run_UE:
|
||||
rtai-load UE --verbose
|
||||
|
||||
run_UE0:
|
||||
rtai-load UE0 --verbose
|
||||
|
||||
run_UE0_smbv:
|
||||
rtai-load UE0_smbv --verbose
|
||||
|
||||
run_UE850:
|
||||
rtai-load UE850 --verbose
|
||||
|
||||
run_eNB850:
|
||||
rtai-load eNB850 --verbose
|
||||
|
||||
run_UE0prach:
|
||||
rtai-load UE0prach --verbose
|
||||
|
||||
run_UE1prach:
|
||||
rtai-load UE1prach --verbose
|
||||
|
||||
run_UE2prach:
|
||||
rtai-load UE2prach --verbose
|
||||
|
||||
run_UE0noL2:
|
||||
rtai-load UE0noL2 -- verbose
|
||||
|
||||
run_UE1noL2:
|
||||
rtai-load UE1noL2 --verbose
|
||||
|
||||
run_UE2noL2:
|
||||
rtai-load UE2noL2 --verbose
|
||||
|
||||
run_UE0calib:
|
||||
rtai-load UE0calib --verbose
|
||||
|
||||
run_UE0calibmed:
|
||||
rtai-load UE0calibmed --verbose
|
||||
|
||||
run_UE0calibbyp:
|
||||
rtai-load UE0calibbyp --verbose
|
||||
|
||||
run_UE1:
|
||||
rtai-load UE1 --verbose
|
||||
|
||||
run_UE2:
|
||||
rtai-load UE2 --verbose
|
||||
|
||||
run_eNB0:
|
||||
rtai-load eNB0 --verbose
|
||||
|
||||
run_eNB1:
|
||||
rtai-load eNB1 --verbose
|
||||
|
||||
run_eNB2:
|
||||
rtai-load eNB2 --verbose
|
||||
|
||||
clean: cleanmodem common-clean
|
||||
|
||||
cleanmodem:
|
||||
@$(RM_F_V) $(OBJ) $(RTAI_OBJ) $(OBJ_EMOS) $(OBJ_SYNC) $(USRP_OBJ) $(ETHERNET_OBJ)
|
||||
@$(RM_F_V) $(OBJ:.o=.d) $(RTAI_OBJ:.o=.d) $(OBJ_EMOS:.o=.d) $(OBJ_SYNC:.o=.d)
|
||||
@$(RM_F_V) $(OPENAIR2_DIR)/RRC/LITE/MESSAGES/asn1_msg.o $(OPENAIR2_DIR)/RRC/LITE/MESSAGES/asn1_msg.d
|
||||
@$(RM_F_V) lte-ue.o lte-ue.d rrh.o rrh.d lte-softmodem.o lte-softmodem.d
|
||||
@$(RM_F_V) rrh.o lte-ue.o lte-softmodem.o
|
||||
|
||||
cleanasn1:
|
||||
rm -f $(ASN1_MSG_OBJS1)
|
||||
$(shell cd $(OPENAIR2_DIR)/RRC/LITE/MESSAGES ; rm -f $(ASN_MODULE_SOURCES) $(ASN_MODULE_HEADERS) *.o *.d )
|
||||
rm -f $(OPENAIR2_DIR)/RRC/LITE/MESSAGES/Makefile.am.sample
|
||||
rm -f $(OPENAIR2_DIR)/RRC/LITE/MESSAGES/Makefile.inc.generated
|
||||
rm -f $(OPENAIR2_DIR)/RRC/LITE/MESSAGES/asn1c/ASN1_files/.lock-rel*
|
||||
|
||||
cleancell:
|
||||
rm -f $(OPENAIR2_DIR)/RRC/CELLULAR/*.o
|
||||
rm -f $(OPENAIR2_DIR)/RRC/CELLULAR/*.d
|
||||
rm -f $(OPENAIR2_DIR)/RRC/L2_INTERFACE/*.o
|
||||
rm -f $(OPENAIR2_DIR)/RRC/L2_INTERFACE/*.d
|
||||
rm -f $(OPENAIR2_DIR)/NAS/SIMU_CELLULAR/*.o
|
||||
rm -f $(OPENAIR2_DIR)/NAS/SIMU_CELLULAR/*.d
|
||||
|
||||
cleanalmostall: cleanmodem
|
||||
rm -f $(ASN1_MSG_OBJS1)
|
||||
rm -rf condtest synctest lte-softmodem rrh
|
||||
rm -rf synctest_eNB synctest_UE
|
||||
|
||||
cleanall: common-cleanall clean cleanasn1
|
||||
rm -rf condtest synctest lte-softmodem rrh
|
||||
rm -rf synctest_eNB synctest_UE
|
||||
|
||||
show:
|
||||
@echo $(CFLAGS)
|
||||
@echo $(EXTRA_CFLAGS)
|
||||
@echo $(OBJ) $(RTAI_OBJ)
|
||||
@echo $(USRP_OBJ)
|
||||
@echo $(ETHERNET_OBJ)
|
||||
@echo $(ETHERNET_FILE_OBJ)
|
||||
@echo IS_REL8 is $(IS_REL8)
|
||||
@echo IS_REL10 is $(IS_REL10)
|
||||
@echo openssl $(OPENSSL_FOUND)
|
||||
@echo nettle $(NETTLE_FOUND)
|
||||
@echo lowlatency kernel: $(DEADLINE_SCHEDULER_KERNEL)
|
||||
|
||||
beautiful:
|
||||
astyle --style=gnu -s2 $(SRC)
|
||||
|
||||
fifos:
|
||||
@for i in `seq 0 64`;\
|
||||
do \
|
||||
have_rtfX=`ls /dev/ |grep -c rtf$$i`;\
|
||||
if [ "$$have_rtfX" -eq 0 ] ;then \
|
||||
mknod -m 666 /dev/rtf$$i c 150 $$i; \
|
||||
fi;\
|
||||
done
|
||||
@@ -1,243 +0,0 @@
|
||||
include $(OPENAIR_TARGETS)/Makerules
|
||||
|
||||
include $(OPENAIR_TARGETS)/Makefile.common
|
||||
|
||||
CFLAGS += -DDRIVER2013 -I$(OPENAIR_TARGETS)/ARCH/EXMIMO/USERSPACE/LIB/ -I$(OPENAIR_TARGETS)/ARCH/EXMIMO/DEFS -DENABLE_VCD_FIFO -DEXMIMO_IOT
|
||||
|
||||
SRC = lte-enb.c
|
||||
|
||||
ifndef RTAI
|
||||
RTAI=1
|
||||
endif
|
||||
|
||||
ifeq ($(RTAI),1)
|
||||
CFLAGS += -DENABLE_RTAI_CLOCK -DRTAI
|
||||
RTAI_OBJ = sched_dlsch.o sched_ulsch.o sched_rx_pdsch.o lte-enb.o rt_wrapper.o
|
||||
else
|
||||
OBJ = sched_dlsch.o sched_ulsch.o sched_rx_pdsch.o lte-enb.o rt_wrapper.o
|
||||
CFLAGS += -DENABLE_USE_CPU_EXECUTION_TIME
|
||||
endif
|
||||
|
||||
OBJ += $(OPENAIR1_DIR)/SIMULATION/TOOLS/taus.o $(OPENAIR_TARGETS)/SIMU/USER/init_lte.o $(OPENAIR_TARGETS)/ARCH/EXMIMO/USERSPACE/LIB/openair0_lib.o
|
||||
|
||||
TOP_DIR = $(OPENAIR1_DIR)
|
||||
include $(OPENAIR1_DIR)/PHY/Makefile.inc
|
||||
include $(OPENAIR1_DIR)/SCHED/Makefile.inc
|
||||
|
||||
OBJ += $(PHY_OBJS)
|
||||
ifeq ($(RTAI),1)
|
||||
RTAI_OBJ += $(SCHED_OBJS)
|
||||
else
|
||||
OBJ += $(SCHED_OBJS)
|
||||
endif
|
||||
|
||||
#ifndef rrc_cellular
|
||||
ifeq ($(rrc_cellular),0)
|
||||
rrc_cellular = 0
|
||||
rrc_cellular_eNB = 0
|
||||
rrc_cellular_UE = 0
|
||||
else
|
||||
ifeq ($(eNB_flag),1)
|
||||
rrc_cellular_eNB=1
|
||||
endif
|
||||
ifeq ($(UE_flag),1)
|
||||
rrc_cellular_UE=1
|
||||
endif
|
||||
endif
|
||||
|
||||
export rrc_cellular
|
||||
|
||||
OPENAIR2_TOP = $(OPENAIR2_DIR)
|
||||
include $(OPENAIR2_DIR)/LAYER2/Makefile.inc
|
||||
include $(OPENAIR2_DIR)/UTIL/Makefile.inc
|
||||
include $(OPENAIR2_DIR)/RRC/NAS/Makefile.inc
|
||||
|
||||
ifeq ($(RTAI),1)
|
||||
LOG_OBJS=
|
||||
RTAI_OBJ+=$(LOG_DIR)/vcd_signal_dumper.o
|
||||
RTAI_OBJ+=$(LOG_DIR)/log.o
|
||||
endif
|
||||
|
||||
include $(OPENAIR2_DIR)/RRC/LITE/MESSAGES/Makefile.inc
|
||||
|
||||
OBJ += $(LOG_OBJS)
|
||||
|
||||
ifndef OPENAIR2
|
||||
OPENAIR2=1
|
||||
endif
|
||||
ifeq ($(OPENAIR2),1)
|
||||
ASN1_MSG_OBJS1=$(addprefix $(OPENAIR2_DIR)/RRC/LITE/MESSAGES/, $(ASN1_MSG_OBJS))
|
||||
OBJ += $(L2_OBJS) $(LIST_OBJ) $(TIMER_OBJ) $(MEM_OBJ) $(OTG_OBJS) $(MATH_OBJS)
|
||||
OBJ += $(OPENAIR1_DIR)/SIMULATION/ETH_TRANSPORT/netlink_init.o
|
||||
OBJ += $(PDCP_DIR)/pdcp_thread.o
|
||||
CFLAGS += -DOPENAIR2 -DNO_RRM -DPUCCH -DMAC_CONTEXT=1
|
||||
endif
|
||||
|
||||
CFLAGS += $(L2_incl) $(UTIL_incl) $(UTILS_incl)
|
||||
|
||||
CFLAGS += -I$(OPENAIR1_DIR) -I$(OPENAIR2_DIR)/RRC/LITE/MESSAGES #-I$(OPENAIR3_DIR)/MESH -I$(OPENAIR3_DIR)/MESH/RRM
|
||||
|
||||
CFLAGS += -DNEW_FFT -DLOG_NO_THREAD
|
||||
|
||||
ifeq ($(XFORMS),1)
|
||||
CFLAGS += -DXFORMS -I/usr/include/X11
|
||||
LDFLAGS += -lforms
|
||||
OBJ += $(OPENAIR1_DIR)/PHY/TOOLS/lte_phy_scope.o
|
||||
OBJ += stats.o
|
||||
endif
|
||||
|
||||
ifdef SMBV
|
||||
CFLAGS += -DSMBV
|
||||
endif
|
||||
|
||||
CFLAGS += -DPHYSIM -DUSER_MODE -DPC_TARGET -DPC_DSP -DNB_ANTENNAS_RX=2 -DNB_ANTENNAS_TXRX=2 -DNB_ANTENNAS_TX=2 -DPHY_CONTEXT=1
|
||||
CFLAGS += -DOPENAIR_LTE -DENABLE_FXP -DOPENAIR1 -DDLSCH_THREAD #-DULSCH_THREAD
|
||||
|
||||
#only for CBMIMO1
|
||||
ifdef CBMIMO1
|
||||
CFLAGS += -DFW2011 -DBIT8_TX -DCBMIMO1
|
||||
else
|
||||
#only for EXPRESS MIMO
|
||||
CFLAGS += -DEXMIMO
|
||||
#CFLAGS += -DEXMIMO -DTIMING_ADVANCE_HW=138 #this is for ExpressMIMO 1
|
||||
#CFLAGS += -DEXMIMO -DTIMING_ADVANCE_HW=45 #this is for ExpressMIMO 2
|
||||
endif
|
||||
|
||||
ifndef HARD_RT
|
||||
HARD_RT=1
|
||||
endif
|
||||
|
||||
ifeq ($(HARD_RT),1)
|
||||
CFLAGS += -DHARD_RT
|
||||
endif
|
||||
|
||||
ifeq ($(EMOS),1)
|
||||
CFLAGS += -DEMOS -DEMOS_CHANNEL
|
||||
LDFLAGS += -lgps
|
||||
endif
|
||||
|
||||
ifndef NAS
|
||||
NAS=1
|
||||
endif
|
||||
|
||||
ifeq ($(NAS),1)
|
||||
CFLAGS += -DPDCP_USE_NETLINK -DLINUX
|
||||
OBJ += $(NAS_OBJS)
|
||||
endif
|
||||
|
||||
RTAI_CFLAGS += $(shell rtai-config --lxrt-cflags)
|
||||
CFLAGS += -I/usr/realtime/include -DRTAI
|
||||
LDFLAGS += -lpthread -lm -lforms
|
||||
ifeq ($(RTAI),1)
|
||||
LDFLAGS += $(shell rtai-config --lxrt-ldflags)
|
||||
else
|
||||
LDFLAGS += -lrt
|
||||
endif
|
||||
|
||||
#ifndef USE_MME
|
||||
# USE_MME=R8
|
||||
#endif
|
||||
|
||||
ifdef USE_MME
|
||||
include $(OPENAIR2_DIR)/S1AP/Makefile.inc
|
||||
include $(OPENAIR2_DIR)/S1AP/MESSAGES/Makefile.inc
|
||||
CFLAGS += -DENABLE_USE_MME -DENB_MODE
|
||||
LDFLAGS += -lsctp
|
||||
CFLAGS_S1AP += -DENB_MODE -DENABLE_USE_MME -DEMIT_ASN_DEBUG=1 -DUSER_MODE
|
||||
S1AP_BUILT_OBJS += $(S1AP_OBJS) $(addprefix $(OPENAIR2_DIR)/S1AP/MESSAGES/, $(S1AP_ASN_MODULE_SOURCES))
|
||||
S1AP_BUILT_OBJS += $(OPENAIR3_DIR)/OPENAIRMME/SCTP/sctp_primitives_client.o
|
||||
endif
|
||||
|
||||
|
||||
ASN1RELDIR=R9.8
|
||||
ifeq ($(USE_MME), R8)
|
||||
ASN1RELDIR=R8.10
|
||||
else
|
||||
CFLAGS_S1AP += -DUPDATE_RELEASE_9
|
||||
endif
|
||||
S1AP_DIR=$(OPENAIR2_DIR)/S1AP
|
||||
ASN1MESSAGESDIR=$(S1AP_DIR)/MESSAGES
|
||||
ASN1DIR=$(ASN1MESSAGESDIR)/ASN1
|
||||
|
||||
all: lte-enb
|
||||
|
||||
$(LFDS_DIR)/bin/liblfds611.a:
|
||||
$(MAKE) -C $(LFDS_DIR) -f makefile.linux
|
||||
|
||||
|
||||
$(RTAI_OBJ): %.o : %.c
|
||||
@echo Compiling $< ...
|
||||
@$(CC) -c $(CFLAGS) $(EXTRA_CFLAGS) $(RTAI_CFLAGS) -o $@ $<
|
||||
|
||||
$(OBJ) $(ASN1_MSG_OBJS1): %.o : %.c
|
||||
@echo Compiling $< ...
|
||||
@$(CC) -c $(CFLAGS) $(EXTRA_CFLAGS) -o $@ $<
|
||||
|
||||
$(S1AP_BUILT_OBJS): %.o : %.c
|
||||
@echo Compiling $<
|
||||
@$(CC) -Wall -c $(CFLAGS_S1AP) $(S1AP_Incl) $(UTIL_incl) -o $@ $<
|
||||
|
||||
$(ASN1MESSAGESDIR)/s1ap_ieregen.stamp: $(ASN1DIR)/$(ASN1RELDIR)/S1AP-PDU-Contents.asn $(ASN1DIR)/asn1tostruct.py
|
||||
echo Timestamp > $@
|
||||
(cd $(ASN1DIR) && python $(ASN1DIR)/asn1tostruct.py -f$<)
|
||||
|
||||
$(ASN1MESSAGESDIR)/s1ap_asn1regen.stamp: $(ASN1DIR)/$(ASN1RELDIR)/S1AP-CommonDataTypes.asn $(ASN1DIR)/$(ASN1RELDIR)/S1AP-Constants.asn $(ASN1DIR)/$(ASN1RELDIR)/S1AP-IEs.asn $(ASN1DIR)/$(ASN1RELDIR)/S1AP-PDU.asn
|
||||
echo Timestamp > $@
|
||||
(cd $(ASN1MESSAGESDIR) && asn1c -gen-PER -fnative-types -fskeletons-copy $^)
|
||||
|
||||
$(S1AP_DIR)/libs1ap.a: $(ASN1MESSAGESDIR)/s1ap_ieregen.stamp $(ASN1MESSAGESDIR)/s1ap_asn1regen.stamp $(S1AP_BUILT_OBJS)
|
||||
@echo Creating $@
|
||||
$(AR) rcs $@ $^
|
||||
|
||||
$(LFDS_DIR)/bin/liblfds611.a:
|
||||
$(MAKE) -C $(LFDS_DIR) -f makefile.linux
|
||||
|
||||
ifdef USE_MME
|
||||
lte-enb: $(OBJ) $(S1AP_DIR)/libs1ap.a $(ASN1_MSG_OBJS1) $(RTAI_OBJ) $(LFDS_DIR)/bin/liblfds611.a
|
||||
else
|
||||
lte-enb: $(OBJ) $(ASN1_MSG_OBJS1) $(RTAI_OBJ) $(LFDS_DIR)/bin/liblfds611.a
|
||||
endif
|
||||
$(CC) $(CFLAGS) $(EXTRA_CFLAGS) $(OBJ) $(RTAI_OBJ) $(ASN1_MSG_OBJS1) -o lte-enb $(LDFLAGS) $(LFDS_DIR)/bin/liblfds611.a
|
||||
|
||||
|
||||
|
||||
nasmesh:
|
||||
(cd $(OPENAIR2_DIR)/NAS/DRIVER/MESH/RB_TOOL && $(MAKE))
|
||||
(cd $(OPENAIR2_DIR) && $(MAKE) nasmesh_netlink.ko)
|
||||
(sudo insmod $(OPENAIR2_DIR)/NAS/DRIVER/MESH/nasmesh.ko)
|
||||
rb_tool:
|
||||
(cd $(OPENAIR2_DIR)/NAS/DRIVER/MESH/RB_TOOL && $(MAKE))
|
||||
|
||||
nasmesh_install:
|
||||
(sudo rmmod nasmesh)
|
||||
(sudo insmod $(OPENAIR2_DIR)/NAS/DRIVER/MESH/nasmesh.ko)
|
||||
|
||||
clean:
|
||||
rm -rf $(OBJ) $(RTAI_OBJ)
|
||||
rm -f $(S1AP_BUILT_OBJS)
|
||||
rm -f $(ASN1MESSAGESDIR)/libs1ap.a
|
||||
|
||||
cleanasn1:
|
||||
rm -f $(ASN1_MSG_OBJS1)
|
||||
$(shell cd $(OPENAIR2_DIR)/RRC/LITE/MESSAGES ; rm -f $(ASN_MODULE_SOURCES) $(ASN_MODULE_HEADERS) *.o *.d )
|
||||
rm -f $(OPENAIR2_DIR)/RRC/LITE/MESSAGES/Makefile.am.sample
|
||||
rm -f $(OPENAIR2_DIR)/RRC/LITE/MESSAGES/Makefile.inc.generated
|
||||
rm -f $(OPENAIR2_DIR)/RRC/LITE/MESSAGES/asn1c/ASN1_files/.lock-rel8
|
||||
rm -f $(OPENAIR2_DIR)/RRC/LITE/MESSAGES/asn1c/ASN1_files/.lock-rel10
|
||||
|
||||
cleanall: clean cleanasn1
|
||||
rm -rf condtest synctest lte-softmodem
|
||||
rm -rf synctest_eNB synctest_UE
|
||||
|
||||
show:
|
||||
@echo $(CFLAGS)
|
||||
@echo $(EXTRA_CFLAGS)
|
||||
@echo $(OBJ) $(RTAI_OBJ)
|
||||
@echo rrc_cellular variable is $(rrc_cellular)
|
||||
@echo eNB_flag is $(eNB_flag)
|
||||
@echo UE_flag is $(UE_flag)
|
||||
@echo IS_REL8 is $(IS_REL8)
|
||||
@echo IS_REL10 is $(IS_REL10)
|
||||
|
||||
beautiful:
|
||||
astyle --style=gnu -s2 $(SRC)
|
||||
@@ -1,21 +0,0 @@
|
||||
CFLAGS = $(shell rtai-config --lxrt-cflags)
|
||||
LDFLAGS = $(shell rtai-config --lxrt-ldflags) -lpthread -llxrt -lm
|
||||
|
||||
CFLAGS += -D__IN_RTAI__ -Wall -O2 -I.
|
||||
|
||||
OBJS = msg_many.o msg_helper.o
|
||||
|
||||
all: msg_many
|
||||
|
||||
msg_many: $(OBJS)
|
||||
$(CC) $(LDFLAGS) -o $@ $(OBJS)
|
||||
|
||||
$(OBJS): msg_many.h
|
||||
|
||||
run: msg_many
|
||||
rtai-load msg_many --verbose
|
||||
|
||||
.PHONY: clean
|
||||
clean:
|
||||
rm -f msg_many $(OBJS)
|
||||
|
||||
@@ -1,548 +0,0 @@
|
||||
/*
|
||||
* Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
|
||||
* contributor license agreements. See the NOTICE file distributed with
|
||||
* this work for additional information regarding copyright ownership.
|
||||
* The OpenAirInterface Software Alliance licenses this file to You under
|
||||
* the OAI Public License, Version 1.1 (the "License"); you may not use this file
|
||||
* except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.openairinterface.org/?page_id=698
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*-------------------------------------------------------------------------------
|
||||
* For more information about the OpenAirInterface (OAI) Software Alliance:
|
||||
* contact@openairinterface.org
|
||||
*/
|
||||
|
||||
/*! \file UE_transport_IQ.c
|
||||
* \brief UE transport IQ sampels
|
||||
* \author Katerina Trilyraki, Navid Nikaein, Raymond Knopp
|
||||
* \date 2015
|
||||
* \version 0.1
|
||||
* \company Eurecom
|
||||
* \maintainer: navid.nikaein@eurecom.fr
|
||||
* \note
|
||||
* \warning very experimental
|
||||
*/
|
||||
|
||||
#include <unistd.h>
|
||||
#include <time.h>
|
||||
#include <pthread.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <signal.h>
|
||||
|
||||
#include "common_lib.h"
|
||||
#include "PHY/defs.h"
|
||||
#include "rrh_gw.h"
|
||||
#include "rrh_gw_externs.h"
|
||||
|
||||
#define START_CMD 1
|
||||
#define RRH_UE_PORT 51000
|
||||
#define RRH_UE_DEST_IP "127.0.0.1"
|
||||
#define PRINTF_PERIOD 3750
|
||||
|
||||
/******************************************************************************
|
||||
** FUNCTION PROTOTYPES **
|
||||
******************************************************************************/
|
||||
void *rrh_proc_UE_thread(void *);
|
||||
void *rrh_UE_thread(void *);
|
||||
void *rrh_UE_rx_thread(void *);
|
||||
void *rrh_UE_tx_thread(void *);
|
||||
|
||||
|
||||
|
||||
openair0_timestamp timestamp_UE_tx[4]= {0,0,0,0},timestamp_UE_rx[4]= {0,0,0,0};
|
||||
openair0_timestamp nrt_UE_counter[4]= {0,0,0,0};
|
||||
|
||||
pthread_t main_rrh_UE_thread,main_rrh_proc_UE_thread;
|
||||
pthread_attr_t attr, attr_proc;
|
||||
struct sched_param sched_param_rrh, sched_param_rrh_proc;
|
||||
pthread_cond_t sync_UE_cond[4];
|
||||
pthread_mutex_t sync_UE_mutex[4];
|
||||
|
||||
int32_t overflow_rx_buffer_UE[4]= {0,0,0,0};
|
||||
int32_t nsamps_UE[4]= {0,0,0,0};
|
||||
int32_t UE_tx_started=0,UE_rx_started=0;
|
||||
int32_t RT_flag_UE=0, NRT_flag_UE=1;
|
||||
int32_t counter_UE_rx[4]= {0,0,0,0};
|
||||
int32_t counter_UE_tx[4]= {0,0,0,0};
|
||||
int32_t **tx_buffer_UE, **rx_buffer_UE;
|
||||
|
||||
int sync_UE_rx[4]= {-1,-1,-1,-1};
|
||||
void *rrh_UE_thread_status;
|
||||
|
||||
|
||||
void *rx_ue[2]; // FIXME hard coded array size; indexed by lte_frame_parms.nb_antennas_rx
|
||||
void *tx_ue[2]; // FIXME hard coded array size; indexed by lte_frame_parms.nb_antennas_tx
|
||||
|
||||
|
||||
void config_UE_mod( rrh_module_t *dev_ue, uint8_t RT_flag,uint8_t NRT_flag) {
|
||||
|
||||
int i;
|
||||
int error_code_UE, error_code_proc_UE;
|
||||
|
||||
RT_flag_UE=RT_flag;
|
||||
NRT_flag_UE=NRT_flag;
|
||||
|
||||
pthread_attr_init(&attr);
|
||||
sched_param_rrh.sched_priority = sched_get_priority_max(SCHED_FIFO);
|
||||
pthread_attr_init(&attr_proc);
|
||||
sched_param_rrh_proc.sched_priority = sched_get_priority_max(SCHED_FIFO-1);
|
||||
|
||||
pthread_attr_setschedparam(&attr,&sched_param_rrh);
|
||||
pthread_attr_setschedpolicy(&attr,SCHED_FIFO);
|
||||
pthread_attr_setschedparam(&attr_proc,&sched_param_rrh_proc);
|
||||
pthread_attr_setschedpolicy(&attr_proc,SCHED_FIFO-1);
|
||||
|
||||
|
||||
for (i=0; i<4; i++) {
|
||||
pthread_mutex_init(&sync_UE_mutex[i],NULL);
|
||||
pthread_cond_init(&sync_UE_cond[i],NULL);
|
||||
}
|
||||
|
||||
error_code_UE = pthread_create(&main_rrh_UE_thread, &attr, rrh_UE_thread, (void *)dev_ue);
|
||||
error_code_proc_UE = pthread_create(&main_rrh_proc_UE_thread, &attr_proc, rrh_proc_UE_thread, (void *)dev_ue);
|
||||
|
||||
if (error_code_UE) {
|
||||
printf("Error while creating UE thread\n");
|
||||
exit(-1);
|
||||
}
|
||||
|
||||
if (error_code_proc_UE) {
|
||||
printf("Error while creating UE proc thread\n");
|
||||
exit(-1);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
/*! \fn void *rrh_proc_UE_thread((void *)dev_ue)
|
||||
* \brief this function
|
||||
* \param[in]
|
||||
* \param[out]
|
||||
* \return
|
||||
* \note
|
||||
* @ingroup _oai
|
||||
*/
|
||||
void *rrh_proc_UE_thread(void * arg) {
|
||||
|
||||
int antenna_index,i;
|
||||
openair0_timestamp truncated_timestamp, truncated_timestamp_final, last_hw_counter=0;
|
||||
struct timespec time_req, time_rem;
|
||||
int16_t *txp,*rxp;
|
||||
unsigned int samples_per_frame=0;
|
||||
rrh_module_t *dev=(rrh_module_t *)arg;
|
||||
|
||||
samples_per_frame= dev->eth_dev.openair0_cfg->samples_per_frame;
|
||||
AssertFatal(samples_per_frame <=0, "invalide samples_per_frame !%u\n",samples_per_frame);
|
||||
|
||||
time_req.tv_sec = 0;
|
||||
time_req.tv_nsec = 1000;
|
||||
|
||||
while (rrh_exit==0) {
|
||||
//wait until some data has been copied
|
||||
for (antenna_index=0; antenna_index<4; antenna_index++) {
|
||||
if (sync_UE_rx[antenna_index]==0) {
|
||||
if (!UE_tx_started) {
|
||||
UE_tx_started=1; //Set this flag to 1 to indicate that a UE started retrieving data
|
||||
if (RT_flag_UE==1) {
|
||||
last_hw_counter=hw_counter;
|
||||
}
|
||||
} else {
|
||||
if (RT_flag_UE==1) {
|
||||
if (hw_counter > last_hw_counter+1) {
|
||||
printf("L1");
|
||||
// goto end_copy_UE;
|
||||
} else {
|
||||
while (hw_counter < last_hw_counter+1)
|
||||
nanosleep(&time_req,&time_rem);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
truncated_timestamp = timestamp_UE_tx[antenna_index]%(samples_per_frame);
|
||||
truncated_timestamp_final = (timestamp_UE_tx[antenna_index]+nsamps_UE[antenna_index])%samples_per_frame;
|
||||
|
||||
if ((truncated_timestamp + nsamps_UE[antenna_index]) > samples_per_frame) {
|
||||
if ((timestamp_eNB_rx[antenna_index]%samples_per_frame < nsamps_UE[antenna_index]) && (eNB_rx_started==1)) {
|
||||
overflow_rx_buffer_eNB[antenna_index]++;
|
||||
printf("eNB Overflow[%d] : %d, timestamp : %d\n",antenna_index,overflow_rx_buffer_eNB[antenna_index],(int)truncated_timestamp);
|
||||
|
||||
if (NRT_flag_UE==1) {
|
||||
while ((timestamp_eNB_rx[antenna_index]%samples_per_frame) < nsamps_UE[antenna_index])
|
||||
nanosleep(&time_req,&time_rem);
|
||||
}
|
||||
}
|
||||
|
||||
rxp = (int16_t*)&rx_buffer_eNB[antenna_index][truncated_timestamp];
|
||||
txp = (int16_t*)&tx_buffer_UE[antenna_index][truncated_timestamp];
|
||||
|
||||
for (i=0; i<(samples_per_frame<<1)-(truncated_timestamp<<1); i++) {
|
||||
rxp[i] = txp[i]>>6;
|
||||
}
|
||||
|
||||
rxp = (int16_t*)&rx_buffer_eNB[antenna_index][0];
|
||||
txp = (int16_t*)&tx_buffer_UE[antenna_index][0];
|
||||
|
||||
for (i=0; i<nsamps_eNB[antenna_index]-(samples_per_frame)+(truncated_timestamp); i++) {
|
||||
rxp[i] = txp[i]>>6;
|
||||
}
|
||||
|
||||
} else {
|
||||
if (((truncated_timestamp < (timestamp_eNB_rx[antenna_index]%samples_per_frame)) &&
|
||||
(truncated_timestamp_final > (timestamp_eNB_rx[antenna_index]%samples_per_frame))) &&
|
||||
(eNB_rx_started==1)) {
|
||||
overflow_rx_buffer_eNB[antenna_index]++;
|
||||
printf("eNB Overflow[%d] : %d, timestamp : %d\n",antenna_index,overflow_rx_buffer_eNB[antenna_index],(int)truncated_timestamp);
|
||||
|
||||
if (NRT_flag_UE==1) {
|
||||
while (truncated_timestamp_final > timestamp_eNB_rx[antenna_index]%samples_per_frame)
|
||||
nanosleep(&time_req,&time_rem);
|
||||
}
|
||||
}
|
||||
|
||||
rxp = (int16_t*)&rx_buffer_eNB[antenna_index][truncated_timestamp];
|
||||
txp = (int16_t*)&tx_buffer_UE[antenna_index][truncated_timestamp];
|
||||
|
||||
for (i=0; i<(nsamps_eNB[antenna_index]); i++) {
|
||||
rxp[i] =txp[i]>>6;
|
||||
}
|
||||
|
||||
}
|
||||
//end_copy_UE :
|
||||
last_hw_counter=hw_counter;
|
||||
pthread_mutex_lock(&sync_UE_mutex[antenna_index]);
|
||||
sync_UE_rx[antenna_index]--;
|
||||
pthread_mutex_unlock(&sync_UE_mutex[antenna_index]);
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
return(0);
|
||||
}
|
||||
|
||||
/*! \fn void *rrh_UE_thread(void *arg)
|
||||
* \brief this function
|
||||
* \param[in]
|
||||
* \param[out]
|
||||
* \return
|
||||
* \note
|
||||
* @ingroup _oai
|
||||
*/
|
||||
void *rrh_UE_thread(void *arg) {
|
||||
|
||||
rrh_module_t *dev=(rrh_module_t *)arg;
|
||||
|
||||
struct sched_param sched_param_UE_rx, sched_param_UE_tx;
|
||||
int16_t i,cmd; //,nsamps,antenna_index;
|
||||
//struct timespec time_req_1us;
|
||||
pthread_t UE_rx_thread, UE_tx_thread;
|
||||
pthread_attr_t attr_UE_rx, attr_UE_tx;
|
||||
int error_code_UE_rx, error_code_UE_tx;
|
||||
void *tmp;
|
||||
unsigned int samples_per_frame=0;
|
||||
|
||||
samples_per_frame= dev->eth_dev.openair0_cfg->samples_per_frame;
|
||||
//time_req_1us.tv_sec = 0;
|
||||
//time_req_1us.tv_nsec = 1000;
|
||||
|
||||
while (rrh_exit==0) {
|
||||
|
||||
cmd=dev->eth_dev.trx_start_func(&dev->eth_dev);
|
||||
|
||||
/* allocate memory for TX/RX buffers */
|
||||
rx_buffer_UE = (int32_t**)malloc16(dev->eth_dev.openair0_cfg->rx_num_channels*sizeof(int32_t*));
|
||||
tx_buffer_UE = (int32_t**)malloc16(dev->eth_dev.openair0_cfg->tx_num_channels*sizeof(int32_t*));
|
||||
|
||||
for (i=0; i<dev->eth_dev.openair0_cfg->rx_num_channels; i++) {
|
||||
tmp=(void *)malloc(sizeof(int32_t)*(samples_per_frame+4));
|
||||
memset(tmp,0,sizeof(int32_t)*(samples_per_frame+4));
|
||||
rx_buffer_UE[i]=(tmp+4*sizeof(int32_t));
|
||||
}
|
||||
|
||||
for (i=0; i<dev->eth_dev.openair0_cfg->tx_num_channels; i++) {
|
||||
tmp=(void *)malloc(sizeof(int32_t)*(samples_per_frame+4));
|
||||
memset(tmp,0,sizeof(int32_t)*(samples_per_frame+4));
|
||||
tx_buffer_UE[i]=(tmp+4*sizeof(int32_t));
|
||||
}
|
||||
|
||||
printf("Client %s:%d is connected (DL_RB=%d) rt=%d|%d. \n" , dev->eth_dev.openair0_cfg->remote_addr,
|
||||
dev->eth_dev.openair0_cfg->remote_port,
|
||||
dev->eth_dev.openair0_cfg->num_rb_dl,
|
||||
dev->eth_dev.openair0_cfg->rx_num_channels,
|
||||
dev->eth_dev.openair0_cfg->tx_num_channels);
|
||||
|
||||
if (cmd==START_CMD) {
|
||||
|
||||
pthread_attr_init(&attr_UE_rx);
|
||||
pthread_attr_init(&attr_UE_tx);
|
||||
sched_param_UE_rx.sched_priority = sched_get_priority_max(SCHED_FIFO);
|
||||
sched_param_UE_tx.sched_priority = sched_get_priority_max(SCHED_FIFO);
|
||||
pthread_attr_setschedparam(&attr_UE_rx,&sched_param_UE_rx);
|
||||
pthread_attr_setschedparam(&attr_UE_tx,&sched_param_UE_tx);
|
||||
pthread_attr_setschedpolicy(&attr_UE_rx,SCHED_FIFO);
|
||||
pthread_attr_setschedpolicy(&attr_UE_tx,SCHED_FIFO);
|
||||
|
||||
error_code_UE_rx = pthread_create(&UE_rx_thread, &attr_UE_rx, rrh_UE_rx_thread, (void *)&dev);
|
||||
error_code_UE_tx = pthread_create(&UE_tx_thread, &attr_UE_tx, rrh_UE_tx_thread, (void *)&dev);
|
||||
|
||||
if (error_code_UE_rx) {
|
||||
printf("Error while creating UE RX thread\n");
|
||||
exit(-1);
|
||||
}
|
||||
|
||||
if (error_code_UE_tx) {
|
||||
printf("Error while creating UE TX thread\n");
|
||||
exit(-1);
|
||||
}
|
||||
|
||||
while (rrh_exit==0)
|
||||
sleep(1);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
rrh_UE_thread_status = 0;
|
||||
pthread_exit(&rrh_UE_thread_status);
|
||||
|
||||
return(0);
|
||||
}
|
||||
|
||||
|
||||
/*! \fn void *rrh_UE_rx_thread(void *arg)
|
||||
* \brief this function
|
||||
* \param[in]
|
||||
* \param[out]
|
||||
* \return
|
||||
* \note
|
||||
* @ingroup _oai
|
||||
*/
|
||||
void *rrh_UE_rx_thread(void *arg) {
|
||||
|
||||
rrh_module_t *dev = (rrh_module_t *)arg;
|
||||
struct timespec time0,time1,time2;
|
||||
struct timespec time_req_1us, time_rem_1us;
|
||||
ssize_t bytes_sent;
|
||||
int antenna_index, nsamps;
|
||||
int trace_cnt=0;
|
||||
unsigned long long max_rx_time=0, min_rx_time=133333, total_rx_time=0, average_rx_time=133333, s_period=0, trial=0;
|
||||
unsigned int samples_per_frame=0;
|
||||
openair0_timestamp last_hw_counter=0;
|
||||
|
||||
antenna_index = 0;
|
||||
nsamps = dev->eth_dev.openair0_cfg->samples_per_packet;
|
||||
samples_per_frame = dev->eth_dev.openair0_cfg->samples_per_frame;
|
||||
|
||||
/* TODO: check if setting time0 has to be done here */
|
||||
clock_gettime(CLOCK_MONOTONIC,&time0);
|
||||
|
||||
while (rrh_exit == 0) {
|
||||
if (!UE_rx_started) {
|
||||
UE_rx_started=1; //Set this flag to 1 to indicate that a UE started retrieving data
|
||||
|
||||
if (RT_flag_UE==1) {
|
||||
last_hw_counter=hw_counter;
|
||||
}
|
||||
} else {
|
||||
if (RT_flag_UE==1) {
|
||||
if (hw_counter > last_hw_counter+1) {
|
||||
printf("L1");
|
||||
//goto end_copy_UE;
|
||||
} else {
|
||||
while (hw_counter < last_hw_counter+1)
|
||||
nanosleep(&time_req_1us,&time_rem_1us);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
clock_gettime(CLOCK_MONOTONIC,&time1);
|
||||
|
||||
// send return
|
||||
|
||||
if ((timestamp_UE_rx[antenna_index]%(samples_per_frame)+nsamps) > samples_per_frame) { // Wrap around if nsamps exceeds the buffer limit
|
||||
if (((timestamp_eNB_tx[antenna_index]%(samples_per_frame)) < ((timestamp_UE_rx[antenna_index]+nsamps)%(samples_per_frame))) && (eNB_tx_started==1)) {
|
||||
printf("UE underflow wraparound timestamp_UE_rx : %d, timestamp_eNB_tx : %d\n",
|
||||
(int)(timestamp_UE_rx[antenna_index]%(samples_per_frame)),
|
||||
(int)(timestamp_eNB_tx[antenna_index]%samples_per_frame));
|
||||
|
||||
if (NRT_flag_UE==1) {
|
||||
while ((timestamp_eNB_tx[antenna_index]%samples_per_frame) < ((timestamp_UE_rx[antenna_index]+nsamps)%(samples_per_frame)))
|
||||
nanosleep(&time_req_1us,&time_rem_1us);
|
||||
}
|
||||
}
|
||||
|
||||
rx_ue[antenna_index]=(void*)&rx_buffer_UE[antenna_index][timestamp_UE_rx[antenna_index]%(samples_per_frame)];
|
||||
if ((bytes_sent =dev->eth_dev.trx_write_func (dev,
|
||||
timestamp_UE_rx[antenna_index],
|
||||
rx_ue,
|
||||
( samples_per_frame- (timestamp_eNB_rx[antenna_index]%(samples_per_frame)) ),
|
||||
antenna_index,
|
||||
0))<0)
|
||||
perror("RRH UE : sendto for RX");
|
||||
|
||||
rx_ue[antenna_index]=(void*)&rx_buffer_UE[antenna_index][3];
|
||||
if ((bytes_sent =dev->eth_dev.trx_write_func (dev,
|
||||
timestamp_UE_rx[antenna_index],
|
||||
rx_ue,
|
||||
(nsamps - samples_per_frame + (timestamp_eNB_rx[antenna_index]%(samples_per_frame))),
|
||||
antenna_index,
|
||||
0))<0)
|
||||
perror("RRH UE : sendto for RX");
|
||||
|
||||
} else {
|
||||
if (((timestamp_UE_rx[antenna_index]%samples_per_frame)< timestamp_eNB_tx[antenna_index]%samples_per_frame) &&
|
||||
(((timestamp_UE_rx[antenna_index]+nsamps)%samples_per_frame) > (timestamp_eNB_tx[antenna_index]%samples_per_frame)) &&
|
||||
(eNB_tx_started==1) ) {
|
||||
printf("UE underflow timestamp_UE_rx : %d, timestamp_eNB_tx : %d\n",
|
||||
(int)(timestamp_UE_rx[antenna_index]%samples_per_frame),
|
||||
(int)(timestamp_eNB_tx[antenna_index]%samples_per_frame));
|
||||
|
||||
if (NRT_flag_UE==1) {
|
||||
while (((timestamp_UE_rx[antenna_index]+nsamps)%samples_per_frame) > (timestamp_eNB_tx[antenna_index]%samples_per_frame)) {
|
||||
nanosleep(&time_req_1us,&time_rem_1us);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
rx_ue[antenna_index]=(void*)&rx_buffer_UE[antenna_index][timestamp_UE_rx[antenna_index]%(samples_per_frame)];
|
||||
if ((bytes_sent = dev->eth_dev.trx_write_func (dev,
|
||||
timestamp_UE_rx[antenna_index],
|
||||
rx_ue,
|
||||
nsamps,
|
||||
antenna_index,
|
||||
0))<0)
|
||||
perror("RRH UE thread: sendto for RX");
|
||||
}
|
||||
|
||||
timestamp_UE_rx[antenna_index]+=nsamps;
|
||||
last_hw_counter=hw_counter;
|
||||
|
||||
clock_gettime(CLOCK_MONOTONIC,&time2);
|
||||
|
||||
if (trace_cnt++ > 10) {
|
||||
total_rx_time = (unsigned int)(time2.tv_nsec - time0.tv_nsec);
|
||||
|
||||
if (total_rx_time < 0) total_rx_time=1000000000-total_rx_time;
|
||||
|
||||
if ((total_rx_time > 0) && (total_rx_time < 1000000000)) {
|
||||
trial++;
|
||||
|
||||
if (total_rx_time < min_rx_time)
|
||||
min_rx_time = total_rx_time;
|
||||
|
||||
if (total_rx_time > max_rx_time)
|
||||
max_rx_time = total_rx_time;
|
||||
|
||||
average_rx_time = (long long unsigned int)((average_rx_time*trial)+total_rx_time)/(trial+1);
|
||||
}
|
||||
|
||||
if (s_period++ == PRINTF_PERIOD) {
|
||||
s_period=0;
|
||||
printf("Average UE RX time : %llu\tMax RX time : %llu\tMin RX time : %llu\n",average_rx_time,max_rx_time,min_rx_time);
|
||||
|
||||
}
|
||||
|
||||
//printf("RX: t1 %llu (time from last send), t2 %llu (sendto of %lu bytes) total time : %llu\n",(long long unsigned int)(time1.tv_nsec - time0.tv_nsec), (long long unsigned int)(time2.tv_nsec - time1.tv_nsec),
|
||||
// (nsamps<<2)+sizeof(openair0_timestamp),(long long unsigned int)(time2.tv_nsec - time0.tv_nsec));
|
||||
|
||||
}
|
||||
|
||||
memcpy(&time0,&time2,sizeof(struct timespec));
|
||||
|
||||
} //while (UE_exit==0)
|
||||
|
||||
return(0);
|
||||
|
||||
}
|
||||
|
||||
|
||||
/*! \fn void *rrh_UE_tx_thread(void *arg)
|
||||
* \brief this function
|
||||
* \param[in]
|
||||
* \param[out]
|
||||
* \return
|
||||
* \note
|
||||
* @ingroup _oai
|
||||
*/
|
||||
void *rrh_UE_tx_thread(void *arg) {
|
||||
|
||||
struct timespec time0a,time0,time1,time2;
|
||||
struct timespec time_req_1us, time_rem_1us;
|
||||
|
||||
|
||||
rrh_module_t *dev = (rrh_module_t *)arg;
|
||||
ssize_t bytes_received;
|
||||
int antenna_index, nsamps;
|
||||
unsigned int samples_per_frame=0;
|
||||
|
||||
antenna_index = 0;
|
||||
nsamps = dev->eth_dev.openair0_cfg->samples_per_packet;
|
||||
samples_per_frame = dev->eth_dev.openair0_cfg->samples_per_frame;
|
||||
|
||||
|
||||
while (rrh_exit == 0) {
|
||||
|
||||
clock_gettime(CLOCK_MONOTONIC,&time0a);
|
||||
|
||||
bytes_received = dev->eth_dev.trx_read_func(dev,
|
||||
×tamp_UE_tx[antenna_index],
|
||||
tx_ue,
|
||||
nsamps,
|
||||
antenna_index);
|
||||
|
||||
clock_gettime(CLOCK_MONOTONIC,&time1);
|
||||
|
||||
if (NRT_flag_UE==1) {
|
||||
nrt_UE_counter[antenna_index]++;
|
||||
}
|
||||
printf(" first part size: %d second part size: %"PRId64" idx=%"PRId64"\n",
|
||||
(int32_t)(((samples_per_frame)<<2)-((timestamp_UE_tx[antenna_index]%(samples_per_frame))<<2)),
|
||||
(nsamps<<2)-((samples_per_frame)<<2)+((timestamp_UE_tx[antenna_index]%(samples_per_frame))<<2),
|
||||
timestamp_UE_tx[antenna_index]%(samples_per_frame));
|
||||
if ((timestamp_UE_tx[antenna_index]%(samples_per_frame)+nsamps) > samples_per_frame) { // Wrap around if nsamps exceeds the buffer limit
|
||||
memcpy(&tx_buffer_UE[antenna_index][timestamp_UE_tx[antenna_index]%(samples_per_frame)],(void*)(tx_ue[antenna_index]),
|
||||
(samples_per_frame<<2)-((timestamp_UE_tx[antenna_index]%(samples_per_frame))<<2));
|
||||
|
||||
memcpy(&tx_buffer_UE[antenna_index][0], (void*)(tx_ue[antenna_index]+(samples_per_frame*4)-((timestamp_UE_tx[antenna_index]%(samples_per_frame))<<2)),
|
||||
(nsamps<<2)-((samples_per_frame-(timestamp_UE_tx[antenna_index]%(samples_per_frame)))<<2));
|
||||
//printf("Received UE TX samples for antenna %d, nsamps %d (%d)\n",antenna_index,nsamps,(int)(bytes_received>>2));
|
||||
} else {
|
||||
memcpy(&tx_buffer_UE[antenna_index][timestamp_UE_tx[antenna_index]%(samples_per_frame)], (void*)(tx_ue[antenna_index]),(nsamps<<2));
|
||||
}
|
||||
|
||||
while (sync_UE_rx[antenna_index]==0)
|
||||
nanosleep(&time_req_1us,&time_rem_1us);
|
||||
|
||||
pthread_mutex_lock(&sync_UE_mutex[antenna_index]);
|
||||
sync_UE_rx[antenna_index]++;
|
||||
|
||||
if (!sync_UE_rx[antenna_index]) {
|
||||
counter_UE_tx[antenna_index]=(counter_UE_tx[antenna_index]+nsamps)%samples_per_frame;
|
||||
nsamps_UE[antenna_index]=nsamps;
|
||||
} else {
|
||||
printf("rrh_eNB_proc thread is busy, will exit\n");
|
||||
exit(-1);
|
||||
}
|
||||
|
||||
pthread_mutex_unlock(&sync_UE_mutex[antenna_index]);
|
||||
|
||||
clock_gettime(CLOCK_MONOTONIC,&time2);
|
||||
|
||||
memcpy(&time0,&time2,sizeof(struct timespec));
|
||||
|
||||
}
|
||||
|
||||
return(0);
|
||||
|
||||
}
|
||||
|
||||
|
||||
@@ -1,173 +0,0 @@
|
||||
/*
|
||||
* Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
|
||||
* contributor license agreements. See the NOTICE file distributed with
|
||||
* this work for additional information regarding copyright ownership.
|
||||
* The OpenAirInterface Software Alliance licenses this file to You under
|
||||
* the OAI Public License, Version 1.1 (the "License"); you may not use this file
|
||||
* except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.openairinterface.org/?page_id=698
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*-------------------------------------------------------------------------------
|
||||
* For more information about the OpenAirInterface (OAI) Software Alliance:
|
||||
* contact@openairinterface.org
|
||||
*/
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <unistd.h>
|
||||
#include <string.h>
|
||||
#include <sys/types.h>
|
||||
#include <sys/mman.h>
|
||||
#include <sys/stat.h>
|
||||
#include <fcntl.h>
|
||||
#include <sched.h>
|
||||
|
||||
|
||||
#include <rtai_lxrt.h>
|
||||
#include <rtai_sem.h>
|
||||
#include <rtai_msg.h>
|
||||
|
||||
#define PERIOD 100000000
|
||||
#define THRESHOLD 1
|
||||
|
||||
static SEM *mutex;
|
||||
static CND *cond;
|
||||
|
||||
static int thread0;
|
||||
static int thread1;
|
||||
|
||||
static int instance_cnt=-1; //0 means worker is busy, -1 means its free
|
||||
|
||||
static void *fun0(void *arg)
|
||||
{
|
||||
RT_TASK *task;
|
||||
int done1=0, cnt1=0;
|
||||
RTIME right_now;
|
||||
int ret;
|
||||
|
||||
task = rt_task_init_schmod(nam2num("TASK0"), 0, 0, 0, SCHED_FIFO, 0xF);
|
||||
mlockall(MCL_CURRENT | MCL_FUTURE);
|
||||
|
||||
rt_make_hard_real_time();
|
||||
|
||||
while (cnt1 < THRESHOLD) {
|
||||
rt_sem_wait(mutex);
|
||||
rt_printk("fun0: Hello World %d, instance_cnt %d!\n",cnt1,instance_cnt);
|
||||
|
||||
while (instance_cnt<0) {
|
||||
ret = rt_cond_wait(cond, mutex);
|
||||
|
||||
if (ret != 0) {
|
||||
rt_printk("error in rt_cond_wait, code %d\n",ret);
|
||||
|
||||
switch (ret) {
|
||||
case RTE_PERM:
|
||||
rt_printk("error RTE_PERM %d\n",ret);
|
||||
break;
|
||||
|
||||
case RTE_UNBLKD:
|
||||
rt_printk("error RTE_UNBLKD %d\n",ret);
|
||||
break;
|
||||
|
||||
case RTE_OBJREM:
|
||||
rt_printk("error RTE_OBJREM %d\n",ret);
|
||||
break;
|
||||
|
||||
default:
|
||||
rt_printk("unknown error code %d\n",ret);
|
||||
break;
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
rt_sem_signal(mutex);
|
||||
|
||||
// do some work here
|
||||
cnt1++;
|
||||
|
||||
rt_sem_wait(mutex);
|
||||
instance_cnt--;
|
||||
rt_sem_signal(mutex);
|
||||
|
||||
}
|
||||
|
||||
// makes task soft real time
|
||||
rt_make_soft_real_time();
|
||||
|
||||
printf("Back to soft RT\n");
|
||||
// clean task
|
||||
rt_task_delete(task);
|
||||
printf("Task deleted. returning\n");
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
int main(void)
|
||||
{
|
||||
RT_TASK *task;
|
||||
RTIME now;
|
||||
int cnt=0;
|
||||
|
||||
// make main thread LXRT soft realtime
|
||||
task = rt_task_init_schmod(nam2num("MYTASK"), 9, 0, 0, SCHED_FIFO, 0xF);
|
||||
mlockall(MCL_CURRENT | MCL_FUTURE);
|
||||
|
||||
// start realtime timer and scheduler
|
||||
//rt_set_oneshot_mode();
|
||||
rt_set_periodic_mode();
|
||||
start_rt_timer(0);
|
||||
|
||||
now = rt_get_time() + 10*PERIOD;
|
||||
rt_task_make_periodic(task, now, PERIOD);
|
||||
|
||||
printf("Init mutex and cond.\n");
|
||||
mutex = rt_sem_init(nam2num("MUTEX"), 1);
|
||||
|
||||
if (mutex==0)
|
||||
printf("Error init mutex\n");
|
||||
|
||||
cond = rt_cond_init(nam2num("CONDITION"));
|
||||
|
||||
if (cond==0)
|
||||
printf("Error init cond\n");
|
||||
|
||||
thread0 = rt_thread_create(fun0, NULL, 10000);
|
||||
//thread1 = rt_thread_create(fun1, NULL, 20000);
|
||||
|
||||
//rt_sleep(PERIOD);
|
||||
|
||||
while (cnt < THRESHOLD) {
|
||||
rt_task_wait_period();
|
||||
rt_printk("main: Hello World %d!\n",cnt);
|
||||
rt_sem_wait(mutex); //now the mutex should have value 0
|
||||
|
||||
if (instance_cnt==0) {
|
||||
rt_sem_signal(mutex); //now the mutex should have vaule 1
|
||||
rt_printk("worker thread busy!\n");
|
||||
} else {
|
||||
instance_cnt++;
|
||||
rt_cond_signal(cond);
|
||||
rt_sem_signal(mutex); //now the mutex should have vaule 1
|
||||
rt_printk("signaling worker thread to start!\n");
|
||||
}
|
||||
|
||||
cnt++;
|
||||
}
|
||||
|
||||
// wait for end of program
|
||||
printf("TYPE <ENTER> TO TERMINATE\n");
|
||||
getchar();
|
||||
|
||||
// cleanup
|
||||
stop_rt_timer();
|
||||
return 0;
|
||||
}
|
||||
@@ -1,744 +0,0 @@
|
||||
/*
|
||||
* Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
|
||||
* contributor license agreements. See the NOTICE file distributed with
|
||||
* this work for additional information regarding copyright ownership.
|
||||
* The OpenAirInterface Software Alliance licenses this file to You under
|
||||
* the OAI Public License, Version 1.1 (the "License"); you may not use this file
|
||||
* except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.openairinterface.org/?page_id=698
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*-------------------------------------------------------------------------------
|
||||
* For more information about the OpenAirInterface (OAI) Software Alliance:
|
||||
* contact@openairinterface.org
|
||||
*/
|
||||
|
||||
/*! \file eNB_transport_IQ.c
|
||||
* \brief eNB transport IQ samples
|
||||
* \author Katerina Trilyraki, Navid Nikaein, Raymond Knopp
|
||||
* \date 2015
|
||||
* \version 0.1
|
||||
* \company Eurecom
|
||||
* \maintainer: navid.nikaein@eurecom.fr
|
||||
* \note
|
||||
* \warning very experimental
|
||||
*/
|
||||
#include <unistd.h>
|
||||
#include <time.h>
|
||||
#include <pthread.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <signal.h>
|
||||
|
||||
#include "common_lib.h"
|
||||
#include "PHY/defs.h"
|
||||
#include "rrh_gw.h"
|
||||
#include "rrh_gw_externs.h"
|
||||
#include "rt_wrapper.h"
|
||||
|
||||
#define PRINTF_PERIOD 3750
|
||||
#define HEADER_SIZE ((sizeof(int32_t) + sizeof(openair0_timestamp))>>2)
|
||||
|
||||
pthread_cond_t sync_eNB_cond[4];
|
||||
pthread_mutex_t sync_eNB_mutex[4];
|
||||
pthread_mutex_t sync_trx_mutex=PTHREAD_MUTEX_INITIALIZER;
|
||||
pthread_cond_t sync_trx_cond=PTHREAD_COND_INITIALIZER;
|
||||
|
||||
openair0_timestamp nrt_eNB_counter[4]= {0,0,0,0};
|
||||
int32_t overflow_rx_buffer_eNB[4]= {0,0,0,0};
|
||||
int32_t nsamps_eNB[4]= {0,0,0,0};
|
||||
int32_t eNB_tx_started=0,eNB_rx_started=0;
|
||||
int32_t counter_eNB_rx[4]= {0,0,0,0};
|
||||
int32_t counter_eNB_tx[4]= {0,0,0,0};
|
||||
uint8_t RT_flag_eNB,NRT_flag_eNB;
|
||||
void *rrh_eNB_thread_status;
|
||||
int sync_eNB_rx[4]= {-1,-1,-1,-1};
|
||||
unsigned int sync_trx=0;
|
||||
|
||||
int32_t **tx_buffer_eNB;
|
||||
int32_t **rx_buffer_eNB;
|
||||
void **rx_eNB; //was fixed to 2 ant
|
||||
void **tx_eNB; //was fixed to 2 ant
|
||||
|
||||
openair0_timestamp timestamp_eNB_tx[4]= {0,0,0,0};// all antennas must have the same ts
|
||||
openair0_timestamp timestamp_eNB_rx[4]= {0,0,0,0};
|
||||
openair0_timestamp timestamp_rx=0,timestamp_tx=0;
|
||||
|
||||
unsigned int rx_pos=0, next_rx_pos=0;
|
||||
unsigned int tx_pos=0, tx_pos_rf=0, prev_tx_pos=0;
|
||||
unsigned int rt_period=0;
|
||||
|
||||
struct itimerspec timerspec;
|
||||
pthread_mutex_t timer_mutex;
|
||||
|
||||
|
||||
|
||||
/*! \fn void *rrh_eNB_rx_thread(void *arg)
|
||||
* \brief this function
|
||||
* \param[in]
|
||||
* \return none
|
||||
* \note
|
||||
* @ingroup _oai
|
||||
*/
|
||||
void *rrh_eNB_rx_thread(void *);
|
||||
/*! \fn void *rrh_eNB_tx_thread(void *arg)
|
||||
* \brief this function
|
||||
* \param[in]
|
||||
* \return none
|
||||
* \note
|
||||
* @ingroup _oai
|
||||
*/
|
||||
void *rrh_eNB_tx_thread(void *);
|
||||
/*! \fn void *rrh_eNB_thread(void *arg)
|
||||
* \brief this function
|
||||
* \param[in]
|
||||
* \return none
|
||||
* \note
|
||||
* @ingroup _oai
|
||||
*/
|
||||
void *rrh_eNB_thread(void *);
|
||||
/*! \fn void check_dev_config( rrh_module_t *mod_enb)
|
||||
* \brief this function
|
||||
* \param[in] *mod_enb
|
||||
* \return none
|
||||
* \note
|
||||
* @ingroup _oai
|
||||
*/
|
||||
static void check_dev_config( rrh_module_t *mod_enb);
|
||||
/*! \fn void calc_rt_period_ns( openair0_config_t openair0_cfg)
|
||||
* \brief this function
|
||||
* \param[in] openair0_cfg
|
||||
* \return none
|
||||
* \note
|
||||
* @ingroup _oai
|
||||
*/
|
||||
static void calc_rt_period_ns( openair0_config_t *openair0_cfg);
|
||||
|
||||
|
||||
|
||||
void config_BBU_mod( rrh_module_t *mod_enb, uint8_t RT_flag, uint8_t NRT_flag) {
|
||||
|
||||
int error_code_eNB;
|
||||
pthread_t main_rrh_eNB_thread;
|
||||
pthread_attr_t attr;
|
||||
struct sched_param sched_param_rrh;
|
||||
|
||||
RT_flag_eNB=RT_flag;
|
||||
NRT_flag_eNB=NRT_flag;
|
||||
|
||||
/* init socket and have handshake-like msg with client to exchange parameters */
|
||||
mod_enb->eth_dev.trx_start_func(&mod_enb->eth_dev);//change port make it plus_id
|
||||
|
||||
mod_enb->devs->openair0_cfg = mod_enb->eth_dev.openair0_cfg;
|
||||
|
||||
/* check sanity of configuration parameters and print */
|
||||
check_dev_config(mod_enb);
|
||||
if (rf_config_file[0] == '\0')
|
||||
mod_enb->devs->openair0_cfg->configFilename = NULL;
|
||||
else
|
||||
mod_enb->devs->openair0_cfg->configFilename = rf_config_file;
|
||||
/* initialize and configure the RF device */
|
||||
if (openair0_device_load(mod_enb->devs, mod_enb->devs->openair0_cfg)<0) {
|
||||
LOG_E(RRH,"Exiting, cannot initialize RF device.\n");
|
||||
exit(-1);
|
||||
} else {
|
||||
if (mod_enb->devs->type != NONE_DEV) {
|
||||
/* start RF device */
|
||||
if (mod_enb->devs->type == EXMIMO_DEV) {
|
||||
//call start function for exmino
|
||||
} else {
|
||||
|
||||
if (mod_enb->devs->trx_start_func(mod_enb->devs)!=0)
|
||||
LOG_E(RRH,"Unable to initiate RF device.\n");
|
||||
else
|
||||
LOG_I(RRH,"RF device has been initiated.\n");
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
/* create main eNB module thread
|
||||
main_rrh_eNB_thread allocates memory
|
||||
for TX/RX buffers and creates TX/RX
|
||||
threads for every eNB module */
|
||||
pthread_attr_init(&attr);
|
||||
sched_param_rrh.sched_priority = sched_get_priority_max(SCHED_FIFO);
|
||||
pthread_attr_setschedparam(&attr,&sched_param_rrh);
|
||||
pthread_attr_setschedpolicy(&attr,SCHED_FIFO);
|
||||
error_code_eNB = pthread_create(&main_rrh_eNB_thread, &attr, rrh_eNB_thread, (void *)mod_enb);
|
||||
|
||||
if (error_code_eNB) {
|
||||
LOG_E(RRH,"Error while creating eNB thread\n");
|
||||
exit(-1);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
void *rrh_eNB_thread(void *arg) {
|
||||
|
||||
rrh_module_t *dev=(rrh_module_t *)arg;
|
||||
pthread_t eNB_rx_thread, eNB_tx_thread;
|
||||
int error_code_eNB_rx, error_code_eNB_tx;
|
||||
int32_t i,j;
|
||||
void *tmp;
|
||||
unsigned int samples_per_frame=0;
|
||||
|
||||
samples_per_frame = dev->eth_dev.openair0_cfg->samples_per_frame;
|
||||
|
||||
while (rrh_exit==0) {
|
||||
|
||||
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_eNB_TRX, 1 );
|
||||
|
||||
/* calculate packet period */
|
||||
calc_rt_period_ns(dev->eth_dev.openair0_cfg);
|
||||
|
||||
/* allocate memory for TX/RX buffers
|
||||
each antenna port has a TX and a RX buffer
|
||||
each TX and RX buffer is of (samples_per_frame + HEADER_SIZE) samples (size of samples is 4 bytes) */
|
||||
rx_buffer_eNB = (int32_t**)malloc16(dev->eth_dev.openair0_cfg->rx_num_channels*sizeof(int32_t*));
|
||||
tx_buffer_eNB = (int32_t**)malloc16(dev->eth_dev.openair0_cfg->tx_num_channels*sizeof(int32_t*));
|
||||
LOG_D(RRH,"rx_buffer_eNB address =%p tx_buffer_eNB address =%p \n",rx_buffer_eNB,tx_buffer_eNB);
|
||||
|
||||
/* rx_buffer_eNB points to the beginning of data */
|
||||
for (i=0; i<dev->eth_dev.openair0_cfg->rx_num_channels; i++) {
|
||||
tmp=(void *)malloc16(sizeof(int32_t)*(samples_per_frame + 32));
|
||||
memset(tmp,0,sizeof(int32_t)*(samples_per_frame + 32));
|
||||
rx_buffer_eNB[i]=( tmp + (32*sizeof(int32_t)) );
|
||||
LOG_D(RRH,"i=%d rx_buffer_eNB[i]=%p tmp= %p\n",i,rx_buffer_eNB[i],tmp);
|
||||
}
|
||||
/* tx_buffer_eNB points to the beginning of data */
|
||||
for (i=0; i<dev->eth_dev.openair0_cfg->tx_num_channels; i++) {
|
||||
tmp=(void *)malloc16(sizeof(int32_t)*(samples_per_frame + 32));
|
||||
memset(tmp,0,sizeof(int32_t)*(samples_per_frame + 32));
|
||||
tx_buffer_eNB[i]=( tmp + (32*sizeof(int32_t)) );
|
||||
LOG_D(RRH,"i= %d tx_buffer_eNB[i]=%p tmp= %p \n",i,tx_buffer_eNB[i],tmp);
|
||||
}
|
||||
/* dummy initialization for TX/RX buffers */
|
||||
for (i=0; i<dev->eth_dev.openair0_cfg->rx_num_channels; i++) {
|
||||
for (j=0; j<samples_per_frame; j++) {
|
||||
rx_buffer_eNB[i][j]=32+i;
|
||||
}
|
||||
}
|
||||
/* dummy initialization for TX/RX buffers */
|
||||
for (i=0; i<dev->eth_dev.openair0_cfg->tx_num_channels; i++) {
|
||||
for (j=0; j<samples_per_frame; j++) {
|
||||
tx_buffer_eNB[i][j]=12+i;
|
||||
}
|
||||
}
|
||||
/* allocate TX/RX buffers pointers used in write/read operations */
|
||||
rx_eNB = (void**)malloc16(dev->eth_dev.openair0_cfg->rx_num_channels*sizeof(int32_t*));
|
||||
tx_eNB = (void**)malloc16(dev->eth_dev.openair0_cfg->tx_num_channels*sizeof(int32_t*));
|
||||
|
||||
/* init mutexes */
|
||||
for (i=0; i<dev->eth_dev.openair0_cfg->tx_num_channels; i++) {
|
||||
pthread_mutex_init(&sync_eNB_mutex[i],NULL);
|
||||
pthread_cond_init(&sync_eNB_cond[i],NULL);
|
||||
}
|
||||
/* init mutexes */
|
||||
pthread_mutex_init(&sync_trx_mutex,NULL);
|
||||
|
||||
/* create eNB module's TX/RX threads */
|
||||
#ifdef DEADLINE_SCHEDULER
|
||||
error_code_eNB_rx = pthread_create(&eNB_rx_thread, NULL, rrh_eNB_rx_thread, (void *)dev);
|
||||
error_code_eNB_tx = pthread_create(&eNB_tx_thread, NULL, rrh_eNB_tx_thread, (void *)dev);
|
||||
LOG_I(RRH,"[eNB][SCHED] deadline scheduling applied to eNB TX/RX threads\n");
|
||||
#else
|
||||
pthread_attr_t attr_eNB_rx, attr_eNB_tx;
|
||||
struct sched_param sched_param_eNB_rx, sched_param_eNB_tx;
|
||||
|
||||
pthread_attr_init(&attr_eNB_rx);
|
||||
pthread_attr_init(&attr_eNB_tx);
|
||||
sched_param_eNB_rx.sched_priority = sched_get_priority_max(SCHED_FIFO);
|
||||
sched_param_eNB_tx.sched_priority = sched_get_priority_max(SCHED_FIFO);
|
||||
pthread_attr_setschedparam(&attr_eNB_rx,&sched_param_eNB_rx);
|
||||
pthread_attr_setschedparam(&attr_eNB_tx,&sched_param_eNB_tx);
|
||||
pthread_attr_setschedpolicy(&attr_eNB_rx,SCHED_FIFO);
|
||||
pthread_attr_setschedpolicy(&attr_eNB_tx,SCHED_FIFO);
|
||||
|
||||
error_code_eNB_rx = pthread_create(&eNB_rx_thread, &attr_eNB_rx, rrh_eNB_rx_thread, (void *)dev);
|
||||
error_code_eNB_tx = pthread_create(&eNB_tx_thread, &attr_eNB_tx, rrh_eNB_tx_thread, (void *)dev);
|
||||
LOG_I(RRH,"[eNB][SCHED] FIFO scheduling applied to eNB TX/RX threads\n");
|
||||
#endif
|
||||
|
||||
if (error_code_eNB_rx) {
|
||||
LOG_E(RRH,"[eNB] Error while creating eNB RX thread\n");
|
||||
exit(-1);
|
||||
}
|
||||
if (error_code_eNB_tx) {
|
||||
LOG_E(RRH,"[eNB] Error while creating eNB TX thread\n");
|
||||
exit(-1);
|
||||
}
|
||||
|
||||
/* create timer thread; when no RF device is present a software clock is generated */
|
||||
if (dev->devs->type == NONE_DEV) {
|
||||
|
||||
int error_code_timer;
|
||||
pthread_t main_timer_proc_thread;
|
||||
|
||||
LOG_I(RRH,"Creating timer thread with rt period %d ns.\n",rt_period);
|
||||
|
||||
/* setup the timer to generate an interrupt:
|
||||
-for the first time in (sample_per_packet/sample_rate) ns
|
||||
-and then every (sample_per_packet/sample_rate) ns */
|
||||
timerspec.it_value.tv_sec = rt_period/1000000000;
|
||||
timerspec.it_value.tv_nsec = rt_period%1000000000;
|
||||
timerspec.it_interval.tv_sec = rt_period/1000000000;
|
||||
timerspec.it_interval.tv_nsec = rt_period%1000000000;
|
||||
|
||||
|
||||
#ifdef DEADLINE_SCHEDULER
|
||||
error_code_timer = pthread_create(&main_timer_proc_thread, NULL, timer_proc, (void *)&timerspec);
|
||||
LOG_I(RRH,"[eNB][SCHED] deadline scheduling applied to timer thread \n");
|
||||
#else
|
||||
pthread_attr_t attr_timer;
|
||||
struct sched_param sched_param_timer;
|
||||
|
||||
pthread_attr_init(&attr_timer);
|
||||
sched_param_timer.sched_priority = sched_get_priority_max(SCHED_FIFO-1);
|
||||
pthread_attr_setschedparam(&attr_timer,&sched_param_timer);
|
||||
pthread_attr_setschedpolicy(&attr_timer,SCHED_FIFO-1);
|
||||
|
||||
pthread_mutex_init(&timer_mutex,NULL);
|
||||
|
||||
error_code_timer = pthread_create(&main_timer_proc_thread, &attr_timer, timer_proc, (void *)&timerspec);
|
||||
LOG_I(RRH,"[eNB][SCHED] FIFO scheduling applied to timer thread \n");
|
||||
#endif
|
||||
|
||||
if (error_code_timer) {
|
||||
LOG_E(RRH,"Error while creating timer proc thread\n");
|
||||
exit(-1);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
while (rrh_exit==0)
|
||||
sleep(1);
|
||||
|
||||
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_eNB_TRX,0 );
|
||||
}
|
||||
|
||||
rrh_eNB_thread_status = 0;
|
||||
pthread_exit(&rrh_eNB_thread_status);
|
||||
return(0);
|
||||
}
|
||||
|
||||
/* Receive from RF and transmit to RRH */
|
||||
|
||||
void *rrh_eNB_rx_thread(void *arg) {
|
||||
|
||||
/* measurement related vars */
|
||||
struct timespec time0,time1,time2;
|
||||
unsigned long long max_rx_time=0, min_rx_time=rt_period, total_rx_time=0, average_rx_time=rt_period, s_period=0, trial=0;
|
||||
int trace_cnt=0;
|
||||
|
||||
struct timespec time_req_1us, time_rem_1us;
|
||||
rrh_module_t *dev = (rrh_module_t *)arg;
|
||||
ssize_t bytes_sent;
|
||||
int i=0 ,pck_rx=0, s_cnt=0;
|
||||
openair0_timestamp last_hw_counter=0; //volatile int64_t
|
||||
unsigned int samples_per_frame=0,samples_per_subframe=0, spp_rf=0, spp_eth=0;
|
||||
uint8_t loopback=0,measurements=0;
|
||||
unsigned int subframe=0;
|
||||
unsigned int frame=0;
|
||||
|
||||
time_req_1us.tv_sec = 0;
|
||||
time_req_1us.tv_nsec =1000; //time_req_1us.tv_nsec = (int)rt_period/2;--->granularity issue
|
||||
spp_eth = dev->eth_dev.openair0_cfg->samples_per_packet;
|
||||
spp_rf = dev->devs->openair0_cfg->samples_per_packet;
|
||||
|
||||
samples_per_frame = dev->eth_dev.openair0_cfg->samples_per_frame;
|
||||
samples_per_subframe = (unsigned int)samples_per_frame/10;
|
||||
loopback = dev->loopback;
|
||||
measurements = dev->measurements;
|
||||
next_rx_pos = spp_eth;
|
||||
|
||||
#ifdef DEADLINE_SCHEDULER
|
||||
struct sched_attr attr;
|
||||
unsigned int flags = 0;
|
||||
|
||||
attr.size = sizeof(attr);
|
||||
attr.sched_flags = 0;
|
||||
attr.sched_nice = 0;
|
||||
attr.sched_priority = 0;
|
||||
|
||||
attr.sched_policy = SCHED_DEADLINE;
|
||||
attr.sched_runtime = (0.8 * 100) * 10000;//4 * 10000;
|
||||
attr.sched_deadline = (0.9 * 100) * 10000;//rt_period-2000;
|
||||
attr.sched_period = 1 * 1000000;//rt_period;
|
||||
|
||||
if (sched_setattr(0, &attr, flags) < 0 ) {
|
||||
perror("[SCHED] eNB RX thread: sched_setattr failed (run with sudo)\n");
|
||||
exit(-1);
|
||||
}
|
||||
#endif
|
||||
|
||||
while (rrh_exit == 0) {
|
||||
while (rx_pos <(1 + subframe)*samples_per_subframe) {
|
||||
//LOG_D(RRH,"starting a new send:%d %d\n",sync_trx,frame);
|
||||
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_eNB_RX, 1 );
|
||||
VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_HW_FRAME_RX, frame);
|
||||
VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_HW_SUBFRAME_RX, subframe );
|
||||
VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_RX_PCK, pck_rx );
|
||||
LOG_D(RRH,"pack=%d rx_pos=%d subframe=%d frame=%d\n ",pck_rx, rx_pos, subframe,frame);
|
||||
|
||||
if (dev->devs->type == NONE_DEV) {
|
||||
VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_RX_HWCNT, hw_counter );
|
||||
VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_RX_LHWCNT, last_hw_counter );
|
||||
VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_CNT, s_cnt );
|
||||
if (!eNB_rx_started) {
|
||||
eNB_rx_started=1; // set this flag to 1 to indicate that eNB started
|
||||
if (RT_flag_eNB==1) {
|
||||
last_hw_counter=hw_counter;//get current counter
|
||||
}
|
||||
} else {
|
||||
if (RT_flag_eNB==1) {
|
||||
if (hw_counter > last_hw_counter+1) {
|
||||
printf("LR");
|
||||
} else {
|
||||
while ((hw_counter < last_hw_counter+1)) {
|
||||
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_eNB_RX_SLEEP, 1 );
|
||||
nanosleep(&time_req_1us,&time_rem_1us); //rt_sleep_ns(sleep_ns);
|
||||
s_cnt++;
|
||||
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_eNB_RX_SLEEP, 0 );
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
if (measurements == 1 ) clock_gettime(CLOCK_MONOTONIC,&time1);
|
||||
|
||||
if (loopback == 1 ) {
|
||||
if (sync_eNB_rx[i]==0) {
|
||||
rx_eNB[i] = (void*)&tx_buffer_eNB[i][tx_pos];
|
||||
LOG_I(RRH,"tx_buffer_eNB[i][tx_pos]=%d ,tx_pos=%d\n",tx_buffer_eNB[i][tx_pos],tx_pos);
|
||||
} else {
|
||||
rx_eNB[i] = (void*)&rx_buffer_eNB[i][rx_pos];
|
||||
LOG_I(RRH,"rx_buffer_eNB[i][rx_pos]=%d ,rx_pos=%d\n",rx_buffer_eNB[i][rx_pos],rx_pos);
|
||||
}
|
||||
}
|
||||
|
||||
for (i=0; i<dev->eth_dev.openair0_cfg->rx_num_channels; i++) {
|
||||
rx_eNB[i] = (void*)&rx_buffer_eNB[i][rx_pos];
|
||||
LOG_D(RRH," rx_eNB[i]=%p rx_buffer_eNB[i][rx_pos]=%p ,rx_pos=%d, i=%d ts=%d\n",rx_eNB[i],&rx_buffer_eNB[i][rx_pos],rx_pos,i,timestamp_rx);
|
||||
}
|
||||
VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_RXCNT, rx_pos );
|
||||
if (dev->devs->type != NONE_DEV) {
|
||||
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_TRX_READ_RF, 1 );
|
||||
/* Read operation to RF device (RX)*/
|
||||
if ( dev->devs->trx_read_func (dev->devs,
|
||||
×tamp_rx,
|
||||
rx_eNB,
|
||||
spp_rf,
|
||||
dev->devs->openair0_cfg->rx_num_channels
|
||||
)<0) {
|
||||
perror("RRH eNB : USRP read");
|
||||
}
|
||||
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_TRX_READ_RF, 0 );
|
||||
}
|
||||
VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_RX_TS, timestamp_rx&0xffffffff );
|
||||
|
||||
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_TRX_WRITE, 1 );
|
||||
if ((bytes_sent = dev->eth_dev.trx_write_func (&dev->eth_dev,
|
||||
timestamp_rx,
|
||||
rx_eNB,
|
||||
spp_eth,
|
||||
dev->eth_dev.openair0_cfg->rx_num_channels,
|
||||
0))<0) {
|
||||
perror("RRH eNB : ETHERNET write");
|
||||
}
|
||||
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_TRX_WRITE, 0 );
|
||||
|
||||
/* when there is no RF timestamp is updated by number of samples */
|
||||
if (dev->devs->type == NONE_DEV) {
|
||||
timestamp_rx+=spp_eth;
|
||||
last_hw_counter=hw_counter;
|
||||
}
|
||||
|
||||
if (measurements == 1 ) {
|
||||
|
||||
clock_gettime(CLOCK_MONOTONIC,&time2);
|
||||
|
||||
if (trace_cnt++ > 10) {
|
||||
total_rx_time = (unsigned int)(time2.tv_nsec - time0.tv_nsec);
|
||||
if (total_rx_time < 0)
|
||||
total_rx_time=1000000000-total_rx_time;
|
||||
|
||||
if ((total_rx_time > 0) && (total_rx_time < 1000000000)) {
|
||||
trial++;
|
||||
if (total_rx_time < min_rx_time)
|
||||
min_rx_time = total_rx_time;
|
||||
if (total_rx_time > max_rx_time){
|
||||
max_rx_time = total_rx_time;
|
||||
LOG_I(RRH,"Max value %d update at rx_position %d \n",total_rx_time,timestamp_rx);
|
||||
}
|
||||
average_rx_time = (long long unsigned int)((average_rx_time*trial)+total_rx_time)/(trial+1);
|
||||
}
|
||||
if (s_period++ == PRINTF_PERIOD) {
|
||||
s_period=0;
|
||||
LOG_I(RRH,"Average eNB RX time : %lu ns\tMax RX time : %lu ns\tMin RXX time : %lu ns\n",average_rx_time,max_rx_time,min_rx_time);
|
||||
}
|
||||
}
|
||||
|
||||
memcpy(&time0,&time2,sizeof(struct timespec));
|
||||
}
|
||||
|
||||
if (loopback == 1 ) {
|
||||
pthread_mutex_lock(&sync_eNB_mutex[i]);
|
||||
sync_eNB_rx[i]--;
|
||||
pthread_mutex_unlock(&sync_eNB_mutex[i]);
|
||||
}
|
||||
|
||||
rx_pos += spp_eth;
|
||||
pck_rx++;
|
||||
next_rx_pos=(rx_pos+spp_eth);
|
||||
|
||||
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_eNB_RX, 0 );
|
||||
/*
|
||||
if (frame>50) {
|
||||
pthread_mutex_lock(&sync_trx_mutex);
|
||||
while (sync_trx) {
|
||||
pthread_cond_wait(&sync_trx_cond,&sync_trx_mutex);
|
||||
}
|
||||
sync_trx=1;
|
||||
LOG_D(RRH,"out of while send:%d %d\n",sync_trx,frame);
|
||||
pthread_cond_signal(&sync_trx_cond);
|
||||
pthread_mutex_unlock(&sync_trx_mutex);
|
||||
}*/
|
||||
} // while
|
||||
|
||||
subframe++;
|
||||
s_cnt=0;
|
||||
|
||||
/* wrap around rx buffer index */
|
||||
if (next_rx_pos >= samples_per_frame)
|
||||
next_rx_pos -= samples_per_frame;
|
||||
if (rx_pos >= samples_per_frame)
|
||||
rx_pos -= samples_per_frame;
|
||||
/* wrap around subframe number */
|
||||
if (subframe == 10 ) {
|
||||
subframe = 0;
|
||||
frame++;
|
||||
}
|
||||
|
||||
|
||||
} //while (eNB_exit==0)
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* Receive from eNB and transmit to RF */
|
||||
|
||||
void *rrh_eNB_tx_thread(void *arg) {
|
||||
|
||||
struct timespec time0,time1,time2;
|
||||
|
||||
rrh_module_t *dev = (rrh_module_t *)arg;
|
||||
struct timespec time_req_1us, time_rem_1us;
|
||||
ssize_t bytes_received;
|
||||
int i;
|
||||
//openair0_timestamp last_hw_counter=0;
|
||||
unsigned int samples_per_frame=0,samples_per_subframe=0;
|
||||
unsigned int spp_rf=0, spp_eth=0;
|
||||
uint8_t loopback=0,measurements=0;
|
||||
unsigned int subframe=0,frame=0;
|
||||
unsigned int pck_tx=0;
|
||||
|
||||
#ifdef DEADLINE_SCHEDULER
|
||||
struct sched_attr attr;
|
||||
unsigned int flags = 0;
|
||||
|
||||
attr.size = sizeof(attr);
|
||||
attr.sched_flags = 0;
|
||||
attr.sched_nice = 0;
|
||||
attr.sched_priority = 0;
|
||||
|
||||
attr.sched_policy = SCHED_DEADLINE;
|
||||
attr.sched_runtime = (0.8 * 100) * 10000;
|
||||
attr.sched_deadline = (0.9 * 100) * 10000;
|
||||
attr.sched_period = 1 * 1000000;
|
||||
|
||||
if (sched_setattr(0, &attr, flags) < 0 ) {
|
||||
perror("[SCHED] eNB TX thread: sched_setattr failed\n");
|
||||
exit(-1);
|
||||
}
|
||||
#endif
|
||||
|
||||
time_req_1us.tv_sec = 1;
|
||||
time_req_1us.tv_nsec = 0;
|
||||
spp_eth = dev->eth_dev.openair0_cfg->samples_per_packet;
|
||||
spp_rf = dev->devs->openair0_cfg->samples_per_packet;
|
||||
samples_per_frame = dev->eth_dev.openair0_cfg->samples_per_frame;
|
||||
samples_per_subframe = (unsigned int)samples_per_frame/10;
|
||||
tx_pos=0;
|
||||
|
||||
loopback = dev->loopback;
|
||||
measurements = dev->measurements;
|
||||
|
||||
while (rrh_exit == 0) {
|
||||
while (tx_pos < (1 + subframe)*samples_per_subframe) {
|
||||
|
||||
//LOG_D(RRH,"bef lock read:%d %d\n",sync_trx,frame);
|
||||
//pthread_mutex_lock(&sync_trx_mutex);
|
||||
|
||||
//while (!sync_trx) {
|
||||
//LOG_D(RRH,"in sync read:%d %d\n",sync_trx,frame);
|
||||
//pthread_cond_wait(&sync_trx_cond,&sync_trx_mutex);
|
||||
//}
|
||||
//LOG_D(RRH,"out of while read:%d %d\n",sync_trx,frame);
|
||||
|
||||
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_eNB_TX, 1 );
|
||||
VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_HW_FRAME, frame);
|
||||
VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_HW_SUBFRAME, subframe );
|
||||
VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_TX_PCK, pck_tx );
|
||||
|
||||
if (measurements == 1 ) clock_gettime(CLOCK_MONOTONIC,&time1);
|
||||
for (i=0; i<dev->eth_dev.openair0_cfg->tx_num_channels; i++) tx_eNB[i] = (void*)&tx_buffer_eNB[i][tx_pos];
|
||||
|
||||
VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_TXCNT, tx_pos );
|
||||
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_TRX_READ, 1 );
|
||||
|
||||
/* Read operation to ETHERNET device */
|
||||
if (( bytes_received = dev->eth_dev.trx_read_func(&dev->eth_dev,
|
||||
×tamp_tx,
|
||||
tx_eNB,
|
||||
spp_eth,
|
||||
dev->eth_dev.openair0_cfg->tx_num_channels))<0) {
|
||||
perror("RRH eNB : ETHERNET read");
|
||||
}
|
||||
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_TRX_READ, 0 );
|
||||
|
||||
if (dev->devs->type != NONE_DEV) {
|
||||
LOG_D(RRH," tx_buffer_eNB[i][tx_pos]=%x t_buffer_eNB[i][tx_pos+1]=%x t_buffer_eNB[i][tx_pos+2]=%x \n",tx_buffer_eNB[0][tx_pos],tx_buffer_eNB[0][tx_pos+1],tx_buffer_eNB[0][tx_pos+2]);
|
||||
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_TRX_WRITE_RF, 1 );
|
||||
/* Write operation to RF device (TX)*/
|
||||
if ( dev->devs->trx_write_func (dev->devs,
|
||||
timestamp_tx,
|
||||
tx_eNB,
|
||||
spp_rf,
|
||||
dev->devs->openair0_cfg->tx_num_channels,
|
||||
1)<0){
|
||||
perror("RRH eNB : USRP write");
|
||||
}
|
||||
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_TRX_WRITE_RF, 0 );
|
||||
}
|
||||
|
||||
VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_TX_TS, timestamp_tx&0xffffffff );
|
||||
|
||||
|
||||
//if (dev->devs->type == NONE_DEV) last_hw_counter=hw_counter;
|
||||
|
||||
|
||||
if (loopback ==1 ) {
|
||||
while (sync_eNB_rx[i]==0)
|
||||
nanosleep(&time_req_1us,&time_rem_1us);
|
||||
|
||||
pthread_mutex_lock(&sync_eNB_mutex[i]);
|
||||
sync_eNB_rx[i]++;
|
||||
pthread_mutex_unlock(&sync_eNB_mutex[i]);
|
||||
}
|
||||
|
||||
if (measurements == 1 ) {
|
||||
clock_gettime(CLOCK_MONOTONIC,&time2);
|
||||
memcpy(&time0,&time2,sizeof(struct timespec));
|
||||
}
|
||||
|
||||
prev_tx_pos=tx_pos;
|
||||
tx_pos += spp_eth;
|
||||
pck_tx++;
|
||||
|
||||
//VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_eNB_TX, 0 );
|
||||
//sync_trx=0;
|
||||
//pthread_cond_signal(&sync_trx_cond);
|
||||
//pthread_mutex_unlock(&sync_trx_mutex);
|
||||
}
|
||||
|
||||
/* wrap around tx buffer index */
|
||||
if (tx_pos >= samples_per_frame)
|
||||
tx_pos -= samples_per_frame;
|
||||
/* wrap around subframe number */
|
||||
subframe++;
|
||||
if (subframe == 10 ) {
|
||||
subframe = 0; // the radio frame is complete, start over
|
||||
frame++;
|
||||
}
|
||||
|
||||
} //while (eNB_exit==0)
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
static void calc_rt_period_ns( openair0_config_t *openair0_cfg) {
|
||||
|
||||
rt_period= (double)(openair0_cfg->samples_per_packet/(openair0_cfg->samples_per_frame/10.0)*1000000);
|
||||
AssertFatal(rt_period > 0, "Invalid rt period !%u\n", rt_period);
|
||||
LOG_I(RRH,"[eNB] Real time period is set to %u ns\n", rt_period);
|
||||
}
|
||||
|
||||
|
||||
static void check_dev_config( rrh_module_t *mod_enb) {
|
||||
|
||||
AssertFatal( (mod_enb->devs->openair0_cfg->num_rb_dl==100 || mod_enb->devs->openair0_cfg->num_rb_dl==50 || mod_enb->devs->openair0_cfg->num_rb_dl==25 || mod_enb->devs->openair0_cfg->num_rb_dl==6) , "Invalid number of resource blocks! %d\n", mod_enb->devs->openair0_cfg->num_rb_dl);
|
||||
AssertFatal( mod_enb->devs->openair0_cfg->samples_per_frame > 0 , "Invalid number of samples per frame! %d\n",mod_enb->devs->openair0_cfg->samples_per_frame);
|
||||
AssertFatal( mod_enb->devs->openair0_cfg->sample_rate > 0.0, "Invalid sample rate! %f\n", mod_enb->devs->openair0_cfg->sample_rate);
|
||||
AssertFatal( mod_enb->devs->openair0_cfg->samples_per_packet > 0 , "Invalid number of samples per packet! %d\n",mod_enb->devs->openair0_cfg->samples_per_packet);
|
||||
AssertFatal( mod_enb->devs->openair0_cfg->rx_num_channels > 0 , "Invalid number of RX antennas! %d\n", mod_enb->devs->openair0_cfg->rx_num_channels);
|
||||
AssertFatal( mod_enb->devs->openair0_cfg->tx_num_channels > 0 , "Invalid number of TX antennas! %d\n", mod_enb->devs->openair0_cfg->tx_num_channels);
|
||||
AssertFatal( mod_enb->devs->openair0_cfg->rx_freq[0] > 0.0 ,"Invalid RX frequency! %f\n", mod_enb->devs->openair0_cfg->rx_freq[0]);
|
||||
AssertFatal( mod_enb->devs->openair0_cfg->tx_freq[0] > 0.0 ,"Invalid TX frequency! %f\n", mod_enb->devs->openair0_cfg->tx_freq[0]);
|
||||
AssertFatal( mod_enb->devs->openair0_cfg->rx_gain[0] > 0.0 ,"Invalid RX gain! %f\n", mod_enb->devs->openair0_cfg->rx_gain[0]);
|
||||
AssertFatal( mod_enb->devs->openair0_cfg->tx_gain[0] > 0.0 ,"Invalid TX gain! %f\n", mod_enb->devs->openair0_cfg->tx_gain[0]);
|
||||
AssertFatal( mod_enb->devs->openair0_cfg->rx_bw > 0.0 ,"Invalid RX bw! %f\n", mod_enb->devs->openair0_cfg->rx_bw);
|
||||
AssertFatal( mod_enb->devs->openair0_cfg->tx_bw > 0.0 ,"Invalid RX bw! %f\n", mod_enb->devs->openair0_cfg->tx_bw);
|
||||
AssertFatal( mod_enb->devs->openair0_cfg->autocal[0] > 0 , "Invalid auto calibration choice! %d\n", mod_enb->devs->openair0_cfg->autocal[0]);
|
||||
|
||||
printf("\n---------------------RF device configuration parameters---------------------\n");
|
||||
|
||||
printf("\tMod_id=%d\n \tlog level=%d\n \tDL_RB=%d\n \tsamples_per_frame=%d\n \tsample_rate=%f\n \tsamples_per_packet=%d\n \ttx_sample_advance=%d\n \trx_num_channels=%d\n \ttx_num_channels=%d\n \trx_freq_0=%f\n \ttx_freq_0=%f\n \trx_freq_1=%f\n \ttx_freq_1=%f\n \trx_freq_2=%f\n \ttx_freq_2=%f\n \trx_freq_3=%f\n \ttx_freq_3=%f\n \trxg_mode=%d\n \trx_gain_0=%f\n \ttx_gain_0=%f\n \trx_gain_1=%f\n \ttx_gain_1=%f\n \trx_gain_2=%f\n \ttx_gain_2=%f\n \trx_gain_3=%f\n \ttx_gain_3=%f\n \trx_gain_offset_2=%f\n \ttx_gain_offset_3=%f\n \trx_bw=%f\n \ttx_bw=%f\n \tautocal=%d\n",
|
||||
mod_enb->devs->openair0_cfg->Mod_id,
|
||||
mod_enb->devs->openair0_cfg->log_level,
|
||||
mod_enb->devs->openair0_cfg->num_rb_dl,
|
||||
mod_enb->devs->openair0_cfg->samples_per_frame,
|
||||
mod_enb->devs->openair0_cfg->sample_rate,
|
||||
mod_enb->devs->openair0_cfg->samples_per_packet,
|
||||
mod_enb->devs->openair0_cfg->tx_sample_advance,
|
||||
mod_enb->devs->openair0_cfg->rx_num_channels,
|
||||
mod_enb->devs->openair0_cfg->tx_num_channels,
|
||||
mod_enb->devs->openair0_cfg->rx_freq[0],
|
||||
mod_enb->devs->openair0_cfg->tx_freq[0],
|
||||
mod_enb->devs->openair0_cfg->rx_freq[1],
|
||||
mod_enb->devs->openair0_cfg->tx_freq[1],
|
||||
mod_enb->devs->openair0_cfg->rx_freq[2],
|
||||
mod_enb->devs->openair0_cfg->tx_freq[2],
|
||||
mod_enb->devs->openair0_cfg->rx_freq[3],
|
||||
mod_enb->devs->openair0_cfg->tx_freq[3],
|
||||
mod_enb->devs->openair0_cfg->rxg_mode[0],
|
||||
mod_enb->devs->openair0_cfg->tx_gain[0],
|
||||
mod_enb->devs->openair0_cfg->tx_gain[0],
|
||||
mod_enb->devs->openair0_cfg->rx_gain[1],
|
||||
mod_enb->devs->openair0_cfg->tx_gain[1],
|
||||
mod_enb->devs->openair0_cfg->rx_gain[2],
|
||||
mod_enb->devs->openair0_cfg->tx_gain[2],
|
||||
mod_enb->devs->openair0_cfg->rx_gain[3],
|
||||
mod_enb->devs->openair0_cfg->tx_gain[3],
|
||||
//mod_enb->devs->openair0_cfg->rx_gain_offset[0],
|
||||
//mod_enb->devs->openair0_cfg->rx_gain_offset[1],
|
||||
mod_enb->devs->openair0_cfg->rx_gain_offset[2],
|
||||
mod_enb->devs->openair0_cfg->rx_gain_offset[3],
|
||||
mod_enb->devs->openair0_cfg->rx_bw,
|
||||
mod_enb->devs->openair0_cfg->tx_bw,
|
||||
mod_enb->devs->openair0_cfg->autocal[0]
|
||||
);
|
||||
|
||||
printf("----------------------------------------------------------------------------\n");
|
||||
|
||||
|
||||
}
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1,5 +0,0 @@
|
||||
sudo insmod /usr/realtime/modules/rtai_hal.ko
|
||||
sudo insmod /usr/realtime/modules/rtai_sched.ko
|
||||
sudo insmod /usr/realtime/modules/rtai_sem.ko
|
||||
sudo insmod /usr/realtime/modules/rtai_fifos.ko
|
||||
sudo insmod /usr/realtime/modules/rtai_mbx.ko
|
||||
@@ -1,36 +0,0 @@
|
||||
#!/bin/bash
|
||||
|
||||
############### make nasmesh.ko ###############
|
||||
sudo rmmod nasmesh
|
||||
#cd ${OPENAIR2_DIR} && make nasmesh_netlink.ko
|
||||
#cd ${OPENAIR2_DIR}/NAS/DRIVER/MESH/RB_TOOL/ && make
|
||||
#make all
|
||||
sudo insmod $OPENAIR2_DIR/NAS/DRIVER/MESH/nasmesh.ko
|
||||
|
||||
############## Ethernet config ####################
|
||||
sudo ifconfig eth0 mtu 4000
|
||||
sudo sysctl -w net.core.wmem_max=1048576
|
||||
sudo sysctl -w net.core.rmem_max=50000000
|
||||
|
||||
############## rtai modules ###################
|
||||
if test \! -c /dev/rtai_shm; then
|
||||
sudo mknod -m 666 /dev/rtai_shm c 10 254
|
||||
fi
|
||||
for n in `seq 0 9`; do
|
||||
f=/dev/rtf$n
|
||||
if test \! -c $f; then
|
||||
sudo mknod -m 666 $f c 150 $n
|
||||
fi
|
||||
done
|
||||
sudo modprobe rtai_hal
|
||||
sudo modprobe rtai_sched
|
||||
sudo modprobe rtai_fifos
|
||||
sudo modprobe rtai_sem
|
||||
sudo modprobe rtai_mbx
|
||||
sudo modprobe rtai_msg
|
||||
|
||||
############## make ###################
|
||||
make lte-softmodem-usrp NAS=1 USRP=1 XFORMS=1 RTAI=1 HARD_RT=1 #DRIVER2013=1
|
||||
#make lte-softmodem NAS=1 XFORMS=1 USRP=0 RTAI=1 DRIVER2013=1
|
||||
echo DONE!
|
||||
exit 0
|
||||
@@ -1,87 +0,0 @@
|
||||
/*
|
||||
* Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
|
||||
* contributor license agreements. See the NOTICE file distributed with
|
||||
* this work for additional information regarding copyright ownership.
|
||||
* The OpenAirInterface Software Alliance licenses this file to You under
|
||||
* the OAI Public License, Version 1.1 (the "License"); you may not use this file
|
||||
* except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.openairinterface.org/?page_id=698
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*-------------------------------------------------------------------------------
|
||||
* For more information about the OpenAirInterface (OAI) Software Alliance:
|
||||
* contact@openairinterface.org
|
||||
*/
|
||||
|
||||
#include <rtai_sem.h>
|
||||
|
||||
#include "msg_many.h"
|
||||
|
||||
/*
|
||||
* Add a task task to ri->worker.
|
||||
* Return the used index in ri->worker on success
|
||||
* Return -TM_WORKER_FULL_ERROR if ri->worker full
|
||||
* Return -TM_WORKER_ERROR else
|
||||
*/
|
||||
int tm_add_task(RT_TASK *task, run_info_t *ri)
|
||||
{
|
||||
if(ri->used >= NUM_THREADS)
|
||||
return -TM_WORKER_FULL_ERROR;
|
||||
|
||||
rt_sem_wait(ri->update_sem);
|
||||
(*ri->worker)[ri->used] = task;
|
||||
ri->used++;
|
||||
rt_sem_signal(ri->update_sem);
|
||||
|
||||
return ri->used - 1;
|
||||
}
|
||||
|
||||
/*
|
||||
* Remove the a hole in worker at index index by
|
||||
* shift the next slots by one.
|
||||
* This function assume that update_sem are locked.
|
||||
* Return the new used counter.
|
||||
*/
|
||||
int _tm_clean_worker(RT_TASK *(*worker)[], int index, int used)
|
||||
{
|
||||
int i;
|
||||
|
||||
for(i = index; i < used; i++)
|
||||
(*worker)[i] = (*worker)[i + 1];
|
||||
|
||||
return used - 1;
|
||||
}
|
||||
|
||||
/*
|
||||
* Remove a task from ri->worker a index task_index
|
||||
* Return 0 on success
|
||||
* Return -TM_WORKER_ERROR else
|
||||
*/
|
||||
int tm_del_task(int task_index, run_info_t *ri)
|
||||
{
|
||||
rt_sem_wait(ri->update_sem);
|
||||
ri->used = _tm_clean_worker(ri->worker, task_index, ri->used);
|
||||
rt_sem_signal(ri->update_sem);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* Return next index to use on ri->worker.
|
||||
* It depends on the old_index and ri->used.
|
||||
* Return -TM_WORKER_ERROR if ri->used == 0.
|
||||
*/
|
||||
inline int tm_get_next_task_index(int old_index, run_info_t *ri)
|
||||
{
|
||||
if(ri->used == 0)
|
||||
return -TM_WORKER_ERROR;
|
||||
|
||||
return (old_index + 1) % ri->used;
|
||||
}
|
||||
|
||||
@@ -1,181 +0,0 @@
|
||||
/*
|
||||
* Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
|
||||
* contributor license agreements. See the NOTICE file distributed with
|
||||
* this work for additional information regarding copyright ownership.
|
||||
* The OpenAirInterface Software Alliance licenses this file to You under
|
||||
* the OAI Public License, Version 1.1 (the "License"); you may not use this file
|
||||
* except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.openairinterface.org/?page_id=698
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*-------------------------------------------------------------------------------
|
||||
* For more information about the OpenAirInterface (OAI) Software Alliance:
|
||||
* contact@openairinterface.org
|
||||
*/
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <stdint.h>
|
||||
#include <unistd.h>
|
||||
#include <string.h>
|
||||
#include <sys/types.h>
|
||||
#include <sys/mman.h>
|
||||
#include <sys/stat.h>
|
||||
#include <fcntl.h>
|
||||
#include <sched.h>
|
||||
|
||||
#include <rtai_lxrt.h>
|
||||
#include <rtai_sem.h>
|
||||
#include <rtai_msg.h>
|
||||
|
||||
#include "msg_many.h"
|
||||
|
||||
static void *msg_test_thread(void *arg)
|
||||
{
|
||||
RT_TASK *self;
|
||||
RT_TASK *sender_task;
|
||||
thread_info_t *ti = (thread_info_t *)arg;
|
||||
run_info_t *ri = ti->ri;
|
||||
unsigned int msg;
|
||||
int counter = 0;
|
||||
char name[6];
|
||||
int task_index;
|
||||
|
||||
/* Build custom task name for each thread */
|
||||
snprintf(name, 6, "%s%03i", THREAD_NAME_PREFIX, ti->thread_num);
|
||||
|
||||
self = rt_task_init_schmod(nam2num(name), 0, 0, 0, SCHED_FIFO, 0xF);
|
||||
mlockall(MCL_CURRENT | MCL_FUTURE);
|
||||
|
||||
rt_make_hard_real_time();
|
||||
|
||||
task_index = tm_add_task(self, ri);
|
||||
|
||||
if(task_index != -TM_WORKER_FULL_ERROR) {
|
||||
while (*(ri->exit_condition) == 0) {
|
||||
// wait only one PERIOD to avoid wait for ever
|
||||
sender_task = rt_receive_timed(ri->sender, &msg, ri->period);
|
||||
|
||||
//sender_task = rt_receive(0, &msg);
|
||||
if(sender_task == ri->sender)
|
||||
counter++;
|
||||
}
|
||||
|
||||
rt_printk("%s: counter == %i\n", name, counter);
|
||||
tm_del_task(task_index, ri);
|
||||
} else {
|
||||
rt_printk("%s: Worker array full!\n", name);
|
||||
}
|
||||
|
||||
rt_make_soft_real_time();
|
||||
|
||||
rt_task_delete(self);
|
||||
|
||||
free((void *) ti);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
int main(void)
|
||||
{
|
||||
RT_TASK *self;
|
||||
RT_TASK *tmp_worker_task;
|
||||
RT_TASK *worker_tasks[NUM_THREADS];
|
||||
int worker_threads[NUM_THREADS];
|
||||
RTIME now;
|
||||
unsigned int i, ii;
|
||||
run_info_t ri;
|
||||
thread_info_t *ti;
|
||||
uint8_t exit_condition = 0;
|
||||
int fail_count = 0;
|
||||
int old_index = 0;
|
||||
uint8_t lost;
|
||||
|
||||
// make main thread LXRT soft realtime
|
||||
self = rt_task_init_schmod(nam2num("MAINTK"), 10, 0, 0, SCHED_FIFO, 0xF);
|
||||
mlockall(MCL_CURRENT | MCL_FUTURE);
|
||||
|
||||
rt_make_hard_real_time();
|
||||
rt_set_periodic_mode();
|
||||
start_rt_timer(0);
|
||||
|
||||
/* Build all information need to run in main and the thread */
|
||||
ri.sender = self;
|
||||
ri.exit_condition = &exit_condition;
|
||||
ri.period = nano2count(PERIOD);
|
||||
ri.update_sem = rt_sem_init(nam2num("MUTEX"), 1);
|
||||
|
||||
if(ri.update_sem == 0)
|
||||
exit(-1);
|
||||
|
||||
ri.used = 0;
|
||||
ri.worker = &worker_tasks;
|
||||
|
||||
now = rt_get_time() + ri.period;
|
||||
rt_task_make_periodic(self, now, ri.period);
|
||||
|
||||
/* start all threads */
|
||||
for(i = 0; i < NUM_THREADS; i++) {
|
||||
ti = (thread_info_t *)malloc(sizeof(thread_info_t));
|
||||
|
||||
if(ti == NULL) {
|
||||
rt_printk("MAINTK: can't get memory!\n");
|
||||
exit(-1);
|
||||
}
|
||||
|
||||
ti->ri = &ri;
|
||||
ti->thread_num = i;
|
||||
worker_threads[i] = rt_thread_create(msg_test_thread, ti , 10000);
|
||||
}
|
||||
|
||||
rt_sleep(NUM_THREADS * ri.period);
|
||||
|
||||
rt_printk("start\n");
|
||||
|
||||
for(i = 0; i < THRESHOLD; i++) {
|
||||
rt_task_wait_period();
|
||||
lost = 1;
|
||||
|
||||
for(ii = 0; ii < ri.used; ii++) {
|
||||
old_index = tm_get_next_task_index(old_index, &ri);
|
||||
|
||||
if(old_index == -TM_WORKER_ERROR) {
|
||||
rt_printk("MAINTK: No Tasks!\n");
|
||||
break;
|
||||
}
|
||||
|
||||
tmp_worker_task = rt_send_if(worker_tasks[old_index], i);
|
||||
|
||||
if(tmp_worker_task == worker_tasks[old_index]) {
|
||||
lost = 0;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if(lost)
|
||||
fail_count++;
|
||||
}
|
||||
|
||||
rt_printk("fail_count == %i\n", fail_count);
|
||||
|
||||
// cleanup
|
||||
exit_condition = 1;
|
||||
rt_make_soft_real_time();
|
||||
|
||||
rt_task_delete(self);
|
||||
|
||||
/* wait for the worker threadss */
|
||||
for(ii = 0; ii < ri.used; ii++) {
|
||||
rt_thread_join(worker_threads[ii]);
|
||||
}
|
||||
|
||||
stop_rt_timer();
|
||||
return 0;
|
||||
}
|
||||
@@ -1,53 +0,0 @@
|
||||
/*
|
||||
* Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
|
||||
* contributor license agreements. See the NOTICE file distributed with
|
||||
* this work for additional information regarding copyright ownership.
|
||||
* The OpenAirInterface Software Alliance licenses this file to You under
|
||||
* the OAI Public License, Version 1.1 (the "License"); you may not use this file
|
||||
* except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.openairinterface.org/?page_id=698
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*-------------------------------------------------------------------------------
|
||||
* For more information about the OpenAirInterface (OAI) Software Alliance:
|
||||
* contact@openairinterface.org
|
||||
*/
|
||||
|
||||
#ifndef __MSG_MANY_H__
|
||||
#define __MSG_MANY_H__
|
||||
#include <stdint.h>
|
||||
|
||||
#define PERIOD 500000 /* in nano seconds */
|
||||
#define THRESHOLD 1000000
|
||||
#define THREAD_NAME_PREFIX "TK"
|
||||
#define NUM_THREADS 10
|
||||
|
||||
#define TM_WORKER_FULL_ERROR 1
|
||||
#define TM_WORKER_ERROR 2
|
||||
|
||||
typedef struct run_info {
|
||||
RT_TASK *sender;
|
||||
uint8_t *exit_condition;
|
||||
long long period;
|
||||
SEM *update_sem; /* protect the task array */
|
||||
int used; /* counter of used slots in worker */
|
||||
RT_TASK *(*worker)[]; /* declare worker as pointer to array of pointer to RT_TASK */
|
||||
} run_info_t;
|
||||
|
||||
typedef struct thread_info {
|
||||
run_info_t *ri;
|
||||
uint8_t thread_num;
|
||||
} thread_info_t;
|
||||
|
||||
int tm_add_task(RT_TASK *task, run_info_t *ri);
|
||||
int tm_del_task(int task_index, run_info_t *ri);
|
||||
inline int tm_get_next_task_index(int old_index, run_info_t *ri);
|
||||
|
||||
#endif
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1,195 +0,0 @@
|
||||
[*]
|
||||
[*] GTKWave Analyzer v3.3.58 (w)1999-2014 BSI
|
||||
[*] Fri Jan 29 16:34:46 2016
|
||||
[*]
|
||||
[dumpfile] "/tmp/openair_dump_rrh.vcd"
|
||||
[dumpfile_mtime] "Fri Jan 29 16:20:55 2016"
|
||||
[dumpfile_size] 224259458
|
||||
[savefile] "/home/guepe/openairinterface5g_rrh/openairinterface5g/targets/RT/USER/rrh.gtkw"
|
||||
[timestart] 31315875900
|
||||
[size] 1004 1028
|
||||
[pos] 926 -1
|
||||
*-17.429794 31316090054 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1
|
||||
[sst_width] 224
|
||||
[signals_width] 261
|
||||
[sst_expanded] 1
|
||||
[sst_vpaned_height] 278
|
||||
@24
|
||||
[color] 1
|
||||
variables.hw_frame_rx[63:0]
|
||||
[color] 1
|
||||
variables.hw_subframe_rx[63:0]
|
||||
@28
|
||||
[color] 1
|
||||
functions.eNB_rx
|
||||
functions.eNB_rx_sleep
|
||||
[color] 3
|
||||
functions.trx_read_rf
|
||||
[color] 7
|
||||
functions.trx_write
|
||||
@c00024
|
||||
variables.rxcnt[63:0]
|
||||
@28
|
||||
(0)variables.rxcnt[63:0]
|
||||
(1)variables.rxcnt[63:0]
|
||||
(2)variables.rxcnt[63:0]
|
||||
(3)variables.rxcnt[63:0]
|
||||
(4)variables.rxcnt[63:0]
|
||||
(5)variables.rxcnt[63:0]
|
||||
(6)variables.rxcnt[63:0]
|
||||
(7)variables.rxcnt[63:0]
|
||||
(8)variables.rxcnt[63:0]
|
||||
(9)variables.rxcnt[63:0]
|
||||
(10)variables.rxcnt[63:0]
|
||||
(11)variables.rxcnt[63:0]
|
||||
(12)variables.rxcnt[63:0]
|
||||
(13)variables.rxcnt[63:0]
|
||||
(14)variables.rxcnt[63:0]
|
||||
(15)variables.rxcnt[63:0]
|
||||
(16)variables.rxcnt[63:0]
|
||||
(17)variables.rxcnt[63:0]
|
||||
(18)variables.rxcnt[63:0]
|
||||
(19)variables.rxcnt[63:0]
|
||||
(20)variables.rxcnt[63:0]
|
||||
(21)variables.rxcnt[63:0]
|
||||
(22)variables.rxcnt[63:0]
|
||||
(23)variables.rxcnt[63:0]
|
||||
(24)variables.rxcnt[63:0]
|
||||
(25)variables.rxcnt[63:0]
|
||||
(26)variables.rxcnt[63:0]
|
||||
(27)variables.rxcnt[63:0]
|
||||
(28)variables.rxcnt[63:0]
|
||||
(29)variables.rxcnt[63:0]
|
||||
(30)variables.rxcnt[63:0]
|
||||
(31)variables.rxcnt[63:0]
|
||||
(32)variables.rxcnt[63:0]
|
||||
(33)variables.rxcnt[63:0]
|
||||
(34)variables.rxcnt[63:0]
|
||||
(35)variables.rxcnt[63:0]
|
||||
(36)variables.rxcnt[63:0]
|
||||
(37)variables.rxcnt[63:0]
|
||||
(38)variables.rxcnt[63:0]
|
||||
(39)variables.rxcnt[63:0]
|
||||
(40)variables.rxcnt[63:0]
|
||||
(41)variables.rxcnt[63:0]
|
||||
(42)variables.rxcnt[63:0]
|
||||
(43)variables.rxcnt[63:0]
|
||||
(44)variables.rxcnt[63:0]
|
||||
(45)variables.rxcnt[63:0]
|
||||
(46)variables.rxcnt[63:0]
|
||||
(47)variables.rxcnt[63:0]
|
||||
(48)variables.rxcnt[63:0]
|
||||
(49)variables.rxcnt[63:0]
|
||||
(50)variables.rxcnt[63:0]
|
||||
(51)variables.rxcnt[63:0]
|
||||
(52)variables.rxcnt[63:0]
|
||||
(53)variables.rxcnt[63:0]
|
||||
(54)variables.rxcnt[63:0]
|
||||
(55)variables.rxcnt[63:0]
|
||||
(56)variables.rxcnt[63:0]
|
||||
(57)variables.rxcnt[63:0]
|
||||
(58)variables.rxcnt[63:0]
|
||||
(59)variables.rxcnt[63:0]
|
||||
(60)variables.rxcnt[63:0]
|
||||
(61)variables.rxcnt[63:0]
|
||||
(62)variables.rxcnt[63:0]
|
||||
(63)variables.rxcnt[63:0]
|
||||
@1401200
|
||||
-group_end
|
||||
@24
|
||||
variables.pck_rx[63:0]
|
||||
variables.rx_ts[63:0]
|
||||
@c00024
|
||||
variables.tx_seq_num[63:0]
|
||||
@28
|
||||
(0)variables.tx_seq_num[63:0]
|
||||
(1)variables.tx_seq_num[63:0]
|
||||
(2)variables.tx_seq_num[63:0]
|
||||
(3)variables.tx_seq_num[63:0]
|
||||
(4)variables.tx_seq_num[63:0]
|
||||
(5)variables.tx_seq_num[63:0]
|
||||
(6)variables.tx_seq_num[63:0]
|
||||
(7)variables.tx_seq_num[63:0]
|
||||
(8)variables.tx_seq_num[63:0]
|
||||
(9)variables.tx_seq_num[63:0]
|
||||
(10)variables.tx_seq_num[63:0]
|
||||
(11)variables.tx_seq_num[63:0]
|
||||
(12)variables.tx_seq_num[63:0]
|
||||
(13)variables.tx_seq_num[63:0]
|
||||
(14)variables.tx_seq_num[63:0]
|
||||
(15)variables.tx_seq_num[63:0]
|
||||
(16)variables.tx_seq_num[63:0]
|
||||
(17)variables.tx_seq_num[63:0]
|
||||
(18)variables.tx_seq_num[63:0]
|
||||
(19)variables.tx_seq_num[63:0]
|
||||
(20)variables.tx_seq_num[63:0]
|
||||
(21)variables.tx_seq_num[63:0]
|
||||
(22)variables.tx_seq_num[63:0]
|
||||
(23)variables.tx_seq_num[63:0]
|
||||
(24)variables.tx_seq_num[63:0]
|
||||
(25)variables.tx_seq_num[63:0]
|
||||
(26)variables.tx_seq_num[63:0]
|
||||
(27)variables.tx_seq_num[63:0]
|
||||
(28)variables.tx_seq_num[63:0]
|
||||
(29)variables.tx_seq_num[63:0]
|
||||
(30)variables.tx_seq_num[63:0]
|
||||
(31)variables.tx_seq_num[63:0]
|
||||
(32)variables.tx_seq_num[63:0]
|
||||
(33)variables.tx_seq_num[63:0]
|
||||
(34)variables.tx_seq_num[63:0]
|
||||
(35)variables.tx_seq_num[63:0]
|
||||
(36)variables.tx_seq_num[63:0]
|
||||
(37)variables.tx_seq_num[63:0]
|
||||
(38)variables.tx_seq_num[63:0]
|
||||
(39)variables.tx_seq_num[63:0]
|
||||
(40)variables.tx_seq_num[63:0]
|
||||
(41)variables.tx_seq_num[63:0]
|
||||
(42)variables.tx_seq_num[63:0]
|
||||
(43)variables.tx_seq_num[63:0]
|
||||
(44)variables.tx_seq_num[63:0]
|
||||
(45)variables.tx_seq_num[63:0]
|
||||
(46)variables.tx_seq_num[63:0]
|
||||
(47)variables.tx_seq_num[63:0]
|
||||
(48)variables.tx_seq_num[63:0]
|
||||
(49)variables.tx_seq_num[63:0]
|
||||
(50)variables.tx_seq_num[63:0]
|
||||
(51)variables.tx_seq_num[63:0]
|
||||
(52)variables.tx_seq_num[63:0]
|
||||
(53)variables.tx_seq_num[63:0]
|
||||
(54)variables.tx_seq_num[63:0]
|
||||
(55)variables.tx_seq_num[63:0]
|
||||
(56)variables.tx_seq_num[63:0]
|
||||
(57)variables.tx_seq_num[63:0]
|
||||
(58)variables.tx_seq_num[63:0]
|
||||
(59)variables.tx_seq_num[63:0]
|
||||
(60)variables.tx_seq_num[63:0]
|
||||
(61)variables.tx_seq_num[63:0]
|
||||
(62)variables.tx_seq_num[63:0]
|
||||
(63)variables.tx_seq_num[63:0]
|
||||
@1401200
|
||||
-group_end
|
||||
@24
|
||||
variables.hw_frame[63:0]
|
||||
variables.hw_subframe[63:0]
|
||||
@28
|
||||
[color] 1
|
||||
functions.eNB_tx
|
||||
functions.eNB_tx_sleep
|
||||
[color] 7
|
||||
functions.trx_read
|
||||
[color] 3
|
||||
functions.trx_write_rf
|
||||
@24
|
||||
variables.txcnt[63:0]
|
||||
variables.pck_tx[63:0]
|
||||
variables.tx_ts[63:0]
|
||||
@25
|
||||
variables.rx_seq_num_prv[63:0]
|
||||
@24
|
||||
variables.rx_seq_num[63:0]
|
||||
variables.hw_cnt_rx[63:0]
|
||||
variables.lhw_cnt_rx[63:0]
|
||||
[color] 3
|
||||
variables.cnt[63:0]
|
||||
[pattern_trace] 1
|
||||
[pattern_trace] 0
|
||||
@@ -1,460 +0,0 @@
|
||||
/*
|
||||
* Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
|
||||
* contributor license agreements. See the NOTICE file distributed with
|
||||
* this work for additional information regarding copyright ownership.
|
||||
* The OpenAirInterface Software Alliance licenses this file to You under
|
||||
* the OAI Public License, Version 1.1 (the "License"); you may not use this file
|
||||
* except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.openairinterface.org/?page_id=698
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*-------------------------------------------------------------------------------
|
||||
* For more information about the OpenAirInterface (OAI) Software Alliance:
|
||||
* contact@openairinterface.org
|
||||
*/
|
||||
|
||||
|
||||
/*! \file rrh_gw.h
|
||||
* \brief top-level for the remote radio head gateway (RRH_gw) module reusing the ethernet library
|
||||
* \author Navid Nikaein, Katerina Trilyraki, Raymond Knopp
|
||||
* \date 2015
|
||||
* \version 0.1
|
||||
* \company Eurecom
|
||||
* \maintainer: navid.nikaein@eurecom.fr
|
||||
* \note
|
||||
* \warning very experimental
|
||||
*/
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <signal.h>
|
||||
#include <execinfo.h>
|
||||
#include <unistd.h>
|
||||
#include <sys/socket.h>
|
||||
#include <arpa/inet.h>
|
||||
#include <net/if.h>
|
||||
#include <time.h>
|
||||
|
||||
#include "common_lib.h"
|
||||
#include "rrh_gw.h"
|
||||
#include "rt_wrapper.h"
|
||||
#include "rrh_gw_externs.h"
|
||||
|
||||
|
||||
#include "log_if.h"
|
||||
#include "log_extern.h"
|
||||
#include "vcd_signal_dumper.h"
|
||||
|
||||
/*****************************************************************************************
|
||||
* ---------- *
|
||||
* ------- RRH_BBU_IF ------- RRH_RF_IF -------USRP - COTS_UE- *
|
||||
* - BBU - --------------- - RRH - ------------- -------BLADERF ---------- *
|
||||
* ------- ------- -------EXMIMO *
|
||||
* --------- *
|
||||
* -------ETH_IF - EMU_UE- *
|
||||
* --------- *
|
||||
*****************************************************************************************/
|
||||
|
||||
|
||||
/* local IP/MAC address is detected*/
|
||||
char rrh_ip[20] = "0.0.0.0";
|
||||
unsigned char rrh_mac[20] = "0:0:0:0:0:0";
|
||||
int rrh_port = 50000; // has to be an option
|
||||
|
||||
/* log */
|
||||
int16_t glog_level = LOG_DEBUG;
|
||||
int16_t glog_verbosity = LOG_MED;
|
||||
int16_t rrh_log_level = LOG_INFO;
|
||||
int16_t rrh_log_verbosity = LOG_MED;
|
||||
int16_t enb_log_level = LOG_INFO;
|
||||
int16_t enb_log_verbosity = LOG_MED;
|
||||
int16_t ue_log_level = LOG_INFO;
|
||||
int16_t ue_log_verbosity = LOG_MED;
|
||||
|
||||
|
||||
/* flag definitions */
|
||||
uint8_t eNB_flag=0;
|
||||
uint8_t UE_flag=0;
|
||||
uint8_t EXMIMO_flag=0;
|
||||
uint8_t USRP_flag=0;
|
||||
uint8_t RT_flag=0, NRT_flag=1;
|
||||
uint8_t rrh_exit=0;
|
||||
uint8_t loopback_flag=0;
|
||||
uint8_t measurements_flag=0;
|
||||
|
||||
/* Default operation as RRH:
|
||||
- there are neither eNB nor UE modules
|
||||
- no RF hardware is specified (NONE_IF)
|
||||
- default ethernet interface is local */
|
||||
uint8_t num_eNB_mod=0;
|
||||
uint8_t num_UE_mod=0;
|
||||
char* if_name="lo";
|
||||
uint8_t eth_mode=ETH_UDP_MODE;
|
||||
|
||||
rrh_module_t *enb_array;
|
||||
rrh_module_t *ue_array;
|
||||
|
||||
openair0_vtimestamp hw_counter=0;
|
||||
|
||||
char rf_config_file[1024];
|
||||
|
||||
static void debug_init(void);
|
||||
static void get_options(int argc, char *argv[]);
|
||||
static void print_help(void);
|
||||
|
||||
/*!\fn static rrh_module_t new_module(unsigned int id);
|
||||
* \brief creation of a eNB/UE module
|
||||
* \param[in] module id
|
||||
* \return module
|
||||
* \note
|
||||
* @ingroup _oai
|
||||
*/
|
||||
static rrh_module_t new_module(unsigned int id);
|
||||
|
||||
/*!\fn static int get_address(char* if_name, uint8_t flag);
|
||||
* \brief retrieves IP address from the specified network interface
|
||||
* \param[in] name of network interface
|
||||
* \return 0
|
||||
* \note
|
||||
* @ingroup _oai
|
||||
*/
|
||||
static int get_address(char* if_name, uint8_t flag);
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
int main(int argc, char **argv) {
|
||||
|
||||
unsigned int i;
|
||||
rf_config_file[0]='\0';
|
||||
/* parse input arguments */
|
||||
get_options(argc, argv);
|
||||
/* initialize logger and signal analyzer */
|
||||
debug_init();
|
||||
/* */
|
||||
set_latency_target();
|
||||
/* make a graceful exit when ctrl-c is pressed */
|
||||
signal(SIGSEGV, signal_handler);
|
||||
signal(SIGINT, signal_handler);
|
||||
|
||||
/* create modules based on input arguments */
|
||||
if (eNB_flag==1){
|
||||
enb_array=(rrh_module_t*)malloc(num_eNB_mod*sizeof(rrh_module_t));
|
||||
for(i=0;i<num_eNB_mod;i++){
|
||||
enb_array[i]=new_module(i);//enb_array[i]=new_module(i, get_RF_interfaces(&hardware_target));
|
||||
config_BBU_mod(&enb_array[i],RT_flag,NRT_flag);
|
||||
LOG_I(RRH,"[eNB %d] module(s) created (out of %u) \n",i,num_eNB_mod);
|
||||
}
|
||||
}
|
||||
if (UE_flag==1){
|
||||
ue_array=(rrh_module_t*)malloc(num_UE_mod*sizeof(rrh_module_t));
|
||||
for(i=0;i<num_UE_mod;i++){
|
||||
ue_array[i]=new_module(i);
|
||||
config_UE_mod(&ue_array[i],RT_flag,NRT_flag);
|
||||
LOG_I(RRH,"[UE %d] module(s) created (out of %u)\n",i, num_UE_mod);
|
||||
}
|
||||
}
|
||||
|
||||
printf("TYPE <CTRL-C> TO TERMINATE\n");
|
||||
|
||||
while (rrh_exit==0)
|
||||
sleep(1);
|
||||
|
||||
return EXIT_SUCCESS;
|
||||
}
|
||||
|
||||
|
||||
static rrh_module_t new_module (unsigned int id) {
|
||||
|
||||
rrh_module_t rrh_mod;
|
||||
openair0_config_t openair0_cfg;
|
||||
|
||||
rrh_mod.id=id;
|
||||
rrh_mod.loopback=loopback_flag;
|
||||
rrh_mod.measurements=measurements_flag;
|
||||
|
||||
/* each module is associated with an ethernet device */
|
||||
rrh_mod.eth_dev.type=NONE_DEV;
|
||||
rrh_mod.eth_dev.transp_type=NONE_TP;
|
||||
/* ethernet device is functioning within RRH */
|
||||
rrh_mod.eth_dev.host_type=RRH_HOST;
|
||||
/* */
|
||||
rrh_mod.eth_dev.openair0_cfg = (openair0_config_t*)malloc(sizeof(openair0_config_t));
|
||||
memset(rrh_mod.eth_dev.openair0_cfg,0,sizeof(openair0_config_t));
|
||||
/* get IP and MAC address */
|
||||
get_address(if_name,eth_mode);
|
||||
|
||||
if(eth_mode==ETH_UDP_MODE) {
|
||||
openair0_cfg.my_addr = &rrh_ip[0];
|
||||
openair0_cfg.my_port = rrh_port;
|
||||
LOG_I(RRH,"UDP mode selected for ethernet.\n");
|
||||
} else if (eth_mode==ETH_RAW_MODE) {
|
||||
openair0_cfg.my_addr = (char*)&rrh_mac[0];
|
||||
openair0_cfg.my_port = rrh_port;
|
||||
LOG_I(RRH,"RAW mode selected for ethernet.\n");
|
||||
}
|
||||
|
||||
/* */
|
||||
eth_params_t *eth_params = (eth_params_t*)malloc(sizeof(eth_params_t));
|
||||
memset(eth_params, 0, sizeof(eth_params_t));
|
||||
eth_params->local_if_name = if_name;
|
||||
eth_params->transp_preference = eth_mode;
|
||||
|
||||
/* ethernet device initialization */
|
||||
if (openair0_transport_load(&rrh_mod.eth_dev, &openair0_cfg,eth_params)<0) {
|
||||
LOG_E(RRH,"Exiting, cannot initialize ethernet interface.\n");
|
||||
exit(-1);
|
||||
}
|
||||
|
||||
/* allocate space and specify associated RF device */
|
||||
openair0_device *oai_dv = (openair0_device *)malloc(sizeof(openair0_device));
|
||||
memset(oai_dv,0,sizeof(openair0_device));
|
||||
|
||||
rrh_mod.devs=oai_dv;
|
||||
rrh_mod.devs->type=NONE_DEV;
|
||||
rrh_mod.devs->transp_type=NONE_TP;
|
||||
rrh_mod.devs->host_type=RRH_HOST;
|
||||
|
||||
return rrh_mod;
|
||||
}
|
||||
|
||||
static void debug_init(void) {
|
||||
|
||||
/* log initialization */
|
||||
logInit();
|
||||
set_glog(glog_level, glog_verbosity);
|
||||
|
||||
set_comp_log(RRH, rrh_log_level, rrh_log_verbosity, 1);
|
||||
//set_comp_log(ENB_LOG, enb_log_level, enb_log_verbosity, 1);
|
||||
//set_comp_log(UE_LOG, ue_log_level, ue_log_verbosity, 1);
|
||||
|
||||
/* vcd initialization */
|
||||
if (ouput_vcd) {
|
||||
vcd_signal_dumper_init("/tmp/openair_dump_rrh.vcd");
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
static void get_options(int argc, char *argv[]) {
|
||||
|
||||
int opt;
|
||||
|
||||
while ((opt = getopt(argc, argv, "xvhlte:n:u:g:r:m:i:f:")) != -1) {
|
||||
|
||||
switch (opt) {
|
||||
case 'n':
|
||||
eNB_flag=1;
|
||||
num_eNB_mod=atoi(optarg);
|
||||
break;
|
||||
case 'u':
|
||||
UE_flag=1;
|
||||
num_UE_mod=atoi(optarg);
|
||||
break;
|
||||
case 'g':
|
||||
glog_level=atoi(optarg);
|
||||
break;
|
||||
case 'i':
|
||||
if (optarg) {
|
||||
if_name=strdup(optarg);
|
||||
printf("RRH interface name is set to %s\n", if_name);
|
||||
}
|
||||
break;
|
||||
case 'm':
|
||||
eth_mode=atoi(optarg);
|
||||
break;
|
||||
case 'r':
|
||||
//rrh_log_level=atoi(optarg);
|
||||
break;
|
||||
case 'e':
|
||||
//enb_log_level=atoi(optarg);
|
||||
break;
|
||||
case 'x':
|
||||
rt_period = DEFAULT_PERIOD_NS;
|
||||
RT_flag=1;
|
||||
NRT_flag=0;
|
||||
break;
|
||||
case 'v':
|
||||
/* extern from vcd */
|
||||
ouput_vcd=1;
|
||||
break;
|
||||
case 'l':
|
||||
/*In loopback mode rrh sends back to bbu what it receives*/
|
||||
loopback_flag=1;
|
||||
break;
|
||||
case 'f':
|
||||
if (optarg){
|
||||
if ((strcmp("null", optarg) == 0) || (strcmp("NULL", optarg) == 0)) {
|
||||
printf("no configuration filename is provided\n");
|
||||
}
|
||||
else if (strlen(optarg)<=1024){
|
||||
// rf_config_file = strdup(optarg);
|
||||
strcpy(rf_config_file,optarg);
|
||||
}else {
|
||||
printf("Configuration filename is too long\n");
|
||||
exit(-1);
|
||||
}
|
||||
}
|
||||
break;
|
||||
case 't':
|
||||
/* When measurements are enabled statistics related to TX/RX time are printed */
|
||||
measurements_flag=1;
|
||||
break;
|
||||
case 'h':
|
||||
print_help();
|
||||
exit(-1);
|
||||
default: /* '?' */
|
||||
//fprintf(stderr, "Usage: \n", argv[0]);
|
||||
exit(-1);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
static int get_address(char* if_name, uint8_t flag) {
|
||||
|
||||
int fd;
|
||||
struct ifreq ifr;
|
||||
|
||||
fd = socket(AF_INET, SOCK_DGRAM, 0);
|
||||
/* I want to get an IPv4 IP address */
|
||||
ifr.ifr_addr.sa_family = AF_INET;
|
||||
/* I want IP address attached to "if_name" */
|
||||
strncpy(ifr.ifr_name, if_name, IFNAMSIZ-1);
|
||||
|
||||
if (flag==ETH_UDP_MODE) {
|
||||
if ( ioctl(fd, SIOCGIFADDR, &ifr)<0 ) {
|
||||
perror("IOCTL:");
|
||||
exit(-1);
|
||||
}
|
||||
snprintf(&rrh_ip[0],20,"%s", inet_ntoa(((struct sockaddr_in *)&ifr.ifr_addr)->sin_addr));
|
||||
LOG_I(RRH,"%s: IP address: %s\n",if_name,rrh_ip);
|
||||
} else if (flag==ETH_RAW_MODE) {
|
||||
if ( ioctl(fd, SIOCGIFHWADDR, &ifr)<0 ) {
|
||||
perror("IOCTL:");
|
||||
exit(-1);
|
||||
}
|
||||
ether_ntoa_r ((struct ether_addr *)ifr.ifr_hwaddr.sa_data, (char*)rrh_mac);
|
||||
LOG_I(RRH,"%s: MAC address: %s\n",if_name,rrh_mac);
|
||||
}
|
||||
|
||||
close(fd);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
static void print_help(void) {
|
||||
|
||||
puts("Usage: \n");
|
||||
puts(" sudo -E chrt 99 ./rrh -n1 -g6 -v -t -i lo -m1");
|
||||
puts("Options:\n");
|
||||
puts("\t -n create eNB module\n");
|
||||
puts("\t -u create UE module\n");
|
||||
puts("\t -g define global log level\n");
|
||||
puts("\t -i set the RRH interface (default lo)\n");
|
||||
puts("\t -m set ethernet mode to be used by RRH, valid options: (1:raw, 0:udp) \n");
|
||||
puts("\t -r define rrh log level\n");
|
||||
puts("\t -e define eNB log level\n");
|
||||
puts("\t -x enable real time bahaviour\n");
|
||||
puts("\t -v enable vcd dump\n");
|
||||
puts("\t -l enable loopback mode\n");
|
||||
puts("\t -t enable measurements\n");
|
||||
puts("\t -h display info\n");
|
||||
|
||||
}
|
||||
|
||||
|
||||
void *timer_proc(void *arg) {
|
||||
|
||||
timer_t timerid;
|
||||
struct itimerspec *timer= (struct itimerspec *)arg ; // the timer data structure
|
||||
struct itimerspec old_value;
|
||||
|
||||
|
||||
#ifdef DEADLINE_SCHEDULER
|
||||
struct sched_attr attr;
|
||||
unsigned int flags = 0;
|
||||
|
||||
attr.size = sizeof(attr);
|
||||
attr.sched_flags = 0;
|
||||
attr.sched_nice = 0;
|
||||
attr.sched_priority = 0;
|
||||
|
||||
attr.sched_policy = SCHED_DEADLINE;
|
||||
attr.sched_runtime = (0.1 * 100) * 10000; //
|
||||
attr.sched_deadline = rt_period-30000;//(0.1 * 100) * 10000;
|
||||
attr.sched_period = rt_period;//(0.1 * 100) * 10000; // each TX/RX thread has, as a function of RT PERIOD ??
|
||||
|
||||
if (sched_setattr(0, &attr, flags) < 0 ) {
|
||||
perror("[SCHED] timer thread: sched_setattr failed\n");
|
||||
exit(-1);
|
||||
}
|
||||
#endif
|
||||
|
||||
if (timer_create (CLOCK_REALTIME, NULL, &timerid) == -1) {
|
||||
fprintf (stderr, "couldn't create a timer\n");
|
||||
perror (NULL);
|
||||
exit (EXIT_FAILURE);
|
||||
}
|
||||
|
||||
signal(SIGALRM, timer_signal_handler);
|
||||
LOG_I(RRH,"Timer has started!\n");
|
||||
timer_settime (timerid, 0, timer, &old_value);
|
||||
|
||||
while (!rrh_exit) {
|
||||
sleep(1);
|
||||
}
|
||||
|
||||
timer_delete(timerid);
|
||||
|
||||
return (0);
|
||||
}
|
||||
|
||||
|
||||
void timer_signal_handler(int sig) {
|
||||
|
||||
if (sig == SIGALRM) {
|
||||
pthread_mutex_lock(&timer_mutex);
|
||||
hw_counter ++;
|
||||
pthread_mutex_unlock(&timer_mutex);
|
||||
VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_CNT, hw_counter);//USED ELSEWHERE
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void signal_handler(int sig) {
|
||||
|
||||
void *array[10];
|
||||
size_t size;
|
||||
|
||||
if (sig==SIGSEGV) {
|
||||
// get void*'s for all entries on the stack
|
||||
size = backtrace(array, 10);
|
||||
|
||||
// print out all the frames to stderr
|
||||
fprintf(stderr, "Error: signal %d:\n", sig);
|
||||
backtrace_symbols_fd(array, size, 2);
|
||||
exit(-1);
|
||||
} else {
|
||||
printf("trying to exit gracefully...\n");
|
||||
rrh_exit = 1;
|
||||
}
|
||||
}
|
||||
|
||||
void exit_fun(const char* s) {
|
||||
if (s != NULL) {
|
||||
printf("%s %s() Exiting RRH: %s\n",__FILE__, __FUNCTION__, s);
|
||||
}
|
||||
rrh_exit = 1;
|
||||
exit (-1);
|
||||
}
|
||||
|
||||
|
||||
@@ -1,104 +0,0 @@
|
||||
/*
|
||||
* Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
|
||||
* contributor license agreements. See the NOTICE file distributed with
|
||||
* this work for additional information regarding copyright ownership.
|
||||
* The OpenAirInterface Software Alliance licenses this file to You under
|
||||
* the OAI Public License, Version 1.1 (the "License"); you may not use this file
|
||||
* except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.openairinterface.org/?page_id=698
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*-------------------------------------------------------------------------------
|
||||
* For more information about the OpenAirInterface (OAI) Software Alliance:
|
||||
* contact@openairinterface.org
|
||||
*/
|
||||
|
||||
/*! \file rrh_gw.h
|
||||
* \brief header file for remote radio head gateway (RRH_gw) module
|
||||
* \author Navid Nikaein, Katerina Trilyraki, Raymond Knopp
|
||||
* \date 2015
|
||||
* \version 0.1
|
||||
* \company Eurecom
|
||||
* \maintainer: navid.nikaein@eurecom.fr
|
||||
* \note
|
||||
* \warning very experimental
|
||||
*/
|
||||
|
||||
#ifndef RRH_GW_H_
|
||||
#define RRH_GW_H_
|
||||
|
||||
#include "ethernet_lib.h"
|
||||
#include "vcd_signal_dumper.h"
|
||||
#include "assertions.h"
|
||||
|
||||
#define DEFAULT_PERIOD_NS 200000 /* default value is calculated for 25 PRB */
|
||||
#define RRH_UE_PORT 51000
|
||||
#define RRH_UE_DEST_IP "127.0.0.1"
|
||||
|
||||
/*! \brief RRH supports two types of modules: eNB and UE
|
||||
each module is associated with an ethernet device (device of ETH_IF)
|
||||
and optionally with a RF device (device type can be USRP_B200/USRP_X300/BLADERF_IF/EXMIMO_IF/NONE_IF)
|
||||
UE modules will always have RF device type NONE_IF */
|
||||
typedef struct {
|
||||
/*! \brief module id */
|
||||
uint8_t id;
|
||||
/*! \brief! loopback flag */
|
||||
uint8_t loopback;
|
||||
/*! \brief measurement flag */
|
||||
uint8_t measurements;
|
||||
/*! \brief module's ethernet device */
|
||||
openair0_device eth_dev;
|
||||
/*! \brief pointer to RF module's device (pointer->since it's optional) */
|
||||
openair0_device *devs;
|
||||
}rrh_module_t;
|
||||
|
||||
/*! \fn void timer_signal_handler(int sig)
|
||||
* \brief this function
|
||||
* \param[in] signal type
|
||||
* \return none
|
||||
* \note
|
||||
* @ingroup _oai
|
||||
*/
|
||||
void timer_signal_handler(int);
|
||||
|
||||
/*! \fn void *timer_proc(void *arg)
|
||||
* \brief this function
|
||||
* \param[in]
|
||||
* \param[out]
|
||||
* \return
|
||||
* \note
|
||||
* @ingroup _oai
|
||||
*/
|
||||
void *timer_proc(void *);
|
||||
|
||||
/*! \fn void config_BBU_mod( rrh_module_t *mod_enb, uint8_t RT_flag,uint8_t NRT_flag)
|
||||
* \brief receive and apply configuration to modules' optional device
|
||||
* \param[in] *mod_enb pointer to module
|
||||
* \param[in] RT_flag real time flag
|
||||
* \return none
|
||||
* \note
|
||||
* @ingroup _oai
|
||||
*/
|
||||
void config_BBU_mod( rrh_module_t *mod_enb, uint8_t RT_flag, uint8_t NRT_flag);
|
||||
|
||||
/*! \fn void config_UE_mod( rrh_module_t *dev_ue, uint8_t RT_flag,uint8_t NRT_flag)
|
||||
* \brief this function
|
||||
* \param[in] *mod_ue pointer to module
|
||||
* \param[in]
|
||||
* \return none
|
||||
* \note
|
||||
* @ingroup _oai
|
||||
*/
|
||||
void config_UE_mod( rrh_module_t *dev_ue, uint8_t RT_flag, uint8_t NRT_flag);
|
||||
|
||||
|
||||
|
||||
void signal_handler(int sig);
|
||||
|
||||
#endif
|
||||
@@ -1,48 +0,0 @@
|
||||
/*
|
||||
* Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
|
||||
* contributor license agreements. See the NOTICE file distributed with
|
||||
* this work for additional information regarding copyright ownership.
|
||||
* The OpenAirInterface Software Alliance licenses this file to You under
|
||||
* the OAI Public License, Version 1.1 (the "License"); you may not use this file
|
||||
* except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.openairinterface.org/?page_id=698
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*-------------------------------------------------------------------------------
|
||||
* For more information about the OpenAirInterface (OAI) Software Alliance:
|
||||
* contact@openairinterface.org
|
||||
*/
|
||||
|
||||
/*! \file rrh_gw_extern.h
|
||||
* \brief rrh gatewy external vars
|
||||
* \author Navid Nikaein, Katerina Trilyraki, Raymond Knopp
|
||||
* \date 2015
|
||||
* \version 0.1
|
||||
* \company Eurecom
|
||||
* \maintainer: navid.nikaein@eurecom.fr
|
||||
* \note
|
||||
* \warning very experimental
|
||||
*/
|
||||
|
||||
#ifndef RRH_GW_EXTERNS_H_
|
||||
#define RRH_GW_EXTERNS_H_
|
||||
extern char rf_config_file[1024];
|
||||
|
||||
extern openair0_timestamp timestamp_UE_tx[4] ,timestamp_UE_rx[4] ,timestamp_eNB_rx[4],timestamp_eNB_tx[4];
|
||||
extern openair0_vtimestamp hw_counter;
|
||||
extern int32_t UE_tx_started,UE_rx_started,eNB_rx_started ,eNB_tx_started;
|
||||
extern int32_t nsamps_UE[4],nsamps_eNB[4];
|
||||
extern int32_t overflow_rx_buffer_eNB[4],overflow_rx_buffer_UE[4];
|
||||
extern uint8_t rrh_exit;
|
||||
extern int32_t **rx_buffer_eNB, **rx_buffer_UE;
|
||||
extern unsigned int rt_period;
|
||||
extern pthread_mutex_t timer_mutex;
|
||||
|
||||
|
||||
#endif
|
||||
@@ -1,302 +0,0 @@
|
||||
/*
|
||||
* Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
|
||||
* contributor license agreements. See the NOTICE file distributed with
|
||||
* this work for additional information regarding copyright ownership.
|
||||
* The OpenAirInterface Software Alliance licenses this file to You under
|
||||
* the OAI Public License, Version 1.1 (the "License"); you may not use this file
|
||||
* except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.openairinterface.org/?page_id=698
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*-------------------------------------------------------------------------------
|
||||
* For more information about the OpenAirInterface (OAI) Software Alliance:
|
||||
* contact@openairinterface.org
|
||||
*/
|
||||
|
||||
/*! \file lte-softmodem.c
|
||||
* \brief main program to control HW and scheduling
|
||||
* \author R. Knopp, F. Kaltenberger
|
||||
* \date 2012
|
||||
* \version 0.1
|
||||
* \company Eurecom
|
||||
* \email: knopp@eurecom.fr,florian.kaltenberger@eurecom.fr
|
||||
* \note
|
||||
* \warning
|
||||
*/
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <unistd.h>
|
||||
#include <string.h>
|
||||
#include <sys/ioctl.h>
|
||||
#include <sys/types.h>
|
||||
#include <sys/mman.h>
|
||||
#include <sys/stat.h>
|
||||
#include <fcntl.h>
|
||||
#include <sched.h>
|
||||
#include <signal.h>
|
||||
#include <execinfo.h>
|
||||
#include <getopt.h>
|
||||
#include <pthread.h>
|
||||
|
||||
#include "rt_wrapper.h"
|
||||
|
||||
#define TIMER_ONESHOT_MODE
|
||||
#define FRAME_PERIOD 10000000ULL
|
||||
#define DAQ_PERIOD 500000ULL
|
||||
#define LTE_SLOTS_PER_FRAME 20
|
||||
|
||||
#ifdef RTAI
|
||||
static SEM *mutex;
|
||||
//static CND *cond;
|
||||
|
||||
static long int thread0;
|
||||
static long int thread1;
|
||||
//static long int sync_thread;
|
||||
#else
|
||||
#define OPENAIR_THREAD_STACK_SIZE 8192
|
||||
#define OPENAIR_THREAD_PRIORITY 255
|
||||
pthread_t thread0;
|
||||
//pthread_t thread1;
|
||||
pthread_attr_t attr_dlsch_threads;
|
||||
struct sched_param sched_param_dlsch;
|
||||
#endif
|
||||
|
||||
int oai_exit = 0;
|
||||
|
||||
struct timing_info_t {
|
||||
//unsigned int frame, hw_slot, last_slot, next_slot;
|
||||
RTIME time_min, time_max, time_avg, time_last, time_now;
|
||||
//unsigned int mbox0, mbox1, mbox2, mbox_target;
|
||||
unsigned int n_samples;
|
||||
} timing_info;
|
||||
|
||||
void signal_handler(int sig)
|
||||
{
|
||||
void *array[10];
|
||||
size_t size;
|
||||
|
||||
if (sig==SIGSEGV) {
|
||||
// get void*'s for all entries on the stack
|
||||
size = backtrace(array, 10);
|
||||
|
||||
// print out all the frames to stderr
|
||||
fprintf(stderr, "Error: signal %d:\n", sig);
|
||||
backtrace_symbols_fd(array, size, 2);
|
||||
exit(-1);
|
||||
} else {
|
||||
oai_exit=1;
|
||||
}
|
||||
}
|
||||
|
||||
void exit_fun(const char* s)
|
||||
{
|
||||
void *array[10];
|
||||
size_t size;
|
||||
|
||||
printf("Exiting: %s\n",s);
|
||||
|
||||
oai_exit=1;
|
||||
//rt_sleep_ns(FRAME_PERIOD);
|
||||
|
||||
//exit (-1);
|
||||
}
|
||||
|
||||
int frame=0,slot=0;
|
||||
|
||||
/* This is the main eNB thread. It gets woken up by the kernel driver using the RTAI message mechanism (rt_send and rt_receive). */
|
||||
static void *eNB_thread(void *arg)
|
||||
{
|
||||
#ifdef RTAI
|
||||
RT_TASK *task;
|
||||
RTIME now;
|
||||
#endif
|
||||
unsigned char last_slot, next_slot;
|
||||
RTIME time_in, time_diff;
|
||||
int ret;
|
||||
|
||||
#ifdef RTAI
|
||||
task = rt_task_init_schmod(nam2num("TASK0"), 0, 0, 0, SCHED_FIFO, 0xF);
|
||||
printf("Started eNB thread (id %p)\n",task);
|
||||
#ifndef TIMER_ONESHOT_MODE
|
||||
now = rt_get_time();
|
||||
ret = rt_task_make_periodic(task, now, nano2count(DAQ_PERIOD));
|
||||
|
||||
if (ret!=0)
|
||||
printf("Problem with periodic timer\n");
|
||||
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#ifdef HARD_RT
|
||||
rt_make_hard_real_time();
|
||||
#endif
|
||||
|
||||
mlockall(MCL_CURRENT | MCL_FUTURE);
|
||||
|
||||
timing_info.time_min = 100000000ULL;
|
||||
timing_info.time_max = 0;
|
||||
timing_info.time_avg = 0;
|
||||
timing_info.n_samples = 0;
|
||||
|
||||
while (!oai_exit) {
|
||||
time_in = rt_get_time_ns();
|
||||
#ifdef TIMER_ONESHOT_MODE
|
||||
ret = rt_sleep_ns(DAQ_PERIOD);
|
||||
|
||||
if (ret)
|
||||
printf("eNB Frame %d, time %llu: rt_sleep_ns returned %d\n",frame,time_in,ret);
|
||||
|
||||
#else
|
||||
rt_task_wait_period();
|
||||
#endif
|
||||
time_diff = rt_get_time_ns() - time_in;
|
||||
|
||||
if (time_diff > timing_info.time_max)
|
||||
timing_info.time_max = time_diff;
|
||||
|
||||
if (time_diff < timing_info.time_min)
|
||||
timing_info.time_min = time_diff;
|
||||
|
||||
timing_info.time_avg = (timing_info.time_avg*timing_info.n_samples + time_diff)/(timing_info.n_samples+1);
|
||||
timing_info.n_samples++;
|
||||
|
||||
last_slot = (slot)%LTE_SLOTS_PER_FRAME;
|
||||
|
||||
if (last_slot <0)
|
||||
last_slot+=20;
|
||||
|
||||
next_slot = (slot+3)%LTE_SLOTS_PER_FRAME;
|
||||
|
||||
slot++;
|
||||
|
||||
if (slot==20) {
|
||||
slot=0;
|
||||
frame++;
|
||||
}
|
||||
}
|
||||
|
||||
printf("eNB_thread: finished, ran %d times.\n",frame);
|
||||
|
||||
#ifdef HARD_RT
|
||||
rt_make_soft_real_time();
|
||||
#endif
|
||||
|
||||
// clean task
|
||||
#ifdef RTAI
|
||||
rt_task_delete(task);
|
||||
#endif
|
||||
printf("Task deleted. returning\n");
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
int main(int argc, char **argv)
|
||||
{
|
||||
|
||||
#ifdef RTAI
|
||||
RT_TASK *task;
|
||||
RTIME period;
|
||||
#else
|
||||
int error_code;
|
||||
#endif
|
||||
int i,j,aa;
|
||||
void *status;
|
||||
|
||||
// to make a graceful exit when ctrl-c is pressed
|
||||
signal(SIGSEGV, signal_handler);
|
||||
signal(SIGINT, signal_handler);
|
||||
|
||||
#ifndef RTAI
|
||||
check_clock();
|
||||
#endif
|
||||
|
||||
mlockall(MCL_CURRENT | MCL_FUTURE);
|
||||
|
||||
#ifdef RTAI
|
||||
// make main thread LXRT soft realtime
|
||||
task = rt_task_init_schmod(nam2num("MYTASK"), 9, 0, 0, SCHED_FIFO, 0xF);
|
||||
|
||||
// start realtime timer and scheduler
|
||||
#ifdef TIMER_ONESHOT_MODE
|
||||
rt_set_oneshot_mode();
|
||||
start_rt_timer(0);
|
||||
printf("started RTAI timer in oneshot mode\n");
|
||||
#else
|
||||
rt_set_periodic_mode();
|
||||
period = start_rt_timer(nano2count(500000));
|
||||
printf("started RTAI timer with period %llu ns\n",count2nano(period));
|
||||
#endif
|
||||
|
||||
printf("Init mutex\n");
|
||||
//mutex = rt_get_adr(nam2num("MUTEX"));
|
||||
mutex = rt_sem_init(nam2num("MUTEX"), 1);
|
||||
|
||||
if (mutex==0) {
|
||||
printf("Error init mutex\n");
|
||||
exit(-1);
|
||||
} else
|
||||
printf("mutex=%p\n",mutex);
|
||||
|
||||
#endif
|
||||
|
||||
rt_sleep_ns(10*FRAME_PERIOD);
|
||||
|
||||
#ifndef RTAI
|
||||
pthread_attr_init (&attr_dlsch_threads);
|
||||
pthread_attr_setstacksize(&attr_dlsch_threads,OPENAIR_THREAD_STACK_SIZE);
|
||||
//attr_dlsch_threads.priority = 1;
|
||||
sched_param_dlsch.sched_priority = sched_get_priority_max(SCHED_FIFO); //OPENAIR_THREAD_PRIORITY;
|
||||
pthread_attr_setschedparam (&attr_dlsch_threads, &sched_param_dlsch);
|
||||
pthread_attr_setschedpolicy (&attr_dlsch_threads, SCHED_FIFO);
|
||||
#endif
|
||||
|
||||
#ifdef RTAI
|
||||
thread0 = rt_thread_create(eNB_thread, NULL, 100000000);
|
||||
#else
|
||||
error_code = pthread_create(&thread0, &attr_dlsch_threads, eNB_thread, NULL);
|
||||
|
||||
if (error_code!= 0) {
|
||||
printf("[lte-softmodem.c] Could not allocate eNB_thread, error %d\n",error_code);
|
||||
return(error_code);
|
||||
} else {
|
||||
printf("[lte-softmodem.c] Allocate eNB_thread successful\n");
|
||||
}
|
||||
|
||||
#endif
|
||||
printf("eNB threads created\n");
|
||||
|
||||
|
||||
|
||||
// wait for end of program
|
||||
printf("TYPE <CTRL-C> TO TERMINATE\n");
|
||||
|
||||
//getchar();
|
||||
while (oai_exit==0) {
|
||||
|
||||
printf("eNB Frame %d, hw_slot %d (time %llu): period %llu, sleep time (avg/min/max/samples) %llu / %llu / %llu / %d, ratio %f\n",frame,slot,rt_get_time_ns(),DAQ_PERIOD,timing_info.time_avg,
|
||||
timing_info.time_min,timing_info.time_max,timing_info.n_samples,(double)timing_info.time_avg/DAQ_PERIOD);
|
||||
|
||||
|
||||
rt_sleep_ns(100*FRAME_PERIOD);
|
||||
}
|
||||
|
||||
// stop threads
|
||||
#ifdef RTAI
|
||||
rt_thread_join(thread0);
|
||||
#else
|
||||
pthread_join(thread0,&status);
|
||||
#endif
|
||||
|
||||
#ifdef RTAI
|
||||
stop_rt_timer();
|
||||
#endif
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -29,13 +29,12 @@ endif
|
||||
|
||||
|
||||
CFLAGS += -Wpointer-sign
|
||||
CFLAGS += -DUSER_MODE -DNB_ANTENNAS_RX=2 -DNB_ANTENNAS_TXRX=2 -DNB_ANTENNAS_TX=2 $(CPUFLAGS) -I/usr/include/X11 #-Wno-packed-bitfield-compat
|
||||
CFLAGS += -DNB_ANTENNAS_RX=2 -DNB_ANTENNAS_TX=2 $(CPUFLAGS) -I/usr/include/X11 #-Wno-packed-bitfield-compat
|
||||
|
||||
ASN1_MSG_INC = $(OPENAIR2_DIR)/RRC/LITE/MESSAGES
|
||||
|
||||
CFLAGS += -DOPENAIR_LTE -DPUCCH #-DOFDMA_ULSCH -DIFFT_FPGA -DIFFT_FPGA_UE
|
||||
CFLAGS += -DMAC_CONTEXT=1 -DPHY_CONTEXT=1 -DPHY_ABSTRACTION #-DPHY_ABSTRACTION_UL #-DRLC_UM_TEST_TRAFFIC=1
|
||||
CFLAGS += -DNEW_FFT
|
||||
CFLAGS += -DOPENAIR_LTE #-DOFDMA_ULSCH -DIFFT_FPGA -DIFFT_FPGA_UE
|
||||
CFLAGS += -DMAC_CONTEXT=1 -DPHY_CONTEXT=1 #-DRLC_UM_TEST_TRAFFIC=1
|
||||
#CFLAGS += -DLLR8
|
||||
CFLAGS += -DPACKAGE_NAME='"oaisim"'
|
||||
|
||||
@@ -48,15 +47,6 @@ DISABLE_XER_PRINT=0
|
||||
MSG_PRINT=1
|
||||
endif
|
||||
|
||||
ifndef OPENAIR_EMU
|
||||
export OPENAIR_EMU=1
|
||||
CFLAGS += -DOAISIM
|
||||
endif
|
||||
|
||||
ifdef EMOS
|
||||
CFLAGS+=-DEMOS
|
||||
endif
|
||||
|
||||
ifeq ($(LOCALIZATION), 1)
|
||||
CFLAGS += -DLOCALIZATION
|
||||
endif
|
||||
@@ -141,8 +131,6 @@ CFLAGS += -DSTOP_ON_IP_TRAFFIC_OVERLOAD
|
||||
endif
|
||||
|
||||
|
||||
ifeq ($(MIH_C_MEDIEVAL_EXTENSIONS), 1)
|
||||
CFLAGS += -DMIH_C_MEDIEVAL_EXTENSIONS
|
||||
ifeq ($(USE_3GPP_ADDR_AS_LINK_ADDR), 1)
|
||||
CFLAGS += -DUSE_3GPP_ADDR_AS_LINK_ADDR
|
||||
endif
|
||||
@@ -179,7 +167,7 @@ ifdef OAI_NW_DRIVER_TYPE_ETHERNET
|
||||
CFLAGS+=-DOAI_NW_DRIVER_TYPE_ETHERNET
|
||||
endif
|
||||
|
||||
CFLAGS += -DENABLE_FXP -DOAI_EMU -DENABLE_USE_CPU_EXECUTION_TIME
|
||||
CFLAGS += -DENABLE_USE_CPU_EXECUTION_TIME
|
||||
ifndef DISABLE_XER_PRINT
|
||||
CFLAGS += -DXER_PRINT
|
||||
endif
|
||||
@@ -272,7 +260,7 @@ endif
|
||||
# Check if libpgm is installed and use it if found instead of the unreliable
|
||||
# multicast
|
||||
ifeq ($(PGM_FOUND), 1)
|
||||
CFLAGS += $(PGM_CFLAGS) -DENABLE_PGM_TRANSPORT
|
||||
CFLAGS += $(PGM_CFLAGS)
|
||||
LIBS += $(PGM_LIBS)
|
||||
endif
|
||||
|
||||
|
||||
@@ -403,9 +403,6 @@ void do_UL_sig(channel_desc_t *UE2RU[NUMBER_OF_UE_MAX][NUMBER_OF_RU_MAX][MAX_NUM
|
||||
{
|
||||
|
||||
int32_t **txdata,**rxdata;
|
||||
#ifdef PHY_ABSTRACTION_UL
|
||||
int32_t att_eNB_id=-1;
|
||||
#endif
|
||||
uint8_t UE_id=0;
|
||||
|
||||
uint8_t nb_antennas_rx = UE2RU[0][0][CC_id]->nb_rx; // number of rx antennas at eNB
|
||||
@@ -418,14 +415,6 @@ void do_UL_sig(channel_desc_t *UE2RU[NUMBER_OF_UE_MAX][NUMBER_OF_RU_MAX][MAX_NUM
|
||||
|
||||
uint8_t hold_channel=0;
|
||||
|
||||
#ifdef PHY_ABSTRACTION_UL
|
||||
double min_path_loss=-200;
|
||||
uint16_t ul_nb_rb=0 ;
|
||||
uint16_t ul_fr_rb=0;
|
||||
int ulnbrb2 ;
|
||||
int ulfrrb2 ;
|
||||
uint8_t harq_pid;
|
||||
#endif
|
||||
double s_re0[30720];
|
||||
double s_re1[30720];
|
||||
double *s_re[2];
|
||||
@@ -450,38 +439,6 @@ void do_UL_sig(channel_desc_t *UE2RU[NUMBER_OF_UE_MAX][NUMBER_OF_RU_MAX][MAX_NUM
|
||||
r_im0[1] = r_im01;
|
||||
|
||||
if (abstraction_flag!=0) {
|
||||
#ifdef PHY_ABSTRACTION_UL
|
||||
// wire this to 0 until we figure this out
|
||||
int eNB_id=0;
|
||||
|
||||
for (UE_id=0; UE_id<NB_UE_INST; UE_id++) {
|
||||
if (!hold_channel) {
|
||||
random_channel(UE2RU[UE_id][eNB_id][CC_id],abstraction_flag);
|
||||
freq_channel(UE2RU[UE_id][eNB_id][CC_id], frame_parms->N_RB_UL,frame_parms->N_RB_UL*12+1);
|
||||
|
||||
// REceived power at the eNB
|
||||
rx_pwr = signal_energy_fp2(UE2RU[UE_id][eNB_id][CC_id]->ch[0],
|
||||
UE2RU[UE_id][eNB_id][CC_id]->channel_length)*UE2RU[UE_id][att_eNB_id][CC_id]->channel_length; // calculate the rx power at the eNB
|
||||
}
|
||||
|
||||
// write_output("SINRch.m","SINRch",PHY_vars_eNB_g[att_eNB_id]->sinr_dB_eNB,frame_parms->N_RB_UL*12+1,1,1);
|
||||
if(subframe>1 && subframe <5) {
|
||||
harq_pid = subframe2harq_pid(frame_parms,frame,subframe);
|
||||
ul_nb_rb = RC.eNB[att_eNB_id][CC_id].ulsch_eNB[(uint8_t)UE_id]->harq_processes[harq_pid]->nb_rb;
|
||||
ul_fr_rb = RC.eNB[att_eNB_id][CC_id].ulsch_eNB[(uint8_t)UE_id]->harq_processes[harq_pid]->first_rb;
|
||||
}
|
||||
|
||||
if(ul_nb_rb>1 && (ul_fr_rb < 25 && ul_fr_rb > -1)) {
|
||||
number_rb_ul = ul_nb_rb;
|
||||
first_rbUL = ul_fr_rb;
|
||||
init_snr_up(UE2RU[UE_id][att_eNB_id][CC_id],enb_data[att_eNB_id], ue_data[UE_id],PHY_vars_eNB_g[att_eNB_id][CC_id]->sinr_dB,&PHY_vars_UE_g[att_eNB_id][CC_id]->N0,ul_nb_rb,ul_fr_rb);
|
||||
|
||||
}
|
||||
} //UE_id
|
||||
|
||||
#else
|
||||
|
||||
#endif
|
||||
} else { //without abstraction
|
||||
|
||||
pthread_mutex_lock(&UE_output_mutex[ru_id]);
|
||||
|
||||
@@ -1358,9 +1358,6 @@ void init_ocm(void)
|
||||
if (abstraction_flag) {
|
||||
|
||||
get_beta_map();
|
||||
#ifdef PHY_ABSTRACTION_UL
|
||||
get_beta_map_up();
|
||||
#endif
|
||||
get_MIESM_param();
|
||||
|
||||
//load_pbch_desc();
|
||||
@@ -1566,117 +1563,6 @@ void update_ocm()
|
||||
void update_otg_eNB(module_id_t enb_module_idP, unsigned int ctime)
|
||||
{
|
||||
|
||||
#if defined(USER_MODE) && defined(OAI_EMU)
|
||||
|
||||
//int rrc_state=0;
|
||||
|
||||
if (oai_emulation.info.otg_enabled ==1 ) {
|
||||
|
||||
int dst_id, app_id;
|
||||
Packet_otg_elt_t *otg_pkt;
|
||||
|
||||
for (dst_id = 0; dst_id < NUMBER_OF_UE_MAX; dst_id++) {
|
||||
for_times += 1;
|
||||
|
||||
// generate traffic if the ue is rrc reconfigured state
|
||||
//if ((rrc_state=mac_eNB_get_rrc_status(enb_module_idP, dst_id)) > 2 /*RRC_CONNECTED*/ ) {
|
||||
if (mac_eNB_get_rrc_status(enb_module_idP, oai_emulation.info.eNB_ue_module_id_to_rnti[enb_module_idP][dst_id]) > 2 ){
|
||||
if_times += 1;
|
||||
|
||||
for (app_id=0; app_id<MAX_NUM_APPLICATION; app_id++) {
|
||||
otg_pkt = malloc (sizeof(Packet_otg_elt_t));
|
||||
|
||||
(otg_pkt->otg_pkt).sdu_buffer = (uint8_t*) packet_gen(enb_module_idP, dst_id + NB_eNB_INST, app_id, ctime, &((otg_pkt->otg_pkt).sdu_buffer_size));
|
||||
|
||||
if ((otg_pkt->otg_pkt).sdu_buffer != NULL) {
|
||||
otg_times += 1;
|
||||
(otg_pkt->otg_pkt).rb_id = DTCH-2; // app could be binded to a given DRB
|
||||
(otg_pkt->otg_pkt).module_id = enb_module_idP;
|
||||
(otg_pkt->otg_pkt).dst_id = dst_id;
|
||||
(otg_pkt->otg_pkt).is_ue = 0;
|
||||
(otg_pkt->otg_pkt).mode = PDCP_TRANSMISSION_MODE_DATA;
|
||||
//Adding the packet to the OTG-PDCP buffer
|
||||
pkt_list_add_tail_eurecom(otg_pkt, &(otg_pdcp_buffer[enb_module_idP]));
|
||||
LOG_D(EMU,"[eNB %d] ADD pkt to OTG buffer with size %d for dst %d on rb_id %d for app id %d \n",
|
||||
(otg_pkt->otg_pkt).module_id, otg_pkt->otg_pkt.sdu_buffer_size, (otg_pkt->otg_pkt).dst_id,(otg_pkt->otg_pkt).rb_id, app_id);
|
||||
} else {
|
||||
free(otg_pkt);
|
||||
otg_pkt=NULL;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#if defined(Rel10) || defined(Rel14)
|
||||
mbms_service_id_t service_id;
|
||||
mbms_session_id_t session_id;
|
||||
rb_id_t rb_id;
|
||||
|
||||
// MBSM multicast traffic
|
||||
if (ctime >= 500 ) {// only generate when UE can receive MTCH (need to control this value)
|
||||
for (service_id = 0; service_id < 2 ; service_id++) { //maxServiceCount
|
||||
for (session_id = 0; session_id < 2; session_id++) { // maxSessionPerPMCH
|
||||
if (pdcp_mbms_array_eNB[enb_module_idP][service_id][session_id].instanciated_instance == TRUE) { // this service/session is configured
|
||||
|
||||
otg_pkt = malloc (sizeof(Packet_otg_elt_t));
|
||||
// LOG_T(OTG,"multicast packet gen for (service/mch %d, session/lcid %d, rb_id %d)\n", service_id, session_id, service_id*maxSessionPerPMCH + session_id);
|
||||
rb_id = pdcp_mbms_array_eNB[enb_module_idP][service_id][session_id].rb_id;
|
||||
(otg_pkt->otg_pkt).sdu_buffer = (uint8_t*) packet_gen_multicast(enb_module_idP, session_id, ctime, &((otg_pkt->otg_pkt).sdu_buffer_size));
|
||||
|
||||
if ((otg_pkt->otg_pkt).sdu_buffer != NULL) {
|
||||
(otg_pkt->otg_pkt).rb_id = rb_id;
|
||||
(otg_pkt->otg_pkt).module_id = enb_module_idP;
|
||||
(otg_pkt->otg_pkt).dst_id = session_id;
|
||||
(otg_pkt->otg_pkt).is_ue = FALSE;
|
||||
//Adding the packet to the OTG-PDCP buffer
|
||||
(otg_pkt->otg_pkt).mode = PDCP_TRANSMISSION_MODE_TRANSPARENT;
|
||||
pkt_list_add_tail_eurecom(otg_pkt, &(otg_pdcp_buffer[enb_module_idP]));
|
||||
LOG_D(EMU, "[eNB %d] ADD packet (%p) multicast to OTG buffer for dst %d on rb_id %d\n",
|
||||
(otg_pkt->otg_pkt).module_id, otg_pkt, (otg_pkt->otg_pkt).dst_id,(otg_pkt->otg_pkt).rb_id);
|
||||
} else {
|
||||
//LOG_I(EMU, "OTG returns null \n");
|
||||
free(otg_pkt);
|
||||
otg_pkt=NULL;
|
||||
}
|
||||
|
||||
|
||||
// old version
|
||||
/* // MBSM multicast traffic
|
||||
#if defined(Rel10) || defined(Rel14)
|
||||
if (frame >= 46) {// only generate when UE can receive MTCH (need to control this value)
|
||||
for (service_id = 0; service_id < 2 ; service_id++) { //maxServiceCount
|
||||
for (session_id = 0; session_id < 2; session_id++) { // maxSessionPerPMCH
|
||||
// LOG_I(OTG,"DUY:frame %d, pdcp_mbms_array[module_id][rb_id].instanciated_instance is %d\n",frame,pdcp_mbms_array[module_id][service_id*maxSessionPerPMCH + session_id].instanciated_instance);
|
||||
if ((pdcp_mbms_array[module_idP][service_id*maxSessionPerPMCH + session_id].instanciated_instance== module_idP + 1) && (eNB_flag == 1)){ // this service/session is configured
|
||||
// LOG_T(OTG,"multicast packet gen for (service/mch %d, session/lcid %d)\n", service_id, session_id);
|
||||
// Duy add
|
||||
LOG_I(OTG, "frame %d, multicast packet gen for (service/mch %d, session/lcid %d, rb_id %d)\n",frame, service_id, session_id,service_id*maxSessionPerPMCH + session_id);
|
||||
// end Duy add
|
||||
rb_id = pdcp_mbms_array[module_id][service_id*maxSessionPerPMCH + session_id].rb_id;
|
||||
otg_pkt=(uint8_t*) packet_gen_multicast(module_idP, session_id, ctime, &pkt_size);
|
||||
if (otg_pkt != NULL) {
|
||||
LOG_D(OTG,"[eNB %d] sending a multicast packet from module %d on rab id %d (src %d, dst %d) pkt size %d\n", eNB_index, module_idP, rb_id, module_idP, session_id, pkt_size);
|
||||
pdcp_data_req(module_id, frame, eNB_flag, rb_id, RLC_MUI_UNDEFINED, RLC_SDU_CONFIRM_NO, pkt_size, otg_pkt,PDCP_TM);
|
||||
free(otg_pkt);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
} // end multicast traffic
|
||||
#endif
|
||||
*/
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
} // end multicast traffic
|
||||
|
||||
#endif
|
||||
}
|
||||
|
||||
#else
|
||||
#if 0 // defined(EXMIMO) || defined(OAI_USRP)
|
||||
if (otg_enabled==1) {
|
||||
ctime = frame * 100;
|
||||
@@ -1703,57 +1589,11 @@ void update_otg_eNB(module_id_t enb_module_idP, unsigned int ctime)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#endif
|
||||
#endif
|
||||
}
|
||||
|
||||
void update_otg_UE(module_id_t ue_mod_idP, unsigned int ctime)
|
||||
{
|
||||
#if defined(USER_MODE) && defined(OAI_EMU)
|
||||
|
||||
int app_id;
|
||||
if (oai_emulation.info.otg_enabled ==1 ) {
|
||||
module_id_t dst_id, src_id; //dst_id = eNB_index
|
||||
module_id_t module_id = ue_mod_idP+NB_eNB_INST;
|
||||
|
||||
src_id = module_id;
|
||||
|
||||
for (dst_id=0; dst_id<NB_SIG_CNX_UE; dst_id++) {
|
||||
// only consider the first attached eNB
|
||||
if (mac_UE_get_rrc_status(ue_mod_idP, dst_id ) > 2 /*RRC_CONNECTED*/) {
|
||||
for (app_id=0; app_id<MAX_NUM_APPLICATION; app_id++) {
|
||||
Packet_otg_elt_t *otg_pkt = malloc (sizeof(Packet_otg_elt_t));
|
||||
|
||||
if (otg_pkt!=NULL)
|
||||
memset(otg_pkt,0,sizeof(Packet_otg_elt_t));
|
||||
else {
|
||||
LOG_E(OTG,"not enough memory\n");
|
||||
exit(-1);
|
||||
}// Manage to add this packet to the tail of your list
|
||||
|
||||
(otg_pkt->otg_pkt).sdu_buffer = (uint8_t*) packet_gen(src_id, dst_id, app_id, ctime, &((otg_pkt->otg_pkt).sdu_buffer_size));
|
||||
|
||||
if ((otg_pkt->otg_pkt).sdu_buffer != NULL) {
|
||||
(otg_pkt->otg_pkt).rb_id = DTCH-2;
|
||||
(otg_pkt->otg_pkt).module_id = module_id;
|
||||
(otg_pkt->otg_pkt).dst_id = dst_id;
|
||||
(otg_pkt->otg_pkt).is_ue = 1;
|
||||
//Adding the packet to the OTG-PDCP buffer
|
||||
(otg_pkt->otg_pkt).mode = PDCP_TRANSMISSION_MODE_DATA;
|
||||
pkt_list_add_tail_eurecom(otg_pkt, &(otg_pdcp_buffer[module_id]));
|
||||
LOG_D(EMU, "[UE %d] ADD pkt to OTG buffer with size %d for dst %d on rb_id %d \n",
|
||||
(otg_pkt->otg_pkt).module_id, otg_pkt->otg_pkt.sdu_buffer_size, (otg_pkt->otg_pkt).dst_id,(otg_pkt->otg_pkt).rb_id);
|
||||
} else {
|
||||
free(otg_pkt);
|
||||
otg_pkt=NULL;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#endif
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
@@ -475,70 +475,6 @@ void init_snr(channel_desc_t* eNB2UE, node_desc_t *enb_data, node_desc_t *ue_dat
|
||||
}//switch
|
||||
}//function ends
|
||||
|
||||
#ifdef PHY_ABSTRACTION_UL
|
||||
void init_snr_up(channel_desc_t* UE2eNB, node_desc_t *enb_data, node_desc_t *ue_data, double* sinr_dB, double* N0,uint16_t nb_rb,uint16_t fr_rb)
|
||||
{
|
||||
|
||||
int return_value;
|
||||
double thermal_noise;
|
||||
int count;
|
||||
int aarx;
|
||||
|
||||
// nb_rb = phy_vars_eNB->ulsch_eNB[UE_id]->harq_processes[harq_pid]->nb_rb;
|
||||
/* Thermal noise is calculated using 10log10(K*T*B) K = Boltzmann's constant T = room temperature B = bandwidth */
|
||||
thermal_noise = -174 + 10*log10(UE2eNB->sampling_rate*1e6); //value in dBm
|
||||
*N0 = thermal_noise + enb_data->rx_noise_level;//? all the element have the same noise level?????
|
||||
double lambda ;
|
||||
double residual;
|
||||
double sinrlin;
|
||||
double residual_db;
|
||||
residual = 0 ;
|
||||
int ccc;
|
||||
/*
|
||||
for (count = (fr_rb*12) ; count < (12 * (fr_rb+nb_rb)); count++)
|
||||
{
|
||||
residual += ( 1 / ( pow((UE2eNB -> chF[0][count].x),2) + pow((UE2eNB -> chF[0][count].y),2)));
|
||||
}
|
||||
*///sinreff(nn) = ((sum((1/p).*(snrm(nn,:)./(snrm(nn,:)+1)),2).^(-1) )-1).^-1;
|
||||
|
||||
sinrlin = 0 ;
|
||||
lambda = 0;
|
||||
|
||||
////First calculate SINRs of subcarriers just like OFDM
|
||||
for (count = (fr_rb*12) ; count < (12 * (fr_rb+nb_rb)); count++) {
|
||||
sinr_dB[count] = ue_data->tx_power_dBm
|
||||
+ UE2eNB->path_loss_dB
|
||||
- (thermal_noise + enb_data->rx_noise_level)
|
||||
+ 10 * log10 (pow(UE2eNB->chF[0][count].x, 2)
|
||||
+ pow(UE2eNB->chF[0][count].y, 2));
|
||||
|
||||
|
||||
}
|
||||
|
||||
//Then apply formula :
|
||||
if(nb_rb > 0) {
|
||||
//calculate lambdas and fill the same with all but just use one of them when necessary for abstraction
|
||||
for (count = fr_rb*12; count < (12 * (fr_rb+nb_rb)); count++) {
|
||||
sinrlin = pow((sinr_dB[count]/10),10); // convert SINR to linear
|
||||
lambda += (sinrlin / (sinrlin + 1)) ;
|
||||
}
|
||||
|
||||
for (count = fr_rb*12; count < (12 * (fr_rb+nb_rb)); count++) {
|
||||
sinr_dB[count] = pow(lambda,2) /(((nb_rb)*lambda)-pow(lambda,2)) ;
|
||||
sinr_dB[count] = 10*log10(sinr_dB[count]) ; //save it in db
|
||||
}
|
||||
|
||||
printf("tx_power %g, path_loss %g, sinr_dB[0] %g\n",ue_data->tx_power_dBm ,UE2eNB->path_loss_dB,sinr_dB[count-1]);
|
||||
|
||||
for (ccc = 0; ccc < 301 ; ccc++ ) {
|
||||
SINRpost_eff[ccc] = 0;
|
||||
SINRpost_eff[ccc] = sinr_dB[ccc];
|
||||
}
|
||||
}
|
||||
}//function ends
|
||||
|
||||
#endif
|
||||
|
||||
void calculate_sinr(channel_desc_t* eNB2UE, node_desc_t *enb_data, node_desc_t *ue_data, double *sinr_dB, uint16_t nb_rb)
|
||||
{
|
||||
|
||||
@@ -737,60 +673,7 @@ void get_MIESM_param()
|
||||
|
||||
free(file_path);
|
||||
}
|
||||
#ifdef PHY_ABSTRACTION_UL
|
||||
void get_beta_map_up()
|
||||
{
|
||||
char *file_path = NULL;
|
||||
int table_len = 0;
|
||||
int mcs = 0;
|
||||
char *sinr_bler;
|
||||
char buffer[1000];
|
||||
FILE *fp;
|
||||
|
||||
file_path = (char*) malloc(512);
|
||||
|
||||
for (mcs = 0; mcs < MCS_COUNT; mcs++) {
|
||||
sprintf(file_path,"%s/SIMULATION/LTE_PHY/BLER_SIMULATIONS/AWGN/awgn_abst/awgn_snr_bler_mcs%d_up.csv",getenv("OPENAIR1_DIR"),mcs);
|
||||
fp = fopen(file_path,"r");
|
||||
|
||||
if (fp == NULL) {
|
||||
LOG_W(OCM,"ERROR: Unable to open the file %s, try an alternative path\n", file_path);
|
||||
memset(file_path, 0, 512);
|
||||
sprintf(file_path,"AWGN/awgn_snr_bler_mcs%d.csv",mcs);
|
||||
LOG_I(OCM,"Opening the alternative path %s\n", file_path);
|
||||
fp = fopen(file_path,"r");
|
||||
|
||||
if (fp == NULL) {
|
||||
LOG_E(OCM,"ERROR: Unable to open the file %s, exisitng\n", file_path);
|
||||
exit(-1);
|
||||
}
|
||||
}
|
||||
|
||||
// else {
|
||||
fgets(buffer, 1000, fp);
|
||||
table_len=0;
|
||||
|
||||
while (!feof(fp)) {
|
||||
sinr_bler = strtok(buffer, ",");
|
||||
sinr_bler_map_up[mcs][0][table_len] = atof(sinr_bler);
|
||||
sinr_bler = strtok(NULL,",");
|
||||
sinr_bler_map_up[mcs][1][table_len] = atof(sinr_bler);
|
||||
table_len++;
|
||||
fgets(buffer, 1000, fp);
|
||||
}
|
||||
|
||||
fclose(fp);
|
||||
// }
|
||||
LOG_D(OCM,"Print the table for mcs %d\n",mcs);
|
||||
|
||||
for (table_len = 0; table_len < 16; table_len++)
|
||||
LOG_D(OCM,"%lf %lf \n ",sinr_bler_map_up[mcs][0][table_len],sinr_bler_map_up[mcs][1][table_len]);
|
||||
}
|
||||
|
||||
free(file_path);
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -6,7 +6,7 @@ OPENAIR2_TOP = $(OPENAIR2_DIR)
|
||||
OPENAIR3_TOP = $(OPENAIR3_DIR)
|
||||
OPENAIR3 = $(OPENAIR3_DIR)
|
||||
|
||||
CFLAGS += -m32 -DPHYSIM -DNODE_RG -DUSER_MODE -DPC_TARGET -DPC_DSP -DNB_ANTENNAS_RX=2 -DNB_ANTENNAS_TXRX=2 -DNB_ANTENNAS_TX=2 -DMAX_MODULES=1 -I/usr/include/X11
|
||||
CFLAGS += -m32 -DPHYSIM -DNODE_RG -DNB_ANTENNAS_RX=2 -DNB_ANTENNAS_TX=2 -DMAX_MODULES=1 -I/usr/include/X11
|
||||
|
||||
ASN1_MSG_INC = $(OPENAIR2_DIR)/RRC/LITE/MESSAGES
|
||||
|
||||
@@ -23,8 +23,6 @@ ifdef PDCP_USE_NETLINK
|
||||
CFLAGS += -DPDCP_USE_NETLINK -DLINUX -DDEBUG_CONTROL
|
||||
endif
|
||||
|
||||
CFLAGS += -DPHY_ABSTRACTION #-DEMIT_ASN_DEBUG=1
|
||||
|
||||
#include $(OPENAIR1_DIR)/PHY/Makefile.inc
|
||||
#include $(OPENAIR1_DIR)/SCHED/Makefile.inc
|
||||
|
||||
|
||||
@@ -246,7 +246,7 @@ def execute(oai, user, pw, host, logfile,logdir,debug,timeout):
|
||||
log.start()
|
||||
test = '14'
|
||||
name = 'Compile oai.rel8.itti.ral.make'
|
||||
conf = 'make DISABLE_XER_PRINT=1 LINK_ENB_PDCP_TO_IP_DRIVER=1 OAI_NW_DRIVER_TYPE_ETHERNET=1 ENABLE_ITTI=1 USER_MODE=1 OPENAIR2=1 ENABLE_RAL=1 MIH_C_MEDIEVAL_EXTENSIONS=1 RLC_STOP_ON_LOST_PDU=1 Rel8=1'
|
||||
conf = 'make DISABLE_XER_PRINT=1 LINK_ENB_PDCP_TO_IP_DRIVER=1 OAI_NW_DRIVER_TYPE_ETHERNET=1 ENABLE_ITTI=1 OPENAIR2=1 ENABLE_RAL=1 MIH_C_MEDIEVAL_EXTENSIONS=1 RLC_STOP_ON_LOST_PDU=1 Rel8=1'
|
||||
trace = logdir + '/log_' + case + test + '.txt;'
|
||||
tee = ' 2>&1 | tee ' + trace
|
||||
diag = 'check the compilation errors for ITTI Rel8'
|
||||
@@ -254,7 +254,7 @@ def execute(oai, user, pw, host, logfile,logdir,debug,timeout):
|
||||
oai.send('make cleanall;')
|
||||
oai.send('make cleanasn1;')
|
||||
oai.send('rm -f ./oaisim.rel8.itti.ral.'+host)
|
||||
oai.send_expect_false('make DISABLE_XER_PRINT=1 LINK_ENB_PDCP_TO_IP_DRIVER=1 OAI_NW_DRIVER_TYPE_ETHERNET=1 ENABLE_ITTI=1 USER_MODE=1 OPENAIR2=1 ENABLE_RAL=1 MIH_C_MEDIEVAL_EXTENSIONS=1 RLC_STOP_ON_LOST_PDU=1 Rel8=1 -j4' + tee, makerr1, timeout)
|
||||
oai.send_expect_false('make DISABLE_XER_PRINT=1 LINK_ENB_PDCP_TO_IP_DRIVER=1 OAI_NW_DRIVER_TYPE_ETHERNET=1 ENABLE_ITTI=1 OPENAIR2=1 ENABLE_RAL=1 MIH_C_MEDIEVAL_EXTENSIONS=1 RLC_STOP_ON_LOST_PDU=1 Rel8=1 -j4' + tee, makerr1, timeout)
|
||||
oai.send('cp ./oaisim ./oaisim.rel8.itti.ral.'+host)
|
||||
except log.err, e:
|
||||
log.fail(case, test, name, conf, e.value, diag, logfile,trace)
|
||||
@@ -265,7 +265,7 @@ def execute(oai, user, pw, host, logfile,logdir,debug,timeout):
|
||||
log.start()
|
||||
test = '15'
|
||||
name = 'Compile oai.rel10.itti.ral.make'
|
||||
conf = 'make DISABLE_XER_PRINT=1 LINK_ENB_PDCP_TO_IP_DRIVER=1 OAI_NW_DRIVER_TYPE_ETHERNET=1 ENABLE_ITTI=1 USER_MODE=1 OPENAIR2=1 ENABLE_RAL=1 MIH_C_MEDIEVAL_EXTENSIONS=1 RLC_STOP_ON_LOST_PDU=1 Rel10=1'
|
||||
conf = 'make DISABLE_XER_PRINT=1 LINK_ENB_PDCP_TO_IP_DRIVER=1 OAI_NW_DRIVER_TYPE_ETHERNET=1 ENABLE_ITTI=1 OPENAIR2=1 ENABLE_RAL=1 MIH_C_MEDIEVAL_EXTENSIONS=1 RLC_STOP_ON_LOST_PDU=1 Rel10=1'
|
||||
trace = logdir + '/log_' + case + test + '.txt;'
|
||||
tee = ' 2>&1 | tee ' + trace
|
||||
diag = 'check the compilation errors for ITTI Rel10'
|
||||
@@ -273,7 +273,7 @@ def execute(oai, user, pw, host, logfile,logdir,debug,timeout):
|
||||
oai.send('make cleanall;')
|
||||
oai.send('make cleanasn1;')
|
||||
oai.send('rm -f ./oaisim.rel10.itti.ral.'+host)
|
||||
oai.send_expect_false('make DISABLE_XER_PRINT=1 LINK_ENB_PDCP_TO_IP_DRIVER=1 OAI_NW_DRIVER_TYPE_ETHERNET=1 ENABLE_ITTI=1 USER_MODE=1 OPENAIR2=1 ENABLE_RAL=1 MIH_C_MEDIEVAL_EXTENSIONS=1 RLC_STOP_ON_LOST_PDU=1 Rel10=1 -j4' + tee, makerr1, timeout)
|
||||
oai.send_expect_false('make DISABLE_XER_PRINT=1 LINK_ENB_PDCP_TO_IP_DRIVER=1 OAI_NW_DRIVER_TYPE_ETHERNET=1 ENABLE_ITTI=1 OPENAIR2=1 ENABLE_RAL=1 MIH_C_MEDIEVAL_EXTENSIONS=1 RLC_STOP_ON_LOST_PDU=1 Rel10=1 -j4' + tee, makerr1, timeout)
|
||||
oai.send('cp ./oaisim ./oaisim.rel10.itti.ral.'+host)
|
||||
except log.err, e:
|
||||
log.fail(case, test, name, conf, e.value, diag, logfile,trace)
|
||||
|
||||
@@ -6,21 +6,17 @@ OPENAIR2_TOP = $(OPENAIR2_DIR)
|
||||
OPENAIR3_TOP = $(OPENAIR3_DIR)
|
||||
OPENAIR3 = $(OPENAIR3_DIR)
|
||||
|
||||
CFLAGS += -m32 -DPHYSIM -DUSER_MODE -DPC_TARGET -DPC_DSP -DNB_ANTENNAS_RX=2 -DNB_ANTENNAS_TXRX=2 -DNB_ANTENNAS_TX=2 -I/usr/include/X11
|
||||
CFLAGS += -m32 -DPHYSIM -DNB_ANTENNAS_RX=2 -DNB_ANTENNAS_TX=2 -I/usr/include/X11
|
||||
|
||||
ASN1_MSG_INC = $(OPENAIR2_DIR)/RRC/LITE/MESSAGES
|
||||
|
||||
CFLAGS += -DOPENAIR_LTE -DPUCCH #-DOFDMA_ULSCH -DIFFT_FPGA -DIFFT_FPGA_UE
|
||||
CFLAGS += -DMAC_CONTEXT=1 -DPHY_CONTEXT=1 -DPHY_ABSTRACTION -DOAI_EMU
|
||||
CFLAGS += -DOPENAIR_LTE #-DOFDMA_ULSCH -DIFFT_FPGA -DIFFT_FPGA_UE
|
||||
CFLAGS += -DMAC_CONTEXT=1 -DPHY_CONTEXT=1
|
||||
CFLAGS += -DEMIT_ASN_DEBUG=1
|
||||
ifndef OPENAIR2
|
||||
OPENAIR2=1
|
||||
endif
|
||||
|
||||
ifndef OPENAIR_EMU
|
||||
export OPENAIR_EMU=1
|
||||
endif
|
||||
|
||||
# activate OCG and libxml only under linux
|
||||
ifeq ($(linux),1)
|
||||
CFLAGS += -I/usr/include/libxml2 -L/usr/local/lib -I/usr/include/atlas -L/usr/X11R6/lib
|
||||
@@ -61,8 +57,6 @@ ifdef TRAFFIC_TM5
|
||||
CFLAGS += -DRLC_UM_TEST_TRAFFIC=1 -DFULL_BUFFER=1
|
||||
endif
|
||||
|
||||
CFLAGS += -DOAI_EMU
|
||||
|
||||
include $(OPENAIR1_DIR)/PHY/Makefile.inc
|
||||
include $(OPENAIR1_DIR)/SCHED/Makefile.inc
|
||||
include $(OPENAIR2_DIR)/LAYER2/Makefile.inc
|
||||
|
||||
@@ -8,7 +8,7 @@ OPENAIR3 = $(OPENAIR3_DIR)
|
||||
|
||||
EXE_FILE_NAME = test_pdcp
|
||||
|
||||
CFLAGS += -m32 -DPHYSIM -DNODE_RG -DUSER_MODE -DPC_TARGET -DPC_DSP -DNB_ANTENNAS_RX=2 -DNB_ANTENNAS_TXRX=2 -DNB_ANTENNAS_TX=2 -DMAX_MODULES=1 -I/usr/include/X11
|
||||
CFLAGS += -m32 -DPHYSIM -DNODE_RG -DNB_ANTENNAS_RX=2 -DNB_ANTENNAS_TX=2 -DMAX_MODULES=1 -I/usr/include/X11
|
||||
|
||||
ASN1_MSG_INC = $(OPENAIR2_DIR)/RRC/LITE/MESSAGES
|
||||
|
||||
@@ -25,8 +25,6 @@ ifdef PDCP_USE_NETLINK
|
||||
CFLAGS += -DPDCP_USE_NETLINK -DLINUX -DDEBUG_CONTROL
|
||||
endif
|
||||
|
||||
CFLAGS += -DPHY_ABSTRACTION #-DEMIT_ASN_DEBUG=1
|
||||
|
||||
#include $(OPENAIR1_DIR)/PHY/Makefile.inc
|
||||
#include $(OPENAIR1_DIR)/SCHED/Makefile.inc
|
||||
|
||||
|
||||
@@ -8,7 +8,7 @@ OPENAIR3 = $(OPENAIR3_DIR)
|
||||
|
||||
EXE_FILE_NAME = test_pdcp_rlc
|
||||
|
||||
CFLAGS += -m32 -DPHYSIM -DNODE_RG -DUSER_MODE -DPC_TARGET -DPC_DSP -DNB_ANTENNAS_RX=2 -DNB_ANTENNAS_TXRX=2 -DNB_ANTENNAS_TX=2 -DMAX_MODULES=1 -I/usr/include/X11
|
||||
CFLAGS += -m32 -DPHYSIM -DNODE_RG -DNB_ANTENNAS_RX=2 -DNB_ANTENNAS_TX=2 -DMAX_MODULES=1 -I/usr/include/X11
|
||||
|
||||
ASN1_MSG_INC = $(OPENAIR2_DIR)/RRC/LITE/MESSAGES
|
||||
|
||||
@@ -25,8 +25,6 @@ ifdef PDCP_USE_NETLINK
|
||||
CFLAGS += -DPDCP_USE_NETLINK -DLINUX -DDEBUG_CONTROL
|
||||
endif
|
||||
|
||||
CFLAGS += -DPHY_ABSTRACTION #-DEMIT_ASN_DEBUG=1
|
||||
|
||||
#include $(OPENAIR1_DIR)/PHY/Makefile.inc
|
||||
#include $(OPENAIR1_DIR)/SCHED/Makefile.inc
|
||||
|
||||
|
||||
@@ -8,27 +8,18 @@ OPENAIR2_TOP = $(OPENAIR2_DIR)
|
||||
OPENAIR3_TOP = $(OPENAIR3_DIR)
|
||||
OPENAIR3 = $(OPENAIR3_DIR)
|
||||
|
||||
CFLAGS += -m32 -DUSER_MODE -DNB_ANTENNAS_RX=2 -DNB_ANTENNAS_TXRX=2 -DNB_ANTENNAS_TX=2 -I/usr/include/X11
|
||||
CFLAGS += -m32 -DNB_ANTENNAS_RX=2 -DNB_ANTENNAS_TX=2 -I/usr/include/X11
|
||||
|
||||
ASN1_MSG_INC = $(OPENAIR2_DIR)/RRC/LITE/MESSAGES
|
||||
|
||||
CFLAGS += -DOPENAIR_LTE -DPUCCH #-DOFDMA_ULSCH -DIFFT_FPGA -DIFFT_FPGA_UE
|
||||
CFLAGS += -DMAC_CONTEXT=1 -DPHY_CONTEXT=1 -DPHY_ABSTRACTION #-DPHY_ABSTRACTION_UL #-DRLC_UM_TEST_TRAFFIC=1
|
||||
CFLAGS += -DNEW_FFT
|
||||
CFLAGS += -DOPENAIR_LTE #-DOFDMA_ULSCH -DIFFT_FPGA -DIFFT_FPGA_UE
|
||||
CFLAGS += -DMAC_CONTEXT=1 -DPHY_CONTEXT=1 #-DRLC_UM_TEST_TRAFFIC=1
|
||||
#CFLAGS += -DLLR8
|
||||
|
||||
ifndef OPENAIR2
|
||||
OPENAIR2=1
|
||||
endif
|
||||
|
||||
ifndef OPENAIR_EMU
|
||||
export OPENAIR_EMU=1
|
||||
endif
|
||||
|
||||
ifdef EMOS
|
||||
CFLAGS+=-DEMOS
|
||||
endif
|
||||
|
||||
ifdef TRAFFIC_TM5
|
||||
CFLAGS += -DRLC_UM_TEST_TRAFFIC=1 #-DFULL_BUFFER=1
|
||||
endif
|
||||
@@ -114,7 +105,7 @@ endif
|
||||
|
||||
CFLAGS += $(shell if [ `uname -o` = "Cygwin" ] ; then echo "-DCYGWIN" ;fi)
|
||||
|
||||
CFLAGS += -DENABLE_FXP -DOAI_EMU -DENABLE_USE_CPU_EXECUTION_TIME
|
||||
CFLAGS += -DENABLE_USE_CPU_EXECUTION_TIME
|
||||
|
||||
ifneq ($(USE_MME), R8)
|
||||
UPDATE_RELEASE_9=1
|
||||
|
||||
@@ -8,27 +8,18 @@ OPENAIR2_TOP = $(OPENAIR2_DIR)
|
||||
OPENAIR3_TOP = $(OPENAIR3_DIR)
|
||||
OPENAIR3 = $(OPENAIR3_DIR)
|
||||
|
||||
CFLAGS += -m32 -DUSER_MODE -DNB_ANTENNAS_RX=2 -DNB_ANTENNAS_TXRX=2 -DNB_ANTENNAS_TX=2 -I/usr/include/X11
|
||||
CFLAGS += -m32 -DNB_ANTENNAS_RX=2 -DNB_ANTENNAS_TX=2 -I/usr/include/X11
|
||||
|
||||
ASN1_MSG_INC = $(OPENAIR2_DIR)/RRC/LITE/MESSAGES
|
||||
|
||||
CFLAGS += -DOPENAIR_LTE -DPUCCH #-DOFDMA_ULSCH -DIFFT_FPGA -DIFFT_FPGA_UE
|
||||
CFLAGS += -DMAC_CONTEXT=1 -DPHY_CONTEXT=1 -DPHY_ABSTRACTION #-DPHY_ABSTRACTION_UL #-DRLC_UM_TEST_TRAFFIC=1
|
||||
CFLAGS += -DNEW_FFT
|
||||
CFLAGS += -DOPENAIR_LTE #-DOFDMA_ULSCH -DIFFT_FPGA -DIFFT_FPGA_UE
|
||||
CFLAGS += -DMAC_CONTEXT=1 -DPHY_CONTEXT=1 #-DRLC_UM_TEST_TRAFFIC=1
|
||||
#CFLAGS += -DLLR8
|
||||
|
||||
ifndef OPENAIR2
|
||||
OPENAIR2=1
|
||||
endif
|
||||
|
||||
ifndef OPENAIR_EMU
|
||||
export OPENAIR_EMU=1
|
||||
endif
|
||||
|
||||
ifdef EMOS
|
||||
CFLAGS+=-DEMOS
|
||||
endif
|
||||
|
||||
ifdef TRAFFIC_TM5
|
||||
CFLAGS += -DRLC_UM_TEST_TRAFFIC=1 #-DFULL_BUFFER=1
|
||||
endif
|
||||
@@ -109,7 +100,7 @@ ifdef OAI_NW_DRIVER_TYPE_ETHERNET
|
||||
CFLAGS+=-DOAI_NW_DRIVER_TYPE_ETHERNET
|
||||
endif
|
||||
|
||||
CFLAGS += -DENABLE_FXP -DOAI_EMU -DENABLE_USE_CPU_EXECUTION_TIME
|
||||
CFLAGS += -DENABLE_USE_CPU_EXECUTION_TIME
|
||||
|
||||
ifneq ($(USE_MME), R8)
|
||||
UPDATE_RELEASE_9=1
|
||||
|
||||
Reference in New Issue
Block a user