Merge remote-tracking branch 'origin/develop' into thread_pool_size
# Conflicts: # ci-scripts/conf_files/gNB_SA_n78_106PRB.2x2_usrpn310.conf # ci-scripts/conf_files/gNB_SA_n78_133PRB.2x2_usrpn310.conf # openair2/GNB_APP/L1_nr_paramdef.h # targets/PROJECTS/GENERIC-NR-5GC/CONF/du_gnb.conf
This commit is contained in:
@@ -198,17 +198,37 @@ pipeline {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
stage ("RF Simulators") {
|
stage ("4G RF Simulators") {
|
||||||
when { expression {doMandatoryTests} }
|
when { expression {doMandatoryTests} }
|
||||||
steps {
|
steps {
|
||||||
script {
|
script {
|
||||||
triggerSlaveJob ('RAN-RF-Sim-Test', 'Test-RF-Sim-Container')
|
triggerSlaveJob ('RAN-RF-Sim-Test-4G', 'Test-RF-Sim-Container-4G')
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
post {
|
post {
|
||||||
always {
|
always {
|
||||||
script {
|
script {
|
||||||
finalizeSlaveJob('RAN-RF-Sim-Test')
|
finalizeSlaveJob('RAN-RF-Sim-Test-4G')
|
||||||
|
}
|
||||||
|
}
|
||||||
|
failure {
|
||||||
|
script {
|
||||||
|
currentBuild.result = 'FAILURE'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
stage ("5G RF Simulators") {
|
||||||
|
when { expression {doMandatoryTests} }
|
||||||
|
steps {
|
||||||
|
script {
|
||||||
|
triggerSlaveJob ('RAN-RF-Sim-Test-5G', 'Test-RF-Sim-Container-4G')
|
||||||
|
}
|
||||||
|
}
|
||||||
|
post {
|
||||||
|
always {
|
||||||
|
script {
|
||||||
|
finalizeSlaveJob('RAN-RF-Sim-Test-5G')
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
failure {
|
failure {
|
||||||
|
|||||||
@@ -529,52 +529,6 @@ pipeline {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
stage ("Test MONOLITHIC - FDD - Band 13 - B210") {
|
|
||||||
when {
|
|
||||||
expression {doFullTestsuite}
|
|
||||||
}
|
|
||||||
steps {
|
|
||||||
script {
|
|
||||||
sh "sleep 60"
|
|
||||||
triggerSlaveJob ('eNB-CI-MONO-FDD-Band13-B210', 'Test-Mono-FDD-Band13-LTE-M')
|
|
||||||
}
|
|
||||||
}
|
|
||||||
post {
|
|
||||||
always {
|
|
||||||
script {
|
|
||||||
finalizeSlaveJob('eNB-CI-MONO-FDD-Band13-B210')
|
|
||||||
}
|
|
||||||
}
|
|
||||||
failure {
|
|
||||||
script {
|
|
||||||
currentBuild.result = 'FAILURE'
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
stage ("Test X2 Handover - FDD - Band 13 - B210") {
|
|
||||||
when {
|
|
||||||
expression {doFullTestsuite}
|
|
||||||
}
|
|
||||||
steps {
|
|
||||||
script {
|
|
||||||
sh "sleep 60"
|
|
||||||
triggerSlaveJob ('eNB-CI-MONO-FDD-Band13-X2HO-B210', 'Test-Mono-FDD-Band13-X2-HO')
|
|
||||||
}
|
|
||||||
}
|
|
||||||
post {
|
|
||||||
always {
|
|
||||||
script {
|
|
||||||
finalizeSlaveJob('eNB-CI-MONO-FDD-Band13-X2HO-B210')
|
|
||||||
}
|
|
||||||
}
|
|
||||||
failure {
|
|
||||||
script {
|
|
||||||
currentBuild.result = 'FAILURE'
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
stage ("Test IF4p5 - TDD - Band 38 - B210 - MultiRRU") {
|
stage ("Test IF4p5 - TDD - Band 38 - B210 - MultiRRU") {
|
||||||
when {
|
when {
|
||||||
expression {doFullTestsuite}
|
expression {doFullTestsuite}
|
||||||
@@ -643,28 +597,6 @@ pipeline {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
stage ("Test OAI OCP-eNB - FDD - Band 7 - B210") {
|
|
||||||
when {
|
|
||||||
expression {doFullTestsuite}
|
|
||||||
}
|
|
||||||
steps {
|
|
||||||
script {
|
|
||||||
triggerSlaveJob ('OCPeNB-FDD-Band7-B210', 'Test-OCP-FDD-Band7')
|
|
||||||
}
|
|
||||||
}
|
|
||||||
post {
|
|
||||||
always {
|
|
||||||
script {
|
|
||||||
finalizeSlaveJob('OCPeNB-FDD-Band7-B210')
|
|
||||||
}
|
|
||||||
}
|
|
||||||
failure {
|
|
||||||
script {
|
|
||||||
currentBuild.result = 'FAILURE'
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
post {
|
post {
|
||||||
always {
|
always {
|
||||||
|
|||||||
@@ -390,7 +390,7 @@ pipeline {
|
|||||||
steps {
|
steps {
|
||||||
script {
|
script {
|
||||||
dir ('ci-scripts/ran_dashboard') {
|
dir ('ci-scripts/ran_dashboard') {
|
||||||
sh "python3 Hdashboard.py testevent ${params.eNB_MR} ${JOB_NAME} ${env.BUILD_URL} ${env.BUILD_ID} ${StatusForDb} "
|
sh "python3 Hdashboard.py testevent ${params.eNB_MR} "
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -27,6 +27,8 @@ def pythonExecutor = params.pythonExecutor
|
|||||||
|
|
||||||
def TARGET_BRANCH = "develop"
|
def TARGET_BRANCH = "develop"
|
||||||
def ALLOW_MERGE = true
|
def ALLOW_MERGE = true
|
||||||
|
def GitPostArgs = ''
|
||||||
|
def jobStatus
|
||||||
|
|
||||||
pipeline {
|
pipeline {
|
||||||
agent {
|
agent {
|
||||||
@@ -47,63 +49,89 @@ pipeline {
|
|||||||
COMMIT_ID=sh returnStdout: true, script: """curl --silent "https://gitlab.eurecom.fr/api/v4/projects/oai%2Fopenairinterface5g/merge_requests/${MR}" | jq ".sha" || true """
|
COMMIT_ID=sh returnStdout: true, script: """curl --silent "https://gitlab.eurecom.fr/api/v4/projects/oai%2Fopenairinterface5g/merge_requests/${MR}" | jq ".sha" || true """
|
||||||
COMMIT_ID=COMMIT_ID.trim()
|
COMMIT_ID=COMMIT_ID.trim()
|
||||||
echo "Testing NSA on : ${MR} ${SRC_BRANCH} ${COMMIT_ID}"
|
echo "Testing NSA on : ${MR} ${SRC_BRANCH} ${COMMIT_ID}"
|
||||||
//calling NSA B200
|
commit = COMMIT_ID.replace("\"","")
|
||||||
build job: "RAN-NSA-B200-Module-LTEBOX", wait : true, propagate : false, parameters: [
|
GitPostArgs = MR + ' ' + commit + ' '
|
||||||
string(name: 'eNB_MR', value: String.valueOf(MR)),
|
echo GitPostArgs
|
||||||
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))
|
|
||||||
]
|
|
||||||
//calling NSA 2x2
|
|
||||||
build job: "RAN-NSA-2x2-Module-OAIEPC", 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))
|
|
||||||
]
|
|
||||||
//calling LTE 2x2
|
|
||||||
build job: "RAN-LTE-2x2-Module-OAIEPC", 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))
|
|
||||||
]
|
|
||||||
//calling SA
|
|
||||||
build job: "RAN-SA-Module-CN5G", 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))
|
|
||||||
]
|
|
||||||
//calling OAIUE B200
|
|
||||||
//build job: "RAN-SA-OAIUE-B200-CN5G", 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))
|
|
||||||
//]
|
|
||||||
//calling OAIUE N310
|
|
||||||
//build job: "RAN-SA-OAIUE-N310-CN5G", 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))
|
|
||||||
//]
|
|
||||||
//calling OAIUE N310-X300
|
|
||||||
build job: "RAN-SA-OAIUE-N310-X300-CN5G", 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))
|
|
||||||
]
|
|
||||||
|
|
||||||
|
//calling LTE 2x2
|
||||||
|
jobName = "RAN-LTE-2x2-Module-OAIEPC"
|
||||||
|
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 NSA B200
|
||||||
|
jobName = "RAN-NSA-B200-Module-LTEBOX"
|
||||||
|
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 NSA 2x2
|
||||||
|
jobName = "RAN-NSA-2x2-Module-OAIEPC"
|
||||||
|
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 SA
|
||||||
|
jobName = "RAN-SA-Module-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
|
||||||
|
jobName = "RAN-SA-OAIUE-N310-X300-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
|
||||||
|
|
||||||
|
//git report the test results in 1 block, at the end of the test sequence of one MR
|
||||||
|
dir ('ci-scripts/ran_dashboard') {
|
||||||
|
sh "python3 Hdashboard.py gitpost ${GitPostArgs}"
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -221,7 +221,7 @@ class Containerize():
|
|||||||
if (self.ranAllowMerge):
|
if (self.ranAllowMerge):
|
||||||
imageTag = 'ci-temp'
|
imageTag = 'ci-temp'
|
||||||
if self.ranTargetBranch == 'develop':
|
if self.ranTargetBranch == 'develop':
|
||||||
mySSH.command('git diff HEAD..origin/develop -- docker/Dockerfile.base' + self.dockerfileprefix + ' | grep --colour=never -i INDEX', '\$', 5)
|
mySSH.command('git diff HEAD..origin/develop -- cmake_targets/build_oai cmake_targets/tools/build_helper docker/Dockerfile.base' + self.dockerfileprefix + ' | grep --colour=never -i INDEX', '\$', 5)
|
||||||
result = re.search('index', mySSH.getBefore())
|
result = re.search('index', mySSH.getBefore())
|
||||||
if result is not None:
|
if result is not None:
|
||||||
forceBaseImageBuild = True
|
forceBaseImageBuild = True
|
||||||
@@ -341,7 +341,9 @@ class Containerize():
|
|||||||
# Remove all intermediate build images
|
# Remove all intermediate build images
|
||||||
if self.ranAllowMerge and forceBaseImageBuild:
|
if self.ranAllowMerge and forceBaseImageBuild:
|
||||||
mySSH.command(self.cli + ' image rm ' + baseImage + ':' + baseTag + ' || true', '\$', 30)
|
mySSH.command(self.cli + ' image rm ' + baseImage + ':' + baseTag + ' || true', '\$', 30)
|
||||||
mySSH.command(self.cli + ' image rm ran-build:' + imageTag + ' || true','\$', 5)
|
mySSH.command(self.cli + ' image rm ran-build:' + imageTag + ' || true','\$', 30)
|
||||||
|
# Cleaning any created tmp volume
|
||||||
|
mySSH.command(self.cli + ' volume prune --force || true','\$', 15)
|
||||||
mySSH.close()
|
mySSH.close()
|
||||||
ZipFile('build_log_' + self.testCase_id + '.zip').extractall('.')
|
ZipFile('build_log_' + self.testCase_id + '.zip').extractall('.')
|
||||||
|
|
||||||
@@ -584,35 +586,52 @@ class Containerize():
|
|||||||
mySSH.command('cd ' + lSourcePath + '/' + self.yamlPath[self.eNB_instance], '\$', 5)
|
mySSH.command('cd ' + lSourcePath + '/' + self.yamlPath[self.eNB_instance], '\$', 5)
|
||||||
# Currently support only one
|
# Currently support only one
|
||||||
mySSH.command('docker-compose --file ci-docker-compose.yml config', '\$', 5)
|
mySSH.command('docker-compose --file ci-docker-compose.yml config', '\$', 5)
|
||||||
|
containerName = ''
|
||||||
|
containerToKill = False
|
||||||
result = re.search('container_name: (?P<container_name>[a-zA-Z0-9\-\_]+)', mySSH.getBefore())
|
result = re.search('container_name: (?P<container_name>[a-zA-Z0-9\-\_]+)', mySSH.getBefore())
|
||||||
if self.eNB_logFile[self.eNB_instance] == '':
|
if self.eNB_logFile[self.eNB_instance] == '':
|
||||||
self.eNB_logFile[self.eNB_instance] = 'enb_' + HTML.testCase_id + '.log'
|
self.eNB_logFile[self.eNB_instance] = 'enb_' + HTML.testCase_id + '.log'
|
||||||
if result is not None:
|
if result is not None:
|
||||||
containerName = result.group('container_name')
|
containerName = result.group('container_name')
|
||||||
|
containerToKill = True
|
||||||
|
if containerToKill:
|
||||||
|
mySSH.command('docker inspect ' + containerName, '\$', 30)
|
||||||
|
result = re.search('Error: No such object: ' + containerName, mySSH.getBefore())
|
||||||
|
if result is not None:
|
||||||
|
containerToKill = False
|
||||||
|
if containerToKill:
|
||||||
mySSH.command('docker kill --signal INT ' + containerName, '\$', 30)
|
mySSH.command('docker kill --signal INT ' + containerName, '\$', 30)
|
||||||
time.sleep(5)
|
time.sleep(5)
|
||||||
mySSH.command('docker logs ' + containerName + ' > ' + lSourcePath + '/cmake_targets/' + self.eNB_logFile[self.eNB_instance], '\$', 30)
|
mySSH.command('docker logs ' + containerName + ' > ' + lSourcePath + '/cmake_targets/' + self.eNB_logFile[self.eNB_instance], '\$', 30)
|
||||||
mySSH.command('docker rm -f ' + containerName, '\$', 30)
|
mySSH.command('docker rm -f ' + containerName, '\$', 30)
|
||||||
# Forcing the down now to remove the networks and any artifacts
|
# Forcing the down now to remove the networks and any artifacts
|
||||||
mySSH.command('docker-compose --file ci-docker-compose.yml down', '\$', 5)
|
mySSH.command('docker-compose --file ci-docker-compose.yml down', '\$', 5)
|
||||||
|
# Cleaning any created tmp volume
|
||||||
|
mySSH.command('docker volume prune --force || true', '\$', 20)
|
||||||
|
|
||||||
mySSH.close()
|
mySSH.close()
|
||||||
|
|
||||||
# Analyzing log file!
|
# Analyzing log file!
|
||||||
copyin_res = mySSH.copyin(lIpAddr, lUserName, lPassWord, lSourcePath + '/cmake_targets/' + self.eNB_logFile[self.eNB_instance], '.')
|
if containerToKill:
|
||||||
|
copyin_res = mySSH.copyin(lIpAddr, lUserName, lPassWord, lSourcePath + '/cmake_targets/' + self.eNB_logFile[self.eNB_instance], '.')
|
||||||
|
else:
|
||||||
|
copyin_res = 0
|
||||||
nodeB_prefix = 'e'
|
nodeB_prefix = 'e'
|
||||||
if (copyin_res == -1):
|
if (copyin_res == -1):
|
||||||
HTML.htmleNBFailureMsg='Could not copy ' + nodeB_prefix + 'NB logfile to analyze it!'
|
HTML.htmleNBFailureMsg='Could not copy ' + nodeB_prefix + 'NB logfile to analyze it!'
|
||||||
HTML.CreateHtmlTestRow('N/A', 'KO', CONST.ENB_PROCESS_NOLOGFILE_TO_ANALYZE)
|
HTML.CreateHtmlTestRow('N/A', 'KO', CONST.ENB_PROCESS_NOLOGFILE_TO_ANALYZE)
|
||||||
else:
|
else:
|
||||||
logging.debug('\u001B[1m Analyzing ' + nodeB_prefix + 'NB logfile \u001B[0m ' + self.eNB_logFile[self.eNB_instance])
|
if containerToKill:
|
||||||
logStatus = RAN.AnalyzeLogFile_eNB(self.eNB_logFile[self.eNB_instance], HTML)
|
logging.debug('\u001B[1m Analyzing ' + nodeB_prefix + 'NB logfile \u001B[0m ' + self.eNB_logFile[self.eNB_instance])
|
||||||
|
logStatus = RAN.AnalyzeLogFile_eNB(self.eNB_logFile[self.eNB_instance], HTML)
|
||||||
|
else:
|
||||||
|
logStatus = 0
|
||||||
if (logStatus < 0):
|
if (logStatus < 0):
|
||||||
HTML.CreateHtmlTestRow(RAN.runtime_stats, 'KO', logStatus)
|
HTML.CreateHtmlTestRow(RAN.runtime_stats, 'KO', logStatus)
|
||||||
else:
|
else:
|
||||||
HTML.CreateHtmlTestRow(RAN.runtime_stats, 'OK', CONST.ALL_PROCESSES_OK)
|
HTML.CreateHtmlTestRow(RAN.runtime_stats, 'OK', CONST.ALL_PROCESSES_OK)
|
||||||
# all the xNB run logs shall be on the server 0 for logCollecting
|
# all the xNB run logs shall be on the server 0 for logCollecting
|
||||||
if self.eNB_serverId[self.eNB_instance] != '0':
|
if containerToKill and self.eNB_serverId[self.eNB_instance] != '0':
|
||||||
mySSH.copyout(self.eNBIPAddress, self.eNBUserName, self.eNBPassword, './' + self.eNB_logFile[self.eNB_instance], self.eNBSourceCodePath + '/cmake_targets/')
|
mySSH.copyout(self.eNBIPAddress, self.eNBUserName, self.eNBPassword, './' + self.eNB_logFile[self.eNB_instance], self.eNBSourceCodePath + '/cmake_targets/')
|
||||||
logging.info('\u001B[1m Undeploying OAI Object Pass\u001B[0m')
|
logging.info('\u001B[1m Undeploying OAI Object Pass\u001B[0m')
|
||||||
|
|
||||||
@@ -685,7 +704,7 @@ class Containerize():
|
|||||||
def CaptureOnDockerNetworks(self):
|
def CaptureOnDockerNetworks(self):
|
||||||
cmd = 'cd ' + self.yamlPath[0] + ' && docker-compose -f docker-compose-ci.yml config | grep com.docker.network.bridge.name | sed -e "s@^.*name: @@"'
|
cmd = 'cd ' + self.yamlPath[0] + ' && docker-compose -f docker-compose-ci.yml config | grep com.docker.network.bridge.name | sed -e "s@^.*name: @@"'
|
||||||
networkNames = subprocess.check_output(cmd, shell=True, stderr=subprocess.STDOUT, universal_newlines=True, timeout=10)
|
networkNames = subprocess.check_output(cmd, shell=True, stderr=subprocess.STDOUT, universal_newlines=True, timeout=10)
|
||||||
cmd = 'sudo nohup tshark -f "not tcp and not arp and not port 53 and not host archive.ubuntu.com and not host security.ubuntu.com"'
|
cmd = 'sudo nohup tshark -f "not tcp and not arp and not port 53 and not host archive.ubuntu.com and not host security.ubuntu.com and not port 2152"'
|
||||||
for name in networkNames.split('\n'):
|
for name in networkNames.split('\n'):
|
||||||
res = re.search('rfsim', name)
|
res = re.search('rfsim', name)
|
||||||
if res is not None:
|
if res is not None:
|
||||||
@@ -696,7 +715,7 @@ class Containerize():
|
|||||||
logging.debug(cmd)
|
logging.debug(cmd)
|
||||||
networkNames = subprocess.check_output(cmd, shell=True, stderr=subprocess.STDOUT, universal_newlines=True, timeout=10)
|
networkNames = subprocess.check_output(cmd, shell=True, stderr=subprocess.STDOUT, universal_newlines=True, timeout=10)
|
||||||
|
|
||||||
def UndeployGenObject(self, HTML):
|
def UndeployGenObject(self, HTML, RAN):
|
||||||
self.exitStatus = 0
|
self.exitStatus = 0
|
||||||
ymlPath = self.yamlPath[0].split('/')
|
ymlPath = self.yamlPath[0].split('/')
|
||||||
logPath = '../cmake_targets/log/' + ymlPath[1]
|
logPath = '../cmake_targets/log/' + ymlPath[1]
|
||||||
@@ -726,8 +745,36 @@ class Containerize():
|
|||||||
cmd = 'cd ' + self.yamlPath[0] + ' && docker logs ' + cName + ' > ' + cName + '.log 2>&1'
|
cmd = 'cd ' + self.yamlPath[0] + ' && docker logs ' + cName + ' > ' + cName + '.log 2>&1'
|
||||||
logging.debug(cmd)
|
logging.debug(cmd)
|
||||||
deployStatus = subprocess.check_output(cmd, shell=True, stderr=subprocess.STDOUT, universal_newlines=True, timeout=30)
|
deployStatus = subprocess.check_output(cmd, shell=True, stderr=subprocess.STDOUT, universal_newlines=True, timeout=30)
|
||||||
|
fullStatus = True
|
||||||
if anyLogs:
|
if anyLogs:
|
||||||
cmd = 'mkdir -p '+ logPath + ' && mv ' + self.yamlPath[0] + '/*.log ' + logPath
|
cmd = 'mkdir -p '+ logPath + ' && cp ' + self.yamlPath[0] + '/*.log ' + logPath
|
||||||
|
logging.debug(cmd)
|
||||||
|
deployStatus = subprocess.check_output(cmd, shell=True, stderr=subprocess.STDOUT, universal_newlines=True, timeout=10)
|
||||||
|
|
||||||
|
# Analyzing log file!
|
||||||
|
listOfPossibleRanContainers = ['enb', 'gnb', 'cu', 'du']
|
||||||
|
for container in listOfPossibleRanContainers:
|
||||||
|
filename = self.yamlPath[0] + '/rfsim?g-oai-' + container + '.log'
|
||||||
|
cmd = 'ls ' + filename
|
||||||
|
containerStatus = True
|
||||||
|
try:
|
||||||
|
lsStatus = subprocess.check_output(cmd, shell=True, stderr=subprocess.STDOUT, universal_newlines=True, timeout=10)
|
||||||
|
filename = str(lsStatus).strip()
|
||||||
|
except:
|
||||||
|
containerStatus = False
|
||||||
|
if not containerStatus:
|
||||||
|
continue
|
||||||
|
|
||||||
|
logging.debug('\u001B[1m Analyzing xNB logfile ' + filename + ' \u001B[0m')
|
||||||
|
# For the moment just assume this exists
|
||||||
|
logStatus = RAN.AnalyzeLogFile_eNB(filename, HTML)
|
||||||
|
if (logStatus < 0):
|
||||||
|
fullStatus = False
|
||||||
|
HTML.CreateHtmlTestRow(RAN.runtime_stats, 'KO', logStatus)
|
||||||
|
else:
|
||||||
|
HTML.CreateHtmlTestRow(RAN.runtime_stats, 'OK', CONST.ALL_PROCESSES_OK)
|
||||||
|
|
||||||
|
cmd = 'rm ' + self.yamlPath[0] + '/*.log'
|
||||||
logging.debug(cmd)
|
logging.debug(cmd)
|
||||||
deployStatus = subprocess.check_output(cmd, shell=True, stderr=subprocess.STDOUT, universal_newlines=True, timeout=10)
|
deployStatus = subprocess.check_output(cmd, shell=True, stderr=subprocess.STDOUT, universal_newlines=True, timeout=10)
|
||||||
if self.tsharkStarted:
|
if self.tsharkStarted:
|
||||||
@@ -743,6 +790,7 @@ class Containerize():
|
|||||||
logging.debug(cmd)
|
logging.debug(cmd)
|
||||||
copyStatus = subprocess.check_output(cmd, shell=True, stderr=subprocess.STDOUT, universal_newlines=True, timeout=10)
|
copyStatus = subprocess.check_output(cmd, shell=True, stderr=subprocess.STDOUT, universal_newlines=True, timeout=10)
|
||||||
|
|
||||||
|
logging.debug('\u001B[1m Undeploying \u001B[0m')
|
||||||
cmd = 'cd ' + self.yamlPath[0] + ' && docker-compose -f docker-compose-ci.yml down'
|
cmd = 'cd ' + self.yamlPath[0] + ' && docker-compose -f docker-compose-ci.yml down'
|
||||||
logging.debug(cmd)
|
logging.debug(cmd)
|
||||||
try:
|
try:
|
||||||
@@ -754,8 +802,17 @@ class Containerize():
|
|||||||
logging.error('\u001B[1m Undeploying OAI Object(s) FAILED\u001B[0m')
|
logging.error('\u001B[1m Undeploying OAI Object(s) FAILED\u001B[0m')
|
||||||
return
|
return
|
||||||
|
|
||||||
HTML.CreateHtmlTestRow('n/a', 'OK', CONST.ALL_PROCESSES_OK)
|
# Cleaning any created tmp volume
|
||||||
logging.info('\u001B[1m Undeploying OAI Object(s) PASS\u001B[0m')
|
cmd = 'docker volume prune --force || true'
|
||||||
|
logging.debug(cmd)
|
||||||
|
deployStatus = subprocess.check_output(cmd, shell=True, stderr=subprocess.STDOUT, universal_newlines=True, timeout=100)
|
||||||
|
|
||||||
|
if fullStatus:
|
||||||
|
HTML.CreateHtmlTestRow('n/a', 'OK', CONST.ALL_PROCESSES_OK)
|
||||||
|
logging.info('\u001B[1m Undeploying OAI Object(s) PASS\u001B[0m')
|
||||||
|
else:
|
||||||
|
HTML.CreateHtmlTestRow('n/a', 'KO', CONST.ALL_PROCESSES_OK)
|
||||||
|
logging.info('\u001B[1m Undeploying OAI Object(s) FAIL\u001B[0m')
|
||||||
|
|
||||||
def PingFromContainer(self, HTML):
|
def PingFromContainer(self, HTML):
|
||||||
self.exitStatus = 0
|
self.exitStatus = 0
|
||||||
|
|||||||
@@ -0,0 +1,281 @@
|
|||||||
|
Active_eNBs = ( "eNB-Eurecom-B38");
|
||||||
|
# Asn1_verbosity, choice in: none, info, annoying
|
||||||
|
Asn1_verbosity = "none";
|
||||||
|
|
||||||
|
eNBs =
|
||||||
|
(
|
||||||
|
{
|
||||||
|
////////// Identification parameters:
|
||||||
|
eNB_ID = 0xe02;
|
||||||
|
|
||||||
|
cell_type = "CELL_MACRO_ENB";
|
||||||
|
|
||||||
|
eNB_name = "eNB-Eurecom-B38";
|
||||||
|
|
||||||
|
// Tracking area code, 0x0000 and 0xfffe are reserved values
|
||||||
|
tracking_area_code = 1;
|
||||||
|
plmn_list = ( { mcc = 208; mnc = 97; mnc_length = 2; } );
|
||||||
|
|
||||||
|
tr_s_preference = "local_mac"
|
||||||
|
|
||||||
|
////////// Physical parameters:
|
||||||
|
|
||||||
|
component_carriers = (
|
||||||
|
{
|
||||||
|
node_function = "3GPP_eNODEB";
|
||||||
|
node_timing = "synch_to_ext_device";
|
||||||
|
node_synch_ref = 0;
|
||||||
|
frame_type = "TDD";
|
||||||
|
tdd_config = 1;
|
||||||
|
tdd_config_s = 0;
|
||||||
|
prefix_type = "NORMAL";
|
||||||
|
eutra_band = 38;
|
||||||
|
downlink_frequency = 2605000000L;
|
||||||
|
nr_scg_ssb_freq = 624608;
|
||||||
|
uplink_frequency_offset = 0;
|
||||||
|
Nid_cell = 0;
|
||||||
|
N_RB_DL = 100;
|
||||||
|
Nid_cell_mbsfn = 0;
|
||||||
|
nb_antenna_ports = 2;
|
||||||
|
nb_antennas_tx = 2;
|
||||||
|
nb_antennas_rx = 2;
|
||||||
|
tx_gain = 90;
|
||||||
|
rx_gain = 125;
|
||||||
|
pbch_repetition = "FALSE";
|
||||||
|
prach_root = 0;
|
||||||
|
prach_config_index = 0;
|
||||||
|
prach_high_speed = "DISABLE";
|
||||||
|
prach_zero_correlation = 1;
|
||||||
|
prach_freq_offset = 2;
|
||||||
|
pucch_delta_shift = 1;
|
||||||
|
pucch_nRB_CQI = 0;
|
||||||
|
pucch_nCS_AN = 0;
|
||||||
|
pucch_n1_AN = 0;
|
||||||
|
pdsch_referenceSignalPower = -29;
|
||||||
|
pdsch_p_b = 0;
|
||||||
|
pusch_n_SB = 1;
|
||||||
|
pusch_enable64QAM = "DISABLE";
|
||||||
|
pusch_hoppingMode = "interSubFrame";
|
||||||
|
pusch_hoppingOffset = 0;
|
||||||
|
pusch_groupHoppingEnabled = "ENABLE";
|
||||||
|
pusch_groupAssignment = 0;
|
||||||
|
pusch_sequenceHoppingEnabled = "DISABLE";
|
||||||
|
pusch_nDMRS1 = 1;
|
||||||
|
phich_duration = "NORMAL";
|
||||||
|
phich_resource = "ONESIXTH";
|
||||||
|
srs_enable = "DISABLE";
|
||||||
|
/* srs_BandwidthConfig =;
|
||||||
|
srs_SubframeConfig =;
|
||||||
|
srs_ackNackST =;
|
||||||
|
srs_MaxUpPts =;*/
|
||||||
|
|
||||||
|
pusch_p0_Nominal = -96;
|
||||||
|
pusch_alpha = "AL1";
|
||||||
|
pucch_p0_Nominal = -104;
|
||||||
|
msg3_delta_Preamble = 6;
|
||||||
|
pucch_deltaF_Format1 = "deltaF2";
|
||||||
|
pucch_deltaF_Format1b = "deltaF3";
|
||||||
|
pucch_deltaF_Format2 = "deltaF0";
|
||||||
|
pucch_deltaF_Format2a = "deltaF0";
|
||||||
|
pucch_deltaF_Format2b = "deltaF0";
|
||||||
|
|
||||||
|
rach_numberOfRA_Preambles = 64;
|
||||||
|
rach_preamblesGroupAConfig = "DISABLE";
|
||||||
|
/*
|
||||||
|
rach_sizeOfRA_PreamblesGroupA = ;
|
||||||
|
rach_messageSizeGroupA = ;
|
||||||
|
rach_messagePowerOffsetGroupB = ;
|
||||||
|
*/
|
||||||
|
rach_powerRampingStep = 4;
|
||||||
|
rach_preambleInitialReceivedTargetPower = -108;
|
||||||
|
rach_preambleTransMax = 10;
|
||||||
|
rach_raResponseWindowSize = 10;
|
||||||
|
rach_macContentionResolutionTimer = 48;
|
||||||
|
rach_maxHARQ_Msg3Tx = 4;
|
||||||
|
|
||||||
|
pcch_default_PagingCycle = 128;
|
||||||
|
pcch_nB = "oneT";
|
||||||
|
bcch_modificationPeriodCoeff = 2;
|
||||||
|
ue_TimersAndConstants_t300 = 1000;
|
||||||
|
ue_TimersAndConstants_t301 = 1000;
|
||||||
|
ue_TimersAndConstants_t310 = 1000;
|
||||||
|
ue_TimersAndConstants_t311 = 10000;
|
||||||
|
ue_TimersAndConstants_n310 = 20;
|
||||||
|
ue_TimersAndConstants_n311 = 1;
|
||||||
|
ue_TransmissionMode = 2;
|
||||||
|
|
||||||
|
//Parameters for SIB18
|
||||||
|
rxPool_sc_CP_Len = "normal";
|
||||||
|
rxPool_sc_Period = "sf40";
|
||||||
|
rxPool_data_CP_Len = "normal";
|
||||||
|
rxPool_ResourceConfig_prb_Num = 20;
|
||||||
|
rxPool_ResourceConfig_prb_Start = 5;
|
||||||
|
rxPool_ResourceConfig_prb_End = 44;
|
||||||
|
rxPool_ResourceConfig_offsetIndicator_present = "prSmall";
|
||||||
|
rxPool_ResourceConfig_offsetIndicator_choice = 0;
|
||||||
|
rxPool_ResourceConfig_subframeBitmap_present = "prBs40";
|
||||||
|
rxPool_ResourceConfig_subframeBitmap_choice_bs_buf = "00000000000000000000";
|
||||||
|
rxPool_ResourceConfig_subframeBitmap_choice_bs_size = 5;
|
||||||
|
rxPool_ResourceConfig_subframeBitmap_choice_bs_bits_unused = 0;
|
||||||
|
/* rxPool_dataHoppingConfig_hoppingParameter = 0;
|
||||||
|
rxPool_dataHoppingConfig_numSubbands = "ns1";
|
||||||
|
rxPool_dataHoppingConfig_rbOffset = 0;
|
||||||
|
rxPool_commTxResourceUC-ReqAllowed = "TRUE";
|
||||||
|
*/
|
||||||
|
// Parameters for SIB19
|
||||||
|
discRxPool_cp_Len = "normal"
|
||||||
|
discRxPool_discPeriod = "rf32"
|
||||||
|
discRxPool_numRetx = 1;
|
||||||
|
discRxPool_numRepetition = 2;
|
||||||
|
discRxPool_ResourceConfig_prb_Num = 5;
|
||||||
|
discRxPool_ResourceConfig_prb_Start = 3;
|
||||||
|
discRxPool_ResourceConfig_prb_End = 21;
|
||||||
|
discRxPool_ResourceConfig_offsetIndicator_present = "prSmall";
|
||||||
|
discRxPool_ResourceConfig_offsetIndicator_choice = 0;
|
||||||
|
discRxPool_ResourceConfig_subframeBitmap_present = "prBs40";
|
||||||
|
discRxPool_ResourceConfig_subframeBitmap_choice_bs_buf = "f0ffffffff";
|
||||||
|
discRxPool_ResourceConfig_subframeBitmap_choice_bs_size = 5;
|
||||||
|
discRxPool_ResourceConfig_subframeBitmap_choice_bs_bits_unused = 0;
|
||||||
|
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
|
||||||
|
srb1_parameters :
|
||||||
|
{
|
||||||
|
# timer_poll_retransmit = (ms) [5, 10, 15, 20,... 250, 300, 350, ... 500]
|
||||||
|
timer_poll_retransmit = 80;
|
||||||
|
|
||||||
|
# timer_reordering = (ms) [0,5, ... 100, 110, 120, ... ,200]
|
||||||
|
timer_reordering = 35;
|
||||||
|
|
||||||
|
# timer_reordering = (ms) [0,5, ... 250, 300, 350, ... ,500]
|
||||||
|
timer_status_prohibit = 0;
|
||||||
|
|
||||||
|
# poll_pdu = [4, 8, 16, 32 , 64, 128, 256, infinity(>10000)]
|
||||||
|
poll_pdu = 4;
|
||||||
|
|
||||||
|
# poll_byte = (kB) [25,50,75,100,125,250,375,500,750,1000,1250,1500,2000,3000,infinity(>10000)]
|
||||||
|
poll_byte = 99999;
|
||||||
|
|
||||||
|
# max_retx_threshold = [1, 2, 3, 4 , 6, 8, 16, 32]
|
||||||
|
max_retx_threshold = 4;
|
||||||
|
}
|
||||||
|
|
||||||
|
# ------- SCTP definitions
|
||||||
|
SCTP :
|
||||||
|
{
|
||||||
|
# Number of streams to use in input/output
|
||||||
|
SCTP_INSTREAMS = 2;
|
||||||
|
SCTP_OUTSTREAMS = 2;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
////////// MME parameters:
|
||||||
|
mme_ip_address = ( { ipv4 = "CI_MME_IP_ADDR";
|
||||||
|
ipv6 = "192:168:30::17";
|
||||||
|
active = "yes";
|
||||||
|
preference = "ipv4";
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
enable_measurement_reports = "no";
|
||||||
|
|
||||||
|
///X2
|
||||||
|
enable_x2 = "yes";
|
||||||
|
t_reloc_prep = 1000; /* unit: millisecond */
|
||||||
|
tx2_reloc_overall = 2000; /* unit: millisecond */
|
||||||
|
t_dc_prep = 1000; /* unit: millisecond */
|
||||||
|
t_dc_overall = 2000; /* unit: millisecond */
|
||||||
|
|
||||||
|
NETWORK_INTERFACES :
|
||||||
|
{
|
||||||
|
ENB_INTERFACE_NAME_FOR_S1_MME = "eno1";
|
||||||
|
ENB_IPV4_ADDRESS_FOR_S1_MME = "CI_ENB_IP_ADDR";
|
||||||
|
ENB_INTERFACE_NAME_FOR_S1U = "eno1";
|
||||||
|
ENB_IPV4_ADDRESS_FOR_S1U = "CI_ENB_IP_ADDR";
|
||||||
|
ENB_PORT_FOR_S1U = 2152; # Spec 2152
|
||||||
|
ENB_IPV4_ADDRESS_FOR_X2C = "CI_ENB_IP_ADDR";
|
||||||
|
ENB_PORT_FOR_X2C = 36422; # Spec 36422
|
||||||
|
};
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
MACRLCs = (
|
||||||
|
{
|
||||||
|
num_cc = 1;
|
||||||
|
tr_s_preference = "local_L1";
|
||||||
|
tr_n_preference = "local_RRC";
|
||||||
|
phy_test_mode = 0;
|
||||||
|
scheduler_mode = "fairRR";
|
||||||
|
bler_target_upper = 20.0;
|
||||||
|
bler_target_lower = 10.0;
|
||||||
|
max_ul_rb_index = 27;
|
||||||
|
puSch10xSnr = 200;
|
||||||
|
puCch10xSnr = 150;
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
L1s = (
|
||||||
|
{
|
||||||
|
num_cc = 1;
|
||||||
|
tr_n_preference = "local_mac";
|
||||||
|
prach_dtx_threshold = 200;
|
||||||
|
pucch1_dtx_threshold = 5
|
||||||
|
pucch1ab_dtx_threshold =0;
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
RUs = (
|
||||||
|
{
|
||||||
|
local_rf = "yes"
|
||||||
|
nb_tx = 2
|
||||||
|
nb_rx = 2
|
||||||
|
att_tx = 0
|
||||||
|
att_rx = 0;
|
||||||
|
bands = [38];
|
||||||
|
max_pdschReferenceSignalPower = -27;
|
||||||
|
max_rxgain = 75;
|
||||||
|
eNB_instances = [0];
|
||||||
|
sdr_addrs = "mgmt_addr=192.168.18.241,addr=192.168.20.2,second_addr=192.168.10.2";
|
||||||
|
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
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";
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
NETWORK_CONTROLLER :
|
||||||
|
{
|
||||||
|
FLEXRAN_ENABLED = "no";
|
||||||
|
FLEXRAN_INTERFACE_NAME = "lo";
|
||||||
|
FLEXRAN_IPV4_ADDRESS = "127.0.0.1";
|
||||||
|
FLEXRAN_PORT = 2210;
|
||||||
|
FLEXRAN_CACHE = "/mnt/oai_agent_cache";
|
||||||
|
FLEXRAN_AWAIT_RECONF = "no";
|
||||||
|
};
|
||||||
|
|
||||||
|
log_config :
|
||||||
|
{
|
||||||
|
global_log_level ="info";
|
||||||
|
global_log_verbosity ="medium";
|
||||||
|
hw_log_level ="info";
|
||||||
|
hw_log_verbosity ="medium";
|
||||||
|
phy_log_level ="info";
|
||||||
|
phy_log_verbosity ="medium";
|
||||||
|
mac_log_level ="info";
|
||||||
|
mac_log_verbosity ="high";
|
||||||
|
rlc_log_level ="info";
|
||||||
|
rlc_log_verbosity ="medium";
|
||||||
|
pdcp_log_level ="info";
|
||||||
|
pdcp_log_verbosity ="medium";
|
||||||
|
rrc_log_level ="info";
|
||||||
|
rrc_log_verbosity ="medium";
|
||||||
|
};
|
||||||
|
|
||||||
@@ -232,7 +232,7 @@ L1s = (
|
|||||||
{
|
{
|
||||||
num_cc = 1;
|
num_cc = 1;
|
||||||
tr_n_preference = "local_mac";
|
tr_n_preference = "local_mac";
|
||||||
thread_pool_size = 2;
|
thread_pool_size = 8;
|
||||||
prach_dtx_threshold = 120;
|
prach_dtx_threshold = 120;
|
||||||
pucch0_dtx_threshold = 150;
|
pucch0_dtx_threshold = 150;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -229,7 +229,7 @@ L1s = (
|
|||||||
{
|
{
|
||||||
num_cc = 1;
|
num_cc = 1;
|
||||||
tr_n_preference = "local_mac";
|
tr_n_preference = "local_mac";
|
||||||
thread_pool_size = 2;
|
thread_pool_size = 8;
|
||||||
prach_dtx_threshold = 120;
|
prach_dtx_threshold = 120;
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
|
|||||||
@@ -44,6 +44,7 @@ ENB_PROCESS_ASSERTION = -12
|
|||||||
ENB_PROCESS_REALTIME_ISSUE = -13
|
ENB_PROCESS_REALTIME_ISSUE = -13
|
||||||
ENB_PROCESS_NOLOGFILE_TO_ANALYZE = -14
|
ENB_PROCESS_NOLOGFILE_TO_ANALYZE = -14
|
||||||
ENB_PROCESS_SLAVE_RRU_NOT_SYNCED = -15
|
ENB_PROCESS_SLAVE_RRU_NOT_SYNCED = -15
|
||||||
|
ENB_REAL_TIME_PROCESSING_ISSUE = -16
|
||||||
HSS_PROCESS_FAILED = -2
|
HSS_PROCESS_FAILED = -2
|
||||||
HSS_PROCESS_OK = +2
|
HSS_PROCESS_OK = +2
|
||||||
MME_PROCESS_FAILED = -3
|
MME_PROCESS_FAILED = -3
|
||||||
|
|||||||
@@ -0,0 +1,35 @@
|
|||||||
|
#this is a configuration file
|
||||||
|
#used to build real time processing statistics
|
||||||
|
#for 5G NR phy test (gNB terminate)
|
||||||
|
Title : Processing Time (us)
|
||||||
|
ColNames :
|
||||||
|
- Metric
|
||||||
|
- Average
|
||||||
|
- Max
|
||||||
|
- Average vs Reference Deviation (Reference Value ; Acceptability Threshold)
|
||||||
|
Ref :
|
||||||
|
feprx : 120.0
|
||||||
|
feptx_prec : 8.0
|
||||||
|
feptx_ofdm : 50.0
|
||||||
|
feptx_total : 75.0
|
||||||
|
L1 Tx processing thread 0 : 300.0
|
||||||
|
L1 Tx processing thread 1 : 300.0
|
||||||
|
DLSCH encoding : 230.0
|
||||||
|
L1 Rx processing : 175.0
|
||||||
|
PUSCH inner-receiver : 100.0
|
||||||
|
PUSCH decoding : 180.0
|
||||||
|
DL & UL scheduling timing stats : 37.0
|
||||||
|
UL Indication : 38.0
|
||||||
|
Threshold :
|
||||||
|
feprx : 1.25
|
||||||
|
feptx_prec : 1.25
|
||||||
|
feptx_ofdm : 1.25
|
||||||
|
feptx_total : 1.25
|
||||||
|
L1 Tx processing thread 0 : 1.25
|
||||||
|
L1 Tx processing thread 1 : 1.25
|
||||||
|
DLSCH encoding : 1.25
|
||||||
|
L1 Rx processing : 1.25
|
||||||
|
PUSCH inner-receiver : 1.25
|
||||||
|
PUSCH decoding : 1.25
|
||||||
|
DL & UL scheduling timing stats : 1.25
|
||||||
|
UL Indication : 1.25
|
||||||
+5
-3
@@ -133,7 +133,7 @@ class EPCManagement():
|
|||||||
mySSH.open(self.IPAddress, self.UserName, self.Password)
|
mySSH.open(self.IPAddress, self.UserName, self.Password)
|
||||||
if re.match('OAI-Rel14-Docker', self.Type, re.IGNORECASE):
|
if re.match('OAI-Rel14-Docker', self.Type, re.IGNORECASE):
|
||||||
logging.debug('Using the OAI EPC Release 14 MME in Docker')
|
logging.debug('Using the OAI EPC Release 14 MME in Docker')
|
||||||
mySSH.command('docker exec -d ' + self.containerPrefix + '-oai-mme /bin/bash -c "nohup tshark -i eth0 -i lo:s10 -w /tmp/mme_check_run.pcap 2>&1 > /dev/null"', '\$', 5)
|
mySSH.command('docker exec -d ' + self.containerPrefix + '-oai-mme /bin/bash -c "nohup tshark -i eth0 -i lo:s10 -f "not port 2152" -w /tmp/mme_check_run.pcap 2>&1 > /dev/null"', '\$', 5)
|
||||||
time.sleep(5)
|
time.sleep(5)
|
||||||
mySSH.command('docker exec -d ' + self.containerPrefix + '-oai-mme /bin/bash -c "nohup ./bin/oai_mme -c ./etc/' + self.mmeConfFile + ' > mme_check_run.log 2>&1"', '\$', 5)
|
mySSH.command('docker exec -d ' + self.containerPrefix + '-oai-mme /bin/bash -c "nohup ./bin/oai_mme -c ./etc/' + self.mmeConfFile + ' > mme_check_run.log 2>&1"', '\$', 5)
|
||||||
elif re.match('OAI-Rel14-CUPS', self.Type, re.IGNORECASE):
|
elif re.match('OAI-Rel14-CUPS', self.Type, re.IGNORECASE):
|
||||||
@@ -198,8 +198,8 @@ class EPCManagement():
|
|||||||
mySSH.open(self.IPAddress, self.UserName, self.Password)
|
mySSH.open(self.IPAddress, self.UserName, self.Password)
|
||||||
if re.match('OAI-Rel14-Docker', self.Type, re.IGNORECASE):
|
if re.match('OAI-Rel14-Docker', self.Type, re.IGNORECASE):
|
||||||
logging.debug('Using the OAI EPC Release 14 SPGW-CUPS in Docker')
|
logging.debug('Using the OAI EPC Release 14 SPGW-CUPS in Docker')
|
||||||
mySSH.command('docker exec -d ' + self.containerPrefix + '-oai-spgwc /bin/bash -c "nohup tshark -i eth0 -i lo:p5c -i lo:s5c -w /tmp/spgwc_check_run.pcap 2>&1 > /dev/null"', '\$', 5)
|
mySSH.command('docker exec -d ' + self.containerPrefix + '-oai-spgwc /bin/bash -c "nohup tshark -i eth0 -i lo:p5c -i lo:s5c -f "not port 2152" -w /tmp/spgwc_check_run.pcap 2>&1 > /dev/null"', '\$', 5)
|
||||||
mySSH.command('docker exec -d ' + self.containerPrefix + '-oai-spgwu-tiny /bin/bash -c "nohup tshark -i eth0 -w /tmp/spgwu_check_run.pcap 2>&1 > /dev/null"', '\$', 5)
|
mySSH.command('docker exec -d ' + self.containerPrefix + '-oai-spgwu-tiny /bin/bash -c "nohup tshark -i eth0 -f "not port 2152" -w /tmp/spgwu_check_run.pcap 2>&1 > /dev/null"', '\$', 5)
|
||||||
time.sleep(5)
|
time.sleep(5)
|
||||||
mySSH.command('docker exec -d ' + self.containerPrefix + '-oai-spgwc /bin/bash -c "nohup ./bin/oai_spgwc -o -c ./etc/spgw_c.conf > spgwc_check_run.log 2>&1"', '\$', 5)
|
mySSH.command('docker exec -d ' + self.containerPrefix + '-oai-spgwc /bin/bash -c "nohup ./bin/oai_spgwc -o -c ./etc/spgw_c.conf > spgwc_check_run.log 2>&1"', '\$', 5)
|
||||||
time.sleep(5)
|
time.sleep(5)
|
||||||
@@ -532,6 +532,7 @@ class EPCManagement():
|
|||||||
logging.debug('Terminating OAI CN5G')
|
logging.debug('Terminating OAI CN5G')
|
||||||
mySSH.command('cd /opt/oai-cn5g-fed/docker-compose', '\$', 5)
|
mySSH.command('cd /opt/oai-cn5g-fed/docker-compose', '\$', 5)
|
||||||
mySSH.command('./core-network.sh stop nrf spgwu', '\$', 60)
|
mySSH.command('./core-network.sh stop nrf spgwu', '\$', 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.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())
|
||||||
@@ -760,6 +761,7 @@ class EPCManagement():
|
|||||||
nbContainers += 1
|
nbContainers += 1
|
||||||
|
|
||||||
mySSH.command('docker-compose down', '\$', 60)
|
mySSH.command('docker-compose down', '\$', 60)
|
||||||
|
mySSH.command('docker volume prune --force || true', '\$', 60)
|
||||||
mySSH.command('docker inspect --format=\'{{.State.Health.Status}}\' ' + listOfContainers, '\$', 10)
|
mySSH.command('docker inspect --format=\'{{.State.Health.Status}}\' ' + listOfContainers, '\$', 10)
|
||||||
noMoreContainerNb = mySSH.getBefore().count('No such object')
|
noMoreContainerNb = mySSH.getBefore().count('No such object')
|
||||||
mySSH.command('docker inspect --format=\'{{.Name}}\' prod-oai-public-net prod-oai-private-net', '\$', 10)
|
mySSH.command('docker inspect --format=\'{{.Name}}\' prod-oai-public-net prod-oai-private-net', '\$', 10)
|
||||||
|
|||||||
+6
-1
@@ -155,6 +155,11 @@ def GetParametersFromXML(action):
|
|||||||
elif action == 'Initialize_eNB':
|
elif action == 'Initialize_eNB':
|
||||||
RAN.eNB_Trace=test.findtext('eNB_Trace')
|
RAN.eNB_Trace=test.findtext('eNB_Trace')
|
||||||
RAN.eNB_Stats=test.findtext('eNB_Stats')
|
RAN.eNB_Stats=test.findtext('eNB_Stats')
|
||||||
|
datalog_rt_stats_file=test.findtext('rt_stats_cfg')
|
||||||
|
if datalog_rt_stats_file is None:
|
||||||
|
RAN.datalog_rt_stats_file='datalog_rt_stats.default.yaml'
|
||||||
|
else:
|
||||||
|
RAN.datalog_rt_stats_file=datalog_rt_stats_file
|
||||||
RAN.Initialize_eNB_args=test.findtext('Initialize_eNB_args')
|
RAN.Initialize_eNB_args=test.findtext('Initialize_eNB_args')
|
||||||
eNB_instance=test.findtext('eNB_instance')
|
eNB_instance=test.findtext('eNB_instance')
|
||||||
USRPIPAddress=test.findtext('USRP_IPAddress')
|
USRPIPAddress=test.findtext('USRP_IPAddress')
|
||||||
@@ -909,7 +914,7 @@ elif re.match('^TesteNB$', mode, re.IGNORECASE) or re.match('^TestUE$', mode, re
|
|||||||
if CONTAINERS.exitStatus==1:
|
if CONTAINERS.exitStatus==1:
|
||||||
RAN.prematureExit = True
|
RAN.prematureExit = True
|
||||||
elif action == 'UndeployGenObject':
|
elif action == 'UndeployGenObject':
|
||||||
CONTAINERS.UndeployGenObject(HTML)
|
CONTAINERS.UndeployGenObject(HTML, RAN)
|
||||||
if CONTAINERS.exitStatus==1:
|
if CONTAINERS.exitStatus==1:
|
||||||
RAN.prematureExit = True
|
RAN.prematureExit = True
|
||||||
elif action == 'PingFromContainer':
|
elif action == 'PingFromContainer':
|
||||||
|
|||||||
+29
-15
@@ -92,6 +92,7 @@ class RANManagement():
|
|||||||
self.epcPcapFile = ''
|
self.epcPcapFile = ''
|
||||||
self.runtime_stats= ''
|
self.runtime_stats= ''
|
||||||
self.datalog_rt_stats={}
|
self.datalog_rt_stats={}
|
||||||
|
self.datalog_rt_stats_file='datalog_rt_stats.default.yaml'
|
||||||
self.eNB_Trace = '' #if 'yes', Tshark will be launched at initialization
|
self.eNB_Trace = '' #if 'yes', Tshark will be launched at initialization
|
||||||
self.eNB_Stats = '' #if 'yes', Statistics Monitor will be launched at initialization
|
self.eNB_Stats = '' #if 'yes', Statistics Monitor will be launched at initialization
|
||||||
self.USRPIPAddress = ''
|
self.USRPIPAddress = ''
|
||||||
@@ -159,6 +160,7 @@ class RANManagement():
|
|||||||
# Raphael: here add a check if git clone or git fetch went smoothly
|
# 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.email "jenkins@openairinterface.org"', '\$', 5)
|
||||||
mySSH.command('git config user.name "OAI Jenkins"', '\$', 5)
|
mySSH.command('git config user.name "OAI Jenkins"', '\$', 5)
|
||||||
|
mySSH.command('git advice.detachedHead false', '\$', 5)
|
||||||
# Checking the BUILD INFO file
|
# Checking the BUILD INFO file
|
||||||
if not self.backgroundBuild:
|
if not self.backgroundBuild:
|
||||||
mySSH.command('ls *.txt', '\$', 5)
|
mySSH.command('ls *.txt', '\$', 5)
|
||||||
@@ -203,6 +205,7 @@ class RANManagement():
|
|||||||
else:
|
else:
|
||||||
logging.debug('Merging with the target branch: ' + self.ranTargetBranch)
|
logging.debug('Merging with the target branch: ' + self.ranTargetBranch)
|
||||||
mySSH.command('git merge --ff origin/' + self.ranTargetBranch + ' -m "Temporary merge for CI"', '\$', 5)
|
mySSH.command('git merge --ff origin/' + self.ranTargetBranch + ' -m "Temporary merge for CI"', '\$', 5)
|
||||||
|
logging.debug(mySSH.getBefore()) # print what git said when merging/checking out
|
||||||
mySSH.command('source oaienv', '\$', 5)
|
mySSH.command('source oaienv', '\$', 5)
|
||||||
mySSH.command('cd cmake_targets', '\$', 5)
|
mySSH.command('cd cmake_targets', '\$', 5)
|
||||||
mySSH.command('mkdir -p log', '\$', 5)
|
mySSH.command('mkdir -p log', '\$', 5)
|
||||||
@@ -212,6 +215,7 @@ class RANManagement():
|
|||||||
mySSH.command('echo "./build_oai ' + self.Build_eNB_args + '" > ./my-lte-softmodem-build.sh', '\$', 5)
|
mySSH.command('echo "./build_oai ' + self.Build_eNB_args + '" > ./my-lte-softmodem-build.sh', '\$', 5)
|
||||||
mySSH.command('chmod 775 ./my-lte-softmodem-build.sh', '\$', 5)
|
mySSH.command('chmod 775 ./my-lte-softmodem-build.sh', '\$', 5)
|
||||||
mySSH.command('echo ' + lPassWord + ' | sudo -S ls', '\$', 5)
|
mySSH.command('echo ' + lPassWord + ' | sudo -S ls', '\$', 5)
|
||||||
|
logging.debug(mySSH.getBefore()) # print current directory contents for verification
|
||||||
mySSH.command('echo $USER; nohup sudo -E ./my-lte-softmodem-build.sh' + ' > ' + lSourcePath + '/cmake_targets/compile_oai_enb.log ' + ' 2>&1 &', lUserName, 5)
|
mySSH.command('echo $USER; nohup sudo -E ./my-lte-softmodem-build.sh' + ' > ' + lSourcePath + '/cmake_targets/compile_oai_enb.log ' + ' 2>&1 &', lUserName, 5)
|
||||||
mySSH.close()
|
mySSH.close()
|
||||||
HTML.CreateHtmlTestRow(self.Build_eNB_args, 'OK', CONST.ALL_PROCESSES_OK)
|
HTML.CreateHtmlTestRow(self.Build_eNB_args, 'OK', CONST.ALL_PROCESSES_OK)
|
||||||
@@ -371,10 +375,11 @@ class RANManagement():
|
|||||||
result = re.search('interfaceToUse=(?P<eth_interface>[a-zA-Z0-9\-\_]+)done', mySSH.getBefore())
|
result = re.search('interfaceToUse=(?P<eth_interface>[a-zA-Z0-9\-\_]+)done', mySSH.getBefore())
|
||||||
if result is not None:
|
if result is not None:
|
||||||
eth_interface = result.group('eth_interface')
|
eth_interface = result.group('eth_interface')
|
||||||
logging.debug('\u001B[1m Launching tshark on interface ' + eth_interface + '\u001B[0m')
|
fltr = 'port 38412 or port 36412 or port 36422' # NGAP, S1AP, X2AP
|
||||||
|
logging.debug('\u001B[1m Launching tshark on interface ' + eth_interface + ' with filter "' + fltr + '"\u001B[0m')
|
||||||
pcapfile = pcapfile_prefix + self.testCase_id + '_log.pcap'
|
pcapfile = pcapfile_prefix + self.testCase_id + '_log.pcap'
|
||||||
mySSH.command('echo ' + lPassWord + ' | sudo -S rm -f /tmp/' + pcapfile , '\$', 5)
|
mySSH.command('echo ' + lPassWord + ' | sudo -S rm -f /tmp/' + pcapfile , '\$', 5)
|
||||||
mySSH.command('echo $USER; nohup sudo -E tshark -i ' + eth_interface + ' -w /tmp/' + pcapfile + ' > /dev/null 2>&1 &','\$', 5)
|
mySSH.command('echo $USER; nohup sudo -E tshark -i ' + eth_interface + ' -f "' + fltr + '" -w /tmp/' + pcapfile + ' > /dev/null 2>&1 &','\$', 5)
|
||||||
mySSH.close()
|
mySSH.close()
|
||||||
|
|
||||||
|
|
||||||
@@ -390,10 +395,11 @@ class RANManagement():
|
|||||||
result = re.search('interfaceToUse=(?P<eth_interface>[a-zA-Z0-9\-\_]+)done', mySSH.getBefore())
|
result = re.search('interfaceToUse=(?P<eth_interface>[a-zA-Z0-9\-\_]+)done', mySSH.getBefore())
|
||||||
if result is not None:
|
if result is not None:
|
||||||
eth_interface = result.group('eth_interface')
|
eth_interface = result.group('eth_interface')
|
||||||
logging.debug('\u001B[1m Launching tshark on interface ' + eth_interface + '\u001B[0m')
|
fltr = 'port 38412 or port 36412 or port 36422' # NGAP, S1AP, X2AP
|
||||||
|
logging.debug('\u001B[1m Launching tshark on interface ' + eth_interface + ' with filter "' + fltr + '"\u001B[0m')
|
||||||
self.epcPcapFile = 'enb_' + self.testCase_id + '_s1log.pcap'
|
self.epcPcapFile = 'enb_' + self.testCase_id + '_s1log.pcap'
|
||||||
mySSH.command('echo ' + localEpcPassword + ' | sudo -S rm -f /tmp/' + self.epcPcapFile , '\$', 5)
|
mySSH.command('echo ' + localEpcPassword + ' | sudo -S rm -f /tmp/' + self.epcPcapFile , '\$', 5)
|
||||||
mySSH.command('echo $USER; nohup sudo tshark -f "host ' + lIpAddr +'" -i ' + eth_interface + ' -w /tmp/' + self.epcPcapFile + ' > /tmp/tshark.log 2>&1 &', localEpcUserName, 5)
|
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.close()
|
||||||
mySSH.open(lIpAddr, lUserName, lPassWord)
|
mySSH.open(lIpAddr, lUserName, lPassWord)
|
||||||
mySSH.command('cd ' + lSourcePath, '\$', 5)
|
mySSH.command('cd ' + lSourcePath, '\$', 5)
|
||||||
@@ -717,6 +723,9 @@ class RANManagement():
|
|||||||
logStatus = self.AnalyzeLogFile_eNB(fileToAnalyze, HTML)
|
logStatus = self.AnalyzeLogFile_eNB(fileToAnalyze, HTML)
|
||||||
if (logStatus < 0):
|
if (logStatus < 0):
|
||||||
HTML.CreateHtmlTestRow('N/A', 'KO', logStatus)
|
HTML.CreateHtmlTestRow('N/A', 'KO', logStatus)
|
||||||
|
#display rt stats for gNB only
|
||||||
|
if len(self.datalog_rt_stats)!=0 and nodeB_prefix == 'g':
|
||||||
|
HTML.CreateHtmlDataLogTable(self.datalog_rt_stats)
|
||||||
self.prematureExit = True
|
self.prematureExit = True
|
||||||
self.eNBmbmsEnables[int(self.eNB_instance)] = False
|
self.eNBmbmsEnables[int(self.eNB_instance)] = False
|
||||||
return
|
return
|
||||||
@@ -738,7 +747,10 @@ class RANManagement():
|
|||||||
mySSH.command('echo ' + self.eNBPassword + ' | sudo -S mv /tmp/enb_*.pcap .','\$',20)
|
mySSH.command('echo ' + self.eNBPassword + ' | sudo -S mv /tmp/enb_*.pcap .','\$',20)
|
||||||
mySSH.command('echo ' + self.eNBPassword + ' | sudo -S mv /tmp/gnb_*.pcap .','\$',20)
|
mySSH.command('echo ' + self.eNBPassword + ' | sudo -S mv /tmp/gnb_*.pcap .','\$',20)
|
||||||
mySSH.command('echo ' + self.eNBPassword + ' | sudo -S rm -f enb.log.zip', '\$', 5)
|
mySSH.command('echo ' + self.eNBPassword + ' | sudo -S rm -f enb.log.zip', '\$', 5)
|
||||||
mySSH.command('echo ' + self.eNBPassword + ' | sudo -S zip enb.log.zip enb*.log core* enb_*record.raw enb_*.pcap gnb_*.pcap enb_*txt physim_*.log *stats.log *monitor.pickle *monitor*.png ping*.log.png log/*/*.log log/*/*.pcap', '\$', 60)
|
mySSH.command('echo ' + self.eNBPassword + ' | sudo -S zip enb.log.zip enb*.log enb_*record.raw enb_*.pcap gnb_*.pcap enb_*txt physim_*.log *stats.log *monitor.pickle *monitor*.png ping*.log.png log/*/*.log log/*/*.pcap', '\$', 60)
|
||||||
|
result = re.search('core.\d+', mySSH.getBefore())
|
||||||
|
if result is not None:
|
||||||
|
mySSH.command('echo ' + self.eNBPassword + ' | sudo -S zip enb.log.zip core* ran_build/build/{lte,nr}-softmodem', '\$', 60) # add core and executable to zip
|
||||||
mySSH.command('echo ' + self.eNBPassword + ' | sudo -S rm enb*.log core* enb_*record.raw enb_*.pcap gnb_*.pcap enb_*txt physim_*.log *stats.log *monitor.pickle *monitor*.png ping*.log.png log/*/*.log log/*/*.pcap', '\$', 15)
|
mySSH.command('echo ' + self.eNBPassword + ' | sudo -S rm enb*.log core* enb_*record.raw enb_*.pcap gnb_*.pcap enb_*txt physim_*.log *stats.log *monitor.pickle *monitor*.png ping*.log.png log/*/*.log log/*/*.pcap', '\$', 15)
|
||||||
mySSH.close()
|
mySSH.close()
|
||||||
|
|
||||||
@@ -802,6 +814,7 @@ class RANManagement():
|
|||||||
#NSA specific log markers
|
#NSA specific log markers
|
||||||
nsa_markers ={'SgNBReleaseRequestAcknowledge': [],'FAILURE': [], 'scgFailureInformationNR-r15': [], 'SgNBReleaseRequest': []}
|
nsa_markers ={'SgNBReleaseRequestAcknowledge': [],'FAILURE': [], 'scgFailureInformationNR-r15': [], 'SgNBReleaseRequest': []}
|
||||||
nodeB_prefix_found = False
|
nodeB_prefix_found = False
|
||||||
|
RealTimeProcessingIssue = False
|
||||||
|
|
||||||
line_cnt=0 #log file line counter
|
line_cnt=0 #log file line counter
|
||||||
for line in enb_log_file.readlines():
|
for line in enb_log_file.readlines():
|
||||||
@@ -1003,7 +1016,7 @@ class RANManagement():
|
|||||||
#the following part takes the *_stats.log files as source (not the stdout log file)
|
#the following part takes the *_stats.log files as source (not the stdout log file)
|
||||||
|
|
||||||
#the datalog config file has to be loaded
|
#the datalog config file has to be loaded
|
||||||
datalog_rt_stats_file='datalog_rt_stats.yaml'
|
datalog_rt_stats_file=self.datalog_rt_stats_file
|
||||||
if (os.path.isfile(datalog_rt_stats_file)):
|
if (os.path.isfile(datalog_rt_stats_file)):
|
||||||
yaml_file=datalog_rt_stats_file
|
yaml_file=datalog_rt_stats_file
|
||||||
elif (os.path.isfile('ci-scripts/'+datalog_rt_stats_file)):
|
elif (os.path.isfile('ci-scripts/'+datalog_rt_stats_file)):
|
||||||
@@ -1016,12 +1029,9 @@ class RANManagement():
|
|||||||
datalog_rt_stats = yaml.load(f,Loader=yaml.FullLoader)
|
datalog_rt_stats = yaml.load(f,Loader=yaml.FullLoader)
|
||||||
rt_keys = datalog_rt_stats['Ref'] #we use the keys from the Ref field
|
rt_keys = datalog_rt_stats['Ref'] #we use the keys from the Ref field
|
||||||
|
|
||||||
if (os.path.isfile('./nrL1_stats.log')) and (os.path.isfile('./nrL1_stats.log')):
|
if os.path.isfile('./nrL1_stats.log') and os.path.isfile('./nrMAC_stats.log'):
|
||||||
stat_files_present=True
|
# don't use CI-nrL1_stats.log, as this will increase the processing time for
|
||||||
else:
|
# no reason, we just need the last occurence
|
||||||
stat_files_present=False
|
|
||||||
logging.debug("NR Stats files for RT analysis not found")
|
|
||||||
if stat_files_present:
|
|
||||||
nrL1_stats = open('./nrL1_stats.log', 'r')
|
nrL1_stats = open('./nrL1_stats.log', 'r')
|
||||||
nrMAC_stats = open('./nrMAC_stats.log', 'r')
|
nrMAC_stats = open('./nrMAC_stats.log', 'r')
|
||||||
for line in nrL1_stats.readlines():
|
for line in nrL1_stats.readlines():
|
||||||
@@ -1042,6 +1052,8 @@ class RANManagement():
|
|||||||
real_time_stats[k]=tmp.group(1)
|
real_time_stats[k]=tmp.group(1)
|
||||||
nrL1_stats.close()
|
nrL1_stats.close()
|
||||||
nrMAC_stats.close()
|
nrMAC_stats.close()
|
||||||
|
else:
|
||||||
|
logging.debug("NR Stats files for RT analysis not found")
|
||||||
|
|
||||||
#stdout log file and stat log files analysis completed
|
#stdout log file and stat log files analysis completed
|
||||||
logging.debug(' File analysis (stdout, stats) completed')
|
logging.debug(' File analysis (stdout, stats) completed')
|
||||||
@@ -1120,8 +1132,7 @@ class RANManagement():
|
|||||||
#check if there is a fail => will render the test as failed
|
#check if there is a fail => will render the test as failed
|
||||||
for k in datalog_rt_stats['Data']:
|
for k in datalog_rt_stats['Data']:
|
||||||
if float(datalog_rt_stats['Data'][k][2])> datalog_rt_stats['Threshold'][k]: #condition for fail : avg/ref is greater than the fixed threshold
|
if float(datalog_rt_stats['Data'][k][2])> datalog_rt_stats['Threshold'][k]: #condition for fail : avg/ref is greater than the fixed threshold
|
||||||
#setting prematureExit is ok although not the best option
|
RealTimeProcessingIssue = True
|
||||||
self.prematureExit=False #temp for debug : do not stop the test if RT stats are excedeed
|
|
||||||
else:
|
else:
|
||||||
statMsg = 'No real time stats found in the log file\n'
|
statMsg = 'No real time stats found in the log file\n'
|
||||||
logging.debug('No real time stats found in the log file')
|
logging.debug('No real time stats found in the log file')
|
||||||
@@ -1155,7 +1166,10 @@ class RANManagement():
|
|||||||
logging.debug(statMsg)
|
logging.debug(statMsg)
|
||||||
htmleNBFailureMsg += htmlMsg
|
htmleNBFailureMsg += htmlMsg
|
||||||
|
|
||||||
|
if RealTimeProcessingIssue:
|
||||||
|
logging.debug('\u001B[1;37;41m ' + nodeB_prefix + 'NB ended with real time processing issue! \u001B[0m')
|
||||||
|
htmleNBFailureMsg += 'Fail due to real time processing issue\n'
|
||||||
|
global_status = CONST.ENB_REAL_TIME_PROCESSING_ISSUE
|
||||||
if uciStatMsgCount > 0:
|
if uciStatMsgCount > 0:
|
||||||
statMsg = nodeB_prefix + 'NB showed ' + str(uciStatMsgCount) + ' "uci->stat" message(s)'
|
statMsg = nodeB_prefix + 'NB showed ' + str(uciStatMsgCount) + ' "uci->stat" message(s)'
|
||||||
logging.debug('\u001B[1;30;43m ' + statMsg + ' \u001B[0m')
|
logging.debug('\u001B[1;30;43m ' + statMsg + ' \u001B[0m')
|
||||||
|
|||||||
@@ -509,46 +509,87 @@ class Dashboard:
|
|||||||
s3.meta.client.copy(copy_source, 'oaitestdashboard', path+'/'+ 'test_styles.css')
|
s3.meta.client.copy(copy_source, 'oaitestdashboard', path+'/'+ 'test_styles.css')
|
||||||
|
|
||||||
|
|
||||||
def PostGitNote(self,mr,jobname,buildurl,buildid,status):
|
def PostGitNote(self,mr,commit,args):
|
||||||
gl = gitlab.Gitlab.from_config('OAI')
|
#current date and time to be posted with test results
|
||||||
project_id = 223
|
#now = datetime.now()
|
||||||
project = gl.projects.get(project_id)
|
#dt_string = now.strftime("%d/%m/%Y %H:%M")
|
||||||
editable_mr = project.mergerequests.get(int(mr))
|
|
||||||
mr_notes = editable_mr.notes.list()
|
if len(args)%4 != 0:
|
||||||
mr_note = editable_mr.notes.create({
|
print("Wrong Number of Arguments")
|
||||||
'body': 'Completed Test : '+jobname+', status: <b>'+status+'</b>, '+\
|
return
|
||||||
'(<a href="'+buildurl+'">'+buildid+'</a>)<br>'+\
|
else :
|
||||||
'<a href="https://oaitestdashboard.s3.eu-west-1.amazonaws.com/MR'+mr+'/index.html">Consolidated Test Results</a>'
|
n_tests=len(args)//4
|
||||||
})
|
|
||||||
editable_mr.save()
|
gl = gitlab.Gitlab.from_config('OAI')
|
||||||
|
project_id = 223
|
||||||
|
project = gl.projects.get(project_id)
|
||||||
|
|
||||||
|
#retrieve all the notes from the MR
|
||||||
|
editable_mr = project.mergerequests.get(int(mr))
|
||||||
|
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>'+\
|
||||||
|
'Tested CommitID: ' + commit + '<br>'
|
||||||
|
|
||||||
|
for i in range(0,n_tests):
|
||||||
|
jobname = args[4*i]
|
||||||
|
buildurl = args[4*i+1]
|
||||||
|
buildid = args[4*i+2]
|
||||||
|
status = args[4*i+3]
|
||||||
|
body += jobname+', status is <b>'+status+'</b>, (<a href="'+buildurl+'">'+buildid+'</a>)<br>'
|
||||||
|
|
||||||
|
#create new note
|
||||||
|
mr_note = editable_mr.notes.create({
|
||||||
|
'body': body
|
||||||
|
})
|
||||||
|
editable_mr.save()
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
def main():
|
def main():
|
||||||
|
|
||||||
#call from Jenkinsfile : sh "python3 Hdashboard.py testevent ${params.eNB_MR} ${JOB_NAME} ${env.BUILD_URL} ${env.BUILD_ID} ${StatusForDb} "
|
#call from slave Jenkinsfile : sh "python3 Hdashboard.py testevent ${params.eNB_MR} "
|
||||||
|
#call from master Jenkinsfile : sh "python3 Hdashboard.py gitpost ${GitPostArgs}"
|
||||||
|
|
||||||
|
|
||||||
#individual MR test results + test dashboard, event based (end of jenkins pipeline)
|
|
||||||
if len(sys.argv)>1:
|
if len(sys.argv)>1:
|
||||||
|
|
||||||
|
#individual MR test results + test dashboard, event based (end of slave jenkins pipeline)
|
||||||
if sys.argv[1]=="testevent" :
|
if sys.argv[1]=="testevent" :
|
||||||
mr=sys.argv[2]
|
mr=sys.argv[2]
|
||||||
jobname=sys.argv[3]
|
|
||||||
buildurl=sys.argv[4]
|
|
||||||
buildid=sys.argv[5]
|
|
||||||
status=sys.argv[6]
|
|
||||||
htmlDash=Dashboard()
|
htmlDash=Dashboard()
|
||||||
if mr in htmlDash.mr_list:
|
if mr in htmlDash.mr_list:
|
||||||
|
#single MR test results
|
||||||
htmlDash.Build('singleMR',mr,'/tmp/MR'+mr+'_index.html')
|
htmlDash.Build('singleMR',mr,'/tmp/MR'+mr+'_index.html')
|
||||||
htmlDash.CopyToS3('/tmp/MR'+mr+'_index.html','oaitestdashboard','MR'+mr+'/index.html')
|
htmlDash.CopyToS3('/tmp/MR'+mr+'_index.html','oaitestdashboard','MR'+mr+'/index.html')
|
||||||
|
#all MR test results
|
||||||
htmlDash.Build('Tests','0000','/tmp/Tests_index.html')
|
htmlDash.Build('Tests','0000','/tmp/Tests_index.html')
|
||||||
htmlDash.CopyToS3('/tmp/Tests_index.html','oaitestdashboard','index.html')
|
htmlDash.CopyToS3('/tmp/Tests_index.html','oaitestdashboard','index.html')
|
||||||
htmlDash.PostGitNote(mr,jobname,buildurl,buildid,status)
|
|
||||||
|
#git post with MR test results, event based (end of master jenkins pipeline)
|
||||||
|
elif sys.argv[1]=="gitpost":
|
||||||
|
mr=sys.argv[2]
|
||||||
|
commit=sys.argv[3]
|
||||||
|
args=[]
|
||||||
|
for i in range (4, len(sys.argv)): #jobname, url, id , result
|
||||||
|
args.append(sys.argv[i])
|
||||||
|
htmlDash=Dashboard()
|
||||||
|
if mr in htmlDash.mr_list:
|
||||||
|
htmlDash.PostGitNote(mr,commit, args)
|
||||||
else:
|
else:
|
||||||
print("Not a Merge Request => this build is for testing/debug purpose, no report to git")
|
print("Not a Merge Request => this build is for testing/debug purpose, no report to git")
|
||||||
#test and MR status dash boards, cron based
|
else:
|
||||||
|
print("Wrong argument at position 1")
|
||||||
|
|
||||||
|
|
||||||
|
#test and MR status dashboards, cron based
|
||||||
else:
|
else:
|
||||||
htmlDash=Dashboard()
|
htmlDash=Dashboard()
|
||||||
|
#all MR status dashboard
|
||||||
htmlDash.Build('MR','0000','/tmp/MR_index.html')
|
htmlDash.Build('MR','0000','/tmp/MR_index.html')
|
||||||
htmlDash.CopyToS3('/tmp/MR_index.html','oairandashboard','index.html')
|
htmlDash.CopyToS3('/tmp/MR_index.html','oairandashboard','index.html')
|
||||||
|
#all MR test results
|
||||||
htmlDash.Build('Tests','0000','/tmp/Tests_index.html')
|
htmlDash.Build('Tests','0000','/tmp/Tests_index.html')
|
||||||
htmlDash.CopyToS3('/tmp/Tests_index.html','oaitestdashboard','index.html')
|
htmlDash.CopyToS3('/tmp/Tests_index.html','oaitestdashboard','index.html')
|
||||||
|
|
||||||
|
|||||||
@@ -157,22 +157,24 @@ class SSHConnection():
|
|||||||
if not silent:
|
if not silent:
|
||||||
logging.debug(commandline)
|
logging.debug(commandline)
|
||||||
self.cmd2Results = ''
|
self.cmd2Results = ''
|
||||||
|
noHistoryCmd = 'unset HISTFILE; ' + commandline
|
||||||
myHost = self.username + '@' + self.ipaddress
|
myHost = self.username + '@' + self.ipaddress
|
||||||
# CAUTION: THIS METHOD IMPLIES THAT THERE ARE VALID SSH KEYS
|
# CAUTION: THIS METHOD IMPLIES THAT THERE ARE VALID SSH KEYS
|
||||||
# BETWEEN THE PYTHON EXECUTOR NODE AND THE REMOTE HOST
|
# BETWEEN THE PYTHON EXECUTOR NODE AND THE REMOTE HOST
|
||||||
# OTHERWISE IT WON'T WORK
|
# OTHERWISE IT WON'T WORK
|
||||||
lSsh = subprocess.Popen(["ssh", "%s" % myHost, commandline],shell=False,stdout=subprocess.PIPE,stderr=subprocess.PIPE)
|
lSsh = subprocess.Popen(["ssh", "%s" % myHost, noHistoryCmd],shell=False,stdout=subprocess.PIPE,stderr=subprocess.PIPE)
|
||||||
self.cmd2Results = str(lSsh.stdout.readlines())
|
self.cmd2Results = str(lSsh.stdout.readlines())
|
||||||
|
|
||||||
def command3(self, commandline, timeout, silent=False):
|
def command3(self, commandline, timeout, silent=False):
|
||||||
if not silent:
|
if not silent:
|
||||||
logging.debug(commandline)
|
logging.debug(commandline)
|
||||||
self.cmd2Results = ''
|
self.cmd2Results = ''
|
||||||
|
noHistoryCmd = 'unset HISTFILE; ' + commandline
|
||||||
myHost = self.username + '@' + self.ipaddress
|
myHost = self.username + '@' + self.ipaddress
|
||||||
# CAUTION: THIS METHOD IMPLIES THAT THERE ARE VALID SSH KEYS
|
# CAUTION: THIS METHOD IMPLIES THAT THERE ARE VALID SSH KEYS
|
||||||
# BETWEEN THE PYTHON EXECUTOR NODE AND THE REMOTE HOST
|
# BETWEEN THE PYTHON EXECUTOR NODE AND THE REMOTE HOST
|
||||||
# OTHERWISE IT WON'T WORK
|
# OTHERWISE IT WON'T WORK
|
||||||
lSsh = subprocess.Popen(["ssh", "%s" % myHost, commandline],shell=False,stdout=subprocess.PIPE,stderr=subprocess.PIPE)
|
lSsh = subprocess.Popen(["ssh", "%s" % myHost, noHistoryCmd],shell=False,stdout=subprocess.PIPE,stderr=subprocess.PIPE)
|
||||||
return lSsh.stdout.readlines()
|
return lSsh.stdout.readlines()
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -61,9 +61,16 @@ class StatMonitor():
|
|||||||
|
|
||||||
def collect(self,node_type):
|
def collect(self,node_type):
|
||||||
if node_type=='enb':
|
if node_type=='enb':
|
||||||
cmd='cat L1_stats.log MAC_stats.log PDCP_stats.log RRC_stats.log'
|
files = ["L1_stats.log", "MAC_stats.log", "PDCP_stats.log", "RRC_stats.log"]
|
||||||
else: #'gnb'
|
else: #'gnb'
|
||||||
cmd='cat nrL1_stats.log nrMAC_stats.log nrPDCP_stats.log nrRRC_stats.log'
|
files = ["nrL1_stats.log", "nrMAC_stats.log", "nrPDCP_stats.log", "nrRRC_stats.log"]
|
||||||
|
# append each file's contents to another file (prepended with CI-) for
|
||||||
|
# post-mortem/debugging analysis
|
||||||
|
for f in files:
|
||||||
|
cmd = rf'cat {f} >> CI-{f}'
|
||||||
|
subprocess.Popen(shlex.split(cmd))
|
||||||
|
# join the files for further processing
|
||||||
|
cmd = rf'cat {shlex.join(files)}'
|
||||||
process=subprocess.Popen(shlex.split(cmd), stdout=subprocess.PIPE)
|
process=subprocess.Popen(shlex.split(cmd), stdout=subprocess.PIPE)
|
||||||
output = process.stdout.readlines()
|
output = process.stdout.readlines()
|
||||||
if node_type=='enb':
|
if node_type=='enb':
|
||||||
|
|||||||
@@ -1,94 +0,0 @@
|
|||||||
import subprocess
|
|
||||||
import time
|
|
||||||
import shlex
|
|
||||||
import re
|
|
||||||
import sys
|
|
||||||
import matplotlib.pyplot as plt
|
|
||||||
import pickle
|
|
||||||
import numpy as np
|
|
||||||
import os
|
|
||||||
|
|
||||||
def collect(d, node_type):
|
|
||||||
if node_type=='enb':
|
|
||||||
cmd='cat L1_stats.log MAC_stats.log PDCP_stats.log RRC_stats.log'
|
|
||||||
else: #'gnb'
|
|
||||||
cmd='cat nrL1_stats.log nrMAC_stats.log nrPDCP_stats.log nrRRC_stats.log'
|
|
||||||
process=subprocess.Popen(shlex.split(cmd), stdout=subprocess.PIPE)
|
|
||||||
output = process.stdout.readlines()
|
|
||||||
for l in output:
|
|
||||||
tmp=l.decode("utf-8")
|
|
||||||
result=re.match(rf'^.*\bPHR\b ([0-9]+).+\bbler\b ([0-9]+\.[0-9]+).+\bmcsoff\b ([0-9]+).+\bmcs\b ([0-9]+)',tmp)
|
|
||||||
if result is not None:
|
|
||||||
d['PHR'].append(int(result.group(1)))
|
|
||||||
d['bler'].append(float(result.group(2)))
|
|
||||||
d['mcsoff'].append(int(result.group(3)))
|
|
||||||
d['mcs'].append(int(result.group(4)))
|
|
||||||
|
|
||||||
|
|
||||||
def graph(d, node_type):
|
|
||||||
|
|
||||||
|
|
||||||
figure, axis = plt.subplots(4, 1,figsize=(10, 10))
|
|
||||||
|
|
||||||
major_ticks = np.arange(0, len(d['PHR'])+1, 1)
|
|
||||||
axis[0].set_xticks(major_ticks)
|
|
||||||
axis[0].set_xticklabels([])
|
|
||||||
axis[0].plot(d['PHR'],marker='o')
|
|
||||||
axis[0].set_xlabel('time')
|
|
||||||
axis[0].set_ylabel('PHR')
|
|
||||||
axis[0].set_title("PHR")
|
|
||||||
|
|
||||||
major_ticks = np.arange(0, len(d['bler'])+1, 1)
|
|
||||||
axis[1].set_xticks(major_ticks)
|
|
||||||
axis[1].set_xticklabels([])
|
|
||||||
axis[1].plot(d['bler'],marker='o')
|
|
||||||
axis[1].set_xlabel('time')
|
|
||||||
axis[1].set_ylabel('bler')
|
|
||||||
axis[1].set_title("bler")
|
|
||||||
|
|
||||||
major_ticks = np.arange(0, len(d['mcsoff'])+1, 1)
|
|
||||||
axis[2].set_xticks(major_ticks)
|
|
||||||
axis[2].set_xticklabels([])
|
|
||||||
axis[2].plot(d['mcsoff'],marker='o')
|
|
||||||
axis[2].set_xlabel('time')
|
|
||||||
axis[2].set_ylabel('mcsoff')
|
|
||||||
axis[2].set_title("mcsoff")
|
|
||||||
|
|
||||||
major_ticks = np.arange(0, len(d['mcs'])+1, 1)
|
|
||||||
axis[3].set_xticks(major_ticks)
|
|
||||||
axis[3].set_xticklabels([])
|
|
||||||
axis[3].plot(d['mcs'],marker='o')
|
|
||||||
axis[3].set_xlabel('time')
|
|
||||||
axis[3].set_ylabel('mcs')
|
|
||||||
axis[3].set_title("mcs")
|
|
||||||
|
|
||||||
plt.tight_layout()
|
|
||||||
# Combine all the operations and display
|
|
||||||
plt.savefig(node_type+'_stats_monitor.png')
|
|
||||||
plt.show()
|
|
||||||
|
|
||||||
if __name__ == "__main__":
|
|
||||||
|
|
||||||
node_type = sys.argv[1]#enb or gnb
|
|
||||||
|
|
||||||
d={}
|
|
||||||
d['PHR']=[]
|
|
||||||
d['bler']=[]
|
|
||||||
d['mcsoff']=[]
|
|
||||||
d['mcs']=[]
|
|
||||||
|
|
||||||
|
|
||||||
cmd='ps aux | grep modem | grep -v grep'
|
|
||||||
process=subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE)
|
|
||||||
output = process.stdout.readlines()
|
|
||||||
while len(output)!=0 :
|
|
||||||
collect(d, node_type)
|
|
||||||
process=subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE)
|
|
||||||
output = process.stdout.readlines()
|
|
||||||
time.sleep(1)
|
|
||||||
print('process stopped')
|
|
||||||
with open(node_type+'_stats_monitor.pickle', 'wb') as handle:
|
|
||||||
pickle.dump(d, handle, protocol=pickle.HIGHEST_PROTOCOL)
|
|
||||||
graph(d, node_type)
|
|
||||||
|
|
||||||
|
|
||||||
@@ -1,101 +0,0 @@
|
|||||||
"""
|
|
||||||
To create graphs and pickle from runtime statistics in L1,MAC,RRC,PDCP files
|
|
||||||
"""
|
|
||||||
|
|
||||||
import subprocess
|
|
||||||
import time
|
|
||||||
import shlex
|
|
||||||
import re
|
|
||||||
import sys
|
|
||||||
import pickle
|
|
||||||
import matplotlib.pyplot as plt
|
|
||||||
import numpy as np
|
|
||||||
import yaml
|
|
||||||
|
|
||||||
|
|
||||||
class StatMonitor():
|
|
||||||
def __init__(self,):
|
|
||||||
with open('stats_monitor_conf.yaml','r') as file:
|
|
||||||
self.d = yaml.load(file)
|
|
||||||
for node in self.d:
|
|
||||||
for metric in self.d[node]:
|
|
||||||
self.d[node][metric]=[]
|
|
||||||
|
|
||||||
|
|
||||||
def process_gnb (self,node_type,output):
|
|
||||||
for line in output:
|
|
||||||
tmp=line.decode("utf-8")
|
|
||||||
result=re.match(r'^.*\bdlsch_rounds\b ([0-9]+)\/([0-9]+).*\bdlsch_errors\b ([0-9]+)',tmp)
|
|
||||||
if result is not None:
|
|
||||||
self.d[node_type]['dlsch_err'].append(int(result.group(3)))
|
|
||||||
percentage=float(result.group(2))/float(result.group(1))
|
|
||||||
self.d[node_type]['dlsch_err_perc_round_1'].append(percentage)
|
|
||||||
result=re.match(r'^.*\bulsch_rounds\b ([0-9]+)\/([0-9]+).*\bulsch_errors\b ([0-9]+)',tmp)
|
|
||||||
if result is not None:
|
|
||||||
self.d[node_type]['ulsch_err'].append(int(result.group(3)))
|
|
||||||
percentage=float(result.group(2))/float(result.group(1))
|
|
||||||
self.d[node_type]['ulsch_err_perc_round_1'].append(percentage)
|
|
||||||
|
|
||||||
|
|
||||||
def process_enb (self,node_type,output):
|
|
||||||
for line in output:
|
|
||||||
tmp=line.decode("utf-8")
|
|
||||||
result=re.match(r'^.*\bPHR\b ([0-9]+).+\bbler\b ([0-9]+\.[0-9]+).+\bmcsoff\b ([0-9]+).+\bmcs\b ([0-9]+)',tmp)
|
|
||||||
if result is not None:
|
|
||||||
self.d[node_type]['PHR'].append(int(result.group(1)))
|
|
||||||
self.d[node_type]['bler'].append(float(result.group(2)))
|
|
||||||
self.d[node_type]['mcsoff'].append(int(result.group(3)))
|
|
||||||
self.d[node_type]['mcs'].append(int(result.group(4)))
|
|
||||||
|
|
||||||
|
|
||||||
def collect(self,node_type):
|
|
||||||
if node_type=='enb':
|
|
||||||
cmd='cat L1_stats.log MAC_stats.log PDCP_stats.log RRC_stats.log'
|
|
||||||
else: #'gnb'
|
|
||||||
cmd='cat nrL1_stats.log nrMAC_stats.log nrPDCP_stats.log nrRRC_stats.log'
|
|
||||||
process=subprocess.Popen(shlex.split(cmd), stdout=subprocess.PIPE)
|
|
||||||
output = process.stdout.readlines()
|
|
||||||
if node_type=='enb':
|
|
||||||
self.process_enb(node_type,output)
|
|
||||||
else: #'gnb'
|
|
||||||
self.process_gnb(node_type,output)
|
|
||||||
|
|
||||||
|
|
||||||
def graph(self,node_type):
|
|
||||||
col = 1
|
|
||||||
figure, axis = plt.subplots(len(self.d[node_type]), col ,figsize=(10, 10))
|
|
||||||
i=0
|
|
||||||
for metric in self.d[node_type]:
|
|
||||||
major_ticks = np.arange(0, len(self.d[node_type][metric])+1, 1)
|
|
||||||
axis[i].set_xticks(major_ticks)
|
|
||||||
axis[i].set_xticklabels([])
|
|
||||||
axis[i].plot(self.d[node_type][metric],marker='o')
|
|
||||||
axis[i].set_xlabel('time')
|
|
||||||
axis[i].set_ylabel(metric)
|
|
||||||
axis[i].set_title(metric)
|
|
||||||
i+=1
|
|
||||||
|
|
||||||
plt.tight_layout()
|
|
||||||
# Combine all the operations and display
|
|
||||||
plt.savefig(node_type+'_stats_monitor.png')
|
|
||||||
plt.show()
|
|
||||||
|
|
||||||
|
|
||||||
if __name__ == "__main__":
|
|
||||||
|
|
||||||
node = sys.argv[1]#enb or gnb
|
|
||||||
mon=StatMonitor()
|
|
||||||
|
|
||||||
#collecting stats when modem process is stopped
|
|
||||||
CMD='ps aux | grep mode | grep -v grep'
|
|
||||||
process=subprocess.Popen(CMD, shell=True, stdout=subprocess.PIPE)
|
|
||||||
output = process.stdout.readlines()
|
|
||||||
while len(output)!=0 :
|
|
||||||
mon.collect(node)
|
|
||||||
process=subprocess.Popen(CMD, shell=True, stdout=subprocess.PIPE)
|
|
||||||
output = process.stdout.readlines()
|
|
||||||
time.sleep(1)
|
|
||||||
print('Process stopped')
|
|
||||||
with open(node+'_stats_monitor.pickle', 'wb') as handle:
|
|
||||||
pickle.dump(mon.d, handle, protocol=pickle.HIGHEST_PROTOCOL)
|
|
||||||
mon.graph(node)
|
|
||||||
@@ -93,7 +93,7 @@
|
|||||||
<server_container_name>rfsim5g-oai-nr-ue</server_container_name>
|
<server_container_name>rfsim5g-oai-nr-ue</server_container_name>
|
||||||
<client_container_name>rfsim5g-oai-ext-dn</client_container_name>
|
<client_container_name>rfsim5g-oai-ext-dn</client_container_name>
|
||||||
<server_options>-B 12.1.1.2 -u -i 1 -s</server_options>
|
<server_options>-B 12.1.1.2 -u -i 1 -s</server_options>
|
||||||
<client_options>-c 12.1.1.2 -u -i 1 -t 30 -b 400K</client_options>
|
<client_options>-c 12.1.1.2 -u -i 1 -t 30 -b 3M</client_options>
|
||||||
</testCase>
|
</testCase>
|
||||||
|
|
||||||
<testCase id="030002">
|
<testCase id="030002">
|
||||||
@@ -102,7 +102,7 @@
|
|||||||
<server_container_name>rfsim5g-oai-ext-dn</server_container_name>
|
<server_container_name>rfsim5g-oai-ext-dn</server_container_name>
|
||||||
<client_container_name>rfsim5g-oai-nr-ue</client_container_name>
|
<client_container_name>rfsim5g-oai-nr-ue</client_container_name>
|
||||||
<server_options>-u -i 1 -s</server_options>
|
<server_options>-u -i 1 -s</server_options>
|
||||||
<client_options>-B 12.1.1.2 -c 192.168.72.135 -u -i 1 -t 30 -b 20K</client_options>
|
<client_options>-B 12.1.1.2 -c 192.168.72.135 -u -i 1 -t 30 -b 1M</client_options>
|
||||||
</testCase>
|
</testCase>
|
||||||
|
|
||||||
<testCase id="100001">
|
<testCase id="100001">
|
||||||
|
|||||||
@@ -37,8 +37,8 @@
|
|||||||
000001
|
000001
|
||||||
050000
|
050000
|
||||||
050001
|
050001
|
||||||
070000
|
|
||||||
070001
|
070001
|
||||||
|
070000
|
||||||
050000
|
050000
|
||||||
050001
|
050001
|
||||||
010002
|
010002
|
||||||
@@ -123,15 +123,15 @@
|
|||||||
<iperf_args>-u -b 40M -t 60</iperf_args>
|
<iperf_args>-u -b 40M -t 60</iperf_args>
|
||||||
<direction>DL</direction>
|
<direction>DL</direction>
|
||||||
<id>idefix</id>
|
<id>idefix</id>
|
||||||
<iperf_packetloss_threshold>3</iperf_packetloss_threshold>
|
<iperf_packetloss_threshold>20</iperf_packetloss_threshold>
|
||||||
<iperf_bitrate_threshold>95</iperf_bitrate_threshold>
|
<iperf_bitrate_threshold>85</iperf_bitrate_threshold>
|
||||||
<iperf_profile>single-ue</iperf_profile>
|
<iperf_profile>single-ue</iperf_profile>
|
||||||
</testCase>
|
</testCase>
|
||||||
|
|
||||||
<testCase id="070001">
|
<testCase id="070001">
|
||||||
<class>Iperf</class>
|
<class>Iperf</class>
|
||||||
<desc>iperf (UL/2Mbps/UDP)(60 sec)(single-ue profile)</desc>
|
<desc>iperf (UL/3Mbps/UDP)(60 sec)(single-ue profile)</desc>
|
||||||
<iperf_args>-u -b 2M -t 60</iperf_args>
|
<iperf_args>-u -b 3M -t 60</iperf_args>
|
||||||
<direction>UL</direction>
|
<direction>UL</direction>
|
||||||
<id>idefix</id>
|
<id>idefix</id>
|
||||||
<iperf_packetloss_threshold>1</iperf_packetloss_threshold>
|
<iperf_packetloss_threshold>1</iperf_packetloss_threshold>
|
||||||
|
|||||||
@@ -79,6 +79,7 @@
|
|||||||
<eNB_serverId>1</eNB_serverId>
|
<eNB_serverId>1</eNB_serverId>
|
||||||
<air_interface>nr</air_interface>
|
<air_interface>nr</air_interface>
|
||||||
<eNB_Stats>yes</eNB_Stats>
|
<eNB_Stats>yes</eNB_Stats>
|
||||||
|
<rt_stats_cfg>datalog_rt_stats.2x2.yaml</rt_stats_cfg>
|
||||||
<USRP_IPAddress>192.168.18.240</USRP_IPAddress>
|
<USRP_IPAddress>192.168.18.240</USRP_IPAddress>
|
||||||
</testCase>
|
</testCase>
|
||||||
|
|
||||||
|
|||||||
@@ -99,6 +99,7 @@
|
|||||||
<eNB_serverId>1</eNB_serverId>
|
<eNB_serverId>1</eNB_serverId>
|
||||||
<air_interface>nr</air_interface>
|
<air_interface>nr</air_interface>
|
||||||
<eNB_Stats>yes</eNB_Stats>
|
<eNB_Stats>yes</eNB_Stats>
|
||||||
|
<rt_stats_cfg>datalog_rt_stats.2x2.yaml</rt_stats_cfg>
|
||||||
<USRP_IPAddress>192.168.18.240</USRP_IPAddress>
|
<USRP_IPAddress>192.168.18.240</USRP_IPAddress>
|
||||||
</testCase>
|
</testCase>
|
||||||
|
|
||||||
|
|||||||
@@ -34,9 +34,8 @@
|
|||||||
050000
|
050000
|
||||||
050001
|
050001
|
||||||
000001
|
000001
|
||||||
070000
|
070003
|
||||||
000001
|
070002
|
||||||
070001
|
|
||||||
000001
|
000001
|
||||||
050000
|
050000
|
||||||
050001
|
050001
|
||||||
@@ -114,16 +113,38 @@
|
|||||||
|
|
||||||
<testCase id="070000">
|
<testCase id="070000">
|
||||||
<class>Iperf</class>
|
<class>Iperf</class>
|
||||||
<desc>iperf (DL/60Mbps/UDP)(60 sec)(single-ue profile)</desc>
|
<desc>iperf (DL/30Mbps/UDP)(30 sec)(single-ue profile)</desc>
|
||||||
<iperf_args>-u -b 60M -t 60</iperf_args>
|
<iperf_args>-u -b 30M -t 30</iperf_args>
|
||||||
<direction>DL</direction>
|
<direction>DL</direction>
|
||||||
<id>idefix</id>
|
<id>idefix</id>
|
||||||
<iperf_packetloss_threshold>3</iperf_packetloss_threshold>
|
<iperf_packetloss_threshold>5</iperf_packetloss_threshold>
|
||||||
<iperf_bitrate_threshold>95</iperf_bitrate_threshold>
|
<iperf_bitrate_threshold>95</iperf_bitrate_threshold>
|
||||||
<iperf_profile>single-ue</iperf_profile>
|
<iperf_profile>single-ue</iperf_profile>
|
||||||
</testCase>
|
</testCase>
|
||||||
|
|
||||||
<testCase id="070001">
|
<testCase id="070001">
|
||||||
|
<class>Iperf</class>
|
||||||
|
<desc>iperf (DL/40Mbps/UDP)(30 sec)(single-ue profile)</desc>
|
||||||
|
<iperf_args>-u -b 40M -t 30</iperf_args>
|
||||||
|
<direction>DL</direction>
|
||||||
|
<id>idefix</id>
|
||||||
|
<iperf_packetloss_threshold>5</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 (DL/60Mbps/UDP)(60 sec)(single-ue profile)</desc>
|
||||||
|
<iperf_args>-u -b 60M -t 60</iperf_args>
|
||||||
|
<direction>DL</direction>
|
||||||
|
<id>idefix</id>
|
||||||
|
<iperf_packetloss_threshold>5</iperf_packetloss_threshold>
|
||||||
|
<iperf_bitrate_threshold>95</iperf_bitrate_threshold>
|
||||||
|
<iperf_profile>single-ue</iperf_profile>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
<testCase id="070003">
|
||||||
<class>Iperf</class>
|
<class>Iperf</class>
|
||||||
<desc>iperf (UL/3Mbps/UDP)(60 sec)(single-ue profile)</desc>
|
<desc>iperf (UL/3Mbps/UDP)(60 sec)(single-ue profile)</desc>
|
||||||
<iperf_args>-u -b 3M -t 60</iperf_args>
|
<iperf_args>-u -b 3M -t 60</iperf_args>
|
||||||
|
|||||||
@@ -26,19 +26,19 @@
|
|||||||
<htmlTabIcon>tasks</htmlTabIcon>
|
<htmlTabIcon>tasks</htmlTabIcon>
|
||||||
<repeatCount>1</repeatCount>
|
<repeatCount>1</repeatCount>
|
||||||
<TestCaseRequestedList>
|
<TestCaseRequestedList>
|
||||||
040000
|
041000
|
||||||
000002
|
000002
|
||||||
010000
|
011000
|
||||||
000002
|
000002
|
||||||
050000
|
051000
|
||||||
050001
|
051001
|
||||||
000001
|
000001
|
||||||
010002
|
010002
|
||||||
080000
|
080000
|
||||||
</TestCaseRequestedList>
|
</TestCaseRequestedList>
|
||||||
<TestCaseExclusionList></TestCaseExclusionList>
|
<TestCaseExclusionList></TestCaseExclusionList>
|
||||||
|
|
||||||
<testCase id="010000">
|
<testCase id="011000">
|
||||||
<class>Initialize_OAI_UE</class>
|
<class>Initialize_OAI_UE</class>
|
||||||
<desc>Initialize OAI UE (X300)</desc>
|
<desc>Initialize OAI UE (X300)</desc>
|
||||||
<air_interface>nr</air_interface>
|
<air_interface>nr</air_interface>
|
||||||
@@ -51,7 +51,7 @@
|
|||||||
</testCase>
|
</testCase>
|
||||||
|
|
||||||
|
|
||||||
<testCase id="040000">
|
<testCase id="041000">
|
||||||
<class>Initialize_eNB</class>
|
<class>Initialize_eNB</class>
|
||||||
<desc>Initialize gNB</desc>
|
<desc>Initialize gNB</desc>
|
||||||
<Initialize_eNB_args>-O ci-scripts/conf_files/gnb.band78.sa.fr1.106PRB.usrpn310.conf --sa --usrp-tx-thread-config 1 --log_config.global_log_options level,nocolor,time</Initialize_eNB_args>
|
<Initialize_eNB_args>-O ci-scripts/conf_files/gnb.band78.sa.fr1.106PRB.usrpn310.conf --sa --usrp-tx-thread-config 1 --log_config.global_log_options level,nocolor,time</Initialize_eNB_args>
|
||||||
@@ -76,14 +76,14 @@
|
|||||||
</testCase>
|
</testCase>
|
||||||
|
|
||||||
|
|
||||||
<testCase id="050000">
|
<testCase id="051000">
|
||||||
<class>Ping</class>
|
<class>Ping</class>
|
||||||
<desc>Ping from CN to UE: 20pings in 20sec</desc>
|
<desc>Ping from CN to UE: 20pings in 20sec</desc>
|
||||||
<ping_args>-c 20</ping_args>
|
<ping_args>-c 20</ping_args>
|
||||||
<ping_packetloss_threshold>5</ping_packetloss_threshold>
|
<ping_packetloss_threshold>5</ping_packetloss_threshold>
|
||||||
</testCase>
|
</testCase>
|
||||||
|
|
||||||
<testCase id="050001">
|
<testCase id="051001">
|
||||||
<class>Ping</class>
|
<class>Ping</class>
|
||||||
<desc>Ping from CN to UE: 100pings in 20sec</desc>
|
<desc>Ping from CN to UE: 100pings in 20sec</desc>
|
||||||
<ping_args>-c 100 -i 0.2</ping_args>
|
<ping_args>-c 100 -i 0.2</ping_args>
|
||||||
|
|||||||
@@ -64,6 +64,7 @@
|
|||||||
<air_interface>nr</air_interface>
|
<air_interface>nr</air_interface>
|
||||||
<eNB_Trace>yes</eNB_Trace>
|
<eNB_Trace>yes</eNB_Trace>
|
||||||
<eNB_Stats>yes</eNB_Stats>
|
<eNB_Stats>yes</eNB_Stats>
|
||||||
|
<rt_stats_cfg>datalog_rt_stats.2x2.yaml</rt_stats_cfg>
|
||||||
<USRP_IPAddress>192.168.18.240</USRP_IPAddress>
|
<USRP_IPAddress>192.168.18.240</USRP_IPAddress>
|
||||||
</testCase>
|
</testCase>
|
||||||
|
|
||||||
|
|||||||
@@ -64,6 +64,7 @@
|
|||||||
<air_interface>nr</air_interface>
|
<air_interface>nr</air_interface>
|
||||||
<eNB_Trace>yes</eNB_Trace>
|
<eNB_Trace>yes</eNB_Trace>
|
||||||
<eNB_Stats>yes</eNB_Stats>
|
<eNB_Stats>yes</eNB_Stats>
|
||||||
|
<rt_stats_cfg>datalog_rt_stats.2x2.yaml</rt_stats_cfg>
|
||||||
<USRP_IPAddress>192.168.18.240</USRP_IPAddress>
|
<USRP_IPAddress>192.168.18.240</USRP_IPAddress>
|
||||||
</testCase>
|
</testCase>
|
||||||
|
|
||||||
|
|||||||
@@ -71,6 +71,7 @@
|
|||||||
<air_interface>nr</air_interface>
|
<air_interface>nr</air_interface>
|
||||||
<eNB_Trace>yes</eNB_Trace>
|
<eNB_Trace>yes</eNB_Trace>
|
||||||
<eNB_Stats>yes</eNB_Stats>
|
<eNB_Stats>yes</eNB_Stats>
|
||||||
|
<rt_stats_cfg>datalog_rt_stats.2x2.yaml</rt_stats_cfg>
|
||||||
<USRP_IPAddress>192.168.18.240</USRP_IPAddress>
|
<USRP_IPAddress>192.168.18.240</USRP_IPAddress>
|
||||||
</testCase>
|
</testCase>
|
||||||
|
|
||||||
|
|||||||
@@ -73,6 +73,7 @@
|
|||||||
<air_interface>nr</air_interface>
|
<air_interface>nr</air_interface>
|
||||||
<eNB_Trace>yes</eNB_Trace>
|
<eNB_Trace>yes</eNB_Trace>
|
||||||
<eNB_Stats>yes</eNB_Stats>
|
<eNB_Stats>yes</eNB_Stats>
|
||||||
|
<rt_stats_cfg>datalog_rt_stats.2x2.yaml</rt_stats_cfg>
|
||||||
<USRP_IPAddress>192.168.18.240</USRP_IPAddress>
|
<USRP_IPAddress>192.168.18.240</USRP_IPAddress>
|
||||||
</testCase>
|
</testCase>
|
||||||
|
|
||||||
|
|||||||
+2
-2
@@ -21,8 +21,8 @@
|
|||||||
|
|
||||||
-->
|
-->
|
||||||
<testCaseList>
|
<testCaseList>
|
||||||
<htmlTabRef>TEST-LTE-TM2</htmlTabRef>
|
<htmlTabRef>TEST-LTE-TM1-Tab1</htmlTabRef>
|
||||||
<htmlTabName>LTE 2x2 Ping DL UL with QUECTEL</htmlTabName>
|
<htmlTabName>LTE 2x2 TM1 Ping DL UL with QUECTEL</htmlTabName>
|
||||||
<htmlTabIcon>tasks</htmlTabIcon>
|
<htmlTabIcon>tasks</htmlTabIcon>
|
||||||
<repeatCount>1</repeatCount>
|
<repeatCount>1</repeatCount>
|
||||||
<TestCaseRequestedList>
|
<TestCaseRequestedList>
|
||||||
@@ -0,0 +1,145 @@
|
|||||||
|
<!--
|
||||||
|
|
||||||
|
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-LTE-TM2-Tab2</htmlTabRef>
|
||||||
|
<htmlTabName>LTE 2x2 TM2 Ping DL UL with QUECTEL</htmlTabName>
|
||||||
|
<htmlTabIcon>tasks</htmlTabIcon>
|
||||||
|
<repeatCount>1</repeatCount>
|
||||||
|
<TestCaseRequestedList>
|
||||||
|
030001
|
||||||
|
000002
|
||||||
|
010000
|
||||||
|
000001
|
||||||
|
050002
|
||||||
|
050003
|
||||||
|
000002
|
||||||
|
070002
|
||||||
|
070003
|
||||||
|
000001
|
||||||
|
010002
|
||||||
|
080000
|
||||||
|
</TestCaseRequestedList>
|
||||||
|
<TestCaseExclusionList></TestCaseExclusionList>
|
||||||
|
|
||||||
|
<testCase id="010000">
|
||||||
|
<class>Initialize_UE</class>
|
||||||
|
<desc>Initialize Quectel</desc>
|
||||||
|
<id>nrmodule2_quectel</id>
|
||||||
|
<UE_Trace>yes</UE_Trace>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
|
||||||
|
<testCase id="010002">
|
||||||
|
<class>Terminate_UE</class>
|
||||||
|
<desc>Terminate Quectel</desc>
|
||||||
|
<id>nrmodule2_quectel</id>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
|
||||||
|
<testCase id="030001">
|
||||||
|
<class>Initialize_eNB</class>
|
||||||
|
<desc>Initialize eNB</desc>
|
||||||
|
<Initialize_eNB_args>-O ci-scripts/conf_files/enb.band38.lte_2x2_tm2.100PRB.usrpn310.conf --usrp-tx-thread-config 1 --thread-pool 0,2,4,6 --log_config.global_log_options level,nocolor,time</Initialize_eNB_args>
|
||||||
|
<eNB_instance>0</eNB_instance>
|
||||||
|
<eNB_serverId>0</eNB_serverId>
|
||||||
|
<air_interface>lte</air_interface>
|
||||||
|
<eNB_Trace>yes</eNB_Trace>
|
||||||
|
<eNB_Stats>yes</eNB_Stats>
|
||||||
|
<USRP_IPAddress>192.168.18.241</USRP_IPAddress>
|
||||||
|
</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="050002">
|
||||||
|
<class>Ping</class>
|
||||||
|
<desc>Ping: 20 pings</desc>
|
||||||
|
<id>nrmodule2_quectel</id>
|
||||||
|
<ping_args>-c 20</ping_args>
|
||||||
|
<ping_packetloss_threshold>1</ping_packetloss_threshold>
|
||||||
|
<ping_rttavg_threshold>40</ping_rttavg_threshold>
|
||||||
|
</testCase>
|
||||||
|
<testCase id="050003">
|
||||||
|
<class>Ping</class>
|
||||||
|
<desc>Ping: 100 pings, size 1024</desc>
|
||||||
|
<id>nrmodule2_quectel</id>
|
||||||
|
<ping_args>-c 100 -s 1024 -i 0,2</ping_args>
|
||||||
|
<ping_packetloss_threshold>1</ping_packetloss_threshold>
|
||||||
|
<ping_rttavg_threshold>30</ping_rttavg_threshold>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
|
||||||
|
<testCase id="070002">
|
||||||
|
<class>Iperf</class>
|
||||||
|
<desc>iperf (DL/26Mbps/UDP)(60 sec)(single-ue profile)</desc>
|
||||||
|
<iperf_args>-u -b 26M -t 60</iperf_args>
|
||||||
|
<direction>DL</direction>
|
||||||
|
<id>nrmodule2_quectel</id>
|
||||||
|
<iperf_packetloss_threshold>5</iperf_packetloss_threshold>
|
||||||
|
<iperf_bitrate_threshold>95</iperf_bitrate_threshold>
|
||||||
|
<iperf_profile>single-ue</iperf_profile>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
<testCase id="070003">
|
||||||
|
<class>Iperf</class>
|
||||||
|
<desc>iperf (UL/7Mbps/UDP)(60 sec)(single-ue profile)</desc>
|
||||||
|
<iperf_args>-u -b 7M -t 60</iperf_args>
|
||||||
|
<direction>UL</direction>
|
||||||
|
<id>nrmodule2_quectel</id>
|
||||||
|
<iperf_packetloss_threshold>5</iperf_packetloss_threshold>
|
||||||
|
<iperf_bitrate_threshold>95</iperf_bitrate_threshold>
|
||||||
|
<iperf_profile>single-ue</iperf_profile>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<testCase id="080000">
|
||||||
|
<class>Terminate_eNB</class>
|
||||||
|
<desc>Terminate eNB</desc>
|
||||||
|
<eNB_instance>0</eNB_instance>
|
||||||
|
<eNB_serverId>0</eNB_serverId>
|
||||||
|
<air_interface>lte</air_interface>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
<testCase id="080001">
|
||||||
|
<class>Terminate_eNB</class>
|
||||||
|
<desc>Terminate gNB</desc>
|
||||||
|
<eNB_instance>1</eNB_instance>
|
||||||
|
<eNB_serverId>1</eNB_serverId>
|
||||||
|
<air_interface>nr</air_interface>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
</testCaseList>
|
||||||
|
|
||||||
@@ -1541,6 +1541,10 @@ set(PHY_LDPC_CL_SRC
|
|||||||
${OPENAIR1_DIR}/PHY/CODING/nrLDPC_decoder/nrLDPC_decoder_CL.c
|
${OPENAIR1_DIR}/PHY/CODING/nrLDPC_decoder/nrLDPC_decoder_CL.c
|
||||||
${OPENAIR1_DIR}/PHY/CODING/nrLDPC_encoder/ldpc_encoder_optim8segmulti.c
|
${OPENAIR1_DIR}/PHY/CODING/nrLDPC_encoder/ldpc_encoder_optim8segmulti.c
|
||||||
)
|
)
|
||||||
|
add_custom_target( nrLDPC_decoder_kernels_CL
|
||||||
|
COMMAND gcc ${OPENAIR1_DIR}/PHY/CODING/nrLDPC_decoder/nrLDPC_decoder_CL.c -dD -DNRLDPC_KERNEL_SOURCE -E -o ${CMAKE_CURRENT_BINARY_DIR}/nrLDPC_decoder_kernels_CL.clc
|
||||||
|
SOURCES ${OPENAIR1_DIR}/PHY/CODING/nrLDPC_decoder/nrLDPC_decoder_CL.c
|
||||||
|
)
|
||||||
|
|
||||||
set(PHY_NR_CODINGIF
|
set(PHY_NR_CODINGIF
|
||||||
${OPENAIR1_DIR}/PHY/CODING/nrLDPC_load.c;
|
${OPENAIR1_DIR}/PHY/CODING/nrLDPC_load.c;
|
||||||
@@ -1551,6 +1555,7 @@ add_library(ldpc_optim MODULE ${PHY_LDPC_OPTIM_SRC} )
|
|||||||
add_library(ldpc_optim8seg MODULE ${PHY_LDPC_OPTIM8SEG_SRC} )
|
add_library(ldpc_optim8seg MODULE ${PHY_LDPC_OPTIM8SEG_SRC} )
|
||||||
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)
|
||||||
|
|
||||||
if (CUDA_FOUND)
|
if (CUDA_FOUND)
|
||||||
cuda_add_library(ldpc_cuda MODULE ${PHY_LDPC_CUDA_SRC} )
|
cuda_add_library(ldpc_cuda MODULE ${PHY_LDPC_CUDA_SRC} )
|
||||||
@@ -2767,7 +2772,6 @@ target_link_libraries (test5Gnas LIB_5GNAS_GNB CONFIG_LIB minimal_lib )
|
|||||||
###################################################
|
###################################################
|
||||||
|
|
||||||
add_executable(lte-softmodem
|
add_executable(lte-softmodem
|
||||||
${OPENAIR_TARGETS}/RT/USER/rt_wrapper.c
|
|
||||||
${OPENAIR_TARGETS}/RT/USER/lte-enb.c
|
${OPENAIR_TARGETS}/RT/USER/lte-enb.c
|
||||||
${OPENAIR_TARGETS}/RT/USER/lte-ru.c
|
${OPENAIR_TARGETS}/RT/USER/lte-ru.c
|
||||||
${OPENAIR_TARGETS}/RT/USER/ru_control.c
|
${OPENAIR_TARGETS}/RT/USER/ru_control.c
|
||||||
@@ -2882,7 +2886,6 @@ target_link_libraries(du_test
|
|||||||
add_executable(oairu
|
add_executable(oairu
|
||||||
${OPENAIR_TARGETS}/RT/USER/lte-ru.c
|
${OPENAIR_TARGETS}/RT/USER/lte-ru.c
|
||||||
${OPENAIR_TARGETS}/RT/USER/ru_control.c
|
${OPENAIR_TARGETS}/RT/USER/ru_control.c
|
||||||
${OPENAIR_TARGETS}/RT/USER/rt_wrapper.c
|
|
||||||
${OPENAIR_TARGETS}/ARCH/COMMON/common_lib.c
|
${OPENAIR_TARGETS}/ARCH/COMMON/common_lib.c
|
||||||
${OPENAIR_TARGETS}/ARCH/COMMON/record_player.c
|
${OPENAIR_TARGETS}/ARCH/COMMON/record_player.c
|
||||||
${OPENAIR_DIR}/executables/softmodem-common.c
|
${OPENAIR_DIR}/executables/softmodem-common.c
|
||||||
@@ -2910,7 +2913,6 @@ target_link_libraries (oairu pthread m ${CONFIG_LIB} rt ${CMAKE_DL_LIBS} ${T_LIB
|
|||||||
#######################################
|
#######################################
|
||||||
|
|
||||||
add_executable(lte-uesoftmodem
|
add_executable(lte-uesoftmodem
|
||||||
${OPENAIR_TARGETS}/RT/USER/rt_wrapper.c
|
|
||||||
${OPENAIR_TARGETS}/RT/USER/lte-ue.c
|
${OPENAIR_TARGETS}/RT/USER/lte-ue.c
|
||||||
${OPENAIR_TARGETS}/RT/USER/lte-uesoftmodem.c
|
${OPENAIR_TARGETS}/RT/USER/lte-uesoftmodem.c
|
||||||
${OPENAIR_DIR}/executables/softmodem-common.c
|
${OPENAIR_DIR}/executables/softmodem-common.c
|
||||||
|
|||||||
+18
-8
@@ -99,25 +99,23 @@ Options
|
|||||||
Makes the LTE softmodem
|
Makes the LTE softmodem
|
||||||
--eNBocp
|
--eNBocp
|
||||||
Makes the OCP LTE softmodem
|
Makes the OCP LTE softmodem
|
||||||
-gNB
|
--gNB
|
||||||
Makes the NR softmodem
|
Makes the NR softmodem
|
||||||
--nrUE
|
|
||||||
Makes the NR UE softmodem
|
|
||||||
--RU
|
--RU
|
||||||
Makes the OAI RRU
|
Makes the OAI RRU
|
||||||
--UE
|
--UE
|
||||||
Makes the UE specific parts (ue_ip, usim, nvram) from the given configuration file
|
Makes the UE specific parts (ue_ip, usim, nvram) from the given configuration file
|
||||||
|
--nrUE
|
||||||
|
Makes the NR UE softmodem
|
||||||
--UE-conf-nvram [configuration file]
|
--UE-conf-nvram [configuration file]
|
||||||
Specify conf_nvram_path (default \"$conf_nvram_path\")
|
Specify conf_nvram_path (default \"$conf_nvram_path\")
|
||||||
--UE-gen-nvram [output path]
|
--UE-gen-nvram [output path]
|
||||||
Specify gen_nvram_path (default \"$gen_nvram_path\")
|
Specify gen_nvram_path (default \"$gen_nvram_path\")
|
||||||
--HWLAT
|
|
||||||
Makes test program for haw latency tests
|
|
||||||
-a | --agent
|
|
||||||
Enables agent for software-defined control of the eNB
|
|
||||||
-w | --hardware
|
-w | --hardware
|
||||||
EXMIMO, USRP, BLADERF, LMSSDR, IRIS, ADRV9371_ZC706, SIMU, AW2SORI, None (Default)
|
EXMIMO, USRP, BLADERF, LMSSDR, IRIS, ADRV9371_ZC706, SIMU, AW2SORI, None (Default)
|
||||||
Adds this RF board support (in external packages installation and in compilation)
|
Adds this RF board support (in external packages installation and in compilation)
|
||||||
|
-t | --transport
|
||||||
|
Selects the transport protocol type, options: None, Ethernet, benetel4g, benetel5g
|
||||||
-P | --phy_simulators
|
-P | --phy_simulators
|
||||||
Makes the unitary tests Layer 1 simulators
|
Makes the unitary tests Layer 1 simulators
|
||||||
-S | --core_simulators
|
-S | --core_simulators
|
||||||
@@ -128,6 +126,14 @@ Options
|
|||||||
runs only specified test cases specified here. This flag is only valid with -s
|
runs only specified test cases specified here. This flag is only valid with -s
|
||||||
-V | --vcd
|
-V | --vcd
|
||||||
Adds a debgging facility to the binary files: GUI with major internal synchronization events
|
Adds a debgging facility to the binary files: GUI with major internal synchronization events
|
||||||
|
-x | --xforms
|
||||||
|
Will compile with software oscilloscope features
|
||||||
|
--HWLAT
|
||||||
|
Makes test program for haw latency tests
|
||||||
|
--HWLAT_TEST
|
||||||
|
Compiles a hw latency test program
|
||||||
|
--verbose-ci
|
||||||
|
Compile with verbose instructions in CI Docker env
|
||||||
--verbose-compile
|
--verbose-compile
|
||||||
Shows detailed compilation instructions in makefile
|
Shows detailed compilation instructions in makefile
|
||||||
--cflags_processor
|
--cflags_processor
|
||||||
@@ -163,6 +169,10 @@ Options
|
|||||||
Build for I/Q record-playback modes
|
Build for I/Q record-playback modes
|
||||||
-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
|
||||||
|
Tell cmake to use the Ninja build system. Without, will generate make files
|
||||||
|
--sanitize-address | -fsanitize=address
|
||||||
|
Enable the address sanitizer on all targets
|
||||||
--ittiSIM
|
--ittiSIM
|
||||||
Makes the itti simulator
|
Makes the itti simulator
|
||||||
-h | --help
|
-h | --help
|
||||||
@@ -707,7 +717,7 @@ function main() {
|
|||||||
|
|
||||||
# generate USIM data
|
# generate USIM data
|
||||||
if [ -f $dbin/conf2uedata ]; then
|
if [ -f $dbin/conf2uedata ]; then
|
||||||
install_nas_tools $conf_nvram_path $gen_nvram_path
|
install_nas_tools $conf_nvram_path $gen_nvram_path "$dlog/conf2uedata.txt"
|
||||||
echo_info "Copying UE specific part to $DIR/$build_dir/build"
|
echo_info "Copying UE specific part to $DIR/$build_dir/build"
|
||||||
cp -Rvf $dbin/.ue_emm.nvram0 $DIR/$build_dir/build
|
cp -Rvf $dbin/.ue_emm.nvram0 $DIR/$build_dir/build
|
||||||
cp -Rvf $dbin/.ue.nvram0 $DIR/$build_dir/build
|
cp -Rvf $dbin/.ue.nvram0 $DIR/$build_dir/build
|
||||||
|
|||||||
@@ -24,6 +24,7 @@
|
|||||||
# authors Laurent Thomas
|
# authors Laurent Thomas
|
||||||
#
|
#
|
||||||
#######################################
|
#######################################
|
||||||
|
|
||||||
if [ ! -f /etc/os-release ]; then
|
if [ ! -f /etc/os-release ]; then
|
||||||
echo "No /etc/os-release file found. You're likely on an unsupported distro."
|
echo "No /etc/os-release file found. You're likely on an unsupported distro."
|
||||||
exit 1
|
exit 1
|
||||||
@@ -452,17 +453,6 @@ install_asn1c_from_source(){
|
|||||||
) > "$asn1_install_log" 2>&1
|
) > "$asn1_install_log" 2>&1
|
||||||
}
|
}
|
||||||
|
|
||||||
#################################################
|
|
||||||
# 2. compile
|
|
||||||
################################################
|
|
||||||
|
|
||||||
install_nas_tools() {
|
|
||||||
echo_success "generate .ue_emm.nvram .ue.nvram"
|
|
||||||
./nvram --gen -c "$1" -o "$2"
|
|
||||||
./usim --gen -c "$1" -o "$2"
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
################################
|
################################
|
||||||
# set_openair_env
|
# set_openair_env
|
||||||
###############################
|
###############################
|
||||||
@@ -483,7 +473,7 @@ if ! check_supported_distribution; then
|
|||||||
echo_error "Your distribution $(get_distribution_release) is not supported by oai !"
|
echo_error "Your distribution $(get_distribution_release) is not supported by oai !"
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
|
set_openair_env
|
||||||
echo_info "Installing packages"
|
echo_info "Installing packages"
|
||||||
check_install_ubuntu_packages
|
check_install_ubuntu_packages
|
||||||
|
|
||||||
|
|||||||
@@ -15,6 +15,7 @@ set(CMAKE_C_FLAGS
|
|||||||
set(OPENAIR_DIR $ENV{OPENAIR_DIR})
|
set(OPENAIR_DIR $ENV{OPENAIR_DIR})
|
||||||
set(OPENAIR3_DIR $ENV{OPENAIR_DIR}/openair3)
|
set(OPENAIR3_DIR $ENV{OPENAIR_DIR}/openair3)
|
||||||
include_directories (${OPENAIR_DIR}/openair2/COMMON)
|
include_directories (${OPENAIR_DIR}/openair2/COMMON)
|
||||||
|
include_directories (${OPENAIR_DIR})
|
||||||
|
|
||||||
set(CONF2UEDATA_LIB_SRC
|
set(CONF2UEDATA_LIB_SRC
|
||||||
${OPENAIR_DIR}/openair3/NAS/TOOLS/conf_emm.c
|
${OPENAIR_DIR}/openair3/NAS/TOOLS/conf_emm.c
|
||||||
|
|||||||
@@ -756,6 +756,7 @@ check_install_oai_software() {
|
|||||||
libidn11-dev \
|
libidn11-dev \
|
||||||
libmysqlclient-dev \
|
libmysqlclient-dev \
|
||||||
libpython2.7-dev \
|
libpython2.7-dev \
|
||||||
|
libreadline-dev \
|
||||||
libsctp1 \
|
libsctp1 \
|
||||||
libsctp-dev \
|
libsctp-dev \
|
||||||
libssl-dev \
|
libssl-dev \
|
||||||
@@ -842,6 +843,7 @@ check_install_oai_software() {
|
|||||||
patch \
|
patch \
|
||||||
psmisc \
|
psmisc \
|
||||||
python \
|
python \
|
||||||
|
readline-devel \
|
||||||
subversion \
|
subversion \
|
||||||
xmlstarlet \
|
xmlstarlet \
|
||||||
python-pip \
|
python-pip \
|
||||||
@@ -892,20 +894,10 @@ install_asn1c_from_source(){
|
|||||||
################################################
|
################################################
|
||||||
|
|
||||||
install_nas_tools() {
|
install_nas_tools() {
|
||||||
if [ ! -f .ue.nvram0 ]; then
|
echo_success "generate .ue_emm.nvram .ue.nvram"
|
||||||
echo_success "generate .ue_emm.nvram .ue.nvram"
|
./nvram --gen -c $1 -o $2 > "$3"
|
||||||
./nvram --gen -c $1 -o $2
|
echo_success "generate .usim.nvram"
|
||||||
else
|
./usim --gen -c $1 -o $2 >> "$3"
|
||||||
[ ./nvram -nt .ue.nvram0 -o ./nvram -nt .ue_emm.nvram0 ] && ./nvram --gen -c $1 -o $2
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [ ! -f .usim.nvram0 ]; then
|
|
||||||
echo_success "generate .usim.nvram"
|
|
||||||
./usim --gen -c $1 -o $2
|
|
||||||
else
|
|
||||||
[ ./usim -nt .usim.nvram0 ] && ./usim --gen -c $1 -o $2
|
|
||||||
fi
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -224,11 +224,9 @@ configmodule_interface_t *load_configmodule(int argc,
|
|||||||
cfgparam = getenv("OAI_CONFIGMODULE");
|
cfgparam = getenv("OAI_CONFIGMODULE");
|
||||||
}
|
}
|
||||||
|
|
||||||
/* default different for UE and softmodem because UE doesn't use config file*/
|
/* default different for UE and softmodem because UE may run without config file */
|
||||||
/* and -O option is not mandatory for UE */
|
/* and -O option is not mandatory for UE */
|
||||||
/* phy simulators behave as UE */
|
/* phy simulators behave as UE */
|
||||||
/* test of exec name would better be replaced by a parameter to the l */
|
|
||||||
/* oad_configmodule function */
|
|
||||||
if (cfgparam == NULL) {
|
if (cfgparam == NULL) {
|
||||||
tmpflags = tmpflags | CONFIG_NOOOPT;
|
tmpflags = tmpflags | CONFIG_NOOOPT;
|
||||||
|
|
||||||
@@ -254,9 +252,14 @@ configmodule_interface_t *load_configmodule(int argc,
|
|||||||
}
|
}
|
||||||
|
|
||||||
cfgptr = calloc(sizeof(configmodule_interface_t),1);
|
cfgptr = calloc(sizeof(configmodule_interface_t),1);
|
||||||
cfgptr->argv_info = calloc(sizeof(int32_t), argc);
|
/* argv_info is used to memorize command line options which have been recognized */
|
||||||
|
/* and to detect unrecognized command line options which might have been specified */
|
||||||
|
cfgptr->argv_info = calloc(sizeof(int32_t), argc+10);
|
||||||
|
/* argv[0] is the exec name, always Ok */
|
||||||
cfgptr->argv_info[0] |= CONFIG_CMDLINEOPT_PROCESSED;
|
cfgptr->argv_info[0] |= CONFIG_CMDLINEOPT_PROCESSED;
|
||||||
|
|
||||||
|
/* when OoptIdx is >0, -O option has been detected at position OoptIdx
|
||||||
|
* we must memorize arv[OoptIdx is Ok */
|
||||||
if (OoptIdx >= 0) {
|
if (OoptIdx >= 0) {
|
||||||
cfgptr->argv_info[OoptIdx] |= CONFIG_CMDLINEOPT_PROCESSED;
|
cfgptr->argv_info[OoptIdx] |= CONFIG_CMDLINEOPT_PROCESSED;
|
||||||
cfgptr->argv_info[OoptIdx+1] |= CONFIG_CMDLINEOPT_PROCESSED;
|
cfgptr->argv_info[OoptIdx+1] |= CONFIG_CMDLINEOPT_PROCESSED;
|
||||||
|
|||||||
@@ -8,7 +8,7 @@ By default, this facility is included at build-time and activated at run-time. T
|
|||||||
```bash
|
```bash
|
||||||
/build_oai --disable-T-Tracer
|
/build_oai --disable-T-Tracer
|
||||||
```
|
```
|
||||||
- To use the the T-Tracer instead of the console logging facility, use the command line option *T_stdout*. *T_stdout* is a boolean option, which, when set to 0 (false) disable the console logging facility. All stdout messages are then sent to the T-Tracer.
|
- To use the the T-Tracer, use the command line option *T_stdout*. When set to 0, it disables the console logging facility. All stdout messages are then sent to the T-Tracer. When set to 1 (the default), the logs are output to the linux console and no T trace is generated. When set to 2 both console logging and T traces are activated.
|
||||||
|
|
||||||
## Documentation
|
## Documentation
|
||||||
|
|
||||||
|
|||||||
@@ -428,12 +428,12 @@ int32_t write_file_matlab(const char *fname, const char *vname, void *data, int
|
|||||||
|
|
||||||
# if T_TRACER
|
# if T_TRACER
|
||||||
/* per component, level dependent macros */
|
/* per component, level dependent macros */
|
||||||
# define LOG_E(c, x...) do { if (T_stdout) { if( g_log->log_component[c].level >= OAILOG_ERR ) logRecord_mt(__FILE__, __FUNCTION__, __LINE__,c, OAILOG_ERR, x) ;} else { T(T_LEGACY_ ## c ## _ERROR, T_PRINTF(x)) ;}} while (0)
|
# define LOG_E(c, x...) do { T(T_LEGACY_ ## c ## _ERROR, T_PRINTF(x)) ; if (T_stdout) { if( g_log->log_component[c].level >= OAILOG_ERR ) logRecord_mt(__FILE__, __FUNCTION__, __LINE__,c, OAILOG_ERR, x) ;} } while (0)
|
||||||
# define LOG_W(c, x...) do { if (T_stdout) { if( g_log->log_component[c].level >= OAILOG_WARNING) logRecord_mt(__FILE__, __FUNCTION__, __LINE__,c, OAILOG_WARNING, x) ;} else { T(T_LEGACY_ ## c ## _WARNING, T_PRINTF(x)) ;}} while (0)
|
# define LOG_W(c, x...) do { T(T_LEGACY_ ## c ## _WARNING, T_PRINTF(x)); if (T_stdout) { if( g_log->log_component[c].level >= OAILOG_WARNING) logRecord_mt(__FILE__, __FUNCTION__, __LINE__,c, OAILOG_WARNING, x);} } while (0)
|
||||||
# define LOG_A LOG_I
|
# define LOG_A LOG_I
|
||||||
# define LOG_I(c, x...) do { if (T_stdout) { if( g_log->log_component[c].level >= OAILOG_INFO ) logRecord_mt(__FILE__, __FUNCTION__, __LINE__,c, OAILOG_INFO, x) ;} else { T(T_LEGACY_ ## c ## _INFO, T_PRINTF(x)) ;}} while (0)
|
# define LOG_I(c, x...) do { T(T_LEGACY_ ## c ## _INFO, T_PRINTF(x)) ; if (T_stdout) { if( g_log->log_component[c].level >= OAILOG_INFO ) logRecord_mt(__FILE__, __FUNCTION__, __LINE__,c, OAILOG_INFO, x) ;} } while (0)
|
||||||
# define LOG_D(c, x...) do { if (T_stdout) { if( g_log->log_component[c].level >= OAILOG_DEBUG ) logRecord_mt(__FILE__, __FUNCTION__, __LINE__,c, OAILOG_DEBUG, x) ;} else { T(T_LEGACY_ ## c ## _DEBUG, T_PRINTF(x)) ;}} while (0)
|
# define LOG_D(c, x...) do { T(T_LEGACY_ ## c ## _DEBUG, T_PRINTF(x)) ; if (T_stdout) { if( g_log->log_component[c].level >= OAILOG_DEBUG ) logRecord_mt(__FILE__, __FUNCTION__, __LINE__,c, OAILOG_DEBUG, x) ;} } while (0)
|
||||||
# define LOG_T(c, x...) do { if (T_stdout) { if( g_log->log_component[c].level >= OAILOG_TRACE ) logRecord_mt(__FILE__, __FUNCTION__, __LINE__,c, OAILOG_TRACE, x) ;} else { T(T_LEGACY_ ## c ## _TRACE, T_PRINTF(x)) ;}} while (0)
|
# define LOG_T(c, x...) do { T(T_LEGACY_ ## c ## _TRACE, T_PRINTF(x)) ; if (T_stdout) { if( g_log->log_component[c].level >= OAILOG_TRACE ) logRecord_mt(__FILE__, __FUNCTION__, __LINE__,c, OAILOG_TRACE, x) ;} } while (0)
|
||||||
# define VLOG(c,l, f, args) do { if (T_stdout) { if( g_log->log_component[c].level >= l ) vlogRecord_mt(__FILE__, __FUNCTION__, __LINE__,c, l, f, args) ;} } while (0)
|
# define VLOG(c,l, f, args) do { if (T_stdout) { if( g_log->log_component[c].level >= l ) vlogRecord_mt(__FILE__, __FUNCTION__, __LINE__,c, l, f, args) ;} } while (0)
|
||||||
/* macro used to dump a buffer or a message as in openair2/RRC/LTE/RRC_eNB.c, replaces LOG_F macro */
|
/* macro used to dump a buffer or a message as in openair2/RRC/LTE/RRC_eNB.c, replaces LOG_F macro */
|
||||||
# define LOG_DUMPMSG(c, f, b, s, x...) do { if(g_log->dump_mask & f) log_dump(c, b, s, LOG_DUMP_CHAR, x) ;} while (0) /* */
|
# define LOG_DUMPMSG(c, f, b, s, x...) do { if(g_log->dump_mask & f) log_dump(c, b, s, LOG_DUMP_CHAR, x) ;} while (0) /* */
|
||||||
|
|||||||
+6
-1
@@ -217,6 +217,11 @@ void T_Config_Init(void) {
|
|||||||
sizeof(ttraceparams) / sizeof(paramdef_t),
|
sizeof(ttraceparams) / sizeof(paramdef_t),
|
||||||
NULL);
|
NULL);
|
||||||
|
|
||||||
if (T_stdout == 0)
|
if (T_stdout < 0 || T_stdout > 2) {
|
||||||
|
printf("fatal error: T_stdout = %d but only values 0, 1, or 2 are allowed\n", T_stdout);
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (T_stdout == 0 || T_stdout == 2)
|
||||||
T_init(T_port, 1-T_nowait, T_dont_fork);
|
T_init(T_port, 1-T_nowait, T_dont_fork);
|
||||||
}
|
}
|
||||||
|
|||||||
+2
-2
@@ -100,7 +100,7 @@ extern int T_stdout;
|
|||||||
20,19,18,17,16,15,14,13,12,11,10,9,8,7,6,5,4,3,2,1,0)(__VA_ARGS__)
|
20,19,18,17,16,15,14,13,12,11,10,9,8,7,6,5,4,3,2,1,0)(__VA_ARGS__)
|
||||||
#define TN_N(n0,n1,n2,n3,n4,n5,n6,n7,n8,n9,n10,n11,n12,n13,n14,n15,n16,n17,\
|
#define TN_N(n0,n1,n2,n3,n4,n5,n6,n7,n8,n9,n10,n11,n12,n13,n14,n15,n16,n17,\
|
||||||
n18,n19,n20,n21,n22,n23,n24,n25,n26,n27,n28,n29,n30,n31,n32,n,...) T##n
|
n18,n19,n20,n21,n22,n23,n24,n25,n26,n27,n28,n29,n30,n31,n32,n,...) T##n
|
||||||
#define T(...) do { if (T_stdout == 0) TN(__VA_ARGS__); } while (0)
|
#define T(...) do { if (T_stdout == 0 || T_stdout == 2) TN(__VA_ARGS__); } while (0)
|
||||||
|
|
||||||
/* type used to send arbitrary buffer data */
|
/* type used to send arbitrary buffer data */
|
||||||
typedef struct {
|
typedef struct {
|
||||||
@@ -607,7 +607,7 @@ extern int *T_active;
|
|||||||
{"T_port", CONFIG_HLP_TPORT, 0, iptr:&T_port, defintval:TTRACER_DEFAULT_PORTNUM, TYPE_INT, 0},\
|
{"T_port", CONFIG_HLP_TPORT, 0, iptr:&T_port, defintval:TTRACER_DEFAULT_PORTNUM, TYPE_INT, 0},\
|
||||||
{"T_nowait", CONFIG_HLP_NOTWAIT, PARAMFLAG_BOOL, iptr:&T_nowait, defintval:0, TYPE_INT, 0},\
|
{"T_nowait", CONFIG_HLP_NOTWAIT, PARAMFLAG_BOOL, iptr:&T_nowait, defintval:0, TYPE_INT, 0},\
|
||||||
{"T_dont_fork", CONFIG_HLP_TNOFORK, PARAMFLAG_BOOL, iptr:&T_dont_fork, defintval:0, TYPE_INT, 0},\
|
{"T_dont_fork", CONFIG_HLP_TNOFORK, PARAMFLAG_BOOL, iptr:&T_dont_fork, defintval:0, TYPE_INT, 0},\
|
||||||
{"T_stdout", CONFIG_HLP_STDOUT, PARAMFLAG_BOOL, iptr:&T_stdout, defintval:1, TYPE_INT, 0},\
|
{"T_stdout", CONFIG_HLP_STDOUT, 0, iptr:&T_stdout, defintval:1, TYPE_INT, 0},\
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
+132
-2
@@ -211,6 +211,19 @@ void start_background_system(void) {
|
|||||||
background_system_process();
|
background_system_process();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int rt_sleep_ns (uint64_t x)
|
||||||
|
{
|
||||||
|
struct timespec myTime;
|
||||||
|
clock_gettime(CLOCK_MONOTONIC, &myTime);
|
||||||
|
myTime.tv_sec += x/1000000000ULL;
|
||||||
|
myTime.tv_nsec = x%1000000000ULL;
|
||||||
|
if (myTime.tv_nsec>=1000000000) {
|
||||||
|
myTime.tv_nsec -= 1000000000;
|
||||||
|
myTime.tv_sec++;
|
||||||
|
}
|
||||||
|
|
||||||
|
return clock_nanosleep(CLOCK_MONOTONIC, TIMER_ABSTIME, &myTime, NULL);
|
||||||
|
}
|
||||||
|
|
||||||
void threadCreate(pthread_t* t, void * (*func)(void*), void * param, char* name, int affinity, int priority){
|
void threadCreate(pthread_t* t, void * (*func)(void*), void * param, char* name, int affinity, int priority){
|
||||||
pthread_attr_t attr;
|
pthread_attr_t attr;
|
||||||
@@ -260,11 +273,128 @@ void threadCreate(pthread_t* t, void * (*func)(void*), void * param, char* name,
|
|||||||
pthread_attr_destroy(&attr);
|
pthread_attr_destroy(&attr);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Legacy, pthread_create + thread_top_init() should be replaced by threadCreate
|
||||||
|
// threadCreate encapsulates the posix pthread api
|
||||||
|
void thread_top_init(char *thread_name,
|
||||||
|
int affinity,
|
||||||
|
uint64_t runtime,
|
||||||
|
uint64_t deadline,
|
||||||
|
uint64_t period) {
|
||||||
|
|
||||||
|
#ifdef DEADLINE_SCHEDULER
|
||||||
|
struct sched_attr attr;
|
||||||
|
|
||||||
|
unsigned int flags = 0;
|
||||||
|
|
||||||
|
attr.size = sizeof(attr);
|
||||||
|
attr.sched_flags = 0;
|
||||||
|
attr.sched_nice = 0;
|
||||||
|
attr.sched_priority = 0;
|
||||||
|
|
||||||
|
attr.sched_policy = SCHED_DEADLINE;
|
||||||
|
attr.sched_runtime = runtime;
|
||||||
|
attr.sched_deadline = deadline;
|
||||||
|
attr.sched_period = period;
|
||||||
|
|
||||||
|
if (sched_setattr(0, &attr, flags) < 0 ) {
|
||||||
|
perror("[SCHED] eNB tx thread: sched_setattr failed\n");
|
||||||
|
fprintf(stderr,"sched_setattr Error = %s",strerror(errno));
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
#else //LOW_LATENCY
|
||||||
|
int policy, s, j;
|
||||||
|
struct sched_param sparam;
|
||||||
|
char cpu_affinity[1024];
|
||||||
|
cpu_set_t cpuset;
|
||||||
|
int settingPriority = 1;
|
||||||
|
|
||||||
|
/* Set affinity mask to include CPUs 2 to MAX_CPUS */
|
||||||
|
/* CPU 0 is reserved for UHD threads */
|
||||||
|
/* CPU 1 is reserved for all RX_TX threads */
|
||||||
|
/* Enable CPU Affinity only if number of CPUs > 2 */
|
||||||
|
CPU_ZERO(&cpuset);
|
||||||
|
|
||||||
|
#ifdef CPU_AFFINITY
|
||||||
|
if (affinity == 0) {
|
||||||
|
LOG_W(HW,"thread_top_init() called with affinity==0, but overruled by #ifdef CPU_AFFINITY\n");
|
||||||
|
}
|
||||||
|
else if (get_nprocs() > 2)
|
||||||
|
{
|
||||||
|
for (j = 2; j < get_nprocs(); j++)
|
||||||
|
CPU_SET(j, &cpuset);
|
||||||
|
s = pthread_setaffinity_np(pthread_self(), sizeof(cpu_set_t), &cpuset);
|
||||||
|
if (s != 0)
|
||||||
|
{
|
||||||
|
perror( "pthread_setaffinity_np");
|
||||||
|
exit_fun("Error setting processor affinity");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#else //CPU_AFFINITY
|
||||||
|
if (affinity) {
|
||||||
|
LOG_W(HW,"thread_top_init() called with affinity>0, but overruled by #ifndef CPU_AFFINITY.\n");
|
||||||
|
}
|
||||||
|
#endif //CPU_AFFINITY
|
||||||
|
|
||||||
|
/* Check the actual affinity mask assigned to the thread */
|
||||||
|
s = pthread_getaffinity_np(pthread_self(), sizeof(cpu_set_t), &cpuset);
|
||||||
|
if (s != 0)
|
||||||
|
{
|
||||||
|
perror( "pthread_getaffinity_np");
|
||||||
|
exit_fun("Error getting processor affinity ");
|
||||||
|
}
|
||||||
|
memset(cpu_affinity,0,sizeof(cpu_affinity));
|
||||||
|
for (j = 0; j < 1024; j++)
|
||||||
|
{
|
||||||
|
if (CPU_ISSET(j, &cpuset))
|
||||||
|
{
|
||||||
|
char temp[1024];
|
||||||
|
sprintf (temp, " CPU_%d", j);
|
||||||
|
strcat(cpu_affinity, temp);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (checkIfFedoraDistribution())
|
||||||
|
if (checkIfGenericKernelOnFedora())
|
||||||
|
if (checkIfInsideContainer())
|
||||||
|
settingPriority = 0;
|
||||||
|
|
||||||
|
if (settingPriority) {
|
||||||
|
memset(&sparam, 0, sizeof(sparam));
|
||||||
|
sparam.sched_priority = sched_get_priority_max(SCHED_FIFO);
|
||||||
|
policy = SCHED_FIFO;
|
||||||
|
|
||||||
|
s = pthread_setschedparam(pthread_self(), policy, &sparam);
|
||||||
|
if (s != 0) {
|
||||||
|
perror("pthread_setschedparam : ");
|
||||||
|
exit_fun("Error setting thread priority");
|
||||||
|
}
|
||||||
|
|
||||||
|
s = pthread_getschedparam(pthread_self(), &policy, &sparam);
|
||||||
|
if (s != 0) {
|
||||||
|
perror("pthread_getschedparam : ");
|
||||||
|
exit_fun("Error getting thread priority");
|
||||||
|
}
|
||||||
|
|
||||||
|
pthread_setname_np(pthread_self(), thread_name);
|
||||||
|
|
||||||
|
LOG_I(HW, "[SCHED][eNB] %s started on CPU %d, sched_policy = %s , priority = %d, CPU Affinity=%s \n",thread_name,sched_getcpu(),
|
||||||
|
(policy == SCHED_FIFO) ? "SCHED_FIFO" :
|
||||||
|
(policy == SCHED_RR) ? "SCHED_RR" :
|
||||||
|
(policy == SCHED_OTHER) ? "SCHED_OTHER" :
|
||||||
|
"???",
|
||||||
|
sparam.sched_priority, cpu_affinity );
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif //LOW_LATENCY
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
// Block CPU C-states deep sleep
|
// Block CPU C-states deep sleep
|
||||||
void configure_linux(void) {
|
void set_latency_target(void) {
|
||||||
int ret;
|
int ret;
|
||||||
static int latency_target_fd=-1;
|
static int latency_target_fd=-1;
|
||||||
uint32_t latency_target_value=10; // in microseconds
|
uint32_t latency_target_value=2; // in microseconds
|
||||||
if (latency_target_fd == -1) {
|
if (latency_target_fd == -1) {
|
||||||
if ( (latency_target_fd = open("/dev/cpu_dma_latency", O_RDWR)) != -1 ) {
|
if ( (latency_target_fd = open("/dev/cpu_dma_latency", O_RDWR)) != -1 ) {
|
||||||
ret = write(latency_target_fd, &latency_target_value, sizeof(latency_target_value));
|
ret = write(latency_target_fd, &latency_target_value, sizeof(latency_target_value));
|
||||||
|
|||||||
@@ -43,9 +43,8 @@ int background_system(char *command);
|
|||||||
void start_background_system(void);
|
void start_background_system(void);
|
||||||
|
|
||||||
void set_latency_target(void);
|
void set_latency_target(void);
|
||||||
void configure_linux(void);
|
|
||||||
|
|
||||||
void threadCreate(pthread_t* t, void * (*func)(void*), void * param, char* name, int affinity, int priority);
|
void threadCreate(pthread_t *t, void *(*func)(void *), void *param, char *name, int affinity, int priority);
|
||||||
|
|
||||||
#define SCHED_OAI SCHED_RR
|
#define SCHED_OAI SCHED_RR
|
||||||
#define OAI_PRIORITY_RT_LOW sched_get_priority_min(SCHED_OAI)
|
#define OAI_PRIORITY_RT_LOW sched_get_priority_min(SCHED_OAI)
|
||||||
@@ -65,7 +64,7 @@ void thread_top_init(char *thread_name,
|
|||||||
int checkIfFedoraDistribution(void);
|
int checkIfFedoraDistribution(void);
|
||||||
int checkIfGenericKernelOnFedora(void);
|
int checkIfGenericKernelOnFedora(void);
|
||||||
int checkIfInsideContainer(void);
|
int checkIfInsideContainer(void);
|
||||||
|
int rt_sleep_ns (uint64_t x);
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -7,23 +7,7 @@
|
|||||||
#include <errno.h>
|
#include <errno.h>
|
||||||
#include "utils.h"
|
#include "utils.h"
|
||||||
|
|
||||||
void *calloc_or_fail(size_t size) {
|
|
||||||
void *ptr = calloc(1, size);
|
|
||||||
if (ptr == NULL) {
|
|
||||||
fprintf(stderr, "[UE] Failed to calloc %zu bytes", size);
|
|
||||||
exit(EXIT_FAILURE);
|
|
||||||
}
|
|
||||||
return ptr;
|
|
||||||
}
|
|
||||||
|
|
||||||
void *malloc_or_fail(size_t size) {
|
|
||||||
void *ptr = malloc(size);
|
|
||||||
if (ptr == NULL) {
|
|
||||||
fprintf(stderr, "[UE] Failed to malloc %zu bytes", size);
|
|
||||||
exit(EXIT_FAILURE);
|
|
||||||
}
|
|
||||||
return ptr;
|
|
||||||
}
|
|
||||||
|
|
||||||
const char *hexdump(const void *data, size_t data_len, char *out, size_t out_len)
|
const char *hexdump(const void *data, size_t data_len, char *out, size_t out_len)
|
||||||
{
|
{
|
||||||
|
|||||||
+101
-4
@@ -1,15 +1,112 @@
|
|||||||
#ifndef _UTILS_H
|
#ifndef _UTILS_H
|
||||||
#define _UTILS_H
|
#define _UTILS_H
|
||||||
|
|
||||||
#include <stdint.h>
|
|
||||||
#include <sys/types.h>
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
extern "C" {
|
extern "C" {
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#include <stdint.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <malloc.h>
|
||||||
|
#include <sys/types.h>
|
||||||
|
#include <common/utils/assertions.h>
|
||||||
|
|
||||||
|
#ifdef MALLOC_TRACE
|
||||||
|
#define malloc myMalloc
|
||||||
|
#endif
|
||||||
|
|
||||||
#define sizeofArray(a) (sizeof(a)/sizeof(*(a)))
|
#define sizeofArray(a) (sizeof(a)/sizeof(*(a)))
|
||||||
void *calloc_or_fail(size_t size);
|
|
||||||
void *malloc_or_fail(size_t size);
|
#define cmax(a,b) ((a>b) ? (a) : (b))
|
||||||
|
#define cmax3(a,b,c) ((cmax(a,b)>c) ? (cmax(a,b)) : (c))
|
||||||
|
#define cmin(a,b) ((a<b) ? (a) : (b))
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
#ifdef min
|
||||||
|
#undef min
|
||||||
|
#undef max
|
||||||
|
#endif
|
||||||
|
#else
|
||||||
|
#define max(a,b) cmax(a,b)
|
||||||
|
#define min(a,b) cmin(a,b)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef malloc16
|
||||||
|
# ifdef __AVX2__
|
||||||
|
# define malloc16(x) memalign(32,x+32)
|
||||||
|
# else
|
||||||
|
# define malloc16(x) memalign(16,x+16)
|
||||||
|
# endif
|
||||||
|
#endif
|
||||||
|
#define free16(y,x) free(y)
|
||||||
|
#define bigmalloc malloc
|
||||||
|
#define bigmalloc16 malloc16
|
||||||
|
#define openair_free(y,x) free((y))
|
||||||
|
#define PAGE_SIZE 4096
|
||||||
|
|
||||||
|
#define free_and_zero(PtR) do { \
|
||||||
|
if (PtR) { \
|
||||||
|
free(PtR); \
|
||||||
|
PtR = NULL; \
|
||||||
|
} \
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
static inline void *malloc16_clear( size_t size ) {
|
||||||
|
#ifdef __AVX2__
|
||||||
|
void *ptr = memalign(32, size+32);
|
||||||
|
#else
|
||||||
|
void *ptr = memalign(16, size+16);
|
||||||
|
#endif
|
||||||
|
DevAssert(ptr);
|
||||||
|
memset( ptr, 0, size );
|
||||||
|
return ptr;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static inline void *calloc_or_fail(size_t size) {
|
||||||
|
void *ptr = calloc(1, size);
|
||||||
|
|
||||||
|
if (ptr == NULL) {
|
||||||
|
fprintf(stderr, "[UE] Failed to calloc %zu bytes", size);
|
||||||
|
exit(EXIT_FAILURE);
|
||||||
|
}
|
||||||
|
|
||||||
|
return ptr;
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline void *malloc_or_fail(size_t size) {
|
||||||
|
void *ptr = malloc(size);
|
||||||
|
|
||||||
|
if (ptr == NULL) {
|
||||||
|
fprintf(stderr, "[UE] Failed to malloc %zu bytes", size);
|
||||||
|
exit(EXIT_FAILURE);
|
||||||
|
}
|
||||||
|
|
||||||
|
return ptr;
|
||||||
|
}
|
||||||
|
|
||||||
|
#if !defined (msg)
|
||||||
|
# define msg(aRGS...) LOG_D(PHY, ##aRGS)
|
||||||
|
#endif
|
||||||
|
#ifndef malloc16
|
||||||
|
# ifdef __AVX2__
|
||||||
|
# define malloc16(x) memalign(32,x)
|
||||||
|
# else
|
||||||
|
# define malloc16(x) memalign(16,x)
|
||||||
|
# endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#define free16(y,x) free(y)
|
||||||
|
#define bigmalloc malloc
|
||||||
|
#define bigmalloc16 malloc16
|
||||||
|
#define openair_free(y,x) free((y))
|
||||||
|
#define PAGE_SIZE 4096
|
||||||
|
|
||||||
|
#define PAGE_MASK 0xfffff000
|
||||||
|
#define virt_to_phys(x) (x)
|
||||||
|
|
||||||
const char *hexdump(const void *data, size_t data_len, char *out, size_t out_len);
|
const char *hexdump(const void *data, size_t data_len, char *out, size_t out_len);
|
||||||
|
|
||||||
// Converts an hexadecimal ASCII coded digit into its value. **
|
// Converts an hexadecimal ASCII coded digit into its value. **
|
||||||
|
|||||||
+10
-2
@@ -89,6 +89,8 @@ At the UE the --phy-test flag will
|
|||||||
|
|
||||||
```bash sudo ./nr-softmodem -O ../../../targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.tm1.106PRB.usrpn300.conf --phy-test```
|
```bash sudo ./nr-softmodem -O ../../../targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.tm1.106PRB.usrpn300.conf --phy-test```
|
||||||
|
|
||||||
|
In phy-test mode it is possible to mimic the reception of UE Capabilities at gNB by passing through the command line parameter `--uecap_file` the location and file name of the input UE Capability file, e.g. `--uecap_file ../../../targets/PROJECTS/GENERIC-NR-5GC/CONF/uecap.xml`
|
||||||
|
|
||||||
### Launch UE in another window
|
### Launch UE in another window
|
||||||
|
|
||||||
```bash sudo ./nr-uesoftmodem --phy-test [--rrc_config_path ../../../ci-scripts/rrc-files]```
|
```bash sudo ./nr-uesoftmodem --phy-test [--rrc_config_path ../../../ci-scripts/rrc-files]```
|
||||||
@@ -122,6 +124,8 @@ gNB on machine 1:
|
|||||||
|
|
||||||
`sudo ./nr-softmodem -O ../../../targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.tm1.106PRB.usrpn300.conf --do-ra`
|
`sudo ./nr-softmodem -O ../../../targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.tm1.106PRB.usrpn300.conf --do-ra`
|
||||||
|
|
||||||
|
In do-ra mode it is possible to mimic the reception of UE Capabilities at gNB by passing through the command line parameter `--uecap_file` the location and file name of the input UE Capability file, e.g. `--uecap_file ../../../targets/PROJECTS/GENERIC-NR-5GC/CONF/uecap.xml`
|
||||||
|
|
||||||
UE on machine 2:
|
UE on machine 2:
|
||||||
|
|
||||||
`sudo ./nr-uesoftmodem --do-ra`
|
`sudo ./nr-uesoftmodem --do-ra`
|
||||||
@@ -161,13 +165,17 @@ gNB on machine 1:
|
|||||||
|
|
||||||
UE on machine 2:
|
UE on machine 2:
|
||||||
|
|
||||||
`sudo ./nr-uesoftmodem -r 106 --numerology 1 --band 78 -C 3619200000 --sa`
|
`sudo ./nr-uesoftmodem -r 106 --numerology 1 --band 78 -C 3619200000 -s 516 --sa`
|
||||||
|
|
||||||
With the RF simulator (on the same machine):
|
With the RF simulator (on the same machine):
|
||||||
|
|
||||||
`sudo ./nr-softmodem -O ../../../targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.106PRB.usrpb210.conf --rfsim --sa`
|
`sudo ./nr-softmodem -O ../../../targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.106PRB.usrpb210.conf --rfsim --sa`
|
||||||
|
|
||||||
`sudo ./nr-uesoftmodem -r 106 --numerology 1 --band 78 -C 3619200000 --rfsim --sa`
|
`sudo ./nr-uesoftmodem -r 106 --numerology 1 --band 78 -C 3619200000 -s 516 --rfsim --sa`
|
||||||
|
|
||||||
|
where `-r` sets the transmission bandwidth configuration in terms of RBs, `-C` sets the downlink carrier frequency and `-s` sets the SSB start subcarrier.
|
||||||
|
|
||||||
|
Additionally, at UE side `--uecap_file` option can be used to pass the UE Capabilities input file (path location + filename), e.g. `--uecap_file ../../../targets/PROJECTS/GENERIC-NR-5GC/CONF/uecap.xml`
|
||||||
|
|
||||||
## IF setup with OAI
|
## IF setup with OAI
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,75 @@
|
|||||||
|
```mermaid
|
||||||
|
flowchart TB
|
||||||
|
A[ru_thread] --> RFin>block rx_rf] --> feprx
|
||||||
|
feprx --> half-slot --> end_feprx
|
||||||
|
feprx --> second-thread -- block_end_feprx --> end_feprx>feprx]
|
||||||
|
end_feprx --> rx_nr_prach_ru
|
||||||
|
rx_nr_prach_ru -- block_queue_singleton --> resp_L1>resp L1]
|
||||||
|
resp_L1 -- async launch --> rx_func
|
||||||
|
resp_L1 -- immediate return --> RFin
|
||||||
|
|
||||||
|
subgraph rxfunc
|
||||||
|
rx_func_implem[rx_func]
|
||||||
|
subgraph rxfuncbeg
|
||||||
|
handle_nr_slot_ind
|
||||||
|
--> rnti_to_remove-mgmt
|
||||||
|
--> L1_nr_prach_procedures
|
||||||
|
--> apply_nr_rotation_ul
|
||||||
|
end
|
||||||
|
subgraph phy_procedures_gNB_uespec_RX
|
||||||
|
fill_ul_rb_mask
|
||||||
|
--> pucch(decode each gNB->pucch)
|
||||||
|
-->nr_fill_ul_indication
|
||||||
|
--> nr_ulsch_procedures
|
||||||
|
--> nr_ulsch_decoding
|
||||||
|
--> segInParallel[[all segments decode in parallel]]
|
||||||
|
--> barrier_end_of_ulsch_decoding
|
||||||
|
end
|
||||||
|
subgraph NR_UL_indication
|
||||||
|
handle_nr_rach
|
||||||
|
--> handle_nr_uci
|
||||||
|
--> handle_nr_ulsch
|
||||||
|
subgraph gNB_dlsch_ulsch_scheduler
|
||||||
|
run_pdcp
|
||||||
|
--> nr_rrc_trigger
|
||||||
|
--> schedule_xxxx
|
||||||
|
end
|
||||||
|
handle_nr_ulsch --> gNB_dlsch_ulsch_scheduler
|
||||||
|
subgraph NR_Schedule_response
|
||||||
|
L1_tx_free3>L1_tx_free]
|
||||||
|
--> handle_nr_nfapi_xxx_pdu
|
||||||
|
--> sendTxFilled((L1_tx_filled))
|
||||||
|
--> nr_fill_ul_xxx
|
||||||
|
--> nr_fill_prach
|
||||||
|
end
|
||||||
|
gNB_dlsch_ulsch_scheduler --> NR_Schedule_response
|
||||||
|
end
|
||||||
|
rx_func_implem --> rxfuncbeg
|
||||||
|
rxfuncbeg --> phy_procedures_gNB_uespec_RX
|
||||||
|
phy_procedures_gNB_uespec_RX --> NR_UL_indication
|
||||||
|
-- block_queue_block_PNF_monolithic --> L1_tx_free2>L1 tx filled]
|
||||||
|
-- async launch --> tx_func
|
||||||
|
L1_tx_free2 -- send_msg --> rsp((resp_L1))
|
||||||
|
end
|
||||||
|
rx_func --> rxfunc
|
||||||
|
|
||||||
|
|
||||||
|
subgraph tx_func
|
||||||
|
direction LR
|
||||||
|
subgraph phy_procedures_gNB_TX
|
||||||
|
dcitop[nr_generate dci top]
|
||||||
|
--> nr_generate_csi_rs
|
||||||
|
--> apply_nr_rotation
|
||||||
|
-- send_msg --> end_tx_func((L1_tx_out))
|
||||||
|
end
|
||||||
|
subgraph tx_reorder_thread
|
||||||
|
L1_tx_out>L1_tx_out]
|
||||||
|
--> reorder{re order} --> reorder
|
||||||
|
reorder --> ru_tx_func
|
||||||
|
reorder --> L1_tx_free((L1_tx_free))
|
||||||
|
ru_tx_func --> feptx_prec
|
||||||
|
--> feptx_ofdm
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
```
|
||||||
@@ -17,6 +17,70 @@ body {
|
|||||||
|
|
||||||
</style>
|
</style>
|
||||||
|
|
||||||
|
```mermaid
|
||||||
|
flowchart TB
|
||||||
|
A[ru_thread] --> RFin>block rx_rf] --> feprx
|
||||||
|
feprx --> half-slot --> end_feprx
|
||||||
|
feprx --> second-thread -- block_end_feprx --> end_feprx>feprx]
|
||||||
|
end_feprx --> rx_nr_prach_ru
|
||||||
|
rx_nr_prach_ru -- block_queue --> resp_L1>resp L1]
|
||||||
|
resp_L1 -- async launch --> rx_func
|
||||||
|
resp_L1 -- immediate return --> RFin
|
||||||
|
|
||||||
|
subgraph rxfunc
|
||||||
|
rx_func_implem[rx_func]
|
||||||
|
subgraph rxfuncbeg
|
||||||
|
handle_nr_slot_ind
|
||||||
|
--> rnti_to_remove-mgmt
|
||||||
|
--> L1_nr_prach_procedures
|
||||||
|
--> apply_nr_rotation_ul
|
||||||
|
end
|
||||||
|
subgraph phy_procedures_gNB_uespec_RX
|
||||||
|
fill_ul_rb_mask
|
||||||
|
--> pucch(decode each gNB->pucch)
|
||||||
|
-->nr_fill_ul_indication
|
||||||
|
--> nr_ulsch_procedures
|
||||||
|
--> nr_ulsch_decoding
|
||||||
|
--> segInParallel[[all segments decode in parallel]]
|
||||||
|
--> barrier_end_of_ulsch_decoding
|
||||||
|
end
|
||||||
|
subgraph NR_UL_indication
|
||||||
|
handle_nr_rach
|
||||||
|
--> handle_nr_uci
|
||||||
|
--> handle_nr_ulsch
|
||||||
|
--> gNB_dlsch_ulsch_scheduler
|
||||||
|
--> NR_Schedule_response
|
||||||
|
end
|
||||||
|
rx_func_implem --> rxfuncbeg
|
||||||
|
rxfuncbeg --> phy_procedures_gNB_uespec_RX
|
||||||
|
phy_procedures_gNB_uespec_RX --> NR_UL_indication
|
||||||
|
-- block_queue --> L1_tx_free2>L1 tx free]
|
||||||
|
-- async launch --> tx_func
|
||||||
|
L1_tx_free2 -- send_msg --> rsp((resp_L1))
|
||||||
|
end
|
||||||
|
rx_func --> rxfunc
|
||||||
|
|
||||||
|
|
||||||
|
subgraph tx
|
||||||
|
direction LR
|
||||||
|
subgraph tx_func2
|
||||||
|
phy_procedures_gNB_TX
|
||||||
|
--> dcitop[nr_generate dci top]
|
||||||
|
--> nr_generate_csi_rs
|
||||||
|
--> apply_nr_rotation
|
||||||
|
-- send_msg --> end_tx_func((L1_tx_out))
|
||||||
|
end
|
||||||
|
subgraph tx_reorder_thread
|
||||||
|
L1_tx_out>L1_tx_out]
|
||||||
|
--> reorder{re order} --> reorder
|
||||||
|
reorder --> ru_tx_func
|
||||||
|
reorder --> L1_tx_free((L1_tx_free))
|
||||||
|
ru_tx_func --> feptx_prec
|
||||||
|
--> feptx_ofdm
|
||||||
|
end
|
||||||
|
tx_func2 --> tx_reorder_thread
|
||||||
|
end
|
||||||
|
```
|
||||||
|
|
||||||
This tuto for 5G gNB design, with Open Cells main
|
This tuto for 5G gNB design, with Open Cells main
|
||||||
{: .text-center}
|
{: .text-center}
|
||||||
|
|||||||
@@ -35,4 +35,4 @@ COPY . .
|
|||||||
RUN /bin/sh oaienv && \
|
RUN /bin/sh oaienv && \
|
||||||
cd cmake_targets && \
|
cd cmake_targets && \
|
||||||
mkdir -p log && \
|
mkdir -p log && \
|
||||||
./build_oai --eNB --gNB --RU --UE --nrUE --ninja -w USRP --verbose-ci
|
./build_oai --eNB --gNB --RU --UE --nrUE --ninja --build-lib all -w USRP --verbose-ci
|
||||||
|
|||||||
@@ -35,4 +35,4 @@ COPY . .
|
|||||||
RUN /bin/sh oaienv && \
|
RUN /bin/sh oaienv && \
|
||||||
cd cmake_targets && \
|
cd cmake_targets && \
|
||||||
mkdir -p log && \
|
mkdir -p log && \
|
||||||
./build_oai --eNB --gNB --RU --UE --nrUE --ninja -w USRP --verbose-ci
|
./build_oai --eNB --gNB --RU --UE --nrUE --ninja --build-lib all -w USRP --verbose-ci
|
||||||
|
|||||||
@@ -69,6 +69,8 @@ COPY --from=enb-build \
|
|||||||
/oai-ran/cmake_targets/ran_build/build/libparams_libconfig.so \
|
/oai-ran/cmake_targets/ran_build/build/libparams_libconfig.so \
|
||||||
/oai-ran/cmake_targets/ran_build/build/libdfts.so \
|
/oai-ran/cmake_targets/ran_build/build/libdfts.so \
|
||||||
/oai-ran/cmake_targets/ran_build/build/liboai_iqplayer.so \
|
/oai-ran/cmake_targets/ran_build/build/liboai_iqplayer.so \
|
||||||
|
/oai-ran/cmake_targets/ran_build/build/libtelnetsrv.so \
|
||||||
|
/oai-ran/cmake_targets/ran_build/build/libtelnetsrv_enb.so \
|
||||||
/usr/local/lib/
|
/usr/local/lib/
|
||||||
|
|
||||||
COPY --from=enb-base \
|
COPY --from=enb-base \
|
||||||
|
|||||||
@@ -76,6 +76,8 @@ COPY --from=enb-build \
|
|||||||
/oai-ran/cmake_targets/ran_build/build/libparams_libconfig.so \
|
/oai-ran/cmake_targets/ran_build/build/libparams_libconfig.so \
|
||||||
/oai-ran/cmake_targets/ran_build/build/libdfts.so \
|
/oai-ran/cmake_targets/ran_build/build/libdfts.so \
|
||||||
/oai-ran/cmake_targets/ran_build/build/liboai_iqplayer.so \
|
/oai-ran/cmake_targets/ran_build/build/liboai_iqplayer.so \
|
||||||
|
/oai-ran/cmake_targets/ran_build/build/libtelnetsrv.so \
|
||||||
|
/oai-ran/cmake_targets/ran_build/build/libtelnetsrv_enb.so \
|
||||||
/usr/local/lib/
|
/usr/local/lib/
|
||||||
|
|
||||||
# Now we are copying from builder-image the UHD files.
|
# Now we are copying from builder-image the UHD files.
|
||||||
|
|||||||
@@ -74,6 +74,7 @@ COPY --from=gnb-build \
|
|||||||
/oai-ran/cmake_targets/ran_build/build/libldpc_optim.so \
|
/oai-ran/cmake_targets/ran_build/build/libldpc_optim.so \
|
||||||
/oai-ran/cmake_targets/ran_build/build/libldpc_optim8seg.so \
|
/oai-ran/cmake_targets/ran_build/build/libldpc_optim8seg.so \
|
||||||
/oai-ran/cmake_targets/ran_build/build/libldpc_orig.so \
|
/oai-ran/cmake_targets/ran_build/build/libldpc_orig.so \
|
||||||
|
/oai-ran/cmake_targets/ran_build/build/libtelnetsrv.so \
|
||||||
/usr/local/lib/
|
/usr/local/lib/
|
||||||
|
|
||||||
COPY --from=gnb-base \
|
COPY --from=gnb-base \
|
||||||
|
|||||||
@@ -78,6 +78,7 @@ COPY --from=gnb-build \
|
|||||||
/oai-ran/cmake_targets/ran_build/build/libldpc_optim.so \
|
/oai-ran/cmake_targets/ran_build/build/libldpc_optim.so \
|
||||||
/oai-ran/cmake_targets/ran_build/build/libldpc_optim8seg.so \
|
/oai-ran/cmake_targets/ran_build/build/libldpc_optim8seg.so \
|
||||||
/oai-ran/cmake_targets/ran_build/build/libldpc_orig.so \
|
/oai-ran/cmake_targets/ran_build/build/libldpc_orig.so \
|
||||||
|
/oai-ran/cmake_targets/ran_build/build/libtelnetsrv.so \
|
||||||
/usr/local/lib/
|
/usr/local/lib/
|
||||||
|
|
||||||
# Now we are copying from builder-image the UHD files.
|
# Now we are copying from builder-image the UHD files.
|
||||||
|
|||||||
@@ -73,6 +73,7 @@ COPY --from=lte-ue-build \
|
|||||||
/oai-ran/cmake_targets/ran_build/build/libparams_libconfig.so \
|
/oai-ran/cmake_targets/ran_build/build/libparams_libconfig.so \
|
||||||
/oai-ran/cmake_targets/ran_build/build/libSIMU.so \
|
/oai-ran/cmake_targets/ran_build/build/libSIMU.so \
|
||||||
/oai-ran/cmake_targets/ran_build/build/libdfts.so \
|
/oai-ran/cmake_targets/ran_build/build/libdfts.so \
|
||||||
|
/oai-ran/cmake_targets/ran_build/build/libtelnetsrv.so \
|
||||||
/usr/local/lib/
|
/usr/local/lib/
|
||||||
|
|
||||||
COPY --from=lte-ue-base \
|
COPY --from=lte-ue-base \
|
||||||
|
|||||||
@@ -80,6 +80,7 @@ COPY --from=lte-ue-build \
|
|||||||
/oai-ran/cmake_targets/ran_build/build/libparams_libconfig.so \
|
/oai-ran/cmake_targets/ran_build/build/libparams_libconfig.so \
|
||||||
/oai-ran/cmake_targets/ran_build/build/libSIMU.so \
|
/oai-ran/cmake_targets/ran_build/build/libSIMU.so \
|
||||||
/oai-ran/cmake_targets/ran_build/build/libdfts.so \
|
/oai-ran/cmake_targets/ran_build/build/libdfts.so \
|
||||||
|
/oai-ran/cmake_targets/ran_build/build/libtelnetsrv.so \
|
||||||
/usr/local/lib/
|
/usr/local/lib/
|
||||||
|
|
||||||
# Now we are copying from builder-image the UHD files.
|
# Now we are copying from builder-image the UHD files.
|
||||||
|
|||||||
@@ -76,6 +76,8 @@ COPY --from=nr-ue-build \
|
|||||||
/oai-ran/cmake_targets/ran_build/build/libldpc_optim.so \
|
/oai-ran/cmake_targets/ran_build/build/libldpc_optim.so \
|
||||||
/oai-ran/cmake_targets/ran_build/build/libldpc_optim8seg.so \
|
/oai-ran/cmake_targets/ran_build/build/libldpc_optim8seg.so \
|
||||||
/oai-ran/cmake_targets/ran_build/build/libldpc_orig.so \
|
/oai-ran/cmake_targets/ran_build/build/libldpc_orig.so \
|
||||||
|
/oai-ran/cmake_targets/ran_build/build/libtelnetsrv.so \
|
||||||
|
/oai-ran/cmake_targets/ran_build/build/libtelnetsrv_5Gue.so \
|
||||||
/usr/local/lib/
|
/usr/local/lib/
|
||||||
|
|
||||||
COPY --from=nr-ue-base \
|
COPY --from=nr-ue-base \
|
||||||
|
|||||||
@@ -81,6 +81,8 @@ COPY --from=nr-ue-build \
|
|||||||
/oai-ran/cmake_targets/ran_build/build/libldpc_optim.so \
|
/oai-ran/cmake_targets/ran_build/build/libldpc_optim.so \
|
||||||
/oai-ran/cmake_targets/ran_build/build/libldpc_optim8seg.so \
|
/oai-ran/cmake_targets/ran_build/build/libldpc_optim8seg.so \
|
||||||
/oai-ran/cmake_targets/ran_build/build/libldpc_orig.so \
|
/oai-ran/cmake_targets/ran_build/build/libldpc_orig.so \
|
||||||
|
/oai-ran/cmake_targets/ran_build/build/libtelnetsrv.so \
|
||||||
|
/oai-ran/cmake_targets/ran_build/build/libtelnetsrv_5Gue.so \
|
||||||
/usr/local/lib/
|
/usr/local/lib/
|
||||||
|
|
||||||
# Now we are copying from builder-image the UHD files.
|
# Now we are copying from builder-image the UHD files.
|
||||||
|
|||||||
@@ -27,6 +27,10 @@
|
|||||||
|
|
||||||
FROM ran-base:latest AS phy-sim-build
|
FROM ran-base:latest AS phy-sim-build
|
||||||
|
|
||||||
|
RUN rm -Rf /oai-ran
|
||||||
|
WORKDIR /oai-ran
|
||||||
|
COPY . .
|
||||||
|
|
||||||
#run build_oai to build the target image
|
#run build_oai to build the target image
|
||||||
RUN /bin/sh oaienv && \
|
RUN /bin/sh oaienv && \
|
||||||
cd cmake_targets && \
|
cd cmake_targets && \
|
||||||
|
|||||||
@@ -1150,7 +1150,7 @@ int main ( int argc, char **argv ) {
|
|||||||
#if T_TRACER
|
#if T_TRACER
|
||||||
T_Config_Init();
|
T_Config_Init();
|
||||||
#endif
|
#endif
|
||||||
configure_linux();
|
set_latency_target();
|
||||||
set_softmodem_sighandler();
|
set_softmodem_sighandler();
|
||||||
cpuf=get_cpu_freq_GHz();
|
cpuf=get_cpu_freq_GHz();
|
||||||
set_taus_seed (0);
|
set_taus_seed (0);
|
||||||
|
|||||||
+75
-71
@@ -87,7 +87,6 @@
|
|||||||
#include <openair1/PHY/NR_TRANSPORT/nr_ulsch.h>
|
#include <openair1/PHY/NR_TRANSPORT/nr_ulsch.h>
|
||||||
#include <openair1/PHY/NR_TRANSPORT/nr_dlsch.h>
|
#include <openair1/PHY/NR_TRANSPORT/nr_dlsch.h>
|
||||||
#include <PHY/NR_ESTIMATION/nr_ul_estimation.h>
|
#include <PHY/NR_ESTIMATION/nr_ul_estimation.h>
|
||||||
//#define DEBUG_THREADS 1
|
|
||||||
|
|
||||||
//#define USRP_DEBUG 1
|
//#define USRP_DEBUG 1
|
||||||
// Fix per CC openair rf/if device update
|
// Fix per CC openair rf/if device update
|
||||||
@@ -114,7 +113,6 @@ time_stats_t softmodem_stats_rx_sf; // total rx time
|
|||||||
void tx_func(void *param) {
|
void tx_func(void *param) {
|
||||||
|
|
||||||
processingData_L1tx_t *info = (processingData_L1tx_t *) param;
|
processingData_L1tx_t *info = (processingData_L1tx_t *) param;
|
||||||
PHY_VARS_gNB *gNB = info->gNB;
|
|
||||||
int frame_tx = info->frame;
|
int frame_tx = info->frame;
|
||||||
int slot_tx = info->slot;
|
int slot_tx = info->slot;
|
||||||
|
|
||||||
@@ -122,35 +120,9 @@ void tx_func(void *param) {
|
|||||||
frame_tx,
|
frame_tx,
|
||||||
slot_tx,
|
slot_tx,
|
||||||
1);
|
1);
|
||||||
info->slot = -1;
|
|
||||||
//if ((frame_tx&127) == 0) dump_pdsch_stats(fd,gNB);
|
|
||||||
|
|
||||||
// If the later of the 2 L1 tx thread finishes first,
|
|
||||||
// we wait for the earlier one to finish and start the RU thread
|
|
||||||
// to avoid realtime issues with USRP
|
|
||||||
|
|
||||||
// Start RU TX processing.
|
|
||||||
notifiedFIFO_elt_t *res;
|
|
||||||
res = pullTpool(gNB->resp_RU_tx, gNB->threadPool);
|
|
||||||
processingData_RU_t *syncMsg = (processingData_RU_t *)NotifiedFifoData(res);
|
|
||||||
LOG_D(PHY,"waiting for previous tx to finish, next slot %d,%d\n",syncMsg->next_slot,slot_tx);
|
|
||||||
while (syncMsg->next_slot != slot_tx) {
|
|
||||||
pushNotifiedFIFO(gNB->resp_RU_tx, res);
|
|
||||||
res = pullTpool(gNB->resp_RU_tx, gNB->threadPool);
|
|
||||||
syncMsg = (processingData_RU_t *)NotifiedFifoData(res);
|
|
||||||
}
|
|
||||||
LOG_D(PHY,"previous tx finished, next slot %d,%d\n",syncMsg->next_slot,slot_tx);
|
|
||||||
syncMsg->frame_tx = frame_tx;
|
|
||||||
syncMsg->slot_tx = slot_tx;
|
|
||||||
syncMsg->next_slot = get_next_downlink_slot(gNB, &gNB->gNB_config, frame_tx, slot_tx);
|
|
||||||
syncMsg->timestamp_tx = info->timestamp_tx;
|
|
||||||
syncMsg->ru = gNB->RU_list[0];
|
|
||||||
res->key = slot_tx;
|
|
||||||
pushTpool(gNB->threadPool, res);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void rx_func(void *param) {
|
void rx_func(void *param) {
|
||||||
|
|
||||||
processingData_L1_t *info = (processingData_L1_t *) param;
|
processingData_L1_t *info = (processingData_L1_t *) param;
|
||||||
PHY_VARS_gNB *gNB = info->gNB;
|
PHY_VARS_gNB *gNB = info->gNB;
|
||||||
int frame_rx = info->frame_rx;
|
int frame_rx = info->frame_rx;
|
||||||
@@ -275,15 +247,12 @@ void rx_func(void *param) {
|
|||||||
|
|
||||||
if (tx_slot_type == NR_DOWNLINK_SLOT || tx_slot_type == NR_MIXED_SLOT) {
|
if (tx_slot_type == NR_DOWNLINK_SLOT || tx_slot_type == NR_MIXED_SLOT) {
|
||||||
notifiedFIFO_elt_t *res;
|
notifiedFIFO_elt_t *res;
|
||||||
res = pullTpool(gNB->resp_L1_tx, gNB->threadPool);
|
processingData_L1tx_t *syncMsg;
|
||||||
processingData_L1tx_t *syncMsg = (processingData_L1tx_t *)NotifiedFifoData(res);
|
// Its a FIFO so it maitains the order in which the MAC fills the messages
|
||||||
while (syncMsg->slot != slot_tx) {
|
// so no need for checking for right slot
|
||||||
pushNotifiedFIFO(gNB->resp_L1_tx, res);
|
res = pullTpool(gNB->L1_tx_filled, gNB->threadPool);
|
||||||
res = pullTpool(gNB->resp_L1_tx, gNB->threadPool);
|
syncMsg = (processingData_L1tx_t *)NotifiedFifoData(res);
|
||||||
syncMsg = (processingData_L1tx_t *)NotifiedFifoData(res);
|
|
||||||
}
|
|
||||||
syncMsg->gNB = gNB;
|
syncMsg->gNB = gNB;
|
||||||
AssertFatal(syncMsg->slot == slot_tx, "Thread message slot and logical slot number do not match\n");
|
|
||||||
syncMsg->timestamp_tx = info->timestamp_tx;
|
syncMsg->timestamp_tx = info->timestamp_tx;
|
||||||
res->key = slot_tx;
|
res->key = slot_tx;
|
||||||
pushTpool(gNB->threadPool, res);
|
pushTpool(gNB->threadPool, res);
|
||||||
@@ -331,8 +300,8 @@ void rx_func(void *param) {
|
|||||||
}
|
}
|
||||||
static void dump_L1_meas_stats(PHY_VARS_gNB *gNB, RU_t *ru, char *output) {
|
static void dump_L1_meas_stats(PHY_VARS_gNB *gNB, RU_t *ru, char *output) {
|
||||||
int stroff = 0;
|
int stroff = 0;
|
||||||
stroff += print_meas_log(gNB->phy_proc_tx_0, "L1 Tx processing thread 0", NULL, NULL, output);
|
stroff += print_meas_log(gNB->phy_proc_tx[0], "L1 Tx processing thread 0", NULL, NULL, output);
|
||||||
stroff += print_meas_log(gNB->phy_proc_tx_1, "L1 Tx processing thread 1", NULL, NULL, output+stroff);
|
//stroff += print_meas_log(gNB->phy_proc_tx[1], "L1 Tx processing thread 1", NULL, NULL, output+stroff);
|
||||||
stroff += print_meas_log(&gNB->dlsch_encoding_stats, "DLSCH encoding", NULL, NULL, output+stroff);
|
stroff += print_meas_log(&gNB->dlsch_encoding_stats, "DLSCH encoding", NULL, NULL, output+stroff);
|
||||||
stroff += print_meas_log(&gNB->phy_proc_rx, "L1 Rx processing", NULL, NULL, output+stroff);
|
stroff += print_meas_log(&gNB->phy_proc_rx, "L1 Rx processing", NULL, NULL, output+stroff);
|
||||||
stroff += print_meas_log(&gNB->ul_indication_stats, "UL Indication", NULL, NULL, output+stroff);
|
stroff += print_meas_log(&gNB->ul_indication_stats, "UL Indication", NULL, NULL, output+stroff);
|
||||||
@@ -367,8 +336,8 @@ void *nrL1_stats_thread(void *param) {
|
|||||||
fd=fopen("nrL1_stats.log","w");
|
fd=fopen("nrL1_stats.log","w");
|
||||||
AssertFatal(fd!=NULL,"Cannot open nrL1_stats.log\n");
|
AssertFatal(fd!=NULL,"Cannot open nrL1_stats.log\n");
|
||||||
|
|
||||||
reset_meas(gNB->phy_proc_tx_0);
|
reset_meas(gNB->phy_proc_tx[0]);
|
||||||
reset_meas(gNB->phy_proc_tx_1);
|
//reset_meas(gNB->phy_proc_tx[1]);
|
||||||
reset_meas(&gNB->dlsch_encoding_stats);
|
reset_meas(&gNB->dlsch_encoding_stats);
|
||||||
reset_meas(&gNB->phy_proc_rx);
|
reset_meas(&gNB->phy_proc_rx);
|
||||||
reset_meas(&gNB->ul_indication_stats);
|
reset_meas(&gNB->ul_indication_stats);
|
||||||
@@ -389,6 +358,52 @@ void *nrL1_stats_thread(void *param) {
|
|||||||
return(NULL);
|
return(NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// This thread reads the finished L1 tx jobs from threaPool
|
||||||
|
// and pushes RU tx thread in the right order. It works only
|
||||||
|
// two parallel L1 tx threads.
|
||||||
|
void *tx_reorder_thread(void* param) {
|
||||||
|
PHY_VARS_gNB *gNB = (PHY_VARS_gNB *)param;
|
||||||
|
notifiedFIFO_elt_t *resL1Reserve = NULL;
|
||||||
|
|
||||||
|
|
||||||
|
resL1Reserve=pullTpool(gNB->L1_tx_out, gNB->threadPool);
|
||||||
|
int next_tx_slot=((processingData_L1tx_t *)NotifiedFifoData(resL1Reserve))->slot;
|
||||||
|
|
||||||
|
while (!oai_exit) {
|
||||||
|
notifiedFIFO_elt_t *resL1;
|
||||||
|
if (resL1Reserve) {
|
||||||
|
resL1=resL1Reserve;
|
||||||
|
if (((processingData_L1tx_t *)NotifiedFifoData(resL1))->slot != next_tx_slot) {
|
||||||
|
LOG_E(PHY,"order mistake");
|
||||||
|
resL1Reserve=NULL;
|
||||||
|
resL1 = pullTpool(gNB->L1_tx_out, gNB->threadPool);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
resL1 = pullTpool(gNB->L1_tx_out, gNB->threadPool);
|
||||||
|
if (((processingData_L1tx_t *)NotifiedFifoData(resL1))->slot != next_tx_slot) {
|
||||||
|
if (resL1Reserve)
|
||||||
|
LOG_E(PHY,"error, have a stored packet, then a second one\n");
|
||||||
|
resL1Reserve=resL1;
|
||||||
|
resL1 = pullTpool(gNB->L1_tx_out, gNB->threadPool);
|
||||||
|
if (((processingData_L1tx_t *)NotifiedFifoData(resL1))->slot != next_tx_slot)
|
||||||
|
LOG_E(PHY,"error, pull two msg, none is good\n");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
processingData_L1tx_t *syncMsgL1= (processingData_L1tx_t *)NotifiedFifoData(resL1);
|
||||||
|
processingData_RU_t syncMsgRU;
|
||||||
|
syncMsgRU.frame_tx = syncMsgL1->frame;
|
||||||
|
syncMsgRU.slot_tx = syncMsgL1->slot;
|
||||||
|
syncMsgRU.timestamp_tx = syncMsgL1->timestamp_tx;
|
||||||
|
syncMsgRU.ru = gNB->RU_list[0];
|
||||||
|
next_tx_slot = get_next_downlink_slot(gNB, &gNB->gNB_config, syncMsgRU.frame_tx, syncMsgRU.slot_tx);
|
||||||
|
pushNotifiedFIFO(gNB->L1_tx_free, resL1);
|
||||||
|
if (resL1==resL1Reserve)
|
||||||
|
resL1Reserve=NULL;
|
||||||
|
ru_tx_func((void*)&syncMsgRU);
|
||||||
|
}
|
||||||
|
return(NULL);
|
||||||
|
}
|
||||||
|
|
||||||
void init_gNB_Tpool(int inst) {
|
void init_gNB_Tpool(int inst) {
|
||||||
PHY_VARS_gNB *gNB;
|
PHY_VARS_gNB *gNB;
|
||||||
gNB = RC.gNB[inst];
|
gNB = RC.gNB[inst];
|
||||||
@@ -420,40 +435,29 @@ void init_gNB_Tpool(int inst) {
|
|||||||
pushNotifiedFIFO(gNB->resp_L1,msg); // to unblock the process in the beginning
|
pushNotifiedFIFO(gNB->resp_L1,msg); // to unblock the process in the beginning
|
||||||
|
|
||||||
// L1 TX result FIFO
|
// L1 TX result FIFO
|
||||||
gNB->resp_L1_tx = (notifiedFIFO_t*) malloc(sizeof(notifiedFIFO_t));
|
gNB->L1_tx_free = (notifiedFIFO_t*) malloc(sizeof(notifiedFIFO_t));
|
||||||
initNotifiedFIFO(gNB->resp_L1_tx);
|
gNB->L1_tx_filled = (notifiedFIFO_t*) malloc(sizeof(notifiedFIFO_t));
|
||||||
|
gNB->L1_tx_out = (notifiedFIFO_t*) malloc(sizeof(notifiedFIFO_t));
|
||||||
|
initNotifiedFIFO(gNB->L1_tx_free);
|
||||||
|
initNotifiedFIFO(gNB->L1_tx_filled);
|
||||||
|
initNotifiedFIFO(gNB->L1_tx_out);
|
||||||
|
|
||||||
// we create 2 threads for L1 tx processing
|
// we create 2 threads for L1 tx processing
|
||||||
notifiedFIFO_elt_t *msgL1Tx = newNotifiedFIFO_elt(sizeof(processingData_L1tx_t),0,gNB->resp_L1_tx,tx_func);
|
for (int i=0; i < 1; i++) {
|
||||||
processingData_L1tx_t *msgDataTx = (processingData_L1tx_t *)NotifiedFifoData(msgL1Tx);
|
notifiedFIFO_elt_t *msgL1Tx = newNotifiedFIFO_elt(sizeof(processingData_L1tx_t),0,gNB->L1_tx_out,tx_func);
|
||||||
init_DLSCH_struct(gNB, msgDataTx);
|
processingData_L1tx_t *msgDataTx = (processingData_L1tx_t *)NotifiedFifoData(msgL1Tx);
|
||||||
msgDataTx->slot = -1;
|
init_DLSCH_struct(gNB, msgDataTx);
|
||||||
memset(msgDataTx->ssb, 0, 64*sizeof(NR_gNB_SSB_t));
|
memset(msgDataTx->ssb, 0, 64*sizeof(NR_gNB_SSB_t));
|
||||||
reset_meas(&msgDataTx->phy_proc_tx);
|
reset_meas(&msgDataTx->phy_proc_tx);
|
||||||
gNB->phy_proc_tx_0 = &msgDataTx->phy_proc_tx;
|
gNB->phy_proc_tx[i] = &msgDataTx->phy_proc_tx;
|
||||||
pushNotifiedFIFO(gNB->resp_L1_tx,msgL1Tx); // to unblock the process in the beginning
|
pushNotifiedFIFO(gNB->L1_tx_free,msgL1Tx); // to unblock the process in the beginning
|
||||||
|
|
||||||
msgL1Tx = newNotifiedFIFO_elt(sizeof(processingData_L1tx_t),0,gNB->resp_L1_tx,tx_func);
|
|
||||||
msgDataTx = (processingData_L1tx_t *)NotifiedFifoData(msgL1Tx);
|
|
||||||
init_DLSCH_struct(gNB, msgDataTx);
|
|
||||||
msgDataTx->slot = -1;
|
|
||||||
memset(msgDataTx->ssb, 0, 64*sizeof(NR_gNB_SSB_t));
|
|
||||||
reset_meas(&msgDataTx->phy_proc_tx);
|
|
||||||
gNB->phy_proc_tx_1 = &msgDataTx->phy_proc_tx;
|
|
||||||
pushNotifiedFIFO(gNB->resp_L1_tx,msgL1Tx); // to unblock the process in the beginning
|
|
||||||
|
|
||||||
// RU TX result FIFO
|
|
||||||
gNB->resp_RU_tx = (notifiedFIFO_t*) malloc(sizeof(notifiedFIFO_t));
|
|
||||||
initNotifiedFIFO(gNB->resp_RU_tx);
|
|
||||||
notifiedFIFO_elt_t *msgRUTx = newNotifiedFIFO_elt(sizeof(processingData_RU_t),0,gNB->resp_RU_tx,ru_tx_func);
|
|
||||||
processingData_RU_t *msgData = (processingData_RU_t*)msgRUTx->msgData;
|
|
||||||
int first_tx_slot = sf_ahead*gNB->frame_parms.slots_per_subframe;
|
|
||||||
msgData->next_slot = get_next_downlink_slot(gNB, &gNB->gNB_config, 0, first_tx_slot-1);
|
|
||||||
pushNotifiedFIFO(gNB->resp_RU_tx,msgRUTx); // to unblock the process in the beginning
|
|
||||||
|
|
||||||
if (!get_softmodem_params()->emulate_l1) {
|
|
||||||
threadCreate(&proc->L1_stats_thread,nrL1_stats_thread,(void*)gNB,"L1_stats",-1,OAI_PRIORITY_RT_LOW);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!get_softmodem_params()->emulate_l1)
|
||||||
|
threadCreate(&proc->L1_stats_thread,nrL1_stats_thread,(void*)gNB,"L1_stats",-1,OAI_PRIORITY_RT_LOW);
|
||||||
|
|
||||||
|
threadCreate(&proc->pthread_tx_reorder, tx_reorder_thread, (void *)gNB, "thread_tx_reorder", -1, OAI_PRIORITY_RT_MAX);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
+14
-17
@@ -77,6 +77,7 @@ static int DEFBFW[] = {0x00007fff};
|
|||||||
|
|
||||||
#include "T.h"
|
#include "T.h"
|
||||||
#include "nfapi_interface.h"
|
#include "nfapi_interface.h"
|
||||||
|
#include <nfapi/oai_integration/vendor_ext.h>
|
||||||
|
|
||||||
extern volatile int oai_exit;
|
extern volatile int oai_exit;
|
||||||
|
|
||||||
@@ -1335,24 +1336,22 @@ void *ru_thread( void *param ) {
|
|||||||
|
|
||||||
|
|
||||||
while (!oai_exit) {
|
while (!oai_exit) {
|
||||||
// these are local subframe/frame counters to check that we are in synch with the fronthaul timing.
|
|
||||||
// They are set on the first rx/tx in the underly FH routines.
|
|
||||||
slot_start = timespec_add(slot_start,slot_duration);
|
|
||||||
struct timespec curr_time;
|
|
||||||
clock_gettime(CLOCK_MONOTONIC, &curr_time);
|
|
||||||
|
|
||||||
struct timespec sleep_time;
|
if (NFAPI_MODE==NFAPI_MODE_VNF) {
|
||||||
|
// We should make a VNF main loop with proper tasks calls in case of VNF
|
||||||
|
slot_start = timespec_add(slot_start,slot_duration);
|
||||||
|
struct timespec curr_time;
|
||||||
|
clock_gettime(CLOCK_MONOTONIC, &curr_time);
|
||||||
|
|
||||||
if((slot_start.tv_sec > curr_time.tv_sec) || (slot_start.tv_sec == curr_time.tv_sec && slot_start.tv_nsec > curr_time.tv_nsec)){
|
struct timespec sleep_time;
|
||||||
sleep_time = timespec_sub(slot_start,curr_time);
|
|
||||||
|
|
||||||
usleep(sleep_time.tv_nsec * 1e-3);
|
if((slot_start.tv_sec > curr_time.tv_sec) || (slot_start.tv_sec == curr_time.tv_sec && slot_start.tv_nsec > curr_time.tv_nsec)){
|
||||||
}
|
sleep_time = timespec_sub(slot_start,curr_time);
|
||||||
else{//continue
|
|
||||||
|
usleep(sleep_time.tv_nsec * 1e-3);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// clock_gettime(CLOCK_MONOTONIC, &curr_time);
|
|
||||||
//printf("sfn:%d, slot:%d, start time %d.%d slot start %d.%d \n",frame,slot,curr_time.tv_sec,curr_time.tv_nsec,slot_start.tv_sec,slot_start.tv_nsec);
|
|
||||||
if (slot==(fp->slots_per_frame-1)) {
|
if (slot==(fp->slots_per_frame-1)) {
|
||||||
slot=0;
|
slot=0;
|
||||||
frame++;
|
frame++;
|
||||||
@@ -1472,11 +1471,9 @@ void *ru_thread( void *param ) {
|
|||||||
|
|
||||||
res = pullNotifiedFIFO(gNB->resp_L1);
|
res = pullNotifiedFIFO(gNB->resp_L1);
|
||||||
delNotifiedFIFO_elt(res);
|
delNotifiedFIFO_elt(res);
|
||||||
res = pullNotifiedFIFO(gNB->resp_L1_tx);
|
res = pullNotifiedFIFO(gNB->L1_tx_free);
|
||||||
delNotifiedFIFO_elt(res);
|
delNotifiedFIFO_elt(res);
|
||||||
res = pullNotifiedFIFO(gNB->resp_L1_tx);
|
res = pullNotifiedFIFO(gNB->L1_tx_free);
|
||||||
delNotifiedFIFO_elt(res);
|
|
||||||
res = pullNotifiedFIFO(gNB->resp_RU_tx);
|
|
||||||
delNotifiedFIFO_elt(res);
|
delNotifiedFIFO_elt(res);
|
||||||
|
|
||||||
ru_thread_status = 0;
|
ru_thread_status = 0;
|
||||||
|
|||||||
@@ -87,8 +87,9 @@
|
|||||||
#define CONFIG_HLP_NOTWAIT "don't wait for tracer, start immediately\n"
|
#define CONFIG_HLP_NOTWAIT "don't wait for tracer, start immediately\n"
|
||||||
#define CONFIG_HLP_TNOFORK "to ease debugging with gdb\n"
|
#define CONFIG_HLP_TNOFORK "to ease debugging with gdb\n"
|
||||||
#define CONFIG_HLP_DISABLNBIOT "disable nb-iot, even if defined in config\n"
|
#define CONFIG_HLP_DISABLNBIOT "disable nb-iot, even if defined in config\n"
|
||||||
#define CONFIG_HLP_DISABLETIMECORR "disable UE timing correction\n"
|
#define CONFIG_HLP_DISABLETIMECORR "disable UE timing correction\n"
|
||||||
#define CONFIG_HLP_RRC_CFG_PATH "path for RRC configuration\n"
|
#define CONFIG_HLP_RRC_CFG_PATH "path for RRC configuration\n"
|
||||||
|
#define CONFIG_HLP_UECAP_FILE "path for UE Capabilities file\n"
|
||||||
|
|
||||||
#define CONFIG_HLP_NUMEROLOGY "adding numerology for 5G\n"
|
#define CONFIG_HLP_NUMEROLOGY "adding numerology for 5G\n"
|
||||||
#define CONFIG_HLP_EMULATE_RF "Emulated RF enabled(disable by defult)\n"
|
#define CONFIG_HLP_EMULATE_RF "Emulated RF enabled(disable by defult)\n"
|
||||||
|
|||||||
@@ -111,16 +111,11 @@ int32_t uplink_frequency_offset[MAX_NUM_CCs][4];
|
|||||||
|
|
||||||
//Temp fix for inexistent NR upper layer
|
//Temp fix for inexistent NR upper layer
|
||||||
unsigned char NB_gNB_INST = 1;
|
unsigned char NB_gNB_INST = 1;
|
||||||
|
char *uecap_file;
|
||||||
|
|
||||||
|
|
||||||
int UE_scan = 1;
|
|
||||||
int UE_scan_carrier = 0;
|
|
||||||
runmode_t mode = normal_txrx;
|
runmode_t mode = normal_txrx;
|
||||||
static double snr_dB=20;
|
static double snr_dB=20;
|
||||||
|
|
||||||
FILE *input_fd=NULL;
|
|
||||||
|
|
||||||
|
|
||||||
#if MAX_NUM_CCs == 1
|
#if MAX_NUM_CCs == 1
|
||||||
rx_gain_t rx_gain_mode[MAX_NUM_CCs][4] = {{max_gain,max_gain,max_gain,max_gain}};
|
rx_gain_t rx_gain_mode[MAX_NUM_CCs][4] = {{max_gain,max_gain,max_gain,max_gain}};
|
||||||
double tx_gain[MAX_NUM_CCs][4] = {{20,0,0,0}};
|
double tx_gain[MAX_NUM_CCs][4] = {{20,0,0,0}};
|
||||||
@@ -193,8 +188,6 @@ openair0_config_t openair0_cfg[MAX_CARDS];
|
|||||||
|
|
||||||
double cpuf;
|
double cpuf;
|
||||||
|
|
||||||
extern char uecap_xer[1024];
|
|
||||||
char uecap_xer_in=0;
|
|
||||||
|
|
||||||
/* see file openair2/LAYER2/MAC/main.c for why abstraction_flag is needed
|
/* see file openair2/LAYER2/MAC/main.c for why abstraction_flag is needed
|
||||||
* this is very hackish - find a proper solution
|
* this is very hackish - find a proper solution
|
||||||
@@ -656,7 +649,7 @@ int main( int argc, char **argv ) {
|
|||||||
memset(&openair0_cfg[0],0,sizeof(openair0_config_t)*MAX_CARDS);
|
memset(&openair0_cfg[0],0,sizeof(openair0_config_t)*MAX_CARDS);
|
||||||
memset(tx_max_power,0,sizeof(int)*MAX_NUM_CCs);
|
memset(tx_max_power,0,sizeof(int)*MAX_NUM_CCs);
|
||||||
logInit();
|
logInit();
|
||||||
configure_linux();
|
set_latency_target();
|
||||||
printf("Reading in command-line options\n");
|
printf("Reading in command-line options\n");
|
||||||
get_options ();
|
get_options ();
|
||||||
|
|
||||||
@@ -710,6 +703,7 @@ int main( int argc, char **argv ) {
|
|||||||
// don't create if node doesn't connect to RRC/S1/GTP
|
// don't create if node doesn't connect to RRC/S1/GTP
|
||||||
int ret=create_gNB_tasks(1);
|
int ret=create_gNB_tasks(1);
|
||||||
AssertFatal(ret==0,"cannot create ITTI tasks\n");
|
AssertFatal(ret==0,"cannot create ITTI tasks\n");
|
||||||
|
|
||||||
/* Start the agent. If it is turned off in the configuration, it won't start */
|
/* Start the agent. If it is turned off in the configuration, it won't start */
|
||||||
/*
|
/*
|
||||||
RCconfig_nr_flexran();
|
RCconfig_nr_flexran();
|
||||||
|
|||||||
@@ -29,6 +29,7 @@
|
|||||||
{"D" , CONFIG_HLP_DLBM_PHYTEST,0, u64ptr:&dlsch_slot_bitmap, defintval:0, TYPE_UINT64, 0}, \
|
{"D" , CONFIG_HLP_DLBM_PHYTEST,0, u64ptr:&dlsch_slot_bitmap, defintval:0, TYPE_UINT64, 0}, \
|
||||||
{"U" , CONFIG_HLP_ULBM_PHYTEST,0, u64ptr:&ulsch_slot_bitmap, defintval:0, TYPE_UINT64, 0}, \
|
{"U" , CONFIG_HLP_ULBM_PHYTEST,0, u64ptr:&ulsch_slot_bitmap, defintval:0, TYPE_UINT64, 0}, \
|
||||||
{"usrp-tx-thread-config", CONFIG_HLP_USRP_THREAD, 0, iptr:&usrp_tx_thread, defstrval:0, TYPE_INT, 0}, \
|
{"usrp-tx-thread-config", CONFIG_HLP_USRP_THREAD, 0, iptr:&usrp_tx_thread, defstrval:0, TYPE_INT, 0}, \
|
||||||
|
{"uecap_file", CONFIG_HLP_UECAP_FILE, 0, strptr:(char **)&uecap_file, defstrval:"./uecap.xml", TYPE_STRING, 0}, \
|
||||||
{"s" , CONFIG_HLP_SNR, 0, dblptr:&snr_dB, defdblval:25, TYPE_DOUBLE, 0}, \
|
{"s" , CONFIG_HLP_SNR, 0, dblptr:&snr_dB, defdblval:25, TYPE_DOUBLE, 0}, \
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -41,6 +42,7 @@ extern uint32_t target_dl_bw;
|
|||||||
extern uint32_t target_ul_bw;
|
extern uint32_t target_ul_bw;
|
||||||
extern uint64_t dlsch_slot_bitmap;
|
extern uint64_t dlsch_slot_bitmap;
|
||||||
extern uint64_t ulsch_slot_bitmap;
|
extern uint64_t ulsch_slot_bitmap;
|
||||||
|
extern char *uecap_file;
|
||||||
|
|
||||||
// In nr-gnb.c
|
// In nr-gnb.c
|
||||||
extern void init_gNB(int single_thread_flag,int wait_for_sync);
|
extern void init_gNB(int single_thread_flag,int wait_for_sync);
|
||||||
|
|||||||
+14
-10
@@ -698,6 +698,16 @@ void processSlotRX(void *arg) {
|
|||||||
int tx_slot_type = nr_ue_slot_select(cfg, proc->frame_tx, proc->nr_slot_tx);
|
int tx_slot_type = nr_ue_slot_select(cfg, proc->frame_tx, proc->nr_slot_tx);
|
||||||
uint8_t gNB_id = 0;
|
uint8_t gNB_id = 0;
|
||||||
|
|
||||||
|
if (IS_SOFTMODEM_NOS1 || get_softmodem_params()->sa) {
|
||||||
|
/* send tick to RLC and PDCP every ms */
|
||||||
|
if (proc->nr_slot_rx % UE->frame_parms.slots_per_subframe == 0) {
|
||||||
|
void nr_rlc_tick(int frame, int subframe);
|
||||||
|
void nr_pdcp_tick(int frame, int subframe);
|
||||||
|
nr_rlc_tick(proc->frame_rx, proc->nr_slot_rx / UE->frame_parms.slots_per_subframe);
|
||||||
|
nr_pdcp_tick(proc->frame_rx, proc->nr_slot_rx / UE->frame_parms.slots_per_subframe);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (rx_slot_type == NR_DOWNLINK_SLOT || rx_slot_type == NR_MIXED_SLOT){
|
if (rx_slot_type == NR_DOWNLINK_SLOT || rx_slot_type == NR_MIXED_SLOT){
|
||||||
|
|
||||||
if(UE->if_inst != NULL && UE->if_inst->dl_indication != NULL) {
|
if(UE->if_inst != NULL && UE->if_inst->dl_indication != NULL) {
|
||||||
@@ -720,14 +730,6 @@ void processSlotRX(void *arg) {
|
|||||||
protocol_ctxt_t ctxt;
|
protocol_ctxt_t ctxt;
|
||||||
PROTOCOL_CTXT_SET_BY_MODULE_ID(&ctxt, UE->Mod_id, ENB_FLAG_NO, mac->crnti, proc->frame_rx, proc->nr_slot_rx, 0);
|
PROTOCOL_CTXT_SET_BY_MODULE_ID(&ctxt, UE->Mod_id, ENB_FLAG_NO, mac->crnti, proc->frame_rx, proc->nr_slot_rx, 0);
|
||||||
pdcp_run(&ctxt);
|
pdcp_run(&ctxt);
|
||||||
|
|
||||||
/* send tick to RLC and PDCP every ms */
|
|
||||||
if (proc->nr_slot_rx % UE->frame_parms.slots_per_subframe == 0) {
|
|
||||||
void nr_rlc_tick(int frame, int subframe);
|
|
||||||
void nr_pdcp_tick(int frame, int subframe);
|
|
||||||
nr_rlc_tick(proc->frame_rx, proc->nr_slot_rx / UE->frame_parms.slots_per_subframe);
|
|
||||||
nr_pdcp_tick(proc->frame_rx, proc->nr_slot_rx / UE->frame_parms.slots_per_subframe);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
// calling UL_indication to schedule things other than PUSCH (eg, PUCCH)
|
// calling UL_indication to schedule things other than PUSCH (eg, PUCCH)
|
||||||
rxtxD->ue_sched_mode = NOT_PUSCH;
|
rxtxD->ue_sched_mode = NOT_PUSCH;
|
||||||
@@ -1138,13 +1140,15 @@ void *UE_thread(void *arg) {
|
|||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
void init_NR_UE(int nb_inst, char* rrc_config_path) {
|
void init_NR_UE(int nb_inst,
|
||||||
|
char* uecap_file,
|
||||||
|
char* rrc_config_path) {
|
||||||
int inst;
|
int inst;
|
||||||
NR_UE_MAC_INST_t *mac_inst;
|
NR_UE_MAC_INST_t *mac_inst;
|
||||||
NR_UE_RRC_INST_t* rrc_inst;
|
NR_UE_RRC_INST_t* rrc_inst;
|
||||||
|
|
||||||
for (inst=0; inst < nb_inst; inst++) {
|
for (inst=0; inst < nb_inst; inst++) {
|
||||||
AssertFatal((rrc_inst = nr_l3_init_ue(rrc_config_path)) != NULL, "can not initialize RRC module\n");
|
AssertFatal((rrc_inst = nr_l3_init_ue(uecap_file,rrc_config_path)) != NULL, "can not initialize RRC module\n");
|
||||||
AssertFatal((mac_inst = nr_l2_init_ue(rrc_inst)) != NULL, "can not initialize L2 module\n");
|
AssertFatal((mac_inst = nr_l2_init_ue(rrc_inst)) != NULL, "can not initialize L2 module\n");
|
||||||
AssertFatal((mac_inst->if_module = nr_ue_if_module_init(inst)) != NULL, "can not initialize IF module\n");
|
AssertFatal((mac_inst->if_module = nr_ue_if_module_init(inst)) != NULL, "can not initialize IF module\n");
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -84,6 +84,7 @@ unsigned short config_frames[4] = {2,9,11,13};
|
|||||||
#include "executables/thread-common.h"
|
#include "executables/thread-common.h"
|
||||||
|
|
||||||
#include "nr_nas_msg_sim.h"
|
#include "nr_nas_msg_sim.h"
|
||||||
|
#include <openair1/PHY/MODULATION/nr_modulation.h>
|
||||||
|
|
||||||
extern const char *duplex_mode[];
|
extern const char *duplex_mode[];
|
||||||
THREAD_STRUCT thread_struct;
|
THREAD_STRUCT thread_struct;
|
||||||
@@ -117,6 +118,7 @@ int vcdflag = 0;
|
|||||||
double rx_gain_off = 0.0;
|
double rx_gain_off = 0.0;
|
||||||
char *usrp_args = NULL;
|
char *usrp_args = NULL;
|
||||||
char *rrc_config_path = NULL;
|
char *rrc_config_path = NULL;
|
||||||
|
char *uecap_file = NULL;
|
||||||
int dumpframe = 0;
|
int dumpframe = 0;
|
||||||
|
|
||||||
uint64_t downlink_frequency[MAX_NUM_CCs][4];
|
uint64_t downlink_frequency[MAX_NUM_CCs][4];
|
||||||
@@ -149,8 +151,6 @@ int numerology = 0;
|
|||||||
int oaisim_flag = 0;
|
int oaisim_flag = 0;
|
||||||
int emulate_rf = 0;
|
int emulate_rf = 0;
|
||||||
uint32_t N_RB_DL = 106;
|
uint32_t N_RB_DL = 106;
|
||||||
char uecap_xer_in = 0;
|
|
||||||
char uecap_xer[1024];
|
|
||||||
|
|
||||||
/* see file openair2/LAYER2/MAC/main.c for why abstraction_flag is needed
|
/* see file openair2/LAYER2/MAC/main.c for why abstraction_flag is needed
|
||||||
* this is very hackish - find a proper solution
|
* this is very hackish - find a proper solution
|
||||||
@@ -263,14 +263,6 @@ static void get_options(void) {
|
|||||||
|
|
||||||
if (vcdflag > 0)
|
if (vcdflag > 0)
|
||||||
ouput_vcd = 1;
|
ouput_vcd = 1;
|
||||||
|
|
||||||
if ( !(CONFIG_ISFLAGSET(CONFIG_ABORT)) && (!(CONFIG_ISFLAGSET(CONFIG_NOOOPT))) ) {
|
|
||||||
// Here the configuration file is the XER encoded UE capabilities
|
|
||||||
// Read it in and store in asn1c data structures
|
|
||||||
sprintf(uecap_xer,"%stargets/PROJECTS/GENERIC-LTE-EPC/CONF/UE_config.xml",getenv("OPENAIR_HOME"));
|
|
||||||
printf("%s\n",uecap_xer);
|
|
||||||
uecap_xer_in=1;
|
|
||||||
} /* UE with config file */
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// set PHY vars from command line
|
// set PHY vars from command line
|
||||||
@@ -453,7 +445,7 @@ int main( int argc, char **argv ) {
|
|||||||
#endif
|
#endif
|
||||||
LOG_I(HW, "Version: %s\n", PACKAGE_VERSION);
|
LOG_I(HW, "Version: %s\n", PACKAGE_VERSION);
|
||||||
|
|
||||||
init_NR_UE(1,rrc_config_path);
|
init_NR_UE(1,uecap_file,rrc_config_path);
|
||||||
|
|
||||||
int mode_offset = get_softmodem_params()->nsa ? NUMBER_OF_UE_MAX : 1;
|
int mode_offset = get_softmodem_params()->nsa ? NUMBER_OF_UE_MAX : 1;
|
||||||
uint16_t node_number = get_softmodem_params()->node_number;
|
uint16_t node_number = get_softmodem_params()->node_number;
|
||||||
@@ -522,7 +514,7 @@ int main( int argc, char **argv ) {
|
|||||||
// init UE_PF_PO and mutex lock
|
// init UE_PF_PO and mutex lock
|
||||||
pthread_mutex_init(&ue_pf_po_mutex, NULL);
|
pthread_mutex_init(&ue_pf_po_mutex, NULL);
|
||||||
memset (&UE_PF_PO[0][0], 0, sizeof(UE_PF_PO_t)*NUMBER_OF_UE_MAX*MAX_NUM_CCs);
|
memset (&UE_PF_PO[0][0], 0, sizeof(UE_PF_PO_t)*NUMBER_OF_UE_MAX*MAX_NUM_CCs);
|
||||||
configure_linux();
|
set_latency_target();
|
||||||
mlockall(MCL_CURRENT | MCL_FUTURE);
|
mlockall(MCL_CURRENT | MCL_FUTURE);
|
||||||
|
|
||||||
if(IS_SOFTMODEM_DOSCOPE) {
|
if(IS_SOFTMODEM_DOSCOPE) {
|
||||||
|
|||||||
@@ -33,8 +33,9 @@
|
|||||||
{"dlsch-parallel", CONFIG_HLP_DLSCH_PARA, 0, iptr:(int32_t *)&nrUE_params.nr_dlsch_parallel, defintval:0, TYPE_UINT8, 0}, \
|
{"dlsch-parallel", CONFIG_HLP_DLSCH_PARA, 0, iptr:(int32_t *)&nrUE_params.nr_dlsch_parallel, defintval:0, TYPE_UINT8, 0}, \
|
||||||
{"offset-divisor", CONFIG_HLP_OFFSET_DIV, 0, uptr:(uint32_t *)&nrUE_params.ofdm_offset_divisor, defuintval:UINT_MAX, TYPE_UINT32, 0}, \
|
{"offset-divisor", CONFIG_HLP_OFFSET_DIV, 0, uptr:(uint32_t *)&nrUE_params.ofdm_offset_divisor, defuintval:UINT_MAX, TYPE_UINT32, 0}, \
|
||||||
{"nr-dlsch-demod-shift", CONFIG_HLP_DLSHIFT, 0, iptr:(int32_t *)&nr_dlsch_demod_shift, defintval:0, TYPE_INT, 0}, \
|
{"nr-dlsch-demod-shift", CONFIG_HLP_DLSHIFT, 0, iptr:(int32_t *)&nr_dlsch_demod_shift, defintval:0, TYPE_INT, 0}, \
|
||||||
{"V" , CONFIG_HLP_VCD, PARAMFLAG_BOOL, iptr:&vcdflag, defintval:0, TYPE_INT, 0}, \
|
{"V" , CONFIG_HLP_VCD, PARAMFLAG_BOOL, iptr:&vcdflag, defintval:0, TYPE_INT, 0}, \
|
||||||
{"rrc_config_path", CONFIG_HLP_RRC_CFG_PATH,0, strptr:(char **)&rrc_config_path, defstrval:"./", TYPE_STRING, 0}, \
|
{"uecap_file", CONFIG_HLP_UECAP_FILE, 0, strptr:(char **)&uecap_file, defstrval:"./uecap.xml", TYPE_STRING, 0}, \
|
||||||
|
{"rrc_config_path", CONFIG_HLP_RRC_CFG_PATH,0, strptr:(char **)&rrc_config_path, defstrval:"./", TYPE_STRING, 0}, \
|
||||||
{"ue-idx-standalone", NULL, 0, u16ptr:&ue_idx_standalone, defuintval:0xFFFF, TYPE_UINT16, 0} \
|
{"ue-idx-standalone", NULL, 0, u16ptr:&ue_idx_standalone, defuintval:0xFFFF, TYPE_UINT16, 0} \
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -85,7 +86,7 @@ extern nrUE_params_t *get_nrUE_params(void);
|
|||||||
// In nr-ue.c
|
// In nr-ue.c
|
||||||
extern int setup_nr_ue_buffers(PHY_VARS_NR_UE **phy_vars_ue, openair0_config_t *openair0_cfg);
|
extern int setup_nr_ue_buffers(PHY_VARS_NR_UE **phy_vars_ue, openair0_config_t *openair0_cfg);
|
||||||
extern void fill_ue_band_info(void);
|
extern void fill_ue_band_info(void);
|
||||||
extern void init_NR_UE(int, char*);
|
extern void init_NR_UE(int, char*, char*);
|
||||||
extern void init_NR_UE_threads(int);
|
extern void init_NR_UE_threads(int);
|
||||||
extern void reset_opp_meas(void);
|
extern void reset_opp_meas(void);
|
||||||
extern void print_opp_meas(void);
|
extern void print_opp_meas(void);
|
||||||
|
|||||||
@@ -920,7 +920,7 @@ int main( int argc, char **argv ) {
|
|||||||
# define PACKAGE_VERSION "UNKNOWN"
|
# define PACKAGE_VERSION "UNKNOWN"
|
||||||
#endif
|
#endif
|
||||||
LOG_I(HW, "Version: %s\n", PACKAGE_VERSION);
|
LOG_I(HW, "Version: %s\n", PACKAGE_VERSION);
|
||||||
configure_linux();
|
set_latency_target();
|
||||||
get_options ();
|
get_options ();
|
||||||
get_common_options(SOFTMODEM_GNB_BIT );
|
get_common_options(SOFTMODEM_GNB_BIT );
|
||||||
AssertFatal(!CONFIG_ISFLAGSET(CONFIG_ABORT),"Getting configuration failed\n");
|
AssertFatal(!CONFIG_ISFLAGSET(CONFIG_ABORT),"Getting configuration failed\n");
|
||||||
|
|||||||
@@ -1101,41 +1101,10 @@ void pnf_phy_deallocate_p7_vendor_ext(nfapi_p7_message_header_t *header) {
|
|||||||
|
|
||||||
notifiedFIFO_elt_t *l1tx_message_extract(PHY_VARS_gNB *gNB, int frame, int slot) {
|
notifiedFIFO_elt_t *l1tx_message_extract(PHY_VARS_gNB *gNB, int frame, int slot) {
|
||||||
notifiedFIFO_elt_t *res;
|
notifiedFIFO_elt_t *res;
|
||||||
notifiedFIFO_elt_t *freeRes = NULL;
|
|
||||||
|
|
||||||
// check first message
|
//TODO: This needs to be reworked for nfapi to work
|
||||||
res = pullTpool(gNB->resp_L1_tx, gNB->threadPool);
|
res = pullTpool(gNB->L1_tx_free, gNB->threadPool);
|
||||||
processingData_L1tx_t *msgTx = (processingData_L1tx_t *)NotifiedFifoData(res);
|
return res;
|
||||||
if (msgTx->slot == slot) {
|
|
||||||
return res;
|
|
||||||
}
|
|
||||||
if (msgTx->slot == -1) {
|
|
||||||
freeRes = res;
|
|
||||||
}
|
|
||||||
|
|
||||||
// check second message
|
|
||||||
pushNotifiedFIFO(gNB->resp_L1_tx,res);
|
|
||||||
res = pullTpool(gNB->resp_L1_tx, gNB->threadPool);
|
|
||||||
msgTx = (processingData_L1tx_t *)NotifiedFifoData(res);
|
|
||||||
if (msgTx->slot == slot) {
|
|
||||||
return res;
|
|
||||||
}
|
|
||||||
if (msgTx->slot == -1) {
|
|
||||||
freeRes = res;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (freeRes) {
|
|
||||||
msgTx = (processingData_L1tx_t *)NotifiedFifoData(res);
|
|
||||||
msgTx->num_pdsch_slot=0;
|
|
||||||
msgTx->pdcch_pdu.pdcch_pdu_rel15.numDlDci = 0;
|
|
||||||
msgTx->ul_pdcch_pdu.pdcch_pdu.pdcch_pdu_rel15.numDlDci = 0;
|
|
||||||
msgTx->slot = slot;
|
|
||||||
msgTx->frame = frame;
|
|
||||||
return freeRes;
|
|
||||||
}
|
|
||||||
pushNotifiedFIFO(gNB->resp_L1_tx,res);
|
|
||||||
AssertFatal(1==0, "It means both L1 Tx messages are still waiting to be processed. This happens when L1 Tx processing is too slow. Message slot %d, scheduled slot %d\n",
|
|
||||||
msgTx->slot, slot);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
int pnf_phy_ul_dci_req(gNB_L1_rxtx_proc_t *proc, nfapi_pnf_p7_config_t *pnf_p7, nfapi_nr_ul_dci_request_t *req) {
|
int pnf_phy_ul_dci_req(gNB_L1_rxtx_proc_t *proc, nfapi_pnf_p7_config_t *pnf_p7, nfapi_nr_ul_dci_request_t *req) {
|
||||||
@@ -1161,7 +1130,7 @@ int pnf_phy_ul_dci_req(gNB_L1_rxtx_proc_t *proc, nfapi_pnf_p7_config_t *pnf_p7,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pushNotifiedFIFO(gNB->resp_L1_tx,res);
|
pushNotifiedFIFO(gNB->L1_tx_filled,res);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@@ -1269,7 +1238,7 @@ int pnf_phy_dl_tti_req(gNB_L1_rxtx_proc_t *proc, nfapi_pnf_p7_config_t *pnf_p7,
|
|||||||
else {
|
else {
|
||||||
NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s() UNKNOWN:%d\n", __FUNCTION__, dl_tti_pdu_list[i].PDUType);
|
NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s() UNKNOWN:%d\n", __FUNCTION__, dl_tti_pdu_list[i].PDUType);
|
||||||
}
|
}
|
||||||
pushNotifiedFIFO(gNB->resp_L1_tx,res);
|
pushNotifiedFIFO(gNB->L1_tx_filled,res);
|
||||||
}
|
}
|
||||||
|
|
||||||
if(req->vendor_extension)
|
if(req->vendor_extension)
|
||||||
|
|||||||
@@ -353,6 +353,8 @@ typedef struct {
|
|||||||
} fapi_nr_ul_config_request_pdu_t;
|
} fapi_nr_ul_config_request_pdu_t;
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
|
//uint16_t sfn;
|
||||||
|
//uint16_t slot;
|
||||||
uint16_t sfn;
|
uint16_t sfn;
|
||||||
uint16_t slot;
|
uint16_t slot;
|
||||||
uint8_t number_pdus;
|
uint8_t number_pdus;
|
||||||
|
|||||||
@@ -24,12 +24,33 @@ loading `libldpc_cl.so` instead of `libldpc.so`:
|
|||||||
|
|
||||||
`make ldpc_cl`
|
`make ldpc_cl`
|
||||||
|
|
||||||
`cp ../../../openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_decoder_kernels_CL.cl`
|
This command creates the `libldpc_cl.so` shared library. To perform this build successfully, only the OpenCL header `(/usr/include/CL/opencl.h)` and library `(/usr/lib/x86_64-linux-gnu/libOpenCL.so)`are required, they implement OpenCL API support which is not hardware dependent.
|
||||||
|
|
||||||
|
```
|
||||||
|
Scanning dependencies of target nrLDPC_decoder_kernels_CL
|
||||||
|
Built target nrLDPC_decoder_kernels_CL
|
||||||
|
Scanning dependencies of target ldpc_cl
|
||||||
|
Building C object CMakeFiles/ldpc_cl.dir/usr/local/oai/oai-develop/openairinterface5g/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_decoder_CL.c.o
|
||||||
|
In file included from /usr/include/CL/cl.h:32,
|
||||||
|
from /usr/include/CL/opencl.h:38,
|
||||||
|
from /usr/local/oai/oai-develop/openairinterface5g/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_decoder_CL.c:49:
|
||||||
|
/usr/include/CL/cl_version.h:34:9: note: #pragma message: cl_version.h: CL_TARGET_OPENCL_VERSION is not defined. Defaulting to 220 (OpenCL 2.2)
|
||||||
|
#pragma message("cl_version.h: CL_TARGET_OPENCL_VERSION is not defined. Defaulting to 220 (OpenCL 2.2)")
|
||||||
|
^~~~~~~
|
||||||
|
|
||||||
|
Building C object CMakeFiles/ldpc_cl.dir/usr/local/oai/oai-develop/openairinterface5g/openair1/PHY/CODING/nrLDPC_encoder/ldpc_encoder_optim8segmulti.c.o
|
||||||
|
Linking C shared module libldpc_cl.so
|
||||||
|
Built target ldpc_cl
|
||||||
|
|
||||||
|
```
|
||||||
|
|
||||||
|
At runtime, to successfully use hardware acceleration via OpenCL, you need to install vendor specific packages which deliver the required drivers and tools to make use of their GPU (Nvidia, Intel...) , fpga (Xilinx, Intel) or CPU (Intel, AMD, ARM...) through OpenCL.
|
||||||
|
|
||||||
`./nr-softmodem -O libconfig:gnb.band78.sa.fr1.106PRB.usrpb210.conf:dbgl5 --rfsim --rfsimulator.serveraddr server --sa --log_config.gtpu_log_level info --loader.ldpc.shlibversion _cl`
|
`./nr-softmodem -O libconfig:gnb.band78.sa.fr1.106PRB.usrpb210.conf:dbgl5 --rfsim --rfsimulator.serveraddr server --sa --log_config.gtpu_log_level info --loader.ldpc.shlibversion _cl`
|
||||||
|
|
||||||
``` [LOADER] library libldpc_cl.so successfully loaded
|
```
|
||||||
------------------------------------------------
|
------------------------------------------------
|
||||||
|
[LOADER] library libldpc_cl.so successfully loaded
|
||||||
[HW] Platform 0, OpenCL profile FULL_PROFILE
|
[HW] Platform 0, OpenCL profile FULL_PROFILE
|
||||||
[HW] Platform 0, OpenCL version OpenCL 2.1 LINUX
|
[HW] Platform 0, OpenCL version OpenCL 2.1 LINUX
|
||||||
[HW] Device 0 is available
|
[HW] Device 0 is available
|
||||||
@@ -62,8 +83,9 @@ loading `libldpc_cl.so` instead of `libldpc.so`:
|
|||||||
|
|
||||||
`./nr-uesoftmodem -r 106 --numerology 1 --band 78 -C 3619200000 --rfsim --sa -O libconfig:/usr/local/oai/conf/nrue_sim.conf:dbgl5 --nokrnmod --loader.ldpc.shlibversion _cl --log_config.hw_log_level info`
|
`./nr-uesoftmodem -r 106 --numerology 1 --band 78 -C 3619200000 --rfsim --sa -O libconfig:/usr/local/oai/conf/nrue_sim.conf:dbgl5 --nokrnmod --loader.ldpc.shlibversion _cl --log_config.hw_log_level info`
|
||||||
|
|
||||||
```[CONFIG] shlibversion set to _cl from command line
|
```
|
||||||
............................................................
|
............................................................
|
||||||
|
[CONFIG] shlibversion set to _cl from command line
|
||||||
[CONFIG] loader.ldpc 1 options set from command line
|
[CONFIG] loader.ldpc 1 options set from command line
|
||||||
[LOADER] library libldpc_cl.so successfully loaded
|
[LOADER] library libldpc_cl.so successfully loaded
|
||||||
[HW] Platform 0, OpenCL profile FULL_PROFILE
|
[HW] Platform 0, OpenCL profile FULL_PROFILE
|
||||||
@@ -94,7 +116,6 @@ loading `libldpc_cl.so` instead of `libldpc.so`:
|
|||||||
[HW] Device 0, max Work Items size for dimension: 1 512
|
[HW] Device 0, max Work Items size for dimension: 1 512
|
||||||
[HW] Device 0, max Work Items size for dimension: 2 512
|
[HW] Device 0, max Work Items size for dimension: 2 512
|
||||||
------------------------------------------------------------
|
------------------------------------------------------------
|
||||||
```
|
|
||||||
```
|
```
|
||||||
|
|
||||||
A mechanism to select ldpc implementation is also available in the `ldpctest` phy simulator via the `-v`option, which can be used to specify the version of the ldpc shared library to be used.
|
A mechanism to select ldpc implementation is also available in the `ldpctest` phy simulator via the `-v`option, which can be used to specify the version of the ldpc shared library to be used.
|
||||||
@@ -103,7 +124,9 @@ A mechanism to select ldpc implementation is also available in the `ldpctest` ph
|
|||||||
|
|
||||||
Loading libldpc_cuda.so, the cuda implementation of the ldpc decoder:
|
Loading libldpc_cuda.so, the cuda implementation of the ldpc decoder:
|
||||||
|
|
||||||
```$ ./ldpctest -v _cuda
|
```
|
||||||
|
$ ./ldpctest -v _cuda
|
||||||
|
ldpctest -v _cuda
|
||||||
Initializing random number generator, seed 0
|
Initializing random number generator, seed 0
|
||||||
block length 8448:
|
block length 8448:
|
||||||
n_trials 1:
|
n_trials 1:
|
||||||
@@ -119,18 +142,16 @@ log init done
|
|||||||
[CONFIG] loader.ldpc: 1/2 parameters successfully set
|
[CONFIG] loader.ldpc: 1/2 parameters successfully set
|
||||||
[LOADER] library libldpc_cuda.so successfully loaded
|
[LOADER] library libldpc_cuda.so successfully loaded
|
||||||
...................................
|
...................................
|
||||||
```
|
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|
||||||
Loading libldpc_cl.so, the opencl implementation of the ldpc decoder:
|
Loading libldpc_cl.so, the opencl implementation of the ldpc decoder:
|
||||||
|
|
||||||
`make ldpc_cl`
|
`make ldpc_cl`
|
||||||
|
|
||||||
`cp ../../../openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_decoder_kernels_CL.cl`
|
|
||||||
|
|
||||||
`./ldpctest -v _cl`
|
```
|
||||||
|
$ ./ldpctest -v _cl
|
||||||
```$ ./ldpctest -v _cl
|
|
||||||
Initializing random number generator, seed 0
|
Initializing random number generator, seed 0
|
||||||
block length 8448:
|
block length 8448:
|
||||||
n_trials 1:
|
n_trials 1:
|
||||||
@@ -164,7 +185,6 @@ log init done
|
|||||||
[HW] Device 0, max Work Items size for dimension: 1 512
|
[HW] Device 0, max Work Items size for dimension: 1 512
|
||||||
[HW] Device 0, max Work Items size for dimension: 2 512
|
[HW] Device 0, max Work Items size for dimension: 2 512
|
||||||
................................
|
................................
|
||||||
```
|
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|
||||||
@@ -174,6 +194,6 @@ Libraries implementing the LDPC algorithms must be named `libldpc<_version>.so`,
|
|||||||
|
|
||||||
`libldpc_cuda.so`has been tested with the `ldpctest` executable, usage from the softmodem's has to be tested.
|
`libldpc_cuda.so`has been tested with the `ldpctest` executable, usage from the softmodem's has to be tested.
|
||||||
|
|
||||||
`libldpc_cl`is under development.
|
`libldpc_cl.so`is under development.
|
||||||
|
|
||||||
[oai Wikis home](https://gitlab.eurecom.fr/oai/openairinterface5g/wikis/home)
|
[oai Wikis home](https://gitlab.eurecom.fr/oai/openairinterface5g/wikis/home)
|
||||||
|
|||||||
@@ -514,7 +514,7 @@ int main(int argc, char *argv[])
|
|||||||
unsigned char qbits=8;
|
unsigned char qbits=8;
|
||||||
unsigned int decoded_errors[10000]; // initiate the size of matrix equivalent to size of SNR
|
unsigned int decoded_errors[10000]; // initiate the size of matrix equivalent to size of SNR
|
||||||
int c,i=0, i1 = 0;
|
int c,i=0, i1 = 0;
|
||||||
|
int loglvl=OAILOG_WARNING;
|
||||||
int n_trials = 1;
|
int n_trials = 1;
|
||||||
double SNR_step = 0.1;
|
double SNR_step = 0.1;
|
||||||
|
|
||||||
@@ -525,8 +525,11 @@ int main(int argc, char *argv[])
|
|||||||
n_iter_stats_t dec_iter[3];
|
n_iter_stats_t dec_iter[3];
|
||||||
|
|
||||||
short BG=0,Zc,Kb=0;
|
short BG=0,Zc,Kb=0;
|
||||||
|
if ( load_configmodule(argc,argv,CONFIG_ENABLECMDLINEONLY) == 0) {
|
||||||
|
exit_fun(" Error, configuration module init failed\n");
|
||||||
|
} // must be done before specific options parsing to prevent errasing them
|
||||||
|
|
||||||
while ((c = getopt (argc, argv, "q:r:s:S:l:G:n:d:i:t:u:hv:")) != -1)
|
while ((c = getopt (argc, argv, "q:r:s:S:l:L:G:n:d:i:t:u:hv:")) != -1)
|
||||||
switch (c)
|
switch (c)
|
||||||
{
|
{
|
||||||
case 'q':
|
case 'q':
|
||||||
@@ -545,6 +548,10 @@ int main(int argc, char *argv[])
|
|||||||
block_length = atoi(optarg);
|
block_length = atoi(optarg);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case 'L':
|
||||||
|
loglvl = atoi(optarg);
|
||||||
|
break;
|
||||||
|
|
||||||
case 'G':
|
case 'G':
|
||||||
ldpc_version="_cuda";
|
ldpc_version="_cuda";
|
||||||
break;
|
break;
|
||||||
@@ -581,6 +588,7 @@ int main(int argc, char *argv[])
|
|||||||
printf("BG1 (blocklength > 3840): 1/3, 2/3, 22/25 (8/9) \n");
|
printf("BG1 (blocklength > 3840): 1/3, 2/3, 22/25 (8/9) \n");
|
||||||
printf("BG2 (blocklength <= 3840): 1/5, 1/3, 2/3 \n\n");
|
printf("BG2 (blocklength <= 3840): 1/5, 1/3, 2/3 \n\n");
|
||||||
printf("-h This message\n");
|
printf("-h This message\n");
|
||||||
|
printf("-L <log level, 0(errors), 1(warning), 2(info) 3(debug) 4 (trace)>\n");
|
||||||
printf("-q Quantization bits, Default: 8\n");
|
printf("-q Quantization bits, Default: 8\n");
|
||||||
printf("-r Nominator rate, (1, 2, 22), Default: 1\n");
|
printf("-r Nominator rate, (1, 2, 22), Default: 1\n");
|
||||||
printf("-d Denominator rate, (3, 5, 25), Default: 1\n");
|
printf("-d Denominator rate, (3, 5, 25), Default: 1\n");
|
||||||
@@ -603,6 +611,8 @@ int main(int argc, char *argv[])
|
|||||||
printf("n_trials %d: \n", n_trials);
|
printf("n_trials %d: \n", n_trials);
|
||||||
printf("SNR0 %f: \n", SNR0);
|
printf("SNR0 %f: \n", SNR0);
|
||||||
|
|
||||||
|
logInit();
|
||||||
|
set_glog(loglvl);
|
||||||
|
|
||||||
if (ldpc_version != NULL)
|
if (ldpc_version != NULL)
|
||||||
load_nrLDPClib(ldpc_version);
|
load_nrLDPClib(ldpc_version);
|
||||||
|
|||||||
@@ -25,15 +25,7 @@
|
|||||||
* \version 1.0
|
* \version 1.0
|
||||||
* \note initial implem - translation of cuda version
|
* \note initial implem - translation of cuda version
|
||||||
*/
|
*/
|
||||||
/* uses HW component id for log messages ( --log_config.hw_log_level <warning| info|debug|trace>) */
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <unistd.h>
|
|
||||||
#include <cuda_runtime.h>
|
|
||||||
#include <CL/opencl.h>
|
|
||||||
#include "PHY/CODING/nrLDPC_decoder/nrLDPC_types.h"
|
|
||||||
#include "PHY/CODING/nrLDPC_decoder/nrLDPCdecoder_defs.h"
|
|
||||||
#include "assertions.h"
|
|
||||||
#include "common/utils/LOG/log.h"
|
|
||||||
|
|
||||||
#define MAX_ITERATION 2
|
#define MAX_ITERATION 2
|
||||||
#define MC 1
|
#define MC 1
|
||||||
@@ -41,16 +33,29 @@
|
|||||||
#define MAX_OCLDEV 10
|
#define MAX_OCLDEV 10
|
||||||
#define MAX_OCLRUNTIME 5
|
#define MAX_OCLRUNTIME 5
|
||||||
|
|
||||||
|
|
||||||
#define CLSETKERNELARG(A,B,C,D) \
|
|
||||||
rt=clSetKernelArg(A,B,C,D) ;\
|
|
||||||
AssertFatal(rt == CL_SUCCESS, "Error %d setting kernel argument index %d\n" , (int)rt, B);
|
|
||||||
|
|
||||||
typedef struct{
|
typedef struct{
|
||||||
char x;
|
char x;
|
||||||
char y;
|
char y;
|
||||||
short value;
|
short value;
|
||||||
} h_element;
|
} h_element;
|
||||||
|
|
||||||
|
#ifdef NRLDPC_KERNEL_SOURCE
|
||||||
|
#include "nrLDPC_decoder_kernels_CL.c"
|
||||||
|
#else
|
||||||
|
/* uses HW component id for log messages ( --log_config.hw_log_level <warning| info|debug|trace>) */
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
#include <sys/stat.h>
|
||||||
|
#include <CL/opencl.h>
|
||||||
|
#include "PHY/CODING/nrLDPC_decoder/nrLDPC_types.h"
|
||||||
|
#include "PHY/CODING/nrLDPC_decoder/nrLDPCdecoder_defs.h"
|
||||||
|
#include "assertions.h"
|
||||||
|
#include "common/utils/LOG/log.h"
|
||||||
|
|
||||||
|
#define CLSETKERNELARG(A,B,C,D) \
|
||||||
|
rt=clSetKernelArg(A,B,C,D) ;\
|
||||||
|
AssertFatal(rt == CL_SUCCESS, "Error %d setting kernel argument index %d\n" , (int)rt, B);
|
||||||
|
|
||||||
#include "../nrLDPC_decoder_LYC/bgs/BG1_compact_in_C.h"
|
#include "../nrLDPC_decoder_LYC/bgs/BG1_compact_in_C.h"
|
||||||
|
|
||||||
typedef struct{
|
typedef struct{
|
||||||
@@ -213,20 +218,31 @@ void get_CompilErr(cl_program program, int pltf) {
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
size_t load_source(char **source_str) {
|
size_t load_source(char **source_str, char *filename) {
|
||||||
int MAX_SOURCE_SIZE=(500*132);
|
|
||||||
FILE *fp;
|
FILE *fp;
|
||||||
|
struct stat st ;
|
||||||
size_t source_size;
|
size_t source_size;
|
||||||
|
char *src= NULL;
|
||||||
|
|
||||||
fp = fopen("nrLDPC_decoder_kernels_CL.cl", "r");
|
if (filename == NULL) {
|
||||||
AssertFatal(fp,"failed to open cl source: %s\n",strerror(errno));
|
src = "nrLDPC_decoder_kernels_CL.clc";
|
||||||
|
} else {
|
||||||
|
src = filename;
|
||||||
|
}
|
||||||
|
fp = fopen(src, "r");
|
||||||
|
AssertFatal(fp,"failed to open cl source %s: %s\n",src,strerror(errno));
|
||||||
|
|
||||||
*source_str = (char*)malloc(MAX_SOURCE_SIZE);
|
fstat(fileno(fp), &st);
|
||||||
source_size = fread( *source_str, 1, MAX_SOURCE_SIZE, fp);
|
source_size = st.st_size;
|
||||||
fclose( fp );
|
*source_str = (char*)malloc(source_size);
|
||||||
return source_size;
|
source_size = fread( *source_str, 1, source_size, fp);
|
||||||
|
fclose( fp );
|
||||||
|
LOG_I(HW,"Loaded kernel sources from %s %u bytes\n", (filename==NULL)?"embedded cl code":src,(unsigned int)source_size );
|
||||||
|
return source_size;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/* from here: entry points in decoder shared lib */
|
/* from here: entry points in decoder shared lib */
|
||||||
int ldpc_autoinit(void) { // called by the library loader
|
int ldpc_autoinit(void) { // called by the library loader
|
||||||
cl_platform_id platforms[10];
|
cl_platform_id platforms[10];
|
||||||
@@ -284,11 +300,11 @@ int ldpc_autoinit(void) { // called by the library loader
|
|||||||
ocl.runtime[i].dev_tmp = clCreateBuffer(ocl.runtime[i].context, CL_MEM_READ_ONLY|CL_MEM_HOST_WRITE_ONLY, 68*384, NULL, (cl_int *)&rt);
|
ocl.runtime[i].dev_tmp = clCreateBuffer(ocl.runtime[i].context, CL_MEM_READ_ONLY|CL_MEM_HOST_WRITE_ONLY, 68*384, NULL, (cl_int *)&rt);
|
||||||
AssertFatal(rt == CL_SUCCESS, "Error %d creating buffer dev_tmp for platform %i \n" , (int)rt, i);
|
AssertFatal(rt == CL_SUCCESS, "Error %d creating buffer dev_tmp for platform %i \n" , (int)rt, i);
|
||||||
char *source_str;
|
char *source_str;
|
||||||
size_t source_size=load_source(&source_str);
|
size_t source_size=load_source(&source_str,"nrLDPC_decoder_kernels_CL.clc");
|
||||||
cl_program program = clCreateProgramWithSource(ocl.runtime[i].context, 1,
|
cl_program program = clCreateProgramWithSource(ocl.runtime[i].context, 1,
|
||||||
(const char **)&source_str, (const size_t *)&source_size, (cl_int *)&rt);
|
(const char **)&source_str, (const size_t *)&source_size, (cl_int *)&rt);
|
||||||
AssertFatal(rt == CL_SUCCESS, "Error %d creating program for platform %i \n" , (int)rt, i);
|
AssertFatal(rt == CL_SUCCESS, "Error %d creating program for platform %i \n" , (int)rt, i);
|
||||||
rt = clBuildProgram(program, ocl.runtime[i].num_devices,ocl.runtime[i].devices, NULL, NULL, NULL);
|
rt = clBuildProgram(program, ocl.runtime[i].num_devices,ocl.runtime[i].devices, NULL /* compile options */, NULL, NULL);
|
||||||
if (rt == CL_BUILD_PROGRAM_FAILURE) {
|
if (rt == CL_BUILD_PROGRAM_FAILURE) {
|
||||||
get_CompilErr(program,i);
|
get_CompilErr(program,i);
|
||||||
}
|
}
|
||||||
@@ -434,3 +450,4 @@ int32_t nrLDPC_decod(t_nrLDPC_dec_params* p_decParams, int8_t* p_llr, int8_t* p_
|
|||||||
return MAX_ITERATION;
|
return MAX_ITERATION;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
#endif //NRLDPC_KERNEL_SOURCE
|
||||||
|
|||||||
+1
-11
@@ -29,16 +29,7 @@
|
|||||||
* \note initial implem - translation of cuda version
|
* \note initial implem - translation of cuda version
|
||||||
* \warning
|
* \warning
|
||||||
*/
|
*/
|
||||||
#define define MAX_ITERATION 2
|
|
||||||
#define MC 1
|
|
||||||
|
|
||||||
#define INT32_MAX 2147483647
|
|
||||||
|
|
||||||
typedef struct{
|
|
||||||
char x;
|
|
||||||
char y;
|
|
||||||
short value;
|
|
||||||
} h_element;
|
|
||||||
|
|
||||||
//__global char dev_dt [46*68*384];
|
//__global char dev_dt [46*68*384];
|
||||||
//__local char *dev_t;
|
//__local char *dev_t;
|
||||||
@@ -46,7 +37,7 @@ typedef struct{
|
|||||||
//__global unsigned char dev_tmp[68*384];
|
//__global unsigned char dev_tmp[68*384];
|
||||||
|
|
||||||
|
|
||||||
|
#define INT32_MAX 2147483647
|
||||||
|
|
||||||
//__constant h_element dev_h_compact1[46*19] = {}; // used in kernel 1
|
//__constant h_element dev_h_compact1[46*19] = {}; // used in kernel 1
|
||||||
//__constant h_element dev_h_compact2[68*30] = {}; // used in kernel 2
|
//__constant h_element dev_h_compact2[68*30] = {}; // used in kernel 2
|
||||||
@@ -299,4 +290,3 @@ __kernel void pack_decoded_bit(__global unsigned char * dev_llr, __global unsign
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -46,14 +46,14 @@ static loader_shlibfunc_t shlib_fdesc[3];
|
|||||||
|
|
||||||
/* arguments used when called from phy simulators exec's which do not use the config module */
|
/* arguments used when called from phy simulators exec's which do not use the config module */
|
||||||
/* arg is used to initialize the config module so that the loader works as expected */
|
/* arg is used to initialize the config module so that the loader works as expected */
|
||||||
char *arg[64]={"ldpctest","-O","cmdlineonly::dbgl0",NULL,NULL};
|
char *arg[64]={"ldpctest",NULL};
|
||||||
|
|
||||||
int load_nrLDPClib(char *version) {
|
int load_nrLDPClib(char *version) {
|
||||||
char *ptr = (char*)config_get_if();
|
char *ptr = (char*)config_get_if();
|
||||||
char libname[64]="ldpc";
|
char libname[64]="ldpc";
|
||||||
|
|
||||||
if ( ptr==NULL ) {// phy simulators, config module possibly not loaded
|
if ( ptr==NULL ) {// phy simulators, config module possibly not loaded
|
||||||
load_configmodule(0,(char **)NULL,CONFIG_ENABLECMDLINEONLY) ;
|
load_configmodule(1,arg,CONFIG_ENABLECMDLINEONLY) ;
|
||||||
logInit();
|
logInit();
|
||||||
}
|
}
|
||||||
shlib_fdesc[0].fname = "nrLDPC_decod";
|
shlib_fdesc[0].fname = "nrLDPC_decod";
|
||||||
|
|||||||
@@ -41,6 +41,7 @@
|
|||||||
#include "PHY/NR_REFSIG/ul_ref_seq_nr.h"
|
#include "PHY/NR_REFSIG/ul_ref_seq_nr.h"
|
||||||
#include "PHY/NR_REFSIG/refsig_defs_ue.h"
|
#include "PHY/NR_REFSIG/refsig_defs_ue.h"
|
||||||
#include "PHY/NR_REFSIG/nr_refsig.h"
|
#include "PHY/NR_REFSIG/nr_refsig.h"
|
||||||
|
#include <openair1/PHY/MODULATION/nr_modulation.h>
|
||||||
|
|
||||||
#if 0
|
#if 0
|
||||||
void phy_config_harq_ue(module_id_t Mod_id,
|
void phy_config_harq_ue(module_id_t Mod_id,
|
||||||
|
|||||||
@@ -250,11 +250,9 @@ int nr_init_frame_parms(nfapi_nr_config_request_scf_t* cfg,
|
|||||||
int Ncp = NFAPI_CP_NORMAL;
|
int Ncp = NFAPI_CP_NORMAL;
|
||||||
int mu = cfg->ssb_config.scs_common.value;
|
int mu = cfg->ssb_config.scs_common.value;
|
||||||
|
|
||||||
#if DISABLE_LOG_X
|
|
||||||
printf("Initializing frame parms for mu %d, N_RB %d, Ncp %d\n",mu, fp->N_RB_DL, Ncp);
|
|
||||||
#else
|
|
||||||
LOG_I(PHY,"Initializing frame parms for mu %d, N_RB %d, Ncp %d\n",mu, fp->N_RB_DL, Ncp);
|
LOG_I(PHY,"Initializing frame parms for mu %d, N_RB %d, Ncp %d\n",mu, fp->N_RB_DL, Ncp);
|
||||||
#endif
|
|
||||||
|
|
||||||
if (Ncp == NFAPI_CP_EXTENDED)
|
if (Ncp == NFAPI_CP_EXTENDED)
|
||||||
AssertFatal(mu == NR_MU_2,"Invalid cyclic prefix %d for numerology index %d\n", Ncp, mu);
|
AssertFatal(mu == NR_MU_2,"Invalid cyclic prefix %d for numerology index %d\n", Ncp, mu);
|
||||||
@@ -343,11 +341,8 @@ int nr_init_frame_parms_ue(NR_DL_FRAME_PARMS *fp,
|
|||||||
|
|
||||||
AssertFatal(fp->ul_CarrierFreq == (fp->dl_CarrierFreq + uplink_frequency_offset), "Disagreement in uplink frequency for band %d: ul_CarrierFreq = %lu Hz vs expected %lu Hz\n", fp->nr_band, fp->ul_CarrierFreq, fp->dl_CarrierFreq + uplink_frequency_offset);
|
AssertFatal(fp->ul_CarrierFreq == (fp->dl_CarrierFreq + uplink_frequency_offset), "Disagreement in uplink frequency for band %d: ul_CarrierFreq = %lu Hz vs expected %lu Hz\n", fp->nr_band, fp->ul_CarrierFreq, fp->dl_CarrierFreq + uplink_frequency_offset);
|
||||||
|
|
||||||
#if DISABLE_LOG_X
|
|
||||||
printf("Initializing UE frame parms for mu %d, N_RB %d, Ncp %d\n",fp->numerology_index, fp->N_RB_DL, Ncp);
|
|
||||||
#else
|
|
||||||
LOG_I(PHY,"Initializing frame parms for mu %d, N_RB %d, Ncp %d\n",fp->numerology_index, fp->N_RB_DL, Ncp);
|
LOG_I(PHY,"Initializing frame parms for mu %d, N_RB %d, Ncp %d\n",fp->numerology_index, fp->N_RB_DL, Ncp);
|
||||||
#endif
|
|
||||||
|
|
||||||
if (Ncp == NFAPI_CP_EXTENDED)
|
if (Ncp == NFAPI_CP_EXTENDED)
|
||||||
AssertFatal(fp->numerology_index == NR_MU_2,"Invalid cyclic prefix %d for numerology index %d\n", Ncp, fp->numerology_index);
|
AssertFatal(fp->numerology_index == NR_MU_2,"Invalid cyclic prefix %d for numerology index %d\n", Ncp, fp->numerology_index);
|
||||||
|
|||||||
@@ -42,7 +42,6 @@
|
|||||||
#include "common/utils/LOG/log.h"
|
#include "common/utils/LOG/log.h"
|
||||||
#include "targets/RT/USER/lte-softmodem.h"
|
#include "targets/RT/USER/lte-softmodem.h"
|
||||||
#include <syscall.h>
|
#include <syscall.h>
|
||||||
#include "targets/RT/USER/rt_wrapper.h"
|
|
||||||
#include <common/utils/threadPool/thread-pool.h>
|
#include <common/utils/threadPool/thread-pool.h>
|
||||||
|
|
||||||
//#define DEBUG_DLSCH_CODING
|
//#define DEBUG_DLSCH_CODING
|
||||||
|
|||||||
@@ -46,10 +46,9 @@ void pcfich_unscrambling(LTE_DL_FRAME_PARMS *frame_parms,
|
|||||||
|
|
||||||
uint32_t i;
|
uint32_t i;
|
||||||
uint8_t reset;
|
uint8_t reset;
|
||||||
uint32_t x1, x2, s=0;
|
uint32_t x1=0, x2=0, s=0;
|
||||||
|
|
||||||
reset = 1;
|
reset = 1;
|
||||||
// x1 is set in lte_gold_generic
|
|
||||||
x2 = ((((2*frame_parms->Nid_cell)+1)*(1+subframe))<<9) + frame_parms->Nid_cell; //this is c_init in 36.211 Sec 6.7.1
|
x2 = ((((2*frame_parms->Nid_cell)+1)*(1+subframe))<<9) + frame_parms->Nid_cell; //this is c_init in 36.211 Sec 6.7.1
|
||||||
|
|
||||||
for (i=0; i<32; i++) {
|
for (i=0; i<32; i++) {
|
||||||
|
|||||||
@@ -105,10 +105,9 @@ void set_ptrs_symb_idx(uint16_t *ptrs_symbols,
|
|||||||
uint8_t L_ptrs,
|
uint8_t L_ptrs,
|
||||||
uint16_t ul_dmrs_symb_pos) {
|
uint16_t ul_dmrs_symb_pos) {
|
||||||
|
|
||||||
uint i = 0, last_symbol, l_ref;
|
int i = 0;
|
||||||
int l_counter;
|
int l_ref = start_symbol;
|
||||||
l_ref = start_symbol;
|
const int last_symbol = start_symbol + duration_in_symbols - 1;
|
||||||
last_symbol = start_symbol + duration_in_symbols - 1;
|
|
||||||
if (L_ptrs==0) {
|
if (L_ptrs==0) {
|
||||||
LOG_E(PHY,"bug: impossible L_ptrs\n");
|
LOG_E(PHY,"bug: impossible L_ptrs\n");
|
||||||
*ptrs_symbols = 0;
|
*ptrs_symbols = 0;
|
||||||
@@ -117,7 +116,7 @@ void set_ptrs_symb_idx(uint16_t *ptrs_symbols,
|
|||||||
|
|
||||||
while ( (l_ref + i*L_ptrs) <= last_symbol) {
|
while ( (l_ref + i*L_ptrs) <= last_symbol) {
|
||||||
|
|
||||||
int is_dmrs_symbol = 0;
|
int is_dmrs_symbol = 0, l_counter;
|
||||||
|
|
||||||
for(l_counter = l_ref + i*L_ptrs; l_counter >= max(l_ref + (i-1)*L_ptrs + 1, l_ref); l_counter--) {
|
for(l_counter = l_ref + i*L_ptrs; l_counter >= max(l_ref + (i-1)*L_ptrs + 1, l_ref); l_counter--) {
|
||||||
|
|
||||||
@@ -269,8 +268,8 @@ void nr_ptrs_cpe_estimation(uint8_t K_ptrs,
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
uint16_t sc_per_symbol = (nb_rb + K_ptrs - 1)/K_ptrs;
|
uint16_t sc_per_symbol = (nb_rb + K_ptrs - 1)/K_ptrs;
|
||||||
int16_t *ptrs_p = (int16_t *)malloc(sizeof(int32_t)*((1 + sc_per_symbol/4)*4));
|
struct complex16 ptrs_p[(1 + sc_per_symbol/4)*4];
|
||||||
int16_t *dmrs_comp_p = (int16_t *)malloc(sizeof(int32_t)*((1 + sc_per_symbol/4)*4));
|
struct complex16 dmrs_comp_p[(1 + sc_per_symbol/4)*4];
|
||||||
double abs = 0.0;
|
double abs = 0.0;
|
||||||
double real = 0.0;
|
double real = 0.0;
|
||||||
double imag = 0.0;
|
double imag = 0.0;
|
||||||
@@ -278,7 +277,7 @@ void nr_ptrs_cpe_estimation(uint8_t K_ptrs,
|
|||||||
double alpha = 0;
|
double alpha = 0;
|
||||||
#endif
|
#endif
|
||||||
/* generate PTRS RE for the symbol */
|
/* generate PTRS RE for the symbol */
|
||||||
nr_gen_ref_conj_symbols(gold_seq,sc_per_symbol*2,ptrs_p, NR_MOD_TABLE_QPSK_OFFSET,2);// 2 for QPSK
|
nr_gen_ref_conj_symbols(gold_seq,sc_per_symbol*2,(int16_t*)ptrs_p, NR_MOD_TABLE_QPSK_OFFSET,2);// 2 for QPSK
|
||||||
|
|
||||||
/* loop over all sub carriers to get compensated RE on ptrs symbols*/
|
/* loop over all sub carriers to get compensated RE on ptrs symbols*/
|
||||||
for (int re = 0; re < nb_re_pdsch; re++) {
|
for (int re = 0; re < nb_re_pdsch; re++) {
|
||||||
@@ -292,8 +291,8 @@ void nr_ptrs_cpe_estimation(uint8_t K_ptrs,
|
|||||||
0,// start_re is 0 here
|
0,// start_re is 0 here
|
||||||
ofdm_symbol_size);
|
ofdm_symbol_size);
|
||||||
if(is_ptrs_re) {
|
if(is_ptrs_re) {
|
||||||
dmrs_comp_p[re_cnt*2] = rxF_comp[re *2];
|
dmrs_comp_p[re_cnt].r = rxF_comp[re *2];
|
||||||
dmrs_comp_p[(re_cnt*2)+1] = rxF_comp[(re *2)+1];
|
dmrs_comp_p[re_cnt].i = rxF_comp[(re *2)+1];
|
||||||
re_cnt++;
|
re_cnt++;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
@@ -307,7 +306,7 @@ void nr_ptrs_cpe_estimation(uint8_t K_ptrs,
|
|||||||
*ptrs_sc = re_cnt;
|
*ptrs_sc = re_cnt;
|
||||||
|
|
||||||
/*Multiple compensated data with conj of PTRS */
|
/*Multiple compensated data with conj of PTRS */
|
||||||
mult_cpx_vector(dmrs_comp_p, ptrs_p, ptrs_ch_p,(1 + sc_per_symbol/4)*4,15); // 2^15 shifted
|
mult_cpx_vector((int16_t*)dmrs_comp_p, (int16_t*)ptrs_p, ptrs_ch_p,(1 + sc_per_symbol/4)*4,15); // 2^15 shifted
|
||||||
|
|
||||||
/* loop over all ptrs sub carriers in a symbol */
|
/* loop over all ptrs sub carriers in a symbol */
|
||||||
/* sum the error vector */
|
/* sum the error vector */
|
||||||
@@ -331,9 +330,6 @@ void nr_ptrs_cpe_estimation(uint8_t K_ptrs,
|
|||||||
#ifdef DEBUG_PTRS
|
#ifdef DEBUG_PTRS
|
||||||
printf("[PHY][PTRS]: Estimated Symbol %d -> %d + j* %d \n",symbol, error_est[0], error_est[1] );
|
printf("[PHY][PTRS]: Estimated Symbol %d -> %d + j* %d \n",symbol, error_est[0], error_est[1] );
|
||||||
#endif
|
#endif
|
||||||
/* free vectors */
|
|
||||||
free(ptrs_p);
|
|
||||||
free(dmrs_comp_p);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -426,9 +422,10 @@ void get_slope_from_estimates(uint8_t start, uint8_t end, int16_t *est_p, double
|
|||||||
/* estimate from slope */
|
/* estimate from slope */
|
||||||
void ptrs_estimate_from_slope(int16_t *error_est, double *slope_p, uint8_t start, uint8_t end)
|
void ptrs_estimate_from_slope(int16_t *error_est, double *slope_p, uint8_t start, uint8_t end)
|
||||||
{
|
{
|
||||||
|
struct complex16 *error=(struct complex16 *) error_est;
|
||||||
for(uint8_t i = 1; i< (end -start);i++) {
|
for(uint8_t i = 1; i< (end -start);i++) {
|
||||||
error_est[(start+i)*2] = (error_est[start*2] + (int16_t)(i * slope_p[0]));// real
|
error[start+i].r = error[start].r + (int16_t)(i * slope_p[0]);// real
|
||||||
error_est[((start +i)*2)+1] = (error_est[(start*2)+1] + (int16_t)( i * slope_p[1])); //imag
|
error[start+i].i = error[start].i + (int16_t)(i * slope_p[1]); //imag
|
||||||
#ifdef DEBUG_PTRS
|
#ifdef DEBUG_PTRS
|
||||||
printf("[PHY][PTRS]: Estimated Symbol %2d -> %4d %4d from Slope (%4f %4f)\n", start+i,error_est[(start+i)*2],error_est[((start +i)*2)+1],
|
printf("[PHY][PTRS]: Estimated Symbol %2d -> %4d %4d from Slope (%4f %4f)\n", start+i,error_est[(start+i)*2],error_est[((start +i)*2)+1],
|
||||||
slope_p[0],slope_p[1]);
|
slope_p[0],slope_p[1]);
|
||||||
|
|||||||
@@ -294,8 +294,8 @@ int nr_dlsch_encoding(PHY_VARS_gNB *gNB,
|
|||||||
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_gNB_DLSCH_ENCODING, VCD_FUNCTION_IN);
|
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_gNB_DLSCH_ENCODING, VCD_FUNCTION_IN);
|
||||||
uint32_t A = rel15->TBSize[0]<<3;
|
uint32_t A = rel15->TBSize[0]<<3;
|
||||||
|
|
||||||
if ( dlsch->rnti != SI_RNTI )
|
if ( rel15->rnti != SI_RNTI)
|
||||||
trace_NRpdu(DIRECTION_DOWNLINK, a, rel15->TBSize[0], 0, WS_C_RNTI, dlsch->rnti, frame, slot,0, 0);
|
trace_NRpdu(DIRECTION_DOWNLINK, a, rel15->TBSize[0], 0, WS_C_RNTI, rel15->rnti, frame, slot,0, 0);
|
||||||
|
|
||||||
NR_gNB_SCH_STATS_t *stats=NULL;
|
NR_gNB_SCH_STATS_t *stats=NULL;
|
||||||
int first_free=-1;
|
int first_free=-1;
|
||||||
|
|||||||
@@ -1174,7 +1174,7 @@ int nr_rx_pusch(PHY_VARS_gNB *gNB,
|
|||||||
|
|
||||||
uint8_t aarx, aatx;
|
uint8_t aarx, aatx;
|
||||||
uint32_t nb_re_pusch, bwp_start_subcarrier;
|
uint32_t nb_re_pusch, bwp_start_subcarrier;
|
||||||
int avgs;
|
int avgs = 0;
|
||||||
|
|
||||||
NR_DL_FRAME_PARMS *frame_parms = &gNB->frame_parms;
|
NR_DL_FRAME_PARMS *frame_parms = &gNB->frame_parms;
|
||||||
nfapi_nr_pusch_pdu_t *rel15_ul = &gNB->ulsch[ulsch_id][0]->harq_processes[harq_pid]->ulsch_pdu;
|
nfapi_nr_pusch_pdu_t *rel15_ul = &gNB->ulsch[ulsch_id][0]->harq_processes[harq_pid]->ulsch_pdu;
|
||||||
|
|||||||
@@ -302,7 +302,7 @@ void nr_decode_pucch0(PHY_VARS_gNB *gNB,
|
|||||||
int32_t corr_re[1+frame_parms->nb_antennas_rx][2];
|
int32_t corr_re[1+frame_parms->nb_antennas_rx][2];
|
||||||
int32_t corr_im[1+frame_parms->nb_antennas_rx][2];
|
int32_t corr_im[1+frame_parms->nb_antennas_rx][2];
|
||||||
//int32_t no_corr = 0;
|
//int32_t no_corr = 0;
|
||||||
int seq_index;
|
int seq_index = 0;
|
||||||
int64_t temp;
|
int64_t temp;
|
||||||
|
|
||||||
for(i=0;i<nr_sequences;i++){
|
for(i=0;i<nr_sequences;i++){
|
||||||
|
|||||||
@@ -642,7 +642,6 @@ uint32_t nr_dlsch_decoding(PHY_VARS_NR_UE *phy_vars_ue,
|
|||||||
if (LOG_DEBUGFLAG(DEBUG_DLSCH_DECOD))
|
if (LOG_DEBUGFLAG(DEBUG_DLSCH_DECOD))
|
||||||
LOG_I(PHY,"Segmentation: C %d, K %d\n",harq_process->C,harq_process->K);
|
LOG_I(PHY,"Segmentation: C %d, K %d\n",harq_process->C,harq_process->K);
|
||||||
|
|
||||||
opp_enabled=1;
|
|
||||||
Kr = harq_process->K; // [hna] overwrites this line "Kr = p_decParams->Z*kb"
|
Kr = harq_process->K; // [hna] overwrites this line "Kr = p_decParams->Z*kb"
|
||||||
Kr_bytes = Kr>>3;
|
Kr_bytes = Kr>>3;
|
||||||
offset = 0;
|
offset = 0;
|
||||||
|
|||||||
@@ -379,13 +379,10 @@ int nr_rx_pdsch(PHY_VARS_NR_UE *ue,
|
|||||||
len = (pilots==1)? ((config_type==NFAPI_NR_DMRS_TYPE1)?nb_rb*(12-6*dlsch0_harq->n_dmrs_cdm_groups): nb_rb*(12-4*dlsch0_harq->n_dmrs_cdm_groups)):(nb_rb*12);
|
len = (pilots==1)? ((config_type==NFAPI_NR_DMRS_TYPE1)?nb_rb*(12-6*dlsch0_harq->n_dmrs_cdm_groups): nb_rb*(12-4*dlsch0_harq->n_dmrs_cdm_groups)):(nb_rb*12);
|
||||||
|
|
||||||
stop_meas(&ue->generic_stat_bis[proc->thread_id][slot]);
|
stop_meas(&ue->generic_stat_bis[proc->thread_id][slot]);
|
||||||
#if DISABLE_LOG_X
|
if (cpumeas(CPUMEAS_GETSTATE))
|
||||||
printf("[AbsSFN %u.%d] Slot%d Symbol %d type %d: Pilot/Data extraction %5.2f \n",
|
LOG_D(PHY, "[AbsSFN %u.%d] Slot%d Symbol %d type %d: Pilot/Data extraction %5.2f \n",
|
||||||
frame,nr_slot_rx,slot,symbol,type,ue->generic_stat_bis[proc->thread_id][slot].p_time/(cpuf*1000.0));
|
frame,nr_slot_rx,slot,symbol,type,ue->generic_stat_bis[proc->thread_id][slot].p_time/(cpuf*1000.0));
|
||||||
#else
|
|
||||||
LOG_D(PHY, "[AbsSFN %u.%d] Slot%d Symbol %d type %d: Pilot/Data extraction %5.2f \n",
|
|
||||||
frame,nr_slot_rx,slot,symbol,type,ue->generic_stat_bis[proc->thread_id][slot].p_time/(cpuf*1000.0));
|
|
||||||
#endif
|
|
||||||
|
|
||||||
start_meas(&ue->generic_stat_bis[proc->thread_id][slot]);
|
start_meas(&ue->generic_stat_bis[proc->thread_id][slot]);
|
||||||
n_tx = dlsch0_harq->Nl;
|
n_tx = dlsch0_harq->Nl;
|
||||||
@@ -402,11 +399,9 @@ int nr_rx_pdsch(PHY_VARS_NR_UE *ue,
|
|||||||
nb_rb_pdsch);
|
nb_rb_pdsch);
|
||||||
|
|
||||||
stop_meas(&ue->generic_stat_bis[proc->thread_id][slot]);
|
stop_meas(&ue->generic_stat_bis[proc->thread_id][slot]);
|
||||||
#if DISABLE_LOG_X
|
if (cpumeas(CPUMEAS_GETSTATE))
|
||||||
printf("[AbsSFN %u.%d] Slot%d Symbol %d: Channel Scale %5.2f \n",frame,nr_slot_rx,slot,symbol,ue->generic_stat_bis[proc->thread_id][slot].p_time/(cpuf*1000.0));
|
LOG_D(PHY, "[AbsSFN %u.%d] Slot%d Symbol %d: Channel Scale %5.2f \n",frame,nr_slot_rx,slot,symbol,ue->generic_stat_bis[proc->thread_id][slot].p_time/(cpuf*1000.0));
|
||||||
#else
|
|
||||||
LOG_D(PHY, "[AbsSFN %u.%d] Slot%d Symbol %d: Channel Scale %5.2f \n",frame,nr_slot_rx,slot,symbol,ue->generic_stat_bis[proc->thread_id][slot].p_time/(cpuf*1000.0));
|
|
||||||
#endif
|
|
||||||
start_meas(&ue->generic_stat_bis[proc->thread_id][slot]);
|
start_meas(&ue->generic_stat_bis[proc->thread_id][slot]);
|
||||||
if (first_symbol_flag==1) {
|
if (first_symbol_flag==1) {
|
||||||
if (beamforming_mode==0){
|
if (beamforming_mode==0){
|
||||||
@@ -463,11 +458,8 @@ int nr_rx_pdsch(PHY_VARS_NR_UE *ue,
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
stop_meas(&ue->generic_stat_bis[proc->thread_id][slot]);
|
stop_meas(&ue->generic_stat_bis[proc->thread_id][slot]);
|
||||||
#if DISABLE_LOG_X
|
if (cpumeas(CPUMEAS_GETSTATE))
|
||||||
printf("[AbsSFN %u.%d] Slot%d Symbol %d first_symbol_flag %d: Channel Level %5.2f \n",frame,nr_slot_rx,slot,symbol,first_symbol_flag,ue->generic_stat_bis[proc->thread_id][slot].p_time/(cpuf*1000.0));
|
LOG_D(PHY, "[AbsSFN %u.%d] Slot%d Symbol %d first_symbol_flag %d: Channel Level %5.2f \n",frame,nr_slot_rx,slot,symbol,first_symbol_flag,ue->generic_stat_bis[proc->thread_id][slot].p_time/(cpuf*1000.0));
|
||||||
#else
|
|
||||||
LOG_D(PHY, "[AbsSFN %u.%d] Slot%d Symbol %d first_symbol_flag %d: Channel Level %5.2f \n",frame,nr_slot_rx,slot,symbol,first_symbol_flag,ue->generic_stat_bis[proc->thread_id][slot].p_time/(cpuf*1000.0));
|
|
||||||
#endif
|
|
||||||
|
|
||||||
start_meas(&ue->generic_stat_bis[proc->thread_id][slot]);
|
start_meas(&ue->generic_stat_bis[proc->thread_id][slot]);
|
||||||
// Now channel compensation
|
// Now channel compensation
|
||||||
@@ -515,11 +507,9 @@ int nr_rx_pdsch(PHY_VARS_NR_UE *ue,
|
|||||||
}
|
}
|
||||||
|
|
||||||
stop_meas(&ue->generic_stat_bis[proc->thread_id][slot]);
|
stop_meas(&ue->generic_stat_bis[proc->thread_id][slot]);
|
||||||
#if DISABLE_LOG_X
|
if (cpumeas(CPUMEAS_GETSTATE))
|
||||||
printf("[AbsSFN %u.%d] Slot%d Symbol %d log2_maxh %d channel_level %d: Channel Comp %5.2f \n", frame, nr_slot_rx, slot, symbol, pdsch_vars[gNB_id]->log2_maxh, proc->channel_level, ue->generic_stat_bis[proc->thread_id][slot].p_time/(cpuf*1000.0));
|
LOG_D(PHY, "[AbsSFN %u.%d] Slot%d Symbol %d log2_maxh %d channel_level %d: Channel Comp %5.2f \n", frame, nr_slot_rx, slot, symbol, pdsch_vars[gNB_id]->log2_maxh, proc->channel_level, ue->generic_stat_bis[proc->thread_id][slot].p_time/(cpuf*1000.0));
|
||||||
#else
|
|
||||||
LOG_D(PHY, "[AbsSFN %u.%d] Slot%d Symbol %d log2_maxh %d channel_level %d: Channel Comp %5.2f \n", frame, nr_slot_rx, slot, symbol, pdsch_vars[gNB_id]->log2_maxh, proc->channel_level, ue->generic_stat_bis[proc->thread_id][slot].p_time/(cpuf*1000.0));
|
|
||||||
#endif
|
|
||||||
start_meas(&ue->generic_stat_bis[proc->thread_id][slot]);
|
start_meas(&ue->generic_stat_bis[proc->thread_id][slot]);
|
||||||
|
|
||||||
if (frame_parms->nb_antennas_rx > 1) {
|
if (frame_parms->nb_antennas_rx > 1) {
|
||||||
@@ -574,11 +564,9 @@ int nr_rx_pdsch(PHY_VARS_NR_UE *ue,
|
|||||||
}
|
}
|
||||||
|
|
||||||
stop_meas(&ue->generic_stat_bis[proc->thread_id][slot]);
|
stop_meas(&ue->generic_stat_bis[proc->thread_id][slot]);
|
||||||
#if DISABLE_LOG_X
|
if (cpumeas(CPUMEAS_GETSTATE))
|
||||||
printf("[AbsSFN %u.%d] Slot%d Symbol %d: Channel Combine %5.2f \n",frame,nr_slot_rx,slot,symbol,ue->generic_stat_bis[proc->thread_id][slot].p_time/(cpuf*1000.0));
|
LOG_D(PHY, "[AbsSFN %u.%d] Slot%d Symbol %d: Channel Combine %5.2f \n",frame,nr_slot_rx,slot,symbol,ue->generic_stat_bis[proc->thread_id][slot].p_time/(cpuf*1000.0));
|
||||||
#else
|
|
||||||
LOG_D(PHY, "[AbsSFN %u.%d] Slot%d Symbol %d: Channel Combine %5.2f \n",frame,nr_slot_rx,slot,symbol,ue->generic_stat_bis[proc->thread_id][slot].p_time/(cpuf*1000.0));
|
|
||||||
#endif
|
|
||||||
start_meas(&ue->generic_stat_bis[proc->thread_id][slot]);
|
start_meas(&ue->generic_stat_bis[proc->thread_id][slot]);
|
||||||
/* Store the valid DL RE's */
|
/* Store the valid DL RE's */
|
||||||
pdsch_vars[gNB_id]->dl_valid_re[symbol-1] = len;
|
pdsch_vars[gNB_id]->dl_valid_re[symbol-1] = len;
|
||||||
@@ -657,11 +645,8 @@ int nr_rx_pdsch(PHY_VARS_NR_UE *ue,
|
|||||||
}
|
}
|
||||||
|
|
||||||
stop_meas(&ue->generic_stat_bis[proc->thread_id][slot]);
|
stop_meas(&ue->generic_stat_bis[proc->thread_id][slot]);
|
||||||
#if DISABLE_LOG_X
|
if (cpumeas(CPUMEAS_GETSTATE))
|
||||||
printf("[AbsSFN %u.%d] Slot%d Symbol %d: LLR Computation %5.2f \n",frame,nr_slot_rx,slot,symbol,ue->generic_stat_bis[proc->thread_id][slot].p_time/(cpuf*1000.0));
|
LOG_D(PHY, "[AbsSFN %u.%d] Slot%d Symbol %d: LLR Computation %5.2f \n",frame,nr_slot_rx,slot,symbol,ue->generic_stat_bis[proc->thread_id][slot].p_time/(cpuf*1000.0));
|
||||||
#else
|
|
||||||
LOG_D(PHY, "[AbsSFN %u.%d] Slot%d Symbol %d: LLR Computation %5.2f \n",frame,nr_slot_rx,slot,symbol,ue->generic_stat_bis[proc->thread_id][slot].p_time/(cpuf*1000.0));
|
|
||||||
#endif
|
|
||||||
|
|
||||||
// Please keep it: useful for debugging
|
// Please keep it: useful for debugging
|
||||||
#ifdef DEBUG_PDSCH_RX
|
#ifdef DEBUG_PDSCH_RX
|
||||||
|
|||||||
@@ -353,21 +353,15 @@ int nr_initial_sync(UE_nr_rxtx_proc_t *proc,
|
|||||||
if( (abs(ue->common_vars.freq_offset) > 150) && (ret == 0) )
|
if( (abs(ue->common_vars.freq_offset) > 150) && (ret == 0) )
|
||||||
{
|
{
|
||||||
ret=-1;
|
ret=-1;
|
||||||
#if DISABLE_LOG_X
|
|
||||||
printf("Ignore MIB with high freq offset [%d Hz] estimation \n",ue->common_vars.freq_offset);
|
|
||||||
#else
|
|
||||||
LOG_E(HW, "Ignore MIB with high freq offset [%d Hz] estimation \n",ue->common_vars.freq_offset);
|
LOG_E(HW, "Ignore MIB with high freq offset [%d Hz] estimation \n",ue->common_vars.freq_offset);
|
||||||
#endif
|
|
||||||
}*/
|
}*/
|
||||||
|
|
||||||
if (ret==0) { // PBCH found so indicate sync to higher layers and configure frame parameters
|
if (ret==0) { // PBCH found so indicate sync to higher layers and configure frame parameters
|
||||||
|
|
||||||
//#ifdef DEBUG_INITIAL_SYNCH
|
//#ifdef DEBUG_INITIAL_SYNCH
|
||||||
#if DISABLE_LOG_X
|
|
||||||
printf("[UE%d] In synch, rx_offset %d samples\n",ue->Mod_id, ue->rx_offset);
|
|
||||||
#else
|
|
||||||
LOG_I(PHY, "[UE%d] In synch, rx_offset %d samples\n",ue->Mod_id, ue->rx_offset);
|
LOG_I(PHY, "[UE%d] In synch, rx_offset %d samples\n",ue->Mod_id, ue->rx_offset);
|
||||||
#endif
|
|
||||||
//#endif
|
//#endif
|
||||||
|
|
||||||
if (ue->UE_scan_carrier == 0) {
|
if (ue->UE_scan_carrier == 0) {
|
||||||
|
|||||||
@@ -42,7 +42,7 @@ int main(int argc, char **argv) {
|
|||||||
get_common_options(SOFTMODEM_GNB_BIT );
|
get_common_options(SOFTMODEM_GNB_BIT );
|
||||||
config_process_cmdline( cmdline_params,sizeof(cmdline_params)/sizeof(paramdef_t),NULL);
|
config_process_cmdline( cmdline_params,sizeof(cmdline_params)/sizeof(paramdef_t),NULL);
|
||||||
CONFIG_CLEARRTFLAG(CONFIG_NOEXITONHELP);
|
CONFIG_CLEARRTFLAG(CONFIG_NOEXITONHELP);
|
||||||
configure_linux();
|
set_latency_target();
|
||||||
|
|
||||||
|
|
||||||
int N_RB=50;
|
int N_RB=50;
|
||||||
|
|||||||
@@ -49,9 +49,15 @@ void reset_stats(FL_OBJECT *button, long arg) {
|
|||||||
int i,j,k;
|
int i,j,k;
|
||||||
PHY_VARS_eNB *phy_vars_eNB = RC.eNB[0][0];
|
PHY_VARS_eNB *phy_vars_eNB = RC.eNB[0][0];
|
||||||
|
|
||||||
for (i=0; i<NUMBER_OF_UE_MAX; i++) {
|
printf("XXX %d %d %d\n",
|
||||||
for (k=0; k<8; k++) { //harq_processes
|
sizeofArray(phy_vars_eNB->UE_stats),
|
||||||
for (j=0; j<phy_vars_eNB->dlsch[i][0]->Mlimit; j++) {
|
sizeofArray( phy_vars_eNB->UE_stats[i].dlsch_NAK),
|
||||||
|
sizeofArray( *phy_vars_eNB->UE_stats[i].dlsch_NAK)
|
||||||
|
);
|
||||||
|
|
||||||
|
for (i=0; i<sizeofArray(phy_vars_eNB->UE_stats); i++) {
|
||||||
|
for (k=0; k<sizeofArray(phy_vars_eNB->UE_stats[i].dlsch_NAK); k++) { //harq_processes
|
||||||
|
for (j=0; j<sizeofArray(*phy_vars_eNB->UE_stats[i].dlsch_NAK); j++) {
|
||||||
phy_vars_eNB->UE_stats[i].dlsch_NAK[k][j]=0;
|
phy_vars_eNB->UE_stats[i].dlsch_NAK[k][j]=0;
|
||||||
phy_vars_eNB->UE_stats[i].dlsch_ACK[k][j]=0;
|
phy_vars_eNB->UE_stats[i].dlsch_ACK[k][j]=0;
|
||||||
phy_vars_eNB->UE_stats[i].dlsch_trials[k][j]=0;
|
phy_vars_eNB->UE_stats[i].dlsch_trials[k][j]=0;
|
||||||
@@ -67,7 +73,6 @@ void reset_stats(FL_OBJECT *button, long arg) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static void *scope_thread_eNB(void *arg) {
|
static void *scope_thread_eNB(void *arg) {
|
||||||
struct sched_param sched_param;
|
struct sched_param sched_param;
|
||||||
int UE_id, CC_id;
|
int UE_id, CC_id;
|
||||||
@@ -75,7 +80,6 @@ static void *scope_thread_eNB(void *arg) {
|
|||||||
sched_param.sched_priority = sched_get_priority_min(SCHED_FIFO)+1;
|
sched_param.sched_priority = sched_get_priority_min(SCHED_FIFO)+1;
|
||||||
sched_setscheduler(0, SCHED_FIFO,&sched_param);
|
sched_setscheduler(0, SCHED_FIFO,&sched_param);
|
||||||
printf("Scope thread has priority %d\n",sched_param.sched_priority);
|
printf("Scope thread has priority %d\n",sched_param.sched_priority);
|
||||||
|
|
||||||
while (!oai_exit) {
|
while (!oai_exit) {
|
||||||
ue_cnt=0;
|
ue_cnt=0;
|
||||||
|
|
||||||
|
|||||||
@@ -33,7 +33,6 @@
|
|||||||
#define ScaleZone 4
|
#define ScaleZone 4
|
||||||
#define localBuff(NaMe,SiZe) float NaMe[SiZe]; memset(NaMe,0,sizeof(NaMe));
|
#define localBuff(NaMe,SiZe) float NaMe[SiZe]; memset(NaMe,0,sizeof(NaMe));
|
||||||
|
|
||||||
int otg_enabled;
|
|
||||||
|
|
||||||
const FL_COLOR rx_antenna_colors[4] = {FL_RED,FL_BLUE,FL_GREEN,FL_YELLOW};
|
const FL_COLOR rx_antenna_colors[4] = {FL_RED,FL_BLUE,FL_GREEN,FL_YELLOW};
|
||||||
const FL_COLOR water_colors[4] = {FL_BLUE,FL_GREEN,FL_YELLOW,FL_RED};
|
const FL_COLOR water_colors[4] = {FL_BLUE,FL_GREEN,FL_YELLOW,FL_RED};
|
||||||
|
|||||||
@@ -51,24 +51,7 @@ double get_cpu_freq_GHz(void)
|
|||||||
return cpu_freq_GHz;
|
return cpu_freq_GHz;
|
||||||
}
|
}
|
||||||
|
|
||||||
int cpumeas(int action)
|
|
||||||
{
|
|
||||||
switch (action) {
|
|
||||||
case CPUMEAS_ENABLE:
|
|
||||||
opp_enabled = 1;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case CPUMEAS_DISABLE:
|
|
||||||
opp_enabled = 0;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case CPUMEAS_GETSTATE:
|
|
||||||
default:
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
return opp_enabled;
|
|
||||||
}
|
|
||||||
|
|
||||||
void print_meas_now(time_stats_t *ts,
|
void print_meas_now(time_stats_t *ts,
|
||||||
const char *name,
|
const char *name,
|
||||||
|
|||||||
@@ -115,7 +115,24 @@ static inline uint32_t rdtsc_oai(void) {
|
|||||||
#define CPUMEAS_DISABLE 0
|
#define CPUMEAS_DISABLE 0
|
||||||
#define CPUMEAS_ENABLE 1
|
#define CPUMEAS_ENABLE 1
|
||||||
#define CPUMEAS_GETSTATE 2
|
#define CPUMEAS_GETSTATE 2
|
||||||
int cpumeas(int action);
|
static inline int cpumeas(int action) {
|
||||||
|
switch (action) {
|
||||||
|
case CPUMEAS_ENABLE:
|
||||||
|
opp_enabled = 1;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case CPUMEAS_DISABLE:
|
||||||
|
opp_enabled = 0;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case CPUMEAS_GETSTATE:
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
return opp_enabled;
|
||||||
|
}
|
||||||
|
|
||||||
static inline void start_meas(time_stats_t *ts) {
|
static inline void start_meas(time_stats_t *ts) {
|
||||||
if (opp_enabled) {
|
if (opp_enabled) {
|
||||||
if (ts->meas_flag==0) {
|
if (ts->meas_flag==0) {
|
||||||
|
|||||||
@@ -594,6 +594,8 @@ typedef struct gNB_L1_proc_t_s {
|
|||||||
pthread_t L1_stats_thread;
|
pthread_t L1_stats_thread;
|
||||||
/// pthread structure for printing time meas
|
/// pthread structure for printing time meas
|
||||||
pthread_t process_stats_thread;
|
pthread_t process_stats_thread;
|
||||||
|
/// pthread structure for reordering L1 tx thread messages
|
||||||
|
pthread_t pthread_tx_reorder;
|
||||||
/// flag to indicate first RX acquisition
|
/// flag to indicate first RX acquisition
|
||||||
int first_rx;
|
int first_rx;
|
||||||
/// flag to indicate first TX transmission
|
/// flag to indicate first TX transmission
|
||||||
@@ -844,8 +846,7 @@ typedef struct PHY_VARS_gNB_s {
|
|||||||
/*
|
/*
|
||||||
time_stats_t phy_proc;
|
time_stats_t phy_proc;
|
||||||
*/
|
*/
|
||||||
time_stats_t *phy_proc_tx_0;
|
time_stats_t *phy_proc_tx[2];
|
||||||
time_stats_t *phy_proc_tx_1;
|
|
||||||
time_stats_t phy_proc_rx;
|
time_stats_t phy_proc_rx;
|
||||||
time_stats_t rx_prach;
|
time_stats_t rx_prach;
|
||||||
/*
|
/*
|
||||||
@@ -886,7 +887,9 @@ typedef struct PHY_VARS_gNB_s {
|
|||||||
*/
|
*/
|
||||||
notifiedFIFO_t *respDecode;
|
notifiedFIFO_t *respDecode;
|
||||||
notifiedFIFO_t *resp_L1;
|
notifiedFIFO_t *resp_L1;
|
||||||
notifiedFIFO_t *resp_L1_tx;
|
notifiedFIFO_t *L1_tx_free;
|
||||||
|
notifiedFIFO_t *L1_tx_filled;
|
||||||
|
notifiedFIFO_t *L1_tx_out;
|
||||||
notifiedFIFO_t *resp_RU_tx;
|
notifiedFIFO_t *resp_RU_tx;
|
||||||
tpool_t *threadPool;
|
tpool_t *threadPool;
|
||||||
int nbDecode;
|
int nbDecode;
|
||||||
|
|||||||
@@ -107,11 +107,10 @@
|
|||||||
* @}
|
* @}
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#include <common/utils/utils.h>
|
||||||
#include "defs_eNB.h"
|
#include "defs_eNB.h"
|
||||||
#include "types.h"
|
#include "types.h"
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/** @addtogroup _PHY_STRUCTURES_
|
/** @addtogroup _PHY_STRUCTURES_
|
||||||
* @{
|
* @{
|
||||||
*/
|
*/
|
||||||
@@ -315,50 +314,6 @@ typedef struct {
|
|||||||
#include "openairinterface5g_limits.h"
|
#include "openairinterface5g_limits.h"
|
||||||
#include "assertions.h"
|
#include "assertions.h"
|
||||||
|
|
||||||
#define cmax(a,b) ((a>b) ? (a) : (b))
|
|
||||||
#define cmax3(a,b,c) ((cmax(a,b)>c) ? (cmax(a,b)) : (c))
|
|
||||||
#define cmin(a,b) ((a<b) ? (a) : (b))
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
#ifdef min
|
|
||||||
#undef min
|
|
||||||
#undef max
|
|
||||||
#endif
|
|
||||||
#else
|
|
||||||
#define max(a,b) cmax(a,b)
|
|
||||||
#define min(a,b) cmin(a,b)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef malloc16
|
|
||||||
# ifdef __AVX2__
|
|
||||||
# define malloc16(x) memalign(32,x+32)
|
|
||||||
# else
|
|
||||||
# define malloc16(x) memalign(16,x+16)
|
|
||||||
# endif
|
|
||||||
#endif
|
|
||||||
#define free16(y,x) free(y)
|
|
||||||
#define bigmalloc malloc
|
|
||||||
#define bigmalloc16 malloc16
|
|
||||||
#define openair_free(y,x) free((y))
|
|
||||||
#define PAGE_SIZE 4096
|
|
||||||
#define free_and_zero(PtR) do { \
|
|
||||||
if (PtR) { \
|
|
||||||
free(PtR); \
|
|
||||||
PtR = NULL; \
|
|
||||||
} \
|
|
||||||
} while (0)
|
|
||||||
static inline void* malloc16_clear( size_t size )
|
|
||||||
{
|
|
||||||
#ifdef __AVX2__
|
|
||||||
void* ptr = memalign(32, size+32);
|
|
||||||
#else
|
|
||||||
void* ptr = memalign(16, size+16);
|
|
||||||
#endif
|
|
||||||
DevAssert(ptr);
|
|
||||||
memset( ptr, 0, size );
|
|
||||||
return ptr;
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif //__PHY_IMPLEMENTATION_DEFS_H__
|
#endif //__PHY_IMPLEMENTATION_DEFS_H__
|
||||||
/**@}
|
/**@}
|
||||||
*/
|
*/
|
||||||
|
|||||||
@@ -82,8 +82,7 @@ const double sinr_to_cqi[4][16]= { {-2.5051, -2.5051, -1.7451, -0.3655, 1.0812,
|
|||||||
{ -4.1057, -4.1057, -3.3768, -2.2916, -1.1392, 0.1236, 1.2849, 3.1933, 5.9298, 6.4052, 9.6245, 10.9414, 13.5166, 14.9545, 14.9545, 14.9545}
|
{ -4.1057, -4.1057, -3.3768, -2.2916, -1.1392, 0.1236, 1.2849, 3.1933, 5.9298, 6.4052, 9.6245, 10.9414, 13.5166, 14.9545, 14.9545, 14.9545}
|
||||||
};
|
};
|
||||||
|
|
||||||
//int cqi_to_mcs[16]={0, 0, 1, 3, 5, 7, 9, 13, 15, 16, 20, 23, 25, 27, 27, 27};
|
const int cqi_to_mcs[16]= {0, 0, 1, 2, 4, 6, 8, 11, 13, 16, 18, 20, 23, 25, 27, 28};
|
||||||
const int cqi_to_mcs[16]= {0, 0, 1, 2, 4, 6, 8, 11, 13, 16, 18, 20, 23, 25, 27, 27};
|
|
||||||
|
|
||||||
//for SNR to MI conversion 7 th order Polynomial coeff
|
//for SNR to MI conversion 7 th order Polynomial coeff
|
||||||
const double q_qam16[8]= {3.21151853033897e-10,5.55435952230651e-09,-2.30760065362117e-07,-6.25587743817859e-06,4.62251036452795e-06,0.00224150813158937,0.0393723140344367,0.245486379182639};
|
const double q_qam16[8]= {3.21151853033897e-10,5.55435952230651e-09,-2.30760065362117e-07,-6.25587743817859e-06,4.62251036452795e-06,0.00224150813158937,0.0393723140344367,0.245486379182639};
|
||||||
|
|||||||
@@ -83,9 +83,6 @@ const double sinr_to_cqi[4][16]= { {-2.5051, -2.5051, -1.7451, -0.3655, 1.0812,
|
|||||||
{ -4.1057, -4.1057, -3.3768, -2.2916, -1.1392, 0.1236, 1.2849, 3.1933, 5.9298, 6.4052, 9.6245, 10.9414, 13.5166, 14.9545, 14.9545, 14.9545}
|
{ -4.1057, -4.1057, -3.3768, -2.2916, -1.1392, 0.1236, 1.2849, 3.1933, 5.9298, 6.4052, 9.6245, 10.9414, 13.5166, 14.9545, 14.9545, 14.9545}
|
||||||
};
|
};
|
||||||
|
|
||||||
//int cqi_to_mcs[16]={0, 0, 1, 3, 5, 7, 9, 13, 15, 16, 20, 23, 25, 27, 27, 27};
|
|
||||||
const int cqi_to_mcs[16]= {0, 0, 1, 2, 4, 6, 8, 11, 13, 16, 18, 20, 23, 25, 27, 27};
|
|
||||||
|
|
||||||
//for SNR to MI conversion 7 th order Polynomial coeff
|
//for SNR to MI conversion 7 th order Polynomial coeff
|
||||||
const double q_qam16[8]= {3.21151853033897e-10,5.55435952230651e-09,-2.30760065362117e-07,-6.25587743817859e-06,4.62251036452795e-06,0.00224150813158937,0.0393723140344367,0.245486379182639};
|
const double q_qam16[8]= {3.21151853033897e-10,5.55435952230651e-09,-2.30760065362117e-07,-6.25587743817859e-06,4.62251036452795e-06,0.00224150813158937,0.0393723140344367,0.245486379182639};
|
||||||
const double q_qpsk[8]= {1.94491167814437e-09,8.40494123817774e-08,4.75527131198034e-07,-2.48946285301621e-05,-0.000347614016158364,0.00209252225437100,0.0742986115462510,0.488297879889425};
|
const double q_qpsk[8]= {1.94491167814437e-09,8.40494123817774e-08,4.75527131198034e-07,-2.48946285301621e-05,-0.000347614016158364,0.00209252225437100,0.0742986115462510,0.488297879889425};
|
||||||
|
|||||||
@@ -72,8 +72,7 @@ const double sinr_to_cqi[4][16]= { {-2.5051, -2.5051, -1.7451, -0.3655, 1.0812,
|
|||||||
{ -4.1057, -4.1057, -3.3768, -2.2916, -1.1392, 0.1236, 1.2849, 3.1933, 5.9298, 6.4052, 9.6245, 10.9414, 13.5166, 14.9545, 14.9545, 14.9545}
|
{ -4.1057, -4.1057, -3.3768, -2.2916, -1.1392, 0.1236, 1.2849, 3.1933, 5.9298, 6.4052, 9.6245, 10.9414, 13.5166, 14.9545, 14.9545, 14.9545}
|
||||||
};
|
};
|
||||||
|
|
||||||
//int cqi_to_mcs[16]={0, 0, 1, 3, 5, 7, 9, 13, 15, 16, 20, 23, 25, 27, 27, 27};
|
const int cqi_to_mcs[16]= {0, 0, 1, 2, 4, 6, 8, 11, 13, 16, 18, 20, 23, 25, 27, 28};
|
||||||
const int cqi_to_mcs[16]= {0, 0, 1, 2, 4, 6, 8, 11, 13, 16, 18, 20, 23, 25, 27, 27};
|
|
||||||
|
|
||||||
//for SNR to MI conversion 7 th order Polynomial coeff
|
//for SNR to MI conversion 7 th order Polynomial coeff
|
||||||
const double q_qam16[8]= {3.21151853033897e-10,5.55435952230651e-09,-2.30760065362117e-07,-6.25587743817859e-06,4.62251036452795e-06,0.00224150813158937,0.0393723140344367,0.245486379182639};
|
const double q_qam16[8]= {3.21151853033897e-10,5.55435952230651e-09,-2.30760065362117e-07,-6.25587743817859e-06,4.62251036452795e-06,0.00224150813158937,0.0393723140344367,0.245486379182639};
|
||||||
|
|||||||
@@ -148,6 +148,9 @@ void nr_schedule_response(NR_Sched_Rsp_t *Sched_INFO){
|
|||||||
AssertFatal(RC.gNB[Mod_id]!=NULL,"RC.gNB[%d] is null\n",Mod_id);
|
AssertFatal(RC.gNB[Mod_id]!=NULL,"RC.gNB[%d] is null\n",Mod_id);
|
||||||
|
|
||||||
gNB = RC.gNB[Mod_id];
|
gNB = RC.gNB[Mod_id];
|
||||||
|
nfapi_nr_config_request_scf_t *cfg = &gNB->gNB_config;
|
||||||
|
|
||||||
|
int slot_type = nr_slot_select(cfg,frame,slot);
|
||||||
|
|
||||||
uint8_t number_dl_pdu = (DL_req==NULL) ? 0 : DL_req->dl_tti_request_body.nPDUs;
|
uint8_t number_dl_pdu = (DL_req==NULL) ? 0 : DL_req->dl_tti_request_body.nPDUs;
|
||||||
uint8_t number_ul_dci_pdu = (UL_dci_req==NULL) ? 0 : UL_dci_req->numPdus;
|
uint8_t number_ul_dci_pdu = (UL_dci_req==NULL) ? 0 : UL_dci_req->numPdus;
|
||||||
@@ -155,63 +158,60 @@ void nr_schedule_response(NR_Sched_Rsp_t *Sched_INFO){
|
|||||||
uint8_t number_tx_data_pdu = (TX_req == NULL) ? 0 : TX_req->Number_of_PDUs;
|
uint8_t number_tx_data_pdu = (TX_req == NULL) ? 0 : TX_req->Number_of_PDUs;
|
||||||
|
|
||||||
if (NFAPI_MODE == NFAPI_MONOLITHIC){
|
if (NFAPI_MODE == NFAPI_MONOLITHIC){
|
||||||
notifiedFIFO_elt_t *res;
|
|
||||||
res = pullTpool(gNB->resp_L1_tx, gNB->threadPool);
|
|
||||||
processingData_L1tx_t *msgTx = (processingData_L1tx_t *)NotifiedFifoData(res);
|
|
||||||
if (DL_req != NULL && TX_req!=NULL && (number_dl_pdu > 0 || number_ul_dci_pdu > 0 || number_ul_tti_pdu > 0))
|
|
||||||
LOG_D(PHY,"NFAPI: Sched_INFO:SFN/SLOT:%04d/%d DL_req:SFN/SLO:%04d/%d:dl_pdu:%d tx_req:SFN/SLOT:%04d/%d:pdus:%d;ul_dci %d ul_tti %d\n",
|
|
||||||
frame,slot,
|
|
||||||
DL_req->SFN,DL_req->Slot,number_dl_pdu,
|
|
||||||
TX_req->SFN,TX_req->Slot,TX_req->Number_of_PDUs,
|
|
||||||
number_ul_dci_pdu,number_ul_tti_pdu);
|
|
||||||
|
|
||||||
int pdcch_received=0;
|
if (slot_type == NR_DOWNLINK_SLOT || slot_type == NR_MIXED_SLOT) {
|
||||||
msgTx->num_pdsch_slot=0;
|
notifiedFIFO_elt_t *res;
|
||||||
msgTx->pdcch_pdu.pdcch_pdu_rel15.numDlDci = 0;
|
res = pullTpool(gNB->L1_tx_free, gNB->threadPool);
|
||||||
msgTx->ul_pdcch_pdu.pdcch_pdu.pdcch_pdu_rel15.numDlDci = 0;
|
processingData_L1tx_t *msgTx = (processingData_L1tx_t *)NotifiedFifoData(res);
|
||||||
msgTx->slot = slot;
|
|
||||||
msgTx->frame = frame;
|
|
||||||
|
|
||||||
for (int i=0;i<number_dl_pdu;i++) {
|
int pdcch_received=0;
|
||||||
nfapi_nr_dl_tti_request_pdu_t *dl_tti_pdu = &DL_req->dl_tti_request_body.dl_tti_pdu_list[i];
|
msgTx->num_pdsch_slot=0;
|
||||||
LOG_D(PHY,"NFAPI: dl_pdu %d : type %d\n",i,dl_tti_pdu->PDUType);
|
msgTx->pdcch_pdu.pdcch_pdu_rel15.numDlDci = 0;
|
||||||
switch (dl_tti_pdu->PDUType) {
|
msgTx->ul_pdcch_pdu.pdcch_pdu.pdcch_pdu_rel15.numDlDci = 0;
|
||||||
case NFAPI_NR_DL_TTI_SSB_PDU_TYPE:
|
msgTx->slot = slot;
|
||||||
handle_nr_nfapi_ssb_pdu(msgTx,frame,slot,
|
msgTx->frame = frame;
|
||||||
dl_tti_pdu);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case NFAPI_NR_DL_TTI_PDCCH_PDU_TYPE:
|
for (int i=0;i<number_dl_pdu;i++) {
|
||||||
AssertFatal(pdcch_received == 0, "pdcch_received is not 0, we can only handle one PDCCH PDU per slot\n");
|
nfapi_nr_dl_tti_request_pdu_t *dl_tti_pdu = &DL_req->dl_tti_request_body.dl_tti_pdu_list[i];
|
||||||
msgTx->pdcch_pdu = dl_tti_pdu->pdcch_pdu;
|
LOG_D(PHY,"NFAPI: dl_pdu %d : type %d\n",i,dl_tti_pdu->PDUType);
|
||||||
|
switch (dl_tti_pdu->PDUType) {
|
||||||
|
case NFAPI_NR_DL_TTI_SSB_PDU_TYPE:
|
||||||
|
handle_nr_nfapi_ssb_pdu(msgTx,frame,slot,
|
||||||
|
dl_tti_pdu);
|
||||||
|
break;
|
||||||
|
|
||||||
pdcch_received = 1;
|
case NFAPI_NR_DL_TTI_PDCCH_PDU_TYPE:
|
||||||
break;
|
AssertFatal(pdcch_received == 0, "pdcch_received is not 0, we can only handle one PDCCH PDU per slot\n");
|
||||||
|
msgTx->pdcch_pdu = dl_tti_pdu->pdcch_pdu;
|
||||||
|
|
||||||
case NFAPI_NR_DL_TTI_CSI_RS_PDU_TYPE:
|
pdcch_received = 1;
|
||||||
LOG_D(PHY,"frame %d, slot %d, Got NFAPI_NR_DL_TTI_CSI_RS_PDU_TYPE for %d.%d\n",frame,slot,DL_req->SFN,DL_req->Slot);
|
break;
|
||||||
handle_nfapi_nr_csirs_pdu(msgTx,frame,slot,
|
|
||||||
&dl_tti_pdu->csi_rs_pdu);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case NFAPI_NR_DL_TTI_PDSCH_PDU_TYPE:
|
case NFAPI_NR_DL_TTI_CSI_RS_PDU_TYPE:
|
||||||
LOG_D(PHY,"frame %d, slot %d, Got NFAPI_NR_DL_TTI_PDSCH_PDU_TYPE for %d.%d\n",frame,slot,DL_req->SFN,DL_req->Slot);
|
LOG_D(PHY,"frame %d, slot %d, Got NFAPI_NR_DL_TTI_CSI_RS_PDU_TYPE for %d.%d\n",frame,slot,DL_req->SFN,DL_req->Slot);
|
||||||
nfapi_nr_dl_tti_pdsch_pdu_rel15_t *pdsch_pdu_rel15 = &dl_tti_pdu->pdsch_pdu.pdsch_pdu_rel15;
|
handle_nfapi_nr_csirs_pdu(msgTx,frame,slot,
|
||||||
uint16_t pduIndex = pdsch_pdu_rel15->pduIndex;
|
&dl_tti_pdu->csi_rs_pdu);
|
||||||
AssertFatal(TX_req->pdu_list[pduIndex].num_TLV == 1, "TX_req->pdu_list[%d].num_TLV %d != 1\n",
|
break;
|
||||||
pduIndex,TX_req->pdu_list[pduIndex].num_TLV);
|
|
||||||
uint8_t *sdu = (uint8_t *)TX_req->pdu_list[pduIndex].TLVs[0].value.direct;
|
case NFAPI_NR_DL_TTI_PDSCH_PDU_TYPE:
|
||||||
AssertFatal(msgTx->num_pdsch_slot < gNB->number_of_nr_dlsch_max,"Number of PDSCH PDUs %d exceeded the limit %d\n",
|
LOG_D(PHY,"frame %d, slot %d, Got NFAPI_NR_DL_TTI_PDSCH_PDU_TYPE for %d.%d\n",frame,slot,DL_req->SFN,DL_req->Slot);
|
||||||
msgTx->num_pdsch_slot,gNB->number_of_nr_dlsch_max);
|
nfapi_nr_dl_tti_pdsch_pdu_rel15_t *pdsch_pdu_rel15 = &dl_tti_pdu->pdsch_pdu.pdsch_pdu_rel15;
|
||||||
handle_nr_nfapi_pdsch_pdu(msgTx,&dl_tti_pdu->pdsch_pdu, sdu);
|
uint16_t pduIndex = pdsch_pdu_rel15->pduIndex;
|
||||||
|
AssertFatal(TX_req->pdu_list[pduIndex].num_TLV == 1, "TX_req->pdu_list[%d].num_TLV %d != 1\n",
|
||||||
|
pduIndex,TX_req->pdu_list[pduIndex].num_TLV);
|
||||||
|
uint8_t *sdu = (uint8_t *)TX_req->pdu_list[pduIndex].TLVs[0].value.direct;
|
||||||
|
AssertFatal(msgTx->num_pdsch_slot < gNB->number_of_nr_dlsch_max,"Number of PDSCH PDUs %d exceeded the limit %d\n",
|
||||||
|
msgTx->num_pdsch_slot,gNB->number_of_nr_dlsch_max);
|
||||||
|
handle_nr_nfapi_pdsch_pdu(msgTx,&dl_tti_pdu->pdsch_pdu, sdu);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (number_ul_dci_pdu > 0)
|
||||||
|
msgTx->ul_pdcch_pdu = UL_dci_req->ul_dci_pdu_list[number_ul_dci_pdu-1]; // copy the last pdu
|
||||||
|
|
||||||
|
pushNotifiedFIFO(gNB->L1_tx_filled,res);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (number_ul_dci_pdu > 0)
|
|
||||||
msgTx->ul_pdcch_pdu = UL_dci_req->ul_dci_pdu_list[number_ul_dci_pdu-1]; // copy the last pdu
|
|
||||||
|
|
||||||
pushNotifiedFIFO(gNB->resp_L1_tx,res);
|
|
||||||
|
|
||||||
for (int i = 0; i < number_ul_tti_pdu; i++) {
|
for (int i = 0; i < number_ul_tti_pdu; i++) {
|
||||||
switch (UL_tti_req->pdus_list[i].pdu_type) {
|
switch (UL_tti_req->pdus_list[i].pdu_type) {
|
||||||
case NFAPI_NR_UL_CONFIG_PUSCH_PDU_TYPE:
|
case NFAPI_NR_UL_CONFIG_PUSCH_PDU_TYPE:
|
||||||
|
|||||||
@@ -128,6 +128,7 @@ void phy_procedures_gNB_TX(processingData_L1tx_t *msgTx,
|
|||||||
int frame,
|
int frame,
|
||||||
int slot,
|
int slot,
|
||||||
int do_meas) {
|
int do_meas) {
|
||||||
|
|
||||||
int aa;
|
int aa;
|
||||||
PHY_VARS_gNB *gNB = msgTx->gNB;
|
PHY_VARS_gNB *gNB = msgTx->gNB;
|
||||||
NR_DL_FRAME_PARMS *fp=&gNB->frame_parms;
|
NR_DL_FRAME_PARMS *fp=&gNB->frame_parms;
|
||||||
@@ -204,6 +205,8 @@ void phy_procedures_gNB_TX(processingData_L1tx_t *msgTx,
|
|||||||
}
|
}
|
||||||
|
|
||||||
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_gNB_TX+offset,0);
|
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_gNB_TX+offset,0);
|
||||||
|
//pthread_mutex_unlock(&mutextest);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -419,6 +419,7 @@ int8_t nr_ue_scheduled_response(nr_scheduled_response_t *scheduled_response){
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
//Clear the fields when all the config pdu are done
|
//Clear the fields when all the config pdu are done
|
||||||
if (pdu_done == ul_config->number_pdus) {
|
if (pdu_done == ul_config->number_pdus) {
|
||||||
if (scheduled_response->tx_request)
|
if (scheduled_response->tx_request)
|
||||||
@@ -429,6 +430,7 @@ int8_t nr_ue_scheduled_response(nr_scheduled_response_t *scheduled_response){
|
|||||||
LOG_D(PHY, "%d.%d clear ul_config %p\n", scheduled_response->frame, slot, ul_config);
|
LOG_D(PHY, "%d.%d clear ul_config %p\n", scheduled_response->frame, slot, ul_config);
|
||||||
memset(ul_config->ul_config_list, 0, sizeof(ul_config->ul_config_list));
|
memset(ul_config->ul_config_list, 0, sizeof(ul_config->ul_config_list));
|
||||||
}
|
}
|
||||||
|
|
||||||
pthread_mutex_unlock(&ul_config->mutex_ul_config);
|
pthread_mutex_unlock(&ul_config->mutex_ul_config);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user