Merge remote-tracking branch 'origin/develop' into nr_prs
@@ -278,6 +278,26 @@ pipeline {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
stage ("SA B200 Sanity Check") {
|
||||||
|
when { expression {doMandatoryTests} }
|
||||||
|
steps {
|
||||||
|
script {
|
||||||
|
triggerSlaveJob ('RAN-SA-B200-Module-SABOX-Container', 'Test-SA-B200')
|
||||||
|
}
|
||||||
|
}
|
||||||
|
post {
|
||||||
|
always {
|
||||||
|
script {
|
||||||
|
finalizeSlaveJob('RAN-SA-B200-Module-SABOX-Container')
|
||||||
|
}
|
||||||
|
}
|
||||||
|
failure {
|
||||||
|
script {
|
||||||
|
currentBuild.result = 'FAILURE'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
stage ("Test OAI NR UE - OAI gNB - TDD - Band 78 - N300") {
|
stage ("Test OAI NR UE - OAI gNB - TDD - Band 78 - N300") {
|
||||||
when { expression {doMandatoryTests} }
|
when { expression {doMandatoryTests} }
|
||||||
steps {
|
steps {
|
||||||
|
|||||||
@@ -66,7 +66,7 @@ pipeline {
|
|||||||
withCredentials([
|
withCredentials([
|
||||||
[$class: 'UsernamePasswordMultiBinding', credentialsId: "${params.DH_Credentials}", usernameVariable: 'DH_Username', passwordVariable: 'DH_Password']
|
[$class: 'UsernamePasswordMultiBinding', credentialsId: "${params.DH_Credentials}", usernameVariable: 'DH_Username', passwordVariable: 'DH_Password']
|
||||||
]) {
|
]) {
|
||||||
def listOfImages = ["oai-enb", "oai-gnb", "oai-lte-ue", "oai-nr-ue"]
|
def listOfImages = ["oai-enb", "oai-gnb", "oai-lte-ue", "oai-nr-ue", "proxy"]
|
||||||
sh "docker login -u ${DH_Username} -p ${DH_Password} > /dev/null 2>&1"
|
sh "docker login -u ${DH_Username} -p ${DH_Password} > /dev/null 2>&1"
|
||||||
listOfImages.eachWithIndex { item, iindex ->
|
listOfImages.eachWithIndex { item, iindex ->
|
||||||
sh "docker image tag ${item}:develop ${DH_Account}/${item}:develop"
|
sh "docker image tag ${item}:develop ${DH_Account}/${item}:develop"
|
||||||
|
|||||||
@@ -36,6 +36,9 @@ def testStageName = params.pipelineTestStageName
|
|||||||
// Name of the phone resource
|
// Name of the phone resource
|
||||||
def ciSmartPhoneResource = params.smartphonesResource
|
def ciSmartPhoneResource = params.smartphonesResource
|
||||||
|
|
||||||
|
// Name of the phone resource
|
||||||
|
def ciEpcResource = params.epcResource
|
||||||
|
|
||||||
// Global Parameters. Normally they should be populated when the master job
|
// Global Parameters. Normally they should be populated when the master job
|
||||||
// triggers the slave job with parameters
|
// triggers the slave job with parameters
|
||||||
def eNB_Repository
|
def eNB_Repository
|
||||||
@@ -51,7 +54,7 @@ pipeline {
|
|||||||
options {
|
options {
|
||||||
disableConcurrentBuilds()
|
disableConcurrentBuilds()
|
||||||
ansiColor('xterm')
|
ansiColor('xterm')
|
||||||
lock (ciSmartPhoneResource)
|
lock(extra: [[resource: ciEpcResource]], resource: ciSmartPhoneResource)
|
||||||
}
|
}
|
||||||
stages {
|
stages {
|
||||||
stage ("Verify Parameters") {
|
stage ("Verify Parameters") {
|
||||||
@@ -216,6 +219,76 @@ pipeline {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
stage ("Terminate") {
|
||||||
|
parallel {
|
||||||
|
stage('Terminate UE') {
|
||||||
|
// Bypassing this stage if there are no abd server defined
|
||||||
|
when {
|
||||||
|
expression { params.ADB_IPAddress != "none" }
|
||||||
|
}
|
||||||
|
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}"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
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}"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
stage('Terminate SPGW') {
|
||||||
|
// Bypassing this stage if EPC server is not defined
|
||||||
|
when {
|
||||||
|
expression { params.EPC_IPAddress != "none" }
|
||||||
|
}
|
||||||
|
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}"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
stage('Terminate MME') {
|
||||||
|
// Bypassing this stage if EPC server is not defined
|
||||||
|
when {
|
||||||
|
expression { params.EPC_IPAddress != "none" }
|
||||||
|
}
|
||||||
|
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}"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
stage('Terminate HSS') {
|
||||||
|
// Bypassing this stage if EPC server is not defined
|
||||||
|
when {
|
||||||
|
expression { params.EPC_IPAddress != "none" }
|
||||||
|
}
|
||||||
|
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}"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
stage('Log Collection') {
|
stage('Log Collection') {
|
||||||
parallel {
|
parallel {
|
||||||
stage('Log Collection (eNB - Build)') {
|
stage('Log Collection (eNB - Build)') {
|
||||||
@@ -242,7 +315,7 @@ pipeline {
|
|||||||
[$class: 'UsernamePasswordMultiBinding', credentialsId: "${params.eNB_Credentials}", usernameVariable: 'eNB_Username', passwordVariable: 'eNB_Password']
|
[$class: 'UsernamePasswordMultiBinding', credentialsId: "${params.eNB_Credentials}", usernameVariable: 'eNB_Username', passwordVariable: 'eNB_Password']
|
||||||
]) {
|
]) {
|
||||||
echo '\u2705 \u001B[32mLog Collection (eNB - Run)\u001B[0m'
|
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}"
|
sh "python3 ci-scripts/main.py --mode=LogCollecteNB --eNBIPAddress=${params.eNB_IPAddress} --eNBUserName=${eNB_Username} --eNBPassword=${eNB_Password} --eNBSourceCodePath=${params.eNB_SourceCodePath} --BuildId=${env.BUILD_ID}"
|
||||||
|
|
||||||
echo '\u2705 \u001B[32mLog Transfer (eNB - Run)\u001B[0m'
|
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"
|
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"
|
||||||
@@ -259,6 +332,116 @@ pipeline {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
stage('Log Collection (SPGW)') {
|
||||||
|
// Bypassing this stage if EPC server is not defined
|
||||||
|
when {
|
||||||
|
expression { params.EPC_IPAddress != "none" }
|
||||||
|
}
|
||||||
|
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)') {
|
||||||
|
// Bypassing this stage if EPC server is not defined
|
||||||
|
when {
|
||||||
|
expression { params.EPC_IPAddress != "none" }
|
||||||
|
}
|
||||||
|
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)') {
|
||||||
|
// Bypassing this stage if EPC server is not defined
|
||||||
|
when {
|
||||||
|
expression { params.EPC_IPAddress != "none" }
|
||||||
|
}
|
||||||
|
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)') {
|
||||||
|
// Bypassing this stage if EPC server is not defined
|
||||||
|
when {
|
||||||
|
expression { params.EPC_IPAddress != "none" }
|
||||||
|
}
|
||||||
|
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)') {
|
||||||
|
// Bypassing this stage if EPC server is not defined
|
||||||
|
when {
|
||||||
|
expression { params.EPC_IPAddress != "none" }
|
||||||
|
}
|
||||||
|
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"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -20,6 +20,9 @@
|
|||||||
* contact@openairinterface.org
|
* contact@openairinterface.org
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
// necessary for reading JSON
|
||||||
|
import groovy.json.JsonSlurper
|
||||||
|
|
||||||
// Template Jenkins Declarative Pipeline script to run Test w/ RF HW
|
// 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
|
// Location of the python executor node shall be in the same subnet as the others servers
|
||||||
@@ -37,12 +40,12 @@ pipeline {
|
|||||||
stages {
|
stages {
|
||||||
stage ("Launcher") {
|
stage ("Launcher") {
|
||||||
steps {
|
steps {
|
||||||
script {
|
script {
|
||||||
//retrieve MR that are opened nd with tag NSA
|
// retrieve MR that are opened nd with tag NSA
|
||||||
MR_LIST= sh returnStdout: true, script: 'curl --silent "https://gitlab.eurecom.fr/api/v4/projects/oai%2Fopenairinterface5g/merge_requests?state=opened&per_page=100&labels=NSA" | jq ".[].iid" || true '
|
MR_LIST = sh returnStdout: true, script: 'curl --silent "https://gitlab.eurecom.fr/api/v4/projects/oai%2Fopenairinterface5g/merge_requests?state=opened&per_page=100&labels=NSA" | jq -cj "[.[].iid]"'
|
||||||
echo "List of selected MR:\n${MR_LIST}"
|
echo "List of selected MRs: ${MR_LIST.trim()}"
|
||||||
def MR_ARRAY = MR_LIST.split('\n')
|
def MR_ARRAY = new JsonSlurper().parseText(MR_LIST.trim())
|
||||||
//for every selected MR, retrieve the branch name and the latest commit
|
// for every selected MR, retrieve the branch name and the latest commit
|
||||||
for (MR in MR_ARRAY) {
|
for (MR in MR_ARRAY) {
|
||||||
SRC_BRANCH=sh returnStdout: true, script: """curl --silent "https://gitlab.eurecom.fr/api/v4/projects/oai%2Fopenairinterface5g/merge_requests/${MR}" | jq ".source_branch" || true """
|
SRC_BRANCH=sh returnStdout: true, script: """curl --silent "https://gitlab.eurecom.fr/api/v4/projects/oai%2Fopenairinterface5g/merge_requests/${MR}" | jq ".source_branch" || true """
|
||||||
SRC_BRANCH=SRC_BRANCH.trim()
|
SRC_BRANCH=SRC_BRANCH.trim()
|
||||||
@@ -113,6 +116,21 @@ pipeline {
|
|||||||
GitPostArgs += jobName + ' ' + build_url + ' ' + build_id + ' ' + jobResult + ' '
|
GitPostArgs += jobName + ' ' + build_url + ' ' + build_id + ' ' + jobResult + ' '
|
||||||
echo GitPostArgs
|
echo GitPostArgs
|
||||||
|
|
||||||
|
//calling SA-AmariS
|
||||||
|
jobName = "RAN-SA-AmariS-CN5G"
|
||||||
|
jobStatus = build job: jobName, wait : true, propagate : false, parameters: [
|
||||||
|
string(name: 'eNB_MR', value: String.valueOf(MR)),
|
||||||
|
string(name: 'eNB_Branch', value: String.valueOf(SRC_BRANCH)),
|
||||||
|
string(name: 'eNB_CommitID', value: String.valueOf(COMMIT_ID)),
|
||||||
|
string(name: 'eNB_TargetBranch', value: String.valueOf(TARGET_BRANCH)),
|
||||||
|
booleanParam(name: 'eNB_mergeRequest', value: Boolean.valueOf(ALLOW_MERGE))
|
||||||
|
]
|
||||||
|
jobResult = jobStatus.getResult()
|
||||||
|
build_url = jobStatus.getAbsoluteUrl()
|
||||||
|
build_id = jobStatus.getNumber().toString()
|
||||||
|
GitPostArgs += jobName + ' ' + build_url + ' ' + build_id + ' ' + jobResult + ' '
|
||||||
|
echo GitPostArgs
|
||||||
|
|
||||||
//calling OAIUE N310-X300
|
//calling OAIUE N310-X300
|
||||||
jobName = "RAN-SA-OAIUE-N310-X300-CN5G"
|
jobName = "RAN-SA-OAIUE-N310-X300-CN5G"
|
||||||
jobStatus = build job: jobName, wait : true, propagate : false, parameters: [
|
jobStatus = build job: jobName, wait : true, propagate : false, parameters: [
|
||||||
|
|||||||
@@ -59,7 +59,7 @@ if [ $# -eq 0 ]
|
|||||||
then
|
then
|
||||||
echo " ---- Checking the whole repository ----"
|
echo " ---- Checking the whole repository ----"
|
||||||
echo ""
|
echo ""
|
||||||
NB_FILES_TO_FORMAT=`astyle --dry-run --options=ci-scripts/astyle-options.txt --recursive *.c *.h | grep -c Formatted || true`
|
NB_FILES_TO_FORMAT=`astyle --dry-run --options=ci-scripts/astyle-options.txt --recursive --exclude=ci-scripts --exclude=cmake_targets *.c *.h | grep -c Formatted || true`
|
||||||
echo "Nb Files that do NOT follow OAI rules: $NB_FILES_TO_FORMAT"
|
echo "Nb Files that do NOT follow OAI rules: $NB_FILES_TO_FORMAT"
|
||||||
echo $NB_FILES_TO_FORMAT > ./oai_rules_result.txt
|
echo $NB_FILES_TO_FORMAT > ./oai_rules_result.txt
|
||||||
|
|
||||||
@@ -136,7 +136,7 @@ fi
|
|||||||
# Merge request scenario
|
# Merge request scenario
|
||||||
|
|
||||||
MERGE_COMMMIT=`git log -n1 --pretty=format:%H`
|
MERGE_COMMMIT=`git log -n1 --pretty=format:%H`
|
||||||
TARGET_INIT_COMMIT=`cat .git/refs/remotes/origin/$TARGET_BRANCH`
|
TARGET_INIT_COMMIT=`git log -n1 --pretty=format:%H origin/$TARGET_BRANCH`
|
||||||
|
|
||||||
echo " ---- Checking the modified files by the merge request ----"
|
echo " ---- Checking the modified files by the merge request ----"
|
||||||
echo ""
|
echo ""
|
||||||
|
|||||||
@@ -50,12 +50,12 @@ amarisoft_ue_1:
|
|||||||
WakeupScript : none
|
WakeupScript : none
|
||||||
DetachScript : none
|
DetachScript : none
|
||||||
#end
|
#end
|
||||||
Cmd : /root/NV17-12-21/ue/lteue
|
Cmd : /root/NV18-06-2022/ue/lteue
|
||||||
Config : /root/NV17-12-21/ue/config/oaicicd-ue-Ping-SATest.cfg
|
Config : /root/NV17-12-21/ue/config/oaicicd-ue-Ping-SATest.cfg
|
||||||
Duration : 60
|
Duration : 60
|
||||||
Ping : /tmp/test_ue1.log
|
Ping : /tmp/test_ue1.log
|
||||||
UELog : /tmp/ue1.log
|
UELog : /tmp/ue1.log
|
||||||
HostIPAddress : 192.168.18.89
|
HostIPAddress : 172.21.16.144
|
||||||
HostUsername : root
|
HostUsername : root
|
||||||
HostPassword : toor
|
HostPassword : toor
|
||||||
HostSourceCodePath : /tmp
|
HostSourceCodePath : /tmp
|
||||||
@@ -71,7 +71,7 @@ amarisoft_ue_2:
|
|||||||
WakeupScript : none
|
WakeupScript : none
|
||||||
DetachScript : none
|
DetachScript : none
|
||||||
#end
|
#end
|
||||||
Cmd : /root/NV17-12-21/ue/lteue
|
Cmd : /root/NV18-06-2022/ue/lteue
|
||||||
Config : /root/NV17-12-21/ue/config/xxxxxxx.cfg #to be updated for an other scenario
|
Config : /root/NV17-12-21/ue/config/xxxxxxx.cfg #to be updated for an other scenario
|
||||||
Duration : 60
|
Duration : 60
|
||||||
Ping :
|
Ping :
|
||||||
|
|||||||
@@ -74,6 +74,7 @@ class Containerize():
|
|||||||
self.eNB2SourceCodePath = ''
|
self.eNB2SourceCodePath = ''
|
||||||
self.forcedWorkspaceCleanup = False
|
self.forcedWorkspaceCleanup = False
|
||||||
self.imageKind = ''
|
self.imageKind = ''
|
||||||
|
self.proxyCommit = None
|
||||||
self.eNB_instance = 0
|
self.eNB_instance = 0
|
||||||
self.eNB_serverId = ['', '', '']
|
self.eNB_serverId = ['', '', '']
|
||||||
self.yamlPath = ['', '', '']
|
self.yamlPath = ['', '', '']
|
||||||
@@ -421,6 +422,124 @@ class Containerize():
|
|||||||
HTML.CreateHtmlTabFooter(False)
|
HTML.CreateHtmlTabFooter(False)
|
||||||
sys.exit(1)
|
sys.exit(1)
|
||||||
|
|
||||||
|
def BuildProxy(self, HTML):
|
||||||
|
if self.ranRepository == '' or self.ranBranch == '' or self.ranCommitID == '':
|
||||||
|
HELP.GenericHelp(CONST.Version)
|
||||||
|
sys.exit('Insufficient Parameter')
|
||||||
|
if self.eNB_serverId[self.eNB_instance] == '0':
|
||||||
|
lIpAddr = self.eNBIPAddress
|
||||||
|
lUserName = self.eNBUserName
|
||||||
|
lPassWord = self.eNBPassword
|
||||||
|
lSourcePath = self.eNBSourceCodePath
|
||||||
|
elif self.eNB_serverId[self.eNB_instance] == '1':
|
||||||
|
lIpAddr = self.eNB1IPAddress
|
||||||
|
lUserName = self.eNB1UserName
|
||||||
|
lPassWord = self.eNB1Password
|
||||||
|
lSourcePath = self.eNB1SourceCodePath
|
||||||
|
elif self.eNB_serverId[self.eNB_instance] == '2':
|
||||||
|
lIpAddr = self.eNB2IPAddress
|
||||||
|
lUserName = self.eNB2UserName
|
||||||
|
lPassWord = self.eNB2Password
|
||||||
|
lSourcePath = self.eNB2SourceCodePath
|
||||||
|
if lIpAddr == '' or lUserName == '' or lPassWord == '' or lSourcePath == '':
|
||||||
|
HELP.GenericHelp(CONST.Version)
|
||||||
|
sys.exit('Insufficient Parameter')
|
||||||
|
if self.proxyCommit is None:
|
||||||
|
HELP.GenericHelp(CONST.Version)
|
||||||
|
sys.exit('Insufficient Parameter (need proxyCommit for proxy build)')
|
||||||
|
logging.debug('Building on server: ' + lIpAddr)
|
||||||
|
mySSH = SSH.SSHConnection()
|
||||||
|
mySSH.open(lIpAddr, lUserName, lPassWord)
|
||||||
|
|
||||||
|
# Check that we are on Ubuntu
|
||||||
|
mySSH.command('hostnamectl', '\$', 5)
|
||||||
|
result = re.search('Ubuntu', mySSH.getBefore())
|
||||||
|
self.host = result.group(0)
|
||||||
|
if self.host != 'Ubuntu':
|
||||||
|
logging.error('\u001B[1m Can build proxy only on Ubuntu server\u001B[0m')
|
||||||
|
mySSH.close()
|
||||||
|
sys.exit(1)
|
||||||
|
|
||||||
|
self.cli = 'docker'
|
||||||
|
self.cliBuildOptions = '--no-cache'
|
||||||
|
|
||||||
|
# Workaround for some servers, we need to erase completely the workspace
|
||||||
|
if self.forcedWorkspaceCleanup:
|
||||||
|
mySSH.command('echo ' + lPassWord + ' | sudo -S rm -Rf ' + lSourcePath, '\$', 15)
|
||||||
|
|
||||||
|
oldRanCommidID = self.ranCommitID
|
||||||
|
oldRanRepository = self.ranRepository
|
||||||
|
oldRanAllowMerge = self.ranAllowMerge
|
||||||
|
self.ranCommitID = self.proxyCommit
|
||||||
|
self.ranRepository = 'https://github.com/EpiSci/oai-lte-5g-multi-ue-proxy.git'
|
||||||
|
self.ranAllowMerge = False
|
||||||
|
self._createWorkspace(mySSH, lPassWord, lSourcePath)
|
||||||
|
# to prevent accidentally overwriting data that might be used later
|
||||||
|
self.ranCommitID = oldRanCommidID
|
||||||
|
self.ranRepository = oldRanRepository
|
||||||
|
self.ranAllowMerge = oldRanAllowMerge
|
||||||
|
|
||||||
|
# Let's remove any previous run artifacts if still there
|
||||||
|
mySSH.command(self.cli + ' image prune --force', '\$', 30)
|
||||||
|
# Remove any previous proxy image
|
||||||
|
mySSH.command(self.cli + ' image rm oai-lte-multi-ue-proxy:latest || true', '\$', 30)
|
||||||
|
|
||||||
|
tag = self.proxyCommit
|
||||||
|
logging.debug('building L2sim proxy image for tag ' + tag)
|
||||||
|
# check if the corresponding proxy image with tag exists. If not, build it
|
||||||
|
mySSH.command(self.cli + ' image inspect --format=\'Size = {{.Size}} bytes\' proxy:' + tag, '\$', 5)
|
||||||
|
buildProxy = mySSH.getBefore().count('o such image') != 0
|
||||||
|
if buildProxy:
|
||||||
|
mySSH.command(self.cli + ' build ' + self.cliBuildOptions + ' --target oai-lte-multi-ue-proxy --tag proxy:' + tag + ' --file docker/Dockerfile.ubuntu18.04 . > cmake_targets/log/proxy-build.log 2>&1', '\$', 180)
|
||||||
|
# Note: at this point, OAI images are flattened, but we cannot do this
|
||||||
|
# here, as the flatten script is not in the proxy repo
|
||||||
|
mySSH.command(self.cli + ' image inspect --format=\'Size = {{.Size}} bytes\' proxy:' + tag, '\$', 5)
|
||||||
|
if mySSH.getBefore().count('o such image') != 0:
|
||||||
|
logging.error('\u001B[1m Build of L2sim proxy failed\u001B[0m')
|
||||||
|
mySSH.close()
|
||||||
|
HTML.CreateHtmlTestRow('commit ' + tag, 'KO', CONST.ALL_PROCESSES_OK)
|
||||||
|
HTML.CreateHtmlTabFooter(False)
|
||||||
|
sys.exit(1)
|
||||||
|
else:
|
||||||
|
logging.debug('L2sim proxy image for tag ' + tag + ' already exists, skipping build')
|
||||||
|
|
||||||
|
# retag the build images to that we pick it up later
|
||||||
|
mySSH.command('docker image tag proxy:' + tag + ' oai-lte-multi-ue-proxy:latest', '\$', 5)
|
||||||
|
|
||||||
|
# no merge: is a push to develop, tag the image so we can push it to the registry
|
||||||
|
if not self.ranAllowMerge:
|
||||||
|
mySSH.command('docker image tag proxy:' + tag + ' proxy:develop', '\$', 5)
|
||||||
|
|
||||||
|
# we assume that the host on which this is built will also run the proxy. The proxy
|
||||||
|
# currently requires the following command, and the docker-compose up mechanism of
|
||||||
|
# the CI does not allow to run arbitrary commands. Note that the following actually
|
||||||
|
# belongs to the deployment, not the build of the proxy...
|
||||||
|
logging.warning('the following command belongs to deployment, but no mechanism exists to exec it there!')
|
||||||
|
mySSH.command('sudo ifconfig lo: 127.0.0.2 netmask 255.0.0.0 up', '\$', 5)
|
||||||
|
|
||||||
|
# Analyzing the logs
|
||||||
|
if buildProxy:
|
||||||
|
self.testCase_id = HTML.testCase_id
|
||||||
|
mySSH.command('cd ' + lSourcePath + '/cmake_targets', '\$', 5)
|
||||||
|
mySSH.command('mkdir -p proxy_build_log_' + self.testCase_id, '\$', 5)
|
||||||
|
mySSH.command('mv log/* ' + 'proxy_build_log_' + self.testCase_id, '\$', 5)
|
||||||
|
if (os.path.isfile('./proxy_build_log_' + self.testCase_id + '.zip')):
|
||||||
|
os.remove('./proxy_build_log_' + self.testCase_id + '.zip')
|
||||||
|
if (os.path.isdir('./proxy_build_log_' + self.testCase_id)):
|
||||||
|
shutil.rmtree('./proxy_build_log_' + self.testCase_id)
|
||||||
|
mySSH.command('zip -r -qq proxy_build_log_' + self.testCase_id + '.zip proxy_build_log_' + self.testCase_id, '\$', 5)
|
||||||
|
mySSH.copyin(lIpAddr, lUserName, lPassWord, lSourcePath + '/cmake_targets/build_log_' + self.testCase_id + '.zip', '.')
|
||||||
|
# don't delete such that we might recover the zips
|
||||||
|
#mySSH.command('rm -f build_log_' + self.testCase_id + '.zip','\$', 5)
|
||||||
|
|
||||||
|
# Cleaning any created tmp volume
|
||||||
|
mySSH.command(self.cli + ' volume prune --force || true','\$', 15)
|
||||||
|
mySSH.close()
|
||||||
|
|
||||||
|
logging.info('\u001B[1m Building L2sim Proxy Image Pass\u001B[0m')
|
||||||
|
HTML.CreateHtmlTestRow('commit ' + tag, 'OK', CONST.ALL_PROCESSES_OK)
|
||||||
|
HTML.CreateHtmlNextTabHeaderTestRow(self.collectInfo, self.allImagesSize)
|
||||||
|
|
||||||
def Copy_Image_to_Test_Server(self, HTML):
|
def Copy_Image_to_Test_Server(self, HTML):
|
||||||
imageTag = 'develop'
|
imageTag = 'develop'
|
||||||
if (self.ranAllowMerge):
|
if (self.ranAllowMerge):
|
||||||
@@ -567,8 +686,10 @@ class Containerize():
|
|||||||
if status:
|
if status:
|
||||||
HTML.CreateHtmlTestRow('N/A', 'OK', CONST.ALL_PROCESSES_OK)
|
HTML.CreateHtmlTestRow('N/A', 'OK', CONST.ALL_PROCESSES_OK)
|
||||||
else:
|
else:
|
||||||
|
self.exitStatus = 1
|
||||||
HTML.CreateHtmlTestRow('N/A', 'KO', CONST.ALL_PROCESSES_OK)
|
HTML.CreateHtmlTestRow('N/A', 'KO', CONST.ALL_PROCESSES_OK)
|
||||||
|
|
||||||
|
|
||||||
def UndeployObject(self, HTML, RAN):
|
def UndeployObject(self, HTML, RAN):
|
||||||
if self.eNB_serverId[self.eNB_instance] == '0':
|
if self.eNB_serverId[self.eNB_instance] == '0':
|
||||||
lIpAddr = self.eNBIPAddress
|
lIpAddr = self.eNBIPAddress
|
||||||
@@ -588,7 +709,7 @@ class Containerize():
|
|||||||
if lIpAddr == '' or lUserName == '' or lPassWord == '' or lSourcePath == '':
|
if lIpAddr == '' or lUserName == '' or lPassWord == '' or lSourcePath == '':
|
||||||
HELP.GenericHelp(CONST.Version)
|
HELP.GenericHelp(CONST.Version)
|
||||||
sys.exit('Insufficient Parameter')
|
sys.exit('Insufficient Parameter')
|
||||||
logging.debug('\u001B[1m Deploying OAI Object on server: ' + lIpAddr + '\u001B[0m')
|
logging.debug('\u001B[1m Undeploying OAI Object from server: ' + lIpAddr + '\u001B[0m')
|
||||||
mySSH = SSH.SSHConnection()
|
mySSH = SSH.SSHConnection()
|
||||||
mySSH.open(lIpAddr, lUserName, lPassWord)
|
mySSH.open(lIpAddr, lUserName, lPassWord)
|
||||||
mySSH.command('cd ' + lSourcePath + '/' + self.yamlPath[self.eNB_instance], '\$', 5)
|
mySSH.command('cd ' + lSourcePath + '/' + self.yamlPath[self.eNB_instance], '\$', 5)
|
||||||
|
|||||||
@@ -168,7 +168,7 @@ class PhySim:
|
|||||||
|
|
||||||
mySSH.close()
|
mySSH.close()
|
||||||
#check build status and update HTML object
|
#check build status and update HTML object
|
||||||
lHTML = html.HTMLManagement()
|
lHTML = cls_oai_html.HTMLManagement()
|
||||||
lHTML=self.__CheckBuild_PhySim(htmlObj,constObj)
|
lHTML=self.__CheckBuild_PhySim(htmlObj,constObj)
|
||||||
return lHTML
|
return lHTML
|
||||||
|
|
||||||
@@ -186,6 +186,6 @@ class PhySim:
|
|||||||
mySSH.command(self.__workSpacePath+'ran_build/build/ldpctest ' + self.runargs + ' >> '+self.__runLogFile, '\$', 30)
|
mySSH.command(self.__workSpacePath+'ran_build/build/ldpctest ' + self.runargs + ' >> '+self.__runLogFile, '\$', 30)
|
||||||
mySSH.close()
|
mySSH.close()
|
||||||
#return updated HTML to main
|
#return updated HTML to main
|
||||||
lHTML = html.HTMLManagement()
|
lHTML = cls_oai_html.HTMLManagement()
|
||||||
lHTML=self.__CheckResults_PhySim(htmlObj,constObj,testcase_id)
|
lHTML=self.__CheckResults_PhySim(htmlObj,constObj,testcase_id)
|
||||||
return lHTML
|
return lHTML
|
||||||
|
|||||||
@@ -37,6 +37,7 @@ import logging
|
|||||||
import os
|
import os
|
||||||
from pathlib import Path
|
from pathlib import Path
|
||||||
import time
|
import time
|
||||||
|
from multiprocessing import Process, Lock, SimpleQueue
|
||||||
|
|
||||||
#-----------------------------------------------------------
|
#-----------------------------------------------------------
|
||||||
# OAI Testing modules
|
# OAI Testing modules
|
||||||
@@ -237,3 +238,205 @@ class StaticCodeAnalysis():
|
|||||||
|
|
||||||
return 0
|
return 0
|
||||||
|
|
||||||
|
def LicenceAndFormattingCheck(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.replace('git/', 'git')
|
||||||
|
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, '\$', 30)
|
||||||
|
# if the branch is not develop, then it is a merge request and we need to do
|
||||||
|
# the potential merge. Note that merge conflicts should already been checked earlier
|
||||||
|
argToPass = ''
|
||||||
|
if (self.ranAllowMerge):
|
||||||
|
argToPass = '--build-arg MERGE_REQUEST=true --build-arg SRC_BRANCH=' + self.ranBranch
|
||||||
|
if self.ranTargetBranch == '':
|
||||||
|
if (self.ranBranch != 'develop') and (self.ranBranch != 'origin/develop'):
|
||||||
|
mySSH.command('git merge --ff origin/develop -m "Temporary merge for CI"', '\$', 5)
|
||||||
|
argToPass += ' --build-arg TARGET_BRANCH=develop '
|
||||||
|
else:
|
||||||
|
logging.debug('Merging with the target branch: ' + self.ranTargetBranch)
|
||||||
|
mySSH.command('git merge --ff origin/' + self.ranTargetBranch + ' -m "Temporary merge for CI"', '\$', 5)
|
||||||
|
argToPass += ' --build-arg TARGET_BRANCH=' + self.ranTargetBranch + ' '
|
||||||
|
|
||||||
|
mySSH.command('docker image rm oai-formatting-check:latest || true', '\$', 60)
|
||||||
|
mySSH.command('docker build --target oai-formatting-check --tag oai-formatting-check:latest ' + argToPass + '--file ci-scripts/docker/Dockerfile.formatting.bionic . > cmake_targets/log/oai-formatting-check.txt 2>&1', '\$', 600)
|
||||||
|
|
||||||
|
mySSH.command('docker image rm oai-formatting-check:latest || true', '\$', 60)
|
||||||
|
mySSH.command('docker image prune --force', '\$', 60)
|
||||||
|
mySSH.command('docker volume prune --force', '\$', 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 + '/*', '.')
|
||||||
|
|
||||||
|
finalStatus = 0
|
||||||
|
if (os.path.isfile('./oai-formatting-check.txt')):
|
||||||
|
analyzed = False
|
||||||
|
nbFilesNotFormatted = 0
|
||||||
|
listFiles = False
|
||||||
|
listFilesNotFormatted = []
|
||||||
|
circularHeaderDependency = False
|
||||||
|
circularHeaderDependencyFiles = []
|
||||||
|
gnuGplLicence = False
|
||||||
|
gnuGplLicenceFiles = []
|
||||||
|
suspectLicence = False
|
||||||
|
suspectLicenceFiles = []
|
||||||
|
with open('./oai-formatting-check.txt', 'r') as logfile:
|
||||||
|
for line in logfile:
|
||||||
|
ret = re.search('./ci-scripts/checkCodingFormattingRules.sh', str(line))
|
||||||
|
if ret is not None:
|
||||||
|
analyzed = True
|
||||||
|
if analyzed:
|
||||||
|
ret = re.search('Nb Files that do NOT follow OAI rules: (?P<nb_errors>[0-9\.]+)', str(line))
|
||||||
|
if ret is not None:
|
||||||
|
nbFilesNotFormatted = int(ret.group('nb_errors'))
|
||||||
|
|
||||||
|
if re.search('=== Files not properly formatted ===', str(line)) is not None:
|
||||||
|
listFiles = True
|
||||||
|
if listFiles:
|
||||||
|
if re.search('Removing intermediate container', str(line)) is not None:
|
||||||
|
listFiles = False
|
||||||
|
elif re.search('Running in|Files not properly formatted', str(line)) is not None:
|
||||||
|
pass
|
||||||
|
else:
|
||||||
|
listFilesNotFormatted.append(str(line).strip())
|
||||||
|
|
||||||
|
if re.search('=== Files with incorrect define protection ===', str(line)) is not None:
|
||||||
|
circularHeaderDependency = True
|
||||||
|
if circularHeaderDependency:
|
||||||
|
if re.search('Removing intermediate container', str(line)) is not None:
|
||||||
|
circularHeaderDependency = False
|
||||||
|
elif re.search('Running in|Files with incorrect define protection', str(line)) is not None:
|
||||||
|
pass
|
||||||
|
else:
|
||||||
|
circularHeaderDependencyFiles.append(str(line).strip())
|
||||||
|
|
||||||
|
if re.search('=== Files with a GNU GPL licence Banner ===', str(line)) is not None:
|
||||||
|
gnuGplLicence = True
|
||||||
|
if gnuGplLicence:
|
||||||
|
if re.search('Removing intermediate container', str(line)) is not None:
|
||||||
|
gnuGplLicence = False
|
||||||
|
elif re.search('Running in|Files with a GNU GPL licence Banner', str(line)) is not None:
|
||||||
|
pass
|
||||||
|
else:
|
||||||
|
gnuGplLicenceFiles.append(str(line).strip())
|
||||||
|
|
||||||
|
if re.search('=== Files with a suspect Banner ===', str(line)) is not None:
|
||||||
|
suspectLicence = True
|
||||||
|
if suspectLicence:
|
||||||
|
if re.search('Removing intermediate container', str(line)) is not None:
|
||||||
|
suspectLicence = False
|
||||||
|
elif re.search('Running in|Files with a suspect Banner', str(line)) is not None:
|
||||||
|
pass
|
||||||
|
else:
|
||||||
|
suspectLicenceFiles.append(str(line).strip())
|
||||||
|
|
||||||
|
logfile.close()
|
||||||
|
if analyzed:
|
||||||
|
logging.debug('files not formatted properly: ' + str(nbFilesNotFormatted))
|
||||||
|
if nbFilesNotFormatted == 0:
|
||||||
|
HTML.CreateHtmlTestRow('File(s) Format', 'OK', CONST.ALL_PROCESSES_OK)
|
||||||
|
else:
|
||||||
|
html_queue = SimpleQueue()
|
||||||
|
html_cell = '<pre style="background-color:white">\n'
|
||||||
|
html_cell += 'Number of files not following OAI Rules: ' + str(nbFilesNotFormatted) + '\n'
|
||||||
|
for nFile in listFilesNotFormatted:
|
||||||
|
html_cell += str(nFile).strip() + '\n'
|
||||||
|
html_cell += '</pre>'
|
||||||
|
html_queue.put(html_cell)
|
||||||
|
HTML.CreateHtmlTestRowQueue('File(s) Format', 'KO', 1, html_queue)
|
||||||
|
del(html_cell)
|
||||||
|
del(html_queue)
|
||||||
|
|
||||||
|
logging.debug('header files not respecting the circular dependency protection: ' + str(len(circularHeaderDependencyFiles)))
|
||||||
|
if len(circularHeaderDependencyFiles) == 0:
|
||||||
|
HTML.CreateHtmlTestRow('Header Circular Dependency', 'OK', CONST.ALL_PROCESSES_OK)
|
||||||
|
else:
|
||||||
|
html_queue = SimpleQueue()
|
||||||
|
html_cell = '<pre style="background-color:white">\n'
|
||||||
|
html_cell += 'Number of files not respecting: ' + str(len(circularHeaderDependencyFiles)) + '\n'
|
||||||
|
for nFile in circularHeaderDependencyFiles:
|
||||||
|
html_cell += str(nFile).strip() + '\n'
|
||||||
|
html_cell += '</pre>'
|
||||||
|
html_queue.put(html_cell)
|
||||||
|
HTML.CreateHtmlTestRowQueue('Header Circular Dependency', 'KO', 1, html_queue)
|
||||||
|
del(html_cell)
|
||||||
|
del(html_queue)
|
||||||
|
finalStatus = -1
|
||||||
|
|
||||||
|
logging.debug('files with a GNU GPL license: ' + str(len(gnuGplLicenceFiles)))
|
||||||
|
if len(gnuGplLicenceFiles) == 0:
|
||||||
|
HTML.CreateHtmlTestRow('Files w/ GNU GPL License', 'OK', CONST.ALL_PROCESSES_OK)
|
||||||
|
else:
|
||||||
|
html_queue = SimpleQueue()
|
||||||
|
html_cell = '<pre style="background-color:white">\n'
|
||||||
|
html_cell += 'Number of files not respecting: ' + str(len(gnuGplLicenceFiles)) + '\n'
|
||||||
|
for nFile in gnuGplLicenceFiles:
|
||||||
|
html_cell += str(nFile).strip() + '\n'
|
||||||
|
html_cell += '</pre>'
|
||||||
|
html_queue.put(html_cell)
|
||||||
|
HTML.CreateHtmlTestRowQueue('Files w/ GNU GPL License', 'KO', 1, html_queue)
|
||||||
|
del(html_cell)
|
||||||
|
del(html_queue)
|
||||||
|
finalStatus = -1
|
||||||
|
|
||||||
|
logging.debug('files with a suspect license: ' + str(len(suspectLicenceFiles)))
|
||||||
|
if len(suspectLicenceFiles) == 0:
|
||||||
|
HTML.CreateHtmlTestRow('Files with suspect license', 'OK', CONST.ALL_PROCESSES_OK)
|
||||||
|
else:
|
||||||
|
html_queue = SimpleQueue()
|
||||||
|
html_cell = '<pre style="background-color:white">\n'
|
||||||
|
html_cell += 'Number of files not respecting: ' + str(len(suspectLicenceFiles)) + '\n'
|
||||||
|
for nFile in suspectLicenceFiles:
|
||||||
|
html_cell += str(nFile).strip() + '\n'
|
||||||
|
html_cell += '</pre>'
|
||||||
|
html_queue.put(html_cell)
|
||||||
|
HTML.CreateHtmlTestRowQueue('Files with suspect license', 'KO', 1, html_queue)
|
||||||
|
del(html_cell)
|
||||||
|
del(html_queue)
|
||||||
|
finalStatus = -1
|
||||||
|
|
||||||
|
else:
|
||||||
|
finalStatus = -1
|
||||||
|
HTML.htmleNBFailureMsg = 'Could not fully analyze oai-formatting-check.txt file'
|
||||||
|
HTML.CreateHtmlTestRow('N/A', 'KO', CONST.ENB_PROCESS_NOLOGFILE_TO_ANALYZE)
|
||||||
|
else:
|
||||||
|
finalStatus = -1
|
||||||
|
HTML.htmleNBFailureMsg = 'Could not access oai-formatting-check.txt file'
|
||||||
|
HTML.CreateHtmlTestRow('N/A', 'KO', CONST.ENB_PROCESS_NOLOGFILE_TO_ANALYZE)
|
||||||
|
|
||||||
|
return finalStatus
|
||||||
|
|||||||
@@ -21,8 +21,6 @@ gNBs =
|
|||||||
|
|
||||||
////////// Physical parameters:
|
////////// Physical parameters:
|
||||||
|
|
||||||
ssb_SubcarrierOffset = 31; //0;
|
|
||||||
|
|
||||||
servingCellConfigCommon = (
|
servingCellConfigCommon = (
|
||||||
{
|
{
|
||||||
#spCellConfigCommon
|
#spCellConfigCommon
|
||||||
|
|||||||
@@ -32,7 +32,6 @@ gNBs =
|
|||||||
|
|
||||||
////////// Physical parameters:
|
////////// Physical parameters:
|
||||||
|
|
||||||
ssb_SubcarrierOffset = 0;
|
|
||||||
min_rxtxtime = 6;
|
min_rxtxtime = 6;
|
||||||
pdcch_ConfigSIB1 = (
|
pdcch_ConfigSIB1 = (
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -21,7 +21,6 @@ gNBs =
|
|||||||
|
|
||||||
////////// Physical parameters:
|
////////// Physical parameters:
|
||||||
|
|
||||||
ssb_SubcarrierOffset = 31; //0;
|
|
||||||
min_rxtxtime = 6;
|
min_rxtxtime = 6;
|
||||||
|
|
||||||
pdcch_ConfigSIB1 = (
|
pdcch_ConfigSIB1 = (
|
||||||
|
|||||||
@@ -32,7 +32,6 @@ gNBs =
|
|||||||
|
|
||||||
////////// Physical parameters:
|
////////// Physical parameters:
|
||||||
|
|
||||||
ssb_SubcarrierOffset = 0;
|
|
||||||
min_rxtxtime = 6;
|
min_rxtxtime = 6;
|
||||||
|
|
||||||
pdcch_ConfigSIB1 = (
|
pdcch_ConfigSIB1 = (
|
||||||
|
|||||||
@@ -21,7 +21,6 @@ gNBs =
|
|||||||
|
|
||||||
////////// Physical parameters:
|
////////// Physical parameters:
|
||||||
|
|
||||||
ssb_SubcarrierOffset = 0;
|
|
||||||
min_rxtxtime = 6;
|
min_rxtxtime = 6;
|
||||||
|
|
||||||
servingCellConfigCommon = (
|
servingCellConfigCommon = (
|
||||||
|
|||||||
@@ -44,7 +44,6 @@ gNBs =
|
|||||||
local_s_portd = 2152;
|
local_s_portd = 2152;
|
||||||
remote_s_portc = 500;
|
remote_s_portc = 500;
|
||||||
remote_s_portd = 2152;
|
remote_s_portd = 2152;
|
||||||
ssb_SubcarrierOffset = 0;
|
|
||||||
min_rxtxtime = 6;
|
min_rxtxtime = 6;
|
||||||
|
|
||||||
pdcch_ConfigSIB1 = (
|
pdcch_ConfigSIB1 = (
|
||||||
|
|||||||
@@ -36,7 +36,6 @@ gNBs =
|
|||||||
|
|
||||||
////////// Physical parameters:
|
////////// Physical parameters:
|
||||||
|
|
||||||
ssb_SubcarrierOffset = 0;
|
|
||||||
min_rxtxtime = 6;
|
min_rxtxtime = 6;
|
||||||
|
|
||||||
pdcch_ConfigSIB1 = (
|
pdcch_ConfigSIB1 = (
|
||||||
|
|||||||
@@ -37,8 +37,7 @@ gNBs =
|
|||||||
|
|
||||||
////////// Physical parameters:
|
////////// Physical parameters:
|
||||||
|
|
||||||
ssb_SubcarrierOffset = 0;
|
pdsch_AntennaPorts_XP = 2;
|
||||||
pdsch_AntennaPorts_N1 = 2;
|
|
||||||
pusch_AntennaPorts = 2;
|
pusch_AntennaPorts = 2;
|
||||||
|
|
||||||
pdcch_ConfigSIB1 = (
|
pdcch_ConfigSIB1 = (
|
||||||
|
|||||||
@@ -38,8 +38,7 @@ gNBs =
|
|||||||
|
|
||||||
////////// Physical parameters:
|
////////// Physical parameters:
|
||||||
|
|
||||||
ssb_SubcarrierOffset = 0;
|
pdsch_AntennaPorts_XP = 2;
|
||||||
pdsch_AntennaPorts_N1 = 2;
|
|
||||||
pusch_AntennaPorts = 2;
|
pusch_AntennaPorts = 2;
|
||||||
|
|
||||||
pdcch_ConfigSIB1 = (
|
pdcch_ConfigSIB1 = (
|
||||||
|
|||||||
@@ -21,7 +21,6 @@ gNBs =
|
|||||||
|
|
||||||
////////// Physical parameters:
|
////////// Physical parameters:
|
||||||
|
|
||||||
ssb_SubcarrierOffset = 0;
|
|
||||||
min_rxtxtime = 6;
|
min_rxtxtime = 6;
|
||||||
|
|
||||||
servingCellConfigCommon = (
|
servingCellConfigCommon = (
|
||||||
|
|||||||
@@ -21,7 +21,6 @@ gNBs =
|
|||||||
|
|
||||||
////////// Physical parameters:
|
////////// Physical parameters:
|
||||||
|
|
||||||
ssb_SubcarrierOffset = 0;
|
|
||||||
min_rxtxtime = 6;
|
min_rxtxtime = 6;
|
||||||
|
|
||||||
servingCellConfigCommon = (
|
servingCellConfigCommon = (
|
||||||
|
|||||||
@@ -19,8 +19,7 @@ gNBs =
|
|||||||
|
|
||||||
////////// Physical parameters:
|
////////// Physical parameters:
|
||||||
|
|
||||||
ssb_SubcarrierOffset = 31; //0;
|
pdsch_AntennaPorts_XP = 2;
|
||||||
pdsch_AntennaPorts_N1 = 2;
|
|
||||||
pusch_AntennaPorts = 2;
|
pusch_AntennaPorts = 2;
|
||||||
ul_prbblacklist = "51,52,53,54"
|
ul_prbblacklist = "51,52,53,54"
|
||||||
|
|
||||||
|
|||||||
@@ -41,7 +41,6 @@ gNBs =
|
|||||||
|
|
||||||
////////// Physical parameters:
|
////////// Physical parameters:
|
||||||
|
|
||||||
ssb_SubcarrierOffset = 0;
|
|
||||||
pusch_AntennaPorts = 2;
|
pusch_AntennaPorts = 2;
|
||||||
ul_prbblacklist = "51,52,53,54"
|
ul_prbblacklist = "51,52,53,54"
|
||||||
do_SRS = 1;
|
do_SRS = 1;
|
||||||
|
|||||||
@@ -37,8 +37,7 @@ gNBs =
|
|||||||
|
|
||||||
////////// Physical parameters:
|
////////// Physical parameters:
|
||||||
|
|
||||||
ssb_SubcarrierOffset = 0;
|
pdsch_AntennaPorts_XP = 2;
|
||||||
pdsch_AntennaPorts_N1 = 2;
|
|
||||||
pusch_AntennaPorts = 2;
|
pusch_AntennaPorts = 2;
|
||||||
ul_prbblacklist = "51,52,53,54"
|
ul_prbblacklist = "51,52,53,54"
|
||||||
do_SRS = 1;
|
do_SRS = 1;
|
||||||
|
|||||||
@@ -37,7 +37,6 @@ gNBs =
|
|||||||
|
|
||||||
////////// Physical parameters:
|
////////// Physical parameters:
|
||||||
|
|
||||||
ssb_SubcarrierOffset = 0;
|
|
||||||
pusch_AntennaPorts = 2;
|
pusch_AntennaPorts = 2;
|
||||||
ul_prbblacklist = "51,52,53,54"
|
ul_prbblacklist = "51,52,53,54"
|
||||||
do_SRS = 1;
|
do_SRS = 1;
|
||||||
|
|||||||
@@ -37,7 +37,6 @@ gNBs =
|
|||||||
|
|
||||||
////////// Physical parameters:
|
////////// Physical parameters:
|
||||||
|
|
||||||
ssb_SubcarrierOffset = 0;
|
|
||||||
#pusch_TargetSNRx10 = 200;
|
#pusch_TargetSNRx10 = 200;
|
||||||
#pucch_TargetSNRx10 = 200;
|
#pucch_TargetSNRx10 = 200;
|
||||||
ul_prbblacklist = "51,52,53,54"
|
ul_prbblacklist = "51,52,53,54"
|
||||||
|
|||||||
@@ -37,8 +37,7 @@ gNBs =
|
|||||||
|
|
||||||
////////// Physical parameters:
|
////////// Physical parameters:
|
||||||
|
|
||||||
ssb_SubcarrierOffset = 0;
|
pdsch_AntennaPorts_XP = 2;
|
||||||
pdsch_AntennaPorts_N1 = 2;
|
|
||||||
pusch_AntennaPorts = 2;
|
pusch_AntennaPorts = 2;
|
||||||
#pusch_TargetSNRx10 = 200;
|
#pusch_TargetSNRx10 = 200;
|
||||||
#pucch_TargetSNRx10 = 200;
|
#pucch_TargetSNRx10 = 200;
|
||||||
|
|||||||
@@ -21,7 +21,6 @@ gNBs =
|
|||||||
|
|
||||||
////////// Physical parameters:
|
////////// Physical parameters:
|
||||||
|
|
||||||
ssb_SubcarrierOffset = 0;
|
|
||||||
min_rxtxtime = 6;
|
min_rxtxtime = 6;
|
||||||
|
|
||||||
servingCellConfigCommon = (
|
servingCellConfigCommon = (
|
||||||
@@ -219,7 +218,7 @@ RUs = (
|
|||||||
## beamforming 4x4 matrix:
|
## beamforming 4x4 matrix:
|
||||||
#bf_weights = [0x00007fff, 0x0000, 0x0000, 0x0000, 0x00000000, 0x00007fff, 0x0000, 0x0000, 0x0000, 0x0000, 0x00007fff, 0x0000, 0x0000, 0x0000, 0x0000, 0x00007fff];
|
#bf_weights = [0x00007fff, 0x0000, 0x0000, 0x0000, 0x00000000, 0x00007fff, 0x0000, 0x0000, 0x0000, 0x0000, 0x00007fff, 0x0000, 0x0000, 0x0000, 0x0000, 0x00007fff];
|
||||||
|
|
||||||
sdr_addrs = "addr=192.168.10.2,second_addr=192.168.20.2,mgmt_addr=192.168.18.85";
|
sdr_addrs = "addr=192.168.10.2,second_addr=192.168.20.2";
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|||||||
@@ -19,7 +19,6 @@ gNBs =
|
|||||||
|
|
||||||
////////// Physical parameters:
|
////////// Physical parameters:
|
||||||
|
|
||||||
ssb_SubcarrierOffset = 31; //0;
|
|
||||||
|
|
||||||
servingCellConfigCommon = (
|
servingCellConfigCommon = (
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -20,7 +20,6 @@ gNBs =
|
|||||||
|
|
||||||
////////// Physical parameters:
|
////////// Physical parameters:
|
||||||
|
|
||||||
ssb_SubcarrierOffset = 31; //0;
|
|
||||||
min_rxtxtime = 6;
|
min_rxtxtime = 6;
|
||||||
|
|
||||||
servingCellConfigCommon = (
|
servingCellConfigCommon = (
|
||||||
|
|||||||
@@ -32,7 +32,6 @@ gNBs =
|
|||||||
|
|
||||||
////////// Physical parameters:
|
////////// Physical parameters:
|
||||||
|
|
||||||
ssb_SubcarrierOffset = 0;
|
|
||||||
min_rxtxtime = 6;
|
min_rxtxtime = 6;
|
||||||
|
|
||||||
pdcch_ConfigSIB1 = (
|
pdcch_ConfigSIB1 = (
|
||||||
|
|||||||
@@ -0,0 +1,344 @@
|
|||||||
|
Active_gNBs = ( "gNB-OAI");
|
||||||
|
# Asn1_verbosity, choice in: none, info, annoying
|
||||||
|
Asn1_verbosity = "none";
|
||||||
|
|
||||||
|
gNBs =
|
||||||
|
(
|
||||||
|
{
|
||||||
|
////////// Identification parameters:
|
||||||
|
gNB_ID = 0xe00;
|
||||||
|
gNB_name = "gNB-OAI";
|
||||||
|
|
||||||
|
// Tracking area code, 0x0000 and 0xfffe are reserved values
|
||||||
|
tracking_area_code = 1;
|
||||||
|
plmn_list = ({
|
||||||
|
mcc = 222;
|
||||||
|
mnc = 01;
|
||||||
|
mnc_length = 2;
|
||||||
|
snssaiList = (
|
||||||
|
{
|
||||||
|
sst = 1;
|
||||||
|
#sd = 0x1; // 0 false, else true
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
});
|
||||||
|
|
||||||
|
nr_cellid = 12345678L;
|
||||||
|
|
||||||
|
////////// Physical parameters:
|
||||||
|
|
||||||
|
min_rxtxtime = 2;
|
||||||
|
do_CSIRS = 1;
|
||||||
|
do_SRS = 1;
|
||||||
|
|
||||||
|
pdcch_ConfigSIB1 = (
|
||||||
|
{
|
||||||
|
controlResourceSetZero = 12;
|
||||||
|
searchSpaceZero = 0;
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
servingCellConfigCommon = (
|
||||||
|
{
|
||||||
|
#spCellConfigCommon
|
||||||
|
|
||||||
|
physCellId = 0;
|
||||||
|
|
||||||
|
# downlinkConfigCommon
|
||||||
|
#frequencyInfoDL
|
||||||
|
# this is 3600 MHz + 43 PRBs@30kHz SCS (same as initial BWP)
|
||||||
|
absoluteFrequencySSB = 641280;
|
||||||
|
dl_frequencyBand = 78;
|
||||||
|
# this is 3600 MHz
|
||||||
|
dl_absoluteFrequencyPointA = 640008;
|
||||||
|
#scs-SpecificCarrierList
|
||||||
|
dl_offstToCarrier = 0;
|
||||||
|
# subcarrierSpacing
|
||||||
|
# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
|
||||||
|
dl_subcarrierSpacing = 1;
|
||||||
|
dl_carrierBandwidth = 106;
|
||||||
|
#initialDownlinkBWP
|
||||||
|
#genericParameters
|
||||||
|
# this is RBstart=27,L=48 (275*(L-1))+RBstart
|
||||||
|
initialDLBWPlocationAndBandwidth = 28875; # 6366 12925 12956 28875 12952
|
||||||
|
# subcarrierSpacing
|
||||||
|
# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
|
||||||
|
initialDLBWPsubcarrierSpacing = 1;
|
||||||
|
#pdcch-ConfigCommon
|
||||||
|
initialDLBWPcontrolResourceSetZero = 12;
|
||||||
|
initialDLBWPsearchSpaceZero = 0;
|
||||||
|
|
||||||
|
#uplinkConfigCommon
|
||||||
|
#frequencyInfoUL
|
||||||
|
ul_frequencyBand = 78;
|
||||||
|
#scs-SpecificCarrierList
|
||||||
|
ul_offstToCarrier = 0;
|
||||||
|
# subcarrierSpacing
|
||||||
|
# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
|
||||||
|
ul_subcarrierSpacing = 1;
|
||||||
|
ul_carrierBandwidth = 106;
|
||||||
|
pMax = 20;
|
||||||
|
#initialUplinkBWP
|
||||||
|
#genericParameters
|
||||||
|
initialULBWPlocationAndBandwidth = 28875;
|
||||||
|
# subcarrierSpacing
|
||||||
|
# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
|
||||||
|
initialULBWPsubcarrierSpacing = 1;
|
||||||
|
#rach-ConfigCommon
|
||||||
|
#rach-ConfigGeneric
|
||||||
|
prach_ConfigurationIndex = 98;
|
||||||
|
#prach_msg1_FDM
|
||||||
|
#0 = one, 1=two, 2=four, 3=eight
|
||||||
|
prach_msg1_FDM = 0;
|
||||||
|
prach_msg1_FrequencyStart = 0;
|
||||||
|
zeroCorrelationZoneConfig = 13;
|
||||||
|
preambleReceivedTargetPower = -96;
|
||||||
|
#preamblTransMax (0...10) = (3,4,5,6,7,8,10,20,50,100,200)
|
||||||
|
preambleTransMax = 6;
|
||||||
|
#powerRampingStep
|
||||||
|
# 0=dB0,1=dB2,2=dB4,3=dB6
|
||||||
|
powerRampingStep = 1;
|
||||||
|
#ra_ReponseWindow
|
||||||
|
#1,2,4,8,10,20,40,80
|
||||||
|
ra_ResponseWindow = 4;
|
||||||
|
#ssb_perRACH_OccasionAndCB_PreamblesPerSSB_PR
|
||||||
|
#1=oneeighth,2=onefourth,3=half,4=one,5=two,6=four,7=eight,8=sixteen
|
||||||
|
ssb_perRACH_OccasionAndCB_PreamblesPerSSB_PR = 4;
|
||||||
|
#oneHalf (0..15) 4,8,12,16,...60,64
|
||||||
|
ssb_perRACH_OccasionAndCB_PreamblesPerSSB = 14;
|
||||||
|
#ra_ContentionResolutionTimer
|
||||||
|
#(0..7) 8,16,24,32,40,48,56,64
|
||||||
|
ra_ContentionResolutionTimer = 7;
|
||||||
|
rsrp_ThresholdSSB = 19;
|
||||||
|
#prach-RootSequenceIndex_PR
|
||||||
|
#1 = 839, 2 = 139
|
||||||
|
prach_RootSequenceIndex_PR = 2;
|
||||||
|
prach_RootSequenceIndex = 1;
|
||||||
|
# SCS for msg1, can only be 15 for 30 kHz < 6 GHz, takes precendence over the one derived from prach-ConfigIndex
|
||||||
|
#
|
||||||
|
msg1_SubcarrierSpacing = 1,
|
||||||
|
# restrictedSetConfig
|
||||||
|
# 0=unrestricted, 1=restricted type A, 2=restricted type B
|
||||||
|
restrictedSetConfig = 0,
|
||||||
|
|
||||||
|
msg3_DeltaPreamble = 1;
|
||||||
|
p0_NominalWithGrant =-90;
|
||||||
|
|
||||||
|
# pucch-ConfigCommon setup :
|
||||||
|
# pucchGroupHopping
|
||||||
|
# 0 = neither, 1= group hopping, 2=sequence hopping
|
||||||
|
pucchGroupHopping = 0;
|
||||||
|
hoppingId = 40;
|
||||||
|
p0_nominal = -90;
|
||||||
|
# ssb_PositionsInBurs_BitmapPR
|
||||||
|
# 1=short, 2=medium, 3=long
|
||||||
|
ssb_PositionsInBurst_PR = 2;
|
||||||
|
ssb_PositionsInBurst_Bitmap = 1;
|
||||||
|
|
||||||
|
# ssb_periodicityServingCell
|
||||||
|
# 0 = ms5, 1=ms10, 2=ms20, 3=ms40, 4=ms80, 5=ms160, 6=spare2, 7=spare1
|
||||||
|
ssb_periodicityServingCell = 2;
|
||||||
|
|
||||||
|
# dmrs_TypeA_position
|
||||||
|
# 0 = pos2, 1 = pos3
|
||||||
|
dmrs_TypeA_Position = 0;
|
||||||
|
|
||||||
|
# subcarrierSpacing
|
||||||
|
# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
|
||||||
|
subcarrierSpacing = 1;
|
||||||
|
|
||||||
|
|
||||||
|
#tdd-UL-DL-ConfigurationCommon
|
||||||
|
# subcarrierSpacing
|
||||||
|
# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
|
||||||
|
referenceSubcarrierSpacing = 1;
|
||||||
|
# pattern1
|
||||||
|
# dl_UL_TransmissionPeriodicity
|
||||||
|
# 0=ms0p5, 1=ms0p625, 2=ms1, 3=ms1p25, 4=ms2, 5=ms2p5, 6=ms5, 7=ms10
|
||||||
|
dl_UL_TransmissionPeriodicity = 6;
|
||||||
|
nrofDownlinkSlots = 7;
|
||||||
|
nrofDownlinkSymbols = 6;
|
||||||
|
nrofUplinkSlots = 2;
|
||||||
|
nrofUplinkSymbols = 4;
|
||||||
|
|
||||||
|
ssPBCH_BlockPower = -25;
|
||||||
|
}
|
||||||
|
|
||||||
|
);
|
||||||
|
|
||||||
|
# Dedicated Serving Cell Configuration
|
||||||
|
servingCellConfigDedicated = ({
|
||||||
|
# BWP-Downlink
|
||||||
|
# BWP 1 Configuration
|
||||||
|
dl_bwp-Id_1 = 1;
|
||||||
|
dl_bwp1_locationAndBandwidth = 28875; // RBstart=0, L=106 (40 MHz BW)
|
||||||
|
# subcarrierSpacing
|
||||||
|
# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
|
||||||
|
dl_bwp1_subcarrierSpacing = 1;
|
||||||
|
|
||||||
|
# BWP 2 Configuration
|
||||||
|
dl_bwp-Id_2 = 2;
|
||||||
|
dl_bwp2_locationAndBandwidth = 13750; // RBstart=0, L=51 (20 MHz BW)
|
||||||
|
# subcarrierSpacing
|
||||||
|
# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
|
||||||
|
dl_bwp2_subcarrierSpacing = 1;
|
||||||
|
|
||||||
|
# BWP 3 Configuration
|
||||||
|
dl_bwp-Id_3 = 3;
|
||||||
|
dl_bwp3_locationAndBandwidth = 6325; // RBstart=0, L=24 (10 MHz BW)
|
||||||
|
# subcarrierSpacing
|
||||||
|
# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
|
||||||
|
dl_bwp3_subcarrierSpacing = 1;
|
||||||
|
|
||||||
|
firstActiveDownlinkBWP-Id = 1; #BWP-Id
|
||||||
|
defaultDownlinkBWP-Id = 1; #BWP-Id
|
||||||
|
|
||||||
|
# bwp-InactivityTimer ENUMERATED {ms2, ms3, ms4, ms5, ms6, ms8, ms10, ms20, ms30,
|
||||||
|
# ms40,ms50, ms60, ms80,ms100, ms200,ms300, ms500,
|
||||||
|
# ms750, ms1280, ms1920, ms2560, spare10, spare9, spare8,
|
||||||
|
# spare7, spare6, spare5, spare4, spare3, spare2, spare1 }
|
||||||
|
|
||||||
|
# UplinkConfig
|
||||||
|
# BWP-Uplink
|
||||||
|
# BWP 1 Configuration
|
||||||
|
ul_bwp-Id_1 = 1;
|
||||||
|
ul_bwp1_locationAndBandwidth = 28875; // RBstart=0, L=106 (40 MHz BW)
|
||||||
|
# subcarrierSpacing
|
||||||
|
# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
|
||||||
|
ul_bwp1_subcarrierSpacing = 1;
|
||||||
|
|
||||||
|
# BWP 2 Configuration
|
||||||
|
ul_bwp-Id_2 = 2;
|
||||||
|
ul_bwp2_locationAndBandwidth = 13750; // RBstart=0, L=51 (20 MHz BW)
|
||||||
|
# subcarrierSpacing
|
||||||
|
# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
|
||||||
|
ul_bwp2_subcarrierSpacing = 1;
|
||||||
|
|
||||||
|
# BWP 3 Configuration
|
||||||
|
ul_bwp-Id_3 = 3;
|
||||||
|
ul_bwp3_locationAndBandwidth = 6325; // RBstart=0, L=24 (10 MHz BW)
|
||||||
|
# subcarrierSpacing
|
||||||
|
# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
|
||||||
|
ul_bwp3_subcarrierSpacing = 1;
|
||||||
|
|
||||||
|
firstActiveUplinkBWP-Id = 1; #BWP-Id
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
# ------- SCTP definitions
|
||||||
|
SCTP :
|
||||||
|
{
|
||||||
|
# Number of streams to use in input/output
|
||||||
|
SCTP_INSTREAMS = 2;
|
||||||
|
SCTP_OUTSTREAMS = 2;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
////////// AMF parameters:
|
||||||
|
amf_ip_address = ( { ipv4 = "172.21.16.136";
|
||||||
|
ipv6 = "192:168:30::17";
|
||||||
|
active = "yes";
|
||||||
|
preference = "ipv4";
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
|
||||||
|
NETWORK_INTERFACES :
|
||||||
|
{
|
||||||
|
GNB_INTERFACE_NAME_FOR_NG_AMF = "demo-oai";
|
||||||
|
GNB_IPV4_ADDRESS_FOR_NG_AMF = "172.21.16.137/24";
|
||||||
|
GNB_INTERFACE_NAME_FOR_NGU = "demo-oai";
|
||||||
|
GNB_IPV4_ADDRESS_FOR_NGU = "172.21.16.137/24";
|
||||||
|
GNB_PORT_FOR_S1U = 2152; # Spec 2152
|
||||||
|
};
|
||||||
|
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
MACRLCs = (
|
||||||
|
{
|
||||||
|
num_cc = 1;
|
||||||
|
tr_s_preference = "local_L1";
|
||||||
|
tr_n_preference = "local_RRC";
|
||||||
|
pusch_TargetSNRx10 = 200;
|
||||||
|
pucch_TargetSNRx10 = 200;
|
||||||
|
ulsch_max_frame_inactivity = 0;
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
L1s = (
|
||||||
|
{
|
||||||
|
num_cc = 1;
|
||||||
|
tr_n_preference = "local_mac";
|
||||||
|
prach_dtx_threshold = 120;
|
||||||
|
pucch0_dtx_threshold = 100;
|
||||||
|
ofdm_offset_divisor = 8; #set this to UINT_MAX for offset 0
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
RUs = (
|
||||||
|
{
|
||||||
|
local_rf = "yes"
|
||||||
|
nb_tx = 1
|
||||||
|
nb_rx = 1
|
||||||
|
att_tx = 10;
|
||||||
|
att_rx = 10;
|
||||||
|
bands = [78];
|
||||||
|
max_pdschReferenceSignalPower = -27;
|
||||||
|
max_rxgain = 114;
|
||||||
|
eNB_instances = [0];
|
||||||
|
#beamforming 1x4 matrix:
|
||||||
|
bf_weights = [0x00007fff, 0x0000, 0x0000, 0x0000];
|
||||||
|
clock_src = "internal";
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
THREAD_STRUCT = (
|
||||||
|
{
|
||||||
|
#three config for level of parallelism "PARALLEL_SINGLE_THREAD", "PARALLEL_RU_L1_SPLIT", or "PARALLEL_RU_L1_TRX_SPLIT"
|
||||||
|
parallel_config = "PARALLEL_SINGLE_THREAD";
|
||||||
|
#two option for worker "WORKER_DISABLE" or "WORKER_ENABLE"
|
||||||
|
worker_config = "WORKER_ENABLE";
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
rfsimulator :
|
||||||
|
{
|
||||||
|
serveraddr = "server";
|
||||||
|
serverport = "4043";
|
||||||
|
options = (); #("saviq"); or/and "chanmod"
|
||||||
|
modelname = "AWGN";
|
||||||
|
IQfile = "/tmp/rfsimulator.iqs";
|
||||||
|
};
|
||||||
|
|
||||||
|
security = {
|
||||||
|
# preferred ciphering algorithms
|
||||||
|
# the first one of the list that an UE supports in chosen
|
||||||
|
# valid values: nea0, nea1, nea2, nea3
|
||||||
|
ciphering_algorithms = ( "nea0" );
|
||||||
|
|
||||||
|
# preferred integrity algorithms
|
||||||
|
# the first one of the list that an UE supports in chosen
|
||||||
|
# valid values: nia0, nia1, nia2, nia3
|
||||||
|
integrity_algorithms = ( "nia2", "nia0" );
|
||||||
|
|
||||||
|
# setting 'drb_ciphering' to "no" disables ciphering for DRBs, no matter
|
||||||
|
# what 'ciphering_algorithms' configures; same thing for 'drb_integrity'
|
||||||
|
drb_ciphering = "yes";
|
||||||
|
drb_integrity = "no";
|
||||||
|
};
|
||||||
|
|
||||||
|
log_config :
|
||||||
|
{
|
||||||
|
global_log_level ="info";
|
||||||
|
hw_log_level ="info";
|
||||||
|
phy_log_level ="info";
|
||||||
|
mac_log_level ="info";
|
||||||
|
rlc_log_level ="info";
|
||||||
|
pdcp_log_level ="info";
|
||||||
|
rrc_log_level ="info";
|
||||||
|
ngap_log_level ="debug";
|
||||||
|
f1ap_log_level ="debug";
|
||||||
|
};
|
||||||
|
|
||||||
@@ -32,9 +32,6 @@ gNBs =
|
|||||||
|
|
||||||
////////// Physical parameters:
|
////////// Physical parameters:
|
||||||
|
|
||||||
ssb_SubcarrierOffset = 0;
|
|
||||||
pdsch_AntennaPorts = 1;
|
|
||||||
pusch_AntennaPorts = 1;
|
|
||||||
sib1_tda = 15;
|
sib1_tda = 15;
|
||||||
min_rxtxtime = 6;
|
min_rxtxtime = 6;
|
||||||
|
|
||||||
|
|||||||
@@ -16,7 +16,7 @@ Ref :
|
|||||||
L1 Rx processing : 175.0
|
L1 Rx processing : 175.0
|
||||||
PUSCH inner-receiver : 100.0
|
PUSCH inner-receiver : 100.0
|
||||||
PUSCH decoding : 180.0
|
PUSCH decoding : 180.0
|
||||||
DL & UL scheduling timing stats : 37.0
|
DL & UL scheduling timing : 37.0
|
||||||
UL Indication : 38.0
|
UL Indication : 38.0
|
||||||
Threshold :
|
Threshold :
|
||||||
feprx : 1.25
|
feprx : 1.25
|
||||||
@@ -28,5 +28,5 @@ Threshold :
|
|||||||
L1 Rx processing : 1.25
|
L1 Rx processing : 1.25
|
||||||
PUSCH inner-receiver : 1.25
|
PUSCH inner-receiver : 1.25
|
||||||
PUSCH decoding : 1.25
|
PUSCH decoding : 1.25
|
||||||
DL & UL scheduling timing stats : 1.25
|
DL & UL scheduling timing : 1.25
|
||||||
UL Indication : 1.25
|
UL Indication : 1.25
|
||||||
|
|||||||
@@ -15,8 +15,9 @@ Ref :
|
|||||||
DLSCH encoding : 230.0
|
DLSCH encoding : 230.0
|
||||||
L1 Rx processing : 175.0
|
L1 Rx processing : 175.0
|
||||||
PUSCH inner-receiver : 100.0
|
PUSCH inner-receiver : 100.0
|
||||||
PUSCH decoding : 180.0
|
#PUSCH decoding : 180.0
|
||||||
DL & UL scheduling timing stats : 37.0
|
PUSCH decoding : 240.0
|
||||||
|
DL & UL scheduling timing : 37.0
|
||||||
UL Indication : 38.0
|
UL Indication : 38.0
|
||||||
Threshold :
|
Threshold :
|
||||||
feprx : 1.25
|
feprx : 1.25
|
||||||
@@ -28,5 +29,5 @@ Threshold :
|
|||||||
L1 Rx processing : 1.25
|
L1 Rx processing : 1.25
|
||||||
PUSCH inner-receiver : 1.25
|
PUSCH inner-receiver : 1.25
|
||||||
PUSCH decoding : 1.25
|
PUSCH decoding : 1.25
|
||||||
DL & UL scheduling timing stats : 1.25
|
DL & UL scheduling timing : 1.25
|
||||||
UL Indication : 1.25
|
UL Indication : 1.25
|
||||||
|
|||||||
@@ -0,0 +1,31 @@
|
|||||||
|
FROM ubuntu:bionic AS oai-formatting-check
|
||||||
|
|
||||||
|
ARG MERGE_REQUEST
|
||||||
|
ARG SRC_BRANCH
|
||||||
|
ARG TARGET_BRANCH
|
||||||
|
ENV DEBIAN_FRONTEND=noninteractive
|
||||||
|
|
||||||
|
RUN apt-get update && \
|
||||||
|
DEBIAN_FRONTEND=noninteractive apt-get upgrade --yes && \
|
||||||
|
DEBIAN_FRONTEND=noninteractive apt-get install --yes \
|
||||||
|
astyle \
|
||||||
|
gawk \
|
||||||
|
git
|
||||||
|
|
||||||
|
WORKDIR /oai-ran
|
||||||
|
COPY . .
|
||||||
|
|
||||||
|
RUN /bin/bash -c "if [[ -v MERGE_REQUEST ]]; then echo 'Source Branch = $SRC_BRANCH'; echo 'Target Branch = $TARGET_BRANCH'; else echo 'Push to develop'; fi"
|
||||||
|
RUN /bin/bash -c "if [[ -v MERGE_REQUEST ]]; then ./ci-scripts/checkCodingFormattingRules.sh --src-branch $SRC_BRANCH --target-branch $TARGET_BRANCH; else ./ci-scripts/checkCodingFormattingRules.sh; fi"
|
||||||
|
|
||||||
|
RUN echo "=== Files not properly formatted ===" && \
|
||||||
|
/bin/bash -c "if [[ -f oai_rules_result_list.txt ]]; then cat oai_rules_result_list.txt; fi"
|
||||||
|
|
||||||
|
RUN echo "=== Files with incorrect define protection ===" && \
|
||||||
|
/bin/bash -c "if [[ -f header-files-w-incorrect-define.txt ]]; then cat header-files-w-incorrect-define.txt; fi"
|
||||||
|
|
||||||
|
RUN echo "=== Files with a GNU GPL licence Banner ===" && \
|
||||||
|
/bin/bash -c "if [[ -f files-w-gnu-gpl-license-banner.txt ]]; then cat files-w-gnu-gpl-license-banner.txt; fi"
|
||||||
|
|
||||||
|
RUN echo "=== Files with a suspect Banner ===" && \
|
||||||
|
/bin/bash -c "if [[ -f files-w-suspect-banner.txt ]]; then cat files-w-suspect-banner.txt; fi"
|
||||||
@@ -255,16 +255,19 @@ class EPCManagement():
|
|||||||
mySSH.command('mkdir -p ' + self.SourceCodePath + '/scripts', '\$', 5)
|
mySSH.command('mkdir -p ' + self.SourceCodePath + '/scripts', '\$', 5)
|
||||||
mySSH.command('cd /opt/oai-cn5g-fed-v1.3/docker-compose', '\$', 5)
|
mySSH.command('cd /opt/oai-cn5g-fed-v1.3/docker-compose', '\$', 5)
|
||||||
mySSH.command('python3 ./core-network.py '+self.cfgDeploy, '\$', 60)
|
mySSH.command('python3 ./core-network.py '+self.cfgDeploy, '\$', 60)
|
||||||
time.sleep(2)
|
if re.search('start-mini-as-ue', self.cfgDeploy):
|
||||||
mySSH.command('docker-compose -p 5gcn ps -a', '\$', 60)
|
dFile = 'docker-compose-mini-nrf-asue.yaml'
|
||||||
|
else:
|
||||||
|
dFile = 'docker-compose-mini-nrf.yaml'
|
||||||
|
mySSH.command('docker-compose -p 5gcn -f ' + dFile + ' ps -a', '\$', 60)
|
||||||
if mySSH.getBefore().count('Up (healthy)') != 6:
|
if mySSH.getBefore().count('Up (healthy)') != 6:
|
||||||
logging.error('Not all container healthy')
|
logging.error('Not all container healthy')
|
||||||
else:
|
else:
|
||||||
logging.debug('OK')
|
logging.debug('OK --> all containers are healthy')
|
||||||
mySSH.command('docker-compose config | grep --colour=never image', '\$', 10)
|
mySSH.command('docker-compose -p 5gcn -f ' + dFile + ' config | grep --colour=never image', '\$', 10)
|
||||||
listOfImages = mySSH.getBefore()
|
listOfImages = mySSH.getBefore()
|
||||||
for imageLine in listOfImages.split('\\r\\n'):
|
for imageLine in listOfImages.split('\\r\\n'):
|
||||||
res1 = re.search('image: (?P<name>[a-zA-Z0-9\-]+):(?P<tag>[a-zA-Z0-9\-]+)', str(imageLine))
|
res1 = re.search('image: (?P<name>[a-zA-Z0-9\-/]+):(?P<tag>[a-zA-Z0-9\-]+)', str(imageLine))
|
||||||
res2 = re.search('mysql', str(imageLine))
|
res2 = re.search('mysql', str(imageLine))
|
||||||
if res1 is not None and res2 is None:
|
if res1 is not None and res2 is None:
|
||||||
html_cell += res1.group('name') + ':' + res1.group('tag') + ' '
|
html_cell += res1.group('name') + ':' + res1.group('tag') + ' '
|
||||||
@@ -308,6 +311,8 @@ class EPCManagement():
|
|||||||
tmp = str(response[0],'utf-8')
|
tmp = str(response[0],'utf-8')
|
||||||
self.MmeIPAddress = tmp.rstrip()
|
self.MmeIPAddress = tmp.rstrip()
|
||||||
logging.debug('AMF IP Address ' + self.MmeIPAddress)
|
logging.debug('AMF IP Address ' + self.MmeIPAddress)
|
||||||
|
else:
|
||||||
|
logging.error('no container with name oai-amf found, could not retrieve AMF IP address')
|
||||||
mySSH.close()
|
mySSH.close()
|
||||||
|
|
||||||
def CheckHSSProcess(self, status_queue):
|
def CheckHSSProcess(self, status_queue):
|
||||||
@@ -536,7 +541,7 @@ class EPCManagement():
|
|||||||
mySSH.command('python3 ./core-network.py '+self.cfgUnDeploy, '\$', 60)
|
mySSH.command('python3 ./core-network.py '+self.cfgUnDeploy, '\$', 60)
|
||||||
mySSH.command('docker volume prune --force || true', '\$', 60)
|
mySSH.command('docker volume prune --force || true', '\$', 60)
|
||||||
time.sleep(2)
|
time.sleep(2)
|
||||||
mySSH.command('tshark -r /tmp/oai-cn5g.pcap | egrep --colour=never "Tracking area update" ','\$', 30)
|
mySSH.command('tshark -r /tmp/oai-cn5g-v1.3.pcap | egrep --colour=never "Tracking area update" ','\$', 30)
|
||||||
result = re.search('Tracking area update request', mySSH.getBefore())
|
result = re.search('Tracking area update request', mySSH.getBefore())
|
||||||
if result is not None:
|
if result is not None:
|
||||||
message = 'UE requested ' + str(mySSH.getBefore().count('Tracking area update request')) + 'Tracking area update request(s)'
|
message = 'UE requested ' + str(mySSH.getBefore().count('Tracking area update request')) + 'Tracking area update request(s)'
|
||||||
@@ -830,8 +835,8 @@ class EPCManagement():
|
|||||||
mySSH.command('zip mme.log.zip mme_check_run.*', '\$', 60)
|
mySSH.command('zip mme.log.zip mme_check_run.*', '\$', 60)
|
||||||
elif re.match('OAICN5G', self.Type, re.IGNORECASE):
|
elif re.match('OAICN5G', self.Type, re.IGNORECASE):
|
||||||
mySSH.command('cd ' + self.SourceCodePath + '/logs','\$', 5)
|
mySSH.command('cd ' + self.SourceCodePath + '/logs','\$', 5)
|
||||||
mySSH.command('cp -f /tmp/oai-cn5g.pcap .','\$', 30)
|
mySSH.command('cp -f /tmp/oai-cn5g-v1.3.pcap .','\$', 30)
|
||||||
mySSH.command('zip mme.log.zip oai-amf.log oai-nrf.log oai-cn5g.pcap','\$', 30)
|
mySSH.command('zip mme.log.zip oai-amf.log oai-nrf.log oai-cn5g*.pcap','\$', 30)
|
||||||
mySSH.command('mv mme.log.zip ' + self.SourceCodePath + '/scripts','\$', 30)
|
mySSH.command('mv mme.log.zip ' + self.SourceCodePath + '/scripts','\$', 30)
|
||||||
elif re.match('OAI', self.Type, re.IGNORECASE) or re.match('OAI-Rel14-CUPS', self.Type, re.IGNORECASE):
|
elif re.match('OAI', self.Type, re.IGNORECASE) or re.match('OAI-Rel14-CUPS', self.Type, re.IGNORECASE):
|
||||||
mySSH.command('zip mme.log.zip mme*.log', '\$', 60)
|
mySSH.command('zip mme.log.zip mme*.log', '\$', 60)
|
||||||
|
|||||||
@@ -102,7 +102,7 @@ def AssignParams(params_dict):
|
|||||||
|
|
||||||
|
|
||||||
def GetParametersFromXML(action):
|
def GetParametersFromXML(action):
|
||||||
if action == 'Build_eNB' or action == 'Build_Image':
|
if action == 'Build_eNB' or action == 'Build_Image' or action == 'Build_Proxy':
|
||||||
RAN.Build_eNB_args=test.findtext('Build_eNB_args')
|
RAN.Build_eNB_args=test.findtext('Build_eNB_args')
|
||||||
CONTAINERS.imageKind=test.findtext('kind')
|
CONTAINERS.imageKind=test.findtext('kind')
|
||||||
forced_workspace_cleanup = test.findtext('forced_workspace_cleanup')
|
forced_workspace_cleanup = test.findtext('forced_workspace_cleanup')
|
||||||
@@ -138,6 +138,9 @@ def GetParametersFromXML(action):
|
|||||||
RAN.backgroundBuild=True
|
RAN.backgroundBuild=True
|
||||||
else:
|
else:
|
||||||
RAN.backgroundBuild=False
|
RAN.backgroundBuild=False
|
||||||
|
proxy_commit = test.findtext('proxy_commit')
|
||||||
|
if proxy_commit is not None:
|
||||||
|
CONTAINERS.proxyCommit = proxy_commit
|
||||||
|
|
||||||
elif action == 'WaitEndBuild_eNB':
|
elif action == 'WaitEndBuild_eNB':
|
||||||
RAN.Build_eNB_args=test.findtext('Build_eNB_args')
|
RAN.Build_eNB_args=test.findtext('Build_eNB_args')
|
||||||
@@ -799,7 +802,7 @@ elif re.match('^TesteNB$', mode, re.IGNORECASE) or re.match('^TestUE$', mode, re
|
|||||||
HTML.startTime=int(round(time.time() * 1000))
|
HTML.startTime=int(round(time.time() * 1000))
|
||||||
while CiTestObj.FailReportCnt < CiTestObj.repeatCounts[0] and RAN.prematureExit:
|
while CiTestObj.FailReportCnt < CiTestObj.repeatCounts[0] and RAN.prematureExit:
|
||||||
RAN.prematureExit=False
|
RAN.prematureExit=False
|
||||||
# At every iteratin of the retry loop, a separator will be added
|
# At every iteration of the retry loop, a separator will be added
|
||||||
# pass CiTestObj.FailReportCnt as parameter of HTML.CreateHtmlRetrySeparator
|
# pass CiTestObj.FailReportCnt as parameter of HTML.CreateHtmlRetrySeparator
|
||||||
HTML.CreateHtmlRetrySeparator(CiTestObj.FailReportCnt)
|
HTML.CreateHtmlRetrySeparator(CiTestObj.FailReportCnt)
|
||||||
for test_case_id in todo_tests:
|
for test_case_id in todo_tests:
|
||||||
@@ -915,14 +918,22 @@ elif re.match('^TesteNB$', mode, re.IGNORECASE) or re.match('^TestUE$', mode, re
|
|||||||
HTML=ldpc.Run_PhySim(HTML,CONST,id)
|
HTML=ldpc.Run_PhySim(HTML,CONST,id)
|
||||||
elif action == 'Build_Image':
|
elif action == 'Build_Image':
|
||||||
CONTAINERS.BuildImage(HTML)
|
CONTAINERS.BuildImage(HTML)
|
||||||
|
elif action == 'Build_Proxy':
|
||||||
|
CONTAINERS.BuildProxy(HTML)
|
||||||
elif action == 'Copy_Image_to_Test':
|
elif action == 'Copy_Image_to_Test':
|
||||||
CONTAINERS.Copy_Image_to_Test_Server(HTML)
|
CONTAINERS.Copy_Image_to_Test_Server(HTML)
|
||||||
elif action == 'Deploy_Object':
|
elif action == 'Deploy_Object':
|
||||||
CONTAINERS.DeployObject(HTML, EPC)
|
CONTAINERS.DeployObject(HTML, EPC)
|
||||||
|
if CONTAINERS.exitStatus==1:
|
||||||
|
RAN.prematureExit = True
|
||||||
elif action == 'Undeploy_Object':
|
elif action == 'Undeploy_Object':
|
||||||
CONTAINERS.UndeployObject(HTML, RAN)
|
CONTAINERS.UndeployObject(HTML, RAN)
|
||||||
elif action == 'Cppcheck_Analysis':
|
elif action == 'Cppcheck_Analysis':
|
||||||
SCA.CppCheckAnalysis(HTML)
|
SCA.CppCheckAnalysis(HTML)
|
||||||
|
elif action == 'LicenceAndFormattingCheck':
|
||||||
|
ret = SCA.LicenceAndFormattingCheck(HTML)
|
||||||
|
if ret != 0:
|
||||||
|
RAN.prematureExit = True
|
||||||
elif action == 'Deploy_Run_PhySim':
|
elif action == 'Deploy_Run_PhySim':
|
||||||
PHYSIM.Deploy_PhySim(HTML, RAN)
|
PHYSIM.Deploy_PhySim(HTML, RAN)
|
||||||
elif action == 'DeployGenObject':
|
elif action == 'DeployGenObject':
|
||||||
|
|||||||
@@ -383,17 +383,19 @@ class RANManagement():
|
|||||||
|
|
||||||
|
|
||||||
# If tracer options is on, running tshark on EPC side and capture traffic b/ EPC and eNB
|
# If tracer options is on, running tshark on EPC side and capture traffic b/ EPC and eNB
|
||||||
localEpcIpAddr = EPC.IPAddress
|
if EPC.IPAddress != "none":
|
||||||
localEpcUserName = EPC.UserName
|
localEpcIpAddr = EPC.IPAddress
|
||||||
localEpcPassword = EPC.Password
|
localEpcUserName = EPC.UserName
|
||||||
mySSH.open(localEpcIpAddr, localEpcUserName, localEpcPassword)
|
localEpcPassword = EPC.Password
|
||||||
eth_interface = 'any'
|
mySSH.open(localEpcIpAddr, localEpcUserName, localEpcPassword)
|
||||||
fltr = 'sctp'
|
eth_interface = 'any'
|
||||||
logging.debug('\u001B[1m Launching tshark on interface ' + eth_interface + ' with filter "' + fltr + '"\u001B[0m')
|
fltr = 'sctp'
|
||||||
self.epcPcapFile = 'enb_' + self.testCase_id + '_s1log.pcap'
|
logging.debug('\u001B[1m Launching tshark on interface ' + eth_interface + ' with filter "' + fltr + '"\u001B[0m')
|
||||||
mySSH.command('echo ' + localEpcPassword + ' | sudo -S rm -f /tmp/' + self.epcPcapFile , '\$', 5)
|
self.epcPcapFile = 'enb_' + self.testCase_id + '_s1log.pcap'
|
||||||
mySSH.command('echo $USER; nohup sudo tshark -f "host ' + lIpAddr +'" -i ' + eth_interface + ' -f "' + fltr + '" -w /tmp/' + self.epcPcapFile + ' > /tmp/tshark.log 2>&1 &', localEpcUserName, 5)
|
mySSH.command('echo ' + localEpcPassword + ' | sudo -S rm -f /tmp/' + self.epcPcapFile , '\$', 5)
|
||||||
mySSH.close()
|
mySSH.command('echo $USER; nohup sudo tshark -f "host ' + lIpAddr +'" -i ' + eth_interface + ' -f "' + fltr + '" -w /tmp/' + self.epcPcapFile + ' > /tmp/tshark.log 2>&1 &', localEpcUserName, 5)
|
||||||
|
mySSH.close()
|
||||||
|
|
||||||
mySSH.open(lIpAddr, lUserName, lPassWord)
|
mySSH.open(lIpAddr, lUserName, lPassWord)
|
||||||
mySSH.command('cd ' + lSourcePath, '\$', 5)
|
mySSH.command('cd ' + lSourcePath, '\$', 5)
|
||||||
# Initialize_eNB_args usually start with -O and followed by the location in repository
|
# Initialize_eNB_args usually start with -O and followed by the location in repository
|
||||||
|
|||||||
@@ -528,15 +528,15 @@ class Dashboard:
|
|||||||
editable_mr = project.mergerequests.get(int(mr))
|
editable_mr = project.mergerequests.get(int(mr))
|
||||||
mr_notes = editable_mr.notes.list(all=True)
|
mr_notes = editable_mr.notes.list(all=True)
|
||||||
|
|
||||||
body = '<a href="https://oaitestdashboard.s3.eu-west-1.amazonaws.com/MR'+mr+'/index.html">Consolidated Test Results</a><br>'+\
|
body = '[Consolidated Test Results](https://oaitestdashboard.s3.eu-west-1.amazonaws.com/MR'+mr+'/index.html)\\\n'
|
||||||
'Tested CommitID: ' + commit + '<br>'
|
body += 'Tested CommitID: ' + commit
|
||||||
|
|
||||||
for i in range(0,n_tests):
|
for i in range(0,n_tests):
|
||||||
jobname = args[4*i]
|
jobname = args[4*i]
|
||||||
buildurl = args[4*i+1]
|
buildurl = args[4*i+1]
|
||||||
buildid = args[4*i+2]
|
buildid = args[4*i+2]
|
||||||
status = args[4*i+3]
|
status = args[4*i+3]
|
||||||
body += jobname+', status is <b>'+status+'</b>, (<a href="'+buildurl+'">'+buildid+'</a>)<br>'
|
body += '\\\n' + jobname + ': **'+status+'** ([' + buildid + '](' + buildurl + '))'
|
||||||
|
|
||||||
#create new note
|
#create new note
|
||||||
mr_note = editable_mr.notes.create({
|
mr_note = editable_mr.notes.create({
|
||||||
|
|||||||
@@ -60,7 +60,7 @@ class SSHConnection():
|
|||||||
count = 0
|
count = 0
|
||||||
connect_status = False
|
connect_status = False
|
||||||
while count < 4:
|
while count < 4:
|
||||||
self.ssh = pexpect.spawn('ssh -o PubkeyAuthentication=no {}@{}'.format(username,ipaddress))
|
self.ssh = pexpect.spawn('ssh -o PubkeyAuthentication=yes {}@{}'.format(username,ipaddress))
|
||||||
# Longer timeout at connection due to asterix slowness
|
# Longer timeout at connection due to asterix slowness
|
||||||
self.ssh.timeout = 25
|
self.ssh.timeout = 25
|
||||||
self.sshresponse = self.ssh.expect(['Are you sure you want to continue connecting (yes/no)?', 'password:', 'Last login', pexpect.EOF, pexpect.TIMEOUT])
|
self.sshresponse = self.ssh.expect(['Are you sure you want to continue connecting (yes/no)?', 'password:', 'Last login', pexpect.EOF, pexpect.TIMEOUT])
|
||||||
@@ -84,14 +84,11 @@ class SSHConnection():
|
|||||||
else:
|
else:
|
||||||
logging.debug('self.sshresponse = ' + str(self.sshresponse))
|
logging.debug('self.sshresponse = ' + str(self.sshresponse))
|
||||||
elif self.sshresponse == 2:
|
elif self.sshresponse == 2:
|
||||||
# Checking if we are really on the remote client defined by its IP address
|
# We directly ended up on the remote server because of pubkey auth
|
||||||
self.command('stdbuf -o0 ifconfig | egrep --color=never "inet addr:|inet "', prompt, 5)
|
count = 10
|
||||||
result = re.search(str(ipaddress), str(self.ssh.before))
|
connect_status = True
|
||||||
if result is None:
|
# this expect() seems to be necessary to advance the read buffer until the prompt, or getBefore() will not return the last command
|
||||||
self.close()
|
self.sshresponse = self.ssh.expect([prompt])
|
||||||
else:
|
|
||||||
count = 10
|
|
||||||
connect_status = True
|
|
||||||
else:
|
else:
|
||||||
# debug output
|
# debug output
|
||||||
logging.debug(str(self.ssh.before))
|
logging.debug(str(self.ssh.before))
|
||||||
@@ -272,4 +269,4 @@ class SSHConnection():
|
|||||||
sys.exit('SCP failed')
|
sys.exit('SCP failed')
|
||||||
|
|
||||||
def getBefore(self):
|
def getBefore(self):
|
||||||
return str(self.ssh.before)
|
return self.ssh.before.decode('utf-8')
|
||||||
|
|||||||
@@ -25,7 +25,7 @@ gnb :
|
|||||||
L1 Rx processing:
|
L1 Rx processing:
|
||||||
PUSCH inner-receiver:
|
PUSCH inner-receiver:
|
||||||
PUSCH decoding:
|
PUSCH decoding:
|
||||||
DL & UL scheduling timing stats:
|
DL & UL scheduling timing:
|
||||||
UL Indication:
|
UL Indication:
|
||||||
graph :
|
graph :
|
||||||
page1:
|
page1:
|
||||||
@@ -45,5 +45,5 @@ gnb :
|
|||||||
page4:
|
page4:
|
||||||
rt.PUSCH inner-receiver:
|
rt.PUSCH inner-receiver:
|
||||||
rt.PUSCH decoding:
|
rt.PUSCH decoding:
|
||||||
rt.DL & UL scheduling timing stats:
|
rt.DL & UL scheduling timing:
|
||||||
rt.UL Indication:
|
rt.UL Indication:
|
||||||
|
|||||||
@@ -1,3 +1,4 @@
|
|||||||
|
- Build_Proxy
|
||||||
- Build_PhySim
|
- Build_PhySim
|
||||||
- Run_PhySim
|
- Run_PhySim
|
||||||
- Build_eNB
|
- Build_eNB
|
||||||
@@ -47,3 +48,4 @@
|
|||||||
- PingFromContainer
|
- PingFromContainer
|
||||||
- IperfFromContainer
|
- IperfFromContainer
|
||||||
- StatsFromGenObject
|
- StatsFromGenObject
|
||||||
|
- LicenceAndFormattingCheck
|
||||||
|
|||||||
@@ -0,0 +1,42 @@
|
|||||||
|
<!--
|
||||||
|
|
||||||
|
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>l2sim-5gnr-proxy-build</htmlTabRef>
|
||||||
|
<htmlTabName>Build L2sim proxy image</htmlTabName>
|
||||||
|
<htmlTabIcon>wrench</htmlTabIcon>
|
||||||
|
<repeatCount>1</repeatCount>
|
||||||
|
<TestCaseRequestedList>
|
||||||
|
000001
|
||||||
|
</TestCaseRequestedList>
|
||||||
|
<TestCaseExclusionList></TestCaseExclusionList>
|
||||||
|
|
||||||
|
<testCase id="000001">
|
||||||
|
<class>Build_Proxy</class>
|
||||||
|
<desc>Build L2sim Proxy Image</desc>
|
||||||
|
<eNB_instance>1</eNB_instance>
|
||||||
|
<eNB_serverId>1</eNB_serverId>
|
||||||
|
<forced_workspace_cleanup>True</forced_workspace_cleanup>
|
||||||
|
<proxy_commit>56cfdc0</proxy_commit>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
</testCaseList>
|
||||||
@@ -53,7 +53,6 @@
|
|||||||
<class>Initialize_UE</class>
|
<class>Initialize_UE</class>
|
||||||
<desc>Initialize Quectel</desc>
|
<desc>Initialize Quectel</desc>
|
||||||
<id>idefix</id>
|
<id>idefix</id>
|
||||||
<UE_Trace>yes</UE_Trace>
|
|
||||||
</testCase>
|
</testCase>
|
||||||
|
|
||||||
|
|
||||||
@@ -142,8 +141,8 @@
|
|||||||
<iperf_args>-u -b 125M -t 60 -i 1 -fm</iperf_args>
|
<iperf_args>-u -b 125M -t 60 -i 1 -fm</iperf_args>
|
||||||
<direction>DL</direction>
|
<direction>DL</direction>
|
||||||
<id>idefix</id>
|
<id>idefix</id>
|
||||||
<iperf_packetloss_threshold>1</iperf_packetloss_threshold>
|
<iperf_packetloss_threshold>25</iperf_packetloss_threshold>
|
||||||
<iperf_bitrate_threshold>95</iperf_bitrate_threshold>
|
<iperf_bitrate_threshold>80</iperf_bitrate_threshold>
|
||||||
<iperf_profile>single-ue</iperf_profile>
|
<iperf_profile>single-ue</iperf_profile>
|
||||||
</testCase>
|
</testCase>
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,168 @@
|
|||||||
|
<!--
|
||||||
|
|
||||||
|
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>TEST-SA-FR1-B200</htmlTabRef>
|
||||||
|
<htmlTabName>SA SanityCheck with QUECTEL</htmlTabName>
|
||||||
|
<htmlTabIcon>tasks</htmlTabIcon>
|
||||||
|
<repeatCount>1</repeatCount>
|
||||||
|
<TestCaseRequestedList>
|
||||||
|
010002
|
||||||
|
030000
|
||||||
|
030101
|
||||||
|
000001
|
||||||
|
010000
|
||||||
|
000001
|
||||||
|
050000
|
||||||
|
050001
|
||||||
|
010002
|
||||||
|
000001
|
||||||
|
030201
|
||||||
|
</TestCaseRequestedList>
|
||||||
|
<!--
|
||||||
|
070001
|
||||||
|
070000
|
||||||
|
070002
|
||||||
|
050002
|
||||||
|
050003
|
||||||
|
-->
|
||||||
|
<TestCaseExclusionList></TestCaseExclusionList>
|
||||||
|
|
||||||
|
<testCase id="010000">
|
||||||
|
<class>Initialize_UE</class>
|
||||||
|
<desc>Initialize Quectel</desc>
|
||||||
|
<id>idefix</id>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
|
||||||
|
<testCase id="010002">
|
||||||
|
<class>Terminate_UE</class>
|
||||||
|
<desc>Terminate Quectel</desc>
|
||||||
|
<id>idefix</id>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
<testCase id="030000">
|
||||||
|
<class>Copy_Image_to_Test</class>
|
||||||
|
<desc>Copy gNB image to test server</desc>
|
||||||
|
<image_name>oai-gnb</image_name>
|
||||||
|
<registry_svr_id>1</registry_svr_id>
|
||||||
|
<test_svr_id>0</test_svr_id>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
<testCase id="030101">
|
||||||
|
<class>Deploy_Object</class>
|
||||||
|
<desc>Deploy gNB (TDD/Band78/40MHz/B200) in a container</desc>
|
||||||
|
<yaml_path>ci-scripts/yaml_files/sa_b200_gnb</yaml_path>
|
||||||
|
<eNB_instance>0</eNB_instance>
|
||||||
|
<eNB_serverId>0</eNB_serverId>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
<testCase id="000001">
|
||||||
|
<class>IdleSleep</class>
|
||||||
|
<desc>Sleep</desc>
|
||||||
|
<idle_sleep_time_in_sec>5</idle_sleep_time_in_sec>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
<testCase id="000002">
|
||||||
|
<class>IdleSleep</class>
|
||||||
|
<desc>Sleep</desc>
|
||||||
|
<idle_sleep_time_in_sec>20</idle_sleep_time_in_sec>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
|
||||||
|
<testCase id="050000">
|
||||||
|
<class>Ping</class>
|
||||||
|
<desc>Ping: 20pings in 20sec</desc>
|
||||||
|
<id>idefix</id>
|
||||||
|
<ping_args>-c 20</ping_args>
|
||||||
|
<ping_packetloss_threshold>1</ping_packetloss_threshold>
|
||||||
|
<ping_rttavg_threshold>15</ping_rttavg_threshold>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
<testCase id="050001">
|
||||||
|
<class>Ping</class>
|
||||||
|
<desc>Ping: 100pings in 20sec</desc>
|
||||||
|
<id>idefix</id>
|
||||||
|
<ping_args>-c 100 -i 0.2</ping_args>
|
||||||
|
<ping_packetloss_threshold>1</ping_packetloss_threshold>
|
||||||
|
<ping_rttavg_threshold>15</ping_rttavg_threshold>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
<testCase id="050002">
|
||||||
|
<class>Ping</class>
|
||||||
|
<desc>Ping: 20pings in 20sec</desc>
|
||||||
|
<id>idefix</id>
|
||||||
|
<ping_args>-c 20</ping_args>
|
||||||
|
<ping_packetloss_threshold>1</ping_packetloss_threshold>
|
||||||
|
<ping_rttavg_threshold>15</ping_rttavg_threshold>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
<testCase id="050003">
|
||||||
|
<class>Ping</class>
|
||||||
|
<desc>Ping: 100pings in 20sec</desc>
|
||||||
|
<id>idefix</id>
|
||||||
|
<ping_args>-c 100 -i 0.2</ping_args>
|
||||||
|
<ping_packetloss_threshold>1</ping_packetloss_threshold>
|
||||||
|
<ping_rttavg_threshold>15</ping_rttavg_threshold>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
<testCase id="070000">
|
||||||
|
<class>Iperf</class>
|
||||||
|
<desc>iperf (DL/125Mbps/UDP)(60 sec)(single-ue profile)</desc>
|
||||||
|
<iperf_args>-u -b 125M -t 60 -i 1 -fm</iperf_args>
|
||||||
|
<direction>DL</direction>
|
||||||
|
<id>idefix</id>
|
||||||
|
<iperf_packetloss_threshold>25</iperf_packetloss_threshold>
|
||||||
|
<iperf_bitrate_threshold>80</iperf_bitrate_threshold>
|
||||||
|
<iperf_profile>single-ue</iperf_profile>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
<testCase id="070001">
|
||||||
|
<class>Iperf</class>
|
||||||
|
<desc>iperf (UL/8Mbps/UDP)(60 sec)(single-ue profile)</desc>
|
||||||
|
<iperf_args>-u -b 8M -t 60 -i 1 -fm</iperf_args>
|
||||||
|
<direction>UL</direction>
|
||||||
|
<id>idefix</id>
|
||||||
|
<iperf_packetloss_threshold>1</iperf_packetloss_threshold>
|
||||||
|
<iperf_bitrate_threshold>95</iperf_bitrate_threshold>
|
||||||
|
<iperf_profile>single-ue</iperf_profile>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
<testCase id="070002">
|
||||||
|
<class>Iperf</class>
|
||||||
|
<desc>iperf (BIDIR TCP)(10 sec)(single-ue profile)</desc>
|
||||||
|
<iperf_args>-t 10 --bidir</iperf_args>
|
||||||
|
<direction>BIDIR</direction>
|
||||||
|
<id>idefix</id>
|
||||||
|
<iperf_profile>single-ue</iperf_profile>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
<testCase id="030201">
|
||||||
|
<class>Undeploy_Object</class>
|
||||||
|
<desc>Undeploy gNB</desc>
|
||||||
|
<yaml_path>ci-scripts/yaml_files/sa_b200_gnb</yaml_path>
|
||||||
|
<eNB_instance>0</eNB_instance>
|
||||||
|
<eNB_serverId>0</eNB_serverId>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
</testCaseList>
|
||||||
|
|
||||||
@@ -0,0 +1,42 @@
|
|||||||
|
<!--
|
||||||
|
|
||||||
|
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>TEST-SA-FR1-B200-terminate</htmlTabRef>
|
||||||
|
<htmlTabName>SA tear-down in case of problem</htmlTabName>
|
||||||
|
<htmlTabIcon>tasks</htmlTabIcon>
|
||||||
|
<repeatCount>1</repeatCount>
|
||||||
|
<TestCaseRequestedList>
|
||||||
|
030201
|
||||||
|
</TestCaseRequestedList>
|
||||||
|
<TestCaseExclusionList></TestCaseExclusionList>
|
||||||
|
|
||||||
|
<testCase id="030201">
|
||||||
|
<class>Undeploy_Object</class>
|
||||||
|
<desc>Undeploy gNB</desc>
|
||||||
|
<yaml_path>ci-scripts/yaml_files/sa_b200_gnb</yaml_path>
|
||||||
|
<eNB_instance>1</eNB_instance>
|
||||||
|
<eNB_serverId>1</eNB_serverId>
|
||||||
|
<image_tag>sa-test</image_tag>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
</testCaseList>
|
||||||
@@ -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>formatting-tab</htmlTabRef>
|
||||||
|
<htmlTabName>License and Formatting Checks</htmlTabName>
|
||||||
|
<htmlTabIcon>wrench</htmlTabIcon>
|
||||||
|
<TestCaseRequestedList>
|
||||||
|
000002
|
||||||
|
</TestCaseRequestedList>
|
||||||
|
<TestCaseExclusionList></TestCaseExclusionList>
|
||||||
|
|
||||||
|
<testCase id="000002">
|
||||||
|
<class>LicenceAndFormattingCheck</class>
|
||||||
|
<desc>License and Formatting Checks</desc>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
</testCaseList>
|
||||||
@@ -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>5gc-closure</htmlTabRef>
|
||||||
|
<htmlTabName>5GC-Closure</htmlTabName>
|
||||||
|
<htmlTabIcon>log-out</htmlTabIcon>
|
||||||
|
<TestCaseRequestedList>
|
||||||
|
060000
|
||||||
|
</TestCaseRequestedList>
|
||||||
|
<TestCaseExclusionList></TestCaseExclusionList>
|
||||||
|
|
||||||
|
<testCase id="060000">
|
||||||
|
<class>Terminate_5GCN</class>
|
||||||
|
<desc>Terminate 5GC</desc>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
</testCaseList>
|
||||||
@@ -0,0 +1,38 @@
|
|||||||
|
<!--
|
||||||
|
|
||||||
|
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>5gc-start-tab</htmlTabRef>
|
||||||
|
<htmlTabName>5GC-Start</htmlTabName>
|
||||||
|
<htmlTabIcon>log-in</htmlTabIcon>
|
||||||
|
<TestCaseRequestedList>
|
||||||
|
000100
|
||||||
|
</TestCaseRequestedList>
|
||||||
|
<TestCaseExclusionList>
|
||||||
|
</TestCaseExclusionList>
|
||||||
|
|
||||||
|
<testCase id="000100">
|
||||||
|
<class>Initialize_5GCN</class>
|
||||||
|
<desc>Initialize 5GC</desc>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
</testCaseList>
|
||||||
@@ -32,7 +32,7 @@
|
|||||||
<testCase id="000001">
|
<testCase id="000001">
|
||||||
<class>Build_eNB</class>
|
<class>Build_eNB</class>
|
||||||
<desc>Build gNB</desc>
|
<desc>Build gNB</desc>
|
||||||
<Build_eNB_args>-w USRP -c --gNB --ninja</Build_eNB_args>
|
<Build_eNB_args>-w USRP -c --gNB --ninja --noavx512</Build_eNB_args>
|
||||||
<eNB_instance>0</eNB_instance>
|
<eNB_instance>0</eNB_instance>
|
||||||
<eNB_serverId>0</eNB_serverId>
|
<eNB_serverId>0</eNB_serverId>
|
||||||
<forced_workspace_cleanup>True</forced_workspace_cleanup>
|
<forced_workspace_cleanup>True</forced_workspace_cleanup>
|
||||||
|
|||||||
@@ -50,7 +50,7 @@
|
|||||||
<testCase id="000002">
|
<testCase id="000002">
|
||||||
<class>Build_eNB</class>
|
<class>Build_eNB</class>
|
||||||
<desc>Build gNB</desc>
|
<desc>Build gNB</desc>
|
||||||
<Build_eNB_args>-w USRP -c --gNB --ninja</Build_eNB_args>
|
<Build_eNB_args>-w USRP -c --gNB --ninja --noavx512</Build_eNB_args>
|
||||||
<eNB_instance>1</eNB_instance>
|
<eNB_instance>1</eNB_instance>
|
||||||
<eNB_serverId>1</eNB_serverId>
|
<eNB_serverId>1</eNB_serverId>
|
||||||
<backgroundBuild>True</backgroundBuild>
|
<backgroundBuild>True</backgroundBuild>
|
||||||
|
|||||||
@@ -26,6 +26,7 @@
|
|||||||
<htmlTabIcon>tasks</htmlTabIcon>
|
<htmlTabIcon>tasks</htmlTabIcon>
|
||||||
<repeatCount>1</repeatCount>
|
<repeatCount>1</repeatCount>
|
||||||
<TestCaseRequestedList>
|
<TestCaseRequestedList>
|
||||||
|
010002
|
||||||
030000
|
030000
|
||||||
040000
|
040000
|
||||||
000002
|
000002
|
||||||
|
|||||||
@@ -26,6 +26,7 @@
|
|||||||
<htmlTabIcon>tasks</htmlTabIcon>
|
<htmlTabIcon>tasks</htmlTabIcon>
|
||||||
<repeatCount>1</repeatCount>
|
<repeatCount>1</repeatCount>
|
||||||
<TestCaseRequestedList>
|
<TestCaseRequestedList>
|
||||||
|
010002
|
||||||
031000
|
031000
|
||||||
041000
|
041000
|
||||||
000002
|
000002
|
||||||
|
|||||||
@@ -26,6 +26,7 @@
|
|||||||
<htmlTabIcon>tasks</htmlTabIcon>
|
<htmlTabIcon>tasks</htmlTabIcon>
|
||||||
<repeatCount>1</repeatCount>
|
<repeatCount>1</repeatCount>
|
||||||
<TestCaseRequestedList>
|
<TestCaseRequestedList>
|
||||||
|
010002
|
||||||
030000
|
030000
|
||||||
040000
|
040000
|
||||||
000002
|
000002
|
||||||
@@ -34,8 +35,8 @@
|
|||||||
050000
|
050000
|
||||||
050001
|
050001
|
||||||
000001
|
000001
|
||||||
070003
|
070000
|
||||||
070002
|
070001
|
||||||
000001
|
000001
|
||||||
050000
|
050000
|
||||||
050001
|
050001
|
||||||
@@ -52,14 +53,12 @@
|
|||||||
<UE_Trace>yes</UE_Trace>
|
<UE_Trace>yes</UE_Trace>
|
||||||
</testCase>
|
</testCase>
|
||||||
|
|
||||||
|
|
||||||
<testCase id="010002">
|
<testCase id="010002">
|
||||||
<class>Terminate_UE</class>
|
<class>Terminate_UE</class>
|
||||||
<desc>Terminate Quectel</desc>
|
<desc>Terminate Quectel</desc>
|
||||||
<id>idefix</id>
|
<id>idefix</id>
|
||||||
</testCase>
|
</testCase>
|
||||||
|
|
||||||
|
|
||||||
<testCase id="030000">
|
<testCase id="030000">
|
||||||
<class>Initialize_eNB</class>
|
<class>Initialize_eNB</class>
|
||||||
<desc>Initialize eNB</desc>
|
<desc>Initialize eNB</desc>
|
||||||
@@ -70,7 +69,6 @@
|
|||||||
<eNB_Trace>yes</eNB_Trace>
|
<eNB_Trace>yes</eNB_Trace>
|
||||||
</testCase>
|
</testCase>
|
||||||
|
|
||||||
|
|
||||||
<testCase id="040000">
|
<testCase id="040000">
|
||||||
<class>Initialize_eNB</class>
|
<class>Initialize_eNB</class>
|
||||||
<desc>Initialize gNB</desc>
|
<desc>Initialize gNB</desc>
|
||||||
@@ -92,7 +90,6 @@
|
|||||||
<idle_sleep_time_in_sec>20</idle_sleep_time_in_sec>
|
<idle_sleep_time_in_sec>20</idle_sleep_time_in_sec>
|
||||||
</testCase>
|
</testCase>
|
||||||
|
|
||||||
|
|
||||||
<testCase id="050000">
|
<testCase id="050000">
|
||||||
<class>Ping</class>
|
<class>Ping</class>
|
||||||
<desc>Ping: 20pings in 20sec</desc>
|
<desc>Ping: 20pings in 20sec</desc>
|
||||||
@@ -112,39 +109,17 @@
|
|||||||
</testCase>
|
</testCase>
|
||||||
|
|
||||||
<testCase id="070000">
|
<testCase id="070000">
|
||||||
<class>Iperf</class>
|
|
||||||
<desc>iperf (DL/30Mbps/UDP)(30 sec)(single-ue profile)</desc>
|
|
||||||
<iperf_args>-u -b 30M -t 30</iperf_args>
|
|
||||||
<direction>DL</direction>
|
|
||||||
<id>idefix</id>
|
|
||||||
<iperf_packetloss_threshold>1</iperf_packetloss_threshold>
|
|
||||||
<iperf_bitrate_threshold>95</iperf_bitrate_threshold>
|
|
||||||
<iperf_profile>single-ue</iperf_profile>
|
|
||||||
</testCase>
|
|
||||||
|
|
||||||
<testCase id="070001">
|
|
||||||
<class>Iperf</class>
|
|
||||||
<desc>iperf (DL/90Mbps/UDP)(30 sec)(single-ue profile)</desc>
|
|
||||||
<iperf_args>-u -b 90M -t 30</iperf_args>
|
|
||||||
<direction>DL</direction>
|
|
||||||
<id>idefix</id>
|
|
||||||
<iperf_packetloss_threshold>1</iperf_packetloss_threshold>
|
|
||||||
<iperf_bitrate_threshold>95</iperf_bitrate_threshold>
|
|
||||||
<iperf_profile>single-ue</iperf_profile>
|
|
||||||
</testCase>
|
|
||||||
|
|
||||||
<testCase id="070002">
|
|
||||||
<class>Iperf</class>
|
<class>Iperf</class>
|
||||||
<desc>iperf (DL/125Mbps/UDP)(60 sec)(single-ue profile)</desc>
|
<desc>iperf (DL/125Mbps/UDP)(60 sec)(single-ue profile)</desc>
|
||||||
<iperf_args>-u -b 125M -t 60</iperf_args>
|
<iperf_args>-u -b 125M -t 60</iperf_args>
|
||||||
<direction>DL</direction>
|
<direction>DL</direction>
|
||||||
<id>idefix</id>
|
<id>idefix</id>
|
||||||
<iperf_packetloss_threshold>1</iperf_packetloss_threshold>
|
<iperf_packetloss_threshold>25</iperf_packetloss_threshold>
|
||||||
<iperf_bitrate_threshold>95</iperf_bitrate_threshold>
|
<iperf_bitrate_threshold>80</iperf_bitrate_threshold>
|
||||||
<iperf_profile>single-ue</iperf_profile>
|
<iperf_profile>single-ue</iperf_profile>
|
||||||
</testCase>
|
</testCase>
|
||||||
|
|
||||||
<testCase id="070003">
|
<testCase id="070001">
|
||||||
<class>Iperf</class>
|
<class>Iperf</class>
|
||||||
<desc>iperf (UL/8Mbps/UDP)(60 sec)(single-ue profile)</desc>
|
<desc>iperf (UL/8Mbps/UDP)(60 sec)(single-ue profile)</desc>
|
||||||
<iperf_args>-u -b 8M -t 60</iperf_args>
|
<iperf_args>-u -b 8M -t 60</iperf_args>
|
||||||
@@ -155,7 +130,6 @@
|
|||||||
<iperf_profile>single-ue</iperf_profile>
|
<iperf_profile>single-ue</iperf_profile>
|
||||||
</testCase>
|
</testCase>
|
||||||
|
|
||||||
|
|
||||||
<testCase id="080000">
|
<testCase id="080000">
|
||||||
<class>Terminate_eNB</class>
|
<class>Terminate_eNB</class>
|
||||||
<desc>Terminate eNB</desc>
|
<desc>Terminate eNB</desc>
|
||||||
|
|||||||
@@ -26,6 +26,7 @@
|
|||||||
<htmlTabIcon>tasks</htmlTabIcon>
|
<htmlTabIcon>tasks</htmlTabIcon>
|
||||||
<repeatCount>1</repeatCount>
|
<repeatCount>1</repeatCount>
|
||||||
<TestCaseRequestedList>
|
<TestCaseRequestedList>
|
||||||
|
010002
|
||||||
040000
|
040000
|
||||||
000002
|
000002
|
||||||
010000
|
010000
|
||||||
|
|||||||
@@ -26,6 +26,7 @@
|
|||||||
<htmlTabIcon>tasks</htmlTabIcon>
|
<htmlTabIcon>tasks</htmlTabIcon>
|
||||||
<repeatCount>1</repeatCount>
|
<repeatCount>1</repeatCount>
|
||||||
<TestCaseRequestedList>
|
<TestCaseRequestedList>
|
||||||
|
010002
|
||||||
042000
|
042000
|
||||||
000002
|
000002
|
||||||
010000
|
010000
|
||||||
|
|||||||
@@ -26,6 +26,7 @@
|
|||||||
<htmlTabIcon>tasks</htmlTabIcon>
|
<htmlTabIcon>tasks</htmlTabIcon>
|
||||||
<repeatCount>1</repeatCount>
|
<repeatCount>1</repeatCount>
|
||||||
<TestCaseRequestedList>
|
<TestCaseRequestedList>
|
||||||
|
011002
|
||||||
041000
|
041000
|
||||||
000002
|
000002
|
||||||
011000
|
011000
|
||||||
|
|||||||
@@ -24,7 +24,7 @@
|
|||||||
<htmlTabRef>gNB-PHY-Test</htmlTabRef>
|
<htmlTabRef>gNB-PHY-Test</htmlTabRef>
|
||||||
<htmlTabName>Run-gNB-PHY-Test</htmlTabName>
|
<htmlTabName>Run-gNB-PHY-Test</htmlTabName>
|
||||||
<htmlTabIcon>tasks</htmlTabIcon>
|
<htmlTabIcon>tasks</htmlTabIcon>
|
||||||
<repeatCount>3</repeatCount>
|
<repeatCount>1</repeatCount>
|
||||||
<TestCaseRequestedList>
|
<TestCaseRequestedList>
|
||||||
090101 000001 090109
|
090101 000001 090109
|
||||||
</TestCaseRequestedList>
|
</TestCaseRequestedList>
|
||||||
@@ -33,7 +33,7 @@
|
|||||||
<testCase id="090101">
|
<testCase id="090101">
|
||||||
<class>Initialize_eNB</class>
|
<class>Initialize_eNB</class>
|
||||||
<desc>Initialize gNB USRP</desc>
|
<desc>Initialize gNB USRP</desc>
|
||||||
<Initialize_eNB_args>-O ci-scripts/conf_files/gnb.band78.tm1.106PRB.usrpn300.conf --phy-test -q -U 787200 -T 106 -t 28 -D 130175 -m 28 -M 106 --log_config.global_log_options level,nocolor,time</Initialize_eNB_args>
|
<Initialize_eNB_args>-O ci-scripts/conf_files/gnb.band78.tm1.106PRB.usrpn300.conf --phy-test -q -U 787200 -T 106 -t 28 -D 130175 -m 28 -M 106 --usrp-tx-thread-config 1 --log_config.global_log_options level,nocolor,time</Initialize_eNB_args>
|
||||||
<air_interface>NR</air_interface>
|
<air_interface>NR</air_interface>
|
||||||
<USRP_IPAddress>192.168.20.2</USRP_IPAddress>
|
<USRP_IPAddress>192.168.20.2</USRP_IPAddress>
|
||||||
</testCase>
|
</testCase>
|
||||||
|
|||||||
@@ -34,7 +34,7 @@
|
|||||||
<mode>TesteNB</mode>
|
<mode>TesteNB</mode>
|
||||||
<class>Build_eNB</class>
|
<class>Build_eNB</class>
|
||||||
<desc>Build gNB (USRP)</desc>
|
<desc>Build gNB (USRP)</desc>
|
||||||
<Build_eNB_args>--gNB -w USRP --ninja --cmake-opt -DBoost_INCLUDE_DIR=/usr/include/boost169</Build_eNB_args>
|
<Build_eNB_args>--gNB -w USRP --ninja --cmake-opt -DBoost_INCLUDE_DIR=/usr/include/boost169 --noavx512</Build_eNB_args>
|
||||||
<forced_workspace_cleanup>True</forced_workspace_cleanup>
|
<forced_workspace_cleanup>True</forced_workspace_cleanup>
|
||||||
</testCase>
|
</testCase>
|
||||||
|
|
||||||
|
|||||||
@@ -32,7 +32,7 @@
|
|||||||
<testCase id="000001">
|
<testCase id="000001">
|
||||||
<class>Build_PhySim</class>
|
<class>Build_PhySim</class>
|
||||||
<desc>Build for physical simulator</desc>
|
<desc>Build for physical simulator</desc>
|
||||||
<physim_build_args>--phy_simulators --ninja</physim_build_args>
|
<physim_build_args>--phy_simulators --ninja --noavx512</physim_build_args>
|
||||||
<forced_workspace_cleanup>FALSE</forced_workspace_cleanup>
|
<forced_workspace_cleanup>FALSE</forced_workspace_cleanup>
|
||||||
</testCase>
|
</testCase>
|
||||||
|
|
||||||
|
|||||||
@@ -26,6 +26,7 @@
|
|||||||
<htmlTabIcon>tasks</htmlTabIcon>
|
<htmlTabIcon>tasks</htmlTabIcon>
|
||||||
<repeatCount>1</repeatCount>
|
<repeatCount>1</repeatCount>
|
||||||
<TestCaseRequestedList>
|
<TestCaseRequestedList>
|
||||||
|
010002
|
||||||
030000
|
030000
|
||||||
000002
|
000002
|
||||||
010000
|
010000
|
||||||
@@ -88,7 +89,7 @@
|
|||||||
<id>nrmodule2_quectel</id>
|
<id>nrmodule2_quectel</id>
|
||||||
<ping_args>-c 20</ping_args>
|
<ping_args>-c 20</ping_args>
|
||||||
<ping_packetloss_threshold>1</ping_packetloss_threshold>
|
<ping_packetloss_threshold>1</ping_packetloss_threshold>
|
||||||
<ping_rttavg_threshold>40</ping_rttavg_threshold>
|
<ping_rttavg_threshold>60</ping_rttavg_threshold>
|
||||||
</testCase>
|
</testCase>
|
||||||
<testCase id="050001">
|
<testCase id="050001">
|
||||||
<class>Ping</class>
|
<class>Ping</class>
|
||||||
@@ -96,7 +97,7 @@
|
|||||||
<id>nrmodule2_quectel</id>
|
<id>nrmodule2_quectel</id>
|
||||||
<ping_args>-c 100 -s 1024 -i 0,2</ping_args>
|
<ping_args>-c 100 -s 1024 -i 0,2</ping_args>
|
||||||
<ping_packetloss_threshold>1</ping_packetloss_threshold>
|
<ping_packetloss_threshold>1</ping_packetloss_threshold>
|
||||||
<ping_rttavg_threshold>40</ping_rttavg_threshold>
|
<ping_rttavg_threshold>60</ping_rttavg_threshold>
|
||||||
</testCase>
|
</testCase>
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -26,6 +26,7 @@
|
|||||||
<htmlTabIcon>tasks</htmlTabIcon>
|
<htmlTabIcon>tasks</htmlTabIcon>
|
||||||
<repeatCount>1</repeatCount>
|
<repeatCount>1</repeatCount>
|
||||||
<TestCaseRequestedList>
|
<TestCaseRequestedList>
|
||||||
|
010002
|
||||||
030001
|
030001
|
||||||
000002
|
000002
|
||||||
010000
|
010000
|
||||||
@@ -88,7 +89,7 @@
|
|||||||
<id>nrmodule2_quectel</id>
|
<id>nrmodule2_quectel</id>
|
||||||
<ping_args>-c 20</ping_args>
|
<ping_args>-c 20</ping_args>
|
||||||
<ping_packetloss_threshold>1</ping_packetloss_threshold>
|
<ping_packetloss_threshold>1</ping_packetloss_threshold>
|
||||||
<ping_rttavg_threshold>40</ping_rttavg_threshold>
|
<ping_rttavg_threshold>60</ping_rttavg_threshold>
|
||||||
</testCase>
|
</testCase>
|
||||||
<testCase id="050003">
|
<testCase id="050003">
|
||||||
<class>Ping</class>
|
<class>Ping</class>
|
||||||
@@ -96,7 +97,7 @@
|
|||||||
<id>nrmodule2_quectel</id>
|
<id>nrmodule2_quectel</id>
|
||||||
<ping_args>-c 100 -s 1024 -i 0,2</ping_args>
|
<ping_args>-c 100 -s 1024 -i 0,2</ping_args>
|
||||||
<ping_packetloss_threshold>1</ping_packetloss_threshold>
|
<ping_packetloss_threshold>1</ping_packetloss_threshold>
|
||||||
<ping_rttavg_threshold>40</ping_rttavg_threshold>
|
<ping_rttavg_threshold>60</ping_rttavg_threshold>
|
||||||
</testCase>
|
</testCase>
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,44 @@
|
|||||||
|
version: '3.8'
|
||||||
|
|
||||||
|
services:
|
||||||
|
gnb_mono_tdd:
|
||||||
|
image: oai-gnb:latest
|
||||||
|
privileged: true
|
||||||
|
container_name: sa-b200-gnb
|
||||||
|
environment:
|
||||||
|
USE_SA_TDD_MONO_B2XX: 'yes'
|
||||||
|
USE_B2XX: 'yes'
|
||||||
|
GNB_NAME: gNB-in-docker
|
||||||
|
MCC: '222'
|
||||||
|
MNC: '01'
|
||||||
|
MNC_LENGTH: 2
|
||||||
|
TAC: 1
|
||||||
|
NSSAI_SST: 1
|
||||||
|
NSSAI_SD0: 1
|
||||||
|
AMF_IP_ADDRESS: 172.21.16.136
|
||||||
|
GNB_NGA_IF_NAME: eth0
|
||||||
|
GNB_NGA_IP_ADDRESS: 192.168.68.194
|
||||||
|
GNB_NGU_IF_NAME: eth0
|
||||||
|
GNB_NGU_IP_ADDRESS: 192.168.68.194
|
||||||
|
USE_ADDITIONAL_OPTIONS: --sa -E -q --RUs.[0].sdr_addrs serial=30C51D4 --continuous-tx --log_config.global_log_options level,nocolor,time,line_num,function
|
||||||
|
volumes:
|
||||||
|
- /dev:/dev
|
||||||
|
networks:
|
||||||
|
public_net:
|
||||||
|
ipv4_address: 192.168.68.194
|
||||||
|
#entrypoint: /bin/bash -c "sleep infinity"
|
||||||
|
healthcheck:
|
||||||
|
# pgrep does NOT work
|
||||||
|
test: /bin/bash -c "ps aux | grep -v grep | grep -c softmodem"
|
||||||
|
interval: 10s
|
||||||
|
timeout: 5s
|
||||||
|
retries: 5
|
||||||
|
|
||||||
|
networks:
|
||||||
|
public_net:
|
||||||
|
name: sa-b200-gnb-net
|
||||||
|
ipam:
|
||||||
|
config:
|
||||||
|
- subnet: 192.168.68.192/26
|
||||||
|
driver_opts:
|
||||||
|
com.docker.network.bridge.name: "sa-gnb-net"
|
||||||
@@ -203,17 +203,23 @@ if (CMAKE_SYSTEM_PROCESSOR STREQUAL "armv7l")
|
|||||||
else (CMAKE_SYSTEM_PROCESSOR STREQUAL "armv7l")
|
else (CMAKE_SYSTEM_PROCESSOR STREQUAL "armv7l")
|
||||||
if(EXISTS "/proc/cpuinfo")
|
if(EXISTS "/proc/cpuinfo")
|
||||||
file(STRINGS "/proc/cpuinfo" CPUINFO REGEX flags LIMIT_COUNT 1)
|
file(STRINGS "/proc/cpuinfo" CPUINFO REGEX flags LIMIT_COUNT 1)
|
||||||
if (CPUINFO MATCHES "avx2")
|
message("NOAVX512 is ${NOAVX512}")
|
||||||
set(C_FLAGS_PROCESSOR "${C_FLAGS_PROCESSOR} -mavx2")
|
if (CPUINFO MATCHES "avx512bw" AND "${NOAVX512}" STREQUAL "False")
|
||||||
|
set(C_FLAGS_PROCESSOR "${C_FLAGS_PROCESSOR} -mavx512bw -march=skylake-avx512 -mtune=skylake-avx512 " )
|
||||||
set(COMPILATION_AVX2 "True")
|
set(COMPILATION_AVX2 "True")
|
||||||
else()
|
else()
|
||||||
set(COMPILATION_AVX2 "False")
|
if (CPUINFO MATCHES "avx2")
|
||||||
endif()
|
set(C_FLAGS_PROCESSOR "${C_FLAGS_PROCESSOR} -mavx2")
|
||||||
if (CPUINFO MATCHES "sse4_1")
|
set(COMPILATION_AVX2 "True")
|
||||||
set(C_FLAGS_PROCESSOR "${C_FLAGS_PROCESSOR} -msse4.1 -mpclmul")
|
else()
|
||||||
endif()
|
set(COMPILATION_AVX2 "False")
|
||||||
if (CPUINFO MATCHES "ssse3")
|
endif()
|
||||||
set(C_FLAGS_PROCESSOR "${C_FLAGS_PROCESSOR} -mssse3")
|
if (CPUINFO MATCHES "sse4_1")
|
||||||
|
set(C_FLAGS_PROCESSOR "${C_FLAGS_PROCESSOR} -msse4.1 -mpclmul")
|
||||||
|
endif()
|
||||||
|
if (CPUINFO MATCHES "ssse3")
|
||||||
|
set(C_FLAGS_PROCESSOR "${C_FLAGS_PROCESSOR} -mssse3")
|
||||||
|
endif()
|
||||||
endif()
|
endif()
|
||||||
else()
|
else()
|
||||||
Message("/proc/cpuinfo does not exit. We will use manual CPU flags")
|
Message("/proc/cpuinfo does not exit. We will use manual CPU flags")
|
||||||
@@ -224,11 +230,11 @@ set(C_FLAGS_PROCESSOR " ${C_FLAGS_PROCESSOR} ${CFLAGS_PROCESSOR_USER}")
|
|||||||
|
|
||||||
Message("C_FLAGS_PROCESSOR is ${C_FLAGS_PROCESSOR}")
|
Message("C_FLAGS_PROCESSOR is ${C_FLAGS_PROCESSOR}")
|
||||||
|
|
||||||
if (CMAKE_SYSTEM_PROCESSOR MATCHES "x86")
|
#if (CMAKE_SYSTEM_PROCESSOR MATCHES "x86")
|
||||||
if ( (NOT( C_FLAGS_PROCESSOR MATCHES "ssse3")) OR (NOT( C_FLAGS_PROCESSOR MATCHES "msse4.1")) )
|
# if ( (NOT( C_FLAGS_PROCESSOR MATCHES "ssse3")) OR (NOT( C_FLAGS_PROCESSOR MATCHES "msse4.1")) )
|
||||||
Message(FATAL_ERROR "For x86 Architecture, you must have following flags: -mssse3 -msse4.1. The current detected flags are: ${C_FLAGS_PROCESSOR}. You can pass the flags manually in build script, for example: ./build_oai --cflags_processor \"-mssse3 -msse4.1 -mavx2\" ")
|
# Message(FATAL_ERROR "For x86 Architecture, you must have following flags: -mssse3 -msse4.1. The current detected flags are: ${C_FLAGS_PROCESSOR}. You can pass the flags manually in build script, for example: ./build_oai --cflags_processor \"-mssse3 -msse4.1 -mavx2\" ")
|
||||||
endif()
|
# endif()
|
||||||
endif()
|
#endif()
|
||||||
|
|
||||||
#
|
#
|
||||||
# add autotools definitions that were maybe used!
|
# add autotools definitions that were maybe used!
|
||||||
@@ -247,6 +253,28 @@ add_boolean_option(SANITIZE_ADDRESS False "enable the address sanitizer (ASan)")
|
|||||||
if (SANITIZE_ADDRESS)
|
if (SANITIZE_ADDRESS)
|
||||||
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fsanitize=address -fno-omit-frame-pointer -fno-common")
|
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fsanitize=address -fno-omit-frame-pointer -fno-common")
|
||||||
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fsanitize=address -fno-omit-frame-pointer -fno-common")
|
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fsanitize=address -fno-omit-frame-pointer -fno-common")
|
||||||
|
# There seems to be some incompatibility with pthread_create and the RT scheduler, which
|
||||||
|
# results in pthread_create hanging.
|
||||||
|
#
|
||||||
|
# When we switch from Ubuntu 16.04 to 18.04, we found that running with the address sanitizer,
|
||||||
|
# the pthread_create function calls were not working. The inital thought was that we were
|
||||||
|
# trying to create a thread that was not-blocking and would eventually crash the machine during
|
||||||
|
# the run. After more debugging, we found that we would never even start the thread. We narrowed
|
||||||
|
# down the first two instances of pthread_create in the gNB and NR UE to be sctp_eNB_task and
|
||||||
|
# one_thread, respectively. We found that adding sleeps, and various other pauses to the threads
|
||||||
|
# had not effect. From there, we found that if we add an abort(); prior to the thread loop, we
|
||||||
|
# do not execute that. This indicated to us that the problem is not likely to be a non-blocking
|
||||||
|
# thread, but perhaps and issue with pthread_create itself. From there we begain to research the
|
||||||
|
# issue on the web. See: https://github.com/google/sanitizers/issues/1125
|
||||||
|
#
|
||||||
|
# Google searching indicates this appears to be a problem since at least 2018. This could be something
|
||||||
|
# wrong in the pthread library, or something subtly wrong in this CMakeLists.txt. Use Ubuntu 20.04 instead.
|
||||||
|
endif ()
|
||||||
|
|
||||||
|
add_boolean_option(SANITIZE_UNDEFINED False "enable the undefined behavior sanitizer (UBSan)")
|
||||||
|
if (SANITIZE_UNDEFINED)
|
||||||
|
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fsanitize=undefined -fno-sanitize-recover=all")
|
||||||
|
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fsanitize=undefined -fno-sanitize-recover=all")
|
||||||
endif ()
|
endif ()
|
||||||
|
|
||||||
add_definitions("-DASN_DISABLE_OER_SUPPORT")
|
add_definitions("-DASN_DISABLE_OER_SUPPORT")
|
||||||
@@ -1410,8 +1438,11 @@ set(PHY_NR_CODINGIF
|
|||||||
)
|
)
|
||||||
|
|
||||||
add_library(ldpc_orig MODULE ${PHY_LDPC_ORIG_SRC} )
|
add_library(ldpc_orig MODULE ${PHY_LDPC_ORIG_SRC} )
|
||||||
|
target_link_libraries(ldpc_orig PRIVATE ldpc_gen_HEADERS)
|
||||||
add_library(ldpc_optim MODULE ${PHY_LDPC_OPTIM_SRC} )
|
add_library(ldpc_optim MODULE ${PHY_LDPC_OPTIM_SRC} )
|
||||||
|
target_link_libraries(ldpc_optim PRIVATE ldpc_gen_HEADERS)
|
||||||
add_library(ldpc_optim8seg MODULE ${PHY_LDPC_OPTIM8SEG_SRC} )
|
add_library(ldpc_optim8seg MODULE ${PHY_LDPC_OPTIM8SEG_SRC} )
|
||||||
|
target_link_libraries(ldpc_optim8seg PRIVATE ldpc_gen_HEADERS)
|
||||||
add_library(ldpc_cl MODULE ${PHY_LDPC_CL_SRC} )
|
add_library(ldpc_cl MODULE ${PHY_LDPC_CL_SRC} )
|
||||||
target_link_libraries(ldpc_cl OpenCL)
|
target_link_libraries(ldpc_cl OpenCL)
|
||||||
add_dependencies(ldpc_cl nrLDPC_decoder_kernels_CL)
|
add_dependencies(ldpc_cl nrLDPC_decoder_kernels_CL)
|
||||||
@@ -1423,6 +1454,7 @@ if (CUDA_FOUND)
|
|||||||
endif (CUDA_FOUND)
|
endif (CUDA_FOUND)
|
||||||
|
|
||||||
add_library(ldpc MODULE ${PHY_LDPC_OPTIM8SEGMULTI_SRC} )
|
add_library(ldpc MODULE ${PHY_LDPC_OPTIM8SEGMULTI_SRC} )
|
||||||
|
target_link_libraries(ldpc PRIVATE ldpc_gen_HEADERS)
|
||||||
|
|
||||||
|
|
||||||
add_library(coding MODULE ${PHY_TURBOSRC} )
|
add_library(coding MODULE ${PHY_TURBOSRC} )
|
||||||
@@ -1568,9 +1600,10 @@ set(PHY_SRC_UE
|
|||||||
|
|
||||||
set(PHY_NR_SRC_COMMON
|
set(PHY_NR_SRC_COMMON
|
||||||
${OPENAIR1_DIR}/PHY/NR_TRANSPORT/nr_prach_common.c
|
${OPENAIR1_DIR}/PHY/NR_TRANSPORT/nr_prach_common.c
|
||||||
${OPENAIR1_DIR}/PHY/NR_UE_TRANSPORT/srs_modulation_nr.c
|
${OPENAIR1_DIR}/PHY/NR_TRANSPORT/nr_csi_rs.c
|
||||||
${OPENAIR1_DIR}/PHY/NR_TRANSPORT/nr_scrambling.c
|
${OPENAIR1_DIR}/PHY/NR_TRANSPORT/nr_scrambling.c
|
||||||
${OPENAIR1_DIR}/PHY/NR_REFSIG/scrambling_luts.c
|
${OPENAIR1_DIR}/PHY/NR_REFSIG/scrambling_luts.c
|
||||||
|
${OPENAIR1_DIR}/PHY/NR_UE_TRANSPORT/srs_modulation_nr.c
|
||||||
)
|
)
|
||||||
|
|
||||||
set(PHY_NR_SRC
|
set(PHY_NR_SRC
|
||||||
@@ -1595,7 +1628,6 @@ set(PHY_SRC_UE
|
|||||||
${OPENAIR1_DIR}/PHY/NR_TRANSPORT/nr_ulsch_demodulation.c
|
${OPENAIR1_DIR}/PHY/NR_TRANSPORT/nr_ulsch_demodulation.c
|
||||||
${OPENAIR1_DIR}/PHY/NR_REFSIG/ul_ref_seq_nr.c
|
${OPENAIR1_DIR}/PHY/NR_REFSIG/ul_ref_seq_nr.c
|
||||||
${OPENAIR1_DIR}/PHY/NR_REFSIG/nr_dmrs_rx.c
|
${OPENAIR1_DIR}/PHY/NR_REFSIG/nr_dmrs_rx.c
|
||||||
${OPENAIR1_DIR}/PHY/NR_TRANSPORT/nr_csi_rs.c
|
|
||||||
${OPENAIR1_DIR}/PHY/NR_REFSIG/nr_gold.c
|
${OPENAIR1_DIR}/PHY/NR_REFSIG/nr_gold.c
|
||||||
${OPENAIR1_DIR}/PHY/NR_REFSIG/nr_gen_mod_table.c
|
${OPENAIR1_DIR}/PHY/NR_REFSIG/nr_gen_mod_table.c
|
||||||
${OPENAIR1_DIR}/PHY/NR_REFSIG/dmrs_nr.c
|
${OPENAIR1_DIR}/PHY/NR_REFSIG/dmrs_nr.c
|
||||||
@@ -1643,6 +1675,7 @@ set(PHY_SRC_UE
|
|||||||
${OPENAIR1_DIR}/PHY/NR_UE_TRANSPORT/dci_nr.c
|
${OPENAIR1_DIR}/PHY/NR_UE_TRANSPORT/dci_nr.c
|
||||||
${OPENAIR1_DIR}/PHY/NR_UE_TRANSPORT/dci_tools_nr.c
|
${OPENAIR1_DIR}/PHY/NR_UE_TRANSPORT/dci_tools_nr.c
|
||||||
${OPENAIR1_DIR}/PHY/NR_UE_TRANSPORT/pucch_nr.c
|
${OPENAIR1_DIR}/PHY/NR_UE_TRANSPORT/pucch_nr.c
|
||||||
|
${OPENAIR1_DIR}/PHY/NR_UE_TRANSPORT/csi_rx.c
|
||||||
${OPENAIR1_DIR}/PHY/NR_TRANSPORT/nr_uci_tools_common.c
|
${OPENAIR1_DIR}/PHY/NR_TRANSPORT/nr_uci_tools_common.c
|
||||||
${OPENAIR1_DIR}/PHY/NR_UE_TRANSPORT/nr_ulsch_ue.c
|
${OPENAIR1_DIR}/PHY/NR_UE_TRANSPORT/nr_ulsch_ue.c
|
||||||
${OPENAIR1_DIR}/PHY/NR_REFSIG/ul_ref_seq_nr.c
|
${OPENAIR1_DIR}/PHY/NR_REFSIG/ul_ref_seq_nr.c
|
||||||
@@ -1804,7 +1837,15 @@ set(NR_PDCP_SRC
|
|||||||
${OPENAIR2_DIR}/LAYER2/nr_pdcp/nr_pdcp_timer_thread.c
|
${OPENAIR2_DIR}/LAYER2/nr_pdcp/nr_pdcp_timer_thread.c
|
||||||
${OPENAIR2_DIR}/LAYER2/nr_pdcp/nr_pdcp_security_nea2.c
|
${OPENAIR2_DIR}/LAYER2/nr_pdcp/nr_pdcp_security_nea2.c
|
||||||
${OPENAIR2_DIR}/LAYER2/nr_pdcp/nr_pdcp_integrity_nia2.c
|
${OPENAIR2_DIR}/LAYER2/nr_pdcp/nr_pdcp_integrity_nia2.c
|
||||||
|
${OPENAIR2_DIR}/LAYER2/nr_pdcp/nr_pdcp_integrity_nia1.c
|
||||||
${OPENAIR2_DIR}/LAYER2/nr_pdcp/asn1_utils.c
|
${OPENAIR2_DIR}/LAYER2/nr_pdcp/asn1_utils.c
|
||||||
|
#hack: include these files to compile the nr phy simulators
|
||||||
|
#these files should not be here, will be removed at some point when the
|
||||||
|
#computation is done directly inside nr_pdcp_integrity_nia1.c instead
|
||||||
|
#of reusing code of osa_stream_eia.c
|
||||||
|
${OPENAIR2_DIR}/UTIL/OSA/osa_stream_eia.c
|
||||||
|
${OPENAIR2_DIR}/UTIL/OSA/osa_snow3g.c
|
||||||
|
${OPENAIR2_DIR}/UTIL/OSA/osa_rijndael.c
|
||||||
)
|
)
|
||||||
|
|
||||||
set(NR_SDAP_SRC
|
set(NR_SDAP_SRC
|
||||||
@@ -1952,6 +1993,7 @@ set (MAC_SRC_UE
|
|||||||
|
|
||||||
set (MAC_NR_SRC_UE
|
set (MAC_NR_SRC_UE
|
||||||
${NR_UE_PHY_INTERFACE_DIR}/NR_IF_Module.c
|
${NR_UE_PHY_INTERFACE_DIR}/NR_IF_Module.c
|
||||||
|
${NR_UE_PHY_INTERFACE_DIR}/NR_Packet_Drop.c
|
||||||
${NR_UE_MAC_DIR}/config_ue.c
|
${NR_UE_MAC_DIR}/config_ue.c
|
||||||
${NR_UE_MAC_DIR}/mac_vars.c
|
${NR_UE_MAC_DIR}/mac_vars.c
|
||||||
${NR_UE_MAC_DIR}/main_ue_nr.c
|
${NR_UE_MAC_DIR}/main_ue_nr.c
|
||||||
@@ -2869,6 +2911,7 @@ target_link_libraries(ldpctest
|
|||||||
add_executable(nr_dlschsim
|
add_executable(nr_dlschsim
|
||||||
${OPENAIR1_DIR}/SIMULATION/NR_PHY/dlschsim.c
|
${OPENAIR1_DIR}/SIMULATION/NR_PHY/dlschsim.c
|
||||||
${OPENAIR_DIR}/common/utils/nr/nr_common.c
|
${OPENAIR_DIR}/common/utils/nr/nr_common.c
|
||||||
|
${OPENAIR_DIR}/executables/softmodem-common.c
|
||||||
${T_SOURCE}
|
${T_SOURCE}
|
||||||
${SHLIB_LOADER_SOURCES}
|
${SHLIB_LOADER_SOURCES}
|
||||||
)
|
)
|
||||||
@@ -2892,6 +2935,7 @@ target_link_libraries(nr_pbchsim
|
|||||||
add_executable(nr_pucchsim
|
add_executable(nr_pucchsim
|
||||||
${OPENAIR1_DIR}/SIMULATION/NR_PHY/pucchsim.c
|
${OPENAIR1_DIR}/SIMULATION/NR_PHY/pucchsim.c
|
||||||
${OPENAIR_DIR}/common/utils/nr/nr_common.c
|
${OPENAIR_DIR}/common/utils/nr/nr_common.c
|
||||||
|
${OPENAIR_DIR}/executables/softmodem-common.c
|
||||||
${T_SOURCE}
|
${T_SOURCE}
|
||||||
${SHLIB_LOADER_SOURCES}
|
${SHLIB_LOADER_SOURCES}
|
||||||
)
|
)
|
||||||
@@ -2936,6 +2980,7 @@ target_link_libraries(nr_prachsim
|
|||||||
add_executable(nr_ulschsim
|
add_executable(nr_ulschsim
|
||||||
${OPENAIR1_DIR}/SIMULATION/NR_PHY/ulschsim.c
|
${OPENAIR1_DIR}/SIMULATION/NR_PHY/ulschsim.c
|
||||||
${OPENAIR_DIR}/common/utils/nr/nr_common.c
|
${OPENAIR_DIR}/common/utils/nr/nr_common.c
|
||||||
|
${OPENAIR_DIR}/executables/softmodem-common.c
|
||||||
${PHY_INTERFACE_DIR}/queue_t.c
|
${PHY_INTERFACE_DIR}/queue_t.c
|
||||||
${T_SOURCE}
|
${T_SOURCE}
|
||||||
${SHLIB_LOADER_SOURCES}
|
${SHLIB_LOADER_SOURCES}
|
||||||
@@ -3177,3 +3222,4 @@ ADD_CUSTOM_TARGET(oarf
|
|||||||
)
|
)
|
||||||
|
|
||||||
include (${OPENAIR_DIR}/common/utils/telnetsrv/telnetsrv_CMakeLists.txt)
|
include (${OPENAIR_DIR}/common/utils/telnetsrv/telnetsrv_CMakeLists.txt)
|
||||||
|
include(${OPENAIR1_DIR}/PHY/CODING/nrLDPC_decoder/nrLDPC_tools/CMakeLists.txt)
|
||||||
|
|||||||
@@ -1062,7 +1062,8 @@
|
|||||||
(Test3: PBCH-only, 217 PRB),
|
(Test3: PBCH-only, 217 PRB),
|
||||||
(Test4: PBCH and synchronization, 217 RPB),
|
(Test4: PBCH and synchronization, 217 RPB),
|
||||||
(Test5: PBCH-only, 273 PRB),
|
(Test5: PBCH-only, 273 PRB),
|
||||||
(Test6: PBCH and synchronization, 273 PRB)</desc>
|
(Test6: PBCH and synchronization, 273 PRB),
|
||||||
|
(Test7: PBCH and synchronization, 106PBR, SSB SC OFFSET 6)</desc>
|
||||||
<pre_compile_prog></pre_compile_prog>
|
<pre_compile_prog></pre_compile_prog>
|
||||||
<compile_prog>$OPENAIR_DIR/cmake_targets/build_oai</compile_prog>
|
<compile_prog>$OPENAIR_DIR/cmake_targets/build_oai</compile_prog>
|
||||||
<compile_prog_args> --phy_simulators -c </compile_prog_args>
|
<compile_prog_args> --phy_simulators -c </compile_prog_args>
|
||||||
@@ -1074,8 +1075,9 @@
|
|||||||
-s-11 -S-8 -n10 -R217
|
-s-11 -S-8 -n10 -R217
|
||||||
-s-11 -S-8 -n10 -o8000 -I -R217
|
-s-11 -S-8 -n10 -o8000 -I -R217
|
||||||
-s-11 -S-8 -n10 -R273
|
-s-11 -S-8 -n10 -R273
|
||||||
-s-11 -S-8 -n10 -o8000 -I -R273</main_exec_args>
|
-s-11 -S-8 -n10 -o8000 -I -R273
|
||||||
<tags>nr_pbchsim.test1 nr_pbchsim.test2 nr_pbchsim.test3 nr_pbchsim.test4 nr_pbchsim.test5 nr_pbchsim.test6</tags>
|
-s-11 -S-8 -n10 -R106 -O6</main_exec_args>
|
||||||
|
<tags>nr_pbchsim.test1 nr_pbchsim.test2 nr_pbchsim.test3 nr_pbchsim.test4 nr_pbchsim.test5 nr_pbchsim.test6 nr_pbchsim.test7</tags>
|
||||||
<search_expr_true>PBCH test OK</search_expr_true>
|
<search_expr_true>PBCH test OK</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>
|
||||||
<nruns>3</nruns>
|
<nruns>3</nruns>
|
||||||
@@ -1104,7 +1106,9 @@
|
|||||||
(Test19: Mapping type A, 3 DMRS Symbols),
|
(Test19: Mapping type A, 3 DMRS Symbols),
|
||||||
(Test20: Mapping type B, 4 DMRS Symbols),
|
(Test20: Mapping type B, 4 DMRS Symbols),
|
||||||
(Test21: 4x4 MIMO, 1 Layer),
|
(Test21: 4x4 MIMO, 1 Layer),
|
||||||
(Test22: 4x4 MIMO, 2 Layers)</desc>
|
(Test22: 4x4 MIMO, 2 Layers),
|
||||||
|
(Test23: 25 PRBs, 15 kHz SCS)
|
||||||
|
(Test24: MCS 0, low SNR performance)</desc>
|
||||||
<pre_compile_prog></pre_compile_prog>
|
<pre_compile_prog></pre_compile_prog>
|
||||||
<compile_prog>$OPENAIR_DIR/cmake_targets/build_oai</compile_prog>
|
<compile_prog>$OPENAIR_DIR/cmake_targets/build_oai</compile_prog>
|
||||||
<compile_prog_args> --phy_simulators -c </compile_prog_args>
|
<compile_prog_args> --phy_simulators -c </compile_prog_args>
|
||||||
@@ -1132,8 +1136,10 @@
|
|||||||
-n100 -s2 -U 2 0 2
|
-n100 -s2 -U 2 0 2
|
||||||
-n100 -s2 -U 2 1 3
|
-n100 -s2 -U 2 1 3
|
||||||
-n10 -s20 -U 3 0 0 2 -gR -x1 -y4 -z4
|
-n10 -s20 -U 3 0 0 2 -gR -x1 -y4 -z4
|
||||||
-n10 -s20 -U 3 0 0 2 -gR -x2 -y4 -z4</main_exec_args>
|
-n10 -s20 -U 3 0 0 2 -gR -x2 -y4 -z4
|
||||||
<tags>nr_dlsim.test1 nr_dlsim.test2 nr_dlsim.test3 nr_dlsim.test4 nr_dlsim.test5 nr_dlsim.test6 nr_dlsim.test7 nr_dlsim.test8 nr_dlsim.test9 nr_dlsim.test10 nr_dlsim.test11 nr_dlsim.test12 nr_dlsim.test13 nr_dlsim.test14 nr_dlsim.test15 nr_dlsim.test16 nr_dlsim.test17 nr_dlsim.test18 nr_dlsim.test19 nr_dlsim.test20 nr_dlsim.test21 nr_dlsim.test22</tags>
|
-n100 -m0 -e0 -R25 -b25 -i 2 1 0
|
||||||
|
-n100 -e0 -t95 -S-1.0 -i 2 1 0</main_exec_args>
|
||||||
|
<tags>nr_dlsim.test1 nr_dlsim.test2 nr_dlsim.test3 nr_dlsim.test4 nr_dlsim.test5 nr_dlsim.test6 nr_dlsim.test7 nr_dlsim.test8 nr_dlsim.test9 nr_dlsim.test10 nr_dlsim.test11 nr_dlsim.test12 nr_dlsim.test13 nr_dlsim.test14 nr_dlsim.test15 nr_dlsim.test16 nr_dlsim.test17 nr_dlsim.test18 nr_dlsim.test19 nr_dlsim.test20 nr_dlsim.test21 nr_dlsim.test22 nr_dlsim.test23 nr_dlsim.test24</tags>
|
||||||
<search_expr_true>PDSCH test OK</search_expr_true>
|
<search_expr_true>PDSCH test OK</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>
|
||||||
<nruns>3</nruns>
|
<nruns>3</nruns>
|
||||||
@@ -1184,9 +1190,10 @@
|
|||||||
|
|
||||||
<testCase id="015108">
|
<testCase id="015108">
|
||||||
<class>execution</class>
|
<class>execution</class>
|
||||||
<desc>nr_ulschsim Test cases. (Test1: 106 PRB),
|
<desc>nr_ulschsim Test cases. (Test1: 106 PRBs),
|
||||||
(Test2: 217 PRB),
|
(Test2: 217 PRBs),
|
||||||
(Test3: 273 PRB)</desc>
|
(Test3: 273 PRBs)
|
||||||
|
(Test4: 106 PRBs 4-layer MIMO)</desc>
|
||||||
<pre_compile_prog></pre_compile_prog>
|
<pre_compile_prog></pre_compile_prog>
|
||||||
<compile_prog>$OPENAIR_DIR/cmake_targets/build_oai</compile_prog>
|
<compile_prog>$OPENAIR_DIR/cmake_targets/build_oai</compile_prog>
|
||||||
<compile_prog_args> --phy_simulators -c </compile_prog_args>
|
<compile_prog_args> --phy_simulators -c </compile_prog_args>
|
||||||
@@ -1195,8 +1202,9 @@
|
|||||||
<main_exec> $OPENAIR_DIR/targets/bin/nr_ulschsim.Rel15</main_exec>
|
<main_exec> $OPENAIR_DIR/targets/bin/nr_ulschsim.Rel15</main_exec>
|
||||||
<main_exec_args>-R 106 -m9 -s13 -n100
|
<main_exec_args>-R 106 -m9 -s13 -n100
|
||||||
-R 217 -m15 -s15 -n100
|
-R 217 -m15 -s15 -n100
|
||||||
-R 273 -m19 -s20 -n100</main_exec_args>
|
-R 273 -m19 -s20 -n100
|
||||||
<tags>nr_ulschsim.test1 nr_ulschsim.test2 nr_ulschsim.test3</tags>
|
-R 106 -m9 -s13 -n100 -y4 -z4 -W4</main_exec_args>
|
||||||
|
<tags>nr_ulschsim.test1 nr_ulschsim.test2 nr_ulschsim.test3 nr_ulschsim.test4</tags>
|
||||||
<search_expr_true>PUSCH test OK</search_expr_true>
|
<search_expr_true>PUSCH test OK</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>
|
||||||
<nruns>3</nruns>
|
<nruns>3</nruns>
|
||||||
@@ -1304,7 +1312,14 @@
|
|||||||
(Test12: SC-FDMA, 216 PRBs),
|
(Test12: SC-FDMA, 216 PRBs),
|
||||||
(Test13: SC-FDMA, 273 PRBs),
|
(Test13: SC-FDMA, 273 PRBs),
|
||||||
(Test14: SC-FDMA, 3 DMRS),
|
(Test14: SC-FDMA, 3 DMRS),
|
||||||
(Test15: MCS 16 50 PRBs 2 RX_Antenna)</desc>
|
(Test15: MCS 19 50 PRBs 2 RX_Antenna),
|
||||||
|
(Test16: MCS 9 106 PRBs MIMO 2 layers),
|
||||||
|
(Test17: MCS 9 106 PRBs MIMO 4 layers),
|
||||||
|
(Test18: 25 PRBs, 15 kHz SCS),
|
||||||
|
(Test19: 3GPP G-FR1-A4-13 2 RX Antennas Requirements Test),
|
||||||
|
(Test20: 3GPP G-FR1-A4-13 4 RX Antennas Requirements Test),
|
||||||
|
(Test21: 3GPP G-FR1-A4-13 8 RX Antennas Requirements Test),
|
||||||
|
(Test22: MCS 0, low SNR performance)</desc>
|
||||||
<pre_compile_prog></pre_compile_prog>
|
<pre_compile_prog></pre_compile_prog>
|
||||||
<compile_prog>$OPENAIR_DIR/cmake_targets/build_oai</compile_prog>
|
<compile_prog>$OPENAIR_DIR/cmake_targets/build_oai</compile_prog>
|
||||||
<compile_prog_args> --phy_simulators -c </compile_prog_args>
|
<compile_prog_args> --phy_simulators -c </compile_prog_args>
|
||||||
@@ -1316,18 +1331,24 @@
|
|||||||
-n100 -m28 -s20
|
-n100 -m28 -s20
|
||||||
-n100 -m9 -R217 -r217 -s5
|
-n100 -m9 -R217 -r217 -s5
|
||||||
-n100 -m9 -R273 -r273 -s5
|
-n100 -m9 -R273 -r273 -s5
|
||||||
-n100 -s5 -U 2 0 1
|
-n100 -s5 -U 4 0 1 1 1
|
||||||
-n100 -s5 -T 2 1 2 -U 2 0 2
|
-n100 -s5 -T 2 1 2 -U 4 0 2 1 1
|
||||||
-n100 -s5 -T 2 2 2 -U 2 1 2
|
-n100 -s5 -T 2 2 2 -U 4 1 2 1 1
|
||||||
-n100 -s5 -a4 -b8 -T 2 1 2 -U 2 1 3
|
-n100 -s5 -a4 -b8 -T 2 1 2 -U 4 1 3 1 1
|
||||||
-n100 -s5 -Z
|
-n100 -s5 -Z
|
||||||
-n100 -s5 -Z -r75
|
-n100 -s5 -Z -r75
|
||||||
-n50 -s5 -Z -r216 -R217
|
-n50 -s5 -Z -r216 -R217
|
||||||
-n50 -s5 -Z -r270 -R273
|
-n50 -s5 -Z -r270 -R273
|
||||||
-n100 -s5 -Z -U 2 0 2
|
-n100 -s5 -Z -U 4 0 2 1 2
|
||||||
-n100 -m16 -s10 -z2</main_exec_args>
|
-n100 -m19 -s10 -S15 -z2
|
||||||
|
-n100 -m9 -r106 -s10 -W2 -y2 -z2
|
||||||
<tags>nr_ulsim.test1 nr_ulsim.test2 nr_ulsim.test3 nr_ulsim.test4 nr_ulsim.test5 nr_ulsim.test6 nr_ulsim.test7 nr_ulsim.test8 nr_ulsim.test9 nr_ulsim.test10 nr_ulsim.test11 nr_ulsim.test12 nr_ulsim.test13 nr_ulsim.test14 nr_ulsim.test15</tags>
|
-n100 -m9 -r106 -s20 -W4 -y4 -z4
|
||||||
|
-n100 -u0 -m0 -R25 -r25 -i 2 1 0
|
||||||
|
-m16 -r106 -s8.8 -S9.4 -z2 -n200 -U 4 1 1 1 2 -gI -b14 -t70 -I15 -i 2 1 0
|
||||||
|
-m16 -r106 -s5.4 -S6 -z4 -n200 -U 4 1 1 1 2 -gI -b14 -t70 -I15 -i 2 1 0
|
||||||
|
-m16 -r106 -s3.4 -S3.8 -z8 -n200 -U 4 1 1 1 2 -gI -b14 -t70 -I15 -i 2 1 0
|
||||||
|
-n100 -m0 -S -0.6 -i 2 1 0</main_exec_args>
|
||||||
|
<tags>nr_ulsim.test1 nr_ulsim.test2 nr_ulsim.test3 nr_ulsim.test4 nr_ulsim.test5 nr_ulsim.test6 nr_ulsim.test7 nr_ulsim.test8 nr_ulsim.test9 nr_ulsim.test10 nr_ulsim.test11 nr_ulsim.test12 nr_ulsim.test13 nr_ulsim.test14 nr_ulsim.test15 nr_ulsim.test16 nr_ulsim.test17 nr_ulsim.test18 nr_ulsim.test19 nr_ulsim.test20 nr_ulsim.test21 nr_ulsim.test22</tags>
|
||||||
<search_expr_true>PUSCH test OK</search_expr_true>
|
<search_expr_true>PUSCH test OK</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>
|
||||||
<nruns>3</nruns>
|
<nruns>3</nruns>
|
||||||
@@ -1338,10 +1359,11 @@
|
|||||||
<desc>nr_prachsim Test cases. (Test1: 30kHz SCS, 106 PRBs, Prach format A2),
|
<desc>nr_prachsim Test cases. (Test1: 30kHz SCS, 106 PRBs, Prach format A2),
|
||||||
(Test2: 30kHz SCS, 217 PRBs, Prach format A2),
|
(Test2: 30kHz SCS, 217 PRBs, Prach format A2),
|
||||||
(Test3: 30kHz SCS, 273 PRBs, Prach format A2),
|
(Test3: 30kHz SCS, 273 PRBs, Prach format A2),
|
||||||
(Test4: 30kHz SCS, 106 PRBs, Prach format 0),
|
(Test4: 30kHz SCS, 106 PRBs, Prach format 0),
|
||||||
(Test5: 120kHz SCS, 32 PRBs, Prach format A2),
|
(Test5: 120kHz SCS, 32 PRBs, Prach format A2),
|
||||||
(Test6: 120kHz SCS, 66 PRBs, Prach format A2),
|
(Test6: 120kHz SCS, 66 PRBs, Prach format A2),
|
||||||
(Test7: 120kHz SCS, 66 PRBs, High Speed Enabled)</desc>
|
(Test7: 120kHz SCS, 66 PRBs, High Speed Enabled),
|
||||||
|
(Test8: 15kHz SCS, 25 PRBs)</desc>
|
||||||
<pre_compile_prog></pre_compile_prog>
|
<pre_compile_prog></pre_compile_prog>
|
||||||
<compile_prog>$OPENAIR_DIR/cmake_targets/build_oai</compile_prog>
|
<compile_prog>$OPENAIR_DIR/cmake_targets/build_oai</compile_prog>
|
||||||
<compile_prog_args> --phy_simulators -c </compile_prog_args>
|
<compile_prog_args> --phy_simulators -c </compile_prog_args>
|
||||||
@@ -1351,11 +1373,12 @@
|
|||||||
<main_exec_args>-a -s -30 -n 100 -p 63 -R 106
|
<main_exec_args>-a -s -30 -n 100 -p 63 -R 106
|
||||||
-a -s -30 -n 100 -p 63 -R 217
|
-a -s -30 -n 100 -p 63 -R 217
|
||||||
-a -s -30 -n 100 -p 63 -R 273
|
-a -s -30 -n 100 -p 63 -R 273
|
||||||
-a -s -30 -n 100 -p 63 -R 106 -c 4
|
-a -s -30 -n 100 -p 63 -R 106 -c 4
|
||||||
-a -s -30 -n 100 -p 32 -R 32 -m 3 -c52
|
-a -s -30 -n 100 -p 32 -R 32 -m 3 -c52
|
||||||
-a -s -30 -n 100 -p 32 -R 66 -m 3 -c52
|
-a -s -30 -n 100 -p 32 -R 66 -m 3 -c52
|
||||||
-a -s -30 -n 100 -R 66 -m 3 -c52 -H</main_exec_args>
|
-a -s -30 -n 100 -R 66 -m 3 -c52 -H
|
||||||
<tags>nr_prachsim.test1 nr_prachsim.test2 nr_prachsim.test3 nr_prachsim.test4 nr_prachsim.test5 nr_prachsim.test6 nr_prachsim.test7</tags>
|
-a -s -30 -n 100 -p 99 -R 25 -m 0</main_exec_args>
|
||||||
|
<tags>nr_prachsim.test1 nr_prachsim.test2 nr_prachsim.test3 nr_prachsim.test4 nr_prachsim.test5 nr_prachsim.test6 nr_prachsim.test7 nr_prachsim.test8</tags>
|
||||||
<search_expr_true>PRACH test OK</search_expr_true>
|
<search_expr_true>PRACH test OK</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>
|
||||||
<nruns>3</nruns>
|
<nruns>3</nruns>
|
||||||
|
|||||||
@@ -55,6 +55,7 @@ BUILD_COVERITY_SCAN=0
|
|||||||
DISABLE_HARDWARE_DEPENDENCY="False"
|
DISABLE_HARDWARE_DEPENDENCY="False"
|
||||||
CMAKE_BUILD_TYPE="RelWithDebInfo"
|
CMAKE_BUILD_TYPE="RelWithDebInfo"
|
||||||
CMAKE_CMD="$CMAKE"
|
CMAKE_CMD="$CMAKE"
|
||||||
|
NOAVX512="False"
|
||||||
BUILD_ECLIPSE=0
|
BUILD_ECLIPSE=0
|
||||||
NR="False"
|
NR="False"
|
||||||
OPTIONAL_LIBRARIES="telnetsrv enbscope uescope nrscope"
|
OPTIONAL_LIBRARIES="telnetsrv enbscope uescope nrscope"
|
||||||
@@ -164,12 +165,18 @@ Options:
|
|||||||
Build optional shared library, <libraries> can be one or several of $OPTIONAL_LIBRARIES or \"all\"
|
Build optional shared library, <libraries> can be one or several of $OPTIONAL_LIBRARIES or \"all\"
|
||||||
--usrp-recplay
|
--usrp-recplay
|
||||||
Build for I/Q record-playback modes
|
Build for I/Q record-playback modes
|
||||||
|
--noavx512
|
||||||
|
Build without AVX512 if it is present on CPU
|
||||||
-k | --skip-shared-libraries
|
-k | --skip-shared-libraries
|
||||||
Skip build for shared libraries to reduce compilation time when building frequently for debugging purposes
|
Skip build for shared libraries to reduce compilation time when building frequently for debugging purposes
|
||||||
--ninja
|
--ninja
|
||||||
Tell cmake to use the Ninja build system. Without, will generate make files
|
Tell cmake to use the Ninja build system. Without, will generate make files
|
||||||
|
--sanitize
|
||||||
|
Shortcut for usage of --sanitize-address --sanitize-undefined
|
||||||
--sanitize-address | -fsanitize=address
|
--sanitize-address | -fsanitize=address
|
||||||
Enable the address sanitizer on all targets
|
Enable the address sanitizer on all targets
|
||||||
|
--sanitize-undefined | -fsanitize=undefined
|
||||||
|
Enable the undefined behavior sanitizer on all targets
|
||||||
--ittiSIM
|
--ittiSIM
|
||||||
Makes the itti simulator
|
Makes the itti simulator
|
||||||
-h | --help
|
-h | --help
|
||||||
@@ -436,6 +443,10 @@ function main() {
|
|||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
shift 2;;
|
shift 2;;
|
||||||
|
--noavx512)
|
||||||
|
NOAVX512="True"
|
||||||
|
echo_info "Disabling AVX512"
|
||||||
|
shift 1;;
|
||||||
-k | --skip-shared-libraries)
|
-k | --skip-shared-libraries)
|
||||||
SKIP_SHARED_LIB_FLAG="True"
|
SKIP_SHARED_LIB_FLAG="True"
|
||||||
echo_info "Skipping build of shared libraries, rfsimulator and transport protocol libraries"
|
echo_info "Skipping build of shared libraries, rfsimulator and transport protocol libraries"
|
||||||
@@ -444,9 +455,16 @@ function main() {
|
|||||||
CMAKE_CMD="$CMAKE_CMD -GNinja"
|
CMAKE_CMD="$CMAKE_CMD -GNinja"
|
||||||
MAKE_CMD=ninja
|
MAKE_CMD=ninja
|
||||||
shift;;
|
shift;;
|
||||||
|
--sanitize)
|
||||||
|
CMAKE_CMD="$CMAKE_CMD -DSANITIZE_ADDRESS=True -DSANITIZE_UNDEFINED=True"
|
||||||
|
shift;;
|
||||||
--sanitize-address | -fsanitize=address)
|
--sanitize-address | -fsanitize=address)
|
||||||
|
grep -sq "Ubuntu 18.04" /etc/os-release && echo_error "Bug in OS with this option, see CMakeLists.txt"
|
||||||
CMAKE_CMD="$CMAKE_CMD -DSANITIZE_ADDRESS=True"
|
CMAKE_CMD="$CMAKE_CMD -DSANITIZE_ADDRESS=True"
|
||||||
shift;;
|
shift;;
|
||||||
|
--sanitize-undefined | -fundefined=address)
|
||||||
|
CMAKE_CMD="$CMAKE_CMD -DSANITIZE_UNDEFINED=True"
|
||||||
|
shift;;
|
||||||
--ittiSIM)
|
--ittiSIM)
|
||||||
ittiSIM=1
|
ittiSIM=1
|
||||||
CMAKE_CMD="$CMAKE_CMD -DITTI_SIM=True"
|
CMAKE_CMD="$CMAKE_CMD -DITTI_SIM=True"
|
||||||
@@ -624,6 +642,7 @@ function main() {
|
|||||||
cd $DIR/$BUILD_DIR/build
|
cd $DIR/$BUILD_DIR/build
|
||||||
if [[ ${#CMAKE_C_FLAGS[@]} > 0 ]]; then CMAKE_CMD="$CMAKE_CMD -DCMAKE_C_FLAGS=\"${CMAKE_C_FLAGS[*]}\""; fi
|
if [[ ${#CMAKE_C_FLAGS[@]} > 0 ]]; then CMAKE_CMD="$CMAKE_CMD -DCMAKE_C_FLAGS=\"${CMAKE_C_FLAGS[*]}\""; fi
|
||||||
if [[ ${#CMAKE_CXX_FLAGS[@]} > 0 ]]; then CMAKE_CMD="$CMAKE_CMD -DCMAKE_CXX_FLAGS=\"${CMAKE_CXX_FLAGS[*]}\""; fi
|
if [[ ${#CMAKE_CXX_FLAGS[@]} > 0 ]]; then CMAKE_CMD="$CMAKE_CMD -DCMAKE_CXX_FLAGS=\"${CMAKE_CXX_FLAGS[*]}\""; fi
|
||||||
|
CMAKE_CMD="$CMAKE_CMD -DNOAVX512=\"${NOAVX512[*]}\""
|
||||||
echo_info "running $CMAKE_CMD"
|
echo_info "running $CMAKE_CMD"
|
||||||
eval $CMAKE_CMD ../..
|
eval $CMAKE_CMD ../..
|
||||||
|
|
||||||
@@ -713,11 +732,11 @@ function main() {
|
|||||||
# simlist="ldpctest"
|
# simlist="ldpctest"
|
||||||
for f in $simlist ; do
|
for f in $simlist ; do
|
||||||
compilations \
|
compilations \
|
||||||
ran_build $f \
|
$BUILD_DIR $f \
|
||||||
$f $dbin/$f.$REL
|
$f $dbin/$f.$REL
|
||||||
done
|
done
|
||||||
compilations \
|
compilations \
|
||||||
ran_build coding \
|
$BUILD_DIR coding \
|
||||||
libcoding.so $dbin/libcoding.so
|
libcoding.so $dbin/libcoding.so
|
||||||
fi
|
fi
|
||||||
|
|
||||||
@@ -729,7 +748,7 @@ function main() {
|
|||||||
simlist="secu_knas_encrypt_eia1 secu_kenb aes128_ctr_encrypt aes128_ctr_decrypt secu_knas_encrypt_eea2 secu_knas secu_knas_encrypt_eea1 kdf aes128_cmac_encrypt secu_knas_encrypt_eia2"
|
simlist="secu_knas_encrypt_eia1 secu_kenb aes128_ctr_encrypt aes128_ctr_decrypt secu_knas_encrypt_eea2 secu_knas secu_knas_encrypt_eea1 kdf aes128_cmac_encrypt secu_knas_encrypt_eia2"
|
||||||
for f in $simlist ; do
|
for f in $simlist ; do
|
||||||
compilations \
|
compilations \
|
||||||
ran_build test_$f \
|
$BUILD_DIR test_$f \
|
||||||
test_$f $dbin/test_$f.$REL
|
test_$f $dbin/test_$f.$REL
|
||||||
done
|
done
|
||||||
fi
|
fi
|
||||||
|
|||||||
@@ -109,6 +109,7 @@ check_supported_distribution() {
|
|||||||
"ubuntu18.04") return 0 ;;
|
"ubuntu18.04") return 0 ;;
|
||||||
"ubuntu16.04") return 0 ;;
|
"ubuntu16.04") return 0 ;;
|
||||||
"fedora35") return 0 ;;
|
"fedora35") return 0 ;;
|
||||||
|
"fedora36") return 0 ;;
|
||||||
"rhel7") return 0 ;;
|
"rhel7") return 0 ;;
|
||||||
"rhel7.6") return 0 ;;
|
"rhel7.6") return 0 ;;
|
||||||
"rhel7.7") return 0 ;;
|
"rhel7.7") return 0 ;;
|
||||||
@@ -196,8 +197,8 @@ check_warnings() {
|
|||||||
#argument:
|
#argument:
|
||||||
# $1: log file
|
# $1: log file
|
||||||
check_errors() {
|
check_errors() {
|
||||||
#we look for 'warning:' in the compilation log file
|
#we look for 'error:' in the compilation log file
|
||||||
error_count=`grep "error:" "$1" | wc -l`
|
error_count=`grep -c "error:" "$1"`
|
||||||
if [ $error_count -gt 0 ]; then
|
if [ $error_count -gt 0 ]; then
|
||||||
echo_error "ERROR: $error_count error. See $1"
|
echo_error "ERROR: $error_count error. See $1"
|
||||||
fi
|
fi
|
||||||
@@ -381,7 +382,7 @@ check_install_usrp_uhd_driver(){
|
|||||||
$SUDO apt-get remove libuhd3.14.1 -y || true
|
$SUDO apt-get remove libuhd3.14.1 -y || true
|
||||||
$SUDO apt-get remove libuhd3.15.0 -y || true
|
$SUDO apt-get remove libuhd3.15.0 -y || true
|
||||||
local distribution=$(get_distribution_release)
|
local distribution=$(get_distribution_release)
|
||||||
if [[ "$distribution" == "ubuntu18.04" ]]; then
|
if [[ "$distribution" == "ubuntu18.04" || "$distribution" == "ubuntu20.04" || "$distribution" == "ubuntu22.04" ]]; then
|
||||||
$SUDO apt-get remove libuhd4.0.0 -y || true
|
$SUDO apt-get remove libuhd4.0.0 -y || true
|
||||||
$SUDO apt-get remove libuhd4.1.0 -y || true
|
$SUDO apt-get remove libuhd4.1.0 -y || true
|
||||||
fi
|
fi
|
||||||
@@ -410,13 +411,15 @@ check_install_usrp_uhd_driver(){
|
|||||||
x=$((x + 1))
|
x=$((x + 1))
|
||||||
done
|
done
|
||||||
$SUDO apt-get update
|
$SUDO apt-get update
|
||||||
$SUDO apt-get -y install python python-tk libboost-all-dev libusb-1.0-0-dev
|
$SUDO apt-get -y install python-tk libboost-all-dev libusb-1.0-0-dev
|
||||||
if [[ "$distribution" == "ubuntu16.04" ]]; then
|
case "$(get_distribution_release)" in
|
||||||
|
"ubuntu16.04")
|
||||||
$SUDO apt-get -y install libuhd-dev libuhd3.15.0 uhd-host
|
$SUDO apt-get -y install libuhd-dev libuhd3.15.0 uhd-host
|
||||||
fi
|
;;
|
||||||
if [[ "$distribution" == "ubuntu18.04" ]]; then
|
"ubuntu18.04" | "ubuntu20.04" | "ubuntu22.04")
|
||||||
$SUDO apt-get -y install libuhd-dev libuhd4.1.0 uhd-host
|
$SUDO apt-get -y install libuhd-dev libuhd4.2.0 uhd-host
|
||||||
fi
|
;;
|
||||||
|
esac
|
||||||
elif [[ "$OS_BASEDISTRO" == "fedora" ]]; then
|
elif [[ "$OS_BASEDISTRO" == "fedora" ]]; then
|
||||||
if [ $IS_CONTAINER -eq 0 ]
|
if [ $IS_CONTAINER -eq 0 ]
|
||||||
then
|
then
|
||||||
@@ -621,7 +624,6 @@ check_install_additional_tools (){
|
|||||||
android-tools-adb \
|
android-tools-adb \
|
||||||
wvdial \
|
wvdial \
|
||||||
sshpass \
|
sshpass \
|
||||||
nscd \
|
|
||||||
bc \
|
bc \
|
||||||
ntp"
|
ntp"
|
||||||
elif [[ "$OS_DISTRO" == "rhel" ]] || [[ "$OS_DISTRO" == "centos" ]]; then
|
elif [[ "$OS_DISTRO" == "rhel" ]] || [[ "$OS_DISTRO" == "centos" ]]; then
|
||||||
@@ -646,7 +648,6 @@ check_install_additional_tools (){
|
|||||||
wvdial \
|
wvdial \
|
||||||
numpy \
|
numpy \
|
||||||
sshpass \
|
sshpass \
|
||||||
nscd \
|
|
||||||
python2-paramiko \
|
python2-paramiko \
|
||||||
python-pyroute2 \
|
python-pyroute2 \
|
||||||
python-netifaces \
|
python-netifaces \
|
||||||
@@ -674,7 +675,6 @@ check_install_additional_tools (){
|
|||||||
wvdial \
|
wvdial \
|
||||||
python-numpy \
|
python-numpy \
|
||||||
sshpass \
|
sshpass \
|
||||||
nscd \
|
|
||||||
python-paramiko \
|
python-paramiko \
|
||||||
python-pyroute2 \
|
python-pyroute2 \
|
||||||
python-netifaces \
|
python-netifaces \
|
||||||
|
|||||||
@@ -191,65 +191,17 @@ int PRBalloc_to_locationandbandwidth(int NPRB,int RBstart) {
|
|||||||
return(PRBalloc_to_locationandbandwidth0(NPRB,RBstart,275));
|
return(PRBalloc_to_locationandbandwidth0(NPRB,RBstart,275));
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Target code rate tables indexed by Imcs
|
int cce_to_reg_interleaving(const int R, int k, int n_shift, const int C, int L, const int N_regs) {
|
||||||
/* TS 38.214 table 5.1.3.1-1 - MCS index table 1 for PDSCH */
|
|
||||||
uint16_t nr_target_code_rate_table1[29] = {120, 157, 193, 251, 308, 379, 449, 526, 602, 679, 340, 378, 434, 490, 553, \
|
|
||||||
616, 658, 438, 466, 517, 567, 616, 666, 719, 772, 822, 873, 910, 948};
|
|
||||||
|
|
||||||
/* TS 38.214 table 5.1.3.1-2 - MCS index table 2 for PDSCH */
|
int f; // interleaving function
|
||||||
// Imcs values 20 and 26 have been multiplied by 2 to avoid the floating point
|
if(R==0)
|
||||||
uint16_t nr_target_code_rate_table2[28] = {120, 193, 308, 449, 602, 378, 434, 490, 553, 616, 658, 466, 517, 567, \
|
f = k;
|
||||||
616, 666, 719, 772, 822, 873, 1365, 711, 754, 797, 841, 885, 1833, 948};
|
else {
|
||||||
|
int c = k/R;
|
||||||
/* TS 38.214 table 5.1.3.1-3 - MCS index table 3 for PDSCH */
|
int r = k%R;
|
||||||
uint16_t nr_target_code_rate_table3[29] = {30, 40, 50, 64, 78, 99, 120, 157, 193, 251, 308, 379, 449, 526, 602, 340, \
|
f = (r*C + c + n_shift)%(N_regs/L);
|
||||||
378, 434, 490, 553, 616, 438, 466, 517, 567, 616, 666, 719, 772};
|
|
||||||
|
|
||||||
uint16_t nr_tbs_table[93] = {24, 32, 40, 48, 56, 64, 72, 80, 88, 96, 104, 112, 120, 128, 136, 144, 152, 160, 168, 176, 184, 192, 208, 224, 240, 256, 272, 288, 304, 320, \
|
|
||||||
336, 352, 368, 384, 408, 432, 456, 480, 504, 528, 552, 576, 608, 640, 672, 704, 736, 768, 808, 848, 888, 928, 984, 1032, 1064, 1128, 1160, 1192, 1224, 1256, \
|
|
||||||
1288, 1320, 1352, 1416, 1480, 1544, 1608, 1672, 1736, 1800, 1864, 1928, 2024, 2088, 2152, 2216, 2280, 2408, 2472, 2536, 2600, 2664, 2728, 2792, 2856, 2976, \
|
|
||||||
3104, 3240, 3368, 3496, 3624, 3752, 3824};
|
|
||||||
|
|
||||||
uint8_t nr_get_Qm(uint8_t Imcs, uint8_t table_idx) {
|
|
||||||
switch(table_idx) {
|
|
||||||
case 1:
|
|
||||||
return (((Imcs<10)||(Imcs==29))?2:((Imcs<17)||(Imcs==30))?4:((Imcs<29)||(Imcs==31))?6:-1);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 2:
|
|
||||||
return (((Imcs<5)||(Imcs==28))?2:((Imcs<11)||(Imcs==29))?4:((Imcs<20)||(Imcs==30))?6:((Imcs<28)||(Imcs==31))?8:-1);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 3:
|
|
||||||
return (((Imcs<15)||(Imcs==29))?2:((Imcs<21)||(Imcs==30))?4:((Imcs<29)||(Imcs==31))?6:-1);
|
|
||||||
break;
|
|
||||||
|
|
||||||
default:
|
|
||||||
AssertFatal(0, "Invalid MCS table index %d (expected in range [1,3])\n", table_idx);
|
|
||||||
return(0);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
uint32_t nr_get_code_rate(uint8_t Imcs, uint8_t table_idx) {
|
|
||||||
switch(table_idx) {
|
|
||||||
case 1:
|
|
||||||
return (nr_target_code_rate_table1[Imcs]);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 2:
|
|
||||||
return (nr_target_code_rate_table2[Imcs]);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 3:
|
|
||||||
return (nr_target_code_rate_table3[Imcs]);
|
|
||||||
break;
|
|
||||||
|
|
||||||
default:
|
|
||||||
AssertFatal(0, "Invalid MCS table index %d (expected in range [1,3])\n", table_idx);
|
|
||||||
return(0);
|
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
|
return f;
|
||||||
}
|
}
|
||||||
|
|
||||||
void get_coreset_rballoc(uint8_t *FreqDomainResource,int *n_rb,int *rb_offset) {
|
void get_coreset_rballoc(uint8_t *FreqDomainResource,int *n_rb,int *rb_offset) {
|
||||||
@@ -503,7 +455,6 @@ int get_nr_table_idx(int nr_bandP, uint8_t scs_index) {
|
|||||||
return i;
|
return i;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
int get_subband_size(int NPRB,int size) {
|
int get_subband_size(int NPRB,int size) {
|
||||||
// implements table 5.2.1.4-2 from 36.214
|
// implements table 5.2.1.4-2 from 36.214
|
||||||
//
|
//
|
||||||
|
|||||||
@@ -57,7 +57,7 @@ static inline int get_num_dmrs(uint16_t dmrs_mask ) {
|
|||||||
return(num_dmrs);
|
return(num_dmrs);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int cce_to_reg_interleaving(const int R, int k, int n_shift, const int C, int L, const int N_regs);
|
||||||
int get_SLIV(uint8_t S, uint8_t L);
|
int get_SLIV(uint8_t S, uint8_t L);
|
||||||
void get_coreset_rballoc(uint8_t *FreqDomainResource,int *n_rb,int *rb_offset);
|
void get_coreset_rballoc(uint8_t *FreqDomainResource,int *n_rb,int *rb_offset);
|
||||||
uint16_t config_bandwidth(int mu, int nb_rb, int nr_band);
|
uint16_t config_bandwidth(int mu, int nb_rb, int nr_band);
|
||||||
@@ -69,12 +69,6 @@ int NRRIV2BW(int locationAndBandwidth,int N_RB);
|
|||||||
int NRRIV2PRBOFFSET(int locationAndBandwidth,int N_RB);
|
int NRRIV2PRBOFFSET(int locationAndBandwidth,int N_RB);
|
||||||
int PRBalloc_to_locationandbandwidth0(int NPRB,int RBstart,int BWPsize);
|
int PRBalloc_to_locationandbandwidth0(int NPRB,int RBstart,int BWPsize);
|
||||||
int PRBalloc_to_locationandbandwidth(int NPRB,int RBstart);
|
int PRBalloc_to_locationandbandwidth(int NPRB,int RBstart);
|
||||||
extern uint16_t nr_target_code_rate_table1[29];
|
|
||||||
extern uint16_t nr_target_code_rate_table2[28];
|
|
||||||
extern uint16_t nr_target_code_rate_table3[29];
|
|
||||||
extern uint16_t nr_tbs_table[93];
|
|
||||||
uint8_t nr_get_Qm(uint8_t Imcs, uint8_t table_idx);
|
|
||||||
uint32_t nr_get_code_rate(uint8_t Imcs, uint8_t table_idx);
|
|
||||||
int get_subband_size(int NPRB,int size);
|
int get_subband_size(int NPRB,int size);
|
||||||
void SLIV2SL(int SLIV,int *S,int *L);
|
void SLIV2SL(int SLIV,int *S,int *L);
|
||||||
int get_dmrs_port(int nl, uint16_t dmrs_ports);
|
int get_dmrs_port(int nl, uint16_t dmrs_ports);
|
||||||
|
|||||||
@@ -450,6 +450,7 @@ extern "C" {
|
|||||||
void itti_wait_tasks_end(void) {
|
void itti_wait_tasks_end(void) {
|
||||||
shutting_down = false;
|
shutting_down = false;
|
||||||
signal(SIGTERM, catch_sigterm);
|
signal(SIGTERM, catch_sigterm);
|
||||||
|
//signal(SIGINT, catch_sigterm);
|
||||||
while (! shutting_down)
|
while (! shutting_down)
|
||||||
{
|
{
|
||||||
sleep(24 * 3600);
|
sleep(24 * 3600);
|
||||||
|
|||||||
@@ -80,7 +80,7 @@ static inline notifiedFIFO_elt_t *newNotifiedFIFO_elt(int size,
|
|||||||
notifiedFIFO_t *reponseFifo,
|
notifiedFIFO_t *reponseFifo,
|
||||||
void (*processingFunc)(void *)) {
|
void (*processingFunc)(void *)) {
|
||||||
notifiedFIFO_elt_t *ret;
|
notifiedFIFO_elt_t *ret;
|
||||||
AssertFatal( NULL != (ret=(notifiedFIFO_elt_t *) malloc(sizeof(notifiedFIFO_elt_t)+size+32)), "");
|
AssertFatal( NULL != (ret=(notifiedFIFO_elt_t *) calloc(1, sizeof(notifiedFIFO_elt_t)+size+32)), "");
|
||||||
ret->next=NULL;
|
ret->next=NULL;
|
||||||
ret->key=key;
|
ret->key=key;
|
||||||
ret->reponseFifo=reponseFifo;
|
ret->reponseFifo=reponseFifo;
|
||||||
|
|||||||
@@ -111,13 +111,15 @@ void print_meas(time_stats_t *ts,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
int print_meas_log(time_stats_t *ts,
|
size_t print_meas_log(time_stats_t *ts,
|
||||||
const char *name,
|
const char *name,
|
||||||
time_stats_t *total_exec_time,
|
time_stats_t *total_exec_time,
|
||||||
time_stats_t *sf_exec_time,
|
time_stats_t *sf_exec_time,
|
||||||
char *output)
|
char *output,
|
||||||
|
size_t outputlen)
|
||||||
{
|
{
|
||||||
int stroff = 0;
|
const char *begin = output;
|
||||||
|
const char *end = output + outputlen;
|
||||||
static int first_time = 0;
|
static int first_time = 0;
|
||||||
static double cpu_freq_GHz = 0.0;
|
static double cpu_freq_GHz = 0.0;
|
||||||
|
|
||||||
@@ -128,30 +130,49 @@ int print_meas_log(time_stats_t *ts,
|
|||||||
first_time=1;
|
first_time=1;
|
||||||
|
|
||||||
if ((total_exec_time == NULL) || (sf_exec_time== NULL))
|
if ((total_exec_time == NULL) || (sf_exec_time== NULL))
|
||||||
stroff += sprintf(output, "%25s %25s %25s %25s %25s %6f\n","Name","Total","Per Trials", "Num Trials","CPU_F_GHz", cpu_freq_GHz);
|
output += snprintf(output,
|
||||||
|
end - output,
|
||||||
|
"%25s %25s %25s %25s %25s %6f\n",
|
||||||
|
"Name",
|
||||||
|
"Total",
|
||||||
|
"Per Trials",
|
||||||
|
"Num Trials",
|
||||||
|
"CPU_F_GHz",
|
||||||
|
cpu_freq_GHz);
|
||||||
else
|
else
|
||||||
stroff += sprintf(output+stroff, "%25s %25s %25s %20s %15s %6f\n","Name","Total","Average/Frame","Trials", "CPU_F_GHz", cpu_freq_GHz);
|
output += snprintf(output,
|
||||||
|
end - output,
|
||||||
|
"%25s %25s %25s %20s %15s %6f\n",
|
||||||
|
"Name",
|
||||||
|
"Total",
|
||||||
|
"Average/Frame",
|
||||||
|
"Trials",
|
||||||
|
"CPU_F_GHz",
|
||||||
|
cpu_freq_GHz);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ts->trials>0) {
|
if (ts->trials>0) {
|
||||||
//printf("%20s: total: %10.3f ms, average: %10.3f us (%10d trials)\n", name, ts->diff/cpu_freq_GHz/1000000.0, ts->diff/ts->trials/cpu_freq_GHz/1000.0, ts->trials);
|
|
||||||
if ((total_exec_time == NULL) || (sf_exec_time== NULL)) {
|
if ((total_exec_time == NULL) || (sf_exec_time== NULL)) {
|
||||||
stroff += sprintf(output+stroff, "%25s: %15.3f us; %15d; %15.3f us;\n",
|
output += snprintf(output,
|
||||||
name,
|
end - output,
|
||||||
(ts->diff/ts->trials/cpu_freq_GHz/1000.0),
|
"%25s: %15.3f us; %15d; %15.3f us;\n",
|
||||||
ts->trials,
|
name,
|
||||||
ts->max/cpu_freq_GHz/1000.0);
|
ts->diff / ts->trials / cpu_freq_GHz / 1000.0,
|
||||||
|
ts->trials,
|
||||||
|
ts->max / cpu_freq_GHz / 1000.0);
|
||||||
} else {
|
} else {
|
||||||
stroff += sprintf(output+stroff, "%25s: %15.3f ms (%5.2f%%); %15.3f us (%5.2f%%); %15d;\n",
|
output += snprintf(output,
|
||||||
name,
|
end - output,
|
||||||
(ts->diff/cpu_freq_GHz/1000000.0),
|
"%25s: %15.3f ms (%5.2f%%); %15.3f us (%5.2f%%); %15d;\n",
|
||||||
((ts->diff/cpu_freq_GHz/1000000.0)/(total_exec_time->diff/cpu_freq_GHz/1000000.0))*100, // percentage
|
name,
|
||||||
(ts->diff/ts->trials/cpu_freq_GHz/1000.0),
|
ts->diff / cpu_freq_GHz / 1000000.0,
|
||||||
((ts->diff/ts->trials/cpu_freq_GHz/1000.0)/(sf_exec_time->diff/sf_exec_time->trials/cpu_freq_GHz/1000.0))*100, // percentage
|
((ts->diff / cpu_freq_GHz / 1000000.0) / (total_exec_time->diff / cpu_freq_GHz / 1000000.0))*100, // percentage
|
||||||
ts->trials);
|
ts->diff / ts->trials / cpu_freq_GHz / 1000.0,
|
||||||
|
((ts->diff / ts->trials / cpu_freq_GHz / 1000.0) / (sf_exec_time->diff / sf_exec_time->trials / cpu_freq_GHz / 1000.0)) * 100, // percentage
|
||||||
|
ts->trials);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return stroff;
|
return output - begin;
|
||||||
}
|
}
|
||||||
|
|
||||||
double get_time_meas_us(time_stats_t *ts)
|
double get_time_meas_us(time_stats_t *ts)
|
||||||
|
|||||||
@@ -62,7 +62,7 @@ typedef struct time_stats {
|
|||||||
oai_cputime_t in; /*!< \brief time at measure starting point */
|
oai_cputime_t in; /*!< \brief time at measure starting point */
|
||||||
oai_cputime_t diff; /*!< \brief average difference between time at starting point and time at endpoint*/
|
oai_cputime_t diff; /*!< \brief average difference between time at starting point and time at endpoint*/
|
||||||
oai_cputime_t p_time; /*!< \brief absolute process duration */
|
oai_cputime_t p_time; /*!< \brief absolute process duration */
|
||||||
oai_cputime_t diff_square; /*!< \brief process duration square */
|
double diff_square; /*!< \brief process duration square */
|
||||||
oai_cputime_t max; /*!< \brief maximum difference between time at starting point and time at endpoint*/
|
oai_cputime_t max; /*!< \brief maximum difference between time at starting point and time at endpoint*/
|
||||||
int trials; /*!< \brief number of start point - end point iterations */
|
int trials; /*!< \brief number of start point - end point iterations */
|
||||||
int meas_flag; /*!< \brief 1: stop_meas not called (consecutive calls of start_meas) */
|
int meas_flag; /*!< \brief 1: stop_meas not called (consecutive calls of start_meas) */
|
||||||
@@ -83,7 +83,12 @@ static inline void stop_meas(time_stats_t *ts) __attribute__((always_inline));
|
|||||||
|
|
||||||
void print_meas_now(time_stats_t *ts, const char *name, FILE *file_name);
|
void print_meas_now(time_stats_t *ts, const char *name, FILE *file_name);
|
||||||
void print_meas(time_stats_t *ts, const char *name, time_stats_t *total_exec_time, time_stats_t *sf_exec_time);
|
void print_meas(time_stats_t *ts, const char *name, time_stats_t *total_exec_time, time_stats_t *sf_exec_time);
|
||||||
int print_meas_log(time_stats_t *ts, const char *name, time_stats_t *total_exec_time, time_stats_t *sf_exec_time, char *output);
|
size_t print_meas_log(time_stats_t *ts,
|
||||||
|
const char *name,
|
||||||
|
time_stats_t *total_exec_time,
|
||||||
|
time_stats_t *sf_exec_time,
|
||||||
|
char *output,
|
||||||
|
size_t outputlen);
|
||||||
double get_time_meas_us(time_stats_t *ts);
|
double get_time_meas_us(time_stats_t *ts);
|
||||||
double get_cpu_freq_GHz(void);
|
double get_cpu_freq_GHz(void);
|
||||||
|
|
||||||
@@ -151,7 +156,7 @@ static inline void stop_meas(time_stats_t *ts) {
|
|||||||
ts->diff += (out-ts->in);
|
ts->diff += (out-ts->in);
|
||||||
/// process duration is the difference between two clock points
|
/// process duration is the difference between two clock points
|
||||||
ts->p_time = (out-ts->in);
|
ts->p_time = (out-ts->in);
|
||||||
ts->diff_square += (out-ts->in)*(out-ts->in);
|
ts->diff_square += ((double)out-ts->in)*((double)out-ts->in);
|
||||||
|
|
||||||
if ((out-ts->in) > ts->max)
|
if ((out-ts->in) > ts->max)
|
||||||
ts->max = out-ts->in;
|
ts->max = out-ts->in;
|
||||||
|
|||||||
@@ -193,6 +193,7 @@ Using the help option of the build script you can get the list of available opti
|
|||||||
| --UE | maintained and tested in CI | build `lte-uesoftmodem` the LTE UE |
|
| --UE | maintained and tested in CI | build `lte-uesoftmodem` the LTE UE |
|
||||||
| --gNB | maintained and tested in CI | build `nr-softmodem` the 5G gNodeB |
|
| --gNB | maintained and tested in CI | build `nr-softmodem` the 5G gNodeB |
|
||||||
| --nrUE | maintained and tested in CI | build `nr-uesoftmodem` the 5G UE |
|
| --nrUE | maintained and tested in CI | build `nr-uesoftmodem` the 5G UE |
|
||||||
|
| --arch-native | maintained | build with native architecture optimization |
|
||||||
| --usrp-recplay | deprecated | use the USRP configuration parameters to use the record player. |
|
| --usrp-recplay | deprecated | use the USRP configuration parameters to use the record player. |
|
||||||
| --build-lib | maintained | build optional shared library(ies), which can then be loaded at run time via command line option. Use the --help option to get the list of supported optional libraries. `all` can be used to build all available optional libraries. |
|
| --build-lib | maintained | build optional shared library(ies), which can then be loaded at run time via command line option. Use the --help option to get the list of supported optional libraries. `all` can be used to build all available optional libraries. |
|
||||||
| --UE-conf-nvram | maintained | Specifies the path to the input file used by the conf2uedata utility. defaults to [openair3/NAS/TOOLS/ue_eurecom_test_sfr.conf](../openair3/NAS/TOOLS/ue_eurecom_test_sfr.conf) |
|
| --UE-conf-nvram | maintained | Specifies the path to the input file used by the conf2uedata utility. defaults to [openair3/NAS/TOOLS/ue_eurecom_test_sfr.conf](../openair3/NAS/TOOLS/ue_eurecom_test_sfr.conf) |
|
||||||
|
|||||||
@@ -332,6 +332,9 @@ The following features are valid for the gNB and the 5G-NR UE.
|
|||||||
- evalution of RSRP report
|
- evalution of RSRP report
|
||||||
- evaluation of CQI report
|
- evaluation of CQI report
|
||||||
- MAC scheduling of SR reception
|
- MAC scheduling of SR reception
|
||||||
|
- Bandwidth part (BWP) operation
|
||||||
|
- Handle multiple dedicated BWPs
|
||||||
|
- BWP switching through RRCReconfiguration method
|
||||||
|
|
||||||
**gNB RLC**
|
**gNB RLC**
|
||||||
- Send/Receive operations according to 38.322 Rel.16
|
- Send/Receive operations according to 38.322 Rel.16
|
||||||
@@ -437,6 +440,10 @@ The following features are valid for the gNB and the 5G-NR UE.
|
|||||||
- PTRS support
|
- PTRS support
|
||||||
- Support for 1, 2 and 4 RX antennas
|
- Support for 1, 2 and 4 RX antennas
|
||||||
- Support for up to 2 layers (currently limited to DMRS configuration type 2)
|
- Support for up to 2 layers (currently limited to DMRS configuration type 2)
|
||||||
|
* Measurements based on NR-CSIRS
|
||||||
|
- RI, PMI and CQI computation
|
||||||
|
- Support for 1 and 2 RX antennas
|
||||||
|
- Support for up to 2 layers
|
||||||
* NR-PUSCH (including Segmentation, LDPC encoding, rate matching, scrambling, modulation, RB mapping, etc).
|
* NR-PUSCH (including Segmentation, LDPC encoding, rate matching, scrambling, modulation, RB mapping, etc).
|
||||||
- PUSCH mapping type A and B
|
- PUSCH mapping type A and B
|
||||||
- DMRS configuration type 1 and 2
|
- DMRS configuration type 1 and 2
|
||||||
@@ -485,14 +492,19 @@ The following features are valid for the gNB and the 5G-NR UE.
|
|||||||
* UCI processing
|
* UCI processing
|
||||||
- ACK/NACK processing
|
- ACK/NACK processing
|
||||||
- Triggering periodic SR
|
- Triggering periodic SR
|
||||||
- CSI measurement reporting (SSB RSRP only)
|
- CSI measurement reporting
|
||||||
* DLSH scheduler
|
* DLSCH scheduler
|
||||||
- Configuration of fapi PDU according to DCI
|
- Configuration of fapi PDU according to DCI
|
||||||
- HARQ procedures
|
- HARQ procedures
|
||||||
* ULSCH scheduler
|
* ULSCH scheduler
|
||||||
- Configuration of fapi PDU according to DCI
|
- Configuration of fapi PDU according to DCI
|
||||||
|
* NR-CSIRS scheduler
|
||||||
|
- Scheduling of NR-CSIRS reception
|
||||||
|
- Fill UCI for CSI measurement reporting
|
||||||
* Scheduler procedures for SRS transmission
|
* Scheduler procedures for SRS transmission
|
||||||
- Periodic SRS transmission
|
- Periodic SRS transmission
|
||||||
|
* Bandwidth part (BWP) operation
|
||||||
|
- Operation in configured dedicated BWP through RRCSetup or RRCReconfiguration
|
||||||
|
|
||||||
|
|
||||||
**UE RLC**
|
**UE RLC**
|
||||||
|
|||||||
@@ -0,0 +1,227 @@
|
|||||||
|
<table style="border-collapse: collapse; border: none;">
|
||||||
|
<tr style="border-collapse: collapse; border: none;">
|
||||||
|
<td style="border-collapse: collapse; border: none;">
|
||||||
|
<a href="http://www.openairinterface.org/">
|
||||||
|
<img src="./images/oai_final_logo.png" alt="" border=3 height=50 width=150>
|
||||||
|
</img>
|
||||||
|
</a>
|
||||||
|
</td>
|
||||||
|
<td style="border-collapse: collapse; border: none; vertical-align: center;">
|
||||||
|
<b><font size = "5">OAI 5G SA tutorial</font></b>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
</table>
|
||||||
|
|
||||||
|
**TABLE OF CONTENTS**
|
||||||
|
|
||||||
|
1. [Scenario](#1-scenario)
|
||||||
|
2. [OAI CN5G](#2-oai-cn5g)
|
||||||
|
1. [OAI CN5G pre-requisites](#21-oai-cn5g-pre-requisites)
|
||||||
|
2. [OAI CN5G Setup](#22-oai-cn5g-setup)
|
||||||
|
3. [OAI CN5G Configuration files](#23-oai-cn5g-configuration-files)
|
||||||
|
4. [SIM Card](#24-sim-card)
|
||||||
|
3. [OAI gNB](#3-oai-gnb)
|
||||||
|
1. [OAI gNB pre-requisites](#31-oai-gnb-pre-requisites)
|
||||||
|
2. [Build OAI gNB](#32-build-oai-gnb)
|
||||||
|
4. [Run OAI CN5G and OAI gNB with USRP B210](#4-run-oai-cn5g-and-oai-gnb-with-usrp-b210)
|
||||||
|
1. [Run OAI CN5G](#41-run-oai-cn5g)
|
||||||
|
2. [Run OAI gNB](#42-run-oai-gnb)
|
||||||
|
5. [Testing with QUECTEL RM500Q](#5-testing-with-quectel-rm500q)
|
||||||
|
1. [Setup QUECTEL](#51-setup-quectel)
|
||||||
|
2. [Ping test](#52-ping-test)
|
||||||
|
3. [Downlink iPerf test](#53-downlink-iperf-test)
|
||||||
|
|
||||||
|
|
||||||
|
# 1. Scenario
|
||||||
|
In this tutorial we describe how to configure and run a 5G end-to-end setup with OAI CN5G, OAI gNB and COTS UE.
|
||||||
|
|
||||||
|
Minimum hardware requirements:
|
||||||
|
- Laptop/Desktop/Server for OAI CN5G and OAI gNB
|
||||||
|
- Operating System: [Ubuntu 20.04.4 LTS](https://releases.ubuntu.com/20.04.4/ubuntu-20.04.4-desktop-amd64.iso)
|
||||||
|
- CPU: 8 cores x86_64 @ 3.5 GHz
|
||||||
|
- RAM: 32 GB
|
||||||
|
- Laptop for UE
|
||||||
|
- Operating System: Microsoft Windows 10 x64
|
||||||
|
- CPU: 4 cores x86_64
|
||||||
|
- RAM: 8 GB
|
||||||
|
- Windows driver for Quectel MUST be equal or higher than version **2.2.4**
|
||||||
|
- [USRP B210](https://www.ettus.com/all-products/ub210-kit/)
|
||||||
|
- Quectel RM500Q
|
||||||
|
- Module, M.2 to USB adapter, antennas and SIM card
|
||||||
|
- Firmware version of Quectel MUST be equal or higher than **RM500QGLABR11A06M4G**
|
||||||
|
|
||||||
|
|
||||||
|
# 2. OAI CN5G
|
||||||
|
|
||||||
|
## 2.1 OAI CN5G pre-requisites
|
||||||
|
|
||||||
|
```bash
|
||||||
|
sudo apt install -y git net-tools putty
|
||||||
|
|
||||||
|
sudo apt install -y apt-transport-https ca-certificates curl software-properties-common
|
||||||
|
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
|
||||||
|
sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
|
||||||
|
sudo apt update
|
||||||
|
sudo apt install -y docker docker-ce
|
||||||
|
|
||||||
|
# Add your username to the docker group, otherwise you will have to run in sudo mode.
|
||||||
|
sudo usermod -a -G docker $(whoami)
|
||||||
|
reboot
|
||||||
|
|
||||||
|
# https://docs.docker.com/compose/install/
|
||||||
|
sudo curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
|
||||||
|
sudo chmod +x /usr/local/bin/docker-compose
|
||||||
|
```
|
||||||
|
|
||||||
|
## 2.2 OAI CN5G Setup
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Git oai-cn5g-fed repository
|
||||||
|
git clone https://gitlab.eurecom.fr/oai/cn5g/oai-cn5g-fed.git ~/oai-cn5g-fed
|
||||||
|
|
||||||
|
# Pull docker images
|
||||||
|
docker pull oaisoftwarealliance/oai-amf:develop
|
||||||
|
docker pull oaisoftwarealliance/oai-nrf:develop
|
||||||
|
docker pull oaisoftwarealliance/oai-smf:develop
|
||||||
|
docker pull oaisoftwarealliance/oai-udr:develop
|
||||||
|
docker pull oaisoftwarealliance/oai-udm:develop
|
||||||
|
docker pull oaisoftwarealliance/oai-ausf:develop
|
||||||
|
docker pull oaisoftwarealliance/oai-spgwu-tiny:develop
|
||||||
|
docker pull oaisoftwarealliance/trf-gen-cn5g:latest
|
||||||
|
|
||||||
|
# Tag docker images
|
||||||
|
docker image tag oaisoftwarealliance/oai-amf:develop oai-amf:develop
|
||||||
|
docker image tag oaisoftwarealliance/oai-nrf:develop oai-nrf:develop
|
||||||
|
docker image tag oaisoftwarealliance/oai-smf:develop oai-smf:develop
|
||||||
|
docker image tag oaisoftwarealliance/oai-udr:develop oai-udr:develop
|
||||||
|
docker image tag oaisoftwarealliance/oai-udm:develop oai-udm:develop
|
||||||
|
docker image tag oaisoftwarealliance/oai-ausf:develop oai-ausf:develop
|
||||||
|
docker image tag oaisoftwarealliance/oai-spgwu-tiny:develop oai-spgwu-tiny:develop
|
||||||
|
docker image tag oaisoftwarealliance/trf-gen-cn5g:latest trf-gen-cn5g:latest
|
||||||
|
```
|
||||||
|
|
||||||
|
## 2.3 OAI CN5G Configuration files
|
||||||
|
Download and copy configuration files:
|
||||||
|
- Copy [docker-compose-basic-nrf.yaml](tutorial_resources/docker-compose-basic-nrf.yaml) to `~/oai-cn5g-fed/docker-compose`
|
||||||
|
- Copy [oai_db.sql](tutorial_resources/oai_db.sql) to `~/oai-cn5g-fed/docker-compose/database`
|
||||||
|
|
||||||
|
Change permissions on oai_db.sql to prevent mysql permission denied error:
|
||||||
|
```bash
|
||||||
|
chmod 644 ~/oai-cn5g-fed/docker-compose/database/oai_db.sql
|
||||||
|
```
|
||||||
|
|
||||||
|
## 2.4 SIM Card
|
||||||
|
Program SIM Card with [Open Cells Project](https://open-cells.com/) application [uicc-v2.6](https://open-cells.com/d5138782a8739209ec5760865b1e53b0/uicc-v2.6.tgz).
|
||||||
|
|
||||||
|
```bash
|
||||||
|
sudo ./program_uicc --adm 12345678 --imsi 208990000000001 --isdn 00000001 --acc 0001 --key fec86ba6eb707ed08905757b1bb44b8f --opc C42449363BBAD02B66D16BC975D77CC1 -spn "OpenAirInterface" --authenticate
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
# 3. OAI gNB
|
||||||
|
|
||||||
|
## 3.1 OAI gNB pre-requisites
|
||||||
|
|
||||||
|
### Build UHD from source
|
||||||
|
```bash
|
||||||
|
sudo apt install -y libboost-all-dev libusb-1.0-0-dev doxygen python3-docutils python3-mako python3-numpy python3-requests python3-ruamel.yaml python3-setuptools cmake build-essential
|
||||||
|
|
||||||
|
git clone https://github.com/EttusResearch/uhd.git ~/uhd
|
||||||
|
cd ~/uhd
|
||||||
|
git checkout v4.0.0.0
|
||||||
|
cd host
|
||||||
|
mkdir build
|
||||||
|
cd build
|
||||||
|
cmake ../
|
||||||
|
make -j 4
|
||||||
|
make test # This step is optional
|
||||||
|
sudo make install
|
||||||
|
sudo ldconfig
|
||||||
|
sudo uhd_images_downloader
|
||||||
|
```
|
||||||
|
|
||||||
|
## 3.2 Build OAI gNB
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Get openairinterface5g source code
|
||||||
|
git clone https://gitlab.eurecom.fr/oai/openairinterface5g.git ~/openairinterface5g
|
||||||
|
cd ~/openairinterface5g
|
||||||
|
git checkout develop
|
||||||
|
|
||||||
|
# Install dependencies in Ubuntu 20.04
|
||||||
|
cd ~/openairinterface5g
|
||||||
|
source oaienv
|
||||||
|
cd cmake_targets
|
||||||
|
./build_oai -I
|
||||||
|
|
||||||
|
# Build OAI gNB
|
||||||
|
cd ~/openairinterface5g
|
||||||
|
source oaienv
|
||||||
|
cd cmake_targets
|
||||||
|
./build_oai -w USRP --nrUE --gNB --build-lib all -c
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
# 4. Run OAI CN5G and OAI gNB with USRP B210
|
||||||
|
|
||||||
|
## 4.1 Run OAI CN5G
|
||||||
|
|
||||||
|
```bash
|
||||||
|
cd ~/oai-cn5g-fed/docker-compose
|
||||||
|
python3 core-network.py --type start-basic --scenario 1
|
||||||
|
```
|
||||||
|
|
||||||
|
## 4.2 Run OAI gNB
|
||||||
|
|
||||||
|
```bash
|
||||||
|
cd ~/openairinterface5g
|
||||||
|
source oaienv
|
||||||
|
cd cmake_targets/ran_build/build
|
||||||
|
sudo ./nr-softmodem -O ../../../targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.106PRB.usrpb210.conf --sa -E --continuous-tx
|
||||||
|
```
|
||||||
|
|
||||||
|
Make sure that during USRP initialization, it shows that USB 3 is used.
|
||||||
|
|
||||||
|
# 5. Testing with Quectel RM500Q
|
||||||
|
|
||||||
|
## 5.1 Setup Quectel
|
||||||
|
With [PuTTY](https://the.earth.li/~sgtatham/putty/latest/w64/putty.exe), send the following AT commands to the module using a serial interface (ex: COM2) at 115200 bps:
|
||||||
|
```bash
|
||||||
|
# MUST be sent at least once everytime there is a firmware upgrade!
|
||||||
|
AT+QMBNCFG="Select","ROW_Commercial"
|
||||||
|
AT+QMBNCFG="AutoSel",0
|
||||||
|
AT+CFUN=1,1
|
||||||
|
AT+CGDCONT=1
|
||||||
|
AT+CGDCONT=2
|
||||||
|
AT+CGDCONT=3
|
||||||
|
AT+CGDCONT=1,"IP","oai"
|
||||||
|
|
||||||
|
# (Optional, debug only, AT commands) Activate PDP context, retrieve IP address and test with ping
|
||||||
|
AT+CGACT=1,1
|
||||||
|
AT+CGPADDR=1
|
||||||
|
AT+QPING=1,"openairinterface.org"
|
||||||
|
```
|
||||||
|
|
||||||
|
## 5.2 Ping test
|
||||||
|
- UE host
|
||||||
|
```bash
|
||||||
|
ping 192.168.70.135 -n 1000 -S 12.1.1.2
|
||||||
|
```
|
||||||
|
- CN5G host
|
||||||
|
```bash
|
||||||
|
docker exec -it oai-ext-dn ping 12.1.1.2
|
||||||
|
```
|
||||||
|
|
||||||
|
## 5.3 Downlink iPerf test
|
||||||
|
- UE host
|
||||||
|
- Download iPerf for Microsoft Windows from [here](https://iperf.fr/download/windows/iperf-2.0.9-win64.zip).
|
||||||
|
- Extract to Desktop and run with Command Prompt:
|
||||||
|
```bash
|
||||||
|
cd C:\Users\User\Desktop\iPerf\iperf-2.0.9-win64\iperf-2.0.9-win64
|
||||||
|
iperf -s -u -i 1 -B 12.1.1.2
|
||||||
|
```
|
||||||
|
|
||||||
|
- CN5G host
|
||||||
|
```bash
|
||||||
|
docker exec -it oai-ext-dn iperf -u -t 86400 -i 1 -fk -B 192.168.70.135 -b 125M -c 12.1.1.2
|
||||||
|
```
|
||||||
@@ -0,0 +1,244 @@
|
|||||||
|
<table style="border-collapse: collapse; border: none;">
|
||||||
|
<tr style="border-collapse: collapse; border: none;">
|
||||||
|
<td style="border-collapse: collapse; border: none;">
|
||||||
|
<a href="http://www.openairinterface.org/">
|
||||||
|
<img src="./images/oai_final_logo.png" alt="" border=3 height=50 width=150>
|
||||||
|
</img>
|
||||||
|
</a>
|
||||||
|
</td>
|
||||||
|
<td style="border-collapse: collapse; border: none; vertical-align: center;">
|
||||||
|
<b><font size = "5">OAI 5G SA tutorial</font></b>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
</table>
|
||||||
|
|
||||||
|
**TABLE OF CONTENTS**
|
||||||
|
|
||||||
|
1. [Scenario](#1-scenario)
|
||||||
|
2. [OAI CN5G](#2-oai-cn5g)
|
||||||
|
1. [OAI CN5G pre-requisites](#21-oai-cn5g-pre-requisites)
|
||||||
|
2. [OAI CN5G Setup](#22-oai-cn5g-setup)
|
||||||
|
3. [OAI CN5G Configuration files](#23-oai-cn5g-configuration-files)
|
||||||
|
4. [SIM Card](#24-sim-card)
|
||||||
|
3. [OAI gNB](#3-oai-gnb)
|
||||||
|
1. [OAI gNB pre-requisites](#31-oai-gnb-pre-requisites)
|
||||||
|
2. [Build OAI gNB](#32-build-oai-gnb)
|
||||||
|
3. [N300 Ethernet Tuning](#33-n300-ethernet-tuning)
|
||||||
|
4. [Run OAI CN5G and OAI gNB with USRP N300](#4-run-oai-cn5g-and-oai-gnb-with-usrp-n300)
|
||||||
|
1. [Run OAI CN5G](#41-run-oai-cn5g)
|
||||||
|
2. [Run OAI gNB](#42-run-oai-gnb)
|
||||||
|
5. [Testing with QUECTEL RM500Q](#5-testing-with-quectel-rm500q)
|
||||||
|
1. [Setup QUECTEL](#51-setup-quectel)
|
||||||
|
2. [Ping test](#52-ping-test)
|
||||||
|
3. [Downlink iPerf test](#53-downlink-iperf-test)
|
||||||
|
|
||||||
|
|
||||||
|
# 1. Scenario
|
||||||
|
In this tutorial we describe how to configure and run a 5G end-to-end setup with OAI CN5G, OAI gNB and COTS UE.
|
||||||
|
|
||||||
|
Minimum hardware requirements:
|
||||||
|
- Laptop/Desktop/Server for OAI CN5G and OAI gNB
|
||||||
|
- Operating System: [Ubuntu 20.04.4 LTS](https://releases.ubuntu.com/20.04.4/ubuntu-20.04.4-desktop-amd64.iso)
|
||||||
|
- CPU: 8 cores x86_64 @ 3.5 GHz
|
||||||
|
- RAM: 32 GB
|
||||||
|
- Laptop for UE
|
||||||
|
- Operating System: Microsoft Windows 10 x64
|
||||||
|
- CPU: 4 cores x86_64
|
||||||
|
- RAM: 8 GB
|
||||||
|
- Windows driver for Quectel MUST be equal or higher than version **2.2.4**
|
||||||
|
- [USRP N300](https://www.ettus.com/all-products/USRP-N300/): Please identify the network interface(s) on which the N300 is connected.
|
||||||
|
- Quectel RM500Q
|
||||||
|
- Module, M.2 to USB adapter, antennas and SIM card
|
||||||
|
- Firmware version of Quectel MUST be equal or higher than **RM500QGLABR11A06M4G**
|
||||||
|
|
||||||
|
|
||||||
|
# 2. OAI CN5G
|
||||||
|
|
||||||
|
## 2.1 OAI CN5G pre-requisites
|
||||||
|
|
||||||
|
```bash
|
||||||
|
sudo apt install -y git net-tools putty
|
||||||
|
|
||||||
|
sudo apt install -y apt-transport-https ca-certificates curl software-properties-common
|
||||||
|
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
|
||||||
|
sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
|
||||||
|
sudo apt update
|
||||||
|
sudo apt install -y docker docker-ce
|
||||||
|
|
||||||
|
# Add your username to the docker group, otherwise you will have to run in sudo mode.
|
||||||
|
sudo usermod -a -G docker $(whoami)
|
||||||
|
reboot
|
||||||
|
|
||||||
|
# https://docs.docker.com/compose/install/
|
||||||
|
sudo curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
|
||||||
|
sudo chmod +x /usr/local/bin/docker-compose
|
||||||
|
```
|
||||||
|
|
||||||
|
## 2.2 OAI CN5G Setup
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Git oai-cn5g-fed repository
|
||||||
|
git clone https://gitlab.eurecom.fr/oai/cn5g/oai-cn5g-fed.git ~/oai-cn5g-fed
|
||||||
|
|
||||||
|
# Pull docker images
|
||||||
|
docker pull oaisoftwarealliance/oai-amf:develop
|
||||||
|
docker pull oaisoftwarealliance/oai-nrf:develop
|
||||||
|
docker pull oaisoftwarealliance/oai-smf:develop
|
||||||
|
docker pull oaisoftwarealliance/oai-udr:develop
|
||||||
|
docker pull oaisoftwarealliance/oai-udm:develop
|
||||||
|
docker pull oaisoftwarealliance/oai-ausf:develop
|
||||||
|
docker pull oaisoftwarealliance/oai-spgwu-tiny:develop
|
||||||
|
docker pull oaisoftwarealliance/trf-gen-cn5g:latest
|
||||||
|
|
||||||
|
# Tag docker images
|
||||||
|
docker image tag oaisoftwarealliance/oai-amf:develop oai-amf:develop
|
||||||
|
docker image tag oaisoftwarealliance/oai-nrf:develop oai-nrf:develop
|
||||||
|
docker image tag oaisoftwarealliance/oai-smf:develop oai-smf:develop
|
||||||
|
docker image tag oaisoftwarealliance/oai-udr:develop oai-udr:develop
|
||||||
|
docker image tag oaisoftwarealliance/oai-udm:develop oai-udm:develop
|
||||||
|
docker image tag oaisoftwarealliance/oai-ausf:develop oai-ausf:develop
|
||||||
|
docker image tag oaisoftwarealliance/oai-spgwu-tiny:develop oai-spgwu-tiny:develop
|
||||||
|
docker image tag oaisoftwarealliance/trf-gen-cn5g:latest trf-gen-cn5g:latest
|
||||||
|
```
|
||||||
|
|
||||||
|
## 2.3 OAI CN5G Configuration files
|
||||||
|
Download and copy configuration files:
|
||||||
|
- Copy [docker-compose-basic-nrf.yaml](tutorial_resources/docker-compose-basic-nrf.yaml) to `~/oai-cn5g-fed/docker-compose`
|
||||||
|
- Copy [oai_db.sql](tutorial_resources/oai_db.sql) to `~/oai-cn5g-fed/docker-compose/database`
|
||||||
|
|
||||||
|
Change permissions on oai_db.sql to prevent mysql permission denied error:
|
||||||
|
```bash
|
||||||
|
chmod 644 ~/oai-cn5g-fed/docker-compose/database/oai_db.sql
|
||||||
|
```
|
||||||
|
|
||||||
|
## 2.4 SIM Card
|
||||||
|
Program SIM Card with [Open Cells Project](https://open-cells.com/) application [uicc-v2.6](https://open-cells.com/d5138782a8739209ec5760865b1e53b0/uicc-v2.6.tgz).
|
||||||
|
|
||||||
|
```bash
|
||||||
|
sudo ./program_uicc --adm 12345678 --imsi 208990000000001 --isdn 00000001 --acc 0001 --key fec86ba6eb707ed08905757b1bb44b8f --opc C42449363BBAD02B66D16BC975D77CC1 -spn "OpenAirInterface" --authenticate
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
# 3. OAI gNB
|
||||||
|
|
||||||
|
## 3.1 OAI gNB pre-requisites
|
||||||
|
|
||||||
|
### Build UHD from source
|
||||||
|
```bash
|
||||||
|
sudo apt install -y libboost-all-dev libusb-1.0-0-dev doxygen python3-docutils python3-mako python3-numpy python3-requests python3-ruamel.yaml python3-setuptools cmake build-essential
|
||||||
|
|
||||||
|
git clone https://github.com/EttusResearch/uhd.git ~/uhd
|
||||||
|
cd ~/uhd
|
||||||
|
git checkout v4.0.0.0
|
||||||
|
cd host
|
||||||
|
mkdir build
|
||||||
|
cd build
|
||||||
|
cmake ../
|
||||||
|
make -j 4
|
||||||
|
make test # This step is optional
|
||||||
|
sudo make install
|
||||||
|
sudo ldconfig
|
||||||
|
sudo uhd_images_downloader
|
||||||
|
```
|
||||||
|
|
||||||
|
## 3.2 Build OAI gNB
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Get openairinterface5g source code
|
||||||
|
git clone https://gitlab.eurecom.fr/oai/openairinterface5g.git ~/openairinterface5g
|
||||||
|
cd ~/openairinterface5g
|
||||||
|
git checkout develop
|
||||||
|
|
||||||
|
# Install dependencies in Ubuntu 20.04
|
||||||
|
cd ~/openairinterface5g
|
||||||
|
source oaienv
|
||||||
|
cd cmake_targets
|
||||||
|
./build_oai -I
|
||||||
|
|
||||||
|
# Build OAI gNB
|
||||||
|
cd ~/openairinterface5g
|
||||||
|
source oaienv
|
||||||
|
cd cmake_targets
|
||||||
|
./build_oai -w USRP --nrUE --gNB --build-lib all -c
|
||||||
|
```
|
||||||
|
|
||||||
|
## 3.3 N300 Ethernet Tuning
|
||||||
|
|
||||||
|
Please also refer to the official [USRP Host Performance Tuning Tips and Tricks](https://kb.ettus.com/USRP_Host_Performance_Tuning_Tips_and_Tricks) tuning guide.
|
||||||
|
|
||||||
|
The following steps are recommended. Please change the network interface(s) as required. Also, you should have 10Gbps interface(s): if you use two cables, you should have the XG interface. Refer to the [N300 Getting Started Guide](https://kb.ettus.com/USRP_N300/N310/N320/N321_Getting_Started_Guide) for more information.
|
||||||
|
|
||||||
|
* Use an MTU of 9000: how to change this depends on the network management tool. In the case of Network Manager, this can be done from the GUI.
|
||||||
|
* Increase the kernel socket buffer (also done by the USRP driver in OAI):
|
||||||
|
```
|
||||||
|
sysctl -w net.core.rmem_max=8388608
|
||||||
|
sysctl -w net.core.wmem_max=8388608
|
||||||
|
sysctl -w net.core.rmem_default=65536
|
||||||
|
sysctl -w net.core.wmem_default=65536
|
||||||
|
```
|
||||||
|
* Increase Ethernet Ring Buffers: `sudo ethtool -G <ifname> rx 4096 tx 4096`
|
||||||
|
* Disable hyper-threading in the BIOS
|
||||||
|
* Disable KPTI Protections for Spectre/Meltdown for more performance. **This is a security risk.** Add `mitigations=off nosmt` in your grub config and update grub.
|
||||||
|
|
||||||
|
# 4. Run OAI CN5G and OAI gNB with USRP N300
|
||||||
|
|
||||||
|
## 4.1 Run OAI CN5G
|
||||||
|
|
||||||
|
```bash
|
||||||
|
cd ~/oai-cn5g-fed/docker-compose
|
||||||
|
python3 core-network.py --type start-basic --scenario 1
|
||||||
|
```
|
||||||
|
|
||||||
|
## 4.2 Run OAI gNB
|
||||||
|
|
||||||
|
```bash
|
||||||
|
cd ~/openairinterface5g
|
||||||
|
source oaienv
|
||||||
|
cd cmake_targets/ran_build/build
|
||||||
|
sudo ./nr-softmodem -O ../../../targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.162PRB.2x2.usrpn300.conf --sa --usrp-tx-thread-config 1
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
# 5. Testing with Quectel RM500Q
|
||||||
|
|
||||||
|
## 5.1 Setup Quectel
|
||||||
|
With [PuTTY](https://the.earth.li/~sgtatham/putty/latest/w64/putty.exe), send the following AT commands to the module using a serial interface (ex: COM2) at 115200 bps:
|
||||||
|
```bash
|
||||||
|
# MUST be sent at least once everytime there is a firmware upgrade!
|
||||||
|
AT+QMBNCFG="Select","ROW_Commercial"
|
||||||
|
AT+QMBNCFG="AutoSel",0
|
||||||
|
AT+CFUN=1,1
|
||||||
|
AT+CGDCONT=1
|
||||||
|
AT+CGDCONT=2
|
||||||
|
AT+CGDCONT=3
|
||||||
|
AT+CGDCONT=1,"IP","oai"
|
||||||
|
|
||||||
|
# (Optional, debug only, AT commands) Activate PDP context, retrieve IP address and test with ping
|
||||||
|
AT+CGACT=1,1
|
||||||
|
AT+CGPADDR=1
|
||||||
|
AT+QPING=1,"openairinterface.org"
|
||||||
|
```
|
||||||
|
|
||||||
|
## 5.2 Ping test
|
||||||
|
- UE host
|
||||||
|
```bash
|
||||||
|
ping 192.168.70.135 -n 1000 -S 12.1.1.2
|
||||||
|
```
|
||||||
|
- CN5G host
|
||||||
|
```bash
|
||||||
|
docker exec -it oai-ext-dn ping 12.1.1.2
|
||||||
|
```
|
||||||
|
|
||||||
|
## 5.3 Downlink iPerf test
|
||||||
|
- UE host
|
||||||
|
- Download iPerf for Microsoft Windows from [here](https://iperf.fr/download/windows/iperf-2.0.9-win64.zip).
|
||||||
|
- Extract to Desktop and run with Command Prompt:
|
||||||
|
```bash
|
||||||
|
cd C:\Users\User\Desktop\iPerf\iperf-2.0.9-win64\iperf-2.0.9-win64
|
||||||
|
iperf -s -u -i 1 -B 12.1.1.2
|
||||||
|
```
|
||||||
|
|
||||||
|
- CN5G host
|
||||||
|
```bash
|
||||||
|
docker exec -it oai-ext-dn iperf -u -t 86400 -i 1 -fk -B 192.168.70.135 -b 200M -c 12.1.1.2
|
||||||
|
```
|
||||||
@@ -207,7 +207,24 @@ UE on machine 2:
|
|||||||
|
|
||||||
`sudo ./nr-uesoftmodem --if_freq 2169080000 --if_freq_off -400000000`
|
`sudo ./nr-uesoftmodem --if_freq 2169080000 --if_freq_off -400000000`
|
||||||
|
|
||||||
|
# MIMO configuration
|
||||||
|
|
||||||
|
<table style="border-collapse: collapse; border: none;">
|
||||||
|
<tr style="border-collapse: collapse; border: none;">
|
||||||
|
<td style="border-collapse: collapse; border: none;">
|
||||||
|
<img src="./images/mimo_antenna_ports.png" alt="" border=3 height=100 width=300>
|
||||||
|
</img>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
</table>
|
||||||
|
|
||||||
|
This image shows an example of gNB 5G MIMO logical antenna port configuration. It has to be noted that logical antenna ports might not directly correspond to physical antenna ports and each logical antenna port might consist of a sub-array of antennas.
|
||||||
|
|
||||||
|
The basic element is a dual-polarized antenna, therefore the minimal DL MIMO setup with two logical antenna ports would consist of two cross-polarized antenna elements. In a single panel configuration, as the one in the picture, this element can be repeated vertiacally and/or horizontally to form an equi-spaced 1D or 2D array. The values N1 and N2 represent the number of antenna ports in the two dimensions and the supported configurations are specified in Section 5.2.2.2.1 of TS 38.214.
|
||||||
|
|
||||||
|
The DL logical antenna port configuration can be selected through configuration file. `pdsch_AntennaPorts_N1` can be used to set N1 parameter, `pdsch_AntennaPorts_N2` to set N2 and `pdsch_AntennaPorts_XP` to set the cross-polarization configuration (1 for single pol, 2 for cross-pol). To be noted that if XP is 1 but N1 and/or N2 are larger than 1, this would result in a non-standard configuration and the PMI selected would be the identity matrix regardless of CSI report. The default value for each of these parameters is 1.
|
||||||
|
|
||||||
|
# Additional links
|
||||||
|
|
||||||
[Selecting an alternative ldpc implementation at run time](../openair1/PHY/CODING/DOC/LDPCImplementation.md)
|
[Selecting an alternative ldpc implementation at run time](../openair1/PHY/CODING/DOC/LDPCImplementation.md)
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,51 @@
|
|||||||
|
# Procedure to add dedicated Bandwidth part (BWP)
|
||||||
|
|
||||||
|
## Contributed by 5G Testbed IISc
|
||||||
|
|
||||||
|
### Developers: Abhijith A, Shruthi S
|
||||||
|
|
||||||
|
# Terminology #
|
||||||
|
|
||||||
|
## Bandwidth part (BWP) ##
|
||||||
|
Bandwidth Part (BWP) is a set of contiguous Resource Blocks in the resource grid.
|
||||||
|
|
||||||
|
Parameters of a BWP are communicated to UE using RRC parameters: BWP-Downlink and BWP-Uplink.
|
||||||
|
|
||||||
|
A UE can be configured with a set of 4 BWPs in uplink (UL) and downlink (DL) direction (3GPP TS 38.331 Annex B.2 Description of BWP configuration options). But only 1 BWP can be active in UL and DL direction at a given time.
|
||||||
|
|
||||||
|
# Procedure to run multiple dedicated BWPs #
|
||||||
|
|
||||||
|
A maximum of 4 dedicated BWPs can be configured for a UE.
|
||||||
|
|
||||||
|
To configure multiple BWPs, add the following parameters to the gNB configuration file under "servingCellConfigDedicated":
|
||||||
|
|
||||||
|
## Setup of the Configuration files ##
|
||||||
|
```
|
||||||
|
firstActiveDownlinkBWP-Id = 1; #BWP-Id
|
||||||
|
defaultDownlinkBWP-Id = 1; #BWP-Id
|
||||||
|
firstActiveUplinkBWP-Id = 1; #BWP-Id
|
||||||
|
```
|
||||||
|
|
||||||
|
Each dedicated BWP must have:
|
||||||
|
```
|
||||||
|
# BWP 1 Configuration
|
||||||
|
dl_bwp-Id_1 = 1;
|
||||||
|
dl_bwp1_locationAndBandwidth = 28875; // RBstart=0, L=106 (40 MHz BW)
|
||||||
|
# subcarrierSpacing
|
||||||
|
# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
|
||||||
|
dl_bwp1_subcarrierSpacing = 1;
|
||||||
|
```
|
||||||
|
|
||||||
|
Find these parameters in this configuration file: "targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.106PRB.usrpb210.conf"
|
||||||
|
|
||||||
|
# Testing gNB and UE in RF simulator
|
||||||
|
|
||||||
|
## gNB command:
|
||||||
|
```
|
||||||
|
sudo ./nr-softmodem -O ../../../targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.106PRB.usrpb210.conf --gNBs.[0].min_rxtxtime 6 --rfsim --sa
|
||||||
|
```
|
||||||
|
|
||||||
|
## UE command:
|
||||||
|
```
|
||||||
|
sudo RFSIMULATOR=127.0.0.1 ./nr-uesoftmodem -r 106 --numerology 1 --band 78 -C 3619200000 --nokrnmod --rfsim --sa --uicc0.imsi 208990000000001
|
||||||
|
```
|
||||||
@@ -1,45 +1,167 @@
|
|||||||
## Table of Contents ##
|
## Table of Contents ##
|
||||||
|
|
||||||
1. [Legacy 1 Bench](#legacy-1-bench)
|
1. [Machines](#machines)
|
||||||
2. [Legacy 2 Bench](#legacy-2-bench)
|
2. [Networked devices](#networked-devices)
|
||||||
3. [Next Bench for DEV](#next-bench-for-dev)
|
3. [Testbenches](#testbenches)
|
||||||
4. [Next Bench for CI](#next-bench-for-ci)
|
4. [Pipelines](#pipelines)
|
||||||
5. [Indoor Live Network Bench](#indoor-live-network-bench)
|
|
||||||
6. [Outdoor Live Network Bench](#outdoor-live-network-bench)
|
## Machines
|
||||||
|
|
||||||
|
| Machine | IP address | Lockable Resource | Function | Connected devices |
|
||||||
|
| ------------- | --------------- | --------------------- | ------------------ | ----------------------------------------------------- |
|
||||||
|
| asterix | 172.21.16.127 | CI-Asterix-Usage | gNB (n78) | 173.21.19.14 |
|
||||||
|
| obelix | 172.21.16.128 | CI-Obelix-Usage | eNB (n40, n78), nrUE | 172.21.19.13, X300 (192.168.60.2), B200mini (30C51EB) |
|
||||||
|
| porcepix | 172.21.16.136 | CI-NSA-MiniBench | Executor, EPC, 5GC | -- |
|
||||||
|
| nrmodule2 | 172.21.16.139 | CI-NSA-MiniBench | Quectel | Quectel module |
|
||||||
|
| nepes | 172.21.16.137 | CI-NSA-MiniBench | gNB (n78) | B200mini (30C51D4) |
|
||||||
|
| caracal | 172.21.16.132 | CI-Caracal | gNB/phytest | N300 (192.168.10.2) |
|
||||||
|
| idefix | 172.21.16.135 | CI-NSA-MiniBench | Quectel | Quectel module |
|
||||||
|
| amariue | 172.21.16.144 | CI-Amarisoft-UE-Usage | nrUE | Amarisoft UE simulator |
|
||||||
|
| bellatrix | 192.168.117.115 | CI-RAN-VM-Deployment | Executor | -- |
|
||||||
|
| nano | 192.168.12.62 | CI-Bench-1-Phones | EPC, adb | 2x COTS (adb) |
|
||||||
|
| hutch | 192.168.12.19 | CI-Bench-1-Phones | eNB (B7) | B200mini (30C5239) |
|
||||||
|
| starsky | 192.168.12.18 | CI-Bench-1-Phones | eNB (B40) | b200mini (30A3E3C) |
|
||||||
|
| carabe | 192.168.12.211 | CI-Bench-2-OAI-Phone | UE (B7UE) | B200mini (30AE8C9) |
|
||||||
|
|
||||||
|
Note: The available resources, and their current usage, is indicated here:
|
||||||
|
- [Lockable resources of jenkins-oai](https://jenkins-oai.eurecom.fr/lockable-resources/):
|
||||||
|
"New" Jenkins, i.e., with RAN-Container-Parent
|
||||||
|
- [Lockable resources of open5glab jenkins](https://open5glab.eurecom.fr:8083/jenkins/lockable-resources/):
|
||||||
|
"Old" Jenkins, i.e., with RAN-CI-Develop
|
||||||
|
|
||||||
|
## Networked devices
|
||||||
|
|
||||||
|
| Type | IP address (mgmt) |
|
||||||
|
| ------------- | ----------------- |
|
||||||
|
| USRP N310 | 172.21.19.14 |
|
||||||
|
| USRP N310 | 172.21.19.13 |
|
||||||
|
|
||||||
|
## Testbenches
|
||||||
|
|
||||||
|
### OTA Testbench
|
||||||
|
|
||||||
|
**Purpose**: Over-the-air 4G/5G (NSA/SA) tests
|
||||||
|
|
||||||
|
Note: obelix and porcepix are both used in the OTA testbench and the 5G
|
||||||
|
NSA/Faraday Cage testbench!
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
[PDF version](testbenches_doc_resources/5g-ota-bench.pdf) | [LaTeX/TikZ version](testbenches_doc_resources/5g-ota-bench.tex) if you want to modify to reflect your setup
|
||||||
|
|
||||||
|
### 5G NSA/Faraday Cage Testbench
|
||||||
|
|
||||||
|
**Purpose**: Faraday cage 5G tests
|
||||||
|
|
||||||
|
Note: obelix and porcepix are both used in the OTA testbench and the 5G
|
||||||
|
NSA/Faraday Cage testbench!
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
[PDF version](testbenches_doc_resources/5g-nsa-faraday-bench.pdf) | [LaTeX/TikZ version](testbenches_doc_resources/5g-nsa-faraday-bench.tex) if you want to modify to reflect your setup
|
||||||
|
|
||||||
|
### 4G Testbench(es)
|
||||||
|
|
||||||
|
**Purpose**: 4G/LTE testbenches
|
||||||
|
|
||||||
|
|
||||||
## Legacy 1 Bench
|

|
||||||
|
|
||||||
**Purpose** : FDD Band 7 and Band 13, LTE-M
|
[PDF version](testbenches_doc_resources/4g-faraday-bench.pdf) | [LaTeX/TikZ version](testbenches_doc_resources/4g-faraday-bench.tex) if you want to modify to reflect your setup
|
||||||
**Note** : Legacy1 and Legacy2 are duplicated so that they can run in parallel, thus avoiding a CI bottleneck
|
|
||||||
**Note** : Faraday Cages 1 and 2 are physically the same cage
|
|
||||||
|
|
||||||

|
## Pipelines
|
||||||
|
|
||||||
## Legacy 2 Bench
|
### [RAN-Container-Parent](https://jenkins-oai.eurecom.fr/job/RAN-Container-Parent/)
|
||||||
|
|
||||||
**Purpose** : TDD Band 40, TM2 2xTX 2xRX
|
**Purpose**: automatically triggered tests on MR creation or push, from Gitlab
|
||||||
**Note** : CN can run in a container, could also run on Massive
|
Webhook
|
||||||
|
|
||||||

|
- [RAN-cppcheck](https://jenkins-oai.eurecom.fr/job/RAN-cppcheck/1664/)
|
||||||
|
- obelix
|
||||||
|
- performs static code analysis, currently not actively enforced
|
||||||
|
- [RAN-gNB-nrUE-MONO-TDD-Band78-N300](https://jenkins-oai.eurecom.fr/job/RAN-gNB-nrUE-MONO-TDD-Band78-N300/)
|
||||||
|
- caracal + N310
|
||||||
|
- pure performance test through phy-test scheduler, see command line for more
|
||||||
|
details
|
||||||
|
- [RAN-L2-Sim-Test-5G](https://jenkins-oai.eurecom.fr/job/RAN-L2-Sim-Test-5G/)
|
||||||
|
- obelix (gNB, 1x UE, OAI 5GC)
|
||||||
|
- L2simulator: skips physical layer and uses proxy between gNB and UE,
|
||||||
|
currently only ping
|
||||||
|
- [RAN-NSA-B200-Module-LTEBOX-Container](https://jenkins-oai.eurecom.fr/job/RAN-NSA-B200-Module-LTEBOX-Container/)
|
||||||
|
- obelix + B200, nepes + B200, idefix + Quectel, porcepix w/ ltebox
|
||||||
|
- basic NSA test
|
||||||
|
- [RAN-SA-B200-Module-SABOX-Container](https://jenkins-oai.eurecom.fr/job/RAN-SA-B200-Module-SABOX-Container/)
|
||||||
|
- obelix + B200, nepes + B200, idefix + Quectel, porcepix w/ sabox
|
||||||
|
- basic SA test (40 MHz TDD)
|
||||||
|
- [RAN-PhySim-Cluster](https://jenkins-oai.eurecom.fr/job/RAN-PhySim-Cluster/)
|
||||||
|
- asterix (`Asterix-OC-oaicicd-session` resource), tests in OpenShift Cluster
|
||||||
|
- unitary simulators (`nr_dlsim`, etc.)
|
||||||
|
- [RAN-RF-Sim-Test-4G](https://jenkins-oai.eurecom.fr/job/RAN-RF-Sim-Test-4G/)
|
||||||
|
- obelix (eNB, 1x UE, OAI EPC)
|
||||||
|
- uses RFsimulator, for FDD 5, 10, 20MHz with core, 5MHz noS1
|
||||||
|
- [RAN-RF-Sim-Test-5G](https://jenkins-oai.eurecom.fr/job/RAN-RF-Sim-Test-5G/)
|
||||||
|
- obelix (gNB, 2x UE, OAI 5GC)
|
||||||
|
- uses RFsimulator, TDD 40MHz, FDD 40MHz, F1 split
|
||||||
|
- [RAN-RHEL8-Image-Builder](https://jenkins-oai.eurecom.fr/job/RAN-RHEL8-Image-Builder/)
|
||||||
|
- asterix: RHEL 8 image build using podman
|
||||||
|
- [RAN-Ubuntu18-Image-Builder](https://jenkins-oai.eurecom.fr/job/RAN-Ubuntu18-Image-Builder/)
|
||||||
|
- obelix: Ubuntu 18 image build using docker
|
||||||
|
|
||||||
## Next Bench for DEV
|
### [RAN-CI-NSA-Trigger](https://jenkins-oai.eurecom.fr/view/RAN/job/RAN-CI-NSA-Trigger/)
|
||||||
|
|
||||||
**Note** : Benetel CI can also run on this bench at night
|
**Purpose**: longer-running over-the-air LTE, NSA, and SA tests, triggered
|
||||||
|
through cron job at midnight
|
||||||
|
|
||||||

|
- [RAN-LTE-2x2-Module-OAIEPC](https://jenkins-oai.eurecom.fr/job/RAN-LTE-2x2-Module-OAIEPC/)
|
||||||
|
- obelix + N310, nrmodule2 + Quectel, porcepix w/ Magma EPC
|
||||||
|
- LTE 2x2 test with TM1 and TM2
|
||||||
|
- [RAN-NSA-B200-Module-LTEBOX](https://jenkins-oai.eurecom.fr/job/RAN-NSA-B200-Module-LTEBOX/)
|
||||||
|
- obelix + B200 (eNB), nepes + B200 (gNB), idefix + Quectel, porcepix w/ ltebox
|
||||||
|
- Note: like [RAN-NSA-B200-Module-LTEBOX-Container](https://jenkins-oai.eurecom.fr/job/RAN-NSA-B200-Module-LTEBOX-Container/) above, but compiled/run from source
|
||||||
|
- [RAN-NSA-2x2-Module-OAIEPC](https://jenkins-oai.eurecom.fr/job/RAN-NSA-2x2-Module-OAIEPC/)
|
||||||
|
- obelix + N310 (eNB), asterix + N310 (gNB), nrmodule2 + Quectel, porcepix w/ Magma EPC
|
||||||
|
- LTE 2x2 and NR 2x2 (non-standalone)
|
||||||
|
- [RAN-SA-Module-CN5G](https://jenkins-oai.eurecom.fr/view/RAN/job/RAN-SA-Module-CN5G/)
|
||||||
|
- asterix + N310 (gNB), nrmodule2 + Quectel, porcepix w/ OAI 5GC
|
||||||
|
- NR 2x2 (standalone)
|
||||||
|
- [RAN-SA-OAIUE-N310-X300-CN5G](https://jenkins-oai.eurecom.fr/job/RAN-SA-OAIUE-N310-X300-CN5G/)
|
||||||
|
- asterix + N310 (gNB), obelix + N310 or X300 (5G UE), porcepix w/ OAI 5GC
|
||||||
|
- OTA test with OAIUE using both N310 and X300
|
||||||
|
- [RAN-SA-AmariS-CN5G](https://jenkins-oai.eurecom.fr/view/RAN/job/RAN-SA-AmariS-CN5G/)
|
||||||
|
- asterix + N310, amariue (1x UE), porcepix w/ OAI 5GC
|
||||||
|
- Amarisoft UE simulator: expected to be increased to more UEs
|
||||||
|
|
||||||
|
### [RAN-CI-develop](https://open5glab.eurecom.fr:8083/jenkins/job/RAN-CI-develop/)
|
||||||
|
|
||||||
## Next Bench for CI
|
**Purpose**: automatically triggered tests, mostly 4G, to be phased out and
|
||||||
|
integrated into RAN-Container-Parent
|
||||||
|
|
||||||
**Note** : The current test running on Caracal could run on this bench with a N300/N300 setup
|
runs tests:
|
||||||
|
- bellatrix: runs 4G/5G simulators directly (eNB + 1x UE + (opt.) OAI EPC, gNB + 1x UE in "noS1")
|
||||||
|
|
||||||

|
triggers pipelines:
|
||||||
|
- [eNB-CI-F1-FDD-Band7-B210](https://open5glab.eurecom.fr:8083/jenkins/job/eNB-CI-F1-FDD-Band7-B210/)
|
||||||
## Indoor Live Network Bench
|
- hutch + B210, nano w/ ltebox + 2x UE
|
||||||
|
- tests 4G FDD with F1 split, 5MHz, 10MHz, 20MHz. 5MHz stable, rest known to
|
||||||

|
be unstable
|
||||||
|
- [eNB-CI-FDD-Band7-B210](https://open5glab.eurecom.fr:8083/jenkins/job/eNB-CI-FDD-Band7-B210/)
|
||||||
## Outdoor Live Network Bench
|
- hutch + B210, nano w/ ltebox + 2x UE
|
||||||
|
- tests T tracer, information through FlexRAN, RRC inactivity timers,
|
||||||

|
inactivity timers + FlexRAN, different bandwidths
|
||||||
|
- [eNB-CI-IF4p5-FDD-Band7-B210](https://open5glab.eurecom.fr:8083/jenkins/job/eNB-CI-IF4p5-FDD-Band7-B210/)
|
||||||
|
- hutch + B210, nano w/ ltebox + 2x UE
|
||||||
|
- tests IF4.5 split over bandwidths 5, 10, 20 MHz in Band 7
|
||||||
|
- [eNB-CI-IF4p5-TDD-Band40-B210](https://open5glab.eurecom.fr:8083/jenkins/job/eNB-CI-IF4p5-TDD-Band40-B210/)
|
||||||
|
- starsky + B210, nano w/ ltebox + 2x UE
|
||||||
|
- tests IF4.5 split over bandwidths 5, 10, 20 MHz in Band 40
|
||||||
|
- [eNB-CI-TDD-Band40-B210](https://open5glab.eurecom.fr:8083/jenkins/job/eNB-CI-TDD-Band40-B210/)
|
||||||
|
- starsky + B210, nano w/ ltebox + 2x UE
|
||||||
|
- T tracer, TM1 over bandwidths 5, 10, 20 MHz in Band 40, default scheduler
|
||||||
|
for 20 MHz
|
||||||
|
- [eNB-UE-CI-MONO-FDD-Band7-B200](https://open5glab.eurecom.fr:8083/jenkins/job/eNB-UE-CI-MONO-FDD-Band7-B200/)
|
||||||
|
- hutch + B210 (eNB), carabe + B210 (4G UE), nano w/ ltebox
|
||||||
|
- tests OAI 4G for 5 MHz/TM1 with both CN and in noS1 model, MBMS; known to
|
||||||
|
be unstable
|
||||||
|
- [UE-CI-FDD-Band20-B200](https://open5glab.eurecom.fr:8083/jenkins/job/UE-CI-FDD-Band20-B200/)
|
||||||
|
- starsky + B210 (sniffer)
|
||||||
|
- Sniff MIB + SIB1 of Orange, SFR
|
||||||
|
|||||||
@@ -50,7 +50,7 @@ At the moment of writing this document interoperability with the following COTS
|
|||||||
## 1.1 gNB build and configuration
|
## 1.1 gNB build and configuration
|
||||||
To get the code and build the gNB executable:
|
To get the code and build the gNB executable:
|
||||||
|
|
||||||
### Ubuntu 18.04
|
### Build gNB
|
||||||
```bash
|
```bash
|
||||||
git clone https://gitlab.eurecom.fr/oai/openairinterface5g.git
|
git clone https://gitlab.eurecom.fr/oai/openairinterface5g.git
|
||||||
git checkout develop
|
git checkout develop
|
||||||
@@ -61,42 +61,6 @@ To get the code and build the gNB executable:
|
|||||||
./build_oai --gNB -w USRP
|
./build_oai --gNB -w USRP
|
||||||
```
|
```
|
||||||
|
|
||||||
### Ubuntu 20.04
|
|
||||||
```bash
|
|
||||||
# Build UHD from source
|
|
||||||
# https://files.ettus.com/manual/page_build_guide.html
|
|
||||||
sudo apt-get install libboost-all-dev libusb-1.0-0-dev doxygen python3-docutils python3-mako python3-numpy python3-requests python3-ruamel.yaml python3-setuptools cmake build-essential
|
|
||||||
|
|
||||||
git clone https://github.com/EttusResearch/uhd.git
|
|
||||||
cd uhd/host
|
|
||||||
mkdir build
|
|
||||||
cd build
|
|
||||||
cmake ../
|
|
||||||
make -j 4
|
|
||||||
make test # This step is optional
|
|
||||||
sudo make install
|
|
||||||
sudo ldconfig
|
|
||||||
sudo uhd_images_downloader
|
|
||||||
|
|
||||||
|
|
||||||
git clone https://gitlab.eurecom.fr/oai/openairinterface5g.git
|
|
||||||
git checkout develop
|
|
||||||
|
|
||||||
# Install dependencies in Ubuntu 20.04
|
|
||||||
cd
|
|
||||||
cd openairinterface5g/
|
|
||||||
source oaienv
|
|
||||||
cd cmake_targets/
|
|
||||||
./install_external_packages.ubuntu20
|
|
||||||
|
|
||||||
# Build OAI gNB
|
|
||||||
cd
|
|
||||||
cd openairinterface5g/
|
|
||||||
source oaienv
|
|
||||||
cd cmake_targets/
|
|
||||||
./build_oai --gNB -w USRP
|
|
||||||
```
|
|
||||||
|
|
||||||
A reference configuration file for the **monolithic** gNB is provided [here](https://gitlab.eurecom.fr/oai/openairinterface5g/-/blob/develop/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.106PRB.usrpb210.conf).
|
A reference configuration file for the **monolithic** gNB is provided [here](https://gitlab.eurecom.fr/oai/openairinterface5g/-/blob/develop/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.106PRB.usrpb210.conf).
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,31 @@
|
|||||||
|
# how to build phy sim
|
||||||
|
cd cmake_targets/
|
||||||
|
sudo ./build_oai --phy_simulators -c
|
||||||
|
|
||||||
|
cd phy_simulators/build/
|
||||||
|
# ULSCH sim
|
||||||
|
# bit level validation
|
||||||
|
# PUSCH encoding and decoding for 4 layers 2 CMD without data
|
||||||
|
sudo ./nr_ulschsim -R 106 -m9 -s13 -n100 -y4 -z4 -W4
|
||||||
|
|
||||||
|
# UL sim
|
||||||
|
# Uplink chain validation
|
||||||
|
# PUSCH on UE side and gNB side,whole chain for PUSCH
|
||||||
|
# No channel model on data domain signal
|
||||||
|
# No cross-path connection
|
||||||
|
# PMI = 0 is only unitary prcoding matrix
|
||||||
|
sudo ./nr_ulsim -n100 -m9 -r106 -s13 -W4 -y4 -z4
|
||||||
|
|
||||||
|
# How to build rfsim
|
||||||
|
sudo ./build_oai -c --gNB --nrUE -w SIMU
|
||||||
|
|
||||||
|
# How to run with rfsim
|
||||||
|
# 4x4 RANK 4
|
||||||
|
sudo ./nr-softmodem -O ../../../targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.106PRB.usrpb210.4layer.conf --rfsim --phy-test --l 2 --L 4
|
||||||
|
sudo ./nr-uesoftmodem --rfsim --phy-test --ue-nb-ant-rx 4 --ue-nb-ant-tx 4
|
||||||
|
# 4x4 RANK 2
|
||||||
|
sudo ./nr-softmodem -O ../../../targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.106PRB.usrpb210.4layer.conf --rfsim --phy-test --l 2 --L 2
|
||||||
|
sudo ./nr-uesoftmodem --rfsim --phy-test --ue-nb-ant-rx 4 --ue-nb-ant-tx 4
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
After Width: | Height: | Size: 18 KiB |
|
After Width: | Height: | Size: 90 KiB |
@@ -0,0 +1,59 @@
|
|||||||
|
\documentclass{standalone}
|
||||||
|
|
||||||
|
\usepackage{tikz}
|
||||||
|
\usetikzlibrary{backgrounds, positioning, shapes.symbols}
|
||||||
|
\usepackage{helvet}
|
||||||
|
\renewcommand*{\rmdefault}{\sfdefault}
|
||||||
|
|
||||||
|
\begin{document}
|
||||||
|
\begin{tikzpicture}
|
||||||
|
[
|
||||||
|
font=\footnotesize,
|
||||||
|
faraday/.style={minimum size=3cm, draw, dashed},
|
||||||
|
duplexer/.style={draw,fill=white},
|
||||||
|
]
|
||||||
|
|
||||||
|
\node[faraday, label={[anchor=south west]above left:Faraday cage}] (faraday) {};
|
||||||
|
|
||||||
|
\node[above left=0cm and 2.8cm of faraday, label=above:hutch] (hutch)
|
||||||
|
{\includegraphics[width=1.2cm]{server}};
|
||||||
|
\node[right=0.3cm of hutch, label=above:B210] (b210h)
|
||||||
|
{\includegraphics[width=1.2cm]{b210}} edge (hutch);
|
||||||
|
\node[below left=0.35cm of faraday.north east] (anto)
|
||||||
|
{\includegraphics[width=0.3cm]{antenna}};
|
||||||
|
\draw (b210h) -| node [pos=0.25, duplexer] {B7} (anto);
|
||||||
|
|
||||||
|
\node[below left=0cm and 2.8cm of faraday, label=above:starsky] (starsky)
|
||||||
|
{\includegraphics[width=1.2cm]{server}};
|
||||||
|
\node[right=0.3cm of starsky, label=above:B210] (b210s)
|
||||||
|
{\includegraphics[width=1.2cm]{b210}} edge (starsky);
|
||||||
|
\draw (hutch) -- (b210h);
|
||||||
|
\node[above left=0.35cm of faraday.south east] (antn)
|
||||||
|
{\includegraphics[width=0.3cm]{antenna}};
|
||||||
|
\draw (b210s) -| node [pos=0.35, duplexer] {B40} (antn);
|
||||||
|
\node[below right=-0.2cm and 0.8cm of b210s] (antn2)
|
||||||
|
{\includegraphics[width=0.3cm]{antenna}};
|
||||||
|
\draw (b210s) -| (antn2);
|
||||||
|
|
||||||
|
\node[left=5cm of faraday, label=above:nano] (nano)
|
||||||
|
{\includegraphics[width=1.2cm]{server}};
|
||||||
|
\draw (hutch) -- (nano);
|
||||||
|
\draw (starsky) -- (nano);
|
||||||
|
\node[above right=0.0cm and 0.35cm of faraday.west] (phone1)
|
||||||
|
{\includegraphics[height=0.5cm]{phone}};
|
||||||
|
\node[below right=0.0cm and 0.35cm of faraday.west] (phone2)
|
||||||
|
{\includegraphics[height=0.5cm]{phone}};
|
||||||
|
\draw (nano) -- node[above] {USB/adb} +(5cm,0) |- (phone1);
|
||||||
|
\draw (nano) -- +(5cm,0) |- (phone2);
|
||||||
|
|
||||||
|
\node[right=1.5cm of faraday, label=above:B210] (b210c)
|
||||||
|
{\includegraphics[width=1.2cm]{b210}};
|
||||||
|
\node[left=.5cm of faraday.east] (antc)
|
||||||
|
{\includegraphics[width=0.3cm]{antenna}};
|
||||||
|
\draw (b210c) -- node [pos=0.35, duplexer] {B7UE} (antc);
|
||||||
|
\node[right=0.7cm of b210c, label=above:carabe] (carabe)
|
||||||
|
{\includegraphics[width=1.2cm]{server}}
|
||||||
|
edge (b210c);
|
||||||
|
|
||||||
|
\end{tikzpicture}
|
||||||
|
\end{document}
|
||||||
|
After Width: | Height: | Size: 87 KiB |
@@ -0,0 +1,55 @@
|
|||||||
|
\documentclass{standalone}
|
||||||
|
|
||||||
|
\usepackage{tikz}
|
||||||
|
\usetikzlibrary{backgrounds, positioning, shapes.symbols}
|
||||||
|
\usepackage{helvet}
|
||||||
|
\renewcommand*{\rmdefault}{\sfdefault}
|
||||||
|
|
||||||
|
\begin{document}
|
||||||
|
\begin{tikzpicture}
|
||||||
|
[
|
||||||
|
font=\footnotesize,
|
||||||
|
faraday/.style={minimum size=3cm, draw, dashed},
|
||||||
|
duplexer/.style={draw,fill=white},
|
||||||
|
]
|
||||||
|
|
||||||
|
\node[faraday, label={[anchor=south east]above right:Faraday cage}] (faraday) {};
|
||||||
|
|
||||||
|
\node[above left=0cm and 2.8cm of faraday, label=above:obelix] (obelix)
|
||||||
|
{\includegraphics[width=1.2cm]{server}};
|
||||||
|
\node[right=0.3cm of obelix, label=above:B200-mini] (b210o)
|
||||||
|
{\includegraphics[width=1.2cm]{b200-mini}} edge (obelix);
|
||||||
|
\node[below right=0.35cm of faraday.north west] (anto)
|
||||||
|
{\includegraphics[width=0.3cm]{antenna}};
|
||||||
|
\draw (b210o) -| node [pos=0.2, duplexer] {B7} (anto);
|
||||||
|
|
||||||
|
\node[below left=0cm and 2.8cm of faraday, label=above:nepes] (nepes)
|
||||||
|
{\includegraphics[width=1.2cm]{server}};
|
||||||
|
\node[right=0.3cm of nepes, label=above:B200-mini] (b210n)
|
||||||
|
{\includegraphics[width=1.2cm]{b200-mini}} edge (nepes);
|
||||||
|
\draw (obelix) -- (b210o);
|
||||||
|
\node[above right=0.35cm of faraday.south west] (antn)
|
||||||
|
{\includegraphics[width=0.3cm]{antenna}};
|
||||||
|
\draw (b210n) -| node [pos=0.2, duplexer] {n78} (antn);
|
||||||
|
|
||||||
|
\node[left=5cm of faraday, label=above:porcepix] (porcepix)
|
||||||
|
{\includegraphics[width=1.2cm]{server}};
|
||||||
|
\draw (obelix) -- (porcepix);
|
||||||
|
\draw (nepes) -- (porcepix);
|
||||||
|
|
||||||
|
\node[right=1.5cm of faraday, label=above:RM500Q-GL] (quectel)
|
||||||
|
{\includegraphics[height=1.2cm]{quectel}};
|
||||||
|
\node[above left=-0.1cm and 0.2cm of faraday.east] (aq2)
|
||||||
|
{\includegraphics[width=0.3cm]{antenna}} edge (quectel);
|
||||||
|
\node[above=-0.2cm of aq2] (aq1)
|
||||||
|
{\includegraphics[width=0.3cm]{antenna}} edge (quectel);
|
||||||
|
\node[below=-0.2cm of aq2] (aq3)
|
||||||
|
{\includegraphics[width=0.3cm]{antenna}} edge (quectel);
|
||||||
|
\node[below=-0.2cm of aq3]
|
||||||
|
{\includegraphics[width=0.3cm]{antenna}} edge (quectel);
|
||||||
|
\node[right=1cm of quectel, label=above:idefix] (idefix)
|
||||||
|
{\includegraphics[width=1.2cm]{server}}
|
||||||
|
edge (quectel);
|
||||||
|
|
||||||
|
\end{tikzpicture}
|
||||||
|
\end{document}
|
||||||
|
After Width: | Height: | Size: 94 KiB |
@@ -0,0 +1,68 @@
|
|||||||
|
\documentclass{standalone}
|
||||||
|
|
||||||
|
\usepackage{tikz}
|
||||||
|
\usetikzlibrary{backgrounds, positioning, shapes.symbols}
|
||||||
|
\usepackage{helvet}
|
||||||
|
\renewcommand*{\rmdefault}{\sfdefault}
|
||||||
|
|
||||||
|
\begin{document}
|
||||||
|
\begin{tikzpicture}
|
||||||
|
[
|
||||||
|
font=\footnotesize,
|
||||||
|
faraday/.style={minimum size=3cm, draw, dashed},
|
||||||
|
duplexer/.style={draw,fill=white},
|
||||||
|
]
|
||||||
|
|
||||||
|
\node[label=above:porcepix] (porcepix)
|
||||||
|
{\includegraphics[width=1.2cm]{server}};
|
||||||
|
|
||||||
|
\node[above right=1cm and 2cm of porcepix, label=above:asterix] (asterix)
|
||||||
|
{\includegraphics[width=1.2cm]{server}}
|
||||||
|
edge (porcepix);
|
||||||
|
\node[right=0.3cm of asterix, label=above:N310] (n310a)
|
||||||
|
{\includegraphics[width=1.5cm]{n310}} edge (asterix);
|
||||||
|
\node[right=.2cm of n310a, duplexer] (b78o) {n78} edge (n310a);
|
||||||
|
\node[below right=-0.1cm and 0.35cm of b78o.east] (anto1)
|
||||||
|
{\includegraphics[width=0.3cm]{antenna}} edge (b78o);
|
||||||
|
\node[above right=-0.1cm and 0.35cm of b78o.east] (anto2)
|
||||||
|
{\includegraphics[width=0.3cm]{antenna}} edge (b78o);
|
||||||
|
|
||||||
|
\node[right=2cm of porcepix, label=above:obelix] (obelix)
|
||||||
|
{\includegraphics[width=1.2cm]{server}}
|
||||||
|
edge (porcepix);
|
||||||
|
\node[above right=-0.5cm and 0.3cm of obelix, label=above:N310] (n310o)
|
||||||
|
{\includegraphics[width=1.5cm]{n310}} edge (obelix);
|
||||||
|
\node[right=.2cm of n310o, duplexer] (b78o) {n40} edge (n310o);
|
||||||
|
\node[below right=-0.1cm and 0.35cm of b78o.east] (anto1)
|
||||||
|
{\includegraphics[width=0.3cm]{antenna}} edge (b78o);
|
||||||
|
\node[above right=-0.1cm and 0.35cm of b78o.east] (anto2)
|
||||||
|
{\includegraphics[width=0.3cm]{antenna}} edge (b78o);
|
||||||
|
\node[below right=-0.5cm and 0.3cm of obelix, label=above:X310] (x310o)
|
||||||
|
{\includegraphics[width=1.5cm]{x310}} edge (obelix);
|
||||||
|
\node[right=.2cm of x310o, duplexer] (b78o) {n78} edge (x310o);
|
||||||
|
\node[below right=-0.1cm and 0.35cm of b78o.east] (anto1)
|
||||||
|
{\includegraphics[width=0.3cm]{antenna}} edge (b78o);
|
||||||
|
\node[above right=-0.1cm and 0.35cm of b78o.east] (anto2)
|
||||||
|
{\includegraphics[width=0.3cm]{antenna}} edge (b78o);
|
||||||
|
|
||||||
|
\node[above right=-1.3cm and 5.0cm of n310a.east, label=above:RM500Q-GL] (quectel)
|
||||||
|
{\includegraphics[height=1.2cm]{quectel}};
|
||||||
|
\node[above left=-0.1cm and 0.8cm of quectel.west] (aq2)
|
||||||
|
{\includegraphics[width=0.3cm]{antenna}} edge (quectel);
|
||||||
|
\node[above=-0.2cm of aq2] (aq1)
|
||||||
|
{\includegraphics[width=0.3cm]{antenna}} edge (quectel);
|
||||||
|
\node[below=-0.2cm of aq2] (aq3)
|
||||||
|
{\includegraphics[width=0.3cm]{antenna}} edge (quectel);
|
||||||
|
\node[below=-0.2cm of aq3]
|
||||||
|
{\includegraphics[width=0.3cm]{antenna}} edge (quectel);
|
||||||
|
\node[right=1cm of quectel, label=above:nrmodule2] (nrmodule2)
|
||||||
|
{\includegraphics[width=1.2cm]{server}}
|
||||||
|
edge (quectel);
|
||||||
|
|
||||||
|
\node[above right=-0.3cm and 5.0cm of x310o.east, label=above:amariue] (amariue)
|
||||||
|
{\includegraphics[height=1.2cm]{server}};
|
||||||
|
\node[left=0.8cm of amariue.west] (aa1)
|
||||||
|
{\includegraphics[width=0.3cm]{antenna}} edge (amariue);
|
||||||
|
|
||||||
|
\end{tikzpicture}
|
||||||
|
\end{document}
|
||||||
|
After Width: | Height: | Size: 233 KiB |
|
After Width: | Height: | Size: 32 KiB |
|
Before Width: | Height: | Size: 248 KiB |
|
Before Width: | Height: | Size: 105 KiB |
|
Before Width: | Height: | Size: 119 KiB |
|
After Width: | Height: | Size: 118 KiB |
|
Before Width: | Height: | Size: 154 KiB |