merge develop
This commit is contained in:
Vendored
+1
-1
@@ -25,4 +25,4 @@
|
|||||||
]
|
]
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,261 @@
|
|||||||
|
#!/bin/groovy
|
||||||
|
/*
|
||||||
|
* Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
|
||||||
|
* contributor license agreements. See the NOTICE file distributed with
|
||||||
|
* this work for additional information regarding copyright ownership.
|
||||||
|
* The OpenAirInterface Software Alliance licenses this file to You under
|
||||||
|
* the OAI Public License, Version 1.1 (the "License"); you may not use this file
|
||||||
|
* except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.openairinterface.org/?page_id=698
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*-------------------------------------------------------------------------------
|
||||||
|
* For more information about the OpenAirInterface (OAI) Software Alliance:
|
||||||
|
* contact@openairinterface.org
|
||||||
|
*/
|
||||||
|
|
||||||
|
// Location of the executor node
|
||||||
|
def nodeExecutor = params.nodeExecutor
|
||||||
|
|
||||||
|
// Tags to shorten pipeline duration
|
||||||
|
def doMandatoryTests = false
|
||||||
|
def doFullTestsuite = false
|
||||||
|
|
||||||
|
pipeline {
|
||||||
|
agent {
|
||||||
|
label nodeExecutor
|
||||||
|
}
|
||||||
|
options {
|
||||||
|
disableConcurrentBuilds()
|
||||||
|
timestamps()
|
||||||
|
gitLabConnection('OAI GitLab')
|
||||||
|
ansiColor('xterm')
|
||||||
|
}
|
||||||
|
|
||||||
|
stages {
|
||||||
|
stage ("Verify Parameters") {
|
||||||
|
steps {
|
||||||
|
script {
|
||||||
|
JOB_TIMESTAMP = sh returnStdout: true, script: 'date --utc --rfc-3339=seconds | sed -e "s#+00:00##"'
|
||||||
|
JOB_TIMESTAMP = JOB_TIMESTAMP.trim()
|
||||||
|
|
||||||
|
echo '\u2705 \u001B[32mVerify Parameters\u001B[0m'
|
||||||
|
def allParametersPresent = true
|
||||||
|
|
||||||
|
echo '\u2705 \u001B[32mVerify Labels\u001B[0m'
|
||||||
|
if ("MERGE".equals(env.gitlabActionType)) {
|
||||||
|
LABEL_CHECK = sh returnStdout: true, script: 'ci-scripts/checkGitLabMergeRequestLabels.sh --mr-id ' + env.gitlabMergeRequestIid
|
||||||
|
LABEL_CHECK = LABEL_CHECK.trim()
|
||||||
|
if (LABEL_CHECK == 'NONE') {
|
||||||
|
def message = "OAI " + JOB_NAME + " build (" + BUILD_ID + "): Your merge request has none of the mandatory labels:\n\n"
|
||||||
|
message += " - BUILD-ONLY\n"
|
||||||
|
message += " - 4G-LTE\n"
|
||||||
|
message += " - 5G-NR\n"
|
||||||
|
message += " - CI\n\n"
|
||||||
|
message += "Not performing CI due to lack of labels"
|
||||||
|
addGitLabMRComment comment: message
|
||||||
|
error('Not performing CI due to lack of labels')
|
||||||
|
} else if (LABEL_CHECK == 'FULL') {
|
||||||
|
doMandatoryTests = true
|
||||||
|
doFullTestsuite = true
|
||||||
|
} else if (LABEL_CHECK == 'SHORTEN-5G') {
|
||||||
|
doMandatoryTests = true
|
||||||
|
} else {
|
||||||
|
def message = "OAI " + JOB_NAME + " build (" + BUILD_ID + "): We will perform only build stages on your Merge Request"
|
||||||
|
addGitLabMRComment comment: message
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
doMandatoryTests = true
|
||||||
|
doFullTestsuite = true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
stage ("Verify Guidelines") {
|
||||||
|
steps {
|
||||||
|
echo "Git URL is ${GIT_URL}"
|
||||||
|
echo "GitLab Act is ${env.gitlabActionType}"
|
||||||
|
script {
|
||||||
|
if ("MERGE".equals(env.gitlabActionType)) {
|
||||||
|
// since a bit, in push events, gitlabUserEmail is not populated
|
||||||
|
gitCommitAuthorEmailAddr = env.gitlabUserEmail
|
||||||
|
echo "GitLab Usermail is ${gitCommitAuthorEmailAddr}"
|
||||||
|
// GitLab-Jenkins plugin integration is lacking to perform the merge by itself
|
||||||
|
// Doing it manually --> it may have merge conflicts
|
||||||
|
sh "./ci-scripts/doGitLabMerge.sh --src-branch ${env.gitlabSourceBranch} --src-commit ${env.gitlabMergeRequestLastCommit} --target-branch ${env.gitlabTargetBranch} --target-commit ${GIT_COMMIT}"
|
||||||
|
} else {
|
||||||
|
echo "Git Branch is ${GIT_BRANCH}"
|
||||||
|
echo "Git Commit is ${GIT_COMMIT}"
|
||||||
|
// since a bit, in push events, gitlabUserEmail is not populated
|
||||||
|
gitCommitAuthorEmailAddr = sh returnStdout: true, script: 'git log -n1 --pretty=format:%ae ${GIT_COMMIT}'
|
||||||
|
gitCommitAuthorEmailAddr = gitCommitAuthorEmailAddr.trim()
|
||||||
|
echo "GitLab Usermail is ${gitCommitAuthorEmailAddr}"
|
||||||
|
sh "git log -n1 --pretty=format:\"%s\" > .git/CI_COMMIT_MSG"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
post {
|
||||||
|
failure {
|
||||||
|
script {
|
||||||
|
def message = "OAI " + JOB_NAME + " build (" + BUILD_ID + "): Merge Conflicts -- Cannot perform CI"
|
||||||
|
addGitLabMRComment comment: message
|
||||||
|
currentBuild.result = 'FAILURE'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// Build Stages are Mandatory
|
||||||
|
// Later we will add a Ubuntu20 build
|
||||||
|
stage ("Image Building Processes") {
|
||||||
|
parallel {
|
||||||
|
stage ("Ubuntu18 Build") {
|
||||||
|
steps {
|
||||||
|
script {
|
||||||
|
triggerSlaveJob ('RAN-Ubuntu18-Image-Builder', 'Ubuntu18-Images-Build')
|
||||||
|
}
|
||||||
|
}
|
||||||
|
post {
|
||||||
|
always {
|
||||||
|
script {
|
||||||
|
finalizeSlaveJob('RAN-Ubuntu18-Image-Builder')
|
||||||
|
}
|
||||||
|
}
|
||||||
|
failure {
|
||||||
|
script {
|
||||||
|
currentBuild.result = 'FAILURE'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
stage ("RHEL8 Build") {
|
||||||
|
steps {
|
||||||
|
script {
|
||||||
|
triggerSlaveJob ('RAN-RHEL8-Image-Builder', 'RHEL8-Images-Build')
|
||||||
|
}
|
||||||
|
}
|
||||||
|
post {
|
||||||
|
always {
|
||||||
|
script {
|
||||||
|
finalizeSlaveJob('RAN-RHEL8-Image-Builder')
|
||||||
|
}
|
||||||
|
}
|
||||||
|
failure {
|
||||||
|
script {
|
||||||
|
currentBuild.result = 'FAILURE'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
post {
|
||||||
|
always {
|
||||||
|
script {
|
||||||
|
emailext attachmentsPattern: '*results*.html',
|
||||||
|
body: '''Hi,
|
||||||
|
|
||||||
|
Here are attached HTML report files for $PROJECT_NAME - Build # $BUILD_NUMBER - $BUILD_STATUS!
|
||||||
|
|
||||||
|
Regards,
|
||||||
|
OAI CI Team''',
|
||||||
|
replyTo: 'no-reply@openairinterface.org',
|
||||||
|
subject: '$PROJECT_NAME - Build # $BUILD_NUMBER - $BUILD_STATUS!',
|
||||||
|
to: gitCommitAuthorEmailAddr
|
||||||
|
|
||||||
|
if (fileExists('.git/CI_COMMIT_MSG')) {
|
||||||
|
sh "rm -f .git/CI_COMMIT_MSG"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
success {
|
||||||
|
script {
|
||||||
|
def message = "OAI " + JOB_NAME + " build (" + BUILD_ID + "): passed (" + BUILD_URL + ")"
|
||||||
|
if ("MERGE".equals(env.gitlabActionType)) {
|
||||||
|
echo "This is a MERGE event"
|
||||||
|
addGitLabMRComment comment: message
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
failure {
|
||||||
|
script {
|
||||||
|
def message = "OAI " + JOB_NAME + " build (" + BUILD_ID + "): failed (" + BUILD_URL + ")"
|
||||||
|
if ("MERGE".equals(env.gitlabActionType)) {
|
||||||
|
echo "This is a MERGE event"
|
||||||
|
addGitLabMRComment comment: message
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// ---- Slave Job functions
|
||||||
|
|
||||||
|
def triggerSlaveJob (jobName, gitlabStatusName) {
|
||||||
|
// Workaround for the "cancelled" GitLab pipeline notification
|
||||||
|
// The slave job is triggered with the propagate false so the following commands are executed
|
||||||
|
// Its status is now PASS/SUCCESS from a stage pipeline point of view
|
||||||
|
// localStatus variable MUST be analyzed to properly assess the status
|
||||||
|
localStatus = build job: jobName,
|
||||||
|
parameters: [
|
||||||
|
string(name: 'eNB_Repository', value: String.valueOf(GIT_URL)),
|
||||||
|
string(name: 'eNB_Branch', value: String.valueOf(env.gitlabSourceBranch)),
|
||||||
|
string(name: 'eNB_CommitID', value: String.valueOf(env.gitlabMergeRequestLastCommit)),
|
||||||
|
booleanParam(name: 'eNB_mergeRequest', value: "MERGE".equals(env.gitlabActionType)),
|
||||||
|
string(name: 'eNB_TargetBranch', value: String.valueOf(env.gitlabTargetBranch))
|
||||||
|
], propagate: false
|
||||||
|
localResult = localStatus.getResult()
|
||||||
|
echo "${jobName} Slave Job status is ${localResult}"
|
||||||
|
gitlabCommitStatus(name: gitlabStatusName) {
|
||||||
|
if (localStatus.resultIsBetterOrEqualTo('SUCCESS')) {
|
||||||
|
echo "${jobName} Slave Job is OK"
|
||||||
|
} else {
|
||||||
|
echo "${jobName} Slave Job is KO"
|
||||||
|
sh "ci-scripts/fail.sh"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
def triggerSlaveJobNoGitLab (jobName) {
|
||||||
|
// Workaround for the "cancelled" GitLab pipeline notification
|
||||||
|
// The slave job is triggered with the propagate false so the following commands are executed
|
||||||
|
// Its status is now PASS/SUCCESS from a stage pipeline point of view
|
||||||
|
// localStatus variable MUST be analyzed to properly assess the status
|
||||||
|
localStatus = build job: jobName,
|
||||||
|
parameters: [
|
||||||
|
string(name: 'eNB_Repository', value: String.valueOf(GIT_URL)),
|
||||||
|
string(name: 'eNB_Branch', value: String.valueOf(env.gitlabSourceBranch)),
|
||||||
|
string(name: 'eNB_CommitID', value: String.valueOf(env.gitlabMergeRequestLastCommit)),
|
||||||
|
booleanParam(name: 'eNB_mergeRequest', value: "MERGE".equals(env.gitlabActionType)),
|
||||||
|
string(name: 'eNB_TargetBranch', value: String.valueOf(env.gitlabTargetBranch))
|
||||||
|
], propagate: false
|
||||||
|
localResult = localStatus.getResult()
|
||||||
|
echo "${jobName} Slave Job status is ${localResult}"
|
||||||
|
if (localStatus.resultIsBetterOrEqualTo('SUCCESS')) {
|
||||||
|
echo "${jobName} Slave Job is OK"
|
||||||
|
} else {
|
||||||
|
echo "${jobName} Slave Job is KO"
|
||||||
|
sh "ci-scripts/fail.sh"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
def finalizeSlaveJob(jobName) {
|
||||||
|
// In case of any non-success, we are retrieving the HTML report of the last completed
|
||||||
|
// slave job. The only drop-back is that we may retrieve the HTML report of a previous build
|
||||||
|
fileName = "test_results-${jobName}.html"
|
||||||
|
if (!fileExists(fileName)) {
|
||||||
|
copyArtifacts(projectName: jobName,
|
||||||
|
filter: 'test_results*.html',
|
||||||
|
selector: lastCompleted())
|
||||||
|
if (fileExists(fileName)) {
|
||||||
|
sh "sed -i -e 's#TEMPLATE_BUILD_TIME#${JOB_TIMESTAMP}#' ${fileName}"
|
||||||
|
archiveArtifacts artifacts: fileName
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -196,16 +196,6 @@ pipeline {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
stage ("Start VM -- enb-usrp") {
|
|
||||||
steps {
|
|
||||||
lock (vmResource) {
|
|
||||||
timeout (time: 5, unit: 'MINUTES') {
|
|
||||||
sh "./ci-scripts/oai-ci-vm-tool build --workspace $WORKSPACE --variant enb-usrp --job-name ${JOB_NAME} --build-id ${BUILD_ID} --daemon"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
stage ("Start VM -- phy-sim") {
|
stage ("Start VM -- phy-sim") {
|
||||||
steps {
|
steps {
|
||||||
lock (vmResource) {
|
lock (vmResource) {
|
||||||
@@ -251,7 +241,7 @@ pipeline {
|
|||||||
stage ("Analysis with cppcheck") {
|
stage ("Analysis with cppcheck") {
|
||||||
steps {
|
steps {
|
||||||
gitlabCommitStatus(name: "Analysis with cppcheck") {
|
gitlabCommitStatus(name: "Analysis with cppcheck") {
|
||||||
timeout (time: 20, unit: 'MINUTES') {
|
timeout (time: 30, unit: 'MINUTES') {
|
||||||
sh "./ci-scripts/oai-ci-vm-tool wait --workspace $WORKSPACE --variant cppcheck --job-name ${JOB_NAME} --build-id ${BUILD_ID}"
|
sh "./ci-scripts/oai-ci-vm-tool wait --workspace $WORKSPACE --variant cppcheck --job-name ${JOB_NAME} --build-id ${BUILD_ID}"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -260,7 +250,7 @@ pipeline {
|
|||||||
stage ("Build basic simulator") {
|
stage ("Build basic simulator") {
|
||||||
steps {
|
steps {
|
||||||
gitlabCommitStatus(name: "Build basic-sim") {
|
gitlabCommitStatus(name: "Build basic-sim") {
|
||||||
timeout (time: 20, unit: 'MINUTES') {
|
timeout (time: 30, unit: 'MINUTES') {
|
||||||
sh "./ci-scripts/oai-ci-vm-tool wait --workspace $WORKSPACE --variant basic-sim --job-name ${JOB_NAME} --build-id ${BUILD_ID} --keep-vm-alive"
|
sh "./ci-scripts/oai-ci-vm-tool wait --workspace $WORKSPACE --variant basic-sim --job-name ${JOB_NAME} --build-id ${BUILD_ID} --keep-vm-alive"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -269,7 +259,7 @@ pipeline {
|
|||||||
stage ("Build 5G gNB-USRP") {
|
stage ("Build 5G gNB-USRP") {
|
||||||
steps {
|
steps {
|
||||||
gitlabCommitStatus(name: "Build gNB-USRP") {
|
gitlabCommitStatus(name: "Build gNB-USRP") {
|
||||||
timeout (time: 20, unit: 'MINUTES') {
|
timeout (time: 30, unit: 'MINUTES') {
|
||||||
sh "./ci-scripts/oai-ci-vm-tool wait --workspace $WORKSPACE --variant gnb-usrp --job-name ${JOB_NAME} --build-id ${BUILD_ID} --keep-vm-alive"
|
sh "./ci-scripts/oai-ci-vm-tool wait --workspace $WORKSPACE --variant gnb-usrp --job-name ${JOB_NAME} --build-id ${BUILD_ID} --keep-vm-alive"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -278,25 +268,16 @@ pipeline {
|
|||||||
stage ("Build 5G NR-UE-USRP") {
|
stage ("Build 5G NR-UE-USRP") {
|
||||||
steps {
|
steps {
|
||||||
gitlabCommitStatus(name: "Build nr-UE-USRP") {
|
gitlabCommitStatus(name: "Build nr-UE-USRP") {
|
||||||
timeout (time: 20, unit: 'MINUTES') {
|
timeout (time: 30, unit: 'MINUTES') {
|
||||||
sh "./ci-scripts/oai-ci-vm-tool wait --workspace $WORKSPACE --variant nr-ue-usrp --job-name ${JOB_NAME} --build-id ${BUILD_ID} --keep-vm-alive"
|
sh "./ci-scripts/oai-ci-vm-tool wait --workspace $WORKSPACE --variant nr-ue-usrp --job-name ${JOB_NAME} --build-id ${BUILD_ID} --keep-vm-alive"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
stage ("Build eNB-USRP") {
|
|
||||||
steps {
|
|
||||||
gitlabCommitStatus(name: "Build eNB-USRP") {
|
|
||||||
timeout (time: 20, unit: 'MINUTES') {
|
|
||||||
sh "./ci-scripts/oai-ci-vm-tool wait --workspace $WORKSPACE --variant enb-usrp --job-name ${JOB_NAME} --build-id ${BUILD_ID}"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
stage ("Build physical simulators") {
|
stage ("Build physical simulators") {
|
||||||
steps {
|
steps {
|
||||||
gitlabCommitStatus(name: "Build phy-sim") {
|
gitlabCommitStatus(name: "Build phy-sim") {
|
||||||
timeout (time: 20, unit: 'MINUTES') {
|
timeout (time: 30, unit: 'MINUTES') {
|
||||||
sh "./ci-scripts/oai-ci-vm-tool wait --workspace $WORKSPACE --variant phy-sim --job-name ${JOB_NAME} --build-id ${BUILD_ID} --keep-vm-alive"
|
sh "./ci-scripts/oai-ci-vm-tool wait --workspace $WORKSPACE --variant phy-sim --job-name ${JOB_NAME} --build-id ${BUILD_ID} --keep-vm-alive"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -305,7 +286,7 @@ pipeline {
|
|||||||
stage ("Build eNB-ethernet") {
|
stage ("Build eNB-ethernet") {
|
||||||
steps {
|
steps {
|
||||||
gitlabCommitStatus(name: "Build eNB-ethernet") {
|
gitlabCommitStatus(name: "Build eNB-ethernet") {
|
||||||
timeout (time: 20, unit: 'MINUTES') {
|
timeout (time: 30, unit: 'MINUTES') {
|
||||||
sh "./ci-scripts/oai-ci-vm-tool wait --workspace $WORKSPACE --variant enb-ethernet --job-name ${JOB_NAME} --build-id ${BUILD_ID} --keep-vm-alive"
|
sh "./ci-scripts/oai-ci-vm-tool wait --workspace $WORKSPACE --variant enb-ethernet --job-name ${JOB_NAME} --build-id ${BUILD_ID} --keep-vm-alive"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -316,7 +297,7 @@ pipeline {
|
|||||||
// This is typically the last one to finish.
|
// This is typically the last one to finish.
|
||||||
lock (vmResource) {
|
lock (vmResource) {
|
||||||
gitlabCommitStatus(name: "Build UE-ethernet") {
|
gitlabCommitStatus(name: "Build UE-ethernet") {
|
||||||
timeout (time: 20, unit: 'MINUTES') {
|
timeout (time: 30, unit: 'MINUTES') {
|
||||||
sh "./ci-scripts/oai-ci-vm-tool wait --workspace $WORKSPACE --variant ue-ethernet --job-name ${JOB_NAME} --build-id ${BUILD_ID} --keep-vm-alive"
|
sh "./ci-scripts/oai-ci-vm-tool wait --workspace $WORKSPACE --variant ue-ethernet --job-name ${JOB_NAME} --build-id ${BUILD_ID} --keep-vm-alive"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,293 @@
|
|||||||
|
#!/bin/groovy
|
||||||
|
/*
|
||||||
|
* Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
|
||||||
|
* contributor license agreements. See the NOTICE file distributed with
|
||||||
|
* this work for additional information regarding copyright ownership.
|
||||||
|
* The OpenAirInterface Software Alliance licenses this file to You under
|
||||||
|
* the OAI Public License, Version 1.1 (the "License"); you may not use this file
|
||||||
|
* except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.openairinterface.org/?page_id=698
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*-------------------------------------------------------------------------------
|
||||||
|
* For more information about the OpenAirInterface (OAI) Software Alliance:
|
||||||
|
* contact@openairinterface.org
|
||||||
|
*/
|
||||||
|
|
||||||
|
// Template Jenkins Declarative Pipeline script to run Test w/ RF HW
|
||||||
|
|
||||||
|
// Location of the python executor node shall be in the same subnet as the others servers
|
||||||
|
def pythonExecutor = params.pythonExecutor
|
||||||
|
|
||||||
|
// Location of the test XML file to be run
|
||||||
|
def testXMLFile = params.pythonTestXmlFile
|
||||||
|
def mainPythonAllXmlFiles = ""
|
||||||
|
def buildStageStatus = true
|
||||||
|
|
||||||
|
// Name of the test stage
|
||||||
|
def testStageName = params.pipelineTestStageName
|
||||||
|
|
||||||
|
// Name of the phone resource
|
||||||
|
def ciSmartPhonesResource1 = params.SmartPhonesResource1
|
||||||
|
def ciSmartPhonesResource2 = params.SmartPhonesResource2
|
||||||
|
|
||||||
|
// Global Parameters. Normally they should be populated when the master job
|
||||||
|
// triggers the slave job with parameters
|
||||||
|
def eNB_Repository
|
||||||
|
def eNB_Branch
|
||||||
|
def eNB_CommitID
|
||||||
|
def eNB_AllowMergeRequestProcess
|
||||||
|
def eNB_TargetBranch
|
||||||
|
|
||||||
|
pipeline {
|
||||||
|
agent {
|
||||||
|
label pythonExecutor
|
||||||
|
}
|
||||||
|
options {
|
||||||
|
disableConcurrentBuilds()
|
||||||
|
ansiColor('xterm')
|
||||||
|
lock(extra: [[resource: ciSmartPhonesResource2]], resource: ciSmartPhonesResource1)
|
||||||
|
}
|
||||||
|
stages {
|
||||||
|
stage("Build Init") {
|
||||||
|
steps {
|
||||||
|
// update the build name and description
|
||||||
|
buildName "${params.eNB_MR}"
|
||||||
|
buildDescription "Branch : ${params.eNB_Branch}"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
stage ("Verify Parameters") {
|
||||||
|
steps {
|
||||||
|
script {
|
||||||
|
echo '\u2705 \u001B[32mVerify Parameters\u001B[0m'
|
||||||
|
def allParametersPresent = true
|
||||||
|
|
||||||
|
// It is already to late to check it
|
||||||
|
if (params.pythonExecutor != null) {
|
||||||
|
echo "eNB CI executor node : ${pythonExecutor}"
|
||||||
|
}
|
||||||
|
// If not present picking a default Stage Name
|
||||||
|
if (params.pipelineTestStageName == null) {
|
||||||
|
// picking default
|
||||||
|
testStageName = 'Template Test Stage'
|
||||||
|
}
|
||||||
|
|
||||||
|
if (params.SmartPhonesResource1 == null) {
|
||||||
|
allParametersPresent = false
|
||||||
|
}
|
||||||
|
if (params.SmartPhonesResource2 == null) {
|
||||||
|
allParametersPresent = false
|
||||||
|
}
|
||||||
|
// 1st eNB parameters
|
||||||
|
if (params.eNB_IPAddress == null) {
|
||||||
|
allParametersPresent = false
|
||||||
|
}
|
||||||
|
if (params.eNB_SourceCodePath == null) {
|
||||||
|
allParametersPresent = false
|
||||||
|
}
|
||||||
|
if (params.eNB_Credentials == null) {
|
||||||
|
allParametersPresent = false
|
||||||
|
}
|
||||||
|
// 2nd eNB parameters
|
||||||
|
if (params.eNB1_IPAddress == null) {
|
||||||
|
allParametersPresent = false
|
||||||
|
}
|
||||||
|
if (params.eNB1_SourceCodePath == null) {
|
||||||
|
allParametersPresent = false
|
||||||
|
}
|
||||||
|
if (params.eNB1_Credentials == null) {
|
||||||
|
allParametersPresent = false
|
||||||
|
}
|
||||||
|
// 3rd eNB parameters
|
||||||
|
if (params.eNB2_IPAddress == null) {
|
||||||
|
allParametersPresent = false
|
||||||
|
}
|
||||||
|
if (params.eNB2_SourceCodePath == null) {
|
||||||
|
allParametersPresent = false
|
||||||
|
}
|
||||||
|
if (params.eNB2_Credentials == null) {
|
||||||
|
allParametersPresent = false
|
||||||
|
}
|
||||||
|
// the following 4 parameters should be pushed by the master trigger
|
||||||
|
// if not present, take the job GIT variables (used for developing)
|
||||||
|
if (params.eNB_Repository == null) {
|
||||||
|
eNB_Repository = env.GIT_URL
|
||||||
|
} else {
|
||||||
|
eNB_Repository = params.eNB_Repository
|
||||||
|
}
|
||||||
|
echo "eNB_Repository : ${eNB_Repository}"
|
||||||
|
if (params.eNB_Branch == null) {
|
||||||
|
eNB_Branch = env.GIT_BRANCH
|
||||||
|
} else {
|
||||||
|
eNB_Branch = params.eNB_Branch
|
||||||
|
}
|
||||||
|
echo "eNB_Branch : ${eNB_Branch}"
|
||||||
|
if (params.eNB_CommitID == null) {
|
||||||
|
eNB_CommitID = env.GIT_COMMIT
|
||||||
|
} else {
|
||||||
|
eNB_CommitID = params.eNB_CommitID
|
||||||
|
}
|
||||||
|
echo "eNB_CommitID : ${eNB_CommitID}"
|
||||||
|
if (params.eNB_AllowMergeRequestProcess!= null) {
|
||||||
|
eNB_AllowMergeRequestProcess = params.eNB_AllowMergeRequestProcess
|
||||||
|
if (eNB_AllowMergeRequestProcess) {
|
||||||
|
if (params.eNB_TargetBranch != null) {
|
||||||
|
eNB_TargetBranch = params.eNB_TargetBranch
|
||||||
|
} else {
|
||||||
|
eNB_TargetBranch = 'develop'
|
||||||
|
}
|
||||||
|
echo "eNB_TargetBranch : ${eNB_TargetBranch}"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (params.EPC_IPAddress == null) {
|
||||||
|
allParametersPresent = false
|
||||||
|
}
|
||||||
|
if (params.EPC_Type == null) {
|
||||||
|
allParametersPresent = false
|
||||||
|
}
|
||||||
|
if (params.EPC_SourceCodePath == null) {
|
||||||
|
allParametersPresent = false
|
||||||
|
}
|
||||||
|
if (params.EPC_Credentials == null) {
|
||||||
|
allParametersPresent = false
|
||||||
|
}
|
||||||
|
|
||||||
|
if (params.ADB_IPAddress == null) {
|
||||||
|
allParametersPresent = false
|
||||||
|
}
|
||||||
|
if (params.ADB_Credentials == null) {
|
||||||
|
allParametersPresent = false
|
||||||
|
}
|
||||||
|
|
||||||
|
if (allParametersPresent) {
|
||||||
|
echo "All parameters are present"
|
||||||
|
if (eNB_AllowMergeRequestProcess) {
|
||||||
|
sh "git fetch"
|
||||||
|
sh "./ci-scripts/doGitLabMerge.sh --src-branch ${eNB_Branch} --src-commit ${eNB_CommitID} --target-branch ${eNB_TargetBranch} --target-commit latest"
|
||||||
|
} else {
|
||||||
|
sh "git fetch"
|
||||||
|
sh "git checkout -f ${eNB_CommitID}"
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
echo "Some parameters are missing"
|
||||||
|
sh "./ci-scripts/fail.sh"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
stage ("Build and Test") {
|
||||||
|
steps {
|
||||||
|
script {
|
||||||
|
dir ('ci-scripts') {
|
||||||
|
echo "\u2705 \u001B[32m${testStageName}\u001B[0m"
|
||||||
|
// If not present picking a default XML file
|
||||||
|
if (params.pythonTestXmlFile == null) {
|
||||||
|
// picking default
|
||||||
|
testXMLFile = 'xml_files/enb_usrpB210_band7_50PRB.xml'
|
||||||
|
echo "Test XML file(default): ${testXMLFile}"
|
||||||
|
mainPythonAllXmlFiles += "--XMLTestFile=" + testXMLFile + " "
|
||||||
|
} else {
|
||||||
|
String[] myXmlTestSuite = testXMLFile.split("\\r?\\n")
|
||||||
|
for (xmlFile in myXmlTestSuite) {
|
||||||
|
if (fileExists(xmlFile)) {
|
||||||
|
mainPythonAllXmlFiles += "--XMLTestFile=" + xmlFile + " "
|
||||||
|
echo "Test XML file : ${xmlFile}"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
withCredentials([
|
||||||
|
[$class: 'UsernamePasswordMultiBinding', credentialsId: "${params.eNB_Credentials}", usernameVariable: 'eNB_Username', passwordVariable: 'eNB_Password'],
|
||||||
|
[$class: 'UsernamePasswordMultiBinding', credentialsId: "${params.eNB1_Credentials}", usernameVariable: 'eNB1_Username', passwordVariable: 'eNB1_Password'],
|
||||||
|
[$class: 'UsernamePasswordMultiBinding', credentialsId: "${params.eNB2_Credentials}", usernameVariable: 'eNB2_Username', passwordVariable: 'eNB2_Password'],
|
||||||
|
[$class: 'UsernamePasswordMultiBinding', credentialsId: "${params.EPC_Credentials}", usernameVariable: 'EPC_Username', passwordVariable: 'EPC_Password'],
|
||||||
|
[$class: 'UsernamePasswordMultiBinding', credentialsId: "${params.ADB_Credentials}", usernameVariable: 'ADB_Username', passwordVariable: 'ADB_Password']
|
||||||
|
]) {
|
||||||
|
sh "python3 main.py --mode=InitiateHtml --ranRepository=${eNB_Repository} --ranBranch=${eNB_Branch} --ranCommitID=${eNB_CommitID} --ranAllowMerge=${eNB_AllowMergeRequestProcess} --ranTargetBranch=${eNB_TargetBranch} --ADBIPAddress=${params.ADB_IPAddress} --ADBUserName=${ADB_Username} --ADBPassword=${ADB_Password} ${mainPythonAllXmlFiles}"
|
||||||
|
String[] myXmlTestSuite = testXMLFile.split("\\r?\\n")
|
||||||
|
for (xmlFile in myXmlTestSuite) {
|
||||||
|
if (fileExists(xmlFile)) {
|
||||||
|
try {
|
||||||
|
sh "python3 main.py --mode=TesteNB --ranRepository=${eNB_Repository} --ranBranch=${eNB_Branch} --ranCommitID=${eNB_CommitID} --ranAllowMerge=${eNB_AllowMergeRequestProcess} --ranTargetBranch=${eNB_TargetBranch} --eNBIPAddress=${params.eNB_IPAddress} --eNBUserName=${eNB_Username} --eNBPassword=${eNB_Password} --eNBSourceCodePath=${params.eNB_SourceCodePath} --eNB1IPAddress=${params.eNB1_IPAddress} --eNB1UserName=${eNB1_Username} --eNB1Password=${eNB1_Password} --eNB1SourceCodePath=${params.eNB1_SourceCodePath} --eNB2IPAddress=${params.eNB2_IPAddress} --eNB2UserName=${eNB2_Username} --eNB2Password=${eNB2_Password} --eNB2SourceCodePath=${params.eNB2_SourceCodePath} --EPCIPAddress=${params.EPC_IPAddress} --EPCType=${params.EPC_Type} --EPCUserName=${EPC_Username} --EPCPassword=${EPC_Password} --EPCSourceCodePath=${params.EPC_SourceCodePath} --ADBIPAddress=${params.ADB_IPAddress} --ADBUserName=${ADB_Username} --ADBPassword=${ADB_Password} --XMLTestFile=${xmlFile}"
|
||||||
|
} catch (Exception e) {
|
||||||
|
currentBuild.result = 'FAILURE'
|
||||||
|
buildStageStatus = false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
sh "python3 main.py --mode=FinalizeHtml --finalStatus=${buildStageStatus} --eNBIPAddress=${params.eNB_IPAddress} --eNBUserName=${eNB_Username} --eNBPassword=${eNB_Password}"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
stage('Log Collection') {
|
||||||
|
parallel {
|
||||||
|
stage('Log Collection (eNB - Build)') {
|
||||||
|
steps {
|
||||||
|
withCredentials([
|
||||||
|
[$class: 'UsernamePasswordMultiBinding', credentialsId: "${params.eNB_Credentials}", usernameVariable: 'eNB_Username', passwordVariable: 'eNB_Password']
|
||||||
|
]) {
|
||||||
|
echo '\u2705 \u001B[32mLog Collection (eNB - Build)\u001B[0m'
|
||||||
|
sh "python3 ci-scripts/main.py --mode=LogCollectBuild --eNBIPAddress=${params.eNB_IPAddress} --eNBUserName=${eNB_Username} --eNBPassword=${eNB_Password} --eNBSourceCodePath=${params.eNB_SourceCodePath}"
|
||||||
|
|
||||||
|
echo '\u2705 \u001B[32mLog Transfer (eNB - Build)\u001B[0m'
|
||||||
|
sh "sshpass -p \'${eNB_Password}\' scp -o 'StrictHostKeyChecking no' -o 'ConnectTimeout 10' ${eNB_Username}@${params.eNB_IPAddress}:${eNB_SourceCodePath}/cmake_targets/build.log.zip ./build.log.${env.BUILD_ID}.zip || true"
|
||||||
|
}
|
||||||
|
script {
|
||||||
|
if(fileExists("build.log.${env.BUILD_ID}.zip")) {
|
||||||
|
archiveArtifacts "build.log.${env.BUILD_ID}.zip"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
stage('Log Collection (eNB - Run)') {
|
||||||
|
steps {
|
||||||
|
withCredentials([
|
||||||
|
[$class: 'UsernamePasswordMultiBinding', credentialsId: "${params.eNB_Credentials}", usernameVariable: 'eNB_Username', passwordVariable: 'eNB_Password']
|
||||||
|
]) {
|
||||||
|
echo '\u2705 \u001B[32mLog Collection (eNB - Run)\u001B[0m'
|
||||||
|
sh "python3 ci-scripts/main.py --mode=LogCollecteNB --eNBIPAddress=${params.eNB_IPAddress} --eNBUserName=${eNB_Username} --eNBPassword=${eNB_Password} --eNBSourceCodePath=${params.eNB_SourceCodePath}"
|
||||||
|
|
||||||
|
echo '\u2705 \u001B[32mLog Transfer (eNB - Run)\u001B[0m'
|
||||||
|
sh "sshpass -p \'${eNB_Password}\' scp -o 'StrictHostKeyChecking no' -o 'ConnectTimeout 10' ${eNB_Username}@${params.eNB_IPAddress}:${eNB_SourceCodePath}/cmake_targets/enb.log.zip ./enb.log.${env.BUILD_ID}.zip || true"
|
||||||
|
}
|
||||||
|
script {
|
||||||
|
if(fileExists("enb.log.${env.BUILD_ID}.zip")) {
|
||||||
|
archiveArtifacts "enb.log.${env.BUILD_ID}.zip"
|
||||||
|
}
|
||||||
|
if(fileExists("ci-scripts/test_results.html")) {
|
||||||
|
sh "mv ci-scripts/test_results.html test_results-${JOB_NAME}.html"
|
||||||
|
sh "sed -i -e 's#TEMPLATE_JOB_NAME#${JOB_NAME}#' -e 's@build #TEMPLATE_BUILD_ID@build #${BUILD_ID}@' -e 's#Build-ID: TEMPLATE_BUILD_ID#Build-ID: <a href=\"${BUILD_URL}\">${BUILD_ID}</a>#' -e 's#TEMPLATE_STAGE_NAME#${testStageName}#' test_results-${JOB_NAME}.html"
|
||||||
|
archiveArtifacts "test_results-${JOB_NAME}.html"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
post {
|
||||||
|
always {
|
||||||
|
script {
|
||||||
|
if (params.pipelineZipsConsoleLog != null) {
|
||||||
|
if (params.pipelineZipsConsoleLog) {
|
||||||
|
echo "Archiving Jenkins console log"
|
||||||
|
sh "wget --no-check-certificate --no-proxy ${env.JENKINS_URL}/job/${env.JOB_NAME}/${env.BUILD_ID}/consoleText -O consoleText.log || true"
|
||||||
|
sh "zip -m consoleText.log.${env.BUILD_ID}.zip consoleText.log || true"
|
||||||
|
if(fileExists("consoleText.log.${env.BUILD_ID}.zip")) {
|
||||||
|
archiveArtifacts "consoleText.log.${env.BUILD_ID}.zip"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,297 @@
|
|||||||
|
#!/bin/groovy
|
||||||
|
/*
|
||||||
|
* Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
|
||||||
|
* contributor license agreements. See the NOTICE file distributed with
|
||||||
|
* this work for additional information regarding copyright ownership.
|
||||||
|
* The OpenAirInterface Software Alliance licenses this file to You under
|
||||||
|
* the OAI Public License, Version 1.1 (the "License"); you may not use this file
|
||||||
|
* except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.openairinterface.org/?page_id=698
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*-------------------------------------------------------------------------------
|
||||||
|
* For more information about the OpenAirInterface (OAI) Software Alliance:
|
||||||
|
* contact@openairinterface.org
|
||||||
|
*/
|
||||||
|
|
||||||
|
// Template Jenkins Declarative Pipeline script to run Test w/ RF HW
|
||||||
|
|
||||||
|
// Location of the python executor node shall be in the same subnet as the others servers
|
||||||
|
def pythonExecutor = params.pythonExecutor
|
||||||
|
|
||||||
|
// Location of the test XML file to be run
|
||||||
|
def testXMLFile = params.pythonTestXmlFile
|
||||||
|
def mainPythonAllXmlFiles = ""
|
||||||
|
def buildStageStatus = true
|
||||||
|
|
||||||
|
// Name of the test stage
|
||||||
|
def testStageName = params.pipelineTestStageName
|
||||||
|
|
||||||
|
// Name of the phone resource
|
||||||
|
def ciSmartPhonesResource1 = params.SmartPhonesResource1
|
||||||
|
def ciSmartPhonesResource2 = params.SmartPhonesResource2
|
||||||
|
def ciSmartPhonesResource3 = params.SmartPhonesResource3
|
||||||
|
|
||||||
|
// Global Parameters. Normally they should be populated when the master job
|
||||||
|
// triggers the slave job with parameters
|
||||||
|
def eNB_Repository
|
||||||
|
def eNB_Branch
|
||||||
|
def eNB_CommitID
|
||||||
|
def eNB_AllowMergeRequestProcess
|
||||||
|
def eNB_TargetBranch
|
||||||
|
|
||||||
|
pipeline {
|
||||||
|
agent {
|
||||||
|
label pythonExecutor
|
||||||
|
}
|
||||||
|
options {
|
||||||
|
disableConcurrentBuilds()
|
||||||
|
ansiColor('xterm')
|
||||||
|
lock(extra: [[resource: ciSmartPhonesResource2],[resource: ciSmartPhonesResource3]], resource: ciSmartPhonesResource1)
|
||||||
|
}
|
||||||
|
stages {
|
||||||
|
stage("Build Init") {
|
||||||
|
steps {
|
||||||
|
// update the build name and description
|
||||||
|
buildName "${params.eNB_MR}"
|
||||||
|
buildDescription "Branch : ${params.eNB_Branch}"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
stage ("Verify Parameters") {
|
||||||
|
steps {
|
||||||
|
script {
|
||||||
|
echo '\u2705 \u001B[32mVerify Parameters\u001B[0m'
|
||||||
|
def allParametersPresent = true
|
||||||
|
|
||||||
|
// It is already to late to check it
|
||||||
|
if (params.pythonExecutor != null) {
|
||||||
|
echo "eNB CI executor node : ${pythonExecutor}"
|
||||||
|
}
|
||||||
|
// If not present picking a default Stage Name
|
||||||
|
if (params.pipelineTestStageName == null) {
|
||||||
|
// picking default
|
||||||
|
testStageName = 'Template Test Stage'
|
||||||
|
}
|
||||||
|
|
||||||
|
if (params.SmartPhonesResource1 == null) {
|
||||||
|
allParametersPresent = false
|
||||||
|
}
|
||||||
|
if (params.SmartPhonesResource2 == null) {
|
||||||
|
allParametersPresent = false
|
||||||
|
}
|
||||||
|
if (params.SmartPhonesResource3== null) {
|
||||||
|
allParametersPresent = false
|
||||||
|
}
|
||||||
|
// 1st eNB parameters
|
||||||
|
if (params.eNB_IPAddress == null) {
|
||||||
|
allParametersPresent = false
|
||||||
|
}
|
||||||
|
if (params.eNB_SourceCodePath == null) {
|
||||||
|
allParametersPresent = false
|
||||||
|
}
|
||||||
|
if (params.eNB_Credentials == null) {
|
||||||
|
allParametersPresent = false
|
||||||
|
}
|
||||||
|
// 2nd eNB parameters
|
||||||
|
if (params.eNB1_IPAddress == null) {
|
||||||
|
allParametersPresent = false
|
||||||
|
}
|
||||||
|
if (params.eNB1_SourceCodePath == null) {
|
||||||
|
allParametersPresent = false
|
||||||
|
}
|
||||||
|
if (params.eNB1_Credentials == null) {
|
||||||
|
allParametersPresent = false
|
||||||
|
}
|
||||||
|
// 3rd eNB parameters
|
||||||
|
if (params.eNB2_IPAddress == null) {
|
||||||
|
allParametersPresent = false
|
||||||
|
}
|
||||||
|
if (params.eNB2_SourceCodePath == null) {
|
||||||
|
allParametersPresent = false
|
||||||
|
}
|
||||||
|
if (params.eNB2_Credentials == null) {
|
||||||
|
allParametersPresent = false
|
||||||
|
}
|
||||||
|
// the following 4 parameters should be pushed by the master trigger
|
||||||
|
// if not present, take the job GIT variables (used for developing)
|
||||||
|
if (params.eNB_Repository == null) {
|
||||||
|
eNB_Repository = env.GIT_URL
|
||||||
|
} else {
|
||||||
|
eNB_Repository = params.eNB_Repository
|
||||||
|
}
|
||||||
|
echo "eNB_Repository : ${eNB_Repository}"
|
||||||
|
if (params.eNB_Branch == null) {
|
||||||
|
eNB_Branch = env.GIT_BRANCH
|
||||||
|
} else {
|
||||||
|
eNB_Branch = params.eNB_Branch
|
||||||
|
}
|
||||||
|
echo "eNB_Branch : ${eNB_Branch}"
|
||||||
|
if (params.eNB_CommitID == null) {
|
||||||
|
eNB_CommitID = env.GIT_COMMIT
|
||||||
|
} else {
|
||||||
|
eNB_CommitID = params.eNB_CommitID
|
||||||
|
}
|
||||||
|
echo "eNB_CommitID : ${eNB_CommitID}"
|
||||||
|
if (params.eNB_AllowMergeRequestProcess!= null) {
|
||||||
|
eNB_AllowMergeRequestProcess = params.eNB_AllowMergeRequestProcess
|
||||||
|
if (eNB_AllowMergeRequestProcess) {
|
||||||
|
if (params.eNB_TargetBranch != null) {
|
||||||
|
eNB_TargetBranch = params.eNB_TargetBranch
|
||||||
|
} else {
|
||||||
|
eNB_TargetBranch = 'develop'
|
||||||
|
}
|
||||||
|
echo "eNB_TargetBranch : ${eNB_TargetBranch}"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (params.EPC_IPAddress == null) {
|
||||||
|
allParametersPresent = false
|
||||||
|
}
|
||||||
|
if (params.EPC_Type == null) {
|
||||||
|
allParametersPresent = false
|
||||||
|
}
|
||||||
|
if (params.EPC_SourceCodePath == null) {
|
||||||
|
allParametersPresent = false
|
||||||
|
}
|
||||||
|
if (params.EPC_Credentials == null) {
|
||||||
|
allParametersPresent = false
|
||||||
|
}
|
||||||
|
|
||||||
|
if (params.ADB_IPAddress == null) {
|
||||||
|
allParametersPresent = false
|
||||||
|
}
|
||||||
|
if (params.ADB_Credentials == null) {
|
||||||
|
allParametersPresent = false
|
||||||
|
}
|
||||||
|
|
||||||
|
if (allParametersPresent) {
|
||||||
|
echo "All parameters are present"
|
||||||
|
if (eNB_AllowMergeRequestProcess) {
|
||||||
|
sh "git fetch"
|
||||||
|
sh "./ci-scripts/doGitLabMerge.sh --src-branch ${eNB_Branch} --src-commit ${eNB_CommitID} --target-branch ${eNB_TargetBranch} --target-commit latest"
|
||||||
|
} else {
|
||||||
|
sh "git fetch"
|
||||||
|
sh "git checkout -f ${eNB_CommitID}"
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
echo "Some parameters are missing"
|
||||||
|
sh "./ci-scripts/fail.sh"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
stage ("Build and Test") {
|
||||||
|
steps {
|
||||||
|
script {
|
||||||
|
dir ('ci-scripts') {
|
||||||
|
echo "\u2705 \u001B[32m${testStageName}\u001B[0m"
|
||||||
|
// If not present picking a default XML file
|
||||||
|
if (params.pythonTestXmlFile == null) {
|
||||||
|
// picking default
|
||||||
|
testXMLFile = 'xml_files/enb_usrpB210_band7_50PRB.xml'
|
||||||
|
echo "Test XML file(default): ${testXMLFile}"
|
||||||
|
mainPythonAllXmlFiles += "--XMLTestFile=" + testXMLFile + " "
|
||||||
|
} else {
|
||||||
|
String[] myXmlTestSuite = testXMLFile.split("\\r?\\n")
|
||||||
|
for (xmlFile in myXmlTestSuite) {
|
||||||
|
if (fileExists(xmlFile)) {
|
||||||
|
mainPythonAllXmlFiles += "--XMLTestFile=" + xmlFile + " "
|
||||||
|
echo "Test XML file : ${xmlFile}"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
withCredentials([
|
||||||
|
[$class: 'UsernamePasswordMultiBinding', credentialsId: "${params.eNB_Credentials}", usernameVariable: 'eNB_Username', passwordVariable: 'eNB_Password'],
|
||||||
|
[$class: 'UsernamePasswordMultiBinding', credentialsId: "${params.eNB1_Credentials}", usernameVariable: 'eNB1_Username', passwordVariable: 'eNB1_Password'],
|
||||||
|
[$class: 'UsernamePasswordMultiBinding', credentialsId: "${params.eNB2_Credentials}", usernameVariable: 'eNB2_Username', passwordVariable: 'eNB2_Password'],
|
||||||
|
[$class: 'UsernamePasswordMultiBinding', credentialsId: "${params.EPC_Credentials}", usernameVariable: 'EPC_Username', passwordVariable: 'EPC_Password'],
|
||||||
|
[$class: 'UsernamePasswordMultiBinding', credentialsId: "${params.ADB_Credentials}", usernameVariable: 'ADB_Username', passwordVariable: 'ADB_Password']
|
||||||
|
]) {
|
||||||
|
sh "python3 main.py --mode=InitiateHtml --ranRepository=${eNB_Repository} --ranBranch=${eNB_Branch} --ranCommitID=${eNB_CommitID} --ranAllowMerge=${eNB_AllowMergeRequestProcess} --ranTargetBranch=${eNB_TargetBranch} --ADBIPAddress=${params.ADB_IPAddress} --ADBUserName=${ADB_Username} --ADBPassword=${ADB_Password} ${mainPythonAllXmlFiles}"
|
||||||
|
String[] myXmlTestSuite = testXMLFile.split("\\r?\\n")
|
||||||
|
for (xmlFile in myXmlTestSuite) {
|
||||||
|
if (fileExists(xmlFile)) {
|
||||||
|
try {
|
||||||
|
sh "python3 main.py --mode=TesteNB --ranRepository=${eNB_Repository} --ranBranch=${eNB_Branch} --ranCommitID=${eNB_CommitID} --ranAllowMerge=${eNB_AllowMergeRequestProcess} --ranTargetBranch=${eNB_TargetBranch} --eNBIPAddress=${params.eNB_IPAddress} --eNBUserName=${eNB_Username} --eNBPassword=${eNB_Password} --eNBSourceCodePath=${params.eNB_SourceCodePath} --eNB1IPAddress=${params.eNB1_IPAddress} --eNB1UserName=${eNB1_Username} --eNB1Password=${eNB1_Password} --eNB1SourceCodePath=${params.eNB1_SourceCodePath} --eNB2IPAddress=${params.eNB2_IPAddress} --eNB2UserName=${eNB2_Username} --eNB2Password=${eNB2_Password} --eNB2SourceCodePath=${params.eNB2_SourceCodePath} --EPCIPAddress=${params.EPC_IPAddress} --EPCType=${params.EPC_Type} --EPCUserName=${EPC_Username} --EPCPassword=${EPC_Password} --EPCSourceCodePath=${params.EPC_SourceCodePath} --ADBIPAddress=${params.ADB_IPAddress} --ADBUserName=${ADB_Username} --ADBPassword=${ADB_Password} --XMLTestFile=${xmlFile}"
|
||||||
|
} catch (Exception e) {
|
||||||
|
currentBuild.result = 'FAILURE'
|
||||||
|
buildStageStatus = false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
sh "python3 main.py --mode=FinalizeHtml --finalStatus=${buildStageStatus} --eNBIPAddress=${params.eNB_IPAddress} --eNBUserName=${eNB_Username} --eNBPassword=${eNB_Password}"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
stage('Log Collection') {
|
||||||
|
parallel {
|
||||||
|
stage('Log Collection (eNB - Build)') {
|
||||||
|
steps {
|
||||||
|
withCredentials([
|
||||||
|
[$class: 'UsernamePasswordMultiBinding', credentialsId: "${params.eNB_Credentials}", usernameVariable: 'eNB_Username', passwordVariable: 'eNB_Password']
|
||||||
|
]) {
|
||||||
|
echo '\u2705 \u001B[32mLog Collection (eNB - Build)\u001B[0m'
|
||||||
|
sh "python3 ci-scripts/main.py --mode=LogCollectBuild --eNBIPAddress=${params.eNB_IPAddress} --eNBUserName=${eNB_Username} --eNBPassword=${eNB_Password} --eNBSourceCodePath=${params.eNB_SourceCodePath}"
|
||||||
|
|
||||||
|
echo '\u2705 \u001B[32mLog Transfer (eNB - Build)\u001B[0m'
|
||||||
|
sh "sshpass -p \'${eNB_Password}\' scp -o 'StrictHostKeyChecking no' -o 'ConnectTimeout 10' ${eNB_Username}@${params.eNB_IPAddress}:${eNB_SourceCodePath}/cmake_targets/build.log.zip ./build.log.${env.BUILD_ID}.zip || true"
|
||||||
|
}
|
||||||
|
script {
|
||||||
|
if(fileExists("build.log.${env.BUILD_ID}.zip")) {
|
||||||
|
archiveArtifacts "build.log.${env.BUILD_ID}.zip"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
stage('Log Collection (eNB - Run)') {
|
||||||
|
steps {
|
||||||
|
withCredentials([
|
||||||
|
[$class: 'UsernamePasswordMultiBinding', credentialsId: "${params.eNB_Credentials}", usernameVariable: 'eNB_Username', passwordVariable: 'eNB_Password']
|
||||||
|
]) {
|
||||||
|
echo '\u2705 \u001B[32mLog Collection (eNB - Run)\u001B[0m'
|
||||||
|
sh "python3 ci-scripts/main.py --mode=LogCollecteNB --eNBIPAddress=${params.eNB_IPAddress} --eNBUserName=${eNB_Username} --eNBPassword=${eNB_Password} --eNBSourceCodePath=${params.eNB_SourceCodePath}"
|
||||||
|
|
||||||
|
echo '\u2705 \u001B[32mLog Transfer (eNB - Run)\u001B[0m'
|
||||||
|
sh "sshpass -p \'${eNB_Password}\' scp -o 'StrictHostKeyChecking no' -o 'ConnectTimeout 10' ${eNB_Username}@${params.eNB_IPAddress}:${eNB_SourceCodePath}/cmake_targets/enb.log.zip ./enb.log.${env.BUILD_ID}.zip || true"
|
||||||
|
}
|
||||||
|
script {
|
||||||
|
if(fileExists("enb.log.${env.BUILD_ID}.zip")) {
|
||||||
|
archiveArtifacts "enb.log.${env.BUILD_ID}.zip"
|
||||||
|
}
|
||||||
|
if(fileExists("ci-scripts/test_results.html")) {
|
||||||
|
sh "mv ci-scripts/test_results.html test_results-${JOB_NAME}.html"
|
||||||
|
sh "sed -i -e 's#TEMPLATE_JOB_NAME#${JOB_NAME}#' -e 's@build #TEMPLATE_BUILD_ID@build #${BUILD_ID}@' -e 's#Build-ID: TEMPLATE_BUILD_ID#Build-ID: <a href=\"${BUILD_URL}\">${BUILD_ID}</a>#' -e 's#TEMPLATE_STAGE_NAME#${testStageName}#' test_results-${JOB_NAME}.html"
|
||||||
|
archiveArtifacts "test_results-${JOB_NAME}.html"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
post {
|
||||||
|
always {
|
||||||
|
script {
|
||||||
|
if (params.pipelineZipsConsoleLog != null) {
|
||||||
|
if (params.pipelineZipsConsoleLog) {
|
||||||
|
echo "Archiving Jenkins console log"
|
||||||
|
sh "wget --no-check-certificate --no-proxy ${env.JENKINS_URL}/job/${env.JOB_NAME}/${env.BUILD_ID}/consoleText -O consoleText.log || true"
|
||||||
|
sh "zip -m consoleText.log.${env.BUILD_ID}.zip consoleText.log || true"
|
||||||
|
if(fileExists("consoleText.log.${env.BUILD_ID}.zip")) {
|
||||||
|
archiveArtifacts "consoleText.log.${env.BUILD_ID}.zip"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -241,6 +241,10 @@ pipeline {
|
|||||||
stage ("Terminate") {
|
stage ("Terminate") {
|
||||||
parallel {
|
parallel {
|
||||||
stage('Terminate UE') {
|
stage('Terminate UE') {
|
||||||
|
// Bypassing this stage if there are no abd server defined
|
||||||
|
when {
|
||||||
|
expression { params.ADB_IPAddress != "none" }
|
||||||
|
}
|
||||||
steps {
|
steps {
|
||||||
echo '\u2705 \u001B[32mTerminate UE\u001B[0m'
|
echo '\u2705 \u001B[32mTerminate UE\u001B[0m'
|
||||||
withCredentials([
|
withCredentials([
|
||||||
@@ -275,6 +279,10 @@ pipeline {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
stage('Terminate SPGW') {
|
stage('Terminate SPGW') {
|
||||||
|
// Bypassing this stage if EPC server is not defined
|
||||||
|
when {
|
||||||
|
expression { params.EPC_IPAddress != "none" }
|
||||||
|
}
|
||||||
steps {
|
steps {
|
||||||
echo '\u2705 \u001B[32mTerminate SPGW\u001B[0m'
|
echo '\u2705 \u001B[32mTerminate SPGW\u001B[0m'
|
||||||
withCredentials([
|
withCredentials([
|
||||||
@@ -292,6 +300,10 @@ pipeline {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
stage('Terminate MME') {
|
stage('Terminate MME') {
|
||||||
|
// Bypassing this stage if EPC server is not defined
|
||||||
|
when {
|
||||||
|
expression { params.EPC_IPAddress != "none" }
|
||||||
|
}
|
||||||
steps {
|
steps {
|
||||||
echo '\u2705 \u001B[32mTerminate MME\u001B[0m'
|
echo '\u2705 \u001B[32mTerminate MME\u001B[0m'
|
||||||
withCredentials([
|
withCredentials([
|
||||||
@@ -309,6 +321,10 @@ pipeline {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
stage('Terminate HSS') {
|
stage('Terminate HSS') {
|
||||||
|
// Bypassing this stage if EPC server is not defined
|
||||||
|
when {
|
||||||
|
expression { params.EPC_IPAddress != "none" }
|
||||||
|
}
|
||||||
steps {
|
steps {
|
||||||
echo '\u2705 \u001B[32mTerminate HSS\u001B[0m'
|
echo '\u2705 \u001B[32mTerminate HSS\u001B[0m'
|
||||||
withCredentials([
|
withCredentials([
|
||||||
@@ -371,6 +387,10 @@ pipeline {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
stage('Log Collection (SPGW)') {
|
stage('Log Collection (SPGW)') {
|
||||||
|
// Bypassing this stage if EPC server is not defined
|
||||||
|
when {
|
||||||
|
expression { params.EPC_IPAddress != "none" }
|
||||||
|
}
|
||||||
steps {
|
steps {
|
||||||
withCredentials([
|
withCredentials([
|
||||||
[$class: 'UsernamePasswordMultiBinding', credentialsId: "${params.EPC_Credentials}", usernameVariable: 'EPC_Username', passwordVariable: 'EPC_Password']
|
[$class: 'UsernamePasswordMultiBinding', credentialsId: "${params.EPC_Credentials}", usernameVariable: 'EPC_Username', passwordVariable: 'EPC_Password']
|
||||||
@@ -389,6 +409,10 @@ pipeline {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
stage('Log Collection (MME)') {
|
stage('Log Collection (MME)') {
|
||||||
|
// Bypassing this stage if EPC server is not defined
|
||||||
|
when {
|
||||||
|
expression { params.EPC_IPAddress != "none" }
|
||||||
|
}
|
||||||
steps {
|
steps {
|
||||||
withCredentials([
|
withCredentials([
|
||||||
[$class: 'UsernamePasswordMultiBinding', credentialsId: "${params.EPC_Credentials}", usernameVariable: 'EPC_Username', passwordVariable: 'EPC_Password']
|
[$class: 'UsernamePasswordMultiBinding', credentialsId: "${params.EPC_Credentials}", usernameVariable: 'EPC_Username', passwordVariable: 'EPC_Password']
|
||||||
@@ -407,6 +431,10 @@ pipeline {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
stage('Log Collection (HSS)') {
|
stage('Log Collection (HSS)') {
|
||||||
|
// Bypassing this stage if EPC server is not defined
|
||||||
|
when {
|
||||||
|
expression { params.EPC_IPAddress != "none" }
|
||||||
|
}
|
||||||
steps {
|
steps {
|
||||||
withCredentials([
|
withCredentials([
|
||||||
[$class: 'UsernamePasswordMultiBinding', credentialsId: "${params.EPC_Credentials}", usernameVariable: 'EPC_Username', passwordVariable: 'EPC_Password']
|
[$class: 'UsernamePasswordMultiBinding', credentialsId: "${params.EPC_Credentials}", usernameVariable: 'EPC_Username', passwordVariable: 'EPC_Password']
|
||||||
@@ -425,6 +453,10 @@ pipeline {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
stage('Log Collection (Ping)') {
|
stage('Log Collection (Ping)') {
|
||||||
|
// Bypassing this stage if EPC server is not defined
|
||||||
|
when {
|
||||||
|
expression { params.EPC_IPAddress != "none" }
|
||||||
|
}
|
||||||
steps {
|
steps {
|
||||||
withCredentials([
|
withCredentials([
|
||||||
[$class: 'UsernamePasswordMultiBinding', credentialsId: "${params.EPC_Credentials}", usernameVariable: 'EPC_Username', passwordVariable: 'EPC_Password']
|
[$class: 'UsernamePasswordMultiBinding', credentialsId: "${params.EPC_Credentials}", usernameVariable: 'EPC_Username', passwordVariable: 'EPC_Password']
|
||||||
@@ -443,6 +475,10 @@ pipeline {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
stage('Log Collection (Iperf)') {
|
stage('Log Collection (Iperf)') {
|
||||||
|
// Bypassing this stage if EPC server is not defined
|
||||||
|
when {
|
||||||
|
expression { params.EPC_IPAddress != "none" }
|
||||||
|
}
|
||||||
steps {
|
steps {
|
||||||
withCredentials([
|
withCredentials([
|
||||||
[$class: 'UsernamePasswordMultiBinding', credentialsId: "${params.EPC_Credentials}", usernameVariable: 'EPC_Username', passwordVariable: 'EPC_Password']
|
[$class: 'UsernamePasswordMultiBinding', credentialsId: "${params.EPC_Credentials}", usernameVariable: 'EPC_Username', passwordVariable: 'EPC_Password']
|
||||||
@@ -482,7 +518,7 @@ pipeline {
|
|||||||
// Making sure that we really shutdown every thing before leaving
|
// Making sure that we really shutdown every thing before leaving
|
||||||
failure {
|
failure {
|
||||||
script {
|
script {
|
||||||
if (!termStatusArray[termUE]) {
|
if ((!termStatusArray[termUE]) && (params.ADB_IPAddress != "none")) {
|
||||||
withCredentials([
|
withCredentials([
|
||||||
[$class: 'UsernamePasswordMultiBinding', credentialsId: "${params.ADB_Credentials}", usernameVariable: 'ADB_Username', passwordVariable: 'ADB_Password']
|
[$class: 'UsernamePasswordMultiBinding', credentialsId: "${params.ADB_Credentials}", usernameVariable: 'ADB_Username', passwordVariable: 'ADB_Password']
|
||||||
]) {
|
]) {
|
||||||
@@ -496,21 +532,21 @@ pipeline {
|
|||||||
sh "python3 ci-scripts/main.py --mode=TerminateeNB --eNBIPAddress=${params.eNB_IPAddress} --eNBUserName=${eNB_Username} --eNBPassword=${eNB_Password}"
|
sh "python3 ci-scripts/main.py --mode=TerminateeNB --eNBIPAddress=${params.eNB_IPAddress} --eNBUserName=${eNB_Username} --eNBPassword=${eNB_Password}"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (!termStatusArray[termSPGW]) {
|
if ((!termStatusArray[termSPGW]) && (params.EPC_IPAddress != "none")) {
|
||||||
withCredentials([
|
withCredentials([
|
||||||
[$class: 'UsernamePasswordMultiBinding', credentialsId: "${params.EPC_Credentials}", usernameVariable: 'EPC_Username', passwordVariable: 'EPC_Password']
|
[$class: 'UsernamePasswordMultiBinding', credentialsId: "${params.EPC_Credentials}", usernameVariable: 'EPC_Username', passwordVariable: 'EPC_Password']
|
||||||
]) {
|
]) {
|
||||||
sh "python3 ci-scripts/main.py --mode=TerminateSPGW --EPCIPAddress=${params.EPC_IPAddress} --EPCUserName=${EPC_Username} --EPCPassword=${EPC_Password} --EPCType=${params.EPC_Type} --EPCSourceCodePath=${params.EPC_SourceCodePath}"
|
sh "python3 ci-scripts/main.py --mode=TerminateSPGW --EPCIPAddress=${params.EPC_IPAddress} --EPCUserName=${EPC_Username} --EPCPassword=${EPC_Password} --EPCType=${params.EPC_Type} --EPCSourceCodePath=${params.EPC_SourceCodePath}"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (!termStatusArray[termMME]) {
|
if ((!termStatusArray[termMME]) && (params.EPC_IPAddress != "none")) {
|
||||||
withCredentials([
|
withCredentials([
|
||||||
[$class: 'UsernamePasswordMultiBinding', credentialsId: "${params.EPC_Credentials}", usernameVariable: 'EPC_Username', passwordVariable: 'EPC_Password']
|
[$class: 'UsernamePasswordMultiBinding', credentialsId: "${params.EPC_Credentials}", usernameVariable: 'EPC_Username', passwordVariable: 'EPC_Password']
|
||||||
]) {
|
]) {
|
||||||
sh "python3 ci-scripts/main.py --mode=TerminateMME --EPCIPAddress=${params.EPC_IPAddress} --EPCUserName=${EPC_Username} --EPCPassword=${EPC_Password} --EPCType=${params.EPC_Type} --EPCSourceCodePath=${params.EPC_SourceCodePath}"
|
sh "python3 ci-scripts/main.py --mode=TerminateMME --EPCIPAddress=${params.EPC_IPAddress} --EPCUserName=${EPC_Username} --EPCPassword=${EPC_Password} --EPCType=${params.EPC_Type} --EPCSourceCodePath=${params.EPC_SourceCodePath}"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (!termStatusArray[termHSS]) {
|
if ((!termStatusArray[termHSS]) && (params.EPC_IPAddress != "none")) {
|
||||||
withCredentials([
|
withCredentials([
|
||||||
[$class: 'UsernamePasswordMultiBinding', credentialsId: "${params.EPC_Credentials}", usernameVariable: 'EPC_Username', passwordVariable: 'EPC_Password']
|
[$class: 'UsernamePasswordMultiBinding', credentialsId: "${params.EPC_Credentials}", usernameVariable: 'EPC_Username', passwordVariable: 'EPC_Password']
|
||||||
]) {
|
]) {
|
||||||
|
|||||||
@@ -0,0 +1,73 @@
|
|||||||
|
#!/bin/groovy
|
||||||
|
/*
|
||||||
|
* Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
|
||||||
|
* contributor license agreements. See the NOTICE file distributed with
|
||||||
|
* this work for additional information regarding copyright ownership.
|
||||||
|
* The OpenAirInterface Software Alliance licenses this file to You under
|
||||||
|
* the OAI Public License, Version 1.1 (the "License"); you may not use this file
|
||||||
|
* except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.openairinterface.org/?page_id=698
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*-------------------------------------------------------------------------------
|
||||||
|
* For more information about the OpenAirInterface (OAI) Software Alliance:
|
||||||
|
* contact@openairinterface.org
|
||||||
|
*/
|
||||||
|
|
||||||
|
// Template Jenkins Declarative Pipeline script to run Test w/ RF HW
|
||||||
|
|
||||||
|
// Location of the python executor node shall be in the same subnet as the others servers
|
||||||
|
def pythonExecutor = params.pythonExecutor
|
||||||
|
|
||||||
|
def TARGET_BRANCH = "develop"
|
||||||
|
def ALLOW_MERGE = true
|
||||||
|
|
||||||
|
pipeline {
|
||||||
|
agent {
|
||||||
|
label pythonExecutor
|
||||||
|
}
|
||||||
|
stages {
|
||||||
|
stage ("Launcher") {
|
||||||
|
steps {
|
||||||
|
script {
|
||||||
|
//retrieve MR that are opened nd with tag READY_TO_BE_MERGED
|
||||||
|
MR_LIST= sh returnStdout: true, script: 'curl --silent "https://gitlab.eurecom.fr/api/v4/projects/oai%2Fopenairinterface5g/merge_requests?state=opened&per_page=100&labels=READY_TO_BE_MERGED" | jq ".[].iid" || true '
|
||||||
|
echo "List of selected MR:\n${MR_LIST}"
|
||||||
|
def MR_ARRAY = MR_LIST.split('\n')
|
||||||
|
//for every selected MR, retrieve the branch name and the latest commit
|
||||||
|
for (MR in MR_ARRAY) {
|
||||||
|
SRC_BRANCH=sh returnStdout: true, script: """curl --silent "https://gitlab.eurecom.fr/api/v4/projects/oai%2Fopenairinterface5g/merge_requests/${MR}" | jq ".source_branch" || true """
|
||||||
|
SRC_BRANCH=SRC_BRANCH.trim()
|
||||||
|
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()
|
||||||
|
echo "Testing NSA on : ${MR} ${SRC_BRANCH} ${COMMIT_ID}"
|
||||||
|
//calling NSA sub job
|
||||||
|
build job: "RAN-CI-NSA-B210", wait : false, 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_AllowMergeRequestProcess', value: Boolean.valueOf(ALLOW_MERGE))
|
||||||
|
]
|
||||||
|
//calling Benetel sub job
|
||||||
|
build job: "RAN-CI-BENETEL", wait : false, 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_AllowMergeRequestProcess', value: Boolean.valueOf(ALLOW_MERGE))
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
+18
-1
@@ -62,6 +62,12 @@ function build_on_vm {
|
|||||||
echo "ARCHIVES_LOC = $ARCHIVES_LOC"
|
echo "ARCHIVES_LOC = $ARCHIVES_LOC"
|
||||||
echo "BUILD_OPTIONS = $BUILD_OPTIONS"
|
echo "BUILD_OPTIONS = $BUILD_OPTIONS"
|
||||||
|
|
||||||
|
if [[ "$VM_NAME" == *"-enb-usrp"* ]]
|
||||||
|
then
|
||||||
|
echo "This VM type is no longer supported in the pipeline framework"
|
||||||
|
return
|
||||||
|
fi
|
||||||
|
|
||||||
IS_VM_ALIVE=`uvt-kvm list | grep -c $VM_NAME`
|
IS_VM_ALIVE=`uvt-kvm list | grep -c $VM_NAME`
|
||||||
|
|
||||||
if [ $IS_VM_ALIVE -eq 0 ]
|
if [ $IS_VM_ALIVE -eq 0 ]
|
||||||
@@ -158,6 +164,9 @@ function build_on_vm {
|
|||||||
echo "cd tmp" >> $VM_CMDS
|
echo "cd tmp" >> $VM_CMDS
|
||||||
echo "echo \"unzip -qq -DD ../localZip.zip\"" >> $VM_CMDS
|
echo "echo \"unzip -qq -DD ../localZip.zip\"" >> $VM_CMDS
|
||||||
echo "unzip -qq -DD ../localZip.zip" >> $VM_CMDS
|
echo "unzip -qq -DD ../localZip.zip" >> $VM_CMDS
|
||||||
|
# Trying to make some room on filesystem before building
|
||||||
|
echo "rm ../localZip.zip" >> $VM_CMDS
|
||||||
|
echo "export CI_ENV=True" >> $VM_CMDS
|
||||||
if [[ "$VM_NAME" == *"-cppcheck"* ]]
|
if [[ "$VM_NAME" == *"-cppcheck"* ]]
|
||||||
then
|
then
|
||||||
echo "mkdir cmake_targets/log" >> $VM_CMDS
|
echo "mkdir cmake_targets/log" >> $VM_CMDS
|
||||||
@@ -208,7 +217,15 @@ function build_on_vm {
|
|||||||
echo "echo \"./build_oai -I $BUILD_OPTIONS \"" >> $VM_CMDS
|
echo "echo \"./build_oai -I $BUILD_OPTIONS \"" >> $VM_CMDS
|
||||||
echo "./build_oai -I $BUILD_OPTIONS > log/install-build.txt 2>&1" >> $VM_CMDS
|
echo "./build_oai -I $BUILD_OPTIONS > log/install-build.txt 2>&1" >> $VM_CMDS
|
||||||
else
|
else
|
||||||
echo "echo \"./build_oai -I $BUILD_OPTIONS\" > ./my-vm-build.sh" >> $VM_CMDS
|
if [[ "$VM_NAME" == *"-enb-ethernet"* ]]
|
||||||
|
then
|
||||||
|
echo "echo \"sleep 170 && ./build_oai -I $BUILD_OPTIONS\" > ./my-vm-build.sh" >> $VM_CMDS
|
||||||
|
elif [[ "$VM_NAME" == *"-ue-ethernet"* ]]
|
||||||
|
then
|
||||||
|
echo "echo \"sleep 60 && ./build_oai -I $BUILD_OPTIONS\" > ./my-vm-build.sh" >> $VM_CMDS
|
||||||
|
else
|
||||||
|
echo "echo \"./build_oai -I $BUILD_OPTIONS\" > ./my-vm-build.sh" >> $VM_CMDS
|
||||||
|
fi
|
||||||
echo "chmod 775 ./my-vm-build.sh " >> $VM_CMDS
|
echo "chmod 775 ./my-vm-build.sh " >> $VM_CMDS
|
||||||
echo "echo \"sudo -E daemon --inherit --unsafe --name=build_daemon --chdir=/home/ubuntu/tmp/cmake_targets -o /home/ubuntu/tmp/cmake_targets/log/install-build.txt ./my-vm-build.sh\"" >> $VM_CMDS
|
echo "echo \"sudo -E daemon --inherit --unsafe --name=build_daemon --chdir=/home/ubuntu/tmp/cmake_targets -o /home/ubuntu/tmp/cmake_targets/log/install-build.txt ./my-vm-build.sh\"" >> $VM_CMDS
|
||||||
echo "sudo -E daemon --inherit --unsafe --name=build_daemon --chdir=/home/ubuntu/tmp/cmake_targets -o /home/ubuntu/tmp/cmake_targets/log/install-build.txt ./my-vm-build.sh" >> $VM_CMDS
|
echo "sudo -E daemon --inherit --unsafe --name=build_daemon --chdir=/home/ubuntu/tmp/cmake_targets -o /home/ubuntu/tmp/cmake_targets/log/install-build.txt ./my-vm-build.sh" >> $VM_CMDS
|
||||||
|
|||||||
@@ -35,6 +35,7 @@ import sys # arg
|
|||||||
import re # reg
|
import re # reg
|
||||||
import logging
|
import logging
|
||||||
import os
|
import os
|
||||||
|
import shutil
|
||||||
import time
|
import time
|
||||||
from multiprocessing import Process, Lock, SimpleQueue
|
from multiprocessing import Process, Lock, SimpleQueue
|
||||||
from zipfile import ZipFile
|
from zipfile import ZipFile
|
||||||
@@ -124,7 +125,7 @@ class Containerize():
|
|||||||
self.cli = 'docker'
|
self.cli = 'docker'
|
||||||
self.dockerfileprefix = '.ubuntu18'
|
self.dockerfileprefix = '.ubuntu18'
|
||||||
elif self.host == 'Red Hat':
|
elif self.host == 'Red Hat':
|
||||||
self.cli = 'podman'
|
self.cli = 'sudo podman'
|
||||||
self.dockerfileprefix = '.rhel8.2'
|
self.dockerfileprefix = '.rhel8.2'
|
||||||
|
|
||||||
imageNames = []
|
imageNames = []
|
||||||
@@ -173,6 +174,7 @@ class Containerize():
|
|||||||
# if the branch is not develop, then it is a merge request and we need to do
|
# if the branch is not develop, then it is a merge request and we need to do
|
||||||
# the potential merge. Note that merge conflicts should already been checked earlier
|
# the potential merge. Note that merge conflicts should already been checked earlier
|
||||||
imageTag = 'develop'
|
imageTag = 'develop'
|
||||||
|
sharedTag = 'develop'
|
||||||
if (self.ranAllowMerge):
|
if (self.ranAllowMerge):
|
||||||
imageTag = 'ci-temp'
|
imageTag = 'ci-temp'
|
||||||
if self.ranTargetBranch == '':
|
if self.ranTargetBranch == '':
|
||||||
@@ -188,38 +190,23 @@ class Containerize():
|
|||||||
mySSH.command('mkdir -p tmp/entitlement/', '\$', 5)
|
mySSH.command('mkdir -p tmp/entitlement/', '\$', 5)
|
||||||
mySSH.command('sudo cp /etc/rhsm/ca/redhat-uep.pem tmp/ca/', '\$', 5)
|
mySSH.command('sudo cp /etc/rhsm/ca/redhat-uep.pem tmp/ca/', '\$', 5)
|
||||||
mySSH.command('sudo cp /etc/pki/entitlement/*.pem tmp/entitlement/', '\$', 5)
|
mySSH.command('sudo cp /etc/pki/entitlement/*.pem tmp/entitlement/', '\$', 5)
|
||||||
|
|
||||||
#mySSH.close()
|
|
||||||
#return 0
|
|
||||||
sharedimage = 'ran-build'
|
sharedimage = 'ran-build'
|
||||||
# Let's remove any previous run artifacts if still there
|
# Let's remove any previous run artifacts if still there
|
||||||
mySSH.command(self.cli + ' image prune --force', '\$', 5)
|
mySSH.command(self.cli + ' image prune --force', '\$', 30)
|
||||||
mySSH.command(self.cli + ' image rm ' + sharedimage + ':' + imageTag, '\$', 5)
|
if (not self.ranAllowMerge):
|
||||||
|
mySSH.command(self.cli + ' image rm ' + sharedimage + ':' + sharedTag, '\$', 30)
|
||||||
for image,pattern in imageNames:
|
for image,pattern in imageNames:
|
||||||
mySSH.command(self.cli + ' image rm ' + image + ':' + imageTag, '\$', 5)
|
mySSH.command(self.cli + ' image rm ' + image + ':' + imageTag, '\$', 30)
|
||||||
# Build the shared image
|
|
||||||
mySSH.command(self.cli + ' build --target ' + sharedimage + ' --tag ' + sharedimage + ':' + imageTag + ' --file docker/Dockerfile.ran' + self.dockerfileprefix + ' --build-arg NEEDED_GIT_PROXY="http://proxy.eurecom.fr:8080" . > cmake_targets/log/ran-build.log 2>&1', '\$', 1600)
|
|
||||||
# Build the target image(s)
|
|
||||||
previousImage = sharedimage + ':' + imageTag
|
|
||||||
danglingShaOnes=[]
|
|
||||||
for image,pattern in imageNames:
|
|
||||||
# the archived Dockerfiles have "ran-build:latest" as base image
|
|
||||||
# we need to update them with proper tag
|
|
||||||
mySSH.command('sed -i -e "s#' + sharedimage + ':latest#' + sharedimage + ':' + imageTag + '#" docker/Dockerfile.' + pattern + self.dockerfileprefix, '\$', 5)
|
|
||||||
mySSH.command(self.cli + ' build --target ' + image + ' --tag ' + image + ':' + imageTag + ' --file docker/Dockerfile.' + pattern + self.dockerfileprefix + ' . > cmake_targets/log/' + image + '.log 2>&1', '\$', 1200)
|
|
||||||
# Retrieving the dangling image(s) for the log collection
|
|
||||||
mySSH.command(self.cli + ' images --filter "dangling=true" --filter "since=' + previousImage + '" -q | sed -e "s#^#sha=#"', '\$', 5)
|
|
||||||
result = re.search('sha=(?P<imageShaOne>[a-zA-Z0-9\-\_]+)', mySSH.getBefore())
|
|
||||||
if result is not None:
|
|
||||||
danglingShaOnes.append((image, result.group('imageShaOne')))
|
|
||||||
previousImage = image + ':' + imageTag
|
|
||||||
|
|
||||||
imageTag = 'ci-temp'
|
# Build the shared image only on Push Events (not on Merge Requests)
|
||||||
# First verify if images were properly created.
|
if (not self.ranAllowMerge):
|
||||||
|
mySSH.command(self.cli + ' build --target ' + sharedimage + ' --tag ' + sharedimage + ':' + sharedTag + ' --file docker/Dockerfile.ran' + self.dockerfileprefix + ' --build-arg NEEDED_GIT_PROXY="http://proxy.eurecom.fr:8080" . > cmake_targets/log/ran-build.log 2>&1', '\$', 1600)
|
||||||
|
# First verify if the shared image was properly created.
|
||||||
status = True
|
status = True
|
||||||
mySSH.command(self.cli + ' image inspect --format=\'Size = {{.Size}} bytes\' ' + sharedimage + ':' + imageTag, '\$', 5)
|
mySSH.command(self.cli + ' image inspect --format=\'Size = {{.Size}} bytes\' ' + sharedimage + ':' + sharedTag, '\$', 5)
|
||||||
if mySSH.getBefore().count('No such object') != 0:
|
if mySSH.getBefore().count('o such image') != 0:
|
||||||
logging.error('Could not build properly ran-build')
|
logging.error('\u001B[1m Could not build properly ran-build\u001B[0m')
|
||||||
status = False
|
status = False
|
||||||
else:
|
else:
|
||||||
result = re.search('Size *= *(?P<size>[0-9\-]+) *bytes', mySSH.getBefore())
|
result = re.search('Size *= *(?P<size>[0-9\-]+) *bytes', mySSH.getBefore())
|
||||||
@@ -240,11 +227,40 @@ class Containerize():
|
|||||||
self.allImagesSize['ran-build'] = str(round(imageSize,1)) + ' Gbytes'
|
self.allImagesSize['ran-build'] = str(round(imageSize,1)) + ' Gbytes'
|
||||||
else:
|
else:
|
||||||
logging.debug('ran-build size is unknown')
|
logging.debug('ran-build size is unknown')
|
||||||
|
# If the shared image failed, no need to continue
|
||||||
|
if not status:
|
||||||
|
# Recover the name of the failed container?
|
||||||
|
mySSH.command(self.cli + ' ps --quiet --filter "status=exited" -n1 | xargs ' + self.cli + ' rm -f', '\$', 5)
|
||||||
|
mySSH.command(self.cli + ' image prune --force', '\$', 30)
|
||||||
|
mySSH.close()
|
||||||
|
logging.error('\u001B[1m Building OAI Images Failed\u001B[0m')
|
||||||
|
HTML.CreateHtmlTestRow(self.imageKind, 'KO', CONST.ALL_PROCESSES_OK)
|
||||||
|
HTML.CreateHtmlTabFooter(False)
|
||||||
|
sys.exit(1)
|
||||||
|
else:
|
||||||
|
# Recover build logs, for the moment only possible when build is successful
|
||||||
|
mySSH.command(self.cli + ' create --name test ' + sharedimage + ':' + sharedTag, '\$', 5)
|
||||||
|
mySSH.command('mkdir -p cmake_targets/log/ran-build', '\$', 5)
|
||||||
|
mySSH.command(self.cli + ' cp test:/oai-ran/cmake_targets/log/. cmake_targets/log/ran-build', '\$', 5)
|
||||||
|
mySSH.command(self.cli + ' rm -f test', '\$', 5)
|
||||||
|
|
||||||
|
# Build the target image(s)
|
||||||
for image,pattern in imageNames:
|
for image,pattern in imageNames:
|
||||||
|
# the archived Dockerfiles have "ran-build:latest" as base image
|
||||||
|
# we need to update them with proper tag
|
||||||
|
mySSH.command('sed -i -e "s#' + sharedimage + ':latest#' + sharedimage + ':' + sharedTag + '#" docker/Dockerfile.' + pattern + self.dockerfileprefix, '\$', 5)
|
||||||
|
mySSH.command(self.cli + ' build --target ' + image + ' --tag ' + image + ':' + imageTag + ' --file docker/Dockerfile.' + pattern + self.dockerfileprefix + ' . > cmake_targets/log/' + image + '.log 2>&1', '\$', 1200)
|
||||||
|
# split the log
|
||||||
|
mySSH.command('mkdir -p cmake_targets/log/' + image, '\$', 5)
|
||||||
|
mySSH.command('python3 ci-scripts/docker_log_split.py --logfilename=cmake_targets/log/' + image + '.log', '\$', 5)
|
||||||
|
# checking the status of the build
|
||||||
mySSH.command(self.cli + ' image inspect --format=\'Size = {{.Size}} bytes\' ' + image + ':' + imageTag, '\$', 5)
|
mySSH.command(self.cli + ' image inspect --format=\'Size = {{.Size}} bytes\' ' + image + ':' + imageTag, '\$', 5)
|
||||||
if mySSH.getBefore().count('No such object') != 0:
|
if mySSH.getBefore().count('o such image') != 0:
|
||||||
logging.error('Could not build properly ' + image)
|
logging.error('\u001B[1m Could not build properly ' + image + '\u001B[0m')
|
||||||
status = False
|
status = False
|
||||||
|
# Here we should check if the last container corresponds to a failed command and destroy it
|
||||||
|
mySSH.command(self.cli + ' ps --quiet --filter "status=exited" -n1 | xargs ' + self.cli + ' rm -f', '\$', 5)
|
||||||
|
self.allImagesSize[image] = 'N/A -- Build Failed'
|
||||||
else:
|
else:
|
||||||
result = re.search('Size *= *(?P<size>[0-9\-]+) *bytes', mySSH.getBefore())
|
result = re.search('Size *= *(?P<size>[0-9\-]+) *bytes', mySSH.getBefore())
|
||||||
if result is not None:
|
if result is not None:
|
||||||
@@ -264,39 +280,27 @@ class Containerize():
|
|||||||
self.allImagesSize[image] = str(round(imageSize,1)) + ' Gbytes'
|
self.allImagesSize[image] = str(round(imageSize,1)) + ' Gbytes'
|
||||||
else:
|
else:
|
||||||
logging.debug('ran-build size is unknown')
|
logging.debug('ran-build size is unknown')
|
||||||
if not status:
|
self.allImagesSize[image] = 'unknown'
|
||||||
mySSH.close()
|
# Now pruning dangling images in between target builds
|
||||||
logging.error('\u001B[1m Building OAI Images Failed\u001B[0m')
|
mySSH.command(self.cli + ' image prune --force', '\$', 30)
|
||||||
HTML.CreateHtmlTestRow(self.imageKind, 'KO', CONST.ALL_PROCESSES_OK)
|
|
||||||
#HTML.CreateHtmlNextTabHeaderTestRow(self.collectInfo, self.allImagesSize)
|
|
||||||
HTML.CreateHtmlTabFooter(False)
|
|
||||||
sys.exit(1)
|
|
||||||
|
|
||||||
# Recover build logs, for the moment only possible when build is successful
|
# Analyzing the logs
|
||||||
mySSH.command(self.cli + ' create --name test ' + sharedimage + ':' + imageTag, '\$', 5)
|
mySSH.command('cd ' + lSourcePath + '/cmake_targets', '\$', 5)
|
||||||
mySSH.command('mkdir -p cmake_targets/log/ran-build', '\$', 5)
|
|
||||||
mySSH.command(self.cli + ' cp test:/oai-ran/cmake_targets/log/. cmake_targets/log/ran-build', '\$', 5)
|
|
||||||
mySSH.command(self.cli + ' rm -f test', '\$', 5)
|
|
||||||
for image,shaone in danglingShaOnes:
|
|
||||||
mySSH.command('mkdir -p cmake_targets/log/' + image, '\$', 5)
|
|
||||||
mySSH.command(self.cli + ' create --name test ' + shaone, '\$', 5)
|
|
||||||
mySSH.command(self.cli + ' cp test:/oai-ran/cmake_targets/log/. cmake_targets/log/' + image, '\$', 5)
|
|
||||||
mySSH.command(self.cli + ' rm -f test', '\$', 5)
|
|
||||||
mySSH.command(self.cli + ' image prune --force', '\$', 5)
|
|
||||||
mySSH.command('cd cmake_targets', '\$', 5)
|
|
||||||
mySSH.command('mkdir -p build_log_' + self.testCase_id, '\$', 5)
|
mySSH.command('mkdir -p build_log_' + self.testCase_id, '\$', 5)
|
||||||
mySSH.command('mv log/* ' + 'build_log_' + self.testCase_id, '\$', 5)
|
mySSH.command('mv log/* ' + 'build_log_' + self.testCase_id, '\$', 5)
|
||||||
#mySSH.close()
|
|
||||||
|
mySSH.command('cd ' + lSourcePath + '/cmake_targets', '\$', 5)
|
||||||
mySSH.command('cd /tmp/CI-eNB/cmake_targets', '\$', 5)
|
mySSH.command('rm -f build_log_' + self.testCase_id + '.zip || true', '\$', 5)
|
||||||
if (os.path.isfile('./build_log_' + self.testCase_id + '.zip')):
|
if (os.path.isfile('./build_log_' + self.testCase_id + '.zip')):
|
||||||
os.remove('./build_log_' + self.testCase_id + '.zip')
|
os.remove('./build_log_' + self.testCase_id + '.zip')
|
||||||
|
if (os.path.isdir('./build_log_' + self.testCase_id)):
|
||||||
|
shutil.rmtree('./build_log_' + self.testCase_id)
|
||||||
mySSH.command('zip -r -qq build_log_' + self.testCase_id + '.zip build_log_' + self.testCase_id, '\$', 5)
|
mySSH.command('zip -r -qq build_log_' + self.testCase_id + '.zip build_log_' + self.testCase_id, '\$', 5)
|
||||||
mySSH.copyin(lIpAddr, lUserName, lPassWord, lSourcePath + '/cmake_targets/build_log_' + self.testCase_id + '.zip', '.')
|
mySSH.copyin(lIpAddr, lUserName, lPassWord, lSourcePath + '/cmake_targets/build_log_' + self.testCase_id + '.zip', '.')
|
||||||
#mySSH.command('rm -f build_log_' + self.testCase_id + '.zip','\$', 5)
|
mySSH.command('rm -f build_log_' + self.testCase_id + '.zip','\$', 5)
|
||||||
mySSH.close()
|
mySSH.close()
|
||||||
ZipFile('build_log_' + self.testCase_id + '.zip').extractall('.')
|
ZipFile('build_log_' + self.testCase_id + '.zip').extractall('.')
|
||||||
|
|
||||||
#Trying to identify the errors and warnings for each built images
|
#Trying to identify the errors and warnings for each built images
|
||||||
imageNames1 = imageNames
|
imageNames1 = imageNames
|
||||||
shared = ('ran-build','ran')
|
shared = ('ran-build','ran')
|
||||||
@@ -328,9 +332,16 @@ class Containerize():
|
|||||||
files[fil] = errorandwarnings
|
files[fil] = errorandwarnings
|
||||||
self.collectInfo[image] = files
|
self.collectInfo[image] = files
|
||||||
|
|
||||||
logging.info('\u001B[1m Building OAI Image(s) Pass\u001B[0m')
|
if status:
|
||||||
HTML.CreateHtmlTestRow(self.imageKind, 'OK', CONST.ALL_PROCESSES_OK)
|
logging.info('\u001B[1m Building OAI Image(s) Pass\u001B[0m')
|
||||||
HTML.CreateHtmlNextTabHeaderTestRow(self.collectInfo, self.allImagesSize)
|
HTML.CreateHtmlTestRow(self.imageKind, 'OK', CONST.ALL_PROCESSES_OK)
|
||||||
|
HTML.CreateHtmlNextTabHeaderTestRow(self.collectInfo, self.allImagesSize)
|
||||||
|
else:
|
||||||
|
logging.error('\u001B[1m Building OAI Images Failed\u001B[0m')
|
||||||
|
HTML.CreateHtmlTestRow(self.imageKind, 'KO', CONST.ALL_PROCESSES_OK)
|
||||||
|
HTML.CreateHtmlNextTabHeaderTestRow(self.collectInfo, self.allImagesSize)
|
||||||
|
HTML.CreateHtmlTabFooter(False)
|
||||||
|
sys.exit(1)
|
||||||
|
|
||||||
def DeployObject(self, HTML, EPC):
|
def DeployObject(self, HTML, EPC):
|
||||||
if self.eNB_serverId[self.eNB_instance] == '0':
|
if self.eNB_serverId[self.eNB_instance] == '0':
|
||||||
|
|||||||
@@ -0,0 +1,285 @@
|
|||||||
|
Active_eNBs = ( "eNB-Eurecom-LTEBox");
|
||||||
|
# Asn1_verbosity, choice in: none, info, annoying
|
||||||
|
Asn1_verbosity = "none";
|
||||||
|
|
||||||
|
eNBs =
|
||||||
|
(
|
||||||
|
{
|
||||||
|
# real_time choice in {hard, rt-preempt, no}
|
||||||
|
real_time = "no";
|
||||||
|
|
||||||
|
////////// Identification parameters:
|
||||||
|
eNB_ID = 0xe00;
|
||||||
|
|
||||||
|
cell_type = "CELL_MACRO_ENB";
|
||||||
|
|
||||||
|
eNB_name = "eNB-Eurecom-LTEBox";
|
||||||
|
|
||||||
|
// Tracking area code, 0x0000 and 0xfffe are reserved values
|
||||||
|
tracking_area_code = 1;
|
||||||
|
plmn_list = ( { mcc = 222; mnc = 01; mnc_length = 2; } );
|
||||||
|
|
||||||
|
tr_s_preference = "local_mac"
|
||||||
|
|
||||||
|
////////// Physical parameters:
|
||||||
|
|
||||||
|
component_carriers = (
|
||||||
|
{
|
||||||
|
node_function = "NGFI_RCC_IF4p5";
|
||||||
|
node_timing = "synch_to_ext_device";
|
||||||
|
node_synch_ref = 0;
|
||||||
|
frame_type = "FDD";
|
||||||
|
tdd_config = 3;
|
||||||
|
tdd_config_s = 0;
|
||||||
|
prefix_type = "NORMAL";
|
||||||
|
eutra_band = 7;
|
||||||
|
downlink_frequency = 2655000000L;
|
||||||
|
uplink_frequency_offset = -120000000;
|
||||||
|
Nid_cell = 0;
|
||||||
|
N_RB_DL = 100;
|
||||||
|
Nid_cell_mbsfn = 0;
|
||||||
|
nb_antenna_ports = 1;
|
||||||
|
nb_antennas_tx = 1;
|
||||||
|
nb_antennas_rx = 1;
|
||||||
|
tx_gain = 90;
|
||||||
|
rx_gain = 125;
|
||||||
|
pbch_repetition = "FALSE";
|
||||||
|
prach_root = 0;
|
||||||
|
prach_config_index = 0;
|
||||||
|
prach_high_speed = "DISABLE";
|
||||||
|
prach_zero_correlation = 1;
|
||||||
|
prach_freq_offset = 90;
|
||||||
|
pucch_delta_shift = 1;
|
||||||
|
pucch_nRB_CQI = 0;
|
||||||
|
pucch_nCS_AN = 0;
|
||||||
|
pucch_n1_AN = 0;
|
||||||
|
pdsch_referenceSignalPower = -10;
|
||||||
|
pdsch_p_b = 0;
|
||||||
|
pusch_n_SB = 1;
|
||||||
|
pusch_enable64QAM = "DISABLE";
|
||||||
|
pusch_hoppingMode = "interSubFrame";
|
||||||
|
pusch_hoppingOffset = 0;
|
||||||
|
pusch_groupHoppingEnabled = "ENABLE";
|
||||||
|
pusch_groupAssignment = 0;
|
||||||
|
pusch_sequenceHoppingEnabled = "DISABLE";
|
||||||
|
pusch_nDMRS1 = 1;
|
||||||
|
phich_duration = "NORMAL";
|
||||||
|
phich_resource = "ONESIXTH";
|
||||||
|
srs_enable = "DISABLE";
|
||||||
|
/* srs_BandwidthConfig =;
|
||||||
|
srs_SubframeConfig =;
|
||||||
|
srs_ackNackST =;
|
||||||
|
srs_MaxUpPts =;*/
|
||||||
|
|
||||||
|
pusch_p0_Nominal = -96;
|
||||||
|
pusch_alpha = "AL1";
|
||||||
|
pucch_p0_Nominal = -104;
|
||||||
|
msg3_delta_Preamble = 6;
|
||||||
|
pucch_deltaF_Format1 = "deltaF2";
|
||||||
|
pucch_deltaF_Format1b = "deltaF3";
|
||||||
|
pucch_deltaF_Format2 = "deltaF0";
|
||||||
|
pucch_deltaF_Format2a = "deltaF0";
|
||||||
|
pucch_deltaF_Format2b = "deltaF0";
|
||||||
|
|
||||||
|
rach_numberOfRA_Preambles = 64;
|
||||||
|
rach_preamblesGroupAConfig = "DISABLE";
|
||||||
|
/*
|
||||||
|
rach_sizeOfRA_PreamblesGroupA = ;
|
||||||
|
rach_messageSizeGroupA = ;
|
||||||
|
rach_messagePowerOffsetGroupB = ;
|
||||||
|
*/
|
||||||
|
rach_powerRampingStep = 4;
|
||||||
|
rach_preambleInitialReceivedTargetPower = -108;
|
||||||
|
rach_preambleTransMax = 10;
|
||||||
|
rach_raResponseWindowSize = 10;
|
||||||
|
rach_macContentionResolutionTimer = 48;
|
||||||
|
rach_maxHARQ_Msg3Tx = 4;
|
||||||
|
|
||||||
|
pcch_default_PagingCycle = 128;
|
||||||
|
pcch_nB = "oneT";
|
||||||
|
bcch_modificationPeriodCoeff = 2;
|
||||||
|
ue_TimersAndConstants_t300 = 1000;
|
||||||
|
ue_TimersAndConstants_t301 = 1000;
|
||||||
|
ue_TimersAndConstants_t310 = 1000;
|
||||||
|
ue_TimersAndConstants_t311 = 10000;
|
||||||
|
ue_TimersAndConstants_n310 = 20;
|
||||||
|
ue_TimersAndConstants_n311 = 1;
|
||||||
|
ue_TransmissionMode = 1;
|
||||||
|
|
||||||
|
//Parameters for SIB18
|
||||||
|
rxPool_sc_CP_Len = "normal";
|
||||||
|
rxPool_sc_Period = "sf40";
|
||||||
|
rxPool_data_CP_Len = "normal";
|
||||||
|
rxPool_ResourceConfig_prb_Num = 20;
|
||||||
|
rxPool_ResourceConfig_prb_Start = 5;
|
||||||
|
rxPool_ResourceConfig_prb_End = 44;
|
||||||
|
rxPool_ResourceConfig_offsetIndicator_present = "prSmall";
|
||||||
|
rxPool_ResourceConfig_offsetIndicator_choice = 0;
|
||||||
|
rxPool_ResourceConfig_subframeBitmap_present = "prBs40";
|
||||||
|
rxPool_ResourceConfig_subframeBitmap_choice_bs_buf = "00000000000000000000";
|
||||||
|
rxPool_ResourceConfig_subframeBitmap_choice_bs_size = 5;
|
||||||
|
rxPool_ResourceConfig_subframeBitmap_choice_bs_bits_unused = 0;
|
||||||
|
/* rxPool_dataHoppingConfig_hoppingParameter = 0;
|
||||||
|
rxPool_dataHoppingConfig_numSubbands = "ns1";
|
||||||
|
rxPool_dataHoppingConfig_rbOffset = 0;
|
||||||
|
rxPool_commTxResourceUC-ReqAllowed = "TRUE";
|
||||||
|
*/
|
||||||
|
// Parameters for SIB19
|
||||||
|
discRxPool_cp_Len = "normal"
|
||||||
|
discRxPool_discPeriod = "rf32"
|
||||||
|
discRxPool_numRetx = 1;
|
||||||
|
discRxPool_numRepetition = 2;
|
||||||
|
discRxPool_ResourceConfig_prb_Num = 5;
|
||||||
|
discRxPool_ResourceConfig_prb_Start = 3;
|
||||||
|
discRxPool_ResourceConfig_prb_End = 21;
|
||||||
|
discRxPool_ResourceConfig_offsetIndicator_present = "prSmall";
|
||||||
|
discRxPool_ResourceConfig_offsetIndicator_choice = 0;
|
||||||
|
discRxPool_ResourceConfig_subframeBitmap_present = "prBs40";
|
||||||
|
discRxPool_ResourceConfig_subframeBitmap_choice_bs_buf = "f0ffffffff";
|
||||||
|
discRxPool_ResourceConfig_subframeBitmap_choice_bs_size = 5;
|
||||||
|
discRxPool_ResourceConfig_subframeBitmap_choice_bs_bits_unused = 0;
|
||||||
|
|
||||||
|
//SSB central frequency of NR secondary cell group (for ENDC NSA)
|
||||||
|
nr_scg_ssb_freq = 640000;
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
|
||||||
|
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 = "yes";
|
||||||
|
|
||||||
|
///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 = "eth0";
|
||||||
|
ENB_IPV4_ADDRESS_FOR_S1_MME = "CI_ENB_IP_ADDR";
|
||||||
|
ENB_INTERFACE_NAME_FOR_S1U = "eth0";
|
||||||
|
ENB_IPV4_ADDRESS_FOR_S1U = "CI_ENB_IP_ADDR";
|
||||||
|
ENB_PORT_FOR_S1U = 2152; # Spec 2152
|
||||||
|
ENB_IPV4_ADDRESS_FOR_X2C = "127.0.0.1";
|
||||||
|
ENB_PORT_FOR_X2C = 36422; # Spec 36422
|
||||||
|
};
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
MACRLCs = (
|
||||||
|
{
|
||||||
|
num_cc = 1;
|
||||||
|
tr_s_preference = "local_L1";
|
||||||
|
tr_n_preference = "local_RRC";
|
||||||
|
phy_test_mode = 0;
|
||||||
|
puSch10xSnr = 160;
|
||||||
|
puCch10xSnr = 160;
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
L1s = (
|
||||||
|
{
|
||||||
|
num_cc = 1;
|
||||||
|
tr_n_preference = "local_mac";
|
||||||
|
prach_dtx_threshold = 150;
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
RUs = (
|
||||||
|
{
|
||||||
|
//local_if_name = "enp129s0f0";
|
||||||
|
local_if_name = "dpdk";
|
||||||
|
sdr_addrs = "softmodem -m 2048 -l 35 -n 2 -b 0000:81:00.3 --proc-type auto --file-prefix ggg -- -p 0x1";
|
||||||
|
#sdr_addrs = "softmodem -l 8 -n 2 -- -p 0x2";
|
||||||
|
#remote_address = "127.0.0.2";
|
||||||
|
#local_address = "127.0.0.1";
|
||||||
|
#local_portc = 50000;
|
||||||
|
#remote_portc = 50000;
|
||||||
|
#local_portd = 50001;
|
||||||
|
#remote_portd = 50001;
|
||||||
|
local_rf = "no"
|
||||||
|
tr_preference = "raw_if4p5"
|
||||||
|
nb_tx = 1
|
||||||
|
nb_rx = 1
|
||||||
|
att_tx = 0
|
||||||
|
att_rx = 0;
|
||||||
|
eNB_instances = [0];
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
THREAD_STRUCT = (
|
||||||
|
{
|
||||||
|
#three config for level of parallelism "PARALLEL_SINGLE_THREAD", "PARALLEL_RU_L1_SPLIT", or "PARALLEL_RU_L1_TRX_SPLIT"
|
||||||
|
#parallel_config = "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";
|
||||||
|
};
|
||||||
@@ -0,0 +1,303 @@
|
|||||||
|
Active_gNBs = ( "gNB-Eurecom-5GNRBox");
|
||||||
|
# Asn1_verbosity, choice in: none, info, annoying
|
||||||
|
Asn1_verbosity = "none";
|
||||||
|
|
||||||
|
gNBs =
|
||||||
|
(
|
||||||
|
{
|
||||||
|
////////// Identification parameters:
|
||||||
|
gNB_ID = 0xe00;
|
||||||
|
|
||||||
|
cell_type = "CELL_MACRO_GNB";
|
||||||
|
|
||||||
|
gNB_name = "gNB-Eurecom-5GNRBox";
|
||||||
|
|
||||||
|
// Tracking area code, 0x0000 and 0xfffe are reserved values
|
||||||
|
tracking_area_code = 1;
|
||||||
|
|
||||||
|
plmn_list = ({mcc = 222; mnc = 01; mnc_length = 2;});
|
||||||
|
|
||||||
|
tr_s_preference = "local_mac"
|
||||||
|
|
||||||
|
////////// Physical parameters:
|
||||||
|
|
||||||
|
ssb_SubcarrierOffset = 31; //0;
|
||||||
|
pdsch_AntennaPorts = 1;
|
||||||
|
pusch_AntennaPorts = 1;
|
||||||
|
#pusch_TargetSNRx10 = 200;
|
||||||
|
#pucch_TargetSNRx10 = 200;
|
||||||
|
pusch_TargetSNRx10 = 200;
|
||||||
|
pucch_TargetSNRx10 = 200;
|
||||||
|
|
||||||
|
servingCellConfigCommon = (
|
||||||
|
{
|
||||||
|
#spCellConfigCommon
|
||||||
|
|
||||||
|
physCellId = 0;
|
||||||
|
|
||||||
|
# downlinkConfigCommon
|
||||||
|
#frequencyInfoDL
|
||||||
|
# this is is the central frequency of SSB
|
||||||
|
absoluteFrequencySSB = 640000; //641272
|
||||||
|
dl_frequencyBand = 78;
|
||||||
|
# the carrier frequency is assumed to be in the middle of the carrier, i.e. dl_absoluteFrequencyPointA_kHz + dl_carrierBandwidth*12*SCS_kHz/2
|
||||||
|
dl_absoluteFrequencyPointA = 638728; //640000;
|
||||||
|
#scs-SpecificCarrierList
|
||||||
|
dl_offstToCarrier = 0;
|
||||||
|
# subcarrierSpacing
|
||||||
|
# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
|
||||||
|
dl_subcarrierSpacing = 1;
|
||||||
|
dl_carrierBandwidth = 106;
|
||||||
|
#initialDownlinkBWP
|
||||||
|
#genericParameters
|
||||||
|
# this is RBstart=84,L=13 (275*(L-1))+RBstart
|
||||||
|
initialDLBWPlocationAndBandwidth = 6368;
|
||||||
|
# subcarrierSpacing
|
||||||
|
# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
|
||||||
|
initialDLBWPsubcarrierSpacing = 1;
|
||||||
|
#pdcch-ConfigCommon
|
||||||
|
initialDLBWPcontrolResourceSetZero = 0;
|
||||||
|
initialDLBWPsearchSpaceZero = 0;
|
||||||
|
#pdsch-ConfigCommon
|
||||||
|
#pdschTimeDomainAllocationList (up to 16 entries)
|
||||||
|
initialDLBWPk0_0 = 0; #for DL slot
|
||||||
|
initialDLBWPmappingType_0 = 0; #0=typeA,1=typeB
|
||||||
|
initialDLBWPstartSymbolAndLength_0 = 40; #this is SS=1,L=13
|
||||||
|
|
||||||
|
initialDLBWPk0_1 = 0; #for mixed slot
|
||||||
|
initialDLBWPmappingType_1 = 0;
|
||||||
|
initialDLBWPstartSymbolAndLength_1 = 57; #this is SS=1,L=5
|
||||||
|
|
||||||
|
#uplinkConfigCommon
|
||||||
|
#frequencyInfoUL
|
||||||
|
ul_frequencyBand = 78;
|
||||||
|
#scs-SpecificCarrierList
|
||||||
|
ul_offstToCarrier = 0;
|
||||||
|
# subcarrierSpacing
|
||||||
|
# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
|
||||||
|
ul_subcarrierSpacing = 1;
|
||||||
|
ul_carrierBandwidth = 106;
|
||||||
|
pMax = 20;
|
||||||
|
#initialUplinkBWP
|
||||||
|
#genericParameters
|
||||||
|
initialULBWPlocationAndBandwidth = 6368;
|
||||||
|
# subcarrierSpacing
|
||||||
|
# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
|
||||||
|
initialULBWPsubcarrierSpacing = 1;
|
||||||
|
#rach-ConfigCommon
|
||||||
|
#rach-ConfigGeneric
|
||||||
|
prach_ConfigurationIndex = 4;
|
||||||
|
#prach_msg1_FDM
|
||||||
|
#0 = one, 1=two, 2=four, 3=eight
|
||||||
|
prach_msg1_FDM = 0;
|
||||||
|
prach_msg1_FrequencyStart = 74;
|
||||||
|
zeroCorrelationZoneConfig = 13;
|
||||||
|
preambleReceivedTargetPower = -118;
|
||||||
|
#preambleReceivedTargetPower = -104;
|
||||||
|
#preambleReceivedTargetPower = -108;
|
||||||
|
#preamblTransMax (0...10) = (3,4,5,6,7,8,10,20,50,100,200)
|
||||||
|
preambleTransMax = 6;
|
||||||
|
#powerRampingStep
|
||||||
|
# 0=dB0,1=dB2,2=dB4,3=dB6
|
||||||
|
powerRampingStep = 2;
|
||||||
|
#ra_ReponseWindow
|
||||||
|
#1,2,4,8,10,20,40,80
|
||||||
|
ra_ResponseWindow = 5;
|
||||||
|
#ssb_perRACH_OccasionAndCB_PreamblesPerSSB_PR
|
||||||
|
#1=oneeighth,2=onefourth,3=half,4=one,5=two,6=four,7=eight,8=sixteen
|
||||||
|
ssb_perRACH_OccasionAndCB_PreamblesPerSSB_PR = 4;
|
||||||
|
#oneHalf (0..15) 4,8,12,16,...60,64
|
||||||
|
ssb_perRACH_OccasionAndCB_PreamblesPerSSB = 14; //15;
|
||||||
|
#ra_ContentionResolutionTimer
|
||||||
|
#(0..7) 8,16,24,32,40,48,56,64
|
||||||
|
ra_ContentionResolutionTimer = 7;
|
||||||
|
rsrp_ThresholdSSB = 19;
|
||||||
|
#prach-RootSequenceIndex_PR
|
||||||
|
#1 = 839, 2 = 139
|
||||||
|
prach_RootSequenceIndex_PR = 1;
|
||||||
|
prach_RootSequenceIndex = 1;
|
||||||
|
# SCS for msg1, can only be 15 for 30 kHz < 6 GHz, takes precendence over the one derived from prach-ConfigIndex
|
||||||
|
#
|
||||||
|
#msg1_SubcarrierSpacing = 1,
|
||||||
|
|
||||||
|
# restrictedSetConfig
|
||||||
|
# 0=unrestricted, 1=restricted type A, 2=restricted type B
|
||||||
|
restrictedSetConfig = 0,
|
||||||
|
# pusch-ConfigCommon (up to 16 elements)
|
||||||
|
initialULBWPk2_0 = 6; # used for UL slot
|
||||||
|
initialULBWPmappingType_0 = 1
|
||||||
|
initialULBWPstartSymbolAndLength_0 = 55; # this is SS=0 L=12
|
||||||
|
|
||||||
|
initialULBWPk2_1 = 6; # used for mixed slot
|
||||||
|
initialULBWPmappingType_1 = 1;
|
||||||
|
initialULBWPstartSymbolAndLength_1 = 24; # this is SS=10 L=2
|
||||||
|
|
||||||
|
initialULBWPk2_2 = 7; # used for Msg.3 during RA
|
||||||
|
initialULBWPmappingType_2 = 1;
|
||||||
|
initialULBWPstartSymbolAndLength_2 = 52; # this is SS=10 L=4
|
||||||
|
|
||||||
|
|
||||||
|
msg3_DeltaPreamble = 1;
|
||||||
|
#p0_NominalWithGrant =-90;
|
||||||
|
p0_NominalWithGrant =-118;
|
||||||
|
|
||||||
|
# pucch-ConfigCommon setup :
|
||||||
|
# pucchGroupHopping
|
||||||
|
# 0 = neither, 1= group hopping, 2=sequence hopping
|
||||||
|
pucchGroupHopping = 0;
|
||||||
|
hoppingId = 40;
|
||||||
|
#p0_nominal = -90;
|
||||||
|
p0_nominal = -118;
|
||||||
|
# ssb_PositionsInBurs_BitmapPR
|
||||||
|
# 1=short, 2=medium, 3=long
|
||||||
|
ssb_PositionsInBurst_PR = 2;
|
||||||
|
ssb_PositionsInBurst_Bitmap = 1; #0x80;
|
||||||
|
|
||||||
|
# ssb_periodicityServingCell
|
||||||
|
# 0 = ms5, 1=ms10, 2=ms20, 3=ms40, 4=ms80, 5=ms160, 6=spare2, 7=spare1
|
||||||
|
ssb_periodicityServingCell = 2;
|
||||||
|
|
||||||
|
# dmrs_TypeA_position
|
||||||
|
# 0 = pos2, 1 = pos3
|
||||||
|
dmrs_TypeA_Position = 0;
|
||||||
|
|
||||||
|
# subcarrierSpacing
|
||||||
|
# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
|
||||||
|
subcarrierSpacing = 1;
|
||||||
|
|
||||||
|
|
||||||
|
#tdd-UL-DL-ConfigurationCommon
|
||||||
|
# subcarrierSpacing
|
||||||
|
# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
|
||||||
|
referenceSubcarrierSpacing = 1;
|
||||||
|
# pattern1
|
||||||
|
# dl_UL_TransmissionPeriodicity
|
||||||
|
# 0=ms0p5, 1=ms0p625, 2=ms1, 3=ms1p25, 4=ms2, 5=ms2p5, 6=ms5, 7=ms10
|
||||||
|
dl_UL_TransmissionPeriodicity = 6;
|
||||||
|
nrofDownlinkSlots = 7; //8; //7;
|
||||||
|
nrofDownlinkSymbols = 6; //0; //6;
|
||||||
|
nrofUplinkSlots = 2;
|
||||||
|
nrofUplinkSymbols = 4; //0; //4;
|
||||||
|
|
||||||
|
#ssPBCH_BlockPower = 10;
|
||||||
|
ssPBCH_BlockPower = -35;
|
||||||
|
}
|
||||||
|
|
||||||
|
);
|
||||||
|
|
||||||
|
|
||||||
|
# ------- 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";
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
///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 */
|
||||||
|
target_enb_x2_ip_address = (
|
||||||
|
{ ipv4 = "127.0.0.1";
|
||||||
|
ipv6 = "192:168:30::17";
|
||||||
|
preference = "ipv4";
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
NETWORK_INTERFACES :
|
||||||
|
{
|
||||||
|
|
||||||
|
GNB_INTERFACE_NAME_FOR_S1_MME = "eth0";
|
||||||
|
GNB_IPV4_ADDRESS_FOR_S1_MME = "CI_GNB_IP_ADDR";
|
||||||
|
GNB_INTERFACE_NAME_FOR_S1U = "eth0";
|
||||||
|
GNB_IPV4_ADDRESS_FOR_S1U = "CI_GNB_IP_ADDR";
|
||||||
|
GNB_PORT_FOR_S1U = 2152; # Spec 2152
|
||||||
|
GNB_IPV4_ADDRESS_FOR_X2C = "127.0.0.2/24";
|
||||||
|
GNB_PORT_FOR_X2C = 36422; # Spec 36422
|
||||||
|
};
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
MACRLCs = (
|
||||||
|
{
|
||||||
|
num_cc = 1;
|
||||||
|
tr_s_preference = "local_L1";
|
||||||
|
tr_n_preference = "local_RRC";
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
L1s = (
|
||||||
|
{
|
||||||
|
num_cc = 1;
|
||||||
|
tr_n_preference = "local_mac";
|
||||||
|
pusch_proc_threads = 8;
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
RUs = (
|
||||||
|
{
|
||||||
|
local_rf = "no"
|
||||||
|
nb_tx = 1
|
||||||
|
nb_rx = 1
|
||||||
|
att_tx = 0
|
||||||
|
att_rx = 0;
|
||||||
|
bands = [7];
|
||||||
|
max_pdschReferenceSignalPower = -27;
|
||||||
|
max_rxgain = 114;
|
||||||
|
eNB_instances = [0];
|
||||||
|
//clock_src = "internal";
|
||||||
|
clock_src = "external";
|
||||||
|
|
||||||
|
local_if_name = "dpdk";
|
||||||
|
sdr_addrs = "softmodem -m 2048 -l 34 -n 3 -b 0000:81:00.2 --proc-type auto --file-prefix hhh -- -p 0x1";
|
||||||
|
remote_address = "127.0.0.2";
|
||||||
|
local_address = "127.0.0.1";
|
||||||
|
local_portc = 50000;
|
||||||
|
remote_portc = 50000;
|
||||||
|
local_portd = 50001;
|
||||||
|
remote_portd = 50001;
|
||||||
|
tr_preference = "raw_if4p5"
|
||||||
|
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
THREAD_STRUCT = (
|
||||||
|
{
|
||||||
|
#three config for level of parallelism "PARALLEL_SINGLE_THREAD", "PARALLEL_RU_L1_SPLIT", or "PARALLEL_RU_L1_TRX_SPLIT"
|
||||||
|
//parallel_config = "PARALLEL_RU_L1_TRX_SPLIT";
|
||||||
|
parallel_config = "PARALLEL_SINGLE_THREAD";
|
||||||
|
#two option for worker "WORKER_DISABLE" or "WORKER_ENABLE"
|
||||||
|
worker_config = "WORKER_DISABLE";
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
log_config :
|
||||||
|
{
|
||||||
|
global_log_level ="info";
|
||||||
|
global_log_verbosity ="medium";
|
||||||
|
hw_log_level ="info";
|
||||||
|
hw_log_verbosity ="medium";
|
||||||
|
phy_log_level ="info";
|
||||||
|
phy_log_verbosity ="medium";
|
||||||
|
mac_log_level ="info";
|
||||||
|
mac_log_verbosity ="high";
|
||||||
|
rlc_log_level ="info";
|
||||||
|
rlc_log_verbosity ="medium";
|
||||||
|
pdcp_log_level ="info";
|
||||||
|
pdcp_log_verbosity ="medium";
|
||||||
|
rrc_log_level ="info";
|
||||||
|
rrc_log_verbosity ="medium";
|
||||||
|
};
|
||||||
|
|
||||||
@@ -0,0 +1,301 @@
|
|||||||
|
Active_gNBs = ( "gNB-Eurecom-5GNRBox");
|
||||||
|
# Asn1_verbosity, choice in: none, info, annoying
|
||||||
|
Asn1_verbosity = "none";
|
||||||
|
|
||||||
|
gNBs =
|
||||||
|
(
|
||||||
|
{
|
||||||
|
////////// Identification parameters:
|
||||||
|
gNB_ID = 0xe00;
|
||||||
|
|
||||||
|
cell_type = "CELL_MACRO_GNB";
|
||||||
|
|
||||||
|
gNB_name = "gNB-Eurecom-5GNRBox";
|
||||||
|
|
||||||
|
// Tracking area code, 0x0000 and 0xfffe are reserved values
|
||||||
|
tracking_area_code = 1;
|
||||||
|
|
||||||
|
plmn_list = ({mcc = 311; mnc = 480; mnc_length = 3;});
|
||||||
|
|
||||||
|
tr_s_preference = "local_mac"
|
||||||
|
|
||||||
|
////////// Physical parameters:
|
||||||
|
|
||||||
|
ssb_SubcarrierOffset = 0;
|
||||||
|
pdsch_AntennaPorts = 1;
|
||||||
|
pusch_AntennaPorts = 1;
|
||||||
|
pusch_TargetSNRx10 = 200;
|
||||||
|
pucch_TargetSNRx10 = 200;
|
||||||
|
|
||||||
|
servingCellConfigCommon = (
|
||||||
|
{
|
||||||
|
#spCellConfigCommon
|
||||||
|
|
||||||
|
physCellId = 0;
|
||||||
|
|
||||||
|
# downlinkConfigCommon
|
||||||
|
#frequencyInfoDL
|
||||||
|
# this is pointA + 23 PRBs@120kHz SCS (same as initial BWP)
|
||||||
|
absoluteFrequencySSB = 2071241;
|
||||||
|
dl_frequencyBand = 261;
|
||||||
|
# this is 27.900 GHz
|
||||||
|
dl_absoluteFrequencyPointA = 2070833;
|
||||||
|
#scs-SpecificCarrierList
|
||||||
|
dl_offstToCarrier = 0;
|
||||||
|
# subcarrierSpacing
|
||||||
|
# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
|
||||||
|
dl_subcarrierSpacing = 3;
|
||||||
|
dl_carrierBandwidth = 32;
|
||||||
|
#initialDownlinkBWP
|
||||||
|
#genericParameters
|
||||||
|
# this is RBstart=0,L=32 (275*(L-1))+RBstart
|
||||||
|
initialDLBWPlocationAndBandwidth = 8525;
|
||||||
|
# subcarrierSpacing
|
||||||
|
# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
|
||||||
|
initialDLBWPsubcarrierSpacing = 3;
|
||||||
|
#pdcch-ConfigCommon
|
||||||
|
initialDLBWPcontrolResourceSetZero = 12;
|
||||||
|
initialDLBWPsearchSpaceZero = 0;
|
||||||
|
#pdsch-ConfigCommon
|
||||||
|
#pdschTimeDomainAllocationList (up to 16 entries)
|
||||||
|
initialDLBWPk0_0 = 0;
|
||||||
|
#initialULBWPmappingType
|
||||||
|
#0=typeA,1=typeB
|
||||||
|
initialDLBWPmappingType_0 = 0;
|
||||||
|
#this is SS=2,L=3
|
||||||
|
initialDLBWPstartSymbolAndLength_0 = 40;
|
||||||
|
|
||||||
|
initialDLBWPk0_1 = 0;
|
||||||
|
initialDLBWPmappingType_1 = 0;
|
||||||
|
#this is SS=2,L=12
|
||||||
|
initialDLBWPstartSymbolAndLength_1 = 53;
|
||||||
|
|
||||||
|
initialDLBWPk0_2 = 0;
|
||||||
|
initialDLBWPmappingType_2 = 0;
|
||||||
|
#this is SS=1,L=12
|
||||||
|
initialDLBWPstartSymbolAndLength_2 = 54;
|
||||||
|
|
||||||
|
initialDLBWPk0_3 = 0;
|
||||||
|
initialDLBWPmappingType_3 = 0;
|
||||||
|
#this is SS=1,L=4 //5 (4 is for 43, 5 is for 57)
|
||||||
|
initialDLBWPstartSymbolAndLength_3 = 57; //43; //57;
|
||||||
|
#uplinkConfigCommon
|
||||||
|
#frequencyInfoUL
|
||||||
|
ul_frequencyBand = 261;
|
||||||
|
#scs-SpecificCarrierList
|
||||||
|
ul_offstToCarrier = 0;
|
||||||
|
# subcarrierSpacing
|
||||||
|
# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
|
||||||
|
ul_subcarrierSpacing = 3;
|
||||||
|
ul_carrierBandwidth = 32;
|
||||||
|
pMax = 20;
|
||||||
|
#initialUplinkBWP
|
||||||
|
#genericParameters
|
||||||
|
initialULBWPlocationAndBandwidth = 8525;
|
||||||
|
# subcarrierSpacing
|
||||||
|
# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
|
||||||
|
initialULBWPsubcarrierSpacing = 3;
|
||||||
|
#rach-ConfigCommon
|
||||||
|
#rach-ConfigGeneric
|
||||||
|
prach_ConfigurationIndex = 52;
|
||||||
|
#prach_msg1_FDM
|
||||||
|
#0 = one, 1=two, 2=four, 3=eight
|
||||||
|
prach_msg1_FDM = 0;
|
||||||
|
prach_msg1_FrequencyStart = 0;
|
||||||
|
zeroCorrelationZoneConfig = 13;
|
||||||
|
preambleReceivedTargetPower = -118;
|
||||||
|
#preamblTransMax (0...10) = (3,4,5,6,7,8,10,20,50,100,200)
|
||||||
|
preambleTransMax = 6;
|
||||||
|
#powerRampingStep
|
||||||
|
# 0=dB0,1=dB2,2=dB4,3=dB6
|
||||||
|
powerRampingStep = 1;
|
||||||
|
#ra_ReponseWindow
|
||||||
|
#1,2,4,8,10,20,40,80
|
||||||
|
ra_ResponseWindow = 7;
|
||||||
|
#ssb_perRACH_OccasionAndCB_PreamblesPerSSB_PR
|
||||||
|
#0=oneeighth,1=onefourth,2=half,3=one,4=two,5=four,6=eight,7=sixteen
|
||||||
|
ssb_perRACH_OccasionAndCB_PreamblesPerSSB_PR = 4;
|
||||||
|
#oneHalf (0..15) 4,8,12,16,...60,64
|
||||||
|
ssb_perRACH_OccasionAndCB_PreamblesPerSSB = 7;
|
||||||
|
#ra_ContentionResolutionTimer
|
||||||
|
#(0..7) 8,16,24,32,40,48,56,64
|
||||||
|
ra_ContentionResolutionTimer = 7;
|
||||||
|
rsrp_ThresholdSSB = 19;
|
||||||
|
#prach-RootSequenceIndex_PR
|
||||||
|
#1 = 839, 2 = 139
|
||||||
|
prach_RootSequenceIndex_PR = 2;
|
||||||
|
prach_RootSequenceIndex = 1;
|
||||||
|
# SCS for msg1, can only be 15 for 30 kHz < 6 GHz, takes precendence over the one derived from prach-ConfigIndex
|
||||||
|
#
|
||||||
|
msg1_SubcarrierSpacing = 3,
|
||||||
|
|
||||||
|
# restrictedSetConfig
|
||||||
|
# 0=unrestricted, 1=restricted type A, 2=restricted type B
|
||||||
|
restrictedSetConfig = 0,
|
||||||
|
# pusch-ConfigCommon (up to 16 elements)
|
||||||
|
initialULBWPk2_0 = 6;
|
||||||
|
initialULBWPmappingType_0 = 1
|
||||||
|
# this is SS=0 L=11
|
||||||
|
initialULBWPstartSymbolAndLength_0 = 55;
|
||||||
|
|
||||||
|
initialULBWPk2_1 = 6;
|
||||||
|
initialULBWPmappingType_1 = 1;
|
||||||
|
# this is SS=0 L=12
|
||||||
|
initialULBWPstartSymbolAndLength_1 = 69;
|
||||||
|
|
||||||
|
initialULBWPk2_2 = 14;
|
||||||
|
initialULBWPmappingType_2 = 1;
|
||||||
|
# this is SS=10 L=4
|
||||||
|
initialULBWPstartSymbolAndLength_2 = 52;
|
||||||
|
|
||||||
|
msg3_DeltaPreamble = 1;
|
||||||
|
p0_NominalWithGrant =-90;
|
||||||
|
|
||||||
|
# pucch-ConfigCommon setup :
|
||||||
|
# pucchGroupHopping
|
||||||
|
# 0 = neither, 1= group hopping, 2=sequence hopping
|
||||||
|
pucchGroupHopping = 0;
|
||||||
|
hoppingId = 40;
|
||||||
|
p0_nominal = -90;
|
||||||
|
# ssb_PositionsInBurs_BitmapPR
|
||||||
|
# 1=short, 2=medium, 3=long
|
||||||
|
ssb_PositionsInBurst_PR = 3;
|
||||||
|
ssb_PositionsInBurst_Bitmap = 0x0001000100010001L;
|
||||||
|
|
||||||
|
# ssb_periodicityServingCell
|
||||||
|
# 0 = ms5, 1=ms10, 2=ms20, 3=ms40, 4=ms80, 5=ms160, 6=spare2, 7=spare1
|
||||||
|
ssb_periodicityServingCell = 2;
|
||||||
|
|
||||||
|
# dmrs_TypeA_position
|
||||||
|
# 0 = pos2, 1 = pos3
|
||||||
|
dmrs_TypeA_Position = 0;
|
||||||
|
|
||||||
|
# subcarrierSpacing
|
||||||
|
# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
|
||||||
|
subcarrierSpacing = 3;
|
||||||
|
|
||||||
|
|
||||||
|
#tdd-UL-DL-ConfigurationCommon
|
||||||
|
# subcarrierSpacing
|
||||||
|
# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
|
||||||
|
referenceSubcarrierSpacing = 3;
|
||||||
|
# pattern1
|
||||||
|
# dl_UL_TransmissionPeriodicity
|
||||||
|
# 0=ms0p5, 1=ms0p625, 2=ms1, 3=ms1p25, 4=ms2, 5=ms2p5, 6=ms5, 7=ms10
|
||||||
|
dl_UL_TransmissionPeriodicity = 3;
|
||||||
|
nrofDownlinkSlots = 7;
|
||||||
|
nrofDownlinkSymbols = 6;
|
||||||
|
nrofUplinkSlots = 2;
|
||||||
|
nrofUplinkSymbols = 4;
|
||||||
|
|
||||||
|
ssPBCH_BlockPower = 10;
|
||||||
|
}
|
||||||
|
|
||||||
|
);
|
||||||
|
|
||||||
|
|
||||||
|
# ------- SCTP definitions
|
||||||
|
SCTP :
|
||||||
|
{
|
||||||
|
# Number of streams to use in input/output
|
||||||
|
SCTP_INSTREAMS = 2;
|
||||||
|
SCTP_OUTSTREAMS = 2;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
////////// MME parameters:
|
||||||
|
mme_ip_address = ( { ipv4 = "192.168.18.99";
|
||||||
|
ipv6 = "192:168:30::17";
|
||||||
|
active = "yes";
|
||||||
|
preference = "ipv4";
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
///X2
|
||||||
|
enable_x2 = "no";
|
||||||
|
t_reloc_prep = 1000; /* unit: millisecond */
|
||||||
|
tx2_reloc_overall = 2000; /* unit: millisecond */
|
||||||
|
t_dc_prep = 1000; /* unit: millisecond */
|
||||||
|
t_dc_overall = 2000; /* unit: millisecond */
|
||||||
|
target_enb_x2_ip_address = (
|
||||||
|
{ ipv4 = "192.168.18.199";
|
||||||
|
ipv6 = "192:168:30::17";
|
||||||
|
preference = "ipv4";
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
NETWORK_INTERFACES :
|
||||||
|
{
|
||||||
|
|
||||||
|
GNB_INTERFACE_NAME_FOR_S1_MME = "eth0";
|
||||||
|
GNB_IPV4_ADDRESS_FOR_S1_MME = "192.168.18.198/24";
|
||||||
|
GNB_INTERFACE_NAME_FOR_S1U = "eth0";
|
||||||
|
GNB_IPV4_ADDRESS_FOR_S1U = "192.168.18.198/24";
|
||||||
|
GNB_PORT_FOR_S1U = 2152; # Spec 2152
|
||||||
|
GNB_IPV4_ADDRESS_FOR_X2C = "192.168.18.198/24";
|
||||||
|
GNB_PORT_FOR_X2C = 36422; # Spec 36422
|
||||||
|
};
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
MACRLCs = (
|
||||||
|
{
|
||||||
|
num_cc = 1;
|
||||||
|
tr_s_preference = "local_L1";
|
||||||
|
tr_n_preference = "local_RRC";
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
L1s = (
|
||||||
|
{
|
||||||
|
num_cc = 1;
|
||||||
|
tr_n_preference = "local_mac";
|
||||||
|
pusch_proc_threads = 8;
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
RUs = (
|
||||||
|
{
|
||||||
|
local_rf = "yes"
|
||||||
|
nb_tx = 1;
|
||||||
|
nb_rx = 1;
|
||||||
|
att_tx = 0;
|
||||||
|
att_rx = 0;
|
||||||
|
bands = [7];
|
||||||
|
max_pdschReferenceSignalPower = -27;
|
||||||
|
max_rxgain = 75;
|
||||||
|
eNB_instances = [0];
|
||||||
|
sdr_addrs = "addr=192.168.10.2,second_addr=192.168.20.2";
|
||||||
|
if_freq = 5124520000L;
|
||||||
|
clock_src = "external";
|
||||||
|
time_src = "external";
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
THREAD_STRUCT = (
|
||||||
|
{
|
||||||
|
#three config for level of parallelism "PARALLEL_SINGLE_THREAD", "PARALLEL_RU_L1_SPLIT", or "PARALLEL_RU_L1_TRX_SPLIT"
|
||||||
|
parallel_config = "PARALLEL_RU_L1_TRX_SPLIT";
|
||||||
|
#two option for worker "WORKER_DISABLE" or "WORKER_ENABLE"
|
||||||
|
worker_config = "WORKER_ENABLE";
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
log_config :
|
||||||
|
{
|
||||||
|
global_log_level ="info";
|
||||||
|
global_log_verbosity ="medium";
|
||||||
|
hw_log_level ="info";
|
||||||
|
hw_log_verbosity ="medium";
|
||||||
|
phy_log_level ="info";
|
||||||
|
phy_log_verbosity ="medium";
|
||||||
|
mac_log_level ="info";
|
||||||
|
mac_log_verbosity ="high";
|
||||||
|
rlc_log_level ="info";
|
||||||
|
rlc_log_verbosity ="medium";
|
||||||
|
pdcp_log_level ="info";
|
||||||
|
pdcp_log_verbosity ="medium";
|
||||||
|
rrc_log_level ="info";
|
||||||
|
rrc_log_verbosity ="medium";
|
||||||
|
};
|
||||||
|
|
||||||
@@ -0,0 +1,293 @@
|
|||||||
|
Active_gNBs = ( "gNB-Eurecom-5GNRBox");
|
||||||
|
# Asn1_verbosity, choice in: none, info, annoying
|
||||||
|
Asn1_verbosity = "none";
|
||||||
|
|
||||||
|
gNBs =
|
||||||
|
(
|
||||||
|
{
|
||||||
|
////////// Identification parameters:
|
||||||
|
gNB_ID = 0xe00;
|
||||||
|
|
||||||
|
cell_type = "CELL_MACRO_GNB";
|
||||||
|
|
||||||
|
gNB_name = "gNB-Eurecom-5GNRBox";
|
||||||
|
|
||||||
|
// Tracking area code, 0x0000 and 0xfffe are reserved values
|
||||||
|
tracking_area_code = 1;
|
||||||
|
|
||||||
|
plmn_list = ({mcc = 208; mnc = 93; mnc_length = 2;});
|
||||||
|
|
||||||
|
tr_s_preference = "local_mac"
|
||||||
|
|
||||||
|
////////// Physical parameters:
|
||||||
|
|
||||||
|
ssb_SubcarrierOffset = 0;
|
||||||
|
pdsch_AntennaPorts = 1;
|
||||||
|
pusch_AntennaPorts = 1;
|
||||||
|
|
||||||
|
servingCellConfigCommon = (
|
||||||
|
{
|
||||||
|
#spCellConfigCommon
|
||||||
|
|
||||||
|
physCellId = 0;
|
||||||
|
|
||||||
|
# downlinkConfigCommon
|
||||||
|
#frequencyInfoDL
|
||||||
|
# this is 2150 MHz + 43 PRBs@30kHz SCS (same as initial BWP)
|
||||||
|
absoluteFrequencySSB = 433096;
|
||||||
|
dl_frequencyBand = 66;
|
||||||
|
# this is 2150 MHz
|
||||||
|
dl_absoluteFrequencyPointA = 430000;
|
||||||
|
#scs-SpecificCarrierList
|
||||||
|
dl_offstToCarrier = 0;
|
||||||
|
# subcarrierSpacing
|
||||||
|
# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
|
||||||
|
dl_subcarrierSpacing = 1;
|
||||||
|
dl_carrierBandwidth = 106;
|
||||||
|
#initialDownlinkBWP
|
||||||
|
#genericParameters
|
||||||
|
# this is RBstart=0,L=50 (275*(L-1))+RBstart
|
||||||
|
initialDLBWPlocationAndBandwidth = 13475;
|
||||||
|
# subcarrierSpacing
|
||||||
|
# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
|
||||||
|
initialDLBWPsubcarrierSpacing = 1;
|
||||||
|
#pdcch-ConfigCommon
|
||||||
|
initialDLBWPcontrolResourceSetZero = 12;
|
||||||
|
initialDLBWPsearchSpaceZero = 0;
|
||||||
|
#pdsch-ConfigCommon
|
||||||
|
#pdschTimeDomainAllocationList (up to 16 entries)
|
||||||
|
initialDLBWPk0_0 = 0;
|
||||||
|
#initialULBWPmappingType
|
||||||
|
#0=typeA,1=typeB
|
||||||
|
initialDLBWPmappingType_0 = 0;
|
||||||
|
#this is SS=1,L=13
|
||||||
|
initialDLBWPstartSymbolAndLength_0 = 40;
|
||||||
|
|
||||||
|
initialDLBWPk0_1 = 0;
|
||||||
|
initialDLBWPmappingType_1 = 0;
|
||||||
|
#this is SS=2,L=12
|
||||||
|
initialDLBWPstartSymbolAndLength_1 = 53;
|
||||||
|
|
||||||
|
initialDLBWPk0_2 = 0;
|
||||||
|
initialDLBWPmappingType_2 = 0;
|
||||||
|
#this is SS=1,L=12
|
||||||
|
initialDLBWPstartSymbolAndLength_2 = 54;
|
||||||
|
|
||||||
|
initialDLBWPk0_3 = 0;
|
||||||
|
initialDLBWPmappingType_3 = 0;
|
||||||
|
#this is SS=1,L=4
|
||||||
|
initialDLBWPstartSymbolAndLength_3 = 57;
|
||||||
|
#uplinkConfigCommon
|
||||||
|
#frequencyInfoUL
|
||||||
|
ul_frequencyBand = 66;
|
||||||
|
ul_absoluteFrequencyPointA = 350000;
|
||||||
|
#scs-SpecificCarrierList
|
||||||
|
ul_offstToCarrier = 0;
|
||||||
|
# subcarrierSpacing
|
||||||
|
# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
|
||||||
|
ul_subcarrierSpacing = 1;
|
||||||
|
ul_carrierBandwidth = 106;
|
||||||
|
pMax = 20;
|
||||||
|
#initialUplinkBWP
|
||||||
|
#genericParameters
|
||||||
|
initialULBWPlocationAndBandwidth = 13475;
|
||||||
|
# subcarrierSpacing
|
||||||
|
# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
|
||||||
|
initialULBWPsubcarrierSpacing = 1;
|
||||||
|
#rach-ConfigCommon
|
||||||
|
#rach-ConfigGeneric
|
||||||
|
prach_ConfigurationIndex = 98;
|
||||||
|
#prach_msg1_FDM
|
||||||
|
#0 = one, 1=two, 2=four, 3=eight
|
||||||
|
prach_msg1_FDM = 0;
|
||||||
|
prach_msg1_FrequencyStart = 0;
|
||||||
|
zeroCorrelationZoneConfig = 13;
|
||||||
|
preambleReceivedTargetPower = -118;
|
||||||
|
#preamblTransMax (0...10) = (3,4,5,6,7,8,10,20,50,100,200)
|
||||||
|
preambleTransMax = 6;
|
||||||
|
#powerRampingStep
|
||||||
|
# 0=dB0,1=dB2,2=dB4,3=dB6
|
||||||
|
powerRampingStep = 1;
|
||||||
|
#ra_ReponseWindow
|
||||||
|
#1,2,4,8,10,20,40,80
|
||||||
|
ra_ResponseWindow = 4;
|
||||||
|
#ssb_perRACH_OccasionAndCB_PreamblesPerSSB_PR
|
||||||
|
#1=oneeighth,2=onefourth,3=half,4=one,5=two,6=four,7=eight,8=sixteen
|
||||||
|
ssb_perRACH_OccasionAndCB_PreamblesPerSSB_PR = 4;
|
||||||
|
#oneHalf (0..15) 4,8,12,16,...60,64
|
||||||
|
ssb_perRACH_OccasionAndCB_PreamblesPerSSB = 15;
|
||||||
|
#ra_ContentionResolutionTimer
|
||||||
|
#(0..7) 8,16,24,32,40,48,56,64
|
||||||
|
ra_ContentionResolutionTimer = 7;
|
||||||
|
rsrp_ThresholdSSB = 19;
|
||||||
|
#prach-RootSequenceIndex_PR
|
||||||
|
#1 = 839, 2 = 139
|
||||||
|
prach_RootSequenceIndex_PR = 2;
|
||||||
|
prach_RootSequenceIndex = 1;
|
||||||
|
# SCS for msg1, can only be 15 for 30 kHz < 6 GHz, takes precendence over the one derived from prach-ConfigIndex
|
||||||
|
#
|
||||||
|
msg1_SubcarrierSpacing = 1,
|
||||||
|
|
||||||
|
# restrictedSetConfig
|
||||||
|
# 0=unrestricted, 1=restricted type A, 2=restricted type B
|
||||||
|
restrictedSetConfig = 0,
|
||||||
|
# pusch-ConfigCommon (up to 16 elements)
|
||||||
|
initialULBWPk2_0 = 6;
|
||||||
|
initialULBWPmappingType_0 = 1
|
||||||
|
# this is SS=0 L=11
|
||||||
|
initialULBWPstartSymbolAndLength_0 = 55;
|
||||||
|
|
||||||
|
initialULBWPk2_1 = 6;
|
||||||
|
initialULBWPmappingType_1 = 1;
|
||||||
|
# this is SS=0 L=12
|
||||||
|
initialULBWPstartSymbolAndLength_1 = 69;
|
||||||
|
|
||||||
|
initialULBWPk2_2 = 7;
|
||||||
|
initialULBWPmappingType_2 = 1;
|
||||||
|
# this is SS=10 L=4
|
||||||
|
initialULBWPstartSymbolAndLength_2 = 52;
|
||||||
|
msg3_DeltaPreamble = 1;
|
||||||
|
p0_NominalWithGrant =-90;
|
||||||
|
|
||||||
|
# pucch-ConfigCommon setup :
|
||||||
|
# pucchGroupHopping
|
||||||
|
# 0 = neither, 1= group hopping, 2=sequence hopping
|
||||||
|
pucchGroupHopping = 0;
|
||||||
|
hoppingId = 40;
|
||||||
|
p0_nominal = -90;
|
||||||
|
# ssb_PositionsInBurs_BitmapPR
|
||||||
|
# 1=short, 2=medium, 3=long
|
||||||
|
ssb_PositionsInBurst_PR = 2;
|
||||||
|
ssb_PositionsInBurst_Bitmap = 1;
|
||||||
|
|
||||||
|
# ssb_periodicityServingCell
|
||||||
|
# 0 = ms5, 1=ms10, 2=ms20, 3=ms40, 4=ms80, 5=ms160, 6=spare2, 7=spare1
|
||||||
|
ssb_periodicityServingCell = 2;
|
||||||
|
|
||||||
|
# dmrs_TypeA_position
|
||||||
|
# 0 = pos2, 1 = pos3
|
||||||
|
dmrs_TypeA_Position = 0;
|
||||||
|
|
||||||
|
# subcarrierSpacing
|
||||||
|
# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
|
||||||
|
subcarrierSpacing = 1;
|
||||||
|
|
||||||
|
|
||||||
|
#tdd-UL-DL-ConfigurationCommon
|
||||||
|
# subcarrierSpacing
|
||||||
|
# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
|
||||||
|
referenceSubcarrierSpacing = 1;
|
||||||
|
# pattern1
|
||||||
|
# dl_UL_TransmissionPeriodicity
|
||||||
|
# 0=ms0p5, 1=ms0p625, 2=ms1, 3=ms1p25, 4=ms2, 5=ms2p5, 6=ms5, 7=ms10
|
||||||
|
dl_UL_TransmissionPeriodicity = 6;
|
||||||
|
nrofDownlinkSlots = 7;
|
||||||
|
nrofDownlinkSymbols = 6;
|
||||||
|
nrofUplinkSlots = 2;
|
||||||
|
nrofUplinkSymbols = 4;
|
||||||
|
|
||||||
|
ssPBCH_BlockPower = -25;
|
||||||
|
}
|
||||||
|
|
||||||
|
);
|
||||||
|
|
||||||
|
|
||||||
|
# ------- SCTP definitions
|
||||||
|
SCTP :
|
||||||
|
{
|
||||||
|
# Number of streams to use in input/output
|
||||||
|
SCTP_INSTREAMS = 2;
|
||||||
|
SCTP_OUTSTREAMS = 2;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
////////// MME parameters:
|
||||||
|
mme_ip_address = ( { ipv4 = "192.168.12.26";
|
||||||
|
ipv6 = "192:168:30::17";
|
||||||
|
active = "yes";
|
||||||
|
preference = "ipv4";
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
NETWORK_INTERFACES :
|
||||||
|
{
|
||||||
|
|
||||||
|
GNB_INTERFACE_NAME_FOR_S1_MME = "eth0";
|
||||||
|
GNB_IPV4_ADDRESS_FOR_S1_MME = "192.168.12.111/24";
|
||||||
|
GNB_INTERFACE_NAME_FOR_S1U = "eth0";
|
||||||
|
GNB_IPV4_ADDRESS_FOR_S1U = "192.168.12.111/24";
|
||||||
|
GNB_PORT_FOR_S1U = 2152; # Spec 2152
|
||||||
|
};
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
MACRLCs = (
|
||||||
|
{
|
||||||
|
num_cc = 1;
|
||||||
|
tr_s_preference = "local_L1";
|
||||||
|
tr_n_preference = "local_RRC";
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
L1s = (
|
||||||
|
{
|
||||||
|
num_cc = 1;
|
||||||
|
tr_n_preference = "local_mac";
|
||||||
|
pusch_proc_threads = 8;
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
RUs = (
|
||||||
|
{
|
||||||
|
local_rf = "yes"
|
||||||
|
nb_tx = 1;
|
||||||
|
nb_rx = 1;
|
||||||
|
att_tx = 0;
|
||||||
|
att_rx = 0;
|
||||||
|
bands = [7];
|
||||||
|
max_pdschReferenceSignalPower = -27;
|
||||||
|
max_rxgain = 75;
|
||||||
|
eNB_instances = [0];
|
||||||
|
##beamforming 1x2 matrix: 1 layer x 2 antennas
|
||||||
|
bf_weights = [0x00007fff, 0x0000];
|
||||||
|
##beamforming 1x4 matrix: 1 layer x 4 antennas
|
||||||
|
#bf_weights = [0x00007fff, 0x0000,0x0000, 0x0000];
|
||||||
|
## beamforming 2x2 matrix:
|
||||||
|
# bf_weights = [0x00007fff, 0x00000000, 0x00000000, 0x00007fff];
|
||||||
|
## beamforming 4x4 matrix:
|
||||||
|
#bf_weights = [0x00007fff, 0x0000, 0x0000, 0x0000, 0x00000000, 0x00007fff, 0x0000, 0x0000, 0x0000, 0x0000, 0x00007fff, 0x0000, 0x0000, 0x0000, 0x0000, 0x00007fff];
|
||||||
|
|
||||||
|
sdr_addrs = "addr=192.168.10.2,mgmt_addr=192.168.10.2,second_addr=192.168.20.2";
|
||||||
|
clock_src = "external";
|
||||||
|
# if_freq = 3700000000L;
|
||||||
|
# if_offset = 1000000;
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
THREAD_STRUCT = (
|
||||||
|
{
|
||||||
|
#three config for level of parallelism "PARALLEL_SINGLE_THREAD", "PARALLEL_RU_L1_SPLIT", or "PARALLEL_RU_L1_TRX_SPLIT"
|
||||||
|
parallel_config = "PARALLEL_RU_L1_TRX_SPLIT";
|
||||||
|
#two option for worker "WORKER_DISABLE" or "WORKER_ENABLE"
|
||||||
|
worker_config = "WORKER_ENABLE";
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
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";
|
||||||
|
};
|
||||||
|
|
||||||
@@ -23,7 +23,8 @@ gNBs =
|
|||||||
|
|
||||||
ssb_SubcarrierOffset = 0;
|
ssb_SubcarrierOffset = 0;
|
||||||
pdsch_AntennaPorts = 1;
|
pdsch_AntennaPorts = 1;
|
||||||
|
pusch_AntennaPorts = 1;
|
||||||
|
|
||||||
servingCellConfigCommon = (
|
servingCellConfigCommon = (
|
||||||
{
|
{
|
||||||
#spCellConfigCommon
|
#spCellConfigCommon
|
||||||
@@ -46,7 +47,7 @@ gNBs =
|
|||||||
#initialDownlinkBWP
|
#initialDownlinkBWP
|
||||||
#genericParameters
|
#genericParameters
|
||||||
# this is RBstart=41,L=24 (275*(L-1))+RBstart
|
# this is RBstart=41,L=24 (275*(L-1))+RBstart
|
||||||
initialDLBWPlocationAndBandwidth = 6366;
|
initialDLBWPlocationAndBandwidth = 6368;
|
||||||
# subcarrierSpacing
|
# subcarrierSpacing
|
||||||
# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
|
# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
|
||||||
initialDLBWPsubcarrierSpacing = 1;
|
initialDLBWPsubcarrierSpacing = 1;
|
||||||
@@ -89,7 +90,7 @@ gNBs =
|
|||||||
pMax = 20;
|
pMax = 20;
|
||||||
#initialUplinkBWP
|
#initialUplinkBWP
|
||||||
#genericParameters
|
#genericParameters
|
||||||
initialULBWPlocationAndBandwidth = 6366;
|
initialULBWPlocationAndBandwidth = 6368;
|
||||||
# subcarrierSpacing
|
# subcarrierSpacing
|
||||||
# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
|
# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
|
||||||
initialULBWPsubcarrierSpacing = 1;
|
initialULBWPsubcarrierSpacing = 1;
|
||||||
@@ -186,7 +187,7 @@ gNBs =
|
|||||||
nrofUplinkSlots = 2;
|
nrofUplinkSlots = 2;
|
||||||
nrofUplinkSymbols = 4;
|
nrofUplinkSymbols = 4;
|
||||||
|
|
||||||
ssPBCH_BlockPower = 10;
|
ssPBCH_BlockPower = -25;
|
||||||
}
|
}
|
||||||
|
|
||||||
);
|
);
|
||||||
@@ -227,19 +228,20 @@ MACRLCs = (
|
|||||||
num_cc = 1;
|
num_cc = 1;
|
||||||
tr_s_preference = "local_L1";
|
tr_s_preference = "local_L1";
|
||||||
tr_n_preference = "local_RRC";
|
tr_n_preference = "local_RRC";
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
|
|
||||||
L1s = (
|
L1s = (
|
||||||
{
|
{
|
||||||
num_cc = 1;
|
num_cc = 1;
|
||||||
tr_n_preference = "local_mac";
|
tr_n_preference = "local_mac";
|
||||||
}
|
pusch_proc_threads = 8;
|
||||||
|
}
|
||||||
);
|
);
|
||||||
|
|
||||||
RUs = (
|
RUs = (
|
||||||
{
|
{
|
||||||
local_rf = "yes"
|
local_rf = "yes"
|
||||||
nb_tx = 1
|
nb_tx = 1
|
||||||
nb_rx = 1
|
nb_rx = 1
|
||||||
att_tx = 0
|
att_tx = 0
|
||||||
@@ -248,8 +250,15 @@ RUs = (
|
|||||||
max_pdschReferenceSignalPower = -27;
|
max_pdschReferenceSignalPower = -27;
|
||||||
max_rxgain = 75;
|
max_rxgain = 75;
|
||||||
eNB_instances = [0];
|
eNB_instances = [0];
|
||||||
#beamforming 1x4 matrix:
|
## beamforming 1x2 matrix: 1 layer x 2 antennas
|
||||||
bf_weights = [0x00007fff, 0x0000, 0x0000, 0x0000];
|
bf_weights = [0x00007fff, 0x0000];
|
||||||
|
## beamforming 1x4 matrix: 1 layer x 4 antennas
|
||||||
|
#bf_weights = [0x00007fff, 0x0000,0x0000, 0x0000];
|
||||||
|
## beamforming 2x2 matrix:
|
||||||
|
#bf_weights = [0x00007fff, 0x00000000, 0x00000000, 0x00007fff];
|
||||||
|
## beamforming 4x4 matrix:
|
||||||
|
#bf_weights = [0x00007fff, 0x0000, 0x0000, 0x0000, 0x00000000, 0x00007fff, 0x0000, 0x0000, 0x0000, 0x0000, 0x00007fff, 0x0000, 0x0000, 0x0000, 0x0000, 0x00007fff];
|
||||||
|
|
||||||
sdr_addrs = "addr=192.168.10.2,mgmt_addr=192.168.10.2,second_addr=192.168.20.2";
|
sdr_addrs = "addr=192.168.10.2,mgmt_addr=192.168.10.2,second_addr=192.168.20.2";
|
||||||
clock_src = "external";
|
clock_src = "external";
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -22,6 +22,7 @@ gNBs =
|
|||||||
|
|
||||||
ssb_SubcarrierOffset = 31; //0;
|
ssb_SubcarrierOffset = 31; //0;
|
||||||
pdsch_AntennaPorts = 1;
|
pdsch_AntennaPorts = 1;
|
||||||
|
pusch_AntennaPorts = 1;
|
||||||
pusch_TargetSNRx10 = 200;
|
pusch_TargetSNRx10 = 200;
|
||||||
pucch_TargetSNRx10 = 200;
|
pucch_TargetSNRx10 = 200;
|
||||||
|
|
||||||
@@ -48,7 +49,7 @@ gNBs =
|
|||||||
#initialDownlinkBWP
|
#initialDownlinkBWP
|
||||||
#genericParameters
|
#genericParameters
|
||||||
# this is RBstart=84,L=13 (275*(L-1))+RBstart
|
# this is RBstart=84,L=13 (275*(L-1))+RBstart
|
||||||
initialDLBWPlocationAndBandwidth = 6366; //28875; //6366; #6407; #3384;
|
initialDLBWPlocationAndBandwidth = 6368;
|
||||||
# subcarrierSpacing
|
# subcarrierSpacing
|
||||||
# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
|
# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
|
||||||
initialDLBWPsubcarrierSpacing = 1;
|
initialDLBWPsubcarrierSpacing = 1;
|
||||||
@@ -90,7 +91,7 @@ gNBs =
|
|||||||
pMax = 20;
|
pMax = 20;
|
||||||
#initialUplinkBWP
|
#initialUplinkBWP
|
||||||
#genericParameters
|
#genericParameters
|
||||||
initialULBWPlocationAndBandwidth = 6366; //28875; //6366; #6407; #3384;
|
initialULBWPlocationAndBandwidth = 6368;
|
||||||
# subcarrierSpacing
|
# subcarrierSpacing
|
||||||
# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
|
# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
|
||||||
initialULBWPsubcarrierSpacing = 1;
|
initialULBWPsubcarrierSpacing = 1;
|
||||||
@@ -250,7 +251,7 @@ L1s = (
|
|||||||
{
|
{
|
||||||
num_cc = 1;
|
num_cc = 1;
|
||||||
tr_n_preference = "local_mac";
|
tr_n_preference = "local_mac";
|
||||||
pusch_proc_threads = 8;
|
pusch_proc_threads = 6;
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|||||||
@@ -87,6 +87,12 @@ function create_vm {
|
|||||||
echo "VM_CPU = $VM_CPU"
|
echo "VM_CPU = $VM_CPU"
|
||||||
echo "VM_DISK = $VM_DISK GBytes"
|
echo "VM_DISK = $VM_DISK GBytes"
|
||||||
|
|
||||||
|
if [[ "$VM_NAME" == *"-enb-usrp"* ]]
|
||||||
|
then
|
||||||
|
echo "This VM type is no longer supported in the pipeline framework"
|
||||||
|
return
|
||||||
|
fi
|
||||||
|
|
||||||
echo "############################################################"
|
echo "############################################################"
|
||||||
echo "Creating VM ($VM_NAME) on Ubuntu Cloud Image base"
|
echo "Creating VM ($VM_NAME) on Ubuntu Cloud Image base"
|
||||||
echo "############################################################"
|
echo "############################################################"
|
||||||
|
|||||||
@@ -0,0 +1,92 @@
|
|||||||
|
#/*
|
||||||
|
# * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
|
||||||
|
# * contributor license agreements. See the NOTICE file distributed with
|
||||||
|
# * this work for additional information regarding copyright ownership.
|
||||||
|
# * The OpenAirInterface Software Alliance licenses this file to You under
|
||||||
|
# * the OAI Public License, Version 1.1 (the "License"); you may not use this file
|
||||||
|
# * except in compliance with the License.
|
||||||
|
# * You may obtain a copy of the License at
|
||||||
|
# *
|
||||||
|
# * http://www.openairinterface.org/?page_id=698
|
||||||
|
# *
|
||||||
|
# * Unless required by applicable law or agreed to in writing, software
|
||||||
|
# * distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
# * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
# * See the License for the specific language governing permissions and
|
||||||
|
# * limitations under the License.
|
||||||
|
# *-------------------------------------------------------------------------------
|
||||||
|
# * For more information about the OpenAirInterface (OAI) Software Alliance:
|
||||||
|
# * contact@openairinterface.org
|
||||||
|
# */
|
||||||
|
#---------------------------------------------------------------------
|
||||||
|
# Python for CI of OAI-eNB + COTS-UE
|
||||||
|
#
|
||||||
|
# Required Python Version
|
||||||
|
# Python 3.x
|
||||||
|
#
|
||||||
|
# Required Python Package
|
||||||
|
# pexpect
|
||||||
|
#---------------------------------------------------------------------
|
||||||
|
|
||||||
|
|
||||||
|
#-----------------------------------------------------------
|
||||||
|
# Import Libs
|
||||||
|
#-----------------------------------------------------------
|
||||||
|
import sys # arg
|
||||||
|
import re # reg
|
||||||
|
import os
|
||||||
|
import subprocess
|
||||||
|
|
||||||
|
|
||||||
|
class SplitReport():
|
||||||
|
def __init__(self):
|
||||||
|
self.logfilename = ''
|
||||||
|
self.destinationFolder = ''
|
||||||
|
|
||||||
|
def split(self):
|
||||||
|
self.destinationFolder = self.logfilename.replace(".log","")
|
||||||
|
if os.path.isfile(self.logfilename):
|
||||||
|
newImageLog = open(self.logfilename + '.new', 'w')
|
||||||
|
copyFlag = True
|
||||||
|
with open(self.logfilename, 'r') as imageLog:
|
||||||
|
for line in imageLog:
|
||||||
|
header = False
|
||||||
|
ret = re.search('====== Start of log for ([0-9\.A-Za-z\-\_]+) ======', line)
|
||||||
|
if ret is not None:
|
||||||
|
copyFlag = False
|
||||||
|
header = True
|
||||||
|
detailedLogFile = open(self.destinationFolder + '/' + ret.group(1), 'w')
|
||||||
|
if copyFlag:
|
||||||
|
newImageLog.write(line)
|
||||||
|
ret = re.search('====== End of log for ([0-9\.A-Za-z\-\_]+) ======', line)
|
||||||
|
if ret is not None:
|
||||||
|
copyFlag = True
|
||||||
|
detailedLogFile.close()
|
||||||
|
elif not copyFlag and not header:
|
||||||
|
detailedLogFile.write(line)
|
||||||
|
imageLog.close()
|
||||||
|
newImageLog.close()
|
||||||
|
os.rename(self.logfilename + '.new', self.logfilename)
|
||||||
|
else:
|
||||||
|
print('Cannot split unfound file')
|
||||||
|
|
||||||
|
#--------------------------------------------------------------------------------------------------------
|
||||||
|
#
|
||||||
|
# Start of main
|
||||||
|
#
|
||||||
|
#--------------------------------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
argvs = sys.argv
|
||||||
|
argc = len(argvs)
|
||||||
|
|
||||||
|
SP = SplitReport()
|
||||||
|
|
||||||
|
while len(argvs) > 1:
|
||||||
|
myArgv = argvs.pop(1)
|
||||||
|
if re.match('^\-\-logfilename=(.+)$', myArgv, re.IGNORECASE):
|
||||||
|
matchReg = re.match('^\-\-logfilename=(.+)$', myArgv, re.IGNORECASE)
|
||||||
|
SP.logfilename = matchReg.group(1)
|
||||||
|
|
||||||
|
SP.split()
|
||||||
|
|
||||||
|
sys.exit(0)
|
||||||
@@ -172,6 +172,7 @@ function setvar_usage {
|
|||||||
function variant__v1__enb_usrp {
|
function variant__v1__enb_usrp {
|
||||||
NB_PATTERN_FILES=9
|
NB_PATTERN_FILES=9
|
||||||
BUILD_OPTIONS="--eNB -w USRP --mu"
|
BUILD_OPTIONS="--eNB -w USRP --mu"
|
||||||
|
VM_MEMORY=3072
|
||||||
}
|
}
|
||||||
|
|
||||||
function variant__v2__basic_sim {
|
function variant__v2__basic_sim {
|
||||||
@@ -213,15 +214,15 @@ function variant__v6__nr_ue_usrp {
|
|||||||
function variant__v7__enb_ethernet {
|
function variant__v7__enb_ethernet {
|
||||||
VM_MEMORY=4096
|
VM_MEMORY=4096
|
||||||
ARCHIVES_LOC=enb_eth
|
ARCHIVES_LOC=enb_eth
|
||||||
NB_PATTERN_FILES=8
|
NB_PATTERN_FILES=9
|
||||||
BUILD_OPTIONS="--eNB"
|
BUILD_OPTIONS="--eNB -w USRP"
|
||||||
}
|
}
|
||||||
|
|
||||||
function variant__v8__ue_ethernet {
|
function variant__v8__ue_ethernet {
|
||||||
VM_MEMORY=4096
|
VM_MEMORY=4096
|
||||||
ARCHIVES_LOC=ue_eth
|
ARCHIVES_LOC=ue_eth
|
||||||
NB_PATTERN_FILES=12
|
NB_PATTERN_FILES=13
|
||||||
BUILD_OPTIONS="--UE"
|
BUILD_OPTIONS="--UE -w USRP"
|
||||||
}
|
}
|
||||||
|
|
||||||
function variant__v10__flexran_rtc {
|
function variant__v10__flexran_rtc {
|
||||||
|
|||||||
+2
-1
@@ -239,6 +239,7 @@ class RANManagement():
|
|||||||
while (count > 0) and buildOAIprocess:
|
while (count > 0) and buildOAIprocess:
|
||||||
mySSH.command('ps aux | grep --color=never build_ | grep -v grep', '\$', 6)
|
mySSH.command('ps aux | grep --color=never build_ | grep -v grep', '\$', 6)
|
||||||
result = re.search('build_oai', mySSH.getBefore())
|
result = re.search('build_oai', mySSH.getBefore())
|
||||||
|
print(result)
|
||||||
if result is None:
|
if result is None:
|
||||||
buildOAIprocess = False
|
buildOAIprocess = False
|
||||||
else:
|
else:
|
||||||
@@ -464,7 +465,7 @@ class RANManagement():
|
|||||||
self.prematureExit = True
|
self.prematureExit = True
|
||||||
return
|
return
|
||||||
else:
|
else:
|
||||||
mySSH.command('stdbuf -o0 cat enb_' + self.testCase_id + '.log | egrep --text --color=never -i "wait|sync|Starting"', '\$', 4)
|
mySSH.command('stdbuf -o0 cat enb_' + self.testCase_id + '.log | egrep --text --color=never -i "wait|sync|Starting|Started"', '\$', 4)
|
||||||
if rruCheck:
|
if rruCheck:
|
||||||
result = re.search('wait RUs', mySSH.getBefore())
|
result = re.search('wait RUs', mySSH.getBefore())
|
||||||
else:
|
else:
|
||||||
|
|||||||
@@ -580,16 +580,42 @@ function report_build {
|
|||||||
sca_summary_table_row ./archives/cppcheck/cppcheck.xml "Expression depends on order of evaluation of side effects" unknownEvaluationOrder
|
sca_summary_table_row ./archives/cppcheck/cppcheck.xml "Expression depends on order of evaluation of side effects" unknownEvaluationOrder
|
||||||
sca_summary_table_footer ./archives/cppcheck/cppcheck.xml
|
sca_summary_table_footer ./archives/cppcheck/cppcheck.xml
|
||||||
|
|
||||||
summary_table_header "OAI Build: 4G LTE eNB -- USRP option" ./archives/enb_usrp
|
# summary_table_header "OAI Build: 4G LTE eNB -- USRP option" ./archives/enb_usrp
|
||||||
summary_table_row "LTE SoftModem - Release 15" ./archives/enb_usrp/lte-softmodem.Rel15.txt "Built target lte-softmodem" ./enb_usrp_row1.html
|
# summary_table_row "LTE SoftModem - Release 15" ./archives/enb_usrp/lte-softmodem.Rel15.txt "Built target lte-softmodem" ./enb_usrp_row1.html
|
||||||
summary_table_row "Coding - Release 15" ./archives/enb_usrp/coding.Rel15.txt "Built target coding" ./enb_usrp_row2.html
|
# summary_table_row "Coding - Release 15" ./archives/enb_usrp/coding.Rel15.txt "Built target coding" ./enb_usrp_row2.html
|
||||||
summary_table_row "OAI USRP device if - Release 15" ./archives/enb_usrp/oai_usrpdevif.Rel15.txt "Built target oai_usrpdevif" ./enb_usrp_row3.html
|
# summary_table_row "OAI USRP device if - Release 15" ./archives/enb_usrp/oai_usrpdevif.Rel15.txt "Built target oai_usrpdevif" ./enb_usrp_row3.html
|
||||||
summary_table_row "OAI ETHERNET transport - Release 15" ./archives/enb_usrp/oai_eth_transpro.Rel15.txt "Built target oai_eth_transpro" ./enb_usrp_row4.html
|
# summary_table_row "OAI ETHERNET transport - Release 15" ./archives/enb_usrp/oai_eth_transpro.Rel15.txt "Built target oai_eth_transpro" ./enb_usrp_row4.html
|
||||||
summary_table_row "Parameters Lib Config - Release 15" ./archives/enb_usrp/params_libconfig.Rel15.txt "Built target params_libconfig" ./enb_usrp_row5.html
|
# summary_table_row "Parameters Lib Config - Release 15" ./archives/enb_usrp/params_libconfig.Rel15.txt "Built target params_libconfig" ./enb_usrp_row5.html
|
||||||
summary_table_row "NASMESH - Release 15" ./archives/enb_usrp/nasmesh.Rel15.txt "Built target nasmesh" ./enb_usrp_row6.html
|
# summary_table_row "NASMESH - Release 15" ./archives/enb_usrp/nasmesh.Rel15.txt "Built target nasmesh" ./enb_usrp_row6.html
|
||||||
summary_table_row "RB Tool - Release 15" ./archives/enb_usrp/rb_tool.Rel15.txt "Built target rb_tool" ./enb_usrp_row7.html
|
# summary_table_row "RB Tool - Release 15" ./archives/enb_usrp/rb_tool.Rel15.txt "Built target rb_tool" ./enb_usrp_row7.html
|
||||||
summary_table_row "RF Simulator - Release 15" ./archives/enb_usrp/rfsimulator.Rel15.txt "Built target rfsimulator" ./enb_usrp_row8.html
|
# summary_table_row "RF Simulator - Release 15" ./archives/enb_usrp/rfsimulator.Rel15.txt "Built target rfsimulator" ./enb_usrp_row8.html
|
||||||
summary_table_row "TCP Bridge - Release 15" ./archives/enb_usrp/tcp_bridge_oai.Rel15.txt "Built target tcp_bridge_oai" ./enb_usrp_row9.html
|
# summary_table_row "TCP Bridge - Release 15" ./archives/enb_usrp/tcp_bridge_oai.Rel15.txt "Built target tcp_bridge_oai" ./enb_usrp_row9.html
|
||||||
|
# summary_table_footer
|
||||||
|
#
|
||||||
|
summary_table_header "OAI Build: 4G LTE eNB -- USRP option" ./archives/enb_eth
|
||||||
|
summary_table_row "LTE SoftModem - Release 15" ./archives/enb_eth/lte-softmodem.Rel15.txt "Built target lte-softmodem" ./enb_eth_row1.html
|
||||||
|
summary_table_row "Coding - Release 15" ./archives/enb_eth/coding.Rel15.txt "Built target coding" ./enb_eth_row2.html
|
||||||
|
summary_table_row "OAI ETHERNET transport - Release 15" ./archives/enb_eth/oai_eth_transpro.Rel15.txt "Built target oai_eth_transpro" ./enb_eth_row3.html
|
||||||
|
summary_table_row "Parameters Lib Config - Release 15" ./archives/enb_eth/params_libconfig.Rel15.txt "Built target params_libconfig" ./enb_eth_row4.html
|
||||||
|
summary_table_row "RF Simulator - Release 15" ./archives/enb_eth/rfsimulator.Rel15.txt "Built target rfsimulator" ./enb_eth_row5.html
|
||||||
|
summary_table_row "TCP OAI Bridge - Release 15" ./archives/enb_eth/tcp_bridge_oai.Rel15.txt "Built target tcp_bridge_oai" ./enb_eth_row6.html
|
||||||
|
summary_table_row "OAI USRP device if - Release 15" ./archives/enb_eth/oai_usrpdevif.Rel15.txt "Built target oai_usrpdevif" ./enb_eth_row7.html
|
||||||
|
summary_table_row "NASMESH - Release 15" ./archives/enb_eth/nasmesh.Rel15.txt "Built target nasmesh" ./enb_eth_row8.html
|
||||||
|
summary_table_row "RB Tool - Release 15" ./archives/enb_eth/rb_tool.Rel15.txt "Built target rb_tool" ./enb_eth_row9.html
|
||||||
|
summary_table_footer
|
||||||
|
|
||||||
|
summary_table_header "OAI Build: 4G LTE UE -- USRP option" ./archives/ue_eth
|
||||||
|
summary_table_row "LTE UE SoftModem - Release 15" ./archives/ue_eth/lte-uesoftmodem.Rel15.txt "Built target lte-uesoftmodem" ./ue_eth_row1.html
|
||||||
|
summary_table_row "Coding - Release 15" ./archives/ue_eth/coding.Rel15.txt "Built target coding" ./ue_eth_row2.html
|
||||||
|
summary_table_row "OAI ETHERNET transport - Release 15" ./archives/ue_eth/oai_eth_transpro.Rel15.txt "Built target oai_eth_transpro" ./ue_eth_row3.html
|
||||||
|
summary_table_row "Parameters Lib Config - Release 15" ./archives/ue_eth/params_libconfig.Rel15.txt "Built target params_libconfig" ./ue_eth_row4.html
|
||||||
|
summary_table_row "RF Simulator - Release 15" ./archives/ue_eth/rfsimulator.Rel15.txt "Built target rfsimulator" ./ue_eth_row5.html
|
||||||
|
summary_table_row "TCP OAI Bridge - Release 15" ./archives/ue_eth/tcp_bridge_oai.Rel15.txt "Built target tcp_bridge_oai" ./ue_eth_row6.html
|
||||||
|
summary_table_row "Conf 2 UE Data - Release 15" ./archives/ue_eth/conf2uedata.Rel15.txt "Built target conf2uedata" ./ue_eth_row7.html
|
||||||
|
summary_table_row "NVRAM - Release 15" ./archives/ue_eth/nvram.Rel15.txt "Built target nvram" ./ue_eth_row8.html
|
||||||
|
summary_table_row "UE IP - Release 15" ./archives/ue_eth/ue_ip.Rel15.txt "Built target ue_ip" ./ue_eth_row9.html
|
||||||
|
summary_table_row "USIM - Release 15" ./archives/ue_eth/usim.Rel15.txt "Built target usim" ./ue_eth_row9a.html
|
||||||
|
summary_table_row "OAI USRP device if - Release 15" ./archives/ue_eth/oai_usrpdevif.Rel15.txt "Built target oai_usrpdevif" ./ue_eth_row9b.html
|
||||||
summary_table_footer
|
summary_table_footer
|
||||||
|
|
||||||
summary_table_header "OAI Build: 4G LTE basic simulator option" ./archives/basic_sim
|
summary_table_header "OAI Build: 4G LTE basic simulator option" ./archives/basic_sim
|
||||||
@@ -676,28 +702,6 @@ function report_build {
|
|||||||
summary_table_footer
|
summary_table_footer
|
||||||
fi
|
fi
|
||||||
|
|
||||||
summary_table_header "OAI Build: 4G LTE eNB -- ETHERNET transport option" ./archives/enb_eth
|
|
||||||
summary_table_row "LTE SoftModem - Release 15" ./archives/enb_eth/lte-softmodem.Rel15.txt "Built target lte-softmodem" ./enb_eth_row1.html
|
|
||||||
summary_table_row "Coding - Release 15" ./archives/enb_eth/coding.Rel15.txt "Built target coding" ./enb_eth_row2.html
|
|
||||||
summary_table_row "OAI ETHERNET transport - Release 15" ./archives/enb_eth/oai_eth_transpro.Rel15.txt "Built target oai_eth_transpro" ./enb_eth_row3.html
|
|
||||||
summary_table_row "Parameters Lib Config - Release 15" ./archives/enb_eth/params_libconfig.Rel15.txt "Built target params_libconfig" ./enb_eth_row4.html
|
|
||||||
summary_table_row "RF Simulator - Release 15" ./archives/enb_eth/rfsimulator.Rel15.txt "Built target rfsimulator" ./enb_eth_row5.html
|
|
||||||
summary_table_row "TCP OAI Bridge - Release 15" ./archives/enb_eth/tcp_bridge_oai.Rel15.txt "Built target tcp_bridge_oai" ./enb_eth_row6.html
|
|
||||||
summary_table_footer
|
|
||||||
|
|
||||||
summary_table_header "OAI Build: 4G LTE UE -- ETHERNET transport option" ./archives/ue_eth
|
|
||||||
summary_table_row "LTE UE SoftModem - Release 15" ./archives/ue_eth/lte-uesoftmodem.Rel15.txt "Built target lte-uesoftmodem" ./ue_eth_row1.html
|
|
||||||
summary_table_row "Coding - Release 15" ./archives/ue_eth/coding.Rel15.txt "Built target coding" ./ue_eth_row2.html
|
|
||||||
summary_table_row "OAI ETHERNET transport - Release 15" ./archives/ue_eth/oai_eth_transpro.Rel15.txt "Built target oai_eth_transpro" ./ue_eth_row3.html
|
|
||||||
summary_table_row "Parameters Lib Config - Release 15" ./archives/ue_eth/params_libconfig.Rel15.txt "Built target params_libconfig" ./ue_eth_row4.html
|
|
||||||
summary_table_row "RF Simulator - Release 15" ./archives/ue_eth/rfsimulator.Rel15.txt "Built target rfsimulator" ./ue_eth_row5.html
|
|
||||||
summary_table_row "TCP OAI Bridge - Release 15" ./archives/ue_eth/tcp_bridge_oai.Rel15.txt "Built target tcp_bridge_oai" ./ue_eth_row6.html
|
|
||||||
summary_table_row "Conf 2 UE Data - Release 15" ./archives/ue_eth/conf2uedata.Rel15.txt "Built target conf2uedata" ./ue_eth_row7.html
|
|
||||||
summary_table_row "NVRAM - Release 15" ./archives/ue_eth/nvram.Rel15.txt "Built target nvram" ./ue_eth_row8.html
|
|
||||||
summary_table_row "UE IP - Release 15" ./archives/ue_eth/ue_ip.Rel15.txt "Built target ue_ip" ./ue_eth_row9.html
|
|
||||||
summary_table_row "USIM - Release 15" ./archives/ue_eth/usim.Rel15.txt "Built target usim" ./ue_eth_row9a.html
|
|
||||||
summary_table_footer
|
|
||||||
|
|
||||||
if [ -e ./archives/red_hat ]
|
if [ -e ./archives/red_hat ]
|
||||||
then
|
then
|
||||||
echo " <h2>Red Hat Enterprise Linux Server release 7.6) -- Summary</h2>" >> ./build_results.html
|
echo " <h2>Red Hat Enterprise Linux Server release 7.6) -- Summary</h2>" >> ./build_results.html
|
||||||
@@ -714,9 +718,23 @@ function report_build {
|
|||||||
echo " <button data-toggle=\"collapse\" data-target=\"#oai-compilation-details\">Details for Compilation Errors and Warnings </button>" >> ./build_results.html
|
echo " <button data-toggle=\"collapse\" data-target=\"#oai-compilation-details\">Details for Compilation Errors and Warnings </button>" >> ./build_results.html
|
||||||
echo " <div id=\"oai-compilation-details\" class=\"collapse\">" >> ./build_results.html
|
echo " <div id=\"oai-compilation-details\" class=\"collapse\">" >> ./build_results.html
|
||||||
|
|
||||||
if [ -f ./enb_usrp_row1.html ] || [ -f ./enb_usrp_row2.html ] || [ -f ./enb_usrp_row3.html ] || [ -f ./enb_usrp_row4.html ]
|
# if [ -f ./enb_usrp_row1.html ] || [ -f ./enb_usrp_row2.html ] || [ -f ./enb_usrp_row3.html ] || [ -f ./enb_usrp_row4.html ]
|
||||||
|
# then
|
||||||
|
# for DETAILS_TABLE in `ls ./enb_usrp_row*.html`
|
||||||
|
# do
|
||||||
|
# cat $DETAILS_TABLE >> ./build_results.html
|
||||||
|
# done
|
||||||
|
# fi
|
||||||
|
if [ -f ./enb_eth_row1.html ] || [ -f ./enb_eth_row2.html ] || [ -f ./enb_eth_row3.html ] || [ -f ./enb_eth_row4.html ] || [ -f ./enb_eth_row5.html ] || [ -f ./enb_eth_row6.html ] || [ -f ./enb_eth_row7.html ] || [ -f ./enb_eth_row8.html ] || [ -f ./enb_eth_row9.html ]
|
||||||
then
|
then
|
||||||
for DETAILS_TABLE in `ls ./enb_usrp_row*.html`
|
for DETAILS_TABLE in `ls ./enb_eth_row*.html`
|
||||||
|
do
|
||||||
|
cat $DETAILS_TABLE >> ./build_results.html
|
||||||
|
done
|
||||||
|
fi
|
||||||
|
if [ -f ./ue_eth_row1.html ] || [ -f ./ue_eth_row2.html ] || [ -f ./ue_eth_row3.html ] || [ -f ./ue_eth_row4.html ] || [ -f ./ue_eth_row5.html ] || [ -f ./ue_eth_row6.html ] || [ -f ./ue_eth_row7.html ] || [ -f ./ue_eth_row8.html ] || [ -f ./ue_eth_row9.html ] || [ -f ./ue_eth_row9a.html ] || [ -f ./ue_eth_row9b.html ]
|
||||||
|
then
|
||||||
|
for DETAILS_TABLE in `ls ./ue_eth_row*.html`
|
||||||
do
|
do
|
||||||
cat $DETAILS_TABLE >> ./build_results.html
|
cat $DETAILS_TABLE >> ./build_results.html
|
||||||
done
|
done
|
||||||
@@ -749,20 +767,6 @@ function report_build {
|
|||||||
cat $DETAILS_TABLE >> ./build_results.html
|
cat $DETAILS_TABLE >> ./build_results.html
|
||||||
done
|
done
|
||||||
fi
|
fi
|
||||||
if [ -f ./enb_eth_row1.html ] || [ -f ./enb_eth_row2.html ] || [ -f ./enb_eth_row3.html ] || [ -f ./enb_eth_row4.html ] || [ -f ./enb_eth_row5.html ] || [ -f ./enb_eth_row6.html ]
|
|
||||||
then
|
|
||||||
for DETAILS_TABLE in `ls ./enb_eth_row*.html`
|
|
||||||
do
|
|
||||||
cat $DETAILS_TABLE >> ./build_results.html
|
|
||||||
done
|
|
||||||
fi
|
|
||||||
if [ -f ./ue_eth_row1.html ] || [ -f ./ue_eth_row2.html ] || [ -f ./ue_eth_row3.html ] || [ -f ./ue_eth_row4.html ] || [ -f ./ue_eth_row5.html ] || [ -f ./ue_eth_row6.html ]
|
|
||||||
then
|
|
||||||
for DETAILS_TABLE in `ls ./ue_eth_row*.html`
|
|
||||||
do
|
|
||||||
cat $DETAILS_TABLE >> ./build_results.html
|
|
||||||
done
|
|
||||||
fi
|
|
||||||
if [ -f ./enb_usrp_rh_row1.html ] || [ -f ./enb_usrp_rh_row2.html ] || [ -f ./enb_usrp_rh_row3.html ] || [ -f ./enb_usrp_rh_row4.html ]
|
if [ -f ./enb_usrp_rh_row1.html ] || [ -f ./enb_usrp_rh_row2.html ] || [ -f ./enb_usrp_rh_row3.html ] || [ -f ./enb_usrp_rh_row4.html ]
|
||||||
then
|
then
|
||||||
for DETAILS_TABLE in `ls ./enb_usrp_rh_row*.html`
|
for DETAILS_TABLE in `ls ./enb_usrp_rh_row*.html`
|
||||||
|
|||||||
@@ -750,6 +750,77 @@ function report_test {
|
|||||||
|
|
||||||
EPC_CONFIGS=("noS1")
|
EPC_CONFIGS=("noS1")
|
||||||
TRANS_MODES=("tdd")
|
TRANS_MODES=("tdd")
|
||||||
|
FR_MODE=("FR2")
|
||||||
|
BW_CASES=(32)
|
||||||
|
for CN_CONFIG in ${EPC_CONFIGS[@]}
|
||||||
|
do
|
||||||
|
for TMODE in ${TRANS_MODES[@]}
|
||||||
|
do
|
||||||
|
for BW in ${BW_CASES[@]}
|
||||||
|
do
|
||||||
|
echo " <tr bgcolor = \"#8FBC8F\" >" >> ./test_simulator_results.html
|
||||||
|
if [[ $CN_CONFIG =~ .*wS1.* ]]
|
||||||
|
then
|
||||||
|
echo " <td align = \"center\" colspan = 4 >Test with EPC (aka withS1): ${TMODE} -- ${BW}PRB -- ${FR_MODE}</td>" >> ./test_simulator_results.html
|
||||||
|
else
|
||||||
|
echo " <td align = \"center\" colspan = 4 >Test without EPC (aka noS1): ${TMODE} -- ${BW}PRB -- ${FR_MODE}</td>" >> ./test_simulator_results.html
|
||||||
|
fi
|
||||||
|
echo " </tr>" >> ./test_simulator_results.html
|
||||||
|
|
||||||
|
|
||||||
|
#FR2 RA test (--do-ra option)
|
||||||
|
|
||||||
|
#build log files names tdd_${PRB}prb_${CN_CONFIG}_gnb_ra_fr2_test.log
|
||||||
|
|
||||||
|
RA_ENB_LOG=$ARCHIVES_LOC/${TMODE}_${BW}prb_${CN_CONFIG}_gnb_ra_fr2_test.log
|
||||||
|
RA_UE_LOG=$ARCHIVES_LOC/${TMODE}_${BW}prb_${CN_CONFIG}_ue_ra_fr2_test.log
|
||||||
|
if [ -f $RA_ENB_LOG ] && [ -f $RA_UE_LOG ]
|
||||||
|
then
|
||||||
|
#get rid of full path
|
||||||
|
NAME_ENB=`echo $RA_ENB_LOG | sed -e "s#$ARCHIVES_LOC/##"`
|
||||||
|
NAME_UE=`echo $RA_UE_LOG | sed -e "s#$ARCHIVES_LOC/##"`
|
||||||
|
echo " <tr>" >> ./test_simulator_results.html
|
||||||
|
echo " <td>$NAME_ENB --- $NAME_UE</td>" >> ./test_simulator_results.html
|
||||||
|
echo " <td>Check if FR2 RA proc succeeded</td>" >> ./test_simulator_results.html
|
||||||
|
|
||||||
|
#gNB RA check
|
||||||
|
GNB_RECEIVED=`egrep -c "\[RAPROC\] PUSCH with TC_RNTI (.+) received correctly" $RA_ENB_LOG`
|
||||||
|
#UE RA check
|
||||||
|
UE_RA_PROC_OK=`egrep -c "\[RAPROC\] RA procedure succeeded" $RA_UE_LOG`
|
||||||
|
|
||||||
|
|
||||||
|
if [ $GNB_RECEIVED -gt 0 ] && [ $UE_RA_PROC_OK -gt 0 ]
|
||||||
|
then
|
||||||
|
echo " <td bgcolor = \"green\" >OK</td>" >> ./test_simulator_results.html
|
||||||
|
else
|
||||||
|
echo " <td bgcolor = \"red\" >KO</td>" >> ./test_simulator_results.html
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo " <td><pre>" >> ./test_simulator_results.html
|
||||||
|
if [ $GNB_RECEIVED -gt 0 ]
|
||||||
|
then
|
||||||
|
echo "<font color = \"blue\">- gNB --> RA received</font>" >> ./test_simulator_results.html
|
||||||
|
else
|
||||||
|
echo "<font color = \"red\"><b>- gNB RA NOT RECEIVED</b></font>" >> ./test_simulator_results.html
|
||||||
|
fi
|
||||||
|
if [ $UE_RA_PROC_OK -gt 0 ]
|
||||||
|
then
|
||||||
|
echo "<font color = \"blue\">- NR UE --> RA procedure succeded</font>" >> ./test_simulator_results.html
|
||||||
|
else
|
||||||
|
echo "<font color = \"red\"><b>- NR UE RA procedure failed</b></font>" >> ./test_simulator_results.html
|
||||||
|
fi
|
||||||
|
echo " </pre></td>" >> ./test_simulator_results.html
|
||||||
|
echo " </tr>" >> ./test_simulator_results.html
|
||||||
|
fi
|
||||||
|
|
||||||
|
done
|
||||||
|
done
|
||||||
|
done
|
||||||
|
|
||||||
|
|
||||||
|
EPC_CONFIGS=("noS1")
|
||||||
|
FR_MODE=("FR1")
|
||||||
|
TRANS_MODES=("fdd" "tdd")
|
||||||
BW_CASES=(106)
|
BW_CASES=(106)
|
||||||
for CN_CONFIG in ${EPC_CONFIGS[@]}
|
for CN_CONFIG in ${EPC_CONFIGS[@]}
|
||||||
do
|
do
|
||||||
@@ -760,13 +831,14 @@ function report_test {
|
|||||||
echo " <tr bgcolor = \"#8FBC8F\" >" >> ./test_simulator_results.html
|
echo " <tr bgcolor = \"#8FBC8F\" >" >> ./test_simulator_results.html
|
||||||
if [[ $CN_CONFIG =~ .*wS1.* ]]
|
if [[ $CN_CONFIG =~ .*wS1.* ]]
|
||||||
then
|
then
|
||||||
echo " <td align = \"center\" colspan = 4 >Test with EPC (aka withS1): ${TMODE} -- ${BW}PRB </td>" >> ./test_simulator_results.html
|
echo " <td align = \"center\" colspan = 4 >Test with EPC (aka withS1): ${TMODE} -- ${BW}PRB -- ${FR_MODE}</td>" >> ./test_simulator_results.html
|
||||||
else
|
else
|
||||||
echo " <td align = \"center\" colspan = 4 >Test without EPC (aka noS1): ${TMODE} -- ${BW}PRB </td>" >> ./test_simulator_results.html
|
echo " <td align = \"center\" colspan = 4 >Test without EPC (aka noS1): ${TMODE} -- ${BW}PRB -- ${FR_MODE}</td>" >> ./test_simulator_results.html
|
||||||
fi
|
fi
|
||||||
echo " </tr>" >> ./test_simulator_results.html
|
echo " </tr>" >> ./test_simulator_results.html
|
||||||
|
|
||||||
#RA test (--do-ra option)
|
|
||||||
|
#FR1 RA test (--do-ra option)
|
||||||
|
|
||||||
#build log files names
|
#build log files names
|
||||||
RA_ENB_LOG=$ARCHIVES_LOC/${TMODE}_${BW}prb_${CN_CONFIG}_gnb_ra_test.log
|
RA_ENB_LOG=$ARCHIVES_LOC/${TMODE}_${BW}prb_${CN_CONFIG}_gnb_ra_test.log
|
||||||
@@ -778,7 +850,7 @@ function report_test {
|
|||||||
NAME_UE=`echo $RA_UE_LOG | sed -e "s#$ARCHIVES_LOC/##"`
|
NAME_UE=`echo $RA_UE_LOG | sed -e "s#$ARCHIVES_LOC/##"`
|
||||||
echo " <tr>" >> ./test_simulator_results.html
|
echo " <tr>" >> ./test_simulator_results.html
|
||||||
echo " <td>$NAME_ENB --- $NAME_UE</td>" >> ./test_simulator_results.html
|
echo " <td>$NAME_ENB --- $NAME_UE</td>" >> ./test_simulator_results.html
|
||||||
echo " <td>Check if RA proc succeeded</td>" >> ./test_simulator_results.html
|
echo " <td>Check if FR1 RA proc succeeded</td>" >> ./test_simulator_results.html
|
||||||
|
|
||||||
#gNB RA check
|
#gNB RA check
|
||||||
GNB_RECEIVED=`egrep -c "\[RAPROC\] PUSCH with TC_RNTI (.+) received correctly" $RA_ENB_LOG`
|
GNB_RECEIVED=`egrep -c "\[RAPROC\] PUSCH with TC_RNTI (.+) received correctly" $RA_ENB_LOG`
|
||||||
|
|||||||
+146
-29
@@ -379,7 +379,7 @@ function check_iperf {
|
|||||||
local LOC_IS_DL=`echo $LOC_BASE_LOG | grep -c _dl`
|
local LOC_IS_DL=`echo $LOC_BASE_LOG | grep -c _dl`
|
||||||
local LOC_IS_BASIC_SIM=`echo $LOC_BASE_LOG | grep -c basic_sim`
|
local LOC_IS_BASIC_SIM=`echo $LOC_BASE_LOG | grep -c basic_sim`
|
||||||
local LOC_IS_RF_SIM=`echo $LOC_BASE_LOG | grep -c rf_sim`
|
local LOC_IS_RF_SIM=`echo $LOC_BASE_LOG | grep -c rf_sim`
|
||||||
local LOC_IS_NR=`echo $LOC_BASE_LOG | grep -c tdd_106prb`
|
local LOC_IS_NR=`echo $LOC_BASE_LOG | grep -c _106prb`
|
||||||
if [ -f ${LOC_BASE_LOG}_client.txt ]
|
if [ -f ${LOC_BASE_LOG}_client.txt ]
|
||||||
then
|
then
|
||||||
local FILE_COMPLETE=`egrep -c "Server Report" ${LOC_BASE_LOG}_client.txt`
|
local FILE_COMPLETE=`egrep -c "Server Report" ${LOC_BASE_LOG}_client.txt`
|
||||||
@@ -2189,11 +2189,15 @@ function run_test_on_vm {
|
|||||||
|
|
||||||
if [[ "$RUN_OPTIONS" == "complex" ]] && [[ $VM_NAME =~ .*-rf-sim.* ]]
|
if [[ "$RUN_OPTIONS" == "complex" ]] && [[ $VM_NAME =~ .*-rf-sim.* ]]
|
||||||
then
|
then
|
||||||
|
echo "############################################################"
|
||||||
|
echo "RA TEST FR2"
|
||||||
|
echo "############################################################"
|
||||||
|
#RA FR2 test, attention : has a different config file from the rest of the test
|
||||||
CN_CONFIG="noS1"
|
CN_CONFIG="noS1"
|
||||||
CONF_FILE=gnb.band78.tm1.106PRB.usrpn300.conf
|
CONF_FILE=gnb.band261.tm1.32PRB.usrpn300.conf
|
||||||
S1_NOS1_CFG=0
|
S1_NOS1_CFG=0
|
||||||
PRB=106
|
PRB=32
|
||||||
FREQUENCY=3510
|
FREQUENCY=28000 #28GHz
|
||||||
|
|
||||||
if [ ! -d $ARCHIVES_LOC ]
|
if [ ! -d $ARCHIVES_LOC ]
|
||||||
then
|
then
|
||||||
@@ -2208,20 +2212,20 @@ function run_test_on_vm {
|
|||||||
do
|
do
|
||||||
|
|
||||||
SYNC_STATUS=0
|
SYNC_STATUS=0
|
||||||
RA_STATUS=0
|
RA_FR2_STATUS=0
|
||||||
rm -f $ARCHIVES_LOC/tdd_${PRB}prb_${CN_CONFIG}*ra_test.log
|
rm -f $ARCHIVES_LOC/tdd_${PRB}prb_${CN_CONFIG}*ra_fr2_test.log
|
||||||
|
|
||||||
echo "############################################################"
|
echo "############################################################"
|
||||||
echo "${CN_CONFIG} : Starting the gNB"
|
echo "${CN_CONFIG} : Starting the gNB"
|
||||||
echo "############################################################"
|
echo "############################################################"
|
||||||
CURRENT_GNB_LOG_FILE=tdd_${PRB}prb_${CN_CONFIG}_gnb_ra_test.log
|
CURRENT_GNB_LOG_FILE=tdd_${PRB}prb_${CN_CONFIG}_gnb_ra_fr2_test.log
|
||||||
#last argument = 1 is to enable --do-ra for RA test
|
#last argument = 1 is to enable --do-ra for RA test
|
||||||
start_rf_sim_gnb $GNB_VM_CMDS "$GNB_VM_IP_ADDR" $CURRENT_GNB_LOG_FILE $PRB $CONF_FILE $S1_NOS1_CFG 1
|
start_rf_sim_gnb $GNB_VM_CMDS "$GNB_VM_IP_ADDR" $CURRENT_GNB_LOG_FILE $PRB $CONF_FILE $S1_NOS1_CFG 1
|
||||||
|
|
||||||
echo "############################################################"
|
echo "############################################################"
|
||||||
echo "${CN_CONFIG} : Starting the NR-UE"
|
echo "${CN_CONFIG} : Starting the NR-UE"
|
||||||
echo "############################################################"
|
echo "############################################################"
|
||||||
CURRENT_NR_UE_LOG_FILE=tdd_${PRB}prb_${CN_CONFIG}_ue_ra_test.log
|
CURRENT_NR_UE_LOG_FILE=tdd_${PRB}prb_${CN_CONFIG}_ue_ra_fr2_test.log
|
||||||
#last argument = 1 is to enable --do-ra for RA test
|
#last argument = 1 is to enable --do-ra for RA test
|
||||||
start_rf_sim_nr_ue $NR_UE_VM_CMDS $NR_UE_VM_IP_ADDR $GNB_VM_IP_ADDR $CURRENT_NR_UE_LOG_FILE $PRB $FREQUENCY $S1_NOS1_CFG 1
|
start_rf_sim_nr_ue $NR_UE_VM_CMDS $NR_UE_VM_IP_ADDR $GNB_VM_IP_ADDR $CURRENT_NR_UE_LOG_FILE $PRB $FREQUENCY $S1_NOS1_CFG 1
|
||||||
if [ $NR_UE_SYNC -eq 0 ]
|
if [ $NR_UE_SYNC -eq 0 ]
|
||||||
@@ -2247,48 +2251,159 @@ function run_test_on_vm {
|
|||||||
|
|
||||||
#check RA markers in gNB and NR UE log files
|
#check RA markers in gNB and NR UE log files
|
||||||
echo "############################################################"
|
echo "############################################################"
|
||||||
echo "${CN_CONFIG} : Checking RA on gNB / NR-UE"
|
echo "${CN_CONFIG} : Checking FR2 RA on gNB / NR-UE"
|
||||||
echo "############################################################"
|
echo "############################################################"
|
||||||
|
|
||||||
# Proper check to be done when RA test is working!
|
# Proper check to be done when RA test is working!
|
||||||
check_ra_result $ARCHIVES_LOC/$CURRENT_GNB_LOG_FILE $ARCHIVES_LOC/$CURRENT_NR_UE_LOG_FILE
|
check_ra_result $ARCHIVES_LOC/$CURRENT_GNB_LOG_FILE $ARCHIVES_LOC/$CURRENT_NR_UE_LOG_FILE
|
||||||
if [ $RA_STATUS -ne 0 ]
|
if [ $RA_FR2_STATUS -ne 0 ]
|
||||||
then
|
then
|
||||||
echo "RA test NOT OK"
|
echo "RA FR2 test NOT OK"
|
||||||
echo "try_cnt = " $try_cnt
|
echo "try_cnt = " $try_cnt
|
||||||
try_cnt=$((try_cnt+1))
|
try_cnt=$((try_cnt+1))
|
||||||
else
|
else
|
||||||
try_cnt=$((try_cnt+10))
|
try_cnt=$((try_cnt+10))
|
||||||
fi
|
fi
|
||||||
done
|
done
|
||||||
|
########### end RA FR2 test
|
||||||
|
|
||||||
|
sleep 30
|
||||||
|
|
||||||
|
|
||||||
|
echo "############################################################"
|
||||||
|
echo "RA TEST FR1"
|
||||||
|
echo "############################################################"
|
||||||
|
######### redefine config for the rest of the test
|
||||||
|
|
||||||
|
CN_CONFIG="noS1"
|
||||||
|
CONF_FILE=gnb.band78.tm1.106PRB.usrpn300.conf
|
||||||
|
S1_NOS1_CFG=0
|
||||||
|
PRB=106
|
||||||
|
FREQUENCY=3510
|
||||||
|
|
||||||
|
if [ ! -d $ARCHIVES_LOC ]
|
||||||
|
then
|
||||||
|
mkdir --parents $ARCHIVES_LOC
|
||||||
|
fi
|
||||||
|
|
||||||
|
CN_CONFIG="noS1"
|
||||||
|
S1_NOS1_CFG=0
|
||||||
|
|
||||||
|
######### start of RA TEST loop
|
||||||
|
# for the moment only TDD
|
||||||
|
TRANS_MODES=("tdd")
|
||||||
|
for TMODE in ${TRANS_MODES[@]}
|
||||||
|
do
|
||||||
|
if [[ $TMODE =~ .*fdd.* ]]
|
||||||
|
then
|
||||||
|
CONF_FILE=gnb.band66.tm1.106PRB.usrpn300.conf
|
||||||
|
PRB=106
|
||||||
|
FREQUENCY=37000
|
||||||
|
else
|
||||||
|
CONF_FILE=gnb.band78.tm1.106PRB.usrpn300.conf
|
||||||
|
PRB=106
|
||||||
|
FREQUENCY=3510
|
||||||
|
fi
|
||||||
|
|
||||||
|
local try_cnt=0
|
||||||
|
NR_STATUS=0
|
||||||
|
while [ $try_cnt -lt 5 ] #5 because it hardly succeed within CI
|
||||||
|
|
||||||
|
do
|
||||||
|
SYNC_STATUS=0
|
||||||
|
RA_STATUS=0
|
||||||
|
rm -f $ARCHIVES_LOC/${TMODE}_${PRB}prb_${CN_CONFIG}*ra_test.log
|
||||||
|
|
||||||
|
echo "############################################################"
|
||||||
|
echo "${CN_CONFIG} : Starting the gNB in ${TMODE} mode (RA TEST)"
|
||||||
|
echo "############################################################"
|
||||||
|
CURRENT_GNB_LOG_FILE=${TMODE}_${PRB}prb_${CN_CONFIG}_gnb_ra_test.log
|
||||||
|
#last argument = 1 is to enable --do-ra for RA test
|
||||||
|
start_rf_sim_gnb $GNB_VM_CMDS "$GNB_VM_IP_ADDR" $CURRENT_GNB_LOG_FILE $PRB $CONF_FILE $S1_NOS1_CFG 1
|
||||||
|
|
||||||
|
echo "############################################################"
|
||||||
|
echo "${CN_CONFIG} : Starting the NR-UE in ${TMODE} mode (RA TEST)"
|
||||||
|
echo "############################################################"
|
||||||
|
CURRENT_NR_UE_LOG_FILE=${TMODE}_${PRB}prb_${CN_CONFIG}_ue_ra_test.log
|
||||||
|
#last argument = 1 is to enable --do-ra for RA test
|
||||||
|
start_rf_sim_nr_ue $NR_UE_VM_CMDS $NR_UE_VM_IP_ADDR $GNB_VM_IP_ADDR $CURRENT_NR_UE_LOG_FILE $PRB $FREQUENCY $S1_NOS1_CFG 1
|
||||||
|
if [ $NR_UE_SYNC -eq 0 ]
|
||||||
|
then
|
||||||
|
echo "Problem w/ gNB and NR-UE not syncing"
|
||||||
|
terminate_enb_ue_basic_sim $NR_UE_VM_CMDS $NR_UE_VM_IP_ADDR 2
|
||||||
|
terminate_enb_ue_basic_sim $GNB_VM_CMDS $GNB_VM_IP_ADDR 1
|
||||||
|
scp -o StrictHostKeyChecking=no ubuntu@$GNB_VM_IP_ADDR:/home/ubuntu/tmp/cmake_targets/log/$CURRENT_GNB_LOG_FILE $ARCHIVES_LOC
|
||||||
|
scp -o StrictHostKeyChecking=no ubuntu@$NR_UE_VM_IP_ADDR:/home/ubuntu/tmp/cmake_targets/log/$CURRENT_NR_UE_LOG_FILE $ARCHIVES_LOC
|
||||||
|
SYNC_STATUS=-1
|
||||||
|
try_cnt=$((try_cnt+1))
|
||||||
|
continue
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo "############################################################"
|
||||||
|
echo "${CN_CONFIG} : Terminate gNB/NR-UE simulators"
|
||||||
|
echo "############################################################"
|
||||||
|
sleep 20
|
||||||
|
terminate_enb_ue_basic_sim $NR_UE_VM_CMDS $NR_UE_VM_IP_ADDR 2
|
||||||
|
terminate_enb_ue_basic_sim $GNB_VM_CMDS $GNB_VM_IP_ADDR 1
|
||||||
|
scp -o StrictHostKeyChecking=no ubuntu@$GNB_VM_IP_ADDR:/home/ubuntu/tmp/cmake_targets/log/$CURRENT_GNB_LOG_FILE $ARCHIVES_LOC
|
||||||
|
scp -o StrictHostKeyChecking=no ubuntu@$NR_UE_VM_IP_ADDR:/home/ubuntu/tmp/cmake_targets/log/$CURRENT_NR_UE_LOG_FILE $ARCHIVES_LOC
|
||||||
|
|
||||||
|
#check RA markers in gNB and NR UE log files
|
||||||
|
echo "############################################################"
|
||||||
|
echo "${CN_CONFIG} : Checking FR1 RA on gNB / NR-UE"
|
||||||
|
echo "############################################################"
|
||||||
|
|
||||||
|
# Proper check to be done when RA test is working!
|
||||||
|
check_ra_result $ARCHIVES_LOC/$CURRENT_GNB_LOG_FILE $ARCHIVES_LOC/$CURRENT_NR_UE_LOG_FILE
|
||||||
|
if [ $RA_STATUS -ne 0 ]
|
||||||
|
then
|
||||||
|
echo "RA FR1 test NOT OK"
|
||||||
|
echo "try_cnt = " $try_cnt
|
||||||
|
try_cnt=$((try_cnt+1))
|
||||||
|
else
|
||||||
|
try_cnt=$((try_cnt+10))
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
done
|
||||||
########### end RA test
|
########### end RA test
|
||||||
|
|
||||||
sleep 30
|
sleep 30
|
||||||
|
|
||||||
|
|
||||||
######### start of PHY TEST loop
|
######### start of PHY TEST loop
|
||||||
try_cnt=0
|
SYNC_STATUS=0
|
||||||
while [ $try_cnt -lt 4 ]
|
PING_STATUS=0
|
||||||
|
IPERF_STATUS=0
|
||||||
|
TRANS_MODES=("fdd tdd")
|
||||||
|
for TMODE in ${TRANS_MODES[@]}
|
||||||
do
|
do
|
||||||
|
if [[ $TMODE =~ .*fdd.* ]]
|
||||||
|
then
|
||||||
|
CONF_FILE=gnb.band66.tm1.106PRB.usrpn300.conf
|
||||||
|
PRB=106
|
||||||
|
FREQUENCY=37000
|
||||||
|
else
|
||||||
|
CONF_FILE=gnb.band78.tm1.106PRB.usrpn300.conf
|
||||||
|
PRB=106
|
||||||
|
FREQUENCY=3510
|
||||||
|
fi
|
||||||
|
|
||||||
|
try_cnt=0
|
||||||
SYNC_STATUS=0
|
while [ $try_cnt -lt 4 ]
|
||||||
PING_STATUS=0
|
do
|
||||||
IPERF_STATUS=0
|
rm -f $ARCHIVES_LOC/${TMODE}_${PRB}prb_${CN_CONFIG}_gnb.log $ARCHIVES_LOC/${TMODE}_${PRB}prb_${CN_CONFIG}_ue.log
|
||||||
rm -f $ARCHIVES_LOC/tdd_${PRB}prb_${CN_CONFIG}_gnb.log $ARCHIVES_LOC/tdd_${PRB}prb_${CN_CONFIG}_ue.log
|
rm -f $ARCHIVES_LOC/${TMODE}_${PRB}prb_${CN_CONFIG}_ping_gnb_from_nrue.log $ARCHIVES_LOC/${TMODE}_${PRB}prb_${CN_CONFIG}_ping_from_gnb_nrue.log
|
||||||
rm -f $ARCHIVES_LOC/tdd_${PRB}prb_${CN_CONFIG}_ping_gnb_from_nrue.log $ARCHIVES_LOC/tdd_${PRB}prb_${CN_CONFIG}_ping_from_gnb_nrue.log
|
rm -f $ARCHIVES_LOC/${TMODE}_${PRB}prb_${CN_CONFIG}_iperf_dl*txt $ARCHIVES_LOC/${TMODE}_${PRB}prb_${CN_CONFIG}_iperf_ul*txt
|
||||||
rm -f $ARCHIVES_LOC/tdd_${PRB}prb_${CN_CONFIG}_iperf_dl*txt $ARCHIVES_LOC/tdd_${PRB}prb_${CN_CONFIG}_iperf_ul*txt
|
|
||||||
|
|
||||||
echo "############################################################"
|
echo "############################################################"
|
||||||
echo "${CN_CONFIG} : Starting the gNB"
|
echo "${CN_CONFIG} : Starting the gNB in ${TMODE} mode (PHY TEST)"
|
||||||
echo "############################################################"
|
echo "############################################################"
|
||||||
CURRENT_GNB_LOG_FILE=tdd_${PRB}prb_${CN_CONFIG}_gnb.log
|
CURRENT_GNB_LOG_FILE=${TMODE}_${PRB}prb_${CN_CONFIG}_gnb.log
|
||||||
start_rf_sim_gnb $GNB_VM_CMDS "$GNB_VM_IP_ADDR" $CURRENT_GNB_LOG_FILE $PRB $CONF_FILE $S1_NOS1_CFG 0
|
start_rf_sim_gnb $GNB_VM_CMDS "$GNB_VM_IP_ADDR" $CURRENT_GNB_LOG_FILE $PRB $CONF_FILE $S1_NOS1_CFG 0
|
||||||
|
|
||||||
echo "############################################################"
|
echo "############################################################"
|
||||||
echo "${CN_CONFIG} : Starting the NR-UE"
|
echo "${CN_CONFIG} : Starting the NR-UE in ${TMODE} mode (PHY TEST)"
|
||||||
echo "############################################################"
|
echo "############################################################"
|
||||||
CURRENT_NR_UE_LOG_FILE=tdd_${PRB}prb_${CN_CONFIG}_ue.log
|
CURRENT_NR_UE_LOG_FILE=${TMODE}_${PRB}prb_${CN_CONFIG}_ue.log
|
||||||
start_rf_sim_nr_ue $NR_UE_VM_CMDS $NR_UE_VM_IP_ADDR $GNB_VM_IP_ADDR $CURRENT_NR_UE_LOG_FILE $PRB $FREQUENCY $S1_NOS1_CFG 0
|
start_rf_sim_nr_ue $NR_UE_VM_CMDS $NR_UE_VM_IP_ADDR $GNB_VM_IP_ADDR $CURRENT_NR_UE_LOG_FILE $PRB $FREQUENCY $S1_NOS1_CFG 0
|
||||||
if [ $NR_UE_SYNC -eq 0 ]
|
if [ $NR_UE_SYNC -eq 0 ]
|
||||||
then
|
then
|
||||||
@@ -2306,7 +2421,7 @@ function run_test_on_vm {
|
|||||||
echo "${CN_CONFIG} : Pinging the gNB from NR-UE"
|
echo "${CN_CONFIG} : Pinging the gNB from NR-UE"
|
||||||
echo "############################################################"
|
echo "############################################################"
|
||||||
get_enb_noS1_ip_addr $GNB_VM_CMDS $GNB_VM_IP_ADDR
|
get_enb_noS1_ip_addr $GNB_VM_CMDS $GNB_VM_IP_ADDR
|
||||||
PING_LOG_FILE=tdd_${PRB}prb_${CN_CONFIG}_ping_gnb_from_nrue.log
|
PING_LOG_FILE=${TMODE}_${PRB}prb_${CN_CONFIG}_ping_gnb_from_nrue.log
|
||||||
ping_epc_ip_addr $NR_UE_VM_CMDS $NR_UE_VM_IP_ADDR $ENB_IP_ADDR $PING_LOG_FILE 1 0
|
ping_epc_ip_addr $NR_UE_VM_CMDS $NR_UE_VM_IP_ADDR $ENB_IP_ADDR $PING_LOG_FILE 1 0
|
||||||
scp -o StrictHostKeyChecking=no ubuntu@$NR_UE_VM_IP_ADDR:/home/ubuntu/$PING_LOG_FILE $ARCHIVES_LOC
|
scp -o StrictHostKeyChecking=no ubuntu@$NR_UE_VM_IP_ADDR:/home/ubuntu/$PING_LOG_FILE $ARCHIVES_LOC
|
||||||
check_ping_result $ARCHIVES_LOC/$PING_LOG_FILE 20
|
check_ping_result $ARCHIVES_LOC/$PING_LOG_FILE 20
|
||||||
@@ -2315,7 +2430,7 @@ function run_test_on_vm {
|
|||||||
echo "${CN_CONFIG} : Pinging the NR-UE from gNB"
|
echo "${CN_CONFIG} : Pinging the NR-UE from gNB"
|
||||||
echo "############################################################"
|
echo "############################################################"
|
||||||
get_ue_ip_addr $NR_UE_VM_CMDS $NR_UE_VM_IP_ADDR 1
|
get_ue_ip_addr $NR_UE_VM_CMDS $NR_UE_VM_IP_ADDR 1
|
||||||
PING_LOG_FILE=tdd_${PRB}prb_${CN_CONFIG}_ping_from_gnb_nrue.log
|
PING_LOG_FILE=${TMODE}_${PRB}prb_${CN_CONFIG}_ping_from_gnb_nrue.log
|
||||||
ping_enb_ip_addr $GNB_VM_CMDS $GNB_VM_IP_ADDR $UE_IP_ADDR $PING_LOG_FILE 0
|
ping_enb_ip_addr $GNB_VM_CMDS $GNB_VM_IP_ADDR $UE_IP_ADDR $PING_LOG_FILE 0
|
||||||
scp -o StrictHostKeyChecking=no ubuntu@$GNB_VM_IP_ADDR:/home/ubuntu/$PING_LOG_FILE $ARCHIVES_LOC
|
scp -o StrictHostKeyChecking=no ubuntu@$GNB_VM_IP_ADDR:/home/ubuntu/$PING_LOG_FILE $ARCHIVES_LOC
|
||||||
check_ping_result $ARCHIVES_LOC/$PING_LOG_FILE 20
|
check_ping_result $ARCHIVES_LOC/$PING_LOG_FILE 20
|
||||||
@@ -2324,7 +2439,7 @@ function run_test_on_vm {
|
|||||||
echo "${CN_CONFIG} : iperf DL -- NR-UE is server and gNB is client"
|
echo "${CN_CONFIG} : iperf DL -- NR-UE is server and gNB is client"
|
||||||
echo "############################################################"
|
echo "############################################################"
|
||||||
THROUGHPUT="30K"
|
THROUGHPUT="30K"
|
||||||
CURR_IPERF_LOG_BASE=tdd_${PRB}prb_${CN_CONFIG}_iperf_dl
|
CURR_IPERF_LOG_BASE=${TMODE}_${PRB}prb_${CN_CONFIG}_iperf_dl
|
||||||
get_enb_noS1_ip_addr $GNB_VM_CMDS $GNB_VM_IP_ADDR
|
get_enb_noS1_ip_addr $GNB_VM_CMDS $GNB_VM_IP_ADDR
|
||||||
get_ue_ip_addr $NR_UE_VM_CMDS $NR_UE_VM_IP_ADDR 1
|
get_ue_ip_addr $NR_UE_VM_CMDS $NR_UE_VM_IP_ADDR 1
|
||||||
generic_iperf $NR_UE_VM_CMDS $NR_UE_VM_IP_ADDR $UE_IP_ADDR $GNB_VM_CMDS $GNB_VM_IP_ADDR $ENB_IP_ADDR $THROUGHPUT $CURR_IPERF_LOG_BASE 1 0
|
generic_iperf $NR_UE_VM_CMDS $NR_UE_VM_IP_ADDR $UE_IP_ADDR $GNB_VM_CMDS $GNB_VM_IP_ADDR $ENB_IP_ADDR $THROUGHPUT $CURR_IPERF_LOG_BASE 1 0
|
||||||
@@ -2346,7 +2461,7 @@ function run_test_on_vm {
|
|||||||
echo "${CN_CONFIG} : iperf UL -- gNB is server and NR-UE is client"
|
echo "${CN_CONFIG} : iperf UL -- gNB is server and NR-UE is client"
|
||||||
echo "############################################################"
|
echo "############################################################"
|
||||||
THROUGHPUT="30K"
|
THROUGHPUT="30K"
|
||||||
CURR_IPERF_LOG_BASE=tdd_${PRB}prb_${CN_CONFIG}_iperf_ul
|
CURR_IPERF_LOG_BASE=${TMODE}_${PRB}prb_${CN_CONFIG}_iperf_ul
|
||||||
get_enb_noS1_ip_addr $GNB_VM_CMDS $GNB_VM_IP_ADDR
|
get_enb_noS1_ip_addr $GNB_VM_CMDS $GNB_VM_IP_ADDR
|
||||||
get_ue_ip_addr $NR_UE_VM_CMDS $NR_UE_VM_IP_ADDR 1
|
get_ue_ip_addr $NR_UE_VM_CMDS $NR_UE_VM_IP_ADDR 1
|
||||||
generic_iperf $GNB_VM_CMDS $GNB_VM_IP_ADDR $ENB_IP_ADDR $NR_UE_VM_CMDS $NR_UE_VM_IP_ADDR $UE_IP_ADDR $THROUGHPUT $CURR_IPERF_LOG_BASE 1 0
|
generic_iperf $GNB_VM_CMDS $GNB_VM_IP_ADDR $ENB_IP_ADDR $NR_UE_VM_CMDS $NR_UE_VM_IP_ADDR $UE_IP_ADDR $THROUGHPUT $CURR_IPERF_LOG_BASE 1 0
|
||||||
@@ -2368,6 +2483,7 @@ function run_test_on_vm {
|
|||||||
else
|
else
|
||||||
try_cnt=$((try_cnt+10))
|
try_cnt=$((try_cnt+10))
|
||||||
fi
|
fi
|
||||||
|
done
|
||||||
done
|
done
|
||||||
######### end of loop
|
######### end of loop
|
||||||
full_l2_sim_destroy
|
full_l2_sim_destroy
|
||||||
@@ -2377,6 +2493,7 @@ function run_test_on_vm {
|
|||||||
echo "Checking run status"
|
echo "Checking run status"
|
||||||
echo "############################################################"
|
echo "############################################################"
|
||||||
|
|
||||||
|
if [ $RA_FR2_STATUS -ne 0 ]; then NR_STATUS=-1; fi
|
||||||
if [ $RA_STATUS -ne 0 ]; then NR_STATUS=-1; fi
|
if [ $RA_STATUS -ne 0 ]; then NR_STATUS=-1; fi
|
||||||
if [ $SYNC_STATUS -ne 0 ]; then NR_STATUS=-1; fi
|
if [ $SYNC_STATUS -ne 0 ]; then NR_STATUS=-1; fi
|
||||||
if [ $PING_STATUS -ne 0 ]; then NR_STATUS=-1; fi
|
if [ $PING_STATUS -ne 0 ]; then NR_STATUS=-1; fi
|
||||||
|
|||||||
@@ -47,6 +47,12 @@ function wait_on_vm_build {
|
|||||||
echo "ARCHIVES_LOC = $ARCHIVES_LOC"
|
echo "ARCHIVES_LOC = $ARCHIVES_LOC"
|
||||||
echo "BUILD_OPTIONS = $BUILD_OPTIONS"
|
echo "BUILD_OPTIONS = $BUILD_OPTIONS"
|
||||||
|
|
||||||
|
if [[ "$VM_NAME" == *"-enb-usrp"* ]]
|
||||||
|
then
|
||||||
|
echo "This VM type is no longer supported in the pipeline framework"
|
||||||
|
return
|
||||||
|
fi
|
||||||
|
|
||||||
IS_VM_ALIVE=`uvt-kvm list | grep -c $VM_NAME`
|
IS_VM_ALIVE=`uvt-kvm list | grep -c $VM_NAME`
|
||||||
|
|
||||||
if [ $IS_VM_ALIVE -eq 0 ]
|
if [ $IS_VM_ALIVE -eq 0 ]
|
||||||
@@ -84,6 +90,12 @@ function wait_on_vm_build {
|
|||||||
}
|
}
|
||||||
|
|
||||||
function check_on_vm_build {
|
function check_on_vm_build {
|
||||||
|
if [[ "$VM_NAME" == *"-enb-usrp"* ]]
|
||||||
|
then
|
||||||
|
echo "This VM type is no longer supported in the pipeline framework"
|
||||||
|
return
|
||||||
|
fi
|
||||||
|
|
||||||
echo "############################################################"
|
echo "############################################################"
|
||||||
echo "Creating a tmp folder to store results and artifacts"
|
echo "Creating a tmp folder to store results and artifacts"
|
||||||
echo "############################################################"
|
echo "############################################################"
|
||||||
|
|||||||
+18
-41
@@ -21,57 +21,34 @@
|
|||||||
|
|
||||||
-->
|
-->
|
||||||
<testCaseList>
|
<testCaseList>
|
||||||
<htmlTabRef>test-fr1-tm1</htmlTabRef>
|
<htmlTabRef>build-tab</htmlTabRef>
|
||||||
<htmlTabName>Test-FR1-TM1</htmlTabName>
|
<htmlTabName>Build</htmlTabName>
|
||||||
<htmlTabIcon>tasks</htmlTabIcon>
|
<htmlTabIcon>wrench</htmlTabIcon>
|
||||||
<repeatCount>1</repeatCount>
|
|
||||||
<TestCaseRequestedList>
|
<TestCaseRequestedList>
|
||||||
030000
|
000001 000002
|
||||||
040000
|
|
||||||
000001
|
|
||||||
070001
|
|
||||||
070000
|
|
||||||
</TestCaseRequestedList>
|
</TestCaseRequestedList>
|
||||||
<TestCaseExclusionList>
|
<TestCaseExclusionList></TestCaseExclusionList>
|
||||||
</TestCaseExclusionList>
|
|
||||||
|
|
||||||
<testCase id="030000">
|
|
||||||
<class>Initialize_eNB</class>
|
|
||||||
<desc>Initialize eNB</desc>
|
|
||||||
<Initialize_eNB_args>-O ci-scripts/conf_files/enb.band7.tm1.fr1.25PRB.usrpb210.conf</Initialize_eNB_args>
|
|
||||||
<eNB_instance>0</eNB_instance>
|
|
||||||
<eNB_serverId>0</eNB_serverId>
|
|
||||||
<air_interface>lte</air_interface>
|
|
||||||
</testCase>
|
|
||||||
|
|
||||||
<testCase id="040000">
|
|
||||||
<class>Initialize_eNB</class>
|
|
||||||
<desc>Initialize gNB (3/4 sampling rate)</desc>
|
|
||||||
<Initialize_eNB_args>-O ci-scripts/conf_files/gnb.band78.tm1.fr1.106PRB.usrpb210.conf -E</Initialize_eNB_args>
|
|
||||||
<eNB_instance>1</eNB_instance>
|
|
||||||
<eNB_serverId>1</eNB_serverId>
|
|
||||||
<air_interface>nr</air_interface>
|
|
||||||
</testCase>
|
|
||||||
|
|
||||||
<testCase id="000001">
|
<testCase id="000001">
|
||||||
<class>IdleSleep</class>
|
<class>Build_eNB</class>
|
||||||
<desc>Sleep</desc>
|
<desc>Build eNB</desc>
|
||||||
<idle_sleep_time_in_sec>30</idle_sleep_time_in_sec>
|
<Build_eNB_args>--eNB -t benetel4g -w None</Build_eNB_args>
|
||||||
</testCase>
|
<forced_workspace_cleanup>True</forced_workspace_cleanup>
|
||||||
|
|
||||||
<testCase id="070000">
|
|
||||||
<class>Terminate_eNB</class>
|
|
||||||
<desc>Terminate eNB</desc>
|
|
||||||
<eNB_instance>0</eNB_instance>
|
<eNB_instance>0</eNB_instance>
|
||||||
<eNB_serverId>0</eNB_serverId>
|
<eNB_serverId>0</eNB_serverId>
|
||||||
</testCase>
|
</testCase>
|
||||||
|
|
||||||
<testCase id="070001">
|
|
||||||
<class>Terminate_eNB</class>
|
<testCase id="000002">
|
||||||
<desc>Terminate gNB</desc>
|
<class>Build_eNB</class>
|
||||||
|
<desc>Build gNB</desc>
|
||||||
|
<Build_eNB_args>--gNB -t benetel5g -w None</Build_eNB_args>
|
||||||
|
<forced_workspace_cleanup>True</forced_workspace_cleanup>
|
||||||
<eNB_instance>1</eNB_instance>
|
<eNB_instance>1</eNB_instance>
|
||||||
<eNB_serverId>1</eNB_serverId>
|
<eNB_serverId>1</eNB_serverId>
|
||||||
</testCase>
|
</testCase>
|
||||||
|
|
||||||
</testCaseList>
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
</testCaseList>
|
||||||
@@ -0,0 +1,162 @@
|
|||||||
|
<!--
|
||||||
|
|
||||||
|
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-FR1-TM1</htmlTabRef>
|
||||||
|
<htmlTabName>FR1</htmlTabName>
|
||||||
|
<htmlTabIcon>tasks</htmlTabIcon>
|
||||||
|
<TestCaseRequestedList>
|
||||||
|
010000
|
||||||
|
030000
|
||||||
|
040000
|
||||||
|
010001
|
||||||
|
000001
|
||||||
|
050000
|
||||||
|
050001
|
||||||
|
000001
|
||||||
|
060000
|
||||||
|
060001
|
||||||
|
000001
|
||||||
|
070000
|
||||||
|
070001
|
||||||
|
010002
|
||||||
|
000001
|
||||||
|
080001
|
||||||
|
080000
|
||||||
|
010003
|
||||||
|
</TestCaseRequestedList>
|
||||||
|
<TestCaseExclusionList></TestCaseExclusionList>
|
||||||
|
|
||||||
|
<testCase id="010000">
|
||||||
|
<class>Initialize_UE</class>
|
||||||
|
<desc>Initialize UE</desc>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
<testCase id="010003">
|
||||||
|
<class>Terminate_UE</class>
|
||||||
|
<desc>Terminate UE</desc>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
<testCase id="010001">
|
||||||
|
<class>Attach_UE</class>
|
||||||
|
<desc>Attach UE</desc>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
<testCase id="010002">
|
||||||
|
<class>Detach_UE</class>
|
||||||
|
<desc>Detach UE</desc>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
|
||||||
|
<testCase id="030000">
|
||||||
|
<class>Initialize_eNB</class>
|
||||||
|
<desc>Initialize eNB</desc>
|
||||||
|
<Initialize_eNB_args>-O ci-scripts/conf_files/benetel-4g.conf</Initialize_eNB_args>
|
||||||
|
<eNB_instance>0</eNB_instance>
|
||||||
|
<eNB_serverId>0</eNB_serverId>
|
||||||
|
<air_interface>lte</air_interface>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
|
||||||
|
<testCase id="040000">
|
||||||
|
<class>Initialize_eNB</class>
|
||||||
|
<desc>Initialize gNB</desc>
|
||||||
|
<Initialize_eNB_args>-O ci-scripts/conf_files/benetel-5g.conf</Initialize_eNB_args>
|
||||||
|
<eNB_instance>1</eNB_instance>
|
||||||
|
<eNB_serverId>1</eNB_serverId>
|
||||||
|
<air_interface>nr</air_interface>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
<testCase id="000001">
|
||||||
|
<class>IdleSleep</class>
|
||||||
|
<desc>Sleep</desc>
|
||||||
|
<idle_sleep_time_in_sec>20</idle_sleep_time_in_sec>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
<testCase id="050000">
|
||||||
|
<class>Ping</class>
|
||||||
|
<desc>Ping: 20pings in 20sec</desc>
|
||||||
|
<ping_args>-c 20</ping_args>
|
||||||
|
<ping_packetloss_threshold>50</ping_packetloss_threshold>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
<testCase id="050001">
|
||||||
|
<class>Ping</class>
|
||||||
|
<desc>Ping: 100pings in 20sec</desc>
|
||||||
|
<ping_args>-c 100 -i 0.2</ping_args>
|
||||||
|
<ping_packetloss_threshold>50</ping_packetloss_threshold>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
|
||||||
|
<testCase id="060000">
|
||||||
|
<class>Iperf</class>
|
||||||
|
<desc>iperf (DL/2.5Mbps/UDP)(60 sec)(single-ue profile)</desc>
|
||||||
|
<iperf_args>-u -b 2.5M -t 60 -i 1</iperf_args>
|
||||||
|
<iperf_packetloss_threshold>50</iperf_packetloss_threshold>
|
||||||
|
<iperf_profile>single-ue</iperf_profile>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
<testCase id="060001">
|
||||||
|
<class>Iperf</class>
|
||||||
|
<desc>iperf (UL/1.5Mbps/UDP)(60 sec)(single-ue profile)</desc>
|
||||||
|
<iperf_args>-u -b 1.5M -t 60 -i 1 -R</iperf_args>
|
||||||
|
<iperf_packetloss_threshold>50</iperf_packetloss_threshold>
|
||||||
|
<iperf_profile>single-ue</iperf_profile>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
|
||||||
|
<testCase id="070000">
|
||||||
|
<class>Iperf</class>
|
||||||
|
<desc>iperf (DL/20Mbps/UDP)(20 sec)(single-ue profile)</desc>
|
||||||
|
<iperf_args>-u -b 20M -t 20 -i 1</iperf_args>
|
||||||
|
<iperf_packetloss_threshold>50</iperf_packetloss_threshold>
|
||||||
|
<iperf_profile>single-ue</iperf_profile>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
<testCase id="070001">
|
||||||
|
<class>Iperf</class>
|
||||||
|
<desc>iperf (UL/3Mbps/UDP)(20 sec)(single-ue profile)</desc>
|
||||||
|
<iperf_args>-u -b 3M -t 20 -i 1 -R</iperf_args>
|
||||||
|
<iperf_packetloss_threshold>50</iperf_packetloss_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>
|
||||||
|
|
||||||
+2
-2
@@ -22,7 +22,7 @@
|
|||||||
-->
|
-->
|
||||||
<testCaseList>
|
<testCaseList>
|
||||||
<htmlTabRef>build-tab</htmlTabRef>
|
<htmlTabRef>build-tab</htmlTabRef>
|
||||||
<htmlTabName>Build</htmlTabName>
|
<htmlTabName>Build Container Images</htmlTabName>
|
||||||
<htmlTabIcon>wrench</htmlTabIcon>
|
<htmlTabIcon>wrench</htmlTabIcon>
|
||||||
<TestCaseRequestedList>
|
<TestCaseRequestedList>
|
||||||
000001
|
000001
|
||||||
@@ -31,7 +31,7 @@
|
|||||||
|
|
||||||
<testCase id="000001">
|
<testCase id="000001">
|
||||||
<class>Build_Image</class>
|
<class>Build_Image</class>
|
||||||
<desc>Build eNB Image</desc>
|
<desc>Build all Images</desc>
|
||||||
<kind>all</kind>
|
<kind>all</kind>
|
||||||
<eNB_instance>0</eNB_instance>
|
<eNB_instance>0</eNB_instance>
|
||||||
<eNB_serverId>0</eNB_serverId>
|
<eNB_serverId>0</eNB_serverId>
|
||||||
@@ -37,6 +37,7 @@
|
|||||||
<eNB_instance>0</eNB_instance>
|
<eNB_instance>0</eNB_instance>
|
||||||
<eNB_serverId>0</eNB_serverId>
|
<eNB_serverId>0</eNB_serverId>
|
||||||
<backgroundBuild>True</backgroundBuild>
|
<backgroundBuild>True</backgroundBuild>
|
||||||
|
<forced_workspace_cleanup>True</forced_workspace_cleanup>
|
||||||
</testCase>
|
</testCase>
|
||||||
|
|
||||||
<testCase id="000004">
|
<testCase id="000004">
|
||||||
@@ -53,6 +54,7 @@
|
|||||||
<eNB_instance>1</eNB_instance>
|
<eNB_instance>1</eNB_instance>
|
||||||
<eNB_serverId>1</eNB_serverId>
|
<eNB_serverId>1</eNB_serverId>
|
||||||
<backgroundBuild>True</backgroundBuild>
|
<backgroundBuild>True</backgroundBuild>
|
||||||
|
<forced_workspace_cleanup>True</forced_workspace_cleanup>
|
||||||
</testCase>
|
</testCase>
|
||||||
|
|
||||||
<testCase id="000003">
|
<testCase id="000003">
|
||||||
|
|||||||
@@ -21,8 +21,8 @@
|
|||||||
|
|
||||||
-->
|
-->
|
||||||
<testCaseList>
|
<testCaseList>
|
||||||
<htmlTabRef>TEST-FR1-TM1</htmlTabRef>
|
<htmlTabRef>TEST-NSA-FR1-TM1</htmlTabRef>
|
||||||
<htmlTabName>FR1</htmlTabName>
|
<htmlTabName>NSA FULL</htmlTabName>
|
||||||
<htmlTabIcon>tasks</htmlTabIcon>
|
<htmlTabIcon>tasks</htmlTabIcon>
|
||||||
<TestCaseRequestedList>
|
<TestCaseRequestedList>
|
||||||
010000
|
010000
|
||||||
@@ -31,14 +31,17 @@
|
|||||||
010001
|
010001
|
||||||
000001
|
000001
|
||||||
050000
|
050000
|
||||||
|
050001
|
||||||
000001
|
000001
|
||||||
060000
|
060000
|
||||||
060001
|
060001
|
||||||
000001
|
000001
|
||||||
|
070000
|
||||||
|
070001
|
||||||
010002
|
010002
|
||||||
000001
|
000001
|
||||||
070001
|
080001
|
||||||
070000
|
080000
|
||||||
010003
|
010003
|
||||||
</TestCaseRequestedList>
|
</TestCaseRequestedList>
|
||||||
<TestCaseExclusionList></TestCaseExclusionList>
|
<TestCaseExclusionList></TestCaseExclusionList>
|
||||||
@@ -96,6 +99,13 @@
|
|||||||
<ping_packetloss_threshold>50</ping_packetloss_threshold>
|
<ping_packetloss_threshold>50</ping_packetloss_threshold>
|
||||||
</testCase>
|
</testCase>
|
||||||
|
|
||||||
|
<testCase id="050001">
|
||||||
|
<class>Ping</class>
|
||||||
|
<desc>Ping: 100pings in 20sec</desc>
|
||||||
|
<ping_args>-c 100 -i 0.2</ping_args>
|
||||||
|
<ping_packetloss_threshold>50</ping_packetloss_threshold>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
|
||||||
<testCase id="060000">
|
<testCase id="060000">
|
||||||
<class>Iperf</class>
|
<class>Iperf</class>
|
||||||
@@ -113,7 +123,26 @@
|
|||||||
<iperf_profile>single-ue</iperf_profile>
|
<iperf_profile>single-ue</iperf_profile>
|
||||||
</testCase>
|
</testCase>
|
||||||
|
|
||||||
|
|
||||||
<testCase id="070000">
|
<testCase id="070000">
|
||||||
|
<class>Iperf</class>
|
||||||
|
<desc>iperf (DL/20Mbps/UDP)(20 sec)(single-ue profile)</desc>
|
||||||
|
<iperf_args>-u -b 20M -t 20 -i 1</iperf_args>
|
||||||
|
<iperf_packetloss_threshold>50</iperf_packetloss_threshold>
|
||||||
|
<iperf_profile>single-ue</iperf_profile>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
<testCase id="070001">
|
||||||
|
<class>Iperf</class>
|
||||||
|
<desc>iperf (UL/3Mbps/UDP)(20 sec)(single-ue profile)</desc>
|
||||||
|
<iperf_args>-u -b 3M -t 20 -i 1 -R</iperf_args>
|
||||||
|
<iperf_packetloss_threshold>50</iperf_packetloss_threshold>
|
||||||
|
<iperf_profile>single-ue</iperf_profile>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<testCase id="080000">
|
||||||
<class>Terminate_eNB</class>
|
<class>Terminate_eNB</class>
|
||||||
<desc>Terminate eNB</desc>
|
<desc>Terminate eNB</desc>
|
||||||
<eNB_instance>0</eNB_instance>
|
<eNB_instance>0</eNB_instance>
|
||||||
@@ -121,7 +150,7 @@
|
|||||||
<air_interface>lte</air_interface>
|
<air_interface>lte</air_interface>
|
||||||
</testCase>
|
</testCase>
|
||||||
|
|
||||||
<testCase id="070001">
|
<testCase id="080001">
|
||||||
<class>Terminate_eNB</class>
|
<class>Terminate_eNB</class>
|
||||||
<desc>Terminate gNB</desc>
|
<desc>Terminate gNB</desc>
|
||||||
<eNB_instance>1</eNB_instance>
|
<eNB_instance>1</eNB_instance>
|
||||||
+29
-18
@@ -21,8 +21,8 @@
|
|||||||
|
|
||||||
-->
|
-->
|
||||||
<testCaseList>
|
<testCaseList>
|
||||||
<htmlTabRef>TEST-FR1-TM1</htmlTabRef>
|
<htmlTabRef>TEST-NSA-FR1-TM1</htmlTabRef>
|
||||||
<htmlTabName>FR1</htmlTabName>
|
<htmlTabName>NSA FULL</htmlTabName>
|
||||||
<htmlTabIcon>tasks</htmlTabIcon>
|
<htmlTabIcon>tasks</htmlTabIcon>
|
||||||
<TestCaseRequestedList>
|
<TestCaseRequestedList>
|
||||||
010000
|
010000
|
||||||
@@ -32,16 +32,15 @@
|
|||||||
000001
|
000001
|
||||||
050000
|
050000
|
||||||
050001
|
050001
|
||||||
050002
|
|
||||||
050002
|
|
||||||
000001
|
000001
|
||||||
060000
|
060000
|
||||||
060001
|
060001
|
||||||
000001
|
000001
|
||||||
|
070000
|
||||||
010002
|
010002
|
||||||
000001
|
000001
|
||||||
070001
|
080001
|
||||||
070000
|
080000
|
||||||
010003
|
010003
|
||||||
</TestCaseRequestedList>
|
</TestCaseRequestedList>
|
||||||
<TestCaseExclusionList></TestCaseExclusionList>
|
<TestCaseExclusionList></TestCaseExclusionList>
|
||||||
@@ -100,13 +99,6 @@
|
|||||||
</testCase>
|
</testCase>
|
||||||
|
|
||||||
<testCase id="050001">
|
<testCase id="050001">
|
||||||
<class>Ping</class>
|
|
||||||
<desc>Ping: 5pings in 1sec</desc>
|
|
||||||
<ping_args>-c 5 -i 0.2</ping_args>
|
|
||||||
<ping_packetloss_threshold>50</ping_packetloss_threshold>
|
|
||||||
</testCase>
|
|
||||||
|
|
||||||
<testCase id="050002">
|
|
||||||
<class>Ping</class>
|
<class>Ping</class>
|
||||||
<desc>Ping: 100pings in 20sec</desc>
|
<desc>Ping: 100pings in 20sec</desc>
|
||||||
<ping_args>-c 100 -i 0.2</ping_args>
|
<ping_args>-c 100 -i 0.2</ping_args>
|
||||||
@@ -116,21 +108,40 @@
|
|||||||
|
|
||||||
<testCase id="060000">
|
<testCase id="060000">
|
||||||
<class>Iperf</class>
|
<class>Iperf</class>
|
||||||
<desc>iperf (DL/1Mbps/UDP)(30 sec)(single-ue profile)</desc>
|
<desc>iperf (DL/3Mbps/UDP)(20 sec)(single-ue profile)</desc>
|
||||||
<iperf_args>-u -b 1M -t 30 -i 1</iperf_args>
|
<iperf_args>-u -b 3M -t 20 -i 1</iperf_args>
|
||||||
<iperf_packetloss_threshold>50</iperf_packetloss_threshold>
|
<iperf_packetloss_threshold>50</iperf_packetloss_threshold>
|
||||||
<iperf_profile>single-ue</iperf_profile>
|
<iperf_profile>single-ue</iperf_profile>
|
||||||
</testCase>
|
</testCase>
|
||||||
|
|
||||||
<testCase id="060001">
|
<testCase id="060001">
|
||||||
<class>Iperf</class>
|
<class>Iperf</class>
|
||||||
<desc>iperf (UL/1Mbps/UDP)(30 sec)(single-ue profile)</desc>
|
<desc>iperf (UL/1Mbps/UDP)(20 sec)(single-ue profile)</desc>
|
||||||
<iperf_args>-u -b 1M -t 30 -i 1 -R</iperf_args>
|
<iperf_args>-u -b 1M -t 20 -i 1 -R</iperf_args>
|
||||||
<iperf_packetloss_threshold>50</iperf_packetloss_threshold>
|
<iperf_packetloss_threshold>50</iperf_packetloss_threshold>
|
||||||
<iperf_profile>single-ue</iperf_profile>
|
<iperf_profile>single-ue</iperf_profile>
|
||||||
</testCase>
|
</testCase>
|
||||||
|
|
||||||
|
|
||||||
<testCase id="070000">
|
<testCase id="070000">
|
||||||
|
<class>Iperf</class>
|
||||||
|
<desc>iperf (DL/20Mbps/UDP)(20 sec)(single-ue profile)</desc>
|
||||||
|
<iperf_args>-u -b 20M -t 20 -i 1</iperf_args>
|
||||||
|
<iperf_packetloss_threshold>50</iperf_packetloss_threshold>
|
||||||
|
<iperf_profile>single-ue</iperf_profile>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
<testCase id="070001">
|
||||||
|
<class>Iperf</class>
|
||||||
|
<desc>iperf (UL/3Mbps/UDP)(20 sec)(single-ue profile)</desc>
|
||||||
|
<iperf_args>-u -b 3M -t 20 -i 1 -R</iperf_args>
|
||||||
|
<iperf_packetloss_threshold>50</iperf_packetloss_threshold>
|
||||||
|
<iperf_profile>single-ue</iperf_profile>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<testCase id="080000">
|
||||||
<class>Terminate_eNB</class>
|
<class>Terminate_eNB</class>
|
||||||
<desc>Terminate eNB</desc>
|
<desc>Terminate eNB</desc>
|
||||||
<eNB_instance>0</eNB_instance>
|
<eNB_instance>0</eNB_instance>
|
||||||
@@ -138,7 +149,7 @@
|
|||||||
<air_interface>lte</air_interface>
|
<air_interface>lte</air_interface>
|
||||||
</testCase>
|
</testCase>
|
||||||
|
|
||||||
<testCase id="070001">
|
<testCase id="080001">
|
||||||
<class>Terminate_eNB</class>
|
<class>Terminate_eNB</class>
|
||||||
<desc>Terminate gNB</desc>
|
<desc>Terminate gNB</desc>
|
||||||
<eNB_instance>1</eNB_instance>
|
<eNB_instance>1</eNB_instance>
|
||||||
@@ -333,6 +333,11 @@ else (CUDA_FOUND)
|
|||||||
)
|
)
|
||||||
endif ()
|
endif ()
|
||||||
|
|
||||||
|
if (SANITIZE_ADDRESS)
|
||||||
|
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fsanitize=address")
|
||||||
|
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fsanitize=address")
|
||||||
|
endif ()
|
||||||
|
|
||||||
add_definitions("-DASN_DISABLE_OER_SUPPORT")
|
add_definitions("-DASN_DISABLE_OER_SUPPORT")
|
||||||
|
|
||||||
#########################
|
#########################
|
||||||
@@ -832,7 +837,7 @@ add_library(F1AP
|
|||||||
|
|
||||||
# Hardware dependant options
|
# Hardware dependant options
|
||||||
###################################
|
###################################
|
||||||
add_list1_option(NB_ANTENNAS_RX "2" "Number of antennas in reception" "1" "2" "4")
|
add_list1_option(NB_ANTENNAS_RX "4" "Number of antennas in reception" "1" "2" "4")
|
||||||
add_list1_option(NB_ANTENNAS_TX "4" "Number of antennas in transmission" "1" "2" "4")
|
add_list1_option(NB_ANTENNAS_TX "4" "Number of antennas in transmission" "1" "2" "4")
|
||||||
|
|
||||||
add_list2_option(RF_BOARD "EXMIMO" "RF head type" "None" "OAI_USRP" "OAI_BLADERF" "OAI_LMSSDR" "OAI_SIMU")
|
add_list2_option(RF_BOARD "EXMIMO" "RF head type" "None" "OAI_USRP" "OAI_BLADERF" "OAI_LMSSDR" "OAI_SIMU")
|
||||||
@@ -926,6 +931,9 @@ set_target_properties(tcp_bridge_oai PROPERTIES COMPILE_FLAGS "-fvisibility=hidd
|
|||||||
# Benetel 4G library
|
# Benetel 4G library
|
||||||
######################################################################
|
######################################################################
|
||||||
|
|
||||||
|
|
||||||
|
include_directories ("/usr/include/dpdk")
|
||||||
|
|
||||||
set(HWLIB_BENETEL_4G_SOURCE
|
set(HWLIB_BENETEL_4G_SOURCE
|
||||||
${OPENAIR_TARGETS}/ARCH/ETHERNET/benetel/4g/benetel.c
|
${OPENAIR_TARGETS}/ARCH/ETHERNET/benetel/4g/benetel.c
|
||||||
${OPENAIR_TARGETS}/ARCH/ETHERNET/benetel/4g/shared_buffers.c
|
${OPENAIR_TARGETS}/ARCH/ETHERNET/benetel/4g/shared_buffers.c
|
||||||
@@ -1967,7 +1975,10 @@ set(NR_PDCP_SRC
|
|||||||
${OPENAIR2_DIR}/LAYER2/nr_pdcp/nr_pdcp_oai_api.c
|
${OPENAIR2_DIR}/LAYER2/nr_pdcp/nr_pdcp_oai_api.c
|
||||||
${OPENAIR2_DIR}/LAYER2/nr_pdcp/nr_pdcp_ue_manager.c
|
${OPENAIR2_DIR}/LAYER2/nr_pdcp/nr_pdcp_ue_manager.c
|
||||||
${OPENAIR2_DIR}/LAYER2/nr_pdcp/nr_pdcp_entity.c
|
${OPENAIR2_DIR}/LAYER2/nr_pdcp/nr_pdcp_entity.c
|
||||||
${OPENAIR2_DIR}/LAYER2/nr_pdcp/nr_pdcp_entity_drb_am.c
|
${OPENAIR2_DIR}/LAYER2/nr_pdcp/nr_pdcp_sdu.c
|
||||||
|
${OPENAIR2_DIR}/LAYER2/nr_pdcp/nr_pdcp_timer_thread.c
|
||||||
|
${OPENAIR2_DIR}/LAYER2/nr_pdcp/nr_pdcp_security_nea2.c
|
||||||
|
${OPENAIR2_DIR}/LAYER2/nr_pdcp/nr_pdcp_integrity_nia2.c
|
||||||
${OPENAIR2_DIR}/LAYER2/nr_pdcp/asn1_utils.c
|
${OPENAIR2_DIR}/LAYER2/nr_pdcp/asn1_utils.c
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -2132,7 +2143,23 @@ set (MCE_APP_SRC
|
|||||||
${OPENAIR2_DIR}/MCE_APP/mce_app.c
|
${OPENAIR2_DIR}/MCE_APP/mce_app.c
|
||||||
${OPENAIR2_DIR}/MCE_APP/mce_config.c
|
${OPENAIR2_DIR}/MCE_APP/mce_config.c
|
||||||
)
|
)
|
||||||
|
set (MISC_NFAPI_LTE
|
||||||
|
${OPENAIR1_DIR}/SCHED/nfapi_lte_dummy.c
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
add_library(MISC_NFAPI_LTE_LIB
|
||||||
|
${MISC_NFAPI_LTE}
|
||||||
|
)
|
||||||
|
|
||||||
|
set (MISC_NFAPI_NR
|
||||||
|
${OPENAIR1_DIR}/SCHED/nfapi_nr_dummy.c
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
add_library(MISC_NFAPI_NR_LIB
|
||||||
|
${MISC_NFAPI_NR}
|
||||||
|
)
|
||||||
add_library(L2
|
add_library(L2
|
||||||
${L2_SRC}
|
${L2_SRC}
|
||||||
${MAC_SRC}
|
${MAC_SRC}
|
||||||
@@ -2884,8 +2911,9 @@ add_dependencies(lte-softmodem rrc_flag s1ap_flag x2_flag oai_iqplayer)
|
|||||||
|
|
||||||
target_link_libraries (lte-softmodem
|
target_link_libraries (lte-softmodem
|
||||||
-Wl,--start-group
|
-Wl,--start-group
|
||||||
RRC_LIB NR_RRC_LIB S1AP_LIB S1AP_ENB F1AP_LIB F1AP M2AP_LIB M2AP_ENB X2AP_LIB X2AP_ENB M3AP_LIB M3AP_ENB SECU_CN SECU_OSA UTIL HASHTABLE SCTP_CLIENT MME_APP UDP SCHED_LIB SCHED_RU_LIB
|
|
||||||
PHY_COMMON PHY PHY_RU LFDS L2 L2_LTE ${GTPV1U} NFAPI_COMMON_LIB NFAPI_LIB NFAPI_VNF_LIB NFAPI_PNF_LIB NFAPI_USER_LIB LFDS7
|
RRC_LIB NR_RRC_LIB S1AP_LIB S1AP_ENB F1AP_LIB F1AP M2AP_LIB M2AP_ENB X2AP_LIB X2AP_ENB M3AP_LIB M3AP_ENB ${GTPV1U} SECU_CN SECU_OSA UTIL HASHTABLE SCTP_CLIENT MME_APP UDP SCHED_LIB SCHED_RU_LIB
|
||||||
|
PHY_COMMON PHY PHY_RU LFDS L2 L2_LTE NFAPI_COMMON_LIB NFAPI_LIB NFAPI_VNF_LIB NFAPI_PNF_LIB NFAPI_USER_LIB MISC_NFAPI_LTE_LIB LFDS7
|
||||||
${MSC_LIB} ${RAL_LIB} ${NAS_UE_LIB} ${ITTI_LIB} ${FLPT_MSG_LIB} ${ASYNC_IF_LIB} ${FLEXRAN_AGENT_LIB} ${FSPT_MSG_LIB} ${PROTO_AGENT_LIB}
|
${MSC_LIB} ${RAL_LIB} ${NAS_UE_LIB} ${ITTI_LIB} ${FLPT_MSG_LIB} ${ASYNC_IF_LIB} ${FLEXRAN_AGENT_LIB} ${FSPT_MSG_LIB} ${PROTO_AGENT_LIB}
|
||||||
-Wl,--end-group z dl)
|
-Wl,--end-group z dl)
|
||||||
|
|
||||||
@@ -2924,8 +2952,9 @@ add_dependencies(ocp-enb rrc_flag s1ap_flag x2_flag oai_iqplayer coding params_l
|
|||||||
|
|
||||||
target_link_libraries (ocp-enb
|
target_link_libraries (ocp-enb
|
||||||
-Wl,--start-group
|
-Wl,--start-group
|
||||||
|
|
||||||
RRC_LIB NR_RRC_LIB S1AP_LIB S1AP_ENB F1AP_LIB F1AP M2AP_LIB M2AP_ENB X2AP_LIB X2AP_ENB M3AP_LIB M3AP_ENB ${GTPV1U} SECU_CN SECU_OSA UTIL HASHTABLE SCTP_CLIENT MME_APP UDP SCHED_LIB SCHED_RU_LIB
|
RRC_LIB NR_RRC_LIB S1AP_LIB S1AP_ENB F1AP_LIB F1AP M2AP_LIB M2AP_ENB X2AP_LIB X2AP_ENB M3AP_LIB M3AP_ENB ${GTPV1U} SECU_CN SECU_OSA UTIL HASHTABLE SCTP_CLIENT MME_APP UDP SCHED_LIB SCHED_RU_LIB
|
||||||
PHY_COMMON PHY PHY_RU LFDS L2 L2_LTE NFAPI_COMMON_LIB NFAPI_LIB NFAPI_VNF_LIB NFAPI_PNF_LIB NFAPI_USER_LIB LFDS7 SIMU_COMMON
|
PHY_COMMON PHY PHY_RU LFDS L2 L2_LTE NFAPI_COMMON_LIB NFAPI_LIB MISC_NFAPI_LTE_LIB NFAPI_VNF_LIB NFAPI_PNF_LIB NFAPI_USER_LIB LFDS7 SIMU_COMMON
|
||||||
${MSC_LIB} ${RAL_LIB} ${NAS_UE_LIB} ${ITTI_LIB} ${FLPT_MSG_LIB} ${ASYNC_IF_LIB} ${FLEXRAN_AGENT_LIB} ${FSPT_MSG_LIB} ${PROTO_AGENT_LIB}
|
${MSC_LIB} ${RAL_LIB} ${NAS_UE_LIB} ${ITTI_LIB} ${FLPT_MSG_LIB} ${ASYNC_IF_LIB} ${FLEXRAN_AGENT_LIB} ${FSPT_MSG_LIB} ${PROTO_AGENT_LIB}
|
||||||
-Wl,--end-group z dl)
|
-Wl,--end-group z dl)
|
||||||
target_link_libraries (ocp-enb ${LIBXML2_LIBRARIES} pthread m ${CONFIG_LIBRARIES} rt crypt ${CRYPTO_LIBRARIES} ${OPENSSL_LIBRARIES} sctp ${PROTOBUF_LIB} ${CMAKE_DL_LIBS} ${LIBYAML_LIBRARIES} ${LIB_LMS_LIBRARIES} ${T_LIB})
|
target_link_libraries (ocp-enb ${LIBXML2_LIBRARIES} pthread m ${CONFIG_LIBRARIES} rt crypt ${CRYPTO_LIBRARIES} ${OPENSSL_LIBRARIES} sctp ${PROTOBUF_LIB} ${CMAKE_DL_LIBS} ${LIBYAML_LIBRARIES} ${LIB_LMS_LIBRARIES} ${T_LIB})
|
||||||
@@ -2994,8 +3023,9 @@ endif()
|
|||||||
target_link_libraries (lte-uesoftmodem
|
target_link_libraries (lte-uesoftmodem
|
||||||
-Wl,--start-group
|
-Wl,--start-group
|
||||||
RRC_LIB NR_RRC_LIB S1AP_LIB S1AP_ENB X2AP_LIB X2AP_ENB M2AP_LIB M2AP_ENB M3AP_LIB M3AP_ENB F1AP F1AP_LIB
|
RRC_LIB NR_RRC_LIB S1AP_LIB S1AP_ENB X2AP_LIB X2AP_ENB M2AP_LIB M2AP_ENB M3AP_LIB M3AP_ENB F1AP F1AP_LIB
|
||||||
|
|
||||||
${GTPV1U} SECU_CN SECU_OSA UTIL HASHTABLE SCTP_CLIENT MME_APP UDP SCHED_RU_LIB SCHED_UE_LIB PHY_COMMON
|
${GTPV1U} SECU_CN SECU_OSA UTIL HASHTABLE SCTP_CLIENT MME_APP UDP SCHED_RU_LIB SCHED_UE_LIB PHY_COMMON
|
||||||
PHY_UE PHY_RU LFDS L2_UE L2_LTE LFDS7 SIMU_COMMON SIMU NFAPI_COMMON_LIB NFAPI_LIB NFAPI_PNF_LIB NFAPI_USER_LIB
|
PHY_UE PHY_RU LFDS L2_UE L2_LTE LFDS7 SIMU_COMMON SIMU NFAPI_COMMON_LIB NFAPI_LIB NFAPI_PNF_LIB NFAPI_USER_LIB MISC_NFAPI_LTE_LIB
|
||||||
${MSC_LIB} ${RAL_LIB} ${NAS_UE_LIB} ${ITTI_LIB} ${FLPT_MSG_LIB} ${ASYNC_IF_LIB} ${ATLAS_LIBRARIES}
|
${MSC_LIB} ${RAL_LIB} ${NAS_UE_LIB} ${ITTI_LIB} ${FLPT_MSG_LIB} ${ASYNC_IF_LIB} ${ATLAS_LIBRARIES}
|
||||||
-Wl,--end-group z dl)
|
-Wl,--end-group z dl)
|
||||||
|
|
||||||
@@ -3119,6 +3149,8 @@ target_link_libraries (nr-uesoftmodem
|
|||||||
-Wl,--start-group
|
-Wl,--start-group
|
||||||
RRC_LIB NR_RRC_LIB NGAP_LIB NGAP_GNB SECU_CN SECU_OSA UTIL HASHTABLE SCTP_CLIENT UDP SCHED_RU_LIB SCHED_UE_LIB SCHED_NR_UE_LIB
|
RRC_LIB NR_RRC_LIB NGAP_LIB NGAP_GNB SECU_CN SECU_OSA UTIL HASHTABLE SCTP_CLIENT UDP SCHED_RU_LIB SCHED_UE_LIB SCHED_NR_UE_LIB
|
||||||
PHY_COMMON PHY_NR_COMMON PHY_UE PHY_NR_UE PHY_RU LFDS NR_L2_UE L2_UE_LTE_NR MAC_NR_COMMON NFAPI_COMMON_LIB NFAPI_LIB NFAPI_PNF_LIB
|
PHY_COMMON PHY_NR_COMMON PHY_UE PHY_NR_UE PHY_RU LFDS NR_L2_UE L2_UE_LTE_NR MAC_NR_COMMON NFAPI_COMMON_LIB NFAPI_LIB NFAPI_PNF_LIB
|
||||||
|
NFAPI_USER_LIB MISC_NFAPI_NR_LIB S1AP_LIB S1AP_ENB
|
||||||
|
${MSC_LIB} ${RAL_LIB} ${NAS_UE_LIB} ${ITTI_LIB} ${FLPT_MSG_LIB} ${ASYNC_IF_LIB} LFDS7 ${ATLAS_LIBRARIES}
|
||||||
NFAPI_USER_LIB S1AP_LIB S1AP_ENB
|
NFAPI_USER_LIB S1AP_LIB S1AP_ENB
|
||||||
${MSC_LIB} ${RAL_LIB} ${NAS_UE_LIB} ${ITTI_LIB} ${FLPT_MSG_LIB} ${ASYNC_IF_LIB} LFDS7 ${ATLAS_LIBRARIES} LIB_5GNAS_GNB
|
${MSC_LIB} ${RAL_LIB} ${NAS_UE_LIB} ${ITTI_LIB} ${FLPT_MSG_LIB} ${ASYNC_IF_LIB} LFDS7 ${ATLAS_LIBRARIES} LIB_5GNAS_GNB
|
||||||
-Wl,--end-group z dl)
|
-Wl,--end-group z dl)
|
||||||
@@ -3296,7 +3328,7 @@ add_executable(nr_dlsim
|
|||||||
)
|
)
|
||||||
target_link_libraries(nr_dlsim
|
target_link_libraries(nr_dlsim
|
||||||
-Wl,--start-group UTIL SIMU_COMMON SIMU PHY_COMMON PHY_NR_COMMON PHY_NR PHY_NR_UE SCHED_NR_LIB SCHED_NR_UE_LIB MAC_NR MAC_UE_NR MAC_NR_COMMON RRC_LIB NR_RRC_LIB CONFIG_LIB L2_LTE_NR L2_NR HASHTABLE X2AP_ENB X2AP_LIB SECU_CN NGAP_GNB -Wl,--end-group
|
-Wl,--start-group UTIL SIMU_COMMON SIMU PHY_COMMON PHY_NR_COMMON PHY_NR PHY_NR_UE SCHED_NR_LIB SCHED_NR_UE_LIB MAC_NR MAC_UE_NR MAC_NR_COMMON RRC_LIB NR_RRC_LIB CONFIG_LIB L2_LTE_NR L2_NR HASHTABLE X2AP_ENB X2AP_LIB SECU_CN NGAP_GNB -Wl,--end-group
|
||||||
m pthread ${ATLAS_LIBRARIES} ${T_LIB} ${ITTI_LIB} dl
|
m pthread ${ATLAS_LIBRARIES} ${T_LIB} ${ITTI_LIB} ${OPENSSL_LIBRARIES} dl
|
||||||
)
|
)
|
||||||
target_compile_definitions(nr_dlsim PUBLIC -DPHYSICAL_SIMULATOR)
|
target_compile_definitions(nr_dlsim PUBLIC -DPHYSICAL_SIMULATOR)
|
||||||
|
|
||||||
@@ -3315,7 +3347,7 @@ add_executable(nr_prachsim
|
|||||||
${SHLIB_LOADER_SOURCES})
|
${SHLIB_LOADER_SOURCES})
|
||||||
target_link_libraries(nr_prachsim
|
target_link_libraries(nr_prachsim
|
||||||
-Wl,--start-group UTIL SIMU_COMMON SIMU PHY_COMMON PHY_NR_COMMON PHY_NR PHY_RU PHY_NR_UE MAC_NR_COMMON SCHED_NR_LIB SCHED_NR_UE_LIB MAC_NR MAC_UE_NR MAC_NR_COMMON RRC_LIB NR_RRC_LIB CONFIG_LIB L2_LTE_NR L2_NR HASHTABLE X2AP_ENB X2AP_LIB SECU_CN NGAP_GNB -Wl,--end-group
|
-Wl,--start-group UTIL SIMU_COMMON SIMU PHY_COMMON PHY_NR_COMMON PHY_NR PHY_RU PHY_NR_UE MAC_NR_COMMON SCHED_NR_LIB SCHED_NR_UE_LIB MAC_NR MAC_UE_NR MAC_NR_COMMON RRC_LIB NR_RRC_LIB CONFIG_LIB L2_LTE_NR L2_NR HASHTABLE X2AP_ENB X2AP_LIB SECU_CN NGAP_GNB -Wl,--end-group
|
||||||
m pthread ${ATLAS_LIBRARIES} ${T_LIB} ${ITTI_LIB} dl)
|
m pthread ${ATLAS_LIBRARIES} ${T_LIB} ${ITTI_LIB} ${OPENSSL_LIBRARIES} dl)
|
||||||
|
|
||||||
add_executable(nr_ulschsim
|
add_executable(nr_ulschsim
|
||||||
${OPENAIR1_DIR}/SIMULATION/NR_PHY/ulschsim.c
|
${OPENAIR1_DIR}/SIMULATION/NR_PHY/ulschsim.c
|
||||||
@@ -3348,7 +3380,7 @@ add_executable(nr_ulsim
|
|||||||
)
|
)
|
||||||
target_link_libraries(nr_ulsim
|
target_link_libraries(nr_ulsim
|
||||||
-Wl,--start-group UTIL SIMU_COMMON SIMU PHY_COMMON PHY_NR_COMMON PHY_NR PHY_NR_UE SCHED_NR_LIB SCHED_NR_UE_LIB MAC_NR MAC_UE_NR MAC_NR_COMMON RRC_LIB NR_RRC_LIB CONFIG_LIB L2_LTE_NR L2_NR HASHTABLE X2AP_ENB X2AP_LIB SECU_CN NGAP_GNB -Wl,--end-group
|
-Wl,--start-group UTIL SIMU_COMMON SIMU PHY_COMMON PHY_NR_COMMON PHY_NR PHY_NR_UE SCHED_NR_LIB SCHED_NR_UE_LIB MAC_NR MAC_UE_NR MAC_NR_COMMON RRC_LIB NR_RRC_LIB CONFIG_LIB L2_LTE_NR L2_NR HASHTABLE X2AP_ENB X2AP_LIB SECU_CN NGAP_GNB -Wl,--end-group
|
||||||
m pthread ${ATLAS_LIBRARIES} ${T_LIB} ${ITTI_LIB} dl
|
m pthread ${ATLAS_LIBRARIES} ${T_LIB} ${ITTI_LIB} ${OPENSSL_LIBRARIES} dl
|
||||||
)
|
)
|
||||||
target_compile_definitions(nr_ulsim PUBLIC -DPHYSICAL_SIMULATOR)
|
target_compile_definitions(nr_ulsim PUBLIC -DPHYSICAL_SIMULATOR)
|
||||||
|
|
||||||
|
|||||||
@@ -1292,7 +1292,10 @@
|
|||||||
(Test8: DMRS Type B, 3 DMRS, 2 PTRS, 3 Interpolated Symbols),
|
(Test8: DMRS Type B, 3 DMRS, 2 PTRS, 3 Interpolated Symbols),
|
||||||
(Test9: SC-FDMA, 50 PRBs),
|
(Test9: SC-FDMA, 50 PRBs),
|
||||||
(Test10: SC-FDMA, 75 PRBs),
|
(Test10: SC-FDMA, 75 PRBs),
|
||||||
(Test11: SC-FDMA, 3 DMRS)</desc>
|
(Test11: SC-FDMA, 216 PRBs),
|
||||||
|
(Test12: SC-FDMA, 273 PRBs),
|
||||||
|
(Test13: SC-FDMA, 3 DMRS),
|
||||||
|
(Test14: MCS 16 50 PRBs 2 RX_Antenna)</desc>
|
||||||
<pre_compile_prog></pre_compile_prog>
|
<pre_compile_prog></pre_compile_prog>
|
||||||
<compile_prog>$OPENAIR_DIR/cmake_targets/build_oai</compile_prog>
|
<compile_prog>$OPENAIR_DIR/cmake_targets/build_oai</compile_prog>
|
||||||
<compile_prog_args> --phy_simulators -c </compile_prog_args>
|
<compile_prog_args> --phy_simulators -c </compile_prog_args>
|
||||||
@@ -1307,10 +1310,14 @@
|
|||||||
-n100 -s5 -T 2 1 2 -U 2 0 2
|
-n100 -s5 -T 2 1 2 -U 2 0 2
|
||||||
-n100 -s5 -T 2 2 2 -U 2 1 2
|
-n100 -s5 -T 2 2 2 -U 2 1 2
|
||||||
-n100 -s5 -a4 -b8 -T 2 1 2 -U 2 1 3
|
-n100 -s5 -a4 -b8 -T 2 1 2 -U 2 1 3
|
||||||
-n100 -s20 -Z
|
-n100 -s2 -Z
|
||||||
-n100 -s20 -Z -r75
|
-n100 -s2 -Z -r75
|
||||||
-n100 -s20 -Z -U 2 0 2</main_exec_args>
|
-n100 -s2 -Z -r216 -R217
|
||||||
<tags>nr_ulsim.test1 nr_ulsim.test2 nr_ulsim.test3 nr_ulsim.test4 nr_ulsim.test5 nr_ulsim.test6 nr_ulsim.test7 nr_ulsim.test8 nr_ulsim.test9 nr_ulsim.test10 nr_ulsim.test11</tags>
|
-n100 -s2 -Z -r270 -R273
|
||||||
|
-n100 -s2 -Z -U 2 0 2
|
||||||
|
-n100 -m16 -s10 -z2</main_exec_args>
|
||||||
|
|
||||||
|
<tags>nr_ulsim.test1 nr_ulsim.test2 nr_ulsim.test3 nr_ulsim.test4 nr_ulsim.test5 nr_ulsim.test6 nr_ulsim.test7 nr_ulsim.test8 nr_ulsim.test9 nr_ulsim.test10 nr_ulsim.test11 nr_ulsim.test12 nr_ulsim.test13 nr_ulsim.test14</tags>
|
||||||
<search_expr_true>PUSCH test OK</search_expr_true>
|
<search_expr_true>PUSCH test OK</search_expr_true>
|
||||||
<search_expr_false>segmentation fault|assertion|exiting|fatal</search_expr_false>
|
<search_expr_false>segmentation fault|assertion|exiting|fatal</search_expr_false>
|
||||||
<nruns>3</nruns>
|
<nruns>3</nruns>
|
||||||
@@ -1323,7 +1330,8 @@
|
|||||||
(Test3: 30kHz SCS, 273 PRBs, Prach format A2),
|
(Test3: 30kHz SCS, 273 PRBs, Prach format A2),
|
||||||
(Test4: 30kHz SCS, 106 PRBs, Prach format 0),
|
(Test4: 30kHz SCS, 106 PRBs, Prach format 0),
|
||||||
(Test5: 120kHz SCS, 32 PRBs, Prach format A2),
|
(Test5: 120kHz SCS, 32 PRBs, Prach format A2),
|
||||||
(Test6: 120kHz SCS, 66 PRBs, Prach format A2)</desc>
|
(Test6: 120kHz SCS, 66 PRBs, Prach format A2),
|
||||||
|
(Test7: 120kHz SCS, 66 PRBs, High Speed Enabled)</desc>
|
||||||
<pre_compile_prog></pre_compile_prog>
|
<pre_compile_prog></pre_compile_prog>
|
||||||
<compile_prog>$OPENAIR_DIR/cmake_targets/build_oai</compile_prog>
|
<compile_prog>$OPENAIR_DIR/cmake_targets/build_oai</compile_prog>
|
||||||
<compile_prog_args> --phy_simulators -c </compile_prog_args>
|
<compile_prog_args> --phy_simulators -c </compile_prog_args>
|
||||||
@@ -1335,8 +1343,9 @@
|
|||||||
-a -s -30 -n 100 -p 63 -R 273
|
-a -s -30 -n 100 -p 63 -R 273
|
||||||
-a -s -30 -n 100 -p 63 -R 106 -c 4
|
-a -s -30 -n 100 -p 63 -R 106 -c 4
|
||||||
-a -s -30 -n 100 -p 32 -R 32 -m 3 -c52
|
-a -s -30 -n 100 -p 32 -R 32 -m 3 -c52
|
||||||
-a -s -30 -n 100 -p 32 -R 66 -m 3 -c52</main_exec_args>
|
-a -s -30 -n 100 -p 32 -R 66 -m 3 -c52
|
||||||
<tags>nr_prachsim.test1 nr_prachsim.test2 nr_prachsim.test3 nr_prachsim.test4 nr_prachsim.test5 nr_prachsim.test6</tags>
|
-a -s -30 -n 100 -R 66 -m 3 -c52 -H</main_exec_args>
|
||||||
|
<tags>nr_prachsim.test1 nr_prachsim.test2 nr_prachsim.test3 nr_prachsim.test4 nr_prachsim.test5 nr_prachsim.test6 nr_prachsim.test7</tags>
|
||||||
<search_expr_true>PRACH test OK</search_expr_true>
|
<search_expr_true>PRACH test OK</search_expr_true>
|
||||||
<search_expr_false>segmentation fault|assertion|exiting|fatal</search_expr_false>
|
<search_expr_false>segmentation fault|assertion|exiting|fatal</search_expr_false>
|
||||||
<nruns>3</nruns>
|
<nruns>3</nruns>
|
||||||
|
|||||||
+38
-7
@@ -48,8 +48,9 @@ DEADLINE_SCHEDULER_FLAG_USER=""
|
|||||||
CPU_AFFINITY_FLAG_USER="False" #Only valid when low-latency flag is set to False
|
CPU_AFFINITY_FLAG_USER="False" #Only valid when low-latency flag is set to False
|
||||||
REL="Rel15"
|
REL="Rel15"
|
||||||
HW="None"
|
HW="None"
|
||||||
TP="None"
|
TP="Ethernet"
|
||||||
EPC=0
|
EPC=0
|
||||||
|
VERBOSE_CI=0
|
||||||
VERBOSE_COMPILE=0
|
VERBOSE_COMPILE=0
|
||||||
CFLAGS_PROCESSOR_USER=""
|
CFLAGS_PROCESSOR_USER=""
|
||||||
RUN_GROUP=0
|
RUN_GROUP=0
|
||||||
@@ -67,6 +68,7 @@ USRP_REC_PLAY="False"
|
|||||||
BUILD_ECLIPSE=0
|
BUILD_ECLIPSE=0
|
||||||
NR="False"
|
NR="False"
|
||||||
ITTI_SIM="False"
|
ITTI_SIM="False"
|
||||||
|
SANITIZE_ADDRESS="False"
|
||||||
OPTIONAL_LIBRARIES="telnetsrv enbscope uescope nrscope msc"
|
OPTIONAL_LIBRARIES="telnetsrv enbscope uescope nrscope msc"
|
||||||
trap handle_ctrl_c INT
|
trap handle_ctrl_c INT
|
||||||
|
|
||||||
@@ -289,6 +291,9 @@ function main() {
|
|||||||
esac
|
esac
|
||||||
echo_info "Setting hardware to: $HW"
|
echo_info "Setting hardware to: $HW"
|
||||||
shift 2;;
|
shift 2;;
|
||||||
|
-t | --transport)
|
||||||
|
TP=$2
|
||||||
|
shift 2;;
|
||||||
-P | --phy_simulators)
|
-P | --phy_simulators)
|
||||||
SIMUS_PHY=1
|
SIMUS_PHY=1
|
||||||
echo_info "Will compile dlsim, ulsim, ..."
|
echo_info "Will compile dlsim, ulsim, ..."
|
||||||
@@ -324,6 +329,10 @@ function main() {
|
|||||||
HWLAT_TEST=1
|
HWLAT_TEST=1
|
||||||
echo_info "Will compile hw latency test program"
|
echo_info "Will compile hw latency test program"
|
||||||
shift;;
|
shift;;
|
||||||
|
--verbose-ci)
|
||||||
|
VERBOSE_CI=1
|
||||||
|
echo_info "Will compile with verbose instructions in CI Docker env"
|
||||||
|
shift;;
|
||||||
--verbose-compile)
|
--verbose-compile)
|
||||||
VERBOSE_COMPILE=1
|
VERBOSE_COMPILE=1
|
||||||
echo_info "Will compile with verbose instructions"
|
echo_info "Will compile with verbose instructions"
|
||||||
@@ -416,6 +425,9 @@ function main() {
|
|||||||
CMAKE_CMD="$CMAKE_CMD -GNinja"
|
CMAKE_CMD="$CMAKE_CMD -GNinja"
|
||||||
MAKE_CMD=ninja
|
MAKE_CMD=ninja
|
||||||
shift;;
|
shift;;
|
||||||
|
--sanitize-address | -fsanitize=address)
|
||||||
|
SANITIZE_ADDRESS=True
|
||||||
|
shift;;
|
||||||
--ittiSIM)
|
--ittiSIM)
|
||||||
ittiSIM=1
|
ittiSIM=1
|
||||||
ITTI_SIM="True"
|
ITTI_SIM="True"
|
||||||
@@ -604,6 +616,7 @@ function main() {
|
|||||||
echo "set ( USRP_REC_PLAY $USRP_REC_PLAY )" >> $cmake_file
|
echo "set ( USRP_REC_PLAY $USRP_REC_PLAY )" >> $cmake_file
|
||||||
echo "set ( SKIP_SHARED_LIB_FLAG $SKIP_SHARED_LIB_FLAG )" >> $cmake_file
|
echo "set ( SKIP_SHARED_LIB_FLAG $SKIP_SHARED_LIB_FLAG )" >> $cmake_file
|
||||||
echo "set ( ITTI_SIM $ITTI_SIM )" >> $cmake_file
|
echo "set ( ITTI_SIM $ITTI_SIM )" >> $cmake_file
|
||||||
|
echo "set ( SANITIZE_ADDRESS $SANITIZE_ADDRESS )" >> $cmake_file
|
||||||
echo 'include(${CMAKE_CURRENT_SOURCE_DIR}/../CMakeLists.txt)' >> $cmake_file
|
echo 'include(${CMAKE_CURRENT_SOURCE_DIR}/../CMakeLists.txt)' >> $cmake_file
|
||||||
cd $DIR/$build_dir/build
|
cd $DIR/$build_dir/build
|
||||||
eval $CMAKE_CMD
|
eval $CMAKE_CMD
|
||||||
@@ -936,12 +949,30 @@ function main() {
|
|||||||
echo_info "Building transport protocol libraries"
|
echo_info "Building transport protocol libraries"
|
||||||
rm -f liboai_transpro.so
|
rm -f liboai_transpro.so
|
||||||
rm -f $dbin/liboai_transpro.so
|
rm -f $dbin/liboai_transpro.so
|
||||||
compilations \
|
if [ "$TP" == "Ethernet" ]; then
|
||||||
$build_dir oai_eth_transpro \
|
compilations \
|
||||||
liboai_eth_transpro.so $dbin/liboai_eth_transpro.so.$REL
|
$build_dir oai_eth_transpro \
|
||||||
ln -sf liboai_eth_transpro.so liboai_transpro.so
|
liboai_eth_transpro.so $dbin/liboai_eth_transpro.so.$REL
|
||||||
ln -sf $dbin/liboai_eth_transpro.so.$REL $dbin/liboai_transpro.so
|
ln -sf liboai_eth_transpro.so liboai_transpro.so
|
||||||
echo_info "liboai_transpro.so is linked to ETHERNET transport"
|
ln -sf $dbin/liboai_eth_transpro.so.$REL $dbin/liboai_transpro.so
|
||||||
|
echo_info "liboai_transpro.so is linked to ETHERNET transport"
|
||||||
|
fi
|
||||||
|
if [ "$TP" == "benetel4g" ]; then
|
||||||
|
compilations \
|
||||||
|
$build_dir benetel_4g \
|
||||||
|
libbenetel_4g.so $dbin/libbenetel_4g.$REL
|
||||||
|
ln -sf libbenetel_4g.so liboai_transpro.so
|
||||||
|
ln -sf $dbin/libbenetel_4g.so.$REL $dbin/liboai_transpro.so
|
||||||
|
echo_info "liboai_transpro.so is linked to BENETEL4G transport"
|
||||||
|
fi
|
||||||
|
if [ "$TP" == "benetel5g" ]; then
|
||||||
|
compilations \
|
||||||
|
$build_dir benetel_5g \
|
||||||
|
libbenetel_5g.so $dbin/libbenetel_5g.$REL
|
||||||
|
ln -sf libbenetel_5g.so liboai_transpro.so
|
||||||
|
ln -sf $dbin/libbenetel_5g.so.$REL $dbin/liboai_transpro.so
|
||||||
|
echo_info "liboai_transpro.so is linked to BENETEL4G transport"
|
||||||
|
fi
|
||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
|||||||
@@ -41,7 +41,7 @@ KERNEL_VERSION=$(uname -r | cut -d '.' -f1)
|
|||||||
KERNEL_MAJOR=$(uname -r | cut -d '.' -f2)
|
KERNEL_MAJOR=$(uname -r | cut -d '.' -f2)
|
||||||
|
|
||||||
#check if we run inside a container
|
#check if we run inside a container
|
||||||
IS_CONTAINER=`egrep -c "docker|podman|kubepods" /proc/self/cgroup || true`
|
IS_CONTAINER=`egrep -c "docker|podman|kubepods|libpod|buildah" /proc/self/cgroup || true`
|
||||||
#sudo is not needed when we are root
|
#sudo is not needed when we are root
|
||||||
if [ "$UID" = 0 ]
|
if [ "$UID" = 0 ]
|
||||||
then
|
then
|
||||||
@@ -221,6 +221,11 @@ compilations() {
|
|||||||
ret=$?
|
ret=$?
|
||||||
} > $dlog/$2.$REL.txt 2>&1
|
} > $dlog/$2.$REL.txt 2>&1
|
||||||
set -e
|
set -e
|
||||||
|
if [ "$VERBOSE_CI" == "1" ]; then
|
||||||
|
echo_info "====== Start of log for $2.$REL.txt ======"
|
||||||
|
cat $dlog/$2.$REL.txt
|
||||||
|
echo_info "====== End of log for $2.$REL.txt ======"
|
||||||
|
fi
|
||||||
if [[ $ret -ne 0 ]]; then
|
if [[ $ret -ne 0 ]]; then
|
||||||
check_warnings "$dlog/$2.$REL.txt"
|
check_warnings "$dlog/$2.$REL.txt"
|
||||||
check_errors "$dlog/$2.$REL.txt"
|
check_errors "$dlog/$2.$REL.txt"
|
||||||
@@ -273,6 +278,10 @@ install_protobuf_from_source(){
|
|||||||
make -j`nproc`
|
make -j`nproc`
|
||||||
$SUDO make install
|
$SUDO make install
|
||||||
$SUDO ldconfig
|
$SUDO ldconfig
|
||||||
|
if [[ -v CI_ENV ]]; then
|
||||||
|
cd /tmp
|
||||||
|
$SUDO rm -rf protobuf*
|
||||||
|
fi
|
||||||
) >& $protobuf_install_log
|
) >& $protobuf_install_log
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -295,6 +304,10 @@ install_protobuf_c_from_source(){
|
|||||||
make -j`nproc`
|
make -j`nproc`
|
||||||
$SUDO make install
|
$SUDO make install
|
||||||
$SUDO ldconfig
|
$SUDO ldconfig
|
||||||
|
if [[ -v CI_ENV ]]; then
|
||||||
|
cd /tmp
|
||||||
|
$SUDO rm -rf protobuf*
|
||||||
|
fi
|
||||||
) >& $protobuf_c_install_log
|
) >& $protobuf_c_install_log
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -351,10 +364,10 @@ check_install_usrp_uhd_driver(){
|
|||||||
elif [[ "$OS_BASEDISTRO" == "fedora" ]]; then
|
elif [[ "$OS_BASEDISTRO" == "fedora" ]]; then
|
||||||
if [ $IS_CONTAINER -eq 0 ]
|
if [ $IS_CONTAINER -eq 0 ]
|
||||||
then
|
then
|
||||||
$SUDO $INSTALLER -y install python boost libusb-devel libusbx-devel boost-devel python-mako python-docutils cmake
|
$SUDO $INSTALLER -y install python boost libusb-devel libusbx-devel boost-devel python-mako python-docutils $CMAKE
|
||||||
$SUDO -H pip install requests
|
$SUDO -H pip install requests
|
||||||
else
|
else
|
||||||
$SUDO $INSTALLER -y install boost boost-devel cmake3
|
$SUDO $INSTALLER -y install boost boost-devel $CMAKE
|
||||||
$SUDO pip3 install mako requests
|
$SUDO pip3 install mako requests
|
||||||
fi
|
fi
|
||||||
if [[ "$OS_DISTRO" == "rhel" ]] || [[ "$OS_DISTRO" == "centos" ]]; then
|
if [[ "$OS_DISTRO" == "rhel" ]] || [[ "$OS_DISTRO" == "centos" ]]; then
|
||||||
@@ -480,7 +493,7 @@ install_soapy_from_source(){
|
|||||||
#git checkout tags/release_003_010_001_001
|
#git checkout tags/release_003_010_001_001
|
||||||
mkdir -p build
|
mkdir -p build
|
||||||
cd build
|
cd build
|
||||||
cmake ../
|
$CMAKE ../
|
||||||
echo "Compiling SoapyRemote"
|
echo "Compiling SoapyRemote"
|
||||||
make -j`nproc`
|
make -j`nproc`
|
||||||
$SUDO make install
|
$SUDO make install
|
||||||
@@ -499,7 +512,7 @@ install_soapy_iris_from_source(){
|
|||||||
cd sklk-soapyiris
|
cd sklk-soapyiris
|
||||||
mkdir -p build
|
mkdir -p build
|
||||||
cd build
|
cd build
|
||||||
cmake ../
|
$CMAKE ../
|
||||||
echo "Compiling SoapyIris"
|
echo "Compiling SoapyIris"
|
||||||
make -j`nproc`
|
make -j`nproc`
|
||||||
$SUDO make install
|
$SUDO make install
|
||||||
@@ -676,7 +689,7 @@ check_install_oai_software() {
|
|||||||
automake \
|
automake \
|
||||||
bison \
|
bison \
|
||||||
build-essential \
|
build-essential \
|
||||||
cmake \
|
$CMAKE \
|
||||||
cmake-curses-gui \
|
cmake-curses-gui \
|
||||||
ninja-build \
|
ninja-build \
|
||||||
doxygen \
|
doxygen \
|
||||||
@@ -831,6 +844,9 @@ install_asn1c_from_source(){
|
|||||||
$SUDO make install
|
$SUDO make install
|
||||||
cd -
|
cd -
|
||||||
$SUDO ldconfig
|
$SUDO ldconfig
|
||||||
|
if [[ -v CI_ENV ]]; then
|
||||||
|
$SUDO rm -rf /tmp/asn1c
|
||||||
|
fi
|
||||||
) > $asn1_install_log 2>&1
|
) > $asn1_install_log 2>&1
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -43,7 +43,7 @@
|
|||||||
#include "config_userapi.h"
|
#include "config_userapi.h"
|
||||||
#include "../utils/LOG/log.h"
|
#include "../utils/LOG/log.h"
|
||||||
#define CONFIG_SHAREDLIBFORMAT "libparams_%s.so"
|
#define CONFIG_SHAREDLIBFORMAT "libparams_%s.so"
|
||||||
|
#include "nfapi/oai_integration/vendor_ext.h"
|
||||||
|
|
||||||
int load_config_sharedlib(configmodule_interface_t *cfgptr) {
|
int load_config_sharedlib(configmodule_interface_t *cfgptr) {
|
||||||
void *lib_handle;
|
void *lib_handle;
|
||||||
@@ -331,9 +331,10 @@ void end_configmodule(void) {
|
|||||||
printf ("[CONFIG] free %u config value pointers\n",cfgptr->numptrs);
|
printf ("[CONFIG] free %u config value pointers\n",cfgptr->numptrs);
|
||||||
|
|
||||||
for(int i=0; i<cfgptr->numptrs ; i++) {
|
for(int i=0; i<cfgptr->numptrs ; i++) {
|
||||||
if (cfgptr->ptrs[i] != NULL) {
|
if (cfgptr->ptrs[i] != NULL && cfgptr->ptrsAllocated[i] == true) {
|
||||||
free(cfgptr->ptrs[i]);
|
free(cfgptr->ptrs[i]);
|
||||||
cfgptr->ptrs[i]=NULL;
|
cfgptr->ptrs[i]=NULL;
|
||||||
|
cfgptr->ptrsAllocated[i] = false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -36,6 +36,8 @@
|
|||||||
|
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
|
#include <stdint.h>
|
||||||
|
#include <stdbool.h>
|
||||||
#include "common/config/config_paramdesc.h"
|
#include "common/config/config_paramdesc.h"
|
||||||
#include "common/utils/T/T.h"
|
#include "common/utils/T/T.h"
|
||||||
#define CONFIG_MAX_OOPT_PARAMS 10 // maximum number of parameters in the -O option (-O <cfgmode>:P1:P2...
|
#define CONFIG_MAX_OOPT_PARAMS 10 // maximum number of parameters in the -O option (-O <cfgmode>:P1:P2...
|
||||||
@@ -74,6 +76,7 @@ typedef struct configmodule_interface {
|
|||||||
uint32_t numptrs;
|
uint32_t numptrs;
|
||||||
uint32_t rtflags;
|
uint32_t rtflags;
|
||||||
char *ptrs[CONFIG_MAX_ALLOCATEDPTRS];
|
char *ptrs[CONFIG_MAX_ALLOCATEDPTRS];
|
||||||
|
bool ptrsAllocated[CONFIG_MAX_ALLOCATEDPTRS];
|
||||||
} configmodule_interface_t;
|
} configmodule_interface_t;
|
||||||
|
|
||||||
#ifdef CONFIG_LOADCONFIG_MAIN
|
#ifdef CONFIG_LOADCONFIG_MAIN
|
||||||
|
|||||||
@@ -62,6 +62,7 @@ char *config_check_valptr(paramdef_t *cfgoptions, char **ptr, int length) {
|
|||||||
|
|
||||||
if ( (cfgoptions->paramflags & PARAMFLAG_NOFREE) == 0) {
|
if ( (cfgoptions->paramflags & PARAMFLAG_NOFREE) == 0) {
|
||||||
config_get_if()->ptrs[config_get_if()->numptrs] = (char *)ptr;
|
config_get_if()->ptrs[config_get_if()->numptrs] = (char *)ptr;
|
||||||
|
config_get_if()->ptrsAllocated[config_get_if()->numptrs] = true;
|
||||||
config_get_if()->numptrs++;
|
config_get_if()->numptrs++;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
@@ -82,7 +83,9 @@ char *config_check_valptr(paramdef_t *cfgoptions, char **ptr, int length) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (*ptr == NULL) {
|
if (*ptr == NULL) {
|
||||||
*ptr = malloc(length>40?length:40); // LTS: dummy fix, waiting Francois full fix in 4G branch
|
*ptr = malloc(length>40?length:40);
|
||||||
|
// LTS: dummy fix, waiting Francois full fix in 4G branch
|
||||||
|
// the issue is we don't know at this point the size we will get
|
||||||
|
|
||||||
if ( *ptr != NULL) {
|
if ( *ptr != NULL) {
|
||||||
memset(*ptr,0,length);
|
memset(*ptr,0,length);
|
||||||
|
|||||||
@@ -346,6 +346,7 @@ int config_libconfig_init(char *cfgP[], int numP) {
|
|||||||
libconfig_privdata.configfile = strdup((char *)cfgP[0]);
|
libconfig_privdata.configfile = strdup((char *)cfgP[0]);
|
||||||
config_get_if()->numptrs=0;
|
config_get_if()->numptrs=0;
|
||||||
memset(config_get_if()->ptrs,0,sizeof(void *) * CONFIG_MAX_ALLOCATEDPTRS);
|
memset(config_get_if()->ptrs,0,sizeof(void *) * CONFIG_MAX_ALLOCATEDPTRS);
|
||||||
|
memset(config_get_if()->ptrsAllocated, 0, sizeof(config_get_if()->ptrsAllocated));
|
||||||
|
|
||||||
/* Read the file. If there is an error, report it and exit. */
|
/* Read the file. If there is an error, report it and exit. */
|
||||||
if(! config_read_file(&(libconfig_privdata.cfg), libconfig_privdata.configfile)) {
|
if(! config_read_file(&(libconfig_privdata.cfg), libconfig_privdata.configfile)) {
|
||||||
|
|||||||
+34
-4
@@ -88,17 +88,20 @@ int write_file_matlab(const char *fname,
|
|||||||
void *data,
|
void *data,
|
||||||
int length,
|
int length,
|
||||||
int dec,
|
int dec,
|
||||||
char format)
|
unsigned int format,
|
||||||
|
int multiVec)
|
||||||
{
|
{
|
||||||
FILE *fp=NULL;
|
FILE *fp=NULL;
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
|
AssertFatal((format&~MATLAB_RAW) <16,"");
|
||||||
|
|
||||||
if (data == NULL)
|
if (data == NULL)
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
//printf("Writing %d elements of type %d to %s\n",length,format,fname);
|
//printf("Writing %d elements of type %d to %s\n",length,format,fname);
|
||||||
|
|
||||||
if (format == 10 || format ==11 || format == 12 || format == 13 || format == 14) {
|
if (format == 10 || format ==11 || format == 12 || format == 13 || format == 14 || multiVec) {
|
||||||
fp = fopen(fname,"a+");
|
fp = fopen(fname,"a+");
|
||||||
} else if (format != 10 && format !=11 && format != 12 && format != 13 && format != 14) {
|
} else if (format != 10 && format !=11 && format != 12 && format != 13 && format != 14) {
|
||||||
fp = fopen(fname,"w+");
|
fp = fopen(fname,"w+");
|
||||||
@@ -109,7 +112,32 @@ int write_file_matlab(const char *fname,
|
|||||||
return(-1);
|
return(-1);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (format != 10 && format !=11 && format != 12 && format != 13 && format != 14)
|
if ( (format&MATLAB_RAW) == MATLAB_RAW ) {
|
||||||
|
int sz[16]={sizeof(short), 2*sizeof(short),
|
||||||
|
sizeof(int), 2*sizeof(int),
|
||||||
|
sizeof(char), 2*sizeof(char),
|
||||||
|
sizeof(long long),
|
||||||
|
sizeof(double), 2*sizeof(double),
|
||||||
|
sizeof(unsigned char),
|
||||||
|
sizeof(short),
|
||||||
|
sizeof(short),
|
||||||
|
sizeof(short),
|
||||||
|
sizeof(short),
|
||||||
|
sizeof(short),
|
||||||
|
sizeof(short)
|
||||||
|
};
|
||||||
|
int eltSz= sz[format&~MATLAB_RAW];
|
||||||
|
if (dec==1)
|
||||||
|
fwrite(data, eltSz, length, fp);
|
||||||
|
else
|
||||||
|
for (i=0; i<length; i+=dec)
|
||||||
|
fwrite(data+i*eltSz, eltSz, 1, fp);
|
||||||
|
|
||||||
|
fclose(fp);
|
||||||
|
return(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
if ((format != 10 && format !=11 && format != 12 && format != 13 && format != 14) || multiVec)
|
||||||
fprintf(fp,"%s = [",vname);
|
fprintf(fp,"%s = [",vname);
|
||||||
|
|
||||||
switch (format) {
|
switch (format) {
|
||||||
@@ -214,9 +242,11 @@ int write_file_matlab(const char *fname,
|
|||||||
case 12 : // case eren for log2_maxh real unsigned 8 bit
|
case 12 : // case eren for log2_maxh real unsigned 8 bit
|
||||||
fprintf(fp,"%d \n",((unsigned char *)&data)[0]);
|
fprintf(fp,"%d \n",((unsigned char *)&data)[0]);
|
||||||
break;
|
break;
|
||||||
|
default:
|
||||||
|
AssertFatal(false, "unknown dump format: %d\n", format);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (format != 10 && format !=11 && format !=12 && format != 13 && format != 15) {
|
if ((format != 10 && format !=11 && format !=12 && format != 13 && format != 15) || multiVec) {
|
||||||
fprintf(fp,"];\n");
|
fprintf(fp,"];\n");
|
||||||
fclose(fp);
|
fclose(fp);
|
||||||
return(0);
|
return(0);
|
||||||
|
|||||||
+24
-4
@@ -335,8 +335,27 @@ typedef struct {
|
|||||||
@param length length of data vector to output
|
@param length length of data vector to output
|
||||||
@param dec decimation level
|
@param dec decimation level
|
||||||
@param format data format (0 = real 16-bit, 1 = complex 16-bit,2 real 32-bit, 3 complex 32-bit,4 = real 8-bit, 5 = complex 8-bit)
|
@param format data format (0 = real 16-bit, 1 = complex 16-bit,2 real 32-bit, 3 complex 32-bit,4 = real 8-bit, 5 = complex 8-bit)
|
||||||
|
@param multiVec create new file or append to existing (useful for writing multiple vectors to same file. Just call the function multiple times with same file name and with this parameter set to 1)
|
||||||
*/
|
*/
|
||||||
int32_t write_file_matlab(const char *fname, const char *vname, void *data, int length, int dec, char format);
|
#define MATLAB_RAW (1<<31)
|
||||||
|
#define MATLAB_SHORT 0
|
||||||
|
#define MATLAB_CSHORT 1
|
||||||
|
#define MATLAB_INT 2
|
||||||
|
#define MATLAB_CINT 3
|
||||||
|
#define MATLAB_INT8 4
|
||||||
|
#define MATLAB_CINT8 5
|
||||||
|
#define MATLAB_LLONG 6
|
||||||
|
#define MATLAB_DOUBLE 7
|
||||||
|
#define MATLAB_CDOUBLE 8
|
||||||
|
#define MATLAB_UINT8 9
|
||||||
|
#define MATLEB_EREN1 10
|
||||||
|
#define MATLEB_EREN2 11
|
||||||
|
#define MATLEB_EREN3 12
|
||||||
|
#define MATLAB_CSHORT_BRACKET1 13
|
||||||
|
#define MATLAB_CSHORT_BRACKET2 14
|
||||||
|
#define MATLAB_CSHORT_BRACKET3 15
|
||||||
|
|
||||||
|
int32_t write_file_matlab(const char *fname, const char *vname, void *data, int length, int dec, unsigned int format, int multiVec);
|
||||||
|
|
||||||
/*----------------macro definitions for reading log configuration from the config module */
|
/*----------------macro definitions for reading log configuration from the config module */
|
||||||
#define CONFIG_STRING_LOG_PREFIX "log_config"
|
#define CONFIG_STRING_LOG_PREFIX "log_config"
|
||||||
@@ -396,7 +415,7 @@ int32_t write_file_matlab(const char *fname, const char *vname, void *data, int
|
|||||||
|
|
||||||
/* bitmask dependent macros, to generate debug file such as matlab file or message dump */
|
/* bitmask dependent macros, to generate debug file such as matlab file or message dump */
|
||||||
# define LOG_DUMPFLAG(D) (g_log->dump_mask & D)
|
# define LOG_DUMPFLAG(D) (g_log->dump_mask & D)
|
||||||
# define LOG_M(file, vector, data, len, dec, format) do { write_file_matlab(file, vector, data, len, dec, format);} while(0)/* */
|
# define LOG_M(file, vector, data, len, dec, format) do { write_file_matlab(file, vector, data, len, dec, format, 0);} while(0)/* */
|
||||||
/* define variable only used in LOG macro's */
|
/* define variable only used in LOG macro's */
|
||||||
# define LOG_VAR(A,B) A B
|
# define LOG_VAR(A,B) A B
|
||||||
# else /* T_TRACER: remove all debugging and tracing messages, except errors */
|
# else /* T_TRACER: remove all debugging and tracing messages, except errors */
|
||||||
@@ -413,7 +432,7 @@ int32_t write_file_matlab(const char *fname, const char *vname, void *data, int
|
|||||||
# define LOG_DUMPFLAG(D) (g_log->debug_mask & D)
|
# define LOG_DUMPFLAG(D) (g_log->debug_mask & D)
|
||||||
# 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) /* */
|
||||||
|
|
||||||
# define LOG_M(file, vector, data, len, dec, format) do { write_file_matlab(file, vector, data, len, dec, format);} while(0)
|
# define LOG_M(file, vector, data, len, dec, format) do { write_file_matlab(file, vector, data, len, dec, format, 0);} while(0)
|
||||||
# define LOG_VAR(A,B) A B
|
# define LOG_VAR(A,B) A B
|
||||||
# endif /* T_TRACER */
|
# endif /* T_TRACER */
|
||||||
/* avoid warnings for variables only used in LOG macro's but set outside debug section */
|
/* avoid warnings for variables only used in LOG macro's but set outside debug section */
|
||||||
@@ -421,9 +440,10 @@ int32_t write_file_matlab(const char *fname, const char *vname, void *data, int
|
|||||||
#define LOG_USEDINLOG_VAR(A,B) GCC_NOTUSED A B
|
#define LOG_USEDINLOG_VAR(A,B) GCC_NOTUSED A B
|
||||||
|
|
||||||
/* unfiltered macros, useful for simulators or messages at init time, before log is configured */
|
/* unfiltered macros, useful for simulators or messages at init time, before log is configured */
|
||||||
#define LOG_UM(file, vector, data, len, dec, format) do { write_file_matlab(file, vector, data, len, dec, format);} while(0)
|
#define LOG_UM(file, vector, data, len, dec, format) do { write_file_matlab(file, vector, data, len, dec, format, 0);} while(0)
|
||||||
#define LOG_UI(c, x...) do {logRecord_mt(__FILE__, __FUNCTION__, __LINE__,c, OAILOG_INFO, x) ; } while(0)
|
#define LOG_UI(c, x...) do {logRecord_mt(__FILE__, __FUNCTION__, __LINE__,c, OAILOG_INFO, x) ; } while(0)
|
||||||
#define LOG_UDUMPMSG(c, b, s, f, x...) do { log_dump(c, b, s, f, x) ;} while (0) /* */
|
#define LOG_UDUMPMSG(c, b, s, f, x...) do { log_dump(c, b, s, f, x) ;} while (0) /* */
|
||||||
|
# define LOG_MM(file, vector, data, len, dec, format) do { write_file_matlab(file, vector, data, len, dec, format, 1);} while(0)
|
||||||
/* @}*/
|
/* @}*/
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -302,6 +302,9 @@ const char* eurecomFunctionsNames[] = {
|
|||||||
/* PHY signals */
|
/* PHY signals */
|
||||||
"ue_synch",
|
"ue_synch",
|
||||||
"ue_slot_fep",
|
"ue_slot_fep",
|
||||||
|
"ue_slot_fep_pdcch",
|
||||||
|
"ue_slot_fep_pbch",
|
||||||
|
"ue_slot_fep_pdsch",
|
||||||
"ue_slot_fep_mbsfn",
|
"ue_slot_fep_mbsfn",
|
||||||
"ue_slot_fep_mbsfn_khz_1dot25",
|
"ue_slot_fep_mbsfn_khz_1dot25",
|
||||||
"ue_rrc_measurements",
|
"ue_rrc_measurements",
|
||||||
@@ -390,6 +393,8 @@ const char* eurecomFunctionsNames[] = {
|
|||||||
"rx_pmch",
|
"rx_pmch",
|
||||||
"rx_pmch_khz_1dot25",
|
"rx_pmch_khz_1dot25",
|
||||||
"pdsch_procedures",
|
"pdsch_procedures",
|
||||||
|
"pdsch_procedures_crnti",
|
||||||
|
//"dlsch_procedures_crnti",
|
||||||
"pdsch_procedures_si",
|
"pdsch_procedures_si",
|
||||||
"pdsch_procedures_p",
|
"pdsch_procedures_p",
|
||||||
"pdsch_procedures_ra",
|
"pdsch_procedures_ra",
|
||||||
|
|||||||
@@ -283,6 +283,9 @@ typedef enum {
|
|||||||
/* PHY signals */
|
/* PHY signals */
|
||||||
VCD_SIGNAL_DUMPER_FUNCTIONS_UE_SYNCH,
|
VCD_SIGNAL_DUMPER_FUNCTIONS_UE_SYNCH,
|
||||||
VCD_SIGNAL_DUMPER_FUNCTIONS_UE_SLOT_FEP,
|
VCD_SIGNAL_DUMPER_FUNCTIONS_UE_SLOT_FEP,
|
||||||
|
VCD_SIGNAL_DUMPER_FUNCTIONS_UE_SLOT_FEP_PDCCH,
|
||||||
|
VCD_SIGNAL_DUMPER_FUNCTIONS_UE_SLOT_FEP_PBCH,
|
||||||
|
VCD_SIGNAL_DUMPER_FUNCTIONS_UE_SLOT_FEP_PDSCH,
|
||||||
VCD_SIGNAL_DUMPER_FUNCTIONS_UE_SLOT_FEP_MBSFN,
|
VCD_SIGNAL_DUMPER_FUNCTIONS_UE_SLOT_FEP_MBSFN,
|
||||||
VCD_SIGNAL_DUMPER_FUNCTIONS_UE_SLOT_FEP_MBSFN_KHZ_1DOT25,
|
VCD_SIGNAL_DUMPER_FUNCTIONS_UE_SLOT_FEP_MBSFN_KHZ_1DOT25,
|
||||||
VCD_SIGNAL_DUMPER_FUNCTIONS_UE_RRC_MEASUREMENTS,
|
VCD_SIGNAL_DUMPER_FUNCTIONS_UE_RRC_MEASUREMENTS,
|
||||||
@@ -371,9 +374,11 @@ typedef enum {
|
|||||||
VCD_SIGNAL_DUMPER_FUNCTIONS_RX_PMCH,
|
VCD_SIGNAL_DUMPER_FUNCTIONS_RX_PMCH,
|
||||||
VCD_SIGNAL_DUMPER_FUNCTIONS_RX_PMCH_KHZ_1DOT25,
|
VCD_SIGNAL_DUMPER_FUNCTIONS_RX_PMCH_KHZ_1DOT25,
|
||||||
VCD_SIGNAL_DUMPER_FUNCTIONS_PDSCH_PROC,
|
VCD_SIGNAL_DUMPER_FUNCTIONS_PDSCH_PROC,
|
||||||
|
VCD_SIGNAL_DUMPER_FUNCTIONS_PDSCH_PROC_C,
|
||||||
VCD_SIGNAL_DUMPER_FUNCTIONS_PDSCH_PROC_SI,
|
VCD_SIGNAL_DUMPER_FUNCTIONS_PDSCH_PROC_SI,
|
||||||
VCD_SIGNAL_DUMPER_FUNCTIONS_PDSCH_PROC_P,
|
VCD_SIGNAL_DUMPER_FUNCTIONS_PDSCH_PROC_P,
|
||||||
VCD_SIGNAL_DUMPER_FUNCTIONS_PDSCH_PROC_RA,
|
VCD_SIGNAL_DUMPER_FUNCTIONS_PDSCH_PROC_RA,
|
||||||
|
//VCD_SIGNAL_DUMPER_FUNCTIONS_DLSCH_PROC_C,
|
||||||
VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_UE_CONFIG_SIB2,
|
VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_UE_CONFIG_SIB2,
|
||||||
VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_CONFIG_SIB1_ENB,
|
VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_CONFIG_SIB1_ENB,
|
||||||
VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_CONFIG_SIB2_ENB,
|
VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_CONFIG_SIB2_ENB,
|
||||||
|
|||||||
@@ -4,6 +4,7 @@ T_IDs.h
|
|||||||
T_messages.txt.h
|
T_messages.txt.h
|
||||||
genids
|
genids
|
||||||
tracer/enb
|
tracer/enb
|
||||||
|
tracer/gnb
|
||||||
tracer/extract_config
|
tracer/extract_config
|
||||||
tracer/record
|
tracer/record
|
||||||
tracer/replay
|
tracer/replay
|
||||||
|
|||||||
@@ -44,7 +44,7 @@
|
|||||||
/* let's have 100 RBs functional for the basic simulator */
|
/* let's have 100 RBs functional for the basic simulator */
|
||||||
# define T_BUFFER_MAX (1024*64*2)
|
# define T_BUFFER_MAX (1024*64*2)
|
||||||
#else
|
#else
|
||||||
# define T_BUFFER_MAX (1024*64)
|
# define T_BUFFER_MAX (1024*64*2)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* size of the local cache for messages (must be pow(2,something)) */
|
/* size of the local cache for messages (must be pow(2,something)) */
|
||||||
@@ -52,7 +52,7 @@
|
|||||||
/* we don't need much space for the basic simulator */
|
/* we don't need much space for the basic simulator */
|
||||||
# define T_CACHE_SIZE 1024
|
# define T_CACHE_SIZE 1024
|
||||||
#else
|
#else
|
||||||
# define T_CACHE_SIZE (8192 * 2)
|
# define T_CACHE_SIZE (8192)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* maximum number of bytes a message can contain */
|
/* maximum number of bytes a message can contain */
|
||||||
@@ -73,7 +73,7 @@ typedef struct {
|
|||||||
} T_cache_t;
|
} T_cache_t;
|
||||||
|
|
||||||
/* number of VCD functions (to be kept up to date! see in T_messages.txt) */
|
/* number of VCD functions (to be kept up to date! see in T_messages.txt) */
|
||||||
#define VCD_NUM_FUNCTIONS (269)
|
#define VCD_NUM_FUNCTIONS (273)
|
||||||
|
|
||||||
/* number of VCD variables (to be kept up to date! see in T_messages.txt) */
|
/* number of VCD variables (to be kept up to date! see in T_messages.txt) */
|
||||||
#define VCD_NUM_VARIABLES (187)
|
#define VCD_NUM_VARIABLES (187)
|
||||||
|
|||||||
@@ -89,6 +89,10 @@ ID = GNB_PHY_MIB
|
|||||||
DESC = NR MIB data
|
DESC = NR MIB data
|
||||||
GROUP = ALL:PHY:GNB:WIRESHARK
|
GROUP = ALL:PHY:GNB:WIRESHARK
|
||||||
FORMAT = int,gNB_ID : int,frame : int,slot : buffer,data
|
FORMAT = int,gNB_ID : int,frame : int,slot : buffer,data
|
||||||
|
ID = GNB_PHY_PUCCH_PUSCH_IQ
|
||||||
|
DESC = gNodeB input data in the frequency domain for a slot where some PUCCH or PUSCH detection was done
|
||||||
|
GROUP = ALL:PHY:GRAPHIC:HEAVY:GNB
|
||||||
|
FORMAT = int,frame : int,slot : buffer,rxdataF
|
||||||
|
|
||||||
#MAC logs
|
#MAC logs
|
||||||
ID = ENB_MAC_UE_DL_SDU
|
ID = ENB_MAC_UE_DL_SDU
|
||||||
@@ -2403,6 +2407,21 @@ ID = VCD_FUNCTION_UE_SLOT_FEP
|
|||||||
GROUP = ALL:VCD:UE:VCD_FUNCTION
|
GROUP = ALL:VCD:UE:VCD_FUNCTION
|
||||||
FORMAT = int,value
|
FORMAT = int,value
|
||||||
VCD_NAME = ue_slot_fep
|
VCD_NAME = ue_slot_fep
|
||||||
|
ID = VCD_FUNCTION_UE_SLOT_FEP_PDCCH
|
||||||
|
DESC = VCD function UE_SLOT_FEP_PDCCH
|
||||||
|
GROUP = ALL:VCD:UE:VCD_FUNCTION
|
||||||
|
FORMAT = int,value
|
||||||
|
VCD_NAME = ue_slot_fep_pdcch
|
||||||
|
ID = VCD_FUNCTION_UE_SLOT_FEP_PBCH
|
||||||
|
DESC = VCD function UE_SLOT_FEP_PBCH
|
||||||
|
GROUP = ALL:VCD:UE:VCD_FUNCTION
|
||||||
|
FORMAT = int,value
|
||||||
|
VCD_NAME = ue_slot_fep_pbch
|
||||||
|
ID = VCD_FUNCTION_UE_SLOT_FEP_PDSCH
|
||||||
|
DESC = VCD function UE_SLOT_FEP_PDSCH
|
||||||
|
GROUP = ALL:VCD:UE:VCD_FUNCTION
|
||||||
|
FORMAT = int,value
|
||||||
|
VCD_NAME = ue_slot_fep_pdsch
|
||||||
ID = VCD_FUNCTION_UE_SLOT_FEP_MBSFN
|
ID = VCD_FUNCTION_UE_SLOT_FEP_MBSFN
|
||||||
DESC = VCD function UE_SLOT_FEP_MBSFN
|
DESC = VCD function UE_SLOT_FEP_MBSFN
|
||||||
GROUP = ALL:VCD:UE:VCD_FUNCTION
|
GROUP = ALL:VCD:UE:VCD_FUNCTION
|
||||||
@@ -2843,6 +2862,11 @@ ID = VCD_FUNCTION_PDSCH_PROC
|
|||||||
GROUP = ALL:VCD:UE:VCD_FUNCTION
|
GROUP = ALL:VCD:UE:VCD_FUNCTION
|
||||||
FORMAT = int,value
|
FORMAT = int,value
|
||||||
VCD_NAME = pdsch_procedures
|
VCD_NAME = pdsch_procedures
|
||||||
|
ID = VCD_FUNCTION_PDSCH_PROC_C
|
||||||
|
DESC = VCD function PDSCH_PROC_C
|
||||||
|
GROUP = ALL:VCD:UE:VCD_FUNCTION
|
||||||
|
FORMAT = int,value
|
||||||
|
VCD_NAME = pdsch_procedures_crnti
|
||||||
ID = VCD_FUNCTION_PDSCH_PROC_SI
|
ID = VCD_FUNCTION_PDSCH_PROC_SI
|
||||||
DESC = VCD function PDSCH_PROC_SI
|
DESC = VCD function PDSCH_PROC_SI
|
||||||
GROUP = ALL:VCD:UE:VCD_FUNCTION
|
GROUP = ALL:VCD:UE:VCD_FUNCTION
|
||||||
|
|||||||
@@ -7,7 +7,8 @@ LIBS=-lm
|
|||||||
XLIBS=-lX11 -lpng -lXft
|
XLIBS=-lX11 -lpng -lXft
|
||||||
|
|
||||||
all: record replay extract_config textlog enb ue vcd macpdu2wireshark \
|
all: record replay extract_config textlog enb ue vcd macpdu2wireshark \
|
||||||
extract_input_subframe extract_output_subframe to_vcd extract multi
|
extract_input_subframe extract_output_subframe to_vcd extract multi \
|
||||||
|
gnb
|
||||||
|
|
||||||
record: utils.o record.o database.o config.o
|
record: utils.o record.o database.o config.o
|
||||||
$(CC) $(CFLAGS) -o record $^ $(LIBS)
|
$(CC) $(CFLAGS) -o record $^ $(LIBS)
|
||||||
@@ -60,6 +61,11 @@ macpdu2wireshark: macpdu2wireshark.o database.o utils.o handler.o event.o \
|
|||||||
multi: multi.o utils.o database.o config.o
|
multi: multi.o utils.o database.o config.o
|
||||||
$(CC) $(CFLAGS) -o multi $^ $(LIBS)
|
$(CC) $(CFLAGS) -o multi $^ $(LIBS)
|
||||||
|
|
||||||
|
gnb: utils.o gnb.o database.o event.o handler.o config.o \
|
||||||
|
view/view.a gui/gui.a logger/logger.a \
|
||||||
|
filter/filter.a
|
||||||
|
$(CC) $(CFLAGS) -o gnb $^ $(LIBS) $(XLIBS)
|
||||||
|
|
||||||
multi.o: ../T_IDs.h
|
multi.o: ../T_IDs.h
|
||||||
|
|
||||||
../T_IDs.h:
|
../T_IDs.h:
|
||||||
@@ -85,7 +91,7 @@ filter/filter.a:
|
|||||||
clean:
|
clean:
|
||||||
rm -f *.o core tracer_remote textlog enb ue vcd record replay
|
rm -f *.o core tracer_remote textlog enb ue vcd record replay
|
||||||
rm -f extract_config macpdu2wireshark extract_input_subframe
|
rm -f extract_config macpdu2wireshark extract_input_subframe
|
||||||
rm -f extract_output_subframe to_vcd extract multi
|
rm -f extract_output_subframe to_vcd extract multi gnb
|
||||||
cd gui && $(MAKE) clean
|
cd gui && $(MAKE) clean
|
||||||
cd view && $(MAKE) clean
|
cd view && $(MAKE) clean
|
||||||
cd logger && $(MAKE) clean
|
cd logger && $(MAKE) clean
|
||||||
|
|||||||
@@ -0,0 +1,172 @@
|
|||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <pthread.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
#include "database.h"
|
||||||
|
#include "handler.h"
|
||||||
|
#include "config.h"
|
||||||
|
#include "logger/logger.h"
|
||||||
|
#include "view/view.h"
|
||||||
|
#include "gui/gui.h"
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
widget *pucch_pusch_iq_plot;
|
||||||
|
logger *pucch_pusch_iq_logger;
|
||||||
|
} gnb_gui;
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
int socket;
|
||||||
|
int *is_on;
|
||||||
|
int nevents;
|
||||||
|
pthread_mutex_t lock;
|
||||||
|
gnb_gui *e;
|
||||||
|
void *database;
|
||||||
|
} gnb_data;
|
||||||
|
|
||||||
|
void is_on_changed(void *_d)
|
||||||
|
{
|
||||||
|
gnb_data *d = _d;
|
||||||
|
char t;
|
||||||
|
|
||||||
|
if (pthread_mutex_lock(&d->lock)) abort();
|
||||||
|
|
||||||
|
if (d->socket == -1) goto no_connection;
|
||||||
|
|
||||||
|
t = 1;
|
||||||
|
if (socket_send(d->socket, &t, 1) == -1 ||
|
||||||
|
socket_send(d->socket, &d->nevents, sizeof(int)) == -1 ||
|
||||||
|
socket_send(d->socket, d->is_on, d->nevents * sizeof(int)) == -1)
|
||||||
|
goto connection_dies;
|
||||||
|
|
||||||
|
no_connection:
|
||||||
|
if (pthread_mutex_unlock(&d->lock)) abort();
|
||||||
|
return;
|
||||||
|
|
||||||
|
connection_dies:
|
||||||
|
close(d->socket);
|
||||||
|
d->socket = -1;
|
||||||
|
if (pthread_mutex_unlock(&d->lock)) abort();
|
||||||
|
}
|
||||||
|
|
||||||
|
void usage(void)
|
||||||
|
{
|
||||||
|
printf(
|
||||||
|
"options:\n"
|
||||||
|
" -d <database file> this option is mandatory\n"
|
||||||
|
" -ip <host> connect to given IP address (default %s)\n"
|
||||||
|
" -p <port> connect to given port (default %d)\n",
|
||||||
|
DEFAULT_REMOTE_IP,
|
||||||
|
DEFAULT_REMOTE_PORT
|
||||||
|
);
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void *gui_thread(void *_g)
|
||||||
|
{
|
||||||
|
gui *g = _g;
|
||||||
|
gui_loop(g);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void gnb_main_gui(gnb_gui *e, gui *g, event_handler *h, void *database,
|
||||||
|
gnb_data *ed)
|
||||||
|
{
|
||||||
|
widget *main_window;
|
||||||
|
widget *top_container;
|
||||||
|
widget *line;
|
||||||
|
widget *w;
|
||||||
|
logger *l;
|
||||||
|
view *v;
|
||||||
|
|
||||||
|
main_window = new_toplevel_window(g, 500, 300, "gNB tracer");
|
||||||
|
|
||||||
|
top_container = new_container(g, VERTICAL);
|
||||||
|
widget_add_child(g, main_window, top_container, -1);
|
||||||
|
|
||||||
|
line = new_container(g, HORIZONTAL);
|
||||||
|
widget_add_child(g, top_container, line, -1);
|
||||||
|
|
||||||
|
/* PUCCH/PUSCH IQ data */
|
||||||
|
w = new_xy_plot(g, 55, 55, "", 50);
|
||||||
|
e->pucch_pusch_iq_plot = w;
|
||||||
|
widget_add_child(g, line, w, -1);
|
||||||
|
xy_plot_set_range(g, w, -1000, 1000, -1000, 1000);
|
||||||
|
xy_plot_set_title(g, w, "rxdataF");
|
||||||
|
l = new_iqlog_full(h, database, "GNB_PHY_PUCCH_PUSCH_IQ", "rxdataF");
|
||||||
|
v = new_view_xy(300*12*14,10,g,w,new_color(g,"#000"),XY_FORCED_MODE);
|
||||||
|
logger_add_view(l, v);
|
||||||
|
e->pucch_pusch_iq_logger = l;
|
||||||
|
}
|
||||||
|
|
||||||
|
int main(int n, char **v)
|
||||||
|
{
|
||||||
|
char *database_filename = NULL;
|
||||||
|
void *database;
|
||||||
|
char *ip = DEFAULT_REMOTE_IP;
|
||||||
|
int port = DEFAULT_REMOTE_PORT;
|
||||||
|
int *is_on;
|
||||||
|
int number_of_events;
|
||||||
|
int i;
|
||||||
|
event_handler *h;
|
||||||
|
gnb_data gnb_data;
|
||||||
|
gui *g;
|
||||||
|
gnb_gui eg;
|
||||||
|
|
||||||
|
for (i = 1; i < n; i++) {
|
||||||
|
if (!strcmp(v[i], "-h") || !strcmp(v[i], "--help")) usage();
|
||||||
|
if (!strcmp(v[i], "-d"))
|
||||||
|
{ if (i > n-2) usage(); database_filename = v[++i]; continue; }
|
||||||
|
usage();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (database_filename == NULL) {
|
||||||
|
printf("ERROR: provide a database file (-d)\n");
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
database = parse_database(database_filename);
|
||||||
|
|
||||||
|
load_config_file(database_filename);
|
||||||
|
|
||||||
|
number_of_events = number_of_ids(database);
|
||||||
|
is_on = calloc(number_of_events, sizeof(int));
|
||||||
|
if (is_on == NULL) abort();
|
||||||
|
|
||||||
|
h = new_handler(database);
|
||||||
|
|
||||||
|
on_off(database, "GNB_PHY_PUCCH_PUSCH_IQ", is_on, 1);
|
||||||
|
|
||||||
|
gnb_data.database = database;
|
||||||
|
gnb_data.socket = -1;
|
||||||
|
gnb_data.is_on = is_on;
|
||||||
|
gnb_data.nevents = number_of_events;
|
||||||
|
if (pthread_mutex_init(&gnb_data.lock, NULL)) abort();
|
||||||
|
|
||||||
|
g = gui_init();
|
||||||
|
new_thread(gui_thread, g);
|
||||||
|
|
||||||
|
gnb_main_gui(&eg, g, h, database, &gnb_data);
|
||||||
|
|
||||||
|
OBUF ebuf = { osize: 0, omaxsize: 0, obuf: NULL };
|
||||||
|
|
||||||
|
restart:
|
||||||
|
clear_remote_config();
|
||||||
|
if (gnb_data.socket != -1) close(gnb_data.socket);
|
||||||
|
gnb_data.socket = connect_to(ip, port);
|
||||||
|
|
||||||
|
/* send the first message - activate selected traces */
|
||||||
|
is_on_changed(&gnb_data);
|
||||||
|
|
||||||
|
/* read messages */
|
||||||
|
while (1) {
|
||||||
|
event e;
|
||||||
|
e = get_event(gnb_data.socket, &ebuf, database);
|
||||||
|
if (e.type == -1) goto restart;
|
||||||
|
if (pthread_mutex_lock(&gnb_data.lock)) abort();
|
||||||
|
handle_event(h, e);
|
||||||
|
if (pthread_mutex_unlock(&gnb_data.lock)) abort();
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
@@ -74,6 +74,44 @@ static void _event(void *p, event e)
|
|||||||
l->common.v[i]->append(l->common.v[i], l->i, l->q, count);
|
l->common.v[i]->append(l->common.v[i], l->i, l->q, count);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void _event_full(void *p, event e)
|
||||||
|
{
|
||||||
|
struct iqlog *l = p;
|
||||||
|
int i;
|
||||||
|
void *buffer;
|
||||||
|
int bsize;
|
||||||
|
int nsamples;
|
||||||
|
float *idst, *qdst;
|
||||||
|
|
||||||
|
if (l->common.filter != NULL && filter_eval(l->common.filter, e) == 0)
|
||||||
|
return;
|
||||||
|
|
||||||
|
buffer = e.e[l->buffer_arg].b;
|
||||||
|
bsize = e.e[l->buffer_arg].bsize;
|
||||||
|
|
||||||
|
nsamples = bsize / 4;
|
||||||
|
|
||||||
|
if (nsamples > l->max_length) {
|
||||||
|
l->i = realloc(l->i, nsamples * sizeof(float));
|
||||||
|
if (l->i == NULL) abort();
|
||||||
|
l->q = realloc(l->q, nsamples * sizeof(float));
|
||||||
|
if (l->q == NULL) abort();
|
||||||
|
l->max_length = nsamples;
|
||||||
|
}
|
||||||
|
|
||||||
|
idst = l->i;
|
||||||
|
qdst = l->q;
|
||||||
|
for (i = 0; i < nsamples; i++) {
|
||||||
|
*idst = ((int16_t *)buffer)[i * 2];
|
||||||
|
*qdst = ((int16_t *)buffer)[i * 2 + 1];
|
||||||
|
idst++;
|
||||||
|
qdst++;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (i = 0; i < l->common.vsize; i++)
|
||||||
|
l->common.v[i]->append(l->common.v[i], l->i, l->q, nsamples);
|
||||||
|
}
|
||||||
|
|
||||||
logger *new_iqlog(event_handler *h, void *database,
|
logger *new_iqlog(event_handler *h, void *database,
|
||||||
char *event_name, char *nb_rb, char *N_RB_UL, char *symbols_per_tti,
|
char *event_name, char *nb_rb, char *N_RB_UL, char *symbols_per_tti,
|
||||||
char *buffer_varname)
|
char *buffer_varname)
|
||||||
@@ -149,3 +187,43 @@ logger *new_iqlog(event_handler *h, void *database,
|
|||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
logger *new_iqlog_full(event_handler *h, void *database, char *event_name,
|
||||||
|
char *buffer_varname)
|
||||||
|
{
|
||||||
|
struct iqlog *ret;
|
||||||
|
int event_id;
|
||||||
|
database_event_format f;
|
||||||
|
int i;
|
||||||
|
|
||||||
|
ret = calloc(1, sizeof(struct iqlog)); if (ret == NULL) abort();
|
||||||
|
|
||||||
|
ret->common.event_name = strdup(event_name);
|
||||||
|
if (ret->common.event_name == NULL) abort();
|
||||||
|
ret->database = database;
|
||||||
|
|
||||||
|
event_id = event_id_from_name(database, event_name);
|
||||||
|
|
||||||
|
ret->common.handler_id = register_handler_function(h, event_id, _event_full,
|
||||||
|
ret);
|
||||||
|
|
||||||
|
f = get_format(database, event_id);
|
||||||
|
|
||||||
|
/* look for args */
|
||||||
|
ret->buffer_arg = -1;
|
||||||
|
for (i = 0; i < f.count; i++) {
|
||||||
|
if (!strcmp(f.name[i], buffer_varname)) ret->buffer_arg = i;
|
||||||
|
}
|
||||||
|
if (ret->buffer_arg == -1) {
|
||||||
|
printf("%s:%d: buffer argument '%s' not found in event '%s'\n",
|
||||||
|
__FILE__, __LINE__, buffer_varname, event_name);
|
||||||
|
abort();
|
||||||
|
}
|
||||||
|
if (strcmp(f.type[ret->buffer_arg], "buffer") != 0) {
|
||||||
|
printf("%s:%d: argument '%s' has wrong type (should be 'buffer')\n",
|
||||||
|
__FILE__, __LINE__, buffer_varname);
|
||||||
|
abort();
|
||||||
|
}
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|||||||
@@ -23,6 +23,8 @@ logger *new_ticklog(void *event_handler, void *database,
|
|||||||
logger *new_iqlog(void *event_handler, void *database,
|
logger *new_iqlog(void *event_handler, void *database,
|
||||||
char *event_name, char *nb_rb, char *N_RB_UL, char *symbols_per_tti,
|
char *event_name, char *nb_rb, char *N_RB_UL, char *symbols_per_tti,
|
||||||
char *buffer_varname);
|
char *buffer_varname);
|
||||||
|
logger *new_iqlog_full(void *event_handler, void *database, char *event_name,
|
||||||
|
char *buffer_varname);
|
||||||
logger *new_iqdotlog(void *event_handler, void *database,
|
logger *new_iqdotlog(void *event_handler, void *database,
|
||||||
char *event_name, char *I, char *Q);
|
char *event_name, char *I, char *Q);
|
||||||
|
|
||||||
|
|||||||
@@ -32,6 +32,81 @@
|
|||||||
|
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
#include "assertions.h"
|
#include "assertions.h"
|
||||||
|
#include "nr_common.h"
|
||||||
|
|
||||||
|
// Table 5.2-1 NR operating bands in FR1 & FR2 (3GPP TS 38.101)
|
||||||
|
// Table 5.4.2.3-1 Applicable NR-ARFCN per operating band in FR1 & FR2 (3GPP TS 38.101)
|
||||||
|
// Notes:
|
||||||
|
// - N_OFFs for bands from 80 to 89 and band 95 is referred to UL
|
||||||
|
// - Frequencies are expressed in KHz
|
||||||
|
// - col: NR_band ul_min ul_max dl_min dl_max step N_OFFs_DL deltaf_raster
|
||||||
|
nr_bandentry_t nr_bandtable[] = {
|
||||||
|
{1, 1920000, 1980000, 2110000, 2170000, 20, 422000, 100},
|
||||||
|
{2, 1850000, 1910000, 1930000, 1990000, 20, 386000, 100},
|
||||||
|
{3, 1710000, 1785000, 1805000, 1880000, 20, 361000, 100},
|
||||||
|
{5, 824000, 849000, 869000, 894000, 20, 173800, 100},
|
||||||
|
{7, 2500000, 2570000, 2620000, 2690000, 20, 524000, 100},
|
||||||
|
{8, 880000, 915000, 925000, 960000, 20, 185000, 100},
|
||||||
|
{12, 698000, 716000, 729000, 746000, 20, 145800, 100},
|
||||||
|
{14, 788000, 798000, 758000, 768000, 20, 151600, 100},
|
||||||
|
{18, 815000, 830000, 860000, 875000, 20, 172000, 100},
|
||||||
|
{20, 832000, 862000, 791000, 821000, 20, 158200, 100},
|
||||||
|
{25, 1850000, 1915000, 1930000, 1995000, 20, 386000, 100},
|
||||||
|
{26, 814000, 849000, 859000, 894000, 20, 171800, 100},
|
||||||
|
{28, 703000, 758000, 758000, 813000, 20, 151600, 100},
|
||||||
|
{29, 000, 000, 717000, 728000, 20, 143400, 100},
|
||||||
|
{30, 2305000, 2315000, 2350000, 2360000, 20, 470000, 100},
|
||||||
|
{34, 2010000, 2025000, 2010000, 2025000, 20, 402000, 100},
|
||||||
|
{38, 2570000, 2620000, 2570000, 2630000, 20, 514000, 100},
|
||||||
|
{39, 1880000, 1920000, 1880000, 1920000, 20, 376000, 100},
|
||||||
|
{40, 2300000, 2400000, 2300000, 2400000, 20, 460000, 100},
|
||||||
|
{41, 2496000, 2690000, 2496000, 2690000, 3, 499200, 15},
|
||||||
|
{41, 2496000, 2690000, 2496000, 2690000, 6, 499200, 30},
|
||||||
|
{47, 5855000, 5925000, 5855000, 5925000, 1, 790334, 15},
|
||||||
|
//{48, 3550000, 3700000, 3550000, 3700000, 1, 636667, 15},
|
||||||
|
//{48, 3550000, 3700000, 3550000, 3700000, 2, 636668, 30},
|
||||||
|
{50, 1432000, 1517000, 1432000, 1517000, 20, 286400, 100},
|
||||||
|
{51, 1427000, 1432000, 1427000, 1432000, 20, 285400, 100},
|
||||||
|
{53, 2483500, 2495000, 2483500, 2495000, 20, 496700, 100},
|
||||||
|
{65, 1920000, 2010000, 2110000, 2200000, 20, 422000, 100},
|
||||||
|
{66, 1710000, 1780000, 2110000, 2200000, 20, 422000, 100},
|
||||||
|
{70, 1695000, 1710000, 1995000, 2020000, 20, 399000, 100},
|
||||||
|
{71, 663000, 698000, 617000, 652000, 20, 123400, 100},
|
||||||
|
{74, 1427000, 1470000, 1475000, 1518000, 20, 295000, 100},
|
||||||
|
{75, 000, 000, 1432000, 1517000, 20, 286400, 100},
|
||||||
|
{76, 000, 000, 1427000, 1432000, 20, 285400, 100},
|
||||||
|
{77, 3300000, 4200000, 3300000, 4200000, 1, 620000, 15},
|
||||||
|
{77, 3300000, 4200000, 3300000, 4200000, 2, 620000, 30},
|
||||||
|
{78, 3300000, 3800000, 3300000, 3800000, 1, 620000, 15},
|
||||||
|
{78, 3300000, 3800000, 3300000, 3800000, 2, 620000, 30},
|
||||||
|
{79, 4400010, 5000000, 4400010, 5000000, 1, 693334, 15},
|
||||||
|
{79, 4400010, 5000000, 4400010, 5000000, 2, 693334, 30},
|
||||||
|
{80, 1710000, 1785000, 000, 000, 20, 342000, 100},
|
||||||
|
{81, 880000, 915000, 000, 000, 20, 176000, 100},
|
||||||
|
{82, 832000, 862000, 000, 000, 20, 166400, 100},
|
||||||
|
{83, 703000, 748000, 000, 000, 20, 140600, 100},
|
||||||
|
{84, 1920000, 1980000, 000, 000, 20, 384000, 100},
|
||||||
|
{86, 1710000, 1785000, 000, 000, 20, 342000, 100},
|
||||||
|
{89, 824000, 849000, 000, 000, 20, 342000, 100},
|
||||||
|
{90, 2496000, 2690000, 2496000, 2690000, 3, 499200, 15},
|
||||||
|
{90, 2496000, 2690000, 2496000, 2690000, 6, 499200, 30},
|
||||||
|
{90, 2496000, 2690000, 2496000, 2690000, 20, 499200, 100},
|
||||||
|
{91, 832000, 862000, 1427000, 1432000, 20, 285400, 100},
|
||||||
|
{92, 832000, 862000, 1432000, 1517000, 20, 286400, 100},
|
||||||
|
{93, 880000, 915000, 1427000, 1432000, 20, 285400, 100},
|
||||||
|
{94, 880000, 915000, 1432000, 1517000, 20, 286400, 100},
|
||||||
|
{95, 2010000, 2025000, 000, 000, 20, 402000, 100},
|
||||||
|
{257,26500020,29500000,26500020,29500000, 1,2054166, 60},
|
||||||
|
{257,26500080,29500000,26500080,29500000, 2,2054167, 120},
|
||||||
|
{258,24250080,27500000,24250080,27500000, 1,2016667, 60},
|
||||||
|
{258,24250080,27500000,24250080,27500000, 2,2016667, 120},
|
||||||
|
{260,37000020,40000000,37000020,40000000, 1,2229166, 60},
|
||||||
|
{260,37000080,40000000,37000080,40000000, 2,2229167, 120},
|
||||||
|
{261,27500040,28350000,27500040,28350000, 1,2070833, 60},
|
||||||
|
{261,27500040,28350000,27500040,28350000, 2,2070833, 120}
|
||||||
|
};
|
||||||
|
|
||||||
|
const size_t nr_bandtable_size = sizeof(nr_bandtable) / sizeof(nr_bandentry_t);
|
||||||
|
|
||||||
int NRRIV2BW(int locationAndBandwidth,int N_RB) {
|
int NRRIV2BW(int locationAndBandwidth,int N_RB) {
|
||||||
int tmp = locationAndBandwidth/N_RB;
|
int tmp = locationAndBandwidth/N_RB;
|
||||||
|
|||||||
@@ -36,6 +36,20 @@
|
|||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
#include "assertions.h"
|
#include "assertions.h"
|
||||||
|
|
||||||
|
typedef struct nr_bandentry_s {
|
||||||
|
int16_t band;
|
||||||
|
uint64_t ul_min;
|
||||||
|
uint64_t ul_max;
|
||||||
|
uint64_t dl_min;
|
||||||
|
uint64_t dl_max;
|
||||||
|
uint64_t step_size;
|
||||||
|
uint64_t N_OFFs_DL;
|
||||||
|
uint8_t deltaf_raster;
|
||||||
|
} nr_bandentry_t;
|
||||||
|
|
||||||
|
extern const size_t nr_bandtable_size;
|
||||||
|
extern nr_bandentry_t nr_bandtable[];
|
||||||
|
|
||||||
int NRRIV2BW(int locationAndBandwidth,int N_RB);
|
int NRRIV2BW(int locationAndBandwidth,int N_RB);
|
||||||
int NRRIV2PRBOFFSET(int locationAndBandwidth,int N_RB);
|
int NRRIV2PRBOFFSET(int locationAndBandwidth,int N_RB);
|
||||||
int PRBalloc_to_locationandbandwidth0(int NPRB,int RBstart,int BWPsize);
|
int PRBalloc_to_locationandbandwidth0(int NPRB,int RBstart,int BWPsize);
|
||||||
|
|||||||
@@ -339,7 +339,9 @@ extern "C" {
|
|||||||
int itti_create_queue(const task_info_t *taskInfo) {
|
int itti_create_queue(const task_info_t *taskInfo) {
|
||||||
pthread_mutex_lock (&lock_nb_queues);
|
pthread_mutex_lock (&lock_nb_queues);
|
||||||
int newQueue=nb_queues++;
|
int newQueue=nb_queues++;
|
||||||
AssertFatal(tasks=(task_list_t **) realloc(tasks, nb_queues * sizeof(*tasks)),"");
|
task_list_t **new_tasks = (task_list_t **)realloc(tasks, nb_queues * sizeof(*tasks));
|
||||||
|
AssertFatal(new_tasks != NULL, "could not realloc() tasks list");
|
||||||
|
tasks = new_tasks;
|
||||||
tasks[newQueue]= new task_list_t;
|
tasks[newQueue]= new task_list_t;
|
||||||
pthread_mutex_unlock (&lock_nb_queues);
|
pthread_mutex_unlock (&lock_nb_queues);
|
||||||
LOG_I(TMR,"Starting itti queue: %s as task %d\n", taskInfo->name, newQueue);
|
LOG_I(TMR,"Starting itti queue: %s as task %d\n", taskInfo->name, newQueue);
|
||||||
|
|||||||
+10
-7
@@ -132,9 +132,9 @@ With the RF simulator (on the same machine):
|
|||||||
|
|
||||||
`sudo RFSIMULATOR=127.0.0.1 ./nr-uesoftmodem --do-ra --rfsim --parallel-config PARALLEL_SINGLE_THREAD`
|
`sudo RFSIMULATOR=127.0.0.1 ./nr-uesoftmodem --do-ra --rfsim --parallel-config PARALLEL_SINGLE_THREAD`
|
||||||
|
|
||||||
## sa setup with OAI
|
## SA setup with OAI
|
||||||
|
|
||||||
The sa flag is used to run gNB in standalone mode. Currently OAI in NR standalone mode transmits and receives SIB1.
|
The sa flag is used to run gNB in standalone mode. Currently OAI in NR standalone mode transmits and receives SIB1 and triggers the RA procedure for initial access.
|
||||||
|
|
||||||
In order to run gNB in standalone mode, the following flag is needed at gNB:
|
In order to run gNB in standalone mode, the following flag is needed at gNB:
|
||||||
|
|
||||||
@@ -147,8 +147,9 @@ At the gNB the --sa flag does the following
|
|||||||
- it encodes the RRCConfiguration and the RBconfig message and stores them in the binary files rbconfig.raw and reconfig.raw
|
- it encodes the RRCConfiguration and the RBconfig message and stores them in the binary files rbconfig.raw and reconfig.raw
|
||||||
- the RRC encodes SIB1 according the configuration file and transmits it through PDSCH
|
- the RRC encodes SIB1 according the configuration file and transmits it through PDSCH
|
||||||
|
|
||||||
At the UE the --sa flag will
|
At the UE the --sa flag will:
|
||||||
- read the binary files rbconfig.raw and reconfig.raw from the current directory (a different directory can be specified with the flag --rrc_config_path) and process them.
|
- Read the binary files rbconfig.raw and reconfig.raw from the current directory (a different directory can be specified with the flag --rrc_config_path) and process them
|
||||||
|
- After the successful decoding of a SIB1 at RRC, the UE will start the 5G NR Initial Access Procedure by triggering the RA procedure.
|
||||||
|
|
||||||
From the `cmake_targets/ran_build/build` folder:
|
From the `cmake_targets/ran_build/build` folder:
|
||||||
|
|
||||||
@@ -168,7 +169,7 @@ With the RF simulator (on the same machine):
|
|||||||
|
|
||||||
## IF setup with OAI
|
## IF setup with OAI
|
||||||
|
|
||||||
The -C and -CO flags can be used together at UE side to set custom downlink and uplink FR1 intermediate frequencies for the IF equipment.
|
The -C and --CO flags can be used together at UE side to set custom downlink and uplink FR1 arbitrary frequencies for the IF equipment.
|
||||||
|
|
||||||
In order to run this setup, the following flags are needed at the UE side:
|
In order to run this setup, the following flags are needed at the UE side:
|
||||||
|
|
||||||
@@ -182,9 +183,11 @@ and the following parameters must be configured in the RUs section of the gNB co
|
|||||||
|
|
||||||
`if_offset`
|
`if_offset`
|
||||||
|
|
||||||
### Run OAI with custom DL/UL intermediate frequencies
|
The values must be given in Hz.
|
||||||
|
|
||||||
The following example uses DL frequency 2169.080 MHz and UL frequency offset -400 MHz, with a configuration file for band 66 at gNB side.
|
### Run OAI with custom DL/UL arbitrary frequencies
|
||||||
|
|
||||||
|
The following example uses DL frequency 2169.080 MHz and UL frequency offset -400 MHz, with a configuration file for band 66 (FDD) at gNB side.
|
||||||
|
|
||||||
From the `cmake_targets/ran_build/build` folder:
|
From the `cmake_targets/ran_build/build` folder:
|
||||||
|
|
||||||
|
|||||||
@@ -30,8 +30,6 @@ http://www.saelig.com/MFR00066/ste2300.htm
|
|||||||
## Configuration Overview
|
## Configuration Overview
|
||||||
|
|
||||||
* Non Standalone (NSA) configuration : initial Control Plane established between UE and RAN eNB, then User Plane established between UE and gNB, Core network is 4G based supporting rel 15
|
* Non Standalone (NSA) configuration : initial Control Plane established between UE and RAN eNB, then User Plane established between UE and gNB, Core network is 4G based supporting rel 15
|
||||||
|
|
||||||
* Commercial UE: Oppo Reno 5G
|
|
||||||
* OAI Software Defined gNB and eNB
|
* OAI Software Defined gNB and eNB
|
||||||
* eNB RF front end: USRP (ETTUS) B200 Mini or B210
|
* eNB RF front end: USRP (ETTUS) B200 Mini or B210
|
||||||
* gNB RF front end: USRP (ETTUS) B200 Mini or B210 (N310 will be needed for MIMO and wider BW's)
|
* gNB RF front end: USRP (ETTUS) B200 Mini or B210 (N310 will be needed for MIMO and wider BW's)
|
||||||
@@ -40,6 +38,18 @@ http://www.saelig.com/MFR00066/ste2300.htm
|
|||||||
* BW: 40MHz
|
* BW: 40MHz
|
||||||
* Antenna scheme: SISO
|
* Antenna scheme: SISO
|
||||||
|
|
||||||
|
## COTS UEs
|
||||||
|
|
||||||
|
Our code might not work with all 5G phones yet, but we are constantly improving it. Here is a list of COTS UEs that we know that work with OAI.
|
||||||
|
|
||||||
|
* Oppo Reno 5G
|
||||||
|
* Samsung A90 5G
|
||||||
|
* Google Pixel 5G (note1)
|
||||||
|
* Simcom SIMCOM8200EA
|
||||||
|
* Quectel RM500Q-GL
|
||||||
|
|
||||||
|
Note1: In the version we have at Eurecom, you need to set the PLMN to 50501, and you also need to change the firmware to "11.0.0 (RD1A.201105.003.B1, Nov 2020, EU carriers)" (see https://developers.google.com/android/images)
|
||||||
|
|
||||||
## Repository
|
## Repository
|
||||||
|
|
||||||
https://gitlab.eurecom.fr/oai/openairinterface5g/tree/develop
|
https://gitlab.eurecom.fr/oai/openairinterface5g/tree/develop
|
||||||
|
|||||||
@@ -27,14 +27,15 @@
|
|||||||
|
|
||||||
FROM localhost/ran-build:latest AS enb-build
|
FROM localhost/ran-build:latest AS enb-build
|
||||||
|
|
||||||
|
RUN rm -Rf /oai-ran
|
||||||
WORKDIR /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 && \
|
||||||
rm -Rf log && \
|
|
||||||
mkdir -p log && \
|
mkdir -p log && \
|
||||||
./build_oai --eNB --ninja -w USRP
|
./build_oai --eNB --ninja -w USRP --verbose-ci
|
||||||
|
|
||||||
# debug
|
# debug
|
||||||
#RUN ldconfig -v && ldd /oai-ran/targets/bin/lte-softmodem.Rel15
|
#RUN ldconfig -v && ldd /oai-ran/targets/bin/lte-softmodem.Rel15
|
||||||
|
|||||||
@@ -27,14 +27,15 @@
|
|||||||
|
|
||||||
FROM ran-build:latest AS enb-build
|
FROM ran-build:latest AS enb-build
|
||||||
|
|
||||||
|
RUN rm -Rf /oai-ran
|
||||||
WORKDIR /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 && \
|
||||||
rm -Rf log && \
|
|
||||||
mkdir -p log && \
|
mkdir -p log && \
|
||||||
./build_oai --eNB --ninja -w USRP
|
./build_oai --eNB --ninja -w USRP --verbose-ci
|
||||||
|
|
||||||
RUN apt-get install -y python3-pip && \
|
RUN apt-get install -y python3-pip && \
|
||||||
pip3 install --ignore-installed pyyaml && \
|
pip3 install --ignore-installed pyyaml && \
|
||||||
|
|||||||
@@ -27,14 +27,15 @@
|
|||||||
|
|
||||||
FROM localhost/ran-build:latest AS gnb-build
|
FROM localhost/ran-build:latest AS gnb-build
|
||||||
|
|
||||||
|
RUN rm -Rf /oai-ran
|
||||||
WORKDIR /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 && \
|
||||||
rm -Rf log && \
|
|
||||||
mkdir -p log && \
|
mkdir -p log && \
|
||||||
./build_oai --gNB --ninja -w USRP
|
./build_oai --gNB --ninja -w USRP --verbose-ci
|
||||||
|
|
||||||
#debug
|
#debug
|
||||||
#RUN ldconfig -v
|
#RUN ldconfig -v
|
||||||
|
|||||||
@@ -27,14 +27,15 @@
|
|||||||
|
|
||||||
FROM ran-build:latest AS gnb-build
|
FROM ran-build:latest AS gnb-build
|
||||||
|
|
||||||
|
RUN rm -Rf /oai-ran
|
||||||
WORKDIR /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 && \
|
||||||
rm -Rf log && \
|
|
||||||
mkdir -p log && \
|
mkdir -p log && \
|
||||||
./build_oai --gNB --ninja -w USRP
|
./build_oai --gNB --ninja -w USRP --verbose-ci
|
||||||
|
|
||||||
#debug
|
#debug
|
||||||
RUN ldconfig -v
|
RUN ldconfig -v
|
||||||
|
|||||||
@@ -27,15 +27,15 @@
|
|||||||
|
|
||||||
FROM localhost/ran-build:latest AS lte-ue-build
|
FROM localhost/ran-build:latest AS lte-ue-build
|
||||||
|
|
||||||
|
RUN rm -Rf /oai-ran
|
||||||
WORKDIR /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 && \
|
||||||
rm -Rf log && \
|
|
||||||
mkdir -p log && \
|
mkdir -p log && \
|
||||||
./build_oai --UE --ninja -w USRP
|
./build_oai --UE --ninja -w USRP --verbose-ci
|
||||||
|
|
||||||
# debug
|
# debug
|
||||||
#RUN ldconfig -v && ldd /oai-ran/targets/bin/lte-uesoftmodem.Rel15
|
#RUN ldconfig -v && ldd /oai-ran/targets/bin/lte-uesoftmodem.Rel15
|
||||||
|
|||||||
@@ -27,14 +27,15 @@
|
|||||||
|
|
||||||
FROM ran-build:latest AS lte-ue-build
|
FROM ran-build:latest AS lte-ue-build
|
||||||
|
|
||||||
|
RUN rm -Rf /oai-ran
|
||||||
WORKDIR /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 && \
|
||||||
rm -Rf log && \
|
|
||||||
mkdir -p log && \
|
mkdir -p log && \
|
||||||
./build_oai --UE --ninja -w USRP
|
./build_oai --UE --ninja -w USRP --verbose-ci
|
||||||
|
|
||||||
# debug
|
# debug
|
||||||
#RUN ldconfig -v
|
#RUN ldconfig -v
|
||||||
|
|||||||
@@ -27,14 +27,15 @@
|
|||||||
|
|
||||||
FROM localhost/ran-build:latest AS nr-ue-build
|
FROM localhost/ran-build:latest AS nr-ue-build
|
||||||
|
|
||||||
|
RUN rm -Rf /oai-ran
|
||||||
WORKDIR /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 && \
|
||||||
rm -Rf log && \
|
|
||||||
mkdir -p log && \
|
mkdir -p log && \
|
||||||
./build_oai --nrUE --ninja -w USRP
|
./build_oai --nrUE --ninja -w USRP --verbose-ci
|
||||||
|
|
||||||
# debug
|
# debug
|
||||||
#RUN ldconfig -v
|
#RUN ldconfig -v
|
||||||
|
|||||||
@@ -27,14 +27,15 @@
|
|||||||
|
|
||||||
FROM ran-build:latest AS nr-ue-build
|
FROM ran-build:latest AS nr-ue-build
|
||||||
|
|
||||||
|
RUN rm -Rf /oai-ran
|
||||||
WORKDIR /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 && \
|
||||||
rm -Rf log && \
|
|
||||||
mkdir -p log && \
|
mkdir -p log && \
|
||||||
./build_oai --nrUE --ninja -w USRP
|
./build_oai --nrUE --ninja -w USRP --verbose-ci
|
||||||
|
|
||||||
# debug
|
# debug
|
||||||
#RUN ldconfig -v
|
#RUN ldconfig -v
|
||||||
|
|||||||
@@ -74,6 +74,7 @@ int config_sync_var=-1;
|
|||||||
volatile int oai_exit = 0;
|
volatile int oai_exit = 0;
|
||||||
double cpuf;
|
double cpuf;
|
||||||
uint16_t sf_ahead=4;
|
uint16_t sf_ahead=4;
|
||||||
|
//uint16_t slot_ahead=6;
|
||||||
int otg_enabled;
|
int otg_enabled;
|
||||||
uint64_t downlink_frequency[MAX_NUM_CCs][4];
|
uint64_t downlink_frequency[MAX_NUM_CCs][4];
|
||||||
int32_t uplink_frequency_offset[MAX_NUM_CCs][4];
|
int32_t uplink_frequency_offset[MAX_NUM_CCs][4];
|
||||||
|
|||||||
+93
-651
@@ -81,10 +81,11 @@
|
|||||||
|
|
||||||
#include "s1ap_eNB.h"
|
#include "s1ap_eNB.h"
|
||||||
#include "SIMULATION/ETH_TRANSPORT/proto.h"
|
#include "SIMULATION/ETH_TRANSPORT/proto.h"
|
||||||
|
#include <executables/softmodem-common.h>
|
||||||
|
|
||||||
#include "T.h"
|
#include "T.h"
|
||||||
|
#include "nfapi/oai_integration/vendor_ext.h"
|
||||||
|
#include <nfapi/oai_integration/nfapi_pnf.h>
|
||||||
//#define DEBUG_THREADS 1
|
//#define DEBUG_THREADS 1
|
||||||
|
|
||||||
//#define USRP_DEBUG 1
|
//#define USRP_DEBUG 1
|
||||||
@@ -92,17 +93,6 @@
|
|||||||
// extern openair0_device openair0;
|
// extern openair0_device openair0;
|
||||||
|
|
||||||
|
|
||||||
extern volatile int start_gNB;
|
|
||||||
extern volatile int start_UE;
|
|
||||||
extern volatile int oai_exit;
|
|
||||||
|
|
||||||
extern openair0_config_t openair0_cfg[MAX_CARDS];
|
|
||||||
|
|
||||||
extern int transmission_mode;
|
|
||||||
|
|
||||||
extern uint16_t sf_ahead;
|
|
||||||
extern uint16_t sl_ahead;
|
|
||||||
|
|
||||||
//pthread_t main_gNB_thread;
|
//pthread_t main_gNB_thread;
|
||||||
|
|
||||||
time_stats_t softmodem_stats_mt; // main thread
|
time_stats_t softmodem_stats_mt; // main thread
|
||||||
@@ -111,39 +101,43 @@ time_stats_t softmodem_stats_rxtx_sf; // total tx time
|
|||||||
time_stats_t nfapi_meas; // total tx time
|
time_stats_t nfapi_meas; // total tx time
|
||||||
time_stats_t softmodem_stats_rx_sf; // total rx time
|
time_stats_t softmodem_stats_rx_sf; // total rx time
|
||||||
|
|
||||||
/* mutex, cond and variable to serialize phy proc TX calls
|
|
||||||
* (this mechanism may be relaxed in the future for better
|
|
||||||
* performances)
|
|
||||||
*/
|
|
||||||
static struct {
|
|
||||||
pthread_mutex_t mutex_phy_proc_tx;
|
|
||||||
pthread_cond_t cond_phy_proc_tx;
|
|
||||||
volatile uint8_t phy_proc_CC_id;
|
|
||||||
} sync_phy_proc;
|
|
||||||
|
|
||||||
extern double cpuf;
|
|
||||||
|
|
||||||
void init_gNB(int,int);
|
|
||||||
void stop_gNB(int nb_inst);
|
|
||||||
|
|
||||||
int wakeup_txfh(PHY_VARS_gNB *gNB, gNB_L1_rxtx_proc_t *proc, int frame_tx, int slot_tx, uint64_t timestamp_tx);
|
|
||||||
int wakeup_tx(PHY_VARS_gNB *gNB, int frame_rx, int slot_rx, int frame_tx, int slot_tx, uint64_t timestamp_tx);
|
|
||||||
#include "executables/thread-common.h"
|
#include "executables/thread-common.h"
|
||||||
//extern PARALLEL_CONF_t get_thread_parallel_conf(void);
|
|
||||||
//extern WORKER_CONF_t get_thread_worker_conf(void);
|
|
||||||
|
|
||||||
|
|
||||||
void wakeup_prach_gNB(PHY_VARS_gNB *gNB, RU_t *ru, int frame, int subframe);
|
|
||||||
|
|
||||||
extern uint8_t nfapi_mode;
|
|
||||||
extern void oai_subframe_ind(uint16_t sfn, uint16_t sf);
|
|
||||||
extern void add_subframe(uint16_t *frameP, uint16_t *subframeP, int offset);
|
|
||||||
|
|
||||||
//#define TICK_TO_US(ts) (ts.diff)
|
//#define TICK_TO_US(ts) (ts.diff)
|
||||||
#define TICK_TO_US(ts) (ts.trials==0?0:ts.diff/ts.trials)
|
#define TICK_TO_US(ts) (ts.trials==0?0:ts.diff/ts.trials)
|
||||||
|
|
||||||
static inline int rxtx(PHY_VARS_gNB *gNB, int frame_rx, int slot_rx, int frame_tx, int slot_tx, char *thread_name) {
|
|
||||||
|
|
||||||
|
void tx_func(void *param) {
|
||||||
|
|
||||||
|
processingData_L1_t *info = (processingData_L1_t *) param;
|
||||||
|
PHY_VARS_gNB *gNB = info->gNB;
|
||||||
|
int frame_tx = info->frame_tx;
|
||||||
|
int slot_tx = info->slot_tx;
|
||||||
|
|
||||||
|
phy_procedures_gNB_TX(gNB, frame_tx,slot_tx, 1);
|
||||||
|
|
||||||
|
// start FH TX processing
|
||||||
|
notifiedFIFO_elt_t *res;
|
||||||
|
res = pullTpool(gNB->resp_RU_tx, gNB->threadPool);
|
||||||
|
processingData_RU_t *syncMsg = (processingData_RU_t *)NotifiedFifoData(res);
|
||||||
|
syncMsg->frame_tx = frame_tx;
|
||||||
|
syncMsg->slot_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) {
|
||||||
|
|
||||||
|
processingData_L1_t *info = (processingData_L1_t *) param;
|
||||||
|
PHY_VARS_gNB *gNB = info->gNB;
|
||||||
|
int frame_rx = info->frame_rx;
|
||||||
|
int slot_rx = info->slot_rx;
|
||||||
|
int frame_tx = info->frame_tx;
|
||||||
|
int slot_tx = info->slot_tx;
|
||||||
sl_ahead = sf_ahead*gNB->frame_parms.slots_per_subframe;
|
sl_ahead = sf_ahead*gNB->frame_parms.slots_per_subframe;
|
||||||
nfapi_nr_config_request_scf_t *cfg = &gNB->gNB_config;
|
nfapi_nr_config_request_scf_t *cfg = &gNB->gNB_config;
|
||||||
|
|
||||||
@@ -151,13 +145,14 @@ static inline int rxtx(PHY_VARS_gNB *gNB, int frame_rx, int slot_rx, int frame_t
|
|||||||
|
|
||||||
// *******************************************************************
|
// *******************************************************************
|
||||||
// NFAPI not yet supported for NR - this code has to be revised
|
// NFAPI not yet supported for NR - this code has to be revised
|
||||||
if (nfapi_mode == 1) {
|
if (NFAPI_MODE == NFAPI_MODE_PNF) {
|
||||||
// I am a PNF and I need to let nFAPI know that we have a (sub)frame tick
|
// I am a PNF and I need to let nFAPI know that we have a (sub)frame tick
|
||||||
//add_subframe(&frame, &subframe, 4);
|
//add_subframe(&frame, &subframe, 4);
|
||||||
//oai_subframe_ind(proc->frame_tx, proc->subframe_tx);
|
//oai_subframe_ind(proc->frame_tx, proc->subframe_tx);
|
||||||
//LOG_D(PHY, "oai_subframe_ind(frame:%u, subframe:%d) - NOT CALLED ********\n", frame, subframe);
|
//LOG_D(PHY, "oai_subframe_ind(frame:%u, subframe:%d) - NOT CALLED ********\n", frame, subframe);
|
||||||
start_meas(&nfapi_meas);
|
start_meas(&nfapi_meas);
|
||||||
oai_subframe_ind(frame_rx, slot_rx);
|
// oai_subframe_ind(frame_rx, slot_rx);
|
||||||
|
oai_slot_ind(frame_rx, slot_rx);
|
||||||
stop_meas(&nfapi_meas);
|
stop_meas(&nfapi_meas);
|
||||||
|
|
||||||
/*if (gNB->UL_INFO.rx_ind.rx_indication_body.number_of_pdus||
|
/*if (gNB->UL_INFO.rx_ind.rx_indication_body.number_of_pdus||
|
||||||
@@ -233,12 +228,6 @@ static inline int rxtx(PHY_VARS_gNB *gNB, int frame_rx, int slot_rx, int frame_t
|
|||||||
rnti_to_remove_count = 0;
|
rnti_to_remove_count = 0;
|
||||||
if (pthread_mutex_unlock(&rnti_to_remove_mutex)) exit(1);
|
if (pthread_mutex_unlock(&rnti_to_remove_mutex)) exit(1);
|
||||||
|
|
||||||
/*
|
|
||||||
// if this is IF5 or 3GPP_gNB
|
|
||||||
if (gNB && gNB->RU_list && gNB->RU_list[0] && gNB->RU_list[0]->function < NGFI_RAU_IF4p5) {
|
|
||||||
wakeup_prach_gNB(gNB,NULL,proc->frame_rx,proc->slot_rx);
|
|
||||||
}
|
|
||||||
*/
|
|
||||||
// Call the scheduler
|
// Call the scheduler
|
||||||
|
|
||||||
pthread_mutex_lock(&gNB->UL_INFO_mutex);
|
pthread_mutex_lock(&gNB->UL_INFO_mutex);
|
||||||
@@ -261,33 +250,35 @@ static inline int rxtx(PHY_VARS_gNB *gNB, int frame_rx, int slot_rx, int frame_t
|
|||||||
L1_nr_prach_procedures(gNB,frame_rx,slot_rx);
|
L1_nr_prach_procedures(gNB,frame_rx,slot_rx);
|
||||||
|
|
||||||
//apply the rx signal rotation here
|
//apply the rx signal rotation here
|
||||||
apply_nr_rotation_ul(&gNB->frame_parms,
|
for (int aa = 0; aa < gNB->frame_parms.nb_antennas_rx; aa++) {
|
||||||
gNB->common_vars.rxdataF[0],
|
apply_nr_rotation_ul(&gNB->frame_parms,
|
||||||
slot_rx,
|
gNB->common_vars.rxdataF[aa],
|
||||||
0,
|
slot_rx,
|
||||||
gNB->frame_parms.Ncp==EXTENDED?12:14,
|
0,
|
||||||
gNB->frame_parms.ofdm_symbol_size);
|
gNB->frame_parms.Ncp==EXTENDED?12:14,
|
||||||
|
gNB->frame_parms.ofdm_symbol_size);
|
||||||
phy_procedures_gNB_uespec_RX(gNB, frame_rx, slot_rx);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (oai_exit) return(-1);
|
|
||||||
|
|
||||||
// *****************************************
|
|
||||||
// TX processing for subframe n+sf_ahead
|
|
||||||
// run PHY TX procedures the one after the other for all CCs to avoid race conditions
|
|
||||||
// (may be relaxed in the future for performance reasons)
|
|
||||||
// *****************************************
|
|
||||||
|
|
||||||
if (tx_slot_type == NR_DOWNLINK_SLOT || tx_slot_type == NR_MIXED_SLOT) {
|
|
||||||
|
|
||||||
if(get_thread_parallel_conf() != PARALLEL_RU_L1_TRX_SPLIT) {
|
|
||||||
phy_procedures_gNB_TX(gNB, frame_tx,slot_tx, 1);
|
|
||||||
}
|
}
|
||||||
|
phy_procedures_gNB_uespec_RX(gNB, frame_rx, slot_rx);
|
||||||
}
|
}
|
||||||
|
|
||||||
stop_meas( &softmodem_stats_rxtx_sf );
|
stop_meas( &softmodem_stats_rxtx_sf );
|
||||||
LOG_D(PHY,"%s() Exit proc[rx:%d%d tx:%d%d]\n", __FUNCTION__, frame_rx, slot_rx, frame_tx, slot_tx);
|
LOG_D(PHY,"%s() Exit proc[rx:%d%d tx:%d%d]\n", __FUNCTION__, frame_rx, slot_rx, frame_tx, slot_tx);
|
||||||
|
|
||||||
|
notifiedFIFO_elt_t *res;
|
||||||
|
|
||||||
|
if (tx_slot_type == NR_DOWNLINK_SLOT || tx_slot_type == NR_MIXED_SLOT) {
|
||||||
|
res = pullTpool(gNB->resp_L1_tx, gNB->threadPool);
|
||||||
|
processingData_L1_t *syncMsg = (processingData_L1_t *)NotifiedFifoData(res);
|
||||||
|
syncMsg->gNB = gNB;
|
||||||
|
syncMsg->frame_rx = frame_rx;
|
||||||
|
syncMsg->slot_rx = slot_rx;
|
||||||
|
syncMsg->frame_tx = frame_tx;
|
||||||
|
syncMsg->slot_tx = slot_tx;
|
||||||
|
syncMsg->timestamp_tx = info->timestamp_tx;
|
||||||
|
res->key = slot_tx;
|
||||||
|
pushTpool(gNB->threadPool, res);
|
||||||
|
}
|
||||||
|
|
||||||
#if 0
|
#if 0
|
||||||
LOG_D(PHY, "rxtx:%lld nfapi:%lld phy:%lld tx:%lld rx:%lld prach:%lld ofdm:%lld ",
|
LOG_D(PHY, "rxtx:%lld nfapi:%lld phy:%lld tx:%lld rx:%lld prach:%lld ofdm:%lld ",
|
||||||
softmodem_stats_rxtx_sf.diff_now, nfapi_meas.diff_now,
|
softmodem_stats_rxtx_sf.diff_now, nfapi_meas.diff_now,
|
||||||
@@ -327,466 +318,7 @@ static inline int rxtx(PHY_VARS_gNB *gNB, int frame_rx, int slot_rx, int frame_t
|
|||||||
TICK_TO_US(gNB->ulsch_tc_intl2_stats)
|
TICK_TO_US(gNB->ulsch_tc_intl2_stats)
|
||||||
);
|
);
|
||||||
#endif
|
#endif
|
||||||
return(0);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void *gNB_L1_thread_tx(void *param) {
|
|
||||||
PHY_VARS_gNB *gNB = (PHY_VARS_gNB *)param;
|
|
||||||
gNB_L1_proc_t *gNB_proc = &gNB->proc;
|
|
||||||
gNB_L1_rxtx_proc_t *L1_proc_tx = &gNB_proc->L1_proc_tx;
|
|
||||||
//PHY_VARS_gNB *gNB = RC.gNB[0][proc->CC_id];
|
|
||||||
char thread_name[100];
|
|
||||||
|
|
||||||
sprintf(thread_name,"gNB_L1_thread_tx\n");
|
|
||||||
|
|
||||||
while (!oai_exit) {
|
|
||||||
if (wait_on_condition(&L1_proc_tx->mutex,&L1_proc_tx->cond,&L1_proc_tx->instance_cnt,thread_name)<0) break;
|
|
||||||
|
|
||||||
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_gNB_PROC_RXTX1, 1 );
|
|
||||||
|
|
||||||
if (oai_exit) break;
|
|
||||||
|
|
||||||
// *****************************************
|
|
||||||
// TX processing for subframe n+4
|
|
||||||
// run PHY TX procedures the one after the other for all CCs to avoid race conditions
|
|
||||||
// (may be relaxed in the future for performance reasons)
|
|
||||||
// *****************************************
|
|
||||||
int frame_tx = L1_proc_tx->frame_tx;
|
|
||||||
int slot_tx = L1_proc_tx->slot_tx;
|
|
||||||
uint64_t timestamp_tx = L1_proc_tx->timestamp_tx;
|
|
||||||
VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME(VCD_SIGNAL_DUMPER_VARIABLES_SLOT_NUMBER_TX1_GNB,slot_tx);
|
|
||||||
VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME(VCD_SIGNAL_DUMPER_VARIABLES_FRAME_NUMBER_TX1_GNB,frame_tx);
|
|
||||||
phy_procedures_gNB_TX(gNB, frame_tx,slot_tx, 1);
|
|
||||||
|
|
||||||
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_WAKEUP_TXFH, 1 );
|
|
||||||
pthread_mutex_lock( &L1_proc_tx->mutex );
|
|
||||||
L1_proc_tx->instance_cnt = -1;
|
|
||||||
|
|
||||||
// the thread can now be woken up
|
|
||||||
if (pthread_cond_signal(&L1_proc_tx->cond) != 0) {
|
|
||||||
LOG_E( PHY, "[gNB] ERROR pthread_cond_signal for gNB TXnp4 thread\n");
|
|
||||||
exit_fun( "ERROR pthread_cond_signal" );
|
|
||||||
}
|
|
||||||
pthread_mutex_unlock(&L1_proc_tx->mutex);
|
|
||||||
|
|
||||||
wakeup_txfh(gNB,L1_proc_tx,frame_tx,slot_tx,timestamp_tx);
|
|
||||||
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_WAKEUP_TXFH, 0 );
|
|
||||||
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_gNB_PROC_RXTX1, 0 );
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*!
|
|
||||||
* \brief The RX UE-specific and TX thread of gNB.
|
|
||||||
* \param param is a \ref gNB_L1_proc_t structure which contains the info what to process.
|
|
||||||
* \returns a pointer to an int. The storage is not on the heap and must not be freed.
|
|
||||||
*/
|
|
||||||
|
|
||||||
static void *gNB_L1_thread( void *param ) {
|
|
||||||
static int gNB_thread_rxtx_status;
|
|
||||||
PHY_VARS_gNB *gNB = (PHY_VARS_gNB *)param;
|
|
||||||
gNB_L1_proc_t *gNB_proc = &gNB->proc;
|
|
||||||
gNB_L1_rxtx_proc_t *L1_proc = &gNB_proc->L1_proc;
|
|
||||||
//PHY_VARS_gNB *gNB = RC.gNB[0][proc->CC_id];
|
|
||||||
char thread_name[100];
|
|
||||||
// set default return value
|
|
||||||
// set default return value
|
|
||||||
gNB_thread_rxtx_status = 0;
|
|
||||||
|
|
||||||
sprintf(thread_name,"gNB_L1_thread");
|
|
||||||
|
|
||||||
|
|
||||||
while (!oai_exit) {
|
|
||||||
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_gNB_PROC_RXTX0, 0 );
|
|
||||||
if (wait_on_condition(&L1_proc->mutex,&L1_proc->cond,&L1_proc->instance_cnt,thread_name)<0) break;
|
|
||||||
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_gNB_PROC_RXTX0, 1 );
|
|
||||||
|
|
||||||
int frame_rx = L1_proc->frame_rx;
|
|
||||||
int slot_rx = L1_proc->slot_rx;
|
|
||||||
int frame_tx = L1_proc->frame_tx;
|
|
||||||
int slot_tx = L1_proc->slot_tx;
|
|
||||||
uint64_t timestamp_tx = L1_proc->timestamp_tx;
|
|
||||||
|
|
||||||
|
|
||||||
VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME(VCD_SIGNAL_DUMPER_VARIABLES_SLOT_NUMBER_TX0_GNB,slot_tx);
|
|
||||||
VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME(VCD_SIGNAL_DUMPER_VARIABLES_SLOT_NUMBER_RX0_GNB,slot_rx);
|
|
||||||
VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME(VCD_SIGNAL_DUMPER_VARIABLES_FRAME_NUMBER_TX0_GNB,frame_tx);
|
|
||||||
VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME(VCD_SIGNAL_DUMPER_VARIABLES_FRAME_NUMBER_RX0_GNB,frame_rx);
|
|
||||||
|
|
||||||
if (oai_exit) break;
|
|
||||||
|
|
||||||
if (gNB->CC_id==0) {
|
|
||||||
if (rxtx(gNB,frame_rx,slot_rx,frame_tx,slot_tx,thread_name) < 0) break;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (release_thread(&L1_proc->mutex,&L1_proc->instance_cnt,thread_name)<0) break;
|
|
||||||
|
|
||||||
if(get_thread_parallel_conf() == PARALLEL_RU_L1_TRX_SPLIT) wakeup_tx(gNB,frame_rx,slot_rx,frame_tx,slot_tx,timestamp_tx);
|
|
||||||
else if(get_thread_parallel_conf() == PARALLEL_RU_L1_SPLIT) wakeup_txfh(gNB,L1_proc,frame_tx,slot_tx,timestamp_tx);
|
|
||||||
} // while !oai_exit
|
|
||||||
|
|
||||||
LOG_D(PHY, " *** Exiting gNB thread RXn_TXnp4\n");
|
|
||||||
gNB_thread_rxtx_status = 0;
|
|
||||||
return &gNB_thread_rxtx_status;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
#if 0
|
|
||||||
// Wait for gNB application initialization to be complete (gNB registration to MME)
|
|
||||||
static void wait_system_ready (char *message, volatile int *start_flag) {
|
|
||||||
static char *indicator[] = {". ", ".. ", "... ", ".... ", ".....",
|
|
||||||
" ....", " ...", " ..", " .", " "
|
|
||||||
};
|
|
||||||
int i = 0;
|
|
||||||
|
|
||||||
while ((!oai_exit) && (*start_flag == 0)) {
|
|
||||||
LOG_N(EMU, message, indicator[i]);
|
|
||||||
fflush(stdout);
|
|
||||||
i = (i + 1) % (sizeof(indicator) / sizeof(indicator[0]));
|
|
||||||
usleep(200000);
|
|
||||||
}
|
|
||||||
|
|
||||||
LOG_D(EMU,"\n");
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void gNB_top(PHY_VARS_gNB *gNB, int frame_rx, int slot_rx, char *string, struct RU_t_s *ru) {
|
|
||||||
gNB_L1_proc_t *proc = &gNB->proc;
|
|
||||||
gNB_L1_rxtx_proc_t *L1_proc = &proc->L1_proc;
|
|
||||||
NR_DL_FRAME_PARMS *fp = ru->nr_frame_parms;
|
|
||||||
RU_proc_t *ru_proc=&ru->proc;
|
|
||||||
proc->frame_rx = frame_rx;
|
|
||||||
proc->slot_rx = slot_rx;
|
|
||||||
sl_ahead = sf_ahead*fp->slots_per_subframe;
|
|
||||||
|
|
||||||
if (!oai_exit) {
|
|
||||||
T(T_ENB_MASTER_TICK, T_INT(0), T_INT(proc->frame_rx), T_INT(proc->slot_rx));
|
|
||||||
L1_proc->timestamp_tx = ru_proc->timestamp_rx + (sf_ahead*fp->samples_per_subframe);
|
|
||||||
L1_proc->frame_rx = ru_proc->frame_rx;
|
|
||||||
L1_proc->slot_rx = ru_proc->tti_rx;
|
|
||||||
L1_proc->frame_tx = (L1_proc->slot_rx > (fp->slots_per_frame-1-(fp->slots_per_subframe*sf_ahead))) ? (L1_proc->frame_rx+1)&1023 : L1_proc->frame_rx;
|
|
||||||
L1_proc->slot_tx = (L1_proc->slot_rx + (fp->slots_per_subframe*sf_ahead))%fp->slots_per_frame;
|
|
||||||
|
|
||||||
if (rxtx(gNB,L1_proc->frame_rx,L1_proc->slot_rx,L1_proc->frame_tx,L1_proc->slot_tx,string) < 0) LOG_E(PHY,"gNB %d CC_id %d failed during execution\n",gNB->Mod_id,gNB->CC_id);
|
|
||||||
|
|
||||||
ru_proc->timestamp_tx = L1_proc->timestamp_tx;
|
|
||||||
ru_proc->tti_tx = L1_proc->slot_tx;
|
|
||||||
ru_proc->frame_tx = L1_proc->frame_tx;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
int wakeup_txfh(PHY_VARS_gNB *gNB,gNB_L1_rxtx_proc_t *proc,int frame_tx,int slot_tx,uint64_t timestamp_tx) {
|
|
||||||
|
|
||||||
RU_t *ru;
|
|
||||||
RU_proc_t *ru_proc;
|
|
||||||
|
|
||||||
int waitret = 0, ret = 0, time_ns = 1000*1000;
|
|
||||||
struct timespec now, abstime;
|
|
||||||
// note this should depend on the numerology used by the TX L1 thread, set here for 500us slot time
|
|
||||||
// note this should depend on the numerology used by the TX L1 thread, set here for 500us slot time
|
|
||||||
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_UE_GAIN_CONTROL,1);
|
|
||||||
time_ns = time_ns/gNB->frame_parms.slots_per_subframe;
|
|
||||||
AssertFatal((ret = pthread_mutex_lock(&proc->mutex_RUs_tx))==0,"mutex_lock returns %d\n",ret);
|
|
||||||
while (proc->instance_cnt_RUs < 0) {
|
|
||||||
clock_gettime(CLOCK_REALTIME, &now);
|
|
||||||
abstime.tv_sec = now.tv_sec;
|
|
||||||
abstime.tv_nsec = now.tv_nsec + time_ns;
|
|
||||||
|
|
||||||
if (abstime.tv_nsec >= 1000*1000*1000) {
|
|
||||||
abstime.tv_nsec -= 1000*1000*1000;
|
|
||||||
abstime.tv_sec += 1;
|
|
||||||
}
|
|
||||||
if((waitret = pthread_cond_timedwait(&proc->cond_RUs,&proc->mutex_RUs_tx,&abstime)) == 0) break; // this unlocks mutex_rxtx while waiting and then locks it again
|
|
||||||
}
|
|
||||||
proc->instance_cnt_RUs = -1;
|
|
||||||
VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME(VCD_SIGNAL_DUMPER_VARIABLES_FRAME_NUMBER_RX0_UE,proc->instance_cnt_RUs);
|
|
||||||
AssertFatal((ret = pthread_mutex_unlock(&proc->mutex_RUs_tx))==0,"mutex_unlock returns %d\n",ret);
|
|
||||||
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_UE_GAIN_CONTROL,0);
|
|
||||||
|
|
||||||
if (waitret == ETIMEDOUT) {
|
|
||||||
LOG_W(PHY,"Dropping TX slot (%d.%d) because FH is blocked more than 1 slot times (500us)\n",frame_tx,slot_tx);
|
|
||||||
|
|
||||||
AssertFatal((ret=pthread_mutex_lock(&gNB->proc.mutex_RU_tx))==0,"mutex_lock returns %d\n",ret);
|
|
||||||
gNB->proc.RU_mask_tx = 0;
|
|
||||||
AssertFatal((ret=pthread_mutex_unlock(&gNB->proc.mutex_RU_tx))==0,"mutex_unlock returns %d\n",ret);
|
|
||||||
AssertFatal((ret=pthread_mutex_lock(&proc->mutex_RUs_tx))==0,"mutex_lock returns %d\n",ret);
|
|
||||||
proc->instance_cnt_RUs = 0;
|
|
||||||
VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME(VCD_SIGNAL_DUMPER_VARIABLES_FRAME_NUMBER_RX0_UE,proc->instance_cnt_RUs);
|
|
||||||
AssertFatal((ret=pthread_mutex_unlock(&proc->mutex_RUs_tx))==0,"mutex_unlock returns %d\n",ret);
|
|
||||||
|
|
||||||
VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME(VCD_SIGNAL_DUMPER_VARIABLES_FRAME_NUMBER_TX0_UE,1);
|
|
||||||
VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME(VCD_SIGNAL_DUMPER_VARIABLES_FRAME_NUMBER_TX0_UE,0);
|
|
||||||
|
|
||||||
return(-1);
|
|
||||||
}
|
|
||||||
|
|
||||||
for(int i=0; i<gNB->num_RU; i++)
|
|
||||||
{
|
|
||||||
ru = gNB->RU_list[i];
|
|
||||||
ru_proc = &ru->proc;
|
|
||||||
|
|
||||||
|
|
||||||
if (ru_proc->instance_cnt_gNBs == 0) {
|
|
||||||
VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_TRX_TST_UE, 1);
|
|
||||||
LOG_E(PHY,"Frame %d, subframe %d: TX FH thread busy, dropping Frame %d, subframe %d\n", ru_proc->frame_tx, ru_proc->tti_tx, proc->frame_rx, proc->slot_rx);
|
|
||||||
AssertFatal((ret=pthread_mutex_lock(&gNB->proc.mutex_RU_tx))==0,"mutex_lock returns %d\n",ret);
|
|
||||||
gNB->proc.RU_mask_tx = 0;
|
|
||||||
AssertFatal((ret=pthread_mutex_unlock(&gNB->proc.mutex_RU_tx))==0,"mutex_unlock returns %d\n",ret);
|
|
||||||
|
|
||||||
VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_TRX_TST_UE, 0);
|
|
||||||
return(-1);
|
|
||||||
}
|
|
||||||
AssertFatal((ret = pthread_mutex_lock(&ru_proc->mutex_gNBs))==0,"ERROR pthread_mutex_lock failed on mutex_gNBs L1_thread_tx with ret=%d\n",ret);
|
|
||||||
|
|
||||||
ru_proc->instance_cnt_gNBs = 0;
|
|
||||||
ru_proc->timestamp_tx = timestamp_tx;
|
|
||||||
ru_proc->tti_tx = slot_tx;
|
|
||||||
ru_proc->frame_tx = frame_tx;
|
|
||||||
|
|
||||||
VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_FRAME_NUMBER_RX1_UE, ru_proc->instance_cnt_gNBs);
|
|
||||||
|
|
||||||
LOG_D(PHY,"Signaling tx_thread_fh for %d.%d\n",frame_tx,slot_tx);
|
|
||||||
// the thread can now be woken up
|
|
||||||
AssertFatal(pthread_cond_signal(&ru_proc->cond_gNBs) == 0,
|
|
||||||
"[gNB] ERROR pthread_cond_signal for gNB TXnp4 thread\n");
|
|
||||||
AssertFatal((ret=pthread_mutex_unlock(&ru_proc->mutex_gNBs))==0,"mutex_unlock returned %d\n",ret);
|
|
||||||
|
|
||||||
}
|
|
||||||
return(0);
|
|
||||||
}
|
|
||||||
|
|
||||||
int wakeup_tx(PHY_VARS_gNB *gNB,int frame_rx,int slot_rx,int frame_tx,int slot_tx,uint64_t timestamp_tx) {
|
|
||||||
|
|
||||||
|
|
||||||
gNB_L1_rxtx_proc_t *L1_proc_tx = &gNB->proc.L1_proc_tx;
|
|
||||||
|
|
||||||
int ret;
|
|
||||||
|
|
||||||
|
|
||||||
AssertFatal((ret = pthread_mutex_lock(&L1_proc_tx->mutex))==0,"mutex_lock returns %d\n",ret);
|
|
||||||
|
|
||||||
|
|
||||||
while(L1_proc_tx->instance_cnt == 0) {
|
|
||||||
pthread_cond_wait(&L1_proc_tx->cond,&L1_proc_tx->mutex);
|
|
||||||
}
|
|
||||||
|
|
||||||
L1_proc_tx->instance_cnt = 0;
|
|
||||||
|
|
||||||
|
|
||||||
L1_proc_tx->slot_rx = slot_rx;
|
|
||||||
L1_proc_tx->frame_rx = frame_rx;
|
|
||||||
L1_proc_tx->slot_tx = slot_tx;
|
|
||||||
L1_proc_tx->frame_tx = frame_tx;
|
|
||||||
L1_proc_tx->timestamp_tx = timestamp_tx;
|
|
||||||
|
|
||||||
|
|
||||||
VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME(VCD_SIGNAL_DUMPER_VARIABLES_FRAME_NUMBER_TX1_UE,1);
|
|
||||||
VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME(VCD_SIGNAL_DUMPER_VARIABLES_FRAME_NUMBER_TX1_UE,0);
|
|
||||||
// the thread can now be woken up
|
|
||||||
// the thread can now be woken up
|
|
||||||
AssertFatal(pthread_cond_signal(&L1_proc_tx->cond) == 0, "ERROR pthread_cond_signal for gNB L1 thread\n");
|
|
||||||
|
|
||||||
AssertFatal((ret=pthread_mutex_unlock(&L1_proc_tx->mutex))==0,"mutex_unlock returns %d\n",ret);
|
|
||||||
|
|
||||||
return(0);
|
|
||||||
}
|
|
||||||
|
|
||||||
int wakeup_rxtx(PHY_VARS_gNB *gNB,RU_t *ru) {
|
|
||||||
gNB_L1_proc_t *proc=&gNB->proc;
|
|
||||||
gNB_L1_rxtx_proc_t *L1_proc=&proc->L1_proc;
|
|
||||||
NR_DL_FRAME_PARMS *fp = &gNB->frame_parms;
|
|
||||||
RU_proc_t *ru_proc=&ru->proc;
|
|
||||||
int ret;
|
|
||||||
int i;
|
|
||||||
struct timespec abstime;
|
|
||||||
int time_ns = 50000;
|
|
||||||
int wait_timer = 0;
|
|
||||||
bool do_last_check = 1;
|
|
||||||
|
|
||||||
AssertFatal((ret=pthread_mutex_lock(&proc->mutex_RU))==0,"mutex_lock returns %d\n",ret);
|
|
||||||
for (i=0; i<gNB->num_RU; i++) {
|
|
||||||
if (ru == gNB->RU_list[i]) {
|
|
||||||
if ((proc->RU_mask&(1<<i)) > 0)
|
|
||||||
LOG_E(PHY,"gNB %d frame %d, subframe %d : previous information from RU %d (num_RU %d,mask %x) has not been served yet!\n",
|
|
||||||
gNB->Mod_id,proc->frame_rx,proc->slot_rx,ru->idx,gNB->num_RU,proc->RU_mask);
|
|
||||||
proc->RU_mask |= (1<<i);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (proc->RU_mask != (1<<gNB->num_RU)-1) { // not all RUs have provided their information so return
|
|
||||||
LOG_E(PHY,"Not all RUs have provided their info\n");
|
|
||||||
AssertFatal((ret=pthread_mutex_unlock(&proc->mutex_RU))==0,"mutex_unlock returns %d\n",ret);
|
|
||||||
return(0);
|
|
||||||
}
|
|
||||||
else { // all RUs have provided their information so continue on and wakeup gNB processing
|
|
||||||
proc->RU_mask = 0;
|
|
||||||
AssertFatal((ret=pthread_mutex_unlock(&proc->mutex_RU))==0,"muex_unlock returns %d\n",ret);
|
|
||||||
}
|
|
||||||
|
|
||||||
// wake up TX for subframe n+sf_ahead
|
|
||||||
// lock the TX mutex and make sure the thread is ready
|
|
||||||
while (wait_timer < 200) {
|
|
||||||
clock_gettime(CLOCK_REALTIME, &abstime);
|
|
||||||
abstime.tv_nsec = abstime.tv_nsec + time_ns;
|
|
||||||
|
|
||||||
if (abstime.tv_nsec >= 1000*1000*1000) {
|
|
||||||
abstime.tv_nsec -= 1000*1000*1000;
|
|
||||||
abstime.tv_sec += 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
AssertFatal((ret=pthread_mutex_timedlock(&L1_proc->mutex, &abstime)) == 0,"mutex_lock returns %d\n", ret);
|
|
||||||
|
|
||||||
if (L1_proc->instance_cnt == 0) { // L1_thread is busy so wait for a bit
|
|
||||||
AssertFatal((ret=pthread_mutex_unlock( &L1_proc->mutex))==0,"muex_unlock return %d\n",ret);
|
|
||||||
wait_timer += 50;
|
|
||||||
usleep(50);
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
do_last_check = 0;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (do_last_check) {
|
|
||||||
AssertFatal((ret=pthread_mutex_timedlock(&L1_proc->mutex, &abstime)) == 0,"mutex_lock returns %d\n", ret);
|
|
||||||
if (L1_proc->instance_cnt == 0) { // L1_thread is busy so abort the subframe
|
|
||||||
AssertFatal((ret=pthread_mutex_unlock( &L1_proc->mutex))==0,"muex_unlock return %d\n",ret);
|
|
||||||
LOG_W(PHY,"L1_thread isn't ready in %d.%d, aborting RX processing\n",ru_proc->frame_rx,ru_proc->tti_rx);
|
|
||||||
return (-1);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
++L1_proc->instance_cnt;
|
|
||||||
// We have just received and processed the common part of a subframe, say n.
|
|
||||||
// TS_rx is the last received timestamp (start of 1st slot), TS_tx is the desired
|
|
||||||
// transmitted timestamp of the next TX slot (first).
|
|
||||||
|
|
||||||
// The last (TS_rx mod samples_per_frame) was n*samples_per_tti,
|
|
||||||
// we want to generate subframe (n+sf_ahead), so TS_tx = TX_rx+sf_ahead*samples_per_tti,
|
|
||||||
// and proc->slot_tx = proc->slot_rx+sf_ahead
|
|
||||||
L1_proc->timestamp_tx = ru_proc->timestamp_rx + (sf_ahead*fp->samples_per_subframe);
|
|
||||||
L1_proc->frame_rx = ru_proc->frame_rx;
|
|
||||||
L1_proc->slot_rx = ru_proc->tti_rx;
|
|
||||||
L1_proc->frame_tx = (L1_proc->slot_rx > (fp->slots_per_frame-1-(fp->slots_per_subframe*sf_ahead))) ? (L1_proc->frame_rx+1)&1023 : L1_proc->frame_rx;
|
|
||||||
L1_proc->slot_tx = (L1_proc->slot_rx + (fp->slots_per_subframe*sf_ahead))%fp->slots_per_frame;
|
|
||||||
|
|
||||||
LOG_D(PHY,"wakeupL1: passing parameter IC = %d, RX: %d.%d, TX: %d.%d to L1 sf_ahead = %d\n", L1_proc->instance_cnt, L1_proc->frame_rx, L1_proc->slot_rx, L1_proc->frame_tx, L1_proc->slot_tx, sf_ahead);
|
|
||||||
|
|
||||||
pthread_mutex_unlock( &L1_proc->mutex );
|
|
||||||
|
|
||||||
// the thread can now be woken up
|
|
||||||
if (pthread_cond_signal(&L1_proc->cond) != 0) {
|
|
||||||
LOG_E( PHY, "[gNB] ERROR pthread_cond_signal for gNB RXn-TXnp4 thread\n");
|
|
||||||
exit_fun( "ERROR pthread_cond_signal" );
|
|
||||||
return(-1);
|
|
||||||
}
|
|
||||||
|
|
||||||
return(0);
|
|
||||||
}
|
|
||||||
/*
|
|
||||||
void wakeup_prach_gNB(PHY_VARS_gNB *gNB,RU_t *ru,int frame,int subframe) {
|
|
||||||
|
|
||||||
gNB_L1_proc_t *proc = &gNB->proc;
|
|
||||||
LTE_DL_FRAME_PARMS *fp=&gNB->frame_parms;
|
|
||||||
int i;
|
|
||||||
|
|
||||||
if (ru!=NULL) {
|
|
||||||
pthread_mutex_lock(&proc->mutex_RU_PRACH);
|
|
||||||
for (i=0;i<gNB->num_RU;i++) {
|
|
||||||
if (ru == gNB->RU_list[i]) {
|
|
||||||
LOG_D(PHY,"frame %d, subframe %d: RU %d for gNB %d signals PRACH (mask %x, num_RU %d)\n",frame,subframe,i,gNB->Mod_id,proc->RU_mask_prach,gNB->num_RU);
|
|
||||||
if ((proc->RU_mask_prach&(1<<i)) > 0)
|
|
||||||
LOG_E(PHY,"gNB %d frame %d, subframe %d : previous information (PRACH) from RU %d (num_RU %d, mask %x) has not been served yet!\n",
|
|
||||||
gNB->Mod_id,frame,subframe,ru->idx,gNB->num_RU,proc->RU_mask_prach);
|
|
||||||
proc->RU_mask_prach |= (1<<i);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (proc->RU_mask_prach != (1<<gNB->num_RU)-1) { // not all RUs have provided their information so return
|
|
||||||
pthread_mutex_unlock(&proc->mutex_RU_PRACH);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
else { // all RUs have provided their information so continue on and wakeup gNB processing
|
|
||||||
proc->RU_mask_prach = 0;
|
|
||||||
pthread_mutex_unlock(&proc->mutex_RU_PRACH);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// check if we have to detect PRACH first
|
|
||||||
if (is_prach_subframe(fp,frame,subframe)>0) {
|
|
||||||
LOG_D(PHY,"Triggering prach processing, frame %d, subframe %d\n",frame,subframe);
|
|
||||||
if (proc->instance_cnt_prach == 0) {
|
|
||||||
LOG_W(PHY,"[gNB] Frame %d Subframe %d, dropping PRACH\n", frame,subframe);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
// wake up thread for PRACH RX
|
|
||||||
if (pthread_mutex_lock(&proc->mutex_prach) != 0) {
|
|
||||||
LOG_E( PHY, "[gNB] ERROR pthread_mutex_lock for gNB PRACH thread %d (IC %d)\n", proc->thread_index, proc->instance_cnt_prach);
|
|
||||||
exit_fun( "error locking mutex_prach" );
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
++proc->instance_cnt_prach;
|
|
||||||
// set timing for prach thread
|
|
||||||
proc->frame_prach = frame;
|
|
||||||
proc->subframe_prach = subframe;
|
|
||||||
|
|
||||||
// the thread can now be woken up
|
|
||||||
if (pthread_cond_signal(&proc->cond_prach) != 0) {
|
|
||||||
LOG_E( PHY, "[gNB] ERROR pthread_cond_signal for gNB PRACH thread %d\n", proc->thread_index);
|
|
||||||
exit_fun( "ERROR pthread_cond_signal" );
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
pthread_mutex_unlock( &proc->mutex_prach );
|
|
||||||
}
|
|
||||||
|
|
||||||
}*/
|
|
||||||
|
|
||||||
/*!
|
|
||||||
* \brief The prach receive thread of gNB.
|
|
||||||
* \param param is a \ref gNB_L1_proc_t structure which contains the info what to process.
|
|
||||||
* \returns a pointer to an int. The storage is not on the heap and must not be freed.
|
|
||||||
*/
|
|
||||||
/*
|
|
||||||
static void* gNB_thread_prach( void* param ) {
|
|
||||||
static int gNB_thread_prach_status;
|
|
||||||
|
|
||||||
|
|
||||||
PHY_VARS_gNB *gNB= (PHY_VARS_gNB *)param;
|
|
||||||
gNB_L1_proc_t *proc = &gNB->proc;
|
|
||||||
|
|
||||||
// set default return value
|
|
||||||
gNB_thread_prach_status = 0;
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
while (!oai_exit) {
|
|
||||||
|
|
||||||
if (oai_exit) break;
|
|
||||||
|
|
||||||
|
|
||||||
if (wait_on_condition(&proc->mutex_prach,&proc->cond_prach,&proc->instance_cnt_prach,"gNB_prach_thread") < 0) break;
|
|
||||||
|
|
||||||
LOG_D(PHY,"Running gNB prach procedures\n");
|
|
||||||
prach_procedures(gNB ,0);
|
|
||||||
|
|
||||||
if (release_thread(&proc->mutex_prach,&proc->instance_cnt_prach,"gNB_prach_thread") < 0) break;
|
|
||||||
}
|
|
||||||
|
|
||||||
LOG_I(PHY, "Exiting gNB thread PRACH\n");
|
|
||||||
|
|
||||||
gNB_thread_prach_status = 0;
|
|
||||||
return &gNB_thread_prach_status;
|
|
||||||
}
|
|
||||||
*/
|
|
||||||
|
|
||||||
extern void init_td_thread(PHY_VARS_gNB *);
|
|
||||||
extern void init_te_thread(PHY_VARS_gNB *);
|
|
||||||
|
|
||||||
static void *process_stats_thread(void *param) {
|
static void *process_stats_thread(void *param) {
|
||||||
|
|
||||||
PHY_VARS_gNB *gNB = (PHY_VARS_gNB *)param;
|
PHY_VARS_gNB *gNB = (PHY_VARS_gNB *)param;
|
||||||
@@ -807,71 +339,13 @@ static void *process_stats_thread(void *param) {
|
|||||||
return(NULL);
|
return(NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void init_gNB_Tpool(int inst) {
|
||||||
void init_gNB_proc(int inst) {
|
|
||||||
int i=0;
|
|
||||||
int CC_id = 0;
|
|
||||||
PHY_VARS_gNB *gNB;
|
PHY_VARS_gNB *gNB;
|
||||||
gNB_L1_proc_t *proc;
|
|
||||||
gNB_L1_rxtx_proc_t *L1_proc,*L1_proc_tx;
|
|
||||||
// LOG_I(PHY,"%s(inst:%d) RC.nb_nr_CC[inst]:%d \n",__FUNCTION__,inst,RC.nb_nr_CC[inst]);
|
|
||||||
gNB = RC.gNB[inst];
|
gNB = RC.gNB[inst];
|
||||||
LOG_I(PHY,"Initializing gNB processes instance:%d CC_id %d \n",inst,CC_id);
|
gNB_L1_proc_t *proc = &gNB->proc;
|
||||||
|
|
||||||
proc = &gNB->proc;
|
|
||||||
L1_proc = &proc->L1_proc;
|
|
||||||
L1_proc_tx = &proc->L1_proc_tx;
|
|
||||||
L1_proc->instance_cnt = -1;
|
|
||||||
L1_proc_tx->instance_cnt = -1;
|
|
||||||
L1_proc->instance_cnt_RUs = 0;
|
|
||||||
L1_proc_tx->instance_cnt_RUs = 0;
|
|
||||||
proc->instance_cnt_prach = -1;
|
|
||||||
proc->instance_cnt_asynch_rxtx = -1;
|
|
||||||
proc->CC_id = CC_id;
|
|
||||||
proc->first_rx =1;
|
|
||||||
proc->first_tx =1;
|
|
||||||
proc->RU_mask =0;
|
|
||||||
proc->RU_mask_tx = (1<<gNB->num_RU)-1;
|
|
||||||
proc->RU_mask_prach =0;
|
|
||||||
pthread_mutex_init( &gNB->UL_INFO_mutex, NULL);
|
|
||||||
pthread_mutex_init( &L1_proc->mutex, NULL);
|
|
||||||
pthread_mutex_init( &L1_proc_tx->mutex, NULL);
|
|
||||||
pthread_cond_init( &L1_proc->cond, NULL);
|
|
||||||
pthread_cond_init( &L1_proc_tx->cond, NULL);
|
|
||||||
pthread_mutex_init( &proc->mutex_prach, NULL);
|
|
||||||
pthread_mutex_init( &proc->mutex_asynch_rxtx, NULL);
|
|
||||||
pthread_mutex_init( &proc->mutex_RU,NULL);
|
|
||||||
pthread_mutex_init( &proc->mutex_RU_tx,NULL);
|
|
||||||
pthread_mutex_init( &proc->mutex_RU_PRACH,NULL);
|
|
||||||
pthread_cond_init( &proc->cond_prach, NULL);
|
|
||||||
pthread_cond_init( &proc->cond_asynch_rxtx, NULL);
|
|
||||||
LOG_I(PHY,"gNB->single_thread_flag:%d\n", gNB->single_thread_flag);
|
|
||||||
|
|
||||||
if (get_thread_parallel_conf() == PARALLEL_RU_L1_SPLIT || get_thread_parallel_conf() == PARALLEL_RU_L1_TRX_SPLIT) {
|
|
||||||
threadCreate( &L1_proc->pthread, gNB_L1_thread, gNB, "L1_proc", -1, OAI_PRIORITY_RT );
|
|
||||||
threadCreate( &L1_proc_tx->pthread, gNB_L1_thread_tx, gNB,"L1_proc_tx", -1, OAI_PRIORITY_RT);
|
|
||||||
}
|
|
||||||
|
|
||||||
if(opp_enabled == 1) threadCreate(&proc->L1_stats_thread, process_stats_thread,(void *)gNB, "time_meas", -1, OAI_PRIORITY_RT_LOW);
|
|
||||||
//pthread_create( &proc->pthread_prach, attr_prach, gNB_thread_prach, gNB );
|
|
||||||
char name[16];
|
|
||||||
|
|
||||||
if (gNB->single_thread_flag==0) {
|
|
||||||
snprintf( name, sizeof(name), "L1 %d", i );
|
|
||||||
pthread_setname_np( L1_proc->pthread, name );
|
|
||||||
snprintf( name, sizeof(name), "L1TX %d", i );
|
|
||||||
pthread_setname_np( L1_proc_tx->pthread, name );
|
|
||||||
}
|
|
||||||
|
|
||||||
AssertFatal(proc->instance_cnt_prach == -1,"instance_cnt_prach = %d\n",proc->instance_cnt_prach);
|
|
||||||
|
|
||||||
/* setup PHY proc TX sync mechanism */
|
|
||||||
pthread_mutex_init(&sync_phy_proc.mutex_phy_proc_tx, NULL);
|
|
||||||
pthread_cond_init(&sync_phy_proc.cond_phy_proc_tx, NULL);
|
|
||||||
sync_phy_proc.phy_proc_CC_id = 0;
|
|
||||||
|
|
||||||
|
// ULSCH decoding threadpool
|
||||||
gNB->threadPool = (tpool_t*)malloc(sizeof(tpool_t));
|
gNB->threadPool = (tpool_t*)malloc(sizeof(tpool_t));
|
||||||
gNB->respDecode = (notifiedFIFO_t*) malloc(sizeof(notifiedFIFO_t));
|
|
||||||
int numCPU = sysconf(_SC_NPROCESSORS_ONLN);
|
int numCPU = sysconf(_SC_NPROCESSORS_ONLN);
|
||||||
int threadCnt = min(numCPU, gNB->pusch_proc_threads);
|
int threadCnt = min(numCPU, gNB->pusch_proc_threads);
|
||||||
char ul_pool[80];
|
char ul_pool[80];
|
||||||
@@ -882,70 +356,40 @@ void init_gNB_proc(int inst) {
|
|||||||
s_offset += 3;
|
s_offset += 3;
|
||||||
}
|
}
|
||||||
initTpool(ul_pool, gNB->threadPool, false);
|
initTpool(ul_pool, gNB->threadPool, false);
|
||||||
|
// ULSCH decoder result FIFO
|
||||||
|
gNB->respDecode = (notifiedFIFO_t*) malloc(sizeof(notifiedFIFO_t));
|
||||||
initNotifiedFIFO(gNB->respDecode);
|
initNotifiedFIFO(gNB->respDecode);
|
||||||
}
|
|
||||||
|
|
||||||
|
// L1 RX result FIFO
|
||||||
|
gNB->resp_L1 = (notifiedFIFO_t*) malloc(sizeof(notifiedFIFO_t));
|
||||||
|
initNotifiedFIFO(gNB->resp_L1);
|
||||||
|
|
||||||
|
// L1 TX result FIFO
|
||||||
|
gNB->resp_L1_tx = (notifiedFIFO_t*) malloc(sizeof(notifiedFIFO_t));
|
||||||
|
initNotifiedFIFO(gNB->resp_L1_tx);
|
||||||
|
|
||||||
|
// RU TX result FIFO
|
||||||
|
gNB->resp_RU_tx = (notifiedFIFO_t*) malloc(sizeof(notifiedFIFO_t));
|
||||||
|
initNotifiedFIFO(gNB->resp_RU_tx);
|
||||||
|
|
||||||
|
// Stats measurement thread
|
||||||
|
if(opp_enabled == 1) threadCreate(&proc->L1_stats_thread, process_stats_thread,(void *)gNB, "time_meas", -1, OAI_PRIORITY_RT_LOW);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
* \brief Terminate gNB TX and RX threads.
|
* \brief Terminate gNB TX and RX threads.
|
||||||
*/
|
*/
|
||||||
void kill_gNB_proc(int inst) {
|
void kill_gNB_proc(int inst) {
|
||||||
int *status;
|
|
||||||
PHY_VARS_gNB *gNB;
|
PHY_VARS_gNB *gNB;
|
||||||
gNB_L1_proc_t *proc;
|
|
||||||
gNB_L1_rxtx_proc_t *L1_proc, *L1_proc_tx;
|
|
||||||
|
|
||||||
gNB=RC.gNB[inst];
|
gNB=RC.gNB[inst];
|
||||||
proc = &gNB->proc;
|
|
||||||
L1_proc = &proc->L1_proc;
|
|
||||||
L1_proc_tx = &proc->L1_proc_tx;
|
|
||||||
LOG_I(PHY, "Killing TX inst %d\n",inst );
|
|
||||||
|
|
||||||
if (get_thread_parallel_conf() == PARALLEL_RU_L1_SPLIT || get_thread_parallel_conf() == PARALLEL_RU_L1_TRX_SPLIT) {
|
|
||||||
pthread_mutex_lock(&L1_proc->mutex);
|
|
||||||
L1_proc->instance_cnt = 0;
|
|
||||||
pthread_cond_signal(&L1_proc->cond);
|
|
||||||
pthread_mutex_unlock(&L1_proc->mutex);
|
|
||||||
pthread_mutex_lock(&L1_proc_tx->mutex);
|
|
||||||
L1_proc_tx->instance_cnt = 0;
|
|
||||||
pthread_cond_signal(&L1_proc_tx->cond);
|
|
||||||
pthread_mutex_unlock(&L1_proc_tx->mutex);
|
|
||||||
}
|
|
||||||
|
|
||||||
proc->instance_cnt_prach = 0;
|
|
||||||
pthread_cond_signal( &proc->cond_prach );
|
|
||||||
pthread_cond_signal( &proc->cond_asynch_rxtx );
|
|
||||||
pthread_cond_broadcast(&sync_phy_proc.cond_phy_proc_tx);
|
|
||||||
// LOG_D(PHY, "joining pthread_prach\n");
|
|
||||||
// pthread_join( proc->pthread_prach, (void**)&status );
|
|
||||||
LOG_I(PHY, "Destroying prach mutex/cond\n");
|
|
||||||
pthread_mutex_destroy( &proc->mutex_prach );
|
|
||||||
pthread_cond_destroy( &proc->cond_prach );
|
|
||||||
LOG_I(PHY, "Destroying UL_INFO mutex\n");
|
LOG_I(PHY, "Destroying UL_INFO mutex\n");
|
||||||
pthread_mutex_destroy(&gNB->UL_INFO_mutex);
|
pthread_mutex_destroy(&gNB->UL_INFO_mutex);
|
||||||
|
|
||||||
if (get_thread_parallel_conf() == PARALLEL_RU_L1_SPLIT || get_thread_parallel_conf() == PARALLEL_RU_L1_TRX_SPLIT) {
|
|
||||||
LOG_I(PHY, "Joining L1_proc mutex/cond\n");
|
|
||||||
pthread_join( L1_proc->pthread, (void **)&status );
|
|
||||||
LOG_I(PHY, "Joining L1_proc_tx mutex/cond\n");
|
|
||||||
pthread_join( L1_proc_tx->pthread, (void **)&status );
|
|
||||||
}
|
|
||||||
|
|
||||||
LOG_I(PHY, "Destroying L1_proc mutex/cond\n");
|
|
||||||
pthread_mutex_destroy( &L1_proc->mutex );
|
|
||||||
pthread_cond_destroy( &L1_proc->cond );
|
|
||||||
LOG_I(PHY, "Destroying L1_proc_tx mutex/cond\n");
|
|
||||||
pthread_mutex_destroy( &L1_proc_tx->mutex );
|
|
||||||
pthread_cond_destroy( &L1_proc_tx->cond );
|
|
||||||
pthread_mutex_destroy( &proc->mutex_RU );
|
|
||||||
pthread_mutex_destroy( &proc->mutex_RU_tx );
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void reset_opp_meas(void) {
|
void reset_opp_meas(void) {
|
||||||
int sfn;
|
int sfn;
|
||||||
reset_meas(&softmodem_stats_mt);
|
reset_meas(&softmodem_stats_mt);
|
||||||
@@ -998,7 +442,13 @@ void init_eNB_afterRU(void) {
|
|||||||
for (i=0; i<gNB->RU_list[ru_id]->nb_rx; aa++,i++) {
|
for (i=0; i<gNB->RU_list[ru_id]->nb_rx; aa++,i++) {
|
||||||
LOG_I(PHY,"Attaching RU %d antenna %d to gNB antenna %d\n",gNB->RU_list[ru_id]->idx,i,aa);
|
LOG_I(PHY,"Attaching RU %d antenna %d to gNB antenna %d\n",gNB->RU_list[ru_id]->idx,i,aa);
|
||||||
gNB->prach_vars.rxsigF[aa] = gNB->RU_list[ru_id]->prach_rxsigF[0][i];
|
gNB->prach_vars.rxsigF[aa] = gNB->RU_list[ru_id]->prach_rxsigF[0][i];
|
||||||
|
#if 0
|
||||||
|
printf("before %p\n", gNB->common_vars.rxdataF[aa]);
|
||||||
|
#endif
|
||||||
gNB->common_vars.rxdataF[aa] = gNB->RU_list[ru_id]->common.rxdataF[i];
|
gNB->common_vars.rxdataF[aa] = gNB->RU_list[ru_id]->common.rxdataF[i];
|
||||||
|
#if 0
|
||||||
|
printf("after %p\n", gNB->common_vars.rxdataF[aa]);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1007,15 +457,9 @@ void init_eNB_afterRU(void) {
|
|||||||
* (not tested in other modes).
|
* (not tested in other modes).
|
||||||
*/
|
*/
|
||||||
//init_precoding_weights(RC.gNB[inst]);
|
//init_precoding_weights(RC.gNB[inst]);
|
||||||
init_gNB_proc(inst);
|
init_gNB_Tpool(inst);
|
||||||
}
|
}
|
||||||
|
|
||||||
for (ru_id=0; ru_id<RC.nb_RU; ru_id++) {
|
|
||||||
AssertFatal(RC.ru[ru_id]!=NULL,"ru_id %d is null\n",ru_id);
|
|
||||||
RC.ru[ru_id]->nr_wakeup_rxtx = wakeup_rxtx;
|
|
||||||
// RC.ru[ru_id]->wakeup_prach_eNB = wakeup_prach_gNB;
|
|
||||||
RC.ru[ru_id]->gNB_top = gNB_top;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void init_gNB(int single_thread_flag,int wait_for_sync) {
|
void init_gNB(int single_thread_flag,int wait_for_sync) {
|
||||||
@@ -1024,18 +468,16 @@ void init_gNB(int single_thread_flag,int wait_for_sync) {
|
|||||||
PHY_VARS_gNB *gNB;
|
PHY_VARS_gNB *gNB;
|
||||||
|
|
||||||
if (RC.gNB == NULL) {
|
if (RC.gNB == NULL) {
|
||||||
RC.gNB = (PHY_VARS_gNB **) malloc((1+RC.nb_nr_L1_inst)*sizeof(PHY_VARS_gNB *));
|
RC.gNB = (PHY_VARS_gNB **) calloc(1+RC.nb_nr_L1_inst, sizeof(PHY_VARS_gNB *));
|
||||||
for (inst=0; inst<RC.nb_nr_L1_inst; inst++) {
|
LOG_I(PHY,"gNB L1 structure RC.gNB allocated @ %p\n",RC.gNB);
|
||||||
RC.gNB[inst] = (PHY_VARS_gNB *) malloc(sizeof(PHY_VARS_gNB));
|
|
||||||
memset((void*)RC.gNB[inst],0,sizeof(PHY_VARS_gNB));
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
LOG_I(PHY,"gNB L1 structure RC.gNB allocated @ %p\n",RC.gNB);
|
|
||||||
|
|
||||||
for (inst=0; inst<RC.nb_nr_L1_inst; inst++) {
|
for (inst=0; inst<RC.nb_nr_L1_inst; inst++) {
|
||||||
|
|
||||||
LOG_I(PHY,"[lte-softmodem.c] gNB structure RC.gNB[%d] allocated @ %p\n",inst,RC.gNB[inst]);
|
if (RC.gNB[inst] == NULL) {
|
||||||
|
RC.gNB[inst] = (PHY_VARS_gNB *) calloc(1, sizeof(PHY_VARS_gNB));
|
||||||
|
LOG_I(PHY,"[nr-gnb.c] gNB structure RC.gNB[%d] allocated @ %p\n",inst,RC.gNB[inst]);
|
||||||
|
}
|
||||||
gNB = RC.gNB[inst];
|
gNB = RC.gNB[inst];
|
||||||
gNB->abstraction_flag = 0;
|
gNB->abstraction_flag = 0;
|
||||||
gNB->single_thread_flag = single_thread_flag;
|
gNB->single_thread_flag = single_thread_flag;
|
||||||
@@ -1065,7 +507,7 @@ void init_gNB(int single_thread_flag,int wait_for_sync) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
LOG_I(PHY,"[nr-softmodem.c] gNB structure allocated\n");
|
LOG_I(PHY,"[nr-gnb.c] gNB structure allocated\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
+275
-716
File diff suppressed because it is too large
Load Diff
@@ -86,12 +86,13 @@ unsigned short config_frames[4] = {2,9,11,13};
|
|||||||
#include "ngap_gNB.h"
|
#include "ngap_gNB.h"
|
||||||
#include "gnb_paramdef.h"
|
#include "gnb_paramdef.h"
|
||||||
#include <openair3/ocp-gtpu/gtp_itf.h>
|
#include <openair3/ocp-gtpu/gtp_itf.h>
|
||||||
|
#include "nfapi/oai_integration/vendor_ext.h"
|
||||||
|
|
||||||
pthread_cond_t nfapi_sync_cond;
|
pthread_cond_t nfapi_sync_cond;
|
||||||
pthread_mutex_t nfapi_sync_mutex;
|
pthread_mutex_t nfapi_sync_mutex;
|
||||||
int nfapi_sync_var=-1; //!< protected by mutex \ref nfapi_sync_mutex
|
int nfapi_sync_var=-1; //!< protected by mutex \ref nfapi_sync_mutex
|
||||||
|
|
||||||
uint8_t nfapi_mode = 0; // Default to monolithic mode
|
extern uint8_t nfapi_mode; // Default to monolithic mode
|
||||||
|
|
||||||
pthread_cond_t sync_cond;
|
pthread_cond_t sync_cond;
|
||||||
pthread_mutex_t sync_mutex;
|
pthread_mutex_t sync_mutex;
|
||||||
@@ -136,9 +137,6 @@ double rx_gain[MAX_NUM_CCs][4] = {{110,0,0,0},{20,0,0,0}};
|
|||||||
|
|
||||||
double rx_gain_off = 0.0;
|
double rx_gain_off = 0.0;
|
||||||
|
|
||||||
double sample_rate=30.72e6;
|
|
||||||
double bw = 10.0e6;
|
|
||||||
|
|
||||||
static int tx_max_power[MAX_NUM_CCs]; /* = {0,0}*/;
|
static int tx_max_power[MAX_NUM_CCs]; /* = {0,0}*/;
|
||||||
|
|
||||||
|
|
||||||
@@ -475,93 +473,6 @@ void set_default_frame_parms(nfapi_nr_config_request_scf_t *config[MAX_NUM_CCs],
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
void init_openair0(void) {
|
|
||||||
|
|
||||||
int card;
|
|
||||||
int i;
|
|
||||||
|
|
||||||
for (card=0; card<MAX_CARDS; card++) {
|
|
||||||
|
|
||||||
openair0_cfg[card].mmapped_dma=mmapped_dma;
|
|
||||||
openair0_cfg[card].configFilename = NULL;
|
|
||||||
|
|
||||||
if(config[0]->rf_config.dl_carrier_bandwidth.value == 100) {
|
|
||||||
if (frame_parms[0]->threequarter_fs) {
|
|
||||||
openair0_cfg[card].sample_rate=23.04e6;
|
|
||||||
openair0_cfg[card].samples_per_frame = 230400;
|
|
||||||
openair0_cfg[card].tx_bw = 10e6;
|
|
||||||
openair0_cfg[card].rx_bw = 10e6;
|
|
||||||
} else {
|
|
||||||
openair0_cfg[card].sample_rate=30.72e6;
|
|
||||||
openair0_cfg[card].samples_per_frame = 307200;
|
|
||||||
openair0_cfg[card].tx_bw = 10e6;
|
|
||||||
openair0_cfg[card].rx_bw = 10e6;
|
|
||||||
}
|
|
||||||
} else if(config[0]->rf_config.dl_carrier_bandwidth.value == 50) {
|
|
||||||
openair0_cfg[card].sample_rate=15.36e6;
|
|
||||||
openair0_cfg[card].samples_per_frame = 153600;
|
|
||||||
openair0_cfg[card].tx_bw = 5e6;
|
|
||||||
openair0_cfg[card].rx_bw = 5e6;
|
|
||||||
} else if (config[0]->rf_config.dl_carrier_bandwidth.value == 25) {
|
|
||||||
openair0_cfg[card].sample_rate=7.68e6;
|
|
||||||
openair0_cfg[card].samples_per_frame = 76800;
|
|
||||||
openair0_cfg[card].tx_bw = 2.5e6;
|
|
||||||
openair0_cfg[card].rx_bw = 2.5e6;
|
|
||||||
} else if (config[0]->rf_config.dl_carrier_bandwidth.value == 6) {
|
|
||||||
openair0_cfg[card].sample_rate=1.92e6;
|
|
||||||
openair0_cfg[card].samples_per_frame = 19200;
|
|
||||||
openair0_cfg[card].tx_bw = 1.5e6;
|
|
||||||
openair0_cfg[card].rx_bw = 1.5e6;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
if (config[0]->subframe_config.duplex_mode.value==TDD)
|
|
||||||
openair0_cfg[card].duplex_mode = duplex_mode_TDD;
|
|
||||||
else //FDD
|
|
||||||
openair0_cfg[card].duplex_mode = duplex_mode_FDD;
|
|
||||||
|
|
||||||
printf("HW: Configuring card %d, nb_antennas_tx/rx %d/%d\n",card,
|
|
||||||
RC.gNB[0]->gNB_config.rf_config.tx_antenna_ports.value,
|
|
||||||
RC.gNB[0]->gNB_config.rf_config.tx_antenna_ports.value );
|
|
||||||
openair0_cfg[card].Mod_id = 0;
|
|
||||||
|
|
||||||
openair0_cfg[card].num_rb_dl=config[0]->rf_config.dl_carrier_bandwidth.value;
|
|
||||||
|
|
||||||
openair0_cfg[card].clock_source = clock_source;
|
|
||||||
|
|
||||||
|
|
||||||
openair0_cfg[card].tx_num_channels=min(2,RC.gNB[0]->gNB_config.rf_config.tx_antenna_ports.value );
|
|
||||||
openair0_cfg[card].rx_num_channels=min(2,RC.gNB[0]->gNB_config.rf_config.tx_antenna_ports.value );
|
|
||||||
|
|
||||||
for (i=0; i<4; i++) {
|
|
||||||
|
|
||||||
if (i<openair0_cfg[card].tx_num_channels)
|
|
||||||
openair0_cfg[card].tx_freq[i] = downlink_frequency[0][i] ;
|
|
||||||
else
|
|
||||||
openair0_cfg[card].tx_freq[i]=0.0;
|
|
||||||
|
|
||||||
if (i<openair0_cfg[card].rx_num_channels)
|
|
||||||
openair0_cfg[card].rx_freq[i] =downlink_frequency[0][i] + uplink_frequency_offset[0][i] ;
|
|
||||||
else
|
|
||||||
openair0_cfg[card].rx_freq[i]=0.0;
|
|
||||||
|
|
||||||
openair0_cfg[card].autocal[i] = 1;
|
|
||||||
openair0_cfg[card].tx_gain[i] = tx_gain[0][i];
|
|
||||||
openair0_cfg[card].rx_gain[i] = RC.gNB[0]->rx_total_gain_dB;
|
|
||||||
|
|
||||||
|
|
||||||
openair0_cfg[card].configFilename = get_softmodem_params()->rf_config_file;
|
|
||||||
printf("Card %d, channel %d, Setting tx_gain %f, rx_gain %f, tx_freq %f, rx_freq %f\n",
|
|
||||||
card,i, openair0_cfg[card].tx_gain[i],
|
|
||||||
openair0_cfg[card].rx_gain[i],
|
|
||||||
openair0_cfg[card].tx_freq[i],
|
|
||||||
openair0_cfg[card].rx_freq[i]);
|
|
||||||
}
|
|
||||||
} // for loop on cards
|
|
||||||
}
|
|
||||||
*/
|
|
||||||
|
|
||||||
void wait_RUs(void) {
|
void wait_RUs(void) {
|
||||||
LOG_I(PHY,"Waiting for RUs to be configured ... RC.ru_mask:%02lx\n", RC.ru_mask);
|
LOG_I(PHY,"Waiting for RUs to be configured ... RC.ru_mask:%02lx\n", RC.ru_mask);
|
||||||
// wait for all RUs to be configured over fronthaul
|
// wait for all RUs to be configured over fronthaul
|
||||||
@@ -806,12 +717,11 @@ if(!IS_SOFTMODEM_NOS1)
|
|||||||
if(IS_SOFTMODEM_NOS1)
|
if(IS_SOFTMODEM_NOS1)
|
||||||
init_pdcp();
|
init_pdcp();
|
||||||
|
|
||||||
|
if (RC.nb_nr_L1_inst > 0)
|
||||||
|
RCconfig_NR_L1();
|
||||||
if (RC.nb_nr_inst > 0) {
|
if (RC.nb_nr_inst > 0) {
|
||||||
// don't create if node doesn't connect to RRC/S1/GTP
|
// don't create if node doesn't connect to RRC/S1/GTP
|
||||||
AssertFatal(create_gNB_tasks(1) == 0,"cannot create ITTI tasks\n");
|
AssertFatal(create_gNB_tasks(1) == 0,"cannot create ITTI tasks\n");
|
||||||
} else {
|
|
||||||
printf("No ITTI, Initializing L1\n");
|
|
||||||
RCconfig_L1();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* 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 */
|
||||||
@@ -832,7 +742,7 @@ if(!IS_SOFTMODEM_NOS1)
|
|||||||
|
|
||||||
usleep(1000);
|
usleep(1000);
|
||||||
|
|
||||||
if (nfapi_mode) {
|
if (NFAPI_MODE) {
|
||||||
printf("NFAPI*** - mutex and cond created - will block shortly for completion of PNF connection\n");
|
printf("NFAPI*** - mutex and cond created - will block shortly for completion of PNF connection\n");
|
||||||
pthread_cond_init(&sync_cond,NULL);
|
pthread_cond_init(&sync_cond,NULL);
|
||||||
pthread_mutex_init(&sync_mutex, NULL);
|
pthread_mutex_init(&sync_mutex, NULL);
|
||||||
@@ -840,7 +750,7 @@ if(!IS_SOFTMODEM_NOS1)
|
|||||||
|
|
||||||
const char *nfapi_mode_str = "<UNKNOWN>";
|
const char *nfapi_mode_str = "<UNKNOWN>";
|
||||||
|
|
||||||
switch(nfapi_mode) {
|
switch(NFAPI_MODE) {
|
||||||
case 0:
|
case 0:
|
||||||
nfapi_mode_str = "MONOLITHIC";
|
nfapi_mode_str = "MONOLITHIC";
|
||||||
break;
|
break;
|
||||||
@@ -860,7 +770,7 @@ if(!IS_SOFTMODEM_NOS1)
|
|||||||
|
|
||||||
printf("NFAPI MODE:%s\n", nfapi_mode_str);
|
printf("NFAPI MODE:%s\n", nfapi_mode_str);
|
||||||
|
|
||||||
if (nfapi_mode==2) // VNF
|
if (NFAPI_MODE==NFAPI_MODE_VNF)
|
||||||
wait_nfapi_init("main?");
|
wait_nfapi_init("main?");
|
||||||
|
|
||||||
printf("START MAIN THREADS\n");
|
printf("START MAIN THREADS\n");
|
||||||
@@ -889,7 +799,7 @@ if(!IS_SOFTMODEM_NOS1)
|
|||||||
|
|
||||||
config_sync_var=0;
|
config_sync_var=0;
|
||||||
|
|
||||||
if (nfapi_mode==1) { // PNF
|
if (NFAPI_MODE==NFAPI_MODE_PNF) {
|
||||||
wait_nfapi_init("main?");
|
wait_nfapi_init("main?");
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -909,7 +819,7 @@ if(!IS_SOFTMODEM_NOS1)
|
|||||||
load_softscope("nr",&p);
|
load_softscope("nr",&p);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (nfapi_mode != 1 && nfapi_mode != 2) {
|
if (NFAPI_MODE != NFAPI_MODE_PNF && NFAPI_MODE != NFAPI_MODE_VNF) {
|
||||||
printf("Not NFAPI mode - call init_eNB_afterRU()\n");
|
printf("Not NFAPI mode - call init_eNB_afterRU()\n");
|
||||||
init_eNB_afterRU();
|
init_eNB_afterRU();
|
||||||
} else {
|
} else {
|
||||||
|
|||||||
+29
-80
@@ -85,12 +85,6 @@
|
|||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef NO_RAT_NR
|
|
||||||
#define DURATION_RX_TO_TX (NR_UE_CAPABILITY_SLOT_RX_TO_TX) /* for NR this will certainly depends to such UE capability which is not yet defined */
|
|
||||||
#else
|
|
||||||
#define DURATION_RX_TO_TX (6) /* For LTE, this duration is fixed to 4 and it is linked to LTE standard for both modes FDD/TDD */
|
|
||||||
#endif
|
|
||||||
|
|
||||||
typedef enum {
|
typedef enum {
|
||||||
pss = 0,
|
pss = 0,
|
||||||
pbch = 1,
|
pbch = 1,
|
||||||
@@ -237,43 +231,6 @@ static void UE_synch(void *arg) {
|
|||||||
openair0_cfg[UE->rf_map.card].rx_freq[0],
|
openair0_cfg[UE->rf_map.card].rx_freq[0],
|
||||||
openair0_cfg[UE->rf_map.card].tx_freq[0]);
|
openair0_cfg[UE->rf_map.card].tx_freq[0]);
|
||||||
|
|
||||||
// reconfigure for potentially different bandwidth
|
|
||||||
switch(UE->frame_parms.N_RB_DL) {
|
|
||||||
case 6:
|
|
||||||
openair0_cfg[UE->rf_map.card].sample_rate =1.92e6;
|
|
||||||
openair0_cfg[UE->rf_map.card].rx_bw =.96e6;
|
|
||||||
openair0_cfg[UE->rf_map.card].tx_bw =.96e6;
|
|
||||||
// openair0_cfg[0].rx_gain[0] -= 12;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 25:
|
|
||||||
openair0_cfg[UE->rf_map.card].sample_rate =7.68e6;
|
|
||||||
openair0_cfg[UE->rf_map.card].rx_bw =2.5e6;
|
|
||||||
openair0_cfg[UE->rf_map.card].tx_bw =2.5e6;
|
|
||||||
// openair0_cfg[0].rx_gain[0] -= 6;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 50:
|
|
||||||
openair0_cfg[UE->rf_map.card].sample_rate =15.36e6;
|
|
||||||
openair0_cfg[UE->rf_map.card].rx_bw =5.0e6;
|
|
||||||
openair0_cfg[UE->rf_map.card].tx_bw =5.0e6;
|
|
||||||
// openair0_cfg[0].rx_gain[0] -= 3;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 100:
|
|
||||||
openair0_cfg[UE->rf_map.card].sample_rate=30.72e6;
|
|
||||||
openair0_cfg[UE->rf_map.card].rx_bw=10.0e6;
|
|
||||||
openair0_cfg[UE->rf_map.card].tx_bw=10.0e6;
|
|
||||||
// openair0_cfg[0].rx_gain[0] -= 0;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 66:
|
|
||||||
openair0_cfg[UE->rf_map.card].sample_rate=122.88e6;
|
|
||||||
openair0_cfg[UE->rf_map.card].rx_bw=100.e6;
|
|
||||||
openair0_cfg[UE->rf_map.card].tx_bw=100.e6;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (UE->mode != loop_through_memory) {
|
if (UE->mode != loop_through_memory) {
|
||||||
UE->rfdevice.trx_set_freq_func(&UE->rfdevice,&openair0_cfg[0],0);
|
UE->rfdevice.trx_set_freq_func(&UE->rfdevice,&openair0_cfg[0],0);
|
||||||
//UE->rfdevice.trx_set_gains_func(&openair0,&openair0_cfg[0]);
|
//UE->rfdevice.trx_set_gains_func(&openair0,&openair0_cfg[0]);
|
||||||
@@ -669,8 +626,8 @@ void *UE_thread(void *arg) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
curMsg->proc.timestamp_tx = timestamp+
|
curMsg->proc.timestamp_tx = timestamp+
|
||||||
UE->frame_parms.get_samples_slot_timestamp(slot_nr,
|
UE->frame_parms.get_samples_slot_timestamp(slot_nr,&UE->frame_parms,DURATION_RX_TO_TX)
|
||||||
&UE->frame_parms,DURATION_RX_TO_TX) - firstSymSamp;
|
- firstSymSamp;
|
||||||
|
|
||||||
notifiedFIFO_elt_t *res;
|
notifiedFIFO_elt_t *res;
|
||||||
|
|
||||||
@@ -692,8 +649,10 @@ void *UE_thread(void *arg) {
|
|||||||
decoded_frame_rx, curMsg->proc.frame_rx );
|
decoded_frame_rx, curMsg->proc.frame_rx );
|
||||||
|
|
||||||
// use previous timing_advance value to compute writeTimestamp
|
// use previous timing_advance value to compute writeTimestamp
|
||||||
writeTimestamp = timestamp + UE->frame_parms.get_samples_slot_timestamp(slot_nr, &UE->frame_parms,DURATION_RX_TO_TX - RX_NB_TH) -
|
writeTimestamp = timestamp+
|
||||||
firstSymSamp - openair0_cfg[0].tx_sample_advance - UE->N_TA_offset - timing_advance;
|
UE->frame_parms.get_samples_slot_timestamp(slot_nr,&UE->frame_parms,DURATION_RX_TO_TX
|
||||||
|
- RX_NB_TH) - firstSymSamp - openair0_cfg[0].tx_sample_advance -
|
||||||
|
UE->N_TA_offset - timing_advance;
|
||||||
|
|
||||||
// but use current UE->timing_advance value to compute writeBlockSize
|
// but use current UE->timing_advance value to compute writeBlockSize
|
||||||
if (UE->timing_advance != timing_advance) {
|
if (UE->timing_advance != timing_advance) {
|
||||||
@@ -703,25 +662,32 @@ void *UE_thread(void *arg) {
|
|||||||
|
|
||||||
int flags = 0;
|
int flags = 0;
|
||||||
int slot_tx_usrp = slot_nr + DURATION_RX_TO_TX - RX_NB_TH;
|
int slot_tx_usrp = slot_nr + DURATION_RX_TO_TX - RX_NB_TH;
|
||||||
uint8_t tdd_period = mac->phy_config.config_req.tdd_table.tdd_period_in_slots;
|
|
||||||
uint8_t num_UL_slots = mac->scc->tdd_UL_DL_ConfigurationCommon->pattern1.nrofUplinkSlots +
|
if (openair0_cfg[0].duplex_mode == duplex_mode_TDD) {
|
||||||
(mac->scc->tdd_UL_DL_ConfigurationCommon->pattern1.nrofUplinkSymbols!=0);
|
|
||||||
uint8_t first_tx_slot = tdd_period - num_UL_slots;
|
uint8_t tdd_period = mac->phy_config.config_req.tdd_table.tdd_period_in_slots;
|
||||||
if (slot_tx_usrp%tdd_period==first_tx_slot)
|
int nrofUplinkSlots = mac->scc->tdd_UL_DL_ConfigurationCommon->pattern1.nrofUplinkSlots;
|
||||||
flags=2;
|
uint8_t num_UL_slots = nrofUplinkSlots + (nrofUplinkSlots != 0);
|
||||||
else if (slot_tx_usrp%tdd_period==first_tx_slot+num_UL_slots-1)
|
uint8_t first_tx_slot = tdd_period - num_UL_slots;
|
||||||
flags = 3;
|
|
||||||
else if (slot_tx_usrp%tdd_period>first_tx_slot)
|
if (slot_tx_usrp % tdd_period == first_tx_slot)
|
||||||
|
flags = 2;
|
||||||
|
else if (slot_tx_usrp % tdd_period == first_tx_slot + num_UL_slots - 1)
|
||||||
|
flags = 3;
|
||||||
|
else if (slot_tx_usrp % tdd_period > first_tx_slot)
|
||||||
|
flags = 1;
|
||||||
|
} else {
|
||||||
flags = 1;
|
flags = 1;
|
||||||
|
}
|
||||||
|
|
||||||
if (flags || IS_SOFTMODEM_RFSIM)
|
if (flags || IS_SOFTMODEM_RFSIM)
|
||||||
AssertFatal( writeBlockSize ==
|
AssertFatal(writeBlockSize ==
|
||||||
UE->rfdevice.trx_write_func(&UE->rfdevice,
|
UE->rfdevice.trx_write_func(&UE->rfdevice,
|
||||||
writeTimestamp,
|
writeTimestamp,
|
||||||
txp,
|
txp,
|
||||||
writeBlockSize,
|
writeBlockSize,
|
||||||
UE->frame_parms.nb_antennas_tx,
|
UE->frame_parms.nb_antennas_tx,
|
||||||
flags),"");
|
flags),"");
|
||||||
|
|
||||||
for (int i=0; i<UE->frame_parms.nb_antennas_tx; i++)
|
for (int i=0; i<UE->frame_parms.nb_antennas_tx; i++)
|
||||||
memset(txp[i], 0, writeBlockSize);
|
memset(txp[i], 0, writeBlockSize);
|
||||||
@@ -761,23 +727,6 @@ void init_NR_UE(int nb_inst, char* rrc_config_path) {
|
|||||||
AssertFatal((rrc_inst = nr_l3_init_ue(rrc_config_path)) != NULL, "can not initialize RRC module\n");
|
AssertFatal((rrc_inst = nr_l3_init_ue(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");
|
||||||
|
|
||||||
NR_PUSCH_TimeDomainResourceAllocationList_t *pusch_TimeDomainAllocationList = NULL;
|
|
||||||
if (mac_inst->ULbwp[0]->bwp_Dedicated->pusch_Config->choice.setup->pusch_TimeDomainAllocationList) {
|
|
||||||
pusch_TimeDomainAllocationList = mac_inst->ULbwp[0]->bwp_Dedicated->pusch_Config->choice.setup->pusch_TimeDomainAllocationList->choice.setup;
|
|
||||||
}
|
|
||||||
else if (mac_inst->ULbwp[0]->bwp_Common->pusch_ConfigCommon->choice.setup->pusch_TimeDomainAllocationList) {
|
|
||||||
pusch_TimeDomainAllocationList = mac_inst->ULbwp[0]->bwp_Common->pusch_ConfigCommon->choice.setup->pusch_TimeDomainAllocationList;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (pusch_TimeDomainAllocationList) {
|
|
||||||
for(int i = 0; i < pusch_TimeDomainAllocationList->list.count; i++) {
|
|
||||||
AssertFatal(*pusch_TimeDomainAllocationList->list.array[i]->k2 >= DURATION_RX_TO_TX,
|
|
||||||
"Slot offset K2 (%ld) cannot be less than DURATION_RX_TO_TX (%d)\n",
|
|
||||||
*pusch_TimeDomainAllocationList->list.array[i]->k2,
|
|
||||||
DURATION_RX_TO_TX);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -146,6 +146,7 @@ int card_offset = 0;
|
|||||||
uint64_t num_missed_slots = 0; // counter for the number of missed slots
|
uint64_t num_missed_slots = 0; // counter for the number of missed slots
|
||||||
int transmission_mode = 1;
|
int transmission_mode = 1;
|
||||||
int numerology = 0;
|
int numerology = 0;
|
||||||
|
int usrp_tx_thread = 0;
|
||||||
int oaisim_flag = 0;
|
int oaisim_flag = 0;
|
||||||
int emulate_rf = 0;
|
int emulate_rf = 0;
|
||||||
|
|
||||||
@@ -315,92 +316,10 @@ void init_openair0(void) {
|
|||||||
|
|
||||||
for (card=0; card<MAX_CARDS; card++) {
|
for (card=0; card<MAX_CARDS; card++) {
|
||||||
uint64_t dl_carrier, ul_carrier;
|
uint64_t dl_carrier, ul_carrier;
|
||||||
openair0_cfg[card].configFilename = NULL;
|
openair0_cfg[card].configFilename = NULL;
|
||||||
openair0_cfg[card].threequarter_fs = frame_parms->threequarter_fs;
|
openair0_cfg[card].threequarter_fs = frame_parms->threequarter_fs;
|
||||||
numerology = frame_parms->numerology_index;
|
openair0_cfg[card].sample_rate = frame_parms->samples_per_subframe * 1e3;
|
||||||
|
openair0_cfg[card].samples_per_frame = frame_parms->samples_per_frame;
|
||||||
if(frame_parms->N_RB_DL == 66) {
|
|
||||||
if (numerology==3) {
|
|
||||||
openair0_cfg[card].sample_rate=122.88e6;
|
|
||||||
openair0_cfg[card].samples_per_frame = 1228800;
|
|
||||||
} else {
|
|
||||||
LOG_E(PHY,"Unsupported numerology! FR2 supports only 120KHz SCS for now.\n");
|
|
||||||
exit(-1);
|
|
||||||
}
|
|
||||||
}else if(frame_parms->N_RB_DL == 32) {
|
|
||||||
if (numerology==3) {
|
|
||||||
openair0_cfg[card].sample_rate=61.44e6;
|
|
||||||
openair0_cfg[card].samples_per_frame = 614400;
|
|
||||||
} else {
|
|
||||||
LOG_E(PHY,"Unsupported numerology! FR2 supports only 120KHz SCS for now.\n");
|
|
||||||
exit(-1);
|
|
||||||
}
|
|
||||||
}else if(frame_parms->N_RB_DL == 217) {
|
|
||||||
if (numerology==1) {
|
|
||||||
if (frame_parms->threequarter_fs) {
|
|
||||||
openair0_cfg[card].sample_rate=92.16e6;
|
|
||||||
openair0_cfg[card].samples_per_frame = 921600;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
openair0_cfg[card].sample_rate=122.88e6;
|
|
||||||
openair0_cfg[card].samples_per_frame = 1228800;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
LOG_E(PHY,"Unsupported numerology!\n");
|
|
||||||
exit(-1);
|
|
||||||
}
|
|
||||||
} else if(frame_parms->N_RB_DL == 273) {
|
|
||||||
if (numerology==1) {
|
|
||||||
if (frame_parms->threequarter_fs) {
|
|
||||||
AssertFatal(0 == 1,"three quarter sampling not supported for N_RB 273\n");
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
openair0_cfg[card].sample_rate=122.88e6;
|
|
||||||
openair0_cfg[card].samples_per_frame = 1228800;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
LOG_E(PHY,"Unsupported numerology!\n");
|
|
||||||
exit(-1);
|
|
||||||
}
|
|
||||||
} else if(frame_parms->N_RB_DL == 106) {
|
|
||||||
if (numerology==0) {
|
|
||||||
if (frame_parms->threequarter_fs) {
|
|
||||||
openair0_cfg[card].sample_rate=23.04e6;
|
|
||||||
openair0_cfg[card].samples_per_frame = 230400;
|
|
||||||
} else {
|
|
||||||
openair0_cfg[card].sample_rate=30.72e6;
|
|
||||||
openair0_cfg[card].samples_per_frame = 307200;
|
|
||||||
}
|
|
||||||
} else if (numerology==1) {
|
|
||||||
if (frame_parms->threequarter_fs) {
|
|
||||||
openair0_cfg[card].sample_rate=46.08e6;
|
|
||||||
openair0_cfg[card].samples_per_frame = 460800;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
openair0_cfg[card].sample_rate=61.44e6;
|
|
||||||
openair0_cfg[card].samples_per_frame = 614400;
|
|
||||||
}
|
|
||||||
} else if (numerology==2) {
|
|
||||||
openair0_cfg[card].sample_rate=122.88e6;
|
|
||||||
openair0_cfg[card].samples_per_frame = 1228800;
|
|
||||||
} else {
|
|
||||||
LOG_E(PHY,"Unsupported numerology!\n");
|
|
||||||
exit(-1);
|
|
||||||
}
|
|
||||||
} else if(frame_parms->N_RB_DL == 50) {
|
|
||||||
openair0_cfg[card].sample_rate=15.36e6;
|
|
||||||
openair0_cfg[card].samples_per_frame = 153600;
|
|
||||||
} else if (frame_parms->N_RB_DL == 25) {
|
|
||||||
openair0_cfg[card].sample_rate=7.68e6;
|
|
||||||
openair0_cfg[card].samples_per_frame = 76800;
|
|
||||||
} else if (frame_parms->N_RB_DL == 6) {
|
|
||||||
openair0_cfg[card].sample_rate=1.92e6;
|
|
||||||
openair0_cfg[card].samples_per_frame = 19200;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
LOG_E(PHY,"Unknown NB_RB %d!\n",frame_parms->N_RB_DL);
|
|
||||||
exit(-1);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (frame_parms->frame_type==TDD)
|
if (frame_parms->frame_type==TDD)
|
||||||
openair0_cfg[card].duplex_mode = duplex_mode_TDD;
|
openair0_cfg[card].duplex_mode = duplex_mode_TDD;
|
||||||
@@ -414,8 +333,9 @@ void init_openair0(void) {
|
|||||||
openair0_cfg[card].tx_num_channels = min(2, frame_parms->nb_antennas_tx);
|
openair0_cfg[card].tx_num_channels = min(2, frame_parms->nb_antennas_tx);
|
||||||
openair0_cfg[card].rx_num_channels = min(2, frame_parms->nb_antennas_rx);
|
openair0_cfg[card].rx_num_channels = min(2, frame_parms->nb_antennas_rx);
|
||||||
|
|
||||||
LOG_I(PHY, "HW: Configuring card %d, tx/rx num_channels %d/%d, duplex_mode %s\n",
|
LOG_I(PHY, "HW: Configuring card %d, sample_rate %f, tx/rx num_channels %d/%d, duplex_mode %s\n",
|
||||||
card,
|
card,
|
||||||
|
openair0_cfg[card].sample_rate,
|
||||||
openair0_cfg[card].tx_num_channels,
|
openair0_cfg[card].tx_num_channels,
|
||||||
openair0_cfg[card].rx_num_channels,
|
openair0_cfg[card].rx_num_channels,
|
||||||
duplex_mode[openair0_cfg[card].duplex_mode]);
|
duplex_mode[openair0_cfg[card].duplex_mode]);
|
||||||
@@ -530,7 +450,8 @@ int main( int argc, char **argv ) {
|
|||||||
fapi_nr_config_request_t *nrUE_config = &UE[CC_id]->nrUE_config;
|
fapi_nr_config_request_t *nrUE_config = &UE[CC_id]->nrUE_config;
|
||||||
|
|
||||||
nr_init_frame_parms_ue(&UE[CC_id]->frame_parms, nrUE_config, *mac->scc->downlinkConfigCommon->frequencyInfoDL->frequencyBandList.list.array[0]);
|
nr_init_frame_parms_ue(&UE[CC_id]->frame_parms, nrUE_config, *mac->scc->downlinkConfigCommon->frequencyInfoDL->frequencyBandList.list.array[0]);
|
||||||
init_symbol_rotation(&UE[CC_id]->frame_parms, UE[CC_id]->frame_parms.dl_CarrierFreq);
|
|
||||||
|
init_symbol_rotation(&UE[CC_id]->frame_parms);
|
||||||
init_nr_ue_vars(UE[CC_id], 0, abstraction_flag);
|
init_nr_ue_vars(UE[CC_id], 0, abstraction_flag);
|
||||||
|
|
||||||
#ifdef FR2_TEST
|
#ifdef FR2_TEST
|
||||||
@@ -556,11 +477,14 @@ int main( int argc, char **argv ) {
|
|||||||
|
|
||||||
|
|
||||||
init_NR_UE_threads(1);
|
init_NR_UE_threads(1);
|
||||||
config_check_unknown_cmdlineopt(CONFIG_CHECKALLSECTIONS);
|
|
||||||
printf("UE threads created by %ld\n", gettid());
|
printf("UE threads created by %ld\n", gettid());
|
||||||
|
|
||||||
// wait for end of program
|
// wait for end of program
|
||||||
printf("TYPE <CTRL-C> TO TERMINATE\n");
|
printf("TYPE <CTRL-C> TO TERMINATE\n");
|
||||||
|
// Sleep a while before checking all parameters have been used
|
||||||
|
// Some are used directly in external threads, asynchronously
|
||||||
|
sleep(20);
|
||||||
|
config_check_unknown_cmdlineopt(CONFIG_CHECKALLSECTIONS);
|
||||||
|
|
||||||
while(true)
|
while(true)
|
||||||
sleep(3600);
|
sleep(3600);
|
||||||
|
|||||||
@@ -39,6 +39,8 @@
|
|||||||
#include "executables/thread-common.h"
|
#include "executables/thread-common.h"
|
||||||
#include "common/utils/LOG/log.h"
|
#include "common/utils/LOG/log.h"
|
||||||
#include "softmodem-common.h"
|
#include "softmodem-common.h"
|
||||||
|
#include "nfapi/oai_integration/vendor_ext.h"
|
||||||
|
|
||||||
|
|
||||||
static softmodem_params_t softmodem_params;
|
static softmodem_params_t softmodem_params;
|
||||||
char *parallel_config=NULL;
|
char *parallel_config=NULL;
|
||||||
@@ -46,6 +48,7 @@ char *worker_config=NULL;
|
|||||||
msc_interface_t msc_interface;
|
msc_interface_t msc_interface;
|
||||||
int usrp_tx_thread = 0;
|
int usrp_tx_thread = 0;
|
||||||
|
|
||||||
|
uint8_t nfapi_mode=0;
|
||||||
|
|
||||||
static mapping softmodem_funcs[] = MAPPING_SOFTMODEM_FUNCTIONS;
|
static mapping softmodem_funcs[] = MAPPING_SOFTMODEM_FUNCTIONS;
|
||||||
static struct timespec start;
|
static struct timespec start;
|
||||||
@@ -145,6 +148,7 @@ void get_common_options(uint32_t execmask) {
|
|||||||
if(parallel_config != NULL) set_parallel_conf(parallel_config);
|
if(parallel_config != NULL) set_parallel_conf(parallel_config);
|
||||||
|
|
||||||
if(worker_config != NULL) set_worker_conf(worker_config);
|
if(worker_config != NULL) set_worker_conf(worker_config);
|
||||||
|
nfapi_setmode(nfapi_mode);
|
||||||
}
|
}
|
||||||
void softmodem_printresources(int sig, telnet_printfunc_t pf) {
|
void softmodem_printresources(int sig, telnet_printfunc_t pf) {
|
||||||
struct rusage usage;
|
struct rusage usage;
|
||||||
|
|||||||
@@ -92,6 +92,7 @@ extern "C"
|
|||||||
#define CONFIG_HLP_NOKRNMOD "(noS1 only): Use tun instead of namesh module \n"
|
#define CONFIG_HLP_NOKRNMOD "(noS1 only): Use tun instead of namesh module \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_USRP_THREAD "having extra thead for usrp tx\n"
|
#define CONFIG_HLP_USRP_THREAD "having extra thead for usrp tx\n"
|
||||||
|
#define CONFIG_HLP_NFAPI "Change the nFAPI mode for NR\n"
|
||||||
|
|
||||||
/*-----------------------------------------------------------------------------------------------------------------------------------------------------*/
|
/*-----------------------------------------------------------------------------------------------------------------------------------------------------*/
|
||||||
/* command line parameters common to eNodeB and UE */
|
/* command line parameters common to eNodeB and UE */
|
||||||
@@ -113,6 +114,7 @@ extern "C"
|
|||||||
#define SEND_DMRSSYNC softmodem_params.send_dmrs_sync
|
#define SEND_DMRSSYNC softmodem_params.send_dmrs_sync
|
||||||
#define USIM_TEST softmodem_params.usim_test
|
#define USIM_TEST softmodem_params.usim_test
|
||||||
#define USE_256QAM_TABLE softmodem_params.use_256qam_table
|
#define USE_256QAM_TABLE softmodem_params.use_256qam_table
|
||||||
|
#define NFAPI softmodem_params.nfapi
|
||||||
|
|
||||||
#define DEFAULT_RFCONFIG_FILE "/usr/local/etc/syriq/ue.band7.tm1.PRB100.NR40.dat";
|
#define DEFAULT_RFCONFIG_FILE "/usr/local/etc/syriq/ue.band7.tm1.PRB100.NR40.dat";
|
||||||
|
|
||||||
@@ -145,6 +147,7 @@ extern int usrp_tx_thread;
|
|||||||
{"nbiot-disable", CONFIG_HLP_DISABLNBIOT, PARAMFLAG_BOOL, uptr:&nonbiot, defuintval:0, TYPE_INT, 0}, \
|
{"nbiot-disable", CONFIG_HLP_DISABLNBIOT, PARAMFLAG_BOOL, uptr:&nonbiot, defuintval:0, TYPE_INT, 0}, \
|
||||||
{"use-256qam-table", CONFIG_HLP_256QAM, PARAMFLAG_BOOL, iptr:&USE_256QAM_TABLE, defintval:0, TYPE_INT, 0}, \
|
{"use-256qam-table", CONFIG_HLP_256QAM, PARAMFLAG_BOOL, iptr:&USE_256QAM_TABLE, defintval:0, TYPE_INT, 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}, \
|
||||||
|
{"nfapi", CONFIG_HLP_NFAPI, 0, u8ptr:&nfapi_mode, defintval:0, TYPE_UINT8, 0}, \
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -232,6 +235,7 @@ typedef struct {
|
|||||||
int hw_timing_advance;
|
int hw_timing_advance;
|
||||||
uint32_t send_dmrs_sync;
|
uint32_t send_dmrs_sync;
|
||||||
int use_256qam_table;
|
int use_256qam_table;
|
||||||
|
uint8_t nfapi;
|
||||||
} softmodem_params_t;
|
} softmodem_params_t;
|
||||||
|
|
||||||
extern uint64_t get_softmodem_optmask(void);
|
extern uint64_t get_softmodem_optmask(void);
|
||||||
@@ -243,6 +247,14 @@ extern char *get_softmodem_function(uint64_t *sofmodemfunc_mask_ptr);
|
|||||||
extern void set_softmodem_sighandler(void);
|
extern void set_softmodem_sighandler(void);
|
||||||
extern uint64_t downlink_frequency[MAX_NUM_CCs][4];
|
extern uint64_t downlink_frequency[MAX_NUM_CCs][4];
|
||||||
extern int32_t uplink_frequency_offset[MAX_NUM_CCs][4];
|
extern int32_t uplink_frequency_offset[MAX_NUM_CCs][4];
|
||||||
|
extern uint16_t sl_ahead;
|
||||||
|
extern uint16_t sf_ahead;
|
||||||
|
extern volatile int oai_exit;
|
||||||
|
|
||||||
|
void tx_func(void *param);
|
||||||
|
void rx_func(void *param);
|
||||||
|
void ru_tx_func(void *param);
|
||||||
|
extern uint8_t nfapi_mode;
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -0,0 +1,2 @@
|
|||||||
|
# Changelog
|
||||||
|
|
||||||
@@ -0,0 +1,35 @@
|
|||||||
|
# Procedure to run nFAPI in 5G NR
|
||||||
|
|
||||||
|
## Conributed by 5G Testbed IISC
|
||||||
|
### Developers: Sudhakar B,Mahesh K,Gokul S,Aniq U.R
|
||||||
|
|
||||||
|
## Procedure to Build gNB and UE
|
||||||
|
|
||||||
|
The regular commands to build gNB and UE can be used
|
||||||
|
```
|
||||||
|
sudo ./build_oai --gNB --UE
|
||||||
|
|
||||||
|
```
|
||||||
|
## Procedure to run NR nFAPI using RF-Simulator
|
||||||
|
|
||||||
|
### VNF command
|
||||||
|
```
|
||||||
|
sudo ./nr-softmodem -O ../../../targets/PROJECTS/GENERIC-LTE-EPC/CONF/rcc.band78.tm1.106PRB.nfapi.conf --nfapi 2 --noS1 --phy-test
|
||||||
|
|
||||||
|
```
|
||||||
|
### PNF command
|
||||||
|
```
|
||||||
|
sudo ./nr-softmodem -O ../../../targets/PROJECTS/GENERIC-LTE-EPC/CONF/oaiL1.nfapi.usrpx300.conf --nfapi 1 --rfsim --phy-test --rfsimulator.serveraddr server
|
||||||
|
|
||||||
|
```
|
||||||
|
### UE command
|
||||||
|
```
|
||||||
|
sudo RFSIMULATOR=127.0.0.1 ./nr-uesoftmodem --rfsim --phy-test --rrc_config_path . -d
|
||||||
|
|
||||||
|
```
|
||||||
|
## Procedure to run NR nFAPI using Hardware
|
||||||
|
Will be updated as we have not yet currently tested on hardware
|
||||||
|
|
||||||
|
## Notes
|
||||||
|
* In order to acheive the synchronization between VNF and PNF and receive the P7 messages within the timing window the order in which we should run the modules on different terminals is UE->VNF->PNF
|
||||||
|
* Currently only downlink is functional and working as we are still working on uplink functionality
|
||||||
File diff suppressed because it is too large
Load Diff
@@ -23,5 +23,8 @@
|
|||||||
#define NFAPI_PNF_H__
|
#define NFAPI_PNF_H__
|
||||||
int oai_nfapi_rach_ind(nfapi_rach_indication_t *rach_ind);
|
int oai_nfapi_rach_ind(nfapi_rach_indication_t *rach_ind);
|
||||||
void configure_nfapi_pnf(char *vnf_ip_addr, int vnf_p5_port, char *pnf_ip_addr, int pnf_p7_port, int vnf_p7_port);
|
void configure_nfapi_pnf(char *vnf_ip_addr, int vnf_p5_port, char *pnf_ip_addr, int pnf_p7_port, int vnf_p7_port);
|
||||||
|
void configure_nr_nfapi_pnf(char *vnf_ip_addr, int vnf_p5_port, char *pnf_ip_addr, int pnf_p7_port, int vnf_p7_port);
|
||||||
|
|
||||||
void oai_subframe_ind(uint16_t sfn, uint16_t sf);
|
void oai_subframe_ind(uint16_t sfn, uint16_t sf);
|
||||||
|
void oai_slot_ind(uint16_t sfn, uint16_t slot);
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -39,8 +39,12 @@
|
|||||||
#include "nfapi_vnf.h"
|
#include "nfapi_vnf.h"
|
||||||
#include "PHY/defs_eNB.h"
|
#include "PHY/defs_eNB.h"
|
||||||
#include "PHY/LTE_TRANSPORT/transport_proto.h"
|
#include "PHY/LTE_TRANSPORT/transport_proto.h"
|
||||||
|
#include "openair2/LAYER2/NR_MAC_gNB/nr_mac_gNB.h"
|
||||||
|
|
||||||
#include "common/ran_context.h"
|
#include "common/ran_context.h"
|
||||||
|
|
||||||
|
#define TEST
|
||||||
|
|
||||||
extern RAN_CONTEXT_t RC;
|
extern RAN_CONTEXT_t RC;
|
||||||
extern UL_RCC_IND_t UL_RCC_INFO;
|
extern UL_RCC_IND_t UL_RCC_INFO;
|
||||||
|
|
||||||
@@ -189,11 +193,12 @@ int vnf_pack_vendor_extension_tlv(void *ve, uint8_t **ppWritePackedMsg, uint8_t
|
|||||||
int vnf_unpack_vendor_extension_tlv(nfapi_tl_t *tl, uint8_t **ppReadPackedMessage, uint8_t *end, void **ve, nfapi_p4_p5_codec_config_t *codec) {
|
int vnf_unpack_vendor_extension_tlv(nfapi_tl_t *tl, uint8_t **ppReadPackedMessage, uint8_t *end, void **ve, nfapi_p4_p5_codec_config_t *codec) {
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
void install_nr_schedule_handlers(NR_IF_Module_t *if_inst);
|
||||||
void install_schedule_handlers(IF_Module_t *if_inst);
|
void install_schedule_handlers(IF_Module_t *if_inst);
|
||||||
extern int single_thread_flag;
|
extern int single_thread_flag;
|
||||||
extern void init_eNB_afterRU(void);
|
extern void init_eNB_afterRU(void);
|
||||||
extern uint16_t sf_ahead;
|
extern uint16_t sf_ahead;
|
||||||
|
extern uint16_t slot_ahead;
|
||||||
|
|
||||||
void oai_create_enb(void) {
|
void oai_create_enb(void) {
|
||||||
int bodge_counter=0;
|
int bodge_counter=0;
|
||||||
@@ -231,6 +236,39 @@ void oai_enb_init(void) {
|
|||||||
init_eNB_afterRU();
|
init_eNB_afterRU();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void oai_create_gnb(void) {
|
||||||
|
int bodge_counter=0;
|
||||||
|
PHY_VARS_gNB *gNB = RC.gNB[0];
|
||||||
|
RC.nb_nr_CC = (int *)malloc(sizeof(int)); // TODO: find a better function to place this in
|
||||||
|
|
||||||
|
gNB->Mod_id = bodge_counter;
|
||||||
|
gNB->CC_id = bodge_counter;
|
||||||
|
gNB->abstraction_flag = 0;
|
||||||
|
gNB->single_thread_flag = 0;//single_thread_flag;
|
||||||
|
RC.nb_nr_CC[bodge_counter] = 1;
|
||||||
|
|
||||||
|
if (gNB->if_inst==0) {
|
||||||
|
gNB->if_inst = NR_IF_Module_init(bodge_counter);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// This will cause phy_config_request to be installed. That will result in RRC configuring the PHY
|
||||||
|
// that will result in gNB->configured being set to TRUE.
|
||||||
|
// See we need to wait for that to happen otherwise the NFAPI message exchanges won't contain the right parameter values
|
||||||
|
if (RC.gNB[0]->if_inst==0 || RC.gNB[0]->if_inst->NR_PHY_config_req==0 || RC.gNB[0]->if_inst->NR_Schedule_response==0) {
|
||||||
|
printf("RC.gNB[0][0]->if_inst->NR_PHY_config_req is not installed - install it\n");
|
||||||
|
install_nr_schedule_handlers(RC.gNB[0]->if_inst);
|
||||||
|
}
|
||||||
|
|
||||||
|
do {
|
||||||
|
printf("%s() Waiting for gNB to become configured (by RRC/PHY) - need to wait otherwise NFAPI messages won't contain correct values\n", __FUNCTION__);
|
||||||
|
usleep(50000);
|
||||||
|
} while(gNB->configured != 1);
|
||||||
|
|
||||||
|
printf("%s() gNB is now configured\n", __FUNCTION__);
|
||||||
|
}
|
||||||
|
|
||||||
int pnf_connection_indication_cb(nfapi_vnf_config_t *config, int p5_idx) {
|
int pnf_connection_indication_cb(nfapi_vnf_config_t *config, int p5_idx) {
|
||||||
printf("[VNF] pnf connection indication idx:%d\n", p5_idx);
|
printf("[VNF] pnf connection indication idx:%d\n", p5_idx);
|
||||||
oai_create_enb();
|
oai_create_enb();
|
||||||
@@ -241,6 +279,16 @@ int pnf_connection_indication_cb(nfapi_vnf_config_t *config, int p5_idx) {
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int pnf_nr_connection_indication_cb(nfapi_vnf_config_t *config, int p5_idx) {
|
||||||
|
printf("[VNF] pnf connection indication idx:%d\n", p5_idx);
|
||||||
|
oai_create_gnb();
|
||||||
|
nfapi_nr_pnf_param_request_t req;
|
||||||
|
memset(&req, 0, sizeof(req));
|
||||||
|
req.header.message_id = NFAPI_NR_PHY_MSG_TYPE_PNF_PARAM_REQUEST;
|
||||||
|
nfapi_nr_vnf_pnf_param_req(config, p5_idx, &req);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
int pnf_disconnection_indication_cb(nfapi_vnf_config_t *config, int p5_idx) {
|
int pnf_disconnection_indication_cb(nfapi_vnf_config_t *config, int p5_idx) {
|
||||||
printf("[VNF] pnf disconnection indication idx:%d\n", p5_idx);
|
printf("[VNF] pnf disconnection indication idx:%d\n", p5_idx);
|
||||||
vnf_info *vnf = (vnf_info *)(config->user_data);
|
vnf_info *vnf = (vnf_info *)(config->user_data);
|
||||||
@@ -251,6 +299,42 @@ int pnf_disconnection_indication_cb(nfapi_vnf_config_t *config, int p5_idx) {
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int pnf_nr_param_resp_cb(nfapi_vnf_config_t *config, int p5_idx, nfapi_nr_pnf_param_response_t *resp) {
|
||||||
|
printf("[VNF] pnf param response idx:%d error:%d\n", p5_idx, resp->error_code);
|
||||||
|
vnf_info *vnf = (vnf_info *)(config->user_data);
|
||||||
|
pnf_info *pnf = vnf->pnfs;
|
||||||
|
|
||||||
|
for(int i = 0; i < resp->pnf_phy.number_of_phys; ++i) {
|
||||||
|
phy_info phy;
|
||||||
|
memset(&phy,0,sizeof(phy));
|
||||||
|
phy.index = resp->pnf_phy.phy[i].phy_config_index;
|
||||||
|
printf("[VNF] (PHY:%d) phy_config_idx:%d\n", i, resp->pnf_phy.phy[i].phy_config_index);
|
||||||
|
nfapi_vnf_allocate_phy(config, p5_idx, &(phy.id));
|
||||||
|
|
||||||
|
for(int j = 0; j < resp->pnf_phy.phy[i].number_of_rfs; ++j) {
|
||||||
|
printf("[VNF] (PHY:%d) (RF%d) %d\n", i, j, resp->pnf_phy.phy[i].rf_config[j].rf_config_index);
|
||||||
|
phy.rfs[0] = resp->pnf_phy.phy[i].rf_config[j].rf_config_index;
|
||||||
|
}
|
||||||
|
|
||||||
|
pnf->phys[0] = phy;
|
||||||
|
}
|
||||||
|
nfapi_nr_pnf_config_request_t req;
|
||||||
|
memset(&req, 0, sizeof(req));
|
||||||
|
req.header.message_id = NFAPI_PNF_CONFIG_REQUEST;
|
||||||
|
req.pnf_phy_rf_config.tl.tag = NFAPI_PNF_PHY_RF_TAG;
|
||||||
|
req.pnf_phy_rf_config.number_phy_rf_config_info = 2; // DJP pnf.phys.size();
|
||||||
|
printf("DJP:Hard coded num phy rf to 2\n");
|
||||||
|
|
||||||
|
for(unsigned i = 0; i < 2; ++i) {
|
||||||
|
req.pnf_phy_rf_config.phy_rf_config[i].phy_id = pnf->phys[i].id;
|
||||||
|
req.pnf_phy_rf_config.phy_rf_config[i].phy_config_index = pnf->phys[i].index;
|
||||||
|
req.pnf_phy_rf_config.phy_rf_config[i].rf_config_index = pnf->phys[i].rfs[0];
|
||||||
|
}
|
||||||
|
|
||||||
|
nfapi_nr_vnf_pnf_config_req(config, p5_idx, &req);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
int pnf_param_resp_cb(nfapi_vnf_config_t *config, int p5_idx, nfapi_pnf_param_response_t *resp) {
|
int pnf_param_resp_cb(nfapi_vnf_config_t *config, int p5_idx, nfapi_pnf_param_response_t *resp) {
|
||||||
printf("[VNF] pnf param response idx:%d error:%d\n", p5_idx, resp->error_code);
|
printf("[VNF] pnf param response idx:%d error:%d\n", p5_idx, resp->error_code);
|
||||||
vnf_info *vnf = (vnf_info *)(config->user_data);
|
vnf_info *vnf = (vnf_info *)(config->user_data);
|
||||||
@@ -270,7 +354,6 @@ int pnf_param_resp_cb(nfapi_vnf_config_t *config, int p5_idx, nfapi_pnf_param_re
|
|||||||
|
|
||||||
pnf->phys[0] = phy;
|
pnf->phys[0] = phy;
|
||||||
}
|
}
|
||||||
|
|
||||||
for(int i = 0; i < resp->pnf_rf.number_of_rfs; ++i) {
|
for(int i = 0; i < resp->pnf_rf.number_of_rfs; ++i) {
|
||||||
rf_info rf;
|
rf_info rf;
|
||||||
memset(&rf,0,sizeof(rf));
|
memset(&rf,0,sizeof(rf));
|
||||||
@@ -278,7 +361,6 @@ int pnf_param_resp_cb(nfapi_vnf_config_t *config, int p5_idx, nfapi_pnf_param_re
|
|||||||
printf("[VNF] (RF:%d) rf_config_idx:%d\n", i, resp->pnf_rf.rf[i].rf_config_index);
|
printf("[VNF] (RF:%d) rf_config_idx:%d\n", i, resp->pnf_rf.rf[i].rf_config_index);
|
||||||
pnf->rfs[0] = rf;
|
pnf->rfs[0] = rf;
|
||||||
}
|
}
|
||||||
|
|
||||||
nfapi_pnf_config_request_t req;
|
nfapi_pnf_config_request_t req;
|
||||||
memset(&req, 0, sizeof(req));
|
memset(&req, 0, sizeof(req));
|
||||||
req.header.message_id = NFAPI_PNF_CONFIG_REQUEST;
|
req.header.message_id = NFAPI_PNF_CONFIG_REQUEST;
|
||||||
@@ -296,6 +378,31 @@ int pnf_param_resp_cb(nfapi_vnf_config_t *config, int p5_idx, nfapi_pnf_param_re
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int pnf_nr_config_resp_cb(nfapi_vnf_config_t *config, int p5_idx, nfapi_nr_pnf_config_response_t *resp) {
|
||||||
|
printf("[VNF] pnf config response idx:%d resp[header[phy_id:%u message_id:%02x message_length:%u]]\n", p5_idx, resp->header.phy_id, resp->header.message_id, resp->header.message_length);
|
||||||
|
|
||||||
|
if(1) {
|
||||||
|
nfapi_nr_pnf_start_request_t req;
|
||||||
|
memset(&req, 0, sizeof(req));
|
||||||
|
req.header.phy_id = resp->header.phy_id;
|
||||||
|
req.header.message_id = NFAPI_PNF_START_REQUEST;
|
||||||
|
nfapi_nr_vnf_pnf_start_req(config, p5_idx, &req);
|
||||||
|
} else {
|
||||||
|
// Rather than send the pnf_start_request we will demonstrate
|
||||||
|
// sending a vendor extention message. The start request will be
|
||||||
|
// send when the vendor extension response is received
|
||||||
|
//vnf_info* vnf = (vnf_info*)(config->user_data);
|
||||||
|
vendor_ext_p5_req req;
|
||||||
|
memset(&req, 0, sizeof(req));
|
||||||
|
req.header.message_id = P5_VENDOR_EXT_REQ;
|
||||||
|
req.dummy1 = 45;
|
||||||
|
req.dummy2 = 1977;
|
||||||
|
nfapi_vnf_vendor_extension(config, p5_idx, &req.header);
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
int pnf_config_resp_cb(nfapi_vnf_config_t *config, int p5_idx, nfapi_pnf_config_response_t *resp) {
|
int pnf_config_resp_cb(nfapi_vnf_config_t *config, int p5_idx, nfapi_pnf_config_response_t *resp) {
|
||||||
printf("[VNF] pnf config response idx:%d resp[header[phy_id:%u message_id:%02x message_length:%u]]\n", p5_idx, resp->header.phy_id, resp->header.message_id, resp->header.message_length);
|
printf("[VNF] pnf config response idx:%d resp[header[phy_id:%u message_id:%02x message_length:%u]]\n", p5_idx, resp->header.phy_id, resp->header.message_id, resp->header.message_length);
|
||||||
|
|
||||||
@@ -321,6 +428,70 @@ int pnf_config_resp_cb(nfapi_vnf_config_t *config, int p5_idx, nfapi_pnf_config_
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int wake_gNB_rxtx(PHY_VARS_gNB *gNB, uint16_t sfn, uint16_t slot) {
|
||||||
|
struct timespec curr_t;
|
||||||
|
clock_gettime(CLOCK_MONOTONIC,&curr_t);
|
||||||
|
//printf("\n wake_gNB_rxtx before assignment sfn:%d slot:%d TIME %d.%d",sfn,slot,curr_t.tv_sec,curr_t.tv_nsec);
|
||||||
|
gNB_L1_proc_t *proc=&gNB->proc;
|
||||||
|
gNB_L1_rxtx_proc_t *L1_proc= (slot&1)? &proc->L1_proc : &proc->L1_proc_tx;
|
||||||
|
|
||||||
|
NR_DL_FRAME_PARMS *fp = &gNB->frame_parms;
|
||||||
|
//printf("%s(eNB:%p, sfn:%d, sf:%d)\n", __FUNCTION__, eNB, sfn, sf);
|
||||||
|
//int i;
|
||||||
|
struct timespec wait;
|
||||||
|
clock_gettime(CLOCK_REALTIME, &wait);
|
||||||
|
wait.tv_sec = 0;
|
||||||
|
wait.tv_nsec +=5000L;
|
||||||
|
//wait.tv_nsec = 0;
|
||||||
|
// wake up TX for subframe n+sf_ahead
|
||||||
|
// lock the TX mutex and make sure the thread is ready
|
||||||
|
if (pthread_mutex_timedlock(&L1_proc->mutex,&wait) != 0) {
|
||||||
|
LOG_E( PHY, "[gNB] ERROR pthread_mutex_lock for gNB RXTX thread %d (IC %d)\n", L1_proc->slot_rx&1,L1_proc->instance_cnt );
|
||||||
|
exit_fun( "error locking mutex_rxtx" );
|
||||||
|
return(-1);
|
||||||
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
static uint16_t old_slot = 0;
|
||||||
|
static uint16_t old_sfn = 0;
|
||||||
|
proc->slot_rx = old_slot;
|
||||||
|
proc->frame_rx = old_sfn;
|
||||||
|
// Try to be 1 frame back
|
||||||
|
old_slot = slot;
|
||||||
|
old_sfn = sfn;
|
||||||
|
//printf("\n wake_gNB_rxtx after assignment sfn:%d slot:%d",proc->frame_rx,proc->slot_rx);
|
||||||
|
if (old_slot == 0 && old_sfn % 100 == 0) LOG_W( PHY,"[gNB] sfn/slot:%d%d old_sfn/slot:%d%d proc[rx:%d%d]\n", sfn, slot, old_sfn, old_slot, proc->frame_rx, proc->slot_rx);
|
||||||
|
}
|
||||||
|
|
||||||
|
++L1_proc->instance_cnt;
|
||||||
|
//LOG_D( PHY,"[VNF-subframe_ind] sfn/sf:%d:%d proc[frame_rx:%d subframe_rx:%d] L1_proc->instance_cnt_rxtx:%d \n", sfn, sf, proc->frame_rx, proc->subframe_rx, L1_proc->instance_cnt_rxtx);
|
||||||
|
// We have just received and processed the common part of a subframe, say n.
|
||||||
|
// TS_rx is the last received timestamp (start of 1st slot), TS_tx is the desired
|
||||||
|
// transmitted timestamp of the next TX slot (first).
|
||||||
|
// The last (TS_rx mod samples_per_frame) was n*samples_per_tti,
|
||||||
|
// we want to generate subframe (n+N), so TS_tx = TX_rx+N*samples_per_tti,
|
||||||
|
// and proc->subframe_tx = proc->subframe_rx+sf_ahead
|
||||||
|
L1_proc->timestamp_tx = proc->timestamp_rx + (slot_ahead *fp->samples_per_subframe);
|
||||||
|
L1_proc->frame_rx = proc->frame_rx;
|
||||||
|
L1_proc->slot_rx = proc->slot_rx;
|
||||||
|
L1_proc->frame_tx = (L1_proc->slot_rx > (19-slot_ahead)) ? (L1_proc->frame_rx+1)&1023 : L1_proc->frame_rx;
|
||||||
|
L1_proc->slot_tx = (L1_proc->slot_rx + slot_ahead)%20;
|
||||||
|
|
||||||
|
//LOG_I(PHY, "sfn/sf:%d%d proc[rx:%d%d] rx:%d%d] About to wake rxtx thread\n\n", sfn, slot, proc->frame_rx, proc->slot_rx, L1_proc->frame_rx, L1_proc->slot_rx);
|
||||||
|
//printf("\nEntering wake_gNB_rxtx sfn %d slot %d\n",L1_proc->frame_rx,L1_proc->slot_rx);
|
||||||
|
// the thread can now be woken up
|
||||||
|
if (pthread_cond_signal(&L1_proc->cond) != 0) {
|
||||||
|
LOG_E( PHY, "[gNB] ERROR pthread_cond_signal for gNB RXn-TXnp4 thread\n");
|
||||||
|
exit_fun( "ERROR pthread_clond_signal" );
|
||||||
|
return(-1);
|
||||||
|
}
|
||||||
|
|
||||||
|
//LOG_D(PHY,"%s() About to attempt pthread_mutex_unlock\n", __FUNCTION__);
|
||||||
|
pthread_mutex_unlock( &L1_proc->mutex );
|
||||||
|
//LOG_D(PHY,"%s() UNLOCKED pthread_mutex_unlock\n", __FUNCTION__);
|
||||||
|
return(0);
|
||||||
|
}
|
||||||
|
|
||||||
int wake_eNB_rxtx(PHY_VARS_eNB *eNB, uint16_t sfn, uint16_t sf) {
|
int wake_eNB_rxtx(PHY_VARS_eNB *eNB, uint16_t sfn, uint16_t sf) {
|
||||||
L1_proc_t *proc=&eNB->proc;
|
L1_proc_t *proc=&eNB->proc;
|
||||||
L1_rxtx_proc_t *L1_proc= (sf&1)? &proc->L1_proc : &proc->L1_proc_tx;
|
L1_rxtx_proc_t *L1_proc= (sf&1)? &proc->L1_proc : &proc->L1_proc_tx;
|
||||||
@@ -416,6 +587,7 @@ int phy_sync_indication(struct nfapi_vnf_p7_config *config, uint8_t sync) {
|
|||||||
printf("[VNF] SYNC %s\n", sync==1 ? "ACHIEVED" : "LOST");
|
printf("[VNF] SYNC %s\n", sync==1 ? "ACHIEVED" : "LOST");
|
||||||
|
|
||||||
if (sync==1 && nfapi_sync_var!=0) {
|
if (sync==1 && nfapi_sync_var!=0) {
|
||||||
|
|
||||||
printf("[VNF] Signal to OAI main code that it can go\n");
|
printf("[VNF] Signal to OAI main code that it can go\n");
|
||||||
pthread_mutex_lock(&nfapi_sync_mutex);
|
pthread_mutex_lock(&nfapi_sync_mutex);
|
||||||
nfapi_sync_var=0;
|
nfapi_sync_var=0;
|
||||||
@@ -426,6 +598,29 @@ int phy_sync_indication(struct nfapi_vnf_p7_config *config, uint8_t sync) {
|
|||||||
return(0);
|
return(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int phy_slot_indication(struct nfapi_vnf_p7_config *config, uint16_t phy_id, uint16_t sfn, uint16_t slot) {
|
||||||
|
static uint8_t first_time = 1;
|
||||||
|
|
||||||
|
if (first_time) {
|
||||||
|
printf("[VNF] slot indication %d\n", NFAPI_SFNSLOT2DEC(sfn, slot));
|
||||||
|
first_time = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (RC.gNB && RC.gNB[0]->configured) {
|
||||||
|
// uint16_t sfn = NFAPI_SFNSF2SFN(sfn_sf);
|
||||||
|
// uint16_t sf = NFAPI_SFNSF2SF(sfn_sf);
|
||||||
|
LOG_D(PHY,"[VNF] slot indication sfn:%d sf:%d\n", sfn, slot);
|
||||||
|
wake_gNB_rxtx(RC.gNB[0], sfn, slot); // DONE: find NR equivalent
|
||||||
|
} else {
|
||||||
|
printf("[VNF] %s() RC.gNB:%p\n", __FUNCTION__, RC.gNB);
|
||||||
|
|
||||||
|
if (RC.gNB) printf("RC.gNB[0]->configured:%d\n", RC.gNB[0]->configured);
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
int phy_subframe_indication(struct nfapi_vnf_p7_config *config, uint16_t phy_id, uint16_t sfn_sf) {
|
int phy_subframe_indication(struct nfapi_vnf_p7_config *config, uint16_t phy_id, uint16_t sfn_sf) {
|
||||||
static uint8_t first_time = 1;
|
static uint8_t first_time = 1;
|
||||||
|
|
||||||
@@ -937,6 +1132,14 @@ int vnf_pack_p4_p5_vendor_extension(nfapi_p4_p5_message_header_t *header, uint8_
|
|||||||
static pthread_t vnf_start_pthread;
|
static pthread_t vnf_start_pthread;
|
||||||
static pthread_t vnf_p7_start_pthread;
|
static pthread_t vnf_p7_start_pthread;
|
||||||
|
|
||||||
|
void *vnf_nr_p7_start_thread(void *ptr) {
|
||||||
|
printf("%s()\n", __FUNCTION__);
|
||||||
|
pthread_setname_np(pthread_self(), "VNF_P7");
|
||||||
|
nfapi_vnf_p7_config_t *config = (nfapi_vnf_p7_config_t *)ptr;
|
||||||
|
nfapi_nr_vnf_p7_start(config);
|
||||||
|
return config;
|
||||||
|
}
|
||||||
|
|
||||||
void *vnf_p7_start_thread(void *ptr) {
|
void *vnf_p7_start_thread(void *ptr) {
|
||||||
printf("%s()\n", __FUNCTION__);
|
printf("%s()\n", __FUNCTION__);
|
||||||
pthread_setname_np(pthread_self(), "VNF_P7");
|
pthread_setname_np(pthread_self(), "VNF_P7");
|
||||||
@@ -947,12 +1150,13 @@ void *vnf_p7_start_thread(void *ptr) {
|
|||||||
|
|
||||||
void set_thread_priority(int priority);
|
void set_thread_priority(int priority);
|
||||||
|
|
||||||
void *vnf_p7_thread_start(void *ptr) {
|
void *vnf_nr_p7_thread_start(void *ptr) {
|
||||||
set_thread_priority(79);
|
set_thread_priority(79);
|
||||||
vnf_p7_info *p7_vnf = (vnf_p7_info *)ptr;
|
vnf_p7_info *p7_vnf = (vnf_p7_info *)ptr;
|
||||||
p7_vnf->config->port = p7_vnf->local_port;
|
p7_vnf->config->port = p7_vnf->local_port;
|
||||||
p7_vnf->config->sync_indication = &phy_sync_indication;
|
p7_vnf->config->sync_indication = &phy_sync_indication;
|
||||||
p7_vnf->config->subframe_indication = &phy_subframe_indication;
|
p7_vnf->config->slot_indication = &phy_slot_indication;
|
||||||
|
|
||||||
p7_vnf->config->harq_indication = &phy_harq_indication;
|
p7_vnf->config->harq_indication = &phy_harq_indication;
|
||||||
p7_vnf->config->crc_indication = &phy_crc_indication;
|
p7_vnf->config->crc_indication = &phy_crc_indication;
|
||||||
p7_vnf->config->rx_indication = &phy_rx_indication;
|
p7_vnf->config->rx_indication = &phy_rx_indication;
|
||||||
@@ -977,11 +1181,72 @@ void *vnf_p7_thread_start(void *ptr) {
|
|||||||
p7_vnf->config->codec_config.deallocate = &vnf_deallocate;
|
p7_vnf->config->codec_config.deallocate = &vnf_deallocate;
|
||||||
p7_vnf->config->allocate_p7_vendor_ext = &phy_allocate_p7_vendor_ext;
|
p7_vnf->config->allocate_p7_vendor_ext = &phy_allocate_p7_vendor_ext;
|
||||||
p7_vnf->config->deallocate_p7_vendor_ext = &phy_deallocate_p7_vendor_ext;
|
p7_vnf->config->deallocate_p7_vendor_ext = &phy_deallocate_p7_vendor_ext;
|
||||||
NFAPI_TRACE(NFAPI_TRACE_INFO, "[VNF] Creating VNF NFAPI start thread %s\n", __FUNCTION__);
|
NFAPI_TRACE(NFAPI_TRACE_INFO, "[VNF] Creating VNF NFAPI P7 start thread %s\n", __FUNCTION__);
|
||||||
|
pthread_create(&vnf_p7_start_pthread, NULL, &vnf_nr_p7_start_thread, p7_vnf->config);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
void *vnf_p7_thread_start(void *ptr) {
|
||||||
|
set_thread_priority(79);
|
||||||
|
vnf_p7_info *p7_vnf = (vnf_p7_info *)ptr;
|
||||||
|
p7_vnf->config->port = p7_vnf->local_port;
|
||||||
|
p7_vnf->config->sync_indication = &phy_sync_indication;
|
||||||
|
p7_vnf->config->subframe_indication = &phy_subframe_indication;
|
||||||
|
p7_vnf->config->slot_indication = &phy_slot_indication;
|
||||||
|
|
||||||
|
p7_vnf->config->harq_indication = &phy_harq_indication;
|
||||||
|
p7_vnf->config->crc_indication = &phy_crc_indication;
|
||||||
|
p7_vnf->config->rx_indication = &phy_rx_indication;
|
||||||
|
p7_vnf->config->rach_indication = &phy_rach_indication;
|
||||||
|
p7_vnf->config->srs_indication = &phy_srs_indication;
|
||||||
|
p7_vnf->config->sr_indication = &phy_sr_indication;
|
||||||
|
p7_vnf->config->cqi_indication = &phy_cqi_indication;
|
||||||
|
p7_vnf->config->lbt_dl_indication = &phy_lbt_dl_indication;
|
||||||
|
p7_vnf->config->nb_harq_indication = &phy_nb_harq_indication;
|
||||||
|
p7_vnf->config->nrach_indication = &phy_nrach_indication;
|
||||||
|
p7_vnf->config->malloc = &vnf_allocate;
|
||||||
|
p7_vnf->config->free = &vnf_deallocate;
|
||||||
|
p7_vnf->config->trace = &vnf_trace;
|
||||||
|
p7_vnf->config->vendor_ext = &phy_vendor_ext;
|
||||||
|
p7_vnf->config->user_data = p7_vnf;
|
||||||
|
p7_vnf->mac->user_data = p7_vnf;
|
||||||
|
p7_vnf->config->codec_config.unpack_p7_vendor_extension = &phy_unpack_p7_vendor_extension;
|
||||||
|
p7_vnf->config->codec_config.pack_p7_vendor_extension = &phy_pack_p7_vendor_extension;
|
||||||
|
p7_vnf->config->codec_config.unpack_vendor_extension_tlv = &phy_unpack_vendor_extension_tlv;
|
||||||
|
p7_vnf->config->codec_config.pack_vendor_extension_tlv = &phy_pack_vendor_extension_tlv;
|
||||||
|
p7_vnf->config->codec_config.allocate = &vnf_allocate;
|
||||||
|
p7_vnf->config->codec_config.deallocate = &vnf_deallocate;
|
||||||
|
p7_vnf->config->allocate_p7_vendor_ext = &phy_allocate_p7_vendor_ext;
|
||||||
|
p7_vnf->config->deallocate_p7_vendor_ext = &phy_deallocate_p7_vendor_ext;
|
||||||
|
NFAPI_TRACE(NFAPI_TRACE_INFO, "[VNF] Creating VNF NFAPI P7 start thread %s\n", __FUNCTION__);
|
||||||
pthread_create(&vnf_p7_start_pthread, NULL, &vnf_p7_start_thread, p7_vnf->config);
|
pthread_create(&vnf_p7_start_pthread, NULL, &vnf_p7_start_thread, p7_vnf->config);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int pnf_nr_start_resp_cb(nfapi_vnf_config_t *config, int p5_idx, nfapi_nr_pnf_start_response_t *resp) {
|
||||||
|
vnf_info *vnf = (vnf_info *)(config->user_data);
|
||||||
|
vnf_p7_info *p7_vnf = vnf->p7_vnfs;
|
||||||
|
pnf_info *pnf = vnf->pnfs;
|
||||||
|
nfapi_nr_param_request_scf_t req;
|
||||||
|
printf("[VNF] pnf start response idx:%d config:%p user_data:%p p7_vnf[config:%p thread_started:%d]\n", p5_idx, config, config->user_data, vnf->p7_vnfs[0].config, vnf->p7_vnfs[0].thread_started);
|
||||||
|
|
||||||
|
if(p7_vnf->thread_started == 0) {
|
||||||
|
pthread_t vnf_p7_thread;
|
||||||
|
pthread_create(&vnf_p7_thread, NULL, &vnf_nr_p7_thread_start, p7_vnf);
|
||||||
|
p7_vnf->thread_started = 1;
|
||||||
|
} else {
|
||||||
|
// P7 thread already running.
|
||||||
|
}
|
||||||
|
|
||||||
|
// start all the phys in the pnf.
|
||||||
|
printf("[VNF] Sending NFAPI_VNF_PARAM_REQUEST phy_id:%d\n", pnf->phys[0].id);
|
||||||
|
memset(&req, 0, sizeof(req));
|
||||||
|
req.header.message_id = NFAPI_NR_PHY_MSG_TYPE_PARAM_REQUEST;
|
||||||
|
req.header.phy_id = pnf->phys[0].id;
|
||||||
|
nfapi_nr_vnf_param_req(config, p5_idx, &req);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
int pnf_start_resp_cb(nfapi_vnf_config_t *config, int p5_idx, nfapi_pnf_start_response_t *resp) {
|
int pnf_start_resp_cb(nfapi_vnf_config_t *config, int p5_idx, nfapi_pnf_start_response_t *resp) {
|
||||||
vnf_info *vnf = (vnf_info *)(config->user_data);
|
vnf_info *vnf = (vnf_info *)(config->user_data);
|
||||||
vnf_p7_info *p7_vnf = vnf->p7_vnfs;
|
vnf_p7_info *p7_vnf = vnf->p7_vnfs;
|
||||||
@@ -998,7 +1263,7 @@ int pnf_start_resp_cb(nfapi_vnf_config_t *config, int p5_idx, nfapi_pnf_start_re
|
|||||||
}
|
}
|
||||||
|
|
||||||
// start all the phys in the pnf.
|
// start all the phys in the pnf.
|
||||||
printf("[VNF] Sending NFAPI_PARAM_REQUEST phy_id:%d\n", pnf->phys[0].id);
|
printf("[VNF] Sending NFAPI_VNF_PARAM_REQUEST phy_id:%d\n", pnf->phys[0].id);
|
||||||
memset(&req, 0, sizeof(req));
|
memset(&req, 0, sizeof(req));
|
||||||
req.header.message_id = NFAPI_PARAM_REQUEST;
|
req.header.message_id = NFAPI_PARAM_REQUEST;
|
||||||
req.header.phy_id = pnf->phys[0].id;
|
req.header.phy_id = pnf->phys[0].id;
|
||||||
@@ -1008,6 +1273,69 @@ int pnf_start_resp_cb(nfapi_vnf_config_t *config, int p5_idx, nfapi_pnf_start_re
|
|||||||
|
|
||||||
extern uint32_t to_earfcn(int eutra_bandP,uint32_t dl_CarrierFreq,uint32_t bw);
|
extern uint32_t to_earfcn(int eutra_bandP,uint32_t dl_CarrierFreq,uint32_t bw);
|
||||||
|
|
||||||
|
int nr_param_resp_cb(nfapi_vnf_config_t *config, int p5_idx, nfapi_nr_param_response_scf_t *resp) {
|
||||||
|
|
||||||
|
printf("[VNF] Received NFAPI_PARAM_RESP idx:%d phy_id:%d\n", p5_idx, resp->header.phy_id);
|
||||||
|
vnf_info *vnf = (vnf_info *)(config->user_data);
|
||||||
|
vnf_p7_info *p7_vnf = vnf->p7_vnfs;
|
||||||
|
pnf_info *pnf = vnf->pnfs;
|
||||||
|
phy_info *phy = pnf->phys;
|
||||||
|
struct sockaddr_in pnf_p7_sockaddr;
|
||||||
|
nfapi_nr_config_request_scf_t *req = &RC.nrmac[0]->config[0]; // check
|
||||||
|
phy->remote_port = 32123;//resp->nfapi_config.p7_pnf_port.value;
|
||||||
|
memcpy(&pnf_p7_sockaddr.sin_addr.s_addr, &(resp->nfapi_config.p7_pnf_address_ipv4.address[0]), 4);
|
||||||
|
phy->remote_addr = inet_ntoa(pnf_p7_sockaddr.sin_addr);
|
||||||
|
// for now just 1
|
||||||
|
printf("[VNF] %d.%d pnf p7 %s:%d timing %u %u %u %u\n", p5_idx, phy->id, phy->remote_addr, phy->remote_port, p7_vnf->timing_window, p7_vnf->periodic_timing_period, p7_vnf->aperiodic_timing_enabled,
|
||||||
|
p7_vnf->periodic_timing_period);
|
||||||
|
req->header.message_id = NFAPI_NR_PHY_MSG_TYPE_CONFIG_REQUEST;
|
||||||
|
req->header.phy_id = phy->id;
|
||||||
|
printf("[VNF] Send NFAPI_CONFIG_REQUEST\n");
|
||||||
|
//printf("\n NR bandP =%d\n",req->nfapi_config.rf_bands.rf_band[0]);
|
||||||
|
|
||||||
|
req->nfapi_config.p7_vnf_port.tl.tag = NFAPI_NR_NFAPI_P7_VNF_PORT_TAG;
|
||||||
|
req->nfapi_config.p7_vnf_port.value = p7_vnf->local_port;
|
||||||
|
req->num_tlv++;
|
||||||
|
printf("[VNF] DJP local_port:%d\n", p7_vnf->local_port);
|
||||||
|
req->nfapi_config.p7_vnf_address_ipv4.tl.tag = NFAPI_NR_NFAPI_P7_VNF_ADDRESS_IPV4_TAG;
|
||||||
|
struct sockaddr_in vnf_p7_sockaddr;
|
||||||
|
vnf_p7_sockaddr.sin_addr.s_addr = inet_addr(p7_vnf->local_addr);
|
||||||
|
memcpy(&(req->nfapi_config.p7_vnf_address_ipv4.address[0]), &vnf_p7_sockaddr.sin_addr.s_addr, 4);
|
||||||
|
req->num_tlv++;
|
||||||
|
printf("[VNF] DJP local_addr:%s\n", p7_vnf->local_addr);
|
||||||
|
req->nfapi_config.timing_window.tl.tag = NFAPI_NR_NFAPI_TIMING_WINDOW_TAG;
|
||||||
|
req->nfapi_config.timing_window.value = p7_vnf->timing_window;
|
||||||
|
printf("\n[VNF]Timing window tag : %d Timing window:%u\n",NFAPI_NR_NFAPI_TIMING_WINDOW_TAG, p7_vnf->timing_window);
|
||||||
|
req->num_tlv++;
|
||||||
|
|
||||||
|
if(p7_vnf->periodic_timing_enabled || p7_vnf->aperiodic_timing_enabled) {
|
||||||
|
req->nfapi_config.timing_info_mode.tl.tag = NFAPI_NR_NFAPI_TIMING_INFO_MODE_TAG;
|
||||||
|
req->nfapi_config.timing_info_mode.value = (p7_vnf->aperiodic_timing_enabled << 1) | (p7_vnf->periodic_timing_enabled);
|
||||||
|
req->num_tlv++;
|
||||||
|
|
||||||
|
if(p7_vnf->periodic_timing_enabled) {
|
||||||
|
req->nfapi_config.timing_info_period.tl.tag = NFAPI_NR_NFAPI_TIMING_INFO_PERIOD_TAG;
|
||||||
|
req->nfapi_config.timing_info_period.value = p7_vnf->periodic_timing_period;
|
||||||
|
req->num_tlv++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
//TODO: Assign tag and value for P7 message offsets
|
||||||
|
req->nfapi_config.dl_tti_timing_offset.tl.tag = NFAPI_NR_NFAPI_DL_TTI_TIMING_OFFSET;
|
||||||
|
req->nfapi_config.ul_tti_timing_offset.tl.tag = NFAPI_NR_NFAPI_UL_TTI_TIMING_OFFSET;
|
||||||
|
req->nfapi_config.ul_dci_timing_offset.tl.tag = NFAPI_NR_NFAPI_UL_DCI_TIMING_OFFSET;
|
||||||
|
req->nfapi_config.tx_data_timing_offset.tl.tag = NFAPI_NR_NFAPI_TX_DATA_TIMING_OFFSET;
|
||||||
|
|
||||||
|
vendor_ext_tlv_2 ve2;
|
||||||
|
memset(&ve2, 0, sizeof(ve2));
|
||||||
|
ve2.tl.tag = VENDOR_EXT_TLV_2_TAG;
|
||||||
|
ve2.dummy = 2016;
|
||||||
|
req->vendor_extension = &ve2.tl;
|
||||||
|
nfapi_nr_vnf_config_req(config, p5_idx, req);
|
||||||
|
printf("[VNF] Sent NFAPI_VNF_CONFIG_REQ num_tlv:%u\n",req->num_tlv);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
int param_resp_cb(nfapi_vnf_config_t *config, int p5_idx, nfapi_param_response_t *resp) {
|
int param_resp_cb(nfapi_vnf_config_t *config, int p5_idx, nfapi_param_response_t *resp) {
|
||||||
printf("[VNF] Received NFAPI_PARAM_RESP idx:%d phy_id:%d\n", p5_idx, resp->header.phy_id);
|
printf("[VNF] Received NFAPI_PARAM_RESP idx:%d phy_id:%d\n", p5_idx, resp->header.phy_id);
|
||||||
vnf_info *vnf = (vnf_info *)(config->user_data);
|
vnf_info *vnf = (vnf_info *)(config->user_data);
|
||||||
@@ -1016,7 +1344,7 @@ int param_resp_cb(nfapi_vnf_config_t *config, int p5_idx, nfapi_param_response_t
|
|||||||
phy_info *phy = pnf->phys;
|
phy_info *phy = pnf->phys;
|
||||||
struct sockaddr_in pnf_p7_sockaddr;
|
struct sockaddr_in pnf_p7_sockaddr;
|
||||||
nfapi_config_request_t *req = &RC.mac[0]->config[0];
|
nfapi_config_request_t *req = &RC.mac[0]->config[0];
|
||||||
phy->remote_port = resp->nfapi_config.p7_pnf_port.value;
|
phy->remote_port = 32123;//resp->nfapi_config.p7_pnf_port.value;
|
||||||
memcpy(&pnf_p7_sockaddr.sin_addr.s_addr, &(resp->nfapi_config.p7_pnf_address_ipv4.address[0]), 4);
|
memcpy(&pnf_p7_sockaddr.sin_addr.s_addr, &(resp->nfapi_config.p7_pnf_address_ipv4.address[0]), 4);
|
||||||
phy->remote_addr = inet_ntoa(pnf_p7_sockaddr.sin_addr);
|
phy->remote_addr = inet_ntoa(pnf_p7_sockaddr.sin_addr);
|
||||||
// for now just 1
|
// for now just 1
|
||||||
@@ -1062,6 +1390,19 @@ int param_resp_cb(nfapi_vnf_config_t *config, int p5_idx, nfapi_param_response_t
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int nr_config_resp_cb(nfapi_vnf_config_t *config, int p5_idx, nfapi_nr_config_response_scf_t *resp) {
|
||||||
|
nfapi_nr_start_request_scf_t req;
|
||||||
|
printf("[VNF] Received NFAPI_CONFIG_RESP idx:%d phy_id:%d\n", p5_idx, resp->header.phy_id);
|
||||||
|
printf("[VNF] Calling oai_enb_init()\n");
|
||||||
|
oai_enb_init(); // TODO: change to gnb
|
||||||
|
memset(&req, 0, sizeof(req));
|
||||||
|
req.header.message_id = NFAPI_NR_PHY_MSG_TYPE_START_REQUEST;
|
||||||
|
req.header.phy_id = resp->header.phy_id;
|
||||||
|
nfapi_nr_vnf_start_req(config, p5_idx, &req);
|
||||||
|
printf("[VNF] Send NFAPI_VNF_START_REQUEST idx:%d phy_id:%d\n", p5_idx, resp->header.phy_id);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
int config_resp_cb(nfapi_vnf_config_t *config, int p5_idx, nfapi_config_response_t *resp) {
|
int config_resp_cb(nfapi_vnf_config_t *config, int p5_idx, nfapi_config_response_t *resp) {
|
||||||
nfapi_start_request_t req;
|
nfapi_start_request_t req;
|
||||||
printf("[VNF] Received NFAPI_CONFIG_RESP idx:%d phy_id:%d\n", p5_idx, resp->header.phy_id);
|
printf("[VNF] Received NFAPI_CONFIG_RESP idx:%d phy_id:%d\n", p5_idx, resp->header.phy_id);
|
||||||
@@ -1085,6 +1426,17 @@ int start_resp_cb(nfapi_vnf_config_t *config, int p5_idx, nfapi_start_response_t
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int nr_start_resp_cb(nfapi_vnf_config_t *config, int p5_idx, nfapi_nr_start_response_scf_t *resp) {
|
||||||
|
printf("[VNF] Received NFAPI_START_RESP idx:%d phy_id:%d\n", p5_idx, resp->header.phy_id);
|
||||||
|
vnf_info *vnf = (vnf_info *)(config->user_data);
|
||||||
|
pnf_info *pnf = vnf->pnfs;
|
||||||
|
phy_info *phy = pnf->phys;
|
||||||
|
vnf_p7_info *p7_vnf = vnf->p7_vnfs;
|
||||||
|
|
||||||
|
nfapi_vnf_p7_add_pnf((p7_vnf->config), phy->remote_addr, phy->remote_port, phy->id);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
int vendor_ext_cb(nfapi_vnf_config_t *config, int p5_idx, nfapi_p4_p5_message_header_t *msg) {
|
int vendor_ext_cb(nfapi_vnf_config_t *config, int p5_idx, nfapi_p4_p5_message_header_t *msg) {
|
||||||
printf("[VNF] %s\n", __FUNCTION__);
|
printf("[VNF] %s\n", __FUNCTION__);
|
||||||
|
|
||||||
@@ -1129,6 +1481,13 @@ void vnf_deallocate_p4_p5_vendor_ext(nfapi_p4_p5_message_header_t *header) {
|
|||||||
|
|
||||||
nfapi_vnf_config_t *config = 0;
|
nfapi_vnf_config_t *config = 0;
|
||||||
|
|
||||||
|
void vnf_nr_start_thread(void *ptr) {
|
||||||
|
NFAPI_TRACE(NFAPI_TRACE_INFO, "[VNF] VNF NFAPI thread - nfapi_vnf_start()%s\n", __FUNCTION__);
|
||||||
|
pthread_setname_np(pthread_self(), "VNF");
|
||||||
|
config = (nfapi_vnf_config_t *)ptr;
|
||||||
|
nfapi_nr_vnf_start(config);
|
||||||
|
}
|
||||||
|
|
||||||
void vnf_start_thread(void *ptr) {
|
void vnf_start_thread(void *ptr) {
|
||||||
NFAPI_TRACE(NFAPI_TRACE_INFO, "[VNF] VNF NFAPI thread - nfapi_vnf_start()%s\n", __FUNCTION__);
|
NFAPI_TRACE(NFAPI_TRACE_INFO, "[VNF] VNF NFAPI thread - nfapi_vnf_start()%s\n", __FUNCTION__);
|
||||||
pthread_setname_np(pthread_self(), "VNF");
|
pthread_setname_np(pthread_self(), "VNF");
|
||||||
@@ -1138,7 +1497,57 @@ void vnf_start_thread(void *ptr) {
|
|||||||
|
|
||||||
static vnf_info vnf;
|
static vnf_info vnf;
|
||||||
|
|
||||||
/*------------------------------------------------------------------------------*/
|
void configure_nr_nfapi_vnf(char *vnf_addr, int vnf_p5_port) {
|
||||||
|
nfapi_setmode(NFAPI_MODE_VNF);
|
||||||
|
memset(&vnf, 0, sizeof(vnf));
|
||||||
|
memset(vnf.p7_vnfs, 0, sizeof(vnf.p7_vnfs));
|
||||||
|
vnf.p7_vnfs[0].timing_window = 32;
|
||||||
|
vnf.p7_vnfs[0].periodic_timing_enabled = 1;
|
||||||
|
vnf.p7_vnfs[0].aperiodic_timing_enabled = 0;
|
||||||
|
vnf.p7_vnfs[0].periodic_timing_period = 10;
|
||||||
|
vnf.p7_vnfs[0].config = nfapi_vnf_p7_config_create();
|
||||||
|
NFAPI_TRACE(NFAPI_TRACE_INFO, "[VNF] %s() vnf.p7_vnfs[0].config:%p VNF ADDRESS:%s:%d\n", __FUNCTION__, vnf.p7_vnfs[0].config, vnf_addr, vnf_p5_port);
|
||||||
|
strcpy(vnf.p7_vnfs[0].local_addr, vnf_addr);
|
||||||
|
//vnf.p7_vnfs[0].local_port = vnf.p7_vnfs[0].local_port; // 50001; // TODO: remove hardcode
|
||||||
|
vnf.p7_vnfs[0].local_port = 50011;
|
||||||
|
vnf.p7_vnfs[0].mac = (mac_t *)malloc(sizeof(mac_t));
|
||||||
|
nfapi_vnf_config_t *config = nfapi_vnf_config_create();
|
||||||
|
config->malloc = malloc;
|
||||||
|
config->free = free;
|
||||||
|
config->trace = &vnf_trace;
|
||||||
|
config->vnf_p5_port = vnf_p5_port;
|
||||||
|
config->vnf_ipv4 = 1;
|
||||||
|
config->vnf_ipv6 = 0;
|
||||||
|
config->pnf_list = 0;
|
||||||
|
config->phy_list = 0;
|
||||||
|
|
||||||
|
config->pnf_nr_connection_indication = &pnf_nr_connection_indication_cb;
|
||||||
|
config->pnf_disconnect_indication = &pnf_disconnection_indication_cb;
|
||||||
|
|
||||||
|
config->pnf_nr_param_resp = &pnf_nr_param_resp_cb;
|
||||||
|
config->pnf_nr_config_resp = &pnf_nr_config_resp_cb;
|
||||||
|
config->pnf_nr_start_resp = &pnf_nr_start_resp_cb;
|
||||||
|
config->nr_param_resp = &nr_param_resp_cb;
|
||||||
|
config->nr_config_resp = &nr_config_resp_cb;
|
||||||
|
config->nr_start_resp = &nr_start_resp_cb;
|
||||||
|
config->vendor_ext = &vendor_ext_cb;
|
||||||
|
config->user_data = &vnf;
|
||||||
|
// To allow custom vendor extentions to be added to nfapi
|
||||||
|
config->codec_config.unpack_vendor_extension_tlv = &vnf_unpack_vendor_extension_tlv;
|
||||||
|
config->codec_config.pack_vendor_extension_tlv = &vnf_pack_vendor_extension_tlv;
|
||||||
|
config->codec_config.unpack_p4_p5_vendor_extension = &vnf_unpack_p4_p5_vendor_extension;
|
||||||
|
config->codec_config.pack_p4_p5_vendor_extension = &vnf_pack_p4_p5_vendor_extension;
|
||||||
|
config->allocate_p4_p5_vendor_ext = &vnf_allocate_p4_p5_vendor_ext;
|
||||||
|
config->deallocate_p4_p5_vendor_ext = &vnf_deallocate_p4_p5_vendor_ext;
|
||||||
|
config->codec_config.allocate = &vnf_allocate;
|
||||||
|
config->codec_config.deallocate = &vnf_deallocate;
|
||||||
|
memset(&UL_RCC_INFO,0,sizeof(UL_RCC_IND_t));
|
||||||
|
NFAPI_TRACE(NFAPI_TRACE_INFO, "[VNF] Creating VNF NFAPI start thread %s\n", __FUNCTION__);
|
||||||
|
pthread_create(&vnf_start_pthread, NULL, (void *)&vnf_nr_start_thread, config);
|
||||||
|
NFAPI_TRACE(NFAPI_TRACE_INFO, "[VNF] Created VNF NFAPI start thread %s\n", __FUNCTION__);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
void configure_nfapi_vnf(char *vnf_addr, int vnf_p5_port) {
|
void configure_nfapi_vnf(char *vnf_addr, int vnf_p5_port) {
|
||||||
nfapi_setmode(NFAPI_MODE_VNF);
|
nfapi_setmode(NFAPI_MODE_VNF);
|
||||||
memset(&vnf, 0, sizeof(vnf));
|
memset(&vnf, 0, sizeof(vnf));
|
||||||
@@ -1150,7 +1559,8 @@ void configure_nfapi_vnf(char *vnf_addr, int vnf_p5_port) {
|
|||||||
vnf.p7_vnfs[0].config = nfapi_vnf_p7_config_create();
|
vnf.p7_vnfs[0].config = nfapi_vnf_p7_config_create();
|
||||||
NFAPI_TRACE(NFAPI_TRACE_INFO, "[VNF] %s() vnf.p7_vnfs[0].config:%p VNF ADDRESS:%s:%d\n", __FUNCTION__, vnf.p7_vnfs[0].config, vnf_addr, vnf_p5_port);
|
NFAPI_TRACE(NFAPI_TRACE_INFO, "[VNF] %s() vnf.p7_vnfs[0].config:%p VNF ADDRESS:%s:%d\n", __FUNCTION__, vnf.p7_vnfs[0].config, vnf_addr, vnf_p5_port);
|
||||||
strcpy(vnf.p7_vnfs[0].local_addr, vnf_addr);
|
strcpy(vnf.p7_vnfs[0].local_addr, vnf_addr);
|
||||||
vnf.p7_vnfs[0].local_port = 50001;
|
//vnf.p7_vnfs[0].local_port = vnf.p7_vnfs[0].local_port; // 50001; // TODO: remove hardcode
|
||||||
|
vnf.p7_vnfs[0].local_port = 50011;
|
||||||
vnf.p7_vnfs[0].mac = (mac_t *)malloc(sizeof(mac_t));
|
vnf.p7_vnfs[0].mac = (mac_t *)malloc(sizeof(mac_t));
|
||||||
nfapi_vnf_config_t *config = nfapi_vnf_config_create();
|
nfapi_vnf_config_t *config = nfapi_vnf_config_create();
|
||||||
config->malloc = malloc;
|
config->malloc = malloc;
|
||||||
@@ -1161,8 +1571,10 @@ void configure_nfapi_vnf(char *vnf_addr, int vnf_p5_port) {
|
|||||||
config->vnf_ipv6 = 0;
|
config->vnf_ipv6 = 0;
|
||||||
config->pnf_list = 0;
|
config->pnf_list = 0;
|
||||||
config->phy_list = 0;
|
config->phy_list = 0;
|
||||||
|
|
||||||
config->pnf_connection_indication = &pnf_connection_indication_cb;
|
config->pnf_connection_indication = &pnf_connection_indication_cb;
|
||||||
config->pnf_disconnect_indication = &pnf_disconnection_indication_cb;
|
config->pnf_disconnect_indication = &pnf_disconnection_indication_cb;
|
||||||
|
|
||||||
config->pnf_param_resp = &pnf_param_resp_cb;
|
config->pnf_param_resp = &pnf_param_resp_cb;
|
||||||
config->pnf_config_resp = &pnf_config_resp_cb;
|
config->pnf_config_resp = &pnf_config_resp_cb;
|
||||||
config->pnf_start_resp = &pnf_start_resp_cb;
|
config->pnf_start_resp = &pnf_start_resp_cb;
|
||||||
@@ -1203,15 +1615,17 @@ int oai_nfapi_dl_config_req(nfapi_dl_config_request_t *dl_config_req) {
|
|||||||
return retval;
|
return retval;
|
||||||
}
|
}
|
||||||
|
|
||||||
int oai_nfapi_nr_dl_config_req(nfapi_nr_dl_tti_request_t *dl_config_req)
|
int oai_nfapi_dl_tti_req(nfapi_nr_dl_tti_request_t *dl_config_req)
|
||||||
{
|
{
|
||||||
|
//LOG_I(PHY, "sfn:%d,slot:%d\n",dl_config_req->SFN,dl_config_req->Slot);
|
||||||
|
//printf("\nEntering oai_nfapi_nr_dl_config_req sfn:%d,slot:%d\n",dl_config_req->SFN,dl_config_req->Slot);
|
||||||
nfapi_vnf_p7_config_t *p7_config = vnf.p7_vnfs[0].config;
|
nfapi_vnf_p7_config_t *p7_config = vnf.p7_vnfs[0].config;
|
||||||
|
dl_config_req->header.message_id= NFAPI_NR_PHY_MSG_TYPE_DL_TTI_REQUEST;
|
||||||
dl_config_req->header.phy_id = 1; // DJP HACK TODO FIXME - need to pass this around!!!!
|
dl_config_req->header.phy_id = 1; // DJP HACK TODO FIXME - need to pass this around!!!!
|
||||||
|
|
||||||
int retval = nfapi_vnf_p7_nr_dl_config_req(p7_config, dl_config_req);
|
int retval = nfapi_vnf_p7_nr_dl_config_req(p7_config, dl_config_req);
|
||||||
|
|
||||||
dl_config_req->dl_tti_request_body.nPDUs = 0;
|
dl_config_req->dl_tti_request_body.nPDUs = 0;
|
||||||
dl_config_req->dl_tti_request_body.nGroup = 0;
|
dl_config_req->dl_tti_request_body.nGroup = 0;
|
||||||
|
|
||||||
|
|
||||||
@@ -1221,6 +1635,23 @@ int oai_nfapi_nr_dl_config_req(nfapi_nr_dl_tti_request_t *dl_config_req)
|
|||||||
return retval;
|
return retval;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int oai_nfapi_tx_data_req(nfapi_nr_tx_data_request_t *tx_data_req)
|
||||||
|
{
|
||||||
|
nfapi_vnf_p7_config_t *p7_config = vnf.p7_vnfs[0].config;
|
||||||
|
tx_data_req->header.phy_id = 1; // DJP HACK TODO FIXME - need to pass this around!!!!
|
||||||
|
tx_data_req->header.message_id = NFAPI_NR_PHY_MSG_TYPE_TX_DATA_REQUEST;
|
||||||
|
//LOG_D(PHY, "[VNF] %s() TX_REQ sfn_sf:%d number_of_pdus:%d\n", __FUNCTION__, NFAPI_SFNSF2DEC(tx_req->sfn_sf), tx_req->tx_request_body.number_of_pdus);
|
||||||
|
int retval = nfapi_vnf_p7_tx_data_req(p7_config, tx_data_req);
|
||||||
|
|
||||||
|
if (retval!=0) {
|
||||||
|
LOG_E(PHY, "%s() Problem sending retval:%d\n", __FUNCTION__, retval);
|
||||||
|
} else {
|
||||||
|
tx_data_req->Number_of_PDUs = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
return retval;
|
||||||
|
}
|
||||||
|
|
||||||
int oai_nfapi_tx_req(nfapi_tx_request_t *tx_req)
|
int oai_nfapi_tx_req(nfapi_tx_request_t *tx_req)
|
||||||
{
|
{
|
||||||
nfapi_vnf_p7_config_t *p7_config = vnf.p7_vnfs[0].config;
|
nfapi_vnf_p7_config_t *p7_config = vnf.p7_vnfs[0].config;
|
||||||
@@ -1238,6 +1669,22 @@ int oai_nfapi_tx_req(nfapi_tx_request_t *tx_req)
|
|||||||
return retval;
|
return retval;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int oai_nfapi_ul_dci_req(nfapi_nr_ul_dci_request_t *ul_dci_req) {
|
||||||
|
nfapi_vnf_p7_config_t *p7_config = vnf.p7_vnfs[0].config;
|
||||||
|
ul_dci_req->header.phy_id = 1; // DJP HACK TODO FIXME - need to pass this around!!!!
|
||||||
|
ul_dci_req->header.message_id = NFAPI_NR_PHY_MSG_TYPE_UL_DCI_REQUEST;
|
||||||
|
//LOG_D(PHY, "[VNF] %s() HI_DCI0_REQ sfn_sf:%d dci:%d hi:%d\n", __FUNCTION__, NFAPI_SFNSF2DEC(hi_dci0_req->sfn_sf), hi_dci0_req->hi_dci0_request_body.number_of_dci, hi_dci0_req->hi_dci0_request_body.number_of_hi);
|
||||||
|
int retval = nfapi_vnf_p7_ul_dci_req(p7_config, ul_dci_req);
|
||||||
|
|
||||||
|
if (retval!=0) {
|
||||||
|
LOG_E(PHY, "%s() Problem sending retval:%d\n", __FUNCTION__, retval);
|
||||||
|
} else {
|
||||||
|
ul_dci_req->numPdus = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
return retval;
|
||||||
|
}
|
||||||
|
|
||||||
int oai_nfapi_hi_dci0_req(nfapi_hi_dci0_request_t *hi_dci0_req) {
|
int oai_nfapi_hi_dci0_req(nfapi_hi_dci0_request_t *hi_dci0_req) {
|
||||||
nfapi_vnf_p7_config_t *p7_config = vnf.p7_vnfs[0].config;
|
nfapi_vnf_p7_config_t *p7_config = vnf.p7_vnfs[0].config;
|
||||||
hi_dci0_req->header.phy_id = 1; // DJP HACK TODO FIXME - need to pass this around!!!!
|
hi_dci0_req->header.phy_id = 1; // DJP HACK TODO FIXME - need to pass this around!!!!
|
||||||
@@ -1255,6 +1702,26 @@ int oai_nfapi_hi_dci0_req(nfapi_hi_dci0_request_t *hi_dci0_req) {
|
|||||||
return retval;
|
return retval;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int oai_nfapi_ul_tti_req(nfapi_nr_ul_tti_request_t *ul_tti_req) {
|
||||||
|
nfapi_vnf_p7_config_t *p7_config = vnf.p7_vnfs[0].config;
|
||||||
|
|
||||||
|
ul_tti_req->header.phy_id = 1; // DJP HACK TODO FIXME - need to pass this around!!!!
|
||||||
|
ul_tti_req->header.message_id = NFAPI_NR_PHY_MSG_TYPE_UL_TTI_REQUEST;
|
||||||
|
|
||||||
|
int retval = nfapi_vnf_p7_ul_tti_req(p7_config, ul_tti_req);
|
||||||
|
|
||||||
|
if (retval!=0) {
|
||||||
|
LOG_E(PHY, "%s() Problem sending retval:%d\n", __FUNCTION__, retval);
|
||||||
|
} else {
|
||||||
|
// Reset number of PDUs so that it is not resent
|
||||||
|
ul_tti_req->n_pdus = 0;
|
||||||
|
ul_tti_req->n_group = 0;
|
||||||
|
ul_tti_req->n_ulcch = 0;
|
||||||
|
ul_tti_req->n_ulsch = 0;
|
||||||
|
}
|
||||||
|
return retval;
|
||||||
|
}
|
||||||
|
|
||||||
int oai_nfapi_ul_config_req(nfapi_ul_config_request_t *ul_config_req) {
|
int oai_nfapi_ul_config_req(nfapi_ul_config_request_t *ul_config_req) {
|
||||||
nfapi_vnf_p7_config_t *p7_config = vnf.p7_vnfs[0].config;
|
nfapi_vnf_p7_config_t *p7_config = vnf.p7_vnfs[0].config;
|
||||||
ul_config_req->header.phy_id = 1; // DJP HACK TODO FIXME - need to pass this around!!!!
|
ul_config_req->header.phy_id = 1; // DJP HACK TODO FIXME - need to pass this around!!!!
|
||||||
|
|||||||
@@ -23,5 +23,5 @@
|
|||||||
#define NFAPI_VNF_H__
|
#define NFAPI_VNF_H__
|
||||||
|
|
||||||
void configure_nfapi_vnf(char *vnf_addr, int vnf_p5_port);
|
void configure_nfapi_vnf(char *vnf_addr, int vnf_p5_port);
|
||||||
|
void configure_nr_nfapi_vnf(char *vnf_addr, int vnf_p5_port);
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -972,7 +972,7 @@ typedef struct
|
|||||||
|
|
||||||
typedef struct
|
typedef struct
|
||||||
{
|
{
|
||||||
uint32_t ss_pbch_power;//SSB Block Power Value: TBD (-60..50 dBm)
|
int ss_pbch_power;//SSB Block Power Value: TBD (-60..50 dBm)
|
||||||
uint8_t bch_payload;//Defines option selected for generation of BCH payload, see Table 3-13 (v0.0.011 Value: 0: MAC generates the full PBCH payload 1: PHY generates the timing PBCH bits 2: PHY generates the full PBCH payload
|
uint8_t bch_payload;//Defines option selected for generation of BCH payload, see Table 3-13 (v0.0.011 Value: 0: MAC generates the full PBCH payload 1: PHY generates the timing PBCH bits 2: PHY generates the full PBCH payload
|
||||||
uint8_t scs_common;//subcarrierSpacing for common, used for initial access and broadcast message. [38.211 sec 4.2] Value:0->3
|
uint8_t scs_common;//subcarrierSpacing for common, used for initial access and broadcast message. [38.211 sec 4.2] Value:0->3
|
||||||
|
|
||||||
|
|||||||
@@ -120,6 +120,17 @@ typedef struct {
|
|||||||
} nfapi_tl_t;
|
} nfapi_tl_t;
|
||||||
#define NFAPI_TAG_LENGTH_PACKED_LEN 4
|
#define NFAPI_TAG_LENGTH_PACKED_LEN 4
|
||||||
|
|
||||||
|
// Convenience methods to convert between SFN/SLOT formats
|
||||||
|
#define NFAPI_SFNSLOT2DEC(_sfn,_slot) ( _sfn*20 + _slot ) // total count of slots
|
||||||
|
#define NFAPI_SFNSLOTDEC2SFNSLOT(_sfnslot_dec) ((((_sfnslot_dec) / 20) << 4) | (((_sfnslot_dec) - (((_sfnslot_dec) / 20) * 10)) & 0x3F))
|
||||||
|
|
||||||
|
#define NFAPI_SFNSLOT2SFN(_sfnslot) ((_sfnslot) >> 6)
|
||||||
|
#define NFAPI_SFNSLOT2SLOT(_sfnslot) ((_sfnslot) & 0x3F)
|
||||||
|
#define NFAPI_SFNSLOTDEC2SFN(_sfnslot_dec) ((_sfnslot_dec) / 20)
|
||||||
|
#define NFAPI_SFNSLOTDEC2SLOT(_sfnslot_dec) ((_sfnslot_dec) % 20)
|
||||||
|
|
||||||
|
#define NFAPI_MAX_SFNSLOTDEC 1024*20 // 20 is for numerology 1
|
||||||
|
|
||||||
// Convenience methods to convert between SFN/SFN formats
|
// Convenience methods to convert between SFN/SFN formats
|
||||||
#define NFAPI_SFNSF2DEC(_sfnsf) ((((_sfnsf) >> 4) * 10) + ((_sfnsf) & 0xF))
|
#define NFAPI_SFNSF2DEC(_sfnsf) ((((_sfnsf) >> 4) * 10) + ((_sfnsf) & 0xF))
|
||||||
#define NFAPI_SFNSFDEC2SFNSF(_sfnsf_dec) ((((_sfnsf_dec) / 10) << 4) | (((_sfnsf_dec) - (((_sfnsf_dec) / 10) * 10)) & 0xF))
|
#define NFAPI_SFNSFDEC2SFNSF(_sfnsf_dec) ((((_sfnsf_dec) / 10) << 4) | (((_sfnsf_dec) - (((_sfnsf_dec) / 10) * 10)) & 0xF))
|
||||||
@@ -176,7 +187,6 @@ typedef enum {
|
|||||||
NFAPI_DL_NODE_SYNC,
|
NFAPI_DL_NODE_SYNC,
|
||||||
NFAPI_TIMING_INFO,
|
NFAPI_TIMING_INFO,
|
||||||
|
|
||||||
|
|
||||||
NFAPI_RSSI_REQUEST = 0x0200,
|
NFAPI_RSSI_REQUEST = 0x0200,
|
||||||
NFAPI_RSSI_RESPONSE,
|
NFAPI_RSSI_RESPONSE,
|
||||||
NFAPI_RSSI_INDICATION,
|
NFAPI_RSSI_INDICATION,
|
||||||
@@ -587,6 +597,26 @@ typedef struct {
|
|||||||
#define NFAPI_PNF_PHY_RF_TAG 0x1003
|
#define NFAPI_PNF_PHY_RF_TAG 0x1003
|
||||||
|
|
||||||
// Generic strucutre for single tlv value.
|
// Generic strucutre for single tlv value.
|
||||||
|
typedef struct {
|
||||||
|
nfapi_tl_t tl;
|
||||||
|
int32_t value;
|
||||||
|
} nfapi_int32_tlv_t;
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
nfapi_tl_t tl;
|
||||||
|
uint32_t value;
|
||||||
|
} nfapi_uint32_tlv_t;
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
nfapi_tl_t tl;
|
||||||
|
int64_t value;
|
||||||
|
} nfapi_int64_tlv_t;
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
nfapi_tl_t tl;
|
||||||
|
uint64_t value;
|
||||||
|
} nfapi_uint64_tlv_t;
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
nfapi_tl_t tl;
|
nfapi_tl_t tl;
|
||||||
uint16_t value;
|
uint16_t value;
|
||||||
@@ -1106,6 +1136,7 @@ typedef struct {
|
|||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
nfapi_p4_p5_message_header_t header;
|
nfapi_p4_p5_message_header_t header;
|
||||||
|
uint8_t num_tlvs;
|
||||||
nfapi_pnf_phy_rf_config_t pnf_phy_rf_config;
|
nfapi_pnf_phy_rf_config_t pnf_phy_rf_config;
|
||||||
nfapi_vendor_extension_tlv_t vendor_extension;
|
nfapi_vendor_extension_tlv_t vendor_extension;
|
||||||
} nfapi_pnf_config_request_t;
|
} nfapi_pnf_config_request_t;
|
||||||
@@ -2466,7 +2497,7 @@ typedef struct {
|
|||||||
typedef struct {
|
typedef struct {
|
||||||
nfapi_p7_message_header_t header;
|
nfapi_p7_message_header_t header;
|
||||||
uint32_t t1;
|
uint32_t t1;
|
||||||
int32_t delta_sfn_sf;
|
int32_t delta_sfn_sf;
|
||||||
nfapi_vendor_extension_tlv_t vendor_extension;
|
nfapi_vendor_extension_tlv_t vendor_extension;
|
||||||
} nfapi_dl_node_sync_t;
|
} nfapi_dl_node_sync_t;
|
||||||
|
|
||||||
@@ -2481,22 +2512,50 @@ typedef struct {
|
|||||||
typedef struct {
|
typedef struct {
|
||||||
nfapi_p7_message_header_t header;
|
nfapi_p7_message_header_t header;
|
||||||
uint32_t last_sfn_sf;
|
uint32_t last_sfn_sf;
|
||||||
|
|
||||||
uint32_t time_since_last_timing_info;
|
uint32_t time_since_last_timing_info;
|
||||||
uint32_t dl_config_jitter;
|
uint32_t dl_config_jitter;
|
||||||
uint32_t tx_request_jitter;
|
uint32_t tx_request_jitter;
|
||||||
uint32_t ul_config_jitter;
|
uint32_t ul_config_jitter;
|
||||||
uint32_t hi_dci0_jitter;
|
uint32_t hi_dci0_jitter;
|
||||||
|
|
||||||
int32_t dl_config_latest_delay;
|
int32_t dl_config_latest_delay;
|
||||||
int32_t tx_request_latest_delay;
|
int32_t tx_request_latest_delay;
|
||||||
int32_t ul_config_latest_delay;
|
int32_t ul_config_latest_delay;
|
||||||
int32_t hi_dci0_latest_delay;
|
int32_t hi_dci0_latest_delay;
|
||||||
|
|
||||||
int32_t dl_config_earliest_arrival;
|
int32_t dl_config_earliest_arrival;
|
||||||
int32_t tx_request_earliest_arrival;
|
int32_t tx_request_earliest_arrival;
|
||||||
int32_t ul_config_earliest_arrival;
|
int32_t ul_config_earliest_arrival;
|
||||||
int32_t hi_dci0_earliest_arrival;
|
int32_t hi_dci0_earliest_arrival;
|
||||||
|
|
||||||
nfapi_vendor_extension_tlv_t vendor_extension;
|
nfapi_vendor_extension_tlv_t vendor_extension;
|
||||||
} nfapi_timing_info_t;
|
} nfapi_timing_info_t;
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
nfapi_p7_message_header_t header;
|
||||||
|
|
||||||
|
uint32_t last_sfn;
|
||||||
|
uint32_t last_slot;
|
||||||
|
uint32_t time_since_last_timing_info;
|
||||||
|
|
||||||
|
uint32_t dl_tti_jitter;
|
||||||
|
uint32_t tx_data_request_jitter;
|
||||||
|
uint32_t ul_tti_jitter;
|
||||||
|
uint32_t ul_dci_jitter;
|
||||||
|
|
||||||
|
int32_t dl_tti_latest_delay;
|
||||||
|
int32_t tx_data_request_latest_delay;
|
||||||
|
int32_t ul_tti_latest_delay;
|
||||||
|
int32_t ul_dci_latest_delay;
|
||||||
|
|
||||||
|
int32_t dl_tti_earliest_arrival;
|
||||||
|
int32_t tx_data_request_earliest_arrival;
|
||||||
|
int32_t ul_tti_earliest_arrival;
|
||||||
|
int32_t ul_dci_earliest_arrival;
|
||||||
|
nfapi_vendor_extension_tlv_t vendor_extension;
|
||||||
|
} nfapi_nr_timing_info_t;
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
nfapi_tl_t tl;
|
nfapi_tl_t tl;
|
||||||
uint32_t handle;
|
uint32_t handle;
|
||||||
@@ -3653,6 +3712,50 @@ typedef struct {
|
|||||||
nfapi_vendor_extension_tlv_t vendor_extension;
|
nfapi_vendor_extension_tlv_t vendor_extension;
|
||||||
} nfapi_nmm_stop_response_t;
|
} nfapi_nmm_stop_response_t;
|
||||||
|
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
// TODO: see if this needs to be uncommented
|
||||||
|
|
||||||
|
// These TLVs are used to setup the transport connection between VNF and PNF
|
||||||
|
nfapi_ipv4_address_t p7_vnf_address_ipv4;
|
||||||
|
nfapi_ipv6_address_t p7_vnf_address_ipv6;
|
||||||
|
nfapi_uint16_tlv_t p7_vnf_port;
|
||||||
|
|
||||||
|
nfapi_ipv4_address_t p7_pnf_address_ipv4;
|
||||||
|
nfapi_ipv6_address_t p7_pnf_address_ipv6;
|
||||||
|
nfapi_uint16_tlv_t p7_pnf_port;
|
||||||
|
|
||||||
|
nfapi_uint8_tlv_t timing_window; //Value: 0 → 30,000 microseconds
|
||||||
|
nfapi_uint8_tlv_t timing_info_mode;
|
||||||
|
nfapi_uint8_tlv_t timing_info_period;
|
||||||
|
|
||||||
|
nfapi_uint32_tlv_t dl_tti_timing_offset;
|
||||||
|
nfapi_uint32_tlv_t ul_tti_timing_offset;
|
||||||
|
nfapi_uint32_tlv_t ul_dci_timing_offset;
|
||||||
|
nfapi_uint32_tlv_t tx_data_timing_offset;
|
||||||
|
|
||||||
|
// These TLVs are used to setup the transport connection between VNF and PNF
|
||||||
|
/*
|
||||||
|
nfapi_uint8_tlv_t dl_ue_per_sf;
|
||||||
|
nfapi_uint8_tlv_t ul_ue_per_sf;
|
||||||
|
|
||||||
|
// These TLVs are used by PNF to report its RF capabilities to the VNF software
|
||||||
|
nfapi_rf_bands_t rf_bands;
|
||||||
|
*/
|
||||||
|
// These TLVs are used by the VNF to configure the synchronization with the PNF.
|
||||||
|
|
||||||
|
|
||||||
|
// These TLVs are used by the VNF to configure the RF in the PNF
|
||||||
|
//nfapi_uint16_tlv_t max_transmit_power;
|
||||||
|
//nfapi_uint32_tlv_t nrarfcn;
|
||||||
|
|
||||||
|
// nfapi_nmm_frequency_bands_t nmm_gsm_frequency_bands;
|
||||||
|
// nfapi_nmm_frequency_bands_t nmm_umts_frequency_bands;
|
||||||
|
// nfapi_nmm_frequency_bands_t nmm_lte_frequency_bands;
|
||||||
|
// nfapi_uint8_tlv_t nmm_uplink_rssi_supported;
|
||||||
|
|
||||||
|
} nfapi_nr_nfapi_t;
|
||||||
|
|
||||||
//
|
//
|
||||||
// Configuration options for the encode decode functions
|
// Configuration options for the encode decode functions
|
||||||
//
|
//
|
||||||
@@ -3864,6 +3967,7 @@ int nfapi_p4_message_unpack(void *pMessageBuf, uint32_t messageBufLen, void *pUn
|
|||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
int nfapi_p5_message_pack(void *pMessageBuf, uint32_t messageBufLen, void *pPackedBuf, uint32_t packedBufLen, nfapi_p4_p5_codec_config_t* config);
|
int nfapi_p5_message_pack(void *pMessageBuf, uint32_t messageBufLen, void *pPackedBuf, uint32_t packedBufLen, nfapi_p4_p5_codec_config_t* config);
|
||||||
|
int nfapi_nr_p5_message_pack(void *pMessageBuf, uint32_t messageBufLen, void *pPackedBuf, uint32_t packedBufLen, nfapi_p4_p5_codec_config_t* config);
|
||||||
|
|
||||||
/*! \brief Decodes an NFAPI P5 message header
|
/*! \brief Decodes an NFAPI P5 message header
|
||||||
* \param pMessageBuf A pointer to an encoded P5 message header
|
* \param pMessageBuf A pointer to an encoded P5 message header
|
||||||
@@ -3887,6 +3991,7 @@ int nfapi_p5_message_header_unpack(void *pMessageBuf, uint32_t messageBufLen, vo
|
|||||||
*
|
*
|
||||||
* The function will decode a byte stream pointed to by pMessageBuf into a nfapi p5 message structure pointer to by pUnpackedBuf
|
* The function will decode a byte stream pointed to by pMessageBuf into a nfapi p5 message structure pointer to by pUnpackedBuf
|
||||||
*/
|
*/
|
||||||
|
int nfapi_nr_p5_message_unpack(void *pMessageBuf, uint32_t messageBufLen, void *pUnpackedBuf, uint32_t unpackedBufLen, nfapi_p4_p5_codec_config_t* config);
|
||||||
int nfapi_p5_message_unpack(void *pMessageBuf, uint32_t messageBufLen, void *pUnpackedBuf, uint32_t unpackedBufLen, nfapi_p4_p5_codec_config_t* config);
|
int nfapi_p5_message_unpack(void *pMessageBuf, uint32_t messageBufLen, void *pUnpackedBuf, uint32_t unpackedBufLen, nfapi_p4_p5_codec_config_t* config);
|
||||||
|
|
||||||
/*! \brief Encodes an NFAPI P7 message to a buffer
|
/*! \brief Encodes an NFAPI P7 message to a buffer
|
||||||
@@ -3900,6 +4005,7 @@ int nfapi_p5_message_unpack(void *pMessageBuf, uint32_t messageBufLen, void *pUn
|
|||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
int nfapi_p7_message_pack(void *pMessageBuf, void *pPackedBuf, uint32_t packedBufLen, nfapi_p7_codec_config_t* config);
|
int nfapi_p7_message_pack(void *pMessageBuf, void *pPackedBuf, uint32_t packedBufLen, nfapi_p7_codec_config_t* config);
|
||||||
|
int nfapi_nr_p7_message_pack(void *pMessageBuf, void *pPackedBuf, uint32_t packedBufLen, nfapi_p7_codec_config_t* config);
|
||||||
|
|
||||||
/*! \brief Decodes an NFAPI P7 message header
|
/*! \brief Decodes an NFAPI P7 message header
|
||||||
* \param pMessageBuf A pointer to an encoded P7 message header
|
* \param pMessageBuf A pointer to an encoded P7 message header
|
||||||
@@ -3925,6 +4031,7 @@ int nfapi_p7_message_header_unpack(void *pMessageBuf, uint32_t messageBufLen, vo
|
|||||||
* The function will decode a byte stream pointed to by pMessageBuf into a nfapi p7 message structure pointer to by pUnpackedBuf
|
* The function will decode a byte stream pointed to by pMessageBuf into a nfapi p7 message structure pointer to by pUnpackedBuf
|
||||||
*/
|
*/
|
||||||
int nfapi_p7_message_unpack(void *pMessageBuf, uint32_t messageBufLen, void *pUnpackedBuf, uint32_t unpackedBufLen, nfapi_p7_codec_config_t* config);
|
int nfapi_p7_message_unpack(void *pMessageBuf, uint32_t messageBufLen, void *pUnpackedBuf, uint32_t unpackedBufLen, nfapi_p7_codec_config_t* config);
|
||||||
|
int nfapi_nr_p7_message_unpack(void *pMessageBuf, uint32_t messageBufLen, void *pUnpackedBuf, uint32_t unpackedBufLen, nfapi_p7_codec_config_t* config);
|
||||||
|
|
||||||
/*! \brief Calculates the checksum of a message
|
/*! \brief Calculates the checksum of a message
|
||||||
*
|
*
|
||||||
|
|||||||
@@ -10,7 +10,7 @@
|
|||||||
#define _NFAPI_NR_INTERFACE_H_
|
#define _NFAPI_NR_INTERFACE_H_
|
||||||
|
|
||||||
#include "nfapi_interface.h"
|
#include "nfapi_interface.h"
|
||||||
#include <nfapi/open-nFAPI/nfapi/public_inc/nfapi_nr_interface_scf.h>
|
#include "nfapi/open-nFAPI/nfapi/public_inc/nfapi_nr_interface_scf.h"
|
||||||
|
|
||||||
#define NFAPI_NR_MAX_NB_CCE_AGGREGATION_LEVELS 5
|
#define NFAPI_NR_MAX_NB_CCE_AGGREGATION_LEVELS 5
|
||||||
#define NFAPI_NR_MAX_NB_TCI_STATES_PDCCH 64
|
#define NFAPI_NR_MAX_NB_TCI_STATES_PDCCH 64
|
||||||
@@ -22,62 +22,32 @@
|
|||||||
// nFAPI enums
|
// nFAPI enums
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
//These TLVs are used exclusively by nFAPI
|
//These TLVs are used exclusively by nFAPI
|
||||||
typedef struct
|
#define NFAPI_NR_NFAPI_P7_VNF_ADDRESS_IPV4_TAG 0x0100
|
||||||
{
|
#define NFAPI_NR_NFAPI_P7_VNF_ADDRESS_IPV6_TAG 0x0101
|
||||||
// These TLVs are used to setup the transport connection between VNF and PNF
|
#define NFAPI_NR_NFAPI_P7_VNF_PORT_TAG 0x0102
|
||||||
// nfapi_ipv4_address_t p7_vnf_address_ipv4;
|
#define NFAPI_NR_NFAPI_P7_PNF_ADDRESS_IPV4_TAG 0x0103
|
||||||
// nfapi_ipv6_address_t p7_vnf_address_ipv6;
|
#define NFAPI_NR_NFAPI_P7_PNF_ADDRESS_IPV6_TAG 0x0104
|
||||||
// nfapi_uint16_tlv_t p7_vnf_port;
|
#define NFAPI_NR_NFAPI_P7_PNF_PORT_TAG 0x0105
|
||||||
|
#define NFAPI_NR_NFAPI_DL_TTI_TIMING_OFFSET 0x0106
|
||||||
// nfapi_ipv4_address_t p7_pnf_address_ipv4;
|
#define NFAPI_NR_NFAPI_UL_TTI_TIMING_OFFSET 0x0107
|
||||||
// nfapi_ipv6_address_t p7_pnf_address_ipv6;
|
#define NFAPI_NR_NFAPI_UL_DCI_TIMING_OFFSET 0x0108
|
||||||
// nfapi_uint16_tlv_t p7_pnf_port;
|
#define NFAPI_NR_NFAPI_TX_DATA_TIMING_OFFSET 0x0109
|
||||||
|
#define NFAPI_NR_NFAPI_TIMING_WINDOW_TAG 0x011E
|
||||||
// // These TLVs are used to setup the transport connection between VNF and PNF
|
#define NFAPI_NR_NFAPI_TIMING_INFO_MODE_TAG 0x011F
|
||||||
// nfapi_uint8_tlv_t dl_ue_per_sf;
|
#define NFAPI_NR_NFAPI_TIMING_INFO_PERIOD_TAG 0x0120
|
||||||
// nfapi_uint8_tlv_t ul_ue_per_sf;
|
|
||||||
|
|
||||||
// These TLVs are used by PNF to report its RF capabilities to the VNF software
|
|
||||||
nfapi_rf_bands_t rf_bands;
|
|
||||||
|
|
||||||
// These TLVs are used by the VNF to configure the synchronization with the PNF.
|
|
||||||
// nfapi_uint8_tlv_t timing_window;
|
|
||||||
// nfapi_uint8_tlv_t timing_info_mode;
|
|
||||||
// nfapi_uint8_tlv_t timing_info_period;
|
|
||||||
|
|
||||||
// These TLVs are used by the VNF to configure the RF in the PNF
|
|
||||||
// nfapi_uint16_tlv_t max_transmit_power;
|
|
||||||
nfapi_uint32_tlv_t nrarfcn;
|
|
||||||
|
|
||||||
// nfapi_nmm_frequency_bands_t nmm_gsm_frequency_bands;
|
|
||||||
// nfapi_nmm_frequency_bands_t nmm_umts_frequency_bands;
|
|
||||||
// nfapi_nmm_frequency_bands_t nmm_lte_frequency_bands;
|
|
||||||
// nfapi_uint8_tlv_t nmm_uplink_rssi_supported;
|
|
||||||
|
|
||||||
} nfapi_nr_nfapi_t;
|
|
||||||
|
|
||||||
#define NFAPI_NR_NFAPI_P7_VNF_ADDRESS_IPV4_TAG 0x5100
|
|
||||||
#define NFAPI_NR_NFAPI_P7_VNF_ADDRESS_IPV6_TAG 0x5101
|
|
||||||
#define NFAPI_NR_NFAPI_P7_VNF_PORT_TAG 0x5102
|
|
||||||
#define NFAPI_NR_NFAPI_P7_PNF_ADDRESS_IPV4_TAG 0x5103
|
|
||||||
#define NFAPI_NR_NFAPI_P7_PNF_ADDRESS_IPV6_TAG 0x5104
|
|
||||||
#define NFAPI_NR_NFAPI_P7_PNF_PORT_TAG 0x5105
|
|
||||||
|
|
||||||
|
/*
|
||||||
#define NFAPI_NR_NFAPI_DOWNLINK_UES_PER_SUBFRAME_TAG 0x510A
|
#define NFAPI_NR_NFAPI_DOWNLINK_UES_PER_SUBFRAME_TAG 0x510A
|
||||||
#define NFAPI_NR_NFAPI_UPLINK_UES_PER_SUBFRAME_TAG 0x510B
|
#define NFAPI_NR_NFAPI_UPLINK_UES_PER_SUBFRAME_TAG 0x510B
|
||||||
#define NFAPI_NR_NFAPI_RF_BANDS_TAG 0x5114
|
#define NFAPI_NR_NFAPI_RF_BANDS_TAG 0x5114
|
||||||
#define NFAPI_NR_NFAPI_TIMING_WINDOW_TAG 0x511E
|
|
||||||
#define NFAPI_NR_NFAPI_TIMING_INFO_MODE_TAG 0x511F
|
|
||||||
#define NFAPI_NR_NFAPI_TIMING_INFO_PERIOD_TAG 0x5120
|
|
||||||
#define NFAPI_NR_NFAPI_MAXIMUM_TRANSMIT_POWER_TAG 0x5128
|
#define NFAPI_NR_NFAPI_MAXIMUM_TRANSMIT_POWER_TAG 0x5128
|
||||||
#define NFAPI_NR_NFAPI_NRARFCN_TAG 0x5129
|
#define NFAPI_NR_NFAPI_NRARFCN_TAG 0x5129
|
||||||
#define NFAPI_NR_NFAPI_NMM_GSM_FREQUENCY_BANDS_TAG 0x5130
|
#define NFAPI_NR_NFAPI_NMM_GSM_FREQUENCY_BANDS_TAG 0x5130
|
||||||
#define NFAPI_NR_NFAPI_NMM_UMTS_FREQUENCY_BANDS_TAG 0x5131
|
#define NFAPI_NR_NFAPI_NMM_UMTS_FREQUENCY_BANDS_TAG 0x5131
|
||||||
#define NFAPI_NR_NFAPI_NMM_LTE_FREQUENCY_BANDS_TAG 0x5132
|
#define NFAPI_NR_NFAPI_NMM_LTE_FREQUENCY_BANDS_TAG 0x5132
|
||||||
#define NFAPI_NR_NFAPI_NMM_UPLINK_RSSI_SUPPORTED_TAG 0x5133
|
#define NFAPI_NR_NFAPI_NMM_UPLINK_RSSI_SUPPORTED_TAG 0x5133
|
||||||
|
*/
|
||||||
// P5 Message Structures
|
// P5 Message Structures
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
@@ -323,7 +293,7 @@ typedef enum {
|
|||||||
|
|
||||||
typedef enum {
|
typedef enum {
|
||||||
NFAPI_NR_CCE_REG_MAPPING_INTERLEAVED=0,
|
NFAPI_NR_CCE_REG_MAPPING_INTERLEAVED=0,
|
||||||
NFAPI_NR_CCE_REG_MAPPING_NON_INTERLEAVED
|
NFAPI_NR_CCE_REG_MAPPING_NON_INTERLEAVED=1
|
||||||
} nfapi_nr_cce_reg_mapping_type_e;
|
} nfapi_nr_cce_reg_mapping_type_e;
|
||||||
|
|
||||||
typedef enum {
|
typedef enum {
|
||||||
|
|||||||
Binary file not shown.
@@ -11,6 +11,7 @@
|
|||||||
|
|
||||||
#include "stddef.h"
|
#include "stddef.h"
|
||||||
#include "nfapi_interface.h"
|
#include "nfapi_interface.h"
|
||||||
|
#include "nfapi_nr_interface.h"
|
||||||
|
|
||||||
#define NFAPI_NR_MAX_NB_CCE_AGGREGATION_LEVELS 5
|
#define NFAPI_NR_MAX_NB_CCE_AGGREGATION_LEVELS 5
|
||||||
#define NFAPI_NR_MAX_NB_TCI_STATES_PDCCH 64
|
#define NFAPI_NR_MAX_NB_TCI_STATES_PDCCH 64
|
||||||
@@ -24,25 +25,7 @@
|
|||||||
#define NFAPI_MAX_NUM_CB 8
|
#define NFAPI_MAX_NUM_CB 8
|
||||||
|
|
||||||
// Extension to the generic structures for single tlv values
|
// Extension to the generic structures for single tlv values
|
||||||
typedef struct {
|
|
||||||
nfapi_tl_t tl;
|
|
||||||
int32_t value;
|
|
||||||
} nfapi_int32_tlv_t;
|
|
||||||
|
|
||||||
typedef struct {
|
|
||||||
nfapi_tl_t tl;
|
|
||||||
uint32_t value;
|
|
||||||
} nfapi_uint32_tlv_t;
|
|
||||||
|
|
||||||
typedef struct {
|
|
||||||
nfapi_tl_t tl;
|
|
||||||
int64_t value;
|
|
||||||
} nfapi_int64_tlv_t;
|
|
||||||
|
|
||||||
typedef struct {
|
|
||||||
nfapi_tl_t tl;
|
|
||||||
uint64_t value;
|
|
||||||
} nfapi_uint64_tlv_t;
|
|
||||||
|
|
||||||
typedef enum {
|
typedef enum {
|
||||||
NFAPI_NR_DMRS_TYPE1=0,
|
NFAPI_NR_DMRS_TYPE1=0,
|
||||||
@@ -76,35 +59,42 @@ typedef enum {
|
|||||||
NFAPI_NR_PHY_MSG_TYPE_STOP_REQUEST= 0X05,
|
NFAPI_NR_PHY_MSG_TYPE_STOP_REQUEST= 0X05,
|
||||||
NFAPI_NR_PHY_MSG_TYPE_STOP_INDICATION=0X06,
|
NFAPI_NR_PHY_MSG_TYPE_STOP_INDICATION=0X06,
|
||||||
NFAPI_NR_PHY_MSG_TYPE_ERROR_INDICATION=0X07,
|
NFAPI_NR_PHY_MSG_TYPE_ERROR_INDICATION=0X07,
|
||||||
|
NFAPI_NR_PHY_MSG_TYPE_START_RESPONSE=0X010D,
|
||||||
|
NFAPI_NR_PHY_MSG_TYPE_STOP_RESPONSE=0X010F,
|
||||||
//RESERVED 0X08 ~ 0X7F
|
//RESERVED 0X08 ~ 0X7F
|
||||||
NFAPI_NR_PHY_MSG_TYPE_DL_TTI_REQUEST= 0X80,
|
NFAPI_NR_PHY_MSG_TYPE_DL_TTI_REQUEST= 0X80,
|
||||||
NFAPI_NR_PHY_MSG_TYPE_UL_TTI_REQUEST= 0X81,
|
NFAPI_NR_PHY_MSG_TYPE_UL_TTI_REQUEST= 0X81,
|
||||||
NFAPI_NR_PHY_MSG_TYPE_SLOT_INDICATION=0X82,
|
NFAPI_NR_PHY_MSG_TYPE_SLOT_INDICATION=0X82,
|
||||||
NFAPI_NR_PHY_MSG_TYPE_UL_DCI_REQUEST= 0X83,
|
NFAPI_NR_PHY_MSG_TYPE_UL_DCI_REQUEST= 0X83,
|
||||||
NFAPI_NR_PHY_MSG_TYPE_TX_DATA_REQUEST=0X54,
|
NFAPI_NR_PHY_MSG_TYPE_TX_DATA_REQUEST=0X84, // CHANGED TO 0X84
|
||||||
NFAPI_NR_PHY_MSG_TYPE_RX_DATA_INDICATION=0X85,
|
NFAPI_NR_PHY_MSG_TYPE_RX_DATA_INDICATION=0X85,
|
||||||
NFAPI_NR_PHY_MSG_TYPE_CRC_INDICATION= 0X86,
|
NFAPI_NR_PHY_MSG_TYPE_CRC_INDICATION= 0X86,
|
||||||
NFAPI_NR_PHY_MSG_TYPE_UCI_INDICATION= 0X87,
|
NFAPI_NR_PHY_MSG_TYPE_UCI_INDICATION= 0X87,
|
||||||
NFAPI_NR_PHY_MSG_TYPE_SRS_INDICATION= 0X88,
|
NFAPI_NR_PHY_MSG_TYPE_SRS_INDICATION= 0X88,
|
||||||
NFAPI_NR_PHY_MSG_TYPE_RACH_INDICATION= 0X89
|
NFAPI_NR_PHY_MSG_TYPE_RACH_INDICATION= 0X89,
|
||||||
//RESERVED 0X8a ~ 0xff
|
//RESERVED 0X8a ~ 0xff
|
||||||
|
NFAPI_NR_PHY_MSG_TYPE_PNF_PARAM_REQUEST = 0x0100,
|
||||||
|
NFAPI_NR_PHY_MSG_TYPE_PNF_PARAM_RESPONSE = 0x0101,
|
||||||
|
NFAPI_NR_PHY_MSG_TYPE_PNF_CONFIG_REQUEST= 0x0102,
|
||||||
|
NFAPI_NR_PHY_MSG_TYPE_PNF_CONFIG_RESPONSE= 0x0103,
|
||||||
|
NFAPI_NR_PHY_MSG_TYPE_PNF_START_REQUEST= 0x0104,
|
||||||
|
NFAPI_NR_PHY_MSG_TYPE_PNF_START_RESPONSE= 0x0105,
|
||||||
|
NFAPI_NR_PHY_MSG_TYPE_PNF_STOP_REQUEST= 0x0106,
|
||||||
|
NFAPI_NR_PHY_MSG_TYPE_PNF_STOP_RESPONSE= 0x0107,
|
||||||
|
|
||||||
|
NFAPI_NR_PHY_MSG_TYPE_UL_NODE_SYNC = 0x0180,
|
||||||
|
NFAPI_NR_PHY_MSG_TYPE_DL_NODE_SYNC,
|
||||||
|
NFAPI_NR_PHY_MSG_TYPE_TIMING_INFO
|
||||||
} nfapi_nr_phy_msg_type_e;
|
} nfapi_nr_phy_msg_type_e;
|
||||||
|
|
||||||
// SCF222_5G-FAPI_PHY_SPI_Specificayion.pdf Section 3.3
|
// SCF222_5G-FAPI_PHY_SPI_Specificayion.pdf Section 3.3
|
||||||
|
|
||||||
//3.3.1 PARAM
|
//3.3.1 PARAM
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
//same with nfapi_param_request_t
|
//same with nfapi_param_request_t
|
||||||
typedef struct {
|
|
||||||
nfapi_p4_p5_message_header_t header;
|
|
||||||
nfapi_vendor_extension_tlv_t vendor_extension;
|
|
||||||
} nfapi_nr_param_request_t;
|
|
||||||
|
|
||||||
typedef enum {
|
|
||||||
NFAPI_NR_PARAM_MSG_OK = 0,
|
|
||||||
NFAPI_NR_PARAM_MSG_INVALID_STATE
|
|
||||||
|
|
||||||
} nfapi_nr_param_errors_e;
|
|
||||||
|
|
||||||
/*typedef struct {
|
/*typedef struct {
|
||||||
nfapi_nr_param_errors_e error_code;
|
nfapi_nr_param_errors_e error_code;
|
||||||
@@ -278,12 +268,6 @@ typedef struct
|
|||||||
//-------------------------------------------//
|
//-------------------------------------------//
|
||||||
//3.3.2 CONFIG
|
//3.3.2 CONFIG
|
||||||
|
|
||||||
|
|
||||||
typedef enum {
|
|
||||||
NFAPI_NR_CONFIG_MSG_OK = 0,
|
|
||||||
NFAPI_NR_CONFIG_MSG_INVALID_CONFIG //The configuration provided has missing mandatory TLVs, or TLVs that are invalid or unsupported in this state.
|
|
||||||
} nfapi_nr_config_errors_e;
|
|
||||||
|
|
||||||
/*typedef struct {
|
/*typedef struct {
|
||||||
nfapi_nr_config_errors_e error_code;
|
nfapi_nr_config_errors_e error_code;
|
||||||
uint8_t number_of_invalid_tlvs_that_can_only_be_configured_in_idle;
|
uint8_t number_of_invalid_tlvs_that_can_only_be_configured_in_idle;
|
||||||
@@ -373,7 +357,7 @@ typedef struct
|
|||||||
//table 3-23
|
//table 3-23
|
||||||
typedef struct
|
typedef struct
|
||||||
{
|
{
|
||||||
nfapi_uint32_tlv_t ss_pbch_power;//SSB Block Power Value: TBD (-60..50 dBm)
|
nfapi_int32_tlv_t ss_pbch_power;//SSB Block Power Value: TBD (-60..50 dBm)
|
||||||
nfapi_uint8_tlv_t bch_payload;//Defines option selected for generation of BCH payload, see Table 3-13 (v0.0.011 Value: 0: MAC generates the full PBCH payload 1: PHY generates the timing PBCH bits 2: PHY generates the full PBCH payload
|
nfapi_uint8_tlv_t bch_payload;//Defines option selected for generation of BCH payload, see Table 3-13 (v0.0.011 Value: 0: MAC generates the full PBCH payload 1: PHY generates the timing PBCH bits 2: PHY generates the full PBCH payload
|
||||||
nfapi_uint8_tlv_t scs_common;//subcarrierSpacing for common, used for initial access and broadcast message. [38.211 sec 4.2] Value:0->3
|
nfapi_uint8_tlv_t scs_common;//subcarrierSpacing for common, used for initial access and broadcast message. [38.211 sec 4.2] Value:0->3
|
||||||
|
|
||||||
@@ -414,13 +398,13 @@ typedef struct
|
|||||||
{
|
{
|
||||||
nfapi_uint32_tlv_t ssb_mask;//Bitmap for actually transmitted SSB. MSB->LSB of first 32 bit number corresponds to SSB 0 to SSB 31 MSB->LSB of second 32 bit number corresponds to SSB 32 to SSB 63 Value for each bit: 0: not transmitted 1: transmitted
|
nfapi_uint32_tlv_t ssb_mask;//Bitmap for actually transmitted SSB. MSB->LSB of first 32 bit number corresponds to SSB 0 to SSB 31 MSB->LSB of second 32 bit number corresponds to SSB 32 to SSB 63 Value for each bit: 0: not transmitted 1: transmitted
|
||||||
|
|
||||||
} nfapi_nr_ssb_mask_size_2_t;
|
} nfapi_nr_ssb_mask_list_t;
|
||||||
|
|
||||||
typedef struct
|
typedef struct
|
||||||
{
|
{
|
||||||
nfapi_uint8_tlv_t beam_id[64];//BeamID for each SSB in SsbMask. For example, if SSB mask bit 26 is set to 1, then BeamId[26] will be used to indicate beam ID of SSB 26. Value: from 0 to 63
|
nfapi_uint8_tlv_t beam_id;//BeamID for each SSB in SsbMask. For example, if SSB mask bit 26 is set to 1, then BeamId[26] will be used to indicate beam ID of SSB 26. Value: from 0 to 63
|
||||||
|
|
||||||
} nfapi_nr_ssb_mask_size_64_t;
|
} nfapi_nr_ssb_beam_id_list_t;
|
||||||
|
|
||||||
typedef struct
|
typedef struct
|
||||||
{
|
{
|
||||||
@@ -429,8 +413,8 @@ typedef struct
|
|||||||
nfapi_uint8_tlv_t ssb_period;//SSB periodicity in msec Value: 0: ms5 1: ms10 2: ms20 3: ms40 4: ms80 5: ms160
|
nfapi_uint8_tlv_t ssb_period;//SSB periodicity in msec Value: 0: ms5 1: ms10 2: ms20 3: ms40 4: ms80 5: ms160
|
||||||
nfapi_uint8_tlv_t ssb_subcarrier_offset;//ssbSubcarrierOffset or 𝑘𝑆𝑆𝐵 (38.211, section 7.4.3.1) Value: 0->31
|
nfapi_uint8_tlv_t ssb_subcarrier_offset;//ssbSubcarrierOffset or 𝑘𝑆𝑆𝐵 (38.211, section 7.4.3.1) Value: 0->31
|
||||||
nfapi_uint32_tlv_t MIB;//MIB payload, where the 24 MSB are used and represent the MIB in [38.331 MIB IE] and represent 0 1 2 3 1 , , , ,..., A− a a a a a [38.212, sec 7.1.1]
|
nfapi_uint32_tlv_t MIB;//MIB payload, where the 24 MSB are used and represent the MIB in [38.331 MIB IE] and represent 0 1 2 3 1 , , , ,..., A− a a a a a [38.212, sec 7.1.1]
|
||||||
nfapi_nr_ssb_mask_size_2_t ssb_mask_list[2];
|
nfapi_nr_ssb_mask_list_t ssb_mask_list[2];
|
||||||
nfapi_nr_ssb_mask_size_64_t* ssb_beam_id_list;//64
|
nfapi_nr_ssb_beam_id_list_t ssb_beam_id_list[64];
|
||||||
nfapi_uint8_tlv_t ss_pbch_multiple_carriers_in_a_band;//0 = disabled 1 = enabled
|
nfapi_uint8_tlv_t ss_pbch_multiple_carriers_in_a_band;//0 = disabled 1 = enabled
|
||||||
nfapi_uint8_tlv_t multiple_cells_ss_pbch_in_a_carrier;//Indicates that multiple cells will be supported in a single carrier 0 = disabled 1 = enabled
|
nfapi_uint8_tlv_t multiple_cells_ss_pbch_in_a_carrier;//Indicates that multiple cells will be supported in a single carrier 0 = disabled 1 = enabled
|
||||||
|
|
||||||
@@ -465,9 +449,108 @@ typedef struct
|
|||||||
|
|
||||||
} nfapi_nr_measurement_config_t;
|
} nfapi_nr_measurement_config_t;
|
||||||
|
|
||||||
|
// ERROR enums
|
||||||
|
typedef enum { // Table 2-22
|
||||||
|
NFAPI_NR_PARAM_MSG_OK = 0,
|
||||||
|
NFAPI_NR_PARAM_MSG_INVALID_STATE
|
||||||
|
} nfapi_nr_param_errors_e;
|
||||||
|
|
||||||
|
typedef enum { // Table 2-25
|
||||||
|
NFAPI_NR_CONFIG_MSG_OK = 0,
|
||||||
|
NFAPI_NR_CONFIG_MSG_INVALID_STATE, //The CONFIG.request was received when the PHY was not in the IDLE state or the CONFIGURED state.
|
||||||
|
NFAPI_NR_CONFIG_MSG_INVALID_CONFIG //The configuration provided has missing mandatory TLVs, or TLVs that are invalid or unsupported in this state.
|
||||||
|
} nfapi_nr_config_errors_e;
|
||||||
|
|
||||||
|
typedef enum { // Table 2-27
|
||||||
|
NFAPI_NR_START_MSG_OK = 0,
|
||||||
|
NFAPI_NR_START_MSG_INVALID_STATE
|
||||||
|
} nfapi_nr_start_errors_e;
|
||||||
|
|
||||||
|
//PNF P5 NR
|
||||||
|
typedef struct {
|
||||||
|
nfapi_p4_p5_message_header_t header;
|
||||||
|
nfapi_vendor_extension_tlv_t vendor_extension;
|
||||||
|
} nfapi_nr_pnf_param_request_t;
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
uint8_t num_tlv;
|
nfapi_p4_p5_message_header_t header;
|
||||||
|
uint32_t error_code;
|
||||||
|
nfapi_pnf_param_general_t pnf_param_general;
|
||||||
|
nfapi_pnf_phy_t pnf_phy;
|
||||||
|
nfapi_vendor_extension_tlv_t vendor_extension;
|
||||||
|
} nfapi_nr_pnf_param_response_t;
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
nfapi_p4_p5_message_header_t header;
|
||||||
|
uint8_t num_tlvs;
|
||||||
|
nfapi_pnf_phy_rf_config_t pnf_phy_rf_config;
|
||||||
|
nfapi_vendor_extension_tlv_t vendor_extension;
|
||||||
|
} nfapi_nr_pnf_config_request_t;
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
nfapi_p4_p5_message_header_t header;
|
||||||
|
uint32_t error_code;
|
||||||
|
nfapi_vendor_extension_tlv_t vendor_extension;
|
||||||
|
} nfapi_nr_pnf_config_response_t;
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
nfapi_p4_p5_message_header_t header;
|
||||||
|
nfapi_vendor_extension_tlv_t vendor_extension;
|
||||||
|
} nfapi_nr_pnf_start_request_t;
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
nfapi_p4_p5_message_header_t header;
|
||||||
|
uint32_t error_code;
|
||||||
|
nfapi_vendor_extension_tlv_t vendor_extension;
|
||||||
|
} nfapi_nr_pnf_start_response_t;
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
nfapi_p4_p5_message_header_t header;
|
||||||
|
nfapi_vendor_extension_tlv_t vendor_extension;
|
||||||
|
} nfapi_nr_pnf_stop_request_t;
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
nfapi_p4_p5_message_header_t header;
|
||||||
|
uint32_t error_code;
|
||||||
|
nfapi_vendor_extension_tlv_t vendor_extension;
|
||||||
|
} nfapi_nr_pnf_stop_response_t;
|
||||||
|
|
||||||
|
|
||||||
|
/* PARAM.REQUEST */
|
||||||
|
typedef struct {
|
||||||
|
nfapi_p4_p5_message_header_t header;
|
||||||
|
nfapi_vendor_extension_tlv_t vendor_extension;
|
||||||
|
} nfapi_nr_param_request_scf_t;
|
||||||
|
|
||||||
|
/* PARAM.RESPONSE */
|
||||||
|
typedef struct {
|
||||||
|
nfapi_p4_p5_message_header_t header;
|
||||||
|
uint8_t error_code;
|
||||||
|
|
||||||
|
uint8_t num_tlv;
|
||||||
|
nfapi_vendor_extension_tlv_t vendor_extension;
|
||||||
|
|
||||||
|
nfapi_nr_cell_param_t cell_param;
|
||||||
|
nfapi_nr_carrier_param_t carrier_param;
|
||||||
|
nfapi_nr_pdcch_param_t pdcch_param;
|
||||||
|
nfapi_nr_pucch_param_t pucch_param;
|
||||||
|
nfapi_nr_pdsch_param_t pdsch_param;
|
||||||
|
nfapi_nr_pusch_param_t pusch_param;
|
||||||
|
nfapi_nr_prach_param_t prach_param;
|
||||||
|
nfapi_nr_measurement_param_t measurement_param;
|
||||||
|
nfapi_nr_nfapi_t nfapi_config;
|
||||||
|
} nfapi_nr_param_response_scf_t;
|
||||||
|
|
||||||
|
//------------------------------//
|
||||||
|
//3.3.2 CONFIG
|
||||||
|
|
||||||
|
/* CONFIG.REQUEST */
|
||||||
|
typedef struct {
|
||||||
|
nfapi_p4_p5_message_header_t header;
|
||||||
|
|
||||||
|
uint8_t num_tlv;
|
||||||
|
nfapi_vendor_extension_tlv_t vendor_extension;
|
||||||
|
|
||||||
nfapi_nr_carrier_config_t carrier_config;
|
nfapi_nr_carrier_config_t carrier_config;
|
||||||
nfapi_nr_cell_config_t cell_config;
|
nfapi_nr_cell_config_t cell_config;
|
||||||
nfapi_nr_ssb_config_t ssb_config;
|
nfapi_nr_ssb_config_t ssb_config;
|
||||||
@@ -475,20 +558,32 @@ typedef struct {
|
|||||||
nfapi_nr_ssb_table_t ssb_table;
|
nfapi_nr_ssb_table_t ssb_table;
|
||||||
nfapi_nr_tdd_table_t tdd_table;
|
nfapi_nr_tdd_table_t tdd_table;
|
||||||
nfapi_nr_measurement_config_t measurement_config;
|
nfapi_nr_measurement_config_t measurement_config;
|
||||||
|
nfapi_nr_nfapi_t nfapi_config;
|
||||||
} nfapi_nr_config_request_scf_t;
|
} nfapi_nr_config_request_scf_t;
|
||||||
|
|
||||||
|
|
||||||
|
/* CONFIG.RESPONSE */
|
||||||
|
typedef struct {
|
||||||
|
nfapi_p4_p5_message_header_t header;
|
||||||
|
uint8_t error_code;
|
||||||
|
//uint8_t num_invalid_tlvs;
|
||||||
|
// TODO: add list of invalid/unsupported TLVs (see Table 3.18)
|
||||||
|
nfapi_vendor_extension_tlv_t vendor_extension;
|
||||||
|
} nfapi_nr_config_response_scf_t;
|
||||||
|
|
||||||
//------------------------------//
|
//------------------------------//
|
||||||
//3.3.3 START
|
//3.3.3 START
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
nfapi_p4_p5_message_header_t header;
|
nfapi_p4_p5_message_header_t header;
|
||||||
nfapi_vendor_extension_tlv_t vendor_extension;
|
nfapi_vendor_extension_tlv_t vendor_extension;
|
||||||
} nfapi_nr_start_request_t;
|
} nfapi_nr_start_request_scf_t;
|
||||||
|
|
||||||
typedef enum {
|
typedef struct {
|
||||||
NFAPI_NR_START_MSG_INVALID_STATE
|
nfapi_p4_p5_message_header_t header;
|
||||||
} nfapi_nr_start_errors_e;
|
nfapi_nr_start_errors_e error_code;
|
||||||
|
nfapi_vendor_extension_tlv_t vendor_extension;
|
||||||
|
} nfapi_nr_start_response_scf_t;
|
||||||
|
|
||||||
//3.3.4 STOP
|
//3.3.4 STOP
|
||||||
|
|
||||||
@@ -497,6 +592,7 @@ typedef struct {
|
|||||||
nfapi_vendor_extension_tlv_t vendor_extension;
|
nfapi_vendor_extension_tlv_t vendor_extension;
|
||||||
} nfapi_nr_stop_request_t;
|
} nfapi_nr_stop_request_t;
|
||||||
|
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
nfapi_p4_p5_message_header_t header;
|
nfapi_p4_p5_message_header_t header;
|
||||||
nfapi_vendor_extension_tlv_t vendor_extension;
|
nfapi_vendor_extension_tlv_t vendor_extension;
|
||||||
@@ -580,9 +676,9 @@ typedef struct {
|
|||||||
uint16_t sfn; //0->1023
|
uint16_t sfn; //0->1023
|
||||||
uint16_t slot;//0->319
|
uint16_t slot;//0->319
|
||||||
|
|
||||||
} nfapi_nr_slot_indication_t;
|
} nfapi_nr_slot_indication_scf_t;
|
||||||
|
|
||||||
// 3.4.2
|
// 3.4.2
|
||||||
|
|
||||||
//for pdcch_pdu:
|
//for pdcch_pdu:
|
||||||
|
|
||||||
@@ -595,11 +691,10 @@ typedef struct
|
|||||||
typedef struct
|
typedef struct
|
||||||
{
|
{
|
||||||
uint16_t pm_idx;//Index to precoding matrix (PM) pre-stored at cell configuration. Note: If precoding is not used this parameter should be set to 0. Value: 0->65535.
|
uint16_t pm_idx;//Index to precoding matrix (PM) pre-stored at cell configuration. Note: If precoding is not used this parameter should be set to 0. Value: 0->65535.
|
||||||
nfapi_nr_dig_bf_interface_t* dig_bf_interface_list;
|
nfapi_nr_dig_bf_interface_t dig_bf_interface_list[255];//max dig_bf_interfaces
|
||||||
|
|
||||||
}nfapi_nr_tx_precoding_and_beamforming_number_of_prgs_t;
|
}nfapi_nr_tx_precoding_and_beamforming_number_of_prgs_t;
|
||||||
|
|
||||||
/*
|
|
||||||
//table 3-43
|
//table 3-43
|
||||||
typedef struct
|
typedef struct
|
||||||
{
|
{
|
||||||
@@ -607,21 +702,10 @@ typedef struct
|
|||||||
uint16_t prg_size;//Size in RBs of a precoding resource block group (PRG) – to which same precoding and digital beamforming gets applied. Value: 1->275
|
uint16_t prg_size;//Size in RBs of a precoding resource block group (PRG) – to which same precoding and digital beamforming gets applied. Value: 1->275
|
||||||
//watchout: dig_bf_interfaces here, in table 3-53 it's dig_bf_interface
|
//watchout: dig_bf_interfaces here, in table 3-53 it's dig_bf_interface
|
||||||
uint8_t dig_bf_interfaces;//Number of STD ant ports (parallel streams) feeding into the digBF Value: 0->255
|
uint8_t dig_bf_interfaces;//Number of STD ant ports (parallel streams) feeding into the digBF Value: 0->255
|
||||||
nfapi_nr_tx_precoding_and_beamforming_number_of_prgs_t* prgs_list;//
|
nfapi_nr_tx_precoding_and_beamforming_number_of_prgs_t prgs_list[275];//max prg_size
|
||||||
|
|
||||||
}nfapi_nr_tx_precoding_and_beamforming_t;
|
}nfapi_nr_tx_precoding_and_beamforming_t;
|
||||||
*/
|
|
||||||
|
|
||||||
typedef struct {
|
|
||||||
/// Number of PRGs spanning this allocation. Value : 1->275
|
|
||||||
uint16_t numPRGs;
|
|
||||||
/// Size in RBs of a precoding resource block group (PRG) – to which same precoding and digital beamforming gets applied. Value: 1->275
|
|
||||||
uint16_t prgSize;
|
|
||||||
/// Number of STD ant ports (parallel streams) feeding into the digBF Value: 0->255
|
|
||||||
uint8_t digBFInterfaces;
|
|
||||||
uint16_t PMIdx[275];
|
|
||||||
uint16_t *beamIdx[275];
|
|
||||||
} nfapi_nr_tx_precoding_and_beamforming_t;
|
|
||||||
|
|
||||||
//table 3-37
|
//table 3-37
|
||||||
|
|
||||||
@@ -657,16 +741,6 @@ typedef struct {
|
|||||||
|
|
||||||
} nfapi_nr_dl_dci_pdu_t;
|
} nfapi_nr_dl_dci_pdu_t;
|
||||||
|
|
||||||
typedef struct {
|
|
||||||
/// Number of PRGs spanning this allocation. Value : 1->275
|
|
||||||
uint16_t numPRGs;
|
|
||||||
/// Size in RBs of a precoding resource block group (PRG) – to which same precoding and digital beamforming gets applied. Value: 1->275
|
|
||||||
uint16_t prgSize;
|
|
||||||
/// Number of STD ant ports (parallel streams) feeding into the digBF Value: 0->255
|
|
||||||
uint8_t digBFInterfaces;
|
|
||||||
uint16_t PMIdx[275];
|
|
||||||
uint16_t *beamIdx[275];
|
|
||||||
} nr_beamforming_t;
|
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
///Bandwidth part size [TS38.213 sec12]. Number of contiguous PRBs allocated to the BWP,Value: 1->275
|
///Bandwidth part size [TS38.213 sec12]. Number of contiguous PRBs allocated to the BWP,Value: 1->275
|
||||||
@@ -930,7 +1004,7 @@ typedef struct {
|
|||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
uint16_t PDUType;
|
uint16_t PDUType;
|
||||||
uint16_t PDUSize;
|
uint32_t PDUSize;
|
||||||
|
|
||||||
union {
|
union {
|
||||||
nfapi_nr_dl_tti_pdcch_pdu pdcch_pdu;
|
nfapi_nr_dl_tti_pdcch_pdu pdcch_pdu;
|
||||||
@@ -941,6 +1015,7 @@ typedef struct {
|
|||||||
} nfapi_nr_dl_tti_request_pdu_t;
|
} nfapi_nr_dl_tti_request_pdu_t;
|
||||||
|
|
||||||
#define NFAPI_NR_MAX_DL_TTI_PDUS 32
|
#define NFAPI_NR_MAX_DL_TTI_PDUS 32
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
/// Number of PDUs that are included in this message. All PDUs in the message are numbered in order. Value 0 -> 255
|
/// Number of PDUs that are included in this message. All PDUs in the message are numbered in order. Value 0 -> 255
|
||||||
uint8_t nPDUs;
|
uint8_t nPDUs;
|
||||||
@@ -954,11 +1029,28 @@ typedef struct {
|
|||||||
uint8_t PduIdx[256][12];
|
uint8_t PduIdx[256][12];
|
||||||
} nfapi_nr_dl_tti_request_body_t;
|
} nfapi_nr_dl_tti_request_body_t;
|
||||||
|
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
nfapi_p7_message_header_t header;
|
||||||
|
uint32_t t1;
|
||||||
|
int32_t delta_sfn_slot;
|
||||||
|
nfapi_vendor_extension_tlv_t vendor_extension;
|
||||||
|
} nfapi_nr_dl_node_sync_t;
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
nfapi_p7_message_header_t header;
|
||||||
|
uint32_t t1;
|
||||||
|
uint32_t t2;
|
||||||
|
uint32_t t3;
|
||||||
|
nfapi_vendor_extension_tlv_t vendor_extension;
|
||||||
|
} nfapi_nr_ul_node_sync_t;
|
||||||
|
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
nfapi_p7_message_header_t header;
|
nfapi_p7_message_header_t header;
|
||||||
/// System Frame Number (0-1023)
|
/// System Frame Number (0-1023)
|
||||||
uint16_t SFN;
|
uint16_t SFN;
|
||||||
/// Slot number (0-319)
|
/// Slot number (0-19)
|
||||||
uint16_t Slot;
|
uint16_t Slot;
|
||||||
nfapi_nr_dl_tti_request_body_t dl_tti_request_body;
|
nfapi_nr_dl_tti_request_body_t dl_tti_request_body;
|
||||||
nfapi_vendor_extension_tlv_t vendor_extension;
|
nfapi_vendor_extension_tlv_t vendor_extension;
|
||||||
@@ -973,7 +1065,7 @@ typedef struct
|
|||||||
nfapi_nr_dl_tti_ssb_pdu_t* ssb_pdu;
|
nfapi_nr_dl_tti_ssb_pdu_t* ssb_pdu;
|
||||||
} nfapi_nr_dl_pdu_configuration_t;
|
} nfapi_nr_dl_pdu_configuration_t;
|
||||||
*/
|
*/
|
||||||
/*
|
/*
|
||||||
typedef struct
|
typedef struct
|
||||||
{
|
{
|
||||||
uint16_t pdu_type;//0: PDCCH PDU 1: PDSCH PDU 2: CSI-RS PDU 3: SSB PDU,
|
uint16_t pdu_type;//0: PDCCH PDU 1: PDSCH PDU 2: CSI-RS PDU 3: SSB PDU,
|
||||||
@@ -1272,6 +1364,7 @@ typedef struct
|
|||||||
} nfapi_nr_ul_tti_request_number_of_groups_t;
|
} nfapi_nr_ul_tti_request_number_of_groups_t;
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
|
nfapi_p7_message_header_t header;
|
||||||
uint16_t SFN; //0->1023
|
uint16_t SFN; //0->1023
|
||||||
uint16_t Slot;//0->319
|
uint16_t Slot;//0->319
|
||||||
uint8_t n_pdus;//Number of PDUs that are included in this message. All PDUs in the message are numbered in order. Value 0 -> 255
|
uint8_t n_pdus;//Number of PDUs that are included in this message. All PDUs in the message are numbered in order. Value 0 -> 255
|
||||||
@@ -1318,6 +1411,7 @@ typedef struct {
|
|||||||
} nfapi_nr_ul_dci_request_pdus_t;
|
} nfapi_nr_ul_dci_request_pdus_t;
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
|
nfapi_p7_message_header_t header;
|
||||||
uint16_t SFN;
|
uint16_t SFN;
|
||||||
uint16_t Slot;
|
uint16_t Slot;
|
||||||
uint8_t numPdus;
|
uint8_t numPdus;
|
||||||
@@ -1363,6 +1457,7 @@ typedef struct
|
|||||||
#define NFAPI_NR_MAX_TX_REQUEST_PDUS 16
|
#define NFAPI_NR_MAX_TX_REQUEST_PDUS 16
|
||||||
typedef struct
|
typedef struct
|
||||||
{
|
{
|
||||||
|
nfapi_p7_message_header_t header;
|
||||||
uint16_t SFN;
|
uint16_t SFN;
|
||||||
uint16_t Slot;
|
uint16_t Slot;
|
||||||
uint16_t Number_of_PDUs;
|
uint16_t Number_of_PDUs;
|
||||||
|
|||||||
@@ -712,7 +712,7 @@ int unpack_tlv_list(unpack_tlv_t unpack_fns[], uint16_t size, uint8_t **ppReadPa
|
|||||||
|
|
||||||
for(idx = 0; idx < size; ++idx)
|
for(idx = 0; idx < size; ++idx)
|
||||||
{
|
{
|
||||||
if(unpack_fns[idx].tag == generic_tl.tag)
|
if(unpack_fns[idx].tag == generic_tl.tag) // match the extracted tag value with all the tags in unpack_fn list
|
||||||
{
|
{
|
||||||
tagMatch = 1;
|
tagMatch = 1;
|
||||||
nfapi_tl_t* tl = (nfapi_tl_t*)(unpack_fns[idx].tlv);
|
nfapi_tl_t* tl = (nfapi_tl_t*)(unpack_fns[idx].tlv);
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
+8103
-6155
File diff suppressed because it is too large
Load Diff
@@ -38,7 +38,9 @@ typedef struct {
|
|||||||
|
|
||||||
int pnf_connect(pnf_t *pnf);
|
int pnf_connect(pnf_t *pnf);
|
||||||
int pnf_message_pump(pnf_t *pnf);
|
int pnf_message_pump(pnf_t *pnf);
|
||||||
|
int pnf_nr_message_pump(pnf_t *pnf);
|
||||||
|
|
||||||
|
int pnf_nr_pack_and_send_p5_message(pnf_t* pnf, nfapi_p4_p5_message_header_t* msg, uint32_t msg_len);
|
||||||
int pnf_pack_and_send_p5_message(pnf_t* pnf, nfapi_p4_p5_message_header_t* msg, uint32_t msg_len);
|
int pnf_pack_and_send_p5_message(pnf_t* pnf, nfapi_p4_p5_message_header_t* msg, uint32_t msg_len);
|
||||||
int pnf_pack_and_send_p4_message(pnf_t* pnf, nfapi_p4_p5_message_header_t* msg, uint32_t msg_len);
|
int pnf_pack_and_send_p4_message(pnf_t* pnf, nfapi_p4_p5_message_header_t* msg, uint32_t msg_len);
|
||||||
int pnf_send_message(pnf_t* pnf, uint8_t* msg, uint32_t msg_len, uint16_t stream_id);
|
int pnf_send_message(pnf_t* pnf, uint8_t* msg, uint32_t msg_len, uint16_t stream_id);
|
||||||
|
|||||||
@@ -29,15 +29,37 @@
|
|||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
uint16_t dl_conf_ontime;
|
uint16_t dl_conf_ontime;
|
||||||
|
uint16_t dl_tti_ontime;
|
||||||
uint16_t dl_conf_late;
|
uint16_t dl_conf_late;
|
||||||
|
uint16_t dl_tti_late;
|
||||||
uint16_t ul_conf_ontime;
|
uint16_t ul_conf_ontime;
|
||||||
|
uint16_t ul_tti_ontime;
|
||||||
uint16_t ul_conf_late;
|
uint16_t ul_conf_late;
|
||||||
|
uint16_t ul_tti_late;
|
||||||
uint16_t hi_dci0_ontime;
|
uint16_t hi_dci0_ontime;
|
||||||
uint16_t hi_dci0_late;
|
uint16_t hi_dci0_late;
|
||||||
|
uint16_t ul_dci_ontime;
|
||||||
|
uint16_t ul_dci_late;
|
||||||
uint16_t tx_ontime;
|
uint16_t tx_ontime;
|
||||||
uint16_t tx_late;
|
uint16_t tx_late;
|
||||||
|
uint16_t tx_data_ontime;
|
||||||
|
uint16_t tx_data_late;
|
||||||
} pnf_p7_stats_t;
|
} pnf_p7_stats_t;
|
||||||
|
|
||||||
|
|
||||||
|
typedef struct { // TODO: replace with the stats
|
||||||
|
uint16_t dl_tti_ontime;
|
||||||
|
uint16_t dl_tti_late;
|
||||||
|
uint16_t ul_tti_ontime;
|
||||||
|
uint16_t ul_tti_late;
|
||||||
|
uint16_t ul_dci_ontime;
|
||||||
|
uint16_t ul_dci_late;
|
||||||
|
uint16_t tx_data_ontime;
|
||||||
|
uint16_t tx_data_late;
|
||||||
|
} pnf_p7_nr_stats_t;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
uint8_t* buffer;
|
uint8_t* buffer;
|
||||||
uint16_t length;
|
uint16_t length;
|
||||||
@@ -82,7 +104,7 @@ typedef struct {
|
|||||||
pthread_mutex_t pack_mutex; // should we allow the client to specifiy
|
pthread_mutex_t pack_mutex; // should we allow the client to specifiy
|
||||||
|
|
||||||
nfapi_pnf_p7_subframe_buffer_t subframe_buffer[30/*NFAPI_MAX_TIMING_WINDOW_SIZE*/];
|
nfapi_pnf_p7_subframe_buffer_t subframe_buffer[30/*NFAPI_MAX_TIMING_WINDOW_SIZE*/];
|
||||||
|
nfapi_pnf_p7_slot_buffer_t slot_buffer[30/*NFAPI_MAX_TIMING_WINDOW_SIZE*/];
|
||||||
uint32_t sequence_number;
|
uint32_t sequence_number;
|
||||||
uint16_t max_num_segments;
|
uint16_t max_num_segments;
|
||||||
|
|
||||||
@@ -94,6 +116,12 @@ typedef struct {
|
|||||||
uint16_t sfn_sf;
|
uint16_t sfn_sf;
|
||||||
uint32_t sf_start_time_hr;
|
uint32_t sf_start_time_hr;
|
||||||
int32_t sfn_sf_shift;
|
int32_t sfn_sf_shift;
|
||||||
|
|
||||||
|
uint16_t sfn;
|
||||||
|
uint16_t slot;
|
||||||
|
uint16_t sfn_slot;
|
||||||
|
uint32_t slot_start_time_hr;
|
||||||
|
int32_t slot_shift;
|
||||||
|
|
||||||
uint8_t timing_info_period_counter;
|
uint8_t timing_info_period_counter;
|
||||||
uint8_t timing_info_aperiodic_send; // 0:false 1:true
|
uint8_t timing_info_aperiodic_send; // 0:false 1:true
|
||||||
@@ -104,18 +132,26 @@ typedef struct {
|
|||||||
uint32_t ul_config_jitter;
|
uint32_t ul_config_jitter;
|
||||||
uint32_t hi_dci0_jitter;
|
uint32_t hi_dci0_jitter;
|
||||||
uint32_t tx_jitter;
|
uint32_t tx_jitter;
|
||||||
|
|
||||||
|
//P7 NR
|
||||||
|
uint32_t dl_tti_jitter;
|
||||||
|
uint32_t ul_tti_jitter;
|
||||||
|
uint32_t ul_dci_jitter;
|
||||||
|
uint32_t tx_data_jitter;
|
||||||
|
|
||||||
uint32_t tick;
|
uint32_t tick;
|
||||||
pnf_p7_stats_t stats;
|
pnf_p7_stats_t stats;
|
||||||
|
pnf_p7_nr_stats_t nr_stats;
|
||||||
|
|
||||||
} pnf_p7_t;
|
} pnf_p7_t;
|
||||||
|
|
||||||
int pnf_p7_message_pump(pnf_p7_t* pnf_p7);
|
int pnf_p7_message_pump(pnf_p7_t* pnf_p7);
|
||||||
|
int pnf_nr_p7_message_pump(pnf_p7_t* pnf_p7);
|
||||||
int pnf_p7_pack_and_send_p7_message(pnf_p7_t* pnf_p7, nfapi_p7_message_header_t* msg, uint32_t msg_len);
|
int pnf_p7_pack_and_send_p7_message(pnf_p7_t* pnf_p7, nfapi_p7_message_header_t* msg, uint32_t msg_len);
|
||||||
int pnf_p7_send_message(pnf_p7_t* pnf_p7, uint8_t* msg, uint32_t msg_len);
|
int pnf_p7_send_message(pnf_p7_t* pnf_p7, uint8_t* msg, uint32_t msg_len);
|
||||||
|
|
||||||
|
|
||||||
|
int pnf_p7_slot_ind(pnf_p7_t* config, uint16_t phy_id, uint16_t sfn, uint16_t slot);
|
||||||
int pnf_p7_subframe_ind(pnf_p7_t* config, uint16_t phy_id, uint16_t sfn_sf);
|
int pnf_p7_subframe_ind(pnf_p7_t* config, uint16_t phy_id, uint16_t sfn_sf);
|
||||||
|
|
||||||
pnf_p7_rx_message_t* pnf_p7_rx_reassembly_queue_add_segment(pnf_p7_t* pnf_p7, pnf_p7_rx_reassembly_queue_t* queue, uint32_t rx_hr_time, uint16_t sequence_number, uint16_t segment_number, uint8_t m, uint8_t* data, uint16_t data_len);
|
pnf_p7_rx_message_t* pnf_p7_rx_reassembly_queue_add_segment(pnf_p7_t* pnf_p7, pnf_p7_rx_reassembly_queue_t* queue, uint32_t rx_hr_time, uint16_t sequence_number, uint16_t segment_number, uint8_t m, uint8_t* data, uint16_t data_len);
|
||||||
|
|||||||
@@ -25,8 +25,14 @@ extern "C" {
|
|||||||
#include "nfapi_interface.h"
|
#include "nfapi_interface.h"
|
||||||
#include "debug.h"
|
#include "debug.h"
|
||||||
#include <openair2/PHY_INTERFACE/IF_Module.h>
|
#include <openair2/PHY_INTERFACE/IF_Module.h>
|
||||||
|
#include "nfapi_nr_interface.h"
|
||||||
|
#include "nfapi_nr_interface_scf.h"
|
||||||
|
|
||||||
#include <sys/types.h>
|
#include <sys/types.h>
|
||||||
|
#include "openair1/PHY/defs_gNB.h"
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/*! This enum is used to describe the states of the pnf
|
/*! This enum is used to describe the states of the pnf
|
||||||
*/
|
*/
|
||||||
@@ -121,6 +127,7 @@ typedef struct nfapi_pnf_config
|
|||||||
* The client is expected to send the PNF_PARAM.response after receiving the
|
* The client is expected to send the PNF_PARAM.response after receiving the
|
||||||
* PNF_PARAM.request. This can be done in the call back.
|
* PNF_PARAM.request. This can be done in the call back.
|
||||||
*/
|
*/
|
||||||
|
int (*pnf_nr_param_req)(nfapi_pnf_config_t* config, nfapi_nr_pnf_param_request_t* req);
|
||||||
int (*pnf_param_req)(nfapi_pnf_config_t* config, nfapi_pnf_param_request_t* req);
|
int (*pnf_param_req)(nfapi_pnf_config_t* config, nfapi_pnf_param_request_t* req);
|
||||||
|
|
||||||
/*! A callback for the PNF_CONFIG.request
|
/*! A callback for the PNF_CONFIG.request
|
||||||
@@ -133,7 +140,8 @@ typedef struct nfapi_pnf_config
|
|||||||
* PNF_CONFIG.request. This can be done in the call back.
|
* PNF_CONFIG.request. This can be done in the call back.
|
||||||
*/
|
*/
|
||||||
int (*pnf_config_req)(nfapi_pnf_config_t* config, nfapi_pnf_config_request_t* req);
|
int (*pnf_config_req)(nfapi_pnf_config_t* config, nfapi_pnf_config_request_t* req);
|
||||||
|
int (*pnf_nr_config_req)(nfapi_pnf_config_t* config, nfapi_nr_pnf_config_request_t* req);
|
||||||
|
|
||||||
/*! A callback for the PNF_START.request
|
/*! A callback for the PNF_START.request
|
||||||
* \param config A pointer to the pnf configuration
|
* \param config A pointer to the pnf configuration
|
||||||
* \param req A data structure for the decoded PNF_CONFIG.request. This will have
|
* \param req A data structure for the decoded PNF_CONFIG.request. This will have
|
||||||
@@ -144,7 +152,8 @@ typedef struct nfapi_pnf_config
|
|||||||
* PNF_START.request. This can be done in the call back.
|
* PNF_START.request. This can be done in the call back.
|
||||||
*/
|
*/
|
||||||
int (*pnf_start_req)(nfapi_pnf_config_t* config, nfapi_pnf_start_request_t* req);
|
int (*pnf_start_req)(nfapi_pnf_config_t* config, nfapi_pnf_start_request_t* req);
|
||||||
|
int (*pnf_nr_start_req)(nfapi_pnf_config_t* config, nfapi_nr_pnf_start_request_t* req);
|
||||||
|
|
||||||
/*! A callback for the PNF_STOP.request
|
/*! A callback for the PNF_STOP.request
|
||||||
* \param config A pointer to the pnf configuration
|
* \param config A pointer to the pnf configuration
|
||||||
* \param req A data structure for the decoded PNF_STOP.request. This will have
|
* \param req A data structure for the decoded PNF_STOP.request. This will have
|
||||||
@@ -167,7 +176,8 @@ typedef struct nfapi_pnf_config
|
|||||||
* PARAM.request. This can be done in the call back.
|
* PARAM.request. This can be done in the call back.
|
||||||
*/
|
*/
|
||||||
int (*param_req)(nfapi_pnf_config_t* config, nfapi_pnf_phy_config_t* phy, nfapi_param_request_t* req);
|
int (*param_req)(nfapi_pnf_config_t* config, nfapi_pnf_phy_config_t* phy, nfapi_param_request_t* req);
|
||||||
|
int (*nr_param_req)(nfapi_pnf_config_t* config, nfapi_pnf_phy_config_t* phy, nfapi_nr_param_request_scf_t* req);
|
||||||
|
|
||||||
/*! A callback for the CONFIG.request
|
/*! A callback for the CONFIG.request
|
||||||
* \param config A pointer to the pnf configuration
|
* \param config A pointer to the pnf configuration
|
||||||
* \param phy A pointer to the pnf phy configuration
|
* \param phy A pointer to the pnf phy configuration
|
||||||
@@ -179,6 +189,7 @@ typedef struct nfapi_pnf_config
|
|||||||
* CONFIG.request. This can be done in the call back.
|
* CONFIG.request. This can be done in the call back.
|
||||||
*/
|
*/
|
||||||
int (*config_req)(nfapi_pnf_config_t* config, nfapi_pnf_phy_config_t* phy, nfapi_config_request_t* req);
|
int (*config_req)(nfapi_pnf_config_t* config, nfapi_pnf_phy_config_t* phy, nfapi_config_request_t* req);
|
||||||
|
int (*nr_config_req)(nfapi_pnf_config_t* config, nfapi_pnf_phy_config_t* phy, nfapi_nr_config_request_scf_t* req);
|
||||||
|
|
||||||
/*! A callback for the START.request
|
/*! A callback for the START.request
|
||||||
* \param config A pointer to the pnf configuration
|
* \param config A pointer to the pnf configuration
|
||||||
@@ -190,8 +201,8 @@ typedef struct nfapi_pnf_config
|
|||||||
* The client is expected to send the START.response after the client has received the
|
* The client is expected to send the START.response after the client has received the
|
||||||
* first subframe indication from FAPI.
|
* first subframe indication from FAPI.
|
||||||
*/
|
*/
|
||||||
int (*start_req)(nfapi_pnf_config_t* config, nfapi_pnf_phy_config_t* phy, nfapi_start_request_t* req);
|
int (*start_req)(nfapi_pnf_config_t* config, nfapi_pnf_phy_config_t* phy, nfapi_start_request_t* req);
|
||||||
|
int (*nr_start_req)(nfapi_pnf_config_t* config, nfapi_pnf_phy_config_t* phy, nfapi_nr_start_request_scf_t* req);
|
||||||
/*! A callback for the STOP.request
|
/*! A callback for the STOP.request
|
||||||
* \param config A pointer to the pnf configuration
|
* \param config A pointer to the pnf configuration
|
||||||
* \param phy A pointer to the pnf phy configuration
|
* \param phy A pointer to the pnf phy configuration
|
||||||
@@ -203,7 +214,8 @@ typedef struct nfapi_pnf_config
|
|||||||
* STOP.request. This can be done in the call back.
|
* STOP.request. This can be done in the call back.
|
||||||
*/
|
*/
|
||||||
int (*stop_req)(nfapi_pnf_config_t* config, nfapi_pnf_phy_config_t* phy, nfapi_stop_request_t* req);
|
int (*stop_req)(nfapi_pnf_config_t* config, nfapi_pnf_phy_config_t* phy, nfapi_stop_request_t* req);
|
||||||
|
int (*nr_stop_req)(nfapi_pnf_config_t* config, nfapi_pnf_phy_config_t* phy, nfapi_nr_stop_request_t* req);
|
||||||
|
|
||||||
/*! A callback for the MEASUREMENT.request
|
/*! A callback for the MEASUREMENT.request
|
||||||
* \param config A pointer to the pnf configuration
|
* \param config A pointer to the pnf configuration
|
||||||
* \param phy A pointer to the pnf phy configuration
|
* \param phy A pointer to the pnf phy configuration
|
||||||
@@ -355,6 +367,7 @@ int nfapi_pnf_config_destroy(nfapi_pnf_config_t* config);
|
|||||||
* \endcode
|
* \endcode
|
||||||
*/
|
*/
|
||||||
int nfapi_pnf_start(nfapi_pnf_config_t* config);
|
int nfapi_pnf_start(nfapi_pnf_config_t* config);
|
||||||
|
int nfapi_nr_pnf_start(nfapi_pnf_config_t* config);
|
||||||
|
|
||||||
/*! Stop the PNF library.
|
/*! Stop the PNF library.
|
||||||
* \param config A pointer to the pnf configuration
|
* \param config A pointer to the pnf configuration
|
||||||
@@ -371,6 +384,8 @@ int nfapi_pnf_stop(nfapi_pnf_config_t* config);
|
|||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
int nfapi_pnf_pnf_param_resp(nfapi_pnf_config_t* config, nfapi_pnf_param_response_t* resp);
|
int nfapi_pnf_pnf_param_resp(nfapi_pnf_config_t* config, nfapi_pnf_param_response_t* resp);
|
||||||
|
int nfapi_nr_pnf_pnf_param_resp(nfapi_pnf_config_t* config, nfapi_nr_pnf_param_response_t* resp);
|
||||||
|
|
||||||
|
|
||||||
/*! Send the PNF_CONFIG.response
|
/*! Send the PNF_CONFIG.response
|
||||||
* \param config A pointer to a pnf configuraiton
|
* \param config A pointer to a pnf configuraiton
|
||||||
@@ -379,6 +394,7 @@ int nfapi_pnf_pnf_param_resp(nfapi_pnf_config_t* config, nfapi_pnf_param_respons
|
|||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
int nfapi_pnf_pnf_config_resp(nfapi_pnf_config_t* config, nfapi_pnf_config_response_t* resp);
|
int nfapi_pnf_pnf_config_resp(nfapi_pnf_config_t* config, nfapi_pnf_config_response_t* resp);
|
||||||
|
int nfapi_nr_pnf_pnf_config_resp(nfapi_pnf_config_t* config, nfapi_nr_pnf_config_response_t* resp);
|
||||||
|
|
||||||
/*! Send the PNF_START.response
|
/*! Send the PNF_START.response
|
||||||
* \param config A pointer to a pnf configuraiton
|
* \param config A pointer to a pnf configuraiton
|
||||||
@@ -387,7 +403,7 @@ int nfapi_pnf_pnf_config_resp(nfapi_pnf_config_t* config, nfapi_pnf_config_respo
|
|||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
int nfapi_pnf_pnf_start_resp(nfapi_pnf_config_t* config, nfapi_pnf_start_response_t* resp);
|
int nfapi_pnf_pnf_start_resp(nfapi_pnf_config_t* config, nfapi_pnf_start_response_t* resp);
|
||||||
|
int nfapi_nr_pnf_pnf_start_resp(nfapi_pnf_config_t* config, nfapi_nr_pnf_start_response_t* resp);
|
||||||
/*! Send the PNF_STOP.response
|
/*! Send the PNF_STOP.response
|
||||||
* \param config A pointer to a pnf configuraiton
|
* \param config A pointer to a pnf configuraiton
|
||||||
* \param resp A pointer to the message structure
|
* \param resp A pointer to the message structure
|
||||||
@@ -403,6 +419,7 @@ int nfapi_pnf_pnf_stop_resp(nfapi_pnf_config_t* config, nfapi_pnf_stop_response_
|
|||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
int nfapi_pnf_param_resp(nfapi_pnf_config_t* config, nfapi_param_response_t* resp);
|
int nfapi_pnf_param_resp(nfapi_pnf_config_t* config, nfapi_param_response_t* resp);
|
||||||
|
int nfapi_nr_pnf_param_resp(nfapi_pnf_config_t* config, nfapi_nr_param_response_scf_t* resp);
|
||||||
|
|
||||||
/*! Send the CONFIG.response
|
/*! Send the CONFIG.response
|
||||||
* \param config A pointer to a pnf configuraiton
|
* \param config A pointer to a pnf configuraiton
|
||||||
@@ -411,7 +428,7 @@ int nfapi_pnf_param_resp(nfapi_pnf_config_t* config, nfapi_param_response_t* res
|
|||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
int nfapi_pnf_config_resp(nfapi_pnf_config_t* config, nfapi_config_response_t* resp);
|
int nfapi_pnf_config_resp(nfapi_pnf_config_t* config, nfapi_config_response_t* resp);
|
||||||
|
int nfapi_nr_pnf_config_resp(nfapi_pnf_config_t* config, nfapi_nr_config_response_scf_t* resp);
|
||||||
/*! Send the START.response
|
/*! Send the START.response
|
||||||
* \param config A pointer to a pnf configuraiton
|
* \param config A pointer to a pnf configuraiton
|
||||||
* \param resp A pointer to the message structure
|
* \param resp A pointer to the message structure
|
||||||
@@ -419,6 +436,7 @@ int nfapi_pnf_config_resp(nfapi_pnf_config_t* config, nfapi_config_response_t* r
|
|||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
int nfapi_pnf_start_resp(nfapi_pnf_config_t* config, nfapi_start_response_t* resp);
|
int nfapi_pnf_start_resp(nfapi_pnf_config_t* config, nfapi_start_response_t* resp);
|
||||||
|
int nfapi_nr_pnf_start_resp(nfapi_pnf_config_t* config, nfapi_nr_start_response_scf_t* resp);
|
||||||
|
|
||||||
/*! Send the STOP.response
|
/*! Send the STOP.response
|
||||||
* \param config A pointer to a pnf configuraiton
|
* \param config A pointer to a pnf configuraiton
|
||||||
@@ -550,6 +568,22 @@ typedef struct
|
|||||||
nfapi_ue_release_request_t* ue_release_req;
|
nfapi_ue_release_request_t* ue_release_req;
|
||||||
} nfapi_pnf_p7_subframe_buffer_t;
|
} nfapi_pnf_p7_subframe_buffer_t;
|
||||||
|
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
//uint16_t sfn_slot
|
||||||
|
int16_t sfn;
|
||||||
|
int16_t slot;
|
||||||
|
//TODO: Change P7 structs to NR
|
||||||
|
nfapi_nr_dl_tti_request_t* dl_tti_req;//nfapi_dl_config_request_t* dl_config_req;
|
||||||
|
nfapi_nr_ul_tti_request_t* ul_tti_req;//nfapi_ul_config_request_t* ul_config_req;
|
||||||
|
nfapi_nr_ul_dci_request_t* ul_dci_req;//nfapi_hi_dci0_request_t* hi_dci0_req;
|
||||||
|
nfapi_nr_tx_data_request_t* tx_data_req;//nfapi_tx_request_t* tx_req;
|
||||||
|
|
||||||
|
//TODO: check these two later
|
||||||
|
//nfapi_lbt_dl_config_request_t* lbt_dl_config_req;
|
||||||
|
//nfapi_ue_release_request_t* ue_release_req;
|
||||||
|
} nfapi_pnf_p7_slot_buffer_t;
|
||||||
|
|
||||||
typedef struct nfapi_pnf_p7_config nfapi_pnf_p7_config_t;
|
typedef struct nfapi_pnf_p7_config nfapi_pnf_p7_config_t;
|
||||||
|
|
||||||
/*! The nfapi PNF PHY P7 configuration information created using the nfapi_pnf_p7_create function
|
/*! The nfapi PNF PHY P7 configuration information created using the nfapi_pnf_p7_create function
|
||||||
@@ -602,6 +636,8 @@ typedef struct nfapi_pnf_p7_config
|
|||||||
/*! The dummy subframe buffer structure that should be used in case there
|
/*! The dummy subframe buffer structure that should be used in case there
|
||||||
* are no 'valid' subframe messages */
|
* are no 'valid' subframe messages */
|
||||||
nfapi_pnf_p7_subframe_buffer_t dummy_subframe;
|
nfapi_pnf_p7_subframe_buffer_t dummy_subframe;
|
||||||
|
|
||||||
|
nfapi_pnf_p7_slot_buffer_t dummy_slot; // defining a slot equivalent for now
|
||||||
|
|
||||||
/*! Configuration options for the p7 pack unpack functions*/
|
/*! Configuration options for the p7 pack unpack functions*/
|
||||||
nfapi_p7_codec_config_t codec_config;
|
nfapi_p7_codec_config_t codec_config;
|
||||||
@@ -611,6 +647,7 @@ typedef struct nfapi_pnf_p7_config
|
|||||||
|
|
||||||
// tdb : if these should be public
|
// tdb : if these should be public
|
||||||
uint16_t subframe_buffer_size;
|
uint16_t subframe_buffer_size;
|
||||||
|
uint16_t slot_buffer_size;
|
||||||
uint8_t timing_info_mode_periodic; // 0:false 1:true
|
uint8_t timing_info_mode_periodic; // 0:false 1:true
|
||||||
uint8_t timing_info_mode_aperiodic; // 0:false 1:true
|
uint8_t timing_info_mode_aperiodic; // 0:false 1:true
|
||||||
uint8_t timing_info_period; // 1..225 in subframes
|
uint8_t timing_info_period; // 1..225 in subframes
|
||||||
@@ -620,6 +657,7 @@ typedef struct nfapi_pnf_p7_config
|
|||||||
* \param req A pointer to the dl config request message structure
|
* \param req A pointer to the dl config request message structure
|
||||||
* \return not currently used
|
* \return not currently used
|
||||||
*/
|
*/
|
||||||
|
int (*dl_tti_req_fn)(gNB_L1_rxtx_proc_t *proc,nfapi_pnf_p7_config_t* config, nfapi_nr_dl_tti_request_t* req);
|
||||||
int (*dl_config_req)(L1_rxtx_proc_t *proc,nfapi_pnf_p7_config_t* config, nfapi_dl_config_request_t* req);
|
int (*dl_config_req)(L1_rxtx_proc_t *proc,nfapi_pnf_p7_config_t* config, nfapi_dl_config_request_t* req);
|
||||||
|
|
||||||
/*! A callback for the UL_CONFIG.request
|
/*! A callback for the UL_CONFIG.request
|
||||||
@@ -627,6 +665,7 @@ typedef struct nfapi_pnf_p7_config
|
|||||||
* \param req A pointer to the ul config request message structure
|
* \param req A pointer to the ul config request message structure
|
||||||
* \return not currently used
|
* \return not currently used
|
||||||
*/
|
*/
|
||||||
|
int (*ul_tti_req_fn)(gNB_L1_rxtx_proc_t *proc,nfapi_pnf_p7_config_t* config, nfapi_nr_ul_tti_request_t* req);
|
||||||
int (*ul_config_req)(L1_rxtx_proc_t *proc,nfapi_pnf_p7_config_t* config, nfapi_ul_config_request_t* req);
|
int (*ul_config_req)(L1_rxtx_proc_t *proc,nfapi_pnf_p7_config_t* config, nfapi_ul_config_request_t* req);
|
||||||
|
|
||||||
/*! A callback for the HI_DCI0.request
|
/*! A callback for the HI_DCI0.request
|
||||||
@@ -634,8 +673,9 @@ typedef struct nfapi_pnf_p7_config
|
|||||||
* \param req A pointer to the hi dci0 request message structure
|
* \param req A pointer to the hi dci0 request message structure
|
||||||
* \return not currently used
|
* \return not currently used
|
||||||
*/
|
*/
|
||||||
|
int (*ul_dci_req_fn)(gNB_L1_rxtx_proc_t *proc,nfapi_pnf_p7_config_t* config, nfapi_nr_ul_dci_request_t* req);
|
||||||
int (*hi_dci0_req)(L1_rxtx_proc_t *proc,nfapi_pnf_p7_config_t* config, nfapi_hi_dci0_request_t* req);
|
int (*hi_dci0_req)(L1_rxtx_proc_t *proc,nfapi_pnf_p7_config_t* config, nfapi_hi_dci0_request_t* req);
|
||||||
|
|
||||||
/*! A callback for the TX_REQ.request
|
/*! A callback for the TX_REQ.request
|
||||||
* \param config A poiner to the PNF P7 config
|
* \param config A poiner to the PNF P7 config
|
||||||
* \param req A pointer to the tx request message structure
|
* \param req A pointer to the tx request message structure
|
||||||
@@ -645,6 +685,7 @@ typedef struct nfapi_pnf_p7_config
|
|||||||
* will 'keep' the pointers until they are transmitted the callee should set the pointers in the req to 0
|
* will 'keep' the pointers until they are transmitted the callee should set the pointers in the req to 0
|
||||||
* and then use the p7 codec config free function to release the pdu's when appropriate.
|
* and then use the p7 codec config free function to release the pdu's when appropriate.
|
||||||
*/
|
*/
|
||||||
|
int (*tx_data_req_fn)(nfapi_pnf_p7_config_t* config, nfapi_nr_tx_data_request_t* req);
|
||||||
int (*tx_req)(nfapi_pnf_p7_config_t* config, nfapi_tx_request_t* req);
|
int (*tx_req)(nfapi_pnf_p7_config_t* config, nfapi_tx_request_t* req);
|
||||||
|
|
||||||
/*! A callback for the LBT_DL_CONFIG.request
|
/*! A callback for the LBT_DL_CONFIG.request
|
||||||
@@ -708,6 +749,7 @@ int nfapi_pnf_p7_config_destroy(nfapi_pnf_p7_config_t* config);
|
|||||||
* This function will not return until nfapi_pnf_p7_stop is called.
|
* This function will not return until nfapi_pnf_p7_stop is called.
|
||||||
*/
|
*/
|
||||||
int nfapi_pnf_p7_start(nfapi_pnf_p7_config_t* config);
|
int nfapi_pnf_p7_start(nfapi_pnf_p7_config_t* config);
|
||||||
|
int nfapi_nr_pnf_p7_start(nfapi_pnf_p7_config_t* config);
|
||||||
|
|
||||||
/*! Stop the PNF P7 library.
|
/*! Stop the PNF P7 library.
|
||||||
* \param config A pointer to a PNF P7 config
|
* \param config A pointer to a PNF P7 config
|
||||||
@@ -717,6 +759,21 @@ int nfapi_pnf_p7_start(nfapi_pnf_p7_config_t* config);
|
|||||||
*/
|
*/
|
||||||
int nfapi_pnf_p7_stop(nfapi_pnf_p7_config_t* config);
|
int nfapi_pnf_p7_stop(nfapi_pnf_p7_config_t* config);
|
||||||
|
|
||||||
|
/*! NR Slot indication
|
||||||
|
* message copied from nfapi_pnf_p7_subframe_ind
|
||||||
|
* \param config A pointer to a PNF P7 config
|
||||||
|
* \param phy_id The phy_id for the phy instance
|
||||||
|
* \param sfn_sf The SFN and SF in the format of FAPI
|
||||||
|
* \return 0 means success, -1 means failure
|
||||||
|
*
|
||||||
|
* The client should call the subframe indication every 1ms. The PNF will
|
||||||
|
* respond by invoking the pnf p7 subframe callbacks with the messages from the subframe buffer
|
||||||
|
*
|
||||||
|
* If messages are not in the subframe buffer, they dummy subframe messages will be sent
|
||||||
|
*/
|
||||||
|
int nfapi_pnf_p7_slot_ind(nfapi_pnf_p7_config_t* config, uint16_t phy_id, uint16_t sfn, uint16_t slot);
|
||||||
|
|
||||||
|
|
||||||
/*! Subframe indication
|
/*! Subframe indication
|
||||||
* \param config A pointer to a PNF P7 config
|
* \param config A pointer to a PNF P7 config
|
||||||
* \param phy_id The phy_id for the phy instance
|
* \param phy_id The phy_id for the phy instance
|
||||||
|
|||||||
@@ -26,9 +26,29 @@
|
|||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
#include <errno.h>
|
#include <errno.h>
|
||||||
|
#include "nfapi_nr_interface.h"
|
||||||
|
#include "nfapi_nr_interface_scf.h"
|
||||||
#include "pnf.h"
|
#include "pnf.h"
|
||||||
|
|
||||||
|
# if 1 // for hard-code (remove later)
|
||||||
|
#include "COMMON/platform_types.h"
|
||||||
|
#include "COMMON/platform_constants.h"
|
||||||
|
#include "common/ran_context.h"
|
||||||
|
|
||||||
|
#include "common/utils/LOG/log.h"
|
||||||
|
#include "common/utils/LOG/vcd_signal_dumper.h"
|
||||||
|
|
||||||
|
#include "NR_BCCH-BCH-Message.h"
|
||||||
|
#include "NR_ServingCellConfigCommon.h"
|
||||||
|
|
||||||
|
#include "LAYER2/NR_MAC_gNB/mac_proto.h"
|
||||||
|
#include "SCHED_NR/phy_frame_config_nr.h"
|
||||||
|
|
||||||
|
#include "NR_MIB.h"
|
||||||
|
#include "openair2/LAYER2/NR_MAC_COMMON/nr_mac_common.h"
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
#define MAX_SCTP_STREAMS 16
|
#define MAX_SCTP_STREAMS 16
|
||||||
|
|
||||||
void nfapi_pnf_phy_config_delete_all(nfapi_pnf_config_t* config)
|
void nfapi_pnf_phy_config_delete_all(nfapi_pnf_config_t* config)
|
||||||
@@ -63,6 +83,50 @@ nfapi_pnf_phy_config_t* nfapi_pnf_phy_config_find(nfapi_pnf_config_t* config, ui
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void pnf_nr_handle_pnf_param_request(pnf_t* pnf, void *pRecvMsg, int recvMsgLen)
|
||||||
|
{
|
||||||
|
// ensure it's valid
|
||||||
|
if (pRecvMsg == NULL || pnf == NULL)
|
||||||
|
{
|
||||||
|
NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s: NULL parameters\n", __FUNCTION__);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
nfapi_nr_pnf_param_request_t req;
|
||||||
|
|
||||||
|
NFAPI_TRACE(NFAPI_TRACE_INFO, "PNF_PARAM.request received\n");
|
||||||
|
|
||||||
|
// unpack the message
|
||||||
|
if (nfapi_nr_p5_message_unpack(pRecvMsg, recvMsgLen, &req, sizeof(nfapi_nr_pnf_param_request_t), &pnf->_public.codec_config) >= 0)
|
||||||
|
{
|
||||||
|
if(pnf->_public.state == NFAPI_PNF_IDLE)
|
||||||
|
{
|
||||||
|
if(pnf->_public.pnf_nr_param_req)
|
||||||
|
{
|
||||||
|
(pnf->_public.pnf_nr_param_req)(&pnf->_public, &req);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s: PNF not in IDLE state\n", __FUNCTION__);
|
||||||
|
|
||||||
|
nfapi_nr_pnf_param_response_t resp;
|
||||||
|
memset(&resp, 0, sizeof(resp));
|
||||||
|
resp.header.message_id = NFAPI_NR_PHY_MSG_TYPE_PNF_PARAM_RESPONSE;
|
||||||
|
resp.error_code = NFAPI_MSG_INVALID_STATE;
|
||||||
|
nfapi_nr_pnf_pnf_param_resp(&pnf->_public, &resp);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s: Unpack message failed, ignoring\n", __FUNCTION__);
|
||||||
|
}
|
||||||
|
|
||||||
|
if(req.vendor_extension)
|
||||||
|
pnf->_public.codec_config.deallocate(req.vendor_extension);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void pnf_handle_pnf_param_request(pnf_t* pnf, void *pRecvMsg, int recvMsgLen)
|
void pnf_handle_pnf_param_request(pnf_t* pnf, void *pRecvMsg, int recvMsgLen)
|
||||||
{
|
{
|
||||||
// ensure it's valid
|
// ensure it's valid
|
||||||
@@ -173,6 +237,72 @@ void pnf_handle_pnf_config_request(pnf_t* pnf, void *pRecvMsg, int recvMsgLen)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void pnf_nr_handle_pnf_config_request(pnf_t* pnf, void *pRecvMsg, int recvMsgLen)
|
||||||
|
{
|
||||||
|
|
||||||
|
|
||||||
|
// ensure it's valid
|
||||||
|
if (pRecvMsg == NULL || pnf == NULL)
|
||||||
|
{
|
||||||
|
NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s: NULL parameters\n", __FUNCTION__);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
nfapi_nr_pnf_config_request_t req;
|
||||||
|
|
||||||
|
NFAPI_TRACE(NFAPI_TRACE_INFO, "PNF_CONFIG.request received\n");
|
||||||
|
|
||||||
|
// unpack the message
|
||||||
|
if (nfapi_nr_p5_message_unpack(pRecvMsg, recvMsgLen, &req, sizeof(req), &pnf->_public.codec_config) >= 0)
|
||||||
|
{
|
||||||
|
// ensure correct state
|
||||||
|
if(pnf->_public.state != NFAPI_PNF_RUNNING)
|
||||||
|
{
|
||||||
|
// delete the phy records
|
||||||
|
nfapi_pnf_phy_config_delete_all(&pnf->_public);
|
||||||
|
|
||||||
|
// create the phy records
|
||||||
|
if (req.pnf_phy_rf_config.tl.tag == NFAPI_PNF_PHY_RF_TAG)
|
||||||
|
{
|
||||||
|
int i = 0;
|
||||||
|
for(i = 0; i < req.pnf_phy_rf_config.number_phy_rf_config_info; ++i)
|
||||||
|
{
|
||||||
|
nfapi_pnf_phy_config_t* phy = (nfapi_pnf_phy_config_t*)malloc(sizeof(nfapi_pnf_phy_config_t));
|
||||||
|
memset(phy, 0, sizeof(nfapi_pnf_phy_config_t));
|
||||||
|
|
||||||
|
phy->state = NFAPI_PNF_PHY_IDLE;
|
||||||
|
phy->phy_id = req.pnf_phy_rf_config.phy_rf_config[i].phy_id;
|
||||||
|
|
||||||
|
nfapi_pnf_phy_config_add(&(pnf->_public), phy);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if(pnf->_public.pnf_nr_config_req)
|
||||||
|
{
|
||||||
|
(pnf->_public.pnf_nr_config_req)(&(pnf->_public), &req);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s: PNF not in correct state: %d\n", __FUNCTION__, pnf->_public.state);
|
||||||
|
|
||||||
|
nfapi_nr_pnf_config_response_t resp;
|
||||||
|
memset(&resp, 0, sizeof(resp));
|
||||||
|
resp.header.message_id = NFAPI_PNF_CONFIG_RESPONSE;
|
||||||
|
resp.error_code = NFAPI_MSG_INVALID_STATE;
|
||||||
|
nfapi_nr_pnf_pnf_config_resp(&(pnf->_public), &resp);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s: Unpack message failed, ignoring\n", __FUNCTION__);
|
||||||
|
}
|
||||||
|
|
||||||
|
if(req.vendor_extension)
|
||||||
|
pnf->_public.codec_config.deallocate(req.vendor_extension);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void pnf_handle_pnf_start_request(pnf_t* pnf, void *pRecvMsg, int recvMsgLen)
|
void pnf_handle_pnf_start_request(pnf_t* pnf, void *pRecvMsg, int recvMsgLen)
|
||||||
{
|
{
|
||||||
// ensure it's valid
|
// ensure it's valid
|
||||||
@@ -215,6 +345,48 @@ void pnf_handle_pnf_start_request(pnf_t* pnf, void *pRecvMsg, int recvMsgLen)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void pnf_nr_handle_pnf_start_request(pnf_t* pnf, void *pRecvMsg, int recvMsgLen)
|
||||||
|
{
|
||||||
|
// ensure it's valid
|
||||||
|
if (pRecvMsg == NULL || pnf == NULL)
|
||||||
|
{
|
||||||
|
NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s: NULL parameters\n", __FUNCTION__);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
nfapi_nr_pnf_start_request_t req;
|
||||||
|
|
||||||
|
NFAPI_TRACE(NFAPI_TRACE_INFO, "PNF_START.request Received\n");
|
||||||
|
|
||||||
|
// unpack the message
|
||||||
|
if (nfapi_nr_p5_message_unpack(pRecvMsg, recvMsgLen, &req, sizeof(req), &pnf->_public.codec_config) >= 0)
|
||||||
|
{
|
||||||
|
if(pnf->_public.state == NFAPI_PNF_CONFIGURED)
|
||||||
|
{
|
||||||
|
if(pnf->_public.pnf_nr_start_req)
|
||||||
|
{
|
||||||
|
(pnf->_public.pnf_nr_start_req)(&(pnf->_public), &req);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
nfapi_nr_pnf_start_response_t resp;
|
||||||
|
memset(&resp, 0, sizeof(resp));
|
||||||
|
resp.header.message_id = NFAPI_PNF_START_RESPONSE;
|
||||||
|
resp.error_code = NFAPI_MSG_INVALID_STATE;
|
||||||
|
nfapi_nr_pnf_pnf_start_resp(&(pnf->_public), &resp);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s: Unpack message failed, ignoring\n", __FUNCTION__);
|
||||||
|
}
|
||||||
|
|
||||||
|
if(req.vendor_extension)
|
||||||
|
pnf->_public.codec_config.deallocate(req.vendor_extension);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void pnf_handle_pnf_stop_request(pnf_t* pnf, void *pRecvMsg, int recvMsgLen)
|
void pnf_handle_pnf_stop_request(pnf_t* pnf, void *pRecvMsg, int recvMsgLen)
|
||||||
{
|
{
|
||||||
// ensure it's valid
|
// ensure it's valid
|
||||||
@@ -330,6 +502,78 @@ void pnf_handle_param_request(pnf_t* pnf, void *pRecvMsg, int recvMsgLen)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void pnf_nr_handle_param_request(pnf_t* pnf, void *pRecvMsg, int recvMsgLen)
|
||||||
|
{
|
||||||
|
// ensure it's valid
|
||||||
|
if (pRecvMsg == NULL || pnf == NULL)
|
||||||
|
{
|
||||||
|
NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s: NULL parameters\n", __FUNCTION__);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
nfapi_nr_param_request_scf_t req;
|
||||||
|
|
||||||
|
nfapi_pnf_config_t* config = &(pnf->_public);
|
||||||
|
|
||||||
|
NFAPI_TRACE(NFAPI_TRACE_INFO, "PARAM.request received\n");
|
||||||
|
|
||||||
|
// unpack the message
|
||||||
|
if (nfapi_nr_p5_message_unpack(pRecvMsg, recvMsgLen, &req, sizeof(req), &config->codec_config) >= 0)
|
||||||
|
{
|
||||||
|
if(config->state == NFAPI_PNF_RUNNING)
|
||||||
|
{
|
||||||
|
nfapi_pnf_phy_config_t* phy = nfapi_pnf_phy_config_find(config, req.header.phy_id);
|
||||||
|
if(phy)
|
||||||
|
{
|
||||||
|
if(phy->state == NFAPI_PNF_PHY_IDLE)
|
||||||
|
{
|
||||||
|
if(config->nr_param_req)
|
||||||
|
{
|
||||||
|
(config->nr_param_req)(config, phy, &req);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
nfapi_nr_param_response_scf_t resp;
|
||||||
|
memset(&resp, 0, sizeof(resp));
|
||||||
|
resp.header.message_id = NFAPI_NR_PHY_MSG_TYPE_PARAM_RESPONSE;
|
||||||
|
resp.header.phy_id = req.header.phy_id;
|
||||||
|
resp.error_code = NFAPI_MSG_INVALID_STATE;
|
||||||
|
nfapi_nr_pnf_param_resp(config, &resp);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
nfapi_nr_param_response_scf_t resp;
|
||||||
|
memset(&resp, 0, sizeof(resp));
|
||||||
|
resp.header.message_id = NFAPI_NR_PHY_MSG_TYPE_PARAM_RESPONSE;
|
||||||
|
resp.header.phy_id = req.header.phy_id;
|
||||||
|
resp.error_code = NFAPI_MSG_INVALID_CONFIG;
|
||||||
|
nfapi_nr_pnf_param_resp(config, &resp);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
nfapi_nr_param_response_scf_t resp;
|
||||||
|
memset(&resp, 0, sizeof(resp));
|
||||||
|
resp.header.message_id = NFAPI_NR_PHY_MSG_TYPE_PARAM_RESPONSE;
|
||||||
|
resp.header.phy_id = req.header.phy_id;
|
||||||
|
resp.error_code = NFAPI_MSG_INVALID_STATE;
|
||||||
|
nfapi_nr_pnf_param_resp(config, &resp);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s: Unpack message failed, ignoring\n", __FUNCTION__);
|
||||||
|
}
|
||||||
|
|
||||||
|
if(req.vendor_extension)
|
||||||
|
pnf->_public.codec_config.deallocate(req.vendor_extension);
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void pnf_handle_config_request(pnf_t* pnf, void *pRecvMsg, int recvMsgLen)
|
void pnf_handle_config_request(pnf_t* pnf, void *pRecvMsg, int recvMsgLen)
|
||||||
{
|
{
|
||||||
|
|
||||||
@@ -401,6 +645,85 @@ void pnf_handle_config_request(pnf_t* pnf, void *pRecvMsg, int recvMsgLen)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void pnf_nr_handle_config_request(pnf_t* pnf, void *pRecvMsg, int recvMsgLen)
|
||||||
|
{
|
||||||
|
|
||||||
|
// ensure it's valid
|
||||||
|
if (pRecvMsg == NULL || pnf == NULL)
|
||||||
|
{
|
||||||
|
NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s: NULL parameters\n", __FUNCTION__);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
nfapi_nr_config_request_scf_t req;
|
||||||
|
|
||||||
|
NFAPI_TRACE(NFAPI_TRACE_INFO, "CONFIG.request received\n");
|
||||||
|
|
||||||
|
nfapi_pnf_config_t* config = &(pnf->_public);
|
||||||
|
|
||||||
|
// unpack the message
|
||||||
|
if (nfapi_nr_p5_message_unpack(pRecvMsg, recvMsgLen, &req, sizeof(req), &config->codec_config) >= 0)
|
||||||
|
{
|
||||||
|
if(config->state == NFAPI_PNF_RUNNING)
|
||||||
|
{
|
||||||
|
nfapi_pnf_phy_config_t* phy = nfapi_pnf_phy_config_find(config, req.header.phy_id);
|
||||||
|
|
||||||
|
#if 0 // emulate set_config TLV reception (hard-code)
|
||||||
|
int tdd_return = set_tdd_config_nr(&req, 1, 7, 6, 2, 4);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
if(phy)
|
||||||
|
{
|
||||||
|
if(phy->state != NFAPI_PNF_PHY_RUNNING)
|
||||||
|
{
|
||||||
|
if(config->nr_config_req)
|
||||||
|
{
|
||||||
|
(config->nr_config_req)(config, phy, &req);
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
nfapi_nr_config_response_scf_t resp;
|
||||||
|
memset(&resp, 0, sizeof(resp));
|
||||||
|
resp.header.message_id = NFAPI_CONFIG_RESPONSE;
|
||||||
|
resp.header.phy_id = req.header.phy_id;
|
||||||
|
resp.error_code = NFAPI_MSG_INVALID_STATE;
|
||||||
|
nfapi_nr_pnf_config_resp(config, &resp);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
nfapi_nr_config_response_scf_t resp;
|
||||||
|
memset(&resp, 0, sizeof(resp));
|
||||||
|
resp.header.message_id = NFAPI_CONFIG_RESPONSE;
|
||||||
|
resp.header.phy_id = req.header.phy_id;
|
||||||
|
resp.error_code = NFAPI_MSG_INVALID_CONFIG;
|
||||||
|
nfapi_nr_pnf_config_resp(config, &resp);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
nfapi_nr_config_response_scf_t resp;
|
||||||
|
memset(&resp, 0, sizeof(resp));
|
||||||
|
resp.header.message_id = NFAPI_CONFIG_RESPONSE;
|
||||||
|
resp.header.phy_id = req.header.phy_id;
|
||||||
|
resp.error_code = NFAPI_MSG_INVALID_STATE;
|
||||||
|
nfapi_nr_pnf_config_resp(config, &resp);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s: Unpack message failed, ignoring\n", __FUNCTION__);
|
||||||
|
}
|
||||||
|
|
||||||
|
if(req.vendor_extension)
|
||||||
|
pnf->_public.codec_config.deallocate(req.vendor_extension);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void pnf_handle_start_request(pnf_t* pnf, void *pRecvMsg, int recvMsgLen)
|
void pnf_handle_start_request(pnf_t* pnf, void *pRecvMsg, int recvMsgLen)
|
||||||
{
|
{
|
||||||
// ensure it's valid
|
// ensure it's valid
|
||||||
@@ -472,6 +795,77 @@ void pnf_handle_start_request(pnf_t* pnf, void *pRecvMsg, int recvMsgLen)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void pnf_nr_handle_start_request(pnf_t* pnf, void *pRecvMsg, int recvMsgLen)
|
||||||
|
{
|
||||||
|
// ensure it's valid
|
||||||
|
if (pRecvMsg == NULL || pnf == NULL)
|
||||||
|
{
|
||||||
|
NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s: NULL parameters\n", __FUNCTION__);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
nfapi_nr_start_request_scf_t req;
|
||||||
|
|
||||||
|
nfapi_pnf_config_t* config = &(pnf->_public);
|
||||||
|
|
||||||
|
NFAPI_TRACE(NFAPI_TRACE_INFO, "%s() START.request received state:%d\n", __FUNCTION__, config->state);
|
||||||
|
|
||||||
|
// unpack the message
|
||||||
|
if (nfapi_nr_p5_message_unpack(pRecvMsg, recvMsgLen, &req, sizeof(req), &config->codec_config) >= 0)
|
||||||
|
{
|
||||||
|
if(config->state == NFAPI_PNF_RUNNING)
|
||||||
|
{
|
||||||
|
nfapi_pnf_phy_config_t* phy = nfapi_pnf_phy_config_find(config, req.header.phy_id);
|
||||||
|
if(phy)
|
||||||
|
{
|
||||||
|
if(phy->state != NFAPI_PNF_PHY_RUNNING)
|
||||||
|
{
|
||||||
|
if(config->nr_start_req)
|
||||||
|
{
|
||||||
|
(config->nr_start_req)(config, phy, &req);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
nfapi_nr_start_response_scf_t resp;
|
||||||
|
memset(&resp, 0, sizeof(resp));
|
||||||
|
resp.header.message_id = NFAPI_NR_PHY_MSG_TYPE_START_RESPONSE;
|
||||||
|
resp.header.phy_id = req.header.phy_id;
|
||||||
|
resp.error_code = NFAPI_MSG_INVALID_STATE;
|
||||||
|
nfapi_nr_pnf_start_resp(config, &resp);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
nfapi_nr_start_response_scf_t resp;
|
||||||
|
memset(&resp, 0, sizeof(resp));
|
||||||
|
resp.header.message_id = NFAPI_NR_PHY_MSG_TYPE_START_RESPONSE;
|
||||||
|
resp.header.phy_id = req.header.phy_id;
|
||||||
|
resp.error_code = NFAPI_MSG_INVALID_CONFIG;
|
||||||
|
nfapi_nr_pnf_start_resp(config, &resp);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
nfapi_nr_start_response_scf_t resp;
|
||||||
|
memset(&resp, 0, sizeof(resp));
|
||||||
|
resp.header.message_id = NFAPI_NR_PHY_MSG_TYPE_START_RESPONSE;
|
||||||
|
resp.header.phy_id = req.header.phy_id;
|
||||||
|
resp.error_code = NFAPI_MSG_INVALID_STATE;
|
||||||
|
nfapi_nr_pnf_start_resp(config, &resp);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s: Unpack message failed, ignoring\n", __FUNCTION__);
|
||||||
|
}
|
||||||
|
|
||||||
|
if(req.vendor_extension)
|
||||||
|
pnf->_public.codec_config.deallocate(req.vendor_extension);
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void pnf_handle_stop_request(pnf_t* pnf, void *pRecvMsg, int recvMsgLen)
|
void pnf_handle_stop_request(pnf_t* pnf, void *pRecvMsg, int recvMsgLen)
|
||||||
{
|
{
|
||||||
// ensure it's valid
|
// ensure it's valid
|
||||||
@@ -543,6 +937,77 @@ void pnf_handle_stop_request(pnf_t* pnf, void *pRecvMsg, int recvMsgLen)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void pnf_nr_handle_stop_request(pnf_t* pnf, void *pRecvMsg, int recvMsgLen)
|
||||||
|
{
|
||||||
|
// ensure it's valid
|
||||||
|
if (pRecvMsg == NULL || pnf == NULL)
|
||||||
|
{
|
||||||
|
NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s: NULL parameters\n", __FUNCTION__);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
nfapi_nr_stop_request_t req;
|
||||||
|
|
||||||
|
NFAPI_TRACE(NFAPI_TRACE_INFO, "STOP.request received\n");
|
||||||
|
|
||||||
|
nfapi_pnf_config_t* config = &(pnf->_public);
|
||||||
|
|
||||||
|
// unpack the message
|
||||||
|
if (nfapi_nr_p5_message_unpack(pRecvMsg, recvMsgLen, &req, sizeof(req), &config->codec_config) >= 0)
|
||||||
|
{
|
||||||
|
if(config->state == NFAPI_PNF_RUNNING)
|
||||||
|
{
|
||||||
|
nfapi_pnf_phy_config_t* phy = nfapi_pnf_phy_config_find(config, req.header.phy_id);
|
||||||
|
if(phy)
|
||||||
|
{
|
||||||
|
if(phy->state != NFAPI_PNF_PHY_RUNNING)
|
||||||
|
{
|
||||||
|
if(config->nr_stop_req)
|
||||||
|
{
|
||||||
|
(config->nr_stop_req)(config, phy, &req);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
nfapi_stop_response_t resp;
|
||||||
|
memset(&resp, 0, sizeof(resp));
|
||||||
|
resp.header.message_id = NFAPI_NR_PHY_MSG_TYPE_STOP_RESPONSE;
|
||||||
|
resp.header.phy_id = req.header.phy_id;
|
||||||
|
resp.error_code = NFAPI_MSG_INVALID_STATE;
|
||||||
|
nfapi_pnf_stop_resp(config, &resp);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
nfapi_stop_response_t resp;
|
||||||
|
memset(&resp, 0, sizeof(resp));
|
||||||
|
resp.header.message_id = NFAPI_NR_PHY_MSG_TYPE_STOP_RESPONSE;
|
||||||
|
resp.header.phy_id = req.header.phy_id;
|
||||||
|
resp.error_code = NFAPI_MSG_INVALID_CONFIG;
|
||||||
|
nfapi_pnf_stop_resp(config, &resp);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
nfapi_stop_response_t resp;
|
||||||
|
memset(&resp, 0, sizeof(resp));
|
||||||
|
resp.header.message_id = NFAPI_NR_PHY_MSG_TYPE_STOP_RESPONSE;
|
||||||
|
resp.header.phy_id = req.header.phy_id;
|
||||||
|
resp.error_code = NFAPI_MSG_INVALID_STATE;
|
||||||
|
nfapi_pnf_stop_resp(config, &resp);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s: Unpack message failed, ignoring\n", __FUNCTION__);
|
||||||
|
}
|
||||||
|
|
||||||
|
if(req.vendor_extension)
|
||||||
|
pnf->_public.codec_config.deallocate(req.vendor_extension);
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void pnf_handle_measurement_request(pnf_t* pnf, void *pRecvMsg, int recvMsgLen)
|
void pnf_handle_measurement_request(pnf_t* pnf, void *pRecvMsg, int recvMsgLen)
|
||||||
{
|
{
|
||||||
// ensure it's valid
|
// ensure it's valid
|
||||||
@@ -1071,7 +1536,101 @@ void pnf_handle_vendor_extension(void* pRecvMsg, int recvMsgLen, pnf_t* pnf, uin
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void pnf_nr_handle_p5_message(pnf_t* pnf, void *pRecvMsg, int recvMsgLen)
|
||||||
|
{
|
||||||
|
nfapi_p4_p5_message_header_t messageHeader;
|
||||||
|
|
||||||
|
// validate the input params
|
||||||
|
if(pRecvMsg == NULL || recvMsgLen < NFAPI_HEADER_LENGTH)
|
||||||
|
{
|
||||||
|
NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s: invalid input params\n", __FUNCTION__);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// unpack the message header
|
||||||
|
if (nfapi_p5_message_header_unpack(pRecvMsg, recvMsgLen, &messageHeader, sizeof(nfapi_p4_p5_message_header_t), &pnf->_public.codec_config) < 0)
|
||||||
|
{
|
||||||
|
NFAPI_TRACE(NFAPI_TRACE_ERROR, "Unpack message header failed, ignoring\n");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
switch (messageHeader.message_id)
|
||||||
|
{
|
||||||
|
case NFAPI_NR_PHY_MSG_TYPE_PNF_PARAM_REQUEST:
|
||||||
|
pnf_nr_handle_pnf_param_request(pnf, pRecvMsg, recvMsgLen);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case NFAPI_NR_PHY_MSG_TYPE_PNF_CONFIG_REQUEST:
|
||||||
|
pnf_nr_handle_pnf_config_request(pnf, pRecvMsg, recvMsgLen);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case NFAPI_NR_PHY_MSG_TYPE_PNF_START_REQUEST:
|
||||||
|
pnf_nr_handle_pnf_start_request(pnf, pRecvMsg, recvMsgLen);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case NFAPI_PNF_STOP_REQUEST:
|
||||||
|
pnf_handle_pnf_stop_request(pnf, pRecvMsg, recvMsgLen);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case NFAPI_NR_PHY_MSG_TYPE_PARAM_REQUEST:
|
||||||
|
pnf_nr_handle_param_request(pnf, pRecvMsg, recvMsgLen);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case NFAPI_NR_PHY_MSG_TYPE_CONFIG_REQUEST:
|
||||||
|
pnf_nr_handle_config_request(pnf, pRecvMsg, recvMsgLen);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case NFAPI_NR_PHY_MSG_TYPE_START_REQUEST:
|
||||||
|
pnf_nr_handle_start_request(pnf, pRecvMsg, recvMsgLen);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case NFAPI_NR_PHY_MSG_TYPE_STOP_REQUEST:
|
||||||
|
pnf_nr_handle_stop_request(pnf, pRecvMsg, recvMsgLen);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case NFAPI_MEASUREMENT_REQUEST:
|
||||||
|
pnf_handle_measurement_request(pnf, pRecvMsg, recvMsgLen);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case NFAPI_RSSI_REQUEST:
|
||||||
|
pnf_handle_rssi_request(pnf, pRecvMsg, recvMsgLen);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case NFAPI_CELL_SEARCH_REQUEST:
|
||||||
|
pnf_handle_cell_search_request(pnf, pRecvMsg, recvMsgLen);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case NFAPI_BROADCAST_DETECT_REQUEST:
|
||||||
|
pnf_handle_broadcast_detect_request(pnf, pRecvMsg, recvMsgLen);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case NFAPI_SYSTEM_INFORMATION_SCHEDULE_REQUEST:
|
||||||
|
pnf_handle_system_information_schedule_request(pnf, pRecvMsg, recvMsgLen);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case NFAPI_SYSTEM_INFORMATION_REQUEST:
|
||||||
|
pnf_handle_system_information_request(pnf, pRecvMsg, recvMsgLen);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case NFAPI_NMM_STOP_REQUEST:
|
||||||
|
pnf_handle_nmm_stop_request(pnf, pRecvMsg, recvMsgLen);
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
{
|
||||||
|
if(messageHeader.message_id >= NFAPI_VENDOR_EXT_MSG_MIN &&
|
||||||
|
messageHeader.message_id <= NFAPI_VENDOR_EXT_MSG_MAX)
|
||||||
|
{
|
||||||
|
pnf_handle_vendor_extension(pRecvMsg, recvMsgLen, pnf, messageHeader.message_id);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s P5 Unknown message ID %d\n", __FUNCTION__, messageHeader.message_id);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void pnf_handle_p5_message(pnf_t* pnf, void *pRecvMsg, int recvMsgLen)
|
void pnf_handle_p5_message(pnf_t* pnf, void *pRecvMsg, int recvMsgLen)
|
||||||
{
|
{
|
||||||
@@ -1169,6 +1728,24 @@ void pnf_handle_p5_message(pnf_t* pnf, void *pRecvMsg, int recvMsgLen)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int pnf_nr_pack_and_send_p5_message(pnf_t* pnf, nfapi_p4_p5_message_header_t* msg, uint32_t msg_len)
|
||||||
|
{
|
||||||
|
int packed_len = nfapi_nr_p5_message_pack(msg, msg_len,
|
||||||
|
pnf->tx_message_buffer,
|
||||||
|
sizeof(pnf->tx_message_buffer),
|
||||||
|
&pnf->_public.codec_config);
|
||||||
|
|
||||||
|
if (packed_len < 0)
|
||||||
|
{
|
||||||
|
NFAPI_TRACE(NFAPI_TRACE_ERROR, "nfapi_p5_message_pack failed (%d)\n", packed_len);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
return pnf_send_message(pnf, pnf->tx_message_buffer, packed_len, 0/*msg->stream_id*/);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
int pnf_pack_and_send_p5_message(pnf_t* pnf, nfapi_p4_p5_message_header_t* msg, uint32_t msg_len)
|
int pnf_pack_and_send_p5_message(pnf_t* pnf, nfapi_p4_p5_message_header_t* msg, uint32_t msg_len)
|
||||||
{
|
{
|
||||||
int packed_len = nfapi_p5_message_pack(msg, msg_len,
|
int packed_len = nfapi_p5_message_pack(msg, msg_len,
|
||||||
@@ -1393,8 +1970,15 @@ int pnf_connect(pnf_t* pnf)
|
|||||||
|
|
||||||
int pnf_send_message(pnf_t* pnf, uint8_t *msg, uint32_t len, uint16_t stream)
|
int pnf_send_message(pnf_t* pnf, uint8_t *msg, uint32_t len, uint16_t stream)
|
||||||
{
|
{
|
||||||
|
|
||||||
if (pnf->sctp)
|
if (pnf->sctp)
|
||||||
{
|
{
|
||||||
|
printf("\nPNF SENDS: \n");
|
||||||
|
for(int i=0; i<len; i++){
|
||||||
|
printf("%d", msg[i]);
|
||||||
|
}
|
||||||
|
printf("\n");
|
||||||
|
|
||||||
if (sctp_sendmsg(pnf->p5_sock, msg, len, NULL, 0, 42/*config->sctp_stream_number*/, 0, stream/*P5_STREAM_ID*/, 0, 0) < 0)
|
if (sctp_sendmsg(pnf->p5_sock, msg, len, NULL, 0, 42/*config->sctp_stream_number*/, 0, stream/*P5_STREAM_ID*/, 0, 0) < 0)
|
||||||
{
|
{
|
||||||
NFAPI_TRACE(NFAPI_TRACE_ERROR, "sctp_sendmsg failed errno: %d\n", errno);
|
NFAPI_TRACE(NFAPI_TRACE_ERROR, "sctp_sendmsg failed errno: %d\n", errno);
|
||||||
@@ -1412,7 +1996,6 @@ int pnf_send_message(pnf_t* pnf, uint8_t *msg, uint32_t len, uint16_t stream)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
int pnf_read_dispatch_message(pnf_t* pnf)
|
int pnf_read_dispatch_message(pnf_t* pnf)
|
||||||
{
|
{
|
||||||
int socket_connected = 1;
|
int socket_connected = 1;
|
||||||
@@ -1486,6 +2069,13 @@ int pnf_read_dispatch_message(pnf_t* pnf)
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
// print the received message
|
||||||
|
printf("\n MESSAGE RECEIVED: \n");
|
||||||
|
for(int i=0; i<message_size; i++){
|
||||||
|
printf("%d", read_buffer[i]);
|
||||||
|
}
|
||||||
|
printf("\n");
|
||||||
|
|
||||||
if (flags & MSG_NOTIFICATION)
|
if (flags & MSG_NOTIFICATION)
|
||||||
{
|
{
|
||||||
NFAPI_TRACE(NFAPI_TRACE_INFO, "Notification received from %s:%u\n", inet_ntoa(addr.sin_addr), ntohs(addr.sin_port));
|
NFAPI_TRACE(NFAPI_TRACE_INFO, "Notification received from %s:%u\n", inet_ntoa(addr.sin_addr), ntohs(addr.sin_port));
|
||||||
@@ -1533,6 +2123,135 @@ int pnf_read_dispatch_message(pnf_t* pnf)
|
|||||||
return socket_connected;
|
return socket_connected;
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
int pnf_nr_read_dispatch_message(pnf_t* pnf)
|
||||||
|
{
|
||||||
|
int socket_connected = 1;
|
||||||
|
|
||||||
|
// 1. Peek the message header
|
||||||
|
// 2. If the message is larger than the stack buffer then create a dynamic buffer
|
||||||
|
// 3. Read the buffer
|
||||||
|
// 4. Handle the p5 message
|
||||||
|
|
||||||
|
uint32_t header_buffer_size = NFAPI_HEADER_LENGTH;
|
||||||
|
uint8_t header_buffer[header_buffer_size];
|
||||||
|
|
||||||
|
uint32_t stack_buffer_size = 32; //should it be the size of then sctp_notificatoin structure
|
||||||
|
uint8_t stack_buffer[stack_buffer_size];
|
||||||
|
|
||||||
|
uint8_t* dynamic_buffer = 0;
|
||||||
|
|
||||||
|
uint8_t* read_buffer = &stack_buffer[0];
|
||||||
|
uint32_t message_size = 0;
|
||||||
|
|
||||||
|
struct sockaddr_in addr;
|
||||||
|
socklen_t addr_len = sizeof(addr);
|
||||||
|
|
||||||
|
struct sctp_sndrcvinfo sndrcvinfo;
|
||||||
|
(void)memset(&sndrcvinfo, 0, sizeof(struct sctp_sndrcvinfo));
|
||||||
|
|
||||||
|
{
|
||||||
|
int flags = MSG_PEEK;
|
||||||
|
message_size = sctp_recvmsg(pnf->p5_sock, header_buffer, header_buffer_size, /*(struct sockaddr*)&addr, &addr_len*/ 0, 0, &sndrcvinfo, &flags);
|
||||||
|
|
||||||
|
if(message_size == -1)
|
||||||
|
{
|
||||||
|
NFAPI_TRACE(NFAPI_TRACE_INFO, "PNF Failed to peek sctp message size errno:%d\n", errno);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
nfapi_p4_p5_message_header_t header;
|
||||||
|
int unpack_result = nfapi_p5_message_header_unpack(header_buffer, header_buffer_size, &header, sizeof(header), 0);
|
||||||
|
if(unpack_result < 0)
|
||||||
|
{
|
||||||
|
NFAPI_TRACE(NFAPI_TRACE_INFO, "PNF Failed to unpack p5 message header\n");
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
message_size = header.message_length;
|
||||||
|
|
||||||
|
// now have the size of the mesage
|
||||||
|
}
|
||||||
|
|
||||||
|
if(message_size > stack_buffer_size)
|
||||||
|
{
|
||||||
|
dynamic_buffer = (uint8_t*)malloc(message_size);
|
||||||
|
|
||||||
|
if(dynamic_buffer == NULL)
|
||||||
|
{
|
||||||
|
// todo : add error mesage
|
||||||
|
NFAPI_TRACE(NFAPI_TRACE_INFO, "PNF Failed to allocate dynamic buffer for sctp_recvmsg size:%d\n", message_size);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
read_buffer = dynamic_buffer;
|
||||||
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
int flags = 0;
|
||||||
|
(void)memset(&sndrcvinfo, 0, sizeof(struct sctp_sndrcvinfo));
|
||||||
|
|
||||||
|
int recvmsg_result = sctp_recvmsg(pnf->p5_sock, read_buffer, message_size, (struct sockaddr*)&addr, &addr_len, &sndrcvinfo, &flags);
|
||||||
|
if(recvmsg_result == -1)
|
||||||
|
{
|
||||||
|
NFAPI_TRACE(NFAPI_TRACE_INFO, "Failed to read sctp message size errno:%d\n", errno);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// print the received message
|
||||||
|
printf("\n MESSAGE RECEIVED: \n");
|
||||||
|
for(int i=0; i<message_size; i++){
|
||||||
|
printf("%d", read_buffer[i]);
|
||||||
|
}
|
||||||
|
printf("\n");
|
||||||
|
|
||||||
|
if (flags & MSG_NOTIFICATION)
|
||||||
|
{
|
||||||
|
NFAPI_TRACE(NFAPI_TRACE_INFO, "Notification received from %s:%u\n", inet_ntoa(addr.sin_addr), ntohs(addr.sin_port));
|
||||||
|
|
||||||
|
// todo - handle the events
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
/*
|
||||||
|
NFAPI_TRACE(NFAPI_TRACE_INFO, "Received message fd:%d from %s:%u assoc:%d on stream %d, PPID %d, length %d, flags 0x%x\n",
|
||||||
|
pnf->p5_sock,
|
||||||
|
inet_ntoa(addr.sin_addr),
|
||||||
|
ntohs(addr.sin_port),
|
||||||
|
sndrcvinfo.sinfo_assoc_id,
|
||||||
|
sndrcvinfo.sinfo_stream,
|
||||||
|
ntohl(sndrcvinfo.sinfo_ppid),
|
||||||
|
message_size,
|
||||||
|
flags);
|
||||||
|
*/
|
||||||
|
|
||||||
|
// handle now if complete message in one or more segments
|
||||||
|
if ((flags & 0x80) == 0x80)
|
||||||
|
{
|
||||||
|
pnf_nr_handle_p5_message(pnf, read_buffer, message_size);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
NFAPI_TRACE(NFAPI_TRACE_WARN, "sctp_recvmsg: unhandled mode with flags 0x%x\n", flags);
|
||||||
|
|
||||||
|
// assume socket disconnected
|
||||||
|
NFAPI_TRACE(NFAPI_TRACE_WARN, "Disconnected socket\n");
|
||||||
|
socket_connected = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if(dynamic_buffer)
|
||||||
|
{
|
||||||
|
free(dynamic_buffer);
|
||||||
|
}
|
||||||
|
|
||||||
|
return socket_connected;
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -1597,3 +2316,64 @@ int pnf_message_pump(pnf_t* pnf)
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int pnf_nr_message_pump(pnf_t* pnf)
|
||||||
|
{
|
||||||
|
uint8_t socketConnected = 1;
|
||||||
|
|
||||||
|
while(socketConnected && pnf->terminate == 0)
|
||||||
|
{
|
||||||
|
fd_set rfds;
|
||||||
|
int selectRetval = 0;
|
||||||
|
|
||||||
|
// select on a timeout and then get the message
|
||||||
|
FD_ZERO(&rfds);
|
||||||
|
FD_SET(pnf->p5_sock, &rfds);
|
||||||
|
|
||||||
|
struct timeval timeout;
|
||||||
|
timeout.tv_sec = 1;
|
||||||
|
timeout.tv_usec = 0;
|
||||||
|
|
||||||
|
selectRetval = select(pnf->p5_sock+1, &rfds, NULL, NULL, &timeout);
|
||||||
|
|
||||||
|
if(selectRetval == 0)
|
||||||
|
{
|
||||||
|
// timeout
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
else if (selectRetval == -1 && (errno == EINTR))
|
||||||
|
{
|
||||||
|
// interrupted by signal
|
||||||
|
NFAPI_TRACE(NFAPI_TRACE_WARN, "P5 Signal Interrupt %d\n", errno);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
else if (selectRetval == -1)
|
||||||
|
{
|
||||||
|
NFAPI_TRACE(NFAPI_TRACE_WARN, "P5 select() failed\n");
|
||||||
|
sleep(1);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(FD_ISSET(pnf->p5_sock, &rfds))
|
||||||
|
{
|
||||||
|
socketConnected = pnf_nr_read_dispatch_message(pnf);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
NFAPI_TRACE(NFAPI_TRACE_WARN, "Why are we here\n");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Drop back to idle if we have lost connection
|
||||||
|
pnf->_public.state = NFAPI_PNF_PHY_IDLE;
|
||||||
|
|
||||||
|
|
||||||
|
// close the connection and socket
|
||||||
|
if (close(pnf->p5_sock) < 0)
|
||||||
|
{
|
||||||
|
NFAPI_TRACE(NFAPI_TRACE_ERROR, "close(sctpSock) failed errno: %d\n", errno);
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -19,6 +19,8 @@
|
|||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
|
#include "nfapi_nr_interface.h"
|
||||||
|
#include "nfapi_nr_interface_scf.h"
|
||||||
|
|
||||||
nfapi_pnf_config_t* nfapi_pnf_config_create()
|
nfapi_pnf_config_t* nfapi_pnf_config_create()
|
||||||
{
|
{
|
||||||
@@ -81,6 +83,40 @@ int nfapi_pnf_start(nfapi_pnf_config_t* config)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int nfapi_nr_pnf_start(nfapi_pnf_config_t* config)
|
||||||
|
{
|
||||||
|
// Verify that config is not null
|
||||||
|
if(config == 0)
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
// Make sure to set the defined trace function before using NFAPI_TRACE
|
||||||
|
if(config->trace)
|
||||||
|
nfapi_trace_g = config->trace;
|
||||||
|
|
||||||
|
NFAPI_TRACE(NFAPI_TRACE_INFO, "%s\n", __FUNCTION__);
|
||||||
|
|
||||||
|
pnf_t* _this = (pnf_t*)(config);
|
||||||
|
|
||||||
|
while (_this->terminate == 0)
|
||||||
|
{
|
||||||
|
int connect_result = pnf_connect(_this);
|
||||||
|
|
||||||
|
if(connect_result > 0)
|
||||||
|
{
|
||||||
|
pnf_nr_message_pump(_this);
|
||||||
|
}
|
||||||
|
else if(connect_result < 0)
|
||||||
|
{
|
||||||
|
return connect_result;
|
||||||
|
}
|
||||||
|
|
||||||
|
sleep(1);
|
||||||
|
}
|
||||||
|
NFAPI_TRACE(NFAPI_TRACE_INFO, "%s() terminate=1 - EXITTING............\n", __FUNCTION__);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
int nfapi_pnf_stop(nfapi_pnf_config_t* config)
|
int nfapi_pnf_stop(nfapi_pnf_config_t* config)
|
||||||
{
|
{
|
||||||
// Verify that config is not null
|
// Verify that config is not null
|
||||||
@@ -96,6 +132,21 @@ int nfapi_pnf_stop(nfapi_pnf_config_t* config)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int nfapi_nr_pnf_pnf_param_resp(nfapi_pnf_config_t* config, nfapi_nr_pnf_param_response_t* resp)
|
||||||
|
{
|
||||||
|
// ensure it's valid
|
||||||
|
if (config == NULL || resp == NULL)
|
||||||
|
{
|
||||||
|
NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s: NULL parameters\n", __FUNCTION__);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
pnf_t* _this = (pnf_t*)(config);
|
||||||
|
|
||||||
|
return pnf_nr_pack_and_send_p5_message(_this, &(resp->header), sizeof(nfapi_nr_pnf_param_response_t));
|
||||||
|
}
|
||||||
|
|
||||||
int nfapi_pnf_pnf_param_resp(nfapi_pnf_config_t* config, nfapi_pnf_param_response_t* resp)
|
int nfapi_pnf_pnf_param_resp(nfapi_pnf_config_t* config, nfapi_pnf_param_response_t* resp)
|
||||||
{
|
{
|
||||||
// ensure it's valid
|
// ensure it's valid
|
||||||
@@ -129,6 +180,27 @@ int nfapi_pnf_pnf_config_resp(nfapi_pnf_config_t* config, nfapi_pnf_config_respo
|
|||||||
return pnf_pack_and_send_p5_message(_this, &(resp->header), sizeof(nfapi_pnf_config_response_t));
|
return pnf_pack_and_send_p5_message(_this, &(resp->header), sizeof(nfapi_pnf_config_response_t));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int nfapi_nr_pnf_pnf_config_resp(nfapi_pnf_config_t* config, nfapi_nr_pnf_config_response_t* resp)
|
||||||
|
{
|
||||||
|
// ensure it's valid
|
||||||
|
if (config == NULL || resp == NULL)
|
||||||
|
{
|
||||||
|
NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s: NULL parameters\n", __FUNCTION__);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(resp->error_code == NFAPI_MSG_OK)
|
||||||
|
{
|
||||||
|
config->state = NFAPI_PNF_CONFIGURED;
|
||||||
|
}
|
||||||
|
|
||||||
|
pnf_t* _this = (pnf_t*)(config);
|
||||||
|
|
||||||
|
return pnf_nr_pack_and_send_p5_message(_this, &(resp->header), sizeof(nfapi_nr_pnf_config_response_t));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
int nfapi_pnf_pnf_start_resp(nfapi_pnf_config_t* config, nfapi_pnf_start_response_t* resp)
|
int nfapi_pnf_pnf_start_resp(nfapi_pnf_config_t* config, nfapi_pnf_start_response_t* resp)
|
||||||
{
|
{
|
||||||
// ensure it's valid
|
// ensure it's valid
|
||||||
@@ -148,6 +220,26 @@ int nfapi_pnf_pnf_start_resp(nfapi_pnf_config_t* config, nfapi_pnf_start_respons
|
|||||||
return pnf_pack_and_send_p5_message(_this, &(resp->header), sizeof(nfapi_pnf_start_response_t));
|
return pnf_pack_and_send_p5_message(_this, &(resp->header), sizeof(nfapi_pnf_start_response_t));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int nfapi_nr_pnf_pnf_start_resp(nfapi_pnf_config_t* config, nfapi_nr_pnf_start_response_t* resp)
|
||||||
|
{
|
||||||
|
// ensure it's valid
|
||||||
|
if (config == NULL || resp == NULL)
|
||||||
|
{
|
||||||
|
NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s: NULL parameters\n", __FUNCTION__);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(resp->error_code == NFAPI_MSG_OK)
|
||||||
|
{
|
||||||
|
config->state = NFAPI_PNF_RUNNING;
|
||||||
|
}
|
||||||
|
|
||||||
|
pnf_t* _this = (pnf_t*)(config);
|
||||||
|
|
||||||
|
return pnf_nr_pack_and_send_p5_message(_this, &(resp->header), sizeof(nfapi_nr_pnf_start_response_t));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
int nfapi_pnf_pnf_stop_resp(nfapi_pnf_config_t* config, nfapi_pnf_stop_response_t* resp)
|
int nfapi_pnf_pnf_stop_resp(nfapi_pnf_config_t* config, nfapi_pnf_stop_response_t* resp)
|
||||||
{
|
{
|
||||||
// ensure it's valid
|
// ensure it's valid
|
||||||
@@ -166,7 +258,6 @@ int nfapi_pnf_pnf_stop_resp(nfapi_pnf_config_t* config, nfapi_pnf_stop_response_
|
|||||||
|
|
||||||
return pnf_pack_and_send_p5_message(_this, &(resp->header), sizeof(nfapi_pnf_stop_response_t));
|
return pnf_pack_and_send_p5_message(_this, &(resp->header), sizeof(nfapi_pnf_stop_response_t));
|
||||||
}
|
}
|
||||||
|
|
||||||
int nfapi_pnf_param_resp(nfapi_pnf_config_t* config, nfapi_param_response_t* resp)
|
int nfapi_pnf_param_resp(nfapi_pnf_config_t* config, nfapi_param_response_t* resp)
|
||||||
{
|
{
|
||||||
if (config == NULL || resp == NULL)
|
if (config == NULL || resp == NULL)
|
||||||
@@ -180,6 +271,20 @@ int nfapi_pnf_param_resp(nfapi_pnf_config_t* config, nfapi_param_response_t* res
|
|||||||
return pnf_pack_and_send_p5_message(_this, &(resp->header), sizeof(nfapi_param_response_t));
|
return pnf_pack_and_send_p5_message(_this, &(resp->header), sizeof(nfapi_param_response_t));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int nfapi_nr_pnf_param_resp(nfapi_pnf_config_t* config, nfapi_nr_param_response_scf_t* resp)
|
||||||
|
{
|
||||||
|
if (config == NULL || resp == NULL)
|
||||||
|
{
|
||||||
|
NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s: NULL parameters\n", __FUNCTION__);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
pnf_t* _this = (pnf_t*)(config);
|
||||||
|
|
||||||
|
return pnf_nr_pack_and_send_p5_message(_this, &(resp->header), sizeof(nfapi_nr_param_response_scf_t));
|
||||||
|
}
|
||||||
|
|
||||||
int nfapi_pnf_config_resp(nfapi_pnf_config_t* config, nfapi_config_response_t* resp)
|
int nfapi_pnf_config_resp(nfapi_pnf_config_t* config, nfapi_config_response_t* resp)
|
||||||
{
|
{
|
||||||
if (config == NULL || resp == NULL)
|
if (config == NULL || resp == NULL)
|
||||||
@@ -208,6 +313,35 @@ int nfapi_pnf_config_resp(nfapi_pnf_config_t* config, nfapi_config_response_t* r
|
|||||||
return pnf_pack_and_send_p5_message(_this, &(resp->header), sizeof(nfapi_config_response_t));
|
return pnf_pack_and_send_p5_message(_this, &(resp->header), sizeof(nfapi_config_response_t));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int nfapi_nr_pnf_config_resp(nfapi_pnf_config_t* config, nfapi_nr_config_response_scf_t* resp)
|
||||||
|
{
|
||||||
|
if (config == NULL || resp == NULL)
|
||||||
|
{
|
||||||
|
NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s: NULL parameters\n", __FUNCTION__);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
pnf_t* _this = (pnf_t*)(config);
|
||||||
|
|
||||||
|
nfapi_pnf_phy_config_t* phy = nfapi_pnf_phy_config_find(config, resp->header.phy_id);
|
||||||
|
|
||||||
|
if(phy)
|
||||||
|
{
|
||||||
|
if(resp->error_code == NFAPI_NR_CONFIG_MSG_OK)
|
||||||
|
{
|
||||||
|
phy->state = NFAPI_PNF_PHY_CONFIGURED;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s: unknow phy id %d\n", __FUNCTION__, resp->header.phy_id);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
return pnf_nr_pack_and_send_p5_message(_this, &(resp->header), sizeof(nfapi_nr_config_response_scf_t));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
int nfapi_pnf_start_resp(nfapi_pnf_config_t* config, nfapi_start_response_t* resp)
|
int nfapi_pnf_start_resp(nfapi_pnf_config_t* config, nfapi_start_response_t* resp)
|
||||||
{
|
{
|
||||||
if (config == NULL || resp == NULL)
|
if (config == NULL || resp == NULL)
|
||||||
@@ -235,6 +369,34 @@ int nfapi_pnf_start_resp(nfapi_pnf_config_t* config, nfapi_start_response_t* res
|
|||||||
return pnf_pack_and_send_p5_message(_this, &(resp->header), sizeof(nfapi_start_response_t));
|
return pnf_pack_and_send_p5_message(_this, &(resp->header), sizeof(nfapi_start_response_t));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int nfapi_nr_pnf_start_resp(nfapi_pnf_config_t* config, nfapi_nr_start_response_scf_t* resp)
|
||||||
|
{
|
||||||
|
if (config == NULL || resp == NULL)
|
||||||
|
{
|
||||||
|
NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s: NULL parameters\n", __FUNCTION__);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
pnf_t* _this = (pnf_t*)(config);
|
||||||
|
|
||||||
|
nfapi_pnf_phy_config_t* phy = nfapi_pnf_phy_config_find(config, resp->header.phy_id);
|
||||||
|
if(phy)
|
||||||
|
{
|
||||||
|
if(resp->error_code == NFAPI_NR_START_MSG_OK)
|
||||||
|
{
|
||||||
|
phy->state = NFAPI_PNF_PHY_RUNNING;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s: unknown phy id %d\n", __FUNCTION__, resp->header.phy_id);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
return pnf_nr_pack_and_send_p5_message(_this, &(resp->header), sizeof(nfapi_nr_start_response_scf_t));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
int nfapi_pnf_stop_resp(nfapi_pnf_config_t* config, nfapi_stop_response_t* resp)
|
int nfapi_pnf_stop_resp(nfapi_pnf_config_t* config, nfapi_stop_response_t* resp)
|
||||||
{
|
{
|
||||||
if (config == NULL || resp == NULL)
|
if (config == NULL || resp == NULL)
|
||||||
|
|||||||
+1466
-10
File diff suppressed because it is too large
Load Diff
@@ -31,7 +31,7 @@ nfapi_pnf_p7_config_t* nfapi_pnf_p7_config_create()
|
|||||||
_this->_public.segment_size = 1400;
|
_this->_public.segment_size = 1400;
|
||||||
_this->max_num_segments = 8;
|
_this->max_num_segments = 8;
|
||||||
|
|
||||||
_this->_public.subframe_buffer_size = 8;
|
_this->_public.subframe_buffer_size = 8;// TODO: Initialize the slot_buffer size
|
||||||
_this->_public.timing_info_mode_periodic = 1;
|
_this->_public.timing_info_mode_periodic = 1;
|
||||||
_this->_public.timing_info_period = 32;
|
_this->_public.timing_info_period = 32;
|
||||||
_this->_public.timing_info_mode_aperiodic = 1;
|
_this->_public.timing_info_mode_aperiodic = 1;
|
||||||
@@ -76,6 +76,26 @@ int nfapi_pnf_p7_start(nfapi_pnf_p7_config_t* config)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int nfapi_nr_pnf_p7_start(nfapi_pnf_p7_config_t* config)
|
||||||
|
{
|
||||||
|
// Verify that config is not null
|
||||||
|
if(config == 0)
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
// Make sure to set the defined trace function before using NFAPI_TRACE
|
||||||
|
if(config->trace)
|
||||||
|
nfapi_trace_g = config->trace;
|
||||||
|
|
||||||
|
pnf_p7_t* _this = (pnf_p7_t*)(config);
|
||||||
|
|
||||||
|
NFAPI_TRACE(NFAPI_TRACE_INFO, "%s\n", __FUNCTION__);
|
||||||
|
|
||||||
|
pnf_nr_p7_message_pump(_this);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
int nfapi_pnf_p7_stop(nfapi_pnf_p7_config_t* config)
|
int nfapi_pnf_p7_stop(nfapi_pnf_p7_config_t* config)
|
||||||
{
|
{
|
||||||
// Verify that config is not null
|
// Verify that config is not null
|
||||||
@@ -88,6 +108,16 @@ int nfapi_pnf_p7_stop(nfapi_pnf_p7_config_t* config)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int nfapi_pnf_p7_slot_ind(nfapi_pnf_p7_config_t* config, uint16_t phy_id, uint16_t sfn, uint16_t slot)
|
||||||
|
{
|
||||||
|
// Verify that config is not null
|
||||||
|
if(config == 0)
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
pnf_p7_t* _this = (pnf_p7_t*)(config);
|
||||||
|
|
||||||
|
return pnf_p7_slot_ind(_this, phy_id, sfn, slot);
|
||||||
|
}
|
||||||
|
|
||||||
int nfapi_pnf_p7_subframe_ind(nfapi_pnf_p7_config_t* config, uint16_t phy_id, uint16_t sfn_sf)
|
int nfapi_pnf_p7_subframe_ind(nfapi_pnf_p7_config_t* config, uint16_t phy_id, uint16_t sfn_sf)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -48,6 +48,9 @@ typedef struct phy_info
|
|||||||
uint8_t enabled;
|
uint8_t enabled;
|
||||||
uint16_t phy_id;
|
uint16_t phy_id;
|
||||||
uint16_t sfn_sf;
|
uint16_t sfn_sf;
|
||||||
|
uint16_t sfn;
|
||||||
|
uint16_t slot;
|
||||||
|
|
||||||
|
|
||||||
pthread_t thread;
|
pthread_t thread;
|
||||||
|
|
||||||
@@ -1207,6 +1210,12 @@ void send_dl_subframe_msgs_interleaved(int p7Sock, int phy_id, struct sockaddr_i
|
|||||||
//free(req.tx_request_body.tx_pdu_list);
|
//free(req.tx_request_body.tx_pdu_list);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void send_slot_indication(phy_info_t* phy_info)
|
||||||
|
{
|
||||||
|
// DONE: add sfn and slot as members in the phy_info
|
||||||
|
nfapi_pnf_p7_slot_ind(phy_info->config, phy_info->phy_id, phy_info->sfn, phy_info->slot);
|
||||||
|
}
|
||||||
|
|
||||||
void send_subframe_indication(phy_info_t* phy_info)
|
void send_subframe_indication(phy_info_t* phy_info)
|
||||||
{
|
{
|
||||||
nfapi_pnf_p7_subframe_ind(phy_info->config, phy_info->phy_id, phy_info->sfn_sf);
|
nfapi_pnf_p7_subframe_ind(phy_info->config, phy_info->phy_id, phy_info->sfn_sf);
|
||||||
|
|||||||
@@ -35,9 +35,13 @@ typedef struct
|
|||||||
|
|
||||||
|
|
||||||
int vnf_pack_and_send_p5_message(vnf_t* vnf, uint16_t p5_idx, nfapi_p4_p5_message_header_t* msg, uint16_t msg_len);
|
int vnf_pack_and_send_p5_message(vnf_t* vnf, uint16_t p5_idx, nfapi_p4_p5_message_header_t* msg, uint16_t msg_len);
|
||||||
|
int vnf_nr_pack_and_send_p5_message(vnf_t* vnf, uint16_t p5_idx, nfapi_p4_p5_message_header_t* msg, uint16_t msg_len);
|
||||||
|
|
||||||
int vnf_pack_and_send_p4_message(vnf_t* vnf, uint16_t p5_idx, nfapi_p4_p5_message_header_t* msg, uint16_t msg_len);
|
int vnf_pack_and_send_p4_message(vnf_t* vnf, uint16_t p5_idx, nfapi_p4_p5_message_header_t* msg, uint16_t msg_len);
|
||||||
|
|
||||||
int vnf_read_dispatch_message(nfapi_vnf_config_t* config, nfapi_vnf_pnf_info_t* pnf);
|
int vnf_read_dispatch_message(nfapi_vnf_config_t* config, nfapi_vnf_pnf_info_t* pnf);
|
||||||
|
int vnf_nr_read_dispatch_message(nfapi_vnf_config_t* config, nfapi_vnf_pnf_info_t* pnf);
|
||||||
|
|
||||||
|
|
||||||
void nfapi_vnf_phy_info_list_add(nfapi_vnf_config_t* config, nfapi_vnf_phy_info_t* info);
|
void nfapi_vnf_phy_info_list_add(nfapi_vnf_config_t* config, nfapi_vnf_phy_info_t* info);
|
||||||
nfapi_vnf_phy_info_t* nfapi_vnf_phy_info_list_find(nfapi_vnf_config_t* config, uint16_t phy_id);
|
nfapi_vnf_phy_info_t* nfapi_vnf_phy_info_list_find(nfapi_vnf_config_t* config, uint16_t phy_id);
|
||||||
|
|||||||
@@ -77,6 +77,9 @@ typedef struct nfapi_vnf_p7_connection_info {
|
|||||||
int32_t sf_offset_filtered;
|
int32_t sf_offset_filtered;
|
||||||
int32_t sf_offset_trend;
|
int32_t sf_offset_trend;
|
||||||
int32_t sf_offset;
|
int32_t sf_offset;
|
||||||
|
int32_t slot_offset;
|
||||||
|
int32_t slot_offset_trend;
|
||||||
|
int32_t slot_offset_filtered;
|
||||||
uint16_t zero_count;
|
uint16_t zero_count;
|
||||||
int32_t adjustment;
|
int32_t adjustment;
|
||||||
int32_t insync_minor_adjustment;
|
int32_t insync_minor_adjustment;
|
||||||
@@ -85,8 +88,10 @@ typedef struct nfapi_vnf_p7_connection_info {
|
|||||||
uint32_t previous_t1;
|
uint32_t previous_t1;
|
||||||
uint32_t previous_t2;
|
uint32_t previous_t2;
|
||||||
int32_t previous_sf_offset_filtered;
|
int32_t previous_sf_offset_filtered;
|
||||||
|
int32_t previous_slot_offset_filtered;
|
||||||
int sfn_sf;
|
int sfn_sf;
|
||||||
|
int sfn;
|
||||||
|
int slot;
|
||||||
|
|
||||||
int socket;
|
int socket;
|
||||||
struct sockaddr_in local_addr;
|
struct sockaddr_in local_addr;
|
||||||
@@ -111,6 +116,7 @@ typedef struct {
|
|||||||
nfapi_vnf_p7_connection_info_t* p7_connections;
|
nfapi_vnf_p7_connection_info_t* p7_connections;
|
||||||
int socket;
|
int socket;
|
||||||
uint32_t sf_start_time_hr;
|
uint32_t sf_start_time_hr;
|
||||||
|
uint32_t slot_start_time_hr;
|
||||||
uint8_t* rx_message_buffer; // would this be better put in the p7 conenction info?
|
uint8_t* rx_message_buffer; // would this be better put in the p7 conenction info?
|
||||||
uint16_t rx_message_buffer_size;
|
uint16_t rx_message_buffer_size;
|
||||||
|
|
||||||
@@ -120,14 +126,19 @@ uint32_t vnf_get_current_time_hr(void);
|
|||||||
|
|
||||||
uint16_t increment_sfn_sf(uint16_t sfn_sf);
|
uint16_t increment_sfn_sf(uint16_t sfn_sf);
|
||||||
int vnf_sync(vnf_p7_t* vnf_p7, nfapi_vnf_p7_connection_info_t* p7_info);
|
int vnf_sync(vnf_p7_t* vnf_p7, nfapi_vnf_p7_connection_info_t* p7_info);
|
||||||
|
int vnf_nr_sync(vnf_p7_t* vnf_p7, nfapi_vnf_p7_connection_info_t* p7_info);
|
||||||
|
|
||||||
int send_mac_subframe_indications(vnf_p7_t* config);
|
int send_mac_subframe_indications(vnf_p7_t* config);
|
||||||
|
int send_mac_slot_indications(vnf_p7_t* config);
|
||||||
int vnf_p7_read_dispatch_message(vnf_p7_t* vnf_p7 );
|
int vnf_p7_read_dispatch_message(vnf_p7_t* vnf_p7 );
|
||||||
|
int vnf_nr_p7_read_dispatch_message(vnf_p7_t* vnf_p7 );
|
||||||
|
|
||||||
void vnf_p7_connection_info_list_add(vnf_p7_t* vnf_p7, nfapi_vnf_p7_connection_info_t* node);
|
void vnf_p7_connection_info_list_add(vnf_p7_t* vnf_p7, nfapi_vnf_p7_connection_info_t* node);
|
||||||
nfapi_vnf_p7_connection_info_t* vnf_p7_connection_info_list_find(vnf_p7_t* vnf_p7, uint16_t phy_id);
|
nfapi_vnf_p7_connection_info_t* vnf_p7_connection_info_list_find(vnf_p7_t* vnf_p7, uint16_t phy_id);
|
||||||
nfapi_vnf_p7_connection_info_t* vnf_p7_connection_info_list_delete(vnf_p7_t* vnf_p7, uint16_t phy_id);
|
nfapi_vnf_p7_connection_info_t* vnf_p7_connection_info_list_delete(vnf_p7_t* vnf_p7, uint16_t phy_id);
|
||||||
|
|
||||||
int vnf_p7_pack_and_send_p7_msg(vnf_p7_t* vnf_p7, nfapi_p7_message_header_t* header);
|
int vnf_p7_pack_and_send_p7_msg(vnf_p7_t* vnf_p7, nfapi_p7_message_header_t* header);
|
||||||
|
int vnf_nr_p7_pack_and_send_p7_msg(vnf_p7_t* vnf_p7, nfapi_p7_message_header_t* header);
|
||||||
|
|
||||||
void vnf_p7_release_msg(vnf_p7_t* vnf_p7, nfapi_p7_message_header_t* header);
|
void vnf_p7_release_msg(vnf_p7_t* vnf_p7, nfapi_p7_message_header_t* header);
|
||||||
void vnf_p7_release_pdu(vnf_p7_t* vnf_p7, void* pdu);
|
void vnf_p7_release_pdu(vnf_p7_t* vnf_p7, void* pdu);
|
||||||
|
|||||||
@@ -19,6 +19,7 @@
|
|||||||
|
|
||||||
#include "nfapi_interface.h"
|
#include "nfapi_interface.h"
|
||||||
#include "nfapi_nr_interface_scf.h"
|
#include "nfapi_nr_interface_scf.h"
|
||||||
|
#include "nfapi_nr_interface.h"
|
||||||
|
|
||||||
#include "debug.h"
|
#include "debug.h"
|
||||||
|
|
||||||
@@ -120,6 +121,7 @@ typedef struct nfapi_vnf_config
|
|||||||
*
|
*
|
||||||
* \todo Do we need to send the address information of the PNF?
|
* \todo Do we need to send the address information of the PNF?
|
||||||
*/
|
*/
|
||||||
|
int (*pnf_nr_connection_indication)(nfapi_vnf_config_t* config, int p5_idx);
|
||||||
int (*pnf_connection_indication)(nfapi_vnf_config_t* config, int p5_idx);
|
int (*pnf_connection_indication)(nfapi_vnf_config_t* config, int p5_idx);
|
||||||
|
|
||||||
/*! \brief Callback indicating that a pnf has lost connection
|
/*! \brief Callback indicating that a pnf has lost connection
|
||||||
@@ -160,6 +162,7 @@ typedef struct nfapi_vnf_config
|
|||||||
* then the substructure pointers should be set to 0 and then the client should
|
* then the substructure pointers should be set to 0 and then the client should
|
||||||
* use the codec_config.deallocate function to release it at a future point
|
* use the codec_config.deallocate function to release it at a future point
|
||||||
*/
|
*/
|
||||||
|
int (*pnf_nr_param_resp)(nfapi_vnf_config_t* config, int p5_idx, nfapi_nr_pnf_param_response_t* resp);
|
||||||
int (*pnf_param_resp)(nfapi_vnf_config_t* config, int p5_idx, nfapi_pnf_param_response_t* resp);
|
int (*pnf_param_resp)(nfapi_vnf_config_t* config, int p5_idx, nfapi_pnf_param_response_t* resp);
|
||||||
|
|
||||||
/*! A callback for the PNF_CONFIG.resp
|
/*! A callback for the PNF_CONFIG.resp
|
||||||
@@ -182,7 +185,8 @@ typedef struct nfapi_vnf_config
|
|||||||
* use the codec_config.deallocate function to release it at a future point
|
* use the codec_config.deallocate function to release it at a future point
|
||||||
*/
|
*/
|
||||||
int (*pnf_config_resp)(nfapi_vnf_config_t* config, int p5_idx, nfapi_pnf_config_response_t* resp);
|
int (*pnf_config_resp)(nfapi_vnf_config_t* config, int p5_idx, nfapi_pnf_config_response_t* resp);
|
||||||
|
int (*pnf_nr_config_resp)(nfapi_vnf_config_t* config, int p5_idx, nfapi_nr_pnf_config_response_t* resp);
|
||||||
|
|
||||||
/*! A callback for the PNF_START.resp
|
/*! A callback for the PNF_START.resp
|
||||||
* \param config A pointer to the vnf configuration
|
* \param config A pointer to the vnf configuration
|
||||||
* \param p5_idx The p5 index used to indicate a particular pnf p5 connection
|
* \param p5_idx The p5 index used to indicate a particular pnf p5 connection
|
||||||
@@ -203,7 +207,8 @@ typedef struct nfapi_vnf_config
|
|||||||
* use the codec_config.deallocate function to release it at a future point
|
* use the codec_config.deallocate function to release it at a future point
|
||||||
*/
|
*/
|
||||||
int (*pnf_start_resp)(nfapi_vnf_config_t* config, int p5_idx, nfapi_pnf_start_response_t* resp);
|
int (*pnf_start_resp)(nfapi_vnf_config_t* config, int p5_idx, nfapi_pnf_start_response_t* resp);
|
||||||
|
int (*pnf_nr_start_resp)(nfapi_vnf_config_t* config, int p5_idx, nfapi_nr_pnf_start_response_t* resp);
|
||||||
|
|
||||||
/*! A callback for the PNF_STOP.resp
|
/*! A callback for the PNF_STOP.resp
|
||||||
* \param config A pointer to the vnf configuration
|
* \param config A pointer to the vnf configuration
|
||||||
* \param p5_idx The p5 index used to indicate a particular pnf p5 connection
|
* \param p5_idx The p5 index used to indicate a particular pnf p5 connection
|
||||||
@@ -249,6 +254,7 @@ typedef struct nfapi_vnf_config
|
|||||||
* use the codec_config.deallocate function to release it at a future point
|
* use the codec_config.deallocate function to release it at a future point
|
||||||
*/
|
*/
|
||||||
int (*param_resp)(nfapi_vnf_config_t* config, int p5_idx, nfapi_param_response_t* resp);
|
int (*param_resp)(nfapi_vnf_config_t* config, int p5_idx, nfapi_param_response_t* resp);
|
||||||
|
int (*nr_param_resp)(nfapi_vnf_config_t* config, int p5_idx, nfapi_nr_param_response_scf_t* resp);
|
||||||
|
|
||||||
/*! A callback for the CONFIG.response
|
/*! A callback for the CONFIG.response
|
||||||
* \param config A pointer to the vnf configuration
|
* \param config A pointer to the vnf configuration
|
||||||
@@ -266,8 +272,9 @@ typedef struct nfapi_vnf_config
|
|||||||
* then the substructure pointers should be set to 0 and then the client should
|
* then the substructure pointers should be set to 0 and then the client should
|
||||||
* use the codec_config.deallocate function to release it at a future point
|
* use the codec_config.deallocate function to release it at a future point
|
||||||
*/
|
*/
|
||||||
|
int (*nr_config_resp)(nfapi_vnf_config_t* config, int p5_idx, nfapi_nr_config_response_scf_t* resp);
|
||||||
int (*config_resp)(nfapi_vnf_config_t* config, int p5_idx, nfapi_config_response_t* resp);
|
int (*config_resp)(nfapi_vnf_config_t* config, int p5_idx, nfapi_config_response_t* resp);
|
||||||
|
|
||||||
/*! A callback for the START.resp
|
/*! A callback for the START.resp
|
||||||
* \param config A pointer to the vnf configuration
|
* \param config A pointer to the vnf configuration
|
||||||
* \param p5_idx The p5 index used to indicate a particular pnf p5 connection
|
* \param p5_idx The p5 index used to indicate a particular pnf p5 connection
|
||||||
@@ -285,6 +292,7 @@ typedef struct nfapi_vnf_config
|
|||||||
* use the codec_config.deallocate function to release it at a future point
|
* use the codec_config.deallocate function to release it at a future point
|
||||||
*/
|
*/
|
||||||
int (*start_resp)(nfapi_vnf_config_t* config, int p5_idx, nfapi_start_response_t* resp);
|
int (*start_resp)(nfapi_vnf_config_t* config, int p5_idx, nfapi_start_response_t* resp);
|
||||||
|
int (*nr_start_resp)(nfapi_vnf_config_t* config, int p5_idx, nfapi_nr_start_response_scf_t* resp);
|
||||||
|
|
||||||
/*! A callback for the STOP.resp
|
/*! A callback for the STOP.resp
|
||||||
* \param config A pointer to the vnf configuration
|
* \param config A pointer to the vnf configuration
|
||||||
@@ -469,6 +477,8 @@ void nfapi_vnf_config_destory(nfapi_vnf_config_t* config);
|
|||||||
*
|
*
|
||||||
* This function will not return untill nfapi_vnf_stop is called
|
* This function will not return untill nfapi_vnf_stop is called
|
||||||
*/
|
*/
|
||||||
|
int nfapi_nr_vnf_start(nfapi_vnf_config_t* config);
|
||||||
|
|
||||||
int nfapi_vnf_start(nfapi_vnf_config_t* config);
|
int nfapi_vnf_start(nfapi_vnf_config_t* config);
|
||||||
|
|
||||||
/*! Stop the VNF library.
|
/*! Stop the VNF library.
|
||||||
@@ -500,6 +510,7 @@ int nfapi_vnf_allocate_phy(nfapi_vnf_config_t* config, int p5_idx, uint16_t* phy
|
|||||||
* \return 0 means success, -1 failure
|
* \return 0 means success, -1 failure
|
||||||
*/
|
*/
|
||||||
int nfapi_vnf_pnf_param_req(nfapi_vnf_config_t* config, int p5_idx, nfapi_pnf_param_request_t* req);
|
int nfapi_vnf_pnf_param_req(nfapi_vnf_config_t* config, int p5_idx, nfapi_pnf_param_request_t* req);
|
||||||
|
int nfapi_nr_vnf_pnf_param_req(nfapi_vnf_config_t* config, int p5_idx, nfapi_nr_pnf_param_request_t* req);
|
||||||
|
|
||||||
/*! Send the PNF_CONFIG.request
|
/*! Send the PNF_CONFIG.request
|
||||||
* \param config A pointer to a vnf config
|
* \param config A pointer to a vnf config
|
||||||
@@ -508,6 +519,7 @@ int nfapi_vnf_pnf_param_req(nfapi_vnf_config_t* config, int p5_idx, nfapi_pnf_pa
|
|||||||
* \return 0 means success, -1 failure
|
* \return 0 means success, -1 failure
|
||||||
*/
|
*/
|
||||||
int nfapi_vnf_pnf_config_req(nfapi_vnf_config_t* config,int p5_idx, nfapi_pnf_config_request_t* req);
|
int nfapi_vnf_pnf_config_req(nfapi_vnf_config_t* config,int p5_idx, nfapi_pnf_config_request_t* req);
|
||||||
|
int nfapi_nr_vnf_pnf_config_req(nfapi_vnf_config_t* config,int p5_idx, nfapi_nr_pnf_config_request_t* req);
|
||||||
|
|
||||||
/*! Send the PNF_START.request
|
/*! Send the PNF_START.request
|
||||||
* \param config A pointer to a vnf config
|
* \param config A pointer to a vnf config
|
||||||
@@ -516,6 +528,7 @@ int nfapi_vnf_pnf_config_req(nfapi_vnf_config_t* config,int p5_idx, nfapi_pnf_co
|
|||||||
* \return 0 means success, -1 failure
|
* \return 0 means success, -1 failure
|
||||||
*/
|
*/
|
||||||
int nfapi_vnf_pnf_start_req(nfapi_vnf_config_t* config,int p5_idx, nfapi_pnf_start_request_t* req);
|
int nfapi_vnf_pnf_start_req(nfapi_vnf_config_t* config,int p5_idx, nfapi_pnf_start_request_t* req);
|
||||||
|
int nfapi_nr_vnf_pnf_start_req(nfapi_vnf_config_t* config,int p5_idx, nfapi_nr_pnf_start_request_t* req);
|
||||||
|
|
||||||
/*! Send the PNF_STOP.request
|
/*! Send the PNF_STOP.request
|
||||||
* \param config A pointer to a vnf config
|
* \param config A pointer to a vnf config
|
||||||
@@ -532,6 +545,7 @@ int nfapi_vnf_pnf_stop_req(nfapi_vnf_config_t* config,int p5_idx, nfapi_pnf_stop
|
|||||||
* \return 0 means success, -1 failure
|
* \return 0 means success, -1 failure
|
||||||
*/
|
*/
|
||||||
int nfapi_vnf_param_req(nfapi_vnf_config_t* config, int p5_idx, nfapi_param_request_t* req);
|
int nfapi_vnf_param_req(nfapi_vnf_config_t* config, int p5_idx, nfapi_param_request_t* req);
|
||||||
|
int nfapi_nr_vnf_param_req(nfapi_vnf_config_t* config, int p5_idx, nfapi_nr_param_request_scf_t* req);
|
||||||
|
|
||||||
/*! Send the CONFIG.request
|
/*! Send the CONFIG.request
|
||||||
* \param config A pointer to a vnf config
|
* \param config A pointer to a vnf config
|
||||||
@@ -539,6 +553,7 @@ int nfapi_vnf_param_req(nfapi_vnf_config_t* config, int p5_idx, nfapi_param_requ
|
|||||||
* \param req A pointer to a CONFIG.request message structure
|
* \param req A pointer to a CONFIG.request message structure
|
||||||
* \return 0 means success, -1 failure
|
* \return 0 means success, -1 failure
|
||||||
*/
|
*/
|
||||||
|
int nfapi_nr_vnf_config_req(nfapi_vnf_config_t* config, int p5_idx, nfapi_nr_config_request_scf_t* req);
|
||||||
int nfapi_vnf_config_req(nfapi_vnf_config_t* config, int p5_idx, nfapi_config_request_t* req);
|
int nfapi_vnf_config_req(nfapi_vnf_config_t* config, int p5_idx, nfapi_config_request_t* req);
|
||||||
|
|
||||||
/*! Send the START.request
|
/*! Send the START.request
|
||||||
@@ -548,6 +563,7 @@ int nfapi_vnf_config_req(nfapi_vnf_config_t* config, int p5_idx, nfapi_config_re
|
|||||||
* \return 0 means success, -1 failure
|
* \return 0 means success, -1 failure
|
||||||
*/
|
*/
|
||||||
int nfapi_vnf_start_req(nfapi_vnf_config_t* config, int p5_idx, nfapi_start_request_t* req);
|
int nfapi_vnf_start_req(nfapi_vnf_config_t* config, int p5_idx, nfapi_start_request_t* req);
|
||||||
|
int nfapi_nr_vnf_start_req(nfapi_vnf_config_t* config, int p5_idx, nfapi_nr_start_request_scf_t* req);
|
||||||
|
|
||||||
/*! Send the STOP.request
|
/*! Send the STOP.request
|
||||||
* \param config A pointer to a vnf config
|
* \param config A pointer to a vnf config
|
||||||
@@ -692,6 +708,7 @@ typedef struct nfapi_vnf_p7_config
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
int (*subframe_indication)(struct nfapi_vnf_p7_config* config, uint16_t phy_id, uint16_t sfn_sf);
|
int (*subframe_indication)(struct nfapi_vnf_p7_config* config, uint16_t phy_id, uint16_t sfn_sf);
|
||||||
|
int (*slot_indication)(struct nfapi_vnf_p7_config* config, uint16_t phy_id, uint16_t sfn, uint16_t slot);
|
||||||
|
|
||||||
/*! A callback for the HARQ.indication
|
/*! A callback for the HARQ.indication
|
||||||
* \param config A pointer to the vnf p7 configuration
|
* \param config A pointer to the vnf p7 configuration
|
||||||
@@ -885,6 +902,8 @@ void nfapi_vnf_p7_config_destory(nfapi_vnf_p7_config_t* config);
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
int nfapi_vnf_p7_start(nfapi_vnf_p7_config_t* config);
|
int nfapi_vnf_p7_start(nfapi_vnf_p7_config_t* config);
|
||||||
|
int nfapi_nr_vnf_p7_start(nfapi_vnf_p7_config_t* config);
|
||||||
|
|
||||||
|
|
||||||
/*! Stop the VNF P7 library.
|
/*! Stop the VNF P7 library.
|
||||||
* \param config A pointer to an vnf p7 configuration structure
|
* \param config A pointer to an vnf p7 configuration structure
|
||||||
@@ -950,7 +969,7 @@ int nfapi_vnf_p7_nr_dl_config_req(nfapi_vnf_p7_config_t* config, nfapi_nr_dl_tti
|
|||||||
* may be released after this function call has returned or at a later pointer
|
* may be released after this function call has returned or at a later pointer
|
||||||
*/
|
*/
|
||||||
int nfapi_vnf_p7_ul_config_req(nfapi_vnf_p7_config_t* config, nfapi_ul_config_request_t* req);
|
int nfapi_vnf_p7_ul_config_req(nfapi_vnf_p7_config_t* config, nfapi_ul_config_request_t* req);
|
||||||
|
int nfapi_vnf_p7_ul_tti_req(nfapi_vnf_p7_config_t* config, nfapi_nr_ul_tti_request_t* req);
|
||||||
/*! Send the HI_DCI0.request
|
/*! Send the HI_DCI0.request
|
||||||
* \param config A pointer to the vnf p7 configuration
|
* \param config A pointer to the vnf p7 configuration
|
||||||
* \param req A data structure for the decoded HI_DCI0.request.
|
* \param req A data structure for the decoded HI_DCI0.request.
|
||||||
@@ -960,7 +979,7 @@ int nfapi_vnf_p7_ul_config_req(nfapi_vnf_p7_config_t* config, nfapi_ul_config_re
|
|||||||
* may be released after this function call has returned or at a later pointer
|
* may be released after this function call has returned or at a later pointer
|
||||||
*/
|
*/
|
||||||
int nfapi_vnf_p7_hi_dci0_req(nfapi_vnf_p7_config_t* config, nfapi_hi_dci0_request_t* req);
|
int nfapi_vnf_p7_hi_dci0_req(nfapi_vnf_p7_config_t* config, nfapi_hi_dci0_request_t* req);
|
||||||
|
int nfapi_vnf_p7_ul_dci_req(nfapi_vnf_p7_config_t* config, nfapi_nr_ul_dci_request_t* req);
|
||||||
/*! Send the TX.req
|
/*! Send the TX.req
|
||||||
* \param config A pointer to the vnf p7 configuration
|
* \param config A pointer to the vnf p7 configuration
|
||||||
* \param req A data structure for the decoded HI_DCI0.request.
|
* \param req A data structure for the decoded HI_DCI0.request.
|
||||||
@@ -970,7 +989,7 @@ int nfapi_vnf_p7_hi_dci0_req(nfapi_vnf_p7_config_t* config, nfapi_hi_dci0_reques
|
|||||||
* may be released after this function call has returned or at a later pointer
|
* may be released after this function call has returned or at a later pointer
|
||||||
*/
|
*/
|
||||||
int nfapi_vnf_p7_tx_req(nfapi_vnf_p7_config_t* config, nfapi_tx_request_t* req);
|
int nfapi_vnf_p7_tx_req(nfapi_vnf_p7_config_t* config, nfapi_tx_request_t* req);
|
||||||
|
int nfapi_vnf_p7_tx_data_req(nfapi_vnf_p7_config_t* config, nfapi_nr_tx_data_request_t* req);
|
||||||
/*! Send the LBT_DL_CONFIG.requst
|
/*! Send the LBT_DL_CONFIG.requst
|
||||||
* \param config A pointer to the vnf p7 configuration
|
* \param config A pointer to the vnf p7 configuration
|
||||||
* \param req A data structure for the decoded LBT_DL_CONFIG.request.
|
* \param req A data structure for the decoded LBT_DL_CONFIG.request.
|
||||||
|
|||||||
@@ -21,9 +21,12 @@
|
|||||||
#include <arpa/inet.h>
|
#include <arpa/inet.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
#include <stdio.h>
|
||||||
#include <errno.h>
|
#include <errno.h>
|
||||||
|
|
||||||
#include "vnf.h"
|
#include "vnf.h"
|
||||||
|
#include "nfapi_nr_interface.h"
|
||||||
|
#include "nfapi_nr_interface_scf.h"
|
||||||
|
|
||||||
|
|
||||||
void* vnf_malloc(nfapi_vnf_config_t* config, size_t size)
|
void* vnf_malloc(nfapi_vnf_config_t* config, size_t size)
|
||||||
@@ -101,6 +104,39 @@ nfapi_vnf_pnf_info_t* nfapi_vnf_pnf_list_find(nfapi_vnf_config_t* config, int p5
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void vnf_nr_handle_pnf_param_response(void *pRecvMsg, int recvMsgLen, nfapi_vnf_config_t* config, int p5_idx)
|
||||||
|
{
|
||||||
|
// ensure it's valid
|
||||||
|
if (pRecvMsg == NULL || config == NULL)
|
||||||
|
{
|
||||||
|
NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s : NULL parameters\n", __FUNCTION__);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
NFAPI_TRACE(NFAPI_TRACE_INFO, "Received PNF_PARAM.reponse\n");
|
||||||
|
|
||||||
|
nfapi_nr_pnf_param_response_t msg;
|
||||||
|
|
||||||
|
// unpack the message
|
||||||
|
if (nfapi_nr_p5_message_unpack(pRecvMsg, recvMsgLen, &msg, sizeof(msg), &config->codec_config) >= 0)
|
||||||
|
{
|
||||||
|
// Invoke the call back
|
||||||
|
if(config->pnf_nr_param_resp)
|
||||||
|
{
|
||||||
|
(config->pnf_nr_param_resp)(config, p5_idx, &msg);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s: Unpack message failed, ignoring\n", __FUNCTION__);
|
||||||
|
}
|
||||||
|
|
||||||
|
// make sure to release any dyanmic part of the message
|
||||||
|
if(msg.vendor_extension)
|
||||||
|
config->codec_config.deallocate(msg.vendor_extension);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void vnf_handle_pnf_param_response(void *pRecvMsg, int recvMsgLen, nfapi_vnf_config_t* config, int p5_idx)
|
void vnf_handle_pnf_param_response(void *pRecvMsg, int recvMsgLen, nfapi_vnf_config_t* config, int p5_idx)
|
||||||
{
|
{
|
||||||
// ensure it's valid
|
// ensure it's valid
|
||||||
@@ -134,6 +170,40 @@ void vnf_handle_pnf_param_response(void *pRecvMsg, int recvMsgLen, nfapi_vnf_con
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void vnf_nr_handle_pnf_config_response(void *pRecvMsg, int recvMsgLen, nfapi_vnf_config_t* config, int p5_idx)
|
||||||
|
{
|
||||||
|
// ensure it's valid
|
||||||
|
if (pRecvMsg == NULL || config == NULL)
|
||||||
|
{
|
||||||
|
NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s: NULL parameters\n", __FUNCTION__);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
NFAPI_TRACE(NFAPI_TRACE_INFO, "Received PNF_CONFIG_RESPONSE\n");
|
||||||
|
|
||||||
|
nfapi_nr_pnf_config_response_t msg;
|
||||||
|
|
||||||
|
// unpack the message
|
||||||
|
if (nfapi_nr_p5_message_unpack(pRecvMsg, recvMsgLen, &msg, sizeof(msg), &config->codec_config) >= 0)
|
||||||
|
{
|
||||||
|
// Invoke the call back
|
||||||
|
if(config->pnf_nr_config_resp)
|
||||||
|
{
|
||||||
|
(config->pnf_nr_config_resp)(config, p5_idx, &msg);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s: Unpack message failed, ignoring\n", __FUNCTION__);
|
||||||
|
}
|
||||||
|
|
||||||
|
// make sure to release any dyanmic part of the message
|
||||||
|
if(msg.vendor_extension)
|
||||||
|
config->codec_config.deallocate(msg.vendor_extension);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void vnf_handle_pnf_config_response(void *pRecvMsg, int recvMsgLen, nfapi_vnf_config_t* config, int p5_idx)
|
void vnf_handle_pnf_config_response(void *pRecvMsg, int recvMsgLen, nfapi_vnf_config_t* config, int p5_idx)
|
||||||
{
|
{
|
||||||
// ensure it's valid
|
// ensure it's valid
|
||||||
@@ -167,6 +237,38 @@ void vnf_handle_pnf_config_response(void *pRecvMsg, int recvMsgLen, nfapi_vnf_co
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void vnf_nr_handle_pnf_start_response(void *pRecvMsg, int recvMsgLen, nfapi_vnf_config_t* config, int p5_idx)
|
||||||
|
{
|
||||||
|
// ensure it's valid
|
||||||
|
if (pRecvMsg == NULL || config == NULL)
|
||||||
|
{
|
||||||
|
NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s: NULL parameters\n", __FUNCTION__);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
NFAPI_TRACE(NFAPI_TRACE_INFO, "Received PNF_START_RESPONSE\n");
|
||||||
|
|
||||||
|
nfapi_nr_pnf_start_response_t msg;
|
||||||
|
|
||||||
|
// unpack the message
|
||||||
|
if (nfapi_nr_p5_message_unpack(pRecvMsg, recvMsgLen, &msg, sizeof(msg), &config->codec_config) >= 0)
|
||||||
|
{
|
||||||
|
if(config->pnf_nr_start_resp)
|
||||||
|
{
|
||||||
|
(config->pnf_nr_start_resp)(config, p5_idx, &msg);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s: Unpack message failed, ignoring\n", __FUNCTION__);
|
||||||
|
}
|
||||||
|
|
||||||
|
// make sure to release any dyanmic part of the message
|
||||||
|
if(msg.vendor_extension)
|
||||||
|
config->codec_config.deallocate(msg.vendor_extension);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void vnf_handle_pnf_start_response(void *pRecvMsg, int recvMsgLen, nfapi_vnf_config_t* config, int p5_idx)
|
void vnf_handle_pnf_start_response(void *pRecvMsg, int recvMsgLen, nfapi_vnf_config_t* config, int p5_idx)
|
||||||
{
|
{
|
||||||
// ensure it's valid
|
// ensure it's valid
|
||||||
@@ -298,8 +400,113 @@ void vnf_handle_param_response(void *pRecvMsg, int recvMsgLen, nfapi_vnf_config_
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void vnf_nr_handle_param_response(void *pRecvMsg, int recvMsgLen, nfapi_vnf_config_t* config, int p5_idx)
|
||||||
|
{
|
||||||
|
|
||||||
|
// ensure it's valid
|
||||||
|
if (pRecvMsg == NULL || config == NULL)
|
||||||
|
{
|
||||||
|
NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s: NULL parameters\n", __FUNCTION__);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
NFAPI_TRACE(NFAPI_TRACE_INFO, "Received PARAM_RESPONSE\n");
|
||||||
|
|
||||||
|
nfapi_nr_param_response_scf_t msg;
|
||||||
|
|
||||||
|
// unpack the message
|
||||||
|
if (nfapi_nr_p5_message_unpack(pRecvMsg, recvMsgLen, &msg, sizeof(msg), &config->codec_config) >= 0)
|
||||||
|
{
|
||||||
|
|
||||||
|
if (msg.error_code == NFAPI_NR_PARAM_MSG_OK)
|
||||||
|
{
|
||||||
|
nfapi_vnf_phy_info_t* phy_info = nfapi_vnf_phy_info_list_find(config, msg.header.phy_id);
|
||||||
|
|
||||||
|
if(msg.nfapi_config.p7_pnf_address_ipv4.tl.tag)
|
||||||
|
{
|
||||||
|
struct sockaddr_in sockAddr;
|
||||||
|
|
||||||
|
(void)memcpy(&sockAddr.sin_addr.s_addr, msg.nfapi_config.p7_pnf_address_ipv4.address, NFAPI_IPV4_ADDRESS_LENGTH);
|
||||||
|
NFAPI_TRACE(NFAPI_TRACE_INFO, "PNF P7 IPv4 address: %s\n", inet_ntoa(sockAddr.sin_addr));
|
||||||
|
|
||||||
|
// store address
|
||||||
|
phy_info->p7_pnf_address.sin_addr = sockAddr.sin_addr;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(msg.nfapi_config.p7_pnf_address_ipv6.tl.tag)
|
||||||
|
{
|
||||||
|
struct sockaddr_in6 sockAddr6;
|
||||||
|
char addr6[64];
|
||||||
|
(void)memcpy(&sockAddr6.sin6_addr, msg.nfapi_config.p7_pnf_address_ipv6.address, NFAPI_IPV6_ADDRESS_LENGTH);
|
||||||
|
NFAPI_TRACE(NFAPI_TRACE_INFO, "PNF P7 IPv6 address: %s\n", inet_ntop(AF_INET6, &sockAddr6.sin6_addr, addr6, sizeof(addr6)));
|
||||||
|
}
|
||||||
|
|
||||||
|
if (msg.nfapi_config.p7_pnf_port.tl.tag)
|
||||||
|
{
|
||||||
|
NFAPI_TRACE(NFAPI_TRACE_INFO, "PNF P7 Port: %d\n", msg.nfapi_config.p7_pnf_port.value);
|
||||||
|
|
||||||
|
// store port
|
||||||
|
phy_info->p7_pnf_address.sin_port = htons(msg.nfapi_config.p7_pnf_port.value);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if(config->nr_param_resp)
|
||||||
|
{
|
||||||
|
(config->nr_param_resp)(config, p5_idx, &msg);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s: Unpack message failed, ignoring\n", __FUNCTION__);
|
||||||
|
}
|
||||||
|
|
||||||
|
// make sure to release any dyanmic part of the message
|
||||||
|
if(msg.vendor_extension)
|
||||||
|
config->codec_config.deallocate(msg.vendor_extension);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void vnf_nr_handle_config_response(void *pRecvMsg, int recvMsgLen, nfapi_vnf_config_t* config, int p5_idx)
|
||||||
|
{
|
||||||
|
|
||||||
|
// ensure it's valid
|
||||||
|
if (pRecvMsg == NULL || config == NULL)
|
||||||
|
{
|
||||||
|
NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s: NULL parameters\n", __FUNCTION__);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
NFAPI_TRACE(NFAPI_TRACE_INFO, "Received CONFIG_RESPONSE\n");
|
||||||
|
|
||||||
|
nfapi_nr_config_response_scf_t msg;
|
||||||
|
|
||||||
|
// unpack the message
|
||||||
|
if (nfapi_nr_p5_message_unpack(pRecvMsg, recvMsgLen, &msg, sizeof(msg), &config->codec_config) >=0 )
|
||||||
|
{
|
||||||
|
// check the error code:
|
||||||
|
|
||||||
|
if (msg.error_code == NFAPI_NR_CONFIG_MSG_OK){
|
||||||
|
if(config->nr_config_resp)
|
||||||
|
{
|
||||||
|
(config->nr_config_resp)(config, p5_idx, &msg);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s: Unpack message failed, ignoring\n", __FUNCTION__);
|
||||||
|
}
|
||||||
|
|
||||||
|
// make sure to release any dyanmic part of the message
|
||||||
|
if(msg.vendor_extension)
|
||||||
|
config->codec_config.deallocate(msg.vendor_extension);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void vnf_handle_config_response(void *pRecvMsg, int recvMsgLen, nfapi_vnf_config_t* config, int p5_idx)
|
void vnf_handle_config_response(void *pRecvMsg, int recvMsgLen, nfapi_vnf_config_t* config, int p5_idx)
|
||||||
{
|
{
|
||||||
|
|
||||||
// ensure it's valid
|
// ensure it's valid
|
||||||
if (pRecvMsg == NULL || config == NULL)
|
if (pRecvMsg == NULL || config == NULL)
|
||||||
{
|
{
|
||||||
@@ -314,9 +521,13 @@ void vnf_handle_config_response(void *pRecvMsg, int recvMsgLen, nfapi_vnf_config
|
|||||||
// unpack the message
|
// unpack the message
|
||||||
if (nfapi_p5_message_unpack(pRecvMsg, recvMsgLen, &msg, sizeof(msg), &config->codec_config) >=0 )
|
if (nfapi_p5_message_unpack(pRecvMsg, recvMsgLen, &msg, sizeof(msg), &config->codec_config) >=0 )
|
||||||
{
|
{
|
||||||
if(config->config_resp)
|
// check the error code:
|
||||||
{
|
|
||||||
(config->config_resp)(config, p5_idx, &msg);
|
if (msg.error_code == NFAPI_MSG_OK){
|
||||||
|
if(config->config_resp)
|
||||||
|
{
|
||||||
|
(config->config_resp)(config, p5_idx, &msg);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@@ -362,6 +573,40 @@ void vnf_handle_start_response(void *pRecvMsg, int recvMsgLen, nfapi_vnf_config_
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void vnf_nr_handle_start_response(void *pRecvMsg, int recvMsgLen, nfapi_vnf_config_t* config, int p5_idx)
|
||||||
|
{
|
||||||
|
// ensure it's valid
|
||||||
|
if (pRecvMsg == NULL || config == NULL)
|
||||||
|
{
|
||||||
|
NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s: NULL parameters\n", __FUNCTION__);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
NFAPI_TRACE(NFAPI_TRACE_INFO, "Received START_RESPONSE\n");
|
||||||
|
|
||||||
|
nfapi_nr_start_response_scf_t msg;
|
||||||
|
|
||||||
|
// unpack the message
|
||||||
|
if (nfapi_nr_p5_message_unpack(pRecvMsg, recvMsgLen, &msg, sizeof(msg), &config->codec_config) >= 0)
|
||||||
|
{ // check the error code
|
||||||
|
if (msg.error_code == NFAPI_NR_START_MSG_OK){
|
||||||
|
if(config->nr_start_resp)
|
||||||
|
{
|
||||||
|
(config->nr_start_resp)(config, p5_idx, &msg);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s: Unpack message failed, ignoring\n", __FUNCTION__);
|
||||||
|
}
|
||||||
|
|
||||||
|
// make sure to release any dyanmic part of the message
|
||||||
|
if(msg.vendor_extension)
|
||||||
|
config->codec_config.deallocate(msg.vendor_extension);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void vnf_handle_stop_response(void *pRecvMsg, int recvMsgLen, nfapi_vnf_config_t* config, int p5_idx)
|
void vnf_handle_stop_response(void *pRecvMsg, int recvMsgLen, nfapi_vnf_config_t* config, int p5_idx)
|
||||||
{
|
{
|
||||||
|
|
||||||
@@ -811,6 +1056,74 @@ void vnf_handle_vendor_extension(void* pRecvMsg, int recvMsgLen, nfapi_vnf_confi
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void vnf_nr_handle_p4_p5_message(void *pRecvMsg, int recvMsgLen, int p5_idx, nfapi_vnf_config_t* config)
|
||||||
|
{
|
||||||
|
nfapi_p4_p5_message_header_t messageHeader;
|
||||||
|
|
||||||
|
// validate the input params
|
||||||
|
if(pRecvMsg == NULL || recvMsgLen < NFAPI_HEADER_LENGTH || config == NULL)
|
||||||
|
{
|
||||||
|
NFAPI_TRACE(NFAPI_TRACE_ERROR, "vnf_handle_p4_p5_message: invalid input params\n");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// unpack the message header
|
||||||
|
if (nfapi_p5_message_header_unpack(pRecvMsg, recvMsgLen, &messageHeader, sizeof(nfapi_p4_p5_message_header_t), &config->codec_config) < 0)
|
||||||
|
{
|
||||||
|
NFAPI_TRACE(NFAPI_TRACE_ERROR, "Unpack message header failed, ignoring\n");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
switch (messageHeader.message_id)
|
||||||
|
{
|
||||||
|
case NFAPI_NR_PHY_MSG_TYPE_PNF_PARAM_RESPONSE:
|
||||||
|
vnf_nr_handle_pnf_param_response(pRecvMsg, recvMsgLen, config, p5_idx);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case NFAPI_NR_PHY_MSG_TYPE_PNF_CONFIG_RESPONSE:
|
||||||
|
vnf_nr_handle_pnf_config_response(pRecvMsg, recvMsgLen, config, p5_idx);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case NFAPI_NR_PHY_MSG_TYPE_PNF_START_RESPONSE:
|
||||||
|
vnf_nr_handle_pnf_start_response(pRecvMsg, recvMsgLen, config, p5_idx);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case NFAPI_PNF_STOP_RESPONSE:
|
||||||
|
vnf_handle_pnf_stop_response(pRecvMsg, recvMsgLen, config, p5_idx);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case NFAPI_NR_PHY_MSG_TYPE_PARAM_RESPONSE:
|
||||||
|
vnf_nr_handle_param_response(pRecvMsg, recvMsgLen, config, p5_idx);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case NFAPI_NR_PHY_MSG_TYPE_CONFIG_RESPONSE:
|
||||||
|
vnf_nr_handle_config_response(pRecvMsg, recvMsgLen, config, p5_idx);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case NFAPI_NR_PHY_MSG_TYPE_START_RESPONSE:
|
||||||
|
vnf_nr_handle_start_response(pRecvMsg, recvMsgLen, config, p5_idx);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case NFAPI_NR_PHY_MSG_TYPE_STOP_RESPONSE:
|
||||||
|
vnf_handle_stop_response(pRecvMsg, recvMsgLen, config, p5_idx);
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
{
|
||||||
|
if(messageHeader.message_id >= NFAPI_VENDOR_EXT_MSG_MIN &&
|
||||||
|
messageHeader.message_id <= NFAPI_VENDOR_EXT_MSG_MAX)
|
||||||
|
{
|
||||||
|
vnf_handle_vendor_extension(pRecvMsg, recvMsgLen, config, p5_idx, messageHeader.message_id);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s P5 Unknown message ID %d\n", __FUNCTION__, messageHeader.message_id);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void vnf_handle_p4_p5_message(void *pRecvMsg, int recvMsgLen, int p5_idx, nfapi_vnf_config_t* config)
|
void vnf_handle_p4_p5_message(void *pRecvMsg, int recvMsgLen, int p5_idx, nfapi_vnf_config_t* config)
|
||||||
{
|
{
|
||||||
nfapi_p4_p5_message_header_t messageHeader;
|
nfapi_p4_p5_message_header_t messageHeader;
|
||||||
@@ -926,6 +1239,137 @@ void vnf_handle_p4_p5_message(void *pRecvMsg, int recvMsgLen, int p5_idx, nfapi_
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int vnf_nr_read_dispatch_message(nfapi_vnf_config_t* config, nfapi_vnf_pnf_info_t* pnf)
|
||||||
|
{
|
||||||
|
if(1)
|
||||||
|
{
|
||||||
|
int socket_connected = 1;
|
||||||
|
|
||||||
|
// 1. Peek the message header
|
||||||
|
// 2. If the message is larger than the stack buffer then create a dynamic buffer
|
||||||
|
// 3. Read the buffer
|
||||||
|
// 4. Handle the p5 message
|
||||||
|
|
||||||
|
uint32_t header_buffer_size = NFAPI_HEADER_LENGTH;
|
||||||
|
uint8_t header_buffer[header_buffer_size];
|
||||||
|
|
||||||
|
uint32_t stack_buffer_size = 32; //should it be the size of then sctp_notificatoin structure
|
||||||
|
uint8_t stack_buffer[stack_buffer_size];
|
||||||
|
|
||||||
|
uint8_t* dynamic_buffer = 0;
|
||||||
|
|
||||||
|
uint8_t* read_buffer = &stack_buffer[0];
|
||||||
|
uint32_t message_size = 0;
|
||||||
|
|
||||||
|
struct sockaddr_in addr;
|
||||||
|
socklen_t addr_len = sizeof(addr);
|
||||||
|
|
||||||
|
struct sctp_sndrcvinfo sndrcvinfo;
|
||||||
|
(void)memset(&sndrcvinfo, 0, sizeof(struct sctp_sndrcvinfo));
|
||||||
|
|
||||||
|
{
|
||||||
|
int flags = MSG_PEEK;
|
||||||
|
message_size = sctp_recvmsg(pnf->p5_sock, header_buffer, header_buffer_size, (struct sockaddr*)&addr, &addr_len, &sndrcvinfo, &flags);
|
||||||
|
|
||||||
|
if(message_size == -1)
|
||||||
|
{
|
||||||
|
NFAPI_TRACE(NFAPI_TRACE_INFO, "VNF Failed to peek sctp message size errno:%d\n", errno);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
nfapi_p4_p5_message_header_t header;
|
||||||
|
int unpack_result = nfapi_p5_message_header_unpack(header_buffer, header_buffer_size, &header, sizeof(header), 0);
|
||||||
|
if(unpack_result < 0)
|
||||||
|
{
|
||||||
|
NFAPI_TRACE(NFAPI_TRACE_INFO, "VNF Failed to decode message header %d\n", unpack_result);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
message_size = header.message_length;
|
||||||
|
|
||||||
|
// now have the size of the mesage
|
||||||
|
}
|
||||||
|
|
||||||
|
if(message_size > stack_buffer_size)
|
||||||
|
{
|
||||||
|
dynamic_buffer = (uint8_t*)malloc(message_size);
|
||||||
|
|
||||||
|
if(dynamic_buffer == NULL)
|
||||||
|
{
|
||||||
|
// todo : add error mesage
|
||||||
|
NFAPI_TRACE(NFAPI_TRACE_INFO, "VNF Failed to allocate dynamic buffer for sctp_recvmsg size:%d\n", message_size);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
read_buffer = dynamic_buffer;
|
||||||
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
int flags = 0;
|
||||||
|
(void)memset(&sndrcvinfo, 0, sizeof(struct sctp_sndrcvinfo));
|
||||||
|
|
||||||
|
int recvmsg_result = sctp_recvmsg(pnf->p5_sock, read_buffer, message_size, (struct sockaddr*)&addr, &addr_len, &sndrcvinfo, &flags);
|
||||||
|
if(recvmsg_result == -1)
|
||||||
|
{
|
||||||
|
NFAPI_TRACE(NFAPI_TRACE_INFO, "Failed to read sctp message size errno:%d\n", errno);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (flags & MSG_NOTIFICATION)
|
||||||
|
{
|
||||||
|
NFAPI_TRACE(NFAPI_TRACE_INFO, "Notification received from %s:%u\n", inet_ntoa(addr.sin_addr), ntohs(addr.sin_port));
|
||||||
|
|
||||||
|
// todo - handle the events
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
/*
|
||||||
|
NFAPI_TRACE(NFAPI_TRACE_INFO, "Received message fd:%d from %s:%u assoc:%d on stream %d, PPID %d, length %d, flags 0x%x\n",
|
||||||
|
pnf->p5_sock,
|
||||||
|
inet_ntoa(addr.sin_addr),
|
||||||
|
ntohs(addr.sin_port),
|
||||||
|
sndrcvinfo.sinfo_assoc_id,
|
||||||
|
sndrcvinfo.sinfo_stream,
|
||||||
|
ntohl(sndrcvinfo.sinfo_ppid),
|
||||||
|
message_size,
|
||||||
|
flags);
|
||||||
|
*/
|
||||||
|
|
||||||
|
// handle now if complete message in one or more segments
|
||||||
|
if ((flags & 0x80) == 0x80)
|
||||||
|
{
|
||||||
|
// printf("\nVNF RECEIVES:\n");
|
||||||
|
// for(int i=0; i<message_size; i++){
|
||||||
|
// printf("%d", read_buffer[i]);
|
||||||
|
// }
|
||||||
|
// printf("\n");
|
||||||
|
|
||||||
|
vnf_nr_handle_p4_p5_message(read_buffer, message_size, pnf->p5_idx, config);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
NFAPI_TRACE(NFAPI_TRACE_WARN, "sctp_recvmsg: unhandled mode with flags 0x%x\n", flags);
|
||||||
|
|
||||||
|
// assume socket disconnected
|
||||||
|
NFAPI_TRACE(NFAPI_TRACE_WARN, "Disconnected socket\n");
|
||||||
|
socket_connected = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if(dynamic_buffer)
|
||||||
|
{
|
||||||
|
free(dynamic_buffer);
|
||||||
|
}
|
||||||
|
|
||||||
|
return socket_connected;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
int vnf_read_dispatch_message(nfapi_vnf_config_t* config, nfapi_vnf_pnf_info_t* pnf)
|
int vnf_read_dispatch_message(nfapi_vnf_config_t* config, nfapi_vnf_pnf_info_t* pnf)
|
||||||
{
|
{
|
||||||
if(1)
|
if(1)
|
||||||
@@ -1024,6 +1468,12 @@ int vnf_read_dispatch_message(nfapi_vnf_config_t* config, nfapi_vnf_pnf_info_t*
|
|||||||
// handle now if complete message in one or more segments
|
// handle now if complete message in one or more segments
|
||||||
if ((flags & 0x80) == 0x80)
|
if ((flags & 0x80) == 0x80)
|
||||||
{
|
{
|
||||||
|
// printf("\nVNF RECEIVES:\n");
|
||||||
|
// for(int i=0; i<message_size; i++){
|
||||||
|
// printf("%d", read_buffer[i]);
|
||||||
|
// }
|
||||||
|
// printf("\n");
|
||||||
|
|
||||||
vnf_handle_p4_p5_message(read_buffer, message_size, pnf->p5_idx, config);
|
vnf_handle_p4_p5_message(read_buffer, message_size, pnf->p5_idx, config);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@@ -1051,6 +1501,12 @@ int vnf_read_dispatch_message(nfapi_vnf_config_t* config, nfapi_vnf_pnf_info_t*
|
|||||||
|
|
||||||
static int vnf_send_p5_msg(nfapi_vnf_pnf_info_t* pnf, const void *msg, int len, uint8_t stream)
|
static int vnf_send_p5_msg(nfapi_vnf_pnf_info_t* pnf, const void *msg, int len, uint8_t stream)
|
||||||
{
|
{
|
||||||
|
// printf("\n MESSAGE SENT: \n");
|
||||||
|
// for(int i=0; i<len; i++){
|
||||||
|
// printf("%d", *(uint8_t *)(msg + i));
|
||||||
|
// }
|
||||||
|
// printf("\n");
|
||||||
|
|
||||||
//NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s len:%d stream:%d\n", __FUNCTION__, len, stream);
|
//NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s len:%d stream:%d\n", __FUNCTION__, len, stream);
|
||||||
|
|
||||||
int result = sctp_sendmsg(pnf->p5_sock, msg, len, (struct sockaddr*)&pnf->p5_pnf_sockaddr, sizeof(pnf->p5_pnf_sockaddr),1, 0, stream, 0, 4);
|
int result = sctp_sendmsg(pnf->p5_sock, msg, len, (struct sockaddr*)&pnf->p5_pnf_sockaddr, sizeof(pnf->p5_pnf_sockaddr),1, 0, stream, 0, 4);
|
||||||
@@ -1071,6 +1527,29 @@ static int vnf_send_p5_msg(nfapi_vnf_pnf_info_t* pnf, const void *msg, int len,
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int vnf_nr_pack_and_send_p5_message(vnf_t* vnf, uint16_t p5_idx, nfapi_p4_p5_message_header_t* msg, uint16_t msg_len)
|
||||||
|
{
|
||||||
|
nfapi_vnf_pnf_info_t* pnf = nfapi_vnf_pnf_list_find(&(vnf->_public), p5_idx);
|
||||||
|
|
||||||
|
if(pnf)
|
||||||
|
{
|
||||||
|
// pack the message for transmission
|
||||||
|
int packedMessageLength = nfapi_nr_p5_message_pack(msg, msg_len, vnf->tx_message_buffer, sizeof(vnf->tx_message_buffer), &vnf->_public.codec_config);
|
||||||
|
|
||||||
|
if (packedMessageLength < 0)
|
||||||
|
{
|
||||||
|
NFAPI_TRACE(NFAPI_TRACE_ERROR, "nfapi_p5_message_pack failed with return %d\n", packedMessageLength);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
return vnf_send_p5_msg(pnf, vnf->tx_message_buffer, packedMessageLength, 0);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
NFAPI_TRACE(NFAPI_TRACE_INFO, "%s() cannot find pnf info for p5_idx:%d\n", __FUNCTION__, p5_idx);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
int vnf_pack_and_send_p5_message(vnf_t* vnf, uint16_t p5_idx, nfapi_p4_p5_message_header_t* msg, uint16_t msg_len)
|
int vnf_pack_and_send_p5_message(vnf_t* vnf, uint16_t p5_idx, nfapi_p4_p5_message_header_t* msg, uint16_t msg_len)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -63,6 +63,418 @@ void nfapi_vnf_config_destory(nfapi_vnf_config_t* config)
|
|||||||
free(config);
|
free(config);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int nfapi_nr_vnf_start(nfapi_vnf_config_t* config)
|
||||||
|
{
|
||||||
|
// Verify that config is not null
|
||||||
|
if(config == 0)
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
// Make sure to set the defined trace function before using NFAPI_TRACE
|
||||||
|
if(config->trace)
|
||||||
|
nfapi_trace_g = (nfapi_trace_fn_t)config->trace;
|
||||||
|
|
||||||
|
NFAPI_TRACE(NFAPI_TRACE_INFO, "%s()\n", __FUNCTION__);
|
||||||
|
|
||||||
|
int p5ListenSock, p5Sock;
|
||||||
|
|
||||||
|
struct sockaddr_in addr;
|
||||||
|
socklen_t addrSize;
|
||||||
|
|
||||||
|
struct sockaddr_in6 addr6;
|
||||||
|
|
||||||
|
struct sctp_event_subscribe events;
|
||||||
|
struct sctp_initmsg initMsg;
|
||||||
|
int noDelay;
|
||||||
|
|
||||||
|
(void)memset(&addr, 0, sizeof(struct sockaddr_in));
|
||||||
|
(void)memset(&addr6, 0, sizeof(struct sockaddr_in6));
|
||||||
|
(void)memset(&events, 0, sizeof(struct sctp_event_subscribe));
|
||||||
|
(void)memset(&initMsg, 0, sizeof(struct sctp_initmsg));
|
||||||
|
|
||||||
|
vnf_t* vnf = (vnf_t*)(config);
|
||||||
|
|
||||||
|
NFAPI_TRACE(NFAPI_TRACE_INFO, "Starting P5 VNF connection on port %u\n", config->vnf_p5_port);
|
||||||
|
|
||||||
|
/*
|
||||||
|
char * host = 0;
|
||||||
|
char * port = "4242";
|
||||||
|
struct addrinfo hints;
|
||||||
|
bzero(&hints, sizeof(struct addrinfo));
|
||||||
|
//hints.ai_flags=AI_PASSIVE;
|
||||||
|
//hints.ai_flags=AI_DEFAULT;
|
||||||
|
hints.ai_family=AF_UNSPEC;
|
||||||
|
//hints.ai_family=AF_INET6;
|
||||||
|
hints.ai_socktype=SOCK_STREAM;
|
||||||
|
//hints.ai_protocol=IPPROTO_SCTP
|
||||||
|
|
||||||
|
struct addrinfo *aiHead = 0;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
int result = getaddrinfo(host, port, &hints, &aiHead);
|
||||||
|
NFAPI_TRACE(NFAPI_TRACE_INFO, "getaddrinfo return %d %d\n", result, errno);
|
||||||
|
|
||||||
|
while(aiHead->ai_next != NULL)
|
||||||
|
{
|
||||||
|
NFAPI_TRACE(NFAPI_TRACE_INFO, "addr info %d (IP %d UDP %d SCTP %d)\n %d (%d)\n",
|
||||||
|
aiHead->ai_protocol, IPPROTO_IP, IPPROTO_UDP, IPPROTO_SCTP,
|
||||||
|
aiHead->ai_flags, AI_PASSIVE);
|
||||||
|
|
||||||
|
char hostBfr[ NI_MAXHOST ];
|
||||||
|
char servBfr[ NI_MAXSERV ];
|
||||||
|
|
||||||
|
getnameinfo(aiHead->ai_addr,
|
||||||
|
aiHead->ai_addrlen,
|
||||||
|
hostBfr,
|
||||||
|
sizeof( hostBfr ),
|
||||||
|
servBfr,
|
||||||
|
sizeof( servBfr ),
|
||||||
|
NI_NUMERICHOST | NI_NUMERICSERV );
|
||||||
|
|
||||||
|
switch(aiHead->ai_family)
|
||||||
|
{
|
||||||
|
case PF_INET:
|
||||||
|
{
|
||||||
|
struct sockaddr_in *pSadrIn = (struct sockaddr_in*) aiHead->ai_addr;
|
||||||
|
printf(
|
||||||
|
" ai_addr = sin_family: %d (AF_INET = %d, "
|
||||||
|
"AF_INET6 = %d)\n"
|
||||||
|
" sin_addr: %s\n"
|
||||||
|
" sin_port: %s\n",
|
||||||
|
pSadrIn->sin_family,
|
||||||
|
AF_INET,
|
||||||
|
AF_INET6,
|
||||||
|
hostBfr,
|
||||||
|
servBfr );
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case PF_INET6:
|
||||||
|
{
|
||||||
|
struct sockaddr_in6 *pSadrIn6 = (struct sockaddr_in6*) aiHead->ai_addr;
|
||||||
|
fprintf( stderr,
|
||||||
|
" ai_addr = sin6_family: %d (AF_INET = %d, "
|
||||||
|
"AF_INET6 = %d) \n"
|
||||||
|
" sin6_addr: %s\n"
|
||||||
|
" sin6_port: %s\n"
|
||||||
|
" sin6_flowinfo: %d\n"
|
||||||
|
" sin6_scope_id: %d\n",
|
||||||
|
pSadrIn6->sin6_family,
|
||||||
|
AF_INET,
|
||||||
|
AF_INET6,
|
||||||
|
hostBfr,
|
||||||
|
servBfr,
|
||||||
|
pSadrIn6->sin6_flowinfo,
|
||||||
|
pSadrIn6->sin6_scope_id);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
NFAPI_TRACE(NFAPI_TRACE_INFO, "Not ment to be here\n");
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
aiHead = aiHead->ai_next;
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
|
||||||
|
{
|
||||||
|
int protocol;
|
||||||
|
int domain;
|
||||||
|
|
||||||
|
if (vnf->sctp)
|
||||||
|
protocol = IPPROTO_SCTP;
|
||||||
|
else
|
||||||
|
protocol = IPPROTO_IP;
|
||||||
|
|
||||||
|
if(config->vnf_ipv6)
|
||||||
|
{
|
||||||
|
domain = PF_INET6;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
domain = AF_INET;
|
||||||
|
}
|
||||||
|
|
||||||
|
// open the SCTP socket
|
||||||
|
if ((p5ListenSock = socket(domain, SOCK_STREAM, protocol)) < 0)
|
||||||
|
{
|
||||||
|
NFAPI_TRACE(NFAPI_TRACE_ERROR, "After P5 socket errno: %d\n", errno);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
NFAPI_TRACE(NFAPI_TRACE_INFO, "P5 socket created... %d\n", p5ListenSock);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (vnf->sctp)
|
||||||
|
{
|
||||||
|
// configure for MSG_NOTIFICATION
|
||||||
|
if (setsockopt(p5ListenSock, IPPROTO_SCTP, SCTP_EVENTS, &events, sizeof(struct sctp_event_subscribe)) < 0)
|
||||||
|
{
|
||||||
|
NFAPI_TRACE(NFAPI_TRACE_ERROR, "After setsockopt (SCTP_EVENTS) errno: %d\n", errno);
|
||||||
|
close(p5ListenSock);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
NFAPI_TRACE(NFAPI_TRACE_NOTE, "VNF Setting the SCTP_INITMSG\n");
|
||||||
|
// configure the SCTP socket options
|
||||||
|
initMsg.sinit_num_ostreams = 5; //MAX_SCTP_STREAMS; // number of output streams can be greater
|
||||||
|
initMsg.sinit_max_instreams = 5; //MAX_SCTP_STREAMS; // number of output streams can be greater
|
||||||
|
if (setsockopt(p5ListenSock, IPPROTO_SCTP, SCTP_INITMSG, &initMsg, sizeof(initMsg)) < 0)
|
||||||
|
{
|
||||||
|
NFAPI_TRACE(NFAPI_TRACE_ERROR, "After setsockopt (SCTP_INITMSG) errno: %d\n", errno)
|
||||||
|
close(p5ListenSock);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
noDelay = 1;
|
||||||
|
if (setsockopt(p5ListenSock, IPPROTO_SCTP, SCTP_NODELAY, &noDelay, sizeof(noDelay)) < 0)
|
||||||
|
{
|
||||||
|
NFAPI_TRACE(NFAPI_TRACE_ERROR, "After setsockopt (STCP_NODELAY) errno: %d\n", errno);
|
||||||
|
close(p5ListenSock);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
struct sctp_event_subscribe events;
|
||||||
|
memset( (void *)&events, 0, sizeof(events) );
|
||||||
|
events.sctp_data_io_event = 1;
|
||||||
|
|
||||||
|
if(setsockopt(p5ListenSock, SOL_SCTP, SCTP_EVENTS, (const void *)&events, sizeof(events)) < 0)
|
||||||
|
{
|
||||||
|
NFAPI_TRACE(NFAPI_TRACE_ERROR, "After setsockopt errno: %d\n", errno);
|
||||||
|
close(p5ListenSock);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
if(config->vnf_ipv6)
|
||||||
|
{
|
||||||
|
NFAPI_TRACE(NFAPI_TRACE_INFO, "IPV6 binding to port %d %d\n", config->vnf_p5_port, p5ListenSock);
|
||||||
|
addr6.sin6_family = AF_INET6;
|
||||||
|
addr6.sin6_port = htons(config->vnf_p5_port);
|
||||||
|
addr6.sin6_addr = in6addr_any;
|
||||||
|
|
||||||
|
// bind to the configured address and port
|
||||||
|
if (bind(p5ListenSock, (struct sockaddr *)&addr6, sizeof(struct sockaddr_in6)) < 0)
|
||||||
|
{
|
||||||
|
NFAPI_TRACE(NFAPI_TRACE_ERROR, "After bind errno: %d\n", errno);
|
||||||
|
close(p5ListenSock);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if(config->vnf_ipv4)
|
||||||
|
{
|
||||||
|
NFAPI_TRACE(NFAPI_TRACE_INFO, "IPV4 binding to port %d\n", config->vnf_p5_port);
|
||||||
|
addr.sin_family = AF_INET;
|
||||||
|
addr.sin_port = htons(config->vnf_p5_port);
|
||||||
|
addr.sin_addr.s_addr = INADDR_ANY;
|
||||||
|
|
||||||
|
// bind to the configured address and port
|
||||||
|
if (bind(p5ListenSock, (struct sockaddr *)&addr, sizeof(struct sockaddr_in)) < 0)
|
||||||
|
//if (sctp_bindx(p5ListenSock, (struct sockaddr *)&addr, sizeof(struct sockaddr_in), SCTP_BINDX_ADD_ADDR) < 0)
|
||||||
|
{
|
||||||
|
NFAPI_TRACE(NFAPI_TRACE_ERROR, "After bind errno: %d\n", errno);
|
||||||
|
close(p5ListenSock);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
NFAPI_TRACE(NFAPI_TRACE_INFO, "bind succeeded..%d.\n", p5ListenSock);
|
||||||
|
|
||||||
|
// put the socket into listen mode
|
||||||
|
if (listen(p5ListenSock, 2) < 0)
|
||||||
|
{
|
||||||
|
NFAPI_TRACE(NFAPI_TRACE_ERROR, "After listen errno: %d\n", errno);
|
||||||
|
close(p5ListenSock);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
NFAPI_TRACE(NFAPI_TRACE_INFO, "listen succeeded...\n");
|
||||||
|
|
||||||
|
struct timeval tv;
|
||||||
|
fd_set read_fd_set;
|
||||||
|
|
||||||
|
|
||||||
|
int p5_idx = 0;
|
||||||
|
while(vnf->terminate == 0)
|
||||||
|
{
|
||||||
|
FD_ZERO(&read_fd_set);
|
||||||
|
|
||||||
|
FD_SET(p5ListenSock, &read_fd_set);
|
||||||
|
int max_fd = p5ListenSock;
|
||||||
|
|
||||||
|
tv.tv_sec = 5;
|
||||||
|
tv.tv_usec = 0;
|
||||||
|
|
||||||
|
nfapi_vnf_pnf_info_t* pnf = config->pnf_list;
|
||||||
|
while(pnf != 0)
|
||||||
|
{
|
||||||
|
if(pnf->connected)
|
||||||
|
{
|
||||||
|
FD_SET(pnf->p5_sock, &read_fd_set);
|
||||||
|
if (pnf->p5_sock > max_fd)
|
||||||
|
{
|
||||||
|
max_fd = pnf->p5_sock;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pnf = pnf->next;
|
||||||
|
}
|
||||||
|
|
||||||
|
int select_result = select(max_fd + 1, &read_fd_set, 0, 0, &tv);
|
||||||
|
|
||||||
|
if(select_result == -1)
|
||||||
|
{
|
||||||
|
NFAPI_TRACE(NFAPI_TRACE_INFO, "select result %d errno %d\n", select_result, errno);
|
||||||
|
close(p5ListenSock);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
else if(select_result)
|
||||||
|
{
|
||||||
|
if(FD_ISSET(p5ListenSock, &read_fd_set))
|
||||||
|
{
|
||||||
|
addrSize = sizeof(struct sockaddr_in);
|
||||||
|
NFAPI_TRACE(NFAPI_TRACE_INFO, "Accepting connection from PNF...\n");
|
||||||
|
|
||||||
|
p5Sock = accept(p5ListenSock, (struct sockaddr *)&addr, &addrSize);
|
||||||
|
|
||||||
|
if (p5Sock < 0)
|
||||||
|
{
|
||||||
|
NFAPI_TRACE(NFAPI_TRACE_ERROR, "Failed to accept PNF connection reason:%d\n", errno);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
NFAPI_TRACE(NFAPI_TRACE_INFO, "PNF connection (fd:%d) accepted from %s:%d \n", p5Sock, inet_ntoa(addr.sin_addr), ntohs(addr.sin_port));
|
||||||
|
nfapi_vnf_pnf_info_t* pnf = (nfapi_vnf_pnf_info_t*)malloc(sizeof(nfapi_vnf_pnf_info_t));
|
||||||
|
NFAPI_TRACE(NFAPI_TRACE_INFO, "MALLOC nfapi_vnf_pnf_info_t for pnf_list pnf:%p\n", pnf);
|
||||||
|
memset(pnf, 0, sizeof(nfapi_vnf_pnf_info_t));
|
||||||
|
pnf->p5_sock = p5Sock;
|
||||||
|
pnf->p5_idx = p5_idx++;
|
||||||
|
pnf->p5_pnf_sockaddr = addr;
|
||||||
|
pnf->connected = 1;
|
||||||
|
|
||||||
|
nfapi_vnf_pnf_list_add(config, pnf);
|
||||||
|
|
||||||
|
// Inform mac that a pnf connection has been established
|
||||||
|
// todo : allow mac to 'accept' the connection. i.e. to
|
||||||
|
// reject it.
|
||||||
|
if(config->pnf_nr_connection_indication != 0)
|
||||||
|
{
|
||||||
|
(config->pnf_nr_connection_indication)(config, pnf->p5_idx);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// check the connection status
|
||||||
|
{
|
||||||
|
struct sctp_status status;
|
||||||
|
(void)memset(&status, 0, sizeof(struct sctp_status));
|
||||||
|
socklen_t optLen = (socklen_t) sizeof(struct sctp_status);
|
||||||
|
if (getsockopt(p5Sock, IPPROTO_SCTP, SCTP_STATUS, &status, &optLen) < 0)
|
||||||
|
{
|
||||||
|
NFAPI_TRACE(NFAPI_TRACE_ERROR, "After getsockopt errno: %d\n", errno);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
NFAPI_TRACE(NFAPI_TRACE_INFO, "VNF Association ID = %d\n", status.sstat_assoc_id);
|
||||||
|
NFAPI_TRACE(NFAPI_TRACE_INFO, "VNF Receiver window size = %d\n", status.sstat_rwnd);
|
||||||
|
NFAPI_TRACE(NFAPI_TRACE_INFO, "VNF In Streams = %d\n", status.sstat_instrms);
|
||||||
|
NFAPI_TRACE(NFAPI_TRACE_INFO, "VNF Out Streams = %d\n", status.sstat_outstrms);
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
uint8_t delete_pnfs = 0;
|
||||||
|
|
||||||
|
nfapi_vnf_pnf_info_t* pnf = config->pnf_list;
|
||||||
|
while(pnf != 0)
|
||||||
|
{
|
||||||
|
if(FD_ISSET(pnf->p5_sock, &read_fd_set))
|
||||||
|
{
|
||||||
|
if(vnf_nr_read_dispatch_message(config, pnf) == 0)
|
||||||
|
{
|
||||||
|
if(config->pnf_disconnect_indication != 0)
|
||||||
|
{
|
||||||
|
(config->pnf_disconnect_indication)(config, pnf->p5_idx);
|
||||||
|
}
|
||||||
|
|
||||||
|
close(pnf->p5_sock);
|
||||||
|
|
||||||
|
pnf->to_delete = 1;
|
||||||
|
delete_pnfs = 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pnf = pnf->next;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(delete_pnfs)
|
||||||
|
{
|
||||||
|
nfapi_vnf_pnf_info_t* pnf = config->pnf_list;
|
||||||
|
nfapi_vnf_pnf_info_t* prev = 0;
|
||||||
|
while(pnf != 0)
|
||||||
|
{
|
||||||
|
nfapi_vnf_pnf_info_t* curr = pnf;
|
||||||
|
|
||||||
|
if(pnf->to_delete == 1)
|
||||||
|
{
|
||||||
|
if(prev == 0)
|
||||||
|
{
|
||||||
|
config->pnf_list = pnf->next;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
prev->next = pnf->next;
|
||||||
|
}
|
||||||
|
|
||||||
|
pnf = pnf->next;
|
||||||
|
|
||||||
|
free(curr);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
prev = pnf;
|
||||||
|
pnf = pnf->next;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// timeout
|
||||||
|
|
||||||
|
// Should we test for socket closure here every second?
|
||||||
|
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
NFAPI_TRACE(NFAPI_TRACE_INFO, "Closing p5Sock socket's\n");
|
||||||
|
{
|
||||||
|
nfapi_vnf_pnf_info_t* curr = config->pnf_list;
|
||||||
|
while(curr != NULL)
|
||||||
|
{
|
||||||
|
if(config->pnf_disconnect_indication)
|
||||||
|
{
|
||||||
|
(config->pnf_disconnect_indication)(config, curr->p5_idx);
|
||||||
|
}
|
||||||
|
|
||||||
|
close(curr->p5_sock);
|
||||||
|
curr = curr->next;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
NFAPI_TRACE(NFAPI_TRACE_INFO, "Closing p5Listen socket\n");
|
||||||
|
close(p5ListenSock);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
int nfapi_vnf_start(nfapi_vnf_config_t* config)
|
int nfapi_vnf_start(nfapi_vnf_config_t* config)
|
||||||
{
|
{
|
||||||
// Verify that config is not null
|
// Verify that config is not null
|
||||||
@@ -486,6 +898,16 @@ int nfapi_vnf_stop(nfapi_vnf_config_t* config)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int nfapi_nr_vnf_pnf_param_req(nfapi_vnf_config_t* config, int p5_idx, nfapi_nr_pnf_param_request_t* req)
|
||||||
|
{
|
||||||
|
if(config == 0 || req == 0)
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
vnf_t* _this = (vnf_t*)(config);
|
||||||
|
|
||||||
|
return vnf_nr_pack_and_send_p5_message(_this, p5_idx, &req->header, sizeof(nfapi_nr_pnf_param_request_t));
|
||||||
|
}
|
||||||
|
|
||||||
int nfapi_vnf_pnf_param_req(nfapi_vnf_config_t* config, int p5_idx, nfapi_pnf_param_request_t* req)
|
int nfapi_vnf_pnf_param_req(nfapi_vnf_config_t* config, int p5_idx, nfapi_pnf_param_request_t* req)
|
||||||
{
|
{
|
||||||
if(config == 0 || req == 0)
|
if(config == 0 || req == 0)
|
||||||
@@ -496,6 +918,17 @@ int nfapi_vnf_pnf_param_req(nfapi_vnf_config_t* config, int p5_idx, nfapi_pnf_pa
|
|||||||
return vnf_pack_and_send_p5_message(_this, p5_idx, &req->header, sizeof(nfapi_pnf_param_request_t));
|
return vnf_pack_and_send_p5_message(_this, p5_idx, &req->header, sizeof(nfapi_pnf_param_request_t));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int nfapi_nr_vnf_pnf_config_req(nfapi_vnf_config_t* config, int p5_idx, nfapi_nr_pnf_config_request_t* req)
|
||||||
|
{
|
||||||
|
if(config == 0 || req == 0)
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
vnf_t* _this = (vnf_t*)(config);
|
||||||
|
|
||||||
|
return vnf_nr_pack_and_send_p5_message(_this, p5_idx, &req->header, sizeof(nfapi_nr_pnf_config_request_t));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
int nfapi_vnf_pnf_config_req(nfapi_vnf_config_t* config, int p5_idx, nfapi_pnf_config_request_t* req)
|
int nfapi_vnf_pnf_config_req(nfapi_vnf_config_t* config, int p5_idx, nfapi_pnf_config_request_t* req)
|
||||||
{
|
{
|
||||||
if(config == 0 || req == 0)
|
if(config == 0 || req == 0)
|
||||||
@@ -516,6 +949,16 @@ int nfapi_vnf_pnf_start_req(nfapi_vnf_config_t* config, int p5_idx, nfapi_pnf_st
|
|||||||
return vnf_pack_and_send_p5_message(_this, p5_idx, &req->header, sizeof(nfapi_pnf_start_request_t));
|
return vnf_pack_and_send_p5_message(_this, p5_idx, &req->header, sizeof(nfapi_pnf_start_request_t));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int nfapi_nr_vnf_pnf_start_req(nfapi_vnf_config_t* config, int p5_idx, nfapi_nr_pnf_start_request_t* req)
|
||||||
|
{
|
||||||
|
if(config == 0 || req == 0)
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
vnf_t* _this = (vnf_t*)(config);
|
||||||
|
|
||||||
|
return vnf_nr_pack_and_send_p5_message(_this, p5_idx, &req->header, sizeof(nfapi_nr_pnf_start_request_t));
|
||||||
|
}
|
||||||
|
|
||||||
int nfapi_vnf_pnf_stop_req(nfapi_vnf_config_t* config, int p5_idx, nfapi_pnf_stop_request_t* req)
|
int nfapi_vnf_pnf_stop_req(nfapi_vnf_config_t* config, int p5_idx, nfapi_pnf_stop_request_t* req)
|
||||||
{
|
{
|
||||||
if(config == 0 || req == 0)
|
if(config == 0 || req == 0)
|
||||||
@@ -526,6 +969,16 @@ int nfapi_vnf_pnf_stop_req(nfapi_vnf_config_t* config, int p5_idx, nfapi_pnf_sto
|
|||||||
return vnf_pack_and_send_p5_message(_this, p5_idx, &req->header, sizeof(nfapi_pnf_stop_request_t));
|
return vnf_pack_and_send_p5_message(_this, p5_idx, &req->header, sizeof(nfapi_pnf_stop_request_t));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int nfapi_nr_vnf_param_req(nfapi_vnf_config_t* config, int p5_idx, nfapi_nr_param_request_scf_t* req)
|
||||||
|
{
|
||||||
|
if(config == 0 || req == 0)
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
vnf_t* _this = (vnf_t*)(config);
|
||||||
|
|
||||||
|
return vnf_nr_pack_and_send_p5_message(_this, p5_idx, &req->header, sizeof(nfapi_nr_param_request_scf_t));
|
||||||
|
}
|
||||||
|
|
||||||
int nfapi_vnf_param_req(nfapi_vnf_config_t* config, int p5_idx, nfapi_param_request_t* req)
|
int nfapi_vnf_param_req(nfapi_vnf_config_t* config, int p5_idx, nfapi_param_request_t* req)
|
||||||
{
|
{
|
||||||
if(config == 0 || req == 0)
|
if(config == 0 || req == 0)
|
||||||
@@ -535,6 +988,38 @@ int nfapi_vnf_param_req(nfapi_vnf_config_t* config, int p5_idx, nfapi_param_requ
|
|||||||
|
|
||||||
return vnf_pack_and_send_p5_message(_this, p5_idx, &req->header, sizeof(nfapi_param_request_t));
|
return vnf_pack_and_send_p5_message(_this, p5_idx, &req->header, sizeof(nfapi_param_request_t));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int nfapi_nr_vnf_config_req(nfapi_vnf_config_t* config, int p5_idx, nfapi_nr_config_request_scf_t* req)
|
||||||
|
{
|
||||||
|
if(config == 0 || req == 0)
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
vnf_t* _this = (vnf_t*)(config);
|
||||||
|
|
||||||
|
nfapi_vnf_phy_info_t* phy = nfapi_vnf_phy_info_list_find(config, req->header.phy_id);
|
||||||
|
|
||||||
|
if(phy == NULL)
|
||||||
|
{
|
||||||
|
NFAPI_TRACE(NFAPI_TRACE_WARN, "%s failed to find phy information phy_id:%d\n", __FUNCTION__, req->header.phy_id);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
// set the timing parameters
|
||||||
|
req->nfapi_config.timing_window.tl.tag = NFAPI_NR_NFAPI_TIMING_WINDOW_TAG;
|
||||||
|
req->nfapi_config.timing_window.value = phy->timing_window;
|
||||||
|
req->num_tlv++;
|
||||||
|
|
||||||
|
req->nfapi_config.timing_info_mode.tl.tag = NFAPI_NR_NFAPI_TIMING_INFO_MODE_TAG;
|
||||||
|
req->nfapi_config.timing_info_mode.value = phy->timing_info_mode;
|
||||||
|
req->num_tlv++;
|
||||||
|
|
||||||
|
req->nfapi_config.timing_info_period.tl.tag = NFAPI_NR_NFAPI_TIMING_INFO_PERIOD_TAG;
|
||||||
|
req->nfapi_config.timing_info_period.value = phy->timing_info_period;
|
||||||
|
req->num_tlv++;
|
||||||
|
|
||||||
|
return vnf_nr_pack_and_send_p5_message(_this, p5_idx, &req->header, sizeof(nfapi_nr_config_request_scf_t));
|
||||||
|
}
|
||||||
|
|
||||||
int nfapi_vnf_config_req(nfapi_vnf_config_t* config, int p5_idx, nfapi_config_request_t* req)
|
int nfapi_vnf_config_req(nfapi_vnf_config_t* config, int p5_idx, nfapi_config_request_t* req)
|
||||||
{
|
{
|
||||||
if(config == 0 || req == 0)
|
if(config == 0 || req == 0)
|
||||||
@@ -565,7 +1050,8 @@ int nfapi_vnf_config_req(nfapi_vnf_config_t* config, int p5_idx, nfapi_config_re
|
|||||||
|
|
||||||
return vnf_pack_and_send_p5_message(_this, p5_idx, &req->header, sizeof(nfapi_config_request_t));
|
return vnf_pack_and_send_p5_message(_this, p5_idx, &req->header, sizeof(nfapi_config_request_t));
|
||||||
}
|
}
|
||||||
int nfapi_vnf_start_req(nfapi_vnf_config_t* config, int p5_idx, nfapi_start_request_t* req)
|
|
||||||
|
int nfapi_vnf_start_req(nfapi_vnf_config_t* config, int p5_idx, nfapi_start_request_t * req)
|
||||||
{
|
{
|
||||||
if(config == 0 || req == 0)
|
if(config == 0 || req == 0)
|
||||||
return -1;
|
return -1;
|
||||||
@@ -574,6 +1060,18 @@ int nfapi_vnf_start_req(nfapi_vnf_config_t* config, int p5_idx, nfapi_start_requ
|
|||||||
|
|
||||||
return vnf_pack_and_send_p5_message(_this, p5_idx, &req->header, sizeof(nfapi_start_request_t));
|
return vnf_pack_and_send_p5_message(_this, p5_idx, &req->header, sizeof(nfapi_start_request_t));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int nfapi_nr_vnf_start_req(nfapi_vnf_config_t* config, int p5_idx, nfapi_nr_start_request_scf_t * req)
|
||||||
|
{
|
||||||
|
if(config == 0 || req == 0)
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
vnf_t* _this = (vnf_t*)(config);
|
||||||
|
|
||||||
|
return vnf_nr_pack_and_send_p5_message(_this, p5_idx, &req->header, sizeof(nfapi_nr_start_request_scf_t));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
int nfapi_vnf_stop_req(nfapi_vnf_config_t* config, int p5_idx, nfapi_stop_request_t* req)
|
int nfapi_vnf_stop_req(nfapi_vnf_config_t* config, int p5_idx, nfapi_stop_request_t* req)
|
||||||
{
|
{
|
||||||
if(config == 0 || req == 0)
|
if(config == 0 || req == 0)
|
||||||
@@ -664,7 +1162,7 @@ int nfapi_vnf_allocate_phy(nfapi_vnf_config_t* config, int p5_idx, uint16_t* phy
|
|||||||
info->p5_idx = p5_idx;
|
info->p5_idx = p5_idx;
|
||||||
info->phy_id = vnf->next_phy_id++;
|
info->phy_id = vnf->next_phy_id++;
|
||||||
|
|
||||||
info->timing_window = 30; // This seems to override what gets set by the user - why???
|
info->timing_window = 30; // This seems to override what gets set by the user - why??? //TODO: Change in NR in terms of microsecends,what should be the value?
|
||||||
info->timing_info_mode = 0x03;
|
info->timing_info_mode = 0x03;
|
||||||
info->timing_info_period = 128;
|
info->timing_info_period = 128;
|
||||||
|
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
@@ -28,6 +28,7 @@
|
|||||||
|
|
||||||
#define FAPI2_IP_DSCP 0
|
#define FAPI2_IP_DSCP 0
|
||||||
|
|
||||||
|
|
||||||
nfapi_vnf_p7_config_t* nfapi_vnf_p7_config_create()
|
nfapi_vnf_p7_config_t* nfapi_vnf_p7_config_create()
|
||||||
{
|
{
|
||||||
vnf_p7_t* _this = (vnf_p7_t*)calloc(1, sizeof(vnf_p7_t));
|
vnf_p7_t* _this = (vnf_p7_t*)calloc(1, sizeof(vnf_p7_t));
|
||||||
@@ -90,6 +91,368 @@ struct timespec timespec_sub(struct timespec lhs, struct timespec rhs)
|
|||||||
|
|
||||||
// monitor the p7 endpoints and the timing loop and
|
// monitor the p7 endpoints and the timing loop and
|
||||||
// send indications to mac
|
// send indications to mac
|
||||||
|
int nfapi_nr_vnf_p7_start(nfapi_vnf_p7_config_t* config)
|
||||||
|
{
|
||||||
|
if(config == 0)
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
NFAPI_TRACE(NFAPI_TRACE_INFO, "%s()\n", __FUNCTION__);
|
||||||
|
|
||||||
|
vnf_p7_t* vnf_p7 = (vnf_p7_t*)config;
|
||||||
|
|
||||||
|
// Create p7 receive udp port
|
||||||
|
// todo : this needs updating for Ipv6
|
||||||
|
|
||||||
|
NFAPI_TRACE(NFAPI_TRACE_INFO, "Initialising VNF P7 port:%u\n", config->port);
|
||||||
|
|
||||||
|
// open the UDP socket
|
||||||
|
if ((vnf_p7->socket = socket(AF_INET, SOCK_DGRAM, 0)) < 0)
|
||||||
|
{
|
||||||
|
NFAPI_TRACE(NFAPI_TRACE_ERROR, "After P7 socket errno: %d\n", errno);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
NFAPI_TRACE(NFAPI_TRACE_INFO, "VNF P7 socket created...\n");
|
||||||
|
|
||||||
|
// configure the UDP socket options
|
||||||
|
int iptos_value = FAPI2_IP_DSCP << 2;
|
||||||
|
if (setsockopt(vnf_p7->socket, IPPROTO_IP, IP_TOS, &iptos_value, sizeof(iptos_value)) < 0)
|
||||||
|
{
|
||||||
|
NFAPI_TRACE(NFAPI_TRACE_ERROR, "After setsockopt (IP_TOS) errno: %d\n", errno);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
NFAPI_TRACE(NFAPI_TRACE_INFO, "VNF P7 setsockopt succeeded...\n");
|
||||||
|
|
||||||
|
// Create the address structure
|
||||||
|
struct sockaddr_in addr;
|
||||||
|
memset(&addr, 0, sizeof(addr));
|
||||||
|
addr.sin_family = AF_INET;
|
||||||
|
addr.sin_port = htons(config->port);
|
||||||
|
addr.sin_addr.s_addr = INADDR_ANY;
|
||||||
|
|
||||||
|
// bind to the configured port
|
||||||
|
NFAPI_TRACE(NFAPI_TRACE_INFO, "VNF P7 binding too %s:%d\n", inet_ntoa(addr.sin_addr), ntohs(addr.sin_port));
|
||||||
|
if (bind(vnf_p7->socket, (struct sockaddr *)&addr, sizeof(struct sockaddr_in)) < 0)
|
||||||
|
//if (sctp_bindx(config->socket, (struct sockaddr *)&addr, sizeof(struct sockaddr_in), 0) < 0)
|
||||||
|
{
|
||||||
|
NFAPI_TRACE(NFAPI_TRACE_ERROR, "After bind errno: %d\n", errno);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
NFAPI_TRACE(NFAPI_TRACE_INFO, "VNF P7 bind succeeded...\n");
|
||||||
|
|
||||||
|
|
||||||
|
//struct timespec original_pselect_timeout;
|
||||||
|
struct timespec pselect_timeout;
|
||||||
|
pselect_timeout.tv_sec = 0;
|
||||||
|
pselect_timeout.tv_nsec = 500000; // ns in a 0.5 ms
|
||||||
|
//pselect_timeout.tv_nsec = 500000;
|
||||||
|
|
||||||
|
struct timespec pselect_start;
|
||||||
|
struct timespec pselect_stop;
|
||||||
|
|
||||||
|
//struct timespec sf_end;
|
||||||
|
|
||||||
|
long last_millisecond = -1;
|
||||||
|
|
||||||
|
|
||||||
|
// struct timespec sf_duration; //Change to slot_duration?
|
||||||
|
// sf_duration.tv_sec = 0;
|
||||||
|
// sf_duration.tv_nsec = 0.5e6; // We want 1ms pause //We want 0.5 ms pause for NR
|
||||||
|
struct timespec slot_duration;
|
||||||
|
slot_duration.tv_sec = 0;
|
||||||
|
//slot_duration.tv_nsec = 0.5e6;
|
||||||
|
slot_duration.tv_nsec = 0.5e6;
|
||||||
|
|
||||||
|
|
||||||
|
// struct timespec sf_start; //Change to slot_start?
|
||||||
|
struct timespec slot_start;
|
||||||
|
// clock_gettime(CLOCK_MONOTONIC, &sf_start);
|
||||||
|
clock_gettime(CLOCK_MONOTONIC, &slot_start);
|
||||||
|
long millisecond = slot_start.tv_nsec / 1e6; //Check if we have to change
|
||||||
|
//long millisecond = slot_start.tv_nsec / 0.5e6;
|
||||||
|
// sf_start = timespec_add(sf_start, sf_duration);
|
||||||
|
slot_start = timespec_add(slot_start, slot_duration);
|
||||||
|
|
||||||
|
NFAPI_TRACE(NFAPI_TRACE_INFO, "next slot will start at %d.%d\n", slot_start.tv_sec, slot_start.tv_nsec);
|
||||||
|
|
||||||
|
while(vnf_p7->terminate == 0)
|
||||||
|
{
|
||||||
|
fd_set rfds;
|
||||||
|
int maxSock = 0;
|
||||||
|
FD_ZERO(&rfds);
|
||||||
|
int selectRetval = 0;
|
||||||
|
|
||||||
|
// Add the p7 socket
|
||||||
|
FD_SET(vnf_p7->socket, &rfds);
|
||||||
|
maxSock = vnf_p7->socket;
|
||||||
|
|
||||||
|
clock_gettime(CLOCK_MONOTONIC, &pselect_start);
|
||||||
|
//long millisecond = pselect_start.tv_nsec / 1e6;
|
||||||
|
|
||||||
|
if((last_millisecond == -1) || (millisecond == last_millisecond) || (millisecond == (last_millisecond + 1) % 1000) )
|
||||||
|
{
|
||||||
|
//NFAPI_TRACE(NFAPI_TRACE_INFO, "pselect_start:%d.%d sf_start:%d.%d\n", pselect_start.tv_sec, pselect_start.tv_nsec, sf_start.tv_sec, sf_start.tv_nsec);
|
||||||
|
|
||||||
|
|
||||||
|
//if((pselect_start.tv_sec > sf_start.tv_sec) ||
|
||||||
|
// ((pselect_start.tv_sec == sf_start.tv_sec) && (pselect_start.tv_nsec > sf_start.tv_nsec)))
|
||||||
|
if((pselect_start.tv_sec > slot_start.tv_sec) || ((pselect_start.tv_sec == slot_start.tv_sec) && (pselect_start.tv_nsec > slot_start.tv_nsec)))
|
||||||
|
{
|
||||||
|
// overran the end of the subframe we do not want to wait
|
||||||
|
pselect_timeout.tv_sec = 0;
|
||||||
|
pselect_timeout.tv_nsec = 0;
|
||||||
|
|
||||||
|
//struct timespec overrun = timespec_sub(pselect_start, sf_start);
|
||||||
|
//NFAPI_TRACE(NFAPI_TRACE_INFO, "Subframe overrun detected of %d.%d running to catchup\n", overrun.tv_sec, overrun.tv_nsec);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// still time before the end of the subframe wait
|
||||||
|
//pselect_timeout = timespec_sub(sf_start, pselect_start);
|
||||||
|
pselect_timeout = timespec_sub(slot_start, pselect_start);
|
||||||
|
}
|
||||||
|
|
||||||
|
//original_pselect_timeout = pselect_timeout;
|
||||||
|
|
||||||
|
// detemine how long to sleep in ns before the start of the next 1ms
|
||||||
|
//pselect_timeout.tv_nsec = 1e6 - (pselect_start.tv_nsec % 1000000);
|
||||||
|
|
||||||
|
//uint8_t underrun_possible =0;
|
||||||
|
|
||||||
|
// if we are not sleeping until the next milisecond due to the
|
||||||
|
// insycn minor adjment flag it so we don't consider it an error
|
||||||
|
//uint8_t underrun_possible =0;
|
||||||
|
/*
|
||||||
|
{
|
||||||
|
nfapi_vnf_p7_connection_info_t* phy = vnf_p7->p7_connections;
|
||||||
|
if(phy && phy->in_sync && phy->insync_minor_adjustment != 0 && phy->insync_minor_adjustment_duration > 0 && pselect_start.tv_nsec != 0)
|
||||||
|
{
|
||||||
|
NFAPI_TRACE(NFAPI_TRACE_NOTE, "[VNF] Subframe minor adjustment %d (%d->%d)\n", phy->insync_minor_adjustment,
|
||||||
|
pselect_timeout.tv_nsec, pselect_timeout.tv_nsec - (phy->insync_minor_adjustment * 1000))
|
||||||
|
if(phy->insync_minor_adjustment > 0)
|
||||||
|
{
|
||||||
|
// todo check we don't go below 0
|
||||||
|
if((phy->insync_minor_adjustment * 1000) > pselect_timeout.tv_nsec)
|
||||||
|
pselect_timeout.tv_nsec = 0;
|
||||||
|
else
|
||||||
|
pselect_timeout.tv_nsec = pselect_timeout.tv_nsec - (phy->insync_minor_adjustment * 1000);
|
||||||
|
|
||||||
|
|
||||||
|
//underrun_possible = 1;
|
||||||
|
}
|
||||||
|
else if(phy->insync_minor_adjustment < 0)
|
||||||
|
{
|
||||||
|
// todo check we don't go below 0
|
||||||
|
pselect_timeout.tv_nsec = pselect_timeout.tv_nsec - (phy->insync_minor_adjustment * 1000);
|
||||||
|
|
||||||
|
|
||||||
|
//phy->insync_minor_adjustment = 0;
|
||||||
|
phy->insync_minor_adjustment_duration--;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
//long wraps = pselect_timeout.tv_nsec % 1e9;
|
||||||
|
|
||||||
|
|
||||||
|
selectRetval = pselect(maxSock+1, &rfds, NULL, NULL, &pselect_timeout, NULL);
|
||||||
|
// selectRetval = pselect(120, &rfds, NULL, NULL, &pselect_timeout, NULL);
|
||||||
|
|
||||||
|
clock_gettime(CLOCK_MONOTONIC, &pselect_stop);
|
||||||
|
|
||||||
|
nfapi_vnf_p7_connection_info_t* phy = vnf_p7->p7_connections;
|
||||||
|
|
||||||
|
if (selectRetval==-1 && errno == 22)
|
||||||
|
{
|
||||||
|
// NFAPI_TRACE(NFAPI_TRACE_ERROR, "INVAL: pselect_timeout:%d.%ld adj[dur:%d adj:%d], sf_dur:%d.%ld\n",
|
||||||
|
// pselect_timeout.tv_sec, pselect_timeout.tv_nsec,
|
||||||
|
// phy->insync_minor_adjustment_duration, phy->insync_minor_adjustment,
|
||||||
|
// sf_duration.tv_sec, sf_duration.tv_nsec);
|
||||||
|
|
||||||
|
NFAPI_TRACE(NFAPI_TRACE_ERROR, "INVAL: pselect_timeout:%d.%ld adj[dur:%d adj:%d], sf_dur:%d.%ld\n",
|
||||||
|
pselect_timeout.tv_sec, pselect_timeout.tv_nsec,
|
||||||
|
phy->insync_minor_adjustment_duration, phy->insync_minor_adjustment,
|
||||||
|
slot_duration.tv_sec, slot_duration.tv_nsec);
|
||||||
|
|
||||||
|
}
|
||||||
|
if(selectRetval == 0)
|
||||||
|
{
|
||||||
|
// calculate the start of the next slot
|
||||||
|
//sf_start = timespec_add(sf_start, sf_duration);
|
||||||
|
slot_start = timespec_add(slot_start, slot_duration);
|
||||||
|
//NFAPI_TRACE(NFAPI_TRACE_INFO, "next subframe will start at %d.%d\n", sf_start.tv_sec, sf_start.tv_nsec);
|
||||||
|
|
||||||
|
if(phy && phy->in_sync && phy->insync_minor_adjustment != 0 && phy->insync_minor_adjustment_duration > 0)
|
||||||
|
{
|
||||||
|
long insync_minor_adjustment_ns = (phy->insync_minor_adjustment * 1000);
|
||||||
|
|
||||||
|
//sf_start.tv_nsec -= insync_minor_adjustment_ns;
|
||||||
|
slot_start.tv_nsec -= insync_minor_adjustment_ns;
|
||||||
|
|
||||||
|
#if 1
|
||||||
|
/* if (sf_start.tv_nsec > 1e9) //Change to 0.5e6?
|
||||||
|
{
|
||||||
|
sf_start.tv_sec++;
|
||||||
|
sf_start.tv_nsec-=1e9;
|
||||||
|
}
|
||||||
|
else if (sf_start.tv_nsec < 0)
|
||||||
|
{
|
||||||
|
sf_start.tv_sec--;
|
||||||
|
sf_start.tv_nsec+=1e9;
|
||||||
|
}*/
|
||||||
|
if (slot_start.tv_nsec > 1e9)
|
||||||
|
{
|
||||||
|
slot_start.tv_sec++;
|
||||||
|
slot_start.tv_nsec-=1e9;
|
||||||
|
}
|
||||||
|
else if (slot_start.tv_nsec < 0)
|
||||||
|
{
|
||||||
|
slot_start.tv_sec--;
|
||||||
|
slot_start.tv_nsec+=1e9;
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
//NFAPI_TRACE(NFAPI_TRACE_NOTE, "[VNF] BEFORE adjustment - Subframe minor adjustment %dus sf_start.tv_nsec:%d\n", phy->insync_minor_adjustment, sf_start.tv_nsec);
|
||||||
|
if(phy->insync_minor_adjustment > 0)
|
||||||
|
{
|
||||||
|
// decrease the subframe duration a little
|
||||||
|
if (sf_start.tv_nsec > insync_minor_adjustment_ns)
|
||||||
|
sf_start.tv_nsec -= insync_minor_adjustment_ns;
|
||||||
|
else
|
||||||
|
{
|
||||||
|
NFAPI_TRACE(NFAPI_TRACE_ERROR, "[VNF] Adjustment would make it negative sf:%d.%ld adjust:%ld\n\n\n", sf_start.tv_sec, sf_start.tv_nsec, insync_minor_adjustment_ns);
|
||||||
|
sf_start.tv_sec--;
|
||||||
|
sf_start.tv_nsec += 1e9 - insync_minor_adjustment_ns;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if(phy->insync_minor_adjustment < 0)
|
||||||
|
{
|
||||||
|
// todo check we don't go below 0
|
||||||
|
// increase the subframe duration a little
|
||||||
|
sf_start.tv_nsec += insync_minor_adjustment_ns;
|
||||||
|
|
||||||
|
if (sf_start.tv_nsec < 0)
|
||||||
|
{
|
||||||
|
NFAPI_TRACE(NFAPI_TRACE_ERROR, "[VNF] OVERFLOW %d.%ld\n\n\n\n", sf_start.tv_sec, sf_start.tv_nsec);
|
||||||
|
sf_start.tv_sec++;
|
||||||
|
sf_start.tv_nsec += 1e9;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
//phy->insync_minor_adjustment = 0;
|
||||||
|
phy->insync_minor_adjustment_duration--;
|
||||||
|
|
||||||
|
// NFAPI_TRACE(NFAPI_TRACE_NOTE, "[VNF] AFTER adjustment - Subframe minor adjustment %dus sf_start.tv_nsec:%d duration:%u\n",
|
||||||
|
// phy->insync_minor_adjustment, sf_start.tv_nsec, phy->insync_minor_adjustment_duration);
|
||||||
|
// NFAPI_TRACE(NFAPI_TRACE_NOTE, "[VNF] AFTER adjustment - Slot minor adjustment %dus slot_start.tv_nsec:%d duration:%u\n",
|
||||||
|
// phy->insync_minor_adjustment, slot_start.tv_nsec, phy->insync_minor_adjustment_duration);
|
||||||
|
|
||||||
|
if (phy->insync_minor_adjustment_duration==0)
|
||||||
|
{
|
||||||
|
phy->insync_minor_adjustment = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
/*
|
||||||
|
long pselect_stop_millisecond = pselect_stop.tv_nsec / 1e6;
|
||||||
|
if(millisecond == pselect_stop_millisecond)
|
||||||
|
{
|
||||||
|
// we have woke up in the same subframe
|
||||||
|
if(underrun_possible == 0)
|
||||||
|
NFAPI_TRACE(NFAPI_TRACE_WARN, "subframe pselect underrun %ld (%d.%d)\n", millisecond, pselect_stop.tv_sec, pselect_stop.tv_nsec);
|
||||||
|
}
|
||||||
|
else if(((millisecond + 1) % 1000) != pselect_stop_millisecond)
|
||||||
|
{
|
||||||
|
// we have overrun the subframe
|
||||||
|
NFAPI_TRACE(NFAPI_TRACE_WARN, "subframe pselect overrun %ld %ld\n", millisecond, pselect_stop_millisecond);
|
||||||
|
NFAPI_TRACE(NFAPI_TRACE_WARN, "subframe underrun %ld\n", millisecond);
|
||||||
|
}
|
||||||
|
last_millisecond = millisecond;
|
||||||
|
*/
|
||||||
|
|
||||||
|
//millisecond ++;
|
||||||
|
millisecond = millisecond + 1;
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// we have overrun the subframe advance to go and collect $200
|
||||||
|
|
||||||
|
if((millisecond - last_millisecond) > 3)
|
||||||
|
NFAPI_TRACE(NFAPI_TRACE_WARN, "subframe overrun %ld %ld (%ld)\n", millisecond, last_millisecond, millisecond - last_millisecond + 1);
|
||||||
|
|
||||||
|
last_millisecond = ( last_millisecond + 1 ) % 1000;
|
||||||
|
selectRetval = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(selectRetval == 0)
|
||||||
|
{
|
||||||
|
//vnf_p7->sf_start_time_hr = vnf_get_current_time_hr();
|
||||||
|
vnf_p7->slot_start_time_hr = vnf_get_current_time_hr();
|
||||||
|
struct timespec current_time;
|
||||||
|
clock_gettime(CLOCK_MONOTONIC, ¤t_time);
|
||||||
|
// pselect timed out
|
||||||
|
nfapi_vnf_p7_connection_info_t* curr = vnf_p7->p7_connections;
|
||||||
|
while(curr != 0)
|
||||||
|
{
|
||||||
|
if (curr->slot == 19)
|
||||||
|
{ //curr->slot = 0;
|
||||||
|
if(curr->sfn == 1023)
|
||||||
|
curr->sfn=0;
|
||||||
|
else
|
||||||
|
curr->sfn++;
|
||||||
|
curr->slot=0;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
curr->slot++;
|
||||||
|
}
|
||||||
|
vnf_nr_sync(vnf_p7, curr);
|
||||||
|
curr = curr->next;
|
||||||
|
}
|
||||||
|
send_mac_slot_indications(vnf_p7);
|
||||||
|
}
|
||||||
|
else if(selectRetval > 0)
|
||||||
|
{
|
||||||
|
// have a p7 message
|
||||||
|
if(FD_ISSET(vnf_p7->socket, &rfds))
|
||||||
|
{
|
||||||
|
vnf_nr_p7_read_dispatch_message(vnf_p7);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// pselect error
|
||||||
|
if(selectRetval == -1 && errno == EINTR)
|
||||||
|
{
|
||||||
|
// a sigal was received.
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
NFAPI_TRACE(NFAPI_TRACE_INFO, "P7 select failed result %d errno %d timeout:%d.%d orginal:%d.%d last_ms:%ld ms:%ld\n", selectRetval, errno, pselect_timeout.tv_sec, pselect_timeout.tv_nsec, pselect_timeout.tv_sec, pselect_timeout.tv_nsec, last_millisecond, millisecond);
|
||||||
|
// should we exit now?
|
||||||
|
if (selectRetval == -1 && errno == 22) // invalid argument??? not sure about timeout duration
|
||||||
|
{
|
||||||
|
usleep(100000);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
NFAPI_TRACE(NFAPI_TRACE_INFO, "Closing p7 socket\n");
|
||||||
|
close(vnf_p7->socket);
|
||||||
|
|
||||||
|
NFAPI_TRACE(NFAPI_TRACE_INFO, "%s() returning\n", __FUNCTION__);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
int nfapi_vnf_p7_start(nfapi_vnf_p7_config_t* config)
|
int nfapi_vnf_p7_start(nfapi_vnf_p7_config_t* config)
|
||||||
{
|
{
|
||||||
if(config == 0)
|
if(config == 0)
|
||||||
@@ -408,6 +771,7 @@ if (selectRetval==-1 && errno == 22)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
int nfapi_vnf_p7_stop(nfapi_vnf_p7_config_t* config)
|
int nfapi_vnf_p7_stop(nfapi_vnf_p7_config_t* config)
|
||||||
{
|
{
|
||||||
if(config == 0)
|
if(config == 0)
|
||||||
@@ -434,17 +798,18 @@ int nfapi_vnf_p7_add_pnf(nfapi_vnf_p7_config_t* config, const char* pnf_p7_addr,
|
|||||||
memset(node, 0, sizeof(nfapi_vnf_p7_connection_info_t));
|
memset(node, 0, sizeof(nfapi_vnf_p7_connection_info_t));
|
||||||
node->phy_id = phy_id;
|
node->phy_id = phy_id;
|
||||||
node->in_sync = 0;
|
node->in_sync = 0;
|
||||||
node->dl_out_sync_offset = 30;
|
node->dl_out_sync_offset = 30;//TODO: Values need to be changed for NR,How to set the values
|
||||||
node->dl_out_sync_period = 10;
|
node->dl_out_sync_period = 10;
|
||||||
node->dl_in_sync_offset = 30;
|
node->dl_in_sync_offset = 30;
|
||||||
node->dl_in_sync_period = 512;
|
node->dl_in_sync_period = 512;
|
||||||
node->sfn_sf = 0;
|
//node->sfn_sf = 0;
|
||||||
|
node->sfn = 0;
|
||||||
|
node->slot = 0;
|
||||||
node->min_sync_cycle_count = 8;
|
node->min_sync_cycle_count = 8;
|
||||||
|
|
||||||
// save the remote endpoint information
|
// save the remote endpoint information
|
||||||
node->remote_addr.sin_family = AF_INET;
|
node->remote_addr.sin_family = AF_INET;
|
||||||
node->remote_addr.sin_port = htons(pnf_p7_port);
|
node->remote_addr.sin_port = pnf_p7_port;//htons(pnf_p7_port);
|
||||||
node->remote_addr.sin_addr.s_addr = inet_addr(pnf_p7_addr);
|
node->remote_addr.sin_addr.s_addr = inet_addr(pnf_p7_addr);
|
||||||
|
|
||||||
vnf_p7_connection_info_list_add(vnf_p7, node);
|
vnf_p7_connection_info_list_add(vnf_p7, node);
|
||||||
@@ -490,7 +855,16 @@ int nfapi_vnf_p7_nr_dl_config_req(nfapi_vnf_p7_config_t* config, nfapi_nr_dl_tti
|
|||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
vnf_p7_t* vnf_p7 = (vnf_p7_t*)config;
|
vnf_p7_t* vnf_p7 = (vnf_p7_t*)config;
|
||||||
return vnf_p7_pack_and_send_p7_msg(vnf_p7, &req->header);
|
return vnf_nr_p7_pack_and_send_p7_msg(vnf_p7, &req->header);
|
||||||
|
}
|
||||||
|
|
||||||
|
int nfapi_vnf_p7_ul_tti_req(nfapi_vnf_p7_config_t* config, nfapi_nr_ul_tti_request_t* req)
|
||||||
|
{
|
||||||
|
if(config == 0 || req == 0)
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
vnf_p7_t* vnf_p7 = (vnf_p7_t*)config;
|
||||||
|
return vnf_nr_p7_pack_and_send_p7_msg(vnf_p7, &req->header);
|
||||||
}
|
}
|
||||||
|
|
||||||
int nfapi_vnf_p7_ul_config_req(nfapi_vnf_p7_config_t* config, nfapi_ul_config_request_t* req)
|
int nfapi_vnf_p7_ul_config_req(nfapi_vnf_p7_config_t* config, nfapi_ul_config_request_t* req)
|
||||||
@@ -501,6 +875,14 @@ int nfapi_vnf_p7_ul_config_req(nfapi_vnf_p7_config_t* config, nfapi_ul_config_re
|
|||||||
vnf_p7_t* vnf_p7 = (vnf_p7_t*)config;
|
vnf_p7_t* vnf_p7 = (vnf_p7_t*)config;
|
||||||
return vnf_p7_pack_and_send_p7_msg(vnf_p7, &req->header);
|
return vnf_p7_pack_and_send_p7_msg(vnf_p7, &req->header);
|
||||||
}
|
}
|
||||||
|
int nfapi_vnf_p7_ul_dci_req(nfapi_vnf_p7_config_t* config, nfapi_nr_ul_dci_request_t* req)
|
||||||
|
{
|
||||||
|
if(config == 0 || req == 0)
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
vnf_p7_t* vnf_p7 = (vnf_p7_t*)config;
|
||||||
|
return vnf_nr_p7_pack_and_send_p7_msg(vnf_p7, &req->header);
|
||||||
|
}
|
||||||
int nfapi_vnf_p7_hi_dci0_req(nfapi_vnf_p7_config_t* config, nfapi_hi_dci0_request_t* req)
|
int nfapi_vnf_p7_hi_dci0_req(nfapi_vnf_p7_config_t* config, nfapi_hi_dci0_request_t* req)
|
||||||
{
|
{
|
||||||
if(config == 0 || req == 0)
|
if(config == 0 || req == 0)
|
||||||
@@ -509,6 +891,14 @@ int nfapi_vnf_p7_hi_dci0_req(nfapi_vnf_p7_config_t* config, nfapi_hi_dci0_reques
|
|||||||
vnf_p7_t* vnf_p7 = (vnf_p7_t*)config;
|
vnf_p7_t* vnf_p7 = (vnf_p7_t*)config;
|
||||||
return vnf_p7_pack_and_send_p7_msg(vnf_p7, &req->header);
|
return vnf_p7_pack_and_send_p7_msg(vnf_p7, &req->header);
|
||||||
}
|
}
|
||||||
|
int nfapi_vnf_p7_tx_data_req(nfapi_vnf_p7_config_t* config, nfapi_nr_tx_data_request_t* req)
|
||||||
|
{
|
||||||
|
if(config == 0 || req == 0)
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
vnf_p7_t* vnf_p7 = (vnf_p7_t*)config;
|
||||||
|
return vnf_nr_p7_pack_and_send_p7_msg(vnf_p7, &req->header);
|
||||||
|
}
|
||||||
int nfapi_vnf_p7_tx_req(nfapi_vnf_p7_config_t* config, nfapi_tx_request_t* req)
|
int nfapi_vnf_p7_tx_req(nfapi_vnf_p7_config_t* config, nfapi_tx_request_t* req)
|
||||||
{
|
{
|
||||||
if(config == 0 || req == 0)
|
if(config == 0 || req == 0)
|
||||||
|
|||||||
@@ -144,7 +144,7 @@ int test_ldpc(short No_iteration,
|
|||||||
t_nrLDPC_procBuf nrLDPC_procBuf;
|
t_nrLDPC_procBuf nrLDPC_procBuf;
|
||||||
t_nrLDPC_procBuf* p_nrLDPC_procBuf = &nrLDPC_procBuf;
|
t_nrLDPC_procBuf* p_nrLDPC_procBuf = &nrLDPC_procBuf;
|
||||||
|
|
||||||
t_nrLDPC_time_stats decoder_profiler;
|
t_nrLDPC_time_stats decoder_profiler = {0};
|
||||||
t_nrLDPC_time_stats* p_decoder_profiler =&decoder_profiler ;
|
t_nrLDPC_time_stats* p_decoder_profiler =&decoder_profiler ;
|
||||||
|
|
||||||
int32_t n_iter = 0;
|
int32_t n_iter = 0;
|
||||||
|
|||||||
+57
-16
@@ -20,6 +20,7 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
#include "executables/nr-softmodem-common.h"
|
#include "executables/nr-softmodem-common.h"
|
||||||
|
#include "common/utils/nr/nr_common.h"
|
||||||
#include "PHY/defs_gNB.h"
|
#include "PHY/defs_gNB.h"
|
||||||
#include "PHY/phy_extern.h"
|
#include "PHY/phy_extern.h"
|
||||||
#include "PHY/NR_REFSIG/nr_refsig.h"
|
#include "PHY/NR_REFSIG/nr_refsig.h"
|
||||||
@@ -45,10 +46,42 @@
|
|||||||
|
|
||||||
#include "PHY/NR_REFSIG/ul_ref_seq_nr.h"
|
#include "PHY/NR_REFSIG/ul_ref_seq_nr.h"
|
||||||
|
|
||||||
/*
|
static
|
||||||
extern uint32_t from_nrarfcn(int nr_bandP,uint32_t dl_nrarfcn);
|
uint16_t get_band(uint64_t downlink_frequency, int32_t delta_duplex)
|
||||||
extern openair0_config_t openair0_cfg[MAX_CARDS];
|
{
|
||||||
*/
|
const uint64_t dl_freq_khz = downlink_frequency / 1000;
|
||||||
|
const int32_t delta_duplex_khz = delta_duplex / 1000;
|
||||||
|
|
||||||
|
uint64_t center_freq_diff_khz = 999999999999999999; // 2^64
|
||||||
|
uint16_t current_band = 0;
|
||||||
|
|
||||||
|
for (int ind = 0; ind < nr_bandtable_size; ind++) {
|
||||||
|
|
||||||
|
LOG_D(PHY, "Scanning band %d, dl_min %"PRIu64", ul_min %"PRIu64"\n", nr_bandtable[ind].band, nr_bandtable[ind].dl_min, nr_bandtable[ind].ul_min);
|
||||||
|
|
||||||
|
if (dl_freq_khz < nr_bandtable[ind].dl_min || dl_freq_khz > nr_bandtable[ind].dl_max)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
int32_t current_offset_khz = nr_bandtable[ind].ul_min - nr_bandtable[ind].dl_min;
|
||||||
|
|
||||||
|
if (current_offset_khz != delta_duplex_khz)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
uint64_t center_frequency_khz = (nr_bandtable[ind].dl_max + nr_bandtable[ind].dl_min) / 2;
|
||||||
|
|
||||||
|
if (abs(dl_freq_khz - center_frequency_khz) < center_freq_diff_khz){
|
||||||
|
current_band = nr_bandtable[ind].band;
|
||||||
|
center_freq_diff_khz = abs(dl_freq_khz - center_frequency_khz);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
LOG_I(PHY, "DL frequency %"PRIu64": band %d, UL frequency %"PRIu64"\n",
|
||||||
|
downlink_frequency, current_band, downlink_frequency+delta_duplex);
|
||||||
|
|
||||||
|
AssertFatal(current_band != 0, "Can't find EUTRA band for frequency %"PRIu64" and duplex_spacing %u\n", downlink_frequency, delta_duplex);
|
||||||
|
|
||||||
|
return current_band;
|
||||||
|
}
|
||||||
|
|
||||||
int l1_north_init_gNB() {
|
int l1_north_init_gNB() {
|
||||||
|
|
||||||
@@ -109,6 +142,8 @@ int phy_init_nr_gNB(PHY_VARS_gNB *gNB,
|
|||||||
uint32_t ***pdcch_dmrs = gNB->nr_gold_pdcch_dmrs;
|
uint32_t ***pdcch_dmrs = gNB->nr_gold_pdcch_dmrs;
|
||||||
AssertFatal(pdcch_dmrs!=NULL, "NR init: pdcch_dmrs malloc failed\n");
|
AssertFatal(pdcch_dmrs!=NULL, "NR init: pdcch_dmrs malloc failed\n");
|
||||||
|
|
||||||
|
gNB->bad_pucch = 0;
|
||||||
|
|
||||||
for (int slot=0; slot<fp->slots_per_frame; slot++) {
|
for (int slot=0; slot<fp->slots_per_frame; slot++) {
|
||||||
pdcch_dmrs[slot] = (uint32_t **)malloc16(fp->symbols_per_slot*sizeof(uint32_t *));
|
pdcch_dmrs[slot] = (uint32_t **)malloc16(fp->symbols_per_slot*sizeof(uint32_t *));
|
||||||
AssertFatal(pdcch_dmrs[slot]!=NULL, "NR init: pdcch_dmrs for slot %d - malloc failed\n", slot);
|
AssertFatal(pdcch_dmrs[slot]!=NULL, "NR init: pdcch_dmrs for slot %d - malloc failed\n", slot);
|
||||||
@@ -198,13 +233,15 @@ int phy_init_nr_gNB(PHY_VARS_gNB *gNB,
|
|||||||
common_vars->rxdata = (int32_t **)malloc16(Prx*sizeof(int32_t*));
|
common_vars->rxdata = (int32_t **)malloc16(Prx*sizeof(int32_t*));
|
||||||
common_vars->txdataF = (int32_t **)malloc16(Ptx*sizeof(int32_t*));
|
common_vars->txdataF = (int32_t **)malloc16(Ptx*sizeof(int32_t*));
|
||||||
common_vars->rxdataF = (int32_t **)malloc16(Prx*sizeof(int32_t*));
|
common_vars->rxdataF = (int32_t **)malloc16(Prx*sizeof(int32_t*));
|
||||||
|
common_vars->beam_id = (uint8_t **)malloc16(Ptx*sizeof(uint8_t*));
|
||||||
|
|
||||||
for (i=0;i<Ptx;i++){
|
for (i=0;i<Ptx;i++){
|
||||||
common_vars->txdataF[i] = (int32_t*)malloc16_clear(fp->samples_per_frame_wCP*sizeof(int32_t)); // [hna] samples_per_frame without CP
|
common_vars->txdataF[i] = (int32_t*)malloc16_clear(fp->samples_per_frame_wCP*sizeof(int32_t)); // [hna] samples_per_frame without CP
|
||||||
LOG_D(PHY,"[INIT] common_vars->txdataF[%d] = %p (%lu bytes)\n",
|
LOG_D(PHY,"[INIT] common_vars->txdataF[%d] = %p (%lu bytes)\n",
|
||||||
i,common_vars->txdataF[i],
|
i,common_vars->txdataF[i],
|
||||||
fp->samples_per_frame_wCP*sizeof(int32_t));
|
fp->samples_per_frame_wCP*sizeof(int32_t));
|
||||||
|
common_vars->beam_id[i] = (uint8_t*)malloc16_clear(fp->symbols_per_slot*fp->slots_per_frame*sizeof(uint8_t));
|
||||||
|
memset(common_vars->beam_id[i],255,fp->symbols_per_slot*fp->slots_per_frame);
|
||||||
}
|
}
|
||||||
for (i=0;i<Prx;i++){
|
for (i=0;i<Prx;i++){
|
||||||
common_vars->rxdataF[i] = (int32_t*)malloc16_clear(fp->samples_per_frame_wCP*sizeof(int32_t));
|
common_vars->rxdataF[i] = (int32_t*)malloc16_clear(fp->samples_per_frame_wCP*sizeof(int32_t));
|
||||||
@@ -381,6 +418,13 @@ void phy_free_nr_gNB(PHY_VARS_gNB *gNB)
|
|||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//Adding nr_schedule_handler
|
||||||
|
void install_nr_schedule_handlers(NR_IF_Module_t *if_inst)
|
||||||
|
{
|
||||||
|
if_inst->NR_PHY_config_req = nr_phy_config_request;
|
||||||
|
if_inst->NR_Schedule_response = nr_schedule_response;
|
||||||
|
}
|
||||||
/*
|
/*
|
||||||
void install_schedule_handlers(IF_Module_t *if_inst)
|
void install_schedule_handlers(IF_Module_t *if_inst)
|
||||||
{
|
{
|
||||||
@@ -424,8 +468,8 @@ void nr_phy_config_request_sim(PHY_VARS_gNB *gNB,
|
|||||||
|
|
||||||
gNB->mac_enabled = 1;
|
gNB->mac_enabled = 1;
|
||||||
if (mu==1) {
|
if (mu==1) {
|
||||||
fp->dl_CarrierFreq = 3500000000;//from_nrarfcn(gNB_config->nfapi_config.rf_bands.rf_band[0],gNB_config->nfapi_config.nrarfcn.value);
|
fp->dl_CarrierFreq = 3600000000;//from_nrarfcn(gNB_config->nfapi_config.rf_bands.rf_band[0],gNB_config->nfapi_config.nrarfcn.value);
|
||||||
fp->ul_CarrierFreq = 3500000000;//fp->dl_CarrierFreq - (get_uldl_offset(gNB_config->nfapi_config.rf_bands.rf_band[0])*100000);
|
fp->ul_CarrierFreq = 3600000000;//fp->dl_CarrierFreq - (get_uldl_offset(gNB_config->nfapi_config.rf_bands.rf_band[0])*100000);
|
||||||
fp->nr_band = 78;
|
fp->nr_band = 78;
|
||||||
// fp->threequarter_fs= 0;
|
// fp->threequarter_fs= 0;
|
||||||
} else if (mu==3) {
|
} else if (mu==3) {
|
||||||
@@ -434,7 +478,8 @@ void nr_phy_config_request_sim(PHY_VARS_gNB *gNB,
|
|||||||
fp->nr_band = 261;
|
fp->nr_band = 261;
|
||||||
// fp->threequarter_fs= 0;
|
// fp->threequarter_fs= 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fp->threequarter_fs = 0;
|
||||||
gNB_config->carrier_config.dl_bandwidth.value = config_bandwidth(mu, N_RB_DL, fp->nr_band);
|
gNB_config->carrier_config.dl_bandwidth.value = config_bandwidth(mu, N_RB_DL, fp->nr_band);
|
||||||
|
|
||||||
nr_init_frame_parms(gNB_config, fp);
|
nr_init_frame_parms(gNB_config, fp);
|
||||||
@@ -448,7 +493,6 @@ void nr_phy_config_request(NR_PHY_Config_t *phy_config) {
|
|||||||
uint8_t short_sequence, num_sequences, rootSequenceIndex, fd_occasion;
|
uint8_t short_sequence, num_sequences, rootSequenceIndex, fd_occasion;
|
||||||
NR_DL_FRAME_PARMS *fp = &RC.gNB[Mod_id]->frame_parms;
|
NR_DL_FRAME_PARMS *fp = &RC.gNB[Mod_id]->frame_parms;
|
||||||
nfapi_nr_config_request_scf_t *gNB_config = &RC.gNB[Mod_id]->gNB_config;
|
nfapi_nr_config_request_scf_t *gNB_config = &RC.gNB[Mod_id]->gNB_config;
|
||||||
int32_t dlul_offset = 0;
|
|
||||||
|
|
||||||
memcpy((void*)gNB_config,phy_config->cfg,sizeof(*phy_config->cfg));
|
memcpy((void*)gNB_config,phy_config->cfg,sizeof(*phy_config->cfg));
|
||||||
RC.gNB[Mod_id]->mac_enabled = 1;
|
RC.gNB[Mod_id]->mac_enabled = 1;
|
||||||
@@ -459,13 +503,9 @@ void nr_phy_config_request(NR_PHY_Config_t *phy_config) {
|
|||||||
uint64_t ul_bw_khz = (12*gNB_config->carrier_config.ul_grid_size[gNB_config->ssb_config.scs_common.value].value)*(15<<gNB_config->ssb_config.scs_common.value);
|
uint64_t ul_bw_khz = (12*gNB_config->carrier_config.ul_grid_size[gNB_config->ssb_config.scs_common.value].value)*(15<<gNB_config->ssb_config.scs_common.value);
|
||||||
fp->ul_CarrierFreq = ((ul_bw_khz>>1) + gNB_config->carrier_config.uplink_frequency.value)*1000 ;
|
fp->ul_CarrierFreq = ((ul_bw_khz>>1) + gNB_config->carrier_config.uplink_frequency.value)*1000 ;
|
||||||
|
|
||||||
fp->nr_band = *RC.nrmac[Mod_id]->common_channels[0].ServingCellConfigCommon->downlinkConfigCommon->frequencyInfoDL->frequencyBandList.list.array[0];
|
int32_t dlul_offset = fp->ul_CarrierFreq - fp->dl_CarrierFreq;
|
||||||
|
fp->nr_band = get_band(fp->dl_CarrierFreq, dlul_offset);
|
||||||
|
|
||||||
get_delta_duplex(fp->nr_band, gNB_config->ssb_config.scs_common.value, &dlul_offset);
|
|
||||||
dlul_offset *= 1000;
|
|
||||||
|
|
||||||
AssertFatal(fp->ul_CarrierFreq == (fp->dl_CarrierFreq + dlul_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 + dlul_offset);
|
|
||||||
|
|
||||||
LOG_I(PHY, "DL frequency %lu Hz, UL frequency %lu Hz: band %d, uldl offset %d Hz\n", fp->dl_CarrierFreq, fp->ul_CarrierFreq, fp->nr_band, dlul_offset);
|
LOG_I(PHY, "DL frequency %lu Hz, UL frequency %lu Hz: band %d, uldl offset %d Hz\n", fp->dl_CarrierFreq, fp->ul_CarrierFreq, fp->nr_band, dlul_offset);
|
||||||
|
|
||||||
fp->threequarter_fs = openair0_cfg[0].threequarter_fs;
|
fp->threequarter_fs = openair0_cfg[0].threequarter_fs;
|
||||||
@@ -494,11 +534,12 @@ void nr_phy_config_request(NR_PHY_Config_t *phy_config) {
|
|||||||
// }
|
// }
|
||||||
RC.gNB[Mod_id]->configured = 1;
|
RC.gNB[Mod_id]->configured = 1;
|
||||||
|
|
||||||
init_symbol_rotation(fp,fp->dl_CarrierFreq);
|
init_symbol_rotation(fp);
|
||||||
|
|
||||||
LOG_I(PHY,"gNB %d configured\n",Mod_id);
|
LOG_I(PHY,"gNB %d configured\n",Mod_id);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void init_nr_transport(PHY_VARS_gNB *gNB) {
|
void init_nr_transport(PHY_VARS_gNB *gNB) {
|
||||||
int i;
|
int i;
|
||||||
int j;
|
int j;
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user