diff --git a/ci-scripts/cls_log_mgt.py b/ci-scripts/cls_log_mgt.py
index cf7b91d3c0..905a105512 100644
--- a/ci-scripts/cls_log_mgt.py
+++ b/ci-scripts/cls_log_mgt.py
@@ -30,11 +30,15 @@
-
+import logging
import re
import subprocess
-import logging
-import math
+import sshconnection
+
+logging.basicConfig(
+ level=logging.DEBUG,
+ format="[%(asctime)s] %(name)s:%(levelname)s: %(message)s"
+)
class Log_Mgt:
@@ -49,40 +53,25 @@ class Log_Mgt:
#-----------------$
- def __CheckAvailSpace(self):
+ def __CheckUsedSpace(self):
HOST=self.Username+'@'+self.IPAddress
COMMAND="df "+ self.path
ssh = subprocess.Popen(["ssh", "%s" % HOST, COMMAND],shell=False,stdout=subprocess.PIPE,stderr=subprocess.PIPE)
result = ssh.stdout.readlines()
s=result[1].decode('utf-8').rstrip()#result[1] is the second line with the results we are looking for
- tmp=s.split()
- return tmp[3] #return avail space from the line
+ used=s.split()[4] #get 4th field ex: 70%
+ m = re.match('^(\d+)\%',used)
+ if m is not None:
+ return int(m.group(1))
- def __GetOldestFile(self):
- HOST=self.Username+'@'+self.IPAddress
- COMMAND="ls -rtl "+ self.path #-rtl will bring oldest file on top
- ssh = subprocess.Popen(["ssh", "%s" % HOST, COMMAND],shell=False,stdout=subprocess.PIPE,stderr=subprocess.PIPE)
- result = ssh.stdout.readlines()
- s=result[1].decode('utf-8').rstrip()
- tmp=s.split()
- return tmp[8]#return filename from the line
+ def __RemoveOldest(self):
+ mySSH = sshconnection.SSHConnection()
+ mySSH.open(self.IPAddress, self.Username, self.Password)
+ COMMAND='echo ' + self.Password + ' | sudo -S find ' + self.path + ' -type f -mtime +14 -delete'
+ mySSH.command(COMMAND,'\$',20)
+ mySSH.close()
- def __AvgSize(self):
- HOST=self.Username+'@'+self.IPAddress
- COMMAND="ls -rtl "+ self.path
- ssh = subprocess.Popen(["ssh", "%s" % HOST, COMMAND],shell=False,stdout=subprocess.PIPE,stderr=subprocess.PIPE)
- result = ssh.stdout.readlines()
- if len(result)>1: #at least 1 file present
- total_size=0
- for i in range(1,len(result)):
- s=result[i].decode('utf-8').rstrip()
- tmp=s.split()
- total_size+=int(tmp[4]) #get filesize
- return math.floor(total_size/(len(result)-1)) #compute average file/artifact size
- else:#empty,no files
- return 0
-
#-----------------$
#PUBLIC Methods$
@@ -90,17 +79,15 @@ class Log_Mgt:
def LogRotation(self):
- avail_space =int(self.__CheckAvailSpace())*1000 #avail space in target folder, initially displayed in Gb
- avg_size=self.__AvgSize() #average size of artifacts in the target folder
- logging.debug("Avail Space : " + str(avail_space) + " / Artifact Avg Size : " + str(avg_size))
- if avail_space < 50*avg_size: #reserved space is 50x artifact file ; oldest file will be deleted
- oldestfile=self.__GetOldestFile()
- HOST=self.Username+'@'+self.IPAddress
- COMMAND="echo " + self.Password + " | sudo -S rm "+ self.path + "/" + oldestfile
- logging.debug(COMMAND)
- ssh = subprocess.Popen(["ssh", "%s" % HOST, COMMAND],shell=False,stdout=subprocess.PIPE,stderr=subprocess.PIPE)
+ used_space = self.__CheckUsedSpace() #avail space in target folder
+ if used_space > 80 :
+ logging.debug('\u001B[1;37;41m Used Disk > 80%, on ' + self.Username+'@'+self.IPAddress + '\u001B[0m')
+ logging.debug('\u001B[1;37;41m Removing Artifacts older than 14 days \u001B[0m')
+ self.__RemoveOldest()
else:
- logging.debug("Still some space left for artifacts storage")
+ logging.debug('Used Disk < 80%, on ' + self.Username+'@'+self.IPAddress +', no cleaning required')
+
+
diff --git a/ci-scripts/cppcheck_suppressions.list b/ci-scripts/cppcheck_suppressions.list
index f8438a4276..ff4cac20b3 100644
--- a/ci-scripts/cppcheck_suppressions.list
+++ b/ci-scripts/cppcheck_suppressions.list
@@ -50,10 +50,6 @@ memleak:openair1/PHY/CODING/TESTBENCH/ltetest.c
invalidPrintfArgType_sint:openair1/PHY/CODING/TESTBENCH/pdcch_test.c
//
//-----------------------------------------------------------------------------
-// oaisim deprecated, remove?
-doubleFree:openair3/TEST/oaisim_mme_list_benchmark.c
-//
-//-----------------------------------------------------------------------------
// is itti analyzer deprecated
nullPointer:common/utils/itti_analyzer/itti_analyzer.c
nullPointerRedundantCheck:common/utils/itti_analyzer/libbuffers/buffers.c
diff --git a/ci-scripts/datalog_rt_stats.2x2.yaml b/ci-scripts/datalog_rt_stats.2x2.yaml
index 9e2b66862d..a93ef6aa8c 100644
--- a/ci-scripts/datalog_rt_stats.2x2.yaml
+++ b/ci-scripts/datalog_rt_stats.2x2.yaml
@@ -4,16 +4,14 @@
Title : Processing Time (us)
ColNames :
- Metric
- - Average
- - Max
- - Average vs Reference Deviation (Reference Value ; Acceptability Threshold)
+ - Average; Max; Count
+ - Average vs Reference Deviation (Reference Value; Acceptability Threshold)
Ref :
feprx : 120.0
feptx_prec : 8.0
feptx_ofdm : 50.0
feptx_total : 75.0
- L1 Tx processing thread 0 : 300.0
- L1 Tx processing thread 1 : 300.0
+ L1 Tx processing : 300.0
DLSCH encoding : 230.0
L1 Rx processing : 175.0
PUSCH inner-receiver : 100.0
@@ -25,8 +23,7 @@ Threshold :
feptx_prec : 1.25
feptx_ofdm : 1.25
feptx_total : 1.25
- L1 Tx processing thread 0 : 1.25
- L1 Tx processing thread 1 : 1.25
+ L1 Tx processing : 1.25
DLSCH encoding : 1.25
L1 Rx processing : 1.25
PUSCH inner-receiver : 1.25
diff --git a/ci-scripts/datalog_rt_stats.default.yaml b/ci-scripts/datalog_rt_stats.default.yaml
index a2d4768752..02a90c86f4 100644
--- a/ci-scripts/datalog_rt_stats.default.yaml
+++ b/ci-scripts/datalog_rt_stats.default.yaml
@@ -4,16 +4,14 @@
Title : Processing Time (us)
ColNames :
- Metric
- - Average
- - Max
- - Average vs Reference Deviation (Reference Value ; Acceptability Threshold)
+ - Average; Max; Count
+ - Average vs Reference Deviation (Reference Value; Acceptability Threshold)
Ref :
feprx : 60.0
feptx_prec : 8.0
feptx_ofdm : 50.0
feptx_total : 75.0
- L1 Tx processing thread 0 : 300.0
- L1 Tx processing thread 1 : 300.0
+ L1 Tx processing : 300.0
DLSCH encoding : 230.0
L1 Rx processing : 175.0
PUSCH inner-receiver : 100.0
@@ -25,8 +23,7 @@ Threshold :
feptx_prec : 1.25
feptx_ofdm : 1.25
feptx_total : 1.25
- L1 Tx processing thread 0 : 1.25
- L1 Tx processing thread 1 : 1.25
+ L1 Tx processing : 1.25
DLSCH encoding : 1.25
L1 Rx processing : 1.25
PUSCH inner-receiver : 1.25
diff --git a/ci-scripts/html.py b/ci-scripts/html.py
index b172ffb711..13a1ab8691 100644
--- a/ci-scripts/html.py
+++ b/ci-scripts/html.py
@@ -478,21 +478,19 @@ class HTMLManagement():
self.htmlFile.write(' \n')
self.htmlFile.write('
\n')
self.htmlFile.write(' | '+ DataLog['ColNames'][0] +' | \n')
- self.htmlFile.write(' ' + DataLog['ColNames'][1] + ' | \n')
- self.htmlFile.write(' ' + DataLog['ColNames'][2] + ' | \n')
- self.htmlFile.write(' '+ DataLog['ColNames'][3] +' | \n')
+ self.htmlFile.write(' ' + DataLog['ColNames'][1] + ' | \n')
+ self.htmlFile.write(' '+ DataLog['ColNames'][2] +' | \n')
self.htmlFile.write('
\n')
for k in DataLog['Data']:
# TestRow
self.htmlFile.write(' \n')
self.htmlFile.write(' | ' + k + ' | \n')
- self.htmlFile.write(' ' + DataLog['Data'][k][0] + ' | \n')
- self.htmlFile.write(' ' + DataLog['Data'][k][1] + ' | \n')
- if float(DataLog['Data'][k][2])> DataLog['Threshold'][k]:
- self.htmlFile.write(' ' + DataLog['Data'][k][2] + ' (Ref = ' + str(DataLog['Ref'][k]) + ' ; Thres = ' +str(DataLog['Threshold'][k])+') ' + ' | \n')
+ self.htmlFile.write(' ' + DataLog['Data'][k][0] + '; ' + DataLog['Data'][k][1] + '; ' + DataLog['Data'][k][2] + ' | \n')
+ if float(DataLog['Data'][k][3])> DataLog['Threshold'][k]:
+ self.htmlFile.write(' ' + DataLog['Data'][k][3] + ' (Ref = ' + str(DataLog['Ref'][k]) + ' ; Thres = ' +str(DataLog['Threshold'][k])+') ' + ' | \n')
else:
- self.htmlFile.write(' ' + DataLog['Data'][k][2] + ' (Ref = ' + str(DataLog['Ref'][k]) + ' ; Thres = ' +str(DataLog['Threshold'][k])+') ' + ' | \n')
+ self.htmlFile.write(' ' + DataLog['Data'][k][3] + ' (Ref = ' + str(DataLog['Ref'][k]) + ' ; Thres = ' +str(DataLog['Threshold'][k])+') ' + ' | \n')
self.htmlFile.write('
\n')
self.htmlFile.close()
diff --git a/ci-scripts/ran.py b/ci-scripts/ran.py
index 9bb2a816ab..e5d0f10ee4 100644
--- a/ci-scripts/ran.py
+++ b/ci-scripts/ran.py
@@ -1174,17 +1174,19 @@ class RANManagement():
datalog_rt_stats['Data']={}
if len(real_time_stats)!=0: #check if dictionary is not empty
for k in real_time_stats:
- tmp=re.match(r'^(?P.*):\s+(?P\d+\.\d+) us;\s+\d+;\s+(?P\d+\.\d+) us;',real_time_stats[k])
+ tmp=re.match(r'^(?P.*):\s+(?P\d+\.\d+) us;\s+(?P\d+);\s+(?P\d+\.\d+) us;',real_time_stats[k])
if tmp is not None:
metric=tmp.group('metric')
avg=float(tmp.group('avg'))
max=float(tmp.group('max'))
- datalog_rt_stats['Data'][metric]=["{:.0f}".format(avg),"{:.0f}".format(max),"{:.2f}".format(avg/datalog_rt_stats['Ref'][metric])]
+ count=int(tmp.group('count'))
+ datalog_rt_stats['Data'][metric]=["{:.0f}".format(avg),"{:.0f}".format(max),"{:d}".format(count),"{:.2f}".format(avg/datalog_rt_stats['Ref'][metric])]
#once all metrics are collected, store the data as a class attribute to build a dedicated HTML table afterward
self.datalog_rt_stats=datalog_rt_stats
#check if there is a fail => will render the test as failed
for k in datalog_rt_stats['Data']:
- if float(datalog_rt_stats['Data'][k][2])> datalog_rt_stats['Threshold'][k]: #condition for fail : avg/ref is greater than the fixed threshold
+ if float(datalog_rt_stats['Data'][k][3])> datalog_rt_stats['Threshold'][k]: #condition for fail : avg/ref is greater than the fixed threshold
+ logging.debug('\u001B[1;30;43m datalog_rt_stats metric ' + k + '=' + datalog_rt_stats['Data'][k][3] + ' > threshold ' + str(datalog_rt_stats['Threshold'][k]) + ' \u001B[0m')
RealTimeProcessingIssue = True
else:
statMsg = 'No real time stats found in the log file\n'
diff --git a/ci-scripts/stats_monitor_conf.yaml b/ci-scripts/stats_monitor_conf.yaml
index 8760c067fc..9a2ececd18 100644
--- a/ci-scripts/stats_monitor_conf.yaml
+++ b/ci-scripts/stats_monitor_conf.yaml
@@ -20,8 +20,7 @@ gnb :
feptx_prec:
feptx_ofdm:
feptx_total:
- L1 Tx processing thread 0:
- L1 Tx processing thread 1:
+ L1 Tx processing:
DLSCH encoding:
L1 Rx processing:
PUSCH inner-receiver:
@@ -40,12 +39,11 @@ gnb :
rt.feptx_ofdm:
rt.feptx_total:
page3:
- rt.L1 Tx processing thread 0:
- rt.L1 Tx processing thread 1:
+ rt.L1 Tx processing:
rt.DLSCH encoding:
rt.L1 Rx processing:
page4:
rt.PUSCH inner-receiver:
rt.PUSCH decoding:
rt.DL & UL scheduling timing stats:
- rt.UL Indication:
\ No newline at end of file
+ rt.UL Indication:
diff --git a/ci-scripts/xml_files/fr1_sa_quectel_162prb.xml b/ci-scripts/xml_files/fr1_sa_quectel_162prb.xml
index 23cc6d25b8..f756083ea6 100644
--- a/ci-scripts/xml_files/fr1_sa_quectel_162prb.xml
+++ b/ci-scripts/xml_files/fr1_sa_quectel_162prb.xml
@@ -96,8 +96,8 @@
Iperf
- iperf (DL/140Mbps/UDP)(60 sec)(single-ue profile)
- -u -b 140M -t 60
+ iperf (DL/200Mbps/UDP)(60 sec)(single-ue profile)
+ -u -b 200M -t 60
DL
nrmodule2_quectel
50
diff --git a/ci-scripts/xml_files/fr1_sa_quectel_stages.xml b/ci-scripts/xml_files/fr1_sa_quectel_stages.xml
index 3e497ede13..0ab8bf6b08 100644
--- a/ci-scripts/xml_files/fr1_sa_quectel_stages.xml
+++ b/ci-scripts/xml_files/fr1_sa_quectel_stages.xml
@@ -42,6 +42,8 @@
000001
071004
000001
+ 071005
+ 000001
011002
081000
@@ -148,7 +150,16 @@
90
single-ue
-
+
+ Iperf
+ iperf (DL/130Mbps/UDP)(30 sec)(single-ue profile)
+ -u -b 130M -t 30
+ DL
+ nrmodule2_quectel
+ 50
+ 50
+ single-ue
+
diff --git a/cmake_targets/CMakeLists.txt b/cmake_targets/CMakeLists.txt
index 7c60d316e1..ffc2e26dc5 100644
--- a/cmake_targets/CMakeLists.txt
+++ b/cmake_targets/CMakeLists.txt
@@ -690,19 +690,13 @@ add_list1_option(NB_ANTENNAS_RX "4" "Number of antennas in reception" "1" "2" "4
add_list1_option(NB_ANTENNAS_TX "4" "Number of antennas in transmission" "1" "2" "4")
#NOKIA config enhancement
-set (CONFIG_ROOTDIR
- ${OPENAIR_DIR}/common/config
- )
-set (CONFIG_SOURCES
+set (CONFIG_ROOTDIR ${OPENAIR_DIR}/common/config)
+add_library(CONFIG_LIB
${CONFIG_ROOTDIR}/config_load_configmodule.c
${CONFIG_ROOTDIR}/config_userapi.c
${CONFIG_ROOTDIR}/config_cmdline.c
- )
-set (CONFIG_LIBCONFIG_SOURCES
- ${CONFIG_ROOTDIR}/libconfig/config_libconfig.c
- )
-add_library(CONFIG_LIB ${CONFIG_SOURCES})
-add_library(params_libconfig MODULE ${CONFIG_LIBCONFIG_SOURCES} )
+)
+add_library(params_libconfig MODULE ${CONFIG_ROOTDIR}/libconfig/config_libconfig.c)
target_link_libraries(params_libconfig config)
# shared library loader
set (SHLIB_LOADER_SOURCES
@@ -1161,15 +1155,6 @@ set(FSPT_MSG_LIB FSPT_MSG)
message("fspt c dir is : ${FSPT_C_DIR}")
include_directories (${FSPT_C_DIR})
-# add_library(ASYNC_IF
-# ${OPENAIR2_DIR}/UTIL/ASYNC_IF/socket_link.c
-# ${OPENAIR2_DIR}/UTIL/ASYNC_IF/link_manager.c
-# ${OPENAIR2_DIR}/UTIL/ASYNC_IF/message_queue.c
-# ${OPENAIR2_DIR}/UTIL/ASYNC_IF/ringbuffer_queue.c
-# )
-# set(ASYNC_IF_LIB ASYNC_IF)
-# include_directories(${OPENAIR2_DIR}/UTIL/ASYNC_IF)
-
set(PROTOBUF_LIB "protobuf-c")
#set(PROTOBUF_LIB "protobuf") #for Cpp
@@ -1180,55 +1165,19 @@ add_library(HASHTABLE
)
include_directories(${OPENAIR_DIR}/common/utils/hashtable)
-set(UTIL_SRC
- # ${OPENAIR2_DIR}/UTIL/CLI/cli.c
- # ${OPENAIR2_DIR}/UTIL/CLI/cli_cmd.c
- # ${OPENAIR2_DIR}/UTIL/CLI/cli_server.c
- ${OPENAIR2_DIR}/UTIL/FIFO/pad_list.c
+add_library(UTIL
${OPENAIR2_DIR}/UTIL/LISTS/list.c
${OPENAIR2_DIR}/UTIL/LISTS/list2.c
${OPENAIR_DIR}/common/utils/LOG/log.c
${OPENAIR_DIR}/common/utils/LOG/vcd_signal_dumper.c
${OPENAIR2_DIR}/UTIL/MATH/oml.c
- # ${OPENAIR2_DIR}/UTIL/MEM/mem_block.c
- # ${OPENAIR2_DIR}/UTIL/OCG/OCG.c
- # ${OPENAIR2_DIR}/UTIL/OCG/OCG_create_dir.c
- # ${OPENAIR2_DIR}/UTIL/OCG/OCG_detect_file.c
- # ${OPENAIR2_DIR}/UTIL/OCG/OCG_generate_report.c
- # ${OPENAIR2_DIR}/UTIL/OCG/OCG_parse_filename.c
- # ${OPENAIR2_DIR}/UTIL/OCG/OCG_parse_XML.c
- # ${OPENAIR2_DIR}/UTIL/OCG/OCG_save_XML.c
- # ${OPENAIR2_DIR}/UTIL/OMG/common.c
- # ${OPENAIR2_DIR}/UTIL/OMG/grid.c
- # ${OPENAIR2_DIR}/UTIL/OMG/job.c
- # ${OPENAIR2_DIR}/UTIL/OMG/mobility_parser.c
- # ${OPENAIR2_DIR}/UTIL/OMG/omg.c
- # ${OPENAIR2_DIR}/UTIL/OMG/omg_hashtable.c
- # ${OPENAIR2_DIR}/UTIL/OMG/rwalk.c
- # ${OPENAIR2_DIR}/UTIL/OMG/rwp.c
- # ${OPENAIR2_DIR}/UTIL/OMG/static.c
- # ${OPENAIR2_DIR}/UTIL/OMG/steadystaterwp.c
- # ${OPENAIR2_DIR}/UTIL/OMG/trace.c
- # ${OPENAIR2_DIR}/UTIL/OMG/trace_hashtable.c
${OPENAIR2_DIR}/UTIL/OPT/probe.c
- # ${OPENAIR2_DIR}/UTIL/OTG/otg_tx.c
- # ${OPENAIR2_DIR}/UTIL/OTG/otg.c
- # ${OPENAIR2_DIR}/UTIL/OTG/otg_kpi.c
- # ${OPENAIR2_DIR}/UTIL/OTG/otg_models.c
- # ${OPENAIR2_DIR}/UTIL/OTG/otg_form.c
- # ${OPENAIR2_DIR}/UTIL/OTG/otg_rx.c
- )
-add_library(UTIL ${UTIL_SRC})
-add_dependencies(UTIL rrc_flag)
-
-#set(OMG_SUMO_SRC
-# ${OPENAIR2_DIR}/UTIL/OMG/client_traci_OMG.c
-# ${OPENAIR2_DIR}/UTIL/OMG/id_manager.c
-# ${OPENAIR2_DIR}/UTIL/OMG/sumo.c
-# ${OPENAIR2_DIR}/UTIL/OMG/socket_traci_OMG.c
-# ${OPENAIR2_DIR}/UTIL/OMG/storage_traci_OMG.c
-# )
-#add_library(OMG_SUMO ${OMG_SUMO_SRC})
+ ${OPENAIR_DIR}/common/utils/threadPool/thread-pool.c
+ ${OPENAIR_DIR}/common/utils/utils.c
+ ${OPENAIR_DIR}/common/utils/system.c
+ ${OPENAIR_DIR}/common/utils/backtrace.c
+ ${OPENAIR_DIR}/common/utils/time_meas.c
+)
set(SECU_OSA_SRC
${OPENAIR2_DIR}/UTIL/OSA/osa_key_deriver.c
@@ -1491,7 +1440,6 @@ set(PHY_SRC_COMMON
${OPENAIR1_DIR}/PHY/TOOLS/signal_energy.c
${OPENAIR1_DIR}/PHY/TOOLS/dB_routines.c
${OPENAIR1_DIR}/PHY/TOOLS/sqrt.c
- ${OPENAIR1_DIR}/PHY/TOOLS/time_meas.c
${OPENAIR1_DIR}/PHY/TOOLS/lut.c
)
@@ -1628,7 +1576,6 @@ set(PHY_SRC_UE
${OPENAIR1_DIR}/PHY/TOOLS/signal_energy.c
${OPENAIR1_DIR}/PHY/TOOLS/dB_routines.c
${OPENAIR1_DIR}/PHY/TOOLS/sqrt.c
- ${OPENAIR1_DIR}/PHY/TOOLS/time_meas.c
${OPENAIR1_DIR}/PHY/TOOLS/lut.c
${PHY_POLARSRC}
${PHY_SMALLBLOCKSRC}
@@ -1682,7 +1629,6 @@ set(PHY_SRC_UE
${OPENAIR1_DIR}/PHY/TOOLS/signal_energy.c
${OPENAIR1_DIR}/PHY/TOOLS/dB_routines.c
${OPENAIR1_DIR}/PHY/TOOLS/sqrt.c
- ${OPENAIR1_DIR}/PHY/TOOLS/time_meas.c
${OPENAIR1_DIR}/PHY/TOOLS/lut.c
${OPENAIR1_DIR}/PHY/INIT/nr_init_ue.c
# ${OPENAIR1_DIR}/SIMULATION/NR_UE_PHY/unit_tests/src/pucch_uci_test.c
@@ -1910,6 +1856,7 @@ set(NR_L2_SRC_UE
${NR_SDAP_SRC}
${NR_UE_RRC_DIR}/L2_interface_ue.c
${NR_UE_RRC_DIR}/main_ue.c
+ ${NR_RRC_DIR}/nr_rrc_config.c
${NR_UE_RRC_DIR}/rrc_UE.c
${NR_UE_RRC_DIR}/rrc_nsa.c
)
@@ -2601,7 +2548,7 @@ add_library(minimal_lib
${OPENAIR_DIR}/common/utils/minimal_stub.c
${T_SOURCE}
)
-target_link_libraries(minimal_lib pthread dl ${T_LIB} ${CONFIG_LIB})
+target_link_libraries(minimal_lib pthread dl ${T_LIB} CONFIG_LIB)
add_executable(nfapi_test
${OPENAIR_DIR}/openair2/NR_PHY_INTERFACE/nfapi_5g_test.c
@@ -2630,7 +2577,6 @@ add_executable(lte-softmodem
${OPENAIR_TARGETS}/RT/USER/lte-ru.c
${OPENAIR_TARGETS}/RT/USER/ru_control.c
${OPENAIR_TARGETS}/RT/USER/lte-softmodem.c
- ${OPENAIR_DIR}/common/utils/threadPool/thread-pool.c
${OPENAIR_DIR}/executables/softmodem-common.c
${OPENAIR2_DIR}/ENB_APP/NB_IoT_interface.c
${OPENAIR1_DIR}/SIMULATION/TOOLS/taus.c
@@ -2645,14 +2591,11 @@ add_executable(lte-softmodem
${OPENAIR1_DIR}/SIMULATION/ETH_TRANSPORT/multicast_link.c
${OPENAIR1_DIR}/SIMULATION/ETH_TRANSPORT/socket.c
${OPENAIR3_DIR}/NAS/UE/nas_ue_task.c
- ${OPENAIR_DIR}/common/utils/utils.c
- ${OPENAIR_DIR}/common/utils/system.c
${PHY_INTERFACE_DIR}/queue_t.c
${OPENAIR_DIR}/common/utils/lte/ue_power.c
${OPENAIR_DIR}/common/utils/lte/prach_utils.c
${XFORMSINTERFACE_SOURCE}
${T_SOURCE}
- ${CONFIG_SOURCES}
${SHLIB_LOADER_SOURCES}
)
add_dependencies(lte-softmodem rrc_flag s1ap_flag x2_flag oai_iqplayer)
@@ -2665,14 +2608,13 @@ target_link_libraries (lte-softmodem
-Wl,--end-group z dl)
target_link_libraries (lte-softmodem ${LIBXML2_LIBRARIES})
-target_link_libraries (lte-softmodem pthread m ${CONFIG_LIB} rt crypt ${CRYPTO_LIBRARIES} ${OPENSSL_LIBRARIES} sctp ${PROTOBUF_LIB} ${CMAKE_DL_LIBS} ${LIBYAML_LIBRARIES})
+target_link_libraries (lte-softmodem pthread m CONFIG_LIB rt crypt ${CRYPTO_LIBRARIES} ${OPENSSL_LIBRARIES} sctp ${PROTOBUF_LIB} ${CMAKE_DL_LIBS} ${LIBYAML_LIBRARIES})
target_link_libraries (lte-softmodem ${LIB_LMS_LIBRARIES})
target_link_libraries (lte-softmodem ${T_LIB})
add_executable(ocp-enb
${OPENAIR_DIR}/executables/main-ocp.c
- ${OPENAIR_DIR}/common/utils/threadPool/thread-pool.c
${OPENAIR_DIR}/executables/softmodem-common.c
${OPENAIR_DIR}/executables/main-fs6.c
${OPENAIR_DIR}/executables/transport_split.c
@@ -2688,14 +2630,11 @@ add_executable(ocp-enb
${OPENAIR1_DIR}/SIMULATION/ETH_TRANSPORT/multicast_link.c
${OPENAIR1_DIR}/SIMULATION/ETH_TRANSPORT/socket.c
${OPENAIR3_DIR}/NAS/UE/nas_ue_task.c
- ${OPENAIR_DIR}/common/utils/utils.c
- ${OPENAIR_DIR}/common/utils/system.c
${OPENAIR_DIR}/common/utils/lte/ue_power.c
${OPENAIR_DIR}/common/utils/lte/prach_utils.c
${PHY_INTERFACE_DIR}/queue_t.c
${XFORMSINTERFACE_SOURCE}
${T_SOURCE}
- ${CONFIG_SOURCES}
${SHLIB_LOADER_SOURCES}
)
add_dependencies(ocp-enb rrc_flag s1ap_flag x2_flag oai_iqplayer coding params_libconfig rfsimulator)
@@ -2707,7 +2646,7 @@ target_link_libraries (ocp-enb
PHY_COMMON PHY PHY_RU LFDS L2 L2_LTE NFAPI_COMMON_LIB NFAPI_LIB MISC_NFAPI_LTE_LIB NFAPI_VNF_LIB NFAPI_PNF_LIB NFAPI_USER_LIB LFDS7 SIMU_COMMON
${RAL_LIB} ${NAS_UE_LIB} ITTI ${FLPT_MSG_LIB} ${ASYNC_IF_LIB} ${FLEXRAN_AGENT_LIB} ${FSPT_MSG_LIB}
-Wl,--end-group z dl)
-target_link_libraries (ocp-enb ${LIBXML2_LIBRARIES} pthread m ${CONFIG_LIBRARIES} rt crypt ${CRYPTO_LIBRARIES} ${OPENSSL_LIBRARIES} sctp ${PROTOBUF_LIB} ${CMAKE_DL_LIBS} ${LIBYAML_LIBRARIES} ${LIB_LMS_LIBRARIES} ${T_LIB})
+target_link_libraries (ocp-enb ${LIBXML2_LIBRARIES} pthread m CONFIG_LIB rt crypt ${CRYPTO_LIBRARIES} ${OPENSSL_LIBRARIES} sctp ${PROTOBUF_LIB} ${CMAKE_DL_LIBS} ${LIBYAML_LIBRARIES} ${LIB_LMS_LIBRARIES} ${T_LIB})
add_executable(oairu
${OPENAIR_TARGETS}/RT/USER/lte-ru.c
@@ -2716,23 +2655,18 @@ add_executable(oairu
${OPENAIR_TARGETS}/ARCH/COMMON/record_player.c
${OPENAIR_DIR}/executables/softmodem-common.c
${OPENAIR_DIR}/openair1/SCHED/phy_procedures_lte_common.c
- ${OPENAIR_DIR}/common/utils/threadPool/thread-pool.c
${OPENAIR_DIR}/executables/main_ru.c
${T_SOURCE}
- ${OPENAIR_DIR}/common/utils/LOG/log.c
- ${CONFIG_SOURCES}
- ${OPENAIR_DIR}/common/utils/utils.c
- ${OPENAIR_DIR}/common/utils/system.c
${OPENAIR_DIR}/common/utils/lte/prach_utils.c
${SHLIB_LOADER_SOURCES}
)
target_link_libraries (oairu
-Wl,--start-group
SCHED_RU_LIB
- PHY_COMMON PHY_RU
+ PHY_COMMON PHY_RU UTIL
-Wl,--end-group z dl)
-target_link_libraries (oairu pthread m ${CONFIG_LIB} rt ${CMAKE_DL_LIBS} ${T_LIB})
+target_link_libraries (oairu pthread m CONFIG_LIB rt ${CMAKE_DL_LIBS} ${T_LIB})
# lte-uesoftmodem is UE implementation
@@ -2751,13 +2685,10 @@ add_executable(lte-uesoftmodem
${OPENAIR1_DIR}/SIMULATION/ETH_TRANSPORT/multicast_link.c
${OPENAIR1_DIR}/SIMULATION/ETH_TRANSPORT/socket.c
${OPENAIR3_DIR}/NAS/UE/nas_ue_task.c
- ${OPENAIR_DIR}/common/utils/utils.c
- ${OPENAIR_DIR}/common/utils/system.c
${OPENAIR_DIR}/common/utils/lte/ue_power.c
${OPENAIR_DIR}/common/utils/lte/prach_utils.c
${XFORMSINTERFACE_SOURCE}
${T_SOURCE}
- ${CONFIG_SOURCES}
${SHLIB_LOADER_SOURCES}
)
@@ -2775,7 +2706,7 @@ target_link_libraries (lte-uesoftmodem
-Wl,--end-group z dl)
target_link_libraries (lte-uesoftmodem ${LIBXML2_LIBRARIES})
-target_link_libraries (lte-uesoftmodem pthread m ${CONFIG_LIB} rt crypt ${CRYPTO_LIBRARIES} ${OPENSSL_LIBRARIES} sctp ${CMAKE_DL_LIBS} ${LIBYAML_LIBRARIES} ${ATLAS_LIBRARIES})
+target_link_libraries (lte-uesoftmodem pthread m CONFIG_LIB rt crypt ${CRYPTO_LIBRARIES} ${OPENSSL_LIBRARIES} sctp ${CMAKE_DL_LIBS} ${LIBYAML_LIBRARIES} ${ATLAS_LIBRARIES})
target_link_libraries (lte-uesoftmodem ${LIB_LMS_LIBRARIES})
target_link_libraries (lte-uesoftmodem ${T_LIB})
@@ -2788,7 +2719,6 @@ add_executable(nr-softmodem
${s1ap_h}
# ${OPENAIR_BIN_DIR}/messages_xml.h
${OPENAIR_DIR}/executables/nr-gnb.c
- ${OPENAIR_DIR}/common/utils/threadPool/thread-pool.c
${OPENAIR_DIR}/executables/nr-ru.c
${OPENAIR_DIR}/executables/nr-softmodem.c
${OPENAIR_DIR}/executables/softmodem-common.c
@@ -2798,15 +2728,12 @@ add_executable(nr-softmodem
${OPENAIR2_DIR}/RRC/NAS/nas_config.c
${OPENAIR2_DIR}/RRC/NAS/rb_config.c
${OPENAIR1_DIR}/SIMULATION/ETH_TRANSPORT/netlink_init.c
- ${OPENAIR_DIR}/common/utils/utils.c
- ${OPENAIR_DIR}/common/utils/system.c
${OPENAIR_DIR}/common/utils/lte/ue_power.c
${OPENAIR_DIR}/common/utils/lte/prach_utils.c
${OPENAIR_DIR}/common/utils/nr/nr_common.c
${PHY_INTERFACE_DIR}/queue_t.c
${XFORMSINTERFACE_SOURCE}
${T_SOURCE}
- ${CONFIG_SOURCES}
${SHLIB_LOADER_SOURCES}
${OPENAIR2_DIR}/ENB_APP/flexran_agent_ran_api_to_fix.c
)
@@ -2820,52 +2747,12 @@ target_link_libraries (nr-softmodem
-Wl,--end-group z dl)
target_link_libraries (nr-softmodem ${LIBXML2_LIBRARIES})
-target_link_libraries (nr-softmodem pthread m ${CONFIG_LIB} rt crypt ${CRYPTO_LIBRARIES} ${OPENSSL_LIBRARIES} sctp ${XFORMS_LIBRARIES} ${PROTOBUF_LIB} ${CMAKE_DL_LIBS} ${LIBYAML_LIBRARIES} ${ATLAS_LIBRARIES})
+target_link_libraries (nr-softmodem pthread m CONFIG_LIB rt crypt ${CRYPTO_LIBRARIES} ${OPENSSL_LIBRARIES} sctp ${XFORMS_LIBRARIES} ${PROTOBUF_LIB} ${CMAKE_DL_LIBS} ${LIBYAML_LIBRARIES} ${ATLAS_LIBRARIES})
target_link_libraries (nr-softmodem ${LIB_LMS_LIBRARIES})
target_link_libraries (nr-softmodem ${T_LIB})
add_dependencies( nr-softmodem ldpc_orig ldpc_optim ldpc_optim8seg ldpc )
-add_executable(ocp-gnb
- ${rrc_h}
- ${nr_rrc_h}
- ${s1ap_h}
-# ${OPENAIR_BIN_DIR}/messages_xml.h
- ${OPENAIR_DIR}/executables/ocp-gnb.c
- ${OPENAIR_DIR}/common/utils/threadPool/thread-pool.c
- ${OPENAIR_DIR}/executables/softmodem-common.c
- ${OPENAIR1_DIR}/SIMULATION/TOOLS/taus.c
- ${OPENAIR_TARGETS}/ARCH/COMMON/common_lib.c
- ${OPENAIR_TARGETS}/ARCH/COMMON/record_player.c
- ${OPENAIR2_DIR}/RRC/NAS/nas_config.c
- ${OPENAIR2_DIR}/RRC/NAS/rb_config.c
- ${OPENAIR1_DIR}/SIMULATION/ETH_TRANSPORT/netlink_init.c
- ${OPENAIR_DIR}/common/utils/nr/nr_common.c
- ${OPENAIR_DIR}/common/utils/utils.c
- ${OPENAIR_DIR}/common/utils/system.c
- ${PHY_INTERFACE_DIR}/queue_t.c
- ${XFORMS_SOURCE_NR}
- ${T_SOURCE}
- ${CONFIG_SOURCES}
- ${SHLIB_LOADER_SOURCES}
- ${XFORMSINTERFACE_SOURCE}
- )
-
-target_link_libraries (ocp-gnb
- -Wl,--start-group
- UTIL HASHTABLE SCTP_CLIENT SCHED_LIB SCHED_RU_LIB SCHED_NR_LIB PHY_NR PHY PHY_COMMON PHY_NR_COMMON PHY_RU LFDS GTPV1U SECU_CN SECU_OSA
- ITTI ${FLPT_MSG_LIB} ${ASYNC_IF_LIB} LFDS7 ${RAL_LIB} ${NAS_UE_LIB} RRC_LIB NR_RRC_LIB
- NGAP_LIB NGAP_GNB S1AP_LIB S1AP_ENB L2_LTE_NR L2_NR MAC_NR_COMMON NFAPI_COMMON_LIB NFAPI_LIB NFAPI_VNF_LIB NFAPI_PNF_LIB NFAPI_USER_LIB
- X2AP_LIB X2AP_ENB F1AP_LIB F1AP M2AP_LIB M2AP_ENB M3AP_LIB M3AP_ENB SIMU_COMMON
- -Wl,--end-group z dl)
-
-target_link_libraries (ocp-gnb ${LIBXML2_LIBRARIES} )
-target_link_libraries (ocp-gnb pthread m ${CONFIG_LIB} rt crypt ${CRYPTO_LIBRARIES} ${OPENSSL_LIBRARIES} sctp ${XFORMS_LIBRARIES} ${PROTOBUF_LIB} ${CMAKE_DL_LIBS} ${LIBYAML_LIBRARIES} ${ATLAS_LIBRARIES})
-target_link_libraries (ocp-gnb ${LIB_LMS_LIBRARIES})
-target_link_libraries (ocp-gnb ${T_LIB})
-add_dependencies(ocp-gnb ldpc_orig ldpc_optim ldpc_optim8seg ldpc params_libconfig rfsimulator oai_usrpdevif rfsimulator nrscope)
-
-
# nr-uesoftmodem is UE implementation
#######################################
@@ -2873,7 +2760,6 @@ add_executable(nr-uesoftmodem
${rrc_h}
${s1ap_h}
# ${OPENAIR_BIN_DIR}/messages_xml.h
- ${OPENAIR_DIR}/common/utils/threadPool/thread-pool.c
${OPENAIR_DIR}/executables/nr-uesoftmodem.c
${OPENAIR_DIR}/executables/nr-ue.c
${OPENAIR_DIR}/executables/softmodem-common.c
@@ -2885,13 +2771,9 @@ add_executable(nr-uesoftmodem
${OPENAIR2_DIR}/RRC/NAS/rb_config.c
${OPENAIR1_DIR}/SIMULATION/ETH_TRANSPORT/netlink_init.c
${OPENAIR3_DIR}/NAS/UE/nas_ue_task.c
- ${OPENAIR_DIR}/common/utils/utils.c
- ${OPENAIR_DIR}/common/utils/system.c
${OPENAIR_DIR}/common/utils/nr/nr_common.c
${XFORMSINTERFACE_SOURCE}
${T_SOURCE}
- ${UTIL_SRC}
- ${CONFIG_SOURCES}
${SHLIB_LOADER_SOURCES}
)
@@ -2906,7 +2788,7 @@ target_link_libraries (nr-uesoftmodem
-Wl,--end-group z dl)
target_link_libraries (nr-uesoftmodem ${LIBXML2_LIBRARIES})
-target_link_libraries (nr-uesoftmodem pthread m ${CONFIG_LIB} rt crypt ${CRYPTO_LIBRARIES} ${OPENSSL_LIBRARIES} sctp ${XFORMS_LIBRARIES} ${CMAKE_DL_LIBS} ${LIBYAML_LIBRARIES} ${ATLAS_LIBRARIES})
+target_link_libraries (nr-uesoftmodem pthread m CONFIG_LIB rt crypt ${CRYPTO_LIBRARIES} ${OPENSSL_LIBRARIES} sctp ${XFORMS_LIBRARIES} ${CMAKE_DL_LIBS} ${LIBYAML_LIBRARIES} ${ATLAS_LIBRARIES})
target_link_libraries (nr-uesoftmodem ${LIB_LMS_LIBRARIES})
target_link_libraries (nr-uesoftmodem ${T_LIB})
@@ -2914,7 +2796,6 @@ add_dependencies( nr-uesoftmodem ldpc_orig ldpc_optim ldpc_optim8seg ldpc )
if (CUDA_FOUND)
add_dependencies( nr-uesoftmodem ldpc_cuda)
add_dependencies( nr-softmodem ldpc_cuda)
- add_dependencies( ocp-gnb ldpc_cuda)
endif (CUDA_FOUND)
###################################"
# Addexecutables for tests
@@ -2928,30 +2809,25 @@ endif (CUDA_FOUND)
add_executable(dlsim_tm4
${OPENAIR1_DIR}/SIMULATION/LTE_PHY/dlsim_tm4.c
${OPENAIR1_DIR}/PHY/TOOLS/lte_phy_scope_tm4.c
- ${OPENAIR_DIR}/common/utils/system.c
${T_SOURCE}
)
target_link_libraries (dlsim_tm4
-Wl,--start-group SIMU_COMMON SIMU UTIL SCHED_LIB SCHED_RU_LIB PHY LFDS ITTI -Wl,--end-group
- pthread m rt ${CONFIG_LIB} ${ATLAS_LIBRARIES} ${T_LIB}
+ pthread m rt CONFIG_LIB ${ATLAS_LIBRARIES} ${T_LIB}
)
add_executable(rftest
${OPENAIR_DIR}/openair1/PHY/TOOLS/calibration_test.c
${OPENAIR_DIR}/openair1/PHY/TOOLS/calibration_scope.c
- ${OPENAIR_DIR}/common/utils/system.c
${OPENAIR_TARGETS}/ARCH/COMMON/common_lib.c
${OPENAIR_DIR}/executables/softmodem-common.c
- ${CONFIG_SOURCES}
${SHLIB_LOADER_SOURCES}
)
-target_link_libraries(rftest minimal_lib PHY_NR_COMMON pthread dl m forms ${T_LIB} )
+target_link_libraries(rftest minimal_lib CONFIG_LIB PHY_NR_COMMON UTIL pthread dl m forms ${T_LIB} )
add_executable(polartest
${OPENAIR1_DIR}/PHY/CODING/TESTBENCH/polartest.c
- ${OPENAIR_DIR}/common/utils/backtrace.c
${OPENAIR_DIR}/common/utils/nr/nr_common.c
- ${OPENAIR_DIR}/common/utils/system.c
${T_SOURCE}
${SHLIB_LOADER_SOURCES}
)
@@ -2962,9 +2838,7 @@ target_link_libraries(polartest
add_executable(smallblocktest
${OPENAIR1_DIR}/PHY/CODING/TESTBENCH/smallblocktest.c
- ${OPENAIR_DIR}/common/utils/backtrace.c
${OPENAIR_DIR}/common/utils/nr/nr_common.c
- ${OPENAIR_DIR}/common/utils/system.c
${T_SOURCE}
${SHLIB_LOADER_SOURCES}
)
@@ -2994,11 +2868,7 @@ target_link_libraries(ldpctest
add_executable(nr_dlschsim
${OPENAIR1_DIR}/SIMULATION/NR_PHY/dlschsim.c
- ${OPENAIR_DIR}/common/utils/system.c
${OPENAIR_DIR}/common/utils/nr/nr_common.c
- ${OPENAIR_DIR}/common/utils/utils.c
- ${OPENAIR_DIR}/common/utils/threadPool/thread-pool.c
- ${UTIL_SRC}
${T_SOURCE}
${SHLIB_LOADER_SOURCES}
)
@@ -3009,11 +2879,7 @@ target_link_libraries(nr_dlschsim
add_executable(nr_pbchsim
${OPENAIR1_DIR}/SIMULATION/NR_PHY/pbchsim.c
- ${OPENAIR_DIR}/common/utils/system.c
${OPENAIR_DIR}/common/utils/nr/nr_common.c
- ${OPENAIR_DIR}/common/utils/utils.c
- ${OPENAIR_DIR}/common/utils/threadPool/thread-pool.c
- ${UTIL_SRC}
${T_SOURCE}
${SHLIB_LOADER_SOURCES}
)
@@ -3025,12 +2891,7 @@ target_link_libraries(nr_pbchsim
#PUCCH ---> Prashanth
add_executable(nr_pucchsim
${OPENAIR1_DIR}/SIMULATION/NR_PHY/pucchsim.c
- ${OPENAIR_DIR}/common/utils/backtrace.c
${OPENAIR_DIR}/common/utils/nr/nr_common.c
- ${OPENAIR_DIR}/common/utils/system.c
- ${OPENAIR_DIR}/common/utils/utils.c
- ${OPENAIR_DIR}/common/utils/threadPool/thread-pool.c
- ${UTIL_SRC}
${T_SOURCE}
${SHLIB_LOADER_SOURCES}
)
@@ -3041,17 +2902,13 @@ target_link_libraries(nr_pucchsim
add_executable(nr_dlsim
${OPENAIR1_DIR}/SIMULATION/NR_PHY/dlsim.c
- ${OPENAIR_DIR}/common/utils/utils.c
- ${OPENAIR_DIR}/common/utils/system.c
${OPENAIR_DIR}/common/utils/nr/nr_common.c
${OPENAIR_DIR}/executables/softmodem-common.c
${OPENAIR2_DIR}/RRC/NAS/nas_config.c
${OPENAIR1_DIR}/SIMULATION/ETH_TRANSPORT/netlink_init.c
${NR_UE_RRC_DIR}/rrc_nsa.c
${NFAPI_USER_DIR}/nfapi.c
- ${OPENAIR_DIR}/common/utils/threadPool/thread-pool.c
${PHY_INTERFACE_DIR}/queue_t.c
- ${UTIL_SRC}
${T_SOURCE}
${SHLIB_LOADER_SOURCES}
)
@@ -3063,17 +2920,13 @@ target_compile_definitions(nr_dlsim PUBLIC -DPHYSICAL_SIMULATOR)
add_executable(nr_prachsim
${OPENAIR1_DIR}/SIMULATION/NR_PHY/prachsim.c
- ${OPENAIR_DIR}/common/utils/utils.c
- ${OPENAIR_DIR}/common/utils/system.c
${OPENAIR_DIR}/common/utils/nr/nr_common.c
${OPENAIR1_DIR}/SCHED_NR/phy_procedures_nr_common.c
${OPENAIR2_DIR}/RRC/NAS/nas_config.c
${OPENAIR1_DIR}/SIMULATION/ETH_TRANSPORT/netlink_init.c
${NR_UE_RRC_DIR}/rrc_nsa.c
${NFAPI_USER_DIR}/nfapi.c
- ${OPENAIR_DIR}/common/utils/threadPool/thread-pool.c
${PHY_INTERFACE_DIR}/queue_t.c
- ${UTIL_SRC}
${T_SOURCE}
${SHLIB_LOADER_SOURCES})
target_link_libraries(nr_prachsim
@@ -3082,12 +2935,8 @@ target_link_libraries(nr_prachsim
add_executable(nr_ulschsim
${OPENAIR1_DIR}/SIMULATION/NR_PHY/ulschsim.c
- ${OPENAIR_DIR}/common/utils/threadPool/thread-pool.c
- ${OPENAIR_DIR}/common/utils/utils.c
- ${OPENAIR_DIR}/common/utils/system.c
${OPENAIR_DIR}/common/utils/nr/nr_common.c
${PHY_INTERFACE_DIR}/queue_t.c
- ${UTIL_SRC}
${T_SOURCE}
${SHLIB_LOADER_SOURCES}
)
@@ -3098,9 +2947,6 @@ target_link_libraries(nr_ulschsim
add_executable(nr_ulsim
${OPENAIR1_DIR}/SIMULATION/NR_PHY/ulsim.c
- ${OPENAIR_DIR}/common/utils/threadPool/thread-pool.c
- ${OPENAIR_DIR}/common/utils/utils.c
- ${OPENAIR_DIR}/common/utils/system.c
${OPENAIR_DIR}/common/utils/nr/nr_common.c
${OPENAIR_DIR}/executables/softmodem-common.c
${OPENAIR2_DIR}/RRC/NAS/nas_config.c
@@ -3108,7 +2954,6 @@ add_executable(nr_ulsim
${NR_UE_RRC_DIR}/rrc_nsa.c
${NFAPI_USER_DIR}/nfapi.c
${PHY_INTERFACE_DIR}/queue_t.c
- ${UTIL_SRC}
${T_SOURCE}
${SHLIB_LOADER_SOURCES}
)
@@ -3122,58 +2967,21 @@ foreach(myExe dlsim dlsim_tm7 ulsim pbchsim scansim mbmssim pdcchsim pucchsim pr
add_executable(${myExe}
${OPENAIR1_DIR}/SIMULATION/LTE_PHY/${myExe}.c
- ${OPENAIR_DIR}/common/utils/threadPool/thread-pool.c
- ${OPENAIR_DIR}/common/utils/backtrace.c
- ${OPENAIR_DIR}/common/utils/system.c
- ${OPENAIR_DIR}/common/utils/utils.c
${OPENAIR_DIR}/common/utils/lte/ue_power.c
${OPENAIR_DIR}/common/utils/lte/prach_utils.c
${OPENAIR1_DIR}/PHY/INIT/lte_param_init.c
${XFORMS_SOURCE}
${T_SOURCE}
- ${CONFIG_SOURCES}
${SHLIB_LOADER_SOURCES}
${NFAPI_USER_DIR}/nfapi.c
)
target_link_libraries (${myExe}
-Wl,--start-group SIMU_COMMON SIMU UTIL SCHED_LIB SCHED_RU_LIB SCHED_UE_LIB PHY_COMMON PHY_NR_COMMON PHY PHY_UE PHY_RU LFDS ITTI LFDS7 -Wl,--end-group
- pthread m rt ${CONFIG_LIB} ${ATLAS_LIBRARIES} ${XFORMS_LIBRARIES} ${T_LIB} dl
+ pthread m rt CONFIG_LIB ${ATLAS_LIBRARIES} ${XFORMS_LIBRARIES} ${T_LIB} dl
)
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
- ${OPENAIR3_DIR}/S1AP/s1ap_eNB_defs.h
- )
-target_link_libraries (test_epc_generate_scenario
- -Wl,--start-group RRC_LIB S1AP_LIB S1AP_ENB X2AP_LIB X2AP_ENB M2AP_LIB M2AP_ENB M3AP_LIB M3AP_ENB F1AP_LIB F1AP GTPV1U LIB_NAS_UE SECU_CN UTIL HASHTABLE SCTP_CLIENT MME_APP SCHED_LIB PHY LFDS ITTI L2 -Wl,--end-group pthread m rt crypt sctp ${LIBXML2_LIBRARIES} ${LIBXSLT_LIBRARIES} ${CRYPTO_LIBRARIES} ${OPENSSL_LIBRARIES} ${CONFIG_LIB}
- )
-
-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
- )
-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 X2AP_ENB M3AP_LIB M3AP_ENB F1AP_LIB F1AP GTPV1U LIB_NAS_UE SECU_CN UTIL HASHTABLE SCTP_CLIENT MME_APP SCHED_LIB PHY_NR_COMMON PHY_COMMON PHY PHY_UE LFDS ITTI -Wl,--end-group pthread m rt crypt sctp ${LIBXML2_LIBRARIES} ${LIBXSLT_LIBRARIES} ${CRYPTO_LIBRARIES} ${OPENSSL_LIBRARIES} ${CONFIG_LIB}
- )
-
-
#unitary tests for Core NEtwork pieces
#################################
foreach(myExe s1ap
@@ -3190,7 +2998,7 @@ foreach(myExe s1ap
${OPENAIR3_DIR}/TEST/test_${myExe}.c
)
target_link_libraries (test_${myExe}
- -Wl,--start-group SECU_CN UTIL LFDS -Wl,--end-group m rt crypt ${CRYPTO_LIBRARIES} ${OPENSSL_LIBRARIES} ${CONFIG_LIB}
+ -Wl,--start-group SECU_CN UTIL LFDS -Wl,--end-group m rt crypt ${CRYPTO_LIBRARIES} ${OPENSSL_LIBRARIES} CONFIG_LIB
)
endforeach(myExe)
@@ -3309,16 +3117,12 @@ add_executable(nr-ittisim
${OPENAIR2_DIR}/RRC/NAS/rb_config.c
${OPENAIR1_DIR}/SIMULATION/ETH_TRANSPORT/netlink_init.c
${OPENAIR3_DIR}/NAS/UE/nas_ue_task.c
- ${OPENAIR_DIR}/common/utils/utils.c
- ${OPENAIR_DIR}/common/utils/system.c
${OPENAIR_DIR}/common/utils/nr/nr_common.c
- ${OPENAIR_DIR}/common/utils/threadPool/thread-pool.c
${OPENAIR_DIR}/common/utils/lte/ue_power.c
${OPENAIR_DIR}/common/utils/lte/prach_utils.c
${OPENAIR2_DIR}/ENB_APP/flexran_agent_ran_api_to_fix.c
${XFORMSINTERFACE_SOURCE}
${T_SOURCE}
- ${CONFIG_SOURCES}
${SHLIB_LOADER_SOURCES}
)
@@ -3332,7 +3136,7 @@ target_link_libraries (nr-ittisim
-Wl,--end-group z dl)
target_link_libraries (nr-ittisim ${LIBXML2_LIBRARIES})
-target_link_libraries (nr-ittisim pthread m ${CONFIG_LIB} rt crypt ${CRYPTO_LIBRARIES} ${OPENSSL_LIBRARIES} ${NETTLE_LIBRARIES} sctp ${XFORMS_LIBRARIES} ${PROTOBUF_LIB} ${CMAKE_DL_LIBS} ${LIBYAML_LIBRARIES} ${ATLAS_LIBRARIES})
+target_link_libraries (nr-ittisim pthread m CONFIG_LIB rt crypt ${CRYPTO_LIBRARIES} ${OPENSSL_LIBRARIES} ${NETTLE_LIBRARIES} sctp ${XFORMS_LIBRARIES} ${PROTOBUF_LIB} ${CMAKE_DL_LIBS} ${LIBYAML_LIBRARIES} ${ATLAS_LIBRARIES})
target_link_libraries (nr-ittisim ${LIB_LMS_LIBRARIES})
target_link_libraries (nr-ittisim ${T_LIB})
diff --git a/cmake_targets/autotests/test_case_list.xml b/cmake_targets/autotests/test_case_list.xml
index 6450b64298..7497fb419c 100755
--- a/cmake_targets/autotests/test_case_list.xml
+++ b/cmake_targets/autotests/test_case_list.xml
@@ -1093,17 +1093,18 @@
(Test8: 217 PRB 100 PDSCH-PRBs 110 PDSCH-Offset),
(Test9: 106 PRBs 50 PDSCH-PRBs MCS Index 27),
(Test10: 106 PRBs 50 PDSCH-PRBs MCS Index 16),
- (Test11: HARQ test 25% TP (4 rounds),
- (Test12: HARQ test 33% TP (3 rounds),
- (Test13: HARQ test 50% TP (2 rounds),
- (Test14: 3 PTRS, 8 Interpolated Symbols),
- (Test15: 6 PTRS, 5 Interpolated Symbols),
- (Test16: 11 PTRS, 0 Interpolated Symbols),
- (Test17: Mapping type A, 2 DMRS Symbols),
- (Test18: Mapping type A, 3 DMRS Symbols),
- (Test19: Mapping type B, 4 DMRS Symbols),
- (Test20: 4x4 MIMO, 1 Layer),
- (Test21: 4x4 MIMO, 2 Layers)
+ (Test11: 106 MCS-TABLE 256 QAM MCS Index 26),
+ (Test12: HARQ test 25% TP (4 rounds),
+ (Test13: HARQ test 33% TP (3 rounds),
+ (Test14: HARQ test 50% TP (2 rounds),
+ (Test15: 3 PTRS, 8 Interpolated Symbols),
+ (Test16: 6 PTRS, 5 Interpolated Symbols),
+ (Test17: 11 PTRS, 0 Interpolated Symbols),
+ (Test18: Mapping type A, 2 DMRS Symbols),
+ (Test19: Mapping type A, 3 DMRS Symbols),
+ (Test20: Mapping type B, 4 DMRS Symbols),
+ (Test21: 4x4 MIMO, 1 Layer),
+ (Test22: 4x4 MIMO, 2 Layers)
$OPENAIR_DIR/cmake_targets/build_oai
--phy_simulators -c
@@ -1118,8 +1119,9 @@
-n100 -R217 -b100 -s5
-n100 -R217 -a80 -s5
-n100 -R217 -a110 -s5 -b100
- -n100 -e27 -s30
- -n100 -e16 -s10
+ -n100 -e27 -s30
+ -n100 -e16 -s10
+ -n100 -q1 -e27 -s30
-n100 -s1 -t25
-n100 -s1 -t33
-n100 -s1 -t50
@@ -1131,7 +1133,7 @@
-n100 -s2 -U 2 1 3
-n10 -s20 -U 3 0 0 2 -gR -x1 -y4 -z4
-n10 -s20 -U 3 0 0 2 -gR -x2 -y4 -z4
- nr_dlsim.test1 nr_dlsim.test2 nr_dlsim.test3 nr_dlsim.test4 nr_dlsim.test5 nr_dlsim.test6 nr_dlsim.test7 nr_dlsim.test8 nr_dlsim.test9 nr_dlsim.test10 nr_dlsim.test11 nr_dlsim.test12 nr_dlsim.test13 nr_dlsim.test14 nr_dlsim.test15 nr_dlsim.test16 nr_dlsim.test17 nr_dlsim.test18 nr_dlsim.test19 nr_dlsim.test20 nr_dlsim.test21
+ nr_dlsim.test1 nr_dlsim.test2 nr_dlsim.test3 nr_dlsim.test4 nr_dlsim.test5 nr_dlsim.test6 nr_dlsim.test7 nr_dlsim.test8 nr_dlsim.test9 nr_dlsim.test10 nr_dlsim.test11 nr_dlsim.test12 nr_dlsim.test13 nr_dlsim.test14 nr_dlsim.test15 nr_dlsim.test16 nr_dlsim.test17 nr_dlsim.test18 nr_dlsim.test19 nr_dlsim.test20 nr_dlsim.test21 nr_dlsim.test22
PDSCH test OK
segmentation fault|assertion|exiting|fatal
3
diff --git a/common/utils/LOG/log.h b/common/utils/LOG/log.h
index d73fc03ed9..1f19d55878 100644
--- a/common/utils/LOG/log.h
+++ b/common/utils/LOG/log.h
@@ -473,130 +473,6 @@ int32_t write_file_matlab(const char *fname, const char *vname, void *data, int
/* @}*/
-static __inline__ uint64_t rdtsc(void) {
- uint32_t a, d;
- __asm__ volatile ("rdtsc" : "=a" (a), "=d" (d));
- return (((uint64_t)d)<<32) | ((uint64_t)a);
-}
-
-#define DEBUG_REALTIME 1
-#if DEBUG_REALTIME
-
-extern double cpuf;
-
-static inline uint64_t checkTCPU(int timeout,
- char *file,
- int line)
-{
- static uint64_t __thread lastCPUTime=0;
- static uint64_t __thread last=0;
- uint64_t cur=rdtsc();
- struct timespec CPUt;
- clock_gettime(CLOCK_THREAD_CPUTIME_ID, &CPUt);
- uint64_t CPUTime=CPUt.tv_sec*1000*1000+CPUt.tv_nsec/1000;
- double microCycles=(double)(cpuf*1000);
- int duration=(int)((cur-last)/microCycles);
-
- if ( last!=0 && duration > timeout ) {
- //struct timespec ts;
- //clock_gettime(CLOCK_MONOTONIC, &ts);
- printf("%s:%d lte-ue delay %d (exceed %d), CPU for this period: %lld\n", file, line,
- duration, timeout, (long long)CPUTime-lastCPUTime );
- }
-
- last=cur;
- lastCPUTime=CPUTime;
- return cur;
-}
-
-static inline unsigned long long checkT(int timeout,
- char *file,
- int line)
-{
- static unsigned long long __thread last=0;
- unsigned long long cur=rdtsc();
- int microCycles=(int)(cpuf*1000);
- int duration=(int)((cur-last)/microCycles);
-
- if ( last!=0 && duration > timeout )
- printf("%s:%d lte-ue delay %d (exceed %d)\n", file, line,
- duration, timeout);
-
- last=cur;
- return cur;
-}
-
-typedef struct m {
- uint64_t iterations;
- uint64_t sum;
- uint64_t maxArray[11];
-} Meas;
-
-static inline void printMeas(char *txt,
- Meas *M,
- int period)
-{
- if (M->iterations%period == 0 ) {
- char txt2[512];
- sprintf(txt2,"%s avg=%" PRIu64 " iterations=%" PRIu64 " max=%"
- PRIu64 ":%" PRIu64 ":%" PRIu64 ":%" PRIu64 ":%" PRIu64 ":%" PRIu64 ":%" PRIu64 ":%" PRIu64 ":%" PRIu64 ":%" PRIu64 "\n",
- txt,
- M->sum/M->iterations,
- M->iterations,
- M->maxArray[1],M->maxArray[2], M->maxArray[3],M->maxArray[4], M->maxArray[5],
- M->maxArray[6],M->maxArray[7], M->maxArray[8],M->maxArray[9],M->maxArray[10]);
-#if T_TRACER
- LOG_W(PHY,"%s",txt2);
-#else
- printf("%s",txt2);
-#endif
- }
-}
-
-static inline int cmpint(const void *a,
- const void *b)
-{
- uint64_t *aa=(uint64_t *)a;
- uint64_t *bb=(uint64_t *)b;
- return (int)(*aa-*bb);
-}
-
-static inline void updateTimes(uint64_t start,
- Meas *M,
- int period,
- char *txt)
-{
- if (start!=0) {
- uint64_t end=rdtsc();
- long long diff=(end-start)/(cpuf*1000);
- M->maxArray[0]=diff;
- M->sum+=diff;
- M->iterations++;
- qsort(M->maxArray, 11, sizeof(uint64_t), cmpint);
- printMeas(txt,M,period);
- }
-}
-
-#define check(a) do { checkT(a,__FILE__,__LINE__); } while (0)
-#define checkcpu(a) do { checkTCPU(a,__FILE__,__LINE__); } while (0)
-#define initRefTimes(a) static __thread Meas a= {0}
-#define pickTime(a) uint64_t a=rdtsc()
-#define readTime(a) a
-#define initStaticTime(a) static __thread uint64_t a={0}
-#define pickStaticTime(a) do { a=rdtsc(); } while (0)
-
-#else
-#define check(a) do {} while (0)
-#define checkcpu(a) do {} while (0)
-#define initRefTimes(a) do {} while (0)
-#define initStaticTime(a) do {} while (0)
-#define pickTime(a) do {} while (0)
-#define readTime(a) 0
-#define pickStaticTime(a) do {} while (0)
-#define updateTimes(a,b,c,d) do {} while (0)
-#define printMeas(a,b,c) do {} while (0)
-#endif
-
#ifdef __cplusplus
}
#endif
diff --git a/common/utils/nr/nr_common.c b/common/utils/nr/nr_common.c
index b0a6266d34..febfe7db7d 100644
--- a/common/utils/nr/nr_common.c
+++ b/common/utils/nr/nr_common.c
@@ -36,6 +36,27 @@
const char *duplex_mode[]={"FDD","TDD"};
+int tables_5_3_2[5][11] = {
+ {25, 52, 79, 106, 133, 160, 216, 270, -1, -1, -1}, // 15 FR1
+ {11, 24, 38, 51, 65, 78, 106, 133, 162, 217, 273}, // 30 FR1
+ {-1, 11, 18, 24, 31, 38, 51, 65, 79, 107, 135}, // 60 FR1
+ {66, 132, 264, -1 , -1, -1, -1, -1, -1, -1, -1}, // 60 FR2
+ {32, 66, 132, 264, -1, -1, -1, -1, -1, -1, -1} // 120FR2
+};
+
+int get_supported_band_index(int scs, int band, int n_rbs){
+
+ int scs_index = scs;
+ if (band>256)
+ scs_index++;
+ for (int i=0; i<11; i++) {
+ if(n_rbs == tables_5_3_2[scs][i])
+ return i;
+ }
+ return (-1); // not found
+}
+
+
// Table 5.2-1 NR operating bands in FR1 & FR2 (3GPP TS 38.101)
// Table 5.4.2.3-1 Applicable NR-ARFCN per operating band in FR1 & FR2 (3GPP TS 38.101)
// Notes:
diff --git a/common/utils/nr/nr_common.h b/common/utils/nr/nr_common.h
index 882f99338c..0150cf59f8 100644
--- a/common/utils/nr/nr_common.h
+++ b/common/utils/nr/nr_common.h
@@ -80,6 +80,7 @@ void SLIV2SL(int SLIV,int *S,int *L);
int get_dmrs_port(int nl, uint16_t dmrs_ports);
uint16_t SL_to_bitmap(int startSymbolIndex, int nrOfSymbols);
int get_nb_periods_per_frame(uint8_t tdd_period);
+int get_supported_band_index(int scs, int band, int n_rbs);
long rrc_get_max_nr_csrs(uint8_t max_rbs, long b_SRS);
#define CEILIDIV(a,b) ((a+b-1)/b)
diff --git a/common/utils/telnetsrv/telnetsrv_measurements.c b/common/utils/telnetsrv/telnetsrv_measurements.c
index 786cbd094c..2af76753b8 100644
--- a/common/utils/telnetsrv/telnetsrv_measurements.c
+++ b/common/utils/telnetsrv/telnetsrv_measurements.c
@@ -51,6 +51,7 @@
static char *grouptypes[] = {"ltestats","cpustats"};
static double cpufreq;
+extern notifiedFIFO_t measur_fifo;
#define TELNET_NUM_MEASURTYPES (sizeof(grouptypes)/sizeof(char *))
#define HDR "---------------------------------"
diff --git a/common/utils/threadPool/measurement_display.c b/common/utils/threadPool/measurement_display.c
index 0f5a3e0f69..cf2febaf33 100644
--- a/common/utils/threadPool/measurement_display.c
+++ b/common/utils/threadPool/measurement_display.c
@@ -43,9 +43,9 @@ int main(int argc, char *argv[]) {
exit(1);
}
- uint64_t deb=rdtsc();
+ uint64_t deb=rdtsc_oai();
usleep(100000);
- cpuCyclesMicroSec=(rdtsc()-deb)/100000;
+ cpuCyclesMicroSec=(rdtsc_oai()-deb)/100000;
printf("Cycles per µs: %lu\n",cpuCyclesMicroSec);
printf("Key" SEP "delay to process" SEP "processing time" SEP "delay to be read answer\n");
notifiedFIFO_elt_t doneRequest;
diff --git a/common/utils/threadPool/thread-pool.c b/common/utils/threadPool/thread-pool.c
index fff09528a8..de9091de79 100644
--- a/common/utils/threadPool/thread-pool.c
+++ b/common/utils/threadPool/thread-pool.c
@@ -72,11 +72,11 @@ void *one_thread(void *arg) {
do {
notifiedFIFO_elt_t *elt=pullNotifiedFifoRemember(&tp->incomingFifo, myThread);
- if (tp->measurePerf) elt->startProcessingTime=rdtsc();
+ if (tp->measurePerf) elt->startProcessingTime=rdtsc_oai();
elt->processingFunc(NotifiedFifoData(elt));
- if (tp->measurePerf) elt->endProcessingTime=rdtsc();
+ if (tp->measurePerf) elt->endProcessingTime=rdtsc_oai();
if (elt->reponseFifo) {
// Check if the job is still alive, else it has been aborted
@@ -97,7 +97,7 @@ void initNamedTpool(char *params,tpool_t *pool, bool performanceMeas, char *name
char *measr=getenv("threadPoolMeasurements");
pool->measurePerf=performanceMeas;
// force measurement if the output is defined
- pool->measurePerf=measr!=NULL;
+ pool->measurePerf |= measr!=NULL;
if (measr) {
mkfifo(measr,0666);
diff --git a/common/utils/threadPool/thread-pool.h b/common/utils/threadPool/thread-pool.h
index a8f8572cfe..d06f2195ee 100644
--- a/common/utils/threadPool/thread-pool.h
+++ b/common/utils/threadPool/thread-pool.h
@@ -27,11 +27,11 @@
#include
#include
#include
+#include
#include
-#include
-#include
-#include
-//#include
+#include "assertions.h"
+#include "common/utils/time_meas.h"
+#include "common/utils/system.h"
#ifdef DEBUG
#define THREADINIT PTHREAD_ERRORCHECK_MUTEX_INITIALIZER_NP
@@ -60,10 +60,10 @@ typedef struct notifiedFIFO_elt_s {
struct notifiedFIFO_s *reponseFifo;
void (*processingFunc)(void *);
bool malloced;
- uint64_t creationTime;
- uint64_t startProcessingTime;
- uint64_t endProcessingTime;
- uint64_t returnTime;
+ oai_cputime_t creationTime;
+ oai_cputime_t startProcessingTime;
+ oai_cputime_t endProcessingTime;
+ oai_cputime_t returnTime;
void *msgData;
} notifiedFIFO_elt_t;
@@ -97,12 +97,11 @@ static inline void *NotifiedFifoData(notifiedFIFO_elt_t *elt) {
static inline void delNotifiedFIFO_elt(notifiedFIFO_elt_t *elt) {
if (elt->malloced) {
- elt->malloced=false;
+ elt->malloced = false;
free(elt);
- } else
- printf("delNotifiedFIFO on something not allocated by newNotifiedFIFO\n");
-
- //LOG_W(UTIL,"delNotifiedFIFO on something not allocated by newNotifiedFIFO\n");
+ }
+ /* it is allowed to call delNotifiedFIFO_elt when the memory is managed by
+ * the caller */
}
static inline void initNotifiedFIFO_nothreadSafe(notifiedFIFO_t *nf) {
@@ -141,8 +140,7 @@ static inline notifiedFIFO_elt_t *pullNotifiedFIFO_nothreadSafe(notifiedFIFO_t
notifiedFIFO_elt_t *ret=nf->outF;
- if (nf->outF==nf->outF->next)
- LOG_E(UTIL,"Circular list in thread pool: push several times the same buffer is forbidden\n");
+ AssertFatal(nf->outF != nf->outF->next,"Circular list in thread pool: push several times the same buffer is forbidden\n");
nf->outF=nf->outF->next;
@@ -174,6 +172,20 @@ static inline notifiedFIFO_elt_t *pollNotifiedFIFO(notifiedFIFO_t *nf) {
return ret;
}
+static inline time_stats_t exec_time_stats_NotifiedFIFO(const notifiedFIFO_elt_t* elt)
+{
+ time_stats_t ts = {0};
+ if (elt->startProcessingTime == 0 && elt->endProcessingTime == 0)
+ return ts; /* no measurements done */
+ ts.in = elt->startProcessingTime;
+ ts.diff = elt->endProcessingTime - ts.in;
+ ts.p_time = ts.diff;
+ ts.diff_square = ts.diff * ts.diff;
+ ts.max = ts.diff;
+ ts.trials = 1;
+ return ts;
+}
+
// This function aborts all messages matching the key
// If the queue is used in thread pools, it doesn't cancels already running processing
// because the message has already been picked
@@ -224,18 +236,18 @@ typedef struct thread_pool {
} tpool_t;
static inline void pushTpool(tpool_t *t, notifiedFIFO_elt_t *msg) {
- if (t->measurePerf) msg->creationTime=rdtsc();
+ if (t->measurePerf) msg->creationTime=rdtsc_oai();
if ( t->activated)
pushNotifiedFIFO(&t->incomingFifo, msg);
else {
if (t->measurePerf)
- msg->startProcessingTime=rdtsc();
+ msg->startProcessingTime=rdtsc_oai();
msg->processingFunc(NotifiedFifoData(msg));
if (t->measurePerf)
- msg->endProcessingTime=rdtsc();
+ msg->endProcessingTime=rdtsc_oai();
if (msg->reponseFifo)
pushNotifiedFIFO(msg->reponseFifo, msg);
@@ -246,7 +258,7 @@ static inline notifiedFIFO_elt_t *pullTpool(notifiedFIFO_t *responseFifo, tpool_
notifiedFIFO_elt_t *msg= pullNotifiedFIFO(responseFifo);
AssertFatal(t->traceFd, "Thread pool used while not initialized");
if (t->measurePerf)
- msg->returnTime=rdtsc();
+ msg->returnTime=rdtsc_oai();
if (t->traceFd > 0)
if(write(t->traceFd, msg, sizeof(*msg)));
@@ -261,7 +273,7 @@ static inline notifiedFIFO_elt_t *tryPullTpool(notifiedFIFO_t *responseFifo, tpo
return NULL;
if (t->measurePerf)
- msg->returnTime=rdtsc();
+ msg->returnTime=rdtsc_oai();
if (t->traceFd)
if(write(t->traceFd, msg, sizeof(*msg)));
diff --git a/openair1/PHY/TOOLS/time_meas.c b/common/utils/time_meas.c
similarity index 97%
rename from openair1/PHY/TOOLS/time_meas.c
rename to common/utils/time_meas.c
index 353f170434..df2bfd64de 100644
--- a/openair1/PHY/TOOLS/time_meas.c
+++ b/common/utils/time_meas.c
@@ -267,6 +267,15 @@ void init_meas(void) {
AssertFatal(rt==0, "couldn't create cpu measurment thread: %s\n",strerror(errno));
}
+void send_meas(time_stats_t *ts, int msgid) {
+ if (MEASURE_ENABLED(ts) ) {
+ ts->tstatptr->timestat_id=ts->meas_index;
+ ts->tstatptr->msgid = msgid ;
+ ts->tstatptr->ts = rdtsc_oai();
+ pushNotifiedFIFO(&measur_fifo, ts->tpoolmsg);
+ }
+ }
+
void end_meas(void) {
notifiedFIFO_elt_t *nfe = newNotifiedFIFO_elt(sizeof(time_stats_msg_t),0,NULL,NULL);
time_stats_msg_t *msg = (time_stats_msg_t *)NotifiedFifoData(nfe);
diff --git a/openair1/PHY/TOOLS/time_meas.h b/common/utils/time_meas.h
similarity index 83%
rename from openair1/PHY/TOOLS/time_meas.h
rename to common/utils/time_meas.h
index ed4e9a125f..382dd7455a 100644
--- a/openair1/PHY/TOOLS/time_meas.h
+++ b/common/utils/time_meas.h
@@ -31,15 +31,14 @@
#include
#include
#include
-#include "common/utils/threadPool/thread-pool.h"
// global var to enable openair performance profiler
extern int opp_enabled;
extern double cpu_freq_GHz __attribute__ ((aligned(32)));;
// structure to store data to compute cpu measurment
#if defined(__x86_64__) || defined(__i386__)
- #define OAI_CPUTIME_TYPE long long
+ typedef long long oai_cputime_t;
#elif defined(__arm__)
- #define OAI_CPUTIME_TYPE uint32_t
+ typedef uint32_t oai_cputime_t;
#else
#error "building on unsupported CPU architecture"
#endif
@@ -54,23 +53,23 @@ typedef void(*meas_printfunc_t)(const char* format, ...);
typedef struct {
int msgid; /*!< \brief message id, as defined by TIMESTAT_MSGID_X macros */
int timestat_id; /*!< \brief points to the time_stats_t entry in cpumeas table */
- OAI_CPUTIME_TYPE ts; /*!< \brief time stamp */
+ oai_cputime_t ts; /*!< \brief time stamp */
meas_printfunc_t displayFunc; /*!< \brief function to call when DISPLAY message is received*/
} time_stats_msg_t;
-
-typedef struct {
- OAI_CPUTIME_TYPE in; /*!< \brief time at measure starting point */
- OAI_CPUTIME_TYPE diff; /*!< \brief average difference between time at starting point and time at endpoint*/
- OAI_CPUTIME_TYPE p_time; /*!< \brief absolute process duration */
- OAI_CPUTIME_TYPE diff_square; /*!< \brief process duration square */
- OAI_CPUTIME_TYPE max; /*!< \brief maximum difference between time at starting point and time at endpoint*/
+struct notifiedFIFO_elt_s;
+typedef struct time_stats {
+ oai_cputime_t in; /*!< \brief time at measure starting point */
+ oai_cputime_t diff; /*!< \brief average difference between time at starting point and time at endpoint*/
+ oai_cputime_t p_time; /*!< \brief absolute process duration */
+ oai_cputime_t diff_square; /*!< \brief process duration square */
+ oai_cputime_t max; /*!< \brief maximum difference between time at starting point and time at endpoint*/
int trials; /*!< \brief number of start point - end point iterations */
int meas_flag; /*!< \brief 1: stop_meas not called (consecutive calls of start_meas) */
char *meas_name; /*!< \brief name to use when printing the measure (not used for PHY simulators)*/
int meas_index; /*!< \brief index of this measure in the measure array (not used for PHY simulators)*/
int meas_enabled; /*!< \brief per measure enablement flag. send_meas tests this flag, unused today in start_meas and stop_meas*/
- notifiedFIFO_elt_t *tpoolmsg; /*!< \brief message pushed to the cpu measurment queue to report a measure START or STOP */
+ struct notifiedFIFO_elt_s *tpoolmsg; /*!< \brief message pushed to the cpu measurment queue to report a measure START or STOP */
time_stats_msg_t *tstatptr; /*!< \brief pointer to the time_stats_msg_t data in the tpoolmsg, stored here for perf considerations*/
} time_stats_t;
#define MEASURE_ENABLED(X) (X->meas_enabled)
@@ -179,7 +178,7 @@ static inline void copy_meas(time_stats_t *dst_ts,time_stats_t *src_ts) {
}
}
-static inline void merge_meas(time_stats_t *dst_ts, time_stats_t *src_ts)
+static inline void merge_meas(time_stats_t *dst_ts, const time_stats_t *src_ts)
{
if (!opp_enabled)
return;
@@ -189,25 +188,17 @@ static inline void merge_meas(time_stats_t *dst_ts, time_stats_t *src_ts)
dst_ts->max = src_ts->max;
}
-extern notifiedFIFO_t measur_fifo;
#define CPUMEASUR_SECTION "cpumeasur"
#define CPUMEASUR_PARAMS_DESC { \
{"max_cpumeasur", "Max number of cpu measur entries", 0, uptr:&max_cpumeasur, defintval:100, TYPE_UINT, 0},\
}
- void init_meas(void);
- time_stats_t *register_meas(char *name);
- #define START_MEAS(X) send_meas(X, TIMESTAT_MSGID_START)
- #define STOP_MEAS(X) send_meas(X, TIMESTAT_MSGID_STOP)
- static inline void send_meas(time_stats_t *ts, int msgid) {
- if (MEASURE_ENABLED(ts) ) {
- ts->tstatptr->timestat_id=ts->meas_index;
- ts->tstatptr->msgid = msgid ;
- ts->tstatptr->ts = rdtsc_oai();
- pushNotifiedFIFO(&measur_fifo, ts->tpoolmsg);
- }
- }
- void end_meas(void);
+void init_meas(void);
+time_stats_t *register_meas(char *name);
+#define START_MEAS(X) send_meas(X, TIMESTAT_MSGID_START)
+#define STOP_MEAS(X) send_meas(X, TIMESTAT_MSGID_STOP)
+void send_meas(time_stats_t *ts, int msgid);
+void end_meas(void);
#endif
diff --git a/doc/5Gnas.md b/doc/5Gnas.md
index 3d33af426c..db0c19f07e 100644
--- a/doc/5Gnas.md
+++ b/doc/5Gnas.md
@@ -23,7 +23,6 @@ This tuto for 5G gNB NAS design
# source files
-executables/ocp-gnb.c: a main loop to create a debuggable gNB, see document SW_archi.md
openair2/RRC/NR/nr_ngap_gNB.c: skeleton for interface with NGAP
openair3/NAS/COMMON/milenage.h: a simple milenage implementation, depend only on crypto library
openair3/NAS/COMMON/NR_NAS_defs.h: messages defined for NAS implemented in C: C struct, C enums and automatic conversion to labels for debug messages
diff --git a/doc/SW_archi.md b/doc/SW_archi.md
index 7648fb2e16..0a53bf3793 100644
--- a/doc/SW_archi.md
+++ b/doc/SW_archi.md
@@ -85,10 +85,6 @@ end
This tuto for 5G gNB design, with Open Cells main
{: .text-center}
-# Top file: executables/ocp-gnb.c
-
-the function main() initializes the data from configuration file
-
# The main thread is in ru_thread()
The infinite loop:
## rx_rf()
diff --git a/executables/main-fs6.c b/executables/main-fs6.c
index 9e92f2e41a..fff4c51155 100644
--- a/executables/main-fs6.c
+++ b/executables/main-fs6.c
@@ -55,6 +55,59 @@ int sum(uint8_t *b, int s) {
return sum;
}
+
+extern double cpuf;
+
+typedef struct m {
+ uint64_t iterations;
+ uint64_t sum;
+ uint64_t maxArray[11];
+} Meas;
+
+int cmpint(const void *a, const void *b)
+{
+ uint64_t *aa=(uint64_t *)a;
+ uint64_t *bb=(uint64_t *)b;
+ return (int)(*aa-*bb);
+}
+
+static inline void printMeas(char *txt,
+ Meas *M,
+ int period)
+{
+ if (M->iterations%period == 0 ) {
+ char txt2[512];
+ sprintf(txt2,"%s avg=%" PRIu64 " iterations=%" PRIu64 " max=%"
+ PRIu64 ":%" PRIu64 ":%" PRIu64 ":%" PRIu64 ":%" PRIu64 ":%" PRIu64 ":%" PRIu64 ":%" PRIu64 ":%" PRIu64 ":%" PRIu64 "\n",
+ txt,
+ M->sum/M->iterations,
+ M->iterations,
+ M->maxArray[1],M->maxArray[2], M->maxArray[3],M->maxArray[4], M->maxArray[5],
+ M->maxArray[6],M->maxArray[7], M->maxArray[8],M->maxArray[9],M->maxArray[10]);
+#if T_TRACER
+ LOG_W(PHY,"%s",txt2);
+#else
+ printf("%s",txt2);
+#endif
+ }
+}
+
+void updateTimes(uint64_t start, Meas *M, int period, char *txt)
+{
+ if (start!=0) {
+ uint64_t end=rdtsc_oai();
+ long long diff=(end-start)/(cpuf*1000);
+ M->maxArray[0]=diff;
+ M->sum+=diff;
+ M->iterations++;
+ qsort(M->maxArray, 11, sizeof(uint64_t), cmpint);
+ printMeas(txt,M,period);
+ }
+}
+
+#define initStaticTime(a) static __thread uint64_t a={0}
+#define pickStaticTime(a) do { a=rdtsc_oai(); } while (0)
+#define initRefTimes(a) static __thread Meas a= {0}
static inline int cmpintRev(const void *a, const void *b) {
uint64_t *aa=(uint64_t *)a;
uint64_t *bb=(uint64_t *)b;
@@ -82,7 +135,7 @@ static inline void printMeas2(char *txt, Meas *M, int period, bool MaxMin) {
static inline void updateTimesReset(uint64_t start, Meas *M, int period, bool MaxMin, char *txt) {
if (start!=0) {
- uint64_t end=rdtsc();
+ uint64_t end=rdtsc_oai();
long long diff=(end-start)/(cpuf*1000);
M->maxArray[0]=diff;
M->sum+=diff;
@@ -107,7 +160,7 @@ static inline void updateTimesReset(uint64_t start, Meas *M, int period, bool Ma
static inline void measTransportTime(uint64_t DuSend, uint64_t CuMicroSec, Meas *M, int period, bool MaxMin, char *txt) {
if (DuSend!=0) {
- uint64_t end=rdtsc();
+ uint64_t end=rdtsc_oai();
long long diff=(end-DuSend)/(cpuf*1000)-CuMicroSec;
M->maxArray[0]=diff;
M->sum+=diff;
@@ -894,7 +947,7 @@ void phy_procedures_eNB_TX_fromsplit(uint8_t *bufferZone, int nbBlocks, PHY_VARS
memcpy(eNB->pbch_pdu,hDL(bufferZone)->pbch_pdu, 4);
// Remove all scheduled DL, we will populate from the CU sending
- for (int UE_id=0; UE_iddlsch[UE_id][0];
if ( dlsch0 && dlsch0->rnti>0 ) {
@@ -1463,7 +1516,7 @@ void DL_cu_fs6(RU_t *ru, L1_rxtx_proc_t *proc, uint64_t DuClock, uint64_t start
}
hDL(bufferZone)->DuClock=DuClock;
- hDL(bufferZone)->CuSpentMicroSec=(rdtsc()-startCycle)/(cpuf*1000);
+ hDL(bufferZone)->CuSpentMicroSec=(rdtsc_oai()-startCycle)/(cpuf*1000);
updateTimesReset(startCycle, &CUprocessing, 1000, true,"CU entire processing from recv to send");
sendSubFrame(&sockFS6, bufferZone, sizeof(fs6_dl_t), CTsentCUv0 );
return;
@@ -1476,7 +1529,7 @@ void UL_cu_fs6(RU_t *ru, L1_rxtx_proc_t *proc, uint64_t *TS, uint64_t *DuClock,
pickStaticTime(begingWait);
int nb_blocks=receiveSubFrame(&sockFS6, bufferZone, sizeof(bufferZone), CTsentDUv0 );
* DuClock=hUDP(bufferZone)->senderClock;
- * startProcessing=rdtsc();
+ * startProcessing=rdtsc_oai();
updateTimesReset(begingWait, &fullLoop, 1000, false, "CU wait DU");
if (nb_blocks ==0) {
diff --git a/executables/main-ocp.c b/executables/main-ocp.c
index 04315a4d57..c9388e179d 100644
--- a/executables/main-ocp.c
+++ b/executables/main-ocp.c
@@ -87,10 +87,10 @@ AGENT_RRC_xface *agent_rrc_xface[NUM_MAX_ENB]= {0};
AGENT_MAC_xface *agent_mac_xface[NUM_MAX_ENB]= {0};
void flexran_agent_slice_update(mid_t module_idP) {
}
-int proto_agent_start(mod_id_t mod_id, const cudu_params_t *p) {
+int proto_agent_start(mid_t mod_id, const cudu_params_t *p) {
return 0;
}
-void proto_agent_stop(mod_id_t mod_id) {
+void proto_agent_stop(mid_t mod_id) {
}
static void *ru_thread( void *param );
diff --git a/executables/nr-gnb.c b/executables/nr-gnb.c
index 2b1c36407b..fa0c3a1f63 100644
--- a/executables/nr-gnb.c
+++ b/executables/nr-gnb.c
@@ -300,8 +300,7 @@ void rx_func(void *param) {
}
static void dump_L1_meas_stats(PHY_VARS_gNB *gNB, RU_t *ru, char *output) {
int stroff = 0;
- stroff += print_meas_log(gNB->phy_proc_tx[0], "L1 Tx processing thread 0", NULL, NULL, output);
- //stroff += print_meas_log(gNB->phy_proc_tx[1], "L1 Tx processing thread 1", NULL, NULL, output+stroff);
+ stroff += print_meas_log(&gNB->phy_proc_tx, "L1 Tx processing", NULL, NULL, output);
stroff += print_meas_log(&gNB->dlsch_encoding_stats, "DLSCH encoding", NULL, NULL, output+stroff);
stroff += print_meas_log(&gNB->phy_proc_rx, "L1 Rx processing", NULL, NULL, output+stroff);
stroff += print_meas_log(&gNB->ul_indication_stats, "UL Indication", NULL, NULL, output+stroff);
@@ -337,8 +336,7 @@ void *nrL1_stats_thread(void *param) {
fd=fopen("nrL1_stats.log","w");
AssertFatal(fd!=NULL,"Cannot open nrL1_stats.log\n");
- reset_meas(gNB->phy_proc_tx[0]);
- //reset_meas(gNB->phy_proc_tx[1]);
+ reset_meas(&gNB->phy_proc_tx);
reset_meas(&gNB->dlsch_encoding_stats);
reset_meas(&gNB->phy_proc_rx);
reset_meas(&gNB->ul_indication_stats);
@@ -425,7 +423,7 @@ void init_gNB_Tpool(int inst) {
s_offset += 3;
}
if (getenv("noThreads")) strcpy(pool, "n");
- initTpool(pool, gNB->threadPool, false);
+ initTpool(pool, gNB->threadPool, cpumeas(CPUMEAS_GETSTATE));
// ULSCH decoder result FIFO
gNB->respDecode = (notifiedFIFO_t*) malloc(sizeof(notifiedFIFO_t));
initNotifiedFIFO(gNB->respDecode);
@@ -450,8 +448,6 @@ void init_gNB_Tpool(int inst) {
processingData_L1tx_t *msgDataTx = (processingData_L1tx_t *)NotifiedFifoData(msgL1Tx);
init_DLSCH_struct(gNB, msgDataTx);
memset(msgDataTx->ssb, 0, 64*sizeof(NR_gNB_SSB_t));
- reset_meas(&msgDataTx->phy_proc_tx);
- gNB->phy_proc_tx[i] = &msgDataTx->phy_proc_tx;
pushNotifiedFIFO(gNB->L1_tx_free,msgL1Tx); // to unblock the process in the beginning
}
diff --git a/executables/nr-softmodem.c b/executables/nr-softmodem.c
index 6452036912..ac5a1b0132 100644
--- a/executables/nr-softmodem.c
+++ b/executables/nr-softmodem.c
@@ -62,8 +62,6 @@ unsigned short config_frames[4] = {2,9,11,13};
#include "common/utils/LOG/vcd_signal_dumper.h"
#include "UTIL/OPT/opt.h"
-//#include "PHY/TOOLS/time_meas.h"
-
#include "intertask_interface.h"
#include "PHY/INIT/phy_init.h"
diff --git a/executables/nr-ue.c b/executables/nr-ue.c
index 9c9ca4db4c..543be7a8b5 100644
--- a/executables/nr-ue.c
+++ b/executables/nr-ue.c
@@ -766,9 +766,9 @@ void processSlotRX(void *arg) {
#ifdef UE_SLOT_PARALLELISATION
phy_procedures_slot_parallelization_nrUE_RX( UE, proc, 0, 0, 1, no_relay, NULL );
#else
- uint64_t a=rdtsc();
+ uint64_t a=rdtsc_oai();
phy_procedures_nrUE_RX(UE, proc, gNB_id, get_nrUE_params()->nr_dlsch_parallel, &rxtxD->txFifo);
- LOG_D(PHY, "In %s: slot %d, time %lu\n", __FUNCTION__, proc->nr_slot_rx, (rdtsc()-a)/3500);
+ LOG_D(PHY, "In %s: slot %d, time %llu\n", __FUNCTION__, proc->nr_slot_rx, (rdtsc_oai()-a)/3500);
#endif
if(IS_SOFTMODEM_NOS1 || get_softmodem_params()->sa){
diff --git a/executables/nr-uesoftmodem.c b/executables/nr-uesoftmodem.c
index 7663e9ebd8..76c21bb422 100644
--- a/executables/nr-uesoftmodem.c
+++ b/executables/nr-uesoftmodem.c
@@ -61,7 +61,6 @@ unsigned short config_frames[4] = {2,9,11,13};
#include "UTIL/OPT/opt.h"
#include "enb_config.h"
-//#include "PHY/TOOLS/time_meas.h"
#include "intertask_interface.h"
diff --git a/executables/ocp-gnb.c b/executables/ocp-gnb.c
deleted file mode 100644
index 23fd3ae132..0000000000
--- a/executables/ocp-gnb.c
+++ /dev/null
@@ -1,1006 +0,0 @@
-/*
- * Author: Laurent Thomas, Open Cells Project
- * all rights reserved
- */
-
-#define _GNU_SOURCE
-#include
-#include "assertions.h"
-#include
-#include
-
-#include "PHY/types.h"
-
-#include "PHY/INIT/phy_init.h"
-
-#include "PHY/defs_gNB.h"
-#include "SCHED/sched_eNB.h"
-#include "SCHED_NR/sched_nr.h"
-#include "SCHED_NR/fapi_nr_l1.h"
-#include "PHY/LTE_TRANSPORT/transport_proto.h"
-#include "../../ARCH/COMMON/common_lib.h"
-
-#include "PHY/phy_extern.h"
-#include "LAYER2/MAC/mac.h"
-#include "LAYER2/NR_MAC_COMMON/nr_mac_extern.h"
-#include "LAYER2/MAC/mac_proto.h"
-#include "RRC/LTE/rrc_extern.h"
-#include "PHY_INTERFACE/phy_interface.h"
-#include "common/utils/LOG/log_extern.h"
-#include "UTIL/OTG/otg_tx.h"
-#include "UTIL/OTG/otg_externs.h"
-#include "UTIL/MATH/oml.h"
-#include "common/utils/LOG/vcd_signal_dumper.h"
-#include "UTIL/OPT/opt.h"
-#include "enb_config.h"
-#include "s1ap_eNB.h"
-#include "SIMULATION/ETH_TRANSPORT/proto.h"
-#include
-#include
-#include
-#include
-#include
-#include
-#include
-#include
-
-// should be in a shared lib
-#include
-#include
-#include
-#include
-
-// Global vars
-#include
-#include
-#include
-#include
-volatile int oai_exit;
-int single_thread_flag=1;
-uint32_t do_forms=0;
-unsigned int mmapped_dma=0;
-int8_t threequarter_fs=0;
-
-int chain_offset=0;
-uint16_t sl_ahead=6;
-uint16_t sf_ahead=6;
-uint32_t timing_advance = 0;
-int transmission_mode=1;
-int emulate_rf = 0;
-int numerology = 0;
-
-
-int config_sync_var=-1;
-pthread_mutex_t nfapi_sync_mutex;
-pthread_cond_t nfapi_sync_cond;
-int nfapi_sync_var=-1;
-double cpuf;
-
-THREAD_STRUCT thread_struct;
-
-pthread_cond_t sync_cond;
-pthread_mutex_t sync_mutex;
-int sync_var=-1; //!< protected by mutex \ref sync_mutex.
-
-
-uint64_t downlink_frequency[MAX_NUM_CCs][4];
-int32_t uplink_frequency_offset[MAX_NUM_CCs][4];
-time_stats_t softmodem_stats_mt; // main thread
-time_stats_t softmodem_stats_hw; // hw acquisition
-time_stats_t softmodem_stats_rxtx_sf; // total tx time
-time_stats_t nfapi_meas; // total tx time
-time_stats_t softmodem_stats_rx_sf; // total rx time
-// not used but needed for link
-openair0_config_t openair0_cfg[MAX_CARDS];
-uint16_t slot_ahead=6;
-AGENT_RRC_xface *agent_rrc_xface[NUM_MAX_ENB];
-AGENT_MAC_xface *agent_mac_xface[NUM_MAX_ENB];
-int flexran_agent_start(mid_t mod_id) {
- memset (agent_rrc_xface, 0, sizeof(agent_rrc_xface));
- memset (agent_mac_xface, 0, sizeof(agent_mac_xface));
- return 0;
-}
-void flexran_agent_slice_update(mid_t module_idP) {
-}
-int proto_agent_start(mod_id_t mod_id, const cudu_params_t *p) {
- return 0;
-}
-void proto_agent_stop(mod_id_t mod_id) {
-}
-int split73=0;
-void sendFs6Ul(PHY_VARS_eNB *eNB, int UE_id, int harq_pid, int segmentID, int16_t *data, int dataLen, int r_offset) {
- AssertFatal(false, "Must not be called in this context\n");
-}
-int stop_L1L2(module_id_t gnb_id) {
- AssertFatal(false, "Must not be called in this context\n");
-}
-int restart_L1L2(module_id_t gnb_id) {
- AssertFatal(false, "Must not be called in this context\n");
-}
-
-static int wait_for_sync = 0;
-static double snr_dB=20;
-static int DEFBANDS[] = {7};
-static int DEFENBS[] = {0};
-static int DEFBFW[] = {0x00007fff};
-
-extern double cpuf;
-
-short nr_mod_table[NR_MOD_TABLE_SIZE_SHORT] = {0,0,16384,16384,-16384,-16384,16384,16384,16384,-16384,-16384,16384,-16384,-16384,7327,7327,7327,21981,21981,7327,21981,21981,7327,-7327,7327,-21981,21981,-7327,21981,-21981,-7327,7327,-7327,21981,-21981,7327,-21981,21981,-7327,-7327,-7327,-21981,-21981,-7327,-21981,-21981,10726,10726,10726,3576,3576,10726,3576,3576,10726,17876,10726,25027,3576,17876,3576,25027,17876,10726,17876,3576,25027,10726,25027,3576,17876,17876,17876,25027,25027,17876,25027,25027,10726,-10726,10726,-3576,3576,-10726,3576,-3576,10726,-17876,10726,-25027,3576,-17876,3576,-25027,17876,-10726,17876,-3576,25027,-10726,25027,-3576,17876,-17876,17876,-25027,25027,-17876,25027,-25027,-10726,10726,-10726,3576,-3576,10726,-3576,3576,-10726,17876,-10726,25027,-3576,17876,-3576,25027,-17876,10726,-17876,3576,-25027,10726,-25027,3576,-17876,17876,-17876,25027,-25027,17876,-25027,25027,-10726,-10726,-10726,-3576,-3576,-10726,-3576,-3576,-10726,-17876,-10726,-25027,-3576,-17876,-3576,-25027,-17876,-10726,-17876,-3576,-25027,-10726,-25027,-3576,-17876,-17876,-17876,-25027,-25027,-17876,-25027,-25027,8886,8886,8886,12439,12439,8886,12439,12439,8886,5332,8886,1778,12439,5332,12439,1778,5332,8886,5332,12439,1778,8886,1778,12439,5332,5332,5332,1778,1778,5332,1778,1778,8886,19547,8886,15993,12439,19547,12439,15993,8886,23101,8886,26655,12439,23101,12439,26655,5332,19547,5332,15993,1778,19547,1778,15993,5332,23101,5332,26655,1778,23101,1778,26655,19547,8886,19547,12439,15993,8886,15993,12439,19547,5332,19547,1778,15993,5332,15993,1778,23101,8886,23101,12439,26655,8886,26655,12439,23101,5332,23101,1778,26655,5332,26655,1778,19547,19547,19547,15993,15993,19547,15993,15993,19547,23101,19547,26655,15993,23101,15993,26655,23101,19547,23101,15993,26655,19547,26655,15993,23101,23101,23101,26655,26655,23101,26655,26655,8886,-8886,8886,-12439,12439,-8886,12439,-12439,8886,-5332,8886,-1778,12439,-5332,12439,-1778,5332,-8886,5332,-12439,1778,-8886,1778,-12439,5332,-5332,5332,-1778,1778,-5332,1778,-1778,8886,-19547,8886,-15993,12439,-19547,12439,-15993,8886,-23101,8886,-26655,12439,-23101,12439,-26655,5332,-19547,5332,-15993,1778,-19547,1778,-15993,5332,-23101,5332,-26655,1778,-23101,1778,-26655,19547,-8886,19547,-12439,15993,-8886,15993,-12439,19547,-5332,19547,-1778,15993,-5332,15993,-1778,23101,-8886,23101,-12439,26655,-8886,26655,-12439,23101,-5332,23101,-1778,26655,-5332,26655,-1778,19547,-19547,19547,-15993,15993,-19547,15993,-15993,19547,-23101,19547,-26655,15993,-23101,15993,-26655,23101,-19547,23101,-15993,26655,-19547,26655,-15993,23101,-23101,23101,-26655,26655,-23101,26655,-26655,-8886,8886,-8886,12439,-12439,8886,-12439,12439,-8886,5332,-8886,1778,-12439,5332,-12439,1778,-5332,8886,-5332,12439,-1778,8886,-1778,12439,-5332,5332,-5332,1778,-1778,5332,-1778,1778,-8886,19547,-8886,15993,-12439,19547,-12439,15993,-8886,23101,-8886,26655,-12439,23101,-12439,26655,-5332,19547,-5332,15993,-1778,19547,-1778,15993,-5332,23101,-5332,26655,-1778,23101,-1778,26655,-19547,8886,-19547,12439,-15993,8886,-15993,12439,-19547,5332,-19547,1778,-15993,5332,-15993,1778,-23101,8886,-23101,12439,-26655,8886,-26655,12439,-23101,5332,-23101,1778,-26655,5332,-26655,1778,-19547,19547,-19547,15993,-15993,19547,-15993,15993,-19547,23101,-19547,26655,-15993,23101,-15993,26655,-23101,19547,-23101,15993,-26655,19547,-26655,15993,-23101,23101,-23101,26655,-26655,23101,-26655,26655,-8886,-8886,-8886,-12439,-12439,-8886,-12439,-12439,-8886,-5332,-8886,-1778,-12439,-5332,-12439,-1778,-5332,-8886,-5332,-12439,-1778,-8886,-1778,-12439,-5332,-5332,-5332,-1778,-1778,-5332,-1778,-1778,-8886,-19547,-8886,-15993,-12439,-19547,-12439,-15993,-8886,-23101,-8886,-26655,-12439,-23101,-12439,-26655,-5332,-19547,-5332,-15993,-1778,-19547,-1778,-15993,-5332,-23101,-5332,-26655,-1778,-23101,-1778,-26655,-19547,-8886,-19547,-12439,-15993,-8886,-15993,-12439,-19547,-5332,-19547,-1778,-15993,-5332,-15993,-1778,-23101,-8886,-23101,-12439,-26655,-8886,-26655,-12439,-23101,-5332,-23101,-1778,-26655,-5332,-26655,-1778,-19547,-19547,-19547,-15993,-15993,-19547,-15993,-15993,-19547,-23101,-19547,-26655,-15993,-23101,-15993,-26655,-23101,-19547,-23101,-15993,-26655,-19547,-26655,-15993,-23101,-23101,-23101,-26655,-26655,-23101,-26655,-26655};
-
-static inline int ocp_rxtx(PHY_VARS_gNB *gNB, gNB_L1_rxtx_proc_t *proc) {
- nfapi_nr_config_request_scf_t *cfg = &gNB->gNB_config;
- start_meas(&softmodem_stats_rxtx_sf);
-
- // *******************************************************************
-
- if (nfapi_mode == NFAPI_MODE_PNF) {
- // I am a PNF and I need to let nFAPI know that we have a (sub)frame tick
- //add_subframe(&frame, &subframe, 4);
- //oai_subframe_ind(proc->frame_tx, proc->subframe_tx);
- //LOG_D(PHY, "oai_subframe_ind(frame:%u, subframe:%d) - NOT CALLED ********\n", frame, subframe);
- start_meas(&nfapi_meas);
- oai_subframe_ind(proc->frame_rx, proc->slot_rx);
- stop_meas(&nfapi_meas);
- /*if (gNB->UL_INFO.rx_ind.rx_indication_body.number_of_pdus||
- gNB->UL_INFO.harq_ind.harq_indication_body.number_of_harqs ||
- gNB->UL_INFO.crc_ind.crc_indication_body.number_of_crcs ||
- gNB->UL_INFO.rach_ind.rach_indication_body.number_of_preambles ||
- gNB->UL_INFO.cqi_ind.number_of_cqis
- ) {
- LOG_D(PHY, "UL_info[rx_ind:%05d:%d harqs:%05d:%d crcs:%05d:%d preambles:%05d:%d cqis:%d] RX:%04d%d TX:%04d%d \n",
- NFAPI_SFNSF2DEC(gNB->UL_INFO.rx_ind.sfn_sf), gNB->UL_INFO.rx_ind.rx_indication_body.number_of_pdus,
- NFAPI_SFNSF2DEC(gNB->UL_INFO.harq_ind.sfn_sf), gNB->UL_INFO.harq_ind.harq_indication_body.number_of_harqs,
- NFAPI_SFNSF2DEC(gNB->UL_INFO.crc_ind.sfn_sf), gNB->UL_INFO.crc_ind.crc_indication_body.number_of_crcs,
- NFAPI_SFNSF2DEC(gNB->UL_INFO.rach_ind.sfn_sf), gNB->UL_INFO.rach_ind.rach_indication_body.number_of_preambles,
- gNB->UL_INFO.cqi_ind.number_of_cqis,
- frame_rx, slot_rx,
- frame_tx, slot_tx);
- }*/
- }
-
- /// NR disabling
- // ****************************************
- // Common RX procedures subframe n
- pthread_mutex_lock(&gNB->UL_INFO_mutex);
- gNB->UL_INFO.frame = proc->frame_rx;
- gNB->UL_INFO.slot = proc->slot_rx;
- gNB->UL_INFO.module_id = gNB->Mod_id;
- gNB->UL_INFO.CC_id = gNB->CC_id;
- gNB->if_inst->NR_UL_indication(&gNB->UL_INFO);
- pthread_mutex_unlock(&gNB->UL_INFO_mutex);
- // RX processing
- int tx_slot_type = nr_slot_select(cfg,proc->frame_tx,proc->slot_tx);
- int rx_slot_type = nr_slot_select(cfg,proc->frame_rx,proc->slot_rx);
-
- if (rx_slot_type == NR_UPLINK_SLOT || rx_slot_type == NR_MIXED_SLOT) {
- // Do PRACH RU processing
- L1_nr_prach_procedures(gNB,proc->frame_rx,proc->slot_rx);
- phy_procedures_gNB_uespec_RX(gNB, proc->frame_rx, proc->slot_rx);
- }
-
- if (oai_exit) return(-1);
-
- // *****************************************
- // TX processing for subframe n+sf_ahead
- // run PHY TX procedures the one after the other for all CCs to avoid race conditions
- // (may be relaxed in the future for performance reasons)
- // *****************************************
-
- if (tx_slot_type == NR_DOWNLINK_SLOT || tx_slot_type == NR_MIXED_SLOT) {
- phy_procedures_gNB_TX(gNB, proc->frame_tx,proc->slot_tx, 1);
- }
-
- stop_meas( &softmodem_stats_rxtx_sf );
- LOG_D(PHY,"%s() Exit proc[rx:%d%d tx:%d%d]\n", __FUNCTION__, proc->frame_rx, proc->slot_rx, proc->frame_tx, proc->slot_tx);
- return(0);
-}
-
-
-static void *process_stats_thread(void *param) {
- PHY_VARS_gNB *gNB = (PHY_VARS_gNB *)param;
- reset_meas(&gNB->dlsch_encoding_stats);
- reset_meas(&gNB->dlsch_scrambling_stats);
- reset_meas(&gNB->dlsch_modulation_stats);
-
- while(!oai_exit) {
- sleep(1);
- print_meas(&gNB->dlsch_encoding_stats, "pdsch_encoding", NULL, NULL);
- print_meas(&gNB->dlsch_scrambling_stats, "pdsch_scrambling", NULL, NULL);
- print_meas(&gNB->dlsch_modulation_stats, "pdsch_modulation", NULL, NULL);
- }
-
- return(NULL);
-}
-
-void init_gNB_proc(int inst) {
- PHY_VARS_gNB *gNB = RC.gNB[inst];
- gNB_L1_proc_t *proc = &gNB->proc;
- gNB_L1_rxtx_proc_t *L1_proc = &proc->L1_proc;
- gNB_L1_rxtx_proc_t *L1_proc_tx = &proc->L1_proc_tx;
- L1_proc->instance_cnt = -1;
- L1_proc_tx->instance_cnt = -1;
- L1_proc->instance_cnt_RUs = 0;
- L1_proc_tx->instance_cnt_RUs = 0;
- proc->instance_cnt_prach = -1;
- proc->instance_cnt_asynch_rxtx = -1;
- proc->CC_id = 0;
- proc->first_rx =1;
- proc->first_tx =1;
- proc->RU_mask =0;
- proc->RU_mask_tx = (1<num_RU)-1;
- proc->RU_mask_prach =0;
- pthread_mutex_init( &gNB->UL_INFO_mutex, NULL);
- gNB->threadPool = (tpool_t *)malloc(sizeof(tpool_t));
- gNB->respDecode = (notifiedFIFO_t *) malloc(sizeof(notifiedFIFO_t));
- char ul_pool[] = "-1,-1";
- initTpool(ul_pool, gNB->threadPool, false);
- initNotifiedFIFO(gNB->respDecode);
-}
-
-/// eNB kept in function name for nffapi calls, TO FIX
-void init_gNB_phase2(RU_t *ru) {
- int inst;
- LOG_I(PHY,"%s() RC.nb_nr_inst:%d\n", __FUNCTION__, RC.nb_nr_inst);
-
- for (inst=0; instnum_RU:%d\n", gNB->num_RU);
- phy_init_nr_gNB(gNB,0,0);
- RC.gNB[inst]->num_RU=1;
- RC.gNB[inst]->RU_list[0]=ru;
- //init_precoding_weights(RC.gNB[inst][CC_id]);
- }
-}
-
-void init_gNB(int single_thread_flag,int wait_for_sync) {
- for (int inst=0; instRCconfig_NR_L1\n");
- PHY_VARS_gNB *gNB= RC.gNB[inst];
- gNB->abstraction_flag = false;
- gNB->single_thread_flag = true;
- /*nr_polar_init(&gNB->nrPolar_params,
- NR_POLAR_PBCH_MESSAGE_TYPE,
- NR_POLAR_PBCH_PAYLOAD_BITS,
- NR_POLAR_PBCH_AGGREGATION_LEVEL);*/
- LOG_I(PHY,"Registering with MAC interface module\n");
- AssertFatal((gNB->if_inst = NR_IF_Module_init(inst))!=NULL,"Cannot register interface");
- gNB->if_inst->NR_Schedule_response = nr_schedule_response;
- gNB->if_inst->NR_PHY_config_req = nr_phy_config_request;
- memset((void *)&gNB->UL_INFO,0,sizeof(gNB->UL_INFO));
- memset((void *)&gNB->UL_tti_req,0,sizeof(nfapi_nr_ul_tti_request_t));
- //memset((void *)&gNB->Sched_INFO,0,sizeof(gNB->Sched_INFO));
- LOG_I(PHY,"Setting indication lists\n");
- gNB->UL_INFO.rx_ind.pdu_list = gNB->rx_pdu_list;
- gNB->UL_INFO.crc_ind.crc_list = gNB->crc_pdu_list;
- /*gNB->UL_INFO.sr_ind.sr_indication_body.sr_pdu_list = gNB->sr_pdu_list;
- gNB->UL_INFO.harq_ind.harq_indication_body.harq_pdu_list = gNB->harq_pdu_list;
- gNB->UL_INFO.cqi_ind.cqi_pdu_list = gNB->cqi_pdu_list;
- gNB->UL_INFO.cqi_ind.cqi_raw_pdu_list = gNB->cqi_raw_pdu_list;*/
- gNB->prach_energy_counter = 0;
- }
-
- LOG_I(PHY,"[nr-softmodem.c] gNB structure allocated\n");
-}
-
-
-void stop_gNB(int nb_inst) {
-}
-
-static void get_options(void) {
- paramdef_t cmdline_params[] = CMDLINE_PARAMS_DESC_GNB ;
- config_process_cmdline( cmdline_params,sizeof(cmdline_params)/sizeof(paramdef_t),NULL);
-
- if ( !(CONFIG_ISFLAGSET(CONFIG_ABORT)) ) {
- memset((void *)&RC,0,sizeof(RC));
- /* Read RC configuration file */
- NRRCConfig();
- printf("Configuration: nb_rrc_inst %d, nb_nr_L1_inst %d, nb_ru %hhd\n", RC.nb_nr_inst,RC.nb_nr_L1_inst,RC.nb_RU);
- }
-
- AssertFatal(RC.nb_nr_L1_inst == 1 && RC.nb_RU == 1, "Only one gNB, one RU and one carrier is supported\n");
-}
-
-void set_default_frame_parms(nfapi_nr_config_request_t *config[MAX_NUM_CCs],
- NR_DL_FRAME_PARMS *frame_parms[MAX_NUM_CCs]) {
- for (int CC_id=0; CC_idsubframe_config.numerology_index_mu.value =1;
- config[CC_id]->subframe_config.duplex_mode.value = 1; //FDD
- config[CC_id]->subframe_config.dl_cyclic_prefix_type.value = 0; //NORMAL
- config[CC_id]->rf_config.dl_carrier_bandwidth.value = 106;
- config[CC_id]->rf_config.ul_carrier_bandwidth.value = 106;
- config[CC_id]->sch_config.physical_cell_id.value = 0;
- }
-}
-
-static void init_pdcp(void) {
- //if (!NODE_IS_DU(RC.rrc[0]->node_type)) {
- pdcp_layer_init();
- uint32_t pdcp_initmask = (IS_SOFTMODEM_NOS1) ?
- (PDCP_USE_NETLINK_BIT | LINK_ENB_PDCP_TO_IP_DRIVER_BIT) : LINK_ENB_PDCP_TO_GTPV1U_BIT;
-
- if (IS_SOFTMODEM_NOS1) {
- printf("IS_SOFTMODEM_NOS1 option enabled \n");
- pdcp_initmask = pdcp_initmask | ENB_NAS_USE_TUN_BIT | SOFTMODEM_NOKRNMOD_BIT ;
- }
-
- nr_pdcp_module_init(pdcp_initmask, 0);
- pdcp_set_rlc_data_req_func(rlc_data_req);
- pdcp_set_pdcp_data_ind_func(pdcp_data_ind);
-}
-
-void init_main_gNB(void) {
- RCconfig_NR_L1();
- RCconfig_nr_macrlc();
-
- if (RC.nb_nr_L1_inst>0)
- AssertFatal(l1_north_init_gNB()==0,"could not initialize L1 north interface\n");
-
- LOG_I(GNB_APP,"Allocating gNB_RRC_INST for %d instances\n",RC.nb_nr_inst);
- RC.nrrrc = (gNB_RRC_INST **)calloc(RC.nb_nr_inst*sizeof(gNB_RRC_INST *),1);
- LOG_I(PHY, "%s() RC.nb_nr_inst:%d RC.nrrrc:%p\n", __FUNCTION__, RC.nb_nr_inst, RC.nrrrc);
- int gnb_id=0; // only 1 gnb per process, index 0 for now
- RC.nrrrc[gnb_id] = (gNB_RRC_INST *)calloc(sizeof(gNB_RRC_INST),1);
- MessageDef *msg_p = itti_alloc_new_message (TASK_GNB_APP, 0, NRRRC_CONFIGURATION_REQ);
- RCconfig_NRRRC(msg_p,gnb_id, RC.nrrrc[gnb_id]);
- openair_rrc_gNB_configuration(GNB_INSTANCE_TO_MODULE_ID(ITTI_MSG_DESTINATION_INSTANCE(msg_p)), &NRRRC_CONFIGURATION_REQ(msg_p));
- //AssertFatal(itti_create_task(TASK_GNB_APP, gNB_app_task, NULL) >= 0, "");
- AssertFatal(itti_create_task(TASK_RRC_GNB, rrc_gnb_task, NULL) >= 0, "");
- //AssertFatal(itti_create_task(TASK_X2AP, x2ap_task, NULL) >= 0, "");
-}
-
-static void wait_nfapi_init(char *thread_name) {
- printf( "waiting for NFAPI PNF connection and population of global structure (%s)\n",thread_name);
- pthread_mutex_lock( &nfapi_sync_mutex );
-
- while (nfapi_sync_var<0)
- pthread_cond_wait( &nfapi_sync_cond, &nfapi_sync_mutex );
-
- pthread_mutex_unlock(&nfapi_sync_mutex);
- printf( "NFAPI: got sync (%s)\n", thread_name);
-}
-
-void exit_function(const char *file, const char *function, const int line, const char *s) {
- if (s != NULL) {
- printf("%s:%d %s() Exiting OAI softmodem: %s\n",file,line, function, s);
- }
-
- oai_exit = 1;
- sleep(1); //allow lte-softmodem threads to exit first
- exit(1);
-}
-
-void stop_RU(int nb_ru) {
- return;
-}
-
-void OCPconfig_RU(RU_t *ru) {
- int i = 0, j = 0; // Ru and gNB cardinality
- paramdef_t RUParams[] = RUPARAMS_DESC;
- paramlist_def_t RUParamList = {CONFIG_STRING_RU_LIST,NULL,0};
- config_getlist( &RUParamList, RUParams, sizeof(RUParams)/sizeof(paramdef_t), NULL);
- AssertFatal( RUParamList.numelt == 1 && RC.nb_nr_L1_inst ==1,"" );
- ru->idx=0;
- ru->nr_frame_parms = (NR_DL_FRAME_PARMS *)calloc(sizeof(NR_DL_FRAME_PARMS),1);
- ru->frame_parms = (LTE_DL_FRAME_PARMS *)calloc(sizeof(LTE_DL_FRAME_PARMS),1);
- ru->if_timing = synch_to_ext_device;
- ru->num_gNB = RUParamList.paramarray[j][RU_ENB_LIST_IDX].numelt;
- ru->gNB_list[i] = &RC.gNB[RUParamList.paramarray[j][RU_ENB_LIST_IDX].iptr[i]][0];
-
- if (config_isparamset(RUParamList.paramarray[j], RU_SDR_ADDRS)) {
- ru->openair0_cfg.sdr_addrs = strdup(*(RUParamList.paramarray[j][RU_SDR_ADDRS].strptr));
- }
-
- if (config_isparamset(RUParamList.paramarray[j], RU_SDR_CLK_SRC)) {
- if (strcmp(*(RUParamList.paramarray[j][RU_SDR_CLK_SRC].strptr), "internal") == 0) {
- ru->openair0_cfg.clock_source = internal;
- LOG_D(PHY, "RU clock source set as internal\n");
- } else if (strcmp(*(RUParamList.paramarray[j][RU_SDR_CLK_SRC].strptr), "external") == 0) {
- ru->openair0_cfg.clock_source = external;
- LOG_D(PHY, "RU clock source set as external\n");
- } else if (strcmp(*(RUParamList.paramarray[j][RU_SDR_CLK_SRC].strptr), "gpsdo") == 0) {
- ru->openair0_cfg.clock_source = gpsdo;
- LOG_D(PHY, "RU clock source set as gpsdo\n");
- } else {
- LOG_E(PHY, "Erroneous RU clock source in the provided configuration file: '%s'\n", *(RUParamList.paramarray[j][RU_SDR_CLK_SRC].strptr));
- }
- } else {
- ru->openair0_cfg.clock_source = unset;
- }
-
- if (strcmp(*(RUParamList.paramarray[j][RU_LOCAL_RF_IDX].strptr), "yes") == 0) {
- if ( !(config_isparamset(RUParamList.paramarray[j],RU_LOCAL_IF_NAME_IDX)) ) {
- ru->if_south = REMOTE_IF5; //TBD: max value to avoid to call "ru" functions
- ru->function = gNodeB_3GPP;
- printf("Setting function for RU %d to gNodeB_3GPP\n",j);
- } else {
- }
-
- ru->max_pdschReferenceSignalPower = *(RUParamList.paramarray[j][RU_MAX_RS_EPRE_IDX].uptr);;
- ru->max_rxgain = *(RUParamList.paramarray[j][RU_MAX_RXGAIN_IDX].uptr);
- ru->num_bands = RUParamList.paramarray[j][RU_BAND_LIST_IDX].numelt;
-
- for (i=0; inum_bands; i++) ru->band[i] = RUParamList.paramarray[j][RU_BAND_LIST_IDX].iptr[i];
- } //strcmp(local_rf, "yes") == 0
- else {
- }
-
- ru->nb_tx = *(RUParamList.paramarray[j][RU_NB_TX_IDX].uptr);
- ru->nb_rx = *(RUParamList.paramarray[j][RU_NB_RX_IDX].uptr);
- ru->att_tx = *(RUParamList.paramarray[j][RU_ATT_TX_IDX].uptr);
- ru->att_rx = *(RUParamList.paramarray[j][RU_ATT_RX_IDX].uptr);
-
- if (config_isparamset(RUParamList.paramarray[j], RU_BF_WEIGHTS_LIST_IDX)) {
- ru->nb_bfw = RUParamList.paramarray[j][RU_BF_WEIGHTS_LIST_IDX].numelt;
-
- for (i=0; inum_gNB; i++) {
- ru->bw_list[i] = (int32_t *)malloc16_clear((ru->nb_bfw)*sizeof(int32_t));
-
- for (int b=0; bnb_bfw; b++) ru->bw_list[i][b] = RUParamList.paramarray[j][RU_BF_WEIGHTS_LIST_IDX].iptr[b];
- }
- }
-
- return;
-}
-
-// this is for RU with local RF unit
-void fill_rf_config(RU_t *ru, char *rf_config_file) {
- int i;
- NR_DL_FRAME_PARMS *fp = ru->nr_frame_parms;
- nfapi_nr_config_request_scf_t *gNB_config = &ru->gNB_list[0]->gNB_config; //tmp index
- openair0_config_t *cfg = &ru->openair0_cfg;
- int mu = gNB_config->ssb_config.scs_common.value;
- int N_RB = gNB_config->carrier_config.dl_grid_size[gNB_config->ssb_config.scs_common.value].value;
- fp->threequarter_fs=threequarter_fs;
-
- if (mu == NR_MU_0) { //or if LTE
- if(N_RB == 100) {
- if (fp->threequarter_fs) {
- cfg->sample_rate=23.04e6;
- cfg->samples_per_frame = 230400;
- cfg->tx_bw = 10e6;
- cfg->rx_bw = 10e6;
- } else {
- cfg->sample_rate=30.72e6;
- cfg->samples_per_frame = 307200;
- cfg->tx_bw = 10e6;
- cfg->rx_bw = 10e6;
- }
- } else if(N_RB == 50) {
- cfg->sample_rate=15.36e6;
- cfg->samples_per_frame = 153600;
- cfg->tx_bw = 5e6;
- cfg->rx_bw = 5e6;
- } else if (N_RB == 25) {
- cfg->sample_rate=7.68e6;
- cfg->samples_per_frame = 76800;
- cfg->tx_bw = 2.5e6;
- cfg->rx_bw = 2.5e6;
- } else if (N_RB == 6) {
- cfg->sample_rate=1.92e6;
- cfg->samples_per_frame = 19200;
- cfg->tx_bw = 1.5e6;
- cfg->rx_bw = 1.5e6;
- } else AssertFatal(1==0,"Unknown N_RB %d\n",N_RB);
- } else if (mu == NR_MU_1) {
- if(N_RB == 273) {
- if (fp->threequarter_fs) {
- AssertFatal(0 == 1,"three quarter sampling not supported for N_RB 273\n");
- } else {
- cfg->sample_rate=122.88e6;
- cfg->samples_per_frame = 1228800;
- cfg->tx_bw = 100e6;
- cfg->rx_bw = 100e6;
- }
- } else if(N_RB == 217) {
- if (fp->threequarter_fs) {
- cfg->sample_rate=92.16e6;
- cfg->samples_per_frame = 921600;
- cfg->tx_bw = 80e6;
- cfg->rx_bw = 80e6;
- } else {
- cfg->sample_rate=122.88e6;
- cfg->samples_per_frame = 1228800;
- cfg->tx_bw = 80e6;
- cfg->rx_bw = 80e6;
- }
- } else if(N_RB == 106) {
- if (fp->threequarter_fs) {
- cfg->sample_rate=46.08e6;
- cfg->samples_per_frame = 460800;
- cfg->tx_bw = 40e6;
- cfg->rx_bw = 40e6;
- } else {
- cfg->sample_rate=61.44e6;
- cfg->samples_per_frame = 614400;
- cfg->tx_bw = 40e6;
- cfg->rx_bw = 40e6;
- }
- } else {
- AssertFatal(0==1,"N_RB %d not yet supported for numerology %d\n",N_RB,mu);
- }
- } else if (mu == NR_MU_3) {
- if (N_RB == 66) {
- cfg->sample_rate = 122.88e6;
- cfg->samples_per_frame = 1228800;
- cfg->tx_bw = 100e6;
- cfg->rx_bw = 100e6;
- } else if(N_RB == 32) {
- cfg->sample_rate=61.44e6;
- cfg->samples_per_frame = 614400;
- cfg->tx_bw = 50e6;
- cfg->rx_bw = 50e6;
- }
- } else {
- AssertFatal(0 == 1,"Numerology %d not supported for the moment\n",mu);
- }
-
- if (gNB_config->cell_config.frame_duplex_type.value==TDD)
- cfg->duplex_mode = duplex_mode_TDD;
- else //FDD
- cfg->duplex_mode = duplex_mode_FDD;
-
- cfg->Mod_id = 0;
- cfg->num_rb_dl=N_RB;
- cfg->tx_num_channels=ru->nb_tx;
- cfg->rx_num_channels=ru->nb_rx;
-
- for (i=0; inb_tx; i++) {
- if (ru->if_frequency == 0) {
- cfg->tx_freq[i] = (double)fp->dl_CarrierFreq;
- cfg->rx_freq[i] = (double)fp->ul_CarrierFreq;
- } else {
- cfg->tx_freq[i] = (double)ru->if_frequency;
- cfg->rx_freq[i] = (double)(ru->if_frequency+fp->ul_CarrierFreq-fp->dl_CarrierFreq);
- }
-
- cfg->tx_gain[i] = ru->att_tx;
- cfg->rx_gain[i] = ru->max_rxgain-ru->att_rx;
- cfg->configFilename = rf_config_file;
- printf("channel %d, Setting tx_gain offset %f, rx_gain offset %f, tx_freq %f, rx_freq %f\n",
- i, cfg->tx_gain[i],
- cfg->rx_gain[i],
- cfg->tx_freq[i],
- cfg->rx_freq[i]);
- }
-}
-
-/* this function maps the RU tx and rx buffers to the available rf chains.
- Each rf chain is is addressed by the card number and the chain on the card. The
- rf_map specifies for each antenna port, on which rf chain the mapping should start. Multiple
- antennas are mapped to successive RF chains on the same card. */
-int setup_RU_buffers(RU_t *ru) {
- int i,j;
- int card,ant;
- //uint16_t N_TA_offset = 0;
- NR_DL_FRAME_PARMS *frame_parms;
- nfapi_nr_config_request_scf_t *config = &ru->config;
-
- if (ru) {
- frame_parms = ru->nr_frame_parms;
- printf("setup_RU_buffers: frame_parms = %p\n",frame_parms);
- } else {
- printf("ru pointer is NULL\n");
- return(-1);
- }
-
- int mu = config->ssb_config.scs_common.value;
- int N_RB = config->carrier_config.dl_grid_size[config->ssb_config.scs_common.value].value;
-
- if (config->cell_config.frame_duplex_type.value == TDD) {
- int N_TA_offset = config->carrier_config.uplink_frequency.value < 6000000 ? 400 : 431; // reference samples for 25600Tc @ 30.72 Ms/s for FR1, same @ 61.44 Ms/s for FR2
- double factor=1;
-
- switch (mu) {
- case 0: //15 kHz scs
- AssertFatal(N_TA_offset == 400,"scs_common 15kHz only for FR1\n");
-
- if (N_RB <= 25) factor = .25; // 7.68 Ms/s
- else if (N_RB <=50) factor = .5; // 15.36 Ms/s
- else if (N_RB <=75) factor = 1.0; // 30.72 Ms/s
- else if (N_RB <=100) factor = 1.0; // 30.72 Ms/s
- else AssertFatal(1==0,"Too many PRBS for mu=0\n");
-
- break;
-
- case 1: //30 kHz sc
- AssertFatal(N_TA_offset == 400,"scs_common 30kHz only for FR1\n");
-
- if (N_RB <= 106) factor = 2.0; // 61.44 Ms/s
- else if (N_RB <= 275) factor = 4.0; // 122.88 Ms/s
-
- break;
-
- case 2: //60 kHz scs
- AssertFatal(1==0,"scs_common should not be 60 kHz\n");
- break;
-
- case 3: //120 kHz scs
- AssertFatal(N_TA_offset == 431,"scs_common 120kHz only for FR2\n");
- break;
-
- case 4: //240 kHz scs
- AssertFatal(1==0,"scs_common should not be 60 kHz\n");
-
- if (N_RB <= 32) factor = 1.0; // 61.44 Ms/s
- else if (N_RB <= 66) factor = 2.0; // 122.88 Ms/s
- else AssertFatal(1==0,"N_RB %d is too big for curretn FR2 implementation\n",N_RB);
-
- break;
-
- if (N_RB == 100) ru->N_TA_offset = 624;
- else if (N_RB == 50) ru->N_TA_offset = 624/2;
- else if (N_RB == 25) ru->N_TA_offset = 624/4;
- }
-
- if (frame_parms->threequarter_fs == 1) factor = factor*.75;
-
- ru->N_TA_offset = (int)(N_TA_offset * factor);
- LOG_I(PHY,"RU %d Setting N_TA_offset to %d samples (factor %f, UL Freq %d, N_RB %d)\n",ru->idx,ru->N_TA_offset,factor,
- config->carrier_config.uplink_frequency.value, N_RB);
- } else ru->N_TA_offset = 0;
-
- if (ru->openair0_cfg.mmapped_dma == 1) {
- // replace RX signal buffers with mmaped HW versions
- for (i=0; inb_rx; i++) {
- card = i/4;
- ant = i%4;
- printf("Mapping RU id %u, rx_ant %d, on card %d, chain %d\n",ru->idx,i,ru->rf_map.card+card, ru->rf_map.chain+ant);
- free(ru->common.rxdata[i]);
- ru->common.rxdata[i] = ru->openair0_cfg.rxbase[ru->rf_map.chain+ant];
- printf("rxdata[%d] @ %p\n",i,ru->common.rxdata[i]);
-
- for (j=0; j<16; j++) {
- printf("rxbuffer %d: %x\n",j,ru->common.rxdata[i][j]);
- ru->common.rxdata[i][j] = 16-j;
- }
- }
-
- for (i=0; inb_tx; i++) {
- card = i/4;
- ant = i%4;
- printf("Mapping RU id %u, tx_ant %d, on card %d, chain %d\n",ru->idx,i,ru->rf_map.card+card, ru->rf_map.chain+ant);
- free(ru->common.txdata[i]);
- ru->common.txdata[i] = ru->openair0_cfg.txbase[ru->rf_map.chain+ant];
- printf("txdata[%d] @ %p\n",i,ru->common.txdata[i]);
-
- for (j=0; j<16; j++) {
- printf("txbuffer %d: %x\n",j,ru->common.txdata[i][j]);
- ru->common.txdata[i][j] = 16-j;
- }
- }
- } else { // not memory-mapped DMA
- //nothing to do, everything already allocated in lte_init
- }
-
- return(0);
-}
-int rx_rf(int rxBufOffet, int nbSamples, int nb_rx, int32_t **rxdata, openair0_device *rfdevice, openair0_timestamp *HWtimeStamp) {
- void *rxp[nb_rx];
-
- for (int i=0; itrx_read_func(rfdevice,
- HWtimeStamp,
- rxp,
- nbSamples,
- nb_rx);
-
- if (rxs != nbSamples )
- LOG_E(PHY, "rx_rf: Asked for %d samples, got %d from USRP\n",nbSamples,rxs);
-
- return rxs;
-}
-
-void tx_rf(RU_t *ru,int frame,int slot, uint64_t timestamp) {
- RU_proc_t *proc = &ru->proc;
- NR_DL_FRAME_PARMS *fp = ru->nr_frame_parms;
- nfapi_nr_config_request_scf_t *cfg = &ru->gNB_list[0]->gNB_config;
- int i,txsymb;
- int slot_type = nr_slot_select(cfg,frame,slot%fp->slots_per_frame);
- int prevslot_type = nr_slot_select(cfg,frame,(slot+(fp->slots_per_frame-1))%fp->slots_per_frame);
- int nextslot_type = nr_slot_select(cfg,frame,(slot+1)%fp->slots_per_frame);
- int sf_extension = 0; //sf_extension = ru->sf_extension;
- int siglen=fp->get_samples_per_slot(slot,fp);
- int flags=1;
-
- //nr_subframe_t SF_type = nr_slot_select(cfg,slot%fp->slots_per_frame);
- if (slot_type == NR_DOWNLINK_SLOT || slot_type == NR_MIXED_SLOT || IS_SOFTMODEM_RFSIM) {
- if(slot_type == NR_MIXED_SLOT) {
- txsymb = 0;
-
- for(int symbol_count =0; symbol_counttdd_table.max_tdd_periodicity_list[slot].max_num_of_symbol_per_slot_list[symbol_count].slot_config.value==0)
- txsymb++;
- }
-
- AssertFatal(txsymb>0,"illegal txsymb %d\n",txsymb);
-
- if(slot%(fp->slots_per_subframe/2))
- siglen = txsymb * (fp->ofdm_symbol_size + fp->nb_prefix_samples);
- else
- siglen = (fp->ofdm_symbol_size + fp->nb_prefix_samples0) + (txsymb - 1) * (fp->ofdm_symbol_size + fp->nb_prefix_samples);
-
- //+ ru->end_of_burst_delay;
- flags=3; // end of burst
- }
-
- if (cfg->cell_config.frame_duplex_type.value == TDD &&
- slot_type == NR_DOWNLINK_SLOT &&
- prevslot_type == NR_UPLINK_SLOT) {
- flags = 2; // start of burst
- }
-
- if (cfg->cell_config.frame_duplex_type.value == TDD &&
- slot_type == NR_DOWNLINK_SLOT &&
- nextslot_type == NR_UPLINK_SLOT) {
- flags = 3; // end of burst
- }
-
- if (fp->freq_range==nr_FR2) {
- // the beam index is written in bits 8-10 of the flags
- // bit 11 enables the gpio programming
- int beam=0;
-
- if (slot==0) beam = 11; //3 for boresight & 8 to enable
-
- /*
- if (slot==0 || slot==40) beam=0&8;
- if (slot==10 || slot==50) beam=1&8;
- if (slot==20 || slot==60) beam=2&8;
- if (slot==30 || slot==70) beam=3&8;
- */
- flags |= beam<<8;
- }
-
- void *txp[ru->nb_tx];
-
- for (i=0; inb_tx; i++)
- txp[i] = (void *)&ru->common.txdata[i][fp->get_samples_slot_timestamp(slot,fp,0)-sf_extension];
-
- // prepare tx buffer pointers
- unsigned int txs = ru->rfdevice.trx_write_func(&ru->rfdevice,
- timestamp+ru->ts_offset-ru->openair0_cfg.tx_sample_advance-sf_extension,
- txp,
- siglen+sf_extension,
- ru->nb_tx,
- flags);
- LOG_D(PHY,"[TXPATH] RU %d tx_rf, writing to TS %llu, frame %d, unwrapped_frame %d, slot %d\n",ru->idx,
- (long long unsigned int)timestamp,frame,proc->frame_tx_unwrap,slot);
- AssertFatal(txs == siglen+sf_extension,"TX : Timeout (sent %u/%d)\n", txs, siglen);
- }
-}
-
-static void *ru_thread( void *param ) {
- RU_t *ru = (RU_t *)param;
- NR_DL_FRAME_PARMS *fp = ru->nr_frame_parms;
- LOG_I(PHY,"Starting RU %d (%s,%s),\n",ru->idx,NB_functions[ru->function],NB_timing[ru->if_timing]);
- nr_dump_frame_parms(fp);
- AssertFatal(openair0_device_load(&ru->rfdevice,&ru->openair0_cfg)==0,"Cannot connect to local radio\n");
- AssertFatal(ru->rfdevice.trx_start_func(&ru->rfdevice) == 0,"Could not start the RF device\n");
- int64_t slot=-1;
- int64_t nextHWTSshouldBe=0, nextRxTSlogical=0;
- // weird globals, used in NR_IF_Module.c
- sf_ahead = (uint16_t) ceil((float)6/(0x01<numerology_index));
- sl_ahead = sf_ahead*fp->slots_per_subframe;
-
- // This is a forever while loop, it loops over subframes which are scheduled by incoming samples from HW devices
-
- while (!oai_exit) {
- int nextSlot=(slot+1)%fp->slots_per_frame;
- uint32_t samples_per_slot = fp->get_samples_per_slot(nextSlot,fp);
- int rxBuffOffset=fp->get_samples_slot_timestamp(nextSlot,fp,0);
- AssertFatal(rxBuffOffset + samples_per_slot <= fp->samples_per_frame, "Will read outside allocated buffer\n");
- int samples=fp->get_samples_per_slot(nextSlot,fp);
- openair0_timestamp HWtimeStamp=0; //for multi RU
- int rxs=rx_rf(rxBuffOffset,
- samples,
- ru->nb_rx,
- ru->common.rxdata,
- &ru->rfdevice,
- &HWtimeStamp);
- LOG_D(PHY,"Reading %d samples for slot %d\n",samples_per_slot,nextSlot);
-
- if ( HWtimeStamp != nextHWTSshouldBe)
- LOG_E(HW,"reading a stream must be continuous, %ld, %ld\n", HWtimeStamp, nextHWTSshouldBe);
-
- nextHWTSshouldBe=HWtimeStamp+rxs;
- ru->proc.timestamp_rx=nextRxTSlogical;
- nextRxTSlogical+=samples_per_slot;
- int64_t HW_to_logical_RxTSoffset=(int64_t)HWtimeStamp-(int64_t)ru->proc.timestamp_rx;
- ru->proc.frame_rx = (ru->proc.timestamp_rx / (fp->samples_per_subframe*10))&1023;
- uint32_t idx_sf = ru->proc.timestamp_rx / fp->samples_per_subframe;
- float offsetInSubframe=ru->proc.timestamp_rx % fp->samples_per_subframe;
- ru->proc.tti_rx = (idx_sf * fp->slots_per_subframe +
- lroundf(offsetInSubframe / fp->samples_per_slot0))%
- fp->slots_per_frame;
- LOG_D(PHY,"RU %d/%d TS %llu (off %d), frame %d, slot %d.%d / %d\n",
- ru->idx, 0,
- (unsigned long long int)ru->proc.timestamp_rx,
- (int)ru->ts_offset,ru->proc.frame_rx,ru->proc.tti_rx,ru->proc.tti_tx,fp->slots_per_frame);
- int slot_type = nr_slot_select(&ru->gNB_list[0]->gNB_config,ru->proc.frame_rx,ru->proc.tti_rx);
-
- if (slot_type == NR_UPLINK_SLOT || slot_type == NR_MIXED_SLOT) {
- nr_fep_full(ru,ru->proc.tti_rx);
-
- for (int aa=0; aanb_rx; aa++)
- memcpy((void *)RC.gNB[0]->common_vars.rxdataF[aa],
- (void *)ru->common.rxdataF[aa], fp->symbols_per_slot*fp->ofdm_symbol_size*sizeof(int32_t));
-
- LOG_D(PHY, "rxdataF energy: %d\n", signal_energy(ru->common.rxdataF[0], fp->symbols_per_slot*fp->ofdm_symbol_size));
- }
-
- gNB_L1_proc_t *gNBproc=&RC.gNB[0][0].proc;
- gNB_L1_rxtx_proc_t *L1_proc = &gNBproc->L1_proc;
- NR_DL_FRAME_PARMS *fp = ru->nr_frame_parms;
- gNBproc->timestamp_rx = ru->proc.timestamp_rx;
- L1_proc->frame_rx = gNBproc->frame_rx = gNBproc->frame_prach = ru->proc.frame_rx =
- (ru->proc.timestamp_rx / (fp->samples_per_subframe*10))&1023;
- L1_proc->slot_rx = gNBproc->slot_rx = gNBproc->slot_prach =
- ru->proc.tti_rx; // computed before in caller function
- L1_proc->timestamp_tx = gNBproc->timestamp_tx = ru->proc.timestamp_tx =
- ru->proc.timestamp_rx +
- sf_ahead*fp->samples_per_subframe;
- L1_proc->frame_tx = gNBproc->frame_tx = ru->proc.frame_tx =
- (gNBproc->timestamp_tx / (fp->samples_per_subframe*10))&1023;
- L1_proc->slot_tx = ru->proc.tti_tx =
- (L1_proc->slot_rx + sl_ahead)%fp->slots_per_frame;
-
- if (ocp_rxtx(&RC.gNB[0][0],L1_proc) < 0)
- LOG_E(PHY,"gNB %d CC_id %d failed during execution\n",RC.gNB[0][0].Mod_id,RC.gNB[0][0].CC_id);
-
- // do TX front-end processing if needed (precoding and/or IDFTs)
- //ru->feptx_prec(ru,proc->frame_tx,proc->tti_tx);
- nr_feptx_prec(ru,ru->proc.frame_tx,ru->proc.tti_tx);
- // do OFDM with/without TX front-end processing if needed
- //ru->feptx_ofdm
- nfapi_nr_config_request_scf_t *cfg = &ru->gNB_list[0]->gNB_config;
-
- if (nr_slot_select(cfg,ru->proc.frame_tx, ru->proc.tti_tx ) != NR_UPLINK_SLOT) {
- int aa=0; // antenna 0 hardcoded
- NR_DL_FRAME_PARMS *fp=ru->nr_frame_parms;
- nr_feptx0(ru,ru->proc.tti_tx,0,fp->symbols_per_slot,aa);
- int *txdata = &ru->common.txdata[aa][fp->get_samples_slot_timestamp(ru->proc.tti_tx,fp,0)];
- int slot_sizeF = (fp->ofdm_symbol_size)*
- ((NFAPI_CP_NORMAL == 1) ? 12 : 14);
- LOG_D(PHY,"feptx_ofdm (TXPATH): frame %d, slot %d: txp (time %ld) %d dB, txp (freq) %d dB\n",
- ru->proc.frame_tx,ru->proc.tti_tx,ru->proc.timestamp_tx,
- dB_fixed(signal_energy((int32_t *)txdata,fp->get_samples_per_slot(ru->proc.tti_tx,fp))),
- dB_fixed(signal_energy_nodc(ru->common.txdataF_BF[aa],2*slot_sizeF)));
- }
-
- // do outgoing fronthaul (south) if needed
- tx_rf(ru,ru->proc.frame_tx,ru->proc.tti_tx,ru->proc.timestamp_tx+HW_to_logical_RxTSoffset);
- slot++;
- }
-
- printf( "Exiting ru_thread \n");
- ru->rfdevice.trx_end_func(&ru->rfdevice);
- static int ru_thread_status = 0;
- return &ru_thread_status;
-}
-
-void launch_NR_RU(RU_t *ru, char *rf_config_file) {
- LOG_I(PHY,"number of L1 instances %d, number of RU %d, number of CPU cores %d\n",
- RC.nb_nr_L1_inst,RC.nb_RU,get_nprocs());
- LOG_D(PHY,"Process RUs RC.nb_RU:%d\n",RC.nb_RU);
-
- for (int ru_id=0; ru_idrf_config_file = rf_config_file;
- ru->idx = ru_id;
- ru->ts_offset = 0;
- // use gNB_list[0] as a reference for RU frame parameters
- // NOTE: multiple CC_id are not handled here yet!
- LOG_D(PHY, "%s() RC.ru[%d].num_gNB:%d ru->gNB_list[0]:%p rf_config_file:%s\n",
- __FUNCTION__, ru_id, ru->num_gNB, ru->gNB_list[0], ru->rf_config_file);
- LOG_E(PHY,"ru->gNB_list ru->num_gNB hardcoded: one RU connected to carrier 0 of gNB 0\n");
- ru->gNB_list[0] = &RC.gNB[0][0];
- ru->num_gNB=1;
- LOG_I(PHY,"Copying frame parms from gNB in RC to ru %d and frame_parms in ru\n",ru->idx);
- RU_proc_t *proc = &ru->proc;
- threadCreate( &proc->pthread_FH, ru_thread, (void *)ru, "MainLoop", -1, OAI_PRIORITY_RT_MAX );
- }
-}
-
-void init_eNB_afterRU(void) {
- AssertFatal(false,"");
-}
-
-int main( int argc, char **argv ) {
- AssertFatal(load_configmodule(argc,argv,CONFIG_ENABLECMDLINEONLY),
- "[SOFTMODEM] Error, configuration module init failed\n");
- logInit();
-#ifndef PACKAGE_VERSION
-# define PACKAGE_VERSION "UNKNOWN"
-#endif
- LOG_I(HW, "Version: %s\n", PACKAGE_VERSION);
- set_latency_target();
- get_options ();
- get_common_options(SOFTMODEM_GNB_BIT );
- AssertFatal(!CONFIG_ISFLAGSET(CONFIG_ABORT),"Getting configuration failed\n");
- cpuf=get_cpu_freq_GHz();
- itti_init(TASK_MAX, tasks_info);
- set_taus_seed (0);
- init_opt();
- init_pdcp();
- init_main_gNB();
- init_gNB(true, wait_for_sync);
- /* Start the agent. If it is turned off in the configuration, it won't start */
- RCconfig_nr_flexran();
-
- for (int i = 0; i < RC.nb_nr_L1_inst; i++) {
- flexran_agent_start(i);
- }
-
- /*
- *nfapi stuff very buggy in 4G, not yet implemented in 5G
- */
- // init UE_PF_PO and mutex lock (paging from S1AP)
- pthread_mutex_init(&ue_pf_po_mutex, NULL);
- printf("NFAPI*** - mutex and cond created - will block shortly for completion of PNF connection\n");
- pthread_cond_init(&nfapi_sync_cond,NULL);
- pthread_mutex_init(&nfapi_sync_mutex, NULL);
- const char *nfapi_mode_str[] = {
- "MONOLITHIC", "PNF", "VNF",
- };
- AssertFatal(nfapi_mode < 3,"");
- printf("NFAPI MODE:%s\n", nfapi_mode_str[nfapi_mode]);
-
- if (nfapi_mode==NFAPI_MODE_VNF) // VNF
- wait_nfapi_init("main?");
-
- for (int i=0; iconfigured, "Remain threads to manage\n");
-
- printf("About to Init RU threads RC.nb_RU:%d\n", RC.nb_RU);
- config_sync_var=0;
-
- if (nfapi_mode==NFAPI_MODE_PNF) { // PNF
- wait_nfapi_init("main?");
- }
-
- printf("wait RUs\n");
- printf("ALL RUs READY!\n");
- printf("RC.nb_RU:%d\n", RC.nb_RU);
- // once all RUs are ready initialize the rest of the gNBs ((dependence on final RU parameters after configuration)
- printf("ALL RUs ready - init gNBs\n");
- LOG_E(PHY,"configuring RU from file, hardcoded one gNB for one RU, one carrier\n");
- RU_t ru= {0};
- OCPconfig_RU(&ru);
- ru.nr_frame_parms->threequarter_fs=threequarter_fs;
- fill_rf_config(&ru,ru.rf_config_file);
- init_gNB_phase2(&ru);
- memcpy((void *)ru.nr_frame_parms,&RC.gNB[0][0].frame_parms,sizeof(NR_DL_FRAME_PARMS));
- memcpy((void *)&ru.config,(void *)&RC.gNB[0]->gNB_config,sizeof(ru.config));
- AssertFatal(setup_RU_buffers(&ru)==0,"Inconsistent configuration");
- nr_phy_init_RU(&ru);
- init_gNB_proc(0); // only instance 0 (one gNB per process)
-
- if (RC.nb_RU >0) {
- printf("Initializing RU threads\n");
- launch_NR_RU(&ru, get_softmodem_params()->rf_config_file);
- }
-
- if (opp_enabled ==1) {
- pthread_t t;
- threadCreate(&t, process_stats_thread,
- (void *)NULL, "time_meas", -1, OAI_PRIORITY_RT_LOW);
- }
-
- if(IS_SOFTMODEM_DOSCOPE) {
- scopeParms_t tmp= {&argc, argv, &ru, RC.gNB[0]};
- load_softscope("nr",&tmp);
- }
-
- while(!oai_exit)
- sleep(1);
-
- logClean();
- printf("Bye.\n");
- return 0;
-}
diff --git a/executables/softmodem-common.h b/executables/softmodem-common.h
index 16014c6024..1f73720e70 100644
--- a/executables/softmodem-common.h
+++ b/executables/softmodem-common.h
@@ -120,7 +120,6 @@ extern "C"
#define TIMING_SOURCE softmodem_params.timing_source
#define SEND_DMRSSYNC softmodem_params.send_dmrs_sync
#define USIM_TEST softmodem_params.usim_test
-#define USE_256QAM_TABLE softmodem_params.use_256qam_table
#define PRB_INTERPOLATION softmodem_params.prb_interpolation
#define NFAPI softmodem_params.nfapi
#define NSA softmodem_params.nsa
@@ -158,14 +157,13 @@ extern int usrp_tx_thread;
{"basicsim", CONFIG_HLP_RFSIM, PARAMFLAG_BOOL, uptr:&basicsim, defintval:0, TYPE_INT, 0}, \
{"nokrnmod", CONFIG_HLP_NOKRNMOD, PARAMFLAG_BOOL, uptr:&nokrnmod, defintval:0, TYPE_INT, 0}, \
{"nbiot-disable", CONFIG_HLP_DISABLNBIOT, PARAMFLAG_BOOL, uptr:&nonbiot, defuintval:0, TYPE_INT, 0}, \
- {"use-256qam-table", CONFIG_HLP_256QAM, PARAMFLAG_BOOL, iptr:&USE_256QAM_TABLE, defintval:0, TYPE_INT, 0}, \
{"nsa", CONFIG_HLP_NSA, PARAMFLAG_BOOL, iptr:&NSA, defintval:0, TYPE_INT, 0}, \
{"node-number", NULL, 0, u16ptr:&NODE_NUMBER, defuintval:0, TYPE_UINT16, 0}, \
{"usrp-tx-thread-config", CONFIG_HLP_USRP_THREAD, 0, iptr:&usrp_tx_thread, defstrval:0, TYPE_INT, 0}, \
{"do-prb-interpolation", CONFIG_HLP_PRBINTER, PARAMFLAG_BOOL, iptr:&PRB_INTERPOLATION, defintval:0, TYPE_INT, 0}, \
{"nfapi", CONFIG_HLP_NFAPI, 0, u8ptr:&nfapi_mode, defintval:0, TYPE_UINT8, 0}, \
{"non-stop", CONFIG_HLP_NONSTOP, PARAMFLAG_BOOL, iptr:&NON_STOP, defintval:0, TYPE_INT, 0}, \
- {"emulate-l1", CONFIG_L1_EMULATOR, PARAMFLAG_BOOL, iptr:&EMULATE_L1, defintval:0, TYPE_INT, 0}, \
+ {"emulate-l1", CONFIG_L1_EMULATOR, PARAMFLAG_BOOL, iptr:&EMULATE_L1, defintval:0, TYPE_INT, 0} \
}
#define CONFIG_HLP_NSA "Enable NSA mode \n"
@@ -250,7 +248,6 @@ typedef struct {
uint32_t timing_source;
int hw_timing_advance;
uint32_t send_dmrs_sync;
- int use_256qam_table;
int prb_interpolation;
uint8_t nfapi;
int nsa;
diff --git a/executables/transport_split.c b/executables/transport_split.c
index f380eb90e3..e7199637cc 100644
--- a/executables/transport_split.c
+++ b/executables/transport_split.c
@@ -156,7 +156,7 @@ int receiveSubFrame(UDPsock_t *sock, void *bufferZone, int bufferSize, uint16_t
int sendSubFrame(UDPsock_t *sock, void *bufferZone, ssize_t secondHeaderSize, uint16_t contentType) {
commonUDP_t *UDPheader=(commonUDP_t *)bufferZone ;
UDPheader->contentType=contentType;
- UDPheader->senderClock=rdtsc();
+ UDPheader->senderClock=rdtsc_oai();
int nbBlocks=UDPheader->nbBlocks;
int blockId=0;
diff --git a/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_types.h b/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_types.h
index 99b6f75f93..b7b15b5d33 100644
--- a/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_types.h
+++ b/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_types.h
@@ -31,7 +31,7 @@
#ifndef __NR_LDPC_TYPES__H__
#define __NR_LDPC_TYPES__H__
-#include "PHY/TOOLS/time_meas.h"
+#include "time_meas.h"
#include "nrLDPCdecoder_defs.h"
// ==============================================================================
// TYPES
diff --git a/openair1/PHY/CODING/nrLDPC_encoder/ldpc_encode_parity_check.c b/openair1/PHY/CODING/nrLDPC_encoder/ldpc_encode_parity_check.c
index 69d2ac4972..d36398a13a 100644
--- a/openair1/PHY/CODING/nrLDPC_encoder/ldpc_encode_parity_check.c
+++ b/openair1/PHY/CODING/nrLDPC_encoder/ldpc_encode_parity_check.c
@@ -33,7 +33,6 @@
#include
#include
#include
-#include
#include "assertions.h"
#include "common/utils/LOG/log.h"
diff --git a/openair1/PHY/CODING/nrLDPC_encoder/ldpc_encoder.c b/openair1/PHY/CODING/nrLDPC_encoder/ldpc_encoder.c
index 76f92574ba..d5669fbbab 100644
--- a/openair1/PHY/CODING/nrLDPC_encoder/ldpc_encoder.c
+++ b/openair1/PHY/CODING/nrLDPC_encoder/ldpc_encoder.c
@@ -35,7 +35,6 @@
#include
#include
#include
-#include
#include "defs.h"
#include "assertions.h"
#include "openair1/PHY/CODING/nrLDPC_defs.h"
@@ -280,4 +279,4 @@ int ldpc_encoder_orig(unsigned char *test_input,unsigned char *channel_input,int
int nrLDPC_encod(unsigned char **test_input,unsigned char **channel_input,int Zc,int Kb,short block_length, short BG, encoder_implemparams_t *impp) {
return ldpc_encoder_orig(test_input[0],channel_input[0],Zc,Kb,block_length,BG,impp->gen_code);
-}
\ No newline at end of file
+}
diff --git a/openair1/PHY/CODING/nrLDPC_encoder/ldpc_encoder2.c b/openair1/PHY/CODING/nrLDPC_encoder/ldpc_encoder2.c
index bef5b291dc..73c165a2c8 100644
--- a/openair1/PHY/CODING/nrLDPC_encoder/ldpc_encoder2.c
+++ b/openair1/PHY/CODING/nrLDPC_encoder/ldpc_encoder2.c
@@ -36,7 +36,7 @@
#include
#include "assertions.h"
#include "common/utils/LOG/log.h"
-#include "PHY/TOOLS/time_meas.h"
+#include "time_meas.h"
#include "defs.h"
#include "ldpc384_byte.c"
diff --git a/openair1/PHY/CODING/nrLDPC_encoder/ldpc_encoder_optim.c b/openair1/PHY/CODING/nrLDPC_encoder/ldpc_encoder_optim.c
index 07062f6123..d05ced18c6 100644
--- a/openair1/PHY/CODING/nrLDPC_encoder/ldpc_encoder_optim.c
+++ b/openair1/PHY/CODING/nrLDPC_encoder/ldpc_encoder_optim.c
@@ -33,10 +33,9 @@
#include
#include
#include
-#include
#include "assertions.h"
#include "common/utils/LOG/log.h"
-#include "PHY/TOOLS/time_meas.h"
+#include "time_meas.h"
#include "openair1/PHY/CODING/nrLDPC_defs.h"
#include "ldpc_encode_parity_check.c"
#include "ldpc_generate_coefficient.c"
diff --git a/openair1/PHY/CODING/nrLDPC_encoder/ldpc_encoder_optim8seg.c b/openair1/PHY/CODING/nrLDPC_encoder/ldpc_encoder_optim8seg.c
index 6fa9c5ff53..958ef5aca7 100644
--- a/openair1/PHY/CODING/nrLDPC_encoder/ldpc_encoder_optim8seg.c
+++ b/openair1/PHY/CODING/nrLDPC_encoder/ldpc_encoder_optim8seg.c
@@ -33,10 +33,9 @@
#include
#include
#include
-#include
#include "assertions.h"
#include "common/utils/LOG/log.h"
-#include "PHY/TOOLS/time_meas.h"
+#include "time_meas.h"
#include "openair1/PHY/CODING/nrLDPC_defs.h"
#include "ldpc_encode_parity_check.c"
#include "ldpc_generate_coefficient.c"
diff --git a/openair1/PHY/CODING/nrLDPC_encoder/ldpc_encoder_optim8segmulti.c b/openair1/PHY/CODING/nrLDPC_encoder/ldpc_encoder_optim8segmulti.c
index 15d4481eb6..9ef8cbfe65 100644
--- a/openair1/PHY/CODING/nrLDPC_encoder/ldpc_encoder_optim8segmulti.c
+++ b/openair1/PHY/CODING/nrLDPC_encoder/ldpc_encoder_optim8segmulti.c
@@ -33,10 +33,9 @@
#include
#include
#include
-#include
#include "assertions.h"
#include "common/utils/LOG/log.h"
-#include "PHY/TOOLS/time_meas.h"
+#include "time_meas.h"
#include "openair1/PHY/CODING/nrLDPC_defs.h"
#include "ldpc_encode_parity_check.c"
diff --git a/openair1/PHY/TOOLS/lte_ue_scope.c b/openair1/PHY/TOOLS/lte_ue_scope.c
index 00560f2d74..9b3f65d7d1 100644
--- a/openair1/PHY/TOOLS/lte_ue_scope.c
+++ b/openair1/PHY/TOOLS/lte_ue_scope.c
@@ -51,7 +51,7 @@ void reset_stats(FL_OBJECT *button, long arg) {
int i,j,k;
PHY_VARS_eNB *phy_vars_eNB = RC.eNB[0][0];
- for (i=0; idlsch[i][0]->Mlimit; j++) {
phy_vars_eNB->UE_stats[i].dlsch_NAK[k][j]=0;
diff --git a/openair1/PHY/defs_L1_NB_IoT.h b/openair1/PHY/defs_L1_NB_IoT.h
index a4552c8c27..b4aee78310 100644
--- a/openair1/PHY/defs_L1_NB_IoT.h
+++ b/openair1/PHY/defs_L1_NB_IoT.h
@@ -122,7 +122,7 @@ static inline void* malloc16_clear( size_t size )
#include "PHY/impl_defs_top_NB_IoT.h"
#include "PHY/impl_defs_lte_NB_IoT.h"
-#include "PHY/TOOLS/time_meas.h"
+#include "time_meas.h"
//#include "PHY/CODING/defs.h"
#include "PHY/CODING/defs_NB_IoT.h"
#include "openair2/PHY_INTERFACE/IF_Module_NB_IoT.h"
@@ -452,9 +452,6 @@ typedef struct {
int sub_frame_start;
///
int sub_frame_step;
- ///
- unsigned long long gotIQs;
-
} UE_rxtx_proc_NB_IoT_t;
/// Context data structure for eNB subframe processing
diff --git a/openair1/PHY/defs_RU.h b/openair1/PHY/defs_RU.h
index 76dd92ef5d..6b18e55c4b 100644
--- a/openair1/PHY/defs_RU.h
+++ b/openair1/PHY/defs_RU.h
@@ -36,7 +36,7 @@
#include "common_lib.h"
#include "openairinterface5g_limits.h"
-#include "PHY/TOOLS/time_meas.h"
+#include "time_meas.h"
#include "defs_common.h"
#include "nfapi_nr_interface_scf.h"
diff --git a/openair1/PHY/defs_UE.h b/openair1/PHY/defs_UE.h
index fc3d939f65..fa55384093 100644
--- a/openair1/PHY/defs_UE.h
+++ b/openair1/PHY/defs_UE.h
@@ -59,7 +59,7 @@
#include "defs_common.h"
#include "impl_defs_top.h"
-#include "PHY/TOOLS/time_meas.h"
+#include "time_meas.h"
#include "PHY/CODING/coding_defs.h"
#include "PHY/TOOLS/tools_defs.h"
#include "platform_types.h"
@@ -154,7 +154,6 @@ typedef struct {
int sub_frame_start;
int sub_frame_step;
- unsigned long long gotIQs;
} UE_rxtx_proc_t;
/// Context data structure for eNB subframe processing
diff --git a/openair1/PHY/defs_common.h b/openair1/PHY/defs_common.h
index c79530434a..86df85db5c 100644
--- a/openair1/PHY/defs_common.h
+++ b/openair1/PHY/defs_common.h
@@ -58,7 +58,7 @@
#include "assertions.h"
//#include
-#include "PHY/TOOLS/time_meas.h"
+#include "time_meas.h"
#include "platform_types.h"
#define MAX_NUM_RU_PER_eNB 64
diff --git a/openair1/PHY/defs_eNB.h b/openair1/PHY/defs_eNB.h
index 995a4a934e..3a48dc51d6 100644
--- a/openair1/PHY/defs_eNB.h
+++ b/openair1/PHY/defs_eNB.h
@@ -58,7 +58,7 @@
#include "defs_common.h"
#include "defs_RU.h"
#include "impl_defs_top.h"
-#include "PHY/TOOLS/time_meas.h"
+#include "time_meas.h"
//#include "PHY/CODING/coding_defs.h"
#include "PHY/TOOLS/tools_defs.h"
#include "platform_types.h"
@@ -202,7 +202,7 @@ typedef struct {
int repetition_number[4];
} LTE_eNB_PRACH;
-#include "PHY/TOOLS/time_meas.h"
+#include "time_meas.h"
#include "PHY/CODING/coding_defs.h"
#include "PHY/TOOLS/tools_defs.h"
#include "PHY/LTE_TRANSPORT/transport_eNB.h"
diff --git a/openair1/PHY/defs_gNB.h b/openair1/PHY/defs_gNB.h
index 34dadf5bfd..c24bd81549 100644
--- a/openair1/PHY/defs_gNB.h
+++ b/openair1/PHY/defs_gNB.h
@@ -856,7 +856,7 @@ typedef struct PHY_VARS_gNB_s {
/*
time_stats_t phy_proc;
*/
- time_stats_t *phy_proc_tx[2];
+ time_stats_t phy_proc_tx;
time_stats_t phy_proc_rx;
time_stats_t rx_prach;
/*
@@ -973,7 +973,6 @@ typedef struct processingData_L1tx {
uint16_t num_pdsch_slot;
int num_dl_pdcch;
int num_ul_pdcch;
- time_stats_t phy_proc_tx;
} processingData_L1tx_t;
#endif
diff --git a/openair1/PHY/defs_nr_UE.h b/openair1/PHY/defs_nr_UE.h
index 653b435e12..f4b49ececa 100644
--- a/openair1/PHY/defs_nr_UE.h
+++ b/openair1/PHY/defs_nr_UE.h
@@ -96,7 +96,7 @@
#include "impl_defs_top.h"
#include "impl_defs_nr.h"
-#include "PHY/TOOLS/time_meas.h"
+#include "time_meas.h"
#include "PHY/CODING/coding_defs.h"
#include "PHY/TOOLS/tools_defs.h"
#include "platform_types.h"
diff --git a/openair1/PHY/thread_NR_UE.h b/openair1/PHY/thread_NR_UE.h
index 901d8faec9..a3cc2d9782 100644
--- a/openair1/PHY/thread_NR_UE.h
+++ b/openair1/PHY/thread_NR_UE.h
@@ -62,7 +62,6 @@ typedef struct {
int sub_frame_start;
int sub_frame_step;
- unsigned long long gotIQs;
uint8_t decoder_thread_available1;
int dci_err_cnt;
} UE_nr_rxtx_proc_t;
diff --git a/openair1/SCHED_NR/fapi_nr_l1.c b/openair1/SCHED_NR/fapi_nr_l1.c
index 2dbaa738dc..4b9f9534f0 100644
--- a/openair1/SCHED_NR/fapi_nr_l1.c
+++ b/openair1/SCHED_NR/fapi_nr_l1.c
@@ -165,6 +165,8 @@ void nr_schedule_response(NR_Sched_Rsp_t *Sched_INFO){
notifiedFIFO_elt_t *res;
res = pullTpool(gNB->L1_tx_free, gNB->threadPool);
processingData_L1tx_t *msgTx = (processingData_L1tx_t *)NotifiedFifoData(res);
+ const time_stats_t ts = exec_time_stats_NotifiedFIFO(res);
+ merge_meas(&gNB->phy_proc_tx, &ts);
msgTx->num_pdsch_slot=0;
msgTx->num_dl_pdcch=0;
diff --git a/openair1/SCHED_NR/phy_procedures_nr_gNB.c b/openair1/SCHED_NR/phy_procedures_nr_gNB.c
index 41f395c090..1ddf4b0d07 100644
--- a/openair1/SCHED_NR/phy_procedures_nr_gNB.c
+++ b/openair1/SCHED_NR/phy_procedures_nr_gNB.c
@@ -134,8 +134,6 @@ void phy_procedures_gNB_TX(processingData_L1tx_t *msgTx,
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_gNB_TX+offset,1);
- if (do_meas==1) start_meas(&msgTx->phy_proc_tx);
-
// clear the transmit data array and beam index for the current slot
for (aa=0; aacarrier_config.num_tx_ant.value; aa++) {
memset(&gNB->common_vars.txdataF[aa][txdataF_offset],0,fp->samples_per_slot_wCP*sizeof(int32_t));
@@ -193,8 +191,6 @@ void phy_procedures_gNB_TX(processingData_L1tx_t *msgTx,
}
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_gNB_TX+offset,0);
-
- if (do_meas==1) stop_meas(&msgTx->phy_proc_tx);
}
void nr_postDecode(PHY_VARS_gNB *gNB, notifiedFIFO_elt_t *req) {
diff --git a/openair1/SIMULATION/LTE_PHY/dlsim.c b/openair1/SIMULATION/LTE_PHY/dlsim.c
index 495b6803a6..231d63cf04 100644
--- a/openair1/SIMULATION/LTE_PHY/dlsim.c
+++ b/openair1/SIMULATION/LTE_PHY/dlsim.c
@@ -129,7 +129,6 @@ void do_OFDM_mod_l(int32_t **txdataF, int32_t **txdata, uint16_t next_slot, LTE_
slot_offset = (next_slot)*(frame_parms->samples_per_tti>>1);
for (aa=0; aanb_antennas_tx; aa++) {
- // printf("Thread %d starting ... aa %d (%llu)\n",omp_get_thread_num(),aa,rdtsc());
if (frame_parms->Ncp == 1)
PHY_ofdm_mod(&txdataF[aa][slot_offset_F], // input
&txdata[aa][slot_offset], // output
diff --git a/openair1/SIMULATION/LTE_PHY/dlsim_tm4.c b/openair1/SIMULATION/LTE_PHY/dlsim_tm4.c
index 3b4e6782da..57c06e3b13 100644
--- a/openair1/SIMULATION/LTE_PHY/dlsim_tm4.c
+++ b/openair1/SIMULATION/LTE_PHY/dlsim_tm4.c
@@ -112,7 +112,6 @@ void do_OFDM_mod_l(int32_t **txdataF, int32_t **txdata, uint16_t next_slot, LTE_
slot_offset = (next_slot)*(frame_parms->samples_per_tti>>1);
for (aa=0; aanb_antennas_tx; aa++) {
- // printf("Thread %d starting ... aa %d (%llu)\n",omp_get_thread_num(),aa,rdtsc());
if (frame_parms->Ncp == 1)
PHY_ofdm_mod(&txdataF[aa][slot_offset_F], // input
diff --git a/openair1/SIMULATION/LTE_PHY/framegen.c b/openair1/SIMULATION/LTE_PHY/framegen.c
index f5b1e6d45e..b9f0221b2d 100644
--- a/openair1/SIMULATION/LTE_PHY/framegen.c
+++ b/openair1/SIMULATION/LTE_PHY/framegen.c
@@ -333,7 +333,6 @@ void do_OFDM_mod(mod_sym_t **txdataF, int32_t **txdata, uint16_t next_slot, LTE_
slot_offset = (next_slot)*(frame_parms->samples_per_tti>>1);
for (aa=0; aanb_antennas_tx; aa++) {
- // printf("Thread %d starting ... aa %d (%llu)\n",omp_get_thread_num(),aa,rdtsc());
if (frame_parms->Ncp == 1)
PHY_ofdm_mod(&txdataF[aa][slot_offset_F], // input
diff --git a/openair1/SIMULATION/LTE_PHY/mbmssim.c b/openair1/SIMULATION/LTE_PHY/mbmssim.c
index 31c3b47227..7efe9f4530 100644
--- a/openair1/SIMULATION/LTE_PHY/mbmssim.c
+++ b/openair1/SIMULATION/LTE_PHY/mbmssim.c
@@ -121,7 +121,6 @@ void do_OFDM_mod_l(int32_t **txdataF, int32_t **txdata, uint16_t next_slot, LTE_
slot_offset = (next_slot)*(frame_parms->samples_per_tti>>1);
for (aa=0; aanb_antennas_tx; aa++) {
- // printf("Thread %d starting ... aa %d (%llu)\n",omp_get_thread_num(),aa,rdtsc());
if (frame_parms->Ncp == 1)
PHY_ofdm_mod(&txdataF[aa][slot_offset_F], // input
&txdata[aa][slot_offset], // output
diff --git a/openair1/SIMULATION/NR_PHY/dlsim.c b/openair1/SIMULATION/NR_PHY/dlsim.c
index cfc7cb00b0..e797c01096 100644
--- a/openair1/SIMULATION/NR_PHY/dlsim.c
+++ b/openair1/SIMULATION/NR_PHY/dlsim.c
@@ -441,7 +441,7 @@ int main(int argc, char **argv)
FILE *scg_fd=NULL;
- while ((c = getopt (argc, argv, "f:hA:pf:g:in:s:S:t:x:y:z:M:N:F:GR:dPIL:Ea:b:d:e:m:w:T:U:qX:")) != -1) {
+ while ((c = getopt (argc, argv, "f:hA:pf:g:in:s:S:t:x:y:z:M:N:F:GR:dPIL:Ea:b:d:e:q:m:w:T:U:X:")) != -1) {
switch (c) {
case 'f':
scg_fd = fopen(optarg,"r");
@@ -607,16 +607,17 @@ int main(int argc, char **argv)
case 'b':
g_rbSize = atoi(optarg);
break;
+
case 'D':
dlsch_threads = atoi(optarg);
- break;
+ break;
+
case 'e':
g_mcsIndex = atoi(optarg);
break;
case 'q':
- g_mcsTableIdx = 1;
- get_softmodem_params()->use_256qam_table = 1;
+ g_mcsTableIdx = atoi(optarg);
break;
case 'm':
@@ -680,7 +681,7 @@ int main(int argc, char **argv)
printf("-c Start symbol for PDSCH (fixed for now)\n");
printf("-j Number of symbols for PDSCH (fixed for now)\n");
printf("-e MSC index\n");
- printf("-q Use 2nd MCS table (256 QAM table) for PDSCH\n");
+ printf("-q MCS Table index\n");
printf("-t Acceptable effective throughput (in percentage)\n");
printf("-T Enable PTRS, arguments list L_PTRS{0,1,2} K_PTRS{2,4}, e.g. -T 2 0 2 \n");
printf("-U Change DMRS Config, arguments list DMRS TYPE{0=A,1=B} DMRS AddPos{0:2} DMRS ConfType{1:2}, e.g. -U 3 0 2 1 \n");
@@ -781,11 +782,14 @@ int main(int argc, char **argv)
fill_scc_sim(rrc.carrier.servingcellconfigcommon,&ssb_bitmap,N_RB_DL,N_RB_DL,mu,mu);
ssb_bitmap = 1;// Enable only first SSB with index ssb_indx=0
fix_scc(scc,ssb_bitmap);
-
prepare_scd(scd);
- fill_default_secondaryCellGroup(scc, scd, secondaryCellGroup, 0, 1, n_tx, 6, 0, 0, 0);
+ NR_UE_NR_Capability_t* UE_Capability_nr = CALLOC(1,sizeof(NR_UE_NR_Capability_t));
+ prepare_sim_uecap(UE_Capability_nr,scc,mu,
+ N_RB_DL,g_mcsTableIdx);
+ // TODO do a UECAP for phy-sim
+ fill_default_secondaryCellGroup(scc, scd, secondaryCellGroup, UE_Capability_nr, 0, 1, n_tx, 6, 0, 0, 0);
/* RRC parameter validation for secondaryCellGroup */
fix_scd(scd);
@@ -1014,8 +1018,6 @@ int main(int argc, char **argv)
msgDataTx->slot = slot;
msgDataTx->frame = frame;
memset(msgDataTx->ssb, 0, 64*sizeof(NR_gNB_SSB_t));
- reset_meas(&msgDataTx->phy_proc_tx);
- gNB->phy_proc_tx[0] = &msgDataTx->phy_proc_tx;
for (SNR = snr0; SNR < snr1; SNR += .2) {
@@ -1329,7 +1331,7 @@ int main(int argc, char **argv)
printf("\ngNB TX function statistics (per %d us slot, NPRB %d, mcs %d, block %d)\n",
1000>>*scc->ssbSubcarrierSpacing, g_rbSize, g_mcsIndex,
msgDataTx->dlsch[0][0]->harq_process.pdsch_pdu.pdsch_pdu_rel15.TBSize[0]<<3);
- printDistribution(gNB->phy_proc_tx[0],table_tx,"PHY proc tx");
+ printDistribution(&gNB->phy_proc_tx,table_tx,"PHY proc tx");
printStatIndent2(&gNB->dlsch_encoding_stats,"DLSCH encoding time");
printStatIndent3(&gNB->dlsch_segmentation_stats,"DLSCH segmentation time");
printStatIndent3(&gNB->tinput,"DLSCH LDPC input processing time");
diff --git a/openair1/SIMULATION/NR_PHY/ulsim.c b/openair1/SIMULATION/NR_PHY/ulsim.c
index aebaf42483..76d896a047 100644
--- a/openair1/SIMULATION/NR_PHY/ulsim.c
+++ b/openair1/SIMULATION/NR_PHY/ulsim.c
@@ -689,7 +689,6 @@ int main(int argc, char **argv)
notifiedFIFO_elt_t *msgL1Tx = newNotifiedFIFO_elt(sizeof(processingData_L1tx_t),0,gNB->L1_tx_free,NULL);
processingData_L1tx_t *msgDataTx = (processingData_L1tx_t *)NotifiedFifoData(msgL1Tx);
msgDataTx->slot = -1;
- gNB->phy_proc_tx[0] = &msgDataTx->phy_proc_tx;
//gNB_config = &gNB->gNB_config;
//memset((void *)&gNB->UL_INFO,0,sizeof(gNB->UL_INFO));
@@ -731,7 +730,8 @@ int main(int argc, char **argv)
prepare_scd(scd);
- fill_default_secondaryCellGroup(scc, scd, secondaryCellGroup, 0, 1, n_tx, 0, 0, 0, 0);
+ // TODO do a UECAP for phy-sim
+ fill_default_secondaryCellGroup(scc, scd, secondaryCellGroup, NULL, 0, 1, n_tx, 0, 0, 0, 0);
// xer_fprint(stdout, &asn_DEF_NR_CellGroupConfig, (const void*)secondaryCellGroup);
diff --git a/openair1/SIMULATION/TOOLS/channel_sim.c b/openair1/SIMULATION/TOOLS/channel_sim.c
index 197a296a51..de8db5d7cb 100644
--- a/openair1/SIMULATION/TOOLS/channel_sim.c
+++ b/openair1/SIMULATION/TOOLS/channel_sim.c
@@ -40,7 +40,6 @@
#include "PHY_INTERFACE/phy_interface_extern.h"
#include "UTIL/OCG/OCG.h"
#include "UTIL/OPT/opt.h" // to test OPT
-#include "UTIL/FIFO/types.h"
#define RF
diff --git a/openair2/LAYER2/MAC/mac.h b/openair2/LAYER2/MAC/mac.h
index cb93c2feb8..6637d05a8a 100644
--- a/openair2/LAYER2/MAC/mac.h
+++ b/openair2/LAYER2/MAC/mac.h
@@ -69,7 +69,7 @@
#include "nfapi_interface.h"
#include "PHY_INTERFACE/IF_Module.h"
-#include "PHY/TOOLS/time_meas.h"
+#include "time_meas.h"
#include "PHY/defs_common.h" // for PRACH_RESOURCES_t
#include "PHY/LTE_TRANSPORT/transport_common.h"
diff --git a/openair2/LAYER2/NR_MAC_gNB/config.c b/openair2/LAYER2/NR_MAC_gNB/config.c
index e703d5aa65..7833b41f0b 100644
--- a/openair2/LAYER2/NR_MAC_gNB/config.c
+++ b/openair2/LAYER2/NR_MAC_gNB/config.c
@@ -627,6 +627,8 @@ int rrc_mac_config_req_gNB(module_id_t Mod_idP,
process_CellGroup(CellGroup,&UE_info->UE_sched_ctrl[UE_id]);
const NR_ServingCellConfig_t *servingCellConfig = CellGroup ? CellGroup->spCellConfig->spCellConfigDedicated : NULL;
NR_UE_sched_ctrl_t *sched_ctrl = &UE_info->UE_sched_ctrl[UE_id];
+ sched_ctrl->update_pdsch_ps = true;
+ sched_ctrl->update_pusch_ps = true;
const NR_PDSCH_ServingCellConfig_t *pdsch = servingCellConfig ? servingCellConfig->pdsch_ServingCellConfig->choice.setup : NULL;
if (get_softmodem_params()->sa) {
// add all available DL HARQ processes for this UE in SA
diff --git a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_dlsch.c b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_dlsch.c
index 92391ed1d5..f366b2c4f9 100644
--- a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_dlsch.c
+++ b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_dlsch.c
@@ -393,12 +393,17 @@ int nr_write_ce_dlsch_pdu(module_id_t module_idP,
#define BLER_UPDATE_FRAME 10
#define BLER_FILTER 0.9f
-int get_mcs_from_bler(module_id_t mod_id, int CC_id, frame_t frame, sub_frame_t slot, int UE_id)
+int get_mcs_from_bler(module_id_t mod_id, int CC_id, frame_t frame, sub_frame_t slot, int UE_id, int mcs_table)
{
gNB_MAC_INST *nrmac = RC.nrmac[mod_id];
const NR_ServingCellConfigCommon_t *scc = nrmac->common_channels[CC_id].ServingCellConfigCommon;
const int n = nr_slots_per_frame[*scc->ssbSubcarrierSpacing];
+ int max_allowed_mcs = (mcs_table == 1) ? 27 : 28;
+ int max_mcs = nrmac->dl_max_mcs;
+ if (nrmac->dl_max_mcs>max_allowed_mcs)
+ max_mcs = max_allowed_mcs;
+
NR_DL_bler_stats_t *bler_stats = &nrmac->UE_info.UE_sched_ctrl[UE_id].dl_bler_stats;
/* first call: everything is zero. Initialize to sensible default */
if (bler_stats->last_frame_slot == 0 && bler_stats->mcs == 0) {
@@ -444,7 +449,7 @@ int get_mcs_from_bler(module_id_t mod_id, int CC_id, frame_t frame, sub_frame_t
if (bler_stats->rd2_bler > nrmac->dl_rd2_bler_threshold && old_mcs > 6) {
new_mcs -= 2;
} else if (bler_stats->rd2_bler < nrmac->dl_rd2_bler_threshold) {*/
- if (bler_stats->bler < nrmac->dl_bler_target_lower && old_mcs < nrmac->dl_max_mcs && dtx > 9)
+ if (bler_stats->bler < nrmac->dl_bler_target_lower && old_mcs < max_mcs && dtx > 9)
new_mcs += 1;
else if (bler_stats->bler > nrmac->dl_bler_target_upper && old_mcs > 6)
new_mcs -= 1;
@@ -586,8 +591,10 @@ bool allocate_dl_retransmission(module_id_t module_id,
}
/* check whether we need to switch the TDA allocation since the last
* (re-)transmission */
- if (ps->time_domain_allocation != tda)
- nr_set_pdsch_semi_static(scc, UE_info->CellGroup[UE_id], sched_ctrl->active_bwp, bwpd, tda, ps->nrOfLayers, sched_ctrl, ps);
+ if (ps->time_domain_allocation != tda || sched_ctrl->update_pdsch_ps) {
+ nr_set_pdsch_semi_static(scc, cg, sched_ctrl->active_bwp, bwpd, tda, ps->nrOfLayers, sched_ctrl, ps);
+ sched_ctrl->update_pdsch_ps = false;
+ }
} else {
/* the retransmission will use a different time domain allocation, check
* that we have enough resources */
@@ -744,7 +751,7 @@ void pf_dl(module_id_t module_id,
/* Calculate coeff */
set_dl_mcs(sched_pdsch,sched_ctrl,&mac->dl_max_mcs,ps->mcsTableIdx);
- sched_pdsch->mcs = get_mcs_from_bler(module_id, /* CC_id = */ 0, frame, slot, UE_id);
+ sched_pdsch->mcs = get_mcs_from_bler(module_id, /* CC_id = */ 0, frame, slot, UE_id, ps->mcsTableIdx);
layers[UE_id] = set_dl_nrOfLayers(sched_ctrl);
const uint8_t Qm = nr_get_Qm_dl(sched_pdsch->mcs, ps->mcsTableIdx);
const uint16_t R = nr_get_code_rate_dl(sched_pdsch->mcs, ps->mcsTableIdx);
@@ -863,8 +870,11 @@ void pf_dl(module_id_t module_id,
NR_pdsch_semi_static_t *ps = &sched_ctrl->pdsch_semi_static;
if (ps->nrOfLayers != layers[UE_id] ||
- ps->time_domain_allocation != tda)
+ ps->time_domain_allocation != tda ||
+ sched_ctrl->update_pdsch_ps) {
nr_set_pdsch_semi_static(scc, UE_info->CellGroup[UE_id], sched_ctrl->active_bwp, bwpd, tda, layers[UE_id], sched_ctrl, ps);
+ sched_ctrl->update_pdsch_ps = false;
+ }
const uint16_t slbitmap = SL_to_bitmap(ps->startSymbolIndex, ps->nrOfSymbols);
// Freq-demain allocation
diff --git a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_primitives.c b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_primitives.c
index dbfaf7ac76..4d05320e64 100644
--- a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_primitives.c
+++ b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_primitives.c
@@ -532,6 +532,7 @@ void nr_set_pdsch_semi_static(const NR_ServingCellConfigCommon_t *scc,
ps->mcsTableIdx = 2;
}
else ps->mcsTableIdx = 0;
+ LOG_D(NR_MAC,"MCS Table Index: %d\n",ps->mcsTableIdx);
NR_PDSCH_Config_t *pdsch_Config;
if (bwp &&
@@ -1943,7 +1944,6 @@ void create_nr_list(NR_list_t *list, int len)
{
list->head = -1;
list->next = malloc(len * sizeof(*list->next));
- LOG_W(NR_MAC, "NR list->next %p\n", list->next);
AssertFatal(list->next, "cannot malloc() memory for NR_list_t->next\n");
for (int i = 0; i < len; ++i)
list->next[i] = -1;
@@ -2278,8 +2278,16 @@ void create_dl_harq_list(NR_UE_sched_ctrl_t *sched_ctrl,
add_tail_nr_list(&sched_ctrl->available_dl_harq, harq);
create_nr_list(&sched_ctrl->feedback_dl_harq, nrofHARQ);
create_nr_list(&sched_ctrl->retrans_dl_harq, nrofHARQ);
+ } else if (sched_ctrl->available_dl_harq.len == nrofHARQ) {
+ LOG_D(NR_MAC, "nrofHARQ %d already configured\n", nrofHARQ);
} else {
+ const int old_nrofHARQ = sched_ctrl->available_dl_harq.len;
+ AssertFatal(nrofHARQ > old_nrofHARQ,
+ "cannot resize HARQ list to be smaller (nrofHARQ %d, old_nrofHARQ %d)\n",
+ nrofHARQ, old_nrofHARQ);
resize_nr_list(&sched_ctrl->available_dl_harq, nrofHARQ);
+ for (int harq = old_nrofHARQ; harq < nrofHARQ; harq++)
+ add_tail_nr_list(&sched_ctrl->available_dl_harq, harq);
resize_nr_list(&sched_ctrl->feedback_dl_harq, nrofHARQ);
resize_nr_list(&sched_ctrl->retrans_dl_harq, nrofHARQ);
}
diff --git a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_ulsch.c b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_ulsch.c
index 34d4496eee..bd2836c3e7 100644
--- a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_ulsch.c
+++ b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_ulsch.c
@@ -992,8 +992,11 @@ bool allocate_ul_retransmission(module_id_t module_id,
if (ps->time_domain_allocation != tda
|| ps->dci_format != dci_format
- || ps->num_dmrs_cdm_grps_no_data != num_dmrs_cdm_grps_no_data)
+ || ps->num_dmrs_cdm_grps_no_data != num_dmrs_cdm_grps_no_data
+ || sched_ctrl->update_pusch_ps) {
nr_set_pusch_semi_static(scc, sched_ctrl->active_ubwp, ubwpd, dci_format, tda, num_dmrs_cdm_grps_no_data, ps);
+ sched_ctrl->update_pusch_ps = false;
+ }
LOG_D(NR_MAC, "%s(): retransmission keeping TDA %d and TBS %d\n", __func__, tda, retInfo->tb_size);
} else {
/* the retransmission will use a different time domain allocation, check
@@ -1230,8 +1233,11 @@ void pf_ul(module_id_t module_id,
const int tda = sched_ctrl->active_ubwp ? nrmac->preferred_ul_tda[sched_ctrl->active_ubwp->bwp_Id][slot] : 0;
if (ps->time_domain_allocation != tda
|| ps->dci_format != dci_format
- || ps->num_dmrs_cdm_grps_no_data != num_dmrs_cdm_grps_no_data)
+ || ps->num_dmrs_cdm_grps_no_data != num_dmrs_cdm_grps_no_data
+ || sched_ctrl->update_pusch_ps) {
nr_set_pusch_semi_static(scc, sched_ctrl->active_ubwp, ubwpd, dci_format, tda, num_dmrs_cdm_grps_no_data, ps);
+ sched_ctrl->update_pusch_ps = false;
+ }
NR_sched_pusch_t *sched_pusch = &sched_ctrl->sched_pusch;
sched_pusch->mcs = 9;
update_ul_ue_R_Qm(sched_pusch, ps);
@@ -1347,8 +1353,11 @@ void pf_ul(module_id_t module_id,
const int tda = sched_ctrl->active_ubwp ? nrmac->preferred_ul_tda[sched_ctrl->active_ubwp->bwp_Id][slot] : 0;
if (ps->time_domain_allocation != tda
|| ps->dci_format != dci_format
- || ps->num_dmrs_cdm_grps_no_data != num_dmrs_cdm_grps_no_data)
+ || ps->num_dmrs_cdm_grps_no_data != num_dmrs_cdm_grps_no_data
+ || sched_ctrl->update_pusch_ps) {
nr_set_pusch_semi_static(scc, sched_ctrl->active_ubwp, ubwpd, dci_format, tda, num_dmrs_cdm_grps_no_data, ps);
+ sched_ctrl->update_pusch_ps = false;
+ }
update_ul_ue_R_Qm(sched_pusch, ps);
/* Calculate the current scheduling bytes and the necessary RBs */
diff --git a/openair2/LAYER2/NR_MAC_gNB/nr_mac_gNB.h b/openair2/LAYER2/NR_MAC_gNB/nr_mac_gNB.h
index 22a0932c3f..b1e1241487 100644
--- a/openair2/LAYER2/NR_MAC_gNB/nr_mac_gNB.h
+++ b/openair2/LAYER2/NR_MAC_gNB/nr_mac_gNB.h
@@ -55,7 +55,7 @@
/* PHY */
#include "PHY/defs_gNB.h"
-#include "PHY/TOOLS/time_meas.h"
+#include "time_meas.h"
/* Interface */
#include "nfapi_nr_interface_scf.h"
@@ -620,6 +620,8 @@ typedef struct {
int ul_failure;
struct CSI_Report CSI_report;
bool SR;
+ bool update_pdsch_ps;
+ bool update_pusch_ps;
bool set_mcs;
/// information about every HARQ process
NR_UE_harq_t harq_processes[NR_MAX_NB_HARQ_PROCESSES];
diff --git a/openair2/RRC/NR/MESSAGES/asn1_msg.c b/openair2/RRC/NR/MESSAGES/asn1_msg.c
index 7c8ecad91f..d04ed78270 100755
--- a/openair2/RRC/NR/MESSAGES/asn1_msg.c
+++ b/openair2/RRC/NR/MESSAGES/asn1_msg.c
@@ -1451,6 +1451,30 @@ void fill_mastercellGroupConfig(NR_CellGroupConfig_t *cellGroupConfig, NR_CellGr
ASN_SEQUENCE_ADD(&ue_context_mastercellGroup->rlc_BearerToAddModList->list, rlc_BearerConfig_drb);
}
+void update_cellGroupConfig(NR_CellGroupConfig_t *cellGroupConfig,
+ rrc_gNB_carrier_data_t *carrier,
+ NR_UE_NR_Capability_t *uecap) {
+
+ NR_SpCellConfig_t *SpCellConfig = cellGroupConfig->spCellConfig;
+ if (SpCellConfig == NULL) return;
+
+ NR_ServingCellConfigCommon_t *scc = carrier->servingcellconfigcommon;
+
+ NR_BWP_DownlinkDedicated_t *bwp_Dedicated = SpCellConfig->spCellConfigDedicated->initialDownlinkBWP;
+ set_dl_mcs_table(scc->downlinkConfigCommon->initialDownlinkBWP->genericParameters.subcarrierSpacing,
+ uecap, bwp_Dedicated, scc);
+
+ struct NR_ServingCellConfig__downlinkBWP_ToAddModList *DL_BWP_list = SpCellConfig->spCellConfigDedicated->downlinkBWP_ToAddModList;
+ if (DL_BWP_list) {
+ for (int i=0; ilist.count; i++){
+ NR_BWP_Downlink_t *bwp = DL_BWP_list->list.array[i];
+ int scs = bwp->bwp_Common->genericParameters.subcarrierSpacing;
+ set_dl_mcs_table(scs, uecap, bwp->bwp_Dedicated, carrier->servingcellconfigcommon);
+ }
+ }
+}
+
+
void fill_initial_cellGroupConfig(int uid,
NR_CellGroupConfig_t *cellGroupConfig,
NR_ServingCellConfigCommon_t *scc,
@@ -1870,6 +1894,8 @@ int16_t do_RRCReconfiguration(
NR_SDAP_Config_t *sdap_config,
NR_MeasConfig_t *meas_config,
struct NR_RRCReconfiguration_v1530_IEs__dedicatedNAS_MessageList *dedicatedNAS_MessageList,
+ rrc_gNB_ue_context_t *const ue_context_pP,
+ rrc_gNB_carrier_data_t *carrier,
NR_MAC_CellGroupConfig_t *mac_CellGroupConfig,
NR_CellGroupConfig_t *cellGroupConfig)
//------------------------------------------------------------------------------
@@ -1906,15 +1932,6 @@ int16_t do_RRCReconfiguration(
ie->radioBearerConfig->srb3_ToRelease = NULL;
ie->radioBearerConfig->drb_ToReleaseList = DRB_releaseList;
}
- /******************** Secondary Cell Group ********************/
- // rrc_gNB_carrier_data_t *carrier = &(gnb_rrc_inst->carrier);
- // fill_default_secondaryCellGroup( carrier->servingcellconfigcommon,
- // ue_context_pP->ue_context.secondaryCellGroup,
- // 1,
- // 1,
- // carrier->pdsch_AntennaPorts,
- // carrier->initial_csi_index[ue_context_p->local_uid + 1],
- // ue_context_pP->local_uid);
/******************** Meas Config ********************/
// measConfig
@@ -1930,6 +1947,9 @@ int16_t do_RRCReconfiguration(
}
if(cellGroupConfig!=NULL){
+ update_cellGroupConfig(cellGroupConfig,
+ carrier,
+ ue_context_pP->ue_context.UE_Capability_nr);
enc_rval = uper_encode_to_buffer(&asn_DEF_NR_CellGroupConfig,
NULL,
(void *)cellGroupConfig,
diff --git a/openair2/RRC/NR/MESSAGES/asn1_msg.h b/openair2/RRC/NR/MESSAGES/asn1_msg.h
index cb971acd60..7fe08704c2 100644
--- a/openair2/RRC/NR/MESSAGES/asn1_msg.h
+++ b/openair2/RRC/NR/MESSAGES/asn1_msg.h
@@ -110,6 +110,10 @@ void fill_initial_cellGroupConfig(int uid,
NR_ServingCellConfigCommon_t *scc,
rrc_gNB_carrier_data_t *carrier);
+void update_cellGroupConfig(NR_CellGroupConfig_t *cellGroupConfig,
+ rrc_gNB_carrier_data_t *carrier,
+ NR_UE_NR_Capability_t *uecap);
+
void fill_mastercellGroupConfig(NR_CellGroupConfig_t *cellGroupConfig, NR_CellGroupConfig_t *ue_context_mastercellGroup);
uint8_t do_RRCSetup(rrc_gNB_ue_context_t *const ue_context_pP,
@@ -145,6 +149,8 @@ int16_t do_RRCReconfiguration(
NR_SDAP_Config_t *sdap_config,
NR_MeasConfig_t *meas_config,
struct NR_RRCReconfiguration_v1530_IEs__dedicatedNAS_MessageList *dedicatedNAS_MessageList,
+ rrc_gNB_ue_context_t *const ue_context_pP,
+ rrc_gNB_carrier_data_t *carrier,
NR_MAC_CellGroupConfig_t *mac_CellGroupConfig,
NR_CellGroupConfig_t *cellGroupConfig);
diff --git a/openair2/RRC/NR/nr_rrc_config.c b/openair2/RRC/NR/nr_rrc_config.c
index ba969ac1be..f8f05f2fe5 100644
--- a/openair2/RRC/NR/nr_rrc_config.c
+++ b/openair2/RRC/NR/nr_rrc_config.c
@@ -31,6 +31,50 @@
#include "nr_rrc_config.h"
#include "common/utils/nr/nr_common.h"
+void prepare_sim_uecap(NR_UE_NR_Capability_t *cap,
+ NR_ServingCellConfigCommon_t *scc,
+ int numerology,
+ int rbsize,
+ int mcs_table) {
+
+ int band = *scc->downlinkConfigCommon->frequencyInfoDL->frequencyBandList.list.array[0];
+ NR_BandNR_t *nr_bandnr = CALLOC(1,sizeof(NR_BandNR_t));
+ nr_bandnr->bandNR = band;
+ ASN_SEQUENCE_ADD(&cap->rf_Parameters.supportedBandListNR.list,
+ nr_bandnr);
+ if (mcs_table == 1) {
+ int bw = get_supported_band_index(numerology, band, rbsize);
+ if (band>256) {
+ NR_BandNR_t *bandNRinfo = cap->rf_Parameters.supportedBandListNR.list.array[0];
+ bandNRinfo->pdsch_256QAM_FR2 = CALLOC(1,sizeof(*bandNRinfo->pdsch_256QAM_FR2));
+ *bandNRinfo->pdsch_256QAM_FR2 = NR_BandNR__pdsch_256QAM_FR2_supported;
+ }
+ else{
+ cap->phy_Parameters.phy_ParametersFR1 = CALLOC(1,sizeof(*cap->phy_Parameters.phy_ParametersFR1));
+ NR_Phy_ParametersFR1_t *phy_fr1 = cap->phy_Parameters.phy_ParametersFR1;
+ phy_fr1->pdsch_256QAM_FR1 = CALLOC(1,sizeof(*phy_fr1->pdsch_256QAM_FR1));
+ *phy_fr1->pdsch_256QAM_FR1 = NR_Phy_ParametersFR1__pdsch_256QAM_FR1_supported;
+ }
+ cap->featureSets = CALLOC(1,sizeof(*cap->featureSets));
+ NR_FeatureSets_t *fs=cap->featureSets;
+ fs->featureSetsDownlinkPerCC = CALLOC(1,sizeof(*fs->featureSetsDownlinkPerCC));
+ NR_FeatureSetDownlinkPerCC_t *fs_cc = CALLOC(1,sizeof(NR_FeatureSetDownlinkPerCC_t));
+ fs_cc->supportedSubcarrierSpacingDL = numerology;
+ if(band>256) {
+ fs_cc->supportedBandwidthDL.present = NR_SupportedBandwidth_PR_fr2;
+ fs_cc->supportedBandwidthDL.choice.fr2 = bw;
+ }
+ else{
+ fs_cc->supportedBandwidthDL.present = NR_SupportedBandwidth_PR_fr1;
+ fs_cc->supportedBandwidthDL.choice.fr1 = bw;
+ }
+ fs_cc->supportedModulationOrderDL = CALLOC(1,sizeof(*fs_cc->supportedModulationOrderDL));
+ *fs_cc->supportedModulationOrderDL = NR_ModulationOrder_qam256;
+ ASN_SEQUENCE_ADD(&fs->featureSetsDownlinkPerCC->list,
+ fs_cc);
+ }
+}
+
void nr_rrc_config_dl_tda(NR_ServingCellConfigCommon_t *scc){
lte_frame_type_t frame_type = get_frame_type(*scc->downlinkConfigCommon->frequencyInfoDL->frequencyBandList.list.array[0], *scc->ssbSubcarrierSpacing);
@@ -105,6 +149,52 @@ void nr_rrc_config_ul_tda(NR_ServingCellConfigCommon_t *scc, int min_fb_delay){
ASN_SEQUENCE_ADD(&scc->uplinkConfigCommon->initialUplinkBWP->pusch_ConfigCommon->choice.setup->pusch_TimeDomainAllocationList->list,pusch_timedomainresourceallocation_msg3);
}
}
-
}
+
+void set_dl_mcs_table(int scs, NR_UE_NR_Capability_t *cap,
+ NR_BWP_DownlinkDedicated_t *bwp_Dedicated,
+ NR_ServingCellConfigCommon_t *scc) {
+
+ if (cap == NULL){
+ bwp_Dedicated->pdsch_Config->choice.setup->mcs_Table = NULL;
+ return;
+ }
+
+ int band = *scc->downlinkConfigCommon->frequencyInfoDL->frequencyBandList.list.array[0];
+ struct NR_FrequencyInfoDL__scs_SpecificCarrierList scs_list = scc->downlinkConfigCommon->frequencyInfoDL->scs_SpecificCarrierList;
+ int bw_rb = -1;
+ for(int i=0; isubcarrierSpacing){
+ bw_rb = scs_list.list.array[i]->carrierBandwidth;
+ break;
+ }
+ }
+ AssertFatal(bw_rb>0,"Could not find scs-SpecificCarrierList element for scs %d",scs);
+ int bw = get_supported_band_index(scs, band, bw_rb);
+ AssertFatal(bw>0,"Supported band corresponding to %d RBs not found\n", bw_rb);
+
+ bool supported = false;
+ if (band>256) {
+ for (int i=0;irf_Parameters.supportedBandListNR.list.count;i++) {
+ NR_BandNR_t *bandNRinfo = cap->rf_Parameters.supportedBandListNR.list.array[i];
+ if(bandNRinfo->bandNR == band && bandNRinfo->pdsch_256QAM_FR2) {
+ supported = true;
+ break;
+ }
+ }
+ }
+ else if (cap->phy_Parameters.phy_ParametersFR1 && cap->phy_Parameters.phy_ParametersFR1->pdsch_256QAM_FR1)
+ supported = true;
+
+ if (supported) {
+ if(bwp_Dedicated->pdsch_Config->choice.setup->mcs_Table == NULL)
+ bwp_Dedicated->pdsch_Config->choice.setup->mcs_Table = calloc(1, sizeof(*bwp_Dedicated->pdsch_Config->choice.setup->mcs_Table));
+ *bwp_Dedicated->pdsch_Config->choice.setup->mcs_Table = NR_PDSCH_Config__mcs_Table_qam256;
+ }
+ else
+ bwp_Dedicated->pdsch_Config->choice.setup->mcs_Table = NULL;
+}
+
+
+
diff --git a/openair2/RRC/NR/nr_rrc_config.h b/openair2/RRC/NR/nr_rrc_config.h
index 192fee754e..1a0d091e35 100644
--- a/openair2/RRC/NR/nr_rrc_config.h
+++ b/openair2/RRC/NR/nr_rrc_config.h
@@ -113,6 +113,14 @@ typedef struct physicalcellgroup_s{
void nr_rrc_config_dl_tda(NR_ServingCellConfigCommon_t *scc);
void nr_rrc_config_ul_tda(NR_ServingCellConfigCommon_t *scc, int min_fb_delay);
+void set_dl_mcs_table(int scs, NR_UE_NR_Capability_t *cap,
+ NR_BWP_DownlinkDedicated_t *bwp_Dedicated,
+ NR_ServingCellConfigCommon_t *scc);
+void prepare_sim_uecap(NR_UE_NR_Capability_t *cap,
+ NR_ServingCellConfigCommon_t *scc,
+ int numerology,
+ int rbsize,
+ int mcs_table);
#endif
diff --git a/openair2/RRC/NR/nr_rrc_proto.h b/openair2/RRC/NR/nr_rrc_proto.h
index 5008af6fa8..7dceb55a4b 100644
--- a/openair2/RRC/NR/nr_rrc_proto.h
+++ b/openair2/RRC/NR/nr_rrc_proto.h
@@ -76,6 +76,7 @@ void rrc_remove_nsa_user(gNB_RRC_INST *rrc, int rnti);
void fill_default_secondaryCellGroup(NR_ServingCellConfigCommon_t *servingcellconfigcommon,
NR_ServingCellConfig_t *servingcellconfigdedicated,
NR_CellGroupConfig_t *secondaryCellGroup,
+ NR_UE_NR_Capability_t *uecap,
int scg_id,
int servCellIndex,
int dl_antenna_ports,
@@ -94,6 +95,7 @@ void fill_default_reconfig(NR_ServingCellConfigCommon_t *servingcellconfigcommon
NR_ServingCellConfig_t *servingcellconfigdedicated,
NR_RRCReconfiguration_IEs_t *reconfig,
NR_CellGroupConfig_t *secondaryCellGroup,
+ NR_UE_NR_Capability_t *uecap,
int dl_antenna_ports,
int minRXTXTIMEpdsch,
int do_csirs,
diff --git a/openair2/RRC/NR/rrc_gNB.c b/openair2/RRC/NR/rrc_gNB.c
index 0a30569b81..d6c658f01d 100755
--- a/openair2/RRC/NR/rrc_gNB.c
+++ b/openair2/RRC/NR/rrc_gNB.c
@@ -709,6 +709,8 @@ rrc_gNB_generate_defaultRRCReconfiguration(
dedicatedNAS_MessageList = NULL;
}
+ gNB_RRC_INST *rrc = RC.nrrrc[ctxt_pP->module_id];
+ gNB_RRC_UE_t *ue_p = &ue_context_pP->ue_context;
memset(buffer, 0, sizeof(buffer));
size = do_RRCReconfiguration(ctxt_pP, buffer, sizeof(buffer),
xid,
@@ -719,8 +721,10 @@ rrc_gNB_generate_defaultRRCReconfiguration(
NULL,
NULL,
dedicatedNAS_MessageList,
+ ue_context_pP,
+ &rrc->carrier,
NULL,
- NULL);
+ ue_p->masterCellGroup);
free(ue_context_pP->ue_context.nas_pdu.buffer);
@@ -980,6 +984,8 @@ rrc_gNB_generate_dedicatedRRCReconfiguration(
NULL,
NULL,
dedicatedNAS_MessageList,
+ ue_context_pP,
+ &rrc->carrier,
NULL,
cellGroupConfig);
LOG_DUMPMSG(NR_RRC,DEBUG_RRC,(char *)buffer,size,"[MSG] RRC Reconfiguration\n");
@@ -1151,6 +1157,8 @@ rrc_gNB_modify_dedicatedRRCReconfiguration(
NULL,
dedicatedNAS_MessageList,
NULL,
+ NULL,
+ NULL,
NULL);
LOG_DUMPMSG(NR_RRC, DEBUG_RRC, (char *)buffer, size, "[MSG] RRC Reconfiguration\n");
@@ -1249,6 +1257,8 @@ rrc_gNB_generate_dedicatedRRCReconfiguration_release(
NULL,
dedicatedNAS_MessageList,
NULL,
+ NULL,
+ NULL,
NULL);
ue_context_pP->ue_context.pdu_session_release_command_flag = 1;
@@ -1798,6 +1808,8 @@ rrc_gNB_process_RRCConnectionReestablishmentComplete(
NULL, // MeasObj_list,
NULL,
NULL,
+ NULL,
+ NULL,
NULL);
LOG_DUMPMSG(NR_RRC,DEBUG_RRC,(char *)buffer,size,
"[MSG] RRC Reconfiguration\n");
@@ -3340,51 +3352,6 @@ unsigned int get_ul_bw_mask(gNB_RRC_INST *rrc,NR_UE_NR_Capability_t *cap) {
return(0);
}
-int is_dl_256QAM_supported(gNB_RRC_INST *rrc,NR_UE_NR_Capability_t *cap) {
- int common_band = *rrc->carrier.servingcellconfigcommon->downlinkConfigCommon->frequencyInfoDL->frequencyBandList.list.array[0];
- int common_scs = rrc->carrier.servingcellconfigcommon->downlinkConfigCommon->frequencyInfoDL->scs_SpecificCarrierList.list.array[0]->subcarrierSpacing;
- if (common_band>256) {
- for (int i=0;irf_Parameters.supportedBandListNR.list.count;i++) {
- NR_BandNR_t *bandNRinfo = cap->rf_Parameters.supportedBandListNR.list.array[i];
- if (bandNRinfo->bandNR == common_band && !bandNRinfo->pdsch_256QAM_FR2) return (0);
- }
- }
- else if (cap->phy_Parameters.phy_ParametersFR1 && !cap->phy_Parameters.phy_ParametersFR1->pdsch_256QAM_FR1) return(0);
-
- // check featureSet
- NR_FeatureSets_t *fs=cap->featureSets;
- if (fs) {
- // go through DL feature sets and look for one with current SCS
- for (int i=0;ifeatureSetsDownlinkPerCC->list.count;i++) {
- if (fs->featureSetsDownlinkPerCC->list.array[i]->supportedSubcarrierSpacingDL == common_scs &&
- fs->featureSetsDownlinkPerCC->list.array[i]->supportedModulationOrderDL &&
- *fs->featureSetsDownlinkPerCC->list.array[i]->supportedModulationOrderDL == NR_ModulationOrder_qam256) return(1);
- }
- }
- return(0);
-}
-
-int is_ul_256QAM_supported(gNB_RRC_INST *rrc,NR_UE_NR_Capability_t *cap) {
- int common_band = *rrc->carrier.servingcellconfigcommon->uplinkConfigCommon->frequencyInfoUL->frequencyBandList->list.array[0];
- int common_scs = rrc->carrier.servingcellconfigcommon->uplinkConfigCommon->frequencyInfoUL->scs_SpecificCarrierList.list.array[0]->subcarrierSpacing;
- for (int i=0;irf_Parameters.supportedBandListNR.list.count;i++) {
- NR_BandNR_t *bandNRinfo = cap->rf_Parameters.supportedBandListNR.list.array[i];
- if (bandNRinfo->bandNR == common_band && !bandNRinfo->pusch_256QAM) return (0);
- }
-
- // check featureSet
- NR_FeatureSets_t *fs=cap->featureSets;
- if (fs) {
- // go through UL feature sets and look for one with current SCS
- for (int i=0;ifeatureSetsUplinkPerCC->list.count;i++) {
- if (fs->featureSetsUplinkPerCC->list.array[i]->supportedSubcarrierSpacingUL == common_scs &&
- fs->featureSetsUplinkPerCC->list.array[i]->supportedModulationOrderUL &&
- *fs->featureSetsUplinkPerCC->list.array[i]->supportedModulationOrderUL == NR_ModulationOrder_qam256) return(1);
- }
- }
- return(0);
-}
-
int get_ul_mimo_layersCB(gNB_RRC_INST *rrc,NR_UE_NR_Capability_t *cap) {
int common_scs = rrc->carrier.servingcellconfigcommon->uplinkConfigCommon->frequencyInfoUL->scs_SpecificCarrierList.list.array[0]->subcarrierSpacing;
@@ -3454,11 +3421,9 @@ void nr_rrc_subframe_process(protocol_ctxt_t *const ctxt_pP, const int CC_id) {
}
if (ue_context_p->ue_context.UE_Capability_nr) {
- fprintf(fd,"NR RRC UE cap: BW DL %x. BW UL %x, 256 QAM DL %s, 256 QAM UL %s, DL MIMO Layers %d UL MIMO Layers (CB) %d UL MIMO Layers (nonCB) %d\n",
+ fprintf(fd,"NR RRC UE cap: BW DL %x. BW UL %x, DL MIMO Layers %d UL MIMO Layers (CB) %d UL MIMO Layers (nonCB) %d\n",
get_dl_bw_mask(RC.nrrrc[0],ue_context_p->ue_context.UE_Capability_nr),
get_ul_bw_mask(RC.nrrrc[0],ue_context_p->ue_context.UE_Capability_nr),
- is_dl_256QAM_supported(RC.nrrrc[0],ue_context_p->ue_context.UE_Capability_nr) == 1 ? "yes" : "no",
- is_ul_256QAM_supported(RC.nrrrc[0],ue_context_p->ue_context.UE_Capability_nr) == 1 ? "yes" : "no",
get_dl_mimo_layers(RC.nrrrc[0],ue_context_p->ue_context.UE_Capability_nr),
get_ul_mimo_layersCB(RC.nrrrc[0],ue_context_p->ue_context.UE_Capability_nr),
get_ul_mimo_layers(RC.nrrrc[0],ue_context_p->ue_context.UE_Capability_nr));
diff --git a/openair2/RRC/NR/rrc_gNB_nsa.c b/openair2/RRC/NR/rrc_gNB_nsa.c
index e55c9d4ed2..70dfebaaf7 100644
--- a/openair2/RRC/NR/rrc_gNB_nsa.c
+++ b/openair2/RRC/NR/rrc_gNB_nsa.c
@@ -245,6 +245,7 @@ void rrc_add_nsa_user(gNB_RRC_INST *rrc,struct rrc_gNB_ue_context_s *ue_context_
ue_context_p->ue_context.spCellConfig->spCellConfigDedicated,
reconfig_ies,
ue_context_p->ue_context.secondaryCellGroup,
+ ue_context_p->ue_context.UE_Capability_nr,
carrier->pdsch_AntennaPorts,
carrier->minRXTXTIME,
carrier->do_CSIRS,
@@ -255,6 +256,7 @@ void rrc_add_nsa_user(gNB_RRC_INST *rrc,struct rrc_gNB_ue_context_s *ue_context_
NULL,
reconfig_ies,
ue_context_p->ue_context.secondaryCellGroup,
+ ue_context_p->ue_context.UE_Capability_nr,
carrier->pdsch_AntennaPorts,
carrier->minRXTXTIME,
carrier->do_CSIRS,
diff --git a/openair2/RRC/NR/rrc_gNB_reconfig.c b/openair2/RRC/NR/rrc_gNB_reconfig.c
index 6130cd256d..1de34804df 100644
--- a/openair2/RRC/NR/rrc_gNB_reconfig.c
+++ b/openair2/RRC/NR/rrc_gNB_reconfig.c
@@ -45,6 +45,7 @@
#include "SIMULATION/TOOLS/sim.h"
#include "executables/softmodem-common.h"
#include "LAYER2/nr_rlc/nr_rlc_oai_api.h"
+#include "nr_rrc_config.h"
#define false 0
#define true 1
@@ -52,6 +53,7 @@
void fill_default_secondaryCellGroup(NR_ServingCellConfigCommon_t *servingcellconfigcommon,
NR_ServingCellConfig_t *servingcellconfigdedicated,
NR_CellGroupConfig_t *secondaryCellGroup,
+ NR_UE_NR_Capability_t *uecap,
int scg_id,
int servCellIndex,
int dl_antenna_ports,
@@ -63,6 +65,9 @@ void fill_default_secondaryCellGroup(NR_ServingCellConfigCommon_t *servingcellco
AssertFatal(servingcellconfigcommon!=NULL,"servingcellconfigcommon is null\n");
AssertFatal(secondaryCellGroup!=NULL,"secondaryCellGroup is null\n");
+ if(uecap == NULL)
+ LOG_E(RRC,"No UE Capabilities available when programming default CellGroup in NSA\n");
+
// This assert will never happen in the current implementation because NUMBER_OF_UE_MAX = 4.
// However, if in the future NUMBER_OF_UE_MAX is increased, it will be necessary to improve the allocation of SRS resources,
// where the startPosition = 2 or 3 and sl160 = 17, 17, 27 ... 157 only give us 30 different allocations.
@@ -336,12 +341,7 @@ void fill_default_secondaryCellGroup(NR_ServingCellConfigCommon_t *servingcellco
secondaryCellGroup->spCellConfig->spCellConfigDedicated->initialDownlinkBWP->pdsch_Config->choice.setup->rateMatchPatternGroup1=NULL;
secondaryCellGroup->spCellConfig->spCellConfigDedicated->initialDownlinkBWP->pdsch_Config->choice.setup->rateMatchPatternGroup2=NULL;
secondaryCellGroup->spCellConfig->spCellConfigDedicated->initialDownlinkBWP->pdsch_Config->choice.setup->rbg_Size=NR_PDSCH_Config__rbg_Size_config1;
- if (!get_softmodem_params()->use_256qam_table) {
- secondaryCellGroup->spCellConfig->spCellConfigDedicated->initialDownlinkBWP->pdsch_Config->choice.setup->mcs_Table=NULL;
- } else {
- secondaryCellGroup->spCellConfig->spCellConfigDedicated->initialDownlinkBWP->pdsch_Config->choice.setup->mcs_Table = calloc(1, sizeof(*secondaryCellGroup->spCellConfig->spCellConfigDedicated->initialDownlinkBWP->pdsch_Config->choice.setup->mcs_Table));
- *secondaryCellGroup->spCellConfig->spCellConfigDedicated->initialDownlinkBWP->pdsch_Config->choice.setup->mcs_Table = NR_PDSCH_Config__mcs_Table_qam256;
- }
+ secondaryCellGroup->spCellConfig->spCellConfigDedicated->initialDownlinkBWP->pdsch_Config->choice.setup->mcs_Table=NULL;
secondaryCellGroup->spCellConfig->spCellConfigDedicated->initialDownlinkBWP->pdsch_Config->choice.setup->maxNrofCodeWordsScheduledByDCI = calloc(1,sizeof(*secondaryCellGroup->spCellConfig->spCellConfigDedicated->initialDownlinkBWP->pdsch_Config->choice.setup->maxNrofCodeWordsScheduledByDCI));
*secondaryCellGroup->spCellConfig->spCellConfigDedicated->initialDownlinkBWP->pdsch_Config->choice.setup->maxNrofCodeWordsScheduledByDCI = NR_PDSCH_Config__maxNrofCodeWordsScheduledByDCI_n1;
secondaryCellGroup->spCellConfig->spCellConfigDedicated->initialDownlinkBWP->pdsch_Config->choice.setup->prb_BundlingType.present = NR_PDSCH_Config__prb_BundlingType_PR_staticBundling;
@@ -605,43 +605,7 @@ void fill_default_secondaryCellGroup(NR_ServingCellConfigCommon_t *servingcellco
bwp->bwp_Dedicated->pdsch_Config->choice.setup->rateMatchPatternGroup1=NULL;
bwp->bwp_Dedicated->pdsch_Config->choice.setup->rateMatchPatternGroup2=NULL;
bwp->bwp_Dedicated->pdsch_Config->choice.setup->rbg_Size=NR_PDSCH_Config__rbg_Size_config1;
- if (!get_softmodem_params()->use_256qam_table) {
- bwp->bwp_Dedicated->pdsch_Config->choice.setup->mcs_Table=NULL;
- } else {
- bwp->bwp_Dedicated->pdsch_Config->choice.setup->mcs_Table = calloc(1, sizeof(*bwp->bwp_Dedicated->pdsch_Config->choice.setup->mcs_Table));
- *bwp->bwp_Dedicated->pdsch_Config->choice.setup->mcs_Table = NR_PDSCH_Config__mcs_Table_qam256;
- }
- bwp->bwp_Dedicated->pdsch_Config->choice.setup->maxNrofCodeWordsScheduledByDCI = calloc(1,sizeof(*bwp->bwp_Dedicated->pdsch_Config->choice.setup->maxNrofCodeWordsScheduledByDCI));
- *bwp->bwp_Dedicated->pdsch_Config->choice.setup->maxNrofCodeWordsScheduledByDCI = NR_PDSCH_Config__maxNrofCodeWordsScheduledByDCI_n1;
- bwp->bwp_Dedicated->pdsch_Config->choice.setup->prb_BundlingType.present = NR_PDSCH_Config__prb_BundlingType_PR_staticBundling;
- bwp->bwp_Dedicated->pdsch_Config->choice.setup->prb_BundlingType.choice.staticBundling = calloc(1,sizeof(*bwp->bwp_Dedicated->pdsch_Config->choice.setup->prb_BundlingType.choice.staticBundling));
- bwp->bwp_Dedicated->pdsch_Config->choice.setup->prb_BundlingType.choice.staticBundling->bundleSize =
- calloc(1,sizeof(*bwp->bwp_Dedicated->pdsch_Config->choice.setup->prb_BundlingType.choice.staticBundling->bundleSize));
- *bwp->bwp_Dedicated->pdsch_Config->choice.setup->prb_BundlingType.choice.staticBundling->bundleSize = NR_PDSCH_Config__prb_BundlingType__staticBundling__bundleSize_wideband;
- bwp->bwp_Dedicated->pdsch_Config->choice.setup->zp_CSI_RS_ResourceToAddModList=NULL;
- bwp->bwp_Dedicated->pdsch_Config->choice.setup->zp_CSI_RS_ResourceToReleaseList=NULL;
- bwp->bwp_Dedicated->pdsch_Config->choice.setup->aperiodic_ZP_CSI_RS_ResourceSetsToAddModList=NULL;
- bwp->bwp_Dedicated->pdsch_Config->choice.setup->aperiodic_ZP_CSI_RS_ResourceSetsToReleaseList=NULL;
- bwp->bwp_Dedicated->pdsch_Config->choice.setup->sp_ZP_CSI_RS_ResourceSetsToAddModList=NULL;
- bwp->bwp_Dedicated->pdsch_Config->choice.setup->sp_ZP_CSI_RS_ResourceSetsToReleaseList=NULL;
- bwp->bwp_Dedicated->pdsch_Config->choice.setup->p_ZP_CSI_RS_ResourceSet=NULL;
-
- bwp->bwp_Dedicated->pdsch_Config->choice.setup->tci_StatesToReleaseList=NULL;
- bwp->bwp_Dedicated->pdsch_Config->choice.setup->vrb_ToPRB_Interleaver=NULL;
- bwp->bwp_Dedicated->pdsch_Config->choice.setup->resourceAllocation=NR_PDSCH_Config__resourceAllocation_resourceAllocationType1;
- bwp->bwp_Dedicated->pdsch_Config->choice.setup->pdsch_TimeDomainAllocationList=NULL;
- bwp->bwp_Dedicated->pdsch_Config->choice.setup->pdsch_AggregationFactor=NULL;
- bwp->bwp_Dedicated->pdsch_Config->choice.setup->rateMatchPatternToAddModList=NULL;
- bwp->bwp_Dedicated->pdsch_Config->choice.setup->rateMatchPatternToReleaseList=NULL;
- bwp->bwp_Dedicated->pdsch_Config->choice.setup->rateMatchPatternGroup1=NULL;
- bwp->bwp_Dedicated->pdsch_Config->choice.setup->rateMatchPatternGroup2=NULL;
- bwp->bwp_Dedicated->pdsch_Config->choice.setup->rbg_Size=NR_PDSCH_Config__rbg_Size_config1;
- if (!get_softmodem_params()->use_256qam_table) {
- bwp->bwp_Dedicated->pdsch_Config->choice.setup->mcs_Table=NULL;
- } else {
- bwp->bwp_Dedicated->pdsch_Config->choice.setup->mcs_Table = calloc(1, sizeof(*bwp->bwp_Dedicated->pdsch_Config->choice.setup->mcs_Table));
- *bwp->bwp_Dedicated->pdsch_Config->choice.setup->mcs_Table = NR_PDSCH_Config__mcs_Table_qam256;
- }
+ set_dl_mcs_table(bwp->bwp_Common->genericParameters.subcarrierSpacing, uecap, bwp->bwp_Dedicated, servingcellconfigcommon);
bwp->bwp_Dedicated->pdsch_Config->choice.setup->maxNrofCodeWordsScheduledByDCI = calloc(1,sizeof(*bwp->bwp_Dedicated->pdsch_Config->choice.setup->maxNrofCodeWordsScheduledByDCI));
*bwp->bwp_Dedicated->pdsch_Config->choice.setup->maxNrofCodeWordsScheduledByDCI = NR_PDSCH_Config__maxNrofCodeWordsScheduledByDCI_n1;
bwp->bwp_Dedicated->pdsch_Config->choice.setup->prb_BundlingType.present = NR_PDSCH_Config__prb_BundlingType_PR_staticBundling;
@@ -744,8 +708,8 @@ void fill_default_secondaryCellGroup(NR_ServingCellConfigCommon_t *servingcellco
pusch_Config->pusch_TimeDomainAllocationList = NULL;
pusch_Config->pusch_AggregationFactor=NULL;
pusch_Config->mcs_Table=NULL;
- pusch_Config->mcs_TableTransformPrecoder=NULL;
pusch_Config->transformPrecoder= NULL;
+ pusch_Config->mcs_TableTransformPrecoder=NULL;
/* if msg3_transformprecoding is set in conf file - pusch config should not disable it */
if (servingcellconfigcommon->uplinkConfigCommon->initialUplinkBWP->rach_ConfigCommon->choice.setup->msg3_transformPrecoder == NULL) {
pusch_Config->transformPrecoder=calloc(1,sizeof(*pusch_Config->transformPrecoder));
@@ -1378,6 +1342,7 @@ void fill_default_reconfig(NR_ServingCellConfigCommon_t *servingcellconfigcommon
NR_ServingCellConfig_t *servingcellconfigdedicated,
NR_RRCReconfiguration_IEs_t *reconfig,
NR_CellGroupConfig_t *secondaryCellGroup,
+ NR_UE_NR_Capability_t *uecap,
int dl_antenna_ports,
int minRXTXTIME,
int do_csirs,
@@ -1392,6 +1357,7 @@ void fill_default_reconfig(NR_ServingCellConfigCommon_t *servingcellconfigcommon
fill_default_secondaryCellGroup(servingcellconfigcommon,
servingcellconfigdedicated,
secondaryCellGroup,
+ uecap,
1,
1,
dl_antenna_ports,
diff --git a/openair2/UTIL/FIFO/pad_list.c b/openair2/UTIL/FIFO/pad_list.c
deleted file mode 100644
index 124893a756..0000000000
--- a/openair2/UTIL/FIFO/pad_list.c
+++ /dev/null
@@ -1,607 +0,0 @@
-/*
- * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The OpenAirInterface Software Alliance licenses this file to You under
- * the OAI Public License, Version 1.1 (the "License"); you may not use this file
- * except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.openairinterface.org/?page_id=698
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *-------------------------------------------------------------------------------
- * For more information about the OpenAirInterface (OAI) Software Alliance:
- * contact@openairinterface.org
- */
-
-/*! \file pad_list.c
-* \brief list management primimtives
-* \author Mohamed Said MOSLI BOUKSIAA, Lionel GAUTHIER, Navid Nikaein
-* \date 2012 - 2014
-* \version 0.5
-* @ingroup util
-*/
-//#define LIST_C
-//#define NULL 0
-
-#include
-#include
-#include "pad_list.h"
-//#include
-
-
-void job_list_init (Job_List_t *listP) {
- listP->tail = NULL;
- listP->head = NULL;
- listP->nb_elements = 0;
-}
-
-void event_list_init (Event_List_t *listP) {
- listP->tail = NULL;
- listP->head = NULL;
- listP->nb_elements = 0;
-}
-
-void pkt_list_init (Packet_OTG_List_t *listP) {
- listP->tail = NULL;
- listP->head = NULL;
- listP->nb_elements = 0;
-}
-
-//-----------------------------------------------------------------------------
-
-void job_list_free (Job_List_t *listP) {
- Job_elt_t *le;
-
- while ((le = job_list_remove_head (listP))) {
- free(le);
- }
-}
-
-void event_list_free (Event_List_t *listP) {
- Event_elt_t *le;
-
- while ((le = event_list_remove_head (listP))) {
- free(le);
- }
-}
-
-void pkt_list_free (Packet_OTG_List_t *listP) {
- Packet_otg_elt_t *le;
-
- while ((le = pkt_list_remove_head (listP))) {
- free(le);
- }
-}
-
-//-----------------------------------------------------------------------------
-
-Job_elt_t *job_list_get_head (Job_List_t *listP) {
- return listP->head;
-}
-
-Event_elt_t *event_list_get_head (Event_List_t *listP) {
- return listP->head;
-}
-
-Packet_otg_elt_t *pkt_list_get_head (Packet_OTG_List_t *listP) {
- return listP->head;
-}
-
-//-----------------------------------------------------------------------------
-
-/*
- * remove an element from head of a list
- * @param pointer on targeted list
- * @return pointer on removed Job_elt_t
- */
-Job_elt_t *job_list_remove_head (Job_List_t *listP) {
- // access optimisation
- Job_elt_t *head;
- head = listP->head;
-
- // almost one element
- if (head != NULL) {
- listP->head = head->next;
- listP->nb_elements = listP->nb_elements - 1;
-
- // if only one element, update tail
- if (listP->head == NULL) {
- listP->tail = NULL;
- } else {
- head->next = NULL;
- }
- } else {
- //msg("[MEM_MGT][WARNING] remove_head_from_list(%s) no elements\n",listP->name);
- }
-
- return head;
-}
-
-Event_elt_t *event_list_remove_head (Event_List_t *listP) {
- // access optimisation
- Event_elt_t *head;
- head = listP->head;
-
- // almost one element
- if (head != NULL) {
- listP->head = head->next;
- listP->nb_elements = listP->nb_elements - 1;
-
- // if only one element, update tail
- if (listP->head == NULL) {
- listP->tail = NULL;
- } else {
- head->next = NULL;
- }
- } else {
- //msg("[MEM_MGT][WARNING] remove_head_from_list(%s) no elements\n",listP->name);
- }
-
- return head;
-}
-
-Packet_otg_elt_t *pkt_list_remove_head (Packet_OTG_List_t *listP) {
- // access optimisation
- Packet_otg_elt_t *head;
- head = listP->head;
-
- // almost one element
- if (head != NULL) {
- listP->head = head->next;
- listP->nb_elements = listP->nb_elements - 1;
-
- // if only one element, update tail
- if (listP->head == NULL) {
- listP->tail = NULL;
- } else {
- head->next = NULL;
- }
- } else {
- //msg("[MEM_MGT][WARNING] remove_head_from_list(%s) no elements\n",listP->name);
- }
-
- return head;
-}
-
-//-----------------------------------------------------------------------------
-
-Job_elt_t *job_list_remove_element (Job_elt_t *elementP, Job_List_t *listP) {
- // access optimisation;
- Job_elt_t *head;
-
- if (elementP != NULL) {
- // test head
- head = listP->head;
-
- if (listP->head == elementP) {
- // almost one element
- if (head != NULL) {
- listP->head = head->next;
- listP->nb_elements = listP->nb_elements - 1;
-
- // if only one element, update tail
- if (listP->head == NULL) {
- listP->tail = NULL;
- } else {
- head->next = NULL;
- }
- }
- } else {
- while (head) {
- if (head->next == elementP) {
- head->next = elementP->next;
- listP->nb_elements = listP->nb_elements - 1;
-
- if (listP->tail == elementP) {
- listP->tail = head;
- }
-
- return elementP;
- } else {
- head = head->next;
- }
- }
- }
- }
-
- return elementP;
-}
-
-Event_elt_t *event_list_remove_element (Event_elt_t *elementP, Event_List_t *listP) {
- // access optimisation;
- Event_elt_t *head;
-
- if (elementP != NULL) {
- // test head
- head = listP->head;
-
- if (listP->head == elementP) {
- // almost one element
- if (head != NULL) {
- listP->head = head->next;
- listP->nb_elements = listP->nb_elements - 1;
-
- // if only one element, update tail
- if (listP->head == NULL) {
- listP->tail = NULL;
- } else {
- head->next = NULL;
- }
- }
- } else {
- while (head) {
- if (head->next == elementP) {
- head->next = elementP->next;
- listP->nb_elements = listP->nb_elements - 1;
-
- if (listP->tail == elementP) {
- listP->tail = head;
- }
-
- return elementP;
- } else {
- head = head->next;
- }
- }
- }
- }
-
- return elementP;
-}
-
-Packet_otg_elt_t *pkt_list_remove_element (Packet_otg_elt_t *elementP, Packet_OTG_List_t *listP) {
- // access optimisation;
- Packet_otg_elt_t *head;
-
- if (elementP != NULL) {
- // test head
- head = listP->head;
-
- if (listP->head == elementP) {
- // almost one element
- if (head != NULL) {
- listP->head = head->next;
- listP->nb_elements = listP->nb_elements - 1;
-
- // if only one element, update tail
- if (listP->head == NULL) {
- listP->tail = NULL;
- } else {
- head->next = NULL;
- }
- }
- } else {
- while (head) {
- if (head->next == elementP) {
- head->next = elementP->next;
- listP->nb_elements = listP->nb_elements - 1;
-
- if (listP->tail == elementP) {
- listP->tail = head;
- }
-
- return elementP;
- } else {
- head = head->next;
- }
- }
- }
- }
-
- return elementP;
-}
-
-//-----------------------------------------------------------------------------
-/*
- * add an element to the beginning of a list
- * @param pointer on targeted list
- * @return pointer on removed Job_elt_t
- */
-
-void job_list_add_head (Job_elt_t *elementP, Job_List_t *listP) {
- // access optimisation;
- Job_elt_t *head;
-
- if (elementP != NULL) {
- head = listP->head;
- listP->nb_elements = listP->nb_elements + 1;
-
- // almost one element
- if (head == NULL) {
- listP->head = elementP;
- listP->tail = elementP;
- } else {
- elementP->next = head;
- listP->head = elementP;
- }
- }
-}
-
-void event_list_add_head (Event_elt_t *elementP, Event_List_t *listP) {
- // access optimisation;
- Event_elt_t *head;
-
- if (elementP != NULL) {
- head = listP->head;
- listP->nb_elements = listP->nb_elements + 1;
-
- // almost one element
- if (head == NULL) {
- listP->head = elementP;
- listP->tail = elementP;
- } else {
- elementP->next = head;
- listP->head = elementP;
- }
- }
-}
-
-void pkt_list_add_head (Packet_otg_elt_t *elementP, Packet_OTG_List_t *listP) {
- // access optimisation;
- Packet_otg_elt_t *head;
-
- if (elementP != NULL) {
- head = listP->head;
- listP->nb_elements = listP->nb_elements + 1;
-
- // almost one element
- if (head == NULL) {
- listP->head = elementP;
- listP->tail = elementP;
- } else {
- elementP->next = head;
- listP->head = elementP;
- }
- }
-}
-
-void event_list_add_element (Event_elt_t *elementP, Event_elt_t *previous, Event_List_t *listP) {
- // access optimisation;
- Event_elt_t *next;
-
- if (elementP != NULL && previous != NULL) {
- elementP->next = NULL;
- next = previous->next;
- listP->nb_elements = listP->nb_elements + 1;
-
- // almost one element
- if (next == NULL) {
- previous->next = elementP;
- listP->tail = elementP;
- } else {
- elementP->next = previous->next;
- previous->next = elementP;
- }
- }
-}
-
-
-//-----------------------------------------------------------------------------
-/*
- * add an element to the end of a list
- * @param pointer on targeted list
- * @return pointer on removed Job_elt_t
- */
-void job_list_add_tail_eurecom (Job_elt_t *elementP, Job_List_t *listP) {
- Job_elt_t *tail;
-
- if (elementP != NULL) {
- // access optimisation
- listP->nb_elements = listP->nb_elements + 1;
- elementP->next = NULL;
- tail = listP->tail;
-
- // almost one element
- if (tail == NULL) {
- listP->head = elementP;
- } else {
- tail->next = elementP;
- }
-
- listP->tail = elementP;
- } else {
- //msg("[CNT_LIST][ERROR] add_cnt_tail() element NULL\n");
- }
-}
-
-void event_list_add_tail_eurecom (Event_elt_t *elementP, Event_List_t *listP) {
- Event_elt_t *tail;
-
- if (elementP != NULL) {
- // access optimisation
- listP->nb_elements = listP->nb_elements + 1;
- elementP->next = NULL;
- tail = listP->tail;
-
- // almost one element
- if (tail == NULL) {
- listP->head = elementP;
- } else {
- tail->next = elementP;
- }
-
- listP->tail = elementP;
- } else {
- //msg("[CNT_LIST][ERROR] add_cnt_tail() element NULL\n");
- }
-}
-
-void pkt_list_add_tail_eurecom (Packet_otg_elt_t *elementP, Packet_OTG_List_t *listP) {
- Packet_otg_elt_t *tail;
-
- if (elementP != NULL) {
- // access optimisation
- listP->nb_elements = listP->nb_elements + 1;
- elementP->next = NULL;
- tail = listP->tail;
-
- // almost one element
- if (tail == NULL) {
- listP->head = elementP;
- } else {
- tail->next = elementP;
- }
-
- listP->tail = elementP;
- } else {
- //msg("[CNT_LIST][ERROR] add_cnt_tail() element NULL\n");
- }
-}
-
-//-----------------------------------------------------------------------------
-void job_list_add_list (Job_List_t *sublistP, Job_List_t *listP) {
- if (sublistP) {
- if (sublistP->head) {
- // access optimisation
- Job_elt_t *tail;
- tail = listP->tail;
-
- // almost one element
- if (tail == NULL) {
- listP->head = sublistP->head;
- } else {
- tail->next = sublistP->head;
- }
-
- listP->tail = sublistP->tail;
- // clear sublist
- sublistP->head = NULL;
- sublistP->tail = NULL;
- listP->nb_elements = listP->nb_elements + sublistP->nb_elements;
- sublistP->nb_elements = 0;
- }
- }
-}
-
-void event_list_add_list (Event_List_t *sublistP, Event_List_t *listP) {
- if (sublistP) {
- if (sublistP->head) {
- // access optimisation
- Event_elt_t *tail;
- tail = listP->tail;
-
- // almost one element
- if (tail == NULL) {
- listP->head = sublistP->head;
- } else {
- tail->next = sublistP->head;
- }
-
- listP->tail = sublistP->tail;
- // clear sublist
- sublistP->head = NULL;
- sublistP->tail = NULL;
- listP->nb_elements = listP->nb_elements + sublistP->nb_elements;
- sublistP->nb_elements = 0;
- }
- }
-}
-
-void pkt_list_add_list (Packet_OTG_List_t *sublistP, Packet_OTG_List_t *listP) {
- if (sublistP) {
- if (sublistP->head) {
- // access optimisation
- Packet_otg_elt_t *tail;
- tail = listP->tail;
-
- // almost one element
- if (tail == NULL) {
- listP->head = sublistP->head;
- } else {
- tail->next = sublistP->head;
- }
-
- listP->tail = sublistP->tail;
- // clear sublist
- sublistP->head = NULL;
- sublistP->tail = NULL;
- listP->nb_elements = listP->nb_elements + sublistP->nb_elements;
- sublistP->nb_elements = 0;
- }
- }
-}
-
-//-----------------------------------------------------------------------------
-void job_list_display (Job_List_t *listP) {
- //Correct the output once the content of struct Job is fixed
- /*Job_elt_t *cursor;
- unsigned short nb_elements = 0;
-
- if (listP) {
- cursor = listP->head;
- if (cursor) {
- while (cursor != NULL) {
- if (cursor->job.type == eNB_DL)
- printf ("DL eNB From (%d,%d)\n", (cursor->job).nid, (cursor->job).mid);
- else if (cursor->job.type == UE_DL)
- printf ("DL UE From (%d,%d)\n", (cursor->job).nid, (cursor->job).mid);
- else if (cursor->job.type == UE_UL)
- printf ("UL UE From (%d,%d)\n", (cursor->job).nid, (cursor->job).mid);
- else if (cursor->job.type == eNB_UL)
- printf ("UL eNB From (%d,%d)\n", (cursor->job).nid, (cursor->job).mid);
- //msg ("From (%d,%d) To (%d,%d)\n", (cursor->job).node1, (cursor->job).master1, (cursor->job).node2, (cursor->job).master2);
- cursor = cursor->next;
- nb_elements++;
- }
- printf ("Found nb_elements %d nb_elements %d\n", nb_elements, listP->nb_elements);
- //msg ("Found nb_elements %d nb_elements %d\n", nb_elements, listP->nb_elements);
- }
- } else {
- printf ("[SDU_MNGT][WARNING] display_cnt_dbl_lk_list_up() : list is NULL\n");
- //msg ("[SDU_MNGT][WARNING] display_cnt_dbl_lk_list_up() : list is NULL\n");
- }*/
-}
-
-void event_list_display (Event_List_t *listP) {
- Event_elt_t *cursor;
- unsigned short nb_elements = 0;
-
- if (listP) {
- cursor = listP->head;
-
- if (cursor) {
- while (cursor != NULL) {
- printf ("Ev (%d,%d)\n", (cursor->event).type, (cursor->event).frame);
- //msg ("From (%d,%d) To (%d,%d)\n", (cursor->job).node1, (cursor->job).master1, (cursor->job).node2, (cursor->job).master2);
- cursor = cursor->next;
- nb_elements++;
- }
-
- printf ("Found nb_elements %d nb_elements %d\n", nb_elements, listP->nb_elements);
- //msg ("Found nb_elements %d nb_elements %d\n", nb_elements, listP->nb_elements);
- }
- } else {
- printf ("[SDU_MNGT][WARNING] display_cnt_dbl_lk_list_up() : list is NULL\n");
- //msg ("[SDU_MNGT][WARNING] display_cnt_dbl_lk_list_up() : list is NULL\n");
- }
-}
-
-void pkt_list_display (Packet_OTG_List_t *listP) {
- Packet_otg_elt_t *cursor;
- unsigned short nb_elements = 0;
-
- if (listP) {
- cursor = listP->head;
-
- if (cursor) {
- while (cursor != NULL) {
- printf ("Pkt (DST %d, RB %ld)\n", (cursor->otg_pkt).dst_id, (cursor->otg_pkt).rb_id);
- //msg ("From (%d,%d) To (%d,%d)\n", (cursor->job).node1, (cursor->job).master1, (cursor->job).node2, (cursor->job).master2);
- cursor = cursor->next;
- nb_elements++;
- }
-
- printf ("Found nb_elements %d nb_elements %d\n", nb_elements, listP->nb_elements);
- //msg ("Found nb_elements %d nb_elements %d\n", nb_elements, listP->nb_elements);
- }
- } else {
- printf ("[SDU_MNGT][WARNING] display_cnt_dbl_lk_list_up() : list is NULL\n");
- //msg ("[SDU_MNGT][WARNING] display_cnt_dbl_lk_list_up() : list is NULL\n");
- }
-}
diff --git a/openair2/UTIL/FIFO/pad_list.h b/openair2/UTIL/FIFO/pad_list.h
deleted file mode 100644
index 2a9ef9893f..0000000000
--- a/openair2/UTIL/FIFO/pad_list.h
+++ /dev/null
@@ -1,87 +0,0 @@
-/*
- * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The OpenAirInterface Software Alliance licenses this file to You under
- * the OAI Public License, Version 1.1 (the "License"); you may not use this file
- * except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.openairinterface.org/?page_id=698
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *-------------------------------------------------------------------------------
- * For more information about the OpenAirInterface (OAI) Software Alliance:
- * contact@openairinterface.org
- */
-
-/*! \file pad_list.c
-* \brief list management primimtives
-* \author Mohamed Said MOSLI BOUKSIAA, Lionel GAUTHIER, Navid Nikaein
-* \date 2012 - 2014
-* \version 0.5
-* @ingroup util
-*/
-
-#ifndef __list_H__
-#define __list_H__
-
-#include "types.h"
-//-----------------------------------------------------------------------------
-
-typedef struct Job_List_s {
- Job_elt_t *head;
- Job_elt_t *tail;
- int nb_elements;
-} Job_List_t;
-
-typedef struct Event_List_s {
- Event_elt_t *head;
- Event_elt_t *tail;
- int nb_elements;
-} Event_List_t;
-
-typedef struct Packet_OTG_List_s {
- Packet_otg_elt_t *head;
- Packet_otg_elt_t *tail;
- int nb_elements;
-} Packet_OTG_List_t;
-
-//-----------------------------------------------------------------------------
-void job_list_init (Job_List_t*);
-void job_list_free (Job_List_t* listP);
-Job_elt_t* job_list_get_head (Job_List_t*);
-Job_elt_t* job_list_remove_head (Job_List_t* );
-Job_elt_t* job_list_remove_element (Job_elt_t*, Job_List_t*);
-void job_list_add_head (Job_elt_t* , Job_List_t* );
-void job_list_add_tail_eurecom (Job_elt_t* , Job_List_t* );
-void job_list_add_list (Job_List_t* , Job_List_t* );
-void job_list_display (Job_List_t* );
-
-void event_list_init (Event_List_t*);
-void event_list_free (Event_List_t* listP);
-Event_elt_t* event_list_get_head (Event_List_t*);
-Event_elt_t* event_list_remove_head (Event_List_t* );
-Event_elt_t* event_list_remove_element (Event_elt_t*, Event_List_t*);
-void event_list_add_head (Event_elt_t* , Event_List_t* );
-void event_list_add_element (Event_elt_t* , Event_elt_t* , Event_List_t* );
-void event_list_add_tail_eurecom (Event_elt_t* , Event_List_t* );
-void event_list_add_list (Event_List_t* , Event_List_t* );
-void event_list_display (Event_List_t* );
-
-void pkt_list_init (Packet_OTG_List_t*);
-void pkt_list_free (Packet_OTG_List_t* listP);
-Packet_otg_elt_t* pkt_list_get_head (Packet_OTG_List_t*);
-Packet_otg_elt_t* pkt_list_remove_head (Packet_OTG_List_t* );
-Packet_otg_elt_t* pkt_list_remove_element (Packet_otg_elt_t*, Packet_OTG_List_t*);
-void pkt_list_add_head (Packet_otg_elt_t* , Packet_OTG_List_t* );
-void pkt_list_add_element (Packet_otg_elt_t* , Packet_otg_elt_t* , Packet_OTG_List_t* );
-void pkt_list_add_tail_eurecom (Packet_otg_elt_t* , Packet_OTG_List_t* );
-void pkt_list_add_list (Packet_OTG_List_t* , Packet_OTG_List_t* );
-void pkt_list_display (Packet_OTG_List_t* );
-
-#endif
diff --git a/openair2/UTIL/FIFO/types.h b/openair2/UTIL/FIFO/types.h
deleted file mode 100644
index f949b2b72b..0000000000
--- a/openair2/UTIL/FIFO/types.h
+++ /dev/null
@@ -1,127 +0,0 @@
-/*
- * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The OpenAirInterface Software Alliance licenses this file to You under
- * the OAI Public License, Version 1.1 (the "License"); you may not use this file
- * except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.openairinterface.org/?page_id=698
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *-------------------------------------------------------------------------------
- * For more information about the OpenAirInterface (OAI) Software Alliance:
- * contact@openairinterface.org
- */
-
-/*! \file pad_list.c
-* \brief list management primimtives
-* \author Mohamed Said MOSLI BOUKSIAA, Lionel GAUTHIER, Navid Nikaein
-* \date 2012 - 2014
-* \version 0.5
-* @ingroup util
-*/
-
-#ifndef __FIFO_TYPES_H__
-#define __FIFO_TYPES_H__
-#include "platform_types.h"
-
-/* Types regrouping both user-defined and regular events */
-typedef enum {
- MIN_ET=0,
- OAI_ET=MIN_ET, // config events
- SYS_ET,
- TOPO_ET,
- APP_ET,
- EMU_ET,
- DL_ET, // frame events
- UL_ET,
- S_ET,
- PHY_ET, // protocol events
- MAC_ET,
- RLC_ET,
- PDCP_ET,
- RRC_ET,
- MAX_ET
-} Event_Type_t;
-
-/* decomposition of node functions into jobs for a given event */
-typedef enum Job_type_e { JT_OTG, JT_PDCP, JT_PHY_MAC, JT_INIT_SYNC, JT_DL, JT_UL, RN_DL, RN_UL, JT_END} Job_Type_t;
-
-typedef enum Operation_Type_e { READ, WRITE, RESET} Operation_Type_t;
-
-typedef struct Job_s {
- enum Job_type_e type;
- int exe_time; /* execution time at the worker*/
- int nid; /* node id*/
- eNB_flag_t eNB_flag;
- frame_t frame;
- int last_slot;
- int next_slot;
- int ctime;
-} Job_t;
-
-typedef struct Signal_buffers_s { // (s = transmit, r,r0 = receive)
- double **s_re;
- double **s_im;
- double **r_re;
- double **r_im;
- double **r_re0;
- double **r_im0;
-} Signal_buffers_t;
-
-/*!\brief sybframe type : DL, UL, SF, */
-
-typedef struct Packet_otg_s {
- unsigned int sdu_buffer_size;
- unsigned char *sdu_buffer;
- module_id_t module_id;
- rb_id_t rb_id;
- module_id_t dst_id;
- boolean_t is_ue;
- pdcp_transmission_mode_t mode;
-} Packet_otg_t;
-
-typedef struct {
- Event_Type_t type;
- enum Operation_Type_e optype; //op
- char *key;
- void *value;
- frame_t frame;
- int ue;
- int lcid;
-} Event_t;
-
-/*typedef struct Global_Time {
- uint32_t frame;
- int32_t slot;
- int32_t last_slot;
- int32_t next_slot;
- double time_s;
- double time_ms;
-};*/
-
-
-
-typedef struct Packet_otg_elt_s {
- struct Packet_otg_elt_s *next;
- struct Packet_otg_elt_s *previous;
- Packet_otg_t otg_pkt;
-} Packet_otg_elt_t;
-
-typedef struct Job_element_s {
- struct Job_element_s *next;
- Job_t job;
-} Job_elt_t;
-
-typedef struct Event_element_s {
- struct Event_element_s *next;
- struct Event_element_s *previous;
- Event_t event;
-} Event_elt_t;
-#endif
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
deleted file mode 100644
index f7c27272aa..0000000000
--- a/openair3/TEST/EPC_TEST/TEST_1MME_1ENB_1UE_ATTACH_GUTI/attach_complete.pdml
+++ /dev/null
@@ -1,4242 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
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
deleted file mode 100644
index ad6c81f56b..0000000000
--- a/openair3/TEST/EPC_TEST/TEST_1MME_1ENB_1UE_ATTACH_GUTI/enb.band7.tm1.usrpb210.epc.local.conf
+++ /dev/null
@@ -1,162 +0,0 @@
-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;
- plmn_list = ( { mcc = 208; mnc = 95; mnc_length = 2; } );
-
- ////////// 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 = 0;
- 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";
- hw_log_level ="info";
- phy_log_level ="info";
- mac_log_level ="info";
- rlc_log_level ="info";
- pdcp_log_level ="info";
- rrc_log_level ="info";
- gtpu_log_level ="info";
- udp_log_level ="info";
- };
-
- }
-);
diff --git a/openair3/TEST/EPC_TEST/TEST_1MME_1ENB_1UE_ATTACH_GUTI/enb1.conf b/openair3/TEST/EPC_TEST/TEST_1MME_1ENB_1UE_ATTACH_GUTI/enb1.conf
deleted file mode 100644
index 9ffed9c5fe..0000000000
--- a/openair3/TEST/EPC_TEST/TEST_1MME_1ENB_1UE_ATTACH_GUTI/enb1.conf
+++ /dev/null
@@ -1,159 +0,0 @@
-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;
- plmn_list = ( { mcc = 208; mnc = 95; mnc_length = 2; } );
-
- ////////// 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 = 0;
- 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.168.12.17";
- ipv6 = "192:168:30::17";
- active = "yes";
- preference = "ipv4";
- }
- );
-
- NETWORK_INTERFACES :
- {
- ENB_INTERFACE_NAME_FOR_S1_MME = "eth0";
- ENB_IPV4_ADDRESS_FOR_S1_MME = "192.168.12.213/24";
-
- ENB_INTERFACE_NAME_FOR_S1U = "eth0";
- ENB_IPV4_ADDRESS_FOR_S1U = "192.168.12.213/24";
- ENB_PORT_FOR_S1U = 2152; # Spec 2152
- };
-
- log_config :
- {
- global_log_level ="debug";
- hw_log_level ="info";
- phy_log_level ="info";
- rlc_log_level ="info";
- pdcp_log_level ="info";
- rrc_log_level ="info";
- };
-
- }
-);
diff --git a/openair3/TEST/EPC_TEST/TEST_1MME_1ENB_1UE_ATTACH_GUTI/trace.pdml b/openair3/TEST/EPC_TEST/TEST_1MME_1ENB_1UE_ATTACH_GUTI/trace.pdml
deleted file mode 100644
index d2d2598de6..0000000000
--- a/openair3/TEST/EPC_TEST/TEST_1MME_1ENB_1UE_ATTACH_GUTI/trace.pdml
+++ /dev/null
@@ -1,4411 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/openair3/TEST/EPC_TEST/generate_scenario.c b/openair3/TEST/EPC_TEST/generate_scenario.c
deleted file mode 100644
index a8a3590945..0000000000
--- a/openair3/TEST/EPC_TEST/generate_scenario.c
+++ /dev/null
@@ -1,684 +0,0 @@
-/*
- * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The OpenAirInterface Software Alliance licenses this file to You under
- * the OAI Public License, Version 1.1 (the "License"); you may not use this file
- * except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.openairinterface.org/?page_id=698
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *-------------------------------------------------------------------------------
- * For more information about the OpenAirInterface (OAI) Software Alliance:
- * contact@openairinterface.org
- */
-
-/*
- generate_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
-#include
-#include
-#include
-#include
-#include
-
-#include "assertions.h"
-#include "generate_scenario.h"
-#include "s1ap_eNB.h"
-#include "intertask_interface.h"
-
-#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"
-
-
-#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;
-
- printf( "\n----------------------------------------------------------------------\n");
- printf( " ENB CONFIG FILE CONTENT LOADED:\n");
- printf( "----------------------------------------------------------------------\n");
- for (i = 0; i < g_enb_properties.number; i++) {
- printf( "ENB CONFIG for instance %d:\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);
-
- if (g_enb_properties.properties[i]->mnc_digit_length == 3) {
- 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( "\n--------------------------------------------------------\n");
- }
-}
-
-
-#ifdef LIBCONFIG_LONG
-#define libconfig_int long
-#else
-#define libconfig_int int
-#endif
-//------------------------------------------------------------------------------
-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_mme_addresses = NULL;
- config_setting_t *setting_mme_address = NULL;
- config_setting_t *setting_enb = NULL;
- 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[EPC_TEST_SCENARIO_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 , EPC_TEST_SCENARIO_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, %dth 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 = 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, %d 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, %d th enb %d 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;
- }
- }
-
-
- // 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" : "");
-}
-
-
-//------------------------------------------------------------------------------
-static void 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, "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 (
- int argc,
- char *argv[])
-//------------------------------------------------------------------------------
-{
- int option;
- 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_HELP,
- LONG_OPTION_VERSION,
- };
-
- static struct option long_options[] = {
- {"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, "vhp:n:c:s:d:", long_options, NULL)) != -1) {
- switch (option) {
- case LONG_OPTION_ENB_CONF_FILE:
- case 'c':
- if (optarg) {
- enb_config_file_name = optarg;
- printf("eNB config file name is %s\n", enb_config_file_name);
- rv |= GENERATE_SCENARIO;
- }
- break;
-
- case LONG_OPTION_PDML:
- case 'p':
- if (optarg) {
- 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':
- default:
- usage (argc, argv);
- exit (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));
-
- 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
deleted file mode 100644
index 8deded3f52..0000000000
--- a/openair3/TEST/EPC_TEST/generate_scenario.h
+++ /dev/null
@@ -1,119 +0,0 @@
-/*
- * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The OpenAirInterface Software Alliance licenses this file to You under
- * the OAI Public License, Version 1.1 (the "License"); you may not use this file
- * except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.openairinterface.org/?page_id=698
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *-------------------------------------------------------------------------------
- * For more information about the OpenAirInterface (OAI) Software Alliance:
- * contact@openairinterface.org
- */
-
-/*
- 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 "s1ap_messages_types.h"
-#include "SystemInformationBlockType2.h"
-
-#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/play_scenario.c b/openair3/TEST/EPC_TEST/play_scenario.c
deleted file mode 100644
index ebaffdb39e..0000000000
--- a/openair3/TEST/EPC_TEST/play_scenario.c
+++ /dev/null
@@ -1,1240 +0,0 @@
-/*
- * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The OpenAirInterface Software Alliance licenses this file to You under
- * the OAI Public License, Version 1.1 (the "License"); you may not use this file
- * except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.openairinterface.org/?page_id=698
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *-------------------------------------------------------------------------------
- * For more information about the OpenAirInterface (OAI) Software Alliance:
- * contact@openairinterface.org
- */
-
-/*
- 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 "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,%u)\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, %dth 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, %d 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, %d th enb %d 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_DESTINATION_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", (int) 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, tasks_info);
-
- 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
deleted file mode 100644
index 6a2264f8ba..0000000000
--- a/openair3/TEST/EPC_TEST/play_scenario.h
+++ /dev/null
@@ -1,499 +0,0 @@
-/*
- * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The OpenAirInterface Software Alliance licenses this file to You under
- * the OAI Public License, Version 1.1 (the "License"); you may not use this file
- * except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.openairinterface.org/?page_id=698
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *-------------------------------------------------------------------------------
- * For more information about the OpenAirInterface (OAI) Software Alliance:
- * contact@openairinterface.org
- */
-
-/*
- 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_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;
- 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);}};
-
-//-------------------------
-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
deleted file mode 100644
index f6b983bf73..0000000000
--- a/openair3/TEST/EPC_TEST/play_scenario_decode.c
+++ /dev/null
@@ -1,68 +0,0 @@
-/*
- * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The OpenAirInterface Software Alliance licenses this file to You under
- * the OAI Public License, Version 1.1 (the "License"); you may not use this file
- * except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.openairinterface.org/?page_id=698
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *-------------------------------------------------------------------------------
- * For more information about the OpenAirInterface (OAI) Software Alliance:
- * contact@openairinterface.org
- */
-
-/*
- play_scenario_decode.c
- -------------------
- AUTHOR : Lionel GAUTHIER
- COMPANY : EURECOM
- EMAIL : Lionel.Gauthier@eurecom.fr
- */
-
-#include "intertask_interface.h"
-#include "platform_types.h"
-#include "s1ap_eNB_decoder.h"
-#include "assertions.h"
-#include "play_scenario.h"
-
-//------------------------------------------------------------------------------
-int et_s1ap_decode_pdu(S1AP_PDU_t *const pdu, const uint8_t *const buffer, const uint32_t length)
-{
- asn_dec_rval_t dec_ret;
-
- DevAssert(buffer != NULL);
-
- memset((void *)pdu, 0, sizeof(S1AP_S1AP_PDU_t));
- dec_ret = aper_decode(NULL,
- &asn_DEF_S1AP_S1AP_PDU,
- (void **)&pdu,
- buffer,
- length,
- 0,
- 0);
-
- if (dec_ret.code != RC_OK) {
- S1AP_ERROR("Failed to decode pdu\n");
- return -1;
- }
-
- return dec_ret.code;
-}
-
-//------------------------------------------------------------------------------
-void et_decode_s1ap(et_s1ap_t *const s1ap)
-{
- if (NULL != s1ap) {
- if (et_s1ap_decode_pdu(&s1ap->pdu, 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
deleted file mode 100644
index b29c0758c4..0000000000
--- a/openair3/TEST/EPC_TEST/play_scenario_display.c
+++ /dev/null
@@ -1,348 +0,0 @@
-/*
- * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The OpenAirInterface Software Alliance licenses this file to You under
- * the OAI Public License, Version 1.1 (the "License"); you may not use this file
- * except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.openairinterface.org/?page_id=698
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *-------------------------------------------------------------------------------
- * For more information about the OpenAirInterface (OAI) Software Alliance:
- * contact@openairinterface.org
- */
-
-/*
- 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_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, " %04lu |", 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");
-
- switch(s1ap->pdu.present) {
- case S1AP_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_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_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
deleted file mode 100644
index 0459f4d5dd..0000000000
--- a/openair3/TEST/EPC_TEST/play_scenario_fsm.c
+++ /dev/null
@@ -1,586 +0,0 @@
-/*
- * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The OpenAirInterface Software Alliance licenses this file to You under
- * the OAI Public License, Version 1.1 (the "License"); you may not use this file
- * except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.openairinterface.org/?page_id=698
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *-------------------------------------------------------------------------------
- * For more information about the OpenAirInterface (OAI) Software Alliance:
- * contact@openairinterface.org
- */
-
-/*
- 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 "play_scenario_s1ap_eNB_defs.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
deleted file mode 100644
index 607ec34dfc..0000000000
--- a/openair3/TEST/EPC_TEST/play_scenario_parse.c
+++ /dev/null
@@ -1,592 +0,0 @@
-/*
- * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The OpenAirInterface Software Alliance licenses this file to You under
- * the OAI Public License, Version 1.1 (the "License"); you may not use this file
- * except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.openairinterface.org/?page_id=698
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *-------------------------------------------------------------------------------
- * For more information about the OpenAirInterface (OAI) Software Alliance:
- * contact@openairinterface.org
- */
-
-/*
- 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 %u 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 %u 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
deleted file mode 100644
index fe132fd2f5..0000000000
--- a/openair3/TEST/EPC_TEST/play_scenario_s1ap.c
+++ /dev/null
@@ -1,1168 +0,0 @@
-/*
- * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The OpenAirInterface Software Alliance licenses this file to You under
- * the OAI Public License, Version 1.1 (the "License"); you may not use this file
- * except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.openairinterface.org/?page_id=698
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *-------------------------------------------------------------------------------
- * For more information about the OpenAirInterface (OAI) Software Alliance:
- * contact@openairinterface.org
- */
-
-/*
- 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 "platform_types.h"
-#include "assertions.h"
-#include "conversions.h"
-#include "s1ap_common.h"
-#include "play_scenario_s1ap_eNB_defs.h"
-#include "play_scenario.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_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_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_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_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_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_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 %u 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 < 9)) {
- 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 sgw 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 %u", 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);
-
- while (1) {
- itti_receive_msg(TASK_S1AP, &received_msg);
-
- switch (ITTI_MSG_ID(received_msg)) {
- case TERMINATE_MESSAGE:
- S1AP_WARN("*** Exiting S1AP thread\n");
- 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_MSG_DESTINATION_INSTANCE(received_msg),
- &S1AP_REGISTER_ENB_REQ(received_msg));
- }
- break;
-
- case SCTP_NEW_ASSOCIATION_RESP: {
- et_s1ap_eNB_handle_sctp_association_resp(ITTI_MSG_DESTINATION_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
deleted file mode 100644
index 40654fc771..0000000000
--- a/openair3/TEST/EPC_TEST/play_scenario_s1ap_compare_ie.c
+++ /dev/null
@@ -1,231 +0,0 @@
-/*
- * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The OpenAirInterface Software Alliance licenses this file to You under
- * the OAI Public License, Version 1.1 (the "License"); you may not use this file
- * except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.openairinterface.org/?page_id=698
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *-------------------------------------------------------------------------------
- * For more information about the OpenAirInterface (OAI) Software Alliance:
- * contact@openairinterface.org
- */
-
-/*
- 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 "platform_types.h"
-#include "assertions.h"
-#include "conversions.h"
-#include "s1ap_common.h"
-#include "play_scenario_s1ap_eNB_defs.h"
-#include "play_scenario.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)
-//{
-//}
-
-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 %lu 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
deleted file mode 100644
index 532e14bb1d..0000000000
--- a/openair3/TEST/EPC_TEST/play_scenario_s1ap_eNB_defs.h
+++ /dev/null
@@ -1,242 +0,0 @@
-/*
- * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The OpenAirInterface Software Alliance licenses this file to You under
- * the OAI Public License, Version 1.1 (the "License"); you may not use this file
- * except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.openairinterface.org/?page_id=698
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *-------------------------------------------------------------------------------
- * For more information about the OpenAirInterface (OAI) Software Alliance:
- * contact@openairinterface.org
- */
-
-#include
-
-#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
deleted file mode 100644
index c126608598..0000000000
--- a/openair3/TEST/EPC_TEST/play_scenario_sctp.c
+++ /dev/null
@@ -1,112 +0,0 @@
-/*
- * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The OpenAirInterface Software Alliance licenses this file to You under
- * the OAI Public License, Version 1.1 (the "License"); you may not use this file
- * except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.openairinterface.org/?page_id=698
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *-------------------------------------------------------------------------------
- * For more information about the OpenAirInterface (OAI) Software Alliance:
- * contact@openairinterface.org
- */
-
-/*
- 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/TEST/oaisim_mme_client_test.c b/openair3/TEST/oaisim_mme_client_test.c
deleted file mode 100644
index 8fcda8a5ad..0000000000
--- a/openair3/TEST/oaisim_mme_client_test.c
+++ /dev/null
@@ -1,122 +0,0 @@
-/*
- * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The OpenAirInterface Software Alliance licenses this file to You under
- * the OAI Public License, Version 1.1 (the "License"); you may not use this file
- * except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.openairinterface.org/?page_id=698
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *-------------------------------------------------------------------------------
- * For more information about the OpenAirInterface (OAI) Software Alliance:
- * contact@openairinterface.org
- */
-
-#include
-#include
-#include
-#include
-
-#include
-#include
-#include
-#include
-#include
-
-#include "sctp_primitives_client.h"
-
-#include "s1ap_common.h"
-#include "s1ap_eNB.h"
-#include "s1ap_mme.h"
-
-char ip_addr[] = "127.0.0.1";
-
-int assoc[2];
-uint8_t id[] = { 0x03, 0x56, 0xf0, 0xd8 };
-char identity[] = { 0x02, 0x08, 0x34 };
-char tac[] = { 0x00, 0x01 };
-char infoNAS[] = { 0x07, 0x42, 0x01, 0xE0, 0x06, 0x00, 0x00, 0xF1, 0x10, 0x00, 0x01, 0x00, 0x2C,
- 0x52, 0x01, 0xC1, 0x01, 0x09, 0x10, 0x03, 0x77, 0x77, 0x77, 0x07, 0x61, 0x6E, 0x72, 0x69, 0x74,
- 0x73, 0x75, 0x03, 0x63, 0x6F, 0x6D, 0x05, 0x01, 0x0A, 0x01, 0x20, 0x37, 0x27, 0x0E, 0x80, 0x80,
- 0x21, 0x0A, 0x03, 0x00, 0x00, 0x0A, 0x81, 0x06, 0x0A, 0x00, 0x00, 0x01, 0x50, 0x0B, 0xF6,
- 0x00, 0xF1, 0x10, 0x80, 0x01, 0x01, 0x00, 0x00, 0x00, 0x01
- };
-
-uint32_t eNB_UE_S1AP_ID = 0;
-
-int s1ap_eNB_generate_initial_ue_message(uint8_t **buffer,
- uint32_t *length);
-
-int s1ap_eNB_generate_initial_ue_message(uint8_t **buffer,
- uint32_t *length)
-{
- InitialUEMessageIEs initialUEmessageIEs;
- InitialUEMessageIEs *initialUEmessageIEs_p = &initialUEmessageIEs;
- memset(initialUEmessageIEs_p, 0, sizeof(InitialUEMessageIEs));
- initialUEmessageIEs.eNB_UE_S1AP_ID = eNB_UE_S1AP_ID;
- initialUEmessageIEs.nas_pdu.buf = infoNAS;
- initialUEmessageIEs.nas_pdu.size = sizeof(infoNAS);
- initialUEmessageIEs.tai.tAC.buf = tac;
- initialUEmessageIEs.tai.tAC.size = 2;
- initialUEmessageIEs.tai.pLMNidentity.buf = identity;
- initialUEmessageIEs.tai.pLMNidentity.size = 3;
- initialUEmessageIEs.eutran_cgi.pLMNidentity.buf = identity;
- initialUEmessageIEs.eutran_cgi.pLMNidentity.size = 3;
- initialUEmessageIEs.eutran_cgi.cell_ID.buf = id;
- initialUEmessageIEs.eutran_cgi.cell_ID.size = 4;
- initialUEmessageIEs.eutran_cgi.cell_ID.bits_unused = 4;
- initialUEmessageIEs.rrC_Establishment_Cause = RRC_Establishment_Cause_mo_Data;
- return s1ap_eNB_encode_initial_ue_message(initialUEmessageIEs_p, buffer, length);
-}
-
-void recv_callback(uint8_t *buffer, uint32_t length)
-{
- uint8_t *bufferS;
- uint32_t len;
- s1ap_eNB_generate_initial_ue_message(&bufferS, &len);
- sctp_send_msg(assoc[0], 1, bufferS, len);
-}
-
-int main(int argc, char *argv[])
-{
- asn_enc_rval_t retVal;
- uint8_t *buffer;
- uint32_t len;
- SupportedTAs_Item_t ta;
- PLMNidentity_t plmnIdentity;
- asn_debug = 0;
- asn1_xer_print = 0;
- S1SetupRequestIEs s1SetupRequest;
- memset(&s1SetupRequest, 0, sizeof(S1SetupRequestIEs));
- s1SetupRequest.global_ENB_ID.eNB_ID.present = ENB_ID_PR_macroENB_ID;
- s1SetupRequest.global_ENB_ID.eNB_ID.choice.macroENB_ID.buf = id;
- s1SetupRequest.global_ENB_ID.eNB_ID.choice.macroENB_ID.size = 3;
- s1SetupRequest.global_ENB_ID.eNB_ID.choice.macroENB_ID.bits_unused = 4;
- OCTET_STRING_fromBuf(&s1SetupRequest.global_ENB_ID.pLMNidentity, identity, 3);
- s1SetupRequest.presenceMask |= S1SETUPREQUESTIES_ENBNAME_PRESENT;
- OCTET_STRING_fromBuf(&s1SetupRequest.eNBname, "ENB 1 eurecom",
- strlen("ENB 1 eurecom"));
- memset(&ta, 0, sizeof(SupportedTAs_Item_t));
- memset(&plmnIdentity, 0, sizeof(PLMNidentity_t));
- OCTET_STRING_fromBuf(&ta.tAC, tac, 2);
- OCTET_STRING_fromBuf(&plmnIdentity, identity, 3);
- ASN_SEQUENCE_ADD(&ta.broadcastPLMNs, &plmnIdentity);
- ASN_SEQUENCE_ADD(&s1SetupRequest.supportedTAs, &ta);
- s1SetupRequest.defaultPagingDRX = PagingDRX_v64;
- s1ap_eNB_encode_s1setuprequest(&s1SetupRequest, &buffer, &len);
- assoc[0] = sctp_connect_to_remote_host(ip_addr, 36412, &recv_callback);
- sctp_send_msg(0, 0, buffer, len);
- free(buffer);
- // generateUplinkNASTransport(&buffer, &len);
- // sctp_send_msg(assoc[0], 0, buffer, len);
- // s1ap_mme_decode_pdu(buffer, len);
- pthread_join(sctp_get_receiver_thread(assoc[0]), NULL);
- return(0);
-}
diff --git a/openair3/TEST/oaisim_mme_itti_test.c b/openair3/TEST/oaisim_mme_itti_test.c
deleted file mode 100644
index ecfbdb0acb..0000000000
--- a/openair3/TEST/oaisim_mme_itti_test.c
+++ /dev/null
@@ -1,93 +0,0 @@
-/*
- * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The OpenAirInterface Software Alliance licenses this file to You under
- * the OAI Public License, Version 1.1 (the "License"); you may not use this file
- * except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.openairinterface.org/?page_id=698
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *-------------------------------------------------------------------------------
- * For more information about the OpenAirInterface (OAI) Software Alliance:
- * contact@openairinterface.org
- */
-
-#include
-#include
-#include
-#include
-
-#include
-#include
-
-#include
-
-#include "mme_config.h"
-#include "gtpv1u_sgw_defs.h"
-
-#include "intertask_interface.h"
-
-#include "sctp_primitives_server.h"
-#include "udp_primitives_server.h"
-#include "s1ap_mme.h"
-#include "log.h"
-#include "sgw_lite_defs.h"
-#include "ipv4_defs.h"
-
-int main(int argc, char *argv[])
-{
- int i = 0;
- int prio = 0;
- mme_config_t mme_config;
- MessageDef *message_p;
- struct sched_param param = {
- .sched_priority = 10,
- };
-
- config_parse_opt_line(argc, argv, &mme_config);
- fprintf(stdout, "Starting %s ITTI test\n", PACKAGE_STRING);
-
- if (setpriority(PRIO_PROCESS, 0, prio) < 0) {
- fprintf(stderr, "Cannot assign requested prio: %d\n"
- "%d:%s\n", prio, errno, strerror(errno));
- return -1;
- }
-
- if (sched_setscheduler(0, SCHED_RR, ¶m) < 0) {
- fprintf(stderr, "Cannot assign requested scheduler policy\n"
- "%d:%s\n", errno, strerror(errno));
- return -1;
- }
-
- /* Calling each layer init function */
- log_init(&mme_config);
- itti_init(TASK_MAX, tasks_info);
- sctp_init(&mme_config);
- udp_init(&mme_config);
- s1ap_mme_init(&mme_config);
- gtpv1u_init(&mme_config);
- ipv4_init(&mme_config);
-
- sgw_lite_init(&mme_config);
-
- message_p = itti_alloc_new_message(TASK_S1AP, MESSAGE_TEST);
-
- while(i < (1 << 15)) {
- if (send_broadcast_message(message_p) < 0) {
- fprintf(stderr, "Failed to send broadcast message %d\n", i);
- }
-
- i++;
- }
-
- fprintf(stderr, "Successfully sent %lu messages", get_current_message_number());
-
- return 0;
-}
diff --git a/openair3/TEST/oaisim_mme_list_benchmark.c b/openair3/TEST/oaisim_mme_list_benchmark.c
deleted file mode 100644
index 633e83aace..0000000000
--- a/openair3/TEST/oaisim_mme_list_benchmark.c
+++ /dev/null
@@ -1,261 +0,0 @@
-/*
- * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The OpenAirInterface Software Alliance licenses this file to You under
- * the OAI Public License, Version 1.1 (the "License"); you may not use this file
- * except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.openairinterface.org/?page_id=698
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *-------------------------------------------------------------------------------
- * For more information about the OpenAirInterface (OAI) Software Alliance:
- * contact@openairinterface.org
- */
-
-#include
-#include
-#include
-#include
-
-#include
-#include
-#include
-#include
-#include
-
-#include "sctp_primitives_client.h"
-
-#include "s1ap_common.h"
-#include "s1ap_eNB.h"
-#include "s1ap_mme.h"
-
-#include "s1ap_eNB_encoder.h"
-#include "s1ap_eNB_decoder.h"
-
-#define NB_OF_ENB 10
-#define NB_OF_UES 100
-
-static int connected_eNB = 0;
-static char ip_addr[] = "127.0.0.1";
-uint32_t ipv4_local = 0x7F000001;
-static uint8_t id[] = { 0x03, 0x56, 0xf0, 0xd8 };
-static char identity[] = { 0x02, 0x08, 0x34 };
-static char tac[] = { 0x00, 0x01 };
-static char infoNAS[] = { 0x07, 0x42, 0x01, 0xE0, 0x06, 0x00, 0x00, 0xF1, 0x10, 0x00, 0x01, 0x00, 0x2C,
- 0x52, 0x01, 0xC1, 0x01, 0x09, 0x10, 0x03, 0x77, 0x77, 0x77, 0x07, 0x61, 0x6E, 0x72, 0x69, 0x74,
- 0x73, 0x75, 0x03, 0x63, 0x6F, 0x6D, 0x05, 0x01, 0x0A, 0x01, 0x20, 0x37, 0x27, 0x0E, 0x80, 0x80,
- 0x21, 0x0A, 0x03, 0x00, 0x00, 0x0A, 0x81, 0x06, 0x0A, 0x00, 0x00, 0x01, 0x50, 0x0B, 0xF6,
- 0x00, 0xF1, 0x10, 0x80, 0x01, 0x01, 0x00, 0x00, 0x00, 0x01
- };
-uint32_t nb_eNB = NB_OF_ENB;
-uint32_t nb_ue = NB_OF_UES;
-
-void s1ap_test_generate_s1_setup_request(uint32_t eNB_id, uint8_t **buffer,
- uint32_t *length);
-int s1ap_test_generate_initial_ue_message(uint32_t eNB_UE_S1AP_ID,
- uint8_t **buffer,
- uint32_t *length);
-int recv_callback(uint32_t assocId,
- uint32_t stream,
- uint8_t *buffer,
- uint32_t length);
-int sctp_connected(void *args,
- uint32_t assocId,
- uint32_t instreams,
- uint32_t outstreams);
-
-void s1ap_test_generate_s1_setup_request(uint32_t eNB_id, uint8_t **buffer,
- uint32_t *length)
-{
- S1SetupRequestIEs_t s1SetupRequest;
- SupportedTAs_Item_t ta;
- PLMNidentity_t plmnIdentity;
- uint8_t *id_p = (uint8_t *)(&eNB_id + 1);
- memset(&s1SetupRequest, 0, sizeof(S1SetupRequestIEs_t));
- s1SetupRequest.global_ENB_ID.eNB_ID.present = ENB_ID_PR_macroENB_ID;
- s1SetupRequest.global_ENB_ID.eNB_ID.choice.macroENB_ID.buf = id_p;
- s1SetupRequest.global_ENB_ID.eNB_ID.choice.macroENB_ID.size = 3;
- s1SetupRequest.global_ENB_ID.eNB_ID.choice.macroENB_ID.bits_unused = 4;
- OCTET_STRING_fromBuf(&s1SetupRequest.global_ENB_ID.pLMNidentity, identity, 3);
- s1SetupRequest.presenceMask |= S1SETUPREQUESTIES_ENBNAME_PRESENT;
- OCTET_STRING_fromBuf(&s1SetupRequest.eNBname, "ENB 1 eurecom",
- strlen("ENB 1 eurecom"));
- memset(&ta, 0, sizeof(SupportedTAs_Item_t));
- memset(&plmnIdentity, 0, sizeof(PLMNidentity_t));
- OCTET_STRING_fromBuf(&ta.tAC, tac, 2);
- OCTET_STRING_fromBuf(&plmnIdentity, identity, 3);
- ASN_SEQUENCE_ADD(&ta.broadcastPLMNs, &plmnIdentity);
- ASN_SEQUENCE_ADD(&s1SetupRequest.supportedTAs, &ta);
- s1SetupRequest.defaultPagingDRX = PagingDRX_v64;
- s1ap_eNB_encode_s1_setup_request(&s1SetupRequest, buffer, length);
-}
-
-int s1ap_test_generate_initial_ue_message(uint32_t eNB_UE_S1AP_ID,
- uint8_t **buffer,
- uint32_t *length)
-{
- InitialUEMessageIEs_t initialUEmessageIEs;
- InitialUEMessageIEs_t *initialUEmessageIEs_p = &initialUEmessageIEs;
- memset(initialUEmessageIEs_p, 0, sizeof(InitialUEMessageIEs_t));
- initialUEmessageIEs.eNB_UE_S1AP_ID = eNB_UE_S1AP_ID & 0x00ffffff;
- initialUEmessageIEs.nas_pdu.buf = (uint8_t *)infoNAS;
- initialUEmessageIEs.nas_pdu.size = sizeof(infoNAS);
- initialUEmessageIEs.tai.tAC.buf = (uint8_t *)tac;
- initialUEmessageIEs.tai.tAC.size = 2;
- initialUEmessageIEs.tai.pLMNidentity.buf = (uint8_t *)identity;
- initialUEmessageIEs.tai.pLMNidentity.size = 3;
- initialUEmessageIEs.eutran_cgi.pLMNidentity.buf = (uint8_t *)identity;
- initialUEmessageIEs.eutran_cgi.pLMNidentity.size = 3;
- initialUEmessageIEs.eutran_cgi.cell_ID.buf = (uint8_t *)id;
- initialUEmessageIEs.eutran_cgi.cell_ID.size = 4;
- initialUEmessageIEs.eutran_cgi.cell_ID.bits_unused = 4;
- initialUEmessageIEs.rrC_Establishment_Cause = RRC_Establishment_Cause_mo_Data;
- return s1ap_eNB_encode_initial_ue_message(initialUEmessageIEs_p, buffer, length);
-}
-
-int s1ap_test_generate_initial_setup_resp(uint32_t eNB_UE_S1AP_ID,
- uint32_t mme_UE_S1AP_ID,
- uint8_t eRAB_id,
- uint32_t teid,
- uint8_t **buffer,
- uint32_t *length)
-{
- InitialContextSetupResponseIEs_t initialResponseIEs;
- InitialContextSetupResponseIEs_t *initialResponseIEs_p = &initialResponseIEs;
- E_RABSetupItemCtxtSURes_t e_RABSetupItemCtxtSURes;
- memset(initialResponseIEs_p, 0, sizeof(InitialContextSetupResponseIEs_t));
- memset(&e_RABSetupItemCtxtSURes, 0, sizeof(E_RABSetupItemCtxtSURes_t));
- initialResponseIEs_p->mme_ue_s1ap_id = mme_UE_S1AP_ID;
- initialResponseIEs_p->eNB_UE_S1AP_ID = eNB_UE_S1AP_ID;
- e_RABSetupItemCtxtSURes.e_RAB_ID = eRAB_id;
- e_RABSetupItemCtxtSURes.transportLayerAddress.buf = (uint8_t *)&ipv4_local;
- e_RABSetupItemCtxtSURes.transportLayerAddress.size = 4;
- e_RABSetupItemCtxtSURes.gTP_TEID.buf = (uint8_t *)&teid;
- e_RABSetupItemCtxtSURes.gTP_TEID.size = 4;
- ASN_SEQUENCE_ADD(
- &initialResponseIEs_p->e_RABSetupListCtxtSURes.e_RABSetupItemCtxtSURes,
- &e_RABSetupItemCtxtSURes);
- return s1ap_eNB_encode_initial_context_setup_response(initialResponseIEs_p,
- buffer, length);
-}
-
-int recv_callback(uint32_t assocId,
- uint32_t stream,
- uint8_t *buffer,
- uint32_t length)
-{
- S1AP_S1AP_PDU_t pdu;
- uint8_t *buffer2;
- uint32_t len;
- int j;
-
- if (s1ap_eNB_decode_pdu(&pdu, buffer, length) < 0) {
- fprintf(stderr, "s1ap_eNB_decode_pdu returned status < 0\n");
- free(buffer);
- return -1;
- }
-
- if (pdu.initiatingMessage.procedureCode == S1AP_ProcedureCode_id_S1Setup
- && pdu.present == S1AP_S1AP_PDU_PR_successfulOutcome) {
- for (j = 0; j < nb_ue; j++) {
- s1ap_test_generate_initial_ue_message(j, &buffer2, &len);
-
- if (sctp_send_msg(assocId, j % 64 + 1, buffer2, len) < 0) {
- fprintf(stderr,
- "sctp_send_msg returned status < 0\nSomething bad happened on SCTP layer\n");
- free(buffer2);
- break;
- }
-
- free(buffer2);
- }
- } else if (pdu.initiatingMessage.procedureCode == S1AP_ProcedureCode_id_InitialContextSetup
- && pdu.present == S1AP_PDU_PR_initiatingMessage) {
- fprintf(stdout, "Received InitialContextSetup request\n");
- s1ap_test_generate_initial_setup_resp(
- message.msg.initialContextSetupRequestIEs.eNB_UE_S1AP_ID,
- message.msg.initialContextSetupRequestIEs.mme_ue_s1ap_id,
- 0x5,
- 0x1,
- &buffer2,
- &len);
-
- if (sctp_send_msg(assocId, stream, buffer2, len) < 0) {
- fprintf(stderr,
- "sctp_send_msg returned status < 0\nSomething bad happened on SCTP layer\n");
- free(buffer2);
- }
-
- free(buffer2);
- } else {
- fprintf(stderr, "Received unexpected message %d %d\n", message.procedureCode,
- message.direction);
- free(buffer);
- return -1;
- }
-
- free(buffer);
- return 0;
-}
-
-int sctp_connected(void *args,
- uint32_t assocId,
- uint32_t instreams,
- uint32_t outstreams)
-{
- uint8_t *buffer;
- uint32_t len;
- fprintf(stdout, "New association %d\n", assocId);
- s1ap_test_generate_s1_setup_request(assocId * nb_eNB, &buffer, &len);
-
- if (sctp_send_msg(assocId, 0, buffer, len) < 0) {
- free(buffer);
- fprintf(stderr,
- "sctp_send_msg returned status < 0. Something bad happened on SCTP layer\n");
- exit(0);
- }
-
- free(buffer);
- connected_eNB++;
- return 0;
-}
-
-int main(int argc, char *argv[])
-{
- asn_enc_rval_t retVal;
- int i;
- SupportedTAs_Item_t ta;
- PLMNidentity_t plmnIdentity;
- asn_debug = 0;
- asn1_xer_print = 0;
-
- if (argc > 1) {
- nb_eNB = atoi(argv[1]);
-
- if (argc > 2) {
- nb_ue = atoi(argv[2]);
- }
- }
-
- for (i = 0; i < nb_eNB; i++) {
- sctp_connect_to_remote_host(ip_addr, 36412, 18, NULL, sctp_connected,
- recv_callback);
- }
-
- while (1) {
- sleep(1);
- }
-
- // generateUplinkNASTransport(&buffer, &len);
- // sctp_send_msg(assoc[0], 0, buffer, len);
- // s1ap_mme_decode_pdu(buffer, len);
- sctp_terminate();
- return(0);
-}
diff --git a/openair3/TEST/oaisim_mme_s1ap_test.c b/openair3/TEST/oaisim_mme_s1ap_test.c
deleted file mode 100644
index aa8f92aee1..0000000000
--- a/openair3/TEST/oaisim_mme_s1ap_test.c
+++ /dev/null
@@ -1,179 +0,0 @@
-/*
- * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The OpenAirInterface Software Alliance licenses this file to You under
- * the OAI Public License, Version 1.1 (the "License"); you may not use this file
- * except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.openairinterface.org/?page_id=698
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *-------------------------------------------------------------------------------
- * For more information about the OpenAirInterface (OAI) Software Alliance:
- * contact@openairinterface.org
- */
-
-#include
-#include
-#include
-
-#include "s1ap_common.h"
-#include "s1ap_eNB_decoder.h"
-#include "s1ap_mme_decoder.h"
-#include "s1ap_eNB_encoder.h"
-
-#define MAX_BUF_LENGTH (1024)
-
-typedef struct {
- char *procedure_name;
- uint8_t buffer[MAX_BUF_LENGTH];
- uint32_t buf_len;
-} s1ap_test_t;
-
-s1ap_test_t s1ap_test[] = {
- // {
- // .procedure_name = "Downlink NAS transport",
- // .buffer = {
- // 0x00, 0x0B, 0x40, 0x21, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00,
- // 0x05, 0xC0, 0x01, 0x10, 0xCE, 0xCC, 0x00, 0x08, 0x00, 0x03,
- // 0x40, 0x01, 0xB3, 0x00, 0x1A, 0x00, 0x0A, 0x09, 0x27, 0xAB,
- // 0x1F, 0x7C, 0xEC, 0x01, 0x02, 0x01, 0xD9
- // },
- // .buf_len = 37,
- // },
- {
- .procedure_name = "Uplink NAS transport",
- .buffer = {
- 0x00, 0x0D, 0x40, 0x41, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00,
- 0x05, 0xC0, 0x01, 0x10, 0xCE, 0xCC, 0x00, 0x08, 0x00, 0x03,
- 0x40, 0x01, 0xB3, 0x00, 0x1A, 0x00, 0x14, 0x13, 0x27, 0xD3,
- 0x77, 0xED, 0x4C, 0x01, 0x02, 0x01, 0xDA, 0x28, 0x08, 0x03,
- 0x69, 0x6D, 0x73, 0x03, 0x70, 0x66, 0x74, 0x00, 0x64, 0x40,
- 0x08, 0x00, 0x02, 0xF8, 0x29, 0x00, 0x00, 0x20, 0x40, 0x00,
- 0x43, 0x40, 0x06, 0x00, 0x02, 0xF8, 0x29, 0x00, 0x04,
- },
- .buf_len = 69,
- },
- {
- .procedure_name = "UE capability info indication",
- .buffer = {
- 0x00, 0x16, 0x40, 0x37, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00,
- 0x05, 0xC0, 0x01, 0x10, 0xCE, 0xCC, 0x00, 0x08, 0x00, 0x03,
- 0x40, 0x01, 0xB3, 0x00, 0x4A, 0x40, 0x20, 0x1F, 0x00, 0xE8,
- 0x01, 0x01, 0xA8, 0x13, 0x80, 0x00, 0x20, 0x83, 0x13, 0x05,
- 0x0B, 0x8B, 0xFC, 0x2E, 0x2F, 0xF0, 0xB8, 0xBF, 0xAF, 0x87,
- 0xFE, 0x40, 0x44, 0x04, 0x07, 0x0C, 0xA7, 0x4A, 0x80,
- },
- .buf_len = 59,
- },
- {
- .procedure_name = "Initial Context Setup Request",
- .buffer = {
- 0x00, 0x09, 0x00, 0x80, 0xD4, 0x00, 0x00, 0x06, 0x00, 0x00,
- 0x00, 0x05, 0xC0, 0x01, 0x10, 0xCE, 0xCC, 0x00, 0x08, 0x00,
- 0x03, 0x40, 0x01, 0xB3, 0x00, 0x42, 0x00, 0x0A, 0x18, 0x08,
- 0xF0, 0xD1, 0x80, 0x60, 0x02, 0xFA, 0xF0, 0x80, 0x00, 0x18,
- 0x00, 0x80, 0x81, 0x00, 0x00, 0x34, 0x00, 0x7C, 0x45, 0x00,
- 0x09, 0x3D, 0x0F, 0x80, 0x0A, 0x05, 0x00, 0x02, 0x03, 0x78,
- 0x48, 0x86, 0x6D, 0x27, 0xC7, 0x97, 0x8E, 0xA1, 0x02, 0x07,
- 0x42, 0x01, 0x49, 0x06, 0x00, 0x02, 0xF8, 0x29, 0x00, 0x04,
- 0x00, 0x48, 0x52, 0x01, 0xC1, 0x01, 0x09, 0x1B, 0x03, 0x69,
- 0x6D, 0x73, 0x03, 0x70, 0x66, 0x74, 0x06, 0x6D, 0x6E, 0x63,
- 0x30, 0x39, 0x32, 0x06, 0x6D, 0x63, 0x63, 0x32, 0x30, 0x38,
- 0x04, 0x67, 0x70, 0x72, 0x73, 0x05, 0x01, 0x0A, 0x80, 0x00,
- 0x24, 0x5D, 0x01, 0x00, 0x30, 0x10, 0x23, 0x93, 0x1F, 0x93,
- 0x96, 0xFE, 0xFE, 0x74, 0x4B, 0xFF, 0xFF, 0x00, 0xC5, 0x00,
- 0x6C, 0x00, 0x32, 0x0B, 0x84, 0x34, 0x01, 0x08, 0x5E, 0x04,
- 0xFE, 0xFE, 0xC5, 0x6C, 0x50, 0x0B, 0xF6, 0x02, 0xF8, 0x29,
- 0x80, 0x00, 0x01, 0xF0, 0x00, 0x70, 0x8A, 0x53, 0x12, 0x64,
- 0x01, 0x01, 0x00, 0x6B, 0x00, 0x05, 0x18, 0x00, 0x0C, 0x00,
- 0x00, 0x00, 0x49, 0x00, 0x20, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- },
- .buf_len = 217,
- },
- {
- .procedure_name = "Initial context setup response",
- .buffer = {
- 0x20, 0x09, 0x00, 0x26, 0x00, 0x00, 0x03, 0x00, 0x00, 0x40,
- 0x05, 0xC0, 0x01, 0x10, 0xCE, 0xCC, 0x00, 0x08, 0x40, 0x03,
- 0x40, 0x01, 0xB3, 0x00, 0x33, 0x40, 0x0F, 0x00, 0x00, 0x32,
- 0x40, 0x0A, 0x0A, 0x1F, 0x0A, 0x05, 0x02, 0x05, 0x00, 0x0F,
- 0x7A, 0x03,
- },
- .buf_len = 42,
- }
-};
-
-static int compare_buffer(uint8_t *buffer, uint32_t length_buffer,
- uint8_t *pattern,
- uint32_t length_pattern)
-{
- int i;
-
- if (length_buffer != length_pattern) {
- printf("Length mismatch, expecting %d bytes, got %d bytes\n", length_pattern,
- length_buffer);
- return -1;
- }
-
- for (i = 0; i < length_buffer; i++) {
- if (pattern[i] != buffer[i]) {
- printf("Mismatch fount in bytes %d\nExpecting 0x%02x, got 0x%02x\n",
- i, pattern[i], buffer[i]);
- }
- }
-
- return 0;
-}
-
-int main(int argc, char *argv[])
-{
- int i;
- asn1_xer_print = 2;
-
- if (argc > 1) {
- asn_debug = 1;
- }
-
- for (i = 0; i < sizeof(s1ap_test) / sizeof(s1ap_test_t); i++) {
- S1AP_S1AP_PDU_t pdu;
- uint8_t *buffer;
- uint32_t length;
- memset(&pdu, 0, sizeof(pdu));
- printf("Trying to decode %s procedure with asn1c decoder\n",
- s1ap_test[i].procedure_name);
-
- if (s1ap_mme_decode_pdu(&pdu, s1ap_test[i].buffer,
- s1ap_test[i].buf_len) < 0) {
- if (s1ap_eNB_decode_pdu(&pdu, s1ap_test[i].buffer,
- s1ap_test[i].buf_len) < 0) {
- printf("Failed to decode this message\n");
- } else {
- printf("Succesfully decoded %s with eNB decoder\n", s1ap_test[i].procedure_name);
- }
- } else {
- printf("Succesfully decoded %s with MME decoder\n", s1ap_test[i].procedure_name);
- }
-
- printf("Trying to encode %s procedure with asn1c encoder\n",
- s1ap_test[i].procedure_name);
-
- if (s1ap_eNB_encode_pdu(&pdu, &buffer, &length) < 0) {
- printf("Failed to encode this message on MME side, trying eNB side\n");
- } else {
- compare_buffer(buffer, length, s1ap_test[i].buffer, s1ap_test[i].buf_len);
- free(buffer);
- }
- }
-
- return 0;
-}
diff --git a/openair3/TEST/oaisim_mme_sctp_test.c b/openair3/TEST/oaisim_mme_sctp_test.c
deleted file mode 100644
index b8be3e185c..0000000000
--- a/openair3/TEST/oaisim_mme_sctp_test.c
+++ /dev/null
@@ -1,74 +0,0 @@
-/*
- * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The OpenAirInterface Software Alliance licenses this file to You under
- * the OAI Public License, Version 1.1 (the "License"); you may not use this file
- * except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.openairinterface.org/?page_id=698
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *-------------------------------------------------------------------------------
- * For more information about the OpenAirInterface (OAI) Software Alliance:
- * contact@openairinterface.org
- */
-
-#include
-#include
-#include
-#include
-
-#include
-#include
-#include
-#include
-#include
-
-#include "sctp_primitives_client.h"
-
-#include "s1ap_common.h"
-#include "s1ap_eNB.h"
-#include "s1ap_mme.h"
-
-#include "s1ap_eNB_encoder.h"
-#include "s1ap_eNB_decoder.h"
-
-int recv_callback(uint32_t assocId,
- uint32_t stream,
- uint8_t *buffer,
- uint32_t length)
-{
- free(buffer);
- return 0;
-}
-
-int sctp_connected(void *args,
- uint32_t assocId,
- uint32_t instreams,
- uint32_t outstreams)
-{
- return 0;
-}
-
-int main(int argc, char *argv[])
-{
- asn_enc_rval_t retVal;
- int i;
-
- for (i = 0; i < nb_eNB; i++) {
- sctp_connect_to_remote_host(ip_addr, 36412, NULL, sctp_connected, recv_callback);
- }
-
- while (1) {
- sleep(1);
- }
-
- sctp_terminate();
- return(0);
-}
diff --git a/openair3/TEST/oaisim_mme_test_s1c.c b/openair3/TEST/oaisim_mme_test_s1c.c
deleted file mode 100644
index 94a554ab5f..0000000000
--- a/openair3/TEST/oaisim_mme_test_s1c.c
+++ /dev/null
@@ -1,339 +0,0 @@
-/*
- * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The OpenAirInterface Software Alliance licenses this file to You under
- * the OAI Public License, Version 1.1 (the "License"); you may not use this file
- * except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.openairinterface.org/?page_id=698
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *-------------------------------------------------------------------------------
- * For more information about the OpenAirInterface (OAI) Software Alliance:
- * contact@openairinterface.org
- */
-
-#define _GNU_SOURCE
-#include
-#include
-#include
-#include
-#include
-#include
-#include
-#include
-#include
-#include
-#include
-#include
-#include
-#include
-#include
-#include
-
-
-#include "UTIL/LOG/log_extern.h"
-#include "assertions.h"
-#include "intertask_interface.h"
-#include "sctp_eNB_task.h"
-#include "s1ap_eNB.h"
-#include "enb_config.h"
-
-#include "oaisim_mme_test_s1c.h"
-
-# define ENB_REGISTER_RETRY_DELAY 5
-//------------------------------------------------------------------------------
-static void get_options (int argc, char **argv);
-static uint32_t eNB_app_register(const uint32_t enb_id_start, const uint32_t enb_id_end, const Enb_properties_array_t *enb_properties);
-static void *eNB_app_task (void *args_p);
-void mme_test_s1_start_test(instance_t instance);
-//------------------------------------------------------------------------------
-static char *conf_config_file_name = NULL;
-const Enb_properties_array_t *enb_properties = NULL;
-int16_t glog_level = LOG_INFO;
-int16_t glog_verbosity = LOG_MED;
-s1c_test_t s1c_test = {
- 0, // scenario_index
- 0, // tx_next_message_index
- 0, // rx_next_message_index
- 0 // assoc_id
- };
-
-//------------------------------------------------------------------------------
-static void get_options (int argc, char **argv)
-//------------------------------------------------------------------------------
-{
- int c;
-
-
- while ((c = getopt_long (argc, argv, "K:g:G:O:",NULL,NULL)) != -1) {
- switch (c) {
- case 'O':
- conf_config_file_name = optarg;
- break;
-
- case 'g':
- glog_level=atoi(optarg); // value between 1 - 9
- break;
-
- case 'G':
- glog_verbosity=atoi(optarg);// value from 0, 0x5, 0x15, 0x35, 0x75
- break;
-
- default:
- break;
- }
- }
-
- AssertFatal(conf_config_file_name != NULL,"Please provide a configuration file\n");
-
-
-}
-
-
-//------------------------------------------------------------------------------
-static uint32_t eNB_app_register(const uint32_t enb_id_start, const uint32_t enb_id_end, const Enb_properties_array_t *enb_properties)
-//------------------------------------------------------------------------------
-{
- uint32_t enb_id;
- uint32_t mme_id;
- MessageDef *msg_p;
- uint32_t register_enb_pending = 0;
- char *str = NULL;
- struct in_addr addr;
-
- // 1 eNB should be max.
- // 1 eNB should be max.
- for (enb_id = enb_id_start; (enb_id < enb_id_end) ; enb_id++) {
- {
- s1ap_register_enb_req_t *s1ap_register_eNB;
-
- /* 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->default_drx = enb_properties->properties[enb_id]->pcch_defaultPagingCycle[0];
-
- 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->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);
-
- itti_send_msg_to_task (TASK_S1AP, ENB_MODULE_ID_TO_INSTANCE(enb_id), msg_p);
-
- register_enb_pending++;
- }
- }
-
- return register_enb_pending;
-}
-
-//------------------------------------------------------------------------------
-static void *eNB_app_task(void *args_p)
-//------------------------------------------------------------------------------
-{
- const Enb_properties_array_t *enb_properties_p = NULL;
- uint32_t enb_nb = 1; /* Default number of eNB is 1 */
- uint32_t enb_id_start = 0;
- uint32_t enb_id_end = enb_id_start + enb_nb;
- uint32_t register_enb_pending;
- uint32_t registered_enb;
- long enb_register_retry_timer_id;
- MessageDef *msg_p = NULL;
- const char *msg_name = NULL;
- instance_t instance;
- int result;
-
- itti_mark_task_ready (TASK_ENB_APP);
-
- enb_properties_p = enb_config_get();
-
- AssertFatal (enb_nb <= enb_properties_p->number,
- "Number of eNB is greater than eNB defined in configuration file (%d/%d)!",
- enb_nb, enb_properties_p->number);
-
-
- /* Try to register each eNB */
- registered_enb = 0;
- register_enb_pending = eNB_app_register (enb_id_start, enb_id_end, enb_properties_p);
-
- do {
- // Wait for a message
- itti_receive_msg (TASK_ENB_APP, &msg_p);
-
- msg_name = ITTI_MSG_NAME (msg_p);
- instance = ITTI_MSG_DESTINATION_INSTANCE (msg_p);
-
- switch (ITTI_MSG_ID(msg_p)) {
- case TERMINATE_MESSAGE:
- itti_exit_task ();
- break;
-
- case MESSAGE_TEST:
- LOG_I(ENB_APP, "Received %s\n", ITTI_MSG_NAME(msg_p));
- 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(register_enb_pending > 0);
- register_enb_pending--;
-
- /* Check if at least eNB is registered with one MME */
- if (S1AP_REGISTER_ENB_CNF(msg_p).nb_mme > 0) {
- registered_enb++;
- }
-
- /* Check if all register eNB requests have been processed */
- if (register_enb_pending == 0) {
- if (registered_enb == enb_nb) {
- mme_test_s1_start_test(instance);
-
-
- } else {
- uint32_t not_associated = enb_nb - 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", ENB_REGISTER_RETRY_DELAY);
-
- /* Restart the eNB registration process in ENB_REGISTER_RETRY_DELAY seconds */
- if (timer_setup (ENB_REGISTER_RETRY_DELAY, 0, TASK_ENB_APP, INSTANCE_DEFAULT, TIMER_ONE_SHOT,
- NULL, &enb_register_retry_timer_id) < 0) {
- LOG_E(ENB_APP, " Can not start eNB register retry timer, use \"sleep\" instead!\n");
-
- sleep(ENB_REGISTER_RETRY_DELAY);
- /* Restart the registration process */
- registered_enb = 0;
- register_enb_pending = eNB_app_register (enb_id_start, enb_id_end, enb_properties_p);
- }
- }
- }
-
- 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 == enb_register_retry_timer_id) {
- /* Restart the registration process */
- registered_enb = 0;
- register_enb_pending = eNB_app_register (enb_id_start, enb_id_end, enb_properties_p);
- }
-
- 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;
-}
-
-
-//------------------------------------------------------------------------------
-void mme_test_s1_start_test(instance_t instance)
-//------------------------------------------------------------------------------
-{
- s1ap_eNB_itti_send_sctp_data_req(instance,
- s1c_test.assoc_id,
- s1ap_scenarios[s1c_test.scenario_index][s1c_test.tx_next_message_index].buffer,
- s1ap_scenarios[s1c_test.scenario_index][s1c_test.tx_next_message_index].buf_len,
- s1ap_scenarios[s1c_test.scenario_index][s1c_test.tx_next_message_index].sctp_stream_id);
-}
-
-
-//------------------------------------------------------------------------------
-void mme_test_s1_notify_sctp_data_ind(uint32_t assoc_id, int32_t stream, const uint8_t * const data, const uint32_t data_length)
-//------------------------------------------------------------------------------
-{
-
-}
-
-
-//------------------------------------------------------------------------------
-int main( int argc, char **argv )
-//------------------------------------------------------------------------------
-{
- // initialize the log (see log.h for details)
- logInit();
-
- get_options (argc, argv); //Command-line options
- set_glog(glog_level, glog_verbosity);
- log_set_instance_type (LOG_INSTANCE_ENB);
-
- /* Read eNB configuration file */
- enb_properties = enb_config_init(conf_config_file_name);
-
- itti_init(TASK_MAX, tasks_info);
-
- itti_wait_ready(1);
-
- if (itti_create_task (TASK_SCTP, sctp_eNB_task, NULL) < 0) {
- LOG_E(SCTP, "Create task for SCTP failed\n");
- return -1;
- }
-
- if (itti_create_task (TASK_S1AP, s1ap_eNB_task, NULL) < 0) {
- LOG_E(S1AP, "Create task for S1AP failed\n");
- return -1;
- }
-
- if (itti_create_task (TASK_ENB_APP, eNB_app_task, NULL) < 0) {
- LOG_E(S1AP, "Create task for S1AP failed\n");
- return -1;
- }
-
- itti_wait_ready(0);
-
-
-
- sleep(30);
-
- logClean();
- return 0;
-}
diff --git a/openair3/TEST/oaisim_mme_test_s1c.h b/openair3/TEST/oaisim_mme_test_s1c.h
deleted file mode 100644
index 91e4472caf..0000000000
--- a/openair3/TEST/oaisim_mme_test_s1c.h
+++ /dev/null
@@ -1,30 +0,0 @@
-/*
- * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The OpenAirInterface Software Alliance licenses this file to You under
- * the OAI Public License, Version 1.1 (the "License"); you may not use this file
- * except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.openairinterface.org/?page_id=698
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *-------------------------------------------------------------------------------
- * For more information about the OpenAirInterface (OAI) Software Alliance:
- * contact@openairinterface.org
- */
-
-typedef struct s1c_test_s {
- int scenario_index;
- int tx_next_message_index;
- int rx_next_message_index;
- int32_t assoc_id;
-}s1c_test_t;
-
-void mme_test_s1_start_test(instance_t instance);
-void mme_test_s1_notify_sctp_data_ind(uint32_t assoc_id, int32_t stream, const uint8_t * const data, const uint32_t data_length);
diff --git a/openair3/TEST/oaisim_mme_test_s1c_s1ap.c b/openair3/TEST/oaisim_mme_test_s1c_s1ap.c
deleted file mode 100644
index 60da125073..0000000000
--- a/openair3/TEST/oaisim_mme_test_s1c_s1ap.c
+++ /dev/null
@@ -1,291 +0,0 @@
-/*
- * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The OpenAirInterface Software Alliance licenses this file to You under
- * the OAI Public License, Version 1.1 (the "License"); you may not use this file
- * except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.openairinterface.org/?page_id=698
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *-------------------------------------------------------------------------------
- * For more information about the OpenAirInterface (OAI) Software Alliance:
- * contact@openairinterface.org
- */
-
-#define _GNU_SOURCE
-#include
-#include
-#include
-#include
-#include