diff --git a/cmake_targets/CMakeLists.txt b/cmake_targets/CMakeLists.txt
index a125219982..1c8f3d221e 100644
--- a/cmake_targets/CMakeLists.txt
+++ b/cmake_targets/CMakeLists.txt
@@ -42,6 +42,10 @@ set (OPENAIR_BIN_DIR ${CMAKE_CURRENT_BINARY_DIR}${CMAKE_FILES_DIRECTORY})
project (OpenAirInterface)
+add_subdirectory(${OPENAIR_TARGETS}/ARCH/LMSSDR/USERSPACE/LIB/lms7002m lms7002m)
+add_subdirectory(${OPENAIR_TARGETS}/ARCH/LMSSDR/USERSPACE/LIB/lmsSDR lmsSDR)
+add_subdirectory(${OPENAIR_TARGETS}/ARCH/LMSSDR/USERSPACE/LIB/Si5351C Si5351C)
+
###########################################
# macros to define options as there is numerous options in oai
################################################
@@ -159,7 +163,7 @@ set(CMAKE_C_FLAGS
"${CMAKE_C_FLAGS} -DSTDC_HEADERS=1 -DHAVE_SYS_TYPES_H=1 -DHAVE_SYS_STAT_H=1 -DHAVE_STDLIB_H=1 -DHAVE_STRING_H=1 -DHAVE_MEMORY_H=1 -DHAVE_STRINGS_H=1 -DHAVE_INTTYPES_H=1 -DHAVE_STDINT_H=1 -DHAVE_UNISTD_H=1 -DHAVE_FCNTL_H=1 -DHAVE_ARPA_INET_H=1 -DHAVE_SYS_TIME_H=1 -DHAVE_SYS_SOCKET_H=1 -DHAVE_STRERROR=1 -DHAVE_SOCKET=1 -DHAVE_MEMSET=1 -DHAVE_GETTIMEOFDAY=1 -DHAVE_STDLIB_H=1 -DHAVE_MALLOC=1 -DHAVE_LIBSCTP"
)
set(CMAKE_CXX_FLAGS
- "${CMAKE_CXX_FLAGS} ${C_FLAGS_PROCESSOR}"
+ "${CMAKE_CXX_FLAGS} ${C_FLAGS_PROCESSOR} -std=c++11 "
)
@@ -172,41 +176,65 @@ add_definitions(-DCMAKER)
set(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS} -g -DMALLOC_CHECK_=3")
set(CMAKE_C_FLAGS_RELWITHDEBINFO "${CMAKE_C_FLAGS} -g -DMALLOC_CHECK_=3 -O2")
-# Below has been put in comment because does not work with
-# SVN authentication.
-#
-#find_package(Subversion)
-#if(SUBVERSION_FOUND)
-# Subversion_WC_INFO(${OPENAIR_DIR} openair)
-# set (FIRMWARE_VERSION "${openair_WC_REVISION} - ${openair_WC_LAST_CHANGED_DATE}")
-# Subversion_WC_LOG(${OPENAIR_DIR} Project)
-#else()
-# set (FIRMWARE_VERSION "No svn information")
-#endif()
-#add_definitions("-DFIRMWARE_VERSION=\"${FIRMWARE_VERSION}\"")
+
+set(GIT_BRANCH "UNKNOWN")
+set(GIT_COMMIT_HASH "UNKNOWN")
+set(GIT_COMMIT_DATE "UNKNOWN")
+
+
+find_package(Git)
+if(GIT_FOUND)
+ message("git found: ${GIT_EXECUTABLE}")
+ # Get the current working branch
+ execute_process(
+ COMMAND git rev-parse --abbrev-ref HEAD
+ WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}
+ OUTPUT_VARIABLE GIT_BRANCH
+ OUTPUT_STRIP_TRAILING_WHITESPACE
+ )
+
+ # Get the latest abbreviated commit hash of the working branch
+ execute_process(
+ COMMAND git log -1 --format=%h
+ WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}
+ OUTPUT_VARIABLE GIT_COMMIT_HASH
+ OUTPUT_STRIP_TRAILING_WHITESPACE
+ )
+
+ # Get the latest commit date of the working branch
+ execute_process(
+ COMMAND git log -1 --format=%cd
+ WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}
+ OUTPUT_VARIABLE GIT_COMMIT_DATE
+ OUTPUT_STRIP_TRAILING_WHITESPACE
+ )
+endif()
+
# Below is a hard-coded info
set (FIRMWARE_VERSION "No svn information")
add_definitions("-DFIRMWARE_VERSION=\"${FIRMWARE_VERSION}\"")
-add_definitions("-DPACKAGE_VERSION=\"${FIRMWARE_VERSION}\"")
-add_definitions("-DPACKAGE_BUGREPORT=\"OpenAirInterface web site\"")
+add_definitions("-DPACKAGE_VERSION=\"Branch: ${GIT_BRANCH} Abrev. Hash: ${GIT_COMMIT_HASH} Date: ${GIT_COMMIT_DATE}\"")
+add_definitions("-DPACKAGE_BUGREPORT=\"openair4g-devel@lists.eurecom.fr\"")
# Debug related options
#########################################
-add_boolean_option(MSG_PRINT False "print debug messages")
-add_boolean_option(DISABLE_XER_PRINT False "print XER Format")
-add_boolean_option(XER_PRINT False "print XER Format")
-add_boolean_option(RRC_MSG_PRINT False "print RRC messages")
-add_boolean_option(PDCP_MSG_PRINT False "print PDCP messages to /tmp/pdcp.log")
-add_boolean_option(DEBUG_PDCP_PAYLOAD False "print PDCP PDU to stdout") # if true, make sure that global and PDCP log levels are trace
+add_boolean_option(ASN_DEBUG False "ASN1 coder/decoder Debug")
+add_boolean_option(EMIT_ASN_DEBUG False "ASN1 coder/decoder Debug")
+add_boolean_option(MSG_PRINT False "print debug messages")
+add_boolean_option(DISABLE_XER_PRINT False "print XER Format")
+add_boolean_option(XER_PRINT False "print XER Format")
+add_boolean_option(RRC_MSG_PRINT False "print RRC messages")
+add_boolean_option(PDCP_MSG_PRINT False "print PDCP messages to /tmp/pdcp.log")
+add_boolean_option(DEBUG_PDCP_PAYLOAD False "print PDCP PDU to stdout") # if true, make sure that global and PDCP log levels are trace
add_boolean_option(DEBUG_MAC_INTERFACE False "print MAC-RLC PDU exchange to stdout") # if true, make sure that global and PDCP log levels are trace
-add_boolean_option(TRACE_RLC_PAYLOAD False "print RLC PDU to stdout") # if true, make sure that global and PDCP log levels are trace
-add_boolean_option(TEST_OMG False "???")
-add_boolean_option(DEBUG_OMG False "???")
-add_boolean_option(XFORMS False "This adds the possibility to see the signal oscilloscope")
-add_boolean_option(PRINT_STATS False "This adds the possibility to see the status")
+add_boolean_option(TRACE_RLC_PAYLOAD False "print RLC PDU to stdout") # if true, make sure that global and PDCP log levels are trace
+add_boolean_option(TEST_OMG False "???")
+add_boolean_option(DEBUG_OMG False "???")
+add_boolean_option(XFORMS False "This adds the possibility to see the signal oscilloscope")
+add_boolean_option(PRINT_STATS False "This adds the possibility to see the status")
add_boolean_option(DEBUG_CONSOLE False "makes debugging easier, disables stdout/stderr buffering")
@@ -317,6 +345,7 @@ set(S1AP_OAI_generated
${S1AP_C_DIR}/s1ap_decoder.c
${S1AP_C_DIR}/s1ap_encoder.c
${S1AP_C_DIR}/s1ap_xer_print.c
+ ${S1AP_C_DIR}/s1ap_compare.c
${S1AP_C_DIR}/s1ap_ies_defs.h
)
file(GLOB s1ap_h ${S1AP_C_DIR}/*.h)
@@ -412,7 +441,7 @@ add_list1_option(NB_ANTENNAS_RX "2" "Number of antennas in reception" "1" "2" "4
add_list1_option(NB_ANTENNAS_TX "2" "Number of antennas in transmission" "1" "2" "4")
add_list1_option(NB_ANTENNAS_TXRX "2" "Number of antennas in ????" "1" "2" "4")
-add_list2_option(RF_BOARD "EXMIMO" "RF head type" "None" "EXMIMO" "OAI_USRP" "OAI_BLADERF" "CPRIGW")
+add_list2_option(RF_BOARD "EXMIMO" "RF head type" "None" "EXMIMO" "OAI_USRP" "OAI_BLADERF" "CPRIGW" "OAI_LMSSDR")
add_list2_option(TRANSP_PRO "None" "Transport protocol type" "None" "ETHERNET")
@@ -443,6 +472,13 @@ set(HWLIB_BLADERF_SOURCE
)
add_library(oai_bladerfdevif MODULE ${HWLIB_BLADERF_SOURCE} )
+include_directories("${OPENAIR_TARGETS}/ARCH/LMSSDR/USERSPACE/LIB/")
+set (option_HWLMSSDRLIB_lib "-l LMS_SDR -l LMS7002M -l Si5351C")
+set(HWLIB_LMSSDR_SOURCE
+ ${OPENAIR_TARGETS}/ARCH/LMSSDR/USERSPACE/LIB/lms_lib.cpp
+ )
+add_library(oai_lmssdrdevif MODULE ${HWLIB_LMSSDR_SOURCE} )
+
include_directories("${OPENAIR_TARGETS}/ARCH/ETHERNET/USERSPACE/LIB/")
set(TPLIB_ETHERNET_SOURCE
${OPENAIR_TARGETS}/ARCH/ETHERNET/USERSPACE/LIB/ethernet_lib.c
@@ -451,6 +487,7 @@ set(TPLIB_ETHERNET_SOURCE
)
add_library(oai_eth_transpro MODULE ${TPLIB_ETHERNET_SOURCE} )
+
# RF devices / transport protocols settings
######################################################################
if (${RF_BOARD} STREQUAL "EXMIMO")
@@ -478,9 +515,25 @@ elseif (${RF_BOARD} STREQUAL "OAI_BLADERF")
${OPENAIR_TARGETS}/ARCH/BLADERF/USERSPACE/LIB/bladerf_lib.c
)
LINK_DIRECTORIES("/usr/lib/x86_64-linux-gnu")
+
set(option_HW_lib "bladeRF -rdynamic -ldl")
-
-elseif (${RF_BOARD} STREQUAL "CPRIGW") #to ask
+ #set(LOWLATENCY False)
+
+elseif (${RF_BOARD} STREQUAL "OAI_LMSSDR")
+ include_directories("${OPENAIR_TARGETS}/ARCH/LMSSDR/USERSPACE/LIB")
+ include_directories("${OPENAIR_TARGETS}/ARCH/LMSSDR/USERSPACE/LIB/lmsSDR")
+ include_directories("${OPENAIR_TARGETS}/ARCH/LMSSDR/USERSPACE/LIB/lms7002m")
+ include_directories("${OPENAIR_TARGETS}/ARCH/LMSSDR/USERSPACE/LIB/Si5351C")
+ include_directories("${OPENAIR_TARGETS}/ARCH/LMSSDR/USERSPACE/LIB/lmsSDR/LMS_StreamBoard")
+ LINK_DIRECTORIES("/usr/lib/x86_64-linux-gnu")
+ LINK_DIRECTORIES("${CMAKE_CURRENT_BINARY_DIR}/lmsSDR")
+ LINK_DIRECTORIES("${CMAKE_CURRENT_BINARY_DIR}/lms7002m")
+ LINK_DIRECTORIES("${CMAKE_CURRENT_BINARY_DIR}/Si5351C")
+ set(HW_SOURCE ${HW_SOURCE} ${OPENAIR_TARGETS}/ARCH/LMSSDR/USERSPACE/LIB/lms_lib.cpp)
+ set(LOWLATENCY False)
+ set(option_HW_lib "-lLMS_SDR -lLMS7002M -lSi5351C -rdynamic -ldl")
+
+elseif (${RF_BOARD} STREQUAL "CPRIGW")
set(HW_SOURCE ${HW_SOURCE}
${OPENAIR_TARGETS}/ARCH/CPRIGW/USERSPACE/LIB/cprigw_lib.c
)
@@ -1057,7 +1110,6 @@ add_library(CN_UTILS
${OPENAIR3_DIR}/UTILS/conversions.c
${OPENAIR3_DIR}/UTILS/enum_string.c
${OPENAIR3_DIR}/UTILS/log.c
- ${OPENAIR3_DIR}/UTILS/mme_config.c
${OPENAIR3_DIR}/UTILS/mcc_mnc_itu.c
)
@@ -1398,6 +1450,9 @@ include(FindPkgConfig)
pkg_search_module(LIBXML2 libxml-2.0 REQUIRED)
include_directories(${LIBXML2_INCLUDE_DIRS})
+pkg_search_module(LIBXSLT libxslt REQUIRED)
+include_directories(${LIBXSLT_INCLUDE_DIRS})
+
pkg_search_module(OPENSSL openssl REQUIRED)
include_directories(${OPENSSL_INCLUDE_DIRS})
@@ -1491,13 +1546,14 @@ add_executable(lte-softmodem
target_link_libraries (lte-softmodem
-Wl,--start-group
- RRC_LIB S1AP_LIB S1AP_ENB GTPV1U SECU_CN SECU_OSA UTIL HASHTABLE SCTP_CLIENT UDP SCHED_LIB PHY LFDS L2 ${MSC_LIB} ${RAL_LIB} ${NAS_UE_LIB} ${ITTI_LIB} ${MIH_LIB}
+ RRC_LIB S1AP_LIB S1AP_ENB GTPV1U SECU_CN SECU_OSA UTIL HASHTABLE SCTP_CLIENT UDP SCHED_LIB PHY LFDS L2 ${MSC_LIB} ${RAL_LIB} ${NAS_UE_LIB} ${ITTI_LIB} ${MIH_LIB}
-Wl,--end-group )
target_link_libraries (lte-softmodem ${LIBXML2_LIBRARIES})
target_link_libraries (lte-softmodem pthread m ${CONFIG_LIBRARIES} rt crypt ${CRYPTO_LIBRARIES} ${OPENSSL_LIBRARIES} ${NETTLE_LIBRARIES} sctp ${option_HW_lib} ${option_TP_lib} ${XFORMS_LIBRARIES} )
target_link_libraries (lte-softmodem ${LIBBOOST_LIBRARIES})
+target_link_libraries (lte-softmodem ${LIB_LMS_LIBRARIES})
# lte-softmodem-nos1 is both eNB and UE implementation
###################################################
@@ -1531,8 +1587,7 @@ target_link_libraries (lte-softmodem-nos1
target_link_libraries (lte-softmodem-nos1 ${LIBXML2_LIBRARIES})
target_link_libraries (lte-softmodem-nos1 pthread m ${CONFIG_LIBRARIES} rt crypt ${CRYPTO_LIBRARIES} ${OPENSSL_LIBRARIES} ${NETTLE_LIBRARIES} ${option_HW_lib} ${option_TP_lib} ${XFORMS_LIBRARIES} )
target_link_libraries (lte-softmodem-nos1 ${LIBBOOST_LIBRARIES})
-
-
+target_link_libraries (lte-softmodem-nos1 ${LIB_LMS_LIBRARIES})
# rrh
################################
@@ -1546,7 +1601,6 @@ add_executable(rrh_gw
${HW_SOURCE}
${TRANSPORT_SOURCE}
)
-# assert
target_include_directories(rrh_gw PRIVATE ${OPENAIR_DIR}/common/utils/itti)
target_link_libraries(rrh_gw
-Wl,--start-group
@@ -1554,12 +1608,21 @@ target_link_libraries(rrh_gw
-Wl,--end-group )
target_link_libraries (rrh_gw rt pthread m )
target_link_libraries (rrh_gw ${option_HW_lib} ${option_TP_lib} ${LIBBOOST_LIBRARIES} )
+target_link_libraries (rrh_gw ${LIB_LMS_LIBRARIES})
Message("-- option_HW_lib=${option_HW_lib}")
Message("-- HW_SOURCE=${HW_SOURCE}")
Message("-- option_TP_lib=${option_TP_lib}")
Message("-- TRANSPORT_SOURCE=${TRANSPORT_SOURCE}")
+if (${RF_BOARD} STREQUAL "OAI_LMSSDR")
+ add_dependencies(lte-softmodem LMS7002M LMS_SDR Si5351C)
+ add_dependencies(lte-softmodem-nos1 LMS7002M LMS_SDR Si5351C)
+ add_dependencies(rrh_gw LMS7002M LMS_SDR Si5351C)
+endif (${RF_BOARD} STREQUAL "OAI_LMSSDR")
+
+
+
# USIM process
#################
#add_executable(usim
@@ -1681,6 +1744,7 @@ endforeach(myExe)
add_executable(test_epc_generate_scenario
${OPENAIR3_DIR}/TEST/EPC_TEST/generate_scenario.c
+ ${OPENAIR3_DIR}/TEST/EPC_TEST/generate_scenario.h
${OPENAIR2_DIR}/ENB_APP/enb_config.h
${OPENAIR2_DIR}/COMMON/commonDef.h
${OPENAIR2_DIR}/COMMON/messages_def.h
@@ -1689,7 +1753,28 @@ add_executable(test_epc_generate_scenario
${OPENAIR_BIN_DIR}/messages_xml.h
)
target_link_libraries (test_epc_generate_scenario
- -Wl,--start-group RRC_LIB S1AP_LIB S1AP_ENB X2AP_LIB GTPV1U LIB_NAS_UE SECU_CN UTIL HASHTABLE SCTP_CLIENT UDP SCHED_LIB PHY LFDS ${MSC_LIB} L2 -Wl,--end-group pthread m rt crypt sctp ${LIBXML2_LIBRARIES} ${CRYPTO_LIBRARIES} ${OPENSSL_LIBRARIES} ${NETTLE_LIBRARIES} ${CONFIG_LIBRARIES}
+ -Wl,--start-group RRC_LIB S1AP_LIB S1AP_ENB X2AP_LIB GTPV1U LIB_NAS_UE SECU_CN UTIL HASHTABLE SCTP_CLIENT UDP SCHED_LIB PHY LFDS ${ITTI_LIB} ${MSC_LIB} L2 -Wl,--end-group pthread m rt crypt sctp ${LIBXML2_LIBRARIES} ${LIBXSLT_LIBRARIES} ${CRYPTO_LIBRARIES} ${OPENSSL_LIBRARIES} ${NETTLE_LIBRARIES} ${CONFIG_LIBRARIES}
+ )
+
+add_executable(test_epc_play_scenario
+ ${OPENAIR3_DIR}/TEST/EPC_TEST/play_scenario.c
+ ${OPENAIR3_DIR}/TEST/EPC_TEST/play_scenario_decode.c
+ ${OPENAIR3_DIR}/TEST/EPC_TEST/play_scenario_display.c
+ ${OPENAIR3_DIR}/TEST/EPC_TEST/play_scenario_fsm.c
+ ${OPENAIR3_DIR}/TEST/EPC_TEST/play_scenario_parse.c
+ ${OPENAIR3_DIR}/TEST/EPC_TEST/play_scenario_s1ap.c
+ ${OPENAIR3_DIR}/TEST/EPC_TEST/play_scenario_s1ap_compare_ie.c
+ ${OPENAIR3_DIR}/TEST/EPC_TEST/play_scenario_s1ap_eNB_defs.h
+ ${OPENAIR3_DIR}/TEST/EPC_TEST/play_scenario_sctp.c
+ ${OPENAIR3_DIR}/TEST/EPC_TEST/play_scenario.h
+ ${OPENAIR2_DIR}/COMMON/commonDef.h
+ ${OPENAIR2_DIR}/COMMON/messages_def.h
+ ${OPENAIR2_DIR}/COMMON/messages_types.h
+ ${OPENAIR_BIN_DIR}/messages_xml.h
+ )
+target_include_directories(test_epc_play_scenario PUBLIC /usr/local/share/asn1c)
+target_link_libraries (test_epc_play_scenario
+ -Wl,--start-group RRC_LIB S1AP_LIB X2AP_LIB GTPV1U LIB_NAS_UE SECU_CN UTIL HASHTABLE SCTP_CLIENT UDP SCHED_LIB PHY LFDS ${ITTI_LIB} ${MSC_LIB} -Wl,--end-group pthread m rt crypt sctp ${LIBXML2_LIBRARIES} ${LIBXSLT_LIBRARIES} ${CRYPTO_LIBRARIES} ${OPENSSL_LIBRARIES} ${NETTLE_LIBRARIES} ${CONFIG_LIBRARIES}
)
diff --git a/cmake_targets/autotests/README.txt b/cmake_targets/autotests/README.txt
index f862644d07..6e9cbbd581 100644
--- a/cmake_targets/autotests/README.txt
+++ b/cmake_targets/autotests/README.txt
@@ -171,6 +171,41 @@ Obj.# Case# Test# Description
01 65 04 Band 7 FDD 10MHz DL Throughput for 300 sec for 1TX/1RX
01 65 05 Band 7 FDD 20MHz DL Throughput for 300 sec for 1TX/1RX
+
+01 70 00 lte-softmodem tests with SoDeRa RF as eNB and ALU EPC w/ Bandrich COTS UE for TX/1RX
+01 70 00 Band 7 FDD 5MHz UL Throughput for 300 sec for 1TX/1RX
+01 70 01 Band 7 FDD 10MHz UL Throughput for 300 sec for 1TX/1RX
+01 70 02 Band 7 FDD 20MHz UL Throughput for 300 sec for 1TX/1RX
+01 70 03 Band 7 FDD 5MHz DL Throughput for 300 sec for 1TX/1RX
+01 70 04 Band 7 FDD 10MHz DL Throughput for 300 sec for 1TX/1RX
+01 70 05 Band 7 FDD 20MHz DL Throughput for 300 sec for 1TX/1RX
+
+
+01 75 00 lte-softmodem + RRH tests with B210 RF as eNB and ALU EPC w/ Bandrich COTS UE for TX/1RX
+01 75 00 Band 7 FDD 5MHz UL Throughput for 300 sec for 1TX/1RX
+01 75 01 Band 7 FDD 10MHz UL Throughput for 300 sec for 1TX/1RX
+01 75 02 Band 7 FDD 20MHz UL Throughput for 300 sec for 1TX/1RX
+01 75 03 Band 7 FDD 5MHz DL Throughput for 300 sec for 1TX/1RX
+01 75 04 Band 7 FDD 10MHz DL Throughput for 300 sec for 1TX/1RX
+01 75 05 Band 7 FDD 20MHz DL Throughput for 300 sec for 1TX/1RX
+
+01 80 00 lte-softmodem + RRH tests with BladeRF RF as eNB and ALU EPC w/ Bandrich COTS UE for TX/1RX
+01 80 00 Band 7 FDD 5MHz UL Throughput for 300 sec for 1TX/1RX
+01 80 01 Band 7 FDD 10MHz UL Throughput for 300 sec for 1TX/1RX
+01 80 02 Band 7 FDD 20MHz UL Throughput for 300 sec for 1TX/1RX
+01 80 03 Band 7 FDD 5MHz DL Throughput for 300 sec for 1TX/1RX
+01 80 04 Band 7 FDD 10MHz DL Throughput for 300 sec for 1TX/1RX
+01 80 05 Band 7 FDD 20MHz DL Throughput for 300 sec for 1TX/1RX
+
+01 85 00 lte-softmodem + RRH tests with USRP X310 RF as eNB and ALU EPC w/ Bandrich COTS UE for TX/1RX
+01 85 00 Band 7 FDD 5MHz UL Throughput for 300 sec for 1TX/1RX
+01 85 01 Band 7 FDD 10MHz UL Throughput for 300 sec for 1TX/1RX
+01 85 02 Band 7 FDD 20MHz UL Throughput for 300 sec for 1TX/1RX
+01 85 03 Band 7 FDD 5MHz DL Throughput for 300 sec for 1TX/1RX
+01 85 04 Band 7 FDD 10MHz DL Throughput for 300 sec for 1TX/1RX
+01 85 05 Band 7 FDD 20MHz DL Throughput for 300 sec for 1TX/1RX
+
+
01 64 lte-softmodem-noS1 tests
02 Functional test case
diff --git a/cmake_targets/autotests/run_exec_autotests.bash b/cmake_targets/autotests/run_exec_autotests.bash
index a622b07efb..a98a071bae 100755
--- a/cmake_targets/autotests/run_exec_autotests.bash
+++ b/cmake_targets/autotests/run_exec_autotests.bash
@@ -12,7 +12,7 @@ trap handle_ctrl_c INT
source $OPENAIR_DIR/cmake_targets/tools/test_helper
-#SUDO="sudo -E "
+SUDO="sudo -E -S"
tdir=$OPENAIR_DIR/cmake_targets/autotests
rm -fr $tdir/bin
mkdir -p $tdir/bin
@@ -404,14 +404,12 @@ until [ -z "$1" ]
esac
done
-if [ "$SET_PASSWORD" == "1" ]; then
- mypassword=$passwd
-else
- read -s -p "Enter Password: " mypassword
+if [ "$SET_PASSWORD" != "1" ]; then
+ read -s -p "Enter Password: " passwd
fi
tmpfile=`mktemp`
-echo \'$passwd\' | $SUDO echo $HOME >& $tmpfile
+echo $passwd | $SUDO echo $HOME > $tmpfile
tstsudo=`cat $tmpfile`
if [ "$tstsudo" != "$HOME" ]; then
echo "$USER might not have sudo privileges. Exiting"
@@ -509,7 +507,7 @@ for search_expr in "${test_case_array[@]}"
if [ "$class" == "compilation" ]; then
test_compile "$name" "$compile_prog" "$compile_prog_args" "$pre_exec" "$pre_exec_args" "$main_exec" "$main_exec_args" "search_array_true[@]" "$search_expr_false" "$nruns" "$pre_compile_prog" "$class" "$compile_prog_out" "$tags"
elif [ "$class" == "execution" ]; then
- $SUDO killall -q oaisim_nos1
+ echo \'passwd\' | $SUDO killall -q oaisim_nos1
test_compile_and_run "$name" "$compile_prog" "$compile_prog_args" "$pre_exec" "$pre_exec_args" "$main_exec" "$main_exec_args" "search_array_true[@]" "$search_expr_false" "$nruns" "$pre_compile_prog" "$class" "$compile_prog_out" "$tags" "$mypassword" "$test_config_file"
else
echo "Unexpected class of test case...Skipping the test case $name ...."
diff --git a/cmake_targets/autotests/run_exec_lte-softmodem_tests.py b/cmake_targets/autotests/run_exec_lte-softmodem_tests.py
index eb142c114e..9997d89cd7 100755
--- a/cmake_targets/autotests/run_exec_lte-softmodem_tests.py
+++ b/cmake_targets/autotests/run_exec_lte-softmodem_tests.py
@@ -216,7 +216,7 @@ def sftp_module (username, password, hostname, ports, paramList,logfile):
# \brief bash script stub put at the end of scripts to terminate it
# \param timeout_cmd terminate script after timeout_cmd seconds
# \param terminate_missing_procs if True terminate all the processes launched by script if one of them terminates prematurely (due to error)
-def finalize_deploy_script (timeout_cmd, terminate_missing_procs='True'):
+def finalize_deploy_script (timeout_cmd, terminate_missing_procs='False'):
cmd = 'declare -i timeout_cmd='+str(timeout_cmd) + '\n'
if terminate_missing_procs == 'True':
cmd = cmd + """
@@ -571,6 +571,17 @@ def handle_testcaseclass_softmodem (testcase, oldprogramList, logdirOAI5GRepo ,
nruns = nruns_lte_softmodem
nruns = int(float(nruns))
tags = testcase.findtext('tags',default='')
+
+ RRHMachine = testcase.findtext('RRH',default='')
+ RRH_compile_prog = testcase.findtext('RRH_compile_prog',default='')
+ RRH_compile_prog_args = testcase.findtext('RRH_compile_prog_args',default='')
+ RRH_pre_exec = testcase.findtext('RRH_pre_exec',default='')
+ RRH_pre_exec_args = testcase.findtext('RRH_pre_exec_args',default='')
+ RRH_main_exec = testcase.findtext('RRH_main_exec',default='')
+ RRH_main_exec_args = testcase.findtext('RRH_main_exec_args',default='')
+ RRH_terminate_missing_procs = testcase.findtext('RRH_terminate_missing_procs',default='True')
+
+
eNBMachine = testcase.findtext('eNB',default='')
eNB_config_file = testcase.findtext('eNB_config_file',default='')
eNB_compile_prog = testcase.findtext('eNB_compile_prog',default='')
@@ -635,13 +646,15 @@ def handle_testcaseclass_softmodem (testcase, oldprogramList, logdirOAI5GRepo ,
oai_EPC = openair('localdomain', EPCMachine)
oai_EPC.connect(user, password)
res = oai_eNB.send_recv(cmd)
-
+ if RRHMachine != '':
+ cmd = 'cd ' + logdirOAI5GRepo + '; source oaienv ; env|grep OPENAIR'
+ index_RRHMachine = MachineList.index(RRHMachine)
+ oai_RRH = openair('localdomain', RRHMachine)
+ oai_RRH.connect(user, password)
+ res= oai_RRH.send_recv(cmd)
#cleanOldPrograms(oai_eNB, oldprogramList, CleanUpAluLteBox, ExmimoRfStop)
#cleanOldPrograms(oai_UE, oldprogramList, CleanUpAluLteBox, ExmimoRfStop)
#cleanOldPrograms(oai_EPC, oldprogramList, CleanUpAluLteBox, ExmimoRfStop)
- logdir_eNB = logdirOAI5GRepo+'/cmake_targets/autotests/log/'+ testcasename
- logdir_UE = logdirOAI5GRepo+'/cmake_targets/autotests/log/'+ testcasename
- logdir_EPC = logdirOpenaircnRepo+'/TEST/autotests/log/'+ testcasename
logdir_local = os.environ.get('OPENAIR_DIR')
if logdir_local is None:
print "Environment variable OPENAIR_DIR not set correctly"
@@ -667,10 +680,14 @@ def handle_testcaseclass_softmodem (testcase, oldprogramList, logdirOAI5GRepo ,
run_result=1
run_result_string=''
logdir_eNB = logdirOAI5GRepo+'/cmake_targets/autotests/log/'+ testcasename + '/run_' + str(run)
+ logdir_RRH = logdirOAI5GRepo+'/cmake_targets/autotests/log/'+ testcasename + '/run_' + str(run)
logdir_UE = logdirOAI5GRepo+'/cmake_targets/autotests/log/'+ testcasename + '/run_' + str(run)
logdir_EPC = logdirOpenaircnRepo+'/TEST/autotests/log/'+ testcasename + '/run_' + str(run)
logdir_local_testcase = logdir_local + '/cmake_targets/autotests/log/'+ testcasename + '/run_' + str(run)
#Make the log directory of test case
+ if RRHMachine != '':
+ cmd = 'rm -fr ' + logdir_RRH + ' ; mkdir -p ' + logdir_RRH
+ result = oai_RRH.send_recv(cmd)
cmd = 'rm -fr ' + logdir_eNB + ' ; mkdir -p ' + logdir_eNB
result = oai_eNB.send_recv(cmd)
cmd = 'rm -fr ' + logdir_UE + ' ; mkdir -p ' + logdir_UE
@@ -679,6 +696,39 @@ def handle_testcaseclass_softmodem (testcase, oldprogramList, logdirOAI5GRepo ,
result = oai_EPC.send_recv(cmd)
cmd = ' rm -fr ' + logdir_local_testcase + ' ; mkdir -p ' + logdir_local_testcase
result = os.system(cmd)
+
+ if RRHMachine != '':
+ logfile_compile_RRH = logdir_RRH + '/RRH_compile' + '_' + str(run) + '_.log'
+ logfile_exec_RRH = logdir_RRH + '/RRH_exec' + '_' + str(run) + '_.log'
+ logfile_pre_exec_RRH = logdir_RRH + '/RRH_pre_exec' + '_' + str(run) + '_.log'
+ logfile_task_RRH_compile_out = logdir_RRH + '/RRH_task_compile_out' + '_' + str(run) + '_.log'
+ logfile_task_RRH_compile = logdir_local_testcase + '/RRH_task_compile' + '_' + str(run) + '_.log'
+ logfile_task_RRH_out = logdir_RRH + '/RRH_task_out' + '_' + str(run) + '_.log'
+ logfile_task_RRH = logdir_local_testcase + '/RRH_task' + '_' + str(run) + '_.log'
+ task_RRH_compile = ' ( uname -a ; date \n'
+ task_RRH_compile = task_RRH_compile + 'cd ' + logdirOAI5GRepo + ' ; source oaienv ; source cmake_targets/tools/build_helper \n'
+ task_RRH_compile = task_RRH_compile + 'env |grep OPENAIR \n'
+ if RRH_compile_prog != "":
+ task_RRH_compile = task_RRH_compile + ' ( ' + RRH_compile_prog + ' '+ RRH_compile_prog_args + ' ) > ' + logfile_compile_RRH + ' 2>&1 \n'
+ task_RRH_compile = task_RRH_compile + ' date ) > ' + logfile_task_RRH_compile_out + ' 2>&1 '
+ write_file(logfile_task_RRH_compile, task_RRH_compile, mode="w")
+
+ task_RRH = ' ( uname -a ; date \n'
+ task_RRH = task_RRH + ' export OPENAIR_TESTDIR=' + logdir_RRH + '\n'
+ task_RRH = task_RRH + 'cd ' + logdirOAI5GRepo + ' ; source oaienv ; source cmake_targets/tools/build_helper \n'
+ task_RRH = task_RRH + 'env |grep OPENAIR \n' + 'array_exec_pid=() \n'
+
+ if RRH_pre_exec != "":
+ task_RRH = task_RRH + ' ( date; ' + RRH_pre_exec + ' '+ RRH_pre_exec_args + ' ) > ' + logfile_pre_exec_RRH + ' 2>&1 \n'
+ if RRH_main_exec != "":
+ task_RRH = task_RRH + ' ( date; ' + addsudo(RRH_main_exec + ' ' + RRH_main_exec_args, mypassword) + ' ) > ' + logfile_exec_RRH + ' 2>&1 & \n'
+ task_RRH = task_RRH + 'array_exec_pid+=($!) \n'
+ task_RRH = task_RRH + 'echo eNB_main_exec PID = $! \n'
+ #terminate the eNB test case after timeout_cmd seconds
+ task_RRH = task_RRH + finalize_deploy_script (timeout_cmd, RRH_terminate_missing_procs) + ' \n'
+ task_RRH = task_RRH + 'handle_ctrl_c' + '\n'
+ task_RRH = task_RRH + ' ) > ' + logfile_task_RRH_out + ' 2>&1 '
+ write_file(logfile_task_RRH, task_RRH, mode="w")
logfile_compile_eNB = logdir_eNB + '/eNB_compile' + '_' + str(run) + '_.log'
logfile_exec_eNB = logdir_eNB + '/eNB_exec' + '_' + str(run) + '_.log'
@@ -704,6 +754,7 @@ def handle_testcaseclass_softmodem (testcase, oldprogramList, logdirOAI5GRepo ,
write_file(logfile_task_eNB_compile, task_eNB_compile, mode="w")
task_eNB = ' ( uname -a ; date \n'
+ task_eNB = task_eNB + ' export OPENAIR_TESTDIR=' + logdir_eNB + '\n'
task_eNB = task_eNB + 'cd ' + logdirOAI5GRepo + ' ; source oaienv ; source cmake_targets/tools/build_helper \n'
task_eNB = task_eNB + 'env |grep OPENAIR \n' + 'array_exec_pid=() \n'
@@ -806,6 +857,7 @@ def handle_testcaseclass_softmodem (testcase, oldprogramList, logdirOAI5GRepo ,
write_file(logfile_task_EPC_compile, task_EPC_compile, mode="w")
task_EPC = ' ( uname -a ; date \n'
+ task_EPC = task_EPC + ' export OPENAIRCN_TESTDIR=' + logdir_EPC + '\n'
task_EPC = task_EPC + 'array_exec_pid=()' + '\n'
task_EPC = task_EPC + 'cd ' + logdirOpenaircnRepo + '; source oaienv\n'
task_EPC = task_EPC + 'source BUILD/TOOLS/build_helper \n'
@@ -837,14 +889,20 @@ def handle_testcaseclass_softmodem (testcase, oldprogramList, logdirOAI5GRepo ,
thread_EPC = oaiThread(1, "EPC_thread", EPCMachine, user, password , task_EPC_compile, False, timeout_thread)
thread_eNB = oaiThread(2, "eNB_thread", eNBMachine, user, password , task_eNB_compile, False, timeout_thread)
thread_UE = oaiThread(3, "UE_thread", UEMachine, user, password , task_UE_compile, False, timeout_thread)
+ if RRHMachine != '':
+ thread_RRH = oaiThread(4, "RRH_thread", RRHMachine, user, password , task_RRH_compile, False, timeout_thread)
threads=[]
threads.append(thread_eNB)
threads.append(thread_UE)
threads.append(thread_EPC)
+ if RRHMachine != '':
+ threads.append(thread_RRH)
# Start new Threads
thread_eNB.start()
thread_UE.start()
thread_EPC.start()
+ if RRHMachine != '':
+ thread_RRH.start()
#Wait for all the compile threads to complete
for t in threads:
t.join()
@@ -853,26 +911,29 @@ def handle_testcaseclass_softmodem (testcase, oldprogramList, logdirOAI5GRepo ,
thread_EPC = oaiThread(1, "EPC_thread", EPCMachine, user, password , task_EPC, False, timeout_thread)
thread_eNB = oaiThread(2, "eNB_thread", eNBMachine, user, password , task_eNB, False, timeout_thread)
thread_UE = oaiThread(3, "UE_thread", UEMachine, user, password , task_UE, False, timeout_thread)
-
+ if RRHMachine != '':
+ thread_RRH = oaiThread(4, "RRH_thread", RRHMachine, user, password , task_RRH, False, timeout_thread)
threads=[]
threads.append(thread_eNB)
threads.append(thread_UE)
threads.append(thread_EPC)
+ if RRHMachine != '':
+ threads.append(thread_RRH)
# Start new Threads
thread_eNB.start()
thread_UE.start()
thread_EPC.start()
-
+ if RRHMachine != '':
+ thread_RRH.start()
#Wait for all the compile threads to complete
for t in threads:
t.join()
#Now we get the log files from remote machines on the local machine
- cleanOldProgramsAllMachines([oai_eNB, oai_UE, oai_EPC] , oldprogramList, CleanUpAluLteBox, ExmimoRfStop)
-
- #cleanOldPrograms(oai_eNB, oldprogramList, CleanUpAluLteBox, ExmimoRfStop)
- #cleanOldPrograms(oai_UE, oldprogramList, CleanUpAluLteBox, ExmimoRfStop)
- #cleanOldPrograms(oai_EPC, oldprogramList, CleanUpAluLteBox, ExmimoRfStop)
+ if RRHMachine != '':
+ cleanOldProgramsAllMachines([oai_eNB, oai_UE, oai_EPC, oai_RRH] , oldprogramList, CleanUpAluLteBox, ExmimoRfStop)
+ else:
+ cleanOldProgramsAllMachines([oai_eNB, oai_UE, oai_EPC] , oldprogramList, CleanUpAluLteBox, ExmimoRfStop)
logfile_UE_stop_script_out = logdir_UE + '/UE_stop_script_out' + '_' + str(run) + '_.log'
logfile_UE_stop_script = logdir_local_testcase + '/UE_stop_script' + '_' + str(run) + '_.log'
@@ -900,22 +961,23 @@ def handle_testcaseclass_softmodem (testcase, oldprogramList, logdirOAI5GRepo ,
res= oai_EPC.send_recv(cmd)
print "Changing permissions of logdir <" + logdir_EPC + "> in EPC machine..." + res
+ if RRHMachine != '':
+ cmd = 'sudo -E chown -R ' + user + ' ' + logdir_RRH
+ res= oai_RRH.send_recv(cmd)
+ print "Changing permissions of logdir <" + logdir_RRH + "> in RRH machine..." + res
print "Copying files from EPCMachine : " + EPCMachine + "logdir_EPC = " + logdir_EPC
- #ssh = SSHSession(EPCMachine , username=user, key_file=None, password=password)
- #ssh.get_all(logdir_EPC , logdir_local + '/cmake_targets/autotests/log/'+ testcasename)
SSHSessionWrapper(EPCMachine, user, None, password, logdir_EPC, logdir_local + '/cmake_targets/autotests/log/'+ testcasename, "get_all")
print "Copying files from eNBMachine " + eNBMachine + "logdir_eNB = " + logdir_eNB
- #ssh = SSHSession(eNBMachine , username=user, key_file=None, password=password)
- #ssh.get_all(logdir_eNB, logdir_local + '/cmake_targets/autotests/log/'+ testcasename)
SSHSessionWrapper(eNBMachine, user, None, password, logdir_eNB, logdir_local + '/cmake_targets/autotests/log/'+ testcasename, "get_all")
print "Copying files from UEMachine : " + UEMachine + "logdir_UE = " + logdir_UE
- #ssh = SSHSession(UEMachine , username=user, key_file=None, password=password)
- #ssh.get_all(logdir_UE , logdir_local + '/cmake_targets/autotests/log/'+ testcasename)
SSHSessionWrapper(UEMachine, user, None, password, logdir_UE, logdir_local + '/cmake_targets/autotests/log/'+ testcasename, "get_all")
+ if RRHMachine != '':
+ print "Copying files from RRHMachine : " + RRHMachine + "logdir_RRH = " + logdir_RRH
+ SSHSessionWrapper(RRHMachine, user, None, password, logdir_RRH, logdir_local + '/cmake_targets/autotests/log/'+ testcasename, "get_all")
#Currently we only perform throughput tests
@@ -1017,8 +1079,8 @@ class oaiCleanOldProgramThread (threading.Thread):
error = error + '\n threadID = ' + str(self.threadID) + '\n threadname = ' + self.threadname + '\n CleanUpOldProgs = ' + self.CleanUpOldProgs + '\n CleanUpAluLteBox = ' + self.CleanUpAluLteBox + '\n ExmimoRfStop = ' + self.ExmimoRfStop + '\n'
error = error + traceback.format_exc()
print error
- print "There is error in cleaning up old programs. The test case execution cannot continue...."
- sys.exit(1)
+ print "There is error in cleaning up old programs....."
+ #sys.exit(1)
# \brief Run parallel threads in all machines for clean up old execution of test cases
# \param oai_list list of handlers that can be used to execute programs on remote machines
@@ -1061,6 +1123,7 @@ flag_remove_logdir=False
flag_start_testcase=False
nruns_lte_softmodem=''
flag_skip_git_head_check=False
+flag_skip_oai_install=False
Timeout_cmd=''
print "Number of arguments argc = " + str(len(sys.argv))
#for index in range(1,len(sys.argv) ):
@@ -1120,6 +1183,8 @@ while i < len (sys.argv):
elif arg == '--timeout_cmd':
Timeout_cmd = sys.argv[i+1]
i = i +1
+ elif arg == '--skip-oai-install':
+ flag_skip_oai_install=True
elif arg == '-h' :
print "-s: This flag *MUST* be set to start the test cases"
print "-r: Remove the log directory in autotests"
@@ -1135,6 +1200,7 @@ while i < len (sys.argv):
print "-MachineListGeneric : overrides the MachineListGeneric parameter in test_case_list.xml"
print "--skip-git-head-check: skip checking of GitHead remote/local branch (only for debugging)"
print "--timeout_cmd: Override the default parameter (timeout_cmd) in test_case_list.xml. This parameter is in seconds and should be > 120"
+ print "--skip-oai-install: Skips the openairinterface5g installer"
sys.exit()
else :
print "Unrecongnized Option: <" + arg + ">. Use -h to see valid options"
@@ -1343,6 +1409,17 @@ for oai in oai_list:
else:
cmd = cmd + 'if [ \"$git_head\" != \"'+ GitOAI5GHeadVersion + '\" ]; then echo \"error: Git openairinterface5g head version does not match\" ; fi \n'
cmd = cmd + 'source oaienv' + '\n'
+ if flag_skip_oai_install == False:
+ cmd = cmd + 'source $OPENAIR_DIR/cmake_targets/tools/build_helper \n'
+ cmd = cmd + 'echo \"Installing core OAI dependencies...Start\" \n'
+ cmd = cmd + '$OPENAIR_DIR/cmake_targets/build_oai -I --install-optional-packages \n'
+ cmd = cmd + 'echo \"Installing core OAI dependencies...Finished\" \n'
+ #cmd = cmd + 'echo \"Installing BLADERF OAI dependencies...Start\" \n'
+ #cmd = cmd + 'check_install_bladerf_driver \n'
+ #cmd = cmd + 'echo \"Installing BLADERF OAI dependencies...Finished\" \n'
+ #cmd = cmd + 'echo \"Installing USRP OAI dependencies...Start\" \n'
+ #cmd = cmd + 'check_install_usrp_uhd_driver \n'
+ #cmd = cmd + 'echo \"Installing USRP OAI dependencies...Finished\" \n'
cmd = cmd + 'cd ' + logdirOpenaircnRepo + '\n'
cmd = cmd + 'git checkout ' + GitOpenaircnRepoBranch + '\n'
cmd = cmd + 'env |grep OPENAIR' + '\n'
@@ -1351,7 +1428,7 @@ for oai in oai_list:
#cmd = cmd + 'echo \' ' + cmd + '\' > ' + setup_script + ' 2>&1 \n '
#result = oai_list[index].send_recv(cmd, False, 300 )
write_file(setup_script, cmd, mode="w")
- tempThread = oaiThread(index, 'thread_setup_'+str(index)+'_' + MachineList[index] , MachineList[index] , user, pw, cmd, False, 300)
+ tempThread = oaiThread(index, 'thread_setup_'+str(index)+'_' + MachineList[index] , MachineList[index] , user, pw, cmd, False, 3000)
threads_init_setup.append(tempThread )
tempThread.start()
index = index + 1
@@ -1399,7 +1476,8 @@ status, out = commands.getstatusoutput('grep ' + ' -il \'error\' ' + locallogdi
if (out != '') :
print "There is error in setup of machines"
print "status = " + str(status) + "\n Check files for error = " + out
- print sys.exit(1)
+ print "Exiting now..."
+ sys.exit(1)
cleanOldProgramsAllMachines(oai_list, CleanUpOldProgs, CleanUpAluLteBox, ExmimoRfStop)
if cleanUpRemoteMachines == True:
diff --git a/cmake_targets/autotests/test_case_list.xml b/cmake_targets/autotests/test_case_list.xml
index 037f5c8ee9..394feda359 100644
--- a/cmake_targets/autotests/test_case_list.xml
+++ b/cmake_targets/autotests/test_case_list.xml
@@ -6,11 +6,11 @@
https://gitlab.eurecom.fr/oai/openair-cn.git
develop
develop
- oaisim* oaisim_nos1* lte-softmodem* lte-softmodem-nos1* mme_gw* run_epc* run_hss* hss hss_sim configure_cots_bandrich_ue* wvdial* iperf iperf_script ping tshark
+ oaisim* oaisim_nos1* lte-softmodem* lte-softmodem-nos1* mme_gw* run_epc* run_hss* hss hss_sim configure_cots_bandrich_ue* wvdial* iperf iperf_script ping tshark rrh_gw
sudo -S -E /opt/ltebox/tools/stop_ltebox
$OPENAIR_DIR/cmake_targets/build_oai -w EXMIMO -c; sudo -S -E $OPENAIR_DIR/cmake_targets/tools/stop_exmimo2; uname -a; dmesg|tail
36000
- 0104+ 015502 015505 015506 015507 015508 015509 015510 015511 015602 015605 015702 015705 015802 015805 016002 016005 016102 016105 016302 016305 016502 016505
+ 0102+ 010304 010305 0104+ 015502 015505 015506 015507 015508 015509 015510 015511 015602 015605 015702 015705 015802 015805 0159+ 0160+ 0161+ 0162+ 0163+ 0165+ 0170+ 017502 017505
3
mozart calisson stevens nano amerique
@@ -329,22 +329,19 @@
execution
Run OAISIM Rel10 TDD, 1 eNB + 1 UE (5 MHz/10MHz/20MHz), (TM 1,2) and search for errors, segmentation fault or exit
- cp -vf $OPENAIR_TARGETS/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.generic.oaisim.local_no_mme.conf $OPENAIR_LOGDIR/enb.band7.generic.oaisim.local_no_mme.conf
+ cp -vf $OPENAIR_TARGETS/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band38.generic.oaisim.local_no_mme.conf $OPENAIR_LOGDIR/enb.band38.generic.oaisim.local_no_mme.conf
$OPENAIR_DIR/cmake_targets/build_oai
--oaisim --noS1 -c
$OPENAIR_DIR/cmake_targets/tools/init_nas_nos1
- $OPENAIR_LOGDIR/enb.band7.generic.oaisim.local_no_mme.conf frame_type \"TDD\"
- $OPENAIR_LOGDIR/enb.band7.generic.oaisim.local_no_mme.conf eutra_band 38
- $OPENAIR_LOGDIR/enb.band7.generic.oaisim.local_no_mme.conf downlink_frequency 2580000000L
- $OPENAIR_LOGDIR/enb.band7.generic.oaisim.local_no_mme.conf uplink_frequency_offset 0
+
$OPENAIR_DIR/cmake_targets/oaisim_noS1_build_oai/build/oaisim_nos1
- -O $OPENAIR_LOGDIR/enb.band7.generic.oaisim.local_no_mme.conf -A AWGN -b1 -u1 -n100 -R 25 -x 1
- -O $OPENAIR_LOGDIR/enb.band7.generic.oaisim.local_no_mme.conf -A AWGN -b1 -u1 -n100 -R 50 -x 1
- -O $OPENAIR_LOGDIR/enb.band7.generic.oaisim.local_no_mme.conf -A AWGN -b1 -u1 -n100 -R 100 -x 1
- -O $OPENAIR_LOGDIR/enb.band7.generic.oaisim.local_no_mme.conf -A AWGN -b1 -u1 -n100 -R 25 -x 2
- -O $OPENAIR_LOGDIR/enb.band7.generic.oaisim.local_no_mme.conf -A AWGN -b1 -u1 -n100 -R 50 -x 2
- -O $OPENAIR_LOGDIR/enb.band7.generic.oaisim.local_no_mme.conf -A AWGN -b1 -u1 -n100 -R 100 -x 2
+ -O $OPENAIR_LOGDIR/enb.band38.generic.oaisim.local_no_mme.conf -A AWGN -b1 -u1 -n100 -R 25 -x 1 -s15
+ -O $OPENAIR_LOGDIR/enb.band38.generic.oaisim.local_no_mme.conf -A AWGN -b1 -u1 -n100 -R 50 -x 1 -s15
+ -O $OPENAIR_LOGDIR/enb.band38.generic.oaisim.local_no_mme.conf -A AWGN -b1 -u1 -n100 -R 100 -x 1 -s15
+ -O $OPENAIR_LOGDIR/enb.band38.generic.oaisim.local_no_mme.conf -A AWGN -b1 -u1 -n100 -R 25 -x 2 -s15
+ -O $OPENAIR_LOGDIR/enb.band38.generic.oaisim.local_no_mme.conf -A AWGN -b1 -u1 -n100 -R 50 -x 2 -s15
+ -O $OPENAIR_LOGDIR/enb.band38.generic.oaisim.local_no_mme.conf -A AWGN -b1 -u1 -n100 -R 100 -x 2 -s15
oaisim_noS1.tdd.5MHz.TM1 oaisim_noS1.tdd.10MHz.TM1 oaisim_noS1.tdd.20MHz.TM1 oaisim_noS1.tdd.5MHz.TM2 oaisim_noS1.tdd.10MHz.TM2 oaisim_noS1.tdd.20MHz.TM2
"Received RRCConnectionReconfigurationComplete from UE 0"
segmentation fault|assertion|exiting|fatal
@@ -354,22 +351,19 @@
execution
Run OAISIM Rel10 TDD, 1 eNB + 1 UE (5 MHz/10MHz/20MHz), (TM 1,2) in PHY_ABSTRACTION mode and search for errors, segmentation fault or exit
- cp -vf $OPENAIR_TARGETS/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.generic.oaisim.local_no_mme.conf $OPENAIR_LOGDIR/enb.band7.generic.oaisim.local_no_mme.conf
+ cp -vf $OPENAIR_TARGETS/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band38.generic.oaisim.local_no_mme.conf $OPENAIR_LOGDIR/enb.band38.generic.oaisim.local_no_mme.conf
$OPENAIR_DIR/cmake_targets/build_oai
--oaisim --noS1 -c
- $OPENAIR_LOGDIR/enb.band7.generic.oaisim.local_no_mme.conf frame_type \"TDD\"
- $OPENAIR_LOGDIR/enb.band7.generic.oaisim.local_no_mme.conf eutra_band 38
- $OPENAIR_LOGDIR/enb.band7.generic.oaisim.local_no_mme.conf downlink_frequency 2580000000L
- $OPENAIR_LOGDIR/enb.band7.generic.oaisim.local_no_mme.conf uplink_frequency_offset 0
+
$OPENAIR_DIR/cmake_targets/tools/init_nas_nos1
$OPENAIR_DIR/cmake_targets/oaisim_noS1_build_oai/build/oaisim_nos1
- -O $OPENAIR_LOGDIR/enb.band7.generic.oaisim.local_no_mme.conf -A AWGN -b1 -u1 -n100 -R 25 -x 1 -a
- -O $OPENAIR_LOGDIR/enb.band7.generic.oaisim.local_no_mme.conf -A AWGN -b1 -u1 -n100 -R 50 -x 1 -a
- -O $OPENAIR_LOGDIR/enb.band7.generic.oaisim.local_no_mme.conf -A AWGN -b1 -u1 -n100 -R 100 -x 1 -a
- -O $OPENAIR_LOGDIR/enb.band7.generic.oaisim.local_no_mme.conf -A AWGN -b1 -u1 -n100 -R 25 -x 2 -a
- -O $OPENAIR_LOGDIR/enb.band7.generic.oaisim.local_no_mme.conf -A AWGN -b1 -u1 -n100 -R 50 -x 2 -a
- -O $OPENAIR_LOGDIR/enb.band7.generic.oaisim.local_no_mme.conf -A AWGN -b1 -u1 -n100 -R 100 -x 2 -a
+ -O $OPENAIR_LOGDIR/enb.band38.generic.oaisim.local_no_mme.conf -A AWGN -b1 -u1 -n100 -R 25 -x 1 -a -s15
+ -O $OPENAIR_LOGDIR/enb.band38.generic.oaisim.local_no_mme.conf -A AWGN -b1 -u1 -n100 -R 50 -x 1 -a -s15
+ -O $OPENAIR_LOGDIR/enb.band38.generic.oaisim.local_no_mme.conf -A AWGN -b1 -u1 -n100 -R 100 -x 1 -a -s15
+ -O $OPENAIR_LOGDIR/enb.band38.generic.oaisim.local_no_mme.conf -A AWGN -b1 -u1 -n100 -R 25 -x 2 -a -s15
+ -O $OPENAIR_LOGDIR/enb.band38.generic.oaisim.local_no_mme.conf -A AWGN -b1 -u1 -n100 -R 50 -x 2 -a -s15
+ -O $OPENAIR_LOGDIR/enb.band38.generic.oaisim.local_no_mme.conf -A AWGN -b1 -u1 -n100 -R 100 -x 2 -a -s15
oaisim_noS1.tdd.5MHz.TM1 oaisim_noS1.tdd.10MHz.TM1 oaisim_noS1.tdd.20MHz.TM1 oaisim_noS1.tdd.5MHz.TM2 oaisim_noS1.tdd.10MHz.TM2 oaisim_noS1.tdd.20MHz.TM2
"Received RRCConnectionReconfigurationComplete from UE 0"
segmentation fault|assertion|exiting|fatal
@@ -379,22 +373,19 @@
execution
Run OAISIM Rel10 TDD, 1 eNB + 3 UEs (5 MHz/10MHz/20MHz), (TM 1,2) and search for errors, segmentation fault or exit
-cp -vf $OPENAIR_TARGETS/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.generic.oaisim.local_no_mme.conf $OPENAIR_LOGDIR/enb.band7.generic.oaisim.local_no_mme.conf
+cp -vf $OPENAIR_TARGETS/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band38.generic.oaisim.local_no_mme.conf $OPENAIR_LOGDIR/enb.band38.generic.oaisim.local_no_mme.conf
$OPENAIR_DIR/cmake_targets/build_oai
--oaisim --noS1 -c
- $OPENAIR_LOGDIR/enb.band7.generic.oaisim.local_no_mme.conf frame_type \"TDD\"
- $OPENAIR_LOGDIR/enb.band7.generic.oaisim.local_no_mme.conf eutra_band 38
- $OPENAIR_LOGDIR/enb.band7.generic.oaisim.local_no_mme.conf downlink_frequency 2580000000L
- $OPENAIR_LOGDIR/enb.band7.generic.oaisim.local_no_mme.conf uplink_frequency_offset 0
+
$OPENAIR_DIR/cmake_targets/tools/init_nas_nos1
$OPENAIR_DIR/cmake_targets/oaisim_noS1_build_oai/build/oaisim_nos1
- -O $OPENAIR_LOGDIR/enb.band7.generic.oaisim.local_no_mme.conf -A AWGN -b1 -u3 -n100 -R 25 -x 1
- -O $OPENAIR_LOGDIR/enb.band7.generic.oaisim.local_no_mme.conf -A AWGN -b1 -u3 -n100 -R 50 -x 1
- -O $OPENAIR_LOGDIR/enb.band7.generic.oaisim.local_no_mme.conf -A AWGN -b1 -u3 -n100 -R 100 -x 1
- -O $OPENAIR_LOGDIR/enb.band7.generic.oaisim.local_no_mme.conf -A AWGN -b1 -u3 -n100 -R 25 -x 2
- -O $OPENAIR_LOGDIR/enb.band7.generic.oaisim.local_no_mme.conf -A AWGN -b1 -u3 -n100 -R 50 -x 2
- -O $OPENAIR_LOGDIR/enb.band7.generic.oaisim.local_no_mme.conf -A AWGN -b1 -u3 -n100 -R 100 -x 2
+ -O $OPENAIR_LOGDIR/enb.band38.generic.oaisim.local_no_mme.conf -A AWGN -b1 -u3 -n100 -R 25 -x 1 -s15
+ -O $OPENAIR_LOGDIR/enb.band38.generic.oaisim.local_no_mme.conf -A AWGN -b1 -u3 -n100 -R 50 -x 1 -s15
+ -O $OPENAIR_LOGDIR/enb.band38.generic.oaisim.local_no_mme.conf -A AWGN -b1 -u3 -n100 -R 100 -x 1 -s15
+ -O $OPENAIR_LOGDIR/enb.band38.generic.oaisim.local_no_mme.conf -A AWGN -b1 -u3 -n100 -R 25 -x 2 -s15
+ -O $OPENAIR_LOGDIR/enb.band38.generic.oaisim.local_no_mme.conf -A AWGN -b1 -u3 -n100 -R 50 -x 2 -s15
+ -O $OPENAIR_LOGDIR/enb.band38.generic.oaisim.local_no_mme.conf -A AWGN -b1 -u3 -n100 -R 100 -x 2 -s15
oaisim_noS1.tdd.5MHz.TM1 oaisim_noS1.tdd.10MHz.TM1 oaisim_noS1.tdd.20MHz.TM1 oaisim_noS1.tdd.5MHz.TM2 oaisim_noS1.tdd.10MHz.TM2 oaisim_noS1.tdd.20MHz.TM2
"Received RRCConnectionReconfigurationComplete from UE 0" "Received RRCConnectionReconfigurationComplete from UE 1" "Received RRCConnectionReconfigurationComplete from UE 2"
segmentation fault|assertion|exiting|fatal
@@ -404,22 +395,19 @@
execution
Run OAISIM Rel10 TDD, 1 eNB + 3 UEs (5 MHz) in PHY_ABSTRACTION mode and search for errors, segmentation fault or exit
- cp -vf $OPENAIR_TARGETS/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.generic.oaisim.local_no_mme.conf $OPENAIR_LOGDIR/enb.band7.generic.oaisim.local_no_mme.conf
+ cp -vf $OPENAIR_TARGETS/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band38.generic.oaisim.local_no_mme.conf $OPENAIR_LOGDIR/enb.band38.generic.oaisim.local_no_mme.conf
$OPENAIR_DIR/cmake_targets/build_oai
--oaisim --noS1 -c
- $OPENAIR_LOGDIR/enb.band7.generic.oaisim.local_no_mme.conf frame_type \"TDD\"
- $OPENAIR_LOGDIR/enb.band7.generic.oaisim.local_no_mme.conf eutra_band 38
- $OPENAIR_LOGDIR/enb.band7.generic.oaisim.local_no_mme.conf downlink_frequency 2580000000L
- $OPENAIR_LOGDIR/enb.band7.generic.oaisim.local_no_mme.conf uplink_frequency_offset 0
+
$OPENAIR_DIR/cmake_targets/tools/init_nas_nos1
$OPENAIR_DIR/cmake_targets/oaisim_noS1_build_oai/build/oaisim_nos1
- -O $OPENAIR_LOGDIR/enb.band7.generic.oaisim.local_no_mme.conf -A AWGN -b1 -u3 -n100 -R 25 -x 1 -a
- -O $OPENAIR_LOGDIR/enb.band7.generic.oaisim.local_no_mme.conf -A AWGN -b1 -u3 -n100 -R 50 -x 1 -a
- -O $OPENAIR_LOGDIR/enb.band7.generic.oaisim.local_no_mme.conf -A AWGN -b1 -u3 -n100 -R 100 -x 1 -a
- -O $OPENAIR_LOGDIR/enb.band7.generic.oaisim.local_no_mme.conf -A AWGN -b1 -u3 -n100 -R 25 -x 2 -a
- -O $OPENAIR_LOGDIR/enb.band7.generic.oaisim.local_no_mme.conf -A AWGN -b1 -u3 -n100 -R 50 -x 2 -a
- -O $OPENAIR_LOGDIR/enb.band7.generic.oaisim.local_no_mme.conf -A AWGN -b1 -u3 -n100 -R 100 -x 2 -a
+ -O $OPENAIR_LOGDIR/enb.band38.generic.oaisim.local_no_mme.conf -A AWGN -b1 -u3 -n100 -R 25 -x 1 -a -s15
+ -O $OPENAIR_LOGDIR/enb.band38.generic.oaisim.local_no_mme.conf -A AWGN -b1 -u3 -n100 -R 50 -x 1 -a -s15
+ -O $OPENAIR_LOGDIR/enb.band38.generic.oaisim.local_no_mme.conf -A AWGN -b1 -u3 -n100 -R 100 -x 1 -a -s15
+ -O $OPENAIR_LOGDIR/enb.band38.generic.oaisim.local_no_mme.conf -A AWGN -b1 -u3 -n100 -R 25 -x 2 -a -s15
+ -O $OPENAIR_LOGDIR/enb.band38.generic.oaisim.local_no_mme.conf -A AWGN -b1 -u3 -n100 -R 50 -x 2 -a -s15
+ -O $OPENAIR_LOGDIR/enb.band38.generic.oaisim.local_no_mme.conf -A AWGN -b1 -u3 -n100 -R 100 -x 2 -a -s15
oaisim_noS1.tdd.5MHz.TM1 oaisim_noS1.tdd.10MHz.TM1 oaisim_noS1.tdd.20MHz.TM1 oaisim_noS1.tdd.5MHz.TM2 oaisim_noS1.tdd.10MHz.TM2 oaisim_nos1.tdd.20MHz.TM2
"Received RRCConnectionReconfigurationComplete from UE 0" "Received RRCConnectionReconfigurationComplete from UE 1" "Received RRCConnectionReconfigurationComplete from UE 2"
segmentation fault|assertion|exiting|fatal
@@ -429,22 +417,19 @@
execution
Run OAI Rel10 TDD, 1 eNB + 1 UE (5 MHz) without abstraction mode, send ping from from eNB to UE, and check that there is no packet losses
- cp -vf $OPENAIR_TARGETS/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.generic.oaisim.local_no_mme.conf $OPENAIR_LOGDIR/enb.band7.generic.oaisim.local_no_mme.conf
+ cp -vf $OPENAIR_TARGETS/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band38.generic.oaisim.local_no_mme.conf $OPENAIR_LOGDIR/enb.band38.generic.oaisim.local_no_mme.conf
$OPENAIR_DIR/cmake_targets/build_oai
--oaisim --noS1 -c
$OPENAIR_DIR/cmake_targets/tools/init_nas_nos1
- $OPENAIR_LOGDIR/enb.band7.generic.oaisim.local_no_mme.conf frame_type \"TDD\"
- $OPENAIR_LOGDIR/enb.band7.generic.oaisim.local_no_mme.conf eutra_band 38
- $OPENAIR_LOGDIR/enb.band7.generic.oaisim.local_no_mme.conf downlink_frequency 2580000000L
- $OPENAIR_LOGDIR/enb.band7.generic.oaisim.local_no_mme.conf uplink_frequency_offset 0
+
$OPENAIR_DIR/cmake_targets/oaisim_noS1_build_oai/build/oaisim_nos1
- -O $OPENAIR_LOGDIR/enb.band7.generic.oaisim.local_no_mme.conf -A AWGN -b1 -u3 -n100 -R 25 -x 1 -c26
- -O $OPENAIR_LOGDIR/enb.band7.generic.oaisim.local_no_mme.conf -A AWGN -b1 -u3 -n100 -R 50 -x 1 -c26
- -O $OPENAIR_LOGDIR/enb.band7.generic.oaisim.local_no_mme.conf -A AWGN -b1 -u3 -n100 -R 100 -x 1 -c26
- -O $OPENAIR_LOGDIR/enb.band7.generic.oaisim.local_no_mme.conf -A AWGN -b1 -u3 -n100 -R 25 -x 2 -c26
- -O $OPENAIR_LOGDIR/enb.band7.generic.oaisim.local_no_mme.conf -A AWGN -b1 -u3 -n100 -R 50 -x 2 -c26
- -O $OPENAIR_LOGDIR/enb.band7.generic.oaisim.local_no_mme.conf -A AWGN -b1 -u3 -n100 -R 100 -x 2 -c26
+ -O $OPENAIR_LOGDIR/enb.band38.generic.oaisim.local_no_mme.conf -A AWGN -b1 -u3 -n100 -R 25 -x 1 -c26
+ -O $OPENAIR_LOGDIR/enb.band38.generic.oaisim.local_no_mme.conf -A AWGN -b1 -u3 -n100 -R 50 -x 1 -c26
+ -O $OPENAIR_LOGDIR/enb.band38.generic.oaisim.local_no_mme.conf -A AWGN -b1 -u3 -n100 -R 100 -x 1 -c26
+ -O $OPENAIR_LOGDIR/enb.band38.generic.oaisim.local_no_mme.conf -A AWGN -b1 -u3 -n100 -R 25 -x 2 -c26
+ -O $OPENAIR_LOGDIR/enb.band38.generic.oaisim.local_no_mme.conf -A AWGN -b1 -u3 -n100 -R 50 -x 2 -c26
+ -O $OPENAIR_LOGDIR/enb.band38.generic.oaisim.local_no_mme.conf -A AWGN -b1 -u3 -n100 -R 100 -x 2 -c26
oaisim_noS1.tdd.5MHz.TM1 oaisim_noS1.tdd.10MHz.TM1 oaisim_noS1.tdd.20MHz.TM1 oaisim_noS1.tdd.5MHz.TM2 oaisim_noS1.tdd.10MHz.TM2 oaisim_noS1.tdd.20MHz.TM2
"DL and UL loss rate below 10"
segmentation fault|assertion|exiting|fatal
@@ -454,22 +439,19 @@
execution
Run OAI Rel10 TDD, 1 eNB + 1 UE (5 MHz) in PHY_ABSTRACTION mode, send ping from from eNB to UE, and check that there is no packet losses
- cp -vf $OPENAIR_TARGETS/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.generic.oaisim.local_no_mme.conf $OPENAIR_LOGDIR/enb.band7.generic.oaisim.local_no_mme.conf
+ cp -vf $OPENAIR_TARGETS/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band38.generic.oaisim.local_no_mme.conf $OPENAIR_LOGDIR/enb.band38.generic.oaisim.local_no_mme.conf
$OPENAIR_DIR/cmake_targets/build_oai
--oaisim --noS1 -c
$OPENAIR_DIR/cmake_targets/tools/init_nas_nos1
- $OPENAIR_LOGDIR/enb.band7.generic.oaisim.local_no_mme.conf frame_type \"TDD\"
- $OPENAIR_LOGDIR/enb.band7.generic.oaisim.local_no_mme.conf eutra_band 38
- $OPENAIR_LOGDIR/enb.band7.generic.oaisim.local_no_mme.conf downlink_frequency 2580000000L
- $OPENAIR_LOGDIR/enb.band7.generic.oaisim.local_no_mme.conf uplink_frequency_offset 0
+
$OPENAIR_DIR/cmake_targets/oaisim_noS1_build_oai/build/oaisim_nos1
- -O $OPENAIR_LOGDIR/enb.band7.generic.oaisim.local_no_mme.conf -A AWGN -b1 -u3 -n100 -R 25 -x 1 -c26 -a
- -O $OPENAIR_LOGDIR/enb.band7.generic.oaisim.local_no_mme.conf -A AWGN -b1 -u3 -n100 -R 50 -x 1 -c26 -a
- -O $OPENAIR_LOGDIR/enb.band7.generic.oaisim.local_no_mme.conf -A AWGN -b1 -u3 -n100 -R 100 -x 1 -c26 -a
- -O $OPENAIR_LOGDIR/enb.band7.generic.oaisim.local_no_mme.conf -A AWGN -b1 -u3 -n100 -R 25 -x 2 -c26 -a
- -O $OPENAIR_LOGDIR/enb.band7.generic.oaisim.local_no_mme.conf -A AWGN -b1 -u3 -n100 -R 50 -x 2 -c26 -a
- -O $OPENAIR_LOGDIR/enb.band7.generic.oaisim.local_no_mme.conf -A AWGN -b1 -u3 -n100 -R 100 -x 2 -c26 -a
+ -O $OPENAIR_LOGDIR/enb.band38.generic.oaisim.local_no_mme.conf -A AWGN -b1 -u3 -n100 -R 25 -x 1 -c26 -a
+ -O $OPENAIR_LOGDIR/enb.band38.generic.oaisim.local_no_mme.conf -A AWGN -b1 -u3 -n100 -R 50 -x 1 -c26 -a
+ -O $OPENAIR_LOGDIR/enb.band38.generic.oaisim.local_no_mme.conf -A AWGN -b1 -u3 -n100 -R 100 -x 1 -c26 -a
+ -O $OPENAIR_LOGDIR/enb.band38.generic.oaisim.local_no_mme.conf -A AWGN -b1 -u3 -n100 -R 25 -x 2 -c26 -a
+ -O $OPENAIR_LOGDIR/enb.band38.generic.oaisim.local_no_mme.conf -A AWGN -b1 -u3 -n100 -R 50 -x 2 -c26 -a
+ -O $OPENAIR_LOGDIR/enb.band38.generic.oaisim.local_no_mme.conf -A AWGN -b1 -u3 -n100 -R 100 -x 2 -c26 -a
oaisim_noS1.tdd.5MHz.TM1 oaisim_noS1.tdd.10MHz.TM1 oaisim_noS1.tdd.20MHz.TM1 oaisim_noS1.tdd.5MHz.TM2 oaisim_noS1.tdd.10MHz.TM2 oaisim_noS1.tdd.20MHz.TM2
"DL and UL loss rate below 10"
segmentation fault|assertion|exiting|fatal
@@ -485,12 +467,12 @@
$OPENAIR_DIR/cmake_targets/tools/init_nas_nos1
$OPENAIR_DIR/cmake_targets/oaisim_noS1_build_oai/build/oaisim_nos1
- -O $OPENAIR_TARGETS/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.generic.oaisim.local_no_mme.conf -A AWGN -b1 -u1 -n100 -R 25 -x 1 -F
- -O $OPENAIR_TARGETS/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.generic.oaisim.local_no_mme.conf -A AWGN -b1 -u1 -n100 -R 50 -x 1 -F
- -O $OPENAIR_TARGETS/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.generic.oaisim.local_no_mme.conf -A AWGN -b1 -u1 -n100 -R 100 -x 1 -F
- -O $OPENAIR_TARGETS/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.generic.oaisim.local_no_mme.conf -A AWGN -b1 -u1 -n100 -R 25 -x 2 -F
- -O $OPENAIR_TARGETS/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.generic.oaisim.local_no_mme.conf -A AWGN -b1 -u1 -n100 -R 50 -x 2 -F
- -O $OPENAIR_TARGETS/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.generic.oaisim.local_no_mme.conf -A AWGN -b1 -u1 -n100 -R 100 -x 2 -F
+ -O $OPENAIR_TARGETS/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.generic.oaisim.local_no_mme.conf -A AWGN -b1 -u1 -n100 -R 25 -x 1 -F -s15
+ -O $OPENAIR_TARGETS/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.generic.oaisim.local_no_mme.conf -A AWGN -b1 -u1 -n100 -R 50 -x 1 -F -s15
+ -O $OPENAIR_TARGETS/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.generic.oaisim.local_no_mme.conf -A AWGN -b1 -u1 -n100 -R 100 -x 1 -F -s15
+ -O $OPENAIR_TARGETS/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.generic.oaisim.local_no_mme.conf -A AWGN -b1 -u1 -n100 -R 25 -x 2 -F -s15
+ -O $OPENAIR_TARGETS/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.generic.oaisim.local_no_mme.conf -A AWGN -b1 -u1 -n100 -R 50 -x 2 -F -s15
+ -O $OPENAIR_TARGETS/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.generic.oaisim.local_no_mme.conf -A AWGN -b1 -u1 -n100 -R 100 -x 2 -F -s15
oaisim_noS1.FDD.5MHz.TM1 oaisim_noS1.FDD.10MHz.TM1 oaisim_noS1.FDD.20MHz.TM1 oaisim_noS1.FDD.5MHz.TM2 oaisim_noS1.FDD.10MHz.TM2 oaisim_noS1.FDD.20MHz.TM2
"Received RRCConnectionReconfigurationComplete from UE 0"
segmentation fault|assertion|exiting|fatal
@@ -506,12 +488,12 @@
$OPENAIR_DIR/cmake_targets/tools/init_nas_nos1
$OPENAIR_DIR/cmake_targets/oaisim_noS1_build_oai/build/oaisim_nos1
- -O $OPENAIR_TARGETS/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.generic.oaisim.local_no_mme.conf -A AWGN -b1 -u1 -n100 -R 25 -x 1 -F -a
- -O $OPENAIR_TARGETS/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.generic.oaisim.local_no_mme.conf -A AWGN -b1 -u1 -n100 -R 50 -x 1 -F -a
- -O $OPENAIR_TARGETS/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.generic.oaisim.local_no_mme.conf -A AWGN -b1 -u1 -n100 -R 100 -x 1 -F -a
- -O $OPENAIR_TARGETS/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.generic.oaisim.local_no_mme.conf -A AWGN -b1 -u1 -n100 -R 25 -x 2 -F -a
- -O $OPENAIR_TARGETS/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.generic.oaisim.local_no_mme.conf -A AWGN -b1 -u1 -n100 -R 50 -x 2 -F -a
- -O $OPENAIR_TARGETS/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.generic.oaisim.local_no_mme.conf -A AWGN -b1 -u1 -n100 -R 100 -x 2 -F -a
+ -O $OPENAIR_TARGETS/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.generic.oaisim.local_no_mme.conf -A AWGN -b1 -u1 -n100 -R 25 -x 1 -F -a -s15
+ -O $OPENAIR_TARGETS/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.generic.oaisim.local_no_mme.conf -A AWGN -b1 -u1 -n100 -R 50 -x 1 -F -a -s15
+ -O $OPENAIR_TARGETS/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.generic.oaisim.local_no_mme.conf -A AWGN -b1 -u1 -n100 -R 100 -x 1 -F -a -s15
+ -O $OPENAIR_TARGETS/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.generic.oaisim.local_no_mme.conf -A AWGN -b1 -u1 -n100 -R 25 -x 2 -F -a -s15
+ -O $OPENAIR_TARGETS/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.generic.oaisim.local_no_mme.conf -A AWGN -b1 -u1 -n100 -R 50 -x 2 -F -a -s15
+ -O $OPENAIR_TARGETS/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.generic.oaisim.local_no_mme.conf -A AWGN -b1 -u1 -n100 -R 100 -x 2 -F -a -s15
oaisim_noS1.FDD.5MHz.TM1 oaisim_noS1.FDD.10MHz.TM1 oaisim_noS1.FDD.20MHz.TM1 oaisim_noS1.FDD.5MHz.TM2 oaisim_noS1.FDD.10MHz.TM2 oaisim_noS1.FDD.20MHz.TM2
"Received RRCConnectionReconfigurationComplete from UE 0"
segmentation fault|assertion|exiting|fatal
@@ -527,12 +509,12 @@
$OPENAIR_DIR/cmake_targets/tools/init_nas_nos1
$OPENAIR_DIR/cmake_targets/oaisim_noS1_build_oai/build/oaisim_nos1
- -O $OPENAIR_TARGETS/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.generic.oaisim.local_no_mme.conf -A AWGN -b1 -u3 -n100 -R 25 -x 1 -F
- -O $OPENAIR_TARGETS/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.generic.oaisim.local_no_mme.conf -A AWGN -b1 -u3 -n100 -R 50 -x 1 -F
- -O $OPENAIR_TARGETS/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.generic.oaisim.local_no_mme.conf -A AWGN -b1 -u3 -n100 -R 100 -x 1 -F
- -O $OPENAIR_TARGETS/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.generic.oaisim.local_no_mme.conf -A AWGN -b1 -u3 -n100 -R 25 -x 2 -F
- -O $OPENAIR_TARGETS/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.generic.oaisim.local_no_mme.conf -A AWGN -b1 -u3 -n100 -R 50 -x 2 -F
- -O $OPENAIR_TARGETS/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.generic.oaisim.local_no_mme.conf -A AWGN -b1 -u3 -n100 -R 100 -x 2 -F
+ -O $OPENAIR_TARGETS/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.generic.oaisim.local_no_mme.conf -A AWGN -b1 -u3 -n100 -R 25 -x 1 -F -s15
+ -O $OPENAIR_TARGETS/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.generic.oaisim.local_no_mme.conf -A AWGN -b1 -u3 -n100 -R 50 -x 1 -F -s15
+ -O $OPENAIR_TARGETS/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.generic.oaisim.local_no_mme.conf -A AWGN -b1 -u3 -n100 -R 100 -x 1 -F -s15
+ -O $OPENAIR_TARGETS/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.generic.oaisim.local_no_mme.conf -A AWGN -b1 -u3 -n100 -R 25 -x 2 -F -s15
+ -O $OPENAIR_TARGETS/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.generic.oaisim.local_no_mme.conf -A AWGN -b1 -u3 -n100 -R 50 -x 2 -F -s15
+ -O $OPENAIR_TARGETS/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.generic.oaisim.local_no_mme.conf -A AWGN -b1 -u3 -n100 -R 100 -x 2 -F -s15
oaisim_noS1.FDD.5MHz.TM1 oaisim_noS1.FDD.10MHz.TM1 oaisim_noS1.FDD.20MHz.TM1 oaisim_noS1.FDD.5MHz.TM2 oaisim_noS1.FDD.10MHz.TM2 oaisim_noS1.FDD.20MHz.TM2
"Received RRCConnectionReconfigurationComplete from UE 0" "Received RRCConnectionReconfigurationComplete from UE 1" "Received RRCConnectionReconfigurationComplete from UE 2"
segmentation fault|assertion|exiting|fatal
@@ -548,12 +530,12 @@
$OPENAIR_DIR/cmake_targets/tools/init_nas_nos1
$OPENAIR_DIR/cmake_targets/oaisim_noS1_build_oai/build/oaisim_nos1
- -O $OPENAIR_TARGETS/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.generic.oaisim.local_no_mme.conf -A AWGN -b1 -u3 -n100 -R 25 -x 1 -F -a
- -O $OPENAIR_TARGETS/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.generic.oaisim.local_no_mme.conf -A AWGN -b1 -u3 -n100 -R 50 -x 1 -F -a
- -O $OPENAIR_TARGETS/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.generic.oaisim.local_no_mme.conf -A AWGN -b1 -u3 -n100 -R 100 -x 1 -F -a
- -O $OPENAIR_TARGETS/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.generic.oaisim.local_no_mme.conf -A AWGN -b1 -u3 -n100 -R 25 -x 2 -F -a
- -O $OPENAIR_TARGETS/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.generic.oaisim.local_no_mme.conf -A AWGN -b1 -u3 -n100 -R 50 -x 2 -F -a
- -O $OPENAIR_TARGETS/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.generic.oaisim.local_no_mme.conf -A AWGN -b1 -u3 -n100 -R 100 -x 2 -F -a
+ -O $OPENAIR_TARGETS/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.generic.oaisim.local_no_mme.conf -A AWGN -b1 -u3 -n100 -R 25 -x 1 -F -a -s15
+ -O $OPENAIR_TARGETS/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.generic.oaisim.local_no_mme.conf -A AWGN -b1 -u3 -n100 -R 50 -x 1 -F -a -s15
+ -O $OPENAIR_TARGETS/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.generic.oaisim.local_no_mme.conf -A AWGN -b1 -u3 -n100 -R 100 -x 1 -F -a -s15
+ -O $OPENAIR_TARGETS/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.generic.oaisim.local_no_mme.conf -A AWGN -b1 -u3 -n100 -R 25 -x 2 -F -a -s15
+ -O $OPENAIR_TARGETS/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.generic.oaisim.local_no_mme.conf -A AWGN -b1 -u3 -n100 -R 50 -x 2 -F -a -s15
+ -O $OPENAIR_TARGETS/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.generic.oaisim.local_no_mme.conf -A AWGN -b1 -u3 -n100 -R 100 -x 2 -F -a -s15
oaisim_noS1.FDD.5MHz.TM1 oaisim_noS1.FDD.10MHz.TM1 oaisim_noS1.FDD.20MHz.TM1 oaisim_noS1.FDD.5MHz.TM2 oaisim_noS1.FDD.10MHz.TM2 oaisim_noS1.FDD.20MHz.TM2
"Received RRCConnectionReconfigurationComplete from UE 0" "Received RRCConnectionReconfigurationComplete from UE 1" "Received RRCConnectionReconfigurationComplete from UE 2"
segmentation fault|assertion|exiting|fatal
@@ -909,9 +891,9 @@
targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf frame_type \"FDD\"
targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf nb_antennas_rx 1
targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf nb_antennas_tx 1
- targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf ENB_INTERFACE_NAME_FOR_S1_MME \"eth1\"
+ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf ENB_INTERFACE_NAME_FOR_S1_MME \"eth5\"
targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf ENB_IPV4_ADDRESS_FOR_S1_MME \"192.168.12.82/24\"
- targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf ENB_INTERFACE_NAME_FOR_S1U \"eth1\"
+ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf ENB_INTERFACE_NAME_FOR_S1U \"eth5\"
targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf ENB_IPV4_ADDRESS_FOR_S1U \"192.168.12.82/24\"
targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf ENB_PORT_FOR_S1U 2152
$OPENAIR_DIR/cmake_targets/build_oai
@@ -984,9 +966,9 @@
targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf frame_type \"FDD\"
targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf nb_antennas_rx 1
targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf nb_antennas_tx 1
- targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf ENB_INTERFACE_NAME_FOR_S1_MME \"eth1\"
+ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf ENB_INTERFACE_NAME_FOR_S1_MME \"eth5\"
targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf ENB_IPV4_ADDRESS_FOR_S1_MME \"192.168.12.82/24\"
- targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf ENB_INTERFACE_NAME_FOR_S1U \"eth1\"
+ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf ENB_INTERFACE_NAME_FOR_S1U \"eth5\"
targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf ENB_IPV4_ADDRESS_FOR_S1U \"192.168.12.82/24\"
targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf ENB_PORT_FOR_S1U 2152
$OPENAIR_DIR/cmake_targets/build_oai
@@ -999,7 +981,7 @@
- True
+ False
/tmp
@@ -1013,7 +995,7 @@
- True
+ False
sudo -S -E $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --stop-ue
/tmp
@@ -1033,7 +1015,7 @@
throughput_test min=1.0Mbits/sec max=1.0Mbits/sec average=1.0Mbits/sec
- True
+ False
USRPb210.ALU_EPC.Bandrich.10MHz.FDD.Band_7.UL.1TX.1RX
10
@@ -1058,9 +1040,9 @@
targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf frame_type \"FDD\"
targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf nb_antennas_rx 1
targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf nb_antennas_tx 1
- targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf ENB_INTERFACE_NAME_FOR_S1_MME \"eth1\"
+ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf ENB_INTERFACE_NAME_FOR_S1_MME \"eth5\"
targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf ENB_IPV4_ADDRESS_FOR_S1_MME \"192.168.12.82/24\"
- targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf ENB_INTERFACE_NAME_FOR_S1U \"eth1\"
+ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf ENB_INTERFACE_NAME_FOR_S1U \"eth5\"
targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf ENB_IPV4_ADDRESS_FOR_S1U \"192.168.12.82/24\"
targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf ENB_PORT_FOR_S1U 2152
$OPENAIR_DIR/cmake_targets/build_oai
@@ -1073,7 +1055,7 @@
- True
+ False
/tmp
@@ -1087,7 +1069,7 @@
- True
+ False
sudo -S -E $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --stop-ue
/tmp
@@ -1107,7 +1089,7 @@
throughput_test min=1.0Mbits/sec max=1.0Mbits/sec average=1.0Mbits/sec
- True
+ False
USRPb210.ALU_EPC.Bandrich.20MHz.FDD.Band_7.UL.1TX.1RX
10
@@ -1132,9 +1114,9 @@
targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf frame_type \"FDD\"
targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf nb_antennas_rx 1
targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf nb_antennas_tx 1
- targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf ENB_INTERFACE_NAME_FOR_S1_MME \"eth1\"
+ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf ENB_INTERFACE_NAME_FOR_S1_MME \"eth5\"
targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf ENB_IPV4_ADDRESS_FOR_S1_MME \"192.168.12.82/24\"
- targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf ENB_INTERFACE_NAME_FOR_S1U \"eth1\"
+ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf ENB_INTERFACE_NAME_FOR_S1U \"eth5\"
targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf ENB_IPV4_ADDRESS_FOR_S1U \"192.168.12.82/24\"
targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf ENB_PORT_FOR_S1U 2152
$OPENAIR_DIR/cmake_targets/build_oai
@@ -1147,7 +1129,7 @@
- True
+ False
/tmp
@@ -1159,7 +1141,7 @@
$OPENAIR_DIR/cmake_targets/autotests/tools/iperf_script 1 ppp0 -s -i 1 -u -f m -B 192.172.0.2
- True
+ False
sudo -S -E $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --stop-ue
throughput_test min=4.0Mbits/sec max=5.0Mbits/sec average=4.0Mbits/sec
@@ -1180,7 +1162,7 @@
$OPENAIRCN_DIR/TEST/autotests/tools/iperf_script 60 lo -u -c 192.172.0.2 -b 10Mbits/s -B 192.172.0.1
- True
+ False
USRPb210.ALU_EPC.Bandrich.5MHz.FDD.Band_7.DL.1TX.1RX
10
@@ -1205,9 +1187,9 @@
targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf frame_type \"FDD\"
targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf nb_antennas_rx 1
targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf nb_antennas_tx 1
- targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf ENB_INTERFACE_NAME_FOR_S1_MME \"eth1\"
+ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf ENB_INTERFACE_NAME_FOR_S1_MME \"eth5\"
targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf ENB_IPV4_ADDRESS_FOR_S1_MME \"192.168.12.82/24\"
- targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf ENB_INTERFACE_NAME_FOR_S1U \"eth1\"
+ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf ENB_INTERFACE_NAME_FOR_S1U \"eth5\"
targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf ENB_IPV4_ADDRESS_FOR_S1U \"192.168.12.82/24\"
targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf ENB_PORT_FOR_S1U 2152
$OPENAIR_DIR/cmake_targets/build_oai
@@ -1220,7 +1202,7 @@
- True
+ False
/tmp
@@ -1233,7 +1215,7 @@
throughput_test min=8.0Mbits/sec max=9.0Mbits/sec average=8.5Mbits/sec
- True
+ False
sudo -S -E $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --stop-ue
@@ -1253,7 +1235,7 @@
$OPENAIRCN_DIR/TEST/autotests/tools/iperf_script 60 lo -u -c 192.172.0.2 -b 10Mbits/s -B 192.172.0.1
- True
+ False
USRPb210.ALU_EPC.Bandrich.10MHz.FDD.Band_7.DL.1TX.1RX
10
@@ -1278,9 +1260,9 @@
targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf frame_type \"FDD\"
targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf nb_antennas_rx 1
targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf nb_antennas_tx 1
- targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf ENB_INTERFACE_NAME_FOR_S1_MME \"eth1\"
+ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf ENB_INTERFACE_NAME_FOR_S1_MME \"eth5\"
targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf ENB_IPV4_ADDRESS_FOR_S1_MME \"192.168.12.82/24\"
- targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf ENB_INTERFACE_NAME_FOR_S1U \"eth1\"
+ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf ENB_INTERFACE_NAME_FOR_S1U \"eth5\"
targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf ENB_IPV4_ADDRESS_FOR_S1U \"192.168.12.82/24\"
targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf ENB_PORT_FOR_S1U 2152
$OPENAIR_DIR/cmake_targets/build_oai
@@ -1293,7 +1275,7 @@
- True
+ False
/tmp
@@ -1307,7 +1289,7 @@
throughput_test min=15.0Mbits/sec max=15.0Mbits/sec average=15.0Mbits/sec
- True
+ False
sudo -S -E $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --stop-ue
@@ -1327,7 +1309,7 @@
$OPENAIRCN_DIR/TEST/autotests/tools/iperf_script 60 lo -u -c 192.172.0.2 -b 10Mbits/s -B 192.172.0.1
- True
+ False
USRPb210.ALU_EPC.Bandrich.20MHz.FDD.Band_7.DL.1TX.1RX
10
@@ -1353,9 +1335,9 @@
targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf frame_type \"FDD\"
targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf nb_antennas_rx 2
targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf nb_antennas_tx 2
- targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf ENB_INTERFACE_NAME_FOR_S1_MME \"eth1\"
+ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf ENB_INTERFACE_NAME_FOR_S1_MME \"eth5\"
targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf ENB_IPV4_ADDRESS_FOR_S1_MME \"192.168.12.82/24\"
- targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf ENB_INTERFACE_NAME_FOR_S1U \"eth1\"
+ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf ENB_INTERFACE_NAME_FOR_S1U \"eth5\"
targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf ENB_IPV4_ADDRESS_FOR_S1U \"192.168.12.82/24\"
targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf ENB_PORT_FOR_S1U 2152
$OPENAIR_DIR/cmake_targets/build_oai
@@ -1368,7 +1350,7 @@
- True
+ False
/tmp
@@ -1382,7 +1364,7 @@
- True
+ False
sudo -S -E $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --stop-ue
/tmp
@@ -1402,7 +1384,7 @@
throughput_test min=1.0Mbits/sec max=1.0Mbits/sec average=1.0Mbits/sec
- True
+ False
USRPb210.ALU_EPC.Bandrich.5MHz.FDD.Band_7.UL.2TX.2RX
10
@@ -1428,9 +1410,9 @@
targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf frame_type \"FDD\"
targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf nb_antennas_rx 2
targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf nb_antennas_tx 2
- targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf ENB_INTERFACE_NAME_FOR_S1_MME \"eth1\"
+ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf ENB_INTERFACE_NAME_FOR_S1_MME \"eth5\"
targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf ENB_IPV4_ADDRESS_FOR_S1_MME \"192.168.12.82/24\"
- targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf ENB_INTERFACE_NAME_FOR_S1U \"eth1\"
+ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf ENB_INTERFACE_NAME_FOR_S1U \"eth5\"
targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf ENB_IPV4_ADDRESS_FOR_S1U \"192.168.12.82/24\"
targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf ENB_PORT_FOR_S1U 2152
$OPENAIR_DIR/cmake_targets/build_oai
@@ -1443,7 +1425,7 @@
- True
+ False
/tmp
>
@@ -1456,7 +1438,7 @@
- True
+ False
sudo -S -E $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --stop-ue
/tmp
@@ -1476,7 +1458,7 @@
throughput_test min=2.0Mbits/sec max=2.0Mbits/sec average=2.0Mbits/sec
- True
+ False
USRPb210.ALU_EPC.Bandrich.10MHz.FDD.Band_7.UL.2TX.2RX
10
@@ -1501,9 +1483,9 @@
targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf frame_type \"FDD\"
targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf nb_antennas_rx 2
targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf nb_antennas_tx 2
- targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf ENB_INTERFACE_NAME_FOR_S1_MME \"eth1\"
+ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf ENB_INTERFACE_NAME_FOR_S1_MME \"eth5\"
targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf ENB_IPV4_ADDRESS_FOR_S1_MME \"192.168.12.82/24\"
- targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf ENB_INTERFACE_NAME_FOR_S1U \"eth1\"
+ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf ENB_INTERFACE_NAME_FOR_S1U \"eth5\"
targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf ENB_IPV4_ADDRESS_FOR_S1U \"192.168.12.82/24\"
targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf ENB_PORT_FOR_S1U 2152
$OPENAIR_DIR/cmake_targets/build_oai
@@ -1516,7 +1498,7 @@
- True
+ False
/tmp
@@ -1530,7 +1512,7 @@
- True
+ False
sudo -S -E $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --stop-ue
/tmp
@@ -1550,7 +1532,7 @@
throughput_test min=4.0Mbits/sec max=4.0Mbits/sec average=4.0Mbits/sec
- True
+ False
USRPb210.ALU_EPC.Bandrich.20MHz.FDD.Band_7.UL.2TX.2RX
10
@@ -1575,9 +1557,9 @@
targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf frame_type \"FDD\"
targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf nb_antennas_rx 2
targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf nb_antennas_tx 2
- targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf ENB_INTERFACE_NAME_FOR_S1_MME \"eth1\"
+ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf ENB_INTERFACE_NAME_FOR_S1_MME \"eth5\"
targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf ENB_IPV4_ADDRESS_FOR_S1_MME \"192.168.12.82/24\"
- targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf ENB_INTERFACE_NAME_FOR_S1U \"eth1\"
+ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf ENB_INTERFACE_NAME_FOR_S1U \"eth5\"
targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf ENB_IPV4_ADDRESS_FOR_S1U \"192.168.12.82/24\"
targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf ENB_PORT_FOR_S1U 2152
$OPENAIR_DIR/cmake_targets/build_oai
@@ -1590,7 +1572,7 @@
- True
+ False
/tmp
@@ -1604,7 +1586,7 @@
throughput_test min=4.0Mbits/sec max=5.0Mbits/sec average=4.0Mbits/sec
- True
+ False
sudo -S -E $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --stop-ue
@@ -1624,7 +1606,7 @@
$OPENAIRCN_DIR/TEST/autotests/tools/iperf_script 60 lo -u -c 192.172.0.2 -b 10Mbits/s -B 192.172.0.1
- True
+ False
USRPb210.ALU_EPC.Bandrich.5MHz.FDD.Band_7.DL.2TX.2RX
10
@@ -1649,9 +1631,9 @@
targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf frame_type \"FDD\"
targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf nb_antennas_rx 2
targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf nb_antennas_tx 2
- targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf ENB_INTERFACE_NAME_FOR_S1_MME \"eth1\"
+ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf ENB_INTERFACE_NAME_FOR_S1_MME \"eth5\"
targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf ENB_IPV4_ADDRESS_FOR_S1_MME \"192.168.12.82/24\"
- targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf ENB_INTERFACE_NAME_FOR_S1U \"eth1\"
+ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf ENB_INTERFACE_NAME_FOR_S1U \"eth5\"
targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf ENB_IPV4_ADDRESS_FOR_S1U \"192.168.12.82/24\"
targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf ENB_PORT_FOR_S1U 2152
$OPENAIR_DIR/cmake_targets/build_oai
@@ -1664,7 +1646,7 @@
- True
+ False
/tmp
@@ -1678,7 +1660,7 @@
throughput_test min=8.0Mbits/sec max=9.0Mbits/sec average=8.5Mbits/sec
- True
+ False
sudo -S -E $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --stop-ue
@@ -1698,7 +1680,7 @@
$OPENAIRCN_DIR/TEST/autotests/tools/iperf_script 60 lo -u -c 192.172.0.2 -b 10Mbits/s -B 192.172.0.1
- True
+ False
USRPb210.ALU_EPC.Bandrich.10MHz.FDD.Band_7.DL.2TX.2RX
10
@@ -1723,9 +1705,9 @@
targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf frame_type \"FDD\"
targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf nb_antennas_rx 2
targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf nb_antennas_tx 2
- targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf ENB_INTERFACE_NAME_FOR_S1_MME \"eth1\"
+ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf ENB_INTERFACE_NAME_FOR_S1_MME \"eth5\"
targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf ENB_IPV4_ADDRESS_FOR_S1_MME \"192.168.12.82/24\"
- targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf ENB_INTERFACE_NAME_FOR_S1U \"eth1\"
+ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf ENB_INTERFACE_NAME_FOR_S1U \"eth5\"
targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf ENB_IPV4_ADDRESS_FOR_S1U \"192.168.12.82/24\"
targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf ENB_PORT_FOR_S1U 2152
$OPENAIR_DIR/cmake_targets/build_oai
@@ -1738,7 +1720,7 @@
- True
+ False
/tmp
@@ -1752,7 +1734,7 @@
throughput_test min=15.0Mbits/sec max=15.0Mbits/sec average=15.0Mbits/sec
- True
+ False
sudo -S -E $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --stop-ue
@@ -1772,7 +1754,7 @@
$OPENAIRCN_DIR/TEST/autotests/tools/iperf_script 60 lo -u -c 192.172.0.2 -b 10Mbits/s -B 192.172.0.1
- True
+ False
USRPb210.ALU_EPC.Bandrich.20MHz.FDD.Band_7.DL.2TX.2RX
10
@@ -1799,14 +1781,14 @@
targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.local.conf frame_type \"FDD\"
targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.local.conf nb_antennas_rx 1
targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.local.conf nb_antennas_tx 1
- targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.local.conf ENB_INTERFACE_NAME_FOR_S1_MME \"eth0:3\"
+ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.local.conf ENB_INTERFACE_NAME_FOR_S1_MME \"eth5:3\"
targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.local.conf ENB_IPV4_ADDRESS_FOR_S1_MME \"192.170.0.2/24\"
- targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.local.conf ENB_INTERFACE_NAME_FOR_S1U \"eth0:4\"
+ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.local.conf ENB_INTERFACE_NAME_FOR_S1U \"eth5:4\"
targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.local.conf ENB_IPV4_ADDRESS_FOR_S1U \"192.170.1.2/24\"
targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.local.conf ENB_PORT_FOR_S1U 2152
$OPENAIR_DIR/cmake_targets/build_oai
--eNB -w USRP -c
- sleep 15; sudo -E bash -c 'echo 3 > /proc/sys/vm/drop_caches' ; sudo -E ifconfig eth0:3 192.170.0.2 up ; sudo -E ifconfig eth0:4 192.170.1.2 up; ifconfig
+ sleep 15; sudo -E bash -c 'echo 3 > /proc/sys/vm/drop_caches' ; sudo -E ifconfig eth5:3 192.170.0.2 up ; sudo -E ifconfig eth5:4 192.170.1.2 up; ifconfig ; cp $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.local.conf $OPENAIR_TESTDIR/enb.conf
$OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem
-O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.local.conf -W
@@ -1835,23 +1817,23 @@
BUILD/EPC/epc.conf.in MCC \"208\"
BUILD/EPC/epc.conf.in MNC \"92\"
BUILD/EPC/epc.conf.in TAC \"1\"
- BUILD/EPC/epc.conf.in MME_INTERFACE_NAME_FOR_S1_MME \"eth0:1\"
+ BUILD/EPC/epc.conf.in MME_INTERFACE_NAME_FOR_S1_MME \"eth5:1\"
BUILD/EPC/epc.conf.in MME_IPV4_ADDRESS_FOR_S1_MME \"192.170.0.1/24\"
- BUILD/EPC/epc.conf.in SGW_INTERFACE_NAME_FOR_S1U_S12_S4_UP \"eth0:2\";
+ BUILD/EPC/epc.conf.in SGW_INTERFACE_NAME_FOR_S1U_S12_S4_UP \"eth5:2\";
BUILD/EPC/epc.conf.in SGW_IPV4_ADDRESS_FOR_S1U_S12_S4_UP \"192.170.1.1/24\";
- BUILD/EPC/epc.conf.in PGW_INTERFACE_NAME_FOR_SGI \"eth1\"
+ BUILD/EPC/epc.conf.in PGW_INTERFACE_NAME_FOR_SGI \"eth5\"
BUILD/EPC/epc.conf.in PGW_IPV4_ADDRESS_FOR_SGI \"192.168.12.82/24\"
BUILD/EPC/epc.conf.in IPV4_LIST \"192.172.0.0/24\",\"192.172.1.0/24\"
$OPENAIRCN_DIR/SCRIPTS/build_epc
-c -l
$OPENAIRCN_DIR/SCRIPTS/build_hss
- -c -l
+ -c -l --debug --random false
- sudo -E bash -c 'echo 3 > /proc/sys/vm/drop_caches' ; sudo -E ifconfig eth1 add 192.172.0.1
+ sudo -E bash -c 'echo 3 > /proc/sys/vm/drop_caches' ; sudo -E ifconfig eth5 add 192.172.0.1
$OPENAIRCN_DIR/SCRIPTS/run_epc
-i -r
- sleep 10; $OPENAIRCN_DIR/SCRIPTS/run_hss
+ sleep 10; cp $OPENAIRCN_DIR/BUILD/EPC/epc.conf.in $OPENAIRCN_TESTDIR/epc.conf.in; $OPENAIRCN_DIR/SCRIPTS/run_hss --export-db $OPENAIRCN_TESTDIR/hss_export.db
$OPENAIRCN_DIR/TEST/autotests/tools/iperf_script 5 lo -s -i 1 -u -f m -B 192.172.0.1
@@ -1883,14 +1865,14 @@
targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.local.conf frame_type \"FDD\"
targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.local.conf nb_antennas_rx 1
targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.local.conf nb_antennas_tx 1
- targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.local.conf ENB_INTERFACE_NAME_FOR_S1_MME \"eth0:3\"
+ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.local.conf ENB_INTERFACE_NAME_FOR_S1_MME \"eth5:3\"
targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.local.conf ENB_IPV4_ADDRESS_FOR_S1_MME \"192.170.0.2/24\"
- targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.local.conf ENB_INTERFACE_NAME_FOR_S1U \"eth0:4\"
+ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.local.conf ENB_INTERFACE_NAME_FOR_S1U \"eth5:4\"
targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.local.conf ENB_IPV4_ADDRESS_FOR_S1U \"192.170.1.2/24\"
targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.local.conf ENB_PORT_FOR_S1U 2152
$OPENAIR_DIR/cmake_targets/build_oai
--eNB -w USRP -c
- sleep 15; sudo -E bash -c 'echo 3 > /proc/sys/vm/drop_caches' ;sudo -E ifconfig eth0:3 192.170.0.2 up ; sudo -E ifconfig eth0:4 192.170.1.2 up; ifconfig
+ sleep 15; sudo -E bash -c 'echo 3 > /proc/sys/vm/drop_caches' ;sudo -E ifconfig eth5:3 192.170.0.2 up ; sudo -E ifconfig eth5:4 192.170.1.2 up; ifconfig ; cp $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.local.conf $OPENAIR_TESTDIR/enb.conf
$OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem
-O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.local.conf -W
@@ -1919,23 +1901,23 @@
BUILD/EPC/epc.conf.in MCC \"208\"
BUILD/EPC/epc.conf.in MNC \"92\"
BUILD/EPC/epc.conf.in TAC \"1\"
- BUILD/EPC/epc.conf.in MME_INTERFACE_NAME_FOR_S1_MME \"eth0:1\"
+ BUILD/EPC/epc.conf.in MME_INTERFACE_NAME_FOR_S1_MME \"eth5:1\"
BUILD/EPC/epc.conf.in MME_IPV4_ADDRESS_FOR_S1_MME \"192.170.0.1/24\"
- BUILD/EPC/epc.conf.in SGW_INTERFACE_NAME_FOR_S1U_S12_S4_UP \"eth0:2\";
+ BUILD/EPC/epc.conf.in SGW_INTERFACE_NAME_FOR_S1U_S12_S4_UP \"eth5:2\";
BUILD/EPC/epc.conf.in SGW_IPV4_ADDRESS_FOR_S1U_S12_S4_UP \"192.170.1.1/24\";
- BUILD/EPC/epc.conf.in PGW_INTERFACE_NAME_FOR_SGI \"eth1\"
+ BUILD/EPC/epc.conf.in PGW_INTERFACE_NAME_FOR_SGI \"eth5\"
BUILD/EPC/epc.conf.in PGW_IPV4_ADDRESS_FOR_SGI \"192.168.12.82/24\"
BUILD/EPC/epc.conf.in IPV4_LIST \"192.172.0.0/24\",\"192.172.1.0/24\"
$OPENAIRCN_DIR/SCRIPTS/build_epc
-c -l
$OPENAIRCN_DIR/SCRIPTS/build_hss
- -c -l
+ -c -l --debug --random false
- sudo -E bash -c 'echo 3 > /proc/sys/vm/drop_caches' ;sudo -E ifconfig eth1 add 192.172.0.1
+ sudo -E bash -c 'echo 3 > /proc/sys/vm/drop_caches' ;sudo -E ifconfig eth5 add 192.172.0.1 ; cp $OPENAIRCN_DIR/BUILD/EPC/epc.conf.in $OPENAIRCN_TESTDIR/epc.conf.in
$OPENAIRCN_DIR/SCRIPTS/run_epc
-i -r
- sleep 10; $OPENAIRCN_DIR/SCRIPTS/run_hss
+ sleep 10; $OPENAIRCN_DIR/SCRIPTS/run_hss --export-db $OPENAIRCN_TESTDIR/hss_export.db
$OPENAIRCN_DIR/TEST/autotests/tools/iperf_script 5 lo -s -i 1 -u -f m -B 192.172.0.1
@@ -1967,14 +1949,14 @@
targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.local.conf frame_type \"FDD\"
targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.local.conf nb_antennas_rx 1
targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.local.conf nb_antennas_tx 1
- targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.local.conf ENB_INTERFACE_NAME_FOR_S1_MME \"eth0:3\"
+ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.local.conf ENB_INTERFACE_NAME_FOR_S1_MME \"eth5:3\"
targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.local.conf ENB_IPV4_ADDRESS_FOR_S1_MME \"192.170.0.2/24\"
- targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.local.conf ENB_INTERFACE_NAME_FOR_S1U \"eth0:4\"
+ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.local.conf ENB_INTERFACE_NAME_FOR_S1U \"eth5:4\"
targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.local.conf ENB_IPV4_ADDRESS_FOR_S1U \"192.170.1.2/24\"
targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.local.conf ENB_PORT_FOR_S1U 2152
$OPENAIR_DIR/cmake_targets/build_oai
--eNB -w USRP -c
- sleep 15; sudo -E bash -c 'echo 3 > /proc/sys/vm/drop_caches' ;sudo -E ifconfig eth0:3 192.170.0.2 up ; sudo -E ifconfig eth0:4 192.170.1.2 up; ifconfig
+ sleep 15; sudo -E bash -c 'echo 3 > /proc/sys/vm/drop_caches' ;sudo -E ifconfig eth5:3 192.170.0.2 up ; sudo -E ifconfig eth5:4 192.170.1.2 up; ifconfig ; cp $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.local.conf $OPENAIR_TESTDIR/enb.conf
$OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem
-O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.local.conf -W
@@ -2003,23 +1985,23 @@
BUILD/EPC/epc.conf.in MCC \"208\"
BUILD/EPC/epc.conf.in MNC \"92\"
BUILD/EPC/epc.conf.in TAC \"1\"
- BUILD/EPC/epc.conf.in MME_INTERFACE_NAME_FOR_S1_MME \"eth0:1\"
+ BUILD/EPC/epc.conf.in MME_INTERFACE_NAME_FOR_S1_MME \"eth5:1\"
BUILD/EPC/epc.conf.in MME_IPV4_ADDRESS_FOR_S1_MME \"192.170.0.1/24\"
- BUILD/EPC/epc.conf.in SGW_INTERFACE_NAME_FOR_S1U_S12_S4_UP \"eth0:2\";
+ BUILD/EPC/epc.conf.in SGW_INTERFACE_NAME_FOR_S1U_S12_S4_UP \"eth5:2\";
BUILD/EPC/epc.conf.in SGW_IPV4_ADDRESS_FOR_S1U_S12_S4_UP \"192.170.1.1/24\";
- BUILD/EPC/epc.conf.in PGW_INTERFACE_NAME_FOR_SGI \"eth1\"
+ BUILD/EPC/epc.conf.in PGW_INTERFACE_NAME_FOR_SGI \"eth5\"
BUILD/EPC/epc.conf.in PGW_IPV4_ADDRESS_FOR_SGI \"192.168.12.82/24\"
BUILD/EPC/epc.conf.in IPV4_LIST \"192.172.0.0/24\",\"192.172.1.0/24\"
$OPENAIRCN_DIR/SCRIPTS/build_epc
-c -l
$OPENAIRCN_DIR/SCRIPTS/build_hss
- -c -l
+ -c -l --debug --random false
- sudo -E bash -c 'echo 3 > /proc/sys/vm/drop_caches' ; sudo -E ifconfig eth1 add 192.172.0.1
+ sudo -E bash -c 'echo 3 > /proc/sys/vm/drop_caches' ; sudo -E ifconfig eth5 add 192.172.0.1 ; cp $OPENAIRCN_DIR/BUILD/EPC/epc.conf.in $OPENAIRCN_TESTDIR/epc.conf.in
$OPENAIRCN_DIR/SCRIPTS/run_epc
-i -r
- sleep 10; $OPENAIRCN_DIR/SCRIPTS/run_hss
+ sleep 10; $OPENAIRCN_DIR/SCRIPTS/run_hss --export-db $OPENAIRCN_TESTDIR/hss_export.db
$OPENAIRCN_DIR/TEST/autotests/tools/iperf_script 5 lo -s -i 1 -u -f m -B 192.172.0.1
@@ -2051,14 +2033,14 @@
targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.local.conf frame_type \"FDD\"
targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.local.conf nb_antennas_rx 1
targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.local.conf nb_antennas_tx 1
- targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.local.conf ENB_INTERFACE_NAME_FOR_S1_MME \"eth0:3\"
+ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.local.conf ENB_INTERFACE_NAME_FOR_S1_MME \"eth5:3\"
targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.local.conf ENB_IPV4_ADDRESS_FOR_S1_MME \"192.170.0.2/24\"
- targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.local.conf ENB_INTERFACE_NAME_FOR_S1U \"eth0:4\"
+ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.local.conf ENB_INTERFACE_NAME_FOR_S1U \"eth5:4\"
targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.local.conf ENB_IPV4_ADDRESS_FOR_S1U \"192.170.1.2/24\"
targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.local.conf ENB_PORT_FOR_S1U 2152
$OPENAIR_DIR/cmake_targets/build_oai
--eNB -w USRP -c
- sleep 15; sudo -E bash -c 'echo 3 > /proc/sys/vm/drop_caches' ;sudo -E ifconfig eth0:3 192.170.0.2 up ; sudo -E ifconfig eth0:4 192.170.1.2 up; ifconfig
+ sleep 15; sudo -E bash -c 'echo 3 > /proc/sys/vm/drop_caches' ;sudo -E ifconfig eth5:3 192.170.0.2 up ; sudo -E ifconfig eth5:4 192.170.1.2 up; ifconfig ; cp $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.local.conf $OPENAIR_TESTDIR/enb.conf
$OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem
-O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.local.conf -W
@@ -2087,23 +2069,23 @@
BUILD/EPC/epc.conf.in MCC \"208\"
BUILD/EPC/epc.conf.in MNC \"92\"
BUILD/EPC/epc.conf.in TAC \"1\"
- BUILD/EPC/epc.conf.in MME_INTERFACE_NAME_FOR_S1_MME \"eth0:1\"
+ BUILD/EPC/epc.conf.in MME_INTERFACE_NAME_FOR_S1_MME \"eth5:1\"
BUILD/EPC/epc.conf.in MME_IPV4_ADDRESS_FOR_S1_MME \"192.170.0.1/24\"
- BUILD/EPC/epc.conf.in SGW_INTERFACE_NAME_FOR_S1U_S12_S4_UP \"eth0:2\";
+ BUILD/EPC/epc.conf.in SGW_INTERFACE_NAME_FOR_S1U_S12_S4_UP \"eth5:2\";
BUILD/EPC/epc.conf.in SGW_IPV4_ADDRESS_FOR_S1U_S12_S4_UP \"192.170.1.1/24\";
- BUILD/EPC/epc.conf.in PGW_INTERFACE_NAME_FOR_SGI \"eth1\"
+ BUILD/EPC/epc.conf.in PGW_INTERFACE_NAME_FOR_SGI \"eth5\"
BUILD/EPC/epc.conf.in PGW_IPV4_ADDRESS_FOR_SGI \"192.168.12.82/24\"
BUILD/EPC/epc.conf.in IPV4_LIST \"192.172.0.0/24\",\"192.172.1.0/24\"
$OPENAIRCN_DIR/SCRIPTS/build_epc
-c -l
$OPENAIRCN_DIR/SCRIPTS/build_hss
- -c -l
+ -c -l --debug --random false
- sudo -E bash -c 'echo 3 > /proc/sys/vm/drop_caches' ;sudo -E ifconfig eth1 add 192.172.0.1
+ sudo -E bash -c 'echo 3 > /proc/sys/vm/drop_caches' ;sudo -E ifconfig eth5 add 192.172.0.1 ; cp $OPENAIRCN_DIR/BUILD/EPC/epc.conf.in $OPENAIRCN_TESTDIR/epc.conf.in
$OPENAIRCN_DIR/SCRIPTS/run_epc
-i -r
- sleep 10; $OPENAIRCN_DIR/SCRIPTS/run_hss
+ sleep 10; $OPENAIRCN_DIR/SCRIPTS/run_hss --export-db $OPENAIRCN_TESTDIR/hss_export.db
$OPENAIRCN_DIR/TEST/autotests/tools/iperf_script 60 lo -u -c 192.172.0.2 -b 10Mbits/s -B 192.172.0.1
@@ -2135,14 +2117,14 @@
targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.local.conf frame_type \"FDD\"
targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.local.conf nb_antennas_rx 1
targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.local.conf nb_antennas_tx 1
- targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.local.conf ENB_INTERFACE_NAME_FOR_S1_MME \"eth0:3\"
+ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.local.conf ENB_INTERFACE_NAME_FOR_S1_MME \"eth5:3\"
targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.local.conf ENB_IPV4_ADDRESS_FOR_S1_MME \"192.170.0.2/24\"
- targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.local.conf ENB_INTERFACE_NAME_FOR_S1U \"eth0:4\"
+ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.local.conf ENB_INTERFACE_NAME_FOR_S1U \"eth5:4\"
targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.local.conf ENB_IPV4_ADDRESS_FOR_S1U \"192.170.1.2/24\"
targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.local.conf ENB_PORT_FOR_S1U 2152
$OPENAIR_DIR/cmake_targets/build_oai
--eNB -w USRP -c
- sleep 15; sudo -E bash -c 'echo 3 > /proc/sys/vm/drop_caches' ;sudo -E ifconfig eth0:3 192.170.0.2 up ; sudo -E ifconfig eth0:4 192.170.1.2 up; ifconfig
+ sleep 15; sudo -E bash -c 'echo 3 > /proc/sys/vm/drop_caches' ;sudo -E ifconfig eth5:3 192.170.0.2 up ; sudo -E ifconfig eth5:4 192.170.1.2 up; ifconfig ; cp $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.local.conf $OPENAIR_TESTDIR/enb.conf
$OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem
-O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.local.conf -W
@@ -2171,23 +2153,23 @@
BUILD/EPC/epc.conf.in MCC \"208\"
BUILD/EPC/epc.conf.in MNC \"92\"
BUILD/EPC/epc.conf.in TAC \"1\"
- BUILD/EPC/epc.conf.in MME_INTERFACE_NAME_FOR_S1_MME \"eth0:1\"
+ BUILD/EPC/epc.conf.in MME_INTERFACE_NAME_FOR_S1_MME \"eth5:1\"
BUILD/EPC/epc.conf.in MME_IPV4_ADDRESS_FOR_S1_MME \"192.170.0.1/24\"
- BUILD/EPC/epc.conf.in SGW_INTERFACE_NAME_FOR_S1U_S12_S4_UP \"eth0:2\";
+ BUILD/EPC/epc.conf.in SGW_INTERFACE_NAME_FOR_S1U_S12_S4_UP \"eth5:2\";
BUILD/EPC/epc.conf.in SGW_IPV4_ADDRESS_FOR_S1U_S12_S4_UP \"192.170.1.1/24\";
- BUILD/EPC/epc.conf.in PGW_INTERFACE_NAME_FOR_SGI \"eth1\"
+ BUILD/EPC/epc.conf.in PGW_INTERFACE_NAME_FOR_SGI \"eth5\"
BUILD/EPC/epc.conf.in PGW_IPV4_ADDRESS_FOR_SGI \"192.168.12.82/24\"
BUILD/EPC/epc.conf.in IPV4_LIST \"192.172.0.0/24\",\"192.172.1.0/24\"
$OPENAIRCN_DIR/SCRIPTS/build_epc
-c -l
$OPENAIRCN_DIR/SCRIPTS/build_hss
- -c -l
+ -c -l --debug --random false
- sudo -E bash -c 'echo 3 > /proc/sys/vm/drop_caches' ;sudo -E ifconfig eth1 add 192.172.0.1
+ sudo -E bash -c 'echo 3 > /proc/sys/vm/drop_caches' ;sudo -E ifconfig eth5 add 192.172.0.1 ; cp $OPENAIRCN_DIR/BUILD/EPC/epc.conf.in $OPENAIRCN_TESTDIR/epc.conf.in
$OPENAIRCN_DIR/SCRIPTS/run_epc
-i -r
- sleep 10; $OPENAIRCN_DIR/SCRIPTS/run_hss
+ sleep 10; $OPENAIRCN_DIR/SCRIPTS/run_hss --export-db $OPENAIRCN_TESTDIR/hss_export.db
$OPENAIRCN_DIR/TEST/autotests/tools/iperf_script 60 lo -u -c 192.172.0.2 -b 10Mbits/s -B 192.172.0.1
@@ -2219,14 +2201,14 @@
targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.local.conf frame_type \"FDD\"
targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.local.conf nb_antennas_rx 1
targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.local.conf nb_antennas_tx 1
- targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.local.conf ENB_INTERFACE_NAME_FOR_S1_MME \"eth0:3\"
+ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.local.conf ENB_INTERFACE_NAME_FOR_S1_MME \"eth5:3\"
targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.local.conf ENB_IPV4_ADDRESS_FOR_S1_MME \"192.170.0.2/24\"
- targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.local.conf ENB_INTERFACE_NAME_FOR_S1U \"eth0:4\"
+ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.local.conf ENB_INTERFACE_NAME_FOR_S1U \"eth5:4\"
targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.local.conf ENB_IPV4_ADDRESS_FOR_S1U \"192.170.1.2/24\"
targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.local.conf ENB_PORT_FOR_S1U 2152
$OPENAIR_DIR/cmake_targets/build_oai
--eNB -w USRP -c
- sleep 15; sudo -E bash -c 'echo 3 > /proc/sys/vm/drop_caches' ;sudo -E ifconfig eth0:3 192.170.0.2 up ; sudo -E ifconfig eth0:4 192.170.1.2 up; ifconfig
+ sleep 15; sudo -E bash -c 'echo 3 > /proc/sys/vm/drop_caches' ;sudo -E ifconfig eth5:3 192.170.0.2 up ; sudo -E ifconfig eth5:4 192.170.1.2 up; ifconfig ; cp $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.local.conf $OPENAIR_TESTDIR/enb.conf
$OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem
-O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.local.conf -W
@@ -2255,23 +2237,23 @@
BUILD/EPC/epc.conf.in MCC \"208\"
BUILD/EPC/epc.conf.in MNC \"92\"
BUILD/EPC/epc.conf.in TAC \"1\"
- BUILD/EPC/epc.conf.in MME_INTERFACE_NAME_FOR_S1_MME \"eth0:1\"
+ BUILD/EPC/epc.conf.in MME_INTERFACE_NAME_FOR_S1_MME \"eth5:1\"
BUILD/EPC/epc.conf.in MME_IPV4_ADDRESS_FOR_S1_MME \"192.170.0.1/24\"
- BUILD/EPC/epc.conf.in SGW_INTERFACE_NAME_FOR_S1U_S12_S4_UP \"eth0:2\";
+ BUILD/EPC/epc.conf.in SGW_INTERFACE_NAME_FOR_S1U_S12_S4_UP \"eth5:2\";
BUILD/EPC/epc.conf.in SGW_IPV4_ADDRESS_FOR_S1U_S12_S4_UP \"192.170.1.1/24\";
- BUILD/EPC/epc.conf.in PGW_INTERFACE_NAME_FOR_SGI \"eth1\"
+ BUILD/EPC/epc.conf.in PGW_INTERFACE_NAME_FOR_SGI \"eth5\"
BUILD/EPC/epc.conf.in PGW_IPV4_ADDRESS_FOR_SGI \"192.168.12.82/24\"
BUILD/EPC/epc.conf.in IPV4_LIST \"192.172.0.0/24\",\"192.172.1.0/24\"
$OPENAIRCN_DIR/SCRIPTS/build_epc
-c -l
$OPENAIRCN_DIR/SCRIPTS/build_hss
- -c -l
+ -c -l --debug --random false
- sudo -E bash -c 'echo 3 > /proc/sys/vm/drop_caches' ;sudo -E ifconfig eth1 add 192.172.0.1
+ sudo -E bash -c 'echo 3 > /proc/sys/vm/drop_caches' ;sudo -E ifconfig eth5 add 192.172.0.1 ; cp $OPENAIRCN_DIR/BUILD/EPC/epc.conf.in $OPENAIRCN_TESTDIR/epc.conf.in
$OPENAIRCN_DIR/SCRIPTS/run_epc
-i -r
- sleep 10; $OPENAIRCN_DIR/SCRIPTS/run_hss
+ sleep 10; $OPENAIRCN_DIR/SCRIPTS/run_hss --export-db $OPENAIRCN_TESTDIR/hss_export.db
$OPENAIRCN_DIR/TEST/autotests/tools/iperf_script 60 lo -u -c 192.172.0.2 -b 10Mbits/s -B 192.172.0.1
@@ -2303,14 +2285,14 @@
targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf frame_type \"FDD\"
targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf nb_antennas_rx 1
targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf nb_antennas_tx 1
- targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf ENB_INTERFACE_NAME_FOR_S1_MME \"eth1\"
+ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf ENB_INTERFACE_NAME_FOR_S1_MME \"eth5\"
targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf ENB_IPV4_ADDRESS_FOR_S1_MME \"192.168.12.82/24\"
- targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf ENB_INTERFACE_NAME_FOR_S1U \"eth1\"
+ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf ENB_INTERFACE_NAME_FOR_S1U \"eth5\"
targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf ENB_IPV4_ADDRESS_FOR_S1U \"192.168.12.82/24\"
targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf ENB_PORT_FOR_S1U 2152
$OPENAIR_DIR/cmake_targets/build_oai
--eNB -w USRP -c
- sleep 15; sudo -E bash -c 'echo 3 > /proc/sys/vm/drop_caches'; ifconfig
+ sleep 15; sudo -E bash -c 'echo 3 > /proc/sys/vm/drop_caches'; ifconfig ; cp $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf $OPENAIR_TESTDIR/enb.conf
$OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem
-O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf -W
@@ -2345,17 +2327,18 @@
BUILD/EPC/epc.conf.in SGW_IPV4_ADDRESS_FOR_S1U_S12_S4_UP \"192.168.12.62/24\";
BUILD/EPC/epc.conf.in PGW_INTERFACE_NAME_FOR_SGI \"eth0\"
BUILD/EPC/epc.conf.in PGW_IPV4_ADDRESS_FOR_SGI \"192.168.12.62/24\"
- BUILD/EPC/epc.conf.in IPV4_LIST \"192.172.0.0/24\",\"192.172.1.0/24\"
+ BUILD/EPC/epc.conf.in IPV4_LIST \"192.172.0.0/24\",\"192.172.1.0/24\"
+ BUILD/EPC/epc.conf.in OUTPUT \"CONSOLE\"
$OPENAIRCN_DIR/SCRIPTS/build_epc
-c -l
$OPENAIRCN_DIR/SCRIPTS/build_hss
- -c -l
+ -c -l --debug --random false
- sudo -E bash -c 'echo 3 > /proc/sys/vm/drop_caches' ; sudo -E ifconfig eth1 add 192.172.0.1
+ sudo -E bash -c 'echo 3 > /proc/sys/vm/drop_caches' ; sudo -E ifconfig eth0 add 192.172.0.1
$OPENAIRCN_DIR/SCRIPTS/run_epc
-r
- sleep 10; $OPENAIRCN_DIR/SCRIPTS/run_hss
+ sleep 10; cp $OPENAIRCN_DIR/BUILD/EPC/epc.conf.in $OPENAIRCN_TESTDIR/epc.conf.in; $OPENAIRCN_DIR/SCRIPTS/run_hss --export-db $OPENAIRCN_TESTDIR/hss_export.db
$OPENAIRCN_DIR/TEST/autotests/tools/iperf_script 5 lo -s -i 1 -u -f m -B 192.172.0.1
@@ -2387,14 +2370,14 @@
targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf frame_type \"FDD\"
targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf nb_antennas_rx 1
targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf nb_antennas_tx 1
- targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf ENB_INTERFACE_NAME_FOR_S1_MME \"eth1\"
+ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf ENB_INTERFACE_NAME_FOR_S1_MME \"eth5\"
targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf ENB_IPV4_ADDRESS_FOR_S1_MME \"192.168.12.82/24\"
- targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf ENB_INTERFACE_NAME_FOR_S1U \"eth1\"
+ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf ENB_INTERFACE_NAME_FOR_S1U \"eth5\"
targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf ENB_IPV4_ADDRESS_FOR_S1U \"192.168.12.82/24\"
targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf ENB_PORT_FOR_S1U 2152
$OPENAIR_DIR/cmake_targets/build_oai
--eNB -w USRP -c
- sleep 15; sudo -E bash -c 'echo 3 > /proc/sys/vm/drop_caches' ; ifconfig
+ sleep 15; sudo -E bash -c 'echo 3 > /proc/sys/vm/drop_caches' ; ifconfig ; cp $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf $OPENAIR_TESTDIR/enb.conf
$OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem
-O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf -W
@@ -2433,13 +2416,13 @@
$OPENAIRCN_DIR/SCRIPTS/build_epc
-c -l
$OPENAIRCN_DIR/SCRIPTS/build_hss
- -c -l
+ -c -l --debug --random false
- sudo -E bash -c 'echo 3 > /proc/sys/vm/drop_caches' ;sudo -E ifconfig eth1 add 192.172.0.1
+ sudo -E bash -c 'echo 3 > /proc/sys/vm/drop_caches' ;sudo -E ifconfig eth0 add 192.172.0.1; cp $OPENAIRCN_DIR/BUILD/EPC/epc.conf.in $OPENAIRCN_TESTDIR/epc.conf.in
$OPENAIRCN_DIR/SCRIPTS/run_epc
-r
- sleep 10; $OPENAIRCN_DIR/SCRIPTS/run_hss
+ sleep 10; $OPENAIRCN_DIR/SCRIPTS/run_hss --export-db $OPENAIRCN_TESTDIR/hss_export.db
$OPENAIRCN_DIR/TEST/autotests/tools/iperf_script 5 lo -s -i 1 -u -f m -B 192.172.0.1
@@ -2471,14 +2454,14 @@
targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf frame_type \"FDD\"
targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf nb_antennas_rx 1
targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf nb_antennas_tx 1
- targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf ENB_INTERFACE_NAME_FOR_S1_MME \"eth1\"
+ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf ENB_INTERFACE_NAME_FOR_S1_MME \"eth5\"
targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf ENB_IPV4_ADDRESS_FOR_S1_MME \"192.168.12.82/24\"
- targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf ENB_INTERFACE_NAME_FOR_S1U \"eth1\"
+ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf ENB_INTERFACE_NAME_FOR_S1U \"eth5\"
targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf ENB_IPV4_ADDRESS_FOR_S1U \"192.168.12.82/24\"
targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf ENB_PORT_FOR_S1U 2152
$OPENAIR_DIR/cmake_targets/build_oai
--eNB -w USRP -c
- sleep 15; sudo -E bash -c 'echo 3 > /proc/sys/vm/drop_caches' ;sudo -E ifconfig eth0:3 192.170.0.2 up ; sudo -E ifconfig eth0:4 192.170.1.2 up; ifconfig
+ sleep 15; sudo -E bash -c 'echo 3 > /proc/sys/vm/drop_caches' ;sudo -E ifconfig eth0:3 192.170.0.2 up ; sudo -E ifconfig eth0:4 192.170.1.2 up; ifconfig ; cp $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf $OPENAIR_TESTDIR/enb.conf
$OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem
-O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf -W
@@ -2517,13 +2500,13 @@
$OPENAIRCN_DIR/SCRIPTS/build_epc
-c -l
$OPENAIRCN_DIR/SCRIPTS/build_hss
- -c -l
+ -c -l --debug --random false
- sudo -E bash -c 'echo 3 > /proc/sys/vm/drop_caches' ; sudo -E ifconfig eth1 add 192.172.0.1
+ sudo -E bash -c 'echo 3 > /proc/sys/vm/drop_caches' ; sudo -E ifconfig eth0 add 192.172.0.1 ; cp $OPENAIRCN_DIR/BUILD/EPC/epc.conf.in $OPENAIRCN_TESTDIR/epc.conf.in
$OPENAIRCN_DIR/SCRIPTS/run_epc
-r
- sleep 10; $OPENAIRCN_DIR/SCRIPTS/run_hss
+ sleep 10; $OPENAIRCN_DIR/SCRIPTS/run_hss --export-db $OPENAIRCN_TESTDIR/hss_export.db
$OPENAIRCN_DIR/TEST/autotests/tools/iperf_script 5 lo -s -i 1 -u -f m -B 192.172.0.1
@@ -2555,14 +2538,14 @@
targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf frame_type \"FDD\"
targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf nb_antennas_rx 1
targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf nb_antennas_tx 1
- targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf ENB_INTERFACE_NAME_FOR_S1_MME \"eth1\"
+ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf ENB_INTERFACE_NAME_FOR_S1_MME \"eth5\"
targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf ENB_IPV4_ADDRESS_FOR_S1_MME \"192.168.12.82/24\"
- targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf ENB_INTERFACE_NAME_FOR_S1U \"eth1\"
+ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf ENB_INTERFACE_NAME_FOR_S1U \"eth5\"
targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf ENB_IPV4_ADDRESS_FOR_S1U \"192.168.12.82/24\"
targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf ENB_PORT_FOR_S1U 2152
$OPENAIR_DIR/cmake_targets/build_oai
--eNB -w USRP -c
- sleep 15; sudo -E bash -c 'echo 3 > /proc/sys/vm/drop_caches' ; ifconfig
+ sleep 15; sudo -E bash -c 'echo 3 > /proc/sys/vm/drop_caches' ; ifconfig ; cp $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf $OPENAIR_TESTDIR/enb.conf
$OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem
-O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf -W
@@ -2601,13 +2584,13 @@
$OPENAIRCN_DIR/SCRIPTS/build_epc
-c -l
$OPENAIRCN_DIR/SCRIPTS/build_hss
- -c -l
+ -c -l --debug --random false
- sudo -E bash -c 'echo 3 > /proc/sys/vm/drop_caches' ;sudo -E ifconfig eth1 add 192.172.0.1
+ sudo -E bash -c 'echo 3 > /proc/sys/vm/drop_caches' ;sudo -E ifconfig eth0 add 192.172.0.1 ; cp $OPENAIRCN_DIR/BUILD/EPC/epc.conf.in $OPENAIRCN_TESTDIR/epc.conf.in
$OPENAIRCN_DIR/SCRIPTS/run_epc
-r
- sleep 10; $OPENAIRCN_DIR/SCRIPTS/run_hss
+ sleep 10; $OPENAIRCN_DIR/SCRIPTS/run_hss --export-db $OPENAIRCN_TESTDIR/hss_export.db
$OPENAIRCN_DIR/TEST/autotests/tools/iperf_script 60 lo -u -c 192.172.0.2 -b 10Mbits/s -B 192.172.0.1
@@ -2639,14 +2622,14 @@
targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf frame_type \"FDD\"
targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf nb_antennas_rx 1
targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf nb_antennas_tx 1
- targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf ENB_INTERFACE_NAME_FOR_S1_MME \"eth1\"
+ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf ENB_INTERFACE_NAME_FOR_S1_MME \"eth5\"
targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf ENB_IPV4_ADDRESS_FOR_S1_MME \"192.168.12.82/24\"
- targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf ENB_INTERFACE_NAME_FOR_S1U \"eth1\"
+ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf ENB_INTERFACE_NAME_FOR_S1U \"eth5\"
targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf ENB_IPV4_ADDRESS_FOR_S1U \"192.168.12.82/24\"
targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf ENB_PORT_FOR_S1U 2152
$OPENAIR_DIR/cmake_targets/build_oai
--eNB -w USRP -c
- sleep 15; sudo -E bash -c 'echo 3 > /proc/sys/vm/drop_caches' ; ifconfig
+ sleep 15; sudo -E bash -c 'echo 3 > /proc/sys/vm/drop_caches' ; ifconfig ; cp $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf $OPENAIR_TESTDIR/enb.conf
$OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem
-O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf -W
@@ -2685,13 +2668,13 @@
$OPENAIRCN_DIR/SCRIPTS/build_epc
-c -l
$OPENAIRCN_DIR/SCRIPTS/build_hss
- -c -l
+ -c -l --debug --random false
- sudo -E bash -c 'echo 3 > /proc/sys/vm/drop_caches' ;sudo -E ifconfig eth1 add 192.172.0.1
+ sudo -E bash -c 'echo 3 > /proc/sys/vm/drop_caches' ;sudo -E ifconfig eth0 add 192.172.0.1 ; cp $OPENAIRCN_DIR/BUILD/EPC/epc.conf.in $OPENAIRCN_TESTDIR/epc.conf.in
$OPENAIRCN_DIR/SCRIPTS/run_epc
-r
- sleep 10; $OPENAIRCN_DIR/SCRIPTS/run_hss
+ sleep 10; $OPENAIRCN_DIR/SCRIPTS/run_hss --export-db $OPENAIRCN_TESTDIR/hss_export.db
$OPENAIRCN_DIR/TEST/autotests/tools/iperf_script 60 lo -u -c 192.172.0.2 -b 10Mbits/s -B 192.172.0.1
@@ -2723,14 +2706,14 @@
targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf frame_type \"FDD\"
targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf nb_antennas_rx 1
targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf nb_antennas_tx 1
- targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf ENB_INTERFACE_NAME_FOR_S1_MME \"eth1\"
+ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf ENB_INTERFACE_NAME_FOR_S1_MME \"eth5\"
targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf ENB_IPV4_ADDRESS_FOR_S1_MME \"192.168.12.82/24\"
- targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf ENB_INTERFACE_NAME_FOR_S1U \"eth1\"
+ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf ENB_INTERFACE_NAME_FOR_S1U \"eth5\"
targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf ENB_IPV4_ADDRESS_FOR_S1U \"192.168.12.82/24\"
targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf ENB_PORT_FOR_S1U 2152
$OPENAIR_DIR/cmake_targets/build_oai
--eNB -w USRP -c
- sleep 15; sudo -E bash -c 'echo 3 > /proc/sys/vm/drop_caches' ; ifconfig
+ sleep 15; sudo -E bash -c 'echo 3 > /proc/sys/vm/drop_caches' ; ifconfig ; cp $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf $OPENAIR_TESTDIR/enb.conf
$OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem
-O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf -W
@@ -2769,13 +2752,13 @@
$OPENAIRCN_DIR/SCRIPTS/build_epc
-c -l
$OPENAIRCN_DIR/SCRIPTS/build_hss
- -c -l
+ -c -l --debug --random false
- sudo -E bash -c 'echo 3 > /proc/sys/vm/drop_caches' ;sudo -E ifconfig eth1 add 192.172.0.1
+ sudo -E bash -c 'echo 3 > /proc/sys/vm/drop_caches' ;sudo -E ifconfig eth0 add 192.172.0.1 ;cp $OPENAIRCN_DIR/BUILD/EPC/epc.conf.in $OPENAIRCN_TESTDIR/epc.conf.in
$OPENAIRCN_DIR/SCRIPTS/run_epc
-r
- sleep 10; $OPENAIRCN_DIR/SCRIPTS/run_hss
+ sleep 10; $OPENAIRCN_DIR/SCRIPTS/run_hss --export-db $OPENAIRCN_TESTDIR/hss_export.db
$OPENAIRCN_DIR/TEST/autotests/tools/iperf_script 60 lo -u -c 192.172.0.2 -b 10Mbits/s -B 192.172.0.1
@@ -2805,9 +2788,9 @@
targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.25PRB.usrpx310.epc.remote.conf frame_type \"FDD\"
targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.25PRB.usrpx310.epc.remote.conf nb_antennas_rx 1
targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.25PRB.usrpx310.epc.remote.conf nb_antennas_tx 1
- targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.25PRB.usrpx310.epc.remote.conf ENB_INTERFACE_NAME_FOR_S1_MME \"eth0\"
+ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.25PRB.usrpx310.epc.remote.conf ENB_INTERFACE_NAME_FOR_S1_MME \"eth6\"
targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.25PRB.usrpx310.epc.remote.conf ENB_IPV4_ADDRESS_FOR_S1_MME \"192.168.12.111/24\"
- targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.25PRB.usrpx310.epc.remote.conf ENB_INTERFACE_NAME_FOR_S1U \"eth0\"
+ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.25PRB.usrpx310.epc.remote.conf ENB_INTERFACE_NAME_FOR_S1U \"eth6\"
targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.25PRB.usrpx310.epc.remote.conf ENB_IPV4_ADDRESS_FOR_S1U \"192.168.12.111/24\"
targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.25PRB.usrpx310.epc.remote.conf ENB_PORT_FOR_S1U 2152
$OPENAIR_DIR/cmake_targets/build_oai
@@ -2820,7 +2803,7 @@
- True
+ False
/tmp
@@ -2833,7 +2816,7 @@
- True
+ False
sudo -S -E $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --stop-ue
/tmp
@@ -2853,7 +2836,7 @@
throughput_test min=1.0Mbits/sec max=1.0Mbits/sec average=1.0Mbits/sec
- True
+ False
USRPx310.ALU_EPC.Bandrich.5MHz.FDD.Band_7.UL.1TX.1RX
10
@@ -2877,9 +2860,9 @@
targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.50PRB.usrpx310.conf frame_type \"FDD\"
targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.50PRB.usrpx310.conf nb_antennas_rx 1
targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.50PRB.usrpx310.conf nb_antennas_tx 1
- targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.25PRB.usrpx310.conf ENB_INTERFACE_NAME_FOR_S1_MME \"eth0\"
+ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.25PRB.usrpx310.conf ENB_INTERFACE_NAME_FOR_S1_MME \"eth6\"
targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.25PRB.usrpx310.conf ENB_IPV4_ADDRESS_FOR_S1_MME \"192.168.12.111/24\"
- targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.25PRB.usrpx310.conf ENB_INTERFACE_NAME_FOR_S1U \"eth0\"
+ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.25PRB.usrpx310.conf ENB_INTERFACE_NAME_FOR_S1U \"eth6\"
targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.25PRB.usrpx310.conf ENB_IPV4_ADDRESS_FOR_S1U \"192.168.12.111/24\"
targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.25PRB.usrpx310.conf ENB_PORT_FOR_S1U 2152
$OPENAIR_DIR/cmake_targets/build_oai
@@ -2892,7 +2875,7 @@
- True
+ False
/tmp
@@ -2905,7 +2888,7 @@
- True
+ False
sudo -S -E $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --stop-ue
/tmp
@@ -2925,7 +2908,7 @@
throughput_test min=1.0Mbits/sec max=1.0Mbits/sec average=1.0Mbits/sec
- True
+ False
USRPx310.ALU_EPC.Bandrich.10MHz.FDD.Band_7.UL.1TX.1RX
10
@@ -2948,9 +2931,9 @@
targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.100PRB.usrpx310.conf frame_type \"FDD\"
targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.100PRB.usrpx310.conf nb_antennas_rx 1
targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.100PRB.usrpx310.conf nb_antennas_tx 1
- targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.100PRB.usrpx310.conf ENB_INTERFACE_NAME_FOR_S1_MME \"eth0\"
+ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.100PRB.usrpx310.conf ENB_INTERFACE_NAME_FOR_S1_MME \"eth6\"
targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.100PRB.usrpx310.conf ENB_IPV4_ADDRESS_FOR_S1_MME \"192.168.12.111/24\"
- targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.100PRB.usrpx310.conf ENB_INTERFACE_NAME_FOR_S1U \"eth0\"
+ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.100PRB.usrpx310.conf ENB_INTERFACE_NAME_FOR_S1U \"eth6\"
targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.100PRB.usrpx310.conf ENB_IPV4_ADDRESS_FOR_S1U \"192.168.12.111/24\"
targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.100PRB.usrpx310.conf ENB_PORT_FOR_S1U 2152
$OPENAIR_DIR/cmake_targets/build_oai
@@ -2963,7 +2946,7 @@
- True
+ False
/tmp
@@ -2977,7 +2960,7 @@
- True
+ False
sudo -S -E $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --stop-ue
/tmp
@@ -2997,7 +2980,7 @@
throughput_test min=1.0Mbits/sec max=1.0Mbits/sec average=1.0Mbits/sec
- True
+ False
USRPx310.ALU_EPC.Bandrich.20MHz.FDD.Band_7.UL.1TX.1RX
10
@@ -3020,9 +3003,9 @@
targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.25PRB.usrpx310.epc.remote.conf frame_type \"FDD\"
targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.25PRB.usrpx310.epc.remote.conf nb_antennas_rx 1
targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.25PRB.usrpx310.epc.remote.conf nb_antennas_tx 1
- targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.25PRB.usrpx310.epc.remote.conf ENB_INTERFACE_NAME_FOR_S1_MME \"eth0\"
+ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.25PRB.usrpx310.epc.remote.conf ENB_INTERFACE_NAME_FOR_S1_MME \"eth6\"
targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.25PRB.usrpx310.epc.remote.conf ENB_IPV4_ADDRESS_FOR_S1_MME \"192.168.12.111/24\"
- targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.25PRB.usrpx310.epc.remote.conf ENB_INTERFACE_NAME_FOR_S1U \"eth0\"
+ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.25PRB.usrpx310.epc.remote.conf ENB_INTERFACE_NAME_FOR_S1U \"eth6\"
targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.25PRB.usrpx310.epc.remote.conf ENB_IPV4_ADDRESS_FOR_S1U \"192.168.12.111/24\"
targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.25PRB.usrpx310.epc.remote.conf ENB_PORT_FOR_S1U 2152
$OPENAIR_DIR/cmake_targets/build_oai
@@ -3035,7 +3018,7 @@
- True
+ False
/tmp
@@ -3047,7 +3030,7 @@
$OPENAIR_DIR/cmake_targets/autotests/tools/iperf_script 1 ppp0 -s -i 1 -u -f m -B 192.172.0.2
- True
+ False
sudo -S -E $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --stop-ue
throughput_test min=4.0Mbits/sec max=5.0Mbits/sec average=4.0Mbits/sec
@@ -3068,7 +3051,7 @@
$OPENAIRCN_DIR/TEST/autotests/tools/iperf_script 60 lo -u -c 192.172.0.2 -b 10Mbits/s -B 192.172.0.1
- True
+ False
USRPx310.ALU_EPC.Bandrich.5MHz.FDD.Band_7.DL.1TX.1RX
10
@@ -3091,9 +3074,9 @@
targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.50PRB.usrpx310.conf frame_type \"FDD\"
targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.50PRB.usrpx310.conf nb_antennas_rx 1
targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.50PRB.usrpx310.conf nb_antennas_tx 1
- targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.50PRB.usrpx310.conf ENB_INTERFACE_NAME_FOR_S1_MME \"eth0\"
+ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.50PRB.usrpx310.conf ENB_INTERFACE_NAME_FOR_S1_MME \"eth6\"
targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.50PRB.usrpx310.conf ENB_IPV4_ADDRESS_FOR_S1_MME \"192.168.12.111/24\"
- targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.50PRB.usrpx310.conf ENB_INTERFACE_NAME_FOR_S1U \"eth0\"
+ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.50PRB.usrpx310.conf ENB_INTERFACE_NAME_FOR_S1U \"eth6\"
targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.50PRB.usrpx310.conf ENB_IPV4_ADDRESS_FOR_S1U \"192.168.12.111/24\"
targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.50PRB.usrpx310.conf ENB_PORT_FOR_S1U 2152
$OPENAIR_DIR/cmake_targets/build_oai
@@ -3106,7 +3089,7 @@
- True
+ False
/tmp
@@ -3118,7 +3101,7 @@
$OPENAIR_DIR/cmake_targets/autotests/tools/iperf_script 1 ppp0 -s -i 1 -u -f m -B 192.172.0.2
- True
+ False
sudo -S -E $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --stop-ue
throughput_test min=8.0Mbits/sec max=9.0Mbits/sec average=8.5Mbits/sec
@@ -3139,7 +3122,7 @@
$OPENAIRCN_DIR/TEST/autotests/tools/iperf_script 60 lo -u -c 192.172.0.2 -b 10Mbits/s -B 192.172.0.1
- True
+ False
USRPx310.ALU_EPC.Bandrich.10MHz.FDD.Band_7.DL.1TX.1RX
10
@@ -3162,9 +3145,9 @@
targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.100PRB.usrpx310.conf frame_type \"FDD\"
targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.100PRB.usrpx310.conf nb_antennas_rx 1
targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.100PRB.usrpx310.conf nb_antennas_tx 1
- targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.100PRB.usrpx310.conf ENB_INTERFACE_NAME_FOR_S1_MME \"eth0\"
+ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.100PRB.usrpx310.conf ENB_INTERFACE_NAME_FOR_S1_MME \"eth6\"
targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.100PRB.usrpx310.conf ENB_IPV4_ADDRESS_FOR_S1_MME \"192.168.12.111/24\"
- targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.100PRB.usrpx310.conf ENB_INTERFACE_NAME_FOR_S1U \"eth0\"
+ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.100PRB.usrpx310.conf ENB_INTERFACE_NAME_FOR_S1U \"eth6\"
targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.100PRB.usrpx310.conf ENB_IPV4_ADDRESS_FOR_S1U \"192.168.12.111/24\"
targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.100PRB.usrpx310.conf ENB_PORT_FOR_S1U 2152
$OPENAIR_DIR/cmake_targets/build_oai
@@ -3177,7 +3160,7 @@
- True
+ False
/tmp
@@ -3189,7 +3172,7 @@
$OPENAIR_DIR/cmake_targets/autotests/tools/iperf_script 1 ppp0 -s -i 1 -u -f m -B 192.172.0.2
- True
+ False
sudo -S -E $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --stop-ue
throughput_test min=15.0Mbits/sec max=15.0Mbits/sec average=15.0Mbits/sec
@@ -3210,7 +3193,7 @@
$OPENAIRCN_DIR/TEST/autotests/tools/iperf_script 60 lo -u -c 192.172.0.2 -b 10Mbits/s -B 192.172.0.1
- True
+ False
USRPx310.ALU_EPC.Bandrich.20MHz.FDD.Band_7.DL.1TX.1RX
10
@@ -3236,14 +3219,14 @@
targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.25PRB.usrpx310.epc.remote.conf frame_type \"FDD\"
targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.25PRB.usrpx310.epc.remote.conf nb_antennas_rx 1
targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.25PRB.usrpx310.epc.remote.conf nb_antennas_tx 1
- targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.25PRB.usrpx310.epc.remote.conf ENB_INTERFACE_NAME_FOR_S1_MME \"eth0\"
+ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.25PRB.usrpx310.epc.remote.conf ENB_INTERFACE_NAME_FOR_S1_MME \"eth6\"
targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.25PRB.usrpx310.epc.remote.conf ENB_IPV4_ADDRESS_FOR_S1_MME \"192.168.12.111/24\"
- targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.25PRB.usrpx310.epc.remote.conf ENB_INTERFACE_NAME_FOR_S1U \"eth0\"
+ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.25PRB.usrpx310.epc.remote.conf ENB_INTERFACE_NAME_FOR_S1U \"eth6\"
targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.25PRB.usrpx310.epc.remote.conf ENB_IPV4_ADDRESS_FOR_S1U \"192.168.12.111/24\"
targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.25PRB.usrpx310.epc.remote.conf ENB_PORT_FOR_S1U 2152
$OPENAIR_DIR/cmake_targets/build_oai
--eNB -w USRP -x -c
- sleep 15; sudo -E -S /usr/local/bin/niusrprio_pcie start ; dmesg|tail
+ sleep 15; sudo -E -S /usr/local/bin/niusrprio_pcie start ; dmesg|tail ; cp $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.25PRB.usrpx310.epc.remote.conf $OPENAIR_TESTDIR/enb.conf
$OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem
-O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.25PRB.usrpx310.epc.remote.conf -W
@@ -3282,13 +3265,13 @@
$OPENAIRCN_DIR/SCRIPTS/build_epc
-c -l
$OPENAIRCN_DIR/SCRIPTS/build_hss
- -c -l
+ -c -l --debug --random false
- sudo -E bash -c 'echo 3 > /proc/sys/vm/drop_caches' ; sudo -E ifconfig eth1 add 192.172.0.1
+ sudo -E bash -c 'echo 3 > /proc/sys/vm/drop_caches' ; sudo -E ifconfig eth0 add 192.172.0.1 ; cp $OPENAIRCN_DIR/BUILD/EPC/epc.conf.in $OPENAIRCN_TESTDIR/epc.conf.in
$OPENAIRCN_DIR/SCRIPTS/run_epc
-r
- sleep 10; $OPENAIRCN_DIR/SCRIPTS/run_hss
+ sleep 10; $OPENAIRCN_DIR/SCRIPTS/run_hss --export-db $OPENAIRCN_TESTDIR/hss_export.db
$OPENAIRCN_DIR/TEST/autotests/tools/iperf_script 5 lo -s -i 1 -u -f m -B 192.172.0.1
@@ -3319,14 +3302,14 @@
targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.50PRB.usrpx310.conf frame_type \"FDD\"
targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.50PRB.usrpx310.conf nb_antennas_rx 1
targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.50PRB.usrpx310.conf nb_antennas_tx 1
- targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.25PRB.usrpx310.conf ENB_INTERFACE_NAME_FOR_S1_MME \"eth0\"
- targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.25PRB.usrpx310.conf ENB_IPV4_ADDRESS_FOR_S1_MME \"192.168.12.111/24\"
- targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.25PRB.usrpx310.conf ENB_INTERFACE_NAME_FOR_S1U \"eth0\"
- targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.25PRB.usrpx310.conf ENB_IPV4_ADDRESS_FOR_S1U \"192.168.12.111/24\"
- targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.25PRB.usrpx310.conf ENB_PORT_FOR_S1U 2152
+ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.50PRB.usrpx310.conf ENB_INTERFACE_NAME_FOR_S1_MME \"eth6\"
+ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.50PRB.usrpx310.conf ENB_IPV4_ADDRESS_FOR_S1_MME \"192.168.12.111/24\"
+ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.50PRB.usrpx310.conf ENB_INTERFACE_NAME_FOR_S1U \"eth6\"
+ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.50PRB.usrpx310.conf ENB_IPV4_ADDRESS_FOR_S1U \"192.168.12.111/24\"
+ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.50PRB.usrpx310.conf ENB_PORT_FOR_S1U 2152
$OPENAIR_DIR/cmake_targets/build_oai
--eNB -w USRP -x -c
- sleep 15; sudo -E -S /usr/local/bin/niusrprio_pcie start ; dmesg|tail
+ sleep 15; sudo -E -S /usr/local/bin/niusrprio_pcie start ; dmesg|tail ; cp $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.50PRB.usrpx310.epc.remote.conf $OPENAIR_TESTDIR/enb.conf
$OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem
-O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.50PRB.usrpx310.conf -W
@@ -3334,7 +3317,7 @@
- True
+ False
/tmp
@@ -3365,13 +3348,13 @@
$OPENAIRCN_DIR/SCRIPTS/build_epc
-c -l
$OPENAIRCN_DIR/SCRIPTS/build_hss
- -c -l
+ -c -l --debug --random false
- sudo -E bash -c 'echo 3 > /proc/sys/vm/drop_caches' ;sudo -E ifconfig eth1 add 192.172.0.1
+ sudo -E bash -c 'echo 3 > /proc/sys/vm/drop_caches' ;sudo -E ifconfig eth0 add 192.172.0.1 ; cp $OPENAIRCN_DIR/BUILD/EPC/epc.conf.in $OPENAIRCN_TESTDIR/epc.conf.in
$OPENAIRCN_DIR/SCRIPTS/run_epc
-r
- sleep 10; $OPENAIRCN_DIR/SCRIPTS/run_hss
+ sleep 10; $OPENAIRCN_DIR/SCRIPTS/run_hss --export-db $OPENAIRCN_TESTDIR/hss_export.db
$OPENAIRCN_DIR/TEST/autotests/tools/iperf_script 5 lo -s -i 1 -u -f m -B 192.172.0.1
@@ -3400,14 +3383,14 @@
targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.100PRB.usrpx310.conf frame_type \"FDD\"
targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.100PRB.usrpx310.conf nb_antennas_rx 1
targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.100PRB.usrpx310.conf nb_antennas_tx 1
- targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.100PRB.usrpx310.conf ENB_INTERFACE_NAME_FOR_S1_MME \"eth0\"
+ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.100PRB.usrpx310.conf ENB_INTERFACE_NAME_FOR_S1_MME \"eth6\"
targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.100PRB.usrpx310.conf ENB_IPV4_ADDRESS_FOR_S1_MME \"192.168.12.111/24\"
- targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.100PRB.usrpx310.conf ENB_INTERFACE_NAME_FOR_S1U \"eth0\"
+ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.100PRB.usrpx310.conf ENB_INTERFACE_NAME_FOR_S1U \"eth6\"
targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.100PRB.usrpx310.conf ENB_IPV4_ADDRESS_FOR_S1U \"192.168.12.111/24\"
targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.100PRB.usrpx310.conf ENB_PORT_FOR_S1U 2152
$OPENAIR_DIR/cmake_targets/build_oai
--eNB -w USRP -x -c
- sleep 15; sudo -E -S /usr/local/bin/niusrprio_pcie start ; dmesg|tail
+ sleep 15; sudo -E -S /usr/local/bin/niusrprio_pcie start ; dmesg|tail ; cp $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.100PRB.usrpx310.epc.remote.conf $OPENAIR_TESTDIR/enb.conf
$OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem
-O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.100PRB.usrpx310.conf -W
@@ -3446,13 +3429,13 @@
$OPENAIRCN_DIR/SCRIPTS/build_epc
-c -l
$OPENAIRCN_DIR/SCRIPTS/build_hss
- -c -l
+ -c -l --debug --random false
- sudo -E bash -c 'echo 3 > /proc/sys/vm/drop_caches' ; sudo -E ifconfig eth1 add 192.172.0.1
+ sudo -E bash -c 'echo 3 > /proc/sys/vm/drop_caches' ; sudo -E ifconfig eth0 add 192.172.0.1
$OPENAIRCN_DIR/SCRIPTS/run_epc
-r
- sleep 10; $OPENAIRCN_DIR/SCRIPTS/run_hss
+ sleep 10; $OPENAIRCN_DIR/SCRIPTS/run_hss --export-db $OPENAIRCN_TESTDIR/hss_export.db
$OPENAIRCN_DIR/TEST/autotests/tools/iperf_script 5 lo -s -i 1 -u -f m -B 192.172.0.1
@@ -3481,14 +3464,14 @@
targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.25PRB.usrpx310.epc.remote.conf frame_type \"FDD\"
targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.25PRB.usrpx310.epc.remote.conf nb_antennas_rx 1
targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.25PRB.usrpx310.epc.remote.conf nb_antennas_tx 1
- targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.25PRB.usrpx310.epc.remote.conf ENB_INTERFACE_NAME_FOR_S1_MME \"eth0\"
+ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.25PRB.usrpx310.epc.remote.conf ENB_INTERFACE_NAME_FOR_S1_MME \"eth6\"
targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.25PRB.usrpx310.epc.remote.conf ENB_IPV4_ADDRESS_FOR_S1_MME \"192.168.12.111/24\"
- targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.25PRB.usrpx310.epc.remote.conf ENB_INTERFACE_NAME_FOR_S1U \"eth0\"
+ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.25PRB.usrpx310.epc.remote.conf ENB_INTERFACE_NAME_FOR_S1U \"eth6\"
targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.25PRB.usrpx310.epc.remote.conf ENB_IPV4_ADDRESS_FOR_S1U \"192.168.12.111/24\"
targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.25PRB.usrpx310.epc.remote.conf ENB_PORT_FOR_S1U 2152
$OPENAIR_DIR/cmake_targets/build_oai
--eNB -w USRP -x -c
- sleep 15; sudo -E -S /usr/local/bin/niusrprio_pcie start ; dmesg|tail
+ sleep 15; sudo -E -S /usr/local/bin/niusrprio_pcie start ; dmesg|tail ; cp $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.25PRB.usrpx310.epc.remote.conf $OPENAIR_TESTDIR/enb.conf
$OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem
-O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.25PRB.usrpx310.epc.remote.conf -W
@@ -3525,15 +3508,15 @@
BUILD/EPC/epc.conf.in PGW_IPV4_ADDRESS_FOR_SGI \"192.168.12.62/24\"
BUILD/EPC/epc.conf.in IPV4_LIST \"192.172.0.0/24\",\"192.172.1.0/24\"
$OPENAIRCN_DIR/SCRIPTS/build_epc
- -c -l
+ -c -l
$OPENAIRCN_DIR/SCRIPTS/build_hss
- -c -l
+ -c -l --debug --random false
- sudo -E bash -c 'echo 3 > /proc/sys/vm/drop_caches' ;sudo -E ifconfig eth1 add 192.172.0.1
+ sudo -E bash -c 'echo 3 > /proc/sys/vm/drop_caches' ;sudo -E ifconfig eth0 add 192.172.0.1 ; cp $OPENAIRCN_DIR/BUILD/EPC/epc.conf.in $OPENAIRCN_TESTDIR/epc.conf.in
$OPENAIRCN_DIR/SCRIPTS/run_epc
-r
- sleep 10; $OPENAIRCN_DIR/SCRIPTS/run_hss
+ sleep 10; $OPENAIRCN_DIR/SCRIPTS/run_hss --export-db $OPENAIRCN_TESTDIR/hss_export.db
$OPENAIRCN_DIR/TEST/autotests/tools/iperf_script 60 lo -u -c 192.172.0.2 -b 10Mbits/s -B 192.172.0.1
@@ -3562,14 +3545,14 @@
targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.50PRB.usrpx310.conf frame_type \"FDD\"
targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.50PRB.usrpx310.conf nb_antennas_rx 1
targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.50PRB.usrpx310.conf nb_antennas_tx 1
- targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.50PRB.usrpx310.conf ENB_INTERFACE_NAME_FOR_S1_MME \"eth0\"
+ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.50PRB.usrpx310.conf ENB_INTERFACE_NAME_FOR_S1_MME \"eth6\"
targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.50PRB.usrpx310.conf ENB_IPV4_ADDRESS_FOR_S1_MME \"192.168.12.111/24\"
- targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.50PRB.usrpx310.conf ENB_INTERFACE_NAME_FOR_S1U \"eth0\"
+ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.50PRB.usrpx310.conf ENB_INTERFACE_NAME_FOR_S1U \"eth6\"
targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.50PRB.usrpx310.conf ENB_IPV4_ADDRESS_FOR_S1U \"192.168.12.111/24\"
targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.50PRB.usrpx310.conf ENB_PORT_FOR_S1U 2152
$OPENAIR_DIR/cmake_targets/build_oai
--eNB -w USRP -x -c
- sleep 15; sudo -E -S /usr/local/bin/niusrprio_pcie start ; dmesg|tail
+ sleep 15; sudo -E -S /usr/local/bin/niusrprio_pcie start ; dmesg|tail ; cp $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.50PRB.usrpx310.epc.remote.conf $OPENAIR_TESTDIR/enb.conf
sudo -E -S /usr/local/bin/niusrprio_pcie start ; dmesg|tail
$OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem
-O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.50PRB.usrpx310.conf -W
@@ -3608,13 +3591,13 @@
$OPENAIRCN_DIR/SCRIPTS/build_epc
-c -l
$OPENAIRCN_DIR/SCRIPTS/build_hss
- -c -l
+ -c -l --debug --random false
- sudo -E bash -c 'echo 3 > /proc/sys/vm/drop_caches' ;sudo -E ifconfig eth1 add 192.172.0.1
+ sudo -E bash -c 'echo 3 > /proc/sys/vm/drop_caches' ;sudo -E ifconfig eth0 add 192.172.0.1 ; cp $OPENAIRCN_DIR/BUILD/EPC/epc.conf.in $OPENAIRCN_TESTDIR/epc.conf
$OPENAIRCN_DIR/SCRIPTS/run_epc
-r
- sleep 10; $OPENAIRCN_DIR/SCRIPTS/run_hss
+ sleep 10; $OPENAIRCN_DIR/SCRIPTS/run_hss --export-db $OPENAIRCN_TESTDIR/hss_export.db
$OPENAIRCN_DIR/TEST/autotests/tools/iperf_script 60 lo -u -c 192.172.0.2 -b 10Mbits/s -B 192.172.0.1
@@ -3643,14 +3626,14 @@
targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.100PRB.usrpx310.conf frame_type \"FDD\"
targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.100PRB.usrpx310.conf nb_antennas_rx 1
targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.100PRB.usrpx310.conf nb_antennas_tx 1
- targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.100PRB.usrpx310.conf ENB_INTERFACE_NAME_FOR_S1_MME \"eth0\"
+ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.100PRB.usrpx310.conf ENB_INTERFACE_NAME_FOR_S1_MME \"eth6\"
targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.100PRB.usrpx310.conf ENB_IPV4_ADDRESS_FOR_S1_MME \"192.168.12.111/24\"
- targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.100PRB.usrpx310.conf ENB_INTERFACE_NAME_FOR_S1U \"eth0\"
+ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.100PRB.usrpx310.conf ENB_INTERFACE_NAME_FOR_S1U \"eth6\"
targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.100PRB.usrpx310.conf ENB_IPV4_ADDRESS_FOR_S1U \"192.168.12.111/24\"
targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.100PRB.usrpx310.conf ENB_PORT_FOR_S1U 2152
$OPENAIR_DIR/cmake_targets/build_oai
--eNB -w USRP -x -c
- sleep 15; sudo -E -S /usr/local/bin/niusrprio_pcie start ; dmesg|tail
+ sleep 15; sudo -E -S /usr/local/bin/niusrprio_pcie start ; dmesg|tail ; cp $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.25PRB.usrpx310.epc.remote.conf $OPENAIR_TESTDIR/enb.conf
$OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem
-O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.100PRB.usrpx310.conf -W
@@ -3658,7 +3641,7 @@
- True
+ False
/tmp
@@ -3689,13 +3672,13 @@
$OPENAIRCN_DIR/SCRIPTS/build_epc
-c -l
$OPENAIRCN_DIR/SCRIPTS/build_hss
- -c -l
+ -c -l --debug --random false
- sudo -E bash -c 'echo 3 > /proc/sys/vm/drop_caches' ;sudo -E ifconfig eth1 add 192.172.0.1
+ sudo -E bash -c 'echo 3 > /proc/sys/vm/drop_caches' ;sudo -E ifconfig eth0 add 192.172.0.1 ; cp $OPENAIRCN_DIR/BUILD/EPC/epc.conf.in $OPENAIRCN_TESTDIR/epc.conf.in
$OPENAIRCN_DIR/SCRIPTS/run_epc
-r
- sleep 10; $OPENAIRCN_DIR/SCRIPTS/run_hss
+ sleep 10; $OPENAIRCN_DIR/SCRIPTS/run_hss --export-db $OPENAIRCN_TESTDIR/hss_export.db
$OPENAIRCN_DIR/TEST/autotests/tools/iperf_script 60 lo -u -c 192.172.0.2 -b 10Mbits/s -B 192.172.0.1
@@ -3724,9 +3707,9 @@
targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.exmimo2.conf frame_type \"FDD\"
targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.exmimo2.conf nb_antennas_rx 1
targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.exmimo2.conf nb_antennas_tx 1
- targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.exmimo2.conf ENB_INTERFACE_NAME_FOR_S1_MME \"eth1\"
+ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.exmimo2.conf ENB_INTERFACE_NAME_FOR_S1_MME \"eth5\"
targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.exmimo2.conf ENB_IPV4_ADDRESS_FOR_S1_MME \"192.168.12.82/24\"
- targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.exmimo2.conf ENB_INTERFACE_NAME_FOR_S1U \"eth1\"
+ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.exmimo2.conf ENB_INTERFACE_NAME_FOR_S1U \"eth5\"
targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.exmimo2.conf ENB_IPV4_ADDRESS_FOR_S1U \"192.168.12.82/24\"
targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.exmimo2.conf ENB_PORT_FOR_S1U 2152
$OPENAIR_DIR/cmake_targets/build_oai
@@ -3739,7 +3722,7 @@
- True
+ False
/tmp
@@ -3752,7 +3735,7 @@
- True
+ False
sudo -S -E $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --stop-ue
/tmp
@@ -3772,7 +3755,7 @@
throughput_test min=1.0Mbits/sec max=1.0Mbits/sec average=1.0Mbits/sec
- True
+ False
EXMIMO.ALU_EPC.Bandrich.5MHz.FDD.Band_7.UL.1TX.1RX
10
@@ -3796,9 +3779,9 @@
targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.exmimo2.conf frame_type \"FDD\"
targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.exmimo2.conf nb_antennas_rx 1
targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.exmimo2.conf nb_antennas_tx 1
- targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.exmimo2.conf ENB_INTERFACE_NAME_FOR_S1_MME \"eth1\"
+ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.exmimo2.conf ENB_INTERFACE_NAME_FOR_S1_MME \"eth5\"
targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.exmimo2.conf ENB_IPV4_ADDRESS_FOR_S1_MME \"192.168.12.82/24\"
- targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.exmimo2.conf ENB_INTERFACE_NAME_FOR_S1U \"eth1\"
+ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.exmimo2.conf ENB_INTERFACE_NAME_FOR_S1U \"eth5\"
targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.exmimo2.conf ENB_IPV4_ADDRESS_FOR_S1U \"192.168.12.82/24\"
targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.exmimo2.conf ENB_PORT_FOR_S1U 2152
$OPENAIR_DIR/cmake_targets/build_oai
@@ -3811,7 +3794,7 @@
- True
+ False
/tmp
@@ -3825,7 +3808,7 @@
- True
+ False
sudo -S -E $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --stop-ue
/tmp
@@ -3845,7 +3828,7 @@
throughput_test min=1.0Mbits/sec max=1.0Mbits/sec average=1.0Mbits/sec
- True
+ False
EXMIMO.ALU_EPC.Bandrich.10MHz.FDD.Band_7.UL.1TX.1RX
10
@@ -3868,9 +3851,9 @@
targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.exmimo2.conf frame_type \"FDD\"
targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.exmimo2.conf nb_antennas_rx 1
targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.exmimo2.conf nb_antennas_tx 1
- targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.exmimo2.conf ENB_INTERFACE_NAME_FOR_S1_MME \"eth1\"
+ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.exmimo2.conf ENB_INTERFACE_NAME_FOR_S1_MME \"eth5\"
targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.exmimo2.conf ENB_IPV4_ADDRESS_FOR_S1_MME \"192.168.12.82/24\"
- targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.exmimo2.conf ENB_INTERFACE_NAME_FOR_S1U \"eth1\"
+ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.exmimo2.conf ENB_INTERFACE_NAME_FOR_S1U \"eth5\"
targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.exmimo2.conf ENB_IPV4_ADDRESS_FOR_S1U \"192.168.12.82/24\"
targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.exmimo2.conf ENB_PORT_FOR_S1U 2152
$OPENAIR_DIR/cmake_targets/build_oai
@@ -3883,7 +3866,7 @@
- True
+ False
/tmp
@@ -3897,14 +3880,14 @@
- True
+ False
sudo -S -E $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --stop-ue
/tmp
BUILD/EPC/epc.local.enb.conf.in MCC \"208\"
BUILD/EPC/epc.local.enb.conf.in MNC \"92\"
BUILD/EPC/epc.local.enb.conf.in TAC \"1\"
- BUILD/EPC/epc.local.enb.conf.in PGW_INTERFACE_NAME_FOR_SGI \"eth1\"
+ BUILD/EPC/epc.local.enb.conf.in PGW_INTERFACE_NAME_FOR_SGI \"eth5\"
BUILD/EPC/epc.local.enb.conf.in PGW_IPV4_ADDRESS_FOR_SGI \"192.168.12.82/24\"
SCRIPTS/build_epc
-c -l
@@ -3921,7 +3904,7 @@
throughput_test min=1.0Mbits/sec max=1.0Mbits/sec average=1.0Mbits/sec
- True
+ False
EXMIMO.ALU_EPC.Bandrich.20MHz.FDD.Band_7.UL.1TX.1RX
10
@@ -3944,9 +3927,9 @@
targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.exmimo2.conf frame_type \"FDD\"
targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.exmimo2.conf nb_antennas_rx 1
targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.exmimo2.conf nb_antennas_tx 1
- targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.exmimo2.conf ENB_INTERFACE_NAME_FOR_S1_MME \"eth1\"
+ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.exmimo2.conf ENB_INTERFACE_NAME_FOR_S1_MME \"eth5\"
targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.exmimo2.conf ENB_IPV4_ADDRESS_FOR_S1_MME \"192.168.12.82/24\"
- targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.exmimo2.conf ENB_INTERFACE_NAME_FOR_S1U \"eth1\"
+ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.exmimo2.conf ENB_INTERFACE_NAME_FOR_S1U \"eth5\"
targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.exmimo2.conf ENB_IPV4_ADDRESS_FOR_S1U \"192.168.12.82/24\"
targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.exmimo2.conf ENB_PORT_FOR_S1U 2152
$OPENAIR_DIR/cmake_targets/build_oai
@@ -3959,7 +3942,7 @@
- True
+ False
/tmp
@@ -3971,7 +3954,7 @@
$OPENAIR_DIR/cmake_targets/autotests/tools/iperf_script 1 ppp0 -s -i 1 -u -f m -B 192.172.0.2
- True
+ False
sudo -S -E $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --stop-ue
throughput_test min=4.0Mbits/sec max=5.0Mbits/sec average=4.0Mbits/sec
@@ -3992,7 +3975,7 @@
$OPENAIRCN_DIR/TEST/autotests/tools/iperf_script 60 lo -u -c 192.172.0.2 -b 10Mbits/s -B 192.172.0.1
- True
+ False
EXMIMO.ALU_EPC.Bandrich.5MHz.FDD.Band_7.DL.1TX.1RX
10
@@ -4015,9 +3998,9 @@
targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.exmimo2.conf frame_type \"FDD\"
targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.exmimo2.conf nb_antennas_rx 1
targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.exmimo2.conf nb_antennas_tx 1
- targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.exmimo2.conf ENB_INTERFACE_NAME_FOR_S1_MME \"eth1\"
+ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.exmimo2.conf ENB_INTERFACE_NAME_FOR_S1_MME \"eth5\"
targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.exmimo2.conf ENB_IPV4_ADDRESS_FOR_S1_MME \"192.168.12.82/24\"
- targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.exmimo2.conf ENB_INTERFACE_NAME_FOR_S1U \"eth1\"
+ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.exmimo2.conf ENB_INTERFACE_NAME_FOR_S1U \"eth5\"
targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.exmimo2.conf ENB_IPV4_ADDRESS_FOR_S1U \"192.168.12.82/24\"
targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.exmimo2.conf ENB_PORT_FOR_S1U 2152
$OPENAIR_DIR/cmake_targets/build_oai
@@ -4030,7 +4013,7 @@
- True
+ False
/tmp
@@ -4042,7 +4025,7 @@
$OPENAIR_DIR/cmake_targets/autotests/tools/iperf_script 1 ppp0 -s -i 1 -u -f m -B 192.172.0.2
- True
+ False
sudo -S -E $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --stop-ue
throughput_test min=8.0Mbits/sec max=9.0Mbits/sec average=8.5Mbits/sec
@@ -4063,7 +4046,7 @@
$OPENAIRCN_DIR/TEST/autotests/tools/iperf_script 60 lo -u -c 192.172.0.2 -b 10Mbits/s -B 192.172.0.1
- True
+ False
EXMIMO.ALU_EPC.Bandrich.10MHz.FDD.Band_7.DL.1TX.1RX
10
@@ -4086,9 +4069,9 @@
targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.exmimo2.conf frame_type \"FDD\"
targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.exmimo2.conf nb_antennas_rx 1
targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.exmimo2.conf nb_antennas_tx 1
- targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.exmimo2.conf ENB_INTERFACE_NAME_FOR_S1_MME \"eth1\"
+ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.exmimo2.conf ENB_INTERFACE_NAME_FOR_S1_MME \"eth5\"
targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.exmimo2.conf ENB_IPV4_ADDRESS_FOR_S1_MME \"192.168.12.82/24\"
- targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.exmimo2.conf ENB_INTERFACE_NAME_FOR_S1U \"eth1\"
+ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.exmimo2.conf ENB_INTERFACE_NAME_FOR_S1U \"eth5\"
targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.exmimo2.conf ENB_IPV4_ADDRESS_FOR_S1U \"192.168.12.82/24\"
targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.exmimo2.conf ENB_PORT_FOR_S1U 2152
$OPENAIR_DIR/cmake_targets/build_oai
@@ -4101,7 +4084,7 @@
- True
+ False
/tmp
@@ -4113,7 +4096,7 @@
$OPENAIR_DIR/cmake_targets/autotests/tools/iperf_script 1 ppp0 -s -i 1 -u -f m -B 192.172.0.2
- True
+ False
sudo -S -E $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --stop-ue
throughput_test min=15.0Mbits/sec max=15.0Mbits/sec average=15.0Mbits/sec
@@ -4134,7 +4117,7 @@
$OPENAIRCN_DIR/TEST/autotests/tools/iperf_script 60 lo -u -c 192.172.0.2 -b 10Mbits/s -B 192.172.0.1
- True
+ False
EXMIMO.ALU_EPC.Bandrich.20MHz.FDD.Band_7.DL.1TX.1RX
10
@@ -4159,14 +4142,14 @@
targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.exmimo2.conf frame_type \"FDD\"
targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.exmimo2.conf nb_antennas_rx 1
targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.exmimo2.conf nb_antennas_tx 1
- targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.exmimo2.conf ENB_INTERFACE_NAME_FOR_S1_MME \"eth1\"
+ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.exmimo2.conf ENB_INTERFACE_NAME_FOR_S1_MME \"eth5\"
targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.exmimo2.conf ENB_IPV4_ADDRESS_FOR_S1_MME \"192.168.12.82/24\"
- targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.exmimo2.conf ENB_INTERFACE_NAME_FOR_S1U \"eth1\"
+ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.exmimo2.conf ENB_INTERFACE_NAME_FOR_S1U \"eth5\"
targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.exmimo2.conf ENB_IPV4_ADDRESS_FOR_S1U \"192.168.12.82/24\"
targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.exmimo2.conf ENB_PORT_FOR_S1U 2152
$OPENAIR_DIR/cmake_targets/build_oai
--eNB -w EXMIMO -x -c
- sleep 15; sudo -E -S $OPENAIR_DIR/cmake_targets/tools/init_exmimo2; dmesg|tail
+ sleep 15; sudo -E -S $OPENAIR_DIR/cmake_targets/tools/init_exmimo2; dmesg|tail ; cp $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.exmimo2.conf $OPENAIR_TESTDIR/enb.conf
$OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem
-O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.exmimo2.conf -W
@@ -4206,13 +4189,13 @@
$OPENAIRCN_DIR/SCRIPTS/build_epc
-c -l
$OPENAIRCN_DIR/SCRIPTS/build_hss
- -c -l
+ -c -l --debug --random false
- sudo -E bash -c 'echo 3 > /proc/sys/vm/drop_caches' ; sudo -E ifconfig eth1 add 192.172.0.1
+ sudo -E bash -c 'echo 3 > /proc/sys/vm/drop_caches' ; sudo -E ifconfig eth0 add 192.172.0.1 ;cp $OPENAIRCN_DIR/BUILD/EPC/epc.conf.in $OPENAIRCN_TESTDIR/epc.conf.in
$OPENAIRCN_DIR/SCRIPTS/run_epc
-r
- sleep 10; $OPENAIRCN_DIR/SCRIPTS/run_hss
+ sleep 10; $OPENAIRCN_DIR/SCRIPTS/run_hss --export-db $OPENAIRCN_TESTDIR/hss_export.db
$OPENAIRCN_DIR/TEST/autotests/tools/iperf_script 5 lo -s -i 1 -u -f m -B 192.172.0.1
@@ -4243,14 +4226,14 @@
targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.exmimo2.conf frame_type \"FDD\"
targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.exmimo2.conf nb_antennas_rx 1
targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.exmimo2.conf nb_antennas_tx 1
- targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.exmimo2.conf ENB_INTERFACE_NAME_FOR_S1_MME \"eth1\"
+ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.exmimo2.conf ENB_INTERFACE_NAME_FOR_S1_MME \"eth5\"
targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.exmimo2.conf ENB_IPV4_ADDRESS_FOR_S1_MME \"192.168.12.82/24\"
- targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.exmimo2.conf ENB_INTERFACE_NAME_FOR_S1U \"eth1\"
+ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.exmimo2.conf ENB_INTERFACE_NAME_FOR_S1U \"eth5\"
targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.exmimo2.conf ENB_IPV4_ADDRESS_FOR_S1U \"192.168.12.82/24\"
targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.exmimo2.conf ENB_PORT_FOR_S1U 2152
$OPENAIR_DIR/cmake_targets/build_oai
--eNB -w EXMIMO -x -c
- sleep 15; sudo -E -S $OPENAIR_DIR/cmake_targets/tools/init_exmimo2 ; dmesg|tail
+ sleep 15; sudo -E -S $OPENAIR_DIR/cmake_targets/tools/init_exmimo2 ; dmesg|tail; cp $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.exmimo2.conf $OPENAIR_TESTDIR/enb.conf
$OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem
-O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.exmimo2.conf -W
@@ -4289,13 +4272,13 @@
$OPENAIRCN_DIR/SCRIPTS/build_epc
-c -l
$OPENAIRCN_DIR/SCRIPTS/build_hss
- -c -l
+ -c -l --debug --random false
- sudo -E bash -c 'echo 3 > /proc/sys/vm/drop_caches' ;sudo -E ifconfig eth1 add 192.172.0.1
+ sudo -E bash -c 'echo 3 > /proc/sys/vm/drop_caches' ;sudo -E ifconfig eth0 add 192.172.0.1 ; cp $OPENAIRCN_DIR/BUILD/EPC/epc.conf.in $OPENAIRCN_TESTDIR/epc.conf.in
$OPENAIRCN_DIR/SCRIPTS/run_epc
-r
- sleep 10; $OPENAIRCN_DIR/SCRIPTS/run_hss
+ sleep 10; $OPENAIRCN_DIR/SCRIPTS/run_hss --export-db $OPENAIRCN_TESTDIR/hss_export.db
$OPENAIRCN_DIR/TEST/autotests/tools/iperf_script 5 lo -s -i 1 -u -f m -B 192.172.0.1
@@ -4324,14 +4307,14 @@
targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.exmimo2.conf frame_type \"FDD\"
targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.exmimo2.conf nb_antennas_rx 1
targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.exmimo2.conf nb_antennas_tx 1
- targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.exmimo2.conf ENB_INTERFACE_NAME_FOR_S1_MME \"eth1\"
+ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.exmimo2.conf ENB_INTERFACE_NAME_FOR_S1_MME \"eth5\"
targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.exmimo2.conf ENB_IPV4_ADDRESS_FOR_S1_MME \"192.168.12.82/24\"
- targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.exmimo2.conf ENB_INTERFACE_NAME_FOR_S1U \"eth1\"
+ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.exmimo2.conf ENB_INTERFACE_NAME_FOR_S1U \"eth5\"
targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.exmimo2.conf ENB_IPV4_ADDRESS_FOR_S1U \"192.168.12.82/24\"
targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.exmimo2.conf ENB_PORT_FOR_S1U 2152
$OPENAIR_DIR/cmake_targets/build_oai
--eNB -w EXMIMO -x -c
- sleep 15; sudo -E -S $OPENAIR_DIR/cmake_targets/tools/init_exmimo2 ; dmesg|tail
+ sleep 15; sudo -E -S $OPENAIR_DIR/cmake_targets/tools/init_exmimo2 ; dmesg|tail ; cp $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.exmimo2.conf $OPENAIR_TESTDIR/enb.conf
$OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem
-O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.exmimo2.conf -W
@@ -4370,13 +4353,13 @@
$OPENAIRCN_DIR/SCRIPTS/build_epc
-c -l
$OPENAIRCN_DIR/SCRIPTS/build_hss
- -c -l
+ -c -l --debug --random false
- sudo -E bash -c 'echo 3 > /proc/sys/vm/drop_caches' ; sudo -E ifconfig eth1 add 192.172.0.1
+ sudo -E bash -c 'echo 3 > /proc/sys/vm/drop_caches' ; sudo -E ifconfig eth0 add 192.172.0.1 ; cp $OPENAIRCN_DIR/BUILD/EPC/epc.conf.in $OPENAIRCN_TESTDIR/epc.conf.in
$OPENAIRCN_DIR/SCRIPTS/run_epc
-r
- sleep 10; $OPENAIRCN_DIR/SCRIPTS/run_hss
+ sleep 10; $OPENAIRCN_DIR/SCRIPTS/run_hss --export-db $OPENAIRCN_TESTDIR/hss_export.db
$OPENAIRCN_DIR/TEST/autotests/tools/iperf_script 5 lo -s -i 1 -u -f m -B 192.172.0.1
@@ -4405,14 +4388,14 @@
targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.exmimo2.conf frame_type \"FDD\"
targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.exmimo2.conf nb_antennas_rx 1
targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.exmimo2.conf nb_antennas_tx 1
- targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.exmimo2.conf ENB_INTERFACE_NAME_FOR_S1_MME \"eth1\"
+ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.exmimo2.conf ENB_INTERFACE_NAME_FOR_S1_MME \"eth5\"
targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.exmimo2.conf ENB_IPV4_ADDRESS_FOR_S1_MME \"192.168.12.82/24\"
- targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.exmimo2.conf ENB_INTERFACE_NAME_FOR_S1U \"eth1\"
+ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.exmimo2.conf ENB_INTERFACE_NAME_FOR_S1U \"eth5\"
targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.exmimo2.conf ENB_IPV4_ADDRESS_FOR_S1U \"192.168.12.82/24\"
targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.exmimo2.conf ENB_PORT_FOR_S1U 2152
$OPENAIR_DIR/cmake_targets/build_oai
--eNB -w EXMIMO -x -c
- sleep 15; sudo -E -S $OPENAIR_DIR/cmake_targets/tools/init_exmimo2 ; dmesg|tail
+ sleep 15; sudo -E -S $OPENAIR_DIR/cmake_targets/tools/init_exmimo2 ; dmesg|tail; cp $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.exmimo2.conf $OPENAIR_TESTDIR/enb.conf
$OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem
-O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.exmimo2.conf -W
@@ -4451,13 +4434,13 @@
$OPENAIRCN_DIR/SCRIPTS/build_epc
-c -l
$OPENAIRCN_DIR/SCRIPTS/build_hss
- -c -l
+ -c -l --debug --random false
- sudo -E bash -c 'echo 3 > /proc/sys/vm/drop_caches' ;sudo -E ifconfig eth1 add 192.172.0.1
+ sudo -E bash -c 'echo 3 > /proc/sys/vm/drop_caches' ;sudo -E ifconfig eth0 add 192.172.0.1 ;cp $OPENAIRCN_DIR/BUILD/EPC/epc.conf.in $OPENAIRCN_TESTDIR/epc.conf.in
$OPENAIRCN_DIR/SCRIPTS/run_epc
-r
- sleep 10; $OPENAIRCN_DIR/SCRIPTS/run_hss
+ sleep 10; $OPENAIRCN_DIR/SCRIPTS/run_hss --export-db $OPENAIRCN_TESTDIR/hss_export.db
$OPENAIRCN_DIR/TEST/autotests/tools/iperf_script 60 lo -u -c 192.172.0.2 -b 10Mbits/s -B 192.172.0.1
@@ -4486,14 +4469,14 @@
targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.exmimo2.conf frame_type \"FDD\"
targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.exmimo2.conf nb_antennas_rx 1
targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.exmimo2.conf nb_antennas_tx 1
- targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.exmimo2.conf ENB_INTERFACE_NAME_FOR_S1_MME \"eth1\"
+ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.exmimo2.conf ENB_INTERFACE_NAME_FOR_S1_MME \"eth5\"
targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.exmimo2.conf ENB_IPV4_ADDRESS_FOR_S1_MME \"192.168.12.82/24\"
- targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.exmimo2.conf ENB_INTERFACE_NAME_FOR_S1U \"eth1\"
+ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.exmimo2.conf ENB_INTERFACE_NAME_FOR_S1U \"eth5\"
targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.exmimo2.conf ENB_IPV4_ADDRESS_FOR_S1U \"192.168.12.82/24\"
targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.exmimo2.conf ENB_PORT_FOR_S1U 2152
$OPENAIR_DIR/cmake_targets/build_oai
--eNB -w EXMIMO -x -c
- sleep 15; sudo -E -S $OPENAIR_DIR/cmake_targets/tools/init_exmimo2 ; dmesg|tail
+ sleep 15; sudo -E -S $OPENAIR_DIR/cmake_targets/tools/init_exmimo2 ; dmesg|tail; cp $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.exmimo2.conf $OPENAIR_TESTDIR/enb.conf
$OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem
-O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.exmimo2.conf -W
@@ -4532,13 +4515,13 @@
$OPENAIRCN_DIR/SCRIPTS/build_epc
-c -l
$OPENAIRCN_DIR/SCRIPTS/build_hss
- -c -l
+ -c -l --debug --random false
- sudo -E bash -c 'echo 3 > /proc/sys/vm/drop_caches' ;sudo -E ifconfig eth1 add 192.172.0.1
+ sudo -E bash -c 'echo 3 > /proc/sys/vm/drop_caches' ;sudo -E ifconfig eth0 add 192.172.0.1 ; cp $OPENAIRCN_DIR/BUILD/EPC/epc.conf.in $OPENAIRCN_TESTDIR/epc.conf.in
$OPENAIRCN_DIR/SCRIPTS/run_epc
-r
- sleep 10; $OPENAIRCN_DIR/SCRIPTS/run_hss
+ sleep 10; $OPENAIRCN_DIR/SCRIPTS/run_hss --export-db $OPENAIRCN_TESTDIR/hss_export.db
$OPENAIRCN_DIR/TEST/autotests/tools/iperf_script 60 lo -u -c 192.172.0.2 -b 10Mbits/s -B 192.172.0.1
@@ -4567,14 +4550,14 @@
targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.exmimo2.conf frame_type \"FDD\"
targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.exmimo2.conf nb_antennas_rx 1
targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.exmimo2.conf nb_antennas_tx 1
- targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.exmimo2.conf ENB_INTERFACE_NAME_FOR_S1_MME \"eth1\"
+ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.exmimo2.conf ENB_INTERFACE_NAME_FOR_S1_MME \"eth5\"
targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.exmimo2.conf ENB_IPV4_ADDRESS_FOR_S1_MME \"192.168.12.82/24\"
- targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.exmimo2.conf ENB_INTERFACE_NAME_FOR_S1U \"eth1\"
+ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.exmimo2.conf ENB_INTERFACE_NAME_FOR_S1U \"eth5\"
targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.exmimo2.conf ENB_IPV4_ADDRESS_FOR_S1U \"192.168.12.82/24\"
targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.exmimo2.conf ENB_PORT_FOR_S1U 2152
$OPENAIR_DIR/cmake_targets/build_oai
--eNB -w EXMIMO -x -c
- sleep 15; sudo -E -S $OPENAIR_DIR/cmake_targets/tools/init_exmimo2 ; dmesg|tail
+ sleep 15; sudo -E -S $OPENAIR_DIR/cmake_targets/tools/init_exmimo2 ; dmesg|tail; cp $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.exmimo2.conf $OPENAIR_TESTDIR/enb.conf
$OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem
-O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.exmimo2.conf -W
@@ -4613,15 +4596,15 @@
$OPENAIRCN_DIR/SCRIPTS/build_epc
-c -l
$OPENAIRCN_DIR/SCRIPTS/build_hss
- -c -l
+ -c -l --debug --random false
- sudo -E bash -c 'echo 3 > /proc/sys/vm/drop_caches' ;sudo -E ifconfig eth1 add 192.172.0.1
+ sudo -E bash -c 'echo 3 > /proc/sys/vm/drop_caches' ;sudo -E ifconfig eth0 add 192.172.0.1
$OPENAIRCN_DIR/SCRIPTS/run_epc
-r
- sleep 10; $OPENAIRCN_DIR/SCRIPTS/run_hss
+ sleep 10; $OPENAIRCN_DIR/SCRIPTS/run_hss --export-db $OPENAIRCN_TESTDIR/hss_export.db
- $OPENAIRCN_DIR/TEST/autotests/tools/iperf_script 60 lo -u -c 192.172.0.2 -b 10Mbits/s -B 192.172.0.1
+ $OPENAIRCN_DIR/TEST/autotests/tools/iperf_script 60 lo -u -c 192.172.0.2 -b 10Mbits/s -B 192.172.0.1; cp $OPENAIRCN_DIR/BUILD/EPC/epc.conf.in $OPENAIRCN_TESTDIR/epc.conf.in
@@ -4652,9 +4635,9 @@
targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.bladerfx40.conf nb_antennas_rx 1
targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.bladerfx40.conf nb_antennas_tx 1
targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.bladerfx40.conf pdsch_referenceSignalPower -26
- targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.bladerfx40.conf ENB_INTERFACE_NAME_FOR_S1_MME \"eth0\"
+ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.bladerfx40.conf ENB_INTERFACE_NAME_FOR_S1_MME \"eth6\"
targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.bladerfx40.conf ENB_IPV4_ADDRESS_FOR_S1_MME \"192.168.12.111/24\"
- targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.bladerfx40.conf ENB_INTERFACE_NAME_FOR_S1U \"eth0\"
+ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.bladerfx40.conf ENB_INTERFACE_NAME_FOR_S1U \"eth6\"
targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.bladerfx40.conf ENB_IPV4_ADDRESS_FOR_S1U \"192.168.12.111/24\"
targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.bladerfx40.conf ENB_PORT_FOR_S1U 2152
$OPENAIR_DIR/cmake_targets/build_oai
@@ -4728,9 +4711,9 @@
targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.bladerfx40.conf nb_antennas_rx 1
targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.bladerfx40.conf nb_antennas_tx 1
targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.bladerfx40.conf pdsch_referenceSignalPower -29
- targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.bladerfx40.conf ENB_INTERFACE_NAME_FOR_S1_MME \"eth0\"
+ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.bladerfx40.conf ENB_INTERFACE_NAME_FOR_S1_MME \"eth6\"
targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.bladerfx40.conf ENB_IPV4_ADDRESS_FOR_S1_MME \"192.168.12.111/24\"
- targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.bladerfx40.conf ENB_INTERFACE_NAME_FOR_S1U \"eth0\"
+ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.bladerfx40.conf ENB_INTERFACE_NAME_FOR_S1U \"eth6\"
targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.bladerfx40.conf ENB_IPV4_ADDRESS_FOR_S1U \"192.168.12.111/24\"
targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.bladerfx40.conf ENB_PORT_FOR_S1U 2152
$OPENAIR_DIR/cmake_targets/build_oai
@@ -4757,7 +4740,7 @@
- True
+ False
sudo -S -E $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --stop-ue
/tmp
@@ -4777,7 +4760,7 @@
throughput_test min=1.0Mbits/sec max=1.0Mbits/sec average=1.0Mbits/sec
- True
+ False
BladeRF.ALU_EPC.Bandrich.10MHz.FDD.Band_7.UL.1TX.1RX
10
@@ -4803,9 +4786,9 @@
targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.bladerfx40.conf nb_antennas_rx 1
targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.bladerfx40.conf nb_antennas_tx 1
targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.bladerfx40.conf pdsch_referenceSignalPower -32
- targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.bladerfx40.conf ENB_INTERFACE_NAME_FOR_S1_MME \"eth0\"
+ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.bladerfx40.conf ENB_INTERFACE_NAME_FOR_S1_MME \"eth6\"
targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.bladerfx40.conf ENB_IPV4_ADDRESS_FOR_S1_MME \"192.168.12.111/24\"
- targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.bladerfx40.conf ENB_INTERFACE_NAME_FOR_S1U \"eth0\"
+ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.bladerfx40.conf ENB_INTERFACE_NAME_FOR_S1U \"eth6\"
targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.bladerfx40.conf ENB_IPV4_ADDRESS_FOR_S1U \"192.168.12.111/24\"
targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.bladerfx40.conf ENB_PORT_FOR_S1U 2152
$OPENAIR_DIR/cmake_targets/build_oai
@@ -4832,7 +4815,7 @@
- True
+ False
sudo -S -E $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --stop-ue
/tmp
@@ -4852,7 +4835,7 @@
throughput_test min=1.0Mbits/sec max=1.0Mbits/sec average=1.0Mbits/sec
- True
+ False
BladeRF.ALU_EPC.Bandrich.20MHz.FDD.Band_7.UL.1TX.1RX
10
@@ -4878,9 +4861,9 @@
targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.bladerfx40.conf nb_antennas_rx 1
targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.bladerfx40.conf nb_antennas_tx 1
targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.bladerfx40.conf pdsch_referenceSignalPower -26
- targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.bladerfx40.conf ENB_INTERFACE_NAME_FOR_S1_MME \"eth0\"
+ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.bladerfx40.conf ENB_INTERFACE_NAME_FOR_S1_MME \"eth6\"
targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.bladerfx40.conf ENB_IPV4_ADDRESS_FOR_S1_MME \"192.168.12.111/24\"
- targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.bladerfx40.conf ENB_INTERFACE_NAME_FOR_S1U \"eth0\"
+ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.bladerfx40.conf ENB_INTERFACE_NAME_FOR_S1U \"eth6\"
targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.bladerfx40.conf ENB_IPV4_ADDRESS_FOR_S1U \"192.168.12.111/24\"
targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.bladerfx40.conf ENB_PORT_FOR_S1U 2152
$OPENAIR_DIR/cmake_targets/build_oai
@@ -4905,7 +4888,7 @@
$OPENAIR_DIR/cmake_targets/autotests/tools/iperf_script 1 ppp0 -s -i 1 -u -f m -B 192.172.0.2
- True
+ False
sudo -S -E $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --stop-ue
throughput_test min=4.0Mbits/sec max=5.0Mbits/sec average=4.0Mbits/sec
@@ -4926,7 +4909,7 @@
$OPENAIRCN_DIR/TEST/autotests/tools/iperf_script 60 lo -u -c 192.172.0.2 -b 10Mbits/s -B 192.172.0.1
- True
+ False
BladeRF.ALU_EPC.Bandrich.5MHz.FDD.Band_7.DL.1TX.1RX
10
@@ -4952,9 +4935,9 @@
targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.bladerfx40.conf nb_antennas_rx 1
targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.bladerfx40.conf nb_antennas_tx 1
targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.bladerfx40.conf pdsch_referenceSignalPower -29
- targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.bladerfx40.conf ENB_INTERFACE_NAME_FOR_S1_MME \"eth0\"
+ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.bladerfx40.conf ENB_INTERFACE_NAME_FOR_S1_MME \"eth6\"
targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.bladerfx40.conf ENB_IPV4_ADDRESS_FOR_S1_MME \"192.168.12.111/24\"
- targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.bladerfx40.conf ENB_INTERFACE_NAME_FOR_S1U \"eth0\"
+ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.bladerfx40.conf ENB_INTERFACE_NAME_FOR_S1U \"eth6\"
targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.bladerfx40.conf ENB_IPV4_ADDRESS_FOR_S1U \"192.168.12.111/24\"
targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.bladerfx40.conf ENB_PORT_FOR_S1U 2152
$OPENAIR_DIR/cmake_targets/build_oai
@@ -4980,7 +4963,7 @@
throughput_test min=8.0Mbits/sec max=9.0Mbits/sec average=8.5Mbits/sec
- True
+ False
sudo -S -E $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --stop-ue
@@ -5000,7 +4983,7 @@
$OPENAIRCN_DIR/TEST/autotests/tools/iperf_script 60 lo -u -c 192.172.0.2 -b 10Mbits/s -B 192.172.0.1
- True
+ False
BladeRF.ALU_EPC.Bandrich.10MHz.FDD.Band_7.DL.1TX.1RX
10
@@ -5026,9 +5009,9 @@
targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.bladerfx40.conf nb_antennas_rx 1
targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.bladerfx40.conf nb_antennas_tx 1
targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.bladerfx40.conf pdsch_referenceSignalPower -32
- targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.bladerfx40.conf ENB_INTERFACE_NAME_FOR_S1_MME \"eth0\"
+ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.bladerfx40.conf ENB_INTERFACE_NAME_FOR_S1_MME \"eth6\"
targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.bladerfx40.conf ENB_IPV4_ADDRESS_FOR_S1_MME \"192.168.12.111/24\"
- targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.bladerfx40.conf ENB_INTERFACE_NAME_FOR_S1U \"eth0\"
+ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.bladerfx40.conf ENB_INTERFACE_NAME_FOR_S1U \"eth6\"
targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.bladerfx40.conf ENB_IPV4_ADDRESS_FOR_S1U \"192.168.12.111/24\"
targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.bladerfx40.conf ENB_PORT_FOR_S1U 2152
$OPENAIR_DIR/cmake_targets/build_oai
@@ -5055,7 +5038,7 @@
throughput_test min=15.0Mbits/sec max=15.0Mbits/sec average=15.0Mbits/sec
- True
+ False
sudo -S -E $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --stop-ue
@@ -5075,11 +5058,972 @@
$OPENAIRCN_DIR/TEST/autotests/tools/iperf_script 60 lo -u -c 192.172.0.2 -b 10Mbits/s -B 192.172.0.1
- True
+ False
BladeRF.ALU_EPC.Bandrich.20MHz.FDD.Band_7.DL.1TX.1RX
10
+
+ lte-softmodem
+
+ mozart
+ stevens
+ amerique
+ 390
+ /tmp
+ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.lmssdr.conf tracking_area_code \"1\"
+ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.lmssdr.conf mobile_country_code \"208\"
+ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.lmssdr.conf mobile_network_code \"92\"
+ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.lmssdr.conf N_RB_DL 25
+ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.lmssdr.conf mme_ip_address "ipv4=\"192.168.12.26\";ipv6=\"192:168:30::17\";active=\"yes\";preference=\"ipv4\";"
+ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.lmssdr.conf downlink_frequency 2660000000L
+ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.lmssdr.conf uplink_frequency_offset -120000000
+ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.lmssdr.conf tx_gain 60
+ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.lmssdr.conf rx_gain 111
+ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.lmssdr.conf frame_type \"FDD\"
+ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.lmssdr.conf nb_antennas_rx 1
+ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.lmssdr.conf nb_antennas_tx 1
+ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.lmssdr.conf pdsch_referenceSignalPower -26
+ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.lmssdr.conf ENB_INTERFACE_NAME_FOR_S1_MME \"eth6\"
+ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.lmssdr.conf ENB_IPV4_ADDRESS_FOR_S1_MME \"192.168.12.111/24\"
+ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.lmssdr.conf ENB_INTERFACE_NAME_FOR_S1U \"eth6\"
+ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.lmssdr.conf ENB_IPV4_ADDRESS_FOR_S1U \"192.168.12.111/24\"
+ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.lmssdr.conf ENB_PORT_FOR_S1U 2152
+ $OPENAIR_DIR/cmake_targets/build_oai
+ --eNB -w LMSSDR -x -c
+
+
+ sudo -E chrt -f 99 $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem
+ -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.lmssdr.conf -W
+
+
+
+
+ False
+
+ /tmp
+
+
+
+
+
+ $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --reset-ue; $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --stop-ue ; sleep 10; $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --start-ue
+
+ $OPENAIR_DIR/cmake_targets/autotests/tools/iperf_script 1 ppp0 -u -c 192.172.0.1 -b 10Mbits/s -B 192.172.0.2
+
+
+
+ False
+ sudo -S -E $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --stop-ue
+
+ /tmp
+
+
+
+
+
+
+
+
+ /opt/ltebox/tools/stop_ltebox ; /opt/ltebox/tools/start_ltebox ; sleep 3000
+
+ /opt/hss_sim0609/starthss >> /dev/null ; sleep 3000
+
+ $OPENAIRCN_DIR/TEST/autotests/tools/iperf_script 5 lo -s -i 1 -u -f m -B 192.172.0.1
+
+ throughput_test min=1.0Mbits/sec max=1.0Mbits/sec average=1.0Mbits/sec
+
+ False
+ SoDeRa.ALU_EPC.Bandrich.5MHz.FDD.Band_7.UL.1TX.1RX
+ 10
+
+
+
+
+ lte-softmodem
+
+ mozart
+ stevens
+ amerique
+ 390
+ /tmp
+ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.lmssdr.conf tracking_area_code \"1\"
+ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.lmssdr.conf mobile_country_code \"208\"
+ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.lmssdr.conf mobile_network_code \"92\"
+ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.lmssdr.conf N_RB_DL 50
+ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.lmssdr.conf mme_ip_address "ipv4=\"192.168.12.26\";ipv6=\"192:168:30::17\";active=\"yes\";preference=\"ipv4\";"
+ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.lmssdr.conf downlink_frequency 2660000000L
+ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.lmssdr.conf uplink_frequency_offset -120000000
+ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.lmssdr.conf tx_gain 60
+ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.lmssdr.conf rx_gain 111
+ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.lmssdr.conf frame_type \"FDD\"
+ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.lmssdr.conf nb_antennas_rx 1
+ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.lmssdr.conf nb_antennas_tx 1
+ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.lmssdr.conf pdsch_referenceSignalPower -26
+ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.lmssdr.conf ENB_INTERFACE_NAME_FOR_S1_MME \"eth6\"
+ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.lmssdr.conf ENB_IPV4_ADDRESS_FOR_S1_MME \"192.168.12.111/24\"
+ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.lmssdr.conf ENB_INTERFACE_NAME_FOR_S1U \"eth6\"
+ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.lmssdr.conf ENB_IPV4_ADDRESS_FOR_S1U \"192.168.12.111/24\"
+ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.lmssdr.conf ENB_PORT_FOR_S1U 2152
+ $OPENAIR_DIR/cmake_targets/build_oai
+ --eNB -w LMSSDR -x -c
+
+
+ sudo -E chrt -f 99 $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem
+ -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.lmssdr.conf -W
+
+
+
+
+ False
+
+ /tmp
+
+
+
+
+
+ $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --reset-ue; $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --stop-ue ; sleep 10; $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --start-ue
+
+ $OPENAIR_DIR/cmake_targets/autotests/tools/iperf_script 1 ppp0 -u -c 192.172.0.1 -b 10Mbits/s -B 192.172.0.2
+
+
+
+ False
+ sudo -S -E $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --stop-ue
+
+ /tmp
+
+
+
+
+
+
+
+
+ /opt/ltebox/tools/stop_ltebox ; /opt/ltebox/tools/start_ltebox ; sleep 3000
+
+ /opt/hss_sim0609/starthss >> /dev/null ; sleep 3000
+
+ $OPENAIRCN_DIR/TEST/autotests/tools/iperf_script 5 lo -s -i 1 -u -f m -B 192.172.0.1
+
+ throughput_test min=1.0Mbits/sec max=1.0Mbits/sec average=1.0Mbits/sec
+
+ False
+ SoDeRa.ALU_EPC.Bandrich.10MHz.FDD.Band_7.UL.1TX.1RX
+ 10
+
+
+
+ lte-softmodem
+
+ mozart
+ stevens
+ amerique
+ 390
+ /tmp
+ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.lmssdr.conf tracking_area_code \"1\"
+ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.lmssdr.conf mobile_country_code \"208\"
+ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.lmssdr.conf mobile_network_code \"92\"
+ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.lmssdr.conf N_RB_DL 100
+ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.lmssdr.conf mme_ip_address "ipv4=\"192.168.12.26\";ipv6=\"192:168:30::17\";active=\"yes\";preference=\"ipv4\";"
+ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.lmssdr.conf downlink_frequency 2660000000L
+ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.lmssdr.conf uplink_frequency_offset -120000000
+ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.lmssdr.conf tx_gain 60
+ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.lmssdr.conf rx_gain 111
+ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.lmssdr.conf frame_type \"FDD\"
+ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.lmssdr.conf nb_antennas_rx 1
+ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.lmssdr.conf nb_antennas_tx 1
+ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.lmssdr.conf pdsch_referenceSignalPower -26
+ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.lmssdr.conf ENB_INTERFACE_NAME_FOR_S1_MME \"eth6\"
+ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.lmssdr.conf ENB_IPV4_ADDRESS_FOR_S1_MME \"192.168.12.111/24\"
+ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.lmssdr.conf ENB_INTERFACE_NAME_FOR_S1U \"eth6\"
+ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.lmssdr.conf ENB_IPV4_ADDRESS_FOR_S1U \"192.168.12.111/24\"
+ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.lmssdr.conf ENB_PORT_FOR_S1U 2152
+ $OPENAIR_DIR/cmake_targets/build_oai
+ --eNB -w LMSSDR -x -c
+
+
+ sudo -E chrt -f 99 $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem
+ -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.lmssdr.conf -W
+
+
+
+
+ False
+
+ /tmp
+
+
+
+
+
+ $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --reset-ue; $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --stop-ue ; sleep 10; $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --start-ue
+
+ $OPENAIR_DIR/cmake_targets/autotests/tools/iperf_script 1 ppp0 -u -c 192.172.0.1 -b 10Mbits/s -B 192.172.0.2
+
+
+
+ False
+ sudo -S -E $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --stop-ue
+
+ /tmp
+
+
+
+
+
+
+
+
+ /opt/ltebox/tools/stop_ltebox ; /opt/ltebox/tools/start_ltebox ; sleep 3000
+
+ /opt/hss_sim0609/starthss >> /dev/null ; sleep 3000
+
+ $OPENAIRCN_DIR/TEST/autotests/tools/iperf_script 5 lo -s -i 1 -u -f m -B 192.172.0.1
+
+ throughput_test min=1.0Mbits/sec max=1.0Mbits/sec average=1.0Mbits/sec
+
+ False
+ SoDeRa.ALU_EPC.Bandrich.20MHz.FDD.Band_7.UL.1TX.1RX
+ 10
+
+
+
+ lte-softmodem
+
+ mozart
+ stevens
+ amerique
+ 390
+ /tmp
+ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.lmssdr.conf tracking_area_code \"1\"
+ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.lmssdr.conf mobile_country_code \"208\"
+ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.lmssdr.conf mobile_network_code \"92\"
+ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.lmssdr.conf N_RB_DL 25
+ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.lmssdr.conf mme_ip_address "ipv4=\"192.168.12.26\";ipv6=\"192:168:30::17\";active=\"yes\";preference=\"ipv4\";"
+ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.lmssdr.conf downlink_frequency 2660000000L
+ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.lmssdr.conf uplink_frequency_offset -120000000
+ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.lmssdr.conf tx_gain 60
+ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.lmssdr.conf rx_gain 111
+ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.lmssdr.conf frame_type \"FDD\"
+ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.lmssdr.conf nb_antennas_rx 1
+ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.lmssdr.conf nb_antennas_tx 1
+ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.lmssdr.conf pdsch_referenceSignalPower -29
+ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.lmssdr.conf ENB_INTERFACE_NAME_FOR_S1_MME \"eth6\"
+ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.lmssdr.conf ENB_IPV4_ADDRESS_FOR_S1_MME \"192.168.12.111/24\"
+ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.lmssdr.conf ENB_INTERFACE_NAME_FOR_S1U \"eth6\"
+ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.lmssdr.conf ENB_IPV4_ADDRESS_FOR_S1U \"192.168.12.111/24\"
+ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.lmssdr.conf ENB_PORT_FOR_S1U 2152
+ $OPENAIR_DIR/cmake_targets/build_oai
+ --eNB -w LMSSDR -x -c
+
+
+ sudo -E chrt -f 99 $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem
+ -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.lmssdr.conf -W
+
+
+
+
+ False
+
+ /tmp
+
+
+
+
+
+ $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --reset-ue; $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --stop-ue ; sleep 10; $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --start-ue
+
+ $OPENAIR_DIR/cmake_targets/autotests/tools/iperf_script 1 ppp0 -s -i 1 -u -f m -B 192.172.0.2
+
+ False
+ sudo -S -E $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --stop-ue
+ throughput_test min=4.0Mbits/sec max=5.0Mbits/sec average=4.0Mbits/sec
+
+
+ /tmp
+
+
+
+
+
+
+
+
+ /opt/ltebox/tools/stop_ltebox ; /opt/ltebox/tools/start_ltebox ; sleep 3000
+
+ /opt/hss_sim0609/starthss >> /dev/null ; sleep 3000
+
+ $OPENAIRCN_DIR/TEST/autotests/tools/iperf_script 60 lo -u -c 192.172.0.2 -b 10Mbits/s -B 192.172.0.1
+
+
+ False
+ BladeRF.ALU_EPC.Bandrich.5MHz.FDD.Band_7.DL.1TX.1RX
+ 10
+
+
+
+ lte-softmodem
+
+ mozart
+ stevens
+ amerique
+ 390
+ /tmp
+ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.lmssdr.conf tracking_area_code \"1\"
+ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.lmssdr.conf mobile_country_code \"208\"
+ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.lmssdr.conf mobile_network_code \"92\"
+ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.lmssdr.conf N_RB_DL 50
+ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.lmssdr.conf mme_ip_address "ipv4=\"192.168.12.26\";ipv6=\"192:168:30::17\";active=\"yes\";preference=\"ipv4\";"
+ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.lmssdr.conf downlink_frequency 2660000000L
+ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.lmssdr.conf uplink_frequency_offset -120000000
+ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.lmssdr.conf tx_gain 60
+ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.lmssdr.conf rx_gain 111
+ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.lmssdr.conf frame_type \"FDD\"
+ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.lmssdr.conf nb_antennas_rx 1
+ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.lmssdr.conf nb_antennas_tx 1
+ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.lmssdr.conf pdsch_referenceSignalPower -29
+ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.lmssdr.conf ENB_INTERFACE_NAME_FOR_S1_MME \"eth6\"
+ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.lmssdr.conf ENB_IPV4_ADDRESS_FOR_S1_MME \"192.168.12.111/24\"
+ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.lmssdr.conf ENB_INTERFACE_NAME_FOR_S1U \"eth6\"
+ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.lmssdr.conf ENB_IPV4_ADDRESS_FOR_S1U \"192.168.12.111/24\"
+ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.lmssdr.conf ENB_PORT_FOR_S1U 2152
+ $OPENAIR_DIR/cmake_targets/build_oai
+ --eNB -w LMSSDR -x -c
+
+
+ sudo -E chrt -f 99 $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem
+ -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.lmssdr.conf -W
+
+
+
+
+ False
+
+ /tmp
+
+
+
+
+ $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --reset-ue; $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --stop-ue ; sleep 10; $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --start-ue
+
+ $OPENAIR_DIR/cmake_targets/autotests/tools/iperf_script 1 ppp0 -s -i 1 -u -f m -B 192.172.0.2
+
+ throughput_test min=8.0Mbits/sec max=9.0Mbits/sec average=8.5Mbits/sec
+
+ False
+ sudo -S -E $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --stop-ue
+
+
+ /tmp
+
+
+
+
+
+
+
+
+ /opt/ltebox/tools/stop_ltebox ; /opt/ltebox/tools/start_ltebox ; sleep 3000
+
+ /opt/hss_sim0609/starthss >> /dev/null ; sleep 3000
+
+ $OPENAIRCN_DIR/TEST/autotests/tools/iperf_script 60 lo -u -c 192.172.0.2 -b 10Mbits/s -B 192.172.0.1
+
+
+ False
+ SoDeRa.ALU_EPC.Bandrich.10MHz.FDD.Band_7.DL.1TX.1RX
+ 10
+
+
+
+ lte-softmodem
+
+ mozart
+ stevens
+ amerique
+ 390
+ /tmp
+ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.lmssdr.conf tracking_area_code \"1\"
+ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.lmssdr.conf mobile_country_code \"208\"
+ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.lmssdr.conf mobile_network_code \"92\"
+ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.lmssdr.conf N_RB_DL 100
+ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.lmssdr.conf mme_ip_address "ipv4=\"192.168.12.26\";ipv6=\"192:168:30::17\";active=\"yes\";preference=\"ipv4\";"
+ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.lmssdr.conf downlink_frequency 2660000000L
+ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.lmssdr.conf uplink_frequency_offset -120000000
+ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.lmssdr.conf tx_gain 60
+ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.lmssdr.conf rx_gain 111
+ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.lmssdr.conf frame_type \"FDD\"
+ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.lmssdr.conf nb_antennas_rx 1
+ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.lmssdr.conf nb_antennas_tx 1
+ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.lmssdr.conf pdsch_referenceSignalPower -29
+ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.lmssdr.conf ENB_INTERFACE_NAME_FOR_S1_MME \"eth6\"
+ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.lmssdr.conf ENB_IPV4_ADDRESS_FOR_S1_MME \"192.168.12.111/24\"
+ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.lmssdr.conf ENB_INTERFACE_NAME_FOR_S1U \"eth6\"
+ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.lmssdr.conf ENB_IPV4_ADDRESS_FOR_S1U \"192.168.12.111/24\"
+ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.lmssdr.conf ENB_PORT_FOR_S1U 2152
+ $OPENAIR_DIR/cmake_targets/build_oai
+ --eNB -w LMSSDR -x -c
+
+
+ sudo -E chrt -f 99 $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem
+ -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.lmssdr.conf -W
+
+
+
+
+ False
+
+ /tmp
+
+
+
+
+
+ $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --reset-ue; $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --stop-ue ; sleep 10; $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --start-ue
+
+ $OPENAIR_DIR/cmake_targets/autotests/tools/iperf_script 1 ppp0 -s -i 1 -u -f m -B 192.172.0.2
+
+ throughput_test min=15.0Mbits/sec max=15.0Mbits/sec average=15.0Mbits/sec
+
+ False
+ sudo -S -E $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --stop-ue
+
+
+ /tmp
+
+
+
+
+
+
+
+
+ /opt/ltebox/tools/stop_ltebox ; /opt/ltebox/tools/start_ltebox ; sleep 3000
+
+ /opt/hss_sim0609/starthss >> /dev/null ; sleep 3000
+
+ $OPENAIRCN_DIR/TEST/autotests/tools/iperf_script 60 lo -u -c 192.172.0.2 -b 10Mbits/s -B 192.172.0.1
+
+
+ False
+ SoDeRa.ALU_EPC.Bandrich.20MHz.FDD.Band_7.DL.1TX.1RX
+ 10
+
+
+
+ lte-softmodem
+
+ calisson
+ stevens
+ amerique
+ mozart
+ 390
+ /tmp
+ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.rrh.usrpb210.conf tracking_area_code \"1\"
+ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.rrh.usrpb210.conf mobile_country_code \"208\"
+ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.rrh.usrpb210.conf mobile_network_code \"92\"
+ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.rrh.usrpb210.conf N_RB_DL 25
+ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.rrh.usrpb210.conf mme_ip_address "ipv4=\"192.168.12.26\";ipv6=\"192:168:30::17\";active=\"yes\";preference=\"ipv4\";"
+ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.rrh.usrpb210.conf downlink_frequency 2660000000L
+ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.rrh.usrpb210.conf uplink_frequency_offset -120000000
+ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.rrh.usrpb210.conf tx_gain 90
+ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.rrh.usrpb210.conf rx_gain 125
+ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.rrh.usrpb210.conf pdsch_referenceSignalPower -26
+ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.rrh.usrpb210.conf frame_type \"FDD\"
+ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.rrh.usrpb210.conf nb_antennas_rx 1
+ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.rrh.usrpb210.conf nb_antennas_tx 1
+ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.rrh.usrpb210.conf ENB_INTERFACE_NAME_FOR_S1_MME \"eth6\"
+ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.rrh.usrpb210.conf ENB_IPV4_ADDRESS_FOR_S1_MME \"192.168.12.111/24\"
+ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.rrh.usrpb210.conf ENB_INTERFACE_NAME_FOR_S1U \"eth6\"
+ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.rrh.usrpb210.conf ENB_IPV4_ADDRESS_FOR_S1U \"192.168.12.111/24\"
+ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.rrh.usrpb210.conf ENB_PORT_FOR_S1U 2152
+ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.rrh.usrpb210.conf rrh_gw_config "local_if_name=\"eth0\";remote_address=\"10:60:4b:75:80:83\";local_address=\"98:90:96:df:66:07\";local_port=50000;remote_port=50000;tr_preference=\"raw\";rf_preference=\"usrp_b200\";iq_txshift=4;tx_sample_advance=70;tx_scheduling_advance=9;rrh_gw_active=\"yes\";"
+ $OPENAIR_DIR/cmake_targets/build_oai
+ --eNB -w None -t ETHERNET -x -c --disable-deadline
+
+
+ sleep 5; sudo -E chrt -f 99 $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem
+ -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.rrh.usrpb210.conf -W
+
+
+
+
+ False
+
+ $OPENAIR_DIR/cmake_targets/build_oai
+ --RRH -w USRP -t ETHERNET -c --disable-deadline
+
+
+ sudo -E chrt -f 99 $OPENAIR_DIR/cmake_targets/rrh_gw/build/rrh_gw
+ -n1 -x -m1 -i eth1
+ False
+
+
+
+ /tmp
+
+
+
+
+
+ $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --reset-ue; $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --stop-ue ; sleep 10; $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --start-ue
+
+ $OPENAIR_DIR/cmake_targets/autotests/tools/iperf_script 1 ppp0 -u -c 192.172.0.1 -b 10Mbits/s -B 192.172.0.2
+
+
+
+ False
+ sudo -S -E $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --stop-ue
+
+ /tmp
+
+
+
+
+
+
+
+
+ /opt/ltebox/tools/stop_ltebox ; /opt/ltebox/tools/start_ltebox ; sleep 3000
+
+ /opt/hss_sim0609/starthss >> /dev/null ; sleep 3000
+
+ $OPENAIRCN_DIR/TEST/autotests/tools/iperf_script 5 lo -s -i 1 -u -f m -B 192.172.0.1
+
+ throughput_test min=1.0Mbits/sec max=1.0Mbits/sec average=1.0Mbits/sec
+
+ False
+ USRPb210.RRH.ALU_EPC.Bandrich.5MHz.FDD.Band_7.UL.1TX.1RX
+ 10
+
+
+
+
+ lte-softmodem
+
+ calisson
+ mozart
+ stevens
+ amerique
+ 390
+ /tmp
+ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.rrh.usrpb210.conf tracking_area_code \"1\"
+ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.rrh.usrpb210.conf mobile_country_code \"208\"
+ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.rrh.usrpb210.conf mobile_network_code \"92\"
+ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.rrh.usrpb210.conf N_RB_DL 50
+ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.rrh.usrpb210.conf mme_ip_address "ipv4=\"192.168.12.26\";ipv6=\"192:168:30::17\";active=\"yes\";preference=\"ipv4\";"
+ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.rrh.usrpb210.conf downlink_frequency 2660000000L
+ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.rrh.usrpb210.conf uplink_frequency_offset -120000000
+ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.rrh.usrpb210.conf tx_gain 90
+ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.rrh.usrpb210.conf rx_gain 125
+ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.rrh.usrpb210.conf pdsch_referenceSignalPower -29
+ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.rrh.usrpb210.conf frame_type \"FDD\"
+ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.rrh.usrpb210.conf nb_antennas_rx 1
+ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.rrh.usrpb210.conf nb_antennas_tx 1
+ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.rrh.usrpb210.conf ENB_INTERFACE_NAME_FOR_S1_MME \"eth6\"
+ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.rrh.usrpb210.conf ENB_IPV4_ADDRESS_FOR_S1_MME \"192.168.12.111/24\"
+ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.rrh.usrpb210.conf ENB_INTERFACE_NAME_FOR_S1U \"eth6\"
+ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.rrh.usrpb210.conf ENB_IPV4_ADDRESS_FOR_S1U \"192.168.12.111/24\"
+ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.rrh.usrpb210.conf ENB_PORT_FOR_S1U 2152
+ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.rrh.usrpb210.conf rrh_gw_config "local_if_name=\"eth0\";remote_address=\"10:60:4b:75:80:83\";local_address=\"98:90:96:df:66:07\";local_port=50000;remote_port=50000;tr_preference=\"raw\";rf_preference=\"usrp_b200\";iq_txshift=4;tx_sample_advance=113;tx_scheduling_advance=9;rrh_gw_active=\"yes\";"
+ $OPENAIR_DIR/cmake_targets/build_oai
+ --eNB -w None -t ETHERNET -x -c --disable-deadline
+
+
+ sleep 5; sudo -E chrt -f 99 $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem
+ -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.rrh.usrpb210.conf -W
+
+
+
+
+ False
+
+ $OPENAIR_DIR/cmake_targets/build_oai
+ --RRH -w USRP -t ETHERNET -c --disable-deadline
+
+
+ sudo -E chrt -f 99 $OPENAIR_DIR/cmake_targets/rrh_gw/build/rrh_gw
+ -n1 -x -m1 -i eth1
+ False
+
+ /tmp
+
+
+
+
+
+ $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --reset-ue; $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --stop-ue ; sleep 10; $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --start-ue
+
+ $OPENAIR_DIR/cmake_targets/autotests/tools/iperf_script 1 ppp0 -u -c 192.172.0.1 -b 10Mbits/s -B 192.172.0.2
+
+
+
+ False
+ sudo -S -E $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --stop-ue
+
+ /tmp
+
+
+
+
+
+
+
+
+ /opt/ltebox/tools/stop_ltebox ; /opt/ltebox/tools/start_ltebox ; sleep 3000
+
+ /opt/hss_sim0609/starthss >> /dev/null ; sleep 3000
+
+ $OPENAIRCN_DIR/TEST/autotests/tools/iperf_script 5 lo -s -i 1 -u -f m -B 192.172.0.1
+
+ throughput_test min=1.0Mbits/sec max=1.0Mbits/sec average=1.0Mbits/sec
+
+ False
+ USRPb210.RRH.ALU_EPC.Bandrich.10MHz.FDD.Band_7.UL.1TX.1RX
+ 10
+
+
+
+ lte-softmodem
+
+ calisson
+ mozart
+ stevens
+ amerique
+ 390
+ /tmp
+ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.rrh.usrpb210.conf tracking_area_code \"1\"
+ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.rrh.usrpb210.conf mobile_country_code \"208\"
+ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.rrh.usrpb210.conf mobile_network_code \"92\"
+ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.rrh.usrpb210.conf N_RB_DL 100
+ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.rrh.usrpb210.conf mme_ip_address "ipv4=\"192.168.12.26\";ipv6=\"192:168:30::17\";active=\"yes\";preference=\"ipv4\";"
+ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.rrh.usrpb210.conf downlink_frequency 2660000000L
+ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.rrh.usrpb210.conf uplink_frequency_offset -120000000
+ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.rrh.usrpb210.conf tx_gain 90
+ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.rrh.usrpb210.conf rx_gain 125
+ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.rrh.usrpb210.conf pdsch_referenceSignalPower -32
+ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.rrh.usrpb210.conf frame_type \"FDD\"
+ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.rrh.usrpb210.conf nb_antennas_rx 1
+ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.rrh.usrpb210.conf nb_antennas_tx 1
+ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.rrh.usrpb210.conf ENB_INTERFACE_NAME_FOR_S1_MME \"eth6\"
+ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.rrh.usrpb210.conf ENB_IPV4_ADDRESS_FOR_S1_MME \"192.168.12.111/24\"
+ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.rrh.usrpb210.conf ENB_INTERFACE_NAME_FOR_S1U \"eth6\"
+ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.rrh.usrpb210.conf ENB_IPV4_ADDRESS_FOR_S1U \"192.168.12.111/24\"
+ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.rrh.usrpb210.conf ENB_PORT_FOR_S1U 2152
+ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.rrh.usrpb210.conf rrh_gw_config "local_if_name=\"eth0\";remote_address=\"10:60:4b:75:80:83\";local_address=\"98:90:96:df:66:07\";local_port=50000;remote_port=50000;tr_preference=\"raw\";rf_preference=\"usrp_b200\";iq_txshift=4;tx_sample_advance=115;tx_scheduling_advance=11;rrh_gw_active=\"yes\";"
+ $OPENAIR_DIR/cmake_targets/build_oai
+ --eNB -w None -t ETHERNET -x -c --disable-deadline
+
+
+ sleep 5; sudo -E chrt -f 99 $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem
+ -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.rrh.usrpb210.conf -W
+
+
+
+
+ False
+
+ $OPENAIR_DIR/cmake_targets/build_oai
+ --RRH -w USRP -t ETHERNET -c --disable-deadline
+
+
+ sudo -E chrt -f 99 $OPENAIR_DIR/cmake_targets/rrh_gw/build/rrh_gw
+ -n1 -x -m1 -i eth1
+ False
+
+ /tmp
+
+
+
+
+
+ $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --reset-ue; $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --stop-ue ; sleep 10; $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --start-ue
+
+ $OPENAIR_DIR/cmake_targets/autotests/tools/iperf_script 1 ppp0 -u -c 192.172.0.1 -b 10Mbits/s -B 192.172.0.2
+
+
+
+ False
+ sudo -S -E $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --stop-ue
+
+ /tmp
+
+
+
+
+
+
+
+
+ /opt/ltebox/tools/stop_ltebox ; /opt/ltebox/tools/start_ltebox ; sleep 3000
+
+ /opt/hss_sim0609/starthss >> /dev/null ; sleep 3000
+
+ $OPENAIRCN_DIR/TEST/autotests/tools/iperf_script 5 lo -s -i 1 -u -f m -B 192.172.0.1
+
+ throughput_test min=1.0Mbits/sec max=1.0Mbits/sec average=1.0Mbits/sec
+
+ False
+ USRPb210.RRH.ALU_EPC.Bandrich.20MHz.FDD.Band_7.UL.1TX.1RX
+ 10
+
+
+
+ lte-softmodem
+
+ calisson
+ mozart
+ stevens
+ amerique
+ 390
+ /tmp
+ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.rrh.usrpb210.conf tracking_area_code \"1\"
+ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.rrh.usrpb210.conf mobile_country_code \"208\"
+ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.rrh.usrpb210.conf mobile_network_code \"92\"
+ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.rrh.usrpb210.conf N_RB_DL 25
+ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.rrh.usrpb210.conf mme_ip_address "ipv4=\"192.168.12.26\";ipv6=\"192:168:30::17\";active=\"yes\";preference=\"ipv4\";"
+ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.rrh.usrpb210.conf downlink_frequency 2660000000L
+ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.rrh.usrpb210.conf uplink_frequency_offset -120000000
+ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.rrh.usrpb210.conf tx_gain 90
+ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.rrh.usrpb210.conf rx_gain 125
+ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.rrh.usrpb210.conf pdsch_referenceSignalPower -26
+ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.rrh.usrpb210.conf frame_type \"FDD\"
+ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.rrh.usrpb210.conf nb_antennas_rx 1
+ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.rrh.usrpb210.conf nb_antennas_tx 1
+ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.rrh.usrpb210.conf ENB_INTERFACE_NAME_FOR_S1_MME \"eth6\"
+ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.rrh.usrpb210.conf ENB_IPV4_ADDRESS_FOR_S1_MME \"192.168.12.111/24\"
+ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.rrh.usrpb210.conf ENB_INTERFACE_NAME_FOR_S1U \"eth6\"
+ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.rrh.usrpb210.conf ENB_IPV4_ADDRESS_FOR_S1U \"192.168.12.111/24\"
+ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.rrh.usrpb210.conf ENB_PORT_FOR_S1U 2152
+ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.rrh.usrpb210.conf rrh_gw_config "local_if_name=\"eth0\";remote_address=\"10:60:4b:75:80:83\";local_address=\"98:90:96:df:66:07\";local_port=50000;remote_port=50000;tr_preference=\"raw\";rf_preference=\"usrp_b200\";iq_txshift=4;tx_sample_advance=70;tx_scheduling_advance=9;rrh_gw_active=\"yes\";"
+ $OPENAIR_DIR/cmake_targets/build_oai
+ --eNB -w None -t ETHERNET -x -c --disable-deadline
+
+
+ sleep 5; sudo -E chrt -f 99 $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem
+ -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.rrh.usrpb210.conf -W
+
+
+
+
+ False
+
+ $OPENAIR_DIR/cmake_targets/build_oai
+ --RRH -w USRP -t ETHERNET -c --disable-deadline
+
+
+ sudo -E chrt -f 99 $OPENAIR_DIR/cmake_targets/rrh_gw/build/rrh_gw
+ -n1 -x -m1 -i eth1
+ False
+
+ /tmp
+
+
+
+
+
+ $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --reset-ue; $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --stop-ue ; sleep 10; $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --start-ue
+
+ $OPENAIR_DIR/cmake_targets/autotests/tools/iperf_script 1 ppp0 -s -i 1 -u -f m -B 192.172.0.2
+
+ False
+ sudo -S -E $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --stop-ue
+ throughput_test min=4.0Mbits/sec max=5.0Mbits/sec average=4.0Mbits/sec
+
+
+ /tmp
+
+
+
+
+
+
+
+
+ /opt/ltebox/tools/stop_ltebox ; /opt/ltebox/tools/start_ltebox ; sleep 3000
+
+ /opt/hss_sim0609/starthss >> /dev/null ; sleep 3000
+
+ $OPENAIRCN_DIR/TEST/autotests/tools/iperf_script 60 lo -u -c 192.172.0.2 -b 10Mbits/s -B 192.172.0.1
+
+
+ False
+ USRPb210.RRH.ALU_EPC.Bandrich.5MHz.FDD.Band_7.DL.1TX.1RX
+ 10
+
+
+
+ lte-softmodem
+
+ calisson
+ mozart
+ stevens
+ amerique
+ 390
+ /tmp
+ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.rrh.usrpb210.conf tracking_area_code \"1\"
+ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.rrh.usrpb210.conf mobile_country_code \"208\"
+ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.rrh.usrpb210.conf mobile_network_code \"92\"
+ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.rrh.usrpb210.conf N_RB_DL 50
+ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.rrh.usrpb210.conf mme_ip_address "ipv4=\"192.168.12.26\";ipv6=\"192:168:30::17\";active=\"yes\";preference=\"ipv4\";"
+ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.rrh.usrpb210.conf downlink_frequency 2660000000L
+ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.rrh.usrpb210.conf uplink_frequency_offset -120000000
+ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.rrh.usrpb210.conf tx_gain 90
+ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.rrh.usrpb210.conf rx_gain 125
+ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.rrh.usrpb210.conf pdsch_referenceSignalPower -29
+ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.rrh.usrpb210.conf frame_type \"FDD\"
+ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.rrh.usrpb210.conf nb_antennas_rx 1
+ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.rrh.usrpb210.conf nb_antennas_tx 1
+ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.rrh.usrpb210.conf ENB_INTERFACE_NAME_FOR_S1_MME \"eth6\"
+ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.rrh.usrpb210.conf ENB_IPV4_ADDRESS_FOR_S1_MME \"192.168.12.111/24\"
+ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.rrh.usrpb210.conf ENB_INTERFACE_NAME_FOR_S1U \"eth6\"
+ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.rrh.usrpb210.conf ENB_IPV4_ADDRESS_FOR_S1U \"192.168.12.111/24\"
+ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.rrh.usrpb210.conf ENB_PORT_FOR_S1U 2152
+ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.rrh.usrpb210.conf rrh_gw_config "local_if_name=\"eth0\";remote_address=\"10:60:4b:75:80:83\";local_address=\"98:90:96:df:66:07\";local_port=50000;remote_port=50000;tr_preference=\"raw\";rf_preference=\"usrp_b200\";iq_txshift=4;tx_sample_advance=113;tx_scheduling_advance=9;rrh_gw_active=\"yes\";"
+ $OPENAIR_DIR/cmake_targets/build_oai
+ --eNB -w None -t ETHERNET -x -c --disable-deadline
+
+
+ sleep 5; sudo -E chrt -f 99 $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem
+ -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.rrh.usrpb210.conf -W
+
+
+
+
+ False
+
+ $OPENAIR_DIR/cmake_targets/build_oai
+ --RRH -w USRP -t ETHERNET -c --disable-deadline
+
+
+ sudo -E chrt -f 99 $OPENAIR_DIR/cmake_targets/rrh_gw/build/rrh_gw
+ -n1 -x -m1 -i eth1
+ False
+
+ /tmp
+
+
+
+
+ $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --reset-ue; $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --stop-ue ; sleep 10; $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --start-ue
+
+ $OPENAIR_DIR/cmake_targets/autotests/tools/iperf_script 1 ppp0 -s -i 1 -u -f m -B 192.172.0.2
+
+ throughput_test min=8.0Mbits/sec max=9.0Mbits/sec average=8.5Mbits/sec
+
+ False
+ sudo -S -E $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --stop-ue
+
+
+ /tmp
+
+
+
+
+
+
+
+
+ /opt/ltebox/tools/stop_ltebox ; /opt/ltebox/tools/start_ltebox ; sleep 3000
+
+ /opt/hss_sim0609/starthss >> /dev/null ; sleep 3000
+
+ $OPENAIRCN_DIR/TEST/autotests/tools/iperf_script 60 lo -u -c 192.172.0.2 -b 10Mbits/s -B 192.172.0.1
+
+
+ False
+ USRPb210.RRH.ALU_EPC.Bandrich.10MHz.FDD.Band_7.DL.1TX.1RX
+ 10
+
+
+
+ lte-softmodem
+
+ calisson
+ mozart
+ stevens
+ amerique
+ 390
+ /tmp
+ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.rrh.usrpb210.conf tracking_area_code \"1\"
+ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.rrh.usrpb210.conf mobile_country_code \"208\"
+ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.rrh.usrpb210.conf mobile_network_code \"92\"
+ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.rrh.usrpb210.conf N_RB_DL 100
+ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.rrh.usrpb210.conf mme_ip_address "ipv4=\"192.168.12.26\";ipv6=\"192:168:30::17\";active=\"yes\";preference=\"ipv4\";"
+ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.rrh.usrpb210.conf downlink_frequency 2660000000L
+ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.rrh.usrpb210.conf uplink_frequency_offset -120000000
+ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.rrh.usrpb210.conf tx_gain 90
+ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.rrh.usrpb210.conf rx_gain 125
+ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.rrh.usrpb210.conf pdsch_referenceSignalPower -32
+ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.rrh.usrpb210.conf frame_type \"FDD\"
+ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.rrh.usrpb210.conf nb_antennas_rx 1
+ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.rrh.usrpb210.conf nb_antennas_tx 1
+ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.rrh.usrpb210.conf ENB_INTERFACE_NAME_FOR_S1_MME \"eth6\"
+ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.rrh.usrpb210.conf ENB_IPV4_ADDRESS_FOR_S1_MME \"192.168.12.111/24\"
+ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.rrh.usrpb210.conf ENB_INTERFACE_NAME_FOR_S1U \"eth6\"
+ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.rrh.usrpb210.conf ENB_IPV4_ADDRESS_FOR_S1U \"192.168.12.111/24\"
+ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.rrh.usrpb210.conf ENB_PORT_FOR_S1U 2152
+ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.rrh.usrpb210.conf rrh_gw_config "local_if_name=\"eth0\";remote_address=\"10:60:4b:75:80:83\";local_address=\"98:90:96:df:66:07\";local_port=50000;remote_port=50000;tr_preference=\"raw\";rf_preference=\"usrp_b200\";iq_txshift=4;tx_sample_advance=115;tx_scheduling_advance=11;rrh_gw_active=\"yes\";"
+ $OPENAIR_DIR/cmake_targets/build_oai
+ --eNB -w None -t ETHERNET -x -c --disable-deadline
+
+
+ sleep 5; $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem
+ -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.rrh.usrpb210.conf -W
+
+
+
+
+ False
+
+ $OPENAIR_DIR/cmake_targets/build_oai
+ --RRH -w USRP -t ETHERNET -c --disable-deadline
+
+
+ sudo -E chrt -f 99 $OPENAIR_DIR/cmake_targets/rrh_gw/build/rrh_gw
+ -n1 -x -m1 -i eth1
+ False
+
+ /tmp
+
+
+
+
+
+ $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --reset-ue; $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --stop-ue ; sleep 10; $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --start-ue
+
+ $OPENAIR_DIR/cmake_targets/autotests/tools/iperf_script 1 ppp0 -s -i 1 -u -f m -B 192.172.0.2
+
+ throughput_test min=15.0Mbits/sec max=15.0Mbits/sec average=15.0Mbits/sec
+
+ False
+ sudo -S -E $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --stop-ue
+
+
+ /tmp
+
+
+
+
+
+
+
+
+ /opt/ltebox/tools/stop_ltebox ; /opt/ltebox/tools/start_ltebox ; sleep 3000
+
+ /opt/hss_sim0609/starthss >> /dev/null ; sleep 3000
+
+ $OPENAIRCN_DIR/TEST/autotests/tools/iperf_script 60 lo -u -c 192.172.0.2 -b 10Mbits/s -B 192.172.0.1
+
+
+ False
+ USRPb210.RRH.ALU_EPC.Bandrich.20MHz.FDD.Band_7.DL.1TX.1RX
+ 10
+
+
+
diff --git a/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py b/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py
index 6af3785865..99aed7c29f 100755
--- a/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py
+++ b/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py
@@ -131,6 +131,7 @@ def start_ue () :
ip = IPRoute()
idx = ip.link_lookup(ifname=iface)[0]
os.system ('route add ' + gw + ' ppp0')
+ os.system('sleep 5')
os.system ('ping ' + gw)
break
except Exception, e:
diff --git a/cmake_targets/autotests/tools/configure_cots_huaweiE398_ue.py b/cmake_targets/autotests/tools/configure_cots_huaweiE398_ue.py
new file mode 100755
index 0000000000..07d532c5d6
--- /dev/null
+++ b/cmake_targets/autotests/tools/configure_cots_huaweiE398_ue.py
@@ -0,0 +1,200 @@
+#!/usr/bin/python
+
+import time
+import serial
+import os
+from pyroute2 import IPRoute
+import sys
+import re
+import threading
+import signal
+import traceback
+import os
+import commands
+
+# configure the serial connections (the parameters differs on the device you are connecting to)
+#First we find an open port to work with
+serial_port=''
+ser=serial.Serial()
+openair_dir = os.environ.get('OPENAIR_DIR')
+if openair_dir == None:
+ print "Error getting OPENAIR_DIR environment variable"
+ sys.exit(1)
+
+sys.path.append(os.path.expandvars('$OPENAIR_DIR/cmake_targets/autotests/tools/'))
+
+from lib_autotest import *
+
+def find_open_port():
+ global serial_port, ser
+ max_ports=100
+ if os.path.exists(serial_port) == True:
+ return serial_port
+ for port in range(0,100):
+ serial_port = '/dev/ttyUSB'+str(port)
+ if os.path.exists(serial_port) == True:
+ print 'New Serial Port : ' + serial_port
+ break
+
+ ser = serial.Serial(port=serial_port)
+ return
+
+
+
+#serial_port = '/dev/ttyUSB2'
+bandrich_ppd_config = os.environ.get('OPENAIR_DIR') + '/cmake_targets/autotests/tools/wdial.bandrich.conf'
+
+exit_flag=0
+
+def signal_handler(signal, frame):
+ print('You pressed Ctrl+C!')
+ print('Resetting the UE to detached state')
+ timeout=10
+ exit_flag=1
+ send_command('AT+CGATT=0' , 'OK' , timeout)
+ sys.exit(0)
+
+signal.signal(signal.SIGINT, signal_handler)
+
+
+
+#ser.open()
+#ser.isOpen()
+
+class pppThread (threading.Thread):
+ def __init__(self, threadID, name, counter):
+ threading.Thread.__init__(self)
+ self.threadID = threadID
+ self.name = name
+ self.counter = counter
+ def run(self):
+ print "Starting " + self.name
+ #Here we keep running pppd thread in indefinite loop as this script terminates sometimes
+ #while 1:
+ while 1:
+ time.sleep(5) #Hard coded, do not reduce this number!
+ print "Starting wvdial now..."
+ print 'exit_flag = ' + str(exit_flag)
+ send_command('AT+CGATT=1','OK', 300)
+ os.system('wvdial -C ' + bandrich_ppd_config + '' )
+ if exit_flag == 1:
+ print "Exit flag set to true. Exiting pppThread now"
+ print "Terminating wvdial now..."
+
+def send_command (cmd, response, timeout):
+ count=0
+ sleep_duration = 1
+ print 'In function: send_command: cmd = <' + cmd + '> response: <' + response + '> \n'
+ global serial_port, ser
+ while count <= timeout:
+ try:
+ #Sometimes the port does not exist coz of reset in modem.
+ #In that case, we need to search for this port again
+ if os.path.exists(serial_port) == False:
+ find_open_port()
+ ser.write (cmd + '\r\n')
+ out = ''
+ time.sleep(sleep_duration)
+ count = count + sleep_duration
+ while ser.inWaiting() > 0:
+ out += ser.read(1)
+ print 'out = <' + out + '> response = <' + response + '> \n'
+ if re.search(response, out):
+ break
+ except Exception, e:
+ error = ' cmd : ' + cmd + ' response : ' + response
+ error = error + ' In function: ' + sys._getframe().f_code.co_name + ': *** Caught exception: ' + str(e.__class__) + " : " + str( e)
+ error = error + traceback.format_exc()
+ print error
+
+
+def start_ue () :
+ #print 'Enter your commands below.\r\nInsert "exit" to leave the application.'
+ timeout=60 #timeout in seconds
+ send_command('AT', 'OK' , timeout)
+ #send_command('AT+CFUN=1' , 'OK' , timeout)
+ #send_command('AT+CGATT=0' , 'OK' , timeout)
+ send_command('AT+CGATT=1','OK', 300)
+ #os.system('wvdial -C ' + bandrich_ppd_config + ' &' )
+
+ thread_ppp = pppThread(1, "ppp_thread", 1)
+ thread_ppp.start()
+
+ iface='ppp0'
+
+ while 1:
+ time.sleep ( 2)
+ #Now we check if ppp0 interface is up and running
+ try:
+ if exit_flag == 1:
+ break
+ ip = IPRoute()
+ idx = ip.link_lookup(ifname=iface)[0]
+ os.system ('route add ' + gw + ' ppp0')
+ os.system('sleep 5')
+ os.system ('ping ' + gw)
+ break
+ except Exception, e:
+ error = ' Interface ' + iface + 'does not exist...'
+ error = error + ' In function: ' + sys._getframe().f_code.co_name + ': *** Caught exception: ' + str(e.__class__) + " : " + str( e)
+ error = error + traceback.format_exc()
+ print error
+
+ thread_ppp.join()
+
+def stop_ue():
+ timeout=60
+ os.system('killall wvdial')
+ send_command('AT', 'OK' , timeout)
+ send_command('AT+CGATT=0' , 'OK|ERROR' , timeout)
+ #send_command('AT+CFUN=4' , 'OK' , timeout)
+
+
+#reset the USB BUS of Bandrich UE
+def reset_ue():
+ stringIdBandrich='Huawei Technologies Co., Ltd. E398 LTE/UMTS/GSM Modem/Networkcard'
+ status, out = commands.getstatusoutput('lsusb | grep -i \'' + stringIdBandrich + '\'')
+ if (out == '') :
+ print "Bandrich 4G LTE Adapter not found. Exiting now..."
+ sys.exit()
+ p=re.compile('Bus\s*(\w+)\s*Device\s*(\w+):\s*ID\s*(\w+):(\w+)')
+ res=p.findall(out)
+ BusId=res[0][0]
+ DeviceId=res[0][1]
+ VendorId=res[0][2]
+ ProductId=res[0][3]
+ usb_dir= find_usb_path(VendorId, ProductId)
+ print "Bandrich 4G LTE Adapter found in..." + usb_dir
+ cmd = "sudo sh -c \"echo 0 > " + usb_dir + "/authorized\""
+ os.system(cmd + " ; sleep 15" )
+ cmd = "sudo sh -c \"echo 1 > " + usb_dir + "/authorized\""
+ os.system(cmd + " ; sleep 30" )
+
+i=1
+gw='192.172.0.1'
+while i < len(sys.argv):
+ arg=sys.argv[i]
+ if arg == '--start-ue' :
+ find_open_port()
+ print 'Using Serial port : ' + serial_port
+ start_ue()
+ elif arg == '--stop-ue' :
+ find_open_port()
+ print 'Using Serial port : ' + serial_port
+ stop_ue()
+ elif arg == '--reset-ue' :
+ reset_ue()
+ elif arg == '-gw' :
+ gw = sys.argv[i+1]
+ i=i+1
+ elif arg == '-h' :
+ print "--reset-ue: Reset the UE on USB Bus. Similar to unplugging and plugging the UE"
+ print "--stop-ue: Stop the UE. Send DETACH command"
+ print "--start-ue: Start the UE. Send ATTACH command"
+ print "-gw: Specify the default gw as sometimes the gateway/route arguments are not set properly via wvdial"
+ else :
+ print " Script called with wrong arguments, arg = " + arg
+ sys.exit()
+ i = i +1
+
+
diff --git a/cmake_targets/autotests/tools/search_repl.py b/cmake_targets/autotests/tools/search_repl.py
index bb807502f2..be0568599f 100755
--- a/cmake_targets/autotests/tools/search_repl.py
+++ b/cmake_targets/autotests/tools/search_repl.py
@@ -26,6 +26,9 @@ if keyword == 'mme_ip_address':
elif keyword == 'IPV4_LIST':
replacement_text = keyword + ' = ( ' + replacement_text + ' ) ; '
string = re.sub(r"IPV4_LIST\s*=\s*\(([^\$]+?)\)\s*;", replacement_text, string, re.M)
+elif keyword == 'rrh_gw_config':
+ replacement_text = keyword + ' = ( { ' + replacement_text + ' } ) ; '
+ string = re.sub(r"rrh_gw_config\s*=\s*\(([^\$]+?)\)\s*;", replacement_text, string, re.M)
else :
replacement_text = keyword + ' = ' + replacement_text + ' ; '
string = re.sub(r"%s\s*=\s*([^\$]+?)\s*;" % keyword , replacement_text, string, re.M)
diff --git a/cmake_targets/build_oai b/cmake_targets/build_oai
index 0f7af3305a..821b3bca27 100755
--- a/cmake_targets/build_oai
+++ b/cmake_targets/build_oai
@@ -42,13 +42,13 @@ THIS_SCRIPT_PATH=$(dirname $(readlink -f $0))
source $THIS_SCRIPT_PATH/tools/build_helper
MSC_GEN="False"
-XFORMS="False"
+XFORMS="True"
PRINT_STATS="False"
VCD_TIMING="False"
LOWLATENCY_FLAG_USER="False"
FORCE_LOWLATENCY_FLAG_USER=""
REL="Rel10"
-HW="EXMIMO"
+HW="None"
TP="None"
NOS1=0
EPC=0
@@ -91,7 +91,7 @@ Options
default is Rel10,
Rel8 limits the implementation to 3GPP Release 8 version
-w | --hardware
- EXMIMO (Default), USRP, BLADERF, None
+ EXMIMO, USRP, BLADERF, ETHERNET, LMSSDR, None (Default)
Adds this RF board support (in external packages installation and in compilation)
-t | --transport protocol
ETHERNET , None
@@ -181,7 +181,7 @@ function main() {
-w | --hardware)
HW="$2" #"${i#*=}"
# Use OAI_USRP as the key word USRP is used inside UHD driver
- if [ "$HW" != "BLADERF" -a "$HW" != "USRP" -a "$HW" != "None" -a "$HW" != "EXMIMO" ] ; then
+ if [ "$HW" != "BLADERF" -a "$HW" != "USRP" -a "$HW" != "LMSSDR" -a "$HW" != "None" -a "$HW" != "EXMIMO" ] ; then
echo_fatal "Unknown HW type $HW will exit..."
else
if [ "$HW" == "USRP" ] ; then
@@ -190,6 +190,9 @@ function main() {
if [ "$HW" == "BLADERF" ] ; then
HW="OAI_BLADERF"
fi
+ if [ "$HW" == "LMSSDR" ] ; then
+ HW="OAI_LMSSDR"
+ fi
echo_info "Setting hardware to: $HW"
fi
shift 2;;
@@ -299,6 +302,7 @@ function main() {
fi
fi
+ echo_info "RF HW set to $HW"
#Now we set flags to enable deadline scheduler settings
#By default: USRP: disable,
#By default: BLADERF: enable,
@@ -312,6 +316,8 @@ function main() {
LOWLATENCY_FLAG_USER="False"
elif [ "$HW" = "OAI_BLADERF" ] ; then
LOWLATENCY_FLAG_USER="False"
+ elif [ "$HW" = "OAI_LMSSDR" ] ; then
+ LOWLATENCY_FLAG_USER="False"
elif [ "$HW" = "None" ] ; then
LOWLATENCY_FLAG_USER="False"
else
@@ -689,6 +695,16 @@ function main() {
ln -s liboai_bladerfdevif.so liboai_device.so
ln -s $dbin/liboai_bladerfdevif.so.$REL $dbin/liboai_device.so
echo_info "liboai_device.so is linked to BLADERF device library"
+ elif [ "$HW" == "OAI_LMSSDR" ] ; then
+# if [ -f "/usr/include/libbladeRF.h" ] ; then
+ compilations \
+ $build_dir oai_lmssdrdevif \
+ liboai_lmssdrdevif.so $dbin/liboai_lmssdrdevif.so.$REL
+# fi
+
+ ln -s liboai_lmssdrdevif.so liboai_device.so
+ ln -s $dbin/liboai_lmssdrdevif.so.$REL $dbin/liboai_device.so
+ echo_info "liboai_device.so is linked to LMSSDR device library"
else
echo_info "liboai_device.so is not linked to any device library"
fi
@@ -744,9 +760,9 @@ fi
rm -fr $OPENAIR_DIR/cmake_targets/autotests/log
mkdir -p $OPENAIR_DIR/cmake_targets/autotests/log
if [ "$RUN_GROUP" -eq "1" ]; then
- $OPENAIR_DIR/cmake_targets/autotests/run_exec_autotests.bash -g "$TEST_CASE_GROUP" -p '$mypassword' >& $OPENAIR_DIR/cmake_targets/autotests/log/autotests.log &
+ $OPENAIR_DIR/cmake_targets/autotests/run_exec_autotests.bash -g "$TEST_CASE_GROUP" -p $mypassword >& $OPENAIR_DIR/cmake_targets/autotests/log/autotests.log &
else
- $OPENAIR_DIR/cmake_targets/autotests/run_exec_autotests.bash -p '$mypassword' >& $OPENAIR_DIR/cmake_targets/autotests/log/autotests.log &
+ $OPENAIR_DIR/cmake_targets/autotests/run_exec_autotests.bash -p $mypassword >& $OPENAIR_DIR/cmake_targets/autotests/log/autotests.log &
fi
wait
else
diff --git a/cmake_targets/epc_test/CMakeLists.template b/cmake_targets/epc_test/CMakeLists.template
index 25d94ea852..8a8223e4ae 100644
--- a/cmake_targets/epc_test/CMakeLists.template
+++ b/cmake_targets/epc_test/CMakeLists.template
@@ -1,11 +1,13 @@
cmake_minimum_required(VERSION 2.8)
set ( CMAKE_BUILD_TYPE "RelWithDebInfo" )
+set ( ASN_DEBUG False)
set ( ADDR_CONF False )
set ( DEBUG_OMG False )
set ( DISABLE_XER_PRINT False )
set ( DRIVER2013 True )
set ( EMOS False )
+set ( EMIT_ASN_DEBUG False )
set ( ENABLE_FXP True )
set ( ENABLE_ITTI True )
set ( ENABLE_NAS_UE_LOGGING True )
@@ -47,9 +49,9 @@ set ( OAI_EMU False )
set ( OAISIM False )
set ( OAI_NW_DRIVER_TYPE_ETHERNET False )
set ( OAI_NW_DRIVER_USE_NETLINK True )
-set ( OPENAIR1 False )
-set ( OPENAIR2 False )
-set ( OPENAIR_LTE F )
+set ( OPENAIR1 True )
+set ( OPENAIR2 True )
+set ( OPENAIR_LTE True )
set ( PACKAGE_NAME "epc_test" )
set ( PBS_SIM False )
set ( PDCP_USE_NETLINK True )
@@ -74,4 +76,4 @@ set ( SMBV False )
set ( TEST_OMG False )
set ( USE_MME "R10" )
set ( USER_MODE True )
-set ( XER_PRINT False )
+set ( XER_PRINT True )
diff --git a/cmake_targets/lte-simulators/CMakeLists.txt b/cmake_targets/lte-simulators/CMakeLists.txt
index 7a0e84b425..0b706c8748 100644
--- a/cmake_targets/lte-simulators/CMakeLists.txt
+++ b/cmake_targets/lte-simulators/CMakeLists.txt
@@ -2,7 +2,7 @@ cmake_minimum_required(VERSION 2.8)
set(PACKAGE_NAME "unitary_tests_simulators")
set(PHYSIM True)
set(RF_BOARD None)
-set(XFORMS False)
+set(XFORMS True)
set(DEBUG_PHY False)
set(MU_RECIEVER False)
diff --git a/cmake_targets/rrh_gw/CMakeLists.txt b/cmake_targets/rrh_gw/CMakeLists.txt
deleted file mode 100644
index 9ff1437f0c..0000000000
--- a/cmake_targets/rrh_gw/CMakeLists.txt
+++ /dev/null
@@ -1,6 +0,0 @@
-cmake_minimum_required(VERSION 2.8)
-set(ENABLE_VCD_FIFO False )
-set(ENABLE_ITTI False )
-set(RF_BOARD "ETHERNET")
-set(PACKAGE_NAME "\"rrh_gw\"")
-include(${CMAKE_CURRENT_SOURCE_DIR}/../CMakeLists.txt)
diff --git a/cmake_targets/tools/build_helper b/cmake_targets/tools/build_helper
index d29dbffe13..689c15dc5b 100755
--- a/cmake_targets/tools/build_helper
+++ b/cmake_targets/tools/build_helper
@@ -30,7 +30,7 @@
################################################################################
# file build_helper
# brief
-# author Laurent Thomas
+# authors Laurent Thomas, Lionel GAUTHIER
#
#######################################
SUDO='sudo -E'
@@ -269,7 +269,9 @@ check_install_oai_software() {
pydb \
wvdial \
python-numpy \
- sshpass
+ sshpass \
+ libxslt1-dev
+
$SUDO update-alternatives --set liblapack.so /usr/lib/atlas-base/atlas/liblapack.so
if [ `lsb_release -rs` = '12.04' ] ; then
install_nettle_from_source
@@ -288,13 +290,15 @@ install_asn1c_from_source(){
asn1_install_dir=$OPENAIR_DIR/cmake_targets/log/asn1c_install_log.txt
echo_info "\nInstalling ASN1. The log file for ASN1 installation is here: $asn1_install_dir "
(
- rm -rf /tmp/asn1c-r1516
+ $SUDO rm -rf /tmp/asn1c-r1516
mkdir -p /tmp/asn1c-r1516
cd /tmp/asn1c-r1516
- svn co https://github.com/vlm/asn1c/trunk /tmp/asn1c-r1516 -r 1516
- patch -p0 < $OPENAIR_DIR/openair3/S1AP/MESSAGES/ASN1/asn1cpatch.p0
- patch -p0 < $OPENAIR_DIR/openair3/S1AP/MESSAGES/ASN1/asn1cpatch_2.p0
- patch -p0 < $OPENAIR_DIR/openair2/RRC/LITE/MESSAGES/asn1c/asn1cpatch.p0
+ rm -rf /tmp/asn1c-r1516/*
+ svn co https://github.com/vlm/asn1c/trunk /tmp/asn1c-r1516 -r 1516 > /tmp/log_compile_asn1c
+ patch -p0 < $OPENAIR_DIR/openair3/S1AP/MESSAGES/ASN1/asn1cpatch.p0 >> /tmp/log_compile_asn1c
+ patch -p0 < $OPENAIR_DIR/openair3/S1AP/MESSAGES/ASN1/asn1cpatch_2.p0 >> /tmp/log_compile_asn1c
+ patch -p0 < $OPENAIR_DIR/openair2/RRC/LITE/MESSAGES/asn1c/asn1cpatch.p0 >> /tmp/log_compile_asn1c
+ patch -p0 < $OPENAIR_DIR/openair3/S1AP/MESSAGES/ASN1/asn1cpatch_3.p0 >> /tmp/log_compile_asn1c
./configure
make -j`nproc`
$SUDO make install
@@ -324,7 +328,6 @@ install_nas_tools() {
}
-
################################
# set_openair_env
###############################
@@ -380,3 +383,21 @@ done
}
+# get from http://www.linuxjournal.com/content/validating-ip-address-bash-script
+validate_ip() {
+
+local ip=$1
+local stat=1
+
+if [[ $ip =~ ^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$ ]]; then
+ OIFS=$IFS
+ IFS='.'
+ ip=($ip)
+ IFS=$OIFS
+ [[ ${ip[0]} -le 255 && ${ip[1]} -le 255 \
+ && ${ip[2]} -le 255 && ${ip[3]} -le 255 ]]
+ stat=$?
+fi
+
+return $stat
+}
diff --git a/cmake_targets/tools/build_test_epc_tools b/cmake_targets/tools/build_test_epc_tools
index aff2a26fc0..aa7103fd78 100755
--- a/cmake_targets/tools/build_test_epc_tools
+++ b/cmake_targets/tools/build_test_epc_tools
@@ -22,7 +22,7 @@
# Contact Information
# OpenAirInterface Admin: openair_admin@eurecom.fr
# OpenAirInterface Tech : openair_tech@eurecom.fr
-# OpenAirInterface Dev : openair4g-devel@eurecom.fr
+# OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr
#
# Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE
#
@@ -121,6 +121,7 @@ function main()
echo "Cleaning TEST_EPC"
fi
rm -f $OPENAIR_DIR/targets/bin/test_epc_generate_scenario
+ rm -f $OPENAIR_DIR/targets/bin/test_epc_play_scenario
rm -Rf build 2>&1
mkdir -m 777 -p -v build
fi
@@ -140,6 +141,13 @@ function main()
compilations \
epc_test test_epc_generate_scenario \
test_epc_generate_scenario $dbin/test_epc_generate_scenario
+
+ compilations \
+ epc_test test_epc_play_scenario \
+ test_epc_play_scenario $dbin/test_epc_play_scenario
+
+ $SUDO cp -upv test_epc_generate_scenario /usr/local/bin
+ $SUDO cp -upv test_epc_play_scenario /usr/local/bin
}
diff --git a/cmake_targets/tools/run_enb_s1_usrp b/cmake_targets/tools/run_enb_s1_usrp
index 01f4156071..5bb7ef151f 100755
--- a/cmake_targets/tools/run_enb_s1_usrp
+++ b/cmake_targets/tools/run_enb_s1_usrp
@@ -29,9 +29,9 @@
################################################################################
# file run_enb_s1_usrp
# brief run script for eNB USRP.
-# author Lionel GAUTHIER
+# author Lionel GAUTHIER and Navid Nikaein
# company Eurecom
-# email: lionel.gauthier@eurecom.fr
+# email: lionel.gauthier@eurecom.fr and navid.nikaein@eurecom.fr
################################
@@ -56,6 +56,8 @@ function help()
echo_error "Mandatory arguments to long options are mandatory for short options too."
echo_error " -g, --gdb Run with GDB."
echo_error " -h, --help Print this help."
+ echo_error " -e, --ulsch-max-errors num-errs maximum allowed number of uplink errors"
+ echo_error " -f, --rf-config-file filename RF specific configuration file"
echo_error " -K, --itti-dump-file filename ITTI dump file containing all ITTI events occuring during EPC runtime.(can omit file name if last argument)"
echo_error " -M, --target-dl-mcs mcs Downlink target MCS."
echo_error " -m, --mscgen directory Generate mscgen output files in a directory"
@@ -137,7 +139,27 @@ function main()
shift;
exit 0
;;
- -K | --itti-dump-file)
+ -e | --ulsch-max-errors)
+ ulsch_max_errors=$2
+ echo "setting --ulsch-max-errors to $ulsch_max_errors"
+ exe_arguments="$exe_arguments --ulsch-max-errors=$ulsch_max_errors"
+ shift 2;
+ ;;
+ -f | --rf-config-file)
+ rf_config_file=$2
+ # can omit file name if last arg on the line
+ if [ "x$rf_config_file" = "x" ]; then
+ rf_config_file=null
+ shift 1;
+ else
+ shift 2;
+ fi
+ if [ "$rf_config_file" != "null" ]; then
+ echo "setting --rf-config-file to $rf_config_file"
+ exe_arguments="$exe_arguments --rf-config-file=$rf_config_file"
+ fi
+ ;;
+ -K | --itti-dump-file)
itti_dump_file=$2
# can omit file name if last arg on the line
if [ "x$itti_dump_file" = "x" ]; then
diff --git a/cmake_targets/tools/stop_exmimo2 b/cmake_targets/tools/stop_exmimo2
index 63810e0bf8..a68fdb7d57 100755
--- a/cmake_targets/tools/stop_exmimo2
+++ b/cmake_targets/tools/stop_exmimo2
@@ -13,5 +13,5 @@ sudo -E $OPENAIR_DIR/cmake_targets/tools/init_exmimo2
#now we stop the card from transmitting anything
cd $OPENAIR_DIR/targets/bin
-sudo -E octave $OPENAIR_DIR/cmake_targets/tools/exmimo_stop_octave.m
+sudo -E octave -H --no-gui $OPENAIR_DIR/cmake_targets/tools/exmimo_stop_octave.m
diff --git a/openair1/PHY/LTE_ESTIMATION/adjust_gain.c b/openair1/PHY/LTE_ESTIMATION/adjust_gain.c
index 52f26a2562..ead0ed7d99 100644
--- a/openair1/PHY/LTE_ESTIMATION/adjust_gain.c
+++ b/openair1/PHY/LTE_ESTIMATION/adjust_gain.c
@@ -38,23 +38,16 @@ extern int card;
#endif
void
-phy_adjust_gain (PHY_VARS_UE *phy_vars_ue, uint8_t eNB_id)
+phy_adjust_gain (PHY_VARS_UE *phy_vars_ue, uint32_t rx_power_fil_dB, uint8_t eNB_id)
{
- uint16_t rx_power_fil_dB;
#ifdef EXMIMO
exmimo_config_t *p_exmimo_config = openair0_exmimo_pci[card].exmimo_config_ptr;
uint16_t i;
#endif
- int rssi;
-
- rssi = dB_fixed(phy_vars_ue->PHY_measurements.rssi);
-
- if (rssi>0) rx_power_fil_dB = rssi;
- else rx_power_fil_dB = phy_vars_ue->PHY_measurements.rx_power_avg_dB[eNB_id];
LOG_D(PHY,"Gain control: rssi %d (%d,%d)\n",
- rssi,
+ rx_power_fil_dB,
phy_vars_ue->PHY_measurements.rssi,
phy_vars_ue->PHY_measurements.rx_power_avg_dB[eNB_id]
);
diff --git a/openair1/PHY/LTE_ESTIMATION/defs.h b/openair1/PHY/LTE_ESTIMATION/defs.h
index 903793c2b5..c20d24e34f 100644
--- a/openair1/PHY/LTE_ESTIMATION/defs.h
+++ b/openair1/PHY/LTE_ESTIMATION/defs.h
@@ -213,6 +213,7 @@ int8_t set_RSRQ_filtered(module_id_t Mod_id,uint8_t CC_id,uint8_t eNB_index,floa
//! Automatic gain control
void phy_adjust_gain (PHY_VARS_UE *phy_vars_ue,
+ uint32_t rx_power_fil_dB,
unsigned char eNB_id);
int lte_ul_channel_estimation(PHY_VARS_eNB *phy_vars_eNB,
diff --git a/openair1/PHY/LTE_ESTIMATION/lte_sync_time.c b/openair1/PHY/LTE_ESTIMATION/lte_sync_time.c
index 6e2311789e..edbdbda2d1 100644
--- a/openair1/PHY/LTE_ESTIMATION/lte_sync_time.c
+++ b/openair1/PHY/LTE_ESTIMATION/lte_sync_time.c
@@ -483,13 +483,10 @@ int lte_sync_time(int **rxdata, ///rx data in time domain
*eNB_id = sync_source;
+ LOG_D(PHY,"[UE] lte_sync_time: Sync source = %d, Peak found at pos %d, val = %d (%d dB)\n",sync_source,peak_pos,peak_val,dB_fixed(peak_val)/2);
+
+
#ifdef DEBUG_PHY
- msg("[PHY][UE] lte_sync_time: Sync source = %d, Peak found at pos %d, val = %d\n",
- sync_source,peak_pos,peak_val);
-
-
-
-
if (debug_cnt == 0) {
write_output("sync_corr0_ue.m","synccorr0",sync_corr_ue0,2*length,1,2);
write_output("sync_corr1_ue.m","synccorr1",sync_corr_ue1,2*length,1,2);
diff --git a/openair1/PHY/LTE_REFSIG/primary_synch.h b/openair1/PHY/LTE_REFSIG/primary_synch.h
index f9cf6fc171..717f2e552c 100644
--- a/openair1/PHY/LTE_REFSIG/primary_synch.h
+++ b/openair1/PHY/LTE_REFSIG/primary_synch.h
@@ -1,31 +1,3 @@
-/*******************************************************************************
- OpenAirInterface
- Copyright(c) 1999 - 2014 Eurecom
-
- OpenAirInterface is free software: you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation, either version 3 of the License, or
- (at your option) any later version.
-
-
- OpenAirInterface is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with OpenAirInterface.The full GNU General Public License is
- included in this distribution in the file called "COPYING". If not,
- see .
-
- Contact Information
- OpenAirInterface Admin: openair_admin@eurecom.fr
- OpenAirInterface Tech : openair_tech@eurecom.fr
- OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr
-
- Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE
-
- *******************************************************************************/
short primary_synch0[144] = {0,0,0,0,0,0,0,0,0,0,32767,0,-26120,-19785,11971,-30502,-24020,-22288,32117,6492,31311,9658,-16384,-28378,25100,-21063,-7292,-31946,20429,25618,14948,29158,11971,-30502,31311,9658,25100,-21063,-16384,28377,-24020,22287,32117,6492,-7292,31945,20429,25618,-26120,-19785,-16384,-28378,-16384,28377,-26120,-19785,-32402,4883,31311,-9659,32117,6492,-7292,-31946,32767,-1,25100,-21063,-24020,22287,-32402,4883,-32402,4883,-24020,22287,25100,-21063,32767,-1,-7292,-31946,32117,6492,31311,-9659,-32402,4883,-26120,-19785,-16384,28377,-16384,-28378,-26120,-19785,20429,25618,-7292,31945,32117,6492,-24020,22287,-16384,28377,25100,-21063,31311,9658,11971,-30502,14948,29158,20429,25618,-7292,-31946,25100,-21063,-16384,-28378,31311,9658,32117,6492,-24020,-22288,11971,-30502,-26120,-19785,32767,0,0,0,0,0,0,0,0,0,0,0};
short primary_synch1[144] = {0,0,0,0,0,0,0,0,0,0,32767,0,-31754,-8086,-24020,-22288,2448,32675,-26120,19784,27073,18458,-16384,28377,25100,21062,-29523,14217,-7292,31945,-13477,-29868,-24020,-22288,27073,18458,25100,21062,-16384,-28378,2448,-32676,-26120,19784,-29523,-14218,-7292,31945,-31754,-8086,-16384,28377,-16384,-28378,-31754,-8086,31311,-9659,27073,-18459,-26120,19784,-29523,14217,32767,-1,25100,21062,2448,-32676,31311,-9659,31311,-9659,2448,-32676,25100,21062,32767,0,-29523,14217,-26120,19784,27073,-18459,31311,-9659,-31754,-8086,-16384,-28378,-16384,28377,-31754,-8086,-7292,31945,-29523,-14218,-26120,19784,2448,-32676,-16384,-28378,25100,21062,27073,18458,-24020,-22288,-13477,-29868,-7292,31945,-29523,14217,25100,21062,-16384,28377,27073,18458,-26120,19784,2448,32675,-24020,-22288,-31754,-8086,32767,0,0,0,0,0,0,0,0,0,0,0};
short primary_synch2[144] = {0,0,0,0,0,0,0,0,0,0,32767,0,-31754,8085,-24020,22287,2448,-32676,-26120,-19785,27073,-18459,-16384,-28378,25100,-21063,-29523,-14218,-7292,-31946,-13477,29867,-24020,22287,27073,-18459,25100,-21063,-16384,28377,2448,32675,-26120,-19785,-29523,14217,-7292,-31946,-31754,8085,-16384,-28378,-16384,28377,-31754,8085,31311,9658,27073,18458,-26120,-19785,-29523,-14218,32767,0,25100,-21063,2448,32675,31311,9658,31311,9658,2448,32675,25100,-21063,32767,0,-29523,-14218,-26120,-19785,27073,18458,31311,9658,-31754,8085,-16384,28377,-16384,-28378,-31754,8085,-7292,-31946,-29523,14217,-26120,-19785,2448,32675,-16384,28377,25100,-21063,27073,-18459,-24020,22287,-13477,29867,-7292,-31946,-29523,-14218,25100,-21063,-16384,-28378,27073,-18459,-26120,-19785,2448,-32676,-24020,22287,-31754,8085,32767,-1,0,0,0,0,0,0,0,0,0,0};
diff --git a/openair1/PHY/LTE_TRANSPORT/initial_sync.c b/openair1/PHY/LTE_TRANSPORT/initial_sync.c
index 5c6b479b20..5a8463a861 100644
--- a/openair1/PHY/LTE_TRANSPORT/initial_sync.c
+++ b/openair1/PHY/LTE_TRANSPORT/initial_sync.c
@@ -48,7 +48,7 @@
#include "gain_control.h"
#endif
-#if defined(OAI_USRP) || defined(EXMIMO)
+#if defined(OAI_USRP) || defined(EXMIMO) || defined(OAI_LMSSDR)
#include "common_lib.h"
extern openair0_config_t openair0_cfg[];
#endif
@@ -280,7 +280,6 @@ int initial_sync(PHY_VARS_UE *phy_vars_ue, runmode_t mode)
uint8_t flip_fdd_ncp,flip_fdd_ecp,flip_tdd_ncp,flip_tdd_ecp;
// uint16_t Nid_cell_fdd_ncp=0,Nid_cell_fdd_ecp=0,Nid_cell_tdd_ncp=0,Nid_cell_tdd_ecp=0;
LTE_DL_FRAME_PARMS *frame_parms = &phy_vars_ue->lte_frame_parms;
- int i;
int ret=-1;
int aarx,rx_power=0;
/*#ifdef OAI_USRP
@@ -291,17 +290,10 @@ int initial_sync(PHY_VARS_UE *phy_vars_ue, runmode_t mode)
frame_parms->Ncp=NORMAL;
frame_parms->frame_type=FDD;
init_frame_parms(frame_parms,1);
-
- // write_output("rxdata0.m","rxd0",phy_vars_ue->lte_ue_common_vars.rxdata[0],10*frame_parms->samples_per_tti,1,1);
-
- /*#ifdef OAI_USRP
- for (aarx = 0; aarxnb_antennas_rx;aarx++) {
- rxdata128 = (__m128i*)phy_vars_ue->lte_ue_common_vars.rxdata[aarx];
- for (i=0; i<(frame_parms->samples_per_tti*10)>>2; i++) {
- rxdata128[i] = _mm_srai_epi16(rxdata128[i],4);
- }
- }
- #endif*/
+ /*
+ write_output("rxdata0.m","rxd0",phy_vars_ue->lte_ue_common_vars.rxdata[0],10*frame_parms->samples_per_tti,1,1);
+ exit(-1);
+ */
sync_pos = lte_sync_time(phy_vars_ue->lte_ue_common_vars.rxdata,
frame_parms,
(int *)&phy_vars_ue->lte_ue_common_vars.eNb_id);
@@ -316,32 +308,6 @@ int initial_sync(PHY_VARS_UE *phy_vars_ue, runmode_t mode)
LOG_I(PHY,"[UE%d] Initial sync : Estimated PSS position %d, Nid2 %d\n",phy_vars_ue->Mod_id,sync_pos,phy_vars_ue->lte_ue_common_vars.eNb_id);
#endif
-
- for (aarx=0; aarxnb_antennas_rx; aarx++)
- rx_power += signal_energy(&phy_vars_ue->lte_ue_common_vars.rxdata[aarx][sync_pos2],
- frame_parms->ofdm_symbol_size+frame_parms->nb_prefix_samples);
-
- phy_vars_ue->PHY_measurements.rx_power_avg_dB[0] = dB_fixed(rx_power/frame_parms->nb_antennas_rx);
-
-#ifdef DEBUG_INITIAL_SYNCH
- LOG_I(PHY,"[UE%d] Initial sync : Estimated power: %d dB\n",phy_vars_ue->Mod_id,phy_vars_ue->PHY_measurements.rx_power_avg_dB[0] );
-#endif
-
-#ifdef EXMIMO
-
- if ((openair_daq_vars.rx_gain_mode == DAQ_AGC_ON) &&
- (mode != rx_calib_ue) && (mode != rx_calib_ue_med) && (mode != rx_calib_ue_byp) )
- //phy_adjust_gain(phy_vars_ue,0);
- gain_control_all(phy_vars_ue->PHY_measurements.rx_power_avg_dB[0],0);
-
-#else
-#ifndef OAI_USRP
- #ifndef OAI_BLADERF
- phy_adjust_gain(phy_vars_ue,0);
- #endif
-#endif
-#endif
-
// SSS detection
// PSS is hypothesized in last symbol of first slot in Frame
@@ -530,20 +496,20 @@ int initial_sync(PHY_VARS_UE *phy_vars_ue, runmode_t mode)
#endif
if (phy_vars_ue->UE_scan_carrier == 0) {
-#ifdef OPENAIR2
- LOG_I(PHY,"[UE%d] Sending synch status to higher layers\n",phy_vars_ue->Mod_id);
- //mac_resynch();
- mac_xface->dl_phy_sync_success(phy_vars_ue->Mod_id,phy_vars_ue->frame_rx,0,1);//phy_vars_ue->lte_ue_common_vars.eNb_id);
-#endif //OPENAIR2
-
+ if (phy_vars_ue->mac_enabled==1) {
+ LOG_I(PHY,"[UE%d] Sending synch status to higher layers\n",phy_vars_ue->Mod_id);
+ //mac_resynch();
+ mac_xface->dl_phy_sync_success(phy_vars_ue->Mod_id,phy_vars_ue->frame_rx,0,1);//phy_vars_ue->lte_ue_common_vars.eNb_id);
+ phy_vars_ue->UE_mode[0] = PRACH;
+ }
+ else {
+ phy_vars_ue->UE_mode[0] = PUSCH;
+ }
+
generate_pcfich_reg_mapping(frame_parms);
generate_phich_reg_mapping(frame_parms);
// init_prach625(frame_parms);
-#ifndef OPENAIR2
- phy_vars_ue->UE_mode[0] = PUSCH;
-#else
- phy_vars_ue->UE_mode[0] = PRACH;
-#endif
+
//phy_vars_ue->lte_ue_pbch_vars[0]->pdu_errors=0;
phy_vars_ue->lte_ue_pbch_vars[0]->pdu_errors_conseq=0;
//phy_vars_ue->lte_ue_pbch_vars[0]->pdu_errors_last=0;
@@ -569,7 +535,7 @@ int initial_sync(PHY_VARS_UE *phy_vars_ue, runmode_t mode)
phy_vars_ue->lte_frame_parms.phich_config_common.phich_duration,
phich_string[phy_vars_ue->lte_frame_parms.phich_config_common.phich_resource],
phy_vars_ue->lte_frame_parms.nb_antennas_tx_eNB);
-#if defined(OAI_USRP) || defined(EXMIMO)
+#if defined(OAI_USRP) || defined(EXMIMO) || defined(OAI_LMSSDR)
LOG_I(PHY,"[UE %d] Frame %d Measured Carrier Frequency %.0f Hz (offset %d Hz)\n",
phy_vars_ue->Mod_id,
phy_vars_ue->frame_rx,
@@ -597,6 +563,65 @@ int initial_sync(PHY_VARS_UE *phy_vars_ue, runmode_t mode)
}
+ // gain control
+ if (ret!=0) { //we are not synched, so we cannot use rssi measurement (which is based on channel estimates)
+ rx_power = 0;
+
+ // do a measurement on the best guess of the PSS
+ for (aarx=0; aarxnb_antennas_rx; aarx++)
+ rx_power += signal_energy(&phy_vars_ue->lte_ue_common_vars.rxdata[aarx][sync_pos2],
+ frame_parms->ofdm_symbol_size+frame_parms->nb_prefix_samples);
+
+ /*
+ // do a measurement on the full frame
+ for (aarx=0; aarxnb_antennas_rx; aarx++)
+ rx_power += signal_energy(&phy_vars_ue->lte_ue_common_vars.rxdata[aarx][0],
+ frame_parms->samples_per_tti*10);
+ */
+
+ // we might add a low-pass filter here later
+ phy_vars_ue->PHY_measurements.rx_power_avg[0] = rx_power/frame_parms->nb_antennas_rx;
+
+ phy_vars_ue->PHY_measurements.rx_power_avg_dB[0] = dB_fixed(phy_vars_ue->PHY_measurements.rx_power_avg[0]);
+
+#ifdef DEBUG_INITIAL_SYNCH
+ LOG_I(PHY,"[UE%d] Initial sync : Estimated power: %d dB\n",phy_vars_ue->Mod_id,phy_vars_ue->PHY_measurements.rx_power_avg_dB[0] );
+#endif
+
+#ifdef EXMIMO
+ if ((openair_daq_vars.rx_gain_mode == DAQ_AGC_ON) &&
+ (mode != rx_calib_ue) && (mode != rx_calib_ue_med) && (mode != rx_calib_ue_byp) )
+ //phy_adjust_gain(phy_vars_ue,0);
+ gain_control_all(phy_vars_ue->PHY_measurements.rx_power_avg_dB[0],0);
+
+#else
+#ifndef OAI_USRP
+#ifndef OAI_BLADERF
+#ifndef OAI_LMSSDR
+ phy_adjust_gain(phy_vars_ue,phy_vars_ue->PHY_measurements.rx_power_avg_dB[0],0);
+#endif
+#endif
+#endif
+#endif
+ }
+ else {
+#ifdef EXMIMO
+ if ((openair_daq_vars.rx_gain_mode == DAQ_AGC_ON) &&
+ (mode != rx_calib_ue) && (mode != rx_calib_ue_med) && (mode != rx_calib_ue_byp) )
+ //phy_adjust_gain(phy_vars_ue,0);
+ gain_control_all(dB_fixed(phy_vars_ue->PHY_measurements.rssi),0);
+
+#else
+#ifndef OAI_USRP
+#ifndef OAI_BLADERF
+#ifndef OAI_LMSSDR
+ phy_adjust_gain(phy_vars_ue,dB_fixed(phy_vars_ue->PHY_measurements.rssi),0);
+#endif
+#endif
+#endif
+#endif
+ }
+
// exit_fun("debug exit");
return ret;
}
diff --git a/openair1/PHY/LTE_TRANSPORT/print_stats.c b/openair1/PHY/LTE_TRANSPORT/print_stats.c
index a386e1cb30..de5f05c879 100644
--- a/openair1/PHY/LTE_TRANSPORT/print_stats.c
+++ b/openair1/PHY/LTE_TRANSPORT/print_stats.c
@@ -50,7 +50,7 @@
#endif
extern int mac_get_rrc_status(uint8_t Mod_id,uint8_t eNB_flag,uint8_t index);
-#if defined(OAI_USRP) || defined(EXMIMO) || defined(OAI_BLADERF)
+#if defined(OAI_USRP) || defined(EXMIMO) || defined(OAI_BLADERF) || defined(OAI_LMSSDR)
#include "common_lib.h"
extern openair0_config_t openair0_cfg[];
#endif
@@ -97,20 +97,20 @@ int dump_ue_stats(PHY_VARS_UE *phy_vars_ue, char* buffer, int length, runmode_t
#ifdef EXMIMO
len += sprintf(&buffer[len], "[UE PROC] RX Gain %d dB (LNA %d, vga %d dB)\n",phy_vars_ue->rx_total_gain_dB, openair0_cfg[0].rxg_mode[0],(int)openair0_cfg[0].rx_gain[0]);
#endif
-#if defined(OAI_USRP) || defined(OAI_BLADERF)
+#if defined(OAI_USRP) || defined(OAI_BLADERF) || defined(OAI_LMSSDR)
len += sprintf(&buffer[len], "[UE PROC] RX Gain %d dB\n",phy_vars_ue->rx_total_gain_dB);
#endif
-#if defined(EXMIMO) || defined(OAI_USRP) || defined(OAI_BLADERF)
+#if defined(EXMIMO) || defined(OAI_USRP) || defined(OAI_BLADERF) || defined(OAI_LMSSDR)
len += sprintf(&buffer[len], "[UE_PROC] Frequency offset %d Hz (%d), estimated carrier frequency %f Hz\n",phy_vars_ue->lte_ue_common_vars.freq_offset,openair_daq_vars.freq_offset,openair0_cfg[0].rx_freq[0]-phy_vars_ue->lte_ue_common_vars.freq_offset);
#endif
len += sprintf(&buffer[len], "[UE PROC] UE mode = %s (%d)\n",mode_string[phy_vars_ue->UE_mode[0]],phy_vars_ue->UE_mode[0]);
len += sprintf(&buffer[len], "[UE PROC] timing_advance = %d\n",phy_vars_ue->timing_advance);
if (phy_vars_ue->UE_mode[0]==PUSCH) {
len += sprintf(&buffer[len], "[UE PROC] Po_PUSCH = %d dBm (PL %d dB, Po_NOMINAL_PUSCH %d dBm, PHR %d dB)\n",
- PHY_vars_UE_g[0][0]->ulsch_ue[0]->Po_PUSCH,
+ phy_vars_ue->ulsch_ue[0]->Po_PUSCH,
get_PL(phy_vars_ue->Mod_id,phy_vars_ue->CC_id,0),
- mac_xface->get_Po_NOMINAL_PUSCH(phy_vars_ue->Mod_id,0),
- PHY_vars_UE_g[0][0]->ulsch_ue[0]->PHR);
+ phy_vars_ue->lte_frame_parms.ul_power_control_config_common.p0_NominalPUSCH,
+ phy_vars_ue->ulsch_ue[0]->PHR);
len += sprintf(&buffer[len], "[UE PROC] Po_PUCCH = %d dBm (Po_NOMINAL_PUCCH %d dBm, g_pucch %d dB)\n",
get_PL(phy_vars_ue->Mod_id,phy_vars_ue->CC_id,0)+
phy_vars_ue->lte_frame_parms.ul_power_control_config_common.p0_NominalPUCCH+
@@ -582,9 +582,7 @@ int dump_eNB_stats(PHY_VARS_eNB *phy_vars_eNB, char* buffer, int length)
len += sprintf(&buffer[len],"%4d ",
phy_vars_eNB->PHY_measurements_eNB[eNB].n0_subband_power_tot_dBm[i]);
if ((i>0) && ((i%25) == 0))
- len += sprintf(&buffer[len],"\n ",
- phy_vars_eNB->PHY_measurements_eNB[eNB].n0_subband_power_tot_dBm[i]);
-
+ len += sprintf(&buffer[len],"\n");
}
len += sprintf(&buffer[len],"\n");
len += sprintf(&buffer[len],"\n[eNB PROC] PERFORMANCE PARAMETERS\n");
@@ -644,7 +642,6 @@ int dump_eNB_stats(PHY_VARS_eNB *phy_vars_eNB, char* buffer, int length)
dB_fixed(phy_vars_eNB->eNB_UE_stats[UE_id].Po_PUCCH/phy_vars_eNB->lte_frame_parms.N_RB_UL)-phy_vars_eNB->rx_total_gain_eNB_dB,
phy_vars_eNB->lte_frame_parms.ul_power_control_config_common.p0_NominalPUCCH,
dB_fixed(phy_vars_eNB->eNB_UE_stats[UE_id].Po_PUCCH1_below/phy_vars_eNB->lte_frame_parms.N_RB_UL)-phy_vars_eNB->rx_total_gain_eNB_dB,
- dB_fixed(phy_vars_eNB->eNB_UE_stats[UE_id].Po_PUCCH1_above/phy_vars_eNB->lte_frame_parms.N_RB_UL)-phy_vars_eNB->rx_total_gain_eNB_dB,
PUCCH1_THRES+phy_vars_eNB->PHY_measurements_eNB[0].n0_power_tot_dBm-dB_fixed(phy_vars_eNB->lte_frame_parms.N_RB_UL),
phy_vars_eNB->eNB_UE_stats[UE_id].sector);
diff --git a/openair1/PHY/TOOLS/cmult_mm.c b/openair1/PHY/TOOLS/cmult_mm.c
deleted file mode 100644
index 328958af29..0000000000
--- a/openair1/PHY/TOOLS/cmult_mm.c
+++ /dev/null
@@ -1,200 +0,0 @@
-/*******************************************************************************
- OpenAirInterface
- Copyright(c) 1999 - 2014 Eurecom
-
- OpenAirInterface is free software: you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation, either version 3 of the License, or
- (at your option) any later version.
-
-
- OpenAirInterface is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with OpenAirInterface.The full GNU General Public License is
- included in this distribution in the file called "COPYING". If not,
- see .
-
- Contact Information
- OpenAirInterface Admin: openair_admin@eurecom.fr
- OpenAirInterface Tech : openair_tech@eurecom.fr
- OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr
-
- Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE
-
- *******************************************************************************/
-#include "defs.h"
-
-int mult_cpx_matrix_h(short *x1[2][2],
- short *x2[2][2],
- short *y[2][2],
- unsigned int N,
- unsigned short output_shift,
- short hermitian)
-{
-
- if (hermitian) {
- // this computes x1^H*x2 and stores it in y
- mult_cpx_vector_h(x2[0][0],x1[0][0],y[0][0],N,output_shift,1);
- mult_cpx_vector_h(x2[0][1],x1[0][1],y[0][0],N,output_shift,1);
- mult_cpx_vector_h(x2[0][0],x1[1][0],y[1][0],N,output_shift,1);
- mult_cpx_vector_h(x2[0][1],x1[1][1],y[1][0],N,output_shift,1);
- mult_cpx_vector_h(x2[1][0],x1[0][0],y[0][1],N,output_shift,1);
- mult_cpx_vector_h(x2[1][1],x1[0][1],y[0][1],N,output_shift,1);
- mult_cpx_vector_h(x2[1][0],x1[1][0],y[1][1],N,output_shift,1);
- mult_cpx_vector_h(x2[1][1],x1[1][1],y[1][1],N,output_shift,1);
- } else {
- // this computes x1*x2^H and stores it in y
- mult_cpx_vector_h(x1[0][0],x2[0][0],y[0][0],N,output_shift,1);
- mult_cpx_vector_h(x1[0][1],x2[0][1],y[0][0],N,output_shift,1);
- mult_cpx_vector_h(x1[0][0],x2[1][0],y[0][1],N,output_shift,1);
- mult_cpx_vector_h(x1[0][1],x2[1][1],y[0][1],N,output_shift,1);
- mult_cpx_vector_h(x1[1][0],x2[0][0],y[1][0],N,output_shift,1);
- mult_cpx_vector_h(x1[1][1],x2[0][1],y[1][0],N,output_shift,1);
- mult_cpx_vector_h(x1[1][0],x2[1][0],y[1][1],N,output_shift,1);
- mult_cpx_vector_h(x1[1][1],x2[1][1],y[1][1],N,output_shift,1);
- }
-}
-
-int mult_cpx_matrix_vector(int *x1[2][2],
- int *x2[2],
- int *y[2],
- unsigned int N,
- unsigned short output_shift)
-{
-
- Zero_Buffer(y[0],N*8);
- Zero_Buffer(y[1],N*8);
-
- // this computes x1*x2 and stores it in y (32 bit)
- mult_cpx_vector_add32((short*)x2[0],(short*)x1[0][0],(short*)y[0],N);
- mult_cpx_vector_add32((short*)x2[1],(short*)x1[0][1],(short*)y[0],N);
- mult_cpx_vector_add32((short*)x2[0],(short*)x1[1][0],(short*)y[1],N);
- mult_cpx_vector_add32((short*)x2[1],(short*)x1[1][1],(short*)y[1],N);
-
- // shift and pack
- shift_and_pack((short*)y[0],N,output_shift);
- shift_and_pack((short*)y[1],N,output_shift);
-
-}
-
-#ifdef MAIN_MM
-#include
-#include
-main ()
-{
- short x1_00[256] __attribute__((aligned(16)));
- short x1_10[256] __attribute__((aligned(16)));
- short x1_01[256] __attribute__((aligned(16)));
- short x1_11[256] __attribute__((aligned(16)));
- short x2_0[256] __attribute__((aligned(16)));
- short x2_1[256] __attribute__((aligned(16)));
- short y_0[256] __attribute__((aligned(16)));
- short y_1[256] __attribute__((aligned(16)));
-
- int *x1[2][2];
- int *x2[2];
- int *y[2];
- int i,m,n;
-
- x1[0][0] = (int*)x1_00;
- x1[0][1] = (int*)x1_01;
- x1[1][0] = (int*)x1_10;
- x1[1][1] = (int*)x1_11;
- x2[0] = (int*)x2_0;
- x2[1] = (int*)x2_1;
- y[0] = (int*)y_0;
- y[1] = (int*)y_1;
-
- for(m=0; m<2; m++) {
- for(n=0; n<2; n++) {
- for(i=0; i<256; i+=4) {
- ((short*)x1[m][n])[i] = ((short) rand())/4;
- ((short*)x1[m][n])[i+1] = ((short) rand())/4;
- ((short*)x1[m][n])[i+2] = -((short*)x1[m][n])[i+1];
- ((short*)x1[m][n])[i+3] = ((short*)x1[m][n])[i];
- }
- }
-
- for(i=0; i<256; i+=4) {
- ((short*)x2[m])[i] = ((short) rand())/4;
- ((short*)x2[m])[i+1] = ((short) rand())/4;
- ((short*)x2[m])[i+2] = ((short*)x2[m])[i];
- ((short*)x2[m])[i+3] = ((short*)x2[m])[i+1];
- }
-
- Zero_Buffer(y[m],512);
- }
-
- /*
- input[0] = 100;
- input[1] = 200;
- input[2] = -200;
- input[3] = 100;
- input[4] = 1000;
- input[5] = 2000;
- input[6] = -2000;
- input[7] = 1000;
- input[8] = 100;
- input[9] = 200;
- input[10] = -200;
- input[11] = 100;
- input[12] = 1000;
- input[13] = 2000;
- input[14] = -2000;
- input[15] = 1000;
-
- input2[0] = 2;
- input2[1] = 1;
- input2[2] = 2;
- input2[3] = 1;
- input2[4] = 20;
- input2[5] = 10;
- input2[6] = 20;
- input2[7] = 10;
- input2[8] = 2;
- input2[9] = 1;
- input2[10] = 2;
- input2[11] = 1;
- input2[12] = 2000;
- input2[13] = 1000;
- input2[14] = 2000;
- input2[15] = 1000;
-
- x1[0][0] = (int*)input;
- x1[0][1] = (int*)input;
- x1[1][0] = (int*)input;
- x1[1][1] = (int*)input;
-
- x2[0] = (int*)input2;
- x2[1] = (int*)input2;
-
- y[0] = (int*)output;
- y[1] = (int*)output2;
- */
-
- mult_cpx_matrix_vector(x1,x2,y,64,15);
-
- //mult_cpx_vector_add32(x2[0],x1[0][0],y[0],64);
-
- for (i=0; i<128; i+=2)
- printf("i=%d, x1 = [%d+1i*%d %d+1i*%d; %d+1i*%d %d+1i*%d]; x2 = [%d+1i*%d; %d+1i*%d]; y = [%d+1i*%d; %d+1i*%d]; y_m= round(x1*x2./pow2(15)); y-y_m \n",
- i,
- ((short*)x1[0][0])[2*i], ((short*)x1[0][0])[2*i+2],
- ((short*)x1[0][1])[2*i], ((short*)x1[0][1])[2*i+2],
- ((short*)x1[1][0])[2*i], ((short*)x1[1][0])[2*i+2],
- ((short*)x1[1][1])[2*i], ((short*)x1[1][1])[2*i+2],
- ((short*)x2[0])[2*i], ((short*)x2[0])[2*i+1],
- ((short*)x2[1])[2*i], ((short*)x2[1])[2*i+1],
- ((short*)y[0])[2*i], ((short*)y[0])[2*i+1],
- ((short*)y[1])[2*i], ((short*)y[1])[2*i+1]);
-
- //((int*)y[0])[i], ((int*)y[0])[i+1],
- //((int*)y[1])[i], ((int*)y[1])[i+1]);
-
-}
-
-#endif
diff --git a/openair1/PHY/TOOLS/cmult_vv.c b/openair1/PHY/TOOLS/cmult_vv.c
index d7b7275508..f970d33224 100755
--- a/openair1/PHY/TOOLS/cmult_vv.c
+++ b/openair1/PHY/TOOLS/cmult_vv.c
@@ -50,7 +50,7 @@ int mult_cpx_conj_vector(int16_t *x1,
uint32_t N,
int output_shift)
{
- // Multiply elementwise two complex vectors of N elements with repeated formatted output
+ // Multiply elementwise the complex conjugate of x1 with x2.
// x1 - input 1 in the format |Re0 Im0 Re1 Im1|,......,|Re(N-2) Im(N-2) Re(N-1) Im(N-1)|
// We assume x1 with a dinamic of 15 bit maximum
//
@@ -90,7 +90,7 @@ int mult_cpx_conj_vector(int16_t *x1,
tmp_im = _mm_shufflelo_epi16(*x1_128,_MM_SHUFFLE(2,3,0,1));
tmp_im = _mm_shufflehi_epi16(tmp_im,_MM_SHUFFLE(2,3,0,1));
tmp_im = _mm_sign_epi16(tmp_im,*(__m128i*)&conjug[0]);
- tmp_im = _mm_madd_epi16(tmp_im,*x1_128);
+ tmp_im = _mm_madd_epi16(tmp_im,*x2_128);
tmp_re = _mm_srai_epi32(tmp_re,output_shift);
tmp_im = _mm_srai_epi32(tmp_im,output_shift);
tmpy0 = _mm_unpacklo_epi32(tmp_re,tmp_im);
@@ -130,3 +130,4 @@ int mult_cpx_conj_vector(int16_t *x1,
return(0);
}
+
diff --git a/openair1/PHY/TOOLS/cmult_vvh.c b/openair1/PHY/TOOLS/cmult_vvh.c
deleted file mode 100644
index 64cf163d09..0000000000
--- a/openair1/PHY/TOOLS/cmult_vvh.c
+++ /dev/null
@@ -1,366 +0,0 @@
-/*******************************************************************************
- OpenAirInterface
- Copyright(c) 1999 - 2014 Eurecom
-
- OpenAirInterface is free software: you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation, either version 3 of the License, or
- (at your option) any later version.
-
-
- OpenAirInterface is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with OpenAirInterface.The full GNU General Public License is
- included in this distribution in the file called "COPYING". If not,
- see .
-
- Contact Information
- OpenAirInterface Admin: openair_admin@eurecom.fr
- OpenAirInterface Tech : openair_tech@eurecom.fr
- OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr
-
- Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE
-
- *******************************************************************************/
-#include "defs.h"
-
-static __m128i shift __attribute__ ((aligned(16)));
-
-
-int mult_cpx_vector_h(short *x1,
- short *x2,
- short *y,
- unsigned int N,
- unsigned short output_shift,
- short sign)
-{
- // Multiply elementwise the complex vector x1 with the complex conjugate of the complex vecotr x2 of N elements and adds it to the vector y.
- // x1 - input 1 in the format |Re0 Im0 Re0 Im0|,......,|Re(N-1) Im(N-1) Re(N-1) Im(N-1)|
- // We assume x1 with a dinamic of 15 bit maximum
- //
- // x2 - input 2 in the format |Re0 Im0 Re0 Im0|,......,|Re(N-1) Im(N-1) Re(N-1) Im(N-1)|
- // We assume x2 with a dinamic of 14 bit maximum
- //
- // y - output in the format |Re0 Im0 Re0 Im0|,......,|Re(N-1) Im(N-1) Re(N-1) Im(N-1)|
- //
- // N - the size f the vectors (this function does N cpx mpy. WARNING: N>=4;
- //
- // log2_amp - increase the output amplitude by a factor 2^log2_amp (default is 0)
- // WARNING: log2_amp>0 can cause overflow!!
- // sign - +1..add, -1..substract
-
- unsigned int i; // loop counter
-
- register __m128i m0,m1,m2;
-
- short *temps;
- int *tempd;
-
- __m128i *x1_128;
- __m128i *x2_128;
- __m128i *y_128;
- __m128i mask;
-
- __m128i temp;
-
- shift = _mm_cvtsi32_si128(output_shift);
- x1_128 = (__m128i *)&x1[0];
- x2_128 = (__m128i *)&x2[0];
- y_128 = (__m128i *)&y[0];
-
- if (sign == -1)
- mask = (__m128i) _mm_set_epi16 (-1,1,-1,-1,-1,1,-1,-1);
- else
- mask = (__m128i) _mm_set_epi16 (1,-1,1,1,1,-1,1,1);
-
- // we compute 2*4 cpx multiply for each loop
- for(i=0; i<(N>>3); i++) {
-
- // printf("i=%d\n",i);
-
- // unroll 1
- // temps = (short *)x1_128;
- // printf("x1 : %d,%d,%d,%d,%d,%d,%d,%d\n",temps[0],temps[1],temps[2],temps[3],temps[4],temps[5],temps[6],temps[7]);
- m1 = x1_128[0];
- m2 = x2_128[0];
-
- // temps = (short *)&x2_128[0];
- // printf("x2 : %x,%x,%x,%x,%x,%x,%x,%x\n",temps[0],temps[1],temps[2],temps[3],temps[4],temps[5],temps[6],temps[7]);
-
- // bring x2 in conjugate form
- // the first two instructions might be replaced with a single one in SSE3
- m2 = _mm_shufflelo_epi16(m2,_MM_SHUFFLE(0,1,3,2));
- m2 = _mm_shufflehi_epi16(m2,_MM_SHUFFLE(0,1,3,2));
- m2 = _mm_mullo_epi16(m2, mask);
-
- // temp = m2;
- // temps = (short *)&temp;
- // printf("x2 conj : %x,%x,%x,%x,%x,%x,%x,%x\n",temps[0],temps[1],temps[2],temps[3],temps[4],temps[5],temps[6],temps[7]);
-
- m0 = _mm_madd_epi16(m1,m2); //pmaddwd_r2r(mm1,mm0); // 1- compute x1[0]*x2[0]
-
- // temp = m0;
-
- // tempd = &temp;
- // printf("m0 : %d,%d,%d,%d\n",tempd[0],tempd[1],tempd[2],tempd[3]);
-
- m0 = _mm_sra_epi32(m0,shift); // 1- shift right by shift in order to compensate for the input amplitude
-
- // temp = m0;
-
- // tempd = (int *)&temp;
- // printf("m0 : %d,%d,%d,%d\n",tempd[0],tempd[1],tempd[2],tempd[3]);
-
- m0 = _mm_packs_epi32(m0,m0); // 1- pack in a 128 bit register [re im re im]
- m0 = _mm_unpacklo_epi32(m0,m0); // 1- pack in a 128 bit register [re im re im]
-
- y_128[0] = _mm_add_epi16(m0,y_128[0]);
-
- // temps = (short *)&y_128[0];
- // printf("y0 : %d,%d,%d,%d,%d,%d,%d,%d\n",temps[0],temps[1],temps[2],temps[3],temps[4],temps[5],temps[6],temps[7]);
-
- // unroll 2
- m1 = x1_128[1];
- m2 = x2_128[1];
-
- m2 = _mm_shufflelo_epi16(m2,_MM_SHUFFLE(0,1,3,2));
- m2 = _mm_shufflehi_epi16(m2,_MM_SHUFFLE(0,1,3,2));
- m2 = _mm_mullo_epi16(m2, mask);
-
- m0 = _mm_madd_epi16(m1,m2); //pmaddwd_r2r(mm1,mm0); // 1- compute x1[0]*x2[0]
-
- m0 = _mm_sra_epi32(m0,shift); // 1- shift right by shift in order to compensate for the input amplitude
-
- m0 = _mm_packs_epi32(m0,m0); // 1- pack in a 128 bit register [re im re im]
- m0 = _mm_unpacklo_epi32(m0,m0); // 1- pack in a 128 bit register [re im re im]
-
- y_128[1] = _mm_add_epi16(m0,y_128[1]);
-
- // unroll 3
- m1 = x1_128[2];
- m2 = x2_128[2];
-
- m2 = _mm_shufflelo_epi16(m2,_MM_SHUFFLE(0,1,3,2));
- m2 = _mm_shufflehi_epi16(m2,_MM_SHUFFLE(0,1,3,2));
- m2 = _mm_mullo_epi16(m2, mask);
-
- m0 = _mm_madd_epi16(m1,m2); //pmaddwd_r2r(mm1,mm0); // 1- compute x1[0]*x2[0]
-
- m0 = _mm_sra_epi32(m0,shift); // 1- shift right by shift in order to compensate for the input amplitude
-
- m0 = _mm_packs_epi32(m0,m0); // 1- pack in a 128 bit register [re im re im]
- m0 = _mm_unpacklo_epi32(m0,m0); // 1- pack in a 128 bit register [re im re im]
-
- y_128[2] = _mm_add_epi16(m0,y_128[2]);
-
-
- // unroll 4
- m1 = x1_128[3];
- m2 = x2_128[3];
-
- m2 = _mm_shufflelo_epi16(m2,_MM_SHUFFLE(0,1,3,2));
- m2 = _mm_shufflehi_epi16(m2,_MM_SHUFFLE(0,1,3,2));
- m2 = _mm_mullo_epi16(m2, mask);
-
- m0 = _mm_madd_epi16(m1,m2); //pmaddwd_r2r(mm1,mm0); // 1- compute x1[0]*x2[0]
-
- m0 = _mm_sra_epi32(m0,shift); // 1- shift right by shift in order to compensate for the input amplitude
-
- m0 = _mm_packs_epi32(m0,m0); // 1- pack in a 128 bit register [re im re im]
- m0 = _mm_unpacklo_epi32(m0,m0); // 1- pack in a 128 bit register [re im re im]
-
- y_128[3] = _mm_add_epi16(m0,y_128[3]);
-
- x1_128+=4;
- x2_128+=4;
- y_128 +=4;
- // printf("x1_128 = %p, x2_128 =%p, y_128=%p\n",x1_128,x2_128,y_128);
-
- }
-
-
- _mm_empty();
- _m_empty();
-
- return(0);
-}
-
-
-int mult_cpx_vector_h_add32(short *x1,
- short *x2,
- short *y,
- unsigned int N,
- short sign)
-{
- // Multiply elementwise the complex vector x1 with the complex conjugate of the complex vecotr x2 of N elements and adds it to the vector y.
- // x1 - input 1 in 16bit format |Re0 Im0 Re0 Im0|,......,|Re(N-1) Im(N-1) Re(N-1) Im(N-1)|
- // We assume x1 with a dinamic of 15 bit maximum
- //
- // x2 - input 2 in 16bit format |Re0 Im0 Re0 Im0|,......,|Re(N-1) Im(N-1) Re(N-1) Im(N-1)|
- // We assume x2 with a dinamic of 14 bit maximum
- //
- // y - output in 32bit format |Re0 Im0|,......,|Re(N-1) Im(N-1)|
- //
- // N - the size f the vectors (this function does N cpx mpy. WARNING: N>=4;
- //
- // sign - +1..add, -1..substract
-
- unsigned int i; // loop counter
-
- register __m128i m0,m1,m2;
-
- short *temps;
- int *tempd;
-
- __m128i *x1_128;
- __m128i *x2_128;
- __m128i *y_128;
- __m128i mask;
-
- __m128i temp;
-
- x1_128 = (__m128i *)&x1[0];
- x2_128 = (__m128i *)&x2[0];
- y_128 = (__m128i *)&y[0];
-
- if (sign == -1)
- mask = (__m128i) _mm_set_epi16 (-1,1,-1,-1,-1,1,-1,-1);
- else
- mask = (__m128i) _mm_set_epi16 (1,-1,1,1,1,-1,1,1);
-
- // we compute 2*4 cpx multiply for each loop
- for(i=0; i<(N>>3); i++) {
-
- m1 = x1_128[0];
- m2 = x2_128[0];
-
- // bring x2 in conjugate form
- // the first two instructions might be replaced with a single one in SSE3
- m2 = _mm_shufflelo_epi16(m2,_MM_SHUFFLE(0,1,3,2));
- m2 = _mm_shufflehi_epi16(m2,_MM_SHUFFLE(0,1,3,2));
- m2 = _mm_mullo_epi16(m2, mask);
-
- m0 = _mm_madd_epi16(m1,m2); // 1- compute x1[0]*x2[0], result is 32bit
-
- y_128[0] = _mm_add_epi32(m0,y_128[0]);
-
- // unroll 2
- m1 = x1_128[1];
- m2 = x2_128[1];
-
- m2 = _mm_shufflelo_epi16(m2,_MM_SHUFFLE(0,1,3,2));
- m2 = _mm_shufflehi_epi16(m2,_MM_SHUFFLE(0,1,3,2));
- m2 = _mm_mullo_epi16(m2, mask);
-
- m0 = _mm_madd_epi16(m1,m2);
-
- y_128[1] = _mm_add_epi32(m0,y_128[1]);
-
- // unroll 3
- m1 = x1_128[2];
- m2 = x2_128[2];
-
- m2 = _mm_shufflelo_epi16(m2,_MM_SHUFFLE(0,1,3,2));
- m2 = _mm_shufflehi_epi16(m2,_MM_SHUFFLE(0,1,3,2));
- m2 = _mm_mullo_epi16(m2, mask);
-
- m0 = _mm_madd_epi16(m1,m2);
-
- y_128[2] = _mm_add_epi32(m0,y_128[2]);
-
-
- // unroll 4
- m1 = x1_128[3];
- m2 = x2_128[3];
-
- m2 = _mm_shufflelo_epi16(m2,_MM_SHUFFLE(0,1,3,2));
- m2 = _mm_shufflehi_epi16(m2,_MM_SHUFFLE(0,1,3,2));
- m2 = _mm_mullo_epi16(m2, mask);
-
- m0 = _mm_madd_epi16(m1,m2);
-
- y_128[3] = _mm_add_epi32(m0,y_128[3]);
-
- x1_128+=4;
- x2_128+=4;
- y_128 +=4;
-
- }
-
-
- _mm_empty();
- _m_empty();
-
- return(0);
-}
-
-#ifdef MAIN
-#define L 16
-
-main ()
-{
-
- short input[256] __attribute__((aligned(16)));
- short input2[256] __attribute__((aligned(16)));
- short output[256] __attribute__((aligned(16)));
-
- int i;
-
- Zero_Buffer(output,256*2);
-
- for (i=0; i<16; i+=2)
- printf("output[%d] = %d + %d i\n",i,output[i],output[i+1]);
-
- input[0] = 100;
- input[1] = 200;
- input[2] = 100;
- input[3] = 200;
- input[4] = 1234;
- input[5] = -1234;
- input[6] = 1234;
- input[7] = -1234;
- input[8] = 100;
- input[9] = 200;
- input[10] = 100;
- input[11] = 200;
- input[12] = 1000;
- input[13] = 2000;
- input[14] = 1000;
- input[15] = 2000;
-
- input2[0] = 1;
- input2[1] = 2;
- input2[2] = 1;
- input2[3] = 2;
- input2[4] = 10;
- input2[5] = 20;
- input2[6] = 10;
- input2[7] = 20;
- input2[8] = 1;
- input2[9] = 2;
- input2[10] = 1;
- input2[11] = 2;
- input2[12] = 1000;
- input2[13] = 2000;
- input2[14] = 1000;
- input2[15] = 2000;
-
-
- mult_cpx_vector_h(input2,input2,output,8,0,1);
-
- for (i=0; i<16; i+=2)
- printf("output[%d] = %d + %d i\n",i,output[i],output[i+1]);
-
- Zero_Buffer(output,256*2);
- mult_cpx_vector_h(input2,input2,output,8,0,-1);
-
- for (i=0; i<16; i+=2)
- printf("output[%d] = %d + %d i\n",i,output[i],output[i+1]);
-
-}
-
-#endif //MAIN
diff --git a/openair1/PHY/TOOLS/defs.h b/openair1/PHY/TOOLS/defs.h
index 6960fcda4c..963c1384b7 100644
--- a/openair1/PHY/TOOLS/defs.h
+++ b/openair1/PHY/TOOLS/defs.h
@@ -64,6 +64,8 @@ struct complex32 {
int32_t i;
};
+//cmult_sv.h
+
/*!\fn void multadd_real_vector_complex_scalar(int16_t *x,int16_t *alpha,int16_t *y,uint32_t N)
This function performs componentwise multiplication and accumulation of a complex scalar and a real vector.
@param x Vector input (Q1.15)
@@ -95,192 +97,14 @@ void multadd_complex_vector_real_scalar(int16_t *x,
uint8_t zero_flag,
uint32_t N);
-
-/*!\fn int32_t mult_cpx_vector(int16_t *x1,int16_t *x2,int16_t *y,uint32_t N,int32_t output_shift)
-This function performs optimized componentwise multiplication of two Q1.15 vectors in repeated format.
-
-@param x1 Input 1 in the format |Re0 Im0 Re0 Im0|,......,|Re(N-1) Im(N-1) Re(N-1) Im(N-1)|
-@param x2 Input 2 in the format |Re0 -Im0 Im0 Re0|,......,|Re(N-1) -Im(N-1) Im(N-1) Re(N-1)|
-@param y Output in the format |Re0 Im0 Re0 Im0|,......,|Re(N-1) Im(N-1) Re(N-1) Im(N-1)|
-@param N Length of Vector WARNING: N must be a multiple of 8 (4x loop unrolling and two complex multiplies per cycle)
-@param output_shift Number of bits to shift output down to Q1.15 (should be 15 for Q1.15 inputs) WARNING: log2_amp>0 can cause overflow!!
-
-The function implemented is : \f$\mathbf{y} = \mathbf{x_1}\odot\mathbf{x_2}\f$
-*/
-int32_t mult_cpx_vector(int16_t *x1,
- int16_t *x2,
- int16_t *y,
- uint32_t N,
- int32_t output_shift);
-
-/*!\fn int32_t mult_cpx_vector_norep(int16_t *x1,int16_t *x2,int16_t *y,uint32_t N,int32_t output_shift)
-This function performs optimized componentwise multiplication of two Q1.15 vectors with normal formatted output.
-
-@param x1 Input 1 in the format |Re0 Im0 Re0 Im0|,......,|Re(N-1) Im(N-1) Re(N-1) Im(N-1)|
-@param x2 Input 2 in the format |Re0 -Im0 Im0 Re0|,......,|Re(N-1) -Im(N-1) Im(N-1) Re(N-1)|
-@param y Output in the format |Re0 Im0 Re1 Im1|,......,|Re(N-2) Im(N-2) Re(N-1) Im(N-1)|
-@param N Length of Vector WARNING: N must be a multiple of 8 (4x loop unrolling and two complex multiplies per cycle)
-@param output_shift Number of bits to shift output down to Q1.15 (should be 15 for Q1.15 inputs) WARNING: log2_amp>0 can cause overflow!!
-
-The function implemented is : \f$\mathbf{y} = \mathbf{x_1}\odot\mathbf{x_2}\f$
-*/
-int32_t mult_cpx_vector_norep(int16_t *x1,
- int16_t *x2,
- int16_t *y,
- uint32_t N,
- int32_t output_shift);
-
-
-/*!\fn int32_t mult_cpx_vector_norep2(int16_t *x1,int16_t *x2,int16_t *y,uint32_t N,int32_t output_shift)
-This function performs optimized componentwise multiplication of two Q1.15 vectors with normal formatted output.
-
-@param x1 Input 1 in the format |Re0 Im0 Re0 Im0|,......,|Re(N-1) Im(N-1) Re(N-1) Im(N-1)|
-@param x2 Input 2 in the format |Re0 -Im0 Im0 Re0|,......,|Re(N-1) -Im(N-1) Im(N-1) Re(N-1)|
-@param y Output in the format |Re0 Im0 Re1 Im1|,......,|Re(N-2) Im(N-2) Re(N-1) Im(N-1)|
-@param N Length of Vector WARNING: N must be a multiple of 8 (no unrolling and two complex multiplies per cycle)
-@param output_shift Number of bits to shift output down to Q1.15 (should be 15 for Q1.15 inputs) WARNING: log2_amp>0 can cause overflow!!
-
-The function implemented is : \f$\mathbf{y} = \mathbf{x_1}\odot\mathbf{x_2}\f$
-*/
-int32_t mult_cpx_vector_norep2(int16_t *x1,
- int16_t *x2,
- int16_t *y,
- uint32_t N,
- int32_t output_shift);
-
-int32_t mult_cpx_vector_norep_conj(int16_t *x1,
- int16_t *x2,
- int16_t *y,
- uint32_t N,
- int32_t output_shift);
-
-int32_t mult_cpx_vector_norep_conj2(int16_t *x1,
- int16_t *x2,
- int16_t *y,
- uint32_t N,
- int32_t output_shift);
-
-/*!\fn int32_t mult_cpx_vector2(int16_t *x1,int16_t *x2,int16_t *y,uint32_t N,int32_t output_shift)
-This function performs optimized componentwise multiplication of two Q1.15 vectors.
-
-@param x1 Input 1 in the format |Re0 Im0 Re0 Im0|,......,|Re(N-1) Im(N-1) Re(N-1) Im(N-1)|
-@param x2 Input 2 in the format |Re0 -Im0 Im0 Re0|,......,|Re(N-1) -Im(N-1) Im(N-1) Re(N-1)|
-@param y Output in the format |Re0 Im0 Re0 Im0|,......,|Re(N-1) Im(N-1) Re(N-1) Im(N-1)|
-@param N Length of Vector WARNING: N must be a multiple of 2 (2 complex multiplies per cycle)
-@param output_shift Number of bits to shift output down to Q1.15 (should be 15 for Q1.15 inputs) WARNING: log2_amp>0 can cause overflow!!
-
-The function implemented is : \f$\mathbf{y} = \mathbf{x_1}\odot\mathbf{x_2}\f$
-*/
-int32_t mult_cpx_vector2(int16_t *x1,
- int16_t *x2,
- int16_t *y,
- uint32_t N,
- int32_t output_shift);
-
-/*!\fn int32_t mult_cpx_vector_add(int16_t *x1,int16_t *x2,int16_t *y,uint32_t N,int32_t output_shift)
-This function performs optimized componentwise multiplication of two Q1.15 vectors. The output IS ADDED TO y. WARNING: make sure that output_shift is set to the right value, so that the result of the multiplication has the comma at the same place as y.
-
-@param x1 Input 1 in the format |Re0 Im0 Re0 Im0|,......,|Re(N-1) Im(N-1) Re(N-1) Im(N-1)|
-@param x2 Input 2 in the format |Re0 -Im0 Im0 Re0|,......,|Re(N-1) -Im(N-1) Im(N-1) Re(N-1)|
-@param y Output in the format |Re0 Im0 Re0 Im0|,......,|Re(N-1) Im(N-1) Re(N-1) Im(N-1)|
-@param N Length of Vector WARNING: N>=4
-@param output_shift Number of bits to shift output down to Q1.15 (should be 15 for Q1.15 inputs) WARNING: log2_amp>0 can cause overflow!!
-
-The function implemented is : \f$\mathbf{y} += \mathbf{x_1}\odot\mathbf{x_2}\f$
-*/
-
-int32_t mult_cpx_vector_add(int16_t *x1,
- int16_t *x2,
- int16_t *y,
- uint32_t N,
- int32_t output_shift);
-
-
-int32_t mult_cpx_vector_h_add32(int16_t *x1,
- int16_t *x2,
- int16_t *y,
- uint32_t N,
- int16_t sign);
-
-int32_t mult_cpx_vector_add32(int16_t *x1,
- int16_t *x2,
- int16_t *y,
- uint32_t N);
-
-int32_t mult_vector32(int16_t *x1,
- int16_t *x2,
+int rotate_cpx_vector(int16_t *x,
+ int16_t *alpha,
int16_t *y,
- uint32_t N);
-
-int32_t mult_vector32_scalar(int16_t *x1,
- int32_t x2,
- int16_t *y,
- uint32_t N);
-
-int32_t mult_cpx_vector32_conj(int16_t *x,
- int16_t *y,
- uint32_t N);
-
-int32_t mult_cpx_vector32_real(int16_t *x1,
- int16_t *x2,
- int16_t *y,
- uint32_t N);
-
-int32_t shift_and_pack(int16_t *y,
- uint32_t N,
- int32_t output_shift);
-
-/*!\fn int32_t mult_cpx_vector_h(int16_t *x1,int16_t *x2,int16_t *y,uint32_t N,int32_t output_shift,int16_t sign)
-This function performs optimized componentwise multiplication of the vector x1 with the conjugate of the vector x2. The output IS ADDED TO y. WARNING: make sure that output_shift is set to the right value, so that the result of the multiplication has the comma at the same place as y.
-
-@param x1 Input 1 in the format |Re0 Im0 Re0 Im0|,......,|Re(N-1) Im(N-1) Re(N-1) Im(N-1)|
-@param x2 Input 2 in the format |Re0 Im0 Re0 Im0|,......,|Re(N-1) Im(N-1) Re(N-1) Im(N-1)|
-@param y Output in the format |Re0 Im0 Re0 Im0|,......,|Re(N-1) Im(N-1) Re(N-1) Im(N-1)|
-@param N Length of Vector (complex samples) WARNING: N>=4
-@param output_shift Number of bits to shift output down to Q1.15 (should be 15 for Q1.15 inputs) WARNING: log2_amp>0 can cause overflow!!
-@param sign +1..add, -1..substract
-
-The function implemented is : \f$\mathbf{y} = \mathbf{y} + \mathbf{x_1}\odot\mathbf{x_2}^*\f$
-*/
-int32_t mult_cpx_vector_h(int16_t *x1,
- int16_t *x2,
- int16_t *y,
- uint32_t N,
- int32_t output_shift,
- int16_t sign);
-
-/*!\fn int32_t mult_cpx_matrix_h(int16_t *x1[2][2],int16_t *x2[2][2],int16_t *y[2][2],uint32_t N,uint16_t output_shift,int16_t hermitian)
-This function performs optimized componentwise matrix multiplication of the 2x2 matrices x1 with the 2x2 matrices x2. The output IS ADDED TO y (i.e. make sure y is initilized correctly). WARNING: make sure that output_shift is set to the right value, so that the result of the multiplication has the comma at the same place as y.
-
-@param x1 Input 1 in the format |Re0 Im0 Re0 Im0|,......,|Re(N-1) Im(N-1) Re(N-1) Im(N-1)|
-@param x2 Input 2 in the format |Re0 Im0 Re0 Im0|,......,|Re(N-1) Im(N-1) Re(N-1) Im(N-1)|
-@param y Output in the format |Re0 Im0 Re0 Im0|,......,|Re(N-1) Im(N-1) Re(N-1) Im(N-1)|
-@param N Length of Vector (complex samples) WARNING: N>=4
-@param output_shift Number of bits to shift output down to Q1.15 (should be 15 for Q1.15 inputs) WARNING: log2_amp>0 can cause overflow!!
-@param hermitian if !=0 the hermitian transpose is returned (i.e. A^H*B instead of A*B^H)
-*/
-int32_t mult_cpx_matrix_h(int16_t *x1[2][2],
- int16_t *x2[2][2],
- int16_t *y[2][2],
- uint32_t N,
- uint16_t output_shift,
- int16_t hermitian);
+ uint32_t N,
+ uint16_t output_shift);
-/*!\fn int32_t mult_cpx_matrix_vector(int32_t *x1[2][2],int32_t *x2[2],int32_t *y[2],uint32_t N,uint16_t output_shift)
-This function performs optimized componentwise matrix-vector multiplication of the 2x2 matrices x1 with the 2x1 vectors x2. The output IS ADDED TO y (i.e. make sure y is initilized correctly). WARNING: make sure that output_shift is set to the right value, so that the result of the multiplication has the comma at the same place as y.
-@param x1 Input 1 in the format |Re0 Im0 Re0 Im0|,......,|Re(N-1) Im(N-1) Re(N-1) Im(N-1)|
-@param x2 Input 2 in the format |Re0 -Im0 Im0 Re0|,......,|Re(N-1) -Im(N-1) Im(N-1) Re(N-1)|
-@param y Output in the format |Re0 Im0 Re0 Im0|,......,|Re(N-1) Im(N-1) Re(N-1) Im(N-1)| WARNING: y must be different for x2
-@param N Length of Vector (complex samples) WARNING: N>=4
-@param output_shift Number of bits to shift output down to Q1.15 (should be 15 for Q1.15 inputs) WARNING: log2_amp>0 can cause overflow!!
-*/
-int32_t mult_cpx_matrix_vector(int32_t *x1[2][2],
- int32_t *x2[2],
- int32_t *y[2],
- uint32_t N,
- uint16_t output_shift);
/*!\fn void init_fft(uint16_t size,uint8_t logsize,uint16_t *rev)
\brief Initialize the FFT engine for a given size
@@ -289,6 +113,25 @@ int32_t mult_cpx_matrix_vector(int32_t *x1[2][2],
@param rev Pointer to bit-reversal permutation array
*/
+//cmult_vv.c
+/*!
+ Multiply elementwise the complex conjugate of x1 with x2.
+ @param x1 - input 1 in the format |Re0 Im0 Re1 Im1|,......,|Re(N-2) Im(N-2) Re(N-1) Im(N-1)|
+ We assume x1 with a dinamic of 15 bit maximum
+ @param x2 - input 2 in the format |Re0 Im0 Re1 Im1|,......,|Re(N-2) Im(N-2) Re(N-1) Im(N-1)|
+ We assume x2 with a dinamic of 14 bit maximum
+ @param y - output in the format |Re0 Im0 Re1 Im1|,......,|Re(N-2) Im(N-2) Re(N-1) Im(N-1)|
+ @param N - the size f the vectors (this function does N cpx mpy. WARNING: N>=4;
+ @param output_shift - shift to be applied to generate output
+*/
+
+int mult_cpx_conj_vector(int16_t *x1,
+ int16_t *x2,
+ int16_t *y,
+ uint32_t N,
+ int output_shift);
+
+// lte_dfts.c
void init_fft(uint16_t size,
uint8_t logsize,
uint16_t *rev);
@@ -355,6 +198,7 @@ int32_t rotate_cpx_vector(int16_t *x,
uint16_t output_shift);
+//cadd_sv.c
/*!\fn int32_t add_cpx_vector(int16_t *x,int16_t *alpha,int16_t *y,uint32_t N)
This function performs componentwise addition of a vector with a complex scalar.
diff --git a/openair1/PHY/TOOLS/lte_phy_scope.c b/openair1/PHY/TOOLS/lte_phy_scope.c
index e507024c86..843a77fe62 100644
--- a/openair1/PHY/TOOLS/lte_phy_scope.c
+++ b/openair1/PHY/TOOLS/lte_phy_scope.c
@@ -88,7 +88,7 @@ FD_lte_phy_scope_enb *create_lte_phy_scope_enb( void )
fl_set_object_boxtype( fdui->rxsig_t, FL_EMBOSSED_BOX );
fl_set_object_color( fdui->rxsig_t, FL_BLACK, FL_RED );
fl_set_object_lcolor( fdui->rxsig_t, FL_WHITE ); // Label color
- fl_set_xyplot_ybounds(fdui->rxsig_t,30,70);
+ fl_set_xyplot_ybounds(fdui->rxsig_t,10,70);
// Time-domain channel response
fdui->chest_t = fl_add_xyplot( FL_NORMAL_XYPLOT, 410, 20, 370, 100, "Channel Impulse Response (samples, abs)" );
@@ -396,7 +396,7 @@ FD_lte_phy_scope_ue *create_lte_phy_scope_ue( void )
fl_set_object_boxtype( fdui->rxsig_t, FL_EMBOSSED_BOX );
fl_set_object_color( fdui->rxsig_t, FL_BLACK, FL_RED );
fl_set_object_lcolor( fdui->rxsig_t, FL_WHITE ); // Label color
- fl_set_xyplot_ybounds(fdui->rxsig_t,30,70);
+ fl_set_xyplot_ybounds(fdui->rxsig_t,10,70);
// Time-domain channel response
fdui->chest_t = fl_add_xyplot( FL_NORMAL_XYPLOT, 410, 20, 370, 100, "Channel Impulse Response (samples, abs)" );
diff --git a/openair1/PHY/TOOLS/time_meas.h b/openair1/PHY/TOOLS/time_meas.h
index a3df897053..3e621ac281 100644
--- a/openair1/PHY/TOOLS/time_meas.h
+++ b/openair1/PHY/TOOLS/time_meas.h
@@ -26,6 +26,9 @@
Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE
*******************************************************************************/
+#ifndef __TIME_MEAS_DEFS__H__
+#define __TIME_MEAS_DEFS__H__
+
#include
#include
#include
@@ -148,3 +151,4 @@ static inline void copy_meas(time_stats_t *dst_ts,time_stats_t *src_ts)
dst_ts->max=src_ts->max;
}
}
+#endif
diff --git a/openair1/PHY/defs.h b/openair1/PHY/defs.h
index f308c0500a..578b05634c 100755
--- a/openair1/PHY/defs.h
+++ b/openair1/PHY/defs.h
@@ -278,6 +278,9 @@ typedef struct PHY_VARS_eNB_s {
int **dl_precoder_SeNB[3];
char log2_maxp; /// holds the maximum channel/precoder coefficient
+ /// if ==0 enables phy only test mode
+ int mac_enabled;
+
/// For emulation only (used by UE abstraction to retrieve DCI)
uint8_t num_common_dci[2]; // num_dci in even/odd subframes
uint8_t num_ue_spec_dci[2]; // num_dci in even/odd subframes
@@ -579,6 +582,9 @@ typedef struct {
/// holds the maximum channel/precoder coefficient
char log2_maxp;
+ /// if ==0 enables phy only test mode
+ int mac_enabled;
+
/// Flag to initialize averaging of PHY measurements
int init_averaging;
diff --git a/openair1/SCHED/phy_mac_stub.c b/openair1/SCHED/phy_mac_stub.c
new file mode 100644
index 0000000000..9bcba1072c
--- /dev/null
+++ b/openair1/SCHED/phy_mac_stub.c
@@ -0,0 +1,756 @@
+/*******************************************************************************
+ OpenAirInterface
+ Copyright(c) 1999 - 2014 Eurecom
+
+ OpenAirInterface is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+
+ OpenAirInterface is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with OpenAirInterface.The full GNU General Public License is
+ included in this distribution in the file called "COPYING". If not,
+ see .
+
+ Contact Information
+ OpenAirInterface Admin: openair_admin@eurecom.fr
+ OpenAirInterface Tech : openair_tech@eurecom.fr
+ OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr
+
+ Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE
+
+ *******************************************************************************/
+
+/*! \file phy_mac_stub.c
+ * \brief stimulates the phy without mac
+ * \author R. Knopp, F. Kaltenberger, N. Nikaein
+ * \date 2011
+ * \version 0.1
+ * \company Eurecom
+ * \email: knopp@eurecom.fr,florian.kaltenberger@eurecom.fr,navid.nikaein@eurecom.fr
+ * \note
+ * \warning
+ */
+
+#include "PHY/defs.h"
+#include "PHY/extern.h"
+#include "MAC_INTERFACE/defs.h"
+#include "MAC_INTERFACE/extern.h"
+#include "SCHED/defs.h"
+#include "SCHED/extern.h"
+#include "LAYER2/MAC/extern.h"
+
+#ifdef EMOS
+#include "SCHED/phy_procedures_emos.h"
+#endif
+
+void fill_dci(DCI_PDU *DCI_pdu, uint8_t sched_subframe, PHY_VARS_eNB *phy_vars_eNB)
+{
+
+ int i;
+ uint8_t cooperation_flag = phy_vars_eNB->cooperation_flag;
+ uint8_t transmission_mode = phy_vars_eNB->transmission_mode[0];
+
+ uint32_t rballoc = 0x7FFF;
+ uint32_t rballoc2 = 0x000F;
+ int subframe = phy_vars_eNB->proc[sched_subframe].subframe_tx;
+
+ LTE_eNB_DLSCH_t *DLSCH_ptr = phy_vars_eNB->dlsch_eNB[0][0];
+
+ /*
+ uint32_t rand = taus();
+ if ((subframe==8) || (subframe==9) || (subframe==0))
+ rand = (rand%5)+5;
+ else
+ rand = (rand%4)+5;
+ */
+ uint32_t bcch_pdu;
+ uint64_t dlsch_pdu;
+
+ DCI_pdu->Num_common_dci = 0;
+ DCI_pdu->Num_ue_spec_dci=0;
+
+ switch (subframe) {
+ case 5:
+ DCI_pdu->Num_common_dci = 1;
+ DCI_pdu->dci_alloc[0].L = 2;
+ DCI_pdu->dci_alloc[0].rnti = SI_RNTI;
+ DCI_pdu->dci_alloc[0].format = format1A;
+ DCI_pdu->dci_alloc[0].ra_flag = 0;
+
+ switch (phy_vars_eNB->lte_frame_parms.N_RB_DL) {
+ case 6:
+ if (phy_vars_eNB->lte_frame_parms.frame_type == FDD) {
+ DCI_pdu->dci_alloc[0].dci_length = sizeof_DCI1A_1_5MHz_FDD_t;
+ ((DCI1A_1_5MHz_FDD_t*)&bcch_pdu)->type = 1;
+ ((DCI1A_1_5MHz_FDD_t*)&bcch_pdu)->vrb_type = 0;
+ ((DCI1A_1_5MHz_FDD_t*)&bcch_pdu)->rballoc = computeRIV(25,10,3);
+ ((DCI1A_1_5MHz_FDD_t*)&bcch_pdu)->ndi = phy_vars_eNB->proc[sched_subframe].frame_tx&1;
+ ((DCI1A_1_5MHz_FDD_t*)&bcch_pdu)->rv = 1;
+ ((DCI1A_1_5MHz_FDD_t*)&bcch_pdu)->mcs = 1;
+ ((DCI1A_1_5MHz_FDD_t*)&bcch_pdu)->harq_pid = 0;
+ ((DCI1A_1_5MHz_FDD_t*)&bcch_pdu)->TPC = 1; // set to 3 PRB
+ memcpy((void*)&DCI_pdu->dci_alloc[0].dci_pdu[0],&bcch_pdu,sizeof(DCI1A_1_5MHz_TDD_1_6_t));
+ } else {
+ DCI_pdu->dci_alloc[0].dci_length = sizeof_DCI1A_1_5MHz_TDD_1_6_t;
+ ((DCI1A_1_5MHz_TDD_1_6_t*)&bcch_pdu)->type = 1;
+ ((DCI1A_1_5MHz_TDD_1_6_t*)&bcch_pdu)->vrb_type = 0;
+ ((DCI1A_1_5MHz_TDD_1_6_t*)&bcch_pdu)->rballoc = computeRIV(25,10,3);
+ ((DCI1A_1_5MHz_TDD_1_6_t*)&bcch_pdu)->ndi = phy_vars_eNB->proc[sched_subframe].frame_tx&1;
+ ((DCI1A_1_5MHz_TDD_1_6_t*)&bcch_pdu)->rv = 1;
+ ((DCI1A_1_5MHz_TDD_1_6_t*)&bcch_pdu)->mcs = 1;
+ ((DCI1A_1_5MHz_TDD_1_6_t*)&bcch_pdu)->harq_pid = 0;
+ ((DCI1A_1_5MHz_TDD_1_6_t*)&bcch_pdu)->TPC = 1; // set to 3 PRB
+ memcpy((void*)&DCI_pdu->dci_alloc[0].dci_pdu[0],&bcch_pdu,sizeof(DCI1A_1_5MHz_TDD_1_6_t));
+ }
+
+ break;
+
+ case 25:
+ default:
+ if (phy_vars_eNB->lte_frame_parms.frame_type == FDD) {
+ DCI_pdu->dci_alloc[0].dci_length = sizeof_DCI1A_5MHz_FDD_t;
+ ((DCI1A_5MHz_FDD_t*)&bcch_pdu)->type = 1;
+ ((DCI1A_5MHz_FDD_t*)&bcch_pdu)->vrb_type = 0;
+ ((DCI1A_5MHz_FDD_t*)&bcch_pdu)->rballoc = computeRIV(25,10,3);
+ ((DCI1A_5MHz_FDD_t*)&bcch_pdu)->ndi = phy_vars_eNB->proc[sched_subframe].frame_tx&1;
+ ((DCI1A_5MHz_FDD_t*)&bcch_pdu)->rv = 1;
+ ((DCI1A_5MHz_FDD_t*)&bcch_pdu)->mcs = 1;
+ ((DCI1A_5MHz_FDD_t*)&bcch_pdu)->harq_pid = 0;
+ ((DCI1A_5MHz_FDD_t*)&bcch_pdu)->TPC = 1; // set to 3 PRB
+ memcpy((void*)&DCI_pdu->dci_alloc[0].dci_pdu[0],&bcch_pdu,sizeof(DCI1A_5MHz_TDD_1_6_t));
+ } else {
+ DCI_pdu->dci_alloc[0].dci_length = sizeof_DCI1A_5MHz_TDD_1_6_t;
+ ((DCI1A_5MHz_TDD_1_6_t*)&bcch_pdu)->type = 1;
+ ((DCI1A_5MHz_TDD_1_6_t*)&bcch_pdu)->vrb_type = 0;
+ ((DCI1A_5MHz_TDD_1_6_t*)&bcch_pdu)->rballoc = computeRIV(25,10,3);
+ ((DCI1A_5MHz_TDD_1_6_t*)&bcch_pdu)->ndi = phy_vars_eNB->proc[sched_subframe].frame_tx&1;
+ ((DCI1A_5MHz_TDD_1_6_t*)&bcch_pdu)->rv = 1;
+ ((DCI1A_5MHz_TDD_1_6_t*)&bcch_pdu)->mcs = 1;
+ ((DCI1A_5MHz_TDD_1_6_t*)&bcch_pdu)->harq_pid = 0;
+ ((DCI1A_5MHz_TDD_1_6_t*)&bcch_pdu)->TPC = 1; // set to 3 PRB
+ memcpy((void*)&DCI_pdu->dci_alloc[0].dci_pdu[0],&bcch_pdu,sizeof(DCI1A_5MHz_TDD_1_6_t));
+ }
+
+ break;
+
+ case 50:
+ if (phy_vars_eNB->lte_frame_parms.frame_type == FDD) {
+ DCI_pdu->dci_alloc[0].dci_length = sizeof_DCI1A_10MHz_FDD_t;
+ ((DCI1A_10MHz_FDD_t*)&bcch_pdu)->type = 1;
+ ((DCI1A_10MHz_FDD_t*)&bcch_pdu)->vrb_type = 0;
+ ((DCI1A_10MHz_FDD_t*)&bcch_pdu)->rballoc = computeRIV(25,10,3);
+ ((DCI1A_10MHz_FDD_t*)&bcch_pdu)->ndi = phy_vars_eNB->proc[sched_subframe].frame_tx&1;
+ ((DCI1A_10MHz_FDD_t*)&bcch_pdu)->rv = 1;
+ ((DCI1A_10MHz_FDD_t*)&bcch_pdu)->mcs = 1;
+ ((DCI1A_10MHz_FDD_t*)&bcch_pdu)->harq_pid = 0;
+ ((DCI1A_10MHz_FDD_t*)&bcch_pdu)->TPC = 1; // set to 3 PRB
+ memcpy((void*)&DCI_pdu->dci_alloc[0].dci_pdu[0],&bcch_pdu,sizeof(DCI1A_10MHz_TDD_1_6_t));
+ } else {
+ DCI_pdu->dci_alloc[0].dci_length = sizeof_DCI1A_10MHz_TDD_1_6_t;
+ ((DCI1A_10MHz_TDD_1_6_t*)&bcch_pdu)->type = 1;
+ ((DCI1A_10MHz_TDD_1_6_t*)&bcch_pdu)->vrb_type = 0;
+ ((DCI1A_10MHz_TDD_1_6_t*)&bcch_pdu)->rballoc = computeRIV(25,10,3);
+ ((DCI1A_10MHz_TDD_1_6_t*)&bcch_pdu)->ndi = phy_vars_eNB->proc[sched_subframe].frame_tx&1;
+ ((DCI1A_10MHz_TDD_1_6_t*)&bcch_pdu)->rv = 1;
+ ((DCI1A_10MHz_TDD_1_6_t*)&bcch_pdu)->mcs = 1;
+ ((DCI1A_10MHz_TDD_1_6_t*)&bcch_pdu)->harq_pid = DLSCH_ptr->harq_pid_freelist[DLSCH_ptr->head_freelist];
+ ((DCI1A_10MHz_TDD_1_6_t*)&bcch_pdu)->TPC = 1; // set to 3 PRB
+ memcpy((void*)&DCI_pdu->dci_alloc[0].dci_pdu[0],&bcch_pdu,sizeof(DCI1A_10MHz_TDD_1_6_t));
+ }
+
+ break;
+
+ case 100:
+ if (phy_vars_eNB->lte_frame_parms.frame_type == FDD) {
+ DCI_pdu->dci_alloc[0].dci_length = sizeof_DCI1A_20MHz_FDD_t;
+ ((DCI1A_20MHz_FDD_t*)&bcch_pdu)->type = 1;
+ ((DCI1A_20MHz_FDD_t*)&bcch_pdu)->vrb_type = 0;
+ ((DCI1A_20MHz_FDD_t*)&bcch_pdu)->rballoc = computeRIV(25,10,3);
+ ((DCI1A_20MHz_FDD_t*)&bcch_pdu)->ndi = phy_vars_eNB->proc[sched_subframe].frame_tx&1;
+ ((DCI1A_20MHz_FDD_t*)&bcch_pdu)->rv = 1;
+ ((DCI1A_20MHz_FDD_t*)&bcch_pdu)->mcs = 1;
+ ((DCI1A_20MHz_FDD_t*)&bcch_pdu)->harq_pid = 0;
+ ((DCI1A_20MHz_FDD_t*)&bcch_pdu)->TPC = 1; // set to 3 PRB
+ memcpy((void*)&DCI_pdu->dci_alloc[0].dci_pdu[0],&bcch_pdu,sizeof(DCI1A_20MHz_TDD_1_6_t));
+ } else {
+ DCI_pdu->dci_alloc[0].dci_length = sizeof_DCI1A_20MHz_TDD_1_6_t;
+ ((DCI1A_20MHz_TDD_1_6_t*)&bcch_pdu)->type = 1;
+ ((DCI1A_20MHz_TDD_1_6_t*)&bcch_pdu)->vrb_type = 0;
+ ((DCI1A_20MHz_TDD_1_6_t*)&bcch_pdu)->rballoc = computeRIV(25,10,3);
+ ((DCI1A_20MHz_TDD_1_6_t*)&bcch_pdu)->ndi = phy_vars_eNB->proc[sched_subframe].frame_tx&1;
+ ((DCI1A_20MHz_TDD_1_6_t*)&bcch_pdu)->rv = 1;
+ ((DCI1A_20MHz_TDD_1_6_t*)&bcch_pdu)->mcs = 1;
+ ((DCI1A_20MHz_TDD_1_6_t*)&bcch_pdu)->harq_pid = 0;
+ ((DCI1A_20MHz_TDD_1_6_t*)&bcch_pdu)->TPC = 1; // set to 3 PRB
+ memcpy((void*)&DCI_pdu->dci_alloc[0].dci_pdu[0],&bcch_pdu,sizeof(DCI1A_20MHz_TDD_1_6_t));
+ }
+
+ break;
+ }
+ break; //subframe switch
+
+ /*
+ case 6:
+ DCI_pdu->Num_ue_spec_dci = 1;
+ DCI_pdu->dci_alloc[0].dci_length = sizeof_DCI2_5MHz_2A_M10PRB_TDD_t;
+ DCI_pdu->dci_alloc[0].L = 2;
+ DCI_pdu->dci_alloc[0].rnti = 0x1236;
+ DCI_pdu->dci_alloc[0].format = format2_2A_M10PRB;
+ DCI_pdu->dci_alloc[0].ra_flag = 0;
+
+ DLSCH_alloc_pdu1.rballoc = 0x00ff;
+ DLSCH_alloc_pdu1.TPC = 0;
+ DLSCH_alloc_pdu1.dai = 0;
+ DLSCH_alloc_pdu1.harq_pid = 0;
+ DLSCH_alloc_pdu1.tb_swap = 0;
+ DLSCH_alloc_pdu1.mcs1 = 0;
+ DLSCH_alloc_pdu1.ndi1 = 1;
+ DLSCH_alloc_pdu1.rv1 = 0;
+ DLSCH_alloc_pdu1.tpmi = 0;
+ memcpy((void*)&DCI_pdu->dci_alloc[0].dci_pdu[0],(void *)&DLSCH_alloc_pdu1,sizeof(DCI2_5MHz_2A_M10PRB_TDD_t));
+ break;
+ */
+
+ default:
+ case 7:
+ DCI_pdu->Num_ue_spec_dci = 1;
+ DCI_pdu->dci_alloc[0].L = 2;
+ DCI_pdu->dci_alloc[0].rnti = 0x1235;
+ DCI_pdu->dci_alloc[0].format = format1;
+ DCI_pdu->dci_alloc[0].ra_flag = 0;
+
+ if (transmission_mode<3) {
+ //user 1
+ switch (phy_vars_eNB->lte_frame_parms.N_RB_DL) {
+ case 25:
+ if (phy_vars_eNB->lte_frame_parms.frame_type == FDD) {
+ DCI_pdu->dci_alloc[0].dci_length = sizeof_DCI1_5MHz_FDD_t;
+
+ ((DCI1_5MHz_FDD_t *)&dlsch_pdu)->rballoc = rballoc;
+ ((DCI1_5MHz_FDD_t *)&dlsch_pdu)->TPC = 0;
+ ((DCI1_5MHz_FDD_t *)&dlsch_pdu)->harq_pid = DLSCH_ptr->harq_pid_freelist[DLSCH_ptr->head_freelist];
+ ((DCI1_5MHz_FDD_t *)&dlsch_pdu)->mcs = openair_daq_vars.target_ue_dl_mcs;
+ //((DCI1_5MHz_FDD_t *)&dlsch_pdu)->mcs = (unsigned char) ((phy_vars_eNB->frame%1024)%28);
+ ((DCI1_5MHz_FDD_t *)&dlsch_pdu)->ndi = phy_vars_eNB->proc[sched_subframe].frame_tx&1;
+ ((DCI1_5MHz_FDD_t *)&dlsch_pdu)->rv = 0;
+ memcpy((void*)&DCI_pdu->dci_alloc[0].dci_pdu[0],(void *)&dlsch_pdu,sizeof(DCI1_5MHz_TDD_t));
+
+ /*
+ //user2
+ DCI_pdu->dci_alloc[1].dci_length = sizeof_DCI1_5MHz_TDD_t;
+ DCI_pdu->dci_alloc[1].L = 2;
+ DCI_pdu->dci_alloc[1].rnti = 0x1236;
+ DCI_pdu->dci_alloc[1].format = format1;
+ DCI_pdu->dci_alloc[1].ra_flag = 0;
+
+ ((DCI1_5MHz_FDD_t *)&dlsch_pdu)->rballoc = rballoc2;
+ ((DCI1_5MHz_FDD_t *)&dlsch_pdu)->TPC = 0;
+ ((DCI1_5MHz_FDD_t *)&dlsch_pdu)->dai = 0;
+ ((DCI1_5MHz_FDD_t *)&dlsch_pdu)->harq_pid = 1;
+ //((DCI1_5MHz_FDD_t *)&dlsch_pdu)->mcs = (unsigned char) ((phy_vars_eNB->proc[subframe].frame%1024)%28);
+ ((DCI1_5MHz_FDD_t *)&dlsch_pdu)->mcs = openair_daq_vars.target_ue_dl_mcs;
+ ((DCI1_5MHz_FDD_t *)&dlsch_pdu)->ndi = 1;
+ ((DCI1_5MHz_FDD_t *)&dlsch_pdu)->rv = 0;
+ memcpy((void*)&DCI_pdu->dci_alloc[1].dci_pdu[0],(void *)&((DCI1_5MHz_FDD_t *)&dlsch_pdu)->,sizeof(DCI1_5MHz_TDD_t));
+ */
+ } else {
+ DCI_pdu->dci_alloc[0].dci_length = sizeof_DCI1_5MHz_TDD_t;
+
+ ((DCI1_5MHz_TDD_t *)&dlsch_pdu)->rballoc = rballoc;
+ ((DCI1_5MHz_TDD_t *)&dlsch_pdu)->TPC = 0;
+ ((DCI1_5MHz_TDD_t *)&dlsch_pdu)->dai = 0;
+ ((DCI1_5MHz_TDD_t *)&dlsch_pdu)->harq_pid = DLSCH_ptr->harq_pid_freelist[DLSCH_ptr->head_freelist];
+ ((DCI1_5MHz_TDD_t *)&dlsch_pdu)->mcs = openair_daq_vars.target_ue_dl_mcs;
+ //((DCI1_5MHz_TDD_t *)&dlsch_pdu)->mcs = (unsigned char) ((phy_vars_eNB->frame%1024)%28);
+ ((DCI1_5MHz_TDD_t *)&dlsch_pdu)->ndi = phy_vars_eNB->proc[sched_subframe].frame_tx&1;
+ ((DCI1_5MHz_TDD_t *)&dlsch_pdu)->rv = 0;
+ memcpy((void*)&DCI_pdu->dci_alloc[0].dci_pdu[0],(void *)&dlsch_pdu,sizeof(DCI1_5MHz_TDD_t));
+
+ /*
+ //user2
+ DCI_pdu->dci_alloc[1].dci_length = sizeof_DCI1_5MHz_TDD_t;
+ DCI_pdu->dci_alloc[1].L = 2;
+ DCI_pdu->dci_alloc[1].rnti = 0x1236;
+ DCI_pdu->dci_alloc[1].format = format1;
+ DCI_pdu->dci_alloc[1].ra_flag = 0;
+
+ ((DCI1_5MHz_FDD_t *)&dlsch_pdu)->rballoc = rballoc2;
+ ((DCI1_5MHz_FDD_t *)&dlsch_pdu)->TPC = 0;
+ ((DCI1_5MHz_FDD_t *)&dlsch_pdu)->dai = 0;
+ ((DCI1_5MHz_FDD_t *)&dlsch_pdu)->harq_pid = 1;
+ //((DCI1_5MHz_FDD_t *)&dlsch_pdu)->mcs = (unsigned char) ((phy_vars_eNB->proc[subframe].frame%1024)%28);
+ ((DCI1_5MHz_FDD_t *)&dlsch_pdu)->mcs = openair_daq_vars.target_ue_dl_mcs;
+ ((DCI1_5MHz_FDD_t *)&dlsch_pdu)->ndi = 1;
+ ((DCI1_5MHz_FDD_t *)&dlsch_pdu)->rv = 0;
+ memcpy((void*)&DCI_pdu->dci_alloc[1].dci_pdu[0],(void *)&((DCI1_5MHz_FDD_t *)&dlsch_pdu)->,sizeof(DCI1_5MHz_TDD_t));
+ */
+ }
+
+ break;
+
+ case 50:
+
+ if (phy_vars_eNB->lte_frame_parms.frame_type == FDD) {
+ DCI_pdu->dci_alloc[0].dci_length = sizeof_DCI1_10MHz_FDD_t;
+
+ ((DCI1_10MHz_FDD_t *)&dlsch_pdu)->rballoc = rballoc;
+ ((DCI1_10MHz_FDD_t *)&dlsch_pdu)->TPC = 0;
+ ((DCI1_10MHz_FDD_t *)&dlsch_pdu)->harq_pid = DLSCH_ptr->harq_pid_freelist[DLSCH_ptr->head_freelist];
+ ((DCI1_10MHz_FDD_t *)&dlsch_pdu)->mcs = openair_daq_vars.target_ue_dl_mcs;
+ //((DCI1_10MHz_FDD_t *)&dlsch_pdu)->mcs = (unsigned char) ((phy_vars_eNB->frame%1024)%28);
+ ((DCI1_10MHz_FDD_t *)&dlsch_pdu)->ndi = phy_vars_eNB->proc[sched_subframe].frame_tx&1;
+ ((DCI1_10MHz_FDD_t *)&dlsch_pdu)->rv = 0;
+ memcpy((void*)&DCI_pdu->dci_alloc[0].dci_pdu[0],(void *)&dlsch_pdu,sizeof(DCI1_10MHz_TDD_t));
+
+ /*
+ //user2
+ DCI_pdu->dci_alloc[1].dci_length = sizeof_DCI1_10MHz_TDD_t;
+ DCI_pdu->dci_alloc[1].L = 2;
+ DCI_pdu->dci_alloc[1].rnti = 0x1236;
+ DCI_pdu->dci_alloc[1].format = format1;
+ DCI_pdu->dci_alloc[1].ra_flag = 0;
+
+ ((DCI1_10MHz_FDD_t *)&dlsch_pdu)->rballoc = rballoc2;
+ ((DCI1_10MHz_FDD_t *)&dlsch_pdu)->TPC = 0;
+ ((DCI1_10MHz_FDD_t *)&dlsch_pdu)->dai = 0;
+ ((DCI1_10MHz_FDD_t *)&dlsch_pdu)->harq_pid = 1;
+ //((DCI1_10MHz_FDD_t *)&dlsch_pdu)->mcs = (unsigned char) ((phy_vars_eNB->proc[subframe].frame%1024)%28);
+ ((DCI1_10MHz_FDD_t *)&dlsch_pdu)->mcs = openair_daq_vars.target_ue_dl_mcs;
+ ((DCI1_10MHz_FDD_t *)&dlsch_pdu)->ndi = 1;
+ ((DCI1_10MHz_FDD_t *)&dlsch_pdu)->rv = 0;
+ memcpy((void*)&DCI_pdu->dci_alloc[1].dci_pdu[0],(void *)&((DCI1_10MHz_FDD_t *)&dlsch_pdu)->,sizeof(DCI1_10MHz_TDD_t));
+ */
+ } else {
+ DCI_pdu->dci_alloc[0].dci_length = sizeof_DCI1_10MHz_TDD_t;
+
+ ((DCI1_10MHz_TDD_t *)&dlsch_pdu)->rballoc = rballoc;
+ ((DCI1_10MHz_TDD_t *)&dlsch_pdu)->TPC = 0;
+ ((DCI1_10MHz_TDD_t *)&dlsch_pdu)->dai = 0;
+ ((DCI1_10MHz_TDD_t *)&dlsch_pdu)->harq_pid = DLSCH_ptr->harq_pid_freelist[DLSCH_ptr->head_freelist];
+ ((DCI1_10MHz_TDD_t *)&dlsch_pdu)->mcs = openair_daq_vars.target_ue_dl_mcs;
+ //((DCI1_10MHz_TDD_t *)&dlsch_pdu)->mcs = (unsigned char) ((phy_vars_eNB->frame%1024)%28);
+ ((DCI1_10MHz_TDD_t *)&dlsch_pdu)->ndi = phy_vars_eNB->proc[sched_subframe].frame_tx&1;
+ ((DCI1_10MHz_TDD_t *)&dlsch_pdu)->rv = 0;
+ memcpy((void*)&DCI_pdu->dci_alloc[0].dci_pdu[0],(void *)&dlsch_pdu,sizeof(DCI1_10MHz_TDD_t));
+
+ /*
+ //user2
+ DCI_pdu->dci_alloc[1].dci_length = sizeof_DCI1_10MHz_TDD_t;
+ DCI_pdu->dci_alloc[1].L = 2;
+ DCI_pdu->dci_alloc[1].rnti = 0x1236;
+ DCI_pdu->dci_alloc[1].format = format1;
+ DCI_pdu->dci_alloc[1].ra_flag = 0;
+
+ ((DCI1_10MHz_FDD_t *)&dlsch_pdu)->rballoc = rballoc2;
+ ((DCI1_10MHz_FDD_t *)&dlsch_pdu)->TPC = 0;
+ ((DCI1_10MHz_FDD_t *)&dlsch_pdu)->dai = 0;
+ ((DCI1_10MHz_FDD_t *)&dlsch_pdu)->harq_pid = 1;
+ //((DCI1_10MHz_FDD_t *)&dlsch_pdu)->mcs = (unsigned char) ((phy_vars_eNB->proc[subframe].frame%1024)%28);
+ ((DCI1_10MHz_FDD_t *)&dlsch_pdu)->mcs = openair_daq_vars.target_ue_dl_mcs;
+ ((DCI1_10MHz_FDD_t *)&dlsch_pdu)->ndi = 1;
+ ((DCI1_10MHz_FDD_t *)&dlsch_pdu)->rv = 0;
+ memcpy((void*)&DCI_pdu->dci_alloc[1].dci_pdu[0],(void *)&((DCI1_10MHz_FDD_t *)&dlsch_pdu)->,sizeof(DCI1_10MHz_TDD_t));
+ */
+ }
+
+ break;
+
+ case 100:
+ if (phy_vars_eNB->lte_frame_parms.frame_type == FDD) {
+ DCI_pdu->dci_alloc[0].dci_length = sizeof_DCI1_5MHz_FDD_t;
+
+ ((DCI1_5MHz_FDD_t *)&dlsch_pdu)->rballoc = rballoc;
+ ((DCI1_5MHz_FDD_t *)&dlsch_pdu)->TPC = 0;
+ ((DCI1_5MHz_FDD_t *)&dlsch_pdu)->harq_pid = DLSCH_ptr->harq_pid_freelist[DLSCH_ptr->head_freelist];
+ ((DCI1_5MHz_FDD_t *)&dlsch_pdu)->mcs = openair_daq_vars.target_ue_dl_mcs;
+ //((DCI1_5MHz_FDD_t *)&dlsch_pdu)->mcs = (unsigned char) ((phy_vars_eNB->frame%1024)%28);
+ ((DCI1_5MHz_FDD_t *)&dlsch_pdu)->ndi = phy_vars_eNB->proc[sched_subframe].frame_tx&1;
+ ((DCI1_5MHz_FDD_t *)&dlsch_pdu)->rv = 0;
+ memcpy((void*)&DCI_pdu->dci_alloc[0].dci_pdu[0],(void *)&dlsch_pdu,sizeof(DCI1_5MHz_TDD_t));
+
+ /*
+ //user2
+ DCI_pdu->dci_alloc[1].dci_length = sizeof_DCI1_5MHz_TDD_t;
+ DCI_pdu->dci_alloc[1].L = 2;
+ DCI_pdu->dci_alloc[1].rnti = 0x1236;
+ DCI_pdu->dci_alloc[1].format = format1;
+ DCI_pdu->dci_alloc[1].ra_flag = 0;
+
+ ((DCI1_5MHz_FDD_t *)&dlsch_pdu)->rballoc = rballoc2;
+ ((DCI1_5MHz_FDD_t *)&dlsch_pdu)->TPC = 0;
+ ((DCI1_5MHz_FDD_t *)&dlsch_pdu)->dai = 0;
+ ((DCI1_5MHz_FDD_t *)&dlsch_pdu)->harq_pid = 1;
+ //((DCI1_5MHz_FDD_t *)&dlsch_pdu)->mcs = (unsigned char) ((phy_vars_eNB->proc[subframe].frame%1024)%28);
+ ((DCI1_5MHz_FDD_t *)&dlsch_pdu)->mcs = openair_daq_vars.target_ue_dl_mcs;
+ ((DCI1_5MHz_FDD_t *)&dlsch_pdu)->ndi = 1;
+ ((DCI1_5MHz_FDD_t *)&dlsch_pdu)->rv = 0;
+ memcpy((void*)&DCI_pdu->dci_alloc[1].dci_pdu[0],(void *)&((DCI1_5MHz_FDD_t *)&dlsch_pdu)->,sizeof(DCI1_5MHz_TDD_t));
+ */
+ } else {
+ DCI_pdu->dci_alloc[0].dci_length = sizeof_DCI1_20MHz_TDD_t;
+
+ ((DCI1_20MHz_TDD_t *)&dlsch_pdu)->rballoc = rballoc;
+ ((DCI1_20MHz_TDD_t *)&dlsch_pdu)->TPC = 0;
+ ((DCI1_20MHz_TDD_t *)&dlsch_pdu)->dai = 0;
+ ((DCI1_20MHz_TDD_t *)&dlsch_pdu)->harq_pid = DLSCH_ptr->harq_pid_freelist[DLSCH_ptr->head_freelist];
+ ((DCI1_20MHz_TDD_t *)&dlsch_pdu)->mcs = openair_daq_vars.target_ue_dl_mcs;
+ //((DCI1_20MHz_TDD_t *)&dlsch_pdu)->mcs = (unsigned char) ((phy_vars_eNB->frame%1024)%28);
+ ((DCI1_20MHz_TDD_t *)&dlsch_pdu)->ndi = phy_vars_eNB->proc[sched_subframe].frame_tx&1;
+ ((DCI1_20MHz_TDD_t *)&dlsch_pdu)->rv = 0;
+ memcpy((void*)&DCI_pdu->dci_alloc[0].dci_pdu[0],(void *)&dlsch_pdu,sizeof(DCI1_20MHz_TDD_t));
+
+ /*
+ //user2
+ DCI_pdu->dci_alloc[1].dci_length = sizeof_DCI1_20MHz_TDD_t;
+ DCI_pdu->dci_alloc[1].L = 2;
+ DCI_pdu->dci_alloc[1].rnti = 0x1236;
+ DCI_pdu->dci_alloc[1].format = format1;
+ DCI_pdu->dci_alloc[1].ra_flag = 0;
+
+ ((DCI1_20MHz_FDD_t *)&dlsch_pdu)->rballoc = rballoc2;
+ ((DCI1_20MHz_FDD_t *)&dlsch_pdu)->TPC = 0;
+ ((DCI1_20MHz_FDD_t *)&dlsch_pdu)->dai = 0;
+ ((DCI1_20MHz_FDD_t *)&dlsch_pdu)->harq_pid = 1;
+ //((DCI1_20MHz_FDD_t *)&dlsch_pdu)->mcs = (unsigned char) ((phy_vars_eNB->proc[subframe].frame%1024)%28);
+ ((DCI1_20MHz_FDD_t *)&dlsch_pdu)->mcs = openair_daq_vars.target_ue_dl_mcs;
+ ((DCI1_20MHz_FDD_t *)&dlsch_pdu)->ndi = 1;
+ ((DCI1_20MHz_FDD_t *)&dlsch_pdu)->rv = 0;
+ memcpy((void*)&DCI_pdu->dci_alloc[1].dci_pdu[0],(void *)&((DCI1_20MHz_FDD_t *)&dlsch_pdu)->,sizeof(DCI1_5MHz_TDD_t));
+ */
+ }
+
+ break;
+ }
+ } else if (transmission_mode==4) {
+ DCI_pdu->Num_ue_spec_dci = 1;
+ // user 1
+ DCI_pdu->dci_alloc[0].dci_length = sizeof_DCI2_5MHz_2A_FDD_t;
+ DCI_pdu->dci_alloc[0].L = 3;
+ DCI_pdu->dci_alloc[0].rnti = 0x1235;
+ DCI_pdu->dci_alloc[0].format = format2;
+ DCI_pdu->dci_alloc[0].ra_flag = 0;
+
+ ((DCI2_5MHz_2A_FDD_t*) (&DCI_pdu->dci_alloc[0].dci_pdu))->tpmi = 0;
+ ((DCI2_5MHz_2A_FDD_t*) (&DCI_pdu->dci_alloc[0].dci_pdu))->rv1 = 0;
+ ((DCI2_5MHz_2A_FDD_t*) (&DCI_pdu->dci_alloc[0].dci_pdu))->ndi1 = phy_vars_eNB->proc[sched_subframe].frame_tx&1;
+ ((DCI2_5MHz_2A_FDD_t*) (&DCI_pdu->dci_alloc[0].dci_pdu))->mcs1 = openair_daq_vars.target_ue_dl_mcs;
+ ((DCI2_5MHz_2A_FDD_t*) (&DCI_pdu->dci_alloc[0].dci_pdu))->rv2 = 0;
+ ((DCI2_5MHz_2A_FDD_t*) (&DCI_pdu->dci_alloc[0].dci_pdu))->ndi2 = phy_vars_eNB->proc[sched_subframe].frame_tx&1;
+ ((DCI2_5MHz_2A_FDD_t*) (&DCI_pdu->dci_alloc[0].dci_pdu))->mcs2 = openair_daq_vars.target_ue_dl_mcs;
+ ((DCI2_5MHz_2A_FDD_t*) (&DCI_pdu->dci_alloc[0].dci_pdu))->tb_swap = 0;
+ ((DCI2_5MHz_2A_FDD_t*) (&DCI_pdu->dci_alloc[0].dci_pdu))->harq_pid = DLSCH_ptr->harq_pid_freelist[DLSCH_ptr->head_freelist];
+ ((DCI2_5MHz_2A_FDD_t*) (&DCI_pdu->dci_alloc[0].dci_pdu))->TPC = 0;
+ ((DCI2_5MHz_2A_FDD_t*) (&DCI_pdu->dci_alloc[0].dci_pdu))->rballoc = openair_daq_vars.ue_dl_rb_alloc;
+ ((DCI2_5MHz_2A_FDD_t*) (&DCI_pdu->dci_alloc[0].dci_pdu))->rah = 0;
+
+ } else if (transmission_mode==5) {
+ DCI_pdu->Num_ue_spec_dci = 2;
+ // user 1
+ DCI_pdu->dci_alloc[0].dci_length = sizeof_DCI1E_5MHz_2A_M10PRB_TDD_t;
+ DCI_pdu->dci_alloc[0].L = 3;
+ DCI_pdu->dci_alloc[0].rnti = 0x1235;
+ DCI_pdu->dci_alloc[0].format = format1E_2A_M10PRB;
+ DCI_pdu->dci_alloc[0].ra_flag = 0;
+
+ DLSCH_alloc_pdu1E.tpmi = 5; //5=use feedback
+ DLSCH_alloc_pdu1E.rv = 0;
+ DLSCH_alloc_pdu1E.ndi = phy_vars_eNB->proc[sched_subframe].frame_tx&1;
+ //DLSCH_alloc_pdu1E.mcs = cqi_to_mcs[phy_vars_eNB->eNB_UE_stats->DL_cqi[0]];
+ //DLSCH_alloc_pdu1E.mcs = (unsigned char) (taus()%28);
+ DLSCH_alloc_pdu1E.mcs = openair_daq_vars.target_ue_dl_mcs;
+ //DLSCH_alloc_pdu1E.mcs = (unsigned char) ((phy_vars_eNB->proc[subframe].frame%1024)%28);
+ phy_vars_eNB->eNB_UE_stats[0].dlsch_mcs1 = DLSCH_alloc_pdu1E.mcs;
+ DLSCH_alloc_pdu1E.harq_pid = DLSCH_ptr->harq_pid_freelist[DLSCH_ptr->head_freelist];
+ DLSCH_alloc_pdu1E.dai = 0;
+ DLSCH_alloc_pdu1E.TPC = 0;
+ DLSCH_alloc_pdu1E.rballoc = openair_daq_vars.ue_dl_rb_alloc;
+ DLSCH_alloc_pdu1E.rah = 0;
+ DLSCH_alloc_pdu1E.dl_power_off = 0; //0=second user present
+ memcpy((void*)&DCI_pdu->dci_alloc[0].dci_pdu[0],(void *)&DLSCH_alloc_pdu1E,sizeof(DCI1E_5MHz_2A_M10PRB_TDD_t));
+
+ //user 2
+ DCI_pdu->dci_alloc[1].dci_length = sizeof_DCI1E_5MHz_2A_M10PRB_TDD_t;
+ DCI_pdu->dci_alloc[1].L = 0;
+ DCI_pdu->dci_alloc[1].rnti = 0x1236;
+ DCI_pdu->dci_alloc[1].format = format1E_2A_M10PRB;
+ DCI_pdu->dci_alloc[1].ra_flag = 0;
+ //DLSCH_alloc_pdu1E.mcs = openair_daq_vars.target_ue_dl_mcs;
+ //DLSCH_alloc_pdu1E.mcs = (unsigned char) (taus()%28);
+ //DLSCH_alloc_pdu1E.mcs = (unsigned char) ((phy_vars_eNB->frame%1024)%28);
+ DLSCH_alloc_pdu1E.mcs = (unsigned char) (((phy_vars_eNB->proc[sched_subframe].frame_tx%1024)/3)%28);
+ phy_vars_eNB->eNB_UE_stats[1].dlsch_mcs1 = DLSCH_alloc_pdu1E.mcs;
+
+ memcpy((void*)&DCI_pdu->dci_alloc[1].dci_pdu[0],(void *)&DLSCH_alloc_pdu1E,sizeof(DCI1E_5MHz_2A_M10PRB_TDD_t));
+
+ // set the precoder of the second UE orthogonal to the first
+ phy_vars_eNB->eNB_UE_stats[1].DL_pmi_single = (phy_vars_eNB->eNB_UE_stats[0].DL_pmi_single ^ 0x1555);
+ }
+
+ break; //subframe switch
+
+ /*
+ case 8:
+ DCI_pdu->Num_common_dci = 1;
+ DCI_pdu->dci_alloc[0].dci_length = sizeof_DCI1A_5MHz_TDD_1_6_t;
+ DCI_pdu->dci_alloc[0].L = 2;
+ DCI_pdu->dci_alloc[0].rnti = 0xbeef;
+ DCI_pdu->dci_alloc[0].format = format1A;
+ DCI_pdu->dci_alloc[0].ra_flag = 1;
+
+ RA_alloc_pdu.type = 1;
+ RA_alloc_pdu.vrb_type = 0;
+ RA_alloc_pdu.rballoc = computeRIV(25,12,3);
+ RA_alloc_pdu.ndi = 1;
+ RA_alloc_pdu.rv = 1;
+ RA_alloc_pdu.mcs = 4;
+ RA_alloc_pdu.harq_pid = 0;
+ RA_alloc_pdu.TPC = 1;
+
+ memcpy((void*)&DCI_pdu->dci_alloc[0].dci_pdu[0],&RA_alloc_pdu,sizeof(DCI1A_5MHz_TDD_1_6_t));
+ break;
+ */
+ /*
+ case 9:
+ DCI_pdu->Num_ue_spec_dci = 1;
+
+ //user 1
+ if (phy_vars_eNB->lte_frame_parms.frame_type == FDD)
+ DCI_pdu->dci_alloc[0].dci_length = sizeof_DCI0_5MHz_FDD_t ;
+ else
+ DCI_pdu->dci_alloc[0].dci_length = sizeof_DCI0_5MHz_TDD_1_6_t ;
+
+ DCI_pdu->dci_alloc[0].L = 2;
+ DCI_pdu->dci_alloc[0].rnti = 0x1235;
+ DCI_pdu->dci_alloc[0].format = format0;
+ DCI_pdu->dci_alloc[0].ra_flag = 0;
+
+ UL_alloc_pdu.type = 0;
+ UL_alloc_pdu.hopping = 0;
+ UL_alloc_pdu.rballoc = computeRIV(25,2,openair_daq_vars.ue_ul_nb_rb);
+ UL_alloc_pdu.mcs = openair_daq_vars.target_ue_ul_mcs;
+ UL_alloc_pdu.ndi = phy_vars_eNB->proc[sched_subframe].frame_tx&1;
+ UL_alloc_pdu.TPC = 0;
+ UL_alloc_pdu.cshift = 0;
+ UL_alloc_pdu.dai = 0;
+ UL_alloc_pdu.cqi_req = 1;
+ memcpy((void*)&DCI_pdu->dci_alloc[0].dci_pdu[0],(void *)&UL_alloc_pdu,sizeof(DCI0_5MHz_TDD_1_6_t));
+ */
+ // user 2
+ /*
+ DCI_pdu->dci_alloc[1].dci_length = sizeof_DCI0_5MHz_TDD_1_6_t ;
+ DCI_pdu->dci_alloc[1].L = 2;
+ DCI_pdu->dci_alloc[1].rnti = 0x1236;
+ DCI_pdu->dci_alloc[1].format = format0;
+ DCI_pdu->dci_alloc[1].ra_flag = 0;
+
+ UL_alloc_pdu.type = 0;
+ UL_alloc_pdu.hopping = 0;
+ if (cooperation_flag==0)
+ UL_alloc_pdu.rballoc = computeRIV(25,2+openair_daq_vars.ue_ul_nb_rb,openair_daq_vars.ue_ul_nb_rb);
+ else
+ UL_alloc_pdu.rballoc = computeRIV(25,0,openair_daq_vars.ue_ul_nb_rb);
+ UL_alloc_pdu.mcs = openair_daq_vars.target_ue_ul_mcs;
+ UL_alloc_pdu.ndi = phy_vars_eNB->proc[sched_subframe].frame_tx&1;
+ UL_alloc_pdu.TPC = 0;
+ if ((cooperation_flag==0) || (cooperation_flag==1))
+ UL_alloc_pdu.cshift = 0;
+ else
+ UL_alloc_pdu.cshift = 1;
+ UL_alloc_pdu.dai = 0;
+ UL_alloc_pdu.cqi_req = 1;
+ memcpy((void*)&DCI_pdu->dci_alloc[1].dci_pdu[0],(void *)&UL_alloc_pdu,sizeof(DCI0_5MHz_TDD_1_6_t));
+ break;
+ */
+
+ /*default:
+ break;*/
+ }
+
+ DCI_pdu->nCCE = 0;
+
+ for (i=0; iNum_common_dci+DCI_pdu->Num_ue_spec_dci; i++) {
+ DCI_pdu->nCCE += (1<<(DCI_pdu->dci_alloc[i].L));
+ }
+
+}
+
+void fill_dci_emos(DCI_PDU *DCI_pdu, uint8_t subframe, PHY_VARS_eNB *phy_vars_eNB)
+{
+
+ int i;
+ uint8_t cooperation_flag = phy_vars_eNB->cooperation_flag;
+ uint8_t transmission_mode = phy_vars_eNB->transmission_mode[0];
+
+ //uint32_t rballoc = 0x00F0;
+ //uint32_t rballoc2 = 0x000F;
+ /*
+ uint32_t rand = taus();
+ if ((subframe==8) || (subframe==9) || (subframe==0))
+ rand = (rand%5)+5;
+ else
+ rand = (rand%4)+5;
+ */
+
+ DCI_pdu->Num_common_dci = 0;
+ DCI_pdu->Num_ue_spec_dci=0;
+
+ switch (subframe) {
+ case 5:
+ DCI_pdu->Num_ue_spec_dci = 1;
+
+ if (transmission_mode<3) {
+ //user 1
+ DCI_pdu->dci_alloc[0].dci_length = sizeof_DCI1_5MHz_TDD_t;
+ DCI_pdu->dci_alloc[0].L = 2;
+ DCI_pdu->dci_alloc[0].rnti = 0x1235;
+ DCI_pdu->dci_alloc[0].format = format1;
+ DCI_pdu->dci_alloc[0].ra_flag = 0;
+
+ DLSCH_alloc_pdu.rballoc = openair_daq_vars.ue_dl_rb_alloc;
+ DLSCH_alloc_pdu.TPC = 0;
+ DLSCH_alloc_pdu.dai = 0;
+ DLSCH_alloc_pdu.harq_pid = 1;
+ DLSCH_alloc_pdu.mcs = openair_daq_vars.target_ue_dl_mcs;
+ DLSCH_alloc_pdu.ndi = 1;
+ DLSCH_alloc_pdu.rv = 0;
+ memcpy((void*)&DCI_pdu->dci_alloc[0].dci_pdu[0],(void *)&DLSCH_alloc_pdu,sizeof(DCI1_5MHz_TDD_t));
+
+ /*
+ //user2
+ DCI_pdu->dci_alloc[1].dci_length = sizeof_DCI1_5MHz_TDD_t;
+ DCI_pdu->dci_alloc[1].L = 2;
+ DCI_pdu->dci_alloc[1].rnti = 0x1236;
+ DCI_pdu->dci_alloc[1].format = format1;
+ DCI_pdu->dci_alloc[1].ra_flag = 0;
+
+ DLSCH_alloc_pdu.rballoc = rballoc2;
+ DLSCH_alloc_pdu.TPC = 0;
+ DLSCH_alloc_pdu.dai = 0;
+ DLSCH_alloc_pdu.harq_pid = 1;
+ DLSCH_alloc_pdu.mcs = openair_daq_vars.target_ue_dl_mcs;
+ DLSCH_alloc_pdu.ndi = 1;
+ DLSCH_alloc_pdu.rv = 0;
+ memcpy((void*)&DCI_pdu->dci_alloc[1].dci_pdu[0],(void *)&DLSCH_alloc_pdu,sizeof(DCI1_5MHz_TDD_t));
+ */
+ } else if (transmission_mode==5) {
+ DCI_pdu->Num_ue_spec_dci = 2;
+ // user 1
+ DCI_pdu->dci_alloc[0].dci_length = sizeof_DCI1E_5MHz_2A_M10PRB_TDD_t;
+ DCI_pdu->dci_alloc[0].L = 2;
+ DCI_pdu->dci_alloc[0].rnti = 0x1235;
+ DCI_pdu->dci_alloc[0].format = format1E_2A_M10PRB;
+ DCI_pdu->dci_alloc[0].ra_flag = 0;
+
+ DLSCH_alloc_pdu1E.tpmi = 5; //5=use feedback
+ DLSCH_alloc_pdu1E.rv = 0;
+ DLSCH_alloc_pdu1E.ndi = 1;
+ DLSCH_alloc_pdu1E.mcs = openair_daq_vars.target_ue_dl_mcs;
+ DLSCH_alloc_pdu1E.harq_pid = 1;
+ DLSCH_alloc_pdu1E.dai = 0;
+ DLSCH_alloc_pdu1E.TPC = 0;
+ DLSCH_alloc_pdu1E.rballoc = openair_daq_vars.ue_dl_rb_alloc;
+ DLSCH_alloc_pdu1E.rah = 0;
+ DLSCH_alloc_pdu1E.dl_power_off = 0; //0=second user present
+ memcpy((void*)&DCI_pdu->dci_alloc[0].dci_pdu[0],(void *)&DLSCH_alloc_pdu1E,sizeof(DCI1E_5MHz_2A_M10PRB_TDD_t));
+
+ //user 2
+ DCI_pdu->dci_alloc[1].dci_length = sizeof_DCI1E_5MHz_2A_M10PRB_TDD_t;
+ DCI_pdu->dci_alloc[1].L = 2;
+ DCI_pdu->dci_alloc[1].rnti = 0x1236;
+ DCI_pdu->dci_alloc[1].format = format1E_2A_M10PRB;
+ DCI_pdu->dci_alloc[1].ra_flag = 0;
+
+ memcpy((void*)&DCI_pdu->dci_alloc[1].dci_pdu[0],(void *)&DLSCH_alloc_pdu1E,sizeof(DCI1E_5MHz_2A_M10PRB_TDD_t));
+
+ // set the precoder of the second UE orthogonal to the first
+ phy_vars_eNB->eNB_UE_stats[1].DL_pmi_single = (phy_vars_eNB->eNB_UE_stats[0].DL_pmi_single ^ 0x1555);
+ }
+
+ break;
+
+ case 7:
+ DCI_pdu->Num_common_dci = 1;
+ DCI_pdu->dci_alloc[0].dci_length = sizeof_DCI1A_5MHz_TDD_1_6_t;
+ DCI_pdu->dci_alloc[0].L = 2;
+ DCI_pdu->dci_alloc[0].rnti = 0xbeef;
+ DCI_pdu->dci_alloc[0].format = format1A;
+ DCI_pdu->dci_alloc[0].ra_flag = 1;
+
+ RA_alloc_pdu.type = 1;
+ RA_alloc_pdu.vrb_type = 0;
+ RA_alloc_pdu.rballoc = computeRIV(25,12,3);
+ RA_alloc_pdu.ndi = 1;
+ RA_alloc_pdu.rv = 1;
+ RA_alloc_pdu.mcs = 4;
+ RA_alloc_pdu.harq_pid = 0;
+ RA_alloc_pdu.TPC = 1;
+
+ memcpy((void*)&DCI_pdu->dci_alloc[0].dci_pdu[0],&RA_alloc_pdu,sizeof(DCI1A_5MHz_TDD_1_6_t));
+ break;
+
+ case 9:
+ DCI_pdu->Num_ue_spec_dci = 1;
+
+ //user 1
+ DCI_pdu->dci_alloc[0].dci_length = sizeof_DCI0_5MHz_TDD_1_6_t ;
+ DCI_pdu->dci_alloc[0].L = 2;
+ DCI_pdu->dci_alloc[0].rnti = 0x1235;
+ DCI_pdu->dci_alloc[0].format = format0;
+ DCI_pdu->dci_alloc[0].ra_flag = 0;
+
+ UL_alloc_pdu.type = 0;
+ UL_alloc_pdu.hopping = 0;
+ UL_alloc_pdu.rballoc = computeRIV(25,0,openair_daq_vars.ue_ul_nb_rb);
+ UL_alloc_pdu.mcs = openair_daq_vars.target_ue_ul_mcs;
+ UL_alloc_pdu.ndi = 1;
+ UL_alloc_pdu.TPC = 0;
+ UL_alloc_pdu.cshift = 0;
+ UL_alloc_pdu.dai = 0;
+ UL_alloc_pdu.cqi_req = 1;
+ memcpy((void*)&DCI_pdu->dci_alloc[0].dci_pdu[0],(void *)&UL_alloc_pdu,sizeof(DCI0_5MHz_TDD_1_6_t));
+
+ /*
+ //user 2
+ DCI_pdu->dci_alloc[1].dci_length = sizeof_DCI0_5MHz_TDD_1_6_t ;
+ DCI_pdu->dci_alloc[1].L = 2;
+ DCI_pdu->dci_alloc[1].rnti = 0x1236;
+ DCI_pdu->dci_alloc[1].format = format0;
+ DCI_pdu->dci_alloc[1].ra_flag = 0;
+
+ UL_alloc_pdu.type = 0;
+ UL_alloc_pdu.hopping = 0;
+ if (cooperation_flag==0)
+ UL_alloc_pdu.rballoc = computeRIV(25,2+openair_daq_vars.ue_ul_nb_rb,openair_daq_vars.ue_ul_nb_rb);
+ else
+ UL_alloc_pdu.rballoc = computeRIV(25,0,openair_daq_vars.ue_ul_nb_rb);
+ UL_alloc_pdu.mcs = openair_daq_vars.target_ue_ul_mcs;
+ UL_alloc_pdu.ndi = 1;
+ UL_alloc_pdu.TPC = 0;
+ if ((cooperation_flag==0) || (cooperation_flag==1))
+ UL_alloc_pdu.cshift = 0;
+ else
+ UL_alloc_pdu.cshift = 1;
+ UL_alloc_pdu.dai = 0;
+ UL_alloc_pdu.cqi_req = 1;
+ memcpy((void*)&DCI_pdu->dci_alloc[1].dci_pdu[0],(void *)&UL_alloc_pdu,sizeof(DCI0_5MHz_TDD_1_6_t));
+ */
+ break;
+
+ default:
+ break;
+ }
+
+ DCI_pdu->nCCE = 0;
+
+ for (i=0; iNum_common_dci+DCI_pdu->Num_ue_spec_dci; i++) {
+ DCI_pdu->nCCE += (1<<(DCI_pdu->dci_alloc[i].L));
+ }
+
+}
diff --git a/openair1/SCHED/phy_procedures_lte_eNb.c b/openair1/SCHED/phy_procedures_lte_eNb.c
index 60cd0ec0f7..375c0dcd1f 100755
--- a/openair1/SCHED/phy_procedures_lte_eNb.c
+++ b/openair1/SCHED/phy_procedures_lte_eNb.c
@@ -52,12 +52,10 @@
//#define DEBUG_PHY_PROC (Already defined in cmake)
//#define DEBUG_ULSCH
-//#ifdef OPENAIR2
#include "LAYER2/MAC/extern.h"
#include "LAYER2/MAC/defs.h"
#include "UTIL/LOG/log.h"
#include "UTIL/LOG/vcd_signal_dumper.h"
-//#endif
#include "assertions.h"
#include "msc.h"
@@ -479,689 +477,6 @@ void phy_procedures_emos_eNB_RX(unsigned char subframe,PHY_VARS_eNB *phy_vars_eN
}
#endif
-#ifndef OPENAIR2
-void fill_dci(DCI_PDU *DCI_pdu, uint8_t sched_subframe, PHY_VARS_eNB *phy_vars_eNB)
-{
-
- int i;
- uint8_t cooperation_flag = phy_vars_eNB->cooperation_flag;
- uint8_t transmission_mode = phy_vars_eNB->transmission_mode[0];
-
- uint32_t rballoc = 0x7FFF;
- uint32_t rballoc2 = 0x000F;
- int subframe = phy_vars_eNB->proc[sched_subframe].subframe_tx;
- /*
- uint32_t rand = taus();
- if ((subframe==8) || (subframe==9) || (subframe==0))
- rand = (rand%5)+5;
- else
- rand = (rand%4)+5;
- */
- uint32_t bcch_pdu;
- uint64_t dlsch_pdu;
-
- DCI_pdu->Num_common_dci = 0;
- DCI_pdu->Num_ue_spec_dci=0;
-
-
-
- switch (subframe) {
- case 5:
- DCI_pdu->Num_common_dci = 1;
- DCI_pdu->dci_alloc[0].L = 2;
- DCI_pdu->dci_alloc[0].rnti = SI_RNTI;
- DCI_pdu->dci_alloc[0].format = format1A;
- DCI_pdu->dci_alloc[0].ra_flag = 0;
-
- switch (phy_vars_eNB->lte_frame_parms.N_RB_DL) {
- case 6:
- if (phy_vars_eNB->lte_frame_parms.frame_type == FDD) {
- DCI_pdu->dci_alloc[0].dci_length = sizeof_DCI1A_1_5MHz_FDD_t;
- ((DCI1A_1_5MHz_FDD_t*)&bcch_pdu)->type = 1;
- ((DCI1A_1_5MHz_FDD_t*)&bcch_pdu)->vrb_type = 0;
- ((DCI1A_1_5MHz_FDD_t*)&bcch_pdu)->rballoc = computeRIV(25,10,3);
- ((DCI1A_1_5MHz_FDD_t*)&bcch_pdu)->ndi = phy_vars_eNB->proc[sched_subframe].frame_tx&1;
- ((DCI1A_1_5MHz_FDD_t*)&bcch_pdu)->rv = 1;
- ((DCI1A_1_5MHz_FDD_t*)&bcch_pdu)->mcs = 1;
- ((DCI1A_1_5MHz_FDD_t*)&bcch_pdu)->harq_pid = 0;
- ((DCI1A_1_5MHz_FDD_t*)&bcch_pdu)->TPC = 1; // set to 3 PRB
- memcpy((void*)&DCI_pdu->dci_alloc[0].dci_pdu[0],&bcch_pdu,sizeof(DCI1A_1_5MHz_TDD_1_6_t));
- } else {
- DCI_pdu->dci_alloc[0].dci_length = sizeof_DCI1A_1_5MHz_TDD_1_6_t;
- ((DCI1A_1_5MHz_TDD_1_6_t*)&bcch_pdu)->type = 1;
- ((DCI1A_1_5MHz_TDD_1_6_t*)&bcch_pdu)->vrb_type = 0;
- ((DCI1A_1_5MHz_TDD_1_6_t*)&bcch_pdu)->rballoc = computeRIV(25,10,3);
- ((DCI1A_1_5MHz_TDD_1_6_t*)&bcch_pdu)->ndi = phy_vars_eNB->proc[sched_subframe].frame_tx&1;
- ((DCI1A_1_5MHz_TDD_1_6_t*)&bcch_pdu)->rv = 1;
- ((DCI1A_1_5MHz_TDD_1_6_t*)&bcch_pdu)->mcs = 1;
- ((DCI1A_1_5MHz_TDD_1_6_t*)&bcch_pdu)->harq_pid = 0;
- ((DCI1A_1_5MHz_TDD_1_6_t*)&bcch_pdu)->TPC = 1; // set to 3 PRB
- memcpy((void*)&DCI_pdu->dci_alloc[0].dci_pdu[0],&bcch_pdu,sizeof(DCI1A_1_5MHz_TDD_1_6_t));
- }
-
- break;
-
- case 25:
- default:
- if (phy_vars_eNB->lte_frame_parms.frame_type == FDD) {
- DCI_pdu->dci_alloc[0].dci_length = sizeof_DCI1A_5MHz_FDD_t;
- ((DCI1A_5MHz_FDD_t*)&bcch_pdu)->type = 1;
- ((DCI1A_5MHz_FDD_t*)&bcch_pdu)->vrb_type = 0;
- ((DCI1A_5MHz_FDD_t*)&bcch_pdu)->rballoc = computeRIV(25,10,3);
- ((DCI1A_5MHz_FDD_t*)&bcch_pdu)->ndi = phy_vars_eNB->proc[sched_subframe].frame_tx&1;
- ((DCI1A_5MHz_FDD_t*)&bcch_pdu)->rv = 1;
- ((DCI1A_5MHz_FDD_t*)&bcch_pdu)->mcs = 1;
- ((DCI1A_5MHz_FDD_t*)&bcch_pdu)->harq_pid = 0;
- ((DCI1A_5MHz_FDD_t*)&bcch_pdu)->TPC = 1; // set to 3 PRB
- memcpy((void*)&DCI_pdu->dci_alloc[0].dci_pdu[0],&bcch_pdu,sizeof(DCI1A_5MHz_TDD_1_6_t));
- } else {
- DCI_pdu->dci_alloc[0].dci_length = sizeof_DCI1A_5MHz_TDD_1_6_t;
- ((DCI1A_5MHz_TDD_1_6_t*)&bcch_pdu)->type = 1;
- ((DCI1A_5MHz_TDD_1_6_t*)&bcch_pdu)->vrb_type = 0;
- ((DCI1A_5MHz_TDD_1_6_t*)&bcch_pdu)->rballoc = computeRIV(25,10,3);
- ((DCI1A_5MHz_TDD_1_6_t*)&bcch_pdu)->ndi = phy_vars_eNB->proc[sched_subframe].frame_tx&1;
- ((DCI1A_5MHz_TDD_1_6_t*)&bcch_pdu)->rv = 1;
- ((DCI1A_5MHz_TDD_1_6_t*)&bcch_pdu)->mcs = 1;
- ((DCI1A_5MHz_TDD_1_6_t*)&bcch_pdu)->harq_pid = 0;
- ((DCI1A_5MHz_TDD_1_6_t*)&bcch_pdu)->TPC = 1; // set to 3 PRB
- memcpy((void*)&DCI_pdu->dci_alloc[0].dci_pdu[0],&bcch_pdu,sizeof(DCI1A_5MHz_TDD_1_6_t));
- }
-
- break;
-
- case 50:
- if (phy_vars_eNB->lte_frame_parms.frame_type == FDD) {
- DCI_pdu->dci_alloc[0].dci_length = sizeof_DCI1A_10MHz_FDD_t;
- ((DCI1A_10MHz_FDD_t*)&bcch_pdu)->type = 1;
- ((DCI1A_10MHz_FDD_t*)&bcch_pdu)->vrb_type = 0;
- ((DCI1A_10MHz_FDD_t*)&bcch_pdu)->rballoc = computeRIV(25,10,3);
- ((DCI1A_10MHz_FDD_t*)&bcch_pdu)->ndi = phy_vars_eNB->proc[sched_subframe].frame_tx&1;
- ((DCI1A_10MHz_FDD_t*)&bcch_pdu)->rv = 1;
- ((DCI1A_10MHz_FDD_t*)&bcch_pdu)->mcs = 1;
- ((DCI1A_10MHz_FDD_t*)&bcch_pdu)->harq_pid = 0;
- ((DCI1A_10MHz_FDD_t*)&bcch_pdu)->TPC = 1; // set to 3 PRB
- memcpy((void*)&DCI_pdu->dci_alloc[0].dci_pdu[0],&bcch_pdu,sizeof(DCI1A_10MHz_TDD_1_6_t));
- } else {
- DCI_pdu->dci_alloc[0].dci_length = sizeof_DCI1A_10MHz_TDD_1_6_t;
- ((DCI1A_10MHz_TDD_1_6_t*)&bcch_pdu)->type = 1;
- ((DCI1A_10MHz_TDD_1_6_t*)&bcch_pdu)->vrb_type = 0;
- ((DCI1A_10MHz_TDD_1_6_t*)&bcch_pdu)->rballoc = computeRIV(25,10,3);
- ((DCI1A_10MHz_TDD_1_6_t*)&bcch_pdu)->ndi = phy_vars_eNB->proc[sched_subframe].frame_tx&1;
- ((DCI1A_10MHz_TDD_1_6_t*)&bcch_pdu)->rv = 1;
- ((DCI1A_10MHz_TDD_1_6_t*)&bcch_pdu)->mcs = 1;
- ((DCI1A_10MHz_TDD_1_6_t*)&bcch_pdu)->harq_pid = 0;
- ((DCI1A_10MHz_TDD_1_6_t*)&bcch_pdu)->TPC = 1; // set to 3 PRB
- memcpy((void*)&DCI_pdu->dci_alloc[0].dci_pdu[0],&bcch_pdu,sizeof(DCI1A_10MHz_TDD_1_6_t));
- }
-
- break;
-
- case 100:
- if (phy_vars_eNB->lte_frame_parms.frame_type == FDD) {
- DCI_pdu->dci_alloc[0].dci_length = sizeof_DCI1A_20MHz_FDD_t;
- ((DCI1A_20MHz_FDD_t*)&bcch_pdu)->type = 1;
- ((DCI1A_20MHz_FDD_t*)&bcch_pdu)->vrb_type = 0;
- ((DCI1A_20MHz_FDD_t*)&bcch_pdu)->rballoc = computeRIV(25,10,3);
- ((DCI1A_20MHz_FDD_t*)&bcch_pdu)->ndi = phy_vars_eNB->proc[sched_subframe].frame_tx&1;
- ((DCI1A_20MHz_FDD_t*)&bcch_pdu)->rv = 1;
- ((DCI1A_20MHz_FDD_t*)&bcch_pdu)->mcs = 1;
- ((DCI1A_20MHz_FDD_t*)&bcch_pdu)->harq_pid = 0;
- ((DCI1A_20MHz_FDD_t*)&bcch_pdu)->TPC = 1; // set to 3 PRB
- memcpy((void*)&DCI_pdu->dci_alloc[0].dci_pdu[0],&bcch_pdu,sizeof(DCI1A_20MHz_TDD_1_6_t));
- } else {
- DCI_pdu->dci_alloc[0].dci_length = sizeof_DCI1A_20MHz_TDD_1_6_t;
- ((DCI1A_20MHz_TDD_1_6_t*)&bcch_pdu)->type = 1;
- ((DCI1A_20MHz_TDD_1_6_t*)&bcch_pdu)->vrb_type = 0;
- ((DCI1A_20MHz_TDD_1_6_t*)&bcch_pdu)->rballoc = computeRIV(25,10,3);
- ((DCI1A_20MHz_TDD_1_6_t*)&bcch_pdu)->ndi = phy_vars_eNB->proc[sched_subframe].frame_tx&1;
- ((DCI1A_20MHz_TDD_1_6_t*)&bcch_pdu)->rv = 1;
- ((DCI1A_20MHz_TDD_1_6_t*)&bcch_pdu)->mcs = 1;
- ((DCI1A_20MHz_TDD_1_6_t*)&bcch_pdu)->harq_pid = 0;
- ((DCI1A_20MHz_TDD_1_6_t*)&bcch_pdu)->TPC = 1; // set to 3 PRB
- memcpy((void*)&DCI_pdu->dci_alloc[0].dci_pdu[0],&bcch_pdu,sizeof(DCI1A_20MHz_TDD_1_6_t));
- }
-
- break;
- }
-
- case 6:
- /*
- DCI_pdu->Num_ue_spec_dci = 1;
- DCI_pdu->dci_alloc[0].dci_length = sizeof_DCI2_5MHz_2A_M10PRB_TDD_t;
- DCI_pdu->dci_alloc[0].L = 2;
- DCI_pdu->dci_alloc[0].rnti = 0x1236;
- DCI_pdu->dci_alloc[0].format = format2_2A_M10PRB;
- DCI_pdu->dci_alloc[0].ra_flag = 0;
-
- DLSCH_alloc_pdu1.rballoc = 0x00ff;
- DLSCH_alloc_pdu1.TPC = 0;
- DLSCH_alloc_pdu1.dai = 0;
- DLSCH_alloc_pdu1.harq_pid = 0;
- DLSCH_alloc_pdu1.tb_swap = 0;
- DLSCH_alloc_pdu1.mcs1 = 0;
- DLSCH_alloc_pdu1.ndi1 = 1;
- DLSCH_alloc_pdu1.rv1 = 0;
- DLSCH_alloc_pdu1.tpmi = 0;
- memcpy((void*)&DCI_pdu->dci_alloc[0].dci_pdu[0],(void *)&DLSCH_alloc_pdu1,sizeof(DCI2_5MHz_2A_M10PRB_TDD_t));
- */
- break;
-
- case 7:
- DCI_pdu->Num_ue_spec_dci = 1;
- DCI_pdu->dci_alloc[0].L = 2;
- DCI_pdu->dci_alloc[0].rnti = 0x1235;
- DCI_pdu->dci_alloc[0].format = format1;
- DCI_pdu->dci_alloc[0].ra_flag = 0;
-
- if (transmission_mode<3) {
- //user 1
- switch (phy_vars_eNB->lte_frame_parms.N_RB_DL) {
- case 25:
- if (phy_vars_eNB->lte_frame_parms.frame_type == FDD) {
- DCI_pdu->dci_alloc[0].dci_length = sizeof_DCI1_5MHz_FDD_t;
-
- ((DCI1_5MHz_FDD_t *)&dlsch_pdu)->rballoc = rballoc;
- ((DCI1_5MHz_FDD_t *)&dlsch_pdu)->TPC = 0;
- ((DCI1_5MHz_FDD_t *)&dlsch_pdu)->harq_pid = 0;
- ((DCI1_5MHz_FDD_t *)&dlsch_pdu)->mcs = openair_daq_vars.target_ue_dl_mcs;
- //((DCI1_5MHz_FDD_t *)&dlsch_pdu)->mcs = (unsigned char) ((phy_vars_eNB->frame%1024)%28);
- ((DCI1_5MHz_FDD_t *)&dlsch_pdu)->ndi = phy_vars_eNB->proc[sched_subframe].frame_tx&1;
- ((DCI1_5MHz_FDD_t *)&dlsch_pdu)->rv = 0;
- memcpy((void*)&DCI_pdu->dci_alloc[0].dci_pdu[0],(void *)&dlsch_pdu,sizeof(DCI1_5MHz_TDD_t));
-
- /*
- //user2
- DCI_pdu->dci_alloc[1].dci_length = sizeof_DCI1_5MHz_TDD_t;
- DCI_pdu->dci_alloc[1].L = 2;
- DCI_pdu->dci_alloc[1].rnti = 0x1236;
- DCI_pdu->dci_alloc[1].format = format1;
- DCI_pdu->dci_alloc[1].ra_flag = 0;
-
- ((DCI1_5MHz_FDD_t *)&dlsch_pdu)->rballoc = rballoc2;
- ((DCI1_5MHz_FDD_t *)&dlsch_pdu)->TPC = 0;
- ((DCI1_5MHz_FDD_t *)&dlsch_pdu)->dai = 0;
- ((DCI1_5MHz_FDD_t *)&dlsch_pdu)->harq_pid = 1;
- //((DCI1_5MHz_FDD_t *)&dlsch_pdu)->mcs = (unsigned char) ((phy_vars_eNB->proc[subframe].frame%1024)%28);
- ((DCI1_5MHz_FDD_t *)&dlsch_pdu)->mcs = openair_daq_vars.target_ue_dl_mcs;
- ((DCI1_5MHz_FDD_t *)&dlsch_pdu)->ndi = 1;
- ((DCI1_5MHz_FDD_t *)&dlsch_pdu)->rv = 0;
- memcpy((void*)&DCI_pdu->dci_alloc[1].dci_pdu[0],(void *)&((DCI1_5MHz_FDD_t *)&dlsch_pdu)->,sizeof(DCI1_5MHz_TDD_t));
- */
- } else {
- DCI_pdu->dci_alloc[0].dci_length = sizeof_DCI1_5MHz_TDD_t;
-
- ((DCI1_5MHz_TDD_t *)&dlsch_pdu)->rballoc = rballoc;
- ((DCI1_5MHz_TDD_t *)&dlsch_pdu)->TPC = 0;
- ((DCI1_5MHz_TDD_t *)&dlsch_pdu)->dai = 0;
- ((DCI1_5MHz_TDD_t *)&dlsch_pdu)->harq_pid = 0;
- ((DCI1_5MHz_TDD_t *)&dlsch_pdu)->mcs = openair_daq_vars.target_ue_dl_mcs;
- //((DCI1_5MHz_TDD_t *)&dlsch_pdu)->mcs = (unsigned char) ((phy_vars_eNB->frame%1024)%28);
- ((DCI1_5MHz_TDD_t *)&dlsch_pdu)->ndi = phy_vars_eNB->proc[sched_subframe].frame_tx&1;
- ((DCI1_5MHz_TDD_t *)&dlsch_pdu)->rv = 0;
- memcpy((void*)&DCI_pdu->dci_alloc[0].dci_pdu[0],(void *)&dlsch_pdu,sizeof(DCI1_5MHz_TDD_t));
-
- /*
- //user2
- DCI_pdu->dci_alloc[1].dci_length = sizeof_DCI1_5MHz_TDD_t;
- DCI_pdu->dci_alloc[1].L = 2;
- DCI_pdu->dci_alloc[1].rnti = 0x1236;
- DCI_pdu->dci_alloc[1].format = format1;
- DCI_pdu->dci_alloc[1].ra_flag = 0;
-
- ((DCI1_5MHz_FDD_t *)&dlsch_pdu)->rballoc = rballoc2;
- ((DCI1_5MHz_FDD_t *)&dlsch_pdu)->TPC = 0;
- ((DCI1_5MHz_FDD_t *)&dlsch_pdu)->dai = 0;
- ((DCI1_5MHz_FDD_t *)&dlsch_pdu)->harq_pid = 1;
- //((DCI1_5MHz_FDD_t *)&dlsch_pdu)->mcs = (unsigned char) ((phy_vars_eNB->proc[subframe].frame%1024)%28);
- ((DCI1_5MHz_FDD_t *)&dlsch_pdu)->mcs = openair_daq_vars.target_ue_dl_mcs;
- ((DCI1_5MHz_FDD_t *)&dlsch_pdu)->ndi = 1;
- ((DCI1_5MHz_FDD_t *)&dlsch_pdu)->rv = 0;
- memcpy((void*)&DCI_pdu->dci_alloc[1].dci_pdu[0],(void *)&((DCI1_5MHz_FDD_t *)&dlsch_pdu)->,sizeof(DCI1_5MHz_TDD_t));
- */
- }
-
- break;
-
- case 50:
-
- if (phy_vars_eNB->lte_frame_parms.frame_type == FDD) {
- DCI_pdu->dci_alloc[0].dci_length = sizeof_DCI1_10MHz_FDD_t;
-
- ((DCI1_10MHz_FDD_t *)&dlsch_pdu)->rballoc = rballoc;
- ((DCI1_10MHz_FDD_t *)&dlsch_pdu)->TPC = 0;
- ((DCI1_10MHz_FDD_t *)&dlsch_pdu)->harq_pid = 0;
- ((DCI1_10MHz_FDD_t *)&dlsch_pdu)->mcs = openair_daq_vars.target_ue_dl_mcs;
- //((DCI1_10MHz_FDD_t *)&dlsch_pdu)->mcs = (unsigned char) ((phy_vars_eNB->frame%1024)%28);
- ((DCI1_10MHz_FDD_t *)&dlsch_pdu)->ndi = phy_vars_eNB->proc[sched_subframe].frame_tx&1;
- ((DCI1_10MHz_FDD_t *)&dlsch_pdu)->rv = 0;
- memcpy((void*)&DCI_pdu->dci_alloc[0].dci_pdu[0],(void *)&dlsch_pdu,sizeof(DCI1_10MHz_TDD_t));
-
- /*
- //user2
- DCI_pdu->dci_alloc[1].dci_length = sizeof_DCI1_10MHz_TDD_t;
- DCI_pdu->dci_alloc[1].L = 2;
- DCI_pdu->dci_alloc[1].rnti = 0x1236;
- DCI_pdu->dci_alloc[1].format = format1;
- DCI_pdu->dci_alloc[1].ra_flag = 0;
-
- ((DCI1_10MHz_FDD_t *)&dlsch_pdu)->rballoc = rballoc2;
- ((DCI1_10MHz_FDD_t *)&dlsch_pdu)->TPC = 0;
- ((DCI1_10MHz_FDD_t *)&dlsch_pdu)->dai = 0;
- ((DCI1_10MHz_FDD_t *)&dlsch_pdu)->harq_pid = 1;
- //((DCI1_10MHz_FDD_t *)&dlsch_pdu)->mcs = (unsigned char) ((phy_vars_eNB->proc[subframe].frame%1024)%28);
- ((DCI1_10MHz_FDD_t *)&dlsch_pdu)->mcs = openair_daq_vars.target_ue_dl_mcs;
- ((DCI1_10MHz_FDD_t *)&dlsch_pdu)->ndi = 1;
- ((DCI1_10MHz_FDD_t *)&dlsch_pdu)->rv = 0;
- memcpy((void*)&DCI_pdu->dci_alloc[1].dci_pdu[0],(void *)&((DCI1_10MHz_FDD_t *)&dlsch_pdu)->,sizeof(DCI1_10MHz_TDD_t));
- */
- } else {
- DCI_pdu->dci_alloc[0].dci_length = sizeof_DCI1_10MHz_TDD_t;
-
- ((DCI1_10MHz_TDD_t *)&dlsch_pdu)->rballoc = rballoc;
- ((DCI1_10MHz_TDD_t *)&dlsch_pdu)->TPC = 0;
- ((DCI1_10MHz_TDD_t *)&dlsch_pdu)->dai = 0;
- ((DCI1_10MHz_TDD_t *)&dlsch_pdu)->harq_pid = 0;
- ((DCI1_10MHz_TDD_t *)&dlsch_pdu)->mcs = openair_daq_vars.target_ue_dl_mcs;
- //((DCI1_10MHz_TDD_t *)&dlsch_pdu)->mcs = (unsigned char) ((phy_vars_eNB->frame%1024)%28);
- ((DCI1_10MHz_TDD_t *)&dlsch_pdu)->ndi = phy_vars_eNB->proc[sched_subframe].frame_tx&1;
- ((DCI1_10MHz_TDD_t *)&dlsch_pdu)->rv = 0;
- memcpy((void*)&DCI_pdu->dci_alloc[0].dci_pdu[0],(void *)&dlsch_pdu,sizeof(DCI1_10MHz_TDD_t));
-
- /*
- //user2
- DCI_pdu->dci_alloc[1].dci_length = sizeof_DCI1_10MHz_TDD_t;
- DCI_pdu->dci_alloc[1].L = 2;
- DCI_pdu->dci_alloc[1].rnti = 0x1236;
- DCI_pdu->dci_alloc[1].format = format1;
- DCI_pdu->dci_alloc[1].ra_flag = 0;
-
- ((DCI1_10MHz_FDD_t *)&dlsch_pdu)->rballoc = rballoc2;
- ((DCI1_10MHz_FDD_t *)&dlsch_pdu)->TPC = 0;
- ((DCI1_10MHz_FDD_t *)&dlsch_pdu)->dai = 0;
- ((DCI1_10MHz_FDD_t *)&dlsch_pdu)->harq_pid = 1;
- //((DCI1_10MHz_FDD_t *)&dlsch_pdu)->mcs = (unsigned char) ((phy_vars_eNB->proc[subframe].frame%1024)%28);
- ((DCI1_10MHz_FDD_t *)&dlsch_pdu)->mcs = openair_daq_vars.target_ue_dl_mcs;
- ((DCI1_10MHz_FDD_t *)&dlsch_pdu)->ndi = 1;
- ((DCI1_10MHz_FDD_t *)&dlsch_pdu)->rv = 0;
- memcpy((void*)&DCI_pdu->dci_alloc[1].dci_pdu[0],(void *)&((DCI1_10MHz_FDD_t *)&dlsch_pdu)->,sizeof(DCI1_10MHz_TDD_t));
- */
- }
-
- break;
-
- case 100:
- if (phy_vars_eNB->lte_frame_parms.frame_type == FDD) {
- DCI_pdu->dci_alloc[0].dci_length = sizeof_DCI1_5MHz_FDD_t;
-
- ((DCI1_5MHz_FDD_t *)&dlsch_pdu)->rballoc = rballoc;
- ((DCI1_5MHz_FDD_t *)&dlsch_pdu)->TPC = 0;
- ((DCI1_5MHz_FDD_t *)&dlsch_pdu)->harq_pid = 0;
- ((DCI1_5MHz_FDD_t *)&dlsch_pdu)->mcs = openair_daq_vars.target_ue_dl_mcs;
- //((DCI1_5MHz_FDD_t *)&dlsch_pdu)->mcs = (unsigned char) ((phy_vars_eNB->frame%1024)%28);
- ((DCI1_5MHz_FDD_t *)&dlsch_pdu)->ndi = phy_vars_eNB->proc[sched_subframe].frame_tx&1;
- ((DCI1_5MHz_FDD_t *)&dlsch_pdu)->rv = 0;
- memcpy((void*)&DCI_pdu->dci_alloc[0].dci_pdu[0],(void *)&dlsch_pdu,sizeof(DCI1_5MHz_TDD_t));
-
- /*
- //user2
- DCI_pdu->dci_alloc[1].dci_length = sizeof_DCI1_5MHz_TDD_t;
- DCI_pdu->dci_alloc[1].L = 2;
- DCI_pdu->dci_alloc[1].rnti = 0x1236;
- DCI_pdu->dci_alloc[1].format = format1;
- DCI_pdu->dci_alloc[1].ra_flag = 0;
-
- ((DCI1_5MHz_FDD_t *)&dlsch_pdu)->rballoc = rballoc2;
- ((DCI1_5MHz_FDD_t *)&dlsch_pdu)->TPC = 0;
- ((DCI1_5MHz_FDD_t *)&dlsch_pdu)->dai = 0;
- ((DCI1_5MHz_FDD_t *)&dlsch_pdu)->harq_pid = 1;
- //((DCI1_5MHz_FDD_t *)&dlsch_pdu)->mcs = (unsigned char) ((phy_vars_eNB->proc[subframe].frame%1024)%28);
- ((DCI1_5MHz_FDD_t *)&dlsch_pdu)->mcs = openair_daq_vars.target_ue_dl_mcs;
- ((DCI1_5MHz_FDD_t *)&dlsch_pdu)->ndi = 1;
- ((DCI1_5MHz_FDD_t *)&dlsch_pdu)->rv = 0;
- memcpy((void*)&DCI_pdu->dci_alloc[1].dci_pdu[0],(void *)&((DCI1_5MHz_FDD_t *)&dlsch_pdu)->,sizeof(DCI1_5MHz_TDD_t));
- */
- } else {
- DCI_pdu->dci_alloc[0].dci_length = sizeof_DCI1_20MHz_TDD_t;
-
- ((DCI1_20MHz_TDD_t *)&dlsch_pdu)->rballoc = rballoc;
- ((DCI1_20MHz_TDD_t *)&dlsch_pdu)->TPC = 0;
- ((DCI1_20MHz_TDD_t *)&dlsch_pdu)->dai = 0;
- ((DCI1_20MHz_TDD_t *)&dlsch_pdu)->harq_pid = 0;
- ((DCI1_20MHz_TDD_t *)&dlsch_pdu)->mcs = openair_daq_vars.target_ue_dl_mcs;
- //((DCI1_20MHz_TDD_t *)&dlsch_pdu)->mcs = (unsigned char) ((phy_vars_eNB->frame%1024)%28);
- ((DCI1_20MHz_TDD_t *)&dlsch_pdu)->ndi = phy_vars_eNB->proc[sched_subframe].frame_tx&1;
- ((DCI1_20MHz_TDD_t *)&dlsch_pdu)->rv = 0;
- memcpy((void*)&DCI_pdu->dci_alloc[0].dci_pdu[0],(void *)&dlsch_pdu,sizeof(DCI1_20MHz_TDD_t));
-
- /*
- //user2
- DCI_pdu->dci_alloc[1].dci_length = sizeof_DCI1_20MHz_TDD_t;
- DCI_pdu->dci_alloc[1].L = 2;
- DCI_pdu->dci_alloc[1].rnti = 0x1236;
- DCI_pdu->dci_alloc[1].format = format1;
- DCI_pdu->dci_alloc[1].ra_flag = 0;
-
- ((DCI1_20MHz_FDD_t *)&dlsch_pdu)->rballoc = rballoc2;
- ((DCI1_20MHz_FDD_t *)&dlsch_pdu)->TPC = 0;
- ((DCI1_20MHz_FDD_t *)&dlsch_pdu)->dai = 0;
- ((DCI1_20MHz_FDD_t *)&dlsch_pdu)->harq_pid = 1;
- //((DCI1_20MHz_FDD_t *)&dlsch_pdu)->mcs = (unsigned char) ((phy_vars_eNB->proc[subframe].frame%1024)%28);
- ((DCI1_20MHz_FDD_t *)&dlsch_pdu)->mcs = openair_daq_vars.target_ue_dl_mcs;
- ((DCI1_20MHz_FDD_t *)&dlsch_pdu)->ndi = 1;
- ((DCI1_20MHz_FDD_t *)&dlsch_pdu)->rv = 0;
- memcpy((void*)&DCI_pdu->dci_alloc[1].dci_pdu[0],(void *)&((DCI1_20MHz_FDD_t *)&dlsch_pdu)->,sizeof(DCI1_5MHz_TDD_t));
- */
- }
-
- break;
- }
-
- } else if (transmission_mode==5) {
- DCI_pdu->Num_ue_spec_dci = 2;
- // user 1
- DCI_pdu->dci_alloc[0].dci_length = sizeof_DCI1E_5MHz_2A_M10PRB_TDD_t;
- DCI_pdu->dci_alloc[0].L = 3;
- DCI_pdu->dci_alloc[0].rnti = 0x1235;
- DCI_pdu->dci_alloc[0].format = format1E_2A_M10PRB;
- DCI_pdu->dci_alloc[0].ra_flag = 0;
-
- DLSCH_alloc_pdu1E.tpmi = 5; //5=use feedback
- DLSCH_alloc_pdu1E.rv = 0;
- DLSCH_alloc_pdu1E.ndi = phy_vars_eNB->proc[sched_subframe].frame_tx&1;
- //DLSCH_alloc_pdu1E.mcs = cqi_to_mcs[phy_vars_eNB->eNB_UE_stats->DL_cqi[0]];
- //DLSCH_alloc_pdu1E.mcs = (unsigned char) (taus()%28);
- DLSCH_alloc_pdu1E.mcs = openair_daq_vars.target_ue_dl_mcs;
- //DLSCH_alloc_pdu1E.mcs = (unsigned char) ((phy_vars_eNB->proc[subframe].frame%1024)%28);
- phy_vars_eNB->eNB_UE_stats[0].dlsch_mcs1 = DLSCH_alloc_pdu1E.mcs;
- DLSCH_alloc_pdu1E.harq_pid = 0;
- DLSCH_alloc_pdu1E.dai = 0;
- DLSCH_alloc_pdu1E.TPC = 0;
- DLSCH_alloc_pdu1E.rballoc = openair_daq_vars.ue_dl_rb_alloc;
- DLSCH_alloc_pdu1E.rah = 0;
- DLSCH_alloc_pdu1E.dl_power_off = 0; //0=second user present
- memcpy((void*)&DCI_pdu->dci_alloc[0].dci_pdu[0],(void *)&DLSCH_alloc_pdu1E,sizeof(DCI1E_5MHz_2A_M10PRB_TDD_t));
-
- //user 2
- DCI_pdu->dci_alloc[1].dci_length = sizeof_DCI1E_5MHz_2A_M10PRB_TDD_t;
- DCI_pdu->dci_alloc[1].L = 0;
- DCI_pdu->dci_alloc[1].rnti = 0x1236;
- DCI_pdu->dci_alloc[1].format = format1E_2A_M10PRB;
- DCI_pdu->dci_alloc[1].ra_flag = 0;
- //DLSCH_alloc_pdu1E.mcs = openair_daq_vars.target_ue_dl_mcs;
- //DLSCH_alloc_pdu1E.mcs = (unsigned char) (taus()%28);
- //DLSCH_alloc_pdu1E.mcs = (unsigned char) ((phy_vars_eNB->frame%1024)%28);
- DLSCH_alloc_pdu1E.mcs = (unsigned char) (((phy_vars_eNB->proc[sched_subframe].frame_tx%1024)/3)%28);
- phy_vars_eNB->eNB_UE_stats[1].dlsch_mcs1 = DLSCH_alloc_pdu1E.mcs;
-
- memcpy((void*)&DCI_pdu->dci_alloc[1].dci_pdu[0],(void *)&DLSCH_alloc_pdu1E,sizeof(DCI1E_5MHz_2A_M10PRB_TDD_t));
-
- // set the precoder of the second UE orthogonal to the first
- phy_vars_eNB->eNB_UE_stats[1].DL_pmi_single = (phy_vars_eNB->eNB_UE_stats[0].DL_pmi_single ^ 0x1555);
- }
-
- break;
-
- /*
- case 8:
- DCI_pdu->Num_common_dci = 1;
- DCI_pdu->dci_alloc[0].dci_length = sizeof_DCI1A_5MHz_TDD_1_6_t;
- DCI_pdu->dci_alloc[0].L = 2;
- DCI_pdu->dci_alloc[0].rnti = 0xbeef;
- DCI_pdu->dci_alloc[0].format = format1A;
- DCI_pdu->dci_alloc[0].ra_flag = 1;
-
- RA_alloc_pdu.type = 1;
- RA_alloc_pdu.vrb_type = 0;
- RA_alloc_pdu.rballoc = computeRIV(25,12,3);
- RA_alloc_pdu.ndi = 1;
- RA_alloc_pdu.rv = 1;
- RA_alloc_pdu.mcs = 4;
- RA_alloc_pdu.harq_pid = 0;
- RA_alloc_pdu.TPC = 1;
-
- memcpy((void*)&DCI_pdu->dci_alloc[0].dci_pdu[0],&RA_alloc_pdu,sizeof(DCI1A_5MHz_TDD_1_6_t));
- break;
- */
- case 9:
- DCI_pdu->Num_ue_spec_dci = 1;
-
- //user 1
- if (phy_vars_eNB->lte_frame_parms.frame_type == FDD)
- DCI_pdu->dci_alloc[0].dci_length = sizeof_DCI0_5MHz_FDD_t ;
- else
- DCI_pdu->dci_alloc[0].dci_length = sizeof_DCI0_5MHz_TDD_1_6_t ;
-
- DCI_pdu->dci_alloc[0].L = 2;
- DCI_pdu->dci_alloc[0].rnti = 0x1235;
- DCI_pdu->dci_alloc[0].format = format0;
- DCI_pdu->dci_alloc[0].ra_flag = 0;
-
- UL_alloc_pdu.type = 0;
- UL_alloc_pdu.hopping = 0;
- UL_alloc_pdu.rballoc = computeRIV(25,2,openair_daq_vars.ue_ul_nb_rb);
- UL_alloc_pdu.mcs = openair_daq_vars.target_ue_ul_mcs;
- UL_alloc_pdu.ndi = phy_vars_eNB->proc[sched_subframe].frame_tx&1;
- UL_alloc_pdu.TPC = 0;
- UL_alloc_pdu.cshift = 0;
- UL_alloc_pdu.dai = 0;
- UL_alloc_pdu.cqi_req = 1;
- memcpy((void*)&DCI_pdu->dci_alloc[0].dci_pdu[0],(void *)&UL_alloc_pdu,sizeof(DCI0_5MHz_TDD_1_6_t));
-
- // user 2
- /*
- DCI_pdu->dci_alloc[1].dci_length = sizeof_DCI0_5MHz_TDD_1_6_t ;
- DCI_pdu->dci_alloc[1].L = 2;
- DCI_pdu->dci_alloc[1].rnti = 0x1236;
- DCI_pdu->dci_alloc[1].format = format0;
- DCI_pdu->dci_alloc[1].ra_flag = 0;
-
- UL_alloc_pdu.type = 0;
- UL_alloc_pdu.hopping = 0;
- if (cooperation_flag==0)
- UL_alloc_pdu.rballoc = computeRIV(25,2+openair_daq_vars.ue_ul_nb_rb,openair_daq_vars.ue_ul_nb_rb);
- else
- UL_alloc_pdu.rballoc = computeRIV(25,0,openair_daq_vars.ue_ul_nb_rb);
- UL_alloc_pdu.mcs = openair_daq_vars.target_ue_ul_mcs;
- UL_alloc_pdu.ndi = phy_vars_eNB->proc[sched_subframe].frame_tx&1;
- UL_alloc_pdu.TPC = 0;
- if ((cooperation_flag==0) || (cooperation_flag==1))
- UL_alloc_pdu.cshift = 0;
- else
- UL_alloc_pdu.cshift = 1;
- UL_alloc_pdu.dai = 0;
- UL_alloc_pdu.cqi_req = 1;
- memcpy((void*)&DCI_pdu->dci_alloc[1].dci_pdu[0],(void *)&UL_alloc_pdu,sizeof(DCI0_5MHz_TDD_1_6_t));
- */
- break;
-
- default:
- break;
- }
-
- DCI_pdu->nCCE = 0;
-
- for (i=0; iNum_common_dci+DCI_pdu->Num_ue_spec_dci; i++) {
- DCI_pdu->nCCE += (1<<(DCI_pdu->dci_alloc[i].L));
- }
-
-}
-
-#ifdef EMOS
-void fill_dci_emos(DCI_PDU *DCI_pdu, uint8_t subframe, PHY_VARS_eNB *phy_vars_eNB)
-{
-
- int i;
- uint8_t cooperation_flag = phy_vars_eNB->cooperation_flag;
- uint8_t transmission_mode = phy_vars_eNB->transmission_mode[0];
-
- //uint32_t rballoc = 0x00F0;
- //uint32_t rballoc2 = 0x000F;
- /*
- uint32_t rand = taus();
- if ((subframe==8) || (subframe==9) || (subframe==0))
- rand = (rand%5)+5;
- else
- rand = (rand%4)+5;
- */
-
- DCI_pdu->Num_common_dci = 0;
- DCI_pdu->Num_ue_spec_dci=0;
-
- switch (subframe) {
- case 5:
- DCI_pdu->Num_ue_spec_dci = 1;
-
- if (transmission_mode<3) {
- //user 1
- DCI_pdu->dci_alloc[0].dci_length = sizeof_DCI1_5MHz_TDD_t;
- DCI_pdu->dci_alloc[0].L = 2;
- DCI_pdu->dci_alloc[0].rnti = 0x1235;
- DCI_pdu->dci_alloc[0].format = format1;
- DCI_pdu->dci_alloc[0].ra_flag = 0;
-
- DLSCH_alloc_pdu.rballoc = openair_daq_vars.ue_dl_rb_alloc;
- DLSCH_alloc_pdu.TPC = 0;
- DLSCH_alloc_pdu.dai = 0;
- DLSCH_alloc_pdu.harq_pid = 1;
- DLSCH_alloc_pdu.mcs = openair_daq_vars.target_ue_dl_mcs;
- DLSCH_alloc_pdu.ndi = 1;
- DLSCH_alloc_pdu.rv = 0;
- memcpy((void*)&DCI_pdu->dci_alloc[0].dci_pdu[0],(void *)&DLSCH_alloc_pdu,sizeof(DCI1_5MHz_TDD_t));
-
- /*
- //user2
- DCI_pdu->dci_alloc[1].dci_length = sizeof_DCI1_5MHz_TDD_t;
- DCI_pdu->dci_alloc[1].L = 2;
- DCI_pdu->dci_alloc[1].rnti = 0x1236;
- DCI_pdu->dci_alloc[1].format = format1;
- DCI_pdu->dci_alloc[1].ra_flag = 0;
-
- DLSCH_alloc_pdu.rballoc = rballoc2;
- DLSCH_alloc_pdu.TPC = 0;
- DLSCH_alloc_pdu.dai = 0;
- DLSCH_alloc_pdu.harq_pid = 1;
- DLSCH_alloc_pdu.mcs = openair_daq_vars.target_ue_dl_mcs;
- DLSCH_alloc_pdu.ndi = 1;
- DLSCH_alloc_pdu.rv = 0;
- memcpy((void*)&DCI_pdu->dci_alloc[1].dci_pdu[0],(void *)&DLSCH_alloc_pdu,sizeof(DCI1_5MHz_TDD_t));
- */
- } else if (transmission_mode==5) {
- DCI_pdu->Num_ue_spec_dci = 2;
- // user 1
- DCI_pdu->dci_alloc[0].dci_length = sizeof_DCI1E_5MHz_2A_M10PRB_TDD_t;
- DCI_pdu->dci_alloc[0].L = 2;
- DCI_pdu->dci_alloc[0].rnti = 0x1235;
- DCI_pdu->dci_alloc[0].format = format1E_2A_M10PRB;
- DCI_pdu->dci_alloc[0].ra_flag = 0;
-
- DLSCH_alloc_pdu1E.tpmi = 5; //5=use feedback
- DLSCH_alloc_pdu1E.rv = 0;
- DLSCH_alloc_pdu1E.ndi = 1;
- DLSCH_alloc_pdu1E.mcs = openair_daq_vars.target_ue_dl_mcs;
- DLSCH_alloc_pdu1E.harq_pid = 1;
- DLSCH_alloc_pdu1E.dai = 0;
- DLSCH_alloc_pdu1E.TPC = 0;
- DLSCH_alloc_pdu1E.rballoc = openair_daq_vars.ue_dl_rb_alloc;
- DLSCH_alloc_pdu1E.rah = 0;
- DLSCH_alloc_pdu1E.dl_power_off = 0; //0=second user present
- memcpy((void*)&DCI_pdu->dci_alloc[0].dci_pdu[0],(void *)&DLSCH_alloc_pdu1E,sizeof(DCI1E_5MHz_2A_M10PRB_TDD_t));
-
- //user 2
- DCI_pdu->dci_alloc[1].dci_length = sizeof_DCI1E_5MHz_2A_M10PRB_TDD_t;
- DCI_pdu->dci_alloc[1].L = 2;
- DCI_pdu->dci_alloc[1].rnti = 0x1236;
- DCI_pdu->dci_alloc[1].format = format1E_2A_M10PRB;
- DCI_pdu->dci_alloc[1].ra_flag = 0;
-
- memcpy((void*)&DCI_pdu->dci_alloc[1].dci_pdu[0],(void *)&DLSCH_alloc_pdu1E,sizeof(DCI1E_5MHz_2A_M10PRB_TDD_t));
-
- // set the precoder of the second UE orthogonal to the first
- phy_vars_eNB->eNB_UE_stats[1].DL_pmi_single = (phy_vars_eNB->eNB_UE_stats[0].DL_pmi_single ^ 0x1555);
- }
-
- break;
-
- case 7:
- DCI_pdu->Num_common_dci = 1;
- DCI_pdu->dci_alloc[0].dci_length = sizeof_DCI1A_5MHz_TDD_1_6_t;
- DCI_pdu->dci_alloc[0].L = 2;
- DCI_pdu->dci_alloc[0].rnti = 0xbeef;
- DCI_pdu->dci_alloc[0].format = format1A;
- DCI_pdu->dci_alloc[0].ra_flag = 1;
-
- RA_alloc_pdu.type = 1;
- RA_alloc_pdu.vrb_type = 0;
- RA_alloc_pdu.rballoc = computeRIV(25,12,3);
- RA_alloc_pdu.ndi = 1;
- RA_alloc_pdu.rv = 1;
- RA_alloc_pdu.mcs = 4;
- RA_alloc_pdu.harq_pid = 0;
- RA_alloc_pdu.TPC = 1;
-
- memcpy((void*)&DCI_pdu->dci_alloc[0].dci_pdu[0],&RA_alloc_pdu,sizeof(DCI1A_5MHz_TDD_1_6_t));
- break;
-
- case 9:
- DCI_pdu->Num_ue_spec_dci = 1;
-
- //user 1
- DCI_pdu->dci_alloc[0].dci_length = sizeof_DCI0_5MHz_TDD_1_6_t ;
- DCI_pdu->dci_alloc[0].L = 2;
- DCI_pdu->dci_alloc[0].rnti = 0x1235;
- DCI_pdu->dci_alloc[0].format = format0;
- DCI_pdu->dci_alloc[0].ra_flag = 0;
-
- UL_alloc_pdu.type = 0;
- UL_alloc_pdu.hopping = 0;
- UL_alloc_pdu.rballoc = computeRIV(25,0,openair_daq_vars.ue_ul_nb_rb);
- UL_alloc_pdu.mcs = openair_daq_vars.target_ue_ul_mcs;
- UL_alloc_pdu.ndi = 1;
- UL_alloc_pdu.TPC = 0;
- UL_alloc_pdu.cshift = 0;
- UL_alloc_pdu.dai = 0;
- UL_alloc_pdu.cqi_req = 1;
- memcpy((void*)&DCI_pdu->dci_alloc[0].dci_pdu[0],(void *)&UL_alloc_pdu,sizeof(DCI0_5MHz_TDD_1_6_t));
-
- /*
- //user 2
- DCI_pdu->dci_alloc[1].dci_length = sizeof_DCI0_5MHz_TDD_1_6_t ;
- DCI_pdu->dci_alloc[1].L = 2;
- DCI_pdu->dci_alloc[1].rnti = 0x1236;
- DCI_pdu->dci_alloc[1].format = format0;
- DCI_pdu->dci_alloc[1].ra_flag = 0;
-
- UL_alloc_pdu.type = 0;
- UL_alloc_pdu.hopping = 0;
- if (cooperation_flag==0)
- UL_alloc_pdu.rballoc = computeRIV(25,2+openair_daq_vars.ue_ul_nb_rb,openair_daq_vars.ue_ul_nb_rb);
- else
- UL_alloc_pdu.rballoc = computeRIV(25,0,openair_daq_vars.ue_ul_nb_rb);
- UL_alloc_pdu.mcs = openair_daq_vars.target_ue_ul_mcs;
- UL_alloc_pdu.ndi = 1;
- UL_alloc_pdu.TPC = 0;
- if ((cooperation_flag==0) || (cooperation_flag==1))
- UL_alloc_pdu.cshift = 0;
- else
- UL_alloc_pdu.cshift = 1;
- UL_alloc_pdu.dai = 0;
- UL_alloc_pdu.cqi_req = 1;
- memcpy((void*)&DCI_pdu->dci_alloc[1].dci_pdu[0],(void *)&UL_alloc_pdu,sizeof(DCI0_5MHz_TDD_1_6_t));
- */
- break;
-
- default:
- break;
- }
-
- DCI_pdu->nCCE = 0;
-
- for (i=0; iNum_common_dci+DCI_pdu->Num_ue_spec_dci; i++) {
- DCI_pdu->nCCE += (1<<(DCI_pdu->dci_alloc[i].L));
- }
-
-}
-#endif //EMOS
-#endif //OPENAIR2
#define AMP_OVER_SQRT2 ((AMP*ONE_OVER_SQRT2_Q15)>>15)
#define AMP_OVER_2 (AMP>>1)
@@ -1308,10 +623,8 @@ void phy_procedures_eNB_TX(unsigned char sched_subframe,PHY_VARS_eNB *phy_vars_e
uint8_t harq_pid;
DCI_PDU *DCI_pdu;
uint8_t *DLSCH_pdu=NULL;
-#ifndef OPENAIR2
DCI_PDU DCI_pdu_tmp;
uint8_t DLSCH_pdu_tmp[768*8];
-#endif
int8_t UE_id;
uint8_t num_pdcch_symbols=0;
uint8_t ul_subframe;
@@ -1353,13 +666,12 @@ void phy_procedures_eNB_TX(unsigned char sched_subframe,PHY_VARS_eNB *phy_vars_e
}
-#ifdef OPENAIR2
-
// Get scheduling info for next subframe
- if (phy_vars_eNB->CC_id == 0)
- mac_xface->eNB_dlsch_ulsch_scheduler(phy_vars_eNB->Mod_id,0,phy_vars_eNB->proc[sched_subframe].frame_tx,subframe);//,1);
-
-#endif
+ if (phy_vars_eNB->mac_enabled==1) {
+ if (phy_vars_eNB->CC_id == 0) {
+ mac_xface->eNB_dlsch_ulsch_scheduler(phy_vars_eNB->Mod_id,0,phy_vars_eNB->proc[sched_subframe].frame_tx,subframe);//,1);
+ }
+ }
if (abstraction_flag==0) {
// clear the transmit data array for the current subframe
@@ -1687,36 +999,22 @@ void phy_procedures_eNB_TX(unsigned char sched_subframe,PHY_VARS_eNB *phy_vars_e
#endif
-#ifdef OPENAIR2
-
- // Parse DCI received from MAC
- VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_ENB_PDCCH_TX,1);
- DCI_pdu = mac_xface->get_dci_sdu(phy_vars_eNB->Mod_id,
- phy_vars_eNB->CC_id,
- phy_vars_eNB->proc[sched_subframe].frame_tx,
- subframe);
-#else
- DCI_pdu = &DCI_pdu_tmp;
-#ifdef EMOS
- /*
- if (((phy_vars_eNB->proc[sched_subframe].frame_tx%1024)%3 == 0) && (next_slot == 0)) {
- //openair_daq_vars.target_ue_dl_mcs = (openair_daq_vars.target_ue_dl_mcs+1)%28;
- openair_daq_vars.target_ue_dl_mcs = taus()%28;
- LOG_D(PHY,"[MYEMOS] frame %d, increasing MCS to %d\n",phy_vars_eNB->proc[sched_subframe].frame_tx,openair_daq_vars.target_ue_dl_mcs);
- }
- */
- /*
- if (phy_vars_eNB->proc[sched_subframe].frame_tx > 28000) {
- LOG_E(PHY,"More that 28000 frames reached! Exiting!\n");
- }
- */
-#endif
+ if (phy_vars_eNB->mac_enabled==1) {
+ // Parse DCI received from MAC
+ VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_ENB_PDCCH_TX,1);
+ DCI_pdu = mac_xface->get_dci_sdu(phy_vars_eNB->Mod_id,
+ phy_vars_eNB->CC_id,
+ phy_vars_eNB->proc[sched_subframe].frame_tx,
+ subframe);
+ }
+ else {
+ DCI_pdu = &DCI_pdu_tmp;
#ifdef EMOS_CHANNEL
- fill_dci_emos(DCI_pdu,sched_subframe,phy_vars_eNB);
+ fill_dci_emos(DCI_pdu,sched_subframe,phy_vars_eNB);
#else
- fill_dci(DCI_pdu,sched_subframe,phy_vars_eNB);
-#endif
+ fill_dci(DCI_pdu,sched_subframe,phy_vars_eNB);
#endif
+ }
// clear existing ulsch dci allocations before applying info from MAC (this is table
ul_subframe = pdcch_alloc2ul_subframe(&phy_vars_eNB->lte_frame_parms,subframe);
@@ -1783,6 +1081,7 @@ void phy_procedures_eNB_TX(unsigned char sched_subframe,PHY_VARS_eNB *phy_vars_e
#ifdef DEBUG_PHY_PROC
LOG_D(PHY,"[eNB %"PRIu8"] SI generate_eNB_dlsch_params_from_dci\n", phy_vars_eNB->Mod_id);
#endif
+
generate_eNB_dlsch_params_from_dci(frame,
subframe,
&DCI_pdu->dci_alloc[i].dci_pdu[0],
@@ -1817,6 +1116,7 @@ void phy_procedures_eNB_TX(unsigned char sched_subframe,PHY_VARS_eNB *phy_vars_e
#ifdef DEBUG_PHY_PROC
LOG_D(PHY,"[eNB %"PRIu8"] RA generate_eNB_dlsch_params_from_dci\n", phy_vars_eNB->Mod_id);
#endif
+
generate_eNB_dlsch_params_from_dci(frame,
subframe,
&DCI_pdu->dci_alloc[i].dci_pdu[0],
@@ -1851,17 +1151,20 @@ void phy_procedures_eNB_TX(unsigned char sched_subframe,PHY_VARS_eNB *phy_vars_e
else if (DCI_pdu->dci_alloc[i].format != format0) { // this is a normal DLSCH allocation
-#ifdef OPENAIR2
#ifdef DEBUG_PHY_PROC
LOG_D(PHY,"[eNB] Searching for RNTI %"PRIx16"\n",DCI_pdu->dci_alloc[i].rnti);
#endif
- UE_id = find_ue((int16_t)DCI_pdu->dci_alloc[i].rnti,phy_vars_eNB);
-#else
- UE_id = i;
-#endif
+
+ if (phy_vars_eNB->mac_enabled==1)
+ UE_id = find_ue((int16_t)DCI_pdu->dci_alloc[i].rnti,phy_vars_eNB);
+ else
+ UE_id = i;
if (UE_id>=0) {
- // dump_dci(&phy_vars_eNB->lte_frame_parms,&DCI_pdu->dci_alloc[i]);
+ if ((frame%100)==0) {
+ LOG_D(PHY,"Frame %3d, SF %d \n",frame,subframe);
+ dump_dci(&phy_vars_eNB->lte_frame_parms,&DCI_pdu->dci_alloc[i]);
+ }
#if defined(SMBV) && !defined(EXMIMO)
// Configure this user
if (smbv_is_config_frame(phy_vars_eNB->proc[sched_subframe].frame_tx) && (smbv_frame_cnt < 4)) {
@@ -1871,6 +1174,7 @@ void phy_procedures_eNB_TX(unsigned char sched_subframe,PHY_VARS_eNB *phy_vars_e
}
#endif
+
generate_eNB_dlsch_params_from_dci(frame,
subframe,
&DCI_pdu->dci_alloc[i].dci_pdu[0],
@@ -1931,14 +1235,13 @@ void phy_procedures_eNB_TX(unsigned char sched_subframe,PHY_VARS_eNB *phy_vars_e
if (harq_pid==255) {
LOG_E(PHY,"[eNB %"PRIu8"] Frame %d: Bad harq_pid for ULSCH allocation\n",phy_vars_eNB->Mod_id,phy_vars_eNB->proc[sched_subframe].frame_tx);
//mac_exit_wrapper("Invalid harq_pid (255) detected");
- return; // not reached
+ return;
}
-#ifdef OPENAIR2
- UE_id = find_ue((int16_t)DCI_pdu->dci_alloc[i].rnti,phy_vars_eNB);
-#else
- UE_id = i;
-#endif
+ if (phy_vars_eNB->mac_enabled==1)
+ UE_id = find_ue((int16_t)DCI_pdu->dci_alloc[i].rnti,phy_vars_eNB);
+ else
+ UE_id = i;
if (UE_id<0) {
LOG_E(PHY,"[eNB %"PRIu8"] Frame %d: Unknown UE_id for rnti %"PRIx16"\n",phy_vars_eNB->Mod_id,phy_vars_eNB->proc[sched_subframe].frame_tx,DCI_pdu->dci_alloc[i].rnti);
@@ -1967,6 +1270,7 @@ void phy_procedures_eNB_TX(unsigned char sched_subframe,PHY_VARS_eNB *phy_vars_e
//dump_dci(&phy_vars_eNB->lte_frame_parms,&DCI_pdu->dci_alloc[i]);
//LOG_D(PHY,"[eNB] cba generate_eNB_ulsch_params_from_dci for ue %d for dci rnti %x\n", UE_id, DCI_pdu->dci_alloc[i].rnti);
+
generate_eNB_ulsch_params_from_dci(&DCI_pdu->dci_alloc[i].dci_pdu[0],
DCI_pdu->dci_alloc[i].rnti,
sched_subframe,
@@ -2068,19 +1372,19 @@ void phy_procedures_eNB_TX(unsigned char sched_subframe,PHY_VARS_eNB *phy_vars_e
input_buffer_length = phy_vars_eNB->dlsch_eNB_SI->harq_processes[0]->TBS/8;
-#ifdef OPENAIR2
- DLSCH_pdu = mac_xface->get_dlsch_sdu(phy_vars_eNB->Mod_id,
- phy_vars_eNB->CC_id,
- phy_vars_eNB->proc[sched_subframe].frame_tx,
- SI_RNTI,
- 0);
-#else
- DLSCH_pdu = DLSCH_pdu_tmp;
+ if (phy_vars_eNB->mac_enabled==1) {
+ DLSCH_pdu = mac_xface->get_dlsch_sdu(phy_vars_eNB->Mod_id,
+ phy_vars_eNB->CC_id,
+ phy_vars_eNB->proc[sched_subframe].frame_tx,
+ SI_RNTI,
+ 0);
+ }
+ else {
+ DLSCH_pdu = DLSCH_pdu_tmp;
- for (i=0; idlsch_eNB_ra->harq_processes[0]->TBS/8;
-#ifdef OPENAIR2
int16_t crnti = mac_xface->fill_rar(phy_vars_eNB->Mod_id,
phy_vars_eNB->CC_id,
phy_vars_eNB->proc[sched_subframe].frame_tx,
@@ -2219,15 +1522,14 @@ void phy_procedures_eNB_TX(unsigned char sched_subframe,PHY_VARS_eNB *phy_vars_e
phy_vars_eNB->ulsch_eNB[(uint32_t)UE_id]->Msg3_frame,
phy_vars_eNB->ulsch_eNB[(uint32_t)UE_id]->Msg3_subframe);
-#else
-
- for (i=0; ieNB_UE_stats[0].UE_timing_offset)>>(2+4); // 7 MSBs of timing advance + divide by 4
- dlsch_input_buffer[2] = ((phy_vars_eNB->eNB_UE_stats[0].UE_timing_offset)<<(4-2))&0xf0; // 4 LSBs of timing advance + divide by 4
- //LOG_I(PHY,"UE %d: timing_offset = %d\n",UE_id,phy_vars_eNB->eNB_UE_stats[0].UE_timing_offset);
-#endif
+ /*
+ for (i=0; ieNB_UE_stats[0].UE_timing_offset)>>(2+4); // 7 MSBs of timing advance + divide by 4
+ dlsch_input_buffer[2] = ((phy_vars_eNB->eNB_UE_stats[0].UE_timing_offset)<<(4-2))&0xf0; // 4 LSBs of timing advance + divide by 4
+ //LOG_I(PHY,"UE %d: timing_offset = %d\n",UE_id,phy_vars_eNB->eNB_UE_stats[0].UE_timing_offset);
+ */
#if defined(SMBV) && !defined(EXMIMO)
@@ -2296,10 +1598,8 @@ void phy_procedures_eNB_TX(unsigned char sched_subframe,PHY_VARS_eNB *phy_vars_e
phy_vars_eNB->proc[sched_subframe].frame_tx, subframe, re_allocated);
#endif
-#ifdef OPENAIR2
} //max user count
-#endif
phy_vars_eNB->dlsch_eNB_ra->active = 0;
}
@@ -2356,21 +1656,21 @@ void phy_procedures_eNB_TX(unsigned char sched_subframe,PHY_VARS_eNB *phy_vars_e
phy_vars_eNB->eNB_UE_stats[(uint32_t)UE_id].dlsch_trials[harq_pid][0]++;
-#ifdef OPENAIR2
- DLSCH_pdu = mac_xface->get_dlsch_sdu(phy_vars_eNB->Mod_id,
- phy_vars_eNB->CC_id,
- phy_vars_eNB->proc[sched_subframe].frame_tx,
- phy_vars_eNB->dlsch_eNB[(uint8_t)UE_id][0]->rnti,
- 0);
- phy_vars_eNB->eNB_UE_stats[UE_id].total_TBS_MAC += phy_vars_eNB->dlsch_eNB[(uint8_t)UE_id][0]->harq_processes[harq_pid]->TBS;
-#else
- DLSCH_pdu = DLSCH_pdu_tmp;
-
- for (i=0; imac_enabled==1) {
+ DLSCH_pdu = mac_xface->get_dlsch_sdu(phy_vars_eNB->Mod_id,
+ phy_vars_eNB->CC_id,
+ phy_vars_eNB->proc[sched_subframe].frame_tx,
+ phy_vars_eNB->dlsch_eNB[(uint8_t)UE_id][0]->rnti,
+ 0);
+ phy_vars_eNB->eNB_UE_stats[UE_id].total_TBS_MAC += phy_vars_eNB->dlsch_eNB[(uint8_t)UE_id][0]->harq_processes[harq_pid]->TBS;
+ }
+ else {
+ DLSCH_pdu = DLSCH_pdu_tmp;
+
+ for (i=0; iround++;
- if (dlsch_harq_proc->round == dlsch->Mdlharq) {
+ if (dlsch_harq_proc->round == 1/*dlsch->Mdlharq*/) {
// This was the last round for DLSCH so reset round and increment l2_error counter
#ifdef DEBUG_PHY_PROC
LOG_W(PHY,"[eNB %d][PDSCH %x/%d] DLSCH retransmissions exhausted, dropping packet\n",phy_vars_eNB->Mod_id,
@@ -3061,7 +2361,8 @@ void prach_procedures(PHY_VARS_eNB *phy_vars_eNB,uint8_t sched_subframe,uint8_t
preamble_energy_max/10,
preamble_energy_max%10,
preamble_delay_list[preamble_max]);
-#ifdef OPENAIR2
+
+ if (phy_vars_eNB->mac_enabled==1) {
uint8_t update_TA=4;
switch (phy_vars_eNB->lte_frame_parms.N_RB_DL) {
@@ -3082,16 +2383,14 @@ void prach_procedures(PHY_VARS_eNB *phy_vars_eNB,uint8_t sched_subframe,uint8_t
break;
}
-
-
mac_xface->initiate_ra_proc(phy_vars_eNB->Mod_id,
phy_vars_eNB->CC_id,
frame,
preamble_max,
preamble_delay_list[preamble_max]*update_TA,
0,subframe,0);
-
-#endif
+ }
+
} else {
MSC_LOG_EVENT(MSC_PHY_ENB, "0 RA Failed add user, too many");
LOG_I(PHY,"[eNB %d][RAPROC] frame %d, subframe %d: Unable to add user, max user count reached\n",
@@ -3277,11 +2576,13 @@ void phy_procedures_eNB_RX(const unsigned char sched_subframe,PHY_VARS_eNB *phy_
if ((i == 1) && (phy_vars_eNB->cooperation_flag > 0) && (two_ues_connected == 1))
break;
*/
-#ifdef OPENAIR2
- if (phy_vars_eNB->eNB_UE_stats[i].mode == RA_RESPONSE)
- process_Msg3(phy_vars_eNB,sched_subframe,i,harq_pid);
-#endif
+ if (phy_vars_eNB->mac_enabled==1) {
+ if (phy_vars_eNB->eNB_UE_stats[i].mode == RA_RESPONSE) {
+ process_Msg3(phy_vars_eNB,sched_subframe,i,harq_pid);
+ }
+ }
+
/*
#ifdef DEBUG_PHY_PROC
@@ -3518,12 +2819,12 @@ void phy_procedures_eNB_RX(const unsigned char sched_subframe,PHY_VARS_eNB *phy_
LOG_I(PHY,"[eNB %d][RAPROC] maxHARQ_Msg3Tx reached, abandoning RA procedure for UE %d\n",
phy_vars_eNB->Mod_id, i);
phy_vars_eNB->eNB_UE_stats[i].mode = PRACH;
-#ifdef OPENAIR2
- mac_xface->cancel_ra_proc(phy_vars_eNB->Mod_id,
- phy_vars_eNB->CC_id,
- frame,
- phy_vars_eNB->eNB_UE_stats[i].crnti);
-#endif
+ if (phy_vars_eNB->mac_enabled==1) {
+ mac_xface->cancel_ra_proc(phy_vars_eNB->Mod_id,
+ phy_vars_eNB->CC_id,
+ frame,
+ phy_vars_eNB->eNB_UE_stats[i].crnti);
+ }
remove_ue(phy_vars_eNB->eNB_UE_stats[i].crnti,phy_vars_eNB,abstraction_flag);
phy_vars_eNB->ulsch_eNB[(uint32_t)i]->Msg3_active = 0;
//phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->phich_active = 0;
@@ -3649,7 +2950,7 @@ void phy_procedures_eNB_RX(const unsigned char sched_subframe,PHY_VARS_eNB *phy_
phy_vars_eNB->eNB_UE_stats[i].ulsch_consecutive_errors = 0;
if (phy_vars_eNB->ulsch_eNB[i]->Msg3_flag == 1) {
-#ifdef OPENAIR2
+ if (phy_vars_eNB->mac_enabled==1) {
//#ifdef DEBUG_PHY_PROC
LOG_I(PHY,"[eNB %d][RAPROC] Frame %d Terminating ra_proc for harq %d, UE %d\n",
phy_vars_eNB->Mod_id,
@@ -3682,7 +2983,7 @@ void phy_procedures_eNB_RX(const unsigned char sched_subframe,PHY_VARS_eNB *phy_
phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->b,
phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->TBS>>3);
*/
-#endif
+ }
phy_vars_eNB->eNB_UE_stats[i].mode = PUSCH;
phy_vars_eNB->ulsch_eNB[i]->Msg3_flag = 0;
@@ -3731,7 +3032,7 @@ void phy_procedures_eNB_RX(const unsigned char sched_subframe,PHY_VARS_eNB *phy_
//dump_ulsch(phy_vars_eNB,sched_subframe,i);
-#ifdef OPENAIR2
+ if (phy_vars_eNB->mac_enabled==1) {
// if (phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->calibration_flag == 0) {
mac_xface->rx_sdu(phy_vars_eNB->Mod_id,
phy_vars_eNB->CC_id,
@@ -3758,7 +3059,7 @@ void phy_procedures_eNB_RX(const unsigned char sched_subframe,PHY_VARS_eNB *phy_
stop_meas(&phy_vars_eNB->localization_stats);
#endif
-#endif
+ }
}
// estimate timing advance for MAC
@@ -3909,12 +3210,12 @@ void phy_procedures_eNB_RX(const unsigned char sched_subframe,PHY_VARS_eNB *phy_
phy_vars_eNB->ulsch_eNB[i]->rnti,frame,subframe);
}
-#ifdef OPENAIR2
- mac_xface->SR_indication(phy_vars_eNB->Mod_id,
- phy_vars_eNB->CC_id,
- frame,
- phy_vars_eNB->dlsch_eNB[i][0]->rnti,subframe);
-#endif
+ if (phy_vars_eNB->mac_enabled==1) {
+ mac_xface->SR_indication(phy_vars_eNB->Mod_id,
+ phy_vars_eNB->CC_id,
+ frame,
+ phy_vars_eNB->dlsch_eNB[i][0]->rnti,subframe);
+ }
}
}// do_SR==1
diff --git a/openair1/SCHED/phy_procedures_lte_ue.c b/openair1/SCHED/phy_procedures_lte_ue.c
index bc84beae43..b29c229f27 100755
--- a/openair1/SCHED/phy_procedures_lte_ue.c
+++ b/openair1/SCHED/phy_procedures_lte_ue.c
@@ -59,20 +59,15 @@ extern int card;
#endif
#endif
-//#define DEBUG_PHY_PROC
-#define UE_TX_POWER (-10)
+#define DEBUG_PHY_PROC
-//#ifdef OPENAIR2
#ifndef PUCCH
#define PUCCH
#endif
-//#endif
-//#ifdef OPENAIR2
#include "LAYER2/MAC/extern.h"
#include "LAYER2/MAC/defs.h"
#include "UTIL/LOG/log.h"
-//#endif
#ifdef EMOS
fifo_dump_emos_UE emos_dump_UE;
@@ -87,9 +82,6 @@ fifo_dump_emos_UE emos_dump_UE;
# endif
#endif
-#ifndef OPENAIR2
-//#define DIAG_PHY
-#endif
#define DLSCH_RB_ALLOC 0x1fbf // skip DC RB (total 23/25 RBs)
#define DLSCH_RB_ALLOC_12 0x0aaa // skip DC RB (total 23/25 RBs)
@@ -121,7 +113,7 @@ extern int rx_sig_fifo;
#endif
-#if defined(EXMIMO) || defined(OAI_USRP)
+#if defined(EXMIMO) || defined(OAI_USRP) || defined(OAI_BLADERF) || defined(OAI_LMSSDR)
extern uint32_t downlink_frequency[MAX_NUM_CCs][4];
#endif
@@ -197,7 +189,7 @@ void dump_dlsch_SI(PHY_VARS_UE *phy_vars_ue,uint8_t eNB_id,uint8_t subframe)
exit(-1);
}
-#if defined(EXMIMO) || defined(OAI_USRP)
+#if defined(EXMIMO) || defined(OAI_USRP) || defined(OAI_BLADERF) || defined(OAI_LMSSDR)
//unsigned int gain_table[31] = {100,112,126,141,158,178,200,224,251,282,316,359,398,447,501,562,631,708,794,891,1000,1122,1258,1412,1585,1778,1995,2239,2512,2818,3162};
/*
unsigned int get_tx_amp_prach(int power_dBm, int power_max_dBm, int N_RB_UL)
@@ -454,7 +446,7 @@ uint16_t get_n1_pucch(PHY_VARS_UE *phy_vars_ue,
if (frame_parms->frame_type == FDD ) { // FDD
sf = (subframe<4)? subframe+6 : subframe-4;
- printf("n1_pucch_UE: subframe %d, nCCE %d\n",sf,phy_vars_ue->lte_ue_pdcch_vars[eNB_id]->nCCE[sf]);
+ LOG_D(PHY,"n1_pucch_UE: subframe %d, nCCE %d\n",sf,phy_vars_ue->lte_ue_pdcch_vars[eNB_id]->nCCE[sf]);
if (SR == 0)
return(frame_parms->pucch_config_common.n1PUCCH_AN + phy_vars_ue->lte_ue_pdcch_vars[eNB_id]->nCCE[sf]);
@@ -642,16 +634,12 @@ void phy_procedures_emos_UE_TX(uint8_t next_slot,uint8_t eNB_id) {
#endif
int dummy_tx_buffer[3840*4] __attribute__((aligned(16)));
-#ifndef OPENAIR2
PRACH_RESOURCES_t prach_resources_local;
-#endif
void phy_procedures_UE_TX(PHY_VARS_UE *phy_vars_ue,uint8_t eNB_id,uint8_t abstraction_flag,runmode_t mode,relaying_type_t r_type)
{
-#ifndef OPENAIR2
int i;
-#endif
uint16_t first_rb, nb_rb;
uint8_t harq_pid;
unsigned int input_buffer_length;
@@ -669,7 +657,7 @@ void phy_procedures_UE_TX(PHY_VARS_UE *phy_vars_ue,uint8_t eNB_id,uint8_t abstra
uint8_t ack_status=0;
int8_t Po_PUCCH;
int32_t ulsch_start=0;
-#if defined(EXMIMO) || defined(OAI_USRP)
+#if defined(EXMIMO) || defined(OAI_USRP) || defined(OAI_BLADERF) || defined(OAI_LMSSDR)
int overflow=0;
int k,l;
#endif
@@ -724,8 +712,7 @@ void phy_procedures_UE_TX(PHY_VARS_UE *phy_vars_ue,uint8_t eNB_id,uint8_t abstra
subframe_tx);
-#ifdef OPENAIR2
-
+ if (phy_vars_ue->mac_enabled == 1) {
if ((phy_vars_ue->ulsch_ue_Msg3_active[eNB_id] == 1) &&
(phy_vars_ue->ulsch_ue_Msg3_frame[eNB_id] == frame_tx) &&
(phy_vars_ue->ulsch_ue_Msg3_subframe[eNB_id] == subframe_tx)) { // Initial Transmission of Msg3
@@ -756,8 +743,7 @@ void phy_procedures_UE_TX(PHY_VARS_UE *phy_vars_ue,uint8_t eNB_id,uint8_t abstra
Msg3_flag=0;
}
-
-#endif
+ }
if (phy_vars_ue->ulsch_ue[eNB_id]->harq_processes[harq_pid]->subframe_scheduling_flag == 1) {
@@ -856,19 +842,17 @@ void phy_procedures_UE_TX(PHY_VARS_UE *phy_vars_ue,uint8_t eNB_id,uint8_t abstra
#endif
stop_meas(&phy_vars_ue->ulsch_encoding_stats);
-
-#ifdef OPENAIR2
- // signal MAC that Msg3 was sent
- mac_xface->Msg3_transmitted(Mod_id,
- CC_id,
- frame_tx,
- eNB_id);
-#endif
+ if (phy_vars_ue->mac_enabled == 1) {
+ // signal MAC that Msg3 was sent
+ mac_xface->Msg3_transmitted(Mod_id,
+ CC_id,
+ frame_tx,
+ eNB_id);
+ }
} else {
input_buffer_length = phy_vars_ue->ulsch_ue[eNB_id]->harq_processes[harq_pid]->TBS/8;
-#ifdef OPENAIR2
-
+ if (phy_vars_ue->mac_enabled==1) {
// LOG_D(PHY,"[UE %d] ULSCH : Searching for MAC SDUs\n",Mod_id);
if (phy_vars_ue->ulsch_ue[eNB_id]->harq_processes[harq_pid]->round==0) {
//if (phy_vars_ue->ulsch_ue[eNB_id]->harq_processes[harq_pid]->calibration_flag == 0) {
@@ -905,7 +889,8 @@ void phy_procedures_UE_TX(PHY_VARS_UE *phy_vars_ue,uint8_t eNB_id,uint8_t abstra
LOG_T(PHY,"\n");
#endif
#endif
-#else //OPENAIR2
+ }
+ else {
// the following lines were necessary for the calibration in CROWN
/*
if (phy_vars_ue->ulsch_ue[eNB_id]->harq_processes[harq_pid]->calibration_flag == 0) {
@@ -928,8 +913,8 @@ void phy_procedures_UE_TX(PHY_VARS_UE *phy_vars_ue,uint8_t eNB_id,uint8_t abstra
for (i=0;iulsch_encoding_stats);
if (abstraction_flag==0) {
@@ -961,15 +946,16 @@ void phy_procedures_UE_TX(PHY_VARS_UE *phy_vars_ue,uint8_t eNB_id,uint8_t abstra
}
if (abstraction_flag == 0) {
-#ifdef OPENAIR2
- pusch_power_cntl(phy_vars_ue,subframe_tx,eNB_id,1, abstraction_flag);
- phy_vars_ue->tx_power_dBm = phy_vars_ue->ulsch_ue[eNB_id]->Po_PUSCH;
-#else
- phy_vars_ue->tx_power_dBm = UE_TX_POWER;
-#endif
+ if (phy_vars_ue->mac_enabled==1) {
+ pusch_power_cntl(phy_vars_ue,subframe_tx,eNB_id,1, abstraction_flag);
+ phy_vars_ue->tx_power_dBm = phy_vars_ue->ulsch_ue[eNB_id]->Po_PUSCH;
+ }
+ else {
+ phy_vars_ue->tx_power_dBm = phy_vars_ue->tx_power_max_dBm;
+ }
phy_vars_ue->tx_total_RE = nb_rb*12;
-#if defined(EXMIMO) || defined(OAI_USRP)
+#if defined(EXMIMO) || defined(OAI_USRP) || defined(OAI_BLADERF) || defined(OAI_LMSSDR)
tx_amp = get_tx_amp(phy_vars_ue->tx_power_dBm,
phy_vars_ue->tx_power_max_dBm,
phy_vars_ue->lte_frame_parms.N_RB_UL,
@@ -1023,17 +1009,19 @@ void phy_procedures_UE_TX(PHY_VARS_UE *phy_vars_ue,uint8_t eNB_id,uint8_t abstra
if (is_SR_TXOp(phy_vars_ue,eNB_id,subframe_tx)==1) {
LOG_D(PHY,"[UE %d][SR %x] Frame %d subframe %d: got SR_TXOp, Checking for SR for PUSCH from MAC\n",
Mod_id,phy_vars_ue->lte_ue_pdcch_vars[eNB_id]->crnti,frame_tx,subframe_tx);
-#ifdef OPENAIR2
- SR_payload = mac_xface->ue_get_SR(Mod_id,
- CC_id,
- frame_tx,
- eNB_id,
- phy_vars_ue->lte_ue_pdcch_vars[eNB_id]->crnti,
- subframe_tx); // subframe used for meas gap
-#else
- SR_payload = 1;
-#endif
+ if (phy_vars_ue->mac_enabled==1) {
+ SR_payload = mac_xface->ue_get_SR(Mod_id,
+ CC_id,
+ frame_tx,
+ eNB_id,
+ phy_vars_ue->lte_ue_pdcch_vars[eNB_id]->crnti,
+ subframe_tx); // subframe used for meas gap
+ }
+ else {
+ SR_payload = 1;
+ }
+
if (SR_payload>0) {
generate_ul_signal = 1;
LOG_D(PHY,"[UE %d][SR %x] Frame %d subframe %d got the SR for PUSCH is %d\n",
@@ -1041,8 +1029,9 @@ void phy_procedures_UE_TX(PHY_VARS_UE *phy_vars_ue,uint8_t eNB_id,uint8_t abstra
} else {
phy_vars_ue->sr[subframe_tx]=0;
}
- } else
+ } else {
SR_payload=0;
+ }
if (get_ack(&phy_vars_ue->lte_frame_parms,
phy_vars_ue->dlsch_ue[eNB_id][0]->harq_ack,
@@ -1057,15 +1046,16 @@ void phy_procedures_UE_TX(PHY_VARS_UE *phy_vars_ue,uint8_t eNB_id,uint8_t abstra
pucch_ack_payload,
SR_payload);
-#ifdef OPENAIR2
- Po_PUCCH = pucch_power_cntl(phy_vars_ue,subframe_tx,eNB_id,format);
- phy_vars_ue->tx_power_dBm = Po_PUCCH;
-#else
- phy_vars_ue->tx_power_dBm = UE_TX_POWER;
-#endif
+ if (phy_vars_ue->mac_enabled == 1) {
+ Po_PUCCH = pucch_power_cntl(phy_vars_ue,subframe_tx,eNB_id,format);
+ }
+ else {
+ Po_PUCCH = phy_vars_ue->tx_power_max_dBm;
+ }
+ phy_vars_ue->tx_power_dBm = Po_PUCCH;
phy_vars_ue->tx_total_RE = 12;
-#if defined(EXMIMO) || defined(OAI_USRP)
+#if defined(EXMIMO) || defined(OAI_USRP) || defined(OAI_BLADERF) || defined(OAI_LMSSDR)
tx_amp = get_tx_amp(Po_PUCCH,
phy_vars_ue->tx_power_max_dBm,
phy_vars_ue->lte_frame_parms.N_RB_UL,
@@ -1120,15 +1110,16 @@ void phy_procedures_UE_TX(PHY_VARS_UE *phy_vars_ue,uint8_t eNB_id,uint8_t abstra
}
} else if (SR_payload==1) { // no ACK/NAK but SR is triggered by MAC
-#ifdef OPENAIR2
- Po_PUCCH = pucch_power_cntl(phy_vars_ue,subframe_tx,eNB_id,pucch_format1);
- phy_vars_ue->tx_power_dBm = Po_PUCCH;
-#else
- phy_vars_ue->tx_power_dBm = UE_TX_POWER;
-#endif
+ if (phy_vars_ue->mac_enabled == 1) {
+ Po_PUCCH = pucch_power_cntl(phy_vars_ue,subframe_tx,eNB_id,pucch_format1);
+ }
+ else {
+ Po_PUCCH = phy_vars_ue->tx_power_max_dBm;
+ }
+ phy_vars_ue->tx_power_dBm = Po_PUCCH;
phy_vars_ue->tx_total_RE = 12;
-#if defined(EXMIMO) || defined(OAI_USRP)
+#if defined(EXMIMO) || defined(OAI_USRP) || defined(OAI_BLADERF) || defined(OAI_LMSSDR)
tx_amp = get_tx_amp(Po_PUCCH,
phy_vars_ue->tx_power_max_dBm,
phy_vars_ue->lte_frame_parms.N_RB_UL,
@@ -1230,7 +1221,7 @@ void phy_procedures_UE_TX(PHY_VARS_UE *phy_vars_ue,uint8_t eNB_id,uint8_t abstra
if (abstraction_flag == 0) {
nsymb = (frame_parms->Ncp == 0) ? 14 : 12;
-#if defined(EXMIMO) || defined(OAI_USRP) //this is the EXPRESS MIMO case
+#if defined(EXMIMO) || defined(OAI_USRP) || defined(OAI_BLADERF) || defined(OAI_LMSSDR)//this is the EXPRESS MIMO case
ulsch_start = (phy_vars_ue->rx_offset+subframe_tx*frame_parms->samples_per_tti-
openair_daq_vars.timing_advance-
phy_vars_ue->timing_advance-
@@ -1257,7 +1248,7 @@ void phy_procedures_UE_TX(PHY_VARS_UE *phy_vars_ue,uint8_t eNB_id,uint8_t abstra
for (aa=0; aanb_antennas_tx; aa++) {
if (frame_parms->Ncp == 1)
PHY_ofdm_mod(&phy_vars_ue->lte_ue_common_vars.txdataF[aa][subframe_tx*nsymb*frame_parms->ofdm_symbol_size],
-#if defined(EXMIMO) || defined(OAI_USRP)
+#if defined(EXMIMO) || defined(OAI_USRP) || defined(OAI_BLADERF) || defined(OAI_LMSSDR)
dummy_tx_buffer,
#else
&phy_vars_ue->lte_ue_common_vars.txdata[aa][ulsch_start],
@@ -1268,7 +1259,7 @@ void phy_procedures_UE_TX(PHY_VARS_UE *phy_vars_ue,uint8_t eNB_id,uint8_t abstra
CYCLIC_PREFIX);
else
normal_prefix_mod(&phy_vars_ue->lte_ue_common_vars.txdataF[aa][subframe_tx*nsymb*frame_parms->ofdm_symbol_size],
-#if defined(EXMIMO) || defined(OAI_USRP)
+#if defined(EXMIMO) || defined(OAI_USRP) || defined(OAI_BLADERF) || defined(OAI_LMSSDR)
dummy_tx_buffer,
#else
&phy_vars_ue->lte_ue_common_vars.txdata[aa][ulsch_start],
@@ -1289,7 +1280,7 @@ void phy_procedures_UE_TX(PHY_VARS_UE *phy_vars_ue,uint8_t eNB_id,uint8_t abstra
}
*/
#ifndef OFDMA_ULSCH
-#if defined(EXMIMO) || defined(OAI_USRP)
+#if defined(EXMIMO) || defined(OAI_USRP) || defined(OAI_BLADERF) || defined(OAI_LMSSDR)
apply_7_5_kHz(phy_vars_ue,dummy_tx_buffer,0);
apply_7_5_kHz(phy_vars_ue,dummy_tx_buffer,1);
#else
@@ -1304,7 +1295,7 @@ void phy_procedures_UE_TX(PHY_VARS_UE *phy_vars_ue,uint8_t eNB_id,uint8_t abstra
*/
#endif
-#if defined(EXMIMO) || defined(OAI_USRP)
+#if defined(EXMIMO) || defined(OAI_USRP) || defined(OAI_BLADERF) || defined(OAI_LMSSDR)
overflow = ulsch_start - 9*frame_parms->samples_per_tti;
//if ((slot_tx==4) && (aa==0)) printf("ulsch_start %d, overflow %d\n",ulsch_start,overflow);
@@ -1345,30 +1336,23 @@ void phy_procedures_UE_TX(PHY_VARS_UE *phy_vars_ue,uint8_t eNB_id,uint8_t abstra
// }// slot_tx is even
// else { // slot_tx is odd, do the PRACH here
-#ifdef OPENAIR2
-
if ((phy_vars_ue->UE_mode[eNB_id] == PRACH) && (phy_vars_ue->lte_frame_parms.prach_config_common.prach_Config_enabled==1)) {
-#else
-
- if (1) {
-#endif
-
// check if we have PRACH opportunity
if (is_prach_subframe(&phy_vars_ue->lte_frame_parms,frame_tx,subframe_tx)) {
phy_vars_ue->generate_prach=0;
-#ifdef OPENAIR2
- // ask L2 for RACH transport
- if ((mode != rx_calib_ue) && (mode != rx_calib_ue_med) && (mode != rx_calib_ue_byp) && (mode != no_L2_connect) ) {
- phy_vars_ue->prach_resources[eNB_id] = mac_xface->ue_get_rach(Mod_id,
- CC_id,
- frame_tx,
- eNB_id,
- subframe_tx);
- // LOG_I(PHY,"Got prach_resources for eNB %d address %d, RRCCommon %d\n",eNB_id,phy_vars_ue->prach_resources[eNB_id],UE_mac_inst[Mod_id].radioResourceConfigCommon);
- }
-#endif
+ if (phy_vars_ue->mac_enabled==1){
+ // ask L2 for RACH transport
+ if ((mode != rx_calib_ue) && (mode != rx_calib_ue_med) && (mode != rx_calib_ue_byp) && (mode != no_L2_connect) ) {
+ phy_vars_ue->prach_resources[eNB_id] = mac_xface->ue_get_rach(Mod_id,
+ CC_id,
+ frame_tx,
+ eNB_id,
+ subframe_tx);
+ // LOG_I(PHY,"Got prach_resources for eNB %d address %d, RRCCommon %d\n",eNB_id,phy_vars_ue->prach_resources[eNB_id],UE_mac_inst[Mod_id].radioResourceConfigCommon);
+ }
+ }
if (phy_vars_ue->prach_resources[eNB_id]!=NULL) {
@@ -1391,20 +1375,17 @@ void phy_procedures_UE_TX(PHY_VARS_UE *phy_vars_ue,uint8_t eNB_id,uint8_t abstra
phy_vars_ue->prach_resources[eNB_id]->ra_TDD_map_index,
phy_vars_ue->prach_resources[eNB_id]->ra_RNTI);
-#ifdef OPENAIR2
- if (mode != calib_prach_tx)
+ if ((phy_vars_ue->mac_enabled==1) && (mode != calib_prach_tx)) {
phy_vars_ue->tx_power_dBm = phy_vars_ue->prach_resources[eNB_id]->ra_PREAMBLE_RECEIVED_TARGET_POWER+get_PL(Mod_id,CC_id,eNB_id);
+ }
else {
phy_vars_ue->tx_power_dBm = phy_vars_ue->tx_power_max_dBm;
phy_vars_ue->prach_resources[eNB_id]->ra_PreambleIndex = 19;
}
-#else
- phy_vars_ue->tx_power_dBm = UE_TX_POWER;
-#endif
phy_vars_ue->tx_total_RE = 96;
-#if defined(EXMIMO) || defined(OAI_USRP)
+#if defined(EXMIMO) || defined(OAI_USRP) || defined(OAI_BLADERF) || defined(OAI_LMSSDR)
phy_vars_ue->lte_ue_prach_vars[eNB_id]->amp = get_tx_amp(phy_vars_ue->tx_power_dBm,
phy_vars_ue->tx_power_max_dBm,
phy_vars_ue->lte_frame_parms.N_RB_UL,
@@ -1431,12 +1412,12 @@ void phy_procedures_UE_TX(PHY_VARS_UE *phy_vars_ue,uint8_t eNB_id,uint8_t abstra
} else {
UE_transport_info[Mod_id][CC_id].cntl.prach_flag=1;
UE_transport_info[Mod_id][CC_id].cntl.prach_id=phy_vars_ue->prach_resources[eNB_id]->ra_PreambleIndex;
-#ifdef OPENAIR2
- mac_xface->Msg1_transmitted(Mod_id,
- CC_id,
- frame_tx,
- eNB_id);
-#endif
+ if (phy_vars_ue->mac_enabled==1){
+ mac_xface->Msg1_transmitted(Mod_id,
+ CC_id,
+ frame_tx,
+ eNB_id);
+ }
}
LOG_D(PHY,"[UE %d][RAPROC] Frame %d, subframe %d: Generating PRACH (eNB %d) preamble index %d for UL, TX power %d dBm (PL %d dB), l3msg \n",
@@ -1549,13 +1530,15 @@ void lte_ue_measurement_procedures(uint16_t l, PHY_VARS_UE *phy_vars_ue,uint8_t
if ((openair_daq_vars.rx_gain_mode == DAQ_AGC_ON) &&
(mode != rx_calib_ue) && (mode != rx_calib_ue_med) && (mode != rx_calib_ue_byp) )
if (phy_vars_ue->frame_rx%100==0)
- gain_control_all(phy_vars_ue->PHY_measurements.rx_power_avg_dB[eNB_id],0);
+ gain_control_all(dB_fixed(phy_vars_ue->PHY_measurements.rssi),0);
#else
#ifndef OAI_USRP
- #ifndef OAI_BLADERF
- phy_adjust_gain (phy_vars_ue,0);
- #endif
+#ifndef OAI_BLADERF
+#ifndef OAI_LMSSDR
+ phy_adjust_gain (phy_vars_ue,dB_fixed(phy_vars_ue->PHY_measurements.rssi),0);
+#endif
+#endif
#endif
#endif
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_UE_GAIN_CONTROL, VCD_FUNCTION_OUT);
@@ -1820,11 +1803,11 @@ void lte_ue_pbch_procedures(uint8_t eNB_id,PHY_VARS_UE *phy_vars_ue,uint8_t abst
frame_tx += ((int)(phy_vars_ue->lte_ue_pbch_vars[eNB_id]->decoded_output[1]&0xfc));
frame_tx += pbch_phase;
-#ifdef OPENAIR2
- mac_xface->dl_phy_sync_success(phy_vars_ue->Mod_id,frame_rx,eNB_id,
- phy_vars_ue->UE_mode[eNB_id]==NOT_SYNCHED ? 1 : 0);
-#endif
-
+ if (phy_vars_ue->mac_enabled==1) {
+ mac_xface->dl_phy_sync_success(phy_vars_ue->Mod_id,frame_rx,eNB_id,
+ phy_vars_ue->UE_mode[eNB_id]==NOT_SYNCHED ? 1 : 0);
+ }
+
#ifdef EMOS
//emos_dump_UE.frame_tx = frame_tx;
//emos_dump_UE.mimo_mode = phy_vars_ue->lte_ue_pbch_vars[eNB_id]->decoded_output[1];
@@ -1904,16 +1887,15 @@ void lte_ue_pbch_procedures(uint8_t eNB_id,PHY_VARS_UE *phy_vars_ue,uint8_t abst
phy_vars_ue->Mod_id,frame_rx, slot_rx);
phy_vars_ue->lte_ue_pbch_vars[eNB_id]->pdu_errors_conseq++;
phy_vars_ue->lte_ue_pbch_vars[eNB_id]->pdu_errors++;
-#ifdef OPENAIR2
- mac_xface->out_of_sync_ind(phy_vars_ue->Mod_id,frame_rx,eNB_id);
-#else
-
- if (phy_vars_ue->lte_ue_pbch_vars[eNB_id]->pdu_errors_conseq>=100) {
- LOG_E(PHY,"More that 100 consecutive PBCH errors! Exiting!\n");
- mac_xface->macphy_exit("More that 100 consecutive PBCH errors!");
+ if (phy_vars_ue->mac_enabled == 1) {
+ mac_xface->out_of_sync_ind(phy_vars_ue->Mod_id,frame_rx,eNB_id);
+ }
+ else{
+ if (phy_vars_ue->lte_ue_pbch_vars[eNB_id]->pdu_errors_conseq>=100) {
+ LOG_E(PHY,"More that 100 consecutive PBCH errors! Exiting!\n");
+ mac_xface->macphy_exit("More that 100 consecutive PBCH errors!");
+ }
}
-
-#endif
}
if (frame_rx % 100 == 0) {
@@ -2103,10 +2085,10 @@ int lte_ue_pdcch_procedures(uint8_t eNB_id,PHY_VARS_UE *phy_vars_ue,uint8_t abst
#ifdef DEBUG_PHY_PROC
- // if (subframe_rx == 9) { //( frame_rx % 100 == 0) {
+ if ( frame_rx % 100 == 0) {
LOG_D(PHY,"frame %d, subframe %d, rnti %x: dci %d/%d\n",frame_rx,subframe_rx,phy_vars_ue->lte_ue_pdcch_vars[eNB_id]->crnti,i,dci_cnt);
- //dump_dci(&phy_vars_ue->lte_frame_parms, &dci_alloc_rx[i]);
- // }
+ dump_dci(&phy_vars_ue->lte_frame_parms, &dci_alloc_rx[i]);
+ }
#endif
@@ -2414,9 +2396,7 @@ int phy_procedures_UE_RX(PHY_VARS_UE *phy_vars_ue,uint8_t eNB_id,uint8_t abstrac
int eNB_id_i = 1;
uint8_t dual_stream_UE = 0;
#endif
-#ifndef OPENAIR2
uint8_t *rar;
-#endif
int pmch_flag=0;
uint8_t sync_area=255;
int pmch_mcs=-1;
@@ -2425,9 +2405,7 @@ int phy_procedures_UE_RX(PHY_VARS_UE *phy_vars_ue,uint8_t eNB_id,uint8_t abstrac
int slot_rx = phy_vars_ue->slot_rx;
int subframe_rx = slot_rx>>1;
int subframe_prev = (subframe_rx+9)%10;
-#ifdef OPENAIR2
int CC_id = phy_vars_ue->CC_id;
-#endif
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_UE_RX, VCD_FUNCTION_IN);
@@ -2676,18 +2654,12 @@ int phy_procedures_UE_RX(PHY_VARS_UE *phy_vars_ue,uint8_t eNB_id,uint8_t abstrac
if (ret == (1+phy_vars_ue->dlsch_ue[eNB_id][0]->max_turbo_iterations)) {
phy_vars_ue->dlsch_errors[eNB_id]++;
- //#ifdef DEBUG_PHY_PROC
LOG_D(PHY,"[UE %d][PDSCH %x/%d] Frame %d subframe %d DLSCH in error (rv %d,mcs %d,TBS %d)\n",
phy_vars_ue->Mod_id,phy_vars_ue->dlsch_ue[eNB_id][0]->rnti,
harq_pid,frame_rx,subframe_prev,
phy_vars_ue->dlsch_ue[eNB_id][0]->harq_processes[harq_pid]->rvidx,
phy_vars_ue->dlsch_ue[eNB_id][0]->harq_processes[harq_pid]->mcs,
phy_vars_ue->dlsch_ue[eNB_id][0]->harq_processes[harq_pid]->TBS);
-
- // if (abstraction_flag ==0 )
- dump_dlsch(phy_vars_ue,eNB_id,subframe_prev,harq_pid);
- mac_xface->macphy_exit("");
- //#endif
} else {
LOG_D(PHY,"[UE %d][PDSCH %x/%d] Frame %d subframe %d (slot_rx %d): Received DLSCH (rv %d,mcs %d,TBS %d)\n",
phy_vars_ue->Mod_id,phy_vars_ue->dlsch_ue[eNB_id][0]->rnti,
@@ -2706,14 +2678,14 @@ int phy_procedures_UE_RX(PHY_VARS_UE *phy_vars_ue,uint8_t eNB_id,uint8_t abstrac
LOG_T(PHY,"\n");
#endif
#endif
-#ifdef OPENAIR2
- mac_xface->ue_send_sdu(phy_vars_ue->Mod_id,
- CC_id,
- frame_rx,
- phy_vars_ue->dlsch_ue[eNB_id][0]->harq_processes[phy_vars_ue->dlsch_ue[eNB_id][0]->current_harq_pid]->b,
- phy_vars_ue->dlsch_ue[eNB_id][0]->harq_processes[phy_vars_ue->dlsch_ue[eNB_id][0]->current_harq_pid]->TBS>>3,
- eNB_id);
-#endif
+ if (phy_vars_ue->mac_enabled == 1) {
+ mac_xface->ue_send_sdu(phy_vars_ue->Mod_id,
+ CC_id,
+ frame_rx,
+ phy_vars_ue->dlsch_ue[eNB_id][0]->harq_processes[phy_vars_ue->dlsch_ue[eNB_id][0]->current_harq_pid]->b,
+ phy_vars_ue->dlsch_ue[eNB_id][0]->harq_processes[phy_vars_ue->dlsch_ue[eNB_id][0]->current_harq_pid]->TBS>>3,
+ eNB_id);
+ }
phy_vars_ue->total_TBS[eNB_id] = phy_vars_ue->total_TBS[eNB_id] +
phy_vars_ue->dlsch_ue[eNB_id][0]->harq_processes[phy_vars_ue->dlsch_ue[eNB_id][0]->current_harq_pid]->TBS;
phy_vars_ue->total_received_bits[eNB_id] = phy_vars_ue->total_TBS[eNB_id] +
@@ -2883,24 +2855,20 @@ int phy_procedures_UE_RX(PHY_VARS_UE *phy_vars_ue,uint8_t eNB_id,uint8_t abstrac
phy_vars_ue->dlsch_ue_SI[eNB_id]->harq_processes[0]->rb_alloc_even[3]);
#endif
-#ifdef OPENAIR2
- /*
- printf("\n\n");
- for (i=0;idlsch_ue_SI[eNB_id]->harq_processes[0]->TBS>>3;i++)
- printf("%02x ",phy_vars_ue->dlsch_ue_SI[eNB_id]->harq_processes[0]->b[i]);
- printf("\n");
- */
- mac_xface->ue_decode_si(phy_vars_ue->Mod_id,
- CC_id,
- frame_rx,
- eNB_id,
- phy_vars_ue->dlsch_ue_SI[eNB_id]->harq_processes[0]->b,
- phy_vars_ue->dlsch_ue_SI[eNB_id]->harq_processes[0]->TBS>>3);
- /*
- if ((frame_rx % 160) < 10)
- printf("sending SI to L2 in frame %d\n",frame_rx);
- */
-#endif
+ if (phy_vars_ue->mac_enabled == 1) {
+ /*
+ printf("\n\n");
+ for (i=0;idlsch_ue_SI[eNB_id]->harq_processes[0]->TBS>>3;i++)
+ printf("%02x ",phy_vars_ue->dlsch_ue_SI[eNB_id]->harq_processes[0]->b[i]);
+ printf("\n");
+ */
+ mac_xface->ue_decode_si(phy_vars_ue->Mod_id,
+ CC_id,
+ frame_rx,
+ eNB_id,
+ phy_vars_ue->dlsch_ue_SI[eNB_id]->harq_processes[0]->b,
+ phy_vars_ue->dlsch_ue_SI[eNB_id]->harq_processes[0]->TBS>>3);
+ }
}
}
@@ -3016,8 +2984,7 @@ int phy_procedures_UE_RX(PHY_VARS_UE *phy_vars_ue,uint8_t eNB_id,uint8_t abstrac
subframe_prev, phy_vars_ue->UE_mode[eNB_id]);
#endif
-#ifdef OPENAIR2
-
+ if (phy_vars_ue->mac_enabled == 1) {
if ((phy_vars_ue->UE_mode[eNB_id] != PUSCH) && (phy_vars_ue->prach_resources[eNB_id]->Msg3!=NULL)) {
LOG_D(PHY,"[UE %d][RAPROC] Frame %d subframe %d Invoking MAC for RAR (current preamble %d)\n",
phy_vars_ue->Mod_id,frame_rx-((subframe_prev==9) ? 1 : 0),
@@ -3074,14 +3041,13 @@ int phy_procedures_UE_RX(PHY_VARS_UE *phy_vars_ue,uint8_t eNB_id,uint8_t abstrac
phy_vars_ue->prach_resources[eNB_id]->ra_PreambleIndex);
}
} // mode != PUSCH
-
-#else //OPENAIR2
-
- rar = phy_vars_ue->dlsch_ue_ra[eNB_id]->harq_processes[0]->b+1;
- timing_advance = ((((uint16_t)(rar[0]&0x7f))<<4) + (rar[1]>>4));
- //timing_advance = phy_vars_ue->dlsch_ue_ra[eNB_id]->harq_processes[0]->b[0];
- process_timing_advance_rar(phy_vars_ue,timing_advance);
-#endif
+ }
+ else {
+ rar = phy_vars_ue->dlsch_ue_ra[eNB_id]->harq_processes[0]->b+1;
+ timing_advance = ((((uint16_t)(rar[0]&0x7f))<<4) + (rar[1]>>4));
+ //timing_advance = phy_vars_ue->dlsch_ue_ra[eNB_id]->harq_processes[0]->b[0];
+ process_timing_advance_rar(phy_vars_ue,timing_advance);
+ }
} //ret <= MAX_ITERATIONS
/*
@@ -3633,24 +3599,21 @@ void phy_procedures_UE_lte(PHY_VARS_UE *phy_vars_ue,uint8_t eNB_id,uint8_t abstr
int CC_id =0;
#endif
int frame_rx = phy_vars_ue->frame_rx;
-#ifdef OPENAIR2
int frame_tx = phy_vars_ue->frame_tx;
-#endif
int slot_rx = phy_vars_ue->slot_rx;
int slot_tx = phy_vars_ue->slot_tx;
int subframe_tx = slot_tx>>1;
int subframe_rx = slot_rx>>1;
#undef DEBUG_PHY_PROC
-#ifdef OPENAIR2
UE_L2_STATE_t ret;
-#endif
-#ifndef OPENAIR2
- phy_vars_ue->UE_mode[eNB_id]=PUSCH;
- phy_vars_ue->prach_resources[eNB_id] = &prach_resources_local;
- prach_resources_local.ra_RNTI = 0xbeef;
- prach_resources_local.ra_PreambleIndex = 0;
-#endif
+
+ if (phy_vars_ue->mac_enabled == 0) {
+ phy_vars_ue->UE_mode[eNB_id]=PUSCH;
+ phy_vars_ue->prach_resources[eNB_id] = &prach_resources_local;
+ prach_resources_local.ra_RNTI = 0xbeef;
+ prach_resources_local.ra_PreambleIndex = 0;
+ }
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_UE_LTE,1);
@@ -3849,16 +3812,14 @@ void phy_procedures_UE_lte(PHY_VARS_UE *phy_vars_ue,uint8_t eNB_id,uint8_t abstr
phy_procedures_UE_RX(phy_vars_ue,eNB_id,abstraction_flag,mode,r_type,phy_vars_rn);
}
-#ifdef OPENAIR2
-
- if (slot_rx%2==0) {
-
- ret = mac_xface->ue_scheduler(phy_vars_ue->Mod_id,
- frame_tx,
- subframe_rx,
- subframe_select(&phy_vars_ue->lte_frame_parms,subframe_tx),
- eNB_id,
- 0/*FIXME CC_id*/);
+ if (phy_vars_ue->mac_enabled==1) {
+ if (slot_rx%2==0) {
+ ret = mac_xface->ue_scheduler(phy_vars_ue->Mod_id,
+ frame_tx,
+ subframe_rx,
+ subframe_select(&phy_vars_ue->lte_frame_parms,subframe_tx),
+ eNB_id,
+ 0/*FIXME CC_id*/);
if (ret == CONNECTION_LOST) {
LOG_E(PHY,"[UE %d] Frame %d, subframe %d RRC Connection lost, returning to PRACH\n",phy_vars_ue->Mod_id,
@@ -3877,11 +3838,7 @@ void phy_procedures_UE_lte(PHY_VARS_UE *phy_vars_ue,uint8_t eNB_id,uint8_t abstr
phy_vars_ue->UE_mode[eNB_id] = PRACH;
}
}
-
-#endif
-
- // if (last_slot == 19)
- // phy_vars_ue->frame++;
+ }
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_UE_LTE,0);
stop_meas(&phy_vars_ue->phy_proc);
diff --git a/openair1/SIMULATION/LTE_PHY/dlsim.c b/openair1/SIMULATION/LTE_PHY/dlsim.c
index fbb88bf052..d67024810a 100644
--- a/openair1/SIMULATION/LTE_PHY/dlsim.c
+++ b/openair1/SIMULATION/LTE_PHY/dlsim.c
@@ -61,25 +61,7 @@
extern unsigned int dlsch_tbs25[27][25],TBStable[27][110];
extern unsigned char offset_mumimo_llr_drange_fix;
-#ifdef XFORMS
#include "PHY/TOOLS/lte_phy_scope.h"
-#endif
-
-
-
-//#define AWGN
-//#define NO_DCI
-
-
-
-//#define ABSTRACTION
-
-/*
- #define RBmask0 0x00fc00fc
- #define RBmask1 0x0
- #define RBmask2 0x0
- #define RBmask3 0x0
-*/
PHY_VARS_eNB *PHY_vars_eNB;
PHY_VARS_UE *PHY_vars_UE;
@@ -237,10 +219,9 @@ int main(int argc, char **argv)
short *uncoded_ber_bit=NULL;
uint8_t N_RB_DL=25,osf=1;
frame_t frame_type = FDD;
-#ifdef XFORMS
+ int xforms=0;
FD_lte_phy_scope_ue *form_ue;
char title[255];
-#endif
uint32_t DLSCH_RB_ALLOC = 0x1fff;
int numCCE=0;
int dci_length_bytes=0,dci_length=0;
@@ -305,7 +286,7 @@ int main(int argc, char **argv)
// num_layers = 1;
perfect_ce = 0;
- while ((c = getopt (argc, argv, "ahdpZDe:Em:n:o:s:f:t:c:g:r:F:x:y:z:AM:N:I:i:O:R:S:C:T:b:u:v:w:B:PLl:Y")) != -1) {
+ while ((c = getopt (argc, argv, "ahdpZDe:Em:n:o:s:f:t:c:g:r:F:x:y:z:AM:N:I:i:O:R:S:C:T:b:u:v:w:B:PLl:XY")) != -1) {
switch (c) {
case 'a':
awgn_flag = 1;
@@ -557,6 +538,10 @@ int main(int argc, char **argv)
break;
+ case 'X':
+ xforms=1;
+ break;
+
case 'Y':
perfect_ce=1;
break;
@@ -636,27 +621,36 @@ int main(int argc, char **argv)
if ((transmission_mode > 1) && (n_tx != 2))
printf("n_tx must be >1 for transmission_mode %d\n",transmission_mode);
-#ifdef XFORMS
- fl_initialize (&argc, argv, NULL, 0, 0);
- form_ue = create_lte_phy_scope_ue();
- sprintf (title, "LTE PHY SCOPE eNB");
- fl_show_form (form_ue->lte_phy_scope_ue, FL_PLACE_HOTSPOT, FL_FULLBORDER, title);
-
- if (!dual_stream_UE==0) {
- openair_daq_vars.use_ia_receiver = 1;
- fl_set_button(form_ue->button_0,1);
- fl_set_object_label(form_ue->button_0, "IA Receiver ON");
- fl_set_object_color(form_ue->button_0, FL_GREEN, FL_GREEN);
+ if (xforms==1) {
+ fl_initialize (&argc, argv, NULL, 0, 0);
+ form_ue = create_lte_phy_scope_ue();
+ sprintf (title, "LTE PHY SCOPE eNB");
+ fl_show_form (form_ue->lte_phy_scope_ue, FL_PLACE_HOTSPOT, FL_FULLBORDER, title);
+
+ if (!dual_stream_UE==0) {
+ openair_daq_vars.use_ia_receiver = 1;
+ fl_set_button(form_ue->button_0,1);
+ fl_set_object_label(form_ue->button_0, "IA Receiver ON");
+ fl_set_object_color(form_ue->button_0, FL_GREEN, FL_GREEN);
+ }
}
-#endif
-
if (transmission_mode==5) {
n_users = 2;
printf("dual_stream_UE=%d\n", dual_stream_UE);
}
- lte_param_init(n_tx,n_rx,transmission_mode,extended_prefix_flag,frame_type,Nid_cell,tdd_config,N_RB_DL,threequarter_fs,osf,perfect_ce);
+ lte_param_init(n_tx,
+ n_rx,
+ transmission_mode,
+ extended_prefix_flag,
+ frame_type,
+ Nid_cell,
+ tdd_config,
+ N_RB_DL,
+ threequarter_fs,
+ osf,
+ perfect_ce);
@@ -3486,13 +3480,13 @@ PMI_FEEDBACK:
// PHY_vars_UE->dlsch_ue[0][0]->harq_processes[0]->round++;
}
-#ifdef XFORMS
- phy_scope_UE(form_ue,
- PHY_vars_UE,
- eNB_id,
- 0,// UE_id
- subframe);
-#endif
+ if (xforms==1) {
+ phy_scope_UE(form_ue,
+ PHY_vars_UE,
+ eNB_id,
+ 0,// UE_id
+ subframe);
+ }
} //round
diff --git a/openair1/SIMULATION/LTE_PHY/mbmssim.c b/openair1/SIMULATION/LTE_PHY/mbmssim.c
index 98d1b68a15..0044b2ff51 100644
--- a/openair1/SIMULATION/LTE_PHY/mbmssim.c
+++ b/openair1/SIMULATION/LTE_PHY/mbmssim.c
@@ -173,7 +173,9 @@ int main(int argc, char **argv)
lte_frame_type_t frame_type = FDD;
+ uint32_t Nsoft = 1827072;
+ /*
#ifdef XFORMS
FD_lte_phy_scope_ue *form_ue;
char title[255];
@@ -183,6 +185,7 @@ int main(int argc, char **argv)
sprintf (title, "LTE DL SCOPE UE");
fl_show_form (form_ue->lte_phy_scope_ue, FL_PLACE_HOTSPOT, FL_FULLBORDER, title);
#endif
+ */
logInit();
number_of_cards = 1;
@@ -382,14 +385,14 @@ int main(int argc, char **argv)
0);
// Create transport channel structures for 2 transport blocks (MIMO)
- PHY_vars_eNB->dlsch_eNB_MCH = new_eNB_dlsch(1,8,N_RB_DL,0);
+ PHY_vars_eNB->dlsch_eNB_MCH = new_eNB_dlsch(1,8,Nsoft,N_RB_DL,0);
if (!PHY_vars_eNB->dlsch_eNB_MCH) {
printf("Can't get eNB dlsch structures\n");
exit(-1);
}
- PHY_vars_UE->dlsch_ue_MCH[0] = new_ue_dlsch(1,8,MAX_TURBO_ITERATIONS_MBSFN,N_RB_DL,0);
+ PHY_vars_UE->dlsch_ue_MCH[0] = new_ue_dlsch(1,8,Nsoft,MAX_TURBO_ITERATIONS_MBSFN,N_RB_DL,0);
PHY_vars_eNB->lte_frame_parms.num_MBSFN_config = 1;
PHY_vars_eNB->lte_frame_parms.MBSFN_config[0].radioframeAllocationPeriod = 0;
diff --git a/openair1/SIMULATION/LTE_PHY/ulsim.c b/openair1/SIMULATION/LTE_PHY/ulsim.c
index a72f2ad6c5..de40298d58 100644
--- a/openair1/SIMULATION/LTE_PHY/ulsim.c
+++ b/openair1/SIMULATION/LTE_PHY/ulsim.c
@@ -52,9 +52,7 @@
#include "LAYER2/MAC/vars.h"
#include "OCG_vars.h"
-#ifdef XFORMS
#include "PHY/TOOLS/lte_phy_scope.h"
-#endif
extern unsigned short dftsizes[33];
extern short *ul_ref_sigs[30][2][33];
@@ -74,12 +72,9 @@ node_desc_t *ue_data[NUMBER_OF_UE_MAX];
extern uint16_t beta_ack[16],beta_ri[16],beta_cqi[16];
//extern char* namepointer_chMag ;
-
-
-#ifdef XFORMS
+int xforms=0;
FD_lte_phy_scope_enb *form_enb;
char title[255];
-#endif
/*the following parameters are used to control the processing times*/
double t_tx_max = -1000000000; /*!< \brief initial max process time for tx */
@@ -194,6 +189,7 @@ int main(int argc, char **argv)
int nb_rb_set = 0;
int sf;
+ int threequarter_fs=0;
opp_enabled=1; // to enable the time meas
cpu_freq_GHz = (double)get_cpu_freq_GHz();
@@ -203,7 +199,7 @@ int main(int argc, char **argv)
logInit();
- while ((c = getopt (argc, argv, "hapZbm:n:Y:X:x:s:w:e:q:d:D:O:c:r:i:f:y:c:oA:C:R:g:N:l:S:T:QB:PI:L")) != -1) {
+ while ((c = getopt (argc, argv, "hapZEbm:n:Y:X:x:s:w:e:q:d:D:O:c:r:i:f:y:c:oA:C:R:g:N:l:S:T:QB:PI:LF")) != -1) {
switch (c) {
case 'a':
channel_model = AWGN;
@@ -373,6 +369,10 @@ int main(int argc, char **argv)
cyclic_shift = atoi(optarg);
break;
+ case 'E':
+ threequarter_fs=1;
+ break;
+
case 'N':
N0 = atoi(optarg);
break;
@@ -449,6 +449,10 @@ int main(int argc, char **argv)
max_turbo_iterations=atoi(optarg);
break;
+ case 'F':
+ xforms=1;
+ break;
+
case 'Z':
dump_table = 1;
break;
@@ -470,6 +474,7 @@ int main(int argc, char **argv)
0,
tdd_config,
N_RB_DL,
+ threequarter_fs,
osf,
0);
@@ -588,12 +593,12 @@ int main(int argc, char **argv)
}
-#ifdef XFORMS
- fl_initialize (&argc, argv, NULL, 0, 0);
- form_enb = create_lte_phy_scope_enb();
- sprintf (title, "LTE PHY SCOPE eNB");
- fl_show_form (form_enb->lte_phy_scope_enb, FL_PLACE_HOTSPOT, FL_FULLBORDER, title);
-#endif
+ if (xforms==1) {
+ fl_initialize (&argc, argv, NULL, 0, 0);
+ form_enb = create_lte_phy_scope_enb();
+ sprintf (title, "LTE PHY SCOPE eNB");
+ fl_show_form (form_enb->lte_phy_scope_enb, FL_PLACE_HOTSPOT, FL_FULLBORDER, title);
+ }
PHY_vars_UE->lte_ue_pdcch_vars[0]->crnti = 14;
@@ -1348,9 +1353,9 @@ int main(int argc, char **argv)
if ((errs[0]>=100) && (trials>(n_frames/2)))
break;
-#ifdef XFORMS
- phy_scope_eNB(form_enb,PHY_vars_eNB,0);
-#endif
+ if (xforms==1)
+ phy_scope_eNB(form_enb,PHY_vars_eNB,0);
+
/*calculate the total processing time for each packet, get the max, min, and number of packets that exceed t>3000us*/
double t_tx = (double)PHY_vars_UE->phy_proc_tx.p_time/cpu_freq_GHz/1000.0;
diff --git a/openair2/COMMON/commonDef.h b/openair2/COMMON/commonDef.h
index e33e64ec06..64216b0094 100644
--- a/openair2/COMMON/commonDef.h
+++ b/openair2/COMMON/commonDef.h
@@ -48,7 +48,19 @@ Description Contains global common definitions
#include
#include
+#include
+typedef signed char boolean_t;
+
+#if !defined(TRUE)
+#define TRUE (boolean_t)0x01
+#endif
+
+#if !defined(FALSE)
+#define FALSE (boolean_t)0x00
+#endif
+
+#define BOOL_NOT(b) (b^TRUE)
#define NAS_UE_ID_FMT "0x%06x"
@@ -59,13 +71,6 @@ Description Contains global common definitions
#define RETURNok (0)
#define RETURNerror (-1)
-#ifndef FALSE
-#define FALSE (0)
-#endif
-#ifndef TRUE
-#define TRUE (1)
-#endif
-
/*
* Name of the environment variable which defines the default directory
* where the NAS application is executed and where are located files
diff --git a/openair2/COMMON/s1ap_messages_types.h b/openair2/COMMON/s1ap_messages_types.h
index c39725b737..f2c6a2a3a2 100644
--- a/openair2/COMMON/s1ap_messages_types.h
+++ b/openair2/COMMON/s1ap_messages_types.h
@@ -112,7 +112,7 @@ typedef struct net_ip_address_s {
unsigned ipv4:1;
unsigned ipv6:1;
char ipv4_address[16];
- char ipv6_address[40];
+ char ipv6_address[46];
} net_ip_address_t;
typedef uint64_t bitrate_t;
diff --git a/openair2/ENB_APP/enb_config.c b/openair2/ENB_APP/enb_config.c
index b437c7e264..cc63eb8671 100755
--- a/openair2/ENB_APP/enb_config.c
+++ b/openair2/ENB_APP/enb_config.c
@@ -176,8 +176,12 @@
#define ENB_CONFIG_STRING_RRH_GW_REMOTE_ADDRESS "remote_address"
#define ENB_CONFIG_STRING_RRH_GW_LOCAL_PORT "local_port"
#define ENB_CONFIG_STRING_RRH_GW_REMOTE_PORT "remote_port"
-#define ENB_CONFIG_STRING_RRH_GW_ACTIVE "active"
-#define ENB_CONFIG_STRING_RRH_GW_PREFERENCE "preference"
+#define ENB_CONFIG_STRING_RRH_GW_ACTIVE "rrh_gw_active"
+#define ENB_CONFIG_STRING_RRH_GW_TRANSPORT_PREFERENCE "tr_preference"
+#define ENB_CONFIG_STRING_RRH_GW_RF_TARGET_PREFERENCE "rf_preference"
+#define ENB_CONFIG_STRING_RRH_GW_IQ_TXSHIFT "iq_txshift"
+#define ENB_CONFIG_STRING_RRH_GW_TX_SAMPLE_ADVANCE "tx_sample_advance"
+#define ENB_CONFIG_STRING_RRH_GW_TX_SCHEDULING_ADVANCE "tx_scheduling_advance"
#define ENB_CONFIG_STRING_ASN1_VERBOSITY "Asn1_verbosity"
#define ENB_CONFIG_STRING_ASN1_VERBOSITY_NONE "none"
@@ -261,7 +265,7 @@ static const eutra_band_t eutra_bands[] = {
Enb_properties_array_t enb_properties;
-static void enb_config_display(void)
+void enb_config_display(void)
{
int i,j;
@@ -291,7 +295,23 @@ static void enb_config_display(void)
printf( "\tlocal port : \t%d:\n",enb_properties.properties[i]->rrh_gw_config[j].local_port);
printf( "\tremote address : \t%s:\n",enb_properties.properties[i]->rrh_gw_config[j].remote_address);
printf( "\tremote port : \t%d:\n",enb_properties.properties[i]->rrh_gw_config[j].remote_port);
- printf( "\ttransport : \t%s Ethernet:\n\n",(enb_properties.properties[i]->rrh_gw_config[j].raw == 1)? "RAW" : "UDP");
+ printf( "\ttx_scheduling_advance :\t%d:\n",enb_properties.properties[i]->rrh_gw_config[j].tx_scheduling_advance);
+ printf( "\ttx_sample_advance : \t%d:\n",enb_properties.properties[i]->rrh_gw_config[j].tx_sample_advance);
+ printf( "\tiq_txshift : \t%d:\n",enb_properties.properties[i]->rrh_gw_config[j].iq_txshift);
+ printf( "\ttransport : \t%s Ethernet:\n",(enb_properties.properties[i]->rrh_gw_config[j].raw == 1)? "RAW" : "UDP");
+ if (enb_properties.properties[i]->rrh_gw_config[j].exmimo == 1) {
+ printf( "\tRF target : \tEXMIMO:\n\n");
+ } else if (enb_properties.properties[i]->rrh_gw_config[j].usrp_b200 == 1) {
+ printf( "\tRF target : \tUSRP_B200:\n\n");
+ } else if (enb_properties.properties[i]->rrh_gw_config[j].usrp_x300 == 1) {
+ printf( "\tRF target : \tUSRP_X300:\n\n");
+ } else if (enb_properties.properties[i]->rrh_gw_config[j].bladerf == 1) {
+ printf( "\tRF target : \tBLADERF:\n\n");
+ } else if (enb_properties.properties[i]->rrh_gw_config[j].lmssdr == 1) {
+ printf( "\tRF target : \tLMSSDR:\n\n");
+ } else {
+ printf( "\tRF target : \tNONE:\n\n");
+ }
}
}
@@ -479,14 +499,14 @@ const Enb_properties_array_t *enb_config_init(char* lib_config_file_name_pP)
config_setting_t *setting_rrh_gw = NULL;
config_setting_t *setting_enb = NULL;
config_setting_t *setting_otg = NULL;
- config_setting_t *subsetting_otg = NULL;
+ config_setting_t *subsetting_otg = NULL;
int num_enb_properties = 0;
int enb_properties_index = 0;
int num_enbs = 0;
int num_mme_address = 0;
int num_rrh_gw = 0;
- int num_otg_elements =0;
- int num_component_carriers =0;
+ int num_otg_elements = 0;
+ int num_component_carriers = 0;
int i = 0;
int j = 0;
int parse_errors = 0;
@@ -588,6 +608,12 @@ const Enb_properties_array_t *enb_config_init(char* lib_config_file_name_pP)
char* ipv6 = NULL;
char* active = NULL;
char* preference = NULL;
+
+ char* tr_preference = NULL;
+ char* rf_preference = NULL;
+ libconfig_int tx_scheduling_advance = 0;
+ libconfig_int tx_sample_advance = 0;
+ libconfig_int iq_txshift = 0;
libconfig_int local_port = 0;
libconfig_int remote_port = 0;
const char* active_enb[MAX_ENB];
@@ -993,7 +1019,7 @@ const Enb_properties_array_t *enb_config_init(char* lib_config_file_name_pP)
enb_properties.properties[enb_properties_index]->prach_zero_correlation[j] =prach_zero_correlation;
- if ((prach_zero_correlation <0) || (prach_zero_correlation > 63))
+ if ((prach_zero_correlation <0) || (prach_zero_correlation > 15))
AssertError (0, parse_errors ++,
"Failed to parse eNB configuration file %s, enb %d unknown value \"%d\" for prach_zero_correlation choice: 0..15!\n",
lib_config_file_name_pP, i, prach_zero_correlation);
@@ -2180,7 +2206,11 @@ const Enb_properties_array_t *enb_config_init(char* lib_config_file_name_pP)
&& config_setting_lookup_int(setting_rrh_gw, ENB_CONFIG_STRING_RRH_GW_LOCAL_PORT, &local_port)
&& config_setting_lookup_int(setting_rrh_gw, ENB_CONFIG_STRING_RRH_GW_REMOTE_PORT, &remote_port)
&& config_setting_lookup_string(setting_rrh_gw, ENB_CONFIG_STRING_RRH_GW_ACTIVE, (const char **)&active)
- && config_setting_lookup_string(setting_rrh_gw, ENB_CONFIG_STRING_RRH_GW_PREFERENCE, (const char **)&preference)
+ && config_setting_lookup_string(setting_rrh_gw, ENB_CONFIG_STRING_RRH_GW_TRANSPORT_PREFERENCE, (const char **)&tr_preference)
+ && config_setting_lookup_string(setting_rrh_gw, ENB_CONFIG_STRING_RRH_GW_RF_TARGET_PREFERENCE, (const char **)&rf_preference)
+ && config_setting_lookup_int(setting_rrh_gw, ENB_CONFIG_STRING_RRH_GW_IQ_TXSHIFT, &iq_txshift)
+ && config_setting_lookup_int(setting_rrh_gw, ENB_CONFIG_STRING_RRH_GW_TX_SAMPLE_ADVANCE, &tx_sample_advance)
+ && config_setting_lookup_int(setting_rrh_gw, ENB_CONFIG_STRING_RRH_GW_TX_SCHEDULING_ADVANCE, &tx_scheduling_advance)
)
) {
AssertError (0, parse_errors ++,
@@ -2194,21 +2224,43 @@ const Enb_properties_array_t *enb_config_init(char* lib_config_file_name_pP)
enb_properties.properties[enb_properties_index]->rrh_gw_if_name = strdup(if_name);
enb_properties.properties[enb_properties_index]->rrh_gw_config[j].local_address = strdup(ipv4);
enb_properties.properties[enb_properties_index]->rrh_gw_config[j].remote_address = strdup(ipv4_remote);
- enb_properties.properties[enb_properties_index]->rrh_gw_config[j].local_port= local_port;
- enb_properties.properties[enb_properties_index]->rrh_gw_config[j].remote_port= remote_port;
+ enb_properties.properties[enb_properties_index]->rrh_gw_config[j].local_port = local_port;
+ enb_properties.properties[enb_properties_index]->rrh_gw_config[j].remote_port = remote_port;
+ enb_properties.properties[enb_properties_index]->rrh_gw_config[j].iq_txshift = iq_txshift;
+ enb_properties.properties[enb_properties_index]->rrh_gw_config[j].tx_sample_advance = tx_sample_advance;
+ enb_properties.properties[enb_properties_index]->rrh_gw_config[j].tx_scheduling_advance= tx_scheduling_advance;
if (strcmp(active, "yes") == 0) {
enb_properties.properties[enb_properties_index]->rrh_gw_config[j].active = 1;
}
- if (strcmp(preference, "udp") == 0) {
+ if (strcmp(tr_preference, "udp") == 0) {
enb_properties.properties[enb_properties_index]->rrh_gw_config[j].udp = 1;
- } else if (strcmp(preference, "raw") == 0) {
+ } else if (strcmp(tr_preference, "raw") == 0) {
enb_properties.properties[enb_properties_index]->rrh_gw_config[j].raw = 1;
} else {//if (strcmp(preference, "no") == 0)
enb_properties.properties[enb_properties_index]->rrh_gw_config[j].udp = 1;
enb_properties.properties[enb_properties_index]->rrh_gw_config[j].raw = 1;
}
+
+ if (strcmp(rf_preference, "exmimo") == 0) {
+ enb_properties.properties[enb_properties_index]->rrh_gw_config[j].exmimo = 1;
+ } else if (strcmp(rf_preference, "usrp_b200") == 0) {
+ enb_properties.properties[enb_properties_index]->rrh_gw_config[j].usrp_b200 = 1;
+ } else if (strcmp(rf_preference, "usrp_x300") == 0) {
+ enb_properties.properties[enb_properties_index]->rrh_gw_config[j].usrp_x300 = 1;
+ } else if (strcmp(rf_preference, "bladerf") == 0) {
+ enb_properties.properties[enb_properties_index]->rrh_gw_config[j].bladerf = 1;
+ } else if (strcmp(rf_preference, "bladerf") == 0) {
+ enb_properties.properties[enb_properties_index]->rrh_gw_config[j].lmssdr = 1;
+ } else {//if (strcmp(preference, "no") == 0)
+ enb_properties.properties[enb_properties_index]->rrh_gw_config[j].exmimo = 1;
+ enb_properties.properties[enb_properties_index]->rrh_gw_config[j].usrp_b200 = 1;
+ enb_properties.properties[enb_properties_index]->rrh_gw_config[j].usrp_x300 = 1;
+ enb_properties.properties[enb_properties_index]->rrh_gw_config[j].bladerf = 1;
+ enb_properties.properties[enb_properties_index]->rrh_gw_config[j].lmssdr = 1;
+
+ }
}
} else {
enb_properties.properties[enb_properties_index]->nb_rrh_gw = 0;
@@ -2220,6 +2272,14 @@ const Enb_properties_array_t *enb_config_init(char* lib_config_file_name_pP)
enb_properties.properties[enb_properties_index]->rrh_gw_config[j].active = 0;
enb_properties.properties[enb_properties_index]->rrh_gw_config[j].udp = 0;
enb_properties.properties[enb_properties_index]->rrh_gw_config[j].raw = 0;
+ enb_properties.properties[enb_properties_index]->rrh_gw_config[j].tx_scheduling_advance = 0;
+ enb_properties.properties[enb_properties_index]->rrh_gw_config[j].tx_sample_advance = 0;
+ enb_properties.properties[enb_properties_index]->rrh_gw_config[j].iq_txshift = 0;
+ enb_properties.properties[enb_properties_index]->rrh_gw_config[j].exmimo = 0;
+ enb_properties.properties[enb_properties_index]->rrh_gw_config[j].usrp_b200 = 0;
+ enb_properties.properties[enb_properties_index]->rrh_gw_config[j].usrp_x300 = 0;
+ enb_properties.properties[enb_properties_index]->rrh_gw_config[j].bladerf = 0;
+ enb_properties.properties[enb_properties_index]->rrh_gw_config[j].lmssdr = 0;
}
// SCTP SETTING
diff --git a/openair2/ENB_APP/enb_config.h b/openair2/ENB_APP/enb_config.h
index 9c271ca4f4..5f7f2636a3 100755
--- a/openair2/ENB_APP/enb_config.h
+++ b/openair2/ENB_APP/enb_config.h
@@ -86,7 +86,14 @@ typedef struct rrh_gw_config_s {
char *remote_address;
uint16_t local_port;
uint16_t remote_port;
-
+ int tx_scheduling_advance;
+ int tx_sample_advance;
+ int iq_txshift;
+ unsigned exmimo:1;
+ unsigned usrp_b200:1;
+ unsigned usrp_x300:1;
+ unsigned bladerf:1;
+ unsigned lmssdr:1;
} rrh_gw_config_t;
typedef struct Enb_properties_s {
@@ -257,6 +264,7 @@ typedef struct Enb_properties_array_s {
Enb_properties_t *properties[MAX_ENB];
} Enb_properties_array_t;
+void enb_config_display(void);
const Enb_properties_array_t *enb_config_init(char* lib_config_file_name_pP);
const Enb_properties_array_t *enb_config_get(void);
diff --git a/openair2/LAYER2/MAC/l1_helpers.c b/openair2/LAYER2/MAC/l1_helpers.c
index 3b4c78ea92..44bdbfe00e 100644
--- a/openair2/LAYER2/MAC/l1_helpers.c
+++ b/openair2/LAYER2/MAC/l1_helpers.c
@@ -47,8 +47,8 @@ int8_t get_Po_NOMINAL_PUSCH(module_id_t module_idP,uint8_t CC_id)
if (CC_id>0) {
LOG_E(MAC,"Transmission on secondary CCs is not supported yet\n");
- mac_xface->macphy_exit("MAC FATAL CC_id>0");
- return 0; // not reached
+ //mac_xface->macphy_exit("MAC FATAL CC_id>0");
+ return 0;
}
if (UE_mac_inst[module_idP].radioResourceConfigCommon) {
@@ -56,7 +56,8 @@ int8_t get_Po_NOMINAL_PUSCH(module_id_t module_idP,uint8_t CC_id)
}
else {
LOG_E(MAC,"[UE %d] CCid %d FATAL radioResourceConfigCommon is NULL !!!\n",module_idP,CC_id);
- mac_xface->macphy_exit("FATAL radioResourceConfigCommon is NULL");
+ //mac_xface->macphy_exit("FATAL radioResourceConfigCommon is NULL");
+ return 0;
}
return(-120 + (rach_ConfigCommon->powerRampingParameters.preambleInitialReceivedTargetPower<<1) +
diff --git a/openair2/LAYER2/RLC/rlc.h b/openair2/LAYER2/RLC/rlc.h
index 392ae88cf8..72fde0b746 100755
--- a/openair2/LAYER2/RLC/rlc.h
+++ b/openair2/LAYER2/RLC/rlc.h
@@ -60,6 +60,8 @@
# include "DRB-ToAddModList.h"
# include "SRB-ToAddMod.h"
# include "SRB-ToAddModList.h"
+# include "DRB-ToReleaseList.h"
+
#ifdef Rel10
#include "PMCH-InfoList-r9.h"
#endif
diff --git a/openair2/UTIL/OCG/OCG_parse_XML.c b/openair2/UTIL/OCG/OCG_parse_XML.c
index 5397cdbd98..0100d742e1 100644
--- a/openair2/UTIL/OCG/OCG_parse_XML.c
+++ b/openair2/UTIL/OCG/OCG_parse_XML.c
@@ -51,10 +51,6 @@
#include "UTIL/OPT/opt.h"
/*----------------------------------------------------------------------------*/
-#ifndef HAVE_STRNDUP
-char * strndup (const char *s, size_t size);
-#endif
-
static int oai_emulation_; /*!< \brief indicating that the parsing position is now within OAI_Emulation_*/
static int environment_system_config_; /*!< \brief indicating that the parsing position is now within Envi_Config_*/
diff --git a/openair3/S1AP/MESSAGES/ASN1/asn1cpatch_3.p0 b/openair3/S1AP/MESSAGES/ASN1/asn1cpatch_3.p0
new file mode 100644
index 0000000000..3986a6a83b
--- /dev/null
+++ b/openair3/S1AP/MESSAGES/ASN1/asn1cpatch_3.p0
@@ -0,0 +1,1266 @@
+--- asn1c/unber.c 2015-12-08 14:39:33.282543533 +0100
++++ asn1c/unber.c 2015-12-07 10:46:18.382647000 +0100
+@@ -779,4 +779,6 @@
+
+ asn_enc_rval_t OCTET_STRING_encode_aper(asn_TYPE_descriptor_t *td, asn_per_constraints_t *cts, void *sptr, asn_per_outp_t *po) { asn_enc_rval_t er = { 0, 0, 0 }; (void)td; (void)cts; (void)sptr; (void)po; return er; }
+
++asn_comp_rval_t * OCTET_STRING_compare(asn_TYPE_descriptor_t *td1, void *sptr1, asn_TYPE_descriptor_t *td2, void *sptr2) { (void)td1; (void)sptr1; (void)td2; (void)sptr2; return 0; }
++
+ size_t xer_whitespace_span(const void *chunk_buf, size_t chunk_size) { (void)chunk_buf; (void)chunk_size; return 0; }
+--- libasn1compiler/asn1c_C.c 2015-12-08 14:39:33.366543533 +0100
++++ libasn1compiler/asn1c_C.c 2015-12-08 08:38:29.002565000 +0100
+@@ -1082,6 +1082,8 @@
+ enum tvm_compat tv_mode;
+ enum etd_spec etd_spec;
+ char *p;
++ //char tmp_buf[512];
++ //int i = 0;
+
+ if(arg->embed) {
+ enum tnfmt tnfmt = TNF_CTYPE;
+@@ -1243,7 +1245,8 @@
+ OUT("td->uper_decoder = asn_DEF_%s.uper_decoder;\n", type_name);
+ OUT("td->uper_encoder = asn_DEF_%s.uper_encoder;\n", type_name);
+ OUT("td->aper_decoder = asn_DEF_%s.aper_decoder;\n", type_name);
+- OUT("td->aper_encoder = asn_DEF_%s.aper_encoder;\n", type_name);
++ OUT("td->aper_encoder = asn_DEF_%s.aper_encoder;\n", type_name);
++ OUT("td->compare = asn_DEF_%s.compare;\n", type_name);
+ if(!terminal && !tags_count) {
+ OUT("/* The next four lines are here because of -fknown-extern-type */\n");
+ OUT("td->tags = asn_DEF_%s.tags;\n", type_name);
+@@ -1413,6 +1416,39 @@
+ OUT("}\n");
+ OUT("\n");
+
++
++ //i = 0;
++ //while ((p[i] != '_') && (i < sizeof(tmp_buf))) {
++ // tmp_buf[i] = p[i];
++ // i++;
++ //}
++ //tmp_buf[i] = '\0';
++ // hack, only for s1ap
++ //if ((strcmp("S1ap", tmp_buf) == 0) || (strcmp("X2ap", tmp_buf) == 0))
++ // OUT("#include \"%s-ProtocolIE-ID.h\"\n", tmp_buf);
++
++
++ p = MKID(expr);
++ if(HIDE_INNER_DEFS) OUT("static ");
++ OUT("asn_comp_rval_t * \n");
++ OUT("%s", p);
++ if(HIDE_INNER_DEFS) OUT("_%d", expr->_type_unique_index);
++ OUT("_compare(asn_TYPE_descriptor_t *td1,\n");
++ INDENTED(
++ OUT("\tvoid *structure1,\n");
++ OUT("\tasn_TYPE_descriptor_t *td2,\n");
++ OUT("\tvoid *structure2) {\n");
++ OUT("asn_comp_rval_t * res = NULL;\n");
++ OUT("%s_%d_inherit_TYPE_descriptor(td1);\n",
++ p, expr->_type_unique_index);
++ OUT("%s_%d_inherit_TYPE_descriptor(td2);\n",
++ p, expr->_type_unique_index);
++ OUT("res = td1->compare(td1, structure1, td2, structure2);\n");
++ OUT("return res;\n");
++ );
++ OUT("}\n");
++ OUT("\n");
++
+ p = MKID(expr);
+
+ if(HIDE_INNER_DEFS) OUT("static ");
+@@ -1450,7 +1486,8 @@
+ OUT("per_type_decoder_f %s_decode_uper;\n", p);
+ OUT("per_type_encoder_f %s_encode_uper;\n", p);
+ OUT("per_type_decoder_f %s_decode_aper;\n", p);
+- OUT("per_type_encoder_f %s_encode_aper;\n", p);
++ OUT("per_type_encoder_f %s_encode_aper;\n", p);
++ OUT("type_compare_f %s_compare;\n", p);
+ }
+ }
+
+@@ -2501,6 +2538,7 @@
+ OUT("0, 0,\t/* No APER support, "
+ "use \"-gen-PER\" to enable */\n");
+ }
++ FUNCREF(compare);
+
+ if(!terminal || terminal->expr_type == ASN_CONSTR_CHOICE) {
+ //if(expr->expr_type == ASN_CONSTR_CHOICE) {
+--- skeletons/ANY.c 2015-12-08 14:39:33.350543533 +0100
++++ skeletons/ANY.c 2015-11-26 14:40:56.547616000 +0100
+@@ -24,7 +24,8 @@
+ OCTET_STRING_decode_uper,
+ OCTET_STRING_encode_uper,
+ OCTET_STRING_decode_aper,
+- OCTET_STRING_encode_aper,
++ OCTET_STRING_encode_aper,
++ OCTET_STRING_compare,
+ 0, /* Use generic outmost tag fetcher */
+ 0, 0, 0, 0,
+ 0, /* No PER visible constraints */
+--- skeletons/asn_application.h 2015-12-08 14:39:12.674543554 +0100
++++ skeletons/asn_application.h 2015-12-07 14:36:32.950633000 +0100
+@@ -9,7 +9,8 @@
+ #define _ASN_APPLICATION_H_
+
+ #include "asn_system.h" /* for platform-dependent types */
+-#include "asn_codecs.h" /* for ASN.1 codecs specifics */
++#include "asn_codecs.h" /* for ASN.1 codecs specifics */
++#include "asn_compare.h"
+
+ #ifdef __cplusplus
+ extern "C" {
+--- skeletons/asn_compare.h 1970-01-01 01:00:00.000000000 +0100
++++ skeletons/asn_compare.h 2015-12-08 10:34:58.090558000 +0100
+@@ -0,0 +1,78 @@
++#ifndef _ASN_COMPARE_H_
++#define _ASN_COMPARE_H_
++
++#ifdef __cplusplus
++extern "C" {
++#endif
++
++struct asn_TYPE_descriptor_s; /* Forward declaration */
++
++
++typedef enum COMPARE_ERR_CODE_e {
++ COMPARE_ERR_CODE_START = 0,
++ COMPARE_ERR_CODE_NONE = COMPARE_ERR_CODE_START,
++ COMPARE_ERR_CODE_NO_MATCH,
++ COMPARE_ERR_CODE_TYPE_MISMATCH,
++ COMPARE_ERR_CODE_TYPE_ARG_NULL,
++ COMPARE_ERR_CODE_VALUE_NULL,
++ COMPARE_ERR_CODE_VALUE_ARG_NULL,
++ COMPARE_ERR_CODE_CHOICE_NUM,
++ COMPARE_ERR_CODE_CHOICE_PRESENT,
++ COMPARE_ERR_CODE_CHOICE_MALFORMED,
++ COMPARE_ERR_CODE_SET_MALFORMED,
++ COMPARE_ERR_CODE_COLLECTION_NUM_ELEMENTS,
++ COMPARE_ERR_CODE_END
++} COMPARE_ERR_CODE_t;
++
++typedef struct asn_comp_rval_s {
++ enum COMPARE_ERR_CODE_e err_code;
++ char *name; // e_S1ap_ProtocolIE_ID not available for all ASN1 use (RRC vs S1AP, X2AP)
++ void *structure1;
++ void *structure2;
++ struct asn_comp_rval_s *next;
++} asn_comp_rval_t;
++
++#define COMPARE_CHECK_ARGS(aRg_tYpE_dEf1, aRg_tYpE_dEf2, aRg_vAl1, aRg_vAl2, rEsUlT) \
++ do {\
++ if ((aRg_tYpE_dEf1) && (aRg_tYpE_dEf2)) {\
++ if ((aRg_tYpE_dEf1->name) && (aRg_tYpE_dEf2->name)) {\
++ if (strcmp(aRg_tYpE_dEf1->name, aRg_tYpE_dEf2->name)) {\
++ rEsUlT = (asn_comp_rval_t *)calloc(1, sizeof(asn_comp_rval_t));\
++ rEsUlT->err_code = COMPARE_ERR_CODE_TYPE_MISMATCH;\
++ rEsUlT->name = aRg_tYpE_dEf1->name;\
++ return rEsUlT;\
++ }\
++ } else {\
++ if ((aRg_tYpE_dEf1->xml_tag) && (aRg_tYpE_dEf2->xml_tag)) {\
++ if (strcmp(aRg_tYpE_dEf1->xml_tag, aRg_tYpE_dEf2->xml_tag)) {\
++ rEsUlT = (asn_comp_rval_t *)calloc(1, sizeof(asn_comp_rval_t));\
++ rEsUlT->err_code = COMPARE_ERR_CODE_TYPE_MISMATCH;\
++ rEsUlT->name = aRg_tYpE_dEf1->xml_tag;\
++ return rEsUlT;\
++ }\
++ }\
++ }\
++ } else {\
++ rEsUlT = (asn_comp_rval_t *)calloc(1, sizeof(asn_comp_rval_t));\
++ rEsUlT->name = aRg_tYpE_dEf1->name;\
++ rEsUlT->structure1 = aRg_vAl1;\
++ rEsUlT->structure2 = aRg_vAl2;\
++ rEsUlT->err_code = COMPARE_ERR_CODE_TYPE_ARG_NULL;\
++ return rEsUlT;\
++ }\
++ if ((NULL == aRg_vAl1) || (NULL == aRg_vAl2)){\
++ rEsUlT = (asn_comp_rval_t *)calloc(1, sizeof(asn_comp_rval_t));\
++ rEsUlT->name = aRg_tYpE_dEf1->name;\
++ rEsUlT->structure1 = aRg_vAl1;\
++ rEsUlT->structure2 = aRg_vAl2;\
++ rEsUlT->err_code = COMPARE_ERR_CODE_VALUE_ARG_NULL;\
++ return rEsUlT;\
++ }\
++ } while (0);
++
++
++#ifdef __cplusplus
++}
++#endif
++
++#endif /* _ASN_COMPARE_H_ */
+--- skeletons/BIT_STRING.c 2015-12-08 14:39:33.346543533 +0100
++++ skeletons/BIT_STRING.c 2015-11-26 14:41:50.159616000 +0100
+@@ -30,7 +30,8 @@
+ OCTET_STRING_decode_uper, /* Unaligned PER decoder */
+ OCTET_STRING_encode_uper, /* Unaligned PER encoder */
+ OCTET_STRING_decode_aper, /* Aligned PER decoder */
+- OCTET_STRING_encode_aper, /* Aligned PER encoder */
++ OCTET_STRING_encode_aper, /* Aligned PER encoder */
++ OCTET_STRING_compare,
+ 0, /* Use generic outmost tag fetcher */
+ asn_DEF_BIT_STRING_tags,
+ sizeof(asn_DEF_BIT_STRING_tags)
+--- skeletons/BMPString.c 2015-12-08 14:39:33.338543533 +0100
++++ skeletons/BMPString.c 2015-11-26 14:42:08.487616000 +0100
+@@ -36,7 +36,8 @@
+ OCTET_STRING_decode_uper,
+ OCTET_STRING_encode_uper,
+ OCTET_STRING_decode_aper, /* Aligned PER decoder */
+- OCTET_STRING_encode_aper, /* Aligned PER encoder */
++ OCTET_STRING_encode_aper, /* Aligned PER encoder */
++ OCTET_STRING_compare,
+ 0, /* Use generic outmost tag fetcher */
+ asn_DEF_BMPString_tags,
+ sizeof(asn_DEF_BMPString_tags)
+--- skeletons/BOOLEAN.c 2015-12-08 14:39:33.342543533 +0100
++++ skeletons/BOOLEAN.c 2015-12-08 10:37:11.866558000 +0100
+@@ -25,7 +25,8 @@
+ BOOLEAN_decode_uper, /* Unaligned PER decoder */
+ BOOLEAN_encode_uper, /* Unaligned PER encoder */
+ BOOLEAN_decode_aper, /* Aligned PER decoder */
+- BOOLEAN_encode_aper, /* Aligned PER encoder */
++ BOOLEAN_encode_aper, /* Aligned PER encoder */
++ BOOLEAN_compare,
+ 0, /* Use generic outmost tag fetcher */
+ asn_DEF_BOOLEAN_tags,
+ sizeof(asn_DEF_BOOLEAN_tags) / sizeof(asn_DEF_BOOLEAN_tags[0]),
+@@ -326,3 +327,22 @@
+
+ _ASN_ENCODED_OK(er);
+ }
++
++asn_comp_rval_t *
++BOOLEAN_compare(asn_TYPE_descriptor_t *td1,
++ void *sptr1, asn_TYPE_descriptor_t *td2, void *sptr2) {
++ const BOOLEAN_t *st1 = (const BOOLEAN_t *)sptr1;
++ const BOOLEAN_t *st2 = (const BOOLEAN_t *)sptr2;
++ asn_comp_rval_t *res = NULL;
++
++ COMPARE_CHECK_ARGS(td1, td2, sptr1, sptr2, res)
++
++ if (*st1 == *st2) return NULL;
++ res = calloc(1, sizeof(asn_comp_rval_t));
++ res->name = td1->name;
++ res->structure1 = sptr1;
++ res->structure2 = sptr2;
++ res->err_code = COMPARE_ERR_CODE_NO_MATCH;
++ return res;
++}
++
+--- skeletons/BOOLEAN.h 2015-12-08 14:39:33.342543533 +0100
++++ skeletons/BOOLEAN.h 2015-11-26 12:46:58.491623000 +0100
+@@ -30,6 +30,7 @@
+ per_type_encoder_f BOOLEAN_encode_uper;
+ per_type_decoder_f BOOLEAN_decode_aper;
+ per_type_encoder_f BOOLEAN_encode_aper;
++type_compare_f BOOLEAN_compare;
+
+ #ifdef __cplusplus
+ }
+--- skeletons/compare.h 1970-01-01 01:00:00.000000000 +0100
++++ skeletons/compare.h 2015-12-08 08:23:03.694566000 +0100
+@@ -0,0 +1,28 @@
++/*-
++ * Eurecom 2015.
++ */
++#ifndef _COMPARE_H_
++#define _COMPARE_H_
++
++#include
++
++#ifdef __cplusplus
++extern "C" {
++#endif
++
++struct asn_TYPE_descriptor_s; /* Forward declaration */
++
++typedef asn_comp_rval_t * (type_compare_f)(
++ struct asn_TYPE_descriptor_s *type_descriptor1,
++ void *struct_ptr1,
++ struct asn_TYPE_descriptor_s *type_descriptor2,
++ void *struct_ptr2
++);
++
++
++
++#ifdef __cplusplus
++}
++#endif
++
++#endif /* _COMPARE_H_ */
+--- skeletons/constr_CHOICE.c 2015-12-08 14:39:33.342543533 +0100
++++ skeletons/constr_CHOICE.c 2015-12-08 10:39:16.670558000 +0100
+@@ -1272,3 +1272,75 @@
+ assert(pres_size != sizeof(int));
+ }
+ }
++
++asn_comp_rval_t *
++CHOICE_compare(asn_TYPE_descriptor_t *td1, void *sptr1, asn_TYPE_descriptor_t *td2, void *sptr2)
++{
++ asn_CHOICE_specifics_t *specs1 = (asn_CHOICE_specifics_t *)td1->specifics;
++ asn_CHOICE_specifics_t *specs2 = (asn_CHOICE_specifics_t *)td2->specifics;
++ int present1;
++ int present2;
++ asn_comp_rval_t *res = NULL;
++
++ COMPARE_CHECK_ARGS(td1, td2, sptr1, sptr2, res)
++
++ /*
++ * Figure out which CHOICE element is encoded.
++ */
++ present1 = _fetch_present_idx(sptr1, specs1->pres_offset,specs1->pres_size);
++ // same specs
++ present2 = _fetch_present_idx(sptr2, specs2->pres_offset,specs2->pres_size);
++
++ if (td1->elements_count != td2->elements_count) {
++ res = calloc(1, sizeof(asn_comp_rval_t));
++ res->name = td1->name;
++ res->structure1 = sptr1;
++ res->structure2 = sptr2;
++ res->err_code = COMPARE_ERR_CODE_CHOICE_NUM;
++ return res;
++ }
++ if (present1 != present2) {
++ res = calloc(1, sizeof(asn_comp_rval_t));
++ res->name = td1->name;
++ res->structure1 = sptr1;
++ res->structure2 = sptr2;
++ res->err_code = COMPARE_ERR_CODE_CHOICE_PRESENT;
++ return res;
++ }
++ if(present1 > 0 && present1 <= td1->elements_count) {
++ asn_TYPE_member_t *elm1 = &td1->elements[present1-1];
++ asn_TYPE_member_t *elm2 = &td2->elements[present2-1];
++ const void *memb_ptr1;
++ const void *memb_ptr2;
++
++ if((elm1->flags & ATF_POINTER) && (elm1->flags & ATF_POINTER)){
++ memb_ptr1 = *(const void * const *)((const char *)sptr1 + elm1->memb_offset);
++ memb_ptr2 = *(const void * const *)((const char *)sptr2 + elm2->memb_offset);
++ if((!memb_ptr1) || (!memb_ptr2)) {
++ res = calloc(1, sizeof(asn_comp_rval_t));
++ res->name = td1->name;
++ res->structure1 = sptr1;
++ res->structure2 = sptr2;
++ res->err_code = COMPARE_ERR_CODE_VALUE_NULL;
++ return res;
++ }
++ } else if (!(elm1->flags & ATF_POINTER) && !(elm1->flags & ATF_POINTER)){
++ memb_ptr1 = (const void *)((const char *)sptr1 + elm1->memb_offset);
++ memb_ptr2 = (const void *)((const char *)sptr2 + elm2->memb_offset);
++ } else {
++ res = calloc(1, sizeof(asn_comp_rval_t));
++ res->name = td1->name;
++ res->structure1 = sptr1;
++ res->structure2 = sptr2;
++ res->err_code = COMPARE_ERR_CODE_CHOICE_MALFORMED;
++ return res;
++ }
++ return elm1->type->compare(elm1->type, memb_ptr1, elm2->type, memb_ptr2);
++ }
++ res = calloc(1, sizeof(asn_comp_rval_t));
++ res->name = td1->name;
++ res->structure1 = sptr1;
++ res->structure2 = sptr2;
++ res->err_code = COMPARE_ERR_CODE_CHOICE_MALFORMED;
++ return res;
++}
+--- skeletons/constr_CHOICE.h 2015-12-08 14:39:33.342543533 +0100
++++ skeletons/constr_CHOICE.h 2015-11-26 14:43:57.647616000 +0100
+@@ -39,7 +39,7 @@
+ /*
+ * A set specialized functions dealing with the CHOICE type.
+ */
+-asn_struct_free_f CHOICE_free;
++asn_struct_free_f CHOICE_free;
+ asn_struct_print_f CHOICE_print;
+ asn_constr_check_f CHOICE_constraint;
+ ber_type_decoder_f CHOICE_decode_ber;
+@@ -50,7 +50,8 @@
+ per_type_encoder_f CHOICE_encode_uper;
+ per_type_decoder_f CHOICE_decode_aper;
+ per_type_encoder_f CHOICE_encode_aper;
+-asn_outmost_tag_f CHOICE_outmost_tag;
++type_compare_f CHOICE_compare;
++asn_outmost_tag_f CHOICE_outmost_tag;
+
+ #ifdef __cplusplus
+ }
+--- skeletons/constr_SEQUENCE.c 2015-12-08 14:39:33.346543533 +0100
++++ skeletons/constr_SEQUENCE.c 2015-12-08 10:39:52.442558000 +0100
+@@ -1761,3 +1761,66 @@
+
+ _ASN_ENCODED_OK(er);
+ }
++
++asn_comp_rval_t * SEQUENCE_compare(asn_TYPE_descriptor_t *td1, void *sptr1, asn_TYPE_descriptor_t *td2, void *sptr2) {
++ int edx;
++ int ret;
++ asn_comp_rval_t *res = NULL;
++ asn_comp_rval_t *res2 = NULL;
++
++ COMPARE_CHECK_ARGS(td1, td2, sptr1, sptr2, res)
++
++ if (td1->elements_count != td2->elements_count) {
++ res = calloc(1, sizeof(asn_comp_rval_t));
++ res->name = td1->name;
++ res->structure1 = sptr1;
++ res->structure2 = sptr2;
++ res->err_code = COMPARE_ERR_CODE_COLLECTION_NUM_ELEMENTS;
++ return res;
++ }
++
++ for(edx = 0; edx < td1->elements_count; edx++) {
++ asn_TYPE_member_t *elm1 = &td1->elements[edx];
++ asn_TYPE_member_t *elm2 = &td1->elements[edx];
++ const void *memb_ptr1;
++ const void *memb_ptr2;
++
++ if(elm1->flags & ATF_POINTER) {
++ memb_ptr1 = *(const void * const *)((const char *)sptr1 + elm1->memb_offset);
++ memb_ptr2 = *(const void * const *)((const char *)sptr2 + elm2->memb_offset);
++ if((!memb_ptr1) && (!memb_ptr2)) {
++ if(elm1->optional) continue;
++ }
++ if ((!memb_ptr1) || (!memb_ptr2)) {
++ res2 = calloc(1, sizeof(asn_comp_rval_t));
++ res2->name = elm1->name;
++ res2->structure1 = memb_ptr1;
++ res2->structure2 = memb_ptr2;
++ res->err_code = COMPARE_ERR_CODE_VALUE_NULL;
++ if (NULL == res) {
++ res = res2;
++ } else {
++ res2->next = res;
++ res = res2;
++ }
++ res2 = NULL;
++ }
++ } else {
++ memb_ptr1 = (const void *)((const char *)sptr1 + elm1->memb_offset);
++ memb_ptr2 = (const void *)((const char *)sptr2 + elm2->memb_offset);
++ }
++
++ /* Compare the member itself */
++ res2 = elm1->type->compare(elm1->type, memb_ptr1, elm2->type, memb_ptr2);
++ if(res2) {
++ if (NULL == res) {
++ res = res2;
++ } else {
++ res2->next = res;
++ res = res2;
++ }
++ res2 = NULL;
++ }
++ }
++ return res;
++}
+--- skeletons/constr_SEQUENCE.h 2015-12-08 14:39:33.346543533 +0100
++++ skeletons/constr_SEQUENCE.h 2015-11-26 14:48:14.123616000 +0100
+@@ -54,6 +54,7 @@
+ per_type_encoder_f SEQUENCE_encode_uper;
+ per_type_decoder_f SEQUENCE_decode_aper;
+ per_type_encoder_f SEQUENCE_encode_aper;
++type_compare_f SEQUENCE_compare;
+
+ #ifdef __cplusplus
+ }
+--- skeletons/constr_SEQUENCE_OF.h 2015-12-08 14:39:33.342543533 +0100
++++ skeletons/constr_SEQUENCE_OF.h 2015-11-26 15:05:25.399615000 +0100
+@@ -22,7 +22,8 @@
+ #define SEQUENCE_OF_decode_ber SET_OF_decode_ber
+ #define SEQUENCE_OF_decode_xer SET_OF_decode_xer
+ #define SEQUENCE_OF_decode_uper SET_OF_decode_uper
+-#define SEQUENCE_OF_decode_aper SET_OF_decode_aper
++#define SEQUENCE_OF_decode_aper SET_OF_decode_aper
++#define SEQUENCE_OF_compare SET_OF_compare
+ der_type_encoder_f SEQUENCE_OF_encode_der;
+ xer_type_encoder_f SEQUENCE_OF_encode_xer;
+ per_type_encoder_f SEQUENCE_OF_encode_uper;
+--- skeletons/constr_SET.c 2015-12-08 14:39:33.342543533 +0100
++++ skeletons/constr_SET.c 2015-12-08 10:40:35.066558000 +0100
+@@ -1108,7 +1108,7 @@
+ }
+ }
+
+-int
++long
+ SET_constraint(asn_TYPE_descriptor_t *td, const void *sptr,
+ asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+ int edx;
+@@ -1159,3 +1159,58 @@
+
+ return 0;
+ }
++
++asn_comp_rval_t *
++SET_compare(asn_TYPE_descriptor_t *td1, void *sptr1, asn_TYPE_descriptor_t *td2, void *sptr2)
++{
++ int edx;
++ asn_comp_rval_t *res = NULL;
++ asn_comp_rval_t *res2 = NULL;
++
++ COMPARE_CHECK_ARGS(td1, td2, sptr1, sptr2, res)
++
++ if (td1->elements_count != td2->elements_count) {
++ res = calloc(1, sizeof(asn_comp_rval_t));
++ res->name = td1->name;
++ res->structure1 = sptr1;
++ res->structure2 = sptr2;
++ res->err_code = COMPARE_ERR_CODE_COLLECTION_NUM_ELEMENTS;
++ return res;
++ }
++
++ for(edx = 0; edx < td1->elements_count; edx++) {
++ asn_TYPE_member_t *elm1 = &td1->elements[edx];
++ asn_TYPE_member_t *elm2 = &td2->elements[edx];
++ const void *memb_ptr1;
++ const void *memb_ptr2;
++
++ if(elm1->flags & ATF_POINTER) {
++ memb_ptr1 = *(const void * const *)((const char *)sptr1 + elm1->memb_offset);
++ memb_ptr2 = *(const void * const *)((const char *)sptr2 + elm2->memb_offset);
++ if(!memb_ptr1) {
++ if(elm1->optional)
++ continue;
++ res = calloc(1, sizeof(asn_comp_rval_t));
++ res->name = td1->name;
++ res->structure1 = sptr1;
++ res->structure2 = sptr2;
++ res->err_code = COMPARE_ERR_CODE_SET_MALFORMED;
++ return res;
++ }
++ } else {
++ memb_ptr1 = (const void *)((const char *)sptr1 + elm1->memb_offset);
++ memb_ptr2 = (const void *)((const char *)sptr2 + elm2->memb_offset);
++ }
++ res2 = elm1->type->compare(elm1->type, memb_ptr1, elm2->type, memb_ptr2);
++ if(res2) {
++ if (NULL == res) {
++ res = res2;
++ } else {
++ res2->next = res;
++ res = res2;
++ }
++ res2 = NULL;
++ }
++ }
++ return res;
++}
+--- skeletons/constr_SET.h 2015-12-08 14:39:33.342543533 +0100
++++ skeletons/constr_SET.h 2015-11-26 14:49:09.243616000 +0100
+@@ -56,6 +56,7 @@
+ per_type_decoder_f SET_decode_aper;
+ per_type_encoder_f SET_encode_uper;
+ per_type_encoder_f SET_encode_aper;
++type_compare_f SET_compare;
+
+ /***********************
+ * Some handy helpers. *
+--- skeletons/constr_SET_OF.c 2015-12-08 14:39:33.338543533 +0100
++++ skeletons/constr_SET_OF.c 2015-12-08 10:45:54.466557000 +0100
+@@ -1039,3 +1039,55 @@
+ rv.consumed = 0;
+ return rv;
+ }
++
++asn_comp_rval_t *
++SET_OF_compare(asn_TYPE_descriptor_t *td1, void *sptr1, asn_TYPE_descriptor_t *td2, void *sptr2)
++{
++ asn_TYPE_member_t *elm1 = td1->elements;
++ asn_TYPE_member_t *elm2 = td2->elements;
++ const asn_anonymous_set_ *list1 = _A_CSET_FROM_VOID(sptr1);
++ const asn_anonymous_set_ *list2 = _A_CSET_FROM_VOID(sptr2);
++ int ret;
++ int i;
++ asn_comp_rval_t *res = NULL;
++ asn_comp_rval_t *res2 = NULL;
++
++ COMPARE_CHECK_ARGS(td1, td2, sptr1, sptr2, res)
++
++ if (td1->elements_count != td2->elements_count) {
++ res = calloc(1, sizeof(asn_comp_rval_t));
++ res->name = td1->name;
++ res->structure1 = sptr1;
++ res->structure2 = sptr2;
++ res->err_code = COMPARE_ERR_CODE_COLLECTION_NUM_ELEMENTS;
++ return res;
++ }
++
++
++ if (list1->count != list2->count ) {
++ res = calloc(1, sizeof(asn_comp_rval_t));
++ res->name = td1->name;
++ res->structure1 = sptr1;
++ res->structure2 = sptr2;
++ res->err_code = COMPARE_ERR_CODE_COLLECTION_NUM_ELEMENTS;
++ return res;
++ }
++
++ for(i = 0; i < list1->count; i++) {
++ const void *memb_ptr1 = list1->array[i];
++ const void *memb_ptr2 = list2->array[i];
++ if ((!memb_ptr1) & (!memb_ptr2)) continue;
++
++ res2 = elm1->type->compare(elm1->type, memb_ptr1, elm2->type, memb_ptr2);
++ if(res2) {
++ if (NULL == res) {
++ res = res2;
++ } else {
++ res2->next = res;
++ res = res2;
++ }
++ res2 = NULL;
++ }
++ }
++ return res;
++}
+--- skeletons/constr_SET_OF.h 2015-12-08 14:39:33.338543533 +0100
++++ skeletons/constr_SET_OF.h 2015-11-26 14:48:45.067616000 +0100
+@@ -36,6 +36,7 @@
+ per_type_encoder_f SET_OF_encode_uper;
+ per_type_decoder_f SET_OF_decode_aper;
+ per_type_encoder_f SET_OF_encode_aper;
++type_compare_f SET_OF_compare;
+
+ #ifdef __cplusplus
+ }
+--- skeletons/constr_TYPE.h 2015-12-08 14:39:33.338543533 +0100
++++ skeletons/constr_TYPE.h 2015-11-26 15:28:05.495613000 +0100
+@@ -41,7 +41,8 @@
+ #include /* Encoder into XER (XML, text) */
+ #include /* Packet Encoding Rules decoder */
+ #include /* Packet Encoding Rules encoder */
+-#include /* Subtype constraints support */
++#include /* Subtype constraints support */
++#include /* Comparison */
+
+ /*
+ * Free the structure according to its specification.
+@@ -101,6 +102,7 @@
+ per_type_encoder_f *uper_encoder; /* Unaligned PER encoder */
+ per_type_decoder_f *aper_decoder; /* Aligned PER decoder */
+ per_type_encoder_f *aper_encoder; /* Aligned PER encoder */
++ type_compare_f *compare; /* Comparison between 2 instances */
+
+ /***********************************************************************
+ * Internally useful members. Not to be used by applications directly. *
+--- skeletons/ENUMERATED.c 2015-12-08 14:39:33.342543533 +0100
++++ skeletons/ENUMERATED.c 2015-12-08 10:40:55.986558000 +0100
+@@ -27,7 +27,8 @@
+ ENUMERATED_decode_uper, /* Unaligned PER decoder */
+ ENUMERATED_encode_uper, /* Unaligned PER encoder */
+ ENUMERATED_decode_aper, /* Aligned PER decoder */
+- ENUMERATED_encode_aper, /* Aligned PER encoder */
++ ENUMERATED_encode_aper, /* Aligned PER encoder */
++ ENUMERATED_compare,
+ 0, /* Use generic outmost tag fetcher */
+ asn_DEF_ENUMERATED_tags,
+ sizeof(asn_DEF_ENUMERATED_tags) / sizeof(asn_DEF_ENUMERATED_tags[0]),
+@@ -103,3 +104,22 @@
+
+ return NativeEnumerated_encode_aper(td, constraints, &value, po);
+ }
++
++asn_comp_rval_t *
++ENUMERATED_compare(asn_TYPE_descriptor_t *td1, void *sptr1,
++ asn_TYPE_descriptor_t *td2, void *sptr2) {
++ ENUMERATED_t *st1 = (ENUMERATED_t *)sptr1;
++ ENUMERATED_t *st2 = (ENUMERATED_t *)sptr2;
++ asn_comp_rval_t *res = NULL;
++
++ COMPARE_CHECK_ARGS(td1, td2, sptr1, sptr2, res)
++
++ if (*st1 == *st2) return NULL;
++ res = calloc(1, sizeof(asn_comp_rval_t));
++ res->name = td1->name;
++ res->structure1 = sptr1;
++ res->structure2 = sptr2;
++ res->err_code = COMPARE_ERR_CODE_NO_MATCH;
++ return res;
++}
++
+--- skeletons/ENUMERATED.h 2015-12-08 14:39:33.342543533 +0100
++++ skeletons/ENUMERATED.h 2015-11-26 12:46:35.523623000 +0100
+@@ -19,6 +19,7 @@
+ per_type_encoder_f ENUMERATED_encode_uper;
+ per_type_decoder_f ENUMERATED_decode_aper;
+ per_type_encoder_f ENUMERATED_encode_aper;
++type_compare_f ENUMERATED_compare;
+
+ #ifdef __cplusplus
+ }
+--- skeletons/file-dependencies 2015-12-08 14:39:12.678543554 +0100
++++ skeletons/file-dependencies 2015-12-07 15:34:40.454629000 +0100
+@@ -39,12 +39,13 @@
+ constr_SEQUENCE.h constr_SEQUENCE.c
+ constr_SEQUENCE_OF.h constr_SEQUENCE_OF.c asn_SEQUENCE_OF.h constr_SET_OF.h
+ constr_SET.h constr_SET.c
+-constr_SET_OF.h constr_SET_OF.c asn_SET_OF.h
++constr_SET_OF.h constr_SET_OF.c asn_SET_OF.h compare.h
+
+ COMMON-FILES: # THIS IS A SPECIAL SECTION
+-asn_application.h # Applications should include this file
++asn_application.h # Applications should include this file
+ asn_system.h # Platform-dependent types
+-asn_codecs.h # Return types of encoders and decoders
++asn_codecs.h # Return types of encoders and decoders
++asn_compare.h # Return type of compare
+ asn_internal.h # Internal stuff
+ OCTET_STRING.h OCTET_STRING.c # This one is used too widely
+ BIT_STRING.h BIT_STRING.c # This one is necessary for the above one
+--- skeletons/GeneralizedTime.c 2015-12-08 14:39:33.350543533 +0100
++++ skeletons/GeneralizedTime.c 2015-11-26 15:09:03.899615000 +0100
+@@ -168,7 +168,8 @@
+ OCTET_STRING_decode_uper,
+ OCTET_STRING_encode_uper,
+ OCTET_STRING_decode_aper,
+- OCTET_STRING_encode_aper,
++ OCTET_STRING_encode_aper,
++ OCTET_STRING_compare,
+ 0, /* Use generic outmost tag fetcher */
+ asn_DEF_GeneralizedTime_tags,
+ sizeof(asn_DEF_GeneralizedTime_tags)
+--- skeletons/GeneralString.c 2015-12-08 14:39:33.342543533 +0100
++++ skeletons/GeneralString.c 2015-11-26 14:50:11.843616000 +0100
+@@ -25,7 +25,8 @@
+ OCTET_STRING_decode_uper, /* Implemented in terms of OCTET STRING */
+ OCTET_STRING_encode_uper,
+ OCTET_STRING_decode_aper,
+- OCTET_STRING_encode_aper,
++ OCTET_STRING_encode_aper,
++ OCTET_STRING_compare,
+ 0, /* Use generic outmost tag fetcher */
+ asn_DEF_GeneralString_tags,
+ sizeof(asn_DEF_GeneralString_tags)
+--- skeletons/GraphicString.c 2015-12-08 14:39:33.350543533 +0100
++++ skeletons/GraphicString.c 2015-11-26 15:33:33.255613000 +0100
+@@ -25,7 +25,8 @@
+ OCTET_STRING_decode_uper, /* Implemented in terms of OCTET STRING */
+ OCTET_STRING_encode_uper,
+ OCTET_STRING_decode_aper,
+- OCTET_STRING_encode_aper,
++ OCTET_STRING_encode_aper,
++ OCTET_STRING_compare,
+ 0, /* Use generic outmost tag fetcher */
+ asn_DEF_GraphicString_tags,
+ sizeof(asn_DEF_GraphicString_tags)
+--- skeletons/IA5String.c 2015-12-08 14:39:33.342543533 +0100
++++ skeletons/IA5String.c 2015-11-26 14:50:44.219616000 +0100
+@@ -31,6 +31,7 @@
+ OCTET_STRING_encode_uper,
+ OCTET_STRING_decode_aper,
+ OCTET_STRING_encode_aper,
++ OCTET_STRING_compare,
+ 0, /* Use generic outmost tag fetcher */
+ asn_DEF_IA5String_tags,
+ sizeof(asn_DEF_IA5String_tags)
+--- skeletons/INTEGER.c 2015-12-08 14:39:33.346543533 +0100
++++ skeletons/INTEGER.c 2015-12-08 10:41:08.526558000 +0100
+@@ -35,6 +35,7 @@
+ INTEGER_decode_aper,
+ INTEGER_encode_aper,
+ #endif /* ASN_DISABLE_PER_SUPPORT */
++ INTEGER_compare,
+ 0, /* Use generic outmost tag fetcher */
+ asn_DEF_INTEGER_tags,
+ sizeof(asn_DEF_INTEGER_tags) / sizeof(asn_DEF_INTEGER_tags[0]),
+@@ -1501,3 +1502,30 @@
+ }
+
+
++asn_comp_rval_t *
++INTEGER_compare(asn_TYPE_descriptor_t *td1, void *sptr1,
++ asn_TYPE_descriptor_t *td2, void *sptr2) {
++ INTEGER_t *st1 = (INTEGER_t *)sptr1;
++ INTEGER_t *st2 = (INTEGER_t *)sptr2;
++ asn_comp_rval_t *res = NULL;
++
++ COMPARE_CHECK_ARGS(td1, td2, sptr1, sptr2, res)
++
++ if (st1->size != st2->size) {
++ res = calloc(1, sizeof(asn_comp_rval_t));
++ res->name = td1->name;
++ res->structure1 = sptr1;
++ res->structure2 = sptr2;
++ res->err_code = COMPARE_ERR_CODE_NO_MATCH;
++ return res;
++ }
++ if (0 != memcmp(st1->buf, st2->buf, st1->size)) {
++ res = calloc(1, sizeof(asn_comp_rval_t));
++ res->name = td1->name;
++ res->structure1 = sptr1;
++ res->structure2 = sptr2;
++ res->err_code = COMPARE_ERR_CODE_NO_MATCH;
++ return res;
++ }
++ return NULL;
++}
+--- skeletons/INTEGER.h 2015-12-08 14:39:33.346543533 +0100
++++ skeletons/INTEGER.h 2015-11-26 12:50:41.551623000 +0100
+@@ -43,6 +43,7 @@
+ per_type_encoder_f INTEGER_encode_uper;
+ per_type_decoder_f INTEGER_decode_aper;
+ per_type_encoder_f INTEGER_encode_aper;
++type_compare_f INTEGER_compare;
+
+ /***********************************
+ * Some handy conversion routines. *
+--- skeletons/ISO646String.c 2015-12-08 14:39:33.342543533 +0100
++++ skeletons/ISO646String.c 2015-11-26 12:55:48.327623000 +0100
+@@ -30,7 +30,8 @@
+ OCTET_STRING_decode_uper,
+ OCTET_STRING_encode_uper,
+ OCTET_STRING_decode_aper,
+- OCTET_STRING_encode_aper,
++ OCTET_STRING_encode_aper,
++ OCTET_STRING_compare,
+ 0, /* Use generic outmost tag fetcher */
+ asn_DEF_ISO646String_tags,
+ sizeof(asn_DEF_ISO646String_tags)
+--- skeletons/Makefile.am 2015-12-08 14:39:12.666543554 +0100
++++ skeletons/Makefile.am 2015-12-07 15:54:00.150628000 +0100
+@@ -46,11 +46,11 @@
+ asn_SET_OF.c asn_SET_OF.h \
+ asn_application.h asn_codecs.h \
+ asn_codecs_prim.c asn_codecs_prim.h \
+- asn_internal.h asn_system.h \
++ asn_internal.h asn_system.h asn_compare.h \
+ ber_decoder.c ber_decoder.h \
+ ber_tlv_length.c ber_tlv_length.h \
+- ber_tlv_tag.c ber_tlv_tag.h \
+- constr_CHOICE.c constr_CHOICE.h \
++ ber_tlv_tag.c ber_tlv_tag.h compare.h \
++ comparison.h constr_CHOICE.c constr_CHOICE.h \
+ constr_SEQUENCE.c constr_SEQUENCE.h \
+ constr_SEQUENCE_OF.c constr_SEQUENCE_OF.h \
+ constr_SET.c constr_SET.h \
+--- skeletons/NativeEnumerated.c 2015-12-08 14:39:33.342543533 +0100
++++ skeletons/NativeEnumerated.c 2015-12-08 10:41:17.662558000 +0100
+@@ -31,7 +31,8 @@
+ NativeEnumerated_decode_uper,
+ NativeEnumerated_encode_uper,
+ NativeEnumerated_decode_aper,
+- NativeEnumerated_encode_aper,
++ NativeEnumerated_encode_aper,
++ NativeEnumerated_compare,
+ 0, /* Use generic outmost tag fetcher */
+ asn_DEF_NativeEnumerated_tags,
+ sizeof(asn_DEF_NativeEnumerated_tags) / sizeof(asn_DEF_NativeEnumerated_tags[0]),
+@@ -335,3 +336,22 @@
+
+ _ASN_ENCODED_OK(er);
+ }
++
++asn_comp_rval_t *
++NativeEnumerated_compare(asn_TYPE_descriptor_t *td1, void *sptr1,
++ asn_TYPE_descriptor_t *td2, void *sptr2) {
++ const asn_INTEGER_enum_map_t *a = sptr1;
++ const asn_INTEGER_enum_map_t *b = sptr2;
++ asn_comp_rval_t *res = NULL;
++
++ COMPARE_CHECK_ARGS(td1, td2, sptr1, sptr2, res)
++
++ if(a->nat_value == b->nat_value)
++ return NULL;
++ res = calloc(1, sizeof(asn_comp_rval_t));
++ res->name = td1->name;
++ res->structure1 = sptr1;
++ res->structure2 = sptr2;
++ res->err_code = COMPARE_ERR_CODE_NO_MATCH;
++ return res;
++}
+--- skeletons/NativeEnumerated.h 2015-12-08 14:39:33.342543533 +0100
++++ skeletons/NativeEnumerated.h 2015-11-26 14:51:43.315616000 +0100
+@@ -26,6 +26,7 @@
+ per_type_encoder_f NativeEnumerated_encode_uper;
+ per_type_decoder_f NativeEnumerated_decode_aper;
+ per_type_encoder_f NativeEnumerated_encode_aper;
++type_compare_f NativeEnumerated_compare;
+
+ #ifdef __cplusplus
+ }
+--- skeletons/NativeInteger.c 2015-12-08 14:39:33.346543533 +0100
++++ skeletons/NativeInteger.c 2015-12-08 10:41:24.550558000 +0100
+@@ -32,7 +32,8 @@
+ NativeInteger_decode_uper, /* Unaligned PER decoder */
+ NativeInteger_encode_uper, /* Unaligned PER encoder */
+ NativeInteger_decode_aper, /* Aligned PER decoder */
+- NativeInteger_encode_aper, /* Aligned PER encoder */
++ NativeInteger_encode_aper, /* Aligned PER encoder */
++ NativeInteger_compare,
+ 0, /* Use generic outmost tag fetcher */
+ asn_DEF_NativeInteger_tags,
+ sizeof(asn_DEF_NativeInteger_tags) / sizeof(asn_DEF_NativeInteger_tags[0]),
+@@ -410,3 +411,21 @@
+ }
+ }
+
++
++asn_comp_rval_t *
++NativeInteger_compare(asn_TYPE_descriptor_t *td1, void *sptr1,
++ asn_TYPE_descriptor_t *td2, void *sptr2) {
++ const long *native1 = (const long *)sptr1;
++ const long *native2 = (const long *)sptr2;
++ asn_comp_rval_t *res = NULL;
++
++ COMPARE_CHECK_ARGS(td1, td2, sptr1, sptr2, res)
++
++ if (*native1 == *native2) return NULL;
++ res = calloc(1, sizeof(asn_comp_rval_t));
++ res->name = td1->name;
++ res->structure1 = sptr1;
++ res->structure2 = sptr2;
++ res->err_code = COMPARE_ERR_CODE_NO_MATCH;
++ return res;
++}
+--- skeletons/NativeInteger.h 2015-12-08 14:39:33.346543533 +0100
++++ skeletons/NativeInteger.h 2015-11-26 14:52:13.931616000 +0100
+@@ -31,6 +31,7 @@
+ per_type_encoder_f NativeInteger_encode_uper;
+ per_type_decoder_f NativeInteger_decode_aper;
+ per_type_encoder_f NativeInteger_encode_aper;
++type_compare_f NativeInteger_compare;
+
+ #ifdef __cplusplus
+ }
+--- skeletons/NativeReal.c 2015-12-08 14:39:33.350543533 +0100
++++ skeletons/NativeReal.c 2015-12-08 10:41:32.666558000 +0100
+@@ -33,7 +33,8 @@
+ NativeReal_decode_uper,
+ NativeReal_encode_uper,
+ NativeReal_decode_aper,
+- NativeReal_encode_aper,
++ NativeReal_encode_aper,
++ NativeReal_compare,
+ 0, /* Use generic outmost tag fetcher */
+ asn_DEF_NativeReal_tags,
+ sizeof(asn_DEF_NativeReal_tags) / sizeof(asn_DEF_NativeReal_tags[0]),
+@@ -405,3 +406,30 @@
+ }
+ }
+
++asn_comp_rval_t *
++NativeReal_compare(asn_TYPE_descriptor_t *td1, void *sptr1,
++ asn_TYPE_descriptor_t *td2, void *sptr2) {
++ REAL_t *st1 = (REAL_t *)sptr1;
++ REAL_t *st2 = (REAL_t *)sptr2;
++ asn_comp_rval_t *res = NULL;
++
++ COMPARE_CHECK_ARGS(td1, td2, sptr1, sptr2, res)
++
++ if (st1->size != st2->size) {
++ res = calloc(1, sizeof(asn_comp_rval_t));
++ res->name = td1->name;
++ res->structure1 = sptr1;
++ res->structure2 = sptr2;
++ res->err_code = COMPARE_ERR_CODE_NO_MATCH;
++ return res;
++ }
++ if (0 != memcmp(st1->buf, st2->buf, st1->size)) {
++ res = calloc(1, sizeof(asn_comp_rval_t));
++ res->name = td1->name;
++ res->structure1 = sptr1;
++ res->structure2 = sptr2;
++ res->err_code = COMPARE_ERR_CODE_NO_MATCH;
++ return res;
++ }
++ return NULL;
++}
+--- skeletons/NativeReal.h 2015-12-08 14:39:33.350543533 +0100
++++ skeletons/NativeReal.h 2015-11-26 14:31:12.631617000 +0100
+@@ -29,6 +29,7 @@
+ per_type_encoder_f NativeReal_encode_uper;
+ per_type_decoder_f NativeReal_decode_aper;
+ per_type_encoder_f NativeReal_encode_aper;
++type_compare_f NativeReal_compare;
+
+ #ifdef __cplusplus
+ }
+--- skeletons/NULL.c 2015-12-08 14:39:33.338543533 +0100
++++ skeletons/NULL.c 2015-12-07 10:49:05.178647000 +0100
+@@ -26,7 +26,8 @@
+ NULL_decode_uper, /* Unaligned PER decoder */
+ NULL_encode_uper, /* Unaligned PER encoder */
+ NULL_decode_aper, /* Aligned PER decoder */
+- NULL_encode_aper, /* Aligned PER encoder */
++ NULL_encode_aper, /* Aligned PER encoder */
++ NULL_compare,
+ 0, /* Use generic outmost tag fetcher */
+ asn_DEF_NULL_tags,
+ sizeof(asn_DEF_NULL_tags) / sizeof(asn_DEF_NULL_tags[0]),
+@@ -192,3 +193,10 @@
+ er.encoded = 0;
+ _ASN_ENCODED_OK(er);
+ }
++
++asn_comp_rval_t *
++NULL_compare(asn_TYPE_descriptor_t *td1, void *sptr1,
++ asn_TYPE_descriptor_t *td2, void *sptr2) {
++
++ return NULL;
++}
+--- skeletons/NULL.h 2015-12-08 14:39:33.338543533 +0100
++++ skeletons/NULL.h 2015-11-26 14:53:03.875616000 +0100
+@@ -27,6 +27,7 @@
+ per_type_encoder_f NULL_encode_uper;
+ per_type_decoder_f NULL_decode_aper;
+ per_type_encoder_f NULL_encode_aper;
++type_compare_f NULL_compare;
+
+ #ifdef __cplusplus
+ }
+--- skeletons/NumericString.c 2015-12-08 14:39:33.338543533 +0100
++++ skeletons/NumericString.c 2015-11-26 14:40:39.407616000 +0100
+@@ -50,7 +50,8 @@
+ OCTET_STRING_decode_uper,
+ OCTET_STRING_encode_uper,
+ OCTET_STRING_decode_aper,
+- OCTET_STRING_encode_aper,
++ OCTET_STRING_encode_aper,
++ OCTET_STRING_compare,
+ 0, /* Use generic outmost tag fetcher */
+ asn_DEF_NumericString_tags,
+ sizeof(asn_DEF_NumericString_tags)
+--- skeletons/ObjectDescriptor.c 2015-12-08 14:39:33.338543533 +0100
++++ skeletons/ObjectDescriptor.c 2015-11-26 14:55:46.227615000 +0100
+@@ -25,7 +25,8 @@
+ OCTET_STRING_decode_uper,
+ OCTET_STRING_encode_uper,
+ OCTET_STRING_decode_aper,
+- OCTET_STRING_encode_aper,
++ OCTET_STRING_encode_aper,
++ OCTET_STRING_compare,
+ 0, /* Use generic outmost tag fetcher */
+ asn_DEF_ObjectDescriptor_tags,
+ sizeof(asn_DEF_ObjectDescriptor_tags)
+--- skeletons/OBJECT_IDENTIFIER.c 2015-12-08 14:39:33.342543533 +0100
++++ skeletons/OBJECT_IDENTIFIER.c 2015-11-26 14:55:13.311615000 +0100
+@@ -28,7 +28,8 @@
+ OCTET_STRING_decode_uper,
+ OCTET_STRING_encode_uper,
+ OCTET_STRING_decode_aper,
+- OCTET_STRING_encode_aper,
++ OCTET_STRING_encode_aper,
++ OCTET_STRING_compare,
+ 0, /* Use generic outmost tag fetcher */
+ asn_DEF_OBJECT_IDENTIFIER_tags,
+ sizeof(asn_DEF_OBJECT_IDENTIFIER_tags)
+--- skeletons/OCTET_STRING.c 2015-12-08 14:39:44.554543521 +0100
++++ skeletons/OCTET_STRING.c 2015-12-08 10:41:42.838558000 +0100
+@@ -37,7 +37,8 @@
+ OCTET_STRING_decode_uper, /* Unaligned PER decoder */
+ OCTET_STRING_encode_uper, /* Unaligned PER encoder */
+ OCTET_STRING_decode_aper, /* Aligned PER decoder */
+- OCTET_STRING_encode_aper, /* Aligned PER encoder */
++ OCTET_STRING_encode_aper, /* Aligned PER encoder */
++ OCTET_STRING_compare,
+ 0, /* Use generic outmost tag fetcher */
+ asn_DEF_OCTET_STRING_tags,
+ sizeof(asn_DEF_OCTET_STRING_tags)
+@@ -2160,3 +2161,30 @@
+ return st;
+ }
+
++asn_comp_rval_t *
++OCTET_STRING_compare(asn_TYPE_descriptor_t *td1,
++ void *sptr1, asn_TYPE_descriptor_t *td2, void *sptr2) {
++ OCTET_STRING_t *st1 = (OCTET_STRING_t *)sptr1;
++ OCTET_STRING_t *st2 = (OCTET_STRING_t *)sptr2;
++ asn_comp_rval_t *res = NULL;
++
++ COMPARE_CHECK_ARGS(td1, td2, sptr1, sptr2, res)
++
++ if (st1->size != st2->size) {
++ res = calloc(1, sizeof(asn_comp_rval_t));
++ res->name = td1->name;
++ res->structure1 = sptr1;
++ res->structure2 = sptr2;
++ res->err_code = COMPARE_ERR_CODE_NO_MATCH;
++ return res;
++ }
++ if (0 != memcmp(st1->buf, st2->buf, st1->size)) {
++ res = calloc(1, sizeof(asn_comp_rval_t));
++ res->name = td1->name;
++ res->structure1 = sptr1;
++ res->structure2 = sptr2;
++ res->err_code = COMPARE_ERR_CODE_NO_MATCH;
++ return res;
++ }
++ return NULL;
++}
+--- skeletons/OCTET_STRING.h 2015-12-08 14:39:33.350543533 +0100
++++ skeletons/OCTET_STRING.h 2015-11-26 12:56:15.259623000 +0100
+@@ -34,6 +34,7 @@
+ per_type_encoder_f OCTET_STRING_encode_uper;
+ per_type_decoder_f OCTET_STRING_decode_aper;
+ per_type_encoder_f OCTET_STRING_encode_aper;
++type_compare_f OCTET_STRING_compare;
+
+ /******************************
+ * Handy conversion routines. *
+--- skeletons/PrintableString.c 2015-12-08 14:39:33.338543533 +0100
++++ skeletons/PrintableString.c 2015-11-26 14:56:09.787615000 +0100
+@@ -60,7 +60,8 @@
+ OCTET_STRING_decode_uper,
+ OCTET_STRING_encode_uper,
+ OCTET_STRING_decode_aper,
+- OCTET_STRING_encode_aper,
++ OCTET_STRING_encode_aper,
++ OCTET_STRING_compare,
+ 0, /* Use generic outmost tag fetcher */
+ asn_DEF_PrintableString_tags,
+ sizeof(asn_DEF_PrintableString_tags)
+--- skeletons/REAL.c 2015-12-08 14:39:33.350543533 +0100
++++ skeletons/REAL.c 2015-12-08 10:41:55.178558000 +0100
+@@ -46,7 +46,8 @@
+ REAL_decode_uper,
+ REAL_encode_uper,
+ REAL_decode_aper,
+- REAL_encode_aper,
++ REAL_encode_aper,
++ REAL_compare,
+ 0, /* Use generic outmost tag fetcher */
+ asn_DEF_REAL_tags,
+ sizeof(asn_DEF_REAL_tags) / sizeof(asn_DEF_REAL_tags[0]),
+@@ -741,3 +742,32 @@
+
+ return 0;
+ }
++
++
++asn_comp_rval_t *
++REAL_compare(asn_TYPE_descriptor_t *td1, void *sptr1,
++ asn_TYPE_descriptor_t *td2, void *sptr2) {
++ REAL_t *st1 = (REAL_t *)sptr1;
++ REAL_t *st2 = (REAL_t *)sptr2;
++ asn_comp_rval_t *res = NULL;
++
++ COMPARE_CHECK_ARGS(td1, td2, sptr1, sptr2, res)
++
++ if (st1->size != st2->size) {
++ res = calloc(1, sizeof(asn_comp_rval_t));
++ res->name = td1->name;
++ res->structure1 = sptr1;
++ res->structure2 = sptr2;
++ res->err_code = COMPARE_ERR_CODE_NO_MATCH;
++ return res;
++ }
++ if (0 != memcmp(st1->buf, st2->buf, st1->size)) {
++ res = calloc(1, sizeof(asn_comp_rval_t));
++ res->name = td1->name;
++ res->structure1 = sptr1;
++ res->structure2 = sptr2;
++ res->err_code = COMPARE_ERR_CODE_NO_MATCH;
++ return res;
++ }
++ return NULL;
++}
+--- skeletons/REAL.h 2015-12-08 14:39:33.350543533 +0100
++++ skeletons/REAL.h 2015-11-26 13:00:46.183623000 +0100
+@@ -23,6 +23,7 @@
+ per_type_encoder_f REAL_encode_uper;
+ per_type_decoder_f REAL_decode_aper;
+ per_type_encoder_f REAL_encode_aper;
++type_compare_f REAL_compare;
+
+ /***********************************
+ * Some handy conversion routines. *
+--- skeletons/RELATIVE-OID.c 2015-12-08 14:39:33.338543533 +0100
++++ skeletons/RELATIVE-OID.c 2015-11-26 14:56:31.703615000 +0100
+@@ -29,7 +29,8 @@
+ OCTET_STRING_decode_uper,
+ OCTET_STRING_encode_uper,
+ OCTET_STRING_decode_aper,
+- OCTET_STRING_encode_aper,
++ OCTET_STRING_encode_aper,
++ OCTET_STRING_compare,
+ 0, /* Use generic outmost tag fetcher */
+ asn_DEF_RELATIVE_OID_tags,
+ sizeof(asn_DEF_RELATIVE_OID_tags)
+--- skeletons/T61String.c 2015-12-08 14:39:33.338543533 +0100
++++ skeletons/T61String.c 2015-11-26 14:57:07.235615000 +0100
+@@ -25,7 +25,8 @@
+ OCTET_STRING_decode_uper,
+ OCTET_STRING_encode_uper,
+ OCTET_STRING_decode_aper,
+- OCTET_STRING_encode_aper,
++ OCTET_STRING_encode_aper,
++ OCTET_STRING_compare,
+ 0, /* Use generic outmost tag fetcher */
+ asn_DEF_T61String_tags,
+ sizeof(asn_DEF_T61String_tags)
+--- skeletons/TeletexString.c 2015-12-08 14:39:33.338543533 +0100
++++ skeletons/TeletexString.c 2015-11-26 14:57:17.643615000 +0100
+@@ -25,7 +25,8 @@
+ OCTET_STRING_decode_uper,
+ OCTET_STRING_encode_uper,
+ OCTET_STRING_decode_aper,
+- OCTET_STRING_encode_aper,
++ OCTET_STRING_encode_aper,
++ OCTET_STRING_compare,
+ 0, /* Use generic outmost tag fetcher */
+ asn_DEF_TeletexString_tags,
+ sizeof(asn_DEF_TeletexString_tags)
+--- skeletons/UniversalString.c 2015-12-08 14:39:33.350543533 +0100
++++ skeletons/UniversalString.c 2015-11-26 14:57:29.015615000 +0100
+@@ -36,7 +36,8 @@
+ OCTET_STRING_decode_uper,
+ OCTET_STRING_encode_uper,
+ OCTET_STRING_decode_aper,
+- OCTET_STRING_encode_aper,
++ OCTET_STRING_encode_aper,
++ OCTET_STRING_compare,
+ 0, /* Use generic outmost tag fetcher */
+ asn_DEF_UniversalString_tags,
+ sizeof(asn_DEF_UniversalString_tags)
+--- skeletons/UTCTime.c 2015-12-08 14:39:33.350543533 +0100
++++ skeletons/UTCTime.c 2015-11-26 14:57:44.127615000 +0100
+@@ -41,7 +41,8 @@
+ OCTET_STRING_decode_uper,
+ OCTET_STRING_encode_uper,
+ OCTET_STRING_decode_aper,
+- OCTET_STRING_encode_aper,
++ OCTET_STRING_encode_aper,
++ OCTET_STRING_compare,
+ 0, /* Use generic outmost tag fetcher */
+ asn_DEF_UTCTime_tags,
+ sizeof(asn_DEF_UTCTime_tags)
+--- skeletons/UTF8String.c 2015-12-08 14:39:33.314543533 +0100
++++ skeletons/UTF8String.c 2015-11-26 14:06:54.563618000 +0100
+@@ -27,6 +27,7 @@
+ OCTET_STRING_encode_uper,
+ OCTET_STRING_decode_aper,
+ OCTET_STRING_encode_aper,
++ OCTET_STRING_compare,
+ 0, /* Use generic outmost tag fetcher */
+ asn_DEF_UTF8String_tags,
+ sizeof(asn_DEF_UTF8String_tags)
+--- skeletons/VideotexString.c 2015-12-08 14:39:33.342543533 +0100
++++ skeletons/VideotexString.c 2015-11-26 14:07:06.139618000 +0100
+@@ -25,7 +25,8 @@
+ OCTET_STRING_decode_uper, /* Implemented in terms of OCTET STRING */
+ OCTET_STRING_encode_uper,
+ OCTET_STRING_decode_aper,
+- OCTET_STRING_encode_aper,
++ OCTET_STRING_encode_aper,
++ OCTET_STRING_compare,
+ 0, /* Use generic outmost tag fetcher */
+ asn_DEF_VideotexString_tags,
+ sizeof(asn_DEF_VideotexString_tags)
+--- skeletons/VisibleString.c 2015-12-08 14:39:33.350543533 +0100
++++ skeletons/VisibleString.c 2015-11-26 14:07:15.283618000 +0100
+@@ -30,7 +30,8 @@
+ OCTET_STRING_decode_uper,
+ OCTET_STRING_encode_uper,
+ OCTET_STRING_decode_aper,
+- OCTET_STRING_encode_aper,
++ OCTET_STRING_encode_aper,
++ OCTET_STRING_compare,
+ 0, /* Use generic outmost tag fetcher */
+ asn_DEF_VisibleString_tags,
+ sizeof(asn_DEF_VisibleString_tags)
diff --git a/openair3/S1AP/MESSAGES/ASN1/asn1tostruct.py b/openair3/S1AP/MESSAGES/ASN1/asn1tostruct.py
index c298e8ae87..446266d6a3 100644
--- a/openair3/S1AP/MESSAGES/ASN1/asn1tostruct.py
+++ b/openair3/S1AP/MESSAGES/ASN1/asn1tostruct.py
@@ -36,7 +36,7 @@ def outputHeaderToFile(f, filename):
f.write("""/*******************************************************************************
Eurecom OpenAirInterface
- Copyright(c) 1999 - 2013 Eurecom
+ Copyright(c) 1999 - 2015 Eurecom
This program is free software; you can redistribute it and/or modify it
under the terms and conditions of the GNU General Public License,
@@ -250,20 +250,31 @@ for key in iesDefs:
asn1cStruct = re.sub('Item', 'List', asn1cStruct)
keylowerunderscore = re.sub('-', '_', key.lower())
firstlower = re.sub('Item', 'List', re.sub('enb', 'eNB', lowerFirstCamelWord(asn1cStruct)))
+
+ f.write("/* %s in iesDefs not in ieofielist.values() */\n" % (key))
f.write("/** \\brief Decode function for %s ies.\n" % (key))
if len(iesDefs[key]["ies"]) != 0:
f.write(" * \\param %s Pointer to ASN1 structure in which data will be stored\n" % (lowerFirstCamelWord(re.sub('-', '_', key))))
f.write(" * \\param any_p Pointer to the ANY value to decode.\n")
f.write(" **/\n")
f.write("int %s_decode_%s(\n" % (fileprefix, keylowerunderscore))
-
if len(iesDefs[key]["ies"]) != 0:
f.write(" %s_t *%s,\n" % (re.sub('-', '_', key), lowerFirstCamelWord(re.sub('-', '_', key))))
f.write(" ANY_t *any_p);\n\n")
+ f.write("/* %s in iesDefs not in ieofielist.values() */\n" % (key))
+ f.write("/** \\brief Compare function for %s ies.\n" % (key))
+ f.write(" * \\param %s Pointer to the ASN1 structure.\n" % (firstlower))
+ f.write(" * \\param %s Pointer to the ASN1 structure.\n" % (firstlower))
+ f.write(" **/\n")
+ f.write("asn_comp_rval_t * %s_compare_%s(\n" % (fileprefix, keylowerunderscore))
+ f.write(" %s_t *%s1,\n" % (re.sub('-', '_', key), lowerFirstCamelWord(re.sub('-', '_', key))))
+ f.write(" %s_t *%s2);\n\n" % (re.sub('-', '_', key), lowerFirstCamelWord(re.sub('-', '_', key))))
+
if len(iesDefs[key]["ies"]) == 0:
continue
+ f.write("/* %s in iesDefs not in ieofielist.values() */\n" % (key))
f.write("/** \\brief Encode function for %s ies.\n" % (key))
f.write(" * \\param %s Pointer to the ASN1 structure.\n" % (firstlower))
f.write(" * \\param %s Pointer to the IES structure.\n" % (lowerFirstCamelWord(re.sub('-', '_', key))))
@@ -272,16 +283,19 @@ for key in iesDefs:
f.write(" %s_t *%s,\n" % (asn1cStruct, firstlower))
f.write(" %s_t *%s);\n\n" % (re.sub('-', '_', key), lowerFirstCamelWord(re.sub('-', '_', key))))
+
for key in iesDefs:
if key not in ieofielist.values():
continue
asn1cStruct = re.sub('-', '_', re.sub('IEs', '', key))
asn1cStruct = re.sub('Item', 'List', asn1cStruct)
firstlower = re.sub('Item', 'List', re.sub('enb', 'eNB', lowerFirstCamelWord(asn1cStruct)))
+ f.write("/* %s in iesDefs in ieofielist.values() */\n" % (key))
f.write("/** \\brief Encode function for %s ies.\n" % (key))
f.write(" * \\param %s Pointer to the ASN1 structure.\n" % (firstlower))
f.write(" * \\param %s Pointer to the IES structure.\n" % (lowerFirstCamelWord(re.sub('-', '_', key))))
f.write(" **/\n")
+ f.write("/* %s in iesDefs in ieofielist.values() */\n" % (key))
f.write("int %s_encode_%s(\n" % (fileprefix, firstlower.lower()))
f.write(" %s_t *%s,\n" % (asn1cStruct, firstlower))
f.write(" %sIEs_t *%sIEs);\n\n" % (asn1cStruct, firstlower))
@@ -289,9 +303,19 @@ for key in iesDefs:
f.write(" * \\param any_p Pointer to the ANY value to decode.\n")
f.write(" * \\param callback Callback function called when any_p is successfully decoded.\n")
f.write(" **/\n")
+ f.write("/* %s in iesDefs in ieofielist.values() */\n" % (key))
f.write("int %s_decode_%s(\n" % (fileprefix, firstlower.lower()))
f.write(" %sIEs_t *%sIEs,\n" % (asn1cStruct, firstlower))
f.write(" %s_t *%s);\n\n" % (asn1cStruct, lowerFirstCamelWord(asn1cStruct)))
+ f.write("/** \\brief Compare function for %s ies.\n" % (key))
+ f.write(" * \\param %s Pointer to the IES structure.\n" % (firstlower))
+ f.write(" * \\param %s Pointer to the IES structure.\n" % (firstlower))
+ f.write(" **/\n")
+ f.write("asn_comp_rval_t * %s_compare_%s(\n" % (fileprefix, firstlower.lower()))
+ f.write(" %sIEs_t *%s1,\n" % (asn1cStruct, firstlower))
+ f.write(" %sIEs_t *%s2);\n\n" % (asn1cStruct, firstlower))
+
+
for key in iesDefs:
asn1cStruct = re.sub('-', '_', re.sub('IEs', '', key))
@@ -704,3 +728,170 @@ for (key, value) in iesDefs.items():
#f.write("cb_failed:\n")
#f.write(" return er;\n")
f.write("}\n\n")
+
+
+#Generate xer print functions
+f = open(outdir + fileprefix + '_compare.c', 'w')
+outputHeaderToFile(f, filename)
+f.write("#include \n")
+f.write("#include \n\n")
+f.write("#include \n#include \n\n")
+f.write("#include \"%s_common.h\"\n#include \"%s_ies_defs.h\"\n" % (fileprefix, fileprefix))
+f.write("#include \"%s-ProtocolIE-ID.h\"\n\n" % (fileprefix_first_upper))
+
+
+for key in iesDefs:
+ if key in ieofielist.values():
+ continue
+ structName = re.sub('ies', '', key)
+ asn1cStruct = re.sub('-', '_', re.sub('IEs', '', key))
+ asn1cStruct = re.sub('Item', 'List', asn1cStruct)
+ if asn1cStruct.rfind('_') == len(asn1cStruct) - 1:
+ asn1cStruct = asn1cStruct[:-1]
+ asn1cStructfirstlower = asn1cStruct[:1].lower() + asn1cStruct[1:]
+ firstwordlower = re.sub('Item', 'List', re.sub('enb', 'eNB', lowerFirstCamelWord(asn1cStruct)))
+
+ iesaccess = ""
+ if key not in ieofielist.values():
+ iesaccess = "%s_ies." % (firstwordlower)
+
+ keyName = re.sub('-', '_', key)
+ keyupperunderscore = keyName.upper()
+ # No IE to encode...
+ if len(iesDefs[key]["ies"]) == 0:
+ continue
+
+ f.write("asn_comp_rval_t * %s_compare_%s(\n" % (fileprefix, re.sub('-', '_', structName.lower())))
+ f.write(" %s_t *%s1,\n" % (re.sub('-', '_', key), lowerFirstCamelWord(re.sub('-', '_', key))))
+ f.write(" %s_t *%s2) {\n\n" % (re.sub('-', '_', key), lowerFirstCamelWord(re.sub('-', '_', key))))
+
+ f.write(" asn_comp_rval_t *rv = NULL;\n\n")
+ f.write(" asn_comp_rval_t *rv2 = NULL;\n\n")
+
+ f.write(" assert(%s1 != NULL);\n" % (lowerFirstCamelWord(re.sub('-', '_', key))));
+ f.write(" assert(%s2 != NULL);\n" % (lowerFirstCamelWord(re.sub('-', '_', key))));
+
+ loop = 0
+ for ie in iesDefs[key]["ies"]:
+ iename = re.sub('-', '_', re.sub('id-', '', ie[0]))
+ ienameunderscore = re.sub('-', '_', iename)
+ ienamefirstwordlower = lowerFirstCamelWord(iename)
+ ieupperunderscore = re.sub('-', '_', re.sub('id-', '', ie[0])).upper()
+ ietypeunderscore = re.sub('-', '_', ie[2])
+
+ if ie[3] != "mandatory":
+
+ loop = loop + 1
+ if loop == 1:
+ #f.write(" %s_IE_t *ie1 = NULL;\n" % (fileprefix_first_upper))
+ #f.write(" %s_IE_t *ie2 = NULL;\n" % (fileprefix_first_upper))
+ f.write(" if (%s1->presenceMask != %s2->presenceMask) {rv=calloc(1,sizeof(asn_comp_rval_t));rv->name = asn_DEF_%s.name;rv->structure1 = %s1;rv->structure2 = %s2;rv->err_code = COMPARE_ERR_CODE_VALUE_NULL; return rv;}\n" % (lowerFirstCamelWord(re.sub('-', '_', key)), lowerFirstCamelWord(re.sub('-', '_', key)), ietypeunderscore, lowerFirstCamelWord(re.sub('-', '_', key)), lowerFirstCamelWord(re.sub('-', '_', key))))
+
+ if ie[3] == "optional":
+ f.write(" /* Optional field */\n")
+ elif ie[3] == "conditional":
+ f.write(" /* Conditional field */\n")
+ f.write(" if (%s1->presenceMask & %s_%s_PRESENT) {\n" % (lowerFirstCamelWord(re.sub('-', '_', key)), keyupperunderscore, ieupperunderscore))
+
+
+ if ie[2] in ieofielist.keys():
+ f.write(" /* collection field */\n")
+ f.write(" rv2 = %s_compare_%s(&%s1->%s, &%s2->%s);\n" % (fileprefix, ietypeunderscore.lower(), lowerFirstCamelWord(re.sub('-', '_', key)), ienamefirstwordlower, lowerFirstCamelWord(re.sub('-', '_', key)), ienamefirstwordlower ))
+ f.write(" if(rv2) {")
+ f.write(" if (NULL == rv) {")
+ f.write(" rv = rv2;")
+ f.write(" } else {")
+ f.write(" rv2->next = rv;")
+ f.write(" rv = rv2;")
+ f.write(" }")
+ f.write(" rv2 = NULL;")
+ f.write(" }")
+ else:
+ f.write(" /* simple field */\n")
+ f.write(" rv2 = asn_DEF_%s.compare(&asn_DEF_%s, &%s1->%s, &asn_DEF_%s, &%s2->%s); \n" % (ietypeunderscore, ietypeunderscore, lowerFirstCamelWord(re.sub('-', '_', key)), ienamefirstwordlower, ietypeunderscore, lowerFirstCamelWord(re.sub('-', '_', key)), ienamefirstwordlower ))
+ f.write(" if (rv2) {")
+ f.write(" if (NULL == rv) {")
+ f.write(" rv = rv2;")
+ f.write(" } else {")
+ f.write(" rv2->next = rv;")
+ f.write(" rv = rv2;")
+ f.write(" }")
+ f.write(" rv2 = NULL;")
+ f.write(" if (!rv->name) rv->name = asn_DEF_%s.name;" % (ietypeunderscore))
+ f.write(" }")
+
+ f.write(" assert(0);\n");
+ f.write(" }\n\n")
+
+ else:
+ if ie[2] in ieofielist.keys():
+ f.write(" /* Mandatory collection field */\n")
+ f.write(" rv2 = %s_compare_%s(&%s1->%s, &%s2->%s);\n" % (fileprefix, ietypeunderscore.lower(), lowerFirstCamelWord(re.sub('-', '_', key)), ienamefirstwordlower, lowerFirstCamelWord(re.sub('-', '_', key)), ienamefirstwordlower ))
+ f.write(" if (rv2) {\n")
+ f.write(" if (NULL == rv) {\n")
+ f.write(" rv = rv2;\n")
+ f.write(" } else {\n")
+ f.write(" rv2->next = rv;\n")
+ f.write(" rv = rv2;\n")
+ f.write(" }\n")
+ f.write(" rv2 = NULL;\n")
+ f.write(" }\n")
+
+ else:
+ f.write(" /* Mandatory simple field */\n")
+ f.write(" rv2 = asn_DEF_%s.compare(&asn_DEF_%s, &%s1->%s, &asn_DEF_%s, &%s2->%s);\n" % (ietypeunderscore, ietypeunderscore, lowerFirstCamelWord(re.sub('-', '_', key)), ienamefirstwordlower, ietypeunderscore, lowerFirstCamelWord(re.sub('-', '_', key)), ienamefirstwordlower ))
+ f.write(" if(rv2) {\n")
+ f.write(" if (NULL == rv) {\n")
+ f.write(" rv = rv2;\n")
+ f.write(" } else {\n")
+ f.write(" rv2->next = rv;\n")
+ f.write(" rv = rv2;\n")
+ f.write(" }\n")
+ f.write(" rv2 = NULL;\n")
+ f.write(" if (!rv->name) rv->name = asn_DEF_%s.name;\n" % (ietypeunderscore))
+ f.write(" }\n")
+ f.write(" return rv;\n")
+ f.write("}\n\n")
+
+for (key, value) in iesDefs.items():
+ if key not in ieofielist.values():
+ continue
+
+ ie = value["ies"][0]
+ ietypeunderscore = re.sub('-', '_', ie[2])
+ asn1cStruct = re.sub('-', '_', re.sub('IEs', '', re.sub('-IEs', '', key)))
+ asn1cStruct = re.sub('Item', 'List', asn1cStruct)
+ firstwordlower = re.sub('Item', 'List', re.sub('enb', 'eNB', lowerFirstCamelWord(asn1cStruct)))
+
+ for (i, j) in ieofielist.items():
+ if j == key:
+ break
+
+ f.write("extern asn_TYPE_descriptor_t asn_DEF_%s;\n" % (ietypeunderscore))
+
+ f.write("asn_comp_rval_t * %s_compare_%s(\n" % (fileprefix, re.sub('-', '_', i).lower()))
+ f.write(" %sIEs_t *%sIEs1,\n" % (re.sub('-', '_', i), lowerFirstCamelWord(re.sub('-', '_', i))))
+ f.write(" %sIEs_t *%sIEs2) {\n\n" % (re.sub('-', '_', i), lowerFirstCamelWord(re.sub('-', '_', i))))
+ f.write(" int i;\n")
+ f.write(" asn_comp_rval_t *rv = NULL;\n\n")
+ f.write(" asn_comp_rval_t *rv2 = NULL;\n\n")
+
+
+ f.write(" assert(%sIEs1 != NULL);\n" % (lowerFirstCamelWord(re.sub('-', '_', i))));
+ f.write(" assert(%sIEs2 != NULL);\n\n" % (lowerFirstCamelWord(re.sub('-', '_', i))));
+
+ f.write(" for (i = 0; i < %sIEs1->%s.count; i++) {\n" % (lowerFirstCamelWord(re.sub('-', '_', i)), re.sub('IEs', '', lowerFirstCamelWord(re.sub('-', '_', key)))))
+ f.write(" rv2 = asn_DEF_%s.compare(&asn_DEF_%s, %sIEs1->%s.array[i], &asn_DEF_%s, %sIEs2->%s.array[i]);\n" % (ietypeunderscore, ietypeunderscore, lowerFirstCamelWord(re.sub('-', '_', i)), re.sub('IEs', '', lowerFirstCamelWord(re.sub('-', '_', key))), ietypeunderscore, lowerFirstCamelWord(re.sub('-', '_', i)), re.sub('IEs', '', lowerFirstCamelWord(re.sub('-', '_', key)))))
+ f.write(" if(rv2) {")
+ f.write(" if (NULL == rv) {")
+ f.write(" rv = rv2;")
+ f.write(" } else {")
+ f.write(" rv2->next = rv;")
+ f.write(" rv = rv2;")
+ f.write(" }")
+ f.write(" rv2 = NULL;")
+ f.write(" }")
+ f.write(" }\n")
+ f.write(" return rv;\n")
+ f.write("}\n\n")
+
diff --git a/openair3/S1AP/s1ap_eNB.c b/openair3/S1AP/s1ap_eNB.c
index c880c3f3b4..1b683d4aa3 100644
--- a/openair3/S1AP/s1ap_eNB.c
+++ b/openair3/S1AP/s1ap_eNB.c
@@ -72,9 +72,9 @@ s1ap_eNB_config_t s1ap_config;
static int s1ap_eNB_generate_s1_setup_request(
s1ap_eNB_instance_t *instance_p, s1ap_eNB_mme_data_t *s1ap_mme_data_p);
-static
+
void s1ap_eNB_handle_register_eNB(instance_t instance, s1ap_register_enb_req_t *s1ap_register_eNB);
-static
+
void s1ap_eNB_handle_sctp_association_resp(instance_t instance, sctp_new_association_resp_t *sctp_new_association_resp);
uint32_t s1ap_generate_eNB_id(void)
@@ -150,7 +150,7 @@ static void s1ap_eNB_register_mme(s1ap_eNB_instance_t *instance_p,
itti_send_msg_to_task(TASK_SCTP, instance_p->instance, message_p);
}
-static
+
void s1ap_eNB_handle_register_eNB(instance_t instance, s1ap_register_enb_req_t *s1ap_register_eNB)
{
s1ap_eNB_instance_t *new_instance;
@@ -210,7 +210,6 @@ void s1ap_eNB_handle_register_eNB(instance_t instance, s1ap_register_enb_req_t *
}
}
-static
void s1ap_eNB_handle_sctp_association_resp(instance_t instance, sctp_new_association_resp_t *sctp_new_association_resp)
{
s1ap_eNB_instance_t *instance_p;
diff --git a/openair3/SCTP/sctp_eNB_task.c b/openair3/SCTP/sctp_eNB_task.c
index c1e7d989e9..357803ac4f 100644
--- a/openair3/SCTP/sctp_eNB_task.c
+++ b/openair3/SCTP/sctp_eNB_task.c
@@ -100,6 +100,7 @@ static STAILQ_HEAD(sctp_cnx_list_head, sctp_cnx_list_elm_s) sctp_cnx_list;
static uint16_t sctp_nb_cnx = 0;
+//------------------------------------------------------------------------------
struct sctp_cnx_list_elm_s *sctp_get_cnx(int32_t assoc_id, int sd)
{
struct sctp_cnx_list_elm_s *elm;
@@ -119,6 +120,7 @@ struct sctp_cnx_list_elm_s *sctp_get_cnx(int32_t assoc_id, int sd)
return NULL;
}
+//------------------------------------------------------------------------------
void
sctp_handle_new_association_req(
const instance_t instance,
@@ -388,6 +390,7 @@ sctp_handle_new_association_req(
sd, sctp_nb_cnx, assoc_id);
}
+ //------------------------------------------------------------------------------
void sctp_send_data(
instance_t instance,
task_id_t task_id,
@@ -430,6 +433,7 @@ void sctp_send_data(
sctp_cnx->assoc_id);
}
+//------------------------------------------------------------------------------
static int sctp_close_association(
const instance_t instance,
const task_id_t requestor,
@@ -456,6 +460,7 @@ static int sctp_close_association(
return 0;
}
+//------------------------------------------------------------------------------
static int sctp_create_new_listener(
const instance_t instance,
const task_id_t requestor,
@@ -580,6 +585,7 @@ err:
return -1;
}
+//------------------------------------------------------------------------------
static inline
void
sctp_eNB_accept_associations(
@@ -646,6 +652,7 @@ sctp_eNB_accept_associations(
}
}
+//------------------------------------------------------------------------------
static inline
void
sctp_eNB_read_from_socket(
@@ -770,6 +777,7 @@ sctp_eNB_read_from_socket(
}
}
+//------------------------------------------------------------------------------
void
sctp_eNB_flush_sockets(
struct epoll_event *events, int nb_events)
@@ -799,6 +807,7 @@ sctp_eNB_flush_sockets(
}
+//------------------------------------------------------------------------------
void *sctp_eNB_task(void *arg)
{
int nb_events;
diff --git a/openair3/TEST/EPC_TEST/TEST_1MME_1ENB_1UE_ATTACH_GUTI/attach_complete.pdml b/openair3/TEST/EPC_TEST/TEST_1MME_1ENB_1UE_ATTACH_GUTI/attach_complete.pdml
new file mode 100644
index 0000000000..f7c27272aa
--- /dev/null
+++ b/openair3/TEST/EPC_TEST/TEST_1MME_1ENB_1UE_ATTACH_GUTI/attach_complete.pdml
@@ -0,0 +1,4242 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/openair3/TEST/EPC_TEST/TEST_1MME_1ENB_1UE_ATTACH_GUTI/enb.band7.tm1.usrpb210.epc.local.conf b/openair3/TEST/EPC_TEST/TEST_1MME_1ENB_1UE_ATTACH_GUTI/enb.band7.tm1.usrpb210.epc.local.conf
new file mode 100644
index 0000000000..e864f47edb
--- /dev/null
+++ b/openair3/TEST/EPC_TEST/TEST_1MME_1ENB_1UE_ATTACH_GUTI/enb.band7.tm1.usrpb210.epc.local.conf
@@ -0,0 +1,174 @@
+Active_eNBs = ( "eNB_Eurecom_LTEBox");
+# Asn1_verbosity, choice in: none, info, annoying
+Asn1_verbosity = "none";
+
+eNBs =
+(
+ {
+ ////////// Identification parameters:
+ eNB_ID = 0xe00;
+
+ cell_type = "CELL_MACRO_ENB";
+
+ eNB_name = "eNB_Eurecom_LTEBox";
+
+ // Tracking area code, 0x0000 and 0xfffe are reserved values
+ tracking_area_code = "1";
+
+ mobile_country_code = "208";
+
+ mobile_network_code = "95";
+
+ ////////// Physical parameters:
+
+ component_carriers = (
+ {
+ frame_type = "FDD";
+ tdd_config = 3;
+ tdd_config_s = 0;
+ prefix_type = "NORMAL";
+ eutra_band = 7;
+ downlink_frequency = 2660000000L;
+ uplink_frequency_offset = -120000000;
+ Nid_cell = 0;
+ N_RB_DL = 25;
+ Nid_cell_mbsfn = 0;
+ nb_antennas_tx = 1;
+ nb_antennas_rx = 1;
+ tx_gain = 90;
+ rx_gain = 120;
+ prach_root = 0;
+ prach_config_index = 0;
+ prach_high_speed = "DISABLE";
+ prach_zero_correlation = 1;
+ prach_freq_offset = 2;
+ pucch_delta_shift = 1;
+ pucch_nRB_CQI = 1;
+ pucch_nCS_AN = 0;
+ pucch_n1_AN = 32;
+ pdsch_referenceSignalPower = -26;
+ pdsch_p_b = 0;
+ pusch_n_SB = 1;
+ pusch_enable64QAM = "DISABLE";
+ pusch_hoppingMode = "interSubFrame";
+ pusch_hoppingOffset = 0;
+ pusch_groupHoppingEnabled = "ENABLE";
+ pusch_groupAssignment = 0;
+ pusch_sequenceHoppingEnabled = "DISABLE";
+ pusch_nDMRS1 = 1;
+ phich_duration = "NORMAL";
+ phich_resource = "ONESIXTH";
+ srs_enable = "DISABLE";
+ /* srs_BandwidthConfig =;
+ srs_SubframeConfig =;
+ srs_ackNackST =;
+ srs_MaxUpPts =;*/
+
+ pusch_p0_Nominal = -90;
+ pusch_alpha = "AL1";
+ pucch_p0_Nominal = -108;
+ msg3_delta_Preamble = 6;
+ pucch_deltaF_Format1 = "deltaF2";
+ pucch_deltaF_Format1b = "deltaF3";
+ pucch_deltaF_Format2 = "deltaF0";
+ pucch_deltaF_Format2a = "deltaF0";
+ pucch_deltaF_Format2b = "deltaF0";
+
+ rach_numberOfRA_Preambles = 64;
+ rach_preamblesGroupAConfig = "DISABLE";
+ /*
+ rach_sizeOfRA_PreamblesGroupA = ;
+ rach_messageSizeGroupA = ;
+ rach_messagePowerOffsetGroupB = ;
+ */
+ rach_powerRampingStep = 4;
+ rach_preambleInitialReceivedTargetPower = -108;
+ rach_preambleTransMax = 10;
+ rach_raResponseWindowSize = 10;
+ rach_macContentionResolutionTimer = 48;
+ rach_maxHARQ_Msg3Tx = 4;
+
+ pcch_default_PagingCycle = 128;
+ pcch_nB = "oneT";
+ bcch_modificationPeriodCoeff = 2;
+ ue_TimersAndConstants_t300 = 1000;
+ ue_TimersAndConstants_t301 = 1000;
+ ue_TimersAndConstants_t310 = 1000;
+ ue_TimersAndConstants_t311 = 10000;
+ ue_TimersAndConstants_n310 = 20;
+ ue_TimersAndConstants_n311 = 1;
+ }
+ );
+
+ srb1_parameters :
+ {
+ # timer_poll_retransmit = (ms) [5, 10, 15, 20,... 250, 300, 350, ... 500]
+ timer_poll_retransmit = 80;
+
+ # timer_reordering = (ms) [0,5, ... 100, 110, 120, ... ,200]
+ timer_reordering = 35;
+
+ # timer_reordering = (ms) [0,5, ... 250, 300, 350, ... ,500]
+ timer_status_prohibit = 0;
+
+ # poll_pdu = [4, 8, 16, 32 , 64, 128, 256, infinity(>10000)]
+ poll_pdu = 4;
+
+ # poll_byte = (kB) [25,50,75,100,125,250,375,500,750,1000,1250,1500,2000,3000,infinity(>10000)]
+ poll_byte = 99999;
+
+ # max_retx_threshold = [1, 2, 3, 4 , 6, 8, 16, 32]
+ max_retx_threshold = 4;
+ }
+
+ # ------- SCTP definitions
+ SCTP :
+ {
+ # Number of streams to use in input/output
+ SCTP_INSTREAMS = 2;
+ SCTP_OUTSTREAMS = 2;
+ };
+
+
+ ////////// MME parameters:
+ mme_ip_address = ( { ipv4 = "192.188.2.2";
+ ipv6 = "192:168:30::17";
+ active = "yes";
+ preference = "ipv4";
+ }
+ );
+
+ NETWORK_INTERFACES :
+ {
+ ENB_INTERFACE_NAME_FOR_S1_MME = "tun2";
+ ENB_IPV4_ADDRESS_FOR_S1_MME = "192.188.2.2/24";
+
+ ENB_INTERFACE_NAME_FOR_S1U = "lo";
+ ENB_IPV4_ADDRESS_FOR_S1U = "127.0.0.1/24";
+ ENB_PORT_FOR_S1U = 2153; # Spec 2152
+ };
+
+ log_config :
+ {
+ global_log_level ="info";
+ global_log_verbosity ="medium";
+ hw_log_level ="info";
+ hw_log_verbosity ="medium";
+ phy_log_level ="info";
+ phy_log_verbosity ="medium";
+ mac_log_level ="info";
+ mac_log_verbosity ="high";
+ rlc_log_level ="info";
+ rlc_log_verbosity ="medium";
+ pdcp_log_level ="info";
+ pdcp_log_verbosity ="medium";
+ rrc_log_level ="info";
+ rrc_log_verbosity ="medium";
+ gtpu_log_level ="info";
+ gtpu_log_verbosity ="medium";
+ udp_log_level ="info";
+ udp_log_verbosity ="medium";
+ };
+
+ }
+);
diff --git a/openair3/TEST/EPC_TEST/generate_scenario.c b/openair3/TEST/EPC_TEST/generate_scenario.c
index bd181ce878..69e707dcf9 100644
--- a/openair3/TEST/EPC_TEST/generate_scenario.c
+++ b/openair3/TEST/EPC_TEST/generate_scenario.c
@@ -36,18 +36,33 @@
*/
#include
+#include
#include
#include
#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
#include "assertions.h"
-#include "enb_config.h"
+#include "generate_scenario.h"
#include "s1ap_eNB.h"
-#if defined(ENABLE_ITTI)
-# include "intertask_interface.h"
-#endif
-
-#define EPC_TEST_SCENARIO_MAX_ENB 2
+#include "intertask_interface.h"
#define ENB_CONFIG_STRING_ACTIVE_ENBS "Active_eNBs"
@@ -79,29 +94,201 @@
#define ENB_CONFIG_STRING_ENB_PORT_FOR_S1U "ENB_PORT_FOR_S1U"
+#define ENB_CONFIG_MAX_XSLT_PARAMS 32
+
Enb_properties_array_t g_enb_properties;
+char *g_test_dir = NULL;
+char *g_pdml_in_origin = NULL;
+extern int xmlLoadExtDtdDefaultValue;
+
+#define GENERATE_PDML_FILE 1
+#define GENERATE_SCENARIO 2
+
+#define GS_IS_FILE 1
+#define GS_IS_DIR 2
+
+//------------------------------------------------------------------------------
+// test if file exist in current directory
+int is_file_exists( const char const * file_nameP, const char const *file_roleP)
+{
+ struct stat s;
+ int err = stat(file_nameP, &s);
+ if(-1 == err) {
+ if(ENOENT == errno) {
+ fprintf(stderr, "Please provide a valid %s, %s does not exist\n", file_roleP, file_nameP);
+ } else {
+ perror("stat");
+ exit(1);
+ }
+ } else {
+ if(S_ISREG(s.st_mode)) {
+ return GS_IS_FILE;
+ } else if(S_ISDIR(s.st_mode)) {
+ return GS_IS_DIR;
+ } else {
+ fprintf(stderr, "Please provide a valid test %s, %s exists but is not found valid\n", file_roleP, file_nameP);
+ }
+ }
+ return 0;
+}
+
+
+//------------------------------------------------------------------------------
+int strip_extension(char *in_filename)
+{
+ static const uint8_t name_min_len = 1;
+ static const uint8_t max_ext_len = 5; // .pdml !
+ fprintf(stdout, "strip_extension %s\n", in_filename);
+
+ if (NULL != in_filename) {
+ /* Check chars starting at end of string to find last '.' */
+ for (ssize_t i = strlen(in_filename); i >= name_min_len; i--) {
+ if (in_filename[i] == '.') {
+ in_filename[i] = '\0';
+ return i;
+ }
+ }
+ }
+ return -1;
+}
+//------------------------------------------------------------------------------
+// return number of splitted items
+int split_path( char * pathP, char *** resP)
+{
+ char * saveptr1;
+ char * p = strtok_r (pathP, "/", &saveptr1);
+ int n_spaces = 0;
+
+ /// split string and append tokens to 'res'
+ while (p) {
+ *resP = realloc (*resP, sizeof (char*) * ++n_spaces);
+ AssertFatal (*resP, "realloc failed");
+ (*resP)[n_spaces-1] = p;
+ p = strtok_r (NULL, "/", &saveptr1);
+ }
+ return n_spaces;
+}
+
+//------------------------------------------------------------------------------
+int generate_test_scenario(const char const * test_nameP, const char const * pdml_in_basenameP)
+//------------------------------------------------------------------------------
+{
+ //int fd_pdml_in;
+ xsltStylesheetPtr cur = NULL;
+ xmlDocPtr doc, res;
+ FILE *test_scenario_file = NULL;
+ const char test_scenario_filename[NAME_MAX];
+ const char *params[2*ENB_CONFIG_MAX_XSLT_PARAMS];
+ int nb_params = 0;
+ int i,j;
+ char astring[1024];
+ char *astring2 = NULL;
+ struct in_addr addr;
+
+ memset(test_scenario_filename, 0, sizeof(test_scenario_filename));
+ memset(astring, 0, sizeof(astring));
+ if (getcwd(astring, sizeof(astring)) != NULL) {
+ fprintf(stdout, "working in %s directory\n", astring);
+ } else {
+ perror("getcwd() error");
+ exit(1);
+ }
+
+ xmlSubstituteEntitiesDefault(1);
+ xmlLoadExtDtdDefaultValue = 1;
+ cur = xsltParseStylesheetFile("/usr/share/oai/xsl/generic_scenario.xsl");
+ if (NULL == cur) {
+ AssertFatal (0, "Could not parse stylesheet file /usr/share/oai/xsl/generic_scenario.xsl!\n");
+ } else {
+ fprintf(stdout, "XSLT style sheet: /usr/share/oai/xsl/generic_scenario.xsl\n");
+ }
+
+ doc = xmlParseFile(pdml_in_basenameP);
+ if (NULL == doc) {
+ AssertFatal (0, "Could not parse pdml file %s!\n", pdml_in_basenameP);
+ } else {
+ fprintf(stdout, "pdml file: %s\n", pdml_in_basenameP);
+ }
+ params[nb_params++] = "test_name";
+ sprintf(astring, "%s", pdml_in_basenameP);
+ if (strip_extension(astring) > 0) {
+ astring2 = strdup(astring);
+ sprintf(astring, "\"%s\"", astring2);
+ free(astring2);
+ astring2 = NULL;
+ } else {
+ fprintf(stderr, "Assigning test name failed: %s\n", astring);
+ }
+ params[nb_params++] = strdup(astring);
+
+ for (i = 0; i < g_enb_properties.number; i++) {
+ // eNB S1-C IPv4 address
+ sprintf(astring, "enb%d_s1c", i);
+ params[nb_params++] = strdup(astring);
+ addr.s_addr = g_enb_properties.properties[i]->enb_ipv4_address_for_S1_MME;
+ sprintf(astring, "\"%s\"", inet_ntoa(addr));
+ params[nb_params++] = strdup(astring);
+
+ // MME S1-C IPv4 address
+ for (j = 0; j < g_enb_properties.properties[i]->nb_mme; j++) {
+ sprintf(astring, "mme%d_s1c_%d", i, j);
+ params[nb_params++] = strdup(astring);
+ AssertFatal (g_enb_properties.properties[i]->mme_ip_address[j].ipv4_address,
+ "Only support MME IPv4 address\n");
+ sprintf(astring, "\"%s\"", g_enb_properties.properties[i]->mme_ip_address[j].ipv4_address);
+ params[nb_params++] = strdup(astring);
+ }
+ }
+ params[nb_params] = NULL;
+ res = xsltApplyStylesheet(cur, doc, params);
+ if (NULL != res) {
+ // since pdml filename is not relative (no path), just filename in current directory we can safely remove
+ sprintf(test_scenario_filename,"%s",pdml_in_basenameP);
+ if (strip_extension(test_scenario_filename) > 0) {
+ strcat(test_scenario_filename, ".xml");
+ test_scenario_file = fopen( test_scenario_filename, "w+");
+ if (NULL != test_scenario_file) {
+ xsltSaveResultToFile(test_scenario_file, res, cur);
+ fclose(test_scenario_file);
+ fprintf(stdout, "Wrote test scenario to %s\n", test_scenario_filename);
+ } else {
+ fprintf(stderr, "Error in fopen(%s)\n", test_scenario_filename);
+ }
+ } else {
+ fprintf(stderr, "Error in strip_extension()\n");
+ }
+ } else {
+ fprintf(stderr, "Error in xsltApplyStylesheet()\n");
+ }
+ xsltFreeStylesheet(cur);
+ xmlFreeDoc(res);
+ xmlFreeDoc(doc);
+
+ xsltCleanupGlobals();
+ xmlCleanupParser();
+}
//------------------------------------------------------------------------------
static void enb_config_display(void)
//------------------------------------------------------------------------------
{
- int i,j;
+ int i;
printf( "\n----------------------------------------------------------------------\n");
- printf( " ENB CONFIG FILE CONTENT LOADED (TBC):\n");
+ printf( " ENB CONFIG FILE CONTENT LOADED:\n");
printf( "----------------------------------------------------------------------\n");
for (i = 0; i < g_enb_properties.number; i++) {
printf( "ENB CONFIG for instance %u:\n\n", i);
- printf( "\teNB name: \t%s:\n",g_enb_properties.properties[i]->eNB_name);
- printf( "\teNB ID: \t%"PRIu32":\n",g_enb_properties.properties[i]->eNB_id);
- printf( "\tCell type: \t%s:\n",g_enb_properties.properties[i]->cell_type == CELL_MACRO_ENB ? "CELL_MACRO_ENB":"CELL_HOME_ENB");
- printf( "\tTAC: \t%"PRIu16":\n",g_enb_properties.properties[i]->tac);
- printf( "\tMCC: \t%"PRIu16":\n",g_enb_properties.properties[i]->mcc);
+ printf( "\teNB name: \t%s\n",g_enb_properties.properties[i]->eNB_name);
+ printf( "\teNB ID: \t%"PRIu32"\n",g_enb_properties.properties[i]->eNB_id);
+ printf( "\tCell type: \t%s\n",g_enb_properties.properties[i]->cell_type == CELL_MACRO_ENB ? "CELL_MACRO_ENB":"CELL_HOME_ENB");
+ printf( "\tTAC: \t%"PRIu16"\n",g_enb_properties.properties[i]->tac);
+ printf( "\tMCC: \t%"PRIu16"\n",g_enb_properties.properties[i]->mcc);
if (g_enb_properties.properties[i]->mnc_digit_length == 3) {
- printf( "\tMNC: \t%03"PRIu16":\n",g_enb_properties.properties[i]->mnc);
+ printf( "\tMNC: \t%03"PRIu16"\n",g_enb_properties.properties[i]->mnc);
} else {
- printf( "\tMNC: \t%02"PRIu16":\n",g_enb_properties.properties[i]->mnc);
+ printf( "\tMNC: \t%02"PRIu16"\n",g_enb_properties.properties[i]->mnc);
}
printf( "\n--------------------------------------------------------\n");
}
@@ -114,13 +301,12 @@ static void enb_config_display(void)
#define libconfig_int int
#endif
//------------------------------------------------------------------------------
-const Enb_properties_array_t *enb_config_init(char* lib_config_file_name_pP)
+void enb_config_init(const char const * lib_config_file_name_pP)
//------------------------------------------------------------------------------
{
config_t cfg;
config_setting_t *setting = NULL;
config_setting_t *subsetting = NULL;
- config_setting_t *setting_srb1 = NULL;
config_setting_t *setting_mme_addresses = NULL;
config_setting_t *setting_mme_address = NULL;
config_setting_t *setting_enb = NULL;
@@ -128,8 +314,6 @@ const Enb_properties_array_t *enb_config_init(char* lib_config_file_name_pP)
int enb_properties_index = 0;
int num_enbs = 0;
int num_mme_address = 0;
- int num_otg_elements =0;
- int num_component_carriers =0;
int i = 0;
int j = 0;
int parse_errors = 0;
@@ -139,12 +323,6 @@ const Enb_properties_array_t *enb_config_init(char* lib_config_file_name_pP)
const char* enb_name = NULL;
const char* mcc = 0;
const char* mnc = 0;
- const char* frame_type = NULL;
- const char* prefix_type = NULL;
- libconfig_int Nid_cell = 0;
-
- libconfig_int my_int;
-
char* ipv4 = NULL;
char* ipv6 = NULL;
char* active = NULL;
@@ -157,21 +335,20 @@ const Enb_properties_array_t *enb_config_init(char* lib_config_file_name_pP)
char* enb_ipv4_address_for_S1_MME = NULL;
char *address = NULL;
char *cidr = NULL;
- char *astring = NULL;
+
+
+ AssertFatal (lib_config_file_name_pP != NULL,
+ "Bad parameter lib_config_file_name_pP %s , must reference a valid eNB config file\n",
+ lib_config_file_name_pP);
memset((char*)active_enb, 0 , EPC_TEST_SCENARIO_MAX_ENB * sizeof(char*));
config_init(&cfg);
- if (lib_config_file_name_pP != NULL) {
- /* Read the file. If there is an error, report it and exit. */
- if (! config_read_file(&cfg, lib_config_file_name_pP)) {
- config_destroy(&cfg);
- AssertFatal (0, "Failed to parse eNB configuration file %s!\n", lib_config_file_name_pP);
- }
- } else {
+ /* Read the file. If there is an error, report it and exit. */
+ if (! config_read_file(&cfg, lib_config_file_name_pP)) {
config_destroy(&cfg);
- AssertFatal (0, "No eNB configuration file provided!\n");
+ AssertFatal (0, "Failed to parse eNB configuration file %s!\n", lib_config_file_name_pP);
}
// Get list of active eNBs, (only these will be configured)
@@ -195,7 +372,7 @@ const Enb_properties_array_t *enb_config_init(char* lib_config_file_name_pP)
setting = config_lookup(&cfg, ENB_CONFIG_STRING_ENB_LIST);
if (setting != NULL) {
- enb_properties_index = 0;
+ enb_properties_index = g_enb_properties.number;
parse_errors = 0;
num_enbs = config_setting_length(setting);
@@ -332,31 +509,19 @@ const Enb_properties_array_t *enb_config_init(char* lib_config_file_name_pP)
IPV4_STR_ADDR_TO_INT_NWBO ( address, g_enb_properties.properties[enb_properties_index]->enb_ipv4_address_for_S1_MME, "BAD IP ADDRESS FORMAT FOR eNB S1_MME !\n" );
}
}
- }
- }
- }
- }
- }
+ } // if (subsetting != NULL) {
+ enb_properties_index += 1;
+ } // if (strcmp(active_enb[j], enb_name) == 0)
+ } // for (j=0; j < num_enb_properties; j++)
+ } // for (i = 0; i < num_enbs; i++)
+ } // if (setting != NULL) {
- g_enb_properties.number = num_enb_properties;
+ g_enb_properties.number += num_enb_properties;
- AssertError (enb_properties_index == num_enb_properties, parse_errors ++,
- "Failed to parse eNB configuration file %s, mismatch between %u active eNBs and %u corresponding defined eNBs !\n",
- lib_config_file_name_pP, num_enb_properties, enb_properties_index);
AssertFatal (parse_errors == 0,
"Failed to parse eNB configuration file %s, found %d error%s !\n",
lib_config_file_name_pP, parse_errors, parse_errors > 1 ? "s" : "");
- enb_config_display();
- return &g_enb_properties;
-
-}
-
-//------------------------------------------------------------------------------
-const Enb_properties_array_t *enb_config_get(void)
-//------------------------------------------------------------------------------
-{
- return &g_enb_properties;
}
@@ -366,19 +531,41 @@ static void usage (
char *argv[])
//------------------------------------------------------------------------------
{
- fprintf (stdout, "Please report any bug to: openair4g-devel@lists.eurecom.fr\n\n");
+ fprintf (stdout, "Please report any bug to: %s\n",PACKAGE_BUGREPORT);
fprintf (stdout, "Usage: %s [options]\n\n", argv[0]);
- fprintf (stdout, "Available options:\n");
- fprintf (stdout, "\t--help, -h Print this help and return\n");
- fprintf (stdout, "\t--test-dir \n");
- fprintf (stdout, " Set the test directory where pdml and original enb(s) config files are located\n");
- fprintf (stdout, " See README in openair3/TEST/EPC_TEST\n");
- fprintf (stdout, "\t--new-enb-conf-file \n");
- fprintf (stdout, " Provide an updated eNB config file for generating a copy of the original test\n");
- fprintf (stdout, " This option is set as many times as there are some eNB in the original test\n");
+ fprintf (stdout, "\n");
+ fprintf (stdout, "Mandatory options:\n");
+ fprintf (stdout, "\t-c | --enb-conf-file Provide the old eNB config file for generating a copy of the original test\n");
+ fprintf (stdout, "\t-d | --test-dir Directory where a set of files related to a particular test are located\n");
+ fprintf (stdout, "\t-p | --pdml File name (with no path) in 'test-dir' directory of an original scenario that has to be reworked (IP addresses) with new testbed\n");
+ fprintf (stdout, "\n");
+ fprintf (stdout, "Other options:\n");
+ fprintf (stdout, "\t-h | --help Print this help and return\n");
+ fprintf (stdout, "\t-v | --version Print informations about the version of this executable\n");
+ fprintf (stdout, "\n");
+ fprintf (stdout, "Example of generate_scenario use case: \n");
+ fprintf (stdout, "\n");
+ fprintf (stdout, " Generate a generix xml scenario from a captured pcap file: \n");
+ fprintf (stdout, " +---------------------+ \n");
+ fprintf (stdout, " |captured pcap-ng file| \n");
+ fprintf (stdout, " +----------+----------+ \n");
+ fprintf (stdout, " |\n");
+ fprintf (stdout, " mme_test_s1_pcap2pdml --pcap_file <`captured pcap-ng file`>\n");
+ fprintf (stdout, " |\n");
+ fprintf (stdout, " +--------V----------+ +--------------------+\n");
+ fprintf (stdout, " |'pdml-in-orig' file| |'enb-conf-file' file|\n");
+ fprintf (stdout, " +--------+----------+ +--------------------+\n");
+ fprintf (stdout, " | |\n");
+ fprintf (stdout, " +----------------------------+\n");
+ fprintf (stdout, " |\n");
+ fprintf (stdout, " generate_scenario -d -p <'pdml-in-orig' file> -c <'enb-conf-file' file> \n");
+ fprintf (stdout, " |\n");
+ fprintf (stdout, " +------------V--------------+\n");
+ fprintf (stdout, " +'xml-test-scenario' file |\n");
+ fprintf (stdout, " +---------------------------+\n");
+ fprintf (stdout, "\n");
}
-
//------------------------------------------------------------------------------
int
config_parse_opt_line (
@@ -387,65 +574,119 @@ config_parse_opt_line (
//------------------------------------------------------------------------------
{
int option;
- char *enb_config_file_name = NULL;
- char *test_dir = NULL;
+ int rv = 0;
+ char *enb_config_file_name = NULL;
+ char *pdml_in_file_name = NULL;
+ char *test_dir_name = NULL;
enum long_option_e {
LONG_OPTION_START = 0x100, /* Start after regular single char options */
+ LONG_OPTION_ENB_CONF_FILE,
+ LONG_OPTION_PDML,
LONG_OPTION_TEST_DIR,
- LONG_OPTION_NEW_ENB_CONF_FILE,
LONG_OPTION_HELP,
+ LONG_OPTION_VERSION,
};
static struct option long_options[] = {
- {"test-dir", required_argument, 0, LONG_OPTION_TEST_DIR},
- {"new-enb-conf-file", required_argument, 0, LONG_OPTION_NEW_ENB_CONF_FILE},
- {"help", required_argument, 0, LONG_OPTION_HELP},
+ {"enb-conf-file", required_argument, 0, LONG_OPTION_ENB_CONF_FILE},
+ {"pdml ", required_argument, 0, LONG_OPTION_PDML},
+ {"test-dir", required_argument, 0, LONG_OPTION_TEST_DIR},
+ {"help", no_argument, 0, LONG_OPTION_HELP},
+ {"version", no_argument, 0, LONG_OPTION_VERSION},
{NULL, 0, NULL, 0}
};
/*
* Parsing command line
*/
- while ((option = getopt_long (argc, argv, "h", long_options, NULL)) != -1) {
+ while ((option = getopt_long (argc, argv, "vhp:n:c:s:d:", long_options, NULL)) != -1) {
switch (option) {
- case LONG_OPTION_TEST_DIR:
+ case LONG_OPTION_ENB_CONF_FILE:
+ case 'c':
if (optarg) {
- test_dir = strdup(optarg);
- printf("TEST DIRECTORY IS %s\n", test_dir);
- }
- break;
-
- case LONG_OPTION_NEW_ENB_CONF_FILE:
- if (optarg) {
- enb_config_file_name = strdup(optarg);
+ enb_config_file_name = optarg;
printf("eNB config file name is %s\n", enb_config_file_name);
- enb_config_init(enb_config_file_name);
+ rv |= GENERATE_SCENARIO;
}
break;
+ case LONG_OPTION_PDML:
+ case 'p':
if (optarg) {
- test_dir = strdup(optarg);
- printf("TEST DIRECTORY IS %s\n", test_dir);
+ pdml_in_file_name = strdup(optarg);
+ printf("PDML input file name is %s\n", pdml_in_file_name);
+ rv |= GENERATE_SCENARIO;
}
break;
+ case LONG_OPTION_TEST_DIR:
+ case 'd':
+ if (optarg) {
+ test_dir_name = strdup(optarg);
+ if (is_file_exists(test_dir_name, "test dirname") != GS_IS_DIR) {
+ fprintf(stderr, "Please provide a valid test dirname, %s is not a valid directory name\n", test_dir_name);
+ exit(1);
+ }
+ printf("Test dir name is %s\n", test_dir_name);
+ }
+ break;
+
+ case LONG_OPTION_VERSION:
+ case 'v':
+ printf("Version %s\n", PACKAGE_VERSION);
+ exit (0);
+ break;
+
case LONG_OPTION_HELP:
- case 'h': /* Fall through */
+ case 'h':
default:
usage (argc, argv);
exit (0);
}
}
- return 0;
+ if (NULL == test_dir_name) {
+ fprintf(stderr, "Please provide a valid test dirname\n");
+ exit(1);
+ }
+ g_test_dir = test_dir_name; test_dir_name = NULL;
+ if (chdir(g_test_dir) != 0) {
+ fprintf(stderr, "Error: chdir %s returned %s\n", g_test_dir, strerror(errno));
+ exit(1);
+ }
+ if (rv & GENERATE_SCENARIO) {
+ if (NULL == enb_config_file_name) {
+ fprintf(stderr, "Error: please provide the original eNB config file name that should be in %s\n", g_test_dir);
+ }
+ if (is_file_exists(enb_config_file_name, "ENB config file") != GS_IS_FILE) {
+ fprintf(stderr, "Error: eNB config file name %s is not found in dir %s\n", enb_config_file_name, g_test_dir);
+ }
+ enb_config_init(enb_config_file_name);
+ //enb_config_display();
+
+ if (NULL == pdml_in_file_name) {
+ fprintf(stderr, "Error: please provide the PDML file name that should be in %s\n", g_test_dir);
+ }
+ if (is_file_exists(pdml_in_file_name, "PDML file") != GS_IS_FILE) {
+ fprintf(stderr, "Error: PDML file name %s is not found in dir %s\n", pdml_in_file_name, g_test_dir);
+ }
+ g_pdml_in_origin = pdml_in_file_name; pdml_in_file_name = NULL;
+ }
+ return rv;
}
//------------------------------------------------------------------------------
int main( int argc, char **argv )
//------------------------------------------------------------------------------
{
+ int actions = 0;
+
memset((char*) &g_enb_properties, 0 , sizeof(g_enb_properties));
- config_parse_opt_line (argc, argv); //Command-line options
+
+ actions = config_parse_opt_line (argc, argv); //Command-line options
+ if (actions & GENERATE_SCENARIO) {
+ generate_test_scenario(g_test_dir, g_pdml_in_origin);
+ }
return 0;
}
diff --git a/openair3/TEST/EPC_TEST/generate_scenario.h b/openair3/TEST/EPC_TEST/generate_scenario.h
new file mode 100644
index 0000000000..88c0d28e17
--- /dev/null
+++ b/openair3/TEST/EPC_TEST/generate_scenario.h
@@ -0,0 +1,132 @@
+/*******************************************************************************
+ OpenAirInterface
+ Copyright(c) 1999 - 2014 Eurecom
+
+ OpenAirInterface is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+
+ OpenAirInterface is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with OpenAirInterface.The full GNU General Public License is
+ included in this distribution in the file called "COPYING". If not,
+ see .
+
+ Contact Information
+ OpenAirInterface Admin: openair_admin@eurecom.fr
+ OpenAirInterface Tech : openair_tech@eurecom.fr
+ OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr
+
+ Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE
+
+*******************************************************************************/
+
+/*
+ generate_scenario.h
+ -------------------
+ AUTHOR : Lionel GAUTHIER
+ COMPANY : EURECOM
+ EMAIL : Lionel.Gauthier@eurecom.fr
+*/
+
+#ifndef GENERATE_SCENARIO_H_
+#define GENERATE_SCENARIO_H_
+#include
+#include
+#include
+
+#include "commonDef.h"
+#include "platform_types.h"
+#include "platform_constants.h"
+#include "PHY/impl_defs_lte.h"
+#include "s1ap_messages_types.h"
+#ifdef CMAKER
+#include "SystemInformationBlockType2.h"
+#else
+#include "RRC/LITE/MESSAGES/SystemInformationBlockType2.h"
+#endif
+
+#define IPV4_STR_ADDR_TO_INT_NWBO(AdDr_StR,NwBo,MeSsAgE ) do {\
+ struct in_addr inp;\
+ if ( inet_aton(AdDr_StR, &inp ) < 0 ) {\
+ AssertFatal (0, MeSsAgE);\
+ } else {\
+ NwBo = inp.s_addr;\
+ }\
+ } while (0);
+
+/** @defgroup _enb_app ENB APP
+ * @ingroup _oai2
+ * @{
+ */
+
+// Hard to find a defined value for max enb...
+#define EPC_TEST_SCENARIO_MAX_ENB 4
+
+
+typedef struct mme_ip_address_s {
+ unsigned ipv4:1;
+ unsigned ipv6:1;
+ unsigned active:1;
+ char *ipv4_address;
+ char *ipv6_address;
+} mme_ip_address_t;
+
+typedef struct Enb_properties_s {
+ /* Unique eNB_id to identify the eNB within EPC.
+ * For macro eNB ids this field should be 20 bits long.
+ * For home eNB ids this field should be 28 bits long.
+ */
+ uint32_t eNB_id;
+
+ /* The type of the cell */
+ enum cell_type_e cell_type;
+
+ /* Optional name for the cell
+ * NOTE: the name can be NULL (i.e no name) and will be cropped to 150
+ * characters.
+ */
+ char *eNB_name;
+
+ /* Tracking area code */
+ uint16_t tac;
+
+ /* Mobile Country Code
+ * Mobile Network Code
+ */
+ uint16_t mcc;
+ uint16_t mnc;
+ uint8_t mnc_digit_length;
+
+ /* Nb of MME to connect to */
+ uint8_t nb_mme;
+ /* List of MME to connect to */
+ mme_ip_address_t mme_ip_address[S1AP_MAX_NB_MME_IP_ADDRESS];
+
+ int sctp_in_streams;
+ int sctp_out_streams;
+
+ char *enb_interface_name_for_S1U;
+ in_addr_t enb_ipv4_address_for_S1U;
+ tcp_udp_port_t enb_port_for_S1U;
+
+ char *enb_interface_name_for_S1_MME;
+ in_addr_t enb_ipv4_address_for_S1_MME;
+
+} Enb_properties_t;
+
+typedef struct Enb_properties_array_s {
+ int number;
+ Enb_properties_t *properties[EPC_TEST_SCENARIO_MAX_ENB];
+} Enb_properties_array_t;
+
+void enb_config_init(const char const * lib_config_file_name_pP);
+
+#endif /* ENB_CONFIG_H_ */
+/** @} */
diff --git a/openair3/TEST/EPC_TEST/mme_test_s1_pcap2pdml b/openair3/TEST/EPC_TEST/mme_test_s1_pcap2pdml
deleted file mode 100755
index b0a77e60f5..0000000000
--- a/openair3/TEST/EPC_TEST/mme_test_s1_pcap2pdml
+++ /dev/null
@@ -1,92 +0,0 @@
-#!/usr/bin/python
-# -*- coding: utf-8 -*-
-import sys
-import subprocess
-import re
-import socket
-import datetime
-from datetime import date
-import os, errno
-import argparse
-import tempfile
-from lxml import etree
-from xml.dom.minidom import parse, parseString
-
-#####################
-# program arguments
-#####################
-parser = argparse.ArgumentParser()
-parser.add_argument("--pcap_file", "-p", type=str,help="input pcap file to be translated")
-args = parser.parse_args()
-
-#####################
-# get xml document from pcap
-#####################
-orig_pcap_file_name = args.pcap_file.strip()
-orig_pdml_string = subprocess.check_output(["tshark", '-T', 'pdml', '-r', orig_pcap_file_name])
-
-orig_dom = parseString(orig_pdml_string)
-
-#####################
-# filtering unwanted packets
-#####################
-#cases = orig_etree.findall(".//proto[@name='sctp']")
-packets = orig_dom.getElementsByTagName("packet")
-for packet in packets:
- found_sctp = False
- found_s1ap = False
- protos = packet.getElementsByTagName("proto")
- for proto in protos:
- attrs = proto.attributes
- urlnode = attrs['name']
- if urlnode.nodeValue == 'sctp':
- found_sctp = True
- elif urlnode.nodeValue == 's1ap':
- found_s1ap = True
- elif urlnode.nodeValue == 'geninfo':
- packet.removeChild(proto)
- elif urlnode.nodeValue == 'eth':
- packet.removeChild(proto)
- if found_sctp == False:
- # hopefully it seems to work (remove iterated packet)
- packet.parentNode.removeChild(packet)
-
-#####################
-# dom to xml string
-#####################
-filtered_pdml_string = orig_dom.toxml()
-cleaned_pdml_string = ""
-#####################
-# remove blank lines in xml string
-#####################
-lines = filtered_pdml_string.splitlines()
-for line in lines:
- if line[:-1]:
- cleaned_pdml_string += line + '\r\n'
-#print "'%s'" % cleaned_pdml_string
-#####################
-# write pdml string to pdml file
-#####################
-out_pdml_file_name = os.path.dirname(orig_pcap_file_name) + os.path.splitext(os.path.basename(orig_pcap_file_name))[0] + '.pdml'
-out_file = open(out_pdml_file_name, "w")
-out_file.write(cleaned_pdml_string)
-out_file.close()
-
-############################################################
-# DECEIVING HTML BONUS: DO NOT SEEM TO WORK CORRECTLY IN FIREFOX
-# DID NOT INVESTIGATE
-#####################
-# write xml string to html file
-#####################
-xsl_root = etree.fromstring(open('/usr/share/wireshark/pdml2html.xsl').read())
-transform = etree.XSLT(xsl_root)
-xml_root = etree.fromstring(cleaned_pdml_string)
-trans_root = transform(xml_root)
-filtered_html_string = etree.tostring(trans_root)
-#####################
-# write html string to html file
-#####################
-out_html_file_name = os.path.dirname(orig_pcap_file_name) + os.path.splitext(os.path.basename(orig_pcap_file_name))[0] + '.html'
-out_file = open(out_html_file_name, "w")
-out_file.write(filtered_html_string)
-out_file.close()
diff --git a/openair3/TEST/EPC_TEST/play_scenario.c b/openair3/TEST/EPC_TEST/play_scenario.c
new file mode 100644
index 0000000000..b2207d39d7
--- /dev/null
+++ b/openair3/TEST/EPC_TEST/play_scenario.c
@@ -0,0 +1,1250 @@
+/*******************************************************************************
+ OpenAirInterface
+ Copyright(c) 1999 - 2014 Eurecom
+
+ OpenAirInterface is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+
+ OpenAirInterface is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with OpenAirInterface.The full GNU General Public License is
+ included in this distribution in the file called "COPYING". If not,
+ see .
+
+ Contact Information
+ OpenAirInterface Admin: openair_admin@eurecom.fr
+ OpenAirInterface Tech : openair_tech@eurecom.fr
+ OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr
+
+ Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE
+
+ *******************************************************************************/
+
+/*
+ play_scenario.c
+ -------------------
+ AUTHOR : Lionel GAUTHIER
+ COMPANY : EURECOM
+ EMAIL : Lionel.Gauthier@eurecom.fr
+ */
+
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+
+
+#include "intertask_interface_init.h"
+#include "timer.h"
+#include "assertions.h"
+#include "s1ap_common.h"
+#include "intertask_interface.h"
+#include "play_scenario.h"
+#include "sctp_eNB_task.h"
+#include "sctp_default_values.h"
+#include "log.h"
+//------------------------------------------------------------------------------
+#define PLAY_SCENARIO 1
+#define GS_IS_FILE 1
+#define GS_IS_DIR 2
+//------------------------------------------------------------------------------
+Enb_properties_array_t g_enb_properties;
+int g_max_speed = 0;
+//------------------------------------------------------------------------------
+extern et_scenario_t *g_scenario;
+extern int xmlLoadExtDtdDefaultValue;
+extern int asn_debug;
+extern int asn1_xer_print;
+extern pthread_mutex_t g_fsm_lock;
+
+//------------------------------------------------------------------------------
+// MEMO:
+// Scenario with several eNBs: We may have to create ethx.y interfaces
+//
+
+
+
+//------------------------------------------------------------------------------
+// test if file exist in current directory
+int is_file_exists( const char const * file_nameP, const char const *file_roleP)
+{
+ struct stat s;
+ int err = stat(file_nameP, &s);
+ if(-1 == err) {
+ if(ENOENT == errno) {
+ fprintf(stderr, "Please provide a valid %s, %s does not exist\n", file_roleP, file_nameP);
+ } else {
+ perror("stat");
+ exit(1);
+ }
+ } else {
+ if(S_ISREG(s.st_mode)) {
+ return GS_IS_FILE;
+ } else if(S_ISDIR(s.st_mode)) {
+ return GS_IS_DIR;
+ } else {
+ fprintf(stderr, "Please provide a valid test %s, %s exists but is not found valid\n", file_roleP, file_nameP);
+ }
+ }
+ return 0;
+}
+
+
+//------------------------------------------------------------------------------
+int et_strip_extension(char *in_filename)
+{
+ static const uint8_t name_min_len = 1;
+ static const uint8_t max_ext_len = 5; // .pdml !
+ fprintf(stdout, "strip_extension %s\n", in_filename);
+
+ if (NULL != in_filename) {
+ /* Check chars starting at end of string to find last '.' */
+ for (ssize_t i = strlen(in_filename); i > name_min_len; i--) {
+ if (in_filename[i] == '.') {
+ in_filename[i] = '\0';
+ return i;
+ }
+ }
+ }
+ return -1;
+}
+//------------------------------------------------------------------------------
+// return number of splitted items
+void et_get_shift_arg( char * line_argument, shift_packet_t * const shift)
+{
+ int len = strlen(line_argument);
+ int i = 0;
+ int j = 0;
+ int num_milli = 0;
+ char my_num[64];
+ int negative = 0;
+
+
+ while ((line_argument[i] != ':') && (i < len)) {
+ if (isdigit(line_argument[i])) { // may occur '\"'
+ my_num[j++] = line_argument[i];
+ }
+ i += 1;
+ }
+ AssertFatal(':' == line_argument[i], "Bad format");
+ i += 1; // ':'
+ my_num[j++] = '\0';
+ shift->frame_number = atoi(my_num);
+ AssertFatal(ishift_seconds = atoi(my_num);
+ // may omit .mmm, accept .m or .mm or .mmm or ...
+ while ((i < len) && (num_milli++ < 3)){
+ my_num[j++] = line_argument[i++];
+ }
+ while (num_milli++ < 6){
+ my_num[j++] = '0';
+ }
+ my_num[j] = '\0';
+ shift->shift_microseconds = atoi(my_num);
+ if (negative == 1) {
+ shift->shift_seconds = - shift->shift_seconds;
+ shift->shift_microseconds = - shift->shift_microseconds;
+ }
+}
+//------------------------------------------------------------------------------
+// return number of splitted items
+int split_path( char * pathP, char *** resP)
+{
+ char * saveptr1;
+ char * p = strtok_r (pathP, "/", &saveptr1);
+ int n_spaces = 0;
+
+ /// split string and append tokens to 'res'
+ while (p) {
+ *resP = realloc (*resP, sizeof (char*) * ++n_spaces);
+ AssertFatal (*resP, "realloc failed");
+ (*resP)[n_spaces-1] = p;
+ p = strtok_r (NULL, "/", &saveptr1);
+ }
+ return n_spaces;
+}
+//------------------------------------------------------------------------------
+void et_free_packet(et_packet_t* packet)
+{
+ if (packet) {
+ switch (packet->sctp_hdr.chunk_type) {
+ case SCTP_CID_DATA:
+ et_free_pointer(packet->sctp_hdr.u.data_hdr.payload.binary_stream);
+ break;
+ default:
+ ;
+ }
+ et_free_pointer(packet);
+ }
+}
+
+//------------------------------------------------------------------------------
+void et_free_scenario(et_scenario_t* scenario)
+{
+ et_packet_t *packet = NULL;
+ et_packet_t *next_packet = NULL;
+ if (scenario) {
+ packet = scenario->list_packet;
+ while (packet) {
+ next_packet = packet->next;
+ et_free_packet(packet);
+ packet = next_packet->next;
+ }
+ et_free_pointer(scenario);
+ pthread_mutex_destroy(&g_fsm_lock);
+ }
+}
+
+//------------------------------------------------------------------------------
+char * et_ip2ip_str(const et_ip_t * const ip)
+{
+ static char str[INET6_ADDRSTRLEN];
+
+ sprintf(str, "ERROR");
+ switch (ip->address_family) {
+ case AF_INET6:
+ inet_ntop(AF_INET6, &(ip->address.ipv6), str, INET6_ADDRSTRLEN);
+ break;
+ case AF_INET:
+ inet_ntop(AF_INET, &(ip->address.ipv4), str, INET_ADDRSTRLEN);
+ break;
+ default:
+ ;
+ }
+ return str;
+}
+//------------------------------------------------------------------------------
+//convert hexstring to len bytes of data
+//returns 0 on success, negative on error
+//data is a buffer of at least len bytes
+//hexstring is upper or lower case hexadecimal, NOT prepended with "0x"
+int et_hex2data(unsigned char * const data, const unsigned char * const hexstring, const unsigned int len)
+{
+ unsigned const char *pos = hexstring;
+ char *endptr = NULL;
+ size_t count = 0;
+
+ fprintf(stdout, "%s(%s,%d)\n", __FUNCTION__, hexstring, len);
+
+ if ((len > 1) && (strlen((const char*)hexstring) % 2)) {
+ //or hexstring has an odd length
+ return -3;
+ }
+
+ if (len == 1) {
+ char buf[5] = {'0', 'x', 0, pos[0], '\0'};
+ data[0] = strtol(buf, &endptr, 16);
+ /* Check for various possible errors */
+ AssertFatal ((errno == 0) || (data[0] != 0), "ERROR %s() strtol: %s\n", __FUNCTION__, strerror(errno));
+ AssertFatal (endptr != buf, "ERROR %s() No digits were found\n", __FUNCTION__);
+ return 0;
+ }
+
+ for(count = 0; count < len/2; count++) {
+ char buf[5] = {'0', 'x', pos[0], pos[1], 0};
+ data[count] = strtol(buf, &endptr, 16);
+ pos += 2 * sizeof(char);
+ AssertFatal (endptr[0] == '\0', "ERROR %s() non-hexadecimal character encountered buf %p endptr %p buf %s count %zu pos %p\n", __FUNCTION__, buf, endptr, buf, count, pos);
+ AssertFatal (endptr != buf, "ERROR %s() No digits were found\n", __FUNCTION__);
+ }
+ return 0;
+}
+//------------------------------------------------------------------------------
+sctp_cid_t et_chunk_type_str2cid(const xmlChar * const chunk_type_str)
+{
+ if ((!xmlStrcmp(chunk_type_str, (const xmlChar *)"DATA"))) { return SCTP_CID_DATA;}
+ if ((!xmlStrcmp(chunk_type_str, (const xmlChar *)"INIT"))) { return SCTP_CID_INIT;}
+ if ((!xmlStrcmp(chunk_type_str, (const xmlChar *)"INIT_ACK"))) { return SCTP_CID_INIT_ACK;}
+ if ((!xmlStrcmp(chunk_type_str, (const xmlChar *)"SACK"))) { return SCTP_CID_SACK;}
+ if ((!xmlStrcmp(chunk_type_str, (const xmlChar *)"HEARTBEAT"))) { return SCTP_CID_HEARTBEAT;}
+ if ((!xmlStrcmp(chunk_type_str, (const xmlChar *)"HEARTBEAT_ACK"))) { return SCTP_CID_HEARTBEAT_ACK;}
+ if ((!xmlStrcmp(chunk_type_str, (const xmlChar *)"ABORT"))) { return SCTP_CID_ABORT;}
+ if ((!xmlStrcmp(chunk_type_str, (const xmlChar *)"SHUTDOWN"))) { return SCTP_CID_SHUTDOWN;}
+ if ((!xmlStrcmp(chunk_type_str, (const xmlChar *)"SHUTDOWN_ACK"))) { return SCTP_CID_SHUTDOWN_ACK;}
+ if ((!xmlStrcmp(chunk_type_str, (const xmlChar *)"ERROR"))) { return SCTP_CID_ERROR;}
+ if ((!xmlStrcmp(chunk_type_str, (const xmlChar *)"COOKIE_ECHO"))) { return SCTP_CID_COOKIE_ECHO;}
+ if ((!xmlStrcmp(chunk_type_str, (const xmlChar *)"COOKIE_ACK"))) { return SCTP_CID_COOKIE_ACK;}
+ if ((!xmlStrcmp(chunk_type_str, (const xmlChar *)"ECN_ECNE"))) { return SCTP_CID_ECN_ECNE;}
+ if ((!xmlStrcmp(chunk_type_str, (const xmlChar *)"ECN_CWR"))) { return SCTP_CID_ECN_CWR;}
+ if ((!xmlStrcmp(chunk_type_str, (const xmlChar *)"SHUTDOWN_COMPLETE"))) { return SCTP_CID_SHUTDOWN_COMPLETE;}
+ if ((!xmlStrcmp(chunk_type_str, (const xmlChar *)"AUTH"))) { return SCTP_CID_AUTH;}
+ if ((!xmlStrcmp(chunk_type_str, (const xmlChar *)"FWD_TSN"))) { return SCTP_CID_FWD_TSN;}
+ if ((!xmlStrcmp(chunk_type_str, (const xmlChar *)"ASCONF"))) { return SCTP_CID_ASCONF;}
+ if ((!xmlStrcmp(chunk_type_str, (const xmlChar *)"ASCONF_ACK"))) { return SCTP_CID_ASCONF_ACK;}
+ AssertFatal (0, "ERROR: %s() cannot convert: %s\n", __FUNCTION__, chunk_type_str);
+}
+//------------------------------------------------------------------------------
+const char * const et_chunk_type_cid2str(const sctp_cid_t chunk_type)
+{
+ switch (chunk_type) {
+ case SCTP_CID_DATA: return "DATA"; break;
+ case SCTP_CID_INIT: return "INIT"; break;
+ case SCTP_CID_INIT_ACK: return "INIT_ACK"; break;
+ case SCTP_CID_SACK: return "SACK"; break;
+ case SCTP_CID_HEARTBEAT: return "HEARTBEAT"; break;
+ case SCTP_CID_HEARTBEAT_ACK: return "HEARTBEAT_ACK"; break;
+ case SCTP_CID_ABORT: return "ABORT"; break;
+ case SCTP_CID_SHUTDOWN: return "SHUTDOWN"; break;
+ case SCTP_CID_SHUTDOWN_ACK: return "SHUTDOWN_ACK"; break;
+ case SCTP_CID_ERROR: return "ERROR"; break;
+ case SCTP_CID_COOKIE_ECHO: return "COOKIE_ECHO"; break;
+ case SCTP_CID_COOKIE_ACK: return "COOKIE_ACK"; break;
+ case SCTP_CID_ECN_ECNE: return "ECN_ECNE"; break;
+ case SCTP_CID_ECN_CWR: return "ECN_CWR"; break;
+ case SCTP_CID_SHUTDOWN_COMPLETE: return "SHUTDOWN_COMPLETE"; break;
+ case SCTP_CID_AUTH: return "AUTH"; break;
+ case SCTP_CID_FWD_TSN: return "FWD_TSN"; break;
+ case SCTP_CID_ASCONF: return "ASCONF"; break;
+ case SCTP_CID_ASCONF_ACK: return "ASCONF_ACK"; break;
+ default:
+ AssertFatal (0, "ERROR: Unknown chunk_type %d!\n", chunk_type);
+ }
+}
+//------------------------------------------------------------------------------
+const char * const et_error_match2str(const int err)
+{
+ switch (err) {
+ // from asn_compare.h
+ case COMPARE_ERR_CODE_NO_MATCH: return "CODE_NO_MATCH"; break;
+ case COMPARE_ERR_CODE_TYPE_MISMATCH: return "TYPE_MISMATCH"; break;
+ case COMPARE_ERR_CODE_TYPE_ARG_NULL: return "TYPE_ARG_NULL"; break;
+ case COMPARE_ERR_CODE_VALUE_NULL: return "VALUE_NULL"; break;
+ case COMPARE_ERR_CODE_VALUE_ARG_NULL: return "VALUE_ARG_NULL"; break;
+ case COMPARE_ERR_CODE_CHOICE_NUM: return "CHOICE_NUM"; break;
+ case COMPARE_ERR_CODE_CHOICE_PRESENT: return "CHOICE_PRESENT"; break;
+ case COMPARE_ERR_CODE_CHOICE_MALFORMED: return "CHOICE_MALFORMED"; break;
+ case COMPARE_ERR_CODE_SET_MALFORMED: return "SET_MALFORMED"; break;
+ case COMPARE_ERR_CODE_COLLECTION_NUM_ELEMENTS: return "COLLECTION_NUM_ELEMENTS"; break;
+ // from play_scenario.h
+ case ET_ERROR_MATCH_PACKET_SCTP_CHUNK_TYPE: return "SCTP_CHUNK_TYPE"; break;
+ case ET_ERROR_MATCH_PACKET_SCTP_PPID: return "SCTP_PPID"; break;
+ case ET_ERROR_MATCH_PACKET_SCTP_ASSOC_ID: return "SCTP_ASSOC_ID"; break;
+ case ET_ERROR_MATCH_PACKET_SCTP_STREAM_ID: return "SCTP_STREAM_ID"; break;
+ case ET_ERROR_MATCH_PACKET_SCTP_SSN: return "SCTP_SSN"; break;
+ case ET_ERROR_MATCH_PACKET_S1AP_PRESENT: return "S1AP_PRESENT"; break;
+ case ET_ERROR_MATCH_PACKET_S1AP_PROCEDURE_CODE: return "S1AP_PROCEDURE_CODE"; break;
+ case ET_ERROR_MATCH_PACKET_S1AP_CRITICALITY: return "S1AP_CRITICALITY"; break;
+ default:
+ AssertFatal (0, "ERROR: Unknown match error %d!(TODO handle an1c error codes)\n", err);
+ }
+}
+//------------------------------------------------------------------------------
+et_packet_action_t et_action_str2et_action_t(const xmlChar * const action)
+{
+ if ((!xmlStrcmp(action, (const xmlChar *)"SEND"))) { return ET_PACKET_ACTION_S1C_SEND;}
+ if ((!xmlStrcmp(action, (const xmlChar *)"RECEIVE"))) { return ET_PACKET_ACTION_S1C_RECEIVE;}
+ AssertFatal (0, "ERROR: cannot convert: %s\n", action);
+ //if (NULL == action) {return ACTION_S1C_NULL;}
+}
+//------------------------------------------------------------------------------
+void et_ip_str2et_ip(const xmlChar * const ip_str, et_ip_t * const ip)
+{
+ AssertFatal (NULL != ip_str, "ERROR Cannot convert null string to ip address!\n");
+ AssertFatal (NULL != ip, "ERROR out parameter pointer is NULL!\n");
+ // store this IP address in sa:
+ if (inet_pton(AF_INET, (const char*)ip_str, (void*)&(ip->address.ipv4)) > 0) {
+ ip->address_family = AF_INET;
+ strncpy((char *)ip->str, (const char *)ip_str, INET_ADDRSTRLEN+1);
+ } else if (inet_pton(AF_INET6, (const char*)ip_str, (void*)&(ip->address.ipv6)) > 0) {
+ ip->address_family = AF_INET6;
+ strncpy((char *)ip->str, (const char *)ip_str, INET6_ADDRSTRLEN+1);
+ } else {
+ ip->address_family = AF_UNSPEC;
+ AssertFatal (0, "ERROR %s() Could not parse ip address %s!\n", __FUNCTION__, ip_str);
+ }
+}
+//------------------------------------------------------------------------------
+int et_compare_et_ip_to_net_ip_address(const et_ip_t * const ip, const net_ip_address_t * const net_ip)
+{
+ AssertFatal (NULL != ip, "ERROR ip parameter\n");
+ AssertFatal (NULL != net_ip, "ERROR net_ip parameter\n");
+ switch (ip->address_family) {
+ case AF_INET:
+ if (net_ip->ipv4) {
+ //S1AP_DEBUG("%s(%s,%s)=%d\n",__FUNCTION__,ip->str, net_ip->ipv4_address, strcmp(ip->str, net_ip->ipv4_address));
+ return strcmp(ip->str, net_ip->ipv4_address);
+ }
+ //S1AP_DEBUG("%s(%s,%s)=-1 (IP version (4) not matching)\n",__FUNCTION__,ip->str, net_ip->ipv4_address);
+ return -1;
+ break;
+ case AF_INET6:
+ if (net_ip->ipv6) {
+ //S1AP_DEBUG("%s(%s,%s)=%d\n",__FUNCTION__,ip->str, net_ip->ipv4_address, strcmp(ip->str, net_ip->ipv6_address));
+ return strcmp(ip->str, net_ip->ipv6_address);
+ }
+ //S1AP_DEBUG("%s(%s,%s)=-1 (IP version (6) not matching)\n",__FUNCTION__,ip->str, net_ip->ipv6_address);
+ return -1;
+ break;
+ default:
+ S1AP_DEBUG("%s(%s,...)=-1 (unknown IP version)\n",__FUNCTION__,ip->str);
+ return -1;
+ }
+}
+
+#ifdef LIBCONFIG_LONG
+#define libconfig_int long
+#else
+#define libconfig_int int
+#endif
+//------------------------------------------------------------------------------
+void et_enb_config_init(const char const * lib_config_file_name_pP)
+//------------------------------------------------------------------------------
+{
+ config_t cfg;
+ config_setting_t *setting = NULL;
+ config_setting_t *subsetting = NULL;
+ config_setting_t *setting_mme_addresses = NULL;
+ config_setting_t *setting_mme_address = NULL;
+ config_setting_t *setting_enb = NULL;
+ libconfig_int my_int;
+ int num_enb_properties = 0;
+ int enb_properties_index = 0;
+ int num_enbs = 0;
+ int num_mme_address = 0;
+ int i = 0;
+ int j = 0;
+ int parse_errors = 0;
+ libconfig_int enb_id = 0;
+ const char* cell_type = NULL;
+ const char* tac = 0;
+ const char* enb_name = NULL;
+ const char* mcc = 0;
+ const char* mnc = 0;
+ char* ipv4 = NULL;
+ char* ipv6 = NULL;
+ char* active = NULL;
+ char* preference = NULL;
+ const char* active_enb[MAX_ENB];
+ char* enb_interface_name_for_S1U = NULL;
+ char* enb_ipv4_address_for_S1U = NULL;
+ libconfig_int enb_port_for_S1U = 0;
+ char* enb_interface_name_for_S1_MME = NULL;
+ char* enb_ipv4_address_for_S1_MME = NULL;
+ char *address = NULL;
+ char *cidr = NULL;
+
+
+ AssertFatal (lib_config_file_name_pP != NULL,
+ "Bad parameter lib_config_file_name_pP %s , must reference a valid eNB config file\n",
+ lib_config_file_name_pP);
+
+ memset((char*)active_enb, 0 , MAX_ENB * sizeof(char*));
+
+ config_init(&cfg);
+
+ /* Read the file. If there is an error, report it and exit. */
+ if (! config_read_file(&cfg, lib_config_file_name_pP)) {
+ config_destroy(&cfg);
+ AssertFatal (0, "Failed to parse eNB configuration file %s!\n", lib_config_file_name_pP);
+ }
+
+ // Get list of active eNBs, (only these will be configured)
+ setting = config_lookup(&cfg, ENB_CONFIG_STRING_ACTIVE_ENBS);
+
+ if (setting != NULL) {
+ num_enbs = config_setting_length(setting);
+
+ for (i = 0; i < num_enbs; i++) {
+ setting_enb = config_setting_get_elem(setting, i);
+ active_enb[i] = config_setting_get_string (setting_enb);
+ AssertFatal (active_enb[i] != NULL,
+ "Failed to parse config file %s, %uth attribute %s \n",
+ lib_config_file_name_pP, i, ENB_CONFIG_STRING_ACTIVE_ENBS);
+ active_enb[i] = strdup(active_enb[i]);
+ num_enb_properties += 1;
+ }
+ }
+
+ /* Output a list of all eNBs. */
+ setting = config_lookup(&cfg, ENB_CONFIG_STRING_ENB_LIST);
+
+ if (setting != NULL) {
+ enb_properties_index = g_enb_properties.number;
+ parse_errors = 0;
+ num_enbs = config_setting_length(setting);
+
+ for (i = 0; i < num_enbs; i++) {
+ setting_enb = config_setting_get_elem(setting, i);
+
+ if (! config_setting_lookup_int(setting_enb, ENB_CONFIG_STRING_ENB_ID, &enb_id)) {
+ /* Calculate a default eNB ID */
+# if defined(ENABLE_USE_MME)
+ uint32_t hash;
+
+ hash = et_s1ap_generate_eNB_id ();
+ enb_id = i + (hash & 0xFFFF8);
+# else
+ enb_id = i;
+# endif
+ }
+
+ if ( !( config_setting_lookup_string(setting_enb, ENB_CONFIG_STRING_CELL_TYPE, &cell_type)
+ && config_setting_lookup_string(setting_enb, ENB_CONFIG_STRING_ENB_NAME, &enb_name)
+ && config_setting_lookup_string(setting_enb, ENB_CONFIG_STRING_TRACKING_AREA_CODE, &tac)
+ && config_setting_lookup_string(setting_enb, ENB_CONFIG_STRING_MOBILE_COUNTRY_CODE, &mcc)
+ && config_setting_lookup_string(setting_enb, ENB_CONFIG_STRING_MOBILE_NETWORK_CODE, &mnc)
+
+
+ )
+ ) {
+ AssertError (0, parse_errors ++,
+ "Failed to parse eNB configuration file %s, %u th enb\n",
+ lib_config_file_name_pP, i);
+ continue; // FIXME this prevents segfaults below, not sure what happens after function exit
+ }
+
+ // search if in active list
+ for (j=0; j < num_enb_properties; j++) {
+ if (strcmp(active_enb[j], enb_name) == 0) {
+ g_enb_properties.properties[enb_properties_index] = calloc(1, sizeof(Enb_properties_t));
+
+ g_enb_properties.properties[enb_properties_index]->eNB_id = enb_id;
+
+ if (strcmp(cell_type, "CELL_MACRO_ENB") == 0) {
+ g_enb_properties.properties[enb_properties_index]->cell_type = CELL_MACRO_ENB;
+ } else if (strcmp(cell_type, "CELL_HOME_ENB") == 0) {
+ g_enb_properties.properties[enb_properties_index]->cell_type = CELL_HOME_ENB;
+ } else {
+ AssertError (0, parse_errors ++,
+ "Failed to parse eNB configuration file %s, enb %d unknown value \"%s\" for cell_type choice: CELL_MACRO_ENB or CELL_HOME_ENB !\n",
+ lib_config_file_name_pP, i, cell_type);
+ }
+
+ g_enb_properties.properties[enb_properties_index]->eNB_name = strdup(enb_name);
+ g_enb_properties.properties[enb_properties_index]->tac = (uint16_t)atoi(tac);
+ g_enb_properties.properties[enb_properties_index]->mcc = (uint16_t)atoi(mcc);
+ g_enb_properties.properties[enb_properties_index]->mnc = (uint16_t)atoi(mnc);
+ g_enb_properties.properties[enb_properties_index]->mnc_digit_length = strlen(mnc);
+ AssertFatal((g_enb_properties.properties[enb_properties_index]->mnc_digit_length == 2) ||
+ (g_enb_properties.properties[enb_properties_index]->mnc_digit_length == 3),
+ "BAD MNC DIGIT LENGTH %d",
+ g_enb_properties.properties[i]->mnc_digit_length);
+
+
+ setting_mme_addresses = config_setting_get_member (setting_enb, ENB_CONFIG_STRING_MME_IP_ADDRESS);
+ num_mme_address = config_setting_length(setting_mme_addresses);
+ g_enb_properties.properties[enb_properties_index]->nb_mme = 0;
+
+ for (j = 0; j < num_mme_address; j++) {
+ setting_mme_address = config_setting_get_elem(setting_mme_addresses, j);
+
+ if ( !(
+ config_setting_lookup_string(setting_mme_address, ENB_CONFIG_STRING_MME_IPV4_ADDRESS, (const char **)&ipv4)
+ && config_setting_lookup_string(setting_mme_address, ENB_CONFIG_STRING_MME_IPV6_ADDRESS, (const char **)&ipv6)
+ && config_setting_lookup_string(setting_mme_address, ENB_CONFIG_STRING_MME_IP_ADDRESS_ACTIVE, (const char **)&active)
+ && config_setting_lookup_string(setting_mme_address, ENB_CONFIG_STRING_MME_IP_ADDRESS_PREFERENCE, (const char **)&preference)
+ )
+ ) {
+ AssertError (0, parse_errors ++,
+ "Failed to parse eNB configuration file %s, %u th enb %u th mme address !\n",
+ lib_config_file_name_pP, i, j);
+ continue; // FIXME will prevent segfaults below, not sure what happens at function exit...
+ }
+
+ g_enb_properties.properties[enb_properties_index]->nb_mme += 1;
+
+ g_enb_properties.properties[enb_properties_index]->mme_ip_address[j].ipv4_address = strdup(ipv4);
+ g_enb_properties.properties[enb_properties_index]->mme_ip_address[j].ipv6_address = strdup(ipv6);
+
+ if (strcmp(active, "yes") == 0) {
+ g_enb_properties.properties[enb_properties_index]->mme_ip_address[j].active = 1;
+ } // else { (calloc)
+
+ if (strcmp(preference, "ipv4") == 0) {
+ g_enb_properties.properties[enb_properties_index]->mme_ip_address[j].ipv4 = 1;
+ } else if (strcmp(preference, "ipv6") == 0) {
+ g_enb_properties.properties[enb_properties_index]->mme_ip_address[j].ipv6 = 1;
+ } else if (strcmp(preference, "no") == 0) {
+ g_enb_properties.properties[enb_properties_index]->mme_ip_address[j].ipv4 = 1;
+ g_enb_properties.properties[enb_properties_index]->mme_ip_address[j].ipv6 = 1;
+ }
+ }
+ // SCTP SETTING
+ g_enb_properties.properties[enb_properties_index]->sctp_out_streams = SCTP_OUT_STREAMS;
+ g_enb_properties.properties[enb_properties_index]->sctp_in_streams = SCTP_IN_STREAMS;
+ subsetting = config_setting_get_member (setting_enb, ENB_CONFIG_STRING_SCTP_CONFIG);
+
+ if (subsetting != NULL) {
+ if ( (config_setting_lookup_int( subsetting, ENB_CONFIG_STRING_SCTP_INSTREAMS, &my_int) )) {
+ g_enb_properties.properties[enb_properties_index]->sctp_in_streams = (uint16_t)my_int;
+ }
+
+ if ( (config_setting_lookup_int( subsetting, ENB_CONFIG_STRING_SCTP_OUTSTREAMS, &my_int) )) {
+ g_enb_properties.properties[enb_properties_index]->sctp_out_streams = (uint16_t)my_int;
+ }
+ }
+
+
+ // NETWORK_INTERFACES
+ subsetting = config_setting_get_member (setting_enb, ENB_CONFIG_STRING_NETWORK_INTERFACES_CONFIG);
+
+ if (subsetting != NULL) {
+ if ( (
+ config_setting_lookup_string( subsetting, ENB_CONFIG_STRING_ENB_INTERFACE_NAME_FOR_S1_MME,
+ (const char **)&enb_interface_name_for_S1_MME)
+ && config_setting_lookup_string( subsetting, ENB_CONFIG_STRING_ENB_IPV4_ADDRESS_FOR_S1_MME,
+ (const char **)&enb_ipv4_address_for_S1_MME)
+ && config_setting_lookup_string( subsetting, ENB_CONFIG_STRING_ENB_INTERFACE_NAME_FOR_S1U,
+ (const char **)&enb_interface_name_for_S1U)
+ && config_setting_lookup_string( subsetting, ENB_CONFIG_STRING_ENB_IPV4_ADDR_FOR_S1U,
+ (const char **)&enb_ipv4_address_for_S1U)
+ && config_setting_lookup_int(subsetting, ENB_CONFIG_STRING_ENB_PORT_FOR_S1U,
+ &enb_port_for_S1U)
+ )
+ ) {
+ g_enb_properties.properties[enb_properties_index]->enb_interface_name_for_S1U = strdup(enb_interface_name_for_S1U);
+ cidr = enb_ipv4_address_for_S1U;
+ address = strtok(cidr, "/");
+
+ if (address) {
+ IPV4_STR_ADDR_TO_INT_NWBO ( address, g_enb_properties.properties[enb_properties_index]->enb_ipv4_address_for_S1U, "BAD IP ADDRESS FORMAT FOR eNB S1_U !\n" );
+ }
+
+ g_enb_properties.properties[enb_properties_index]->enb_port_for_S1U = enb_port_for_S1U;
+
+ g_enb_properties.properties[enb_properties_index]->enb_interface_name_for_S1_MME = strdup(enb_interface_name_for_S1_MME);
+ cidr = enb_ipv4_address_for_S1_MME;
+ address = strtok(cidr, "/");
+
+ if (address) {
+ IPV4_STR_ADDR_TO_INT_NWBO ( address, g_enb_properties.properties[enb_properties_index]->enb_ipv4_address_for_S1_MME, "BAD IP ADDRESS FORMAT FOR eNB S1_MME !\n" );
+ }
+ }
+ } // if (subsetting != NULL) {
+ enb_properties_index += 1;
+ } // if (strcmp(active_enb[j], enb_name) == 0)
+ } // for (j=0; j < num_enb_properties; j++)
+ } // for (i = 0; i < num_enbs; i++)
+ } // if (setting != NULL) {
+
+ g_enb_properties.number += num_enb_properties;
+
+
+ AssertFatal (parse_errors == 0,
+ "Failed to parse eNB configuration file %s, found %d error%s !\n",
+ lib_config_file_name_pP, parse_errors, parse_errors > 1 ? "s" : "");
+}
+/*------------------------------------------------------------------------------*/
+const Enb_properties_array_t *et_enb_config_get(void)
+{
+ return &g_enb_properties;
+}
+/*------------------------------------------------------------------------------*/
+void et_eNB_app_register(const Enb_properties_array_t *enb_properties)
+{
+ uint32_t enb_id = 0;
+ uint32_t mme_id = 0;
+ MessageDef *msg_p = NULL;
+ char *str = NULL;
+ struct in_addr addr = {.s_addr = 0};
+
+
+ g_scenario->register_enb_pending = 0;
+ for (enb_id = 0; (enb_id < enb_properties->number) ; enb_id++) {
+ {
+ s1ap_register_enb_req_t *s1ap_register_eNB = NULL;
+
+ /* note: there is an implicit relationship between the data structure and the message name */
+ msg_p = itti_alloc_new_message (TASK_ENB_APP, S1AP_REGISTER_ENB_REQ);
+
+ s1ap_register_eNB = &S1AP_REGISTER_ENB_REQ(msg_p);
+
+ /* Some default/random parameters */
+ s1ap_register_eNB->eNB_id = enb_properties->properties[enb_id]->eNB_id;
+ s1ap_register_eNB->cell_type = enb_properties->properties[enb_id]->cell_type;
+ s1ap_register_eNB->eNB_name = enb_properties->properties[enb_id]->eNB_name;
+ s1ap_register_eNB->tac = enb_properties->properties[enb_id]->tac;
+ s1ap_register_eNB->mcc = enb_properties->properties[enb_id]->mcc;
+ s1ap_register_eNB->mnc = enb_properties->properties[enb_id]->mnc;
+ s1ap_register_eNB->mnc_digit_length = enb_properties->properties[enb_id]->mnc_digit_length;
+
+ s1ap_register_eNB->nb_mme = enb_properties->properties[enb_id]->nb_mme;
+ AssertFatal (s1ap_register_eNB->nb_mme <= S1AP_MAX_NB_MME_IP_ADDRESS, "Too many MME for eNB %d (%d/%d)!", enb_id, s1ap_register_eNB->nb_mme,
+ S1AP_MAX_NB_MME_IP_ADDRESS);
+
+ for (mme_id = 0; mme_id < s1ap_register_eNB->nb_mme; mme_id++) {
+ s1ap_register_eNB->mme_ip_address[mme_id].ipv4 = enb_properties->properties[enb_id]->mme_ip_address[mme_id].ipv4;
+ s1ap_register_eNB->mme_ip_address[mme_id].ipv6 = enb_properties->properties[enb_id]->mme_ip_address[mme_id].ipv6;
+ strncpy (s1ap_register_eNB->mme_ip_address[mme_id].ipv4_address,
+ enb_properties->properties[enb_id]->mme_ip_address[mme_id].ipv4_address,
+ sizeof(s1ap_register_eNB->mme_ip_address[0].ipv4_address));
+ strncpy (s1ap_register_eNB->mme_ip_address[mme_id].ipv6_address,
+ enb_properties->properties[enb_id]->mme_ip_address[mme_id].ipv6_address,
+ sizeof(s1ap_register_eNB->mme_ip_address[0].ipv6_address));
+ }
+
+ s1ap_register_eNB->sctp_in_streams = enb_properties->properties[enb_id]->sctp_in_streams;
+ s1ap_register_eNB->sctp_out_streams = enb_properties->properties[enb_id]->sctp_out_streams;
+
+
+ s1ap_register_eNB->enb_ip_address.ipv6 = 0;
+ s1ap_register_eNB->enb_ip_address.ipv4 = 1;
+ addr.s_addr = enb_properties->properties[enb_id]->enb_ipv4_address_for_S1_MME;
+ str = inet_ntoa(addr);
+ strcpy(s1ap_register_eNB->enb_ip_address.ipv4_address, str);
+
+ g_scenario->register_enb_pending++;
+ itti_send_msg_to_task (TASK_S1AP, ENB_MODULE_ID_TO_INSTANCE(enb_id), msg_p);
+ }
+ }
+}
+/*------------------------------------------------------------------------------*/
+void *et_eNB_app_task(void *args_p)
+{
+ et_scenario_t *scenario = (et_scenario_t*)args_p;
+ MessageDef *msg_p = NULL;
+ const char *msg_name = NULL;
+ instance_t instance = 0;
+ int result = 0;
+
+ itti_mark_task_ready (TASK_ENB_APP);
+
+ do {
+ // Wait for a message
+ itti_receive_msg (TASK_ENB_APP, &msg_p);
+
+ msg_name = ITTI_MSG_NAME (msg_p);
+ instance = ITTI_MSG_INSTANCE (msg_p);
+
+ switch (ITTI_MSG_ID(msg_p)) {
+ case TERMINATE_MESSAGE:
+ itti_exit_task ();
+ break;
+
+ case S1AP_REGISTER_ENB_CNF:
+ LOG_I(ENB_APP, "[eNB %d] Received %s: associated MME %d\n", instance, msg_name,
+ S1AP_REGISTER_ENB_CNF(msg_p).nb_mme);
+
+ DevAssert(scenario->register_enb_pending > 0);
+ scenario->register_enb_pending--;
+
+ /* Check if at least eNB is registered with one MME */
+ if (S1AP_REGISTER_ENB_CNF(msg_p).nb_mme > 0) {
+ scenario->registered_enb++;
+ }
+
+ /* Check if all register eNB requests have been processed */
+ if (scenario->register_enb_pending == 0) {
+ timer_remove(scenario->enb_register_retry_timer_id);
+ if (scenario->registered_enb == scenario->enb_properties->number) {
+ /* If all eNB are registered, start scenario */
+ LOG_D(ENB_APP, " All eNB are now associated with a MME\n");
+ et_event_t event;
+ event.code = ET_EVENT_S1C_CONNECTED;
+ et_scenario_fsm_notify_event(event);
+ } else {
+ uint32_t not_associated = scenario->enb_properties->number - scenario->registered_enb;
+
+ LOG_W(ENB_APP, " %d eNB %s not associated with a MME, retrying registration in %d seconds ...\n",
+ not_associated, not_associated > 1 ? "are" : "is", ET_ENB_REGISTER_RETRY_DELAY);
+
+ /* Restart the eNB registration process in ENB_REGISTER_RETRY_DELAY seconds */
+ if (timer_setup (ET_ENB_REGISTER_RETRY_DELAY, 0, TASK_ENB_APP, INSTANCE_DEFAULT, TIMER_ONE_SHOT,
+ NULL, &scenario->enb_register_retry_timer_id) < 0) {
+ LOG_E(ENB_APP, " Can not start eNB register retry timer, use \"sleep\" instead!\n");
+
+ sleep(ET_ENB_REGISTER_RETRY_DELAY);
+ /* Restart the registration process */
+ scenario->registered_enb = 0;
+ et_eNB_app_register (scenario->enb_properties);
+ }
+ }
+ }
+
+ break;
+
+ case S1AP_DEREGISTERED_ENB_IND:
+ LOG_W(ENB_APP, "[eNB %d] Received %s: associated MME %d\n", instance, msg_name,
+ S1AP_DEREGISTERED_ENB_IND(msg_p).nb_mme);
+
+ /* TODO handle recovering of registration */
+ break;
+
+ case TIMER_HAS_EXPIRED:
+ LOG_I(ENB_APP, " Received %s: timer_id %d\n", msg_name, TIMER_HAS_EXPIRED(msg_p).timer_id);
+
+ if (TIMER_HAS_EXPIRED (msg_p).timer_id == scenario->enb_register_retry_timer_id) {
+ /* Restart the registration process */
+ scenario->registered_enb = 0;
+ et_eNB_app_register (scenario->enb_properties);
+ }
+ break;
+
+ default:
+ LOG_E(ENB_APP, "Received unexpected message %s\n", msg_name);
+ break;
+ }
+
+ result = itti_free (ITTI_MSG_ORIGIN_ID(msg_p), msg_p);
+ AssertFatal (result == EXIT_SUCCESS, "Failed to free memory (%d)!\n", result);
+ } while (1);
+ return NULL;
+}
+
+//------------------------------------------------------------------------------
+int et_play_scenario(et_scenario_t* const scenario, const struct shift_packet_s *shifts)
+{
+ et_event_t event;
+ struct shift_packet_s *shift = shifts;
+ et_packet_t *packet = NULL;
+ et_packet_t *next_packet = NULL;
+ struct timeval shift_all_packets = { .tv_sec = 0, .tv_usec = 0 };
+ struct timeval relative_last_sent_packet = { .tv_sec = 0, .tv_usec = 0 };
+ struct timeval relative_last_received_packet = { .tv_sec = 0, .tv_usec = 0 };
+ struct timeval initial_time = { .tv_sec = 0, .tv_usec = 0 };
+ char first_packet = 1;
+ char first_sent_packet = 1;
+ char first_received_packet = 1;
+
+ // first apply timing shifts if requested
+ while (shift) {
+ packet = scenario->list_packet;
+ while (packet) {
+ //fprintf(stdout, "*shift: %p\n", shift);
+ //fprintf(stdout, "\tframe_number: %d\n", shift->frame_number);
+ //fprintf(stdout, "\tshift_seconds: %ld\n", shift->shift_seconds);
+ //fprintf(stdout, "\tshift_microseconds: %ld\n", shift->shift_microseconds);
+ //fprintf(stdout, "\tsingle: %d\n\n", shift->single);
+ //fprintf(stdout, "\tshift_all_packets_seconds: %ld\n", shift_all_packets.tv_sec);
+ //fprintf(stdout, "\tshift_all_packets_microseconds: %ld\n", shift_all_packets.tv_usec);
+
+ AssertFatal((packet->time_relative_to_first_packet.tv_sec >= 0) && (packet->time_relative_to_first_packet.tv_usec >= 0),
+ "Bad timing result time_relative_to_first_packet=%d.%d packet num %u, original frame number %u",
+ packet->time_relative_to_first_packet.tv_sec,
+ packet->time_relative_to_first_packet.tv_usec,
+ packet->packet_number,
+ packet->original_frame_number);
+ AssertFatal((packet->time_relative_to_last_received_packet.tv_sec >= 0) && (packet->time_relative_to_last_received_packet.tv_usec >= 0),
+ "Bad timing result time_relative_to_last_received_packet=%d.%d packet num %u, original frame number %u",
+ packet->time_relative_to_last_received_packet.tv_sec,
+ packet->time_relative_to_last_received_packet.tv_usec,
+ packet->packet_number,
+ packet->original_frame_number);
+ AssertFatal((packet->time_relative_to_last_sent_packet.tv_sec >= 0) && (packet->time_relative_to_last_sent_packet.tv_usec >= 0),
+ "Bad timing result time_relative_to_last_sent_packet=%d.%d packet num %u, original frame number %u",
+ packet->time_relative_to_last_sent_packet.tv_sec,
+ packet->time_relative_to_last_sent_packet.tv_usec,
+ packet->packet_number,
+ packet->original_frame_number);
+// fprintf(stdout, "\tpacket num %u, original frame number %u time_relative_to_first_packet=%d.%d\n",
+// packet->packet_number,
+// packet->original_frame_number,
+// packet->time_relative_to_first_packet.tv_sec,
+// packet->time_relative_to_first_packet.tv_usec);
+// fprintf(stdout, "\tpacket num %u, original frame number %u time_relative_to_last_received_packet=%d.%d\n",
+// packet->packet_number,
+// packet->original_frame_number,
+// packet->time_relative_to_last_received_packet.tv_sec,
+// packet->time_relative_to_last_received_packet.tv_usec);
+// fprintf(stdout, "\tpacket num %u, original frame number %u time_relative_to_last_sent_packet=%d.%d\n",
+// packet->packet_number,
+// packet->original_frame_number,
+// packet->time_relative_to_last_sent_packet.tv_sec,
+// packet->time_relative_to_last_sent_packet.tv_usec);
+
+ if ((shift->single) && (shift->frame_number == packet->original_frame_number)) {
+ struct timeval t_offset = { .tv_sec = shift->shift_seconds, .tv_usec = shift->shift_microseconds };
+ et_packet_shift_timing(packet, &t_offset);
+ next_packet = packet->next;
+ if (next_packet) {
+ t_offset.tv_sec = -t_offset.tv_sec;
+ t_offset.tv_usec = -t_offset.tv_usec;
+
+ if (packet->action == ET_PACKET_ACTION_S1C_SEND) {
+ timeval_add(&next_packet->time_relative_to_last_sent_packet, &next_packet->time_relative_to_last_sent_packet, &t_offset);
+ } else if (packet->action == ET_PACKET_ACTION_S1C_RECEIVE) {
+ timeval_add(&next_packet->time_relative_to_last_received_packet, &next_packet->time_relative_to_last_received_packet, &t_offset);
+ }
+ }
+ }
+ if ((0 == shift->single) && (shift->frame_number == packet->original_frame_number)) {
+ shift_all_packets.tv_sec = shift->shift_seconds;
+ shift_all_packets.tv_usec = shift->shift_microseconds;
+ timeval_add(&packet->time_relative_to_first_packet, &packet->time_relative_to_first_packet, &shift_all_packets);
+ fprintf(stdout, "\tpacket num %u, now original frame number %u time_relative_to_first_packet=%d.%d\n",
+ packet->packet_number,
+ packet->original_frame_number,
+ packet->time_relative_to_first_packet.tv_sec,
+ packet->time_relative_to_first_packet.tv_usec);
+ AssertFatal((packet->time_relative_to_first_packet.tv_sec >= 0) && (packet->time_relative_to_first_packet.tv_usec >= 0),
+ "Bad timing result time_relative_to_first_packet=%d.%d packet num %u, original frame number %u",
+ packet->time_relative_to_first_packet.tv_sec,
+ packet->time_relative_to_first_packet.tv_usec,
+ packet->packet_number,
+ packet->original_frame_number);
+ } else if ((0 == shift->single) && (shift->frame_number < packet->original_frame_number)) {
+ timeval_add(&packet->time_relative_to_first_packet, &packet->time_relative_to_first_packet, &shift_all_packets);
+ fprintf(stdout, "\tpacket num %u, now original frame number %u time_relative_to_first_packet=%d.%d\n",
+ packet->packet_number,
+ packet->original_frame_number,
+ packet->time_relative_to_first_packet.tv_sec,
+ packet->time_relative_to_first_packet.tv_usec);
+ AssertFatal((packet->time_relative_to_first_packet.tv_sec >= 0) && (packet->time_relative_to_first_packet.tv_usec >= 0),
+ "Bad timing result time_relative_to_first_packet=%d.%d packet num %u, original frame number %u",
+ packet->time_relative_to_first_packet.tv_sec,
+ packet->time_relative_to_first_packet.tv_usec,
+ packet->packet_number,
+ packet->original_frame_number);
+ }
+ packet = packet->next;
+ }
+ shift = shift->next;
+ }
+ // now recompute time_relative_to_last_received_packet, time_relative_to_last_sent_packet
+ packet = scenario->list_packet;
+ while (packet) {
+ if (first_packet > 0) {
+ initial_time = packet->time_relative_to_first_packet;
+ packet->time_relative_to_first_packet.tv_sec = 0;
+ packet->time_relative_to_first_packet.tv_usec = 0;
+ first_packet = 0;
+ } else {
+ timersub(&packet->time_relative_to_first_packet, &initial_time,
+ &packet->time_relative_to_first_packet);
+ }
+ if (packet->action == ET_PACKET_ACTION_S1C_SEND) {
+ if (first_sent_packet > 0) {
+ relative_last_sent_packet = packet->time_relative_to_first_packet;
+ packet->time_relative_to_last_sent_packet.tv_sec = 0;
+ packet->time_relative_to_last_sent_packet.tv_usec = 0;
+ first_sent_packet = 0;
+ } else {
+ timersub(&packet->time_relative_to_first_packet, &relative_last_sent_packet,
+ &packet->time_relative_to_last_sent_packet);
+ relative_last_sent_packet = packet->time_relative_to_first_packet;
+ }
+ if (first_received_packet > 0) {
+ packet->time_relative_to_last_received_packet.tv_sec = 0;
+ packet->time_relative_to_last_received_packet.tv_usec = 0;
+ } else {
+ timersub(&packet->time_relative_to_first_packet, &relative_last_received_packet,
+ &packet->time_relative_to_last_received_packet);
+ }
+ } else if (packet->action == ET_PACKET_ACTION_S1C_RECEIVE) {
+ if (first_received_packet > 0) {
+ relative_last_received_packet.tv_sec = packet->time_relative_to_first_packet.tv_sec;
+ relative_last_received_packet.tv_usec = packet->time_relative_to_first_packet.tv_usec;
+ packet->time_relative_to_last_received_packet.tv_sec = 0;
+ packet->time_relative_to_last_received_packet.tv_usec = 0;
+ first_received_packet = 0;
+ } else {
+ timersub(&packet->time_relative_to_first_packet, &relative_last_received_packet,
+ &packet->time_relative_to_last_received_packet);
+ relative_last_received_packet = packet->time_relative_to_first_packet;
+ }
+ if (first_sent_packet > 0) {
+ packet->time_relative_to_last_sent_packet.tv_sec = 0;
+ packet->time_relative_to_last_sent_packet.tv_usec = 0;
+ } else {
+ timersub(&packet->time_relative_to_first_packet, &relative_last_sent_packet,
+ &packet->time_relative_to_last_sent_packet);
+ }
+ }
+ packet = packet->next;
+ }
+ //et_display_scenario(scenario);
+
+ // create SCTP ITTI task: same as eNB code
+ if (itti_create_task (TASK_SCTP, sctp_eNB_task, NULL) < 0) {
+ LOG_E(SCTP, "Create task for SCTP failed\n");
+ return -1;
+ }
+
+ // create S1AP ITTI task: not as same as eNB code
+ if (itti_create_task (TASK_S1AP, et_s1ap_eNB_task, NULL) < 0) {
+ LOG_E(S1AP, "Create task for S1AP failed\n");
+ return -1;
+ }
+
+ // create ENB_APP ITTI task: not as same as eNB code
+ if (itti_create_task (TASK_ENB_APP, et_eNB_app_task, scenario) < 0) {
+ LOG_E(ENB_APP, "Create task for ENB_APP failed\n");
+ return -1;
+ }
+
+ event.code = ET_EVENT_INIT;
+ event.u.init.scenario = scenario;
+ et_scenario_fsm_notify_event(event);
+
+
+ return 0;
+}
+
+//------------------------------------------------------------------------------
+static void et_usage (
+ int argc,
+ char *argv[])
+//------------------------------------------------------------------------------
+{
+ fprintf (stdout, "Please report any bug to: %s\n",PACKAGE_BUGREPORT);
+ fprintf (stdout, "Usage: %s [options]\n\n", argv[0]);
+ fprintf (stdout, "\n");
+ fprintf (stdout, "\t-d | --test-dir Directory where a set of files related to a particular test are located\n");
+ fprintf (stdout, "\t-c | --enb-conf-file Provide an eNB config file, valid for the testbed\n");
+ fprintf (stdout, "\t-D | --delay-on-exit Wait delay-in-sec before exiting\n");
+ fprintf (stdout, "\t-f | --shift-packet Shift the timing of a packet'\n");
+ fprintf (stdout, "\t-F | --shift-packets Shift the timing of packets starting at frame 'frame' included\n");
+ fprintf (stdout, "\t-m | --max-speed Play scenario as fast as possible without respecting frame timings\n");
+ fprintf (stdout, "\t-s | --scenario File name (with no path) of a test scenario that has to be replayed ()\n");
+ fprintf (stdout, "\n");
+ fprintf (stdout, "Other options:\n");
+ fprintf (stdout, "\t-h | --help Print this help and return\n");
+ fprintf (stdout, "\t-v | --version Print informations about the version of this executable\n");
+ fprintf (stdout, "\n");
+}
+
+//------------------------------------------------------------------------------
+int
+et_config_parse_opt_line (
+ int argc,
+ char *argv[],
+ char **et_dir_name,
+ char **scenario_file_name,
+ char **enb_config_file_name,
+ shift_packet_t **shifts,
+ int *delay_on_exit)
+//------------------------------------------------------------------------------
+{
+ int option = 0;
+ int rv = 0;
+ shift_packet_t *shift = NULL;
+
+ enum long_option_e {
+ LONG_OPTION_START = 0x100, /* Start after regular single char options */
+ LONG_OPTION_ENB_CONF_FILE,
+ LONG_OPTION_SCENARIO_FILE,
+ LONG_OPTION_MAX_SPEED,
+ LONG_OPTION_TEST_DIR,
+ LONG_OPTION_DELAY_EXIT,
+ LONG_OPTION_SHIFT_PACKET,
+ LONG_OPTION_SHIFT_PACKETS,
+ LONG_OPTION_HELP,
+ LONG_OPTION_VERSION
+ };
+
+ static struct option long_options[] = {
+ {"enb-conf-file", required_argument, 0, LONG_OPTION_ENB_CONF_FILE},
+ {"scenario ", required_argument, 0, LONG_OPTION_SCENARIO_FILE},
+ {"max-speed ", no_argument, 0, LONG_OPTION_MAX_SPEED},
+ {"test-dir", required_argument, 0, LONG_OPTION_TEST_DIR},
+ {"delay-on-exit", required_argument, 0, LONG_OPTION_DELAY_EXIT},
+ {"shift-packet", required_argument, 0, LONG_OPTION_SHIFT_PACKET},
+ {"shift-packets", required_argument, 0, LONG_OPTION_SHIFT_PACKETS},
+ {"help", no_argument, 0, LONG_OPTION_HELP},
+ {"version", no_argument, 0, LONG_OPTION_VERSION},
+ {NULL, 0, NULL, 0}
+ };
+
+ /*
+ * Parsing command line
+ */
+ while ((option = getopt_long (argc, argv, "vhmc:s:d:f:F", long_options, NULL)) != -1) {
+ switch (option) {
+ case LONG_OPTION_ENB_CONF_FILE:
+ case 'c':
+ if (optarg) {
+ *enb_config_file_name = strdup(optarg);
+ printf("eNB config file name is %s\n", *enb_config_file_name);
+ rv |= PLAY_SCENARIO;
+ }
+ break;
+
+ case LONG_OPTION_SCENARIO_FILE:
+ case 's':
+ if (optarg) {
+ *scenario_file_name = strdup(optarg);
+ printf("Scenario file name is %s\n", *scenario_file_name);
+ rv |= PLAY_SCENARIO;
+ }
+ break;
+
+ case LONG_OPTION_TEST_DIR:
+ case 'd':
+ if (optarg) {
+ *et_dir_name = strdup(optarg);
+ if (is_file_exists(*et_dir_name, "test dirname") != GS_IS_DIR) {
+ fprintf(stderr, "Please provide a valid test dirname, %s is not a valid directory name\n", *et_dir_name);
+ exit(1);
+ }
+ printf("Test dir name is %s\n", *et_dir_name);
+ }
+ break;
+
+ case LONG_OPTION_DELAY_EXIT:
+ case 'D':
+ if (optarg) {
+ delay_on_exit = atoi(optarg);
+ if (0 > delay_on_exit) {
+ fprintf(stderr, "Please provide a valid -D/--delay-on-exit argument, %s is not a valid value\n", delay_on_exit);
+ exit(1);
+ }
+ printf("Delay on exit is %d\n", delay_on_exit);
+ }
+ break;
+
+
+ case LONG_OPTION_SHIFT_PACKET:
+ case 'f':
+ if (optarg) {
+ if (NULL == *shifts) {
+ shift = calloc(1, sizeof (*shift));
+ *shifts = shift;
+ } else {
+ shift->next = calloc(1, sizeof (*shift));
+ shift = shift->next;
+ }
+ shift->single = 1;
+ printf("Arg Shift packet %s\n", optarg);
+ et_get_shift_arg(optarg, shift);
+ }
+ break;
+
+ case LONG_OPTION_SHIFT_PACKETS:
+ case 'F':
+ if (optarg) {
+ if (NULL == *shifts) {
+ shift = calloc(1, sizeof (*shift));
+ *shifts = shift;
+ } else {
+ shift->next = calloc(1, sizeof (*shift));
+ shift = shift->next;
+ }
+ et_get_shift_arg(optarg, shift);
+ printf("Arg Shift packets %s\n", optarg);
+ }
+ break;
+
+ case LONG_OPTION_MAX_SPEED:
+ case 'm':
+ g_max_speed = 1;
+ break;
+
+ case LONG_OPTION_VERSION:
+ case 'v':
+ printf("Version %s\n", PACKAGE_VERSION);
+ exit (0);
+ break;
+
+ case LONG_OPTION_HELP:
+ case 'h':
+ default:
+ et_usage (argc, argv);
+ exit (0);
+ }
+ }
+ if (NULL == *et_dir_name) {
+ fprintf(stderr, "Please provide a valid test dirname\n");
+ exit(1);
+ }
+ if (chdir(*et_dir_name) != 0) {
+ fprintf(stderr, "ERROR: chdir %s returned %s\n", *et_dir_name, strerror(errno));
+ exit(1);
+ }
+ if (rv & PLAY_SCENARIO) {
+ if (NULL == *enb_config_file_name) {
+ fprintf(stderr, "ERROR: please provide the original eNB config file name that should be in %s\n", *et_dir_name);
+ }
+ if (is_file_exists(*enb_config_file_name, "eNB config file") != GS_IS_FILE) {
+ fprintf(stderr, "ERROR: original eNB config file name %s is not found in dir %s\n", *enb_config_file_name, *et_dir_name);
+ }
+ et_enb_config_init(*enb_config_file_name);
+
+ if (NULL == *scenario_file_name) {
+ fprintf(stderr, "ERROR: please provide the scenario file name that should be in %s\n", *et_dir_name);
+ }
+ if (is_file_exists(*scenario_file_name, "Scenario file") != GS_IS_FILE) {
+ fprintf(stderr, "ERROR: Scenario file name %s is not found in dir %s\n", *scenario_file_name, *et_dir_name);
+ }
+ }
+ return rv;
+}
+
+//------------------------------------------------------------------------------
+int main( int argc, char **argv )
+//------------------------------------------------------------------------------
+{
+ int actions = 0;
+ char *et_dir_name = NULL;
+ char *scenario_file_name = NULL;
+ char *enb_config_file_name = NULL;
+ struct shift_packet_s *shifts = NULL;
+ int ret = 0;
+ int delay_on_exit = 0;
+ et_scenario_t *scenario = NULL;
+ char play_scenario_filename[NAME_MAX];
+
+ memset(play_scenario_filename, 0, sizeof(play_scenario_filename));
+
+ // logging
+ logInit();
+ set_glog(LOG_TRACE, LOG_MED);
+
+ itti_init(TASK_MAX, THREAD_MAX, MESSAGES_ID_MAX, tasks_info, messages_info, messages_definition_xml, NULL);
+
+ set_comp_log(ENB_APP, LOG_TRACE, LOG_MED, 1);
+ set_comp_log(S1AP, LOG_TRACE, LOG_MED, 1);
+ set_comp_log(SCTP, LOG_TRACE, LOG_FULL, 1);
+ asn_debug = 0;
+ asn1_xer_print = 1;
+
+ //parameters
+ actions = et_config_parse_opt_line (argc, argv, &et_dir_name, &scenario_file_name, &enb_config_file_name, &shifts, &delay_on_exit); //Command-line options
+ if (actions & PLAY_SCENARIO) {
+ if (et_generate_xml_scenario(et_dir_name, scenario_file_name,enb_config_file_name, play_scenario_filename) == 0) {
+ if (NULL != (scenario = et_generate_scenario(play_scenario_filename))) {
+ ret = et_play_scenario(scenario, shifts);
+ } else {
+ fprintf(stderr, "ERROR: Could not generate scenario from tsml file\n");
+ ret = -1;
+ }
+ } else {
+ fprintf(stderr, "ERROR: Could not generate tsml scenario from xml file\n");
+ ret = -1;
+ }
+ et_free_pointer(et_dir_name);
+ et_free_pointer(scenario_file_name);
+ et_free_pointer(enb_config_file_name);
+ }
+ itti_wait_tasks_end();
+ if (0 < delay_on_exit) {
+ sleep(delay_on_exit);
+ }
+ return ret;
+}
+
+
diff --git a/openair3/TEST/EPC_TEST/play_scenario.h b/openair3/TEST/EPC_TEST/play_scenario.h
new file mode 100644
index 0000000000..c1458047bd
--- /dev/null
+++ b/openair3/TEST/EPC_TEST/play_scenario.h
@@ -0,0 +1,508 @@
+/*******************************************************************************
+ OpenAirInterface
+ Copyright(c) 1999 - 2014 Eurecom
+
+ OpenAirInterface is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+
+ OpenAirInterface is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with OpenAirInterface.The full GNU General Public License is
+ included in this distribution in the file called "COPYING". If not,
+ see .
+
+ Contact Information
+ OpenAirInterface Admin: openair_admin@eurecom.fr
+ OpenAirInterface Tech : openair_tech@eurecom.fr
+ OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr
+
+ Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE
+
+*******************************************************************************/
+
+/*
+ play_scenario.h
+ -------------------
+ AUTHOR : Lionel GAUTHIER
+ COMPANY : EURECOM
+ EMAIL : Lionel.Gauthier@eurecom.fr
+*/
+
+#ifndef PLAY_SCENARIO_H_
+#define PLAY_SCENARIO_H_
+# include
+# include
+# include
+# include
+# include
+
+#include "S1AP-PDU.h"
+#include "s1ap_ies_defs.h"
+#include "play_scenario_s1ap_eNB_defs.h"
+#include "hashtable.h"
+#include "asn_compare.h"
+
+#define ET_XPATH_EXPRESSION_MAX_LENGTH 400
+
+
+// powers of 2
+#define ET_BIT_MASK_MATCH_SCTP_STREAM 1
+#define ET_BIT_MASK_MATCH_SCTP_SSN 2
+//#define ET_BIT_MASK_MATCH_S1AP_ 2
+
+#define MAX_ENB 16
+
+#define ENB_CONFIG_STRING_ACTIVE_ENBS "Active_eNBs"
+
+#define ENB_CONFIG_STRING_ENB_LIST "eNBs"
+#define ENB_CONFIG_STRING_ENB_ID "eNB_ID"
+#define ENB_CONFIG_STRING_CELL_TYPE "cell_type"
+#define ENB_CONFIG_STRING_ENB_NAME "eNB_name"
+
+#define ENB_CONFIG_STRING_TRACKING_AREA_CODE "tracking_area_code"
+#define ENB_CONFIG_STRING_MOBILE_COUNTRY_CODE "mobile_country_code"
+#define ENB_CONFIG_STRING_MOBILE_NETWORK_CODE "mobile_network_code"
+
+
+#define ENB_CONFIG_STRING_MME_IP_ADDRESS "mme_ip_address"
+#define ENB_CONFIG_STRING_MME_IPV4_ADDRESS "ipv4"
+#define ENB_CONFIG_STRING_MME_IPV6_ADDRESS "ipv6"
+#define ENB_CONFIG_STRING_MME_IP_ADDRESS_ACTIVE "active"
+#define ENB_CONFIG_STRING_MME_IP_ADDRESS_PREFERENCE "preference"
+
+#define ENB_CONFIG_STRING_SCTP_CONFIG "SCTP"
+#define ENB_CONFIG_STRING_SCTP_INSTREAMS "SCTP_INSTREAMS"
+#define ENB_CONFIG_STRING_SCTP_OUTSTREAMS "SCTP_OUTSTREAMS"
+
+#define ENB_CONFIG_STRING_NETWORK_INTERFACES_CONFIG "NETWORK_INTERFACES"
+#define ENB_CONFIG_STRING_ENB_INTERFACE_NAME_FOR_S1_MME "ENB_INTERFACE_NAME_FOR_S1_MME"
+#define ENB_CONFIG_STRING_ENB_IPV4_ADDRESS_FOR_S1_MME "ENB_IPV4_ADDRESS_FOR_S1_MME"
+#define ENB_CONFIG_STRING_ENB_INTERFACE_NAME_FOR_S1U "ENB_INTERFACE_NAME_FOR_S1U"
+#define ENB_CONFIG_STRING_ENB_IPV4_ADDR_FOR_S1U "ENB_IPV4_ADDRESS_FOR_S1U"
+#define ENB_CONFIG_STRING_ENB_PORT_FOR_S1U "ENB_PORT_FOR_S1U"
+
+
+typedef struct shift_packet_s {
+ unsigned int frame_number; // original frame number
+ int shift_seconds;
+ int shift_microseconds;
+ int single; // shift timing only for this packet (not also following packets)
+ struct shift_packet_s *next;
+} shift_packet_t;
+
+
+typedef struct mme_ip_address_s {
+ unsigned ipv4:1;
+ unsigned ipv6:1;
+ unsigned active:1;
+ char *ipv4_address;
+ char *ipv6_address;
+} mme_ip_address_t;
+
+#define IPV4_STR_ADDR_TO_INT_NWBO(AdDr_StR,NwBo,MeSsAgE ) do {\
+ struct in_addr inp;\
+ if ( inet_aton(AdDr_StR, &inp ) < 0 ) {\
+ AssertFatal (0, MeSsAgE);\
+ } else {\
+ NwBo = inp.s_addr;\
+ }\
+ } while (0);
+
+
+typedef struct Enb_properties_s {
+ /* Unique eNB_id to identify the eNB within EPC.
+ * For macro eNB ids this field should be 20 bits long.
+ * For home eNB ids this field should be 28 bits long.
+ */
+ uint32_t eNB_id;
+
+ /* The type of the cell */
+ enum cell_type_e cell_type;
+
+ /* Optional name for the cell
+ * NOTE: the name can be NULL (i.e no name) and will be cropped to 150
+ * characters.
+ */
+ char *eNB_name;
+
+ /* Tracking area code */
+ uint16_t tac;
+
+ /* Mobile Country Code
+ * Mobile Network Code
+ */
+ uint16_t mcc;
+ uint16_t mnc;
+ uint8_t mnc_digit_length;
+
+
+
+ /* Physical parameters */
+
+ int16_t Nid_cell[1+MAX_NUM_CCs];// for testing, change later
+ /* Nb of MME to connect to */
+ uint8_t nb_mme;
+ /* List of MME to connect to */
+ mme_ip_address_t mme_ip_address[S1AP_MAX_NB_MME_IP_ADDRESS];
+
+ int sctp_in_streams;
+ int sctp_out_streams;
+
+ char *enb_interface_name_for_S1U;
+ in_addr_t enb_ipv4_address_for_S1U;
+ tcp_udp_port_t enb_port_for_S1U;
+
+ char *enb_interface_name_for_S1_MME;
+ in_addr_t enb_ipv4_address_for_S1_MME;
+
+} Enb_properties_t;
+
+typedef struct Enb_properties_array_s {
+ int number;
+ Enb_properties_t *properties[MAX_ENB];
+} Enb_properties_array_t;
+
+# define ET_ENB_REGISTER_RETRY_DELAY 3
+# define ET_FSM_STATE_WAITING_RX_EVENT_DELAY_SEC 15
+
+typedef enum {
+ ET_PACKET_STATUS_START = 0,
+ ET_PACKET_STATUS_NONE = ET_PACKET_STATUS_START,
+ ET_PACKET_STATUS_NOT_TAKEN_IN_ACCOUNT,
+ ET_PACKET_STATUS_SCHEDULED_FOR_SENDING,
+ ET_PACKET_STATUS_SENT,
+ ET_PACKET_STATUS_SCHEDULED_FOR_RECEIVING,
+ ET_PACKET_STATUS_RECEIVED,
+ ET_PACKET_STATUS_END
+} et_packet_status_t;
+
+typedef enum {
+ ET_FSM_STATE_START = 0,
+ ET_FSM_STATE_NULL = ET_FSM_STATE_START,
+ ET_FSM_STATE_CONNECTING_S1C,
+ ET_FSM_STATE_WAITING_RX_EVENT,
+ ET_FSM_STATE_WAITING_TX_EVENT,
+ ET_FSM_STATE_RUNNING,
+ ET_FSM_STATE_END
+} et_fsm_state_t;
+
+enum COMPARE_ERR_CODE_e;
+
+typedef enum {
+ ET_ERROR_MATCH_START = COMPARE_ERR_CODE_END,
+ ET_ERROR_MATCH_PACKET_SCTP_CHUNK_TYPE = ET_ERROR_MATCH_START,
+ ET_ERROR_MATCH_PACKET_SCTP_PPID,
+ ET_ERROR_MATCH_PACKET_SCTP_ASSOC_ID,
+ ET_ERROR_MATCH_PACKET_SCTP_STREAM_ID,
+ ET_ERROR_MATCH_PACKET_SCTP_SSN,
+ ET_ERROR_MATCH_PACKET_S1AP_PRESENT,
+ ET_ERROR_MATCH_PACKET_S1AP_PROCEDURE_CODE,
+ ET_ERROR_MATCH_PACKET_S1AP_CRITICALITY,
+ ET_ERROR_MATCH_END
+} et_error_match_code_t;
+
+
+
+
+typedef enum {
+ ET_PACKET_ACTION_S1C_START = 0,
+ ET_PACKET_ACTION_S1C_NULL = ET_PACKET_ACTION_S1C_START,
+ ET_PACKET_ACTION_S1C_SEND,
+ ET_PACKET_ACTION_S1C_RECEIVE,
+ ET_PACKET_ACTION_S1C_END
+} et_packet_action_t;
+
+// from kernel source file 3.19/include/linux/sctp.h
+typedef enum {
+ SCTP_CID_DATA = 0,
+ SCTP_CID_INIT = 1,
+ SCTP_CID_INIT_ACK = 2,
+ SCTP_CID_SACK = 3,
+ SCTP_CID_HEARTBEAT = 4,
+ SCTP_CID_HEARTBEAT_ACK = 5,
+ SCTP_CID_ABORT = 6,
+ SCTP_CID_SHUTDOWN = 7,
+ SCTP_CID_SHUTDOWN_ACK = 8,
+ SCTP_CID_ERROR = 9,
+ SCTP_CID_COOKIE_ECHO = 10,
+ SCTP_CID_COOKIE_ACK = 11,
+ SCTP_CID_ECN_ECNE = 12,
+ SCTP_CID_ECN_CWR = 13,
+ SCTP_CID_SHUTDOWN_COMPLETE = 14,
+
+ /* AUTH Extension Section 4.1 */
+ SCTP_CID_AUTH = 0x0F,
+
+ /* PR-SCTP Sec 3.2 */
+ SCTP_CID_FWD_TSN = 0xC0,
+
+ /* Use hex, as defined in ADDIP sec. 3.1 */
+ SCTP_CID_ASCONF = 0xC1,
+ SCTP_CID_ASCONF_ACK = 0x80,
+} sctp_cid_t; /* enum */
+
+typedef enum {
+ TEST_S1AP_PDU_TYPE_START = 0,
+ TEST_S1AP_PDU_TYPE_UNKNOWN = TEST_S1AP_PDU_TYPE_START,
+ TEST_S1AP_PDU_TYPE_INITIATING,
+ TEST_S1AP_PDU_TYPE_SUCCESSFUL_OUTCOME,
+ TEST_S1AP_PDU_TYPE_UNSUCCESSFUL_OUTCOME,
+ TEST_S1AP_PDU_TYPE_END
+} et_s1ap_pdu_type_t;
+
+
+typedef struct et_s1ap_s {
+ //et_s1ap_pdu_type_t pdu_type;
+ S1AP_PDU_t pdu; // decoded ASN1 C type: choice of initiatingMessage, successfulOutcome, unsuccessfulOutcome
+ uint16_t xml_stream_pos_offset;
+ uint16_t binary_stream_pos;
+ uint16_t binary_stream_allocated_size;
+ uint8_t *binary_stream;
+ s1ap_message message; // decoded message: information elements
+ xmlDocPtr doc; // XML representation of the S1AP PDU
+} et_s1ap_t;
+
+
+// from kernel source file 3.19/include/linux/sctp.h, Big Endians
+typedef struct sctp_datahdr_s {
+ uint32_t tsn;
+ uint16_t stream;
+ uint16_t ssn;
+ uint32_t ppid;
+ uint32_t assoc_id; // filled when running scenario
+ et_s1ap_t payload;
+} sctp_datahdr_t;
+
+// from kernel source file 3.19/include/linux/sctp.h, Big Endians
+typedef struct sctp_inithdr {
+ uint32_t init_tag;
+ uint32_t a_rwnd;
+ uint16_t num_outbound_streams;
+ uint16_t num_inbound_streams;
+ uint32_t initial_tsn;
+ uint8_t params[0];
+} sctp_inithdr_t;
+
+typedef sctp_inithdr_t sctp_initackhdr_t;
+
+typedef struct et_sctp_hdr_s {
+ unsigned int src_port;
+ unsigned int dst_port;
+ sctp_cid_t chunk_type;
+ union {
+ sctp_datahdr_t data_hdr;
+ sctp_inithdr_t init_hdr;
+ sctp_initackhdr_t init_ack_hdr;
+ } u;
+} et_sctp_hdr_t;
+
+typedef struct et_ip_s {
+ unsigned int address_family; // AF_INET, AF_INET6
+ union {
+ struct in6_addr ipv6;
+ in_addr_t ipv4;
+ }address;
+ char str[INET6_ADDRSTRLEN+1];
+}et_ip_t;
+
+typedef struct et_ip_hdr_s {
+ et_ip_t src;
+ et_ip_t dst;
+} et_ip_hdr_t;
+
+typedef struct et_packet_s {
+ et_packet_action_t action;
+ struct timeval time_relative_to_first_packet;
+ struct timeval time_relative_to_last_sent_packet;
+ struct timeval time_relative_to_last_received_packet;
+ unsigned int original_frame_number;
+ unsigned int packet_number;
+ instance_t enb_instance;
+ et_ip_hdr_t ip_hdr;
+ et_sctp_hdr_t sctp_hdr;
+ struct et_packet_s *next;
+
+ //scenario running vars
+ et_packet_status_t status;
+ long timer_id; // ITTI timer id for waiting rx packets
+ struct timeval timestamp_packet; // timestamp when rx or tx packet
+}et_packet_t;
+
+
+typedef struct sctp_epoll_s {
+ /* Array of events monitored by the task.
+ * By default only one fd is monitored (the one used to received messages
+ * from other tasks).
+ * More events can be suscribed later by the task itself.
+ */
+ struct epoll_event *events;
+
+ int epoll_nb_events;
+
+} thread_desc_t;
+
+typedef struct et_scenario_s {
+ xmlChar *name;
+ et_packet_t *list_packet;
+ //--------------------------
+ // playing scenario
+ //--------------------------
+ Enb_properties_array_t *enb_properties;
+ uint32_t register_enb_pending;
+ uint32_t registered_enb;
+ long enb_register_retry_timer_id;
+
+
+ hash_table_t *hash_mme2association_id;
+ hash_table_t *hash_old_ue_mme_id2ue_mme_id;
+ struct timeval time_last_tx_packet; // Time last sent packet
+ struct timeval time_last_rx_packet; // Time last packet received with all previous scenario RX packet received.
+ et_packet_t *last_rx_packet; // Last packet received with all previous scenario RX packet received.
+ et_packet_t *last_tx_packet; // Last sent packet
+ et_packet_t *next_packet; // Next packet to be handled in the scenario (RX or TX packet)
+
+ int timer_count;
+} et_scenario_t;
+
+
+typedef enum {
+ ET_EVENT_START = 0,
+ ET_EVENT_INIT = ET_EVENT_START,
+ ET_EVENT_S1C_CONNECTED,
+ ET_EVENT_RX_SCTP_EVENT,
+ ET_EVENT_RX_S1AP,
+ ET_EVENT_RX_PACKET_TIME_OUT,
+ ET_EVENT_TX_TIMED_PACKET,
+ ET_EVENT_TICK,
+ ET_EVENT_END
+} et_event_code_t;
+
+typedef struct et_event_init_s {
+ et_scenario_t *scenario;
+} et_event_init_t;
+
+typedef struct et_event_s1ap_data_ind_s {
+ sctp_datahdr_t sctp_datahdr;
+} et_event_s1ap_data_ind_t;
+
+typedef struct et_event_s1ap_data_req_s {
+
+} et_event_s1ap_data_req_t;
+
+typedef struct et_event_s {
+ et_event_code_t code;
+ union {
+ et_event_init_t init;
+ et_event_s1ap_data_ind_t s1ap_data_ind;
+ et_packet_t *tx_timed_packet;
+ et_packet_t *rx_packet_time_out;
+ } u;
+} et_event_t;
+
+inline void et_free_pointer(void *p) {if (NULL != p) {free(p); p=NULL;}};
+
+//-------------------------
+void et_free_packet(et_packet_t* packet);
+void et_free_scenario(et_scenario_t* scenario);
+//-------------------------
+void et_display_packet_s1ap_data(const et_s1ap_t * const s1ap);
+void et_display_packet_sctp_init(const sctp_inithdr_t * const sctp);
+void et_display_packet_sctp_initack(const sctp_initackhdr_t * const sctp);
+void et_display_packet_sctp_data(const sctp_datahdr_t * const sctp);
+void et_display_packet_sctp(const et_sctp_hdr_t * const sctp);
+void et_display_packet_ip(const et_ip_hdr_t * const ip);
+void et_display_packet(const et_packet_t * const packet);
+void et_display_scenario(const et_scenario_t * const scenario);
+//-------------------------
+int et_s1ap_decode_initiating_message(s1ap_message *message, S1ap_InitiatingMessage_t *initiating_p);
+int et_s1ap_decode_successful_outcome(s1ap_message *message, S1ap_SuccessfulOutcome_t *successfullOutcome_p);
+int et_s1ap_decode_unsuccessful_outcome(s1ap_message *message, S1ap_UnsuccessfulOutcome_t *unSuccessfullOutcome_p);
+int et_s1ap_decode_pdu(S1AP_PDU_t * const pdu, s1ap_message * const message, const uint8_t * const buffer, const uint32_t length);
+void et_decode_s1ap(et_s1ap_t * const s1ap);
+//-------------------------
+int et_s1ap_eNB_compare_assoc_id( struct s1ap_eNB_mme_data_s *p1, struct s1ap_eNB_mme_data_s *p2);
+uint32_t et_s1ap_generate_eNB_id(void);
+uint16_t et_s1ap_eNB_fetch_add_global_cnx_id(void);
+void et_s1ap_eNB_prepare_internal_data(void);
+void et_s1ap_eNB_insert_new_instance(s1ap_eNB_instance_t *new_instance_p);
+struct s1ap_eNB_mme_data_s *et_s1ap_eNB_get_MME(s1ap_eNB_instance_t *instance_p,int32_t assoc_id, uint16_t cnx_id);
+s1ap_eNB_instance_t *et_s1ap_eNB_get_instance(instance_t instance);
+void et_s1ap_eNB_itti_send_sctp_data_req(instance_t instance, int32_t assoc_id, uint8_t *buffer,uint32_t buffer_length, uint16_t stream);
+int et_handle_s1ap_mismatch_mme_ue_s1ap_id(et_packet_t * const spacket, et_packet_t * const rx_packet);
+asn_comp_rval_t* et_s1ap_is_matching(et_s1ap_t * const s1ap1, et_s1ap_t * const s1ap2, const uint32_t constraints);
+et_packet_t* et_build_packet_from_s1ap_data_ind(et_event_s1ap_data_ind_t * const s1ap_data_ind);
+int et_scenario_set_packet_received(et_packet_t * const packet);
+int et_s1ap_process_rx_packet(et_event_s1ap_data_ind_t * const sctp_data_ind);
+void et_s1ap_eNB_handle_sctp_data_ind(sctp_data_ind_t * const sctp_data_ind);
+void et_s1ap_eNB_register_mme(s1ap_eNB_instance_t *instance_p,
+ net_ip_address_t *mme_ip_address,
+ net_ip_address_t *local_ip_addr,
+ uint16_t in_streams,
+ uint16_t out_streams);
+void et_s1ap_handle_s1_setup_message(s1ap_eNB_mme_data_t *mme_desc_p, int sctp_shutdown);
+void et_s1ap_eNB_handle_register_eNB(instance_t instance, s1ap_register_enb_req_t *s1ap_register_eNB);
+void et_s1ap_eNB_handle_sctp_association_resp(instance_t instance, sctp_new_association_resp_t *sctp_new_association_resp);
+void * et_s1ap_eNB_task(void *arg);
+//-------------------------
+int et_generate_xml_scenario(
+ const char const * xml_in_dir_name,
+ const char const * xml_in_scenario_filename,
+ const char const * enb_config_filename,
+ char const * tsml_out_scenario_filename);
+//-------------------------
+void timeval_add (struct timeval * const result, const struct timeval * const a, const struct timeval * const b);
+int timeval_subtract (struct timeval * const result, struct timeval * const a, struct timeval * const b);
+void et_scenario_wait_rx_packet(et_packet_t * const packet);
+void et_scenario_schedule_tx_packet(et_packet_t * packet);
+et_fsm_state_t et_scenario_fsm_notify_event_state_running(et_event_t event);
+et_fsm_state_t et_scenario_fsm_notify_event_state_waiting_tx(et_event_t event);
+et_fsm_state_t et_scenario_fsm_notify_event_state_waiting_rx(et_event_t event);
+et_fsm_state_t et_scenario_fsm_notify_event_state_connecting_s1c(et_event_t event);
+et_fsm_state_t et_scenario_fsm_notify_event_state_null(et_event_t event);
+et_fsm_state_t et_scenario_fsm_notify_event(et_event_t event);
+//-------------------------
+void et_parse_s1ap(xmlDocPtr doc, const xmlNode const *s1ap_node, et_s1ap_t * const s1ap);
+void et_parse_sctp_data_chunk(xmlDocPtr doc, const xmlNode const *sctp_node, sctp_datahdr_t * const sctp_hdr);
+void et_parse_sctp_init_chunk(xmlDocPtr doc, const xmlNode const *sctp_node, sctp_inithdr_t * const sctp_hdr);
+void et_parse_sctp_init_ack_chunk(xmlDocPtr doc, const xmlNode const *sctp_node, sctp_initackhdr_t * const sctp_hdr);
+void et_parse_sctp(xmlDocPtr doc, const xmlNode const *sctp_node, et_sctp_hdr_t * const sctp_hdr);
+et_packet_t* et_parse_xml_packet(xmlDocPtr doc, xmlNodePtr node);
+et_scenario_t* et_generate_scenario(const char * const et_scenario_filename);
+//-------------------------
+asn_comp_rval_t * et_s1ap_ies_is_matching(const S1AP_PDU_PR present, s1ap_message * const m1, s1ap_message * const m2, const uint32_t constraints);
+void update_xpath_node_mme_ue_s1ap_id(et_s1ap_t * const s1ap, xmlNode *node, const S1ap_MME_UE_S1AP_ID_t new_id);
+void update_xpath_nodes_mme_ue_s1ap_id(et_s1ap_t * const s1ap_payload, xmlNodeSetPtr nodes, const S1ap_MME_UE_S1AP_ID_t new_id);
+int et_s1ap_update_mme_ue_s1ap_id(et_packet_t * const packet, const S1ap_MME_UE_S1AP_ID_t old_id, const S1ap_MME_UE_S1AP_ID_t new_id);
+//-------------------------
+asn_comp_rval_t * et_sctp_data_is_matching(sctp_datahdr_t * const sctp1, sctp_datahdr_t * const sctp2, const uint32_t constraints);
+asn_comp_rval_t * et_sctp_is_matching(et_sctp_hdr_t * const sctp1, et_sctp_hdr_t * const sctp2, const uint32_t constraints);
+//------------------------------------------------------------------------------
+void et_print_hex_octets(const unsigned char * const byte_stream, const unsigned long int num);
+int et_is_file_exists ( const char const * file_nameP, const char const *file_roleP);
+int et_strip_extension( char *in_filename);
+void et_get_shift_arg( char * line_argument, shift_packet_t * const shift);
+int et_split_path ( char * pathP, char *** resP);
+void et_display_node ( xmlNodePtr node, unsigned int indent);
+void et_display_tree ( xmlNodePtr node, unsigned int indent);
+char * et_ip2ip_str(const et_ip_t * const ip);
+int et_compare_et_ip_to_net_ip_address(const et_ip_t * const ip, const net_ip_address_t * const net_ip);
+int et_hex2data(unsigned char * const data, const unsigned char * const hexstring, const unsigned int len);
+sctp_cid_t et_chunk_type_str2cid(const xmlChar * const chunk_type_str);
+const char * const et_chunk_type_cid2str(const sctp_cid_t chunk_type);
+const char * const et_error_match2str(const int err);
+et_packet_action_t et_action_str2et_action_t(const xmlChar * const action);
+void et_ip_str2et_ip(const xmlChar * const ip_str, et_ip_t * const ip);
+void et_enb_config_init(const char const * lib_config_file_name_pP);
+const Enb_properties_array_t *et_enb_config_get(void);
+void et_eNB_app_register(const Enb_properties_array_t *enb_properties);
+void *et_eNB_app_task(void *args_p);
+int et_play_scenario(et_scenario_t* const scenario, const struct shift_packet_s *shifts);
+
+#endif /* PLAY_SCENARIO_H_ */
diff --git a/openair3/TEST/EPC_TEST/play_scenario_decode.c b/openair3/TEST/EPC_TEST/play_scenario_decode.c
new file mode 100644
index 0000000000..aba1703eb3
--- /dev/null
+++ b/openair3/TEST/EPC_TEST/play_scenario_decode.c
@@ -0,0 +1,214 @@
+/*******************************************************************************
+ OpenAirInterface
+ Copyright(c) 1999 - 2014 Eurecom
+
+ OpenAirInterface is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+
+ OpenAirInterface is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with OpenAirInterface.The full GNU General Public License is
+ included in this distribution in the file called "COPYING". If not,
+ see .
+
+ Contact Information
+ OpenAirInterface Admin: openair_admin@eurecom.fr
+ OpenAirInterface Tech : openair_tech@eurecom.fr
+ OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr
+
+ Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE
+
+ *******************************************************************************/
+
+/*
+ play_scenario_decode.c
+ -------------------
+ AUTHOR : Lionel GAUTHIER
+ COMPANY : EURECOM
+ EMAIL : Lionel.Gauthier@eurecom.fr
+ */
+
+#include "intertask_interface.h"
+#include "platform_types.h"
+#include "s1ap_ies_defs.h"
+#include "s1ap_eNB_decoder.h"
+#include "assertions.h"
+#include "play_scenario.h"
+
+//------------------------------------------------------------------------------
+int et_s1ap_decode_initiating_message(s1ap_message *message, S1ap_InitiatingMessage_t *initiating_p)
+{
+ int ret = -1;
+
+ DevAssert(initiating_p != NULL);
+
+ message->procedureCode = initiating_p->procedureCode;
+ message->criticality = initiating_p->criticality;
+
+ switch(initiating_p->procedureCode) {
+ case S1ap_ProcedureCode_id_downlinkNASTransport:
+ ret = s1ap_decode_s1ap_downlinknastransporties(&message->msg.s1ap_DownlinkNASTransportIEs,&initiating_p->value);
+ break;
+
+ case S1ap_ProcedureCode_id_InitialContextSetup:
+ ret = s1ap_decode_s1ap_initialcontextsetuprequesties(&message->msg.s1ap_InitialContextSetupRequestIEs, &initiating_p->value);
+ break;
+
+ case S1ap_ProcedureCode_id_UEContextRelease:
+ ret = s1ap_decode_s1ap_uecontextreleasecommandies(&message->msg.s1ap_UEContextReleaseCommandIEs, &initiating_p->value);
+ break;
+
+ case S1ap_ProcedureCode_id_Paging:
+ ret = s1ap_decode_s1ap_pagingies(&message->msg.s1ap_PagingIEs, &initiating_p->value);
+ break;
+
+ case S1ap_ProcedureCode_id_uplinkNASTransport:
+ ret = s1ap_decode_s1ap_uplinknastransporties (&message->msg.s1ap_UplinkNASTransportIEs, &initiating_p->value);
+ break;
+
+ case S1ap_ProcedureCode_id_S1Setup:
+ ret = s1ap_decode_s1ap_s1setuprequesties (&message->msg.s1ap_S1SetupRequestIEs, &initiating_p->value);
+ break;
+
+ case S1ap_ProcedureCode_id_initialUEMessage:
+ ret = s1ap_decode_s1ap_initialuemessageies (&message->msg.s1ap_InitialUEMessageIEs, &initiating_p->value);
+ break;
+
+ case S1ap_ProcedureCode_id_UEContextReleaseRequest:
+ ret = s1ap_decode_s1ap_uecontextreleaserequesties (&message->msg.s1ap_UEContextReleaseRequestIEs, &initiating_p->value);
+ break;
+
+ case S1ap_ProcedureCode_id_UECapabilityInfoIndication:
+ ret = s1ap_decode_s1ap_uecapabilityinfoindicationies (&message->msg.s1ap_UECapabilityInfoIndicationIEs, &initiating_p->value);
+ break;
+
+ case S1ap_ProcedureCode_id_NASNonDeliveryIndication:
+ ret = s1ap_decode_s1ap_nasnondeliveryindication_ies (&message->msg.s1ap_NASNonDeliveryIndication_IEs, &initiating_p->value);
+ break;
+
+ default:
+ AssertFatal( 0 , "Unknown procedure ID (%d) for initiating message\n",
+ (int)initiating_p->procedureCode);
+ return -1;
+ }
+ return ret;
+}
+
+//------------------------------------------------------------------------------
+int et_s1ap_decode_successful_outcome(s1ap_message *message, S1ap_SuccessfulOutcome_t *successfullOutcome_p)
+{
+ int ret = -1;
+
+ DevAssert(successfullOutcome_p != NULL);
+
+ message->procedureCode = successfullOutcome_p->procedureCode;
+ message->criticality = successfullOutcome_p->criticality;
+
+ switch(successfullOutcome_p->procedureCode) {
+ case S1ap_ProcedureCode_id_S1Setup:
+ ret = s1ap_decode_s1ap_s1setupresponseies(
+ &message->msg.s1ap_S1SetupResponseIEs, &successfullOutcome_p->value);
+ break;
+
+ case S1ap_ProcedureCode_id_InitialContextSetup:
+ ret = s1ap_decode_s1ap_initialcontextsetupresponseies (&message->msg.s1ap_InitialContextSetupResponseIEs, &successfullOutcome_p->value);
+ break;
+
+ case S1ap_ProcedureCode_id_UEContextRelease:
+ ret = s1ap_decode_s1ap_uecontextreleasecompleteies (&message->msg.s1ap_UEContextReleaseCompleteIEs, &successfullOutcome_p->value);
+ break;
+
+ default:
+ AssertFatal(0, "Unknown procedure ID (%d) for successfull outcome message\n",
+ (int)successfullOutcome_p->procedureCode);
+ return -1;
+ }
+ return ret;
+}
+
+//------------------------------------------------------------------------------
+int et_s1ap_decode_unsuccessful_outcome(s1ap_message *message, S1ap_UnsuccessfulOutcome_t *unSuccessfullOutcome_p)
+{
+ int ret = -1;
+
+ DevAssert(unSuccessfullOutcome_p != NULL);
+
+ message->procedureCode = unSuccessfullOutcome_p->procedureCode;
+ message->criticality = unSuccessfullOutcome_p->criticality;
+
+ switch(unSuccessfullOutcome_p->procedureCode) {
+ case S1ap_ProcedureCode_id_S1Setup:
+ ret = s1ap_decode_s1ap_s1setupfailureies(&message->msg.s1ap_S1SetupFailureIEs, &unSuccessfullOutcome_p->value);
+ break;
+
+ case S1ap_ProcedureCode_id_InitialContextSetup:
+ ret = s1ap_decode_s1ap_initialcontextsetupfailureies (&message->msg.s1ap_InitialContextSetupFailureIEs, &unSuccessfullOutcome_p->value);
+ break;
+
+ default:
+ AssertFatal(0,"Unknown procedure ID (%d) for unsuccessfull outcome message\n",
+ (int)unSuccessfullOutcome_p->procedureCode);
+ break;
+ }
+ return ret;
+}
+
+//------------------------------------------------------------------------------
+int et_s1ap_decode_pdu(S1AP_PDU_t * const pdu, s1ap_message * const message, const uint8_t * const buffer, const uint32_t length)
+{
+ asn_dec_rval_t dec_ret;
+
+ DevAssert(buffer != NULL);
+
+ memset((void *)pdu, 0, sizeof(S1AP_PDU_t));
+
+ dec_ret = aper_decode(NULL,
+ &asn_DEF_S1AP_PDU,
+ (void **)&pdu,
+ buffer,
+ length,
+ 0,
+ 0);
+
+ if (dec_ret.code != RC_OK) {
+ S1AP_ERROR("Failed to decode pdu\n");
+ return -1;
+ }
+
+ message->direction = pdu->present;
+
+ switch(pdu->present) {
+ case S1AP_PDU_PR_initiatingMessage:
+ return et_s1ap_decode_initiating_message(message,
+ &pdu->choice.initiatingMessage);
+
+ case S1AP_PDU_PR_successfulOutcome:
+ return et_s1ap_decode_successful_outcome(message,
+ &pdu->choice.successfulOutcome);
+
+ case S1AP_PDU_PR_unsuccessfulOutcome:
+ return et_s1ap_decode_unsuccessful_outcome(message,
+ &pdu->choice.unsuccessfulOutcome);
+
+ default:
+ AssertFatal(0, "Unknown presence (%d) or not implemented\n", (int)pdu->present);
+ break;
+ }
+ return -1;
+}
+//------------------------------------------------------------------------------
+void et_decode_s1ap(et_s1ap_t * const s1ap)
+{
+ if (NULL != s1ap) {
+ if (et_s1ap_decode_pdu(&s1ap->pdu, &s1ap->message, s1ap->binary_stream, s1ap->binary_stream_allocated_size) < 0) {
+ AssertFatal (0, "ERROR %s() Cannot decode S1AP message!\n", __FUNCTION__);
+ }
+ }
+}
diff --git a/openair3/TEST/EPC_TEST/play_scenario_display.c b/openair3/TEST/EPC_TEST/play_scenario_display.c
new file mode 100644
index 0000000000..2a924e952c
--- /dev/null
+++ b/openair3/TEST/EPC_TEST/play_scenario_display.c
@@ -0,0 +1,314 @@
+/*******************************************************************************
+ OpenAirInterface
+ Copyright(c) 1999 - 2014 Eurecom
+
+ OpenAirInterface is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+
+ OpenAirInterface is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with OpenAirInterface.The full GNU General Public License is
+ included in this distribution in the file called "COPYING". If not,
+ see .
+
+ Contact Information
+ OpenAirInterface Admin: openair_admin@eurecom.fr
+ OpenAirInterface Tech : openair_tech@eurecom.fr
+ OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr
+
+ Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE
+
+ *******************************************************************************/
+
+/*
+ play_scenario_display.c
+ -------------------
+ AUTHOR : Lionel GAUTHIER
+ COMPANY : EURECOM
+ EMAIL : Lionel.Gauthier@eurecom.fr
+ */
+#include
+#include
+
+#include "intertask_interface.h"
+#include "platform_types.h"
+#include "assertions.h"
+#include "s1ap_ies_defs.h"
+#include "s1ap_eNB_decoder.h"
+#include "play_scenario.h"
+//-----------------------------------------------------------------------------
+void et_print_hex_octets(const unsigned char * const byte_stream, const unsigned long int num)
+{
+ unsigned long octet_index = 0;
+
+ if (byte_stream == NULL) {
+ return;
+ }
+
+ fprintf(stdout, "+-----+-------------------------------------------------+\n");
+ fprintf(stdout, "| | 0 1 2 3 4 5 6 7 8 9 a b c d e f |\n");
+ fprintf(stdout, "+-----+-------------------------------------------------+\n");
+
+ for (octet_index = 0; octet_index < num; octet_index++) {
+ if ((octet_index % 16) == 0) {
+ if (octet_index != 0) {
+ fprintf(stdout, " |\n");
+ }
+
+ fprintf(stdout, " %04ld |", octet_index);
+ }
+
+ /*
+ * Print every single octet in hexadecimal form
+ */
+ fprintf(stdout, " %02x", byte_stream[octet_index]);
+ /*
+ * Align newline and pipes according to the octets in groups of 2
+ */
+ }
+
+ /*
+ * Append enough spaces and put final pipe
+ */
+ unsigned char index;
+
+ for (index = octet_index; index < 16; ++index) {
+ fprintf(stdout, " ");
+ }
+
+ fprintf(stdout, " |\n");
+}
+
+//------------------------------------------------------------------------------
+void et_display_node(xmlNodePtr node, unsigned int indent)
+{
+ int i = 0;
+ if (node->type == XML_ELEMENT_NODE) {
+ xmlChar *path = xmlGetNodePath(node);
+ for (i=0; ichildren != NULL && node->children->type == XML_TEXT_NODE) {
+ xmlChar *content = xmlNodeGetContent(node);
+ printf("%s -> %s\n", path, content);
+ xmlFree(content);
+ } else {
+ printf("%s\n", path);
+ }
+ xmlFree(path);
+ }
+}
+//------------------------------------------------------------------------------
+void et_display_tree(xmlNodePtr node, unsigned int indent)
+{
+ xmlNode *cur_node = NULL;
+
+ for (cur_node = node; cur_node; cur_node = cur_node->next) {
+ if (cur_node->type == XML_ELEMENT_NODE) {
+ et_display_node(cur_node, indent);
+ }
+ et_display_tree(cur_node->children, indent++);
+ }
+}
+//------------------------------------------------------------------------------
+void et_display_packet_s1ap_data(const et_s1ap_t * const s1ap)
+{
+ char *message_string = NULL;
+
+ if (s1ap) {
+ message_string = calloc(20000, sizeof(char));
+ AssertFatal (NULL != message_string, "ERROR malloc()failed!\n");
+ s1ap_string_total_size = 0;
+ switch(s1ap->pdu.present) {
+ case S1AP_PDU_PR_initiatingMessage:
+ switch(s1ap->pdu.choice.initiatingMessage.procedureCode) {
+ case S1ap_ProcedureCode_id_downlinkNASTransport: s1ap_xer_print_s1ap_downlinknastransport(s1ap_xer__print2sp, message_string, (s1ap_message *)&s1ap->message);break;
+ case S1ap_ProcedureCode_id_InitialContextSetup: s1ap_xer_print_s1ap_initialcontextsetuprequest(s1ap_xer__print2sp, message_string, (s1ap_message *)&s1ap->message);break;
+ case S1ap_ProcedureCode_id_UEContextRelease: s1ap_xer_print_s1ap_uecontextreleasecommand(s1ap_xer__print2sp, message_string, (s1ap_message *)&s1ap->message);break;
+ case S1ap_ProcedureCode_id_Paging: s1ap_xer_print_s1ap_paging(s1ap_xer__print2sp, message_string, (s1ap_message *)&s1ap->message);break;
+ case S1ap_ProcedureCode_id_uplinkNASTransport: s1ap_xer_print_s1ap_uplinknastransport(s1ap_xer__print2sp, message_string, (s1ap_message *)&s1ap->message);break;
+ case S1ap_ProcedureCode_id_S1Setup: s1ap_xer_print_s1ap_s1setuprequest(s1ap_xer__print2sp, message_string, (s1ap_message *)&s1ap->message);break;
+ case S1ap_ProcedureCode_id_initialUEMessage: s1ap_xer_print_s1ap_initialuemessage(s1ap_xer__print2sp, message_string, (s1ap_message *)&s1ap->message);break;
+ case S1ap_ProcedureCode_id_UEContextReleaseRequest: s1ap_xer_print_s1ap_uecontextreleaserequest(s1ap_xer__print2sp, message_string, (s1ap_message *)&s1ap->message);break;
+ case S1ap_ProcedureCode_id_UECapabilityInfoIndication:s1ap_xer_print_s1ap_uecapabilityinfoindication(s1ap_xer__print2sp, message_string, (s1ap_message *)&s1ap->message);break;
+ case S1ap_ProcedureCode_id_NASNonDeliveryIndication: s1ap_xer_print_s1ap_nasnondeliveryindication_(s1ap_xer__print2sp, message_string, (s1ap_message *)&s1ap->message);break;
+ default:
+ AssertFatal( 0 , "Unknown procedure ID (%d) for initiating message\n",
+ (int)s1ap->pdu.choice.initiatingMessage.procedureCode);
+ }
+ break;
+ case S1AP_PDU_PR_successfulOutcome:
+ switch(s1ap->pdu.choice.successfulOutcome.procedureCode) {
+ case S1ap_ProcedureCode_id_S1Setup: s1ap_xer_print_s1ap_s1setupresponse(s1ap_xer__print2sp, message_string, (s1ap_message *)&s1ap->message);break;
+ case S1ap_ProcedureCode_id_InitialContextSetup: s1ap_xer_print_s1ap_initialcontextsetupresponse(s1ap_xer__print2sp, message_string, (s1ap_message *)&s1ap->message);break;
+ case S1ap_ProcedureCode_id_UEContextRelease: s1ap_xer_print_s1ap_uecontextreleasecomplete(s1ap_xer__print2sp, message_string, (s1ap_message *)&s1ap->message);break;
+ default:
+ AssertFatal(0, "Unknown procedure ID (%d) for successfull outcome message\n",
+ (int)s1ap->pdu.choice.successfulOutcome.procedureCode);
+ }
+ break;
+
+ case S1AP_PDU_PR_unsuccessfulOutcome:
+ switch(s1ap->pdu.choice.unsuccessfulOutcome.procedureCode) {
+ case S1ap_ProcedureCode_id_S1Setup: s1ap_xer_print_s1ap_s1setupfailure(s1ap_xer__print2sp, message_string, (s1ap_message *)&s1ap->message);break;
+ case S1ap_ProcedureCode_id_InitialContextSetup: s1ap_xer_print_s1ap_initialcontextsetupfailure(s1ap_xer__print2sp, message_string, (s1ap_message *)&s1ap->message);break;
+ default:
+ et_free_pointer(message_string);
+ AssertFatal(0,"Unknown procedure ID (%d) for unsuccessfull outcome message\n",
+ (int)s1ap->pdu.choice.unsuccessfulOutcome.procedureCode);
+ break;
+ }
+ break;
+ default:
+ AssertFatal(0, "Unknown presence (%d) or not implemented\n", (int)s1ap->pdu.present);
+ break;
+ }
+ fprintf(stdout, "\t\tSCTP.data XML dump:\n%s\n", message_string);
+ et_free_pointer(message_string);
+ }
+}
+//------------------------------------------------------------------------------
+void et_display_packet_sctp_init(const sctp_inithdr_t * const sctp)
+{
+
+ if (sctp) {
+ fprintf(stdout, "\t\tSCTP.init.init_tag : %u\n", sctp->init_tag);
+ fprintf(stdout, "\t\tSCTP.init.a_rwnd : %u\n", sctp->a_rwnd);
+ fprintf(stdout, "\t\tSCTP.init.num_inbound_streams : %u\n", sctp->num_inbound_streams);
+ fprintf(stdout, "\t\tSCTP.init.num_outbound_streams : %u\n", sctp->num_outbound_streams);
+ fprintf(stdout, "\t\tSCTP.init.initial_tsn : %u\n", sctp->initial_tsn);
+ }
+}
+//------------------------------------------------------------------------------
+void et_display_packet_sctp_initack(const sctp_initackhdr_t * const sctp)
+{
+
+ if (sctp) {
+ fprintf(stdout, "\t\tSCTP.initack.init_tag : %u\n", sctp->init_tag);
+ fprintf(stdout, "\t\tSCTP.initack.a_rwnd : %u\n", sctp->a_rwnd);
+ fprintf(stdout, "\t\tSCTP.initack.num_inbound_streams : %u\n", sctp->num_inbound_streams);
+ fprintf(stdout, "\t\tSCTP.initack.num_outbound_streams : %u\n", sctp->num_outbound_streams);
+ fprintf(stdout, "\t\tSCTP.initack.initial_tsn : %u\n", sctp->initial_tsn);
+ }
+}
+//------------------------------------------------------------------------------
+void et_display_packet_sctp_data(const sctp_datahdr_t * const sctp)
+{
+ if (sctp) {
+ fprintf(stdout, "\t\tSCTP.data.tsn : %u\n", sctp->tsn);
+ fprintf(stdout, "\t\tSCTP.data.stream : %u\n", sctp->stream);
+ fprintf(stdout, "\t\tSCTP.data.ssn : %u\n", sctp->ssn);
+ fprintf(stdout, "\t\tSCTP.data.ppid : %u\n", sctp->ppid);
+ if (sctp->ppid == 18) {
+ et_display_packet_s1ap_data(&sctp->payload);
+ }
+ fprintf(stdout, "\t\tSCTP.data.binary_stream_allocated_size : %u\n", sctp->payload.binary_stream_allocated_size);
+ if (NULL != sctp->payload.binary_stream) {
+ fprintf(stdout, "\t\tSCTP.data.binary_stream :\n");
+ et_print_hex_octets(sctp->payload.binary_stream, sctp->payload.binary_stream_allocated_size);
+ } else {
+ fprintf(stdout, "\t\tSCTP.data.binary_stream : NULL\n");
+ }
+ }
+}
+
+//------------------------------------------------------------------------------
+void et_display_packet_sctp(const et_sctp_hdr_t * const sctp)
+{
+ if (sctp) {
+ fprintf(stdout, "\t\tSCTP.src_port : %u\n", sctp->src_port);
+ fprintf(stdout, "\t\tSCTP.dst_port : %u\n", sctp->dst_port);
+ fprintf(stdout, "\t\tSCTP.chunk_type : %s\n", et_chunk_type_cid2str(sctp->chunk_type));
+ switch (sctp->chunk_type) {
+ case SCTP_CID_DATA:
+ et_display_packet_sctp_data(&sctp->u.data_hdr);
+ break;
+ case SCTP_CID_INIT:
+ et_display_packet_sctp_initack(&sctp->u.init_hdr);
+ break;
+ case SCTP_CID_INIT_ACK:
+ et_display_packet_sctp_initack(&sctp->u.init_ack_hdr);
+ break;
+ default:
+ ;
+ }
+ }
+}
+//------------------------------------------------------------------------------
+void et_display_packet_ip(const et_ip_hdr_t * const ip)
+{
+ if (ip) {
+ fprintf(stdout, "\t\tSource address : %s\n", et_ip2ip_str(&ip->src));
+ fprintf(stdout, "\t\tDestination address : %s\n", et_ip2ip_str(&ip->dst));
+ }
+}
+
+//------------------------------------------------------------------------------
+void et_display_packet(const et_packet_t * const packet)
+{
+ if (packet) {
+ fprintf(stdout, "-------------------------------------------------------------------------------\n");
+ fprintf(stdout, "\tPacket:\tnum %u | original frame number %u \n", packet->packet_number, packet->original_frame_number);
+ fprintf(stdout, "\tPacket:\ttime relative to 1st packet %ld.%06lu\n",
+ packet->time_relative_to_first_packet.tv_sec, packet->time_relative_to_first_packet.tv_usec);
+ fprintf(stdout, "\tPacket:\ttime relative to last tx packet %ld.%06lu\n",
+ packet->time_relative_to_last_sent_packet.tv_sec, packet->time_relative_to_last_sent_packet.tv_usec);
+ fprintf(stdout, "\tPacket:\ttime relative to last_received packet %ld.%06lu\n",
+ packet->time_relative_to_last_received_packet.tv_sec, packet->time_relative_to_last_received_packet.tv_usec);
+
+ switch(packet->action) {
+ case ET_PACKET_ACTION_S1C_SEND:
+ fprintf(stdout, "\tPacket:\tAction SEND\n");
+ break;
+ case ET_PACKET_ACTION_S1C_RECEIVE:
+ fprintf(stdout, "\tPacket:\tAction RECEIVE\n");
+ break;
+ default:
+ fprintf(stdout, "\tPacket:\tAction UNKNOWN\n");
+ }
+ switch(packet->status) {
+ case ET_PACKET_STATUS_NONE:
+ fprintf(stdout, "\tPacket:\tStatus NONE\n");
+ break;
+ case ET_PACKET_STATUS_NOT_TAKEN_IN_ACCOUNT:
+ fprintf(stdout, "\tPacket:\tStatus NOT_TAKEN_IN_ACCOUNT\n");
+ break;
+ case ET_PACKET_STATUS_SCHEDULED_FOR_SENDING:
+ fprintf(stdout, "\tPacket:\tStatus SCHEDULED_FOR_SENDING\n");
+ break;
+ case ET_PACKET_STATUS_SENT:
+ fprintf(stdout, "\tPacket:\tStatus SENT\n");
+ break;
+ case ET_PACKET_STATUS_SCHEDULED_FOR_RECEIVING:
+ fprintf(stdout, "\tPacket:\tStatus SCHEDULED_FOR_RECEIVING\n");
+ break;
+ case ET_PACKET_STATUS_RECEIVED:
+ fprintf(stdout, "\tPacket:\tStatus RECEIVED\n");
+ break;
+ default:
+ fprintf(stdout, "\tPacket:\tStatus UNKNOWN\n");
+ }
+ et_display_packet_ip(&packet->ip_hdr);
+ et_display_packet_sctp(&packet->sctp_hdr);
+ }
+}
+//------------------------------------------------------------------------------
+void et_display_scenario(const et_scenario_t * const scenario)
+{
+ et_packet_t *packet = NULL;
+ if (scenario) {
+ fprintf(stdout, "Scenario: %s\n", (scenario->name != NULL) ? (char*)scenario->name:"UNKNOWN NAME");
+ packet = scenario->list_packet;
+ while (packet) {
+ et_display_packet(packet);
+ packet = packet->next;
+ }
+ }
+}
diff --git a/openair3/TEST/EPC_TEST/play_scenario_fsm.c b/openair3/TEST/EPC_TEST/play_scenario_fsm.c
new file mode 100644
index 0000000000..f5b142d2fd
--- /dev/null
+++ b/openair3/TEST/EPC_TEST/play_scenario_fsm.c
@@ -0,0 +1,567 @@
+/*******************************************************************************
+ OpenAirInterface
+ Copyright(c) 1999 - 2014 Eurecom
+
+ OpenAirInterface is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+
+ OpenAirInterface is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with OpenAirInterface.The full GNU General Public License is
+ included in this distribution in the file called "COPYING". If not,
+ see .
+
+ Contact Information
+ OpenAirInterface Admin: openair_admin@eurecom.fr
+ OpenAirInterface Tech : openair_tech@eurecom.fr
+ OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr
+
+ Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE
+
+ *******************************************************************************/
+
+/*
+ play_scenario_fsm.c
+ -------------------
+ AUTHOR : Lionel GAUTHIER
+ COMPANY : EURECOM
+ EMAIL : Lionel.Gauthier@eurecom.fr
+ */
+#include
+#include
+#include
+
+#include "intertask_interface.h"
+#include "platform_types.h"
+#include "assertions.h"
+#include "play_scenario.h"
+#include "s1ap_ies_defs.h"
+#include "play_scenario_s1ap_eNB_defs.h"
+#include "timer.h"
+
+//------------------------------------------------------------------------------
+extern int g_max_speed;
+//------------------------------------------------------------------------------
+et_scenario_t *g_scenario = NULL;
+pthread_mutex_t g_fsm_lock = PTHREAD_MUTEX_INITIALIZER;
+et_fsm_state_t g_fsm_state = ET_FSM_STATE_NULL;
+uint32_t g_constraints = ET_BIT_MASK_MATCH_SCTP_STREAM | ET_BIT_MASK_MATCH_SCTP_SSN;
+//------------------------------------------------------------------------------
+// it is assumed that if a time is negative tv_sec and tv_usec are both negative
+void timeval_add (struct timeval * const result, const struct timeval * const a, const struct timeval * const b)
+{
+ AssertFatal(((a->tv_sec <= 0) && (a->tv_usec <= 0)) || ((a->tv_sec >= 0) && (a->tv_usec >= 0)), " Bad time format arg a\n");
+ AssertFatal(((b->tv_sec <= 0) && (b->tv_usec <= 0)) || ((b->tv_sec >= 0) && (b->tv_usec >= 0)), " Bad time format arg b\n");
+ // may happen overflows but were are not dealing with very large timings
+ long long int r = a->tv_usec + b->tv_usec + (a->tv_sec + b->tv_sec) * 1000000;
+ result->tv_sec = r / (long long int)1000000;
+ result->tv_usec = r % (long long int)1000000;
+ if ((result != a) && (result != b)) {
+ LOG_D(ENB_APP, "timeval_add(%ld.%06d, %ld.%06d)=%ld.%06d\n", a->tv_sec, a->tv_usec, b->tv_sec, b->tv_usec, result->tv_sec, result->tv_usec);
+ }
+}
+
+//------------------------------------------------------------------------------
+// it is assumed that if a time is negative tv_sec and tv_usec are both negative
+// return true if result is positive
+int timeval_subtract (struct timeval * const result, struct timeval * const a, struct timeval * const b)
+{
+ AssertFatal(((a->tv_sec <= 0) && (a->tv_usec <= 0)) || ((a->tv_sec >= 0) && (a->tv_usec >= 0)), " Bad time format arg a\n");
+ AssertFatal(((b->tv_sec <= 0) && (b->tv_usec <= 0)) || ((b->tv_sec >= 0) && (b->tv_usec >= 0)), " Bad time format arg b\n");
+ // may happen overflows but were are not dealing with very large timings
+ long long int r = a->tv_usec - b->tv_usec + (a->tv_sec - b->tv_sec) * 1000000;
+ result->tv_sec = r / (long long int)1000000;
+ result->tv_usec = r % (long long int)1000000;
+ if ((result != a) && (result != b)) {
+ LOG_D(ENB_APP, "timeval_subtract(%ld.%06d, %ld.%06d)=%ld.%06d\n", a->tv_sec, a->tv_usec, b->tv_sec, b->tv_usec, result->tv_sec, result->tv_usec);
+ }
+ return (result->tv_sec >= 0) && (result->tv_usec >= 0);
+}
+
+//------------------------------------------------------------------------------
+void et_scenario_wait_rx_packet(et_packet_t * const packet)
+{
+ packet->status = ET_PACKET_STATUS_SCHEDULED_FOR_RECEIVING;
+ g_fsm_state = ET_FSM_STATE_WAITING_RX_EVENT;
+ if (timer_setup (ET_FSM_STATE_WAITING_RX_EVENT_DELAY_SEC, 0, TASK_S1AP, INSTANCE_DEFAULT, TIMER_ONE_SHOT,
+ packet, &packet->timer_id) < 0) {
+ AssertFatal(0, " Can not start waiting RX event timer\n");
+ }
+ g_scenario->timer_count++;
+ LOG_D(ENB_APP, "Waiting RX packet num %d original frame number %u\n", packet->packet_number, packet->original_frame_number);
+}
+//------------------------------------------------------------------------------
+void et_scenario_schedule_tx_packet(et_packet_t * packet)
+{
+ s1ap_eNB_instance_t *s1ap_eNB_instance = NULL;
+ struct timeval now = { .tv_sec = 0, .tv_usec = 0 };
+ struct timeval offset_last_tx_packet = { .tv_sec = 0, .tv_usec = 0 };
+ struct timeval offset_last_rx_packet = { .tv_sec = 0, .tv_usec = 0 };
+ struct timeval offset_tx_rx = { .tv_sec = 0, .tv_usec = 0 };
+ struct timeval offset = { .tv_sec = 0, .tv_usec = 0 };
+ int last_packet_was_rx = 0;
+ int we_are_too_late = 0;
+ int original_frame_number = -1;
+
+ AssertFatal(NULL != packet, "packet argument is NULL");
+ s1ap_eNB_instance = et_s1ap_eNB_get_instance(packet->enb_instance);
+ AssertFatal(NULL != s1ap_eNB_instance, "Cannot get s1ap_eNB_instance_t for eNB instance %d", packet->enb_instance);
+
+ LOG_D(ENB_APP, "%s\n", __FUNCTION__);
+ g_fsm_state = ET_FSM_STATE_WAITING_TX_EVENT;
+
+ switch (packet->sctp_hdr.chunk_type) {
+ case SCTP_CID_DATA:
+ // check if we can send it now
+ // TODO: BUG we have to discard in scenario all packets that cannot be processed (SACK, COOKIEs, etc)
+ AssertFatal(gettimeofday(&now, NULL) == 0, "gettimeofday failed");
+ timeval_subtract(&offset_last_tx_packet,&now,&g_scenario->time_last_tx_packet);
+ timeval_subtract(&offset_last_rx_packet,&now,&g_scenario->time_last_rx_packet);
+ LOG_D(ENB_APP, "offset_last_tx_packet=%ld.%06d\n", offset_last_tx_packet.tv_sec, offset_last_tx_packet.tv_usec);
+ LOG_D(ENB_APP, "offset_last_rx_packet=%ld.%06d\n", offset_last_rx_packet.tv_sec, offset_last_rx_packet.tv_usec);
+
+ last_packet_was_rx = timeval_subtract(&offset_tx_rx,&offset_last_tx_packet,&offset_last_rx_packet);
+ if (last_packet_was_rx) {
+ LOG_D(ENB_APP, "last_packet_was_rx\n");
+ we_are_too_late = timeval_subtract(&offset,&offset_last_rx_packet,&packet->time_relative_to_last_received_packet);
+ LOG_D(ENB_APP, "we_are_too_late=%d, offset=%ld.%06d\n", we_are_too_late, offset.tv_sec, offset.tv_usec);
+ } else {
+ LOG_D(ENB_APP, "last_packet_was_tx\n");
+ we_are_too_late = timeval_subtract(&offset,&offset_last_tx_packet,&packet->time_relative_to_last_sent_packet);
+ LOG_D(ENB_APP, "we_are_too_late=%d, offset=%ld.%06d\n", we_are_too_late, offset.tv_sec, offset.tv_usec);
+ }
+ if ((0 == we_are_too_late) && (0 == g_max_speed)){
+ // set timer
+ if ((offset.tv_sec <= 0) || (offset.tv_usec <= 0)){
+ offset.tv_sec = -offset.tv_sec;
+ offset.tv_usec = -offset.tv_usec;
+ }
+
+ LOG_D(ENB_APP, "Send packet num %u original frame number %u in %ld.%06d sec\n",
+ packet->packet_number, packet->original_frame_number, offset.tv_sec, offset.tv_usec);
+
+ packet->status = ET_PACKET_STATUS_SCHEDULED_FOR_SENDING;
+ if (timer_setup (offset.tv_sec, offset.tv_usec, TASK_S1AP, INSTANCE_DEFAULT, TIMER_ONE_SHOT,packet, &packet->timer_id) < 0) {
+ AssertFatal(0, " Can not start TX event timer\n");
+ }
+ g_scenario->timer_count++;
+ // Done g_fsm_state = ET_FSM_STATE_WAITING_TX_EVENT;
+ } else {
+ // send immediately
+ AssertFatal(0 == gettimeofday(&packet->timestamp_packet, NULL), "gettimeofday() Failed");
+ original_frame_number = packet->original_frame_number;
+ do {
+ g_scenario->time_last_tx_packet.tv_sec = packet->timestamp_packet.tv_sec;
+ g_scenario->time_last_tx_packet.tv_usec = packet->timestamp_packet.tv_usec;
+
+ LOG_D(ENB_APP, "Sending packet num %d original frame number %u immediately\n",packet->packet_number, packet->original_frame_number);
+ et_s1ap_eNB_itti_send_sctp_data_req(
+ packet->enb_instance,
+ packet->sctp_hdr.u.data_hdr.assoc_id,
+ packet->sctp_hdr.u.data_hdr.payload.binary_stream,
+ packet->sctp_hdr.u.data_hdr.payload.binary_stream_allocated_size,
+ packet->sctp_hdr.u.data_hdr.stream);
+ packet->status = ET_PACKET_STATUS_SENT;
+ g_scenario->next_packet = g_scenario->next_packet->next;
+ packet = packet->next;
+ } while ((NULL != packet) && (packet->original_frame_number == original_frame_number));
+ g_fsm_state = ET_FSM_STATE_RUNNING;
+ }
+ break;
+ case SCTP_CID_INIT:
+ case SCTP_CID_INIT_ACK:
+ AssertFatal(0, "Invalid case TX packet SCTP_CID_INIT or SCTP_CID_INIT_ACK");
+ break;
+ default:
+ AssertFatal(0, "Invalid case TX packet SCTP_CID %d", packet->sctp_hdr.chunk_type);
+ }
+}
+//------------------------------------------------------------------------------
+et_fsm_state_t et_scenario_fsm_notify_event_state_running(et_event_t event)
+{
+
+ switch (event.code){
+ case ET_EVENT_TICK:
+ while (NULL != g_scenario->next_packet) {
+ LOG_D(ENB_APP, "EVENT_TICK: Considering packet num %d original frame number %u\n", g_scenario->next_packet->packet_number, g_scenario->next_packet->original_frame_number);
+ switch (g_scenario->next_packet->sctp_hdr.chunk_type) {
+ case SCTP_CID_DATA :
+ // no init in this scenario, may be sub-scenario
+ if (g_scenario->next_packet->action == ET_PACKET_ACTION_S1C_SEND) {
+ if (g_scenario->next_packet->status == ET_PACKET_STATUS_NONE) {
+ et_scenario_schedule_tx_packet(g_scenario->next_packet);
+ pthread_mutex_unlock(&g_fsm_lock);
+
+ et_event_t continue_event;
+ continue_event.code = ET_EVENT_TICK;
+ et_scenario_fsm_notify_event(continue_event);
+
+ return g_fsm_state;
+ } else if (g_scenario->next_packet->status != ET_PACKET_STATUS_SCHEDULED_FOR_SENDING) {
+ AssertFatal(0, "Invalid packet status %d", g_scenario->next_packet->status);
+ }
+ } else if (g_scenario->next_packet->action == ET_PACKET_ACTION_S1C_RECEIVE) {
+ if (g_scenario->next_packet->status == ET_PACKET_STATUS_RECEIVED) {
+ g_scenario->next_packet = g_scenario->next_packet->next;
+
+ } else if (g_scenario->next_packet->status == ET_PACKET_STATUS_NONE) {
+ et_scenario_wait_rx_packet(g_scenario->next_packet);
+ pthread_mutex_unlock(&g_fsm_lock);
+ return g_fsm_state;
+ } else {
+ AssertFatal(0, "Invalid packet status %d", g_scenario->next_packet->status);
+ }
+ } else {
+ AssertFatal(0, "Invalid packet action %d", g_scenario->next_packet->action);
+ }
+ break;
+
+ case SCTP_CID_INIT:
+ case SCTP_CID_INIT_ACK:
+ case SCTP_CID_HEARTBEAT:
+ case SCTP_CID_HEARTBEAT_ACK:
+ case SCTP_CID_COOKIE_ECHO:
+ case SCTP_CID_COOKIE_ACK:
+ case SCTP_CID_ECN_ECNE:
+ case SCTP_CID_ECN_CWR:
+ LOG_D(ENB_APP, "EVENT_TICK: Ignoring packet num %d SCTP CID %s\n",
+ g_scenario->next_packet->packet_number,
+ et_chunk_type_cid2str(g_scenario->next_packet->sctp_hdr.chunk_type));
+ g_scenario->next_packet->status = ET_PACKET_STATUS_NOT_TAKEN_IN_ACCOUNT;
+ g_scenario->next_packet = g_scenario->next_packet->next;
+ break;
+
+ case SCTP_CID_ABORT:
+ case SCTP_CID_SHUTDOWN:
+ case SCTP_CID_SHUTDOWN_ACK:
+ case SCTP_CID_ERROR:
+ case SCTP_CID_SHUTDOWN_COMPLETE:
+ AssertFatal(0, "The scenario should be cleaned (packet %s cannot be processed at this time)",
+ et_chunk_type_cid2str(g_scenario->next_packet->sctp_hdr.chunk_type));
+ break;
+
+ default:
+ LOG_D(ENB_APP, "EVENT_TICK: Ignoring packet num %d SCTP CID %s\n",
+ g_scenario->next_packet->packet_number,
+ et_chunk_type_cid2str(g_scenario->next_packet->sctp_hdr.chunk_type));
+ g_scenario->next_packet->status = ET_PACKET_STATUS_NOT_TAKEN_IN_ACCOUNT;
+ g_scenario->next_packet = g_scenario->next_packet->next;
+ }
+ }
+ fprintf(stderr, "No Packet found in this scenario: %s\n", g_scenario->name);
+ g_fsm_state = ET_FSM_STATE_NULL;
+ pthread_mutex_unlock(&g_fsm_lock);
+ if (0 == g_scenario->timer_count) {
+ fprintf(stderr, "End of scenario: %s\n", g_scenario->name);
+ fflush(stderr);
+ fflush(stdout);
+ return 0;
+ //exit(0);
+ }
+ fprintf(stderr, "Remaining timers running: %d\n", g_scenario->timer_count);
+ return g_fsm_state;
+ break;
+ case ET_EVENT_RX_PACKET_TIME_OUT:
+ AssertFatal(0, "Event ET_EVENT_RX_PACKET_TIME_OUT not handled in FSM state ET_FSM_STATE_RUNNING");
+ break;
+ case ET_EVENT_TX_TIMED_PACKET:
+ AssertFatal(0, "Event ET_EVENT_TX_TIMED_PACKET not handled in FSM state ET_FSM_STATE_RUNNING");
+ break;
+ case ET_EVENT_RX_S1AP:
+ et_s1ap_process_rx_packet(&event.u.s1ap_data_ind);
+ break;
+ default:
+ AssertFatal(0, "Case event %d not handled in ET_FSM_STATE_RUNNING", event.code);
+ }
+ pthread_mutex_unlock(&g_fsm_lock);
+ return 0;
+}
+
+//------------------------------------------------------------------------------
+et_fsm_state_t et_scenario_fsm_notify_event_state_waiting_tx(et_event_t event)
+{
+ int rv = 0;
+ int original_frame_number = -1;
+ et_packet_t *packet = NULL;
+
+ switch (event.code){
+ case ET_EVENT_TICK:
+ fprintf(stdout, "EVENT_TICK: waiting for tx event\n");
+ break;
+
+ case ET_EVENT_RX_S1AP:
+ rv = et_s1ap_process_rx_packet(&event.u.s1ap_data_ind);
+ break;
+
+ case ET_EVENT_TX_TIMED_PACKET:
+ // send immediately
+ packet = event.u.tx_timed_packet;
+ AssertFatal(0 == gettimeofday(&packet->timestamp_packet, NULL), "gettimeofday() Failed");
+
+ original_frame_number = packet->original_frame_number;
+ do {
+ g_scenario->time_last_tx_packet.tv_sec = packet->timestamp_packet.tv_sec;
+ g_scenario->time_last_tx_packet.tv_usec = packet->timestamp_packet.tv_usec;
+
+ LOG_D(ENB_APP, "Sending packet num %d original frame number %u immediately\n",packet->packet_number, packet->original_frame_number);
+ et_s1ap_eNB_itti_send_sctp_data_req(
+ packet->enb_instance,
+ packet->sctp_hdr.u.data_hdr.assoc_id,
+ packet->sctp_hdr.u.data_hdr.payload.binary_stream,
+ packet->sctp_hdr.u.data_hdr.payload.binary_stream_allocated_size,
+ packet->sctp_hdr.u.data_hdr.stream);
+ packet->status = ET_PACKET_STATUS_SENT;
+ packet = packet->next;
+ g_scenario->next_packet = packet;
+ } while ( (NULL != packet) && (packet->original_frame_number == original_frame_number));
+ g_fsm_state = ET_FSM_STATE_RUNNING;
+ break;
+
+ case ET_EVENT_RX_PACKET_TIME_OUT:
+ default:
+ AssertFatal(0, "Case event %d not handled in ET_FSM_STATE_WAITING_TX", event.code);
+ }
+ pthread_mutex_unlock(&g_fsm_lock);
+ return 0;
+}
+
+//------------------------------------------------------------------------------
+et_fsm_state_t et_scenario_fsm_notify_event_state_waiting_rx(et_event_t event)
+{
+ int rv = 0;
+ switch (event.code){
+ case ET_EVENT_TICK:
+ fprintf(stdout, "EVENT_TICK: waiting for rx event\n");
+ break;
+
+ case ET_EVENT_RX_PACKET_TIME_OUT:
+ fprintf(stderr, "Error The following packet is not received:\n");
+ //et_display_packet(event.u.rx_packet_time_out);
+ AssertFatal(0, "Waited packet not received");
+ break;
+
+ case ET_EVENT_RX_S1AP:
+ rv = et_s1ap_process_rx_packet(&event.u.s1ap_data_ind);
+ // waited packet
+ if (rv == 0) {
+ g_fsm_state = ET_FSM_STATE_RUNNING;
+ }
+ break;
+
+ case ET_EVENT_TX_TIMED_PACKET:
+ default:
+ AssertFatal(0, "Case event %d not handled in ET_FSM_STATE_WAITING_RX", event.code);
+ }
+ pthread_mutex_unlock(&g_fsm_lock);
+ return 0;
+}
+
+//------------------------------------------------------------------------------
+et_fsm_state_t et_scenario_fsm_notify_event_state_connecting_s1c(et_event_t event)
+{
+
+ switch (event.code){
+ case ET_EVENT_TICK:
+ break;
+
+ case ET_EVENT_S1C_CONNECTED:
+ // hack simulate we have been able to get the right timing values for STCP connect
+ AssertFatal(gettimeofday(&g_scenario->time_last_rx_packet, NULL) == 0, "gettimeofday failed");
+
+ while (NULL != g_scenario->next_packet) {
+ switch (g_scenario->next_packet->sctp_hdr.chunk_type) {
+ case SCTP_CID_DATA :
+ // no init in this scenario, may be sub-scenario
+ if (g_scenario->next_packet->action == ET_PACKET_ACTION_S1C_SEND) {
+ et_scenario_schedule_tx_packet(g_scenario->next_packet);
+ pthread_mutex_unlock(&g_fsm_lock);
+
+ et_event_t continue_event;
+ continue_event.code = ET_EVENT_TICK;
+ et_scenario_fsm_notify_event(continue_event);
+
+ return g_fsm_state;
+ } else if (g_scenario->next_packet->action == ET_PACKET_ACTION_S1C_RECEIVE) {
+ if (g_scenario->next_packet->status == ET_PACKET_STATUS_RECEIVED) {
+ g_scenario->last_rx_packet = g_scenario->next_packet;
+ g_scenario->time_last_rx_packet = g_scenario->last_rx_packet->timestamp_packet;
+ g_scenario->next_packet = g_scenario->next_packet->next;
+
+ } else if (g_scenario->next_packet->status == ET_PACKET_STATUS_NONE) {
+ et_scenario_wait_rx_packet(g_scenario->next_packet);
+ pthread_mutex_unlock(&g_fsm_lock);
+ return g_fsm_state;
+ } else {
+ AssertFatal(0, "Invalid packet status %d", g_scenario->next_packet->status);
+ }
+ } else {
+ AssertFatal(0, "Invalid packet action %d", g_scenario->next_packet->action);
+ }
+ break;
+
+ case SCTP_CID_INIT:
+ case SCTP_CID_INIT_ACK:
+ case SCTP_CID_HEARTBEAT:
+ case SCTP_CID_HEARTBEAT_ACK:
+ case SCTP_CID_COOKIE_ECHO:
+ case SCTP_CID_COOKIE_ACK:
+ case SCTP_CID_ECN_ECNE:
+ case SCTP_CID_ECN_CWR:
+ g_scenario->next_packet->status = ET_PACKET_STATUS_NOT_TAKEN_IN_ACCOUNT;
+ g_scenario->next_packet = g_scenario->next_packet->next;
+ break;
+
+ case SCTP_CID_ABORT:
+ case SCTP_CID_SHUTDOWN:
+ case SCTP_CID_SHUTDOWN_ACK:
+ case SCTP_CID_ERROR:
+ case SCTP_CID_SHUTDOWN_COMPLETE:
+ AssertFatal(0, "The scenario should be cleaned (packet %s cannot be processed at this time)",
+ et_chunk_type_cid2str(g_scenario->next_packet->sctp_hdr.chunk_type));
+ break;
+
+ default:
+ g_scenario->next_packet->status = ET_PACKET_STATUS_NOT_TAKEN_IN_ACCOUNT;
+ g_scenario->next_packet = g_scenario->next_packet->next;
+ }
+ }
+ fprintf(stderr, "No Packet found in this scenario: %s\n", g_scenario->name);
+ g_fsm_state = ET_FSM_STATE_NULL;
+ pthread_mutex_unlock(&g_fsm_lock);
+ if (0 == g_scenario->timer_count) {
+ fprintf(stderr, "End of scenario: %s\n", g_scenario->name);
+ fflush(stderr);
+ fflush(stdout);
+ exit(0);
+ }
+ fprintf(stderr, "Remaining timers running: %d\n", g_scenario->timer_count);
+ return g_fsm_state;
+ break;
+
+ default:
+ AssertFatal(0, "Case event %d not handled in ET_FSM_STATE_CONNECTING_S1C", event.code);
+ }
+ pthread_mutex_unlock(&g_fsm_lock);
+ return 0;
+}
+//------------------------------------------------------------------------------
+et_fsm_state_t et_scenario_fsm_notify_event_state_null(et_event_t event)
+{
+ switch (event.code){
+ case ET_EVENT_TICK:
+ break;
+
+ case ET_EVENT_INIT:
+ AssertFatal(NULL == g_scenario, "Current scenario not ended");
+ g_scenario = event.u.init.scenario;
+ g_scenario->next_packet = g_scenario->list_packet;
+ g_scenario->last_rx_packet = NULL;
+ g_scenario->last_tx_packet = NULL;
+
+ while (NULL != g_scenario->next_packet) {
+ switch (g_scenario->next_packet->sctp_hdr.chunk_type) {
+
+ case SCTP_CID_DATA :
+ // no init in this scenario, may be sub-scenario, ...
+ if (g_scenario->next_packet->action == ET_PACKET_ACTION_S1C_SEND) {
+ et_scenario_schedule_tx_packet(g_scenario->next_packet);
+ pthread_mutex_unlock(&g_fsm_lock);
+
+ et_event_t continue_event;
+ continue_event.code = ET_EVENT_TICK;
+ et_scenario_fsm_notify_event(continue_event);
+
+ return g_fsm_state;
+ } else if (g_scenario->next_packet->action == ET_PACKET_ACTION_S1C_RECEIVE) {
+ if (g_scenario->next_packet->status == ET_PACKET_STATUS_RECEIVED) {
+ g_scenario->last_rx_packet = g_scenario->next_packet;
+ g_scenario->time_last_rx_packet = g_scenario->last_rx_packet->timestamp_packet;
+ g_scenario->next_packet = g_scenario->next_packet->next;
+
+ } else if (g_scenario->next_packet->status == ET_PACKET_STATUS_NONE) {
+ et_scenario_wait_rx_packet(g_scenario->next_packet);
+ pthread_mutex_unlock(&g_fsm_lock);
+ return g_fsm_state;
+ } else {
+ AssertFatal(0, "Invalid packet status %d", g_scenario->next_packet->status);
+ }
+ } else {
+ AssertFatal(0, "Invalid packet action %d", g_scenario->next_packet->action);
+ }
+ break;
+
+ case SCTP_CID_INIT:
+ case SCTP_CID_INIT_ACK:
+ g_scenario->enb_properties = (Enb_properties_array_t *)et_enb_config_get();
+ g_scenario->hash_old_ue_mme_id2ue_mme_id = hashtable_create (256,NULL,NULL);
+ g_scenario->hash_mme2association_id = hashtable_create (256,NULL,NULL);
+ // Try to register each eNB
+ g_scenario->registered_enb = 0;
+ g_fsm_state = ET_FSM_STATE_CONNECTING_S1C;
+ AssertFatal(gettimeofday(&g_scenario->time_last_tx_packet, NULL) == 0, "gettimeofday failed");
+ et_eNB_app_register (g_scenario->enb_properties);
+ pthread_mutex_unlock(&g_fsm_lock);
+ return g_fsm_state;
+ break;
+
+ case SCTP_CID_HEARTBEAT:
+ case SCTP_CID_HEARTBEAT_ACK:
+ case SCTP_CID_COOKIE_ECHO:
+ case SCTP_CID_COOKIE_ACK:
+ case SCTP_CID_ECN_ECNE:
+ case SCTP_CID_ECN_CWR:
+ g_scenario->next_packet->status = ET_PACKET_STATUS_NOT_TAKEN_IN_ACCOUNT;
+ g_scenario->next_packet = g_scenario->next_packet->next;
+ break;
+
+ case SCTP_CID_ABORT:
+ case SCTP_CID_SHUTDOWN:
+ case SCTP_CID_SHUTDOWN_ACK:
+ case SCTP_CID_ERROR:
+ case SCTP_CID_SHUTDOWN_COMPLETE:
+ AssertFatal(0, "The scenario should be cleaned (packet %s cannot be processed at this time)",
+ et_chunk_type_cid2str(g_scenario->next_packet->sctp_hdr.chunk_type));
+ break;
+
+ default:
+ g_scenario->next_packet->status = ET_PACKET_STATUS_NOT_TAKEN_IN_ACCOUNT;
+ g_scenario->next_packet = g_scenario->next_packet->next;
+ }
+ }
+ fprintf(stderr, "No Useful packet found in this scenario: %s\n", g_scenario->name);
+ g_fsm_state = ET_FSM_STATE_NULL;
+ pthread_mutex_unlock(&g_fsm_lock);
+ return g_fsm_state;
+ break;
+
+ default:
+ AssertFatal(0, "Case event %d not handled in ET_FSM_STATE_NULL", event.code);
+ }
+ return 0;
+}
+
+//------------------------------------------------------------------------------
+et_fsm_state_t et_scenario_fsm_notify_event(et_event_t event)
+{
+ AssertFatal((event.code >= ET_EVENT_START) && (event.code < ET_EVENT_END), "Unknown et_event_t.code %d", event.code);
+
+ pthread_mutex_lock(&g_fsm_lock);
+ switch (g_fsm_state){
+ case ET_FSM_STATE_NULL: return et_scenario_fsm_notify_event_state_null(event); break;
+ case ET_FSM_STATE_CONNECTING_S1C: return et_scenario_fsm_notify_event_state_connecting_s1c(event); break;
+ case ET_FSM_STATE_WAITING_TX_EVENT: return et_scenario_fsm_notify_event_state_waiting_tx(event); break;
+ case ET_FSM_STATE_WAITING_RX_EVENT: return et_scenario_fsm_notify_event_state_waiting_rx(event); break;
+ case ET_FSM_STATE_RUNNING: return et_scenario_fsm_notify_event_state_running(event); break;
+ default:
+ AssertFatal(0, "Case fsm_state %d not handled", g_fsm_state);
+ }
+ pthread_mutex_unlock(&g_fsm_lock);
+ return g_fsm_state;
+}
diff --git a/openair3/TEST/EPC_TEST/play_scenario_parse.c b/openair3/TEST/EPC_TEST/play_scenario_parse.c
new file mode 100644
index 0000000000..e4f7b48c51
--- /dev/null
+++ b/openair3/TEST/EPC_TEST/play_scenario_parse.c
@@ -0,0 +1,600 @@
+/*******************************************************************************
+ OpenAirInterface
+ Copyright(c) 1999 - 2014 Eurecom
+
+ OpenAirInterface is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+
+ OpenAirInterface is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with OpenAirInterface.The full GNU General Public License is
+ included in this distribution in the file called "COPYING". If not,
+ see .
+
+ Contact Information
+ OpenAirInterface Admin: openair_admin@eurecom.fr
+ OpenAirInterface Tech : openair_tech@eurecom.fr
+ OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr
+
+ Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE
+
+ *******************************************************************************/
+
+/*
+ play_scenario_parse.c
+ -------------------
+ AUTHOR : Lionel GAUTHIER
+ COMPANY : EURECOM
+ EMAIL : Lionel.Gauthier@eurecom.fr
+ */
+
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+
+#include "intertask_interface.h"
+#include "platform_types.h"
+#include "assertions.h"
+#include "play_scenario.h"
+//------------------------------------------------------------------------------
+#define ENB_CONFIG_MAX_XSLT_PARAMS 32
+//------------------------------------------------------------------------------
+extern Enb_properties_array_t g_enb_properties;
+//------------------------------------------------------------------------------
+void et_parse_s1ap(xmlDocPtr doc, const xmlNode const *s1ap_node, et_s1ap_t * const s1ap)
+{
+ xmlNodePtr cur_node = NULL;
+ xmlChar *xml_char = NULL;
+ xmlChar *xml_char2 = NULL;
+ unsigned int size = 0;
+ int rc = 0;
+ unsigned int go_deeper_in_tree = 1;
+
+ if ((NULL != s1ap_node) && (NULL != s1ap)) {
+ // see http://www.xmlsoft.org/html/libxml-tree.html#xmlCopyNode
+ if (NULL == s1ap->doc) {
+ xmlUnlinkNode(s1ap_node);
+ //cur_node = xmlCopyNodeList(s1ap_node);
+ // arg2: if 1 do a recursive copy (properties, namespaces and children when applicable) if 2 copy properties and namespaces (when applicable)
+ //cur_node = xmlCopyNode(s1ap_node, 1);
+ //AssertFatal(NULL != cur_node, "xmlCopyNode Failed");
+ s1ap->doc = xmlNewDoc(BAD_CAST "1.0");
+ xmlDocSetRootElement(s1ap->doc, s1ap_node);
+ }
+
+ for (cur_node = (xmlNode *)s1ap_node; cur_node; cur_node = cur_node->next) {
+ go_deeper_in_tree = 1;
+ if ((!xmlStrcmp(cur_node->name, (const xmlChar *)"field"))) {
+ // do not get hidden fields
+ xml_char = xmlGetProp((xmlNode *)cur_node, (const xmlChar *)"hide");
+ if (NULL != xml_char) {
+ if ((!xmlStrcmp(xml_char, (const xmlChar *)"yes"))) {
+ go_deeper_in_tree = 0;
+ }
+ xmlFree(xml_char);
+ }
+ if (0 < go_deeper_in_tree) {
+ // first get size
+ xml_char = xmlGetProp((xmlNode *)cur_node, (const xmlChar *)"size");
+ if (NULL != xml_char) {
+ size = strtoul((const char *)xml_char, NULL, 0);
+ xmlFree(xml_char);
+ // second: try to get value (always hex)
+ xml_char = xmlGetProp((xmlNode *)cur_node, (const xmlChar *)"value");
+ if (NULL != xml_char) {
+ xml_char2 = xmlGetProp((xmlNode *)cur_node, (const xmlChar *)"name");
+ fprintf(stdout, "s1ap %p field name %s size %d value %s\n",s1ap, xml_char2, size, xml_char);
+ xmlFree(xml_char2);
+ // if success to get value, do not parse children
+ //AssertFatal ((xmlStrlen(xml_char) == size), "ERROR %s() mismatch in size %d and strlen %d\n", __FUNCTION__, size, xmlStrlen(xml_char));
+ //if (xmlStrlen(xml_char) == size) {
+ AssertFatal ((s1ap->binary_stream_pos+xmlStrlen(xml_char)/2) <= s1ap->binary_stream_allocated_size,
+ "ERROR in buffer size: binary_stream_pos %d xmlStrlen(xml_char)/2=%d\n", s1ap->binary_stream_pos, xmlStrlen(xml_char)/2);
+ rc = et_hex2data( &s1ap->binary_stream[s1ap->binary_stream_pos], xml_char, xmlStrlen(xml_char));
+ s1ap->binary_stream_pos += xmlStrlen(xml_char)/2;
+ //et_display_node(cur_node, 0);
+ AssertFatal (rc >= 0, "ERROR in converting hex string %s len %d size %d rc %d\n", xml_char, xmlStrlen(xml_char), size, rc);
+ go_deeper_in_tree = 0;
+ //}
+ xmlFree(xml_char);
+ }
+ }
+ }
+ }
+ if (0 < go_deeper_in_tree) {
+ et_parse_s1ap(doc, cur_node->children, s1ap);
+ }
+ }
+ }
+}
+
+//------------------------------------------------------------------------------
+void et_parse_sctp_data_chunk(xmlDocPtr doc, const xmlNode const *sctp_node, sctp_datahdr_t * const sctp_hdr)
+{
+ xmlNode *cur_node = NULL;
+ xmlChar *xml_char = NULL;
+ xmlChar *xml_char2 = NULL;
+
+ if ((NULL != sctp_node) && (NULL != sctp_hdr)) {
+ xml_char = xmlGetProp((xmlNode *)sctp_node, (const xmlChar *)"name");
+ if (NULL != xml_char) {
+ if ((!xmlStrcmp(xml_char, (const xmlChar *)"sctp.data_payload_proto_id"))) {
+ xml_char2 = xmlGetProp((xmlNode *)sctp_node, (const xmlChar *)"show");
+ if (NULL != xml_char2) {
+ sctp_hdr->ppid = strtoul((const char *)xml_char2, NULL, 0);
+ xmlFree(xml_char2);
+ }
+ } else if ((!xmlStrcmp(xml_char, (const xmlChar *)"sctp.data_sid"))) {
+ xml_char2 = xmlGetProp((xmlNode *)sctp_node, (const xmlChar *)"show");
+ if (NULL != xml_char2) {
+ sctp_hdr->stream = strtoul((const char *)xml_char2, NULL, 16);
+ xmlFree(xml_char2);
+ }
+ } else if ((!xmlStrcmp(xml_char, (const xmlChar *)"sctp.data_tsn"))) {
+ xml_char2 = xmlGetProp((xmlNode *)sctp_node, (const xmlChar *)"show");
+ if (NULL != xml_char2) {
+ sctp_hdr->tsn = strtoul((const char *)xml_char2, NULL, 0);
+ xmlFree(xml_char2);
+ }
+ } else if ((!xmlStrcmp(xml_char, (const xmlChar *)"sctp.data_ssn"))) {
+ xml_char2 = xmlGetProp((xmlNode *)sctp_node, (const xmlChar *)"show");
+ if (NULL != xml_char2) {
+ sctp_hdr->ssn = strtoul((const char *)xml_char2, NULL, 0);
+ xmlFree(xml_char2);
+ }
+ }
+ xmlFree(xml_char);
+ }
+ for (cur_node = sctp_node->children; cur_node; cur_node = cur_node->next) {
+ et_parse_sctp_data_chunk(doc, cur_node, sctp_hdr);
+ }
+ }
+
+}
+//------------------------------------------------------------------------------
+void et_parse_sctp_init_chunk(xmlDocPtr doc, const xmlNode const *sctp_node, sctp_inithdr_t * const sctp_hdr)
+{
+ xmlNode *cur_node = NULL;
+ xmlChar *xml_char = NULL;
+ xmlChar *xml_char2 = NULL;
+
+ if ((NULL != sctp_node) && (NULL != sctp_hdr)) {
+ xml_char = xmlGetProp((xmlNode *)sctp_node, (const xmlChar *)"name");
+ if (NULL != xml_char) {
+ if ((!xmlStrcmp(xml_char, (const xmlChar *)"sctp.init_nr_out_streams"))) {
+ xml_char2 = xmlGetProp((xmlNode *)sctp_node, (const xmlChar *)"value");
+ if (NULL != xml_char2) {
+ sctp_hdr->num_outbound_streams = strtoul((const char *)xml_char2, NULL, 0);
+ xmlFree(xml_char2);
+ }
+ } else if ((!xmlStrcmp(xml_char, (const xmlChar *)"sctp.init_nr_in_streams"))) {
+ xml_char2 = xmlGetProp((xmlNode *)sctp_node, (const xmlChar *)"value");
+ if (NULL != xml_char2) {
+ sctp_hdr->num_inbound_streams = strtoul((const char *)xml_char2, NULL, 0);
+ xmlFree(xml_char2);
+ }
+ } else if ((!xmlStrcmp(xml_char, (const xmlChar *)"sctp.init_credit"))) {
+ xml_char2 = xmlGetProp((xmlNode *)sctp_node, (const xmlChar *)"value");
+ if (NULL != xml_char2) {
+ sctp_hdr->a_rwnd = strtoul((const char *)xml_char2, NULL, 0);
+ xmlFree(xml_char2);
+ }
+ } else if ((!xmlStrcmp(xml_char, (const xmlChar *)"sctp.init_initial_tsn"))) {
+ xml_char2 = xmlGetProp((xmlNode *)sctp_node, (const xmlChar *)"show");
+ if (NULL != xml_char2) {
+ sctp_hdr->initial_tsn = strtoul((const char *)xml_char2, NULL, 0);
+ xmlFree(xml_char2);
+ }
+ } else if ((!xmlStrcmp(xml_char, (const xmlChar *)"sctp.init_initiate_tag"))) {
+ xml_char2 = xmlGetProp((xmlNode *)sctp_node, (const xmlChar *)"show");
+ if (NULL != xml_char2) {
+ sctp_hdr->init_tag = strtoul((const char *)xml_char2, NULL, 16);
+ xmlFree(xml_char2);
+ }
+ }
+ xmlFree(xml_char);
+ }
+ for (cur_node = sctp_node->children; cur_node; cur_node = cur_node->next) {
+ et_parse_sctp_init_chunk(doc, cur_node, sctp_hdr);
+ }
+ }
+}
+//------------------------------------------------------------------------------
+void et_parse_sctp_init_ack_chunk(xmlDocPtr doc, const xmlNode const *sctp_node, sctp_initackhdr_t * const sctp_hdr)
+{
+ xmlNode *cur_node = NULL;
+ xmlChar *xml_char = NULL;
+ xmlChar *xml_char2 = NULL;
+
+ if ((NULL != sctp_node) && (NULL != sctp_hdr)) {
+ xml_char = xmlGetProp((xmlNode *)sctp_node, (const xmlChar *)"name");
+ if (NULL != xml_char) {
+ if ((!xmlStrcmp(xml_char, (const xmlChar *)"sctp.initack_nr_out_streams"))) {
+ xml_char2 = xmlGetProp((xmlNode *)sctp_node, (const xmlChar *)"value");
+ if (NULL != xml_char2) {
+ sctp_hdr->num_outbound_streams = strtoul((const char *)xml_char2, NULL, 0);
+ xmlFree(xml_char2);
+ }
+ } else if ((!xmlStrcmp(xml_char, (const xmlChar *)"sctp.initack_nr_in_streams"))) {
+ xml_char2 = xmlGetProp((xmlNode *)(xmlNode *)sctp_node, (const xmlChar *)"value");
+ if (NULL != xml_char2) {
+ sctp_hdr->num_inbound_streams = strtoul((const char *)xml_char2, NULL, 0);
+ xmlFree(xml_char2);
+ }
+ } else if ((!xmlStrcmp(xml_char, (const xmlChar *)"sctp.initack_credit"))) {
+ xml_char2 = xmlGetProp((xmlNode *)sctp_node, (const xmlChar *)"value");
+ if (NULL != xml_char2) {
+ sctp_hdr->a_rwnd = strtoul((const char *)xml_char2, NULL, 0);
+ xmlFree(xml_char2);
+ }
+ } else if ((!xmlStrcmp(xml_char, (const xmlChar *)"sctp.initack_initial_tsn"))) {
+ xml_char2 = xmlGetProp((xmlNode *)sctp_node, (const xmlChar *)"show");
+ if (NULL != xml_char2) {
+ sctp_hdr->initial_tsn = strtoul((const char *)xml_char2, NULL, 0);
+ xmlFree(xml_char2);
+ }
+ } else if ((!xmlStrcmp(xml_char, (const xmlChar *)"sctp.initack_initiate_tag"))) {
+ xml_char2 = xmlGetProp((xmlNode *)sctp_node, (const xmlChar *)"show");
+ if (NULL != xml_char2) {
+ sctp_hdr->init_tag = strtoul((const char *)xml_char2, NULL, 16);
+ xmlFree(xml_char2);
+ }
+ }
+ xmlFree(xml_char);
+ }
+ for (cur_node = sctp_node->children; cur_node; cur_node = cur_node->next) {
+ et_parse_sctp_init_ack_chunk(doc, cur_node, sctp_hdr);
+ }
+ }
+}
+//------------------------------------------------------------------------------
+void et_parse_sctp(xmlDocPtr doc, const xmlNode const *sctp_node, et_sctp_hdr_t * const sctp_hdr)
+{
+ xmlNode *cur_node = NULL;
+ xmlChar *xml_char = NULL;
+ xmlChar *xml_char2 = NULL;
+
+ if ((NULL != sctp_node) && (NULL != sctp_hdr)) {
+ if ((!xmlStrcmp(sctp_node->name, (const xmlChar *)"proto"))) {
+ xml_char = xmlGetProp((xmlNode *)sctp_node, (const xmlChar *)"name");
+ if (NULL != xml_char) {
+ if ((!xmlStrcmp(xml_char, (const xmlChar *)"s1ap"))) {
+ xmlFree(xml_char);
+ xml_char = xmlGetProp((xmlNode *)sctp_node, (const xmlChar *)"pos");
+ if (NULL != xml_char) {
+ sctp_hdr->u.data_hdr.payload.xml_stream_pos_offset = strtoul((const char *)xml_char, NULL, 0);
+ xmlFree(xml_char);
+
+ xml_char2 = xmlGetProp((xmlNode *)sctp_node, (const xmlChar *)"size");
+ if (NULL != xml_char2) {
+ sctp_hdr->u.data_hdr.payload.binary_stream_allocated_size = strtoul((const char *)xml_char2, NULL, 0);
+ sctp_hdr->u.data_hdr.payload.binary_stream = calloc(1, sctp_hdr->u.data_hdr.payload.binary_stream_allocated_size);
+ sctp_hdr->u.data_hdr.payload.binary_stream_pos = 0;
+ fprintf(stdout, "Allocating payload of sctp_hdr %p %u bytes\n", sctp_hdr, sctp_hdr->u.data_hdr.payload.binary_stream_allocated_size);
+ xmlFree(xml_char2);
+ }
+ et_parse_s1ap(doc, sctp_node, &sctp_hdr->u.data_hdr.payload);
+ et_decode_s1ap(&sctp_hdr->u.data_hdr.payload);
+ return;
+ }
+ }
+ xmlFree(xml_char);
+ }
+ }
+ //if ((cur_node->type == XML_ATTRIBUTE_NODE) || (cur_node->type == XML_ELEMENT_NODE)) {
+ xml_char = xmlGetProp((xmlNode *)sctp_node, (const xmlChar *)"name");
+ if (NULL != xml_char) {
+ if ((!xmlStrcmp(xml_char, (const xmlChar *)"sctp.srcport"))) {
+ xml_char2 = xmlGetProp((xmlNode *)sctp_node, (const xmlChar *)"value");
+ if (NULL != xml_char2) {
+ sctp_hdr->src_port = strtoul((const char *)xml_char2, NULL, 16);
+ xmlFree(xml_char2);
+ }
+ } else if ((!xmlStrcmp(xml_char, (const xmlChar *)"sctp.dstport"))) {
+ xml_char2 = xmlGetProp((xmlNode *)sctp_node, (const xmlChar *)"value");
+ if (NULL != xml_char2) {
+ sctp_hdr->dst_port = strtoul((const char *)xml_char2, NULL, 16);
+ xmlFree(xml_char2);
+ }
+ } else if ((!xmlStrcmp(xml_char, (const xmlChar *)"sctp.chunk_type"))) {
+ xml_char2 = xmlGetProp((xmlNode *)sctp_node, (const xmlChar *)"value");
+ if (NULL != xml_char2) {
+ sctp_hdr->chunk_type = strtoul((const char *)xml_char2, NULL, 0);
+ xmlFree(xml_char2);
+ switch (sctp_hdr->chunk_type) {
+ case SCTP_CID_DATA:
+ et_parse_sctp_data_chunk(doc, sctp_node->parent, &sctp_hdr->u.data_hdr);
+ break;
+ case SCTP_CID_INIT:
+ et_parse_sctp_init_chunk(doc, sctp_node->parent, &sctp_hdr->u.init_hdr);
+ break;
+ case SCTP_CID_INIT_ACK:
+ et_parse_sctp_init_ack_chunk(doc, sctp_node->parent, &sctp_hdr->u.init_ack_hdr);
+ break;
+ default:
+ ;
+ }
+ }
+ }
+ }
+ for (cur_node = sctp_node->children; cur_node; cur_node = cur_node->next) {
+ et_parse_sctp(doc, cur_node, sctp_hdr);
+ }
+ }
+}
+//------------------------------------------------------------------------------
+void et_packet_shift_timing(et_packet_t * const packet, const struct timeval * const shift)
+{
+ timeval_add(&packet->time_relative_to_first_packet, &packet->time_relative_to_first_packet, shift);
+ AssertFatal((packet->time_relative_to_first_packet.tv_sec >= 0) && (packet->time_relative_to_first_packet.tv_usec >= 0),
+ "Bad timing result time_relative_to_first_packet=%d.%d packet num %u, original frame number %u",
+ packet->time_relative_to_first_packet.tv_sec,
+ packet->time_relative_to_first_packet.tv_usec,
+ packet->packet_number,
+ packet->original_frame_number);
+
+ timeval_add(&packet->time_relative_to_last_received_packet, &packet->time_relative_to_last_received_packet, shift);
+ AssertFatal((packet->time_relative_to_last_received_packet.tv_sec >= 0) && (packet->time_relative_to_last_received_packet.tv_usec >= 0),
+ "Bad timing result time_relative_to_last_received_packet=%d.%d packet num %u, original frame number %u",
+ packet->time_relative_to_last_received_packet.tv_sec,
+ packet->time_relative_to_last_received_packet.tv_usec,
+ packet->packet_number,
+ packet->original_frame_number);
+
+ timeval_add(&packet->time_relative_to_last_sent_packet, &packet->time_relative_to_last_sent_packet, shift);
+ AssertFatal((packet->time_relative_to_last_sent_packet.tv_sec >= 0) && (packet->time_relative_to_last_sent_packet.tv_usec >= 0),
+ "Bad timing result time_relative_to_last_sent_packet=%d.%d packet num %u, original frame number %u",
+ packet->time_relative_to_last_sent_packet.tv_sec,
+ packet->time_relative_to_last_sent_packet.tv_usec,
+ packet->packet_number,
+ packet->original_frame_number);
+}
+
+//------------------------------------------------------------------------------
+et_packet_t* et_parse_xml_packet(xmlDocPtr doc, xmlNodePtr node)
+{
+
+ et_packet_t *packet = NULL;
+ xmlNode *cur_node = NULL;
+ xmlChar *xml_char = NULL;
+ float afloat = (float)0.0;
+ static struct timeval initial_time = { .tv_sec = 0, .tv_usec = 0 };
+ static struct timeval relative_last_sent_packet = { .tv_sec = 0, .tv_usec = 0 };
+ static struct timeval relative_last_received_packet = { .tv_sec = 0, .tv_usec = 0 };
+ static char first_packet = 1;
+ static char first_sent_packet = 1;
+ static char first_received_packet = 1;
+ static unsigned int packet_number = 1;
+
+
+ if (NULL != node) {
+ packet = calloc(1, sizeof(*packet));
+
+ xml_char = xmlGetProp(node, (const xmlChar *)"action");
+ packet->action = et_action_str2et_action_t(xml_char);
+ packet->status = ET_PACKET_STATUS_NONE;
+ xmlFree(xml_char);
+ packet->packet_number = packet_number++;
+
+ for (cur_node = node->children; cur_node; cur_node = cur_node->next) {
+ //if (cur_node->type == XML_ELEMENT_NODE) {
+ if ((!xmlStrcmp(cur_node->name, (const xmlChar *)"frame.time_relative"))) {
+ xml_char = xmlGetProp((xmlNode *)cur_node, (const xmlChar *)"value");
+ afloat = atof((const char*)xml_char);
+ xmlFree(xml_char);
+ fprintf(stdout, "Parsing packet frame.time_relative: %f\n", afloat);
+ packet->time_relative_to_first_packet.tv_sec = (int)afloat;
+ packet->time_relative_to_first_packet.tv_usec = (int)((afloat - packet->time_relative_to_first_packet.tv_sec)*1000000.0);
+
+ if (first_packet > 0) {
+ initial_time = packet->time_relative_to_first_packet;
+ packet->time_relative_to_first_packet.tv_sec = 0;
+ packet->time_relative_to_first_packet.tv_usec = 0;
+ first_packet = 0;
+ } else {
+ timersub(&packet->time_relative_to_first_packet, &initial_time,
+ &packet->time_relative_to_first_packet);
+ }
+ } else if ((!xmlStrcmp(cur_node->name, (const xmlChar *)"frame.number"))) {
+ xml_char = xmlGetProp((xmlNode *)cur_node, (const xmlChar *)"value");
+ packet->original_frame_number = strtoul((const char *)xml_char, NULL, 0);
+ fprintf(stdout, "Parsing packet frame.number: %u\n", packet->original_frame_number);
+ xmlFree(xml_char);
+ } else if ((!xmlStrcmp(cur_node->name, (const xmlChar *)"ip.src"))) {
+ xml_char = xmlNodeListGetString(doc, cur_node->xmlChildrenNode, 1);
+ et_ip_str2et_ip(xml_char, &packet->ip_hdr.src);
+ xmlFree(xml_char);
+ } else if ((!xmlStrcmp(cur_node->name, (const xmlChar *)"ip.dst"))) {
+ xml_char = xmlNodeListGetString(doc, cur_node->xmlChildrenNode, 1);
+ et_ip_str2et_ip(xml_char, &packet->ip_hdr.dst);
+ xmlFree(xml_char);
+ } else if ((!xmlStrcmp(cur_node->name, (const xmlChar *)"proto"))) {
+ xml_char = xmlGetProp((xmlNode *)cur_node, (const xmlChar *)"name");
+ if (NULL != xml_char) {
+ if ((!xmlStrcmp(xml_char, (const xmlChar *)"sctp"))) {
+ et_parse_sctp(doc, cur_node, &packet->sctp_hdr);
+ }
+ xmlFree(xml_char);
+ }
+ } else if ((!xmlStrcmp(cur_node->name, (const xmlChar *)"eNB.instance"))) {
+ xml_char = xmlGetProp((xmlNode *)cur_node, (const xmlChar *)"value");
+ packet->enb_instance = strtoul((const char *)xml_char, NULL, 0);
+ xmlFree(xml_char);
+ }
+ //}
+ }
+ }
+ return packet;
+}
+//------------------------------------------------------------------------------
+et_scenario_t* et_generate_scenario(
+ const char * const tsml_out_scenario_filename)
+{
+ xmlDocPtr doc = NULL;
+ xmlNodePtr root = NULL;
+ xmlNodePtr node = NULL;
+ xmlChar *xml_char = NULL;
+ et_scenario_t *scenario = NULL;
+ et_packet_t *last_packet = NULL;
+ et_packet_t *packet = NULL;
+ et_packet_t **next_packet = NULL;
+
+ doc = xmlParseFile(tsml_out_scenario_filename);
+ if (NULL == doc) {
+ AssertFatal (0, "Could not parse scenario xml file %s!\n", tsml_out_scenario_filename);
+ } else {
+ fprintf(stdout, "Test scenario file to play: %s\n", tsml_out_scenario_filename);
+ //xmlDebugDumpDocument(NULL, doc);
+ }
+
+ // Get root
+ root = xmlDocGetRootElement(doc);
+ if (NULL != root) {
+ if ((!xmlStrcmp(root->name, (const xmlChar *)"scenario"))) {
+ xml_char = xmlGetProp(root, (const xmlChar *)"name");
+ printf("scenario name: %s\n", xml_char);
+ scenario = calloc(1, sizeof(*scenario));
+ scenario->name = xml_char; // nodup nofree
+
+ next_packet = &scenario->list_packet;
+ for (node = root->children; node != NULL; node = node->next) {
+ if ((!xmlStrcmp(node->name, (const xmlChar *)"packet"))) {
+ packet = et_parse_xml_packet(doc, node);
+ if (NULL != packet) {
+ // special case: S1AP same frame for 2 packets
+ if (NULL != last_packet) {
+ if (last_packet->original_frame_number == packet->original_frame_number) {
+ // updating because these informations are not in 2nd sctp header (same IP packet)
+ packet->sctp_hdr.dst_port = last_packet->sctp_hdr.dst_port;
+ packet->sctp_hdr.src_port = last_packet->sctp_hdr.src_port;
+ }
+ }
+ *next_packet = packet;
+ next_packet = &packet->next;
+ } else {
+ fprintf(stdout, "WARNING omitted packet\n");
+ }
+ }
+ last_packet = packet;
+ }
+ }
+ } else {
+ fprintf(stderr, "Empty xml document\n");
+ }
+ xmlFreeDoc(doc);
+ xmlCleanupParser();
+ return scenario;
+}
+//------------------------------------------------------------------------------
+int et_generate_xml_scenario(
+ const char const * xml_in_dir_name,
+ const char const * xml_in_scenario_filename,
+ const char const * enb_config_filename,
+ char const * tsml_out_scenario_filename)
+//------------------------------------------------------------------------------
+{
+ //int fd_pdml_in;
+ xsltStylesheetPtr cur = NULL;
+ xmlDocPtr doc, res;
+ FILE *play_scenario_file = NULL;
+ const char *params[2*ENB_CONFIG_MAX_XSLT_PARAMS];
+ int nb_params = 0;
+ int i,j;
+ char astring[1024];
+ struct in_addr addr;
+ int ret = 0;
+
+ memset(astring, 0, sizeof(astring));
+ if (getcwd(astring, sizeof(astring)) != NULL) {
+ fprintf(stdout, "working in %s directory\n", astring);
+ } else {
+ perror("getcwd() ERROR");
+ exit(1);
+ }
+
+
+ xmlSubstituteEntitiesDefault(1);
+ xmlLoadExtDtdDefaultValue = 1;
+ cur = xsltParseStylesheetFile((const xmlChar *)"/usr/share/oai/xsl/play_scenario.xsl");
+ if (NULL == cur) {
+ AssertFatal (0, "Could not parse stylesheet file /usr/share/oai/xsl/play_scenario.xsl!\n");
+ } else {
+ fprintf(stdout, "XSLT style sheet: /usr/share/oai/xsl/play_scenario.xsl\n");
+ }
+
+ doc = xmlParseFile(xml_in_scenario_filename);
+ if (NULL == doc) {
+ AssertFatal (0, "Could not parse scenario xml file %s!\n", xml_in_scenario_filename);
+ } else {
+ fprintf(stdout, "Test scenario file: %s\n", xml_in_scenario_filename);
+ }
+
+ for (i = 0; i < g_enb_properties.number; i++) {
+ // eNB S1-C IPv4 address
+ sprintf(astring, "enb%d_s1c", i);
+ params[nb_params++] = strdup(astring);
+ addr.s_addr = g_enb_properties.properties[i]->enb_ipv4_address_for_S1_MME;
+ sprintf(astring, "\"%s\"", inet_ntoa(addr));
+ params[nb_params++] = strdup(astring);
+
+ // MME S1-C IPv4 address
+ for (j = 0; j < g_enb_properties.properties[i]->nb_mme; j++) {
+ sprintf(astring, "mme%d_s1c_%d", i, j);
+ params[nb_params++] = strdup(astring);
+ AssertFatal (g_enb_properties.properties[i]->mme_ip_address[j].ipv4_address,
+ "Only support MME IPv4 address\n");
+ sprintf(astring, "\"%s\"", g_enb_properties.properties[i]->mme_ip_address[j].ipv4_address);
+ params[nb_params++] = strdup(astring);
+ }
+ }
+ params[nb_params] = NULL;
+ res = xsltApplyStylesheet(cur, doc, params);
+ if (NULL != res) {
+ sprintf((char *)tsml_out_scenario_filename,"%s",xml_in_scenario_filename);
+ if (et_strip_extension((char *)tsml_out_scenario_filename) > 0) {
+ strcat((char *)tsml_out_scenario_filename, ".tsml");
+ play_scenario_file = fopen( tsml_out_scenario_filename, "w+");
+ if (NULL != play_scenario_file) {
+ xsltSaveResultToFile(play_scenario_file, res, cur);
+ fclose(play_scenario_file);
+ fprintf(stdout, "Wrote test scenario to %s\n", tsml_out_scenario_filename);
+ } else {
+ fprintf(stderr, "ERROR in fopen(%s)\n", tsml_out_scenario_filename);
+ ret = -1;
+ }
+ } else {
+ fprintf(stderr, "ERROR in strip_extension()\n");
+ ret = -1;
+ }
+ } else {
+ fprintf(stderr, "ERROR in xsltApplyStylesheet()\n");
+ ret = -1;
+ }
+ xsltFreeStylesheet(cur);
+ xmlFreeDoc(doc);
+ xmlFreeDoc(res);
+
+ xsltCleanupGlobals();
+ xmlCleanupParser();
+ return ret;
+}
+
diff --git a/openair3/TEST/EPC_TEST/play_scenario_s1ap.c b/openair3/TEST/EPC_TEST/play_scenario_s1ap.c
new file mode 100644
index 0000000000..5d5a3672d3
--- /dev/null
+++ b/openair3/TEST/EPC_TEST/play_scenario_s1ap.c
@@ -0,0 +1,1175 @@
+/*******************************************************************************
+ OpenAirInterface
+ Copyright(c) 1999 - 2014 Eurecom
+
+ OpenAirInterface is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+
+ OpenAirInterface is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with OpenAirInterface.The full GNU General Public License is
+ included in this distribution in the file called "COPYING". If not,
+ see .
+
+ Contact Information
+ OpenAirInterface Admin: openair_admin@eurecom.fr
+ OpenAirInterface Tech : openair_tech@eurecom.fr
+ OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr
+
+ Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE
+
+ *******************************************************************************/
+
+/*
+ play_scenario_s1ap.c
+ -------------------
+ AUTHOR : Lionel GAUTHIER
+ COMPANY : EURECOM
+ EMAIL : Lionel.Gauthier@eurecom.fr
+ */
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include "tree.h"
+#include "queue.h"
+
+
+#include "intertask_interface.h"
+#include "timer.h"
+#include "platform_types.h"
+#include "assertions.h"
+#include "conversions.h"
+#include "s1ap_common.h"
+#include "play_scenario_s1ap_eNB_defs.h"
+#include "play_scenario.h"
+#include "msc.h"
+//------------------------------------------------------------------------------
+s1ap_eNB_internal_data_t s1ap_eNB_internal_data;
+RB_GENERATE(s1ap_mme_map, s1ap_eNB_mme_data_s, entry, et_s1ap_eNB_compare_assoc_id);
+//------------------------------------------------------------------------------
+extern et_scenario_t *g_scenario;
+extern uint32_t g_constraints;
+//------------------------------------------------------------------------------
+int et_s1ap_eNB_compare_assoc_id(
+ struct s1ap_eNB_mme_data_s *p1, struct s1ap_eNB_mme_data_s *p2)
+{
+ if (p1->assoc_id == -1) {
+ if (p1->cnx_id < p2->cnx_id) {
+ return -1;
+ }
+ if (p1->cnx_id > p2->cnx_id) {
+ return 1;
+ }
+ } else {
+ if (p1->assoc_id < p2->assoc_id) {
+ return -1;
+ }
+ if (p1->assoc_id > p2->assoc_id) {
+ return 1;
+ }
+ }
+
+ /* Matching reference */
+ return 0;
+}
+//------------------------------------------------------------------------------
+uint32_t et_s1ap_generate_eNB_id(void)
+{
+ char *out;
+ char hostname[50];
+ int ret;
+ uint32_t eNB_id;
+
+ /* Retrieve the host name */
+ ret = gethostname(hostname, sizeof(hostname));
+ DevAssert(ret == 0);
+
+ out = crypt(hostname, "eurecom");
+ DevAssert(out != NULL);
+
+ eNB_id = ((out[0] << 24) | (out[1] << 16) | (out[2] << 8) | out[3]);
+
+ return eNB_id;
+}
+//------------------------------------------------------------------------------
+uint16_t et_s1ap_eNB_fetch_add_global_cnx_id(void)
+{
+ return ++s1ap_eNB_internal_data.global_cnx_id;
+}
+
+//------------------------------------------------------------------------------
+void et_s1ap_eNB_prepare_internal_data(void)
+{
+ memset(&s1ap_eNB_internal_data, 0, sizeof(s1ap_eNB_internal_data));
+ STAILQ_INIT(&s1ap_eNB_internal_data.s1ap_eNB_instances_head);
+}
+
+//------------------------------------------------------------------------------
+void et_s1ap_eNB_insert_new_instance(s1ap_eNB_instance_t *new_instance_p)
+{
+ DevAssert(new_instance_p != NULL);
+
+ STAILQ_INSERT_TAIL(&s1ap_eNB_internal_data.s1ap_eNB_instances_head,
+ new_instance_p, s1ap_eNB_entries);
+}
+
+//------------------------------------------------------------------------------
+struct s1ap_eNB_mme_data_s *et_s1ap_eNB_get_MME(
+ s1ap_eNB_instance_t *instance_p,
+ int32_t assoc_id, uint16_t cnx_id)
+{
+ struct s1ap_eNB_mme_data_s temp;
+ struct s1ap_eNB_mme_data_s *found;
+
+ memset(&temp, 0, sizeof(struct s1ap_eNB_mme_data_s));
+
+ temp.assoc_id = assoc_id;
+ temp.cnx_id = cnx_id;
+
+ if (instance_p == NULL) {
+ STAILQ_FOREACH(instance_p, &s1ap_eNB_internal_data.s1ap_eNB_instances_head,
+ s1ap_eNB_entries) {
+ found = RB_FIND(s1ap_mme_map, &instance_p->s1ap_mme_head, &temp);
+
+ if (found != NULL) {
+ return found;
+ }
+ }
+ } else {
+ return RB_FIND(s1ap_mme_map, &instance_p->s1ap_mme_head, &temp);
+ }
+
+ return NULL;
+}
+
+//------------------------------------------------------------------------------
+s1ap_eNB_instance_t *et_s1ap_eNB_get_instance(instance_t instance)
+{
+ s1ap_eNB_instance_t *temp = NULL;
+
+ STAILQ_FOREACH(temp, &s1ap_eNB_internal_data.s1ap_eNB_instances_head,
+ s1ap_eNB_entries) {
+ if (temp->instance == instance) {
+ /* Matching occurence */
+ return temp;
+ }
+ }
+
+ return NULL;
+}
+//------------------------------------------------------------------------------
+void et_s1ap_eNB_itti_send_sctp_data_req(instance_t instance, int32_t assoc_id, uint8_t *buffer,
+ uint32_t buffer_length, uint16_t stream)
+{
+ MessageDef *message_p;
+ sctp_data_req_t *sctp_data_req;
+
+ message_p = itti_alloc_new_message(TASK_S1AP, SCTP_DATA_REQ);
+
+ sctp_data_req = &message_p->ittiMsg.sctp_data_req;
+
+ sctp_data_req->assoc_id = assoc_id;
+ sctp_data_req->buffer = buffer;
+ sctp_data_req->buffer_length = buffer_length;
+ sctp_data_req->stream = stream;
+
+ itti_send_msg_to_task(TASK_SCTP, instance, message_p);
+}
+//------------------------------------------------------------------------------
+int et_handle_s1ap_mismatch_mme_ue_s1ap_id(et_packet_t * const spacket, et_packet_t * const rx_packet)
+{
+ S1ap_MME_UE_S1AP_ID_t scenario_mme_ue_s1ap_id = 0;
+ S1ap_MME_UE_S1AP_ID_t rx_mme_ue_s1ap_id = 0;
+ S1AP_PDU_PR present;
+
+ present = rx_packet->sctp_hdr.u.data_hdr.payload.pdu.present;
+
+ switch (rx_packet->sctp_hdr.u.data_hdr.payload.message.procedureCode) {
+ case S1ap_ProcedureCode_id_HandoverPreparation:
+ if (present == S1AP_PDU_PR_initiatingMessage) {
+ rx_mme_ue_s1ap_id = rx_packet->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_HandoverRequiredIEs.mme_ue_s1ap_id;
+ scenario_mme_ue_s1ap_id = spacket->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_HandoverRequiredIEs.mme_ue_s1ap_id;
+ } else {
+ rx_mme_ue_s1ap_id = rx_packet->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_HandoverCommandIEs.mme_ue_s1ap_id;
+ scenario_mme_ue_s1ap_id = spacket->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_HandoverCommandIEs.mme_ue_s1ap_id;
+ }
+ break;
+
+ case S1ap_ProcedureCode_id_HandoverResourceAllocation:
+ if (present == S1AP_PDU_PR_initiatingMessage) {
+ rx_mme_ue_s1ap_id = rx_packet->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_HandoverRequestIEs.mme_ue_s1ap_id;
+ scenario_mme_ue_s1ap_id = spacket->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_HandoverRequestIEs.mme_ue_s1ap_id;
+ } else if (present == S1AP_PDU_PR_successfulOutcome) {
+ rx_mme_ue_s1ap_id = rx_packet->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_HandoverRequestAcknowledgeIEs.mme_ue_s1ap_id;
+ scenario_mme_ue_s1ap_id = spacket->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_HandoverRequestAcknowledgeIEs.mme_ue_s1ap_id;
+ } else if (present == S1AP_PDU_PR_unsuccessfulOutcome) {
+ rx_mme_ue_s1ap_id = rx_packet->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_HandoverFailureIEs.mme_ue_s1ap_id;
+ scenario_mme_ue_s1ap_id = spacket->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_HandoverFailureIEs.mme_ue_s1ap_id;
+ }
+ break;
+
+ case S1ap_ProcedureCode_id_HandoverNotification:
+ rx_mme_ue_s1ap_id = rx_packet->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_HandoverNotifyIEs.mme_ue_s1ap_id;
+ scenario_mme_ue_s1ap_id = spacket->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_HandoverNotifyIEs.mme_ue_s1ap_id;
+ break;
+
+ case S1ap_ProcedureCode_id_PathSwitchRequest:
+ //rx_mme_ue_s1ap_id = rx_packet->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_PathSwitchRequestIEs.mme_ue_s1ap_id;
+ //scenario_mme_ue_s1ap_id = spacket->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_PathSwitchRequestIEs.mme_ue_s1ap_id;
+ break;
+
+ case S1ap_ProcedureCode_id_HandoverCancel:
+ rx_mme_ue_s1ap_id = rx_packet->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_HandoverCancelIEs.mme_ue_s1ap_id;
+ scenario_mme_ue_s1ap_id = spacket->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_HandoverCancelIEs.mme_ue_s1ap_id;
+ break;
+
+ case S1ap_ProcedureCode_id_E_RABSetup:
+ if (present == S1AP_PDU_PR_initiatingMessage) {
+ rx_mme_ue_s1ap_id = rx_packet->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_E_RABSetupRequestIEs.mme_ue_s1ap_id;
+ scenario_mme_ue_s1ap_id = spacket->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_E_RABSetupRequestIEs.mme_ue_s1ap_id;
+ } else {
+ rx_mme_ue_s1ap_id = rx_packet->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_E_RABSetupResponseIEs.mme_ue_s1ap_id;
+ scenario_mme_ue_s1ap_id = spacket->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_E_RABSetupResponseIEs.mme_ue_s1ap_id;
+ }
+ break;
+
+ case S1ap_ProcedureCode_id_E_RABModify:
+ if (present == S1AP_PDU_PR_initiatingMessage) {
+ rx_mme_ue_s1ap_id = rx_packet->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_E_RABModifyRequestIEs.mme_ue_s1ap_id;
+ scenario_mme_ue_s1ap_id = spacket->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_E_RABModifyRequestIEs.mme_ue_s1ap_id;
+ } else {
+ rx_mme_ue_s1ap_id = rx_packet->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_E_RABModifyResponseIEs.mme_ue_s1ap_id;
+ scenario_mme_ue_s1ap_id = spacket->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_E_RABModifyResponseIEs.mme_ue_s1ap_id;
+ }
+ break;
+
+ case S1ap_ProcedureCode_id_E_RABRelease:
+ if (present == S1AP_PDU_PR_initiatingMessage) {
+ rx_mme_ue_s1ap_id = rx_packet->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_E_RABReleaseCommandIEs.mme_ue_s1ap_id;
+ scenario_mme_ue_s1ap_id = spacket->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_E_RABReleaseCommandIEs.mme_ue_s1ap_id;
+ } else {
+ rx_mme_ue_s1ap_id = rx_packet->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_E_RABReleaseResponseIEs.mme_ue_s1ap_id;
+ scenario_mme_ue_s1ap_id = spacket->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_E_RABReleaseResponseIEs.mme_ue_s1ap_id;
+ }
+ break;
+
+ case S1ap_ProcedureCode_id_E_RABReleaseIndication:
+ rx_mme_ue_s1ap_id = rx_packet->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_E_RABReleaseIndicationIEs.mme_ue_s1ap_id;
+ scenario_mme_ue_s1ap_id = spacket->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_E_RABReleaseIndicationIEs.mme_ue_s1ap_id;
+ break;
+
+ case S1ap_ProcedureCode_id_InitialContextSetup:
+ if (present == S1AP_PDU_PR_initiatingMessage) {
+ rx_mme_ue_s1ap_id = rx_packet->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_InitialContextSetupRequestIEs.mme_ue_s1ap_id;
+ scenario_mme_ue_s1ap_id = spacket->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_InitialContextSetupRequestIEs.mme_ue_s1ap_id;
+ } else {
+ rx_mme_ue_s1ap_id = rx_packet->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_InitialContextSetupResponseIEs.mme_ue_s1ap_id;
+ scenario_mme_ue_s1ap_id = spacket->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_InitialContextSetupResponseIEs.mme_ue_s1ap_id;
+ }
+ break;
+
+ case S1ap_ProcedureCode_id_Paging:
+ //rx_mme_ue_s1ap_id = rx_packet->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_PagingIEs.mme_ue_s1ap_id;
+ //scenario_mme_ue_s1ap_id = spacket->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_PagingIEs.mme_ue_s1ap_id;
+ break;
+
+ case S1ap_ProcedureCode_id_downlinkNASTransport:
+ rx_mme_ue_s1ap_id = rx_packet->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_DownlinkNASTransportIEs.mme_ue_s1ap_id;
+ scenario_mme_ue_s1ap_id = spacket->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_DownlinkNASTransportIEs.mme_ue_s1ap_id;
+ break;
+
+ case S1ap_ProcedureCode_id_initialUEMessage:
+ //rx_mme_ue_s1ap_id = rx_packet->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_InitialUEMessageIEs.mme_ue_s1ap_id;
+ //scenario_mme_ue_s1ap_id = spacket->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_InitialUEMessageIEs.mme_ue_s1ap_id;
+ break;
+
+ case S1ap_ProcedureCode_id_uplinkNASTransport:
+ rx_mme_ue_s1ap_id = rx_packet->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_UplinkNASTransportIEs.mme_ue_s1ap_id;
+ scenario_mme_ue_s1ap_id = spacket->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_UplinkNASTransportIEs.mme_ue_s1ap_id;
+ break;
+
+ case S1ap_ProcedureCode_id_Reset:
+ //rx_mme_ue_s1ap_id = rx_packet->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_ResetIEs.mme_ue_s1ap_id;
+ //scenario_mme_ue_s1ap_id = spacket->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_ResetIEs.mme_ue_s1ap_id;
+ break;
+
+ case S1ap_ProcedureCode_id_ErrorIndication:
+ rx_mme_ue_s1ap_id = rx_packet->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_ErrorIndicationIEs.mme_ue_s1ap_id;
+ scenario_mme_ue_s1ap_id = spacket->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_ErrorIndicationIEs.mme_ue_s1ap_id;
+ break;
+
+ case S1ap_ProcedureCode_id_NASNonDeliveryIndication:
+ rx_mme_ue_s1ap_id = rx_packet->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_NASNonDeliveryIndication_IEs.mme_ue_s1ap_id;
+ scenario_mme_ue_s1ap_id = spacket->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_NASNonDeliveryIndication_IEs.mme_ue_s1ap_id;
+ break;
+
+ case S1ap_ProcedureCode_id_S1Setup:
+ /*if (present == S1AP_PDU_PR_initiatingMessage) {
+ rx_mme_ue_s1ap_id = rx_packet->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_S1SetupRequestIEs.mme_ue_s1ap_id;
+ scenario_mme_ue_s1ap_id = spacket->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_S1SetupRequestIEs.mme_ue_s1ap_id;
+ } else if (present == S1AP_PDU_PR_successfulOutcome) {
+ rx_mme_ue_s1ap_id = rx_packet->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_S1SetupResponseIEs.mme_ue_s1ap_id;
+ scenario_mme_ue_s1ap_id = spacket->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_S1SetupResponseIEs.mme_ue_s1ap_id;
+ } else if (present == S1AP_PDU_PR_unsuccessfulOutcome) {
+ rx_mme_ue_s1ap_id = rx_packet->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_S1SetupFailureIEs.mme_ue_s1ap_id;
+ scenario_mme_ue_s1ap_id = spacket->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_S1SetupFailureIEs.mme_ue_s1ap_id;
+ }*/
+ break;
+
+ case S1ap_ProcedureCode_id_UEContextReleaseRequest:
+ rx_mme_ue_s1ap_id = rx_packet->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_UEContextReleaseRequestIEs.mme_ue_s1ap_id;
+ scenario_mme_ue_s1ap_id = spacket->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_UEContextReleaseRequestIEs.mme_ue_s1ap_id;
+ break;
+
+ case S1ap_ProcedureCode_id_DownlinkS1cdma2000tunneling:
+ rx_mme_ue_s1ap_id = rx_packet->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_DownlinkS1cdma2000tunnelingIEs.mme_ue_s1ap_id;
+ scenario_mme_ue_s1ap_id = spacket->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_DownlinkS1cdma2000tunnelingIEs.mme_ue_s1ap_id;
+ break;
+
+ case S1ap_ProcedureCode_id_UplinkS1cdma2000tunneling:
+ rx_mme_ue_s1ap_id = rx_packet->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_UplinkS1cdma2000tunnelingIEs.mme_ue_s1ap_id;
+ scenario_mme_ue_s1ap_id = spacket->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_UplinkS1cdma2000tunnelingIEs.mme_ue_s1ap_id;
+ break;
+
+ case S1ap_ProcedureCode_id_UEContextModification:
+ if (present == S1AP_PDU_PR_initiatingMessage) {
+ rx_mme_ue_s1ap_id = rx_packet->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_UEContextModificationRequestIEs.mme_ue_s1ap_id;
+ scenario_mme_ue_s1ap_id = spacket->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_UEContextModificationRequestIEs.mme_ue_s1ap_id;
+ } else if (present == S1AP_PDU_PR_successfulOutcome) {
+ rx_mme_ue_s1ap_id = rx_packet->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_UEContextModificationResponseIEs.mme_ue_s1ap_id;
+ scenario_mme_ue_s1ap_id = spacket->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_UEContextModificationResponseIEs.mme_ue_s1ap_id;
+ } else if (present == S1AP_PDU_PR_unsuccessfulOutcome) {
+ rx_mme_ue_s1ap_id = rx_packet->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_UEContextModificationFailureIEs.mme_ue_s1ap_id;
+ scenario_mme_ue_s1ap_id = spacket->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_UEContextModificationFailureIEs.mme_ue_s1ap_id;
+ }
+ break;
+
+ case S1ap_ProcedureCode_id_UECapabilityInfoIndication:
+ rx_mme_ue_s1ap_id = rx_packet->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_UECapabilityInfoIndicationIEs.mme_ue_s1ap_id;
+ scenario_mme_ue_s1ap_id = spacket->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_UECapabilityInfoIndicationIEs.mme_ue_s1ap_id;
+ break;
+
+ case S1ap_ProcedureCode_id_UEContextRelease:
+ if (present == S1AP_PDU_PR_initiatingMessage) {
+ switch (rx_packet->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_UEContextReleaseCommandIEs.uE_S1AP_IDs.present) {
+ case S1ap_UE_S1AP_IDs_PR_uE_S1AP_ID_pair:
+ rx_mme_ue_s1ap_id = rx_packet->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_UEContextReleaseCommandIEs.uE_S1AP_IDs.choice.uE_S1AP_ID_pair.mME_UE_S1AP_ID;
+ scenario_mme_ue_s1ap_id = spacket->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_UEContextReleaseCommandIEs.uE_S1AP_IDs.choice.uE_S1AP_ID_pair.mME_UE_S1AP_ID;
+ break;
+ case S1ap_UE_S1AP_IDs_PR_mME_UE_S1AP_ID:
+ rx_mme_ue_s1ap_id = rx_packet->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_UEContextReleaseCommandIEs.uE_S1AP_IDs.choice.mME_UE_S1AP_ID;
+ scenario_mme_ue_s1ap_id = spacket->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_UEContextReleaseCommandIEs.uE_S1AP_IDs.choice.mME_UE_S1AP_ID;
+ break;
+ }
+ } else {
+ rx_mme_ue_s1ap_id = rx_packet->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_UEContextReleaseCompleteIEs.mme_ue_s1ap_id;
+ scenario_mme_ue_s1ap_id = spacket->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_UEContextReleaseCompleteIEs.mme_ue_s1ap_id;
+ }
+ break;
+
+ case S1ap_ProcedureCode_id_eNBStatusTransfer:
+ rx_mme_ue_s1ap_id = rx_packet->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_ENBStatusTransferIEs.mme_ue_s1ap_id;
+ scenario_mme_ue_s1ap_id = spacket->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_ENBStatusTransferIEs.mme_ue_s1ap_id;
+ break;
+
+ case S1ap_ProcedureCode_id_MMEStatusTransfer:
+ rx_mme_ue_s1ap_id = rx_packet->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_MMEStatusTransferIEs.mme_ue_s1ap_id;
+ scenario_mme_ue_s1ap_id = spacket->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_MMEStatusTransferIEs.mme_ue_s1ap_id;
+ break;
+
+ case S1ap_ProcedureCode_id_DeactivateTrace:
+ rx_mme_ue_s1ap_id = rx_packet->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_DeactivateTraceIEs.mme_ue_s1ap_id;
+ scenario_mme_ue_s1ap_id = spacket->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_DeactivateTraceIEs.mme_ue_s1ap_id;
+ break;
+
+ case S1ap_ProcedureCode_id_TraceStart:
+ rx_mme_ue_s1ap_id = rx_packet->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_TraceStartIEs.mme_ue_s1ap_id;
+ scenario_mme_ue_s1ap_id = spacket->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_TraceStartIEs.mme_ue_s1ap_id;
+ break;
+
+ case S1ap_ProcedureCode_id_TraceFailureIndication:
+ rx_mme_ue_s1ap_id = rx_packet->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_TraceFailureIndicationIEs.mme_ue_s1ap_id;
+ scenario_mme_ue_s1ap_id = spacket->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_TraceFailureIndicationIEs.mme_ue_s1ap_id;
+ break;
+
+ case S1ap_ProcedureCode_id_ENBConfigurationUpdate:
+ /*if (present == S1AP_PDU_PR_initiatingMessage) {
+ rx_mme_ue_s1ap_id = rx_packet->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_ENBConfigurationUpdateIEs.mme_ue_s1ap_id;
+ scenario_mme_ue_s1ap_id = spacket->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_ENBConfigurationUpdateIEs.mme_ue_s1ap_id;
+ } else if (present == S1AP_PDU_PR_successfulOutcome) {
+ rx_mme_ue_s1ap_id = rx_packet->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_ENBConfigurationUpdateAcknowledgeIEs.mme_ue_s1ap_id;
+ scenario_mme_ue_s1ap_id = spacket->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_ENBConfigurationUpdateAcknowledgeIEs.mme_ue_s1ap_id;
+ } else {
+ rx_mme_ue_s1ap_id = rx_packet->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_ENBConfigurationUpdateFailureIEs.mme_ue_s1ap_id;
+ scenario_mme_ue_s1ap_id = spacket->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_ENBConfigurationUpdateFailureIEs.mme_ue_s1ap_id;
+ }*/
+ break;
+
+ case S1ap_ProcedureCode_id_MMEConfigurationUpdate:
+ /*if (present == S1AP_PDU_PR_initiatingMessage) {
+ rx_mme_ue_s1ap_id = rx_packet->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_MMEConfigurationUpdateIEs.mme_ue_s1ap_id;
+ scenario_mme_ue_s1ap_id = spacket->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_MMEConfigurationUpdateIEs.mme_ue_s1ap_id;
+ } else if (present == S1AP_PDU_PR_successfulOutcome) {
+ rx_mme_ue_s1ap_id = rx_packet->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_MMEConfigurationUpdateAcknowledgeIEs.mme_ue_s1ap_id;
+ scenario_mme_ue_s1ap_id = spacket->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_MMEConfigurationUpdateAcknowledgeIEs.mme_ue_s1ap_id;
+ } else {
+ rx_mme_ue_s1ap_id = rx_packet->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_MMEConfigurationUpdateFailureIEs.mme_ue_s1ap_id;
+ scenario_mme_ue_s1ap_id = spacket->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_MMEConfigurationUpdateFailureIEs.mme_ue_s1ap_id;
+ }*/
+ break;
+
+ case S1ap_ProcedureCode_id_LocationReportingControl:
+ rx_mme_ue_s1ap_id = rx_packet->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_LocationReportingControlIEs.mme_ue_s1ap_id;
+ scenario_mme_ue_s1ap_id = spacket->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_LocationReportingControlIEs.mme_ue_s1ap_id;
+ break;
+
+ case S1ap_ProcedureCode_id_LocationReportingFailureIndication:
+ rx_mme_ue_s1ap_id = rx_packet->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_LocationReportingFailureIndicationIEs.mme_ue_s1ap_id;
+ scenario_mme_ue_s1ap_id = spacket->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_LocationReportingFailureIndicationIEs.mme_ue_s1ap_id;
+ break;
+
+ case S1ap_ProcedureCode_id_LocationReport:
+ rx_mme_ue_s1ap_id = rx_packet->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_LocationReportIEs.mme_ue_s1ap_id;
+ scenario_mme_ue_s1ap_id = spacket->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_LocationReportIEs.mme_ue_s1ap_id;
+ break;
+
+ case S1ap_ProcedureCode_id_OverloadStart:
+ //rx_mme_ue_s1ap_id = rx_packet->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_OverloadStartIEs.mme_ue_s1ap_id;
+ //scenario_mme_ue_s1ap_id = spacket->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_OverloadStartIEs.mme_ue_s1ap_id;
+ break;
+
+ case S1ap_ProcedureCode_id_OverloadStop:
+ //rx_mme_ue_s1ap_id = rx_packet->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_OverloadStopIEs.mme_ue_s1ap_id;
+ //scenario_mme_ue_s1ap_id = spacket->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_OverloadStopIEs.mme_ue_s1ap_id;
+ break;
+
+ case S1ap_ProcedureCode_id_WriteReplaceWarning:
+ /*if (present == S1AP_PDU_PR_initiatingMessage) {
+ rx_mme_ue_s1ap_id = rx_packet->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_WriteReplaceWarningRequestIEs.mme_ue_s1ap_id;
+ scenario_mme_ue_s1ap_id = spacket->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_WriteReplaceWarningRequestIEs.mme_ue_s1ap_id;
+ } else {
+ rx_mme_ue_s1ap_id = rx_packet->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_WriteReplaceWarningResponseIEs.mme_ue_s1ap_id;
+ scenario_mme_ue_s1ap_id = spacket->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_WriteReplaceWarningResponseIEs.mme_ue_s1ap_id;
+ }*/
+ break;
+
+ case S1ap_ProcedureCode_id_eNBDirectInformationTransfer:
+ //rx_mme_ue_s1ap_id = rx_packet->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_ENBDirectInformationTransferIEs.mme_ue_s1ap_id;
+ //scenario_mme_ue_s1ap_id = spacket->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_ENBDirectInformationTransferIEs.mme_ue_s1ap_id;
+ break;
+
+ case S1ap_ProcedureCode_id_MMEDirectInformationTransfer:
+ //rx_mme_ue_s1ap_id = rx_packet->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_MMEDirectInformationTransferIEs.mme_ue_s1ap_id;
+ //scenario_mme_ue_s1ap_id = spacket->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_MMEDirectInformationTransferIEs.mme_ue_s1ap_id;
+ break;
+
+ case S1ap_ProcedureCode_id_PrivateMessage:
+ case S1ap_ProcedureCode_id_eNBConfigurationTransfer:
+ case S1ap_ProcedureCode_id_MMEConfigurationTransfer:
+ AssertFatal(0, "TODO");
+ break;
+
+ case S1ap_ProcedureCode_id_CellTrafficTrace:
+ rx_mme_ue_s1ap_id = rx_packet->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_CellTrafficTraceIEs.mme_ue_s1ap_id;
+ scenario_mme_ue_s1ap_id = spacket->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_CellTrafficTraceIEs.mme_ue_s1ap_id;
+ break;
+
+ case S1ap_ProcedureCode_id_Kill:
+ /*if (present == S1AP_PDU_PR_initiatingMessage) {
+ rx_mme_ue_s1ap_id = rx_packet->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_KillRequestIEs.mme_ue_s1ap_id;
+ scenario_mme_ue_s1ap_id = spacket->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_KillRequestIEs.mme_ue_s1ap_id;
+ } else {
+ rx_mme_ue_s1ap_id = rx_packet->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_KillResponseIEs.mme_ue_s1ap_id;
+ scenario_mme_ue_s1ap_id = spacket->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_KillResponseIEs.mme_ue_s1ap_id;
+ }*/
+ break;
+
+ case S1ap_ProcedureCode_id_downlinkUEAssociatedLPPaTransport:
+ rx_mme_ue_s1ap_id = rx_packet->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_DownlinkUEAssociatedLPPaTransport_IEs.mme_ue_s1ap_id;
+ scenario_mme_ue_s1ap_id = spacket->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_DownlinkUEAssociatedLPPaTransport_IEs.mme_ue_s1ap_id;
+ break;
+
+ case S1ap_ProcedureCode_id_uplinkUEAssociatedLPPaTransport:
+ rx_mme_ue_s1ap_id = rx_packet->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_UplinkUEAssociatedLPPaTransport_IEs.mme_ue_s1ap_id;
+ scenario_mme_ue_s1ap_id = spacket->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_UplinkUEAssociatedLPPaTransport_IEs.mme_ue_s1ap_id;
+ break;
+
+ case S1ap_ProcedureCode_id_downlinkNonUEAssociatedLPPaTransport:
+ //rx_mme_ue_s1ap_id = rx_packet->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_DownlinkNonUEAssociatedLPPaTransport_IEs.mme_ue_s1ap_id;
+ //scenario_mme_ue_s1ap_id = spacket->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_DownlinkNonUEAssociatedLPPaTransport_IEs.mme_ue_s1ap_id;
+ break;
+
+ case S1ap_ProcedureCode_id_uplinkNonUEAssociatedLPPaTransport:
+ //rx_mme_ue_s1ap_id = rx_packet->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_UplinkNonUEAssociatedLPPaTransport_IEs.mme_ue_s1ap_id;
+ //scenario_mme_ue_s1ap_id = spacket->sctp_hdr.u.data_hdr.payload.message.msg.s1ap_UplinkNonUEAssociatedLPPaTransport_IEs.mme_ue_s1ap_id;
+ break;
+
+ default:
+ AssertFatal(0, "Unknown procedure code %ld", rx_packet->sctp_hdr.u.data_hdr.payload.message.procedureCode);
+ }
+ if (scenario_mme_ue_s1ap_id != rx_mme_ue_s1ap_id) {
+ S1AP_DEBUG("%s() Updating mme_ue_s1ap_id %u -> %u \n", __FUNCTION__, scenario_mme_ue_s1ap_id, rx_mme_ue_s1ap_id);
+ et_packet_t * p = spacket;
+ while (p) {
+ et_s1ap_update_mme_ue_s1ap_id(p, scenario_mme_ue_s1ap_id, rx_mme_ue_s1ap_id);
+ p = p->next;
+ }
+ return 0;
+ }
+ return 1;
+}
+//------------------------------------------------------------------------------
+asn_comp_rval_t * et_s1ap_is_matching(et_s1ap_t * const s1ap1, et_s1ap_t * const s1ap2, const uint32_t constraints)
+{
+ asn_comp_rval_t *rv = NULL;
+ if (s1ap1->pdu.present != s1ap2->pdu.present) {rv = calloc(1, sizeof(asn_comp_rval_t)); rv->err_code = ET_ERROR_MATCH_PACKET_S1AP_PRESENT; return rv;}
+ switch (s1ap1->pdu.present) {
+ case S1AP_PDU_PR_NOTHING:
+ break;
+ case S1AP_PDU_PR_initiatingMessage:
+ if (s1ap1->pdu.choice.initiatingMessage.procedureCode != s1ap2->pdu.choice.initiatingMessage.procedureCode)
+ {rv = calloc(1, sizeof(asn_comp_rval_t)); rv->err_code = ET_ERROR_MATCH_PACKET_S1AP_PROCEDURE_CODE; return rv;}
+ if (s1ap1->pdu.choice.initiatingMessage.criticality != s1ap2->pdu.choice.initiatingMessage.criticality)
+ {rv = calloc(1, sizeof(asn_comp_rval_t)); rv->err_code = ET_ERROR_MATCH_PACKET_S1AP_CRITICALITY; return rv;}
+ break;
+ case S1AP_PDU_PR_successfulOutcome:
+ if (s1ap1->pdu.choice.successfulOutcome.procedureCode != s1ap2->pdu.choice.successfulOutcome.procedureCode)
+ {rv = calloc(1, sizeof(asn_comp_rval_t)); rv->err_code = ET_ERROR_MATCH_PACKET_S1AP_PROCEDURE_CODE; return rv;}
+ if (s1ap1->pdu.choice.successfulOutcome.criticality != s1ap2->pdu.choice.successfulOutcome.criticality)
+ {rv = calloc(1, sizeof(asn_comp_rval_t)); rv->err_code = ET_ERROR_MATCH_PACKET_S1AP_CRITICALITY; return rv;}
+ break;
+ case S1AP_PDU_PR_unsuccessfulOutcome:
+ if (s1ap1->pdu.choice.unsuccessfulOutcome.procedureCode != s1ap2->pdu.choice.unsuccessfulOutcome.procedureCode)
+ {rv = calloc(1, sizeof(asn_comp_rval_t)); rv->err_code = ET_ERROR_MATCH_PACKET_S1AP_PROCEDURE_CODE; return rv;}
+ if (s1ap1->pdu.choice.unsuccessfulOutcome.criticality != s1ap2->pdu.choice.unsuccessfulOutcome.criticality)
+ {rv = calloc(1, sizeof(asn_comp_rval_t)); rv->err_code = ET_ERROR_MATCH_PACKET_S1AP_CRITICALITY; return rv;}
+ break;
+ default:
+ AssertFatal(0, "Unknown pdu.present %d", s1ap1->pdu.present);
+ }
+
+ if (s1ap1->binary_stream_allocated_size == s1ap2->binary_stream_allocated_size) {
+ if (memcmp((void*)s1ap1->binary_stream, (void*)s1ap2->binary_stream, s1ap1->binary_stream_allocated_size) == 0) return NULL;
+ }
+ // if no matching, may be the scenario need minor corrections (same enb_ue_s1ap_id but need to update mme_ue_s1ap_id)
+ return et_s1ap_ies_is_matching(s1ap1->pdu.present, &s1ap1->message, &s1ap2->message, constraints);
+}
+
+//------------------------------------------------------------------------------
+et_packet_t* et_build_packet_from_s1ap_data_ind(et_event_s1ap_data_ind_t * const s1ap_data_ind)
+{
+ et_packet_t * packet = NULL;
+ AssertFatal (NULL != s1ap_data_ind, "Bad parameter sctp_data_ind\n");
+ packet = calloc(1, sizeof(*packet));
+ packet->action = ET_PACKET_ACTION_S1C_NULL;
+ //packet->time_relative_to_first_packet.tv_sec = 0;
+ //packet->time_relative_to_first_packet.tv_usec = 0;
+ //packet->time_relative_to_last_sent_packet.tv_sec = 0;
+ //packet->time_relative_to_last_sent_packet.tv_usec = 0;
+ //packet->time_relative_to_last_received_packet.tv_sec = 0;
+ //packet->time_relative_to_last_received_packet.tv_usec = 0;
+ //packet->original_frame_number = 0;
+ //packet->packet_number = 0;
+ packet->enb_instance = 0; //TODO
+ //packet->ip_hdr;
+ // keep in mind: allocated buffer: sctp_datahdr.payload.binary_stream
+ packet->sctp_hdr.chunk_type = SCTP_CID_DATA;
+ memcpy((void*)&packet->sctp_hdr.u.data_hdr, (void*)&s1ap_data_ind->sctp_datahdr, sizeof(packet->sctp_hdr));
+ //packet->next = NULL;
+ packet->status = ET_PACKET_STATUS_RECEIVED;
+ //packet->timer_id = 0;
+ AssertFatal(0 == gettimeofday(&packet->timestamp_packet, NULL), "gettimeofday() Failed");
+ return packet;
+}
+
+
+//------------------------------------------------------------------------------
+// return 0 if packet was waited
+int et_scenario_set_packet_received(et_packet_t * const packet)
+{
+ et_packet_t * p = NULL;
+ int rc = 0;
+
+ packet->status = ET_PACKET_STATUS_RECEIVED;
+ S1AP_DEBUG("Packet received: num %u | original frame number %u \n", packet->packet_number, packet->original_frame_number);
+ S1AP_DEBUG("Last Packet received: num %u | original frame number %u \n", g_scenario->last_rx_packet->packet_number, g_scenario->last_rx_packet->original_frame_number);
+
+ p = g_scenario->last_rx_packet;
+ while (NULL != p) {
+ if (ET_PACKET_ACTION_S1C_RECEIVE == p->action) {
+ if ((ET_PACKET_STATUS_RECEIVED == p->status) || (ET_PACKET_STATUS_NOT_TAKEN_IN_ACCOUNT == p->status)) {
+ g_scenario->last_rx_packet = p;
+ g_scenario->time_last_rx_packet.tv_sec = p->timestamp_packet.tv_sec;
+ g_scenario->time_last_rx_packet.tv_usec = p->timestamp_packet.tv_usec;
+ S1AP_DEBUG("Set Last Packet received: num %u | original frame number %u \n", g_scenario->last_rx_packet->packet_number, g_scenario->last_rx_packet->original_frame_number);
+ S1AP_DEBUG("Set time_last_rx_packet %ld.%06d\n", g_scenario->time_last_rx_packet.tv_sec, g_scenario->time_last_rx_packet.tv_usec);
+ } else {
+ break;
+ }
+ }
+ p = p->next;
+ }
+
+ if (0 != packet->timer_id) {
+ rc = timer_remove(packet->timer_id);
+ AssertFatal(rc == 0, "TODO: Debug Timer on Rx packet num %d unknown", packet->packet_number);
+ g_scenario->timer_count--;
+ return rc;
+ }
+ return 1;
+}
+
+//------------------------------------------------------------------------------
+int et_s1ap_process_rx_packet(et_event_s1ap_data_ind_t * const s1ap_data_ind)
+{
+ et_packet_t *packet = NULL;
+ et_packet_t *rx_packet = NULL;
+ unsigned long int not_found = 1;
+ asn_comp_rval_t *comp_results = NULL;
+ asn_comp_rval_t *comp_results2 = NULL;
+ unsigned char error_code = 0;
+
+ AssertFatal (NULL != s1ap_data_ind, "Bad parameter sctp_data_ind\n");
+ rx_packet = et_build_packet_from_s1ap_data_ind(s1ap_data_ind);
+
+ if (NULL == g_scenario->last_rx_packet) {
+ packet = g_scenario->list_packet;
+ while (NULL != packet) {
+ if (packet->action == ET_PACKET_ACTION_S1C_RECEIVE) {
+ if ((ET_PACKET_STATUS_RECEIVED == packet->status) || (ET_PACKET_STATUS_NOT_TAKEN_IN_ACCOUNT == packet->status)) {
+ g_scenario->last_rx_packet = packet;
+ if (ET_PACKET_STATUS_NOT_TAKEN_IN_ACCOUNT != packet->status) {
+ g_scenario->time_last_rx_packet.tv_sec = packet->timestamp_packet.tv_sec;
+ g_scenario->time_last_rx_packet.tv_usec = packet->timestamp_packet.tv_usec;
+ }
+ S1AP_DEBUG("Set Last Packet received: num %u | original frame number %u \n", g_scenario->last_rx_packet->packet_number, g_scenario->last_rx_packet->original_frame_number);
+ S1AP_DEBUG("Set time_last_rx_packet %ld.%06d\n", g_scenario->time_last_rx_packet.tv_sec, g_scenario->time_last_rx_packet.tv_usec);
+ } else {
+ break;
+ }
+ }
+ packet = packet->next;
+ }
+ packet = g_scenario->list_packet;
+ } else {
+ packet = g_scenario->last_rx_packet->next;
+ }
+ // not_found threshold may sure depend on number of mme, may be not sure on number of UE
+ while ((NULL != packet) && (not_found < 7)) {
+ S1AP_DEBUG("%s() Considering packet num %d original frame number %u\n", __FUNCTION__, packet->packet_number, packet->original_frame_number);
+ if (packet->action == ET_PACKET_ACTION_S1C_RECEIVE) {
+ comp_results = et_sctp_is_matching(&packet->sctp_hdr, &rx_packet->sctp_hdr, g_constraints);
+ if (NULL == comp_results) {
+ S1AP_DEBUG("Compare RX packet with packet: num %u | original frame number %u \n", packet->packet_number, packet->original_frame_number);
+ packet->timestamp_packet.tv_sec = rx_packet->timestamp_packet.tv_sec;
+ packet->timestamp_packet.tv_usec = rx_packet->timestamp_packet.tv_usec;
+ return et_scenario_set_packet_received(packet);
+ } else {
+ S1AP_DEBUG("Compare RX packet with packet: num %u | original frame number %u failed\n",
+ packet->packet_number, packet->original_frame_number);
+ while (comp_results) {
+ S1AP_DEBUG("Result err code %s(%u) ASN1 struct name %s\n",
+ et_error_match2str(comp_results->err_code), comp_results->err_code, comp_results->name);
+ // (each asn1 rc <= 166 (enum e_S1ap_ProtocolIE_ID, in generated file S1ap_ProtocolIE_ID.h))
+ if (comp_results->err_code == COMPARE_ERR_CODE_NO_MATCH) {
+ //TODO MME_UE_S1AP_ID, etc.
+ // get latest error code
+ if (strcmp(comp_results->name, "S1ap-MME-UE-S1AP-ID") == 0) {
+ if (0 == et_handle_s1ap_mismatch_mme_ue_s1ap_id((et_packet_t *const)packet, (et_packet_t *const)rx_packet)) {
+ packet->timestamp_packet.tv_sec = rx_packet->timestamp_packet.tv_sec;
+ packet->timestamp_packet.tv_usec = rx_packet->timestamp_packet.tv_usec;
+ return et_scenario_set_packet_received(packet);
+ }
+ } else if (strcmp(comp_results->name, "S1ap-TransportLayerAddress") == 0) {
+ S1AP_WARN("Some work needed there for %s, TODO in generic_scenario.xsl, add epc conf file in the process, anyway continuing...\n",comp_results->name);
+ packet->timestamp_packet.tv_sec = rx_packet->timestamp_packet.tv_sec;
+ packet->timestamp_packet.tv_usec = rx_packet->timestamp_packet.tv_usec;
+ return et_scenario_set_packet_received(packet);
+ } else {
+ S1AP_WARN("\n\nRX PACKET:\n");
+ et_display_packet_sctp(&rx_packet->sctp_hdr);
+ S1AP_WARN("\n\nWAITED PACKET:\n");
+ et_display_packet_sctp(&packet->sctp_hdr);
+ AssertFatal(0,"Some work needed there");
+ }
+ }
+ comp_results2 = comp_results;
+ comp_results = comp_results2->next;
+ et_free_pointer(comp_results2);
+ }
+ }
+ }
+ not_found += 1;
+ packet = packet->next;
+ }
+ et_display_packet_sctp(&rx_packet->sctp_hdr);
+ AssertFatal(0, "Rx packet not found in scenario (see dump above)");
+ return -1;
+}
+
+//------------------------------------------------------------------------------
+void et_s1ap_eNB_handle_sctp_data_ind(sctp_data_ind_t * const sctp_data_ind)
+{
+ int result = 0;
+ et_event_t event;
+
+ DevAssert(sctp_data_ind != NULL);
+
+ memset((void*)&event, 0, sizeof(event));
+
+ event.code = ET_EVENT_RX_S1AP;
+ event.u.s1ap_data_ind.sctp_datahdr.tsn = 0;
+ event.u.s1ap_data_ind.sctp_datahdr.stream = sctp_data_ind->stream;
+ event.u.s1ap_data_ind.sctp_datahdr.ssn = 0;
+ event.u.s1ap_data_ind.sctp_datahdr.ppid = S1AP_SCTP_PPID;
+ event.u.s1ap_data_ind.sctp_datahdr.assoc_id = sctp_data_ind->assoc_id;
+
+ event.u.s1ap_data_ind.sctp_datahdr.payload.binary_stream_pos = 0;
+ event.u.s1ap_data_ind.sctp_datahdr.payload.binary_stream_allocated_size = sctp_data_ind->buffer_length;
+ event.u.s1ap_data_ind.sctp_datahdr.payload.binary_stream = NULL;
+ if ((sctp_data_ind->buffer_length > 0) && (NULL != sctp_data_ind->buffer)) {
+ event.u.s1ap_data_ind.sctp_datahdr.payload.binary_stream = calloc(1, sctp_data_ind->buffer_length);
+ memcpy(event.u.s1ap_data_ind.sctp_datahdr.payload.binary_stream,
+ sctp_data_ind->buffer,
+ sctp_data_ind->buffer_length);
+
+ if (et_s1ap_decode_pdu(
+ &event.u.s1ap_data_ind.sctp_datahdr.payload.pdu,
+ &event.u.s1ap_data_ind.sctp_datahdr.payload.message,
+ event.u.s1ap_data_ind.sctp_datahdr.payload.binary_stream,
+ event.u.s1ap_data_ind.sctp_datahdr.payload.binary_stream_allocated_size) < 0) {
+ AssertFatal (0, "ERROR Cannot decode RX S1AP message!\n");
+ }
+
+ }
+
+ result = itti_free(TASK_UNKNOWN, sctp_data_ind->buffer);
+ AssertFatal (result == EXIT_SUCCESS, "Failed to free memory (%d)!\n", result);
+
+ et_scenario_fsm_notify_event(event);
+
+ memset((void*)&event, 0, sizeof(event));
+ event.code = ET_EVENT_TICK;
+ et_scenario_fsm_notify_event(event);
+
+}
+//------------------------------------------------------------------------------
+void et_s1ap_eNB_register_mme(s1ap_eNB_instance_t *instance_p,
+ net_ip_address_t *mme_ip_address,
+ net_ip_address_t *local_ip_addr,
+ uint16_t in_streams,
+ uint16_t out_streams)
+{
+ MessageDef *message_p = NULL;
+ sctp_new_association_req_t *sctp_new_association_req_p = NULL;
+ s1ap_eNB_mme_data_t *s1ap_mme_data_p = NULL;
+
+ DevAssert(instance_p != NULL);
+ DevAssert(mme_ip_address != NULL);
+
+ message_p = itti_alloc_new_message(TASK_S1AP, SCTP_NEW_ASSOCIATION_REQ);
+
+ sctp_new_association_req_p = &message_p->ittiMsg.sctp_new_association_req;
+
+ sctp_new_association_req_p->port = S1AP_PORT_NUMBER;
+ sctp_new_association_req_p->ppid = S1AP_SCTP_PPID;
+
+ sctp_new_association_req_p->in_streams = in_streams;
+ sctp_new_association_req_p->out_streams = out_streams;
+
+ memcpy(&sctp_new_association_req_p->remote_address,
+ mme_ip_address,
+ sizeof(*mme_ip_address));
+
+ memcpy(&sctp_new_association_req_p->local_address,
+ local_ip_addr,
+ sizeof(*local_ip_addr));
+
+ /* Create new MME descriptor */
+ s1ap_mme_data_p = calloc(1, sizeof(*s1ap_mme_data_p));
+ DevAssert(s1ap_mme_data_p != NULL);
+
+ s1ap_mme_data_p->cnx_id = et_s1ap_eNB_fetch_add_global_cnx_id();
+ sctp_new_association_req_p->ulp_cnx_id = s1ap_mme_data_p->cnx_id;
+
+ s1ap_mme_data_p->assoc_id = -1;
+ s1ap_mme_data_p->s1ap_eNB_instance = instance_p;
+
+ memcpy((void*)&s1ap_mme_data_p->mme_net_ip_address, mme_ip_address, sizeof(*mme_ip_address));
+
+
+ STAILQ_INIT(&s1ap_mme_data_p->served_gummei);
+
+ /* Insert the new descriptor in list of known MME
+ * but not yet associated.
+ */
+ RB_INSERT(s1ap_mme_map, &instance_p->s1ap_mme_head, s1ap_mme_data_p);
+ s1ap_mme_data_p->state = S1AP_ENB_STATE_WAITING;
+ instance_p->s1ap_mme_nb ++;
+ instance_p->s1ap_mme_pending_nb ++;
+
+ itti_send_msg_to_task(TASK_SCTP, instance_p->instance, message_p);
+}
+//------------------------------------------------------------------------------
+void et_s1ap_update_assoc_id_of_packets(const int32_t assoc_id,
+ struct s1ap_eNB_instance_s * const s1ap_eNB_instance,
+ s1ap_eNB_mme_data_t * const mme_desc_p)
+{
+ et_packet_t *packet = NULL;
+ int ret;
+ unsigned int old_enb_port = 0;
+ unsigned int old_mme_port = 0;
+
+ S1AP_DEBUG("%s for SCTP association (%u)\n",__FUNCTION__,assoc_id);
+
+ packet = g_scenario->list_packet;
+ while (NULL != packet) {
+ switch (packet->sctp_hdr.chunk_type) {
+
+ case SCTP_CID_DATA :
+ S1AP_DEBUG("%s for SCTP association (%u) SCTP_CID_DATA\n",__FUNCTION__,assoc_id);
+ if ((ET_PACKET_STATUS_NONE == packet->status) || (ET_PACKET_STATUS_SCHEDULED_FOR_RECEIVING == packet->status)) {
+ if (0 < old_mme_port) {
+ if (packet->action == ET_PACKET_ACTION_S1C_SEND) {
+ ret = et_compare_et_ip_to_net_ip_address(&packet->ip_hdr.dst, &mme_desc_p->mme_net_ip_address);
+ if (0 == ret) {
+ ret = et_compare_et_ip_to_net_ip_address(&packet->ip_hdr.src, &s1ap_eNB_instance->s1c_net_ip_address);
+ if (0 == ret) {
+ // same IP src, same IP dst
+ if ((packet->sctp_hdr.dst_port == old_mme_port) && (packet->sctp_hdr.src_port == old_enb_port)) {
+ packet->sctp_hdr.u.data_hdr.assoc_id = assoc_id;
+ S1AP_DEBUG("tPacket:\tnum %u | original frame number %u \n", packet->packet_number, packet->original_frame_number);
+ S1AP_DEBUG("\tUpdated assoc id: %u\n", assoc_id);
+ }
+ }
+ }
+ } else if (packet->action == ET_PACKET_ACTION_S1C_RECEIVE) {
+ ret = et_compare_et_ip_to_net_ip_address(&packet->ip_hdr.src, &mme_desc_p->mme_net_ip_address);
+ if (0 == ret) {
+ ret = et_compare_et_ip_to_net_ip_address(&packet->ip_hdr.dst, &s1ap_eNB_instance->s1c_net_ip_address);
+ if (0 == ret) {
+ // same IP src, same IP dst
+ if ((packet->sctp_hdr.src_port == old_mme_port) && (packet->sctp_hdr.dst_port == old_enb_port)) {
+ packet->sctp_hdr.u.data_hdr.assoc_id = assoc_id;
+ S1AP_DEBUG("tPacket:\tnum %u | original frame number %u \n", packet->packet_number, packet->original_frame_number);
+ S1AP_DEBUG("\tUpdated assoc id: %u\n", assoc_id);
+ }
+ }
+ }
+ }
+ }
+ }
+ break;
+
+ // Strong assumption
+ // in replayed scenario, the order of SCTP INIT packets is supposed to be the same as in the catched scenario
+ case SCTP_CID_INIT:
+ S1AP_DEBUG("%s for SCTP association (%u) SCTP_CID_INIT\n",__FUNCTION__,assoc_id);
+ ret = et_compare_et_ip_to_net_ip_address(&packet->ip_hdr.dst, &mme_desc_p->mme_net_ip_address);
+ if (0 == ret) {
+ ret = et_compare_et_ip_to_net_ip_address(&packet->ip_hdr.src, &s1ap_eNB_instance->s1c_net_ip_address);
+ if (0 == ret) {
+ if (0 == old_enb_port) {
+ if (ET_PACKET_STATUS_NONE == packet->status) {
+ packet->status = ET_PACKET_STATUS_SENT;
+ old_enb_port = packet->sctp_hdr.src_port;
+ S1AP_DEBUG("%s for SCTP association (%u) SCTP_CID_INIT SUCCESS\n",__FUNCTION__,assoc_id);
+ }
+ }
+ }
+ }
+ break;
+
+ case SCTP_CID_INIT_ACK:
+ S1AP_DEBUG("%s for SCTP association (%u) SCTP_CID_INIT_ACK\n",__FUNCTION__,assoc_id);
+ ret = et_compare_et_ip_to_net_ip_address(&packet->ip_hdr.src, &mme_desc_p->mme_net_ip_address);
+ if (0 == ret) {
+ ret = et_compare_et_ip_to_net_ip_address(&packet->ip_hdr.dst, &s1ap_eNB_instance->s1c_net_ip_address);
+ if (0 == ret) {
+ if (old_enb_port == packet->sctp_hdr.dst_port) {
+ if (ET_PACKET_STATUS_NONE == packet->status) {
+ packet->status = ET_PACKET_STATUS_RECEIVED;
+ old_mme_port = packet->sctp_hdr.dst_port;
+ S1AP_DEBUG("%s for SCTP association (%u) SCTP_CID_INIT_ACK SUCCESS\n",__FUNCTION__,assoc_id);
+ }
+ }
+ }
+ }
+ break;
+
+ case SCTP_CID_HEARTBEAT:
+ case SCTP_CID_HEARTBEAT_ACK:
+ case SCTP_CID_COOKIE_ECHO:
+ case SCTP_CID_COOKIE_ACK:
+ case SCTP_CID_ECN_ECNE:
+ case SCTP_CID_ECN_CWR:
+ break;
+
+ case SCTP_CID_ABORT:
+ case SCTP_CID_SHUTDOWN:
+ case SCTP_CID_SHUTDOWN_ACK:
+ case SCTP_CID_ERROR:
+ case SCTP_CID_SHUTDOWN_COMPLETE:
+ //TODO
+ break;
+
+ default:
+ AssertFatal(0, "Unknown chunk_type %d packet num %d", packet->sctp_hdr.chunk_type, packet->packet_number);
+ ;
+ }
+ packet = packet->next;
+ }
+}
+//------------------------------------------------------------------------------
+void et_s1ap_handle_s1_setup_message(s1ap_eNB_mme_data_t *mme_desc_p, int sctp_shutdown)
+{
+ if (sctp_shutdown) {
+ /* A previously connected MME has been shutdown */
+
+ /* TODO check if it was used by some eNB and send a message to inform these eNB if there is no more associated MME */
+ if (mme_desc_p->state == S1AP_ENB_STATE_CONNECTED) {
+ mme_desc_p->state = S1AP_ENB_STATE_DISCONNECTED;
+
+ if (mme_desc_p->s1ap_eNB_instance->s1ap_mme_associated_nb > 0) {
+ /* Decrease associated MME number */
+ mme_desc_p->s1ap_eNB_instance->s1ap_mme_associated_nb --;
+ }
+
+ /* If there are no more associated MME, inform eNB app */
+ if (mme_desc_p->s1ap_eNB_instance->s1ap_mme_associated_nb == 0) {
+ MessageDef *message_p;
+
+ message_p = itti_alloc_new_message(TASK_S1AP, S1AP_DEREGISTERED_ENB_IND);
+ S1AP_DEREGISTERED_ENB_IND(message_p).nb_mme = 0;
+ itti_send_msg_to_task(TASK_ENB_APP, mme_desc_p->s1ap_eNB_instance->instance, message_p);
+ }
+ }
+ } else {
+ /* Check that at least one setup message is pending */
+ DevCheck(mme_desc_p->s1ap_eNB_instance->s1ap_mme_pending_nb > 0, mme_desc_p->s1ap_eNB_instance->instance,
+ mme_desc_p->s1ap_eNB_instance->s1ap_mme_pending_nb, 0);
+
+ if (mme_desc_p->s1ap_eNB_instance->s1ap_mme_pending_nb > 0) {
+ /* Decrease pending messages number */
+ mme_desc_p->s1ap_eNB_instance->s1ap_mme_pending_nb --;
+ mme_desc_p->s1ap_eNB_instance->s1ap_mme_associated_nb++;
+ }
+
+ et_s1ap_update_assoc_id_of_packets(mme_desc_p->assoc_id,
+ mme_desc_p->s1ap_eNB_instance,
+ mme_desc_p);
+
+
+ /* If there are no more pending messages, inform eNB app */
+ if (mme_desc_p->s1ap_eNB_instance->s1ap_mme_pending_nb == 0) {
+ MessageDef *message_p;
+
+ message_p = itti_alloc_new_message(TASK_S1AP, S1AP_REGISTER_ENB_CNF);
+ S1AP_REGISTER_ENB_CNF(message_p).nb_mme = mme_desc_p->s1ap_eNB_instance->s1ap_mme_associated_nb;
+ itti_send_msg_to_task(TASK_ENB_APP, mme_desc_p->s1ap_eNB_instance->instance, message_p);
+ }
+ }
+}
+//------------------------------------------------------------------------------
+void et_s1ap_eNB_handle_register_eNB(instance_t instance, s1ap_register_enb_req_t *s1ap_register_eNB)
+{
+ s1ap_eNB_instance_t *new_instance;
+ uint8_t index;
+
+ DevAssert(s1ap_register_eNB != NULL);
+
+ /* Look if the provided instance already exists */
+ new_instance = et_s1ap_eNB_get_instance(instance);
+
+ if (new_instance != NULL) {
+ /* Checks if it is a retry on the same eNB */
+ DevCheck(new_instance->eNB_id == s1ap_register_eNB->eNB_id, new_instance->eNB_id, s1ap_register_eNB->eNB_id, 0);
+ DevCheck(new_instance->cell_type == s1ap_register_eNB->cell_type, new_instance->cell_type, s1ap_register_eNB->cell_type, 0);
+ DevCheck(new_instance->tac == s1ap_register_eNB->tac, new_instance->tac, s1ap_register_eNB->tac, 0);
+ DevCheck(new_instance->mcc == s1ap_register_eNB->mcc, new_instance->mcc, s1ap_register_eNB->mcc, 0);
+ DevCheck(new_instance->mnc == s1ap_register_eNB->mnc, new_instance->mnc, s1ap_register_eNB->mnc, 0);
+ DevCheck(new_instance->mnc_digit_length == s1ap_register_eNB->mnc_digit_length, new_instance->mnc_digit_length, s1ap_register_eNB->mnc_digit_length, 0);
+ DevCheck(memcmp((void*)&new_instance->s1c_net_ip_address, (void*)&s1ap_register_eNB->enb_ip_address, sizeof(new_instance->s1c_net_ip_address)) == 0, 0,0,0);
+ } else {
+ new_instance = calloc(1, sizeof(s1ap_eNB_instance_t));
+ DevAssert(new_instance != NULL);
+
+ RB_INIT(&new_instance->s1ap_ue_head);
+ RB_INIT(&new_instance->s1ap_mme_head);
+
+ /* Copy usefull parameters */
+ new_instance->instance = instance;
+ new_instance->eNB_name = s1ap_register_eNB->eNB_name;
+ new_instance->eNB_id = s1ap_register_eNB->eNB_id;
+ new_instance->cell_type = s1ap_register_eNB->cell_type;
+ new_instance->tac = s1ap_register_eNB->tac;
+ new_instance->mcc = s1ap_register_eNB->mcc;
+ new_instance->mnc = s1ap_register_eNB->mnc;
+ new_instance->mnc_digit_length = s1ap_register_eNB->mnc_digit_length;
+ memcpy((void*)&new_instance->s1c_net_ip_address, (void*)&s1ap_register_eNB->enb_ip_address, sizeof(new_instance->s1c_net_ip_address));
+
+ /* Add the new instance to the list of eNB (meaningfull in virtual mode) */
+ et_s1ap_eNB_insert_new_instance(new_instance);
+
+ S1AP_DEBUG("Registered new eNB[%d] and %s eNB id %u\n",
+ instance,
+ s1ap_register_eNB->cell_type == CELL_MACRO_ENB ? "macro" : "home",
+ s1ap_register_eNB->eNB_id);
+ }
+
+ DevCheck(s1ap_register_eNB->nb_mme <= S1AP_MAX_NB_MME_IP_ADDRESS,
+ S1AP_MAX_NB_MME_IP_ADDRESS, s1ap_register_eNB->nb_mme, 0);
+
+ /* Trying to connect to provided list of MME ip address */
+ for (index = 0; index < s1ap_register_eNB->nb_mme; index++) {
+ et_s1ap_eNB_register_mme(new_instance,
+ &s1ap_register_eNB->mme_ip_address[index],
+ &s1ap_register_eNB->enb_ip_address,
+ s1ap_register_eNB->sctp_in_streams,
+ s1ap_register_eNB->sctp_out_streams);
+ }
+}
+
+//------------------------------------------------------------------------------
+void et_s1ap_eNB_handle_sctp_association_resp(instance_t instance, sctp_new_association_resp_t *sctp_new_association_resp)
+{
+ s1ap_eNB_instance_t *instance_p = NULL;
+ s1ap_eNB_mme_data_t *s1ap_mme_data_p = NULL;
+
+ DevAssert(sctp_new_association_resp != NULL);
+
+ instance_p = et_s1ap_eNB_get_instance(instance);
+ DevAssert(instance_p != NULL);
+
+ s1ap_mme_data_p = et_s1ap_eNB_get_MME(instance_p, -1,
+ sctp_new_association_resp->ulp_cnx_id);
+ DevAssert(s1ap_mme_data_p != NULL);
+
+ if (sctp_new_association_resp->sctp_state != SCTP_STATE_ESTABLISHED) {
+ S1AP_WARN("Received unsuccessful result for SCTP association (%u), instance %d, cnx_id %u\n",
+ sctp_new_association_resp->sctp_state,
+ instance,
+ sctp_new_association_resp->ulp_cnx_id);
+
+ et_s1ap_handle_s1_setup_message(s1ap_mme_data_p, sctp_new_association_resp->sctp_state == SCTP_STATE_SHUTDOWN);
+
+ return;
+ }
+
+ S1AP_DEBUG("Received successful result for SCTP association (%u), instance %d, cnx_id %u\n",
+ sctp_new_association_resp->sctp_state,
+ instance,
+ sctp_new_association_resp->ulp_cnx_id);
+ /* Update parameters */
+ s1ap_mme_data_p->assoc_id = sctp_new_association_resp->assoc_id;
+ s1ap_mme_data_p->in_streams = sctp_new_association_resp->in_streams;
+ s1ap_mme_data_p->out_streams = sctp_new_association_resp->out_streams;
+
+ et_s1ap_handle_s1_setup_message(s1ap_mme_data_p, sctp_new_association_resp->sctp_state == SCTP_STATE_SHUTDOWN);
+}
+
+//------------------------------------------------------------------------------
+void *et_s1ap_eNB_task(void *arg)
+{
+ MessageDef *received_msg = NULL;
+ int result;
+
+ S1AP_DEBUG("Starting S1AP layer\n");
+
+ et_s1ap_eNB_prepare_internal_data();
+
+ itti_mark_task_ready(TASK_S1AP);
+ MSC_START_USE();
+
+ while (1) {
+ itti_receive_msg(TASK_S1AP, &received_msg);
+
+ switch (ITTI_MSG_ID(received_msg)) {
+ case TERMINATE_MESSAGE:
+ itti_exit_task();
+ break;
+
+ case S1AP_REGISTER_ENB_REQ: {
+ /* Register a new eNB.
+ * in Virtual mode eNBs will be distinguished using the mod_id/
+ * Each eNB has to send an S1AP_REGISTER_ENB message with its
+ * own parameters.
+ */
+ et_s1ap_eNB_handle_register_eNB(ITTI_MESSAGE_GET_INSTANCE(received_msg),
+ &S1AP_REGISTER_ENB_REQ(received_msg));
+ }
+ break;
+
+ case SCTP_NEW_ASSOCIATION_RESP: {
+ et_s1ap_eNB_handle_sctp_association_resp(ITTI_MESSAGE_GET_INSTANCE(received_msg),
+ &received_msg->ittiMsg.sctp_new_association_resp);
+ }
+ break;
+
+ case SCTP_DATA_IND: {
+ et_s1ap_eNB_handle_sctp_data_ind(&received_msg->ittiMsg.sctp_data_ind);
+ }
+ break;
+
+ case TIMER_HAS_EXPIRED:
+ LOG_I(S1AP, " Received TIMER_HAS_EXPIRED: timer_id %d\n", TIMER_HAS_EXPIRED(received_msg).timer_id);
+ {
+ et_packet_t * packet = (et_packet_t*)TIMER_HAS_EXPIRED (received_msg).arg;
+ et_event_t event;
+ g_scenario->timer_count--;
+ if (NULL != packet) {
+ if (packet->status == ET_PACKET_STATUS_SCHEDULED_FOR_RECEIVING) {
+ memset((void*)&event, 0, sizeof(event));
+ event.code = ET_EVENT_RX_PACKET_TIME_OUT;
+ event.u.rx_packet_time_out = packet;
+ et_scenario_fsm_notify_event(event);
+ } else if (packet->status == ET_PACKET_STATUS_SCHEDULED_FOR_SENDING) {
+ memset((void*)&event, 0, sizeof(event));
+ event.code = ET_EVENT_TX_TIMED_PACKET;
+ event.u.tx_timed_packet = packet;
+ et_scenario_fsm_notify_event(event);
+
+ et_event_t continue_event;
+ continue_event.code = ET_EVENT_TICK;
+ et_scenario_fsm_notify_event(continue_event);
+ } else if ((packet->status != ET_PACKET_STATUS_SENT) && ((packet->status != ET_PACKET_STATUS_RECEIVED))) {
+ AssertFatal (0, "Bad status %d of packet timed out!\n", packet->status);
+ }
+ } else {
+ LOG_W(S1AP, " Received TIMER_HAS_EXPIRED: timer_id %d, no packet attached to timer\n", TIMER_HAS_EXPIRED(received_msg).timer_id);
+ }
+ }
+ if (TIMER_HAS_EXPIRED (received_msg).timer_id == g_scenario->enb_register_retry_timer_id) {
+ /* Restart the registration process */
+ g_scenario->registered_enb = 0;
+ et_eNB_app_register (g_scenario->enb_properties);
+ }
+ break;
+
+ default:
+ S1AP_ERROR("Received unhandled message: %d:%s\n",
+ ITTI_MSG_ID(received_msg), ITTI_MSG_NAME(received_msg));
+ break;
+ }
+
+ result = itti_free (ITTI_MSG_ORIGIN_ID(received_msg), received_msg);
+ AssertFatal (result == EXIT_SUCCESS, "Failed to free memory (%d)!\n", result);
+
+ received_msg = NULL;
+ }
+
+ return NULL;
+}
+
+
diff --git a/openair3/TEST/EPC_TEST/play_scenario_s1ap_compare_ie.c b/openair3/TEST/EPC_TEST/play_scenario_s1ap_compare_ie.c
new file mode 100644
index 0000000000..5d43b211ee
--- /dev/null
+++ b/openair3/TEST/EPC_TEST/play_scenario_s1ap_compare_ie.c
@@ -0,0 +1,634 @@
+/*******************************************************************************
+ OpenAirInterface
+ Copyright(c) 1999 - 2014 Eurecom
+
+ OpenAirInterface is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+
+ OpenAirInterface is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with OpenAirInterface.The full GNU General Public License is
+ included in this distribution in the file called "COPYING". If not,
+ see .
+
+ Contact Information
+ OpenAirInterface Admin: openair_admin@eurecom.fr
+ OpenAirInterface Tech : openair_tech@eurecom.fr
+ OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr
+
+ Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE
+
+ *******************************************************************************/
+
+/*
+ play_scenario_s1ap_compare_ie.c
+ -------------------
+ AUTHOR : Lionel GAUTHIER
+ COMPANY : EURECOM
+ EMAIL : Lionel.Gauthier@eurecom.fr
+ */
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include "tree.h"
+#include "queue.h"
+
+
+#include "intertask_interface.h"
+#include "timer.h"
+#include "platform_types.h"
+#include "assertions.h"
+#include "conversions.h"
+#include "s1ap_common.h"
+#include "play_scenario_s1ap_eNB_defs.h"
+#include "play_scenario.h"
+#include "msc.h"
+//------------------------------------------------------------------------------
+extern et_scenario_t *g_scenario;
+extern uint32_t g_constraints;
+//------------------------------------------------------------------------------
+
+asn_comp_rval_t * et_s1ap_ies_is_matching(const S1AP_PDU_PR present, s1ap_message * const m1, s1ap_message * const m2, const uint32_t constraints)
+{
+ asn_comp_rval_t *ret = NULL;
+ AssertFatal(m1 != NULL, "bad parameter m1");
+ AssertFatal(m2 != NULL, "bad parameter m2");
+ AssertFatal((present == S1AP_PDU_PR_initiatingMessage) ||
+ (present == S1AP_PDU_PR_successfulOutcome) ||
+ (present == S1AP_PDU_PR_unsuccessfulOutcome) , "Bad parameter S1AP_PDU_PR present ");
+ AssertFatal( m1->procedureCode == m2->procedureCode, "Bad parameters: no matching procedure codes");
+
+
+ // some cases can never occur since uplink only.
+ switch (m1->procedureCode) {
+ case S1ap_ProcedureCode_id_HandoverPreparation:
+ if (present == S1AP_PDU_PR_initiatingMessage) {
+ ret = s1ap_compare_s1ap_handoverrequiredies(
+ &m1->msg.s1ap_HandoverRequiredIEs,
+ &m2->msg.s1ap_HandoverRequiredIEs);
+ } else {
+ ret = s1ap_compare_s1ap_handovercommandies(
+ &m1->msg.s1ap_HandoverCommandIEs,
+ &m2->msg.s1ap_HandoverCommandIEs);
+ }
+ break;
+
+ case S1ap_ProcedureCode_id_HandoverResourceAllocation:
+ if (present == S1AP_PDU_PR_initiatingMessage) {
+ ret = s1ap_compare_s1ap_handoverrequesties(
+ &m1->msg.s1ap_HandoverRequestIEs,
+ &m2->msg.s1ap_HandoverRequestIEs);
+ } else if (present == S1AP_PDU_PR_successfulOutcome) {
+ ret = s1ap_compare_s1ap_handoverrequestacknowledgeies(
+ &m1->msg.s1ap_HandoverRequestAcknowledgeIEs,
+ &m2->msg.s1ap_HandoverRequestAcknowledgeIEs);
+ } else if (present == S1AP_PDU_PR_unsuccessfulOutcome) {
+ ret = s1ap_compare_s1ap_handoverfailureies(
+ &m1->msg.s1ap_HandoverFailureIEs,
+ &m2->msg.s1ap_HandoverFailureIEs);
+ }
+ break;
+
+ case S1ap_ProcedureCode_id_HandoverNotification:
+ ret = s1ap_compare_s1ap_handovernotifyies(
+ &m1->msg.s1ap_HandoverNotifyIEs,
+ &m2->msg.s1ap_HandoverNotifyIEs);
+ break;
+
+ case S1ap_ProcedureCode_id_PathSwitchRequest:
+ ret = s1ap_compare_s1ap_pathswitchrequesties(
+ &m1->msg.s1ap_PathSwitchRequestIEs,
+ &m2->msg.s1ap_PathSwitchRequestIEs);
+ break;
+
+ case S1ap_ProcedureCode_id_HandoverCancel:
+ ret = s1ap_compare_s1ap_handovercancelies(
+ &m1->msg.s1ap_HandoverCancelIEs,
+ &m2->msg.s1ap_HandoverCancelIEs);
+ break;
+
+ case S1ap_ProcedureCode_id_E_RABSetup:
+ if (present == S1AP_PDU_PR_initiatingMessage) {
+ ret = s1ap_compare_s1ap_e_rabsetuprequesties(
+ &m1->msg.s1ap_E_RABSetupRequestIEs,
+ &m2->msg.s1ap_E_RABSetupRequestIEs);
+ } else {
+ ret = s1ap_compare_s1ap_e_rabsetupresponseies(
+ &m1->msg.s1ap_E_RABSetupResponseIEs,
+ &m2->msg.s1ap_E_RABSetupResponseIEs);
+ }
+ break;
+
+ case S1ap_ProcedureCode_id_E_RABModify:
+ if (present == S1AP_PDU_PR_initiatingMessage) {
+ ret = s1ap_compare_s1ap_e_rabmodifyrequesties(
+ &m1->msg.s1ap_E_RABModifyRequestIEs,
+ &m2->msg.s1ap_E_RABModifyRequestIEs);
+ } else {
+ ret = s1ap_compare_s1ap_e_rabmodifyresponseies(
+ &m1->msg.s1ap_E_RABModifyResponseIEs,
+ &m2->msg.s1ap_E_RABModifyResponseIEs);
+ }
+ break;
+
+ case S1ap_ProcedureCode_id_E_RABRelease:
+ if (present == S1AP_PDU_PR_initiatingMessage) {
+ ret = s1ap_compare_s1ap_e_rabreleasecommandies(
+ &m1->msg.s1ap_E_RABReleaseCommandIEs,
+ &m2->msg.s1ap_E_RABReleaseCommandIEs);
+ } else {
+ ret = s1ap_compare_s1ap_e_rabreleaseresponseies(
+ &m1->msg.s1ap_E_RABReleaseResponseIEs,
+ &m2->msg.s1ap_E_RABReleaseResponseIEs);
+ }
+ break;
+
+ case S1ap_ProcedureCode_id_E_RABReleaseIndication:
+ ret = s1ap_compare_s1ap_e_rabreleaseindicationies(
+ &m1->msg.s1ap_E_RABReleaseIndicationIEs,
+ &m2->msg.s1ap_E_RABReleaseIndicationIEs);
+ break;
+
+ case S1ap_ProcedureCode_id_InitialContextSetup:
+ if (present == S1AP_PDU_PR_initiatingMessage) {
+ ret = s1ap_compare_s1ap_initialcontextsetuprequesties(
+ &m1->msg.s1ap_InitialContextSetupRequestIEs,
+ &m2->msg.s1ap_InitialContextSetupRequestIEs);
+ } else {
+ ret = s1ap_compare_s1ap_initialcontextsetupresponseies(
+ &m1->msg.s1ap_InitialContextSetupResponseIEs,
+ &m2->msg.s1ap_InitialContextSetupResponseIEs);
+ }
+ break;
+
+ case S1ap_ProcedureCode_id_Paging:
+ ret = s1ap_compare_s1ap_pagingies(
+ &m1->msg.s1ap_PagingIEs,
+ &m2->msg.s1ap_PagingIEs);
+ break;
+
+ case S1ap_ProcedureCode_id_downlinkNASTransport:
+ ret = s1ap_compare_s1ap_downlinknastransporties(
+ &m1->msg.s1ap_DownlinkNASTransportIEs,
+ &m2->msg.s1ap_DownlinkNASTransportIEs);
+ break;
+
+ case S1ap_ProcedureCode_id_initialUEMessage:
+ ret = s1ap_compare_s1ap_initialuemessageies(
+ &m1->msg.s1ap_InitialUEMessageIEs,
+ &m2->msg.s1ap_InitialUEMessageIEs);
+ break;
+
+ case S1ap_ProcedureCode_id_uplinkNASTransport:
+ ret = s1ap_compare_s1ap_uplinknastransporties(
+ &m1->msg.s1ap_UplinkNASTransportIEs,
+ &m2->msg.s1ap_UplinkNASTransportIEs);
+ break;
+
+ case S1ap_ProcedureCode_id_Reset:
+ ret = s1ap_compare_s1ap_reseties(
+ &m1->msg.s1ap_ResetIEs,
+ &m2->msg.s1ap_ResetIEs);
+ break;
+
+ case S1ap_ProcedureCode_id_ErrorIndication:
+ ret = s1ap_compare_s1ap_errorindicationies(
+ &m1->msg.s1ap_ErrorIndicationIEs,
+ &m2->msg.s1ap_ErrorIndicationIEs);
+ break;
+
+ case S1ap_ProcedureCode_id_NASNonDeliveryIndication:
+ ret = s1ap_compare_s1ap_nasnondeliveryindication_ies(
+ &m1->msg.s1ap_NASNonDeliveryIndication_IEs,
+ &m2->msg.s1ap_NASNonDeliveryIndication_IEs);
+ break;
+
+ case S1ap_ProcedureCode_id_S1Setup:
+ if (present == S1AP_PDU_PR_initiatingMessage) {
+ ret = s1ap_compare_s1ap_s1setuprequesties(
+ &m1->msg.s1ap_S1SetupRequestIEs,
+ &m2->msg.s1ap_S1SetupRequestIEs);
+ } else if (present == S1AP_PDU_PR_successfulOutcome) {
+ ret = s1ap_compare_s1ap_s1setupresponseies(
+ &m1->msg.s1ap_S1SetupResponseIEs,
+ &m2->msg.s1ap_S1SetupResponseIEs);
+ } else if (present == S1AP_PDU_PR_unsuccessfulOutcome) {
+ ret = s1ap_compare_s1ap_s1setupfailureies(
+ &m1->msg.s1ap_S1SetupFailureIEs,
+ &m2->msg.s1ap_S1SetupFailureIEs);
+ }
+ break;
+
+ case S1ap_ProcedureCode_id_UEContextReleaseRequest:
+ ret = s1ap_compare_s1ap_uecontextreleaserequesties(
+ &m1->msg.s1ap_UEContextReleaseRequestIEs,
+ &m2->msg.s1ap_UEContextReleaseRequestIEs);
+ break;
+
+ case S1ap_ProcedureCode_id_DownlinkS1cdma2000tunneling:
+ ret = s1ap_compare_s1ap_downlinks1cdma2000tunnelingies(
+ &m1->msg.s1ap_DownlinkS1cdma2000tunnelingIEs,
+ &m2->msg.s1ap_DownlinkS1cdma2000tunnelingIEs);
+ break;
+
+ case S1ap_ProcedureCode_id_UplinkS1cdma2000tunneling:
+ ret = s1ap_compare_s1ap_uplinks1cdma2000tunnelingies(
+ &m1->msg.s1ap_UplinkS1cdma2000tunnelingIEs,
+ &m2->msg.s1ap_UplinkS1cdma2000tunnelingIEs);
+ break;
+
+ case S1ap_ProcedureCode_id_UEContextModification:
+ if (present == S1AP_PDU_PR_initiatingMessage) {
+ ret = s1ap_compare_s1ap_uecontextmodificationrequesties(
+ &m1->msg.s1ap_UEContextModificationRequestIEs,
+ &m2->msg.s1ap_UEContextModificationRequestIEs);
+ } else if (present == S1AP_PDU_PR_successfulOutcome) {
+ ret = s1ap_compare_s1ap_uecontextmodificationresponseies(
+ &m1->msg.s1ap_UEContextModificationResponseIEs,
+ &m2->msg.s1ap_UEContextModificationResponseIEs);
+ } else if (present == S1AP_PDU_PR_unsuccessfulOutcome) {
+ ret = s1ap_compare_s1ap_uecontextmodificationfailureies(
+ &m1->msg.s1ap_UEContextModificationFailureIEs,
+ &m2->msg.s1ap_UEContextModificationFailureIEs);
+ }
+ break;
+
+ case S1ap_ProcedureCode_id_UECapabilityInfoIndication:
+ ret = s1ap_compare_s1ap_uecapabilityinfoindicationies(
+ &m1->msg.s1ap_UECapabilityInfoIndicationIEs,
+ &m2->msg.s1ap_UECapabilityInfoIndicationIEs);
+ break;
+
+ case S1ap_ProcedureCode_id_UEContextRelease:
+ if (present == S1AP_PDU_PR_initiatingMessage) {
+ ret = s1ap_compare_s1ap_uecontextreleasecommandies(
+ &m1->msg.s1ap_UEContextReleaseCommandIEs,
+ &m2->msg.s1ap_UEContextReleaseCommandIEs);
+ } else {
+ ret = s1ap_compare_s1ap_uecontextreleasecompleteies(
+ &m1->msg.s1ap_UEContextReleaseCompleteIEs,
+ &m2->msg.s1ap_UEContextReleaseCompleteIEs);
+ }
+ break;
+
+ case S1ap_ProcedureCode_id_eNBStatusTransfer:
+ ret = s1ap_compare_s1ap_enbstatustransferies(
+ &m1->msg.s1ap_ENBStatusTransferIEs,
+ &m2->msg.s1ap_ENBStatusTransferIEs);
+ break;
+
+ case S1ap_ProcedureCode_id_MMEStatusTransfer:
+ ret = s1ap_compare_s1ap_mmestatustransferies(
+ &m1->msg.s1ap_MMEStatusTransferIEs,
+ &m2->msg.s1ap_MMEStatusTransferIEs);
+ break;
+
+ case S1ap_ProcedureCode_id_DeactivateTrace:
+ ret = s1ap_compare_s1ap_deactivatetraceies(
+ &m1->msg.s1ap_DeactivateTraceIEs,
+ &m2->msg.s1ap_DeactivateTraceIEs);
+ break;
+
+ case S1ap_ProcedureCode_id_TraceStart:
+ ret = s1ap_compare_s1ap_tracestarties(
+ &m1->msg.s1ap_TraceStartIEs,
+ &m2->msg.s1ap_TraceStartIEs);
+ break;
+
+ case S1ap_ProcedureCode_id_TraceFailureIndication:
+ ret = s1ap_compare_s1ap_tracefailureindicationies(
+ &m1->msg.s1ap_TraceFailureIndicationIEs,
+ &m2->msg.s1ap_TraceFailureIndicationIEs);
+ break;
+
+ case S1ap_ProcedureCode_id_ENBConfigurationUpdate:
+ if (present == S1AP_PDU_PR_initiatingMessage) {
+ ret = s1ap_compare_s1ap_enbconfigurationupdateies(
+ &m1->msg.s1ap_ENBConfigurationUpdateIEs,
+ &m2->msg.s1ap_ENBConfigurationUpdateIEs);
+ } else if (present == S1AP_PDU_PR_successfulOutcome) {
+ ret = s1ap_compare_s1ap_enbconfigurationupdateacknowledgeies(
+ &m1->msg.s1ap_ENBConfigurationUpdateAcknowledgeIEs,
+ &m2->msg.s1ap_ENBConfigurationUpdateAcknowledgeIEs);
+ } else {
+ ret = s1ap_compare_s1ap_enbconfigurationupdatefailureies(
+ &m1->msg.s1ap_ENBConfigurationUpdateFailureIEs,
+ &m2->msg.s1ap_ENBConfigurationUpdateFailureIEs);
+ }
+ break;
+
+ case S1ap_ProcedureCode_id_MMEConfigurationUpdate:
+ if (present == S1AP_PDU_PR_initiatingMessage) {
+ ret = s1ap_compare_s1ap_mmeconfigurationupdateies(
+ &m1->msg.s1ap_MMEConfigurationUpdateIEs,
+ &m2->msg.s1ap_MMEConfigurationUpdateIEs);
+ } else if (present == S1AP_PDU_PR_successfulOutcome) {
+ ret = s1ap_compare_s1ap_mmeconfigurationupdateacknowledgeies(
+ &m1->msg.s1ap_MMEConfigurationUpdateAcknowledgeIEs,
+ &m2->msg.s1ap_MMEConfigurationUpdateAcknowledgeIEs);
+ } else {
+ ret = s1ap_compare_s1ap_mmeconfigurationupdatefailureies(
+ &m1->msg.s1ap_MMEConfigurationUpdateFailureIEs,
+ &m2->msg.s1ap_MMEConfigurationUpdateFailureIEs);
+ }
+ break;
+
+ case S1ap_ProcedureCode_id_LocationReportingControl:
+ ret = s1ap_compare_s1ap_locationreportingcontrolies(
+ &m1->msg.s1ap_LocationReportingControlIEs,
+ &m2->msg.s1ap_LocationReportingControlIEs);
+ break;
+
+ case S1ap_ProcedureCode_id_LocationReportingFailureIndication:
+ ret = s1ap_compare_s1ap_locationreportingfailureindicationies(
+ &m1->msg.s1ap_LocationReportingFailureIndicationIEs,
+ &m2->msg.s1ap_LocationReportingFailureIndicationIEs);
+ break;
+
+ case S1ap_ProcedureCode_id_LocationReport:
+ ret = s1ap_compare_s1ap_locationreporties(
+ &m1->msg.s1ap_LocationReportIEs,
+ &m2->msg.s1ap_LocationReportIEs);
+ break;
+
+ case S1ap_ProcedureCode_id_OverloadStart:
+ ret = s1ap_compare_s1ap_overloadstarties(
+ &m1->msg.s1ap_OverloadStartIEs,
+ &m2->msg.s1ap_OverloadStartIEs);
+ break;
+
+ case S1ap_ProcedureCode_id_OverloadStop:
+ ret = s1ap_compare_s1ap_overloadstopies(
+ &m1->msg.s1ap_OverloadStopIEs,
+ &m2->msg.s1ap_OverloadStopIEs);
+ break;
+
+ case S1ap_ProcedureCode_id_WriteReplaceWarning:
+ if (present == S1AP_PDU_PR_initiatingMessage) {
+ ret = s1ap_compare_s1ap_writereplacewarningrequesties(
+ &m1->msg.s1ap_WriteReplaceWarningRequestIEs,
+ &m2->msg.s1ap_WriteReplaceWarningRequestIEs);
+ } else {
+ ret = s1ap_compare_s1ap_writereplacewarningresponseies(
+ &m1->msg.s1ap_WriteReplaceWarningResponseIEs,
+ &m2->msg.s1ap_WriteReplaceWarningResponseIEs);
+ }
+ break;
+
+ case S1ap_ProcedureCode_id_eNBDirectInformationTransfer:
+ ret = s1ap_compare_s1ap_enbdirectinformationtransferies(
+ &m1->msg.s1ap_ENBDirectInformationTransferIEs,
+ &m2->msg.s1ap_ENBDirectInformationTransferIEs);
+ break;
+
+ case S1ap_ProcedureCode_id_MMEDirectInformationTransfer:
+
+ ret = s1ap_compare_s1ap_mmedirectinformationtransferies(
+ &m1->msg.s1ap_MMEDirectInformationTransferIEs,
+ &m2->msg.s1ap_MMEDirectInformationTransferIEs);
+ break;
+
+ case S1ap_ProcedureCode_id_PrivateMessage:
+ case S1ap_ProcedureCode_id_eNBConfigurationTransfer:
+ case S1ap_ProcedureCode_id_MMEConfigurationTransfer:
+ AssertFatal(0, "TODO");
+ break;
+
+ case S1ap_ProcedureCode_id_CellTrafficTrace:
+ ret = s1ap_compare_s1ap_celltraffictraceies(
+ &m1->msg.s1ap_CellTrafficTraceIEs,
+ &m2->msg.s1ap_CellTrafficTraceIEs);
+ break;
+
+ case S1ap_ProcedureCode_id_Kill:
+ if (present == S1AP_PDU_PR_initiatingMessage) {
+ ret = s1ap_compare_s1ap_killrequesties(
+ &m1->msg.s1ap_KillRequestIEs,
+ &m2->msg.s1ap_KillRequestIEs);
+ } else {
+ ret = s1ap_compare_s1ap_killresponseies(
+ &m1->msg.s1ap_KillResponseIEs,
+ &m2->msg.s1ap_KillResponseIEs);
+ }
+ break;
+
+ case S1ap_ProcedureCode_id_downlinkUEAssociatedLPPaTransport:
+ ret = s1ap_compare_s1ap_downlinkueassociatedlppatransport_ies(
+ &m1->msg.s1ap_DownlinkUEAssociatedLPPaTransport_IEs,
+ &m2->msg.s1ap_DownlinkUEAssociatedLPPaTransport_IEs);
+ break;
+
+ case S1ap_ProcedureCode_id_uplinkUEAssociatedLPPaTransport:
+ ret = s1ap_compare_s1ap_uplinkueassociatedlppatransport_ies(
+ &m1->msg.s1ap_UplinkUEAssociatedLPPaTransport_IEs,
+ &m2->msg.s1ap_UplinkUEAssociatedLPPaTransport_IEs);
+ break;
+
+ case S1ap_ProcedureCode_id_downlinkNonUEAssociatedLPPaTransport:
+ ret = s1ap_compare_s1ap_downlinknonueassociatedlppatransport_ies(
+ &m1->msg.s1ap_DownlinkNonUEAssociatedLPPaTransport_IEs,
+ &m2->msg.s1ap_DownlinkNonUEAssociatedLPPaTransport_IEs);
+ break;
+
+ case S1ap_ProcedureCode_id_uplinkNonUEAssociatedLPPaTransport:
+ ret = s1ap_compare_s1ap_uplinknonueassociatedlppatransport_ies(
+ &m1->msg.s1ap_UplinkNonUEAssociatedLPPaTransport_IEs,
+ &m2->msg.s1ap_UplinkNonUEAssociatedLPPaTransport_IEs);
+ break;
+
+ default:
+ AssertFatal(0, "Unknown procedure code %ld", m1->procedureCode);
+ }
+ return ret;
+}
+
+
+void update_xpath_node_mme_ue_s1ap_id(et_s1ap_t * const s1ap, xmlNode *node, const S1ap_MME_UE_S1AP_ID_t new_id)
+{
+ xmlNode *cur_node = NULL;
+ xmlAttrPtr attr = NULL;
+ xmlChar *xml_char = NULL;
+ int size = 0;
+ int pos = 0;
+ int go_deeper_in_tree = 1;
+ //S1AP_INFO("%s() mme_ue_s1ap_id %u\n", __FUNCTION__, new_id);
+
+ // modify
+ for (cur_node = (xmlNode *)node; cur_node; cur_node = cur_node->next) {
+ go_deeper_in_tree = 1;
+ if ((!xmlStrcmp(cur_node->name, (const xmlChar *)"field"))) {
+ // do not get hidden fields
+ xml_char = xmlGetProp((xmlNode *)cur_node, (const xmlChar *)"hide");
+ if (NULL != xml_char) {
+ if ((!xmlStrcmp(xml_char, (const xmlChar *)"yes"))) {
+ go_deeper_in_tree = 0;
+ }
+ xmlFree(xml_char);
+ }
+ if (0 < go_deeper_in_tree) {
+ // first get size
+ xml_char = xmlGetProp((xmlNode *)cur_node, (const xmlChar *)"pos");
+ if (NULL != xml_char) {
+ pos = strtoul((const char *)xml_char, NULL, 0);
+ pos -= s1ap->xml_stream_pos_offset;
+ AssertFatal(pos >= 0, "Bad pos %d xml_stream_pos_offset %d", pos, s1ap->xml_stream_pos_offset);
+ xmlFree(xml_char);
+ xml_char = xmlGetProp((xmlNode *)cur_node, (const xmlChar *)"size");
+ if (NULL != xml_char) {
+ const xmlChar value_d[32];
+ const xmlChar value_h[20];
+ const xmlChar showname[64];
+ int ret = 0;
+ int pos2 = 0;
+ unsigned long int uli = 0;
+ char hex[3] = {0,0,0};
+ char *end_ptr = NULL;
+
+ size = strtoul((const char *)xml_char, NULL, 0);
+ xmlFree(xml_char);
+ // second: try to set value (always hex)
+ ret = snprintf((char *)value_d, 32, "%ld", new_id);
+ AssertFatal((ret > 0) && (ret < 32), "Could not convert int to dec str");
+ ret = snprintf((char *)value_h, 20, "C0%08X", new_id);
+ AssertFatal((ret > 0) && (ret < 20), "Could not convert int to hex str");
+ ret = snprintf((char *)showname, 64, "MME-UE-S1AP-ID: %d", new_id);
+ AssertFatal((ret > 0) && (ret < 64), "Could not convert int to dec str");
+
+ attr = xmlSetProp((xmlNode *)cur_node, (const xmlChar *)"value", value_h);
+ attr = xmlSetProp((xmlNode *)cur_node, (const xmlChar *)"show", value_d);
+ attr = xmlSetProp((xmlNode *)cur_node, (const xmlChar *)"showname", showname);
+ //TODO update s1ap->binary_stream @pos with new_id_hex, size
+ AssertFatal((pos+size) < s1ap->binary_stream_allocated_size, "Rewrite of mme_ue_s1ap_id out of bounds of binary_stream");
+ //avoid endianess issues
+ do {
+ hex[0] = value_h[pos2++];
+ hex[1] = value_h[pos2++];
+ hex[2] = '\0';
+ end_ptr = hex;
+ uli = strtoul(hex, &end_ptr, 16);
+ AssertFatal((uli != ULONG_MAX) && (end_ptr != NULL) && (*end_ptr == '\0'), "Conversion of hexstring %s failed returned %ld errno %d", hex, uli, errno);
+ s1ap->binary_stream[pos++] = (unsigned char)uli;
+ } while (pos2 < (2*5));
+ // update ASN1
+ et_decode_s1ap(s1ap);
+ //S1AP_INFO("Updated ASN1 for %s\n", showname);
+ }
+ }
+ }
+ }
+ if (0 < go_deeper_in_tree) {
+ update_xpath_node_mme_ue_s1ap_id(s1ap, cur_node->children, new_id);
+ }
+ }
+}
+
+/**
+ * update_xpath_nodes:
+ * @nodes: the nodes set.
+ * @value: the new value for the node(s)
+ *
+ * Prints the @nodes content to @output.
+ * From http://www.xmlsoft.org/examples/#xpath2.c
+ */
+void update_xpath_nodes_mme_ue_s1ap_id(et_s1ap_t * const s1ap_payload, xmlNodeSetPtr nodes, const S1ap_MME_UE_S1AP_ID_t new_id)
+{
+ int size = 0;
+ int i = 0;
+ xmlNode *s1ap_node = NULL;
+
+ size = (nodes) ? nodes->nodeNr : 0;
+ //S1AP_DEBUG("%s() num nodes %u\n", __FUNCTION__, size);
+
+ /*
+ * NOTE: the nodes are processed in reverse order, i.e. reverse document
+ * order because xmlNodeSetContent can actually free up descendant
+ * of the node and such nodes may have been selected too ! Handling
+ * in reverse order ensure that descendant are accessed first, before
+ * they get removed. Mixing XPath and modifications on a tree must be
+ * done carefully !
+ */
+ for(i = size - 1; i >= 0; i--) {
+ s1ap_node = nodes->nodeTab[i];
+ AssertFatal(NULL != s1ap_node, "One element of resultset of XPATH expression is NULL\n");
+ update_xpath_node_mme_ue_s1ap_id(s1ap_payload, s1ap_node, new_id);
+ /*
+ * All the elements returned by an XPath query are pointers to
+ * elements from the tree *except* namespace nodes where the XPath
+ * semantic is different from the implementation in libxml2 tree.
+ * As a result when a returned node set is freed when
+ * xmlXPathFreeObject() is called, that routine must check the
+ * element type. But node from the returned set may have been removed
+ * by xmlNodeSetContent() resulting in access to freed data.
+ * This can be exercised by running valgrind
+ * There is 2 ways around it:
+ * - make a copy of the pointers to the nodes from the result set
+ * then call xmlXPathFreeObject() and then modify the nodes
+ * or
+ * - remove the reference to the modified nodes from the node set
+ * as they are processed, if they are not namespace nodes.
+ */
+ if (nodes->nodeTab[i]->type != XML_NAMESPACE_DECL) {
+ nodes->nodeTab[i] = NULL;
+ }
+ }
+}
+//------------------------------------------------------------------------------
+int et_s1ap_update_mme_ue_s1ap_id(et_packet_t * const packet, const S1ap_MME_UE_S1AP_ID_t old_id, const S1ap_MME_UE_S1AP_ID_t new_id)
+{
+
+
+ xmlChar xpath_expression[ET_XPATH_EXPRESSION_MAX_LENGTH];
+ int ret = 0;
+ xmlDocPtr doc = NULL;
+ xmlXPathContextPtr xpath_ctx = NULL;
+ xmlXPathObjectPtr xpath_obj = NULL;
+
+ //S1AP_DEBUG("%s() packet num %u original frame number %u, mme_ue_s1ap_id %u -> %u\n", __FUNCTION__, packet->packet_number, packet->original_frame_number, old_id, new_id);
+
+ ret = snprintf(xpath_expression, ET_XPATH_EXPRESSION_MAX_LENGTH, "//field[@name=\"s1ap.MME_UE_S1AP_ID\"][@show=\"%u\"]", old_id);
+ AssertFatal((ret > 0) && (ret < ET_XPATH_EXPRESSION_MAX_LENGTH), "Could not build XPATH expression err=%d", ret);
+
+ doc = packet->sctp_hdr.u.data_hdr.payload.doc;
+ // Create xpath evaluation context
+ xpath_ctx = xmlXPathNewContext(doc);
+ if(xpath_ctx == NULL) {
+ fprintf(stderr,"Error: unable to create new XPath context\n");
+ xmlFreeDoc(doc);
+ return(-1);
+ }
+
+ // Evaluate xpath expression
+ xpath_obj = xmlXPathEvalExpression(xpath_expression, xpath_ctx);
+ xmlXPathFreeContext(xpath_ctx);
+ AssertFatal(xpath_obj != NULL, "Unable to evaluate XPATH expression \"%s\"\n", xpath_expression);
+
+ if(xmlXPathNodeSetIsEmpty(xpath_obj->nodesetval)){
+ xmlXPathFreeObject(xpath_obj);
+ S1AP_DEBUG("%s() No match \"%s\"packet num %u original frame number %u, mme_ue_s1ap_id %u -> %u\n",
+ __FUNCTION__, xpath_expression, packet->packet_number, packet->original_frame_number, old_id, new_id);
+ return -1;
+ }
+ // update selected nodes
+ update_xpath_nodes_mme_ue_s1ap_id(&packet->sctp_hdr.u.data_hdr.payload, xpath_obj->nodesetval, new_id);
+
+ // Cleanup of XPath data
+ xmlXPathFreeObject(xpath_obj);
+
+ return 0;
+}
diff --git a/openair3/TEST/EPC_TEST/play_scenario_s1ap_eNB_defs.h b/openair3/TEST/EPC_TEST/play_scenario_s1ap_eNB_defs.h
new file mode 100644
index 0000000000..ac77b88b24
--- /dev/null
+++ b/openair3/TEST/EPC_TEST/play_scenario_s1ap_eNB_defs.h
@@ -0,0 +1,250 @@
+/*******************************************************************************
+ OpenAirInterface
+ Copyright(c) 1999 - 2014 Eurecom
+
+ OpenAirInterface is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+
+ OpenAirInterface is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with OpenAirInterface.The full GNU General Public License is
+ included in this distribution in the file called "COPYING". If not,
+ see .
+
+ Contact Information
+ OpenAirInterface Admin: openair_admin@eurecom.fr
+ OpenAirInterface Tech : openair_tech@eurecom.fr
+ OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr
+
+ Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France.
+
+ *******************************************************************************/
+
+#include
+
+#include "queue.h"
+#include "tree.h"
+
+#include "sctp_eNB_defs.h"
+
+#ifndef PLAY_SCENARIO_S1AP_ENB_DEFS_H_
+#define PLAY_SCENARIO_S1AP_ENB_DEFS_H_
+
+#define ENB_TAC (1)
+#define ENB_MCC (208)
+#define ENB_MNC (92)
+
+#define ENB_NAME "Eurecom ENB"
+#define ENB_NAME_FORMAT (ENB_NAME" %u")
+
+#define S1AP_PORT_NUMBER (36412)
+#define S1AP_SCTP_PPID (18)
+
+#define X2AP_PORT_NUMBER (36422)
+#define X2AP_SCTP_PPID (27)
+
+#define S1AP_ENB_NAME_LENGTH_MAX (150)
+
+typedef enum {
+ /* Disconnected state: initial state for any association. */
+ S1AP_ENB_STATE_DISCONNECTED = 0x0,
+ /* State waiting for S1 Setup response message if eNB is MME accepted or
+ * S1 Setup failure if MME rejects the eNB.
+ */
+ S1AP_ENB_STATE_WAITING = 0x1,
+ /* The eNB is successfully connected to MME, UE contexts can be created. */
+ S1AP_ENB_STATE_CONNECTED = 0x2,
+ /* The MME has sent an overload start message. Once the MME disables the
+ * OVERLOAD marker, the state of the association will be
+ * S1AP_ENB_STATE_CONNECTED.
+ */
+ S1AP_ENB_OVERLOAD = 0x3,
+ /* Max number of states available */
+ S1AP_ENB_STATE_MAX,
+} s1ap_eNB_state_t;
+
+
+/* If the Overload Action IE in the OVERLOAD START message is set to
+ * - “reject all RRC connection establishments for non-emergency mobile
+ * originated data transfer “ (i.e. reject traffic corresponding to RRC cause
+ * “mo-data “ (TS 36.331 [16])), or
+ * - “reject all RRC connection establishments for signalling “ (i.e. reject
+ * traffic corresponding to RRC cause “modata” and “mo-signalling”
+ * (TS 36.331 [16])),or
+ * - “only permit RRC connection establishments for emergency sessions and
+ * mobile terminated services” (i.e. only permit traffic corresponding to RRC
+ * cause “emergency” and “mt-Access” (TS 36.331 [16])).
+ *
+ * NOTE: When the Overload Action IE is set to “only permit RRC connection
+ * establishments for emergency sessions and mobile terminated services”,
+ * emergency calls with RRC cause “highPriorityAcess” from high priority users
+ * are rejected (TS 24.301 [24]).
+ */
+typedef enum {
+ S1AP_OVERLOAD_REJECT_MO_DATA = 0x0,
+ S1AP_OVERLOAD_REJECT_ALL_SIGNALLING = 0x1,
+ S1AP_OVERLOAD_ONLY_EMERGENCY_AND_MT = 0x2,
+ S1AP_NO_OVERLOAD = 0x3,
+ S1AP_OVERLOAD_MAX,
+} s1ap_overload_state_t;
+
+/* Served PLMN identity element */
+struct plmn_identity_s {
+ uint16_t mcc;
+ uint16_t mnc;
+ uint8_t mnc_digit_length;
+ STAILQ_ENTRY(plmn_identity_s) next;
+};
+
+/* Served group id element */
+struct served_group_id_s {
+ uint16_t mme_group_id;
+ STAILQ_ENTRY(served_group_id_s) next;
+};
+
+/* Served mme code for a particular MME */
+struct mme_code_s {
+ uint8_t mme_code;
+ STAILQ_ENTRY(mme_code_s) next;
+};
+
+/* Served gummei element */
+struct served_gummei_s {
+ /* Number of MME served PLMNs */
+ uint8_t nb_served_plmns;
+ /* List of served PLMNs by MME */
+ STAILQ_HEAD(served_plmns_s, plmn_identity_s) served_plmns;
+
+ /* Number of group id in list */
+ uint8_t nb_group_id;
+ /* Served group id list */
+ STAILQ_HEAD(served_group_ids_s, served_group_id_s) served_group_ids;
+
+ /* Number of MME code */
+ uint8_t nb_mme_code;
+ /* MME Code to uniquely identify an MME within an MME pool area */
+ STAILQ_HEAD(mme_codes_s, mme_code_s) mme_codes;
+
+ /* Next GUMMEI element */
+ STAILQ_ENTRY(served_gummei_s) next;
+};
+
+struct s1ap_eNB_instance_s;
+
+/* This structure describes association of a eNB to a MME */
+typedef struct s1ap_eNB_mme_data_s {
+ /* MME descriptors tree, ordered by sctp assoc id */
+ RB_ENTRY(s1ap_eNB_mme_data_s) entry;
+
+ /* This is the optional name provided by the MME */
+ char *mme_name;
+ net_ip_address_t mme_net_ip_address; // useful for joining assoc_id and ip address of packets
+
+ /* List of served GUMMEI per MME. There is one GUMMEI per RAT with a max
+ * number of 8 RATs but in our case only one is used. The LTE related pool
+ * configuration is included on the first place in the list.
+ */
+ STAILQ_HEAD(served_gummeis_s, served_gummei_s) served_gummei;
+
+ /* Relative processing capacity of an MME with respect to the other MMEs
+ * in the pool in order to load-balance MMEs within a pool as defined
+ * in TS 23.401.
+ */
+ uint8_t relative_mme_capacity;
+
+ /* Current MME overload information (if any). */
+ s1ap_overload_state_t overload_state;
+ /* Current eNB->MME S1AP association state */
+ s1ap_eNB_state_t state;
+
+ /* Next usable stream for UE signalling */
+ int32_t nextstream;
+
+ /* Number of input/ouput streams */
+ uint16_t in_streams;
+ uint16_t out_streams;
+
+ /* Connexion id used between SCTP/S1AP */
+ uint16_t cnx_id;
+
+ /* SCTP association id */
+ int32_t assoc_id;
+
+ /* Only meaningfull in virtual mode */
+ struct s1ap_eNB_instance_s *s1ap_eNB_instance;
+} s1ap_eNB_mme_data_t;
+
+typedef struct s1ap_eNB_instance_s {
+ /* Next s1ap eNB association.
+ * Only used for virtual mode.
+ */
+ STAILQ_ENTRY(s1ap_eNB_instance_s) s1ap_eNB_entries;
+
+ /* Number of MME requested by eNB (tree size) */
+ uint32_t s1ap_mme_nb;
+ /* Number of MME for which association is pending */
+ uint32_t s1ap_mme_pending_nb;
+ /* Number of MME successfully associated to eNB */
+ uint32_t s1ap_mme_associated_nb;
+ /* Tree of S1AP MME associations ordered by association ID */
+ RB_HEAD(s1ap_mme_map, s1ap_eNB_mme_data_s) s1ap_mme_head;
+
+ /* TODO: add a map ordered by relative MME capacity */
+
+ /* Tree of UE ordered by eNB_ue_s1ap_id's */
+ RB_HEAD(s1ap_ue_map, s1ap_eNB_ue_context_s) s1ap_ue_head;
+
+ /* For virtual mode, mod_id as defined in the rest of the L1/L2 stack */
+ instance_t instance;
+
+ /* Displayable name of eNB */
+ char *eNB_name;
+ net_ip_address_t s1c_net_ip_address;
+
+ /* Unique eNB_id to identify the eNB within EPC.
+ * In our case the eNB is a macro eNB so the id will be 20 bits long.
+ * For Home eNB id, this field should be 28 bits long.
+ */
+ uint32_t eNB_id;
+ /* The type of the cell */
+ enum cell_type_e cell_type;
+
+ /* Tracking area code */
+ uint16_t tac;
+
+ /* Mobile Country Code
+ * Mobile Network Code
+ */
+ uint16_t mcc;
+ uint16_t mnc;
+ uint8_t mnc_digit_length;
+
+} s1ap_eNB_instance_t;
+
+typedef struct {
+ /* List of served eNBs
+ * Only used for virtual mode
+ */
+ STAILQ_HEAD(s1ap_eNB_instances_head_s, s1ap_eNB_instance_s) s1ap_eNB_instances_head;
+ /* Nb of registered eNBs */
+ uint8_t nb_registered_eNBs;
+
+ /* Generate a unique connexion id used between S1AP and SCTP */
+ uint16_t global_cnx_id;
+} s1ap_eNB_internal_data_t;
+
+int s1ap_eNB_compare_assoc_id(
+ struct s1ap_eNB_mme_data_s *p1, struct s1ap_eNB_mme_data_s *p2);
+
+/* Generate the tree management functions */
+RB_PROTOTYPE(s1ap_mme_map, s1ap_eNB_mme_data_s, entry,
+ s1ap_eNB_compare_assoc_id);
+
+#endif /* PLAY_SCENARIO_S1AP_ENB_DEFS_H_ */
diff --git a/openair3/TEST/EPC_TEST/play_scenario_sctp.c b/openair3/TEST/EPC_TEST/play_scenario_sctp.c
new file mode 100644
index 0000000000..5d5489089b
--- /dev/null
+++ b/openair3/TEST/EPC_TEST/play_scenario_sctp.c
@@ -0,0 +1,112 @@
+/*******************************************************************************
+ OpenAirInterface
+ Copyright(c) 1999 - 2014 Eurecom
+
+ OpenAirInterface is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+
+ OpenAirInterface is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with OpenAirInterface.The full GNU General Public License is
+ included in this distribution in the file called "COPYING". If not,
+ see .
+
+ Contact Information
+ OpenAirInterface Admin: openair_admin@eurecom.fr
+ OpenAirInterface Tech : openair_tech@eurecom.fr
+ OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr
+
+ Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE
+
+ *******************************************************************************/
+
+/*
+ play_scenario_sctp.c
+ -------------------
+ AUTHOR : Lionel GAUTHIER
+ COMPANY : EURECOM
+ EMAIL : Lionel.Gauthier@eurecom.fr
+ */
+
+
+#include
+
+#include "intertask_interface.h"
+#include "platform_types.h"
+#include "assertions.h"
+#include "play_scenario.h"
+
+//------------------------------------------------------------------------------
+asn_comp_rval_t * et_sctp_data_is_matching(sctp_datahdr_t * const sctp1, sctp_datahdr_t * const sctp2, const uint32_t constraints)
+{
+ asn_comp_rval_t *rv = NULL;
+ // no comparison for ports
+ if (sctp1->ppid != sctp2->ppid) {
+ S1AP_WARN("No Matching SCTP PPID %u %u\n", sctp1->ppid, sctp2->ppid);
+ rv = calloc(1, sizeof(asn_comp_rval_t));
+ rv->err_code = ET_ERROR_MATCH_PACKET_SCTP_PPID;
+ return rv;
+ }
+ if (sctp1->assoc_id != sctp2->assoc_id) {
+ S1AP_WARN("No Matching SCTP assoc id %u %u\n", sctp1->assoc_id, sctp2->assoc_id);
+ rv = calloc(1, sizeof(asn_comp_rval_t));
+ rv->err_code = ET_ERROR_MATCH_PACKET_SCTP_ASSOC_ID;
+ return rv;
+ }
+ if (sctp1->stream != sctp2->stream) {
+ if (constraints & ET_BIT_MASK_MATCH_SCTP_STREAM) {
+ rv = calloc(1, sizeof(asn_comp_rval_t));
+ rv->err_code = ET_ERROR_MATCH_PACKET_SCTP_STREAM_ID;
+ return rv;
+ } else {
+ S1AP_WARN("No Matching SCTP stream %u %u\n", sctp1->stream, sctp2->stream);
+ }
+ }
+ // We do not have SSN from lower layers
+// if (sctp1->ssn != sctp2->ssn) {
+// if (constraints & ET_BIT_MASK_MATCH_SCTP_SSN) {
+// rv = calloc(1, sizeof(asn_comp_rval_t));
+// rv->err_code = ET_ERROR_MATCH_PACKET_SCTP_SSN;
+// return rv;
+// } else {
+// S1AP_WARN("No Matching SCTP STREAM SN %u %u\n", sctp1->ssn, sctp2->ssn);
+// }
+// }
+ return et_s1ap_is_matching(&sctp1->payload, &sctp2->payload, constraints);
+}
+
+//------------------------------------------------------------------------------
+asn_comp_rval_t * et_sctp_is_matching(et_sctp_hdr_t * const sctp1, et_sctp_hdr_t * const sctp2, const uint32_t constraints)
+{
+ // no comparison for ports
+ asn_comp_rval_t *rv = NULL;
+ if (sctp1->chunk_type != sctp2->chunk_type){
+ S1AP_WARN("No Matching chunk_type %u %u\n", sctp1->chunk_type, sctp2->chunk_type);
+ rv = calloc(1, sizeof(asn_comp_rval_t));
+ rv->err_code = ET_ERROR_MATCH_PACKET_SCTP_CHUNK_TYPE;
+ return rv;
+ }
+ switch (sctp1->chunk_type) {
+ case SCTP_CID_DATA:
+ return et_sctp_data_is_matching(&sctp1->u.data_hdr, &sctp2->u.data_hdr, constraints);
+ break;
+
+ case SCTP_CID_INIT:
+ AssertFatal(0, "Not needed now");
+ break;
+ case SCTP_CID_INIT_ACK:
+ AssertFatal(0, "Not needed now");
+ break;
+ default:
+ AssertFatal(0, "Not needed now cid %d", sctp1->chunk_type);
+ }
+
+ return NULL;
+}
diff --git a/openair3/UTILS/conversions.h b/openair3/UTILS/conversions.h
index aaa2b9714f..47912f0d92 100644
--- a/openair3/UTILS/conversions.h
+++ b/openair3/UTILS/conversions.h
@@ -275,7 +275,6 @@ do { \
(bITsTRING)->size = 3; \
(bITsTRING)->bits_unused = 4; \
} while(0)
-/*
/* TS 36.413 v10.9.0 section 9.2.1.38:
* E-UTRAN CGI/Cell Identity
* The leftmost bits of the Cell
diff --git a/targets/ARCH/BLADERF/USERSPACE/LIB/bladerf_lib.c b/targets/ARCH/BLADERF/USERSPACE/LIB/bladerf_lib.c
index 2f73d6978c..065b0bbad2 100644
--- a/targets/ARCH/BLADERF/USERSPACE/LIB/bladerf_lib.c
+++ b/targets/ARCH/BLADERF/USERSPACE/LIB/bladerf_lib.c
@@ -412,7 +412,7 @@ void calibrate_rf(openair0_device *device) {
bladerf_set_correction(brf->dev,BLADERF_MODULE_TX,BLADERF_CORR_LMS_DCOFF_I,offIold);
for (i=0;i<10;i++) {
trx_brf_read(device, &ptimestamp, (void **)&calib_buffp, RXDCLENGTH, 0);
- trx_brf_write(device,ptimestamp+5*RXDCLENGTH, (void **)&calib_tx_buffp, RXDCLENGTH, 0);
+ trx_brf_write(device,ptimestamp+5*RXDCLENGTH, (void **)&calib_tx_buffp, RXDCLENGTH, 0, 0);
}
for (meanIold=meanQold=i=j=0;idev,BLADERF_MODULE_TX,BLADERF_CORR_LMS_DCOFF_I,offI);
for (i=0;i<10;i++) {
trx_brf_read(device, &ptimestamp, (void **)&calib_buffp, RXDCLENGTH, 0);
- trx_brf_write(device,ptimestamp+5*RXDCLENGTH, (void **)&calib_tx_buffp, RXDCLENGTH, 0);
+ trx_brf_write(device,ptimestamp+5*RXDCLENGTH, (void **)&calib_tx_buffp, RXDCLENGTH, 0, 0);
}
for (meanI=meanQ=i=j=0;idev,BLADERF_MODULE_TX,BLADERF_CORR_LMS_DCOFF_Q,offQold);
for (i=0;i<10;i++) {
trx_brf_read(device, &ptimestamp, (void **)&calib_buffp, RXDCLENGTH, 0);
- trx_brf_write(device,ptimestamp+5*RXDCLENGTH, (void **)&calib_tx_buffp, RXDCLENGTH, 0);
+ trx_brf_write(device,ptimestamp+5*RXDCLENGTH, (void **)&calib_tx_buffp, RXDCLENGTH, 0, 0);
}
// project on fs/4
for (meanIold=meanQold=i=j=0;idev,BLADERF_MODULE_TX,BLADERF_CORR_LMS_DCOFF_Q,offQ);
for (i=0;i<10;i++) {
trx_brf_read(device, &ptimestamp, (void **)&calib_buffp, RXDCLENGTH, 0);
- trx_brf_write(device,ptimestamp+5*RXDCLENGTH, (void **)&calib_tx_buffp, RXDCLENGTH, 0);
+ trx_brf_write(device,ptimestamp+5*RXDCLENGTH, (void **)&calib_tx_buffp, RXDCLENGTH, 0, 0);
}
for (meanI=meanQ=i=j=0;idev,BLADERF_MODULE_TX,BLADERF_CORR_FPGA_PHASE,offphaseold);
for (i=0;i<10;i++) {
trx_brf_read(device, &ptimestamp, (void **)&calib_buffp, RXDCLENGTH, 0);
- trx_brf_write(device,ptimestamp+5*RXDCLENGTH, (void **)&calib_tx_buffp, RXDCLENGTH, 0);
+ trx_brf_write(device,ptimestamp+5*RXDCLENGTH, (void **)&calib_tx_buffp, RXDCLENGTH, 0, 0);
}
// project on fs/8 (Image of TX signal in +ve frequencies)
for (meanIold=meanQold=i=j=0;idev,BLADERF_MODULE_TX,BLADERF_CORR_FPGA_PHASE,offphase);
for (i=0;i<10;i++) {
trx_brf_read(device, &ptimestamp, (void **)&calib_buffp, RXDCLENGTH, 0);
- trx_brf_write(device,ptimestamp+5*RXDCLENGTH, (void **)&calib_tx_buffp, RXDCLENGTH, 0);
+ trx_brf_write(device,ptimestamp+5*RXDCLENGTH, (void **)&calib_tx_buffp, RXDCLENGTH, 0, 0);
}
// project on fs/8 (Image of TX signal in +ve frequencies)
for (meanI=meanQ=i=j=0;idev,BLADERF_MODULE_TX,BLADERF_CORR_FPGA_GAIN,offgainold);
for (i=0;i<10;i++) {
trx_brf_read(device, &ptimestamp, (void **)&calib_buffp, RXDCLENGTH, 0);
- trx_brf_write(device,ptimestamp+5*RXDCLENGTH, (void **)&calib_tx_buffp, RXDCLENGTH, 0);
+ trx_brf_write(device,ptimestamp+5*RXDCLENGTH, (void **)&calib_tx_buffp, RXDCLENGTH, 0, 0);
}
// project on fs/8 (Image of TX signal in +ve frequencies)
for (meanIold=meanQold=i=j=0;idev,BLADERF_MODULE_TX,BLADERF_CORR_FPGA_GAIN,offgain);
for (i=0;i<10;i++) {
trx_brf_read(device, &ptimestamp, (void **)&calib_buffp, RXDCLENGTH, 0);
- trx_brf_write(device,ptimestamp+5*RXDCLENGTH, (void **)&calib_tx_buffp, RXDCLENGTH, 0);
+ trx_brf_write(device,ptimestamp+5*RXDCLENGTH, (void **)&calib_tx_buffp, RXDCLENGTH, 0, 0);
}
// project on fs/8 (Image of TX signal in +ve frequencies)
for (meanI=meanQ=i=j=0;idev,BLADERF_MODULE_RX,BLADERF_CORR_FPGA_PHASE,offphaseold);
for (i=0;i<10;i++) {
trx_brf_read(device, &ptimestamp, (void **)&calib_buffp, RXDCLENGTH, 0);
- trx_brf_write(device,ptimestamp+5*RXDCLENGTH, (void **)&calib_tx_buffp, RXDCLENGTH, 0);
+ trx_brf_write(device,ptimestamp+5*RXDCLENGTH, (void **)&calib_tx_buffp, RXDCLENGTH, 0, 0);
}
// project on -3fs/8 (Image of TX signal in -ve frequencies)
for (meanIold=meanQold=i=j=0;idev,BLADERF_MODULE_RX,BLADERF_CORR_FPGA_PHASE,offphase);
for (i=0;i<10;i++) {
trx_brf_read(device, &ptimestamp, (void **)&calib_buffp, RXDCLENGTH, 0);
- trx_brf_write(device,ptimestamp+5*RXDCLENGTH, (void **)&calib_tx_buffp, RXDCLENGTH, 0);
+ trx_brf_write(device,ptimestamp+5*RXDCLENGTH, (void **)&calib_tx_buffp, RXDCLENGTH, 0, 0);
}
// project on -3fs/8 (Image of TX signal in -ve frequencies)
for (meanI=meanQ=i=j=0;idev,BLADERF_MODULE_RX,BLADERF_CORR_FPGA_GAIN,offgainold);
for (i=0;i<10;i++) {
trx_brf_read(device, &ptimestamp, (void **)&calib_buffp, RXDCLENGTH, 0);
- trx_brf_write(device,ptimestamp+5*RXDCLENGTH, (void **)&calib_tx_buffp, RXDCLENGTH, 0);
+ trx_brf_write(device,ptimestamp+5*RXDCLENGTH, (void **)&calib_tx_buffp, RXDCLENGTH, 0,0);
}
// project on -3fs/8 (Image of TX signal in +ve frequencies)
for (meanIold=meanQold=i=j=0;idev,BLADERF_MODULE_RX,BLADERF_CORR_FPGA_GAIN,offgain);
for (i=0;i<10;i++) {
trx_brf_read(device, &ptimestamp, (void **)&calib_buffp, RXDCLENGTH, 0);
- trx_brf_write(device,ptimestamp+5*RXDCLENGTH, (void **)&calib_tx_buffp, RXDCLENGTH, 0);
+ trx_brf_write(device,ptimestamp+5*RXDCLENGTH, (void **)&calib_tx_buffp, RXDCLENGTH, 0, 0);
}
// project on 3fs/8 (Image of TX signal in -ve frequencies)
for (meanI=meanQ=i=j=0;ilog_level));
printf("BLADERF: Initializing openair0_device\n");
- device->priv = brf;
device->Mod_id = num_devices++;
device->type = BLADERF_DEV;
device->trx_start_func = trx_brf_start;
diff --git a/targets/ARCH/COMMON/common_lib.c b/targets/ARCH/COMMON/common_lib.c
index 6ba59660b3..e4ee06d0a4 100644
--- a/targets/ARCH/COMMON/common_lib.c
+++ b/targets/ARCH/COMMON/common_lib.c
@@ -60,6 +60,9 @@ case USRP_X300_DEV:
case BLADERF_DEV:
printf("[%s] has loaded BLADERF device.\n",((device->host_type == BBU_HOST) ? "BBU": "RRH"));
break;
+ case LMSSDR_DEV:
+ printf("[%s] has loaded LMSSDR device.\n",((device->host_type == BBU_HOST) ? "BBU": "RRH"));
+ break;
case NONE_DEV:
printf("[%s] has not loaded a HW device.\n",((device->host_type == BBU_HOST) ? "BBU": "RRH"));
break;
@@ -162,6 +165,7 @@ int openair0_transport_load(openair0_device *device, openair0_config_t *openair0
}
}
return 0;
+
}
diff --git a/targets/ARCH/COMMON/common_lib.h b/targets/ARCH/COMMON/common_lib.h
index 0abe8fd22e..dc0b31af58 100644
--- a/targets/ARCH/COMMON/common_lib.h
+++ b/targets/ARCH/COMMON/common_lib.h
@@ -90,6 +90,8 @@ typedef enum {
USRP_X300_DEV,
/*!\brief device is BLADE RF*/
BLADERF_DEV,
+ /*!\brief device is LMSSDR (SoDeRa)*/
+ LMSSDR_DEV,
/*!\brief device is NONE*/
NONE_DEV,
MAX_RF_DEV_TYPE
@@ -195,7 +197,8 @@ typedef struct {
char *my_addr;
//! local port number for Ethernet interface (eNB/BBU, UE)
unsigned int my_port;
-
+ //! Configuration file for LMS7002M
+ char *configFilename;
} openair0_config_t;
/*! \brief RF mapping */
@@ -206,18 +209,27 @@ typedef struct {
int chain;
} openair0_rf_map;
+
typedef struct {
char *remote_addr;
//! remote port number for Ethernet interface
- unsigned int remote_port;
+ uint16_t remote_port;
//! local IP/MAC addr for Ethernet interface (eNB/BBU, UE)
char *my_addr;
//! local port number for Ethernet interface (eNB/BBU, UE)
- unsigned int my_port;
- //! local port number for Ethernet interface (eNB/BBU, UE)
+ uint16_t my_port;
+ //! local Ethernet interface (eNB/BBU, UE)
char *local_if_name;
- //! local port number for Ethernet interface (eNB/BBU, UE)
+ //! tx_sample_advance for RF + ETH
+ uint8_t tx_sample_advance;
+ //! tx_scheduling_advance for RF + ETH
+ uint8_t tx_scheduling_advance;
+ //! iq_txshift for RF + ETH
+ uint8_t iq_txshift;
+ //! transport type preference (RAW/UDP)
uint8_t transp_preference;
+ //! radio front end preference (EXMIMO,USRP, BALDERF,LMSSDR)
+ uint8_t rf_preference;
} eth_params_t;
@@ -347,7 +359,7 @@ extern "C"
* \param device the hardware to use
*/
openair0_timestamp get_usrp_time(openair0_device *device);
-
+
/*! \brief Set RX frequencies
* \param device the hardware to use
* \param openair0_cfg RF frontend parameters set by application
diff --git a/targets/ARCH/ETHERNET/USERSPACE/LIB/ethernet_lib.c b/targets/ARCH/ETHERNET/USERSPACE/LIB/ethernet_lib.c
index 4fa522f21a..f15f2d98eb 100644
--- a/targets/ARCH/ETHERNET/USERSPACE/LIB/ethernet_lib.c
+++ b/targets/ARCH/ETHERNET/USERSPACE/LIB/ethernet_lib.c
@@ -344,43 +344,35 @@ int transport_init(openair0_device *device, openair0_config_t *openair0_cfg, eth
/* device specific */
openair0_cfg[0].txlaunch_wait = 0;//manage when TX processing is triggered
openair0_cfg[0].txlaunch_wait_slotcount = 0; //manage when TX processing is triggered
- openair0_cfg[0].iq_txshift = 5;// shift
openair0_cfg[0].iq_rxrescale = 15;//rescale iqs
+ openair0_cfg[0].iq_txshift = eth_params->iq_txshift;// shift
+ openair0_cfg[0].tx_sample_advance = eth_params->tx_sample_advance;
/* RRH does not have any information to make this configuration atm */
if (device->host_type == BBU_HOST) {
/*Note scheduling advance values valid only for case 7680000 */
switch ((int)openair0_cfg[0].sample_rate) {
case 30720000:
- openair0_cfg[0].samples_per_packet = 4096;
- openair0_cfg[0].tx_sample_advance = 115;
- openair0_cfg[0].tx_scheduling_advance = 11*openair0_cfg[0].samples_per_packet;
+ openair0_cfg[0].samples_per_packet = 4096;
break;
case 23040000:
openair0_cfg[0].samples_per_packet = 2048;
- openair0_cfg[0].tx_sample_advance = 113;
- openair0_cfg[0].tx_scheduling_advance = 8*openair0_cfg[0].samples_per_packet;
break;
case 15360000:
- openair0_cfg[0].samples_per_packet = 2048;
- openair0_cfg[0].tx_sample_advance = 113;
- openair0_cfg[0].tx_scheduling_advance = 9*openair0_cfg[0].samples_per_packet;
+ openair0_cfg[0].samples_per_packet = 2048;
break;
case 7680000:
- openair0_cfg[0].samples_per_packet = 1024;
- openair0_cfg[0].tx_sample_advance = 70;
- openair0_cfg[0].tx_scheduling_advance = 9*openair0_cfg[0].samples_per_packet;
- break;
+ openair0_cfg[0].samples_per_packet = 1024;
+ break;
case 1920000:
- openair0_cfg[0].samples_per_packet = 256;
- openair0_cfg[0].tx_sample_advance = 40;
- openair0_cfg[0].tx_scheduling_advance = 8*openair0_cfg[0].samples_per_packet;
+ openair0_cfg[0].samples_per_packet = 256;
break;
default:
printf("Error: unknown sampling rate %f\n",openair0_cfg[0].sample_rate);
exit(-1);
break;
}
+ openair0_cfg[0].tx_scheduling_advance = eth_params->tx_scheduling_advance*openair0_cfg[0].samples_per_packet;
}
device->openair0_cfg=&openair0_cfg[0];
diff --git a/targets/ARCH/LMSSDR/USERSPACE/LIB/Si5351C/CMakeLists.txt b/targets/ARCH/LMSSDR/USERSPACE/LIB/Si5351C/CMakeLists.txt
new file mode 100644
index 0000000000..88a021ae00
--- /dev/null
+++ b/targets/ARCH/LMSSDR/USERSPACE/LIB/Si5351C/CMakeLists.txt
@@ -0,0 +1,11 @@
+set(si5351_src_files
+ Si5351C.cpp
+)
+set(CMAKE_CXX_FLAGS
+ "${CMAKE_CXX_FLAGS} ${C_FLAGS_PROCESSOR} -std=c++11 "
+)
+
+
+add_library(Si5351C STATIC ${si5351_src_files})
+target_include_directories(Si5351C PUBLIC ../lms7002m ${CMAKE_CURRENT_SOURCE_DIR})
+target_link_libraries(Si5351C LMS7002M)
diff --git a/targets/ARCH/LMSSDR/USERSPACE/LIB/Si5351C/Si5351C.cpp b/targets/ARCH/LMSSDR/USERSPACE/LIB/Si5351C/Si5351C.cpp
new file mode 100644
index 0000000000..88bcb74f3d
--- /dev/null
+++ b/targets/ARCH/LMSSDR/USERSPACE/LIB/Si5351C/Si5351C.cpp
@@ -0,0 +1,872 @@
+/**
+@file Si5351C.cpp
+@author Lime Microsystems
+@brief Configuring of Si5351C
+*/
+
+#include "Si5351C.h"
+#include "lmsComms.h"
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+using namespace std;
+
+#define Log(msg, type) cout << (msg) << endl;
+
+/// Splits float into fraction integers A + B/C
+void realToFrac(const float real, int &A, int &B, int &C)
+{
+ A = (int)real;
+ B = (int)((real - A) * 1048576 + 0.5);
+ C = 1048576;
+
+ int a = B;
+ int b = C;
+ int temp;
+ while( b!= 0) // greatest common divider
+ {
+ temp = a % b;
+ a = b;
+ b = temp;
+ }
+ B = B/a;
+ C = C/a;
+}
+
+/// Default configuration
+const unsigned char Si5351C::m_defaultConfiguration[] =
+{ 0,0x00,
+ 1,0x00,
+ 2,0x08,
+ 3,0x00,
+ 4,0x00,
+ 5,0x00,
+ 6,0x00,
+ 7,0x00,
+ 8,0x00,
+ 9,0x00,
+ 10,0x00,
+ 11,0x00,
+ 12,0x00,
+ 13,0x00,
+ 14,0x00,
+ 15,0x04,
+ 16,0x4F,
+ 17,0x4F,
+ 18,0x4F,
+ 19,0x4F,
+ 20,0x4F,
+ 21,0x4F,
+ 22,0x0F,
+ 23,0x0F,
+ 24,0x00,
+ 25,0x00,
+ 26,0x00,
+ 27,0x80,
+ 28,0x00,
+ 29,0x0B,
+ 30,0x2F,
+ 31,0x00,
+ 32,0x00,
+ 33,0x00,
+ 34,0x00,
+ 35,0x00,
+ 36,0x00,
+ 37,0x00,
+ 38,0x00,
+ 39,0x00,
+ 40,0x00,
+ 41,0x00,
+ 42,0x00,
+ 43,0x01,
+ 44,0x00,
+ 45,0x0D,
+ 46,0x00,
+ 47,0x00,
+ 48,0x00,
+ 49,0x00,
+ 50,0x00,
+ 51,0x01,
+ 52,0x00,
+ 53,0x0D,
+ 54,0x00,
+ 55,0x00,
+ 56,0x00,
+ 57,0x00,
+ 58,0x00,
+ 59,0x01,
+ 60,0x00,
+ 61,0x0D,
+ 62,0x00,
+ 63,0x00,
+ 64,0x00,
+ 65,0x00,
+ 66,0x00,
+ 67,0x01,
+ 68,0x00,
+ 69,0x0D,
+ 70,0x00,
+ 71,0x00,
+ 72,0x00,
+ 73,0x00,
+ 74,0x00,
+ 75,0x01,
+ 76,0x00,
+ 77,0x0D,
+ 78,0x00,
+ 79,0x00,
+ 80,0x00,
+ 81,0x00,
+ 82,0x00,
+ 83,0x01,
+ 84,0x00,
+ 85,0x0D,
+ 86,0x00,
+ 87,0x00,
+ 88,0x00,
+ 89,0x00,
+ 90,0x1E,
+ 91,0x1E,
+ 92,0x00,
+ 93,0x00,
+ 94,0x00,
+ 95,0x00,
+ 96,0x00,
+ 97,0x00,
+ 98,0x00,
+ 99,0x00,
+100,0x00,
+101,0x00,
+102,0x00,
+103,0x00,
+104,0x00,
+105,0x00,
+106,0x00,
+107,0x00,
+108,0x00,
+109,0x00,
+110,0x00,
+111,0x00,
+112,0x00,
+113,0x00,
+114,0x00,
+115,0x00,
+116,0x00,
+117,0x00,
+118,0x00,
+119,0x00,
+120,0x00,
+121,0x00,
+122,0x00,
+123,0x00,
+124,0x00,
+125,0x00,
+126,0x00,
+127,0x00,
+128,0x00,
+129,0x00,
+130,0x00,
+131,0x00,
+132,0x00,
+133,0x00,
+134,0x00,
+135,0x00,
+136,0x00,
+137,0x00,
+138,0x00,
+139,0x00,
+140,0x00,
+141,0x00,
+142,0x00,
+143,0x00,
+144,0x00,
+145,0x00,
+146,0x00,
+147,0x00,
+148,0x00,
+149,0x00,
+150,0x00,
+151,0x00,
+152,0x00,
+153,0x00,
+154,0x00,
+155,0x00,
+156,0x00,
+157,0x00,
+158,0x00,
+159,0x00,
+160,0x00,
+161,0x00,
+162,0x00,
+163,0x00,
+164,0x00,
+165,0x00,
+166,0x00,
+167,0x00,
+168,0x00,
+169,0x00,
+170,0x00,
+171,0x00,
+172,0x00,
+173,0x00,
+174,0x00,
+175,0x00,
+176,0x00,
+177,0x00,
+178,0x00,
+179,0x00,
+180,0x00,
+181,0x30,
+182,0x00,
+183,0xD2,
+184,0x60,
+185,0x60,
+186,0x00,
+187,0xC0,
+188,0x00,
+189,0x00,
+190,0x00,
+191,0x00,
+192,0x00,
+193,0x00,
+194,0x00,
+195,0x00,
+196,0x00,
+197,0x00,
+198,0x00,
+199,0x00,
+200,0x00,
+201,0x00,
+202,0x00,
+203,0x00,
+204,0x00,
+205,0x00,
+206,0x00,
+207,0x00,
+208,0x00,
+209,0x00,
+210,0x00,
+211,0x00,
+212,0x00,
+213,0x00,
+214,0x00,
+215,0x00,
+216,0x00,
+217,0x00,
+218,0x00,
+219,0x00,
+220,0x00,
+221,0x0D,
+222,0x00,
+223,0x00,
+224,0x00,
+225,0x00,
+226,0x00,
+227,0x00,
+228,0x00,
+229,0x00,
+230,0x00,
+231,0x00,
+232,0x00};
+
+// ---------------------------------------------------------------------------
+Si5351C::Si5351C()
+{
+ memset(m_newConfiguration, 0, 255);
+ for(unsigned int i=0; iIsOpen() )
+ {
+ return FAILED;
+ }
+ LMScomms::TransferStatus status;
+ status = device->TransferPacket(pkt);
+ if (status != LMScomms::TRANSFER_SUCCESS || pkt.status != STATUS_COMPLETED_CMD)
+ {
+ return FAILED;
+ }
+ return SUCCESS;
+}
+
+// ---------------------------------------------------------------------------
+/**
+ @brief Sets connection manager to use for data transferring Si5351C
+ @param mng connection manager for data transferring
+*/
+void Si5351C::Initialize(LMScomms *mng)
+{
+ assert(mng != nullptr);
+ device = mng;
+}
+
+/**
+ @brief Loads register values for Si5356A from file
+ @param FName input filename
+*/
+bool Si5351C::LoadRegValuesFromFile(string FName)
+{
+ fstream fin;
+ fin.open(FName.c_str(), ios::in);
+
+ const int len = 1024;
+ char line[len];
+
+ int addr;
+ int value;
+
+ while(!fin.eof())
+ {
+ fin.getline(line, len);
+ if( line[0] == '#')
+ continue;
+ if( strcmp(line, "#END_PROFILE") == 0)
+ break;
+ sscanf(line, "%i,%x",&addr,&value);
+ m_newConfiguration[addr] = value;
+ }
+
+ fin.close();
+ return false;
+};
+
+/** @brief Calculates multisynth dividers and VCO frequencies
+ @param clocks output clocks configuration
+ @param plls plls configurations
+ @param Fmin lowest VCO frequency
+ @param Fmax highest VCO frequency
+*/
+void Si5351C::FindVCO(Si5351_Channel *clocks, Si5351_PLL *plls, const unsigned long Fmin, const unsigned long Fmax)
+{
+ int clockCount = 8;
+ //reset output parameters
+ for(int i=0; i availableFrequenciesPLLA; //all available frequencies for VCO
+ map< unsigned long, int> availableFrequenciesPLLB; //all available frequencies for VCO
+
+ //if clk6 or clk7 is used make available frequencies according to them
+ if(clocks[6].powered || clocks[7].powered)
+ {
+ set clk6freqs;
+ set clk7freqs;
+ set sharedFreqs;
+ unsigned int mult = 6;
+ if(!clk6satisfied)
+ {
+ unsigned long freq = clocks[6].outputFreqHz;
+ while(freq <= Fmax && mult <= 254)
+ {
+ freq = clocks[6].outputFreqHz*mult;
+ if(freq >= Fmin && freq <= Fmax)
+ {
+ clk6freqs.insert(freq);
+ }
+ mult += 2;
+ }
+ }
+ mult = 6;
+ if(!clk7satisfied)
+ {
+ unsigned long freq = clocks[7].outputFreqHz;
+ while(freq <= Fmax && mult <= 254)
+ {
+ freq = clocks[7].outputFreqHz*mult;
+ if(freq >= Fmin && freq <= Fmax)
+ {
+ clk7freqs.insert(freq);
+ }
+ mult += 2;
+ }
+ }
+ bool canShare = false;
+ //find if clk6 and clk7 can share the same pll
+ for (set::iterator it6=clk6freqs.begin(); it6!=clk6freqs.end(); ++it6)
+ {
+ for (set::iterator it7=clk7freqs.begin(); it7!=clk7freqs.end(); ++it7)
+ {
+ if(*it6 == *it7)
+ {
+ canShare = true;
+ sharedFreqs.insert(*it6);
+ }
+ }
+ }
+ if(canShare) //assign PLLA for both clocks
+ {
+ clocks[6].pllSource = 0;
+ clocks[7].pllSource = 0;
+ pllAused = true;
+ for (set::iterator it=sharedFreqs.begin(); it!=sharedFreqs.end(); ++it)
+ {
+ availableFrequenciesPLLA.insert( pair (*it, 0) );
+ }
+ clk6satisfied = true;
+ clk7satisfied = true;
+ }
+ else //if clocks 6 and 7 can't share pll, assign pllA to clk6 and pllB to clk7
+ {
+ if(!clk6satisfied)
+ {
+ clocks[6].pllSource = 0;
+ clk6satisfied = true;
+ pllAused = true;
+ for (set::iterator it6=clk6freqs.begin(); it6!=clk6freqs.end(); ++it6)
+ {
+ availableFrequenciesPLLA.insert( pair(*it6, 0) );
+ }
+ }
+ if(!clk7satisfied)
+ {
+ clocks[7].pllSource = 1;
+ clk7satisfied = true;
+ pllBused = true;
+ for (set::iterator it7=clk7freqs.begin(); it7!=clk7freqs.end(); ++it7)
+ {
+ availableFrequenciesPLLB.insert( pair (*it7, 0) );
+ }
+ }
+ }
+ }
+
+ //PLLA stage, find all clocks that have integer coefficients with PLLA
+ //if pllA is not used by clk6 or clk7, fill available frequencies according to clk1-clk5 clocks
+ if( availableFrequenciesPLLA.size() == 0 && !pllAused)
+ {
+ for(int i=0; i<6; ++i)
+ {
+ unsigned long freq = clocks[i].outputFreqHz > Fmin ? clocks[i].outputFreqHz : (clocks[i].outputFreqHz*((Fmin/clocks[i].outputFreqHz) + ((Fmin%clocks[i].outputFreqHz)!=0)));
+ while(freq >= Fmin && freq <= Fmax)
+ {
+ //add all output frequency multiples that are in VCO interval
+ availableFrequenciesPLLA.insert( pair (freq, 0));
+ freq += clocks[i].outputFreqHz;
+ }
+ }
+ }
+
+ unsigned int bestScore = 0; //score shows how many outputs have integer dividers
+ //calculate scores for all available frequencies
+ unsigned long bestVCOA = 0;
+ for (map::iterator it=availableFrequenciesPLLA.begin(); it!=availableFrequenciesPLLA.end(); ++it)
+ {
+ for(int i=0; i<8; ++i)
+ {
+ if(clocks[i].outputFreqHz == 0 || !clocks[i].powered)
+ continue;
+
+ if( (it->first % clocks[i].outputFreqHz) == 0)
+ {
+ it->second = it->second+1;
+ }
+ }
+ if(it->second >= bestScore)
+ {
+ bestScore = it->second;
+ bestVCOA = it->first;
+ }
+ }
+ //scores calculated
+ //cout << "PLLA stage: " << endl;
+ //cout << "best score: " << bestScore << " best VCO: " << bestVCOA << endl;
+ plls[0].VCO_Hz = bestVCOA;
+ plls[0].feedbackDivider = (double)bestVCOA/plls[0].inputFreqHz;
+
+ for(int i=0; i Fmin ? clocks[i].outputFreqHz : (clocks[i].outputFreqHz*((Fmin/clocks[i].outputFreqHz) + ((Fmin%clocks[i].outputFreqHz)!=0)));
+ while(freq >= Fmin && freq <= Fmax)
+ {
+ availableFrequenciesPLLB.insert( pair (freq, 0));
+ freq += clocks[i].outputFreqHz;
+ }
+ }
+ }
+
+ bestScore = 0;
+ //calculate scores for all available frequencies
+ unsigned long bestVCOB = 0;
+ for (map::iterator it=availableFrequenciesPLLB.begin(); it!=availableFrequenciesPLLB.end(); ++it)
+ {
+ for(int i=0; i<8; ++i)
+ {
+ if(clocks[i].outputFreqHz == 0 || !clocks[i].powered)
+ continue;
+
+ if( (it->first % clocks[i].outputFreqHz) == 0)
+ {
+ it->second = it->second+1;
+ }
+ }
+ if(it->second >= bestScore)
+ {
+ bestScore = it->second;
+ bestVCOB = it->first;
+ }
+ }
+ //scores calculated
+// cout << "PLLB stage: " << endl;
+// cout << "best score: " << bestScore << " best VCO: " << bestVCOB << endl;
+ if(bestVCOB == 0) //just in case if pllb is not used make it the same frequency as plla
+ bestVCOB = bestVCOA;
+ plls[1].VCO_Hz = bestVCOB;
+ plls[1].feedbackDivider = (double)bestVCOB/plls[0].inputFreqHz;
+ for(int i=0; i> 8;
+ m_newConfiguration[addr+1] = MSX_P3;
+
+ m_newConfiguration[addr+2] = 0;
+ m_newConfiguration[addr+2] |= (MSX_P1 >> 16 ) & 0x03;
+ m_newConfiguration[addr+3] = MSX_P1 >> 8;
+ m_newConfiguration[addr+4] = MSX_P1;
+
+ m_newConfiguration[addr+5] = 0;
+ m_newConfiguration[addr+5] = (MSX_P2 >> 16) & 0x0F;
+ m_newConfiguration[addr+5] |= (MSX_P3 >> 16) << 4;
+
+ m_newConfiguration[addr+6] = MSX_P2;
+ m_newConfiguration[addr+7] = MSX_P2 >> 8;
+ }
+ else if( CLK[i].outputFreqHz <= 160000000) // AVAILABLE ONLY ON 0-5 MULTISYNTHS
+ {
+ Log("Si5351C - clock configuring for more than 150 MHz not implemented\n", LOG_ERROR);
+ return FAILED;
+ }
+ }
+ else // CLK6 and CLK7 only integer mode
+ {
+ if(CLK[i].outputFreqHz <= 150000000)
+ {
+ if(i==6)
+ {
+ m_newConfiguration[90] = DivA;
+ if(DivA%2 != 0)
+ {
+ Log("Si5351C - CLK6 multisynth divider is not even integer\n", LOG_ERROR);
+ return FAILED;
+ }
+ }
+ else
+ {
+ m_newConfiguration[91] = DivA;
+ if(DivA%2 != 0)
+ {
+ Log("Si5351C - CLK7 multisynth divider is not even integer\n", LOG_ERROR);
+ return FAILED;
+ }
+ }
+ }
+ else if( CLK[i].outputFreqHz <= 160000000) // AVAILABLE ONLY ON 0-5 MULTISYNTHS
+ {
+ Log("Si5351C - clock configuring for more than 150 MHz not implemented\n", LOG_ERROR);
+ return FAILED;
+ }
+ }
+ }
+
+ //configure pll
+ //set input clk source
+ m_newConfiguration[15] = m_newConfiguration[15] & 0xF3;
+ m_newConfiguration[15] |= (PLL[0].CLK_SRC & 1) << 2;
+ m_newConfiguration[15] |= (PLL[1].CLK_SRC & 1) << 3;
+ for(int i=0; i<2; ++i)
+ {
+ addr = 26+i*8;
+ if(PLL[i].feedbackDivider < 15 || PLL[i].feedbackDivider > 90)
+ {
+ Log("Si5351C - VCO frequency divider out of range [15:90].\n", LOG_ERROR);
+ return FAILED;
+ }
+ if( PLL[i].VCO_Hz < 600000000 || PLL[i].VCO_Hz > 900000000)
+ {
+ Log("Si5351C - Can't calculate valid VCO frequency.\n", LOG_ERROR);
+ return FAILED;
+ }
+ ss.clear();
+ ss.str(string());
+ ss << "Si5351C : VCO" << (i==0 ? "A" : "B") << " = " << PLL[i].VCO_Hz/1000000.0 << " MHz";
+
+ //calculate MSNx_P1, MSNx_P2, MSNx_P3
+ int MSNx_P1;
+ int MSNx_P2;
+ int MSNx_P3;
+
+ int DivA;
+ int DivB;
+ int DivC;
+ realToFrac(PLL[i].feedbackDivider, DivA, DivB, DivC);
+ ss << " Feedback Divider " << DivA << " " << DivB << "/" << DivC << endl;
+ Log(ss.str(), LOG_INFO);
+
+ MSNx_P1 = 128 * DivA + floor(128 * ( (float)DivB/DivC)) - 512;
+ MSNx_P2 = 128 * DivB - DivC * floor( 128 * DivB/DivC );
+ MSNx_P3 = DivC;
+
+ m_newConfiguration[addr+4] = MSNx_P1;
+ m_newConfiguration[addr+3] = MSNx_P1 >> 8;
+ m_newConfiguration[addr+2] = MSNx_P1 >> 16;
+
+ m_newConfiguration[addr+7] = MSNx_P2;
+ m_newConfiguration[addr+6] = MSNx_P2 >> 8;
+ m_newConfiguration[addr+5] = 0;
+ m_newConfiguration[addr+5] = (MSNx_P2 >> 16) & 0x0F;
+
+ m_newConfiguration[addr+5] |= (MSNx_P3 >> 16) << 4;
+ m_newConfiguration[addr+1] |= MSNx_P3;
+ m_newConfiguration[addr] |= MSNx_P3 >> 8;
+ }
+ return SUCCESS;
+}
+
+/** @brief Sets output clock parameters
+ @param id clock id 0-CLK0 1-CLK1 ...
+ @param fOut_Hz output frequency in Hz
+ @param enabled is this output powered
+ @param inverted invert clock
+*/
+void Si5351C::SetClock(unsigned char id, unsigned long fOut_Hz, bool enabled, bool inverted)
+{
+ if( id < 8)
+ {
+ if(fOut_Hz < 8000 || fOut_Hz > 160000000)
+ {
+ stringstream ss;
+ ss << "Si5351C - CLK" << (int)id << " output frequency must be between 8kHz and 160MHz. fOut_MHz = " << fOut_Hz/1000000.0 << endl;
+ Log(ss.str(), LOG_ERROR);
+ return;
+ }
+ CLK[id].powered = enabled;
+ CLK[id].inverted = inverted;
+ CLK[id].outputFreqHz = fOut_Hz;
+ }
+}
+
+/** @brief Sets PLL input frequency
+ @param id PLL id 0-PLLA 1-PLLB
+ @param CLKIN_Hz clock input in Hz
+*/
+void Si5351C::SetPLL(unsigned char id, unsigned long CLKIN_Hz, int CLK_SRC)
+{
+ if (id < 2)
+ {
+ PLL[id].inputFreqHz = CLKIN_Hz;
+ PLL[id].CLK_SRC = CLK_SRC;
+ }
+}
+
+/** @brief Resets configuration registers to default values
+*/
+void Si5351C::Reset()
+{
+ memset(m_newConfiguration, 0, 255);
+ for(unsigned int i=0; iTransferPacket(pkt);
+ if (status != LMScomms::TRANSFER_SUCCESS || pkt.status != STATUS_COMPLETED_CMD)
+ {
+ return stat;
+ }
+
+ stat.sys_init = (pkt.inBuffer[0] >> 7);
+ stat.lol_b = (pkt.inBuffer[0] >> 6) & 0x1;
+ stat.lol_a = (pkt.inBuffer[0] >> 5) & 0x1;
+ stat.los = (pkt.inBuffer[0] >> 4) & 0x1;
+ stat.sys_init_stky = (pkt.inBuffer[1] >> 7);
+ stat.lol_b_stky = (pkt.inBuffer[1] >> 6) & 0x1;
+ stat.lol_a_stky = (pkt.inBuffer[1] >> 5) & 0x1;
+ stat.los_stky = (pkt.inBuffer[1] >> 4) & 0x1;
+ return stat;
+}
+
+Si5351C::Status Si5351C::ClearStatus()
+{
+ LMScomms::GenericPacket pkt;
+ pkt.cmd = CMD_SI5351_WR;
+ pkt.outBuffer.push_back(1);
+ pkt.outBuffer.push_back(0x0);
+ LMScomms::TransferStatus status;
+ status = device->TransferPacket(pkt);
+ if (status != LMScomms::TRANSFER_SUCCESS || pkt.status != STATUS_COMPLETED_CMD)
+ return FAILED;
+ return SUCCESS;
+}
diff --git a/targets/ARCH/LMSSDR/USERSPACE/LIB/Si5351C/Si5351C.h b/targets/ARCH/LMSSDR/USERSPACE/LIB/Si5351C/Si5351C.h
new file mode 100644
index 0000000000..971a2d1d69
--- /dev/null
+++ b/targets/ARCH/LMSSDR/USERSPACE/LIB/Si5351C/Si5351C.h
@@ -0,0 +1,100 @@
+/**
+@file Si5351C.h
+@brief Header for Si5351C.cpp
+@author Lime Microsystems
+*/
+
+#ifndef SI5351C_MODULE
+#define SI5351C_MODULE
+
+#include
+#include
+using namespace std;
+//---------------------------------------------------------------------------
+
+enum eSi_CLOCK_INPUT
+{
+ Si_CLKIN,
+ Si_XTAL,
+ Si_CMOS
+};
+
+struct Si5351_Channel
+{
+ Si5351_Channel() : outputDivider(1), outputFreqHz(1), multisynthDivider(1), pllSource(0),
+ phaseOffset(0), powered(true), inverted(false), int_mode(false) {};
+ int outputDivider;
+ unsigned long outputFreqHz;
+ float multisynthDivider;
+ int pllSource;
+ float phaseOffset;
+ bool powered;
+ bool inverted;
+ bool int_mode;
+};
+
+struct Si5351_PLL
+{
+ Si5351_PLL() : inputFreqHz(0), VCO_Hz(0), feedbackDivider(0), CLKIN_DIV(1), CLK_SRC(1) {}
+ unsigned long inputFreqHz;
+ float VCO_Hz;
+ float feedbackDivider;
+ int CLKIN_DIV;
+ int CLK_SRC; //0-XTAL, 1-CLKIN
+};
+
+class LMScomms;
+class Si5351C
+{
+public:
+ enum Status
+ {
+ SUCCESS,
+ FAILED,
+ };
+
+ struct StatusBits
+ {
+ StatusBits() : sys_init(0), sys_init_stky(0), lol_b(0), lol_b_stky(0), lol_a(0), lol_a_stky(0), los(0), los_stky(0)
+ {
+
+ }
+ int sys_init;
+ int sys_init_stky;
+ int lol_b;
+ int lol_b_stky;
+ int lol_a;
+ int lol_a_stky;
+ int los;
+ int los_stky;
+ };
+
+ StatusBits GetStatusBits();
+ Status ClearStatus();
+
+ Si5351C();
+ ~Si5351C();
+ void Initialize(LMScomms *mng);
+ bool LoadRegValuesFromFile(string FName);
+
+ void SetPLL(unsigned char id, unsigned long CLKIN_Hz, int CLK_SRC);
+ void SetClock(unsigned char id, unsigned long fOut_Hz, bool enabled = true, bool inverted = false);
+
+ Status UploadConfiguration();
+ Status ConfigureClocks();
+ void Reset();
+
+private:
+ void FindVCO(Si5351_Channel *clocks, Si5351_PLL *plls, const unsigned long Fmin, const unsigned long Fmax);
+ LMScomms *device;
+
+ Si5351_PLL PLL[2];
+ Si5351_Channel CLK[8];
+
+ static const unsigned char m_defaultConfiguration[];
+ unsigned char m_newConfiguration[255];
+
+
+};
+
+#endif // SI5351C_MODULE
diff --git a/targets/ARCH/LMSSDR/USERSPACE/LIB/lms7002m/CMakeLists.txt b/targets/ARCH/LMSSDR/USERSPACE/LIB/lms7002m/CMakeLists.txt
new file mode 100644
index 0000000000..cea22ac829
--- /dev/null
+++ b/targets/ARCH/LMSSDR/USERSPACE/LIB/lms7002m/CMakeLists.txt
@@ -0,0 +1,63 @@
+cmake_minimum_required(VERSION 2.8)
+set(CMAKE_CONFIGURATION_TYPES "Debug;Release" CACHE TYPE INTERNAL FORCE)
+project("lms7api")
+#include modules for finding FFTW and CyAPI
+set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_SOURCE_DIR}/cmake/Modules/")
+cmake_policy(SET CMP0015 OLD)
+if(${CMAKE_MAJOR_VERSION} GREATER 2)
+ cmake_policy(SET CMP0043 NEW)
+endif()
+ADD_DEFINITIONS(-D_CRT_SECURE_NO_WARNINGS)
+if(CMAKE_COMPILER_IS_GNUCXX)
+ SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++0x")
+endif()
+
+# set up include-directories
+include_directories(
+ "${PROJECT_SOURCE_DIR}"
+ "${PROJECT_BINARY_DIR}"
+ cpp-feather-ini-parser
+ )
+
+set(LMS7002M_src_files
+ LMS7002M.cpp
+ LMS7002M_parameters.cpp
+ LMS7002M_statuses.cpp
+ LMS7002M_filtersCalibration.cpp
+ lmsComms.cpp
+ LMS7002M_RegistersMap.cpp
+)
+
+set(ENABLE_USB_CONNECTION "YES" CACHE BOOL INTERNAL)
+set(ENABLE_SPI_CONNECTION "NO" CACHE BOOL INTERNAL)
+set(CONNECTION_MANAGER_DIR connectionManager)
+set(connectionManager_src_files
+ ${CONNECTION_MANAGER_DIR}/ConnectionManager.cpp
+ ${CONNECTION_MANAGER_DIR}/ConnectionCOM.cpp
+ ${CONNECTION_MANAGER_DIR}/ConnectionManager.h
+ ${CONNECTION_MANAGER_DIR}/ConnectionCOM.h
+)
+if(ENABLE_USB_CONNECTION)
+ list(APPEND connectionManager_src_files ${CONNECTION_MANAGER_DIR}/ConnectionUSB.cpp ${CONNECTION_MANAGER_DIR}/ConnectionUSB.h)
+ add_definitions(-DENABLE_USB_CONNECTION)
+endif()
+if(ENABLE_SPI_CONNECTION)
+ list(APPEND connectionManager_src_files ${CONNECTION_MANAGER_DIR}/ConnectionSPI.cpp ${CONNECTION_MANAGER_DIR}/ConnectionSPI.h)
+ add_definitions(-DENABLE_SPI_CONNECTION)
+endif()
+
+add_library(LMS7002M STATIC ${LMS7002M_src_files} ${connectionManager_src_files})
+target_include_directories(LMS7002M PUBLIC ${CMAKE_CURRENT_SOURCE_DIR})
+
+if(WIN32 AND ENABLE_USB_CONNECTION)
+ find_package(CyAPI REQUIRED)
+ LINK_DIRECTORIES(${CYAPI_LIBRARIES})
+ include_directories(${CYAPI_INCLUDE_DIRS})
+ set(CONNECTION_MANAGER_LIBS ${CYAPI_LIBRARIES} SetupAPI)
+ target_link_libraries(LMS7002M ${CONNECTION_MANAGER_LIBS})
+endif()
+if(UNIX AND ENABLE_USB_CONNECTION)
+ set(CONNECTION_MANAGER_LIBS usb-1.0 -lpthread)
+ target_link_libraries(LMS7002M ${CONNECTION_MANAGER_LIBS})
+endif()
+
diff --git a/targets/ARCH/LMSSDR/USERSPACE/LIB/lms7002m/LMS7002M.cpp b/targets/ARCH/LMSSDR/USERSPACE/LIB/lms7002m/LMS7002M.cpp
new file mode 100644
index 0000000000..ded70e114f
--- /dev/null
+++ b/targets/ARCH/LMSSDR/USERSPACE/LIB/lms7002m/LMS7002M.cpp
@@ -0,0 +1,2612 @@
+/**
+@file LMS7002M.cpp
+@author Lime Microsystems (www.limemicro.com)
+@brief Implementation of LMS7002M transceiver configuring
+*/
+
+#include "LMS7002M.h"
+#include
+#include
+#include "lmsComms.h"
+#include "INI.h"
+#include
+#include
+#include
+#include "LMS7002M_RegistersMap.h"
+
+#include
+#include
+
+float_type LMS7002M::gVCO_frequency_table[3][2] = { { 3800, 5222 }, { 4961, 6754 }, {6306, 7714} };
+float_type LMS7002M::gCGEN_VCO_frequencies[2] = {2000, 2700};
+
+///define for parameter enumeration if prefix might be needed
+#define LMS7param(id) id
+
+//module addresses needs to be sorted in ascending order
+const uint16_t LMS7002M::readOnlyRegisters[] = { 0x002F, 0x008C, 0x00A8, 0x00A9, 0x00AA, 0x00AB, 0x00AC, 0x0123, 0x0209, 0x020A, 0x020B, 0x040E, 0x040F };
+const uint16_t LMS7002M::readOnlyRegistersMasks[] = { 0x0000, 0x0FFF, 0x007F, 0x0000, 0x0000, 0x0000, 0x0000, 0x003F, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 };
+
+/** @brief Simple logging function to print status messages
+ @param text message to print
+ @param type message type for filtering specific information
+*/
+void LMS7002M::Log(const char* text, LogType type)
+{
+ switch(type)
+ {
+ case LOG_INFO:
+ printf("%s\n", text);
+ break;
+ case LOG_WARNING:
+ printf("Warning: %s\n", text);
+ break;
+ case LOG_ERROR:
+ printf("ERROR: %s\n", text);
+ break;
+ case LOG_DATA:
+ printf("DATA: %s\n", text);
+ break;
+ }
+}
+
+LMS7002M::LMS7002M() : controlPort(NULL), mRegistersMap(new LMS7002M_RegistersMap())
+{
+ mRefClkSXR_MHz = 30.72;
+ mRefClkSXT_MHz = 30.72;
+}
+
+/** @brief Creates LMS7002M main control object, it requires LMScomms to communicate with chip
+ @param controlPort data connection for controlling LMS7002 chip registers
+*/
+LMS7002M::LMS7002M(LMScomms* controlPort) :
+ controlPort(controlPort), mRegistersMap(new LMS7002M_RegistersMap())
+{
+ mRefClkSXR_MHz = 30.72;
+ mRefClkSXT_MHz = 30.72;
+
+ //memory intervals for registers tests and calibration algorithms
+ MemorySectionAddresses[LimeLight][0] = 0x0020;
+ MemorySectionAddresses[LimeLight][1] = 0x002F;
+ MemorySectionAddresses[EN_DIR][0] = 0x0081;
+ MemorySectionAddresses[EN_DIR][1] = 0x0081;
+ MemorySectionAddresses[AFE][0] = 0x0082;
+ MemorySectionAddresses[AFE][1] = 0x0082;
+ MemorySectionAddresses[BIAS][0] = 0x0084;
+ MemorySectionAddresses[BIAS][1] = 0x0084;
+ MemorySectionAddresses[XBUF][0] = 0x0085;
+ MemorySectionAddresses[XBUF][1] = 0x0085;
+ MemorySectionAddresses[CGEN][0] = 0x0086;
+ MemorySectionAddresses[CGEN][1] = 0x008C;
+ MemorySectionAddresses[LDO][0] = 0x0092;
+ MemorySectionAddresses[LDO][1] = 0x00A7;
+ MemorySectionAddresses[BIST][0] = 0x00A8;
+ MemorySectionAddresses[BIST][1] = 0x00AC;
+ MemorySectionAddresses[CDS][0] = 0x00AD;
+ MemorySectionAddresses[CDS][1] = 0x00AE;
+ MemorySectionAddresses[TRF][0] = 0x0100;
+ MemorySectionAddresses[TRF][1] = 0x0104;
+ MemorySectionAddresses[TBB][0] = 0x0105;
+ MemorySectionAddresses[TBB][1] = 0x010A;
+ MemorySectionAddresses[RFE][0] = 0x010C;
+ MemorySectionAddresses[RFE][1] = 0x0114;
+ MemorySectionAddresses[RBB][0] = 0x0115;
+ MemorySectionAddresses[RBB][1] = 0x011A;
+ MemorySectionAddresses[SX][0] = 0x011C;
+ MemorySectionAddresses[SX][1] = 0x0124;
+ MemorySectionAddresses[TxTSP][0] = 0x0200;
+ MemorySectionAddresses[TxTSP][1] = 0x020C;
+ MemorySectionAddresses[TxNCO][0] = 0x0240;
+ MemorySectionAddresses[TxNCO][1] = 0x0261;
+ MemorySectionAddresses[TxGFIR1][0] = 0x0280;
+ MemorySectionAddresses[TxGFIR1][1] = 0x02A7;
+ MemorySectionAddresses[TxGFIR2][0] = 0x02C0;
+ MemorySectionAddresses[TxGFIR2][1] = 0x02E7;
+ MemorySectionAddresses[TxGFIR3a][0] = 0x0300;
+ MemorySectionAddresses[TxGFIR3a][1] = 0x0327;
+ MemorySectionAddresses[TxGFIR3b][0] = 0x0340;
+ MemorySectionAddresses[TxGFIR3b][1] = 0x0367;
+ MemorySectionAddresses[TxGFIR3c][0] = 0x0380;
+ MemorySectionAddresses[TxGFIR3c][1] = 0x03A7;
+ MemorySectionAddresses[RxTSP][0] = 0x0400;
+ MemorySectionAddresses[RxTSP][1] = 0x040F;
+ MemorySectionAddresses[RxNCO][0] = 0x0440;
+ MemorySectionAddresses[RxNCO][1] = 0x0461;
+ MemorySectionAddresses[RxGFIR1][0] = 0x0480;
+ MemorySectionAddresses[RxGFIR1][1] = 0x04A7;
+ MemorySectionAddresses[RxGFIR2][0] = 0x04C0;
+ MemorySectionAddresses[RxGFIR2][1] = 0x04E7;
+ MemorySectionAddresses[RxGFIR3a][0] = 0x0500;
+ MemorySectionAddresses[RxGFIR3a][1] = 0x0527;
+ MemorySectionAddresses[RxGFIR3b][0] = 0x0540;
+ MemorySectionAddresses[RxGFIR3b][1] = 0x0567;
+ MemorySectionAddresses[RxGFIR3c][0] = 0x0580;
+ MemorySectionAddresses[RxGFIR3c][1] = 0x05A7;
+
+ mRegistersMap->InitializeDefaultValues(LMS7parameterList);
+}
+
+LMS7002M::~LMS7002M()
+{
+
+}
+
+/** @brief Sends reset signal to chip, after reset enables B channel controls
+ @return 0-success, other-failure
+*/
+liblms7_status LMS7002M::ResetChip()
+{
+ if (controlPort == NULL)
+ return LIBLMS7_NO_CONNECTION_MANAGER;
+ if (controlPort->IsOpen() == false)
+ return LIBLMS7_NOT_CONNECTED;
+
+ LMScomms::GenericPacket pkt;
+ pkt.cmd = CMD_LMS7002_RST;
+ pkt.outBuffer.push_back(LMS_RST_PULSE);
+ controlPort->TransferPacket(pkt);
+ if (pkt.status == STATUS_COMPLETED_CMD)
+ {
+ Modify_SPI_Reg_bits(LMS7param(MIMO_SISO), 0); //enable B channel after reset
+ return LIBLMS7_SUCCESS;
+ }
+ else
+ return LIBLMS7_FAILURE;
+}
+
+liblms7_status LMS7002M::LoadConfigLegacyFile(const char* filename)
+{
+ ifstream f(filename);
+ if (f.good() == false) //file not found
+ {
+ f.close();
+ return LIBLMS7_FILE_NOT_FOUND;
+ }
+ f.close();
+ uint16_t addr = 0;
+ uint16_t value = 0;
+ uint8_t ch = (uint8_t)Get_SPI_Reg_bits(LMS7param(MAC)); //remember used channel
+ liblms7_status status;
+ typedef INI ini_t;
+ ini_t parser(filename, true);
+ if (parser.select("FILE INFO") == false)
+ return LIBLMS7_FILE_INVALID_FORMAT;
+
+ string type = "";
+ type = parser.get("type", "undefined");
+ stringstream ss;
+ if (type.find("LMS7002 configuration") == string::npos)
+ {
+ ss << "File " << filename << " not recognized" << endl;
+ return LIBLMS7_FILE_INVALID_FORMAT;
+ }
+
+ int fileVersion = 0;
+ fileVersion = parser.get("version", 0);
+
+ vector addrToWrite;
+ vector dataToWrite;
+ if (fileVersion == 1)
+ {
+ if (parser.select("Reference clocks"))
+ {
+ mRefClkSXR_MHz = parser.get("SXR reference frequency MHz", 30.72);
+ mRefClkSXT_MHz = parser.get("SXT reference frequency MHz", 30.72);
+ }
+
+ if (parser.select("LMS7002 registers ch.A") == true)
+ {
+ ini_t::sectionsit_t section = parser.sections.find("LMS7002 registers ch.A");
+
+ uint16_t x0020_value = 0;
+ Modify_SPI_Reg_bits(LMS7param(MAC), 1); //select A channel
+ for (ini_t::keysit_t pairs = section->second->begin(); pairs != section->second->end(); pairs++)
+ {
+ sscanf(pairs->first.c_str(), "%hx", &addr);
+ sscanf(pairs->second.c_str(), "%hx", &value);
+ if (addr == LMS7param(MAC).address) //skip register containing channel selection
+ {
+ x0020_value = value;
+ continue;
+ }
+ addrToWrite.push_back(addr);
+ dataToWrite.push_back(value);
+ }
+ status = SPI_write_batch(&addrToWrite[0], &dataToWrite[0], addrToWrite.size());
+ if (status != LIBLMS7_SUCCESS && status != LIBLMS7_NOT_CONNECTED)
+ return status;
+
+ //parse FCW or PHO
+ if (parser.select("NCO Rx ch.A") == true)
+ {
+ char varname[64];
+ int mode = Get_SPI_Reg_bits(LMS7param(MODE_RX));
+ if (mode == 0) //FCW
+ {
+ for (int i = 0; i < 16; ++i)
+ {
+ sprintf(varname, "FCW%02i", i);
+ SetNCOFrequency(LMS7002M::Rx, i, parser.get(varname, 0.0));
+ }
+ }
+ else
+ {
+ for (int i = 0; i < 16; ++i)
+ {
+ sprintf(varname, "PHO%02i", i);
+ SetNCOPhaseOffset(LMS7002M::Rx, i, parser.get(varname, 0.0));
+ }
+ }
+ }
+ if (parser.select("NCO Tx ch.A") == true)
+ {
+ char varname[64];
+ int mode = Get_SPI_Reg_bits(LMS7param(MODE_TX));
+ if (mode == 0) //FCW
+ {
+ for (int i = 0; i < 16; ++i)
+ {
+ sprintf(varname, "FCW%02i", i);
+ SetNCOFrequency(LMS7002M::Tx, i, parser.get(varname, 0.0));
+ }
+ }
+ else
+ {
+ for (int i = 0; i < 16; ++i)
+ {
+ sprintf(varname, "PHO%02i", i);
+ SetNCOPhaseOffset(LMS7002M::Tx, i, parser.get(varname, 0.0));
+ }
+ }
+ }
+ status = SPI_write(0x0020, x0020_value);
+ if (status != LIBLMS7_SUCCESS && status != LIBLMS7_NOT_CONNECTED)
+ return status;
+ }
+
+ Modify_SPI_Reg_bits(LMS7param(MAC), 2);
+
+ if (parser.select("LMS7002 registers ch.B") == true)
+ {
+ addrToWrite.clear();
+ dataToWrite.clear();
+ ini_t::sectionsit_t section = parser.sections.find("LMS7002 registers ch.B");
+ for (ini_t::keysit_t pairs = section->second->begin(); pairs != section->second->end(); pairs++)
+ {
+ sscanf(pairs->first.c_str(), "%hx", &addr);
+ sscanf(pairs->second.c_str(), "%hx", &value);
+ addrToWrite.push_back(addr);
+ dataToWrite.push_back(value);
+ }
+ Modify_SPI_Reg_bits(LMS7param(MAC), 2); //select B channel
+ status = SPI_write_batch(&addrToWrite[0], &dataToWrite[0], addrToWrite.size());
+ if (status != LIBLMS7_SUCCESS && status != LIBLMS7_NOT_CONNECTED)
+ return status;
+
+ //parse FCW or PHO
+ if (parser.select("NCO Rx ch.B") == true)
+ {
+ char varname[64];
+ int mode = Get_SPI_Reg_bits(LMS7param(MODE_RX));
+ if (mode == 0) //FCW
+ {
+ for (int i = 0; i < 16; ++i)
+ {
+ sprintf(varname, "FCW%02i", i);
+ SetNCOFrequency(LMS7002M::Rx, i, parser.get(varname, 0.0));
+ }
+ }
+ else
+ {
+ for (int i = 0; i < 16; ++i)
+ {
+ sprintf(varname, "PHO%02i", i);
+ SetNCOPhaseOffset(LMS7002M::Rx, i, parser.get(varname, 0.0));
+ }
+ }
+ }
+ if (parser.select("NCO Tx ch.A") == true)
+ {
+ char varname[64];
+ int mode = Get_SPI_Reg_bits(LMS7param(MODE_TX));
+ if (mode == 0) //FCW
+ {
+ for (int i = 0; i < 16; ++i)
+ {
+ sprintf(varname, "FCW%02i", i);
+ SetNCOFrequency(LMS7002M::Tx, i, parser.get(varname, 0.0));
+ }
+ }
+ else
+ {
+ for (int i = 0; i < 16; ++i)
+ {
+ sprintf(varname, "PHO%02i", i);
+ SetNCOPhaseOffset(LMS7002M::Tx, i, parser.get(varname, 0.0));
+ }
+ }
+ }
+ }
+ Modify_SPI_Reg_bits(LMS7param(MAC), ch);
+ return LIBLMS7_SUCCESS;
+ }
+ else
+ return LIBLMS7_FILE_INVALID_FORMAT;
+ return LIBLMS7_FAILURE;
+}
+
+/** @brief Reads configuration file and uploads registers to chip
+ @param filename Configuration source file
+ @return 0-success, other-failure
+*/
+liblms7_status LMS7002M::LoadConfig(const char* filename)
+{
+ ifstream f(filename);
+ if (f.good() == false) //file not found
+ {
+ f.close();
+ return LIBLMS7_FILE_NOT_FOUND;
+ }
+ f.close();
+ uint16_t addr = 0;
+ uint16_t value = 0;
+ uint8_t ch = (uint8_t)Get_SPI_Reg_bits(LMS7param(MAC)); //remember used channel
+
+ liblms7_status status;
+ typedef INI ini_t;
+ ini_t parser(filename, true);
+ if (parser.select("file_info") == false)
+ {
+ //try loading as legacy format
+ status = LoadConfigLegacyFile(filename);
+ Modify_SPI_Reg_bits(MAC, 1);
+ return status;
+ }
+ string type = "";
+ type = parser.get("type", "undefined");
+ stringstream ss;
+ if (type.find("lms7002m_minimal_config") == string::npos)
+ {
+ ss << "File " << filename << " not recognized" << endl;
+ return LIBLMS7_FILE_INVALID_FORMAT;
+ }
+
+ int fileVersion = 0;
+ fileVersion = parser.get("version", 0);
+
+ vector addrToWrite;
+ vector dataToWrite;
+
+ if (fileVersion == 1)
+ {
+ if(parser.select("lms7002_registers_a") == true)
+ {
+ ini_t::sectionsit_t section = parser.sections.find("lms7002_registers_a");
+
+ uint16_t x0020_value = 0;
+ Modify_SPI_Reg_bits(LMS7param(MAC), 1); //select A channel
+ for (ini_t::keysit_t pairs = section->second->begin(); pairs != section->second->end(); pairs++)
+ {
+ sscanf(pairs->first.c_str(), "%hx", &addr);
+ sscanf(pairs->second.c_str(), "%hx", &value);
+ if (addr == LMS7param(MAC).address) //skip register containing channel selection
+ {
+ x0020_value = value;
+ continue;
+ }
+ addrToWrite.push_back(addr);
+ dataToWrite.push_back(value);
+ }
+ status = SPI_write_batch(&addrToWrite[0], &dataToWrite[0], addrToWrite.size());
+ if (status != LIBLMS7_SUCCESS && status != LIBLMS7_NOT_CONNECTED)
+ return status;
+ status = SPI_write(0x0020, x0020_value);
+ if (status != LIBLMS7_SUCCESS && status != LIBLMS7_NOT_CONNECTED)
+ return status;
+ Modify_SPI_Reg_bits(LMS7param(MAC), 2);
+ if (status != LIBLMS7_SUCCESS && status != LIBLMS7_NOT_CONNECTED)
+ return status;
+ }
+
+ if (parser.select("lms7002_registers_b") == true)
+ {
+ addrToWrite.clear();
+ dataToWrite.clear();
+ ini_t::sectionsit_t section = parser.sections.find("lms7002_registers_b");
+ for (ini_t::keysit_t pairs = section->second->begin(); pairs != section->second->end(); pairs++)
+ {
+ sscanf(pairs->first.c_str(), "%hx", &addr);
+ sscanf(pairs->second.c_str(), "%hx", &value);
+ addrToWrite.push_back(addr);
+ dataToWrite.push_back(value);
+ }
+ Modify_SPI_Reg_bits(LMS7param(MAC), 2); //select B channel
+ status = SPI_write_batch(&addrToWrite[0], &dataToWrite[0], addrToWrite.size());
+ if (status != LIBLMS7_SUCCESS && status != LIBLMS7_NOT_CONNECTED)
+ return status;
+ }
+ Modify_SPI_Reg_bits(LMS7param(MAC), ch);
+
+ parser.select("reference_clocks");
+ mRefClkSXR_MHz = parser.get("sxr_ref_clk_mhz", 30.72);
+ mRefClkSXT_MHz = parser.get("sxt_ref_clk_mhz", 30.72);
+ }
+
+ Modify_SPI_Reg_bits(MAC, 1);
+ if (controlPort == NULL)
+ return LIBLMS7_NO_CONNECTION_MANAGER;
+ if (controlPort->IsOpen() == false)
+ return LIBLMS7_NOT_CONNECTED;
+ return LIBLMS7_SUCCESS;
+}
+
+/** @brief Reads all registers from chip and saves to file
+ @param filename destination filename
+ @return 0-success, other failure
+*/
+liblms7_status LMS7002M::SaveConfig(const char* filename)
+{
+ liblms7_status status;
+ typedef INI<> ini_t;
+ ini_t parser(filename, true);
+ parser.create("file_info");
+ parser.set("type", "lms7002m_minimal_config");
+ parser.set("version", 1);
+
+ char addr[80];
+ char value[80];
+
+ uint8_t ch = (uint8_t)Get_SPI_Reg_bits(LMS7param(MAC));
+
+ vector addrToRead;
+ for (uint8_t i = 0; i < MEMORY_SECTIONS_COUNT; ++i)
+ for (uint16_t addr = MemorySectionAddresses[i][0]; addr <= MemorySectionAddresses[i][1]; ++addr)
+ addrToRead.push_back(addr);
+ vector dataReceived;
+ dataReceived.resize(addrToRead.size(), 0);
+
+ parser.create("lms7002_registers_a");
+ Modify_SPI_Reg_bits(LMS7param(MAC), 1);
+ for (uint16_t i = 0; i < addrToRead.size(); ++i)
+ {
+ dataReceived[i] = Get_SPI_Reg_bits(addrToRead[i], 15, 0, false);
+ sprintf(addr, "0x%04X", addrToRead[i]);
+ sprintf(value, "0x%04X", dataReceived[i]);
+ parser.set(addr, value);
+ }
+
+ parser.create("lms7002_registers_b");
+ addrToRead.clear(); //add only B channel addresses
+ for (uint8_t i = 0; i < MEMORY_SECTIONS_COUNT; ++i)
+ for (uint16_t addr = MemorySectionAddresses[i][0]; addr <= MemorySectionAddresses[i][1]; ++addr)
+ if (addr >= 0x0100)
+ addrToRead.push_back(addr);
+
+ Modify_SPI_Reg_bits(LMS7param(MAC), 2);
+ for (uint16_t i = 0; i < addrToRead.size(); ++i)
+ {
+ dataReceived[i] = Get_SPI_Reg_bits(addrToRead[i], 15, 0, false);
+ sprintf(addr, "0x%04X", addrToRead[i]);
+ sprintf(value, "0x%04X", dataReceived[i]);
+ parser.set(addr, value);
+ }
+
+ Modify_SPI_Reg_bits(LMS7param(MAC), ch); //retore previously used channel
+
+ parser.create("reference_clocks");
+ parser.set("sxt_ref_clk_mhz", mRefClkSXT_MHz);
+ parser.set("sxr_ref_clk_mhz", mRefClkSXR_MHz);
+ parser.save(filename);
+ return LIBLMS7_SUCCESS;
+}
+
+/** @brief Returns reference clock in MHz used for SXT or SXR
+ @param Tx transmitter or receiver selection
+*/
+float_type LMS7002M::GetReferenceClk_SX(bool tx)
+{
+ return tx ? mRefClkSXT_MHz : mRefClkSXR_MHz;
+}
+
+/** @return Current CLKGEN frequency in MHz
+ Returned frequency depends on reference clock used for Receiver
+*/
+float_type LMS7002M::GetFrequencyCGEN_MHz()
+{
+ float_type dMul = (mRefClkSXR_MHz/2.0)/(Get_SPI_Reg_bits(LMS7param(DIV_OUTCH_CGEN))+1); //DIV_OUTCH_CGEN
+ uint16_t gINT = Get_SPI_Reg_bits(0x0088, 13, 0); //read whole register to reduce SPI transfers
+ uint32_t gFRAC = ((gINT & 0xF) * 65536) | Get_SPI_Reg_bits(0x0087, 15, 0);
+ return dMul * (((gINT>>4) + 1 + gFRAC/1048576.0));
+}
+
+/** @brief Returns TSP reference frequency
+ @param tx TxTSP or RxTSP selection
+ @return TSP reference frequency in MHz
+*/
+float_type LMS7002M::GetReferenceClk_TSP_MHz(bool tx)
+{
+ float_type cgenFreq = GetFrequencyCGEN_MHz();
+ float_type clklfreq = cgenFreq/pow(2.0, Get_SPI_Reg_bits(LMS7param(CLKH_OV_CLKL_CGEN)));
+ if(Get_SPI_Reg_bits(LMS7param(EN_ADCCLKH_CLKGN)) == 0)
+ return tx ? clklfreq : cgenFreq/4.0;
+ else
+ return tx ? cgenFreq : clklfreq/4.0;
+}
+
+/** @brief Sets CLKGEN frequency, calculations use receiver'r reference clock
+ @param freq_MHz desired frequency in MHz
+ @return 0-succes, other-cannot deliver desired frequency
+*/
+liblms7_status LMS7002M::SetFrequencyCGEN(const float_type freq_MHz)
+{
+ float_type dFvco;
+ float_type dFrac;
+ int16_t iHdiv;
+
+ //VCO frequency selection according to F_CLKH
+ iHdiv = (int16_t)((gCGEN_VCO_frequencies[1]/ 2) / freq_MHz) - 1;
+ dFvco = 2*(iHdiv+1) * freq_MHz;
+
+ //Integer division
+ uint16_t gINT = (uint16_t)(dFvco/mRefClkSXR_MHz - 1);
+
+ //Fractional division
+ dFrac = dFvco/mRefClkSXR_MHz - (uint32_t)(dFvco/mRefClkSXR_MHz);
+ uint32_t gFRAC = (uint32_t)(dFrac * 1048576);
+
+ Modify_SPI_Reg_bits(LMS7param(INT_SDM_CGEN), gINT); //INT_SDM_CGEN
+ Modify_SPI_Reg_bits(0x0087, 15, 0, gFRAC&0xFFFF); //INT_SDM_CGEN[15:0]
+ Modify_SPI_Reg_bits(0x0088, 3, 0, gFRAC>>16); //INT_SDM_CGEN[19:16]
+ Modify_SPI_Reg_bits(LMS7param(DIV_OUTCH_CGEN), iHdiv); //DIV_OUTCH_CGEN
+
+ return TuneVCO(VCO_CGEN);
+}
+
+/** @brief Performs VCO tuning operations for CLKGEN, SXR, SXT modules
+ @param module module selection for tuning 0-cgen, 1-SXR, 2-SXT
+ @return 0-success, other-failure
+*/
+liblms7_status LMS7002M::TuneVCO(VCO_Module module) // 0-cgen, 1-SXR, 2-SXT
+{
+ if (controlPort == NULL)
+ return LIBLMS7_NO_CONNECTION_MANAGER;
+ if (controlPort->IsOpen() == false)
+ return LIBLMS7_NOT_CONNECTED;
+ int8_t i;
+ uint8_t cmphl; //comparators
+ int16_t csw_lowest = -1;
+ uint16_t addrVCOpd; // VCO power down address
+ uint16_t addrCSW_VCO;
+ uint16_t addrCMP; //comparator address
+ uint8_t lsb; //SWC lsb index
+ uint8_t msb; //SWC msb index
+
+ uint8_t ch = (uint8_t)Get_SPI_Reg_bits(LMS7param(MAC)); //remember used channel
+
+ if(module != VCO_CGEN) //set addresses to SX module
+ {
+ Modify_SPI_Reg_bits(LMS7param(MAC), module);
+ addrVCOpd = LMS7param(PD_VCO).address;
+ addrCSW_VCO = LMS7param(CSW_VCO).address;
+ lsb = LMS7param(CSW_VCO).lsb;
+ msb = LMS7param(CSW_VCO).msb;
+ addrCMP = LMS7param(VCO_CMPHO).address;
+ }
+ else //set addresses to CGEN module
+ {
+ addrVCOpd = LMS7param(PD_VCO_CGEN).address;
+ addrCSW_VCO = LMS7param(CSW_VCO_CGEN).address;
+ lsb = LMS7param(CSW_VCO_CGEN).lsb;
+ msb = LMS7param(CSW_VCO_CGEN).msb;
+ addrCMP = LMS7param(VCO_CMPHO_CGEN).address;
+ }
+ // Initialization
+ Modify_SPI_Reg_bits (addrVCOpd, 2, 1, 0); //activate VCO and comparator
+ if (Get_SPI_Reg_bits(addrVCOpd, 2, 1) != 0)
+ return LIBLMS7_VCO_IS_POWERED_DOWN;
+ if(module == VCO_CGEN)
+ Modify_SPI_Reg_bits(LMS7param(SPDUP_VCO_CGEN), 1); //SHORT_NOISEFIL=1 SPDUP_VCO_ Short the noise filter resistor to speed up the settling time
+ else
+ Modify_SPI_Reg_bits(LMS7param(SPDUP_VCO), 1); //SHORT_NOISEFIL=1 SPDUP_VCO_ Short the noise filter resistor to speed up the settling time
+ Modify_SPI_Reg_bits (addrCSW_VCO , msb, lsb , 0); //Set SWC_VCO<7:0>=<00000000>
+
+ i=7;
+ while(i>=0)
+ {
+ Modify_SPI_Reg_bits (addrCSW_VCO, lsb + i, lsb + i, 1); // CSW_VCO=1
+ std::this_thread::sleep_for(std::chrono::milliseconds(5));
+ cmphl = (uint8_t)Get_SPI_Reg_bits(addrCMP, 13, 12);
+ if ( (cmphl&0x01) == 1) // reduce CSW
+ Modify_SPI_Reg_bits (addrCSW_VCO, lsb + i, lsb + i, 0); // CSW_VCO=0
+ if( cmphl == 2 && csw_lowest < 0)
+ csw_lowest = Get_SPI_Reg_bits(addrCSW_VCO, msb, lsb);
+ --i;
+ }
+ if(csw_lowest >= 0)
+ {
+ uint16_t csw_highest = Get_SPI_Reg_bits(addrCSW_VCO, msb, lsb);
+ if(csw_lowest == csw_highest)
+ {
+ while(csw_lowest>=0)
+ {
+ Modify_SPI_Reg_bits(addrCSW_VCO, msb, lsb, csw_lowest);
+ std::this_thread::sleep_for(std::chrono::milliseconds(5));
+ if(Get_SPI_Reg_bits(addrCMP, 13, 12) == 0)
+ {
+ ++csw_lowest;
+ break;
+ }
+ else
+ --csw_lowest;
+ }
+ }
+ Modify_SPI_Reg_bits(addrCSW_VCO, msb, lsb, csw_lowest+(csw_highest-csw_lowest)/2);
+ }
+ if (module == VCO_CGEN)
+ Modify_SPI_Reg_bits(LMS7param(SPDUP_VCO_CGEN), 0); //SHORT_NOISEFIL=1 SPDUP_VCO_ Short the noise filter resistor to speed up the settling time
+ else
+ Modify_SPI_Reg_bits(LMS7param(SPDUP_VCO), 0); //SHORT_NOISEFIL=1 SPDUP_VCO_ Short the noise filter resistor to speed up the settling time
+ cmphl = (uint8_t)Get_SPI_Reg_bits(addrCMP, 13, 12);
+ Modify_SPI_Reg_bits(LMS7param(MAC), ch); //restore previously used channel
+ if(cmphl == 2)
+ return LIBLMS7_SUCCESS;
+ else
+ return LIBLMS7_FAILURE;
+}
+
+/** @brief Returns given parameter value from chip register
+ @param param LMS7002M control parameter
+ @param fromChip read directly from chip
+ @return parameter value
+*/
+uint16_t LMS7002M::Get_SPI_Reg_bits(const LMS7Parameter ¶m, bool fromChip)
+{
+ return Get_SPI_Reg_bits(param.address, param.msb, param.lsb, fromChip);
+}
+
+/** @brief Returns given parameter value from chip register
+ @param address register address
+ @param msb most significant bit index
+ @param lsb least significant bit index
+ @param fromChip read directly from chip
+ @return register bits from selected interval, shifted to right by lsb bits
+*/
+uint16_t LMS7002M::Get_SPI_Reg_bits(uint16_t address, uint8_t msb, uint8_t lsb, bool fromChip)
+{
+ return (SPI_read(address, fromChip) & (~(~0<<(msb+1)))) >> lsb; //shift bits to LSB
+}
+
+/** @brief Change given parameter value
+ @param param LMS7002M control parameter
+ @param fromChip read initial value directly from chip
+ @param value new parameter value
+*/
+liblms7_status LMS7002M::Modify_SPI_Reg_bits(const LMS7Parameter ¶m, const uint16_t value, bool fromChip)
+{
+ return Modify_SPI_Reg_bits(param.address, param.msb, param.lsb, value, fromChip);
+}
+
+/** @brief Change given parameter value
+ @param address register address
+ @param value new bits value, the value is shifted left by lsb bits
+ @param fromChip read initial value directly from chip
+*/
+liblms7_status LMS7002M::Modify_SPI_Reg_bits(const uint16_t address, const uint8_t msb, const uint8_t lsb, const uint16_t value, bool fromChip)
+{
+ uint16_t spiDataReg = SPI_read(address, fromChip); //read current SPI reg data
+ uint16_t spiMask = (~(~0 << (msb - lsb + 1))) << (lsb); // creates bit mask
+ spiDataReg = (spiDataReg & (~spiMask)) | ((value << lsb) & spiMask);//clear bits
+ return SPI_write(address, spiDataReg); //write modified data back to SPI reg
+}
+
+/** @brief Modifies given registers with values applied using masks
+ @param addr array of register addresses
+ @param masks array of applied masks
+ @param values array of values to be written
+ @param start starting index of given arrays
+ @param stop end index of given arrays
+*/
+liblms7_status LMS7002M::Modify_SPI_Reg_mask(const uint16_t *addr, const uint16_t *masks, const uint16_t *values, uint8_t start, uint8_t stop)
+{
+ liblms7_status status;
+ uint16_t reg_data;
+ vector addresses;
+ vector data;
+ while (start <= stop)
+ {
+ reg_data = SPI_read(addr[start], true, &status); //read current SPI reg data
+ reg_data &= ~masks[start];//clear bits
+ reg_data |= (values[start] & masks[start]);
+ addresses.push_back(addr[start]);
+ data.push_back(reg_data);
+ ++start;
+ }
+ if (status != LIBLMS7_SUCCESS)
+ return status;
+ SPI_write_batch(&addresses[0], &data[0], addresses.size());
+ return status;
+}
+
+/** @brief Sets SX frequency
+ @param Tx Rx/Tx module selection
+ @param freq_MHz desired frequency in MHz
+ @param refClk_MHz reference clock in MHz
+ @return 0-success, other-cannot deliver requested frequency
+*/
+liblms7_status LMS7002M::SetFrequencySX(bool tx, float_type freq_MHz, float_type refClk_MHz)
+{
+ if (controlPort == NULL)
+ return LIBLMS7_NO_CONNECTION_MANAGER;
+ if (controlPort->IsOpen() == false)
+ return LIBLMS7_NOT_CONNECTED;
+ const uint8_t sxVCO_N = 2; //number of entries in VCO frequencies
+ const float_type m_dThrF = 5500; //threshold to enable additional divider
+ uint8_t ch; //remember used channel
+ float_type VCOfreq;
+ int8_t div_loch;
+ int8_t sel_vco;
+ bool canDeliverFrequency = false;
+ uint16_t integerPart;
+ uint32_t fractionalPart;
+ int8_t i;
+
+ //find required VCO frequency
+ for (div_loch = 6; div_loch >= 0; --div_loch)
+ {
+ VCOfreq = (1 << (div_loch + 1)) * freq_MHz;
+ if ((VCOfreq >= gVCO_frequency_table[0][0]) && (VCOfreq <= gVCO_frequency_table[2][sxVCO_N - 1]))
+ {
+ canDeliverFrequency = true;
+ break;
+ }
+ }
+ if (canDeliverFrequency == false)
+ return LIBLMS7_CANNOT_DELIVER_FREQUENCY;
+
+ integerPart = (uint16_t)(VCOfreq / (refClk_MHz * (1 + (VCOfreq > m_dThrF))) - 4);
+ fractionalPart = (uint32_t)((VCOfreq / (refClk_MHz * (1 + (VCOfreq > m_dThrF))) - (uint32_t)(VCOfreq / (refClk_MHz * (1 + (VCOfreq > m_dThrF))))) * 1048576);
+
+ ch = (uint8_t)Get_SPI_Reg_bits(LMS7param(MAC));
+ Modify_SPI_Reg_bits(LMS7param(MAC), tx + 1);
+ Modify_SPI_Reg_bits(LMS7param(INT_SDM), integerPart); //INT_SDM
+ Modify_SPI_Reg_bits(0x011D, 15, 0, fractionalPart & 0xFFFF); //FRAC_SDM[15:0]
+ Modify_SPI_Reg_bits(0x011E, 3, 0, (fractionalPart >> 16)); //FRAC_SDM[19:16]
+ Modify_SPI_Reg_bits(LMS7param(DIV_LOCH), div_loch); //DIV_LOCH
+ Modify_SPI_Reg_bits(LMS7param(EN_DIV2_DIVPROG), (VCOfreq > m_dThrF)); //EN_DIV2_DIVPROG
+
+ //find which VCO supports required frequency
+ Modify_SPI_Reg_bits(LMS7param(PD_VCO), 0); //
+ Modify_SPI_Reg_bits(LMS7param(PD_VCO_COMP), 0); //
+ int cswBackup = Get_SPI_Reg_bits(LMS7param(CSW_VCO)); //remember to restore previous tune value
+ canDeliverFrequency = false;
+ int tuneScore[] = { -128, -128, -128 }; //best is closest to 0
+ for (sel_vco = 0; sel_vco < 3; ++sel_vco)
+ {
+ Modify_SPI_Reg_bits(LMS7param(SEL_VCO), sel_vco);
+ liblms7_status status = TuneVCO(tx ? VCO_SXT : VCO_SXR);
+ int csw = Get_SPI_Reg_bits(LMS7param(CSW_VCO), true);
+ tuneScore[sel_vco] = -128 + csw;
+ if (status == LIBLMS7_SUCCESS)
+ canDeliverFrequency = true;
+ }
+ if (abs(tuneScore[0]) < abs(tuneScore[1]))
+ {
+ if (abs(tuneScore[0]) < abs(tuneScore[2]))
+ sel_vco = 0;
+ else
+ sel_vco = 2;
+ }
+ else
+ {
+ if (abs(tuneScore[1]) < abs(tuneScore[2]))
+ sel_vco = 1;
+ else
+ sel_vco = 2;
+ }
+ Modify_SPI_Reg_bits(LMS7param(SEL_VCO), sel_vco);
+ Modify_SPI_Reg_bits(LMS7param(CSW_VCO), cswBackup);
+ Modify_SPI_Reg_bits(LMS7param(MAC), ch); //restore used channel
+ if (tx)
+ mRefClkSXT_MHz = refClk_MHz;
+ else
+ mRefClkSXR_MHz = refClk_MHz;
+ if (canDeliverFrequency == false)
+ return LIBLMS7_CANNOT_DELIVER_FREQUENCY;
+ return TuneVCO( tx ? VCO_SXT : VCO_SXR); //Rx-1, Tx-2
+}
+
+/** @brief Returns currently set SXR/SXT frequency
+ @return SX frequency MHz
+*/
+float_type LMS7002M::GetFrequencySX_MHz(bool Tx, float_type refClk_MHz)
+{
+ uint8_t ch = (uint8_t)Get_SPI_Reg_bits(LMS7param(MAC)); //remember previously used channel
+ float_type dMul;
+ if(Tx)
+ Modify_SPI_Reg_bits(LMS7param(MAC), 2); // Rx mac = 1, Tx max = 2
+ else
+ Modify_SPI_Reg_bits(LMS7param(MAC), 1); // Rx mac = 1, Tx max = 2
+ uint16_t gINT = Get_SPI_Reg_bits(0x011E, 13, 0); // read whole register to reduce SPI transfers
+ uint32_t gFRAC = ((gINT&0xF) * 65536) | Get_SPI_Reg_bits(0x011D, 15, 0);
+
+ dMul = (float_type)refClk_MHz / (1 << (Get_SPI_Reg_bits(LMS7param(DIV_LOCH)) + 1));
+ //Calculate real frequency according to the calculated parameters
+ dMul = dMul * ((gINT >> 4) + 4 + (float_type)gFRAC / 1048576.0) * (Get_SPI_Reg_bits(LMS7param(EN_DIV2_DIVPROG)) + 1);
+ Modify_SPI_Reg_bits(LMS7param(MAC), ch); //restore used channel
+ return dMul;
+}
+
+/** @brief Loads given DC_REG values into registers
+ @param tx TxTSP or RxTSP selection
+ @param I DC_REG I value
+ @param Q DC_REG Q value
+*/
+liblms7_status LMS7002M::LoadDC_REG_IQ(bool tx, int16_t I, int16_t Q)
+{
+ if(tx)
+ {
+ Modify_SPI_Reg_bits(LMS7param(DC_REG_TXTSP), I);
+ Modify_SPI_Reg_bits(LMS7param(TSGDCLDI_TXTSP), 0);
+ Modify_SPI_Reg_bits(LMS7param(TSGDCLDI_TXTSP), 1);
+ Modify_SPI_Reg_bits(LMS7param(TSGDCLDI_TXTSP), 0);
+ Modify_SPI_Reg_bits(LMS7param(DC_REG_TXTSP), Q);
+ Modify_SPI_Reg_bits(LMS7param(TSGDCLDQ_TXTSP), 0);
+ Modify_SPI_Reg_bits(LMS7param(TSGDCLDQ_TXTSP), 1);
+ Modify_SPI_Reg_bits(LMS7param(TSGDCLDQ_TXTSP), 0);
+ Modify_SPI_Reg_bits(LMS7param(DC_BYP_TXTSP), 0); //DC_BYP
+ }
+ else
+ {
+ Modify_SPI_Reg_bits(LMS7param(DC_REG_RXTSP), I);
+ Modify_SPI_Reg_bits(LMS7param(TSGDCLDI_RXTSP), 0);
+ Modify_SPI_Reg_bits(LMS7param(TSGDCLDI_RXTSP), 1);
+ Modify_SPI_Reg_bits(LMS7param(TSGDCLDI_RXTSP), 0);
+ Modify_SPI_Reg_bits(LMS7param(DC_REG_TXTSP), Q);
+ Modify_SPI_Reg_bits(LMS7param(TSGDCLDQ_RXTSP), 0);
+ Modify_SPI_Reg_bits(LMS7param(TSGDCLDQ_RXTSP), 1);
+ Modify_SPI_Reg_bits(LMS7param(TSGDCLDQ_RXTSP), 0);
+ Modify_SPI_Reg_bits(LMS7param(DC_BYP_RXTSP), 0); //DC_BYP
+ }
+ return LIBLMS7_SUCCESS;
+}
+
+/** @brief Sets chosen NCO's frequency
+ @param tx transmitter or receiver selection
+ @param index NCO index from 0 to 15
+ @param freq_MHz desired NCO frequency
+ @return 0-success, other-failure
+*/
+liblms7_status LMS7002M::SetNCOFrequency(bool tx, uint8_t index, float_type freq_MHz)
+{
+ if(index > 15)
+ return LIBLMS7_INDEX_OUT_OF_RANGE;
+ float_type refClk_MHz = GetReferenceClk_TSP_MHz(tx);
+ uint16_t addr = tx ? 0x0240 : 0x0440;
+ uint32_t fcw = (uint32_t)((freq_MHz/refClk_MHz)*4294967296);
+ SPI_write(addr+2+index*2, (fcw >> 16)); //NCO frequency control word register MSB part.
+ SPI_write(addr+3+index*2, fcw); //NCO frequency control word register LSB part.
+ return LIBLMS7_SUCCESS;
+}
+
+/** @brief Returns chosen NCO's frequency in MHz
+ @param tx transmitter or receiver selection
+ @param index NCO index from 0 to 15
+ @param fromChip read frequency directly from chip or local registers
+ @return NCO frequency in MHz
+*/
+float_type LMS7002M::GetNCOFrequency_MHz(bool tx, uint8_t index, const float_type refClk_MHz, bool fromChip)
+{
+ if(index > 15)
+ return LIBLMS7_INDEX_OUT_OF_RANGE;
+ uint16_t addr = tx ? 0x0240 : 0x0440;
+ uint32_t fcw = 0;
+ fcw |= SPI_read(addr + 2 + index * 2, fromChip) << 16; //NCO frequency control word register MSB part.
+ fcw |= SPI_read(addr + 3 + index * 2, fromChip); //NCO frequency control word register LSB part.
+ return refClk_MHz*(fcw/4294967296.0);
+}
+
+/** @brief Sets chosen NCO phase offset angle when memory table MODE is 0
+@param tx transmitter or receiver selection
+@param angle_deg phase offset angle in degrees
+@return 0-success, other-failure
+*/
+liblms7_status LMS7002M::SetNCOPhaseOffsetForMode0(bool tx, float_type angle_deg)
+{
+ uint16_t addr = tx ? 0x0241 : 0x0441;
+ uint16_t pho = (uint16_t)(65536 * (angle_deg / 360 ));
+ SPI_write(addr, pho);
+ return LIBLMS7_SUCCESS;
+}
+
+/** @brief Sets chosen NCO's phase offset angle
+ @param tx transmitter or receiver selection
+ @param index PHO index from 0 to 15
+ @param angle_deg phase offset angle in degrees
+ @return 0-success, other-failure
+*/
+liblms7_status LMS7002M::SetNCOPhaseOffset(bool tx, uint8_t index, float_type angle_deg)
+{
+ if(index > 15)
+ return LIBLMS7_INDEX_OUT_OF_RANGE;
+ uint16_t addr = tx ? 0x0244 : 0x0444;
+ uint16_t pho = (uint16_t)(65536*(angle_deg / 360));
+ SPI_write(addr+index, pho);
+ return LIBLMS7_SUCCESS;
+}
+
+/** @brief Returns chosen NCO's phase offset angle in radians
+ @param tx transmitter or receiver selection
+ @param index PHO index from 0 to 15
+ @return phase offset angle in degrees
+*/
+float_type LMS7002M::GetNCOPhaseOffset_Deg(bool tx, uint8_t index)
+{
+ uint16_t addr = tx ? 0x0244 : 0x0444;
+ uint16_t pho = SPI_read(addr+index);
+ float_type angle = 360*pho/65536.0;
+ return angle;
+}
+
+/** @brief Uploads given FIR coefficients to chip
+ @param tx Transmitter or receiver selection
+ @param GFIR_index GIR index from 0 to 2
+ @param coef array of coefficients
+ @param coefCount number of coefficients
+ @return 0-success, other-failure
+
+ This function does not change GFIR*_L or GFIR*_N parameters, they have to be set manually
+*/
+liblms7_status LMS7002M::SetGFIRCoefficients(bool tx, uint8_t GFIR_index, const int16_t *coef, uint8_t coefCount)
+{
+ uint8_t index;
+ uint8_t coefLimit;
+ uint16_t startAddr;
+ if (GFIR_index == 0)
+ startAddr = 0x0280;
+ else if (GFIR_index == 1)
+ startAddr = 0x02C0;
+ else
+ startAddr = 0x0300;
+
+ if (tx == false)
+ startAddr += 0x0200;
+ if (GFIR_index < 2)
+ coefLimit = 40;
+ else
+ coefLimit = 120;
+ if (coefCount > coefLimit)
+ return LIBLMS7_TOO_MANY_VALUES;
+ vector addresses;
+ for (index = 0; index < coefCount; ++index)
+ addresses.push_back(startAddr + index + 24 * (index / 40));
+ SPI_write_batch(&addresses[0], (uint16_t*)coef, coefCount);
+ return LIBLMS7_SUCCESS;
+}
+
+/** @brief Returns currently loaded FIR coefficients
+ @param tx Transmitter or receiver selection
+ @param GFIR_index GIR index from 0 to 2
+ @param coef array of returned coefficients
+ @param coefCount number of coefficients to read
+ @return 0-success, other-failure
+*/
+liblms7_status LMS7002M::GetGFIRCoefficients(bool tx, uint8_t GFIR_index, int16_t *coef, uint8_t coefCount)
+{
+ liblms7_status status = LIBLMS7_FAILURE;
+ uint8_t index;
+ uint8_t coefLimit;
+ uint16_t startAddr;
+ if(GFIR_index == 0)
+ startAddr = 0x0280;
+ else if (GFIR_index == 1)
+ startAddr = 0x02C0;
+ else
+ startAddr = 0x0300;
+
+ if (tx == false)
+ startAddr += 0x0200;
+ if (GFIR_index < 2)
+ coefLimit = 40;
+ else
+ coefLimit = 120;
+ if (coefCount > coefLimit)
+ return LIBLMS7_TOO_MANY_VALUES;
+
+ std::vector addresses;
+ for (index = 0; index < coefCount; ++index)
+ addresses.push_back(startAddr + index + 24 * (index / 40));
+ uint16_t spiData[120];
+ memset(spiData, 0, 120 * sizeof(uint16_t));
+ if (controlPort->IsOpen())
+ {
+ status = SPI_read_batch(&addresses[0], spiData, coefCount);
+ for (index = 0; index < coefCount; ++index)
+ coef[index] = spiData[index];
+ }
+ else
+ {
+ const int channel = Get_SPI_Reg_bits(LMS7param(MAC), false) > 1 ? 1 : 0;
+ for (index = 0; index < coefCount; ++index)
+ coef[index] = mRegistersMap->GetValue(channel, addresses[index]);
+ status = LIBLMS7_SUCCESS;
+ }
+
+ return status;
+}
+
+/** @brief Write given data value to whole register
+ @param address SPI address
+ @param data new register value
+ @return 0-succes, other-failure
+*/
+liblms7_status LMS7002M::SPI_write(uint16_t address, uint16_t data)
+{
+ if (controlPort == NULL)
+ return LIBLMS7_NO_CONNECTION_MANAGER;
+
+ if ((mRegistersMap->GetValue(0, LMS7param(MAC).address) & 0x0003) > 1 && address >= 0x0100)
+ mRegistersMap->SetValue(1, address, data);
+ else
+ mRegistersMap->SetValue(0, address, data);
+
+ if (controlPort->IsOpen() == false)
+ return LIBLMS7_NOT_CONNECTED;
+
+ LMScomms::GenericPacket pkt;
+ pkt.cmd = CMD_LMS7002_WR;
+ pkt.outBuffer.push_back(address >> 8);
+ pkt.outBuffer.push_back(address & 0xFF);
+ pkt.outBuffer.push_back(data >> 8);
+ pkt.outBuffer.push_back(data & 0xFF);
+ controlPort->TransferPacket(pkt);
+ if (pkt.status == STATUS_COMPLETED_CMD)
+ return LIBLMS7_SUCCESS;
+ else
+ return LIBLMS7_FAILURE;
+}
+
+/** @brief Reads whole register value from given address
+ @param address SPI address
+ @param status operation status(optional)
+ @param fromChip read value directly from chip
+ @return register value
+*/
+uint16_t LMS7002M::SPI_read(uint16_t address, bool fromChip, liblms7_status *status)
+{
+ if (controlPort == NULL)
+ {
+ if (status)
+ *status = LIBLMS7_NO_CONNECTION_MANAGER;
+ }
+ if (controlPort->IsOpen() == false || fromChip == false)
+ {
+ if ((mRegistersMap->GetValue(0, LMS7param(MAC).address) & 0x0003) > 1 && address >= 0x0100)
+ return mRegistersMap->GetValue(1, address);
+ else
+ return mRegistersMap->GetValue(0, address);
+ }
+
+ LMScomms::GenericPacket pkt;
+ pkt.cmd = CMD_LMS7002_RD;
+ pkt.outBuffer.push_back(address >> 8);
+ pkt.outBuffer.push_back(address & 0xFF);
+ if (controlPort->TransferPacket(pkt) == LMScomms::TRANSFER_SUCCESS)
+ {
+ if (status)
+ *status = (pkt.status == STATUS_COMPLETED_CMD ? LIBLMS7_SUCCESS : LIBLMS7_FAILURE);
+ return (pkt.inBuffer[2] << 8) | pkt.inBuffer[3];
+ }
+ else
+ return 0;
+}
+
+/** @brief Batches multiple register writes into least ammount of transactions
+ @param spiAddr spi register addresses to be written
+ @param spiData registers data to be written
+ @param cnt number of registers to write
+ @return 0-success, other-failure
+*/
+liblms7_status LMS7002M::SPI_write_batch(const uint16_t* spiAddr, const uint16_t* spiData, uint16_t cnt)
+{
+ LMScomms::GenericPacket pkt;
+ pkt.cmd = CMD_LMS7002_WR;
+ uint32_t index = 0;
+ for (uint32_t i = 0; i < cnt; ++i)
+ {
+ pkt.outBuffer.push_back(spiAddr[i] >> 8);
+ pkt.outBuffer.push_back(spiAddr[i] & 0xFF);
+ pkt.outBuffer.push_back(spiData[i] >> 8);
+ pkt.outBuffer.push_back(spiData[i] & 0xFF);
+
+ if ((mRegistersMap->GetValue(0, LMS7param(MAC).address) & 0x0003) > 1)
+ mRegistersMap->SetValue(1, spiAddr[i], spiData[i]);
+ else
+ mRegistersMap->SetValue(0, spiAddr[i], spiData[i]);
+
+ }
+ if (controlPort == NULL)
+ return LIBLMS7_NO_CONNECTION_MANAGER;
+ if (controlPort->IsOpen() == false)
+ return LIBLMS7_NOT_CONNECTED;
+
+ controlPort->TransferPacket(pkt);
+ if (pkt.status == STATUS_COMPLETED_CMD)
+ return LIBLMS7_SUCCESS;
+ else
+ return LIBLMS7_FAILURE;
+}
+
+/** @brief Batches multiple register reads into least amount of transactions
+ @param spiAddr SPI addresses to read
+ @param spiData array for read data
+ @param cnt number of registers to read
+ @return 0-success, other-failure
+*/
+liblms7_status LMS7002M::SPI_read_batch(const uint16_t* spiAddr, uint16_t* spiData, uint16_t cnt)
+{
+ LMScomms::GenericPacket pkt;
+ pkt.cmd = CMD_LMS7002_RD;
+ uint32_t index = 0;
+ for (uint32_t i = 0; i < cnt; ++i)
+ {
+ pkt.outBuffer.push_back(spiAddr[i] >> 8);
+ pkt.outBuffer.push_back(spiAddr[i] & 0xFF);
+ }
+ if (controlPort == NULL)
+ return LIBLMS7_NO_CONNECTION_MANAGER;
+ if (controlPort->IsOpen() == false)
+ return LIBLMS7_NOT_CONNECTED;
+
+ LMScomms::TransferStatus status = controlPort->TransferPacket(pkt);
+ if (status != LMScomms::TRANSFER_SUCCESS)
+ return LIBLMS7_FAILURE;
+
+ for (uint32_t i = 0; i < cnt; ++i)
+ {
+ spiData[i] = (pkt.inBuffer[2*sizeof(uint16_t)*i + 2] << 8) | pkt.inBuffer[2*sizeof(uint16_t)*i + 3];
+ if ((mRegistersMap->GetValue(0, LMS7param(MAC).address) & 0x0003) > 1)
+ mRegistersMap->SetValue(1, spiAddr[i], spiData[i]);
+ else
+ mRegistersMap->SetValue(0, spiAddr[i], spiData[i]);
+ }
+ return pkt.status == STATUS_COMPLETED_CMD ? LIBLMS7_SUCCESS : LIBLMS7_FAILURE;
+ /*
+ for(int i=0; iGetValue(0, LMS7param(MAC).address) & 0x0003) > 1)
+ mRegistersMap->SetValue(1, spiAddr[i], spiData[i]);
+ else
+ mRegistersMap->SetValue(0, spiAddr[i], spiData[i]);
+ }
+ return LIBLMS7_SUCCESS;*/
+}
+
+/** @brief Performs registers test by writing known data and confirming readback data
+ @return 0-registers test passed, other-failure
+*/
+liblms7_status LMS7002M::RegistersTest()
+{
+ char chex[16];
+ if (controlPort == NULL)
+ return LIBLMS7_NO_CONNECTION_MANAGER;
+ if (controlPort->IsOpen() == false)
+ return LIBLMS7_NOT_CONNECTED;
+
+ liblms7_status status;
+ uint8_t ch = (uint8_t)Get_SPI_Reg_bits(LMS7param(MAC));
+
+ //backup both channel data for restoration after test
+ vector ch1Addresses;
+ for (uint8_t i = 0; i < MEMORY_SECTIONS_COUNT; ++i)
+ for (uint16_t addr = MemorySectionAddresses[i][0]; addr <= MemorySectionAddresses[i][1]; ++addr)
+ ch1Addresses.push_back(addr);
+ vector ch1Data;
+ ch1Data.resize(ch1Addresses.size(), 0);
+
+ //backup A channel
+ Modify_SPI_Reg_bits(LMS7param(MAC), 1);
+ status = SPI_read_batch(&ch1Addresses[0], &ch1Data[0], ch1Addresses.size());
+ if (status != LIBLMS7_SUCCESS)
+ return status;
+
+ vector ch2Addresses;
+ for (uint8_t i = 0; i < MEMORY_SECTIONS_COUNT; ++i)
+ for (uint16_t addr = MemorySectionAddresses[i][0]; addr <= MemorySectionAddresses[i][1]; ++addr)
+ if (addr >= 0x0100)
+ ch2Addresses.push_back(addr);
+ vector ch2Data;
+ ch2Data.resize(ch2Addresses.size(), 0);
+
+ Modify_SPI_Reg_bits(LMS7param(MAC), 2);
+ status = SPI_read_batch(&ch2Addresses[0], &ch2Data[0], ch2Addresses.size());
+ if (status != LIBLMS7_SUCCESS)
+ return status;
+
+ //test registers
+ ResetChip();
+ Modify_SPI_Reg_bits(LMS7param(MIMO_SISO), 0);
+ Modify_SPI_Reg_bits(LMS7param(PD_RX_AFE2), 0);
+ Modify_SPI_Reg_bits(LMS7param(PD_TX_AFE2), 0);
+ Modify_SPI_Reg_bits(LMS7param(MAC), 1);
+
+ stringstream ss;
+
+ //check single channel memory sections
+ vector modulesToCheck = { AFE, BIAS, XBUF, CGEN, LDO, BIST, CDS, TRF, TBB, RFE, RBB, SX,
+ TxTSP, TxNCO, TxGFIR1, TxGFIR2, TxGFIR3a, TxGFIR3b, TxGFIR3c,
+ RxTSP, RxNCO, RxGFIR1, RxGFIR2, RxGFIR3a, RxGFIR3b, RxGFIR3c, LimeLight };
+ const char* moduleNames[] = { "AFE", "BIAS", "XBUF", "CGEN", "LDO", "BIST", "CDS", "TRF", "TBB", "RFE", "RBB", "SX",
+ "TxTSP", "TxNCO", "TxGFIR1", "TxGFIR2", "TxGFIR3a", "TxGFIR3b", "TxGFIR3c",
+ "RxTSP", "RxNCO", "RxGFIR1", "RxGFIR2", "RxGFIR3a", "RxGFIR3b", "RxGFIR3c", "LimeLight" };
+
+ const uint16_t patterns[] = { 0xAAAA, 0x5555 };
+ const uint8_t patternsCount = 2;
+
+ bool allTestSuccess = true;
+
+ for (unsigned i = 0; i < modulesToCheck.size(); ++i)
+ {
+ bool moduleTestsSuccess = true;
+ uint16_t startAddr = MemorySectionAddresses[modulesToCheck[i]][0];
+ uint16_t endAddr = MemorySectionAddresses[modulesToCheck[i]][1];
+ uint8_t channelCount = startAddr >= 0x0100 ? 2 : 1;
+ for (int cc = 1; cc <= channelCount; ++cc)
+ {
+ Modify_SPI_Reg_bits(LMS7param(MAC), cc);
+ sprintf(chex, "0x%04X", startAddr);
+ ss << moduleNames[i] << " [" << chex << ":";
+ sprintf(chex, "0x%04X", endAddr);
+ ss << chex << "]";
+ if (startAddr >= 0x0100)
+ ss << " Ch." << (cc == 1 ? "A" : "B");
+ ss << endl;
+ for (uint8_t p = 0; p < patternsCount; ++p)
+ moduleTestsSuccess &= RegistersTestInterval(startAddr, endAddr, patterns[p], ss) == LIBLMS7_SUCCESS;
+ }
+ allTestSuccess &= moduleTestsSuccess;
+ }
+
+ //restore register values
+ Modify_SPI_Reg_bits(LMS7param(MAC), 1);
+ SPI_write_batch(&ch1Addresses[0], &ch1Data[0], ch1Addresses.size());
+ Modify_SPI_Reg_bits(LMS7param(MAC), 2);
+ SPI_write_batch(&ch2Addresses[0], &ch2Data[0], ch2Addresses.size());
+ Modify_SPI_Reg_bits(LMS7param(MAC), ch);
+
+ fstream fout;
+ fout.open("registersTest.txt", ios::out);
+ fout << ss.str() << endl;
+ fout.close();
+
+ return allTestSuccess ? LIBLMS7_SUCCESS : LIBLMS7_FAILURE;
+}
+
+/** @brief Performs registers test for given address interval by writing given pattern data
+ @param startAddr first register address
+ @param endAddr last reigster address
+ @param pattern data to be written into registers
+ @return 0-register test passed, other-failure
+*/
+liblms7_status LMS7002M::RegistersTestInterval(uint16_t startAddr, uint16_t endAddr, uint16_t pattern, stringstream &ss)
+{
+ vector addrToWrite;
+ vector dataToWrite;
+ vector dataReceived;
+ vector dataMasks;
+
+ for (uint16_t addr = startAddr; addr <= endAddr; ++addr)
+ {
+ addrToWrite.push_back(addr);
+ }
+ dataMasks.resize(addrToWrite.size(), 0xFFFF);
+ for (uint16_t j = 0; j < sizeof(readOnlyRegisters)/sizeof(uint16_t); ++j)
+ for (uint16_t k = 0; k < addrToWrite.size(); ++k)
+ if (readOnlyRegisters[j] == addrToWrite[k])
+ {
+ dataMasks[k] = readOnlyRegistersMasks[j];
+ break;
+ }
+
+ dataToWrite.clear();
+ dataReceived.clear();
+ for (uint16_t j = 0; j < addrToWrite.size(); ++j)
+ {
+ if (addrToWrite[j] == 0x00A6)
+ dataToWrite.push_back(0x1 | pattern & ~0x2);
+ else if (addrToWrite[j] == 0x0084)
+ dataToWrite.push_back(pattern & ~0x19);
+ else
+ dataToWrite.push_back(pattern & dataMasks[j]);
+ }
+ dataReceived.resize(addrToWrite.size(), 0);
+ liblms7_status status;
+ status = SPI_write_batch(&addrToWrite[0], &dataToWrite[0], addrToWrite.size());
+ if (status != LIBLMS7_SUCCESS)
+ return status;
+ status = SPI_read_batch(&addrToWrite[0], &dataReceived[0], addrToWrite.size());
+ if (status != LIBLMS7_SUCCESS)
+ return status;
+ bool registersMatch = true;
+ char ctemp[16];
+ for (uint16_t j = 0; j < dataToWrite.size(); ++j)
+ {
+ if (dataToWrite[j] != (dataReceived[j] & dataMasks[j]))
+ {
+ registersMatch = false;
+ sprintf(ctemp, "0x%04X", addrToWrite[j]);
+ ss << "\t" << ctemp << "(wr/rd): ";
+ sprintf(ctemp, "0x%04X", dataToWrite[j]);
+ ss << ctemp << "/";
+ sprintf(ctemp, "0x%04X", dataReceived[j]);
+ ss << ctemp << endl;
+ }
+ }
+ if (registersMatch)
+ {
+ sprintf(ctemp, "0x%04X", pattern);
+ ss << "\tRegisters OK (" << ctemp << ")\n";
+ }
+ return registersMatch ? LIBLMS7_SUCCESS : LIBLMS7_FAILURE;
+}
+
+/** @brief Parameters setup instructions for Tx calibration
+ @return 0-success, other-failure
+*/
+liblms7_status LMS7002M::CalibrateTxSetup(float_type bandwidth_MHz)
+{
+ //Stage 2
+ uint8_t ch = (uint8_t)Get_SPI_Reg_bits(LMS7param(MAC));
+ uint8_t sel_band1_trf = (uint8_t)Get_SPI_Reg_bits(LMS7param(SEL_BAND1_TRF));
+ uint8_t sel_band2_trf = (uint8_t)Get_SPI_Reg_bits(LMS7param(SEL_BAND2_TRF));
+
+ //rfe
+ //reset RFE to defaults
+ SetDefaults(RFE);
+ if (sel_band1_trf == 1)
+ Modify_SPI_Reg_bits(LMS7param(SEL_PATH_RFE), 3); //SEL_PATH_RFE 3
+ else if (sel_band2_trf == 1)
+ Modify_SPI_Reg_bits(LMS7param(SEL_PATH_RFE), 2);
+ else
+ return LIBLMS7_BAND_NOT_SELECTED;
+
+ if (ch == 2)
+ Modify_SPI_Reg_bits(LMS7param(EN_NEXTRX_RFE), 1); // EN_NEXTTX_RFE 1
+
+ Modify_SPI_Reg_bits(LMS7param(G_RXLOOPB_RFE), 8); //G_RXLOOPB_RFE 8
+ Modify_SPI_Reg_bits(0x010C, 4, 3, 0); //PD_MXLOBUF_RFE 0, PD_QGEN_RFE 0
+ Modify_SPI_Reg_bits(LMS7param(CCOMP_TIA_RFE), 10); //CCOMP_TIA_RFE 10
+ Modify_SPI_Reg_bits(LMS7param(CFB_TIA_RFE), 2600); //CFB_TIA_RFE 2600
+ Modify_SPI_Reg_bits(LMS7param(ICT_LODC_RFE), 31); //ICT_LODC_RFE 31
+ Modify_SPI_Reg_bits(LMS7param(PD_LNA_RFE), 1);
+
+ //RBB
+ //reset RBB to defaults
+ SetDefaults(RBB);
+ Modify_SPI_Reg_bits(LMS7param(PD_LPFL_RBB), 0); //PD_LPFL_RBB 0
+ Modify_SPI_Reg_bits(LMS7param(RCC_CTL_LPFL_RBB), 0); //RCC_CTL_LPFL_RBB 0
+ Modify_SPI_Reg_bits(LMS7param(C_CTL_LPFL_RBB), 1500); //C_CTL_LPFL_RBB 1500
+ Modify_SPI_Reg_bits(LMS7param(G_PGA_RBB), 22); //G_PGA_RBB 22
+
+ //TRF
+ //reset TRF to defaults
+ //SetDefaults(TRF);
+ Modify_SPI_Reg_bits(LMS7param(L_LOOPB_TXPAD_TRF), 0); //L_LOOPB_TXPAD_TRF 0
+ Modify_SPI_Reg_bits(LMS7param(EN_LOOPB_TXPAD_TRF), 1); //EN_LOOPB_TXPAD_TRF 1
+ Modify_SPI_Reg_bits(LMS7param(EN_G_TRF), 0); //EN_G_TRF 0
+ if (ch == 2)
+ Modify_SPI_Reg_bits(LMS7param(EN_NEXTTX_TRF), 1); //EN_NEXTTX_TRF 1
+ Modify_SPI_Reg_bits(LMS7param(LOSS_LIN_TXPAD_TRF), 0); //LOSS_LIN_TXPAD_TRF 5
+ Modify_SPI_Reg_bits(LMS7param(LOSS_MAIN_TXPAD_TRF), 0); //LOSS_MAIN_TXPAD_TRF 5
+
+ //TBB
+ //reset TBB to defaults
+ /*SetDefaults(TBB);
+ Modify_SPI_Reg_bits(LMS7param(CG_IAMP_TBB), 9); //CG_IAMP_TBB 9
+ Modify_SPI_Reg_bits(LMS7param(ICT_IAMP_FRP_TBB), 1); //ICT_IAMP_FRP_TBB 1
+ Modify_SPI_Reg_bits(LMS7param(ICT_IAMP_GG_FRP_TBB), 6); //ICT_IAMP_GG_FRP_TBB 6
+ Modify_SPI_Reg_bits(LMS7param(RCAL_LPFH_TBB), 125); //RCAL_LPFH_TBB 0
+ */
+ //AFE
+ //reset AFE to defaults
+ uint8_t isel_dac_afe =(uint8_t) Get_SPI_Reg_bits(LMS7param(ISEL_DAC_AFE));
+ SetDefaults(AFE);
+ Modify_SPI_Reg_bits(LMS7param(PD_RX_AFE2), 0); //PD_RX_AFE2 0
+ Modify_SPI_Reg_bits(LMS7param(ISEL_DAC_AFE), isel_dac_afe);
+
+ if (ch == 2)
+ Modify_SPI_Reg_bits(LMS7param(PD_TX_AFE2), 0);
+ //BIAS
+ uint16_t backup = Get_SPI_Reg_bits(LMS7param(RP_CALIB_BIAS));
+ SetDefaults(BIAS);
+ Modify_SPI_Reg_bits(LMS7param(RP_CALIB_BIAS), backup); //RP_CALIB_BIAS
+
+ //XBUF
+ Modify_SPI_Reg_bits(0x0085, 2, 0, 1); //PD_XBUF_RX 0, PD_XBUF_TX 0, EN_G_XBUF 1
+
+ //CGEN
+ //reset CGEN to defaults
+ SetDefaults(CGEN);
+ //power up VCO
+ Modify_SPI_Reg_bits(LMS7param(PD_VCO_CGEN), 0);
+
+ if (SetFrequencyCGEN(122.88) != LIBLMS7_SUCCESS)
+ return LIBLMS7_FAILURE;
+ if (TuneVCO(VCO_CGEN) != LIBLMS7_SUCCESS)
+ return LIBLMS7_FAILURE;
+
+ //SXR
+ Modify_SPI_Reg_bits(LMS7param(MAC), 1);
+ SetDefaults(SX);
+ float_type SXTfreqMHz = GetFrequencySX_MHz(Tx, mRefClkSXT_MHz);
+
+ float_type SXRfreqMHz = SXTfreqMHz - bandwidth_MHz / 4 - 1;
+ if (SetFrequencySX(Rx, SXRfreqMHz, mRefClkSXR_MHz) != LIBLMS7_SUCCESS)
+ return LIBLMS7_FAILURE;
+ if (TuneVCO(VCO_SXR) != LIBLMS7_SUCCESS)
+ return LIBLMS7_FAILURE;
+
+ //SXT
+ Modify_SPI_Reg_bits(LMS7param(MAC), 2);
+ Modify_SPI_Reg_bits(LMS7param(PD_LOCH_T2RBUF), 1); //PD_LOCH_T2RBUF 1
+ if (SetFrequencySX(Tx, SXTfreqMHz, mRefClkSXT_MHz) != LIBLMS7_SUCCESS)
+ return LIBLMS7_FAILURE;
+ if (TuneVCO(VCO_SXT) != LIBLMS7_SUCCESS)
+ return LIBLMS7_FAILURE;
+ Modify_SPI_Reg_bits(LMS7param(MAC), ch);
+
+ //TXTSP
+ SetDefaults(TxTSP);
+ Modify_SPI_Reg_bits(0x0200, 3, 2, 0x3); //TSGMODE 1, INSEL 1
+ Modify_SPI_Reg_bits(0x0208, 6, 4, 0x7); //GFIR3_BYP 1, GFIR2_BYP 1, GFIR1_BYP 1
+ LoadDC_REG_IQ(Tx, (int16_t)0x7FFF, (int16_t)0x8000);
+ Modify_SPI_Reg_bits(LMS7param(MAC), ch);
+ Modify_SPI_Reg_bits(0x0440, 4, 0, 0); //TX SEL[3:0] = 0 & MODE = 0
+
+ float_type offset = 0.2;
+ if (bandwidth_MHz == 8)
+ {
+ //SXR
+ Modify_SPI_Reg_bits(LMS7param(MAC), 1);
+ SetDefaults(SX);
+ float_type SXTfreqMHz = GetFrequencySX_MHz(Tx, mRefClkSXT_MHz);
+
+ float_type sxrFreq = SXTfreqMHz - bandwidth_MHz / 4 - 1 - offset;
+ if (SetFrequencySX(Rx, sxrFreq, mRefClkSXR_MHz) != LIBLMS7_SUCCESS)
+ return LIBLMS7_FAILURE;
+ SetNCOFrequency(Tx, 0, bandwidth_MHz / 4 + offset);
+ }
+ else
+ SetNCOFrequency(Tx, 0, bandwidth_MHz / 4);
+
+ //RXTSP
+ SetDefaults(RxTSP);
+ Modify_SPI_Reg_bits(LMS7param(AGC_MODE_RXTSP), 1); //AGC_MODE 1
+ Modify_SPI_Reg_bits(0x040C, 7, 0, 0xBF);
+ Modify_SPI_Reg_bits(LMS7param(CAPSEL), 0);
+ Modify_SPI_Reg_bits(LMS7param(HBD_OVR_RXTSP), 0); //Decimation HBD ratio
+ Modify_SPI_Reg_bits(LMS7param(AGC_AVG_RXTSP), 0x7); //agc_avg iq corr
+
+ return LIBLMS7_SUCCESS;
+}
+
+/** @brief Flips the CAPTURE bit and returns digital RSSI value
+*/
+uint32_t LMS7002M::GetRSSI()
+{
+ Modify_SPI_Reg_bits(LMS7param(CAPTURE), 0);
+ Modify_SPI_Reg_bits(LMS7param(CAPTURE), 1);
+ return (Get_SPI_Reg_bits(0x040F, 15, 0) << 2) | Get_SPI_Reg_bits(0x040E, 1, 0);
+}
+
+/** @brief Sets Rx Dc offsets by converting two's complementary numbers to sign and magnitude
+*/
+void LMS7002M::SetRxDCOFF(int8_t offsetI, int8_t offsetQ)
+{
+ uint16_t valToSend = 0;
+ if (offsetI < 0)
+ valToSend |= 0x40;
+ valToSend |= labs(offsetI);
+ valToSend = valToSend << 7;
+ if (offsetQ < 0)
+ valToSend |= 0x40;
+ valToSend |= labs(offsetQ);
+ SPI_write(0x010E, valToSend);
+}
+
+/** @brief Calibrates Transmitter. DC correction, IQ gains, IQ phase correction
+ @return 0-success, other-failure
+*/
+liblms7_status LMS7002M::CalibrateTx(float_type bandwidth_MHz)
+{
+ liblms7_status status;
+ Log("Tx calibration started", LOG_INFO);
+ BackupAllRegisters();
+
+ int16_t iqcorr = 0;
+ uint16_t gcorrq = 0;
+ uint16_t gcorri = 0;
+ uint16_t dccorri;
+ uint16_t dccorrq;
+ int16_t corrI = 0;
+ int16_t corrQ = 0;
+ uint32_t minRSSI_i;
+ uint32_t minRSSI_q;
+ uint32_t minRSSI_iq;
+ int16_t i;
+ int16_t offsetI = 0;
+ int16_t offsetQ = 0;
+
+ const short firCoefs[] =
+ {
+ -2531,
+ -517,
+ 2708,
+ 188,
+ -3059,
+ 216,
+ 3569,
+ -770,
+ -4199,
+ 1541,
+ 4886,
+ -2577,
+ -5552,
+ 3909,
+ 6108,
+ -5537,
+ -6457,
+ 7440,
+ 6507,
+ -9566,
+ -6174,
+ 11845,
+ 5391,
+ -14179,
+ -4110,
+ 16457,
+ 2310,
+ -18561,
+ 0,
+ 20369,
+ -2780,
+ -21752,
+ 5963,
+ 22610,
+ -9456,
+ -22859,
+ 13127,
+ 22444,
+ -16854,
+ -21319,
+ 20489,
+ 19492,
+ -23883,
+ -17002,
+ 26881,
+ 13902,
+ -29372,
+ -10313,
+ 31226,
+ 6345,
+ -32380,
+ -2141,
+ 32767,
+ -2141,
+ -32380,
+ 6345,
+ 31226,
+ -10313,
+ -29372,
+ 13902,
+ 26881,
+ -17002,
+ -23883,
+ 19492,
+ 20489,
+ -21319,
+ -16854,
+ 22444,
+ 13127,
+ -22859,
+ -9456,
+ 22610,
+ 5963,
+ -21752,
+ -2780,
+ 20369,
+ 0,
+ -18561,
+ 2310,
+ 16457,
+ -4110,
+ -14179,
+ 5391,
+ 11845,
+ -6174,
+ -9566,
+ 6507,
+ 7440,
+ -6457,
+ -5537,
+ 6108,
+ 3909,
+ -5552,
+ -2577,
+ 4886,
+ 1541,
+ -4199,
+ -770,
+ 3569,
+ 216,
+ -3059,
+ 188,
+ 2708,
+ -517,
+ -2531
+ };
+
+ uint8_t ch = (uint8_t)Get_SPI_Reg_bits(LMS7param(MAC));
+ //Stage 1
+ uint8_t sel_band1_trf = (uint8_t)Get_SPI_Reg_bits(LMS7param(SEL_BAND1_TRF));
+ uint8_t sel_band2_trf = (uint8_t)Get_SPI_Reg_bits(LMS7param(SEL_BAND2_TRF));
+ Log("Setup stage", LOG_INFO);
+ status = CalibrateTxSetup(bandwidth_MHz);
+ if (status != LIBLMS7_SUCCESS)
+ goto TxCalibrationEnd; //go to ending stage to restore registers
+
+ //Stage 3
+ //Calibrate Rx DC
+ Log("Rx DC calibration", LOG_INFO);
+ {
+ uint16_t requiredRegs[] = { 0x0400, 0x040A, 0x010D, 0x040C };
+ uint16_t requiredMask[] = { 0x6000, 0x3007, 0x0040, 0x00FF }; //CAPSEL, AGC_MODE, AGC_AVG, EN_DCOFF, Bypasses
+ uint16_t requiredValue[] = { 0x0000, 0x1007, 0x0040, 0x00BD };
+
+ Modify_SPI_Reg_mask(requiredRegs, requiredMask, requiredValue, 0, 3);
+ }
+
+ for (i = 0; i<6; ++i)
+ {
+ FindMinRSSI(LMS7param(DCOFFI_RFE), offsetI, &offsetI, 3, 2, 32 >> i);
+ FindMinRSSI(LMS7param(DCOFFQ_RFE), offsetQ, &offsetQ, 3, 2, 32 >> i);
+ }
+ SetRxDCOFF((int8_t)offsetI, (int8_t)offsetQ);
+ Modify_SPI_Reg_bits(LMS7param(DC_BYP_RXTSP), 0); // DC_BYP 0
+
+ sel_band1_trf = (uint8_t)Get_SPI_Reg_bits(LMS7param(SEL_BAND1_TRF));
+ sel_band2_trf = (uint8_t)Get_SPI_Reg_bits(LMS7param(SEL_BAND2_TRF));
+ //B
+ Modify_SPI_Reg_bits(0x0100, 0, 0, 1); //EN_G_TRF 1
+ if (sel_band1_trf == 1)
+ {
+ Modify_SPI_Reg_bits(LMS7param(PD_RLOOPB_1_RFE), 0); //PD_RLOOPB_1_RFE 0
+ Modify_SPI_Reg_bits(LMS7param(EN_INSHSW_LB1_RFE), 0); //EN_INSHSW_LB1 0
+ }
+ if (sel_band2_trf == 1)
+ {
+ Modify_SPI_Reg_bits(LMS7param(PD_RLOOPB_2_RFE), 0); //PD_RLOOPB_2_RFE 0
+ Modify_SPI_Reg_bits(LMS7param(EN_INSHSW_LB2_RFE), 0); // EN_INSHSW_LB2 0
+ }
+ FixRXSaturation();
+
+ Modify_SPI_Reg_bits(LMS7param(GFIR3_BYP_RXTSP), 0); //GFIR3_BYP 0
+ Modify_SPI_Reg_bits(LMS7param(HBD_OVR_RXTSP), 2);
+ Modify_SPI_Reg_bits(LMS7param(GFIR3_L_RXTSP), 7);
+ Modify_SPI_Reg_bits(LMS7param(GFIR3_N_RXTSP), 7);
+
+ SetGFIRCoefficients(Rx, 2, firCoefs, sizeof(firCoefs) / sizeof(int16_t));
+
+ Log("IQ correction stage", LOG_INFO);
+ Modify_SPI_Reg_bits(LMS7param(GCORRI_TXTSP), 2047);
+ Modify_SPI_Reg_bits(LMS7param(GCORRQ_TXTSP), 2047);
+
+ Modify_SPI_Reg_bits(LMS7param(IQCORR_TXTSP), 0);
+
+ Log("I gain", LOG_INFO);
+ minRSSI_i = FindMinRSSI_Gain(LMS7param(GCORRI_TXTSP), &gcorri);
+
+ Modify_SPI_Reg_bits(LMS7param(GCORRI_TXTSP), 2047);
+ Modify_SPI_Reg_bits(LMS7param(GCORRQ_TXTSP), 2047);
+
+ Log("Q gain", LOG_INFO);
+ minRSSI_q = FindMinRSSI_Gain(LMS7param(GCORRQ_TXTSP), &gcorrq);
+
+ if (minRSSI_i < minRSSI_q)
+ gcorrq = 2047;
+ else
+ gcorri = 2047;
+
+ Modify_SPI_Reg_bits(LMS7param(GCORRI_TXTSP), gcorri);
+ Modify_SPI_Reg_bits(LMS7param(GCORRQ_TXTSP), gcorrq);
+
+ Log("Phase", LOG_INFO);
+ iqcorr = 0;
+ for (uint8_t i = 0; i<9; ++i)
+ minRSSI_iq = FindMinRSSI(LMS7param(IQCORR_TXTSP), iqcorr, &iqcorr, 3, 1, 256 >> i);
+
+ Modify_SPI_Reg_bits(LMS7param(GCORRI_TXTSP), gcorri);
+ Modify_SPI_Reg_bits(LMS7param(GCORRQ_TXTSP), gcorrq);
+ Modify_SPI_Reg_bits(LMS7param(IQCORR_TXTSP), iqcorr);
+
+ Modify_SPI_Reg_bits(LMS7param(MAC), 1);
+ status = SetFrequencySX(Rx, GetFrequencySX_MHz(Tx, mRefClkSXT_MHz)-1, mRefClkSXR_MHz);
+ if (status != LIBLMS7_SUCCESS)
+ goto TxCalibrationEnd; //go to ending stage to restore registers
+
+ //C
+ Modify_SPI_Reg_bits(LMS7param(MAC), ch);
+ Modify_SPI_Reg_bits(LMS7param(AGC_MODE_RXTSP), 1);
+ Modify_SPI_Reg_bits(LMS7param(CAPSEL), 0);
+
+ Log("TX LO calibration", LOG_INFO);
+
+ //Calibrate Tx DC
+ for (uint8_t i = 0; i<7; ++i)
+ {
+ FindMinRSSI(LMS7param(DCCORRI_TXTSP), corrI, &corrI, 3, 1, 64 >> i);
+ FindMinRSSI(LMS7param(DCCORRQ_TXTSP), corrQ, &corrQ, 3, 1, 64 >> i);
+ }
+
+ dccorri = Get_SPI_Reg_bits(LMS7param(DCCORRI_TXTSP));
+ dccorrq = Get_SPI_Reg_bits(LMS7param(DCCORRQ_TXTSP));
+
+ // Stage 4
+TxCalibrationEnd:
+ Log("Restoring registers state", LOG_INFO);
+ Modify_SPI_Reg_bits(LMS7param(MAC), ch);
+ RestoreAllRegisters();
+ if (status != LIBLMS7_SUCCESS)
+ {
+ Log("Tx calibration failed", LOG_WARNING);
+ return status;
+ }
+
+ Modify_SPI_Reg_bits(LMS7param(MAC), ch);
+ Modify_SPI_Reg_bits(LMS7param(DCCORRI_TXTSP), dccorri);
+ Modify_SPI_Reg_bits(LMS7param(DCCORRQ_TXTSP), dccorrq);
+ Modify_SPI_Reg_bits(LMS7param(GCORRI_TXTSP), gcorri);
+ Modify_SPI_Reg_bits(LMS7param(GCORRQ_TXTSP), gcorrq);
+ Modify_SPI_Reg_bits(LMS7param(IQCORR_TXTSP), iqcorr);
+
+ Modify_SPI_Reg_bits(LMS7param(DC_BYP_TXTSP), 0); //DC_BYP
+ Modify_SPI_Reg_bits(0x0208, 1, 0, 0); //GC_BYP PH_BYP
+ Log("Tx calibration finished", LOG_INFO);
+ return LIBLMS7_SUCCESS;
+}
+
+/** @brief Performs Rx DC offsets calibration
+*/
+void LMS7002M::CalibrateRxDC_RSSI()
+{
+ int16_t i;
+ int16_t offsetI = 0;
+ int16_t offsetQ = 0;
+ uint16_t requiredRegs[] = { 0x0400, 0x040A, 0x010D, 0x040C };
+ uint16_t requiredMask[] = { 0x6000, 0x3007, 0x0040, 0x00FF }; //CAPSEL, AGC_MODE, AGC_AVG, EN_DCOFF, Bypasses
+ uint16_t requiredValue[] = { 0x0000, 0x1007, 0x0040, 0x00BD };
+
+ Modify_SPI_Reg_mask(requiredRegs, requiredMask, requiredValue, 0, 3);
+ for (i = 0; i<6; ++i)
+ {
+ FindMinRSSI(LMS7param(DCOFFI_RFE), offsetI, &offsetI, 3, 2, 32 >> i);
+ FindMinRSSI(LMS7param(DCOFFQ_RFE), offsetQ, &offsetQ, 3, 2, 32 >> i);
+ }
+ Modify_SPI_Reg_bits(LMS7param(EN_DCOFF_RXFE_RFE), 1);
+ SetRxDCOFF((int8_t)offsetI, (int8_t)offsetQ);
+ Modify_SPI_Reg_bits(LMS7param(DC_BYP_RXTSP), 0); // DC_BYP 0
+}
+
+/** @brief Tries to detect and fix gains if Rx is saturated
+ @return 0-success, other-failure
+*/
+liblms7_status LMS7002M::FixRXSaturation()
+{
+ uint8_t g_rxloopb = 0;
+ Modify_SPI_Reg_bits(LMS7param(G_RXLOOPB_RFE), g_rxloopb);
+ Modify_SPI_Reg_bits(LMS7param(L_LOOPB_TXPAD_TRF), 3);
+
+ int8_t lLoopb = 3;
+ const uint32_t rssi_saturation_level = 0xD000;
+ while (g_rxloopb < 15)
+ {
+ g_rxloopb += 1;
+ Modify_SPI_Reg_bits(LMS7param(G_RXLOOPB_RFE), g_rxloopb);
+ Modify_SPI_Reg_bits(LMS7param(L_LOOPB_TXPAD_TRF), 3);
+ if (GetRSSI() < rssi_saturation_level)
+ {
+ for (lLoopb = 3; lLoopb >= 0; --lLoopb)
+ {
+ Modify_SPI_Reg_bits(LMS7param(L_LOOPB_TXPAD_TRF), lLoopb);
+ if (GetRSSI() > rssi_saturation_level)
+ {
+ ++lLoopb;
+ Modify_SPI_Reg_bits(LMS7param(L_LOOPB_TXPAD_TRF), lLoopb);
+ goto finished;
+ }
+ }
+ }
+ else
+ {
+ g_rxloopb -= 1;
+ Modify_SPI_Reg_bits(LMS7param(G_RXLOOPB_RFE), g_rxloopb);
+ break;
+ }
+ }
+finished:
+ return GetRSSI() < rssi_saturation_level ? LIBLMS7_SUCCESS : LIBLMS7_FAILURE;
+}
+
+uint32_t LMS7002M::FindMinRSSI(const LMS7Parameter ¶m, const int16_t startValue, int16_t *result, const uint8_t scanWidth, const uint8_t twoCompl, int8_t stepMult)
+{
+ return FindMinRSSI(param.address, param.msb, param.lsb, startValue, result, scanWidth, twoCompl, stepMult);
+}
+
+/** @brief Searches for minimal RSSI value while changing given address bits
+@param addr address of parameter being changed
+@param msb most significant bit index
+@param lsb least significant bit index
+@param startValue initial value where to start search
+@param result found minimal parameter value will be set here
+@param twoCompl varying parameter value is treated as two's complement
+@return found minimal RSSI value
+*/
+uint32_t LMS7002M::FindMinRSSI(const uint16_t addr, const uint8_t msb, const uint8_t lsb, const int16_t startValue, int16_t *result, const uint8_t scanWidth, const uint8_t twoCompl, int8_t stepMult)
+{
+ if (scanWidth < 1)
+ return ~0;
+ int minI;
+ int min = startValue;
+ int globMin = 0;
+ uint32_t minRSSI = ~0;
+ unsigned int *rssiField = new unsigned int[scanWidth];
+ int minRSSIindex;
+ int i;
+ int maxVal;
+ int minVal = 0;
+ if (twoCompl)
+ {
+ maxVal = (~(~0x0 << (msb - lsb + 1))) / 2;
+ minVal = -(~(~0x0 << (msb - lsb + 1))) / 2 - 1;
+ }
+ else
+ maxVal = (~(~0x0 << (msb - lsb + 1)));
+
+ Modify_SPI_Reg_bits(addr, msb, lsb, startValue);
+
+ Modify_SPI_Reg_bits(LMS7param(AGC_MODE_RXTSP), 1);
+ Modify_SPI_Reg_bits(LMS7param(CAPSEL), 0);
+
+ minRSSIindex = 0;
+ for (i = 0; i maxVal)
+ currentValue = maxVal;
+ if (twoCompl == 2)
+ {
+ uint16_t valToSend = 0;
+ if (currentValue < 0)
+ valToSend |= 0x40;
+ valToSend |= labs(currentValue);
+ Modify_SPI_Reg_bits(addr, msb, lsb, valToSend);
+ }
+ else
+ Modify_SPI_Reg_bits(addr, msb, lsb, currentValue);
+
+ rssiField[i] = GetRSSI();
+ }
+ minI = min;
+ minRSSIindex = 0;
+ for (i = 0; i maxVal)
+ minI = maxVal;
+ else if (minI < minVal)
+ minI = minVal;
+ globMin = minI;
+ }
+ min = minI;
+
+ Modify_SPI_Reg_bits(addr, msb, lsb, min);
+
+ *result = min;
+ return minRSSI;
+}
+
+/** @brief Sets given module registers to default values
+ @return 0-success, other-failure
+*/
+liblms7_status LMS7002M::SetDefaults(MemorySection module)
+{
+ liblms7_status status = LIBLMS7_SUCCESS;
+ vector addrs;
+ vector values;
+ for(uint32_t address = MemorySectionAddresses[module][0]; address <= MemorySectionAddresses[module][1]; ++address)
+ {
+ addrs.push_back(address);
+ values.push_back(mRegistersMap->GetDefaultValue(address));
+ }
+ status = SPI_write_batch(&addrs[0], &values[0], addrs.size());
+ return status;
+}
+
+/** @brief Parameters setup instructions for Rx calibration
+ @param bandwidth_MHz filter bandwidth in MHz
+ @return 0-success, other-failure
+*/
+liblms7_status LMS7002M::CalibrateRxSetup(float_type bandwidth_MHz)
+{
+ uint8_t ch = (uint8_t)Get_SPI_Reg_bits(LMS7param(MAC));
+
+ //rfe
+ if (ch == 2)
+ Modify_SPI_Reg_bits(LMS7param(EN_NEXTTX_TRF), 1); // EN_NEXTTX_TRF 0
+
+ Modify_SPI_Reg_bits(LMS7param(G_RXLOOPB_RFE), 15); //G_RXLOOPB_RFE 15
+ Modify_SPI_Reg_bits(0x010C, 4, 3, 0); //PD_MXLOBUF_RFE 0, PD_QGEN_RFE 0
+ Modify_SPI_Reg_bits(0x010C, 1, 1, 0); //PD_TIA 0
+ Modify_SPI_Reg_bits(0x010C, 7, 7, 1); //PD_LNA 1
+
+ Modify_SPI_Reg_bits(0x0110, 4, 0, 31); //ICT_LO_RFE 31
+ Modify_SPI_Reg_bits(0x010D, 4, 1, 0xFF); // all short switches are enabled
+
+ //RBB
+ Modify_SPI_Reg_bits(0x0115, 15, 14, 0); //Loopback switches disable
+ Modify_SPI_Reg_bits(0x0119, 15, 15, 0); //OSW_PGA 0
+
+ //TRF
+ //reset TRF to defaults
+ SetDefaults(TRF);
+ Modify_SPI_Reg_bits(LMS7param(L_LOOPB_TXPAD_TRF), 0); //L_LOOPB_TXPAD_TRF 0
+ Modify_SPI_Reg_bits(LMS7param(EN_LOOPB_TXPAD_TRF), 1); //EN_LOOPB_TXPAD_TRF 1
+ Modify_SPI_Reg_bits(LMS7param(EN_G_TRF), 0); //EN_G_TRF 0
+ if (ch == 2)
+ Modify_SPI_Reg_bits(LMS7param(EN_NEXTTX_TRF), 1); //EN_NEXTTX_TRF 1
+ Modify_SPI_Reg_bits(LMS7param(LOSS_LIN_TXPAD_TRF), 0); //LOSS_LIN_TXPAD_TRF 5
+ Modify_SPI_Reg_bits(LMS7param(LOSS_MAIN_TXPAD_TRF), 0); //LOSS_MAIN_TXPAD_TRF 5
+
+ //TBB
+ //reset TBB to defaults
+ SetDefaults(TBB);
+ Modify_SPI_Reg_bits(LMS7param(CG_IAMP_TBB), 9); //CG_IAMP_TBB 9
+ Modify_SPI_Reg_bits(LMS7param(ICT_IAMP_FRP_TBB), 1); //ICT_IAMP_FRP_TBB 1
+ Modify_SPI_Reg_bits(LMS7param(ICT_IAMP_GG_FRP_TBB), 6); //ICT_IAMP_GG_FRP_TBB 6
+
+ //AFE
+ //reset AFE to defaults
+ SetDefaults(AFE);
+ Modify_SPI_Reg_bits(LMS7param(PD_RX_AFE2), 0); //PD_RX_AFE2
+ if (ch == 2)
+ {
+ Modify_SPI_Reg_bits(LMS7param(PD_TX_AFE2), 0); //PD_TX_AFE2
+ }
+ //BIAS
+ uint16_t backup = Get_SPI_Reg_bits(0x0084, 10, 6);
+ SetDefaults(BIAS);
+ Modify_SPI_Reg_bits(0x0084, 10, 6, backup); //RP_CALIB_BIAS
+
+ //XBUF
+ Modify_SPI_Reg_bits(0x0085, 2, 0, 1); //PD_XBUF_RX 0, PD_XBUF_TX 0, EN_G_XBUF 1
+
+ //CGEN
+ //reset CGEN to defaults
+ SetDefaults(CGEN);
+ //power up VCO
+ Modify_SPI_Reg_bits(0x0086, 2, 2, 0);
+
+ liblms7_status status = SetFrequencyCGEN(122.88);
+ if (status != LIBLMS7_SUCCESS)
+ return status;
+
+ // //SXR
+ Modify_SPI_Reg_bits(LMS7param(MAC), 1);
+ float_type SXRfreqMHz = GetFrequencySX_MHz(Rx, mRefClkSXR_MHz);
+
+ //SXT
+ Modify_SPI_Reg_bits(LMS7param(MAC), 2);
+ Modify_SPI_Reg_bits(LMS7param(PD_LOCH_T2RBUF), 1); //PD_LOCH_t2RBUF 1
+ status = SetFrequencySX(Tx, SXRfreqMHz + bandwidth_MHz / 4, mRefClkSXT_MHz);
+ if ( status != LIBLMS7_SUCCESS)
+ return status;
+ Modify_SPI_Reg_bits(LMS7param(MAC), ch);
+
+ //TXTSP
+ SetDefaults(TxTSP);
+ Modify_SPI_Reg_bits(0x0200, 3, 2, 0x3); //TSGMODE 1, INSEL 1
+ //Modify_SPI_Reg_bits(0x0208, 6, 4, 0xFFFF); //GFIR3_BYP 1, GFIR2_BYP 1, GFIR1_BYP 1
+ Modify_SPI_Reg_bits(0x0208, 6, 6, 1); //GFIR3_BYP 1, GFIR2_BYP 1, GFIR1_BYP 1
+ Modify_SPI_Reg_bits(0x0208, 5, 5, 1); //GFIR3_BYP 1, GFIR2_BYP 1, GFIR1_BYP 1
+ Modify_SPI_Reg_bits(0x0208, 4, 4, 1); //GFIR3_BYP 1, GFIR2_BYP 1, GFIR1_BYP 1
+ LoadDC_REG_IQ(Tx, (int16_t)0x7FFF, (int16_t)0x8000);
+ SetNCOFrequency(Tx, 0, 0);
+
+ //RXTSP
+ SetDefaults(RxTSP);
+ Modify_SPI_Reg_bits(LMS7param(AGC_MODE_RXTSP), 1); //AGC_MODE 1
+ Modify_SPI_Reg_bits(0x040C, 7, 7, 0x1); //CMIX_BYP 1
+ Modify_SPI_Reg_bits(0x040C, 6, 6, 0x0); //AGC_BYP 0
+ Modify_SPI_Reg_bits(0x040C, 5, 5, 1); //
+ Modify_SPI_Reg_bits(0x040C, 4, 4, 1); //
+ Modify_SPI_Reg_bits(0x040C, 3, 3, 1); //
+ Modify_SPI_Reg_bits(0x040C, 2, 2, 1); // DC_BYP
+ Modify_SPI_Reg_bits(0x040C, 1, 1, 1); //
+ Modify_SPI_Reg_bits(0x040C, 0, 0, 1); //
+
+ Modify_SPI_Reg_bits(LMS7param(CAPSEL), 0);
+ Modify_SPI_Reg_bits(LMS7param(HBD_OVR_RXTSP), 2);
+ Modify_SPI_Reg_bits(LMS7param(AGC_AVG_RXTSP), 0x7); //agc_avg iq corr
+ return LIBLMS7_SUCCESS;
+}
+
+/** @brief Calibrates Receiver. DC offset, IQ gains, IQ phase correction
+ @return 0-success, other-failure
+*/
+liblms7_status LMS7002M::CalibrateRx(float_type bandwidth_MHz)
+{
+ liblms7_status status;
+ uint32_t minRSSI_i;
+ uint32_t minRSSI_q;
+ int16_t iqcorr_rx = 0;
+ uint32_t minRSSI_iq;
+ int16_t dcoffi;
+ int16_t dcoffq;
+
+ const int16_t firCoefs[] =
+ {
+ -2531,
+ -517,
+ 2708,
+ 188,
+ -3059,
+ 216,
+ 3569,
+ -770,
+ -4199,
+ 1541,
+ 4886,
+ -2577,
+ -5552,
+ 3909,
+ 6108,
+ -5537,
+ -6457,
+ 7440,
+ 6507,
+ -9566,
+ -6174,
+ 11845,
+ 5391,
+ -14179,
+ -4110,
+ 16457,
+ 2310,
+ -18561,
+ 0,
+ 20369,
+ -2780,
+ -21752,
+ 5963,
+ 22610,
+ -9456,
+ -22859,
+ 13127,
+ 22444,
+ -16854,
+ -21319,
+ 20489,
+ 19492,
+ -23883,
+ -17002,
+ 26881,
+ 13902,
+ -29372,
+ -10313,
+ 31226,
+ 6345,
+ -32380,
+ -2141,
+ 32767,
+ -2141,
+ -32380,
+ 6345,
+ 31226,
+ -10313,
+ -29372,
+ 13902,
+ 26881,
+ -17002,
+ -23883,
+ 19492,
+ 20489,
+ -21319,
+ -16854,
+ 22444,
+ 13127,
+ -22859,
+ -9456,
+ 22610,
+ 5963,
+ -21752,
+ -2780,
+ 20369,
+ 0,
+ -18561,
+ 2310,
+ 16457,
+ -4110,
+ -14179,
+ 5391,
+ 11845,
+ -6174,
+ -9566,
+ 6507,
+ 7440,
+ -6457,
+ -5537,
+ 6108,
+ 3909,
+ -5552,
+ -2577,
+ 4886,
+ 1541,
+ -4199,
+ -770,
+ 3569,
+ 216,
+ -3059,
+ 188,
+ 2708,
+ -517,
+ -2531
+ };
+
+ Log("Rx calibration started", LOG_INFO);
+ uint8_t ch = (uint8_t)Get_SPI_Reg_bits(LMS7param(MAC));
+ Log("Saving registers state", LOG_INFO);
+ BackupAllRegisters();
+ uint8_t sel_path_rfe = (uint8_t)Get_SPI_Reg_bits(LMS7param(SEL_PATH_RFE));
+ if (sel_path_rfe == 1 || sel_path_rfe == 0)
+ return LIBLMS7_BAD_SEL_PATH;
+
+ Log("Setup stage", LOG_INFO);
+ status = CalibrateRxSetup(bandwidth_MHz);
+ if (status != LIBLMS7_SUCCESS)
+ goto RxCalibrationEndStage;
+
+ Log("Rx DC calibration", LOG_INFO);
+ CalibrateRxDC_RSSI();
+ dcoffi = Get_SPI_Reg_bits(LMS7param(DCOFFI_RFE));
+ dcoffq = Get_SPI_Reg_bits(LMS7param(DCOFFQ_RFE));
+ Modify_SPI_Reg_bits(LMS7param(EN_G_TRF), 1);
+
+ if (sel_path_rfe == 2)
+ {
+ Modify_SPI_Reg_bits(LMS7param(PD_RLOOPB_2_RFE), 0);
+ Modify_SPI_Reg_bits(0x0103, 10, 10, 1);
+ Modify_SPI_Reg_bits(0x0103, 11, 11, 0);
+ Modify_SPI_Reg_bits(LMS7param(EN_INSHSW_LB2_RFE), 0);
+ }
+ if (sel_path_rfe == 3)
+ {
+ Modify_SPI_Reg_bits(LMS7param(PD_RLOOPB_1_RFE), 0);
+ Modify_SPI_Reg_bits(0x0103, 11, 11, 1);
+ Modify_SPI_Reg_bits(0x0103, 10, 10, 0);
+ Modify_SPI_Reg_bits(LMS7param(EN_INSHSW_LB1_RFE), 0);
+ }
+
+ Modify_SPI_Reg_bits(0x040C, 7, 7, 0); //CMIX_BYP 0
+ Modify_SPI_Reg_bits(0x040C, 2, 0, 0); //DC_BYP 0, GC_BYP 0, PH_BYP 0
+ Modify_SPI_Reg_bits(LMS7param(CMIX_GAIN_RXTSP), 1); //CMIX_GAIN 1 +6 db
+ Modify_SPI_Reg_bits(0x040C, 13, 13, 1); //CMIX_SC 1
+
+ FixRXSaturation();
+
+ Modify_SPI_Reg_bits(0x040C, 5, 5, 0); //GFIR3_BYP 0
+ Modify_SPI_Reg_bits(LMS7param(HBD_OVR_RXTSP), 2);
+ Modify_SPI_Reg_bits(LMS7param(GFIR3_L_RXTSP), 7);
+ Modify_SPI_Reg_bits(LMS7param(GFIR3_N_RXTSP), 7);
+
+ SetGFIRCoefficients(Rx, 2, firCoefs, sizeof(firCoefs) / sizeof(int16_t));
+
+ SetNCOFrequency(Rx, 0, bandwidth_MHz / 4 + 1);
+ Modify_SPI_Reg_bits(LMS7param(GCORRI_RXTSP), 2047);
+ Modify_SPI_Reg_bits(LMS7param(GCORRQ_RXTSP), 2047);
+
+ Log("IQ correction stage", LOG_INFO);
+ iqcorr_rx = 0;
+ for (int i = 0; i<9; ++i)
+ minRSSI_iq = FindMinRSSI(LMS7param(IQCORR_RXTSP), iqcorr_rx, &iqcorr_rx, 3, 1, 256 >> i);
+ Modify_SPI_Reg_bits(LMS7param(IQCORR_RXTSP), iqcorr_rx);
+
+ uint16_t mingcorri;
+ Log("I gain", LOG_INFO);
+ minRSSI_i = FindMinRSSI_Gain(LMS7param(GCORRI_RXTSP), &mingcorri);
+
+ Modify_SPI_Reg_bits(LMS7param(GCORRI_RXTSP), 2047);
+ Modify_SPI_Reg_bits(LMS7param(GCORRQ_RXTSP), 2047);
+
+ Log("Q gain", LOG_INFO);
+ uint16_t mingcorrq;
+ minRSSI_q = FindMinRSSI_Gain(LMS7param(GCORRQ_RXTSP), &mingcorrq);
+
+ if (minRSSI_i < minRSSI_q)
+ mingcorrq = 2047;
+ else
+ mingcorri = 2047;
+
+ Modify_SPI_Reg_bits(LMS7param(GCORRI_RXTSP), mingcorri);
+ Modify_SPI_Reg_bits(LMS7param(GCORRQ_RXTSP), mingcorrq);
+
+ Log("Phase", LOG_INFO);
+ for (int i = 0; i<9; ++i)
+ minRSSI_iq = FindMinRSSI(LMS7param(IQCORR_RXTSP), iqcorr_rx, &iqcorr_rx, 3, 1, 256 >> i);
+
+RxCalibrationEndStage:
+ Log("Restoring registers state", LOG_INFO);
+ RestoreAllRegisters();
+ if (status != LIBLMS7_SUCCESS)
+ {
+ Log("Rx calibration failed", LOG_WARNING);
+ return status;
+ }
+
+ Modify_SPI_Reg_bits(LMS7param(MAC), ch);
+ SetRxDCOFF((int8_t)dcoffi, (int8_t)dcoffq);
+ Modify_SPI_Reg_bits(LMS7param(EN_DCOFF_RXFE_RFE), 1);
+ Modify_SPI_Reg_bits(LMS7param(GCORRI_RXTSP), mingcorri);
+ Modify_SPI_Reg_bits(LMS7param(GCORRQ_RXTSP), mingcorrq);
+ Modify_SPI_Reg_bits(LMS7param(IQCORR_RXTSP), iqcorr_rx);
+ Modify_SPI_Reg_bits(0x040C, 2, 0, 0); //DC_BYP 0, GC_BYP 0, PH_BYP 0
+ Modify_SPI_Reg_bits(0x0110, 4, 0, 31); //ICT_LO_RFE 31
+ Log("Rx calibration finished", LOG_INFO);
+ return LIBLMS7_SUCCESS;
+}
+
+const uint16_t backupAddrs[] = {
+ 0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x0027, 0x0028,
+ 0x0029, 0x002A, 0x002B, 0x002C, 0x002E, 0x0081, 0x0082, 0x0084, 0x0085,
+ 0x0086, 0x0087, 0x0088, 0x0089, 0x008A, 0x008B, 0x008C, 0x0092, 0x0093, 0x0094,
+ 0x0095, 0x0096, 0x0097, 0x0098, 0x0099, 0x009A, 0x009B, 0x009C, 0x009D, 0x009E,
+ 0x009F, 0x00A0, 0x00A1, 0x00A2, 0x00A3, 0x00A4, 0x00A5, 0x00A6, 0x00A7, 0x00A8,
+ 0x00A9, 0x00AA, 0x00AB, 0x00AC, 0x00AD, 0x00AE, 0x0100, 0x0101, 0x0102, 0x0103,
+ 0x0104, 0x0105, 0x0106, 0x0107, 0x0108, 0x0109, 0x010A, 0x010C, 0x010D, 0x010E,
+ 0x010F, 0x0110, 0x0111, 0x0112, 0x0113, 0x0114, 0x0115, 0x0116, 0x0117, 0x0118,
+ 0x0119, 0x011A, 0x011C, 0x011D, 0x011E, 0x011F, 0x0120, 0x0121, 0x0122, 0x0123,
+ 0x0124, 0x0200, 0x0201, 0x0202, 0x0203, 0x0204, 0x0205, 0x0206, 0x0207, 0x0208,
+ 0x0240, 0x0242, 0x0243, 0x0400, 0x0401, 0x0402,
+ 0x0403, 0x0404, 0x0405, 0x0406, 0x0407, 0x0408, 0x0409, 0x040A, 0x040B, 0x040C,
+ 0x0440, 0x0442, 0x0443 };
+uint16_t backupRegs[sizeof(backupAddrs) / 2];
+const uint16_t backupSXAddr[] = { 0x011C, 0x011D, 0x011E, 0x011F, 0x01200, 0x0121, 0x0122, 0x0123, 0x0124 };
+uint16_t backupRegsSXR[sizeof(backupSXAddr) / 2];
+uint16_t backupRegsSXT[sizeof(backupSXAddr) / 2];
+
+/** @brief Stores chip current registers state into memory for later restoration
+*/
+void LMS7002M::BackupAllRegisters()
+{
+ uint8_t ch = (uint8_t)Get_SPI_Reg_bits(LMS7param(MAC));
+ SPI_read_batch(backupAddrs, backupRegs, sizeof(backupAddrs) / sizeof(uint16_t));
+ Modify_SPI_Reg_bits(LMS7param(MAC), 1); // channel A
+ SPI_read_batch(backupSXAddr, backupRegsSXR, sizeof(backupRegsSXR) / sizeof(uint16_t));
+ Modify_SPI_Reg_bits(LMS7param(MAC), 2); // channel B
+ SPI_read_batch(backupSXAddr, backupRegsSXT, sizeof(backupRegsSXR) / sizeof(uint16_t));
+ Modify_SPI_Reg_bits(LMS7param(MAC), ch);
+}
+
+/** @brief Sets chip registers to state that was stored in memory using BackupAllRegisters()
+*/
+void LMS7002M::RestoreAllRegisters()
+{
+ uint8_t ch = (uint8_t)Get_SPI_Reg_bits(LMS7param(MAC));
+ SPI_write_batch(backupAddrs, backupRegs, sizeof(backupAddrs) / sizeof(uint16_t));
+ Modify_SPI_Reg_bits(LMS7param(MAC), 1); // channel A
+ SPI_write_batch(backupSXAddr, backupRegsSXR, sizeof(backupRegsSXR) / sizeof(uint16_t));
+ Modify_SPI_Reg_bits(LMS7param(MAC), 2); // channel B
+ SPI_write_batch(backupSXAddr, backupRegsSXT, sizeof(backupRegsSXR) / sizeof(uint16_t));
+ Modify_SPI_Reg_bits(LMS7param(MAC), ch);
+}
+
+/** @brief Searches for minimal digital RSSI value by changing given gain parameter
+ @param param LMS7002M gain correction parameter
+ @param foundValue returns value which achieved minimal RSSI
+ @return minimal found RSSI value
+*/
+uint32_t LMS7002M::FindMinRSSI_Gain(const LMS7Parameter ¶m, uint16_t *foundValue)
+{
+ uint32_t RSSI = ~0 - 2;
+ uint32_t prevRSSI = RSSI + 1;
+ uint8_t decrement = 2;
+ uint16_t gcorr = 2047;
+ while (gcorr > 1024)
+ {
+ Modify_SPI_Reg_bits(param, gcorr);
+ RSSI = GetRSSI();
+ if (RSSI < prevRSSI)
+ {
+ prevRSSI = RSSI;
+ *foundValue = gcorr;
+ gcorr -= decrement;
+ decrement *= 2;
+ }
+ else
+ {
+ if (decrement == 2)
+ break;
+ gcorr -= decrement;
+ decrement = 2;
+ }
+ }
+ return prevRSSI;
+}
+
+/** @brief Reads all chip configuration and checks if it matches with local registers copy
+*/
+bool LMS7002M::IsSynced()
+{
+ if (controlPort->IsOpen() == false)
+ return false;
+ bool isSynced = true;
+ liblms7_status status;
+
+ uint8_t ch = (uint8_t)Get_SPI_Reg_bits(LMS7param(MAC));
+
+ vector addrToRead = mRegistersMap->GetUsedAddresses(0);
+ vector dataReceived;
+ dataReceived.resize(addrToRead.size(), 0);
+
+ Modify_SPI_Reg_bits(LMS7param(MAC), 1);
+ status = SPI_read_batch(&addrToRead[0], &dataReceived[0], addrToRead.size());
+ if (status != LIBLMS7_SUCCESS)
+ {
+ isSynced = false;
+ goto isSyncedEnding;
+ }
+
+ //mask out readonly bits
+ for (uint16_t j = 0; j < sizeof(readOnlyRegisters) / sizeof(uint16_t); ++j)
+ for (uint16_t k = 0; k < addrToRead.size(); ++k)
+ if (readOnlyRegisters[j] == addrToRead[k])
+ {
+ dataReceived[k] &= readOnlyRegistersMasks[j];
+ break;
+ }
+
+ //check if local copy matches chip
+ for (uint16_t i = 0; i < addrToRead.size(); ++i)
+ {
+ if (dataReceived[i] != mRegistersMap->GetValue(0, addrToRead[i]))
+ {
+ isSynced = false;
+ goto isSyncedEnding;
+ }
+ }
+
+ addrToRead.clear(); //add only B channel addresses
+ addrToRead = mRegistersMap->GetUsedAddresses(1);
+
+ //mask out readonly bits
+ for (uint16_t j = 0; j < sizeof(readOnlyRegisters) / sizeof(uint16_t); ++j)
+ for (uint16_t k = 0; k < addrToRead.size(); ++k)
+ if (readOnlyRegisters[j] == addrToRead[k])
+ {
+ dataReceived[k] &= readOnlyRegistersMasks[j];
+ break;
+ }
+
+ Modify_SPI_Reg_bits(LMS7param(MAC), 2);
+ status = SPI_read_batch(&addrToRead[0], &dataReceived[0], addrToRead.size());
+ if (status != LIBLMS7_SUCCESS)
+ return false;
+ //check if local copy matches chip
+ for (uint16_t i = 0; i < addrToRead.size(); ++i)
+ if (dataReceived[i] != mRegistersMap->GetValue(1, addrToRead[i]))
+ {
+ isSynced = false;
+ break;
+ }
+
+isSyncedEnding:
+ Modify_SPI_Reg_bits(LMS7param(MAC), ch); //restore previously used channel
+ return isSynced;
+}
+
+/** @brief Writes all registers from host to chip
+
+When used on Novena board, also changes gpios to match rx path and tx band selections
+*/
+liblms7_status LMS7002M::UploadAll()
+{
+ if (controlPort == NULL)
+ return LIBLMS7_NO_CONNECTION_MANAGER;
+ if (controlPort->IsOpen() == false)
+ return LIBLMS7_NOT_CONNECTED;
+
+ uint8_t ch = (uint8_t)Get_SPI_Reg_bits(LMS7param(MAC)); //remember used channel
+
+ liblms7_status status;
+
+ vector addrToWrite;
+ vector dataToWrite;
+
+ uint16_t x0020_value = mRegistersMap->GetValue(0, 0x0020);
+ Modify_SPI_Reg_bits(LMS7param(MAC), 1); //select A channel
+
+ addrToWrite = mRegistersMap->GetUsedAddresses(0);
+ //remove 0x0020 register from list, to not change MAC
+ addrToWrite.erase( find(addrToWrite.begin(), addrToWrite.end(), 0x0020) );
+ for (auto address : addrToWrite)
+ dataToWrite.push_back(mRegistersMap->GetValue(0, address));
+
+ status = SPI_write_batch(&addrToWrite[0], &dataToWrite[0], addrToWrite.size());
+ status = LIBLMS7_SUCCESS;
+ if (status != LIBLMS7_SUCCESS)
+ return status;
+ //after all channel A registers have been written, update 0x0020 register value
+ status = SPI_write(0x0020, x0020_value);
+ if (status != LIBLMS7_SUCCESS)
+ return status;
+ Modify_SPI_Reg_bits(LMS7param(MAC), 2);
+ if (status != LIBLMS7_SUCCESS)
+ return status;
+
+ addrToWrite = mRegistersMap->GetUsedAddresses(1);
+ dataToWrite.clear();
+ for (auto address : addrToWrite)
+ {
+ dataToWrite.push_back(mRegistersMap->GetValue(1, address));
+ }
+ Modify_SPI_Reg_bits(LMS7param(MAC), 2); //select B channel
+ status = SPI_write_batch(&addrToWrite[0], &dataToWrite[0], addrToWrite.size());
+ if (status != LIBLMS7_SUCCESS)
+ return status;
+ Modify_SPI_Reg_bits(LMS7param(MAC), ch); //restore last used channel
+
+ //in case of Novena board, need to update GPIO
+ if(controlPort->GetInfo().device == LMS_DEV_NOVENA)
+ {
+ uint16_t regValue = SPI_read(0x0706) & 0xFFF8;
+ //lms_gpio2 - tx output selection:
+ // 0 - TX1_A and TX1_B (Band 1),
+ // 1 - TX2_A and TX2_B (Band 2)
+ regValue |= Get_SPI_Reg_bits(LMS7param(SEL_BAND2_TRF)) << 2; //gpio2
+ //RX active paths
+ //lms_gpio0 | lms_gpio1 RX_A RX_B
+ // 0 0 => no active path
+ // 1 0 => LNAW_A LNAW_B
+ // 0 1 => LNAH_A LNAH_B
+ // 1 1 => LNAL_A LNAL_B
+ switch(Get_SPI_Reg_bits(LMS7param(SEL_PATH_RFE)))
+ {
+ //set gpio1:gpio0
+ case 0: regValue |= 0x0; break;
+ case 1: regValue |= 0x2; break;
+ case 2: regValue |= 0x3; break;
+ case 3: regValue |= 0x1; break;
+ }
+ SPI_write(0x0706, regValue);
+ }
+ return LIBLMS7_SUCCESS;
+}
+
+/** @brief Reads all registers from the chip to host
+
+When used on Novena board, also updates gpios to match rx path and tx band selections
+*/
+liblms7_status LMS7002M::DownloadAll()
+{
+ if (controlPort == nullptr)
+ return LIBLMS7_NO_CONNECTION_MANAGER;
+ if (controlPort->IsOpen() == false)
+ return LIBLMS7_NOT_CONNECTED;
+ liblms7_status status;
+ uint8_t ch = (uint8_t)Get_SPI_Reg_bits(LMS7param(MAC), false);
+
+ vector addrToRead = mRegistersMap->GetUsedAddresses(0);
+ vector dataReceived;
+ dataReceived.resize(addrToRead.size(), 0);
+ Modify_SPI_Reg_bits(LMS7param(MAC), 1);
+ status = SPI_read_batch(&addrToRead[0], &dataReceived[0], addrToRead.size());
+ if (status != LIBLMS7_SUCCESS)
+ return status;
+
+ for (uint16_t i = 0; i < addrToRead.size(); ++i)
+ {
+ uint16_t adr = addrToRead[i];
+ uint16_t val = dataReceived[i];
+ mRegistersMap->SetValue(0, addrToRead[i], dataReceived[i]);
+ }
+
+ addrToRead.clear(); //add only B channel addresses
+ addrToRead = mRegistersMap->GetUsedAddresses(1);
+ dataReceived.resize(addrToRead.size(), 0);
+
+ Modify_SPI_Reg_bits(LMS7param(MAC), 2);
+ status = SPI_read_batch(&addrToRead[0], &dataReceived[0], addrToRead.size());
+ if (status != LIBLMS7_SUCCESS)
+ return status;
+ for (uint16_t i = 0; i < addrToRead.size(); ++i)
+ mRegistersMap->SetValue(1, addrToRead[i], dataReceived[i]);
+
+ Modify_SPI_Reg_bits(LMS7param(MAC), ch); //retore previously used channel
+
+ //in case of Novena board, update GPIO
+ if(controlPort->GetInfo().device == LMS_DEV_NOVENA)
+ {
+ uint16_t regValue = SPI_read(0x0706) & 0xFFF8;
+ //lms_gpio2 - tx output selection:
+ // 0 - TX1_A and TX1_B (Band 1),
+ // 1 - TX2_A and TX2_B (Band 2)
+ regValue |= Get_SPI_Reg_bits(LMS7param(SEL_BAND2_TRF)) << 2; //gpio2
+ //RX active paths
+ //lms_gpio0 | lms_gpio1 RX_A RX_B
+ // 0 0 => no active path
+ // 1 0 => LNAW_A LNAW_B
+ // 0 1 => LNAH_A LNAH_B
+ // 1 1 => LNAL_A LNAL_B
+ switch(Get_SPI_Reg_bits(LMS7param(SEL_PATH_RFE)))
+ {
+ //set gpio1:gpio0
+ case 0: regValue |= 0x0; break;
+ case 1: regValue |= 0x2; break;
+ case 2: regValue |= 0x3; break;
+ case 3: regValue |= 0x1; break;
+ }
+ SPI_write(0x0706, regValue);
+ }
+
+ return LIBLMS7_SUCCESS;
+}
+
+/** @brief Configures interfaces for desired frequency
+ Sets interpolation and decimation, changes MCLK sources and TSP clock dividers accordingly to selected interpolation and decimation
+*/
+liblms7_status LMS7002M::SetInterfaceFrequency(float_type cgen_freq_MHz, const uint8_t interpolation, const uint8_t decimation)
+{
+ Modify_SPI_Reg_bits(LMS7param(HBD_OVR_RXTSP), decimation);
+ Modify_SPI_Reg_bits(LMS7param(HBI_OVR_TXTSP), interpolation);
+ liblms7_status status = SetFrequencyCGEN(cgen_freq_MHz);
+ if (status != LIBLMS7_SUCCESS)
+ return status;
+
+ if (decimation == 7 || decimation == 0) //bypass
+ {
+ Modify_SPI_Reg_bits(LMS7param(RXTSPCLKA_DIV), 0);
+ Modify_SPI_Reg_bits(LMS7param(RXDIVEN), false);
+ Modify_SPI_Reg_bits(LMS7param(MCLK2SRC), 3);
+ }
+ else
+ {
+ uint8_t divider = (uint8_t)pow(2.0, decimation);
+ if (divider > 1)
+ Modify_SPI_Reg_bits(LMS7param(RXTSPCLKA_DIV), (divider / 2) - 1);
+ else
+ Modify_SPI_Reg_bits(LMS7param(RXTSPCLKA_DIV), 0);
+ Modify_SPI_Reg_bits(LMS7param(RXDIVEN), true);
+ Modify_SPI_Reg_bits(LMS7param(MCLK2SRC), 1);
+ }
+ if (interpolation == 7 || interpolation == 0) //bypass
+ {
+ Modify_SPI_Reg_bits(LMS7param(TXTSPCLKA_DIV), 0);
+ Modify_SPI_Reg_bits(LMS7param(TXDIVEN), false);
+ Modify_SPI_Reg_bits(LMS7param(MCLK1SRC), 2);
+ }
+ else
+ {
+ uint8_t divider = (uint8_t)pow(2.0, interpolation);
+ if (divider > 1)
+ Modify_SPI_Reg_bits(LMS7param(TXTSPCLKA_DIV), (divider / 2) - 1);
+ else
+ Modify_SPI_Reg_bits(LMS7param(TXTSPCLKA_DIV), 0);
+ Modify_SPI_Reg_bits(LMS7param(TXDIVEN), true);
+ Modify_SPI_Reg_bits(LMS7param(MCLK1SRC), 0);
+ }
+ return status;
+}
diff --git a/targets/ARCH/LMSSDR/USERSPACE/LIB/lms7002m/LMS7002M.h b/targets/ARCH/LMSSDR/USERSPACE/LIB/lms7002m/LMS7002M.h
new file mode 100644
index 0000000000..81234c28a3
--- /dev/null
+++ b/targets/ARCH/LMSSDR/USERSPACE/LIB/lms7002m/LMS7002M.h
@@ -0,0 +1,177 @@
+/**
+@file LMS7002M.h
+@author Lime Microsystems (www.limemicro.com)
+@brief LMS7002M transceiver configuration interface
+*/
+
+#ifndef LMS7API_H
+#define LMS7API_H
+
+#include "LMS7002M_statuses.h"
+#include "LMS7002M_parameters.h"
+#include "typedefs.h"
+
+#include
+
+class LMScomms;
+class LMS7002M_RegistersMap;
+
+class LMS7002M
+{
+public:
+ enum
+ {
+ Rx, Tx
+ };
+
+ LMS7002M();
+ LMS7002M(LMScomms* controlPort);
+ virtual ~LMS7002M();
+
+ ///@name Registers writing and reading
+ liblms7_status UploadAll();
+ liblms7_status DownloadAll();
+ bool IsSynced();
+
+ liblms7_status ResetChip();
+ liblms7_status LoadConfig(const char* filename);
+ liblms7_status SaveConfig(const char* filename);
+ ///@}
+
+ ///@name Registers writing and reading
+ uint16_t Get_SPI_Reg_bits(const LMS7Parameter ¶m, bool fromChip = true);
+ uint16_t Get_SPI_Reg_bits(uint16_t address, uint8_t msb, uint8_t lsb, bool fromChip = true);
+ liblms7_status Modify_SPI_Reg_bits(const LMS7Parameter ¶m, const uint16_t value, bool fromChip = true);
+ liblms7_status Modify_SPI_Reg_bits(uint16_t address, uint8_t msb, uint8_t lsb, uint16_t value, bool fromChip = true);
+ liblms7_status SPI_write(uint16_t address, uint16_t data);
+ uint16_t SPI_read(uint16_t address, bool fromChip = true, liblms7_status *status = 0);
+ liblms7_status RegistersTest();
+ ///@}
+
+ ///@name Transmitter, Receiver calibrations
+ liblms7_status CalibrateRx(float_type bandwidth_MHz);
+ liblms7_status CalibrateTx(float_type bandwidth_MHz);
+ ///@}
+
+ ///@name Filters tuning
+ enum TxFilter
+ {
+ TX_LADDER, TX_REALPOLE, TX_HIGHBAND
+ };
+ enum RxFilter
+ {
+ RX_TIA, RX_LPF_LOWBAND, RX_LPF_HIGHBAND
+ };
+ liblms7_status TuneTxFilter(TxFilter filterType, float_type bandwidth_MHz);
+ liblms7_status TuneTxFilterLowBandChain(float_type ladder_bw_MHz, float_type realpole_bw_MHz);
+ liblms7_status TuneRxFilter(RxFilter filterType, float_type bandwidth_MHz);
+ ///@}
+
+ ///@name CGEN and PLL
+ float_type GetReferenceClk_SX(bool tx);
+ float_type GetFrequencyCGEN_MHz();
+ liblms7_status SetFrequencyCGEN(float_type freq_MHz);
+ float_type GetFrequencySX_MHz(bool tx, float_type refClk_MHz);
+ liblms7_status SetFrequencySX(bool tx, float_type freq_MHz, float_type refClk_MHz);
+ ///VCO modules available for tuning
+ enum VCO_Module
+ {
+ VCO_CGEN, VCO_SXR, VCO_SXT
+ };
+ liblms7_status TuneVCO(VCO_Module module);
+ ///@}
+
+ ///@name TSP
+ liblms7_status LoadDC_REG_IQ(bool tx, int16_t I, int16_t Q);
+ liblms7_status SetNCOFrequency(bool tx, uint8_t index, float_type freq_MHz);
+ float_type GetNCOFrequency_MHz(bool tx, uint8_t index, float_type refClk_MHz, bool fromChip = true);
+ liblms7_status SetNCOPhaseOffsetForMode0(bool tx, float_type angle_Deg);
+ liblms7_status SetNCOPhaseOffset(bool tx, uint8_t index, float_type angle_Deg);
+ float_type GetNCOPhaseOffset_Deg(bool tx, uint8_t index);
+ liblms7_status SetGFIRCoefficients(bool tx, uint8_t GFIR_index, const int16_t *coef, uint8_t coefCount);
+ liblms7_status GetGFIRCoefficients(bool tx, uint8_t GFIR_index, int16_t *coef, uint8_t coefCount);
+ float_type GetReferenceClk_TSP_MHz(bool tx);
+ ///@}
+
+ liblms7_status SetInterfaceFrequency(float_type cgen_freq_MHz, const uint8_t interpolation, const uint8_t decimation);
+
+ ///enumeration to indicate module registers intervals
+ enum MemorySection
+ {
+ LimeLight = 0, EN_DIR, AFE, BIAS, XBUF, CGEN, LDO, BIST, CDS,
+ TRF, TBB, RFE, RBB, SX, TxTSP,
+ TxNCO, TxGFIR1, TxGFIR2, TxGFIR3a, TxGFIR3b, TxGFIR3c,
+ RxTSP, RxNCO, RxGFIR1, RxGFIR2, RxGFIR3a, RxGFIR3b, RxGFIR3c,
+ MEMORY_SECTIONS_COUNT
+ };
+ virtual liblms7_status SetDefaults(MemorySection module);
+ LMScomms* GetControlPort() const { return controlPort;};
+
+ static const float_type gLadder_lower_limit;
+ static const float_type gLadder_higher_limit;
+ static const float_type gRealpole_lower_limit;
+ static const float_type gRealpole_higher_limit;
+ static const float_type gHighband_lower_limit;
+ static const float_type gHighband_higher_limit;
+
+ static const float_type gRxTIA_higher_limit;
+ static const float_type gRxTIA_lower_limit_g1;
+ static const float_type gRxTIA_lower_limit_g23;
+ static const float_type gRxLPF_low_lower_limit;
+ static const float_type gRxLPF_low_higher_limit;
+ static const float_type gRxLPF_high_lower_limit;
+ static const float_type gRxLPF_high_higher_limit;
+
+ static float_type gVCO_frequency_table[3][2];
+ static float_type gCGEN_VCO_frequencies[2];
+
+ //protected:
+ LMS7002M_RegistersMap *mRegistersMap;
+ static const uint16_t readOnlyRegisters[];
+ static const uint16_t readOnlyRegistersMasks[];
+
+ uint16_t MemorySectionAddresses[MEMORY_SECTIONS_COUNT][2];
+ ///@name Algorithms functions
+ void BackupAllRegisters();
+ void RestoreAllRegisters();
+ uint32_t GetRSSI();
+ void SetRxDCOFF(int8_t offsetI, int8_t offsetQ);
+ uint32_t FindMinRSSI_Gain(const LMS7Parameter ¶m, uint16_t *foundValue);
+ uint32_t FindMinRSSI(const LMS7Parameter ¶m, const int16_t startValue, int16_t *result, const uint8_t scanWidth, const uint8_t twoCompl, int8_t stepMult = 1);
+ uint32_t FindMinRSSI(const uint16_t addr, const uint8_t msb, const uint8_t lsb, const int16_t startValue, int16_t *result, const uint8_t scanWidth, const uint8_t twoCompl, int8_t stepMult = 1);
+ void CalibrateRxDC_RSSI();
+ liblms7_status CalibrateTxSetup(float_type bandwidth_MHz);
+ liblms7_status CalibrateRxSetup(float_type bandwidth_MHz);
+ liblms7_status FixRXSaturation();
+ void FilterTuning_AdjustGains();
+ liblms7_status TuneTxFilterSetup(TxFilter type, float_type cutoff_MHz);
+ liblms7_status TuneRxFilterSetup(RxFilter type, float_type cutoff_MHz);
+ liblms7_status RFE_TIA_Calibration(float_type TIA_freq_MHz);
+ liblms7_status RxLPFLow_Calibration(float_type RxLPFL_freq_MHz);
+ liblms7_status RxLPFHigh_Calibration(float_type RxLPFH_freq_MHz);
+
+ liblms7_status RegistersTestInterval(uint16_t startAddr, uint16_t endAddr, uint16_t pattern, std::stringstream &ss);
+ liblms7_status SPI_write_batch(const uint16_t* spiAddr, const uint16_t* spiData, uint16_t cnt);
+ liblms7_status SPI_read_batch(const uint16_t* spiAddr, uint16_t* spiData, uint16_t cnt);
+ liblms7_status Modify_SPI_Reg_mask(const uint16_t *addr, const uint16_t *masks, const uint16_t *values, uint8_t start, uint8_t stop);
+ ///@}
+ ///Reference clock used for Receiver frequency calculations
+ float_type mRefClkSXR_MHz;
+ ///Reference clock used for Transmitter frequency calculations
+ float_type mRefClkSXT_MHz;
+
+ enum LogType
+ {
+ LOG_INFO,
+ LOG_WARNING,
+ LOG_ERROR,
+ LOG_DATA
+ };
+ virtual void Log(const char* text, LogType type);
+
+ ///port used for communicating with LMS7002M
+ LMScomms* controlPort;
+
+ liblms7_status LoadConfigLegacyFile(const char* filename);
+};
+#endif
diff --git a/targets/ARCH/LMSSDR/USERSPACE/LIB/lms7002m/LMS7002M_RegistersMap.cpp b/targets/ARCH/LMSSDR/USERSPACE/LIB/lms7002m/LMS7002M_RegistersMap.cpp
new file mode 100644
index 0000000000..8c870ffcc0
--- /dev/null
+++ b/targets/ARCH/LMSSDR/USERSPACE/LIB/lms7002m/LMS7002M_RegistersMap.cpp
@@ -0,0 +1,68 @@
+#include "LMS7002M_RegistersMap.h"
+#include "LMS7002M_parameters.h"
+
+LMS7002M_RegistersMap::LMS7002M_RegistersMap()
+{
+
+}
+
+LMS7002M_RegistersMap::~LMS7002M_RegistersMap()
+{
+
+}
+
+uint16_t LMS7002M_RegistersMap::GetDefaultValue(uint16_t address) const
+{
+ std::map::const_iterator iter = mChannelA.find(address);
+ if( iter != mChannelA.end())
+ return iter->second.defaultValue;
+ else
+ return 0;
+}
+
+void LMS7002M_RegistersMap::InitializeDefaultValues(const std::vector parameterList)
+{
+ for(auto parameter : parameterList)
+ {
+ uint16_t regValue = mChannelA[parameter->address].defaultValue;
+ mChannelA[parameter->address].defaultValue = regValue | (parameter->defaultValue << parameter->lsb);
+ mChannelA[parameter->address].value = mChannelA[parameter->address].defaultValue;
+ if(parameter->address >= 0x0100)
+ mChannelB[parameter->address].value = mChannelA[parameter->address].value;
+ }
+}
+
+void LMS7002M_RegistersMap::SetValue(uint8_t channel, const uint16_t address, const uint16_t value)
+{
+ if(channel == 0)
+ mChannelA[address].value = value;
+ else if(channel == 1)
+ mChannelB[address].value = value;
+}
+
+uint16_t LMS7002M_RegistersMap::GetValue(uint8_t channel, uint16_t address) const
+{
+ const std::map *regMap;
+ if(channel == 0)
+ regMap = &mChannelA;
+ else if(channel == 1)
+ regMap = &mChannelB;
+ std::map::const_iterator iter;
+ iter = regMap->find(address);
+ if (iter != regMap->end())
+ return iter->second.value;
+ else
+ return 0;
+}
+
+std::vector LMS7002M_RegistersMap::GetUsedAddresses(const uint8_t channel) const
+{
+ std::vector addresses;
+ if(channel == 0)
+ for(auto iter : mChannelA)
+ addresses.push_back(iter.first);
+ else if(channel == 1)
+ for(auto iter : mChannelB)
+ addresses.push_back(iter.first);
+ return addresses;
+}
diff --git a/targets/ARCH/LMSSDR/USERSPACE/LIB/lms7002m/LMS7002M_RegistersMap.h b/targets/ARCH/LMSSDR/USERSPACE/LIB/lms7002m/LMS7002M_RegistersMap.h
new file mode 100644
index 0000000000..5ccda752db
--- /dev/null
+++ b/targets/ARCH/LMSSDR/USERSPACE/LIB/lms7002m/LMS7002M_RegistersMap.h
@@ -0,0 +1,35 @@
+#ifndef LMS7002M_REGISTERS_MAP_H
+#define LMS7002M_REGISTERS_MAP_H
+
+#include
+#include