Merge remote-tracking branch 'origin/develop' into NR_UE_SA
This commit is contained in:
@@ -27,6 +27,9 @@ def nodeExecutor = params.nodeExecutor
|
|||||||
def doMandatoryTests = false
|
def doMandatoryTests = false
|
||||||
def doFullTestsuite = false
|
def doFullTestsuite = false
|
||||||
|
|
||||||
|
//
|
||||||
|
def gitCommitAuthorEmailAddr
|
||||||
|
|
||||||
pipeline {
|
pipeline {
|
||||||
agent {
|
agent {
|
||||||
label nodeExecutor
|
label nodeExecutor
|
||||||
@@ -152,21 +155,40 @@ pipeline {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
stage ("CppCheck Analysis") {
|
||||||
|
steps {
|
||||||
|
script {
|
||||||
|
triggerSlaveJob ('RAN-cppcheck', 'CppCheck Analysis')
|
||||||
|
}
|
||||||
|
}
|
||||||
|
post {
|
||||||
|
always {
|
||||||
|
script {
|
||||||
|
finalizeSlaveJob('RAN-cppcheck')
|
||||||
|
}
|
||||||
|
}
|
||||||
|
failure {
|
||||||
|
script {
|
||||||
|
currentBuild.result = 'FAILURE'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
post {
|
post {
|
||||||
always {
|
always {
|
||||||
script {
|
script {
|
||||||
|
def eSubject = JOB_NAME + ' - Build # ' + BUILD_ID + ' - ' + currentBuild.result + '!'
|
||||||
|
def eBody = "Hi,\n\n"
|
||||||
|
eBody += "Here are attached HTML report files for " + JOB_NAME + " - Build # " + BUILD_ID + " - " + currentBuild.result + "!\n\n"
|
||||||
|
eBody += "Regards,\n"
|
||||||
|
eBody += "OAI CI Team"
|
||||||
emailext attachmentsPattern: '*results*.html',
|
emailext attachmentsPattern: '*results*.html',
|
||||||
body: '''Hi,
|
body: eBody,
|
||||||
|
|
||||||
Here are attached HTML report files for $PROJECT_NAME - Build # $BUILD_NUMBER - $BUILD_STATUS!
|
|
||||||
|
|
||||||
Regards,
|
|
||||||
OAI CI Team''',
|
|
||||||
replyTo: 'no-reply@openairinterface.org',
|
replyTo: 'no-reply@openairinterface.org',
|
||||||
subject: '$PROJECT_NAME - Build # $BUILD_NUMBER - $BUILD_STATUS!',
|
subject: eSubject,
|
||||||
to: gitCommitAuthorEmailAddr
|
to: gitCommitAuthorEmailAddr
|
||||||
|
|
||||||
if (fileExists('.git/CI_COMMIT_MSG')) {
|
if (fileExists('.git/CI_COMMIT_MSG')) {
|
||||||
|
|||||||
@@ -226,27 +226,8 @@ pipeline {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
stage ("Start VM -- cppcheck") {
|
|
||||||
steps {
|
|
||||||
lock (vmResource) {
|
|
||||||
timeout (time: 7, unit: 'MINUTES') {
|
|
||||||
sh "./ci-scripts/oai-ci-vm-tool build --workspace $WORKSPACE --variant cppcheck --job-name ${JOB_NAME} --build-id ${BUILD_ID} --daemon"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
stage ("Variant Builds") {
|
stage ("Variant Builds") {
|
||||||
parallel {
|
parallel {
|
||||||
stage ("Analysis with cppcheck") {
|
|
||||||
steps {
|
|
||||||
gitlabCommitStatus(name: "Analysis with cppcheck") {
|
|
||||||
timeout (time: 30, unit: 'MINUTES') {
|
|
||||||
sh "./ci-scripts/oai-ci-vm-tool wait --workspace $WORKSPACE --variant cppcheck --job-name ${JOB_NAME} --build-id ${BUILD_ID}"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
stage ("Build basic simulator") {
|
stage ("Build basic simulator") {
|
||||||
steps {
|
steps {
|
||||||
gitlabCommitStatus(name: "Build basic-sim") {
|
gitlabCommitStatus(name: "Build basic-sim") {
|
||||||
@@ -315,9 +296,9 @@ pipeline {
|
|||||||
script {
|
script {
|
||||||
dir ('archives') {
|
dir ('archives') {
|
||||||
if (fileExists('red_hat')) {
|
if (fileExists('red_hat')) {
|
||||||
sh "zip -r -qq vm_build_logs.zip basic_sim enb_usrp phy_sim cppcheck enb_eth ue_eth gnb_usrp nr_ue_usrp red_hat"
|
sh "zip -r -qq vm_build_logs.zip basic_sim phy_sim enb_eth ue_eth gnb_usrp nr_ue_usrp red_hat"
|
||||||
} else {
|
} else {
|
||||||
sh "zip -r -qq vm_build_logs.zip basic_sim enb_usrp phy_sim cppcheck enb_eth ue_eth gnb_usrp nr_ue_usrp"
|
sh "zip -r -qq vm_build_logs.zip basic_sim phy_sim enb_eth ue_eth gnb_usrp nr_ue_usrp"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if(fileExists('archives/vm_build_logs.zip')) {
|
if(fileExists('archives/vm_build_logs.zip')) {
|
||||||
@@ -325,16 +306,6 @@ pipeline {
|
|||||||
}
|
}
|
||||||
if ("MERGE".equals(env.gitlabActionType)) {
|
if ("MERGE".equals(env.gitlabActionType)) {
|
||||||
sh "./ci-scripts/oai-ci-vm-tool report-build --workspace $WORKSPACE --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/oai-ci-vm-tool report-build --workspace $WORKSPACE --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}"
|
||||||
// If the merge request has introduced more CPPCHECK errors or warnings, notifications in GitLab
|
|
||||||
if (fileExists('oai_cppcheck_added_errors.txt')) {
|
|
||||||
def ret=readFile('./oai_cppcheck_added_errors.txt').trim();
|
|
||||||
if ("0".equals(ret)) {
|
|
||||||
echo "No added cppcheck warnings/errors in this merge request"
|
|
||||||
} else {
|
|
||||||
def message = "OAI " + JOB_NAME + " build (" + BUILD_ID + "): Some modified files in Merge Request MAY have INTRODUCED up to " + ret + " CPPCHECK errors/warnings"
|
|
||||||
addGitLabMRComment comment: message
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// If the merge request has introduced compilation warnings, notifications in GitLab
|
// If the merge request has introduced compilation warnings, notifications in GitLab
|
||||||
sh "./ci-scripts/checkAddedWarnings.sh --src-branch ${env.gitlabSourceBranch} --target-branch ${env.gitlabTargetBranch}"
|
sh "./ci-scripts/checkAddedWarnings.sh --src-branch ${env.gitlabSourceBranch} --target-branch ${env.gitlabTargetBranch}"
|
||||||
def res=readFile('./oai_warning_files.txt').trim();
|
def res=readFile('./oai_warning_files.txt').trim();
|
||||||
|
|||||||
@@ -41,7 +41,7 @@ import constants as CONST
|
|||||||
#-----------------------------------------------------------
|
#-----------------------------------------------------------
|
||||||
|
|
||||||
|
|
||||||
def ArgsParse(argvs,CiTestObj,RAN,HTML,EPC,ldpc,CONTAINERS,HELP):
|
def ArgsParse(argvs,CiTestObj,RAN,HTML,EPC,ldpc,CONTAINERS,HELP,SCA):
|
||||||
|
|
||||||
|
|
||||||
py_param_file_present = False
|
py_param_file_present = False
|
||||||
@@ -80,6 +80,7 @@ def ArgsParse(argvs,CiTestObj,RAN,HTML,EPC,ldpc,CONTAINERS,HELP):
|
|||||||
HTML.ranRepository=matchReg.group(1)
|
HTML.ranRepository=matchReg.group(1)
|
||||||
ldpc.ranRepository=matchReg.group(1)
|
ldpc.ranRepository=matchReg.group(1)
|
||||||
CONTAINERS.ranRepository=matchReg.group(1)
|
CONTAINERS.ranRepository=matchReg.group(1)
|
||||||
|
SCA.ranRepository=matchReg.group(1)
|
||||||
elif re.match('^\-\-eNB_AllowMerge=(.+)$|^\-\-ranAllowMerge=(.+)$', myArgv, re.IGNORECASE):
|
elif re.match('^\-\-eNB_AllowMerge=(.+)$|^\-\-ranAllowMerge=(.+)$', myArgv, re.IGNORECASE):
|
||||||
if re.match('^\-\-eNB_AllowMerge=(.+)$', myArgv, re.IGNORECASE):
|
if re.match('^\-\-eNB_AllowMerge=(.+)$', myArgv, re.IGNORECASE):
|
||||||
matchReg = re.match('^\-\-eNB_AllowMerge=(.+)$', myArgv, re.IGNORECASE)
|
matchReg = re.match('^\-\-eNB_AllowMerge=(.+)$', myArgv, re.IGNORECASE)
|
||||||
@@ -92,6 +93,7 @@ def ArgsParse(argvs,CiTestObj,RAN,HTML,EPC,ldpc,CONTAINERS,HELP):
|
|||||||
RAN.ranAllowMerge=True
|
RAN.ranAllowMerge=True
|
||||||
HTML.ranAllowMerge=True
|
HTML.ranAllowMerge=True
|
||||||
CONTAINERS.ranAllowMerge=True
|
CONTAINERS.ranAllowMerge=True
|
||||||
|
SCA.ranAllowMerge=True
|
||||||
elif re.match('^\-\-eNBBranch=(.+)$|^\-\-ranBranch=(.+)$', myArgv, re.IGNORECASE):
|
elif re.match('^\-\-eNBBranch=(.+)$|^\-\-ranBranch=(.+)$', myArgv, re.IGNORECASE):
|
||||||
if re.match('^\-\-eNBBranch=(.+)$', myArgv, re.IGNORECASE):
|
if re.match('^\-\-eNBBranch=(.+)$', myArgv, re.IGNORECASE):
|
||||||
matchReg = re.match('^\-\-eNBBranch=(.+)$', myArgv, re.IGNORECASE)
|
matchReg = re.match('^\-\-eNBBranch=(.+)$', myArgv, re.IGNORECASE)
|
||||||
@@ -102,6 +104,7 @@ def ArgsParse(argvs,CiTestObj,RAN,HTML,EPC,ldpc,CONTAINERS,HELP):
|
|||||||
HTML.ranBranch=matchReg.group(1)
|
HTML.ranBranch=matchReg.group(1)
|
||||||
ldpc.ranBranch=matchReg.group(1)
|
ldpc.ranBranch=matchReg.group(1)
|
||||||
CONTAINERS.ranBranch=matchReg.group(1)
|
CONTAINERS.ranBranch=matchReg.group(1)
|
||||||
|
SCA.ranBranch=matchReg.group(1)
|
||||||
elif re.match('^\-\-eNBCommitID=(.*)$|^\-\-ranCommitID=(.*)$', myArgv, re.IGNORECASE):
|
elif re.match('^\-\-eNBCommitID=(.*)$|^\-\-ranCommitID=(.*)$', myArgv, re.IGNORECASE):
|
||||||
if re.match('^\-\-eNBCommitID=(.*)$', myArgv, re.IGNORECASE):
|
if re.match('^\-\-eNBCommitID=(.*)$', myArgv, re.IGNORECASE):
|
||||||
matchReg = re.match('^\-\-eNBCommitID=(.*)$', myArgv, re.IGNORECASE)
|
matchReg = re.match('^\-\-eNBCommitID=(.*)$', myArgv, re.IGNORECASE)
|
||||||
@@ -112,6 +115,7 @@ def ArgsParse(argvs,CiTestObj,RAN,HTML,EPC,ldpc,CONTAINERS,HELP):
|
|||||||
HTML.ranCommitID=matchReg.group(1)
|
HTML.ranCommitID=matchReg.group(1)
|
||||||
ldpc.ranCommitID=matchReg.group(1)
|
ldpc.ranCommitID=matchReg.group(1)
|
||||||
CONTAINERS.ranCommitID=matchReg.group(1)
|
CONTAINERS.ranCommitID=matchReg.group(1)
|
||||||
|
SCA.ranCommitID=matchReg.group(1)
|
||||||
elif re.match('^\-\-eNBTargetBranch=(.*)$|^\-\-ranTargetBranch=(.*)$', myArgv, re.IGNORECASE):
|
elif re.match('^\-\-eNBTargetBranch=(.*)$|^\-\-ranTargetBranch=(.*)$', myArgv, re.IGNORECASE):
|
||||||
if re.match('^\-\-eNBTargetBranch=(.*)$', myArgv, re.IGNORECASE):
|
if re.match('^\-\-eNBTargetBranch=(.*)$', myArgv, re.IGNORECASE):
|
||||||
matchReg = re.match('^\-\-eNBTargetBranch=(.*)$', myArgv, re.IGNORECASE)
|
matchReg = re.match('^\-\-eNBTargetBranch=(.*)$', myArgv, re.IGNORECASE)
|
||||||
@@ -122,12 +126,14 @@ def ArgsParse(argvs,CiTestObj,RAN,HTML,EPC,ldpc,CONTAINERS,HELP):
|
|||||||
HTML.ranTargetBranch=matchReg.group(1)
|
HTML.ranTargetBranch=matchReg.group(1)
|
||||||
ldpc.ranTargetBranch=matchReg.group(1)
|
ldpc.ranTargetBranch=matchReg.group(1)
|
||||||
CONTAINERS.ranTargetBranch=matchReg.group(1)
|
CONTAINERS.ranTargetBranch=matchReg.group(1)
|
||||||
|
SCA.ranTargetBranch=matchReg.group(1)
|
||||||
elif re.match('^\-\-eNBIPAddress=(.+)$|^\-\-eNB[1-2]IPAddress=(.+)$', myArgv, re.IGNORECASE):
|
elif re.match('^\-\-eNBIPAddress=(.+)$|^\-\-eNB[1-2]IPAddress=(.+)$', myArgv, re.IGNORECASE):
|
||||||
if re.match('^\-\-eNBIPAddress=(.+)$', myArgv, re.IGNORECASE):
|
if re.match('^\-\-eNBIPAddress=(.+)$', myArgv, re.IGNORECASE):
|
||||||
matchReg = re.match('^\-\-eNBIPAddress=(.+)$', myArgv, re.IGNORECASE)
|
matchReg = re.match('^\-\-eNBIPAddress=(.+)$', myArgv, re.IGNORECASE)
|
||||||
RAN.eNBIPAddress=matchReg.group(1)
|
RAN.eNBIPAddress=matchReg.group(1)
|
||||||
ldpc.eNBIpAddr=matchReg.group(1)
|
ldpc.eNBIpAddr=matchReg.group(1)
|
||||||
CONTAINERS.eNBIPAddress=matchReg.group(1)
|
CONTAINERS.eNBIPAddress=matchReg.group(1)
|
||||||
|
SCA.eNBIPAddress=matchReg.group(1)
|
||||||
elif re.match('^\-\-eNB1IPAddress=(.+)$', myArgv, re.IGNORECASE):
|
elif re.match('^\-\-eNB1IPAddress=(.+)$', myArgv, re.IGNORECASE):
|
||||||
matchReg = re.match('^\-\-eNB1IPAddress=(.+)$', myArgv, re.IGNORECASE)
|
matchReg = re.match('^\-\-eNB1IPAddress=(.+)$', myArgv, re.IGNORECASE)
|
||||||
RAN.eNB1IPAddress=matchReg.group(1)
|
RAN.eNB1IPAddress=matchReg.group(1)
|
||||||
@@ -142,6 +148,7 @@ def ArgsParse(argvs,CiTestObj,RAN,HTML,EPC,ldpc,CONTAINERS,HELP):
|
|||||||
RAN.eNBUserName=matchReg.group(1)
|
RAN.eNBUserName=matchReg.group(1)
|
||||||
ldpc.eNBUserName=matchReg.group(1)
|
ldpc.eNBUserName=matchReg.group(1)
|
||||||
CONTAINERS.eNBUserName=matchReg.group(1)
|
CONTAINERS.eNBUserName=matchReg.group(1)
|
||||||
|
SCA.eNBUserName=matchReg.group(1)
|
||||||
elif re.match('^\-\-eNB1UserName=(.+)$', myArgv, re.IGNORECASE):
|
elif re.match('^\-\-eNB1UserName=(.+)$', myArgv, re.IGNORECASE):
|
||||||
matchReg = re.match('^\-\-eNB1UserName=(.+)$', myArgv, re.IGNORECASE)
|
matchReg = re.match('^\-\-eNB1UserName=(.+)$', myArgv, re.IGNORECASE)
|
||||||
RAN.eNB1UserName=matchReg.group(1)
|
RAN.eNB1UserName=matchReg.group(1)
|
||||||
@@ -156,6 +163,7 @@ def ArgsParse(argvs,CiTestObj,RAN,HTML,EPC,ldpc,CONTAINERS,HELP):
|
|||||||
RAN.eNBPassword=matchReg.group(1)
|
RAN.eNBPassword=matchReg.group(1)
|
||||||
ldpc.eNBPassWord=matchReg.group(1)
|
ldpc.eNBPassWord=matchReg.group(1)
|
||||||
CONTAINERS.eNBPassword=matchReg.group(1)
|
CONTAINERS.eNBPassword=matchReg.group(1)
|
||||||
|
SCA.eNBPassword=matchReg.group(1)
|
||||||
elif re.match('^\-\-eNB1Password=(.+)$', myArgv, re.IGNORECASE):
|
elif re.match('^\-\-eNB1Password=(.+)$', myArgv, re.IGNORECASE):
|
||||||
matchReg = re.match('^\-\-eNB1Password=(.+)$', myArgv, re.IGNORECASE)
|
matchReg = re.match('^\-\-eNB1Password=(.+)$', myArgv, re.IGNORECASE)
|
||||||
RAN.eNB1Password=matchReg.group(1)
|
RAN.eNB1Password=matchReg.group(1)
|
||||||
@@ -170,6 +178,7 @@ def ArgsParse(argvs,CiTestObj,RAN,HTML,EPC,ldpc,CONTAINERS,HELP):
|
|||||||
RAN.eNBSourceCodePath=matchReg.group(1)
|
RAN.eNBSourceCodePath=matchReg.group(1)
|
||||||
ldpc.eNBSourceCodePath=matchReg.group(1)
|
ldpc.eNBSourceCodePath=matchReg.group(1)
|
||||||
CONTAINERS.eNBSourceCodePath=matchReg.group(1)
|
CONTAINERS.eNBSourceCodePath=matchReg.group(1)
|
||||||
|
SCA.eNBSourceCodePath=matchReg.group(1)
|
||||||
elif re.match('^\-\-eNB1SourceCodePath=(.+)$', myArgv, re.IGNORECASE):
|
elif re.match('^\-\-eNB1SourceCodePath=(.+)$', myArgv, re.IGNORECASE):
|
||||||
matchReg = re.match('^\-\-eNB1SourceCodePath=(.+)$', myArgv, re.IGNORECASE)
|
matchReg = re.match('^\-\-eNB1SourceCodePath=(.+)$', myArgv, re.IGNORECASE)
|
||||||
RAN.eNB1SourceCodePath=matchReg.group(1)
|
RAN.eNB1SourceCodePath=matchReg.group(1)
|
||||||
|
|||||||
@@ -1,216 +0,0 @@
|
|||||||
#!/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=.Rel15.txt
|
|
||||||
NB_PATTERN_FILES=7
|
|
||||||
|
|
||||||
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
|
|
||||||
echo "Expecting $NB_PATTERN_FILES log files and found $NB_FOUND_FILES"
|
|
||||||
STATUS=-1
|
|
||||||
fi
|
|
||||||
|
|
||||||
echo "COMMAND: build_oai -I -w USRP --eNB" > $ARCHIVES_LOC/build_final_status.log
|
|
||||||
if [ $STATUS -eq 0 ]
|
|
||||||
then
|
|
||||||
echo "BUILD_OK" >> $ARCHIVES_LOC/build_final_status.log
|
|
||||||
echo "STATUS seems OK"
|
|
||||||
else
|
|
||||||
echo "BUILD_KO" >> $ARCHIVES_LOC/build_final_status.log
|
|
||||||
echo "STATUS failed?"
|
|
||||||
fi
|
|
||||||
exit $STATUS
|
|
||||||
@@ -62,7 +62,7 @@ function build_on_vm {
|
|||||||
echo "ARCHIVES_LOC = $ARCHIVES_LOC"
|
echo "ARCHIVES_LOC = $ARCHIVES_LOC"
|
||||||
echo "BUILD_OPTIONS = $BUILD_OPTIONS"
|
echo "BUILD_OPTIONS = $BUILD_OPTIONS"
|
||||||
|
|
||||||
if [[ "$VM_NAME" == *"-enb-usrp"* ]]
|
if [[ "$VM_NAME" == *"-enb-usrp"* ]] || [[ "$VM_NAME" == *"-cppcheck"* ]]
|
||||||
then
|
then
|
||||||
echo "This VM type is no longer supported in the pipeline framework"
|
echo "This VM type is no longer supported in the pipeline framework"
|
||||||
return
|
return
|
||||||
|
|||||||
@@ -83,6 +83,7 @@ class Containerize():
|
|||||||
self.flexranCtrlDeployed = False
|
self.flexranCtrlDeployed = False
|
||||||
self.flexranCtrlIpAddress = ''
|
self.flexranCtrlIpAddress = ''
|
||||||
self.cli = ''
|
self.cli = ''
|
||||||
|
self.cliBuildOptions = ''
|
||||||
self.dockerfileprefix = ''
|
self.dockerfileprefix = ''
|
||||||
self.host = ''
|
self.host = ''
|
||||||
self.allImagesSize = {}
|
self.allImagesSize = {}
|
||||||
@@ -124,9 +125,11 @@ class Containerize():
|
|||||||
if self.host == 'Ubuntu':
|
if self.host == 'Ubuntu':
|
||||||
self.cli = 'docker'
|
self.cli = 'docker'
|
||||||
self.dockerfileprefix = '.ubuntu18'
|
self.dockerfileprefix = '.ubuntu18'
|
||||||
|
self.cliBuildOptions = '--no-cache'
|
||||||
elif self.host == 'Red Hat':
|
elif self.host == 'Red Hat':
|
||||||
self.cli = 'sudo podman'
|
self.cli = 'sudo podman'
|
||||||
self.dockerfileprefix = '.rhel8.2'
|
self.dockerfileprefix = '.rhel8.2'
|
||||||
|
self.cliBuildOptions = '--no-cache --disable-compression'
|
||||||
|
|
||||||
imageNames = []
|
imageNames = []
|
||||||
result = re.search('eNB', self.imageKind)
|
result = re.search('eNB', self.imageKind)
|
||||||
@@ -144,6 +147,8 @@ class Containerize():
|
|||||||
imageNames.append(('oai-gnb', 'gNB'))
|
imageNames.append(('oai-gnb', 'gNB'))
|
||||||
imageNames.append(('oai-lte-ue', 'lteUE'))
|
imageNames.append(('oai-lte-ue', 'lteUE'))
|
||||||
imageNames.append(('oai-nr-ue', 'nrUE'))
|
imageNames.append(('oai-nr-ue', 'nrUE'))
|
||||||
|
if self.host == 'Red Hat':
|
||||||
|
imageNames.append(('oai-physim', 'phySim'))
|
||||||
if len(imageNames) == 0:
|
if len(imageNames) == 0:
|
||||||
imageNames.append(('oai-enb', 'eNB'))
|
imageNames.append(('oai-enb', 'eNB'))
|
||||||
|
|
||||||
@@ -201,7 +206,7 @@ class Containerize():
|
|||||||
|
|
||||||
# Build the shared image only on Push Events (not on Merge Requests)
|
# Build the shared image only on Push Events (not on Merge Requests)
|
||||||
if (not self.ranAllowMerge):
|
if (not self.ranAllowMerge):
|
||||||
mySSH.command(self.cli + ' build --target ' + sharedimage + ' --tag ' + sharedimage + ':' + sharedTag + ' --file docker/Dockerfile.ran' + self.dockerfileprefix + ' --build-arg NEEDED_GIT_PROXY="http://proxy.eurecom.fr:8080" . > cmake_targets/log/ran-build.log 2>&1', '\$', 1600)
|
mySSH.command(self.cli + ' build ' + self.cliBuildOptions + ' --target ' + sharedimage + ' --tag ' + sharedimage + ':' + sharedTag + ' --file docker/Dockerfile.ran' + self.dockerfileprefix + ' --build-arg NEEDED_GIT_PROXY="http://proxy.eurecom.fr:8080" . > cmake_targets/log/ran-build.log 2>&1', '\$', 1600)
|
||||||
# First verify if the shared image was properly created.
|
# First verify if the shared image was properly created.
|
||||||
status = True
|
status = True
|
||||||
mySSH.command(self.cli + ' image inspect --format=\'Size = {{.Size}} bytes\' ' + sharedimage + ':' + sharedTag, '\$', 5)
|
mySSH.command(self.cli + ' image inspect --format=\'Size = {{.Size}} bytes\' ' + sharedimage + ':' + sharedTag, '\$', 5)
|
||||||
@@ -249,7 +254,7 @@ class Containerize():
|
|||||||
# the archived Dockerfiles have "ran-build:latest" as base image
|
# the archived Dockerfiles have "ran-build:latest" as base image
|
||||||
# we need to update them with proper tag
|
# we need to update them with proper tag
|
||||||
mySSH.command('sed -i -e "s#' + sharedimage + ':latest#' + sharedimage + ':' + sharedTag + '#" docker/Dockerfile.' + pattern + self.dockerfileprefix, '\$', 5)
|
mySSH.command('sed -i -e "s#' + sharedimage + ':latest#' + sharedimage + ':' + sharedTag + '#" docker/Dockerfile.' + pattern + self.dockerfileprefix, '\$', 5)
|
||||||
mySSH.command(self.cli + ' build --target ' + image + ' --tag ' + image + ':' + imageTag + ' --file docker/Dockerfile.' + pattern + self.dockerfileprefix + ' . > cmake_targets/log/' + image + '.log 2>&1', '\$', 1200)
|
mySSH.command(self.cli + ' build ' + self.cliBuildOptions + ' --target ' + image + ' --tag ' + image + ':' + imageTag + ' --file docker/Dockerfile.' + pattern + self.dockerfileprefix + ' . > cmake_targets/log/' + image + '.log 2>&1', '\$', 1200)
|
||||||
# split the log
|
# split the log
|
||||||
mySSH.command('mkdir -p cmake_targets/log/' + image, '\$', 5)
|
mySSH.command('mkdir -p cmake_targets/log/' + image, '\$', 5)
|
||||||
mySSH.command('python3 ci-scripts/docker_log_split.py --logfilename=cmake_targets/log/' + image + '.log', '\$', 5)
|
mySSH.command('python3 ci-scripts/docker_log_split.py --logfilename=cmake_targets/log/' + image + '.log', '\$', 5)
|
||||||
|
|||||||
@@ -0,0 +1,192 @@
|
|||||||
|
#/*
|
||||||
|
# * 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
|
||||||
|
# */
|
||||||
|
#---------------------------------------------------------------------
|
||||||
|
# Python for CI of OAI-eNB + COTS-UE
|
||||||
|
#
|
||||||
|
# Required Python Version
|
||||||
|
# Python 3.x
|
||||||
|
#
|
||||||
|
# Required Python Package
|
||||||
|
# pexpect
|
||||||
|
#---------------------------------------------------------------------
|
||||||
|
|
||||||
|
#-----------------------------------------------------------
|
||||||
|
# Import
|
||||||
|
#-----------------------------------------------------------
|
||||||
|
import sys # arg
|
||||||
|
import re # reg
|
||||||
|
import logging
|
||||||
|
import os
|
||||||
|
import time
|
||||||
|
|
||||||
|
#-----------------------------------------------------------
|
||||||
|
# OAI Testing modules
|
||||||
|
#-----------------------------------------------------------
|
||||||
|
import sshconnection as SSH
|
||||||
|
import helpreadme as HELP
|
||||||
|
import constants as CONST
|
||||||
|
|
||||||
|
#-----------------------------------------------------------
|
||||||
|
# Class Declaration
|
||||||
|
#-----------------------------------------------------------
|
||||||
|
class CppCheckResults():
|
||||||
|
|
||||||
|
def __init__(self):
|
||||||
|
|
||||||
|
self.variants = ['xenial', 'bionic']
|
||||||
|
self.versions = ['','']
|
||||||
|
self.nbErrors = [0,0]
|
||||||
|
self.nbWarnings = [0,0]
|
||||||
|
self.nbNullPtrs = [0,0]
|
||||||
|
self.nbMemLeaks = [0,0]
|
||||||
|
self.nbUninitVars = [0,0]
|
||||||
|
self.nbInvalidPrintf = [0,0]
|
||||||
|
self.nbModuloAlways = [0,0]
|
||||||
|
self.nbTooManyBitsShift = [0,0]
|
||||||
|
self.nbIntegerOverflow = [0,0]
|
||||||
|
self.nbWrongScanfArg = [0,0]
|
||||||
|
self.nbPtrAddNotNull = [0,0]
|
||||||
|
self.nbOppoInnerCondition = [0,0]
|
||||||
|
|
||||||
|
class StaticCodeAnalysis():
|
||||||
|
|
||||||
|
def __init__(self):
|
||||||
|
|
||||||
|
self.ranRepository = ''
|
||||||
|
self.ranBranch = ''
|
||||||
|
self.ranAllowMerge = False
|
||||||
|
self.ranCommitID = ''
|
||||||
|
self.ranTargetBranch = ''
|
||||||
|
self.eNBIPAddress = ''
|
||||||
|
self.eNBUserName = ''
|
||||||
|
self.eNBPassword = ''
|
||||||
|
self.eNBSourceCodePath = ''
|
||||||
|
|
||||||
|
def CppCheckAnalysis(self, HTML):
|
||||||
|
if self.ranRepository == '' or self.ranBranch == '' or self.ranCommitID == '':
|
||||||
|
HELP.GenericHelp(CONST.Version)
|
||||||
|
sys.exit('Insufficient Parameter')
|
||||||
|
lIpAddr = self.eNBIPAddress
|
||||||
|
lUserName = self.eNBUserName
|
||||||
|
lPassWord = self.eNBPassword
|
||||||
|
lSourcePath = self.eNBSourceCodePath
|
||||||
|
|
||||||
|
if lIpAddr == '' or lUserName == '' or lPassWord == '' or lSourcePath == '':
|
||||||
|
HELP.GenericHelp(CONST.Version)
|
||||||
|
sys.exit('Insufficient Parameter')
|
||||||
|
logging.debug('Building on server: ' + lIpAddr)
|
||||||
|
mySSH = SSH.SSHConnection()
|
||||||
|
mySSH.open(lIpAddr, lUserName, lPassWord)
|
||||||
|
|
||||||
|
self.testCase_id = HTML.testCase_id
|
||||||
|
|
||||||
|
# on RedHat/CentOS .git extension is mandatory
|
||||||
|
result = re.search('([a-zA-Z0-9\:\-\.\/])+\.git', self.ranRepository)
|
||||||
|
if result is not None:
|
||||||
|
full_ran_repo_name = self.ranRepository
|
||||||
|
else:
|
||||||
|
full_ran_repo_name = self.ranRepository + '.git'
|
||||||
|
mySSH.command('mkdir -p ' + lSourcePath, '\$', 5)
|
||||||
|
mySSH.command('cd ' + lSourcePath, '\$', 5)
|
||||||
|
mySSH.command('if [ ! -e .git ]; then stdbuf -o0 git clone ' + full_ran_repo_name + ' .; else stdbuf -o0 git fetch --prune; fi', '\$', 600)
|
||||||
|
# Raphael: here add a check if git clone or git fetch went smoothly
|
||||||
|
mySSH.command('git config user.email "jenkins@openairinterface.org"', '\$', 5)
|
||||||
|
mySSH.command('git config user.name "OAI Jenkins"', '\$', 5)
|
||||||
|
|
||||||
|
mySSH.command('echo ' + lPassWord + ' | sudo -S git clean -x -d -ff', '\$', 30)
|
||||||
|
mySSH.command('mkdir -p cmake_targets/log', '\$', 5)
|
||||||
|
# if the commit ID is provided use it to point to it
|
||||||
|
if self.ranCommitID != '':
|
||||||
|
mySSH.command('git checkout -f ' + self.ranCommitID, '\$', 5)
|
||||||
|
|
||||||
|
mySSH.command('docker image rm oai-cppcheck:bionic oai-cppcheck:xenial || true', '\$', 60)
|
||||||
|
mySSH.command('docker build --tag oai-cppcheck:xenial --file ci-scripts/docker/Dockerfile.cppcheck.xenial . > cmake_targets/log/cppcheck-xenial.txt 2>&1', '\$', 600)
|
||||||
|
mySSH.command('sed -e "s@xenial@bionic@" ci-scripts/docker/Dockerfile.cppcheck.xenial > ci-scripts/docker/Dockerfile.cppcheck.bionic', '\$', 6)
|
||||||
|
mySSH.command('docker build --tag oai-cppcheck:bionic --file ci-scripts/docker/Dockerfile.cppcheck.bionic . > cmake_targets/log/cppcheck-bionic.txt 2>&1', '\$', 600)
|
||||||
|
mySSH.command('docker image rm oai-cppcheck:bionic oai-cppcheck:xenial || true', '\$', 60)
|
||||||
|
|
||||||
|
# Analyzing the logs
|
||||||
|
mySSH.command('cd ' + lSourcePath + '/cmake_targets', '\$', 5)
|
||||||
|
mySSH.command('mkdir -p build_log_' + self.testCase_id, '\$', 5)
|
||||||
|
mySSH.command('mv log/* ' + 'build_log_' + self.testCase_id, '\$', 5)
|
||||||
|
mySSH.close()
|
||||||
|
|
||||||
|
mySSH.copyin(lIpAddr, lUserName, lPassWord, lSourcePath + '/cmake_targets/build_log_' + self.testCase_id + '/*', '.')
|
||||||
|
CCR = CppCheckResults()
|
||||||
|
vId = 0
|
||||||
|
for variant in CCR.variants:
|
||||||
|
if (os.path.isfile('./cppcheck-'+ variant + '.txt')):
|
||||||
|
xmlStart = False
|
||||||
|
with open('./cppcheck-'+ variant + '.txt', 'r') as logfile:
|
||||||
|
for line in logfile:
|
||||||
|
ret = re.search('Unpacking cppcheck \((?P<version>[0-9\.]+)', str(line))
|
||||||
|
if ret is not None:
|
||||||
|
CCR.versions[vId] = ret.group('version')
|
||||||
|
if re.search('RUN cat cmake_targets/log/cppcheck.xml', str(line)) is not None:
|
||||||
|
xmlStart = True
|
||||||
|
if xmlStart:
|
||||||
|
if re.search('severity="error"', str(line)) is not None:
|
||||||
|
CCR.nbErrors[vId] += 1
|
||||||
|
if re.search('severity="warning"', str(line)) is not None:
|
||||||
|
CCR.nbWarnings[vId] += 1
|
||||||
|
if re.search('id="memleak"', str(line)) is not None:
|
||||||
|
CCR.nbMemLeaks[vId] += 1
|
||||||
|
if re.search('id="nullPointer"', str(line)) is not None:
|
||||||
|
CCR.nbNullPtrs[vId] += 1
|
||||||
|
if re.search('id="uninitvar"', str(line)) is not None:
|
||||||
|
CCR.nbUninitVars[vId] += 1
|
||||||
|
if re.search('id="invalidPrintfArgType_sint"|id="invalidPrintfArgType_uint"', str(line)) is not None:
|
||||||
|
CCR.nbInvalidPrintf[vId] += 1
|
||||||
|
if re.search('id="moduloAlwaysTrueFalse"', str(line)) is not None:
|
||||||
|
CCR.nbModuloAlways[vId] += 1
|
||||||
|
if re.search('id="shiftTooManyBitsSigned"', str(line)) is not None:
|
||||||
|
CCR.nbTooManyBitsShift[vId] += 1
|
||||||
|
if re.search('id="integerOverflow"', str(line)) is not None:
|
||||||
|
CCR.nbIntegerOverflow[vId] += 1
|
||||||
|
if re.search('id="wrongPrintfScanfArgNum"|id="invalidScanfArgType_int"', str(line)) is not None:
|
||||||
|
CCR.nbWrongScanfArg[vId] += 1
|
||||||
|
if re.search('id="pointerAdditionResultNotNull"', str(line)) is not None:
|
||||||
|
CCR.nbPtrAddNotNull[vId] += 1
|
||||||
|
if re.search('id="oppositeInnerCondition"', str(line)) is not None:
|
||||||
|
CCR.nbOppoInnerCondition[vId] += 1
|
||||||
|
logging.debug('======== Variant ' + variant + ' - ' + CCR.versions[vId] + ' ========')
|
||||||
|
logging.debug(' ' + str(CCR.nbErrors[vId]) + ' errors')
|
||||||
|
logging.debug(' ' + str(CCR.nbWarnings[vId]) + ' warnings')
|
||||||
|
logging.debug(' -- Details --')
|
||||||
|
logging.debug(' Memory leak: ' + str(CCR.nbMemLeaks[vId]))
|
||||||
|
logging.debug(' Possible null pointer deference: ' + str(CCR.nbNullPtrs[vId]))
|
||||||
|
logging.debug(' Uninitialized variable: ' + str(CCR.nbUninitVars[vId]))
|
||||||
|
logging.debug(' Undefined behaviour shifting: ' + str(CCR.nbTooManyBitsShift[vId]))
|
||||||
|
logging.debug(' Signed integer overflow: ' + str(CCR.nbIntegerOverflow[vId]))
|
||||||
|
logging.debug('')
|
||||||
|
logging.debug(' Printf formatting issue: ' + str(CCR.nbInvalidPrintf[vId]))
|
||||||
|
logging.debug(' Modulo result is predetermined: ' + str(CCR.nbModuloAlways[vId]))
|
||||||
|
logging.debug(' Opposite Condition -> dead code: ' + str(CCR.nbOppoInnerCondition[vId]))
|
||||||
|
logging.debug(' Wrong Scanf Nb Args: ' + str(CCR.nbWrongScanfArg[vId]))
|
||||||
|
logging.debug('')
|
||||||
|
vId += 1
|
||||||
|
|
||||||
|
HTML.CreateHtmlTestRow('N/A', 'OK', CONST.ALL_PROCESSES_OK)
|
||||||
|
HTML.CreateHtmlTestRowCppCheckResults(CCR)
|
||||||
|
logging.info('\u001B[1m Static Code Analysis Pass\u001B[0m')
|
||||||
|
|
||||||
|
return 0
|
||||||
|
|
||||||
@@ -87,7 +87,7 @@ function create_vm {
|
|||||||
echo "VM_CPU = $VM_CPU"
|
echo "VM_CPU = $VM_CPU"
|
||||||
echo "VM_DISK = $VM_DISK GBytes"
|
echo "VM_DISK = $VM_DISK GBytes"
|
||||||
|
|
||||||
if [[ "$VM_NAME" == *"-enb-usrp"* ]]
|
if [[ "$VM_NAME" == *"-enb-usrp"* ]] || [[ "$VM_NAME" == *"-cppcheck"* ]]
|
||||||
then
|
then
|
||||||
echo "This VM type is no longer supported in the pipeline framework"
|
echo "This VM type is no longer supported in the pipeline framework"
|
||||||
return
|
return
|
||||||
|
|||||||
@@ -0,0 +1,31 @@
|
|||||||
|
FROM ubuntu:xenial AS oai-cppcheck
|
||||||
|
|
||||||
|
ENV DEBIAN_FRONTEND=noninteractive
|
||||||
|
|
||||||
|
RUN apt-get update && \
|
||||||
|
DEBIAN_FRONTEND=noninteractive apt-get upgrade --yes && \
|
||||||
|
DEBIAN_FRONTEND=noninteractive apt-get install --yes \
|
||||||
|
build-essential \
|
||||||
|
vim \
|
||||||
|
cppcheck
|
||||||
|
|
||||||
|
WORKDIR /oai-ran
|
||||||
|
COPY . .
|
||||||
|
|
||||||
|
WORKDIR /oai-ran/common/utils/T
|
||||||
|
RUN make
|
||||||
|
|
||||||
|
WORKDIR /oai-ran
|
||||||
|
RUN mkdir -p cmake_targets/log && \
|
||||||
|
cppcheck --enable=warning --force --xml --xml-version=2 \
|
||||||
|
-i openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_decoder.c \
|
||||||
|
--suppressions-list=ci-scripts/cppcheck_suppressions.list \
|
||||||
|
-I common/utils \
|
||||||
|
-I openair3/NAS/COMMON/UTIL \
|
||||||
|
-j`nproc` . 2> cmake_targets/log/cppcheck.xml 1> cmake_targets/log/cppcheck_build.txt
|
||||||
|
|
||||||
|
RUN egrep -c 'severity="error' cmake_targets/log/cppcheck.xml
|
||||||
|
|
||||||
|
RUN egrep -c 'severity="warning' cmake_targets/log/cppcheck.xml
|
||||||
|
|
||||||
|
RUN cat cmake_targets/log/cppcheck.xml
|
||||||
@@ -479,3 +479,88 @@ class HTMLManagement():
|
|||||||
self.htmlFile.write(' </tr>\n')
|
self.htmlFile.write(' </tr>\n')
|
||||||
self.htmlFile.close()
|
self.htmlFile.close()
|
||||||
|
|
||||||
|
def CreateHtmlTestRowCppCheckResults(self, CCR):
|
||||||
|
if (self.htmlFooterCreated or (not self.htmlHeaderCreated)):
|
||||||
|
return
|
||||||
|
self.htmlFile = open('test_results.html', 'a')
|
||||||
|
vId = 0
|
||||||
|
for version in CCR.versions:
|
||||||
|
self.htmlFile.write(' <tr bgcolor = "#F0F0F0" >\n')
|
||||||
|
self.htmlFile.write(' <td colspan=' + str(5+self.htmlUEConnected) + '><b> Results for cppcheck v ' + version + ' </b></td>\n')
|
||||||
|
self.htmlFile.write(' </tr>\n')
|
||||||
|
self.htmlFile.write(' <tr>\n')
|
||||||
|
self.htmlFile.write(' <td></td>\n')
|
||||||
|
self.htmlFile.write(' <td colspan=2 bgcolor = "lightcyan" ><b> NB ERRORS</b></td>\n')
|
||||||
|
if CCR.nbErrors[vId] == 0:
|
||||||
|
myColor = 'lightgreen'
|
||||||
|
elif CCR.nbErrors[vId] < 20:
|
||||||
|
myColor = 'orange'
|
||||||
|
else:
|
||||||
|
myColor = 'lightcoral'
|
||||||
|
self.htmlFile.write(' <td colspan=' + str(2+self.htmlUEConnected) + ' bgcolor = "' + myColor + '"><b>' + str(CCR.nbErrors[vId]) + '</b></td>\n')
|
||||||
|
self.htmlFile.write(' </tr>\n')
|
||||||
|
self.htmlFile.write(' <tr>\n')
|
||||||
|
self.htmlFile.write(' <td></td>\n')
|
||||||
|
self.htmlFile.write(' <td colspan=2 bgcolor = "lightcyan" ><b> NB WARNINGS</b></td>\n')
|
||||||
|
if CCR.nbWarnings[vId] == 0:
|
||||||
|
myColor = 'lightgreen'
|
||||||
|
elif CCR.nbWarnings[vId] < 20:
|
||||||
|
myColor = 'orange'
|
||||||
|
else:
|
||||||
|
myColor = 'lightcoral'
|
||||||
|
self.htmlFile.write(' <td colspan=' + str(2+self.htmlUEConnected) + ' bgcolor = "' + myColor + '"><b>' + str(CCR.nbWarnings[vId]) + '</b></td>\n')
|
||||||
|
self.htmlFile.write(' </tr>\n')
|
||||||
|
self.htmlFile.write(' <tr bgcolor = "#F0F0F0" >\n')
|
||||||
|
self.htmlFile.write(' <td colspan=' + str(5+self.htmlUEConnected) + '> ----------------- </td>\n')
|
||||||
|
self.htmlFile.write(' </tr>\n')
|
||||||
|
self.htmlFile.write(' <tr>\n')
|
||||||
|
self.htmlFile.write(' <td></td>\n')
|
||||||
|
self.htmlFile.write(' <td colspan=2 bgcolor = "lightcyan" ><b> Memory leak</b></td>\n')
|
||||||
|
self.htmlFile.write(' <td colspan=' + str(2+self.htmlUEConnected) + '>' + str(CCR.nbMemLeaks[vId]) + '</td>\n')
|
||||||
|
self.htmlFile.write(' </tr>\n')
|
||||||
|
self.htmlFile.write(' <tr>\n')
|
||||||
|
self.htmlFile.write(' <td></td>\n')
|
||||||
|
self.htmlFile.write(' <td colspan=2 bgcolor = "lightcyan" ><b> Possible null pointer deference</b></td>\n')
|
||||||
|
self.htmlFile.write(' <td colspan=' + str(2+self.htmlUEConnected) + '>' + str(CCR.nbNullPtrs[vId]) + '</td>\n')
|
||||||
|
self.htmlFile.write(' </tr>\n')
|
||||||
|
self.htmlFile.write(' <tr>\n')
|
||||||
|
self.htmlFile.write(' <td></td>\n')
|
||||||
|
self.htmlFile.write(' <td colspan=2 bgcolor = "lightcyan" ><b> Uninitialized variable</b></td>\n')
|
||||||
|
self.htmlFile.write(' <td colspan=' + str(2+self.htmlUEConnected) + '>' + str(CCR.nbUninitVars[vId]) + '</td>\n')
|
||||||
|
self.htmlFile.write(' </tr>\n')
|
||||||
|
self.htmlFile.write(' <tr>\n')
|
||||||
|
self.htmlFile.write(' <td></td>\n')
|
||||||
|
self.htmlFile.write(' <td colspan=2 bgcolor = "lightcyan" ><b> Undefined behaviour shifting</b></td>\n')
|
||||||
|
self.htmlFile.write(' <td colspan=' + str(2+self.htmlUEConnected) + '>' + str(CCR.nbTooManyBitsShift[vId]) + '</td>\n')
|
||||||
|
self.htmlFile.write(' </tr>\n')
|
||||||
|
self.htmlFile.write(' <tr>\n')
|
||||||
|
self.htmlFile.write(' <td></td>\n')
|
||||||
|
self.htmlFile.write(' <td colspan=2 bgcolor = "lightcyan" ><b> Signed integer overflow</b></td>\n')
|
||||||
|
self.htmlFile.write(' <td colspan=' + str(2+self.htmlUEConnected) + '>' + str(CCR.nbIntegerOverflow[vId]) + '</td>\n')
|
||||||
|
self.htmlFile.write(' </tr>\n')
|
||||||
|
self.htmlFile.write(' <tr bgcolor = "#F0F0F0" >\n')
|
||||||
|
self.htmlFile.write(' <td colspan=' + str(5+self.htmlUEConnected) + '> </td>\n')
|
||||||
|
self.htmlFile.write(' </tr>\n')
|
||||||
|
self.htmlFile.write(' <tr>\n')
|
||||||
|
self.htmlFile.write(' <td></td>\n')
|
||||||
|
self.htmlFile.write(' <td colspan=2 bgcolor = "lightcyan" ><b> Printf formatting issues</b></td>\n')
|
||||||
|
self.htmlFile.write(' <td colspan=' + str(2+self.htmlUEConnected) + '>' + str(CCR.nbInvalidPrintf[vId]) + '</td>\n')
|
||||||
|
self.htmlFile.write(' </tr>\n')
|
||||||
|
self.htmlFile.write(' <tr>\n')
|
||||||
|
self.htmlFile.write(' <td></td>\n')
|
||||||
|
self.htmlFile.write(' <td colspan=2 bgcolor = "lightcyan" ><b> Modulo result is predetermined</b></td>\n')
|
||||||
|
self.htmlFile.write(' <td colspan=' + str(2+self.htmlUEConnected) + '>' + str(CCR.nbModuloAlways[vId]) + '</td>\n')
|
||||||
|
self.htmlFile.write(' </tr>\n')
|
||||||
|
self.htmlFile.write(' <tr>\n')
|
||||||
|
self.htmlFile.write(' <td></td>\n')
|
||||||
|
self.htmlFile.write(' <td colspan=2 bgcolor = "lightcyan" ><b> Opposite Condition -> dead code</b></td>\n')
|
||||||
|
self.htmlFile.write(' <td colspan=' + str(2+self.htmlUEConnected) + '>' + str(CCR.nbOppoInnerCondition[vId]) + '</td>\n')
|
||||||
|
self.htmlFile.write(' </tr>\n')
|
||||||
|
self.htmlFile.write(' <tr>\n')
|
||||||
|
self.htmlFile.write(' <td></td>\n')
|
||||||
|
self.htmlFile.write(' <td colspan=2 bgcolor = "lightcyan" ><b> Wrong Scanf Nb Args</b></td>\n')
|
||||||
|
self.htmlFile.write(' <td colspan=' + str(2+self.htmlUEConnected) + '>' + str(CCR.nbWrongScanfArg[vId]) + '</td>\n')
|
||||||
|
self.htmlFile.write(' </tr>\n')
|
||||||
|
vId += 1
|
||||||
|
|
||||||
|
self.htmlFile.close()
|
||||||
|
|||||||
+9
-5
@@ -38,10 +38,11 @@ import helpreadme as HELP
|
|||||||
import constants as CONST
|
import constants as CONST
|
||||||
|
|
||||||
|
|
||||||
import cls_oaicitest #main class for OAI CI test framework
|
import cls_oaicitest #main class for OAI CI test framework
|
||||||
import cls_physim #class PhySim for physical simulators build and test
|
import cls_physim #class PhySim for physical simulators build and test
|
||||||
import cls_cots_ue #class CotsUe for Airplane mode control
|
import cls_cots_ue #class CotsUe for Airplane mode control
|
||||||
import cls_containerize #class Containerize for all container-based operations on RAN/UE objects
|
import cls_containerize #class Containerize for all container-based operations on RAN/UE objects
|
||||||
|
import cls_static_code_analysis #class for static code analysis
|
||||||
|
|
||||||
|
|
||||||
import sshconnection
|
import sshconnection
|
||||||
@@ -378,6 +379,7 @@ EPC = epc.EPCManagement()
|
|||||||
RAN = ran.RANManagement()
|
RAN = ran.RANManagement()
|
||||||
HTML = html.HTMLManagement()
|
HTML = html.HTMLManagement()
|
||||||
CONTAINERS = cls_containerize.Containerize()
|
CONTAINERS = cls_containerize.Containerize()
|
||||||
|
SCA = cls_static_code_analysis.StaticCodeAnalysis()
|
||||||
|
|
||||||
ldpc=cls_physim.PhySim() #create an instance for LDPC test using GPU or CPU build
|
ldpc=cls_physim.PhySim() #create an instance for LDPC test using GPU or CPU build
|
||||||
|
|
||||||
@@ -388,7 +390,7 @@ ldpc=cls_physim.PhySim() #create an instance for LDPC test using GPU or CPU b
|
|||||||
#-----------------------------------------------------------
|
#-----------------------------------------------------------
|
||||||
|
|
||||||
import args_parse
|
import args_parse
|
||||||
py_param_file_present, py_params, mode = args_parse.ArgsParse(sys.argv,CiTestObj,RAN,HTML,EPC,ldpc,CONTAINERS,HELP)
|
py_param_file_present, py_params, mode = args_parse.ArgsParse(sys.argv,CiTestObj,RAN,HTML,EPC,ldpc,CONTAINERS,HELP,SCA)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@@ -741,6 +743,8 @@ elif re.match('^TesteNB$', mode, re.IGNORECASE) or re.match('^TestUE$', mode, re
|
|||||||
CONTAINERS.DeployObject(HTML, EPC)
|
CONTAINERS.DeployObject(HTML, EPC)
|
||||||
elif action == 'Undeploy_Object':
|
elif action == 'Undeploy_Object':
|
||||||
CONTAINERS.UndeployObject(HTML, RAN)
|
CONTAINERS.UndeployObject(HTML, RAN)
|
||||||
|
elif action == 'Cppcheck_Analysis':
|
||||||
|
SCA.CppCheckAnalysis(HTML)
|
||||||
else:
|
else:
|
||||||
sys.exit('Invalid class (action) from xml')
|
sys.exit('Invalid class (action) from xml')
|
||||||
if not RAN.prematureExit:
|
if not RAN.prematureExit:
|
||||||
|
|||||||
@@ -568,17 +568,20 @@ function report_build {
|
|||||||
|
|
||||||
echo " <h2>Ubuntu 16.04 LTS -- Summary</h2>" >> ./build_results.html
|
echo " <h2>Ubuntu 16.04 LTS -- Summary</h2>" >> ./build_results.html
|
||||||
|
|
||||||
sca_summary_table_header ./archives/cppcheck/cppcheck.xml "OAI Static Code Analysis with CPPCHECK"
|
if [ -f ./archives/cppcheck/cppcheck.xml ]
|
||||||
sca_summary_table_row ./archives/cppcheck/cppcheck.xml "Uninitialized variable" uninitvar
|
then
|
||||||
sca_summary_table_row ./archives/cppcheck/cppcheck.xml "Uninitialized struct member" uninitStructMember
|
sca_summary_table_header ./archives/cppcheck/cppcheck.xml "OAI Static Code Analysis with CPPCHECK"
|
||||||
sca_summary_table_row ./archives/cppcheck/cppcheck.xml "Memory leak" memleak
|
sca_summary_table_row ./archives/cppcheck/cppcheck.xml "Uninitialized variable" uninitvar
|
||||||
sca_summary_table_row ./archives/cppcheck/cppcheck.xml "Memory is freed twice" doubleFree
|
sca_summary_table_row ./archives/cppcheck/cppcheck.xml "Uninitialized struct member" uninitStructMember
|
||||||
sca_summary_table_row ./archives/cppcheck/cppcheck.xml "Resource leak" resourceLeak
|
sca_summary_table_row ./archives/cppcheck/cppcheck.xml "Memory leak" memleak
|
||||||
sca_summary_table_row ./archives/cppcheck/cppcheck.xml "Possible null pointer dereference" nullPointer
|
sca_summary_table_row ./archives/cppcheck/cppcheck.xml "Memory is freed twice" doubleFree
|
||||||
sca_summary_table_row ./archives/cppcheck/cppcheck.xml "Array access out of bounds" arrayIndexOutOfBounds
|
sca_summary_table_row ./archives/cppcheck/cppcheck.xml "Resource leak" resourceLeak
|
||||||
sca_summary_table_row ./archives/cppcheck/cppcheck.xml "Buffer is accessed out of bounds" bufferAccessOutOfBounds
|
sca_summary_table_row ./archives/cppcheck/cppcheck.xml "Possible null pointer dereference" nullPointer
|
||||||
sca_summary_table_row ./archives/cppcheck/cppcheck.xml "Expression depends on order of evaluation of side effects" unknownEvaluationOrder
|
sca_summary_table_row ./archives/cppcheck/cppcheck.xml "Array access out of bounds" arrayIndexOutOfBounds
|
||||||
sca_summary_table_footer ./archives/cppcheck/cppcheck.xml
|
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
|
||||||
|
fi
|
||||||
|
|
||||||
# summary_table_header "OAI Build: 4G LTE eNB -- USRP option" ./archives/enb_usrp
|
# summary_table_header "OAI Build: 4G LTE eNB -- USRP option" ./archives/enb_usrp
|
||||||
# summary_table_row "LTE SoftModem - Release 15" ./archives/enb_usrp/lte-softmodem.Rel15.txt "Built target lte-softmodem" ./enb_usrp_row1.html
|
# summary_table_row "LTE SoftModem - Release 15" ./archives/enb_usrp/lte-softmodem.Rel15.txt "Built target lte-softmodem" ./enb_usrp_row1.html
|
||||||
|
|||||||
@@ -47,7 +47,7 @@ function wait_on_vm_build {
|
|||||||
echo "ARCHIVES_LOC = $ARCHIVES_LOC"
|
echo "ARCHIVES_LOC = $ARCHIVES_LOC"
|
||||||
echo "BUILD_OPTIONS = $BUILD_OPTIONS"
|
echo "BUILD_OPTIONS = $BUILD_OPTIONS"
|
||||||
|
|
||||||
if [[ "$VM_NAME" == *"-enb-usrp"* ]]
|
if [[ "$VM_NAME" == *"-enb-usrp"* ]] || [[ "$VM_NAME" == *"-cppcheck"* ]]
|
||||||
then
|
then
|
||||||
echo "This VM type is no longer supported in the pipeline framework"
|
echo "This VM type is no longer supported in the pipeline framework"
|
||||||
return
|
return
|
||||||
@@ -73,6 +73,9 @@ function wait_on_vm_build {
|
|||||||
echo "############################################################"
|
echo "############################################################"
|
||||||
echo "Waiting build process to end on VM ($VM_NAME)"
|
echo "Waiting build process to end on VM ($VM_NAME)"
|
||||||
echo "############################################################"
|
echo "############################################################"
|
||||||
|
# Since the last VM was cppcheck and is removed
|
||||||
|
# we are going too fast in wait and the build_oai is not yet started
|
||||||
|
sleep 120
|
||||||
|
|
||||||
if [[ "$VM_NAME" == *"-cppcheck"* ]]
|
if [[ "$VM_NAME" == *"-cppcheck"* ]]
|
||||||
then
|
then
|
||||||
@@ -90,7 +93,7 @@ function wait_on_vm_build {
|
|||||||
}
|
}
|
||||||
|
|
||||||
function check_on_vm_build {
|
function check_on_vm_build {
|
||||||
if [[ "$VM_NAME" == *"-enb-usrp"* ]]
|
if [[ "$VM_NAME" == *"-enb-usrp"* ]] || [[ "$VM_NAME" == *"-cppcheck"* ]]
|
||||||
then
|
then
|
||||||
echo "This VM type is no longer supported in the pipeline framework"
|
echo "This VM type is no longer supported in the pipeline framework"
|
||||||
return
|
return
|
||||||
|
|||||||
@@ -37,3 +37,4 @@
|
|||||||
- Build_Image
|
- Build_Image
|
||||||
- Deploy_Object
|
- Deploy_Object
|
||||||
- Undeploy_Object
|
- Undeploy_Object
|
||||||
|
- Cppcheck_Analysis
|
||||||
|
|||||||
@@ -0,0 +1,37 @@
|
|||||||
|
<!--
|
||||||
|
|
||||||
|
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>
|
||||||
|
<htmlTabRef>build-tab</htmlTabRef>
|
||||||
|
<htmlTabName>CPPCHECK Analysis</htmlTabName>
|
||||||
|
<htmlTabIcon>wrench</htmlTabIcon>
|
||||||
|
<TestCaseRequestedList>
|
||||||
|
000001
|
||||||
|
</TestCaseRequestedList>
|
||||||
|
<TestCaseExclusionList></TestCaseExclusionList>
|
||||||
|
|
||||||
|
<testCase id="000001">
|
||||||
|
<class>Cppcheck_Analysis</class>
|
||||||
|
<desc>Static Code Analysis with cppcheck</desc>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
</testCaseList>
|
||||||
@@ -333,6 +333,11 @@ else (CUDA_FOUND)
|
|||||||
)
|
)
|
||||||
endif ()
|
endif ()
|
||||||
|
|
||||||
|
if (SANITIZE_ADDRESS)
|
||||||
|
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fsanitize=address")
|
||||||
|
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fsanitize=address")
|
||||||
|
endif ()
|
||||||
|
|
||||||
add_definitions("-DASN_DISABLE_OER_SUPPORT")
|
add_definitions("-DASN_DISABLE_OER_SUPPORT")
|
||||||
|
|
||||||
#########################
|
#########################
|
||||||
|
|||||||
@@ -68,6 +68,7 @@ USRP_REC_PLAY="False"
|
|||||||
BUILD_ECLIPSE=0
|
BUILD_ECLIPSE=0
|
||||||
NR="False"
|
NR="False"
|
||||||
ITTI_SIM="False"
|
ITTI_SIM="False"
|
||||||
|
SANITIZE_ADDRESS="False"
|
||||||
OPTIONAL_LIBRARIES="telnetsrv enbscope uescope nrscope msc"
|
OPTIONAL_LIBRARIES="telnetsrv enbscope uescope nrscope msc"
|
||||||
trap handle_ctrl_c INT
|
trap handle_ctrl_c INT
|
||||||
|
|
||||||
@@ -424,6 +425,9 @@ function main() {
|
|||||||
CMAKE_CMD="$CMAKE_CMD -GNinja"
|
CMAKE_CMD="$CMAKE_CMD -GNinja"
|
||||||
MAKE_CMD=ninja
|
MAKE_CMD=ninja
|
||||||
shift;;
|
shift;;
|
||||||
|
--sanitize-address | -fsanitize=address)
|
||||||
|
SANITIZE_ADDRESS=True
|
||||||
|
shift;;
|
||||||
--ittiSIM)
|
--ittiSIM)
|
||||||
ittiSIM=1
|
ittiSIM=1
|
||||||
ITTI_SIM="True"
|
ITTI_SIM="True"
|
||||||
@@ -612,6 +616,7 @@ function main() {
|
|||||||
echo "set ( USRP_REC_PLAY $USRP_REC_PLAY )" >> $cmake_file
|
echo "set ( USRP_REC_PLAY $USRP_REC_PLAY )" >> $cmake_file
|
||||||
echo "set ( SKIP_SHARED_LIB_FLAG $SKIP_SHARED_LIB_FLAG )" >> $cmake_file
|
echo "set ( SKIP_SHARED_LIB_FLAG $SKIP_SHARED_LIB_FLAG )" >> $cmake_file
|
||||||
echo "set ( ITTI_SIM $ITTI_SIM )" >> $cmake_file
|
echo "set ( ITTI_SIM $ITTI_SIM )" >> $cmake_file
|
||||||
|
echo "set ( SANITIZE_ADDRESS $SANITIZE_ADDRESS )" >> $cmake_file
|
||||||
echo 'include(${CMAKE_CURRENT_SOURCE_DIR}/../CMakeLists.txt)' >> $cmake_file
|
echo 'include(${CMAKE_CURRENT_SOURCE_DIR}/../CMakeLists.txt)' >> $cmake_file
|
||||||
cd $DIR/$build_dir/build
|
cd $DIR/$build_dir/build
|
||||||
eval $CMAKE_CMD
|
eval $CMAKE_CMD
|
||||||
|
|||||||
@@ -0,0 +1,123 @@
|
|||||||
|
#/*
|
||||||
|
# * 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
|
||||||
|
# */
|
||||||
|
#---------------------------------------------------------------------
|
||||||
|
#
|
||||||
|
# Dockerfile for the Open-Air-Interface BUILD service
|
||||||
|
# Valid for RHEL8
|
||||||
|
#
|
||||||
|
#---------------------------------------------------------------------
|
||||||
|
|
||||||
|
FROM localhost/ran-build:develop AS phy-sim-build
|
||||||
|
|
||||||
|
RUN rm -Rf /oai-ran
|
||||||
|
WORKDIR /oai-ran
|
||||||
|
COPY . .
|
||||||
|
|
||||||
|
#run build_oai to build the target image
|
||||||
|
RUN /bin/sh oaienv && \
|
||||||
|
cd cmake_targets && \
|
||||||
|
mkdir -p log && \
|
||||||
|
./build_oai --phy_simulators --ninja --verbose-ci
|
||||||
|
|
||||||
|
|
||||||
|
#start from scratch for target executable
|
||||||
|
FROM registry.access.redhat.com/ubi8/ubi:latest as oai-physim
|
||||||
|
|
||||||
|
RUN yum update -y && \
|
||||||
|
yum install -y --enablerepo="ubi-8-codeready-builder" \
|
||||||
|
lksctp-tools \
|
||||||
|
nettle \
|
||||||
|
atlas \
|
||||||
|
hostname \
|
||||||
|
sudo \
|
||||||
|
procps-ng \
|
||||||
|
net-tools \
|
||||||
|
iputils \
|
||||||
|
bc \
|
||||||
|
iproute \
|
||||||
|
libyaml && \
|
||||||
|
echo "/usr/local/lib" > /etc/ld.so.conf.d/local-lib.conf && \
|
||||||
|
echo "/usr/local/lib64" >> /etc/ld.so.conf.d/local-lib.conf
|
||||||
|
|
||||||
|
WORKDIR /opt/oai-physim/targets/bin
|
||||||
|
COPY --from=phy-sim-build /oai-ran/targets/bin/dlsim.Rel15 .
|
||||||
|
COPY --from=phy-sim-build /oai-ran/targets/bin/nr_dlsim.Rel15 .
|
||||||
|
COPY --from=phy-sim-build /oai-ran/targets/bin/nr_prachsim.Rel15 .
|
||||||
|
COPY --from=phy-sim-build /oai-ran/targets/bin/nr_ulschsim.Rel15 .
|
||||||
|
COPY --from=phy-sim-build /oai-ran/targets/bin/polartest.Rel15 .
|
||||||
|
COPY --from=phy-sim-build /oai-ran/targets/bin/ulsim.Rel15 .
|
||||||
|
COPY --from=phy-sim-build /oai-ran/targets/bin/ldpctest.Rel15 .
|
||||||
|
COPY --from=phy-sim-build /oai-ran/targets/bin/nr_dlschsim.Rel15 .
|
||||||
|
COPY --from=phy-sim-build /oai-ran/targets/bin/nr_pbchsim.Rel15 .
|
||||||
|
COPY --from=phy-sim-build /oai-ran/targets/bin/nr_pucchsim.Rel15 .
|
||||||
|
COPY --from=phy-sim-build /oai-ran/targets/bin/nr_ulsim.Rel15 .
|
||||||
|
COPY --from=phy-sim-build /oai-ran/targets/bin/smallblocktest.Rel15 .
|
||||||
|
|
||||||
|
WORKDIR /usr/local/lib/
|
||||||
|
COPY --from=phy-sim-build /oai-ran/targets/bin/libcoding.so .
|
||||||
|
COPY --from=phy-sim-build /lib64/liblapacke.so.3 .
|
||||||
|
COPY --from=phy-sim-build /lib64/libX11.so.6 .
|
||||||
|
COPY --from=phy-sim-build /lib64/libXpm.so.4 .
|
||||||
|
COPY --from=phy-sim-build /lib64/libxcb.so.1 .
|
||||||
|
COPY --from=phy-sim-build /lib64/libXau.so.6 .
|
||||||
|
COPY --from=phy-sim-build /lib64/libforms.so.2 .
|
||||||
|
COPY --from=phy-sim-build /lib64/libblas.so.3 .
|
||||||
|
COPY --from=phy-sim-build /lib64/liblapack.so.3 .
|
||||||
|
COPY --from=phy-sim-build /lib64/libexslt.so.0 .
|
||||||
|
COPY --from=phy-sim-build /lib64/libxslt.so.1 .
|
||||||
|
COPY --from=phy-sim-build /oai-ran/cmake_targets/phy_simulators/build/libdfts.so .
|
||||||
|
COPY --from=phy-sim-build /oai-ran/cmake_targets/phy_simulators/build/libSIMU.so .
|
||||||
|
COPY --from=phy-sim-build /oai-ran/cmake_targets/phy_simulators/build/libldpc.so .
|
||||||
|
COPY --from=phy-sim-build /oai-ran/cmake_targets/phy_simulators/build/libldpc_orig.so .
|
||||||
|
|
||||||
|
RUN ldconfig
|
||||||
|
|
||||||
|
#debug
|
||||||
|
#RUN ldd /opt/oai-physim/targets/bin/dlsim.Rel15
|
||||||
|
#RUN ldd /opt/oai-physim/targets/bin/nr_dlsim.Rel15
|
||||||
|
#RUN ldd /opt/oai-physim/targets/bin/nr_prachsim.Rel15
|
||||||
|
#RUN ldd /opt/oai-physim/targets/bin/nr_ulschsim.Rel15
|
||||||
|
#RUN ldd /opt/oai-physim/targets/bin/polartest.Rel15
|
||||||
|
#RUN ldd /opt/oai-physim/targets/bin/ulsim.Rel15
|
||||||
|
#RUN ldd /opt/oai-physim/targets/bin/ldpctest.Rel15
|
||||||
|
#RUN ldd /opt/oai-physim/targets/bin/nr_dlschsim.Rel15
|
||||||
|
#RUN ldd /opt/oai-physim/targets/bin/nr_pbchsim.Rel15
|
||||||
|
#RUN ldd /opt/oai-physim/targets/bin/nr_pucchsim.Rel15
|
||||||
|
#RUN ldd /opt/oai-physim/targets/bin/nr_ulsim.Rel15
|
||||||
|
#RUN ldd /opt/oai-physim/targets/bin/smallblocktest.Rel15
|
||||||
|
|
||||||
|
# Copy some executables
|
||||||
|
WORKDIR /usr/bin/
|
||||||
|
|
||||||
|
COPY --from=phy-sim-build /usr/bin/killall .
|
||||||
|
COPY --from=phy-sim-build /usr/bin/xmlstarlet .
|
||||||
|
COPY --from=phy-sim-build /usr/bin/svn .
|
||||||
|
|
||||||
|
# Copy the relevant configuration files for phySim
|
||||||
|
WORKDIR /opt/oai-physim/
|
||||||
|
|
||||||
|
COPY --from=phy-sim-build /oai-ran/cmake_targets/autotests/run_exec_autotests.bash /opt/oai-physim/cmake_targets/autotests/
|
||||||
|
COPY --from=phy-sim-build /oai-ran/cmake_targets/autotests/test_case_list.xml /opt/oai-physim/cmake_targets/autotests/
|
||||||
|
COPY --from=phy-sim-build /oai-ran/cmake_targets/autotests/tools/free_mem.bash /opt/oai-physim/cmake_targets/autotests/tools/
|
||||||
|
COPY --from=phy-sim-build /oai-ran/cmake_targets/tools/build_helper /opt/oai-physim/cmake_targets/tools/
|
||||||
|
COPY --from=phy-sim-build /oai-ran/cmake_targets/tools/test_helper /opt/oai-physim/cmake_targets/tools/
|
||||||
|
|
||||||
|
#CMD ["sleep", "infinity"]
|
||||||
@@ -332,6 +332,14 @@ void processSlotRX( PHY_VARS_NR_UE *UE, UE_nr_rxtx_proc_t *proc) {
|
|||||||
protocol_ctxt_t ctxt;
|
protocol_ctxt_t ctxt;
|
||||||
PROTOCOL_CTXT_SET_BY_MODULE_ID(&ctxt, UE->Mod_id, ENB_FLAG_NO, mac->crnti, proc->frame_rx, proc->nr_slot_rx, 0);
|
PROTOCOL_CTXT_SET_BY_MODULE_ID(&ctxt, UE->Mod_id, ENB_FLAG_NO, mac->crnti, proc->frame_rx, proc->nr_slot_rx, 0);
|
||||||
pdcp_run(&ctxt);
|
pdcp_run(&ctxt);
|
||||||
|
|
||||||
|
/* send tick to RLC and PDCP every ms */
|
||||||
|
if (proc->nr_slot_rx % UE->frame_parms.slots_per_subframe == 0) {
|
||||||
|
void nr_rlc_tick(int frame, int subframe);
|
||||||
|
void nr_pdcp_tick(int frame, int subframe);
|
||||||
|
nr_rlc_tick(proc->frame_rx, proc->nr_slot_rx / UE->frame_parms.slots_per_subframe);
|
||||||
|
nr_pdcp_tick(proc->frame_rx, proc->nr_slot_rx / UE->frame_parms.slots_per_subframe);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1702,6 +1702,7 @@ void mac_remove_nr_ue(module_id_t mod_id, rnti_t rnti)
|
|||||||
{
|
{
|
||||||
int UE_id;
|
int UE_id;
|
||||||
int i;
|
int i;
|
||||||
|
int cc_id;
|
||||||
NR_UE_info_t *UE_info = &RC.nrmac[mod_id]->UE_info;
|
NR_UE_info_t *UE_info = &RC.nrmac[mod_id]->UE_info;
|
||||||
|
|
||||||
for (i = 0; i < MAX_MOBILES_PER_GNB; i++) {
|
for (i = 0; i < MAX_MOBILES_PER_GNB; i++) {
|
||||||
@@ -1738,6 +1739,20 @@ void mac_remove_nr_ue(module_id_t mod_id, rnti_t rnti)
|
|||||||
rnti_to_remove_count++;
|
rnti_to_remove_count++;
|
||||||
if (pthread_mutex_unlock(&rnti_to_remove_mutex)) exit(1);
|
if (pthread_mutex_unlock(&rnti_to_remove_mutex)) exit(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* clear RA process(es?) associated to the UE */
|
||||||
|
for (cc_id = 0; cc_id < NFAPI_CC_MAX; cc_id++) {
|
||||||
|
NR_COMMON_channels_t *cc = &RC.nrmac[mod_id]->common_channels[cc_id];
|
||||||
|
for (i = 0; i < NR_NB_RA_PROC_MAX; i++) {
|
||||||
|
if (cc->ra[i].rnti == rnti) {
|
||||||
|
LOG_D(MAC, "free RA process %d for rnti %d\n", i, rnti);
|
||||||
|
/* is it enough? */
|
||||||
|
cc->ra[i].cfra = false;
|
||||||
|
cc->ra[i].rnti = 0;
|
||||||
|
cc->ra[i].crnti = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
uint8_t nr_get_tpc(int target, uint8_t cqi, int incr) {
|
uint8_t nr_get_tpc(int target, uint8_t cqi, int incr) {
|
||||||
|
|||||||
@@ -650,7 +650,7 @@ control:
|
|||||||
control_decoder = decoder;
|
control_decoder = decoder;
|
||||||
control_e1 = e1;
|
control_e1 = e1;
|
||||||
while (control_e1) {
|
while (control_e1) {
|
||||||
nr_rlc_pdu_decoder_get_bits(&control_decoder, entity->sn_field_length); R(control_decoder); /* NACK_SN */
|
nack_sn = nr_rlc_pdu_decoder_get_bits(&control_decoder, entity->sn_field_length); R(control_decoder);
|
||||||
control_e1 = nr_rlc_pdu_decoder_get_bits(&control_decoder, 1); R(control_decoder);
|
control_e1 = nr_rlc_pdu_decoder_get_bits(&control_decoder, 1); R(control_decoder);
|
||||||
control_e2 = nr_rlc_pdu_decoder_get_bits(&control_decoder, 1); R(control_decoder);
|
control_e2 = nr_rlc_pdu_decoder_get_bits(&control_decoder, 1); R(control_decoder);
|
||||||
control_e3 = nr_rlc_pdu_decoder_get_bits(&control_decoder, 1); R(control_decoder);
|
control_e3 = nr_rlc_pdu_decoder_get_bits(&control_decoder, 1); R(control_decoder);
|
||||||
@@ -660,17 +660,36 @@ control:
|
|||||||
} else {
|
} else {
|
||||||
nr_rlc_pdu_decoder_get_bits(&control_decoder, 1); R(control_decoder);
|
nr_rlc_pdu_decoder_get_bits(&control_decoder, 1); R(control_decoder);
|
||||||
}
|
}
|
||||||
|
/* check range and so_start/so_end consistency */
|
||||||
if (control_e2) {
|
if (control_e2) {
|
||||||
nr_rlc_pdu_decoder_get_bits(&control_decoder, 16); R(control_decoder); /* SOstart */
|
so_start = nr_rlc_pdu_decoder_get_bits(&control_decoder, 16); R(control_decoder);
|
||||||
nr_rlc_pdu_decoder_get_bits(&control_decoder, 16); R(control_decoder); /* SOend */
|
so_end = nr_rlc_pdu_decoder_get_bits(&control_decoder, 16); R(control_decoder);
|
||||||
|
} else {
|
||||||
|
so_start = 0;
|
||||||
|
so_end = 0xffff;
|
||||||
}
|
}
|
||||||
if (control_e3) {
|
if (control_e3) {
|
||||||
nr_rlc_pdu_decoder_get_bits(&control_decoder, 8); R(control_decoder); /* NACK range */
|
range = nr_rlc_pdu_decoder_get_bits(&control_decoder, 8); R(control_decoder);
|
||||||
|
} else {
|
||||||
|
range = 1;
|
||||||
|
}
|
||||||
|
if (range < 1) {
|
||||||
|
LOG_E(RLC, "%s:%d:%s: error, bad 'range' in RLC NACK (sn %d)\n",
|
||||||
|
__FILE__, __LINE__, __FUNCTION__, nack_sn);
|
||||||
|
goto err;
|
||||||
|
}
|
||||||
|
/* so_start can be > so_end if more than one range; they don't refer
|
||||||
|
* to the same PDU then
|
||||||
|
*/
|
||||||
|
if (range == 1 && so_end < so_start) {
|
||||||
|
LOG_E(RLC, "%s:%d:%s: error, bad so start/end (sn %d)\n",
|
||||||
|
__FILE__, __LINE__, __FUNCTION__, nack_sn);
|
||||||
|
goto err;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* 38.322 5.3.3.3 says to stop t_poll_retransmit if a ACK or NACK is
|
/* 38.322 5.3.3.3 says to stop t_poll_retransmit if a ACK or NACK is
|
||||||
* received for the SN 'poll_sn'
|
* received for the SN 'poll_sn' - check ACK case (NACK done below)
|
||||||
*/
|
*/
|
||||||
if (sn_compare_tx(entity, entity->poll_sn, ack_sn) < 0)
|
if (sn_compare_tx(entity, entity->poll_sn, ack_sn) < 0)
|
||||||
entity->t_poll_retransmit_start = 0;
|
entity->t_poll_retransmit_start = 0;
|
||||||
@@ -697,28 +716,22 @@ control:
|
|||||||
if (e2) {
|
if (e2) {
|
||||||
so_start = nr_rlc_pdu_decoder_get_bits(&decoder, 16); R(decoder);
|
so_start = nr_rlc_pdu_decoder_get_bits(&decoder, 16); R(decoder);
|
||||||
so_end = nr_rlc_pdu_decoder_get_bits(&decoder, 16); R(decoder);
|
so_end = nr_rlc_pdu_decoder_get_bits(&decoder, 16); R(decoder);
|
||||||
if (so_end < so_start) {
|
|
||||||
LOG_W(RLC, "%s:%d:%s: warning, bad so start/end, NACK the whole PDU (sn %d)\n",
|
|
||||||
__FILE__, __LINE__, __FUNCTION__, nack_sn);
|
|
||||||
so_start = 0;
|
|
||||||
so_end = -1;
|
|
||||||
}
|
|
||||||
/* special value 0xffff indicates 'all bytes to the end' */
|
|
||||||
if (so_end == 0xffff)
|
|
||||||
so_end = -1;
|
|
||||||
} else {
|
} else {
|
||||||
so_start = 0;
|
so_start = 0;
|
||||||
so_end = -1;
|
so_end = 0xffff;
|
||||||
}
|
}
|
||||||
if (e3) {
|
if (e3) {
|
||||||
range = nr_rlc_pdu_decoder_get_bits(&decoder, 8); R(decoder);
|
range = nr_rlc_pdu_decoder_get_bits(&decoder, 8); R(decoder);
|
||||||
} else {
|
} else {
|
||||||
range = 1;
|
range = 1;
|
||||||
}
|
}
|
||||||
|
/* special value 0xffff indicates 'all bytes to the end' */
|
||||||
|
if (so_end == 0xffff)
|
||||||
|
so_end = -1;
|
||||||
process_received_nack(entity, nack_sn, so_start, so_end, range, sn_set);
|
process_received_nack(entity, nack_sn, so_start, so_end, range, sn_set);
|
||||||
|
|
||||||
/* 38.322 5.3.3.3 says to stop t_poll_retransmit if a ACK or NACK is
|
/* 38.322 5.3.3.3 says to stop t_poll_retransmit if a ACK or NACK is
|
||||||
* received for the SN 'poll_sn'
|
* received for the SN 'poll_sn' - check NACK case (ACK done above)
|
||||||
*/
|
*/
|
||||||
if (sn_compare_tx(entity, nack_sn, entity->poll_sn) <= 0 &&
|
if (sn_compare_tx(entity, nack_sn, entity->poll_sn) <= 0 &&
|
||||||
sn_compare_tx(entity, entity->poll_sn, (nack_sn + range) % entity->sn_modulus) < 0)
|
sn_compare_tx(entity, entity->poll_sn, (nack_sn + range) % entity->sn_modulus) < 0)
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
#!/bin/sh
|
#!/bin/sh
|
||||||
|
|
||||||
test_count=14
|
test_count=15
|
||||||
|
|
||||||
for i in `seq $test_count`
|
for i in `seq $test_count`
|
||||||
do
|
do
|
||||||
|
|||||||
@@ -0,0 +1,19 @@
|
|||||||
|
/*
|
||||||
|
* am test (SN field size 18):
|
||||||
|
* test "range" in NACK, generate a case where so_start > so_end
|
||||||
|
* (so so_start and so_end are not from the same PDU)
|
||||||
|
*/
|
||||||
|
|
||||||
|
TIME, 1,
|
||||||
|
GNB_AM, 100000, 100000, 45, 35, 0, -1, -1, 8, 18,
|
||||||
|
UE_AM, 100000, 100000, 45, 35, 0, -1, -1, 8, 18,
|
||||||
|
GNB_PDU_SIZE, 40,
|
||||||
|
UE_PDU_SIZE, 80,
|
||||||
|
GNB_SDU, 0, 50,
|
||||||
|
GNB_SDU, 1, 50,
|
||||||
|
GNB_SDU, 2, 50,
|
||||||
|
TIME, 2,
|
||||||
|
UE_RECV_FAILS, 1,
|
||||||
|
TIME, 4,
|
||||||
|
UE_RECV_FAILS, 0,
|
||||||
|
TIME, -1
|
||||||
Binary file not shown.
@@ -67,6 +67,8 @@
|
|||||||
|
|
||||||
#define MAX_NUM_NEIGH_CELLs 6 /* maximum neighbouring cells number */
|
#define MAX_NUM_NEIGH_CELLs 6 /* maximum neighbouring cells number */
|
||||||
|
|
||||||
|
#define MAX_NUM_GNB_CELLs 1 /* maximum gNB cells number */
|
||||||
|
|
||||||
#define UE_STATE_NOTIFICATION_INTERVAL 50
|
#define UE_STATE_NOTIFICATION_INTERVAL 50
|
||||||
|
|
||||||
#define IPV4_ADDR "%u.%u.%u.%u"
|
#define IPV4_ADDR "%u.%u.%u.%u"
|
||||||
@@ -804,8 +806,13 @@ typedef struct eNB_RRC_INST_s {
|
|||||||
int num_neigh_cells_cc[MAX_NUM_CCs];
|
int num_neigh_cells_cc[MAX_NUM_CCs];
|
||||||
uint32_t neigh_cells_id[MAX_NUM_NEIGH_CELLs][MAX_NUM_CCs];
|
uint32_t neigh_cells_id[MAX_NUM_NEIGH_CELLs][MAX_NUM_CCs];
|
||||||
|
|
||||||
|
// gNB cells connected to this eNB
|
||||||
|
int num_gnb_cells;
|
||||||
|
int num_gnb_cells_cc[MAX_NUM_GNB_CELLs];
|
||||||
|
uint32_t gnb_cells_id[MAX_NUM_GNB_CELLs][MAX_NUM_CCs];
|
||||||
|
|
||||||
// Nr scc freq band and SSB absolute frequency
|
// Nr scc freq band and SSB absolute frequency
|
||||||
uint32_t nr_neigh_freq_band[MAX_NUM_NEIGH_CELLs][MAX_NUM_CCs];
|
uint32_t nr_gnb_freq_band[MAX_NUM_GNB_CELLs][MAX_NUM_CCs];
|
||||||
int nr_scg_ssb_freq;
|
int nr_scg_ssb_freq;
|
||||||
|
|
||||||
// other RAN parameters
|
// other RAN parameters
|
||||||
|
|||||||
+18
-13
@@ -1283,7 +1283,7 @@ rrc_eNB_generate_UECapabilityEnquiry(
|
|||||||
T(T_ENB_RRC_UE_CAPABILITY_ENQUIRY, T_INT(ctxt_pP->module_id), T_INT(ctxt_pP->frame),
|
T(T_ENB_RRC_UE_CAPABILITY_ENQUIRY, T_INT(ctxt_pP->module_id), T_INT(ctxt_pP->frame),
|
||||||
T_INT(ctxt_pP->subframe), T_INT(ctxt_pP->rnti));
|
T_INT(ctxt_pP->subframe), T_INT(ctxt_pP->rnti));
|
||||||
int16_t eutra_band = RC.rrc[ctxt_pP->module_id]->configuration.eutra_band[0];
|
int16_t eutra_band = RC.rrc[ctxt_pP->module_id]->configuration.eutra_band[0];
|
||||||
uint32_t nr_band = RC.rrc[ctxt_pP->module_id]->nr_neigh_freq_band[0][0];
|
uint32_t nr_band = RC.rrc[ctxt_pP->module_id]->nr_gnb_freq_band[0][0];
|
||||||
size = do_UECapabilityEnquiry(
|
size = do_UECapabilityEnquiry(
|
||||||
ctxt_pP,
|
ctxt_pP,
|
||||||
buffer,
|
buffer,
|
||||||
@@ -1333,7 +1333,7 @@ rrc_eNB_generate_NR_UECapabilityEnquiry(
|
|||||||
T(T_ENB_RRC_UE_CAPABILITY_ENQUIRY, T_INT(ctxt_pP->module_id), T_INT(ctxt_pP->frame),
|
T(T_ENB_RRC_UE_CAPABILITY_ENQUIRY, T_INT(ctxt_pP->module_id), T_INT(ctxt_pP->frame),
|
||||||
T_INT(ctxt_pP->subframe), T_INT(ctxt_pP->rnti));
|
T_INT(ctxt_pP->subframe), T_INT(ctxt_pP->rnti));
|
||||||
int16_t eutra_band = RC.rrc[ctxt_pP->module_id]->configuration.eutra_band[0];
|
int16_t eutra_band = RC.rrc[ctxt_pP->module_id]->configuration.eutra_band[0];
|
||||||
uint32_t nr_band = RC.rrc[ctxt_pP->module_id]->nr_neigh_freq_band[0][0];
|
uint32_t nr_band = RC.rrc[ctxt_pP->module_id]->nr_gnb_freq_band[0][0];
|
||||||
size = do_NR_UECapabilityEnquiry(
|
size = do_NR_UECapabilityEnquiry(
|
||||||
ctxt_pP,
|
ctxt_pP,
|
||||||
buffer,
|
buffer,
|
||||||
@@ -7588,8 +7588,8 @@ is_en_dc_supported(
|
|||||||
)
|
)
|
||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
{
|
{
|
||||||
/* to be refined - check that the eNB is connected to a gNB, check that
|
/* to be refined - check that the bands supported by the UE include
|
||||||
* the bands supported by the UE include the band of the gNB
|
* the band of the gNB
|
||||||
*/
|
*/
|
||||||
#define NCE nonCriticalExtension
|
#define NCE nonCriticalExtension
|
||||||
return c != NULL
|
return c != NULL
|
||||||
@@ -8289,8 +8289,13 @@ rrc_eNB_decode_dcch(
|
|||||||
ue_context_p->ue_context.UE_Capability = 0;
|
ue_context_p->ue_context.UE_Capability = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (dec_rval.code == RC_OK)
|
if (dec_rval.code == RC_OK) {
|
||||||
ue_context_p->ue_context.does_nr = is_en_dc_supported(ue_context_p->ue_context.UE_Capability);
|
/* do NR only if at least one gNB connected */
|
||||||
|
if (RC.rrc[ctxt_pP->module_id]->num_gnb_cells != 0)
|
||||||
|
ue_context_p->ue_context.does_nr = is_en_dc_supported(ue_context_p->ue_context.UE_Capability);
|
||||||
|
else
|
||||||
|
ue_context_p->ue_context.does_nr = 0;
|
||||||
|
}
|
||||||
|
|
||||||
if (EPC_MODE_ENABLED) {
|
if (EPC_MODE_ENABLED) {
|
||||||
rrc_eNB_send_S1AP_UE_CAPABILITIES_IND(ctxt_pP,
|
rrc_eNB_send_S1AP_UE_CAPABILITIES_IND(ctxt_pP,
|
||||||
@@ -9029,22 +9034,22 @@ void rrc_subframe_process(protocol_ctxt_t *const ctxt_pP, const int CC_id) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void rrc_eNB_process_ENDC_x2_setup_request(int mod_id, x2ap_ENDC_setup_req_t *m) {
|
void rrc_eNB_process_ENDC_x2_setup_request(int mod_id, x2ap_ENDC_setup_req_t *m) {
|
||||||
if (RC.rrc[mod_id]->num_neigh_cells > MAX_NUM_NEIGH_CELLs) {
|
if (RC.rrc[mod_id]->num_gnb_cells >= MAX_NUM_GNB_CELLs) {
|
||||||
LOG_E(RRC, "Error: number of neighbouring cells is exceeded \n");
|
LOG_E(RRC, "Error: number of gNB cells is exceeded\n");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (m->num_cc > MAX_NUM_CCs) {
|
if (m->num_cc > MAX_NUM_CCs) {
|
||||||
LOG_E(RRC, "Error: number of neighbouring cells carriers is exceeded \n");
|
LOG_E(RRC, "Error: number of gNB cells carriers is exceeded \n");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
RC.rrc[mod_id]->num_neigh_cells++;
|
RC.rrc[mod_id]->num_gnb_cells++;
|
||||||
RC.rrc[mod_id]->num_neigh_cells_cc[RC.rrc[mod_id]->num_neigh_cells-1] = m->num_cc;
|
RC.rrc[mod_id]->num_gnb_cells_cc[RC.rrc[mod_id]->num_gnb_cells-1] = m->num_cc;
|
||||||
|
|
||||||
for (int i=0; i<m->num_cc; i++) {
|
for (int i=0; i<m->num_cc; i++) {
|
||||||
RC.rrc[mod_id]->neigh_cells_id[RC.rrc[mod_id]->num_neigh_cells-1][i] = m->Nid_cell[i];
|
RC.rrc[mod_id]->gnb_cells_id[RC.rrc[mod_id]->num_gnb_cells-1][i] = m->Nid_cell[i];
|
||||||
RC.rrc[mod_id]->nr_neigh_freq_band[RC.rrc[mod_id]->num_neigh_cells-1][i] = m->servedNrCell_band[i];
|
RC.rrc[mod_id]->nr_gnb_freq_band[RC.rrc[mod_id]->num_gnb_cells-1][i] = m->servedNrCell_band[i];
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -116,9 +116,7 @@ void x2ap_eNB_handle_sctp_association_resp(instance_t instance, sctp_new_associa
|
|||||||
/* some sanity check - to be refined at some point */
|
/* some sanity check - to be refined at some point */
|
||||||
if (sctp_new_association_resp->sctp_state != SCTP_STATE_ESTABLISHED) {
|
if (sctp_new_association_resp->sctp_state != SCTP_STATE_ESTABLISHED) {
|
||||||
X2AP_ERROR("x2ap_enb_data_p not NULL and sctp state not SCTP_STATE_ESTABLISHED, what to do?\n");
|
X2AP_ERROR("x2ap_enb_data_p not NULL and sctp state not SCTP_STATE_ESTABLISHED, what to do?\n");
|
||||||
// Allow for a gracious exit when we kill first the gNB, then the eNB
|
exit(1);
|
||||||
//abort();
|
|
||||||
return;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
x2ap_enb_data_p->in_streams = sctp_new_association_resp->in_streams;
|
x2ap_enb_data_p->in_streams = sctp_new_association_resp->in_streams;
|
||||||
|
|||||||
@@ -690,9 +690,11 @@ int x2ap_eNB_handle_x2_setup_failure(instance_t instance,
|
|||||||
// need a FSM to handle all cases
|
// need a FSM to handle all cases
|
||||||
if ((ie->value.choice.Cause.present == X2AP_Cause_PR_misc) &&
|
if ((ie->value.choice.Cause.present == X2AP_Cause_PR_misc) &&
|
||||||
(ie->value.choice.Cause.choice.misc == X2AP_CauseMisc_unspecified)) {
|
(ie->value.choice.Cause.choice.misc == X2AP_CauseMisc_unspecified)) {
|
||||||
X2AP_WARN("Received X2 setup failure for eNB ... eNB is not ready\n");
|
X2AP_ERROR("Received X2 setup failure for eNB ... eNB is not ready\n");
|
||||||
|
exit(1);
|
||||||
} else {
|
} else {
|
||||||
X2AP_ERROR("Received x2 setup failure for eNB... please check your parameters\n");
|
X2AP_ERROR("Received x2 setup failure for eNB... please check your parameters\n");
|
||||||
|
exit(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
x2ap_eNB_data->state = X2AP_ENB_STATE_WAITING;
|
x2ap_eNB_data->state = X2AP_ENB_STATE_WAITING;
|
||||||
|
|||||||
Reference in New Issue
Block a user