Merge remote-tracking branch 'origin/develop' into ru_rau_enhancement
Conflicts: cmake_targets/build_oai openair1/PHY/LTE_TRANSPORT/prach.c openair1/PHY/LTE_TRANSPORT/pucch.c openair1/PHY/LTE_UE_TRANSPORT/initial_sync.c openair1/SCHED/fapi_l1.c openair1/SCHED/phy_procedures_lte_eNb.c openair2/LAYER2/MAC/eNB_scheduler.c openair2/LAYER2/MAC/eNB_scheduler_RA.c openair2/LAYER2/MAC/eNB_scheduler_dlsch.c openair2/LAYER2/MAC/eNB_scheduler_primitives.c openair2/LAYER2/MAC/eNB_scheduler_ulsch.c targets/ARCH/USRP/USERSPACE/LIB/usrp_lib.cpp targets/RT/USER/lte-enb.c targets/RT/USER/lte-ru.c targets/RT/USER/lte-softmodem.h
This commit is contained in:
@@ -0,0 +1,357 @@
|
|||||||
|
#!/bin/groovy
|
||||||
|
/*
|
||||||
|
* 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
|
||||||
|
*/
|
||||||
|
|
||||||
|
// Abstraction function to send social media messages:
|
||||||
|
// like on Slack or Mattermost
|
||||||
|
def sendSocialMediaMessage(pipeChannel, pipeColor, pipeMessage) {
|
||||||
|
if (params.pipelineUsesSlack != null) {
|
||||||
|
if (params.pipelineUsesSlack) {
|
||||||
|
slackSend channel: pipeChannel, color: pipeColor, message: pipeMessage
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
def doRedHatBuild = false
|
||||||
|
def FDD_Band7_B210_Status
|
||||||
|
|
||||||
|
pipeline {
|
||||||
|
agent {
|
||||||
|
label 'bellatrix'
|
||||||
|
}
|
||||||
|
options {
|
||||||
|
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"])
|
||||||
|
ansiColor('xterm')
|
||||||
|
}
|
||||||
|
|
||||||
|
stages {
|
||||||
|
stage ("Verify Parameters") {
|
||||||
|
steps {
|
||||||
|
script {
|
||||||
|
echo '\u2705 \u001B[32mVerify Parameters\u001B[0m'
|
||||||
|
def allParametersPresent = true
|
||||||
|
|
||||||
|
if (params.RedHatRemoteServer == null) {
|
||||||
|
allParametersPresent = false
|
||||||
|
}
|
||||||
|
if (params.RedHatRemoteCredentials == null) {
|
||||||
|
allParametersPresent = false
|
||||||
|
}
|
||||||
|
if (params.RedHatWorkingPath == null) {
|
||||||
|
allParametersPresent = false
|
||||||
|
}
|
||||||
|
if (allParametersPresent) {
|
||||||
|
echo "Performing Red Hat Build"
|
||||||
|
doRedHatBuild = true
|
||||||
|
} else {
|
||||||
|
doRedHatBuild = false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
stage ("Verify Guidelines") {
|
||||||
|
steps {
|
||||||
|
echo "Git URL is ${GIT_URL}"
|
||||||
|
echo "GitLab Act is ${env.gitlabActionType}"
|
||||||
|
script {
|
||||||
|
if ("MERGE".equals(env.gitlabActionType)) {
|
||||||
|
// GitLab-Jenkins plugin integration is lacking to perform the merge by itself
|
||||||
|
// Doing it manually --> it may have merge conflicts
|
||||||
|
sh "./ci-scripts/doGitLabMerge.sh --src-branch ${env.gitlabSourceBranch} --src-commit ${env.gitlabMergeRequestLastCommit} --target-branch ${env.gitlabTargetBranch} --target-commit ${GIT_COMMIT}"
|
||||||
|
sh "zip -r -qq localZip.zip ."
|
||||||
|
|
||||||
|
// Running astyle options on the list of modified files by the merge request
|
||||||
|
// For the moment, there is no fail criteria. Just a notification of number of files that do not follow
|
||||||
|
sh "./ci-scripts/checkCodingFormattingRules.sh --src-branch ${env.gitlabSourceBranch} --target-branch ${env.gitlabTargetBranch}"
|
||||||
|
def res=readFile('./oai_rules_result.txt').trim();
|
||||||
|
if ("0".equals(res)) {
|
||||||
|
def message = "OAI " + JOB_NAME + " build (" + BUILD_ID + "): All Changed files in Merge Request follow OAI Formatting Rules"
|
||||||
|
addGitLabMRComment comment: message
|
||||||
|
} else {
|
||||||
|
def message = "OAI " + JOB_NAME + " build (" + BUILD_ID + "): Some Changed files in Merge Request DO NOT follow OAI Formatting Rules"
|
||||||
|
addGitLabMRComment comment: message
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
echo "Git Branch is ${GIT_BRANCH}"
|
||||||
|
echo "Git Commit is ${GIT_COMMIT}"
|
||||||
|
|
||||||
|
sh "zip -r -qq localZip.zip ."
|
||||||
|
// Running astyle options on all C/H files in the repository
|
||||||
|
// For the moment, there is no fail criteria. Just a notification of number of files that do not follow
|
||||||
|
sh "./ci-scripts/checkCodingFormattingRules.sh"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
post {
|
||||||
|
failure {
|
||||||
|
script {
|
||||||
|
def message = "OAI " + JOB_NAME + " build (" + BUILD_ID + "): Merge Conflicts -- Cannot perform CI"
|
||||||
|
addGitLabMRComment comment: message
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
stage ("Start VM -- cppcheck") {
|
||||||
|
steps {
|
||||||
|
sh "./ci-scripts/createVM.sh --variant cppcheck --job-name ${JOB_NAME} --build-id ${BUILD_ID}"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
stage ("Start VM -- enb-usrp") {
|
||||||
|
steps {
|
||||||
|
sh "./ci-scripts/createVM.sh --variant enb-usrp --job-name ${JOB_NAME} --build-id ${BUILD_ID}"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
stage ("Start VM -- basic-sim") {
|
||||||
|
steps {
|
||||||
|
sh "./ci-scripts/createVM.sh --variant basic-sim --job-name ${JOB_NAME} --build-id ${BUILD_ID}"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
stage ("Start VM -- phy-sim") {
|
||||||
|
steps {
|
||||||
|
sh "./ci-scripts/createVM.sh --variant phy-sim --job-name ${JOB_NAME} --build-id ${BUILD_ID}"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
stage ("Start VM -- enb-ethernet") {
|
||||||
|
steps {
|
||||||
|
sh "./ci-scripts/createVM.sh --variant enb-ethernet --job-name ${JOB_NAME} --build-id ${BUILD_ID}"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
stage ("Start VM -- ue-ethernet") {
|
||||||
|
steps {
|
||||||
|
sh "./ci-scripts/createVM.sh --variant ue-ethernet --job-name ${JOB_NAME} --build-id ${BUILD_ID}"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
stage ("Variant Builds") {
|
||||||
|
parallel {
|
||||||
|
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"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
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"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
stage ("Build basic simulator") {
|
||||||
|
steps {
|
||||||
|
gitlabCommitStatus(name: "Build basic-sim") {
|
||||||
|
sh "./ci-scripts/buildOnVM.sh --workspace $WORKSPACE --variant basic-sim --job-name ${JOB_NAME} --build-id ${BUILD_ID} --keep-vm-alive"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
stage ("Build physical simulators") {
|
||||||
|
steps {
|
||||||
|
gitlabCommitStatus(name: "Build phy-sim") {
|
||||||
|
sh "./ci-scripts/buildOnVM.sh --workspace $WORKSPACE --variant phy-sim --job-name ${JOB_NAME} --build-id ${BUILD_ID} --keep-vm-alive"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
stage ("Build eNb-ethernet") {
|
||||||
|
steps {
|
||||||
|
gitlabCommitStatus(name: "Build eNb-ethernet") {
|
||||||
|
sh "./ci-scripts/buildOnVM.sh --workspace $WORKSPACE --variant enb-ethernet --job-name ${JOB_NAME} --build-id ${BUILD_ID} --keep-vm-alive"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
stage ("Build UE-ethernet") {
|
||||||
|
steps {
|
||||||
|
gitlabCommitStatus(name: "Build UE-ethernet") {
|
||||||
|
sh "./ci-scripts/buildOnVM.sh --workspace $WORKSPACE --variant ue-ethernet --job-name ${JOB_NAME} --build-id ${BUILD_ID} --keep-vm-alive"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
stage ("Build eNb-USRP on Red Hat") {
|
||||||
|
when {
|
||||||
|
expression {doRedHatBuild}
|
||||||
|
}
|
||||||
|
steps {
|
||||||
|
gitlabCommitStatus(name: "Build eNb-USRP-CentOS") {
|
||||||
|
script {
|
||||||
|
try {
|
||||||
|
withCredentials([
|
||||||
|
[$class: 'UsernamePasswordMultiBinding', credentialsId: "${params.RedHatRemoteCredentials}", usernameVariable: 'RH_Username', passwordVariable: 'RH_Password']
|
||||||
|
]) {
|
||||||
|
sh "./ci-scripts/buildOnRH.sh --workspace $WORKSPACE --job-name ${JOB_NAME} --build-id ${BUILD_ID} --remote-host ${params.RedHatRemoteServer} --remote-path ${params.RedHatWorkingPath} --remote-user-name ${RH_Username} --remote-password ${RH_Password}"
|
||||||
|
}
|
||||||
|
} catch (Exception e) {
|
||||||
|
echo "Red Hat build failed not an error now"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
post {
|
||||||
|
always {
|
||||||
|
script {
|
||||||
|
dir ('archives') {
|
||||||
|
sh "zip -r -qq vm_build_logs.zip basic_sim enb_usrp phy_sim cppcheck enb_eth ue_eth red_hat"
|
||||||
|
}
|
||||||
|
if(fileExists('archives/vm_build_logs.zip')) {
|
||||||
|
archiveArtifacts artifacts: 'archives/vm_build_logs.zip'
|
||||||
|
}
|
||||||
|
if ("MERGE".equals(env.gitlabActionType)) {
|
||||||
|
sh "./ci-scripts/reportBuildLocally.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}"
|
||||||
|
sh "./ci-scripts/checkAddedWarnings.sh --src-branch ${env.gitlabSourceBranch} --target-branch ${env.gitlabTargetBranch}"
|
||||||
|
def res=readFile('./oai_warning_files.txt').trim();
|
||||||
|
if ("0".equals(res)) {
|
||||||
|
echo "No issues w/ warnings/errors in this merge request"
|
||||||
|
} else {
|
||||||
|
def fileList=readFile('./oai_warning_files_list.txt').trim();
|
||||||
|
def message = "OAI " + JOB_NAME + " build (" + BUILD_ID + "): Some modified files in Merge Request MAY have INTRODUCED WARNINGS (" + fileList + ")"
|
||||||
|
addGitLabMRComment comment: message
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
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')) {
|
||||||
|
archiveArtifacts artifacts: 'build_results.html'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
stage ("Variant Tests") {
|
||||||
|
parallel {
|
||||||
|
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"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
stage ("Test basic simulator") {
|
||||||
|
steps {
|
||||||
|
//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)
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
post {
|
||||||
|
always {
|
||||||
|
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'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
post {
|
||||||
|
always {
|
||||||
|
script {
|
||||||
|
dir ('archives') {
|
||||||
|
sh "if [ -d */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'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
stage ("Destroy all Virtual Machines") {
|
||||||
|
steps {
|
||||||
|
sh "./ci-scripts/destroyAllRunningVM.sh --job-name ${JOB_NAME} --build-id ${BUILD_ID}"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
post {
|
||||||
|
always {
|
||||||
|
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}"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
success {
|
||||||
|
script {
|
||||||
|
def message = "OAI " + JOB_NAME + " build (" + BUILD_ID + "): passed (" + BUILD_URL + ")"
|
||||||
|
if ("MERGE".equals(env.gitlabActionType)) {
|
||||||
|
echo "This is a MERGE event"
|
||||||
|
addGitLabMRComment comment: message
|
||||||
|
def message2 = "OAI " + JOB_NAME + " build (" + BUILD_ID + "): passed (" + BUILD_URL + ") -- MergeRequest #" + env.gitlabMergeRequestIid + " (" + env.gitlabMergeRequestTitle + ")"
|
||||||
|
sendSocialMediaMessage('ci-enb', 'good', message2)
|
||||||
|
} else {
|
||||||
|
sendSocialMediaMessage('ci-enb', 'good', message)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
failure {
|
||||||
|
script {
|
||||||
|
def message = "OAI " + JOB_NAME + " build (" + BUILD_ID + "): failed (" + BUILD_URL + ")"
|
||||||
|
if ("MERGE".equals(env.gitlabActionType)) {
|
||||||
|
echo "This is a MERGE event"
|
||||||
|
addGitLabMRComment comment: message
|
||||||
|
def message2 = "OAI " + JOB_NAME + " build (" + BUILD_ID + "): failed (" + BUILD_URL + ") -- MergeRequest #" + env.gitlabMergeRequestIid + " (" + env.gitlabMergeRequestTitle + ")"
|
||||||
|
sendSocialMediaMessage('ci-enb', 'danger', message2)
|
||||||
|
} else {
|
||||||
|
sendSocialMediaMessage('ci-enb', 'danger', message)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,479 @@
|
|||||||
|
#!/bin/groovy
|
||||||
|
/*
|
||||||
|
* 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
|
||||||
|
*/
|
||||||
|
|
||||||
|
// Template Jenkins Declarative Pipeline script to run Test w/ RF HW
|
||||||
|
|
||||||
|
// Location of the python executor node shall be in the same subnet as the others servers
|
||||||
|
def pythonExecutor = params.pythonExecutor
|
||||||
|
|
||||||
|
// Location of the test XML file to be run
|
||||||
|
def testXMLFile = params.pythonTestXmlFile
|
||||||
|
|
||||||
|
// Name of the test stage
|
||||||
|
def testStageName = params.pipelineTestStageName
|
||||||
|
|
||||||
|
// Terminate Status
|
||||||
|
def termUE = 0
|
||||||
|
def termENB = 1
|
||||||
|
def termSPGW = 2
|
||||||
|
def termMME = 3
|
||||||
|
def termHSS = 4
|
||||||
|
def termStatusArray = new Boolean[termHSS + 1]
|
||||||
|
termStatusArray[termUE] = false
|
||||||
|
termStatusArray[termENB] = false
|
||||||
|
termStatusArray[termSPGW] = false
|
||||||
|
termStatusArray[termMME] = false
|
||||||
|
termStatusArray[termHSS] = false
|
||||||
|
|
||||||
|
// Global Parameters. Normally they should be populated when the master job
|
||||||
|
// triggers the slave job with parameters
|
||||||
|
def eNB_Repository
|
||||||
|
def eNB_Branch
|
||||||
|
def eNB_CommitID
|
||||||
|
def eNB_AllowMergeRequestProcess = false
|
||||||
|
|
||||||
|
pipeline {
|
||||||
|
agent {
|
||||||
|
label pythonExecutor
|
||||||
|
}
|
||||||
|
options {
|
||||||
|
disableConcurrentBuilds()
|
||||||
|
timestamps()
|
||||||
|
ansiColor('xterm')
|
||||||
|
}
|
||||||
|
// the following parameter options are commented out so it shows the ones
|
||||||
|
// that you SHALL have to run the job.
|
||||||
|
// You can use them as template
|
||||||
|
/*
|
||||||
|
parameters {
|
||||||
|
//node-test parameters
|
||||||
|
string(name: 'pythonExecutor', defaultValue: 'nodea', description: 'Node where the pipeline - python scripts will be executed')
|
||||||
|
string(name: 'pythonTestXmlFile', defaultValue: 'enb_usrpB210_band7_50PRB.xml', description: 'Location of the Test XML to be run')
|
||||||
|
string(name: 'pipelineTestStageName', defaultValue: 'Test COTS-UE - OAI eNB - LTEBOX EPC', description: 'Naming of the Test Stage')
|
||||||
|
booleanParam(name: 'pipelineZipsConsoleLog', defaultValue: 'True', description: 'If true, the pipeline script retrieves the job console log, zips it and archives it as artifact')
|
||||||
|
|
||||||
|
//eNB parameters
|
||||||
|
string(name: 'eNB_IPAddress', defaultValue: '192.168.XX.XX', description: 'IP Address of eNB')
|
||||||
|
credentials(name: 'eNB_Credentials', defaultValue: 'XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX', credentialType: "Username with password", required: true, description: 'Credentials for eNB')
|
||||||
|
string(name: 'eNB_SourceCodePath', defaultValue: '/tmp/CI-enb', description: 'Full path of eNB source code')
|
||||||
|
|
||||||
|
//EPC parameters
|
||||||
|
string(name: 'EPC_IPAddress', defaultValue: '192.168.XX.XX', description: 'IP Address of EPC')
|
||||||
|
string(name: 'EPC_Type', defaultValue: 'ltebox', description: 'EPC type: OAI or ltebox')
|
||||||
|
credentials(name: 'EPC_Credentials', defaultValue: 'XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX', credentialType: "Username with password", required: true, description: 'Credentials for EPC')
|
||||||
|
string(name: 'EPC_SourceCodePath', defaultValue: '/tmp/CI-enb', description: 'Full path of EPC source code')
|
||||||
|
|
||||||
|
//ADB server parameters
|
||||||
|
string(name: 'ADB_IPAddress', defaultValue: '192.168.XX.XX', description: 'IP Address of ADB server')
|
||||||
|
credentials(name: 'ADB_Credentials', defaultValue: 'XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX', credentialType: "Username with password", required: true, description: 'Credentials for ADB')
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
|
||||||
|
stages {
|
||||||
|
stage ("Verify Parameters") {
|
||||||
|
steps {
|
||||||
|
script {
|
||||||
|
echo '\u2705 \u001B[32mVerify Parameters\u001B[0m'
|
||||||
|
def allParametersPresent = true
|
||||||
|
|
||||||
|
// It is already to late to check it
|
||||||
|
if (params.pythonExecutor != null) {
|
||||||
|
echo "eNB CI executor node : ${pythonExecutor}"
|
||||||
|
}
|
||||||
|
// If not present picking a default XML file
|
||||||
|
if (params.pythonTestXmlFile == null) {
|
||||||
|
// picking default
|
||||||
|
testXMLFile = 'xml_files/enb_usrpB210_band7_50PRB.xml'
|
||||||
|
} else {
|
||||||
|
echo "Test XML file : ${testXMLFile}"
|
||||||
|
}
|
||||||
|
// If not present picking a default Stage Name
|
||||||
|
if (params.pipelineTestStageName == null) {
|
||||||
|
// picking default
|
||||||
|
testStageName = 'Template Test Stage'
|
||||||
|
}
|
||||||
|
|
||||||
|
if (params.eNB_IPAddress == null) {
|
||||||
|
allParametersPresent = false
|
||||||
|
}
|
||||||
|
if (params.eNB_SourceCodePath == null) {
|
||||||
|
allParametersPresent = false
|
||||||
|
}
|
||||||
|
if (params.eNB_Credentials == null) {
|
||||||
|
allParametersPresent = false
|
||||||
|
}
|
||||||
|
// the following 4 parameters should be pushed by the master trigger
|
||||||
|
// if not present, take the job GIT variables (used for developing)
|
||||||
|
if (params.eNB_Repository == null) {
|
||||||
|
eNB_Repository = env.GIT_URL
|
||||||
|
} else {
|
||||||
|
eNB_Repository = params.eNB_Repository
|
||||||
|
}
|
||||||
|
echo "eNB_Repository : ${eNB_Repository}"
|
||||||
|
if (params.eNB_Branch == null) {
|
||||||
|
eNB_Branch = env.GIT_BRANCH
|
||||||
|
} else {
|
||||||
|
eNB_Branch = params.eNB_Branch
|
||||||
|
}
|
||||||
|
echo "eNB_Branch : ${eNB_Branch}"
|
||||||
|
if (params.eNB_CommitID == null) {
|
||||||
|
eNB_CommitID = env.GIT_COMMIT
|
||||||
|
} else {
|
||||||
|
eNB_CommitID = params.eNB_CommitID
|
||||||
|
}
|
||||||
|
echo "eNB_CommitID : ${eNB_CommitID}"
|
||||||
|
if (params.eNB_mergeRequest != null) {
|
||||||
|
eNB_AllowMergeRequestProcess = params.eNB_mergeRequest
|
||||||
|
}
|
||||||
|
|
||||||
|
if (params.EPC_IPAddress == null) {
|
||||||
|
allParametersPresent = false
|
||||||
|
}
|
||||||
|
if (params.EPC_Type == null) {
|
||||||
|
allParametersPresent = false
|
||||||
|
}
|
||||||
|
if (params.EPC_SourceCodePath == null) {
|
||||||
|
allParametersPresent = false
|
||||||
|
}
|
||||||
|
if (params.EPC_Credentials == null) {
|
||||||
|
allParametersPresent = false
|
||||||
|
}
|
||||||
|
|
||||||
|
if (params.ADB_IPAddress == null) {
|
||||||
|
allParametersPresent = false
|
||||||
|
}
|
||||||
|
if (params.ADB_Credentials == null) {
|
||||||
|
allParametersPresent = false
|
||||||
|
}
|
||||||
|
|
||||||
|
if (allParametersPresent) {
|
||||||
|
echo "All parameters are present"
|
||||||
|
} else {
|
||||||
|
echo "Some parameters are missing"
|
||||||
|
sh "./ci-scripts/fail.sh"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
stage ("Build and Test") {
|
||||||
|
steps {
|
||||||
|
script {
|
||||||
|
dir ('ci-scripts') {
|
||||||
|
try {
|
||||||
|
echo "\u2705 \u001B[32m${testStageName}\u001B[0m"
|
||||||
|
withCredentials([
|
||||||
|
[$class: 'UsernamePasswordMultiBinding', credentialsId: "${params.eNB_Credentials}", usernameVariable: 'eNB_Username', passwordVariable: 'eNB_Password'],
|
||||||
|
[$class: 'UsernamePasswordMultiBinding', credentialsId: "${params.EPC_Credentials}", usernameVariable: 'EPC_Username', passwordVariable: 'EPC_Password'],
|
||||||
|
[$class: 'UsernamePasswordMultiBinding', credentialsId: "${params.ADB_Credentials}", usernameVariable: 'ADB_Username', passwordVariable: 'ADB_Password']
|
||||||
|
]) {
|
||||||
|
sh "python3 main.py --mode=TesteNB --eNBIPAddress=${params.eNB_IPAddress} --eNBRepository=${eNB_Repository} --eNBBranch=${eNB_Branch} --eNBCommitID=${eNB_CommitID} --eNB_AllowMerge=${eNB_AllowMergeRequestProcess} --eNBUserName=${eNB_Username} --eNBPassword=${eNB_Password} --eNBSourceCodePath=${params.eNB_SourceCodePath} --EPCIPAddress=${params.EPC_IPAddress} --EPCType=${params.EPC_Type} --EPCUserName=${EPC_Username} --EPCPassword=${EPC_Password} --EPCSourceCodePath=${params.EPC_SourceCodePath} --ADBIPAddress=${params.ADB_IPAddress} --ADBUserName=${ADB_Username} --ADBPassword=${ADB_Password} --XMLTestFile=${testXMLFile}"
|
||||||
|
}
|
||||||
|
} catch (Exception e) {
|
||||||
|
currentBuild.result = 'FAILURE'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
stage ("Terminate") {
|
||||||
|
parallel {
|
||||||
|
stage('Terminate UE') {
|
||||||
|
steps {
|
||||||
|
echo '\u2705 \u001B[32mTerminate UE\u001B[0m'
|
||||||
|
withCredentials([
|
||||||
|
[$class: 'UsernamePasswordMultiBinding', credentialsId: "${params.ADB_Credentials}", usernameVariable: 'ADB_Username', passwordVariable: 'ADB_Password']
|
||||||
|
]) {
|
||||||
|
sh "python3 ci-scripts/main.py --mode=TerminateUE --ADBIPAddress=${params.ADB_IPAddress} --ADBUserName=${ADB_Username} --ADBPassword=${ADB_Password}"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
post {
|
||||||
|
success {
|
||||||
|
script {
|
||||||
|
termStatusArray[termUE] = true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
stage('Terminate eNB') {
|
||||||
|
steps {
|
||||||
|
echo '\u2705 \u001B[32mTerminate eNB\u001B[0m'
|
||||||
|
withCredentials([
|
||||||
|
[$class: 'UsernamePasswordMultiBinding', credentialsId: "${params.eNB_Credentials}", usernameVariable: 'eNB_Username', passwordVariable: 'eNB_Password']
|
||||||
|
]) {
|
||||||
|
sh "python3 ci-scripts/main.py --mode=TerminateeNB --eNBIPAddress=${params.eNB_IPAddress} --eNBUserName=${eNB_Username} --eNBPassword=${eNB_Password}"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
post {
|
||||||
|
success {
|
||||||
|
script {
|
||||||
|
termStatusArray[termENB] = true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
stage('Terminate SPGW') {
|
||||||
|
steps {
|
||||||
|
echo '\u2705 \u001B[32mTerminate SPGW\u001B[0m'
|
||||||
|
withCredentials([
|
||||||
|
[$class: 'UsernamePasswordMultiBinding', credentialsId: "${params.EPC_Credentials}", usernameVariable: 'EPC_Username', passwordVariable: 'EPC_Password']
|
||||||
|
]) {
|
||||||
|
sh "python3 ci-scripts/main.py --mode=TerminateSPGW --EPCIPAddress=${params.EPC_IPAddress} --EPCUserName=${EPC_Username} --EPCPassword=${EPC_Password} --EPCType=${params.EPC_Type} --EPCSourceCodePath=${params.EPC_SourceCodePath}"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
post {
|
||||||
|
success {
|
||||||
|
script {
|
||||||
|
termStatusArray[termSPGW] = true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
stage('Terminate MME') {
|
||||||
|
steps {
|
||||||
|
echo '\u2705 \u001B[32mTerminate MME\u001B[0m'
|
||||||
|
withCredentials([
|
||||||
|
[$class: 'UsernamePasswordMultiBinding', credentialsId: "${params.EPC_Credentials}", usernameVariable: 'EPC_Username', passwordVariable: 'EPC_Password']
|
||||||
|
]) {
|
||||||
|
sh "python3 ci-scripts/main.py --mode=TerminateMME --EPCIPAddress=${params.EPC_IPAddress} --EPCUserName=${EPC_Username} --EPCPassword=${EPC_Password} --EPCType=${params.EPC_Type} --EPCSourceCodePath=${params.EPC_SourceCodePath}"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
post {
|
||||||
|
success {
|
||||||
|
script {
|
||||||
|
termStatusArray[termMME] = true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
stage('Terminate HSS') {
|
||||||
|
steps {
|
||||||
|
echo '\u2705 \u001B[32mTerminate HSS\u001B[0m'
|
||||||
|
withCredentials([
|
||||||
|
[$class: 'UsernamePasswordMultiBinding', credentialsId: "${params.EPC_Credentials}", usernameVariable: 'EPC_Username', passwordVariable: 'EPC_Password']
|
||||||
|
]) {
|
||||||
|
sh "python3 ci-scripts/main.py --mode=TerminateHSS --EPCIPAddress=${params.EPC_IPAddress} --EPCUserName=${EPC_Username} --EPCPassword=${EPC_Password} --EPCType=${params.EPC_Type} --EPCSourceCodePath=${params.EPC_SourceCodePath}"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
post {
|
||||||
|
success {
|
||||||
|
script {
|
||||||
|
termStatusArray[termHSS] = true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
stage('Log Collection') {
|
||||||
|
parallel {
|
||||||
|
stage('Log Collection (eNB - Build)') {
|
||||||
|
steps {
|
||||||
|
withCredentials([
|
||||||
|
[$class: 'UsernamePasswordMultiBinding', credentialsId: "${params.eNB_Credentials}", usernameVariable: 'eNB_Username', passwordVariable: 'eNB_Password']
|
||||||
|
]) {
|
||||||
|
echo '\u2705 \u001B[32mLog Collection (eNB - Build)\u001B[0m'
|
||||||
|
sh "python3 ci-scripts/main.py --mode=LogCollectBuild --eNBIPAddress=${params.eNB_IPAddress} --eNBUserName=${eNB_Username} --eNBPassword=${eNB_Password} --eNBSourceCodePath=${params.eNB_SourceCodePath}"
|
||||||
|
|
||||||
|
echo '\u2705 \u001B[32mLog Transfer (eNB - Build)\u001B[0m'
|
||||||
|
sh "sshpass -p \'${eNB_Password}\' scp -o 'StrictHostKeyChecking no' -o 'ConnectTimeout 10' ${eNB_Username}@${params.eNB_IPAddress}:${eNB_SourceCodePath}/cmake_targets/build.log.zip ./build.log.${env.BUILD_ID}.zip || true"
|
||||||
|
}
|
||||||
|
script {
|
||||||
|
if(fileExists("build.log.${env.BUILD_ID}.zip")) {
|
||||||
|
archiveArtifacts "build.log.${env.BUILD_ID}.zip"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
stage('Log Collection (eNB - Run)') {
|
||||||
|
steps {
|
||||||
|
withCredentials([
|
||||||
|
[$class: 'UsernamePasswordMultiBinding', credentialsId: "${params.eNB_Credentials}", usernameVariable: 'eNB_Username', passwordVariable: 'eNB_Password']
|
||||||
|
]) {
|
||||||
|
echo '\u2705 \u001B[32mLog Collection (eNB - Run)\u001B[0m'
|
||||||
|
sh "python3 ci-scripts/main.py --mode=LogCollecteNB --eNBIPAddress=${params.eNB_IPAddress} --eNBUserName=${eNB_Username} --eNBPassword=${eNB_Password} --eNBSourceCodePath=${params.eNB_SourceCodePath}"
|
||||||
|
|
||||||
|
echo '\u2705 \u001B[32mLog Transfer (eNB - Run)\u001B[0m'
|
||||||
|
sh "sshpass -p \'${eNB_Password}\' scp -o 'StrictHostKeyChecking no' -o 'ConnectTimeout 10' ${eNB_Username}@${params.eNB_IPAddress}:${eNB_SourceCodePath}/cmake_targets/enb.log.zip ./enb.log.${env.BUILD_ID}.zip || true"
|
||||||
|
}
|
||||||
|
script {
|
||||||
|
if(fileExists("enb.log.${env.BUILD_ID}.zip")) {
|
||||||
|
archiveArtifacts "enb.log.${env.BUILD_ID}.zip"
|
||||||
|
}
|
||||||
|
if(fileExists("ci-scripts/test_results.html")) {
|
||||||
|
sh "mv ci-scripts/test_results.html test_results-${JOB_NAME}.html"
|
||||||
|
sh "sed -i -e 's#TEMPLATE_JOB_NAME#${JOB_NAME}#' -e 's#TEMPLATE_BUILD_ID#${BUILD_ID}#' test_results-${JOB_NAME}.html"
|
||||||
|
archiveArtifacts "test_results-${JOB_NAME}.html"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
stage('Log Collection (SPGW)') {
|
||||||
|
steps {
|
||||||
|
withCredentials([
|
||||||
|
[$class: 'UsernamePasswordMultiBinding', credentialsId: "${params.EPC_Credentials}", usernameVariable: 'EPC_Username', passwordVariable: 'EPC_Password']
|
||||||
|
]) {
|
||||||
|
echo '\u2705 \u001B[32mLog Collection (SPGW)\u001B[0m'
|
||||||
|
sh "python3 ci-scripts/main.py --mode=LogCollectSPGW --EPCIPAddress=${params.EPC_IPAddress} --EPCUserName=${EPC_Username} --EPCPassword=${EPC_Password} --EPCSourceCodePath=${params.EPC_SourceCodePath} --EPCType=${params.EPC_Type}"
|
||||||
|
|
||||||
|
echo '\u2705 \u001B[32mLog Transfer (SPGW)\u001B[0m'
|
||||||
|
sh "sshpass -p \'${EPC_Password}\' scp -o 'StrictHostKeyChecking no' -o 'ConnectTimeout 10' ${EPC_Username}@${params.EPC_IPAddress}:${EPC_SourceCodePath}/scripts/spgw.log.zip ./spgw.log.${env.BUILD_ID}.zip || true"
|
||||||
|
}
|
||||||
|
script {
|
||||||
|
if(fileExists("spgw.log.${env.BUILD_ID}.zip")) {
|
||||||
|
archiveArtifacts "spgw.log.${env.BUILD_ID}.zip"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
stage('Log Collection (MME)') {
|
||||||
|
steps {
|
||||||
|
withCredentials([
|
||||||
|
[$class: 'UsernamePasswordMultiBinding', credentialsId: "${params.EPC_Credentials}", usernameVariable: 'EPC_Username', passwordVariable: 'EPC_Password']
|
||||||
|
]) {
|
||||||
|
echo '\u2705 \u001B[32mLog Collection (MME)\u001B[0m'
|
||||||
|
sh "python3 ci-scripts/main.py --mode=LogCollectMME --EPCIPAddress=${params.EPC_IPAddress} --EPCUserName=${EPC_Username} --EPCPassword=${EPC_Password} --EPCSourceCodePath=${params.EPC_SourceCodePath} --EPCType=${params.EPC_Type}"
|
||||||
|
|
||||||
|
echo '\u2705 \u001B[32mLog Transfer (MME)\u001B[0m'
|
||||||
|
sh "sshpass -p \'${EPC_Password}\' scp -o 'StrictHostKeyChecking no' -o 'ConnectTimeout 10' ${EPC_Username}@${params.EPC_IPAddress}:${EPC_SourceCodePath}/scripts/mme.log.zip ./mme.log.${env.BUILD_ID}.zip || true"
|
||||||
|
}
|
||||||
|
script {
|
||||||
|
if(fileExists("mme.log.${env.BUILD_ID}.zip")) {
|
||||||
|
archiveArtifacts "mme.log.${env.BUILD_ID}.zip"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
stage('Log Collection (HSS)') {
|
||||||
|
steps {
|
||||||
|
withCredentials([
|
||||||
|
[$class: 'UsernamePasswordMultiBinding', credentialsId: "${params.EPC_Credentials}", usernameVariable: 'EPC_Username', passwordVariable: 'EPC_Password']
|
||||||
|
]) {
|
||||||
|
echo '\u2705 \u001B[32mLog Collection (HSS)\u001B[0m'
|
||||||
|
sh "python3 ci-scripts/main.py --mode=LogCollectHSS --EPCIPAddress=${params.EPC_IPAddress} --EPCUserName=${EPC_Username} --EPCPassword=${EPC_Password} --EPCSourceCodePath=${params.EPC_SourceCodePath} --EPCType=${params.EPC_Type}"
|
||||||
|
|
||||||
|
echo '\u2705 \u001B[32mLog Transfer (HSS)\u001B[0m'
|
||||||
|
sh "sshpass -p \'${EPC_Password}\' scp -o 'StrictHostKeyChecking no' -o 'ConnectTimeout 10' ${EPC_Username}@${params.EPC_IPAddress}:${EPC_SourceCodePath}/scripts/hss.log.zip ./hss.log.${env.BUILD_ID}.zip || true"
|
||||||
|
}
|
||||||
|
script {
|
||||||
|
if(fileExists("hss.log.${env.BUILD_ID}.zip")) {
|
||||||
|
archiveArtifacts "hss.log.${env.BUILD_ID}.zip"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
stage('Log Collection (Ping)') {
|
||||||
|
steps {
|
||||||
|
withCredentials([
|
||||||
|
[$class: 'UsernamePasswordMultiBinding', credentialsId: "${params.EPC_Credentials}", usernameVariable: 'EPC_Username', passwordVariable: 'EPC_Password']
|
||||||
|
]) {
|
||||||
|
echo '\u2705 \u001B[32mLog Collection (Ping)\u001B[0m'
|
||||||
|
sh "python3 ci-scripts/main.py --mode=LogCollectPing --EPCIPAddress=${params.EPC_IPAddress} --EPCUserName=${EPC_Username} --EPCPassword=${EPC_Password} --EPCSourceCodePath=${params.EPC_SourceCodePath} --EPCType=${params.EPC_Type}"
|
||||||
|
|
||||||
|
echo '\u2705 \u001B[32mLog Transfer (Ping)\u001B[0m'
|
||||||
|
sh "sshpass -p \'${EPC_Password}\' scp -o 'StrictHostKeyChecking no' -o 'ConnectTimeout 10' ${EPC_Username}@${params.EPC_IPAddress}:${EPC_SourceCodePath}/scripts/ping.log.zip ./ping.log.${env.BUILD_ID}.zip || true"
|
||||||
|
}
|
||||||
|
script {
|
||||||
|
if(fileExists("ping.log.${env.BUILD_ID}.zip")) {
|
||||||
|
archiveArtifacts "ping.log.${env.BUILD_ID}.zip"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
stage('Log Collection (Iperf)') {
|
||||||
|
steps {
|
||||||
|
withCredentials([
|
||||||
|
[$class: 'UsernamePasswordMultiBinding', credentialsId: "${params.EPC_Credentials}", usernameVariable: 'EPC_Username', passwordVariable: 'EPC_Password']
|
||||||
|
]) {
|
||||||
|
echo '\u2705 \u001B[32mLog Collection (Iperf)\u001B[0m'
|
||||||
|
sh "python3 ci-scripts/main.py --mode=LogCollectIperf --EPCIPAddress=${params.EPC_IPAddress} --EPCUserName=${EPC_Username} --EPCPassword=${EPC_Password} --EPCSourceCodePath=${params.EPC_SourceCodePath} --EPCType=${params.EPC_Type}"
|
||||||
|
|
||||||
|
echo '\u2705 \u001B[32mLog Transfer (Iperf)\u001B[0m'
|
||||||
|
sh "sshpass -p \'${EPC_Password}\' scp -o 'StrictHostKeyChecking no' -o 'ConnectTimeout 10' ${EPC_Username}@${params.EPC_IPAddress}:${EPC_SourceCodePath}/scripts/iperf.log.zip ./iperf.log.${env.BUILD_ID}.zip || true"
|
||||||
|
}
|
||||||
|
script {
|
||||||
|
if(fileExists("iperf.log.${env.BUILD_ID}.zip")) {
|
||||||
|
archiveArtifacts "iperf.log.${env.BUILD_ID}.zip"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
post {
|
||||||
|
always {
|
||||||
|
script {
|
||||||
|
if (params.pipelineZipsConsoleLog != null) {
|
||||||
|
if (params.pipelineZipsConsoleLog) {
|
||||||
|
echo "Archiving Jenkins console log"
|
||||||
|
sh "wget --no-check-certificate --no-proxy ${env.JENKINS_URL}/job/${env.JOB_NAME}/${env.BUILD_ID}/consoleText -O consoleText.log || true"
|
||||||
|
sh "zip -m consoleText.log.${env.BUILD_ID}.zip consoleText.log || true"
|
||||||
|
if(fileExists("consoleText.log.${env.BUILD_ID}.zip")) {
|
||||||
|
archiveArtifacts "consoleText.log.${env.BUILD_ID}.zip"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// Making sure that we really shutdown every thing before leaving
|
||||||
|
failure {
|
||||||
|
script {
|
||||||
|
if (!termStatusArray[termUE]) {
|
||||||
|
withCredentials([
|
||||||
|
[$class: 'UsernamePasswordMultiBinding', credentialsId: "${params.ADB_Credentials}", usernameVariable: 'ADB_Username', passwordVariable: 'ADB_Password']
|
||||||
|
]) {
|
||||||
|
sh "python3 ci-scripts/main.py --mode=TerminateUE --ADBIPAddress=${params.ADB_IPAddress} --ADBUserName=${ADB_Username} --ADBPassword=${ADB_Password}"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (!termStatusArray[termENB]) {
|
||||||
|
withCredentials([
|
||||||
|
[$class: 'UsernamePasswordMultiBinding', credentialsId: "${params.eNB_Credentials}", usernameVariable: 'eNB_Username', passwordVariable: 'eNB_Password']
|
||||||
|
]) {
|
||||||
|
sh "python3 ci-scripts/main.py --mode=TerminateeNB --eNBIPAddress=${params.eNB_IPAddress} --eNBUserName=${eNB_Username} --eNBPassword=${eNB_Password}"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (!termStatusArray[termSPGW]) {
|
||||||
|
withCredentials([
|
||||||
|
[$class: 'UsernamePasswordMultiBinding', credentialsId: "${params.EPC_Credentials}", usernameVariable: 'EPC_Username', passwordVariable: 'EPC_Password']
|
||||||
|
]) {
|
||||||
|
sh "python3 ci-scripts/main.py --mode=TerminateSPGW --EPCIPAddress=${params.EPC_IPAddress} --EPCUserName=${EPC_Username} --EPCPassword=${EPC_Password} --EPCType=${params.EPC_Type} --EPCSourceCodePath=${params.EPC_SourceCodePath}"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (!termStatusArray[termMME]) {
|
||||||
|
withCredentials([
|
||||||
|
[$class: 'UsernamePasswordMultiBinding', credentialsId: "${params.EPC_Credentials}", usernameVariable: 'EPC_Username', passwordVariable: 'EPC_Password']
|
||||||
|
]) {
|
||||||
|
sh "python3 ci-scripts/main.py --mode=TerminateMME --EPCIPAddress=${params.EPC_IPAddress} --EPCUserName=${EPC_Username} --EPCPassword=${EPC_Password} --EPCType=${params.EPC_Type} --EPCSourceCodePath=${params.EPC_SourceCodePath}"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (!termStatusArray[termHSS]) {
|
||||||
|
withCredentials([
|
||||||
|
[$class: 'UsernamePasswordMultiBinding', credentialsId: "${params.EPC_Credentials}", usernameVariable: 'EPC_Username', passwordVariable: 'EPC_Password']
|
||||||
|
]) {
|
||||||
|
sh "python3 ci-scripts/main.py --mode=TerminateHSS --EPCIPAddress=${params.EPC_IPAddress} --EPCUserName=${EPC_Username} --EPCPassword=${EPC_Password} --EPCType=${params.EPC_Type} --EPCSourceCodePath=${params.EPC_SourceCodePath}"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,20 @@
|
|||||||
|
# OAI is using a style that is similar to the Google style
|
||||||
|
--style=google
|
||||||
|
# long options can be written without the preceding '--'
|
||||||
|
# Convert tabs to spaces
|
||||||
|
convert-tabs
|
||||||
|
# Indentation is 2 spaces
|
||||||
|
indent=spaces=2
|
||||||
|
# Indent 'switch' blocks so that the 'case X:' statements are indented in the switch block.
|
||||||
|
indent-switches
|
||||||
|
# Indent C++ comments beginning in column one.
|
||||||
|
indent-col1-comments
|
||||||
|
# Pad empty lines around header blocks
|
||||||
|
break-blocks
|
||||||
|
delete-empty-lines
|
||||||
|
# Attach a pointer or reference operator (*, &, or ^) to the variable name (right)
|
||||||
|
align-pointer=name
|
||||||
|
# The code line length is 200 characters/columns
|
||||||
|
max-code-length=200
|
||||||
|
break-after-logical
|
||||||
|
lineend=linux
|
||||||
Executable
+209
@@ -0,0 +1,209 @@
|
|||||||
|
#!/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 RedHat Build Check script"
|
||||||
|
echo " Original Author: Raphael Defosseux"
|
||||||
|
|
||||||
|
echo ""
|
||||||
|
echo "Usage:"
|
||||||
|
echo "------"
|
||||||
|
echo " buildOnRH.sh [OPTIONS]"
|
||||||
|
echo ""
|
||||||
|
echo "Options:"
|
||||||
|
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 " --workspace #### OR -ws ####"
|
||||||
|
echo " Specify the workspace."
|
||||||
|
echo ""
|
||||||
|
echo " --remote-host #### OR -rh ####"
|
||||||
|
echo " Specify the RedHat remote server."
|
||||||
|
echo ""
|
||||||
|
echo " --remote-user-name #### OR -ru ####"
|
||||||
|
echo " Specify the RedHat remote server username."
|
||||||
|
echo ""
|
||||||
|
echo " --remote-password #### OR -rp ####"
|
||||||
|
echo " Specify the RedHat remote server password."
|
||||||
|
echo ""
|
||||||
|
echo " --remote-path #### OR -ra ####"
|
||||||
|
echo " Specify the RedHat remote server path to work on."
|
||||||
|
echo ""
|
||||||
|
}
|
||||||
|
|
||||||
|
if [ $# -lt 1 ] || [ $# -gt 14 ]
|
||||||
|
then
|
||||||
|
echo "Syntax Error: not the correct number of arguments"
|
||||||
|
echo ""
|
||||||
|
usage
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
RH_HOST=XX
|
||||||
|
RH_USER=XX
|
||||||
|
RH_PASSWD=XX
|
||||||
|
RH_PATH=XX
|
||||||
|
JOB_NAME=XX
|
||||||
|
BUILD_ID=XX
|
||||||
|
|
||||||
|
while [[ $# -gt 0 ]]
|
||||||
|
do
|
||||||
|
key="$1"
|
||||||
|
|
||||||
|
case $key in
|
||||||
|
-h|--help)
|
||||||
|
shift
|
||||||
|
usage
|
||||||
|
exit 0
|
||||||
|
;;
|
||||||
|
-jn|--job-name)
|
||||||
|
JOB_NAME="$2"
|
||||||
|
shift
|
||||||
|
shift
|
||||||
|
;;
|
||||||
|
-id|--build-id)
|
||||||
|
BUILD_ID="$2"
|
||||||
|
shift
|
||||||
|
shift
|
||||||
|
;;
|
||||||
|
-ws|--workspace)
|
||||||
|
JENKINS_WKSP="$2"
|
||||||
|
shift
|
||||||
|
shift
|
||||||
|
;;
|
||||||
|
-rh|--remote-host)
|
||||||
|
RH_HOST="$2"
|
||||||
|
shift
|
||||||
|
shift
|
||||||
|
;;
|
||||||
|
-ru|--remote-user-name)
|
||||||
|
RH_USER="$2"
|
||||||
|
shift
|
||||||
|
shift
|
||||||
|
;;
|
||||||
|
-rp|--remote-password)
|
||||||
|
RH_PASSWD="$2"
|
||||||
|
shift
|
||||||
|
shift
|
||||||
|
;;
|
||||||
|
-ra|--remote-path)
|
||||||
|
RH_PATH="$2"
|
||||||
|
shift
|
||||||
|
shift
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
echo "Syntax Error: unknown option: $key"
|
||||||
|
echo ""
|
||||||
|
usage
|
||||||
|
exit 1
|
||||||
|
esac
|
||||||
|
done
|
||||||
|
|
||||||
|
if [ ! -f $JENKINS_WKSP/localZip.zip ]
|
||||||
|
then
|
||||||
|
echo "Missing localZip.zip file!"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ "$JOB_NAME" == "XX" ] || [ "$BUILD_ID" == "XX" ] || [ "$RH_HOST" == "XX" ] || [ "$RH_USER" == "XX" ] || [ "$RH_PASSWD" == "XX" ] || [ "$RH_PATH" == "XX" ]
|
||||||
|
then
|
||||||
|
echo "Missing options"
|
||||||
|
usage
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo "############################################################"
|
||||||
|
echo "Copying GIT repo into RedHat Server"
|
||||||
|
echo "############################################################"
|
||||||
|
echo "rm -Rf ${RH_PATH}" >> rh-cmd.txt
|
||||||
|
echo "mkdir -p ${RH_PATH}" >> rh-cmd.txt
|
||||||
|
|
||||||
|
sshpass -p ${RH_PASSWD} ssh -o 'StrictHostKeyChecking no' ${RH_USER}@${RH_HOST} < rh-cmd.txt
|
||||||
|
rm -f rh-cmd.txt
|
||||||
|
|
||||||
|
echo "############################################################"
|
||||||
|
echo "Running install and build script on RedHat Server"
|
||||||
|
echo "############################################################"
|
||||||
|
sshpass -p ${RH_PASSWD} scp -o 'StrictHostKeyChecking no' $JENKINS_WKSP/localZip.zip ${RH_USER}@${RH_HOST}:${RH_PATH}
|
||||||
|
|
||||||
|
echo "cd ${RH_PATH}" > rh-cmd.txt
|
||||||
|
echo "unzip -qq localZip.zip" >> rh-cmd.txt
|
||||||
|
echo "source oaienv" >> rh-cmd.txt
|
||||||
|
echo "cd cmake_targets" >> rh-cmd.txt
|
||||||
|
echo "mkdir -p log" >> rh-cmd.txt
|
||||||
|
echo "./build_oai -I -w USRP --eNB > log/install-build.txt 2>&1" >> rh-cmd.txt
|
||||||
|
sshpass -p ${RH_PASSWD} ssh -o 'StrictHostKeyChecking no' ${RH_USER}@${RH_HOST} < rh-cmd.txt
|
||||||
|
|
||||||
|
rm -f rh-cmd.txt
|
||||||
|
|
||||||
|
echo "############################################################"
|
||||||
|
echo "Creating a tmp folder to store results and artifacts"
|
||||||
|
echo "############################################################"
|
||||||
|
if [ ! -d $JENKINS_WKSP/archives ]
|
||||||
|
then
|
||||||
|
mkdir -p $JENKINS_WKSP/archives
|
||||||
|
fi
|
||||||
|
|
||||||
|
ARCHIVES_LOC=$JENKINS_WKSP/archives/red_hat
|
||||||
|
if [ ! -d $ARCHIVES_LOC ]
|
||||||
|
then
|
||||||
|
mkdir -p $ARCHIVES_LOC
|
||||||
|
fi
|
||||||
|
|
||||||
|
sshpass -p ${RH_PASSWD} scp -o 'StrictHostKeyChecking no' ${RH_USER}@${RH_HOST}:${RH_PATH}/cmake_targets/log/*.txt $ARCHIVES_LOC
|
||||||
|
|
||||||
|
echo "############################################################"
|
||||||
|
echo "Checking build status"
|
||||||
|
echo "############################################################"
|
||||||
|
|
||||||
|
LOG_PATTERN=.Rel14.txt
|
||||||
|
NB_PATTERN_FILES=4
|
||||||
|
|
||||||
|
LOG_FILES=`ls $ARCHIVES_LOC/*.txt`
|
||||||
|
STATUS=0
|
||||||
|
NB_FOUND_FILES=0
|
||||||
|
|
||||||
|
for FULLFILE in $LOG_FILES
|
||||||
|
do
|
||||||
|
if [[ $FULLFILE == *"$LOG_PATTERN"* ]]
|
||||||
|
then
|
||||||
|
filename=$(basename -- "$FULLFILE")
|
||||||
|
PASS_PATTERN=`echo $filename | sed -e "s#$LOG_PATTERN##"`
|
||||||
|
LOCAL_STAT=`egrep -c "Built target $PASS_PATTERN" $FULLFILE`
|
||||||
|
if [ $LOCAL_STAT -eq 0 ]; then STATUS=-1; fi
|
||||||
|
NB_FOUND_FILES=$((NB_FOUND_FILES + 1))
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
|
||||||
|
if [ $NB_PATTERN_FILES -ne $NB_FOUND_FILES ]; then STATUS=-1; fi
|
||||||
|
|
||||||
|
if [ $STATUS -eq 0 ]
|
||||||
|
then
|
||||||
|
echo "STATUS seems OK"
|
||||||
|
else
|
||||||
|
echo "STATUS failed?"
|
||||||
|
fi
|
||||||
|
exit $STATUS
|
||||||
Executable
+393
@@ -0,0 +1,393 @@
|
|||||||
|
#!/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 VM Build Check script"
|
||||||
|
echo " Original Author: Raphael Defosseux"
|
||||||
|
echo " Requirements:"
|
||||||
|
echo " -- uvtool uvtool-libvirt apt-cacher"
|
||||||
|
echo " -- xenial image already synced"
|
||||||
|
echo " Default:"
|
||||||
|
echo " -- eNB with USRP"
|
||||||
|
echo ""
|
||||||
|
echo "Usage:"
|
||||||
|
echo "------"
|
||||||
|
echo " buildOnVM.sh [OPTIONS]"
|
||||||
|
echo ""
|
||||||
|
echo "Options:"
|
||||||
|
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 " --workspace #### OR -ws ####"
|
||||||
|
echo " Specify the workspace."
|
||||||
|
echo ""
|
||||||
|
echo " --variant enb-usrp OR -v1"
|
||||||
|
echo " --variant basic-sim OR -v2"
|
||||||
|
echo " --variant phy-sim OR -v3"
|
||||||
|
echo " --variant cppcheck OR -v4"
|
||||||
|
echo " --variant enb-ethernet OR -v7"
|
||||||
|
echo " --variant ue-ethernet OR -v8"
|
||||||
|
echo " Specify the variant to build."
|
||||||
|
echo ""
|
||||||
|
echo " --keep-vm-alive OR -k"
|
||||||
|
echo " Keep the VM alive after the build."
|
||||||
|
echo ""
|
||||||
|
echo " --help OR -h"
|
||||||
|
echo " Print this help message."
|
||||||
|
echo ""
|
||||||
|
}
|
||||||
|
|
||||||
|
function variant_usage {
|
||||||
|
echo "OAI VM Build Check script"
|
||||||
|
echo " Original Author: Raphael Defosseux"
|
||||||
|
echo ""
|
||||||
|
echo " --variant enb-usrp OR -v1"
|
||||||
|
echo " --variant basic-sim OR -v2"
|
||||||
|
echo " --variant phy-sim OR -v3"
|
||||||
|
echo " --variant cppcheck OR -v4"
|
||||||
|
echo " --variant enb-ethernet OR -v7"
|
||||||
|
echo " --variant ue-ethernet OR -v8"
|
||||||
|
echo ""
|
||||||
|
}
|
||||||
|
|
||||||
|
if [ $# -lt 1 ] || [ $# -gt 9 ]
|
||||||
|
then
|
||||||
|
echo "Syntax Error: not the correct number of arguments"
|
||||||
|
echo ""
|
||||||
|
usage
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
VM_TEMPLATE=ci-
|
||||||
|
JOB_NAME=XX
|
||||||
|
BUILD_ID=XX
|
||||||
|
VM_NAME=ci-enb-usrp
|
||||||
|
VM_MEMORY=2048
|
||||||
|
ARCHIVES_LOC=enb_usrp
|
||||||
|
LOG_PATTERN=.Rel14.txt
|
||||||
|
NB_PATTERN_FILES=4
|
||||||
|
BUILD_OPTIONS="--eNB -w USRP"
|
||||||
|
KEEP_VM_ALIVE=0
|
||||||
|
|
||||||
|
while [[ $# -gt 0 ]]
|
||||||
|
do
|
||||||
|
key="$1"
|
||||||
|
|
||||||
|
case $key in
|
||||||
|
-h|--help)
|
||||||
|
shift
|
||||||
|
usage
|
||||||
|
exit 0
|
||||||
|
;;
|
||||||
|
-jn|--job-name)
|
||||||
|
JOB_NAME="$2"
|
||||||
|
shift
|
||||||
|
shift
|
||||||
|
;;
|
||||||
|
-id|--build-id)
|
||||||
|
BUILD_ID="$2"
|
||||||
|
shift
|
||||||
|
shift
|
||||||
|
;;
|
||||||
|
-ws|--workspace)
|
||||||
|
JENKINS_WKSP="$2"
|
||||||
|
shift
|
||||||
|
shift
|
||||||
|
;;
|
||||||
|
-k|--keep-vm-alive)
|
||||||
|
KEEP_VM_ALIVE=1
|
||||||
|
shift
|
||||||
|
;;
|
||||||
|
-v1)
|
||||||
|
VM_NAME=ci-enb-usrp
|
||||||
|
ARCHIVES_LOC=enb_usrp
|
||||||
|
LOG_PATTERN=.Rel14.txt
|
||||||
|
NB_PATTERN_FILES=4
|
||||||
|
BUILD_OPTIONS="--eNB -w USRP"
|
||||||
|
shift
|
||||||
|
;;
|
||||||
|
-v2)
|
||||||
|
VM_NAME=ci-basic-sim
|
||||||
|
ARCHIVES_LOC=basic_sim
|
||||||
|
LOG_PATTERN=basic_simulator
|
||||||
|
NB_PATTERN_FILES=2
|
||||||
|
BUILD_OPTIONS="--basic-simulator"
|
||||||
|
shift
|
||||||
|
;;
|
||||||
|
-v3)
|
||||||
|
VM_NAME=ci-phy-sim
|
||||||
|
ARCHIVES_LOC=phy_sim
|
||||||
|
LOG_PATTERN=.Rel14.txt
|
||||||
|
NB_PATTERN_FILES=3
|
||||||
|
BUILD_OPTIONS="--phy_simulators"
|
||||||
|
shift
|
||||||
|
;;
|
||||||
|
-v4)
|
||||||
|
VM_NAME=ci-cppcheck
|
||||||
|
VM_MEMORY=4096
|
||||||
|
ARCHIVES_LOC=cppcheck
|
||||||
|
LOG_PATTERN=cppcheck.xml
|
||||||
|
NB_PATTERN_FILES=1
|
||||||
|
BUILD_OPTIONS="--enable=warning --force --xml --xml-version=2"
|
||||||
|
shift
|
||||||
|
;;
|
||||||
|
-v7)
|
||||||
|
VM_NAME=ci-enb-ethernet
|
||||||
|
ARCHIVES_LOC=enb_eth
|
||||||
|
LOG_PATTERN=.Rel14.txt
|
||||||
|
NB_PATTERN_FILES=6
|
||||||
|
BUILD_OPTIONS="--eNB -t ETHERNET --noS1"
|
||||||
|
shift
|
||||||
|
;;
|
||||||
|
-v8)
|
||||||
|
VM_NAME=ci-ue-ethernet
|
||||||
|
ARCHIVES_LOC=ue_eth
|
||||||
|
LOG_PATTERN=.Rel14.txt
|
||||||
|
NB_PATTERN_FILES=6
|
||||||
|
BUILD_OPTIONS="--UE -t ETHERNET --noS1"
|
||||||
|
shift
|
||||||
|
;;
|
||||||
|
--variant)
|
||||||
|
variant="$2"
|
||||||
|
case $variant in
|
||||||
|
enb-usrp)
|
||||||
|
VM_NAME=ci-enb-usrp
|
||||||
|
ARCHIVES_LOC=enb_usrp
|
||||||
|
LOG_PATTERN=.Rel14.txt
|
||||||
|
NB_PATTERN_FILES=4
|
||||||
|
BUILD_OPTIONS="--eNB -w USRP"
|
||||||
|
;;
|
||||||
|
basic-sim)
|
||||||
|
VM_NAME=ci-basic-sim
|
||||||
|
ARCHIVES_LOC=basic_sim
|
||||||
|
LOG_PATTERN=basic_simulator
|
||||||
|
NB_PATTERN_FILES=2
|
||||||
|
BUILD_OPTIONS="--basic-simulator"
|
||||||
|
;;
|
||||||
|
phy-sim)
|
||||||
|
VM_NAME=ci-phy-sim
|
||||||
|
ARCHIVES_LOC=phy_sim
|
||||||
|
LOG_PATTERN=.Rel14.txt
|
||||||
|
NB_PATTERN_FILES=3
|
||||||
|
BUILD_OPTIONS="--phy_simulators"
|
||||||
|
;;
|
||||||
|
cppcheck)
|
||||||
|
VM_NAME=ci-cppcheck
|
||||||
|
VM_MEMORY=4096
|
||||||
|
ARCHIVES_LOC=cppcheck
|
||||||
|
LOG_PATTERN=cppcheck.xml
|
||||||
|
NB_PATTERN_FILES=1
|
||||||
|
BUILD_OPTIONS="--enable=warning --force --xml --xml-version=2"
|
||||||
|
;;
|
||||||
|
enb-ethernet)
|
||||||
|
VM_NAME=ci-enb-ethernet
|
||||||
|
ARCHIVES_LOC=enb_eth
|
||||||
|
LOG_PATTERN=.Rel14.txt
|
||||||
|
NB_PATTERN_FILES=6
|
||||||
|
BUILD_OPTIONS="--eNB -t ETHERNET --noS1"
|
||||||
|
;;
|
||||||
|
ue-ethernet)
|
||||||
|
VM_NAME=ci-ue-ethernet
|
||||||
|
ARCHIVES_LOC=ue_eth
|
||||||
|
LOG_PATTERN=.Rel14.txt
|
||||||
|
NB_PATTERN_FILES=6
|
||||||
|
BUILD_OPTIONS="--UE -t ETHERNET --noS1"
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
echo ""
|
||||||
|
echo "Syntax Error: Invalid Variant option -> $variant"
|
||||||
|
echo ""
|
||||||
|
variant_usage
|
||||||
|
exit 1
|
||||||
|
esac
|
||||||
|
shift
|
||||||
|
shift
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
echo "Syntax Error: unknown option: $key"
|
||||||
|
echo ""
|
||||||
|
usage
|
||||||
|
exit 1
|
||||||
|
esac
|
||||||
|
done
|
||||||
|
|
||||||
|
if [ ! -f $JENKINS_WKSP/localZip.zip ]
|
||||||
|
then
|
||||||
|
echo "Missing localZip.zip file!"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
if [ ! -f /etc/apt/apt.conf.d/01proxy ]
|
||||||
|
then
|
||||||
|
echo "Missing /etc/apt/apt.conf.d/01proxy file!"
|
||||||
|
echo "Is apt-cacher installed and configured?"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ "$JOB_NAME" == "XX" ] || [ "$BUILD_ID" == "XX" ]
|
||||||
|
then
|
||||||
|
VM_TEMPLATE=ci-
|
||||||
|
else
|
||||||
|
VM_TEMPLATE=${JOB_NAME}-b${BUILD_ID}-
|
||||||
|
fi
|
||||||
|
|
||||||
|
VM_NAME=`echo $VM_NAME | sed -e "s#ci-#$VM_TEMPLATE#"`
|
||||||
|
VM_CMDS=${VM_NAME}_cmds.txt
|
||||||
|
ARCHIVES_LOC=${JENKINS_WKSP}/archives/${ARCHIVES_LOC}
|
||||||
|
|
||||||
|
echo "VM_NAME = $VM_NAME"
|
||||||
|
echo "VM_CMD_FILE = $VM_CMDS"
|
||||||
|
echo "JENKINS_WKSP = $JENKINS_WKSP"
|
||||||
|
echo "ARCHIVES_LOC = $ARCHIVES_LOC"
|
||||||
|
echo "BUILD_OPTIONS = $BUILD_OPTIONS"
|
||||||
|
|
||||||
|
IS_VM_ALIVE=`uvt-kvm list | grep -c $VM_NAME`
|
||||||
|
|
||||||
|
if [ $IS_VM_ALIVE -eq 0 ]
|
||||||
|
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
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo "Waiting for VM to be started"
|
||||||
|
uvt-kvm wait $VM_NAME --insecure
|
||||||
|
|
||||||
|
VM_IP_ADDR=`uvt-kvm ip $VM_NAME`
|
||||||
|
echo "$VM_NAME has for IP addr = $VM_IP_ADDR"
|
||||||
|
|
||||||
|
echo "############################################################"
|
||||||
|
echo "Copying GIT repo into VM ($VM_NAME)"
|
||||||
|
echo "############################################################"
|
||||||
|
scp -o StrictHostKeyChecking=no localZip.zip ubuntu@$VM_IP_ADDR:/home/ubuntu
|
||||||
|
scp -o StrictHostKeyChecking=no /etc/apt/apt.conf.d/01proxy ubuntu@$VM_IP_ADDR:/home/ubuntu
|
||||||
|
|
||||||
|
echo "############################################################"
|
||||||
|
echo "Running install and build script on VM ($VM_NAME)"
|
||||||
|
echo "############################################################"
|
||||||
|
echo "sudo cp 01proxy /etc/apt/apt.conf.d/" > $VM_CMDS
|
||||||
|
if [[ "$VM_NAME" == *"-cppcheck"* ]]
|
||||||
|
then
|
||||||
|
echo "echo \"sudo apt-get --yes --quiet install zip cppcheck \"" >> $VM_CMDS
|
||||||
|
echo "sudo apt-get update > zip-install.txt 2>&1" >> $VM_CMDS
|
||||||
|
echo "sudo apt-get --yes install zip cppcheck >> zip-install.txt 2>&1" >> $VM_CMDS
|
||||||
|
else
|
||||||
|
echo "echo \"sudo apt-get --yes --quiet install zip subversion libboost-dev \"" >> $VM_CMDS
|
||||||
|
echo "sudo apt-get update > zip-install.txt 2>&1" >> $VM_CMDS
|
||||||
|
echo "sudo apt-get --yes install zip subversion libboost-dev >> zip-install.txt 2>&1" >> $VM_CMDS
|
||||||
|
fi
|
||||||
|
echo "mkdir tmp" >> $VM_CMDS
|
||||||
|
echo "cd tmp" >> $VM_CMDS
|
||||||
|
echo "echo \"unzip -qq -DD ../localZip.zip\"" >> $VM_CMDS
|
||||||
|
echo "unzip -qq -DD ../localZip.zip" >> $VM_CMDS
|
||||||
|
if [[ "$VM_NAME" == *"-cppcheck"* ]]
|
||||||
|
then
|
||||||
|
echo "mkdir cmake_targets/log" >> $VM_CMDS
|
||||||
|
echo "cp /home/ubuntu/zip-install.txt cmake_targets/log" >> $VM_CMDS
|
||||||
|
echo "echo \"cppcheck $BUILD_OPTIONS . \"" >> $VM_CMDS
|
||||||
|
echo "cppcheck $BUILD_OPTIONS . 2> cmake_targets/log/cppcheck.xml 1> cmake_targets/log/cppcheck_build.txt" >> $VM_CMDS
|
||||||
|
else
|
||||||
|
echo "echo \"source oaienv\"" >> $VM_CMDS
|
||||||
|
echo "source oaienv" >> $VM_CMDS
|
||||||
|
echo "cd cmake_targets/" >> $VM_CMDS
|
||||||
|
echo "mkdir log" >> $VM_CMDS
|
||||||
|
echo "cp /home/ubuntu/zip-install.txt log" >> $VM_CMDS
|
||||||
|
echo "echo \"./build_oai -I $BUILD_OPTIONS \"" >> $VM_CMDS
|
||||||
|
echo "./build_oai -I $BUILD_OPTIONS > log/install-build.txt 2>&1" >> $VM_CMDS
|
||||||
|
fi
|
||||||
|
ssh -o StrictHostKeyChecking=no ubuntu@$VM_IP_ADDR < $VM_CMDS
|
||||||
|
|
||||||
|
echo "############################################################"
|
||||||
|
echo "Creating a tmp folder to store results and artifacts"
|
||||||
|
echo "############################################################"
|
||||||
|
if [ ! -d $JENKINS_WKSP/archives ]
|
||||||
|
then
|
||||||
|
mkdir $JENKINS_WKSP/archives
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ ! -d $ARCHIVES_LOC ]
|
||||||
|
then
|
||||||
|
mkdir $ARCHIVES_LOC
|
||||||
|
fi
|
||||||
|
|
||||||
|
scp -o StrictHostKeyChecking=no ubuntu@$VM_IP_ADDR:/home/ubuntu/tmp/cmake_targets/log/*.txt $ARCHIVES_LOC
|
||||||
|
if [[ "$VM_NAME" == *"-cppcheck"* ]]
|
||||||
|
then
|
||||||
|
scp -o StrictHostKeyChecking=no ubuntu@$VM_IP_ADDR:/home/ubuntu/tmp/cmake_targets/log/*.xml $ARCHIVES_LOC
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ $KEEP_VM_ALIVE -eq 0 ]
|
||||||
|
then
|
||||||
|
echo "############################################################"
|
||||||
|
echo "Destroying VM"
|
||||||
|
echo "############################################################"
|
||||||
|
uvt-kvm destroy $VM_NAME
|
||||||
|
ssh-keygen -R $VM_IP_ADDR
|
||||||
|
fi
|
||||||
|
rm -f $VM_CMDS
|
||||||
|
|
||||||
|
echo "############################################################"
|
||||||
|
echo "Checking build status"
|
||||||
|
echo "############################################################"
|
||||||
|
|
||||||
|
LOG_FILES=`ls $ARCHIVES_LOC/*.txt $ARCHIVES_LOC/*.xml`
|
||||||
|
STATUS=0
|
||||||
|
NB_FOUND_FILES=0
|
||||||
|
|
||||||
|
for FULLFILE in $LOG_FILES
|
||||||
|
do
|
||||||
|
if [[ $FULLFILE == *"$LOG_PATTERN"* ]]
|
||||||
|
then
|
||||||
|
filename=$(basename -- "$FULLFILE")
|
||||||
|
if [ "$LOG_PATTERN" == ".Rel14.txt" ]
|
||||||
|
then
|
||||||
|
PASS_PATTERN=`echo $filename | sed -e "s#$LOG_PATTERN##"`
|
||||||
|
fi
|
||||||
|
if [ "$LOG_PATTERN" == "basic_simulator" ]
|
||||||
|
then
|
||||||
|
PASS_PATTERN="lte-"
|
||||||
|
fi
|
||||||
|
if [ "$LOG_PATTERN" == "cppcheck.xml" ]
|
||||||
|
then
|
||||||
|
PASS_PATTERN="results version"
|
||||||
|
LOCAL_STAT=`egrep -c "$PASS_PATTERN" $FULLFILE`
|
||||||
|
else
|
||||||
|
LOCAL_STAT=`egrep -c "Built target $PASS_PATTERN" $FULLFILE`
|
||||||
|
fi
|
||||||
|
if [ $LOCAL_STAT -eq 0 ]; then STATUS=-1; fi
|
||||||
|
NB_FOUND_FILES=$((NB_FOUND_FILES + 1))
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
|
||||||
|
if [ $NB_PATTERN_FILES -ne $NB_FOUND_FILES ]; then STATUS=-1; fi
|
||||||
|
|
||||||
|
if [ $STATUS -eq 0 ]
|
||||||
|
then
|
||||||
|
echo "STATUS seems OK"
|
||||||
|
else
|
||||||
|
echo "STATUS failed?"
|
||||||
|
fi
|
||||||
|
exit $STATUS
|
||||||
Executable
+144
@@ -0,0 +1,144 @@
|
|||||||
|
#!/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 Warning Check script"
|
||||||
|
echo " Original Author: Raphael Defosseux"
|
||||||
|
echo ""
|
||||||
|
echo "Usage:"
|
||||||
|
echo "------"
|
||||||
|
echo " checkAddedWarnings.sh [OPTIONS]"
|
||||||
|
echo ""
|
||||||
|
echo "Options:"
|
||||||
|
echo "--------"
|
||||||
|
echo " --src-branch #### OR -sb ####"
|
||||||
|
echo " Specify the source branch of the merge request."
|
||||||
|
echo ""
|
||||||
|
echo " --target-branch #### OR -tb ####"
|
||||||
|
echo " Specify the target branch of the merge request (usually develop)."
|
||||||
|
echo ""
|
||||||
|
echo " --help OR -h"
|
||||||
|
echo " Print this help message."
|
||||||
|
echo ""
|
||||||
|
}
|
||||||
|
|
||||||
|
if [ $# -ne 4 ] && [ $# -ne 1 ]
|
||||||
|
then
|
||||||
|
echo "Syntax Error: not the correct number of arguments"
|
||||||
|
echo ""
|
||||||
|
usage
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
checker=0
|
||||||
|
while [[ $# -gt 0 ]]
|
||||||
|
do
|
||||||
|
key="$1"
|
||||||
|
|
||||||
|
case $key in
|
||||||
|
-h|--help)
|
||||||
|
shift
|
||||||
|
usage
|
||||||
|
exit 0
|
||||||
|
;;
|
||||||
|
-sb|--src-branch)
|
||||||
|
SOURCE_BRANCH="$2"
|
||||||
|
let "checker|=0x1"
|
||||||
|
shift
|
||||||
|
shift
|
||||||
|
;;
|
||||||
|
-tb|--target-branch)
|
||||||
|
TARGET_BRANCH="$2"
|
||||||
|
let "checker|=0x2"
|
||||||
|
shift
|
||||||
|
shift
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
echo "Syntax Error: unknown option: $key"
|
||||||
|
echo ""
|
||||||
|
usage
|
||||||
|
exit 1
|
||||||
|
esac
|
||||||
|
|
||||||
|
done
|
||||||
|
|
||||||
|
|
||||||
|
if [ $checker -ne 3 ]
|
||||||
|
then
|
||||||
|
echo "Source Branch is : $SOURCE_BRANCH"
|
||||||
|
echo "Target Branch is : $TARGET_BRANCH"
|
||||||
|
echo ""
|
||||||
|
echo "Syntax Error: missing option"
|
||||||
|
echo ""
|
||||||
|
usage
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Merge request scenario
|
||||||
|
|
||||||
|
MERGE_COMMMIT=`git log -n1 | grep commit | sed -e "s@commit @@"`
|
||||||
|
TARGET_INIT_COMMIT=`cat .git/refs/remotes/origin/$TARGET_BRANCH`
|
||||||
|
|
||||||
|
echo " ---- Checking the modified files by the merge request ----"
|
||||||
|
echo ""
|
||||||
|
echo "Source Branch is : $SOURCE_BRANCH"
|
||||||
|
echo "Target Branch is : $TARGET_BRANCH"
|
||||||
|
echo "Merged Commit is : $MERGE_COMMMIT"
|
||||||
|
echo "Target Init is : $TARGET_INIT_COMMIT"
|
||||||
|
|
||||||
|
# Retrieve the list of modified files since the latest develop commit
|
||||||
|
MODIFIED_FILES=`git log $TARGET_INIT_COMMIT..$MERGE_COMMMIT --oneline --name-status | egrep "^M|^A" | sed -e "s@^M\t*@@" -e "s@^A\t*@@" | sort | uniq`
|
||||||
|
NB_WARNINGS_FILES=0
|
||||||
|
|
||||||
|
# Retrieve list of warnings
|
||||||
|
LIST_WARNING_FILES=`egrep "error:|warning:" archives/*/*.Rel14.txt archives/*/basic_simulator_*txt | egrep -v "jobserver unavailable|Clock skew detected.|flexran.proto" | sed -e "s#^.*/home/ubuntu/tmp/##" -e "s#^.*/tmp/CI-eNB/##" -e "s#common/utils/.*/itti#common/utils/itti#" | awk -F ":" '{print $1}' | sort | uniq`
|
||||||
|
|
||||||
|
echo ""
|
||||||
|
echo "List of files that have been modified by the Merge Request AND"
|
||||||
|
echo " that have compilation warnings/errors"
|
||||||
|
echo "--------------------------------------------------------------------"
|
||||||
|
declare -a ARRAYNAME
|
||||||
|
|
||||||
|
for FULLFILE in $MODIFIED_FILES
|
||||||
|
do
|
||||||
|
filename=$(basename -- "$FULLFILE")
|
||||||
|
EXT="${filename##*.}"
|
||||||
|
if [ $EXT = "c" ] || [ $EXT = "h" ] || [ $EXT = "cpp" ] || [ $EXT = "hpp" ]
|
||||||
|
then
|
||||||
|
for WARNING_FILE in $LIST_WARNING_FILES
|
||||||
|
do
|
||||||
|
if [ $FULLFILE = $WARNING_FILE ]
|
||||||
|
then
|
||||||
|
echo $WARNING_FILE
|
||||||
|
ARRAYNAME[$NB_WARNINGS_FILES]=$WARNING_FILE
|
||||||
|
NB_WARNINGS_FILES=$((NB_WARNINGS_FILES + 1))
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
|
||||||
|
echo ""
|
||||||
|
echo "NB Files impacted by warnings/errors in Merge Request: $NB_WARNINGS_FILES"
|
||||||
|
echo $NB_WARNINGS_FILES > oai_warning_files.txt
|
||||||
|
echo ${ARRAYNAME[*]} > oai_warning_files_list.txt
|
||||||
|
|
||||||
|
exit 0
|
||||||
Executable
+141
@@ -0,0 +1,141 @@
|
|||||||
|
#!/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 Coding / Formatting Guideline Check script"
|
||||||
|
echo " Original Author: Raphael Defosseux"
|
||||||
|
echo ""
|
||||||
|
echo " Requirement: astyle shall be installed"
|
||||||
|
echo ""
|
||||||
|
echo " By default (no options) the complete repository will be checked"
|
||||||
|
echo " In case of merge request, provided source and target branch,"
|
||||||
|
echo " the script will check only the modified files"
|
||||||
|
echo ""
|
||||||
|
echo "Usage:"
|
||||||
|
echo "------"
|
||||||
|
echo " checkCodingFormattingRules.sh [OPTIONS]"
|
||||||
|
echo ""
|
||||||
|
echo "Options:"
|
||||||
|
echo "--------"
|
||||||
|
echo " --src-branch #### OR -sb ####"
|
||||||
|
echo " Specify the source branch of the merge request."
|
||||||
|
echo ""
|
||||||
|
echo " --target-branch #### OR -tb ####"
|
||||||
|
echo " Specify the target branch of the merge request (usually develop)."
|
||||||
|
echo ""
|
||||||
|
echo " --help OR -h"
|
||||||
|
echo " Print this help message."
|
||||||
|
echo ""
|
||||||
|
}
|
||||||
|
|
||||||
|
if [ $# -ne 4 ] && [ $# -ne 1 ] && [ $# -ne 0 ]
|
||||||
|
then
|
||||||
|
echo "Syntax Error: not the correct number of arguments"
|
||||||
|
echo ""
|
||||||
|
usage
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ $# -eq 0 ]
|
||||||
|
then
|
||||||
|
echo " ---- Checking the whole repository ----"
|
||||||
|
echo ""
|
||||||
|
NB_FILES_TO_FORMAT=`astyle --dry-run --options=ci-scripts/astyle-options.txt --recursive *.c *.h | grep -c Formatted `
|
||||||
|
echo "Nb Files that do NOT follow OAI rules: $NB_FILES_TO_FORMAT"
|
||||||
|
echo $NB_FILES_TO_FORMAT > ./oai_rules_result.txt
|
||||||
|
exit 0
|
||||||
|
fi
|
||||||
|
|
||||||
|
checker=0
|
||||||
|
while [[ $# -gt 0 ]]
|
||||||
|
do
|
||||||
|
key="$1"
|
||||||
|
|
||||||
|
case $key in
|
||||||
|
-h|--help)
|
||||||
|
shift
|
||||||
|
usage
|
||||||
|
exit 0
|
||||||
|
;;
|
||||||
|
-sb|--src-branch)
|
||||||
|
SOURCE_BRANCH="$2"
|
||||||
|
let "checker|=0x1"
|
||||||
|
shift
|
||||||
|
shift
|
||||||
|
;;
|
||||||
|
-tb|--target-branch)
|
||||||
|
TARGET_BRANCH="$2"
|
||||||
|
let "checker|=0x2"
|
||||||
|
shift
|
||||||
|
shift
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
echo "Syntax Error: unknown option: $key"
|
||||||
|
echo ""
|
||||||
|
usage
|
||||||
|
exit 1
|
||||||
|
esac
|
||||||
|
|
||||||
|
done
|
||||||
|
|
||||||
|
|
||||||
|
if [ $checker -ne 3 ]
|
||||||
|
then
|
||||||
|
echo "Source Branch is : $SOURCE_BRANCH"
|
||||||
|
echo "Target Branch is : $TARGET_BRANCH"
|
||||||
|
echo ""
|
||||||
|
echo "Syntax Error: missing option"
|
||||||
|
echo ""
|
||||||
|
usage
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Merge request scenario
|
||||||
|
|
||||||
|
MERGE_COMMMIT=`git log -n1 | grep commit | sed -e "s@commit @@"`
|
||||||
|
TARGET_INIT_COMMIT=`cat .git/refs/remotes/origin/$TARGET_BRANCH`
|
||||||
|
|
||||||
|
echo " ---- Checking the modified files by the merge request ----"
|
||||||
|
echo ""
|
||||||
|
echo "Source Branch is : $SOURCE_BRANCH"
|
||||||
|
echo "Target Branch is : $TARGET_BRANCH"
|
||||||
|
echo "Merged Commit is : $MERGE_COMMMIT"
|
||||||
|
echo "Target Init is : $TARGET_INIT_COMMIT"
|
||||||
|
|
||||||
|
# Retrieve the list of modified files since the latest develop commit
|
||||||
|
MODIFIED_FILES=`git log $TARGET_INIT_COMMIT..$MERGE_COMMMIT --oneline --name-status | egrep "^M|^A" | sed -e "s@^M\t*@@" -e "s@^A\t*@@" | sort | uniq`
|
||||||
|
NB_TO_FORMAT=0
|
||||||
|
for FULLFILE in $MODIFIED_FILES
|
||||||
|
do
|
||||||
|
echo $FULLFILE
|
||||||
|
filename=$(basename -- "$FULLFILE")
|
||||||
|
EXT="${filename##*.}"
|
||||||
|
if [ $EXT = "c" ] || [ $EXT = "h" ] || [ $EXT = "cpp" ] || [ $EXT = "hpp" ]
|
||||||
|
then
|
||||||
|
TO_FORMAT=`astyle --dry-run --options=ci-scripts/astyle-options.txt $FULLFILE | grep -c Formatted `
|
||||||
|
NB_TO_FORMAT=$((NB_TO_FORMAT + TO_FORMAT))
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
echo "Nb Files that do NOT follow OAI rules: $NB_TO_FORMAT"
|
||||||
|
echo $NB_TO_FORMAT > ./oai_rules_result.txt
|
||||||
|
|
||||||
|
exit 0
|
||||||
@@ -0,0 +1,256 @@
|
|||||||
|
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";
|
||||||
|
|
||||||
|
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 = 2685000000L;
|
||||||
|
uplink_frequency_offset = -120000000;
|
||||||
|
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;
|
||||||
|
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 = -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 = -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 = "192.168.12.26";
|
||||||
|
ipv6 = "192:168:30::17";
|
||||||
|
active = "yes";
|
||||||
|
preference = "ipv4";
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
NETWORK_INTERFACES :
|
||||||
|
{
|
||||||
|
|
||||||
|
ENB_INTERFACE_NAME_FOR_S1_MME = "eth0";
|
||||||
|
ENB_IPV4_ADDRESS_FOR_S1_MME = "192.168.12.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
|
||||||
|
};
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
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 = 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";
|
||||||
|
};
|
||||||
|
|
||||||
|
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";
|
||||||
|
};
|
||||||
|
|
||||||
@@ -0,0 +1,256 @@
|
|||||||
|
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";
|
||||||
|
|
||||||
|
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 = 2685000000L;
|
||||||
|
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 = -25;
|
||||||
|
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 = "192.168.12.26";
|
||||||
|
ipv6 = "192:168:30::17";
|
||||||
|
active = "yes";
|
||||||
|
preference = "ipv4";
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
NETWORK_INTERFACES :
|
||||||
|
{
|
||||||
|
|
||||||
|
ENB_INTERFACE_NAME_FOR_S1_MME = "eth0";
|
||||||
|
ENB_IPV4_ADDRESS_FOR_S1_MME = "192.168.12.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
|
||||||
|
};
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
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 = 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";
|
||||||
|
};
|
||||||
|
|
||||||
|
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";
|
||||||
|
};
|
||||||
|
|
||||||
@@ -0,0 +1,256 @@
|
|||||||
|
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";
|
||||||
|
|
||||||
|
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 = 2685000000L;
|
||||||
|
uplink_frequency_offset = -120000000;
|
||||||
|
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;
|
||||||
|
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 = "192.168.12.26";
|
||||||
|
ipv6 = "192:168:30::17";
|
||||||
|
active = "yes";
|
||||||
|
preference = "ipv4";
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
NETWORK_INTERFACES :
|
||||||
|
{
|
||||||
|
|
||||||
|
ENB_INTERFACE_NAME_FOR_S1_MME = "eth0";
|
||||||
|
ENB_IPV4_ADDRESS_FOR_S1_MME = "192.168.12.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
|
||||||
|
};
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
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 = 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";
|
||||||
|
};
|
||||||
|
|
||||||
|
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";
|
||||||
|
};
|
||||||
|
|
||||||
Executable
+191
@@ -0,0 +1,191 @@
|
|||||||
|
#!/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 VM Creation script"
|
||||||
|
echo " Original Author: Raphael Defosseux"
|
||||||
|
echo " Requirements:"
|
||||||
|
echo " -- uvtool uvtool-libvirt apt-cacher"
|
||||||
|
echo " -- xenial image already synced"
|
||||||
|
echo " Default:"
|
||||||
|
echo " -- eNB with USRP"
|
||||||
|
echo ""
|
||||||
|
echo "Usage:"
|
||||||
|
echo "------"
|
||||||
|
echo " createVM.sh [OPTIONS]"
|
||||||
|
echo ""
|
||||||
|
echo "Options:"
|
||||||
|
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 " --variant enb-usrp OR -v1"
|
||||||
|
echo " --variant basic-sim OR -v2"
|
||||||
|
echo " --variant phy-sim OR -v3"
|
||||||
|
echo " --variant cppcheck OR -v4"
|
||||||
|
echo " --variant enb-ethernet OR -v7"
|
||||||
|
echo " --variant ue-ethernet OR -v8"
|
||||||
|
echo " Specify the variant to build."
|
||||||
|
echo ""
|
||||||
|
echo " --help OR -h"
|
||||||
|
echo " Print this help message."
|
||||||
|
echo ""
|
||||||
|
}
|
||||||
|
|
||||||
|
function variant_usage {
|
||||||
|
echo "OAI VM Build Check script"
|
||||||
|
echo " Original Author: Raphael Defosseux"
|
||||||
|
echo ""
|
||||||
|
echo " --variant enb-usrp OR -v1"
|
||||||
|
echo " --variant basic-sim OR -v2"
|
||||||
|
echo " --variant phy-sim OR -v3"
|
||||||
|
echo " --variant cppcheck OR -v4"
|
||||||
|
echo " --variant enb-ethernet OR -v7"
|
||||||
|
echo " --variant ue-ethernet OR -v8"
|
||||||
|
echo ""
|
||||||
|
}
|
||||||
|
|
||||||
|
if [ $# -lt 1 ] || [ $# -gt 6 ]
|
||||||
|
then
|
||||||
|
echo "Syntax Error: not the correct number of arguments"
|
||||||
|
echo ""
|
||||||
|
usage
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
VM_TEMPLATE=ci-
|
||||||
|
JOB_NAME=XX
|
||||||
|
BUILD_ID=XX
|
||||||
|
VM_NAME=ci-enb-usrp
|
||||||
|
VM_MEMORY=2048
|
||||||
|
|
||||||
|
while [[ $# -gt 0 ]]
|
||||||
|
do
|
||||||
|
key="$1"
|
||||||
|
|
||||||
|
case $key in
|
||||||
|
-h|--help)
|
||||||
|
shift
|
||||||
|
usage
|
||||||
|
exit 0
|
||||||
|
;;
|
||||||
|
-jn|--job-name)
|
||||||
|
JOB_NAME="$2"
|
||||||
|
shift
|
||||||
|
shift
|
||||||
|
;;
|
||||||
|
-id|--build-id)
|
||||||
|
BUILD_ID="$2"
|
||||||
|
shift
|
||||||
|
shift
|
||||||
|
;;
|
||||||
|
-v1)
|
||||||
|
VM_NAME=ci-enb-usrp
|
||||||
|
shift
|
||||||
|
;;
|
||||||
|
-v2)
|
||||||
|
VM_NAME=ci-basic-sim
|
||||||
|
shift
|
||||||
|
;;
|
||||||
|
-v3)
|
||||||
|
VM_NAME=ci-phy-sim
|
||||||
|
shift
|
||||||
|
;;
|
||||||
|
-v4)
|
||||||
|
VM_NAME=ci-cppcheck
|
||||||
|
VM_MEMORY=4096
|
||||||
|
shift
|
||||||
|
;;
|
||||||
|
-v7)
|
||||||
|
VM_NAME=ci-enb-ethernet
|
||||||
|
shift
|
||||||
|
;;
|
||||||
|
-v8)
|
||||||
|
VM_NAME=ci-ue-ethernet
|
||||||
|
shift
|
||||||
|
;;
|
||||||
|
--variant)
|
||||||
|
variant="$2"
|
||||||
|
case $variant in
|
||||||
|
enb-usrp)
|
||||||
|
VM_NAME=ci-enb-usrp
|
||||||
|
;;
|
||||||
|
basic-sim)
|
||||||
|
VM_NAME=ci-basic-sim
|
||||||
|
;;
|
||||||
|
phy-sim)
|
||||||
|
VM_NAME=ci-phy-sim
|
||||||
|
;;
|
||||||
|
cppcheck)
|
||||||
|
VM_NAME=ci-cppcheck
|
||||||
|
VM_MEMORY=4096
|
||||||
|
;;
|
||||||
|
enb-ethernet)
|
||||||
|
VM_NAME=ci-enb-ethernet
|
||||||
|
;;
|
||||||
|
ue-ethernet)
|
||||||
|
VM_NAME=ci-ue-ethernet
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
echo ""
|
||||||
|
echo "Syntax Error: Invalid Variant option -> $variant"
|
||||||
|
echo ""
|
||||||
|
variant_usage
|
||||||
|
exit 1
|
||||||
|
esac
|
||||||
|
shift
|
||||||
|
shift
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
echo "Syntax Error: unknown option: $key"
|
||||||
|
echo ""
|
||||||
|
usage
|
||||||
|
exit 1
|
||||||
|
esac
|
||||||
|
done
|
||||||
|
|
||||||
|
if [ "$JOB_NAME" == "XX" ] || [ "$BUILD_ID" == "XX" ]
|
||||||
|
then
|
||||||
|
VM_TEMPLATE=ci-
|
||||||
|
else
|
||||||
|
VM_TEMPLATE=${JOB_NAME}-b${BUILD_ID}-
|
||||||
|
fi
|
||||||
|
|
||||||
|
VM_NAME=`echo $VM_NAME | sed -e "s#ci-#$VM_TEMPLATE#"`
|
||||||
|
VM_CMDS=${VM_NAME}_cmds.txt
|
||||||
|
|
||||||
|
echo "VM_NAME = $VM_NAME"
|
||||||
|
echo "VM_MEMORY = $VM_MEMORY MBytes"
|
||||||
|
|
||||||
|
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
|
||||||
|
echo "Waiting for VM to be started"
|
||||||
|
uvt-kvm wait $VM_NAME --insecure
|
||||||
|
|
||||||
|
VM_IP_ADDR=`uvt-kvm ip $VM_NAME`
|
||||||
|
echo "$VM_NAME has for IP addr = $VM_IP_ADDR"
|
||||||
|
exit 0
|
||||||
Executable
+101
@@ -0,0 +1,101 @@
|
|||||||
|
#!/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 VM Destroy script"
|
||||||
|
echo " Original Author: Raphael Defosseux"
|
||||||
|
echo ""
|
||||||
|
echo "Usage:"
|
||||||
|
echo "------"
|
||||||
|
echo " destroyAllRunningVM.sh [OPTIONS]"
|
||||||
|
echo ""
|
||||||
|
echo "Options:"
|
||||||
|
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 " --help OR -h"
|
||||||
|
echo " Print this help message."
|
||||||
|
echo ""
|
||||||
|
}
|
||||||
|
|
||||||
|
if [ $# -gt 4 ]
|
||||||
|
then
|
||||||
|
echo "Syntax Error: not the correct number of arguments"
|
||||||
|
echo ""
|
||||||
|
usage
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
VM_TEMPLATE=ci-
|
||||||
|
JOB_NAME=XX
|
||||||
|
BUILD_ID=XX
|
||||||
|
|
||||||
|
while [[ $# -gt 0 ]]
|
||||||
|
do
|
||||||
|
key="$1"
|
||||||
|
case $key in
|
||||||
|
-h|--help)
|
||||||
|
shift
|
||||||
|
usage
|
||||||
|
exit 0
|
||||||
|
;;
|
||||||
|
-jn|--job-name)
|
||||||
|
JOB_NAME="$2"
|
||||||
|
shift
|
||||||
|
shift
|
||||||
|
;;
|
||||||
|
-id|--build-id)
|
||||||
|
BUILD_ID="$2"
|
||||||
|
shift
|
||||||
|
shift
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
echo "Syntax Error: unknown option: $key"
|
||||||
|
echo ""
|
||||||
|
usage
|
||||||
|
exit 1
|
||||||
|
esac
|
||||||
|
done
|
||||||
|
|
||||||
|
if [ "$JOB_NAME" == "XX" ] || [ "$BUILD_ID" == "XX" ]
|
||||||
|
then
|
||||||
|
VM_TEMPLATE=ci-
|
||||||
|
else
|
||||||
|
VM_TEMPLATE=${JOB_NAME}-b${BUILD_ID}-
|
||||||
|
fi
|
||||||
|
|
||||||
|
LIST_CI_VM=`uvt-kvm list | grep $VM_TEMPLATE`
|
||||||
|
|
||||||
|
for CI_VM in $LIST_CI_VM
|
||||||
|
do
|
||||||
|
VM_IP_ADDR=`uvt-kvm ip $CI_VM`
|
||||||
|
echo "VM to destroy: $CI_VM -- IP $VM_IP_ADDR"
|
||||||
|
uvt-kvm destroy $CI_VM
|
||||||
|
ssh-keygen -R $VM_IP_ADDR
|
||||||
|
done
|
||||||
|
|
||||||
|
exit 0
|
||||||
|
|
||||||
Executable
+113
@@ -0,0 +1,113 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
function usage {
|
||||||
|
echo "OAI GitLab merge request applying script"
|
||||||
|
echo " Original Author: Raphael Defosseux"
|
||||||
|
echo ""
|
||||||
|
echo "Usage:"
|
||||||
|
echo "------"
|
||||||
|
echo ""
|
||||||
|
echo " doGitLabMerge.sh [OPTIONS] [MANDATORY_OPTIONS]"
|
||||||
|
echo ""
|
||||||
|
echo "Mandatory 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 "Options:"
|
||||||
|
echo "--------"
|
||||||
|
echo " --help OR -h"
|
||||||
|
echo " Print this help message."
|
||||||
|
echo ""
|
||||||
|
}
|
||||||
|
|
||||||
|
if [ $# -ne 8 ] && [ $# -ne 1 ]
|
||||||
|
then
|
||||||
|
echo "Syntax Error: not the correct number of arguments"
|
||||||
|
echo ""
|
||||||
|
usage
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
checker=0
|
||||||
|
while [[ $# -gt 0 ]]
|
||||||
|
do
|
||||||
|
key="$1"
|
||||||
|
|
||||||
|
case $key in
|
||||||
|
-h|--help)
|
||||||
|
shift
|
||||||
|
usage
|
||||||
|
exit 0
|
||||||
|
;;
|
||||||
|
-sb|--src-branch)
|
||||||
|
SOURCE_BRANCH="$2"
|
||||||
|
let "checker|=0x1"
|
||||||
|
shift
|
||||||
|
shift
|
||||||
|
;;
|
||||||
|
-sc|--src-commit)
|
||||||
|
SOURCE_COMMIT_ID="$2"
|
||||||
|
let "checker|=0x2"
|
||||||
|
shift
|
||||||
|
shift
|
||||||
|
;;
|
||||||
|
-tb|--target-branch)
|
||||||
|
TARGET_BRANCH="$2"
|
||||||
|
let "checker|=0x4"
|
||||||
|
shift
|
||||||
|
shift
|
||||||
|
;;
|
||||||
|
-tc|--target-commit)
|
||||||
|
TARGET_COMMIT_ID="$2"
|
||||||
|
let "checker|=0x8"
|
||||||
|
shift
|
||||||
|
shift
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
echo "Syntax Error: unknown option: $key"
|
||||||
|
echo ""
|
||||||
|
usage
|
||||||
|
exit 1
|
||||||
|
esac
|
||||||
|
|
||||||
|
done
|
||||||
|
|
||||||
|
echo "Source Branch is : $SOURCE_BRANCH"
|
||||||
|
echo "Source Commit ID is : $SOURCE_COMMIT_ID"
|
||||||
|
echo "Target Branch is : $TARGET_BRANCH"
|
||||||
|
echo "Target Commit ID is : $TARGET_COMMIT_ID"
|
||||||
|
|
||||||
|
if [ $checker -ne 15 ]
|
||||||
|
then
|
||||||
|
echo ""
|
||||||
|
echo "Syntax Error: missing option"
|
||||||
|
echo ""
|
||||||
|
usage
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
git config user.email "jenkins@openairinterface.org"
|
||||||
|
git config user.name "OAI Jenkins"
|
||||||
|
|
||||||
|
git checkout -f $SOURCE_COMMIT_ID
|
||||||
|
|
||||||
|
git merge --ff $TARGET_COMMIT_ID -m "Temporary merge for CI"
|
||||||
|
|
||||||
|
STATUS=`git status | egrep -c "You have unmerged paths.|fix conflicts"`
|
||||||
|
if [ $STATUS -ne 0 ]
|
||||||
|
then
|
||||||
|
echo "There are merge conflicts.. Cannot perform further build tasks"
|
||||||
|
STATUS=-1
|
||||||
|
fi
|
||||||
|
exit $STATUS
|
||||||
Executable
+23
@@ -0,0 +1,23 @@
|
|||||||
|
#!/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
|
||||||
|
# */
|
||||||
|
|
||||||
|
exit -1
|
||||||
+1433
File diff suppressed because it is too large
Load Diff
Executable
+592
@@ -0,0 +1,592 @@
|
|||||||
|
#!/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 Local Build Report script"
|
||||||
|
echo " Original Author: Raphael Defosseux"
|
||||||
|
echo ""
|
||||||
|
echo "Usage:"
|
||||||
|
echo "------"
|
||||||
|
echo ""
|
||||||
|
echo " reportBuildLocally.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 Local Build 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 ""
|
||||||
|
}
|
||||||
|
|
||||||
|
function details_table {
|
||||||
|
echo " <h4>$1</h4>" >> $3
|
||||||
|
|
||||||
|
echo " <table border = \"1\">" >> $3
|
||||||
|
echo " <tr bgcolor = \"#33CCFF\" >" >> $3
|
||||||
|
echo " <th>File</th>" >> $3
|
||||||
|
echo " <th>Line Number</th>" >> $3
|
||||||
|
echo " <th>Status</th>" >> $3
|
||||||
|
echo " <th>Message</th>" >> $3
|
||||||
|
echo " </tr>" >> $3
|
||||||
|
|
||||||
|
LIST_MESSAGES=`egrep "error:|warning:" $2 | egrep -v "jobserver unavailable|Clock skew detected.|flexran.proto"`
|
||||||
|
COMPLETE_MESSAGE="start"
|
||||||
|
for MESSAGE in $LIST_MESSAGES
|
||||||
|
do
|
||||||
|
if [[ $MESSAGE == *"/home/ubuntu/tmp"* ]]
|
||||||
|
then
|
||||||
|
FILENAME=`echo $MESSAGE | sed -e "s#^/home/ubuntu/tmp/##" -e "s#^.*/tmp/CI-eNB/##" | awk -F ":" '{print $1}'`
|
||||||
|
LINENB=`echo $MESSAGE | awk -F ":" '{print $2}'`
|
||||||
|
if [ "$COMPLETE_MESSAGE" != "start" ]
|
||||||
|
then
|
||||||
|
COMPLETE_MESSAGE=`echo $COMPLETE_MESSAGE | sed -e "s#‘#'#g" -e "s#’#'#g"`
|
||||||
|
echo " <td>$COMPLETE_MESSAGE</td>" >> $3
|
||||||
|
echo " </tr>" >> $3
|
||||||
|
fi
|
||||||
|
echo " <tr>" >> $3
|
||||||
|
echo " <td>$FILENAME</td>" >> $3
|
||||||
|
echo " <td>$LINENB</td>" >> $3
|
||||||
|
else
|
||||||
|
if [[ $MESSAGE == *"warning:"* ]] || [[ $MESSAGE == *"error:"* ]]
|
||||||
|
then
|
||||||
|
MSGTYPE=`echo $MESSAGE | sed -e "s#:##g"`
|
||||||
|
echo " <td>$MSGTYPE</td>" >> $3
|
||||||
|
COMPLETE_MESSAGE=""
|
||||||
|
else
|
||||||
|
COMPLETE_MESSAGE=$COMPLETE_MESSAGE" "$MESSAGE
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
|
||||||
|
if [ "$COMPLETE_MESSAGE" != "start" ]
|
||||||
|
then
|
||||||
|
COMPLETE_MESSAGE=`echo $COMPLETE_MESSAGE | sed -e "s#‘#'#g" -e "s#’#'#g"`
|
||||||
|
echo " <td>$COMPLETE_MESSAGE</td>" >> $3
|
||||||
|
echo " </tr>" >> $3
|
||||||
|
fi
|
||||||
|
echo " </table>" >> $3
|
||||||
|
}
|
||||||
|
|
||||||
|
function summary_table_header {
|
||||||
|
echo " <h3>$1</h3>" >> ./build_results.html
|
||||||
|
echo " <table border = \"1\">" >> ./build_results.html
|
||||||
|
echo " <tr bgcolor = \"#33CCFF\" >" >> ./build_results.html
|
||||||
|
echo " <th>Element</th>" >> ./build_results.html
|
||||||
|
echo " <th>Status</th>" >> ./build_results.html
|
||||||
|
echo " <th>Nb Errors</th>" >> ./build_results.html
|
||||||
|
echo " <th>Nb Warnings</th>" >> ./build_results.html
|
||||||
|
echo " </tr>" >> ./build_results.html
|
||||||
|
}
|
||||||
|
|
||||||
|
function summary_table_row {
|
||||||
|
echo " <tr>" >> ./build_results.html
|
||||||
|
echo " <td bgcolor = \"lightcyan\" >$1</th>" >> ./build_results.html
|
||||||
|
if [ -f $2 ]
|
||||||
|
then
|
||||||
|
STATUS=`egrep -c "$3" $2`
|
||||||
|
if [ $STATUS -eq 1 ]
|
||||||
|
then
|
||||||
|
echo " <td bgcolor = \"green\" >OK</th>" >> ./build_results.html
|
||||||
|
else
|
||||||
|
echo " <td bgcolor = \"red\" >KO</th>" >> ./build_results.html
|
||||||
|
fi
|
||||||
|
NB_ERRORS=`egrep -c "error:" $2`
|
||||||
|
if [ $NB_ERRORS -eq 0 ]
|
||||||
|
then
|
||||||
|
echo " <td bgcolor = \"green\" >$NB_ERRORS</th>" >> ./build_results.html
|
||||||
|
else
|
||||||
|
echo " <td bgcolor = \"red\" >$NB_ERRORS</th>" >> ./build_results.html
|
||||||
|
fi
|
||||||
|
NB_WARNINGS=`egrep "warning:" $2 | egrep -v "jobserver unavailable|Clock skew detected.|flexran.proto" | egrep -c "warning:"`
|
||||||
|
if [ $NB_WARNINGS -eq 0 ]
|
||||||
|
then
|
||||||
|
echo " <td bgcolor = \"green\" >$NB_WARNINGS</th>" >> ./build_results.html
|
||||||
|
else
|
||||||
|
if [ $NB_WARNINGS -gt 20 ]
|
||||||
|
then
|
||||||
|
echo " <td bgcolor = \"red\" >$NB_WARNINGS</th>" >> ./build_results.html
|
||||||
|
else
|
||||||
|
echo " <td bgcolor = \"orange\" >$NB_WARNINGS</th>" >> ./build_results.html
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
if [ $NB_ERRORS -ne 0 ] || [ $NB_WARNINGS -ne 0 ]
|
||||||
|
then
|
||||||
|
details_table "$1" $2 $4
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
echo " <td bgcolor = \"lightgray\" >Unknown</th>" >> ./build_results.html
|
||||||
|
echo " <td bgcolor = \"lightgray\" >--</th>" >> ./build_results.html
|
||||||
|
echo " <td bgcolor = \"lightgray\" >--</th>" >> ./build_results.html
|
||||||
|
fi
|
||||||
|
echo " </tr>" >> ./build_results.html
|
||||||
|
}
|
||||||
|
|
||||||
|
function summary_table_footer {
|
||||||
|
echo " </table>" >> ./build_results.html
|
||||||
|
}
|
||||||
|
|
||||||
|
function sca_summary_table_header {
|
||||||
|
echo " <h3>$1</h3>" >> ./build_results.html
|
||||||
|
echo " <table border = \"1\">" >> ./build_results.html
|
||||||
|
echo " <tr bgcolor = \"#33CCFF\" >" >> ./build_results.html
|
||||||
|
echo " <th>Error / Warning Type</th>" >> ./build_results.html
|
||||||
|
echo " <th>Nb Errors</th>" >> ./build_results.html
|
||||||
|
echo " <th>Nb Warnings</th>" >> ./build_results.html
|
||||||
|
echo " </tr>" >> ./build_results.html
|
||||||
|
echo "0" > ccp_error_cnt.txt
|
||||||
|
}
|
||||||
|
|
||||||
|
function sca_summary_table_row {
|
||||||
|
echo " <tr>" >> ./build_results.html
|
||||||
|
echo " <td bgcolor = \"lightcyan\" >$2</td>" >> ./build_results.html
|
||||||
|
if [ -f $1 ]
|
||||||
|
then
|
||||||
|
NB_ERRORS=`egrep "severity=\"error\"" $1 | egrep -c "id=\"$3\""`
|
||||||
|
echo " <td>$NB_ERRORS</td>" >> ./build_results.html
|
||||||
|
echo " <td>N/A</td>" >> ./build_results.html
|
||||||
|
if [ -f ccp_error_cnt.txt ]
|
||||||
|
then
|
||||||
|
TOTAL_ERRORS=`cat ccp_error_cnt.txt`
|
||||||
|
TOTAL_ERRORS=$((TOTAL_ERRORS + NB_ERRORS))
|
||||||
|
echo $TOTAL_ERRORS > ccp_error_cnt.txt
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
echo " <td>Unknown</td>" >> ./build_results.html
|
||||||
|
echo " <td>Unknown</td>" >> ./build_results.html
|
||||||
|
fi
|
||||||
|
echo " </tr>" >> ./build_results.html
|
||||||
|
}
|
||||||
|
|
||||||
|
function sca_summary_table_footer {
|
||||||
|
if [ -f $1 ]
|
||||||
|
then
|
||||||
|
NB_ERRORS=`egrep -c "severity=\"error\"" $1`
|
||||||
|
NB_WARNINGS=`egrep -c "severity=\"warning\"" $1`
|
||||||
|
if [ -f ccp_error_cnt.txt ]
|
||||||
|
then
|
||||||
|
echo " <tr>" >> ./build_results.html
|
||||||
|
echo " <td bgcolor = \"lightcyan\" >Others</td>" >> ./build_results.html
|
||||||
|
TOTAL_ERRORS=`cat ccp_error_cnt.txt`
|
||||||
|
TOTAL_ERRORS=$((NB_ERRORS - TOTAL_ERRORS))
|
||||||
|
echo " <td>$TOTAL_ERRORS</td>" >> ./build_results.html
|
||||||
|
echo " <td>$NB_WARNINGS</td>" >> ./build_results.html
|
||||||
|
echo " </tr>" >> ./build_results.html
|
||||||
|
rm -f ccp_error_cnt.txt
|
||||||
|
fi
|
||||||
|
echo " <tr bgcolor = \"#33CCFF\" >" >> ./build_results.html
|
||||||
|
echo " <th>Total</th>" >> ./build_results.html
|
||||||
|
echo " <th>$NB_ERRORS</th>" >> ./build_results.html
|
||||||
|
echo " <th>$NB_WARNINGS</th>" >> ./build_results.html
|
||||||
|
else
|
||||||
|
echo " <tr bgcolor = \"#33CCFF\" >" >> ./build_results.html
|
||||||
|
echo " <th>Total</th>" >> ./build_results.html
|
||||||
|
echo " <th>Unknown</th>" >> ./build_results.html
|
||||||
|
echo " <th>Unknown</th>" >> ./build_results.html
|
||||||
|
if [ -f ccp_error_cnt.txt ]
|
||||||
|
then
|
||||||
|
rm -f ccp_error_cnt.txt
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
echo " </tr>" >> ./build_results.html
|
||||||
|
echo " </table>" >> ./build_results.html
|
||||||
|
echo " <p>Full details in zipped artifact (cppcheck/cppcheck.xml) </p>" >> ./build_results.html
|
||||||
|
echo " <p>Graphical Interface tool : <code>cppcheck-gui -l cppcheck/cppcheck.xml</code> </p>" >> ./build_results.html
|
||||||
|
}
|
||||||
|
|
||||||
|
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 "<!DOCTYPE html>" > ./build_results.html
|
||||||
|
echo "<html class=\"no-js\" lang=\"en-US\">" >> ./build_results.html
|
||||||
|
echo "<head>" >> ./build_results.html
|
||||||
|
echo " <title>Build Results for $JOB_NAME job build #$BUILD_ID</title>" >> ./build_results.html
|
||||||
|
echo " <base href = \"http://www.openairinterface.org/\" />" >> ./build_results.html
|
||||||
|
echo "</head>" >> ./build_results.html
|
||||||
|
echo "<body>" >> ./build_results.html
|
||||||
|
echo " <table style=\"border-collapse: collapse; border: none;\">" >> ./build_results.html
|
||||||
|
echo " <tr style=\"border-collapse: collapse; border: none;\">" >> ./build_results.html
|
||||||
|
echo " <td style=\"border-collapse: collapse; border: none;\">" >> ./build_results.html
|
||||||
|
echo " <a href=\"http://www.openairinterface.org/\">" >> ./build_results.html
|
||||||
|
echo " <img src=\"/wp-content/uploads/2016/03/cropped-oai_final_logo2.png\" alt=\"\" border=\"none\" height=50 width=150>" >> ./build_results.html
|
||||||
|
echo " </img>" >> ./build_results.html
|
||||||
|
echo " </a>" >> ./build_results.html
|
||||||
|
echo " </td>" >> ./build_results.html
|
||||||
|
echo " <td style=\"border-collapse: collapse; border: none; vertical-align: center;\">" >> ./build_results.html
|
||||||
|
echo " <b><font size = \"6\">Job Summary -- Job: $JOB_NAME -- Build-ID: $BUILD_ID</font></b>" >> ./build_results.html
|
||||||
|
echo " </td>" >> ./build_results.html
|
||||||
|
echo " </tr>" >> ./build_results.html
|
||||||
|
echo " </table>" >> ./build_results.html
|
||||||
|
echo " <br>" >> ./build_results.html
|
||||||
|
echo " <table border = \"1\">" >> ./build_results.html
|
||||||
|
echo " <tr>" >> ./build_results.html
|
||||||
|
echo " <td bgcolor = \"lightcyan\" >GIT Repository</td>" >> ./build_results.html
|
||||||
|
echo " <td>$GIT_URL</td>" >> ./build_results.html
|
||||||
|
echo " </tr>" >> ./build_results.html
|
||||||
|
echo " <tr>" >> ./build_results.html
|
||||||
|
echo " <td bgcolor = \"lightcyan\" >Job Trigger</td>" >> ./build_results.html
|
||||||
|
if [ $PU_TRIG -eq 1 ]; then echo " <td>Push Event</td>" >> ./build_results.html; fi
|
||||||
|
if [ $MR_TRIG -eq 1 ]; then echo " <td>Merge-Request</td>" >> ./build_results.html; fi
|
||||||
|
echo " </tr>" >> ./build_results.html
|
||||||
|
if [ $PU_TRIG -eq 1 ]
|
||||||
|
then
|
||||||
|
echo " <tr>" >> ./build_results.html
|
||||||
|
echo " <td bgcolor = \"lightcyan\" >Branch</td>" >> ./build_results.html
|
||||||
|
echo " <td>$SOURCE_BRANCH</td>" >> ./build_results.html
|
||||||
|
echo " </tr>" >> ./build_results.html
|
||||||
|
echo " <tr>" >> ./build_results.html
|
||||||
|
echo " <td bgcolor = \"lightcyan\" >Commit ID</td>" >> ./build_results.html
|
||||||
|
echo " <td>$SOURCE_COMMIT_ID</td>" >> ./build_results.html
|
||||||
|
echo " </tr>" >> ./build_results.html
|
||||||
|
fi
|
||||||
|
if [ $MR_TRIG -eq 1 ]
|
||||||
|
then
|
||||||
|
echo " <tr>" >> ./build_results.html
|
||||||
|
echo " <td bgcolor = \"lightcyan\" >Source Branch</td>" >> ./build_results.html
|
||||||
|
echo " <td>$SOURCE_BRANCH</td>" >> ./build_results.html
|
||||||
|
echo " </tr>" >> ./build_results.html
|
||||||
|
echo " <tr>" >> ./build_results.html
|
||||||
|
echo " <td bgcolor = \"lightcyan\" >Source Commit ID</td>" >> ./build_results.html
|
||||||
|
echo " <td>$SOURCE_COMMIT_ID</td>" >> ./build_results.html
|
||||||
|
echo " </tr>" >> ./build_results.html
|
||||||
|
echo " <tr>" >> ./build_results.html
|
||||||
|
echo " <td bgcolor = \"lightcyan\" >Target Branch</td>" >> ./build_results.html
|
||||||
|
echo " <td>$TARGET_BRANCH</td>" >> ./build_results.html
|
||||||
|
echo " </tr>" >> ./build_results.html
|
||||||
|
echo " <tr>" >> ./build_results.html
|
||||||
|
echo " <td bgcolor = \"lightcyan\" >Target Commit ID</td>" >> ./build_results.html
|
||||||
|
echo " <td>$TARGET_COMMIT_ID</td>" >> ./build_results.html
|
||||||
|
echo " </tr>" >> ./build_results.html
|
||||||
|
fi
|
||||||
|
echo " </table>" >> ./build_results.html
|
||||||
|
echo " <h2>Build Summary</h2>" >> ./build_results.html
|
||||||
|
|
||||||
|
if [ -f ./oai_rules_result.txt ]
|
||||||
|
then
|
||||||
|
echo " <h3>OAI Coding / Formatting Guidelines Check</h3>" >> ./build_results.html
|
||||||
|
echo " <table border = "1">" >> ./build_results.html
|
||||||
|
echo " <tr>" >> ./build_results.html
|
||||||
|
echo " <td bgcolor = \"lightcyan\" >Result:</td>" >> ./build_results.html
|
||||||
|
NB_FILES=`cat ./oai_rules_result.txt`
|
||||||
|
if [ $NB_FILES = "0" ]
|
||||||
|
then
|
||||||
|
if [ $PU_TRIG -eq 1 ]; then echo " <td bgcolor = \"green\">All files in repository follow OAI rules. </td>" >> ./build_results.html; fi
|
||||||
|
if [ $MR_TRIG -eq 1 ]; then echo " <td bgcolor = \"green\">All modified files in Merge-Request follow OAI rules.</td>" >> ./build_results.html; fi
|
||||||
|
else
|
||||||
|
if [ $PU_TRIG -eq 1 ]; then echo " <td bgcolor = \"orange\">$NB_FILES files in repository DO NOT follow OAI rules. </td>" >> ./build_results.html; fi
|
||||||
|
if [ $MR_TRIG -eq 1 ]; then echo " <td bgcolor = \"orange\">$NB_FILES modified files in Merge-Request DO NOT follow OAI rules.</td>" >> ./build_results.html; fi
|
||||||
|
fi
|
||||||
|
echo " </tr>" >> ./build_results.html
|
||||||
|
echo " </table>" >> ./build_results.html
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo " <h2>Ubuntu 16.04 LTS -- Summary</h2>" >> ./build_results.html
|
||||||
|
|
||||||
|
sca_summary_table_header "OAI Static Code Analysis with CPPCHECK"
|
||||||
|
sca_summary_table_row ./archives/cppcheck/cppcheck.xml "Uninitialized variable" uninitvar
|
||||||
|
sca_summary_table_row ./archives/cppcheck/cppcheck.xml "Uninitialized struct member" uninitStructMember
|
||||||
|
sca_summary_table_row ./archives/cppcheck/cppcheck.xml "Memory leak" memleak
|
||||||
|
sca_summary_table_row ./archives/cppcheck/cppcheck.xml "Memory is freed twice" doubleFree
|
||||||
|
sca_summary_table_row ./archives/cppcheck/cppcheck.xml "Resource leak" resourceLeak
|
||||||
|
sca_summary_table_row ./archives/cppcheck/cppcheck.xml "Possible null pointer dereference" nullPointer
|
||||||
|
sca_summary_table_row ./archives/cppcheck/cppcheck.xml "Array access out of bounds" arrayIndexOutOfBounds
|
||||||
|
sca_summary_table_row ./archives/cppcheck/cppcheck.xml "Buffer is accessed out of bounds" bufferAccessOutOfBounds
|
||||||
|
sca_summary_table_row ./archives/cppcheck/cppcheck.xml "Expression depends on order of evaluation of side effects" unknownEvaluationOrder
|
||||||
|
sca_summary_table_footer ./archives/cppcheck/cppcheck.xml
|
||||||
|
|
||||||
|
summary_table_header "OAI Build eNB -- USRP option"
|
||||||
|
summary_table_row "LTE SoftModem - Release 14" ./archives/enb_usrp/lte-softmodem.Rel14.txt "Built target lte-softmodem" ./enb_usrp_row1.html
|
||||||
|
summary_table_row "Coding - Release 14" ./archives/enb_usrp/coding.Rel14.txt "Built target coding" ./enb_usrp_row2.html
|
||||||
|
summary_table_row "OAI USRP device if - Release 14" ./archives/enb_usrp/oai_usrpdevif.Rel14.txt "Built target oai_usrpdevif" ./enb_usrp_row3.html
|
||||||
|
summary_table_row "Parameters Lib Config - Release 14" ./archives/enb_usrp/params_libconfig.Rel14.txt "Built target params_libconfig" ./enb_usrp_row4.html
|
||||||
|
summary_table_footer
|
||||||
|
|
||||||
|
summary_table_header "OAI Build basic simulator option"
|
||||||
|
summary_table_row "Basic Simulator eNb - Release 14" ./archives/basic_sim/basic_simulator_enb.txt "Built target lte-softmodem" ./basic_sim_row1.html
|
||||||
|
summary_table_row "Basic Simulator UE - Release 14" ./archives/basic_sim/basic_simulator_ue.txt "Built target lte-uesoftmodem" ./basic_sim_row2.html
|
||||||
|
summary_table_row "Conf 2 UE data - Release 14" ./archives/basic_sim/conf2uedata.Rel14.txt "Built target conf2uedata" ./basic_sim_row3.html
|
||||||
|
summary_table_footer
|
||||||
|
|
||||||
|
summary_table_header "OAI Build Physical simulators option"
|
||||||
|
summary_table_row "DL Simulator - Release 14" ./archives/phy_sim/dlsim.Rel14.txt "Built target dlsim" ./phy_sim_row1.html
|
||||||
|
summary_table_row "UL Simulator - Release 14" ./archives/phy_sim/ulsim.Rel14.txt "Built target ulsim" ./phy_sim_row2.html
|
||||||
|
summary_table_row "Coding - Release 14" ./archives/phy_sim/coding.Rel14.txt "Built target coding" ./phy_sim_row3.html
|
||||||
|
summary_table_footer
|
||||||
|
|
||||||
|
summary_table_header "OAI Build eNB -- ETHERNET transport option"
|
||||||
|
summary_table_row "LTE SoftModem w/o S1 - Release 14" ./archives/enb_eth/lte-softmodem-nos1.Rel14.txt "Built target lte-softmodem" ./enb_eth_row1.html
|
||||||
|
summary_table_row "Coding - Release 14" ./archives/enb_eth/coding.Rel14.txt "Built target coding" ./enb_eth_row2.html
|
||||||
|
summary_table_row "OAI ETHERNET transport - Release 14" ./archives/enb_eth/oai_eth_transpro.Rel14.txt "Built target oai_eth_transpro" ./enb_eth_row3.html
|
||||||
|
summary_table_row "Parameters Lib Config - Release 14" ./archives/enb_eth/params_libconfig.Rel14.txt "Built target params_libconfig" ./enb_eth_row4.html
|
||||||
|
summary_table_row "RB Tools - Release 14" ./archives/enb_eth/rb_tool.Rel14.txt "Built target rb_tool" ./enb_eth_row5.html
|
||||||
|
summary_table_row "NAS Mesh - Release 14" ./archives/enb_eth/nasmesh.Rel14.txt "Built target nasmesh" ./enb_eth_row6.html
|
||||||
|
summary_table_footer
|
||||||
|
|
||||||
|
summary_table_header "OAI Build UE -- ETHERNET transport option"
|
||||||
|
summary_table_row "LTE UE SoftModem w/o S1 - Release 14" ./archives/ue_eth/lte-uesoftmodem-nos1.Rel14.txt "Built target lte-uesoftmodem" ./ue_eth_row1.html
|
||||||
|
summary_table_row "Coding - Release 14" ./archives/ue_eth/coding.Rel14.txt "Built target coding" ./ue_eth_row2.html
|
||||||
|
summary_table_row "OAI ETHERNET transport - Release 14" ./archives/ue_eth/oai_eth_transpro.Rel14.txt "Built target oai_eth_transpro" ./ue_eth_row3.html
|
||||||
|
summary_table_row "Parameters Lib Config - Release 14" ./archives/ue_eth/params_libconfig.Rel14.txt "Built target params_libconfig" ./ue_eth_row4.html
|
||||||
|
summary_table_row "RB Tools - Release 14" ./archives/ue_eth/rb_tool.Rel14.txt "Built target rb_tool" ./ue_eth_row5.html
|
||||||
|
summary_table_row "NAS Mesh - Release 14" ./archives/ue_eth/nasmesh.Rel14.txt "Built target nasmesh" ./ue_eth_row6.html
|
||||||
|
summary_table_footer
|
||||||
|
|
||||||
|
echo " <h2>Red Hat (CentOS Linux release 7.4.1708) -- Summary</h2>" >> ./build_results.html
|
||||||
|
|
||||||
|
summary_table_header "Red Hat -- OAI Build eNB -- USRP option"
|
||||||
|
summary_table_row "LTE SoftModem - Release 14" ./archives/red_hat/lte-softmodem.Rel14.txt "Built target lte-softmodem" ./enb_usrp_rh_row1.html
|
||||||
|
summary_table_row "Coding - Release 14" ./archives/red_hat/coding.Rel14.txt "Built target coding" ./enb_usrp_rh_row2.html
|
||||||
|
summary_table_row "OAI USRP device if - Release 14" ./archives/red_hat/oai_usrpdevif.Rel14.txt "Built target oai_usrpdevif" ./enb_usrp_rh_row3.html
|
||||||
|
summary_table_row "Parameters Lib Config - Release 14" ./archives/red_hat/params_libconfig.Rel14.txt "Built target params_libconfig" ./enb_usrp_rh_row4.html
|
||||||
|
summary_table_footer
|
||||||
|
|
||||||
|
echo " <h3>Details</h3>" >> ./build_results.html
|
||||||
|
|
||||||
|
for DETAILS_TABLE in `ls ./enb_usrp_row*.html`
|
||||||
|
do
|
||||||
|
cat $DETAILS_TABLE >> ./build_results.html
|
||||||
|
done
|
||||||
|
for DETAILS_TABLE in `ls ./basic_sim_row*.html`
|
||||||
|
do
|
||||||
|
cat $DETAILS_TABLE >> ./build_results.html
|
||||||
|
done
|
||||||
|
for DETAILS_TABLE in `ls ./phy_sim_row*.html`
|
||||||
|
do
|
||||||
|
cat $DETAILS_TABLE >> ./build_results.html
|
||||||
|
done
|
||||||
|
for DETAILS_TABLE in `ls ./enb_eth_row*.html`
|
||||||
|
do
|
||||||
|
cat $DETAILS_TABLE >> ./build_results.html
|
||||||
|
done
|
||||||
|
for DETAILS_TABLE in `ls ./ue_eth_row*.html`
|
||||||
|
do
|
||||||
|
cat $DETAILS_TABLE >> ./build_results.html
|
||||||
|
done
|
||||||
|
for DETAILS_TABLE in `ls ./enb_usrp_rh_row*.html`
|
||||||
|
do
|
||||||
|
cat $DETAILS_TABLE >> ./build_results.html
|
||||||
|
done
|
||||||
|
rm -f ./enb_usrp_row*.html ./basic_sim_row*.html ./phy_sim_row*.html ./enb_eth_row*.html ./ue_eth_row*.html ./enb_usrp_rh_row*.html
|
||||||
|
|
||||||
|
echo "</body>" >> ./build_results.html
|
||||||
|
echo "</html>" >> ./build_results.html
|
||||||
|
|
||||||
|
exit 0
|
||||||
Executable
+318
@@ -0,0 +1,318 @@
|
|||||||
|
#!/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 VM Test Run script"
|
||||||
|
echo " Original Author: Raphael Defosseux"
|
||||||
|
echo " Default:"
|
||||||
|
echo " -- eNB with USRP"
|
||||||
|
echo ""
|
||||||
|
echo "Usage:"
|
||||||
|
echo "------"
|
||||||
|
echo " runTestOnVM.sh [OPTIONS]"
|
||||||
|
echo ""
|
||||||
|
echo "Options:"
|
||||||
|
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 " --workspace #### OR -ws ####"
|
||||||
|
echo " Specify the workspace."
|
||||||
|
echo ""
|
||||||
|
echo " --variant enb-usrp OR -v1"
|
||||||
|
echo " --variant basic-sim OR -v2"
|
||||||
|
echo " --variant phy-sim OR -v3"
|
||||||
|
echo " --variant cppcheck OR -v4"
|
||||||
|
echo " --variant enb-ethernet OR -v7"
|
||||||
|
echo " --variant ue-ethernet OR -v8"
|
||||||
|
echo " Specify the variant to build."
|
||||||
|
echo ""
|
||||||
|
echo " --keep-vm-alive OR -k"
|
||||||
|
echo " Keep the VM alive after the build."
|
||||||
|
echo ""
|
||||||
|
echo " --help OR -h"
|
||||||
|
echo " Print this help message."
|
||||||
|
echo ""
|
||||||
|
}
|
||||||
|
|
||||||
|
function variant_usage {
|
||||||
|
echo "OAI VM Test Run script"
|
||||||
|
echo " Original Author: Raphael Defosseux"
|
||||||
|
echo ""
|
||||||
|
echo " --variant enb-usrp OR -v1"
|
||||||
|
echo " --variant basic-sim OR -v2"
|
||||||
|
echo " --variant phy-sim OR -v3"
|
||||||
|
echo " --variant cppcheck OR -v4"
|
||||||
|
echo " --variant enb-ethernet OR -v7"
|
||||||
|
echo " --variant ue-ethernet OR -v8"
|
||||||
|
echo ""
|
||||||
|
}
|
||||||
|
|
||||||
|
if [ $# -lt 1 ] || [ $# -gt 9 ]
|
||||||
|
then
|
||||||
|
echo "Syntax Error: not the correct number of arguments"
|
||||||
|
echo ""
|
||||||
|
usage
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
VM_TEMPLATE=ci-
|
||||||
|
JOB_NAME=XX
|
||||||
|
BUILD_ID=XX
|
||||||
|
VM_NAME=ci-enb-usrp
|
||||||
|
ARCHIVES_LOC=enb_usrp/test
|
||||||
|
KEEP_VM_ALIVE=0
|
||||||
|
RUN_OPTIONS="none"
|
||||||
|
STATUS=0
|
||||||
|
|
||||||
|
while [[ $# -gt 0 ]]
|
||||||
|
do
|
||||||
|
key="$1"
|
||||||
|
|
||||||
|
case $key in
|
||||||
|
-h|--help)
|
||||||
|
shift
|
||||||
|
usage
|
||||||
|
exit 0
|
||||||
|
;;
|
||||||
|
-jn|--job-name)
|
||||||
|
JOB_NAME="$2"
|
||||||
|
shift
|
||||||
|
shift
|
||||||
|
;;
|
||||||
|
-id|--build-id)
|
||||||
|
BUILD_ID="$2"
|
||||||
|
shift
|
||||||
|
shift
|
||||||
|
;;
|
||||||
|
-ws|--workspace)
|
||||||
|
JENKINS_WKSP="$2"
|
||||||
|
shift
|
||||||
|
shift
|
||||||
|
;;
|
||||||
|
-k|--keep-vm-alive)
|
||||||
|
KEEP_VM_ALIVE=1
|
||||||
|
shift
|
||||||
|
;;
|
||||||
|
-v1)
|
||||||
|
VM_NAME=ci-enb-usrp
|
||||||
|
shift
|
||||||
|
;;
|
||||||
|
-v2)
|
||||||
|
VM_NAME=ci-basic-sim
|
||||||
|
shift
|
||||||
|
;;
|
||||||
|
-v3)
|
||||||
|
VM_NAME=ci-phy-sim
|
||||||
|
RUN_OPTIONS="./run_exec_autotests.bash -g \"01510*\" -q -np -b"
|
||||||
|
ARCHIVES_LOC=phy_sim/test
|
||||||
|
shift
|
||||||
|
;;
|
||||||
|
-v4)
|
||||||
|
VM_NAME=ci-cppcheck
|
||||||
|
shift
|
||||||
|
;;
|
||||||
|
-v7)
|
||||||
|
VM_NAME=ci-enb-ethernet
|
||||||
|
shift
|
||||||
|
;;
|
||||||
|
-v8)
|
||||||
|
VM_NAME=ci-ue-ethernet
|
||||||
|
shift
|
||||||
|
;;
|
||||||
|
--variant)
|
||||||
|
variant="$2"
|
||||||
|
case $variant in
|
||||||
|
enb-usrp)
|
||||||
|
VM_NAME=ci-enb-usrp
|
||||||
|
;;
|
||||||
|
basic-sim)
|
||||||
|
VM_NAME=ci-basic-sim
|
||||||
|
;;
|
||||||
|
phy-sim)
|
||||||
|
VM_NAME=ci-phy-sim
|
||||||
|
RUN_OPTIONS="./run_exec_autotests.bash -g \"01510*\" -q -np -b"
|
||||||
|
ARCHIVES_LOC=phy_sim/test
|
||||||
|
;;
|
||||||
|
cppcheck)
|
||||||
|
VM_NAME=ci-cppcheck
|
||||||
|
;;
|
||||||
|
enb-ethernet)
|
||||||
|
VM_NAME=ci-enb-ethernet
|
||||||
|
;;
|
||||||
|
ue-ethernet)
|
||||||
|
VM_NAME=ci-ue-ethernet
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
echo ""
|
||||||
|
echo "Syntax Error: Invalid Variant option -> $variant"
|
||||||
|
echo ""
|
||||||
|
variant_usage
|
||||||
|
exit 1
|
||||||
|
esac
|
||||||
|
shift
|
||||||
|
shift
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
echo "Syntax Error: unknown option: $key"
|
||||||
|
echo ""
|
||||||
|
usage
|
||||||
|
exit 1
|
||||||
|
esac
|
||||||
|
done
|
||||||
|
|
||||||
|
if [ "$JOB_NAME" == "XX" ] || [ "$BUILD_ID" == "XX" ]
|
||||||
|
then
|
||||||
|
VM_TEMPLATE=ci-
|
||||||
|
else
|
||||||
|
VM_TEMPLATE=${JOB_NAME}-b${BUILD_ID}-
|
||||||
|
fi
|
||||||
|
|
||||||
|
VM_NAME=`echo $VM_NAME | sed -e "s#ci-#$VM_TEMPLATE#"`
|
||||||
|
VM_CMDS=${VM_NAME}_cmds.txt
|
||||||
|
ARCHIVES_LOC=${JENKINS_WKSP}/archives/${ARCHIVES_LOC}
|
||||||
|
|
||||||
|
echo "VM_NAME = $VM_NAME"
|
||||||
|
echo "VM_CMD_FILE = $VM_CMDS"
|
||||||
|
echo "JENKINS_WKSP = $JENKINS_WKSP"
|
||||||
|
echo "ARCHIVES_LOC = $ARCHIVES_LOC"
|
||||||
|
|
||||||
|
echo "############################################################"
|
||||||
|
echo "Waiting for VM to be started"
|
||||||
|
echo "############################################################"
|
||||||
|
uvt-kvm wait $VM_NAME --insecure
|
||||||
|
|
||||||
|
VM_IP_ADDR=`uvt-kvm ip $VM_NAME`
|
||||||
|
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
|
||||||
|
|
||||||
|
echo "############################################################"
|
||||||
|
echo "Running test script on VM ($VM_NAME)"
|
||||||
|
echo "############################################################"
|
||||||
|
echo "echo \"sudo apt-get --yes --quiet install bc \"" > $VM_CMDS
|
||||||
|
echo "sudo apt-get update > bc-install.txt 2>&1" >> $VM_CMDS
|
||||||
|
echo "sudo apt-get --yes install bc >> bc-install.txt 2>&1" >> $VM_CMDS
|
||||||
|
echo "cd tmp" >> $VM_CMDS
|
||||||
|
echo "echo \"source oaienv\"" >> $VM_CMDS
|
||||||
|
echo "source oaienv" >> $VM_CMDS
|
||||||
|
echo "echo \"cd cmake_targets/autotests\"" >> $VM_CMDS
|
||||||
|
echo "cd cmake_targets/autotests" >> $VM_CMDS
|
||||||
|
echo "echo \"rm -Rf log\"" >> $VM_CMDS
|
||||||
|
echo "rm -Rf log" >> $VM_CMDS
|
||||||
|
echo "$RUN_OPTIONS" | sed -e 's@"@\\"@g' -e 's@^@echo "@' -e 's@$@"@' >> $VM_CMDS
|
||||||
|
echo "$RUN_OPTIONS" >> $VM_CMDS
|
||||||
|
echo "cp /home/ubuntu/bc-install.txt log" >> $VM_CMDS
|
||||||
|
echo "cd log" >> $VM_CMDS
|
||||||
|
echo "zip -r -qq tmp.zip *.* 0*" >> $VM_CMDS
|
||||||
|
|
||||||
|
ssh -o StrictHostKeyChecking=no ubuntu@$VM_IP_ADDR < $VM_CMDS
|
||||||
|
|
||||||
|
echo "############################################################"
|
||||||
|
echo "Creating a tmp folder to store results and artifacts"
|
||||||
|
echo "############################################################"
|
||||||
|
|
||||||
|
if [ -d $ARCHIVES_LOC ]
|
||||||
|
then
|
||||||
|
rm -Rf $ARCHIVES_LOC
|
||||||
|
fi
|
||||||
|
mkdir --parents $ARCHIVES_LOC
|
||||||
|
|
||||||
|
scp -o StrictHostKeyChecking=no ubuntu@$VM_IP_ADDR:/home/ubuntu/tmp/cmake_targets/autotests/log/tmp.zip $ARCHIVES_LOC
|
||||||
|
pushd $ARCHIVES_LOC
|
||||||
|
unzip -qq -DD tmp.zip
|
||||||
|
rm tmp.zip
|
||||||
|
if [ -f results_autotests.xml ]
|
||||||
|
then
|
||||||
|
FUNCTION=`echo $VM_NAME | sed -e "s@$VM_TEMPLATE@@"`
|
||||||
|
NEW_NAME=`echo "results_autotests.xml" | sed -e "s@results_autotests@results_autotests-$FUNCTION@"`
|
||||||
|
echo "<?xml version=\"1.0\" encoding=\"UTF-8\"?>" > $NEW_NAME
|
||||||
|
echo "<?xml-stylesheet type=\"text/xsl\" href=\"$FUNCTION.xsl\" ?>" >> $NEW_NAME
|
||||||
|
cat results_autotests.xml >> $NEW_NAME
|
||||||
|
sed -e "s@TEMPLATE@$FUNCTION@" $JENKINS_WKSP/ci-scripts/template.xsl > $FUNCTION.xsl
|
||||||
|
#mv results_autotests.xml $NEW_NAME
|
||||||
|
rm results_autotests.xml
|
||||||
|
fi
|
||||||
|
popd
|
||||||
|
|
||||||
|
if [ $KEEP_VM_ALIVE -eq 0 ]
|
||||||
|
then
|
||||||
|
echo "############################################################"
|
||||||
|
echo "Destroying VM"
|
||||||
|
echo "############################################################"
|
||||||
|
uvt-kvm destroy $VM_NAME
|
||||||
|
ssh-keygen -R $VM_IP_ADDR
|
||||||
|
fi
|
||||||
|
rm -f $VM_CMDS
|
||||||
|
|
||||||
|
echo "############################################################"
|
||||||
|
echo "Checking build status"
|
||||||
|
echo "############################################################"
|
||||||
|
|
||||||
|
LOG_FILES=`ls $ARCHIVES_LOC/results_autotests*.xml`
|
||||||
|
NB_FOUND_FILES=0
|
||||||
|
NB_RUNS=0
|
||||||
|
NB_FAILURES=0
|
||||||
|
|
||||||
|
for FULLFILE in $LOG_FILES
|
||||||
|
do
|
||||||
|
TESTSUITES=`egrep "testsuite errors" $FULLFILE`
|
||||||
|
for TESTSUITE in $TESTSUITES
|
||||||
|
do
|
||||||
|
if [[ "$TESTSUITE" == *"tests="* ]]
|
||||||
|
then
|
||||||
|
RUNS=`echo $TESTSUITE | awk 'BEGIN{FS="="}{print $2}END{}' | sed -e "s@'@@g" `
|
||||||
|
NB_RUNS=$((NB_RUNS + RUNS))
|
||||||
|
fi
|
||||||
|
if [[ "$TESTSUITE" == *"failures="* ]]
|
||||||
|
then
|
||||||
|
FAILS=`echo $TESTSUITE | awk 'BEGIN{FS="="}{print $2}END{}' | sed -e "s@'@@g" `
|
||||||
|
NB_FAILURES=$((NB_FAILURES + FAILS))
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
NB_FOUND_FILES=$((NB_FOUND_FILES + 1))
|
||||||
|
done
|
||||||
|
|
||||||
|
echo "NB_FOUND_FILES = $NB_FOUND_FILES"
|
||||||
|
echo "NB_RUNS = $NB_RUNS"
|
||||||
|
echo "NB_FAILURES = $NB_FAILURES"
|
||||||
|
|
||||||
|
if [ $NB_FOUND_FILES -eq 0 ]; then STATUS=-1; fi
|
||||||
|
if [ $NB_RUNS -eq 0 ]; then STATUS=-1; fi
|
||||||
|
if [ $NB_FAILURES -ne 0 ]; then STATUS=-1; fi
|
||||||
|
|
||||||
|
if [ $STATUS -eq 0 ]
|
||||||
|
then
|
||||||
|
echo "STATUS seems OK"
|
||||||
|
else
|
||||||
|
echo "STATUS failed?"
|
||||||
|
fi
|
||||||
|
|
||||||
|
fi
|
||||||
|
|
||||||
|
exit $STATUS
|
||||||
@@ -0,0 +1,27 @@
|
|||||||
|
<domain type='kvm'>
|
||||||
|
<os>
|
||||||
|
<type>hvm</type>
|
||||||
|
<boot dev='hd'/>
|
||||||
|
</os>
|
||||||
|
<features>
|
||||||
|
<acpi/>
|
||||||
|
<apic/>
|
||||||
|
<pae/>
|
||||||
|
</features>
|
||||||
|
<cpu mode='host-passthrough'>
|
||||||
|
</cpu>
|
||||||
|
<devices>
|
||||||
|
<interface type='network'>
|
||||||
|
<source network='default'/>
|
||||||
|
<model type='virtio'/>
|
||||||
|
</interface>
|
||||||
|
<serial type='pty'>
|
||||||
|
<source path='/dev/pts/3'/>
|
||||||
|
<target port='0'/>
|
||||||
|
</serial>
|
||||||
|
<graphics type='vnc' autoport='yes' listen='127.0.0.1'>
|
||||||
|
<listen type='address' address='127.0.0.1'/>
|
||||||
|
</graphics>
|
||||||
|
<video/>
|
||||||
|
</devices>
|
||||||
|
</domain>
|
||||||
@@ -0,0 +1,65 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
|
||||||
|
<xsl:output method="html" version="4" encoding="UTF-8" indent="no" omit-xml-declaration="yes"/>
|
||||||
|
<!-- main body -->
|
||||||
|
<xsl:template match="/">
|
||||||
|
<html>
|
||||||
|
<body>
|
||||||
|
<h3>TEMPLATE Results Summary</h3>
|
||||||
|
<table border="1">
|
||||||
|
<tr bgcolor="lightcyan">
|
||||||
|
<!--Header only so select first row to get headers-->
|
||||||
|
<th>Hostname</th>
|
||||||
|
<th>Nb Tests</th>
|
||||||
|
<th>Failures</th>
|
||||||
|
<th>Timestamp</th>
|
||||||
|
</tr>
|
||||||
|
<!--Get all the other rows-->
|
||||||
|
<xsl:for-each select="testsuites/testsuite">
|
||||||
|
<tr>
|
||||||
|
<td>
|
||||||
|
<xsl:value-of select="@hostname"/>
|
||||||
|
</td>
|
||||||
|
<td>
|
||||||
|
<xsl:value-of select="@tests"/>
|
||||||
|
</td>
|
||||||
|
<td>
|
||||||
|
<xsl:value-of select="@failures"/>
|
||||||
|
</td>
|
||||||
|
<td>
|
||||||
|
<xsl:value-of select="@timestamp"/>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
</xsl:for-each>
|
||||||
|
</table>
|
||||||
|
<h4>Details</h4>
|
||||||
|
<table border="1">
|
||||||
|
<tr bgcolor="lightcyan">
|
||||||
|
<!--Header only so select first row to get headers-->
|
||||||
|
<th>Test Name</th>
|
||||||
|
<th>Result</th>
|
||||||
|
<th>Time</th>
|
||||||
|
<th>Description</th>
|
||||||
|
</tr>
|
||||||
|
<!--Get all the other rows-->
|
||||||
|
<xsl:for-each select="testsuites/testsuite/testcase">
|
||||||
|
<tr>
|
||||||
|
<td>
|
||||||
|
<xsl:value-of select="@name"/>
|
||||||
|
</td>
|
||||||
|
<td>
|
||||||
|
<xsl:value-of select="@RESULT"/>
|
||||||
|
</td>
|
||||||
|
<td>
|
||||||
|
<xsl:value-of select="@time"/>
|
||||||
|
</td>
|
||||||
|
<td>
|
||||||
|
<xsl:value-of select="@description"/>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
</xsl:for-each>
|
||||||
|
</table>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
|
</xsl:template>
|
||||||
|
</xsl:stylesheet>
|
||||||
@@ -0,0 +1,244 @@
|
|||||||
|
<!--
|
||||||
|
|
||||||
|
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
|
||||||
|
|
||||||
|
-->
|
||||||
|
<testCaseList>
|
||||||
|
<TestCaseRequestedList>010101 050101 060101 070101 040101 030101 040301 040501 040601 040602 040603 040604 040605 040641 040401 040201 030201 030111 040301 040511 040611 040612 040613 040614 040615 040651 040401 040201 030201 030121 040301 040521 040621 040622 040623 040661 040401 040201 030201 </TestCaseRequestedList>
|
||||||
|
<TestCaseExclusionList></TestCaseExclusionList>
|
||||||
|
|
||||||
|
<testCase id="010101">
|
||||||
|
<class>Build_eNB</class>
|
||||||
|
<desc>Build eNB (USRP)</desc>
|
||||||
|
<Build_eNB_args>-w USRP -x -c --eNB</Build_eNB_args>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
<testCase id="030101">
|
||||||
|
<class>Initialize_eNB</class>
|
||||||
|
<desc>Initialize eNB (FDD/Band7/5MHz)</desc>
|
||||||
|
<Initialize_eNB_args>-O ci-scripts/conf_files/enb.band7.tm1.25PRB.usrpb210.conf</Initialize_eNB_args>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
<testCase id="030111">
|
||||||
|
<class>Initialize_eNB</class>
|
||||||
|
<desc>Initialize eNB (FDD/Band7/10MHz)</desc>
|
||||||
|
<Initialize_eNB_args>-O ci-scripts/conf_files/enb.band7.tm1.50PRB.usrpb210.conf</Initialize_eNB_args>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
<testCase id="030121">
|
||||||
|
<class>Initialize_eNB</class>
|
||||||
|
<desc>Initialize eNB (FDD/Band7/20MHz)</desc>
|
||||||
|
<Initialize_eNB_args>-O ci-scripts/conf_files/enb.band7.tm1.100PRB.usrpb210.conf</Initialize_eNB_args>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
<testCase id="030201">
|
||||||
|
<class>Terminate_eNB</class>
|
||||||
|
<desc>Terminate eNB</desc>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
<testCase id="040101">
|
||||||
|
<class>Initialize_UE</class>
|
||||||
|
<desc>Initialize UE</desc>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
<testCase id="040201">
|
||||||
|
<class>Terminate_UE</class>
|
||||||
|
<desc>Terminate UE</desc>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
<testCase id="040301">
|
||||||
|
<class>Attach_UE</class>
|
||||||
|
<desc>Attach UE</desc>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
<testCase id="040401">
|
||||||
|
<class>Detach_UE</class>
|
||||||
|
<desc>Detach UE</desc>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
<testCase id="040501">
|
||||||
|
<class>Ping</class>
|
||||||
|
<desc>ping (5MHz - 20 sec)</desc>
|
||||||
|
<ping_args>-c 20</ping_args>
|
||||||
|
<ping_packetloss_threshold>5</ping_packetloss_threshold>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
<testCase id="040511">
|
||||||
|
<class>Ping</class>
|
||||||
|
<desc>ping (10MHz - 20 sec)</desc>
|
||||||
|
<ping_args>-c 20</ping_args>
|
||||||
|
<ping_packetloss_threshold>5</ping_packetloss_threshold>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
<testCase id="040521">
|
||||||
|
<class>Ping</class>
|
||||||
|
<desc>ping (20MHz - 20 sec)</desc>
|
||||||
|
<ping_args>-c 20</ping_args>
|
||||||
|
<ping_packetloss_threshold>5</ping_packetloss_threshold>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
<testCase id="040601">
|
||||||
|
<class>Iperf</class>
|
||||||
|
<desc>iperf (5MHz - DL/6Mbps/UDP)(60 sec)</desc>
|
||||||
|
<iperf_args>-u -b 6M -t 60 -i 1</iperf_args>
|
||||||
|
<iperf_packetloss_threshold>50</iperf_packetloss_threshold>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
<testCase id="040602">
|
||||||
|
<class>Iperf</class>
|
||||||
|
<desc>iperf (5MHz - DL/13Mbps/UDP)(60 sec)</desc>
|
||||||
|
<iperf_args>-u -b 13M -t 60 -i 1</iperf_args>
|
||||||
|
<iperf_packetloss_threshold>50</iperf_packetloss_threshold>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
<testCase id="040603">
|
||||||
|
<class>Iperf</class>
|
||||||
|
<desc>iperf (5MHz - DL/15Mbps/UDP)(60 sec)</desc>
|
||||||
|
<iperf_args>-u -b 15M -t 60 -i 1</iperf_args>
|
||||||
|
<iperf_packetloss_threshold>50</iperf_packetloss_threshold>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
<testCase id="040604">
|
||||||
|
<class>Iperf</class>
|
||||||
|
<desc>iperf (5MHz - DL/15Mbps/UDP)(60 sec)(single-ue profile)</desc>
|
||||||
|
<iperf_args>-u -b 15M -t 60 -i 1</iperf_args>
|
||||||
|
<iperf_packetloss_threshold>50</iperf_packetloss_threshold>
|
||||||
|
<iperf_profile>single-ue</iperf_profile>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
<testCase id="040605">
|
||||||
|
<class>Iperf</class>
|
||||||
|
<desc>iperf (5MHz - DL/15Mbps/UDP)(60 sec)(unbalanced profile)</desc>
|
||||||
|
<iperf_args>-u -b 15M -t 60 -i 1</iperf_args>
|
||||||
|
<iperf_packetloss_threshold>50</iperf_packetloss_threshold>
|
||||||
|
<iperf_profile>unbalanced</iperf_profile>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
<testCase id="040641">
|
||||||
|
<class>Iperf</class>
|
||||||
|
<desc>iperf (5MHz - UL/9Mbps/UDP)(60 sec)</desc>
|
||||||
|
<iperf_args>-u -b 9M -t 60 -i 1 -R</iperf_args>
|
||||||
|
<iperf_packetloss_threshold>50</iperf_packetloss_threshold>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
<testCase id="040611">
|
||||||
|
<class>Iperf</class>
|
||||||
|
<desc>iperf (10MHz - DL/10Mbps/UDP)(60 sec)</desc>
|
||||||
|
<iperf_args>-u -b 10M -t 60 -i 1</iperf_args>
|
||||||
|
<iperf_packetloss_threshold>50</iperf_packetloss_threshold>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
<testCase id="040612">
|
||||||
|
<class>Iperf</class>
|
||||||
|
<desc>iperf (10MHz - DL/20Mbps/UDP)(60 sec)</desc>
|
||||||
|
<iperf_args>-u -b 20M -t 60 -i 1</iperf_args>
|
||||||
|
<iperf_packetloss_threshold>50</iperf_packetloss_threshold>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
<testCase id="040613">
|
||||||
|
<class>Iperf</class>
|
||||||
|
<desc>iperf (10MHz - DL/30Mbps/UDP)(60 sec)</desc>
|
||||||
|
<iperf_args>-u -b 30M -t 60 -i 1</iperf_args>
|
||||||
|
<iperf_packetloss_threshold>50</iperf_packetloss_threshold>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
<testCase id="040614">
|
||||||
|
<class>Iperf</class>
|
||||||
|
<desc>iperf (10MHz - DL/30Mbps/UDP)(60 sec)(single-ue profile)</desc>
|
||||||
|
<iperf_args>-u -b 30M -t 60 -i 1</iperf_args>
|
||||||
|
<iperf_packetloss_threshold>50</iperf_packetloss_threshold>
|
||||||
|
<iperf_profile>single-ue</iperf_profile>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
<testCase id="040615">
|
||||||
|
<class>Iperf</class>
|
||||||
|
<desc>iperf (10MHz - DL/30Mbps/UDP)(60 sec)(unbalanced profile)</desc>
|
||||||
|
<iperf_args>-u -b 30M -t 60 -i 1</iperf_args>
|
||||||
|
<iperf_packetloss_threshold>50</iperf_packetloss_threshold>
|
||||||
|
<iperf_profile>unbalanced</iperf_profile>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
<testCase id="040651">
|
||||||
|
<class>Iperf</class>
|
||||||
|
<desc>iperf (10MHz - UL/20Mbps/UDP)(60 sec)</desc>
|
||||||
|
<iperf_args>-u -b 20M -t 60 -i 1 -R</iperf_args>
|
||||||
|
<iperf_packetloss_threshold>50</iperf_packetloss_threshold>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
<testCase id="040621">
|
||||||
|
<class>Iperf</class>
|
||||||
|
<desc>iperf (20MHz - DL/20Mbps/UDP)(60 sec)</desc>
|
||||||
|
<iperf_args>-u -b 20M -t 60 -i 1</iperf_args>
|
||||||
|
<iperf_packetloss_threshold>50</iperf_packetloss_threshold>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
<testCase id="040622">
|
||||||
|
<class>Iperf</class>
|
||||||
|
<desc>iperf (20MHz - DL/40Mbps/UDP)(60 sec)</desc>
|
||||||
|
<iperf_args>-u -b 40M -t 60 -i 1</iperf_args>
|
||||||
|
<iperf_packetloss_threshold>50</iperf_packetloss_threshold>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
<testCase id="040623">
|
||||||
|
<class>Iperf</class>
|
||||||
|
<desc>iperf (20MHz - DL/70Mbps/UDP)(60 sec)</desc>
|
||||||
|
<iperf_args>-u -b 70M -t 60 -i 1</iperf_args>
|
||||||
|
<iperf_packetloss_threshold>50</iperf_packetloss_threshold>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
<testCase id="040624">
|
||||||
|
<class>Iperf</class>
|
||||||
|
<desc>iperf (20MHz - DL/70Mbps/UDP)(60 sec)(single-ue profile)</desc>
|
||||||
|
<iperf_args>-u -b 70M -t 60 -i 1</iperf_args>
|
||||||
|
<iperf_packetloss_threshold>50</iperf_packetloss_threshold>
|
||||||
|
<iperf_profile>single-ue</iperf_profile>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
<testCase id="040624">
|
||||||
|
<class>Iperf</class>
|
||||||
|
<desc>iperf (20MHz - DL/70Mbps/UDP)(60 sec)(unbalanced profile)</desc>
|
||||||
|
<iperf_args>-u -b 70M -t 60 -i 1</iperf_args>
|
||||||
|
<iperf_packetloss_threshold>50</iperf_packetloss_threshold>
|
||||||
|
<iperf_profile>unbalanced</iperf_profile>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
<testCase id="040661">
|
||||||
|
<class>Iperf</class>
|
||||||
|
<desc>iperf (20MHz - UL/20Mbps/UDP)(60 sec)</desc>
|
||||||
|
<iperf_args>-u -b 20M -t 60 -i 1 -R</iperf_args>
|
||||||
|
<iperf_packetloss_threshold>50</iperf_packetloss_threshold>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
<testCase id="050101">
|
||||||
|
<class>Initialize_HSS</class>
|
||||||
|
<desc>Initialize HSS</desc>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
<testCase id="060101">
|
||||||
|
<class>Initialize_MME</class>
|
||||||
|
<desc>Initialize MME</desc>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
<testCase id="070101">
|
||||||
|
<class>Initialize_SPGW</class>
|
||||||
|
<desc>Initialize SPGW</desc>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
</testCaseList>
|
||||||
@@ -0,0 +1,65 @@
|
|||||||
|
<!--
|
||||||
|
|
||||||
|
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
|
||||||
|
|
||||||
|
-->
|
||||||
|
<testCaseList>
|
||||||
|
<TestCaseRequestedList>030101 040101 040301 040501 040401 040201 030201</TestCaseRequestedList>
|
||||||
|
<TestCaseExclusionList></TestCaseExclusionList>
|
||||||
|
|
||||||
|
<testCase id="030101">
|
||||||
|
<class>Initialize_eNB</class>
|
||||||
|
<desc>Initialize eNB (FDD/Band1/5MHz/info)</desc>
|
||||||
|
<Initialize_eNB_args>-O ci-scripts/conf_files/enb.band7.tm1.50PRB.usrpb210.conf</Initialize_eNB_args>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
<testCase id="030201">
|
||||||
|
<class>Terminate_eNB</class>
|
||||||
|
<desc>Terminate eNB</desc>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
<testCase id="040101">
|
||||||
|
<class>Initialize_UE</class>
|
||||||
|
<desc>Initialize UE</desc>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
<testCase id="040201">
|
||||||
|
<class>Terminate_UE</class>
|
||||||
|
<desc>Terminate UE</desc>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
<testCase id="040301">
|
||||||
|
<class>Attach_UE</class>
|
||||||
|
<desc>Attach UE</desc>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
<testCase id="040401">
|
||||||
|
<class>Detach_UE</class>
|
||||||
|
<desc>Detach UE</desc>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
<testCase id="040501">
|
||||||
|
<class>Ping</class>
|
||||||
|
<desc>ping (20 sec)</desc>
|
||||||
|
<ping_args>-c 20</ping_args>
|
||||||
|
<ping_packetloss_threshold>5</ping_packetloss_threshold>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
</testCaseList>
|
||||||
@@ -0,0 +1,142 @@
|
|||||||
|
<!--
|
||||||
|
|
||||||
|
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
|
||||||
|
|
||||||
|
-->
|
||||||
|
<testCaseList>
|
||||||
|
<TestCaseRequestedList>010101 050101 060101 070101 030101 030201 050201 070201 060201</TestCaseRequestedList>
|
||||||
|
<TestCaseExclusionList>010102 030102 030103 030104 030105 030106</TestCaseExclusionList>
|
||||||
|
|
||||||
|
<!-- eNB class command references -->
|
||||||
|
|
||||||
|
<testCase id="010101">
|
||||||
|
<class>Build_eNB</class>
|
||||||
|
<desc>Build eNB (USRP)</desc>
|
||||||
|
<Build_eNB_args>-w USRP -x -c --eNB</Build_eNB_args>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
<testCase id="010102">
|
||||||
|
<class>Build_eNB</class>
|
||||||
|
<desc>Build eNB (USRP)</desc>
|
||||||
|
<Build_eNB_args>-w BLADERF -x -c --eNB</Build_eNB_args>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
<testCase id="030101">
|
||||||
|
<class>Initialize_eNB</class>
|
||||||
|
<desc>Initialize eNB (FDD/Band1/5MHz/info)</desc>
|
||||||
|
<Initialize_eNB_args>-O enb.band7.tm1.50PRB.usrpb210.conf</Initialize_eNB_args>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
<testCase id="030102">
|
||||||
|
<class>Initialize_eNB</class>
|
||||||
|
<desc>Initialize eNB (FDD/Band1/10MHz/info)</desc>
|
||||||
|
<Initialize_eNB_args>-O 10M.band1.FDD.info.conf</Initialize_eNB_args>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
<testCase id="030103">
|
||||||
|
<class>Initialize_eNB</class>
|
||||||
|
<desc>Initialize eNB (FDD/Band1/20MHz/info)</desc>
|
||||||
|
<Initialize_eNB_args>-O 20M.band1.FDD.info.conf</Initialize_eNB_args>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
<testCase id="030104">
|
||||||
|
<class>Initialize_eNB</class>
|
||||||
|
<desc>Initialize eNB (TDD/Band38/5MHz/info)</desc>
|
||||||
|
<Initialize_eNB_args>-O 5M.band38.TDD.info.conf</Initialize_eNB_args>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
<testCase id="030105">
|
||||||
|
<class>Initialize_eNB</class>
|
||||||
|
<desc>Initialize eNB (TDD/Band38/10MHz/info)</desc>
|
||||||
|
<Initialize_eNB_args>-O 10M.band38.TDD.info.conf</Initialize_eNB_args>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
<testCase id="030106">
|
||||||
|
<class>Initialize_eNB</class>
|
||||||
|
<desc>Initialize eNB (TDD/Band38/20MHz/info)</desc>
|
||||||
|
<Initialize_eNB_args>-O 20M.band38.TDD.info.conf</Initialize_eNB_args>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
<testCase id="030201">
|
||||||
|
<class>Terminate_eNB</class>
|
||||||
|
<desc>Terminate eNB</desc>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
<!-- UE class command references -->
|
||||||
|
|
||||||
|
<testCase id="040101">
|
||||||
|
<class>Initialize_UE</class>
|
||||||
|
<desc>Initialize UE</desc>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
<testCase id="040201">
|
||||||
|
<class>Terminate_UE</class>
|
||||||
|
<desc>Terminate UE</desc>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
<testCase id="040301">
|
||||||
|
<class>Attach_UE</class>
|
||||||
|
<desc>Attach UE</desc>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
<testCase id="040401">
|
||||||
|
<class>Detach_UE</class>
|
||||||
|
<desc>Detach UE</desc>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
|
||||||
|
<testCase id="040701">
|
||||||
|
<class>Reboot_UE</class>
|
||||||
|
<desc>Reboot UE</desc>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
<!-- EPC class command references -->
|
||||||
|
|
||||||
|
<testCase id="050101">
|
||||||
|
<class>Initialize_HSS</class>
|
||||||
|
<desc>Initialize HSS</desc>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
<testCase id="050201">
|
||||||
|
<class>Terminate_HSS</class>
|
||||||
|
<desc>Terminate HSS</desc>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
<testCase id="060101">
|
||||||
|
<class>Initialize_MME</class>
|
||||||
|
<desc>Initialize MME</desc>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
<testCase id="060201">
|
||||||
|
<class>Terminate_MME</class>
|
||||||
|
<desc>Terminate MME</desc>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
<testCase id="070101">
|
||||||
|
<class>Initialize_SPGW</class>
|
||||||
|
<desc>Initialize SPGW</desc>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
<testCase id="070201">
|
||||||
|
<class>Terminate_SPGW</class>
|
||||||
|
<desc>Terminate SPGW</desc>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
</testCaseList>
|
||||||
+138
-170
@@ -170,7 +170,7 @@ 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 ")
|
"${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!
|
# add autotools definitions that were maybe used!
|
||||||
set(CMAKE_C_FLAGS
|
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 -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 -DASN_DISABLE_OER_SUPPORT -D'MAKE_VERSION(a,b,c)=((a)*256+(b)*16+c)'"
|
||||||
)
|
)
|
||||||
set(CMAKE_CXX_FLAGS
|
set(CMAKE_CXX_FLAGS
|
||||||
"${CMAKE_CXX_FLAGS} ${C_FLAGS_PROCESSOR} -std=c++11 "
|
"${CMAKE_CXX_FLAGS} ${C_FLAGS_PROCESSOR} -std=c++11 "
|
||||||
@@ -244,7 +244,7 @@ add_boolean_option(TEST_OMG False "???")
|
|||||||
add_boolean_option(DEBUG_OMG False "???")
|
add_boolean_option(DEBUG_OMG False "???")
|
||||||
add_boolean_option(XFORMS False "This adds the possibility to see the signal oscilloscope")
|
add_boolean_option(XFORMS False "This adds the possibility to see the signal oscilloscope")
|
||||||
add_boolean_option(PRINT_STATS False "This adds the possibility to see the status")
|
add_boolean_option(PRINT_STATS False "This adds the possibility to see the status")
|
||||||
add_boolean_option(T_TRACER False "Activate the T tracer, a debugging/monitoring framework" )
|
add_boolean_option(T_TRACER True "Activate the T tracer, a debugging/monitoring framework" )
|
||||||
add_boolean_option(UE_AUTOTEST_TRACE False "Activate UE autotest specific logs")
|
add_boolean_option(UE_AUTOTEST_TRACE False "Activate UE autotest specific logs")
|
||||||
add_boolean_option(UE_DEBUG_TRACE False "Activate UE debug trace")
|
add_boolean_option(UE_DEBUG_TRACE False "Activate UE debug trace")
|
||||||
add_boolean_option(UE_TIMING_TRACE False "Activate UE timing trace")
|
add_boolean_option(UE_TIMING_TRACE False "Activate UE timing trace")
|
||||||
@@ -262,7 +262,6 @@ if (${ENABLE_ITTI})
|
|||||||
# add .h files if depend on (this one is generated)
|
# add .h files if depend on (this one is generated)
|
||||||
${ITTI_DIR}/intertask_interface.h
|
${ITTI_DIR}/intertask_interface.h
|
||||||
${ITTI_DIR}/intertask_interface.c
|
${ITTI_DIR}/intertask_interface.c
|
||||||
${ITTI_DIR}/intertask_interface_dump.c
|
|
||||||
${ITTI_DIR}/backtrace.c
|
${ITTI_DIR}/backtrace.c
|
||||||
${ITTI_DIR}/memory_pools.c
|
${ITTI_DIR}/memory_pools.c
|
||||||
${ITTI_DIR}/signals.c
|
${ITTI_DIR}/signals.c
|
||||||
@@ -281,8 +280,8 @@ endif (${ENABLE_ITTI})
|
|||||||
# (so creating new asn.1 objects instead of modifying the object attributes)
|
# (so creating new asn.1 objects instead of modifying the object attributes)
|
||||||
# New C code source file, cmake must be re-run (instead of re-running make only)
|
# New C code source file, cmake must be re-run (instead of re-running make only)
|
||||||
#############
|
#############
|
||||||
set(asn1c_call "${OPENAIR_CMAKE}/tools/generate_asn1")
|
# set(asn1c_call "${OPENAIR_CMAKE}/tools/generate_asn1")
|
||||||
set(fix_asn1c_call "${OPENAIR_CMAKE}/tools/fix_asn1")
|
# set(fix_asn1c_call "${OPENAIR_CMAKE}/tools/fix_asn1")
|
||||||
set(asn1_generated_dir ${OPENAIR_BIN_DIR})
|
set(asn1_generated_dir ${OPENAIR_BIN_DIR})
|
||||||
|
|
||||||
set(protoc_call "${OPENAIR_CMAKE}/tools/generate_protobuf")
|
set(protoc_call "${OPENAIR_CMAKE}/tools/generate_protobuf")
|
||||||
@@ -302,31 +301,35 @@ elseif (${RRC_ASN1_VERSION} STREQUAL "CBA")
|
|||||||
elseif (${RRC_ASN1_VERSION} STREQUAL "Rel10")
|
elseif (${RRC_ASN1_VERSION} STREQUAL "Rel10")
|
||||||
make_version(RRC_VERSION 10 2 0)
|
make_version(RRC_VERSION 10 2 0)
|
||||||
set (RRC_GRAMMAR ${OPENAIR2_DIR}/RRC/LTE/MESSAGES/asn1c/ASN1_files/EUTRA-RRC-Definitions-a20.asn)
|
set (RRC_GRAMMAR ${OPENAIR2_DIR}/RRC/LTE/MESSAGES/asn1c/ASN1_files/EUTRA-RRC-Definitions-a20.asn)
|
||||||
else()
|
elseif (${RRC_ASN1_VERSION} STREQUAL "Rel11")
|
||||||
make_version(RRC_VERSION 14 3 0)
|
make_version(RRC_VERSION 11 18 0)
|
||||||
set (RRC_GRAMMAR ${OPENAIR2_DIR}/RRC/LTE/MESSAGES/asn1c/ASN1_files/RRC-e30.asn)
|
set (RRC_GRAMMAR ${OPENAIR2_DIR}/RRC/LTE/MESSAGES/asn1c/ASN1_files/lte-rrc-11.18.0.asn1)
|
||||||
|
elseif (${RRC_ASN1_VERSION} STREQUAL "Rel12")
|
||||||
|
make_version(RRC_VERSION 12 16 0)
|
||||||
|
set (RRC_GRAMMAR ${OPENAIR2_DIR}/RRC/LTE/MESSAGES/asn1c/ASN1_files/lte-rrc-12.16.0.asn1)
|
||||||
|
elseif (${RRC_ASN1_VERSION} STREQUAL "Rel13")
|
||||||
|
make_version(RRC_VERSION 13 9 1)
|
||||||
|
set (RRC_GRAMMAR ${OPENAIR2_DIR}/RRC/LTE/MESSAGES/asn1c/ASN1_files/lte-rrc-13.9.1.asn1)
|
||||||
|
elseif (${RRC_ASN1_VERSION} STREQUAL "Rel14")
|
||||||
|
make_version(RRC_VERSION 14 7 0)
|
||||||
|
set (RRC_GRAMMAR ${OPENAIR2_DIR}/RRC/LTE/MESSAGES/asn1c/ASN1_files/lte-rrc-14.7.0.asn1)
|
||||||
|
elseif (${RRC_ASN1_VERSION} STREQUAL "Rel15")
|
||||||
|
make_version(RRC_VERSION 15 2 2)
|
||||||
|
set (RRC_GRAMMAR ${OPENAIR2_DIR}/RRC/LTE/MESSAGES/asn1c/ASN1_files/lte-rrc-15.2.2.asn1)
|
||||||
endif (${RRC_ASN1_VERSION} STREQUAL "Rel8")
|
endif (${RRC_ASN1_VERSION} STREQUAL "Rel8")
|
||||||
add_definitions(-DRRC_VERSION=${RRC_VERSION})
|
add_definitions(-DRRC_VERSION=${RRC_VERSION})
|
||||||
set (RRC_FULL_DIR ${asn1_generated_dir}/RRC_${RRC_ASN1_VERSION})
|
set (RRC_FULL_DIR ${asn1_generated_dir}/RRC_${RRC_ASN1_VERSION})
|
||||||
if(NOT EXISTS ${asn1c_call})
|
message("calling asn1c -pdu=all -fcompound-names -gen-PER -no-gen-OER -no-gen-example -D ${RRC_FULL_DIR} ${RRC_GRAMMAR}")
|
||||||
message( FATAL_ERROR "The script ${asn1c_call} must be present" )
|
execute_process(COMMAND mkdir -p ${RRC_FULL_DIR}
|
||||||
endif(NOT EXISTS ${asn1c_call})
|
COMMAND env asn1c -pdu=all -fcompound-names -gen-PER -no-gen-OER -no-gen-example -D ${RRC_FULL_DIR} ${RRC_GRAMMAR}
|
||||||
execute_process(COMMAND ${asn1c_call} ${RRC_FULL_DIR} ${RRC_GRAMMAR}
|
|
||||||
RESULT_VARIABLE ret)
|
RESULT_VARIABLE ret)
|
||||||
if (NOT ${ret} STREQUAL 0)
|
if (NOT ${ret} STREQUAL 0)
|
||||||
message(FATAL_ERROR "${asn1c_call}: error")
|
message(FATAL_ERROR "${ret}: error")
|
||||||
endif (NOT ${ret} STREQUAL 0)
|
|
||||||
if(NOT EXISTS ${fix_asn1c_call})
|
|
||||||
message( FATAL_ERROR "The script ${fix_asn1c_call} must be present" )
|
|
||||||
endif(NOT EXISTS ${fix_asn1c_call})
|
|
||||||
execute_process(COMMAND ${fix_asn1c_call} ${RRC_FULL_DIR} RRC ${RRC_ASN1_VERSION}
|
|
||||||
RESULT_VARIABLE ret)
|
|
||||||
if (NOT ${ret} STREQUAL 0)
|
|
||||||
message(FATAL_ERROR "${fix_asn1c_call}: error")
|
|
||||||
endif (NOT ${ret} STREQUAL 0)
|
endif (NOT ${ret} STREQUAL 0)
|
||||||
|
|
||||||
file(GLOB rrc_source ${RRC_FULL_DIR}/*.c)
|
file(GLOB rrc_source ${RRC_FULL_DIR}/*.c)
|
||||||
file(GLOB rrc_h ${RRC_FULL_DIR}/*.h)
|
file(GLOB rrc_h ${RRC_FULL_DIR}/*.h)
|
||||||
set(rrc_h ${rrc_h} ${RRC_FULL_DIR}/asn1_constants.h)
|
set(rrc_h ${rrc_h} ${RRC_FULL_DIR}/asn_constant.h)
|
||||||
set_source_files_properties(${rrc_source} PROPERTIES COMPILE_FLAGS -w) # suppress warnings from generated code
|
set_source_files_properties(${rrc_source} PROPERTIES COMPILE_FLAGS -w) # suppress warnings from generated code
|
||||||
add_library(RRC_LIB ${rrc_h} ${rrc_source}
|
add_library(RRC_LIB ${rrc_h} ${rrc_source}
|
||||||
${OPENAIR2_DIR}/RRC/LTE/MESSAGES/asn1_msg.c
|
${OPENAIR2_DIR}/RRC/LTE/MESSAGES/asn1_msg.c
|
||||||
@@ -336,9 +339,9 @@ include_directories ("${RRC_FULL_DIR}")
|
|||||||
# add the command to generate the source code
|
# add the command to generate the source code
|
||||||
# Warning: if you modify ASN.1 source file to generate new C files, cmake should be re-run instead of make
|
# Warning: if you modify ASN.1 source file to generate new C files, cmake should be re-run instead of make
|
||||||
add_custom_command (
|
add_custom_command (
|
||||||
OUTPUT ${RRC_FULL_DIR}/asn1_constants.h
|
OUTPUT ${RRC_FULL_DIR}/asn_constant.h
|
||||||
COMMAND ${asn1c_call} ${RRC_FULL_DIR} ${RRC_GRAMMAR}
|
COMMAND mkdir -p ${RRC_FULL_DIR}
|
||||||
COMMAND ${fix_asn1c_call} ${RRC_FULL_DIR} RRC ${RRC_ASN1_VERSION}
|
COMMAND env asn1c -pdu=all -fcompound-names -gen-PER -no-gen-OER -no-gen-example -D ${RRC_FULL_DIR} ${RRC_GRAMMAR}
|
||||||
DEPENDS ${RRC_GRAMMAR}
|
DEPENDS ${RRC_GRAMMAR}
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -346,65 +349,56 @@ add_custom_command (
|
|||||||
# Same limitation as described in RRC: unknown generated file list
|
# Same limitation as described in RRC: unknown generated file list
|
||||||
# so we generate it at cmake time
|
# so we generate it at cmake time
|
||||||
##############
|
##############
|
||||||
add_list1_option(S1AP_RELEASE R10 "S1AP ASN.1 grammar version" R8 R9 R10)
|
add_list1_option(S1AP_RELEASE R14 "S1AP ASN.1 grammar version" R8 R9 R10 R14 R15)
|
||||||
|
|
||||||
set(S1AP_DIR ${OPENAIR3_DIR}/S1AP)
|
set(S1AP_DIR ${OPENAIR3_DIR}/S1AP)
|
||||||
if (${S1AP_RELEASE} STREQUAL "R8")
|
if (${S1AP_RELEASE} STREQUAL "R8")
|
||||||
make_version(S1AP_VERSION 8 10 0)
|
make_version(S1AP_VERSION 8 10 0)
|
||||||
set (ASN1RELDIR R8.10)
|
set(S1AP_ASN_FILES "s1ap-8.10.0.asn1")
|
||||||
elseif (${S1AP_RELEASE} STREQUAL "R9")
|
elseif (${S1AP_RELEASE} STREQUAL "R9")
|
||||||
make_version(S1AP_VERSION 9 8 0)
|
make_version(S1AP_VERSION 9 10 0)
|
||||||
set (ASN1RELDIR R9.8)
|
set(S1AP_ASN_FILES "s1ap-9.10.0.asn1")
|
||||||
elseif (${S1AP_RELEASE} STREQUAL "R10")
|
elseif (${S1AP_RELEASE} STREQUAL "R10")
|
||||||
make_version(S1AP_VERSION 10 5 0)
|
make_version(S1AP_VERSION 10 9 0)
|
||||||
set (ASN1RELDIR R10.5)
|
set(S1AP_ASN_FILES "s1ap-10.9.0.asn1")
|
||||||
|
elseif (${S1AP_RELEASE} STREQUAL "R11")
|
||||||
|
make_version(S1AP_VERSION 11 8 0)
|
||||||
|
set(S1AP_ASN_FILES "s1ap-11.8.0.asn1")
|
||||||
|
elseif (${S1AP_RELEASE} STREQUAL "R12")
|
||||||
|
make_version(S1AP_VERSION 12 7 0)
|
||||||
|
set(S1AP_ASN_FILES "s1ap-12.7.0.asn1")
|
||||||
|
elseif (${S1AP_RELEASE} STREQUAL "R13")
|
||||||
|
make_version(S1AP_VERSION 13 6 0)
|
||||||
|
set(S1AP_ASN_FILES "s1ap-13.6.0.asn1")
|
||||||
|
elseif (${S1AP_RELEASE} STREQUAL "R14")
|
||||||
|
make_version(S1AP_VERSION 14 5 0)
|
||||||
|
set(S1AP_ASN_FILES "s1ap-14.5.0.asn1")
|
||||||
|
else (${S1AP_RELEASE} STREQUAL "R15")
|
||||||
|
make_version(S1AP_VERSION 15 1 0)
|
||||||
|
set(S1AP_ASN_FILES "s1ap-15.1.0.asn1")
|
||||||
endif(${S1AP_RELEASE} STREQUAL "R8")
|
endif(${S1AP_RELEASE} STREQUAL "R8")
|
||||||
add_definitions(-DS1AP_VERSION=${S1AP_VERSION})
|
add_definitions(-DS1AP_VERSION=${S1AP_VERSION})
|
||||||
set(S1AP_ASN_DIR ${S1AP_DIR}/MESSAGES/ASN1/${ASN1RELDIR})
|
set(S1AP_ASN_DIR ${S1AP_DIR}/MESSAGES/ASN1/${S1AP_RELEASE})
|
||||||
set(S1AP_ASN_FILES
|
set(S1AP_C_DIR ${asn1_generated_dir}/S1AP_${S1AP_RELEASE})
|
||||||
${S1AP_ASN_DIR}/S1AP-CommonDataTypes.asn
|
message("calling ASN1C_PREFIX=S1AP_ asn1c -pdu=all -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example -D ${S1AP_C_DIR} ${S1AP_ASN_DIR}/${S1AP_ASN_FILES}")
|
||||||
${S1AP_ASN_DIR}/S1AP-Constants.asn
|
execute_process(COMMAND mkdir -p ${S1AP_C_DIR}
|
||||||
${S1AP_ASN_DIR}/S1AP-IEs.asn
|
COMMAND env "ASN1C_PREFIX=S1AP_" asn1c -pdu=all -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example -D ${S1AP_C_DIR} ${S1AP_ASN_DIR}/${S1AP_ASN_FILES}
|
||||||
${S1AP_ASN_DIR}/S1AP-PDU.asn
|
|
||||||
)
|
|
||||||
set(S1AP_C_DIR ${asn1_generated_dir}/S1AP_${ASN1RELDIR})
|
|
||||||
#message("calling ${asn1c_call} ${S1AP_C_DIR} ${S1AP_ASN_FILES}")
|
|
||||||
execute_process(COMMAND ${asn1c_call} ${S1AP_C_DIR} ${S1AP_ASN_FILES}
|
|
||||||
RESULT_VARIABLE ret)
|
RESULT_VARIABLE ret)
|
||||||
if (NOT ${ret} STREQUAL 0)
|
if (NOT ${ret} STREQUAL 0)
|
||||||
message(FATAL_ERROR "${asn1c_call}: error")
|
message(FATAL_ERROR "${ret}: error")
|
||||||
endif (NOT ${ret} STREQUAL 0)
|
|
||||||
execute_process(COMMAND python ${S1AP_DIR}/MESSAGES/ASN1/asn1tostruct.py -f${S1AP_ASN_DIR}/S1AP-PDU-Contents.asn -o${S1AP_C_DIR}
|
|
||||||
RESULT_VARIABLE ret)
|
|
||||||
if (NOT ${ret} STREQUAL 0)
|
|
||||||
message(FATAL_ERROR "asn1tostruct.py: error")
|
|
||||||
endif (NOT ${ret} STREQUAL 0)
|
|
||||||
execute_process(COMMAND ${fix_asn1c_call} ${S1AP_C_DIR} S1AP ${S1AP_RELEASE}
|
|
||||||
RESULT_VARIABLE ret)
|
|
||||||
if (NOT ${ret} STREQUAL 0)
|
|
||||||
message(FATAL_ERROR "${fix_asn1c_call}: error")
|
|
||||||
endif (NOT ${ret} STREQUAL 0)
|
endif (NOT ${ret} STREQUAL 0)
|
||||||
file(GLOB S1AP_source ${S1AP_C_DIR}/*.c)
|
file(GLOB S1AP_source ${S1AP_C_DIR}/*.c)
|
||||||
|
|
||||||
set(S1AP_OAI_generated
|
|
||||||
${S1AP_C_DIR}/s1ap_decoder.c
|
|
||||||
${S1AP_C_DIR}/s1ap_encoder.c
|
|
||||||
${S1AP_C_DIR}/s1ap_xer_print.c
|
|
||||||
${S1AP_C_DIR}/s1ap_compare.c
|
|
||||||
${S1AP_C_DIR}/s1ap_ies_defs.h
|
|
||||||
)
|
|
||||||
file(GLOB s1ap_h ${S1AP_C_DIR}/*.h)
|
file(GLOB s1ap_h ${S1AP_C_DIR}/*.h)
|
||||||
set(s1ap_h ${s1ap_h} )
|
set(s1ap_h ${s1ap_h})
|
||||||
|
|
||||||
add_custom_command (
|
add_custom_command (
|
||||||
OUTPUT ${S1AP_OAI_generated}
|
OUTPUT ${S1AP_C_DIR}/S1AP_asn_constant.h
|
||||||
COMMAND ${asn1c_call} ${S1AP_C_DIR} ${S1AP_ASN_FILES}
|
COMMAND mkdir -p ${S1AP_C_DIR}
|
||||||
COMMAND python ${S1AP_DIR}/MESSAGES/ASN1/asn1tostruct.py -f${S1AP_ASN_DIR}/S1AP-PDU-Contents.asn -o${S1AP_C_DIR}
|
COMMAND env "ASN1C_PREFIX=S1AP_" asn1c -pdu=all -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example -D ${S1AP_C_DIR} ${S1AP_ASN_DIR}/${S1AP_ASN_FILES}
|
||||||
COMMAND ${fix_asn1c_call} ${S1AP_C_DIR} S1AP ${S1AP_RELEASE}
|
DEPENDS ${S1AP_ASN_DIR}/${S1AP_ASN_FILES}
|
||||||
DEPENDS ${S1AP_ASN_FILES}
|
)
|
||||||
)
|
|
||||||
add_library(S1AP_LIB
|
add_library(S1AP_LIB
|
||||||
${S1AP_OAI_generated}
|
|
||||||
${S1AP_source}
|
${S1AP_source}
|
||||||
${S1AP_DIR}/s1ap_common.c
|
${S1AP_DIR}/s1ap_common.c
|
||||||
)
|
)
|
||||||
@@ -413,7 +407,6 @@ include_directories ("${S1AP_C_DIR}")
|
|||||||
include_directories ("${S1AP_DIR}")
|
include_directories ("${S1AP_DIR}")
|
||||||
|
|
||||||
add_library(S1AP_ENB
|
add_library(S1AP_ENB
|
||||||
${S1AP_C_DIR}/s1ap_ies_defs.h
|
|
||||||
${S1AP_DIR}/s1ap_eNB.c
|
${S1AP_DIR}/s1ap_eNB.c
|
||||||
${S1AP_DIR}/s1ap_eNB_context_management_procedures.c
|
${S1AP_DIR}/s1ap_eNB_context_management_procedures.c
|
||||||
${S1AP_DIR}/s1ap_eNB_decoder.c
|
${S1AP_DIR}/s1ap_eNB_decoder.c
|
||||||
@@ -428,70 +421,52 @@ add_library(S1AP_ENB
|
|||||||
${S1AP_DIR}/s1ap_eNB_ue_context.c
|
${S1AP_DIR}/s1ap_eNB_ue_context.c
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#X2AP
|
#X2AP
|
||||||
# Same limitation as described in RRC/S1AP: unknown generated file list
|
# Same limitation as described in RRC/S1AP: unknown generated file list
|
||||||
# so we generate it at cmake time
|
# so we generate it at cmake time
|
||||||
##############
|
##############
|
||||||
add_list1_option(X2AP_RELEASE R11 "X2AP ASN.1 grammar version" R10 R11)
|
add_list1_option(X2AP_RELEASE R14 "X2AP ASN.1 grammar version" R8 R11 R12 R14 R15)
|
||||||
set(X2AP_DIR ${OPENAIR2_DIR}/X2AP)
|
|
||||||
if (${X2AP_RELEASE} STREQUAL "R10")
|
|
||||||
make_version(S1AP_VERSION 10 0 0)
|
|
||||||
set (ASN1RELDIR R.UNKNOWN)
|
|
||||||
elseif (${X2AP_RELEASE} STREQUAL "R11")
|
|
||||||
make_version(S1AP_VERSION 11 2 0)
|
|
||||||
set (ASN1RELDIR R11.2)
|
|
||||||
endif(${X2AP_RELEASE} STREQUAL "R10")
|
|
||||||
add_definitions(-DX2AP_VERSION=${X2AP_VERSION})
|
|
||||||
set(X2AP_ASN_DIR ${X2AP_DIR}/MESSAGES/ASN1/${ASN1RELDIR})
|
|
||||||
set(X2AP_ASN_FILES
|
|
||||||
${X2AP_ASN_DIR}/X2AP-CommonDataTypes.asn
|
|
||||||
${X2AP_ASN_DIR}/X2AP-Constants.asn
|
|
||||||
${X2AP_ASN_DIR}/X2AP-IEs.asn
|
|
||||||
${X2AP_ASN_DIR}/X2AP-PDU.asn
|
|
||||||
${X2AP_ASN_DIR}/X2AP-Containers.asn
|
|
||||||
)
|
|
||||||
|
|
||||||
set(X2AP_C_DIR ${asn1_generated_dir}/X2AP_${ASN1RELDIR})
|
set(X2AP_DIR ${OPENAIR2_DIR}/X2AP)
|
||||||
#message("calling ${asn1c_call} ${X2AP_C_DIR} ${X2AP_ASN_FILES}")
|
if (${X2AP_RELEASE} STREQUAL "R8")
|
||||||
execute_process(COMMAND ${asn1c_call} ${X2AP_C_DIR} ${X2AP_ASN_FILES}
|
make_version(X2AP_VERSION 8 9 0)
|
||||||
|
set(X2AP_ASN_FILES x2ap-8.9.0.asn1)
|
||||||
|
elseif (${X2AP_RELEASE} STREQUAL "R11")
|
||||||
|
make_version(X2AP_VERSION 11 9 0)
|
||||||
|
set(X2AP_ASN_FILES x2ap-11.9.0.asn1)
|
||||||
|
elseif (${X2AP_RELEASE} STREQUAL "R12")
|
||||||
|
make_version(X2AP_VERSION 12 9 0)
|
||||||
|
set(X2AP_ASN_FILES x2ap-12.9.0.asn1)
|
||||||
|
elseif (${X2AP_RELEASE} STREQUAL "R14")
|
||||||
|
make_version(X2AP_VERSION 14 6 0)
|
||||||
|
set(X2AP_ASN_FILES x2ap-14.6.0.asn1)
|
||||||
|
elseif (${X2AP_RELEASE} STREQUAL "R15")
|
||||||
|
make_version(X2AP_VERSION 15 1 0)
|
||||||
|
set(X2AP_ASN_FILES x2ap-15.1.0.asn1)
|
||||||
|
endif(${X2AP_RELEASE} STREQUAL "R8")
|
||||||
|
add_definitions(-DX2AP_VERSION=${X2AP_VERSION})
|
||||||
|
set(X2AP_ASN_DIR ${X2AP_DIR}/MESSAGES/ASN1/${X2AP_RELEASE})
|
||||||
|
set(X2AP_C_DIR ${asn1_generated_dir}/X2AP_${X2AP_RELEASE})
|
||||||
|
message("calling ASN1C_PREFIX=X2AP_ asn1c -pdu=all -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example -D ${X2AP_C_DIR} ${X2AP_ASN_DIR}/${X2AP_ASN_FILES}")
|
||||||
|
execute_process(COMMAND mkdir -p ${X2AP_C_DIR}
|
||||||
|
COMMAND env "ASN1C_PREFIX=X2AP_" asn1c -pdu=all -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example -D ${X2AP_C_DIR} ${X2AP_ASN_DIR}/${X2AP_ASN_FILES}
|
||||||
RESULT_VARIABLE ret)
|
RESULT_VARIABLE ret)
|
||||||
if (NOT ${ret} STREQUAL 0)
|
if (NOT ${ret} STREQUAL 0)
|
||||||
message(FATAL_ERROR "${asn1c_call}: error")
|
message(FATAL_ERROR "${ret}: error")
|
||||||
endif (NOT ${ret} STREQUAL 0)
|
|
||||||
execute_process(COMMAND python ${X2AP_DIR}/MESSAGES/ASN1/asn1tostruct.py -f ${X2AP_ASN_DIR}/X2AP-PDU-Contents.asn -o ${X2AP_C_DIR}
|
|
||||||
RESULT_VARIABLE ret)
|
|
||||||
if (NOT ${ret} STREQUAL 0)
|
|
||||||
message(FATAL_ERROR "asn1tostruct.py: error")
|
|
||||||
endif (NOT ${ret} STREQUAL 0)
|
|
||||||
execute_process(COMMAND ${fix_asn1c_call} ${X2AP_C_DIR} X2AP ${X2AP_RELEASE}
|
|
||||||
RESULT_VARIABLE ret)
|
|
||||||
if (NOT ${ret} STREQUAL 0)
|
|
||||||
message(FATAL_ERROR "${fix_asn1c_call}: error")
|
|
||||||
endif (NOT ${ret} STREQUAL 0)
|
endif (NOT ${ret} STREQUAL 0)
|
||||||
file(GLOB X2AP_source ${X2AP_C_DIR}/*.c)
|
file(GLOB X2AP_source ${X2AP_C_DIR}/*.c)
|
||||||
|
|
||||||
set(X2AP_OAI_generated
|
|
||||||
${X2AP_C_DIR}/x2ap_decoder.c
|
|
||||||
${X2AP_C_DIR}/x2ap_encoder.c
|
|
||||||
${X2AP_C_DIR}/x2ap_xer_print.c
|
|
||||||
${X2AP_C_DIR}/x2ap_ies_defs.h
|
|
||||||
)
|
|
||||||
file(GLOB x2ap_h ${X2AP_C_DIR}/*.h)
|
file(GLOB x2ap_h ${X2AP_C_DIR}/*.h)
|
||||||
set(x2ap_h ${x2ap_h} )
|
set(x2ap_h ${x2ap_h})
|
||||||
|
|
||||||
#message("calling ${X2AP_DIR}/MESSAGES/ASN1/asn1tostruct.py -f ${X2AP_ASN_DIR}/X2AP-PDU-Contents.asn -o ${X2AP_C_DIR}")
|
|
||||||
add_custom_command (
|
add_custom_command (
|
||||||
OUTPUT ${X2AP_OAI_generated}
|
OUTPUT ${X2AP_C_DIR}/X2AP_asn_constant.h
|
||||||
COMMAND ${asn1c_call} ${X2AP_C_DIR} ${X2AP_ASN_FILES}
|
COMMAND mkdir -p ${X2AP_C_DIR}
|
||||||
COMMAND python ${X2AP_DIR}/MESSAGES/ASN1/asn1tostruct.py -f ${X2AP_ASN_DIR}/X2AP-PDU-Contents.asn -o ${X2AP_C_DIR}
|
COMMAND env "ASN1C_PREFIX=X2AP_" asn1c -pdu=all -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example -D ${X2AP_C_DIR} ${X2AP_ASN_DIR}/${X2AP_ASN_FILES}
|
||||||
COMMAND ${fix_asn1c_call} ${X2AP_C_DIR} X2AP ${X2AP_RELEASE}
|
DEPENDS ${X2AP_ASN_DIR}/${X2AP_ASN_FILES}
|
||||||
DEPENDS ${X2AP_ASN_FILES}
|
|
||||||
)
|
)
|
||||||
|
|
||||||
add_library(X2AP_LIB
|
add_library(X2AP_LIB
|
||||||
${X2AP_OAI_generated}
|
|
||||||
${X2AP_source}
|
${X2AP_source}
|
||||||
${X2AP_DIR}/x2ap_common.c
|
${X2AP_DIR}/x2ap_common.c
|
||||||
)
|
)
|
||||||
@@ -630,6 +605,10 @@ add_boolean_option(MESSAGE_CHART_GENERATOR False "For generating sequenc
|
|||||||
add_boolean_option(MESSAGE_CHART_GENERATOR_RLC_MAC False "trace RLC-MAC exchanges in sequence diagrams")
|
add_boolean_option(MESSAGE_CHART_GENERATOR_RLC_MAC False "trace RLC-MAC exchanges in sequence diagrams")
|
||||||
add_boolean_option(MESSAGE_CHART_GENERATOR_PHY False "trace some PHY exchanges in sequence diagrams")
|
add_boolean_option(MESSAGE_CHART_GENERATOR_PHY False "trace some PHY exchanges in sequence diagrams")
|
||||||
|
|
||||||
|
add_boolean_option(UE_EXPANSION False "enable UE_EXPANSION with max 256 UE")
|
||||||
|
add_boolean_option(PHY_TX_THREAD False "enable UE_EXPANSION with max 256 UE")
|
||||||
|
add_boolean_option(PRE_SCD_THREAD False "enable UE_EXPANSION with max 256 UE")
|
||||||
|
|
||||||
########################
|
########################
|
||||||
# Include order
|
# Include order
|
||||||
##########################
|
##########################
|
||||||
@@ -661,6 +640,7 @@ add_boolean_option(SMBV False "Rohde&Schwarz SMBV100A vector
|
|||||||
add_boolean_option(DEBUG_PHY False "Enable PHY layer debugging options")
|
add_boolean_option(DEBUG_PHY False "Enable PHY layer debugging options")
|
||||||
add_boolean_option(DEBUG_PHY_PROC False "Enable debugging of PHY layer procedures")
|
add_boolean_option(DEBUG_PHY_PROC False "Enable debugging of PHY layer procedures")
|
||||||
add_boolean_option(DEBUG_DLSCH False "Enable debugging of DLSCH physical layer channel")
|
add_boolean_option(DEBUG_DLSCH False "Enable debugging of DLSCH physical layer channel")
|
||||||
|
add_boolean_option(MEX False "Enabling compilation with mex")
|
||||||
|
|
||||||
##########################
|
##########################
|
||||||
# NAS LAYER OPTIONS
|
# NAS LAYER OPTIONS
|
||||||
@@ -917,8 +897,8 @@ set(UTIL_SRC
|
|||||||
${OPENAIR2_DIR}/UTIL/FIFO/pad_list.c
|
${OPENAIR2_DIR}/UTIL/FIFO/pad_list.c
|
||||||
${OPENAIR2_DIR}/UTIL/LISTS/list.c
|
${OPENAIR2_DIR}/UTIL/LISTS/list.c
|
||||||
${OPENAIR2_DIR}/UTIL/LISTS/list2.c
|
${OPENAIR2_DIR}/UTIL/LISTS/list2.c
|
||||||
${OPENAIR2_DIR}/UTIL/LOG/log.c
|
${OPENAIR_DIR}/common/utils/LOG/log.c
|
||||||
${OPENAIR2_DIR}/UTIL/LOG/vcd_signal_dumper.c
|
# ${OPENAIR2_DIR}/UTIL/LOG/vcd_signal_dumper.c
|
||||||
${OPENAIR2_DIR}/UTIL/MATH/oml.c
|
${OPENAIR2_DIR}/UTIL/MATH/oml.c
|
||||||
${OPENAIR2_DIR}/UTIL/MEM/mem_block.c
|
${OPENAIR2_DIR}/UTIL/MEM/mem_block.c
|
||||||
# ${OPENAIR2_DIR}/UTIL/OCG/OCG.c
|
# ${OPENAIR2_DIR}/UTIL/OCG/OCG.c
|
||||||
@@ -1073,13 +1053,14 @@ set(PHY_TURBOIF
|
|||||||
add_library(coding MODULE ${PHY_TURBOSRC} )
|
add_library(coding MODULE ${PHY_TURBOSRC} )
|
||||||
set(PHY_SRC_COMMON
|
set(PHY_SRC_COMMON
|
||||||
# depend on code generation from asn1c
|
# depend on code generation from asn1c
|
||||||
${RRC_FULL_DIR}/asn1_constants.h
|
${RRC_FULL_DIR}/asn_constant.h
|
||||||
# actual source
|
# actual source
|
||||||
${OPENAIR1_DIR}/PHY/LTE_TRANSPORT/dci_tools_common.c
|
${OPENAIR1_DIR}/PHY/LTE_TRANSPORT/dci_tools_common.c
|
||||||
${OPENAIR1_DIR}/PHY/LTE_TRANSPORT/lte_mcs.c
|
${OPENAIR1_DIR}/PHY/LTE_TRANSPORT/lte_mcs.c
|
||||||
# ${OPENAIR1_DIR}/PHY/LTE_TRANSPORT/slss.c
|
# ${OPENAIR1_DIR}/PHY/LTE_TRANSPORT/slss.c
|
||||||
# ${OPENAIR1_DIR}/PHY/LTE_TRANSPORT/sldch.c
|
# ${OPENAIR1_DIR}/PHY/LTE_TRANSPORT/sldch.c
|
||||||
# ${OPENAIR1_DIR}/PHY/LTE_TRANSPORT/slsch.c
|
# ${OPENAIR1_DIR}/PHY/LTE_TRANSPORT/slsch.c
|
||||||
|
${OPENAIR1_DIR}/PHY/LTE_UE_TRANSPORT/get_pmi.c
|
||||||
${OPENAIR1_DIR}/PHY/LTE_TRANSPORT/group_hopping.c
|
${OPENAIR1_DIR}/PHY/LTE_TRANSPORT/group_hopping.c
|
||||||
${OPENAIR1_DIR}/PHY/LTE_TRANSPORT/phich_common.c
|
${OPENAIR1_DIR}/PHY/LTE_TRANSPORT/phich_common.c
|
||||||
${OPENAIR1_DIR}/PHY/LTE_TRANSPORT/pcfich_common.c
|
${OPENAIR1_DIR}/PHY/LTE_TRANSPORT/pcfich_common.c
|
||||||
@@ -1088,6 +1069,7 @@ set(PHY_SRC_COMMON
|
|||||||
${OPENAIR1_DIR}/PHY/LTE_TRANSPORT/prach_common.c
|
${OPENAIR1_DIR}/PHY/LTE_TRANSPORT/prach_common.c
|
||||||
${OPENAIR1_DIR}/PHY/LTE_TRANSPORT/pucch_common.c
|
${OPENAIR1_DIR}/PHY/LTE_TRANSPORT/pucch_common.c
|
||||||
${OPENAIR1_DIR}/PHY/LTE_TRANSPORT/dlsch_scrambling.c
|
${OPENAIR1_DIR}/PHY/LTE_TRANSPORT/dlsch_scrambling.c
|
||||||
|
${OPENAIR1_DIR}/PHY/LTE_TRANSPORT/lte_gold_generic.c
|
||||||
${OPENAIR1_DIR}/PHY/LTE_UE_TRANSPORT/srs_modulation.c
|
${OPENAIR1_DIR}/PHY/LTE_UE_TRANSPORT/srs_modulation.c
|
||||||
${OPENAIR1_DIR}/PHY/MODULATION/ofdm_mod.c
|
${OPENAIR1_DIR}/PHY/MODULATION/ofdm_mod.c
|
||||||
${OPENAIR1_DIR}/PHY/LTE_ESTIMATION/lte_sync_time.c
|
${OPENAIR1_DIR}/PHY/LTE_ESTIMATION/lte_sync_time.c
|
||||||
@@ -1109,7 +1091,6 @@ set(PHY_SRC_COMMON
|
|||||||
${OPENAIR1_DIR}/PHY/INIT/init_top.c
|
${OPENAIR1_DIR}/PHY/INIT/init_top.c
|
||||||
${OPENAIR1_DIR}/PHY/INIT/lte_parms.c
|
${OPENAIR1_DIR}/PHY/INIT/lte_parms.c
|
||||||
${OPENAIR1_DIR}/PHY/INIT/lte_param_init.c
|
${OPENAIR1_DIR}/PHY/INIT/lte_param_init.c
|
||||||
${OPENAIR1_DIR}/PHY/TOOLS/file_output.c
|
|
||||||
${OPENAIR1_DIR}/PHY/TOOLS/cadd_vv.c
|
${OPENAIR1_DIR}/PHY/TOOLS/cadd_vv.c
|
||||||
${OPENAIR1_DIR}/PHY/TOOLS/lte_dfts.c
|
${OPENAIR1_DIR}/PHY/TOOLS/lte_dfts.c
|
||||||
${OPENAIR1_DIR}/PHY/TOOLS/log2_approx.c
|
${OPENAIR1_DIR}/PHY/TOOLS/log2_approx.c
|
||||||
@@ -1170,6 +1151,7 @@ set(PHY_SRC_UE
|
|||||||
${OPENAIR1_DIR}/PHY/LTE_UE_TRANSPORT/sss_ue.c
|
${OPENAIR1_DIR}/PHY/LTE_UE_TRANSPORT/sss_ue.c
|
||||||
${OPENAIR1_DIR}/PHY/LTE_UE_TRANSPORT/dlsch_demodulation.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/dlsch_llr_computation.c
|
||||||
|
${OPENAIR1_DIR}/PHY/LTE_UE_TRANSPORT/linear_preprocessing_rec.c
|
||||||
${OPENAIR1_DIR}/PHY/LTE_UE_TRANSPORT/dlsch_decoding.c
|
${OPENAIR1_DIR}/PHY/LTE_UE_TRANSPORT/dlsch_decoding.c
|
||||||
${OPENAIR1_DIR}/PHY/LTE_UE_TRANSPORT/dci_tools_ue.c
|
${OPENAIR1_DIR}/PHY/LTE_UE_TRANSPORT/dci_tools_ue.c
|
||||||
${OPENAIR1_DIR}/PHY/LTE_UE_TRANSPORT/uci_tools_ue.c
|
${OPENAIR1_DIR}/PHY/LTE_UE_TRANSPORT/uci_tools_ue.c
|
||||||
@@ -1217,6 +1199,32 @@ add_library(PHY ${PHY_SRC})
|
|||||||
add_library(PHY_UE ${PHY_SRC_UE})
|
add_library(PHY_UE ${PHY_SRC_UE})
|
||||||
add_library(PHY_RU ${PHY_SRC_RU})
|
add_library(PHY_RU ${PHY_SRC_RU})
|
||||||
|
|
||||||
|
#Library for mex functions
|
||||||
|
#########################3
|
||||||
|
set(PHY_MEX_UE
|
||||||
|
${OPENAIR1_DIR}/PHY/LTE_UE_TRANSPORT/linear_preprocessing_rec.c
|
||||||
|
${OPENAIR1_DIR}/PHY/LTE_UE_TRANSPORT/dlsch_llr_computation.c
|
||||||
|
${OPENAIR1_DIR}/PHY/LTE_UE_TRANSPORT/dlsch_demodulation.c
|
||||||
|
${OPENAIR1_DIR}/PHY/TOOLS/log2_approx.c
|
||||||
|
${OPENAIR1_DIR}/PHY/LTE_TRANSPORT/lte_mcs.c
|
||||||
|
${OPENAIR1_DIR}/PHY/LTE_UE_TRANSPORT/get_pmi.c
|
||||||
|
${OPENAIR1_DIR}/PHY/TOOLS/dB_routines.c
|
||||||
|
${OPENAIR1_DIR}/PHY/LTE_TRANSPORT/pmch_common.c
|
||||||
|
${OPENAIR1_DIR}/PHY/TOOLS/cadd_vv.c
|
||||||
|
${OPENAIR1_DIR}/PHY/TOOLS/cmult_sv.c
|
||||||
|
${OPENAIR1_DIR}/PHY/TOOLS/cmult_vv.c
|
||||||
|
${OPENAIR1_DIR}/PHY/LTE_UE_TRANSPORT/dlsch_llr_computation_avx2.c
|
||||||
|
${OPENAIR1_DIR}/PHY/TOOLS/signal_energy.c
|
||||||
|
${OPENAIR1_DIR}/PHY/LTE_ESTIMATION/lte_ue_measurements.c
|
||||||
|
${OPENAIR_DIR}/common/utils/LOG/log.c
|
||||||
|
${OPENAIR_DIR}/common/utils/T/T.c
|
||||||
|
${OPENAIR_DIR}/common/utils/T/local_tracer.c
|
||||||
|
${OPENAIR_DIR}/common/config/config_cmdline.c
|
||||||
|
${OPENAIR_DIR}/common/config/config_userapi.c
|
||||||
|
${OPENAIR_DIR}/common/config/config_load_configmodule.c
|
||||||
|
)
|
||||||
|
add_library(PHY_MEX ${PHY_MEX_UE})
|
||||||
|
|
||||||
#Layer 2 library
|
#Layer 2 library
|
||||||
#####################
|
#####################
|
||||||
set(MAC_DIR ${OPENAIR2_DIR}/LAYER2/MAC)
|
set(MAC_DIR ${OPENAIR2_DIR}/LAYER2/MAC)
|
||||||
@@ -1331,6 +1339,7 @@ set (MAC_SRC
|
|||||||
${MAC_DIR}/eNB_scheduler_bch.c
|
${MAC_DIR}/eNB_scheduler_bch.c
|
||||||
${MAC_DIR}/eNB_scheduler_primitives.c
|
${MAC_DIR}/eNB_scheduler_primitives.c
|
||||||
${MAC_DIR}/eNB_scheduler_RA.c
|
${MAC_DIR}/eNB_scheduler_RA.c
|
||||||
|
${MAC_DIR}/eNB_scheduler_fairRR.c
|
||||||
${MAC_DIR}/eNB_scheduler_phytest.c
|
${MAC_DIR}/eNB_scheduler_phytest.c
|
||||||
${MAC_DIR}/pre_processor.c
|
${MAC_DIR}/pre_processor.c
|
||||||
${MAC_DIR}/config.c
|
${MAC_DIR}/config.c
|
||||||
@@ -1811,11 +1820,13 @@ endif()
|
|||||||
# So, here are some hacks here. Hope this gets fixed in future!
|
# So, here are some hacks here. Hope this gets fixed in future!
|
||||||
if(EXISTS "/usr/include/atlas/cblas.h" OR EXISTS "/usr/include/cblas.h")
|
if(EXISTS "/usr/include/atlas/cblas.h" OR EXISTS "/usr/include/cblas.h")
|
||||||
include_directories("/usr/include/atlas")
|
include_directories("/usr/include/atlas")
|
||||||
|
LINK_DIRECTORIES("/usr/lib/lapack")
|
||||||
LINK_DIRECTORIES("/usr/lib64")
|
LINK_DIRECTORIES("/usr/lib64")
|
||||||
LINK_DIRECTORIES("/usr/lib64/atlas") #Added because atlas libraries in CentOS 7 are here!
|
LINK_DIRECTORIES("/usr/lib64/atlas") #Added because atlas libraries in CentOS 7 are here!
|
||||||
|
|
||||||
if(EXISTS "/usr/lib64/libblas.so" OR EXISTS "/usr/lib/libblas.so") #Case for CentOS7
|
if(EXISTS "/usr/lib64/libblas.so" OR EXISTS "/usr/lib/libblas.so") #Case for CentOS7
|
||||||
list(APPEND ATLAS_LIBRARIES blas)
|
list(APPEND ATLAS_LIBRARIES blas)
|
||||||
|
|
||||||
else() # Case for Ubuntu
|
else() # Case for Ubuntu
|
||||||
list(APPEND ATLAS_LIBRARIES cblas)
|
list(APPEND ATLAS_LIBRARIES cblas)
|
||||||
endif()
|
endif()
|
||||||
@@ -1841,6 +1852,8 @@ else()
|
|||||||
message("No Blas/Atlas libs found, some targets will fail")
|
message("No Blas/Atlas libs found, some targets will fail")
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
|
list(APPEND ATLAS_LIBRARIES lapack lapacke)
|
||||||
|
|
||||||
if (${XFORMS})
|
if (${XFORMS})
|
||||||
include_directories ("/usr/include/X11")
|
include_directories ("/usr/include/X11")
|
||||||
set(XFORMS_SOURCE
|
set(XFORMS_SOURCE
|
||||||
@@ -1898,7 +1911,6 @@ add_definitions(-DASN1_MINIMUM_VERSION=924)
|
|||||||
add_executable(lte-softmodem
|
add_executable(lte-softmodem
|
||||||
${rrc_h}
|
${rrc_h}
|
||||||
${s1ap_h}
|
${s1ap_h}
|
||||||
${OPENAIR_BIN_DIR}/messages_xml.h
|
|
||||||
${OPENAIR_TARGETS}/RT/USER/rt_wrapper.c
|
${OPENAIR_TARGETS}/RT/USER/rt_wrapper.c
|
||||||
${OPENAIR_TARGETS}/RT/USER/lte-enb.c
|
${OPENAIR_TARGETS}/RT/USER/lte-enb.c
|
||||||
${OPENAIR_TARGETS}/RT/USER/lte-ru.c
|
${OPENAIR_TARGETS}/RT/USER/lte-ru.c
|
||||||
@@ -1939,7 +1951,6 @@ target_link_libraries (lte-softmodem ${T_LIB})
|
|||||||
add_executable(lte-softmodem-nos1
|
add_executable(lte-softmodem-nos1
|
||||||
${rrc_h}
|
${rrc_h}
|
||||||
${s1ap_h}
|
${s1ap_h}
|
||||||
${OPENAIR_BIN_DIR}/messages_xml.h
|
|
||||||
${OPENAIR_TARGETS}/RT/USER/rt_wrapper.c
|
${OPENAIR_TARGETS}/RT/USER/rt_wrapper.c
|
||||||
${OPENAIR_TARGETS}/RT/USER/lte-enb.c
|
${OPENAIR_TARGETS}/RT/USER/lte-enb.c
|
||||||
${OPENAIR_TARGETS}/RT/USER/lte-ru.c
|
${OPENAIR_TARGETS}/RT/USER/lte-ru.c
|
||||||
@@ -1979,7 +1990,6 @@ target_link_libraries (lte-softmodem-nos1 ${T_LIB})
|
|||||||
add_executable(lte-uesoftmodem
|
add_executable(lte-uesoftmodem
|
||||||
${rrc_h}
|
${rrc_h}
|
||||||
${s1ap_h}
|
${s1ap_h}
|
||||||
${OPENAIR_BIN_DIR}/messages_xml.h
|
|
||||||
${OPENAIR_TARGETS}/RT/USER/rt_wrapper.c
|
${OPENAIR_TARGETS}/RT/USER/rt_wrapper.c
|
||||||
${OPENAIR_TARGETS}/RT/USER/lte-ue.c
|
${OPENAIR_TARGETS}/RT/USER/lte-ue.c
|
||||||
${OPENAIR_TARGETS}/RT/USER/lte-uesoftmodem.c
|
${OPENAIR_TARGETS}/RT/USER/lte-uesoftmodem.c
|
||||||
@@ -2005,7 +2015,7 @@ add_executable(lte-uesoftmodem
|
|||||||
target_link_libraries (lte-uesoftmodem
|
target_link_libraries (lte-uesoftmodem
|
||||||
-Wl,--start-group
|
-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 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
|
${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
|
NFAPI_COMMON_LIB NFAPI_LIB NFAPI_PNF_LIB NFAPI_USER_LIB
|
||||||
-Wl,--end-group z dl)
|
-Wl,--end-group z dl)
|
||||||
|
|
||||||
@@ -2019,7 +2029,6 @@ target_link_libraries (lte-uesoftmodem ${T_LIB})
|
|||||||
add_executable(lte-uesoftmodem-nos1
|
add_executable(lte-uesoftmodem-nos1
|
||||||
${rrc_h}
|
${rrc_h}
|
||||||
${s1ap_h}
|
${s1ap_h}
|
||||||
${OPENAIR_BIN_DIR}/messages_xml.h
|
|
||||||
${OPENAIR_TARGETS}/RT/USER/rt_wrapper.c
|
${OPENAIR_TARGETS}/RT/USER/rt_wrapper.c
|
||||||
${OPENAIR_TARGETS}/RT/USER/lte-ue.c
|
${OPENAIR_TARGETS}/RT/USER/lte-ue.c
|
||||||
${OPENAIR_TARGETS}/RT/USER/lte-uesoftmodem.c
|
${OPENAIR_TARGETS}/RT/USER/lte-uesoftmodem.c
|
||||||
@@ -2046,7 +2055,7 @@ add_executable(lte-uesoftmodem-nos1
|
|||||||
target_link_libraries (lte-uesoftmodem-nos1
|
target_link_libraries (lte-uesoftmodem-nos1
|
||||||
-Wl,--start-group
|
-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 ${MSC_LIB} ${RAL_LIB} ${ITTI_LIB}
|
||||||
${MIH_LIB} ${FLPT_MSG_LIB} ${ASYNC_IF_LIB} LFDS7
|
${MIH_LIB} ${FLPT_MSG_LIB} ${ASYNC_IF_LIB} LFDS7 ${ATLAS_LIBRARIES}
|
||||||
NFAPI_COMMON_LIB NFAPI_LIB NFAPI_PNF_LIB NFAPI_USER_LIB
|
NFAPI_COMMON_LIB NFAPI_LIB NFAPI_PNF_LIB NFAPI_USER_LIB
|
||||||
-Wl,--end-group z dl )
|
-Wl,--end-group z dl )
|
||||||
|
|
||||||
@@ -2088,7 +2097,6 @@ target_link_libraries (lte-uesoftmodem-nos1 ${T_LIB})
|
|||||||
|
|
||||||
#special case for dlim TM4, which uses its own version of phy_scope code
|
#special case for dlim TM4, which uses its own version of phy_scope code
|
||||||
add_executable(dlsim_tm4
|
add_executable(dlsim_tm4
|
||||||
# ${OPENAIR_BIN_DIR}/messages_xml.h
|
|
||||||
${OPENAIR1_DIR}/SIMULATION/LTE_PHY/dlsim_tm4.c
|
${OPENAIR1_DIR}/SIMULATION/LTE_PHY/dlsim_tm4.c
|
||||||
${OPENAIR1_DIR}/PHY/TOOLS/lte_phy_scope_tm4.c
|
${OPENAIR1_DIR}/PHY/TOOLS/lte_phy_scope_tm4.c
|
||||||
${T_SOURCE}
|
${T_SOURCE}
|
||||||
@@ -2101,7 +2109,6 @@ target_link_libraries (dlsim_tm4
|
|||||||
foreach(myExe dlsim dlsim_tm7 ulsim pbchsim scansim mbmssim pdcchsim pucchsim prachsim syncsim)
|
foreach(myExe dlsim dlsim_tm7 ulsim pbchsim scansim mbmssim pdcchsim pucchsim prachsim syncsim)
|
||||||
|
|
||||||
add_executable(${myExe}
|
add_executable(${myExe}
|
||||||
# ${OPENAIR_BIN_DIR}/messages_xml.h
|
|
||||||
${OPENAIR1_DIR}/SIMULATION/LTE_PHY/${myExe}.c
|
${OPENAIR1_DIR}/SIMULATION/LTE_PHY/${myExe}.c
|
||||||
${XFORMS_SOURCE}
|
${XFORMS_SOURCE}
|
||||||
${T_SOURCE}
|
${T_SOURCE}
|
||||||
@@ -2123,7 +2130,6 @@ add_executable(test_epc_generate_scenario
|
|||||||
${OPENAIR2_DIR}/COMMON/messages_def.h
|
${OPENAIR2_DIR}/COMMON/messages_def.h
|
||||||
${OPENAIR2_DIR}/COMMON/messages_types.h
|
${OPENAIR2_DIR}/COMMON/messages_types.h
|
||||||
${OPENAIR3_DIR}/S1AP/s1ap_eNB_defs.h
|
${OPENAIR3_DIR}/S1AP/s1ap_eNB_defs.h
|
||||||
# ${OPENAIR_BIN_DIR}/messages_xml.h
|
|
||||||
)
|
)
|
||||||
target_link_libraries (test_epc_generate_scenario
|
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 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}
|
||||||
@@ -2143,7 +2149,6 @@ add_executable(test_epc_play_scenario
|
|||||||
${OPENAIR2_DIR}/COMMON/commonDef.h
|
${OPENAIR2_DIR}/COMMON/commonDef.h
|
||||||
${OPENAIR2_DIR}/COMMON/messages_def.h
|
${OPENAIR2_DIR}/COMMON/messages_def.h
|
||||||
${OPENAIR2_DIR}/COMMON/messages_types.h
|
${OPENAIR2_DIR}/COMMON/messages_types.h
|
||||||
${OPENAIR_BIN_DIR}/messages_xml.h
|
|
||||||
)
|
)
|
||||||
target_include_directories(test_epc_play_scenario PUBLIC /usr/local/share/asn1c)
|
target_include_directories(test_epc_play_scenario PUBLIC /usr/local/share/asn1c)
|
||||||
target_link_libraries (test_epc_play_scenario
|
target_link_libraries (test_epc_play_scenario
|
||||||
@@ -2179,16 +2184,16 @@ endforeach(myExe)
|
|||||||
if (${T_TRACER})
|
if (${T_TRACER})
|
||||||
foreach(i
|
foreach(i
|
||||||
#all "add_executable" definitions (except tests, rb_tool, updatefw)
|
#all "add_executable" definitions (except tests, rb_tool, updatefw)
|
||||||
lte-softmodem lte-softmodem-nos1
|
lte-softmodem lte-softmodem-nos1 lte-uesoftmodem lte-uesoftmodem-nos1
|
||||||
dlsim_tm4 dlsim dlsim_tm7 ulsim pbchsim scansim mbmssim
|
dlsim_tm4 dlsim dlsim_tm7 ulsim pbchsim scansim mbmssim
|
||||||
pdcchsim pucchsim prachsim syncsim
|
pdcchsim pucchsim prachsim syncsim ulsim
|
||||||
#all "add_library" definitions
|
#all "add_library" definitions
|
||||||
ITTI RRC_LIB S1AP_LIB S1AP_ENB X2AP_LIB
|
ITTI RRC_LIB S1AP_LIB S1AP_ENB X2AP_LIB
|
||||||
oai_exmimodevif oai_usrpdevif oai_bladerfdevif oai_lmssdrdevif
|
oai_exmimodevif oai_usrpdevif oai_bladerfdevif oai_lmssdrdevif
|
||||||
oai_eth_transpro
|
oai_eth_transpro
|
||||||
FLPT_MSG ASYNC_IF FLEXRAN_AGENT HASHTABLE MSC UTIL OMG_SUMO SECU_OSA
|
FLPT_MSG ASYNC_IF FLEXRAN_AGENT HASHTABLE MSC UTIL OMG_SUMO SECU_OSA
|
||||||
SECU_CN SCHED_LIB PHY L2 default_sched remote_sched RAL CN_UTILS
|
SECU_CN SCHED_LIB PHY L2 default_sched remote_sched RAL CN_UTILS
|
||||||
GTPV1U SCTP_CLIENT UDP LIB_NAS_UE LFDS LFDS7 SIMU OPENAIR0_LIB)
|
GTPV1U SCTP_CLIENT UDP LIB_NAS_UE LFDS LFDS7 SIMU OPENAIR0_LIB PHY_MEX)
|
||||||
if (TARGET ${i})
|
if (TARGET ${i})
|
||||||
add_dependencies(${i} generate_T)
|
add_dependencies(${i} generate_T)
|
||||||
endif()
|
endif()
|
||||||
@@ -2199,43 +2204,6 @@ endif (${T_TRACER})
|
|||||||
# Generated specific cases is not regular code
|
# Generated specific cases is not regular code
|
||||||
###############################################
|
###############################################
|
||||||
|
|
||||||
##################""
|
|
||||||
# itti symbolic debug print require to generate a specific include file
|
|
||||||
########################################
|
|
||||||
|
|
||||||
# retrieve the compiler options to send it to gccxml
|
|
||||||
get_directory_property( DirDefs COMPILE_DEFINITIONS )
|
|
||||||
foreach( d ${DirDefs} )
|
|
||||||
list(APPEND itti_compiler_options "-D${d}")
|
|
||||||
endforeach()
|
|
||||||
get_directory_property( DirDefs INCLUDE_DIRECTORIES )
|
|
||||||
foreach( d ${DirDefs} )
|
|
||||||
list(APPEND itti_compiler_options "-I${d}")
|
|
||||||
endforeach()
|
|
||||||
|
|
||||||
# castxml doesn't work with c11 (gcc 5 default)
|
|
||||||
# force castxml and clang compilation with gnu89 standard
|
|
||||||
# we can't use cXX standard as pthread_rwlock_t is gnu standard
|
|
||||||
list(APPEND itti_compiler_options "-std=gnu89;-D'MAKE_VERSION(a,b,c)=((a)*256+(b)*16+c)'")
|
|
||||||
set (ITTI_H ${ITTI_DIR}/intertask_interface_types.h)
|
|
||||||
if(EXISTS /usr/bin/gccxml)
|
|
||||||
set(xml_command gccxml ${itti_compiler_options} -fxml=${OPENAIR_BIN_DIR}/messages.xml ${ITTI_H})
|
|
||||||
else()
|
|
||||||
set(xml_command castxml --castxml-gccxml ${itti_compiler_options} ${ITTI_H} -o ${OPENAIR_BIN_DIR}/messages.xml)
|
|
||||||
endif()
|
|
||||||
|
|
||||||
add_custom_command (
|
|
||||||
OUTPUT ${OPENAIR_BIN_DIR}/messages.xml
|
|
||||||
COMMAND ${xml_command}
|
|
||||||
DEPENDS ${S1AP_OAI_generated} ${RRC_FULL_DIR}/asn1_constants.h
|
|
||||||
)
|
|
||||||
|
|
||||||
add_custom_command (
|
|
||||||
OUTPUT ${OPENAIR_BIN_DIR}/messages_xml.h
|
|
||||||
COMMAND sed -e 's/ *//' -e 's/\"/\\\\\"/g' -e 's/^/\"/' -e 's/$$/\\\\n\"/' ${OPENAIR_BIN_DIR}/messages.xml > ${OPENAIR_BIN_DIR}/messages_xml.h
|
|
||||||
DEPENDS ${OPENAIR_BIN_DIR}/messages.xml ${RRC_FULL_DIR}/asn1_constants.h
|
|
||||||
)
|
|
||||||
|
|
||||||
################
|
################
|
||||||
# Kernel modules
|
# Kernel modules
|
||||||
###############
|
###############
|
||||||
|
|||||||
@@ -175,10 +175,10 @@ function test_compile() {
|
|||||||
fi
|
fi
|
||||||
if [ "$result" == "1" ]; then
|
if [ "$result" == "1" ]; then
|
||||||
echo_success "$test_case_name.${tags} PASSED"
|
echo_success "$test_case_name.${tags} PASSED"
|
||||||
xUnit_success "compilation" "$test_case_name.$tags" "PASS" "$result_string" "$xmlfile_testcase"
|
xUnit_success "compilation" "$test_case_name.$tags" "PASS" "$result_string" "$xmlfile_testcase" ""
|
||||||
else
|
else
|
||||||
echo_error "$test_case_name.${tags} FAILED"
|
echo_error "$test_case_name.${tags} FAILED"
|
||||||
xUnit_fail "compilation" "$test_case_name.$tags" "FAIL" "$result_string" "$xmlfile_testcase"
|
xUnit_fail "compilation" "$test_case_name.$tags" "FAIL" "$result_string" "$xmlfile_testcase" ""
|
||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -200,6 +200,8 @@ function test_compile() {
|
|||||||
#\param $14 -> tags to help identify the test case for readability in output xml file
|
#\param $14 -> tags to help identify the test case for readability in output xml file
|
||||||
#\param $15 => password for the user to run certain commands as sudo
|
#\param $15 => password for the user to run certain commands as sudo
|
||||||
#\param $16 => test config file params to be modified
|
#\param $16 => test config file params to be modified
|
||||||
|
#\param $17 => bypass flag if main_exec if available
|
||||||
|
#\param $18 -> desc to help identify the test case for readability in output xml file
|
||||||
|
|
||||||
function test_compile_and_run() {
|
function test_compile_and_run() {
|
||||||
xUnit_start
|
xUnit_start
|
||||||
@@ -221,6 +223,8 @@ function test_compile_and_run() {
|
|||||||
tags=${14}
|
tags=${14}
|
||||||
mypassword=${15}
|
mypassword=${15}
|
||||||
test_config_file=${16}
|
test_config_file=${16}
|
||||||
|
bypass_compile=${17}
|
||||||
|
desc=${18}
|
||||||
|
|
||||||
build_dir=$tdir/$1/build
|
build_dir=$tdir/$1/build
|
||||||
#exec_file=$build_dir/$6
|
#exec_file=$build_dir/$6
|
||||||
@@ -231,8 +235,6 @@ function test_compile_and_run() {
|
|||||||
rm -fr $log_dir
|
rm -fr $log_dir
|
||||||
mkdir -p $log_dir
|
mkdir -p $log_dir
|
||||||
|
|
||||||
rm -fr $OPENAIR_DIR/cmake_targets/log
|
|
||||||
|
|
||||||
echo "" > $temp_exec_log
|
echo "" > $temp_exec_log
|
||||||
echo "" > $log_file
|
echo "" > $log_file
|
||||||
#echo "log_dir = $log_dir"
|
#echo "log_dir = $log_dir"
|
||||||
@@ -243,6 +245,7 @@ function test_compile_and_run() {
|
|||||||
#echo "pre_exec_file = $pre_exec_file"
|
#echo "pre_exec_file = $pre_exec_file"
|
||||||
#echo "nruns = $nruns"
|
#echo "nruns = $nruns"
|
||||||
echo "class = $class"
|
echo "class = $class"
|
||||||
|
#echo "desc = $desc"
|
||||||
|
|
||||||
#compile_prog_array=()
|
#compile_prog_array=()
|
||||||
#read -a compile_prog_array <<<"$compile_prog"
|
#read -a compile_prog_array <<<"$compile_prog"
|
||||||
@@ -253,10 +256,18 @@ function test_compile_and_run() {
|
|||||||
|
|
||||||
tags_array=()
|
tags_array=()
|
||||||
read -a tags_array <<<"$tags"
|
read -a tags_array <<<"$tags"
|
||||||
|
desc_array=()
|
||||||
|
readarray -t desc_array <<<"$desc"
|
||||||
|
|
||||||
main_exec_args_array=()
|
main_exec_args_array=()
|
||||||
readarray -t main_exec_args_array <<< "$exec_args"
|
readarray -t main_exec_args_array <<< "$exec_args"
|
||||||
|
|
||||||
|
REAL_MAIN_EXEC=`eval "echo $main_exec"`
|
||||||
|
if [ "$bypass_compile" == "1" ] && [ -f $REAL_MAIN_EXEC ]
|
||||||
|
then
|
||||||
|
echo "Bypassing compilation for $main_exec"
|
||||||
|
else
|
||||||
|
rm -fr $OPENAIR_DIR/cmake_targets/log
|
||||||
|
|
||||||
#for search_expr in "${compile_prog_array[@]}"
|
#for search_expr in "${compile_prog_array[@]}"
|
||||||
#do
|
#do
|
||||||
@@ -283,6 +294,7 @@ function test_compile_and_run() {
|
|||||||
}>> $log_file 2>&1
|
}>> $log_file 2>&1
|
||||||
echo "</COMPILATION LOG>" >> $log_file 2>&1
|
echo "</COMPILATION LOG>" >> $log_file 2>&1
|
||||||
#done
|
#done
|
||||||
|
fi
|
||||||
|
|
||||||
#process the test case if it is that of execution
|
#process the test case if it is that of execution
|
||||||
if [ "$class" == "execution" ]; then
|
if [ "$class" == "execution" ]; then
|
||||||
@@ -291,6 +303,7 @@ function test_compile_and_run() {
|
|||||||
do
|
do
|
||||||
global_result=1
|
global_result=1
|
||||||
result_string=""
|
result_string=""
|
||||||
|
PROPER_DESC=`echo ${desc_array[$tags_array_index]} | sed -e "s@^.*lsim.*est case.*(Test@Test@" -e "s@^ *(@@" -e "s/),$//"`
|
||||||
|
|
||||||
for (( run_index=1; run_index <= $nruns; run_index++ ))
|
for (( run_index=1; run_index <= $nruns; run_index++ ))
|
||||||
do
|
do
|
||||||
@@ -359,16 +372,16 @@ function test_compile_and_run() {
|
|||||||
|
|
||||||
if [ "$result_string" == "" ]; then
|
if [ "$result_string" == "" ]; then
|
||||||
echo_error "execution $test_case_name.$compile_prog.${tags_array[$tags_array_index]} Run_Result = \"$result_string\" Result = FAIL"
|
echo_error "execution $test_case_name.$compile_prog.${tags_array[$tags_array_index]} Run_Result = \"$result_string\" Result = FAIL"
|
||||||
xUnit_fail "execution" "$test_case_name.${tags_array[$tags_array_index]}" "FAIL" "$result_string" "$xmlfile_testcase"
|
xUnit_fail "execution" "$test_case_name.${tags_array[$tags_array_index]}" "FAIL" "$result_string" "$xmlfile_testcase" "$PROPER_DESC"
|
||||||
else
|
else
|
||||||
if [ "$global_result" == "0" ]; then
|
if [ "$global_result" == "0" ]; then
|
||||||
echo_error "execution $test_case_name.${tags_array[$tags_array_index]} Run_Result = \"$result_string\" Result = FAIL"
|
echo_error "execution $test_case_name.${tags_array[$tags_array_index]} Run_Result = \"$result_string\" Result = FAIL"
|
||||||
xUnit_fail "execution" "$test_case_name.${tags_array[$tags_array_index]}" "FAIL" "$result_string" "$xmlfile_testcase"
|
xUnit_fail "execution" "$test_case_name.${tags_array[$tags_array_index]}" "FAIL" "$result_string" "$xmlfile_testcase" "$PROPER_DESC"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if [ "$global_result" == "1" ]; then
|
if [ "$global_result" == "1" ]; then
|
||||||
echo_success "execution $test_case_name.${tags_array[$tags_array_index]} Run_Result = \"$result_string\" Result = PASS "
|
echo_success "execution $test_case_name.${tags_array[$tags_array_index]} Run_Result = \"$result_string\" Result = PASS "
|
||||||
xUnit_success "execution" "$test_case_name.${tags_array[$tags_array_index]}" "PASS" "$result_string" "$xmlfile_testcase"
|
xUnit_success "execution" "$test_case_name.${tags_array[$tags_array_index]}" "PASS" "$result_string" "$xmlfile_testcase" "$PROPER_DESC"
|
||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
|
|
||||||
@@ -393,10 +406,18 @@ Options
|
|||||||
Run test cases in a group. For example, ./run_exec_autotests "0101* 010102"
|
Run test cases in a group. For example, ./run_exec_autotests "0101* 010102"
|
||||||
-p
|
-p
|
||||||
Use password for logging
|
Use password for logging
|
||||||
|
-np | --no-password
|
||||||
|
No need for a password
|
||||||
|
-q | --quiet
|
||||||
|
Quiet mode; eliminate informational messages and comment prompts.
|
||||||
|
-b | --bypass-compile
|
||||||
|
Bypass compilation of main-exec if already present
|
||||||
'
|
'
|
||||||
}
|
}
|
||||||
|
|
||||||
function main () {
|
function main () {
|
||||||
|
QUIET=0
|
||||||
|
BYPASS_COMPILE=0
|
||||||
RUN_GROUP=0
|
RUN_GROUP=0
|
||||||
SET_PASSWORD=0
|
SET_PASSWORD=0
|
||||||
passwd=""
|
passwd=""
|
||||||
@@ -419,6 +440,16 @@ until [ -z "$1" ]
|
|||||||
SET_PASSWORD=1
|
SET_PASSWORD=1
|
||||||
passwd=$2
|
passwd=$2
|
||||||
shift 2;;
|
shift 2;;
|
||||||
|
-np|--no-password)
|
||||||
|
SET_PASSWORD=1
|
||||||
|
shift ;;
|
||||||
|
-q|--quiet)
|
||||||
|
QUIET=1
|
||||||
|
shift ;;
|
||||||
|
-b|--bypass-compile)
|
||||||
|
BYPASS_COMPILE=1
|
||||||
|
echo "bypass option ON"
|
||||||
|
shift ;;
|
||||||
-h | --help)
|
-h | --help)
|
||||||
print_help
|
print_help
|
||||||
exit 1;;
|
exit 1;;
|
||||||
@@ -449,15 +480,15 @@ xml_conf="$OPENAIR_DIR/cmake_targets/autotests/test_case_list.xml"
|
|||||||
|
|
||||||
test_case_list=`xmlstarlet sel -T -t -m /testCaseList/testCase -s A:N:- "@id" -v "@id" -n $xml_conf`
|
test_case_list=`xmlstarlet sel -T -t -m /testCaseList/testCase -s A:N:- "@id" -v "@id" -n $xml_conf`
|
||||||
test_case_excl_list=`xmlstarlet sel -t -v "/testCaseList/TestCaseExclusionList" $xml_conf`
|
test_case_excl_list=`xmlstarlet sel -t -v "/testCaseList/TestCaseExclusionList" $xml_conf`
|
||||||
echo "Test Case Exclusion List = $test_case_excl_list "
|
if [ $QUIET -eq 0 ]; then echo "Test Case Exclusion List = $test_case_excl_list "; fi
|
||||||
|
|
||||||
test_case_excl_list=`sed "s/\+/\*/g" <<< "$test_case_excl_list" ` # Replace + with * for bash string substituion
|
test_case_excl_list=`sed "s/\+/\*/g" <<< "$test_case_excl_list" ` # Replace + with * for bash string substituion
|
||||||
|
|
||||||
read -a test_case_excl_array <<< "$test_case_excl_list"
|
read -a test_case_excl_array <<< "$test_case_excl_list"
|
||||||
|
|
||||||
echo "test_case_list = $test_case_list"
|
if [ $QUIET -eq 0 ]; then echo "test_case_list = $test_case_list"; fi
|
||||||
|
|
||||||
echo "Test Case Exclusion List = $test_case_excl_list \n"
|
if [ $QUIET -eq 0 ]; then echo "Test Case Exclusion List = $test_case_excl_list \n"; fi
|
||||||
|
|
||||||
readarray -t test_case_array <<<"$test_case_list"
|
readarray -t test_case_array <<<"$test_case_list"
|
||||||
|
|
||||||
@@ -484,7 +515,7 @@ for search_expr in "${test_case_array[@]}"
|
|||||||
do
|
do
|
||||||
if [[ $search_expr == $search_excl ]];then
|
if [[ $search_expr == $search_excl ]];then
|
||||||
flag_run_test_case=0
|
flag_run_test_case=0
|
||||||
echo_info "Test case $search_expr match found in test case excl group. Will skip the test case for execution..."
|
if [ $QUIET -eq 0 ]; then echo_info "Test case $search_expr match found in test case excl group. Will skip the test case for execution..."; fi
|
||||||
break
|
break
|
||||||
fi
|
fi
|
||||||
done
|
done
|
||||||
@@ -533,8 +564,8 @@ for search_expr in "${test_case_array[@]}"
|
|||||||
|
|
||||||
search_array_true=()
|
search_array_true=()
|
||||||
|
|
||||||
IFS=\" #set the shell's field separator
|
IFS=\" #set the shell field separator
|
||||||
set -f #don't try to glob
|
set -f #dont try to glob
|
||||||
#set -- $search_expr_true #split on $IFS
|
#set -- $search_expr_true #split on $IFS
|
||||||
for i in $search_expr_true
|
for i in $search_expr_true
|
||||||
do echo "i = $i"
|
do echo "i = $i"
|
||||||
@@ -548,10 +579,10 @@ for search_expr in "${test_case_array[@]}"
|
|||||||
#echo "arg1 = ${search_array_true[0]}"
|
#echo "arg1 = ${search_array_true[0]}"
|
||||||
#echo " arg2 = ${search_array_true[1]}"
|
#echo " arg2 = ${search_array_true[1]}"
|
||||||
if [ "$class" == "compilation" ]; then
|
if [ "$class" == "compilation" ]; then
|
||||||
test_compile "$name" "$compile_prog" "$compile_prog_args" "$pre_exec" "$pre_exec_args" "$main_exec" "$main_exec_args" "search_array_true[@]" "$search_expr_false" "$nruns" "$pre_compile_prog" "$class" "$compile_prog_out" "$tags"
|
test_compile "$name" "$compile_prog" "$compile_prog_args" "$pre_exec" "$pre_exec_args" "$main_exec" "$main_exec_args" "search_array_true[@]" "$search_expr_false" "$nruns" "$pre_compile_prog" "$class" "$compile_prog_out" "$tags" "$desc"
|
||||||
elif [ "$class" == "execution" ]; then
|
elif [ "$class" == "execution" ]; then
|
||||||
echo \'passwd\' | $SUDO killall -q oaisim_nos1
|
echo \'passwd\' | $SUDO killall -q oaisim_nos1
|
||||||
test_compile_and_run "$name" "$compile_prog" "$compile_prog_args" "$pre_exec" "$pre_exec_args" "$main_exec" "$main_exec_args" "search_array_true[@]" "$search_expr_false" "$nruns" "$pre_compile_prog" "$class" "$compile_prog_out" "$tags" "$mypassword" "$test_config_file"
|
test_compile_and_run "$name" "$compile_prog" "$compile_prog_args" "$pre_exec" "$pre_exec_args" "$main_exec" "$main_exec_args" "search_array_true[@]" "$search_expr_false" "$nruns" "$pre_compile_prog" "$class" "$compile_prog_out" "$tags" "$mypassword" "$test_config_file" "$BYPASS_COMPILE" "$desc"
|
||||||
else
|
else
|
||||||
echo "Unexpected class of test case...Skipping the test case $name ...."
|
echo "Unexpected class of test case...Skipping the test case $name ...."
|
||||||
fi
|
fi
|
||||||
|
|||||||
@@ -955,21 +955,21 @@
|
|||||||
<compile_prog_args> --phy_simulators -c </compile_prog_args>
|
<compile_prog_args> --phy_simulators -c </compile_prog_args>
|
||||||
<pre_exec>$OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash</pre_exec>
|
<pre_exec>$OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash</pre_exec>
|
||||||
<pre_exec_args></pre_exec_args>
|
<pre_exec_args></pre_exec_args>
|
||||||
<main_exec> $OPENAIR_DIR/cmake_targets/lte-simulators/build/dlsim</main_exec>
|
<main_exec> $OPENAIR_DIR/targets/bin/dlsim.Rel14</main_exec>
|
||||||
<main_exec_args> -m5 -gF -s-1 -w1.0 -f.2 -n500 -B50 -c2 -z2 -O70
|
<main_exec_args> -m5 -gF -s-1 -w1.0 -f.2 -n500 -B50 -c2 -z2 -O60
|
||||||
-m4 -gF -s0 -w1.0 -f.2 -n500 -B6 -c4 -z2 -O70
|
-m4 -gF -s0 -w1.0 -f.2 -n500 -B6 -c4 -z2 -O60
|
||||||
-m15 -gF -s6.7 -w1.0 -f.2 -n500 -B50 -c2 -z2 -O70
|
-m15 -gF -s6.7 -w1.0 -f.2 -n500 -B50 -c2 -z2 -O60
|
||||||
-m14 -gF -s6.7 -w1.0 -f.2 -n500 -B25 -c3 -z2 -O70
|
-m15 -gF -s6.7 -w1.0 -f.2 -n500 -B25 -c2 -z2 -O60
|
||||||
-m15 -gG -s6.7 -w1.0 -f.2 -n500 -B50 -c2 -z2 -O30
|
-m15 -gG -s1.4 -w1.0 -f.2 -n500 -B50 -c2 -z2 -O25
|
||||||
-m14 -gG -s1.4 -w1.0 -f.2 -n500 -B25 -c3 -z2 -O30
|
-m15 -gG -s1.4 -w1.0 -f.2 -n500 -B25 -c2 -z2 -O25
|
||||||
-m25 -gF -s17.4 -w1.0 -f.2 -n500 -B25 -c3 -z2 -O70
|
-m25 -gF -s17.4 -w1.0 -f.2 -n500 -B25 -c3 -z2 -O60
|
||||||
-m25 -gF -s17.5 -w1.0 -f.2 -n500 -B25 -c3 -z2 -r1022 -O70
|
-m25 -gF -s17.5 -w1.0 -f.2 -n500 -B25 -c3 -z2 -r1022 -O60
|
||||||
-m26 -gF -s17.7 -w1.0 -f.2 -n500 -B50 -c2 -z2 -O70
|
-m26 -gF -s17.7 -w1.0 -f.2 -n500 -B50 -c2 -z2 -O60
|
||||||
-m26 -gF -s17.6 -w1.0 -f.2 -n500 -B100 -c2 -z2 -O70
|
-m26 -gF -s17.6 -w1.0 -f.2 -n500 -B100 -c2 -z2 -O60
|
||||||
-m26 -gF -s17.3 -w1.0 -f.2 -n500 -B100 -c2 -z2 -r1600 -O70
|
-m26 -gF -s17.3 -w1.0 -f.2 -n500 -B100 -c2 -z2 -r1600 -O60
|
||||||
-m26 -gF -s16.6 -w1.0 -f.2 -n500 -B100 -c2 -z2 -r1899 -O70
|
-m26 -gF -s16.6 -w1.0 -f.2 -n500 -B100 -c2 -z2 -r1899 -O60
|
||||||
-m14 -gF -s6.8 -w1.0 -f.2 -n500 -B50 -c2 -x2 -y2 -z2 -O70
|
-m14 -gF -s6.8 -w1.0 -f.2 -n500 -B50 -c2 -x2 -y2 -z2 -O60
|
||||||
-m13 -gF -s5.9 -w1.0 -f.2 -n500 -B25 -c3 -x2 -y2 -z2 -O70</main_exec_args>
|
-m13 -gF -s5.9 -w1.0 -f.2 -n500 -B25 -c3 -x2 -y2 -z2 -O60</main_exec_args>
|
||||||
<tags>dlsim.test1 dlsim.test5 dlsim.test6 dlsim.test6b dlsim.test7 dlsim.test7b dlsim.test10 dlsim.test10b dlsim.test11 dlsim.TM2_test1 dlsim.TM2_test1b</tags>
|
<tags>dlsim.test1 dlsim.test5 dlsim.test6 dlsim.test6b dlsim.test7 dlsim.test7b dlsim.test10 dlsim.test10b dlsim.test11 dlsim.TM2_test1 dlsim.TM2_test1b</tags>
|
||||||
<search_expr_true>"passed"</search_expr_true>
|
<search_expr_true>"passed"</search_expr_true>
|
||||||
<search_expr_false>segmentation fault|assertion|exiting|fatal</search_expr_false>
|
<search_expr_false>segmentation fault|assertion|exiting|fatal</search_expr_false>
|
||||||
@@ -989,13 +989,13 @@
|
|||||||
<compile_prog_args> --phy_simulators -c </compile_prog_args>
|
<compile_prog_args> --phy_simulators -c </compile_prog_args>
|
||||||
<pre_exec>$OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash</pre_exec>
|
<pre_exec>$OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash</pre_exec>
|
||||||
<pre_exec_args></pre_exec_args>
|
<pre_exec_args></pre_exec_args>
|
||||||
<main_exec> $OPENAIR_DIR/cmake_targets/lte-simulators/build/ulsim</main_exec>
|
<main_exec> $OPENAIR_DIR/targets/bin/ulsim.Rel14</main_exec>
|
||||||
<main_exec_args> -B25 -m5 -y1 -gN -x1 -s6 -w1.0 -e.1 -P -n500 -O70 -L
|
<main_exec_args> -B25 -m5 -y1 -gN -x1 -s6 -w1.0 -e.1 -P -n500 -O70
|
||||||
-B25 -m16 -y1 -gN -x1 -s12 -w1.0 -e.1 -P -n500 -O70 -L
|
-B25 -m16 -y1 -gN -x1 -s12 -w1.0 -e.1 -P -n500 -O70
|
||||||
-B50 -m5 -y1 -gN -x1 -s6 -w1.0 -e.1 -P -n500 -O70 -L
|
-B50 -m5 -y1 -gN -x1 -s6 -w1.0 -e.1 -P -n500 -O70
|
||||||
-B50 -m16 -y1 -gN -x1 -s12 -w1.0 -e.1 -P -n500 -O70 -L
|
-B50 -m16 -y1 -gN -x1 -s12 -w1.0 -e.1 -P -n500 -O70
|
||||||
-B100 -m5 -y1 -gN -x1 -s6 -w1.0 -e.1 -P -n500 -O70 -L
|
-B100 -m5 -y1 -gN -x1 -s6 -w1.0 -e.1 -P -n500 -O70
|
||||||
-B100 -m16 -y1 -gN -x1 -s12 -w1.0 -e.1 -P -n500 -O70 -L</main_exec_args>
|
-B100 -m16 -y1 -gN -x1 -s12 -w1.0 -e.1 -P -n500 -O70 </main_exec_args>
|
||||||
<tags>ulsim.test1 ulsim.test2 ulsim.test3 ulsim.test4 ulsim.test5 ulsim.test6</tags>
|
<tags>ulsim.test1 ulsim.test2 ulsim.test3 ulsim.test4 ulsim.test5 ulsim.test6</tags>
|
||||||
<search_expr_true>"passed"</search_expr_true>
|
<search_expr_true>"passed"</search_expr_true>
|
||||||
<search_expr_false>segmentation fault|assertion|exiting|fatal</search_expr_false>
|
<search_expr_false>segmentation fault|assertion|exiting|fatal</search_expr_false>
|
||||||
|
|||||||
@@ -49,7 +49,7 @@ eNBs =
|
|||||||
pucch_delta_shift = 1;
|
pucch_delta_shift = 1;
|
||||||
pucch_nRB_CQI = 0;
|
pucch_nRB_CQI = 0;
|
||||||
pucch_nCS_AN = 0;
|
pucch_nCS_AN = 0;
|
||||||
pucch_n1_AN = 32;
|
pucch_n1_AN = 0;
|
||||||
pdsch_referenceSignalPower = -24;
|
pdsch_referenceSignalPower = -24;
|
||||||
pdsch_p_b = 0;
|
pdsch_p_b = 0;
|
||||||
pusch_n_SB = 1;
|
pusch_n_SB = 1;
|
||||||
|
|||||||
@@ -49,7 +49,7 @@ eNBs =
|
|||||||
pucch_delta_shift = 1;
|
pucch_delta_shift = 1;
|
||||||
pucch_nRB_CQI = 0;
|
pucch_nRB_CQI = 0;
|
||||||
pucch_nCS_AN = 0;
|
pucch_nCS_AN = 0;
|
||||||
pucch_n1_AN = 32;
|
pucch_n1_AN = 0;
|
||||||
pdsch_referenceSignalPower = -24;
|
pdsch_referenceSignalPower = -24;
|
||||||
pdsch_p_b = 0;
|
pdsch_p_b = 0;
|
||||||
pusch_n_SB = 1;
|
pusch_n_SB = 1;
|
||||||
|
|||||||
@@ -49,7 +49,7 @@ eNBs =
|
|||||||
pucch_delta_shift = 1;
|
pucch_delta_shift = 1;
|
||||||
pucch_nRB_CQI = 0;
|
pucch_nRB_CQI = 0;
|
||||||
pucch_nCS_AN = 0;
|
pucch_nCS_AN = 0;
|
||||||
pucch_n1_AN = 32;
|
pucch_n1_AN = 0;
|
||||||
pdsch_referenceSignalPower = -24;
|
pdsch_referenceSignalPower = -24;
|
||||||
pdsch_p_b = 0;
|
pdsch_p_b = 0;
|
||||||
pusch_n_SB = 1;
|
pusch_n_SB = 1;
|
||||||
|
|||||||
@@ -49,7 +49,7 @@ eNBs =
|
|||||||
pucch_delta_shift = 1;
|
pucch_delta_shift = 1;
|
||||||
pucch_nRB_CQI = 0;
|
pucch_nRB_CQI = 0;
|
||||||
pucch_nCS_AN = 0;
|
pucch_nCS_AN = 0;
|
||||||
pucch_n1_AN = 32;
|
pucch_n1_AN = 0;
|
||||||
pdsch_referenceSignalPower = -24;
|
pdsch_referenceSignalPower = -24;
|
||||||
pdsch_p_b = 0;
|
pdsch_p_b = 0;
|
||||||
pusch_n_SB = 1;
|
pusch_n_SB = 1;
|
||||||
|
|||||||
@@ -49,7 +49,7 @@ eNBs =
|
|||||||
pucch_delta_shift = 1;
|
pucch_delta_shift = 1;
|
||||||
pucch_nRB_CQI = 0;
|
pucch_nRB_CQI = 0;
|
||||||
pucch_nCS_AN = 0;
|
pucch_nCS_AN = 0;
|
||||||
pucch_n1_AN = 32;
|
pucch_n1_AN = 0;
|
||||||
pdsch_referenceSignalPower = -24;
|
pdsch_referenceSignalPower = -24;
|
||||||
pdsch_p_b = 0;
|
pdsch_p_b = 0;
|
||||||
pusch_n_SB = 1;
|
pusch_n_SB = 1;
|
||||||
|
|||||||
@@ -49,7 +49,7 @@ eNBs =
|
|||||||
pucch_delta_shift = 1;
|
pucch_delta_shift = 1;
|
||||||
pucch_nRB_CQI = 0;
|
pucch_nRB_CQI = 0;
|
||||||
pucch_nCS_AN = 0;
|
pucch_nCS_AN = 0;
|
||||||
pucch_n1_AN = 32;
|
pucch_n1_AN = 0;
|
||||||
pdsch_referenceSignalPower = -24;
|
pdsch_referenceSignalPower = -24;
|
||||||
pdsch_p_b = 0;
|
pdsch_p_b = 0;
|
||||||
pusch_n_SB = 1;
|
pusch_n_SB = 1;
|
||||||
|
|||||||
@@ -49,7 +49,7 @@ eNBs =
|
|||||||
pucch_delta_shift = 1;
|
pucch_delta_shift = 1;
|
||||||
pucch_nRB_CQI = 0;
|
pucch_nRB_CQI = 0;
|
||||||
pucch_nCS_AN = 0;
|
pucch_nCS_AN = 0;
|
||||||
pucch_n1_AN = 32;
|
pucch_n1_AN = 0;
|
||||||
pdsch_referenceSignalPower = -29;
|
pdsch_referenceSignalPower = -29;
|
||||||
pdsch_p_b = 0;
|
pdsch_p_b = 0;
|
||||||
pusch_n_SB = 1;
|
pusch_n_SB = 1;
|
||||||
|
|||||||
@@ -49,7 +49,7 @@ eNBs =
|
|||||||
pucch_delta_shift = 1;
|
pucch_delta_shift = 1;
|
||||||
pucch_nRB_CQI = 0;
|
pucch_nRB_CQI = 0;
|
||||||
pucch_nCS_AN = 0;
|
pucch_nCS_AN = 0;
|
||||||
pucch_n1_AN = 32;
|
pucch_n1_AN = 0;
|
||||||
pdsch_referenceSignalPower = -29;
|
pdsch_referenceSignalPower = -29;
|
||||||
pdsch_p_b = 0;
|
pdsch_p_b = 0;
|
||||||
pusch_n_SB = 1;
|
pusch_n_SB = 1;
|
||||||
|
|||||||
@@ -49,7 +49,7 @@ eNBs =
|
|||||||
pucch_delta_shift = 1;
|
pucch_delta_shift = 1;
|
||||||
pucch_nRB_CQI = 0;
|
pucch_nRB_CQI = 0;
|
||||||
pucch_nCS_AN = 0;
|
pucch_nCS_AN = 0;
|
||||||
pucch_n1_AN = 32;
|
pucch_n1_AN = 0;
|
||||||
pdsch_referenceSignalPower = -29;
|
pdsch_referenceSignalPower = -29;
|
||||||
pdsch_p_b = 0;
|
pdsch_p_b = 0;
|
||||||
pusch_n_SB = 1;
|
pusch_n_SB = 1;
|
||||||
|
|||||||
@@ -49,7 +49,7 @@ eNBs =
|
|||||||
pucch_delta_shift = 1;
|
pucch_delta_shift = 1;
|
||||||
pucch_nRB_CQI = 0;
|
pucch_nRB_CQI = 0;
|
||||||
pucch_nCS_AN = 0;
|
pucch_nCS_AN = 0;
|
||||||
pucch_n1_AN = 32;
|
pucch_n1_AN = 0;
|
||||||
pdsch_referenceSignalPower = -29;
|
pdsch_referenceSignalPower = -29;
|
||||||
pdsch_p_b = 0;
|
pdsch_p_b = 0;
|
||||||
pusch_n_SB = 1;
|
pusch_n_SB = 1;
|
||||||
|
|||||||
@@ -49,7 +49,7 @@ eNBs =
|
|||||||
pucch_delta_shift = 1;
|
pucch_delta_shift = 1;
|
||||||
pucch_nRB_CQI = 0;
|
pucch_nRB_CQI = 0;
|
||||||
pucch_nCS_AN = 0;
|
pucch_nCS_AN = 0;
|
||||||
pucch_n1_AN = 32;
|
pucch_n1_AN = 0;
|
||||||
pdsch_referenceSignalPower = -29;
|
pdsch_referenceSignalPower = -29;
|
||||||
pdsch_p_b = 0;
|
pdsch_p_b = 0;
|
||||||
pusch_n_SB = 1;
|
pusch_n_SB = 1;
|
||||||
|
|||||||
@@ -49,7 +49,7 @@ eNBs =
|
|||||||
pucch_delta_shift = 1;
|
pucch_delta_shift = 1;
|
||||||
pucch_nRB_CQI = 0;
|
pucch_nRB_CQI = 0;
|
||||||
pucch_nCS_AN = 0;
|
pucch_nCS_AN = 0;
|
||||||
pucch_n1_AN = 32;
|
pucch_n1_AN = 0;
|
||||||
pdsch_referenceSignalPower = -29;
|
pdsch_referenceSignalPower = -29;
|
||||||
pdsch_p_b = 0;
|
pdsch_p_b = 0;
|
||||||
pusch_n_SB = 1;
|
pusch_n_SB = 1;
|
||||||
|
|||||||
+24
-11
@@ -42,6 +42,7 @@ conf_nvram_path=$OPENAIR_DIR/openair3/NAS/TOOLS/ue_eurecom_test_sfr.conf
|
|||||||
|
|
||||||
MSC_GEN="False"
|
MSC_GEN="False"
|
||||||
XFORMS="True"
|
XFORMS="True"
|
||||||
|
UE_EXPANSION="False"
|
||||||
PRINT_STATS="False"
|
PRINT_STATS="False"
|
||||||
VCD_TIMING="False"
|
VCD_TIMING="False"
|
||||||
DEADLINE_SCHEDULER_FLAG_USER="False"
|
DEADLINE_SCHEDULER_FLAG_USER="False"
|
||||||
@@ -57,7 +58,7 @@ CFLAGS_PROCESSOR_USER=""
|
|||||||
RUN_GROUP=0
|
RUN_GROUP=0
|
||||||
TEST_CASE_GROUP=""
|
TEST_CASE_GROUP=""
|
||||||
BUILD_DOXYGEN=0
|
BUILD_DOXYGEN=0
|
||||||
T_TRACER="False"
|
T_TRACER="True"
|
||||||
DISABLE_HARDWARE_DEPENDENCY="False"
|
DISABLE_HARDWARE_DEPENDENCY="False"
|
||||||
CMAKE_BUILD_TYPE=""
|
CMAKE_BUILD_TYPE=""
|
||||||
CMAKE_CMD="$CMAKE"
|
CMAKE_CMD="$CMAKE"
|
||||||
@@ -140,8 +141,8 @@ Options
|
|||||||
Enable deadline scheduler of Linux kernel (>=3.14.x).
|
Enable deadline scheduler of Linux kernel (>=3.14.x).
|
||||||
--disable-cpu-affinity
|
--disable-cpu-affinity
|
||||||
Disables CPU Affinity between UHD/TX/RX Threads (Valid only when deadline scheduler is disabled). By defaulT, CPU Affinity is enabled when not using deadline scheduler. It is enabled only with >2 CPUs. For eNB, CPU_0-> Device library (UHD), CPU_1->TX Threads, CPU_2...CPU_MAX->Rx Threads. For UE, CPU_0->Device Library(UHD), CPU_1..CPU_MAX -> All the UE threads
|
Disables CPU Affinity between UHD/TX/RX Threads (Valid only when deadline scheduler is disabled). By defaulT, CPU Affinity is enabled when not using deadline scheduler. It is enabled only with >2 CPUs. For eNB, CPU_0-> Device library (UHD), CPU_1->TX Threads, CPU_2...CPU_MAX->Rx Threads. For UE, CPU_0->Device Library(UHD), CPU_1..CPU_MAX -> All the UE threads
|
||||||
--T-tracer
|
--disable-T-Tracer
|
||||||
Enables the T tracer.
|
Disables the T tracer.
|
||||||
--disable-hardware-dependency
|
--disable-hardware-dependency
|
||||||
Disable HW dependency during installation
|
Disable HW dependency during installation
|
||||||
--ue-autotest-trace
|
--ue-autotest-trace
|
||||||
@@ -209,8 +210,12 @@ function main() {
|
|||||||
UE=1
|
UE=1
|
||||||
echo_info "Will compile UE"
|
echo_info "Will compile UE"
|
||||||
shift;;
|
shift;;
|
||||||
|
--mu)
|
||||||
|
UE_EXPANSION="True"
|
||||||
|
echo_info "Will compile with UE_EXPANSION"
|
||||||
|
shift;;
|
||||||
--UE-conf-nvram)
|
--UE-conf-nvram)
|
||||||
conf_nvram_path=$(readlink -f "$1")
|
conf_nvram_path=$(readlink -f $2)
|
||||||
shift 2;;
|
shift 2;;
|
||||||
--UE-gen-nvram)
|
--UE-gen-nvram)
|
||||||
gen_nvram_path=$(readlink -f $2)
|
gen_nvram_path=$(readlink -f $2)
|
||||||
@@ -304,9 +309,9 @@ function main() {
|
|||||||
CPU_AFFINITY_FLAG_USER="False"
|
CPU_AFFINITY_FLAG_USER="False"
|
||||||
echo_info "Disabling CPU Affinity (only valid when not using deadline scheduler)"
|
echo_info "Disabling CPU Affinity (only valid when not using deadline scheduler)"
|
||||||
shift 1;;
|
shift 1;;
|
||||||
--T-tracer)
|
--disable-T-Tracer)
|
||||||
T_TRACER="True"
|
T_TRACER="False"
|
||||||
echo_info "Enabling the T tracer"
|
echo_info "Disabling the T tracer"
|
||||||
shift 1;;
|
shift 1;;
|
||||||
--disable-hardware-dependency)
|
--disable-hardware-dependency)
|
||||||
echo_info "Disabling hardware dependency for compiling software"
|
echo_info "Disabling hardware dependency for compiling software"
|
||||||
@@ -503,7 +508,9 @@ function main() {
|
|||||||
lte_exec=lte-uesoftmodem
|
lte_exec=lte-uesoftmodem
|
||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
|
if [ "$T_TRACER" = "False" ] ; then
|
||||||
|
lte_build_dir=${lte_build_dir}_noLOG
|
||||||
|
fi
|
||||||
# configuration module libraries, one currently available, using libconfig
|
# configuration module libraries, one currently available, using libconfig
|
||||||
config_libconfig_shlib=params_libconfig
|
config_libconfig_shlib=params_libconfig
|
||||||
|
|
||||||
@@ -521,6 +528,9 @@ function main() {
|
|||||||
echo "set ( CMAKE_BUILD_TYPE $CMAKE_BUILD_TYPE )" >> $cmake_file
|
echo "set ( CMAKE_BUILD_TYPE $CMAKE_BUILD_TYPE )" >> $cmake_file
|
||||||
echo "set ( CFLAGS_PROCESSOR_USER \"$CFLAGS_PROCESSOR_USER\" )" >> $cmake_file
|
echo "set ( CFLAGS_PROCESSOR_USER \"$CFLAGS_PROCESSOR_USER\" )" >> $cmake_file
|
||||||
echo "set ( XFORMS $XFORMS )" >> $cmake_file
|
echo "set ( XFORMS $XFORMS )" >> $cmake_file
|
||||||
|
echo "set ( UE_EXPANSION $UE_EXPANSION )" >> $cmake_file
|
||||||
|
# echo "set ( PHY_TX_THREAD $UE_EXPANSION )" >> $cmake_file
|
||||||
|
echo "set ( PRE_SCD_THREAD $UE_EXPANSION )" >> $cmake_file
|
||||||
echo "set ( RRC_ASN1_VERSION \"${REL}\")" >> $cmake_file
|
echo "set ( RRC_ASN1_VERSION \"${REL}\")" >> $cmake_file
|
||||||
echo "set ( ENABLE_VCD_FIFO $VCD_TIMING )" >> $cmake_file
|
echo "set ( ENABLE_VCD_FIFO $VCD_TIMING )" >> $cmake_file
|
||||||
echo "set ( RF_BOARD \"${HW}\")" >> $cmake_file
|
echo "set ( RF_BOARD \"${HW}\")" >> $cmake_file
|
||||||
@@ -670,6 +680,7 @@ function main() {
|
|||||||
cp $OPENAIR_DIR/cmake_targets/tools/init_exmimo2 $dbin
|
cp $OPENAIR_DIR/cmake_targets/tools/init_exmimo2 $dbin
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
|
||||||
# Telnet server compilation
|
# Telnet server compilation
|
||||||
#####################
|
#####################
|
||||||
if [ "$BUILD_TELNETSRV" = "1" ] ; then
|
if [ "$BUILD_TELNETSRV" = "1" ] ; then
|
||||||
@@ -831,7 +842,8 @@ fi
|
|||||||
{
|
{
|
||||||
cd $OPENAIR_DIR/cmake_targets/basic_simulator/enb
|
cd $OPENAIR_DIR/cmake_targets/basic_simulator/enb
|
||||||
cmake .
|
cmake .
|
||||||
make -j`nproc` coding params_libconfig tcp_bridge_oai lte-softmodem
|
make -j`nproc` lte-softmodem
|
||||||
|
make -j`nproc` coding params_libconfig tcp_bridge_oai
|
||||||
ln -sf libtcp_bridge_oai.so liboai_device.so
|
ln -sf libtcp_bridge_oai.so liboai_device.so
|
||||||
cd ../..
|
cd ../..
|
||||||
} > $dlog/basic_simulator_enb.txt 2>&1
|
} > $dlog/basic_simulator_enb.txt 2>&1
|
||||||
@@ -868,7 +880,7 @@ fi
|
|||||||
echo "set(PACKAGE_NAME \"simulator_ue\")" >> $cmake_file
|
echo "set(PACKAGE_NAME \"simulator_ue\")" >> $cmake_file
|
||||||
echo "set (DEADLINE_SCHEDULER \"False\" )" >> $cmake_file
|
echo "set (DEADLINE_SCHEDULER \"False\" )" >> $cmake_file
|
||||||
echo "set (CPU_AFFINITY \"False\" )" >> $cmake_file
|
echo "set (CPU_AFFINITY \"False\" )" >> $cmake_file
|
||||||
echo "set ( T_TRACER \"False\" )" >> $cmake_file
|
echo "set ( T_TRACER \"True\" )" >> $cmake_file
|
||||||
echo "set (UE_AUTOTEST_TRACE $UE_AUTOTEST_TRACE)" >> $cmake_file
|
echo "set (UE_AUTOTEST_TRACE $UE_AUTOTEST_TRACE)" >> $cmake_file
|
||||||
echo "set (UE_DEBUG_TRACE $UE_DEBUG_TRACE)" >> $cmake_file
|
echo "set (UE_DEBUG_TRACE $UE_DEBUG_TRACE)" >> $cmake_file
|
||||||
echo "set (UE_TIMING_TRACE $UE_TIMING_TRACE)" >> $cmake_file
|
echo "set (UE_TIMING_TRACE $UE_TIMING_TRACE)" >> $cmake_file
|
||||||
@@ -886,7 +898,8 @@ fi
|
|||||||
{
|
{
|
||||||
cd $OPENAIR_DIR/cmake_targets/basic_simulator/ue
|
cd $OPENAIR_DIR/cmake_targets/basic_simulator/ue
|
||||||
cmake .
|
cmake .
|
||||||
make -j`nproc` coding params_libconfig tcp_bridge_oai lte-uesoftmodem
|
make -j`nproc` lte-uesoftmodem
|
||||||
|
make -j`nproc` coding params_libconfig tcp_bridge_oai
|
||||||
ln -sf libtcp_bridge_oai.so liboai_device.so
|
ln -sf libtcp_bridge_oai.so liboai_device.so
|
||||||
cd ../..
|
cd ../..
|
||||||
} > $dlog/basic_simulator_ue.txt 2>&1
|
} > $dlog/basic_simulator_ue.txt 2>&1
|
||||||
|
|||||||
@@ -271,8 +271,23 @@ check_install_usrp_uhd_driver(){
|
|||||||
$SUDO apt-get remove libuhd-dev libuhd003 uhd-host -y || true
|
$SUDO apt-get remove libuhd-dev libuhd003 uhd-host -y || true
|
||||||
v=$(lsb_release -cs)
|
v=$(lsb_release -cs)
|
||||||
$SUDO apt-add-repository --remove "deb http://files.ettus.com/binaries/uhd/repo/uhd/ubuntu/$v $v main"
|
$SUDO apt-add-repository --remove "deb http://files.ettus.com/binaries/uhd/repo/uhd/ubuntu/$v $v main"
|
||||||
#The new USRP repository
|
# The new USRP repository
|
||||||
$SUDO add-apt-repository ppa:ettusresearch/uhd -y
|
# Raphael Defosseux: Adding a loop on adding PPA because in CI the gpg key retrieve may
|
||||||
|
# timeout due to proxy / network latencies in Eurecom on VM
|
||||||
|
echo_info "\nAdding PPA repository ettusresearch/uhd\n"
|
||||||
|
x=0
|
||||||
|
while [ $x -le 5 ]
|
||||||
|
do
|
||||||
|
if $SUDO add-apt-repository ppa:ettusresearch/uhd -y
|
||||||
|
then
|
||||||
|
echo_info "add-apt-repository successful\n"
|
||||||
|
break
|
||||||
|
else
|
||||||
|
echo_info "add-apt-repository failed, retrying...\n"
|
||||||
|
sleep 30
|
||||||
|
fi
|
||||||
|
x=$((x + 1))
|
||||||
|
done
|
||||||
$SUDO apt-get update
|
$SUDO apt-get update
|
||||||
$SUDO apt-get -y --allow-unauthenticated install python python-tk libboost-all-dev libusb-1.0-0-dev
|
$SUDO apt-get -y --allow-unauthenticated install python python-tk libboost-all-dev libusb-1.0-0-dev
|
||||||
$SUDO apt-get -y --allow-unauthenticated install libuhd-dev libuhd003 uhd-host
|
$SUDO apt-get -y --allow-unauthenticated install libuhd-dev libuhd003 uhd-host
|
||||||
@@ -489,24 +504,24 @@ check_install_oai_software() {
|
|||||||
$SUDO apt install -y software-properties-common
|
$SUDO apt install -y software-properties-common
|
||||||
case "$(get_distribution_release)" in
|
case "$(get_distribution_release)" in
|
||||||
"ubuntu14.04")
|
"ubuntu14.04")
|
||||||
specific_packages="libtasn1-3-dev gccxml libgnutls-dev libatlas-dev iproute libconfig8-dev"
|
specific_packages="libtasn1-3-dev libgnutls-dev libatlas-dev iproute libconfig8-dev"
|
||||||
# For iperf3
|
# For iperf3
|
||||||
$SUDO add-apt-repository "deb http://archive.ubuntu.com/ubuntu trusty-backports universe"
|
$SUDO add-apt-repository "deb http://archive.ubuntu.com/ubuntu trusty-backports universe"
|
||||||
$SUDO apt-get update
|
$SUDO apt-get update
|
||||||
;;
|
;;
|
||||||
"ubuntu16.04")
|
"ubuntu16.04")
|
||||||
specific_packages="libtasn1-6-dev gccxml libgnutls-dev libatlas-dev iproute libconfig8-dev"
|
specific_packages="libtasn1-6-dev libgnutls-dev libatlas-dev iproute libconfig8-dev"
|
||||||
;;
|
;;
|
||||||
"ubuntu17.04")
|
"ubuntu17.04")
|
||||||
specific_packages="libtasn1-6-dev castxml libgnutls28-dev libatlas-dev iproute libconfig8-dev"
|
specific_packages="libtasn1-6-dev libgnutls28-dev libatlas-dev iproute libconfig8-dev"
|
||||||
;;
|
;;
|
||||||
"ubuntu17.10")
|
"ubuntu17.10")
|
||||||
specific_packages="libtasn1-6-dev castxml libgnutls28-dev iproute libconfig8-dev"
|
specific_packages="libtasn1-6-dev libgnutls28-dev iproute libconfig8-dev"
|
||||||
LAPACK_LIBNAME="liblapack.so-x86_64-linux-gnu"
|
LAPACK_LIBNAME="liblapack.so-x86_64-linux-gnu"
|
||||||
LAPACK_TARGET="/usr/lib/x86_64-linux-gnu/atlas/liblapack.so"
|
LAPACK_TARGET="/usr/lib/x86_64-linux-gnu/atlas/liblapack.so"
|
||||||
;;
|
;;
|
||||||
"ubuntu18.04")
|
"ubuntu18.04")
|
||||||
specific_packages="libtasn1-6-dev castxml libgnutls28-dev iproute2 libconfig-dev"
|
specific_packages="libtasn1-6-dev libgnutls28-dev iproute2 libconfig-dev"
|
||||||
LAPACK_LIBNAME="liblapack.so-x86_64-linux-gnu"
|
LAPACK_LIBNAME="liblapack.so-x86_64-linux-gnu"
|
||||||
LAPACK_TARGET="/usr/lib/x86_64-linux-gnu/atlas/liblapack.so"
|
LAPACK_TARGET="/usr/lib/x86_64-linux-gnu/atlas/liblapack.so"
|
||||||
;;
|
;;
|
||||||
@@ -534,6 +549,8 @@ check_install_oai_software() {
|
|||||||
iptables-dev \
|
iptables-dev \
|
||||||
libatlas-base-dev \
|
libatlas-base-dev \
|
||||||
libblas-dev \
|
libblas-dev \
|
||||||
|
liblapack-dev\
|
||||||
|
liblapacke-dev\
|
||||||
libffi-dev \
|
libffi-dev \
|
||||||
libforms-bin \
|
libforms-bin \
|
||||||
libforms-dev \
|
libforms-dev \
|
||||||
@@ -580,12 +597,9 @@ check_install_oai_software() {
|
|||||||
echo "EPEL repos not present. Installing them."
|
echo "EPEL repos not present. Installing them."
|
||||||
$SUDO $INSTALLER install -y https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm
|
$SUDO $INSTALLER install -y https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm
|
||||||
fi
|
fi
|
||||||
$SUDO $INSTALLER install -y python-epdb
|
$SUDO $INSTALLER install -y python-epdb vim-common
|
||||||
$SUDO $INSTALLER install -y gccxml
|
|
||||||
else
|
else
|
||||||
$SUDO $INSTALLER install -y mscgen pydb
|
$SUDO $INSTALLER install -y mscgen pydb
|
||||||
# Fedora repos already contain gccxml's successor castxml.
|
|
||||||
$SUDO $INSTALLER install -y castxml
|
|
||||||
fi
|
fi
|
||||||
|
|
||||||
$SUDO $INSTALLER install -y \
|
$SUDO $INSTALLER install -y \
|
||||||
@@ -663,8 +677,14 @@ install_asn1c_from_source(){
|
|||||||
echo_info "\nInstalling ASN1. The log file for ASN1 installation is here: $asn1_install_log "
|
echo_info "\nInstalling ASN1. The log file for ASN1 installation is here: $asn1_install_log "
|
||||||
(
|
(
|
||||||
$SUDO rm -rf /tmp/asn1c
|
$SUDO rm -rf /tmp/asn1c
|
||||||
GIT_SSL_NO_VERIFY=true git clone https://gitlab.eurecom.fr/oai/asn1c.git /tmp/asn1c
|
# GIT_SSL_NO_VERIFY=true git clone https://gitlab.eurecom.fr/oai/asn1c.git /tmp/asn1c
|
||||||
|
git clone https://gitlab.eurecom.fr/oai/asn1c.git /tmp/asn1c
|
||||||
cd /tmp/asn1c
|
cd /tmp/asn1c
|
||||||
|
# better to use a given commit than a branch in case the branch
|
||||||
|
# is updated and requires modifications in the source of OAI
|
||||||
|
#git checkout velichkov_s1ap_plus_option_group
|
||||||
|
git checkout ec830d70bbb014b769810355a2f321a91ccd8a58
|
||||||
|
autoreconf -iv
|
||||||
./configure
|
./configure
|
||||||
make -j`nproc`
|
make -j`nproc`
|
||||||
$SUDO make install
|
$SUDO make install
|
||||||
|
|||||||
@@ -48,7 +48,7 @@ if [ "$1" = "eNB" ]; then
|
|||||||
else
|
else
|
||||||
if [ "$1" = "UE" ]; then
|
if [ "$1" = "UE" ]; then
|
||||||
echo "bring up oai0 interface for UE"
|
echo "bring up oai0 interface for UE"
|
||||||
sudo ifconfig oai0 10.0.1.9 netmask 255.255.255.0 broadcast 10.0.1.255
|
sudo ifconfig oai0 10.0.1.2 netmask 255.255.255.0 broadcast 10.0.1.255
|
||||||
$OPENAIR_DIR/targets/bin/rb_tool -a -c0 -i0 -z0 -s 10.0.1.2 -t 10.0.1.1 -r 1
|
$OPENAIR_DIR/targets/bin/rb_tool -a -c0 -i0 -z0 -s 10.0.1.2 -t 10.0.1.1 -r 1
|
||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
|
|||||||
Regular → Executable
@@ -26,15 +26,17 @@ xUnit_start() {
|
|||||||
# \param $3 testcase result
|
# \param $3 testcase result
|
||||||
# \param $4 run result
|
# \param $4 run result
|
||||||
# \param $5 XML file local to test case for storing its own results
|
# \param $5 XML file local to test case for storing its own results
|
||||||
|
# \param $6 proper description
|
||||||
xUnit_fail() {
|
xUnit_fail() {
|
||||||
class=$1
|
class=$1
|
||||||
test_case=$2
|
test_case=$2
|
||||||
result=$3
|
result=$3
|
||||||
run_result=$4
|
run_result=$4
|
||||||
xmlfile_testcase=$5
|
xmlfile_testcase=$5
|
||||||
|
desc=$6
|
||||||
currtime=$(date +%s.%N)
|
currtime=$(date +%s.%N)
|
||||||
time=$(echo "$currtime - $XUNIT_START" | bc -l)
|
time=$(echo "$currtime - $XUNIT_START" | bc -l)
|
||||||
xml="<testcase classname='$class' name='$test_case' Run_result='$run_result' time='$time s' RESULT='$result'></testcase>"
|
xml="<testcase classname='$class' name='$test_case' description='$desc' Run_result='$run_result' time='$time s' RESULT='$result'></testcase>"
|
||||||
echo -e "$xml" >> "$xmlfile_testcase"
|
echo -e "$xml" >> "$xmlfile_testcase"
|
||||||
XUNIT_TESTCASES_XML="$XUNIT_TESTCASES_XML \n$xml"
|
XUNIT_TESTCASES_XML="$XUNIT_TESTCASES_XML \n$xml"
|
||||||
XUNIT_FAILED=$((XUNIT_FAILED+1))
|
XUNIT_FAILED=$((XUNIT_FAILED+1))
|
||||||
@@ -48,15 +50,17 @@ xUnit_fail() {
|
|||||||
# \param $3 testcase result
|
# \param $3 testcase result
|
||||||
# \param $4 run result
|
# \param $4 run result
|
||||||
# \param $5 XML file local to test case for storing its own results
|
# \param $5 XML file local to test case for storing its own results
|
||||||
|
# \param $6 proper description
|
||||||
xUnit_success() {
|
xUnit_success() {
|
||||||
class=$1
|
class=$1
|
||||||
test_case=$2
|
test_case=$2
|
||||||
result=$3
|
result=$3
|
||||||
run_result=$4
|
run_result=$4
|
||||||
xmlfile_testcase=$5
|
xmlfile_testcase=$5
|
||||||
|
desc=$6
|
||||||
currtime=$(date +%s.%N)
|
currtime=$(date +%s.%N)
|
||||||
time=$(echo "$currtime - $XUNIT_START" | bc -l)
|
time=$(echo "$currtime - $XUNIT_START" | bc -l)
|
||||||
xml="<testcase classname='$class' name='$test_case' Run_result='$run_result' time='$time s' RESULT='$result'></testcase>"
|
xml="<testcase classname='$class' name='$test_case' description='$desc' Run_result='$run_result' time='$time s' RESULT='$result'></testcase>"
|
||||||
echo -e $xml >> $xmlfile_testcase
|
echo -e $xml >> $xmlfile_testcase
|
||||||
XUNIT_TESTCASES_XML="$XUNIT_TESTCASES_XML \n$xml"
|
XUNIT_TESTCASES_XML="$XUNIT_TESTCASES_XML \n$xml"
|
||||||
XUNIT_SUCCESS=$((XUNIT_SUCCESS+1))
|
XUNIT_SUCCESS=$((XUNIT_SUCCESS+1))
|
||||||
|
|||||||
@@ -29,18 +29,50 @@
|
|||||||
* \note
|
* \note
|
||||||
* \warning
|
* \warning
|
||||||
*/
|
*/
|
||||||
|
#define _GNU_SOURCE
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
|
#include <ctype.h>
|
||||||
#include <errno.h>
|
#include <errno.h>
|
||||||
#include "config_userapi.h"
|
#include "config_userapi.h"
|
||||||
|
|
||||||
|
|
||||||
|
void parse_stringlist(paramdef_t *cfgoptions, char *val)
|
||||||
|
{
|
||||||
|
char *atoken;
|
||||||
|
char *tokctx;
|
||||||
|
char *tmpval=strdup(val);
|
||||||
|
int numelt=0;
|
||||||
|
|
||||||
|
cfgoptions->numelt=0;
|
||||||
|
|
||||||
|
atoken=strtok_r(tmpval, ",",&tokctx);
|
||||||
|
while(atoken != NULL) {
|
||||||
|
numelt++ ;
|
||||||
|
atoken=strtok_r(NULL, ",",&tokctx);
|
||||||
|
}
|
||||||
|
free(tmpval);
|
||||||
|
config_check_valptr(cfgoptions,(char **)&(cfgoptions->strlistptr), sizeof(char *) * numelt);
|
||||||
|
cfgoptions->numelt=numelt;
|
||||||
|
|
||||||
|
atoken=strtok_r(val, ",",&tokctx);
|
||||||
|
for( int i=0; i<cfgoptions->numelt && atoken != NULL ; i++) {
|
||||||
|
config_check_valptr(cfgoptions,&(cfgoptions->strlistptr[i]),strlen(atoken)+1);
|
||||||
|
sprintf(cfgoptions->strlistptr[i],"%s",atoken);
|
||||||
|
printf_params("[LIBCONFIG] %s[%i]: %s\n", cfgoptions->optname,i,cfgoptions->strlistptr[i]);
|
||||||
|
atoken=strtok_r(NULL, ",",&tokctx);
|
||||||
|
}
|
||||||
|
cfgoptions->numelt=numelt;
|
||||||
|
}
|
||||||
|
|
||||||
int processoption(paramdef_t *cfgoptions, char *value)
|
int processoption(paramdef_t *cfgoptions, char *value)
|
||||||
{
|
{
|
||||||
char *tmpval = value;
|
char *tmpval = value;
|
||||||
int optisset=0;
|
int optisset=0;
|
||||||
char defbool[2]="1";
|
char defbool[2]="1";
|
||||||
|
|
||||||
|
|
||||||
if ( value == NULL) {
|
if ( value == NULL) {
|
||||||
if( (cfgoptions->paramflags &PARAMFLAG_BOOL) == 0 ) { /* not a boolean, argument required */
|
if( (cfgoptions->paramflags &PARAMFLAG_BOOL) == 0 ) { /* not a boolean, argument required */
|
||||||
fprintf(stderr,"[CONFIG] command line, option %s requires an argument\n",cfgoptions->optname);
|
fprintf(stderr,"[CONFIG] command line, option %s requires an argument\n",cfgoptions->optname);
|
||||||
@@ -63,6 +95,7 @@ char defbool[2]="1";
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case TYPE_STRINGLIST:
|
case TYPE_STRINGLIST:
|
||||||
|
parse_stringlist(cfgoptions,tmpval);
|
||||||
break;
|
break;
|
||||||
case TYPE_UINT32:
|
case TYPE_UINT32:
|
||||||
case TYPE_INT32:
|
case TYPE_INT32:
|
||||||
@@ -103,15 +136,15 @@ char defbool[2]="1";
|
|||||||
if (optisset == 1) {
|
if (optisset == 1) {
|
||||||
cfgoptions->paramflags = cfgoptions->paramflags | PARAMFLAG_PARAMSET;
|
cfgoptions->paramflags = cfgoptions->paramflags | PARAMFLAG_PARAMSET;
|
||||||
}
|
}
|
||||||
|
|
||||||
return optisset;
|
return optisset;
|
||||||
}
|
}
|
||||||
|
|
||||||
int config_process_cmdline(paramdef_t *cfgoptions,int numoptions, char *prefix)
|
int config_process_cmdline(paramdef_t *cfgoptions,int numoptions, char *prefix)
|
||||||
{
|
{
|
||||||
char **p = config_get_if()->argv;
|
|
||||||
|
|
||||||
int c = config_get_if()->argc;
|
int c = config_get_if()->argc;
|
||||||
int j;
|
int i,j;
|
||||||
char *pp;
|
char *pp;
|
||||||
char *cfgpath;
|
char *cfgpath;
|
||||||
|
|
||||||
@@ -122,42 +155,74 @@ char *cfgpath;
|
|||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
j=0;
|
j = 0;
|
||||||
p++;
|
i = 0;
|
||||||
c--;
|
while (c > 0 ) {
|
||||||
while (c > 0 && *p != NULL) {
|
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 */
|
||||||
if (strcmp(*p, "-h") == 0 || strcmp(*p, "--help") == 0 ) {
|
/* first check help options, either --help, -h or --help_<section> */
|
||||||
config_printhelp(cfgoptions,numoptions);
|
if (strncmp(oneargv, "-h",2) == 0 || strncmp(oneargv, "--help",6) == 0 ) {
|
||||||
|
char *tokctx;
|
||||||
|
pp=strtok_r(oneargv, "_",&tokctx);
|
||||||
|
if (pp == NULL || strcasecmp(pp,config_get_if()->argv[i] ) == 0 ) {
|
||||||
|
if( prefix == NULL) {
|
||||||
|
config_printhelp(cfgoptions,numoptions);
|
||||||
|
if ( ! ( CONFIG_ISFLAGSET(CONFIG_NOEXITONHELP)))
|
||||||
|
exit_fun("[CONFIG] Exiting after displaying help\n");
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
pp=strtok_r(NULL, " ",&tokctx);
|
||||||
|
if ( prefix != NULL && pp != NULL && strncasecmp(prefix,pp,strlen(pp)) == 0 ) {
|
||||||
|
printf ("Help for %s section:\n",prefix);
|
||||||
|
config_printhelp(cfgoptions,numoptions);
|
||||||
|
if ( ! (CONFIG_ISFLAGSET(CONFIG_NOEXITONHELP))) {
|
||||||
|
fprintf(stderr,"[CONFIG] %s %i section %s:", __FILE__, __LINE__, prefix);
|
||||||
|
exit_fun(" Exiting after displaying help\n");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (*p[0] == '-') {
|
/* now, check for non help options */
|
||||||
for(int i=0;i<numoptions;i++) {
|
if (oneargv[0] == '-') {
|
||||||
if ( ( cfgoptions[i].paramflags & PARAMFLAG_DISABLECMDLINE) != 0) {
|
for(int n=0;n<numoptions;n++) {
|
||||||
|
if ( ( cfgoptions[n].paramflags & PARAMFLAG_DISABLECMDLINE) != 0) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
if (prefix != NULL) {
|
if (prefix != NULL) {
|
||||||
sprintf(cfgpath,"%s.%s",prefix,cfgoptions[i].optname);
|
sprintf(cfgpath,"%s.%s",prefix,cfgoptions[n].optname);
|
||||||
} else {
|
} else {
|
||||||
sprintf(cfgpath,"%s",cfgoptions[i].optname);
|
sprintf(cfgpath,"%s",cfgoptions[n].optname);
|
||||||
}
|
}
|
||||||
|
if ( ((strlen(oneargv) == 2) && (strcmp(oneargv + 1,cfgpath) == 0)) || /* short option, one "-" */
|
||||||
if ( ((strlen(*p) == 2) && (strcmp(*p + 1,cfgpath) == 0)) ||
|
((strlen(oneargv) > 2) && (strcmp(oneargv + 2,cfgpath ) == 0 )) ) {
|
||||||
((strlen(*p) > 2) && (strcmp(*p + 2,cfgpath ) == 0 )) ) {
|
char *valptr=NULL;
|
||||||
pp = *(p+1);
|
int ret;
|
||||||
if ( ( pp != NULL ) && (c>1) && (pp[0]!= '-') ) {
|
if (c > 0) {
|
||||||
|
pp = config_get_if()->argv[i+1];
|
||||||
j += processoption(&(cfgoptions[i]), pp);
|
if (pp != NULL ) {
|
||||||
} else {
|
ret = strlen(pp);
|
||||||
j += processoption(&(cfgoptions[i]), NULL);
|
if (ret > 0 ) {
|
||||||
|
if (pp[0] != '-')
|
||||||
|
valptr=pp;
|
||||||
|
else if ( ret > 1 && pp[0] == '-' && isdigit(pp[1]) )
|
||||||
|
valptr=pp;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
j += processoption(&(cfgoptions[n]), valptr);
|
||||||
|
if ( valptr != NULL ) {
|
||||||
|
i++;
|
||||||
|
c--;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
} /* for */
|
} /* for n... */
|
||||||
} /* if (*p[0] == '-') */
|
} /* if (oneargv[0] == '-') */
|
||||||
p++;
|
free(oneargv);
|
||||||
|
i++;
|
||||||
c--;
|
c--;
|
||||||
} /* fin du while */
|
} /* fin du while */
|
||||||
printf_cmdl("[CONFIG] %s %i options set from command line\n",((prefix == NULL) ? "":prefix),j);
|
printf_cmdl("[CONFIG] %s %i options set from command line\n",((prefix == NULL) ? "(root)":prefix),j);
|
||||||
free(cfgpath);
|
free(cfgpath);
|
||||||
return j;
|
return j;
|
||||||
} /* parse_cmdline*/
|
} /* parse_cmdline*/
|
||||||
|
|||||||
@@ -97,7 +97,77 @@ int st;
|
|||||||
}
|
}
|
||||||
/*-----------------------------------------------------------------------------------*/
|
/*-----------------------------------------------------------------------------------*/
|
||||||
/* from here: interface implementtion of the configuration module */
|
/* from here: interface implementtion of the configuration module */
|
||||||
|
int nooptfunc(void) {
|
||||||
|
return 0;
|
||||||
|
};
|
||||||
|
|
||||||
|
int config_cmdlineonly_getlist(paramlist_def_t *ParamList,
|
||||||
|
paramdef_t *params, int numparams, char *prefix)
|
||||||
|
{
|
||||||
|
ParamList->numelt = 0;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int config_cmdlineonly_get(paramdef_t *cfgoptions,int numoptions, char *prefix )
|
||||||
|
{
|
||||||
|
int defval;
|
||||||
|
int fatalerror=0;
|
||||||
|
int numdefvals=0;
|
||||||
|
|
||||||
|
|
||||||
|
for(int i=0;i<numoptions;i++) {
|
||||||
|
defval=0;
|
||||||
|
switch(cfgoptions[i].type) {
|
||||||
|
case TYPE_STRING:
|
||||||
|
defval=config_setdefault_string(&(cfgoptions[i]), prefix);
|
||||||
|
break;
|
||||||
|
case TYPE_STRINGLIST:
|
||||||
|
defval=config_setdefault_stringlist(&(cfgoptions[i]), prefix);
|
||||||
|
break;
|
||||||
|
case TYPE_UINT8:
|
||||||
|
case TYPE_INT8:
|
||||||
|
case TYPE_UINT16:
|
||||||
|
case TYPE_INT16:
|
||||||
|
case TYPE_UINT32:
|
||||||
|
case TYPE_INT32:
|
||||||
|
case TYPE_MASK:
|
||||||
|
defval=config_setdefault_int(&(cfgoptions[i]), prefix);
|
||||||
|
break;
|
||||||
|
case TYPE_UINT64:
|
||||||
|
case TYPE_INT64:
|
||||||
|
defval=config_setdefault_int64(&(cfgoptions[i]), prefix);
|
||||||
|
break;
|
||||||
|
case TYPE_UINTARRAY:
|
||||||
|
case TYPE_INTARRAY:
|
||||||
|
defval=config_setdefault_intlist(&(cfgoptions[i]), prefix);
|
||||||
|
break;
|
||||||
|
case TYPE_DOUBLE:
|
||||||
|
defval=config_setdefault_double(&(cfgoptions[i]), prefix);
|
||||||
|
break;
|
||||||
|
case TYPE_IPV4ADDR:
|
||||||
|
defval=config_setdefault_ipv4addr(&(cfgoptions[i]), prefix);
|
||||||
|
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
fprintf(stderr,"[CONFIG] %s.%s type %i not supported\n",prefix, cfgoptions[i].optname,cfgoptions[i].type);
|
||||||
|
fatalerror=1;
|
||||||
|
break;
|
||||||
|
} /* switch on param type */
|
||||||
|
if (defval == 1) {
|
||||||
|
numdefvals++;
|
||||||
|
cfgoptions[i].paramflags = cfgoptions[i].paramflags | PARAMFLAG_PARAMSETDEF;
|
||||||
|
}
|
||||||
|
} /* for loop on options */
|
||||||
|
printf("[CONFIG] %s: %i/%i parameters successfully set \n",
|
||||||
|
((prefix == NULL)?"(root)":prefix),
|
||||||
|
numdefvals,numoptions );
|
||||||
|
if (fatalerror == 1) {
|
||||||
|
fprintf(stderr,"[CONFIG] fatal errors found when assigning %s parameters \n",
|
||||||
|
prefix);
|
||||||
|
}
|
||||||
|
return numdefvals;
|
||||||
|
}
|
||||||
|
|
||||||
configmodule_interface_t *load_configmodule(int argc, char **argv)
|
configmodule_interface_t *load_configmodule(int argc, char **argv)
|
||||||
{
|
{
|
||||||
@@ -110,17 +180,19 @@ uint32_t tmpflags=0;
|
|||||||
int i;
|
int i;
|
||||||
|
|
||||||
/* first parse the command line to look for the -O option */
|
/* first parse the command line to look for the -O option */
|
||||||
opterr=0;
|
|
||||||
for (i = 0;i<argc;i++) {
|
for (i = 0;i<argc;i++) {
|
||||||
if (strlen(argv[i]) < 2) continue;
|
if (strlen(argv[i]) < 2) continue;
|
||||||
if ( argv[i][1] == 'O' && i < (argc -1)) {
|
if ( argv[i][1] == 'O' && i < (argc -1)) {
|
||||||
cfgparam = argv[i+1];
|
cfgparam = argv[i+1];
|
||||||
}
|
}
|
||||||
if ( argv[i][1] == 'h' ) {
|
if ( strstr(argv[i], "help_config") != NULL ) {
|
||||||
|
config_printhelp(Config_Params,CONFIG_PARAMLENGTH(Config_Params));
|
||||||
|
exit(0);
|
||||||
|
}
|
||||||
|
if ( (strcmp(argv[i]+1, "h") == 0) || (strstr(argv[i]+1, "help_") != NULL ) ) {
|
||||||
tmpflags = CONFIG_HELP;
|
tmpflags = CONFIG_HELP;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
optind=1;
|
|
||||||
|
|
||||||
/* look for the OAI_CONFIGMODULE environement variable */
|
/* look for the OAI_CONFIGMODULE environement variable */
|
||||||
if ( cfgparam == NULL ) {
|
if ( cfgparam == NULL ) {
|
||||||
@@ -129,21 +201,25 @@ int i;
|
|||||||
|
|
||||||
/* default */
|
/* default */
|
||||||
if (cfgparam == NULL) {
|
if (cfgparam == NULL) {
|
||||||
tmpflags = tmpflags | CONFIG_NOOOPT;
|
tmpflags = tmpflags | CONFIG_NOOOPT;
|
||||||
cfgparam = DEFAULT_CFGMODE ":" DEFAULT_CFGFILENAME;
|
if (strstr(argv[0],"uesoftmodem") == NULL) {
|
||||||
}
|
cfgparam = CONFIG_LIBCONFIGFILE ":" DEFAULT_CFGFILENAME;
|
||||||
|
} else {
|
||||||
|
cfgparam = CONFIG_CMDLINEONLY ":dbgl0" ;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/* parse the config parameters to set the config source */
|
/* parse the config parameters to set the config source */
|
||||||
i = sscanf(cfgparam,"%m[^':']:%ms",&cfgmode,&modeparams);
|
i = sscanf(cfgparam,"%m[^':']:%ms",&cfgmode,&modeparams);
|
||||||
if (i< 0) {
|
if (i< 0) {
|
||||||
fprintf(stderr,"[CONFIG] %s, %d, sscanf error parsing config source %s: %s\n", __FILE__, __LINE__,cfgparam, strerror(errno));
|
fprintf(stderr,"[CONFIG] %s, %d, sscanf error parsing config source %s: %s\n", __FILE__, __LINE__,cfgparam, strerror(errno));
|
||||||
cfgmode=strdup(DEFAULT_CFGMODE);
|
exit(-1);
|
||||||
modeparams = strdup(DEFAULT_CFGFILENAME);
|
|
||||||
}
|
}
|
||||||
else if ( i == 1 ) {
|
else if ( i == 1 ) {
|
||||||
/* -O argument doesn't contain ":" separator, assume -O <conf file> option, default cfgmode to libconfig
|
/* -O argument doesn't contain ":" separator, assume -O <conf file> option, default cfgmode to libconfig
|
||||||
with one parameter, the path to the configuration file */
|
with one parameter, the path to the configuration file */
|
||||||
modeparams=cfgmode;
|
modeparams=cfgmode;
|
||||||
cfgmode=strdup(DEFAULT_CFGMODE);
|
cfgmode=strdup(CONFIG_LIBCONFIGFILE);
|
||||||
}
|
}
|
||||||
|
|
||||||
cfgptr = malloc(sizeof(configmodule_interface_t));
|
cfgptr = malloc(sizeof(configmodule_interface_t));
|
||||||
@@ -153,7 +229,6 @@ int i;
|
|||||||
cfgptr->argc = argc;
|
cfgptr->argc = argc;
|
||||||
cfgptr->argv = argv;
|
cfgptr->argv = argv;
|
||||||
cfgptr->cfgmode=strdup(cfgmode);
|
cfgptr->cfgmode=strdup(cfgmode);
|
||||||
|
|
||||||
cfgptr->num_cfgP=0;
|
cfgptr->num_cfgP=0;
|
||||||
atoken=strtok_r(modeparams,":",&strtokctx);
|
atoken=strtok_r(modeparams,":",&strtokctx);
|
||||||
while ( cfgptr->num_cfgP< CONFIG_MAX_OOPT_PARAMS && atoken != NULL) {
|
while ( cfgptr->num_cfgP< CONFIG_MAX_OOPT_PARAMS && atoken != NULL) {
|
||||||
@@ -176,24 +251,33 @@ int i;
|
|||||||
for (i=0;i<cfgptr->num_cfgP; i++) {
|
for (i=0;i<cfgptr->num_cfgP; i++) {
|
||||||
printf("%s ",cfgptr->cfgP[i]);
|
printf("%s ",cfgptr->cfgP[i]);
|
||||||
}
|
}
|
||||||
printf("\n");
|
printf(", debug flags: 0x%08x\n",cfgptr->rtflags);
|
||||||
|
|
||||||
|
if (strstr(cfgparam,CONFIG_CMDLINEONLY) == NULL) {
|
||||||
i=load_config_sharedlib(cfgptr);
|
i=load_config_sharedlib(cfgptr);
|
||||||
if (i< 0) {
|
if (i == 0) {
|
||||||
fprintf(stderr,"[CONFIG] %s %d config module %s couldn't be loaded\n", __FILE__, __LINE__,cfgmode);
|
printf("[CONFIG] config module %s loaded\n",cfgmode);
|
||||||
cfgptr->rtflags = cfgptr->rtflags | CONFIG_HELP | CONFIG_ABORT;
|
Config_Params[CONFIGPARAM_DEBUGFLAGS_IDX].uptr=&(cfgptr->rtflags);
|
||||||
|
config_get(Config_Params,CONFIG_PARAMLENGTH(Config_Params), CONFIG_SECTIONNAME );
|
||||||
|
} else {
|
||||||
|
fprintf(stderr,"[CONFIG] %s %d config module \"%s\" couldn't be loaded\n", __FILE__, __LINE__,cfgmode);
|
||||||
|
cfgptr->rtflags = cfgptr->rtflags | CONFIG_HELP | CONFIG_ABORT;
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
printf("[CONFIG] config module %s loaded\n",cfgmode);
|
cfgptr->init = (configmodule_initfunc_t)nooptfunc;
|
||||||
Config_Params[CONFIGPARAM_DEBUGFLAGS_IDX].uptr=&(cfgptr->rtflags);
|
cfgptr->get = config_cmdlineonly_get;
|
||||||
config_get(Config_Params,CONFIG_PARAMLENGTH(Config_Params), CONFIG_SECTIONNAME );
|
cfgptr->getlist = config_cmdlineonly_getlist;
|
||||||
|
cfgptr->end = (configmodule_endfunc_t)nooptfunc;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
if (modeparams != NULL) free(modeparams);
|
if (modeparams != NULL) free(modeparams);
|
||||||
if (cfgmode != NULL) free(cfgmode);
|
if (cfgmode != NULL) free(cfgmode);
|
||||||
if (CONFIG_ISFLAGSET(CONFIG_ABORT)) config_printhelp(Config_Params,CONFIG_PARAMLENGTH(Config_Params));
|
if (CONFIG_ISFLAGSET(CONFIG_ABORT)) {
|
||||||
|
config_printhelp(Config_Params,CONFIG_PARAMLENGTH(Config_Params));
|
||||||
|
// exit(-1);
|
||||||
|
}
|
||||||
return cfgptr;
|
return cfgptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -41,17 +41,19 @@
|
|||||||
#define CONFIG_MAX_ALLOCATEDPTRS 1024 // maximum number of parameters that can be dynamicaly allocated in the config module
|
#define CONFIG_MAX_ALLOCATEDPTRS 1024 // maximum number of parameters that can be dynamicaly allocated in the config module
|
||||||
|
|
||||||
/* default values for configuration module parameters */
|
/* default values for configuration module parameters */
|
||||||
#define DEFAULT_CFGMODE "libconfig" // use libconfig file
|
#define CONFIG_LIBCONFIGFILE "libconfig" // use libconfig file
|
||||||
#define DEFAULT_CFGFILENAME "oai.conf" // default config file
|
#define CONFIG_CMDLINEONLY "cmdline" // use only command line options
|
||||||
|
#define DEFAULT_CFGFILENAME "oai.conf" // default config file
|
||||||
|
|
||||||
/* rtflags bit position definitions */
|
/* rtflags bit position definitions */
|
||||||
#define CONFIG_PRINTPARAMS 1 // print parameters values while processing
|
#define CONFIG_PRINTPARAMS 1 // print parameters values while processing
|
||||||
#define CONFIG_DEBUGPTR 1<<1 // print memory allocation/free debug messages
|
#define CONFIG_DEBUGPTR (1<<1) // print memory allocation/free debug messages
|
||||||
#define CONFIG_DEBUGCMDLINE 1<<2 // print command line processing messages
|
#define CONFIG_DEBUGCMDLINE (1<<2) // print command line processing messages
|
||||||
#define CONFIG_NOABORTONCHKF 1<<3 // disable abort execution when parameter checking function fails
|
#define CONFIG_NOABORTONCHKF (1<<3) // disable abort execution when parameter checking function fails
|
||||||
#define CONFIG_HELP 1<<20 // print help message
|
#define CONFIG_NOEXITONHELP (1<<19) // do not exit after printing help
|
||||||
#define CONFIG_ABORT 1<<21 // config failed,abort execution
|
#define CONFIG_HELP (1<<20) // print help message
|
||||||
#define CONFIG_NOOOPT 1<<22 // no -O option found when parsing command line
|
#define CONFIG_ABORT (1<<21) // config failed,abort execution
|
||||||
|
#define CONFIG_NOOOPT (1<<22) // no -O option found when parsing command line
|
||||||
typedef int(*configmodule_initfunc_t)(char *cfgP[],int numP);
|
typedef int(*configmodule_initfunc_t)(char *cfgP[],int numP);
|
||||||
typedef int(*configmodule_getfunc_t)(paramdef_t *,int numparams, char *prefix);
|
typedef int(*configmodule_getfunc_t)(paramdef_t *,int numparams, char *prefix);
|
||||||
typedef int(*configmodule_getlistfunc_t)(paramlist_def_t *, paramdef_t *,int numparams, char *prefix);
|
typedef int(*configmodule_getlistfunc_t)(paramlist_def_t *, paramdef_t *,int numparams, char *prefix);
|
||||||
@@ -75,7 +77,7 @@ typedef struct configmodule_interface
|
|||||||
#ifdef CONFIG_LOADCONFIG_MAIN
|
#ifdef CONFIG_LOADCONFIG_MAIN
|
||||||
configmodule_interface_t *cfgptr=NULL;
|
configmodule_interface_t *cfgptr=NULL;
|
||||||
|
|
||||||
static char config_helpstr [] = "\n lte-softmodem -O [config mode]<:dbg[debugflags]> \n \
|
static char config_helpstr [] = "\n lte-softmodem -O [config mode]<:dbgl[debugflags]> \n \
|
||||||
debugflags can also be defined in the config_libconfig section of the config file\n \
|
debugflags can also be defined in the config_libconfig section of the config file\n \
|
||||||
debugflags: mask, 1->print parameters, 2->print memory allocations debug messages\n \
|
debugflags: mask, 1->print parameters, 2->print memory allocations debug messages\n \
|
||||||
4->print command line processing debug messages\n ";
|
4->print command line processing debug messages\n ";
|
||||||
@@ -97,9 +99,9 @@ extern configmodule_interface_t *cfgptr;
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
#define printf_params(...) if ( (cfgptr->rtflags & CONFIG_PRINTPARAMS) != 0 ) { printf ( __VA_ARGS__ ); }
|
#define printf_params(...) if ( (cfgptr->rtflags & (CONFIG_PRINTPARAMS)) != 0 ) { printf ( __VA_ARGS__ ); }
|
||||||
#define printf_ptrs(...) if ( (cfgptr->rtflags & CONFIG_DEBUGPTR) != 0 ) { printf ( __VA_ARGS__ ); }
|
#define printf_ptrs(...) if ( (cfgptr->rtflags & (CONFIG_DEBUGPTR)) != 0 ) { printf ( __VA_ARGS__ ); }
|
||||||
#define printf_cmdl(...) if ( (cfgptr->rtflags & CONFIG_DEBUGCMDLINE) != 0 ) { printf ( __VA_ARGS__ ); }
|
#define printf_cmdl(...) if ( (cfgptr->rtflags & (CONFIG_DEBUGCMDLINE)) != 0 ) { printf ( __VA_ARGS__ ); }
|
||||||
|
|
||||||
extern configmodule_interface_t *load_configmodule(int argc, char **argv);
|
extern configmodule_interface_t *load_configmodule(int argc, char **argv);
|
||||||
extern void end_configmodule(void);
|
extern void end_configmodule(void);
|
||||||
|
|||||||
@@ -148,7 +148,10 @@ typedef struct paramdef
|
|||||||
#define TYPE_MASK 10
|
#define TYPE_MASK 10
|
||||||
#define TYPE_DOUBLE 16
|
#define TYPE_DOUBLE 16
|
||||||
#define TYPE_IPV4ADDR 20
|
#define TYPE_IPV4ADDR 20
|
||||||
|
#define TYPE_LASTSCALAR 25
|
||||||
|
|
||||||
|
#define PARAM_ISLISTORARRAY(P) (P->type > TYPE_LASTSCALAR )
|
||||||
|
#define PARAM_ISSCALAR(P) (P->type < TYPE_LASTSCALAR )
|
||||||
|
|
||||||
#define TYPE_STRINGLIST 50
|
#define TYPE_STRINGLIST 50
|
||||||
#define TYPE_INTARRAY 51
|
#define TYPE_INTARRAY 51
|
||||||
|
|||||||
@@ -35,6 +35,8 @@
|
|||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
#include <errno.h>
|
#include <errno.h>
|
||||||
#include <dlfcn.h>
|
#include <dlfcn.h>
|
||||||
|
#include <arpa/inet.h>
|
||||||
|
|
||||||
#include "config_userapi.h"
|
#include "config_userapi.h"
|
||||||
extern void exit_fun(const char* s); // lte-softmodem clean exit function
|
extern void exit_fun(const char* s); // lte-softmodem clean exit function
|
||||||
|
|
||||||
@@ -50,10 +52,30 @@ configmodule_interface_t *config_get_if(void)
|
|||||||
|
|
||||||
char * config_check_valptr(paramdef_t *cfgoptions, char **ptr, int length)
|
char * config_check_valptr(paramdef_t *cfgoptions, char **ptr, int length)
|
||||||
{
|
{
|
||||||
|
if (ptr == NULL ) {
|
||||||
|
ptr = malloc(sizeof(char *));
|
||||||
|
if (ptr != NULL) {
|
||||||
|
*ptr=NULL;
|
||||||
|
cfgoptions->strptr=ptr;
|
||||||
|
if ( (cfgoptions->paramflags & PARAMFLAG_NOFREE) == 0) {
|
||||||
|
config_get_if()->ptrs[config_get_if()->numptrs] = (char *)ptr;
|
||||||
|
config_get_if()->numptrs++;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
fprintf(stderr, "[CONFIG] %s %d option %s, cannot allocate pointer: %s \n",
|
||||||
|
__FILE__, __LINE__, cfgoptions->optname, strerror(errno));
|
||||||
|
exit(-1);
|
||||||
|
}
|
||||||
|
}
|
||||||
printf_ptrs("[CONFIG] %s ptr: 0x%08lx requested size: %i\n",cfgoptions->optname,(uintptr_t)(ptr),length);
|
printf_ptrs("[CONFIG] %s ptr: 0x%08lx requested size: %i\n",cfgoptions->optname,(uintptr_t)(ptr),length);
|
||||||
if(cfgoptions->numelt > 0) { /* already allocated */
|
if(cfgoptions->numelt > 0 && PARAM_ISSCALAR(cfgoptions) ) { /* already allocated */
|
||||||
return *ptr;
|
if (*ptr != NULL) {
|
||||||
|
return *ptr;
|
||||||
|
} else {
|
||||||
|
fprintf(stderr,"[CONFIG] %s %d option %s, definition error: value pointer is NULL, declared as %i bytes allocated\n",
|
||||||
|
__FILE__, __LINE__,cfgoptions->optname, cfgoptions->numelt);
|
||||||
|
exit(-1);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (*ptr == NULL) {
|
if (*ptr == NULL) {
|
||||||
@@ -75,7 +97,7 @@ char * config_check_valptr(paramdef_t *cfgoptions, char **ptr, int length)
|
|||||||
void config_assign_int(paramdef_t *cfgoptions, char *fullname, int val)
|
void config_assign_int(paramdef_t *cfgoptions, char *fullname, int val)
|
||||||
{
|
{
|
||||||
int tmpval=val;
|
int tmpval=val;
|
||||||
if ( ((cfgoptions->paramflags &PARAMFLAG_BOOL) != 0) && tmpval >1) {
|
if ( ((cfgoptions->paramflags &PARAMFLAG_BOOL) != 0) && tmpval >0) {
|
||||||
tmpval =1;
|
tmpval =1;
|
||||||
}
|
}
|
||||||
switch (cfgoptions->type) {
|
switch (cfgoptions->type) {
|
||||||
@@ -160,7 +182,7 @@ int st=0;
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (st != 0) {
|
if (st != 0) {
|
||||||
fprintf(stderr,"[CONFIG] config_execcheck: %i parameters with wrong value\n", -st);
|
fprintf(stderr,"[CONFIG] config_execcheck: section %s %i parameters with wrong value\n", prefix, -st);
|
||||||
if ( CONFIG_ISFLAGSET(CONFIG_NOABORTONCHKF) == 0) {
|
if ( CONFIG_ISFLAGSET(CONFIG_NOABORTONCHKF) == 0) {
|
||||||
exit_fun("exit because configuration failed\n");
|
exit_fun("exit because configuration failed\n");
|
||||||
}
|
}
|
||||||
@@ -173,7 +195,7 @@ int config_get(paramdef_t *params,int numparams, char *prefix)
|
|||||||
int ret= -1;
|
int ret= -1;
|
||||||
|
|
||||||
if (CONFIG_ISFLAGSET(CONFIG_ABORT)) {
|
if (CONFIG_ISFLAGSET(CONFIG_ABORT)) {
|
||||||
fprintf(stderr,"[CONFIG] config_get skipped, config module not properly initialized\n");
|
fprintf(stderr,"[CONFIG] config_get, section %s skipped, config module not properly initialized\n",prefix);
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
configmodule_interface_t *cfgif = config_get_if();
|
configmodule_interface_t *cfgif = config_get_if();
|
||||||
@@ -283,3 +305,115 @@ int config_checkstr_assign_integer(paramdef_t *param)
|
|||||||
|
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int config_setdefault_string(paramdef_t *cfgoptions, char *prefix)
|
||||||
|
{
|
||||||
|
int status = 0;
|
||||||
|
if( cfgoptions->defstrval != NULL) {
|
||||||
|
status=1;
|
||||||
|
|
||||||
|
if (cfgoptions->numelt == 0 ) {
|
||||||
|
config_check_valptr(cfgoptions, (char **)(cfgoptions->strptr), sizeof(char *));
|
||||||
|
config_check_valptr(cfgoptions, cfgoptions->strptr, strlen(cfgoptions->defstrval)+1);
|
||||||
|
sprintf(*(cfgoptions->strptr), "%s",cfgoptions->defstrval);
|
||||||
|
printf_params("[CONFIG] %s.%s set to default value \"%s\"\n", ((prefix == NULL) ? "" : prefix), cfgoptions->optname, *(cfgoptions->strptr));
|
||||||
|
} else {
|
||||||
|
sprintf((char *)*(cfgoptions->strptr), "%s",cfgoptions->defstrval);
|
||||||
|
printf_params("[CONFIG] %s.%s set to default value \"%s\"\n", ((prefix == NULL) ? "" : prefix), cfgoptions->optname, (char *)*(cfgoptions->strptr));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return status;
|
||||||
|
}
|
||||||
|
|
||||||
|
int config_setdefault_stringlist(paramdef_t *cfgoptions, char *prefix)
|
||||||
|
{
|
||||||
|
int status = 0;
|
||||||
|
if( cfgoptions->defstrlistval != NULL) {
|
||||||
|
cfgoptions->strlistptr=cfgoptions->defstrlistval;
|
||||||
|
status=1;
|
||||||
|
for(int j=0; j<cfgoptions->numelt; j++)
|
||||||
|
printf_params("[CONFIG] %s.%s[%i] set to default value %s\n", ((prefix == NULL) ? "" : prefix), cfgoptions->optname,j, cfgoptions->strlistptr[j]);
|
||||||
|
}
|
||||||
|
return status;
|
||||||
|
}
|
||||||
|
|
||||||
|
int config_setdefault_int(paramdef_t *cfgoptions, char *prefix)
|
||||||
|
{
|
||||||
|
int status = 0;
|
||||||
|
config_check_valptr(cfgoptions, (char **)(&(cfgoptions->iptr)),sizeof(int32_t));
|
||||||
|
if( ((cfgoptions->paramflags & PARAMFLAG_MANDATORY) == 0)) {
|
||||||
|
config_assign_int(cfgoptions,cfgoptions->optname,cfgoptions->defintval);
|
||||||
|
status=1;
|
||||||
|
printf_params("[CONFIG] %s.%s set to default value\n", ((prefix == NULL) ? "" : prefix), cfgoptions->optname);
|
||||||
|
}
|
||||||
|
return status;
|
||||||
|
}
|
||||||
|
|
||||||
|
int config_setdefault_int64(paramdef_t *cfgoptions, char *prefix)
|
||||||
|
{
|
||||||
|
int status = 0;
|
||||||
|
config_check_valptr(cfgoptions, (char **)&(cfgoptions->i64ptr),sizeof(long long));
|
||||||
|
if( ((cfgoptions->paramflags & PARAMFLAG_MANDATORY) == 0)) {
|
||||||
|
*(cfgoptions->u64ptr)=cfgoptions->defuintval;
|
||||||
|
status=1;
|
||||||
|
printf_params("[CONFIG] %s.%s set to default value %llu\n", ((prefix == NULL) ? "" : prefix), cfgoptions->optname, (long long unsigned)(*(cfgoptions->u64ptr)));
|
||||||
|
}
|
||||||
|
return status;
|
||||||
|
}
|
||||||
|
|
||||||
|
int config_setdefault_intlist(paramdef_t *cfgoptions, char *prefix)
|
||||||
|
{
|
||||||
|
int status = 0;
|
||||||
|
if( cfgoptions->defintarrayval != NULL) {
|
||||||
|
config_check_valptr(cfgoptions,(char **)&(cfgoptions->iptr), sizeof(int32_t*));
|
||||||
|
cfgoptions->iptr=cfgoptions->defintarrayval;
|
||||||
|
status=1;
|
||||||
|
for (int j=0; j<cfgoptions->numelt ; j++) {
|
||||||
|
printf_params("[CONFIG] %s[%i] set to default value %i\n",cfgoptions->optname ,j,(int)cfgoptions->iptr[j]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return status;
|
||||||
|
}
|
||||||
|
|
||||||
|
int config_setdefault_double(paramdef_t *cfgoptions, char *prefix)
|
||||||
|
{
|
||||||
|
int status = 0;
|
||||||
|
config_check_valptr(cfgoptions, (char **)&(cfgoptions->dblptr),sizeof(double));
|
||||||
|
if( ((cfgoptions->paramflags & PARAMFLAG_MANDATORY) == 0)) {
|
||||||
|
*(cfgoptions->u64ptr)=cfgoptions->defdblval;
|
||||||
|
status=1;
|
||||||
|
printf_params("[CONFIG] %s set to default value %lf\n",cfgoptions->optname , *(cfgoptions->dblptr));
|
||||||
|
}
|
||||||
|
return status;
|
||||||
|
}
|
||||||
|
|
||||||
|
int config_assign_ipv4addr(paramdef_t *cfgoptions, char *ipv4addr)
|
||||||
|
{
|
||||||
|
config_check_valptr(cfgoptions,(char **)&(cfgoptions->uptr), sizeof(int));
|
||||||
|
int rst=inet_pton(AF_INET, ipv4addr ,cfgoptions->uptr );
|
||||||
|
if (rst == 1 && *(cfgoptions->uptr) > 0) {
|
||||||
|
printf_params("[CONFIG] %s: %s\n",cfgoptions->optname, ipv4addr);
|
||||||
|
return 1;
|
||||||
|
} else {
|
||||||
|
if ( strncmp(ipv4addr,ANY_IPV4ADDR_STRING,sizeof(ANY_IPV4ADDR_STRING)) == 0) {
|
||||||
|
printf_params("[CONFIG] %s:%s (INADDR_ANY) \n",cfgoptions->optname,ipv4addr);
|
||||||
|
*cfgoptions->uptr=INADDR_ANY;
|
||||||
|
return 1;
|
||||||
|
} else {
|
||||||
|
fprintf(stderr,"[CONFIG] %s not valid for %s \n", ipv4addr, cfgoptions->optname);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int config_setdefault_ipv4addr(paramdef_t *cfgoptions, char *prefix)
|
||||||
|
{
|
||||||
|
int status = 0;
|
||||||
|
|
||||||
|
if (cfgoptions->defstrval != NULL) {
|
||||||
|
status = config_assign_ipv4addr(cfgoptions, cfgoptions->defstrval);
|
||||||
|
}
|
||||||
|
return status;
|
||||||
|
}
|
||||||
|
|||||||
@@ -38,10 +38,15 @@
|
|||||||
extern "C"
|
extern "C"
|
||||||
{
|
{
|
||||||
#endif
|
#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_GETSOURCE ( (config_get_if()==NULL) ? NULL : config_get_if()->cfgmode )
|
||||||
#define CONFIG_GETNUMP ( (config_get_if()==NULL) ? 0 : config_get_if()->num_cfgP )
|
#define CONFIG_GETNUMP ( (config_get_if()==NULL) ? 0 : config_get_if()->num_cfgP )
|
||||||
#define CONFIG_GETP(P) ( (config_get_if()==NULL) ? NULL : config_get_if()->cfgP[P] )
|
#define CONFIG_GETP(P) ( (config_get_if()==NULL) ? NULL : config_get_if()->cfgP[P] )
|
||||||
#define CONFIG_ISFLAGSET(P) ( (config_get_if()==NULL) ? 0 : !!(config_get_if()->rtflags & P))
|
#define CONFIG_ISFLAGSET(P) ( (config_get_if()==NULL) ? 0 : !!(config_get_if()->rtflags & P))
|
||||||
|
#define CONFIG_SETRTFLAG(P) if (config_get_if()) { config_get_if()->rtflags |= P; }
|
||||||
|
#define CONFIG_CLEARRTFLAG(P) if (config_get_if()) { config_get_if()->rtflags &= (~P); }
|
||||||
#define CONFIG_ISPARAMFLAGSET(P,F) ( !!(P.paramflags & F))
|
#define CONFIG_ISPARAMFLAGSET(P,F) ( !!(P.paramflags & F))
|
||||||
/* utility functions, to be used by configuration module and/or configuration libraries */
|
/* utility functions, to be used by configuration module and/or configuration libraries */
|
||||||
extern configmodule_interface_t *config_get_if(void);
|
extern configmodule_interface_t *config_get_if(void);
|
||||||
@@ -50,6 +55,7 @@ extern void config_printhelp(paramdef_t *,int numparams);
|
|||||||
extern int config_process_cmdline(paramdef_t *params,int numparams, char *prefix);
|
extern int config_process_cmdline(paramdef_t *params,int numparams, char *prefix);
|
||||||
extern void config_assign_processedint(paramdef_t *cfgoption, int val);
|
extern void config_assign_processedint(paramdef_t *cfgoption, int val);
|
||||||
extern void config_assign_int(paramdef_t *cfgoptions, char *fullname, int val);
|
extern void config_assign_int(paramdef_t *cfgoptions, char *fullname, int val);
|
||||||
|
extern int config_assign_ipv4addr(paramdef_t *cfgoptions, char *ipv4addr);
|
||||||
|
|
||||||
/* apis to get parameters, to be used by oai modules, at configuration time */
|
/* apis to get parameters, to be used by oai modules, at configuration time */
|
||||||
extern int config_get(paramdef_t *params,int numparams, char *prefix);
|
extern int config_get(paramdef_t *params,int numparams, char *prefix);
|
||||||
@@ -66,6 +72,15 @@ extern int config_check_intrange(paramdef_t *param);
|
|||||||
extern int config_check_strval(paramdef_t *param);
|
extern int config_check_strval(paramdef_t *param);
|
||||||
extern int config_checkstr_assign_integer(paramdef_t *param);
|
extern int config_checkstr_assign_integer(paramdef_t *param);
|
||||||
|
|
||||||
|
/* functions to set a parameter to its default value */
|
||||||
|
extern int config_setdefault_string(paramdef_t *cfgoptions, char *prefix);
|
||||||
|
extern int config_setdefault_stringlist(paramdef_t *cfgoptions, char *prefix);
|
||||||
|
extern int config_setdefault_int(paramdef_t *cfgoptions, char *prefix);
|
||||||
|
extern int config_setdefault_int64(paramdef_t *cfgoptions, char *prefix);
|
||||||
|
extern int config_setdefault_intlist(paramdef_t *cfgoptions, char *prefix);
|
||||||
|
extern int config_setdefault_double(paramdef_t *cfgoptions, char *prefix);
|
||||||
|
extern int config_setdefault_ipv4addr(paramdef_t *cfgoptions, char *prefix);
|
||||||
|
|
||||||
#define CONFIG_GETCONFFILE (config_get_if()->cfgP[0])
|
#define CONFIG_GETCONFFILE (config_get_if()->cfgP[0])
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
|
|||||||
@@ -129,8 +129,6 @@ int config_libconfig_get(paramdef_t *cfgoptions,int numoptions, char *prefix )
|
|||||||
switch(cfgoptions[i].type)
|
switch(cfgoptions[i].type)
|
||||||
{
|
{
|
||||||
case TYPE_STRING:
|
case TYPE_STRING:
|
||||||
|
|
||||||
printf("call config_lookup_string for '%s' %p\n", cfgpath, &(libconfig_privdata.cfg)); fflush(stdout);
|
|
||||||
if ( config_lookup_string(&(libconfig_privdata.cfg),cfgpath, (const char **)&str)) {
|
if ( config_lookup_string(&(libconfig_privdata.cfg),cfgpath, (const char **)&str)) {
|
||||||
if ( cfgoptions[i].numelt > 0 && str != NULL && strlen(str) >= cfgoptions[i].numelt ) {
|
if ( cfgoptions[i].numelt > 0 && str != NULL && strlen(str) >= cfgoptions[i].numelt ) {
|
||||||
fprintf(stderr,"[LIBCONFIG] %s: %s exceeds maximum length of %i bytes, value truncated\n",
|
fprintf(stderr,"[LIBCONFIG] %s: %s exceeds maximum length of %i bytes, value truncated\n",
|
||||||
@@ -138,7 +136,7 @@ printf("call config_lookup_string for '%s' %p\n", cfgpath, &(libconfig_privdata.
|
|||||||
str[strlen(str)-1] = 0;
|
str[strlen(str)-1] = 0;
|
||||||
}
|
}
|
||||||
if (cfgoptions[i].numelt == 0 ) {
|
if (cfgoptions[i].numelt == 0 ) {
|
||||||
config_check_valptr(&(cfgoptions[i]), (char **)(&(cfgoptions[i].strptr)), sizeof(char *));
|
// config_check_valptr(&(cfgoptions[i]), (char **)(&(cfgoptions[i].strptr)), sizeof(char *));
|
||||||
config_check_valptr(&(cfgoptions[i]), cfgoptions[i].strptr, strlen(str)+1);
|
config_check_valptr(&(cfgoptions[i]), cfgoptions[i].strptr, strlen(str)+1);
|
||||||
sprintf( *(cfgoptions[i].strptr) , "%s", str);
|
sprintf( *(cfgoptions[i].strptr) , "%s", str);
|
||||||
printf_params("[LIBCONFIG] %s: \"%s\"\n", cfgpath,*(cfgoptions[i].strptr) );
|
printf_params("[LIBCONFIG] %s: \"%s\"\n", cfgpath,*(cfgoptions[i].strptr) );
|
||||||
@@ -147,21 +145,7 @@ printf("call config_lookup_string for '%s' %p\n", cfgpath, &(libconfig_privdata.
|
|||||||
printf_params("[LIBCONFIG] %s: \"%s\"\n", cfgpath,(char *)cfgoptions[i].strptr );
|
printf_params("[LIBCONFIG] %s: \"%s\"\n", cfgpath,(char *)cfgoptions[i].strptr );
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
if( cfgoptions[i].defstrval != NULL) {
|
defval=config_setdefault_string(&(cfgoptions[i]),prefix);
|
||||||
defval=1;
|
|
||||||
|
|
||||||
if (cfgoptions[i].numelt == 0 ) {
|
|
||||||
config_check_valptr(&(cfgoptions[i]), (char **)(&(cfgoptions[i].strptr)), sizeof(char *));
|
|
||||||
config_check_valptr(&(cfgoptions[i]), cfgoptions[i].strptr, strlen(cfgoptions[i].defstrval)+1);
|
|
||||||
sprintf(*(cfgoptions[i].strptr), "%s",cfgoptions[i].defstrval);
|
|
||||||
printf_params("[LIBCONFIG] %s set to default value \"%s\"\n", cfgpath, *(cfgoptions[i].strptr));
|
|
||||||
} else {
|
|
||||||
sprintf((char *)*(cfgoptions[i].strptr), "%s",cfgoptions[i].defstrval);
|
|
||||||
printf_params("[LIBCONFIG] %s set to default value \"%s\"\n", cfgpath, (char *)*(cfgoptions[i].strptr));
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
notfound=1;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case TYPE_STRINGLIST:
|
case TYPE_STRINGLIST:
|
||||||
@@ -169,14 +153,7 @@ printf("call config_lookup_string for '%s' %p\n", cfgpath, &(libconfig_privdata.
|
|||||||
if ( setting != NULL) {
|
if ( setting != NULL) {
|
||||||
read_strlist(&cfgoptions[i],setting,cfgpath);
|
read_strlist(&cfgoptions[i],setting,cfgpath);
|
||||||
} else {
|
} else {
|
||||||
if( cfgoptions[i].defstrlistval != NULL) {
|
defval=config_setdefault_stringlist(&(cfgoptions[i]),prefix);
|
||||||
cfgoptions[i].strlistptr=cfgoptions[i].defstrlistval;
|
|
||||||
defval=1;
|
|
||||||
for(int j=0; j<cfgoptions[i].numelt; j++)
|
|
||||||
printf_params("[LIBCONFIG] %s%i set to default value %s\n", cfgpath,j, cfgoptions[i].strlistptr[j]);
|
|
||||||
} else {
|
|
||||||
notfound=1;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case TYPE_UINT8:
|
case TYPE_UINT8:
|
||||||
@@ -186,23 +163,17 @@ printf("call config_lookup_string for '%s' %p\n", cfgpath, &(libconfig_privdata.
|
|||||||
case TYPE_UINT32:
|
case TYPE_UINT32:
|
||||||
case TYPE_INT32:
|
case TYPE_INT32:
|
||||||
case TYPE_MASK:
|
case TYPE_MASK:
|
||||||
config_check_valptr(&(cfgoptions[i]), (char **)(&(cfgoptions[i].iptr)),sizeof(int32_t));
|
|
||||||
if ( config_lookup_int(&(libconfig_privdata.cfg),cfgpath, &u)) {
|
if ( config_lookup_int(&(libconfig_privdata.cfg),cfgpath, &u)) {
|
||||||
|
config_check_valptr(&(cfgoptions[i]), (char **)(&(cfgoptions[i].iptr)),sizeof(int32_t));
|
||||||
config_assign_int(&(cfgoptions[i]),cfgpath,u);
|
config_assign_int(&(cfgoptions[i]),cfgpath,u);
|
||||||
} else {
|
} else {
|
||||||
if( ((cfgoptions[i].paramflags & PARAMFLAG_MANDATORY) == 0)) {
|
defval=config_setdefault_int(&(cfgoptions[i]),prefix);
|
||||||
config_assign_int(&(cfgoptions[i]),cfgpath,cfgoptions[i].defintval);
|
|
||||||
defval=1;
|
|
||||||
printf_params("[LIBCONFIG] %s set to default value\n", cfgpath);
|
|
||||||
} else {
|
|
||||||
notfound=1;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case TYPE_UINT64:
|
case TYPE_UINT64:
|
||||||
case TYPE_INT64:
|
case TYPE_INT64:
|
||||||
config_check_valptr(&(cfgoptions[i]), (char **)&(cfgoptions[i].i64ptr),sizeof(long long));
|
|
||||||
if ( config_lookup_int64(&(libconfig_privdata.cfg),cfgpath, &llu)) {
|
if ( config_lookup_int64(&(libconfig_privdata.cfg),cfgpath, &llu)) {
|
||||||
|
config_check_valptr(&(cfgoptions[i]), (char **)&(cfgoptions[i].i64ptr),sizeof(long long));
|
||||||
if(cfgoptions[i].type==TYPE_UINT64) {
|
if(cfgoptions[i].type==TYPE_UINT64) {
|
||||||
*(cfgoptions[i].u64ptr) = (uint64_t)llu;
|
*(cfgoptions[i].u64ptr) = (uint64_t)llu;
|
||||||
printf_params("[LIBCONFIG] %s: %llu\n", cfgpath,(long long unsigned)(*(cfgoptions[i].u64ptr)) );
|
printf_params("[LIBCONFIG] %s: %llu\n", cfgpath,(long long unsigned)(*(cfgoptions[i].u64ptr)) );
|
||||||
@@ -211,13 +182,7 @@ printf("call config_lookup_string for '%s' %p\n", cfgpath, &(libconfig_privdata.
|
|||||||
printf_params("[LIBCONFIG] %s: %lli\n", cfgpath,(long long unsigned)(*(cfgoptions[i].i64ptr)) );
|
printf_params("[LIBCONFIG] %s: %lli\n", cfgpath,(long long unsigned)(*(cfgoptions[i].i64ptr)) );
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
if( ((cfgoptions[i].paramflags & PARAMFLAG_MANDATORY) == 0)) {
|
defval=config_setdefault_int64(&(cfgoptions[i]),prefix);
|
||||||
*(cfgoptions[i].u64ptr)=cfgoptions[i].defuintval;
|
|
||||||
defval=1;
|
|
||||||
printf_params("[LIBCONFIG] %s set to default value %llu\n", cfgpath, (long long unsigned)(*(cfgoptions[i].u64ptr)));
|
|
||||||
} else {
|
|
||||||
notfound=1;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case TYPE_UINTARRAY:
|
case TYPE_UINTARRAY:
|
||||||
@@ -226,57 +191,28 @@ printf("call config_lookup_string for '%s' %p\n", cfgpath, &(libconfig_privdata.
|
|||||||
if ( setting != NULL) {
|
if ( setting != NULL) {
|
||||||
read_intarray(&cfgoptions[i],setting,cfgpath);
|
read_intarray(&cfgoptions[i],setting,cfgpath);
|
||||||
} else {
|
} else {
|
||||||
if( cfgoptions[i].defintarrayval != NULL) {
|
defval=config_setdefault_intlist(&(cfgoptions[i]),prefix);
|
||||||
config_check_valptr(&(cfgoptions[i]),(char **)&(cfgoptions[i].iptr), sizeof(int32_t*));
|
|
||||||
cfgoptions[i].iptr=cfgoptions[i].defintarrayval;
|
|
||||||
defval=1;
|
|
||||||
for (int j=0; j<cfgoptions[i].numelt ; j++) {
|
|
||||||
printf_params("[LIBCONFIG] %s[%i] set to default value %i\n", cfgpath,j,(int)cfgoptions[i].iptr[j]);
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
notfound=1;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case TYPE_DOUBLE:
|
case TYPE_DOUBLE:
|
||||||
config_check_valptr(&(cfgoptions[i]), (char **)&(cfgoptions[i].dblptr),sizeof(double));
|
|
||||||
if ( config_lookup_float(&(libconfig_privdata.cfg),cfgpath, &dbl)) {
|
if ( config_lookup_float(&(libconfig_privdata.cfg),cfgpath, &dbl)) {
|
||||||
|
config_check_valptr(&(cfgoptions[i]), (char **)&(cfgoptions[i].dblptr),sizeof(double));
|
||||||
*(cfgoptions[i].dblptr) = dbl;
|
*(cfgoptions[i].dblptr) = dbl;
|
||||||
printf_params("[LIBCONFIG] %s: %lf\n", cfgpath,*(cfgoptions[i].dblptr) );
|
printf_params("[LIBCONFIG] %s: %lf\n", cfgpath,*(cfgoptions[i].dblptr) );
|
||||||
} else {
|
} else {
|
||||||
if( ((cfgoptions[i].paramflags & PARAMFLAG_MANDATORY) == 0)) {
|
defval=config_setdefault_double(&(cfgoptions[i]),prefix);
|
||||||
*(cfgoptions[i].u64ptr)=cfgoptions[i].defdblval;
|
|
||||||
defval=1;
|
|
||||||
printf_params("[LIBCONFIG] %s set to default value %lf\n", cfgpath, *(cfgoptions[i].dblptr));
|
|
||||||
} else {
|
|
||||||
notfound=1;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case TYPE_IPV4ADDR:
|
case TYPE_IPV4ADDR:
|
||||||
config_check_valptr(&(cfgoptions[i]),(char **)&(cfgoptions[i].uptr), sizeof(int));
|
|
||||||
if ( !config_lookup_string(&(libconfig_privdata.cfg),cfgpath, (const char **)&str)) {
|
if ( !config_lookup_string(&(libconfig_privdata.cfg),cfgpath, (const char **)&str)) {
|
||||||
str=cfgoptions[i].defstrval;
|
defval=config_setdefault_ipv4addr(&(cfgoptions[i]),prefix);
|
||||||
defval=1;
|
} else {
|
||||||
printf_params("[LIBCONFIG] %s set to default value %s\n", cfgpath, str);
|
rst=config_assign_ipv4addr(cfgoptions, str);
|
||||||
}
|
if (rst < 0) {
|
||||||
if (str != NULL) {
|
fprintf(stderr,"[LIBCONFIG] %s not valid for %s \n", str, cfgpath);
|
||||||
rst=inet_pton(AF_INET, str,cfgoptions[i].uptr );
|
fatalerror=1;
|
||||||
if (rst == 1 && *(cfgoptions[i].uptr) > 0) {
|
|
||||||
printf_params("[LIBCONFIG] %s: %s\n", cfgpath,str );
|
|
||||||
} else {
|
|
||||||
if ( strncmp(str,ANY_IPV4ADDR_STRING,sizeof(ANY_IPV4ADDR_STRING)) == 0) {
|
|
||||||
printf_params("[LIBCONFIG] %s:%s (INADDR_ANY) \n",cfgpath,str);
|
|
||||||
*cfgoptions[i].uptr=INADDR_ANY;
|
|
||||||
} else {
|
|
||||||
fprintf(stderr,"[LIBCONFIG] %s not valid for %s \n", str, cfgpath);
|
|
||||||
fatalerror=1;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
} else {
|
}
|
||||||
notfound=1;
|
|
||||||
}
|
|
||||||
|
|
||||||
break;
|
break;
|
||||||
case TYPE_LIST:
|
case TYPE_LIST:
|
||||||
setting = config_setting_lookup (config_root_setting(&(libconfig_privdata.cfg)),cfgpath );
|
setting = config_setting_lookup (config_root_setting(&(libconfig_privdata.cfg)),cfgpath );
|
||||||
|
|||||||
@@ -0,0 +1,707 @@
|
|||||||
|
/*
|
||||||
|
* Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
|
||||||
|
* contributor license agreements. See the NOTICE file distributed with
|
||||||
|
* this work for additional information regarding copyright ownership.
|
||||||
|
* The OpenAirInterface Software Alliance licenses this file to You under
|
||||||
|
* the OAI Public License, Version 1.1 (the "License"); you may not use this file
|
||||||
|
* except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.openairinterface.org/?page_id=698
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*-------------------------------------------------------------------------------
|
||||||
|
* For more information about the OpenAirInterface (OAI) Software Alliance:
|
||||||
|
* contact@openairinterface.org
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*! \file log.c
|
||||||
|
* \brief log implementaion
|
||||||
|
* \author Navid Nikaein
|
||||||
|
* \date 2009 - 2014
|
||||||
|
* \version 0.5
|
||||||
|
* @ingroup util
|
||||||
|
|
||||||
|
*/
|
||||||
|
|
||||||
|
#define _GNU_SOURCE /* required for pthread_getname_np */
|
||||||
|
//#define LOG_TEST 1
|
||||||
|
|
||||||
|
#define COMPONENT_LOG
|
||||||
|
#define COMPONENT_LOG_IF
|
||||||
|
#include <ctype.h>
|
||||||
|
#define LOG_MAIN
|
||||||
|
#include "log.h"
|
||||||
|
#include "vcd_signal_dumper.h"
|
||||||
|
#include "assertions.h"
|
||||||
|
|
||||||
|
#if defined(ENABLE_ITTI)
|
||||||
|
# include "intertask_interface.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
# include <pthread.h>
|
||||||
|
# include <string.h>
|
||||||
|
#include <linux/prctl.h>
|
||||||
|
#include "common/config/config_userapi.h"
|
||||||
|
// main log variables
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
mapping log_level_names[] = {
|
||||||
|
{"error", OAILOG_ERR},
|
||||||
|
{"file", OAILOG_FILE},
|
||||||
|
{"warn", OAILOG_WARNING},
|
||||||
|
{"info", OAILOG_INFO},
|
||||||
|
{"debug", OAILOG_DEBUG},
|
||||||
|
{"trace", OAILOG_TRACE},
|
||||||
|
{NULL, -1}
|
||||||
|
};
|
||||||
|
|
||||||
|
mapping log_options[] = {
|
||||||
|
{"nocolor", FLAG_NOCOLOR },
|
||||||
|
{"level", FLAG_LEVEL },
|
||||||
|
{"thread", FLAG_THREAD },
|
||||||
|
{NULL,-1}
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
mapping log_maskmap[] = {
|
||||||
|
{"prach", DEBUG_PRACH},
|
||||||
|
{"RU", DEBUG_RU},
|
||||||
|
{"LTEESTIM", DEBUG_LTEESTIM},
|
||||||
|
{"ctrlsocket", DEBUG_CTRLSOCKET},
|
||||||
|
{"UE_PHYPROC", DEBUG_UE_PHYPROC},
|
||||||
|
{"UE_TIMING", UE_TIMING},
|
||||||
|
{NULL,-1}
|
||||||
|
};
|
||||||
|
|
||||||
|
char *log_level_highlight_start[] = {LOG_RED, LOG_GREEN, LOG_ORANGE, "", LOG_BLUE, LOG_CYBL}; /*!< \brief Optional start-format strings for highlighting */
|
||||||
|
char *log_level_highlight_end[] = {LOG_RESET,LOG_RESET,LOG_RESET,LOG_RESET, LOG_RESET,LOG_RESET}; /*!< \brief Optional end-format strings for highlighting */
|
||||||
|
|
||||||
|
|
||||||
|
int write_file_matlab(const char *fname,const char *vname,void *data,int length,int dec,char format)
|
||||||
|
{
|
||||||
|
|
||||||
|
FILE *fp=NULL;
|
||||||
|
int i;
|
||||||
|
|
||||||
|
if (data == NULL)
|
||||||
|
return -1;
|
||||||
|
//printf("Writing %d elements of type %d to %s\n",length,format,fname);
|
||||||
|
|
||||||
|
|
||||||
|
if (format == 10 || format ==11 || format == 12 || format == 13 || format == 14) {
|
||||||
|
fp = fopen(fname,"a+");
|
||||||
|
} else if (format != 10 && format !=11 && format != 12 && format != 13 && format != 14) {
|
||||||
|
fp = fopen(fname,"w+");
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
if (fp== NULL) {
|
||||||
|
printf("[OPENAIR][FILE OUTPUT] Cannot open file %s\n",fname);
|
||||||
|
return(-1);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (format != 10 && format !=11 && format != 12 && format != 13 && format != 14)
|
||||||
|
fprintf(fp,"%s = [",vname);
|
||||||
|
|
||||||
|
|
||||||
|
switch (format) {
|
||||||
|
case 0: // real 16-bit
|
||||||
|
|
||||||
|
for (i=0; i<length; i+=dec) {
|
||||||
|
fprintf(fp,"%d\n",((short *)data)[i]);
|
||||||
|
}
|
||||||
|
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 1: // complex 16-bit
|
||||||
|
case 13:
|
||||||
|
case 14:
|
||||||
|
case 15:
|
||||||
|
|
||||||
|
for (i=0; i<length<<1; i+=(2*dec)) {
|
||||||
|
fprintf(fp,"%d + j*(%d)\n",((short *)data)[i],((short *)data)[i+1]);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 2: // real 32-bit
|
||||||
|
for (i=0; i<length; i+=dec) {
|
||||||
|
fprintf(fp,"%d\n",((int *)data)[i]);
|
||||||
|
}
|
||||||
|
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 3: // complex 32-bit
|
||||||
|
for (i=0; i<length<<1; i+=(2*dec)) {
|
||||||
|
fprintf(fp,"%d + j*(%d)\n",((int *)data)[i],((int *)data)[i+1]);
|
||||||
|
}
|
||||||
|
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 4: // real 8-bit
|
||||||
|
for (i=0; i<length; i+=dec) {
|
||||||
|
fprintf(fp,"%d\n",((char *)data)[i]);
|
||||||
|
}
|
||||||
|
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 5: // complex 8-bit
|
||||||
|
for (i=0; i<length<<1; i+=(2*dec)) {
|
||||||
|
fprintf(fp,"%d + j*(%d)\n",((char *)data)[i],((char *)data)[i+1]);
|
||||||
|
}
|
||||||
|
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 6: // real 64-bit
|
||||||
|
for (i=0; i<length; i+=dec) {
|
||||||
|
fprintf(fp,"%lld\n",((long long*)data)[i]);
|
||||||
|
}
|
||||||
|
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 7: // real double
|
||||||
|
for (i=0; i<length; i+=dec) {
|
||||||
|
fprintf(fp,"%g\n",((double *)data)[i]);
|
||||||
|
}
|
||||||
|
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 8: // complex double
|
||||||
|
for (i=0; i<length<<1; i+=2*dec) {
|
||||||
|
fprintf(fp,"%g + j*(%g)\n",((double *)data)[i], ((double *)data)[i+1]);
|
||||||
|
}
|
||||||
|
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 9: // real unsigned 8-bit
|
||||||
|
for (i=0; i<length; i+=dec) {
|
||||||
|
fprintf(fp,"%d\n",((unsigned char *)data)[i]);
|
||||||
|
}
|
||||||
|
|
||||||
|
break;
|
||||||
|
|
||||||
|
|
||||||
|
case 10 : // case eren 16 bit complex :
|
||||||
|
|
||||||
|
for (i=0; i<length<<1; i+=(2*dec)) {
|
||||||
|
|
||||||
|
if((i < 2*(length-1)) && (i > 0))
|
||||||
|
fprintf(fp,"%d + j*(%d),",((short *)data)[i],((short *)data)[i+1]);
|
||||||
|
else if (i == 2*(length-1))
|
||||||
|
fprintf(fp,"%d + j*(%d);",((short *)data)[i],((short *)data)[i+1]);
|
||||||
|
else if (i == 0)
|
||||||
|
fprintf(fp,"\n%d + j*(%d),",((short *)data)[i],((short *)data)[i+1]);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 11 : //case eren 16 bit real for channel magnitudes:
|
||||||
|
for (i=0; i<length; i+=dec) {
|
||||||
|
|
||||||
|
if((i <(length-1))&& (i > 0))
|
||||||
|
fprintf(fp,"%d,",((short *)data)[i]);
|
||||||
|
else if (i == (length-1))
|
||||||
|
fprintf(fp,"%d;",((short *)data)[i]);
|
||||||
|
else if (i == 0)
|
||||||
|
fprintf(fp,"\n%d,",((short *)data)[i]);
|
||||||
|
}
|
||||||
|
|
||||||
|
printf("\n eren: length :%d",length);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 12 : // case eren for log2_maxh real unsigned 8 bit
|
||||||
|
fprintf(fp,"%d \n",((unsigned char *)&data)[0]);
|
||||||
|
break;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
if (format != 10 && format !=11 && format !=12 && format != 13 && format != 15) {
|
||||||
|
fprintf(fp,"];\n");
|
||||||
|
fclose(fp);
|
||||||
|
return(0);
|
||||||
|
} else if (format == 10 || format ==11 || format == 12 || format == 13 || format == 15) {
|
||||||
|
fclose(fp);
|
||||||
|
return(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* get log parameters from configuration file */
|
||||||
|
void log_getconfig(log_t *g_log) {
|
||||||
|
char *gloglevel = NULL;
|
||||||
|
int level;
|
||||||
|
|
||||||
|
|
||||||
|
paramdef_t logparams_defaults[] = LOG_GLOBALPARAMS_DESC;
|
||||||
|
paramdef_t logparams_level[MAX_LOG_PREDEF_COMPONENTS];
|
||||||
|
paramdef_t logparams_logfile[MAX_LOG_PREDEF_COMPONENTS];
|
||||||
|
paramdef_t logparams_debug[sizeof(log_maskmap)/sizeof(mapping)];
|
||||||
|
paramdef_t logparams_matlab[sizeof(log_maskmap)/sizeof(mapping)];
|
||||||
|
|
||||||
|
int ret = config_get( logparams_defaults,sizeof(logparams_defaults)/sizeof(paramdef_t),CONFIG_STRING_LOG_PREFIX);
|
||||||
|
if (ret <0) {
|
||||||
|
fprintf(stderr,"[LOG] init aborted, configuration couldn't be performed");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
for(int i=0; i<logparams_defaults[LOG_OPTIONS_IDX].numelt ; i++) {
|
||||||
|
for(int j=0; log_options[j].name != NULL ; j++) {
|
||||||
|
if (strcmp(logparams_defaults[LOG_OPTIONS_IDX].strlistptr[i],log_options[j].name) == 0) {
|
||||||
|
g_log->flag = g_log->flag | log_options[j].value;
|
||||||
|
break;
|
||||||
|
} else if (log_options[j+1].name == NULL){
|
||||||
|
fprintf(stderr,"Unknown log option: %s\n",logparams_defaults[LOG_OPTIONS_IDX].strlistptr[i]);
|
||||||
|
exit(-1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* build the parameter array for setting per component log level and infile options */
|
||||||
|
memset(logparams_level, 0, sizeof(paramdef_t)*MAX_LOG_PREDEF_COMPONENTS);
|
||||||
|
memset(logparams_logfile, 0, sizeof(paramdef_t)*MAX_LOG_PREDEF_COMPONENTS);
|
||||||
|
for (int i=MIN_LOG_COMPONENTS; i < MAX_LOG_PREDEF_COMPONENTS; i++) {
|
||||||
|
if(g_log->log_component[i].name == NULL) {
|
||||||
|
g_log->log_component[i].name = malloc(16);
|
||||||
|
sprintf((char *)g_log->log_component[i].name,"comp%i?",i);
|
||||||
|
logparams_logfile[i].paramflags = PARAMFLAG_DONOTREAD;
|
||||||
|
logparams_level[i].paramflags = PARAMFLAG_DONOTREAD;
|
||||||
|
}
|
||||||
|
sprintf(logparams_level[i].optname, LOG_CONFIG_LEVEL_FORMAT, g_log->log_component[i].name);
|
||||||
|
sprintf(logparams_logfile[i].optname, LOG_CONFIG_LOGFILE_FORMAT, g_log->log_component[i].name);
|
||||||
|
/* workaround: all log options in existing configuration files use lower case component names
|
||||||
|
where component names include uppercase char in log.h.... */
|
||||||
|
for (int j=0 ; j<strlen(logparams_level[i].optname); j++)
|
||||||
|
logparams_level[i].optname[j] = tolower(logparams_level[i].optname[j]);
|
||||||
|
for (int j=0 ; j<strlen(logparams_level[i].optname); j++)
|
||||||
|
logparams_logfile[i].optname[j] = tolower(logparams_logfile[i].optname[j]);
|
||||||
|
/* */
|
||||||
|
logparams_level[i].defstrval = gloglevel;
|
||||||
|
logparams_logfile[i].defuintval = 0;
|
||||||
|
logparams_logfile[i].numelt = 0;
|
||||||
|
logparams_level[i].numelt = 0;
|
||||||
|
logparams_level[i].type = TYPE_STRING;
|
||||||
|
logparams_logfile[i].type = TYPE_UINT;
|
||||||
|
|
||||||
|
logparams_logfile[i].paramflags = logparams_logfile[i].paramflags|PARAMFLAG_BOOL;
|
||||||
|
}
|
||||||
|
/* read the per component parameters */
|
||||||
|
config_get( logparams_level, MAX_LOG_PREDEF_COMPONENTS,CONFIG_STRING_LOG_PREFIX);
|
||||||
|
config_get( logparams_logfile, MAX_LOG_PREDEF_COMPONENTS,CONFIG_STRING_LOG_PREFIX);
|
||||||
|
/* now set the log levels and infile option, according to what we read */
|
||||||
|
for (int i=MIN_LOG_COMPONENTS; i < MAX_LOG_PREDEF_COMPONENTS; i++) {
|
||||||
|
level = map_str_to_int(log_level_names, *(logparams_level[i].strptr));
|
||||||
|
set_log(i, level,1);
|
||||||
|
if (*(logparams_logfile[i].uptr) == 1)
|
||||||
|
set_component_filelog(i);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* build then read the debug and matlab 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);
|
||||||
|
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;
|
||||||
|
}
|
||||||
|
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);
|
||||||
|
/* 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;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
int register_log_component(char *name, char *fext, int compidx)
|
||||||
|
{
|
||||||
|
int computed_compidx=compidx;
|
||||||
|
|
||||||
|
if (strlen(fext) > 3) {
|
||||||
|
fext[3]=0; /* limit log file extension to 3 chars */
|
||||||
|
}
|
||||||
|
if (compidx < 0) { /* this is not a pre-defined component */
|
||||||
|
for (int i = MAX_LOG_PREDEF_COMPONENTS; i< MAX_LOG_COMPONENTS; i++) {
|
||||||
|
if (g_log->log_component[i].name == NULL) {
|
||||||
|
computed_compidx=i;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (computed_compidx >= 0 && computed_compidx <MAX_LOG_COMPONENTS) {
|
||||||
|
g_log->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].filelog = 0;
|
||||||
|
g_log->log_component[computed_compidx].filelog_name = malloc(strlen(name)+16);/* /tmp/<name>.%s rounded to ^2 */
|
||||||
|
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);
|
||||||
|
}
|
||||||
|
return computed_compidx;
|
||||||
|
}
|
||||||
|
|
||||||
|
int logInit (void)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
g_log = calloc(1, sizeof(log_t));
|
||||||
|
|
||||||
|
if (g_log == NULL) {
|
||||||
|
perror ("cannot allocated memory for log generation module \n");
|
||||||
|
exit(EXIT_FAILURE);
|
||||||
|
}
|
||||||
|
memset(g_log,0,sizeof(log_t));
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
register_log_component("PHY","log",PHY);
|
||||||
|
register_log_component("MAC","log",MAC);
|
||||||
|
register_log_component("OPT","log",OPT);
|
||||||
|
register_log_component("RLC","log",RLC);
|
||||||
|
register_log_component("PDCP","log",PDCP);
|
||||||
|
register_log_component("RRC","log",RRC);
|
||||||
|
register_log_component("OMG","csv",OMG);
|
||||||
|
register_log_component("OTG","log",OTG);
|
||||||
|
register_log_component("OTG_LATENCY","dat",OTG_LATENCY);
|
||||||
|
register_log_component("OTG_LATENCY_BG","dat",OTG_LATENCY_BG);
|
||||||
|
register_log_component("OTG_GP","dat",OTG_GP);
|
||||||
|
register_log_component("OTG_GP_BG","dat",OTG_GP_BG);
|
||||||
|
register_log_component("OTG_JITTER","dat",OTG_JITTER);
|
||||||
|
register_log_component("OCG","",OCG);
|
||||||
|
register_log_component("PERF","",PERF);
|
||||||
|
register_log_component("OIP","",OIP);
|
||||||
|
register_log_component("CLI","",CLI);
|
||||||
|
register_log_component("MSC","log",MSC);
|
||||||
|
register_log_component("OCM","log",OCM);
|
||||||
|
register_log_component("HW","",HW);
|
||||||
|
register_log_component("OSA","",OSA);
|
||||||
|
register_log_component("eRAL","",RAL_ENB);
|
||||||
|
register_log_component("mRAL","",RAL_UE);
|
||||||
|
register_log_component("ENB_APP","log",ENB_APP);
|
||||||
|
register_log_component("FLEXRAN_AGENT","log",FLEXRAN_AGENT);
|
||||||
|
register_log_component("TMR","",TMR);
|
||||||
|
register_log_component("USIM","txt",USIM);
|
||||||
|
register_log_component("SIM","txt",SIM);
|
||||||
|
|
||||||
|
/* following log component are used for the localization*/
|
||||||
|
register_log_component("LOCALIZE","log",LOCALIZE);
|
||||||
|
register_log_component("NAS","log",NAS);
|
||||||
|
register_log_component("UDP","",UDP_);
|
||||||
|
|
||||||
|
|
||||||
|
register_log_component("GTPV1U","",GTPU);
|
||||||
|
|
||||||
|
|
||||||
|
register_log_component("S1AP","",S1AP);
|
||||||
|
|
||||||
|
|
||||||
|
register_log_component("SCTP","",SCTP);
|
||||||
|
register_log_component("RRH","",RRH);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
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;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
g_log->filelog_name = "/tmp/openair.log";
|
||||||
|
|
||||||
|
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++) {
|
||||||
|
memset(&(g_log->log_component[i]),0,sizeof(log_component_t));
|
||||||
|
}
|
||||||
|
printf("log init done\n");
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
char *log_getthreadname(char *threadname, int bufsize) {
|
||||||
|
|
||||||
|
int rt = pthread_getname_np(pthread_self(), threadname,bufsize) ;
|
||||||
|
if (rt == 0)
|
||||||
|
{
|
||||||
|
return threadname;
|
||||||
|
} else {
|
||||||
|
return "thread?";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
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;
|
||||||
|
|
||||||
|
va_start(args, format);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
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);
|
||||||
|
va_end(args);
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
int set_log(int component, int level, int interval)
|
||||||
|
{
|
||||||
|
/* 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,
|
||||||
|
OAILOG_ERR);
|
||||||
|
DevCheck((interval >= 0) && (interval <= 0xFF), interval, 0, 0xFF);
|
||||||
|
|
||||||
|
g_log->log_component[component].level = level;
|
||||||
|
|
||||||
|
|
||||||
|
g_log->log_component[component].interval = interval;
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
void set_glog(int level)
|
||||||
|
{
|
||||||
|
for (int c=0; c< MAX_LOG_COMPONENTS; c++ ) {
|
||||||
|
g_log->log_component[c].level = level;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void set_glog_onlinelog(int enable)
|
||||||
|
{
|
||||||
|
g_log->onlinelog = enable;
|
||||||
|
}
|
||||||
|
void set_glog_filelog(int enable)
|
||||||
|
{
|
||||||
|
g_log->filelog = enable;
|
||||||
|
}
|
||||||
|
|
||||||
|
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) {
|
||||||
|
g_log->log_component[comp].stream = fopen(g_log->log_component[comp].filelog_name,"w");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* for the two functions below, the passed array must have a final entry
|
||||||
|
* with string value NULL
|
||||||
|
*/
|
||||||
|
/* map a string to an int. Takes a mapping array and a string as arg */
|
||||||
|
int map_str_to_int(mapping *map, const char *str)
|
||||||
|
{
|
||||||
|
while (1) {
|
||||||
|
if (map->name == NULL) {
|
||||||
|
return(-1);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!strcmp(map->name, str)) {
|
||||||
|
return(map->value);
|
||||||
|
}
|
||||||
|
|
||||||
|
map++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* map an int to a string. Takes a mapping array and a value */
|
||||||
|
char *map_int_to_str(mapping *map, int val)
|
||||||
|
{
|
||||||
|
while (1) {
|
||||||
|
if (map->name == NULL) {
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (map->value == val) {
|
||||||
|
return map->name;
|
||||||
|
}
|
||||||
|
|
||||||
|
map++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
int is_newline( char *str, int size)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
|
||||||
|
for ( i = 0; i < size; i++ ) {
|
||||||
|
if ( str[i] == '\n' ) {
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* if we get all the way to here, there must not have been a newline! */
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
void logClean (void)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
LOG_I(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);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef LOG_TEST
|
||||||
|
|
||||||
|
int main(int argc, char *argv[])
|
||||||
|
{
|
||||||
|
|
||||||
|
logInit();
|
||||||
|
|
||||||
|
|
||||||
|
test_log();
|
||||||
|
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
int test_log(void)
|
||||||
|
{
|
||||||
|
LOG_ENTER(MAC); // because the default level is DEBUG
|
||||||
|
LOG_I(EMU, "1 Starting OAI logs version %s Build date: %s on %s\n",
|
||||||
|
BUILD_VERSION, BUILD_DATE, BUILD_HOST);
|
||||||
|
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);
|
||||||
|
|
||||||
|
LOG_I(EMU, "2 Starting OAI logs version %s Build date: %s on %s\n",
|
||||||
|
BUILD_VERSION, BUILD_DATE, BUILD_HOST);
|
||||||
|
LOG_E(MAC, "2 error MAC\n");
|
||||||
|
LOG_D(MAC, "2 debug MAC \n");
|
||||||
|
LOG_W(MAC, "2 warning MAC \n");
|
||||||
|
LOG_I(MAC, "2 info MAC \n");
|
||||||
|
|
||||||
|
|
||||||
|
set_log(MAC, OAILOG_NOTICE, 1);
|
||||||
|
|
||||||
|
LOG_ENTER(MAC);
|
||||||
|
LOG_I(EMU, "3 Starting OAI logs version %s Build date: %s on %s\n",
|
||||||
|
BUILD_VERSION, BUILD_DATE, BUILD_HOST);
|
||||||
|
LOG_D(MAC, "3 debug MAC \n");
|
||||||
|
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);
|
||||||
|
|
||||||
|
LOG_ENTER(MAC);
|
||||||
|
LOG_I(EMU, "4 Starting OAI logs version %s Build date: %s on %s\n",
|
||||||
|
BUILD_VERSION, BUILD_DATE, BUILD_HOST);
|
||||||
|
LOG_D(MAC, "4 debug MAC \n");
|
||||||
|
LOG_W(MAC, "4 warning MAC \n");
|
||||||
|
LOG_I(MAC, "4 info MAC \n");
|
||||||
|
|
||||||
|
|
||||||
|
set_log(MAC, LOG_DEBUG,0);
|
||||||
|
set_log(EMU, LOG_DEBUG,0);
|
||||||
|
|
||||||
|
LOG_I(LOG, "5 Starting OAI logs version %s Build date: %s on %s\n",
|
||||||
|
BUILD_VERSION, BUILD_DATE, BUILD_HOST);
|
||||||
|
LOG_D(MAC, "5 debug MAC \n");
|
||||||
|
LOG_W(MAC, "5 warning MAC \n");
|
||||||
|
LOG_I(MAC, "5 info MAC \n");
|
||||||
|
|
||||||
|
|
||||||
|
set_log(MAC, LOG_TRACE,0X07F);
|
||||||
|
set_log(EMU, LOG_TRACE,0X07F);
|
||||||
|
|
||||||
|
LOG_ENTER(MAC);
|
||||||
|
LOG_I(LOG, "6 Starting OAI logs version %s Build date: %s on %s\n",
|
||||||
|
BUILD_VERSION, BUILD_DATE, BUILD_HOST);
|
||||||
|
LOG_D(MAC, "6 debug MAC \n");
|
||||||
|
LOG_W(MAC, "6 warning MAC \n");
|
||||||
|
LOG_I(MAC, "6 info MAC \n");
|
||||||
|
LOG_EXIT(MAC);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
@@ -52,7 +52,7 @@
|
|||||||
#define _GNU_SOURCE
|
#define _GNU_SOURCE
|
||||||
#endif
|
#endif
|
||||||
#include <pthread.h>
|
#include <pthread.h>
|
||||||
|
#include "T.h"
|
||||||
/*----------------------------------------------------------------------------*/
|
/*----------------------------------------------------------------------------*/
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
@@ -73,8 +73,7 @@ extern "C" {
|
|||||||
* @ingroup _macro
|
* @ingroup _macro
|
||||||
* @brief the macros that describe the maximum length of LOG
|
* @brief the macros that describe the maximum length of LOG
|
||||||
* @{*/
|
* @{*/
|
||||||
#define MAX_LOG_ITEM 100 /*!< \brief the maximum length of a LOG item, what is LOG_ITEM ??? */
|
|
||||||
#define MAX_LOG_INFO 1000 /*!< \brief the maximum length of a log */
|
|
||||||
#define MAX_LOG_TOTAL 1500 /*!< \brief the maximum length of a log */
|
#define MAX_LOG_TOTAL 1500 /*!< \brief the maximum length of a log */
|
||||||
/* @}*/
|
/* @}*/
|
||||||
|
|
||||||
@@ -82,17 +81,15 @@ extern "C" {
|
|||||||
* @ingroup _macro
|
* @ingroup _macro
|
||||||
* @brief LOG defines 9 levels of messages for users. Importance of these levels decrease gradually from 0 to 8
|
* @brief LOG defines 9 levels of messages for users. Importance of these levels decrease gradually from 0 to 8
|
||||||
* @{*/
|
* @{*/
|
||||||
# define LOG_EMERG 0 /*!< \brief system is unusable */
|
|
||||||
# define LOG_ALERT 1 /*!< \brief action must be taken immediately */
|
# define OAILOG_ERR 0 /*!< \brief critical error conditions, impact on "must have" fuctinalities */
|
||||||
# define LOG_CRIT 2 /*!< \brief critical conditions */
|
# define OAILOG_FILE 1 /*!< \brief important informational messages, but everything OK */
|
||||||
# define LOG_ERR 3 /*!< \brief error conditions */
|
# define OAILOG_WARNING 2 /*!< \brief warning conditions, shouldn't happen but doesn't impact "must have" functionalities */
|
||||||
# define LOG_WARNING 4 /*!< \brief warning conditions */
|
# define OAILOG_INFO 3 /*!< \brief informational messages most people don't need, shouldn't impact real-time behavior */
|
||||||
# define LOG_NOTICE 5 /*!< \brief normal but significant condition */
|
# define OAILOG_DEBUG 4 /*!< \brief first level debug-level messages, for developers , may impact real-time behavior */
|
||||||
# define LOG_INFO 6 /*!< \brief informational */
|
# define OAILOG_TRACE 5 /*!< \brief second level debug-level messages, for developers ,likely impact real-time behavior*/
|
||||||
# define LOG_DEBUG 7 /*!< \brief debug-level messages */
|
|
||||||
# define LOG_FILE 8 /*!< \brief message sequence chart -level */
|
#define NUM_LOG_LEVEL 6 /*!< \brief the number of message levels users have with LOG */
|
||||||
# define LOG_TRACE 9 /*!< \brief trace-level messages */
|
|
||||||
#define NUM_LOG_LEVEL 10 /*!< \brief the number of message levels users have with LOG */
|
|
||||||
/* @}*/
|
/* @}*/
|
||||||
|
|
||||||
|
|
||||||
@@ -103,7 +100,7 @@ extern "C" {
|
|||||||
|
|
||||||
/* .log_format = 0x13 uncolored standard messages
|
/* .log_format = 0x13 uncolored standard messages
|
||||||
* .log_format = 0x93 colored standard messages */
|
* .log_format = 0x93 colored standard messages */
|
||||||
|
/* keep white space in first position; switching it to 0 allows colors to be disabled*/
|
||||||
#define LOG_RED "\033[1;31m" /*!< \brief VT100 sequence for bold red foreground */
|
#define LOG_RED "\033[1;31m" /*!< \brief VT100 sequence for bold red foreground */
|
||||||
#define LOG_GREEN "\033[32m" /*!< \brief VT100 sequence for green foreground */
|
#define LOG_GREEN "\033[32m" /*!< \brief VT100 sequence for green foreground */
|
||||||
#define LOG_ORANGE "\033[93m" /*!< \brief VT100 sequence for orange foreground */
|
#define LOG_ORANGE "\033[93m" /*!< \brief VT100 sequence for orange foreground */
|
||||||
@@ -117,34 +114,37 @@ extern "C" {
|
|||||||
* @ingroup _macro
|
* @ingroup _macro
|
||||||
* @brief Macros used to write lines (local/remote) in syslog.conf
|
* @brief Macros used to write lines (local/remote) in syslog.conf
|
||||||
* @{*/
|
* @{*/
|
||||||
#define LOG_LOCAL 0x01
|
|
||||||
#define LOG_REMOTE 0x02
|
|
||||||
|
|
||||||
#define FLAG_COLOR 0x001 /*!< \brief defaults */
|
|
||||||
#define FLAG_PID 0x002 /*!< \brief defaults */
|
|
||||||
#define FLAG_COMP 0x004
|
|
||||||
#define FLAG_THREAD 0x008 /*!< \brief all : 255/511 */
|
|
||||||
#define FLAG_LEVEL 0x010
|
|
||||||
#define FLAG_FUNCT 0x020
|
|
||||||
#define FLAG_FILE_LINE 0x040
|
|
||||||
#define FLAG_TIME 0x100
|
|
||||||
|
|
||||||
#define LOG_NONE 0x00
|
|
||||||
#define LOG_LOW 0x5
|
|
||||||
#define LOG_MED 0x15
|
|
||||||
#define LOG_HIGH 0x35
|
|
||||||
#define LOG_FULL 0x75
|
|
||||||
|
|
||||||
#define OAI_OK 0 /*!< \brief all ok */
|
|
||||||
#define OAI_ERR 1 /*!< \brief generic error */
|
|
||||||
#define OAI_ERR_READ_ONLY 2 /*!< \brief tried to write to read-only item */
|
|
||||||
#define OAI_ERR_NOTFOUND 3 /*!< \brief something wasn't found */
|
|
||||||
/* @}*/
|
|
||||||
|
|
||||||
|
|
||||||
//static char *log_level_highlight_start[] = {LOG_RED, LOG_RED, LOG_RED, LOG_RED, LOG_BLUE, "", "", "", LOG_GREEN}; /*!< \brief Optional start-format strings for highlighting */
|
#define FLAG_NOCOLOR 0x0001 /*!< \brief use colors in log messages, depending on level */
|
||||||
|
#define FLAG_THREAD 0x0008 /*!< \brief display thread name in log messages */
|
||||||
|
#define FLAG_LEVEL 0x0010 /*!< \brief display log level in log messages */
|
||||||
|
#define FLAG_FUNCT 0x0020
|
||||||
|
#define FLAG_FILE_LINE 0x0040
|
||||||
|
#define FLAG_TIME 0x0100
|
||||||
|
|
||||||
|
#define SET_LOG_OPTION(O) g_log->flag = (g_log->flag | O)
|
||||||
|
#define CLEAR_LOG_OPTION(O) g_log->flag = (g_log->flag & (~O))
|
||||||
|
|
||||||
|
/** @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
|
||||||
|
* @brief
|
||||||
|
* @{*/
|
||||||
|
#define DEBUG_PRACH (1<<0)
|
||||||
|
#define DEBUG_RU (1<<1)
|
||||||
|
#define DEBUG_UE_PHYPROC (1<<2)
|
||||||
|
#define DEBUG_LTEESTIM (1<<3)
|
||||||
|
#define DEBUG_CTRLSOCKET (1<<10)
|
||||||
|
#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))
|
||||||
|
|
||||||
|
|
||||||
//static char *log_level_highlight_end[] = {LOG_RESET, LOG_RESET, LOG_RESET, LOG_RESET, LOG_RESET, "", "", "", LOG_RESET}; /*!< \brief Optional end-format strings for highlighting */
|
|
||||||
|
|
||||||
typedef enum {
|
typedef enum {
|
||||||
MIN_LOG_COMPONENTS = 0,
|
MIN_LOG_COMPONENTS = 0,
|
||||||
@@ -185,63 +185,47 @@ typedef enum {
|
|||||||
LOCALIZE,
|
LOCALIZE,
|
||||||
RRH,
|
RRH,
|
||||||
X2AP,
|
X2AP,
|
||||||
MAX_LOG_COMPONENTS,
|
LOADER,
|
||||||
|
MAX_LOG_PREDEF_COMPONENTS,
|
||||||
}
|
}
|
||||||
comp_name_t;
|
comp_name_t;
|
||||||
|
|
||||||
//#define msg printf
|
#define MAX_LOG_DYNALLOC_COMPONENTS 20
|
||||||
|
#define MAX_LOG_COMPONENTS (MAX_LOG_PREDEF_COMPONENTS + MAX_LOG_DYNALLOC_COMPONENTS)
|
||||||
|
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
char *name; /*!< \brief string name of item */
|
char *name; /*!< \brief string name of item */
|
||||||
int value; /*!< \brief integer value of mapping */
|
int value; /*!< \brief integer value of mapping */
|
||||||
} mapping;
|
} mapping;
|
||||||
|
|
||||||
|
typedef int(*log_write_func_t)(FILE *stream, const char *format, va_list ap );
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
const char *name;
|
const char *name;
|
||||||
int level;
|
int level;
|
||||||
int flag;
|
int flag;
|
||||||
int interval;
|
int interval;
|
||||||
int fd;
|
int filelog;
|
||||||
int filelog;
|
char *filelog_name;
|
||||||
char *filelog_name;
|
FILE *stream;
|
||||||
|
log_write_func_t fwrite;
|
||||||
/* SR: make the log buffer component relative */
|
/* SR: make the log buffer component relative */
|
||||||
char log_buffer[MAX_LOG_TOTAL];
|
char log_buffer[MAX_LOG_TOTAL];
|
||||||
} log_component_t;
|
} log_component_t;
|
||||||
|
|
||||||
typedef struct {
|
|
||||||
unsigned int remote_ip;
|
|
||||||
unsigned int audit_ip;
|
|
||||||
int remote_level;
|
|
||||||
int facility;
|
|
||||||
int audit_facility;
|
|
||||||
int format;
|
|
||||||
} log_config_t;
|
|
||||||
|
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
log_component_t log_component[MAX_LOG_COMPONENTS];
|
log_component_t log_component[MAX_LOG_COMPONENTS];
|
||||||
log_config_t config;
|
|
||||||
char* level2string[NUM_LOG_LEVEL];
|
char* level2string[NUM_LOG_LEVEL];
|
||||||
int level;
|
|
||||||
int onlinelog;
|
int onlinelog;
|
||||||
int flag;
|
int flag;
|
||||||
int syslog;
|
|
||||||
int filelog;
|
int filelog;
|
||||||
char* filelog_name;
|
char* filelog_name;
|
||||||
|
uint64_t debug_mask;
|
||||||
|
uint64_t matlab_mask;
|
||||||
} log_t;
|
} log_t;
|
||||||
|
|
||||||
typedef struct LOG_params {
|
|
||||||
const char *file;
|
|
||||||
const char *func;
|
|
||||||
int line;
|
|
||||||
int comp;
|
|
||||||
int level;
|
|
||||||
const char *format;
|
|
||||||
char l_buff_info [MAX_LOG_INFO];
|
|
||||||
int len;
|
|
||||||
} LOG_params;
|
|
||||||
|
|
||||||
#if defined(ENABLE_ITTI)
|
#if defined(ENABLE_ITTI)
|
||||||
typedef enum log_instance_type_e {
|
typedef enum log_instance_type_e {
|
||||||
@@ -253,6 +237,7 @@ typedef enum log_instance_type_e {
|
|||||||
void log_set_instance_type (log_instance_type_t instance);
|
void log_set_instance_type (log_instance_type_t instance);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
#ifdef LOG_MAIN
|
#ifdef LOG_MAIN
|
||||||
log_t *g_log;
|
log_t *g_log;
|
||||||
#else
|
#else
|
||||||
@@ -269,97 +254,113 @@ extern log_t *g_log;
|
|||||||
/*----------------------------------------------------------------------------*/
|
/*----------------------------------------------------------------------------*/
|
||||||
int logInit (void);
|
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)));
|
void logRecord_mt(const char *file, const char *func, int line,int comp, int level, const char *format, ...) __attribute__ ((format (printf, 6, 7)));
|
||||||
void logRecord(const char *file, const char *func, int line,int comp, int level, const char *format, ...) __attribute__ ((format (printf, 6, 7)));
|
|
||||||
int set_comp_log(int component, int level, int verbosity, int interval);
|
|
||||||
int set_log(int component, int level, int interval);
|
int set_log(int component, int level, int interval);
|
||||||
void set_glog(int level, int verbosity);
|
void set_glog(int level);
|
||||||
void set_log_syslog(int enable);
|
|
||||||
void set_glog_onlinelog(int enable);
|
void set_glog_onlinelog(int enable);
|
||||||
void set_glog_filelog(int enable);
|
void set_glog_filelog(int enable);
|
||||||
|
|
||||||
void set_component_filelog(int comp);
|
void set_component_filelog(int comp);
|
||||||
|
|
||||||
int map_str_to_int(mapping *map, const char *str);
|
int map_str_to_int(mapping *map, const char *str);
|
||||||
char *map_int_to_str(mapping *map, int val);
|
char *map_int_to_str(mapping *map, int val);
|
||||||
void logClean (void);
|
void logClean (void);
|
||||||
int is_newline( char *str, int size);
|
int is_newline( char *str, int size);
|
||||||
void *log_thread_function(void * list);
|
|
||||||
|
|
||||||
/** @defgroup _logIt logIt function
|
int register_log_component(char *name, char *fext, int compidx);
|
||||||
* @ingroup _macro
|
|
||||||
* @brief Macro used to call tr_log_full_ex with file, function and line information
|
|
||||||
* @{*/
|
|
||||||
#ifdef LOG_NO_THREAD
|
|
||||||
#define logIt(component, level, format, args...) (g_log->log_component[component].interval?logRecord_mt(__FILE__, __FUNCTION__, __LINE__, component, level, format, ##args):(void)0)
|
|
||||||
#else //default
|
|
||||||
#define logIt(component, level, format, args...) (g_log->log_component[component].interval?logRecord(__FILE__, __FUNCTION__, __LINE__, component, level, format, ##args):(void)0)
|
|
||||||
#endif
|
|
||||||
/* @}*/
|
/* @}*/
|
||||||
|
|
||||||
|
/*!\fn int32_t write_file_matlab(const char *fname, const char *vname, void *data, int length, int dec, char format);
|
||||||
|
\brief Write output file from signal data
|
||||||
|
@param fname output file name
|
||||||
|
@param vname output vector name (for MATLAB/OCTAVE)
|
||||||
|
@param data point to data
|
||||||
|
@param length length of data vector to output
|
||||||
|
@param dec decimation level
|
||||||
|
@param format data format (0 = real 16-bit, 1 = complex 16-bit,2 real 32-bit, 3 complex 32-bit,4 = real 8-bit, 5 = complex 8-bit)
|
||||||
|
*/
|
||||||
|
int32_t write_file_matlab(const char *fname, const char *vname, void *data, int length, int dec, char format);
|
||||||
|
|
||||||
/*----------------macro definitions for reading log configuration from the config module */
|
/*----------------macro definitions for reading log configuration from the config module */
|
||||||
#define CONFIG_STRING_LOG_PREFIX "log_config"
|
#define CONFIG_STRING_LOG_PREFIX "log_config"
|
||||||
|
|
||||||
#define LOG_CONFIG_STRING_GLOBAL_LOG_LEVEL "global_log_level"
|
#define LOG_CONFIG_STRING_GLOBAL_LOG_LEVEL "global_log_level"
|
||||||
#define LOG_CONFIG_STRING_GLOBAL_LOG_VERBOSITY "global_log_verbosity"
|
|
||||||
#define LOG_CONFIG_STRING_GLOBAL_LOG_ONLINE "global_log_online"
|
#define LOG_CONFIG_STRING_GLOBAL_LOG_ONLINE "global_log_online"
|
||||||
#define LOG_CONFIG_STRING_GLOBAL_LOG_INFILE "global_log_infile"
|
#define LOG_CONFIG_STRING_GLOBAL_LOG_INFILE "global_log_infile"
|
||||||
|
#define LOG_CONFIG_STRING_GLOBAL_LOG_OPTIONS "global_log_options"
|
||||||
|
|
||||||
#define LOG_CONFIG_LEVEL_FORMAT "%s_log_level"
|
#define LOG_CONFIG_LEVEL_FORMAT "%s_log_level"
|
||||||
#define LOG_CONFIG_VERBOSITY_FORMAT "%s_log_verbosity"
|
|
||||||
#define LOG_CONFIG_LOGFILE_FORMAT "%s_log_infile"
|
#define LOG_CONFIG_LOGFILE_FORMAT "%s_log_infile"
|
||||||
/*--------------------------------------------------------------------------------------------------------------------------------------------------------------*/
|
#define LOG_CONFIG_DEBUG_FORMAT "%s_debug"
|
||||||
/* LOG globalconfiguration parameters */
|
#define LOG_CONFIG_MATLAB_FORMAT "%s_matlab"
|
||||||
/* optname helpstr paramflags XXXptr defXXXval type numelt */
|
|
||||||
/*--------------------------------------------------------------------------------------------------------------------------------------------------------------*/
|
#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"\
|
||||||
|
" level: add log level indication in log messages\n"\
|
||||||
|
" thread: add threads names in log messages\n"
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/*------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------*/
|
||||||
|
/* LOG globalconfiguration parameters */
|
||||||
|
/* optname help paramflags XXXptr defXXXval type numelt */
|
||||||
|
/*------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------*/
|
||||||
#define LOG_GLOBALPARAMS_DESC { \
|
#define LOG_GLOBALPARAMS_DESC { \
|
||||||
{LOG_CONFIG_STRING_GLOBAL_LOG_LEVEL, NULL, 0, strptr:(char **)&gloglevel, defstrval:log_level_names[2].name, TYPE_STRING, 0}, \
|
{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_VERBOSITY,NULL, 0, strptr:(char **)&glogverbo, defstrval:log_verbosity_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, NULL, 0, iptr:&(g_log->onlinelog), defintval:1, TYPE_INT, 0, }, \
|
{LOG_CONFIG_STRING_GLOBAL_LOG_OPTIONS, LOG_CONFIG_HELP_OPTIONS, 0, strlistptr:NULL, defstrlistval:NULL, TYPE_STRINGLIST,0} \
|
||||||
{LOG_CONFIG_STRING_GLOBAL_LOG_INFILE, NULL, 0, iptr:&(g_log->filelog), defintval:0, TYPE_INT, 0, }, \
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#define LOG_OPTIONS_IDX 2
|
||||||
/*----------------------------------------------------------------------------------*/
|
/*----------------------------------------------------------------------------------*/
|
||||||
/** @defgroup _debugging debugging macros
|
/** @defgroup _debugging debugging macros
|
||||||
* @ingroup _macro
|
* @ingroup _macro
|
||||||
* @brief Macro used to call logIt function with different message levels
|
* @brief Macro used to call logIt function with different message levels
|
||||||
* @{*/
|
* @{*/
|
||||||
|
|
||||||
// debugging macros
|
// debugging macros(g_log->log_component[component].interval?logRecord_mt(__FILE__, __FUNCTION__, __LINE__, component, level, format, ##args):(void)0)
|
||||||
# if T_TRACER
|
# if T_TRACER
|
||||||
# include "T.h"
|
/* per component, level dependant macros */
|
||||||
# define LOG_I(c, x...) T(T_LEGACY_ ## c ## _INFO, T_PRINTF(x))
|
# 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...) T(T_LEGACY_ ## c ## _WARNING, T_PRINTF(x))
|
# 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...) T(T_LEGACY_ ## c ## _ERROR, T_PRINTF(x))
|
# 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_D(c, x...) T(T_LEGACY_ ## c ## _DEBUG, T_PRINTF(x))
|
# 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...) T(T_LEGACY_ ## c ## _TRACE, T_PRINTF(x))
|
# 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_G(c, x...) /* */
|
# 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) /* */
|
||||||
# define LOG_A(c, x...) /* */
|
# define nfapi_log(FILE, FNC, LN, COMP, LVL, F...) do { if (T_stdout) { logRecord_mt(__FILE__, __FUNCTION__, __LINE__,COMP, LVL, F) ;}} while (0) /* */
|
||||||
# define LOG_C(c, x...) /* */
|
/* bitmask dependant macros, to isolate debugging code */
|
||||||
# define LOG_N(c, x...) /* */
|
# 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_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
|
||||||
|
# else /* T_TRACER: remove all debugging and tracing messages, except errors */
|
||||||
|
# define LOG_I(c, x...) /* */
|
||||||
|
# define LOG_W(c, x...) /* */
|
||||||
|
# define LOG_E(c, x...) /* */
|
||||||
|
# define LOG_D(c, x...) /* */
|
||||||
|
# define LOG_T(c, x...) /* */
|
||||||
# define LOG_F(c, x...) /* */
|
# define LOG_F(c, x...) /* */
|
||||||
# else /* T_TRACER */
|
# define nfapi_log(FILE, FNC, LN, COMP, LVL, FMT...)
|
||||||
# if DISABLE_LOG_X
|
# define LOG_DEBUG_BEGIN(D) if (0) {
|
||||||
# define LOG_I(c, x...) /* */
|
# define LOG_DEBUG_END }
|
||||||
# define LOG_W(c, x...) /* */
|
# define LOG_M_BEGIN(D) if (0) {
|
||||||
# define LOG_E(c, x...) /* */
|
# define LOG_M_END }
|
||||||
# define LOG_D(c, x...) /* */
|
# define LOG_M(file, vector, data, len, dec, format)
|
||||||
# define LOG_T(c, x...) /* */
|
# define LOG_VAR(A,B)
|
||||||
# define LOG_G(c, x...) /* */
|
|
||||||
# define LOG_A(c, x...) /* */
|
|
||||||
# define LOG_C(c, x...) /* */
|
|
||||||
# define LOG_N(c, x...) /* */
|
|
||||||
# define LOG_F(c, x...) /* */
|
|
||||||
# else /*DISABLE_LOG_X*/
|
|
||||||
# define LOG_G(c, x...) logIt(c, LOG_EMERG, x)
|
|
||||||
# define LOG_A(c, x...) logIt(c, LOG_ALERT, x)
|
|
||||||
# define LOG_C(c, x...) logIt(c, LOG_CRIT, x)
|
|
||||||
# define LOG_E(c, x...) logIt(c, LOG_ERR, x)
|
|
||||||
# define LOG_W(c, x...) logIt(c, LOG_WARNING, x)
|
|
||||||
# define LOG_N(c, x...) logIt(c, LOG_NOTICE, x)
|
|
||||||
# define LOG_I(c, x...) logIt(c, LOG_INFO, x)
|
|
||||||
# define LOG_D(c, x...) logIt(c, LOG_DEBUG, x)
|
|
||||||
# define LOG_F(c, x...) logIt(c, LOG_FILE, x) // log to a file, useful for the MSC chart generation
|
|
||||||
# define LOG_T(c, x...) logIt(c, LOG_TRACE, x)
|
|
||||||
# endif /*DISABLE_LOG_X*/
|
|
||||||
# endif /* T_TRACER */
|
# 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
|
||||||
|
|
||||||
|
/* 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)
|
||||||
/* @}*/
|
/* @}*/
|
||||||
|
|
||||||
|
|
||||||
@@ -23,12 +23,8 @@
|
|||||||
|
|
||||||
extern log_t *g_log;
|
extern log_t *g_log;
|
||||||
|
|
||||||
#if !defined(LOG_NO_THREAD)
|
|
||||||
extern LOG_params log_list[2000];
|
|
||||||
extern pthread_mutex_t log_lock;
|
|
||||||
extern pthread_cond_t log_notify;
|
|
||||||
extern int log_shutdown;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
extern mapping log_level_names[];
|
extern mapping log_level_names[];
|
||||||
extern mapping log_verbosity_names[];
|
extern mapping log_options[];
|
||||||
|
extern mapping log_maskmap[];
|
||||||
|
|
||||||
@@ -457,27 +457,12 @@ extern int ouput_vcd;
|
|||||||
|
|
||||||
#include "T.h"
|
#include "T.h"
|
||||||
|
|
||||||
#define VCD_SIGNAL_DUMPER_INIT(x) /* nothing */
|
|
||||||
#define VCD_SIGNAL_DUMPER_CLOSE() /* nothing */
|
|
||||||
#define VCD_SIGNAL_DUMPER_CREATE_HEADER() /* nothing */
|
|
||||||
#define VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME(var, val) T_VCD_VARIABLE(var, val)
|
#define VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME(var, val) T_VCD_VARIABLE(var, val)
|
||||||
#define VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(var, val) T_VCD_FUNCTION(var, val)
|
#define VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(var, val) T_VCD_FUNCTION(var, val)
|
||||||
|
|
||||||
#else /* T_TRACER */
|
|
||||||
|
|
||||||
#if defined(ENABLE_VCD)
|
|
||||||
#define VCD_SIGNAL_DUMPER_INIT(aRgUmEnT) vcd_signal_dumper_init(aRgUmEnT)
|
|
||||||
#define VCD_SIGNAL_DUMPER_CLOSE() vcd_signal_dumper_close()
|
|
||||||
#define VCD_SIGNAL_DUMPER_CREATE_HEADER() vcd_signal_dumper_create_header()
|
|
||||||
#define VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME(vAr1,vAr2) vcd_signal_dumper_dump_variable_by_name(vAr1,vAr2)
|
|
||||||
#define VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(vAr1,vAr2) vcd_signal_dumper_dump_function_by_name(vAr1,vAr2)
|
|
||||||
#else
|
#else
|
||||||
#define VCD_SIGNAL_DUMPER_INIT(aRgUmEnT)
|
|
||||||
#define VCD_SIGNAL_DUMPER_CLOSE()
|
#define VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME(var, val)
|
||||||
#define VCD_SIGNAL_DUMPER_CREATE_HEADER()
|
#define VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(var, val)
|
||||||
#define VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME(vAr1,vAr2)
|
|
||||||
#define VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(vAr1,vAr2)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif /* T_TRACER */
|
#endif /* T_TRACER */
|
||||||
|
|
||||||
@@ -13,7 +13,7 @@ $(GENIDS): $(GENIDS_OBJS)
|
|||||||
$(CC) $(CFLAGS) -c -o $@ $<
|
$(CC) $(CFLAGS) -c -o $@ $<
|
||||||
|
|
||||||
T_messages.txt.h: T_messages.txt
|
T_messages.txt.h: T_messages.txt
|
||||||
xxd -i T_messages.txt > T_messages.txt.h
|
xxd -i T_messages.txt T_messages.txt.h
|
||||||
|
|
||||||
T_IDs.h: $(GENIDS) T_messages.txt
|
T_IDs.h: $(GENIDS) T_messages.txt
|
||||||
./$(GENIDS) T_messages.txt T_IDs.h
|
./$(GENIDS) T_messages.txt T_IDs.h
|
||||||
|
|||||||
@@ -9,6 +9,8 @@
|
|||||||
#include <fcntl.h>
|
#include <fcntl.h>
|
||||||
#include <sys/socket.h>
|
#include <sys/socket.h>
|
||||||
|
|
||||||
|
#include "common/config/config_userapi.h"
|
||||||
|
|
||||||
#define QUIT(x) do { \
|
#define QUIT(x) do { \
|
||||||
printf("T tracer: QUIT: %s\n", x); \
|
printf("T tracer: QUIT: %s\n", x); \
|
||||||
exit(1); \
|
exit(1); \
|
||||||
@@ -17,6 +19,7 @@
|
|||||||
/* array used to activate/disactivate a log */
|
/* array used to activate/disactivate a log */
|
||||||
static int T_IDs[T_NUMBER_OF_IDS];
|
static int T_IDs[T_NUMBER_OF_IDS];
|
||||||
int *T_active = T_IDs;
|
int *T_active = T_IDs;
|
||||||
|
int T_stdout;
|
||||||
|
|
||||||
static int T_socket;
|
static int T_socket;
|
||||||
|
|
||||||
@@ -157,3 +160,22 @@ void T_init(int remote_port, int wait_for_tracer, int dont_fork)
|
|||||||
|
|
||||||
new_thread(T_receive_thread, NULL);
|
new_thread(T_receive_thread, NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void T_Config_Init(void)
|
||||||
|
{
|
||||||
|
int T_port; /* by default we wait for the tracer */
|
||||||
|
int T_nowait; /* default port to listen to to wait for the tracer */
|
||||||
|
int T_dont_fork; /* default is to fork, see 'T_init' to understand */
|
||||||
|
|
||||||
|
paramdef_t ttraceparams[] = CMDLINE_TTRACEPARAMS_DESC ;
|
||||||
|
|
||||||
|
/* for a cleaner config file, TTracer params should be defined in a specific section... */
|
||||||
|
config_get( ttraceparams,sizeof(ttraceparams)/sizeof(paramdef_t),TTRACER_CONFIG_PREFIX);
|
||||||
|
|
||||||
|
/* compatibility: look for TTracer command line options in root section */
|
||||||
|
config_process_cmdline( ttraceparams,sizeof(ttraceparams)/sizeof(paramdef_t),NULL);
|
||||||
|
|
||||||
|
if (T_stdout == 0) {
|
||||||
|
T_init(T_port, 1-T_nowait, T_dont_fork);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
+26
-49
@@ -14,6 +14,7 @@
|
|||||||
/* T message IDs */
|
/* T message IDs */
|
||||||
#include "T_IDs.h"
|
#include "T_IDs.h"
|
||||||
|
|
||||||
|
#define T_ACTIVE_STDOUT 2
|
||||||
/* known type - this is where you add new types */
|
/* known type - this is where you add new types */
|
||||||
|
|
||||||
#define T_INT(x) int, (x)
|
#define T_INT(x) int, (x)
|
||||||
@@ -94,12 +95,12 @@ struct T_header;
|
|||||||
#define T_ID(x) ((struct T_header *)(uintptr_t)(x))
|
#define T_ID(x) ((struct T_header *)(uintptr_t)(x))
|
||||||
|
|
||||||
/* T macro tricks */
|
/* T macro tricks */
|
||||||
|
extern int T_stdout;
|
||||||
#define TN(...) TN_N(__VA_ARGS__,33,32,31,30,29,28,27,26,25,24,23,22,21,\
|
#define TN(...) TN_N(__VA_ARGS__,33,32,31,30,29,28,27,26,25,24,23,22,21,\
|
||||||
20,19,18,17,16,15,14,13,12,11,10,9,8,7,6,5,4,3,2,1,0)(__VA_ARGS__)
|
20,19,18,17,16,15,14,13,12,11,10,9,8,7,6,5,4,3,2,1,0)(__VA_ARGS__)
|
||||||
#define TN_N(n0,n1,n2,n3,n4,n5,n6,n7,n8,n9,n10,n11,n12,n13,n14,n15,n16,n17,\
|
#define TN_N(n0,n1,n2,n3,n4,n5,n6,n7,n8,n9,n10,n11,n12,n13,n14,n15,n16,n17,\
|
||||||
n18,n19,n20,n21,n22,n23,n24,n25,n26,n27,n28,n29,n30,n31,n32,n,...) T##n
|
n18,n19,n20,n21,n22,n23,n24,n25,n26,n27,n28,n29,n30,n31,n32,n,...) T##n
|
||||||
#define T(...) TN(__VA_ARGS__)
|
#define T(...) do { if (T_stdout == 0) TN(__VA_ARGS__); } while (0)
|
||||||
|
|
||||||
/* type used to send arbitrary buffer data */
|
/* type used to send arbitrary buffer data */
|
||||||
typedef struct {
|
typedef struct {
|
||||||
@@ -109,7 +110,7 @@ typedef struct {
|
|||||||
|
|
||||||
extern volatile int *T_freelist_head;
|
extern volatile int *T_freelist_head;
|
||||||
extern T_cache_t *T_cache;
|
extern T_cache_t *T_cache;
|
||||||
|
extern int *T_active;
|
||||||
/* When running the basic simulator, we may fill the T cache too fast.
|
/* When running the basic simulator, we may fill the T cache too fast.
|
||||||
* Let's not crash if it's full, just wait.
|
* Let's not crash if it's full, just wait.
|
||||||
*/
|
*/
|
||||||
@@ -151,50 +152,6 @@ extern T_cache_t *T_cache;
|
|||||||
abort(); \
|
abort(); \
|
||||||
}
|
}
|
||||||
|
|
||||||
#if 0
|
|
||||||
#define T_PUT(type, var, argnum) \
|
|
||||||
do { \
|
|
||||||
if (T_LOCAL_size + sizeof(var) > T_BUFFER_MAX) { \
|
|
||||||
printf("%s:%d:%s: cannot put argument %d in T macro, not enough space" \
|
|
||||||
", consider increasing T_BUFFER_MAX (%d)\n", \
|
|
||||||
__FILE__, __LINE__, __FUNCTION__, argnum, T_BUFFER_MAX); \
|
|
||||||
abort(); \
|
|
||||||
} \
|
|
||||||
memcpy(T_LOCAL_buf + T_LOCAL_size, &var, sizeof(var)); \
|
|
||||||
T_LOCAL_size += sizeof(var); \
|
|
||||||
} while (0)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if 0
|
|
||||||
#define T_PROCESS(x, argnum) \
|
|
||||||
do { \
|
|
||||||
T_PUT(typeof(x), x, argnum); \
|
|
||||||
} while (0)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if 0
|
|
||||||
#define T_PROCESS(x, argnum) \
|
|
||||||
do { \
|
|
||||||
if (__builtin_types_compatible_p(typeof(x), int)) \
|
|
||||||
{ T_PUT(int, (intptr_t)(x), argnum); printf("int\n"); } \
|
|
||||||
else if (__builtin_types_compatible_p(typeof(x), short)) \
|
|
||||||
{ T_PUT(short, (intptr_t)(x), argnum); printf("short\n"); } \
|
|
||||||
else if (__builtin_types_compatible_p(typeof(x), float)) \
|
|
||||||
{ T_PUT(float, (x), argnum); printf("float\n"); } \
|
|
||||||
else if (__builtin_types_compatible_p(typeof(x), char *)) \
|
|
||||||
{ T_PUT(char *, (char *)(intptr_t)(x), argnum); printf("char *\n"); } \
|
|
||||||
else if (__builtin_types_compatible_p(typeof(x), float *)) \
|
|
||||||
{ T_PUT(float *, (float *)(intptr_t)(x), argnum); printf("float *\n"); } \
|
|
||||||
else if (__builtin_types_compatible_p(typeof(x), void *)) \
|
|
||||||
{ T_PUT(void *, (void *)(intptr_t)(x), argnum); printf("void *\n"); } \
|
|
||||||
else { \
|
|
||||||
printf("%s:%d:%s: unsupported type for argument %d in T macro\n", \
|
|
||||||
__FILE__, __LINE__, __FUNCTION__, argnum); \
|
|
||||||
abort(); \
|
|
||||||
} \
|
|
||||||
} while (0)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* we have 4 versions of T_HEADER:
|
/* we have 4 versions of T_HEADER:
|
||||||
* - bad quality C++ version with time
|
* - bad quality C++ version with time
|
||||||
* - good quality C version with time
|
* - good quality C version with time
|
||||||
@@ -608,10 +565,30 @@ extern T_cache_t *T_cache;
|
|||||||
} \
|
} \
|
||||||
} while (0)
|
} while (0)
|
||||||
|
|
||||||
extern int *T_active;
|
|
||||||
|
|
||||||
|
#define CONFIG_HLP_TPORT "tracer port\n"
|
||||||
|
#define CONFIG_HLP_NOTWAIT "don't wait for tracer, start immediately\n"
|
||||||
|
#define CONFIG_HLP_TNOFORK "to ease debugging with gdb\n"
|
||||||
|
#define CONFIG_HLP_STDOUT "print log messges on console\n"
|
||||||
|
|
||||||
|
|
||||||
|
#define TTRACER_CONFIG_PREFIX "TTracer"
|
||||||
|
/*------------------------------------------------------------------------------------------------------------------------------------------*/
|
||||||
|
/* configuration parameters for TTRACE utility */
|
||||||
|
/* optname helpstr paramflags XXXptr defXXXval type numelt */
|
||||||
|
/*------------------------------------------------------------------------------------------------------------------------------------------*/
|
||||||
|
#define CMDLINE_TTRACEPARAMS_DESC { \
|
||||||
|
{"T_port", CONFIG_HLP_TPORT, 0, iptr:&T_port, defintval:2021, TYPE_INT, 0}, \
|
||||||
|
{"T_nowait", CONFIG_HLP_NOTWAIT, PARAMFLAG_BOOL, iptr:&T_nowait, defintval:0, TYPE_INT, 0}, \
|
||||||
|
{"T_dont_fork", CONFIG_HLP_TNOFORK, PARAMFLAG_BOOL, iptr:&T_dont_fork, defintval:0, TYPE_INT, 0}, \
|
||||||
|
{"T_stdout", CONFIG_HLP_STDOUT, PARAMFLAG_BOOL, iptr:&T_stdout, defintval:1, TYPE_INT, 0}, \
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/* log on stdout */
|
||||||
void T_init(int remote_port, int wait_for_tracer, int dont_fork);
|
void T_init(int remote_port, int wait_for_tracer, int dont_fork);
|
||||||
|
void T_Config_Init(void);
|
||||||
#else /* T_TRACER */
|
#else /* T_TRACER */
|
||||||
|
|
||||||
/* if T_TRACER is not defined or is 0, the T is deactivated */
|
/* if T_TRACER is not defined or is 0, the T is deactivated */
|
||||||
|
|||||||
@@ -39,10 +39,10 @@ typedef struct {
|
|||||||
#define T_SHM_FILENAME "/T_shm_segment"
|
#define T_SHM_FILENAME "/T_shm_segment"
|
||||||
|
|
||||||
/* number of VCD functions (to be kept up to date! see in T_messages.txt) */
|
/* number of VCD functions (to be kept up to date! see in T_messages.txt) */
|
||||||
#define VCD_NUM_FUNCTIONS 187
|
#define VCD_NUM_FUNCTIONS 190
|
||||||
|
|
||||||
/* number of VCD variables (to be kept up to date! see in T_messages.txt) */
|
/* number of VCD variables (to be kept up to date! see in T_messages.txt) */
|
||||||
#define VCD_NUM_VARIABLES 131
|
#define VCD_NUM_VARIABLES 128
|
||||||
|
|
||||||
/* first VCD function (to be kept up to date! see in T_messages.txt) */
|
/* first VCD function (to be kept up to date! see in T_messages.txt) */
|
||||||
#define VCD_FIRST_FUNCTION ((uintptr_t)T_VCD_FUNCTION_RT_SLEEP)
|
#define VCD_FIRST_FUNCTION ((uintptr_t)T_VCD_FUNCTION_RT_SLEEP)
|
||||||
|
|||||||
@@ -749,7 +749,26 @@ ID = LEGACY_OSA_TRACE
|
|||||||
DESC = OSA legacy logs - trace level
|
DESC = OSA legacy logs - trace level
|
||||||
GROUP = ALL:LEGACY_OSA:LEGACY_GROUP_TRACE:LEGACY
|
GROUP = ALL:LEGACY_OSA:LEGACY_GROUP_TRACE:LEGACY
|
||||||
FORMAT = string,log
|
FORMAT = string,log
|
||||||
|
ID = LEGACY_SIM_INFO
|
||||||
|
DESC = SIM legacy logs - info level
|
||||||
|
GROUP = ALL:LEGACY_SIM:LEGACY_GROUP_INFO:LEGACY
|
||||||
|
FORMAT = string,log
|
||||||
|
ID = LEGACY_SIM_ERROR
|
||||||
|
DESC = SIM legacy logs - error level
|
||||||
|
GROUP = ALL:LEGACY_SIM:LEGACY_GROUP_ERROR:LEGACY
|
||||||
|
FORMAT = string,log
|
||||||
|
ID = LEGACY_SIM_WARNING
|
||||||
|
DESC = SIM legacy logs - warning level
|
||||||
|
GROUP = ALL:LEGACY_SIM:LEGACY_GROUP_WARNING:LEGACY
|
||||||
|
FORMAT = string,log
|
||||||
|
ID = LEGACY_SIM_DEBUG
|
||||||
|
DESC = SIM legacy logs - debug level
|
||||||
|
GROUP = ALL:LEGACY_SIM:LEGACY_GROUP_DEBUG:LEGACY
|
||||||
|
FORMAT = string,log
|
||||||
|
ID = LEGACY_SIM_TRACE
|
||||||
|
DESC = SIM legacy logs - trace level
|
||||||
|
GROUP = ALL:LEGACY_SIM:LEGACY_GROUP_TRACE:LEGACY
|
||||||
|
FORMAT = string,log
|
||||||
# this is a bad hack but I won't fix (function util_print_hex_octets
|
# this is a bad hack but I won't fix (function util_print_hex_octets
|
||||||
# in openairinterface5g/openair2/LAYER2/PDCP_v10.1.0/pdcp_util.c
|
# in openairinterface5g/openair2/LAYER2/PDCP_v10.1.0/pdcp_util.c
|
||||||
# does funky things with the LOG_x macros but we work on the C pre-processor
|
# does funky things with the LOG_x macros but we work on the C pre-processor
|
||||||
@@ -1034,18 +1053,6 @@ ID = VCD_VARIABLE_SUBFRAME_NUMBER_RX1_UE
|
|||||||
DESC = VCD variable SUBFRAME_NUMBER_RX1_UE
|
DESC = VCD variable SUBFRAME_NUMBER_RX1_UE
|
||||||
GROUP = ALL:VCD:UE:VCD_VARIABLE
|
GROUP = ALL:VCD:UE:VCD_VARIABLE
|
||||||
FORMAT = ulong,value
|
FORMAT = ulong,value
|
||||||
ID = VCD_VARIABLE_MISSED_SLOTS_ENB
|
|
||||||
DESC = VCD variable MISSED_SLOTS_ENB
|
|
||||||
GROUP = ALL:VCD:ENB:VCD_VARIABLE
|
|
||||||
FORMAT = ulong,value
|
|
||||||
ID = VCD_VARIABLE_DAQ_MBOX
|
|
||||||
DESC = VCD variable DAQ_MBOX
|
|
||||||
GROUP = ALL:VCD:ENB:VCD_VARIABLE
|
|
||||||
FORMAT = ulong,value
|
|
||||||
ID = VCD_VARIABLE_UE_OFFSET_MBOX
|
|
||||||
DESC = VCD variable UE_OFFSET_MBOX
|
|
||||||
GROUP = ALL:VCD:UE:VCD_VARIABLE
|
|
||||||
FORMAT = ulong,value
|
|
||||||
ID = VCD_VARIABLE_UE_RX_OFFSET
|
ID = VCD_VARIABLE_UE_RX_OFFSET
|
||||||
DESC = VCD variable UE_RX_OFFSET
|
DESC = VCD variable UE_RX_OFFSET
|
||||||
GROUP = ALL:VCD:UE:VCD_VARIABLE
|
GROUP = ALL:VCD:UE:VCD_VARIABLE
|
||||||
@@ -1553,6 +1560,18 @@ ID = VCD_FUNCTION_UE_LOCK_MUTEX_RXTX_FOR_CNT_INCREMENT1
|
|||||||
DESC = VCD function UE_LOCK_MUTEX_RXTX_FOR_CNT_INCREMENT1
|
DESC = VCD function UE_LOCK_MUTEX_RXTX_FOR_CNT_INCREMENT1
|
||||||
GROUP = ALL:VCD:UE:VCD_FUNCTION
|
GROUP = ALL:VCD:UE:VCD_FUNCTION
|
||||||
FORMAT = int,value
|
FORMAT = int,value
|
||||||
|
ID = VCD_FUNCTION_SIM_DO_DL_SIGNAL
|
||||||
|
DESC = VCD function SIM_DO_DL_SIGNAL
|
||||||
|
GROUP = ALL:VCD:ENB:VCD_FUNCTION
|
||||||
|
FORMAT = int,value
|
||||||
|
ID = VCD_FUNCTION_SIM_DO_UL_SIGNAL
|
||||||
|
DESC = VCD function SIM_DO_UL_SIGNAL
|
||||||
|
GROUP = ALL:VCD:ENB:VCD_FUNCTION
|
||||||
|
FORMAT = int,value
|
||||||
|
ID = VCD_FUNCTION_SIM_UE_TRX_READ
|
||||||
|
DESC = VCD function SIM_UE_TRX_READ
|
||||||
|
GROUP = ALL:VCD:ENB:VCD_FUNCTION
|
||||||
|
FORMAT = int,value
|
||||||
ID = VCD_FUNCTION_eNB_TX
|
ID = VCD_FUNCTION_eNB_TX
|
||||||
DESC = VCD function eNB_TX
|
DESC = VCD function eNB_TX
|
||||||
GROUP = ALL:VCD:ENB:VCD_FUNCTION
|
GROUP = ALL:VCD:ENB:VCD_FUNCTION
|
||||||
|
|||||||
@@ -367,20 +367,24 @@ void T_local_tracer_main(int remote_port, int wait_for_tracer,
|
|||||||
int port = remote_port;
|
int port = remote_port;
|
||||||
int dont_wait = wait_for_tracer ? 0 : 1;
|
int dont_wait = wait_for_tracer ? 0 : 1;
|
||||||
void *f;
|
void *f;
|
||||||
|
printf("local tracer starting\n");
|
||||||
/* write on a socket fails if the other end is closed and we get SIGPIPE */
|
/* write on a socket fails if the other end is closed and we get SIGPIPE */
|
||||||
if (signal(SIGPIPE, SIG_IGN) == SIG_ERR) abort();
|
if (signal(SIGPIPE, SIG_IGN) == SIG_ERR){
|
||||||
|
printf("local tracer received SIGPIPE\n");
|
||||||
|
abort();
|
||||||
|
}
|
||||||
|
|
||||||
init_shm(shm_file);
|
init_shm(shm_file);
|
||||||
s = local_socket;
|
s = local_socket;
|
||||||
|
printf("local tracer starting step 2\n");
|
||||||
if (dont_wait) {
|
if (dont_wait) {
|
||||||
char t = 2;
|
char t = 2;
|
||||||
|
printf("local tracer in no wait mode \n");
|
||||||
if (write(s, &t, 1) != 1) abort();
|
if (write(s, &t, 1) != 1) abort();
|
||||||
}
|
}
|
||||||
|
printf("local tracer starting step 3\n");
|
||||||
f = forwarder(port, s);
|
f = forwarder(port, s);
|
||||||
|
printf("local tracer main loop.... \n");
|
||||||
/* read messages */
|
/* read messages */
|
||||||
while (1) {
|
while (1) {
|
||||||
wait_message();
|
wait_message();
|
||||||
|
|||||||
@@ -117,12 +117,7 @@ err:
|
|||||||
e.e[frame_arg].i, e.e[subframe_arg].i, e.e[buffer_arg].bsize);
|
e.e[frame_arg].i, e.e[subframe_arg].i, e.e[buffer_arg].bsize);
|
||||||
if (!(frame == e.e[frame_arg].i && subframe == e.e[subframe_arg].i))
|
if (!(frame == e.e[frame_arg].i && subframe == e.e[subframe_arg].i))
|
||||||
continue;
|
continue;
|
||||||
#if 0
|
|
||||||
for (i = 0; i < e.e[buffer_arg].bsize/2; i++) {
|
|
||||||
short *x = e.e[buffer_arg].b;
|
|
||||||
x[i] *= 14;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
if (fwrite(e.e[buffer_arg].b, e.e[buffer_arg].bsize, 1, out) != 1)
|
if (fwrite(e.e[buffer_arg].b, e.e[buffer_arg].bsize, 1, out) != 1)
|
||||||
{ perror(output_file); exit(1); }
|
{ perror(output_file); exit(1); }
|
||||||
processed_subframes++;
|
processed_subframes++;
|
||||||
|
|||||||
@@ -124,12 +124,6 @@ err:
|
|||||||
}
|
}
|
||||||
last_frame = frame;
|
last_frame = frame;
|
||||||
last_subframe = subframe;
|
last_subframe = subframe;
|
||||||
#if 0
|
|
||||||
for (i = 0; i < e.e[buffer_arg].bsize/2; i++) {
|
|
||||||
short *x = e.e[buffer_arg].b;
|
|
||||||
x[i] *= 14;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
if (verbose)
|
if (verbose)
|
||||||
printf("save output frame %d subframe %d size %d\n",
|
printf("save output frame %d subframe %d size %d\n",
|
||||||
e.e[frame_arg].i, e.e[subframe_arg].i, e.e[buffer_arg].bsize);
|
e.e[frame_arg].i, e.e[subframe_arg].i, e.e[buffer_arg].bsize);
|
||||||
|
|||||||
@@ -22,13 +22,7 @@ int main(void)
|
|||||||
widget_add_child(g, c1, c2, 0);
|
widget_add_child(g, c1, c2, 0);
|
||||||
|
|
||||||
plot = new_xy_plot(g, 100, 100, "xy plot test", 30);
|
plot = new_xy_plot(g, 100, 100, "xy plot test", 30);
|
||||||
#if 0
|
|
||||||
c2 = new_container(g, HORIZONTAL);
|
|
||||||
widget_add_child(g, c2, plot, -1);
|
|
||||||
widget_add_child(g, c1, c2, -1);
|
|
||||||
#else
|
|
||||||
widget_add_child(g, c1, plot, -1);
|
widget_add_child(g, c1, plot, -1);
|
||||||
#endif
|
|
||||||
|
|
||||||
tlcol = new_color(g, "#ddf");
|
tlcol = new_color(g, "#ddf");
|
||||||
tl = new_textlist(g, 300, 10, tlcol);
|
tl = new_textlist(g, 300, 10, tlcol);
|
||||||
|
|||||||
@@ -124,20 +124,6 @@ x_window *x_create_window(x_connection *_x, int width, int height,
|
|||||||
|
|
||||||
XMapWindow(x->d, ret->w);
|
XMapWindow(x->d, ret->w);
|
||||||
|
|
||||||
#if 0
|
|
||||||
/* wait for window to be mapped */
|
|
||||||
LOGD("wait for map\n");
|
|
||||||
while (1) {
|
|
||||||
XEvent ev;
|
|
||||||
//XWindowEvent(x->d, ret->w, StructureNotifyMask, &ev);
|
|
||||||
XWindowEvent(x->d, ret->w, ExposureMask, &ev);
|
|
||||||
LOGD("got ev %d\n", ev.type);
|
|
||||||
//if (ev.type == MapNotify) break;
|
|
||||||
if (ev.type == Expose) break;
|
|
||||||
}
|
|
||||||
LOGD("XXX create connection %p window %p (win id %d pixmap %d) w h %d %d\n", x, ret, (int)ret->w, (int)ret->p, width, height);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -265,14 +251,6 @@ void x_events(gui *_gui)
|
|||||||
ev.xbutton.button, 1);
|
ev.xbutton.button, 1);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
#if 0
|
|
||||||
case MapNotify:
|
|
||||||
if ((w = find_x_window(g, ev.xmap.window)) != NULL) {
|
|
||||||
struct x_window *xw = w->x;
|
|
||||||
xw->repaint = 1;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
#endif
|
|
||||||
default: if (gui_logd) WARN("TODO: X event type %d\n", ev.type); break;
|
default: if (gui_logd) WARN("TODO: X event type %d\n", ev.type); break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -7,165 +7,6 @@
|
|||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <math.h>
|
#include <math.h>
|
||||||
|
|
||||||
#if 0
|
|
||||||
/* this version behaves differently when you resize the XY plot. Say
|
|
||||||
* you increase the size. The old (smaller) view is put at the center
|
|
||||||
* of the new view. Everything inside keeps the same size/aspect ratio.
|
|
||||||
* The other version below resizes the old view so that it fully occupies
|
|
||||||
* the new view. It may introduce aspect ratio changes, but usage seems
|
|
||||||
* to suggest it's a better behaviour.
|
|
||||||
*/
|
|
||||||
static void paint(gui *_gui, widget *_this)
|
|
||||||
{
|
|
||||||
struct gui *g = _gui;
|
|
||||||
struct xy_plot_widget *this = _this;
|
|
||||||
int wanted_plot_width, allocated_plot_width;
|
|
||||||
int wanted_plot_height, allocated_plot_height;
|
|
||||||
float pxsize;
|
|
||||||
float ticdist;
|
|
||||||
float tic;
|
|
||||||
float ticstep;
|
|
||||||
int k, kmin, kmax;
|
|
||||||
float allocated_xmin, allocated_xmax;
|
|
||||||
float allocated_ymin, allocated_ymax;
|
|
||||||
float center;
|
|
||||||
int i;
|
|
||||||
int n;
|
|
||||||
|
|
||||||
# define FLIP(v) (-(v) + allocated_plot_height-1)
|
|
||||||
|
|
||||||
LOGD("PAINT xy plot xywh %d %d %d %d\n", this->common.x, this->common.y, this->common.width, this->common.height);
|
|
||||||
|
|
||||||
//x_draw_rectangle(g->x, g->xwin, 1, this->common.x, this->common.y, this->common.width, this->common.height);
|
|
||||||
|
|
||||||
wanted_plot_width = this->wanted_width;
|
|
||||||
allocated_plot_width = this->common.width - this->vrule_width;
|
|
||||||
wanted_plot_height = this->wanted_height;
|
|
||||||
allocated_plot_height = this->common.height - this->label_height * 2;
|
|
||||||
|
|
||||||
/* plot zone */
|
|
||||||
/* TODO: refine height - height of hrule text may be != from label */
|
|
||||||
x_draw_rectangle(g->x, g->xwin, 1,
|
|
||||||
this->common.x + this->vrule_width,
|
|
||||||
this->common.y,
|
|
||||||
this->common.width - this->vrule_width -1, /* -1 to see right border */
|
|
||||||
this->common.height - this->label_height * 2);
|
|
||||||
|
|
||||||
/* horizontal tics */
|
|
||||||
pxsize = (this->xmax - this->xmin) / wanted_plot_width;
|
|
||||||
ticdist = 100;
|
|
||||||
tic = floor(log10(ticdist * pxsize));
|
|
||||||
ticstep = powf(10, tic);
|
|
||||||
center = (this->xmax + this->xmin) / 2;
|
|
||||||
allocated_xmin = center - ((this->xmax - this->xmin) *
|
|
||||||
allocated_plot_width / wanted_plot_width) / 2;
|
|
||||||
allocated_xmax = center + ((this->xmax - this->xmin) *
|
|
||||||
allocated_plot_width / wanted_plot_width) / 2;
|
|
||||||
/* adjust tic if too tight */
|
|
||||||
LOGD("pre x ticstep %g\n", ticstep);
|
|
||||||
while (1) {
|
|
||||||
if (ticstep / (allocated_xmax - allocated_xmin)
|
|
||||||
* (allocated_plot_width - 1) > 40) break;
|
|
||||||
ticstep *= 2;
|
|
||||||
}
|
|
||||||
LOGD("post x ticstep %g\n", ticstep);
|
|
||||||
LOGD("xmin/max %g %g width wanted allocated %d %d alloc xmin/max %g %g ticstep %g\n", this->xmin, this->xmax, wanted_plot_width, allocated_plot_width, allocated_xmin, allocated_xmax, ticstep);
|
|
||||||
kmin = ceil(allocated_xmin / ticstep);
|
|
||||||
kmax = floor(allocated_xmax / ticstep);
|
|
||||||
for (k = kmin; k <= kmax; k++) {
|
|
||||||
/*
|
|
||||||
(k * ticstep - allocated_xmin) / (allocated_max - allocated_xmin) =
|
|
||||||
(x - 0) / (allocated_plot_width-1 - 0)
|
|
||||||
*/
|
|
||||||
char v[64];
|
|
||||||
int vwidth, dummy;
|
|
||||||
int x = (k * ticstep - allocated_xmin) /
|
|
||||||
(allocated_xmax - allocated_xmin) *
|
|
||||||
(allocated_plot_width - 1);
|
|
||||||
x_draw_line(g->x, g->xwin, FOREGROUND_COLOR,
|
|
||||||
this->common.x + this->vrule_width + x,
|
|
||||||
this->common.y + this->common.height - this->label_height * 2,
|
|
||||||
this->common.x + this->vrule_width + x,
|
|
||||||
this->common.y + this->common.height - this->label_height * 2 - 5);
|
|
||||||
sprintf(v, "%g", k * ticstep);
|
|
||||||
x_text_get_dimensions(g->x, DEFAULT_FONT, v, &vwidth, &dummy, &dummy);
|
|
||||||
x_draw_string(g->x, g->xwin, DEFAULT_FONT, FOREGROUND_COLOR,
|
|
||||||
this->common.x + this->vrule_width + x - vwidth/2,
|
|
||||||
this->common.y + this->common.height - this->label_height * 2 +
|
|
||||||
this->label_baseline,
|
|
||||||
v);
|
|
||||||
LOGD("tic k %d val %g x %d\n", k, k * ticstep, x);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* vertical tics */
|
|
||||||
pxsize = (this->ymax - this->ymin) / wanted_plot_height;
|
|
||||||
ticdist = 30;
|
|
||||||
tic = floor(log10(ticdist * pxsize));
|
|
||||||
ticstep = powf(10, tic);
|
|
||||||
center = (this->ymax + this->ymin) / 2;
|
|
||||||
allocated_ymin = center - ((this->ymax - this->ymin) *
|
|
||||||
allocated_plot_height / wanted_plot_height) / 2;
|
|
||||||
allocated_ymax = center + ((this->ymax - this->ymin) *
|
|
||||||
allocated_plot_height / wanted_plot_height) / 2;
|
|
||||||
/* adjust tic if too tight */
|
|
||||||
LOGD("pre y ticstep %g\n", ticstep);
|
|
||||||
while (1) {
|
|
||||||
if (ticstep / (allocated_ymax - allocated_ymin)
|
|
||||||
* (allocated_plot_height - 1) > 20) break;
|
|
||||||
ticstep *= 2;
|
|
||||||
}
|
|
||||||
LOGD("post y ticstep %g\n", ticstep);
|
|
||||||
LOGD("ymin/max %g %g height wanted allocated %d %d alloc ymin/max %g %g ticstep %g\n", this->ymin, this->ymax, wanted_plot_height, allocated_plot_height, allocated_ymin, allocated_ymax, ticstep);
|
|
||||||
kmin = ceil(allocated_ymin / ticstep);
|
|
||||||
kmax = floor(allocated_ymax / ticstep);
|
|
||||||
for (k = kmin; k <= kmax; k++) {
|
|
||||||
char v[64];
|
|
||||||
int vwidth, dummy;
|
|
||||||
int y = (k * ticstep - allocated_ymin) /
|
|
||||||
(allocated_ymax - allocated_ymin) *
|
|
||||||
(allocated_plot_height - 1);
|
|
||||||
sprintf(v, "%g", k * ticstep);
|
|
||||||
x_text_get_dimensions(g->x, DEFAULT_FONT, v, &vwidth, &dummy, &dummy);
|
|
||||||
x_draw_line(g->x, g->xwin, FOREGROUND_COLOR,
|
|
||||||
this->common.x + this->vrule_width,
|
|
||||||
this->common.y + FLIP(y),
|
|
||||||
this->common.x + this->vrule_width + 5,
|
|
||||||
this->common.y + FLIP(y));
|
|
||||||
x_draw_string(g->x, g->xwin, DEFAULT_FONT, FOREGROUND_COLOR,
|
|
||||||
this->common.x + this->vrule_width - vwidth - 2,
|
|
||||||
this->common.y + FLIP(y) - this->label_height/2+this->label_baseline,
|
|
||||||
v);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* label at bottom, in the middle */
|
|
||||||
x_draw_string(g->x, g->xwin, DEFAULT_FONT, FOREGROUND_COLOR,
|
|
||||||
this->common.x + (this->common.width - this->label_width) / 2,
|
|
||||||
this->common.y + this->common.height - this->label_height
|
|
||||||
+ this->label_baseline,
|
|
||||||
this->label);
|
|
||||||
|
|
||||||
for (n = 0; n < this->nplots; n++) {
|
|
||||||
/* points */
|
|
||||||
float ax, bx, ay, by;
|
|
||||||
ax = (allocated_plot_width-1) / (allocated_xmax - allocated_xmin);
|
|
||||||
bx = -ax * allocated_xmin;
|
|
||||||
ay = (allocated_plot_height-1) / (allocated_ymax - allocated_ymin);
|
|
||||||
by = -ay * allocated_ymin;
|
|
||||||
for (i = 0; i < this->plots[n].npoints; i++) {
|
|
||||||
int x, y;
|
|
||||||
x = ax * this->plots[n].x[i] + bx;
|
|
||||||
y = ay * this->plots[n].y[i] + by;
|
|
||||||
if (x >= 0 && x < allocated_plot_width &&
|
|
||||||
y >= 0 && y < allocated_plot_height)
|
|
||||||
x_add_point(g->x,
|
|
||||||
this->common.x + this->vrule_width + x,
|
|
||||||
this->common.y + FLIP(y));
|
|
||||||
}
|
|
||||||
x_plot_points(g->x, g->xwin, this->plots[n].color);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
static void paint(gui *_gui, widget *_this)
|
static void paint(gui *_gui, widget *_this)
|
||||||
{
|
{
|
||||||
struct gui *g = _gui;
|
struct gui *g = _gui;
|
||||||
|
|||||||
@@ -20,42 +20,6 @@ struct iqlog {
|
|||||||
int max_length;
|
int max_length;
|
||||||
};
|
};
|
||||||
|
|
||||||
#if 0
|
|
||||||
/* this function passes all received IQ samples to the views */
|
|
||||||
static void _event(void *p, event e)
|
|
||||||
{
|
|
||||||
struct iqlog *l = p;
|
|
||||||
int i;
|
|
||||||
void *buffer;
|
|
||||||
int bsize;
|
|
||||||
int nsamples;
|
|
||||||
|
|
||||||
if (l->common.filter != NULL && filter_eval(l->common.filter, e) == 0)
|
|
||||||
return;
|
|
||||||
|
|
||||||
buffer = e.e[l->buffer_arg].b;
|
|
||||||
bsize = e.e[l->buffer_arg].bsize;
|
|
||||||
|
|
||||||
nsamples = bsize / (2*sizeof(int16_t));
|
|
||||||
|
|
||||||
if (nsamples > l->max_length) {
|
|
||||||
l->i = realloc(l->i, nsamples * sizeof(float));
|
|
||||||
if (l->i == NULL) abort();
|
|
||||||
l->q = realloc(l->q, nsamples * sizeof(float));
|
|
||||||
if (l->q == NULL) abort();
|
|
||||||
l->max_length = nsamples;
|
|
||||||
}
|
|
||||||
|
|
||||||
for (i = 0; i < nsamples; i++) {
|
|
||||||
l->i[i] = ((int16_t *)buffer)[i*2];
|
|
||||||
l->q[i] = ((int16_t *)buffer)[i*2+1];
|
|
||||||
}
|
|
||||||
|
|
||||||
for (i = 0; i < l->common.vsize; i++)
|
|
||||||
l->common.v[i]->append(l->common.v[i], l->i, l->q, nsamples);
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
static void _event(void *p, event e)
|
static void _event(void *p, event e)
|
||||||
{
|
{
|
||||||
struct iqlog *l = p;
|
struct iqlog *l = p;
|
||||||
|
|||||||
@@ -56,176 +56,6 @@
|
|||||||
#define SC_RNTI 9
|
#define SC_RNTI 9
|
||||||
#define G_RNTI 10
|
#define G_RNTI 10
|
||||||
|
|
||||||
#if 0
|
|
||||||
typedef enum mac_lte_oob_event {
|
|
||||||
ltemac_send_preamble,
|
|
||||||
ltemac_send_sr,
|
|
||||||
ltemac_sr_failure
|
|
||||||
} mac_lte_oob_event;
|
|
||||||
|
|
||||||
typedef enum mac_lte_dl_retx {
|
|
||||||
dl_retx_no,
|
|
||||||
dl_retx_yes,
|
|
||||||
dl_retx_unknown
|
|
||||||
} mac_lte_dl_retx;
|
|
||||||
|
|
||||||
typedef enum mac_lte_crc_status {
|
|
||||||
crc_fail = 0,
|
|
||||||
crc_success = 1,
|
|
||||||
crc_high_code_rate = 2,
|
|
||||||
crc_pdsch_lost = 3,
|
|
||||||
crc_duplicate_nonzero_rv = 4,
|
|
||||||
crc_false_dci = 5
|
|
||||||
} mac_lte_crc_status;
|
|
||||||
|
|
||||||
typedef enum mac_lte_carrier_id {
|
|
||||||
carrier_id_primary,
|
|
||||||
carrier_id_secondary_1,
|
|
||||||
carrier_id_secondary_2,
|
|
||||||
carrier_id_secondary_3,
|
|
||||||
carrier_id_secondary_4
|
|
||||||
} mac_lte_carrier_id;
|
|
||||||
|
|
||||||
typedef enum mac_lte_ce_mode {
|
|
||||||
no_ce_mode = 0,
|
|
||||||
ce_mode_a = 1,
|
|
||||||
ce_mode_b = 2
|
|
||||||
} mac_lte_ce_mode;
|
|
||||||
|
|
||||||
typedef enum mac_lte_nb_mode {
|
|
||||||
no_nb_mode = 0,
|
|
||||||
nb_mode = 1
|
|
||||||
} mac_lte_nb_mode;
|
|
||||||
|
|
||||||
/* Context info attached to each LTE MAC frame */
|
|
||||||
typedef struct mac_lte_info
|
|
||||||
{
|
|
||||||
/* Needed for decode */
|
|
||||||
guint8 radioType;
|
|
||||||
guint8 direction;
|
|
||||||
guint8 rntiType;
|
|
||||||
|
|
||||||
/* Extra info to display */
|
|
||||||
guint16 rnti;
|
|
||||||
guint16 ueid;
|
|
||||||
|
|
||||||
/* Timing info */
|
|
||||||
guint16 sysframeNumber;
|
|
||||||
guint16 subframeNumber;
|
|
||||||
|
|
||||||
/* Optional field. More interesting for TDD (FDD is always -4 subframeNumber) */
|
|
||||||
gboolean subframeNumberOfGrantPresent;
|
|
||||||
guint16 subframeNumberOfGrant;
|
|
||||||
|
|
||||||
/* Flag set only if doing PHY-level data test - i.e. there may not be a
|
|
||||||
well-formed MAC PDU so just show as raw data */
|
|
||||||
gboolean isPredefinedData;
|
|
||||||
|
|
||||||
/* Length of DL PDU or UL grant size in bytes */
|
|
||||||
guint16 length;
|
|
||||||
|
|
||||||
/* 0=newTx, 1=first-retx, etc */
|
|
||||||
guint8 reTxCount;
|
|
||||||
guint8 isPHICHNACK; /* FALSE=PDCCH retx grant, TRUE=PHICH NACK */
|
|
||||||
|
|
||||||
/* UL only. Indicates if the R10 extendedBSR-Sizes parameter is set */
|
|
||||||
gboolean isExtendedBSRSizes;
|
|
||||||
|
|
||||||
/* UL only. Indicates if the R10 simultaneousPUCCH-PUSCH parameter is set for PCell */
|
|
||||||
gboolean isSimultPUCCHPUSCHPCell;
|
|
||||||
|
|
||||||
/* UL only. Indicates if the R10 extendedBSR-Sizes parameter is set for PSCell */
|
|
||||||
gboolean isSimultPUCCHPUSCHPSCell;
|
|
||||||
|
|
||||||
/* Status of CRC check. For UE it is DL only. For eNodeB it is UL
|
|
||||||
only. For an analyzer, it is present for both DL and UL. */
|
|
||||||
gboolean crcStatusValid;
|
|
||||||
mac_lte_crc_status crcStatus;
|
|
||||||
|
|
||||||
/* Carrier ID */
|
|
||||||
mac_lte_carrier_id carrierId;
|
|
||||||
|
|
||||||
/* DL only. Is this known to be a retransmission? */
|
|
||||||
mac_lte_dl_retx dl_retx;
|
|
||||||
|
|
||||||
/* DL only. CE mode to be used for RAR decoding */
|
|
||||||
mac_lte_ce_mode ceMode;
|
|
||||||
|
|
||||||
/* DL and UL. NB-IoT mode of the UE */
|
|
||||||
mac_lte_nb_mode nbMode;
|
|
||||||
|
|
||||||
/* More Physical layer info (see direction above for which side of union to use) */
|
|
||||||
union {
|
|
||||||
struct mac_lte_ul_phy_info
|
|
||||||
{
|
|
||||||
guint8 present; /* Remaining UL fields are present and should be displayed */
|
|
||||||
guint8 modulation_type;
|
|
||||||
guint8 tbs_index;
|
|
||||||
guint8 resource_block_length;
|
|
||||||
guint8 resource_block_start;
|
|
||||||
guint8 harq_id;
|
|
||||||
gboolean ndi;
|
|
||||||
} ul_info;
|
|
||||||
struct mac_lte_dl_phy_info
|
|
||||||
{
|
|
||||||
guint8 present; /* Remaining DL fields are present and should be displayed */
|
|
||||||
guint8 dci_format;
|
|
||||||
guint8 resource_allocation_type;
|
|
||||||
guint8 aggregation_level;
|
|
||||||
guint8 mcs_index;
|
|
||||||
guint8 redundancy_version_index;
|
|
||||||
guint8 resource_block_length;
|
|
||||||
guint8 harq_id;
|
|
||||||
gboolean ndi;
|
|
||||||
guint8 transport_block; /* 0..1 */
|
|
||||||
} dl_info;
|
|
||||||
} detailed_phy_info;
|
|
||||||
|
|
||||||
/* Relating to out-of-band events */
|
|
||||||
/* N.B. dissector will only look to these fields if length is 0... */
|
|
||||||
mac_lte_oob_event oob_event;
|
|
||||||
guint8 rapid;
|
|
||||||
guint8 rach_attempt_number;
|
|
||||||
#define MAX_SRs 20
|
|
||||||
guint16 number_of_srs;
|
|
||||||
guint16 oob_ueid[MAX_SRs];
|
|
||||||
guint16 oob_rnti[MAX_SRs];
|
|
||||||
} mac_lte_info;
|
|
||||||
|
|
||||||
|
|
||||||
typedef struct mac_lte_tap_info {
|
|
||||||
/* Info from context */
|
|
||||||
guint16 rnti;
|
|
||||||
guint16 ueid;
|
|
||||||
guint8 rntiType;
|
|
||||||
guint8 isPredefinedData;
|
|
||||||
gboolean crcStatusValid;
|
|
||||||
mac_lte_crc_status crcStatus;
|
|
||||||
guint8 direction;
|
|
||||||
|
|
||||||
guint8 isPHYRetx;
|
|
||||||
guint16 ueInTTI;
|
|
||||||
|
|
||||||
nstime_t mac_lte_time;
|
|
||||||
|
|
||||||
/* Number of bytes (which part is used depends upon context settings) */
|
|
||||||
guint32 single_number_of_bytes;
|
|
||||||
guint32 bytes_for_lcid[11];
|
|
||||||
guint32 sdus_for_lcid[11];
|
|
||||||
guint8 number_of_rars;
|
|
||||||
guint8 number_of_paging_ids;
|
|
||||||
|
|
||||||
/* Number of padding bytes includes padding subheaders and trailing padding */
|
|
||||||
guint16 padding_bytes;
|
|
||||||
guint16 raw_length;
|
|
||||||
} mac_lte_tap_info;
|
|
||||||
|
|
||||||
|
|
||||||
/* Accessor function to check if a frame was considered to be ReTx */
|
|
||||||
int is_mac_lte_frame_retx(packet_info *pinfo, guint8 direction);
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/*****************************************************************/
|
/*****************************************************************/
|
||||||
/* UDP framing format */
|
/* UDP framing format */
|
||||||
/* ----------------------- */
|
/* ----------------------- */
|
||||||
@@ -309,82 +139,3 @@ int is_mac_lte_frame_retx(packet_info *pinfo, guint8 direction);
|
|||||||
continues until the end of the frame) */
|
continues until the end of the frame) */
|
||||||
#define MAC_LTE_PAYLOAD_TAG 0x01
|
#define MAC_LTE_PAYLOAD_TAG 0x01
|
||||||
|
|
||||||
|
|
||||||
#if 0
|
|
||||||
|
|
||||||
/* Type to store parameters for configuring LCID->RLC channel settings for DRB */
|
|
||||||
/* Some are optional, and may not be seen (e.g. on reestablishment) */
|
|
||||||
typedef struct drb_mapping_t
|
|
||||||
{
|
|
||||||
guint16 ueid; /* Mandatory */
|
|
||||||
guint8 drbid; /* Mandatory */
|
|
||||||
gboolean lcid_present;
|
|
||||||
guint8 lcid; /* Part of LogicalChannelConfig - optional */
|
|
||||||
gboolean rlcMode_present;
|
|
||||||
guint8 rlcMode; /* Part of RLC config - optional */
|
|
||||||
gboolean rlc_ul_ext_li_field; /* Part of RLC config - optional */
|
|
||||||
gboolean rlc_dl_ext_li_field; /* Part of RLC config - optional */
|
|
||||||
gboolean rlc_ul_ext_am_sn; /* Part of RLC config - optional */
|
|
||||||
gboolean rlc_dl_ext_am_sn; /* Part of RLC config - optional */
|
|
||||||
gboolean um_sn_length_present;
|
|
||||||
guint8 um_sn_length; /* Part of RLC config - optional */
|
|
||||||
gboolean ul_priority_present;
|
|
||||||
guint8 ul_priority; /* Part of LogicalChannelConfig - optional */
|
|
||||||
gboolean pdcp_sn_size_present;
|
|
||||||
guint8 pdcp_sn_size; /* Part of pdcp-Config - optional */
|
|
||||||
} drb_mapping_t;
|
|
||||||
|
|
||||||
|
|
||||||
/* Set details of an LCID -> drb channel mapping. To be called from
|
|
||||||
configuration protocol (e.g. RRC) */
|
|
||||||
void set_mac_lte_channel_mapping(drb_mapping_t *drb_mapping);
|
|
||||||
|
|
||||||
|
|
||||||
/* Dedicated DRX config. Used to verify that a sensible config is given.
|
|
||||||
Also, beginning to configure MAC with this config and (optionally) show
|
|
||||||
DRX config and state (cycles/timers) attached to each UL/DL PDU! */
|
|
||||||
typedef struct drx_config_t {
|
|
||||||
gboolean configured;
|
|
||||||
guint32 frameNum;
|
|
||||||
guint32 previousFrameNum;
|
|
||||||
|
|
||||||
guint32 onDurationTimer;
|
|
||||||
guint32 inactivityTimer;
|
|
||||||
guint32 retransmissionTimer;
|
|
||||||
guint32 longCycle;
|
|
||||||
guint32 cycleOffset;
|
|
||||||
/* Optional Short cycle */
|
|
||||||
gboolean shortCycleConfigured;
|
|
||||||
guint32 shortCycle;
|
|
||||||
guint32 shortCycleTimer;
|
|
||||||
} drx_config_t;
|
|
||||||
|
|
||||||
/* Functions to set/release up dedicated DRX config */
|
|
||||||
void set_mac_lte_drx_config(guint16 ueid, drx_config_t *drx_config, packet_info *pinfo);
|
|
||||||
void set_mac_lte_drx_config_release(guint16 ueid, packet_info *pinfo);
|
|
||||||
|
|
||||||
/* RRC can tell this dissector which RAPIDs are Group A, Group A&B */
|
|
||||||
void set_mac_lte_rapid_ranges(guint groupA, guint all_RA);
|
|
||||||
|
|
||||||
/* RRC can indicate whether extended BSR sizes are used */
|
|
||||||
void set_mac_lte_extended_bsr_sizes(guint16 ueid, gboolean use_ext_bsr_sizes, packet_info *pinfo);
|
|
||||||
|
|
||||||
/* RRC can indicate whether simultaneous PUCCH/PUSCH is used */
|
|
||||||
typedef enum {
|
|
||||||
SIMULT_PUCCH_PUSCH_PCELL = 0,
|
|
||||||
SIMULT_PUCCH_PUSCH_PSCELL
|
|
||||||
} simult_pucch_pusch_cell_type;
|
|
||||||
void set_mac_lte_simult_pucch_pusch(guint16 ueid, simult_pucch_pusch_cell_type cell_type, gboolean use_simult_pucch_pusch, packet_info *pinfo);
|
|
||||||
|
|
||||||
/* Functions to be called from outside this module (e.g. in a plugin, where mac_lte_info
|
|
||||||
isn't available) to get/set per-packet data */
|
|
||||||
WS_DLL_PUBLIC
|
|
||||||
mac_lte_info *get_mac_lte_proto_data(packet_info *pinfo);
|
|
||||||
WS_DLL_PUBLIC
|
|
||||||
void set_mac_lte_proto_data(packet_info *pinfo, mac_lte_info *p_mac_lte_info);
|
|
||||||
|
|
||||||
/* Function to attempt to populate p_mac_lte_info using framing definition above */
|
|
||||||
gboolean dissect_mac_lte_context_fields(struct mac_lte_info *p_mac_lte_info, tvbuff_t *tvb,
|
|
||||||
gint *p_offset);
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|||||||
@@ -174,7 +174,8 @@ void usage(void)
|
|||||||
" -ip <host> connect to given IP address (default %s)\n"
|
" -ip <host> connect to given IP address (default %s)\n"
|
||||||
" -p <port> connect to given port (default %d)\n"
|
" -p <port> connect to given port (default %d)\n"
|
||||||
" -b <event> <arg> <vcd name> trace as binary (0 off, anything else on)\n"
|
" -b <event> <arg> <vcd name> trace as binary (0 off, anything else on)\n"
|
||||||
" -l <event> <arg> <vcd name> trace as uint64_t\n",
|
" -l <event> <arg> <vcd name> trace as uint64_t\n"
|
||||||
|
" -vcd trace all VCD variables and functions\n",
|
||||||
DEFAULT_REMOTE_IP,
|
DEFAULT_REMOTE_IP,
|
||||||
DEFAULT_REMOTE_PORT
|
DEFAULT_REMOTE_PORT
|
||||||
);
|
);
|
||||||
@@ -192,6 +193,20 @@ void force_stop(int x)
|
|||||||
run = 0;
|
run = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
vcd_vars *add_var(vcd_vars *vars, int nvars,
|
||||||
|
char *event, char *arg, char *vcd_name, int is_boolean)
|
||||||
|
{
|
||||||
|
if (nvars % 64 == 0) {
|
||||||
|
vars = realloc(vars, (nvars+64) * sizeof(vcd_vars));
|
||||||
|
if (vars == NULL) abort();
|
||||||
|
}
|
||||||
|
vars[nvars].event = event;
|
||||||
|
vars[nvars].arg = arg;
|
||||||
|
vars[nvars].vcd_name = vcd_name;
|
||||||
|
vars[nvars].boolean = is_boolean;
|
||||||
|
return vars;
|
||||||
|
}
|
||||||
|
|
||||||
int main(int n, char **v)
|
int main(int n, char **v)
|
||||||
{
|
{
|
||||||
char *output_filename = NULL;
|
char *output_filename = NULL;
|
||||||
@@ -202,11 +217,12 @@ int main(int n, char **v)
|
|||||||
int *is_on;
|
int *is_on;
|
||||||
int number_of_events;
|
int number_of_events;
|
||||||
int i;
|
int i;
|
||||||
vcd_vars vars[n];
|
vcd_vars *vars = NULL;
|
||||||
int nvars = 0;
|
int nvars = 0;
|
||||||
view *vcd_view;
|
view *vcd_view;
|
||||||
event_handler *h;
|
event_handler *h;
|
||||||
logger *textlog;
|
logger *textlog;
|
||||||
|
int all_vcd = 0;
|
||||||
|
|
||||||
/* write on a socket fails if the other end is closed and we get SIGPIPE */
|
/* write on a socket fails if the other end is closed and we get SIGPIPE */
|
||||||
if (signal(SIGPIPE, SIG_IGN) == SIG_ERR) abort();
|
if (signal(SIGPIPE, SIG_IGN) == SIG_ERR) abort();
|
||||||
@@ -221,19 +237,22 @@ int main(int n, char **v)
|
|||||||
if (!strcmp(v[i], "-p"))
|
if (!strcmp(v[i], "-p"))
|
||||||
{ if (i > n-2) usage(); port = atoi(v[++i]); continue; }
|
{ if (i > n-2) usage(); port = atoi(v[++i]); continue; }
|
||||||
if (!strcmp(v[i], "-b")) { if(i>n-4)usage();
|
if (!strcmp(v[i], "-b")) { if(i>n-4)usage();
|
||||||
vars[nvars].event = v[++i];
|
char *event = v[++i];
|
||||||
vars[nvars].arg = v[++i];
|
char *arg = v[++i];
|
||||||
vars[nvars].vcd_name = v[++i];
|
char *vcd_name = v[++i];
|
||||||
vars[nvars++].boolean = 1;
|
vars = add_var(vars, nvars, event, arg, vcd_name, 1);
|
||||||
|
nvars++;
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
if (!strcmp(v[i], "-l")) { if(i>n-4)usage();
|
if (!strcmp(v[i], "-l")) { if(i>n-4)usage();
|
||||||
vars[nvars].event = v[++i];
|
char *event = v[++i];
|
||||||
vars[nvars].arg = v[++i];
|
char *arg = v[++i];
|
||||||
vars[nvars].vcd_name = v[++i];
|
char *vcd_name = v[++i];
|
||||||
vars[nvars++].boolean = 0;
|
vars = add_var(vars, nvars, event, arg, vcd_name, 0);
|
||||||
|
nvars++;
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
if (!strcmp(v[i], "-vcd")) { all_vcd = 1; continue; }
|
||||||
usage();
|
usage();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -260,11 +279,32 @@ int main(int n, char **v)
|
|||||||
/* create the view */
|
/* create the view */
|
||||||
vcd_view = new_view_vcd();
|
vcd_view = new_view_vcd();
|
||||||
|
|
||||||
|
if (all_vcd) {
|
||||||
|
/* activate all VCD traces */
|
||||||
|
for (i = 0; i < number_of_events; i++) {
|
||||||
|
int is_boolean;
|
||||||
|
int prefix_length;
|
||||||
|
char *name = event_name_from_id(database, i);
|
||||||
|
char *var_prefix = "VCD_VARIABLE_";
|
||||||
|
char *fun_prefix = "VCD_FUNCTION_";
|
||||||
|
if (!strncmp(name, var_prefix, strlen(var_prefix))) {
|
||||||
|
prefix_length = strlen(var_prefix);
|
||||||
|
is_boolean = 0;
|
||||||
|
} else if (!strncmp(name, fun_prefix, strlen(fun_prefix))) {
|
||||||
|
prefix_length = strlen(fun_prefix);
|
||||||
|
is_boolean = 1;
|
||||||
|
} else
|
||||||
|
continue;
|
||||||
|
vars = add_var(vars, nvars,
|
||||||
|
name, "value", name+prefix_length, is_boolean);
|
||||||
|
nvars++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/* setup traces */
|
/* setup traces */
|
||||||
for (i = 0; i < nvars; i++) {
|
for (i = 0; i < nvars; i++) {
|
||||||
char format[256];
|
char format[256];
|
||||||
if (strlen(vars[i].arg) > 256-3) abort();
|
if (strlen(vars[i].arg) + strlen(vars[i].vcd_name) > 256-16) abort();
|
||||||
if (strlen(vars[i].vcd_name) > 256-1) abort();
|
|
||||||
sprintf(format, "%c [%s] %s",
|
sprintf(format, "%c [%s] %s",
|
||||||
vars[i].boolean ? 'b' : 'l',
|
vars[i].boolean ? 'b' : 'l',
|
||||||
vars[i].arg,
|
vars[i].arg,
|
||||||
|
|||||||
@@ -95,7 +95,7 @@ hash_table_t *hashtable_create(const hash_size_t sizeP, hash_size_t (*hashfuncP)
|
|||||||
* Cleanup
|
* Cleanup
|
||||||
* The hashtable_destroy() walks through the linked lists for each possible hash value, and releases the elements. It also releases the nodes array and the hash_table_t.
|
* The hashtable_destroy() walks through the linked lists for each possible hash value, and releases the elements. It also releases the nodes array and the hash_table_t.
|
||||||
*/
|
*/
|
||||||
hashtable_rc_t hashtable_destroy(hash_table_t * const hashtblP)
|
hashtable_rc_t hashtable_destroy(hash_table_t * hashtblP)
|
||||||
{
|
{
|
||||||
hash_size_t n;
|
hash_size_t n;
|
||||||
hash_node_t *node, *oldnode;
|
hash_node_t *node, *oldnode;
|
||||||
@@ -117,6 +117,7 @@ hashtable_rc_t hashtable_destroy(hash_table_t * const hashtblP)
|
|||||||
}
|
}
|
||||||
free(hashtblP->nodes);
|
free(hashtblP->nodes);
|
||||||
free(hashtblP);
|
free(hashtblP);
|
||||||
|
hashtblP=NULL;
|
||||||
return HASH_TABLE_OK;
|
return HASH_TABLE_OK;
|
||||||
}
|
}
|
||||||
//-------------------------------------------------------------------------------------------------------------------------------
|
//-------------------------------------------------------------------------------------------------------------------------------
|
||||||
|
|||||||
@@ -35,6 +35,7 @@
|
|||||||
#ifndef ASSERTIONS_H_
|
#ifndef ASSERTIONS_H_
|
||||||
#define ASSERTIONS_H_
|
#define ASSERTIONS_H_
|
||||||
|
|
||||||
|
void output_log_mem(void);
|
||||||
#define _Assert_Exit_ \
|
#define _Assert_Exit_ \
|
||||||
{ \
|
{ \
|
||||||
fprintf(stderr, "\nExiting execution\n"); \
|
fprintf(stderr, "\nExiting execution\n"); \
|
||||||
|
|||||||
@@ -39,7 +39,6 @@
|
|||||||
|
|
||||||
#include "assertions.h"
|
#include "assertions.h"
|
||||||
#include "intertask_interface.h"
|
#include "intertask_interface.h"
|
||||||
#include "intertask_interface_dump.h"
|
|
||||||
|
|
||||||
#if T_TRACER
|
#if T_TRACER
|
||||||
#include "T.h"
|
#include "T.h"
|
||||||
@@ -328,22 +327,17 @@ int itti_send_msg_to_task(task_id_t destination_task_id, instance_t instance, Me
|
|||||||
/* Increment the global message number */
|
/* Increment the global message number */
|
||||||
message_number = itti_increment_message_number ();
|
message_number = itti_increment_message_number ();
|
||||||
|
|
||||||
#if 0
|
|
||||||
/* itti dump is disabled */
|
|
||||||
itti_dump_queue_message (origin_task_id, message_number, message, itti_desc.messages_info[message_id].name,
|
|
||||||
sizeof(MessageHeader) + message->ittiMsgHeader.ittiMsgSize);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
if (destination_task_id != TASK_UNKNOWN) {
|
if (destination_task_id != TASK_UNKNOWN) {
|
||||||
|
|
||||||
if (itti_desc.threads[destination_thread_id].task_state == TASK_STATE_ENDED) {
|
if (itti_desc.threads[destination_thread_id].task_state == TASK_STATE_ENDED ||
|
||||||
ITTI_DEBUG(ITTI_DEBUG_ISSUES, " Message %s, number %lu with priority %d can not be sent from %s to queue (%u:%s), ended destination task!\n",
|
itti_desc.threads[destination_thread_id].task_state == TASK_STATE_NOT_CONFIGURED) {
|
||||||
itti_desc.messages_info[message_id].name,
|
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",
|
||||||
message_number,
|
itti_desc.messages_info[message_id].name,
|
||||||
priority,
|
message_number,
|
||||||
itti_get_task_name(origin_task_id),
|
priority,
|
||||||
destination_task_id,
|
itti_get_task_name(origin_task_id),
|
||||||
itti_get_task_name(destination_task_id));
|
destination_task_id,
|
||||||
|
itti_get_task_name(destination_task_id));
|
||||||
} else {
|
} else {
|
||||||
if(!emulate_rf){
|
if(!emulate_rf){
|
||||||
/* We cannot send a message if the task is not running */
|
/* We cannot send a message if the task is not running */
|
||||||
@@ -429,22 +423,17 @@ int itti_try_send_msg_to_task(task_id_t destination_task_id, instance_t instance
|
|||||||
/* Increment the global message number */
|
/* Increment the global message number */
|
||||||
message_number = itti_increment_message_number ();
|
message_number = itti_increment_message_number ();
|
||||||
|
|
||||||
#if 0
|
|
||||||
/* itti dump is disabled */
|
|
||||||
itti_dump_queue_message (origin_task_id, message_number, message, itti_desc.messages_info[message_id].name,
|
|
||||||
sizeof(MessageHeader) + message->ittiMsgHeader.ittiMsgSize);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
if (destination_task_id != TASK_UNKNOWN) {
|
if (destination_task_id != TASK_UNKNOWN) {
|
||||||
|
|
||||||
if (itti_desc.threads[destination_thread_id].task_state == TASK_STATE_ENDED) {
|
if (itti_desc.threads[destination_thread_id].task_state == TASK_STATE_ENDED ||
|
||||||
ITTI_DEBUG(ITTI_DEBUG_ISSUES, " Message %s, number %lu with priority %d can not be sent from %s to queue (%u:%s), ended destination task!\n",
|
itti_desc.threads[destination_thread_id].task_state == TASK_STATE_NOT_CONFIGURED) {
|
||||||
itti_desc.messages_info[message_id].name,
|
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",
|
||||||
message_number,
|
itti_desc.messages_info[message_id].name,
|
||||||
priority,
|
message_number,
|
||||||
itti_get_task_name(origin_task_id),
|
priority,
|
||||||
destination_task_id,
|
itti_get_task_name(origin_task_id),
|
||||||
itti_get_task_name(destination_task_id));
|
destination_task_id,
|
||||||
|
itti_get_task_name(destination_task_id));
|
||||||
} else {
|
} else {
|
||||||
/* We cannot send a message if the task is not running */
|
/* We cannot send a message if the task is not running */
|
||||||
AssertFatal (itti_desc.threads[destination_thread_id].task_state == TASK_STATE_READY,
|
AssertFatal (itti_desc.threads[destination_thread_id].task_state == TASK_STATE_READY,
|
||||||
@@ -727,15 +716,18 @@ void itti_mark_task_ready(task_id_t task_id)
|
|||||||
|
|
||||||
AssertFatal (thread_id < itti_desc.thread_max, "Thread id (%d) is out of range (%d)!\n", thread_id, itti_desc.thread_max);
|
AssertFatal (thread_id < itti_desc.thread_max, "Thread id (%d) is out of range (%d)!\n", thread_id, itti_desc.thread_max);
|
||||||
|
|
||||||
#if 0
|
|
||||||
/* itti dump is disabled */
|
|
||||||
/* Register the thread in itti dump */
|
|
||||||
itti_dump_thread_use_ring_buffer();
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* Mark the thread as using LFDS queue */
|
/* Mark the thread as using LFDS queue */
|
||||||
lfds611_queue_use(itti_desc.tasks[task_id].message_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.threads[thread_id].task_state = TASK_STATE_READY;
|
||||||
itti_desc.ready_tasks ++;
|
itti_desc.ready_tasks ++;
|
||||||
|
|
||||||
@@ -777,7 +769,7 @@ void itti_terminate_tasks(task_id_t task_id)
|
|||||||
}
|
}
|
||||||
|
|
||||||
int itti_init(task_id_t task_max, thread_id_t thread_max, MessagesIds messages_id_max, const task_info_t *tasks_info,
|
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, const char * const messages_definition_xml, const char * const dump_file_name)
|
const message_info_t *messages_info)
|
||||||
{
|
{
|
||||||
task_id_t task_id;
|
task_id_t task_id;
|
||||||
thread_id_t thread_id;
|
thread_id_t thread_id;
|
||||||
@@ -862,11 +854,6 @@ int itti_init(task_id_t task_max, thread_id_t thread_max, MessagesIds messages_i
|
|||||||
itti_desc.wait_tasks = 0;
|
itti_desc.wait_tasks = 0;
|
||||||
itti_desc.created_tasks = 0;
|
itti_desc.created_tasks = 0;
|
||||||
itti_desc.ready_tasks = 0;
|
itti_desc.ready_tasks = 0;
|
||||||
#if 0
|
|
||||||
/* itti dump is disabled */
|
|
||||||
itti_dump_init (messages_definition_xml, dump_file_name);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
CHECK_INIT_RETURN(timer_init ());
|
CHECK_INIT_RETURN(timer_init ());
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
@@ -931,11 +918,6 @@ void itti_wait_tasks_end(void)
|
|||||||
ITTI_DEBUG(ITTI_DEBUG_ISSUES, " Some threads are still running, force exit\n");
|
ITTI_DEBUG(ITTI_DEBUG_ISSUES, " Some threads are still running, force exit\n");
|
||||||
exit (0);
|
exit (0);
|
||||||
}
|
}
|
||||||
|
|
||||||
#if 0
|
|
||||||
/* itti dump is disabled */
|
|
||||||
itti_dump_exit();
|
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void itti_send_terminate_message(task_id_t task_id)
|
void itti_send_terminate_message(task_id_t task_id)
|
||||||
|
|||||||
@@ -1,790 +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 Signal Dumper
|
|
||||||
* Allows users to connect their itti_analyzer to this process and dump
|
|
||||||
* signals exchanged between tasks.
|
|
||||||
* @author Sebastien Roux <sebastien.roux@eurecom.fr>
|
|
||||||
*/
|
|
||||||
|
|
||||||
#define _GNU_SOURCE // required for pthread_setname_np()
|
|
||||||
#include <pthread.h>
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include <string.h>
|
|
||||||
#include <unistd.h>
|
|
||||||
#include <fcntl.h>
|
|
||||||
#include <errno.h>
|
|
||||||
#include <error.h>
|
|
||||||
#include <sched.h>
|
|
||||||
|
|
||||||
#include <sys/ioctl.h>
|
|
||||||
#include <sys/socket.h>
|
|
||||||
#include <sys/select.h>
|
|
||||||
#include <sys/types.h>
|
|
||||||
#include <arpa/inet.h>
|
|
||||||
|
|
||||||
#include <sys/eventfd.h>
|
|
||||||
|
|
||||||
#include "assertions.h"
|
|
||||||
#include "liblfds611.h"
|
|
||||||
|
|
||||||
#include "itti_types.h"
|
|
||||||
#include "intertask_interface.h"
|
|
||||||
#include "intertask_interface_dump.h"
|
|
||||||
|
|
||||||
#if T_TRACER
|
|
||||||
#include "T.h"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
static const int itti_dump_debug = 0; // 0x8 | 0x4 | 0x2;
|
|
||||||
|
|
||||||
# define ITTI_DUMP_DEBUG(m, x, args...) do { if ((m) & itti_dump_debug) fprintf(stdout, "[ITTI_DUMP][D]"x, ##args); } \
|
|
||||||
while(0)
|
|
||||||
#define ITTI_DUMP_ERROR(x, args...) do { fprintf(stdout, "[ITTI_DUMP][E]"x, ##args); } \
|
|
||||||
while(0)
|
|
||||||
|
|
||||||
|
|
||||||
typedef struct itti_dump_queue_item_s {
|
|
||||||
MessageDef *data;
|
|
||||||
uint32_t data_size;
|
|
||||||
uint32_t message_number;
|
|
||||||
uint32_t message_type;
|
|
||||||
uint32_t message_size;
|
|
||||||
} itti_dump_queue_item_t;
|
|
||||||
|
|
||||||
typedef struct {
|
|
||||||
int sd;
|
|
||||||
uint32_t last_message_number;
|
|
||||||
} itti_client_desc_t;
|
|
||||||
|
|
||||||
typedef struct itti_desc_s {
|
|
||||||
/* Asynchronous thread that write to file/accept new clients */
|
|
||||||
pthread_t itti_acceptor_thread;
|
|
||||||
pthread_attr_t attr;
|
|
||||||
|
|
||||||
/* List of messages to dump.
|
|
||||||
* NOTE: we limit the size of this queue to retain only the last exchanged
|
|
||||||
* messages. The size can be increased by setting up the ITTI_QUEUE_MAX_ELEMENTS
|
|
||||||
* in mme_default_values.h or by putting a custom in the configuration file.
|
|
||||||
*/
|
|
||||||
struct lfds611_ringbuffer_state *itti_message_queue;
|
|
||||||
|
|
||||||
int nb_connected;
|
|
||||||
|
|
||||||
/* Event fd used to notify new messages (semaphore) */
|
|
||||||
int event_fd;
|
|
||||||
int itti_listen_socket;
|
|
||||||
|
|
||||||
itti_client_desc_t itti_clients[ITTI_DUMP_MAX_CON];
|
|
||||||
} itti_desc_t;
|
|
||||||
|
|
||||||
typedef struct {
|
|
||||||
itti_socket_header_t socket_header;
|
|
||||||
|
|
||||||
itti_signal_header_t signal_header;
|
|
||||||
|
|
||||||
/* Message payload is added here, this struct is used as an header */
|
|
||||||
} itti_dump_message_t;
|
|
||||||
|
|
||||||
typedef struct {
|
|
||||||
itti_socket_header_t socket_header;
|
|
||||||
} itti_statistic_message_t;
|
|
||||||
|
|
||||||
static const itti_message_types_t itti_dump_xml_definition_end = ITTI_DUMP_XML_DEFINITION_END;
|
|
||||||
static const itti_message_types_t itti_dump_message_type_end = ITTI_DUMP_MESSAGE_TYPE_END;
|
|
||||||
|
|
||||||
static itti_desc_t itti_dump_queue;
|
|
||||||
static FILE *dump_file = NULL;
|
|
||||||
static int itti_dump_running = 1;
|
|
||||||
|
|
||||||
static volatile uint32_t pending_messages = 0;
|
|
||||||
|
|
||||||
/*------------------------------------------------------------------------------*/
|
|
||||||
static int itti_dump_send_message(int sd, itti_dump_queue_item_t *message)
|
|
||||||
{
|
|
||||||
itti_dump_message_t *new_message;
|
|
||||||
ssize_t bytes_sent = 0, total_sent = 0;
|
|
||||||
uint8_t *data_ptr;
|
|
||||||
|
|
||||||
/* Allocate memory for message header and payload */
|
|
||||||
size_t size = sizeof(itti_dump_message_t) + message->data_size + sizeof(itti_message_types_t);
|
|
||||||
|
|
||||||
AssertFatal (sd > 0, "Socket descriptor (%d) is invalid!\n", sd);
|
|
||||||
AssertFatal (message != NULL, "Message is NULL!\n");
|
|
||||||
|
|
||||||
new_message = malloc(size);
|
|
||||||
AssertFatal (new_message != NULL, "New message allocation failed!\n");
|
|
||||||
|
|
||||||
/* Preparing the header */
|
|
||||||
new_message->socket_header.message_size = size;
|
|
||||||
new_message->socket_header.message_type = ITTI_DUMP_MESSAGE_TYPE;
|
|
||||||
/* Adds message number in unsigned decimal ASCII format */
|
|
||||||
snprintf(new_message->signal_header.message_number_char, sizeof(new_message->signal_header.message_number_char),
|
|
||||||
MESSAGE_NUMBER_CHAR_FORMAT, message->message_number);
|
|
||||||
new_message->signal_header.message_number_char[sizeof(new_message->signal_header.message_number_char) - 1] = '\n';
|
|
||||||
/* Appends message payload */
|
|
||||||
memcpy(&new_message[1], message->data, message->data_size);
|
|
||||||
|
|
||||||
memcpy(((void *) &new_message[1]) + message->data_size, &itti_dump_message_type_end, sizeof(itti_message_types_t));
|
|
||||||
|
|
||||||
data_ptr = (uint8_t *)&new_message[0];
|
|
||||||
|
|
||||||
do {
|
|
||||||
bytes_sent = send(sd, &data_ptr[total_sent], size - total_sent, 0);
|
|
||||||
|
|
||||||
if (bytes_sent < 0) {
|
|
||||||
ITTI_DUMP_ERROR("[%d] Failed to send %zu bytes to socket (%d:%s)\n",
|
|
||||||
sd, size, errno, strerror(errno));
|
|
||||||
free(new_message);
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
total_sent += bytes_sent;
|
|
||||||
} while (total_sent != size);
|
|
||||||
|
|
||||||
free(new_message);
|
|
||||||
return total_sent;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int itti_dump_fwrite_message(itti_dump_queue_item_t *message)
|
|
||||||
{
|
|
||||||
itti_dump_message_t new_message_header;
|
|
||||||
|
|
||||||
if ((dump_file != NULL) && (message != NULL)) {
|
|
||||||
|
|
||||||
new_message_header.socket_header.message_size = message->message_size + sizeof(itti_dump_message_t) + sizeof(itti_message_types_t);
|
|
||||||
new_message_header.socket_header.message_type = message->message_type;
|
|
||||||
snprintf(new_message_header.signal_header.message_number_char, sizeof(new_message_header.signal_header.message_number_char),
|
|
||||||
MESSAGE_NUMBER_CHAR_FORMAT, message->message_number);
|
|
||||||
new_message_header.signal_header.message_number_char[sizeof(new_message_header.signal_header.message_number_char) - 1] = '\n';
|
|
||||||
|
|
||||||
fwrite (&new_message_header, sizeof(itti_dump_message_t), 1, dump_file);
|
|
||||||
fwrite (message->data, message->data_size, 1, dump_file);
|
|
||||||
fwrite (&itti_dump_message_type_end, sizeof(itti_message_types_t), 1, dump_file);
|
|
||||||
fflush (dump_file);
|
|
||||||
return (1);
|
|
||||||
}
|
|
||||||
|
|
||||||
return (0);
|
|
||||||
}
|
|
||||||
|
|
||||||
static int itti_dump_send_xml_definition(const int sd, const char *message_definition_xml,
|
|
||||||
const uint32_t message_definition_xml_length)
|
|
||||||
{
|
|
||||||
itti_socket_header_t *itti_dump_message;
|
|
||||||
/* Allocate memory for message header and payload */
|
|
||||||
size_t itti_dump_message_size;
|
|
||||||
ssize_t bytes_sent = 0, total_sent = 0;
|
|
||||||
uint8_t *data_ptr;
|
|
||||||
|
|
||||||
AssertFatal (sd > 0, "Socket descriptor (%d) is invalid!\n", sd);
|
|
||||||
AssertFatal (message_definition_xml != NULL, "Message definition XML is NULL!\n");
|
|
||||||
|
|
||||||
itti_dump_message_size = sizeof(itti_socket_header_t) + message_definition_xml_length + sizeof(itti_message_types_t);
|
|
||||||
|
|
||||||
itti_dump_message = calloc(1, itti_dump_message_size);
|
|
||||||
|
|
||||||
ITTI_DUMP_DEBUG(0x2, "[%d] Sending XML definition message of size %zu to observer peer\n",
|
|
||||||
sd, itti_dump_message_size);
|
|
||||||
|
|
||||||
itti_dump_message->message_size = itti_dump_message_size;
|
|
||||||
itti_dump_message->message_type = ITTI_DUMP_XML_DEFINITION;
|
|
||||||
|
|
||||||
/* Copying message definition */
|
|
||||||
memcpy (&itti_dump_message[1], message_definition_xml, message_definition_xml_length);
|
|
||||||
memcpy (((void *) &itti_dump_message[1]) + message_definition_xml_length, &itti_dump_xml_definition_end, sizeof(itti_message_types_t));
|
|
||||||
|
|
||||||
data_ptr = (uint8_t *)&itti_dump_message[0];
|
|
||||||
|
|
||||||
do {
|
|
||||||
bytes_sent = send(sd, &data_ptr[total_sent], itti_dump_message_size - total_sent, 0);
|
|
||||||
|
|
||||||
if (bytes_sent < 0) {
|
|
||||||
ITTI_DUMP_ERROR("[%d] Failed to send %zu bytes to socket (%d:%s)\n",
|
|
||||||
sd, itti_dump_message_size, errno, strerror(errno));
|
|
||||||
free(itti_dump_message);
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
total_sent += bytes_sent;
|
|
||||||
} while (total_sent != itti_dump_message_size);
|
|
||||||
|
|
||||||
free(itti_dump_message);
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void itti_dump_user_data_delete_function(void *user_data, void *user_state)
|
|
||||||
{
|
|
||||||
(void)user_state; // UNUSED
|
|
||||||
|
|
||||||
if (user_data != NULL) {
|
|
||||||
itti_dump_queue_item_t *item;
|
|
||||||
task_id_t task_id;
|
|
||||||
int result;
|
|
||||||
|
|
||||||
item = (itti_dump_queue_item_t *)user_data;
|
|
||||||
|
|
||||||
if (item->data != NULL) {
|
|
||||||
task_id = ITTI_MSG_ORIGIN_ID(item->data);
|
|
||||||
result = itti_free(task_id, item->data);
|
|
||||||
AssertFatal (result == EXIT_SUCCESS, "Failed to free memory (%d)!\n", result);
|
|
||||||
} else {
|
|
||||||
task_id = TASK_UNKNOWN;
|
|
||||||
}
|
|
||||||
|
|
||||||
result = itti_free(task_id, item);
|
|
||||||
AssertFatal (result == EXIT_SUCCESS, "Failed to free memory (%d)!\n", result);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static int itti_dump_enqueue_message(itti_dump_queue_item_t *new, uint32_t message_size,
|
|
||||||
uint32_t message_type)
|
|
||||||
{
|
|
||||||
struct lfds611_freelist_element *new_queue_element = NULL;
|
|
||||||
int overwrite_flag;
|
|
||||||
AssertFatal (new != NULL, "Message to queue is NULL!\n");
|
|
||||||
|
|
||||||
new->message_type = message_type;
|
|
||||||
new->message_size = message_size;
|
|
||||||
|
|
||||||
ITTI_DUMP_DEBUG (0x1, " itti_dump_enqueue_message: lfds611_ringbuffer_get_write_element\n");
|
|
||||||
new_queue_element = lfds611_ringbuffer_get_write_element (itti_dump_queue.itti_message_queue, &new_queue_element, &overwrite_flag);
|
|
||||||
|
|
||||||
if (overwrite_flag != 0) {
|
|
||||||
// no free element available: overwrite a non read one => data loss!
|
|
||||||
void *old = NULL;
|
|
||||||
|
|
||||||
lfds611_freelist_get_user_data_from_element(new_queue_element, &old);
|
|
||||||
ITTI_DUMP_DEBUG (0x4, " overwrite_flag set, freeing old data %p %p\n", new_queue_element, old);
|
|
||||||
itti_dump_user_data_delete_function (old, NULL);
|
|
||||||
}
|
|
||||||
|
|
||||||
lfds611_freelist_set_user_data_in_element(new_queue_element, new);
|
|
||||||
lfds611_ringbuffer_put_write_element(itti_dump_queue.itti_message_queue, new_queue_element);
|
|
||||||
|
|
||||||
if (overwrite_flag == 0) {
|
|
||||||
{
|
|
||||||
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_dump_queue.event_fd, &sem_counter, sizeof(sem_counter));
|
|
||||||
AssertFatal (write_ret == sizeof(sem_counter), "Write to dump event failed (%d/%d)!\n", (int) write_ret, (int) sizeof(sem_counter));
|
|
||||||
}
|
|
||||||
// add one to pending_messages, atomically
|
|
||||||
__sync_fetch_and_add (&pending_messages, 1);
|
|
||||||
}
|
|
||||||
|
|
||||||
ITTI_DUMP_DEBUG (0x2, " Added element to queue %p %p, pending %u, type %u\n", new_queue_element, new, pending_messages, message_type);
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void itti_dump_socket_exit(void)
|
|
||||||
{
|
|
||||||
close(itti_dump_queue.event_fd);
|
|
||||||
close(itti_dump_queue.itti_listen_socket);
|
|
||||||
|
|
||||||
/* Leave the thread as we detected end signal */
|
|
||||||
pthread_exit(NULL);
|
|
||||||
}
|
|
||||||
|
|
||||||
static int itti_dump_flush_ring_buffer(int flush_all)
|
|
||||||
{
|
|
||||||
struct lfds611_freelist_element *element = NULL;
|
|
||||||
void *user_data;
|
|
||||||
int j;
|
|
||||||
int consumer;
|
|
||||||
|
|
||||||
/* Check if there is a least one consumer */
|
|
||||||
consumer = 0;
|
|
||||||
|
|
||||||
if (dump_file != NULL) {
|
|
||||||
consumer = 1;
|
|
||||||
} else {
|
|
||||||
for (j = 0; j < ITTI_DUMP_MAX_CON; j++) {
|
|
||||||
if (itti_dump_queue.itti_clients[j].sd > 0) {
|
|
||||||
consumer = 1;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (consumer > 0) {
|
|
||||||
do {
|
|
||||||
/* Acquire the ring element */
|
|
||||||
lfds611_ringbuffer_get_read_element(itti_dump_queue.itti_message_queue, &element);
|
|
||||||
|
|
||||||
// subtract one from pending_messages, atomically
|
|
||||||
__sync_fetch_and_sub (&pending_messages, 1);
|
|
||||||
|
|
||||||
if (element == NULL) {
|
|
||||||
if (flush_all != 0) {
|
|
||||||
flush_all = 0;
|
|
||||||
} else {
|
|
||||||
AssertFatal (0, "Dump event with no data!\n");
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
/* Retrieve user part of the message */
|
|
||||||
lfds611_freelist_get_user_data_from_element(element, &user_data);
|
|
||||||
|
|
||||||
ITTI_DUMP_DEBUG (0x2, " removed element from queue %p %p, pending %u\n", element, user_data, pending_messages);
|
|
||||||
|
|
||||||
if (((itti_dump_queue_item_t *)user_data)->message_type == ITTI_DUMP_EXIT_SIGNAL) {
|
|
||||||
lfds611_ringbuffer_put_read_element(itti_dump_queue.itti_message_queue, element);
|
|
||||||
itti_dump_socket_exit();
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Write message to file */
|
|
||||||
itti_dump_fwrite_message((itti_dump_queue_item_t *)user_data);
|
|
||||||
|
|
||||||
/* Send message to remote analyzer */
|
|
||||||
for (j = 0; j < ITTI_DUMP_MAX_CON; j++) {
|
|
||||||
if (itti_dump_queue.itti_clients[j].sd > 0) {
|
|
||||||
itti_dump_send_message(itti_dump_queue.itti_clients[j].sd,
|
|
||||||
(itti_dump_queue_item_t *)user_data);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
itti_dump_user_data_delete_function (user_data, NULL);
|
|
||||||
lfds611_freelist_set_user_data_in_element(element, NULL);
|
|
||||||
|
|
||||||
/* We have finished with this element, reinsert it in the ring buffer */
|
|
||||||
lfds611_ringbuffer_put_read_element(itti_dump_queue.itti_message_queue, element);
|
|
||||||
}
|
|
||||||
} while(flush_all
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
return (consumer);
|
|
||||||
}
|
|
||||||
|
|
||||||
static int itti_dump_handle_new_connection(int sd, const char *xml_definition, uint32_t xml_definition_length)
|
|
||||||
{
|
|
||||||
if (itti_dump_queue.nb_connected < ITTI_DUMP_MAX_CON) {
|
|
||||||
uint8_t i;
|
|
||||||
|
|
||||||
for (i = 0; i < ITTI_DUMP_MAX_CON; i++) {
|
|
||||||
/* Let's find a place to store the new client */
|
|
||||||
if (itti_dump_queue.itti_clients[i].sd == -1) {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
ITTI_DUMP_DEBUG(0x2, " Found place to store new connection: %d\n", i);
|
|
||||||
|
|
||||||
AssertFatal (i < ITTI_DUMP_MAX_CON, "No more connection available (%d/%d) for socked %d!\n", i, ITTI_DUMP_MAX_CON, sd);
|
|
||||||
|
|
||||||
ITTI_DUMP_DEBUG(0x2, " Socket %d accepted\n", sd);
|
|
||||||
|
|
||||||
/* Send the XML message definition */
|
|
||||||
if (itti_dump_send_xml_definition(sd, xml_definition, xml_definition_length) < 0) {
|
|
||||||
AssertError (0, {}, "Failed to send XML definition!\n");
|
|
||||||
close (sd);
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
itti_dump_queue.itti_clients[i].sd = sd;
|
|
||||||
itti_dump_queue.nb_connected++;
|
|
||||||
} else {
|
|
||||||
ITTI_DUMP_DEBUG(0x2, " Socket %d rejected\n", sd);
|
|
||||||
/* We have reached max number of users connected...
|
|
||||||
* Reject the connection.
|
|
||||||
*/
|
|
||||||
close (sd);
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void *itti_dump_socket(void *arg_p)
|
|
||||||
{
|
|
||||||
uint32_t message_definition_xml_length;
|
|
||||||
char *message_definition_xml;
|
|
||||||
int rc;
|
|
||||||
int itti_listen_socket, max_sd;
|
|
||||||
int on = 1;
|
|
||||||
fd_set read_set, working_set;
|
|
||||||
struct sockaddr_in servaddr; /* socket address structure */
|
|
||||||
|
|
||||||
struct timeval *timeout_p = NULL;
|
|
||||||
|
|
||||||
ITTI_DUMP_DEBUG(0x2, " Creating TCP dump socket on port %u\n", ITTI_PORT);
|
|
||||||
|
|
||||||
message_definition_xml = (char *)arg_p;
|
|
||||||
AssertFatal (message_definition_xml != NULL, "Message definition XML is NULL!\n");
|
|
||||||
|
|
||||||
message_definition_xml_length = strlen(message_definition_xml) + 1;
|
|
||||||
|
|
||||||
if ((itti_listen_socket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0) {
|
|
||||||
ITTI_DUMP_ERROR(" ocket creation failed (%d:%s)\n", errno, strerror(errno));
|
|
||||||
pthread_exit(NULL);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Allow socket reuse */
|
|
||||||
rc = setsockopt(itti_listen_socket, SOL_SOCKET, SO_REUSEADDR,
|
|
||||||
(char *)&on, sizeof(on));
|
|
||||||
|
|
||||||
if (rc < 0) {
|
|
||||||
ITTI_DUMP_ERROR(" setsockopt SO_REUSEADDR failed (%d:%s)\n", errno, strerror(errno));
|
|
||||||
close(itti_listen_socket);
|
|
||||||
pthread_exit(NULL);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Set socket to be non-blocking.
|
|
||||||
* NOTE: sockets accepted will inherit this option.
|
|
||||||
*/
|
|
||||||
rc = ioctl(itti_listen_socket, FIONBIO, (char *)&on);
|
|
||||||
|
|
||||||
if (rc < 0) {
|
|
||||||
ITTI_DUMP_ERROR(" ioctl FIONBIO (non-blocking) failed (%d:%s)\n", errno, strerror(errno));
|
|
||||||
close(itti_listen_socket);
|
|
||||||
pthread_exit(NULL);
|
|
||||||
}
|
|
||||||
|
|
||||||
memset(&servaddr, 0, sizeof(servaddr));
|
|
||||||
servaddr.sin_family = AF_INET;
|
|
||||||
servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
|
|
||||||
servaddr.sin_port = htons(ITTI_PORT);
|
|
||||||
|
|
||||||
if (bind(itti_listen_socket, (struct sockaddr *) &servaddr,
|
|
||||||
sizeof(servaddr)) < 0) {
|
|
||||||
ITTI_DUMP_ERROR(" Bind failed (%d:%s)\n", errno, strerror(errno));
|
|
||||||
pthread_exit(NULL);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (listen(itti_listen_socket, 5) < 0) {
|
|
||||||
ITTI_DUMP_ERROR(" Listen failed (%d:%s)\n", errno, strerror(errno));
|
|
||||||
pthread_exit(NULL);
|
|
||||||
}
|
|
||||||
|
|
||||||
FD_ZERO(&read_set);
|
|
||||||
|
|
||||||
/* Add the listener */
|
|
||||||
FD_SET(itti_listen_socket, &read_set);
|
|
||||||
|
|
||||||
/* Add the event fd */
|
|
||||||
FD_SET(itti_dump_queue.event_fd, &read_set);
|
|
||||||
|
|
||||||
/* Max of both sd */
|
|
||||||
max_sd = itti_listen_socket > itti_dump_queue.event_fd ? itti_listen_socket : itti_dump_queue.event_fd;
|
|
||||||
|
|
||||||
itti_dump_queue.itti_listen_socket = itti_listen_socket;
|
|
||||||
|
|
||||||
/* Loop waiting for incoming connects or for incoming data
|
|
||||||
* on any of the connected sockets.
|
|
||||||
*/
|
|
||||||
while (1) {
|
|
||||||
int desc_ready;
|
|
||||||
int client_socket = -1;
|
|
||||||
int i;
|
|
||||||
|
|
||||||
memcpy(&working_set, &read_set, sizeof(read_set));
|
|
||||||
timeout_p = NULL;
|
|
||||||
|
|
||||||
/* No timeout: select blocks till a new event has to be handled
|
|
||||||
* on sd's.
|
|
||||||
*/
|
|
||||||
rc = select(max_sd + 1, &working_set, NULL, NULL, timeout_p);
|
|
||||||
|
|
||||||
if (rc < 0) {
|
|
||||||
ITTI_DUMP_ERROR(" select failed (%d:%s)\n", errno, strerror(errno));
|
|
||||||
pthread_exit(NULL);
|
|
||||||
} else if (rc == 0) {
|
|
||||||
/* Timeout */
|
|
||||||
if (itti_dump_flush_ring_buffer(1) == 0) {
|
|
||||||
if (itti_dump_running) {
|
|
||||||
ITTI_DUMP_DEBUG (0x4, " No messages consumers, waiting ...\n");
|
|
||||||
usleep(100 * 1000);
|
|
||||||
} else {
|
|
||||||
itti_dump_socket_exit();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
desc_ready = rc;
|
|
||||||
|
|
||||||
for (i = 0; i <= max_sd && desc_ready > 0; i++) {
|
|
||||||
if (FD_ISSET(i, &working_set)) {
|
|
||||||
desc_ready -= 1;
|
|
||||||
|
|
||||||
if (i == itti_dump_queue.event_fd) {
|
|
||||||
/* Notification of new element to dump from other tasks */
|
|
||||||
eventfd_t sem_counter;
|
|
||||||
ssize_t read_ret;
|
|
||||||
|
|
||||||
/* Read will always return 1 for kernel versions > 2.6.30 */
|
|
||||||
read_ret = read (itti_dump_queue.event_fd, &sem_counter, sizeof(sem_counter));
|
|
||||||
|
|
||||||
if (read_ret < 0) {
|
|
||||||
ITTI_DUMP_ERROR(" Failed read for semaphore: %s\n", strerror(errno));
|
|
||||||
pthread_exit(NULL);
|
|
||||||
}
|
|
||||||
|
|
||||||
AssertFatal (read_ret == sizeof(sem_counter), "Failed to read from dump event FD (%d/%d)!\n", (int) read_ret, (int) sizeof(sem_counter));
|
|
||||||
|
|
||||||
if (itti_dump_flush_ring_buffer(0) == 0) {
|
|
||||||
if (itti_dump_running) {
|
|
||||||
ITTI_DUMP_DEBUG (0x4, " No messages consumers, waiting ...\n");
|
|
||||||
usleep(100 * 1000);
|
|
||||||
{
|
|
||||||
ssize_t write_ret;
|
|
||||||
|
|
||||||
sem_counter = 1;
|
|
||||||
/* Call to write for an event fd must be of 8 bytes */
|
|
||||||
write_ret = write(itti_dump_queue.event_fd, &sem_counter, sizeof(sem_counter));
|
|
||||||
AssertFatal (write_ret == sizeof(sem_counter), "Failed to write to dump event FD (%d/%d)!\n", (int) write_ret, (int) sem_counter);
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
itti_dump_socket_exit();
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
ITTI_DUMP_DEBUG(0x1, " Write element to file\n");
|
|
||||||
}
|
|
||||||
} else
|
|
||||||
if (i == itti_listen_socket) {
|
|
||||||
do {
|
|
||||||
client_socket = accept(itti_listen_socket, NULL, NULL);
|
|
||||||
|
|
||||||
if (client_socket < 0) {
|
|
||||||
if (errno == EWOULDBLOCK || errno == EAGAIN) {
|
|
||||||
/* No more new connection */
|
|
||||||
ITTI_DUMP_DEBUG(0x2, " No more new connection\n");
|
|
||||||
continue;
|
|
||||||
} else {
|
|
||||||
ITTI_DUMP_ERROR(" accept failed (%d:%s)\n", errno, strerror(errno));
|
|
||||||
pthread_exit(NULL);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (itti_dump_handle_new_connection(client_socket, message_definition_xml,
|
|
||||||
message_definition_xml_length) == 0) {
|
|
||||||
/* The socket has been accepted.
|
|
||||||
* We have to update the set to include this new sd.
|
|
||||||
*/
|
|
||||||
FD_SET(client_socket, &read_set);
|
|
||||||
|
|
||||||
if (client_socket > max_sd)
|
|
||||||
max_sd = client_socket;
|
|
||||||
}
|
|
||||||
} while(client_socket != -1);
|
|
||||||
} else {
|
|
||||||
/* For now the MME itti dumper should not receive data
|
|
||||||
* other than connection oriented (CLOSE).
|
|
||||||
*/
|
|
||||||
uint8_t j;
|
|
||||||
|
|
||||||
ITTI_DUMP_DEBUG(0x2, " Socket %d disconnected\n", i);
|
|
||||||
|
|
||||||
/* Close the socket and update info related to this connection */
|
|
||||||
close(i);
|
|
||||||
|
|
||||||
for (j = 0; j < ITTI_DUMP_MAX_CON; j++) {
|
|
||||||
if (itti_dump_queue.itti_clients[j].sd == i)
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* In case we don't find the matching sd in list of known
|
|
||||||
* connections -> assert.
|
|
||||||
*/
|
|
||||||
AssertFatal (j < ITTI_DUMP_MAX_CON, "Connection index not found (%d/%d) for socked %d!\n", j, ITTI_DUMP_MAX_CON, i);
|
|
||||||
|
|
||||||
/* Re-initialize the socket to -1 so we can accept new
|
|
||||||
* incoming connections.
|
|
||||||
*/
|
|
||||||
itti_dump_queue.itti_clients[j].sd = -1;
|
|
||||||
itti_dump_queue.itti_clients[j].last_message_number = 0;
|
|
||||||
itti_dump_queue.nb_connected--;
|
|
||||||
|
|
||||||
/* Remove the socket from the FD set and update the max sd */
|
|
||||||
FD_CLR(i, &read_set);
|
|
||||||
|
|
||||||
if (i == max_sd) {
|
|
||||||
if (itti_dump_queue.nb_connected == 0) {
|
|
||||||
/* No more new connection max_sd = itti_listen_socket */
|
|
||||||
max_sd = itti_listen_socket;
|
|
||||||
} else {
|
|
||||||
while (FD_ISSET(max_sd, &read_set) == 0) {
|
|
||||||
max_sd -= 1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*------------------------------------------------------------------------------*/
|
|
||||||
int itti_dump_queue_message(task_id_t sender_task,
|
|
||||||
message_number_t message_number,
|
|
||||||
MessageDef *message_p,
|
|
||||||
const char *message_name,
|
|
||||||
const uint32_t message_size)
|
|
||||||
{
|
|
||||||
if (itti_dump_running) {
|
|
||||||
itti_dump_queue_item_t *new;
|
|
||||||
|
|
||||||
AssertFatal (message_name != NULL, "Message name is NULL!\n");
|
|
||||||
AssertFatal (message_p != NULL, "Message is NULL!\n");
|
|
||||||
|
|
||||||
new = itti_malloc(sender_task, TASK_MAX, sizeof(itti_dump_queue_item_t));
|
|
||||||
|
|
||||||
new->data = itti_malloc(sender_task, TASK_MAX, message_size);
|
|
||||||
|
|
||||||
memcpy(new->data, message_p, message_size);
|
|
||||||
new->data_size = message_size;
|
|
||||||
new->message_number = message_number;
|
|
||||||
|
|
||||||
itti_dump_enqueue_message(new, message_size, ITTI_DUMP_MESSAGE_TYPE);
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* This function should be called by each thread that will use the ring buffer */
|
|
||||||
void itti_dump_thread_use_ring_buffer(void)
|
|
||||||
{
|
|
||||||
lfds611_ringbuffer_use(itti_dump_queue.itti_message_queue);
|
|
||||||
}
|
|
||||||
|
|
||||||
int itti_dump_init(const char * const messages_definition_xml, const char * const dump_file_name)
|
|
||||||
{
|
|
||||||
int i, ret;
|
|
||||||
struct sched_param scheduler_param;
|
|
||||||
|
|
||||||
scheduler_param.sched_priority = sched_get_priority_min(SCHED_FIFO) + 1;
|
|
||||||
|
|
||||||
if (dump_file_name != NULL) {
|
|
||||||
dump_file = fopen(dump_file_name, "wb");
|
|
||||||
|
|
||||||
if (dump_file == NULL) {
|
|
||||||
ITTI_DUMP_ERROR(" can not open dump file \"%s\" (%d:%s)\n", dump_file_name, errno, strerror(errno));
|
|
||||||
} else {
|
|
||||||
/* Output the XML to file */
|
|
||||||
uint32_t message_size = strlen(messages_definition_xml) + 1;
|
|
||||||
itti_socket_header_t header;
|
|
||||||
|
|
||||||
header.message_size = sizeof(itti_socket_header_t) + message_size + sizeof(itti_message_types_t);
|
|
||||||
header.message_type = ITTI_DUMP_XML_DEFINITION;
|
|
||||||
|
|
||||||
fwrite (&header, sizeof(itti_socket_header_t), 1, dump_file);
|
|
||||||
fwrite (messages_definition_xml, message_size, 1, dump_file);
|
|
||||||
fwrite (&itti_dump_xml_definition_end, sizeof(itti_message_types_t), 1, dump_file);
|
|
||||||
fflush (dump_file);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
memset(&itti_dump_queue, 0, sizeof(itti_desc_t));
|
|
||||||
|
|
||||||
ITTI_DUMP_DEBUG(0x2, " Creating new ring buffer for itti dump of %u elements\n",
|
|
||||||
ITTI_QUEUE_MAX_ELEMENTS);
|
|
||||||
|
|
||||||
if (lfds611_ringbuffer_new(&itti_dump_queue.itti_message_queue,
|
|
||||||
ITTI_QUEUE_MAX_ELEMENTS,
|
|
||||||
NULL,
|
|
||||||
NULL) != 1) {
|
|
||||||
/* Always assert on this condition */
|
|
||||||
AssertFatal (0, " Failed to create ring buffer!\n");
|
|
||||||
}
|
|
||||||
|
|
||||||
itti_dump_queue.event_fd = eventfd(0, EFD_SEMAPHORE);
|
|
||||||
|
|
||||||
if (itti_dump_queue.event_fd == -1) {
|
|
||||||
/* Always assert on this condition */
|
|
||||||
AssertFatal (0, "eventfd failed: %s!\n", strerror(errno));
|
|
||||||
}
|
|
||||||
|
|
||||||
itti_dump_queue.nb_connected = 0;
|
|
||||||
|
|
||||||
for(i = 0; i < ITTI_DUMP_MAX_CON; i++) {
|
|
||||||
itti_dump_queue.itti_clients[i].sd = -1;
|
|
||||||
itti_dump_queue.itti_clients[i].last_message_number = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* initialized with default attributes */
|
|
||||||
ret = pthread_attr_init(&itti_dump_queue.attr);
|
|
||||||
|
|
||||||
if (ret < 0) {
|
|
||||||
AssertFatal (0, "pthread_attr_init failed (%d:%s)!\n", errno, strerror(errno));
|
|
||||||
}
|
|
||||||
|
|
||||||
ret = pthread_attr_setschedpolicy(&itti_dump_queue.attr, SCHED_FIFO);
|
|
||||||
|
|
||||||
if (ret < 0) {
|
|
||||||
AssertFatal (0, "pthread_attr_setschedpolicy (SCHED_IDLE) failed (%d:%s)!\n", errno, strerror(errno));
|
|
||||||
}
|
|
||||||
|
|
||||||
ret = pthread_attr_setschedparam(&itti_dump_queue.attr, &scheduler_param);
|
|
||||||
|
|
||||||
if (ret < 0) {
|
|
||||||
AssertFatal (0, "pthread_attr_setschedparam failed (%d:%s)!\n", errno, strerror(errno));
|
|
||||||
}
|
|
||||||
|
|
||||||
ret = pthread_create(&itti_dump_queue.itti_acceptor_thread, &itti_dump_queue.attr,
|
|
||||||
&itti_dump_socket, (void *)messages_definition_xml);
|
|
||||||
|
|
||||||
if (ret < 0) {
|
|
||||||
AssertFatal (0, "pthread_create failed (%d:%s)!\n", errno, strerror(errno));
|
|
||||||
}
|
|
||||||
|
|
||||||
pthread_setname_np( itti_dump_queue.itti_acceptor_thread, "ITTI acceptor" );
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
void itti_dump_exit(void)
|
|
||||||
{
|
|
||||||
void *arg;
|
|
||||||
itti_dump_queue_item_t *new;
|
|
||||||
|
|
||||||
new = itti_malloc(TASK_UNKNOWN, TASK_UNKNOWN, sizeof(itti_dump_queue_item_t));
|
|
||||||
memset(new, 0, sizeof(itti_dump_queue_item_t));
|
|
||||||
|
|
||||||
/* Set a flag to stop recording message */
|
|
||||||
itti_dump_running = 0;
|
|
||||||
|
|
||||||
/* Send the exit signal to other thread */
|
|
||||||
itti_dump_enqueue_message(new, 0, ITTI_DUMP_EXIT_SIGNAL);
|
|
||||||
|
|
||||||
ITTI_DUMP_DEBUG(0x2, " waiting for dumper thread to finish\n");
|
|
||||||
|
|
||||||
/* wait for the thread to terminate */
|
|
||||||
pthread_join(itti_dump_queue.itti_acceptor_thread, &arg);
|
|
||||||
|
|
||||||
ITTI_DUMP_DEBUG(0x2, " dumper thread correctly exited\n");
|
|
||||||
|
|
||||||
if (dump_file != NULL) {
|
|
||||||
/* Synchronise file and then close it */
|
|
||||||
fclose(dump_file);
|
|
||||||
dump_file = NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (itti_dump_queue.itti_message_queue) {
|
|
||||||
lfds611_ringbuffer_delete(itti_dump_queue.itti_message_queue,
|
|
||||||
itti_dump_user_data_delete_function, NULL);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -41,10 +41,6 @@
|
|||||||
|
|
||||||
#ifndef CHECK_PROTOTYPE_ONLY
|
#ifndef CHECK_PROTOTYPE_ONLY
|
||||||
|
|
||||||
const char * const messages_definition_xml = {
|
|
||||||
#include "messages_xml.h"
|
|
||||||
};
|
|
||||||
|
|
||||||
/* Map task id to printable name. */
|
/* Map task id to printable name. */
|
||||||
const task_info_t tasks_info[] = {
|
const task_info_t tasks_info[] = {
|
||||||
{0, TASK_UNKNOWN, 0, 0, "TASK_UNKNOWN"},
|
{0, TASK_UNKNOWN, 0, 0, "TASK_UNKNOWN"},
|
||||||
@@ -71,8 +67,7 @@ const message_info_t messages_info[] = {
|
|||||||
* \param messages_info Pointer on messages 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,
|
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, const char * const messages_definition_xml,
|
const message_info_t *messages_info);
|
||||||
const char * const dump_file_name);
|
|
||||||
|
|
||||||
#endif /* INTERTASK_INTERFACE_INIT_H_ */
|
#endif /* INTERTASK_INTERFACE_INIT_H_ */
|
||||||
/* @} */
|
/* @} */
|
||||||
|
|||||||
@@ -42,8 +42,8 @@
|
|||||||
#include "log.h"
|
#include "log.h"
|
||||||
|
|
||||||
#if defined (LOG_D) && defined (LOG_E)
|
#if defined (LOG_D) && defined (LOG_E)
|
||||||
# define SIG_DEBUG(x, args...) LOG_D(SIM, x, ##args)
|
# define SIG_DEBUG(x, args...) LOG_D(RRC, x, ##args)
|
||||||
# define SIG_ERROR(x, args...) LOG_E(SIM, x, ##args)
|
# define SIG_ERROR(x, args...) LOG_E(RRC, x, ##args)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifndef SIG_DEBUG
|
#ifndef SIG_DEBUG
|
||||||
|
|||||||
@@ -740,25 +740,6 @@ int xml_parse_buffer(char *xml_buffer, const int size) {
|
|||||||
return xml_parse_doc(doc);
|
return xml_parse_doc(doc);
|
||||||
}
|
}
|
||||||
|
|
||||||
#if 0 /* Not used anymore */
|
|
||||||
int xml_parse_file(const char *filename) {
|
|
||||||
xmlDocPtr doc; /* the resulting document tree */
|
|
||||||
|
|
||||||
if (filename == NULL) {
|
|
||||||
return RC_NULL_POINTER;
|
|
||||||
}
|
|
||||||
|
|
||||||
doc = xmlReadFile (filename, NULL, 0);
|
|
||||||
|
|
||||||
if (doc == NULL) {
|
|
||||||
ui_notification_dialog(GTK_MESSAGE_ERROR, FALSE, "parse messages format definition", "Failed to parse file \"%s\"", filename);
|
|
||||||
return RC_FAIL;
|
|
||||||
}
|
|
||||||
|
|
||||||
return xml_parse_doc(doc);
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
static int update_filters() {
|
static int update_filters() {
|
||||||
types_t *types;
|
types_t *types;
|
||||||
|
|
||||||
|
|||||||
@@ -32,7 +32,7 @@
|
|||||||
|
|
||||||
#ifdef TELNETSRV_LOADER_MAIN
|
#ifdef TELNETSRV_LOADER_MAIN
|
||||||
|
|
||||||
#include "UTIL/LOG/log.h"
|
#include "common/utils/LOG/log.h"
|
||||||
|
|
||||||
|
|
||||||
#include "common/utils/load_module_shlib.h"
|
#include "common/utils/load_module_shlib.h"
|
||||||
|
|||||||
@@ -32,10 +32,10 @@
|
|||||||
|
|
||||||
#ifdef TELNETSRV_PHYCMD_MAIN
|
#ifdef TELNETSRV_PHYCMD_MAIN
|
||||||
|
|
||||||
#include "UTIL/LOG/log.h"
|
#include "common/utils/LOG/log.h"
|
||||||
|
|
||||||
|
|
||||||
#include "openair1/PHY/extern.h"
|
#include "openair1/PHY/phy_extern.h"
|
||||||
|
|
||||||
|
|
||||||
#define TELNETVAR_PHYCC0 0
|
#define TELNETVAR_PHYCC0 0
|
||||||
|
|||||||
@@ -52,10 +52,9 @@
|
|||||||
#define TELNETSERVERCODE
|
#define TELNETSERVERCODE
|
||||||
#include "telnetsrv.h"
|
#include "telnetsrv.h"
|
||||||
#define TELNETSRV_PROCCMD_MAIN
|
#define TELNETSRV_PROCCMD_MAIN
|
||||||
#include "log.h"
|
#include "common/utils/LOG/log.h"
|
||||||
#include "log_extern.h"
|
|
||||||
#include "common/config/config_userapi.h"
|
#include "common/config/config_userapi.h"
|
||||||
#include "openair1/PHY/extern.h"
|
#include "openair1/PHY/phy_extern.h"
|
||||||
#include "telnetsrv_proccmd.h"
|
#include "telnetsrv_proccmd.h"
|
||||||
|
|
||||||
void decode_procstat(char *record, int debug, telnet_printfunc_t prnt)
|
void decode_procstat(char *record, int debug, telnet_printfunc_t prnt)
|
||||||
@@ -193,7 +192,6 @@ struct dirent *entry;
|
|||||||
|
|
||||||
int proccmd_show(char *buf, int debug, telnet_printfunc_t prnt)
|
int proccmd_show(char *buf, int debug, telnet_printfunc_t prnt)
|
||||||
{
|
{
|
||||||
extern log_t *g_log;
|
|
||||||
|
|
||||||
if (debug > 0)
|
if (debug > 0)
|
||||||
prnt(" proccmd_show received %s\n",buf);
|
prnt(" proccmd_show received %s\n",buf);
|
||||||
@@ -201,12 +199,28 @@ extern log_t *g_log;
|
|||||||
print_threads(buf,debug,prnt);
|
print_threads(buf,debug,prnt);
|
||||||
}
|
}
|
||||||
if (strcasestr(buf,"loglvl") != NULL) {
|
if (strcasestr(buf,"loglvl") != NULL) {
|
||||||
prnt("component verbosity level enabled\n");
|
prnt(" component level enabled\n");
|
||||||
for (int i=MIN_LOG_COMPONENTS; i < MAX_LOG_COMPONENTS; i++) {
|
for (int i=MIN_LOG_COMPONENTS; i < MAX_LOG_COMPONENTS; i++) {
|
||||||
prnt("%02i %17.17s:%10.10s%10.10s %s\n",i ,g_log->log_component[i].name,
|
if (g_log->log_component[i].name != NULL) {
|
||||||
map_int_to_str(log_verbosity_names,g_log->log_component[i].flag),
|
prnt("%02i %17.17s:%10.10s %s\n",i ,g_log->log_component[i].name,
|
||||||
map_int_to_str(log_level_names,g_log->log_component[i].level),
|
map_int_to_str(log_level_names,g_log->log_component[i].level),
|
||||||
((g_log->log_component[i].interval>0)?"Y":"N") );
|
((g_log->log_component[i].interval>0)?"Y":"N") );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (strcasestr(buf,"logopt") != NULL) {
|
||||||
|
prnt(" option enabled\n");
|
||||||
|
for (int i=0; log_options[i].name != NULL; i++) {
|
||||||
|
prnt("%02i %17.17s %10.10s \n",i ,log_options[i].name,
|
||||||
|
((g_log->flag & log_options[i].value)?"Y":"N") );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (strcasestr(buf,"dbgopt") != NULL) {
|
||||||
|
prnt(" option debug matlab\n");
|
||||||
|
for (int i=0; log_maskmap[i].name != NULL ; i++) {
|
||||||
|
prnt("%02i %17.17s %5.5s %5.5s\n",i ,log_maskmap[i].name,
|
||||||
|
((g_log->debug_mask & log_maskmap[i].value)?"Y":"N"),
|
||||||
|
((g_log->matlab_mask & log_maskmap[i].value)?"Y":"N") );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (strcasestr(buf,"config") != NULL) {
|
if (strcasestr(buf,"config") != NULL) {
|
||||||
@@ -323,24 +337,76 @@ int s = sscanf(buf,"%ms %i-%i\n",&logsubcmd, &idx1,&idx2);
|
|||||||
prnt("Available log levels: \n ");
|
prnt("Available log levels: \n ");
|
||||||
for (int i=0; log_level_names[i].name != NULL; i++)
|
for (int i=0; log_level_names[i].name != NULL; i++)
|
||||||
prnt("%s ",log_level_names[i].name);
|
prnt("%s ",log_level_names[i].name);
|
||||||
prnt("\nAvailable verbosity: \n ");
|
prnt("\n");
|
||||||
for (int i=0; log_verbosity_names[i].name != NULL; i++)
|
prnt("Available display options: \n ");
|
||||||
prnt("%s ",log_verbosity_names[i].name);
|
for (int i=0; log_options[i].name != NULL; i++)
|
||||||
|
prnt("%s ",log_options[i].name);
|
||||||
|
prnt("\n");
|
||||||
|
prnt("Available debug or matlab options: \n ");
|
||||||
|
for (int i=0; log_maskmap[i].name != NULL; i++)
|
||||||
|
prnt("%s ",log_maskmap[i].name);
|
||||||
prnt("\n");
|
prnt("\n");
|
||||||
proccmd_show("loglvl",debug,prnt);
|
proccmd_show("loglvl",debug,prnt);
|
||||||
|
proccmd_show("logopt",debug,prnt);
|
||||||
|
proccmd_show("dbgopt",debug,prnt);
|
||||||
}
|
}
|
||||||
else if (strcasestr(logsubcmd,"help") != NULL) {
|
else if (strcasestr(logsubcmd,"help") != NULL) {
|
||||||
prnt(PROCCMD_LOG_HELP_STRING);
|
prnt(PROCCMD_LOG_HELP_STRING);
|
||||||
} else {
|
} else {
|
||||||
prnt("%s: wrong log command...\n",logsubcmd);
|
prnt("%s: wrong log command...\n",logsubcmd);
|
||||||
}
|
}
|
||||||
|
} else if ( s == 2 && logsubcmd != NULL) {
|
||||||
|
char *opt=NULL;
|
||||||
|
char *logparam=NULL;
|
||||||
|
int l;
|
||||||
|
int optbit;
|
||||||
|
|
||||||
|
l=sscanf(logsubcmd,"%m[^'_']_%ms",&logparam,&opt);
|
||||||
|
if (l == 2 && strcmp(logparam,"print") == 0){
|
||||||
|
optbit=map_str_to_int(log_options,opt);
|
||||||
|
if (optbit < 0) {
|
||||||
|
prnt("option %s unknown\n",opt);
|
||||||
|
} else {
|
||||||
|
if (idx1 > 0)
|
||||||
|
SET_LOG_OPTION(optbit);
|
||||||
|
else
|
||||||
|
CLEAR_LOG_OPTION(optbit);
|
||||||
|
proccmd_show("logopt",debug,prnt);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (l == 2 && strcmp(logparam,"debug") == 0){
|
||||||
|
optbit=map_str_to_int(log_maskmap,opt);
|
||||||
|
if (optbit < 0) {
|
||||||
|
prnt("debug flag %s unknown\n",opt);
|
||||||
|
} else {
|
||||||
|
if (idx1 > 0)
|
||||||
|
SET_LOG_DEBUG(optbit);
|
||||||
|
else
|
||||||
|
CLEAR_LOG_DEBUG(optbit);
|
||||||
|
proccmd_show("dbgopt",debug,prnt);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (l == 2 && strcmp(logparam,"matlab") == 0){
|
||||||
|
optbit=map_str_to_int(log_maskmap,opt);
|
||||||
|
if (optbit < 0) {
|
||||||
|
prnt("matlab flag %s unknown\n",opt);
|
||||||
|
} else {
|
||||||
|
if (idx1 > 0)
|
||||||
|
SET_LOG_MATLAB(optbit);
|
||||||
|
else
|
||||||
|
CLEAR_LOG_MATLAB(optbit);
|
||||||
|
proccmd_show("dbgopt",debug,prnt);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (logparam != NULL) free(logparam);
|
||||||
|
if (opt != NULL) free(opt);
|
||||||
} else if ( s == 3 && logsubcmd != NULL) {
|
} else if ( s == 3 && logsubcmd != NULL) {
|
||||||
int level, verbosity, interval;
|
int level, interval;
|
||||||
char *tmpstr=NULL;
|
char *tmpstr=NULL;
|
||||||
char *logparam=NULL;
|
char *logparam=NULL;
|
||||||
int l;
|
int l;
|
||||||
|
|
||||||
level = verbosity = interval = -1;
|
level = interval = -1;
|
||||||
l=sscanf(logsubcmd,"%m[^'_']_%m[^'_']",&logparam,&tmpstr);
|
l=sscanf(logsubcmd,"%m[^'_']_%m[^'_']",&logparam,&tmpstr);
|
||||||
if (debug > 0)
|
if (debug > 0)
|
||||||
prnt("l=%i, %s %s\n",l,((logparam==NULL)?"\"\"":logparam), ((tmpstr==NULL)?"\"\"":tmpstr));
|
prnt("l=%i, %s %s\n",l,((logparam==NULL)?"\"\"":logparam), ((tmpstr==NULL)?"\"\"":tmpstr));
|
||||||
@@ -348,9 +414,6 @@ int s = sscanf(buf,"%ms %i-%i\n",&logsubcmd, &idx1,&idx2);
|
|||||||
if (strcmp(logparam,"level") == 0) {
|
if (strcmp(logparam,"level") == 0) {
|
||||||
level=map_str_to_int(log_level_names,tmpstr);
|
level=map_str_to_int(log_level_names,tmpstr);
|
||||||
if (level < 0) prnt("level %s unknown\n",tmpstr);
|
if (level < 0) prnt("level %s unknown\n",tmpstr);
|
||||||
} else if (strcmp(logparam,"verbos") == 0) {
|
|
||||||
verbosity=map_str_to_int(log_verbosity_names,tmpstr);
|
|
||||||
if (verbosity < 0) prnt("verbosity %s unknown\n",tmpstr);
|
|
||||||
} else {
|
} else {
|
||||||
prnt("%s%s unknown log sub command \n",logparam, tmpstr);
|
prnt("%s%s unknown log sub command \n",logparam, tmpstr);
|
||||||
}
|
}
|
||||||
@@ -368,11 +431,16 @@ int s = sscanf(buf,"%ms %i-%i\n",&logsubcmd, &idx1,&idx2);
|
|||||||
if (logparam != NULL) free(logparam);
|
if (logparam != NULL) free(logparam);
|
||||||
if (tmpstr != NULL) free(tmpstr);
|
if (tmpstr != NULL) free(tmpstr);
|
||||||
for (int i=idx1; i<=idx2 ; i++) {
|
for (int i=idx1; i<=idx2 ; i++) {
|
||||||
set_comp_log(i, level, verbosity, interval);
|
if (level < 0) {
|
||||||
prnt("log level/verbosity comp %i %s set to %s / %s (%s)\n",
|
level=g_log->log_component[i].level;
|
||||||
|
}
|
||||||
|
if (interval < 0) {
|
||||||
|
interval=g_log->log_component[i].interval;
|
||||||
|
}
|
||||||
|
set_log(i, level, interval);
|
||||||
|
prnt("log level comp %i %s set to %s (%s)\n",
|
||||||
i,((g_log->log_component[i].name==NULL)?"":g_log->log_component[i].name),
|
i,((g_log->log_component[i].name==NULL)?"":g_log->log_component[i].name),
|
||||||
map_int_to_str(log_level_names,g_log->log_component[i].level),
|
map_int_to_str(log_level_names,g_log->log_component[i].level),
|
||||||
map_int_to_str(log_verbosity_names,g_log->log_component[i].flag),
|
|
||||||
((g_log->log_component[i].interval>0)?"enabled":"disabled"));
|
((g_log->log_component[i].interval>0)?"enabled":"disabled"));
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -49,9 +49,12 @@ telnetshell_vardef_t proc_vardef[] = {
|
|||||||
online, noonline: enable or disable console logs \n\
|
online, noonline: enable or disable console logs \n\
|
||||||
enable, disable id1-id2: enable or disable logs for components index id1 to id2 \n\
|
enable, disable id1-id2: enable or disable logs for components index id1 to id2 \n\
|
||||||
level_<level> id1-id2: set log level to <level> for components index id1 to id2 \n\
|
level_<level> id1-id2: set log level to <level> for components index id1 to id2 \n\
|
||||||
level_<verbosity> id1-id2: set log verbosity to <verbosity> for components index id1 to id2 \n\
|
use the show command to get the authorized values for <level> and the list of component \
|
||||||
use the show command to get the values for <level>, <verbosity> and the list of component indexes \
|
indexes that can be used for id1 and id2 \n\
|
||||||
that can be used for id1 and id2 \n"
|
print_<opt> <0|1> disable or enable the \"opt\" log option, use the show command to get \
|
||||||
|
the available options\n\
|
||||||
|
matlab_<opt> debug_<func> disable or enable the debug code or matlab file generation \
|
||||||
|
for \"func\" function. use the show command to get the available options\n"
|
||||||
|
|
||||||
#define PROCCMD_THREAD_HELP_STRING " thread sub commands: \n\
|
#define PROCCMD_THREAD_HELP_STRING " thread sub commands: \n\
|
||||||
<thread id> aff <core> : set affinity of thread <thread id> to core <core> \n\
|
<thread id> aff <core> : set affinity of thread <thread id> to core <core> \n\
|
||||||
|
|||||||
@@ -47,7 +47,7 @@ extern RAN_CONTEXT_t RC;
|
|||||||
#include <vendor_ext.h>
|
#include <vendor_ext.h>
|
||||||
#include "fapi_stub.h"
|
#include "fapi_stub.h"
|
||||||
//#include "fapi_l1.h"
|
//#include "fapi_l1.h"
|
||||||
#include "UTIL/LOG/log.h"
|
#include "common/utils/LOG/log.h"
|
||||||
#include "openair2/LAYER2/MAC/mac_proto.h"
|
#include "openair2/LAYER2/MAC/mac_proto.h"
|
||||||
|
|
||||||
#include "PHY/INIT/phy_init.h"
|
#include "PHY/INIT/phy_init.h"
|
||||||
@@ -193,26 +193,25 @@ typedef struct {
|
|||||||
static pnf_info pnf;
|
static pnf_info pnf;
|
||||||
static pthread_t pnf_start_pthread;
|
static pthread_t pnf_start_pthread;
|
||||||
|
|
||||||
extern void nfapi_log(char *file, char *func, int line, int comp, int level, const char* format, va_list args);
|
int nfapitooai_level(int nfapi_level) {
|
||||||
|
switch(nfapi_level) {
|
||||||
|
case NFAPI_TRACE_ERROR:
|
||||||
|
return LOG_ERR;
|
||||||
|
case NFAPI_TRACE_WARN:
|
||||||
|
return LOG_WARNING;
|
||||||
|
case NFAPI_TRACE_NOTE:
|
||||||
|
return LOG_INFO;
|
||||||
|
case NFAPI_TRACE_INFO:
|
||||||
|
return LOG_DEBUG;
|
||||||
|
}
|
||||||
|
return LOG_ERR;
|
||||||
|
}
|
||||||
|
|
||||||
void pnf_nfapi_trace(nfapi_trace_level_t nfapi_level, const char* message, ...) {
|
void pnf_nfapi_trace(nfapi_trace_level_t nfapi_level, const char* message, ...) {
|
||||||
va_list args;
|
va_list args;
|
||||||
int oai_level;
|
|
||||||
|
|
||||||
if (nfapi_level==NFAPI_TRACE_ERROR) {
|
|
||||||
oai_level = LOG_ERR;
|
|
||||||
} else if (nfapi_level==NFAPI_TRACE_WARN) {
|
|
||||||
oai_level = LOG_WARNING;
|
|
||||||
} else if (nfapi_level==NFAPI_TRACE_NOTE) {
|
|
||||||
oai_level = LOG_INFO;
|
|
||||||
} else if (nfapi_level==NFAPI_TRACE_INFO) {
|
|
||||||
oai_level = LOG_DEBUG;
|
|
||||||
} else {
|
|
||||||
oai_level = LOG_ERR;
|
|
||||||
}
|
|
||||||
|
|
||||||
va_start(args, message);
|
va_start(args, message);
|
||||||
nfapi_log("FILE>", "FUNC", 999, PHY, oai_level, message, args);
|
nfapi_log("FILE>", "FUNC", 999, PHY, nfapitooai_level(nfapi_level), message, args);
|
||||||
va_end(args);
|
va_end(args);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -516,7 +515,7 @@ int config_request(nfapi_pnf_config_t* config, nfapi_pnf_phy_config_t* phy, nfap
|
|||||||
uint8_t num_tlv = 0;
|
uint8_t num_tlv = 0;
|
||||||
//struct PHY_VARS_eNB_s *eNB = RC.eNB[0][0];
|
//struct PHY_VARS_eNB_s *eNB = RC.eNB[0][0];
|
||||||
|
|
||||||
// Panos: In the case of nfapi_mode = 3 (UE = PNF) we should not have dependency on any eNB var. So we aim
|
// In the case of nfapi_mode = 3 (UE = PNF) we should not have dependency on any eNB var. So we aim
|
||||||
// to keep only the necessary just to keep the nfapi FSM rolling by sending a dummy response.
|
// to keep only the necessary just to keep the nfapi FSM rolling by sending a dummy response.
|
||||||
LTE_DL_FRAME_PARMS *fp;
|
LTE_DL_FRAME_PARMS *fp;
|
||||||
if (nfapi_mode!=3) {
|
if (nfapi_mode!=3) {
|
||||||
@@ -527,18 +526,6 @@ int config_request(nfapi_pnf_config_t* config, nfapi_pnf_phy_config_t* phy, nfap
|
|||||||
fp = (LTE_DL_FRAME_PARMS*) malloc(sizeof(LTE_DL_FRAME_PARMS));
|
fp = (LTE_DL_FRAME_PARMS*) malloc(sizeof(LTE_DL_FRAME_PARMS));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
#if 0
|
|
||||||
//DJP
|
|
||||||
auto found = std::find_if(pnf->phys.begin(), pnf->phys.end(), [&](phy_info& item)
|
|
||||||
{ return item.id == req->header.phy_id; });
|
|
||||||
|
|
||||||
if(found != pnf->phys.end())
|
|
||||||
{
|
|
||||||
phy_info& phy_info = (*found);
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
//DJP
|
|
||||||
phy_info* phy_info = pnf->phys;
|
phy_info* phy_info = pnf->phys;
|
||||||
|
|
||||||
if(req->nfapi_config.timing_window.tl.tag == NFAPI_NFAPI_TIMING_WINDOW_TAG) {
|
if(req->nfapi_config.timing_window.tl.tag == NFAPI_NFAPI_TIMING_WINDOW_TAG) {
|
||||||
@@ -871,7 +858,11 @@ int pnf_phy_dl_config_req(nfapi_pnf_p7_config_t* pnf_p7, nfapi_dl_config_request
|
|||||||
AssertFatal(UE_id<NUMBER_OF_UE_MAX,"returned UE_id %d >= %d(NUMBER_OF_UE_MAX)\n",UE_id,NUMBER_OF_UE_MAX);
|
AssertFatal(UE_id<NUMBER_OF_UE_MAX,"returned UE_id %d >= %d(NUMBER_OF_UE_MAX)\n",UE_id,NUMBER_OF_UE_MAX);
|
||||||
LTE_eNB_DLSCH_t *dlsch0 = eNB->dlsch[UE_id][0];
|
LTE_eNB_DLSCH_t *dlsch0 = eNB->dlsch[UE_id][0];
|
||||||
//LTE_eNB_DLSCH_t *dlsch1 = eNB->dlsch[UE_id][1];
|
//LTE_eNB_DLSCH_t *dlsch1 = eNB->dlsch[UE_id][1];
|
||||||
int harq_pid = dlsch0->harq_ids[sf];
|
int harq_pid = dlsch0->harq_ids[sfn%2][sf];
|
||||||
|
if(harq_pid >= dlsch0->Mdlharq) {
|
||||||
|
LOG_E(PHY,"pnf_phy_dl_config_req illegal harq_pid %d\n", harq_pid);
|
||||||
|
return(-1);
|
||||||
|
}
|
||||||
uint8_t *dlsch_sdu = tx_pdus[UE_id][harq_pid];
|
uint8_t *dlsch_sdu = tx_pdus[UE_id][harq_pid];
|
||||||
|
|
||||||
memcpy(dlsch_sdu, tx_pdu->segments[0].segment_data, tx_pdu->segments[0].segment_length);
|
memcpy(dlsch_sdu, tx_pdu->segments[0].segment_data, tx_pdu->segments[0].segment_length);
|
||||||
@@ -1113,7 +1104,6 @@ int start_request(nfapi_pnf_config_t* config, nfapi_pnf_phy_config_t* phy, nfapi
|
|||||||
}
|
}
|
||||||
|
|
||||||
if(phy_info->timing_info_mode & 0x2) {
|
if(phy_info->timing_info_mode & 0x2) {
|
||||||
//printf("Panos-D: start_request () Enabling timing_info_mode_aperiodic \n");
|
|
||||||
p7_config->timing_info_mode_aperiodic = 1;
|
p7_config->timing_info_mode_aperiodic = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1181,9 +1171,6 @@ int start_request(nfapi_pnf_config_t* config, nfapi_pnf_phy_config_t* phy, nfapi
|
|||||||
NFAPI_TRACE(NFAPI_TRACE_INFO, "[PNF] DJP - HACK - Set p7_config global ready for subframe ind%s\n", __FUNCTION__);
|
NFAPI_TRACE(NFAPI_TRACE_INFO, "[PNF] DJP - HACK - Set p7_config global ready for subframe ind%s\n", __FUNCTION__);
|
||||||
p7_config_g = p7_config;
|
p7_config_g = p7_config;
|
||||||
|
|
||||||
//NFAPI_TRACE(NFAPI_TRACE_INFO, "[PNF] Panos-D: start_request, BUFFER SIZE: %d", p7_config_g->subframe_buffer_size);
|
|
||||||
//printf("Panos-D: start_request, bUFFER SIZE: %d", p7_config_g->subframe_buffer_size);
|
|
||||||
|
|
||||||
// Need to wait for main thread to create RU structures
|
// Need to wait for main thread to create RU structures
|
||||||
while(config_sync_var<0)
|
while(config_sync_var<0)
|
||||||
{
|
{
|
||||||
@@ -1197,13 +1184,7 @@ int start_request(nfapi_pnf_config_t* config, nfapi_pnf_phy_config_t* phy, nfapi
|
|||||||
|
|
||||||
printf("[PNF] About to call init_eNB_afterRU()\n");
|
printf("[PNF] About to call init_eNB_afterRU()\n");
|
||||||
|
|
||||||
// Panos: Instead
|
|
||||||
/*if (nfapi_mode == 3) {
|
|
||||||
init_UE_stub(1,0,uecap_xer_in);
|
|
||||||
}*/
|
|
||||||
//else{
|
|
||||||
if (nfapi_mode != 3) {
|
if (nfapi_mode != 3) {
|
||||||
// Panos
|
|
||||||
init_eNB_afterRU();
|
init_eNB_afterRU();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -357,18 +357,6 @@ int wake_eNB_rxtx(PHY_VARS_eNB *eNB, uint16_t sfn, uint16_t sf) {
|
|||||||
wait.tv_sec=0;
|
wait.tv_sec=0;
|
||||||
wait.tv_nsec=5000000L;
|
wait.tv_nsec=5000000L;
|
||||||
|
|
||||||
#if 0
|
|
||||||
/* accept some delay in processing - up to 5ms */
|
|
||||||
for (i = 0; i < 10 && proc_rxtx->instance_cnt_rxtx == 0; i++) {
|
|
||||||
LOG_W( PHY,"[eNB] sfn/sf:%d:%d proc_rxtx[%d]:TXsfn:%d/%d eNB RXn-TXnp4 thread busy!! (cnt_rxtx %i)\n", sfn, sf, sf&1, proc_rxtx->frame_tx, proc_rxtx->subframe_tx, proc_rxtx->instance_cnt_rxtx);
|
|
||||||
usleep(500);
|
|
||||||
}
|
|
||||||
if (proc_rxtx->instance_cnt_rxtx == 0) {
|
|
||||||
exit_fun( "TX thread busy" );
|
|
||||||
return(-1);
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
// wake up TX for subframe n+sf_ahead
|
// wake up TX for subframe n+sf_ahead
|
||||||
// lock the TX mutex and make sure the thread is ready
|
// lock the TX mutex and make sure the thread is ready
|
||||||
if (pthread_mutex_timedlock(&proc_rxtx->mutex_rxtx,&wait) != 0) {
|
if (pthread_mutex_timedlock(&proc_rxtx->mutex_rxtx,&wait) != 0) {
|
||||||
@@ -692,36 +680,13 @@ void vnf_deallocate(void* ptr) {
|
|||||||
free(ptr);
|
free(ptr);
|
||||||
}
|
}
|
||||||
|
|
||||||
extern void nfapi_log(char *file, char *func, int line, int comp, int level, const char* format, va_list args);
|
|
||||||
|
|
||||||
void vnf_trace(nfapi_trace_level_t nfapi_level, const char* message, ...) {
|
void vnf_trace(nfapi_trace_level_t nfapi_level, const char* message, ...) {
|
||||||
|
|
||||||
va_list args;
|
va_list args;
|
||||||
int oai_level;
|
|
||||||
|
|
||||||
if (nfapi_level==NFAPI_TRACE_ERROR)
|
|
||||||
{
|
|
||||||
oai_level = LOG_ERR;
|
|
||||||
}
|
|
||||||
else if (nfapi_level==NFAPI_TRACE_WARN)
|
|
||||||
{
|
|
||||||
oai_level = LOG_WARNING;
|
|
||||||
}
|
|
||||||
else if (nfapi_level==NFAPI_TRACE_NOTE)
|
|
||||||
{
|
|
||||||
oai_level = LOG_INFO;
|
|
||||||
}
|
|
||||||
else if (nfapi_level==NFAPI_TRACE_INFO)
|
|
||||||
{
|
|
||||||
oai_level = LOG_INFO;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
oai_level = LOG_INFO;
|
|
||||||
}
|
|
||||||
|
|
||||||
va_start(args, message);
|
va_start(args, message);
|
||||||
nfapi_log("FILE>", "FUNC", 999, PHY, oai_level, message, args);
|
nfapi_log("FILE>", "FUNC", 999, PHY, nfapitooai_level(nfapi_level), message, args);
|
||||||
va_end(args);
|
va_end(args);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -25,7 +25,7 @@ extern "C" {
|
|||||||
// todo : move to public_inc so can be used by vendor extensions
|
// todo : move to public_inc so can be used by vendor extensions
|
||||||
|
|
||||||
#define MAX_BAD_TAG 3
|
#define MAX_BAD_TAG 3
|
||||||
|
int nfapitooai_level(int nfapilevel);
|
||||||
uint8_t push8(uint8_t in, uint8_t **out, uint8_t *end);
|
uint8_t push8(uint8_t in, uint8_t **out, uint8_t *end);
|
||||||
uint8_t pushs8(int8_t in, uint8_t **out, uint8_t *end);
|
uint8_t pushs8(int8_t in, uint8_t **out, uint8_t *end);
|
||||||
uint8_t push16(uint16_t in, uint8_t **out, uint8_t *end);
|
uint8_t push16(uint16_t in, uint8_t **out, uint8_t *end);
|
||||||
|
|||||||
@@ -1308,7 +1308,7 @@ typedef struct {
|
|||||||
typedef struct {
|
typedef struct {
|
||||||
nfapi_tl_t tl;
|
nfapi_tl_t tl;
|
||||||
uint16_t length;
|
uint16_t length;
|
||||||
uint16_t pdu_index;
|
int16_t pdu_index;
|
||||||
uint16_t transmission_power;
|
uint16_t transmission_power;
|
||||||
} nfapi_dl_config_bch_pdu_rel8_t;
|
} nfapi_dl_config_bch_pdu_rel8_t;
|
||||||
#define NFAPI_DL_CONFIG_REQUEST_BCH_PDU_REL8_TAG 0x2004
|
#define NFAPI_DL_CONFIG_REQUEST_BCH_PDU_REL8_TAG 0x2004
|
||||||
@@ -1320,7 +1320,7 @@ typedef struct {
|
|||||||
typedef struct {
|
typedef struct {
|
||||||
nfapi_tl_t tl;
|
nfapi_tl_t tl;
|
||||||
uint16_t length;
|
uint16_t length;
|
||||||
uint16_t pdu_index;
|
int16_t pdu_index;
|
||||||
uint16_t rnti;
|
uint16_t rnti;
|
||||||
uint8_t resource_allocation_type;
|
uint8_t resource_allocation_type;
|
||||||
uint32_t resource_block_coding;
|
uint32_t resource_block_coding;
|
||||||
@@ -1344,7 +1344,7 @@ typedef struct {
|
|||||||
typedef struct {
|
typedef struct {
|
||||||
nfapi_tl_t tl;
|
nfapi_tl_t tl;
|
||||||
uint16_t length;
|
uint16_t length;
|
||||||
uint16_t pdu_index;
|
int16_t pdu_index;
|
||||||
uint16_t rnti;
|
uint16_t rnti;
|
||||||
uint8_t resource_allocation_type;
|
uint8_t resource_allocation_type;
|
||||||
uint8_t virtual_resource_block_assignment_flag;
|
uint8_t virtual_resource_block_assignment_flag;
|
||||||
@@ -1429,7 +1429,7 @@ typedef struct {
|
|||||||
typedef struct {
|
typedef struct {
|
||||||
nfapi_tl_t tl;
|
nfapi_tl_t tl;
|
||||||
uint16_t length;
|
uint16_t length;
|
||||||
uint16_t pdu_index;
|
int16_t pdu_index;
|
||||||
uint16_t p_rnti;
|
uint16_t p_rnti;
|
||||||
uint8_t resource_allocation_type;
|
uint8_t resource_allocation_type;
|
||||||
uint8_t virtual_resource_block_assignment_flag;
|
uint8_t virtual_resource_block_assignment_flag;
|
||||||
@@ -1595,7 +1595,7 @@ typedef struct {
|
|||||||
typedef struct {
|
typedef struct {
|
||||||
nfapi_tl_t tl;
|
nfapi_tl_t tl;
|
||||||
uint16_t length;
|
uint16_t length;
|
||||||
uint16_t pdu_index;
|
int16_t pdu_index;
|
||||||
uint16_t transmission_power;
|
uint16_t transmission_power;
|
||||||
uint16_t hyper_sfn_2_lsbs;
|
uint16_t hyper_sfn_2_lsbs;
|
||||||
} nfapi_dl_config_nbch_pdu_rel13_t;
|
} nfapi_dl_config_nbch_pdu_rel13_t;
|
||||||
@@ -1609,7 +1609,7 @@ typedef struct {
|
|||||||
typedef struct {
|
typedef struct {
|
||||||
nfapi_tl_t tl;
|
nfapi_tl_t tl;
|
||||||
uint16_t length;
|
uint16_t length;
|
||||||
uint16_t pdu_index;
|
int16_t pdu_index;
|
||||||
uint8_t ncce_index;
|
uint8_t ncce_index;
|
||||||
uint8_t aggregation_level;
|
uint8_t aggregation_level;
|
||||||
uint8_t start_symbol;
|
uint8_t start_symbol;
|
||||||
@@ -1642,7 +1642,7 @@ typedef struct {
|
|||||||
typedef struct {
|
typedef struct {
|
||||||
nfapi_tl_t tl;
|
nfapi_tl_t tl;
|
||||||
uint16_t length;
|
uint16_t length;
|
||||||
uint16_t pdu_index;
|
int16_t pdu_index;
|
||||||
uint8_t start_symbol;
|
uint8_t start_symbol;
|
||||||
uint8_t rnti_type;
|
uint8_t rnti_type;
|
||||||
uint16_t rnti;
|
uint16_t rnti;
|
||||||
@@ -2218,6 +2218,7 @@ typedef struct {
|
|||||||
uint8_t dl_assignment_index;
|
uint8_t dl_assignment_index;
|
||||||
uint32_t tpc_bitmap;
|
uint32_t tpc_bitmap;
|
||||||
uint16_t transmission_power;
|
uint16_t transmission_power;
|
||||||
|
uint8_t harq_pid;
|
||||||
} nfapi_hi_dci0_dci_pdu_rel8_t;
|
} nfapi_hi_dci0_dci_pdu_rel8_t;
|
||||||
#define NFAPI_HI_DCI0_REQUEST_DCI_PDU_REL8_TAG 0x2020
|
#define NFAPI_HI_DCI0_REQUEST_DCI_PDU_REL8_TAG 0x2020
|
||||||
|
|
||||||
@@ -2361,7 +2362,7 @@ typedef struct {
|
|||||||
#define NFAPI_TX_MAX_SEGMENTS 32
|
#define NFAPI_TX_MAX_SEGMENTS 32
|
||||||
typedef struct {
|
typedef struct {
|
||||||
uint16_t pdu_length;
|
uint16_t pdu_length;
|
||||||
uint16_t pdu_index;
|
int16_t pdu_index;
|
||||||
uint8_t num_segments;
|
uint8_t num_segments;
|
||||||
struct {
|
struct {
|
||||||
uint32_t segment_length;
|
uint32_t segment_length;
|
||||||
@@ -2902,7 +2903,7 @@ typedef struct {
|
|||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
uint8_t sub_error_code;
|
uint8_t sub_error_code;
|
||||||
uint16_t pdu_index;
|
int16_t pdu_index;
|
||||||
} nfapi_error_indication_msg_tx_err;
|
} nfapi_error_indication_msg_tx_err;
|
||||||
|
|
||||||
//
|
//
|
||||||
|
|||||||
@@ -2924,7 +2924,7 @@ static uint8_t unpack_dl_config_bch_pdu_rel8_value(void *tlv, uint8_t **ppReadPa
|
|||||||
nfapi_dl_config_bch_pdu_rel8_t* bch_pdu_rel8 = (nfapi_dl_config_bch_pdu_rel8_t*)tlv;
|
nfapi_dl_config_bch_pdu_rel8_t* bch_pdu_rel8 = (nfapi_dl_config_bch_pdu_rel8_t*)tlv;
|
||||||
|
|
||||||
return ( pull16(ppReadPackedMsg, &bch_pdu_rel8->length, end) &&
|
return ( pull16(ppReadPackedMsg, &bch_pdu_rel8->length, end) &&
|
||||||
pull16(ppReadPackedMsg, &bch_pdu_rel8->pdu_index, end) &&
|
pull16(ppReadPackedMsg, (uint16_t *)&bch_pdu_rel8->pdu_index, end) &&
|
||||||
pull16(ppReadPackedMsg, &bch_pdu_rel8->transmission_power, end));
|
pull16(ppReadPackedMsg, &bch_pdu_rel8->transmission_power, end));
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -2933,7 +2933,7 @@ static uint8_t unpack_dl_config_mch_pdu_rel8_value(void *tlv, uint8_t **ppReadPa
|
|||||||
nfapi_dl_config_mch_pdu_rel8_t* mch_pdu_rel8 = (nfapi_dl_config_mch_pdu_rel8_t*)tlv;
|
nfapi_dl_config_mch_pdu_rel8_t* mch_pdu_rel8 = (nfapi_dl_config_mch_pdu_rel8_t*)tlv;
|
||||||
|
|
||||||
return (pull16(ppReadPackedMsg, &mch_pdu_rel8->length, end) &&
|
return (pull16(ppReadPackedMsg, &mch_pdu_rel8->length, end) &&
|
||||||
pull16(ppReadPackedMsg, &mch_pdu_rel8->pdu_index, end) &&
|
pull16(ppReadPackedMsg, (uint16_t *)&mch_pdu_rel8->pdu_index, end) &&
|
||||||
pull16(ppReadPackedMsg, &mch_pdu_rel8->rnti, end) &&
|
pull16(ppReadPackedMsg, &mch_pdu_rel8->rnti, end) &&
|
||||||
pull8(ppReadPackedMsg, &mch_pdu_rel8->resource_allocation_type, end) &&
|
pull8(ppReadPackedMsg, &mch_pdu_rel8->resource_allocation_type, end) &&
|
||||||
pull32(ppReadPackedMsg, &mch_pdu_rel8->resource_block_coding, end) &&
|
pull32(ppReadPackedMsg, &mch_pdu_rel8->resource_block_coding, end) &&
|
||||||
@@ -2947,7 +2947,7 @@ static uint8_t unpack_dl_config_dlsch_pdu_rel8_value(void *tlv, uint8_t **ppRead
|
|||||||
nfapi_dl_config_dlsch_pdu_rel8_t* dlsch_pdu_rel8 = (nfapi_dl_config_dlsch_pdu_rel8_t*)tlv;
|
nfapi_dl_config_dlsch_pdu_rel8_t* dlsch_pdu_rel8 = (nfapi_dl_config_dlsch_pdu_rel8_t*)tlv;
|
||||||
|
|
||||||
if (!(pull16(ppReadPackedMsg, &dlsch_pdu_rel8->length, end) &&
|
if (!(pull16(ppReadPackedMsg, &dlsch_pdu_rel8->length, end) &&
|
||||||
pull16(ppReadPackedMsg, &dlsch_pdu_rel8->pdu_index, end) &&
|
pull16(ppReadPackedMsg, (uint16_t *)&dlsch_pdu_rel8->pdu_index, end) &&
|
||||||
pull16(ppReadPackedMsg, &dlsch_pdu_rel8->rnti, end) &&
|
pull16(ppReadPackedMsg, &dlsch_pdu_rel8->rnti, end) &&
|
||||||
pull8(ppReadPackedMsg, &dlsch_pdu_rel8->resource_allocation_type, end) &&
|
pull8(ppReadPackedMsg, &dlsch_pdu_rel8->resource_allocation_type, end) &&
|
||||||
pull8(ppReadPackedMsg, &dlsch_pdu_rel8->virtual_resource_block_assignment_flag, end) &&
|
pull8(ppReadPackedMsg, &dlsch_pdu_rel8->virtual_resource_block_assignment_flag, end) &&
|
||||||
@@ -3033,7 +3033,7 @@ static uint8_t unpack_dl_config_pch_pdu_rel8_value(void *tlv, uint8_t **ppReadPa
|
|||||||
nfapi_dl_config_pch_pdu_rel8_t* pch_pdu_rel8 = (nfapi_dl_config_pch_pdu_rel8_t*)tlv;
|
nfapi_dl_config_pch_pdu_rel8_t* pch_pdu_rel8 = (nfapi_dl_config_pch_pdu_rel8_t*)tlv;
|
||||||
|
|
||||||
return ( pull16(ppReadPackedMsg, &pch_pdu_rel8->length, end) &&
|
return ( pull16(ppReadPackedMsg, &pch_pdu_rel8->length, end) &&
|
||||||
pull16(ppReadPackedMsg, &pch_pdu_rel8->pdu_index, end) &&
|
pull16(ppReadPackedMsg, (uint16_t *)&pch_pdu_rel8->pdu_index, end) &&
|
||||||
pull16(ppReadPackedMsg, &pch_pdu_rel8->p_rnti, end) &&
|
pull16(ppReadPackedMsg, &pch_pdu_rel8->p_rnti, end) &&
|
||||||
pull8(ppReadPackedMsg, &pch_pdu_rel8->resource_allocation_type, end) &&
|
pull8(ppReadPackedMsg, &pch_pdu_rel8->resource_allocation_type, end) &&
|
||||||
pull8(ppReadPackedMsg, &pch_pdu_rel8->virtual_resource_block_assignment_flag, end) &&
|
pull8(ppReadPackedMsg, &pch_pdu_rel8->virtual_resource_block_assignment_flag, end) &&
|
||||||
@@ -3179,7 +3179,7 @@ static uint8_t unpack_dl_config_nbch_pdu_rel13_value(void *tlv, uint8_t **ppRead
|
|||||||
nfapi_dl_config_nbch_pdu_rel13_t* nbch_params_rel13 = (nfapi_dl_config_nbch_pdu_rel13_t*)tlv;
|
nfapi_dl_config_nbch_pdu_rel13_t* nbch_params_rel13 = (nfapi_dl_config_nbch_pdu_rel13_t*)tlv;
|
||||||
|
|
||||||
return ( pull16(ppReadPackedMsg, &nbch_params_rel13->length, end) &&
|
return ( pull16(ppReadPackedMsg, &nbch_params_rel13->length, end) &&
|
||||||
pull16(ppReadPackedMsg, &nbch_params_rel13->pdu_index, end) &&
|
pull16(ppReadPackedMsg, (uint16_t *)&nbch_params_rel13->pdu_index, end) &&
|
||||||
pull16(ppReadPackedMsg, &nbch_params_rel13->transmission_power, end) &&
|
pull16(ppReadPackedMsg, &nbch_params_rel13->transmission_power, end) &&
|
||||||
pull16(ppReadPackedMsg, &nbch_params_rel13->hyper_sfn_2_lsbs, end));
|
pull16(ppReadPackedMsg, &nbch_params_rel13->hyper_sfn_2_lsbs, end));
|
||||||
}
|
}
|
||||||
@@ -3189,7 +3189,7 @@ static uint8_t unpack_dl_config_npdcch_pdu_rel13_value(void *tlv, uint8_t **ppRe
|
|||||||
nfapi_dl_config_npdcch_pdu_rel13_t* npdcch_params_rel13 = (nfapi_dl_config_npdcch_pdu_rel13_t*)tlv;
|
nfapi_dl_config_npdcch_pdu_rel13_t* npdcch_params_rel13 = (nfapi_dl_config_npdcch_pdu_rel13_t*)tlv;
|
||||||
|
|
||||||
return ( pull16(ppReadPackedMsg, &npdcch_params_rel13->length, end) &&
|
return ( pull16(ppReadPackedMsg, &npdcch_params_rel13->length, end) &&
|
||||||
pull16(ppReadPackedMsg, &npdcch_params_rel13->pdu_index, end) &&
|
pull16(ppReadPackedMsg, (uint16_t *)&npdcch_params_rel13->pdu_index, end) &&
|
||||||
pull8(ppReadPackedMsg, &npdcch_params_rel13->ncce_index, end) &&
|
pull8(ppReadPackedMsg, &npdcch_params_rel13->ncce_index, end) &&
|
||||||
pull8(ppReadPackedMsg, &npdcch_params_rel13->aggregation_level, end) &&
|
pull8(ppReadPackedMsg, &npdcch_params_rel13->aggregation_level, end) &&
|
||||||
pull8(ppReadPackedMsg, &npdcch_params_rel13->start_symbol, end) &&
|
pull8(ppReadPackedMsg, &npdcch_params_rel13->start_symbol, end) &&
|
||||||
@@ -3218,7 +3218,7 @@ static uint8_t unpack_dl_config_ndlsch_pdu_rel13_value(void *tlv, uint8_t **ppRe
|
|||||||
nfapi_dl_config_ndlsch_pdu_rel13_t* ndlsch_params_rel13 = (nfapi_dl_config_ndlsch_pdu_rel13_t*)tlv;
|
nfapi_dl_config_ndlsch_pdu_rel13_t* ndlsch_params_rel13 = (nfapi_dl_config_ndlsch_pdu_rel13_t*)tlv;
|
||||||
|
|
||||||
return ( pull16(ppReadPackedMsg, &ndlsch_params_rel13->length, end) &&
|
return ( pull16(ppReadPackedMsg, &ndlsch_params_rel13->length, end) &&
|
||||||
pull16(ppReadPackedMsg, &ndlsch_params_rel13->pdu_index, end) &&
|
pull16(ppReadPackedMsg, (uint16_t *)&ndlsch_params_rel13->pdu_index, end) &&
|
||||||
pull8(ppReadPackedMsg, &ndlsch_params_rel13->start_symbol, end) &&
|
pull8(ppReadPackedMsg, &ndlsch_params_rel13->start_symbol, end) &&
|
||||||
pull8(ppReadPackedMsg, &ndlsch_params_rel13->rnti_type, end) &&
|
pull8(ppReadPackedMsg, &ndlsch_params_rel13->rnti_type, end) &&
|
||||||
pull16(ppReadPackedMsg, &ndlsch_params_rel13->rnti, end) &&
|
pull16(ppReadPackedMsg, &ndlsch_params_rel13->rnti, end) &&
|
||||||
@@ -3602,7 +3602,7 @@ static uint8_t unpack_ul_config_ue_info_rel8_value(void *tlv, uint8_t **ppReadPa
|
|||||||
nfapi_ul_config_ue_information_rel8_t* ue_info_rel8 = (nfapi_ul_config_ue_information_rel8_t*)tlv;
|
nfapi_ul_config_ue_information_rel8_t* ue_info_rel8 = (nfapi_ul_config_ue_information_rel8_t*)tlv;
|
||||||
|
|
||||||
return (pull32(ppReadPackedMsg, &ue_info_rel8->handle, end) &&
|
return (pull32(ppReadPackedMsg, &ue_info_rel8->handle, end) &&
|
||||||
pull16(ppReadPackedMsg, &ue_info_rel8->rnti, end));
|
pull16(ppReadPackedMsg, (uint16_t *)&ue_info_rel8->rnti, end));
|
||||||
}
|
}
|
||||||
static uint8_t unpack_ul_config_ue_info_rel11_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end)
|
static uint8_t unpack_ul_config_ue_info_rel11_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -1624,10 +1624,6 @@ void pnf_nfapi_p7_read_dispatch_message(pnf_p7_t* pnf_p7, uint32_t now_hr_time)
|
|||||||
|
|
||||||
// need to update the time as we would only use the value from the
|
// need to update the time as we would only use the value from the
|
||||||
// select
|
// select
|
||||||
#if 0
|
|
||||||
// DJP - why do this here and not on return from recv???
|
|
||||||
now_hr_time = pnf_get_current_time_hr();
|
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
while(recvfrom_result > 0);
|
while(recvfrom_result > 0);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1248,12 +1248,12 @@ void vnf_handle_timing_info(void *pRecvMsg, int recvMsgLen, vnf_p7_t* vnf_p7)
|
|||||||
|
|
||||||
//NFAPI_TRACE(NFAPI_TRACE_INFO, "%s() PNF:SFN/SF:%d VNF:SFN/SF:%d deltaSFNSF:%d\n", __FUNCTION__, NFAPI_SFNSF2DEC(ind.last_sfn_sf), NFAPI_SFNSF2DEC(vnf_p7->p7_connections[0].sfn_sf), vnf_pnf_sfnsf_delta);
|
//NFAPI_TRACE(NFAPI_TRACE_INFO, "%s() PNF:SFN/SF:%d VNF:SFN/SF:%d deltaSFNSF:%d\n", __FUNCTION__, NFAPI_SFNSF2DEC(ind.last_sfn_sf), NFAPI_SFNSF2DEC(vnf_p7->p7_connections[0].sfn_sf), vnf_pnf_sfnsf_delta);
|
||||||
|
|
||||||
// Panos: Careful here!!!
|
// Panos: Careful here!!! Modification of the original nfapi-code
|
||||||
//if (vnf_pnf_sfnsf_delta>1 || vnf_pnf_sfnsf_delta < -1)
|
//if (vnf_pnf_sfnsf_delta>1 || vnf_pnf_sfnsf_delta < -1)
|
||||||
if (vnf_pnf_sfnsf_delta>0 || vnf_pnf_sfnsf_delta < 0)
|
if (vnf_pnf_sfnsf_delta>0 || vnf_pnf_sfnsf_delta < 0)
|
||||||
{
|
{
|
||||||
NFAPI_TRACE(NFAPI_TRACE_INFO, "%s() LARGE SFN/SF DELTA between PNF and VNF delta:%d VNF:%d PNF:%d\n\n\n\n\n\n\n\n\n", __FUNCTION__, vnf_pnf_sfnsf_delta, NFAPI_SFNSF2DEC(vnf_p7->p7_connections[0].sfn_sf), NFAPI_SFNSF2DEC(ind.last_sfn_sf));
|
NFAPI_TRACE(NFAPI_TRACE_INFO, "%s() LARGE SFN/SF DELTA between PNF and VNF delta:%d VNF:%d PNF:%d\n\n\n\n\n\n\n\n\n", __FUNCTION__, vnf_pnf_sfnsf_delta, NFAPI_SFNSF2DEC(vnf_p7->p7_connections[0].sfn_sf), NFAPI_SFNSF2DEC(ind.last_sfn_sf));
|
||||||
// Panos: Careful here!!!
|
// Panos: Careful here!!! Modification of the original nfapi-code
|
||||||
vnf_p7->p7_connections[0].sfn_sf = ind.last_sfn_sf;
|
vnf_p7->p7_connections[0].sfn_sf = ind.last_sfn_sf;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -200,13 +200,6 @@ int nfapi_vnf_p7_start(nfapi_vnf_p7_config_t* config)
|
|||||||
// still time before the end of the subframe wait
|
// still time before the end of the subframe wait
|
||||||
pselect_timeout = timespec_sub(sf_start, pselect_start);
|
pselect_timeout = timespec_sub(sf_start, pselect_start);
|
||||||
|
|
||||||
#if 0
|
|
||||||
NFAPI_TRACE(NFAPI_TRACE_INFO, "%s() sf_start:%d.%ld pselect_start:%d.%ld pseclect_timeout:%d.%ld\n",
|
|
||||||
__FUNCTION__,
|
|
||||||
sf_start.tv_sec, sf_start.tv_nsec,
|
|
||||||
pselect_start.tv_sec, pselect_start.tv_nsec,
|
|
||||||
pselect_timeout.tv_sec, pselect_timeout.tv_nsec);
|
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//original_pselect_timeout = pselect_timeout;
|
//original_pselect_timeout = pselect_timeout;
|
||||||
@@ -266,13 +259,6 @@ if (selectRetval==-1 && errno == 22)
|
|||||||
phy->insync_minor_adjustment_duration, phy->insync_minor_adjustment,
|
phy->insync_minor_adjustment_duration, phy->insync_minor_adjustment,
|
||||||
sf_duration.tv_sec, sf_duration.tv_nsec);
|
sf_duration.tv_sec, sf_duration.tv_nsec);
|
||||||
}
|
}
|
||||||
#if 0
|
|
||||||
if (selectRetval != 0 || phy->insync_minor_adjustment_duration != 0)
|
|
||||||
NFAPI_TRACE(NFAPI_TRACE_NOTE, "pselect()=%d maxSock:%d vnf_p7->socket:%d pselect_timeout:%u.%u original_pselect_timeout:%u.%u\n",
|
|
||||||
selectRetval, maxSock, vnf_p7->socket, pselect_timeout.tv_sec, pselect_timeout.tv_nsec,
|
|
||||||
original_pselect_timeout.tv_sec, original_pselect_timeout.tv_nsec);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
if(selectRetval == 0)
|
if(selectRetval == 0)
|
||||||
{
|
{
|
||||||
// calculate the start of the next subframe
|
// calculate the start of the next subframe
|
||||||
|
|||||||
@@ -30,7 +30,6 @@
|
|||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include "PHY/CODING/coding_defs.h"
|
#include "PHY/CODING/coding_defs.h"
|
||||||
#include "extern_3GPPinterleaver.h"
|
|
||||||
|
|
||||||
//#define DEBUG_TURBO_ENCODER 1
|
//#define DEBUG_TURBO_ENCODER 1
|
||||||
|
|
||||||
@@ -110,9 +109,7 @@ uint32_t bit_byte_lut[2048];
|
|||||||
void threegpplte_turbo_encoder(uint8_t *input,
|
void threegpplte_turbo_encoder(uint8_t *input,
|
||||||
uint16_t input_length_bytes,
|
uint16_t input_length_bytes,
|
||||||
uint8_t *output,
|
uint8_t *output,
|
||||||
uint8_t F,
|
uint8_t F)
|
||||||
uint16_t interleaver_f1,
|
|
||||||
uint16_t interleaver_f2)
|
|
||||||
{
|
{
|
||||||
|
|
||||||
int i,k=0;
|
int i,k=0;
|
||||||
@@ -257,6 +254,217 @@ inline short threegpp_interleaver_parameters(uint16_t bytes_per_codeword)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const interleaver_TS_36_212_t f1f2[188] = {
|
||||||
|
{ 40, 3, 10 },
|
||||||
|
{ 48, 7, 12 },
|
||||||
|
{ 56, 19, 42 },
|
||||||
|
{ 64, 7, 16 },
|
||||||
|
{ 72, 7, 18 },
|
||||||
|
{ 80, 11, 20 },
|
||||||
|
{ 88, 5, 22 },
|
||||||
|
{ 96, 11, 24 },
|
||||||
|
{ 104, 7, 26 },
|
||||||
|
{ 112, 41, 84 },
|
||||||
|
{ 120, 103, 90 },
|
||||||
|
{ 128, 15, 32 },
|
||||||
|
{ 136, 9, 34 },
|
||||||
|
{ 144, 17, 108 },
|
||||||
|
{ 152, 9, 38 },
|
||||||
|
{ 160, 21, 120 },
|
||||||
|
{ 168, 101, 84 },
|
||||||
|
{ 176, 21, 44 },
|
||||||
|
{ 184, 57, 46 },
|
||||||
|
{ 192, 23, 48 },
|
||||||
|
{ 200, 13, 50 },
|
||||||
|
{ 208, 27, 52 },
|
||||||
|
{ 216, 11, 36 },
|
||||||
|
{ 224, 27, 56 },
|
||||||
|
{ 232, 85, 58 },
|
||||||
|
{ 240, 29, 60 },
|
||||||
|
{ 248, 33, 62 },
|
||||||
|
{ 256, 15, 32 },
|
||||||
|
{ 264, 17, 198 },
|
||||||
|
{ 272, 33, 68 },
|
||||||
|
{ 280, 103, 210 },
|
||||||
|
{ 288, 19, 36 },
|
||||||
|
{ 296, 19, 74 },
|
||||||
|
{ 304, 37, 76 },
|
||||||
|
{ 312, 19, 78 },
|
||||||
|
{ 320, 21, 120 },
|
||||||
|
{ 328, 21, 82 },
|
||||||
|
{ 336, 115, 84 },
|
||||||
|
{ 344, 193, 86 },
|
||||||
|
{ 352, 21, 44 },
|
||||||
|
{ 360, 133, 90 },
|
||||||
|
{ 368, 81, 46 },
|
||||||
|
{ 376, 45, 94 },
|
||||||
|
{ 384, 23, 48 },
|
||||||
|
{ 392, 243, 98 },
|
||||||
|
{ 400, 151, 40 },
|
||||||
|
{ 408, 155, 102 },
|
||||||
|
{ 416, 25, 52 },
|
||||||
|
{ 424, 51, 106 },
|
||||||
|
{ 432, 47, 72 },
|
||||||
|
{ 440, 91, 110 },
|
||||||
|
{ 448, 29, 168 },
|
||||||
|
{ 456, 29, 114 },
|
||||||
|
{ 464, 247, 58 },
|
||||||
|
{ 472, 29, 118 },
|
||||||
|
{ 480, 89, 180 },
|
||||||
|
{ 488, 91, 122 },
|
||||||
|
{ 496, 157, 62 },
|
||||||
|
{ 504, 55, 84 },
|
||||||
|
{ 512, 31, 64 },
|
||||||
|
{ 528, 17, 66 },
|
||||||
|
{ 544, 35, 68 },
|
||||||
|
{ 560, 227, 420 },
|
||||||
|
{ 576, 65, 96 },
|
||||||
|
{ 592, 19, 74 },
|
||||||
|
{ 608, 37, 76 },
|
||||||
|
{ 624, 41, 234 },
|
||||||
|
{ 640, 39, 80 },
|
||||||
|
{ 656, 185, 82 },
|
||||||
|
{ 672, 43, 252 },
|
||||||
|
{ 688, 21, 86 },
|
||||||
|
{ 704, 155, 44 },
|
||||||
|
{ 720, 79, 120 },
|
||||||
|
{ 736, 139, 92 },
|
||||||
|
{ 752, 23, 94 },
|
||||||
|
{ 768, 217, 48 },
|
||||||
|
{ 784, 25, 98 },
|
||||||
|
{ 800, 17, 80 },
|
||||||
|
{ 816, 127, 102 },
|
||||||
|
{ 832, 25, 52 },
|
||||||
|
{ 848, 239, 106 },
|
||||||
|
{ 864, 17, 48 },
|
||||||
|
{ 880, 137, 110 },
|
||||||
|
{ 896, 215, 112 },
|
||||||
|
{ 912, 29, 114 },
|
||||||
|
{ 928, 15, 58 },
|
||||||
|
{ 944, 147, 118 },
|
||||||
|
{ 960, 29, 60 },
|
||||||
|
{ 976, 59, 122 },
|
||||||
|
{ 992, 65, 124 },
|
||||||
|
{ 1008, 55, 84 },
|
||||||
|
{ 1024, 31, 64 },
|
||||||
|
{ 1056, 17, 66 },
|
||||||
|
{ 1088, 171, 204 },
|
||||||
|
{ 1120, 67, 140 },
|
||||||
|
{ 1152, 35, 72 },
|
||||||
|
{ 1184, 19, 74 },
|
||||||
|
{ 1216, 39, 76 },
|
||||||
|
{ 1248, 19, 78 },
|
||||||
|
{ 1280, 199, 240 },
|
||||||
|
{ 1312, 21, 82 },
|
||||||
|
{ 1344, 211, 252 },
|
||||||
|
{ 1376, 21, 86 },
|
||||||
|
{ 1408, 43, 88 },
|
||||||
|
{ 1440, 149, 60 },
|
||||||
|
{ 1472, 45, 92 },
|
||||||
|
{ 1504, 49, 846 },
|
||||||
|
{ 1536, 71, 48 },
|
||||||
|
{ 1568, 13, 28 },
|
||||||
|
{ 1600, 17, 80 },
|
||||||
|
{ 1632, 25, 102 },
|
||||||
|
{ 1664, 183, 104 },
|
||||||
|
{ 1696, 55, 954 },
|
||||||
|
{ 1728, 127, 96 },
|
||||||
|
{ 1760, 27, 110 },
|
||||||
|
{ 1792, 29, 112 },
|
||||||
|
{ 1824, 29, 114 },
|
||||||
|
{ 1856, 57, 116 },
|
||||||
|
{ 1888, 45, 354 },
|
||||||
|
{ 1920, 31, 120 },
|
||||||
|
{ 1952, 59, 610 },
|
||||||
|
{ 1984, 185, 124 },
|
||||||
|
{ 2016, 113, 420 },
|
||||||
|
{ 2048, 31, 64 },
|
||||||
|
{ 2112, 17, 66 },
|
||||||
|
{ 2176, 171, 136 },
|
||||||
|
{ 2240, 209, 420 },
|
||||||
|
{ 2304, 253, 216 },
|
||||||
|
{ 2368, 367, 444 },
|
||||||
|
{ 2432, 265, 456 },
|
||||||
|
{ 2496, 181, 468 },
|
||||||
|
{ 2560, 39, 80 },
|
||||||
|
{ 2624, 27, 164 },
|
||||||
|
{ 2688, 127, 504 },
|
||||||
|
{ 2752, 143, 172 },
|
||||||
|
{ 2816, 43, 88 },
|
||||||
|
{ 2880, 29, 300 },
|
||||||
|
{ 2944, 45, 92 },
|
||||||
|
{ 3008, 157, 188 },
|
||||||
|
{ 3072, 47, 96 },
|
||||||
|
{ 3136, 13, 28 },
|
||||||
|
{ 3200, 111, 240 },
|
||||||
|
{ 3264, 443, 204 },
|
||||||
|
{ 3328, 51, 104 },
|
||||||
|
{ 3392, 51, 212 },
|
||||||
|
{ 3456, 451, 192 },
|
||||||
|
{ 3520, 257, 220 },
|
||||||
|
{ 3584, 57, 336 },
|
||||||
|
{ 3648, 313, 228 },
|
||||||
|
{ 3712, 271, 232 },
|
||||||
|
{ 3776, 179, 236 },
|
||||||
|
{ 3840, 331, 120 },
|
||||||
|
{ 3904, 363, 244 },
|
||||||
|
{ 3968, 375, 248 },
|
||||||
|
{ 4032, 127, 168 },
|
||||||
|
{ 4096, 31, 64 },
|
||||||
|
{ 4160, 33, 130 },
|
||||||
|
{ 4224, 43, 264 },
|
||||||
|
{ 4288, 33, 134 },
|
||||||
|
{ 4352, 477, 408 },
|
||||||
|
{ 4416, 35, 138 },
|
||||||
|
{ 4480, 233, 280 },
|
||||||
|
{ 4544, 357, 142 },
|
||||||
|
{ 4608, 337, 480 },
|
||||||
|
{ 4672, 37, 146 },
|
||||||
|
{ 4736, 71, 444 },
|
||||||
|
{ 4800, 71, 120 },
|
||||||
|
{ 4864, 37, 152 },
|
||||||
|
{ 4928, 39, 462 },
|
||||||
|
{ 4992, 127, 234 },
|
||||||
|
{ 5056, 39, 158 },
|
||||||
|
{ 5120, 39, 80 },
|
||||||
|
{ 5184, 31, 96 },
|
||||||
|
{ 5248, 113, 902 },
|
||||||
|
{ 5312, 41, 166 },
|
||||||
|
{ 5376, 251, 336 },
|
||||||
|
{ 5440, 43, 170 },
|
||||||
|
{ 5504, 21, 86 },
|
||||||
|
{ 5568, 43, 174 },
|
||||||
|
{ 5632, 45, 176 },
|
||||||
|
{ 5696, 45, 178 },
|
||||||
|
{ 5760, 161, 120 },
|
||||||
|
{ 5824, 89, 182 },
|
||||||
|
{ 5888, 323, 184 },
|
||||||
|
{ 5952, 47, 186 },
|
||||||
|
{ 6016, 23, 94 },
|
||||||
|
{ 6080, 47, 190 },
|
||||||
|
{ 6144, 263, 480 },
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
t_interleaver_codebook *f1f2mat;
|
||||||
|
short *il_tb;
|
||||||
|
__attribute__((constructor)) static void init_interleaver(void) {
|
||||||
|
int totSize=0;
|
||||||
|
f1f2mat=(t_interleaver_codebook*) malloc(sizeof(*f1f2mat) * sizeof(f1f2) / sizeof(*f1f2));
|
||||||
|
for (int i=0; i < sizeof(f1f2)/sizeof(*f1f2) ; i++) {
|
||||||
|
f1f2mat[i].nb_bits=f1f2[i].nb_bits;
|
||||||
|
f1f2mat[i].f1=f1f2[i].f1;
|
||||||
|
f1f2mat[i].f2=f1f2[i].f2;
|
||||||
|
f1f2mat[i].beg_index=totSize;
|
||||||
|
totSize+=f1f2mat[i].nb_bits;
|
||||||
|
}
|
||||||
|
il_tb=(short*)malloc(sizeof(*il_tb)*totSize);
|
||||||
|
int idx=0;
|
||||||
|
for (int i=0; i < sizeof(f1f2)/sizeof(*f1f2) ; i++)
|
||||||
|
for (uint64_t j=0; j<f1f2[i].nb_bits; j++)
|
||||||
|
il_tb[idx++]=(j*f1f2[i].f1+j*j*f1f2[i].f2)%f1f2[i].nb_bits;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
#ifdef MAIN
|
#ifdef MAIN
|
||||||
|
|
||||||
@@ -296,9 +504,7 @@ int main(int argc,char **argv)
|
|||||||
|
|
||||||
threegpplte_turbo_encoder(&input[0],
|
threegpplte_turbo_encoder(&input[0],
|
||||||
5,
|
5,
|
||||||
&output[0],
|
&output[0]);
|
||||||
F1,
|
|
||||||
F2);
|
|
||||||
return(0);
|
return(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -27,9 +27,7 @@
|
|||||||
*/
|
*/
|
||||||
#ifndef TC_MAIN
|
#ifndef TC_MAIN
|
||||||
#include "coding_defs.h"
|
#include "coding_defs.h"
|
||||||
#include "extern_3GPPinterleaver.h"
|
|
||||||
#else
|
#else
|
||||||
#include "coding_vars.h"
|
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
#endif
|
#endif
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
@@ -539,9 +537,7 @@ char interleave_compact_byte(short * base_interleaver,unsigned char * input, uns
|
|||||||
void threegpplte_turbo_encoder_sse(unsigned char *input,
|
void threegpplte_turbo_encoder_sse(unsigned char *input,
|
||||||
unsigned short input_length_bytes,
|
unsigned short input_length_bytes,
|
||||||
unsigned char *output,
|
unsigned char *output,
|
||||||
unsigned char F,
|
unsigned char F)
|
||||||
unsigned short interleaver_f1,
|
|
||||||
unsigned short interleaver_f2)
|
|
||||||
{
|
{
|
||||||
|
|
||||||
int i;
|
int i;
|
||||||
@@ -699,9 +695,7 @@ int main(int argc,char **argv)
|
|||||||
threegpplte_turbo_encoder_sse(&input[0],
|
threegpplte_turbo_encoder_sse(&input[0],
|
||||||
INPUT_LENGTH,
|
INPUT_LENGTH,
|
||||||
&output[0],
|
&output[0],
|
||||||
0,
|
0);
|
||||||
F1,
|
|
||||||
F2);
|
|
||||||
|
|
||||||
|
|
||||||
for (i=0;i<12+(INPUT_LENGTH*24);i++)
|
for (i=0;i<12+(INPUT_LENGTH*24);i++)
|
||||||
|
|||||||
@@ -46,7 +46,6 @@
|
|||||||
#include "PHY/defs_common.h"
|
#include "PHY/defs_common.h"
|
||||||
#include "PHY/CODING/coding_defs.h"
|
#include "PHY/CODING/coding_defs.h"
|
||||||
#include "PHY/CODING/lte_interleaver_inline.h"
|
#include "PHY/CODING/lte_interleaver_inline.h"
|
||||||
#include "extern_3GPPinterleaver.h"
|
|
||||||
#else
|
#else
|
||||||
|
|
||||||
#include "defs.h"
|
#include "defs.h"
|
||||||
@@ -893,8 +892,6 @@ unsigned char phy_threegpplte_turbo_decoder16avx2(int16_t *y,
|
|||||||
uint8_t *decoded_bytes,
|
uint8_t *decoded_bytes,
|
||||||
uint8_t *decoded_bytes2,
|
uint8_t *decoded_bytes2,
|
||||||
uint16_t n,
|
uint16_t n,
|
||||||
uint16_t f1,
|
|
||||||
uint16_t f2,
|
|
||||||
uint8_t max_iterations,
|
uint8_t max_iterations,
|
||||||
uint8_t crc_type,
|
uint8_t crc_type,
|
||||||
uint8_t F,
|
uint8_t F,
|
||||||
@@ -989,134 +986,6 @@ unsigned char phy_threegpplte_turbo_decoder16avx2(int16_t *y,
|
|||||||
yp1 = yparity1;
|
yp1 = yparity1;
|
||||||
yp2 = yparity2;
|
yp2 = yparity2;
|
||||||
|
|
||||||
|
|
||||||
#if 0
|
|
||||||
__m128i *yp128,*yp128_cw2;
|
|
||||||
__m128i tmpe,tmpe_cw2;
|
|
||||||
yp128 = (__m128i*)y;
|
|
||||||
yp128_cw2 = (__m128i*)y2;
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
for (i=0; i<n; i+=8) {
|
|
||||||
pi2_p = &pi2tab16avx2[iind][i];
|
|
||||||
|
|
||||||
j=pi2_p[0];
|
|
||||||
|
|
||||||
|
|
||||||
tmpe = _mm_load_si128(yp128);
|
|
||||||
tmpe_cw2 = _mm_load_si128(yp128_cw2);
|
|
||||||
// fprintf(fdavx2,"yp128 %p\n",yp128);
|
|
||||||
// print_shorts("tmpe",(int16_t*)&tmpe);
|
|
||||||
|
|
||||||
s[j] = _mm_extract_epi16(tmpe,0);
|
|
||||||
yp1[j] = _mm_extract_epi16(tmpe,1);
|
|
||||||
yp2[j] = _mm_extract_epi16(tmpe,2);
|
|
||||||
s[j+8] = _mm_extract_epi16(tmpe_cw2,0);
|
|
||||||
yp1[j+8] = _mm_extract_epi16(tmpe_cw2,1);
|
|
||||||
yp2[j+8] = _mm_extract_epi16(tmpe_cw2,2);
|
|
||||||
|
|
||||||
#ifdef DEBUG_LOGMAP
|
|
||||||
fprintf(fdavx2,"init0: j %d, s[j] %d yp1[j] %d yp2[j] %d\n",((j>>4)<<3)+(j&7),s[j],yp1[j],yp2[j]);
|
|
||||||
fprintf(fdavx2b,"init0: j %d, s[j] %d yp1[j] %d yp2[j] %d\n",((j>>4)<<3)+(j&7),s[j+8],yp1[j+8],yp2[j+8]);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
j=pi2_p[1];
|
|
||||||
|
|
||||||
s[j] = _mm_extract_epi16(tmpe,3);
|
|
||||||
yp1[j] = _mm_extract_epi16(tmpe,4);
|
|
||||||
yp2[j] = _mm_extract_epi16(tmpe,5);
|
|
||||||
s[j+8] = _mm_extract_epi16(tmpe_cw2,3);
|
|
||||||
yp1[j+8] = _mm_extract_epi16(tmpe_cw2,4);
|
|
||||||
yp2[j+8] = _mm_extract_epi16(tmpe_cw2,5);
|
|
||||||
#ifdef DEBUG_LOGMAP
|
|
||||||
fprintf(fdavx2,"init1: j %d, s[j] %d yp1[j] %d yp2[j] %d\n",((j>>4)<<3)+(j&7),s[j],yp1[j],yp2[j]);
|
|
||||||
fprintf(fdavx2b,"init1: j %d, s[j] %d yp1[j] %d yp2[j] %d\n",((j>>4)<<3)+(j&7),s[j+8],yp1[j+8],yp2[j+8]);
|
|
||||||
#endif
|
|
||||||
j=pi2_p[2];
|
|
||||||
|
|
||||||
s[j] = _mm_extract_epi16(tmpe,6);
|
|
||||||
yp1[j] = _mm_extract_epi16(tmpe,7);
|
|
||||||
tmpe = _mm_load_si128(&yp128[1]);
|
|
||||||
yp2[j] = _mm_extract_epi16(tmpe,0);
|
|
||||||
s[j+8] = _mm_extract_epi16(tmpe_cw2,6);
|
|
||||||
yp1[j+8] = _mm_extract_epi16(tmpe_cw2,7);
|
|
||||||
tmpe_cw2 = _mm_load_si128(&yp128_cw2[1]);
|
|
||||||
yp2[j+8] = _mm_extract_epi16(tmpe_cw2,0);
|
|
||||||
#ifdef DEBUG_LOGMAP
|
|
||||||
fprintf(fdavx2,"init2: j %d, s[j] %d yp1[j] %d yp2[j] %d\n",((j>>4)<<3)+(j&7),s[j],yp1[j],yp2[j]);
|
|
||||||
fprintf(fdavx2b,"init2: j %d, s[j] %d yp1[j] %d yp2[j] %d\n",((j>>4)<<3)+(j&7),s[j+8],yp1[j+8],yp2[j+8]);
|
|
||||||
#endif
|
|
||||||
j=pi2_p[3];
|
|
||||||
|
|
||||||
s[j] = _mm_extract_epi16(tmpe,1);
|
|
||||||
yp1[j] = _mm_extract_epi16(tmpe,2);
|
|
||||||
yp2[j] = _mm_extract_epi16(tmpe,3);
|
|
||||||
s[j+8] = _mm_extract_epi16(tmpe_cw2,1);
|
|
||||||
yp1[j+8] = _mm_extract_epi16(tmpe_cw2,2);
|
|
||||||
yp2[j+8] = _mm_extract_epi16(tmpe_cw2,3);
|
|
||||||
#ifdef DEBUG_LOGMAP
|
|
||||||
fprintf(fdavx2,"init3: j %d, s[j] %d yp1[j] %d yp2[j] %d\n",((j>>4)<<3)+(j&7),s[j],yp1[j],yp2[j]);
|
|
||||||
fprintf(fdavx2b,"init3: j %d, s[j] %d yp1[j] %d yp2[j] %d\n",((j>>4)<<3)+(j&7),s[j+8],yp1[j+8],yp2[j+8]);
|
|
||||||
#endif
|
|
||||||
j=pi2_p[4];
|
|
||||||
|
|
||||||
s[j] = _mm_extract_epi16(tmpe,4);
|
|
||||||
yp1[j] = _mm_extract_epi16(tmpe,5);
|
|
||||||
yp2[j] = _mm_extract_epi16(tmpe,6);
|
|
||||||
s[j+8] = _mm_extract_epi16(tmpe_cw2,4);
|
|
||||||
yp1[j+8] = _mm_extract_epi16(tmpe_cw2,5);
|
|
||||||
yp2[j+8] = _mm_extract_epi16(tmpe_cw2,6);
|
|
||||||
#ifdef DEBUG_LOGMAP
|
|
||||||
fprintf(fdavx2,"init4: j %d, s[j] %d yp1[j] %d yp2[j] %d\n",((j>>4)<<3)+(j&7),s[j],yp1[j],yp2[j]);
|
|
||||||
fprintf(fdavx2b,"init4: j %d, s[j] %d yp1[j] %d yp2[j] %d\n",((j>>4)<<3)+(j&7),s[j+8],yp1[j+8],yp2[j+8]);
|
|
||||||
#endif
|
|
||||||
j=pi2_p[5];
|
|
||||||
|
|
||||||
s[j] = _mm_extract_epi16(tmpe,7);
|
|
||||||
tmpe = _mm_load_si128(&yp128[2]);
|
|
||||||
yp1[j] = _mm_extract_epi16(tmpe,0);
|
|
||||||
yp2[j] = _mm_extract_epi16(tmpe,1);
|
|
||||||
s[j+8] = _mm_extract_epi16(tmpe_cw2,7);
|
|
||||||
tmpe_cw2 = _mm_load_si128(&yp128_cw2[2]);
|
|
||||||
yp1[j+8] = _mm_extract_epi16(tmpe_cw2,0);
|
|
||||||
yp2[j+8] = _mm_extract_epi16(tmpe_cw2,1);
|
|
||||||
#ifdef DEBUG_LOGMAP
|
|
||||||
fprintf(fdavx2,"init5: j %d, s[j] %d yp1[j] %d yp2[j] %d\n",((j>>4)<<3)+(j&7),s[j],yp1[j],yp2[j]);
|
|
||||||
fprintf(fdavx2b,"init5: j %d, s[j] %d yp1[j] %d yp2[j] %d\n",((j>>4)<<3)+(j&7),s[j+8],yp1[j+8],yp2[j+8]);
|
|
||||||
#endif
|
|
||||||
j=pi2_p[6];
|
|
||||||
|
|
||||||
s[j] = _mm_extract_epi16(tmpe,2);
|
|
||||||
yp1[j] = _mm_extract_epi16(tmpe,3);
|
|
||||||
yp2[j] = _mm_extract_epi16(tmpe,4);
|
|
||||||
s[j+8] = _mm_extract_epi16(tmpe_cw2,2);
|
|
||||||
yp1[j+8] = _mm_extract_epi16(tmpe_cw2,3);
|
|
||||||
yp2[j+8] = _mm_extract_epi16(tmpe_cw2,4);
|
|
||||||
#ifdef DEBUG_LOGMAP
|
|
||||||
fprintf(fdavx2,"init6: j %d, s[j] %d yp1[j] %d yp2[j] %d\n",((j>>4)<<3)+(j&7),s[j],yp1[j],yp2[j]);
|
|
||||||
fprintf(fdavx2b,"init6: j %d, s[j] %d yp1[j] %d yp2[j] %d\n",((j>>4)<<3)+(j&7),s[j+8],yp1[j+8],yp2[j+8]);
|
|
||||||
#endif
|
|
||||||
j=pi2_p[7];
|
|
||||||
|
|
||||||
s[j] = _mm_extract_epi16(tmpe,5);
|
|
||||||
yp1[j] = _mm_extract_epi16(tmpe,6);
|
|
||||||
yp2[j] = _mm_extract_epi16(tmpe,7);
|
|
||||||
s[j+8] = _mm_extract_epi16(tmpe_cw2,5);
|
|
||||||
yp1[j+8] = _mm_extract_epi16(tmpe_cw2,6);
|
|
||||||
yp2[j+8] = _mm_extract_epi16(tmpe_cw2,7);
|
|
||||||
#ifdef DEBUG_LOGMAP
|
|
||||||
fprintf(fdavx2,"init7: j %d, s[j] %d yp1[j] %d yp2[j] %d\n",((j>>4)<<3)+(j&7),s[j],yp1[j],yp2[j]);
|
|
||||||
fprintf(fdavx2b,"init7: j %d, s[j] %d yp1[j] %d yp2[j] %d\n",((j>>4)<<3)+(j&7),s[j+8],yp1[j+8],yp2[j+8]);
|
|
||||||
#endif
|
|
||||||
yp128+=3;
|
|
||||||
yp128_cw2+=3;
|
|
||||||
|
|
||||||
}
|
|
||||||
yp=(llr_t*)yp128;
|
|
||||||
yp_cw2=(llr_t*)yp128_cw2;
|
|
||||||
#else
|
|
||||||
|
|
||||||
pi2_p = &pi2tab16avx2[iind][0];
|
pi2_p = &pi2tab16avx2[iind][0];
|
||||||
for (i=0,j=0; i<n; i++) {
|
for (i=0,j=0; i<n; i++) {
|
||||||
s[*pi2_p] = y[j];
|
s[*pi2_p] = y[j];
|
||||||
@@ -1128,8 +997,6 @@ unsigned char phy_threegpplte_turbo_decoder16avx2(int16_t *y,
|
|||||||
}
|
}
|
||||||
yp=(llr_t*)&y[j];
|
yp=(llr_t*)&y[j];
|
||||||
yp_cw2=(llr_t*)&y2[j];
|
yp_cw2=(llr_t*)&y2[j];
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
// Termination
|
// Termination
|
||||||
for (i=0; i<3; i++) {
|
for (i=0; i<3; i++) {
|
||||||
@@ -1417,8 +1284,6 @@ unsigned char phy_threegpplte_turbo_decoder16avx2(int16_t *y,
|
|||||||
uint8_t *decoded_bytes,
|
uint8_t *decoded_bytes,
|
||||||
uint8_t *decoded_bytes2,
|
uint8_t *decoded_bytes2,
|
||||||
uint16_t n,
|
uint16_t n,
|
||||||
uint16_t f1,
|
|
||||||
uint16_t f2,
|
|
||||||
uint8_t max_iterations,
|
uint8_t max_iterations,
|
||||||
uint8_t crc_type,
|
uint8_t crc_type,
|
||||||
uint8_t F,
|
uint8_t F,
|
||||||
|
|||||||
@@ -41,7 +41,6 @@
|
|||||||
#include "PHY/defs.h"
|
#include "PHY/defs.h"
|
||||||
#include "PHY/CODING/defs.h"
|
#include "PHY/CODING/defs.h"
|
||||||
#include "PHY/CODING/lte_interleaver_inline.h"
|
#include "PHY/CODING/lte_interleaver_inline.h"
|
||||||
#include "extern_3GPPinterleaver.h"
|
|
||||||
#else
|
#else
|
||||||
|
|
||||||
#include "defs.h"
|
#include "defs.h"
|
||||||
@@ -1983,8 +1982,6 @@ void init_td()
|
|||||||
unsigned char phy_threegpplte_turbo_decoder(short *y,
|
unsigned char phy_threegpplte_turbo_decoder(short *y,
|
||||||
unsigned char *decoded_bytes,
|
unsigned char *decoded_bytes,
|
||||||
unsigned short n,
|
unsigned short n,
|
||||||
unsigned short f1,
|
|
||||||
unsigned short f2,
|
|
||||||
unsigned char max_iterations,
|
unsigned char max_iterations,
|
||||||
unsigned char crc_type,
|
unsigned char crc_type,
|
||||||
unsigned char F,
|
unsigned char F,
|
||||||
@@ -2620,8 +2617,6 @@ int test_logmap8()
|
|||||||
test[3] = 0x92;
|
test[3] = 0x92;
|
||||||
test[4] = 0xfe;
|
test[4] = 0xfe;
|
||||||
|
|
||||||
crcTableInit();
|
|
||||||
|
|
||||||
crc = crc24a(test,
|
crc = crc24a(test,
|
||||||
40)>>8;
|
40)>>8;
|
||||||
|
|
||||||
|
|||||||
@@ -45,7 +45,6 @@
|
|||||||
#include "PHY/defs_common.h"
|
#include "PHY/defs_common.h"
|
||||||
#include "PHY/CODING/coding_defs.h"
|
#include "PHY/CODING/coding_defs.h"
|
||||||
#include "PHY/CODING/lte_interleaver_inline.h"
|
#include "PHY/CODING/lte_interleaver_inline.h"
|
||||||
#include "extern_3GPPinterleaver.h"
|
|
||||||
#else
|
#else
|
||||||
|
|
||||||
#include "defs.h"
|
#include "defs.h"
|
||||||
@@ -233,9 +232,6 @@ void compute_alpha16(llr_t* alpha,llr_t* beta,llr_t* m_11,llr_t* m_10,unsigned s
|
|||||||
#if defined(__x86_64__) || defined(__i386__)
|
#if defined(__x86_64__) || defined(__i386__)
|
||||||
alpha128 = (__m128i *)alpha;
|
alpha128 = (__m128i *)alpha;
|
||||||
//#ifdef __AVX2__
|
//#ifdef __AVX2__
|
||||||
#if 0
|
|
||||||
alpha256 = (__m256i *)alpha;
|
|
||||||
#endif
|
|
||||||
#elif defined(__arm__)
|
#elif defined(__arm__)
|
||||||
alpha128 = (int16x8_t *)alpha;
|
alpha128 = (int16x8_t *)alpha;
|
||||||
#endif
|
#endif
|
||||||
@@ -317,10 +313,6 @@ void compute_alpha16(llr_t* alpha,llr_t* beta,llr_t* m_11,llr_t* m_10,unsigned s
|
|||||||
|
|
||||||
alpha_ptr = &alpha128[0];
|
alpha_ptr = &alpha128[0];
|
||||||
//#ifdef __AVX2__
|
//#ifdef __AVX2__
|
||||||
#if 0
|
|
||||||
alpha_ptr256 = &alpha256[0];
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if defined(__x86_64__) || defined(__i386__)
|
#if defined(__x86_64__) || defined(__i386__)
|
||||||
m11p = (__m128i*)m_11;
|
m11p = (__m128i*)m_11;
|
||||||
m10p = (__m128i*)m_10;
|
m10p = (__m128i*)m_10;
|
||||||
@@ -450,9 +442,6 @@ void compute_alpha16(llr_t* alpha,llr_t* beta,llr_t* m_11,llr_t* m_10,unsigned s
|
|||||||
|
|
||||||
alpha_ptr+=8;
|
alpha_ptr+=8;
|
||||||
//#ifdef __AVX2__
|
//#ifdef __AVX2__
|
||||||
#if 0
|
|
||||||
alpha_ptr256+=4;
|
|
||||||
#endif
|
|
||||||
m11p++;
|
m11p++;
|
||||||
m10p++;
|
m10p++;
|
||||||
#if defined(__x86_64__) || defined(__i386__)
|
#if defined(__x86_64__) || defined(__i386__)
|
||||||
@@ -1172,24 +1161,21 @@ void init_td16(void)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
unsigned char phy_threegpplte_turbo_decoder16(short *y,
|
uint8_t phy_threegpplte_turbo_decoder16(int16_t *y,
|
||||||
short *y2,
|
int16_t *y2,
|
||||||
unsigned char *decoded_bytes,
|
uint8_t *decoded_bytes,
|
||||||
unsigned char *decoded_bytes2,
|
uint8_t *decoded_bytes2,
|
||||||
unsigned short n,
|
uint16_t n,
|
||||||
unsigned short f1,
|
uint8_t max_iterations,
|
||||||
unsigned short f2,
|
uint8_t crc_type,
|
||||||
unsigned char max_iterations,
|
uint8_t F,
|
||||||
unsigned char crc_type,
|
time_stats_t *init_stats,
|
||||||
unsigned char F,
|
time_stats_t *alpha_stats,
|
||||||
time_stats_t *init_stats,
|
time_stats_t *beta_stats,
|
||||||
time_stats_t *alpha_stats,
|
time_stats_t *gamma_stats,
|
||||||
time_stats_t *beta_stats,
|
time_stats_t *ext_stats,
|
||||||
time_stats_t *gamma_stats,
|
time_stats_t *intl1_stats,
|
||||||
time_stats_t *ext_stats,
|
time_stats_t *intl2_stats) {
|
||||||
time_stats_t *intl1_stats,
|
|
||||||
time_stats_t *intl2_stats)
|
|
||||||
{
|
|
||||||
|
|
||||||
/* y is a pointer to the input
|
/* y is a pointer to the input
|
||||||
decoded_bytes is a pointer to the decoded output
|
decoded_bytes is a pointer to the decoded output
|
||||||
|
|||||||
@@ -42,7 +42,6 @@
|
|||||||
#include "PHY/defs_common.h"
|
#include "PHY/defs_common.h"
|
||||||
#include "PHY/CODING/coding_defs.h"
|
#include "PHY/CODING/coding_defs.h"
|
||||||
#include "PHY/CODING/lte_interleaver_inline.h"
|
#include "PHY/CODING/lte_interleaver_inline.h"
|
||||||
#include "extern_3GPPinterleaver.h"
|
|
||||||
#else
|
#else
|
||||||
|
|
||||||
#include "defs.h"
|
#include "defs.h"
|
||||||
@@ -427,67 +426,6 @@ void compute_beta8(llr_t* alpha,llr_t* beta,llr_t *m_11,llr_t* m_10,unsigned sho
|
|||||||
|
|
||||||
llr_t beta2,beta3,beta4,beta5,beta6,beta7;
|
llr_t beta2,beta3,beta4,beta5,beta6,beta7;
|
||||||
|
|
||||||
|
|
||||||
#if 0
|
|
||||||
int16_t m11,m10;
|
|
||||||
int16_t beta0_16,beta1_16,beta2_16,beta3_16,beta4_16,beta5_16,beta6_16,beta7_16,beta0_2,beta1_2,beta2_2,beta3_2,beta_m;
|
|
||||||
__m128i beta_16;
|
|
||||||
// termination for beta initialization
|
|
||||||
|
|
||||||
m11=(int16_t)m_11[2+frame_length];
|
|
||||||
m10=(int16_t)m_10[2+frame_length];
|
|
||||||
|
|
||||||
beta0 = -m11;//M0T_TERM;
|
|
||||||
beta1 = m11;//M1T_TERM;
|
|
||||||
m11=(int16_t)m_11[1+frame_length];
|
|
||||||
m10=(int16_t)m_10[1+frame_length];
|
|
||||||
|
|
||||||
beta0_2 = beta0-m11;//+M0T_TERM;
|
|
||||||
beta1_2 = beta0+m11;//+M1T_TERM;
|
|
||||||
beta2_2 = beta1+m10;//M2T_TERM;
|
|
||||||
beta3_2 = beta1-m10;//+M3T_TERM;
|
|
||||||
m11=(int16_t)m_11[frame_length];
|
|
||||||
m10=(int16_t)m_10[frame_length];
|
|
||||||
|
|
||||||
beta0_16 = beta0_2-m11;//+M0T_TERM;
|
|
||||||
beta1_16 = beta0_2+m11;//+M1T_TERM;
|
|
||||||
beta2_16 = beta1_2+m10;//+M2T_TERM;
|
|
||||||
beta3_16 = beta1_2-m10;//+M3T_TERM;
|
|
||||||
beta4_16 = beta2_2-m10;//+M4T_TERM;
|
|
||||||
beta5_16 = beta2_2+m10;//+M5T_TERM;
|
|
||||||
beta6_16 = beta3_2+m11;//+M6T_TERM;
|
|
||||||
beta7_16 = beta3_2-m11;//+M7T_TERM;
|
|
||||||
|
|
||||||
beta_m = (beta0_16>beta1_16) ? beta0_16 : beta1_16;
|
|
||||||
beta_m = (beta_m>beta2_16) ? beta_m : beta2_16;
|
|
||||||
beta_m = (beta_m>beta3_16) ? beta_m : beta3_16;
|
|
||||||
beta_m = (beta_m>beta4_16) ? beta_m : beta4_16;
|
|
||||||
beta_m = (beta_m>beta5_16) ? beta_m : beta5_16;
|
|
||||||
beta_m = (beta_m>beta6_16) ? beta_m : beta6_16;
|
|
||||||
beta_m = (beta_m>beta7_16) ? beta_m : beta7_16;
|
|
||||||
|
|
||||||
beta0_16=beta0_16-beta_m;
|
|
||||||
beta1_16=beta1_16-beta_m;
|
|
||||||
beta2_16=beta2_16-beta_m;
|
|
||||||
beta3_16=beta3_16-beta_m;
|
|
||||||
beta4_16=beta4_16-beta_m;
|
|
||||||
beta5_16=beta5_16-beta_m;
|
|
||||||
beta6_16=beta6_16-beta_m;
|
|
||||||
beta7_16=beta7_16-beta_m;
|
|
||||||
|
|
||||||
beta_16 = _mm_set_epi16(beta7_16,beta6_16,beta5_16,beta4_16,beta3_16,beta2_16,beta1_16,beta0_16);
|
|
||||||
beta_16 = _mm_packs_epi16(beta_16,beta_16);
|
|
||||||
beta0 = _mm_extract_epi8(beta_16,0);
|
|
||||||
beta1 = _mm_extract_epi8(beta_16,1);
|
|
||||||
beta2 = _mm_extract_epi8(beta_16,2);
|
|
||||||
beta3 = _mm_extract_epi8(beta_16,3);
|
|
||||||
beta4 = _mm_extract_epi8(beta_16,4);
|
|
||||||
beta5 = _mm_extract_epi8(beta_16,5);
|
|
||||||
beta6 = _mm_extract_epi8(beta_16,6);
|
|
||||||
beta7 = _mm_extract_epi8(beta_16,7);
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
||||||
if (frame_length > 6144) {
|
if (frame_length > 6144) {
|
||||||
LOG_E(PHY,"compute_beta: frame_length %d\n",frame_length);
|
LOG_E(PHY,"compute_beta: frame_length %d\n",frame_length);
|
||||||
return;
|
return;
|
||||||
@@ -897,25 +835,21 @@ void init_td8(void)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
unsigned char phy_threegpplte_turbo_decoder8(short *y,
|
uint8_t phy_threegpplte_turbo_decoder8(int16_t *y,
|
||||||
short y2,
|
int16_t *y2,
|
||||||
unsigned char *decoded_bytes,
|
uint8_t *decoded_bytes,
|
||||||
unsigned char *decoded_bytes2,
|
uint8_t *decoded_bytes2,
|
||||||
unsigned short n,
|
uint16_t n,
|
||||||
unsigned short f1,
|
uint8_t max_iterations,
|
||||||
unsigned short f2,
|
uint8_t crc_type,
|
||||||
unsigned char max_iterations,
|
uint8_t F,
|
||||||
unsigned char crc_type,
|
time_stats_t *init_stats,
|
||||||
unsigned char F,
|
time_stats_t *alpha_stats,
|
||||||
time_stats_t *init_stats,
|
time_stats_t *beta_stats,
|
||||||
time_stats_t *alpha_stats,
|
time_stats_t *gamma_stats,
|
||||||
time_stats_t *beta_stats,
|
time_stats_t *ext_stats,
|
||||||
time_stats_t *gamma_stats,
|
time_stats_t *intl1_stats,
|
||||||
time_stats_t *ext_stats,
|
time_stats_t *intl2_stats) {
|
||||||
time_stats_t *intl1_stats,
|
|
||||||
time_stats_t *intl2_stats)
|
|
||||||
{
|
|
||||||
|
|
||||||
/* y is a pointer to the input
|
/* y is a pointer to the input
|
||||||
decoded_bytes is a pointer to the decoded output
|
decoded_bytes is a pointer to the decoded output
|
||||||
n is the size in bits of the coded block, with the tail */
|
n is the size in bits of the coded block, with the tail */
|
||||||
@@ -1085,209 +1019,6 @@ unsigned char phy_threegpplte_turbo_decoder8(short *y,
|
|||||||
yp2[k]=*yp++;
|
yp2[k]=*yp++;
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif
|
|
||||||
#if 0
|
|
||||||
|
|
||||||
for (i=0; i<n2; i+=16) {
|
|
||||||
pi2_p = &pi2tab8[iind][i];
|
|
||||||
|
|
||||||
j=pi2_p[0];
|
|
||||||
#if defined(__x86_64__) || defined(__i386__)
|
|
||||||
s[j] = _mm_extract_epi8(yp128[0],0);
|
|
||||||
yp1[j] = _mm_extract_epi8(yp128[0],1);
|
|
||||||
yp2[j] = _mm_extract_epi8(yp128[0],2);
|
|
||||||
|
|
||||||
|
|
||||||
j=pi2_p[1];
|
|
||||||
s[j] = _mm_extract_epi8(yp128[0],3);
|
|
||||||
yp1[j] = _mm_extract_epi8(yp128[0],4);
|
|
||||||
yp2[j] = _mm_extract_epi8(yp128[0],5);
|
|
||||||
|
|
||||||
|
|
||||||
j=pi2_p[2];
|
|
||||||
s[j] = _mm_extract_epi8(yp128[0],6);
|
|
||||||
yp1[j] = _mm_extract_epi8(yp128[0],7);
|
|
||||||
yp2[j] = _mm_extract_epi8(yp128[0],8);
|
|
||||||
|
|
||||||
|
|
||||||
j=pi2_p[3];
|
|
||||||
s[j] = _mm_extract_epi8(yp128[0],9);
|
|
||||||
yp1[j] = _mm_extract_epi8(yp128[0],10);
|
|
||||||
yp2[j] = _mm_extract_epi8(yp128[0],11);
|
|
||||||
|
|
||||||
|
|
||||||
j=pi2_p[4];
|
|
||||||
s[j] = _mm_extract_epi8(yp128[0],12);
|
|
||||||
yp1[j] = _mm_extract_epi8(yp128[0],13);
|
|
||||||
yp2[j] = _mm_extract_epi8(yp128[0],14);
|
|
||||||
|
|
||||||
|
|
||||||
j=pi2_p[5];
|
|
||||||
s[j] = _mm_extract_epi8(yp128[0],15);
|
|
||||||
yp1[j] = _mm_extract_epi8(yp128[1],0);
|
|
||||||
yp2[j] = _mm_extract_epi8(yp128[1],1);
|
|
||||||
|
|
||||||
|
|
||||||
j=pi2_p[6];
|
|
||||||
s[j] = _mm_extract_epi8(yp128[1],2);
|
|
||||||
yp1[j] = _mm_extract_epi8(yp128[1],3);
|
|
||||||
yp2[j] = _mm_extract_epi8(yp128[1],4);
|
|
||||||
|
|
||||||
|
|
||||||
j=pi2_p[7];
|
|
||||||
s[j] = _mm_extract_epi8(yp128[1],5);
|
|
||||||
yp1[j] = _mm_extract_epi8(yp128[1],6);
|
|
||||||
yp2[j] = _mm_extract_epi8(yp128[1],7);
|
|
||||||
|
|
||||||
|
|
||||||
j=pi2_p[8];
|
|
||||||
s[j] = _mm_extract_epi8(yp128[1],8);
|
|
||||||
yp1[j] = _mm_extract_epi8(yp128[1],9);
|
|
||||||
yp2[j] = _mm_extract_epi8(yp128[1],10);
|
|
||||||
|
|
||||||
|
|
||||||
j=pi2_p[9];
|
|
||||||
s[j] = _mm_extract_epi8(yp128[1],11);
|
|
||||||
yp1[j] = _mm_extract_epi8(yp128[1],12);
|
|
||||||
yp2[j] = _mm_extract_epi8(yp128[1],13);
|
|
||||||
|
|
||||||
|
|
||||||
j=pi2_p[10];
|
|
||||||
s[j] = _mm_extract_epi8(yp128[1],14);
|
|
||||||
yp1[j] = _mm_extract_epi8(yp128[1],15);
|
|
||||||
yp2[j] = _mm_extract_epi8(yp128[2],0);
|
|
||||||
|
|
||||||
|
|
||||||
j=pi2_p[11];
|
|
||||||
s[j] = _mm_extract_epi8(yp128[2],1);
|
|
||||||
yp1[j] = _mm_extract_epi8(yp128[2],2);
|
|
||||||
yp2[j] = _mm_extract_epi8(yp128[2],3);
|
|
||||||
|
|
||||||
|
|
||||||
j=pi2_p[12];
|
|
||||||
s[j] = _mm_extract_epi8(yp128[2],4);
|
|
||||||
yp1[j] = _mm_extract_epi8(yp128[2],5);
|
|
||||||
yp2[j] = _mm_extract_epi8(yp128[2],6);
|
|
||||||
|
|
||||||
|
|
||||||
j=pi2_p[13];
|
|
||||||
s[j] = _mm_extract_epi8(yp128[2],7);
|
|
||||||
yp1[j] = _mm_extract_epi8(yp128[2],8);
|
|
||||||
yp2[j] = _mm_extract_epi8(yp128[2],9);
|
|
||||||
|
|
||||||
|
|
||||||
j=pi2_p[14];
|
|
||||||
s[j] = _mm_extract_epi8(yp128[2],10);
|
|
||||||
yp1[j] = _mm_extract_epi8(yp128[2],11);
|
|
||||||
yp2[j] = _mm_extract_epi8(yp128[2],12);
|
|
||||||
|
|
||||||
|
|
||||||
j=pi2_p[15];
|
|
||||||
s[j] = _mm_extract_epi8(yp128[2],13);
|
|
||||||
yp1[j] = _mm_extract_epi8(yp128[2],14);
|
|
||||||
yp2[j] = _mm_extract_epi8(yp128[2],15);
|
|
||||||
|
|
||||||
|
|
||||||
#elif defined(__arm__)
|
|
||||||
s[j] = vgetq_lane_s8(yp128[0],0);
|
|
||||||
yp1[j] = vgetq_lane_s8(yp128[0],1);
|
|
||||||
yp2[j] = vgetq_lane_s8(yp128[0],2);
|
|
||||||
|
|
||||||
|
|
||||||
j=pi2_p[1];
|
|
||||||
s[j] = vgetq_lane_s8(yp128[0],3);
|
|
||||||
yp1[j] = vgetq_lane_s8(yp128[0],4);
|
|
||||||
yp2[j] = vgetq_lane_s8(yp128[0],5);
|
|
||||||
|
|
||||||
|
|
||||||
j=pi2_p[2];
|
|
||||||
s[j] = vgetq_lane_s8(yp128[0],6);
|
|
||||||
yp1[j] = vgetq_lane_s8(yp128[0],7);
|
|
||||||
yp2[j] = vgetq_lane_s8(yp128[0],8);
|
|
||||||
|
|
||||||
|
|
||||||
j=pi2_p[3];
|
|
||||||
s[j] = vgetq_lane_s8(yp128[0],9);
|
|
||||||
yp1[j] = vgetq_lane_s8(yp128[0],10);
|
|
||||||
yp2[j] = vgetq_lane_s8(yp128[0],11);
|
|
||||||
|
|
||||||
|
|
||||||
j=pi2_p[4];
|
|
||||||
s[j] = vgetq_lane_s8(yp128[0],12);
|
|
||||||
yp1[j] = vgetq_lane_s8(yp128[0],13);
|
|
||||||
yp2[j] = vgetq_lane_s8(yp128[0],14);
|
|
||||||
|
|
||||||
|
|
||||||
j=pi2_p[5];
|
|
||||||
s[j] = vgetq_lane_s8(yp128[0],15);
|
|
||||||
yp1[j] = vgetq_lane_s8(yp128[1],0);
|
|
||||||
yp2[j] = vgetq_lane_s8(yp128[1],1);
|
|
||||||
|
|
||||||
|
|
||||||
j=pi2_p[6];
|
|
||||||
s[j] = vgetq_lane_s8(yp128[1],2);
|
|
||||||
yp1[j] = vgetq_lane_s8(yp128[1],3);
|
|
||||||
yp2[j] = vgetq_lane_s8(yp128[1],4);
|
|
||||||
|
|
||||||
|
|
||||||
j=pi2_p[7];
|
|
||||||
s[j] = vgetq_lane_s8(yp128[1],5);
|
|
||||||
yp1[j] = vgetq_lane_s8(yp128[1],6);
|
|
||||||
yp2[j] = vgetq_lane_s8(yp128[1],7);
|
|
||||||
|
|
||||||
|
|
||||||
j=pi2_p[8];
|
|
||||||
s[j] = vgetq_lane_s8(yp128[1],8);
|
|
||||||
yp1[j] = vgetq_lane_s8(yp128[1],9);
|
|
||||||
yp2[j] = vgetq_lane_s8(yp128[1],10);
|
|
||||||
|
|
||||||
|
|
||||||
j=pi2_p[9];
|
|
||||||
s[j] = vgetq_lane_s8(yp128[1],11);
|
|
||||||
yp1[j] = vgetq_lane_s8(yp128[1],12);
|
|
||||||
yp2[j] = vgetq_lane_s8(yp128[1],13);
|
|
||||||
|
|
||||||
|
|
||||||
j=pi2_p[10];
|
|
||||||
s[j] = vgetq_lane_s8(yp128[1],14);
|
|
||||||
yp1[j] = vgetq_lane_s8(yp128[1],15);
|
|
||||||
yp2[j] = vgetq_lane_s8(yp128[2],0);
|
|
||||||
|
|
||||||
|
|
||||||
j=pi2_p[11];
|
|
||||||
s[j] = vgetq_lane_s8(yp128[2],1);
|
|
||||||
yp1[j] = vgetq_lane_s8(yp128[2],2);
|
|
||||||
yp2[j] = vgetq_lane_s8(yp128[2],3);
|
|
||||||
|
|
||||||
|
|
||||||
j=pi2_p[12];
|
|
||||||
s[j] = vgetq_lane_s8(yp128[2],4);
|
|
||||||
yp1[j] = vgetq_lane_s8(yp128[2],5);
|
|
||||||
yp2[j] = vgetq_lane_s8(yp128[2],6);
|
|
||||||
|
|
||||||
|
|
||||||
j=pi2_p[13];
|
|
||||||
s[j] = vgetq_lane_s8(yp128[2],7);
|
|
||||||
yp1[j] = vgetq_lane_s8(yp128[2],8);
|
|
||||||
yp2[j] = vgetq_lane_s8(yp128[2],9);
|
|
||||||
|
|
||||||
|
|
||||||
j=pi2_p[14];
|
|
||||||
s[j] = vgetq_lane_s8(yp128[2],10);
|
|
||||||
yp1[j] = vgetq_lane_s8(yp128[2],11);
|
|
||||||
yp2[j] = vgetq_lane_s8(yp128[2],12);
|
|
||||||
|
|
||||||
|
|
||||||
j=pi2_p[15];
|
|
||||||
s[j] = vgetq_lane_s8(yp128[2],13);
|
|
||||||
yp1[j] = vgetq_lane_s8(yp128[2],14);
|
|
||||||
yp2[j] = vgetq_lane_s8(yp128[2],15);
|
|
||||||
|
|
||||||
#endif
|
|
||||||
yp128+=3;
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
yp=(llr_t*)yp128;
|
yp=(llr_t*)yp128;
|
||||||
@@ -1339,7 +1070,6 @@ unsigned char phy_threegpplte_turbo_decoder8(short *y,
|
|||||||
// do log_map from first parity bit
|
// do log_map from first parity bit
|
||||||
|
|
||||||
log_map8(systematic0,yparity1,m11,m10,alpha,beta,ext,n2,0,F,offset8_flag,alpha_stats,beta_stats,gamma_stats,ext_stats);
|
log_map8(systematic0,yparity1,m11,m10,alpha,beta,ext,n2,0,F,offset8_flag,alpha_stats,beta_stats,gamma_stats,ext_stats);
|
||||||
|
|
||||||
while (iteration_cnt++ < max_iterations) {
|
while (iteration_cnt++ < max_iterations) {
|
||||||
|
|
||||||
#ifdef DEBUG_LOGMAP
|
#ifdef DEBUG_LOGMAP
|
||||||
|
|||||||
@@ -36,7 +36,6 @@
|
|||||||
|
|
||||||
#include "UTIL/LOG/log.h"
|
#include "UTIL/LOG/log.h"
|
||||||
|
|
||||||
//#include "PHY/CODING/lte_interleaver.h"
|
|
||||||
//#include "PHY/CODING/lte_interleaver_inline.h"
|
//#include "PHY/CODING/lte_interleaver_inline.h"
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -29,7 +29,6 @@
|
|||||||
#include "ARCH/CBMIMO1/DEVICE_DRIVER/vars.h"
|
#include "ARCH/CBMIMO1/DEVICE_DRIVER/vars.h"
|
||||||
#include "MAC_INTERFACE/vars.h"
|
#include "MAC_INTERFACE/vars.h"
|
||||||
#include "PHY/CODING/defs.h"
|
#include "PHY/CODING/defs.h"
|
||||||
//#include "PHY/CODING/lte_interleaver.h"
|
|
||||||
//#include "PHY/CODING/lte_interleaver_inline.h"
|
//#include "PHY/CODING/lte_interleaver_inline.h"
|
||||||
|
|
||||||
|
|
||||||
@@ -52,8 +51,6 @@ void lte_param_init(unsigned char N_tx, unsigned char N_rx)
|
|||||||
randominit(0);
|
randominit(0);
|
||||||
set_taus_seed(0);
|
set_taus_seed(0);
|
||||||
|
|
||||||
crcTableInit();
|
|
||||||
|
|
||||||
lte_frame_parms = &(PHY_config->lte_frame_parms); //openair1/PHY/impl_defs_lte.h
|
lte_frame_parms = &(PHY_config->lte_frame_parms); //openair1/PHY/impl_defs_lte.h
|
||||||
lte_ue_common_vars = &(PHY_vars->lte_ue_common_vars);
|
lte_ue_common_vars = &(PHY_vars->lte_ue_common_vars);
|
||||||
lte_ue_dlsch_vars = &(PHY_vars->lte_ue_dlsch_vars);
|
lte_ue_dlsch_vars = &(PHY_vars->lte_ue_dlsch_vars);
|
||||||
@@ -249,7 +246,6 @@ int main(int argc, char *argv[])
|
|||||||
randominit(0);
|
randominit(0);
|
||||||
set_taus_seed(0);
|
set_taus_seed(0);
|
||||||
|
|
||||||
crcTableInit();
|
|
||||||
ccodelte_init();
|
ccodelte_init();
|
||||||
ccodelte_init_inv();
|
ccodelte_init_inv();
|
||||||
|
|
||||||
|
|||||||
@@ -218,8 +218,6 @@ int main(int argc, char *argv[])
|
|||||||
randominit();
|
randominit();
|
||||||
set_taus_seed();
|
set_taus_seed();
|
||||||
|
|
||||||
crcTableInit();
|
|
||||||
|
|
||||||
printf("EbN0, sigma, BER, FER\n");
|
printf("EbN0, sigma, BER, FER\n");
|
||||||
|
|
||||||
for (SNR=0; SNR<10; SNR++) {
|
for (SNR=0; SNR<10; SNR++) {
|
||||||
|
|||||||
@@ -28,8 +28,7 @@
|
|||||||
#define __CODING_DEFS__H__
|
#define __CODING_DEFS__H__
|
||||||
|
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
|
#include <PHY/defs_common.h>
|
||||||
#include "PHY/defs_common.h"
|
|
||||||
|
|
||||||
#define CRC24_A 0
|
#define CRC24_A 0
|
||||||
#define CRC24_B 1
|
#define CRC24_B 1
|
||||||
@@ -39,7 +38,24 @@
|
|||||||
#define MAX_TURBO_ITERATIONS_MBSFN 8
|
#define MAX_TURBO_ITERATIONS_MBSFN 8
|
||||||
#define MAX_TURBO_ITERATIONS max_turbo_iterations
|
#define MAX_TURBO_ITERATIONS max_turbo_iterations
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
unsigned short nb_bits;
|
||||||
|
unsigned short f1;
|
||||||
|
unsigned short f2;
|
||||||
|
} interleaver_TS_36_212_t;
|
||||||
|
|
||||||
|
extern const interleaver_TS_36_212_t f1f2[188];
|
||||||
|
|
||||||
#define LTE_NULL 2
|
#define LTE_NULL 2
|
||||||
|
typedef struct interleaver_codebook {
|
||||||
|
unsigned long nb_bits;
|
||||||
|
unsigned short f1;
|
||||||
|
unsigned short f2;
|
||||||
|
unsigned int beg_index;
|
||||||
|
} t_interleaver_codebook;
|
||||||
|
extern t_interleaver_codebook *f1f2mat;
|
||||||
|
extern short *il_tb;
|
||||||
|
|
||||||
|
|
||||||
/** @addtogroup _PHY_CODING_BLOCKS_
|
/** @addtogroup _PHY_CODING_BLOCKS_
|
||||||
* @{
|
* @{
|
||||||
@@ -321,7 +337,7 @@ void ccodedab_init_inv(void);
|
|||||||
|
|
||||||
/*!\fn void crcTableInit(void)
|
/*!\fn void crcTableInit(void)
|
||||||
\brief This function initializes the different crc tables.*/
|
\brief This function initializes the different crc tables.*/
|
||||||
void crcTableInit (void);
|
//void crcTableInit (void);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@@ -331,7 +347,7 @@ based on 3GPP UMTS/LTE specifications.
|
|||||||
@param inPtr Pointer to input byte stream
|
@param inPtr Pointer to input byte stream
|
||||||
@param bitlen length of inputs in bits
|
@param bitlen length of inputs in bits
|
||||||
*/
|
*/
|
||||||
uint32_t crc24a (uint8_t *inPtr, int32_t bitlen);
|
uint32_t crc24a (uint8_t * inptr, uint32_t bitlen);
|
||||||
|
|
||||||
/*!\fn uint32_t crc24b(uint8_t *inPtr, int32_t bitlen)
|
/*!\fn uint32_t crc24b(uint8_t *inPtr, int32_t bitlen)
|
||||||
\brief This computes a 24-bit crc ('b' variant for transport-block segments)
|
\brief This computes a 24-bit crc ('b' variant for transport-block segments)
|
||||||
@@ -339,25 +355,25 @@ based on 3GPP UMTS/LTE specifications.
|
|||||||
@param inPtr Pointer to input byte stream
|
@param inPtr Pointer to input byte stream
|
||||||
@param bitlen length of inputs in bits
|
@param bitlen length of inputs in bits
|
||||||
*/
|
*/
|
||||||
uint32_t crc24b (uint8_t *inPtr, int32_t bitlen);
|
uint32_t crc24b (uint8_t * inptr, uint32_t bitlen);
|
||||||
|
|
||||||
/*!\fn uint32_t crc16(uint8_t *inPtr, int32_t bitlen)
|
/*!\fn uint32_t crc16(uint8_t *inPtr, int32_t bitlen)
|
||||||
\brief This computes a 16-bit crc based on 3GPP UMTS specifications.
|
\brief This computes a 16-bit crc based on 3GPP UMTS specifications.
|
||||||
@param inPtr Pointer to input byte stream
|
@param inPtr Pointer to input byte stream
|
||||||
@param bitlen length of inputs in bits*/
|
@param bitlen length of inputs in bits*/
|
||||||
uint32_t crc16 (uint8_t *inPtr, int32_t bitlen);
|
uint32_t crc16 (uint8_t * inptr, uint32_t bitlen);
|
||||||
|
|
||||||
/*!\fn uint32_t crc12(uint8_t *inPtr, int32_t bitlen)
|
/*!\fn uint32_t crc12(uint8_t *inPtr, int32_t bitlen)
|
||||||
\brief This computes a 12-bit crc based on 3GPP UMTS specifications.
|
\brief This computes a 12-bit crc based on 3GPP UMTS specifications.
|
||||||
@param inPtr Pointer to input byte stream
|
@param inPtr Pointer to input byte stream
|
||||||
@param bitlen length of inputs in bits*/
|
@param bitlen length of inputs in bits*/
|
||||||
uint32_t crc12 (uint8_t *inPtr, int32_t bitlen);
|
uint32_t crc12 (uint8_t * inptr, uint32_t bitlen);
|
||||||
|
|
||||||
/*!\fn uint32_t crc8(uint8_t *inPtr, int32_t bitlen)
|
/*!\fn uint32_t crc8(uint8_t *inPtr, int32_t bitlen)
|
||||||
\brief This computes a 8-bit crc based on 3GPP UMTS specifications.
|
\brief This computes a 8-bit crc based on 3GPP UMTS specifications.
|
||||||
@param inPtr Pointer to input byte stream
|
@param inPtr Pointer to input byte stream
|
||||||
@param bitlen length of inputs in bits*/
|
@param bitlen length of inputs in bits*/
|
||||||
uint32_t crc8 (uint8_t *inPtr, int32_t bitlen);
|
uint32_t crc8 (uint8_t * inptr, uint32_t bitlen);
|
||||||
|
|
||||||
/*!\fn void phy_viterbi_dot11_sse2(int8_t *y, uint8_t *decoded_bytes, uint16_t n,int offset,int traceback)
|
/*!\fn void phy_viterbi_dot11_sse2(int8_t *y, uint8_t *decoded_bytes, uint16_t n,int offset,int traceback)
|
||||||
\brief This routine performs a SIMD optmized Viterbi decoder for the 802.11 64-state convolutional code. It can be
|
\brief This routine performs a SIMD optmized Viterbi decoder for the 802.11 64-state convolutional code. It can be
|
||||||
@@ -422,4 +438,8 @@ uint32_t crcbit (uint8_t * ,
|
|||||||
int16_t reverseBits(int32_t ,int32_t);
|
int16_t reverseBits(int32_t ,int32_t);
|
||||||
void phy_viterbi_dot11(int8_t *,uint8_t *,uint16_t);
|
void phy_viterbi_dot11(int8_t *,uint8_t *,uint16_t);
|
||||||
|
|
||||||
|
decoder_if_t phy_threegpplte_turbo_decoder;
|
||||||
|
decoder_if_t phy_threegpplte_turbo_decoder8;
|
||||||
|
decoder_if_t phy_threegpplte_turbo_decoder16;
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -19,10 +19,9 @@
|
|||||||
* contact@openairinterface.org
|
* contact@openairinterface.org
|
||||||
*/
|
*/
|
||||||
|
|
||||||
extern unsigned short f1f2mat_old[2*188];
|
|
||||||
extern double cpuf;
|
extern double cpuf;
|
||||||
extern decoder_if_t decoder16;
|
extern decoder_if_t *decoder16;
|
||||||
extern decoder_if_t decoder8;
|
extern decoder_if_t *decoder8;
|
||||||
extern encoder_if_t encoder;
|
extern encoder_if_t *encoder;
|
||||||
extern int load_codinglib(void);
|
extern int load_codinglib(void);
|
||||||
extern int free_codinglib(void);
|
extern void free_codinglib(void);
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user