diff --git a/ci-scripts/Jenkinsfile-gitlab b/ci-scripts/Jenkinsfile-gitlab
index d4fe0d8555..92611670ba 100644
--- a/ci-scripts/Jenkinsfile-gitlab
+++ b/ci-scripts/Jenkinsfile-gitlab
@@ -31,7 +31,6 @@ def sendSocialMediaMessage(pipeChannel, pipeColor, pipeMessage) {
}
def doRedHatBuild = false
-def FDD_Band7_B210_Status
pipeline {
agent {
@@ -41,7 +40,7 @@ pipeline {
disableConcurrentBuilds()
timestamps()
gitLabConnection('OAI GitLab')
- gitlabBuilds(builds: ["Build eNb-USRP", "Build basic-sim", "Build phy-sim", "Build eNb-ethernet", "Build UE-ethernet", "Analysis with cppcheck", "Test phy-sim", "Test-FDD-Band7"])
+ gitlabBuilds(builds: ["Build eNb-USRP", "Build basic-sim", "Build phy-sim", "Build eNb-ethernet", "Build UE-ethernet", "Analysis with cppcheck", "Test phy-sim", "Test basic-sim", "Test-FDD-Band7", "Test-TDD-Band40"])
ansiColor('xterm')
}
@@ -62,7 +61,7 @@ pipeline {
allParametersPresent = false
}
if (allParametersPresent) {
- echo "Performing Red Hat Build"
+ echo "Performing Red Hat Build"
doRedHatBuild = true
} else {
doRedHatBuild = false
@@ -154,14 +153,14 @@ pipeline {
stage ("Analysis with cppcheck") {
steps {
gitlabCommitStatus(name: "Analysis with cppcheck") {
- sh "./ci-scripts/buildOnVM.sh --workspace $WORKSPACE --variant cppcheck --job-name ${JOB_NAME} --build-id ${BUILD_ID} --keep-vm-alive"
+ sh "./ci-scripts/buildOnVM.sh --workspace $WORKSPACE --variant cppcheck --job-name ${JOB_NAME} --build-id ${BUILD_ID}"
}
}
}
stage ("Build eNb-USRP") {
steps {
gitlabCommitStatus(name: "Build eNb-USRP") {
- sh "./ci-scripts/buildOnVM.sh --workspace $WORKSPACE --variant enb-usrp --job-name ${JOB_NAME} --build-id ${BUILD_ID} --keep-vm-alive"
+ sh "./ci-scripts/buildOnVM.sh --workspace $WORKSPACE --variant enb-usrp --job-name ${JOB_NAME} --build-id ${BUILD_ID}"
}
}
}
@@ -238,6 +237,7 @@ pipeline {
sh "./ci-scripts/reportBuildLocally.sh --git-url ${GIT_URL} --job-name ${JOB_NAME} --build-id ${BUILD_ID} --trigger push --branch ${GIT_BRANCH} --commit ${GIT_COMMIT}"
}
if(fileExists('build_results.html')) {
+ sh "sed -i -e 's#Build-ID: ${BUILD_ID}#Build-ID: ${BUILD_ID}#' build_results.html"
archiveArtifacts artifacts: 'build_results.html'
}
}
@@ -250,64 +250,111 @@ pipeline {
stage ("Test physical simulators") {
steps {
gitlabCommitStatus(name: "Test phy-sim") {
- sh "./ci-scripts/runTestOnVM.sh --workspace $WORKSPACE --variant phy-sim --job-name ${JOB_NAME} --build-id ${BUILD_ID} --keep-vm-alive"
+ sh "./ci-scripts/runTestOnVM.sh --workspace $WORKSPACE --variant phy-sim --job-name ${JOB_NAME} --build-id ${BUILD_ID}"
}
}
}
stage ("Test basic simulator") {
steps {
- //gitlabCommitStatus(name: "Test basic-sim") {
+ gitlabCommitStatus(name: "Test basic-sim") {
sh "./ci-scripts/runTestOnVM.sh --workspace $WORKSPACE --variant basic-sim --job-name ${JOB_NAME} --build-id ${BUILD_ID} --keep-vm-alive"
- //}
+ }
}
}
- stage ("Test FDD - Band 7 - B210") {
- steps {
- gitlabCommitStatus(name: "Test-FDD-Band7") {
- script {
- if ("MERGE".equals(env.gitlabActionType)) {
- FDD_Band7_B210_Status = build job: 'eNB-CI-FDD-Band7-B210',
- parameters: [
- string(name: 'eNB_Repository', value: String.valueOf(GIT_URL)),
- string(name: 'eNB_Branch', value: String.valueOf(env.gitlabSourceBranch)),
- string(name: 'eNB_CommitID', value: String.valueOf(env.gitlabMergeRequestLastCommit)),
- booleanParam(name: 'eNB_mergeRequest', value: true)
- ]
- } else {
- FDD_Band7_B210_Status = build job: 'eNB-CI-FDD-Band7-B210',
- parameters: [
- string(name: 'eNB_Repository', value: String.valueOf(GIT_URL)),
- string(name: 'eNB_Branch', value: String.valueOf(GIT_BRANCH)),
- string(name: 'eNB_CommitID', value: String.valueOf(GIT_COMMIT)),
- booleanParam(name: 'eNB_mergeRequest', value: false)
- ]
+ stage ("Test on CI bench #1") {
+ stages {
+ stage ("Test FDD - Band 7 - B210") {
+ steps {
+ script {
+ try {
+ if ("MERGE".equals(env.gitlabActionType)) {
+ gitlabCommitStatus(name: "Test-FDD-Band7") {
+ build job: 'eNB-CI-FDD-Band7-B210',
+ parameters: [
+ string(name: 'eNB_Repository', value: String.valueOf(GIT_URL)),
+ string(name: 'eNB_Branch', value: String.valueOf(env.gitlabSourceBranch)),
+ string(name: 'eNB_CommitID', value: String.valueOf(env.gitlabMergeRequestLastCommit)),
+ booleanParam(name: 'eNB_mergeRequest', value: true)
+ ]
+ }
+ } else {
+ gitlabCommitStatus(name: "Test-FDD-Band7") {
+ build job: 'eNB-CI-FDD-Band7-B210',
+ parameters: [
+ string(name: 'eNB_Repository', value: String.valueOf(GIT_URL)),
+ string(name: 'eNB_Branch', value: String.valueOf(GIT_BRANCH)),
+ string(name: 'eNB_CommitID', value: String.valueOf(GIT_COMMIT)),
+ booleanParam(name: 'eNB_mergeRequest', value: false)
+ ]
+ }
+ }
+ } catch (Exception e) {
+ currentBuild.result = 'FAILURE'
+ }
+ }
+ }
+ post {
+ // In case of any non-success, we are retrieving the HTML report of the last completed
+ // slave job.
+ // The only drop-back is that we may retrieve the HTML report of a previous build
+ always {
+ script {
+ if (!fileExists('test_results-eNB-CI-FDD-Band7-B210.html')) {
+ copyArtifacts(projectName: 'eNB-CI-FDD-Band7-B210',
+ filter: 'test_results*.html',
+ selector: lastCompleted())
+ if (fileExists('test_results-eNB-CI-FDD-Band7-B210.html')) {
+ archiveArtifacts artifacts: 'test_results-eNB-CI-FDD-Band7-B210.html'
+ }
+ }
+ }
}
}
}
- }
- post {
- // In case of success we really pick the report from the exact slave build number
- success {
- script {
- copyArtifacts(projectName: 'eNB-CI-FDD-Band7-B210',
- filter: 'test_results*.html',
- selector: specific("${FDD_Band7_B210_Status.number}"))
- if (fileExists('test_results-eNB-CI-FDD-Band7-B210.html')) {
- archiveArtifacts artifacts: 'test_results-eNB-CI-FDD-Band7-B210.html'
+ stage ("Test TDD - Band 40 - B210") {
+ steps {
+ script {
+ try {
+ if ("MERGE".equals(env.gitlabActionType)) {
+ gitlabCommitStatus(name: "Test-TDD-Band40") {
+ build job: 'eNB-CI-TDD-Band40-B210',
+ parameters: [
+ string(name: 'eNB_Repository', value: String.valueOf(GIT_URL)),
+ string(name: 'eNB_Branch', value: String.valueOf(env.gitlabSourceBranch)),
+ string(name: 'eNB_CommitID', value: String.valueOf(env.gitlabMergeRequestLastCommit)),
+ booleanParam(name: 'eNB_mergeRequest', value: true)
+ ]
+ }
+ } else {
+ gitlabCommitStatus(name: "Test-TDD-Band40") {
+ build job: 'eNB-CI-TDD-Band40-B210',
+ parameters: [
+ string(name: 'eNB_Repository', value: String.valueOf(GIT_URL)),
+ string(name: 'eNB_Branch', value: String.valueOf(GIT_BRANCH)),
+ string(name: 'eNB_CommitID', value: String.valueOf(GIT_COMMIT)),
+ booleanParam(name: 'eNB_mergeRequest', value: false)
+ ]
+ }
+ }
+ } catch (Exception e) {
+ currentBuild.result = 'FAILURE'
+ }
}
}
- }
- // In case of any non-success, we are retrieving the HTML report of the last completed
- // slave job. Note that we could use that syntax also in case of success.
- // The only drop-back is that we may retrieve the HTML report of a previous build
- cleanup {
- script {
- if (!fileExists('test_results-eNB-CI-FDD-Band7-B210.html')) {
- copyArtifacts(projectName: 'eNB-CI-FDD-Band7-B210',
- filter: 'test_results*.html',
- selector: lastCompleted())
- if (fileExists('test_results-eNB-CI-FDD-Band7-B210.html')) {
- archiveArtifacts artifacts: 'test_results-eNB-CI-FDD-Band7-B210.html'
+ post {
+ // In case of any non-success, we are retrieving the HTML report of the last completed
+ // slave job.
+ // The only drop-back is that we may retrieve the HTML report of a previous build
+ always {
+ script {
+ if (!fileExists('test_results-eNB-CI-TDD-Band40-B210.html')) {
+ copyArtifacts(projectName: 'eNB-CI-TDD-Band40-B210',
+ filter: 'test_results*.html',
+ selector: lastCompleted())
+ if (fileExists('test_results-eNB-CI-TDD-Band40-B210.html')) {
+ archiveArtifacts artifacts: 'test_results-eNB-CI-TDD-Band40-B210.html'
+ }
+ }
}
}
}
@@ -319,12 +366,19 @@ pipeline {
always {
script {
dir ('archives') {
- sh "if [ -d */test ]; then zip -r -qq vm_tests_logs.zip */test ; fi"
+ sh "if [ -d basic_sim/test ] || [ -d phy_sim/test ]; then zip -r -qq vm_tests_logs.zip */test ; fi"
}
if(fileExists('archives/vm_tests_logs.zip')) {
archiveArtifacts artifacts: 'archives/vm_tests_logs.zip'
- archiveArtifacts artifacts: 'archives/*/test/results_autotests*.xml'
- archiveArtifacts artifacts: 'archives/*/test/*.xsl'
+ if ("MERGE".equals(env.gitlabActionType)) {
+ sh "./ci-scripts/reportTestLocally.sh --git-url ${GIT_URL} --job-name ${JOB_NAME} --build-id ${BUILD_ID} --trigger merge-request --src-branch ${env.gitlabSourceBranch} --src-commit ${env.gitlabMergeRequestLastCommit} --target-branch ${env.gitlabTargetBranch} --target-commit ${GIT_COMMIT}"
+ } else {
+ sh "./ci-scripts/reportTestLocally.sh --git-url ${GIT_URL} --job-name ${JOB_NAME} --build-id ${BUILD_ID} --trigger push --branch ${GIT_BRANCH} --commit ${GIT_COMMIT}"
+ }
+ if(fileExists('test_simulator_results.html')) {
+ sh "sed -i -e 's#Build-ID: ${BUILD_ID}#Build-ID: ${BUILD_ID}#' test_simulator_results.html"
+ archiveArtifacts artifacts: 'test_simulator_results.html'
+ }
}
}
}
@@ -341,6 +395,15 @@ pipeline {
script {
// Stage destroy may not be run if error in previous stage
sh "./ci-scripts/destroyAllRunningVM.sh --job-name ${JOB_NAME} --build-id ${BUILD_ID}"
+ emailext attachmentsPattern: '*results*.html',
+ body: '''Hi,
+Here are attached HTML report files for $PROJECT_NAME - Build # $BUILD_NUMBER - $BUILD_STATUS!
+
+Regards,
+OAI CI Team''',
+ replyTo: 'no-reply@openairinterface.org',
+ subject: '$PROJECT_NAME - Build # $BUILD_NUMBER - $BUILD_STATUS!',
+ to: env.gitlabUserEmail
}
}
success {
diff --git a/ci-scripts/buildOnVM.sh b/ci-scripts/buildOnVM.sh
index 76a11c6d38..3eb24932bf 100755
--- a/ci-scripts/buildOnVM.sh
+++ b/ci-scripts/buildOnVM.sh
@@ -86,6 +86,7 @@ JOB_NAME=XX
BUILD_ID=XX
VM_NAME=ci-enb-usrp
VM_MEMORY=2048
+VM_CPU=4
ARCHIVES_LOC=enb_usrp
LOG_PATTERN=.Rel14.txt
NB_PATTERN_FILES=4
@@ -135,6 +136,8 @@ case $key in
LOG_PATTERN=basic_simulator
NB_PATTERN_FILES=2
BUILD_OPTIONS="--basic-simulator"
+ VM_MEMORY=8192
+ VM_CPU=4
shift
;;
-v3)
@@ -186,6 +189,8 @@ case $key in
LOG_PATTERN=basic_simulator
NB_PATTERN_FILES=2
BUILD_OPTIONS="--basic-simulator"
+ VM_MEMORY=8192
+ VM_CPU=4
;;
phy-sim)
VM_NAME=ci-phy-sim
@@ -270,7 +275,7 @@ then
echo "############################################################"
echo "Creating VM ($VM_NAME) on Ubuntu Cloud Image base"
echo "############################################################"
- uvt-kvm create $VM_NAME release=xenial --memory $VM_MEMORY --cpu 4 --unsafe-caching --template ci-scripts/template-host.xml
+ uvt-kvm create $VM_NAME release=xenial --memory $VM_MEMORY --cpu $VM_CPU --unsafe-caching --template ci-scripts/template-host.xml
fi
echo "Waiting for VM to be started"
@@ -289,6 +294,7 @@ echo "############################################################"
echo "Running install and build script on VM ($VM_NAME)"
echo "############################################################"
echo "sudo cp 01proxy /etc/apt/apt.conf.d/" > $VM_CMDS
+echo "touch /home/ubuntu/.hushlogin" >> $VM_CMDS
if [[ "$VM_NAME" == *"-cppcheck"* ]]
then
echo "echo \"sudo apt-get --yes --quiet install zip cppcheck \"" >> $VM_CMDS
diff --git a/ci-scripts/conf_files/enb.band40.tm1.100PRB.FairScheduler.usrpb210.conf b/ci-scripts/conf_files/enb.band40.tm1.100PRB.FairScheduler.usrpb210.conf
new file mode 100644
index 0000000000..14230c125f
--- /dev/null
+++ b/ci-scripts/conf_files/enb.band40.tm1.100PRB.FairScheduler.usrpb210.conf
@@ -0,0 +1,220 @@
+Active_eNBs = ( "eNB_Eurecom_LTEBox");
+# Asn1_verbosity, choice in: none, info, annoying
+Asn1_verbosity = "none";
+
+eNBs =
+(
+ {
+ ////////// Identification parameters:
+ eNB_ID = 0xe00;
+
+ cell_type = "CELL_MACRO_ENB";
+
+ eNB_name = "eNB_Eurecom_LTEBox";
+
+ // Tracking area code, 0x0000 and 0xfffe are reserved values
+ tracking_area_code = "1";
+
+ mobile_country_code = "208";
+ mobile_network_code = "92";
+
+ ////////// Physical parameters:
+
+ component_carriers = (
+ {
+ node_function = "eNodeB_3GPP";
+ node_timing = "synch_to_ext_device";
+ node_synch_ref = 0;
+ frame_type = "TDD";
+ tdd_config = 1;
+ tdd_config_s = 0;
+ prefix_type = "NORMAL";
+ eutra_band = 40;
+ downlink_frequency = 2350000000L;
+ uplink_frequency_offset = 0;
+ Nid_cell = 0;
+ N_RB_DL = 100;
+ Nid_cell_mbsfn = 0;
+ nb_antenna_ports = 1;
+ nb_antennas_tx = 1;
+ nb_antennas_rx = 1;
+ tx_gain = 90;
+ rx_gain = 125;
+ 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 =-29;
+ 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 = -96;
+ pusch_alpha = "AL1";
+ pucch_p0_Nominal = -106;
+ 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;
+
+ ue_TransmissionMode = 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 = "10.0.0.2";
+ ipv6 = "192:168:30::17";
+ active = "yes";
+ preference = "ipv4";
+ }
+ );
+
+ NETWORK_INTERFACES :
+ {
+ ENB_INTERFACE_NAME_FOR_S1_MME = "eth0";
+ ENB_IPV4_ADDRESS_FOR_S1_MME = "10.0.0.1/24";
+
+ ENB_INTERFACE_NAME_FOR_S1U = "eth0";
+ ENB_IPV4_ADDRESS_FOR_S1U = "10.0.0.1/24";
+ ENB_PORT_FOR_S1U = 2152; # Spec 2152
+
+ ENB_IPV4_ADDRESS_FOR_X2C = "192.168.12.111/24";
+ ENB_PORT_FOR_X2C = 36422; # Spec 36422
+ };
+
+ log_config :
+ {
+ global_log_level ="debug";
+ global_log_verbosity ="medium";
+ hw_log_level ="info";
+ hw_log_verbosity ="medium";
+ phy_log_level ="info";
+ phy_log_verbosity ="medium";
+ mac_log_level ="info";
+ mac_log_verbosity ="high";
+ rlc_log_level ="info";
+ rlc_log_verbosity ="medium";
+ pdcp_log_level ="info";
+ pdcp_log_verbosity ="medium";
+ rrc_log_level ="info";
+ rrc_log_verbosity ="medium";
+ };
+
+ }
+);
+MACRLCs = (
+ {
+ num_cc = 1;
+ tr_s_preference = "local_L1";
+ tr_n_preference = "local_RRC";
+ scheduler_mode = "fairRR";
+ puSch10xSnr = 200;
+ puCch10xSnr = 200;
+ }
+);
+
+L1s = (
+ {
+ num_cc = 1;
+ tr_n_preference = "local_mac";
+ }
+);
+
+RUs = (
+ {
+ local_rf = "yes"
+ nb_tx = 1
+ nb_rx = 1
+ att_tx = 0
+ att_rx = 0;
+ bands = [38];
+ max_pdschReferenceSignalPower = -27;
+ max_rxgain = 115;
+ eNB_instances = [0];
+
+ }
+);
+
+NETWORK_CONTROLLER :
+{
+ FLEXRAN_ENABLED = "no";
+ FLEXRAN_INTERFACE_NAME = "lo";
+ FLEXRAN_IPV4_ADDRESS = "127.0.0.1";
+ FLEXRAN_PORT = 2210;
+ FLEXRAN_CACHE = "/mnt/oai_agent_cache";
+ FLEXRAN_AWAIT_RECONF = "no";
+};
diff --git a/ci-scripts/conf_files/enb.band40.tm1.25PRB.FairScheduler.usrpb210.conf b/ci-scripts/conf_files/enb.band40.tm1.25PRB.FairScheduler.usrpb210.conf
new file mode 100644
index 0000000000..8a66e3131f
--- /dev/null
+++ b/ci-scripts/conf_files/enb.band40.tm1.25PRB.FairScheduler.usrpb210.conf
@@ -0,0 +1,220 @@
+Active_eNBs = ( "eNB_Eurecom_LTEBox");
+# Asn1_verbosity, choice in: none, info, annoying
+Asn1_verbosity = "none";
+
+eNBs =
+(
+ {
+ ////////// Identification parameters:
+ eNB_ID = 0xe00;
+
+ cell_type = "CELL_MACRO_ENB";
+
+ eNB_name = "eNB_Eurecom_LTEBox";
+
+ // Tracking area code, 0x0000 and 0xfffe are reserved values
+ tracking_area_code = "1";
+
+ mobile_country_code = "208";
+ mobile_network_code = "92";
+
+ ////////// Physical parameters:
+
+ component_carriers = (
+ {
+ node_function = "eNodeB_3GPP";
+ node_timing = "synch_to_ext_device";
+ node_synch_ref = 0;
+ frame_type = "TDD";
+ tdd_config = 1;
+ tdd_config_s = 0;
+ prefix_type = "NORMAL";
+ eutra_band = 40;
+ downlink_frequency = 2350000000L;
+ uplink_frequency_offset = 0;
+ Nid_cell = 0;
+ N_RB_DL = 25;
+ Nid_cell_mbsfn = 0;
+ nb_antenna_ports = 1;
+ nb_antennas_tx = 1;
+ nb_antennas_rx = 1;
+ tx_gain = 90;
+ rx_gain = 125;
+ 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 =-27;
+ 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 = -96;
+ pusch_alpha = "AL1";
+ pucch_p0_Nominal = -106;
+ 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;
+
+ ue_TransmissionMode = 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 = "10.0.0.2";
+ ipv6 = "192:168:30::17";
+ active = "yes";
+ preference = "ipv4";
+ }
+ );
+
+ NETWORK_INTERFACES :
+ {
+ ENB_INTERFACE_NAME_FOR_S1_MME = "eth0";
+ ENB_IPV4_ADDRESS_FOR_S1_MME = "10.0.0.1/24";
+
+ ENB_INTERFACE_NAME_FOR_S1U = "eth0";
+ ENB_IPV4_ADDRESS_FOR_S1U = "10.0.0.1/24";
+ ENB_PORT_FOR_S1U = 2152; # Spec 2152
+
+ ENB_IPV4_ADDRESS_FOR_X2C = "192.168.12.111/24";
+ ENB_PORT_FOR_X2C = 36422; # Spec 36422
+ };
+
+ log_config :
+ {
+ global_log_level ="debug";
+ global_log_verbosity ="medium";
+ hw_log_level ="info";
+ hw_log_verbosity ="medium";
+ phy_log_level ="info";
+ phy_log_verbosity ="medium";
+ mac_log_level ="info";
+ mac_log_verbosity ="high";
+ rlc_log_level ="info";
+ rlc_log_verbosity ="medium";
+ pdcp_log_level ="info";
+ pdcp_log_verbosity ="medium";
+ rrc_log_level ="info";
+ rrc_log_verbosity ="medium";
+ };
+
+ }
+);
+MACRLCs = (
+ {
+ num_cc = 1;
+ tr_s_preference = "local_L1";
+ tr_n_preference = "local_RRC";
+ scheduler_mode = "fairRR";
+ puSch10xSnr = 200;
+ puCch10xSnr = 200;
+ }
+);
+
+L1s = (
+ {
+ num_cc = 1;
+ tr_n_preference = "local_mac";
+ }
+);
+
+RUs = (
+ {
+ local_rf = "yes"
+ nb_tx = 1
+ nb_rx = 1
+ att_tx = 0
+ att_rx = 0;
+ bands = [38];
+ max_pdschReferenceSignalPower = -27;
+ max_rxgain = 115;
+ eNB_instances = [0];
+
+ }
+);
+
+NETWORK_CONTROLLER :
+{
+ FLEXRAN_ENABLED = "no";
+ FLEXRAN_INTERFACE_NAME = "lo";
+ FLEXRAN_IPV4_ADDRESS = "127.0.0.1";
+ FLEXRAN_PORT = 2210;
+ FLEXRAN_CACHE = "/mnt/oai_agent_cache";
+ FLEXRAN_AWAIT_RECONF = "no";
+};
diff --git a/ci-scripts/conf_files/enb.band40.tm1.50PRB.FairScheduler.usrpb210.conf b/ci-scripts/conf_files/enb.band40.tm1.50PRB.FairScheduler.usrpb210.conf
new file mode 100644
index 0000000000..ede864b733
--- /dev/null
+++ b/ci-scripts/conf_files/enb.band40.tm1.50PRB.FairScheduler.usrpb210.conf
@@ -0,0 +1,220 @@
+Active_eNBs = ( "eNB_Eurecom_LTEBox");
+# Asn1_verbosity, choice in: none, info, annoying
+Asn1_verbosity = "none";
+
+eNBs =
+(
+ {
+ ////////// Identification parameters:
+ eNB_ID = 0xe00;
+
+ cell_type = "CELL_MACRO_ENB";
+
+ eNB_name = "eNB_Eurecom_LTEBox";
+
+ // Tracking area code, 0x0000 and 0xfffe are reserved values
+ tracking_area_code = "1";
+
+ mobile_country_code = "208";
+ mobile_network_code = "92";
+
+ ////////// Physical parameters:
+
+ component_carriers = (
+ {
+ node_function = "eNodeB_3GPP";
+ node_timing = "synch_to_ext_device";
+ node_synch_ref = 0;
+ frame_type = "TDD";
+ tdd_config = 1;
+ tdd_config_s = 0;
+ prefix_type = "NORMAL";
+ eutra_band = 40;
+ downlink_frequency = 2350000000L;
+ uplink_frequency_offset = 0;
+ Nid_cell = 0;
+ N_RB_DL = 50;
+ Nid_cell_mbsfn = 0;
+ nb_antenna_ports = 1;
+ nb_antennas_tx = 1;
+ nb_antennas_rx = 1;
+ tx_gain = 90;
+ rx_gain = 125;
+ 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 =-27;
+ 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 = -96;
+ pusch_alpha = "AL1";
+ pucch_p0_Nominal = -106;
+ 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;
+
+ ue_TransmissionMode = 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 = "10.0.0.2";
+ ipv6 = "192:168:30::17";
+ active = "yes";
+ preference = "ipv4";
+ }
+ );
+
+ NETWORK_INTERFACES :
+ {
+ ENB_INTERFACE_NAME_FOR_S1_MME = "eth0";
+ ENB_IPV4_ADDRESS_FOR_S1_MME = "10.0.0.1/24";
+
+ ENB_INTERFACE_NAME_FOR_S1U = "eth0";
+ ENB_IPV4_ADDRESS_FOR_S1U = "10.0.0.1/24";
+ ENB_PORT_FOR_S1U = 2152; # Spec 2152
+
+ ENB_IPV4_ADDRESS_FOR_X2C = "192.168.12.111/24";
+ ENB_PORT_FOR_X2C = 36422; # Spec 36422
+ };
+
+ log_config :
+ {
+ global_log_level ="debug";
+ global_log_verbosity ="medium";
+ hw_log_level ="info";
+ hw_log_verbosity ="medium";
+ phy_log_level ="info";
+ phy_log_verbosity ="medium";
+ mac_log_level ="info";
+ mac_log_verbosity ="high";
+ rlc_log_level ="info";
+ rlc_log_verbosity ="medium";
+ pdcp_log_level ="info";
+ pdcp_log_verbosity ="medium";
+ rrc_log_level ="info";
+ rrc_log_verbosity ="medium";
+ };
+
+ }
+);
+MACRLCs = (
+ {
+ num_cc = 1;
+ tr_s_preference = "local_L1";
+ tr_n_preference = "local_RRC";
+ scheduler_mode = "fairRR";
+ puSch10xSnr = 200;
+ puCch10xSnr = 200;
+ }
+);
+
+L1s = (
+ {
+ num_cc = 1;
+ tr_n_preference = "local_mac";
+ }
+);
+
+RUs = (
+ {
+ local_rf = "yes"
+ nb_tx = 1
+ nb_rx = 1
+ att_tx = 0
+ att_rx = 0;
+ bands = [38];
+ max_pdschReferenceSignalPower = -27;
+ max_rxgain = 115;
+ eNB_instances = [0];
+
+ }
+);
+
+NETWORK_CONTROLLER :
+{
+ FLEXRAN_ENABLED = "no";
+ FLEXRAN_INTERFACE_NAME = "lo";
+ FLEXRAN_IPV4_ADDRESS = "127.0.0.1";
+ FLEXRAN_PORT = 2210;
+ FLEXRAN_CACHE = "/mnt/oai_agent_cache";
+ FLEXRAN_AWAIT_RECONF = "no";
+};
diff --git a/ci-scripts/conf_files/enb.band7.tm1.100PRB.usrpb210.conf b/ci-scripts/conf_files/enb.band7.tm1.100PRB.usrpb210.conf
index 4380bd30be..37656de755 100644
--- a/ci-scripts/conf_files/enb.band7.tm1.100PRB.usrpb210.conf
+++ b/ci-scripts/conf_files/enb.band7.tm1.100PRB.usrpb210.conf
@@ -183,12 +183,14 @@ eNBs =
NETWORK_INTERFACES :
{
-
ENB_INTERFACE_NAME_FOR_S1_MME = "eth0";
ENB_IPV4_ADDRESS_FOR_S1_MME = "192.168.12.111/24";
ENB_INTERFACE_NAME_FOR_S1U = "eth0";
ENB_IPV4_ADDRESS_FOR_S1U = "192.168.12.111/24";
ENB_PORT_FOR_S1U = 2152; # Spec 2152
+
+ ENB_IPV4_ADDRESS_FOR_X2C = "192.168.12.111/24";
+ ENB_PORT_FOR_X2C = 36422; # Spec 36422
};
}
);
diff --git a/ci-scripts/conf_files/enb.band7.tm1.25PRB.usrpb210.conf b/ci-scripts/conf_files/enb.band7.tm1.25PRB.usrpb210.conf
index dded9cfdeb..01c1ca1428 100644
--- a/ci-scripts/conf_files/enb.band7.tm1.25PRB.usrpb210.conf
+++ b/ci-scripts/conf_files/enb.band7.tm1.25PRB.usrpb210.conf
@@ -183,12 +183,14 @@ eNBs =
NETWORK_INTERFACES :
{
-
ENB_INTERFACE_NAME_FOR_S1_MME = "eth0";
ENB_IPV4_ADDRESS_FOR_S1_MME = "192.168.12.111/24";
ENB_INTERFACE_NAME_FOR_S1U = "eth0";
ENB_IPV4_ADDRESS_FOR_S1U = "192.168.12.111/24";
ENB_PORT_FOR_S1U = 2152; # Spec 2152
+
+ ENB_IPV4_ADDRESS_FOR_X2C = "192.168.12.111/24";
+ ENB_PORT_FOR_X2C = 36422; # Spec 36422
};
}
);
diff --git a/ci-scripts/conf_files/enb.band7.tm1.50PRB.usrpb210.conf b/ci-scripts/conf_files/enb.band7.tm1.50PRB.usrpb210.conf
index 7c4292eb61..eb5822cb22 100644
--- a/ci-scripts/conf_files/enb.band7.tm1.50PRB.usrpb210.conf
+++ b/ci-scripts/conf_files/enb.band7.tm1.50PRB.usrpb210.conf
@@ -183,12 +183,14 @@ eNBs =
NETWORK_INTERFACES :
{
-
ENB_INTERFACE_NAME_FOR_S1_MME = "eth0";
ENB_IPV4_ADDRESS_FOR_S1_MME = "192.168.12.111/24";
ENB_INTERFACE_NAME_FOR_S1U = "eth0";
ENB_IPV4_ADDRESS_FOR_S1U = "192.168.12.111/24";
ENB_PORT_FOR_S1U = 2152; # Spec 2152
+
+ ENB_IPV4_ADDRESS_FOR_X2C = "192.168.12.111/24";
+ ENB_PORT_FOR_X2C = 36422; # Spec 36422
};
}
);
diff --git a/ci-scripts/conf_files/lte-basic-sim.conf b/ci-scripts/conf_files/lte-basic-sim.conf
new file mode 100644
index 0000000000..f0fab0bdcb
--- /dev/null
+++ b/ci-scripts/conf_files/lte-basic-sim.conf
@@ -0,0 +1,259 @@
+Active_eNBs = ( "eNB-Eurecom-LTEBox");
+# Asn1_verbosity, choice in: none, info, annoying
+Asn1_verbosity = "none";
+
+eNBs =
+(
+ {
+ ////////// Identification parameters:
+ eNB_ID = 0xe00;
+
+ cell_type = "CELL_MACRO_ENB";
+
+ eNB_name = "eNB-Eurecom-LTEBox";
+
+ // Tracking area code, 0x0000 and 0xfffe are reserved values
+ tracking_area_code = "1";
+
+ mobile_country_code = "208";
+
+ mobile_network_code = "93";
+
+ tr_s_preference = "local_mac"
+
+ ////////// Physical parameters:
+
+ component_carriers = (
+ {
+ node_function = "3GPP_eNODEB";
+ node_timing = "synch_to_ext_device";
+ node_synch_ref = 0;
+ frame_type = "FDD";
+ tdd_config = 3;
+ tdd_config_s = 0;
+ prefix_type = "NORMAL";
+ eutra_band = 7;
+ downlink_frequency = 2680000000L;
+ uplink_frequency_offset = -120000000;
+ Nid_cell = 0;
+ N_RB_DL = 25;
+ Nid_cell_mbsfn = 0;
+ nb_antenna_ports = 1;
+ nb_antennas_tx = 1;
+ nb_antennas_rx = 1;
+ tx_gain = 90;
+ rx_gain = 125;
+ pbch_repetition = "FALSE";
+ 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 = 0;
+ pucch_nCS_AN = 0;
+ pucch_n1_AN = 0;
+ pdsch_referenceSignalPower = -27;
+ 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 = -96;
+ pusch_alpha = "AL1";
+ pucch_p0_Nominal = -104;
+ 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;
+ ue_TransmissionMode = 1;
+
+ //Parameters for SIB18
+ rxPool_sc_CP_Len = "normal";
+ rxPool_sc_Period = "sf40";
+ rxPool_data_CP_Len = "normal";
+ rxPool_ResourceConfig_prb_Num = 20;
+ rxPool_ResourceConfig_prb_Start = 5;
+ rxPool_ResourceConfig_prb_End = 44;
+ rxPool_ResourceConfig_offsetIndicator_present = "prSmall";
+ rxPool_ResourceConfig_offsetIndicator_choice = 0;
+ rxPool_ResourceConfig_subframeBitmap_present = "prBs40";
+ rxPool_ResourceConfig_subframeBitmap_choice_bs_buf = "00000000000000000000";
+ rxPool_ResourceConfig_subframeBitmap_choice_bs_size = 5;
+ rxPool_ResourceConfig_subframeBitmap_choice_bs_bits_unused = 0;
+/* rxPool_dataHoppingConfig_hoppingParameter = 0;
+ rxPool_dataHoppingConfig_numSubbands = "ns1";
+ rxPool_dataHoppingConfig_rbOffset = 0;
+ rxPool_commTxResourceUC-ReqAllowed = "TRUE";
+*/
+ // Parameters for SIB19
+ discRxPool_cp_Len = "normal"
+ discRxPool_discPeriod = "rf32"
+ discRxPool_numRetx = 1;
+ discRxPool_numRepetition = 2;
+ discRxPool_ResourceConfig_prb_Num = 5;
+ discRxPool_ResourceConfig_prb_Start = 3;
+ discRxPool_ResourceConfig_prb_End = 21;
+ discRxPool_ResourceConfig_offsetIndicator_present = "prSmall";
+ discRxPool_ResourceConfig_offsetIndicator_choice = 0;
+ discRxPool_ResourceConfig_subframeBitmap_present = "prBs40";
+ discRxPool_ResourceConfig_subframeBitmap_choice_bs_buf = "f0ffffffff";
+ discRxPool_ResourceConfig_subframeBitmap_choice_bs_size = 5;
+ discRxPool_ResourceConfig_subframeBitmap_choice_bs_bits_unused = 0;
+
+ }
+ );
+
+
+ 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 = "CI_MME_IP_ADDR";
+ ipv6 = "192:168:30::17";
+ active = "yes";
+ preference = "ipv4";
+ }
+ );
+
+ NETWORK_INTERFACES :
+ {
+
+ ENB_INTERFACE_NAME_FOR_S1_MME = "eth0";
+ ENB_IPV4_ADDRESS_FOR_S1_MME = "CI_ENB_IP_ADDR";
+ ENB_INTERFACE_NAME_FOR_S1U = "eth0";
+ ENB_IPV4_ADDRESS_FOR_S1U = "CI_ENB_IP_ADDR";
+ ENB_PORT_FOR_S1U = 2152; # Spec 2152
+
+ ENB_IPV4_ADDRESS_FOR_X2C = "CI_ENB_IP_ADDR";
+ ENB_PORT_FOR_X2C = 36422; # Spec 36422
+ };
+ }
+);
+
+MACRLCs = (
+ {
+ num_cc = 1;
+ tr_s_preference = "local_L1";
+ tr_n_preference = "local_RRC";
+ phy_test_mode = 0;
+ puSch10xSnr = 200;
+ puCch10xSnr = 200;
+ }
+);
+
+L1s = (
+ {
+ num_cc = 1;
+ tr_n_preference = "local_mac";
+ }
+);
+
+RUs = (
+ {
+ local_rf = "yes"
+ nb_tx = 1
+ nb_rx = 1
+ att_tx = 0
+ att_rx = 0;
+ bands = [7];
+ max_pdschReferenceSignalPower = -27;
+ max_rxgain = 125;
+ eNB_instances = [0];
+
+ }
+);
+
+NETWORK_CONTROLLER :
+{
+ FLEXRAN_ENABLED = "no";
+ FLEXRAN_INTERFACE_NAME = "lo";
+ FLEXRAN_IPV4_ADDRESS = "127.0.0.1";
+ FLEXRAN_PORT = 2210;
+ FLEXRAN_CACHE = "/mnt/oai_agent_cache";
+ FLEXRAN_AWAIT_RECONF = "no";
+};
+
+ log_config :
+ {
+ global_log_level ="info";
+ global_log_verbosity ="medium";
+ hw_log_level ="info";
+ hw_log_verbosity ="medium";
+ phy_log_level ="info";
+ phy_log_verbosity ="medium";
+ mac_log_level ="info";
+ mac_log_verbosity ="high";
+ rlc_log_level ="info";
+ rlc_log_verbosity ="medium";
+ pdcp_log_level ="info";
+ pdcp_log_verbosity ="medium";
+ rrc_log_level ="info";
+ rrc_log_verbosity ="medium";
+ };
+
diff --git a/ci-scripts/createVM.sh b/ci-scripts/createVM.sh
index 1c3099e843..f972a921ac 100755
--- a/ci-scripts/createVM.sh
+++ b/ci-scripts/createVM.sh
@@ -80,6 +80,7 @@ JOB_NAME=XX
BUILD_ID=XX
VM_NAME=ci-enb-usrp
VM_MEMORY=2048
+VM_CPU=4
while [[ $# -gt 0 ]]
do
@@ -107,6 +108,7 @@ case $key in
;;
-v2)
VM_NAME=ci-basic-sim
+ VM_MEMORY=8192
shift
;;
-v3)
@@ -116,6 +118,7 @@ case $key in
-v4)
VM_NAME=ci-cppcheck
VM_MEMORY=4096
+ VM_CPU=4
shift
;;
-v7)
@@ -134,6 +137,7 @@ case $key in
;;
basic-sim)
VM_NAME=ci-basic-sim
+ VM_MEMORY=8192
;;
phy-sim)
VM_NAME=ci-phy-sim
@@ -141,6 +145,7 @@ case $key in
cppcheck)
VM_NAME=ci-cppcheck
VM_MEMORY=4096
+ VM_CPU=4
;;
enb-ethernet)
VM_NAME=ci-enb-ethernet
@@ -178,11 +183,12 @@ VM_CMDS=${VM_NAME}_cmds.txt
echo "VM_NAME = $VM_NAME"
echo "VM_MEMORY = $VM_MEMORY MBytes"
+echo "VM_CPU = $VM_CPU"
echo "############################################################"
echo "Creating VM ($VM_NAME) on Ubuntu Cloud Image base"
echo "############################################################"
-uvt-kvm create $VM_NAME release=xenial --memory $VM_MEMORY --cpu 4 --unsafe-caching --template ci-scripts/template-host.xml
+uvt-kvm create $VM_NAME release=xenial --memory $VM_MEMORY --cpu $VM_CPU --unsafe-caching --template ci-scripts/template-host.xml
echo "Waiting for VM to be started"
uvt-kvm wait $VM_NAME --insecure
diff --git a/ci-scripts/main.py b/ci-scripts/main.py
index e66d25204b..f210fd4518 100644
--- a/ci-scripts/main.py
+++ b/ci-scripts/main.py
@@ -299,6 +299,7 @@ class SSHConnection():
self.command('sed -i -e \'s/mme_ip_address.*$/mme_ip_address = ( { ipv4 = "' + self.EPCIPAddress + '";/\' ' + ci_full_config_file, '\$', 2);
self.command('sed -i -e \'s/ENB_IPV4_ADDRESS_FOR_S1_MME.*$/ENB_IPV4_ADDRESS_FOR_S1_MME = "' + self.eNBIPAddress + '";/\' ' + ci_full_config_file, '\$', 2);
self.command('sed -i -e \'s/ENB_IPV4_ADDRESS_FOR_S1U.*$/ENB_IPV4_ADDRESS_FOR_S1U = "' + self.eNBIPAddress + '";/\' ' + ci_full_config_file, '\$', 2);
+ self.command('sed -i -e \'s/ENB_IPV4_ADDRESS_FOR_X2C.*$/ENB_IPV4_ADDRESS_FOR_X2C = "' + self.eNBIPAddress + '";/\' ' + ci_full_config_file, '\$', 2);
# Launch eNB with the modified config file
self.command('source oaienv', '\$', 5)
self.command('cd cmake_targets', '\$', 5)
diff --git a/ci-scripts/reportTestLocally.sh b/ci-scripts/reportTestLocally.sh
new file mode 100755
index 0000000000..569b62bc3d
--- /dev/null
+++ b/ci-scripts/reportTestLocally.sh
@@ -0,0 +1,582 @@
+#!/bin/bash
+#/*
+# * 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
+# */
+
+function usage {
+ echo "OAI Test Report script"
+ echo " Original Author: Raphael Defosseux"
+ echo ""
+ echo "Usage:"
+ echo "------"
+ echo ""
+ echo " reportTestLocally.sh [OPTIONS]"
+ echo ""
+ echo "Options:"
+ echo "--------"
+ echo ""
+ echo " --help OR -h"
+ echo " Print this help message."
+ echo ""
+ echo "Job Options:"
+ echo "------------"
+ echo ""
+ echo " --git-url #### OR -gu ####"
+ echo " Specify the URL of the GIT Repository."
+ echo ""
+ echo " --job-name #### OR -jn ####"
+ echo " Specify the name of the Jenkins job."
+ echo ""
+ echo " --build-id #### OR -id ####"
+ echo " Specify the build ID of the Jenkins job."
+ echo ""
+ echo " --trigger merge-request OR -mr"
+ echo " --trigger push OR -pu"
+ echo " Specify trigger action of the Jenkins job. Either a merge-request event or a push event."
+ echo ""
+ echo "Merge-Request Options:"
+ echo "----------------------"
+ echo ""
+ echo " --src-branch #### OR -sb ####"
+ echo " Specify the source branch of the merge request."
+ echo ""
+ echo " --src-commit #### OR -sc ####"
+ echo " Specify the source commit ID (SHA-1) of the merge request."
+ echo ""
+ echo " --target-branch #### OR -tb ####"
+ echo " Specify the target branch of the merge request (usually develop)."
+ echo ""
+ echo " --target-commit #### OR -tc ####"
+ echo " Specify the target commit ID (SHA-1) of the merge request."
+ echo ""
+ echo "Push Options:"
+ echo "----------------------"
+ echo ""
+ echo " --branch #### OR -br ####"
+ echo " Specify the branch of the push event."
+ echo ""
+ echo " --commit #### OR -co ####"
+ echo " Specify the commit ID (SHA-1) of the push event."
+ echo ""
+ echo ""
+}
+
+function trigger_usage {
+ echo "OAI Test Report script"
+ echo " Original Author: Raphael Defosseux"
+ echo ""
+ echo " --trigger merge-request OR -mr"
+ echo " --trigger push OR -pu"
+ echo " Specify trigger action of the Jenkins job. Either a merge-request event or a push event."
+ echo ""
+}
+
+jb_checker=0
+mr_checker=0
+pu_checker=0
+MR_TRIG=0
+PU_TRIG=0
+while [[ $# -gt 0 ]]
+do
+key="$1"
+
+case $key in
+ -h|--help)
+ shift
+ usage
+ exit 0
+ ;;
+ -gu|--git-url)
+ GIT_URL="$2"
+ let "jb_checker|=0x1"
+ shift
+ shift
+ ;;
+ -jn|--job-name)
+ JOB_NAME="$2"
+ let "jb_checker|=0x2"
+ shift
+ shift
+ ;;
+ -id|--build-id)
+ BUILD_ID="$2"
+ let "jb_checker|=0x4"
+ shift
+ shift
+ ;;
+ --trigger)
+ TRIG="$2"
+ case $TRIG in
+ merge-request)
+ MR_TRIG=1
+ ;;
+ push)
+ PU_TRIG=1
+ ;;
+ *)
+ echo ""
+ echo "Syntax Error: Invalid Trigger option -> $TRIG"
+ echo ""
+ trigger_usage
+ exit
+ ;;
+ esac
+ let "jb_checker|=0x8"
+ shift
+ shift
+ ;;
+ -mr)
+ MR_TRIG=1
+ let "jb_checker|=0x8"
+ shift
+ ;;
+ -pu)
+ PU_TRIG=1
+ let "jb_checker|=0x8"
+ shift
+ ;;
+ -sb|--src-branch)
+ SOURCE_BRANCH="$2"
+ let "mr_checker|=0x1"
+ shift
+ shift
+ ;;
+ -sc|--src-commit)
+ SOURCE_COMMIT_ID="$2"
+ let "mr_checker|=0x2"
+ shift
+ shift
+ ;;
+ -tb|--target-branch)
+ TARGET_BRANCH="$2"
+ let "mr_checker|=0x4"
+ shift
+ shift
+ ;;
+ -tc|--target-commit)
+ TARGET_COMMIT_ID="$2"
+ let "mr_checker|=0x8"
+ shift
+ shift
+ ;;
+ -br|--branch)
+ SOURCE_BRANCH="$2"
+ let "pu_checker|=0x1"
+ shift
+ shift
+ ;;
+ -co|--commit)
+ SOURCE_COMMIT_ID="$2"
+ let "pu_checker|=0x2"
+ shift
+ shift
+ ;;
+ *)
+ echo "Syntax Error: unknown option: $key"
+ echo ""
+ usage
+ exit 1
+ ;;
+esac
+
+done
+
+if [ $jb_checker -ne 15 ]
+then
+ echo ""
+ echo "Syntax Error: missing job information."
+ # TODO : list missing info
+ echo ""
+ exit 1
+fi
+
+if [ $PU_TRIG -eq 1 ] && [ $MR_TRIG -eq 1 ]
+then
+ echo ""
+ echo "Syntax Error: trigger action incoherent."
+ echo ""
+ trigger_usage
+ exit 1
+fi
+
+if [ $PU_TRIG -eq 1 ]
+then
+ if [ $pu_checker -ne 3 ]
+ then
+ echo ""
+ echo "Syntax Error: missing push information."
+ # TODO : list missing info
+ echo ""
+ exit 1
+ fi
+fi
+
+if [ $MR_TRIG -eq 1 ]
+then
+ if [ $mr_checker -ne 15 ]
+ then
+ echo ""
+ echo "Syntax Error: missing merge-request information."
+ # TODO : list missing info
+ echo ""
+ exit 1
+ fi
+fi
+
+echo "" > ./test_simulator_results.html
+echo "" >> ./test_simulator_results.html
+echo "
" >> ./test_simulator_results.html
+echo " Simulator Results for $JOB_NAME job build #$BUILD_ID" >> ./test_simulator_results.html
+echo " " >> ./test_simulator_results.html
+echo "" >> ./test_simulator_results.html
+echo "" >> ./test_simulator_results.html
+echo " " >> ./test_simulator_results.html
+echo "
" >> ./test_simulator_results.html
+echo " " >> ./test_simulator_results.html
+echo " " >> ./test_simulator_results.html
+echo " | GIT Repository | " >> ./test_simulator_results.html
+echo " $GIT_URL | " >> ./test_simulator_results.html
+echo "
" >> ./test_simulator_results.html
+echo " " >> ./test_simulator_results.html
+echo " | Job Trigger | " >> ./test_simulator_results.html
+if [ $PU_TRIG -eq 1 ]; then echo " Push Event | " >> ./test_simulator_results.html; fi
+if [ $MR_TRIG -eq 1 ]; then echo " Merge-Request | " >> ./test_simulator_results.html; fi
+echo "
" >> ./test_simulator_results.html
+if [ $PU_TRIG -eq 1 ]
+then
+ echo " " >> ./test_simulator_results.html
+ echo " | Branch | " >> ./test_simulator_results.html
+ echo " $SOURCE_BRANCH | " >> ./test_simulator_results.html
+ echo "
" >> ./test_simulator_results.html
+ echo " " >> ./test_simulator_results.html
+ echo " | Commit ID | " >> ./test_simulator_results.html
+ echo " $SOURCE_COMMIT_ID | " >> ./test_simulator_results.html
+ echo "
" >> ./test_simulator_results.html
+fi
+if [ $MR_TRIG -eq 1 ]
+then
+ echo " " >> ./test_simulator_results.html
+ echo " | Source Branch | " >> ./test_simulator_results.html
+ echo " $SOURCE_BRANCH | " >> ./test_simulator_results.html
+ echo "
" >> ./test_simulator_results.html
+ echo " " >> ./test_simulator_results.html
+ echo " | Source Commit ID | " >> ./test_simulator_results.html
+ echo " $SOURCE_COMMIT_ID | " >> ./test_simulator_results.html
+ echo "
" >> ./test_simulator_results.html
+ echo " " >> ./test_simulator_results.html
+ echo " | Target Branch | " >> ./test_simulator_results.html
+ echo " $TARGET_BRANCH | " >> ./test_simulator_results.html
+ echo "
" >> ./test_simulator_results.html
+ echo " " >> ./test_simulator_results.html
+ echo " | Target Commit ID | " >> ./test_simulator_results.html
+ echo " $TARGET_COMMIT_ID | " >> ./test_simulator_results.html
+ echo "
" >> ./test_simulator_results.html
+fi
+echo "
" >> ./test_simulator_results.html
+echo " Test Summary
" >> ./test_simulator_results.html
+
+ARCHIVES_LOC=archives/basic_sim/test
+if [ -d $ARCHIVES_LOC ]
+then
+ echo " Basic Simulator Check
" >> ./test_simulator_results.html
+
+ echo " " >> ./test_simulator_results.html
+ echo " " >> ./test_simulator_results.html
+ echo " | Log File Name | " >> ./test_simulator_results.html
+ echo " Command | " >> ./test_simulator_results.html
+ echo " Status | " >> ./test_simulator_results.html
+ echo " Statistics | " >> ./test_simulator_results.html
+ echo "
" >> ./test_simulator_results.html
+
+ BW_CASES=(05 10 20)
+ for BW in ${BW_CASES[@]}
+ do
+ ENB_LOG=$ARCHIVES_LOC/enb_${BW}MHz.log
+ UE_LOG=`echo $ENB_LOG | sed -e "s#enb#ue#"`
+ if [ -f $ENB_LOG ] && [ -f $UE_LOG ]
+ then
+ NAME_ENB=`echo $ENB_LOG | sed -e "s#$ARCHIVES_LOC/##"`
+ NAME_UE=`echo $UE_LOG | sed -e "s#$ARCHIVES_LOC/##"`
+ echo " " >> ./test_simulator_results.html
+ echo " | $NAME_ENB --- $NAME_UE | " >> ./test_simulator_results.html
+ echo " N/A | " >> ./test_simulator_results.html
+ NB_ENB_GOT_SYNC=`egrep -c "got sync" $ENB_LOG`
+ NB_UE_GOT_SYNC=`egrep -c "got sync" $UE_LOG`
+ NB_ENB_SYNCED_WITH_UE=`egrep -c "got UE capabilities for UE" $ENB_LOG`
+ if [ $NB_ENB_GOT_SYNC -eq 1 ] && [ $NB_UE_GOT_SYNC -eq 2 ] && [ $NB_ENB_SYNCED_WITH_UE -eq 1 ]
+ then
+ echo " OK | " >> ./test_simulator_results.html
+ else
+ echo " OK | " >> ./test_simulator_results.html
+ fi
+ echo " " >> ./test_simulator_results.html
+ if [ $NB_ENB_GOT_SYNC -eq 1 ]
+ then
+ echo "- eNB --> got sync" >> ./test_simulator_results.html
+ else
+ echo "- eNB NEVER got sync" >> ./test_simulator_results.html
+ fi
+ if [ $NB_UE_GOT_SYNC -eq 2 ]
+ then
+ echo "- UE --> got sync" >> ./test_simulator_results.html
+ else
+ echo "- UE NEVER got sync" >> ./test_simulator_results.html
+ fi
+ if [ $NB_ENB_SYNCED_WITH_UE -eq 1 ]
+ then
+ echo "- UE attached to eNB" >> ./test_simulator_results.html
+ else
+ echo "- UE NEVER attached to eNB" >> ./test_simulator_results.html
+ fi
+ NB_SEGFAULT_ENB=`egrep -i -c "Segmentation Fault" $ENB_LOG`
+ if [ $NB_SEGFAULT_ENB -ne 0 ]
+ then
+ echo "- eNB --> Segmentation Fault" >> ./test_simulator_results.html
+ fi
+ NB_SEGFAULT_UE=`egrep -i -c "Segmentation Fault" $UE_LOG`
+ if [ $NB_SEGFAULT_UE -ne 0 ]
+ then
+ echo "- UE --> Segmentation Fault" >> ./test_simulator_results.html
+ fi
+ NB_ASSERTION_ENB=`egrep -i -c "Assertion" $ENB_LOG`
+ if [ $NB_ASSERTION_ENB -ne 0 ]
+ then
+ echo "- eNB --> Assertion" >> ./test_simulator_results.html
+ awk 'BEGIN{assertion=10}{if(assertion < 3){print " " $0; assertion++};if ($0 ~/Assertion/){print " " $0;assertion=1}}END{}' $ENB_LOG >> ./test_simulator_results.html
+ fi
+ NB_ASSERTION_UE=`egrep -i -c "Assertion" $UE_LOG`
+ if [ $NB_ASSERTION_UE -ne 0 ]
+ then
+ echo "- eNB --> Assertion" >> ./test_simulator_results.html
+ awk 'BEGIN{assertion=10}{if(assertion < 3){print " " $0; assertion++};if ($0 ~/Assertion/){print " " $0;assertion=1}}END{}' $UE_LOG >> ./test_simulator_results.html
+ fi
+ echo " | " >> ./test_simulator_results.html
+ echo "
" >> ./test_simulator_results.html
+ fi
+ PING_CASE=$ARCHIVES_LOC/${BW}MHz_ping_ue.txt
+ if [ -f $PING_CASE ]
+ then
+ echo " " >> ./test_simulator_results.html
+ NAME=`echo $PING_CASE | sed -e "s#$ARCHIVES_LOC/##"`
+ echo " | $NAME | " >> ./test_simulator_results.html
+ CMD=`egrep "COMMAND IS" $PING_CASE | sed -e "s#COMMAND IS: ##"`
+ echo " $CMD | " >> ./test_simulator_results.html
+ FILE_COMPLETE=`egrep -c "ping statistics" $PING_CASE`
+ if [ $FILE_COMPLETE -eq 0 ]
+ then
+ echo " KO | " >> ./test_simulator_results.html
+ echo " N/A | " >> ./test_simulator_results.html
+ else
+ NB_TR_PACKETS=`egrep "packets transmitted" $PING_CASE | sed -e "s# packets transmitted.*##"`
+ NB_RC_PACKETS=`egrep "packets transmitted" $PING_CASE | sed -e "s#^.*packets transmitted, ##" -e "s# received,.*##"`
+ if [ $NB_TR_PACKETS -eq $NB_RC_PACKETS ]
+ then
+ echo " OK | " >> ./test_simulator_results.html
+ else
+ echo " KO | " >> ./test_simulator_results.html
+ fi
+ echo " " >> ./test_simulator_results.html
+ echo " " >> ./test_simulator_results.html
+ STATS=`egrep "packets transmitted" $PING_CASE | sed -e "s#^.*received, ##" -e "s#, time.*##" -e "s# packet loss##"`
+ echo "Packet Loss : $STATS" >> ./test_simulator_results.html
+ RTTMIN=`egrep "rtt min" $PING_CASE | awk '{split($4,a,"/"); print a[1] " " $5}'`
+ echo "RTT Minimal : $RTTMIN" >> ./test_simulator_results.html
+ RTTAVG=`egrep "rtt min" $PING_CASE | awk '{split($4,a,"/"); print a[2] " " $5}'`
+ echo "RTT Average : $RTTAVG" >> ./test_simulator_results.html
+ RTTMAX=`egrep "rtt min" $PING_CASE | awk '{split($4,a,"/"); print a[3] " " $5}'`
+ echo "RTT Maximal : $RTTMAX" >> ./test_simulator_results.html
+ echo " " >> ./test_simulator_results.html
+ echo " | " >> ./test_simulator_results.html
+ fi
+ echo "
" >> ./test_simulator_results.html
+ fi
+
+ if [ -f $ARCHIVES_LOC/${BW}*iperf*dl*client*txt ]
+ then
+ IPERF_TESTS=`ls $ARCHIVES_LOC/${BW}*iperf*client*txt`
+ else
+ echo "There are no iperf files"
+ IPERF_TESTS=""
+ fi
+ for IPERF_CASE in $IPERF_TESTS
+ do
+ echo " " >> ./test_simulator_results.html
+ NAME=`echo $IPERF_CASE | sed -e "s#$ARCHIVES_LOC/##"`
+ echo " | $NAME | " >> ./test_simulator_results.html
+ CMD=`egrep "COMMAND IS" $IPERF_CASE | sed -e "s#COMMAND IS: ##"`
+ echo " $CMD | " >> ./test_simulator_results.html
+ REQ_BITRATE=`echo $CMD | sed -e "s#^.*-b ##" -e "s#-i 1.*##"`
+ if [[ $REQ_BITRATE =~ .*K.* ]]
+ then
+ REQ_BITRATE=`echo $REQ_BITRATE | sed -e "s#K##"`
+ FLOAT_REQ_BITRATE=`echo "$REQ_BITRATE * 1000.0" | bc -l`
+ fi
+ if [[ $REQ_BITRATE =~ .*M.* ]]
+ then
+ REQ_BITRATE=`echo $REQ_BITRATE | sed -e "s#M##"`
+ FLOAT_REQ_BITRATE=`echo "$REQ_BITRATE * 1000000.0" | bc -l`
+ fi
+ if [[ $REQ_BITRATE =~ .*G.* ]]
+ then
+ REQ_BITRATE=`echo $REQ_BITRATE | sed -e "s#G##"`
+ FLOAT_REQ_BITRATE=`echo "$REQ_BITRATE * 1000000000.0" | bc -l`
+ fi
+ FILE_COMPLETE=`egrep -c "Server Report" $IPERF_CASE`
+ if [ $FILE_COMPLETE -eq 0 ]
+ then
+ echo " KO | " >> ./test_simulator_results.html
+ SERVER_FILE=`echo $IPERF_CASE | sed -e "s#client#server#"`
+ FLOAT_EFF_BITRATE=`grep --color=never sec $SERVER_FILE | sed -e "s#^.*Bytes *##" -e "s#sec *.*#sec#" | awk 'BEGIN{s=0;n=0}{n++;if ($2 ~/Mbits/){a = $1 * 1000000};if ($2 ~/Kbits/){a = $1 * 1000};s=s+a}END{br=s/n; printf "%.0f", br}'`
+ EFFECTIVE_BITRATE=`grep --color=never sec $SERVER_FILE | sed -e "s#^.*Bytes *##" -e "s#sec *.*#sec#" | awk 'BEGIN{s=0;n=0}{n++;if ($2 ~/Mbits/){a = $1 * 1000000};if ($2 ~/Kbits/){a = $1 * 1000};s=s+a}END{br=s/n; if(br>1000000){printf "%.2f MBits/sec", br/1000000}}'`
+ PERF=`echo "100 * $FLOAT_EFF_BITRATE / $FLOAT_REQ_BITRATE" | bc -l | awk '{printf "%.2f", $0}'`
+ JITTER=`grep --color=never sec $SERVER_FILE | sed -e "s#^.*/sec *##" -e "s# *ms.*##" | awk 'BEGIN{s=0;n=0}{n++;s+=$1}END{jitter=s/n; printf "%.3f ms", jitter}'`
+ PACKETLOSS_NOSIGN=`grep --color=never sec $SERVER_FILE | sed -e "s#^.*(##" -e "s#%.*##" | awk 'BEGIN{s=0;n=0}{n++;s+=$1}END{per=s/n; printf "%.1f", per}'`
+ PACKETLOSS=`echo "${PACKETLOSS_NOSIGN}%"`
+ else
+ EFFECTIVE_BITRATE=`tail -n3 $IPERF_CASE | egrep "Mbits/sec" | sed -e "s#^.*MBytes *##" -e "s#sec.*#sec#"`
+ if [[ $EFFECTIVE_BITRATE =~ .*Kbits/sec.* ]]
+ then
+ EFFECTIVE_BITRATE=`echo $EFFECTIVE_BITRATE | sed -e "s# *Kbits/sec.*##"`
+ FLOAT_EFF_BITRATE=`echo "$EFFECTIVE_BITRATE * 1000" | bc -l`
+ fi
+ if [[ $EFFECTIVE_BITRATE =~ .*Mbits/sec.* ]]
+ then
+ EFFECTIVE_BITRATE=`echo $EFFECTIVE_BITRATE | sed -e "s# *Mbits/sec.*##"`
+ FLOAT_EFF_BITRATE=`echo "$EFFECTIVE_BITRATE * 1000000" | bc -l`
+ fi
+ if [[ $EFFECTIVE_BITRATE =~ .*Gbits/sec.* ]]
+ then
+ EFFECTIVE_BITRATE=`echo $EFFECTIVE_BITRATE | sed -e "s# *Gbits/sec.*##"`
+ FLOAT_EFF_BITRATE=`echo "$EFFECTIVE_BITRATE * 1000000000" | bc -l`
+ fi
+ PERF=`echo "100 * $FLOAT_EFF_BITRATE / $FLOAT_REQ_BITRATE" | bc -l | awk '{printf "%.2f", $0}'`
+ PERF_INT=`echo "100 * $FLOAT_EFF_BITRATE / $FLOAT_REQ_BITRATE" | bc -l | awk '{printf "%.0f", $0}'`
+ if [[ $PERF_INT -lt 90 ]]
+ then
+ echo " KO | " >> ./test_simulator_results.html
+ else
+ echo " OK | " >> ./test_simulator_results.html
+ fi
+ EFFECTIVE_BITRATE=`tail -n3 $IPERF_CASE | egrep "Mbits/sec" | sed -e "s#^.*MBytes *##" -e "s#sec.*#sec#"`
+ JITTER=`tail -n3 $IPERF_CASE | egrep "Mbits/sec" | sed -e "s#^.*Mbits/sec *##" -e "s#ms.*#ms#"`
+ PACKETLOSS=`tail -n3 $IPERF_CASE | egrep "Mbits/sec" | sed -e "s#^.*(##" -e "s#).*##"`
+ fi
+ echo " " >> ./test_simulator_results.html
+ echo " " >> ./test_simulator_results.html
+ echo "Bitrate : $EFFECTIVE_BITRATE" >> ./test_simulator_results.html
+ echo "Bitrate Perf : $PERF %" >> ./test_simulator_results.html
+ echo "Jitter : $JITTER" >> ./test_simulator_results.html
+ echo "Packet Loss : $PACKETLOSS" >> ./test_simulator_results.html
+ echo " " >> ./test_simulator_results.html
+ echo " | " >> ./test_simulator_results.html
+ echo "
" >> ./test_simulator_results.html
+ done
+ done
+
+ echo "
" >> ./test_simulator_results.html
+fi
+
+ARCHIVES_LOC=archives/phy_sim/test
+if [ -d $ARCHIVES_LOC ]
+then
+ echo " Physical Simulators Check
" >> ./test_simulator_results.html
+
+ echo " " >> ./test_simulator_results.html
+ echo " " >> ./test_simulator_results.html
+ echo " | Log File Name | " >> ./test_simulator_results.html
+ echo " Nb Tests | " >> ./test_simulator_results.html
+ echo " Nb Errors | " >> ./test_simulator_results.html
+ echo " Nb Failures | " >> ./test_simulator_results.html
+ echo " Nb Failures | " >> ./test_simulator_results.html
+ echo "
" >> ./test_simulator_results.html
+
+ XML_TESTS=`ls $ARCHIVES_LOC/*xml`
+ for XML_FILE in $XML_TESTS
+ do
+ echo " " >> ./test_simulator_results.html
+ NAME=`echo $XML_FILE | sed -e "s#$ARCHIVES_LOC/##"`
+ NB_TESTS=`egrep "testsuite errors" $XML_FILE | sed -e "s#^.*tests='##" -e "s#' *time=.*##"`
+ NB_ERRORS=`egrep "testsuite errors" $XML_FILE | sed -e "s#^.*errors='##" -e "s#' *failures=.*##"`
+ NB_FAILURES=`egrep "testsuite errors" $XML_FILE | sed -e "s#^.*failures='##" -e "s#' *hostname=.*##"`
+ NB_SKIPPED=`egrep "testsuite errors" $XML_FILE | sed -e "s#^.*skipped='##" -e "s#' *tests=.*##"`
+ if [ $NB_ERRORS -eq 0 ] && [ $NB_FAILURES -eq 0 ]
+ then
+ echo " | $NAME | " >> ./test_simulator_results.html
+ else
+ echo " $NAME | " >> ./test_simulator_results.html
+ fi
+ echo " $NB_TESTS | " >> ./test_simulator_results.html
+ echo " $NB_ERRORS | " >> ./test_simulator_results.html
+ echo " $NB_FAILURES | " >> ./test_simulator_results.html
+ echo " $NB_SKIPPED | " >> ./test_simulator_results.html
+ echo "
" >> ./test_simulator_results.html
+ done
+
+ echo "
" >> ./test_simulator_results.html
+
+ echo " Details
" >> ./test_simulator_results.html
+ for XML_FILE in $XML_TESTS
+ do
+ echo " " >> ./test_simulator_results.html
+ echo " " >> ./test_simulator_results.html
+ echo " | Test Name | " >> ./test_simulator_results.html
+ echo " Description | " >> ./test_simulator_results.html
+ echo " Result | " >> ./test_simulator_results.html
+ echo " Time | " >> ./test_simulator_results.html
+ echo "
" >> ./test_simulator_results.html
+ TESTCASES_LIST=`sed -e "s# #@#g" $XML_FILE | grep testcase`
+ for TESTCASE in $TESTCASES_LIST
+ do
+ echo " " >> ./test_simulator_results.html
+ NAME=`echo $TESTCASE | sed -e "s#^.*name='##" -e "s#'@description=.*##" | sed -e "s#@# #g"`
+ echo " | $NAME | " >> ./test_simulator_results.html
+ DESC=`echo $TESTCASE | sed -e "s#^.*description='##" -e "s#'@Run_result=.*##" | sed -e "s#@# #g"`
+ echo " $DESC | " >> ./test_simulator_results.html
+ RESULT=`echo $TESTCASE | sed -e "s#^.*RESULT='##" -e "s#'.*##" | sed -e "s#@# #g"`
+ if [[ $RESULT =~ .*PASS.* ]]
+ then
+ echo " $RESULT | " >> ./test_simulator_results.html
+ else
+ echo " $RESULT | " >> ./test_simulator_results.html
+ fi
+ TIME=`echo $TESTCASE | sed -e "s#^.*time='##" -e "s#'@RESULT=.*##" | sed -e "s#@# #g"`
+ echo " $TIME | " >> ./test_simulator_results.html
+ echo "
" >> ./test_simulator_results.html
+ done
+ echo "
" >> ./test_simulator_results.html
+ done
+fi
+
+echo "" >> ./test_simulator_results.html
+echo "" >> ./test_simulator_results.html
+
+exit 0
diff --git a/ci-scripts/runTestOnVM.sh b/ci-scripts/runTestOnVM.sh
index 68438758f5..6abdf35507 100755
--- a/ci-scripts/runTestOnVM.sh
+++ b/ci-scripts/runTestOnVM.sh
@@ -70,6 +70,196 @@ function variant_usage {
echo ""
}
+function start_basic_sim_enb {
+ local LOC_VM_IP_ADDR=$2
+ local LOC_EPC_IP_ADDR=$3
+ local LOC_LOG_FILE=$4
+ local LOC_NB_RBS=$5
+ echo "cd /home/ubuntu/tmp" > $1
+ echo "echo \"sudo apt-get --yes --quiet install daemon \"" >> $1
+ echo "sudo apt-get --yes install daemon >> /home/ubuntu/tmp/cmake_targets/log/daemon-install.txt 2>&1" >> $1
+ echo "echo \"export ENODEB=1\"" >> $1
+ echo "export ENODEB=1" >> $1
+ echo "echo \"source oaienv\"" >> $1
+ echo "source oaienv" >> $1
+ echo "cd ci-scripts/conf_files/" >> $1
+ echo "cp lte-basic-sim.conf ci-lte-basic-sim.conf" >> $1
+ echo "sed -i -e 's#N_RB_DL.*=.*;#N_RB_DL = $LOC_NB_RBS;#' -e 's#CI_MME_IP_ADDR#$LOC_EPC_IP_ADDR#' -e 's#CI_ENB_IP_ADDR#$LOC_VM_IP_ADDR#' ci-lte-basic-sim.conf" >> $1
+ echo "echo \"grep N_RB_DL ci-lte-basic-sim.conf\"" >> $1
+ echo "grep N_RB_DL ci-lte-basic-sim.conf | sed -e 's#N_RB_DL.*=#N_RB_DL =#'" >> $1
+ echo "echo \"cd /home/ubuntu/tmp/cmake_targets/basic_simulator/enb/\"" >> $1
+ echo "cd /home/ubuntu/tmp/cmake_targets/basic_simulator/enb/" >> $1
+ echo "echo \"./lte-softmodem -O /home/ubuntu/tmp/ci-scripts/conf_files/ci-lte-basic-sim.conf\" > ./my-lte-softmodem-run.sh " >> $1
+ echo "chmod 775 ./my-lte-softmodem-run.sh" >> $1
+ echo "cat ./my-lte-softmodem-run.sh" >> $1
+ echo "sudo -E daemon --inherit --unsafe --name=enb_daemon --chdir=/home/ubuntu/tmp/cmake_targets/basic_simulator/enb -o /home/ubuntu/tmp/cmake_targets/log/$LOC_LOG_FILE ./my-lte-softmodem-run.sh" >> $1
+
+ ssh -o StrictHostKeyChecking=no ubuntu@$LOC_VM_IP_ADDR < $1
+ sleep 60
+ rm $1
+}
+
+function start_basic_sim_ue {
+ local LOC_UE_LOG_FILE=$3
+ local LOC_NB_RBS=$4
+ echo "echo \"cd /home/ubuntu/tmp/cmake_targets/basic_simulator/ue\"" > $1
+ echo "cd /home/ubuntu/tmp/cmake_targets/basic_simulator/ue" > $1
+ echo "echo \"./lte-uesoftmodem -C 2680000000 -r $LOC_NB_RBS --ue-rxgain 140\" > ./my-lte-uesoftmodem-run.sh" >> $1
+ echo "chmod 775 ./my-lte-uesoftmodem-run.sh" >> $1
+ echo "cat ./my-lte-uesoftmodem-run.sh" >> $1
+ echo "sudo -E daemon --inherit --unsafe --name=ue_daemon --chdir=/home/ubuntu/tmp/cmake_targets/basic_simulator/ue -o /home/ubuntu/tmp/cmake_targets/log/$LOC_UE_LOG_FILE ./my-lte-uesoftmodem-run.sh" >> $1
+
+ ssh -o StrictHostKeyChecking=no ubuntu@$2 < $1
+ rm $1
+
+ local i="0"
+ echo "ifconfig oip1 | egrep -c \"inet addr\"" > $1
+ while [ $i -lt 40 ]
+ do
+ sleep 5
+ CONNECTED=`ssh -o StrictHostKeyChecking=no ubuntu@$2 < $1`
+ if [ $CONNECTED -eq 1 ]
+ then
+ i="100"
+ else
+ i=$[$i+1]
+ fi
+ done
+ rm $1
+ if [ $i -lt 50 ]
+ then
+ UE_SYNC=0
+ else
+ UE_SYNC=1
+ fi
+}
+
+function get_ue_ip_addr {
+ echo "ifconfig oip1 | egrep \"inet addr\" | sed -e 's#^.*inet addr:##' -e 's# P-t-P:.*\$##'" > $1
+ UE_IP_ADDR=`ssh -o StrictHostKeyChecking=no ubuntu@$2 < $1`
+ echo "UE IP Address for EPC is : $UE_IP_ADDR"
+ rm $1
+}
+
+function ping_ue_ip_addr {
+ echo "echo \"ping -c 20 $3\"" > $1
+ echo "echo \"COMMAND IS: ping -c 20 $3\" > $4" > $1
+ echo "ping -c 20 $UE_IP_ADDR | tee -a $4" >> $1
+ ssh -o StrictHostKeyChecking=no ubuntu@$2 < $1
+ rm -f $1
+}
+
+function check_ping_result {
+ local LOC_PING_FILE=$1
+ local LOC_NB_PINGS=$2
+ if [ -f $LOC_PING_FILE ]
+ then
+ local FILE_COMPLETE=`egrep -c "ping statistics" $LOC_PING_FILE`
+ if [ $FILE_COMPLETE -eq 0 ]
+ then
+ PING_STATUS=-1
+ else
+ local ALL_PACKET_RECEIVED=`egrep -c "$LOC_NB_PINGS received" $LOC_PING_FILE`
+ if [ $ALL_PACKET_RECEIVED -eq 1 ]
+ then
+ echo "got all ping packets"
+ else
+ PING_STATUS=-1
+ fi
+ fi
+ else
+ PING_STATUS=-1
+ fi
+}
+
+function iperf_dl {
+ local REQ_BANDWIDTH=$5
+ local BASE_LOG_FILE=$6
+ echo "echo \"iperf -u -s -i 1\"" > $1
+ echo "echo \"COMMAND IS: iperf -u -s -i 1\" > tmp/cmake_targets/log/${BASE_LOG_FILE}_server.txt" > $1
+ echo "nohup iperf -u -s -i 1 >> tmp/cmake_targets/log/${BASE_LOG_FILE}_server.txt &" >> $1
+ ssh -o StrictHostKeyChecking=no ubuntu@$2 < $1
+ rm $1
+
+ echo "echo \"iperf -c $UE_IP_ADDR -u -t 30 -b ${REQ_BANDWIDTH}M -i 1\"" > $3
+ echo "echo \"COMMAND IS: iperf -c $UE_IP_ADDR -u -t 30 -b ${REQ_BANDWIDTH}M -i 1\" > ${BASE_LOG_FILE}_client.txt" > $3
+ echo "iperf -c $UE_IP_ADDR -u -t 30 -b ${REQ_BANDWIDTH}M -i 1 | tee -a ${BASE_LOG_FILE}_client.txt" >> $3
+ ssh -o StrictHostKeyChecking=no ubuntu@$4 < $3
+ rm -f $3
+
+ echo "killall --signal SIGKILL iperf" >> $1
+ ssh -o StrictHostKeyChecking=no ubuntu@$2 < $1
+ rm $1
+}
+
+function iperf_ul {
+ local REQ_BANDWIDTH=$5
+ local BASE_LOG_FILE=$6
+ echo "echo \"iperf -u -s -i 1\"" > $3
+ echo "echo \"COMMAND IS: iperf -u -s -i 1\" > ${BASE_LOG_FILE}_server.txt" > $3
+ echo "nohup iperf -u -s -i 1 >> ${BASE_LOG_FILE}_server.txt &" >> $3
+ ssh -o StrictHostKeyChecking=no ubuntu@$4 < $3
+ rm $3
+
+ echo "echo \"iperf -c $REAL_EPC_IP_ADDR -u -t 30 -b ${REQ_BANDWIDTH}M -i 1\"" > $1
+ echo "echo \"COMMAND IS: iperf -c $REAL_EPC_IP_ADDR -u -t 30 -b ${REQ_BANDWIDTH}M -i 1\" > /home/ubuntu/tmp/cmake_targets/log/${BASE_LOG_FILE}_client.txt" > $1
+ echo "iperf -c $REAL_EPC_IP_ADDR -u -t 30 -b ${REQ_BANDWIDTH}M -i 1 | tee -a /home/ubuntu/tmp/cmake_targets/log/${BASE_LOG_FILE}_client.txt" >> $1
+ ssh -o StrictHostKeyChecking=no ubuntu@$2 < $1
+ rm -f $1
+
+ echo "killall --signal SIGKILL iperf" >> $3
+ ssh -o StrictHostKeyChecking=no ubuntu@$4 < $3
+ rm $3
+}
+
+function check_iperf {
+ local LOC_BASE_LOG=$1
+ local LOC_REQ_BW=$2
+ local LOC_REQ_BW_MINUS_ONE=`echo "$LOC_REQ_BW - 1" | bc -l`
+ if [ -f ${LOC_BASE_LOG}_client.txt ]
+ then
+ local FILE_COMPLETE=`egrep -c "Server Report" ${LOC_BASE_LOG}_client.txt`
+ if [ $FILE_COMPLETE -eq 0 ]
+ then
+ IPERF_STATUS=-1
+ else
+ local EFFECTIVE_BANDWIDTH=`tail -n3 ${LOC_BASE_LOG}_client.txt | egrep "Mbits/sec" | sed -e "s#^.*MBytes *##" -e "s#sec.*#sec#"`
+ if [[ $EFFECTIVE_BANDWIDTH =~ .*${LOC_REQ_BW}.*Mbits.* ]] || [[ $EFFECTIVE_BANDWIDTH =~ .*${LOC_REQ_BW_MINUS_ONE}.*Mbits.* ]]
+ then
+ echo "got requested DL bandwidth: $EFFECTIVE_BANDWIDTH"
+ else
+ IPERF_STATUS=-1
+ fi
+ fi
+ else
+ IPERF_STATUS=-1
+ fi
+}
+
+function terminate_enb_ue_basic_sim {
+ echo "echo \"sudo daemon --name=enb_daemon --stop\"" > $1
+ echo "sudo daemon --name=enb_daemon --stop" >> $1
+ echo "echo \"sudo daemon --name=ue_daemon --stop\"" >> $1
+ echo "sudo daemon --name=ue_daemon --stop" >> $1
+ echo "echo \"sudo killall --signal SIGKILL lte-softmodem\"" >> $1
+ echo "sudo killall --signal SIGKILL lte-softmodem" >> $1
+ ssh -o StrictHostKeyChecking=no ubuntu@$2 < $1
+ rm -f $1
+}
+
+function terminate_ltebox_epc {
+ echo "echo \"cd /opt/ltebox/tools\"" > $1
+ echo "cd /opt/ltebox/tools" >> $1
+ echo "echo \"sudo ./stop_ltebox\"" >> $1
+ echo "sudo ./stop_ltebox" >> $1
+ echo "echo \"sudo daemon --name=simulated_hss --stop\"" >> $1
+ echo "sudo daemon --name=simulated_hss --stop" >> $1
+ echo "echo \"sudo killall --signal SIGKILL hss_sim\"" >> $1
+ echo "sudo killall --signal SIGKILL hss_sim" >> $1
+ ssh -o StrictHostKeyChecking=no ubuntu@$2 < $1
+ rm $1
+}
+
if [ $# -lt 1 ] || [ $# -gt 9 ]
then
echo "Syntax Error: not the correct number of arguments"
@@ -122,6 +312,8 @@ case $key in
;;
-v2)
VM_NAME=ci-basic-sim
+ RUN_OPTIONS="complex"
+ ARCHIVES_LOC=basic_sim/test
shift
;;
-v3)
@@ -150,6 +342,8 @@ case $key in
;;
basic-sim)
VM_NAME=ci-basic-sim
+ RUN_OPTIONS="complex"
+ ARCHIVES_LOC=basic_sim/test
;;
phy-sim)
VM_NAME=ci-phy-sim
@@ -210,8 +404,11 @@ echo "$VM_NAME has for IP addr = $VM_IP_ADDR"
if [ "$RUN_OPTIONS" == "none" ]
then
echo "No run on VM testing for this variant currently"
-else
+ exit $STATUS
+fi
+if [[ $RUN_OPTIONS =~ .*run_exec_autotests.* ]]
+then
echo "############################################################"
echo "Running test script on VM ($VM_NAME)"
echo "############################################################"
@@ -271,7 +468,7 @@ else
rm -f $VM_CMDS
echo "############################################################"
- echo "Checking build status"
+ echo "Checking run status"
echo "############################################################"
LOG_FILES=`ls $ARCHIVES_LOC/results_autotests*.xml`
@@ -306,13 +503,346 @@ else
if [ $NB_RUNS -eq 0 ]; then STATUS=-1; fi
if [ $NB_FAILURES -ne 0 ]; then STATUS=-1; fi
- if [ $STATUS -eq 0 ]
+fi
+
+if [[ "$RUN_OPTIONS" == "complex" ]] && [[ $VM_NAME =~ .*-basic-sim.* ]]
+then
+ PING_STATUS=0
+ IPERF_STATUS=0
+ if [ -d $ARCHIVES_LOC ]
then
- echo "STATUS seems OK"
- else
- echo "STATUS failed?"
+ rm -Rf $ARCHIVES_LOC
fi
+ mkdir --parents $ARCHIVES_LOC
+
+ EPC_VM_NAME=`echo $VM_NAME | sed -e "s#basic-sim#epc#"`
+ LTEBOX=0
+ if [ -d /opt/ltebox-archives/ ]
+ then
+ # Checking if all ltebox archives are available to run ltebx epc on a brand new VM
+ if [ -f /opt/ltebox-archives/ltebox_2.2.70_16_04_amd64.deb ] && [ -f /opt/ltebox-archives/etc-conf.zip ] && [ -f /opt/ltebox-archives/hss-sim.zip ]
+ then
+ echo "############################################################"
+ echo "Test EPC on VM ($EPC_VM_NAME) will be using ltebox"
+ echo "############################################################"
+ LTEBOX=1
+ fi
+ fi
+ # Here we could have other types of EPC detection
+
+ # Do we need to start the EPC VM
+ EPC_VM_CMDS=`echo $VM_CMDS | sed -e "s#cmds#epc-cmds#"`
+ echo "EPC_VM_CMD_FILE = $EPC_VM_CMDS"
+ IS_EPC_VM_ALIVE=`uvt-kvm list | grep -c $EPC_VM_NAME`
+ if [ $IS_EPC_VM_ALIVE -eq 0 ]
+ then
+ echo "############################################################"
+ echo "Creating test EPC VM ($EPC_VM_NAME) on Ubuntu Cloud Image base"
+ echo "############################################################"
+ uvt-kvm create $EPC_VM_NAME release=xenial --unsafe-caching
+ fi
+
+ uvt-kvm wait $EPC_VM_NAME --insecure
+ EPC_VM_IP_ADDR=`uvt-kvm ip $EPC_VM_NAME`
+ echo "$EPC_VM_NAME has for IP addr = $EPC_VM_IP_ADDR"
+ scp -o StrictHostKeyChecking=no /etc/apt/apt.conf.d/01proxy ubuntu@$EPC_VM_IP_ADDR:/home/ubuntu
+
+ # ltebox specific actions (install and start)
+ LTE_BOX_TO_INSTALL=1
+ if [ $LTEBOX -eq 1 ]
+ then
+ echo "ls -ls /opt/ltebox/tools/start_ltebox" > $EPC_VM_CMDS
+ RESPONSE=`ssh -o StrictHostKeyChecking=no ubuntu@$EPC_VM_IP_ADDR < $EPC_VM_CMDS`
+ NB_EXES=`echo $RESPONSE | grep -c ltebox`
+ if [ $NB_EXES -eq 1 ]; then LTE_BOX_TO_INSTALL=0; fi
+ fi
+
+ if [ $LTEBOX -eq 1 ] && [ $LTE_BOX_TO_INSTALL -eq 1 ]
+ then
+ echo "############################################################"
+ echo "Copying ltebox archives into EPC VM ($EPC_VM_NAME)"
+ echo "############################################################"
+ scp -o StrictHostKeyChecking=no /opt/ltebox-archives/ltebox_2.2.70_16_04_amd64.deb ubuntu@$EPC_VM_IP_ADDR:/home/ubuntu
+ scp -o StrictHostKeyChecking=no /opt/ltebox-archives/etc-conf.zip ubuntu@$EPC_VM_IP_ADDR:/home/ubuntu
+ scp -o StrictHostKeyChecking=no /opt/ltebox-archives/hss-sim.zip ubuntu@$EPC_VM_IP_ADDR:/home/ubuntu
+
+ echo "############################################################"
+ echo "Install EPC on EPC VM ($EPC_VM_NAME)"
+ echo "############################################################"
+ echo "sudo cp 01proxy /etc/apt/apt.conf.d/" > $EPC_VM_CMDS
+ echo "touch /home/ubuntu/.hushlogin" >> $EPC_VM_CMDS
+ echo "echo \"sudo apt-get --yes --quiet install zip openjdk-8-jre libconfuse-dev libreadline-dev liblog4c-dev libgcrypt-dev libsctp-dev python2.7 python2.7-dev daemon iperf\"" >> $EPC_VM_CMDS
+ echo "sudo apt-get update > zip-install.txt 2>&1" >> $EPC_VM_CMDS
+ echo "sudo apt-get --yes install zip openjdk-8-jre libconfuse-dev libreadline-dev liblog4c-dev libgcrypt-dev libsctp-dev python2.7 python2.7-dev daemon iperf >> zip-install.txt 2>&1" >> $EPC_VM_CMDS
+
+ # Installing HSS
+ echo "echo \"cd /opt\"" >> $EPC_VM_CMDS
+ echo "cd /opt" >> $EPC_VM_CMDS
+ echo "echo \"sudo unzip -qq /home/ubuntu/hss-sim.zip\"" >> $EPC_VM_CMDS
+ echo "sudo unzip -qq /home/ubuntu/hss-sim.zip" >> $EPC_VM_CMDS
+ echo "echo \"cd /opt/hss_sim0609\"" >> $EPC_VM_CMDS
+ echo "cd /opt/hss_sim0609" >> $EPC_VM_CMDS
+
+ # Installing ltebox
+ echo "echo \"cd /home/ubuntu\"" >> $EPC_VM_CMDS
+ echo "cd /home/ubuntu" >> $EPC_VM_CMDS
+ echo "echo \"sudo dpkg -i ltebox_2.2.70_16_04_amd64.deb \"" >> $EPC_VM_CMDS
+ echo "sudo dpkg -i ltebox_2.2.70_16_04_amd64.deb >> zip-install.txt 2>&1" >> $EPC_VM_CMDS
+
+ echo "echo \"cd /opt/ltebox/etc/\"" >> $EPC_VM_CMDS
+ echo "cd /opt/ltebox/etc/" >> $EPC_VM_CMDS
+ echo "echo \"sudo unzip -qq -o /home/ubuntu/etc-conf.zip\"" >> $EPC_VM_CMDS
+ echo "sudo unzip -qq -o /home/ubuntu/etc-conf.zip" >> $EPC_VM_CMDS
+ echo "sudo sed -i -e 's#EPC_VM_IP_ADDRESS#$EPC_VM_IP_ADDR#' gw.conf" >> $EPC_VM_CMDS
+ echo "sudo sed -i -e 's#EPC_VM_IP_ADDRESS#$EPC_VM_IP_ADDR#' mme.conf" >> $EPC_VM_CMDS
+ fi
+
+ # Starting EPC
+ if [ $LTEBOX -eq 1 ]
+ then
+ echo "############################################################"
+ echo "Start EPC on EPC VM ($EPC_VM_NAME)"
+ echo "############################################################"
+ echo "echo \"cd /opt/hss_sim0609\"" >> $EPC_VM_CMDS
+ echo "cd /opt/hss_sim0609" >> $EPC_VM_CMDS
+ echo "echo \"sudo daemon --unsafe --name=simulated_hss --chdir=/opt/hss_sim0609 ./starthss_real\"" >> $EPC_VM_CMDS
+ echo "sudo daemon --unsafe --name=simulated_hss --chdir=/opt/hss_sim0609 ./starthss_real" >> $EPC_VM_CMDS
+
+ echo "echo \"cd /opt/ltebox/tools/\"" >> $EPC_VM_CMDS
+ echo "cd /opt/ltebox/tools/" >> $EPC_VM_CMDS
+ echo "echo \"sudo ./start_ltebox\"" >> $EPC_VM_CMDS
+ echo "nohup sudo ./start_ltebox > /home/ubuntu/ltebox.txt" >> $EPC_VM_CMDS
+
+ ssh -o StrictHostKeyChecking=no ubuntu@$EPC_VM_IP_ADDR < $EPC_VM_CMDS
+ rm -f $EPC_VM_CMDS
+
+ # We may have some adaptation to do
+ if [ -f /opt/ltebox-archives/adapt_ue_sim.txt ]
+ then
+ echo "############################################################"
+ echo "Doing some adaptation on UE side"
+ echo "############################################################"
+ ssh -o StrictHostKeyChecking=no ubuntu@$VM_IP_ADDR < /opt/ltebox-archives/adapt_ue_sim.txt
+ fi
+
+ i="0"
+ echo "ifconfig tun5 | egrep -c \"inet addr\"" > $EPC_VM_CMDS
+ while [ $i -lt 10 ]
+ do
+ sleep 2
+ CONNECTED=`ssh -o StrictHostKeyChecking=no ubuntu@$EPC_VM_IP_ADDR < $EPC_VM_CMDS`
+ if [ $CONNECTED -eq 1 ]
+ then
+ i="100"
+ else
+ i=$[$i+1]
+ fi
+ done
+ rm $EPC_VM_CMDS
+ if [ $i -lt 50 ]
+ then
+ echo "Problem w/ starting ltebox EPC"
+ exit -1
+ fi
+ fi
+
+ # HERE ADD ANY INSTALL ACTIONS FOR ANOTHER EPC
+
+ # Retrieve EPC real IP address
+ if [ $LTEBOX -eq 1 ]
+ then
+ # in our configuration file, we are using pool 5
+ echo "ifconfig tun5 | egrep \"inet addr\" | sed -e 's#^.*inet addr:##' -e 's# P-t-P:.*\$##'" > $EPC_VM_CMDS
+ REAL_EPC_IP_ADDR=`ssh -o StrictHostKeyChecking=no ubuntu@$EPC_VM_IP_ADDR < $EPC_VM_CMDS`
+ echo "EPC IP Address is : $REAL_EPC_IP_ADDR"
+ rm $EPC_VM_CMDS
+ fi
+
+ echo "############################################################"
+ echo "Starting the eNB at 5MHz"
+ echo "############################################################"
+ CURRENT_ENB_LOG_FILE=enb_05MHz.log
+ start_basic_sim_enb $VM_CMDS $VM_IP_ADDR $EPC_VM_IP_ADDR $CURRENT_ENB_LOG_FILE 25
+
+ echo "############################################################"
+ echo "Starting the UE at 5MHz"
+ echo "############################################################"
+ CURRENT_UE_LOG_FILE=ue_05MHz.log
+ start_basic_sim_ue $VM_CMDS $VM_IP_ADDR $CURRENT_UE_LOG_FILE 25
+ if [ $UE_SYNC -eq 0 ]
+ then
+ echo "Problem w/ eNB and UE not syncing"
+ terminate_enb_ue_basic_sim $VM_CMDS $VM_IP_ADDR
+ scp -o StrictHostKeyChecking=no ubuntu@$VM_IP_ADDR:/home/ubuntu/tmp/cmake_targets/log/$CURRENT_ENB_LOG_FILE $ARCHIVES_LOC
+ scp -o StrictHostKeyChecking=no ubuntu@$VM_IP_ADDR:/home/ubuntu/tmp/cmake_targets/log/$CURRENT_UE_LOG_FILE $ARCHIVES_LOC
+ terminate_ltebox_epc $EPC_VM_CMDS $EPC_VM_IP_ADDR
+ exit -1
+ fi
+ get_ue_ip_addr $VM_CMDS $VM_IP_ADDR
+
+ echo "############################################################"
+ echo "Pinging the UE"
+ echo "############################################################"
+ ping_ue_ip_addr $EPC_VM_CMDS $EPC_VM_IP_ADDR $UE_IP_ADDR 05MHz_ping_ue.txt
+ scp -o StrictHostKeyChecking=no ubuntu@$EPC_VM_IP_ADDR:/home/ubuntu/05MHz_ping_ue.txt $ARCHIVES_LOC
+ check_ping_result $ARCHIVES_LOC/05MHz_ping_ue.txt 20
+
+ echo "############################################################"
+ echo "Iperf DL"
+ echo "############################################################"
+ CURR_IPERF_LOG_BASE=05MHz_iperf_dl
+ iperf_dl $VM_CMDS $VM_IP_ADDR $EPC_VM_CMDS $EPC_VM_IP_ADDR 15 $CURR_IPERF_LOG_BASE
+ scp -o StrictHostKeyChecking=no ubuntu@$EPC_VM_IP_ADDR:/home/ubuntu/${CURR_IPERF_LOG_BASE}_client.txt $ARCHIVES_LOC
+ scp -o StrictHostKeyChecking=no ubuntu@$VM_IP_ADDR:/home/ubuntu/tmp/cmake_targets/log/${CURR_IPERF_LOG_BASE}_server.txt $ARCHIVES_LOC
+ check_iperf $ARCHIVES_LOC/$CURR_IPERF_LOG_BASE 15
+
+ echo "############################################################"
+ echo "Iperf UL"
+ echo "############################################################"
+ CURR_IPERF_LOG_BASE=05MHz_iperf_ul
+ iperf_ul $VM_CMDS $VM_IP_ADDR $EPC_VM_CMDS $EPC_VM_IP_ADDR 2 $CURR_IPERF_LOG_BASE
+ scp -o StrictHostKeyChecking=no ubuntu@$EPC_VM_IP_ADDR:/home/ubuntu/${CURR_IPERF_LOG_BASE}_server.txt $ARCHIVES_LOC
+ scp -o StrictHostKeyChecking=no ubuntu@$VM_IP_ADDR:/home/ubuntu/tmp/cmake_targets/log/${CURR_IPERF_LOG_BASE}_client.txt $ARCHIVES_LOC
+ check_iperf $ARCHIVES_LOC/$CURR_IPERF_LOG_BASE 2
+
+ echo "############################################################"
+ echo "Terminate enb/ue simulators"
+ echo "############################################################"
+ terminate_enb_ue_basic_sim $VM_CMDS $VM_IP_ADDR
+ scp -o StrictHostKeyChecking=no ubuntu@$VM_IP_ADDR:/home/ubuntu/tmp/cmake_targets/log/$CURRENT_ENB_LOG_FILE $ARCHIVES_LOC
+ scp -o StrictHostKeyChecking=no ubuntu@$VM_IP_ADDR:/home/ubuntu/tmp/cmake_targets/log/$CURRENT_UE_LOG_FILE $ARCHIVES_LOC
+
+ echo "############################################################"
+ echo "Starting the eNB at 10MHz"
+ echo "############################################################"
+ CURRENT_ENB_LOG_FILE=enb_10MHz.log
+ start_basic_sim_enb $VM_CMDS $VM_IP_ADDR $EPC_VM_IP_ADDR $CURRENT_ENB_LOG_FILE 50
+
+ echo "############################################################"
+ echo "Starting the UE at 10MHz"
+ echo "############################################################"
+ CURRENT_UE_LOG_FILE=ue_10MHz.log
+ start_basic_sim_ue $VM_CMDS $VM_IP_ADDR $CURRENT_UE_LOG_FILE 50
+ if [ $UE_SYNC -eq 0 ]
+ then
+ echo "Problem w/ eNB and UE not syncing"
+ terminate_enb_ue_basic_sim $VM_CMDS $VM_IP_ADDR
+ scp -o StrictHostKeyChecking=no ubuntu@$VM_IP_ADDR:/home/ubuntu/tmp/cmake_targets/log/$CURRENT_ENB_LOG_FILE $ARCHIVES_LOC
+ scp -o StrictHostKeyChecking=no ubuntu@$VM_IP_ADDR:/home/ubuntu/tmp/cmake_targets/log/$CURRENT_UE_LOG_FILE $ARCHIVES_LOC
+ terminate_ltebox_epc $EPC_VM_CMDS $EPC_VM_IP_ADDR
+ exit -1
+ fi
+ get_ue_ip_addr $VM_CMDS $VM_IP_ADDR
+
+ echo "############################################################"
+ echo "Pinging the UE"
+ echo "############################################################"
+ ping_ue_ip_addr $EPC_VM_CMDS $EPC_VM_IP_ADDR $UE_IP_ADDR 10MHz_ping_ue.txt
+ scp -o StrictHostKeyChecking=no ubuntu@$EPC_VM_IP_ADDR:/home/ubuntu/10MHz_ping_ue.txt $ARCHIVES_LOC
+ check_ping_result $ARCHIVES_LOC/10MHz_ping_ue.txt 20
+
+ echo "############################################################"
+ echo "Iperf DL"
+ echo "############################################################"
+ CURR_IPERF_LOG_BASE=10MHz_iperf_dl
+ iperf_dl $VM_CMDS $VM_IP_ADDR $EPC_VM_CMDS $EPC_VM_IP_ADDR 15 $CURR_IPERF_LOG_BASE
+ scp -o StrictHostKeyChecking=no ubuntu@$EPC_VM_IP_ADDR:/home/ubuntu/${CURR_IPERF_LOG_BASE}_client.txt $ARCHIVES_LOC
+ scp -o StrictHostKeyChecking=no ubuntu@$VM_IP_ADDR:/home/ubuntu/tmp/cmake_targets/log/${CURR_IPERF_LOG_BASE}_server.txt $ARCHIVES_LOC
+ check_iperf $ARCHIVES_LOC/$CURR_IPERF_LOG_BASE 15
+
+ echo "############################################################"
+ echo "Iperf UL"
+ echo "############################################################"
+ CURR_IPERF_LOG_BASE=10MHz_iperf_ul
+ iperf_ul $VM_CMDS $VM_IP_ADDR $EPC_VM_CMDS $EPC_VM_IP_ADDR 2 $CURR_IPERF_LOG_BASE
+ scp -o StrictHostKeyChecking=no ubuntu@$EPC_VM_IP_ADDR:/home/ubuntu/${CURR_IPERF_LOG_BASE}_server.txt $ARCHIVES_LOC
+ scp -o StrictHostKeyChecking=no ubuntu@$VM_IP_ADDR:/home/ubuntu/tmp/cmake_targets/log/${CURR_IPERF_LOG_BASE}_client.txt $ARCHIVES_LOC
+ check_iperf $ARCHIVES_LOC/$CURR_IPERF_LOG_BASE 2
+
+ echo "############################################################"
+ echo "Terminate enb/ue simulators"
+ echo "############################################################"
+ terminate_enb_ue_basic_sim $VM_CMDS $VM_IP_ADDR
+ scp -o StrictHostKeyChecking=no ubuntu@$VM_IP_ADDR:/home/ubuntu/tmp/cmake_targets/log/$CURRENT_ENB_LOG_FILE $ARCHIVES_LOC
+ scp -o StrictHostKeyChecking=no ubuntu@$VM_IP_ADDR:/home/ubuntu/tmp/cmake_targets/log/$CURRENT_UE_LOG_FILE $ARCHIVES_LOC
+
+ echo "############################################################"
+ echo "Starting the eNB at 20MHz"
+ echo "############################################################"
+ CURRENT_ENB_LOG_FILE=enb_20MHz.log
+ start_basic_sim_enb $VM_CMDS $VM_IP_ADDR $EPC_VM_IP_ADDR $CURRENT_ENB_LOG_FILE 100
+
+ echo "############################################################"
+ echo "Starting the UE at 20MHz"
+ echo "############################################################"
+ CURRENT_UE_LOG_FILE=ue_20MHz.log
+ start_basic_sim_ue $VM_CMDS $VM_IP_ADDR $CURRENT_UE_LOG_FILE 100
+ if [ $UE_SYNC -eq 0 ]
+ then
+ echo "Problem w/ eNB and UE not syncing"
+ terminate_enb_ue_basic_sim $VM_CMDS $VM_IP_ADDR
+ scp -o StrictHostKeyChecking=no ubuntu@$VM_IP_ADDR:/home/ubuntu/tmp/cmake_targets/log/$CURRENT_ENB_LOG_FILE $ARCHIVES_LOC
+ scp -o StrictHostKeyChecking=no ubuntu@$VM_IP_ADDR:/home/ubuntu/tmp/cmake_targets/log/$CURRENT_UE_LOG_FILE $ARCHIVES_LOC
+ terminate_ltebox_epc $EPC_VM_CMDS $EPC_VM_IP_ADDR
+ exit -1
+ fi
+ get_ue_ip_addr $VM_CMDS $VM_IP_ADDR
+
+ echo "############################################################"
+ echo "Pinging the UE"
+ echo "############################################################"
+ ping_ue_ip_addr $EPC_VM_CMDS $EPC_VM_IP_ADDR $UE_IP_ADDR 20MHz_ping_ue.txt
+ scp -o StrictHostKeyChecking=no ubuntu@$EPC_VM_IP_ADDR:/home/ubuntu/20MHz_ping_ue.txt $ARCHIVES_LOC
+ check_ping_result $ARCHIVES_LOC/20MHz_ping_ue.txt 20
+
+ echo "############################################################"
+ echo "Iperf DL"
+ echo "############################################################"
+ CURR_IPERF_LOG_BASE=20MHz_iperf_dl
+ iperf_dl $VM_CMDS $VM_IP_ADDR $EPC_VM_CMDS $EPC_VM_IP_ADDR 15 $CURR_IPERF_LOG_BASE
+ scp -o StrictHostKeyChecking=no ubuntu@$EPC_VM_IP_ADDR:/home/ubuntu/${CURR_IPERF_LOG_BASE}_client.txt $ARCHIVES_LOC
+ scp -o StrictHostKeyChecking=no ubuntu@$VM_IP_ADDR:/home/ubuntu/tmp/cmake_targets/log/${CURR_IPERF_LOG_BASE}_server.txt $ARCHIVES_LOC
+ check_iperf $ARCHIVES_LOC/$CURR_IPERF_LOG_BASE 15
+
+ echo "############################################################"
+ echo "Iperf UL"
+ echo "############################################################"
+# CURR_IPERF_LOG_BASE=20MHz_iperf_ul
+# iperf_ul $VM_CMDS $VM_IP_ADDR $EPC_VM_CMDS $EPC_VM_IP_ADDR 1 $CURR_IPERF_LOG_BASE
+# scp -o StrictHostKeyChecking=no ubuntu@$EPC_VM_IP_ADDR:/home/ubuntu/${CURR_IPERF_LOG_BASE}_server.txt $ARCHIVES_LOC
+# scp -o StrictHostKeyChecking=no ubuntu@$VM_IP_ADDR:/home/ubuntu/tmp/cmake_targets/log/${CURR_IPERF_LOG_BASE}_client.txt $ARCHIVES_LOC
+# check_iperf $ARCHIVES_LOC/$CURR_IPERF_LOG_BASE 1
+
+ echo "############################################################"
+ echo "Terminate enb/ue simulators"
+ echo "############################################################"
+ terminate_enb_ue_basic_sim $VM_CMDS $VM_IP_ADDR
+ scp -o StrictHostKeyChecking=no ubuntu@$VM_IP_ADDR:/home/ubuntu/tmp/cmake_targets/log/$CURRENT_ENB_LOG_FILE $ARCHIVES_LOC
+ scp -o StrictHostKeyChecking=no ubuntu@$VM_IP_ADDR:/home/ubuntu/tmp/cmake_targets/log/$CURRENT_UE_LOG_FILE $ARCHIVES_LOC
+
+ echo "############################################################"
+ echo "Terminate EPC"
+ echo "############################################################"
+
+ if [ $LTEBOX -eq 1 ]
+ then
+ terminate_ltebox_epc $EPC_VM_CMDS $EPC_VM_IP_ADDR
+ fi
+
+ echo "############################################################"
+ echo "Checking run status"
+ echo "############################################################"
+
+ if [ $PING_STATUS -ne 0 ]; then STATUS=-1; fi
+ if [ $IPERF_STATUS -ne 0 ]; then STATUS=-1; fi
fi
+if [ $STATUS -eq 0 ]
+then
+ echo "STATUS seems OK"
+else
+ echo "STATUS failed?"
+fi
+
exit $STATUS
diff --git a/ci-scripts/xml_files/enb_usrpb210_band40.xml b/ci-scripts/xml_files/enb_usrpb210_band40.xml
new file mode 100644
index 0000000000..5b54d9b8df
--- /dev/null
+++ b/ci-scripts/xml_files/enb_usrpb210_band40.xml
@@ -0,0 +1,179 @@
+
+
+ 010101 050101 060101 070101 040101 030104 040301 040501 040602 040601 040603 040401 040201 030201 030105 040301 040502 040702 040701 040401 040201 030201 050201 060201 070201
+
+
+
+ Build_eNB
+ Build eNB (USRP)
+ -w USRP -c --eNB
+
+
+
+ Initialize_eNB
+ Initialize eNB (FDD/Band40/10MHz)
+ -O ci-scripts/conf_files/enb.band40.tm1.25PRB.FairScheduler.usrpb210.conf --codingw --fepw
+
+
+
+ Initialize_eNB
+ Initialize eNB (TDD/Band40/5MHz/info)
+ -O ci-scripts/conf_files/enb.band40.tm1.50PRB.FairScheduler.usrpb210.conf --codingw --fepw
+
+
+
+ Terminate_eNB
+ Terminate eNB
+
+
+
+ Initialize_UE
+ Initialize UE
+
+
+
+ Terminate_UE
+ Terminate UE
+
+
+
+ Attach_UE
+ Attach UE
+
+
+
+ Detach_UE
+ Detach UE
+
+
+
+ Ping
+ ping (5MHz - 20 sec)
+ -c 20
+ 25
+
+
+
+ Ping
+ ping (10MHz - 20 sec)
+ -c 20
+ 25
+
+
+
+ Iperf
+ iperf (5MHz - DL/6.5Mbps/UDP)(30 sec)(balanced)
+ -u -b 6.5M -t 30 -i 1
+ 50
+ balanced
+
+
+
+ Iperf
+ iperf (5MHz - DL/6.5Mbps/UDP)(30 sec)(single-ue)
+ -u -b 6.5M -t 30 -i 1
+ 50
+ single-ue
+
+
+
+ Iperf
+ iperf (5MHz - DL/6.5Mbps/UDP)(30 sec)(unbalanced)
+ -u -b 6.5M -t 30 -i 1
+ 50
+ unbalanced
+
+
+
+ Iperf
+ iperf (10MHz - DL/13.5Mbps/UDP)(30 sec)(balanced)
+ -u -b 13.5M -t 30 -i 1
+ 50
+ balanced
+
+
+
+ Iperf
+ iperf (10MHz - DL/13.5Mbps/UDP)(30 sec)(single-ue)
+ -u -b 13.5M -t 30 -i 1
+ 50
+ single-ue
+
+
+
+
+ Iperf
+ iperf (5MHz - UL/1Mbps/UDP)(30 sec)(single-ue)
+ -u -b 1M -t 30 -i 1 -R
+ 50
+ single-ue
+
+
+
+ Iperf
+ iperf (5MHz - UL/1Mbps/UDP)(30 sec)(balanced)
+ -u -b 1M -t 30 -i 1 -R
+ 50
+ balanced
+
+
+
+ Iperf
+ iperf (5MHz - UL/8Mbps/UDP)(30 sec)(unbalanced)
+ -u -b 8M -t 30 -i 1 -R
+ 50
+ unbalanced
+
+
+
+ Initialize_HSS
+ Initialize HSS
+
+
+
+ Initialize_MME
+ Initialize MME
+
+
+
+ Initialize_SPGW
+ Initialize SPGW
+
+
+
+ Terminate_HSS
+ Terminate HSS
+
+
+
+ Terminate_MME
+ Terminate MME
+
+
+
+ Terminate_SPGW
+ Terminate SPGW
+
+
+
diff --git a/cmake_targets/CMakeLists.txt b/cmake_targets/CMakeLists.txt
index 5efb13594f..8683dfd2e1 100644
--- a/cmake_targets/CMakeLists.txt
+++ b/cmake_targets/CMakeLists.txt
@@ -170,11 +170,12 @@ set(CMAKE_C_FLAGS
"${CMAKE_C_FLAGS} ${C_FLAGS_PROCESSOR} -std=gnu99 -Wall -Wstrict-prototypes -fno-strict-aliasing -rdynamic -funroll-loops -Wno-packed-bitfield-compat -fPIC ")
# add autotools definitions that were maybe used!
set(CMAKE_C_FLAGS
- "${CMAKE_C_FLAGS} -DSTDC_HEADERS=1 -DHAVE_SYS_TYPES_H=1 -DHAVE_SYS_STAT_H=1 -DHAVE_STDLIB_H=1 -DHAVE_STRING_H=1 -DHAVE_MEMORY_H=1 -DHAVE_STRINGS_H=1 -DHAVE_INTTYPES_H=1 -DHAVE_STDINT_H=1 -DHAVE_UNISTD_H=1 -DHAVE_FCNTL_H=1 -DHAVE_ARPA_INET_H=1 -DHAVE_SYS_TIME_H=1 -DHAVE_SYS_SOCKET_H=1 -DHAVE_STRERROR=1 -DHAVE_SOCKET=1 -DHAVE_MEMSET=1 -DHAVE_GETTIMEOFDAY=1 -DHAVE_STDLIB_H=1 -DHAVE_MALLOC=1 -DHAVE_LIBSCTP -DASN_DISABLE_OER_SUPPORT -D'MAKE_VERSION(a,b,c)=((a)*256+(b)*16+c)'"
+ "${CMAKE_C_FLAGS} -DSTDC_HEADERS=1 -DHAVE_SYS_TYPES_H=1 -DHAVE_SYS_STAT_H=1 -DHAVE_STDLIB_H=1 -DHAVE_STRING_H=1 -DHAVE_MEMORY_H=1 -DHAVE_STRINGS_H=1 -DHAVE_INTTYPES_H=1 -DHAVE_STDINT_H=1 -DHAVE_UNISTD_H=1 -DHAVE_FCNTL_H=1 -DHAVE_ARPA_INET_H=1 -DHAVE_SYS_TIME_H=1 -DHAVE_SYS_SOCKET_H=1 -DHAVE_STRERROR=1 -DHAVE_SOCKET=1 -DHAVE_MEMSET=1 -DHAVE_GETTIMEOFDAY=1 -DHAVE_STDLIB_H=1 -DHAVE_MALLOC=1 -DHAVE_LIBSCTP -D'MAKE_VERSION(a,b,c)=((a)*256+(b)*16+c)'"
)
set(CMAKE_CXX_FLAGS
- "${CMAKE_CXX_FLAGS} ${C_FLAGS_PROCESSOR} -std=c++11 "
+ "${CMAKE_CXX_FLAGS} ${C_FLAGS_PROCESSOR} -std=c++11 -D'MAKE_VERSION(a,b,c)=((a)*256+(b)*16+c)'"
)
+add_definitions("-DASN_DISABLE_OER_SUPPORT")
#########################
@@ -256,16 +257,13 @@ add_boolean_option(BASIC_SIMULATOR False "Has to be True when building the b
add_boolean_option(DEBUG_CONSOLE False "makes debugging easier, disables stdout/stderr buffering")
add_boolean_option(ENABLE_ITTI True "ITTI is internal messaging, should remain enabled for most targets")
-set (ITTI_DIR ${OPENAIR_DIR}/common/utils/itti)
+set (OCP_ITTI ${OPENAIR_DIR}/common/utils/ocp_itti)
if (${ENABLE_ITTI})
add_library(ITTI
# add .h files if depend on (this one is generated)
- ${ITTI_DIR}/intertask_interface.h
- ${ITTI_DIR}/intertask_interface.c
- ${ITTI_DIR}/backtrace.c
- ${ITTI_DIR}/memory_pools.c
- ${ITTI_DIR}/signals.c
- ${ITTI_DIR}/timer.c
+ ${OCP_ITTI}/intertask_interface.cpp
+ ${OPENAIR_DIR}/common/utils/backtrace.c
+ ${OPENAIR_DIR}/common/utils/memory_pools.c
)
set(ITTI_LIB ITTI)
set(GTPU_need_ITTI ${OPENAIR3_DIR}/GTPV1-U/gtpv1u_eNB.c)
@@ -474,6 +472,16 @@ add_library(X2AP_LIB
include_directories ("${X2AP_C_DIR}")
include_directories ("${X2AP_DIR}")
+add_library(X2AP_ENB
+ ${X2AP_DIR}/x2ap_eNB.c
+ # ${X2AP_DIR}/x2ap_eNB_decoder.c
+ # ${X2AP_DIR}/x2ap_eNB_encoder.c
+ ${X2AP_DIR}/x2ap_eNB_handler.c
+ # ${X2AP_DIR}/x2ap_eNB_itti_messaging.c
+ ${X2AP_DIR}/x2ap_eNB_management_procedures.c
+ # ${X2AP_DIR}/x2ap_eNB_generate_messages.c
+ )
+
# Hardware dependant options
###################################
add_list1_option(NB_ANTENNAS_RX "2" "Number of antennas in reception" "1" "2" "4")
@@ -744,11 +752,14 @@ include_directories("${OPENAIR2_DIR}/LAYER2/PDCP_v10.1.0")
include_directories("${OPENAIR2_DIR}/RRC/LTE/MESSAGES")
include_directories("${OPENAIR2_DIR}/RRC/LTE")
include_directories("${OPENAIR_DIR}/common/utils")
-include_directories("${OPENAIR_DIR}/common/utils/itti")
+include_directories("${OPENAIR_DIR}/common/utils/ocp_itti")
include_directories("${OPENAIR3_DIR}/NAS/COMMON")
include_directories("${OPENAIR3_DIR}/NAS/COMMON/API/NETWORK")
include_directories("${OPENAIR3_DIR}/NAS/COMMON/EMM/MSG")
include_directories("${OPENAIR3_DIR}/NAS/COMMON/ESM/MSG")
+include_directories("${OPENAIR3_DIR}/NAS/UE/ESM")
+include_directories("${OPENAIR3_DIR}/NAS/UE/EMM")
+include_directories("${OPENAIR3_DIR}/NAS/UE/API/USER")
include_directories("${OPENAIR3_DIR}/NAS/COMMON/IES")
include_directories("${OPENAIR3_DIR}/NAS/COMMON/UTIL")
include_directories("${OPENAIR3_DIR}/SECU")
@@ -860,6 +871,7 @@ add_library(FLEXRAN_AGENT
${OPENAIR2_DIR}/ENB_APP/flexran_agent_net_comm.c
${OPENAIR2_DIR}/ENB_APP/flexran_agent_async.c
${OPENAIR2_DIR}/ENB_APP/CONTROL_MODULES/MAC/flexran_agent_mac_internal.c
+ ${OPENAIR2_DIR}/ENB_APP/CONTROL_MODULES/MAC/flexran_agent_mac_slice_verification.c
)
set(FLEXRAN_AGENT_LIB FLEXRAN_AGENT)
#include_directories(${OPENAIR2_DIR}/ENB_APP)
@@ -882,12 +894,9 @@ add_library(HASHTABLE
)
include_directories(${OPENAIR_DIR}/common/utils/hashtable)
-if (MESSAGE_CHART_GENERATOR)
- add_library(MSC
- ${OPENAIR_DIR}/common/utils/msc/msc.c
- )
- set(MSC_LIB MSC)
-endif()
+add_library(msc MODULE ${OPENAIR_DIR}/common/utils/msc/msc.c )
+target_link_libraries (msc LFDS)
+
include_directories(${OPENAIR_DIR}/common/utils/msc)
set(UTIL_SRC
@@ -1108,6 +1117,7 @@ set(PHY_SRC
# actual source
${OPENAIR1_DIR}/PHY/LTE_TRANSPORT/pss.c
${OPENAIR1_DIR}/PHY/LTE_TRANSPORT/sss.c
+ ${OPENAIR1_DIR}/PHY/LTE_TRANSPORT/sss_gen.c
${OPENAIR1_DIR}/PHY/LTE_TRANSPORT/pilots.c
${OPENAIR1_DIR}/PHY/LTE_TRANSPORT/pilots_mbsfn.c
${OPENAIR1_DIR}/PHY/LTE_TRANSPORT/dlsch_coding.c
@@ -1137,6 +1147,7 @@ set(PHY_SRC_RU
${OPENAIR1_DIR}/PHY/LTE_TRANSPORT/if5_tools.c
${OPENAIR1_DIR}/PHY/MODULATION/slot_fep_ul.c
${OPENAIR1_DIR}/PHY/MODULATION/ul_7_5_kHz.c
+ ${OPENAIR1_DIR}/PHY/MODULATION/gen_75KHz.cpp
${OPENAIR1_DIR}/PHY/MODULATION/beamforming.c
${OPENAIR1_DIR}/PHY/MODULATION/compute_bf_weights.c
${OPENAIR1_DIR}/PHY/INIT/lte_init_ru.c
@@ -1147,6 +1158,7 @@ set(PHY_SRC_RU
set(PHY_SRC_UE
# actual source
${OPENAIR1_DIR}/PHY/LTE_UE_TRANSPORT/sss_ue.c
+ ${OPENAIR1_DIR}/PHY/LTE_TRANSPORT/sss_gen.c
${OPENAIR1_DIR}/PHY/LTE_UE_TRANSPORT/dlsch_demodulation.c
${OPENAIR1_DIR}/PHY/LTE_UE_TRANSPORT/dlsch_llr_computation.c
${OPENAIR1_DIR}/PHY/LTE_UE_TRANSPORT/linear_preprocessing_rec.c
@@ -1382,7 +1394,6 @@ include_directories(${NFAPI_USER_DIR})
add_library(CN_UTILS
${OPENAIR3_DIR}/UTILS/conversions.c
${OPENAIR3_DIR}/UTILS/enum_string.c
- ${OPENAIR3_DIR}/UTILS/log.c
${OPENAIR3_DIR}/UTILS/mcc_mnc_itu.c
)
@@ -1557,7 +1568,6 @@ set(libnas_ies_OBJS
set (libnas_utils_OBJS
${NAS_SRC}COMMON/UTIL/device.c
${NAS_SRC}COMMON/UTIL/memory.c
- ${NAS_SRC}COMMON/UTIL/nas_log.c
${NAS_SRC}COMMON/UTIL/nas_timer.c
${NAS_SRC}COMMON/UTIL/socket.c
${NAS_SRC}COMMON/UTIL/stty.c
@@ -1937,7 +1947,7 @@ add_executable(lte-softmodem
target_link_libraries (lte-softmodem
-Wl,--start-group
- RRC_LIB S1AP_LIB S1AP_ENB GTPV1U SECU_CN SECU_OSA UTIL HASHTABLE SCTP_CLIENT UDP SCHED_LIB SCHED_RU_LIB PHY_COMMON PHY PHY_RU LFDS L2
+ RRC_LIB S1AP_LIB S1AP_ENB X2AP_LIB X2AP_ENB GTPV1U SECU_CN SECU_OSA UTIL HASHTABLE SCTP_CLIENT UDP SCHED_LIB SCHED_RU_LIB PHY_COMMON PHY PHY_RU LFDS L2
${MSC_LIB} ${RAL_LIB} ${NAS_UE_LIB} ${ITTI_LIB} ${FLPT_MSG_LIB} ${ASYNC_IF_LIB} ${FLEXRAN_AGENT_LIB} LFDS7
NFAPI_COMMON_LIB NFAPI_LIB NFAPI_VNF_LIB NFAPI_PNF_LIB NFAPI_USER_LIB
-Wl,--end-group z dl)
@@ -1974,7 +1984,7 @@ add_executable(lte-softmodem-nos1
)
target_link_libraries (lte-softmodem-nos1
-Wl,--start-group
- RRC_LIB SECU_CN SECU_OSA UTIL HASHTABLE SCHED_LIB SCHED_RU_LIB PHY_COMMON PHY PHY_RU LFDS L2 ${MSC_LIB} ${RAL_LIB} ${ITTI_LIB}
+ RRC_LIB SECU_CN SECU_OSA UTIL HASHTABLE SCHED_LIB SCHED_RU_LIB PHY_COMMON PHY PHY_RU LFDS L2 ${RAL_LIB} ${ITTI_LIB}
${MIH_LIB} ${FLPT_MSG_LIB} ${ASYNC_IF_LIB} ${FLEXRAN_AGENT_LIB} LFDS7
NFAPI_COMMON_LIB NFAPI_LIB NFAPI_VNF_LIB NFAPI_PNF_LIB NFAPI_USER_LIB
-Wl,--end-group z dl )
@@ -2013,7 +2023,7 @@ add_executable(lte-uesoftmodem
target_link_libraries (lte-uesoftmodem
-Wl,--start-group
- RRC_LIB S1AP_LIB S1AP_ENB GTPV1U SECU_CN SECU_OSA UTIL HASHTABLE SCTP_CLIENT UDP SCHED_RU_LIB SCHED_UE_LIB PHY_COMMON PHY_UE PHY_RU LFDS L2_UE SIMU
+ RRC_LIB S1AP_LIB S1AP_ENB X2AP_LIB X2AP_ENB GTPV1U SECU_CN SECU_OSA UTIL HASHTABLE SCTP_CLIENT UDP SCHED_RU_LIB SCHED_UE_LIB PHY_COMMON PHY_UE PHY_RU LFDS L2_UE SIMU
${MSC_LIB} ${RAL_LIB} ${NAS_UE_LIB} ${ITTI_LIB} ${FLPT_MSG_LIB} ${ASYNC_IF_LIB} LFDS7 ${ATLAS_LIBRARIES}
NFAPI_COMMON_LIB NFAPI_LIB NFAPI_PNF_LIB NFAPI_USER_LIB
-Wl,--end-group z dl)
@@ -2052,7 +2062,7 @@ add_executable(lte-uesoftmodem-nos1
target_link_libraries (lte-uesoftmodem-nos1
-Wl,--start-group
- RRC_LIB SECU_CN SECU_OSA UTIL HASHTABLE SCHED_RU_LIB SCHED_UE_LIB PHY_COMMON PHY_UE PHY_RU LFDS L2_UE SIMU ${MSC_LIB} ${RAL_LIB} ${ITTI_LIB}
+ RRC_LIB SECU_CN SECU_OSA UTIL HASHTABLE SCHED_RU_LIB SCHED_UE_LIB PHY_COMMON PHY_UE PHY_RU LFDS L2_UE SIMU ${RAL_LIB} ${ITTI_LIB}
${MIH_LIB} ${FLPT_MSG_LIB} ${ASYNC_IF_LIB} LFDS7 ${ATLAS_LIBRARIES}
NFAPI_COMMON_LIB NFAPI_LIB NFAPI_PNF_LIB NFAPI_USER_LIB
-Wl,--end-group z dl )
@@ -2130,7 +2140,7 @@ add_executable(test_epc_generate_scenario
${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 GTPV1U LIB_NAS_UE SECU_CN UTIL HASHTABLE SCTP_CLIENT UDP SCHED_LIB PHY LFDS ${ITTI_LIB} ${MSC_LIB} L2 -Wl,--end-group pthread m rt crypt sctp ${LIBXML2_LIBRARIES} ${LIBXSLT_LIBRARIES} ${CRYPTO_LIBRARIES} ${OPENSSL_LIBRARIES} ${NETTLE_LIBRARIES} ${CONFIG_LIBRARIES}
+ -Wl,--start-group RRC_LIB S1AP_LIB S1AP_ENB X2AP_LIB X2AP_ENB GTPV1U LIB_NAS_UE SECU_CN UTIL HASHTABLE SCTP_CLIENT UDP SCHED_LIB PHY LFDS ${ITTI_LIB} L2 -Wl,--end-group pthread m rt crypt sctp ${LIBXML2_LIBRARIES} ${LIBXSLT_LIBRARIES} ${CRYPTO_LIBRARIES} ${OPENSSL_LIBRARIES} ${NETTLE_LIBRARIES} ${CONFIG_LIBRARIES}
)
add_executable(test_epc_play_scenario
@@ -2150,7 +2160,7 @@ add_executable(test_epc_play_scenario
)
target_include_directories(test_epc_play_scenario PUBLIC /usr/local/share/asn1c)
target_link_libraries (test_epc_play_scenario
- -Wl,--start-group RRC_LIB S1AP_LIB X2AP_LIB GTPV1U LIB_NAS_UE SECU_CN UTIL HASHTABLE SCTP_CLIENT UDP SCHED_LIB PHY_COMMON PHY PHY_UE LFDS ${ITTI_LIB} ${MSC_LIB} -Wl,--end-group pthread m rt crypt sctp ${LIBXML2_LIBRARIES} ${LIBXSLT_LIBRARIES} ${CRYPTO_LIBRARIES} ${OPENSSL_LIBRARIES} ${NETTLE_LIBRARIES} ${CONFIG_LIBRARIES}
+ -Wl,--start-group RRC_LIB S1AP_LIB X2AP_LIB X2AP_ENB GTPV1U LIB_NAS_UE SECU_CN UTIL HASHTABLE SCTP_CLIENT UDP SCHED_LIB PHY_COMMON PHY PHY_UE LFDS ${ITTI_LIB} ${MSC_LIB} -Wl,--end-group pthread m rt crypt sctp ${LIBXML2_LIBRARIES} ${LIBXSLT_LIBRARIES} ${CRYPTO_LIBRARIES} ${OPENSSL_LIBRARIES} ${NETTLE_LIBRARIES} ${CONFIG_LIBRARIES}
)
@@ -2186,7 +2196,7 @@ if (${T_TRACER})
dlsim_tm4 dlsim dlsim_tm7 ulsim pbchsim scansim mbmssim
pdcchsim pucchsim prachsim syncsim ulsim
#all "add_library" definitions
- ITTI RRC_LIB S1AP_LIB S1AP_ENB X2AP_LIB
+ ITTI RRC_LIB S1AP_LIB S1AP_ENB X2AP_LIB X2AP_ENB
oai_exmimodevif oai_usrpdevif oai_bladerfdevif oai_lmssdrdevif
oai_eth_transpro
FLPT_MSG ASYNC_IF FLEXRAN_AGENT HASHTABLE MSC UTIL OMG_SUMO SECU_OSA
diff --git a/cmake_targets/autotests/v2/config/enb.band38.tm1.usrpb210.tdd.10MHz.conf b/cmake_targets/autotests/v2/config/enb.band38.tm1.usrpb210.tdd.10MHz.conf
index e2ea056ea1..08eb76e09d 100644
--- a/cmake_targets/autotests/v2/config/enb.band38.tm1.usrpb210.tdd.10MHz.conf
+++ b/cmake_targets/autotests/v2/config/enb.band38.tm1.usrpb210.tdd.10MHz.conf
@@ -146,12 +146,14 @@ eNBs =
NETWORK_INTERFACES :
{
-
ENB_INTERFACE_NAME_FOR_S1_MME = "eth6";
ENB_IPV4_ADDRESS_FOR_S1_MME = "192.168.12.82/24";
ENB_INTERFACE_NAME_FOR_S1U = "eth6";
ENB_IPV4_ADDRESS_FOR_S1U = "192.168.12.82/24";
ENB_PORT_FOR_S1U = 2152; # Spec 2152
+
+ ENB_IPV4_ADDRESS_FOR_X2C = "192.168.12.82/24";
+ ENB_PORT_FOR_X2C = 36422; # Spec 36422
};
log_config :
diff --git a/cmake_targets/autotests/v2/config/enb.band38.tm1.usrpb210.tdd.20MHz.conf b/cmake_targets/autotests/v2/config/enb.band38.tm1.usrpb210.tdd.20MHz.conf
index b2ac3ccf42..eff42040ad 100644
--- a/cmake_targets/autotests/v2/config/enb.band38.tm1.usrpb210.tdd.20MHz.conf
+++ b/cmake_targets/autotests/v2/config/enb.band38.tm1.usrpb210.tdd.20MHz.conf
@@ -146,12 +146,14 @@ eNBs =
NETWORK_INTERFACES :
{
-
ENB_INTERFACE_NAME_FOR_S1_MME = "eth6";
ENB_IPV4_ADDRESS_FOR_S1_MME = "192.168.12.82/24";
ENB_INTERFACE_NAME_FOR_S1U = "eth6";
ENB_IPV4_ADDRESS_FOR_S1U = "192.168.12.82/24";
ENB_PORT_FOR_S1U = 2152; # Spec 2152
+
+ ENB_IPV4_ADDRESS_FOR_X2C = "192.168.12.82/24";
+ ENB_PORT_FOR_X2C = 36422; # Spec 36422
};
log_config :
diff --git a/cmake_targets/autotests/v2/config/enb.band38.tm1.usrpb210.tdd.5MHz.conf b/cmake_targets/autotests/v2/config/enb.band38.tm1.usrpb210.tdd.5MHz.conf
index 006d59d2a5..8eb66d4643 100644
--- a/cmake_targets/autotests/v2/config/enb.band38.tm1.usrpb210.tdd.5MHz.conf
+++ b/cmake_targets/autotests/v2/config/enb.band38.tm1.usrpb210.tdd.5MHz.conf
@@ -146,12 +146,14 @@ eNBs =
NETWORK_INTERFACES :
{
-
ENB_INTERFACE_NAME_FOR_S1_MME = "eth6";
ENB_IPV4_ADDRESS_FOR_S1_MME = "192.168.12.82/24";
ENB_INTERFACE_NAME_FOR_S1U = "eth6";
ENB_IPV4_ADDRESS_FOR_S1U = "192.168.12.82/24";
ENB_PORT_FOR_S1U = 2152; # Spec 2152
+
+ ENB_IPV4_ADDRESS_FOR_X2C = "192.168.12.82/24";
+ ENB_PORT_FOR_X2C = 36422; # Spec 36422
};
log_config :
diff --git a/cmake_targets/autotests/v2/config/enb.band7.tm1.usrpb210.fdd.10MHz.conf b/cmake_targets/autotests/v2/config/enb.band7.tm1.usrpb210.fdd.10MHz.conf
index 8c76d95d4c..dc3b3bc4f0 100644
--- a/cmake_targets/autotests/v2/config/enb.band7.tm1.usrpb210.fdd.10MHz.conf
+++ b/cmake_targets/autotests/v2/config/enb.band7.tm1.usrpb210.fdd.10MHz.conf
@@ -146,12 +146,14 @@ eNBs =
NETWORK_INTERFACES :
{
-
ENB_INTERFACE_NAME_FOR_S1_MME = "eth0";
ENB_IPV4_ADDRESS_FOR_S1_MME = "192.168.12.19/24";
ENB_INTERFACE_NAME_FOR_S1U = "eth0";
ENB_IPV4_ADDRESS_FOR_S1U = "192.168.12.19/24";
ENB_PORT_FOR_S1U = 2152; # Spec 2152
+
+ ENB_IPV4_ADDRESS_FOR_X2C = "192.168.12.19/24";
+ ENB_PORT_FOR_X2C = 36422; # Spec 36422
};
log_config :
diff --git a/cmake_targets/autotests/v2/config/enb.band7.tm1.usrpb210.fdd.20MHz.conf b/cmake_targets/autotests/v2/config/enb.band7.tm1.usrpb210.fdd.20MHz.conf
index 0d2bb27dcc..6af71831f5 100644
--- a/cmake_targets/autotests/v2/config/enb.band7.tm1.usrpb210.fdd.20MHz.conf
+++ b/cmake_targets/autotests/v2/config/enb.band7.tm1.usrpb210.fdd.20MHz.conf
@@ -146,12 +146,14 @@ eNBs =
NETWORK_INTERFACES :
{
-
ENB_INTERFACE_NAME_FOR_S1_MME = "eth0";
ENB_IPV4_ADDRESS_FOR_S1_MME = "192.168.12.19/24";
ENB_INTERFACE_NAME_FOR_S1U = "eth0";
ENB_IPV4_ADDRESS_FOR_S1U = "192.168.12.19/24";
ENB_PORT_FOR_S1U = 2152; # Spec 2152
+
+ ENB_IPV4_ADDRESS_FOR_X2C = "192.168.12.19/24";
+ ENB_PORT_FOR_X2C = 36422; # Spec 36422
};
log_config :
diff --git a/cmake_targets/autotests/v2/config/enb.band7.tm1.usrpb210.fdd.5MHz.conf b/cmake_targets/autotests/v2/config/enb.band7.tm1.usrpb210.fdd.5MHz.conf
index c418f355f2..077b6e4ead 100644
--- a/cmake_targets/autotests/v2/config/enb.band7.tm1.usrpb210.fdd.5MHz.conf
+++ b/cmake_targets/autotests/v2/config/enb.band7.tm1.usrpb210.fdd.5MHz.conf
@@ -146,12 +146,14 @@ eNBs =
NETWORK_INTERFACES :
{
-
ENB_INTERFACE_NAME_FOR_S1_MME = "eth0";
ENB_IPV4_ADDRESS_FOR_S1_MME = "192.168.12.19/24";
ENB_INTERFACE_NAME_FOR_S1U = "eth0";
ENB_IPV4_ADDRESS_FOR_S1U = "192.168.12.19/24";
ENB_PORT_FOR_S1U = 2152; # Spec 2152
+
+ ENB_IPV4_ADDRESS_FOR_X2C = "192.168.12.19/24";
+ ENB_PORT_FOR_X2C = 36422; # Spec 36422
};
log_config :
diff --git a/cmake_targets/autotests/v2/config/rcc.band7.tm1.if4p5.10MHz.conf b/cmake_targets/autotests/v2/config/rcc.band7.tm1.if4p5.10MHz.conf
index 89e06d2b1e..e2f5981418 100644
--- a/cmake_targets/autotests/v2/config/rcc.band7.tm1.if4p5.10MHz.conf
+++ b/cmake_targets/autotests/v2/config/rcc.band7.tm1.if4p5.10MHz.conf
@@ -146,12 +146,14 @@ eNBs =
NETWORK_INTERFACES :
{
-
ENB_INTERFACE_NAME_FOR_S1_MME = "eth0";
ENB_IPV4_ADDRESS_FOR_S1_MME = "192.168.12.18/24";
ENB_INTERFACE_NAME_FOR_S1U = "eth0";
ENB_IPV4_ADDRESS_FOR_S1U = "192.168.12.18/24";
ENB_PORT_FOR_S1U = 2152; # Spec 2152
+
+ ENB_IPV4_ADDRESS_FOR_X2C = "192.168.12.18/24";
+ ENB_PORT_FOR_X2C = 36422; # Spec 36422
};
rrh_gw_config = (
diff --git a/cmake_targets/autotests/v2/config/rcc.band7.tm1.if4p5.20MHz.conf b/cmake_targets/autotests/v2/config/rcc.band7.tm1.if4p5.20MHz.conf
index c8e6c861e0..9e08414ab3 100644
--- a/cmake_targets/autotests/v2/config/rcc.band7.tm1.if4p5.20MHz.conf
+++ b/cmake_targets/autotests/v2/config/rcc.band7.tm1.if4p5.20MHz.conf
@@ -146,12 +146,14 @@ eNBs =
NETWORK_INTERFACES :
{
-
ENB_INTERFACE_NAME_FOR_S1_MME = "eth0";
ENB_IPV4_ADDRESS_FOR_S1_MME = "192.168.12.18/24";
ENB_INTERFACE_NAME_FOR_S1U = "eth0";
ENB_IPV4_ADDRESS_FOR_S1U = "192.168.12.18/24";
ENB_PORT_FOR_S1U = 2152; # Spec 2152
+
+ ENB_IPV4_ADDRESS_FOR_X2C = "192.168.12.18/24";
+ ENB_PORT_FOR_X2C = 36422; # Spec 36422
};
rrh_gw_config = (
diff --git a/cmake_targets/autotests/v2/config/rcc.band7.tm1.if4p5.5MHz.conf b/cmake_targets/autotests/v2/config/rcc.band7.tm1.if4p5.5MHz.conf
index cc00f4f3ea..2a598c31d3 100644
--- a/cmake_targets/autotests/v2/config/rcc.band7.tm1.if4p5.5MHz.conf
+++ b/cmake_targets/autotests/v2/config/rcc.band7.tm1.if4p5.5MHz.conf
@@ -146,12 +146,14 @@ eNBs =
NETWORK_INTERFACES :
{
-
ENB_INTERFACE_NAME_FOR_S1_MME = "eth0";
ENB_IPV4_ADDRESS_FOR_S1_MME = "192.168.12.18/24";
ENB_INTERFACE_NAME_FOR_S1U = "eth0";
ENB_IPV4_ADDRESS_FOR_S1U = "192.168.12.18/24";
ENB_PORT_FOR_S1U = 2152; # Spec 2152
+
+ ENB_IPV4_ADDRESS_FOR_X2C = "192.168.12.18/24";
+ ENB_PORT_FOR_X2C = 36422; # Spec 36422
};
rrh_gw_config = (
diff --git a/cmake_targets/autotests/v2/config/rru.band7.tm1.if4p5.10MHz.udp.usrpb210.conf b/cmake_targets/autotests/v2/config/rru.band7.tm1.if4p5.10MHz.udp.usrpb210.conf
index 6e1e776fed..4966108d03 100644
--- a/cmake_targets/autotests/v2/config/rru.band7.tm1.if4p5.10MHz.udp.usrpb210.conf
+++ b/cmake_targets/autotests/v2/config/rru.band7.tm1.if4p5.10MHz.udp.usrpb210.conf
@@ -148,12 +148,14 @@ eNBs =
NETWORK_INTERFACES :
{
-
ENB_INTERFACE_NAME_FOR_S1_MME = "eth3";
ENB_IPV4_ADDRESS_FOR_S1_MME = "192.168.12.215/24";
ENB_INTERFACE_NAME_FOR_S1U = "eth3";
ENB_IPV4_ADDRESS_FOR_S1U = "192.168.12.215/24";
ENB_PORT_FOR_S1U = 2152; # Spec 2152
+
+ ENB_IPV4_ADDRESS_FOR_X2C = "192.168.12.215/24";
+ ENB_PORT_FOR_X2C = 36422; # Spec 36422
};
rrh_gw_config = (
diff --git a/cmake_targets/autotests/v2/config/rru.band7.tm1.if4p5.20MHz.udp.usrpb210.conf b/cmake_targets/autotests/v2/config/rru.band7.tm1.if4p5.20MHz.udp.usrpb210.conf
index 7e7c3c185d..4f3b25349a 100644
--- a/cmake_targets/autotests/v2/config/rru.band7.tm1.if4p5.20MHz.udp.usrpb210.conf
+++ b/cmake_targets/autotests/v2/config/rru.band7.tm1.if4p5.20MHz.udp.usrpb210.conf
@@ -148,12 +148,14 @@ eNBs =
NETWORK_INTERFACES :
{
-
ENB_INTERFACE_NAME_FOR_S1_MME = "eth3";
ENB_IPV4_ADDRESS_FOR_S1_MME = "192.168.12.215/24";
ENB_INTERFACE_NAME_FOR_S1U = "eth3";
ENB_IPV4_ADDRESS_FOR_S1U = "192.168.12.215/24";
ENB_PORT_FOR_S1U = 2152; # Spec 2152
+
+ ENB_IPV4_ADDRESS_FOR_X2C = "192.168.12.215/24";
+ ENB_PORT_FOR_X2C = 36422; # Spec 36422
};
rrh_gw_config = (
diff --git a/cmake_targets/autotests/v2/config/rru.band7.tm1.if4p5.5MHz.udp.usrpb210.conf b/cmake_targets/autotests/v2/config/rru.band7.tm1.if4p5.5MHz.udp.usrpb210.conf
index 3098660c8d..54e5a327cd 100644
--- a/cmake_targets/autotests/v2/config/rru.band7.tm1.if4p5.5MHz.udp.usrpb210.conf
+++ b/cmake_targets/autotests/v2/config/rru.band7.tm1.if4p5.5MHz.udp.usrpb210.conf
@@ -148,12 +148,14 @@ eNBs =
NETWORK_INTERFACES :
{
-
ENB_INTERFACE_NAME_FOR_S1_MME = "eth3";
ENB_IPV4_ADDRESS_FOR_S1_MME = "192.168.12.215/24";
ENB_INTERFACE_NAME_FOR_S1U = "eth3";
ENB_IPV4_ADDRESS_FOR_S1U = "192.168.12.215/24";
ENB_PORT_FOR_S1U = 2152; # Spec 2152
+
+ ENB_IPV4_ADDRESS_FOR_X2C = "192.168.12.215/24";
+ ENB_PORT_FOR_X2C = 36422; # Spec 36422
};
rrh_gw_config = (
diff --git a/cmake_targets/build_oai b/cmake_targets/build_oai
index c15e1e8ec7..3954827c09 100755
--- a/cmake_targets/build_oai
+++ b/cmake_targets/build_oai
@@ -40,7 +40,7 @@ set_openair_env
gen_nvram_path=$OPENAIR_DIR/targets/bin
conf_nvram_path=$OPENAIR_DIR/openair3/NAS/TOOLS/ue_eurecom_test_sfr.conf
-MSC_GEN="False"
+MSC_GEN=0
XFORMS="True"
UE_EXPANSION="False"
PRINT_STATS="False"
@@ -155,6 +155,10 @@ Options
Disable all LOG_* macros
--build-eclipse
Build eclipse project files. Paths are auto corrected by fixprj.sh
+--build-telnet
+ Build telnet server, specify --telnetsrv on command line to start it (eNB only)
+--build-msc
+ Build MSC tracing utility, specify --msc on command line to start it (eNB and UE)
--usrp-recplay
Build for I/Q record-playback modes
--ue-nas-use-tun
@@ -345,6 +349,10 @@ function main() {
--build-telnetsrv)
BUILD_TELNETSRV=1
echo_info "Build embedded telnet server"
+ shift ;;
+ --build-msc)
+ MSC_GEN=1
+ echo_info "Build MSC tracing utility"
shift ;;
--usrp-recplay)
USRP_REC_PLAY="True"
@@ -690,6 +698,15 @@ function main() {
$build_dir telnetsrv \
libtelnetsrv.so $dbin/libtelnetsrv.so
+ fi
+ # Telnet server compilation
+ #####################
+ if [ "$MSC_GEN" = "1" ] ; then
+ build_dir=$lte_build_dir
+ compilations \
+ $build_dir msc \
+ libmsc.so $dbin/libmsc.so
+
fi
# build RF device and transport protocol libraries
#####################################
diff --git a/cmake_targets/nas_sim_tools/CMakeLists.txt b/cmake_targets/nas_sim_tools/CMakeLists.txt
index 81e3fe4b3c..c1a0bb419b 100644
--- a/cmake_targets/nas_sim_tools/CMakeLists.txt
+++ b/cmake_targets/nas_sim_tools/CMakeLists.txt
@@ -27,7 +27,6 @@ set(CONF2UEDATA_LIB_SRC
${OPENAIR_DIR}/openair3/NAS/UE/API/USIM/usim_api.c
${OPENAIR_DIR}/openair3/NAS/UE/API/USIM/aka_functions.c
${OPENAIR_DIR}/openair3/NAS/COMMON/UTIL/memory.c
- ${OPENAIR_DIR}/openair3/NAS/COMMON/UTIL/nas_log.c
${OPENAIR_DIR}/openair3/NAS/COMMON/UTIL/OctetString.c
${OPENAIR_DIR}/openair3/NAS/COMMON/UTIL/TLVEncoder.c
${OPENAIR_DIR}/common/utils/utils.c
diff --git a/common/config/config_cmdline.c b/common/config/config_cmdline.c
index 8b3026c22b..3bd41cf6cc 100644
--- a/common/config/config_cmdline.c
+++ b/common/config/config_cmdline.c
@@ -35,10 +35,11 @@
#include
#include
#include
+#include
#include "config_userapi.h"
-void parse_stringlist(paramdef_t *cfgoptions, char *val)
+int parse_stringlist(paramdef_t *cfgoptions, char *val)
{
char *atoken;
char *tokctx;
@@ -63,7 +64,7 @@ int numelt=0;
printf_params("[LIBCONFIG] %s[%i]: %s\n", cfgoptions->optname,i,cfgoptions->strlistptr[i]);
atoken=strtok_r(NULL, ",",&tokctx);
}
- cfgoptions->numelt=numelt;
+ return (cfgoptions->numelt > 0);
}
int processoption(paramdef_t *cfgoptions, char *value)
@@ -95,7 +96,7 @@ char defbool[2]="1";
break;
case TYPE_STRINGLIST:
- parse_stringlist(cfgoptions,tmpval);
+ optisset=parse_stringlist(cfgoptions,tmpval);
break;
case TYPE_UINT32:
case TYPE_INT32:
@@ -141,25 +142,16 @@ char defbool[2]="1";
int config_process_cmdline(paramdef_t *cfgoptions,int numoptions, char *prefix)
{
-
-
-int c = config_get_if()->argc;
-int i,j;
-char *pp;
-char *cfgpath;
+ int c = config_get_if()->argc;
+ int i,j;
+ char *pp;
+ char cfgpath[512]; /* 512 should be enough for the sprintf below */
- j = (prefix ==NULL) ? 0 : strlen(prefix);
- cfgpath = malloc( j + MAX_OPTNAME_SIZE +1);
- if (cfgpath == NULL) {
- fprintf(stderr,"[CONFIG] %s %i malloc error, %s\n", __FILE__, __LINE__,strerror(errno));
- return -1;
- }
-
j = 0;
i = 0;
while (c > 0 ) {
char *oneargv = strdup(config_get_if()->argv[i]); /* we use strtok_r which modifies its string paramater, and we don't want argv to be modified */
-/* first check help options, either --help, -h or --help_ */
+ /* first check help options, either --help, -h or --help_ */
if (strncmp(oneargv, "-h",2) == 0 || strncmp(oneargv, "--help",6) == 0 ) {
char *tokctx;
pp=strtok_r(oneargv, "_",&tokctx);
@@ -182,7 +174,7 @@ char *cfgpath;
}
}
-/* now, check for non help options */
+ /* now, check for non help options */
if (oneargv[0] == '-') {
for(int n=0;n
#include
+#include
#include "config_userapi.h"
-extern void exit_fun(const char* s); // lte-softmodem clean exit function
configmodule_interface_t *config_get_if(void)
diff --git a/common/config/config_userapi.h b/common/config/config_userapi.h
index 217310db36..25306b8778 100644
--- a/common/config/config_userapi.h
+++ b/common/config/config_userapi.h
@@ -38,8 +38,6 @@
extern "C"
{
#endif
-/* get rid of "exit_fun undeclared" warning */
-extern void exit_fun(const char* s);
#define CONFIG_GETSOURCE ( (config_get_if()==NULL) ? NULL : config_get_if()->cfgmode )
#define CONFIG_GETNUMP ( (config_get_if()==NULL) ? 0 : config_get_if()->num_cfgP )
diff --git a/common/config/libconfig/config_libconfig.c b/common/config/libconfig/config_libconfig.c
index f192fd2dc5..cb6fa46293 100644
--- a/common/config/libconfig/config_libconfig.c
+++ b/common/config/libconfig/config_libconfig.c
@@ -91,8 +91,6 @@ int read_intarray(paramdef_t *cfgoptions,config_setting_t *setting, char *cfgpat
int config_libconfig_get(paramdef_t *cfgoptions,int numoptions, char *prefix )
{
-
-
config_setting_t *setting;
char *str;
int i,u;
@@ -103,15 +101,9 @@ int config_libconfig_get(paramdef_t *cfgoptions,int numoptions, char *prefix )
int notfound;
int defval;
int fatalerror=0;
- char *cfgpath; /* listname.[listindex].paramname */
int numdefvals=0;
-
- i = (prefix ==NULL) ? 0 : strlen(prefix);
- cfgpath = malloc( i+ MAX_OPTNAME_SIZE +1);
- if (cfgpath == NULL) {
- fprintf(stderr,"[LIBCONFIG] %s %i malloc error, %s\n", __FILE__, __LINE__,strerror(errno));
- return -1;
- }
+ char cfgpath[512]; /* 512 should be enough for the sprintf below */
+
for(i=0;ilog_component[i].level = map_str_to_int(log_level_names, *(logparams_level[i].strptr));
+ set_log(i, g_log->log_component[i].level);
if (*(logparams_logfile[i].uptr) == 1)
set_component_filelog(i);
}
-/* build then read the debug and matlab parameter array */
+/* build then read the debug and dump parameter array */
for (int i=0;log_maskmap[i].name != NULL ; i++) {
- sprintf(logparams_debug[i].optname, LOG_CONFIG_DEBUG_FORMAT, log_maskmap[i].name);
- sprintf(logparams_matlab[i].optname, LOG_CONFIG_MATLAB_FORMAT, log_maskmap[i].name);
+ sprintf(logparams_debug[i].optname, LOG_CONFIG_DEBUG_FORMAT, log_maskmap[i].name);
+ sprintf(logparams_dump[i].optname, LOG_CONFIG_DUMP_FORMAT, log_maskmap[i].name);
logparams_debug[i].defuintval = 0;
logparams_debug[i].type = TYPE_UINT;
logparams_debug[i].paramflags = PARAMFLAG_BOOL;
logparams_debug[i].uptr = NULL;
logparams_debug[i].chkPptr = NULL;
logparams_debug[i].numelt = 0;
- logparams_matlab[i].defuintval = 0;
- logparams_matlab[i].type = TYPE_UINT;
- logparams_matlab[i].paramflags = PARAMFLAG_BOOL;
- logparams_matlab[i].uptr = NULL;
- logparams_matlab[i].chkPptr = NULL;
- logparams_matlab[i].numelt = 0;
+ logparams_dump[i].defuintval = 0;
+ logparams_dump[i].type = TYPE_UINT;
+ logparams_dump[i].paramflags = PARAMFLAG_BOOL;
+ logparams_dump[i].uptr = NULL;
+ logparams_dump[i].chkPptr = NULL;
+ logparams_dump[i].numelt = 0;
}
config_get( logparams_debug,(sizeof(log_maskmap)/sizeof(mapping)) - 1 ,CONFIG_STRING_LOG_PREFIX);
- config_get( logparams_matlab,(sizeof(log_maskmap)/sizeof(mapping)) - 1 ,CONFIG_STRING_LOG_PREFIX);
+ config_get( logparams_dump,(sizeof(log_maskmap)/sizeof(mapping)) - 1 ,CONFIG_STRING_LOG_PREFIX);
/* set the debug mask according to the debug parameters values */
for (int i=0; log_maskmap[i].name != NULL ; i++) {
if (*(logparams_debug[i].uptr) )
g_log->debug_mask = g_log->debug_mask | log_maskmap[i].value;
- if (*(logparams_matlab[i].uptr) )
- g_log->matlab_mask = g_log->matlab_mask | log_maskmap[i].value;
+ if (*(logparams_dump[i].uptr) )
+ g_log->dump_mask = g_log->dump_mask | log_maskmap[i].value;
}
+/* log globally enabled/disabled */
+ set_glog_onlinelog(consolelog);
}
int register_log_component(char *name, char *fext, int compidx)
@@ -354,11 +348,9 @@ int computed_compidx=compidx;
}
if (computed_compidx >= 0 && computed_compidx log_component[computed_compidx].name = strdup(name);
- g_log->log_component[computed_compidx].level = LOG_ERR;
- g_log->log_component[computed_compidx].interval = 1;
- g_log->log_component[computed_compidx].stream = NULL;
+ g_log->log_component[computed_compidx].stream = stdout;
g_log->log_component[computed_compidx].filelog = 0;
- g_log->log_component[computed_compidx].filelog_name = malloc(strlen(name)+16);/* /tmp/.%s rounded to ^2 */
+ g_log->log_component[computed_compidx].filelog_name = malloc(strlen(name)+16);/* /tmp/.%s */
sprintf(g_log->log_component[computed_compidx].filelog_name,"/tmp/%s.%s",name,fext);
} else {
fprintf(stderr,"{LOG} %s %d Couldn't register componemt %s\n",__FILE__,__LINE__,name);
@@ -418,26 +410,20 @@ int logInit (void)
register_log_component("S1AP","",S1AP);
+ register_log_component("X2AP","",X2AP);
register_log_component("SCTP","",SCTP);
- register_log_component("RRH","",RRH);
-
-
+ register_log_component("X2AP","",X2AP);
+ register_log_component("LOADER","log",LOADER);
+ register_log_component("ASN","log",ASN);
+ for (int i=0 ; log_level_names[i].name != NULL ; i++)
+ g_log->level2string[i] = toupper(log_level_names[i].name[0]); // uppercased first letter of level name
- g_log->level2string[OAILOG_ERR] = "E"; // ERROR
- g_log->level2string[OAILOG_WARNING] = "W"; // WARNING
- g_log->level2string[OAILOG_INFO] = "I"; //INFO
- g_log->level2string[OAILOG_DEBUG] = "D"; // DEBUG
- g_log->level2string[OAILOG_FILE] = "F"; // file
- g_log->level2string[OAILOG_TRACE] = "T"; // TRACE
-
- g_log->onlinelog = 1; //online log file
- g_log->filelog = 0;
@@ -446,19 +432,6 @@ int logInit (void)
log_getconfig(g_log);
- // could put a loop here to check for all comps
- for (i=MIN_LOG_COMPONENTS; i < MAX_LOG_COMPONENTS; i++) {
- if (g_log->log_component[i].filelog == 1 ) {
- g_log->log_component[i].stream = fopen(g_log->log_component[i].filelog_name,"w");
- g_log->log_component[i].fwrite = vfprintf;
- } else if (g_log->log_component[i].filelog == 1 ) {
- g_log->log_component[i].stream = fopen(g_log->filelog_name,"w");
- g_log->log_component[i].fwrite = vfprintf;
- } else if (g_log->onlinelog == 1 ) {
- g_log->log_component[i].stream = stdout;
- g_log->log_component[i].fwrite = vfprintf;
- }
- }
// set all unused component items to 0, they are for non predefined components
for (i=MAX_LOG_PREDEF_COMPONENTS; i < MAX_LOG_COMPONENTS; i++) {
@@ -470,8 +443,6 @@ int logInit (void)
}
-
-
char *log_getthreadname(char *threadname, int bufsize) {
int rt = pthread_getname_np(pthread_self(), threadname,bufsize) ;
@@ -483,11 +454,20 @@ int rt = pthread_getname_np(pthread_self(), threadname,bufsize) ;
}
}
+static int log_header(char *log_buffer, int buffsize, int comp, int level,const char *format) {
+ char threadname[PR_SET_NAME];
+return snprintf(log_buffer, buffsize , "%s%s[%s]%c %s %s%s",
+ log_level_highlight_end[level],
+ ( (g_log->flag & FLAG_NOCOLOR)?"":log_level_highlight_start[level]),
+ g_log->log_component[comp].name,
+ ( (g_log->flag & FLAG_LEVEL)?g_log->level2string[level]:' '),
+ ( (g_log->flag & FLAG_THREAD)?log_getthreadname(threadname,PR_SET_NAME+1):""),
+ format,
+ log_level_highlight_end[level]);
+}
void logRecord_mt(const char *file, const char *func, int line, int comp, int level, const char* format, ... )
{
-
- char threadname[PR_SET_NAME];
char log_buffer[MAX_LOG_TOTAL];
va_list args;
@@ -496,38 +476,63 @@ void logRecord_mt(const char *file, const char *func, int line, int comp, int le
-
-
- snprintf(log_buffer, MAX_LOG_TOTAL , "%s%s[%s]%s %s %s",
- log_level_highlight_end[level],
- ( (g_log->flag & FLAG_NOCOLOR)?"":log_level_highlight_start[level]),
- g_log->log_component[comp].name,
- ( (g_log->flag & FLAG_LEVEL)?g_log->level2string[level]:""),
- ( (g_log->flag & FLAG_THREAD)?log_getthreadname(threadname,PR_SET_NAME+1):""),
- format);
-
- g_log->log_component[comp].fwrite(g_log->log_component[comp].stream,log_buffer, args);
+ log_header(log_buffer,MAX_LOG_TOTAL ,comp, level,format);
+ g_log->log_component[comp].vprint(g_log->log_component[comp].stream,log_buffer, args);
va_end(args);
}
+void log_dump(int component, void *buffer, int buffsize,int datatype, const char* format, ... ) {
+va_list args;
+char *wbuf;
-int set_log(int component, int level, int interval)
+ switch(datatype) {
+ case LOG_DUMP_DOUBLE:
+ wbuf=malloc((buffsize * 10) + 64 + MAX_LOG_TOTAL);
+ break;
+ case LOG_DUMP_CHAR:
+ default:
+ wbuf=malloc((buffsize * 3 ) + 64 + MAX_LOG_TOTAL);
+ break;
+ }
+ if (wbuf != NULL) {
+ va_start(args, format);
+ int pos=log_header(wbuf,MAX_LOG_TOTAL ,component, OAILOG_INFO,"");
+ int pos2=vsprintf(wbuf+pos,format, args);
+ pos=pos+pos2;
+ va_end(args);
+
+ for (int i=0; ilog_component[component].print(g_log->log_component[component].stream,wbuf);
+ free(wbuf);
+ }
+}
+
+int set_log(int component, int level)
{
/* Checking parameters */
DevCheck((component >= MIN_LOG_COMPONENTS) && (component < MAX_LOG_COMPONENTS),
component, MIN_LOG_COMPONENTS, MAX_LOG_COMPONENTS);
- DevCheck((level < NUM_LOG_LEVEL) && (level >= OAILOG_ERR), level, NUM_LOG_LEVEL,
+ DevCheck((level < NUM_LOG_LEVEL) && (level >= OAILOG_DISABLE), level, NUM_LOG_LEVEL,
OAILOG_ERR);
- DevCheck((interval >= 0) && (interval <= 0xFF), interval, 0, 0xFF);
+ if ( g_log->log_component[component].level != OAILOG_DISABLE )
+ g_log->log_component[component].savedlevel = g_log->log_component[component].level;
g_log->log_component[component].level = level;
-
- g_log->log_component[component].interval = interval;
-
return 0;
}
@@ -536,32 +541,67 @@ int set_log(int component, int level, int interval)
void set_glog(int level)
{
for (int c=0; c< MAX_LOG_COMPONENTS; c++ ) {
- g_log->log_component[c].level = level;
+ set_log(c, level);
}
}
void set_glog_onlinelog(int enable)
{
- g_log->onlinelog = enable;
+ for (int c=0; c< MAX_LOG_COMPONENTS; c++ ) {
+ if ( enable ) {
+ g_log->log_component[c].level = g_log->log_component[c].savedlevel;
+ g_log->log_component[c].vprint = vfprintf;
+ g_log->log_component[c].print = fprintf;
+ g_log->log_component[c].stream = stdout;
+ } else {
+ g_log->log_component[c].level = OAILOG_DISABLE;
+ }
+ }
}
void set_glog_filelog(int enable)
{
- g_log->filelog = enable;
+static FILE *fptr;
+
+ if ( enable ) {
+ fptr = fopen(g_log->filelog_name,"w");
+
+ for (int c=0; c< MAX_LOG_COMPONENTS; c++ ) {
+ close_component_filelog(c);
+ g_log->log_component[c].stream = fptr;
+ g_log->log_component[c].filelog = 1;
+ }
+ } else {
+ for (int c=0; c< MAX_LOG_COMPONENTS; c++ ) {
+ g_log->log_component[c].filelog = 0;
+ if (fptr != NULL) {
+ fclose(fptr);
+ }
+ g_log->log_component[c].stream = stdout;
+ }
+ }
}
void set_component_filelog(int comp)
{
- if (g_log->log_component[comp].filelog == 0) {
- g_log->log_component[comp].filelog = 1;
-
- if (g_log->log_component[comp].stream == NULL) {
+ if (g_log->log_component[comp].stream == NULL || g_log->log_component[comp].stream == stdout) {
g_log->log_component[comp].stream = fopen(g_log->log_component[comp].filelog_name,"w");
}
- }
+ g_log->log_component[comp].vprint = vfprintf;
+ g_log->log_component[comp].print = fprintf;
+ g_log->log_component[comp].filelog = 1;
+}
+void close_component_filelog(int comp)
+{
+ g_log->log_component[comp].filelog = 0;
+ if (g_log->log_component[comp].stream != NULL && g_log->log_component[comp].stream != stdout ) {
+ fclose(g_log->log_component[comp].stream);
+ g_log->log_component[comp].stream = stdout;
+ }
+ g_log->log_component[comp].vprint = vfprintf;
+ g_log->log_component[comp].print = fprintf;
+
}
-
-
/*
* for the two functions below, the passed array must have a final entry
@@ -616,15 +656,13 @@ int is_newline( char *str, int size)
void logClean (void)
{
int i;
- LOG_I(PHY,"\n");
+ LOG_UI(PHY,"\n");
for (i=MIN_LOG_COMPONENTS; i < MAX_LOG_COMPONENTS; i++) {
- if (g_log->log_component[i].stream != NULL) {
- fclose(g_log->log_component[i].stream);
- }
+ close_component_filelog(i);
}
}
@@ -650,8 +688,8 @@ int test_log(void)
LOG_D(MAC, "1 debug MAC \n");
LOG_W(MAC, "1 warning MAC \n");
- set_log(EMU, OAILOG_INFO, FLAG_ONLINE);
- set_log(MAC, OAILOG_WARNING, 0);
+ set_log(EMU, OAILOG_INFO);
+ set_log(MAC, OAILOG_WARNING);
LOG_I(EMU, "2 Starting OAI logs version %s Build date: %s on %s\n",
BUILD_VERSION, BUILD_DATE, BUILD_HOST);
@@ -661,7 +699,7 @@ int test_log(void)
LOG_I(MAC, "2 info MAC \n");
- set_log(MAC, OAILOG_NOTICE, 1);
+ set_log(MAC, OAILOG_NOTICE);
LOG_ENTER(MAC);
LOG_I(EMU, "3 Starting OAI logs version %s Build date: %s on %s\n",
@@ -670,8 +708,8 @@ int test_log(void)
LOG_W(MAC, "3 warning MAC \n");
LOG_I(MAC, "3 info MAC \n");
- set_log(MAC, LOG_DEBUG,1);
- set_log(EMU, LOG_DEBUG,1);
+ set_log(MAC, LOG_DEBUG);
+ set_log(EMU, LOG_DEBUG);
LOG_ENTER(MAC);
LOG_I(EMU, "4 Starting OAI logs version %s Build date: %s on %s\n",
@@ -681,8 +719,8 @@ int test_log(void)
LOG_I(MAC, "4 info MAC \n");
- set_log(MAC, LOG_DEBUG,0);
- set_log(EMU, LOG_DEBUG,0);
+ set_log(MAC, LOG_DEBUG);
+ set_log(EMU, LOG_DEBUG);
LOG_I(LOG, "5 Starting OAI logs version %s Build date: %s on %s\n",
BUILD_VERSION, BUILD_DATE, BUILD_HOST);
@@ -691,8 +729,8 @@ int test_log(void)
LOG_I(MAC, "5 info MAC \n");
- set_log(MAC, LOG_TRACE,0X07F);
- set_log(EMU, LOG_TRACE,0X07F);
+ set_log(MAC, LOG_TRACE);
+ set_log(EMU, LOG_TRACE);
LOG_ENTER(MAC);
LOG_I(LOG, "6 Starting OAI logs version %s Build date: %s on %s\n",
diff --git a/common/utils/LOG/log.h b/common/utils/LOG/log.h
index 4a0552d494..767c1dbb35 100644
--- a/common/utils/LOG/log.h
+++ b/common/utils/LOG/log.h
@@ -81,15 +81,14 @@ extern "C" {
* @ingroup _macro
* @brief LOG defines 9 levels of messages for users. Importance of these levels decrease gradually from 0 to 8
* @{*/
+# define OAILOG_DISABLE -1 /*!< \brief disable all LOG messages, cannot be used in LOG macros, use only in LOG module */
+# define OAILOG_ERR 0 /*!< \brief critical error conditions, impact on "must have" fuctinalities */
+# define OAILOG_WARNING 1 /*!< \brief warning conditions, shouldn't happen but doesn't impact "must have" functionalities */
+# define OAILOG_INFO 2 /*!< \brief informational messages most people don't need, shouldn't impact real-time behavior */
+# define OAILOG_DEBUG 3 /*!< \brief first level debug-level messages, for developers , may impact real-time behavior */
+# define OAILOG_TRACE 4 /*!< \brief second level debug-level messages, for developers ,likely impact real-time behavior*/
-# define OAILOG_ERR 0 /*!< \brief critical error conditions, impact on "must have" fuctinalities */
-# define OAILOG_FILE 1 /*!< \brief important informational messages, but everything OK */
-# define OAILOG_WARNING 2 /*!< \brief warning conditions, shouldn't happen but doesn't impact "must have" functionalities */
-# define OAILOG_INFO 3 /*!< \brief informational messages most people don't need, shouldn't impact real-time behavior */
-# define OAILOG_DEBUG 4 /*!< \brief first level debug-level messages, for developers , may impact real-time behavior */
-# define OAILOG_TRACE 5 /*!< \brief second level debug-level messages, for developers ,likely impact real-time behavior*/
-
-#define NUM_LOG_LEVEL 6 /*!< \brief the number of message levels users have with LOG */
+#define NUM_LOG_LEVEL 5 /*!< \brief the number of message levels users have with LOG (OAILOG_DISABLE is not available to user as a level, so it is not included)*/
/* @}*/
@@ -128,21 +127,53 @@ extern "C" {
/** @defgroup macros to identify a debug entity
* @ingroup each macro is a bit mask where the unique bit set identifies an entity to be debugged
- * it allows to dynamically activate or not blocks of code
+ * it allows to dynamically activate or not blocks of code. The LOG_MASKMAP_INIT macro
+ * is used to map a character string name to each debug bit, it allows to set or clear
+ * the corresponding bit via the defined name, from the configuration or from the telnet
+ * server.
* @brief
* @{*/
#define DEBUG_PRACH (1<<0)
#define DEBUG_RU (1<<1)
#define DEBUG_UE_PHYPROC (1<<2)
#define DEBUG_LTEESTIM (1<<3)
+#define DEBUG_DLCELLSPEC (1<<4)
+#define DEBUG_ULSCH (1<<5)
+#define DEBUG_RRC (1<<6)
+#define DEBUG_PDCP (1<<7)
+#define DEBUG_DFT (1<<8)
+#define DEBUG_ASN1 (1<<9)
#define DEBUG_CTRLSOCKET (1<<10)
+#define DEBUG_SECURITY (1<<11)
+#define DEBUG_NAS (1<<12)
#define UE_TIMING (1<<20)
-#define SET_LOG_DEBUG(O) g_log->debug_mask = (g_log->debug_mask | O)
-#define CLEAR_LOG_DEBUG(O) g_log->debug_mask = (g_log->debug_mask & (~O))
-#define SET_LOG_MATLAB(O) g_log->matlab_mask = (g_log->matlab_mask | O)
-#define CLEAR_LOG_MATLAB(O) g_log->matlab_mask = (g_log->matlab_mask & (~O))
+#define LOG_MASKMAP_INIT {\
+ {"PRACH", DEBUG_PRACH},\
+ {"RU", DEBUG_RU},\
+ {"UE_PHYPROC", DEBUG_UE_PHYPROC},\
+ {"LTEESTIM", DEBUG_LTEESTIM},\
+ {"DLCELLSPEC", DEBUG_DLCELLSPEC},\
+ {"ULSCH", DEBUG_ULSCH},\
+ {"RRC", DEBUG_RRC},\
+ {"PDCP", DEBUG_PDCP},\
+ {"DFT", DEBUG_DFT},\
+ {"ASN1", DEBUG_ASN1},\
+ {"CTRLSOCKET", DEBUG_CTRLSOCKET},\
+ {"SECURITY", DEBUG_SECURITY},\
+ {"NAS", DEBUG_NAS},\
+ {"UE_TIMING", UE_TIMING},\
+ {NULL,-1}\
+}
+
+
+
+#define SET_LOG_DEBUG(B) g_log->debug_mask = (g_log->debug_mask | B)
+#define CLEAR_LOG_DEBUG(B) g_log->debug_mask = (g_log->debug_mask & (~B))
+
+#define SET_LOG_DUMP(B) g_log->dump_mask = (g_log->dump_mask | B)
+#define CLEAR_LOG_DUMP(B) g_log->dump_mask = (g_log->dump_mask & (~B))
@@ -183,9 +214,9 @@ typedef enum {
TMR,
USIM,
LOCALIZE,
- RRH,
X2AP,
LOADER,
+ ASN,
MAX_LOG_PREDEF_COMPONENTS,
}
comp_name_t;
@@ -199,17 +230,18 @@ typedef struct {
int value; /*!< \brief integer value of mapping */
} mapping;
-typedef int(*log_write_func_t)(FILE *stream, const char *format, va_list ap );
-
+typedef int(*log_vprint_func_t)(FILE *stream, const char *format, va_list ap );
+typedef int(*log_print_func_t)(FILE *stream, const char *format, ... );
typedef struct {
- const char *name;
- int level;
- int flag;
- int interval;
- int filelog;
- char *filelog_name;
- FILE *stream;
- log_write_func_t fwrite;
+ const char *name;
+ int level;
+ int savedlevel;
+ int flag;
+ int filelog;
+ char *filelog_name;
+ FILE *stream;
+ log_vprint_func_t vprint;
+ log_print_func_t print;
/* SR: make the log buffer component relative */
char log_buffer[MAX_LOG_TOTAL];
} log_component_t;
@@ -217,13 +249,11 @@ typedef struct {
typedef struct {
log_component_t log_component[MAX_LOG_COMPONENTS];
- char* level2string[NUM_LOG_LEVEL];
- int onlinelog;
+ char level2string[NUM_LOG_LEVEL];
int flag;
- int filelog;
char* filelog_name;
uint64_t debug_mask;
- uint64_t matlab_mask;
+ uint64_t dump_mask;
} log_t;
@@ -254,14 +284,15 @@ extern log_t *g_log;
/*----------------------------------------------------------------------------*/
int logInit (void);
void logRecord_mt(const char *file, const char *func, int line,int comp, int level, const char *format, ...) __attribute__ ((format (printf, 6, 7)));
-
-int set_log(int component, int level, int interval);
+void log_dump(int component, void *buffer, int buffsize,int datatype, const char* format, ... );
+int set_log(int component, int level);
void set_glog(int level);
void set_glog_onlinelog(int enable);
void set_glog_filelog(int enable);
void set_component_filelog(int comp);
-
+void close_component_filelog(int comp);
+void set_component_consolelog(int comp);
int map_str_to_int(mapping *map, const char *str);
char *map_int_to_str(mapping *map, int val);
void logClean (void);
@@ -293,7 +324,7 @@ int32_t write_file_matlab(const char *fname, const char *vname, void *data, int
#define LOG_CONFIG_LEVEL_FORMAT "%s_log_level"
#define LOG_CONFIG_LOGFILE_FORMAT "%s_log_infile"
#define LOG_CONFIG_DEBUG_FORMAT "%s_debug"
-#define LOG_CONFIG_MATLAB_FORMAT "%s_matlab"
+#define LOG_CONFIG_DUMP_FORMAT "%s_dump"
#define LOG_CONFIG_HELP_OPTIONS " list of comma separated options to enable log module behavior. Available options: \n"\
" nocolor: disable color usage in log messages\n"\
@@ -309,7 +340,7 @@ int32_t write_file_matlab(const char *fname, const char *vname, void *data, int
/*------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------*/
#define LOG_GLOBALPARAMS_DESC { \
{LOG_CONFIG_STRING_GLOBAL_LOG_LEVEL, "Default log level for all componemts\n", 0, strptr:(char **)&gloglevel, defstrval:log_level_names[2].name, TYPE_STRING, 0}, \
-{LOG_CONFIG_STRING_GLOBAL_LOG_ONLINE, "Default console output option, for all components\n", 0, iptr:&(g_log->onlinelog), defintval:1, TYPE_INT, 0}, \
+{LOG_CONFIG_STRING_GLOBAL_LOG_ONLINE, "Default console output option, for all components\n", 0, iptr:&(consolelog), defintval:1, TYPE_INT, 0}, \
{LOG_CONFIG_STRING_GLOBAL_LOG_OPTIONS, LOG_CONFIG_HELP_OPTIONS, 0, strlistptr:NULL, defstrlistval:NULL, TYPE_STRINGLIST,0} \
}
@@ -319,23 +350,25 @@ int32_t write_file_matlab(const char *fname, const char *vname, void *data, int
* @ingroup _macro
* @brief Macro used to call logIt function with different message levels
* @{*/
-
-// debugging macros(g_log->log_component[component].interval?logRecord_mt(__FILE__, __FUNCTION__, __LINE__, component, level, format, ##args):(void)0)
+#define LOG_DUMP_CHAR 0
+#define LOG_DUMP_DOUBLE 1
+// debugging macros
+#define LOG_F LOG_I /* because LOG_F was originaly to dump a message or buffer but is also used as a regular level...., to dump use LOG_DUMPMSG */
# if T_TRACER
/* per component, level dependant macros */
-# define LOG_I(c, x...) do { if (T_stdout) { if( g_log->log_component[c].level >= OAILOG_INFO ) logRecord_mt(__FILE__, __FUNCTION__, __LINE__,c, OAILOG_INFO, x) ;} else { T(T_LEGACY_ ## c ## _INFO, T_PRINTF(x)) ;}} while (0)
-# define LOG_W(c, x...) do { if (T_stdout) { if( g_log->log_component[c].level >= OAILOG_WARNING) logRecord_mt(__FILE__, __FUNCTION__, __LINE__,c, OAILOG_WARNING, x) ;} else { T(T_LEGACY_ ## c ## _WARNING, T_PRINTF(x)) ;}} while (0)
# define LOG_E(c, x...) do { if (T_stdout) { if( g_log->log_component[c].level >= OAILOG_ERR ) logRecord_mt(__FILE__, __FUNCTION__, __LINE__,c, OAILOG_ERR, x) ;} else { T(T_LEGACY_ ## c ## _ERROR, T_PRINTF(x)) ;}} while (0)
+# define LOG_W(c, x...) do { if (T_stdout) { if( g_log->log_component[c].level >= OAILOG_WARNING) logRecord_mt(__FILE__, __FUNCTION__, __LINE__,c, OAILOG_WARNING, x) ;} else { T(T_LEGACY_ ## c ## _WARNING, T_PRINTF(x)) ;}} while (0)
+# define LOG_I(c, x...) do { if (T_stdout) { if( g_log->log_component[c].level >= OAILOG_INFO ) logRecord_mt(__FILE__, __FUNCTION__, __LINE__,c, OAILOG_INFO, x) ;} else { T(T_LEGACY_ ## c ## _INFO, T_PRINTF(x)) ;}} while (0)
# define LOG_D(c, x...) do { if (T_stdout) { if( g_log->log_component[c].level >= OAILOG_DEBUG ) logRecord_mt(__FILE__, __FUNCTION__, __LINE__,c, OAILOG_DEBUG, x) ;} else { T(T_LEGACY_ ## c ## _DEBUG, T_PRINTF(x)) ;}} while (0)
# define LOG_T(c, x...) do { if (T_stdout) { if( g_log->log_component[c].level >= OAILOG_TRACE ) logRecord_mt(__FILE__, __FUNCTION__, __LINE__,c, OAILOG_TRACE, x) ;} else { T(T_LEGACY_ ## c ## _TRACE, T_PRINTF(x)) ;}} while (0)
-# define LOG_F(c, x...) do { if (T_stdout) { if( g_log->log_component[c].level >= OAILOG_FILE ) logRecord_mt(__FILE__, __FUNCTION__, __LINE__,c, OAILOG_FILE, x) ;}} while (0) /* */
+ /* macro used to dump a buffer or a message as in openair2/RRC/LTE/RRC_eNB.c, replaces LOG_F macro */
+# define LOG_DUMPMSG(c, f, b, s, x...) do { if(g_log->dump_mask & f) log_dump(c, b, s, LOG_DUMP_CHAR, x) ;} while (0) /* */
# define nfapi_log(FILE, FNC, LN, COMP, LVL, F...) do { if (T_stdout) { logRecord_mt(__FILE__, __FUNCTION__, __LINE__,COMP, LVL, F) ;}} while (0) /* */
/* bitmask dependant macros, to isolate debugging code */
-# define LOG_DEBUG_BEGIN(D) if (g_log->debug_mask & D) {
-# define LOG_DEBUG_END }
- /* bitmask dependant macros, to generate matlab files */
-# define LOG_M_BEGIN(D) if (g_log->matlab_mask & D) {
-# define LOG_M_END }
+# define LOG_DEBUGFLAG(D) (g_log->debug_mask & D)
+
+ /* bitmask dependant macros, to generate debug file such as matlab file or message dump */
+# define LOG_DUMPFLAG(D) (g_log->dump_mask & D)
# define LOG_M(file, vector, data, len, dec, format) do { write_file_matlab(file, vector, data, len, dec, format);} while(0)/* */
/* define variable only used in LOG macro's */
# define LOG_VAR(A,B) A B
@@ -345,22 +378,22 @@ int32_t write_file_matlab(const char *fname, const char *vname, void *data, int
# define LOG_E(c, x...) /* */
# define LOG_D(c, x...) /* */
# define LOG_T(c, x...) /* */
-# define LOG_F(c, x...) /* */
+
+# define LOG_DUMPMSG(c, b, s, x...) /* */
# define nfapi_log(FILE, FNC, LN, COMP, LVL, FMT...)
-# define LOG_DEBUG_BEGIN(D) if (0) {
-# define LOG_DEBUG_END }
-# define LOG_M_BEGIN(D) if (0) {
-# define LOG_M_END }
+# define LOG_DEBUGFLAG(D) ( 0 )
+# define LOG_DUMPFLAG(D) ( 0 )
# define LOG_M(file, vector, data, len, dec, format)
# define LOG_VAR(A,B)
# endif /* T_TRACER */
/* avoid warnings for variables only used in LOG macro's but set outside debug section */
-#define LOG_USEDINLOG_VAR(A,B) __attribute__((unused)) A B
+#define GCC_NOTUSED __attribute__((unused))
+#define LOG_USEDINLOG_VAR(A,B) GCC_NOTUSED A B
/* unfiltered macros, usefull for simulators or messages at init time, before log is configured */
#define LOG_UM(file, vector, data, len, dec, format) do { write_file_matlab(file, vector, data, len, dec, format);} while(0)
-
#define LOG_UI(c, x...) do {logRecord_mt(__FILE__, __FUNCTION__, __LINE__,c, OAILOG_INFO, x) ; } while(0)
+#define LOG_UDUMPMSG(c, b, s, f, x...) do { log_dump(c, b, s, f, x) ;} while (0) /* */
/* @}*/
@@ -368,9 +401,12 @@ int32_t write_file_matlab(const char *fname, const char *vname, void *data, int
* @ingroup _macro
* @brief Macro of some useful functions defined by LOG
* @{*/
-#define LOG_ENTER(c) do {LOG_T(c, "Entering\n");}while(0) /*!< \brief Macro to log a message with severity DEBUG when entering a function */
-#define LOG_EXIT(c) do {LOG_T(c,"Exiting\n"); return;}while(0) /*!< \brief Macro to log a message with severity TRACE when exiting a function */
-#define LOG_RETURN(c,x) do {uint32_t __rv;__rv=(unsigned int)(x);LOG_T(c,"Returning %08x\n", __rv);return((typeof(x))__rv);}while(0) /*!< \brief Macro to log a function exit, including integer value, then to return a value to the calling function */
+#define LOG_ENTER(c) do {LOG_T(c, "Entering %s\n",__FUNCTION__);}while(0) /*!< \brief Macro to log a message with severity DEBUG when entering a function */
+#define LOG_END(c) do {LOG_T(c, "End of %s\n",__FUNCTION__);}while(0) /*!< \brief Macro to log a message with severity DEBUG when entering a function */
+#define LOG_EXIT(c) do { LOG_END(c); return;}while(0) /*!< \brief Macro to log a message with severity TRACE when exiting a function */
+#define LOG_RETURN(c,r) do {LOG_T(c,"Leaving %s (rc = %08lx)\n", __FUNCTION__ , (unsigned long)(r) );return(r);}while(0) /*!< \brief Macro to log a function exit, including integer value, then to return a value to the calling function */
+
+
/* @}*/
static __inline__ uint64_t rdtsc(void) {
diff --git a/common/utils/LOG/vcd_signal_dumper.c b/common/utils/LOG/vcd_signal_dumper.c
index 607fe85703..666bf46d44 100644
--- a/common/utils/LOG/vcd_signal_dumper.c
+++ b/common/utils/LOG/vcd_signal_dumper.c
@@ -44,7 +44,6 @@
#include
#include "assertions.h"
-#include "signals.h"
#include "vcd_signal_dumper.h"
diff --git a/common/utils/T/T_messages.txt b/common/utils/T/T_messages.txt
index 676f329a0e..2bce891ac9 100644
--- a/common/utils/T/T_messages.txt
+++ b/common/utils/T/T_messages.txt
@@ -750,6 +750,27 @@ ID = LEGACY_OSA_TRACE
GROUP = ALL:LEGACY_OSA:LEGACY_GROUP_TRACE:LEGACY
FORMAT = string,log
+ID = LEGACY_ASN_INFO
+ DESC = ASN legacy logs - info level
+ GROUP = ALL:LEGACY_ASN:LEGACY_GROUP_INFO:LEGACY
+ FORMAT = string,log
+ID = LEGACY_ASN_ERROR
+ DESC = ASN legacy logs - error level
+ GROUP = ALL:LEGACY_ASN:LEGACY_GROUP_ERROR:LEGACY
+ FORMAT = string,log
+ID = LEGACY_ASN_WARNING
+ DESC = ASN legacy logs - warning level
+ GROUP = ALL:LEGACY_ASN:LEGACY_GROUP_WARNING:LEGACY
+ FORMAT = string,log
+ID = LEGACY_ASN_DEBUG
+ DESC = ASN legacy logs - debug level
+ GROUP = ALL:LEGACY_ASN:LEGACY_GROUP_DEBUG:LEGACY
+ FORMAT = string,log
+ID = LEGACY_ASN_TRACE
+ DESC = ASN legacy logs - trace level
+ GROUP = ALL:LEGACY_ASN:LEGACY_GROUP_TRACE:LEGACY
+ FORMAT = string,log
+
ID = LEGACY_SIM_INFO
DESC = SIM legacy logs - info level
GROUP = ALL:LEGACY_SIM:LEGACY_GROUP_INFO:LEGACY
diff --git a/common/utils/T/tracer/gui/x.c b/common/utils/T/tracer/gui/x.c
index 94448eb666..ef5334767c 100644
--- a/common/utils/T/tracer/gui/x.c
+++ b/common/utils/T/tracer/gui/x.c
@@ -150,7 +150,17 @@ x_image *x_create_image(x_connection *_x, unsigned char *data,
vs = XGetVisualInfo(x->d, VisualDepthMask | VisualClassMask |
VisualRedMaskMask | VisualGreenMaskMask | VisualBlueMaskMask |
VisualBitsPerRGBMask, &template, &nvs);
- if (vs == NULL || nvs == 0) ERR("no good visual found\n");
+
+ if (vs == NULL) {
+ /* try again with 32 bpp */
+ template.depth = 32;
+ vs = XGetVisualInfo(x->d, VisualDepthMask | VisualClassMask |
+ VisualRedMaskMask | VisualGreenMaskMask | VisualBlueMaskMask |
+ VisualBitsPerRGBMask, &template, &nvs);
+ }
+
+ if (vs == NULL) ERR("no good visual found\n");
+
v = vs[0].visual;
XFree(vs);
diff --git a/common/utils/assertions.h b/common/utils/assertions.h
index f6728caf7b..b872b009e2 100644
--- a/common/utils/assertions.h
+++ b/common/utils/assertions.h
@@ -19,9 +19,72 @@
* contact@openairinterface.org
*/
-#ifndef UTILS_ASSERTIONS_H_
-#define UTILS_ASSERTIONS_H_
+#include
+#include
+#include
+#ifdef CMAKER
+#include
+#endif
-#include "./itti/assertions.h"
+#if defined(ENB_MODE)
+# define display_backtrace()
+#else
+# include "backtrace.h"
+#endif
-#endif /* UTILS_ASSERTIONS_H_ */
+#ifndef ASSERTIONS_H_
+#define ASSERTIONS_H_
+
+void output_log_mem(void);
+#define _Assert_Exit_ \
+{ \
+ fprintf(stderr, "\nExiting execution\n"); \
+ display_backtrace(); \
+ fflush(stdout); \
+ fflush(stderr); \
+ exit(EXIT_FAILURE); \
+}
+
+#define _Assert_(cOND, aCTION, fORMAT, aRGS...) \
+do { \
+ if (!(cOND)) { \
+ fprintf(stderr, "\nAssertion ("#cOND") failed!\n" \
+ "In %s() %s:%d\n" fORMAT, \
+ __FUNCTION__, __FILE__, __LINE__, ##aRGS); \
+ aCTION; \
+ } \
+} while(0)
+
+#define AssertFatal(cOND, fORMAT, aRGS...) _Assert_(cOND, _Assert_Exit_, fORMAT, ##aRGS)
+
+#define AssertError(cOND, aCTION, fORMAT, aRGS...) _Assert_(cOND, aCTION, fORMAT, ##aRGS)
+
+
+
+#define DevCheck(cOND, vALUE1, vALUE2, vALUE3) \
+_Assert_(cOND, _Assert_Exit_, #vALUE1 ": %" PRIdMAX "\n" #vALUE2 ": %" PRIdMAX "\n" #vALUE3 ": %" PRIdMAX "\n\n", \
+ (intmax_t)vALUE1, (intmax_t)vALUE2, (intmax_t)vALUE3)
+
+#define DevCheck4(cOND, vALUE1, vALUE2, vALUE3, vALUE4) \
+_Assert_(cOND, _Assert_Exit_, #vALUE1": %" PRIdMAX "\n" #vALUE2 ": %" PRIdMAX "\n" #vALUE3 ": %" PRIdMAX "\n" #vALUE4 ": %" PRIdMAX "\n\n", \
+ (intmax_t)vALUE1, (intmax_t)vALUE2, (intmax_t)vALUE3, (intmax_t)vALUE4)
+
+#define DevParam(vALUE1, vALUE2, vALUE3) DevCheck(0, vALUE1, vALUE2, vALUE3)
+
+#define DevAssert(cOND) _Assert_(cOND, _Assert_Exit_, "")
+
+#define DevMessage(mESSAGE) _Assert_(0, _Assert_Exit_, #mESSAGE)
+
+#define CHECK_INIT_RETURN(fCT) \
+do { \
+ int fct_ret; \
+ if ((fct_ret = (fCT)) != 0) { \
+ fprintf(stderr, "Function "#fCT" has failed\n" \
+ "returning %d\n", fct_ret); \
+ fflush(stdout); \
+ fflush(stderr); \
+ exit(EXIT_FAILURE); \
+ } \
+} while(0)
+
+#endif /* ASSERTIONS_H_ */
diff --git a/common/utils/itti/backtrace.c b/common/utils/backtrace.c
similarity index 100%
rename from common/utils/itti/backtrace.c
rename to common/utils/backtrace.c
diff --git a/common/utils/itti/backtrace.h b/common/utils/backtrace.h
similarity index 100%
rename from common/utils/itti/backtrace.h
rename to common/utils/backtrace.h
diff --git a/common/utils/itti/Makefile.am b/common/utils/itti/Makefile.am
deleted file mode 100644
index 93f5704603..0000000000
--- a/common/utils/itti/Makefile.am
+++ /dev/null
@@ -1,32 +0,0 @@
-AM_CFLAGS = @ADD_CFLAGS@ \
- -I$(top_srcdir)/UTILS \
- -I$(top_srcdir)/COMMON \
- -I$(OPENAIR2_DIR)/UTIL/LFDS/liblfds6.1.1/liblfds611/inc \
- -DENABLE_EVENT_FD
-
-noinst_LTLIBRARIES = libitti.la
-
-BUILT_SOURCES = $(abs_top_builddir)/INTERTASK_INTERFACE/UTIL/LFDS/liblfds6.1.1/liblfds611/bin/liblfds611.a
-
-$(abs_top_builddir)/INTERTASK_INTERFACE/UTIL/LFDS/liblfds6.1.1/liblfds611/bin/liblfds611.a:
- @if [ ! -d $(abs_top_builddir)/INTERTASK_INTERFACE/UTIL/LFDS/liblfds6.1.1/liblfds611/bin ]; then mkdir -p $(abs_top_builddir)/INTERTASK_INTERFACE/UTIL/LFDS/liblfds6.1.1/liblfds611/bin; fi;
- @if [ ! -d $(abs_top_builddir)/INTERTASK_INTERFACE/UTIL/LFDS/liblfds6.1.1/liblfds611/obj ]; then mkdir -p $(abs_top_builddir)/INTERTASK_INTERFACE/UTIL/LFDS/liblfds6.1.1/liblfds611/obj; fi;
- @$(MAKE) -C $(OPENAIR2_DIR)/UTIL/LFDS/liblfds6.1.1/liblfds611/ -f makefile.linux OUTDIR=$(abs_top_builddir)/INTERTASK_INTERFACE/UTIL/LFDS/liblfds6.1.1/liblfds611
-
-libitti_la_LDFLAGS = -all-static
-libitti_la_SOURCES = \
- gtpv1_u_messages_def.h gtpv1_u_messages_types.h \
- nas_messages_def.h nas_messages_types.h \
- timer_messages_def.h timer_messages_types.h \
- s11_messages_def.h s11_messages_types.h \
- s1ap_messages_def.h s1ap_messages_types.h \
- s6a_messages_def.h s6a_messages_types.h \
- sgw_lite_def.h sgw_lite_messages_types.h \
- sctp_messages_def.h sctp_messages_types.h \
- udp_message_def.h udp_messages_types.h \
- intertask_interface.c intertask_interface.h \
- intertask_interface_dump.c intertask_interface_dump.h \
- assertions.h \
- backtrace.c backtrace.h \
- signals.c signals.h \
- timer.c timer.h
diff --git a/common/utils/itti/assertions.h b/common/utils/itti/assertions.h
deleted file mode 100644
index b872b009e2..0000000000
--- a/common/utils/itti/assertions.h
+++ /dev/null
@@ -1,90 +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
-#ifdef CMAKER
-#include
-#endif
-
-#if defined(ENB_MODE)
-# define display_backtrace()
-#else
-# include "backtrace.h"
-#endif
-
-#ifndef ASSERTIONS_H_
-#define ASSERTIONS_H_
-
-void output_log_mem(void);
-#define _Assert_Exit_ \
-{ \
- fprintf(stderr, "\nExiting execution\n"); \
- display_backtrace(); \
- fflush(stdout); \
- fflush(stderr); \
- exit(EXIT_FAILURE); \
-}
-
-#define _Assert_(cOND, aCTION, fORMAT, aRGS...) \
-do { \
- if (!(cOND)) { \
- fprintf(stderr, "\nAssertion ("#cOND") failed!\n" \
- "In %s() %s:%d\n" fORMAT, \
- __FUNCTION__, __FILE__, __LINE__, ##aRGS); \
- aCTION; \
- } \
-} while(0)
-
-#define AssertFatal(cOND, fORMAT, aRGS...) _Assert_(cOND, _Assert_Exit_, fORMAT, ##aRGS)
-
-#define AssertError(cOND, aCTION, fORMAT, aRGS...) _Assert_(cOND, aCTION, fORMAT, ##aRGS)
-
-
-
-#define DevCheck(cOND, vALUE1, vALUE2, vALUE3) \
-_Assert_(cOND, _Assert_Exit_, #vALUE1 ": %" PRIdMAX "\n" #vALUE2 ": %" PRIdMAX "\n" #vALUE3 ": %" PRIdMAX "\n\n", \
- (intmax_t)vALUE1, (intmax_t)vALUE2, (intmax_t)vALUE3)
-
-#define DevCheck4(cOND, vALUE1, vALUE2, vALUE3, vALUE4) \
-_Assert_(cOND, _Assert_Exit_, #vALUE1": %" PRIdMAX "\n" #vALUE2 ": %" PRIdMAX "\n" #vALUE3 ": %" PRIdMAX "\n" #vALUE4 ": %" PRIdMAX "\n\n", \
- (intmax_t)vALUE1, (intmax_t)vALUE2, (intmax_t)vALUE3, (intmax_t)vALUE4)
-
-#define DevParam(vALUE1, vALUE2, vALUE3) DevCheck(0, vALUE1, vALUE2, vALUE3)
-
-#define DevAssert(cOND) _Assert_(cOND, _Assert_Exit_, "")
-
-#define DevMessage(mESSAGE) _Assert_(0, _Assert_Exit_, #mESSAGE)
-
-#define CHECK_INIT_RETURN(fCT) \
-do { \
- int fct_ret; \
- if ((fct_ret = (fCT)) != 0) { \
- fprintf(stderr, "Function "#fCT" has failed\n" \
- "returning %d\n", fct_ret); \
- fflush(stdout); \
- fflush(stderr); \
- exit(EXIT_FAILURE); \
- } \
-} while(0)
-
-#endif /* ASSERTIONS_H_ */
diff --git a/common/utils/itti/intertask_interface.c b/common/utils/itti/intertask_interface.c
deleted file mode 100644
index d088b59c04..0000000000
--- a/common/utils/itti/intertask_interface.c
+++ /dev/null
@@ -1,930 +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
-
-#if !defined(TRUE)
-#define TRUE 1
-#endif
-
-#include "liblfds611.h"
-
-#include "assertions.h"
-#include "intertask_interface.h"
-
-#if T_TRACER
-#include "T.h"
-#endif
-
-/* Includes "intertask_interface_init.h" to check prototype coherence, but
- * disable threads and messages information generation.
- */
-#define CHECK_PROTOTYPE_ONLY
-#include "intertask_interface_init.h"
-#undef CHECK_PROTOTYPE_ONLY
-
-#include "signals.h"
-#include "timer.h"
-
-/* ITTI DEBUG groups */
-#define ITTI_DEBUG_POLL (1<<0)
-#define ITTI_DEBUG_SEND (1<<1)
-#define ITTI_DEBUG_EVEN_FD (1<<2)
-#define ITTI_DEBUG_INIT (1<<3)
-#define ITTI_DEBUG_EXIT (1<<4)
-#define ITTI_DEBUG_ISSUES (1<<5)
-#define ITTI_DEBUG_MP_STATISTICS (1<<6)
-
-const int itti_debug = (ITTI_DEBUG_ISSUES | ITTI_DEBUG_MP_STATISTICS);
-
-# define ITTI_DEBUG(m, x, args...) do { if ((m) & itti_debug) {fprintf(stdout, "[ITTI][D]"x, ##args); fflush (stdout);} } while(0);
-#define ITTI_ERROR(x, args...) do { fprintf(stdout, "[ITTI][E]"x, ##args); fflush (stdout); } while(0);
-
-/* Global message size */
-#define MESSAGE_SIZE(mESSAGEiD) (sizeof(MessageHeader) + itti_desc.messages_info[mESSAGEiD].size)
-
-
-extern int emulate_rf;
-
-typedef enum task_state_s {
- TASK_STATE_NOT_CONFIGURED, TASK_STATE_STARTING, TASK_STATE_READY, TASK_STATE_ENDED, TASK_STATE_MAX,
-} task_state_t;
-
-/* This list acts as a FIFO of messages received by tasks (RRC, NAS, ...) */
-typedef struct message_list_s {
- MessageDef *msg; ///< Pointer to the message
-
- message_number_t message_number; ///< Unique message number
- uint32_t message_priority; ///< Message priority
-} message_list_t;
-
-typedef struct thread_desc_s {
- /* pthread associated with the thread */
- pthread_t task_thread;
-
- /* State of the thread */
- volatile task_state_t task_state;
-
- /* This fd is used internally by ITTI. */
- int epoll_fd;
-
- /* The thread fd */
- int task_event_fd;
-
- /* Number of events to monitor */
- uint16_t nb_events;
-
-
- /* 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;
-
- /* Flag to mark real time thread */
- unsigned real_time;
-
- /* Counter to indicate that messages are pending for the thread */
- unsigned messages_pending;
-} thread_desc_t;
-
-typedef struct task_desc_s {
- /* Queue of messages belonging to the task */
- struct lfds611_queue_state *message_queue;
-} task_desc_t;
-
-typedef struct itti_desc_s {
- thread_desc_t *threads;
- task_desc_t *tasks;
-
- /* Current message number. Incremented every call to send_msg_to_task */
- message_number_t message_number __attribute__((aligned(8)));
-
- thread_id_t thread_max;
- task_id_t task_max;
- MessagesIds messages_id_max;
-
- boolean_t thread_handling_signals;
- pthread_t thread_ref;
-
- const task_info_t *tasks_info;
- const message_info_t *messages_info;
-
- itti_lte_time_t lte_time;
-
- int running;
-
- volatile uint32_t created_tasks;
- volatile uint32_t ready_tasks;
- volatile int wait_tasks;
-} itti_desc_t;
-
-static itti_desc_t itti_desc;
-
-void *itti_malloc(task_id_t origin_task_id, task_id_t destination_task_id, ssize_t size)
-{
- void *ptr = NULL;
-
- ptr = malloc (size);
- if (ptr) memset(ptr,0,size);
-
- AssertFatal (ptr != NULL, "Memory allocation of %d bytes failed (%d -> %d)!\n", (int) size, origin_task_id, destination_task_id);
-
- return ptr;
-}
-
-int itti_free(task_id_t task_id, void *ptr)
-{
- int result = EXIT_SUCCESS;
- AssertFatal (ptr != NULL, "Trying to free a NULL pointer (%d)!\n", task_id);
-
- free (ptr);
-
- return (result);
-}
-
-static inline message_number_t itti_increment_message_number(void)
-{
- /* Atomic operation supported by GCC: returns the current message number
- * and then increment it by 1.
- * This can be done without mutex.
- */
- return __sync_fetch_and_add (&itti_desc.message_number, 1);
-}
-
-static inline uint32_t itti_get_message_priority(MessagesIds message_id)
-{
- AssertFatal (message_id < itti_desc.messages_id_max, "Message id (%d) is out of range (%d)!\n", message_id, itti_desc.messages_id_max);
-
- return (itti_desc.messages_info[message_id].priority);
-}
-
-const char *itti_get_message_name(MessagesIds message_id)
-{
- AssertFatal (message_id < itti_desc.messages_id_max, "Message id (%d) is out of range (%d)!\n", message_id, itti_desc.messages_id_max);
-
- return (itti_desc.messages_info[message_id].name);
-}
-
-const char *itti_get_task_name(task_id_t task_id)
-{
- if (itti_desc.task_max > 0) {
- AssertFatal (task_id < itti_desc.task_max, "Task id (%d) is out of range (%d)!\n", task_id, itti_desc.task_max);
- } else {
- return ("ITTI NOT INITIALIZED !!!");
- }
-
- return (itti_desc.tasks_info[task_id].name);
-}
-
-static task_id_t itti_get_current_task_id(void)
-{
- task_id_t task_id;
- thread_id_t thread_id;
- pthread_t thread = pthread_self ();
-
- for (task_id = TASK_FIRST; task_id < itti_desc.task_max; task_id++) {
- thread_id = TASK_GET_THREAD_ID(task_id);
-
- if (itti_desc.threads[thread_id].task_thread == thread) {
- return task_id;
- }
- }
-
- return TASK_UNKNOWN;
-}
-
-void itti_update_lte_time(uint32_t frame, uint8_t slot)
-{
- itti_desc.lte_time.frame = frame;
- itti_desc.lte_time.slot = slot;
-}
-
-int itti_send_broadcast_message(MessageDef *message_p)
-{
- task_id_t destination_task_id;
- task_id_t origin_task_id;
- thread_id_t origin_thread_id;
- uint32_t thread_id;
- int ret = 0;
- int result;
-
- AssertFatal (message_p != NULL, "Trying to broadcast a NULL message!\n");
-
- origin_task_id = message_p->ittiMsgHeader.originTaskId;
- origin_thread_id = TASK_GET_THREAD_ID(origin_task_id);
-
- destination_task_id = TASK_FIRST;
-
- for (thread_id = THREAD_FIRST; thread_id < itti_desc.thread_max; thread_id++) {
- MessageDef *new_message_p;
-
- while (thread_id != TASK_GET_THREAD_ID(destination_task_id)) {
- destination_task_id++;
- }
-
- /* Skip task that broadcast the message */
- if (thread_id != origin_thread_id) {
- /* Skip tasks which are not running */
- if (itti_desc.threads[thread_id].task_state == TASK_STATE_READY) {
- size_t size = sizeof(MessageHeader) + message_p->ittiMsgHeader.ittiMsgSize;
- new_message_p = itti_malloc( origin_task_id, destination_task_id, size );
- AssertFatal (new_message_p != NULL, "New message allocation failed!\n");
-
- memcpy( new_message_p, message_p, size );
- result = itti_send_msg_to_task (destination_task_id, INSTANCE_DEFAULT, new_message_p);
- AssertFatal (result >= 0, "Failed to send message %d to thread %d (task %d)!\n", message_p->ittiMsgHeader.messageId, thread_id, destination_task_id);
- }
- }
- }
-
- result = itti_free (ITTI_MSG_ORIGIN_ID(message_p), message_p);
- AssertFatal (result == EXIT_SUCCESS, "Failed to free memory (%d)!\n", result);
-
- return ret;
-}
-
-MessageDef *itti_alloc_new_message_sized(task_id_t origin_task_id, MessagesIds message_id, MessageHeaderSize size)
-{
- MessageDef *temp = NULL;
-
- AssertFatal (message_id < itti_desc.messages_id_max, "Message id (%d) is out of range (%d)!\n", message_id, itti_desc.messages_id_max);
-
- if (origin_task_id == TASK_UNKNOWN) {
- /* Try to identify real origin task ID */
- origin_task_id = itti_get_current_task_id();
- }
-
- temp = itti_malloc (origin_task_id, TASK_UNKNOWN, sizeof(MessageHeader) + size);
-
- temp->ittiMsgHeader.messageId = message_id;
- temp->ittiMsgHeader.originTaskId = origin_task_id;
- temp->ittiMsgHeader.ittiMsgSize = size;
-
- return temp;
-}
-
-MessageDef *itti_alloc_new_message(task_id_t origin_task_id, MessagesIds message_id)
-{
- return itti_alloc_new_message_sized(origin_task_id, message_id, itti_desc.messages_info[message_id].size);
-}
-
-int itti_send_msg_to_task(task_id_t destination_task_id, instance_t instance, MessageDef *message)
-{
- thread_id_t destination_thread_id;
- task_id_t origin_task_id;
- message_list_t *new;
- uint32_t priority;
- message_number_t message_number;
- uint32_t message_id;
-
- AssertFatal (message != NULL, "Message is NULL!\n");
- AssertFatal (destination_task_id < itti_desc.task_max, "Destination task id (%d) is out of range (%d)\n", destination_task_id, itti_desc.task_max);
-
- destination_thread_id = TASK_GET_THREAD_ID(destination_task_id);
- message->ittiMsgHeader.destinationTaskId = destination_task_id;
- message->ittiMsgHeader.instance = instance;
- message->ittiMsgHeader.lte_time.frame = itti_desc.lte_time.frame;
- message->ittiMsgHeader.lte_time.slot = itti_desc.lte_time.slot;
- message_id = message->ittiMsgHeader.messageId;
- AssertFatal (message_id < itti_desc.messages_id_max, "Message id (%d) is out of range (%d)!\n", message_id, itti_desc.messages_id_max);
-
- origin_task_id = ITTI_MSG_ORIGIN_ID(message);
-
- priority = itti_get_message_priority (message_id);
-
- /* Increment the global message number */
- message_number = itti_increment_message_number ();
-
- if (destination_task_id != TASK_UNKNOWN) {
-
- if (itti_desc.threads[destination_thread_id].task_state == TASK_STATE_ENDED ||
- itti_desc.threads[destination_thread_id].task_state == TASK_STATE_NOT_CONFIGURED) {
- ITTI_DEBUG(ITTI_DEBUG_ISSUES, " Message %s, number %lu with priority %d can not be sent from %s to queue (%u:%s), unconfigured or ended destination task!\n",
- itti_desc.messages_info[message_id].name,
- message_number,
- priority,
- itti_get_task_name(origin_task_id),
- destination_task_id,
- itti_get_task_name(destination_task_id));
- } else {
- if(!emulate_rf){
- /* We cannot send a message if the task is not running */
- AssertFatal (itti_desc.threads[destination_thread_id].task_state == TASK_STATE_READY,
- "Task %s Cannot send message %s (%d) to thread %d, it is not in ready state (%d)!\n",
- itti_get_task_name(origin_task_id),
- itti_desc.messages_info[message_id].name,
- message_id,
- destination_thread_id,
- itti_desc.threads[destination_thread_id].task_state);
- }
-
- /* Allocate new list element */
- new = (message_list_t *) itti_malloc (origin_task_id, destination_task_id, sizeof(struct message_list_s));
-
- /* Fill in members */
- new->msg = message;
- new->message_number = message_number;
- new->message_priority = priority;
-
- /* Enqueue message in destination task queue */
- if (lfds611_queue_enqueue(itti_desc.tasks[destination_task_id].message_queue, new) == 0) {
- AssertFatal(0, "Error: lfds611_queue_enqueue returns 0, queue is full, exiting\n");
- }
-
- {
- /* Only use event fd for tasks, subtasks will pool the queue */
- if (TASK_GET_PARENT_TASK_ID(destination_task_id) == TASK_UNKNOWN) {
- ssize_t write_ret;
- eventfd_t sem_counter = 1;
-
- /* Call to write for an event fd must be of 8 bytes */
- write_ret = write (itti_desc.threads[destination_thread_id].task_event_fd, &sem_counter, sizeof(sem_counter));
- AssertFatal (write_ret == sizeof(sem_counter), "Write to task message FD (%d) failed (%d/%d)\n",
- destination_thread_id, (int) write_ret, (int) sizeof(sem_counter));
- }
- }
-
- ITTI_DEBUG(ITTI_DEBUG_SEND, " Message %s, number %lu with priority %d successfully sent from %s to queue (%u:%s)\n",
- itti_desc.messages_info[message_id].name,
- message_number,
- priority,
- itti_get_task_name(origin_task_id),
- destination_task_id,
- itti_get_task_name(destination_task_id));
- }
- } else {
- /* This is a debug message to TASK_UNKNOWN, we can release safely release it */
- int result = itti_free(origin_task_id, message);
- AssertFatal (result == EXIT_SUCCESS, "Failed to free memory (%d)!\n", result);
- }
-
- return 0;
-}
-
-/* same as itti_send_msg_to_task but returns -1 in case of failure instead of crashing */
-/* TODO: this is a hack - the whole logic needs a proper rework. */
-/* look for HACK_RLC_UM_LIMIT for others places related to the hack. Please do not remove this comment. */
-int itti_try_send_msg_to_task(task_id_t destination_task_id, instance_t instance, MessageDef *message)
-{
- thread_id_t destination_thread_id;
- task_id_t origin_task_id;
- message_list_t *new;
- uint32_t priority;
- message_number_t message_number;
- uint32_t message_id;
-
- AssertFatal (message != NULL, "Message is NULL!\n");
- AssertFatal (destination_task_id < itti_desc.task_max, "Destination task id (%d) is out of range (%d)\n", destination_task_id, itti_desc.task_max);
-
- destination_thread_id = TASK_GET_THREAD_ID(destination_task_id);
- message->ittiMsgHeader.destinationTaskId = destination_task_id;
- message->ittiMsgHeader.instance = instance;
- message->ittiMsgHeader.lte_time.frame = itti_desc.lte_time.frame;
- message->ittiMsgHeader.lte_time.slot = itti_desc.lte_time.slot;
- message_id = message->ittiMsgHeader.messageId;
- AssertFatal (message_id < itti_desc.messages_id_max, "Message id (%d) is out of range (%d)!\n", message_id, itti_desc.messages_id_max);
-
- origin_task_id = ITTI_MSG_ORIGIN_ID(message);
-
- priority = itti_get_message_priority (message_id);
-
- /* Increment the global message number */
- message_number = itti_increment_message_number ();
-
- if (destination_task_id != TASK_UNKNOWN) {
-
- if (itti_desc.threads[destination_thread_id].task_state == TASK_STATE_ENDED ||
- itti_desc.threads[destination_thread_id].task_state == TASK_STATE_NOT_CONFIGURED) {
- ITTI_DEBUG(ITTI_DEBUG_ISSUES, " Message %s, number %lu with priority %d can not be sent from %s to queue (%u:%s), unconfigured or ended destination task!\n",
- itti_desc.messages_info[message_id].name,
- message_number,
- priority,
- itti_get_task_name(origin_task_id),
- destination_task_id,
- itti_get_task_name(destination_task_id));
- } else {
- /* We cannot send a message if the task is not running */
- AssertFatal (itti_desc.threads[destination_thread_id].task_state == TASK_STATE_READY,
- "Task %s Cannot send message %s (%d) to thread %d, it is not in ready state (%d)!\n",
- itti_get_task_name(origin_task_id),
- itti_desc.messages_info[message_id].name,
- message_id,
- destination_thread_id,
- itti_desc.threads[destination_thread_id].task_state);
-
- /* Allocate new list element */
- new = (message_list_t *) itti_malloc (origin_task_id, destination_task_id, sizeof(struct message_list_s));
-
- /* Fill in members */
- new->msg = message;
- new->message_number = message_number;
- new->message_priority = priority;
-
- /* Enqueue message in destination task queue */
- if (lfds611_queue_enqueue(itti_desc.tasks[destination_task_id].message_queue, new) == 0) {
- itti_free(origin_task_id, new);
- return -1;
- }
-
- {
- /* Only use event fd for tasks, subtasks will pool the queue */
- if (TASK_GET_PARENT_TASK_ID(destination_task_id) == TASK_UNKNOWN) {
- ssize_t write_ret;
- eventfd_t sem_counter = 1;
-
- /* Call to write for an event fd must be of 8 bytes */
- write_ret = write (itti_desc.threads[destination_thread_id].task_event_fd, &sem_counter, sizeof(sem_counter));
- AssertFatal (write_ret == sizeof(sem_counter), "Write to task message FD (%d) failed (%d/%d)\n",
- destination_thread_id, (int) write_ret, (int) sizeof(sem_counter));
- }
- }
-
- ITTI_DEBUG(ITTI_DEBUG_SEND, " Message %s, number %lu with priority %d successfully sent from %s to queue (%u:%s)\n",
- itti_desc.messages_info[message_id].name,
- message_number,
- priority,
- itti_get_task_name(origin_task_id),
- destination_task_id,
- itti_get_task_name(destination_task_id));
- }
- } else {
- /* This is a debug message to TASK_UNKNOWN, we can release safely release it */
- int result = itti_free(origin_task_id, message);
- AssertFatal (result == EXIT_SUCCESS, "Failed to free memory (%d)!\n", result);
- }
-
- return 0;
-}
-
-void itti_subscribe_event_fd(task_id_t task_id, int fd)
-{
- thread_id_t thread_id;
- struct epoll_event event;
-
- AssertFatal (task_id < itti_desc.task_max, "Task id (%d) is out of range (%d)!\n", task_id, itti_desc.task_max);
-
- thread_id = TASK_GET_THREAD_ID(task_id);
- itti_desc.threads[thread_id].nb_events++;
-
- /* Reallocate the events */
- itti_desc.threads[thread_id].events = realloc(
- itti_desc.threads[thread_id].events,
- itti_desc.threads[thread_id].nb_events * sizeof(struct epoll_event));
-
- event.events = EPOLLIN | EPOLLERR;
- event.data.u64 = 0;
- event.data.fd = fd;
-
- /* Add the event fd to the list of monitored events */
- if (epoll_ctl(itti_desc.threads[thread_id].epoll_fd, EPOLL_CTL_ADD, fd,
- &event) != 0) {
- /* Always assert on this condition */
- AssertFatal (0, "epoll_ctl (EPOLL_CTL_ADD) failed for task %s, fd %d: %s!\n",
- itti_get_task_name(task_id), fd, strerror(errno));
- }
-
- ITTI_DEBUG(ITTI_DEBUG_EVEN_FD, " Successfully subscribed fd %d for task %s\n", fd, itti_get_task_name(task_id));
-}
-
-void itti_unsubscribe_event_fd(task_id_t task_id, int fd)
-{
- thread_id_t thread_id;
-
- AssertFatal (task_id < itti_desc.task_max, "Task id (%d) is out of range (%d)!\n", task_id, itti_desc.task_max);
- AssertFatal (fd >= 0, "File descriptor (%d) is invalid!\n", fd);
-
- thread_id = TASK_GET_THREAD_ID(task_id);
-
- /* Add the event fd to the list of monitored events */
- if (epoll_ctl(itti_desc.threads[thread_id].epoll_fd, EPOLL_CTL_DEL, fd, NULL) != 0) {
- /* Always assert on this condition */
- AssertFatal (0, "epoll_ctl (EPOLL_CTL_DEL) failed for task %s, fd %d: %s!\n",
- itti_get_task_name(task_id), fd, strerror(errno));
- }
-
- itti_desc.threads[thread_id].nb_events--;
- itti_desc.threads[thread_id].events = realloc(
- itti_desc.threads[thread_id].events,
- itti_desc.threads[thread_id].nb_events * sizeof(struct epoll_event));
-}
-
-int itti_get_events(task_id_t task_id, struct epoll_event **events)
-{
- thread_id_t thread_id;
-
- AssertFatal (task_id < itti_desc.task_max, "Task id (%d) is out of range (%d)\n", task_id, itti_desc.task_max);
-
- thread_id = TASK_GET_THREAD_ID(task_id);
- *events = itti_desc.threads[thread_id].events;
-
- return itti_desc.threads[thread_id].epoll_nb_events;
-}
-
-static inline void itti_receive_msg_internal_event_fd(task_id_t task_id, uint8_t polling, MessageDef **received_msg)
-{
- thread_id_t thread_id;
- int epoll_ret = 0;
- int epoll_timeout = 0;
- int i;
-
- AssertFatal (task_id < itti_desc.task_max, "Task id (%d) is out of range (%d)!\n", task_id, itti_desc.task_max);
- AssertFatal (received_msg != NULL, "Received message is NULL!\n");
-
- thread_id = TASK_GET_THREAD_ID(task_id);
- *received_msg = NULL;
-
- if (polling) {
- /* In polling mode we set the timeout to 0 causing epoll_wait to return
- * immediately.
- */
- epoll_timeout = 0;
- } else {
- /* timeout = -1 causes the epoll_wait to wait indefinitely.
- */
- epoll_timeout = -1;
- }
-
- do {
- epoll_ret = epoll_wait(itti_desc.threads[thread_id].epoll_fd,
- itti_desc.threads[thread_id].events,
- itti_desc.threads[thread_id].nb_events,
- epoll_timeout);
- } while (epoll_ret < 0 && errno == EINTR);
-
- if (epoll_ret < 0) {
- AssertFatal (0, "epoll_wait failed for task %s: %s!\n", itti_get_task_name(task_id), strerror(errno));
- }
-
- if (epoll_ret == 0 && polling) {
- /* No data to read -> return */
- return;
- }
-
- itti_desc.threads[thread_id].epoll_nb_events = epoll_ret;
-
- for (i = 0; i < epoll_ret; i++) {
- /* Check if there is an event for ITTI for the event fd */
- if ((itti_desc.threads[thread_id].events[i].events & EPOLLIN) &&
- (itti_desc.threads[thread_id].events[i].data.fd == itti_desc.threads[thread_id].task_event_fd)) {
- struct message_list_s *message = NULL;
- eventfd_t sem_counter;
- ssize_t read_ret;
- int result;
-
- /* Read will always return 1 */
- read_ret = read (itti_desc.threads[thread_id].task_event_fd, &sem_counter, sizeof(sem_counter));
- AssertFatal (read_ret == sizeof(sem_counter), "Read from task message FD (%d) failed (%d/%d)!\n", thread_id, (int) read_ret, (int) sizeof(sem_counter));
-
- if (lfds611_queue_dequeue (itti_desc.tasks[task_id].message_queue, (void **) &message) == 0) {
- /* No element in list -> this should not happen */
- AssertFatal (0, "No message in queue for task %d while there are %d events and some for the messages queue!\n", task_id, epoll_ret);
- }
-
- AssertFatal(message != NULL, "Message from message queue is NULL!\n");
- *received_msg = message->msg;
-
-
- result = itti_free (ITTI_MSG_ORIGIN_ID(*received_msg), message);
- AssertFatal (result == EXIT_SUCCESS, "Failed to free memory (%d)!\n", result);
-
-
- /* Mark that the event has been processed */
- itti_desc.threads[thread_id].events[i].events &= ~EPOLLIN;
- return;
- }
- }
-}
-
-void itti_receive_msg(task_id_t task_id, MessageDef **received_msg)
-{
-
- itti_receive_msg_internal_event_fd(task_id, 0, received_msg);
-
-}
-
-void itti_poll_msg(task_id_t task_id, MessageDef **received_msg)
-{
- AssertFatal (task_id < itti_desc.task_max, "Task id (%d) is out of range (%d)!\n", task_id, itti_desc.task_max);
-
- *received_msg = NULL;
-
- {
- struct message_list_s *message;
-
- if (lfds611_queue_dequeue (itti_desc.tasks[task_id].message_queue, (void **) &message) == 1) {
- int result;
-
- *received_msg = message->msg;
- result = itti_free (ITTI_MSG_ORIGIN_ID(*received_msg), message);
- AssertFatal (result == EXIT_SUCCESS, "Failed to free memory (%d)!\n", result);
- }
- }
-
- if (*received_msg == NULL) {
- ITTI_DEBUG(ITTI_DEBUG_POLL, " No message in queue[(%u:%s)]\n", task_id, itti_get_task_name(task_id));
- }
-
-}
-
-int itti_create_task(task_id_t task_id, void *(*start_routine)(void *), void *args_p)
-{
- thread_id_t thread_id = TASK_GET_THREAD_ID(task_id);
- int result;
-
- AssertFatal (start_routine != NULL, "Start routine is NULL!\n");
- AssertFatal (thread_id < itti_desc.thread_max, "Thread id (%d) is out of range (%d)!\n", thread_id, itti_desc.thread_max);
- AssertFatal (itti_desc.threads[thread_id].task_state == TASK_STATE_NOT_CONFIGURED, "Task %d, thread %d state is not correct (%d)!\n",
- task_id, thread_id, itti_desc.threads[thread_id].task_state);
-
- itti_desc.threads[thread_id].task_state = TASK_STATE_STARTING;
-
- ITTI_DEBUG(ITTI_DEBUG_INIT, " Creating thread for task %s ...\n", itti_get_task_name(task_id));
-
- result = pthread_create (&itti_desc.threads[thread_id].task_thread, NULL, start_routine, args_p);
- AssertFatal (result >= 0, "Thread creation for task %d, thread %d failed (%d)!\n", task_id, thread_id, result);
- char name[16];
- snprintf( name, sizeof(name), "ITTI %d", thread_id );
- pthread_setname_np( itti_desc.threads[thread_id].task_thread, name );
-
- itti_desc.created_tasks ++;
-
- /* Wait till the thread is completely ready */
- while (itti_desc.threads[thread_id].task_state != TASK_STATE_READY)
- usleep (1000);
-
- return 0;
-}
-
-void itti_set_task_real_time(task_id_t task_id)
-{
- thread_id_t thread_id = TASK_GET_THREAD_ID(task_id);
-
- DevCheck(thread_id < itti_desc.thread_max, thread_id, itti_desc.thread_max, 0);
-
- itti_desc.threads[thread_id].real_time = TRUE;
-}
-
-void itti_wait_ready(int wait_tasks)
-{
- itti_desc.wait_tasks = wait_tasks;
-
- ITTI_DEBUG(ITTI_DEBUG_INIT,
- " wait for tasks: %s, created tasks %d, ready tasks %d\n",
- itti_desc.wait_tasks ? "yes" : "no",
- itti_desc.created_tasks,
- itti_desc.ready_tasks);
-
- AssertFatal (itti_desc.created_tasks == itti_desc.ready_tasks, "Number of created tasks (%d) does not match ready tasks (%d), wait task %d!\n",
- itti_desc.created_tasks, itti_desc.ready_tasks, itti_desc.wait_tasks);
-}
-
-void itti_mark_task_ready(task_id_t task_id)
-{
- thread_id_t thread_id = TASK_GET_THREAD_ID(task_id);
-
- AssertFatal (thread_id < itti_desc.thread_max, "Thread id (%d) is out of range (%d)!\n", thread_id, itti_desc.thread_max);
-
- /* Mark the thread as using LFDS queue */
- lfds611_queue_use(itti_desc.tasks[task_id].message_queue);
-
-#if defined(UE_EXPANSION) || defined(RTAI)
- /* Assign low priority to created threads */
- {
- struct sched_param sched_param;
- sched_param.sched_priority = sched_get_priority_min(SCHED_FIFO) + 1;
- sched_setscheduler(0, SCHED_FIFO, &sched_param);
- }
-#endif
-
- itti_desc.threads[thread_id].task_state = TASK_STATE_READY;
- itti_desc.ready_tasks ++;
-
- while (itti_desc.wait_tasks != 0) {
- usleep (10000);
- }
-
- ITTI_DEBUG(ITTI_DEBUG_INIT, " task %s started\n", itti_get_task_name(task_id));
-}
-
-void itti_exit_task(void)
-{
- task_id_t task_id = itti_get_current_task_id();
- thread_id_t thread_id = TASK_GET_THREAD_ID(task_id);
-
-#if defined(OAI_EMU) || defined(RTAI)
- if (task_id > TASK_UNKNOWN) {
- VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME(VCD_SIGNAL_DUMPER_VARIABLES_ITTI_RECV_MSG,
- __sync_and_and_fetch (&itti_desc.vcd_receive_msg, ~(1L << task_id)));
- }
-#endif
-
- itti_desc.threads[thread_id].task_state = TASK_STATE_NOT_CONFIGURED;
- itti_desc.created_tasks--;
- ITTI_DEBUG(ITTI_DEBUG_EXIT, "Thread for task %s (%d) exits\n", itti_get_task_name(task_id), task_id);
- pthread_exit (NULL);
-}
-
-void itti_terminate_tasks(task_id_t task_id)
-{
- // Sends Terminate signals to all tasks.
- itti_send_terminate_message (task_id);
-
- if (itti_desc.thread_handling_signals) {
- pthread_kill (itti_desc.thread_ref, SIGUSR1);
- }
-
- pthread_exit (NULL);
-}
-
-int itti_init(task_id_t task_max, thread_id_t thread_max, MessagesIds messages_id_max, const task_info_t *tasks_info,
- const message_info_t *messages_info)
-{
- task_id_t task_id;
- thread_id_t thread_id;
- int ret;
-
- itti_desc.message_number = 1;
-
- ITTI_DEBUG(ITTI_DEBUG_INIT, " Init: %d tasks, %d threads, %d messages\n", task_max, thread_max, messages_id_max);
-
- CHECK_INIT_RETURN(signal_mask());
-
- /* Saves threads and messages max values */
- itti_desc.task_max = task_max;
- itti_desc.thread_max = thread_max;
- itti_desc.messages_id_max = messages_id_max;
- itti_desc.thread_handling_signals = FALSE;
- itti_desc.tasks_info = tasks_info;
- itti_desc.messages_info = messages_info;
-
- /* Allocates memory for tasks info */
- itti_desc.tasks = calloc (itti_desc.task_max, sizeof(task_desc_t));
-
- /* Allocates memory for threads info */
- itti_desc.threads = calloc (itti_desc.thread_max, sizeof(thread_desc_t));
-
- /* Initializing each queue and related stuff */
- for (task_id = TASK_FIRST; task_id < itti_desc.task_max; task_id++) {
- ITTI_DEBUG(ITTI_DEBUG_INIT, " Initializing %stask %s%s%s\n",
- itti_desc.tasks_info[task_id].parent_task != TASK_UNKNOWN ? "sub-" : "",
- itti_desc.tasks_info[task_id].name,
- itti_desc.tasks_info[task_id].parent_task != TASK_UNKNOWN ? " with parent " : "",
- itti_desc.tasks_info[task_id].parent_task != TASK_UNKNOWN ?
- itti_get_task_name(itti_desc.tasks_info[task_id].parent_task) : "");
-
- ITTI_DEBUG(ITTI_DEBUG_INIT, " Creating queue of message of size %u\n", itti_desc.tasks_info[task_id].queue_size);
-
- ret = lfds611_queue_new(&itti_desc.tasks[task_id].message_queue, itti_desc.tasks_info[task_id].queue_size);
-
- if (0 == ret) {
- AssertFatal (0, "lfds611_queue_new failed for task %s!\n", itti_get_task_name(task_id));
- }
- }
-
- /* Initializing each thread */
- for (thread_id = THREAD_FIRST; thread_id < itti_desc.thread_max; thread_id++) {
- itti_desc.threads[thread_id].task_state = TASK_STATE_NOT_CONFIGURED;
-
- itti_desc.threads[thread_id].epoll_fd = epoll_create1(0);
-
- if (itti_desc.threads[thread_id].epoll_fd == -1) {
- /* Always assert on this condition */
- AssertFatal (0, "Failed to create new epoll fd: %s!\n", strerror(errno));
- }
-
- itti_desc.threads[thread_id].task_event_fd = eventfd(0, EFD_SEMAPHORE);
-
- if (itti_desc.threads[thread_id].task_event_fd == -1) {
- /* Always assert on this condition */
- AssertFatal (0, " eventfd failed: %s!\n", strerror(errno));
- }
-
- itti_desc.threads[thread_id].nb_events = 1;
-
- itti_desc.threads[thread_id].events = calloc(1, sizeof(struct epoll_event));
-
- itti_desc.threads[thread_id].events->events = EPOLLIN | EPOLLERR;
- itti_desc.threads[thread_id].events->data.fd = itti_desc.threads[thread_id].task_event_fd;
-
- /* Add the event fd to the list of monitored events */
- if (epoll_ctl(itti_desc.threads[thread_id].epoll_fd, EPOLL_CTL_ADD,
- itti_desc.threads[thread_id].task_event_fd, itti_desc.threads[thread_id].events) != 0) {
- /* Always assert on this condition */
- AssertFatal (0, " epoll_ctl (EPOLL_CTL_ADD) failed: %s!\n", strerror(errno));
- }
-
- ITTI_DEBUG(ITTI_DEBUG_EVEN_FD, " Successfully subscribed fd %d for thread %d\n",
- itti_desc.threads[thread_id].task_event_fd, thread_id);
-
- }
-
- itti_desc.running = 1;
- itti_desc.wait_tasks = 0;
- itti_desc.created_tasks = 0;
- itti_desc.ready_tasks = 0;
- CHECK_INIT_RETURN(timer_init ());
-
- return 0;
-}
-
-void itti_wait_tasks_end(void)
-{
- int end = 0;
- int thread_id;
- task_id_t task_id;
- int ready_tasks;
- int result;
- int retries = 10;
-
- itti_desc.thread_handling_signals = TRUE;
- itti_desc.thread_ref=pthread_self ();
-
- /* Handle signals here */
- while (end == 0) {
- signal_handle (&end);
- }
-
- printf("closing all tasks\n");
- sleep(1);
-
- do {
- ready_tasks = 0;
-
- task_id = TASK_FIRST;
-
- for (thread_id = THREAD_FIRST; thread_id < itti_desc.thread_max; thread_id++) {
- /* Skip tasks which are not running */
- if (itti_desc.threads[thread_id].task_state == TASK_STATE_READY) {
- while (thread_id != TASK_GET_THREAD_ID(task_id)) {
- task_id++;
- }
-
- result = pthread_tryjoin_np (itti_desc.threads[thread_id].task_thread, NULL);
-
- ITTI_DEBUG(ITTI_DEBUG_EXIT, " Thread %s join status %d\n", itti_get_task_name(task_id), result);
-
- if (result == 0) {
- /* Thread has terminated */
- itti_desc.threads[thread_id].task_state = TASK_STATE_ENDED;
- } else {
- /* Thread is still running, count it */
- ready_tasks++;
- }
- }
- }
-
- if (ready_tasks > 0) {
- usleep (100 * 1000);
- }
- } while ((ready_tasks > 0) && (retries--)&& (!end) );
-
- printf("ready_tasks %d\n",ready_tasks);
-
- itti_desc.running = 0;
-
- if (ready_tasks > 0) {
- ITTI_DEBUG(ITTI_DEBUG_ISSUES, " Some threads are still running, force exit\n");
- exit (0);
- }
-}
-
-void itti_send_terminate_message(task_id_t task_id)
-{
- MessageDef *terminate_message_p;
-
- terminate_message_p = itti_alloc_new_message (task_id, TERMINATE_MESSAGE);
-
- itti_send_broadcast_message (terminate_message_p);
-}
diff --git a/common/utils/itti/intertask_interface.h b/common/utils/itti/intertask_interface.h
deleted file mode 100644
index ada34ce1b7..0000000000
--- a/common/utils/itti/intertask_interface.h
+++ /dev/null
@@ -1,235 +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
- */
-
-/** @defgroup _intertask_interface_impl_ Intertask Interface Mechanisms
- * Implementation
- * @ingroup _ref_implementation_
- * @{
- */
-
-#include
-
-#ifndef INTERTASK_INTERFACE_H_
-#define INTERTASK_INTERFACE_H_
-
-#include
-#include
-#include
-
-#include "intertask_interface_conf.h"
-#include "intertask_interface_types.h"
-
-#define ITTI_MSG_ID(mSGpTR) ((mSGpTR)->ittiMsgHeader.messageId)
-#define ITTI_MSG_ORIGIN_ID(mSGpTR) ((mSGpTR)->ittiMsgHeader.originTaskId)
-#define ITTI_MSG_DESTINATION_ID(mSGpTR) ((mSGpTR)->ittiMsgHeader.destinationTaskId)
-#define ITTI_MSG_INSTANCE(mSGpTR) ((mSGpTR)->ittiMsgHeader.instance)
-#define ITTI_MSG_NAME(mSGpTR) itti_get_message_name(ITTI_MSG_ID(mSGpTR))
-#define ITTI_MSG_ORIGIN_NAME(mSGpTR) itti_get_task_name(ITTI_MSG_ORIGIN_ID(mSGpTR))
-#define ITTI_MSG_DESTINATION_NAME(mSGpTR) itti_get_task_name(ITTI_MSG_DESTINATION_ID(mSGpTR))
-
-/* Make the message number platform specific */
-typedef unsigned long message_number_t;
-#define MESSAGE_NUMBER_SIZE (sizeof(unsigned long))
-
-typedef enum message_priorities_e {
- MESSAGE_PRIORITY_MAX = 100,
- MESSAGE_PRIORITY_MAX_LEAST = 85,
- MESSAGE_PRIORITY_MED_PLUS = 70,
- MESSAGE_PRIORITY_MED = 55,
- MESSAGE_PRIORITY_MED_LEAST = 40,
- MESSAGE_PRIORITY_MIN_PLUS = 25,
- MESSAGE_PRIORITY_MIN = 10,
-} message_priorities_t;
-
-typedef struct message_info_s {
- task_id_t id;
- message_priorities_t priority;
- /* Message payload size */
- MessageHeaderSize size;
- /* Printable name */
- const char * const name;
-} message_info_t;
-
-typedef enum task_priorities_e {
- TASK_PRIORITY_MAX = 100,
- TASK_PRIORITY_MAX_LEAST = 85,
- TASK_PRIORITY_MED_PLUS = 70,
- TASK_PRIORITY_MED = 55,
- TASK_PRIORITY_MED_LEAST = 40,
- TASK_PRIORITY_MIN_PLUS = 25,
- TASK_PRIORITY_MIN = 10,
-} task_priorities_t;
-
-typedef struct task_info_s {
- thread_id_t thread;
- task_id_t parent_task;
- task_priorities_t priority;
- unsigned int queue_size;
- /* Printable name */
- const char * const name;
-} task_info_t;
-
-/** \brief Update the itti LTE time reference for messages
- \param current reference frame
- \param current reference slot
- @returns < 0 on failure, 0 otherwise
- **/
-void itti_update_lte_time(uint32_t frame, uint8_t slot);
-
-/** \brief Send a broadcast message to every task
- \param message_p Pointer to the message to send
- @returns < 0 on failure, 0 otherwise
- **/
-int itti_send_broadcast_message(MessageDef *message_p);
-
-/** \brief Send a message to a task (could be itself)
- \param task_id Task ID
- \param instance Instance of the task used for virtualization
- \param message Pointer to the message to send
- @returns -1 on failure, 0 otherwise
- **/
-int itti_send_msg_to_task(task_id_t task_id, instance_t instance, MessageDef *message);
-
-/* TODO: this is a hack. Almost no caller of itti_send_msg_to_task checks
- * the return value so it has been changed to crash the program in case
- * of failure instead of returning -1 as the documentation above says.
- * The RLC UM code may receive too much data when doing UDP at a higher
- * throughput than the link allows and so for this specific case we need
- * a version that actually returns -1 on failure.
- *
- * This needs to be cleaned at some point.
- */
-/* look for HACK_RLC_UM_LIMIT for others places related to the hack. Please do not remove this comment. */
-int itti_try_send_msg_to_task(task_id_t task_id, instance_t instance, MessageDef *message);
-
-/** \brief Add a new fd to monitor.
- * NOTE: it is up to the user to read data associated with the fd
- * \param task_id Task ID of the receiving task
- * \param fd The file descriptor to monitor
- **/
-void itti_subscribe_event_fd(task_id_t task_id, int fd);
-
-/** \brief Remove a fd from the list of fd to monitor
- * \param task_id Task ID of the task
- * \param fd The file descriptor to remove
- **/
-void itti_unsubscribe_event_fd(task_id_t task_id, int fd);
-
-/** \brief Return the list of events excluding the fd associated with itti
- * \param task_id Task ID of the task
- * \param events events list
- * @returns number of events to handle
- **/
-int itti_get_events(task_id_t task_id, struct epoll_event **events);
-
-/** \brief Retrieves a message in the queue associated to task_id.
- * If the queue is empty, the thread is blocked till a new message arrives.
- \param task_id Task ID of the receiving task
- \param received_msg Pointer to the allocated message
- **/
-void itti_receive_msg(task_id_t task_id, MessageDef **received_msg);
-
-/** \brief Try to retrieves a message in the queue associated to task_id.
- \param task_id Task ID of the receiving task
- \param received_msg Pointer to the allocated message
- **/
-void itti_poll_msg(task_id_t task_id, MessageDef **received_msg);
-
-/** \brief Start thread associated to the task
- * \param task_id task to start
- * \param start_routine entry point for the task
- * \param args_p Optional argument to pass to the start routine
- * @returns -1 on failure, 0 otherwise
- **/
-int itti_create_task(task_id_t task_id,
- void *(*start_routine) (void *),
- void *args_p);
-
-/** \brief Mark the task as a real time task
- * \param task_id task to mark as real time
- **/
-void itti_set_task_real_time(task_id_t task_id);
-
-/** \brief Indicates to ITTI if newly created tasks should wait for all tasks to be ready
- * \param wait_tasks non 0 to make new created tasks to wait, 0 to let created tasks to run
- **/
-void itti_wait_ready(int wait_tasks);
-
-/** \brief Mark the task as in ready state
- * \param task_id task to mark as ready
- **/
-void itti_mark_task_ready(task_id_t task_id);
-
-/** \brief Exit the current task.
- **/
-void itti_exit_task(void);
-
-/** \brief Indicate that the task is completed and initiate termination of all tasks.
- * \param task_id task that is completed
- **/
-void itti_terminate_tasks(task_id_t task_id);
-
-/** \brief Return the printable string associated with the message
- * \param message_id Id of the message
- **/
-const char *itti_get_message_name(MessagesIds message_id);
-
-/** \brief Return the printable string associated with a task id
- * \param thread_id Id of the task
- **/
-const char *itti_get_task_name(task_id_t task_id);
-
-/** \brief Alloc and memset(0) a new itti message.
- * \param origin_task_id Task ID of the sending task
- * \param message_id Message ID
- * @returns NULL in case of failure or newly allocated mesage ref
- **/
-MessageDef *itti_alloc_new_message(
- task_id_t origin_task_id,
- MessagesIds message_id);
-
-/** \brief Alloc and memset(0) a new itti message.
- * \param origin_task_id Task ID of the sending task
- * \param message_id Message ID
- * \param size size of the payload to send
- * @returns NULL in case of failure or newly allocated mesage ref
- **/
-MessageDef *itti_alloc_new_message_sized(
- task_id_t origin_task_id,
- MessagesIds message_id,
- MessageHeaderSize size);
-
-/** \brief handle signals and wait for all threads to join when the process complete.
- * This function should be called from the main thread after having created all ITTI tasks.
- **/
-void itti_wait_tasks_end(void);
-
-/** \brief Send a termination message to all tasks.
- * \param task_id task that is broadcasting the message.
- **/
-void itti_send_terminate_message(task_id_t task_id);
-
-void *itti_malloc(task_id_t origin_task_id, task_id_t destination_task_id, ssize_t size);
-
-int itti_free(task_id_t task_id, void *ptr);
-
-#endif /* INTERTASK_INTERFACE_H_ */
-/* @} */
diff --git a/common/utils/itti/intertask_interface_init.h b/common/utils/itti/intertask_interface_init.h
deleted file mode 100644
index dbd4e1b2ec..0000000000
--- a/common/utils/itti/intertask_interface_init.h
+++ /dev/null
@@ -1,73 +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
- */
-
-/** @defgroup _intertask_interface_impl_ Intertask Interface Mechanisms
- * Implementation
- * @ingroup _ref_implementation_
- * @{
- */
-
-/********************************************************************************
- *
- * !!! This header should only be included by the file that initialize
- * the intertask interface module for the process !!!
- *
- * Other files should include "intertask_interface.h"
- *
- *******************************************************************************/
-
-#ifndef INTERTASK_INTERFACE_INIT_H_
-#define INTERTASK_INTERFACE_INIT_H_
-
-#include "intertask_interface.h"
-
-#ifndef CHECK_PROTOTYPE_ONLY
-
-/* Map task id to printable name. */
-const task_info_t tasks_info[] = {
- {0, TASK_UNKNOWN, 0, 0, "TASK_UNKNOWN"},
-#define TASK_DEF(tHREADiD, pRIO, qUEUEsIZE) { tHREADiD##_THREAD, TASK_UNKNOWN, pRIO, qUEUEsIZE, #tHREADiD },
-#define SUB_TASK_DEF(tHREADiD, sUBtASKiD, qUEUEsIZE) { sUBtASKiD##_THREAD, tHREADiD##_THREAD, 0, qUEUEsIZE, #sUBtASKiD },
-#include
-#undef SUB_TASK_DEF
-#undef TASK_DEF
-};
-
-/* Map message id to message information */
-const message_info_t messages_info[] = {
-#define MESSAGE_DEF(iD, pRIO, sTRUCT, fIELDnAME) { iD, pRIO, sizeof(sTRUCT), #iD },
-#include
-#undef MESSAGE_DEF
-};
-
-#endif
-
-/** \brief Init function for the intertask interface. Init queues, Mutexes and Cond vars.
- * \param thread_max Maximum number of threads
- * \param messages_id_max Maximum message id
- * \param threads_name Pointer on the threads name information as created by this include file
- * \param messages_info Pointer on messages information as created by this include file
- **/
-int itti_init(task_id_t task_max, thread_id_t thread_max, MessagesIds messages_id_max, const task_info_t *tasks_info,
- const message_info_t *messages_info);
-
-#endif /* INTERTASK_INTERFACE_INIT_H_ */
-/* @} */
diff --git a/common/utils/itti/intertask_interface_types.h b/common/utils/itti/intertask_interface_types.h
deleted file mode 100644
index af1b4e9aa9..0000000000
--- a/common/utils/itti/intertask_interface_types.h
+++ /dev/null
@@ -1,143 +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
- */
-
-/** @defgroup _intertask_interface_impl_ Intertask Interface Mechanisms
- * Implementation
- * @ingroup _ref_implementation_
- * @{
- */
-
-#ifndef INTERTASK_INTERFACE_TYPES_H_
-#define INTERTASK_INTERFACE_TYPES_H_
-
-#include "itti_types.h"
-#include "platform_types.h"
-
-/* Defines to handle bit fields on unsigned long values */
-#define UL_BIT_MASK(lENGTH) ((1UL << (lENGTH)) - 1UL)
-#define UL_BIT_SHIFT(vALUE, oFFSET) ((vALUE) << (oFFSET))
-#define UL_BIT_UNSHIFT(vALUE, oFFSET) ((vALUE) >> (oFFSET))
-
-#define UL_FIELD_MASK(oFFSET, lENGTH) UL_BIT_SHIFT(UL_BIT_MASK(lENGTH), (oFFSET))
-#define UL_FIELD_INSERT(vALUE, fIELD, oFFSET, lENGTH) (((vALUE) & (~UL_FIELD_MASK(oFFSET, lENGTH))) | UL_BIT_SHIFT(((fIELD) & UL_BIT_MASK(lENGTH)), oFFSET))
-#define UL_FIELD_EXTRACT(vALUE, oFFSET, lENGTH) (UL_BIT_UNSHIFT((vALUE), (oFFSET)) & UL_BIT_MASK(lENGTH))
-
-/* Definitions of task ID fields */
-#define TASK_THREAD_ID_OFFSET 8
-#define TASK_THREAD_ID_LENGTH 8
-
-#define TASK_SUB_TASK_ID_OFFSET 0
-#define TASK_SUB_TASK_ID_LENGTH 8
-
-/* Defines to extract task ID fields */
-#define TASK_GET_THREAD_ID(tASKiD) (itti_desc.tasks_info[tASKiD].thread)
-#define TASK_GET_PARENT_TASK_ID(tASKiD) (itti_desc.tasks_info[tASKiD].parent_task)
-/* Extract the instance from a message */
-#define ITTI_MESSAGE_GET_INSTANCE(mESSAGE) ((mESSAGE)->ittiMsgHeader.instance)
-
-#include
-
-/* This enum defines messages ids. Each one is unique. */
-typedef enum {
-#define MESSAGE_DEF(iD, pRIO, sTRUCT, fIELDnAME) iD,
-#include
-#undef MESSAGE_DEF
-
- MESSAGES_ID_MAX,
-} MessagesIds;
-
-//! Thread id of each task
-typedef enum {
- THREAD_NULL = 0,
-
-#define TASK_DEF(tHREADiD, pRIO, qUEUEsIZE) THREAD_##tHREADiD,
-#define SUB_TASK_DEF(tHREADiD, sUBtASKiD, qUEUEsIZE)
-#include
-#undef SUB_TASK_DEF
-#undef TASK_DEF
-
- THREAD_MAX,
- THREAD_FIRST = 1,
-} thread_id_t;
-
-//! Sub-tasks id, to defined offset form thread id
-typedef enum {
-#define TASK_DEF(tHREADiD, pRIO, qUEUEsIZE) tHREADiD##_THREAD = THREAD_##tHREADiD,
-#define SUB_TASK_DEF(tHREADiD, sUBtASKiD, qUEUEsIZE) sUBtASKiD##_THREAD = THREAD_##tHREADiD,
-#include
-#undef SUB_TASK_DEF
-#undef TASK_DEF
-} task_thread_id_t;
-
-//! Tasks id of each task
-typedef enum {
- TASK_UNKNOWN = 0,
-
-#define TASK_DEF(tHREADiD, pRIO, qUEUEsIZE) tHREADiD,
-#define SUB_TASK_DEF(tHREADiD, sUBtASKiD, qUEUEsIZE) sUBtASKiD,
-#include
-#undef SUB_TASK_DEF
-#undef TASK_DEF
-
- TASK_MAX,
- TASK_FIRST = 1,
-} task_id_t;
-
-typedef union msg_s {
-#define MESSAGE_DEF(iD, pRIO, sTRUCT, fIELDnAME) sTRUCT fIELDnAME;
-#include
-#undef MESSAGE_DEF
-} msg_t;
-
-typedef uint16_t MessageHeaderSize;
-
-typedef struct itti_lte_time_s {
- uint32_t frame;
- uint8_t slot;
-} itti_lte_time_t;
-
-/** @struct MessageHeader
- * @brief Message Header structure for inter-task communication.
- */
-typedef struct MessageHeader_s {
- MessagesIds messageId; /**< Unique message id as referenced in enum MessagesIds */
-
- task_id_t originTaskId; /**< ID of the sender task */
- task_id_t destinationTaskId; /**< ID of the destination task */
- instance_t instance; /**< Task instance for virtualization */
-
- MessageHeaderSize ittiMsgSize; /**< Message size (not including header size) */
-
- itti_lte_time_t lte_time; /**< Reference LTE time */
-} MessageHeader;
-
-/** @struct MessageDef
- * @brief Message structure for inter-task communication.
- * \internal
- * The attached attribute \c __packed__ is neccessary, because the memory allocation code expects \ref ittiMsg directly following \ref ittiMsgHeader.
- */
-typedef struct __attribute__ ((__packed__)) MessageDef_s {
- MessageHeader ittiMsgHeader; /**< Message header */
- msg_t ittiMsg; /**< Union of payloads as defined in x_messages_def.h headers */
-} MessageDef;
-
-#endif /* INTERTASK_INTERFACE_TYPES_H_ */
-/* @} */
diff --git a/common/utils/itti/intertask_messages_def.h b/common/utils/itti/intertask_messages_def.h
deleted file mode 100644
index 57c344c813..0000000000
--- a/common/utils/itti/intertask_messages_def.h
+++ /dev/null
@@ -1,49 +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
- */
-
-/* This message asks for task initialization */
-MESSAGE_DEF(INITIALIZE_MESSAGE, MESSAGE_PRIORITY_MED, IttiMsgEmpty, initialize_message)
-
-/* This message asks for task activation */
-MESSAGE_DEF(ACTIVATE_MESSAGE, MESSAGE_PRIORITY_MED, IttiMsgEmpty, activate_message)
-
-/* This message asks for task deactivation */
-MESSAGE_DEF(DEACTIVATE_MESSAGE, MESSAGE_PRIORITY_MED, IttiMsgEmpty, deactivate_message)
-
-/* This message asks for task termination */
-MESSAGE_DEF(TERMINATE_MESSAGE, MESSAGE_PRIORITY_MAX, IttiMsgEmpty, terminate_message)
-
-/* Test message used for debug */
-MESSAGE_DEF(MESSAGE_TEST, MESSAGE_PRIORITY_MED, IttiMsgEmpty, message_test)
-
-/* Error message */
-MESSAGE_DEF(ERROR_LOG, MESSAGE_PRIORITY_MAX, IttiMsgEmpty, error_log)
-/* Warning message */
-MESSAGE_DEF(WARNING_LOG, MESSAGE_PRIORITY_MAX, IttiMsgEmpty, warning_log)
-/* Notice message */
-MESSAGE_DEF(NOTICE_LOG, MESSAGE_PRIORITY_MED, IttiMsgEmpty, notice_log)
-/* Info message */
-MESSAGE_DEF(INFO_LOG, MESSAGE_PRIORITY_MED, IttiMsgEmpty, info_log)
-/* Debug message */
-MESSAGE_DEF(DEBUG_LOG, MESSAGE_PRIORITY_MED, IttiMsgEmpty, debug_log)
-
-/* Generic log message for text */
-MESSAGE_DEF(GENERIC_LOG, MESSAGE_PRIORITY_MED, IttiMsgEmpty, generic_log)
diff --git a/common/utils/itti/intertask_messages_types.h b/common/utils/itti/intertask_messages_types.h
deleted file mode 100644
index 145f57648f..0000000000
--- a/common/utils/itti/intertask_messages_types.h
+++ /dev/null
@@ -1,40 +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
- */
-
-/*
- * intertask_messages_types.h
- *
- * Created on: Jan 14, 2014
- * Author: laurent winckel
- */
-
-#ifndef INTERTASK_MESSAGES_TYPES_H_
-#define INTERTASK_MESSAGES_TYPES_H_
-
-typedef struct IttiMsgEmpty_s {
-} IttiMsgEmpty;
-
-typedef struct IttiMsgText_s {
- uint32_t size;
- char text[];
-} IttiMsgText;
-
-#endif /* INTERTASK_MESSAGES_TYPES_H_ */
diff --git a/common/utils/itti/itti_types.h b/common/utils/itti/itti_types.h
deleted file mode 100644
index 2607c003b1..0000000000
--- a/common/utils/itti/itti_types.h
+++ /dev/null
@@ -1,82 +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
- */
-
-/** @brief Intertask Interface common types
- * Contains type definitions used for generating and parsing ITTI messages.
- * @author Laurent Winckel
- */
-
-#ifndef _ITTI_TYPES_H_
-#define _ITTI_TYPES_H_
-
-/* The current file is included in the ue_ip.ko compilation.
- * For it to work we need to include linux/types.h and
- * not stdint.h.
- * A solution to this problem is to use #ifndef __KERNEL__.
- * Maybe a better solution would be to clean things up
- * so that ue_ip.ko does not include the current file.
- */
-#ifndef __KERNEL__
-# include
-#else
-# include
-#endif
-
-#define CHARS_TO_UINT32(c1, c2, c3, c4) (((c4) << 24) | ((c3) << 16) | ((c2) << 8) | (c1))
-
-#define MESSAGE_NUMBER_CHAR_FORMAT "%11u"
-
-/* Intertask message types */
-enum itti_message_types_e {
- ITTI_DUMP_XML_DEFINITION = CHARS_TO_UINT32 ('\n', 'I', 'x', 'd'),
- ITTI_DUMP_XML_DEFINITION_END = CHARS_TO_UINT32 ('i', 'X', 'D', '\n'),
-
- ITTI_DUMP_MESSAGE_TYPE = CHARS_TO_UINT32 ('\n', 'I', 'm', 's'),
- ITTI_DUMP_MESSAGE_TYPE_END = CHARS_TO_UINT32 ('i', 'M', 'S', '\n'),
-
- ITTI_STATISTIC_MESSAGE_TYPE = CHARS_TO_UINT32 ('\n', 'I', 's', 't'),
- ITTI_STATISTIC_MESSAGE_TYPE_END = CHARS_TO_UINT32 ('i', 'S', 'T', '\n'),
-
- /* This signal is not meant to be used by remote analyzer */
- ITTI_DUMP_EXIT_SIGNAL = CHARS_TO_UINT32 ('e', 'X', 'I', 'T'),
-};
-
-typedef uint32_t itti_message_types_t;
-
-/* Message header is the common part that should never change between
- * remote process and this one.
- */
-typedef struct {
- /* The size of this structure */
- uint32_t message_size;
- itti_message_types_t message_type;
-} itti_socket_header_t;
-
-typedef struct {
- char message_number_char[12]; /* 9 chars are needed to store an unsigned 32 bits value in decimal, but must be a multiple of 32 bits to avoid alignment issues */
-} itti_signal_header_t;
-
-
-#define INSTANCE_DEFAULT (UINT16_MAX - 1)
-#define INSTANCE_ALL (UINT16_MAX)
-
-#endif
-
diff --git a/common/utils/itti/messages_def.h b/common/utils/itti/messages_def.h
deleted file mode 100644
index f312669848..0000000000
--- a/common/utils/itti/messages_def.h
+++ /dev/null
@@ -1,26 +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
- */
-
-// These messages files are mandatory and must always be placed in first position
-#include "intertask_messages_def.h"
-#include "timer_messages_def.h"
-
-// Dummy file for the generic intertask interface definition. Actual definition should be in top level build directory.
diff --git a/common/utils/itti/signals.c b/common/utils/itti/signals.c
deleted file mode 100644
index 5dd667ae65..0000000000
--- a/common/utils/itti/signals.c
+++ /dev/null
@@ -1,141 +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
- */
-
-#if HAVE_CONFIG_H
-# include "config.h"
-#endif
-
-#include
-#include
-#include
-#include
-#include
-
-#include
-#include
-#include
-
-#include "intertask_interface.h"
-#include "timer.h"
-#include "backtrace.h"
-#include "assertions.h"
-
-#include "signals.h"
-#include "log.h"
-
-#if defined (LOG_D) && defined (LOG_E)
-# define SIG_DEBUG(x, args...) LOG_D(RRC, x, ##args)
-# define SIG_ERROR(x, args...) LOG_E(RRC, x, ##args)
-#endif
-
-#ifndef SIG_DEBUG
-# define SIG_DEBUG(x, args...) do { fprintf(stdout, "[SIG][D]"x, ##args); } while(0)
-#endif
-#ifndef SIG_ERROR
-# define SIG_ERROR(x, args...) do { fprintf(stdout, "[SIG][E]"x, ##args); } while(0)
-#endif
-
-static sigset_t set;
-
-int signal_mask(void)
-{
- /* We set the signal mask to avoid threads other than the main thread
- * to receive the timer signal. Note that threads created will inherit this
- * configuration.
- */
- sigemptyset(&set);
-
- sigaddset (&set, SIGTIMER);
- sigaddset (&set, SIGUSR1);
- sigaddset (&set, SIGABRT);
- sigaddset (&set, SIGSEGV);
- sigaddset (&set, SIGINT);
-
- if (sigprocmask(SIG_BLOCK, &set, NULL) < 0) {
- perror ("sigprocmask");
- return -1;
- }
-
- return 0;
-}
-
-int signal_handle(int *end)
-{
- int ret;
- siginfo_t info;
-
- sigemptyset(&set);
-
- sigaddset (&set, SIGTIMER);
- sigaddset (&set, SIGUSR1);
- sigaddset (&set, SIGABRT);
- sigaddset (&set, SIGSEGV);
- sigaddset (&set, SIGINT);
-
- if (sigprocmask(SIG_BLOCK, &set, NULL) < 0) {
- perror ("sigprocmask");
- return -1;
- }
-
- /* Block till a signal is received.
- * NOTE: The signals defined by set are required to be blocked at the time
- * of the call to sigwait() otherwise sigwait() is not successful.
- */
- if ((ret = sigwaitinfo(&set, &info)) == -1) {
- perror ("sigwait");
- return ret;
- }
-
- //printf("Received signal %d\n", info.si_signo);
-
- /* Real-time signals are non constant and are therefore not suitable for
- * use in switch.
- */
- if (info.si_signo == SIGTIMER) {
- timer_handle_signal(&info);
- } else {
- /* Dispatch the signal to sub-handlers */
- switch(info.si_signo) {
- case SIGUSR1:
- SIG_DEBUG("Received SIGUSR1\n");
- *end = 1;
- break;
-
- case SIGSEGV: /* Fall through */
- case SIGABRT:
- SIG_DEBUG("Received SIGABORT\n");
- backtrace_handle_signal(&info);
- break;
-
- case SIGINT:
- printf("Received SIGINT\n");
- itti_send_terminate_message(TASK_UNKNOWN);
- *end = 1;
- break;
-
- default:
- SIG_ERROR("Received unknown signal %d\n", info.si_signo);
- break;
- }
- }
-
- return 0;
-}
diff --git a/common/utils/itti/tasks_def.h b/common/utils/itti/tasks_def.h
deleted file mode 100644
index d54d09a26a..0000000000
--- a/common/utils/itti/tasks_def.h
+++ /dev/null
@@ -1,25 +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
- */
-
-// This task is mandatory and must always be placed in first position
-TASK_DEF(TASK_TIMER, TASK_PRIORITY_MED, 10)
-
-// Dummy file for the generic intertask interface definition. Actual definition should be in top level build directory.
diff --git a/common/utils/itti/timer.c b/common/utils/itti/timer.c
deleted file mode 100644
index 6327aeacfb..0000000000
--- a/common/utils/itti/timer.c
+++ /dev/null
@@ -1,255 +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 "assertions.h"
-#include "intertask_interface.h"
-#include "timer.h"
-#include "log.h"
-#include "queue.h"
-
-#if defined (LOG_D) && defined (LOG_E)
-# define TMR_DEBUG(x, args...) LOG_D(TMR, x, ##args)
-# define TMR_ERROR(x, args...) LOG_E(TMR, x, ##args)
-#endif
-
-#ifndef TMR_DEBUG
-# define TMR_DEBUG(x, args...) do { fprintf(stdout, "[TMR][D]"x, ##args); } while(0)
-#endif
-#ifndef TMR_ERROR
-# define TMR_ERROR(x, args...) do { fprintf(stdout, "[TMR][E]"x, ##args); } while(0)
-#endif
-
-int timer_handle_signal(siginfo_t *info);
-
-struct timer_elm_s {
- task_id_t task_id; ///< Task ID which has requested the timer
- int32_t instance; ///< Instance of the task which has requested the timer
- timer_t timer; ///< Unique timer id
- timer_type_t type; ///< Timer type
- void *timer_arg; ///< Optional argument that will be passed when timer expires
- STAILQ_ENTRY(timer_elm_s) entries; ///< Pointer to next element
-};
-
-typedef struct timer_desc_s {
- STAILQ_HEAD(timer_list_head, timer_elm_s) timer_queue;
- pthread_mutex_t timer_list_mutex;
- struct timespec timeout;
-} timer_desc_t;
-
-static timer_desc_t timer_desc;
-
-#define TIMER_SEARCH(vAR, tIMERfIELD, tIMERvALUE, tIMERqUEUE) \
-do { \
- STAILQ_FOREACH(vAR, tIMERqUEUE, entries) { \
- if (((vAR)->tIMERfIELD == tIMERvALUE)) \
- break; \
- } \
-} while(0)
-
-int timer_handle_signal(siginfo_t *info)
-{
- struct timer_elm_s *timer_p;
- MessageDef *message_p;
- timer_has_expired_t *timer_expired_p;
- task_id_t task_id;
- int32_t instance;
-
- /* Get back pointer to timer list element */
- timer_p = (struct timer_elm_s *)info->si_ptr;
-
- // LG: To many traces for msc timer:
- TMR_DEBUG("Timer with id 0x%lx has expired\n", (long)timer_p->timer);
-
- task_id = timer_p->task_id;
- instance = timer_p->instance;
- message_p = itti_alloc_new_message(TASK_TIMER, TIMER_HAS_EXPIRED);
-
- timer_expired_p = &message_p->ittiMsg.timer_has_expired;
-
- timer_expired_p->timer_id = (long)timer_p->timer;
- timer_expired_p->arg = timer_p->timer_arg;
-
- /* Timer is a one shot timer, remove it */
- if (timer_p->type == TIMER_ONE_SHOT) {
- // if (timer_delete(timer_p->timer) < 0) {
- // TMR_DEBUG("Failed to delete timer 0x%lx\n", (long)timer_p->timer);
- // }
- // TMR_DEBUG("Removed timer 0x%lx\n", (long)timer_p->timer);
- // pthread_mutex_lock(&timer_desc.timer_list_mutex);
- // STAILQ_REMOVE(&timer_desc.timer_queue, timer_p, timer_elm_s, entries);
- // pthread_mutex_unlock(&timer_desc.timer_list_mutex);
- // free(timer_p);
- // timer_p = NULL;
- if (timer_remove((long)timer_p->timer) != 0) {
- TMR_DEBUG("Failed to delete timer 0x%lx\n", (long)timer_p->timer);
- }
- }
-
- /* Notify task of timer expiry */
- if (itti_send_msg_to_task(task_id, instance, message_p) < 0) {
- TMR_DEBUG("Failed to send msg TIMER_HAS_EXPIRED to task %u\n", task_id);
- free(message_p);
- return -1;
- }
-
-#if defined(ENB_AGENT_SB_IF)
-
-#endif
-
- return 0;
-}
-
-int timer_setup(
- uint32_t interval_sec,
- uint32_t interval_us,
- task_id_t task_id,
- int32_t instance,
- timer_type_t type,
- void *timer_arg,
- long *timer_id)
-{
- struct sigevent se;
- struct itimerspec its;
- struct timer_elm_s *timer_p;
- timer_t timer;
-
- if (timer_id == NULL) {
- return -1;
- }
-
- AssertFatal (type < TIMER_TYPE_MAX, "Invalid timer type (%d/%d)!\n", type, TIMER_TYPE_MAX);
-
- /* Allocate new timer list element */
- timer_p = malloc(sizeof(struct timer_elm_s));
-
- if (timer_p == NULL) {
- TMR_ERROR("Failed to create new timer element\n");
- return -1;
- }
-
- memset(&timer, 0, sizeof(timer_t));
- memset(&se, 0, sizeof(struct sigevent));
-
- timer_p->task_id = task_id;
- timer_p->instance = instance;
- timer_p->type = type;
- timer_p->timer_arg = timer_arg;
-
- /* Setting up alarm */
- /* Set and enable alarm */
- se.sigev_notify = SIGEV_SIGNAL;
- se.sigev_signo = SIGTIMER;
- se.sigev_value.sival_ptr = timer_p;
-
- /* At the timer creation, the timer structure will be filled in with timer_id,
- * which is unique for this process. This id is allocated by kernel and the
- * value might be used to distinguish timers.
- */
- if (timer_create(CLOCK_REALTIME, &se, &timer) < 0) {
- TMR_ERROR("Failed to create timer: (%s:%d)\n", strerror(errno), errno);
- free(timer_p);
- return -1;
- }
-
- /* Fill in the first expiration value. */
- its.it_value.tv_sec = interval_sec;
- its.it_value.tv_nsec = interval_us * 1000;
-
- if (type == TIMER_PERIODIC) {
- /* Asked for periodic timer. We set the interval time */
- its.it_interval.tv_sec = interval_sec;
- its.it_interval.tv_nsec = interval_us * 1000;
- } else {
- /* Asked for one-shot timer. Do not set the interval field */
- its.it_interval.tv_sec = 0;
- its.it_interval.tv_nsec = 0;
- }
-
- timer_settime(timer, 0, &its, NULL);
- /* Simply set the timer_id argument. so it can be used by caller */
- *timer_id = (long)timer;
- TMR_DEBUG("Requesting new %s timer with id 0x%lx that expires within "
- "%d sec and %d usec\n",
- type == TIMER_PERIODIC ? "periodic" : "single shot",
- *timer_id, interval_sec, interval_us);
-
- timer_p->timer = timer;
-
- /* Lock the queue and insert the timer at the tail */
- pthread_mutex_lock(&timer_desc.timer_list_mutex);
- STAILQ_INSERT_TAIL(&timer_desc.timer_queue, timer_p, entries);
- pthread_mutex_unlock(&timer_desc.timer_list_mutex);
-
- return 0;
-}
-
-int timer_remove(long timer_id)
-{
- int rc = 0;
- struct timer_elm_s *timer_p;
-
- TMR_DEBUG("Removing timer 0x%lx\n", timer_id);
-
- pthread_mutex_lock(&timer_desc.timer_list_mutex);
- TIMER_SEARCH(timer_p, timer, ((timer_t)timer_id), &timer_desc.timer_queue);
-
- /* We didn't find the timer in list */
- if (timer_p == NULL) {
- pthread_mutex_unlock(&timer_desc.timer_list_mutex);
- TMR_ERROR("Didn't find timer 0x%lx in list\n", timer_id);
- return -1;
- }
-
- STAILQ_REMOVE(&timer_desc.timer_queue, timer_p, timer_elm_s, entries);
- pthread_mutex_unlock(&timer_desc.timer_list_mutex);
-
- if (timer_delete(timer_p->timer) < 0) {
- TMR_ERROR("Failed to delete timer 0x%lx\n", (long)timer_p->timer);
- rc = -1;
- }
-
- free(timer_p);
- timer_p = NULL;
- return rc;
-}
-
-int timer_init(void)
-{
- TMR_DEBUG("Initializing TIMER task interface\n");
-
- memset(&timer_desc, 0, sizeof(timer_desc_t));
-
- STAILQ_INIT(&timer_desc.timer_queue);
- pthread_mutex_init(&timer_desc.timer_list_mutex, NULL);
-
- TMR_DEBUG("Initializing TIMER task interface: DONE\n");
- return 0;
-}
diff --git a/common/utils/itti/timer.h b/common/utils/itti/timer.h
deleted file mode 100644
index 4f568a348c..0000000000
--- a/common/utils/itti/timer.h
+++ /dev/null
@@ -1,69 +0,0 @@
-/*
- * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The OpenAirInterface Software Alliance licenses this file to You under
- * the OAI Public License, Version 1.1 (the "License"); you may not use this file
- * except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.openairinterface.org/?page_id=698
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *-------------------------------------------------------------------------------
- * For more information about the OpenAirInterface (OAI) Software Alliance:
- * contact@openairinterface.org
- */
-
-#ifndef TIMER_H_
-#define TIMER_H_
-
-#include
-
-#define SIGTIMER SIGRTMIN
-
-typedef enum timer_type_s {
- TIMER_PERIODIC,
- TIMER_ONE_SHOT,
- TIMER_TYPE_MAX,
-} timer_type_t;
-
-int timer_handle_signal(siginfo_t *info);
-
-/** \brief Request a new timer
- * \param interval_sec timer interval in seconds
- * \param interval_us timer interval in micro seconds
- * \param task_id task id of the task requesting the timer
- * \param instance instance of the task requesting the timer
- * \param type timer type
- * \param timer_id unique timer identifier
- * @returns -1 on failure, 0 otherwise
- **/
-int timer_setup(
- uint32_t interval_sec,
- uint32_t interval_us,
- task_id_t task_id,
- int32_t instance,
- timer_type_t type,
- void *timer_arg,
- long *timer_id);
-
-/** \brief Remove the timer from list
- * \param timer_id unique timer id
- * @returns -1 on failure, 0 otherwise
- **/
-
-int timer_remove(long timer_id);
-#define timer_stop timer_remove
-
-/** \brief Initialize timer task and its API
- * \param mme_config MME common configuration
- * @returns -1 on failure, 0 otherwise
- **/
-int timer_init(void);
-
-#endif
diff --git a/common/utils/itti/timer_messages_def.h b/common/utils/itti/timer_messages_def.h
deleted file mode 100644
index 761034730d..0000000000
--- a/common/utils/itti/timer_messages_def.h
+++ /dev/null
@@ -1,22 +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
- */
-
-MESSAGE_DEF(TIMER_HAS_EXPIRED, MESSAGE_PRIORITY_MED_PLUS, timer_has_expired_t, timer_has_expired)
diff --git a/common/utils/itti/timer_messages_types.h b/common/utils/itti/timer_messages_types.h
deleted file mode 100644
index 0d06e3eebf..0000000000
--- a/common/utils/itti/timer_messages_types.h
+++ /dev/null
@@ -1,35 +0,0 @@
-/*
- * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The OpenAirInterface Software Alliance licenses this file to You under
- * the OAI Public License, Version 1.1 (the "License"); you may not use this file
- * except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.openairinterface.org/?page_id=698
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *-------------------------------------------------------------------------------
- * For more information about the OpenAirInterface (OAI) Software Alliance:
- * contact@openairinterface.org
- */
-
-#ifndef TIMER_MESSAGES_TYPES_H_
-#define TIMER_MESSAGES_TYPES_H_
-
-//-------------------------------------------------------------------------------------------//
-// Defines to access message fields.
-#define TIMER_HAS_EXPIRED(mSGpTR) (mSGpTR)->ittiMsg.timer_has_expired
-
-//-------------------------------------------------------------------------------------------//
-typedef struct {
- void *arg;
- long timer_id;
-} timer_has_expired_t;
-
-#endif /* TIMER_MESSAGES_TYPES_H_ */
diff --git a/common/utils/load_module_shlib.c b/common/utils/load_module_shlib.c
index 656f6a8852..a4b4742c94 100644
--- a/common/utils/load_module_shlib.c
+++ b/common/utils/load_module_shlib.c
@@ -70,8 +70,8 @@ char *tmpstr;
char *shlibpath =NULL;
char *shlibversion=NULL;
char *cfgprefix;
-paramdef_t LoaderParams[] ={{"shlibpath", NULL, 0, strptr:&shlibpath, defstrval:NULL, TYPE_STRING, 0},
- {"shlibversion", NULL, 0, strptr:&shlibversion, defstrval:"", TYPE_STRING, 0}};
+paramdef_t LoaderParams[] ={{"shlibpath", NULL, 0, strptr:&shlibpath, defstrval:NULL, TYPE_STRING, 0, NULL},
+ {"shlibversion", NULL, 0, strptr:&shlibversion, defstrval:"", TYPE_STRING, 0, NULL}};
int ret;
@@ -118,77 +118,118 @@ int ret;
return tmpstr;
}
-int load_module_shlib(char *modname,loader_shlibfunc_t *farray, int numf)
+int load_module_shlib(char *modname,loader_shlibfunc_t *farray, int numf, void *autoinit_arg)
{
- void *lib_handle;
- initfunc_t fpi;
- checkverfunc_t fpc;
- getfarrayfunc_t fpg;
- char *shlib_path;
- char *afname=NULL;
- int ret=0;
+ void *lib_handle = NULL;
+ initfunc_t fpi;
+ checkverfunc_t fpc;
+ getfarrayfunc_t fpg;
+ char *shlib_path = NULL;
+ char *afname = NULL;
+ int ret = 0;
+ int lib_idx = -1;
- if (loader_data.shlibpath == NULL) {
- loader_init();
- }
+ if (!modname) {
+ fprintf(stderr, "[LOADER] load_module_shlib(): no library name given\n");
+ return -1;
+ }
- shlib_path = loader_format_shlibpath(modname);
+ if (!loader_data.shlibpath) {
+ loader_init();
+ }
- ret = 0;
- lib_handle = dlopen(shlib_path, RTLD_LAZY|RTLD_NODELETE|RTLD_GLOBAL);
- if (!lib_handle) {
- fprintf(stderr,"[LOADER] library %s is not loaded: %s\n", shlib_path,dlerror());
+ shlib_path = loader_format_shlibpath(modname);
+
+ for (int i = 0; i < loader_data.numshlibs; i++) {
+ if (strcmp(loader_data.shlibs[i].name, modname) == 0) {
+ printf("[LOADER] library %s has been loaded previously, reloading function pointers\n",
+ shlib_path);
+ lib_idx = i;
+ break;
+ }
+ }
+ if (lib_idx < 0) {
+ lib_idx = loader_data.numshlibs;
+ ++loader_data.numshlibs;
+ if (loader_data.numshlibs > loader_data.maxshlibs) {
+ fprintf(stderr, "[LOADER] can not load more than %d shlibs\n",
+ loader_data.maxshlibs);
ret = -1;
- } else {
- printf("[LOADER] library %s successfully loaded\n", shlib_path);
- afname=malloc(strlen(modname)+15);
- sprintf(afname,"%s_checkbuildver",modname);
- fpc = dlsym(lib_handle,afname);
- if (fpc != NULL ){
- int chkver_ret = fpc(loader_data.mainexec_buildversion, &(loader_data.shlibs[loader_data.numshlibs].shlib_buildversion));
- if (chkver_ret < 0) {
- fprintf(stderr,"[LOADER] %s %d lib %s, version mismatch",__FILE__, __LINE__, modname);
- exit_fun("[LOADER] unrecoverable error");
- }
+ goto load_module_shlib_exit;
+ }
+ loader_data.shlibs[lib_idx].name = strdup(modname);
+ loader_data.shlibs[lib_idx].thisshlib_path = strdup(shlib_path);
+ }
+
+ lib_handle = dlopen(shlib_path, RTLD_LAZY|RTLD_NODELETE|RTLD_GLOBAL);
+ if (!lib_handle) {
+ fprintf(stderr,"[LOADER] library %s is not loaded: %s\n", shlib_path,dlerror());
+ ret = -1;
+ goto load_module_shlib_exit;
+ }
+
+ printf("[LOADER] library %s successfully loaded\n", shlib_path);
+ afname = malloc(strlen(modname)+15);
+ if (!afname) {
+ fprintf(stderr, "[LOADER] unable to allocate memory for library %s\n", shlib_path);
+ ret = -1;
+ goto load_module_shlib_exit;
+ }
+ sprintf(afname,"%s_checkbuildver",modname);
+ fpc = dlsym(lib_handle,afname);
+ if (fpc) {
+ int chkver_ret = fpc(loader_data.mainexec_buildversion,
+ &(loader_data.shlibs[lib_idx].shlib_buildversion));
+ if (chkver_ret < 0) {
+ fprintf(stderr, "[LOADER] %s %d lib %s, version mismatch",
+ __FILE__, __LINE__, modname);
+ ret = -1;
+ goto load_module_shlib_exit;
+ }
+ }
+ sprintf(afname,"%s_autoinit",modname);
+ fpi = dlsym(lib_handle,afname);
+
+ if (fpi) {
+ fpi(autoinit_arg);
+ }
+
+ if (farray) {
+ if (!loader_data.shlibs[lib_idx].funcarray) {
+ loader_data.shlibs[lib_idx].funcarray = malloc(numf*sizeof(loader_shlibfunc_t));
+ if (!loader_data.shlibs[lib_idx].funcarray) {
+ fprintf(stderr, "[LOADER] load_module_shlib(): unable to allocate memory\n");
+ ret = -1;
+ goto load_module_shlib_exit;
}
- sprintf(afname,"%s_autoinit",modname);
- fpi = dlsym(lib_handle,afname);
-
- if (fpi != NULL ) {
- fpi();
+ }
+ loader_data.shlibs[lib_idx].numfunc = 0;
+ for (int i = 0; i < numf; i++) {
+ farray[i].fptr = dlsym(lib_handle,farray[i].fname);
+ if (!farray[i].fptr) {
+ fprintf(stderr, "[LOADER] load_module_shlib(): function %s not found: %s\n",
+ farray[i].fname, dlerror());
+ ret = -1;
+ goto load_module_shlib_exit;
}
+ loader_data.shlibs[lib_idx].funcarray[i].fname=strdup(farray[i].fname);
+ loader_data.shlibs[lib_idx].funcarray[i].fptr = farray[i].fptr;
+ loader_data.shlibs[lib_idx].numfunc++;
+ } /* for int i... */
+ } else { /* farray ! NULL */
+ sprintf(afname,"%s_getfarray",modname);
+ fpg = dlsym(lib_handle,afname);
+ if (fpg) {
+ loader_data.shlibs[lib_idx].numfunc =
+ fpg(&(loader_data.shlibs[lib_idx].funcarray));
+ }
+ } /* farray ! NULL */
- if (farray != NULL) {
- loader_data.shlibs[loader_data.numshlibs].funcarray=malloc(numf*sizeof(loader_shlibfunc_t));
- loader_data.shlibs[loader_data.numshlibs].numfunc=0;
- for (int i=0; i
#include
+#define MSC_LIBRARY
+#include "msc.h"
+
#include "liblfds611.h"
#include "intertask_interface.h"
-#include "timer.h"
-#include "msc.h"
+
+
#include "assertions.h"
//-------------------------------
@@ -67,8 +70,8 @@ void *msc_task(void *args_p)
//------------------------------------------------------------------------------
{
MessageDef *received_message_p = NULL;
- const char *msg_name = NULL;
- instance_t instance = 0;
+// const char *msg_name = NULL;
+// instance_t instance = 0;
long timer_id;
itti_mark_task_ready(TASK_MSC);
@@ -88,9 +91,9 @@ void *msc_task(void *args_p)
itti_receive_msg(TASK_MSC, &received_message_p);
if (received_message_p != NULL) {
- msg_name = ITTI_MSG_NAME (received_message_p);
- instance = ITTI_MSG_INSTANCE (received_message_p);
-
+// msg_name = ITTI_MSG_NAME (received_message_p);
+// instance = ITTI_MSG_INSTANCE (received_message_p);
+
switch (ITTI_MSG_ID(received_message_p)) {
case TIMER_HAS_EXPIRED: {
@@ -571,4 +574,17 @@ error_event:
free(new_item_p);
}
+//------------------------------------------------------------------------------
+// function called when oai loader loads the msc shared lib
+int msc_autoinit(msc_interface_t *msc_interface)
+//------------------------------------------------------------------------------
+ {
+ msc_interface->msc_init = msc_init;
+ msc_interface->msc_start_use = msc_start_use;
+ msc_interface->msc_end = msc_end;
+ msc_interface->msc_log_event = msc_log_event;
+ msc_interface->msc_log_message = msc_log_message;
+ msc_interface->msc_loaded = 1;
+ return 0;
+ }
diff --git a/common/utils/msc/msc.h b/common/utils/msc/msc.h
index 4493a5239a..78eb6cdb08 100644
--- a/common/utils/msc/msc.h
+++ b/common/utils/msc/msc.h
@@ -73,7 +73,23 @@ typedef enum {
#define MSC_AS_TIME_ARGS(CTXT_Pp) \
(CTXT_Pp)->frame, \
(CTXT_Pp)->subframe
-#if defined(MESSAGE_CHART_GENERATOR)
+
+typedef int(*msc_init_t)(const msc_env_t, const int );
+typedef void(*msc_start_use_t)(void );
+typedef void(*msc_end_t)(void);
+typedef void(*msc_log_event_t)(const msc_proto_t,char *, ...);
+typedef void(*msc_log_message_t)(const char * const, const msc_proto_t, const msc_proto_t,
+ const uint8_t* const, const unsigned int, char * , ...);
+typedef struct msc_interface {
+ int msc_loaded;
+ msc_init_t msc_init;
+ msc_start_use_t msc_start_use;
+ msc_end_t msc_end;
+ msc_log_event_t msc_log_event;
+ msc_log_message_t msc_log_message;
+} msc_interface_t;
+
+#ifdef MSC_LIBRARY
int msc_init(const msc_env_t envP, const int max_threadsP);
void msc_start_use(void);
void msc_flush_messages(void);
@@ -88,22 +104,17 @@ void msc_log_message(
const unsigned int num_bytes,
char *format, ...);
-#define MSC_INIT(arg1,arg2) msc_init(arg1,arg2)
-#define MSC_START_USE msc_start_use
-#define MSC_END msc_end
-#define MSC_LOG_EVENT(mScPaRaMs, fORMAT, aRGS...) msc_log_event(mScPaRaMs, fORMAT, ##aRGS)
-#define MSC_LOG_RX_MESSAGE(rECEIVER, sENDER, bYTES, nUMbYTES, fORMAT, aRGS...) msc_log_message("<-",rECEIVER, sENDER, bYTES, nUMbYTES, fORMAT, ##aRGS)
-#define MSC_LOG_RX_DISCARDED_MESSAGE(rECEIVER, sENDER, bYTES, nUMbYTES, fORMAT, aRGS...) msc_log_message("x-",rECEIVER, sENDER, bYTES, nUMbYTES, fORMAT, ##aRGS)
-#define MSC_LOG_TX_MESSAGE(sENDER, rECEIVER, bYTES, nUMbYTES, fORMAT, aRGS...) msc_log_message("->",sENDER, rECEIVER, bYTES, nUMbYTES, fORMAT, ##aRGS)
-#define MSC_LOG_TX_MESSAGE_FAILED(sENDER, rECEIVER, bYTES, nUMbYTES, fORMAT, aRGS...) msc_log_message("-x",sENDER, rECEIVER, bYTES, nUMbYTES, fORMAT, ##aRGS)
#else
-#define MSC_INIT(arg1,arg2)
-#define MSC_START_USE(mScPaRaMs)
-#define MSC_END(mScPaRaMs)
-#define MSC_LOG_EVENT(mScPaRaMs, fORMAT, aRGS...)
-#define MSC_LOG_RX_MESSAGE(mScPaRaMs, fORMAT, aRGS...)
-#define MSC_LOG_RX_DISCARDED_MESSAGE(mScPaRaMs, fORMAT, aRGS...)
-#define MSC_LOG_TX_MESSAGE(mScPaRaMs, fORMAT, aRGS...)
-#define MSC_LOG_TX_MESSAGE_FAILED(mScPaRaMs, fORMAT, aRGS...)
-#endif
+
+msc_interface_t msc_interface;
+#define MSC_INIT(arg1,arg2) if(msc_interface.msc_loaded) msc_interface.msc_init(arg1,arg2)
+#define MSC_START_USE if(msc_interface.msc_loaded) msc_interface.msc_start_use
+#define MSC_END if(msc_interface.msc_loaded) msc_interface.msc_end
+#define MSC_LOG_EVENT(mScPaRaMs, fORMAT, aRGS...) if(msc_interface.msc_loaded) msc_interface.msc_log_event(mScPaRaMs, fORMAT, ##aRGS)
+#define MSC_LOG_RX_MESSAGE(rECEIVER, sENDER, bYTES, nUMbYTES, fORMAT, aRGS...) if(msc_interface.msc_loaded) msc_interface.msc_log_message("<-",rECEIVER, sENDER, (const uint8_t *)bYTES, nUMbYTES, fORMAT, ##aRGS)
+#define MSC_LOG_RX_DISCARDED_MESSAGE(rECEIVER, sENDER, bYTES, nUMbYTES, fORMAT, aRGS...) if(msc_interface.msc_loaded) msc_interface.msc_log_message("x-",rECEIVER, sENDER, (const uint8_t *)bYTES, nUMbYTES, fORMAT, ##aRGS)
+#define MSC_LOG_TX_MESSAGE(sENDER, rECEIVER, bYTES, nUMbYTES, fORMAT, aRGS...) if(msc_interface.msc_loaded) msc_interface.msc_log_message("->",sENDER, rECEIVER, (const uint8_t *)bYTES, nUMbYTES, fORMAT, ##aRGS)
+#define MSC_LOG_TX_MESSAGE_FAILED(sENDER, rECEIVER, bYTES, nUMbYTES, fORMAT, aRGS...) if(msc_interface.msc_loaded) msc_interface.msc_log_message("-x",sENDER, rECEIVER, (const uint8_t *)bYTES, nUMbYTES, fORMAT, ##aRGS)
#endif
+
+#endif
diff --git a/common/utils/ocp_itti/all_msg.h b/common/utils/ocp_itti/all_msg.h
new file mode 100644
index 0000000000..f439572400
--- /dev/null
+++ b/common/utils/ocp_itti/all_msg.h
@@ -0,0 +1,15 @@
+#include "openair2/COMMON/phy_messages_def.h"
+#include "openair2/COMMON/mac_messages_def.h"
+#include "openair2/COMMON/rlc_messages_def.h"
+#include "openair2/COMMON/pdcp_messages_def.h"
+#include "openair2/COMMON/rrc_messages_def.h"
+#include "openair2/COMMON/nas_messages_def.h"
+#if ENABLE_RAL
+ #include "openair2/COMMON/ral_messages_def.h"
+#endif
+#include "openair2/COMMON/s1ap_messages_def.h"
+#include "openair2/COMMON/x2ap_messages_def.h"
+#include "openair2/COMMON/sctp_messages_def.h"
+#include "openair2/COMMON/udp_messages_def.h"
+#include "openair2/COMMON/gtpv1_u_messages_def.h"
+#include "openair2/COMMON/flexran_messages_def.h"
diff --git a/common/utils/ocp_itti/intertask_interface.cpp b/common/utils/ocp_itti/intertask_interface.cpp
new file mode 100644
index 0000000000..931eb40c0f
--- /dev/null
+++ b/common/utils/ocp_itti/intertask_interface.cpp
@@ -0,0 +1,396 @@
+/*
+ Author: Laurent THOMAS, Open Cells
+ copyleft: OpenAirInterface Software Alliance and it's licence
+*/
+#include
+#include