diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index c75f8fa464..8947453454 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -8,6 +8,7 @@ job1:
- echo $EXTERNAL_SHARE_DIR
- echo $SHELL
- git rev-parse --abbrev-ref HEAD
+ - git_repo=`git config --get remote.origin.url`
- git_head=`git rev-parse HEAD`
- echo $git_head
- tmp=`git show-ref --head | grep $git_head`
@@ -23,8 +24,8 @@ job1:
- echo $NRUNS_LTE_SOFTMODEM
- echo $TIMEOUT_CMD
- mkdir -p $OPENAIR_DIR/cmake_targets/autotests/log
- - python $OPENAIR_DIR/cmake_targets/autotests/run_exec_lte-softmodem_tests.py -c -5GRepoHeadVersion $git_head -n $NFS_SHARE_DIR -u $OAI_USER -p $OAI_PASS $OAI_EXTRA_ARGS -g "$OAI_TEST_CASE_GROUP">& $OPENAIR_DIR/cmake_targets/autotests/python_autotest_cleanup.log
- - python $OPENAIR_DIR/cmake_targets/autotests/run_exec_lte-softmodem_tests.py -r -5GRepoHeadVersion $git_head -n $NFS_SHARE_DIR -u $OAI_USER -p $OAI_PASS `echo $OAI_EXTRA_ARGS` -g "$OAI_TEST_CASE_GROUP" --nrun_lte_softmodem $NRUNS_LTE_SOFTMODEM --timeout_cmd $TIMEOUT_CMD >& $OPENAIR_DIR/cmake_targets/autotests/python_autotest.log
+ - python $OPENAIR_DIR/cmake_targets/autotests/run_exec_lte-softmodem_tests.py -c -5GRepo $git_repo -5GRepoHeadVersion $git_head -n $NFS_SHARE_DIR -u $OAI_USER -p $OAI_PASS $OAI_EXTRA_ARGS -g "$OAI_TEST_CASE_GROUP">& $OPENAIR_DIR/cmake_targets/autotests/python_autotest_cleanup.log
+ - python $OPENAIR_DIR/cmake_targets/autotests/run_exec_lte-softmodem_tests.py -r -5GRepo $git_repo -5GRepoHeadVersion $git_head -n $NFS_SHARE_DIR -u $OAI_USER -p $OAI_PASS `echo $OAI_EXTRA_ARGS` -g "$OAI_TEST_CASE_GROUP" --nrun_lte_softmodem $NRUNS_LTE_SOFTMODEM --timeout_cmd $TIMEOUT_CMD >& $OPENAIR_DIR/cmake_targets/autotests/python_autotest.log
- mv $OPENAIR_DIR/cmake_targets/autotests/python_autotest.log $OPENAIR_DIR/cmake_targets/autotests/log/python_autotest.log
- mv $OPENAIR_DIR/cmake_targets/autotests/python_autotest_cleanup.log $OPENAIR_DIR/cmake_targets/autotests/log/python_autotest_cleanup.log
- sshpass -p "$OAI_PASS" rsync -az -e "ssh -o StrictHostKeyChecking=no " --rsync-path="mkdir -p $NFS_TEST_RESULTS_DIR && rsync" $OPENAIR_DIR/cmake_targets/autotests/log $OAI_USER@localhost:$NFS_TEST_RESULTS_DIR
diff --git a/cmake_targets/CMakeLists.txt b/cmake_targets/CMakeLists.txt
index 77d8703d95..3325be0ea2 100644
--- a/cmake_targets/CMakeLists.txt
+++ b/cmake_targets/CMakeLists.txt
@@ -177,42 +177,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")
-Message("RF_BOARD is ${RF_BOARD}")
-# 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")
@@ -323,6 +346,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)
@@ -1088,7 +1112,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
)
@@ -1429,6 +1452,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})
@@ -1720,6 +1746,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
@@ -1728,7 +1755,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 d3b72edf46..6e9cbbd581 100644
--- a/cmake_targets/autotests/README.txt
+++ b/cmake_targets/autotests/README.txt
@@ -189,6 +189,22 @@ Obj.# Case# Test# Description
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
diff --git a/cmake_targets/autotests/run_exec_autotests.bash b/cmake_targets/autotests/run_exec_autotests.bash
index a98a071bae..1029acc1e6 100755
--- a/cmake_targets/autotests/run_exec_autotests.bash
+++ b/cmake_targets/autotests/run_exec_autotests.bash
@@ -388,6 +388,7 @@ until [ -z "$1" ]
-g | --run-group)
RUN_GROUP=1
test_case_group=$2
+ test_case_group=`sed "s/\+/\*/g" <<< "${test_case_group}"` # Replace + with * for bash string substituion
echo_info "Will execute test cases only in group $test_case_group"
shift 2;;
-p)
@@ -423,9 +424,17 @@ rm -fr $tmpfile
xml_conf="$OPENAIR_DIR/cmake_targets/autotests/test_case_list.xml"
test_case_list=`xmlstarlet sel -T -t -m /testCaseList/testCase -s A:N:- "@id" -v "@id" -n $xml_conf`
+test_case_excl_list=`xmlstarlet sel -t -v "/testCaseList/TestCaseExclusionList" $xml_conf`
+echo "Test Case Exclusion List = $test_case_excl_list "
+
+test_case_excl_list=`sed "s/\+/\*/g" <<< "$test_case_excl_list" ` # Replace + with * for bash string substituion
+
+read -a test_case_excl_array <<< "$test_case_excl_list"
echo "test_case_list = $test_case_list"
+echo "Test Case Exclusion List = $test_case_excl_list \n"
+
readarray -t test_case_array <<<"$test_case_list"
read -a test_case_group_array <<< "$test_case_group"
@@ -447,6 +456,15 @@ for search_expr in "${test_case_array[@]}"
flag_run_test_case=1
fi
+ for search_excl in "${test_case_excl_array[@]}"
+ do
+ if [[ $search_expr == $search_excl ]];then
+ flag_run_test_case=0
+ echo_info "Test case $search_expr match found in test case excl group. Will skip the test case for execution..."
+ break
+ fi
+ done
+
#We skip this test case if it is not in the group list
if [ "$flag_run_test_case" -ne "1" ]; then
diff --git a/cmake_targets/autotests/run_exec_lte-softmodem_tests.py b/cmake_targets/autotests/run_exec_lte-softmodem_tests.py
index 3418798954..f1c165acbf 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 + """
@@ -1105,6 +1105,7 @@ pw =''
i = 0
dlsim=0
localshell=0
+GitOAI5GRepo=''
GitOAI5GRepoBranch=''
GitOAI5GHeadVersion=''
user=''
@@ -1141,6 +1142,9 @@ while i < len (sys.argv):
i = i +1
elif arg == '-c':
cleanUpRemoteMachines=True
+ elif arg == '-5GRepo':
+ GitOAI5GRepo = sys.argv[i+1]
+ i = i +1
elif arg == '-5GRepoBranch':
GitOAI5GRepoBranch = sys.argv[i+1]
i = i +1
@@ -1190,6 +1194,7 @@ while i < len (sys.argv):
print "-r: Remove the log directory in autotests"
print "-g: Run test cases in a group"
print "-c: Run cleanup scripts on remote machines and exit"
+ print "-5GRepo: Repository for OAI 5G to use to run tests (overrides GitOAI5GRepo in test_case_list.xml)"
print "-5GRepoBranch: Branch for OAI 5G Repository to run tests (overrides the branch in test_case_list.xml)"
print "-5GRepoHeadVersion: Head commit on which to run tests (overrides the branch in test_case_list.xml)"
print "-u: use the user name passed as argument"
@@ -1278,7 +1283,9 @@ if MachineList =='':
MachineList = xmlRoot.findtext('MachineList',default='')
NFSResultsShare = xmlRoot.findtext('NFSResultsShare',default='')
GitOpenaircnRepo = xmlRoot.findtext('GitOpenair-cnRepo',default='')
-GitOAI5GRepo = xmlRoot.findtext('GitOAI5GRepo',default='')
+
+if GitOAI5GRepo == '':
+ GitOAI5GRepo = xmlRoot.findtext('GitOAI5GRepo',default='')
if GitOAI5GRepoBranch == '':
GitOAI5GRepoBranch = xmlRoot.findtext('GitOAI5GRepoBranch',default='')
@@ -1394,15 +1401,15 @@ for oai in oai_list:
#cmd = cmd + 'mkdir -p ' + logdir + '\n'
cmd = cmd + 'cd '+ logdir + '\n'
cmd = cmd + 'git config --global http.sslVerify false \n'
- cmd = cmd + 'git clone --depth 1 '+ GitOAI5GRepo + ' -b ' + GitOAI5GRepoBranch +' \n'
- cmd = cmd + 'git clone '+ GitOpenaircnRepo + ' -b ' +GitOpenaircnRepoBranch + ' \n'
+ cmd = cmd + 'git clone '+ GitOAI5GRepo +' \n'
+ cmd = cmd + 'git clone '+ GitOpenaircnRepo + ' \n'
cmd = cmd + 'cd ' + logdirOAI5GRepo + '\n'
cmd = cmd + 'git checkout ' + GitOAI5GRepoBranch + '\n'
#cmd = cmd + 'git checkout ' + GitOAI5GHeadVersion + '\n'
cmd = cmd + 'git_head=`git ls-remote |grep \'' + GitOAI5GRepoBranch + '\'` \n'
cmd = cmd + 'git_head=($git_head) \n'
cmd = cmd + 'git_head=${git_head[0]} \n'
- cmd = cmd + 'echo \"GitOAI5GHeadVersion_remote = $git_head\"'
+ cmd = cmd + 'echo \"GitOAI5GHeadVersion_remote = $git_head\" \n'
cmd = cmd + 'echo \"GitOAI5GHeadVersion_local = ' + GitOAI5GHeadVersion + '\" \n'
if flag_skip_git_head_check==True:
cmd = cmd + 'echo \"skipping GitHead check...\" \n '
diff --git a/cmake_targets/autotests/test_case_list.xml b/cmake_targets/autotests/test_case_list.xml
index 4e6ca873cb..c4b0fc75e6 100644
--- a/cmake_targets/autotests/test_case_list.xml
+++ b/cmake_targets/autotests/test_case_list.xml
@@ -10,7 +10,7 @@
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
- 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+ 0175+
+ 0102+ 010304 010305 0104+ 015502 015505 015506 015507 015508 015509 015510 015511 015602 015605 015702 015705 015802 015805 016502 016505 0170+ 017502 017505 018002 018005 018502 018505
3
mozart calisson stevens nano amerique
@@ -981,7 +981,7 @@
- True
+ False
/tmp
@@ -995,7 +995,7 @@
- True
+ False
sudo -S -E $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --stop-ue
/tmp
@@ -1015,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
@@ -1055,7 +1055,7 @@
- True
+ False
/tmp
@@ -1069,7 +1069,7 @@
- True
+ False
sudo -S -E $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --stop-ue
/tmp
@@ -1089,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
@@ -1129,7 +1129,7 @@
- True
+ False
/tmp
@@ -1141,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
@@ -1162,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
@@ -1202,7 +1202,7 @@
- True
+ False
/tmp
@@ -1215,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
@@ -1235,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
@@ -1275,7 +1275,7 @@
- True
+ False
/tmp
@@ -1289,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
@@ -1309,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
@@ -1350,7 +1350,7 @@
- True
+ False
/tmp
@@ -1364,7 +1364,7 @@
- True
+ False
sudo -S -E $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --stop-ue
/tmp
@@ -1384,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
@@ -1425,7 +1425,7 @@
- True
+ False
/tmp
>
@@ -1438,7 +1438,7 @@
- True
+ False
sudo -S -E $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --stop-ue
/tmp
@@ -1458,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
@@ -1498,7 +1498,7 @@
- True
+ False
/tmp
@@ -1512,7 +1512,7 @@
- True
+ False
sudo -S -E $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --stop-ue
/tmp
@@ -1532,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
@@ -1572,7 +1572,7 @@
- True
+ False
/tmp
@@ -1586,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
@@ -1606,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
@@ -1646,7 +1646,7 @@
- True
+ False
/tmp
@@ -1660,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
@@ -1680,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
@@ -1720,7 +1720,7 @@
- True
+ False
/tmp
@@ -1734,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
@@ -1754,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
@@ -1768,30 +1768,30 @@
calisson
390
/tmp
- targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.local.conf tracking_area_code \"1\"
- targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.local.conf mobile_country_code \"208\"
- targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.local.conf mobile_network_code \"92\"
- targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.local.conf N_RB_DL 25
- targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.local.conf pdsch_referenceSignalPower -26
- targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.local.conf mme_ip_address "ipv4=\"192.170.0.1\";ipv6=\"192:168:30::17\";active=\"yes\";preference=\"ipv4\";"
- targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.local.conf downlink_frequency 2660000000L
- targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.local.conf uplink_frequency_offset -120000000
- targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.local.conf tx_gain 90
- targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.local.conf rx_gain 125
- 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 \"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 \"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
+ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf tracking_area_code \"1\"
+ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf mobile_country_code \"208\"
+ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf mobile_network_code \"92\"
+ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf N_RB_DL 25
+ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf pdsch_referenceSignalPower -26
+ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf mme_ip_address "ipv4=\"192.170.0.1\";ipv6=\"192:168:30::17\";active=\"yes\";preference=\"ipv4\";"
+ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf downlink_frequency 2660000000L
+ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf uplink_frequency_offset -120000000
+ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf tx_gain 90
+ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf rx_gain 125
+ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf frame_type \"FDD\"
+ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf nb_antennas_rx 1
+ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf nb_antennas_tx 1
+ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf ENB_INTERFACE_NAME_FOR_S1_MME \"eth5:3\"
+ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf ENB_IPV4_ADDRESS_FOR_S1_MME \"192.170.0.2/24\"
+ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf ENB_INTERFACE_NAME_FOR_S1U \"eth5:4\"
+ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf ENB_IPV4_ADDRESS_FOR_S1U \"192.170.1.2/24\"
+ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.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 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
+ 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.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
+ -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf -W
@@ -1852,30 +1852,30 @@
calisson
390
/tmp
- targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.local.conf tracking_area_code \"1\"
- targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.local.conf mobile_country_code \"208\"
- targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.local.conf mobile_network_code \"92\"
- targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.local.conf N_RB_DL 50
- targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.local.conf pdsch_referenceSignalPower -29
- targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.local.conf mme_ip_address "ipv4=\"192.170.0.1\";ipv6=\"192:168:30::17\";active=\"yes\";preference=\"ipv4\";"
- targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.local.conf downlink_frequency 2660000000L
- targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.local.conf uplink_frequency_offset -120000000
- targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.local.conf tx_gain 90
- targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.local.conf rx_gain 125
- 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 \"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 \"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
+ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf tracking_area_code \"1\"
+ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf mobile_country_code \"208\"
+ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf mobile_network_code \"92\"
+ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf N_RB_DL 50
+ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf pdsch_referenceSignalPower -29
+ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf mme_ip_address "ipv4=\"192.170.0.1\";ipv6=\"192:168:30::17\";active=\"yes\";preference=\"ipv4\";"
+ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf downlink_frequency 2660000000L
+ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf uplink_frequency_offset -120000000
+ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf tx_gain 90
+ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf rx_gain 125
+ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf frame_type \"FDD\"
+ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf nb_antennas_rx 1
+ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf nb_antennas_tx 1
+ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf ENB_INTERFACE_NAME_FOR_S1_MME \"eth5:3\"
+ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf ENB_IPV4_ADDRESS_FOR_S1_MME \"192.170.0.2/24\"
+ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf ENB_INTERFACE_NAME_FOR_S1U \"eth5:4\"
+ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf ENB_IPV4_ADDRESS_FOR_S1U \"192.170.1.2/24\"
+ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.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 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
+ 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.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
+ -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf -W
@@ -1936,30 +1936,30 @@
calisson
390
/tmp
- targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.local.conf tracking_area_code \"1\"
- targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.local.conf mobile_country_code \"208\"
- targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.local.conf mobile_network_code \"92\"
- targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.local.conf N_RB_DL 100
- targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.local.conf pdsch_referenceSignalPower -29
- targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.local.conf mme_ip_address "ipv4=\"192.170.0.1\";ipv6=\"192:168:30::17\";active=\"yes\";preference=\"ipv4\";"
- targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.local.conf downlink_frequency 2660000000L
- targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.local.conf uplink_frequency_offset -120000000
- targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.local.conf tx_gain 90
- targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.local.conf rx_gain 125
- 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 \"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 \"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
+ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf tracking_area_code \"1\"
+ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf mobile_country_code \"208\"
+ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf mobile_network_code \"92\"
+ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf N_RB_DL 100
+ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf pdsch_referenceSignalPower -29
+ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf mme_ip_address "ipv4=\"192.170.0.1\";ipv6=\"192:168:30::17\";active=\"yes\";preference=\"ipv4\";"
+ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf downlink_frequency 2660000000L
+ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf uplink_frequency_offset -120000000
+ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf tx_gain 90
+ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf rx_gain 125
+ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf frame_type \"FDD\"
+ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf nb_antennas_rx 1
+ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf nb_antennas_tx 1
+ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf ENB_INTERFACE_NAME_FOR_S1_MME \"eth5:3\"
+ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf ENB_IPV4_ADDRESS_FOR_S1_MME \"192.170.0.2/24\"
+ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf ENB_INTERFACE_NAME_FOR_S1U \"eth5:4\"
+ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf ENB_IPV4_ADDRESS_FOR_S1U \"192.170.1.2/24\"
+ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.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 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
+ 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.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
+ -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf -W
@@ -2020,30 +2020,30 @@
calisson
390
/tmp
- targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.local.conf tracking_area_code \"1\"
- targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.local.conf mobile_country_code \"208\"
- targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.local.conf mobile_network_code \"92\"
- targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.local.conf N_RB_DL 25
- targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.local.conf pdsch_referenceSignalPower -26
- targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.local.conf mme_ip_address "ipv4=\"192.170.0.1\";ipv6=\"192:168:30::17\";active=\"yes\";preference=\"ipv4\";"
- targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.local.conf downlink_frequency 2660000000L
- targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.local.conf uplink_frequency_offset -120000000
- targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.local.conf tx_gain 90
- targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.local.conf rx_gain 125
- 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 \"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 \"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
+ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf tracking_area_code \"1\"
+ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf mobile_country_code \"208\"
+ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf mobile_network_code \"92\"
+ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf N_RB_DL 25
+ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf pdsch_referenceSignalPower -26
+ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf mme_ip_address "ipv4=\"192.170.0.1\";ipv6=\"192:168:30::17\";active=\"yes\";preference=\"ipv4\";"
+ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf downlink_frequency 2660000000L
+ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf uplink_frequency_offset -120000000
+ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf tx_gain 90
+ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf rx_gain 125
+ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf frame_type \"FDD\"
+ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf nb_antennas_rx 1
+ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf nb_antennas_tx 1
+ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf ENB_INTERFACE_NAME_FOR_S1_MME \"eth5:3\"
+ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf ENB_IPV4_ADDRESS_FOR_S1_MME \"192.170.0.2/24\"
+ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf ENB_INTERFACE_NAME_FOR_S1U \"eth5:4\"
+ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf ENB_IPV4_ADDRESS_FOR_S1U \"192.170.1.2/24\"
+ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.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 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
+ 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.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
+ -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf -W
@@ -2104,30 +2104,30 @@
calisson
390
/tmp
- targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.local.conf tracking_area_code \"1\"
- targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.local.conf mobile_country_code \"208\"
- targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.local.conf mobile_network_code \"92\"
- targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.local.conf N_RB_DL 50
- targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.local.conf pdsch_referenceSignalPower -29
- targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.local.conf mme_ip_address "ipv4=\"192.170.0.1\";ipv6=\"192:168:30::17\";active=\"yes\";preference=\"ipv4\";"
- targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.local.conf downlink_frequency 2660000000L
- targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.local.conf uplink_frequency_offset -120000000
- targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.local.conf tx_gain 90
- targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.local.conf rx_gain 125
- 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 \"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 \"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
+ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf tracking_area_code \"1\"
+ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf mobile_country_code \"208\"
+ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf mobile_network_code \"92\"
+ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf N_RB_DL 50
+ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf pdsch_referenceSignalPower -29
+ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf mme_ip_address "ipv4=\"192.170.0.1\";ipv6=\"192:168:30::17\";active=\"yes\";preference=\"ipv4\";"
+ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf downlink_frequency 2660000000L
+ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf uplink_frequency_offset -120000000
+ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf tx_gain 90
+ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf rx_gain 125
+ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf frame_type \"FDD\"
+ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf nb_antennas_rx 1
+ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf nb_antennas_tx 1
+ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf ENB_INTERFACE_NAME_FOR_S1_MME \"eth5:3\"
+ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf ENB_IPV4_ADDRESS_FOR_S1_MME \"192.170.0.2/24\"
+ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf ENB_INTERFACE_NAME_FOR_S1U \"eth5:4\"
+ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf ENB_IPV4_ADDRESS_FOR_S1U \"192.170.1.2/24\"
+ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.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 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
+ 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.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
+ -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf -W
@@ -2188,30 +2188,30 @@
calisson
390
/tmp
- targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.local.conf tracking_area_code \"1\"
- targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.local.conf mobile_country_code \"208\"
- targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.local.conf mobile_network_code \"92\"
- targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.local.conf N_RB_DL 100
- targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.local.conf pdsch_referenceSignalPower -29
- targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.local.conf mme_ip_address "ipv4=\"192.170.0.1\";ipv6=\"192:168:30::17\";active=\"yes\";preference=\"ipv4\";"
- targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.local.conf downlink_frequency 2660000000L
- targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.local.conf uplink_frequency_offset -120000000
- targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.local.conf tx_gain 90
- targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.local.conf rx_gain 125
- 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 \"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 \"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
+ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf tracking_area_code \"1\"
+ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf mobile_country_code \"208\"
+ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf mobile_network_code \"92\"
+ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf N_RB_DL 100
+ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf pdsch_referenceSignalPower -29
+ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf mme_ip_address "ipv4=\"192.170.0.1\";ipv6=\"192:168:30::17\";active=\"yes\";preference=\"ipv4\";"
+ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf downlink_frequency 2660000000L
+ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf uplink_frequency_offset -120000000
+ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf tx_gain 90
+ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf rx_gain 125
+ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf frame_type \"FDD\"
+ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf nb_antennas_rx 1
+ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf nb_antennas_tx 1
+ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf ENB_INTERFACE_NAME_FOR_S1_MME \"eth5:3\"
+ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf ENB_IPV4_ADDRESS_FOR_S1_MME \"192.170.0.2/24\"
+ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf ENB_INTERFACE_NAME_FOR_S1U \"eth5:4\"
+ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf ENB_IPV4_ADDRESS_FOR_S1U \"192.170.1.2/24\"
+ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.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 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
+ 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.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
+ -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf -W
@@ -2803,7 +2803,7 @@
- True
+ False
/tmp
@@ -2816,7 +2816,7 @@
- True
+ False
sudo -S -E $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --stop-ue
/tmp
@@ -2836,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
@@ -2875,7 +2875,7 @@
- True
+ False
/tmp
@@ -2888,7 +2888,7 @@
- True
+ False
sudo -S -E $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --stop-ue
/tmp
@@ -2908,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
@@ -2946,7 +2946,7 @@
- True
+ False
/tmp
@@ -2960,7 +2960,7 @@
- True
+ False
sudo -S -E $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --stop-ue
/tmp
@@ -2980,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
@@ -3018,7 +3018,7 @@
- True
+ False
/tmp
@@ -3030,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
@@ -3051,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
@@ -3089,7 +3089,7 @@
- True
+ False
/tmp
@@ -3101,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
@@ -3122,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
@@ -3160,7 +3160,7 @@
- True
+ False
/tmp
@@ -3172,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
@@ -3193,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
@@ -3317,7 +3317,7 @@
- True
+ False
/tmp
@@ -3641,7 +3641,7 @@
- True
+ False
/tmp
@@ -3722,7 +3722,7 @@
- True
+ False
/tmp
@@ -3735,7 +3735,7 @@
- True
+ False
sudo -S -E $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --stop-ue
/tmp
@@ -3755,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
@@ -3794,7 +3794,7 @@
- True
+ False
/tmp
@@ -3808,7 +3808,7 @@
- True
+ False
sudo -S -E $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --stop-ue
/tmp
@@ -3828,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
@@ -3866,7 +3866,7 @@
- True
+ False
/tmp
@@ -3880,19 +3880,15 @@
- 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 \"eth5\"
- BUILD/EPC/epc.local.enb.conf.in PGW_IPV4_ADDRESS_FOR_SGI \"192.168.12.82/24\"
- SCRIPTS/build_epc
- -c -l
- SCRIPTS/build_hss
- -c -l
+
+
+
+
+
@@ -3904,7 +3900,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
@@ -3942,7 +3938,7 @@
- True
+ False
/tmp
@@ -3954,7 +3950,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
@@ -3975,7 +3971,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
@@ -4013,7 +4009,7 @@
- True
+ False
/tmp
@@ -4025,7 +4021,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
@@ -4046,7 +4042,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
@@ -4084,7 +4080,7 @@
- True
+ False
/tmp
@@ -4096,7 +4092,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
@@ -4117,7 +4113,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
@@ -4740,7 +4736,7 @@
- True
+ False
sudo -S -E $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --stop-ue
/tmp
@@ -4760,7 +4756,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
@@ -4815,7 +4811,7 @@
- True
+ False
sudo -S -E $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --stop-ue
/tmp
@@ -4835,7 +4831,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
@@ -4888,7 +4884,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
@@ -4909,7 +4905,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
@@ -4963,7 +4959,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
@@ -4983,7 +4979,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
@@ -5038,7 +5034,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
@@ -5058,7 +5054,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.20MHz.FDD.Band_7.DL.1TX.1RX
10
@@ -5189,7 +5185,7 @@
- True
+ False
sudo -S -E $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --stop-ue
/tmp
@@ -5209,7 +5205,7 @@
throughput_test min=1.0Mbits/sec max=1.0Mbits/sec average=1.0Mbits/sec
- True
+ False
SoDeRa.ALU_EPC.Bandrich.10MHz.FDD.Band_7.UL.1TX.1RX
10
@@ -5264,7 +5260,7 @@
- True
+ False
sudo -S -E $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --stop-ue
/tmp
@@ -5284,7 +5280,7 @@
throughput_test min=1.0Mbits/sec max=1.0Mbits/sec average=1.0Mbits/sec
- True
+ False
SoDeRa.ALU_EPC.Bandrich.20MHz.FDD.Band_7.UL.1TX.1RX
10
@@ -5337,7 +5333,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
@@ -5358,7 +5354,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
@@ -5412,7 +5408,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
@@ -5432,7 +5428,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
SoDeRa.ALU_EPC.Bandrich.10MHz.FDD.Band_7.DL.1TX.1RX
10
@@ -5487,7 +5483,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
@@ -5507,7 +5503,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
SoDeRa.ALU_EPC.Bandrich.20MHz.FDD.Band_7.DL.1TX.1RX
10
@@ -5521,44 +5517,46 @@
mozart
390
/tmp
- targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf tracking_area_code \"1\"
- targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf mobile_country_code \"208\"
- targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf mobile_network_code \"92\"
- targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf N_RB_DL 25
- targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.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.usrpb210.epc.remote.conf downlink_frequency 2660000000L
- targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf uplink_frequency_offset -120000000
- targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf tx_gain 90
- targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf rx_gain 125
- 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 \"eth6\"
- targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf ENB_IPV4_ADDRESS_FOR_S1_MME \"192.168.12.111/24\"
- targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf ENB_INTERFACE_NAME_FOR_S1U \"eth6\"
- targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf ENB_IPV4_ADDRESS_FOR_S1U \"192.168.12.111/24\"
- targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf ENB_PORT_FOR_S1U 2152
- targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.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=5;tx_sample_advance=70;tx_scheduling_advance=9;"
+ 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 -g3 -x -i eth1
+ -n1 -x -m1 -i eth1
False
- $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.usrpb210.epc.remote.conf -W
-
-
-
-
- False
+
/tmp
@@ -5601,39 +5599,50 @@
lte-softmodem
- calisson
+ calisson
+ mozart
stevens
amerique
390
/tmp
- targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf tracking_area_code \"1\"
- targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf mobile_country_code \"208\"
- targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf mobile_network_code \"92\"
- targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf N_RB_DL 50
- targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.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.usrpb210.epc.remote.conf downlink_frequency 2660000000L
- targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf uplink_frequency_offset -120000000
- targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf tx_gain 90
- targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf rx_gain 125
- 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 \"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 \"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
+ 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 USRP -x -c
+ --eNB -w None -t ETHERNET -x -c --disable-deadline
- $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
+ 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
- True
+ 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
@@ -5647,7 +5656,7 @@
- True
+ False
sudo -S -E $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --stop-ue
/tmp
@@ -5667,7 +5676,7 @@
throughput_test min=1.0Mbits/sec max=1.0Mbits/sec average=1.0Mbits/sec
- True
+ False
USRPb210.RRH.ALU_EPC.Bandrich.10MHz.FDD.Band_7.UL.1TX.1RX
10
@@ -5675,39 +5684,50 @@
lte-softmodem
- calisson
+ calisson
+ mozart
stevens
amerique
390
/tmp
- targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf tracking_area_code \"1\"
- targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf mobile_country_code \"208\"
- targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf mobile_network_code \"92\"
- targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf N_RB_DL 100
- targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.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.usrpb210.epc.remote.conf downlink_frequency 2660000000L
- targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf uplink_frequency_offset -120000000
- targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf tx_gain 90
- targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf rx_gain 125
- 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 \"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 \"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
+ 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 USRP -x -c
+ --eNB -w None -t ETHERNET -x -c --disable-deadline
- $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
+ 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
- True
+ 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
@@ -5721,7 +5741,7 @@
- True
+ False
sudo -S -E $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --stop-ue
/tmp
@@ -5741,7 +5761,7 @@
throughput_test min=1.0Mbits/sec max=1.0Mbits/sec average=1.0Mbits/sec
- True
+ False
USRPb210.RRH.ALU_EPC.Bandrich.20MHz.FDD.Band_7.UL.1TX.1RX
10
@@ -5749,39 +5769,50 @@
lte-softmodem
- calisson
+ calisson
+ mozart
stevens
amerique
390
/tmp
- targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf tracking_area_code \"1\"
- targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf mobile_country_code \"208\"
- targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf mobile_network_code \"92\"
- targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf N_RB_DL 25
- targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.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.usrpb210.epc.remote.conf downlink_frequency 2660000000L
- targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf uplink_frequency_offset -120000000
- targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf tx_gain 90
- targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf rx_gain 125
- 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 \"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 \"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
+ 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 USRP -x -c
+ --eNB -w None -t ETHERNET -x -c --disable-deadline
- $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
+ 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
- True
+ 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
@@ -5793,7 +5824,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
@@ -5814,7 +5845,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.RRH.ALU_EPC.Bandrich.5MHz.FDD.Band_7.DL.1TX.1RX
10
@@ -5822,39 +5853,50 @@
lte-softmodem
- calisson
+ calisson
+ mozart
stevens
amerique
390
/tmp
- targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf tracking_area_code \"1\"
- targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf mobile_country_code \"208\"
- targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf mobile_network_code \"92\"
- targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf N_RB_DL 50
- targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.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.usrpb210.epc.remote.conf downlink_frequency 2660000000L
- targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf uplink_frequency_offset -120000000
- targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf tx_gain 90
- targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf rx_gain 125
- 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 \"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 \"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
+ 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 USRP -x -c
+ --eNB -w None -t ETHERNET -x -c --disable-deadline
- $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
+ 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
- True
+ 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
@@ -5867,7 +5909,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
@@ -5887,7 +5929,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.RRH.ALU_EPC.Bandrich.10MHz.FDD.Band_7.DL.1TX.1RX
10
@@ -5895,39 +5937,50 @@
lte-softmodem
- calisson
+ calisson
+ mozart
stevens
amerique
390
/tmp
- targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf tracking_area_code \"1\"
- targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf mobile_country_code \"208\"
- targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf mobile_network_code \"92\"
- targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf N_RB_DL 100
- targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.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.usrpb210.epc.remote.conf downlink_frequency 2660000000L
- targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf uplink_frequency_offset -120000000
- targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf tx_gain 90
- targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.remote.conf rx_gain 125
- 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 \"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 \"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
+ 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 USRP -x -c
+ --eNB -w None -t ETHERNET -x -c --disable-deadline
- $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
+ 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
- True
+ 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
@@ -5941,7 +5994,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
@@ -5961,7 +6014,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.RRH.ALU_EPC.Bandrich.20MHz.FDD.Band_7.DL.1TX.1RX
10
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/tools/build_helper b/cmake_targets/tools/build_helper
index c8adf45257..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
###############################
@@ -397,4 +400,4 @@ if [[ $ip =~ ^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$ ]]; then
fi
return $stat
-}
\ No newline at end of file
+}
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 f003faf5c9..5bb7ef151f 100755
--- a/cmake_targets/tools/run_enb_s1_usrp
+++ b/cmake_targets/tools/run_enb_s1_usrp
@@ -56,6 +56,7 @@ 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."
@@ -138,6 +139,12 @@ function main()
shift;
exit 0
;;
+ -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
diff --git a/openair1/PHY/TOOLS/lte_phy_scope.c b/openair1/PHY/TOOLS/lte_phy_scope.c
index d5f3f3f5e7..ee1c16e8f7 100644
--- a/openair1/PHY/TOOLS/lte_phy_scope.c
+++ b/openair1/PHY/TOOLS/lte_phy_scope.c
@@ -777,6 +777,7 @@ void phy_scope_UE(FD_lte_phy_scope_ue *form,
fl_set_xyplot_data(form->pdsch_llr,bit,llr,coded_bits_per_codeword0,"","","");
}
+
// PDSCH I/Q of MF Output
if (pdsch_comp!=NULL) {
ind=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 107ca724fc..cc63eb8671 100755
--- a/openair2/ENB_APP/enb_config.c
+++ b/openair2/ENB_APP/enb_config.c
@@ -265,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;
diff --git a/openair2/ENB_APP/enb_config.h b/openair2/ENB_APP/enb_config.h
index 422ef67cd3..5f7f2636a3 100755
--- a/openair2/ENB_APP/enb_config.h
+++ b/openair2/ENB_APP/enb_config.h
@@ -264,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/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 065b0bbad2..d9b7bfa905 100644
--- a/targets/ARCH/BLADERF/USERSPACE/LIB/bladerf_lib.c
+++ b/targets/ARCH/BLADERF/USERSPACE/LIB/bladerf_lib.c
@@ -1080,6 +1080,7 @@ int device_init(openair0_device *device, openair0_config_t *openair0_cfg) {
device->trx_set_freq_func = trx_brf_set_freq;
device->trx_set_gains_func = trx_brf_set_gains;
device->openair0_cfg = openair0_cfg;
+ device->priv = (void *)brf;
calibrate_rf(device);
diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band13.tm1.lmssdr.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band13.tm1.lmssdr.conf
index df5ea1f1d2..266e5aae25 100644
--- a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band13.tm1.lmssdr.conf
+++ b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band13.tm1.lmssdr.conf
@@ -36,7 +36,7 @@ eNBs =
nb_antennas_tx = 1;
nb_antennas_rx = 1;
tx_gain = 90;
- rx_gain = 125;
+ rx_gain = 107;
prach_root = 0;
prach_config_index = 0;
prach_high_speed = "DISABLE";
diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.local.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.local.conf
index 75969c04fd..3043256628 100644
--- a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.local.conf
+++ b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.epc.local.conf
@@ -130,10 +130,12 @@ eNBs =
};
////////// MME parameters:
- mme_ip_address = ( {ipv4 = "192.170.0.1";
- ipv6="192:168:30::17";
- active="yes";
- preference="ipv4";});
+ mme_ip_address = ( { ipv4 = "192.170.0.1";
+ ipv6 = "192:168:30::17";
+ active = "yes";
+ preference = "ipv4";
+ }
+ );
NETWORK_INTERFACES :
{
@@ -141,6 +143,7 @@ eNBs =
ENB_IPV4_ADDRESS_FOR_S1_MME = "192.170.0.2/24";
ENB_INTERFACE_NAME_FOR_S1U = "eth0:4";
+ ENB_IPV4_ADDRESS_FOR_S1U = "192.170.1.2/24";
ENB_IPV4_ADDRESS_FOR_S1U = "192.170.0.2/24";
ENB_PORT_FOR_S1U = 2152; # Spec 2152
};