diff --git a/ci-scripts/Jenkinsfile-GitLab-Container b/ci-scripts/Jenkinsfile-GitLab-Container
new file mode 100644
index 0000000000..fbf9ba8f4b
--- /dev/null
+++ b/ci-scripts/Jenkinsfile-GitLab-Container
@@ -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
+ }
+ }
+}
diff --git a/ci-scripts/Jenkinsfile-tmp-multi-enb-benetel b/ci-scripts/Jenkinsfile-tmp-multi-enb-benetel
new file mode 100644
index 0000000000..8ac2e6adff
--- /dev/null
+++ b/ci-scripts/Jenkinsfile-tmp-multi-enb-benetel
@@ -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: ${BUILD_ID}#' -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"
+ }
+ }
+ }
+ }
+ }
+ }
+}
diff --git a/ci-scripts/Jenkinsfile-tmp-multi-enb-nsa b/ci-scripts/Jenkinsfile-tmp-multi-enb-nsa
new file mode 100644
index 0000000000..66d12eed33
--- /dev/null
+++ b/ci-scripts/Jenkinsfile-tmp-multi-enb-nsa
@@ -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: ${BUILD_ID}#' -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"
+ }
+ }
+ }
+ }
+ }
+ }
+}
diff --git a/ci-scripts/Jenkinsfile-tmp-ran b/ci-scripts/Jenkinsfile-tmp-ran
index ab1573de7f..7d5307620f 100644
--- a/ci-scripts/Jenkinsfile-tmp-ran
+++ b/ci-scripts/Jenkinsfile-tmp-ran
@@ -241,6 +241,10 @@ pipeline {
stage ("Terminate") {
parallel {
stage('Terminate UE') {
+ // Bypassing this stage if there are no abd server defined
+ when {
+ expression { params.ADB_IPAddress != "none" }
+ }
steps {
echo '\u2705 \u001B[32mTerminate UE\u001B[0m'
withCredentials([
@@ -275,6 +279,10 @@ pipeline {
}
}
stage('Terminate SPGW') {
+ // Bypassing this stage if EPC server is not defined
+ when {
+ expression { params.EPC_IPAddress != "none" }
+ }
steps {
echo '\u2705 \u001B[32mTerminate SPGW\u001B[0m'
withCredentials([
@@ -292,6 +300,10 @@ pipeline {
}
}
stage('Terminate MME') {
+ // Bypassing this stage if EPC server is not defined
+ when {
+ expression { params.EPC_IPAddress != "none" }
+ }
steps {
echo '\u2705 \u001B[32mTerminate MME\u001B[0m'
withCredentials([
@@ -309,6 +321,10 @@ pipeline {
}
}
stage('Terminate HSS') {
+ // Bypassing this stage if EPC server is not defined
+ when {
+ expression { params.EPC_IPAddress != "none" }
+ }
steps {
echo '\u2705 \u001B[32mTerminate HSS\u001B[0m'
withCredentials([
@@ -371,6 +387,10 @@ pipeline {
}
}
stage('Log Collection (SPGW)') {
+ // Bypassing this stage if EPC server is not defined
+ when {
+ expression { params.EPC_IPAddress != "none" }
+ }
steps {
withCredentials([
[$class: 'UsernamePasswordMultiBinding', credentialsId: "${params.EPC_Credentials}", usernameVariable: 'EPC_Username', passwordVariable: 'EPC_Password']
@@ -389,6 +409,10 @@ pipeline {
}
}
stage('Log Collection (MME)') {
+ // Bypassing this stage if EPC server is not defined
+ when {
+ expression { params.EPC_IPAddress != "none" }
+ }
steps {
withCredentials([
[$class: 'UsernamePasswordMultiBinding', credentialsId: "${params.EPC_Credentials}", usernameVariable: 'EPC_Username', passwordVariable: 'EPC_Password']
@@ -407,6 +431,10 @@ pipeline {
}
}
stage('Log Collection (HSS)') {
+ // Bypassing this stage if EPC server is not defined
+ when {
+ expression { params.EPC_IPAddress != "none" }
+ }
steps {
withCredentials([
[$class: 'UsernamePasswordMultiBinding', credentialsId: "${params.EPC_Credentials}", usernameVariable: 'EPC_Username', passwordVariable: 'EPC_Password']
@@ -425,6 +453,10 @@ pipeline {
}
}
stage('Log Collection (Ping)') {
+ // Bypassing this stage if EPC server is not defined
+ when {
+ expression { params.EPC_IPAddress != "none" }
+ }
steps {
withCredentials([
[$class: 'UsernamePasswordMultiBinding', credentialsId: "${params.EPC_Credentials}", usernameVariable: 'EPC_Username', passwordVariable: 'EPC_Password']
@@ -443,6 +475,10 @@ pipeline {
}
}
stage('Log Collection (Iperf)') {
+ // Bypassing this stage if EPC server is not defined
+ when {
+ expression { params.EPC_IPAddress != "none" }
+ }
steps {
withCredentials([
[$class: 'UsernamePasswordMultiBinding', credentialsId: "${params.EPC_Credentials}", usernameVariable: 'EPC_Username', passwordVariable: 'EPC_Password']
@@ -482,7 +518,7 @@ pipeline {
// Making sure that we really shutdown every thing before leaving
failure {
script {
- if (!termStatusArray[termUE]) {
+ if ((!termStatusArray[termUE]) && (params.ADB_IPAddress != "none")) {
withCredentials([
[$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}"
}
}
- if (!termStatusArray[termSPGW]) {
+ if ((!termStatusArray[termSPGW]) && (params.EPC_IPAddress != "none")) {
withCredentials([
[$class: 'UsernamePasswordMultiBinding', credentialsId: "${params.EPC_Credentials}", usernameVariable: 'EPC_Username', passwordVariable: 'EPC_Password']
]) {
sh "python3 ci-scripts/main.py --mode=TerminateSPGW --EPCIPAddress=${params.EPC_IPAddress} --EPCUserName=${EPC_Username} --EPCPassword=${EPC_Password} --EPCType=${params.EPC_Type} --EPCSourceCodePath=${params.EPC_SourceCodePath}"
}
}
- if (!termStatusArray[termMME]) {
+ if ((!termStatusArray[termMME]) && (params.EPC_IPAddress != "none")) {
withCredentials([
[$class: 'UsernamePasswordMultiBinding', credentialsId: "${params.EPC_Credentials}", usernameVariable: 'EPC_Username', passwordVariable: 'EPC_Password']
]) {
sh "python3 ci-scripts/main.py --mode=TerminateMME --EPCIPAddress=${params.EPC_IPAddress} --EPCUserName=${EPC_Username} --EPCPassword=${EPC_Password} --EPCType=${params.EPC_Type} --EPCSourceCodePath=${params.EPC_SourceCodePath}"
}
}
- if (!termStatusArray[termHSS]) {
+ if ((!termStatusArray[termHSS]) && (params.EPC_IPAddress != "none")) {
withCredentials([
[$class: 'UsernamePasswordMultiBinding', credentialsId: "${params.EPC_Credentials}", usernameVariable: 'EPC_Username', passwordVariable: 'EPC_Password']
]) {
diff --git a/ci-scripts/Jenkinsfile-trig-nsa b/ci-scripts/Jenkinsfile-trig-nsa
new file mode 100644
index 0000000000..3dd5ce3b50
--- /dev/null
+++ b/ci-scripts/Jenkinsfile-trig-nsa
@@ -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))
+ ]
+ }
+ }
+ }
+ }
+ }
+}
+
+
diff --git a/ci-scripts/cls_containerize.py b/ci-scripts/cls_containerize.py
index 0c07dfe91f..0debe42468 100644
--- a/ci-scripts/cls_containerize.py
+++ b/ci-scripts/cls_containerize.py
@@ -35,6 +35,7 @@ import sys # arg
import re # reg
import logging
import os
+import shutil
import time
from multiprocessing import Process, Lock, SimpleQueue
from zipfile import ZipFile
@@ -124,7 +125,7 @@ class Containerize():
self.cli = 'docker'
self.dockerfileprefix = '.ubuntu18'
elif self.host == 'Red Hat':
- self.cli = 'podman'
+ self.cli = 'sudo podman'
self.dockerfileprefix = '.rhel8.2'
imageNames = []
@@ -173,6 +174,7 @@ class Containerize():
# 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
imageTag = 'develop'
+ sharedTag = 'develop'
if (self.ranAllowMerge):
imageTag = 'ci-temp'
if self.ranTargetBranch == '':
@@ -188,38 +190,23 @@ class Containerize():
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/pki/entitlement/*.pem tmp/entitlement/', '\$', 5)
-
- #mySSH.close()
- #return 0
+
sharedimage = 'ran-build'
# Let's remove any previous run artifacts if still there
- mySSH.command(self.cli + ' image prune --force', '\$', 5)
- mySSH.command(self.cli + ' image rm ' + sharedimage + ':' + imageTag, '\$', 5)
+ mySSH.command(self.cli + ' image prune --force', '\$', 30)
+ if (not self.ranAllowMerge):
+ mySSH.command(self.cli + ' image rm ' + sharedimage + ':' + sharedTag, '\$', 30)
for image,pattern in imageNames:
- mySSH.command(self.cli + ' image rm ' + image + ':' + imageTag, '\$', 5)
- # 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[a-zA-Z0-9\-\_]+)', mySSH.getBefore())
- if result is not None:
- danglingShaOnes.append((image, result.group('imageShaOne')))
- previousImage = image + ':' + imageTag
+ mySSH.command(self.cli + ' image rm ' + image + ':' + imageTag, '\$', 30)
- imageTag = 'ci-temp'
- # First verify if images were properly created.
+ # Build the shared image only on Push Events (not on Merge Requests)
+ 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
- mySSH.command(self.cli + ' image inspect --format=\'Size = {{.Size}} bytes\' ' + sharedimage + ':' + imageTag, '\$', 5)
- if mySSH.getBefore().count('No such object') != 0:
- logging.error('Could not build properly ran-build')
+ mySSH.command(self.cli + ' image inspect --format=\'Size = {{.Size}} bytes\' ' + sharedimage + ':' + sharedTag, '\$', 5)
+ if mySSH.getBefore().count('o such image') != 0:
+ logging.error('\u001B[1m Could not build properly ran-build\u001B[0m')
status = False
else:
result = re.search('Size *= *(?P[0-9\-]+) *bytes', mySSH.getBefore())
@@ -240,11 +227,40 @@ class Containerize():
self.allImagesSize['ran-build'] = str(round(imageSize,1)) + ' Gbytes'
else:
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:
+ # 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)
- if mySSH.getBefore().count('No such object') != 0:
- logging.error('Could not build properly ' + image)
+ if mySSH.getBefore().count('o such image') != 0:
+ logging.error('\u001B[1m Could not build properly ' + image + '\u001B[0m')
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:
result = re.search('Size *= *(?P[0-9\-]+) *bytes', mySSH.getBefore())
if result is not None:
@@ -264,39 +280,27 @@ class Containerize():
self.allImagesSize[image] = str(round(imageSize,1)) + ' Gbytes'
else:
logging.debug('ran-build size is unknown')
- if not status:
- mySSH.close()
- 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)
+ self.allImagesSize[image] = 'unknown'
+ # Now pruning dangling images in between target builds
+ mySSH.command(self.cli + ' image prune --force', '\$', 30)
- # Recover build logs, for the moment only possible when build is successful
- mySSH.command(self.cli + ' create --name test ' + sharedimage + ':' + imageTag, '\$', 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)
+ # Analyzing the logs
+ mySSH.command('cd ' + lSourcePath + '/cmake_targets', '\$', 5)
mySSH.command('mkdir -p build_log_' + self.testCase_id, '\$', 5)
mySSH.command('mv log/* ' + 'build_log_' + self.testCase_id, '\$', 5)
- #mySSH.close()
-
- mySSH.command('cd /tmp/CI-eNB/cmake_targets', '\$', 5)
+
+ mySSH.command('cd ' + lSourcePath + '/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')):
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.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()
ZipFile('build_log_' + self.testCase_id + '.zip').extractall('.')
-
+
#Trying to identify the errors and warnings for each built images
imageNames1 = imageNames
shared = ('ran-build','ran')
@@ -328,9 +332,16 @@ class Containerize():
files[fil] = errorandwarnings
self.collectInfo[image] = files
- logging.info('\u001B[1m Building OAI Image(s) Pass\u001B[0m')
- HTML.CreateHtmlTestRow(self.imageKind, 'OK', CONST.ALL_PROCESSES_OK)
- HTML.CreateHtmlNextTabHeaderTestRow(self.collectInfo, self.allImagesSize)
+ if status:
+ logging.info('\u001B[1m Building OAI Image(s) Pass\u001B[0m')
+ 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):
if self.eNB_serverId[self.eNB_instance] == '0':
diff --git a/ci-scripts/conf_files/benetel-4g.conf b/ci-scripts/conf_files/benetel-4g.conf
new file mode 100644
index 0000000000..9423ebe56e
--- /dev/null
+++ b/ci-scripts/conf_files/benetel-4g.conf
@@ -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";
+ };
diff --git a/ci-scripts/conf_files/benetel-5g.conf b/ci-scripts/conf_files/benetel-5g.conf
new file mode 100644
index 0000000000..0dfe7854ee
--- /dev/null
+++ b/ci-scripts/conf_files/benetel-5g.conf
@@ -0,0 +1,317 @@
+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_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 = 6366; //28875; //6366; #6407; #3384;
+# 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;
+ #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 //5 (4 is for 43, 5 is for 57)
+ initialDLBWPstartSymbolAndLength_3 = 57; //43; //57;
+ #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 = 6366; //28875; //6366; #6407; #3384;
+# 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 = 2;
+ initialULBWPmappingType_0 = 1
+ # this is SS=0 L=11
+ initialULBWPstartSymbolAndLength_0 = 55;
+
+ initialULBWPk2_1 = 2;
+ 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;
+ 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";
+ };
+
diff --git a/ci-scripts/conf_files/gnb.band78.tm1.106PRB.usrpn300.conf b/ci-scripts/conf_files/gnb.band78.tm1.106PRB.usrpn300.conf
index decaa392d7..a11509a3f0 100644
--- a/ci-scripts/conf_files/gnb.band78.tm1.106PRB.usrpn300.conf
+++ b/ci-scripts/conf_files/gnb.band78.tm1.106PRB.usrpn300.conf
@@ -23,6 +23,7 @@ gNBs =
ssb_SubcarrierOffset = 0;
pdsch_AntennaPorts = 1;
+ pusch_AntennaPorts = 1;
servingCellConfigCommon = (
{
@@ -46,7 +47,7 @@ gNBs =
#initialDownlinkBWP
#genericParameters
# this is RBstart=41,L=24 (275*(L-1))+RBstart
- initialDLBWPlocationAndBandwidth = 6366;
+ initialDLBWPlocationAndBandwidth = 6368;
# subcarrierSpacing
# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
initialDLBWPsubcarrierSpacing = 1;
@@ -89,7 +90,7 @@ gNBs =
pMax = 20;
#initialUplinkBWP
#genericParameters
- initialULBWPlocationAndBandwidth = 6366;
+ initialULBWPlocationAndBandwidth = 6368;
# subcarrierSpacing
# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
initialULBWPsubcarrierSpacing = 1;
@@ -240,7 +241,7 @@ L1s = (
RUs = (
{
- local_rf = "yes"
+ local_rf = "yes"
nb_tx = 1
nb_rx = 1
att_tx = 0
@@ -249,12 +250,12 @@ RUs = (
max_pdschReferenceSignalPower = -27;
max_rxgain = 75;
eNB_instances = [0];
- ##beamforming 1x2 matrix: 1 layer x 2 antennas
+ ## beamforming 1x2 matrix: 1 layer x 2 antennas
bf_weights = [0x00007fff, 0x0000];
- ##beamforming 1x4 matrix: 1 layer x 4 antennas
+ ## beamforming 1x4 matrix: 1 layer x 4 antennas
#bf_weights = [0x00007fff, 0x0000,0x0000, 0x0000];
## beamforming 2x2 matrix:
- # bf_weights = [0x00007fff, 0x00000000, 0x00000000, 0x00007fff];
+ #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];
diff --git a/ci-scripts/conf_files/gnb.band78.tm1.fr1.106PRB.usrpb210.conf b/ci-scripts/conf_files/gnb.band78.tm1.fr1.106PRB.usrpb210.conf
index 258618e7f0..daee5486c1 100644
--- a/ci-scripts/conf_files/gnb.band78.tm1.fr1.106PRB.usrpb210.conf
+++ b/ci-scripts/conf_files/gnb.band78.tm1.fr1.106PRB.usrpb210.conf
@@ -48,7 +48,7 @@ gNBs =
#initialDownlinkBWP
#genericParameters
# this is RBstart=84,L=13 (275*(L-1))+RBstart
- initialDLBWPlocationAndBandwidth = 6366; //28875; //6366; #6407; #3384;
+ initialDLBWPlocationAndBandwidth = 6368;
# subcarrierSpacing
# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
initialDLBWPsubcarrierSpacing = 1;
@@ -90,7 +90,7 @@ gNBs =
pMax = 20;
#initialUplinkBWP
#genericParameters
- initialULBWPlocationAndBandwidth = 6366; //28875; //6366; #6407; #3384;
+ initialULBWPlocationAndBandwidth = 6368;
# subcarrierSpacing
# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
initialULBWPsubcarrierSpacing = 1;
diff --git a/ci-scripts/docker_log_split.py b/ci-scripts/docker_log_split.py
new file mode 100644
index 0000000000..8c3c9e41dc
--- /dev/null
+++ b/ci-scripts/docker_log_split.py
@@ -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)
diff --git a/ci-scripts/ran.py b/ci-scripts/ran.py
index 774d7f19c6..783adb98e6 100644
--- a/ci-scripts/ran.py
+++ b/ci-scripts/ran.py
@@ -239,6 +239,7 @@ class RANManagement():
while (count > 0) and buildOAIprocess:
mySSH.command('ps aux | grep --color=never build_ | grep -v grep', '\$', 6)
result = re.search('build_oai', mySSH.getBefore())
+ print(result)
if result is None:
buildOAIprocess = False
else:
@@ -464,7 +465,7 @@ class RANManagement():
self.prematureExit = True
return
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:
result = re.search('wait RUs', mySSH.getBefore())
else:
diff --git a/ci-scripts/xml_files/fr1_multi_node_test.xml b/ci-scripts/xml_files/benetel_multi_node_build.xml
similarity index 50%
rename from ci-scripts/xml_files/fr1_multi_node_test.xml
rename to ci-scripts/xml_files/benetel_multi_node_build.xml
index 8c56f0bcec..5ac28951b4 100644
--- a/ci-scripts/xml_files/fr1_multi_node_test.xml
+++ b/ci-scripts/xml_files/benetel_multi_node_build.xml
@@ -21,57 +21,34 @@
-->
- test-fr1-tm1
- Test-FR1-TM1
- tasks
- 1
+ build-tab
+ Build
+ wrench
- 030000
- 040000
- 000001
- 070001
- 070000
+ 000001 000002
-
-
-
-
- Initialize_eNB
- Initialize eNB
- -O ci-scripts/conf_files/enb.band7.tm1.fr1.25PRB.usrpb210.conf
- 0
- 0
- lte
-
-
-
- Initialize_eNB
- Initialize gNB (3/4 sampling rate)
- -O ci-scripts/conf_files/gnb.band78.tm1.fr1.106PRB.usrpb210.conf -E
- 1
- 1
- nr
-
+
- IdleSleep
- Sleep
- 30
-
-
-
- Terminate_eNB
- Terminate eNB
+ Build_eNB
+ Build eNB
+ --eNB -t benetel4g -w None
+ True
0
0
-
- Terminate_eNB
- Terminate gNB
+
+
+ Build_eNB
+ Build gNB
+ --gNB -t benetel5g -w None
+ True
1
1
-
+
+
+
diff --git a/ci-scripts/xml_files/benetel_nsa_base.xml b/ci-scripts/xml_files/benetel_nsa_base.xml
new file mode 100644
index 0000000000..0aed28dffa
--- /dev/null
+++ b/ci-scripts/xml_files/benetel_nsa_base.xml
@@ -0,0 +1,162 @@
+
+
+ TEST-FR1-TM1
+ FR1
+ tasks
+
+ 010000
+ 030000
+ 040000
+ 010001
+ 000001
+ 050000
+ 050001
+ 000001
+ 060000
+ 060001
+ 000001
+ 070000
+ 070001
+ 010002
+ 000001
+ 080001
+ 080000
+ 010003
+
+
+
+
+ Initialize_UE
+ Initialize UE
+
+
+
+ Terminate_UE
+ Terminate UE
+
+
+
+ Attach_UE
+ Attach UE
+
+
+
+ Detach_UE
+ Detach UE
+
+
+
+
+ Initialize_eNB
+ Initialize eNB
+ -O ci-scripts/conf_files/benetel-4g.conf
+ 0
+ 0
+ lte
+
+
+
+
+ Initialize_eNB
+ Initialize gNB
+ -O ci-scripts/conf_files/benetel-5g.conf
+ 1
+ 1
+ nr
+
+
+
+ IdleSleep
+ Sleep
+ 20
+
+
+
+ Ping
+ Ping: 20pings in 20sec
+ -c 20
+ 50
+
+
+
+ Ping
+ Ping: 100pings in 20sec
+ -c 100 -i 0.2
+ 50
+
+
+
+
+ Iperf
+ iperf (DL/2.5Mbps/UDP)(60 sec)(single-ue profile)
+ -u -b 2.5M -t 60 -i 1
+ 50
+ single-ue
+
+
+
+ Iperf
+ iperf (UL/1.5Mbps/UDP)(60 sec)(single-ue profile)
+ -u -b 1.5M -t 60 -i 1 -R
+ 50
+ single-ue
+
+
+
+
+ Iperf
+ iperf (DL/20Mbps/UDP)(20 sec)(single-ue profile)
+ -u -b 20M -t 20 -i 1
+ 50
+ single-ue
+
+
+
+ Iperf
+ iperf (UL/3Mbps/UDP)(20 sec)(single-ue profile)
+ -u -b 3M -t 20 -i 1 -R
+ 50
+ single-ue
+
+
+
+
+
+ Terminate_eNB
+ Terminate eNB
+ 0
+ 0
+ lte
+
+
+
+ Terminate_eNB
+ Terminate gNB
+ 1
+ 1
+ nr
+
+
+
+
diff --git a/ci-scripts/xml_files/fr1_image_build.xml b/ci-scripts/xml_files/container_image_build.xml
similarity index 93%
rename from ci-scripts/xml_files/fr1_image_build.xml
rename to ci-scripts/xml_files/container_image_build.xml
index 9dd386b646..430729c49c 100644
--- a/ci-scripts/xml_files/fr1_image_build.xml
+++ b/ci-scripts/xml_files/container_image_build.xml
@@ -22,7 +22,7 @@
-->
build-tab
- Build
+ Build Container Images
wrench
000001
@@ -31,7 +31,7 @@
Build_Image
- Build eNB Image
+ Build all Images
all
0
0
diff --git a/ci-scripts/xml_files/fr1_multi_node_build.xml b/ci-scripts/xml_files/fr1_multi_node_build.xml
index 7b4eacef3a..57c4685341 100644
--- a/ci-scripts/xml_files/fr1_multi_node_build.xml
+++ b/ci-scripts/xml_files/fr1_multi_node_build.xml
@@ -37,6 +37,7 @@
0
0
True
+ True
@@ -53,6 +54,7 @@
1
1
True
+ True
diff --git a/ci-scripts/xml_files/fr1_ran_ue_iperf.xml b/ci-scripts/xml_files/fr1_nsa_base.xml
similarity index 80%
rename from ci-scripts/xml_files/fr1_ran_ue_iperf.xml
rename to ci-scripts/xml_files/fr1_nsa_base.xml
index 8ead3afc62..96bdc79f0f 100644
--- a/ci-scripts/xml_files/fr1_ran_ue_iperf.xml
+++ b/ci-scripts/xml_files/fr1_nsa_base.xml
@@ -21,8 +21,8 @@
-->
- TEST-FR1-TM1
- FR1
+ TEST-NSA-FR1-TM1
+ NSA FULL
tasks
010000
@@ -31,14 +31,17 @@
010001
000001
050000
+ 050001
000001
060000
060001
000001
+ 070000
+ 070001
010002
000001
- 070001
- 070000
+ 080001
+ 080000
010003
@@ -96,6 +99,13 @@
50
+
+ Ping
+ Ping: 100pings in 20sec
+ -c 100 -i 0.2
+ 50
+
+
Iperf
@@ -113,7 +123,26 @@
single-ue
+
+ Iperf
+ iperf (DL/20Mbps/UDP)(20 sec)(single-ue profile)
+ -u -b 20M -t 20 -i 1
+ 50
+ single-ue
+
+
+
+ Iperf
+ iperf (UL/3Mbps/UDP)(20 sec)(single-ue profile)
+ -u -b 3M -t 20 -i 1 -R
+ 50
+ single-ue
+
+
+
+
+
Terminate_eNB
Terminate eNB
0
@@ -121,7 +150,7 @@
lte
-
+
Terminate_eNB
Terminate gNB
1
diff --git a/ci-scripts/xml_files/fr1_ran_ue_base.xml b/ci-scripts/xml_files/fr1_nsa_base_ref.xml
similarity index 80%
rename from ci-scripts/xml_files/fr1_ran_ue_base.xml
rename to ci-scripts/xml_files/fr1_nsa_base_ref.xml
index 847967f81e..fd47db10b2 100644
--- a/ci-scripts/xml_files/fr1_ran_ue_base.xml
+++ b/ci-scripts/xml_files/fr1_nsa_base_ref.xml
@@ -21,8 +21,8 @@
-->
- TEST-FR1-TM1
- FR1
+ TEST-NSA-FR1-TM1
+ NSA FULL
tasks
010000
@@ -32,16 +32,15 @@
000001
050000
050001
- 050002
- 050002
000001
060000
060001
000001
+ 070000
010002
000001
- 070001
- 070000
+ 080001
+ 080000
010003
@@ -100,13 +99,6 @@
- Ping
- Ping: 5pings in 1sec
- -c 5 -i 0.2
- 50
-
-
-
Ping
Ping: 100pings in 20sec
-c 100 -i 0.2
@@ -116,21 +108,40 @@
Iperf
- iperf (DL/1Mbps/UDP)(30 sec)(single-ue profile)
- -u -b 1M -t 30 -i 1
+ iperf (DL/3Mbps/UDP)(20 sec)(single-ue profile)
+ -u -b 3M -t 20 -i 1
50
single-ue
Iperf
- iperf (UL/1Mbps/UDP)(30 sec)(single-ue profile)
- -u -b 1M -t 30 -i 1 -R
+ iperf (UL/1Mbps/UDP)(20 sec)(single-ue profile)
+ -u -b 1M -t 20 -i 1 -R
50
single-ue
+
+ Iperf
+ iperf (DL/20Mbps/UDP)(20 sec)(single-ue profile)
+ -u -b 20M -t 20 -i 1
+ 50
+ single-ue
+
+
+
+ Iperf
+ iperf (UL/3Mbps/UDP)(20 sec)(single-ue profile)
+ -u -b 3M -t 20 -i 1 -R
+ 50
+ single-ue
+
+
+
+
+
Terminate_eNB
Terminate eNB
0
@@ -138,7 +149,7 @@
lte
-
+
Terminate_eNB
Terminate gNB
1
diff --git a/cmake_targets/CMakeLists.txt b/cmake_targets/CMakeLists.txt
index c16170f932..4645acf8f1 100644
--- a/cmake_targets/CMakeLists.txt
+++ b/cmake_targets/CMakeLists.txt
@@ -832,7 +832,7 @@ add_library(F1AP
# 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_list2_option(RF_BOARD "EXMIMO" "RF head type" "None" "OAI_USRP" "OAI_BLADERF" "OAI_LMSSDR" "OAI_SIMU")
@@ -926,6 +926,9 @@ set_target_properties(tcp_bridge_oai PROPERTIES COMPILE_FLAGS "-fvisibility=hidd
# Benetel 4G library
######################################################################
+
+include_directories ("/usr/include/dpdk")
+
set(HWLIB_BENETEL_4G_SOURCE
${OPENAIR_TARGETS}/ARCH/ETHERNET/benetel/4g/benetel.c
${OPENAIR_TARGETS}/ARCH/ETHERNET/benetel/4g/shared_buffers.c
diff --git a/cmake_targets/autotests/test_case_list.xml b/cmake_targets/autotests/test_case_list.xml
index 089d0503fd..016c76dc06 100644
--- a/cmake_targets/autotests/test_case_list.xml
+++ b/cmake_targets/autotests/test_case_list.xml
@@ -1294,7 +1294,8 @@
(Test10: SC-FDMA, 75 PRBs),
(Test11: SC-FDMA, 216 PRBs),
(Test12: SC-FDMA, 273 PRBs),
- (Test13: SC-FDMA, 3 DMRS)
+ (Test13: SC-FDMA, 3 DMRS),
+ (Test14: MCS 16 50 PRBs 2 RX_Antenna)
$OPENAIR_DIR/cmake_targets/build_oai
--phy_simulators -c
@@ -1313,9 +1314,10 @@
-n100 -s2 -Z -r75
-n100 -s2 -Z -r216 -R217
-n100 -s2 -Z -r270 -R273
- -n100 -s2 -Z -U 2 0 2
+ -n100 -s2 -Z -U 2 0 2
+ -n100 -m16 -s10 -z2
- 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.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
PUSCH test OK
segmentation fault|assertion|exiting|fatal
3
diff --git a/cmake_targets/build_oai b/cmake_targets/build_oai
index 960b241047..dba6d7da6d 100755
--- a/cmake_targets/build_oai
+++ b/cmake_targets/build_oai
@@ -48,8 +48,9 @@ DEADLINE_SCHEDULER_FLAG_USER=""
CPU_AFFINITY_FLAG_USER="False" #Only valid when low-latency flag is set to False
REL="Rel15"
HW="None"
-TP="None"
+TP="Ethernet"
EPC=0
+VERBOSE_CI=0
VERBOSE_COMPILE=0
CFLAGS_PROCESSOR_USER=""
RUN_GROUP=0
@@ -289,6 +290,9 @@ function main() {
esac
echo_info "Setting hardware to: $HW"
shift 2;;
+ -t | --transport)
+ TP=$2
+ shift 2;;
-P | --phy_simulators)
SIMUS_PHY=1
echo_info "Will compile dlsim, ulsim, ..."
@@ -324,6 +328,10 @@ function main() {
HWLAT_TEST=1
echo_info "Will compile hw latency test program"
shift;;
+ --verbose-ci)
+ VERBOSE_CI=1
+ echo_info "Will compile with verbose instructions in CI Docker env"
+ shift;;
--verbose-compile)
VERBOSE_COMPILE=1
echo_info "Will compile with verbose instructions"
@@ -936,12 +944,30 @@ function main() {
echo_info "Building transport protocol libraries"
rm -f liboai_transpro.so
rm -f $dbin/liboai_transpro.so
- compilations \
- $build_dir oai_eth_transpro \
- liboai_eth_transpro.so $dbin/liboai_eth_transpro.so.$REL
- ln -sf liboai_eth_transpro.so liboai_transpro.so
- ln -sf $dbin/liboai_eth_transpro.so.$REL $dbin/liboai_transpro.so
- echo_info "liboai_transpro.so is linked to ETHERNET transport"
+ if [ "$TP" == "Ethernet" ]; then
+ compilations \
+ $build_dir oai_eth_transpro \
+ liboai_eth_transpro.so $dbin/liboai_eth_transpro.so.$REL
+ ln -sf liboai_eth_transpro.so liboai_transpro.so
+ 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
diff --git a/cmake_targets/tools/build_helper b/cmake_targets/tools/build_helper
index 977827b0c9..9b8363fc2b 100755
--- a/cmake_targets/tools/build_helper
+++ b/cmake_targets/tools/build_helper
@@ -41,7 +41,7 @@ KERNEL_VERSION=$(uname -r | cut -d '.' -f1)
KERNEL_MAJOR=$(uname -r | cut -d '.' -f2)
#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
if [ "$UID" = 0 ]
then
@@ -221,6 +221,11 @@ compilations() {
ret=$?
} > $dlog/$2.$REL.txt 2>&1
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
check_warnings "$dlog/$2.$REL.txt"
check_errors "$dlog/$2.$REL.txt"
@@ -359,10 +364,10 @@ check_install_usrp_uhd_driver(){
elif [[ "$OS_BASEDISTRO" == "fedora" ]]; then
if [ $IS_CONTAINER -eq 0 ]
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
else
- $SUDO $INSTALLER -y install boost boost-devel cmake3
+ $SUDO $INSTALLER -y install boost boost-devel $CMAKE
$SUDO pip3 install mako requests
fi
if [[ "$OS_DISTRO" == "rhel" ]] || [[ "$OS_DISTRO" == "centos" ]]; then
@@ -488,7 +493,7 @@ install_soapy_from_source(){
#git checkout tags/release_003_010_001_001
mkdir -p build
cd build
- cmake ../
+ $CMAKE ../
echo "Compiling SoapyRemote"
make -j`nproc`
$SUDO make install
@@ -507,7 +512,7 @@ install_soapy_iris_from_source(){
cd sklk-soapyiris
mkdir -p build
cd build
- cmake ../
+ $CMAKE ../
echo "Compiling SoapyIris"
make -j`nproc`
$SUDO make install
@@ -684,7 +689,7 @@ check_install_oai_software() {
automake \
bison \
build-essential \
- cmake \
+ $CMAKE \
cmake-curses-gui \
ninja-build \
doxygen \
diff --git a/common/utils/LOG/vcd_signal_dumper.c b/common/utils/LOG/vcd_signal_dumper.c
index bd598b48da..5bf9759933 100644
--- a/common/utils/LOG/vcd_signal_dumper.c
+++ b/common/utils/LOG/vcd_signal_dumper.c
@@ -302,6 +302,9 @@ const char* eurecomFunctionsNames[] = {
/* PHY signals */
"ue_synch",
"ue_slot_fep",
+ "ue_slot_fep_pdcch",
+ "ue_slot_fep_pbch",
+ "ue_slot_fep_pdsch",
"ue_slot_fep_mbsfn",
"ue_slot_fep_mbsfn_khz_1dot25",
"ue_rrc_measurements",
@@ -390,6 +393,8 @@ const char* eurecomFunctionsNames[] = {
"rx_pmch",
"rx_pmch_khz_1dot25",
"pdsch_procedures",
+ "pdsch_procedures_crnti",
+ //"dlsch_procedures_crnti",
"pdsch_procedures_si",
"pdsch_procedures_p",
"pdsch_procedures_ra",
diff --git a/common/utils/LOG/vcd_signal_dumper.h b/common/utils/LOG/vcd_signal_dumper.h
index f9f5868260..fb27c19973 100644
--- a/common/utils/LOG/vcd_signal_dumper.h
+++ b/common/utils/LOG/vcd_signal_dumper.h
@@ -283,6 +283,9 @@ typedef enum {
/* PHY signals */
VCD_SIGNAL_DUMPER_FUNCTIONS_UE_SYNCH,
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_KHZ_1DOT25,
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_KHZ_1DOT25,
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_P,
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_CONFIG_SIB1_ENB,
VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_CONFIG_SIB2_ENB,
diff --git a/common/utils/T/T_defs.h b/common/utils/T/T_defs.h
index 11c816f002..8cd86546cb 100644
--- a/common/utils/T/T_defs.h
+++ b/common/utils/T/T_defs.h
@@ -73,7 +73,7 @@ typedef struct {
} T_cache_t;
/* 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) */
#define VCD_NUM_VARIABLES (187)
diff --git a/common/utils/T/T_messages.txt b/common/utils/T/T_messages.txt
index fedc50cf5d..91da823c61 100644
--- a/common/utils/T/T_messages.txt
+++ b/common/utils/T/T_messages.txt
@@ -2407,6 +2407,21 @@ ID = VCD_FUNCTION_UE_SLOT_FEP
GROUP = ALL:VCD:UE:VCD_FUNCTION
FORMAT = int,value
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
DESC = VCD function UE_SLOT_FEP_MBSFN
GROUP = ALL:VCD:UE:VCD_FUNCTION
@@ -2847,6 +2862,11 @@ ID = VCD_FUNCTION_PDSCH_PROC
GROUP = ALL:VCD:UE:VCD_FUNCTION
FORMAT = int,value
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
DESC = VCD function PDSCH_PROC_SI
GROUP = ALL:VCD:UE:VCD_FUNCTION
diff --git a/common/utils/ocp_itti/intertask_interface.cpp b/common/utils/ocp_itti/intertask_interface.cpp
index 2189be9fe8..c774da57e6 100644
--- a/common/utils/ocp_itti/intertask_interface.cpp
+++ b/common/utils/ocp_itti/intertask_interface.cpp
@@ -339,7 +339,9 @@ extern "C" {
int itti_create_queue(const task_info_t *taskInfo) {
pthread_mutex_lock (&lock_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;
pthread_mutex_unlock (&lock_nb_queues);
LOG_I(TMR,"Starting itti queue: %s as task %d\n", taskInfo->name, newQueue);
diff --git a/docker/Dockerfile.eNB.rhel8.2 b/docker/Dockerfile.eNB.rhel8.2
index 5fcd5a7b9f..aa8b9aa228 100644
--- a/docker/Dockerfile.eNB.rhel8.2
+++ b/docker/Dockerfile.eNB.rhel8.2
@@ -27,14 +27,15 @@
FROM localhost/ran-build:latest AS enb-build
+RUN rm -Rf /oai-ran
WORKDIR /oai-ran
+COPY . .
#run build_oai to build the target image
RUN /bin/sh oaienv && \
cd cmake_targets && \
- rm -Rf log && \
mkdir -p log && \
- ./build_oai --eNB --ninja -w USRP
+ ./build_oai --eNB --ninja -w USRP --verbose-ci
# debug
#RUN ldconfig -v && ldd /oai-ran/targets/bin/lte-softmodem.Rel15
diff --git a/docker/Dockerfile.eNB.ubuntu18 b/docker/Dockerfile.eNB.ubuntu18
index cdfb37ebfc..95d7194c31 100644
--- a/docker/Dockerfile.eNB.ubuntu18
+++ b/docker/Dockerfile.eNB.ubuntu18
@@ -27,14 +27,15 @@
FROM ran-build:latest AS enb-build
+RUN rm -Rf /oai-ran
WORKDIR /oai-ran
+COPY . .
#run build_oai to build the target image
RUN /bin/sh oaienv && \
cd cmake_targets && \
- rm -Rf 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 && \
pip3 install --ignore-installed pyyaml && \
diff --git a/docker/Dockerfile.gNB.rhel8.2 b/docker/Dockerfile.gNB.rhel8.2
index fb9ade927f..6969c691fd 100644
--- a/docker/Dockerfile.gNB.rhel8.2
+++ b/docker/Dockerfile.gNB.rhel8.2
@@ -27,14 +27,15 @@
FROM localhost/ran-build:latest AS gnb-build
+RUN rm -Rf /oai-ran
WORKDIR /oai-ran
+COPY . .
#run build_oai to build the target image
RUN /bin/sh oaienv && \
cd cmake_targets && \
- rm -Rf log && \
mkdir -p log && \
- ./build_oai --gNB --ninja -w USRP
+ ./build_oai --gNB --ninja -w USRP --verbose-ci
#debug
#RUN ldconfig -v
diff --git a/docker/Dockerfile.gNB.ubuntu18 b/docker/Dockerfile.gNB.ubuntu18
index d43ad4709d..276d6989c4 100644
--- a/docker/Dockerfile.gNB.ubuntu18
+++ b/docker/Dockerfile.gNB.ubuntu18
@@ -27,14 +27,15 @@
FROM ran-build:latest AS gnb-build
+RUN rm -Rf /oai-ran
WORKDIR /oai-ran
+COPY . .
#run build_oai to build the target image
RUN /bin/sh oaienv && \
cd cmake_targets && \
- rm -Rf log && \
mkdir -p log && \
- ./build_oai --gNB --ninja -w USRP
+ ./build_oai --gNB --ninja -w USRP --verbose-ci
#debug
RUN ldconfig -v
diff --git a/docker/Dockerfile.lteUE.rhel8.2 b/docker/Dockerfile.lteUE.rhel8.2
index 0a853dcd6b..e22343d63c 100644
--- a/docker/Dockerfile.lteUE.rhel8.2
+++ b/docker/Dockerfile.lteUE.rhel8.2
@@ -27,15 +27,15 @@
FROM localhost/ran-build:latest AS lte-ue-build
-
+RUN rm -Rf /oai-ran
WORKDIR /oai-ran
+COPY . .
#run build_oai to build the target image
RUN /bin/sh oaienv && \
cd cmake_targets && \
- rm -Rf log && \
mkdir -p log && \
- ./build_oai --UE --ninja -w USRP
+ ./build_oai --UE --ninja -w USRP --verbose-ci
# debug
#RUN ldconfig -v && ldd /oai-ran/targets/bin/lte-uesoftmodem.Rel15
diff --git a/docker/Dockerfile.lteUE.ubuntu18 b/docker/Dockerfile.lteUE.ubuntu18
index 8793cc54f7..6af2e61991 100644
--- a/docker/Dockerfile.lteUE.ubuntu18
+++ b/docker/Dockerfile.lteUE.ubuntu18
@@ -27,14 +27,15 @@
FROM ran-build:latest AS lte-ue-build
+RUN rm -Rf /oai-ran
WORKDIR /oai-ran
+COPY . .
#run build_oai to build the target image
RUN /bin/sh oaienv && \
cd cmake_targets && \
- rm -Rf log && \
mkdir -p log && \
- ./build_oai --UE --ninja -w USRP
+ ./build_oai --UE --ninja -w USRP --verbose-ci
# debug
#RUN ldconfig -v
diff --git a/docker/Dockerfile.nrUE.rhel8.2 b/docker/Dockerfile.nrUE.rhel8.2
index f9f3f8e4bf..01988fd6ff 100644
--- a/docker/Dockerfile.nrUE.rhel8.2
+++ b/docker/Dockerfile.nrUE.rhel8.2
@@ -27,14 +27,15 @@
FROM localhost/ran-build:latest AS nr-ue-build
+RUN rm -Rf /oai-ran
WORKDIR /oai-ran
+COPY . .
#run build_oai to build the target image
RUN /bin/sh oaienv && \
cd cmake_targets && \
- rm -Rf log && \
mkdir -p log && \
- ./build_oai --nrUE --ninja -w USRP
+ ./build_oai --nrUE --ninja -w USRP --verbose-ci
# debug
#RUN ldconfig -v
diff --git a/docker/Dockerfile.nrUE.ubuntu18 b/docker/Dockerfile.nrUE.ubuntu18
index 5450194f35..c96bcf80ef 100644
--- a/docker/Dockerfile.nrUE.ubuntu18
+++ b/docker/Dockerfile.nrUE.ubuntu18
@@ -27,14 +27,15 @@
FROM ran-build:latest AS nr-ue-build
+RUN rm -Rf /oai-ran
WORKDIR /oai-ran
+COPY . .
#run build_oai to build the target image
RUN /bin/sh oaienv && \
cd cmake_targets && \
- rm -Rf log && \
mkdir -p log && \
- ./build_oai --nrUE --ninja -w USRP
+ ./build_oai --nrUE --ninja -w USRP --verbose-ci
# debug
#RUN ldconfig -v
diff --git a/executables/nr-gnb.c b/executables/nr-gnb.c
index fce01f04fd..f13e00c84b 100644
--- a/executables/nr-gnb.c
+++ b/executables/nr-gnb.c
@@ -250,13 +250,14 @@ void rx_func(void *param) {
L1_nr_prach_procedures(gNB,frame_rx,slot_rx);
//apply the rx signal rotation here
- apply_nr_rotation_ul(&gNB->frame_parms,
- gNB->common_vars.rxdataF[0],
- slot_rx,
- 0,
- gNB->frame_parms.Ncp==EXTENDED?12:14,
- gNB->frame_parms.ofdm_symbol_size);
-
+ for (int aa = 0; aa < gNB->frame_parms.nb_antennas_rx; aa++) {
+ apply_nr_rotation_ul(&gNB->frame_parms,
+ gNB->common_vars.rxdataF[aa],
+ slot_rx,
+ 0,
+ gNB->frame_parms.Ncp==EXTENDED?12:14,
+ gNB->frame_parms.ofdm_symbol_size);
+ }
phy_procedures_gNB_uespec_RX(gNB, frame_rx, slot_rx);
}
diff --git a/executables/nr-ru.c b/executables/nr-ru.c
index 9dbd025680..18aa36a78f 100644
--- a/executables/nr-ru.c
+++ b/executables/nr-ru.c
@@ -797,58 +797,21 @@ void fill_rf_config(RU_t *ru, char *rf_config_file) {
int mu = config->ssb_config.scs_common.value;
int N_RB = config->carrier_config.dl_grid_size[config->ssb_config.scs_common.value].value;
- if (mu == NR_MU_0) { //or if LTE
- if(N_RB == 100) {
- if (fp->threequarter_fs) {
- cfg->sample_rate=23.04e6;
- cfg->samples_per_frame = 230400;
- cfg->tx_bw = 10e6;
- cfg->rx_bw = 10e6;
- } else {
- cfg->sample_rate=30.72e6;
- cfg->samples_per_frame = 307200;
- cfg->tx_bw = 10e6;
- cfg->rx_bw = 10e6;
- }
- } else if(N_RB == 50) {
- cfg->sample_rate=15.36e6;
- cfg->samples_per_frame = 153600;
- cfg->tx_bw = 5e6;
- cfg->rx_bw = 5e6;
- } else if (N_RB == 25) {
- cfg->sample_rate=7.68e6;
- cfg->samples_per_frame = 76800;
- cfg->tx_bw = 2.5e6;
- cfg->rx_bw = 2.5e6;
- } else if (N_RB == 6) {
- cfg->sample_rate=1.92e6;
- cfg->samples_per_frame = 19200;
- cfg->tx_bw = 1.5e6;
- cfg->rx_bw = 1.5e6;
- } else AssertFatal(1==0,"Unknown N_RB %d\n",N_RB);
- } else if (mu == NR_MU_1) {
- if(N_RB == 273) {
- if (fp->threequarter_fs) {
- AssertFatal(0 == 1,"three quarter sampling not supported for N_RB 273\n");
- } else {
- cfg->sample_rate=122.88e6;
- cfg->samples_per_frame = 1228800;
- cfg->tx_bw = 100e6;
- cfg->rx_bw = 100e6;
- }
- } else if(N_RB == 217) {
+ if (mu == NR_MU_0) {
+ switch(N_RB) {
+ case 270:
if (fp->threequarter_fs) {
cfg->sample_rate=92.16e6;
cfg->samples_per_frame = 921600;
- cfg->tx_bw = 80e6;
- cfg->rx_bw = 80e6;
+ cfg->tx_bw = 50e6;
+ cfg->rx_bw = 50e6;
} else {
- cfg->sample_rate=122.88e6;
- cfg->samples_per_frame = 1228800;
- cfg->tx_bw = 80e6;
- cfg->rx_bw = 80e6;
+ cfg->sample_rate=61.44e6;
+ cfg->samples_per_frame = 614400;
+ cfg->tx_bw = 50e6;
+ cfg->rx_bw = 50e6;
}
- } else if(N_RB == 106) {
+ case 216:
if (fp->threequarter_fs) {
cfg->sample_rate=46.08e6;
cfg->samples_per_frame = 460800;
@@ -861,20 +824,154 @@ void fill_rf_config(RU_t *ru, char *rf_config_file) {
cfg->tx_bw = 40e6;
cfg->rx_bw = 40e6;
}
- } else {
+ break;
+ case 106:
+ if (fp->threequarter_fs) {
+ cfg->sample_rate=23.04e6;
+ cfg->samples_per_frame = 230400;
+ cfg->tx_bw = 20e6;
+ cfg->rx_bw = 20e6;
+ }
+ else {
+ cfg->sample_rate=30.72e6;
+ cfg->samples_per_frame = 307200;
+ cfg->tx_bw = 20e6;
+ cfg->rx_bw = 20e6;
+ }
+ break;
+ case 52:
+ if (fp->threequarter_fs) {
+ cfg->sample_rate=11.52e6;
+ cfg->samples_per_frame = 115200;
+ cfg->tx_bw = 10e6;
+ cfg->rx_bw = 10e6;
+ }
+ else {
+ cfg->sample_rate=15.36e6;
+ cfg->samples_per_frame = 153600;
+ cfg->tx_bw = 10e6;
+ cfg->rx_bw = 10e6;
+ }
+ case 25:
+ if (fp->threequarter_fs) {
+ cfg->sample_rate=5.76e6;
+ cfg->samples_per_frame = 57600;
+ cfg->tx_bw = 5e6;
+ cfg->rx_bw = 5e6;
+ }
+ else {
+ cfg->sample_rate=7.68e6;
+ cfg->samples_per_frame = 76800;
+ cfg->tx_bw = 5e6;
+ cfg->rx_bw = 5e6;
+ }
+ break;
+ default:
+ AssertFatal(0==1,"N_RB %d not yet supported for numerology %d\n",N_RB,mu);
+ }
+ } else if (mu == NR_MU_1) {
+ switch(N_RB) {
+ case 273:
+ if (fp->threequarter_fs) {
+ cfg->sample_rate=184.32e6;
+ cfg->samples_per_frame = 1843200;
+ cfg->tx_bw = 100e6;
+ cfg->rx_bw = 100e6;
+ } else {
+ cfg->sample_rate=122.88e6;
+ cfg->samples_per_frame = 1228800;
+ cfg->tx_bw = 100e6;
+ cfg->rx_bw = 100e6;
+ }
+ break;
+ case 217:
+ if (fp->threequarter_fs) {
+ cfg->sample_rate=92.16e6;
+ cfg->samples_per_frame = 921600;
+ cfg->tx_bw = 80e6;
+ cfg->rx_bw = 80e6;
+ } else {
+ cfg->sample_rate=122.88e6;
+ cfg->samples_per_frame = 1228800;
+ cfg->tx_bw = 80e6;
+ cfg->rx_bw = 80e6;
+ }
+ break;
+ case 106:
+ if (fp->threequarter_fs) {
+ cfg->sample_rate=46.08e6;
+ cfg->samples_per_frame = 460800;
+ cfg->tx_bw = 40e6;
+ cfg->rx_bw = 40e6;
+ }
+ else {
+ cfg->sample_rate=61.44e6;
+ cfg->samples_per_frame = 614400;
+ cfg->tx_bw = 40e6;
+ cfg->rx_bw = 40e6;
+ }
+ break;
+ case 51:
+ if (fp->threequarter_fs) {
+ cfg->sample_rate=23.04e6;
+ cfg->samples_per_frame = 230400;
+ cfg->tx_bw = 20e6;
+ cfg->rx_bw = 20e6;
+ }
+ else {
+ cfg->sample_rate=30.72e6;
+ cfg->samples_per_frame = 307200;
+ cfg->tx_bw = 20e6;
+ cfg->rx_bw = 20e6;
+ }
+ break;
+ case 24:
+ if (fp->threequarter_fs) {
+ cfg->sample_rate=11.52e6;
+ cfg->samples_per_frame = 115200;
+ cfg->tx_bw = 10e6;
+ cfg->rx_bw = 10e6;
+ }
+ else {
+ cfg->sample_rate=15.36e6;
+ cfg->samples_per_frame = 153600;
+ cfg->tx_bw = 10e6;
+ cfg->rx_bw = 10e6;
+ }
+ break;
+ default:
AssertFatal(0==1,"N_RB %d not yet supported for numerology %d\n",N_RB,mu);
}
} else if (mu == NR_MU_3) {
- if (N_RB == 66) {
- cfg->sample_rate = 122.88e6;
- cfg->samples_per_frame = 1228800;
- cfg->tx_bw = 100e6;
- cfg->rx_bw = 100e6;
- } else if(N_RB == 32) {
- cfg->sample_rate=61.44e6;
- cfg->samples_per_frame = 614400;
- cfg->tx_bw = 50e6;
- cfg->rx_bw = 50e6;
+ switch(N_RB) {
+ case 66:
+ if (fp->threequarter_fs) {
+ cfg->sample_rate=184.32e6;
+ cfg->samples_per_frame = 1843200;
+ cfg->tx_bw = 100e6;
+ cfg->rx_bw = 100e6;
+ } else {
+ cfg->sample_rate = 122.88e6;
+ cfg->samples_per_frame = 1228800;
+ cfg->tx_bw = 100e6;
+ cfg->rx_bw = 100e6;
+ }
+ break;
+ case 32:
+ if (fp->threequarter_fs) {
+ cfg->sample_rate=92.16e6;
+ cfg->samples_per_frame = 921600;
+ cfg->tx_bw = 50e6;
+ cfg->rx_bw = 50e6;
+ } else {
+ cfg->sample_rate=61.44e6;
+ cfg->samples_per_frame = 614400;
+ cfg->tx_bw = 50e6;
+ cfg->rx_bw = 50e6;
+ }
+ break;
+ default:
+ AssertFatal(0==1,"N_RB %d not yet supported for numerology %d\n",N_RB,mu);
}
} else {
AssertFatal(0 == 1,"Numerology %d not supported for the moment\n",mu);
@@ -921,60 +1018,52 @@ int setup_RU_buffers(RU_t *ru) {
int i,j;
int card,ant;
//uint16_t N_TA_offset = 0;
- NR_DL_FRAME_PARMS *frame_parms;
+ NR_DL_FRAME_PARMS *fp;
nfapi_nr_config_request_scf_t *config = &ru->config;
if (ru) {
- frame_parms = ru->nr_frame_parms;
- printf("setup_RU_buffers: frame_parms = %p\n",frame_parms);
+ fp = ru->nr_frame_parms;
+ printf("setup_RU_buffers: frame_parms = %p\n",fp);
} else {
printf("ru pointer is NULL\n");
return(-1);
}
+
int mu = config->ssb_config.scs_common.value;
int N_RB = config->carrier_config.dl_grid_size[config->ssb_config.scs_common.value].value;
-
if (config->cell_config.frame_duplex_type.value == TDD) {
int N_TA_offset = config->carrier_config.uplink_frequency.value < 6000000 ? 400 : 431; // reference samples for 25600Tc @ 30.72 Ms/s for FR1, same @ 61.44 Ms/s for FR2
double factor=1;
-
switch (mu) {
- case 0: //15 kHz scs
- AssertFatal(N_TA_offset == 400,"scs_common 15kHz only for FR1\n");
- if (N_RB <= 25) factor = .25; // 7.68 Ms/s
- else if (N_RB <=50) factor = .5; // 15.36 Ms/s
- else if (N_RB <=75) factor = 1.0; // 30.72 Ms/s
- else if (N_RB <=100) factor = 1.0; // 30.72 Ms/s
- else AssertFatal(1==0,"Too many PRBS for mu=0\n");
- break;
- case 1: //30 kHz sc
- AssertFatal(N_TA_offset == 400,"scs_common 30kHz only for FR1\n");
- if (N_RB <= 106) factor = 2.0; // 61.44 Ms/s
- else if (N_RB <= 275) factor = 4.0; // 122.88 Ms/s
- break;
- case 2: //60 kHz scs
- AssertFatal(1==0,"scs_common should not be 60 kHz\n");
- break;
- case 3: //120 kHz scs
- AssertFatal(N_TA_offset == 431,"scs_common 120kHz only for FR2\n");
- break;
- case 4: //240 kHz scs
- AssertFatal(1==0,"scs_common should not be 60 kHz\n");
- if (N_RB <= 32) factor = 1.0; // 61.44 Ms/s
- else if (N_RB <= 66) factor = 2.0; // 122.88 Ms/s
- else AssertFatal(1==0,"N_RB %d is too big for curretn FR2 implementation\n",N_RB);
- break;
-
- if (N_RB == 100) ru->N_TA_offset = 624;
- else if (N_RB == 50) ru->N_TA_offset = 624/2;
- else if (N_RB == 25) ru->N_TA_offset = 624/4;
+ case 0: //15 kHz scs
+ AssertFatal(N_TA_offset == 400, "scs_common 15kHz only for FR1\n");
+ factor = fp->samples_per_subframe / 30720.0;
+ break;
+ case 1: //30 kHz sc
+ AssertFatal(N_TA_offset == 400, "scs_common 30kHz only for FR1\n");
+ factor = fp->samples_per_subframe / 30720.0;
+ break;
+ case 2: //60 kHz scs
+ AssertFatal(1==0, "scs_common should not be 60 kHz\n");
+ break;
+ case 3: //120 kHz scs
+ AssertFatal(N_TA_offset == 431, "scs_common 120kHz only for FR2\n");
+ factor = fp->samples_per_subframe / 61440.0;
+ break;
+ case 4: //240 kHz scs
+ AssertFatal(N_TA_offset == 431, "scs_common 240kHz only for FR2\n");
+ factor = fp->samples_per_subframe / 61440.0;
+ break;
+ default:
+ AssertFatal(1==0, "Invalid scs_common!\n");
}
- if (frame_parms->threequarter_fs == 1) factor = factor*.75;
+
ru->N_TA_offset = (int)(N_TA_offset * factor);
- LOG_I(PHY,"RU %d Setting N_TA_offset to %d samples (factor %f, UL Freq %d, N_RB %d)\n",ru->idx,ru->N_TA_offset,factor,
- config->carrier_config.uplink_frequency.value, N_RB);
+
+ LOG_I(PHY,"RU %d Setting N_TA_offset to %d samples (factor %f, UL Freq %d, N_RB %d, mu %d)\n",ru->idx,ru->N_TA_offset,factor,
+ config->carrier_config.uplink_frequency.value, N_RB, mu);
}
else ru->N_TA_offset = 0;
diff --git a/executables/nr-softmodem.c b/executables/nr-softmodem.c
index 924c32b8a7..69fc3c554d 100644
--- a/executables/nr-softmodem.c
+++ b/executables/nr-softmodem.c
@@ -136,9 +136,6 @@ double rx_gain[MAX_NUM_CCs][4] = {{110,0,0,0},{20,0,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}*/;
@@ -476,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; cardrf_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 (irx_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) {
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
diff --git a/executables/nr-ue.c b/executables/nr-ue.c
index dd11071682..1b766efe6c 100644
--- a/executables/nr-ue.c
+++ b/executables/nr-ue.c
@@ -237,43 +237,6 @@ static void UE_synch(void *arg) {
openair0_cfg[UE->rf_map.card].rx_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) {
UE->rfdevice.trx_set_freq_func(&UE->rfdevice,&openair0_cfg[0],0);
//UE->rfdevice.trx_set_gains_func(&openair0,&openair0_cfg[0]);
@@ -723,13 +686,13 @@ void *UE_thread(void *arg) {
if (flags || IS_SOFTMODEM_RFSIM)
AssertFatal( writeBlockSize ==
- UE->rfdevice.trx_write_func(&UE->rfdevice,
- writeTimestamp,
- txp,
- writeBlockSize,
- UE->frame_parms.nb_antennas_tx,
- flags),"");
-
+ UE->rfdevice.trx_write_func(&UE->rfdevice,
+ writeTimestamp,
+ txp,
+ writeBlockSize,
+ UE->frame_parms.nb_antennas_tx,
+ flags),"");
+
for (int i=0; iframe_parms.nb_antennas_tx; i++)
memset(txp[i], 0, writeBlockSize);
diff --git a/executables/nr-uesoftmodem.c b/executables/nr-uesoftmodem.c
index 451dcd3d29..2854457eee 100644
--- a/executables/nr-uesoftmodem.c
+++ b/executables/nr-uesoftmodem.c
@@ -145,7 +145,6 @@ int chain_offset = 0;
int card_offset = 0;
uint64_t num_missed_slots = 0; // counter for the number of missed slots
int transmission_mode = 1;
-int numerology = 0;
int usrp_tx_thread = 0;
int oaisim_flag = 0;
int emulate_rf = 0;
@@ -316,92 +315,10 @@ void init_openair0(void) {
for (card=0; cardthreequarter_fs;
- numerology = frame_parms->numerology_index;
-
- 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);
- }
+ openair0_cfg[card].configFilename = NULL;
+ openair0_cfg[card].threequarter_fs = frame_parms->threequarter_fs;
+ 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->frame_type==TDD)
openair0_cfg[card].duplex_mode = duplex_mode_TDD;
@@ -415,8 +332,9 @@ void init_openair0(void) {
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);
- 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,
+ openair0_cfg[card].sample_rate,
openair0_cfg[card].tx_num_channels,
openair0_cfg[card].rx_num_channels,
duplex_mode[openair0_cfg[card].duplex_mode]);
diff --git a/openair1/PHY/CODING/TESTBENCH/ldpctest.c b/openair1/PHY/CODING/TESTBENCH/ldpctest.c
index b42ac6e4c8..e16c909835 100644
--- a/openair1/PHY/CODING/TESTBENCH/ldpctest.c
+++ b/openair1/PHY/CODING/TESTBENCH/ldpctest.c
@@ -144,7 +144,7 @@ int test_ldpc(short No_iteration,
t_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 ;
int32_t n_iter = 0;
diff --git a/openair1/PHY/INIT/nr_init.c b/openair1/PHY/INIT/nr_init.c
index ab363fcae4..0e6b253c2b 100644
--- a/openair1/PHY/INIT/nr_init.c
+++ b/openair1/PHY/INIT/nr_init.c
@@ -464,8 +464,8 @@ void nr_phy_config_request_sim(PHY_VARS_gNB *gNB,
gNB->mac_enabled = 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->ul_CarrierFreq = 3500000000;//fp->dl_CarrierFreq - (get_uldl_offset(gNB_config->nfapi_config.rf_bands.rf_band[0])*100000);
+ fp->dl_CarrierFreq = 3600000000;//from_nrarfcn(gNB_config->nfapi_config.rf_bands.rf_band[0],gNB_config->nfapi_config.nrarfcn.value);
+ 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->threequarter_fs= 0;
} else if (mu==3) {
diff --git a/openair1/PHY/INIT/nr_init_ru.c b/openair1/PHY/INIT/nr_init_ru.c
index 648b820f07..0aac86e5be 100644
--- a/openair1/PHY/INIT/nr_init_ru.c
+++ b/openair1/PHY/INIT/nr_init_ru.c
@@ -125,7 +125,7 @@ int nr_phy_init_RU(RU_t *ru) {
int beam_count = 0;
if (ru->nb_tx>1) {//Enable beamforming when nb_tx > 1
for (p=0;pnb_log_antennas;p++) {
- if ((fp->L_ssb >> (63-p)) & 0x01)//64 bit-map with the MSB @2⁶³ corresponds to SSB ssb_index 0
+ //if ((fp->L_ssb >> (63-p)) & 0x01)//64 bit-map with the MSB @2⁶³ corresponds to SSB ssb_index 0
beam_count++;
}
AssertFatal(ru->nb_bfw==(beam_count*ru->nb_tx),"Number of beam weights from config file is %d while the expected number is %d",ru->nb_bfw,(beam_count*ru->nb_tx));
@@ -133,7 +133,7 @@ int nr_phy_init_RU(RU_t *ru) {
int l_ind = 0;
for (i=0; inb_log_antennas;p++) {
- if ((fp->L_ssb >> (63-p)) & 0x01) {
+ //if ((fp->L_ssb >> (63-p)) & 0x01) {
ru->beam_weights[i][p] = (int32_t **)malloc16_clear(ru->nb_tx*sizeof(int32_t*));
for (j=0; jnb_tx; j++) {
ru->beam_weights[i][p][j] = (int32_t *)malloc16_clear(fp->ofdm_symbol_size*sizeof(int32_t));
@@ -142,8 +142,8 @@ int nr_phy_init_RU(RU_t *ru) {
//printf("Beam Weight %08x for beam %d and tx %d\n",ru->bw_list[i][l_ind],p,j);
l_ind++;
} // for j
- } // for p
- }
+ //}
+ } // for p
} //for i
}
} // !=IF5
diff --git a/openair1/PHY/INIT/nr_init_ue.c b/openair1/PHY/INIT/nr_init_ue.c
index 8bcc58160f..9bfc0d7a4b 100644
--- a/openair1/PHY/INIT/nr_init_ue.c
+++ b/openair1/PHY/INIT/nr_init_ue.c
@@ -71,33 +71,39 @@ void phy_init_nr_ue__PDSCH(NR_UE_PDSCH *const pdsch,
pdsch->llr128 = (int16_t **)malloc16_clear( sizeof(int16_t *) );
// FIXME! no further allocation for (int16_t*)pdsch->llr128 !!! expect SIGSEGV
// FK, 11-3-2015: this is only as a temporary pointer, no memory is stored there
- pdsch->rxdataF_ext = (int32_t **)malloc16_clear( 8*sizeof(int32_t *) );
- pdsch->rxdataF_uespec_pilots = (int32_t **)malloc16_clear( 8*sizeof(int32_t *) );
- pdsch->rxdataF_comp0 = (int32_t **)malloc16_clear( 8*sizeof(int32_t *) );
- pdsch->rho = (int32_t **)malloc16_clear( fp->nb_antennas_rx*sizeof(int32_t *) );
- pdsch->dl_ch_estimates = (int32_t **)malloc16_clear( 8*sizeof(int32_t *) );
- pdsch->dl_ch_estimates_ext = (int32_t **)malloc16_clear( 8*sizeof(int32_t *) );
- pdsch->dl_bf_ch_estimates = (int32_t **)malloc16_clear( 8*sizeof(int32_t *) );
- pdsch->dl_bf_ch_estimates_ext = (int32_t **)malloc16_clear( 8*sizeof(int32_t *) );
+ pdsch->rxdataF_ext = (int32_t **)malloc16_clear( fp->nb_antennas_rx*sizeof(int32_t *) );
+ pdsch->rxdataF_uespec_pilots = (int32_t **)malloc16_clear( fp->nb_antennas_rx*sizeof(int32_t *) );
+ pdsch->rxdataF_comp0 = (int32_t **)malloc16_clear( NR_MAX_NB_LAYERS*fp->nb_antennas_rx*sizeof(int32_t *) );
+ pdsch->rho = (int32_t ***)malloc16_clear( fp->nb_antennas_rx*sizeof(int32_t **) );
+ pdsch->dl_ch_estimates = (int32_t **)malloc16_clear( NR_MAX_NB_LAYERS*fp->nb_antennas_rx*sizeof(int32_t *) );
+ pdsch->dl_ch_estimates_ext = (int32_t **)malloc16_clear( NR_MAX_NB_LAYERS*fp->nb_antennas_rx*sizeof(int32_t *) );
+ pdsch->dl_bf_ch_estimates = (int32_t **)malloc16_clear( NR_MAX_NB_LAYERS*fp->nb_antennas_rx*sizeof(int32_t *) );
+ pdsch->dl_bf_ch_estimates_ext = (int32_t **)malloc16_clear( NR_MAX_NB_LAYERS*fp->nb_antennas_rx*sizeof(int32_t *) );
//pdsch->dl_ch_rho_ext = (int32_t**)malloc16_clear( 8*sizeof(int32_t*) );
//pdsch->dl_ch_rho2_ext = (int32_t**)malloc16_clear( 8*sizeof(int32_t*) );
- pdsch->dl_ch_mag0 = (int32_t **)malloc16_clear( 8*sizeof(int32_t *) );
- pdsch->dl_ch_magb0 = (int32_t **)malloc16_clear( 8*sizeof(int32_t *) );
- pdsch->dl_ch_magr0 = (int32_t **)malloc16_clear( 8*sizeof(int32_t *) );
- pdsch->ptrs_phase_per_slot = (int32_t **)malloc16_clear( 8*sizeof(int32_t *) );
- pdsch->ptrs_re_per_slot = (int32_t **)malloc16_clear( 8*sizeof(int32_t *) );
- pdsch->dl_ch_ptrs_estimates_ext = (int32_t **)malloc16_clear( 8*sizeof(int32_t *) );
+ pdsch->dl_ch_mag0 = (int32_t **)malloc16_clear( NR_MAX_NB_LAYERS*fp->nb_antennas_rx*sizeof(int32_t *) );
+ pdsch->dl_ch_magb0 = (int32_t **)malloc16_clear( NR_MAX_NB_LAYERS*fp->nb_antennas_rx*sizeof(int32_t *) );
+ pdsch->dl_ch_magr0 = (int32_t **)malloc16_clear( NR_MAX_NB_LAYERS*fp->nb_antennas_rx*sizeof(int32_t *) );
+ pdsch->ptrs_phase_per_slot = (int32_t **)malloc16_clear( fp->nb_antennas_rx*sizeof(int32_t *) );
+ pdsch->ptrs_re_per_slot = (int32_t **)malloc16_clear( fp->nb_antennas_rx*sizeof(int32_t *) );
+ pdsch->dl_ch_ptrs_estimates_ext = (int32_t **)malloc16_clear( fp->nb_antennas_rx*sizeof(int32_t *) );
// the allocated memory size is fixed:
- AssertFatal( fp->nb_antennas_rx <= 2, "nb_antennas_rx > 2" );
+ AssertFatal( fp->nb_antennas_rx <= 4, "nb_antennas_rx > 4" );//Extend the max number of UE Rx antennas to 4
+ const size_t num = 7*2*fp->N_RB_DL*12;
for (int i=0; inb_antennas_rx; i++) {
- pdsch->rho[i] = (int32_t *)malloc16_clear( sizeof(int32_t)*(fp->N_RB_DL*12*7*2) );
+ pdsch->rxdataF_ext[i] = (int32_t *)malloc16_clear( sizeof(int32_t) * num );
+ pdsch->rxdataF_uespec_pilots[i] = (int32_t *)malloc16_clear( sizeof(int32_t) * fp->N_RB_DL*12);
+ pdsch->ptrs_phase_per_slot[i] = (int32_t *)malloc16_clear( sizeof(int32_t) * 14 );
+ pdsch->ptrs_re_per_slot[i] = (int32_t *)malloc16_clear( sizeof(int32_t) * 14);
+ pdsch->dl_ch_ptrs_estimates_ext[i] = (int32_t *)malloc16_clear( sizeof(int32_t) * num);
+ pdsch->rho[i] = (int32_t **)malloc16_clear( NR_MAX_NB_LAYERS*NR_MAX_NB_LAYERS*sizeof(int32_t *) );
- for (int j=0; j<4; j++) { //fp->nb_antennas_tx; j++)
- const int idx = (j<<1)+i;
- const size_t num = 7*2*fp->N_RB_DL*12;
- pdsch->rxdataF_ext[idx] = (int32_t *)malloc16_clear( sizeof(int32_t) * num );
- pdsch->rxdataF_uespec_pilots[idx] = (int32_t *)malloc16_clear( sizeof(int32_t) * fp->N_RB_DL*12);
+ for (int j=0; jnb_antennas_rx)+i;
+ for (int k=0; krho[i][j*NR_MAX_NB_LAYERS+k] = (int32_t *)malloc16_clear( sizeof(int32_t) * num );
+ }
pdsch->rxdataF_comp0[idx] = (int32_t *)malloc16_clear( sizeof(int32_t) * num );
pdsch->dl_ch_estimates[idx] = (int32_t *)malloc16_clear( sizeof(int32_t) * fp->ofdm_symbol_size*7*2);
pdsch->dl_ch_estimates_ext[idx] = (int32_t *)malloc16_clear( sizeof(int32_t) * num );
@@ -108,9 +114,6 @@ void phy_init_nr_ue__PDSCH(NR_UE_PDSCH *const pdsch,
pdsch->dl_ch_mag0[idx] = (int32_t *)malloc16_clear( sizeof(int32_t) * num );
pdsch->dl_ch_magb0[idx] = (int32_t *)malloc16_clear( sizeof(int32_t) * num );
pdsch->dl_ch_magr0[idx] = (int32_t *)malloc16_clear( sizeof(int32_t) * num );
- pdsch->ptrs_re_per_slot[idx] = (int32_t *)malloc16_clear(sizeof(int32_t) * 14);
- pdsch->ptrs_phase_per_slot[idx] = (int32_t *)malloc16_clear( sizeof(int32_t) * 14 );
- pdsch->dl_ch_ptrs_estimates_ext[idx]= (int32_t *)malloc16_clear( sizeof(int32_t) * num);
}
}
}
@@ -139,16 +142,14 @@ int init_nr_ue_signal(PHY_VARS_NR_UE *ue,
uint16_t N_n_scid[2] = {0,1}; // [HOTFIX] This is a temporary implementation of scramblingID0 and scramblingID1 which are given by DMRS-UplinkConfig
int n_scid;
abstraction_flag = 0;
- fp->nb_antennas_tx = 1;
- fp->nb_antennas_rx=1;
// dmrs_UplinkConfig_t *dmrs_Uplink_Config = &ue->pusch_config.dmrs_UplinkConfig;
// ptrs_UplinkConfig_t *ptrs_Uplink_Config = &ue->pusch_config.dmrs_UplinkConfig.ptrs_UplinkConfig;
LOG_I(PHY, "Initializing UE vars (abstraction %u) for gNB TXant %u, UE RXant %u\n", abstraction_flag, fp->nb_antennas_tx, fp->nb_antennas_rx);
- //LOG_D(PHY,"[MSC_NEW][FRAME 00000][PHY_UE][MOD %02u][]\n", ue->Mod_id+NB_eNB_INST);
+ //LOG_D(PHY,"[MSC_NEW][FRAME 00000][PHY_UE][MOD %02u][]\n", ue->Mod_id+NB_gNB_INST);
phy_init_nr_top(ue);
// many memory allocation sizes are hard coded
- AssertFatal( fp->nb_antennas_rx <= 2, "hard coded allocation for ue_common_vars->dl_ch_estimates[gNB_id]" );
- AssertFatal(nb_connected_gNB <= NUMBER_OF_CONNECTED_gNB_MAX, "n_connected_gNB is too large" );
+ AssertFatal( fp->nb_antennas_rx <= 4, "hard coded allocation for ue_common_vars->dl_ch_estimates[gNB_id]" );
+ AssertFatal( nb_connected_gNB <= NUMBER_OF_CONNECTED_gNB_MAX, "n_connected_gNB is too large" );
// init phy_vars_ue
for (i=0; i<4; i++) {
@@ -276,7 +277,7 @@ int init_nr_ue_signal(PHY_VARS_NR_UE *ue,
}
}
- //PDCCH DMRS init (eNB offset = 0)
+ //PDCCH DMRS init (gNB offset = 0)
ue->nr_gold_pdcch[0] = (uint32_t ***)malloc16(fp->slots_per_frame*sizeof(uint32_t **));
uint32_t ***pdcch_dmrs = ue->nr_gold_pdcch[0];
AssertFatal(pdcch_dmrs!=NULL, "NR init: pdcch_dmrs malloc failed\n");
@@ -291,7 +292,7 @@ int init_nr_ue_signal(PHY_VARS_NR_UE *ue,
}
}
- //PDSCH DMRS init (eNB offset = 0)
+ //PDSCH DMRS init (gNB offset = 0)
ue->nr_gold_pdsch[0] = (uint32_t ****)malloc16(fp->slots_per_frame*sizeof(uint32_t ***));
uint32_t ****pdsch_dmrs = ue->nr_gold_pdsch[0];
@@ -329,31 +330,25 @@ int init_nr_ue_signal(PHY_VARS_NR_UE *ue,
}
for (th_id=0; th_idpdsch_vars[th_id][gNB_id]->llr_shifts = (uint8_t *)malloc16_clear(7*2*fp->N_RB_DL*12);
- ue->pdsch_vars[th_id][gNB_id]->llr_shifts_p = ue->pdsch_vars[0][gNB_id]->llr_shifts;
- ue->pdsch_vars[th_id][gNB_id]->llr[1] = (int16_t *)malloc16_clear((8*(3*8*8448))*sizeof(int16_t));
- ue->pdsch_vars[th_id][gNB_id]->layer_llr[1] = (int16_t *)malloc16_clear((8*(3*8*8448))*sizeof(int16_t));
- ue->pdsch_vars[th_id][gNB_id]->llr128_2ndstream = (int16_t **)malloc16_clear(sizeof(int16_t *));
- ue->pdsch_vars[th_id][gNB_id]->rho = (int32_t **)malloc16_clear(fp->nb_antennas_rx*sizeof(int32_t *));
+ ue->pdsch_vars[th_id][gNB_id]->llr_shifts = (uint8_t *)malloc16_clear(7*2*fp->N_RB_DL*12);
+ ue->pdsch_vars[th_id][gNB_id]->llr_shifts_p = ue->pdsch_vars[0][gNB_id]->llr_shifts;
+ ue->pdsch_vars[th_id][gNB_id]->llr[1] = (int16_t *)malloc16_clear( (8*(3*8*8448))*sizeof(int16_t) );
+ ue->pdsch_vars[th_id][gNB_id]->layer_llr[1] = (int16_t *)malloc16_clear( (8*(3*8*8448))*sizeof(int16_t) );
+ ue->pdsch_vars[th_id][gNB_id]->llr128_2ndstream = (int16_t **)malloc16_clear( sizeof(int16_t *) );
}
- for (int i=0; inb_antennas_rx; i++) {
- for (th_id=0; th_idpdsch_vars[th_id][gNB_id]->rho[i] = (int32_t *)malloc16_clear(7*2*sizeof(int32_t)*(fp->N_RB_DL*12));
- }
- }
for (th_id=0; th_idpdsch_vars[th_id][gNB_id]->dl_ch_rho2_ext = (int32_t **)malloc16_clear(8*sizeof(int32_t *));
+ ue->pdsch_vars[th_id][gNB_id]->dl_ch_rho2_ext = (int32_t **)malloc16_clear( 4*fp->nb_antennas_rx*sizeof(int32_t *) );
}
for (i=0; inb_antennas_rx; i++)
for (j=0; j<4; j++) {
- const int idx = (j<<1)+i;
+ const int idx = (j*fp->nb_antennas_rx)+i;
const size_t num = 7*2*fp->N_RB_DL*12+4;
for (th_id=0; th_idpdsch_vars[th_id][gNB_id]->dl_ch_rho2_ext[idx] = (int32_t *)malloc16_clear(sizeof(int32_t) * num);
+ ue->pdsch_vars[th_id][gNB_id]->dl_ch_rho2_ext[idx] = (int32_t *)malloc16_clear( sizeof(int32_t) * num );
}
}
@@ -361,15 +356,15 @@ int init_nr_ue_signal(PHY_VARS_NR_UE *ue,
for (k=0; k<8; k++) { //harq_pid
for (l=0; l<8; l++) { //round
for (th_id=0; th_idpdsch_vars[th_id][gNB_id]->rxdataF_comp1[k][l] = (int32_t **)malloc16_clear(8*sizeof(int32_t *));
- ue->pdsch_vars[th_id][gNB_id]->dl_ch_rho_ext[k][l] = (int32_t **)malloc16_clear(8*sizeof(int32_t *));
- ue->pdsch_vars[th_id][gNB_id]->dl_ch_mag1[k][l] = (int32_t **)malloc16_clear(8*sizeof(int32_t *));
- ue->pdsch_vars[th_id][gNB_id]->dl_ch_magb1[k][l] = (int32_t **)malloc16_clear(8*sizeof(int32_t *));
+ ue->pdsch_vars[th_id][gNB_id]->rxdataF_comp1[k][l] = (int32_t **)malloc16_clear( 4*fp->nb_antennas_rx*sizeof(int32_t *) );
+ ue->pdsch_vars[th_id][gNB_id]->dl_ch_rho_ext[k][l] = (int32_t **)malloc16_clear( 4*fp->nb_antennas_rx*sizeof(int32_t *) );
+ ue->pdsch_vars[th_id][gNB_id]->dl_ch_mag1[k][l] = (int32_t **)malloc16_clear( 4*fp->nb_antennas_rx*sizeof(int32_t *) );
+ ue->pdsch_vars[th_id][gNB_id]->dl_ch_magb1[k][l] = (int32_t **)malloc16_clear( 4*fp->nb_antennas_rx*sizeof(int32_t *) );
}
for (int i=0; inb_antennas_rx; i++)
for (int j=0; j<4; j++) { //frame_parms->nb_antennas_tx; j++)
- const int idx = (j<<1)+i;
+ const int idx = (j*fp->nb_antennas_rx)+i;
for (th_id=0; th_idpdsch_vars[th_id][gNB_id]->dl_ch_rho_ext[k][l][idx] = (int32_t *)malloc16_clear(7*2*sizeof(int32_t)*(fp->N_RB_DL*12));
@@ -383,26 +378,26 @@ int init_nr_ue_signal(PHY_VARS_NR_UE *ue,
// 100 PRBs * 12 REs/PRB * 4 PDCCH SYMBOLS * 2 LLRs/RE
for (th_id=0; th_idpdcch_vars[th_id][gNB_id]->llr = (int16_t *)malloc16_clear(2*4*100*12*sizeof(uint16_t));
- ue->pdcch_vars[th_id][gNB_id]->llr16 = (int16_t *)malloc16_clear(2*4*100*12*sizeof(uint16_t));
- ue->pdcch_vars[th_id][gNB_id]->wbar = (int16_t *)malloc16_clear(2*4*100*12*sizeof(uint16_t));
- ue->pdcch_vars[th_id][gNB_id]->e_rx = (int16_t *)malloc16_clear(4*2*100*12 );
- ue->pdcch_vars[th_id][gNB_id]->rxdataF_comp = (int32_t **)malloc16_clear(8*sizeof(int32_t *));
- ue->pdcch_vars[th_id][gNB_id]->dl_ch_rho_ext = (int32_t **)malloc16_clear(8*sizeof(int32_t *));
- ue->pdcch_vars[th_id][gNB_id]->rho = (int32_t **)malloc16(fp->nb_antennas_rx*sizeof(int32_t *));
- ue->pdcch_vars[th_id][gNB_id]->rxdataF_ext = (int32_t **)malloc16_clear(8*sizeof(int32_t *));
- ue->pdcch_vars[th_id][gNB_id]->dl_ch_estimates_ext = (int32_t **)malloc16_clear(8*sizeof(int32_t *));
+ ue->pdcch_vars[th_id][gNB_id]->llr = (int16_t *)malloc16_clear( 2*4*100*12*sizeof(uint16_t) );
+ ue->pdcch_vars[th_id][gNB_id]->llr16 = (int16_t *)malloc16_clear( 2*4*100*12*sizeof(uint16_t) );
+ ue->pdcch_vars[th_id][gNB_id]->wbar = (int16_t *)malloc16_clear( 2*4*100*12*sizeof(uint16_t) );
+ ue->pdcch_vars[th_id][gNB_id]->e_rx = (int16_t *)malloc16_clear( 4*2*100*12 );
+ ue->pdcch_vars[th_id][gNB_id]->rxdataF_comp = (int32_t **)malloc16_clear( 4*fp->nb_antennas_rx*sizeof(int32_t *) );
+ ue->pdcch_vars[th_id][gNB_id]->dl_ch_rho_ext = (int32_t **)malloc16_clear( 4*fp->nb_antennas_rx*sizeof(int32_t *) );
+ ue->pdcch_vars[th_id][gNB_id]->rho = (int32_t **)malloc16( fp->nb_antennas_rx*sizeof(int32_t *) );
+ ue->pdcch_vars[th_id][gNB_id]->rxdataF_ext = (int32_t **)malloc16_clear( 4*fp->nb_antennas_rx*sizeof(int32_t *) );
+ ue->pdcch_vars[th_id][gNB_id]->dl_ch_estimates_ext = (int32_t **)malloc16_clear( 4*fp->nb_antennas_rx*sizeof(int32_t *) );
// Channel estimates
- ue->pdcch_vars[th_id][gNB_id]->dl_ch_estimates = (int32_t **)malloc16_clear(8*sizeof(int32_t *));
- ue->pdcch_vars[th_id][gNB_id]->dl_ch_estimates_time = (int32_t **)malloc16_clear(8*sizeof(int32_t *));
+ ue->pdcch_vars[th_id][gNB_id]->dl_ch_estimates = (int32_t **)malloc16_clear(4*fp->nb_antennas_rx*sizeof(int32_t *));
+ ue->pdcch_vars[th_id][gNB_id]->dl_ch_estimates_time = (int32_t **)malloc16_clear(4*fp->nb_antennas_rx*sizeof(int32_t *));
for (i=0; inb_antennas_rx; i++) {
ue->pdcch_vars[th_id][gNB_id]->rho[i] = (int32_t *)malloc16_clear( sizeof(int32_t)*(100*12*4));
for (j=0; j<4; j++) {
- int idx = (j<<1) + i;
- ue->pdcch_vars[th_id][gNB_id]->dl_ch_estimates[idx] = (int32_t *)malloc16_clear(sizeof(int32_t)*fp->symbols_per_slot*(fp->ofdm_symbol_size+LTE_CE_FILTER_LENGTH));
- ue->pdcch_vars[th_id][gNB_id]->dl_ch_estimates_time[idx] = (int32_t *)malloc16_clear(sizeof(int32_t)*fp->ofdm_symbol_size*2);
+ int idx = (j*fp->nb_antennas_rx)+i;
+ ue->pdcch_vars[th_id][gNB_id]->dl_ch_estimates[idx] = (int32_t *)malloc16_clear( sizeof(int32_t)*fp->symbols_per_slot*(fp->ofdm_symbol_size+LTE_CE_FILTER_LENGTH) );
+ ue->pdcch_vars[th_id][gNB_id]->dl_ch_estimates_time[idx] = (int32_t *)malloc16_clear( sizeof(int32_t)*fp->ofdm_symbol_size*2 );
// size_t num = 7*2*fp->N_RB_DL*12;
size_t num = 4*273*12; // 4 symbols, 100 PRBs, 12 REs per PRB
ue->pdcch_vars[th_id][gNB_id]->rxdataF_comp[idx] = (int32_t *)malloc16_clear(sizeof(int32_t) * num);
@@ -414,24 +409,24 @@ int init_nr_ue_signal(PHY_VARS_NR_UE *ue,
}
// PBCH
- pbch_vars[gNB_id]->rxdataF_ext = (int32_t **)malloc16(fp->nb_antennas_rx*sizeof(int32_t *));
- pbch_vars[gNB_id]->rxdataF_comp = (int32_t **)malloc16_clear(8*sizeof(int32_t *));
- pbch_vars[gNB_id]->dl_ch_estimates = (int32_t **)malloc16_clear(8*sizeof(int32_t *));
- pbch_vars[gNB_id]->dl_ch_estimates_ext = (int32_t **)malloc16_clear(8*sizeof(int32_t *));
- pbch_vars[gNB_id]->dl_ch_estimates_time = (int32_t **)malloc16_clear(8*sizeof(int32_t *));
- pbch_vars[gNB_id]->llr = (int16_t *)malloc16_clear(1920); //
- prach_vars[gNB_id]->prachF = (int16_t *)malloc16_clear(sizeof(int)*(7*2*sizeof(int)*(fp->ofdm_symbol_size*12)));
- prach_vars[gNB_id]->prach = (int16_t *)malloc16_clear(sizeof(int)*(7*2*sizeof(int)*(fp->ofdm_symbol_size*12)));
+ pbch_vars[gNB_id]->rxdataF_ext = (int32_t **)malloc16( fp->nb_antennas_rx*sizeof(int32_t *) );
+ pbch_vars[gNB_id]->rxdataF_comp = (int32_t **)malloc16_clear( 4*fp->nb_antennas_rx*sizeof(int32_t *) );
+ pbch_vars[gNB_id]->dl_ch_estimates = (int32_t **)malloc16_clear( 4*fp->nb_antennas_rx*sizeof(int32_t *) );
+ pbch_vars[gNB_id]->dl_ch_estimates_ext = (int32_t **)malloc16_clear( 4*fp->nb_antennas_rx*sizeof(int32_t *) );
+ pbch_vars[gNB_id]->dl_ch_estimates_time = (int32_t **)malloc16_clear( 4*fp->nb_antennas_rx*sizeof(int32_t *) );
+ pbch_vars[gNB_id]->llr = (int16_t *)malloc16_clear( 1920 ); //
+ prach_vars[gNB_id]->prachF = (int16_t *)malloc16_clear( sizeof(int)*(7*2*sizeof(int)*(fp->ofdm_symbol_size*12)) );
+ prach_vars[gNB_id]->prach = (int16_t *)malloc16_clear( sizeof(int)*(7*2*sizeof(int)*(fp->ofdm_symbol_size*12)) );
for (i=0; inb_antennas_rx; i++) {
pbch_vars[gNB_id]->rxdataF_ext[i] = (int32_t *)malloc16_clear( sizeof(int32_t)*20*12*4 );
for (j=0; j<4; j++) {//fp->nb_antennas_tx;j++) {
- int idx = (j<<1)+i;
- pbch_vars[gNB_id]->rxdataF_comp[idx] = (int32_t *)malloc16_clear(sizeof(int32_t)*20*12*4);
- pbch_vars[gNB_id]->dl_ch_estimates[idx] = (int32_t *)malloc16_clear(sizeof(int32_t)*7*2*sizeof(int)*(fp->ofdm_symbol_size));
- pbch_vars[gNB_id]->dl_ch_estimates_time[idx] = (int32_t *)malloc16_clear(sizeof(int32_t)*7*2*sizeof(int)*(fp->ofdm_symbol_size));
- pbch_vars[gNB_id]->dl_ch_estimates_ext[idx] = (int32_t *)malloc16_clear(sizeof(int32_t)*20*12*4);
+ int idx = (j*fp->nb_antennas_rx)+i;
+ pbch_vars[gNB_id]->rxdataF_comp[idx] = (int32_t *)malloc16_clear( sizeof(int32_t)*20*12*4 );
+ pbch_vars[gNB_id]->dl_ch_estimates[idx] = (int32_t *)malloc16_clear( sizeof(int32_t)*7*2*sizeof(int)*(fp->ofdm_symbol_size) );
+ pbch_vars[gNB_id]->dl_ch_estimates_time[idx]= (int32_t *)malloc16_clear( sizeof(int32_t)*7*2*sizeof(int)*(fp->ofdm_symbol_size) );
+ pbch_vars[gNB_id]->dl_ch_estimates_ext[idx] = (int32_t *)malloc16_clear( sizeof(int32_t)*20*12*4 );
}
}
}
@@ -507,50 +502,36 @@ void init_N_TA_offset(PHY_VARS_NR_UE *ue){
if (fp->frame_type == FDD) {
ue->N_TA_offset = 0;
} else {
- int N_RB = fp->N_RB_DL;
int N_TA_offset = fp->ul_CarrierFreq < 6e9 ? 400 : 431; // reference samples for 25600Tc @ 30.72 Ms/s for FR1, same @ 61.44 Ms/s for FR2
- double factor = 1;
+
+ double factor = 1.0;
switch (fp->numerology_index) {
case 0: //15 kHz scs
AssertFatal(N_TA_offset == 400, "scs_common 15kHz only for FR1\n");
- if (N_RB <= 25) factor = .25; // 7.68 Ms/s
- else if (N_RB <=50) factor = .5; // 15.36 Ms/s
- else if (N_RB <=75) factor = 1.0; // 30.72 Ms/s
- else if (N_RB <=100) factor = 1.0; // 30.72 Ms/s
- else AssertFatal(1==0, "Too many PRBS for mu=0\n");
+ factor = fp->samples_per_subframe / 30720.0;
break;
case 1: //30 kHz sc
AssertFatal(N_TA_offset == 400, "scs_common 30kHz only for FR1\n");
- if (N_RB <= 106) factor = 2.0; // 61.44 Ms/s
- else if (N_RB <= 275) factor = 4.0; // 122.88 Ms/s
+ factor = fp->samples_per_subframe / 30720.0;
break;
case 2: //60 kHz scs
AssertFatal(1==0, "scs_common should not be 60 kHz\n");
break;
case 3: //120 kHz scs
AssertFatal(N_TA_offset == 431, "scs_common 120kHz only for FR2\n");
+ factor = fp->samples_per_subframe / 61440.0;
break;
case 4: //240 kHz scs
- AssertFatal(1==0, "scs_common should not be 60 kHz\n");
- if (N_RB <= 32) factor = 1.0; // 61.44 Ms/s
- else if (N_RB <= 66) factor = 2.0; // 122.88 Ms/s
- else AssertFatal(1==0, "N_RB %d is too big for curretn FR2 implementation\n", N_RB);
+ AssertFatal(N_TA_offset == 431, "scs_common 240kHz only for FR2\n");
+ factor = fp->samples_per_subframe / 61440.0;
break;
-
- if (N_RB == 100)
- ue->N_TA_offset = 624;
- else if (N_RB == 50)
- ue->N_TA_offset = 624/2;
- else if (N_RB == 25)
- ue->N_TA_offset = 624/4;
+ default:
+ AssertFatal(1==0, "Invalid scs_common!\n");
}
- if (fp->threequarter_fs == 1)
- factor = factor*.75;
-
ue->N_TA_offset = (int)(N_TA_offset * factor);
- LOG_I(PHY,"UE %d Setting N_TA_offset to %d samples (factor %f, UL Freq %lu, N_RB %d)\n", ue->Mod_id, ue->N_TA_offset, factor, fp->ul_CarrierFreq, N_RB);
+ LOG_I(PHY,"UE %d Setting N_TA_offset to %d samples (factor %f, UL Freq %lu, N_RB %d, mu %d)\n", ue->Mod_id, ue->N_TA_offset, factor, fp->ul_CarrierFreq, fp->N_RB_DL, fp->numerology_index);
}
}
diff --git a/openair1/PHY/INIT/nr_parms.c b/openair1/PHY/INIT/nr_parms.c
index bf89cb3be5..34938501e3 100644
--- a/openair1/PHY/INIT/nr_parms.c
+++ b/openair1/PHY/INIT/nr_parms.c
@@ -69,9 +69,8 @@ int nr_get_ssb_start_symbol(NR_DL_FRAME_PARMS *fp,uint8_t i_ssb) {
return symbol;
}
-void set_scs_parameters (NR_DL_FRAME_PARMS *fp, int mu, uint16_t bw)
+void set_scs_parameters (NR_DL_FRAME_PARMS *fp, int mu, int N_RB_DL)
{
-
switch(mu) {
case NR_MU_0: //15kHz scs
@@ -93,108 +92,17 @@ void set_scs_parameters (NR_DL_FRAME_PARMS *fp, int mu, uint16_t bw)
else
AssertFatal(1==0,"NR Operating Band n%d not available for SS block SCS with mu=%d\n", fp->nr_band, mu);
}
-
- switch(bw){
- case 5:
- case 15:
- case 20:
- case 25:
- case 30:
- case 40: //40 MHz
- if (fp->threequarter_fs) {
- fp->ofdm_symbol_size = 1536;
- fp->first_carrier_offset = 900; //1536 - ( (106*12) / 2 )
- fp->nb_prefix_samples0 = 132;
- fp->nb_prefix_samples = 108;
- }
- else {
- fp->ofdm_symbol_size = 2048;
- fp->first_carrier_offset = 1412; //2048 - ( (106*12) / 2 )
- fp->nb_prefix_samples0 = 176;
- fp->nb_prefix_samples = 144;
- }
- break;
-
- case 50:
- case 60:
- case 70:
-
- case 80: //80 MHz
- if (fp->threequarter_fs) {
- fp->ofdm_symbol_size = 3072;
- fp->first_carrier_offset = 1770; //3072 - ( (217*12) / 2 )
- fp->nb_prefix_samples0 = 264;
- fp->nb_prefix_samples = 216;
- }
- else {
- fp->ofdm_symbol_size = 4096;
- fp->first_carrier_offset = 2794; //4096 - ( (217*12) / 2 )
- fp->nb_prefix_samples0 = 352;
- fp->nb_prefix_samples = 288;
- }
- break;
-
- case 90:
- AssertFatal(fp->threequarter_fs==0,"3/4 sampling impossible for %d MHz band and MU %d\n",bw,mu);
- fp->ofdm_symbol_size = 4096;
- fp->first_carrier_offset = 2626; //4096 - ( (245*12) / 2 )
- fp->nb_prefix_samples0 = 352;
- fp->nb_prefix_samples = 288;
- break;
- case 100:
- AssertFatal(fp->threequarter_fs==0,"3/4 sampling impossible for %d MHz band and MU %d\n",bw,mu);
- fp->ofdm_symbol_size = 4096;
- fp->first_carrier_offset = 2458; //4096 - ( (273*12) / 2 )
- fp->nb_prefix_samples0 = 352;
- fp->nb_prefix_samples = 288;
- break;
- default:
- AssertFatal(1==0,"%d MHz band undefined for mu %d, frame parms = %p\n", bw, mu, fp);
- }
break;
case NR_MU_2: //60kHz scs
fp->subcarrier_spacing = nr_subcarrier_spacing[NR_MU_2];
fp->slots_per_subframe = nr_slots_per_subframe[NR_MU_2];
-
- switch(bw){ //FR1 bands only
- case 10:
- case 15:
- case 20:
- case 25:
- case 30:
- case 40:
- case 50:
- case 60:
- case 70:
- case 80:
- case 90:
- case 100:
- default:
- AssertFatal(1==0,"%d MHz band undefined for mu %d, frame parms = %p\n", bw, mu, fp);
- }
break;
case NR_MU_3:
fp->subcarrier_spacing = nr_subcarrier_spacing[NR_MU_3];
fp->slots_per_subframe = nr_slots_per_subframe[NR_MU_3];
fp->ssb_type = nr_ssb_type_D;
- switch(bw){
- case 100:
- fp->ofdm_symbol_size = 1024;
- fp->first_carrier_offset = 628; //1024 - ( (66*12) / 2 )
- fp->nb_prefix_samples0 = 136;
- fp->nb_prefix_samples = 72;
- break;
- case 50:
- fp->ofdm_symbol_size = 512;
- fp->first_carrier_offset = 320; //1024 - ( (66*12) / 2 )
- fp->nb_prefix_samples0 = 68;
- fp->nb_prefix_samples = 36;
- break;
- default:
- AssertFatal(1==0,"%d MHz band undefined for mu %d, frame parms = %p\n", bw, mu, fp);
- }
break;
case NR_MU_4:
@@ -203,9 +111,21 @@ void set_scs_parameters (NR_DL_FRAME_PARMS *fp, int mu, uint16_t bw)
fp->ssb_type = nr_ssb_type_E;
break;
- default:
- AssertFatal(1==0,"Invalid numerology index %d", mu);
+ default:
+ AssertFatal(1==0,"Invalid numerology index %d", mu);
}
+
+ if(fp->threequarter_fs)
+ fp->ofdm_symbol_size = 3 * 128;
+ else
+ fp->ofdm_symbol_size = 4 * 128;
+
+ while(fp->ofdm_symbol_size < N_RB_DL * 12)
+ fp->ofdm_symbol_size <<= 1;
+
+ fp->first_carrier_offset = fp->ofdm_symbol_size - (N_RB_DL * 12 / 2);
+ fp->nb_prefix_samples = fp->ofdm_symbol_size / 128 * 9;
+ fp->nb_prefix_samples0 = fp->ofdm_symbol_size / 128 * (9 + (1 << mu));
}
uint32_t get_samples_per_slot(int slot, NR_DL_FRAME_PARMS* fp)
@@ -274,13 +194,13 @@ int nr_init_frame_parms(nfapi_nr_config_request_scf_t* cfg,
fp->half_frame_bit = 0; // half frame bit initialized to 0 here
fp->numerology_index = mu;
- set_scs_parameters(fp, mu, cfg->carrier_config.dl_bandwidth.value);
+ set_scs_parameters(fp, mu, fp->N_RB_DL);
fp->slots_per_frame = 10* fp->slots_per_subframe;
- fp->nb_antenna_ports_gNB = cfg->carrier_config.num_tx_ant.value;// It corresponds to pdsch_AntennaPorts
+ fp->nb_antenna_ports_gNB = 1; // It corresponds to the number of common antenna ports
fp->nb_antennas_rx = cfg->carrier_config.num_rx_ant.value; // It denotes the number of rx antennas at gNB
- fp->nb_antennas_tx = 1; // It corresponds to the number of UE Tx antennas
+ fp->nb_antennas_tx = cfg->carrier_config.num_tx_ant.value; // It corresponds to pdsch_AntennaPorts
fp->symbols_per_slot = ((Ncp == NORMAL)? 14 : 12); // to redefine for different slot formats
fp->samples_per_subframe_wCP = fp->ofdm_symbol_size * fp->symbols_per_slot * fp->slots_per_subframe;
@@ -328,6 +248,11 @@ int nr_init_frame_parms_ue(NR_DL_FRAME_PARMS *fp,
uint8_t Nid_cell = 0;
int Ncp = NORMAL;
+ if(fp->nb_antennas_rx == 0)
+ fp->nb_antennas_rx = 1;
+ if(fp->nb_antennas_tx == 0)
+ fp->nb_antennas_tx = 1;
+
// default values until overwritten by RRCConnectionReconfiguration
fp->nb_antenna_ports_gNB = nb_ant_ports_gNB;
fp->tdd_config = tdd_cfg;
@@ -367,7 +292,7 @@ int nr_init_frame_parms_ue(NR_DL_FRAME_PARMS *fp,
fp->Ncp = Ncp;
- set_scs_parameters(fp,fp->numerology_index,config->carrier_config.dl_bandwidth);
+ set_scs_parameters(fp, fp->numerology_index, fp->N_RB_DL);
fp->slots_per_frame = 10* fp->slots_per_subframe;
fp->symbols_per_slot = ((Ncp == NORMAL)? 14 : 12); // to redefine for different slot formats
diff --git a/openair1/PHY/MODULATION/beamforming.c b/openair1/PHY/MODULATION/beamforming.c
index b1f419b172..4405c46abf 100644
--- a/openair1/PHY/MODULATION/beamforming.c
+++ b/openair1/PHY/MODULATION/beamforming.c
@@ -145,7 +145,8 @@ int nr_beam_precoding(int32_t **txdataF,
int slot,
int symbol,
int aa,
- int nb_antenna_ports)
+ int nb_antenna_ports,
+ int offset)
{
@@ -155,14 +156,14 @@ int nr_beam_precoding(int32_t **txdataF,
memset(&txdataF_BF[aa][symbol*frame_parms->ofdm_symbol_size],0,sizeof(int32_t)*(frame_parms->ofdm_symbol_size));
for (p=0; pL_ssb >> (63-p)) & 0x01) {
- multadd_cpx_vector((int16_t*)&txdataF[p][symbol*frame_parms->ofdm_symbol_size],
+ //if ((frame_parms->L_ssb >> (63-p)) & 0x01) {
+ multadd_cpx_vector((int16_t*)&txdataF[p][(symbol*frame_parms->ofdm_symbol_size)+offset],
(int16_t*)beam_weights[p][aa],
(int16_t*)&txdataF_BF[aa][symbol*frame_parms->ofdm_symbol_size],
0,
frame_parms->ofdm_symbol_size,
15);
- }
+ //}
}
return 0;
}
diff --git a/openair1/PHY/MODULATION/modulation_UE.h b/openair1/PHY/MODULATION/modulation_UE.h
index 72a1334fe9..20fdaa7ad8 100644
--- a/openair1/PHY/MODULATION/modulation_UE.h
+++ b/openair1/PHY/MODULATION/modulation_UE.h
@@ -51,16 +51,13 @@ int slot_fep(PHY_VARS_UE *phy_vars_ue,
int nr_slot_fep(PHY_VARS_NR_UE *phy_vars_ue,
UE_nr_rxtx_proc_t *proc,
unsigned char l,
- unsigned char Ns,
- int sample_offset,
- int no_prefix);
+ unsigned char Ns);
int nr_slot_fep_init_sync(PHY_VARS_NR_UE *ue,
UE_nr_rxtx_proc_t *proc,
unsigned char symbol,
unsigned char Ns,
- int sample_offset,
- int no_prefix);
+ int sample_offset);
int slot_fep_mbsfn(PHY_VARS_UE *phy_vars_ue,
unsigned char l,
diff --git a/openair1/PHY/MODULATION/nr_modulation.c b/openair1/PHY/MODULATION/nr_modulation.c
index f12dcfc01b..e32f6bf575 100644
--- a/openair1/PHY/MODULATION/nr_modulation.c
+++ b/openair1/PHY/MODULATION/nr_modulation.c
@@ -22,6 +22,101 @@
#include "nr_modulation.h"
#include "PHY/NR_REFSIG/nr_mod_table.h"
+//Table 6.3.1.5-1 Precoding Matrix W 1 layer 2 antenna ports 'n' = -1 and 'o' = -j
+char nr_W_1l_2p[6][2][1] = {
+ {{'1'}, {'0'}},//pmi 0
+ {{'0'}, {'1'}},
+ {{'1'}, {'1'}},
+ {{'1'}, {'n'}},
+ {{'1'}, {'j'}},
+ {{'1'}, {'o'}}//pmi 5
+};
+
+//Table 6.3.1.5-3 Precoding Matrix W 1 layer 4 antenna ports 'n' = -1 and 'o' = -j
+char nr_W_1l_4p[28][4][1] = {
+ {{'1'}, {'0'}, {'0'}, {'0'}},//pmi 0
+ {{'0'}, {'1'}, {'0'}, {'0'}},
+ {{'0'}, {'0'}, {'1'}, {'0'}},
+ {{'0'}, {'0'}, {'0'}, {'1'}},
+ {{'1'}, {'0'}, {'1'}, {'0'}},
+ {{'1'}, {'0'}, {'n'}, {'0'}},
+ {{'1'}, {'0'}, {'j'}, {'0'}},
+ {{'1'}, {'0'}, {'o'}, {'0'}},//pmi 7
+ {{'0'}, {'1'}, {'0'}, {'1'}},//pmi 8
+ {{'0'}, {'1'}, {'0'}, {'n'}},
+ {{'0'}, {'1'}, {'0'}, {'j'}},
+ {{'0'}, {'1'}, {'0'}, {'o'}},
+ {{'1'}, {'1'}, {'1'}, {'1'}},
+ {{'1'}, {'1'}, {'j'}, {'j'}},
+ {{'1'}, {'1'}, {'n'}, {'n'}},
+ {{'1'}, {'1'}, {'o'}, {'o'}},
+ {{'1'}, {'j'}, {'1'}, {'j'}},//pmi 16
+ {{'1'}, {'j'}, {'j'}, {'n'}},
+ {{'1'}, {'j'}, {'n'}, {'o'}},
+ {{'1'}, {'j'}, {'o'}, {'1'}},
+ {{'1'}, {'n'}, {'1'}, {'n'}},
+ {{'1'}, {'n'}, {'j'}, {'o'}},
+ {{'1'}, {'n'}, {'n'}, {'1'}},
+ {{'1'}, {'n'}, {'o'}, {'j'}},//pmi 23
+ {{'1'}, {'o'}, {'1'}, {'o'}},//pmi 24
+ {{'1'}, {'o'}, {'j'}, {'1'}},
+ {{'1'}, {'o'}, {'n'}, {'j'}},
+ {{'1'}, {'o'}, {'o'}, {'n'}}//pmi 27
+};
+
+//Table 6.3.1.5-4 Precoding Matrix W 2 antenna ports layers 2 'n' = -1 and 'o' = -j
+char nr_W_2l_2p[3][2][2] = {
+ {{'1', '0'}, {'0', '1'}},//pmi 0
+ {{'1', '1'}, {'1', 'n'}},
+ {{'1', '1'}, {'j', 'o'}} //pmi 2
+};
+
+//Table 6.3.1.5-5 Precoding Matrix W 2 layers 4 antenna ports 'n' = -1 and 'o' = -j
+char nr_W_2l_4p[22][4][2] = {
+ {{'1', '0'}, {'0', '1'}, {'0', '0'}, {'0', '0'}},//pmi 0
+ {{'1', '0'}, {'0', '0'}, {'0', '1'}, {'0', '0'}},
+ {{'1', '0'}, {'0', '0'}, {'0', '0'}, {'0', '1'}},
+ {{'0', '0'}, {'1', '0'}, {'0', '1'}, {'0', '0'}},//pmi 3
+ {{'0', '0'}, {'1', '0'}, {'0', '0'}, {'0', '1'}},//pmi 4
+ {{'0', '0'}, {'0', '0'}, {'1', '0'}, {'0', '1'}},
+ {{'1', '0'}, {'0', '1'}, {'1', '0'}, {'0', 'o'}},
+ {{'1', '0'}, {'0', '1'}, {'1', '0'}, {'0', 'j'}},
+ {{'1', '0'}, {'0', '1'}, {'o', '0'}, {'0', '1'}},//pmi 8
+ {{'1', '0'}, {'0', '1'}, {'o', '0'}, {'0', 'n'}},
+ {{'1', '0'}, {'0', '1'}, {'n', '0'}, {'0', 'o'}},
+ {{'1', '0'}, {'0', '1'}, {'n', '0'}, {'0', 'j'}},//pmi 11
+ {{'1', '0'}, {'0', '1'}, {'j', '0'}, {'0', '1'}},//pmi 12
+ {{'1', '0'}, {'0', '1'}, {'j', '0'}, {'0', 'n'}},
+ {{'1', '1'}, {'1', '1'}, {'1', 'n'}, {'1', 'n'}},
+ {{'1', '1'}, {'1', '1'}, {'j', 'o'}, {'j', 'o'}},//pmi 15
+ {{'1', '1'}, {'j', 'j'}, {'1', 'n'}, {'j', 'o'}},//pmi 16
+ {{'1', '1'}, {'j', 'j'}, {'j', 'o'}, {'n', '1'}},
+ {{'1', '1'}, {'n', 'n'}, {'1', 'n'}, {'n', '1'}},
+ {{'1', '1'}, {'n', 'n'}, {'j', 'o'}, {'o', 'j'}},//pmi 19
+ {{'1', '1'}, {'o', 'o'}, {'1', 'n'}, {'o', 'j'}},
+ {{'1', '1'}, {'o', 'o'}, {'j', 'o'}, {'1', 'n'}}//pmi 21
+};
+
+//Table 6.3.1.5-6 Precoding Matrix W 3 layers 4 antenna ports 'n' = -1 and 'o' = -j
+char nr_W_3l_4p[7][4][3] = {
+ {{'1', '0', '0'}, {'0', '1', '0'}, {'0', '0', '1'},{'0', '0', '0'}},//pmi 0
+ {{'1', '0', '0'}, {'0', '1', '0'}, {'1', '0', '0'},{'0', '0', '1'}},
+ {{'1', '0', '0'}, {'0', '1', '0'}, {'n', '0', '0'},{'0', '0', '1'}},
+ {{'1', '1', '1'}, {'1', 'n', '1'}, {'1', '1', 'n'},{'1', 'n', 'n'}},//pmi 3
+ {{'1', '1', '1'}, {'1', 'n', '1'}, {'j', 'j', 'o'},{'j', 'o', 'o'}},//pmi 4
+ {{'1', '1', '1'}, {'n', '1', 'n'}, {'1', '1', 'n'},{'n', '1', '1'}},
+ {{'1', '1', '1'}, {'n', '1', 'n'}, {'j', 'j', 'o'},{'o', 'j', 'j'}}
+};
+
+//Table 6.3.1.5-7 Precoding Matrix W 4 layers 4 antenna ports 'n' = -1 and 'o' = -j
+char nr_W_4l_4p[5][4][4] = {
+ {{'1', '0', '0', '0'}, {'0', '1', '0', '0'}, {'0', '0', '1', '0'}, {'0', '0', '0', '1'}},//pmi 0
+ {{'1', '1', '0', '0'}, {'0', '0', '1', '1'}, {'1', 'n', '0', '0'}, {'0', '0', '1', 'n'}},
+ {{'1', '1', '0', '0'}, {'0', '0', '1', '1'}, {'j', 'o', '0', '0'}, {'0', '0', 'j', 'o'}},
+ {{'1', '1', '1', '1'}, {'1', 'n', '1', 'n'}, {'1', '1', 'n', 'n'}, {'1', 'n', 'n', '1'}},//pmi 3
+ {{'1', '1', '1', '1'}, {'1', 'n', '1', 'n'}, {'j', 'j', 'o', 'o'}, {'j', 'o', 'o', 'j'}}//pmi 4
+};
+
void nr_modulation(uint32_t *in,
uint32_t length,
uint16_t mod_order,
@@ -37,7 +132,7 @@ void nr_modulation(uint32_t *in,
uint32_t i,j;
uint32_t bit_cnt;
uint64_t x,x1,x2;
-
+
#if defined(__SSE2__)
__m128i *nr_mod_table128;
__m128i *out128;
@@ -56,7 +151,7 @@ void nr_modulation(uint32_t *in,
// the bits that are left out
i = i*8/2;
nr_mod_table32 = (int32_t*) nr_qpsk_mod_table;
- while (i>((i*2)&0x7)) & mask);
out32[i] = nr_mod_table32[idx];
i++;
@@ -78,7 +173,7 @@ void nr_modulation(uint32_t *in,
out64[i] = nr_16qam_byte_mod_table[in_bytes[i]];
// the bits that are left out
i = i*8/4;
- while (i>((i*4)&0x7)) & mask);
out32[i] = nr_16qam_mod_table[idx];
i++;
@@ -88,7 +183,7 @@ void nr_modulation(uint32_t *in,
case 6:
j = 0;
for (i=0; i>12)&4095;
@@ -140,7 +235,7 @@ void nr_modulation(uint32_t *in,
bit_cnt += 24;
}
return;
-
+
case 8:
nr_mod_table32 = (int32_t*) nr_256qam_mod_table;
for (i=0; i>1; i++)
@@ -186,8 +281,8 @@ void nr_layer_mapping(int16_t **mod_symbs,
for (int l=2; l<5; l++) {
tx_layers[l][i<<1] = mod_symbs[1][(3*i+l)<<1];
tx_layers[l][(i<<1)+1] = mod_symbs[1][((3*i+l)<<1)+1];
- }
- break;
+ }
+ break;
case 6:
for (int q=0; q<2; q++)
@@ -196,7 +291,7 @@ void nr_layer_mapping(int16_t **mod_symbs,
tx_layers[l][i<<1] = mod_symbs[q][(3*i+l)<<1];
tx_layers[l][(i<<1)+1] = mod_symbs[q][((3*i+l)<<1)+1];
}
- break;
+ break;
case 7:
for (int i=0; id_mod;
- for (int i=0; i>15;
tx_layers[0][(i<<1)+1] = (mod_symbs[(i<<1)+1]*AMP)>>15;
}
- break;
+ break;
case 2:
case 3:
case 4:
mod_symbs = (int16_t *)ulsch_ue[0]->d_mod;
- for (int i=0; i>15;
tx_layers[l][(i<<1)+1] = (mod_symbs[((n_layers*i+l)<<1)+1]*AMP)>>15;
}
}
- break;
+ break;
case 5:
mod_symbs = (int16_t *)ulsch_ue[0]->d_mod;
@@ -271,11 +366,10 @@ void nr_ue_layer_mapping(NR_UE_ULSCH_t **ulsch_ue,
tx_layers[l][i<<1] = (mod_symbs[(3*i+l)<<1]*AMP)>>15;
tx_layers[l][(i<<1)+1] = (mod_symbs[((3*i+l)<<1)+1]*AMP)>>15;
}
- break;
+ break;
case 6:
- for (int q=0; q<2; q++){
-
+ for (int q=0; q<2; q++) {
mod_symbs = (int16_t *)ulsch_ue[q]->d_mod;
for (int i=0; i>15;
}
}
- break;
+ break;
case 7:
mod_symbs = (int16_t *)ulsch_ue[1]->d_mod;
@@ -302,11 +396,10 @@ void nr_ue_layer_mapping(NR_UE_ULSCH_t **ulsch_ue,
tx_layers[l][i<<1] = (mod_symbs[((i<<2)+l)<<1]*AMP)>>15;
tx_layers[l][(i<<1)+1] = (mod_symbs[(((i<<2)+l)<<1)+1]*AMP)>>15;
}
- break;
+ break;
case 8:
- for (int q=0; q<2; q++){
-
+ for (int q=0; q<2; q++) {
mod_symbs = (int16_t *)ulsch_ue[q]->d_mod;
for (int i=0; i>2; i++)
@@ -315,10 +408,10 @@ void nr_ue_layer_mapping(NR_UE_ULSCH_t **ulsch_ue,
tx_layers[l][(i<<1)+1] = (mod_symbs[(((i<<2)+l)<<1)+1]*AMP)>>15;
}
}
- break;
+ break;
- default:
- AssertFatal(0, "Invalid number of layers %d\n", n_layers);
+ default:
+ AssertFatal(0, "Invalid number of layers %d\n", n_layers);
}
}
@@ -651,3 +744,43 @@ void init_symbol_rotation(NR_DL_FRAME_PARMS *fp) {
}
}
}
+
+int nr_layer_precoder(int16_t **datatx_F_precoding, char *prec_matrix, uint8_t n_layers, int32_t re_offset)
+{
+ int32_t precodatatx_F = 0;
+
+ for (int al = 0; al>15);
+ ((int16_t *)precodatatx_F)[1] = (int16_t)((((int16_t *)precodatatx_F)[1]*ONE_OVER_SQRT2_Q15)>>15);*/
+}
diff --git a/openair1/PHY/MODULATION/nr_modulation.h b/openair1/PHY/MODULATION/nr_modulation.h
index c6c9718f7e..547d20952f 100644
--- a/openair1/PHY/MODULATION/nr_modulation.h
+++ b/openair1/PHY/MODULATION/nr_modulation.h
@@ -28,7 +28,13 @@
#include "PHY/NR_UE_TRANSPORT/nr_transport_ue.h"
#define DMRS_MOD_ORDER 2
-
+/*Precoding matices: W[pmi][antenna_port][layer]*/
+extern char nr_W_1l_2p[6][2][1];
+extern char nr_W_2l_2p[3][2][2];
+extern char nr_W_1l_4p[28][4][1];
+extern char nr_W_2l_4p[22][4][2];
+extern char nr_W_3l_4p[7][4][3];
+extern char nr_W_4l_4p[5][4][4];
/*! \brief Perform NR modulation. TS 38.211 V15.4.0 subclause 5.1
@param[in] in, Pointer to input bits
@param[in] length, size of input bits
@@ -74,7 +80,6 @@ void nr_ue_layer_mapping(NR_UE_ULSCH_t **ulsch_ue,
\param symbol symbol within slot (0..12/14)
\param Ns Slot number (0..19)
\param sample_offset offset within rxdata (points to beginning of subframe)
-\param no_prefix if 1 prefix is removed by HW
*/
int nr_slot_fep_ul(NR_DL_FRAME_PARMS *frame_parms,
@@ -82,8 +87,7 @@ int nr_slot_fep_ul(NR_DL_FRAME_PARMS *frame_parms,
int32_t *rxdataF,
unsigned char symbol,
unsigned char Ns,
- int sample_offset,
- int no_prefix);
+ int sample_offset);
/*!
\brief This function implements the dft transform precoding in PUSCH
@@ -100,7 +104,8 @@ int nr_beam_precoding(int32_t **txdataF,
int slot,
int symbol,
int aa,
- int nb_antenna_ports
+ int nb_antenna_ports,
+ int offset
);
void apply_nr_rotation(NR_DL_FRAME_PARMS *fp,
@@ -118,4 +123,14 @@ void apply_nr_rotation_ul(NR_DL_FRAME_PARMS *frame_parms,
int first_symbol,
int nsymb,
int length);
+
+/*! \brief Perform NR precoding. TS 38.211 V15.4.0 subclause 6.3.1.5
+ @param[in] datatx_F_precoding, Pointer to n_layers*re data array
+ @param[in] prec_matrix, Pointer to precoding matrix
+ @param[in] n_layers, number of DLSCH layers
+*/
+int nr_layer_precoder(int16_t **datatx_F_precoding,
+ char *prec_matrix,
+ uint8_t n_layers,
+ int32_t re_offset);
#endif
diff --git a/openair1/PHY/MODULATION/slot_fep_nr.c b/openair1/PHY/MODULATION/slot_fep_nr.c
index 7b5ddb230a..0be635ba0b 100644
--- a/openair1/PHY/MODULATION/slot_fep_nr.c
+++ b/openair1/PHY/MODULATION/slot_fep_nr.c
@@ -29,362 +29,227 @@
//#define DEBUG_FEP
-#define SOFFSET 0
-
/*#ifdef LOG_I
#undef LOG_I
#define LOG_I(A,B...) printf(A)
#endif*/
-int nr_slot_fep(PHY_VARS_NR_UE *ue,
- UE_nr_rxtx_proc_t *proc,
- unsigned char symbol,
- unsigned char Ns,
- int sample_offset,
- int no_prefix)
+dft_size_idx_t get_dft_size_idx(uint16_t ofdm_symbol_size)
{
- NR_DL_FRAME_PARMS *frame_parms = &ue->frame_parms;
- NR_UE_COMMON *common_vars = &ue->common_vars;
- unsigned char aa;
- unsigned int nb_prefix_samples;
- unsigned int nb_prefix_samples0;
- unsigned int abs_symbol;
- if (ue->is_synchronized) {
- nb_prefix_samples = (no_prefix ? 0 : frame_parms->nb_prefix_samples);
- nb_prefix_samples0 = (no_prefix ? 0 : frame_parms->nb_prefix_samples0);
- }
- else {
- nb_prefix_samples = (no_prefix ? 0 : frame_parms->nb_prefix_samples);
- nb_prefix_samples0 = (no_prefix ? 0 : frame_parms->nb_prefix_samples);
- }
- //unsigned int subframe_offset;//,subframe_offset_F;
- unsigned int slot_offset;
- //int i;
- unsigned int frame_length_samples = frame_parms->samples_per_subframe * 10;
- unsigned int rx_offset;
-
-
- dft_size_idx_t dftsize;
- int tmp_dft_in[8192] __attribute__ ((aligned (32))); // This is for misalignment issues for 6 and 15 PRBs
-
- switch (frame_parms->ofdm_symbol_size) {
+ switch (ofdm_symbol_size) {
case 128:
- dftsize = DFT_128;
- break;
+ return DFT_128;
case 256:
- dftsize = DFT_256;
- break;
+ return DFT_256;
case 512:
- dftsize = DFT_512;
- break;
+ return DFT_512;
case 1024:
- dftsize = DFT_1024;
- break;
+ return DFT_1024;
case 1536:
- dftsize = DFT_1536;
- break;
+ return DFT_1536;
case 2048:
- dftsize = DFT_2048;
- break;
+ return DFT_2048;
case 3072:
- dftsize = DFT_3072;
- break;
+ return DFT_3072;
case 4096:
- dftsize = DFT_4096;
- break;
+ return DFT_4096;
+
+ case 6144:
+ return DFT_6144;
case 8192:
- dftsize = DFT_8192;
- break;
+ return DFT_8192;
default:
printf("unsupported ofdm symbol size \n");
assert(0);
}
- if (no_prefix) {
- slot_offset = frame_parms->ofdm_symbol_size * (frame_parms->symbols_per_slot) * (Ns);
+ return DFT_SIZE_IDXTABLESIZE;
+}
+
+int nr_slot_fep(PHY_VARS_NR_UE *ue,
+ UE_nr_rxtx_proc_t *proc,
+ unsigned char symbol,
+ unsigned char Ns)
+{
+ NR_DL_FRAME_PARMS *frame_parms = &ue->frame_parms;
+ NR_UE_COMMON *common_vars = &ue->common_vars;
+
+ AssertFatal(symbol < frame_parms->symbols_per_slot, "slot_fep: symbol must be between 0 and %d\n", frame_parms->symbols_per_slot-1);
+ AssertFatal(Ns < frame_parms->slots_per_frame, "slot_fep: Ns must be between 0 and %d\n", frame_parms->slots_per_frame-1);
+
+ unsigned int nb_prefix_samples;
+ unsigned int nb_prefix_samples0;
+ if (ue->is_synchronized) {
+ nb_prefix_samples = frame_parms->nb_prefix_samples;
+ nb_prefix_samples0 = frame_parms->nb_prefix_samples0;
} else {
- slot_offset = frame_parms->get_samples_slot_timestamp(Ns,frame_parms,0);
+ nb_prefix_samples = frame_parms->nb_prefix_samples;
+ nb_prefix_samples0 = frame_parms->nb_prefix_samples;
}
- /*if (l<0 || l>=7-frame_parms->Ncp) {
- printf("slot_fep: l must be between 0 and %d\n",7-frame_parms->Ncp);
- return(-1);
- }*/
+ dft_size_idx_t dftsize = get_dft_size_idx(frame_parms->ofdm_symbol_size);
+ // This is for misalignment issues
+ int32_t tmp_dft_in[8192] __attribute__ ((aligned (32)));
- if (Ns<0 || Ns>(frame_parms->slots_per_frame-1)) {
- printf("slot_fep: Ns must be between 0 and %d\n",frame_parms->slots_per_frame-1);
- return(-1);
- }
+ unsigned int rx_offset = frame_parms->get_samples_slot_timestamp(Ns,frame_parms,0);
+ unsigned int abs_symbol = Ns * frame_parms->symbols_per_slot + symbol;
+ for (int idx_symb = Ns*frame_parms->symbols_per_slot; idx_symb <= abs_symbol; idx_symb++)
+ rx_offset += (idx_symb%(0x7<numerology_index)) ? nb_prefix_samples : nb_prefix_samples0;
+ rx_offset += frame_parms->ofdm_symbol_size * symbol;
- for (aa=0; aanb_antennas_rx; aa++) {
- memset(&common_vars->common_vars_rx_data_per_thread[proc->thread_id].rxdataF[aa][frame_parms->ofdm_symbol_size*symbol],0,frame_parms->ofdm_symbol_size*sizeof(int));
-
- rx_offset = sample_offset + slot_offset - SOFFSET;
- // Align with 256 bit
- // rx_offset = rx_offset&0xfffffff8;
+ // use OFDM symbol from within 1/8th of the CP to avoid ISI
+ rx_offset -= nb_prefix_samples / 8;
#ifdef DEBUG_FEP
- // if (ue->frame <100)
- /*LOG_I(PHY,*/printf("slot_fep: slot %d, symbol %d, nb_prefix_samples %u, nb_prefix_samples0 %u, slot_offset %u, sample_offset %d,rx_offset %u, frame_length_samples %u\n",
- Ns, symbol, nb_prefix_samples, nb_prefix_samples0, slot_offset, sample_offset, rx_offset, frame_length_samples);
+ // if (ue->frame <100)
+ printf("slot_fep: slot %d, symbol %d, nb_prefix_samples %u, nb_prefix_samples0 %u, rx_offset %u\n",
+ Ns, symbol, nb_prefix_samples, nb_prefix_samples0, rx_offset);
#endif
- abs_symbol = Ns * frame_parms->symbols_per_slot + symbol;
-
- for (int idx_symb = Ns*frame_parms->symbols_per_slot; idx_symb < abs_symbol; idx_symb++)
- rx_offset += (idx_symb%(0x7<numerology_index)) ? nb_prefix_samples : nb_prefix_samples0;
+ for (unsigned char aa=0; aanb_antennas_rx; aa++) {
+ memset(&common_vars->common_vars_rx_data_per_thread[proc->thread_id].rxdataF[aa][frame_parms->ofdm_symbol_size*symbol],0,frame_parms->ofdm_symbol_size*sizeof(int32_t));
- rx_offset += frame_parms->ofdm_symbol_size * symbol;
-
- if (abs_symbol%(0x7<numerology_index)) {
-
- rx_offset += nb_prefix_samples;
- if (rx_offset > (frame_length_samples - frame_parms->ofdm_symbol_size))
- memcpy((short*) &common_vars->rxdata[aa][frame_length_samples],
- (short*) &common_vars->rxdata[aa][0],
- frame_parms->ofdm_symbol_size*sizeof(int));
-
- if ((rx_offset&7)!=0) { // if input to dft is not 256-bit aligned, issue for size 6,15 and 25 PRBs
- memcpy((void *)tmp_dft_in,
- (void *) &common_vars->rxdata[aa][rx_offset % frame_length_samples],
- frame_parms->ofdm_symbol_size*sizeof(int));
- dft(dftsize,(int16_t *)tmp_dft_in,
- (int16_t *)&common_vars->common_vars_rx_data_per_thread[proc->thread_id].rxdataF[aa][frame_parms->ofdm_symbol_size*symbol],1);
- } else { // use dft input from RX buffer directly
-#if UE_TIMING_TRACE
- start_meas(&ue->rx_dft_stats);
-#endif
-
- dft(dftsize,(int16_t *) &common_vars->rxdata[aa][(rx_offset) % frame_length_samples],
- (int16_t *)&common_vars->common_vars_rx_data_per_thread[proc->thread_id].rxdataF[aa][frame_parms->ofdm_symbol_size*symbol],1);
-#if UE_TIMING_TRACE
- stop_meas(&ue->rx_dft_stats);
-#endif
- }
- } else {
-
- rx_offset += nb_prefix_samples0;
- if (rx_offset > (frame_length_samples - frame_parms->ofdm_symbol_size))
- memcpy((void *) &common_vars->rxdata[aa][frame_length_samples],
- (void *) &common_vars->rxdata[aa][0],
- frame_parms->ofdm_symbol_size*sizeof(int));
-#if UE_TIMING_TRACE
- start_meas(&ue->rx_dft_stats);
-#endif
-
- if ((rx_offset&7)!=0) { // if input to dft is not 128-bit aligned, issue for size 6 and 15 PRBs
- memcpy((void *)tmp_dft_in,
- (void *) &common_vars->rxdata[aa][(rx_offset) % frame_length_samples],
- frame_parms->ofdm_symbol_size*sizeof(int));
- dft(dftsize,(int16_t *)tmp_dft_in,
- (int16_t *)&common_vars->common_vars_rx_data_per_thread[proc->thread_id].rxdataF[aa][frame_parms->ofdm_symbol_size*symbol],1);
- } else { // use dft input from RX buffer directly
-
- dft(dftsize,(int16_t *) &common_vars->rxdata[aa][(rx_offset) % frame_length_samples],
- (int16_t *)&common_vars->common_vars_rx_data_per_thread[proc->thread_id].rxdataF[aa][frame_parms->ofdm_symbol_size*symbol],1);
- }
-#if UE_TIMING_TRACE
- stop_meas(&ue->rx_dft_stats);
-#endif
+ int16_t *rxdata_ptr = (int16_t *)&common_vars->rxdata[aa][rx_offset];
+ // if input to dft is not 256-bit aligned
+ if ((rx_offset & 7) != 0) {
+ memcpy((void *)&tmp_dft_in[0],
+ (void *)&common_vars->rxdata[aa][rx_offset],
+ frame_parms->ofdm_symbol_size * sizeof(int32_t));
+ rxdata_ptr = (int16_t *)tmp_dft_in;
}
+#if UE_TIMING_TRACE
+ start_meas(&ue->rx_dft_stats);
+#endif
+
+ dft(dftsize,
+ rxdata_ptr,
+ (int16_t *)&common_vars->common_vars_rx_data_per_thread[proc->thread_id].rxdataF[aa][frame_parms->ofdm_symbol_size*symbol],
+ 1);
+
+#if UE_TIMING_TRACE
+ stop_meas(&ue->rx_dft_stats);
+#endif
+
+ int symb_offset = (Ns%frame_parms->slots_per_subframe)*frame_parms->symbols_per_slot;
+ int32_t rot2 = ((uint32_t*)frame_parms->symbol_rotation[0])[symbol+symb_offset];
+ ((int16_t*)&rot2)[1]=-((int16_t*)&rot2)[1];
+
#ifdef DEBUG_FEP
// if (ue->frame <100)
- printf("slot_fep: symbol %d rx_offset %u\n", symbol, rx_offset);
+ printf("slot_fep: slot %d, symbol %d rx_offset %u, rotation symbol %d %d.%d\n", Ns,symbol, rx_offset,
+ symbol+symb_offset,((int16_t*)&rot2)[0],((int16_t*)&rot2)[1]);
#endif
-
- int symb_offset = (Ns%frame_parms->slots_per_subframe)*frame_parms->symbols_per_slot;
- int32_t rot2 = ((uint32_t*)frame_parms->symbol_rotation[0])[symbol + symb_offset];
- ((int16_t*)&rot2)[1]=-((int16_t*)&rot2)[1];
+
rotate_cpx_vector((int16_t *)&common_vars->common_vars_rx_data_per_thread[proc->thread_id].rxdataF[aa][frame_parms->ofdm_symbol_size*symbol],
(int16_t*)&rot2,
(int16_t *)&common_vars->common_vars_rx_data_per_thread[proc->thread_id].rxdataF[aa][frame_parms->ofdm_symbol_size*symbol],
frame_parms->ofdm_symbol_size,
15);
-
}
-
#ifdef DEBUG_FEP
printf("slot_fep: done\n");
#endif
- return(0);
+
+ return 0;
}
int nr_slot_fep_init_sync(PHY_VARS_NR_UE *ue,
UE_nr_rxtx_proc_t *proc,
unsigned char symbol,
unsigned char Ns,
- int sample_offset,
- int no_prefix)
+ int sample_offset)
{
NR_DL_FRAME_PARMS *frame_parms = &ue->frame_parms;
NR_UE_COMMON *common_vars = &ue->common_vars;
- unsigned char aa;
+
+ AssertFatal(symbol < frame_parms->symbols_per_slot, "slot_fep: symbol must be between 0 and %d\n", frame_parms->symbols_per_slot-1);
+ AssertFatal(Ns < frame_parms->slots_per_frame, "slot_fep: Ns must be between 0 and %d\n", frame_parms->slots_per_frame-1);
+
unsigned int nb_prefix_samples;
unsigned int nb_prefix_samples0;
- unsigned int abs_symbol;
if (ue->is_synchronized) {
- nb_prefix_samples = (no_prefix ? 0 : frame_parms->nb_prefix_samples);
- nb_prefix_samples0 = (no_prefix ? 0 : frame_parms->nb_prefix_samples0);
+ nb_prefix_samples = frame_parms->nb_prefix_samples;
+ nb_prefix_samples0 = frame_parms->nb_prefix_samples0;
}
else {
- nb_prefix_samples = (no_prefix ? 0 : frame_parms->nb_prefix_samples);
- nb_prefix_samples0 = (no_prefix ? 0 : frame_parms->nb_prefix_samples);
+ nb_prefix_samples = frame_parms->nb_prefix_samples;
+ nb_prefix_samples0 = frame_parms->nb_prefix_samples;
}
- //unsigned int subframe_offset;//,subframe_offset_F;
- unsigned int slot_offset;
- //int i;
- unsigned int frame_length_samples = frame_parms->samples_per_subframe * 10;
- unsigned int rx_offset;
+ unsigned int frame_length_samples = frame_parms->samples_per_frame;
+ dft_size_idx_t dftsize = get_dft_size_idx(frame_parms->ofdm_symbol_size);
+ // This is for misalignment issues
+ int32_t tmp_dft_in[8192] __attribute__ ((aligned (32)));
- dft_size_idx_t dftsize;
- int tmp_dft_in[8192] __attribute__ ((aligned (32))); // This is for misalignment issues for 6 and 15 PRBs
-
- switch (frame_parms->ofdm_symbol_size) {
- case 128:
- dftsize = DFT_128;
- break;
-
- case 256:
- dftsize = DFT_256;
- break;
-
- case 512:
- dftsize = DFT_512;
- break;
-
- case 1024:
- dftsize = DFT_1024;
- break;
-
- case 1536:
- dftsize = DFT_1536;
- break;
-
- case 2048:
- dftsize = DFT_2048;
- break;
-
- case 3072:
- dftsize = DFT_3072;
- break;
-
- case 4096:
- dftsize = DFT_4096;
- break;
-
- case 8192:
- dftsize = DFT_8192;
- break;
-
- default:
- printf("unsupported ofdm symbol size \n");
- assert(0);
- }
-
- if (no_prefix) {
- slot_offset = frame_parms->ofdm_symbol_size * (frame_parms->symbols_per_slot) * (Ns);
- } else {
- slot_offset = frame_parms->get_samples_slot_timestamp(Ns,frame_parms,0);
- }
-
- /*if (l<0 || l>=7-frame_parms->Ncp) {
- printf("slot_fep: l must be between 0 and %d\n",7-frame_parms->Ncp);
- return(-1);
- }*/
-
- if (Ns<0 || Ns>(frame_parms->slots_per_frame-1)) {
- printf("slot_fep: Ns must be between 0 and %d\n",frame_parms->slots_per_frame-1);
- return(-1);
- }
-
- for (aa=0; aanb_antennas_rx; aa++) {
- memset(&common_vars->common_vars_rx_data_per_thread[proc->thread_id].rxdataF[aa][frame_parms->ofdm_symbol_size*symbol],0,frame_parms->ofdm_symbol_size*sizeof(int));
-
- rx_offset = sample_offset + slot_offset - SOFFSET;
- // Align with 256 bit
- // rx_offset = rx_offset&0xfffffff8;
+ unsigned int slot_offset = frame_parms->get_samples_slot_timestamp(Ns,frame_parms,0);
+ unsigned int rx_offset = sample_offset + slot_offset;
+ unsigned int abs_symbol = Ns * frame_parms->symbols_per_slot + symbol;
+ for (int idx_symb = Ns*frame_parms->symbols_per_slot; idx_symb <= abs_symbol; idx_symb++)
+ rx_offset += (abs_symbol%(0x7<numerology_index)) ? nb_prefix_samples : nb_prefix_samples0;
+ rx_offset += frame_parms->ofdm_symbol_size * symbol;
#ifdef DEBUG_FEP
- // if (ue->frame <100)
- /*LOG_I(PHY,*/printf("slot_fep: slot %d, symbol %d, nb_prefix_samples %u, nb_prefix_samples0 %u, slot_offset %u, sample_offset %d,rx_offset %u, frame_length_samples %u\n",
- Ns, symbol, nb_prefix_samples, nb_prefix_samples0, slot_offset, sample_offset, rx_offset, frame_length_samples);
+ // if (ue->frame <100)
+ printf("slot_fep: slot %d, symbol %d, nb_prefix_samples %u, nb_prefix_samples0 %u, slot_offset %u, sample_offset %d,rx_offset %u, frame_length_samples %u\n",
+ Ns, symbol, nb_prefix_samples, nb_prefix_samples0, slot_offset, sample_offset, rx_offset, frame_length_samples);
#endif
- abs_symbol = Ns * frame_parms->symbols_per_slot + symbol;
-
- for (int idx_symb = Ns*frame_parms->symbols_per_slot; idx_symb < abs_symbol; idx_symb++)
- rx_offset += (abs_symbol%(0x7<numerology_index)) ? nb_prefix_samples : nb_prefix_samples0;
+ for (unsigned char aa=0; aanb_antennas_rx; aa++) {
+ memset(&common_vars->common_vars_rx_data_per_thread[proc->thread_id].rxdataF[aa][frame_parms->ofdm_symbol_size*symbol],0,frame_parms->ofdm_symbol_size*sizeof(int32_t));
- rx_offset += frame_parms->ofdm_symbol_size * symbol;
+ int16_t *rxdata_ptr;
- if (abs_symbol%(0x7<numerology_index)) {
+ if (frame_length_samples - rx_offset < frame_parms->ofdm_symbol_size) {
- rx_offset += nb_prefix_samples;
- if (rx_offset > (frame_length_samples - frame_parms->ofdm_symbol_size))
- memcpy((short*) &common_vars->rxdata[aa][frame_length_samples],
- (short*) &common_vars->rxdata[aa][0],
- frame_parms->ofdm_symbol_size*sizeof(int));
+ memcpy((void *)&tmp_dft_in[0],
+ (void *)&common_vars->rxdata[aa][rx_offset],
+ (frame_length_samples - rx_offset) * sizeof(int32_t));
+ memcpy((void *)&tmp_dft_in[frame_length_samples - rx_offset],
+ (void *)&common_vars->rxdata[aa][0],
+ (frame_parms->ofdm_symbol_size - (frame_length_samples - rx_offset)) * sizeof(int32_t));
+ rxdata_ptr = (int16_t *)&tmp_dft_in[0];
- if ((rx_offset&7)!=0) { // if input to dft is not 256-bit aligned, issue for size 6,15 and 25 PRBs
- memcpy((void *)tmp_dft_in,
- (void *) &common_vars->rxdata[aa][rx_offset],
- frame_parms->ofdm_symbol_size*sizeof(int));
- dft(dftsize,(int16_t *)tmp_dft_in,
- (int16_t *)&common_vars->common_vars_rx_data_per_thread[proc->thread_id].rxdataF[aa][frame_parms->ofdm_symbol_size*symbol],1);
- } else { // use dft input from RX buffer directly
-#if UE_TIMING_TRACE
- start_meas(&ue->rx_dft_stats);
-#endif
+ } else if ((rx_offset & 7) != 0) {
+ // if input to dft is not 256-bit aligned
+ memcpy((void *)&tmp_dft_in[0],
+ (void *)&common_vars->rxdata[aa][rx_offset],
+ frame_parms->ofdm_symbol_size * sizeof(int32_t));
+ rxdata_ptr = (int16_t *)&tmp_dft_in[0];
- dft(dftsize,(int16_t *) &common_vars->rxdata[aa][rx_offset],
- (int16_t *)&common_vars->common_vars_rx_data_per_thread[proc->thread_id].rxdataF[aa][frame_parms->ofdm_symbol_size*symbol],1);
-#if UE_TIMING_TRACE
- stop_meas(&ue->rx_dft_stats);
-#endif
- }
} else {
- rx_offset += nb_prefix_samples0;
- if (rx_offset > (frame_length_samples - frame_parms->ofdm_symbol_size))
- memcpy((void *) &common_vars->rxdata[aa][frame_length_samples],
- (void *) &common_vars->rxdata[aa][0],
- frame_parms->ofdm_symbol_size*sizeof(int));
-#if UE_TIMING_TRACE
- start_meas(&ue->rx_dft_stats);
-#endif
-
- if ((rx_offset&7)!=0) { // if input to dft is not 128-bit aligned, issue for size 6 and 15 PRBs
- memcpy((void *)tmp_dft_in,
- (void *) &common_vars->rxdata[aa][rx_offset],
- frame_parms->ofdm_symbol_size*sizeof(int));
- dft(dftsize,(int16_t *)tmp_dft_in,
- (int16_t *)&common_vars->common_vars_rx_data_per_thread[proc->thread_id].rxdataF[aa][frame_parms->ofdm_symbol_size*symbol],1);
- } else { // use dft input from RX buffer directly
- dft(dftsize,(int16_t *) &common_vars->rxdata[aa][rx_offset],
- (int16_t *)&common_vars->common_vars_rx_data_per_thread[proc->thread_id].rxdataF[aa][frame_parms->ofdm_symbol_size*symbol],1);
- }
-#if UE_TIMING_TRACE
- stop_meas(&ue->rx_dft_stats);
-#endif
-
+ // use dft input from RX buffer directly
+ rxdata_ptr = (int16_t *)&common_vars->rxdata[aa][rx_offset];
}
+#if UE_TIMING_TRACE
+ start_meas(&ue->rx_dft_stats);
+#endif
+
+ dft(dftsize,
+ rxdata_ptr,
+ (int16_t *)&common_vars->common_vars_rx_data_per_thread[proc->thread_id].rxdataF[aa][frame_parms->ofdm_symbol_size*symbol],
+ 1);
+
+#if UE_TIMING_TRACE
+ stop_meas(&ue->rx_dft_stats);
+#endif
+
int symb_offset = (Ns%frame_parms->slots_per_subframe)*frame_parms->symbols_per_slot;
int32_t rot2 = ((uint32_t*)frame_parms->symbol_rotation[0])[symbol + symb_offset];
((int16_t*)&rot2)[1]=-((int16_t*)&rot2)[1];
@@ -400,14 +265,13 @@ int nr_slot_fep_init_sync(PHY_VARS_NR_UE *ue,
(int16_t *)&common_vars->common_vars_rx_data_per_thread[proc->thread_id].rxdataF[aa][frame_parms->ofdm_symbol_size*symbol],
frame_parms->ofdm_symbol_size,
15);
-
}
-
#ifdef DEBUG_FEP
printf("slot_fep: done\n");
#endif
- return(0);
+
+ return 0;
}
@@ -416,89 +280,60 @@ int nr_slot_fep_ul(NR_DL_FRAME_PARMS *frame_parms,
int32_t *rxdataF,
unsigned char symbol,
unsigned char Ns,
- int sample_offset,
- int no_prefix)
+ int sample_offset)
{
- int32_t slot_offset, rxdata_offset;
-
- unsigned int nb_prefix_samples = (no_prefix ? 0 : frame_parms->nb_prefix_samples);
- unsigned int nb_prefix_samples0 = (no_prefix ? 0 : frame_parms->nb_prefix_samples0);
+ unsigned int nb_prefix_samples = frame_parms->nb_prefix_samples;
+ unsigned int nb_prefix_samples0 = frame_parms->nb_prefix_samples0;
- int tmp_dft_in[8192] __attribute__ ((aligned (32)));
+ dft_size_idx_t dftsize = get_dft_size_idx(frame_parms->ofdm_symbol_size);
+ // This is for misalignment issues
+ int32_t tmp_dft_in[8192] __attribute__ ((aligned (32)));
- dft_size_idx_t dftsize;
+ unsigned int slot_offset = frame_parms->get_samples_slot_timestamp(Ns,frame_parms,0);
- switch (frame_parms->ofdm_symbol_size) {
- case 128:
- dftsize = DFT_128;
- break;
+ // offset of first OFDM symbol
+ int32_t rxdata_offset = slot_offset + nb_prefix_samples0;
+ // offset of n-th OFDM symbol
+ rxdata_offset += symbol * (frame_parms->ofdm_symbol_size + nb_prefix_samples);
+ // use OFDM symbol from within 1/8th of the CP to avoid ISI
+ rxdata_offset -= nb_prefix_samples / 8;
- case 256:
- dftsize = DFT_256;
- break;
+ int16_t *rxdata_ptr;
- case 512:
- dftsize = DFT_512;
- break;
+ if(sample_offset > rxdata_offset) {
- case 1024:
- dftsize = DFT_1024;
- break;
+ memcpy((void *)&tmp_dft_in[0],
+ (void *)&rxdata[frame_parms->samples_per_frame - sample_offset + rxdata_offset],
+ (sample_offset - rxdata_offset) * sizeof(int32_t));
+ memcpy((void *)&tmp_dft_in[sample_offset - rxdata_offset],
+ (void *)&rxdata[0],
+ (frame_parms->ofdm_symbol_size - sample_offset + rxdata_offset) * sizeof(int32_t));
+ rxdata_ptr = (int16_t *)&tmp_dft_in[0];
- case 1536:
- dftsize = DFT_1536;
- break;
+ } else if (((rxdata_offset - sample_offset) & 7) != 0) {
- case 2048:
- dftsize = DFT_2048;
- break;
+ // if input to dft is not 256-bit aligned
+ memcpy((void *)&tmp_dft_in[0],
+ (void *)&rxdata[rxdata_offset - sample_offset],
+ (frame_parms->ofdm_symbol_size) * sizeof(int32_t));
+ rxdata_ptr = (int16_t *)&tmp_dft_in[0];
- case 4096:
- dftsize = DFT_4096;
- break;
+ } else {
- case 8192:
- dftsize = DFT_8192;
- break;
+ // use dft input from RX buffer directly
+ rxdata_ptr = (int16_t *)&rxdata[rxdata_offset - sample_offset];
- default:
- dftsize = DFT_512;
- break;
}
-
- slot_offset = frame_parms->get_samples_slot_timestamp(Ns,frame_parms,0);
- if(symbol == 0)
- rxdata_offset = slot_offset + nb_prefix_samples0 - SOFFSET;
- else
- rxdata_offset = slot_offset + nb_prefix_samples0 + (symbol * (frame_parms->ofdm_symbol_size + nb_prefix_samples)) - SOFFSET;
-
- if(sample_offset>rxdata_offset) {
- memcpy1((void *)tmp_dft_in,
- (void *) &rxdata[frame_parms->samples_per_frame-sample_offset+rxdata_offset],
- (sample_offset-rxdata_offset)*sizeof(int));
-
- memcpy1((void *)&tmp_dft_in[sample_offset-rxdata_offset],
- (void *) &rxdata[0],
- (frame_parms->ofdm_symbol_size-sample_offset+rxdata_offset)*sizeof(int));
-
- dft(dftsize,(int16_t *)&tmp_dft_in,
- (int16_t *)&rxdataF[symbol * frame_parms->ofdm_symbol_size], 1);
- }
- else {
- //dft(dftsize,(int16_t *)&rxdata[rxdata_offset-sample_offset],
- // (int16_t *)&rxdataF[symbol * frame_parms->ofdm_symbol_size], 1);
- memcpy((void *)tmp_dft_in,
- (void *) &rxdata[rxdata_offset-sample_offset],
- (frame_parms->ofdm_symbol_size)*sizeof(int));
- dft(dftsize,(int16_t *)&tmp_dft_in,
- (int16_t *)&rxdataF[symbol * frame_parms->ofdm_symbol_size], 1);
- }
+ dft(dftsize,
+ rxdata_ptr,
+ (int16_t *)&rxdataF[symbol * frame_parms->ofdm_symbol_size],
+ 1);
// clear DC carrier from OFDM symbols
rxdataF[symbol * frame_parms->ofdm_symbol_size] = 0;
- return(0);
+ return 0;
}
void apply_nr_rotation_ul(NR_DL_FRAME_PARMS *frame_parms,
diff --git a/openair1/PHY/NR_ESTIMATION/nr_measurements_gNB.c b/openair1/PHY/NR_ESTIMATION/nr_measurements_gNB.c
index ec55eabf31..a54aec7bc2 100644
--- a/openair1/PHY/NR_ESTIMATION/nr_measurements_gNB.c
+++ b/openair1/PHY/NR_ESTIMATION/nr_measurements_gNB.c
@@ -37,22 +37,20 @@
int nr_est_timing_advance_pusch(PHY_VARS_gNB* gNB, int UE_id)
{
- int temp, i, aa, max_pos = 0, max_val = 0;
- short Re, Im;
- uint8_t cyclic_shift = 0;
+ int i, aa, max_pos = 0, max_val = 0;
NR_DL_FRAME_PARMS *frame_parms = &gNB->frame_parms;
NR_gNB_PUSCH *gNB_pusch_vars = gNB->pusch_vars[UE_id];
int32_t **ul_ch_estimates_time = gNB_pusch_vars->ul_ch_estimates_time;
- int sync_pos = (frame_parms->ofdm_symbol_size - cyclic_shift*frame_parms->ofdm_symbol_size/12) % (frame_parms->ofdm_symbol_size);
+ int sync_pos = frame_parms->nb_prefix_samples / 8;
for (i = 0; i < frame_parms->ofdm_symbol_size; i++) {
- temp = 0;
+ int temp = 0;
for (aa = 0; aa < frame_parms->nb_antennas_rx; aa++) {
- Re = ((int16_t*)ul_ch_estimates_time[aa])[(i<<1)];
- Im = ((int16_t*)ul_ch_estimates_time[aa])[1+(i<<1)];
+ short Re = ((int16_t*)ul_ch_estimates_time[aa])[(i<<1)];
+ short Im = ((int16_t*)ul_ch_estimates_time[aa])[1+(i<<1)];
temp += (Re*Re/2) + (Im*Im/2);
}
diff --git a/openair1/PHY/NR_ESTIMATION/nr_ul_channel_estimation.c b/openair1/PHY/NR_ESTIMATION/nr_ul_channel_estimation.c
index 10ac23bef0..967868f803 100644
--- a/openair1/PHY/NR_ESTIMATION/nr_ul_channel_estimation.c
+++ b/openair1/PHY/NR_ESTIMATION/nr_ul_channel_estimation.c
@@ -73,7 +73,7 @@ int nr_pusch_channel_estimation(PHY_VARS_gNB *gNB,
symbol_offset = gNB->frame_parms.ofdm_symbol_size*symbol;
k = bwp_start_subcarrier;
- int re_offset = k;
+ int re_offset;
uint16_t nb_rb_pusch = pusch_pdu->rb_size;
@@ -170,6 +170,7 @@ int nr_pusch_channel_estimation(PHY_VARS_gNB *gNB,
pil = (int16_t *)&pilot[0];
rxF = (int16_t *)&rxdataF[aarx][(symbol_offset+k+nushift)];
ul_ch = (int16_t *)&ul_ch_estimates[aarx][ch_offset];
+ re_offset = k;
memset(ul_ch,0,4*(gNB->frame_parms.ofdm_symbol_size));
diff --git a/openair1/PHY/NR_TRANSPORT/nr_dlsch.c b/openair1/PHY/NR_TRANSPORT/nr_dlsch.c
index 66fc987f6d..ad7a9e7b62 100644
--- a/openair1/PHY/NR_TRANSPORT/nr_dlsch.c
+++ b/openair1/PHY/NR_TRANSPORT/nr_dlsch.c
@@ -141,6 +141,7 @@ uint8_t nr_generate_pdsch(PHY_VARS_gNB *gNB,
uint32_t scrambled_output[NR_MAX_NB_CODEWORDS][NR_MAX_PDSCH_ENCODED_LENGTH>>5];
int16_t **mod_symbs = (int16_t**)dlsch->mod_symbs;
int16_t **tx_layers = (int16_t**)dlsch->txdataF;
+ int16_t **txdataF_precoding = (int16_t**)dlsch->txdataF_precoding;
int8_t Wf[2], Wt[2], l0, l_prime, l_overline, delta;
uint8_t dmrs_Type = rel15->dmrsConfigType;
int nb_re_dmrs;
@@ -264,9 +265,6 @@ uint8_t nr_generate_pdsch(PHY_VARS_gNB *gNB,
}
#endif
- /// Antenna port mapping
- //to be moved to init phase potentially, for now tx_layers 1-8 are mapped on antenna ports 1000-1007
-
/// DMRS QPSK modulation
for (int l=rel15->StartSymbolIndex; lStartSymbolIndex+rel15->NrOfSymbols; l++) {
if (rel15->dlDmrsSymbPos & (1 << l)) {
@@ -290,7 +288,9 @@ uint8_t nr_generate_pdsch(PHY_VARS_gNB *gNB,
uint16_t start_sc = frame_parms->first_carrier_offset + (rel15->rbStart+rel15->BWPStart)*NR_NB_SC_PER_RB;
if (start_sc >= frame_parms->ofdm_symbol_size)
start_sc -= frame_parms->ofdm_symbol_size;
-
+
+ int txdataF_offset = (slot%2)*frame_parms->samples_per_slot_wCP;
+
#ifdef DEBUG_DLSCH_MAPPING
printf("PDSCH resource mapping started (start SC %d\tstart symbol %d\tN_PRB %d\tnb_re %d,nb_layers %d)\n",
start_sc, rel15->StartSymbolIndex, rel15->rbSize, nb_re,rel15->nrOfLayers);
@@ -311,9 +311,7 @@ uint8_t nr_generate_pdsch(PHY_VARS_gNB *gNB,
1+dmrs_Type,ap, Wt[0], Wt[1], Wf[0], Wf[1], delta, l_prime, l0, dmrs_symbol);
#endif
- uint16_t m=0, dmrs_idx=0, k=0;
-
- int txdataF_offset = (slot%2)*frame_parms->samples_per_slot_wCP;
+ uint16_t m=0, dmrs_idx=0;
// Loop Over OFDM symbols:
for (int l=rel15->StartSymbolIndex; lStartSymbolIndex+rel15->NrOfSymbols; l++) {
@@ -347,7 +345,7 @@ uint8_t nr_generate_pdsch(PHY_VARS_gNB *gNB,
nr_modulation(pdsch_dmrs[l][0], (n_ptrs<<1), DMRS_MOD_ORDER, mod_ptrs);
}
}
- k = start_sc;
+ uint16_t k = start_sc;
// Loop Over SCs:
for (int i=0; irbSize*NR_NB_SC_PER_RB; i++) {
/* check if cuurent RE is PTRS RE*/
@@ -367,12 +365,12 @@ uint8_t nr_generate_pdsch(PHY_VARS_gNB *gNB,
/* Map DMRS Symbol */
if ( ( dmrs_symbol_map & (1 << l) ) && (k == ((start_sc+get_dmrs_freq_idx(n, k_prime, delta, dmrs_Type))%(frame_parms->ofdm_symbol_size)))) {
- ((int16_t*)txdataF[ap])[((l*frame_parms->ofdm_symbol_size + k)<<1) + (2*txdataF_offset)] = (Wt[l_prime]*Wf[k_prime]*amp*mod_dmrs[l][dmrs_idx<<1]) >> 15;
- ((int16_t*)txdataF[ap])[((l*frame_parms->ofdm_symbol_size + k)<<1) + 1 + (2*txdataF_offset)] = (Wt[l_prime]*Wf[k_prime]*amp*mod_dmrs[l][(dmrs_idx<<1) + 1]) >> 15;
+ txdataF_precoding[ap][((l*frame_parms->ofdm_symbol_size + k)<<1) + (2*txdataF_offset)] = (Wt[l_prime]*Wf[k_prime]*amp*mod_dmrs[l][dmrs_idx<<1]) >> 15;
+ txdataF_precoding[ap][((l*frame_parms->ofdm_symbol_size + k)<<1) + 1 + (2*txdataF_offset)] = (Wt[l_prime]*Wf[k_prime]*amp*mod_dmrs[l][(dmrs_idx<<1) + 1]) >> 15;
#ifdef DEBUG_DLSCH_MAPPING
printf("dmrs_idx %d\t l %d \t k %d \t k_prime %d \t n %d \t txdataF: %d %d\n",
- dmrs_idx, l, k, k_prime, n, ((int16_t*)txdataF[ap])[((l*frame_parms->ofdm_symbol_size + k)<<1) + (2*txdataF_offset)],
- ((int16_t*)txdataF[ap])[((l*frame_parms->ofdm_symbol_size + k)<<1) + 1 + (2*txdataF_offset)]);
+ dmrs_idx, l, k, k_prime, n, txdataF_precoding[ap][((l*frame_parms->ofdm_symbol_size + k)<<1) + (2*txdataF_offset)],
+ txdataF_precoding[ap][((l*frame_parms->ofdm_symbol_size + k)<<1) + 1 + (2*txdataF_offset)]);
#endif
dmrs_idx++;
k_prime++;
@@ -381,8 +379,8 @@ uint8_t nr_generate_pdsch(PHY_VARS_gNB *gNB,
}
/* Map PTRS Symbol */
else if(is_ptrs_re){
- ((int16_t*)txdataF[ap])[((l*frame_parms->ofdm_symbol_size + k)<<1) + (2*txdataF_offset)] = (beta_ptrs*amp*mod_ptrs[ptrs_idx<<1]) >> 15;
- ((int16_t*)txdataF[ap])[((l*frame_parms->ofdm_symbol_size + k)<<1) + 1 + (2*txdataF_offset)] = (beta_ptrs*amp*mod_ptrs[(ptrs_idx<<1) + 1])>> 15;
+ txdataF_precoding[ap][((l*frame_parms->ofdm_symbol_size + k)<<1) + (2*txdataF_offset)] = (beta_ptrs*amp*mod_ptrs[ptrs_idx<<1]) >> 15;
+ txdataF_precoding[ap][((l*frame_parms->ofdm_symbol_size + k)<<1) + 1 + (2*txdataF_offset)] = (beta_ptrs*amp*mod_ptrs[(ptrs_idx<<1) + 1])>> 15;
#ifdef DEBUG_DLSCH_MAPPING
printf("ptrs_idx %d\t l %d \t k %d \t k_prime %d \t n %d \t txdataF: %d %d\n",
ptrs_idx, l, k, k_prime, n, ((int16_t*)txdataF[ap])[((l*frame_parms->ofdm_symbol_size + k)<<1) + (2*txdataF_offset)],
@@ -391,17 +389,20 @@ uint8_t nr_generate_pdsch(PHY_VARS_gNB *gNB,
ptrs_idx++;
}
/* Map DATA Symbol */
- else {
- if( (!(dmrs_symbol_map & (1 << l))) || allowed_xlsch_re_in_dmrs_symbol(k,start_sc,frame_parms->ofdm_symbol_size,rel15->numDmrsCdmGrpsNoData,dmrs_Type)) {
- ((int16_t*)txdataF[ap])[((l*frame_parms->ofdm_symbol_size + k)<<1) + (2*txdataF_offset)] = (amp * tx_layers[ap][m<<1]) >> 15;
- ((int16_t*)txdataF[ap])[((l*frame_parms->ofdm_symbol_size + k)<<1) + 1 + (2*txdataF_offset)] = (amp * tx_layers[ap][(m<<1) + 1]) >> 15;
+ else if( (!(dmrs_symbol_map & (1 << l))) || allowed_xlsch_re_in_dmrs_symbol(k,start_sc,frame_parms->ofdm_symbol_size,rel15->numDmrsCdmGrpsNoData,dmrs_Type)) {
+ txdataF_precoding[ap][((l*frame_parms->ofdm_symbol_size + k)<<1) + (2*txdataF_offset)] = (amp * tx_layers[ap][m<<1]) >> 15;
+ txdataF_precoding[ap][((l*frame_parms->ofdm_symbol_size + k)<<1) + 1 + (2*txdataF_offset)] = (amp * tx_layers[ap][(m<<1) + 1]) >> 15;
#ifdef DEBUG_DLSCH_MAPPING
- printf("m %d\t l %d \t k %d \t txdataF: %d %d\n",
- m, l, k, ((int16_t*)txdataF[ap])[((l*frame_parms->ofdm_symbol_size + k)<<1) + (2*txdataF_offset)],
- ((int16_t*)txdataF[ap])[((l*frame_parms->ofdm_symbol_size + k)<<1) + 1 + (2*txdataF_offset)]);
+ printf("m %d\t l %d \t k %d \t txdataF: %d %d\n",
+ m, l, k, txdataF_precoding[ap][((l*frame_parms->ofdm_symbol_size + k)<<1) + (2*txdataF_offset)],
+ txdataF_precoding[ap][((l*frame_parms->ofdm_symbol_size + k)<<1) + 1 + (2*txdataF_offset)]);
#endif
- m++;
- }
+ m++;
+ }
+ /* mute RE */
+ else {
+ txdataF_precoding[ap][((l*frame_parms->ofdm_symbol_size + k)<<1) + (2*txdataF_offset)] = 0;
+ txdataF_precoding[ap][((l*frame_parms->ofdm_symbol_size + k)<<1) + 1 + (2*txdataF_offset)] = 0;
}
if (++k >= frame_parms->ofdm_symbol_size)
k -= frame_parms->ofdm_symbol_size;
@@ -409,6 +410,87 @@ uint8_t nr_generate_pdsch(PHY_VARS_gNB *gNB,
} // symbol loop
}// layer loop
+ ///Layer Precoding and Antenna port mapping
+ // tx_layers 1-8 are mapped on antenna ports 1000-1007
+ // The precoding info is supported by nfapi such as numPRGs, prgSize, and PMIdx
+ // The same precoding matrix is applied on prgSize RBs, Thus
+ // pmi = PMIdx[rbidx/prgSize], rbidx =0,...,rbSize-1
+ // The Precoding matrix:
+ // The Codebook Type I and Type II are not supported yet.
+ // We adopt the precoding matrices of PUSCH for 4 layers.
+ for (int ap=0; apnb_antennas_tx; ap++) {
+
+ for (int l=rel15->StartSymbolIndex; lStartSymbolIndex+rel15->NrOfSymbols; l++) {
+ uint16_t k = start_sc;
+
+ for (int rb=0; rbrbSize; rb++) {
+ //get pmi info
+ uint8_t pmi;
+ if (rel15->precodingAndBeamforming.prgSize > 0)
+ pmi = rel15->precodingAndBeamforming.PMIdx[(int)rb/rel15->precodingAndBeamforming.prgSize];
+ else
+ pmi = 0;//no precoding
+
+ if (pmi == 0) {//unitary Precoding
+ if(apnrOfLayers)
+ memcpy((void*)&txdataF[ap][l*frame_parms->ofdm_symbol_size + txdataF_offset + k],
+ (void*)&txdataF_precoding[ap][2*(l*frame_parms->ofdm_symbol_size + txdataF_offset+ k)],
+ NR_NB_SC_PER_RB*sizeof(int32_t));
+ else
+ memset((void*)&txdataF[ap][rel15->StartSymbolIndex*frame_parms->ofdm_symbol_size + txdataF_offset +k],
+ 0,
+ NR_NB_SC_PER_RB*sizeof(int32_t));
+ k += NR_NB_SC_PER_RB;
+ if (k >= frame_parms->ofdm_symbol_size) {
+ k -= frame_parms->ofdm_symbol_size;
+ }
+ }
+ else {
+ //get the precoding matrix weights:
+ char *W_prec;
+ switch (frame_parms->nb_antennas_tx) {
+ case 1://1 antenna port
+ W_prec = nr_W_1l_2p[pmi][ap];
+ break;
+ case 2://2 antenna ports
+ if (rel15->nrOfLayers == 1)//1 layer
+ W_prec = nr_W_1l_2p[pmi][ap];
+ else//2 layers
+ W_prec = nr_W_2l_2p[pmi][ap];
+ break;
+ case 4://4 antenna ports
+ if (rel15->nrOfLayers == 1)//1 layer
+ W_prec = nr_W_1l_4p[pmi][ap];
+ else if (rel15->nrOfLayers == 2)//2 layers
+ W_prec = nr_W_2l_4p[pmi][ap];
+ else if (rel15->nrOfLayers == 3)//3 layers
+ W_prec = nr_W_3l_4p[pmi][ap];
+ else//4 layers
+ W_prec = nr_W_4l_4p[pmi][ap];
+ break;
+ default:
+ LOG_D(PHY,"Precoding 1,2, or 4 antenna ports are currently supported\n");
+ W_prec = nr_W_1l_2p[pmi][ap];
+ break;
+ }
+ for (int i=0; iofdm_symbol_size + k;
+ int32_t precodatatx_F = nr_layer_precoder(txdataF_precoding, W_prec, rel15->nrOfLayers, re_offset+txdataF_offset);
+ ((int16_t*)txdataF[ap])[(re_offset<<1) + (2*txdataF_offset)] = ((int16_t *) &precodatatx_F)[0];
+ ((int16_t*)txdataF[ap])[(re_offset<<1) + 1 + (2*txdataF_offset)] = ((int16_t *) &precodatatx_F)[1];
+#ifdef DEBUG_DLSCH_MAPPING
+ printf("antenna %d\t l %d \t k %d \t txdataF: %d %d\n",
+ ap, l, k, ((int16_t*)txdataF[ap])[(re_offset<<1) + (2*txdataF_offset)],
+ ((int16_t*)txdataF[ap])[(re_offset<<1) + 1 + (2*txdataF_offset)]);
+#endif
+ if (++k >= frame_parms->ofdm_symbol_size) {
+ k -= frame_parms->ofdm_symbol_size;
+ }
+ }
+ }
+ } //RB loop
+ } // symbol loop
+ }// port loop
dlsch->slot_tx[slot]=0;
}// dlsch loop
diff --git a/openair1/PHY/NR_TRANSPORT/nr_dlsch_coding.c b/openair1/PHY/NR_TRANSPORT/nr_dlsch_coding.c
index e6544bbe0c..d69de105ff 100644
--- a/openair1/PHY/NR_TRANSPORT/nr_dlsch_coding.c
+++ b/openair1/PHY/NR_TRANSPORT/nr_dlsch_coding.c
@@ -61,10 +61,8 @@ void free_gNB_dlsch(NR_gNB_DLSCH_t **dlschptr, uint16_t N_RB)
if (N_RB != 273) {
a_segments = a_segments*N_RB;
a_segments = a_segments/273 +1;
- }
-
-
-
+ }
+
#ifdef DEBUG_DLSCH_FREE
LOG_D(PHY,"Freeing dlsch %p\n",dlsch);
#endif
@@ -133,7 +131,7 @@ NR_gNB_DLSCH_t *new_gNB_dlsch(NR_DL_FRAME_PARMS *frame_parms,
if (N_RB != 273) {
a_segments = a_segments*N_RB;
a_segments = a_segments/273 +1;
- }
+ }
uint16_t dlsch_bytes = a_segments*1056; // allocated bytes per segment
@@ -145,31 +143,30 @@ NR_gNB_DLSCH_t *new_gNB_dlsch(NR_DL_FRAME_PARMS *frame_parms,
dlsch->Mdlharq = Mdlharq;
dlsch->Mlimit = 4;
dlsch->Nsoft = Nsoft;
-
- for (layer=0; layerue_spec_bf_weights[layer] = (int32_t **)malloc16(64 * sizeof(int32_t *));
- for (aa = 0; aa < 64; aa++) {
- dlsch->ue_spec_bf_weights[layer][aa] = (int32_t *)malloc16(OFDM_SYMBOL_SIZE_COMPLEX_SAMPLES * sizeof(int32_t));
- for (re = 0; re < OFDM_SYMBOL_SIZE_COMPLEX_SAMPLES; re++) {
+ for (layer=0; layerue_spec_bf_weights[layer] = (int32_t**)malloc16(64*sizeof(int32_t*));
+
+ for (aa=0; aa<64; aa++) {
+ dlsch->ue_spec_bf_weights[layer][aa] = (int32_t *)malloc16(OFDM_SYMBOL_SIZE_COMPLEX_SAMPLES*sizeof(int32_t));
+ for (re=0;reue_spec_bf_weights[layer][aa][re] = 0x00007fff;
}
}
- dlsch->txdataF[layer] =
- (int32_t *)malloc16((NR_MAX_PDSCH_ENCODED_LENGTH / NR_MAX_NB_LAYERS)
- * sizeof(int32_t)); // NR_MAX_NB_LAYERS is already included in NR_MAX_PDSCH_ENCODED_LENGTH
+ dlsch->txdataF[layer] = (int32_t *)malloc16((NR_MAX_PDSCH_ENCODED_LENGTH/NR_MAX_NB_LAYERS)*sizeof(int32_t)); // NR_MAX_NB_LAYERS is already included in NR_MAX_PDSCH_ENCODED_LENGTH
+ dlsch->txdataF_precoding[layer] = (int32_t *)malloc16(2*14*frame_parms->ofdm_symbol_size*sizeof(int32_t));
}
- for (int q = 0; q < NR_MAX_NB_CODEWORDS; q++)
- dlsch->mod_symbs[q] = (int32_t *)malloc16(NR_MAX_PDSCH_ENCODED_LENGTH * sizeof(int32_t));
+ for (int q=0; qmod_symbs[q] = (int32_t *)malloc16(NR_MAX_PDSCH_ENCODED_LENGTH*sizeof(int32_t));
- dlsch->calib_dl_ch_estimates = (int32_t **)malloc16(64 * sizeof(int32_t *));
- for (aa = 0; aa < 64; aa++) {
- dlsch->calib_dl_ch_estimates[aa] = (int32_t *)malloc16(OFDM_SYMBOL_SIZE_COMPLEX_SAMPLES * sizeof(int32_t));
+ dlsch->calib_dl_ch_estimates = (int32_t**)malloc16(64*sizeof(int32_t*));
+ for (aa=0; aa<64; aa++) {
+ dlsch->calib_dl_ch_estimates[aa] = (int32_t *)malloc16(OFDM_SYMBOL_SIZE_COMPLEX_SAMPLES*sizeof(int32_t));
}
- for (i = 0; i < 20; i++) {
+ for (i=0; i<20; i++) {
dlsch->harq_ids[0][i] = 0;
dlsch->harq_ids[1][i] = 0;
}
@@ -268,7 +265,6 @@ int nr_dlsch_encoding(PHY_VARS_gNB *gNB,
float Coderate = 0.0;
uint8_t Nl = 4;
-
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_gNB_DLSCH_ENCODING, VCD_FUNCTION_IN);
A = rel15->TBSize[0]<<3;
@@ -304,7 +300,7 @@ int nr_dlsch_encoding(PHY_VARS_gNB *gNB,
a[2+(A>>3)] = ((uint8_t*)&crc)[0];
//printf("CRC %x (A %d)\n",crc,A);
//printf("a0 %d a1 %d a2 %d\n", a[A>>3], a[1+(A>>3)], a[2+(A>>3)]);
-
+
harq->B = A+24;
// harq->b = a;
@@ -323,7 +319,7 @@ int nr_dlsch_encoding(PHY_VARS_gNB *gNB,
a[1+(A>>3)] = ((uint8_t*)&crc)[0];
//printf("CRC %x (A %d)\n",crc,A);
//printf("a0 %d a1 %d \n", a[A>>3], a[1+(A>>3)]);
-
+
harq->B = A+16;
// harq->b = a;
@@ -339,17 +335,17 @@ int nr_dlsch_encoding(PHY_VARS_gNB *gNB,
Coderate = (float) R /(float) 1024;
else // to scale for mcs 20 and 26 in table 5.1.3.1-2 which are decimal and input 2* in nr_tbs_tools
Coderate = (float) R /(float) 2048;
-
+
if ((A <=292) || ((A<=3824) && (Coderate <= 0.6667)) || Coderate <= 0.25)
harq->BG = 2;
else
harq->BG = 1;
-
+
start_meas(dlsch_segmentation_stats);
Kb = nr_segmentation(harq->b, harq->c, harq->B, &harq->C, &harq->K, Zc, &harq->F, harq->BG);
stop_meas(dlsch_segmentation_stats);
F = harq->F;
-
+
Kr = harq->K;
#ifdef DEBUG_DLSCH_CODING
uint16_t Kr_bytes;
@@ -357,7 +353,7 @@ int nr_dlsch_encoding(PHY_VARS_gNB *gNB,
#endif
//printf("segment Z %d k %d Kr %d BG %d C %d\n", *Zc,harq->K,Kr,BG,harq->C);
-
+
for (r=0; rC; r++) {
//d_tmp[r] = &harq->d[r][0];
//channel_input[r] = &harq->d[r][0];
@@ -369,7 +365,7 @@ int nr_dlsch_encoding(PHY_VARS_gNB *gNB,
LOG_D(PHY,"%d ", harq->c[r][cnt]);
}
LOG_D(PHY,"\n");
-
+
#endif
//ldpc_encoder_orig((unsigned char*)harq->c[r],harq->d[r],*Zc,Kb,Kr,BG,0);
//ldpc_encoder_optim((unsigned char*)harq->c[r],(unsigned char*)&harq->d[r][0],*Zc,Kb,Kr,BG,NULL,NULL,NULL,NULL);
@@ -380,23 +376,22 @@ int nr_dlsch_encoding(PHY_VARS_gNB *gNB,
impp.tinput = tinput;
impp.tparity = tparity;
impp.toutput = toutput;
-
+
for(int j=0;j<(harq->C/8+1);j++) {
impp.macro_num=j;
nrLDPC_encoder(harq->c,harq->d,*Zc,Kb,Kr,harq->BG,&impp);
}
-
#ifdef DEBUG_DLSCH_CODING
write_output("enc_input0.m","enc_in0",&harq->c[0][0],Kr_bytes,1,4);
write_output("enc_output0.m","enc0",&harq->d[0][0],(3*8*Kr_bytes)+12,1,4);
#endif
-
+
F = harq->F;
-
+
Kr = harq->K;
for (r=0; rC; r++) {
-
+
if (F>0) {
for (int k=(Kr-F-2*(*Zc)); kd[r][k]);
}
}
-
-
-
+
#ifdef DEBUG_DLSCH_CODING
LOG_D(PHY,"rvidx in encoding = %d\n", rel15->rvIndex[0]);
#endif
-
+
E = nr_get_E(G, harq->C, mod_order, rel15->nrOfLayers, r);
-
+
//#ifdef DEBUG_DLSCH_CODING
LOG_D(PHY,"Rate Matching, Code segment %d/%d (coded bits (G) %u, E %d, Filler bits %d, Filler offset %d mod_order %d, nb_rb %d)...\n",
r,
@@ -423,13 +416,13 @@ int nr_dlsch_encoding(PHY_VARS_gNB *gNB,
F,
Kr-F-2*(*Zc),
mod_order,nb_rb);
-
+
// for tbslbrm calculation according to 5.4.2.1 of 38.212
if (rel15->nrOfLayers < Nl)
Nl = rel15->nrOfLayers;
-
+
Tbslbrm = nr_compute_tbslbrm(rel15->mcsTable[0],nb_rb,Nl);
-
+
start_meas(dlsch_rate_matching_stats);
nr_rate_matching_ldpc(Ilbrm,
Tbslbrm,
diff --git a/openair1/PHY/NR_TRANSPORT/nr_prach.c b/openair1/PHY/NR_TRANSPORT/nr_prach.c
index b5a3c061e9..64b14091d6 100644
--- a/openair1/PHY/NR_TRANSPORT/nr_prach.c
+++ b/openair1/PHY/NR_TRANSPORT/nr_prach.c
@@ -301,205 +301,300 @@ void rx_nr_prach_ru(RU_t *ru,
// do DFT
if (mu==1) {
- if (fp->N_RB_UL <= 100)
- AssertFatal(1==0,"N_RB_UL %d not support for NR PRACH yet\n",fp->N_RB_UL);
- else if (fp->N_RB_UL < 137) {
- if (fp->threequarter_fs==0) {
- //40 MHz @ 61.44 Ms/s
- //50 MHz @ 61.44 Ms/s
- prach2 = prach[aa] + (Ncp<<2); // Ncp is for 30.72 Ms/s, so multiply by 2 for I/Q, and 2 to bring to 61.44 Ms/s
- if (prach_sequence_length == 0) {
- if (prachFormat == 0 || prachFormat == 1 || prachFormat == 2) {
- dftlen=49152;
- dft(DFT_49152,prach2,rxsigF[aa],1);
+ switch(fp->samples_per_subframe) {
+ case 15360:
+ // 10, 15 MHz @ 15.36 Ms/s
+ prach2 = prach[aa] + (1*Ncp); // Ncp is for 30.72 Ms/s, so divide by 2 to bring to 15.36 Ms/s and multiply by 2 for I/Q
+ if (prach_sequence_length == 0) {
+ if (prachFormat == 0 || prachFormat == 1 || prachFormat == 2) {
+ dftlen=12288;
+ dft(DFT_12288,prach2,rxsigF[aa],1);
+ }
+ if (prachFormat == 1 || prachFormat == 2) {
+ dft(DFT_12288,prach2+24576,rxsigF[aa]+24576,1);
+ reps++;
+ }
+ if (prachFormat == 2) {
+ dft(DFT_12288,prach2+(24576*2),rxsigF[aa]+(24576*2),1);
+ dft(DFT_12288,prach2+(24576*3),rxsigF[aa]+(24576*3),1);
+ reps+=2;
+ }
+ if (prachFormat == 3) {
+ dftlen=3072;
+ for (int i=0;i<4;i++) dft(DFT_3072,prach2+(i*3072*2),rxsigF[aa]+(i*3072*2),1);
+ reps=4;
+ }
+ } else { // 839 sequence
+ if (prachStartSymbol == 0) prach2+=16; // 8 samples @ 15.36 Ms/s in first symbol of each half subframe (15/30 kHz only)
+
+ dftlen=512;
+ dft(DFT_512,prach2,rxsigF[aa],1);
+ if (prachFormat != 9/*C0*/) {
+ dft(DFT_512,prach2+1024,rxsigF[aa]+1024,1);
+ reps++;
+ }
+ if (prachFormat == 5/*A2*/ || prachFormat == 6/*A3*/|| prachFormat == 8/*B4*/ || prachFormat == 10/*C2*/) {
+ dft(DFT_512,prach2+1024*2,rxsigF[aa]+1024*2,1);
+ dft(DFT_512,prach2+1024*3,rxsigF[aa]+1024*3,1);
+ reps+=2;
+ }
+ if (prachFormat == 6/*A3*/ || prachFormat == 8/*B4*/) {
+ dft(DFT_512,prach2+1024*4,rxsigF[aa]+1024*4,1);
+ dft(DFT_512,prach2+1024*5,rxsigF[aa]+1024*5,1);
+ reps+=2;
+ }
+ if (prachFormat == 8/*B4*/) {
+ for (int i=6;i<12;i++) dft(DFT_512,prach2+(1024*i),rxsigF[aa]+(1024*i),1);
+ reps+=6;
+ }
}
- if (prachFormat == 1 || prachFormat == 2) {
- dft(DFT_49152,prach2+98304,rxsigF[aa]+98304,1);
- reps++;
- }
- if (prachFormat == 2) {
- dft(DFT_49152,prach2+(98304*2),rxsigF[aa]+(98304*2),1);
- dft(DFT_49152,prach2+(98304*3),rxsigF[aa]+(98304*3),1);
- reps+=2;
- }
- if (prachFormat == 3) {
- dftlen=12288;
- for (int i=0;i<4;i++) dft(DFT_12288,prach2+(i*12288*2),rxsigF[aa]+(i*12288*2),1);
- reps=4;
- }
- }// 839 sequence
- else {
- if (prachStartSymbol == 0)
- prach2+=64; // 32 samples @ 61.44 Ms/s in first symbol of each half subframe (15/30 kHz only)
+ break;
- dftlen=2048;
- dft(DFT_2048,prach2,rxsigF[aa],1);
- if (prachFormat != 9/*C0*/) {
- dft(DFT_2048,prach2+4096,rxsigF[aa]+4096,1);
- reps++;
- }
- if (prachFormat == 5/*A2*/ || prachFormat == 6/*A3*/|| prachFormat == 8/*B4*/ || prachFormat == 10/*C2*/) {
- dft(DFT_2048,prach2+4096*2,rxsigF[aa]+4096*2,1);
- dft(DFT_2048,prach2+4096*3,rxsigF[aa]+4096*3,1);
- reps+=2;
- }
- if (prachFormat == 6/*A3*/ || prachFormat == 8/*B4*/) {
- dft(DFT_2048,prach2+4096*4,rxsigF[aa]+4096*4,1);
- dft(DFT_2048,prach2+4096*5,rxsigF[aa]+4096*5,1);
- reps+=2;
- }
- if (prachFormat == 8/*B4*/) {
- for (int i=6;i<12;i++) dft(DFT_2048,prach2+(4096*i),rxsigF[aa]+(4096*i),1);
- reps+=6;
- }
- }
- } else { // threequarter sampling
- // 40 MHz @ 46.08 Ms/s
- prach2 = prach[aa] + (3*Ncp); // 46.08 is 1.5 * 30.72, times 2 for I/Q
- if (prach_sequence_length == 0) {
- AssertFatal(fp->N_RB_UL <= 107,"cannot do 108..136 PRBs with 3/4 sampling\n");
- if (prachFormat == 0 || prachFormat == 1 || prachFormat == 2) {
- dftlen=36864;
- dft(DFT_36864,prach2,rxsigF[aa],1);
- reps++;
- }
- if (prachFormat == 1 || prachFormat == 2) {
- dft(DFT_36864,prach2+73728,rxsigF[aa]+73728,1);
- reps++;
- }
- if (prachFormat == 2) {
- dft(DFT_36864,prach2+(73728*2),rxsigF[aa]+(73728*2),1);
- dft(DFT_36864,prach2+(73728*3),rxsigF[aa]+(73728*3),1);
- reps+=2;
- }
- if (prachFormat == 3) {
- dftlen=9216;
- for (int i=0;i<4;i++) dft(DFT_9216,prach2+(i*9216*2),rxsigF[aa]+(i*9216*2),1);
- reps=4;
- }
- } else {
- if (prachStartSymbol == 0) prach2+=48; // 24 samples @ 46.08 Ms/s in first symbol of each half subframe (15/30 kHz only)
- dftlen=1536;
- dft(DFT_1536,prach2,rxsigF[aa],1);
- if (prachFormat != 9/*C0*/) {
- dft(DFT_1536,prach2+3072,rxsigF[aa]+3072,1);
- reps++;
- }
-
- if (prachFormat == 5/*A2*/ || prachFormat == 6/*A3*/|| prachFormat == 8/*B4*/ || prachFormat == 10/*C2*/) {
- dft(DFT_1536,prach2+3072*2,rxsigF[aa]+3072*2,1);
- dft(DFT_1536,prach2+3072*3,rxsigF[aa]+3072*3,1);
- reps+=2;
- }
- if (prachFormat == 6/*A3*/ || prachFormat == 8/*B4*/) {
- dft(DFT_1536,prach2+3072*4,rxsigF[aa]+3072*4,1);
- dft(DFT_1536,prach2+3072*5,rxsigF[aa]+3072*5,1);
- reps+=2;
- }
- if (prachFormat == 8/*B4*/) {
- for (int i=6;i<12;i++) dft(DFT_1536,prach2+(3072*i),rxsigF[aa]+(3072*i),1);
- reps+=6;
- }
- } // short format
- } // 3/4 sampling
- } // <=50 MHz BW
- else if (fp->N_RB_UL <= 273) {
- if (fp->threequarter_fs==0) {
- prach2 = prach[aa] + (Ncp<<3);
- //80,90,100 MHz @ 122.88 Ms/s
+ case 30720:
+ // 20, 25, 30 MHz @ 30.72 Ms/s
+ prach2 = prach[aa] + (2*Ncp); // Ncp is for 30.72 Ms/s, so just multiply by 2 for I/Q
+ if (prach_sequence_length == 0) {
+ if (prachFormat == 0 || prachFormat == 1 || prachFormat == 2) {
+ dftlen=24576;
+ dft(DFT_24576,prach2,rxsigF[aa],1);
+ }
+ if (prachFormat == 1 || prachFormat == 2) {
+ dft(DFT_24576,prach2+49152,rxsigF[aa]+49152,1);
+ reps++;
+ }
+ if (prachFormat == 2) {
+ dft(DFT_24576,prach2+(49152*2),rxsigF[aa]+(49152*2),1);
+ dft(DFT_24576,prach2+(49152*3),rxsigF[aa]+(49152*3),1);
+ reps+=2;
+ }
+ if (prachFormat == 3) {
+ dftlen=6144;
+ for (int i=0;i<4;i++) dft(DFT_6144,prach2+(i*6144*2),rxsigF[aa]+(i*6144*2),1);
+ reps=4;
+ }
+ } else { // 839 sequence
+ if (prachStartSymbol == 0) prach2+=32; // 16 samples @ 30.72 Ms/s in first symbol of each half subframe (15/30 kHz only)
- if (prach_sequence_length == 0) {
- if (prachFormat == 0 || prachFormat == 1 || prachFormat == 2) {
- dftlen=98304;
- dft(DFT_98304,prach2,rxsigF[aa],1);
+ dftlen=1024;
+ dft(DFT_1024,prach2,rxsigF[aa],1);
+ if (prachFormat != 9/*C0*/) {
+ dft(DFT_1024,prach2+2048,rxsigF[aa]+2048,1);
+ reps++;
+ }
+ if (prachFormat == 5/*A2*/ || prachFormat == 6/*A3*/|| prachFormat == 8/*B4*/ || prachFormat == 10/*C2*/) {
+ dft(DFT_1024,prach2+2048*2,rxsigF[aa]+2048*2,1);
+ dft(DFT_1024,prach2+2048*3,rxsigF[aa]+2048*3,1);
+ reps+=2;
+ }
+ if (prachFormat == 6/*A3*/ || prachFormat == 8/*B4*/) {
+ dft(DFT_1024,prach2+2048*4,rxsigF[aa]+2048*4,1);
+ dft(DFT_1024,prach2+2048*5,rxsigF[aa]+2048*5,1);
+ reps+=2;
+ }
+ if (prachFormat == 8/*B4*/) {
+ for (int i=6;i<12;i++) dft(DFT_1024,prach2+(2048*i),rxsigF[aa]+(2048*i),1);
+ reps+=6;
+ }
}
- if (prachFormat == 1 || prachFormat == 2) {
- dft(DFT_98304,prach2+196608,rxsigF[aa]+196608,1);
- reps++;
- }
- if (prachFormat == 2) {
- dft(DFT_98304,prach2+(196608*2),rxsigF[aa]+(196608*2),1);
- dft(DFT_98304,prach2+(196608*3),rxsigF[aa]+(196608*3),1);
- reps+=2;
- }
- if (prachFormat == 3) {
- dftlen=24576;
- for (int i=0;i<4;i++) dft(DFT_24576,prach2+(i*2*24576),rxsigF[aa]+(i*2*24576),1);
- reps=4;
- }
- }
- else {
- if (prachStartSymbol == 0) prach2+=128; // 64 samples @ 122.88 Ms/s in first symbol of each half subframe (15/30 kHz only)
+ break;
- dftlen=4096;
- dft(DFT_4096,prach2,rxsigF[aa],1);
- if (prachFormat != 9/*C0*/) {
- dft(DFT_4096,prach2+8192,rxsigF[aa]+8192,1);
- reps++;
- }
-
- if (prachFormat == 5/*A2*/ || prachFormat == 6/*A3*/|| prachFormat == 8/*B4*/ || prachFormat == 10/*C2*/) {
- dft(DFT_4096,prach2+8192*2,rxsigF[aa]+8192*2,1);
- dft(DFT_4096,prach2+8192*3,rxsigF[aa]+8192*3,1);
- reps+=2;
- }
- if (prachFormat == 6/*A3*/ || prachFormat == 8/*B4*/) {
- dft(DFT_4096,prach2+8192*4,rxsigF[aa]+8192*4,1);
- dft(DFT_4096,prach2+8192*5,rxsigF[aa]+8192*5,1);
- reps+=2;
- }
- if (prachFormat == 8/*B4*/) {
- for (int i=6;i<12;i++) dft(DFT_4096,prach2+(8192*i),rxsigF[aa]+(8192*i),1);
- reps+=6;
- }
- }
- } else {
- AssertFatal(fp->N_RB_UL <= 217,"cannot do more than 217 PRBs with 3/4 sampling\n");
- prach2 = prach[aa] + (6*Ncp);
- // 80 MHz @ 92.16 Ms/s
- if (prach_sequence_length == 0) {
- if (prachFormat == 0 || prachFormat == 1 || prachFormat == 2) {
- dftlen=73728;
- dft(DFT_73728,prach2,rxsigF[aa],1);
- reps++;
- }
- if (prachFormat == 1 || prachFormat == 2) {
- dft(DFT_73728,prach2+(2*73728),rxsigF[aa]+(2*73728),1);
- reps++;
- }
- if (prachFormat == 3) {
- dftlen=18432;
- for (int i=0;i<4;i++) dft(DFT_18432,prach2+(i*2*18432),rxsigF[aa]+(i*2*18432),1);
- reps=4;
- }
- } else {
- if (prachStartSymbol == 0) prach2+=96; // 64 samples @ 122.88 Ms/s in first symbol of each half subframe (15/30 kHz only)
+ case 61440:
+ // 40, 50, 60 MHz @ 61.44 Ms/s
+ prach2 = prach[aa] + (4*Ncp); // Ncp is for 30.72 Ms/s, so multiply by 2 for I/Q, and 2 to bring to 61.44 Ms/s
+ if (prach_sequence_length == 0) {
+ if (prachFormat == 0 || prachFormat == 1 || prachFormat == 2) {
+ dftlen=49152;
+ dft(DFT_49152,prach2,rxsigF[aa],1);
+ }
+ if (prachFormat == 1 || prachFormat == 2) {
+ dft(DFT_49152,prach2+98304,rxsigF[aa]+98304,1);
+ reps++;
+ }
+ if (prachFormat == 2) {
+ dft(DFT_49152,prach2+(98304*2),rxsigF[aa]+(98304*2),1);
+ dft(DFT_49152,prach2+(98304*3),rxsigF[aa]+(98304*3),1);
+ reps+=2;
+ }
+ if (prachFormat == 3) {
+ dftlen=12288;
+ for (int i=0;i<4;i++) dft(DFT_12288,prach2+(i*12288*2),rxsigF[aa]+(i*12288*2),1);
+ reps=4;
+ }
+ } else { // 839 sequence
+ if (prachStartSymbol == 0) prach2+=64; // 32 samples @ 61.44 Ms/s in first symbol of each half subframe (15/30 kHz only)
- dftlen=3072;
- dft(DFT_3072,prach2,rxsigF[aa],1);
- if (prachFormat != 9/*C0*/) {
- dft(DFT_3072,prach2+6144,rxsigF[aa]+6144,1);
- reps++;
- }
-
- if (prachFormat == 5/*A2*/ || prachFormat == 6/*A3*/|| prachFormat == 8/*B4*/ || prachFormat == 10/*C2*/) {
- dft(DFT_3072,prach2+6144*2,rxsigF[aa]+6144*2,1);
- dft(DFT_3072,prach2+6144*3,rxsigF[aa]+6144*3,1);
- reps+=2;
- }
- if (prachFormat == 6/*A3*/ || prachFormat == 8/*B4*/) {
- dft(DFT_3072,prach2+6144*4,rxsigF[aa]+6144*4,1);
- dft(DFT_3072,prach2+6144*5,rxsigF[aa]+6144*5,1);
- reps+=2;
- }
- if (prachFormat == 8/*B4*/) {
- for (int i=6;i<12;i++) dft(DFT_3072,prach2+(6144*i),rxsigF[aa]+(6144*i),1);
- reps+=6;
- }
- }
+ dftlen=2048;
+ dft(DFT_2048,prach2,rxsigF[aa],1);
+ if (prachFormat != 9/*C0*/) {
+ dft(DFT_2048,prach2+4096,rxsigF[aa]+4096,1);
+ reps++;
+ }
+ if (prachFormat == 5/*A2*/ || prachFormat == 6/*A3*/|| prachFormat == 8/*B4*/ || prachFormat == 10/*C2*/) {
+ dft(DFT_2048,prach2+4096*2,rxsigF[aa]+4096*2,1);
+ dft(DFT_2048,prach2+4096*3,rxsigF[aa]+4096*3,1);
+ reps+=2;
+ }
+ if (prachFormat == 6/*A3*/ || prachFormat == 8/*B4*/) {
+ dft(DFT_2048,prach2+4096*4,rxsigF[aa]+4096*4,1);
+ dft(DFT_2048,prach2+4096*5,rxsigF[aa]+4096*5,1);
+ reps+=2;
+ }
+ if (prachFormat == 8/*B4*/) {
+ for (int i=6;i<12;i++) dft(DFT_2048,prach2+(4096*i),rxsigF[aa]+(4096*i),1);
+ reps+=6;
+ }
+ }
+ break;
+
+ case 46080:
+ // 40 MHz @ 46.08 Ms/s
+ prach2 = prach[aa] + (3*Ncp); // 46.08 is 1.5 * 30.72, times 2 for I/Q
+ if (prach_sequence_length == 0) {
+ if (prachFormat == 0 || prachFormat == 1 || prachFormat == 2) {
+ dftlen=36864;
+ dft(DFT_36864,prach2,rxsigF[aa],1);
+ }
+ if (prachFormat == 1 || prachFormat == 2) {
+ dft(DFT_36864,prach2+73728,rxsigF[aa]+73728,1);
+ reps++;
+ }
+ if (prachFormat == 2) {
+ dft(DFT_36864,prach2+(73728*2),rxsigF[aa]+(73728*2),1);
+ dft(DFT_36864,prach2+(73728*3),rxsigF[aa]+(73728*3),1);
+ reps+=2;
+ }
+ if (prachFormat == 3) {
+ dftlen=9216;
+ for (int i=0;i<4;i++) dft(DFT_9216,prach2+(i*9216*2),rxsigF[aa]+(i*9216*2),1);
+ reps=4;
+ }
+ } else { // 839 sequence
+ if (prachStartSymbol == 0) prach2+=48; // 24 samples @ 46.08 Ms/s in first symbol of each half subframe (15/30 kHz only)
+
+ dftlen=1536;
+ dft(DFT_1536,prach2,rxsigF[aa],1);
+ if (prachFormat != 9/*C0*/) {
+ dft(DFT_1536,prach2+3072,rxsigF[aa]+3072,1);
+ reps++;
+ }
+ if (prachFormat == 5/*A2*/ || prachFormat == 6/*A3*/|| prachFormat == 8/*B4*/ || prachFormat == 10/*C2*/) {
+ dft(DFT_1536,prach2+3072*2,rxsigF[aa]+3072*2,1);
+ dft(DFT_1536,prach2+3072*3,rxsigF[aa]+3072*3,1);
+ reps+=2;
+ }
+ if (prachFormat == 6/*A3*/ || prachFormat == 8/*B4*/) {
+ dft(DFT_1536,prach2+3072*4,rxsigF[aa]+3072*4,1);
+ dft(DFT_1536,prach2+3072*5,rxsigF[aa]+3072*5,1);
+ reps+=2;
+ }
+ if (prachFormat == 8/*B4*/) {
+ for (int i=6;i<12;i++) dft(DFT_1536,prach2+(3072*i),rxsigF[aa]+(3072*i),1);
+ reps+=6;
+ }
+ }
+ break;
+
+ case 122880:
+ // 70, 80, 90, 100 MHz @ 122.88 Ms/s
+ prach2 = prach[aa] + (8*Ncp);
+ if (prach_sequence_length == 0) {
+ if (prachFormat == 0 || prachFormat == 1 || prachFormat == 2) {
+ dftlen=98304;
+ dft(DFT_98304,prach2,rxsigF[aa],1);
+ }
+ if (prachFormat == 1 || prachFormat == 2) {
+ dft(DFT_98304,prach2+196608,rxsigF[aa]+196608,1);
+ reps++;
+ }
+ if (prachFormat == 2) {
+ dft(DFT_98304,prach2+(196608*2),rxsigF[aa]+(196608*2),1);
+ dft(DFT_98304,prach2+(196608*3),rxsigF[aa]+(196608*3),1);
+ reps+=2;
+ }
+ if (prachFormat == 3) {
+ dftlen=24576;
+ for (int i=0;i<4;i++) dft(DFT_24576,prach2+(i*2*24576),rxsigF[aa]+(i*2*24576),1);
+ reps=4;
+ }
+ } else { // 839 sequence
+ if (prachStartSymbol == 0) prach2+=128; // 64 samples @ 122.88 Ms/s in first symbol of each half subframe (15/30 kHz only)
+
+ dftlen=4096;
+ dft(DFT_4096,prach2,rxsigF[aa],1);
+ if (prachFormat != 9/*C0*/) {
+ dft(DFT_4096,prach2+8192,rxsigF[aa]+8192,1);
+ reps++;
+ }
+
+ if (prachFormat == 5/*A2*/ || prachFormat == 6/*A3*/|| prachFormat == 8/*B4*/ || prachFormat == 10/*C2*/) {
+ dft(DFT_4096,prach2+8192*2,rxsigF[aa]+8192*2,1);
+ dft(DFT_4096,prach2+8192*3,rxsigF[aa]+8192*3,1);
+ reps+=2;
+ }
+ if (prachFormat == 6/*A3*/ || prachFormat == 8/*B4*/) {
+ dft(DFT_4096,prach2+8192*4,rxsigF[aa]+8192*4,1);
+ dft(DFT_4096,prach2+8192*5,rxsigF[aa]+8192*5,1);
+ reps+=2;
+ }
+ if (prachFormat == 8/*B4*/) {
+ for (int i=6;i<12;i++) dft(DFT_4096,prach2+(8192*i),rxsigF[aa]+(8192*i),1);
+ reps+=6;
+ }
+ }
+ break;
+
+ case 92160:
+ // 80, 90 MHz @ 92.16 Ms/s
+ prach2 = prach[aa] + (6*Ncp);
+ if (prach_sequence_length == 0) {
+ if (prachFormat == 0 || prachFormat == 1 || prachFormat == 2) {
+ dftlen=73728;
+ dft(DFT_73728,prach2,rxsigF[aa],1);
+ }
+ if (prachFormat == 1 || prachFormat == 2) {
+ dft(DFT_73728,prach2+147456,rxsigF[aa]+147456,1);
+ reps++;
+ }
+ if (prachFormat == 2) {
+ dft(DFT_73728,prach2+(147456*2),rxsigF[aa]+(147456*2),1);
+ dft(DFT_73728,prach2+(147456*3),rxsigF[aa]+(147456*3),1);
+ reps+=2;
+ }
+ if (prachFormat == 3) {
+ dftlen=18432;
+ for (int i=0;i<4;i++) dft(DFT_18432,prach2+(i*2*18432),rxsigF[aa]+(i*2*18432),1);
+ reps=4;
+ }
+ } else {
+ if (prachStartSymbol == 0) prach2+=96; // 64 samples @ 122.88 Ms/s in first symbol of each half subframe (15/30 kHz only)
+
+ dftlen=3072;
+ dft(DFT_3072,prach2,rxsigF[aa],1);
+ if (prachFormat != 9/*C0*/) {
+ dft(DFT_3072,prach2+6144,rxsigF[aa]+6144,1);
+ reps++;
+ }
+
+ if (prachFormat == 5/*A2*/ || prachFormat == 6/*A3*/|| prachFormat == 8/*B4*/ || prachFormat == 10/*C2*/) {
+ dft(DFT_3072,prach2+6144*2,rxsigF[aa]+6144*2,1);
+ dft(DFT_3072,prach2+6144*3,rxsigF[aa]+6144*3,1);
+ reps+=2;
+ }
+ if (prachFormat == 6/*A3*/ || prachFormat == 8/*B4*/) {
+ dft(DFT_3072,prach2+6144*4,rxsigF[aa]+6144*4,1);
+ dft(DFT_3072,prach2+6144*5,rxsigF[aa]+6144*5,1);
+ reps+=2;
+ }
+ if (prachFormat == 8/*B4*/) {
+ for (int i=6;i<12;i++) dft(DFT_3072,prach2+(6144*i),rxsigF[aa]+(6144*i),1);
+ reps+=6;
+ }
+ }
+ break;
+ default:
+ AssertFatal(1==0,"sample_rate %f MHz not support for NR PRACH yet\n", fp->samples_per_subframe / 1000.0);
}
}
- }
else if (mu==3) {
if (fp->threequarter_fs) {
AssertFatal(1==0,"3/4 sampling not supported for numerology %d\n",mu);
diff --git a/openair1/PHY/NR_TRANSPORT/nr_ulsch_decoding.c b/openair1/PHY/NR_TRANSPORT/nr_ulsch_decoding.c
index d990176d79..b572a6e5bb 100644
--- a/openair1/PHY/NR_TRANSPORT/nr_ulsch_decoding.c
+++ b/openair1/PHY/NR_TRANSPORT/nr_ulsch_decoding.c
@@ -320,7 +320,7 @@ void nr_processULSegment(void* arg) {
Kr_bytes = Kr>>3;
K_bits_F = Kr-ulsch_harq->F;
- t_nrLDPC_time_stats procTime;
+ t_nrLDPC_time_stats procTime = {0};
t_nrLDPC_time_stats* p_procTime = &procTime ;
//start_meas(&phy_vars_gNB->ulsch_deinterleaving_stats);
diff --git a/openair1/PHY/NR_TRANSPORT/nr_ulsch_demodulation.c b/openair1/PHY/NR_TRANSPORT/nr_ulsch_demodulation.c
index 42d6cfad7a..f25aef8813 100644
--- a/openair1/PHY/NR_TRANSPORT/nr_ulsch_demodulation.c
+++ b/openair1/PHY/NR_TRANSPORT/nr_ulsch_demodulation.c
@@ -345,6 +345,9 @@ void nr_ulsch_extract_rbs_single(int32_t **rxdataF,
n = 0;
k_prime = 0;
+ rxF_ext_index = 0;
+ ul_ch0_ext_index = 0;
+ ul_ch0_index = 0;
if (is_dmrs_symbol == 0) {
//
@@ -406,7 +409,7 @@ void nr_ulsch_scale_channel(int **ul_ch_estimates_ext,
#if defined(__x86_64__)||defined(__i386__)
short rb, ch_amp;
- unsigned char aatx,aarx;
+ unsigned char aarx;
__m128i *ul_ch128, ch_amp128;
// Determine scaling amplitude based the symbol
@@ -424,8 +427,7 @@ void nr_ulsch_scale_channel(int **ul_ch_estimates_ext,
int off = 0;
#endif
- for (aatx=0; aatx < frame_parms->nb_antenna_ports_gNB; aatx++) {
- for (aarx=0; aarx < frame_parms->nb_antennas_rx; aarx++) {
+ for (aarx=0; aarx < frame_parms->nb_antennas_rx; aarx++) {
ul_ch128 = (__m128i *)&ul_ch_estimates_ext[aarx][symbol*(off+(nb_rb*NR_NB_SC_PER_RB))];
@@ -454,7 +456,6 @@ void nr_ulsch_scale_channel(int **ul_ch_estimates_ext,
}
}
}
- }
#endif
}
@@ -471,6 +472,7 @@ void nr_ulsch_channel_level(int **ul_ch_estimates_ext,
short rb;
unsigned char aatx, aarx;
+ char nb_antennas_ue_tx = 1;
__m128i *ul_ch128, avg128U;
int16_t x = factor2(len);
@@ -482,7 +484,7 @@ void nr_ulsch_channel_level(int **ul_ch_estimates_ext,
int off = 0;
#endif
- for (aatx = 0; aatx < frame_parms->nb_antennas_tx; aatx++)
+ for (aatx = 0; aatx < nb_antennas_ue_tx; aatx++)
for (aarx = 0; aarx < frame_parms->nb_antennas_rx; aarx++) {
//clear average level
avg128U = _mm_setzero_si128();
@@ -623,11 +625,12 @@ void nr_ulsch_channel_compensation(int **rxdataF_ext,
unsigned short rb;
unsigned char aatx,aarx;
+ char nb_antennas_ue_tx = 1;
__m128i *ul_ch128,*ul_ch128_2,*ul_ch_mag128,*ul_ch_mag128b,*rxdataF128,*rxdataF_comp128,*rho128;
__m128i mmtmpD0,mmtmpD1,mmtmpD2,mmtmpD3,QAM_amp128,QAM_amp128b;
QAM_amp128b = _mm_setzero_si128();
- for (aatx=0; aatxnb_antennas_tx; aatx++) {
+ for (aatx=0; aatxframe_parms;
nfapi_nr_pusch_pdu_t *rel15_ul = &gNB->ulsch[ulsch_id][0]->harq_processes[harq_pid]->ulsch_pdu;
@@ -1262,7 +1266,7 @@ int nr_rx_pusch(PHY_VARS_gNB *gNB,
avgs = 0;
- for (aatx=0;aatxnb_antennas_tx;aatx++)
+ for (aatx=0;aatxnb_antennas_rx;aarx++)
avgs = cmax(avgs,avg[(aatx<<1)+aarx]);
@@ -1280,7 +1284,7 @@ int nr_rx_pusch(PHY_VARS_gNB *gNB,
gNB->pusch_vars[ulsch_id]->ul_ch_mag0,
gNB->pusch_vars[ulsch_id]->ul_ch_magb0,
gNB->pusch_vars[ulsch_id]->rxdataF_comp,
- (frame_parms->nb_antennas_tx>1) ? gNB->pusch_vars[ulsch_id]->rho : NULL,
+ (nb_antennas_ue_tx>1) ? gNB->pusch_vars[ulsch_id]->rho : NULL,
frame_parms,
symbol,
dmrs_symbol_flag,
diff --git a/openair1/PHY/NR_TRANSPORT/pucch_rx.c b/openair1/PHY/NR_TRANSPORT/pucch_rx.c
index 2d1fdff4be..70481fe67e 100644
--- a/openair1/PHY/NR_TRANSPORT/pucch_rx.c
+++ b/openair1/PHY/NR_TRANSPORT/pucch_rx.c
@@ -1604,7 +1604,7 @@ void nr_decode_pucch2(PHY_VARS_gNB *gNB,
re_offset = (12*pucch_pdu->prb_start) + (12*pucch_pdu->bwp_start) + frame_parms->first_carrier_offset;
// estimate CQI for MAC (from antenna port 0 only)
int SNRtimes10 = dB_fixed_times10(signal_energy_nodc(&rxdataF[0][(l2*frame_parms->ofdm_symbol_size)+re_offset],12*pucch_pdu->prb_size)) - (10*gNB->measurements.n0_power_tot_dB);
- int cqi;
+ int cqi,bit_left;
if (SNRtimes10 < -640) cqi=0;
else if (SNRtimes10 > 635) cqi=255;
else cqi=(640+SNRtimes10)/5;
@@ -1628,7 +1628,8 @@ void nr_decode_pucch2(PHY_VARS_gNB *gNB,
uci_pdu->harq.harq_payload[i] = decodedPayload[0] & 255;
decodedPayload[0]>>=8;
}
- uci_pdu->harq.harq_payload[i] = decodedPayload[0] & ((1<<(pucch_pdu->bit_len_harq&7))-1);
+ bit_left = pucch_pdu->bit_len_harq-((harq_bytes-1)<<3);
+ uci_pdu->harq.harq_payload[i] = decodedPayload[0] & ((1<>= pucch_pdu->bit_len_harq;
}
@@ -1642,6 +1643,7 @@ void nr_decode_pucch2(PHY_VARS_gNB *gNB,
// csi
if (pucch_pdu->bit_len_csi_part1>0) {
uci_pdu->pduBitmap|=4;
+ uci_pdu->csi_part1.csi_part1_bit_len=pucch_pdu->bit_len_csi_part1;
int csi_part1_bytes=pucch_pdu->bit_len_csi_part1>>3;
if ((pucch_pdu->bit_len_csi_part1&7) > 0) csi_part1_bytes++;
uci_pdu->csi_part1.csi_part1_payload = (uint8_t*)malloc(csi_part1_bytes);
@@ -1651,7 +1653,8 @@ void nr_decode_pucch2(PHY_VARS_gNB *gNB,
uci_pdu->csi_part1.csi_part1_payload[i] = decodedPayload[0] & 255;
decodedPayload[0]>>=8;
}
- uci_pdu->csi_part1.csi_part1_payload[i] = decodedPayload[0] & ((1<<(pucch_pdu->bit_len_csi_part1&7))-1);
+ bit_left = pucch_pdu->bit_len_csi_part1-((csi_part1_bytes-1)<<3);
+ uci_pdu->csi_part1.csi_part1_payload[i] = decodedPayload[0] & ((1<>= pucch_pdu->bit_len_csi_part1;
}
diff --git a/openair1/PHY/NR_UE_ESTIMATION/nr_dl_channel_estimation.c b/openair1/PHY/NR_UE_ESTIMATION/nr_dl_channel_estimation.c
index 6cb0a612e9..69f8a39e77 100644
--- a/openair1/PHY/NR_UE_ESTIMATION/nr_dl_channel_estimation.c
+++ b/openair1/PHY/NR_UE_ESTIMATION/nr_dl_channel_estimation.c
@@ -77,9 +77,9 @@ int nr_pbch_dmrs_correlation(PHY_VARS_NR_UE *ue,
// generate pilot
nr_pbch_dmrs_rx(dmrss,ue->nr_gold_pbch[n_hf][ssb_index], &pilot[0]);
- int re_offset = ssb_offset;
for (aarx=0; aarxframe_parms.nb_antennas_rx; aarx++) {
+ int re_offset = ssb_offset;
pil = (int16_t *)&pilot[0];
rxF = (int16_t *)&rxdataF[aarx][(symbol_offset+k+re_offset)];
@@ -277,9 +277,9 @@ int nr_pbch_channel_estimation(PHY_VARS_NR_UE *ue,
// generate pilot
nr_pbch_dmrs_rx(dmrss,ue->nr_gold_pbch[n_hf][ssb_index], &pilot[0]);
- int re_offset = ssb_offset;
for (aarx=0; aarxframe_parms.nb_antennas_rx; aarx++) {
+ int re_offset = ssb_offset;
pil = (int16_t *)&pilot[0];
rxF = (int16_t *)&rxdataF[aarx][(symbol_offset+k+re_offset)];
dl_ch = (int16_t *)&dl_ch_estimates[aarx][ch_offset];
@@ -456,12 +456,12 @@ int nr_pbch_channel_estimation(PHY_VARS_NR_UE *ue,
// do ifft of channel estimate
for (aarx=0; aarxframe_parms.nb_antennas_rx; aarx++)
for (p=0; pframe_parms.nb_antenna_ports_gNB; p++) {
- if (ue->pbch_vars[eNB_offset]->dl_ch_estimates[(p<<1)+aarx])
+ if (ue->pbch_vars[eNB_offset]->dl_ch_estimates[(p*ue->frame_parms.nb_antennas_rx)+aarx])
{
LOG_D(PHY,"Channel Impulse Computation Slot %d ThreadId %d Symbol %d ch_offset %d\n", Ns, proc->thread_id, symbol, ch_offset);
idft(idftsizeidx,
- (int16_t*) &ue->pbch_vars[eNB_offset]->dl_ch_estimates[(p<<1)+aarx][ch_offset],
- (int16_t*) ue->pbch_vars[eNB_offset]->dl_ch_estimates_time[(p<<1)+aarx],1);
+ (int16_t*) &ue->pbch_vars[eNB_offset]->dl_ch_estimates[(p*ue->frame_parms.nb_antennas_rx)+aarx][ch_offset],
+ (int16_t*) ue->pbch_vars[eNB_offset]->dl_ch_estimates_time[(p*ue->frame_parms.nb_antennas_rx)+aarx],1);
}
}
}
@@ -672,7 +672,7 @@ int nr_pdsch_channel_estimation(PHY_VARS_NR_UE *ue,
int **rxdataF=ue->common_vars.common_vars_rx_data_per_thread[proc->thread_id].rxdataF;
if (ue->high_speed_flag == 0)
- ch_offset = ue->frame_parms.ofdm_symbol_size ;
+ ch_offset = ue->frame_parms.ofdm_symbol_size;
else
ch_offset = ue->frame_parms.ofdm_symbol_size*symbol;
@@ -690,11 +690,11 @@ int nr_pdsch_channel_estimation(PHY_VARS_NR_UE *ue,
uint16_t rb_offset = (bwp_start_subcarrier - ue->frame_parms.first_carrier_offset) / 12 - BWPStart;
uint8_t config_type = ue->dmrs_DownlinkConfig.pdsch_dmrs_type;
int8_t delta = get_delta(p, config_type);
- nr_pdsch_dmrs_rx(ue,Ns,ue->nr_gold_pdsch[eNB_offset][Ns][symbol][0], &pilot[0],1000,0,nb_rb_pdsch+rb_offset);
+ nr_pdsch_dmrs_rx(ue,Ns,ue->nr_gold_pdsch[eNB_offset][Ns][symbol][0], &pilot[0],1000+p,0,nb_rb_pdsch+rb_offset);
if (config_type == pdsch_dmrs_type1){
nushift = (p>>1)&1;
- ue->frame_parms.nushift = nushift;
+ if (p<4) ue->frame_parms.nushift = nushift;
switch (delta) {
case 0://port 0,1
@@ -734,7 +734,7 @@ int nr_pdsch_channel_estimation(PHY_VARS_NR_UE *ue,
}
} else {//pdsch_dmrs_type2
nushift = delta;
- ue->frame_parms.nushift = nushift;
+ if (p<6) ue->frame_parms.nushift = nushift;
switch (delta) {
case 0://port 0,1
fl = filt8_l2;//left interpolation Filter should be fml
diff --git a/openair1/PHY/NR_UE_TRANSPORT/dci_nr.c b/openair1/PHY/NR_UE_TRANSPORT/dci_nr.c
index abc944bc00..8176514eb4 100644
--- a/openair1/PHY/NR_UE_TRANSPORT/dci_nr.c
+++ b/openair1/PHY/NR_UE_TRANSPORT/dci_nr.c
@@ -402,11 +402,12 @@ void nr_pdcch_extract_rbs_single(int32_t **rxdataF,
c_rb = 0;
for (int rb=0;rb>3] & (1<<(7-(c_rb_by6&7)))) == 0) {
- c_rb+=6;
- c_rb_by6 = c_rb/6;
- }
+ c_rb+=6;
+ c_rb_by6 = c_rb/6;
+ }
LOG_DDD("c_rb=%d\n",c_rb);
rxF=NULL;
diff --git a/openair1/PHY/NR_UE_TRANSPORT/nr_dlsch_decoding.c b/openair1/PHY/NR_UE_TRANSPORT/nr_dlsch_decoding.c
index 429bd9a836..d5c0245fdc 100644
--- a/openair1/PHY/NR_UE_TRANSPORT/nr_dlsch_decoding.c
+++ b/openair1/PHY/NR_UE_TRANSPORT/nr_dlsch_decoding.c
@@ -261,7 +261,7 @@ uint32_t nr_dlsch_decoding(PHY_VARS_NR_UE *phy_vars_ue,
int8_t llrProcBuf[NR_LDPC_MAX_NUM_LLR] __attribute__ ((aligned(32)));
t_nrLDPC_dec_params decParams;
t_nrLDPC_dec_params* p_decParams = &decParams;
- t_nrLDPC_time_stats procTime;
+ t_nrLDPC_time_stats procTime = {0};
t_nrLDPC_time_stats* p_procTime =&procTime ;
if (!harq_process) {
@@ -678,7 +678,7 @@ uint32_t nr_dlsch_decoding(PHY_VARS_NR_UE *phy_vars_ue,
memcpy(harq_process->b+offset,
harq_process->c[r],
- Kr_bytes- - (harq_process->F>>3) -((harq_process->C>1)?3:0));
+ Kr_bytes - (harq_process->F>>3) - ((harq_process->C>1)?3:0));
offset += (Kr_bytes - (harq_process->F>>3) - ((harq_process->C>1)?3:0));
if (LOG_DEBUGFLAG(DEBUG_DLSCH_DECOD))
diff --git a/openair1/PHY/NR_UE_TRANSPORT/nr_dlsch_demodulation.c b/openair1/PHY/NR_UE_TRANSPORT/nr_dlsch_demodulation.c
index 9a31257244..35c4a6e8cb 100644
--- a/openair1/PHY/NR_UE_TRANSPORT/nr_dlsch_demodulation.c
+++ b/openair1/PHY/NR_UE_TRANSPORT/nr_dlsch_demodulation.c
@@ -84,8 +84,8 @@ unsigned char offset_mumimo_llr_drange[29][3]={{8,8,8},{7,7,7},{7,7,7},{7,7,7},{
*/
//unsigned char offset_mumimo_llr_drange[29][3]= {{0, 6, 5},{0, 4, 5},{0, 4, 5},{0, 5, 4},{0, 5, 6},{0, 5, 3},{0, 4, 4},{0, 4, 4},{0, 3, 3},{0, 1, 2},{1, 1, 0},{1, 3, 2},{3, 4, 1},{2, 0, 0},{2, 2, 2},{1, 1, 1},{2, 1, 0},{2, 1, 1},{1, 0, 1},{1, 0, 1},{0, 0, 0},{1, 0, 0},{0, 0, 0},{0, 1, 0},{1, 0, 0},{0, 0, 0},{0, 0, 0},{0, 0, 0},{0, 0, 0}};
-
-extern void print_shorts(char *s,int16_t *x);
+#define print_ints(s,x) printf("%s %d %d %d %d\n",s,(x)[0],(x)[1],(x)[2],(x)[3])
+#define print_shorts(s,x) printf("%s %d,%d,%d,%d,%d,%d,%d,%d\n",s,(x)[0],(x)[1],(x)[2],(x)[3],(x)[4],(x)[5],(x)[6],(x)[7])
static void nr_dlsch_dual_stream_correlation_core(int **dl_ch_estimates_ext,
int **dl_ch_estimates_ext_i,
@@ -96,6 +96,16 @@ static void nr_dlsch_dual_stream_correlation_core(int **dl_ch_estimates_ext,
int length,
int start_point);
+uint8_t nr_zero_forcing_rx_2layers(int **rxdataF_comp,
+ int **dl_ch_mag,
+ int **dl_ch_magb,
+ int **dl_ch_estimates_ext,
+ unsigned short nb_rb,
+ unsigned char n_rx,
+ unsigned char mod_order,
+ int shift,
+ unsigned char symbol);
+
static void nr_dlsch_layer_demapping(int16_t **llr_cw,
uint8_t Nl,
uint8_t mod_order,
@@ -113,7 +123,7 @@ static int nr_dlsch_llr(NR_UE_PDSCH **pdsch_vars,
RX_type_t rx_type,
unsigned char harq_pid,
unsigned char gNB_id,
- unsigned char eNB_id_i,
+ unsigned char gNB_id_i,
unsigned char first_symbol_flag,
unsigned char symbol,
unsigned short nb_rb,
@@ -129,7 +139,7 @@ int nr_rx_pdsch(PHY_VARS_NR_UE *ue,
UE_nr_rxtx_proc_t *proc,
PDSCH_t type,
unsigned char gNB_id,
- unsigned char eNB_id_i, //if this == ue->n_connected_gNB, we assume MU interference
+ unsigned char gNB_id_i,
uint32_t frame,
uint8_t nr_slot_rx,
unsigned char symbol,
@@ -145,7 +155,7 @@ int nr_rx_pdsch(PHY_VARS_NR_UE *ue,
PHY_NR_MEASUREMENTS *measurements = &ue->measurements;
NR_UE_DLSCH_t **dlsch;
- int avg[4];
+ int avg[16];
// int avg_0[2];
// int avg_1[2];
@@ -173,7 +183,7 @@ int nr_rx_pdsch(PHY_VARS_NR_UE *ue,
//int16_t *pllr_symbol_cw1_deint;
//uint16_t bundle_L = 2;
uint8_t pilots=0;
- uint8_t config_type = ue->dmrs_DownlinkConfig.pdsch_dmrs_type;
+ uint8_t config_type;// We should not use ue->dmrs_DownlinkConfig.pdsch_dmrs_type;
uint16_t n_tx=1, n_rx=1;
int32_t median[16];
uint32_t len;
@@ -331,90 +341,44 @@ int nr_rx_pdsch(PHY_VARS_NR_UE *ue,
#endif
pilots = ((1<dlDmrsSymbPos)>0 ? 1 : 0;
+ config_type = dlsch0_harq->dmrsConfigType;
- if (frame_parms->nb_antenna_ports_gNB>1 && beamforming_mode==0) {
-#ifdef DEBUG_DLSCH_MOD
- LOG_I(PHY,"dlsch: using pmi %x (%p)\n",pmi2hex_2Ar1(dlsch0_harq->pmi_alloc),dlsch[0]);
-#endif
-
+ if (beamforming_mode==0) {//No beamforming
#if UE_TIMING_TRACE
start_meas(&ue->generic_stat_bis[proc->thread_id][slot]);
#endif
- nb_rb = nr_dlsch_extract_rbs_dual(common_vars->common_vars_rx_data_per_thread[proc->thread_id].rxdataF,
- pdsch_vars[gNB_id]->dl_ch_estimates,
- pdsch_vars[gNB_id]->rxdataF_ext,
- pdsch_vars[gNB_id]->dl_ch_estimates_ext,
- dlsch0_harq->pmi_alloc,
- pdsch_vars[gNB_id]->pmi_ext,
- symbol,
- pilots,
- start_rb,
- nb_rb_pdsch,
- nr_slot_rx,
- ue->high_speed_flag,
- frame_parms,
- dlsch0_harq->mimo_mode);
-#ifdef DEBUG_DLSCH_MOD
- printf("dlsch: using pmi %lx, pmi_ext ",pmi2hex_2Ar1(dlsch0_harq->pmi_alloc));
- for (rb=0;rbpmi_ext[rb]);
- printf("\n");
-#endif
-
- if (rx_type >= rx_IC_single_stream) {
- if (eNB_id_i < ue->n_connected_gNB) // we are in TM5
- nb_rb = nr_dlsch_extract_rbs_dual(common_vars->common_vars_rx_data_per_thread[proc->thread_id].rxdataF,
- pdsch_vars[gNB_id]->dl_ch_estimates,
- pdsch_vars[eNB_id_i]->rxdataF_ext,
- pdsch_vars[eNB_id_i]->dl_ch_estimates_ext,
- dlsch0_harq->pmi_alloc,
- pdsch_vars[eNB_id_i]->pmi_ext,
- symbol,
- pilots,
- start_rb,
- nb_rb_pdsch,
- nr_slot_rx,
- ue->high_speed_flag,
- frame_parms,
- dlsch0_harq->mimo_mode);
- else
- nb_rb = nr_dlsch_extract_rbs_dual(common_vars->common_vars_rx_data_per_thread[proc->thread_id].rxdataF,
- pdsch_vars[gNB_id]->dl_ch_estimates,
- pdsch_vars[eNB_id_i]->rxdataF_ext,
- pdsch_vars[eNB_id_i]->dl_ch_estimates_ext,
- dlsch0_harq->pmi_alloc,
- pdsch_vars[eNB_id_i]->pmi_ext,
- symbol,
- pilots,
- start_rb,
- nb_rb_pdsch,
- nr_slot_rx,
- ue->high_speed_flag,
- frame_parms,
- dlsch0_harq->mimo_mode);
- }
- } else if (beamforming_mode==0) { //else if nb_antennas_ports_gNB==1 && beamforming_mode == 0
- //printf("start nr dlsch extract nr_slot_rx %d thread id %d \n", nr_slot_rx, proc->thread_id);
- nb_rb = nr_dlsch_extract_rbs_single(common_vars->common_vars_rx_data_per_thread[proc->thread_id].rxdataF,
- pdsch_vars[gNB_id]->dl_ch_estimates,
- pdsch_vars[gNB_id]->rxdataF_ext,
- pdsch_vars[gNB_id]->dl_ch_estimates_ext,
- dlsch0_harq->pmi_alloc,
- pdsch_vars[gNB_id]->pmi_ext,
- symbol,
- pilots,
- config_type,
- start_rb + dlsch0_harq->BWPStart,
- nb_rb_pdsch,
- nr_slot_rx,
- ue->high_speed_flag,
- frame_parms,
- dlsch0_harq->dlDmrsSymbPos);
-
- } /*else if(beamforming_mode>7) {
+ if (dlsch0_harq->Nl > 1)//More than or equal 2 layers
+ nb_rb = nr_dlsch_extract_rbs_multiple(common_vars->common_vars_rx_data_per_thread[proc->thread_id].rxdataF,
+ pdsch_vars[gNB_id]->dl_ch_estimates,
+ pdsch_vars[gNB_id]->rxdataF_ext,
+ pdsch_vars[gNB_id]->dl_ch_estimates_ext,
+ symbol,
+ pilots,
+ config_type,
+ start_rb + dlsch0_harq->BWPStart,
+ nb_rb_pdsch,
+ dlsch0_harq->n_dmrs_cdm_groups,
+ dlsch0_harq->Nl,
+ frame_parms,
+ dlsch0_harq->dlDmrsSymbPos);
+ else// one layer
+ nb_rb = nr_dlsch_extract_rbs_single(common_vars->common_vars_rx_data_per_thread[proc->thread_id].rxdataF,
+ pdsch_vars[gNB_id]->dl_ch_estimates,
+ pdsch_vars[gNB_id]->rxdataF_ext,
+ pdsch_vars[gNB_id]->dl_ch_estimates_ext,
+ symbol,
+ pilots,
+ config_type,
+ start_rb + dlsch0_harq->BWPStart,
+ nb_rb_pdsch,
+ dlsch0_harq->n_dmrs_cdm_groups,
+ frame_parms,
+ dlsch0_harq->dlDmrsSymbPos);
+ }
+ else if(beamforming_mode>7) {
LOG_W(PHY,"dlsch_demodulation: beamforming mode not supported yet.\n");
- }*/
-
+ }
+
//printf("nb_rb = %d, gNB_id %d\n",nb_rb,gNB_id);
if (nb_rb==0) {
LOG_D(PHY,"dlsch_demodulation.c: nb_rb=0\n");
@@ -437,16 +401,18 @@ int nr_rx_pdsch(PHY_VARS_NR_UE *ue,
#if UE_TIMING_TRACE
start_meas(&ue->generic_stat_bis[proc->thread_id][slot]);
#endif
- n_tx = frame_parms->nb_antenna_ports_gNB;
+ n_tx = dlsch0_harq->Nl;
n_rx = frame_parms->nb_antennas_rx;
nr_dlsch_scale_channel(pdsch_vars[gNB_id]->dl_ch_estimates_ext,
- frame_parms,
- dlsch,
- symbol,
- pilots,
- len,
- nb_rb);
+ frame_parms,
+ n_tx,
+ n_rx,
+ dlsch,
+ symbol,
+ pilots,
+ len,
+ nb_rb);
#if UE_TIMING_TRACE
stop_meas(&ue->generic_stat_bis[proc->thread_id][slot]);
@@ -462,42 +428,40 @@ int nr_rx_pdsch(PHY_VARS_NR_UE *ue,
#endif
if (first_symbol_flag==1) {
if (beamforming_mode==0){
- if (dlsch0_harq->mimo_modedl_ch_estimates_ext,
- frame_parms,
- avg,
- symbol,
- len,
- nb_rb);
- avgs = 0;
- for (aatx=0;aatxnb_antenna_ports_gNB;aatx++)
- for (aarx=0;aarxnb_antennas_rx;aarx++)
- avgs = cmax(avgs,avg[(aatx<<1)+aarx]);
+ nr_dlsch_channel_level(pdsch_vars[gNB_id]->dl_ch_estimates_ext,
+ frame_parms,
+ n_tx,
+ avg,
+ symbol,
+ len,
+ nb_rb);
+ avgs = 0;
+ for (aatx=0;aatxnb_antennas_rx+aarx]);
+ avgs = cmax(avgs,avg[(aatx*frame_parms->nb_antennas_rx)+aarx]);
+ //LOG_I(PHY, "avgs Power per SC is %d\n", avgs);
+ median[(aatx*frame_parms->nb_antennas_rx)+aarx] = avg[(aatx*frame_parms->nb_antennas_rx)+aarx];
+ }
+ pdsch_vars[gNB_id]->log2_maxh = (log2_approx(avgs)/2)+3;
+ //LOG_I(PHY, "avgs Power per SC is %d lg2_maxh %d\n", avgs, pdsch_vars[gNB_id]->log2_maxh);
- pdsch_vars[gNB_id]->log2_maxh = (log2_approx(avgs)/2)+3;
- }
- else if (dlsch0_harq->mimo_mode == NR_DUALSTREAM)
- {
- nr_dlsch_channel_level_median(pdsch_vars[gNB_id]->dl_ch_estimates_ext,
- median,
- n_tx,
- n_rx,
- 2*len,// subcarriers Re Im
- 0);
+ if (dlsch0_harq->mimo_mode == NR_DUALSTREAM) {
+ nr_dlsch_channel_level_median(pdsch_vars[gNB_id]->dl_ch_estimates_ext,
+ median,
+ n_tx,
+ n_rx,
+ len,
+ symbol*nb_rb*12);
- for (aatx = 0; aatx < n_tx; ++aatx)
- {
- for (aarx = 0; aarx < n_rx; ++aarx)
- {
- avgs = cmax(avgs, median[aatx*n_rx + aarx]);
- }
- }
-
- pdsch_vars[gNB_id]->log2_maxh = (log2_approx(avgs)/2) + 1; // this might need to be tuned
-
- }
+ for (aatx = 0; aatx < n_tx; aatx++) {
+ for (aarx = 0; aarx < n_rx; aarx++) {
+ avgs = cmax(avgs, median[aatx*n_rx + aarx]);
+ }
+ }
+ pdsch_vars[gNB_id]->log2_maxh = (log2_approx(avgs)/2) + 1;
+ }
}
- //#ifdef UE_DEBUG_TRACE
LOG_D(PHY,"[DLSCH] AbsSubframe %d.%d log2_maxh = %d [log2_maxh0 %d log2_maxh1 %d] (%d,%d)\n",
frame%1024,
nr_slot_rx,
@@ -506,22 +470,8 @@ int nr_rx_pdsch(PHY_VARS_NR_UE *ue,
pdsch_vars[gNB_id]->log2_maxh1,
avg[0],
avgs);
- //LOG_D(PHY,"[DLSCH] mimo_mode = %d\n", dlsch0_harq->mimo_mode);
- //#endif
-
- //wait until pdcch is decoded
- //proc->channel_level = 1;
}
- /*
- uint32_t wait = 0;
- while(proc->channel_level == 0)
- {
- usleep(1);
- wait++;
- }
- */
-
#if T_TRACER
if (type == PDSCH)
{
@@ -546,58 +496,25 @@ int nr_rx_pdsch(PHY_VARS_NR_UE *ue,
// Now channel compensation
if (dlsch0_harq->mimo_moderxdataF_ext,
- pdsch_vars[gNB_id]->dl_ch_estimates_ext,
- pdsch_vars[gNB_id]->dl_ch_mag0,
- pdsch_vars[gNB_id]->dl_ch_magb0,
- pdsch_vars[gNB_id]->dl_ch_magr0,
- pdsch_vars[gNB_id]->rxdataF_comp0,
- (aatx>1) ? pdsch_vars[gNB_id]->rho : NULL,
- frame_parms,
- symbol,
- pilots,
- first_symbol_flag,
- dlsch0_harq->Qm,
- nb_rb,
- pdsch_vars[gNB_id]->log2_maxh,
- measurements); // log2_maxh+I0_shift
- /*if (symbol == 5) {
- write_output("rxF_comp_d.m","rxF_c_d",&pdsch_vars[gNB_id]->rxdataF_comp0[0][symbol*frame_parms->N_RB_DL*12],frame_parms->N_RB_DL*12,1,1);
- } */
+ pdsch_vars[gNB_id]->dl_ch_estimates_ext,
+ pdsch_vars[gNB_id]->dl_ch_mag0,
+ pdsch_vars[gNB_id]->dl_ch_magb0,
+ pdsch_vars[gNB_id]->dl_ch_magr0,
+ pdsch_vars[gNB_id]->rxdataF_comp0,
+ (n_tx>1) ? pdsch_vars[gNB_id]->rho : NULL,
+ frame_parms,
+ n_tx,
+ symbol,
+ pilots,
+ first_symbol_flag,
+ dlsch0_harq->Qm,
+ nb_rb,
+ pdsch_vars[gNB_id]->log2_maxh,
+ measurements); // log2_maxh+I0_shift
+ }
- /*if ((rx_type==rx_IC_single_stream) &&
- (eNB_id_in_connected_gNB)) {
- nr_dlsch_channel_compensation(pdsch_vars[eNB_id_i]->rxdataF_ext,
- pdsch_vars[eNB_id_i]->dl_ch_estimates_ext,
- pdsch_vars[eNB_id_i]->dl_ch_mag0,
- pdsch_vars[eNB_id_i]->dl_ch_magb0,
- pdsch_vars[eNB_id_i]->rxdataF_comp0,
- (aatx>1) ? pdsch_vars[eNB_id_i]->rho : NULL,
- frame_parms,
- symbol,
- first_symbol_flag,
- i_mod,
- nb_rb,
- pdsch_vars[gNB_id]->log2_maxh,
- measurements); // log2_maxh+I0_shift
-#ifdef DEBUG_PHY
- if (symbol == 5) {
- write_output("rxF_comp_d.m","rxF_c_d",&pdsch_vars[gNB_id]->rxdataF_comp0[0][symbol*frame_parms->N_RB_DL*12],frame_parms->N_RB_DL*12,1,1);
- write_output("rxF_comp_i.m","rxF_c_i",&pdsch_vars[eNB_id_i]->rxdataF_comp0[0][symbol*frame_parms->N_RB_DL*12],frame_parms->N_RB_DL*12,1,1);
- }
-#endif
-
- dlsch_dual_stream_correlation(frame_parms,
- symbol,
- nb_rb,
- pdsch_vars[gNB_id]->dl_ch_estimates_ext,
- pdsch_vars[eNB_id_i]->dl_ch_estimates_ext,
- pdsch_vars[gNB_id]->dl_ch_rho_ext[harq_pid][round],
- pdsch_vars[gNB_id]->log2_maxh);
- }*/
- }
-
- else if (dlsch0_harq->mimo_mode == NR_DUALSTREAM){
- nr_dlsch_channel_compensation_core(pdsch_vars[gNB_id]->rxdataF_ext,
+ else if (dlsch0_harq->mimo_mode == NR_DUALSTREAM) {
+ nr_dlsch_channel_compensation_core(pdsch_vars[gNB_id]->rxdataF_ext,
pdsch_vars[gNB_id]->dl_ch_estimates_ext,
pdsch_vars[gNB_id]->dl_ch_mag0,
pdsch_vars[gNB_id]->dl_ch_magb0,
@@ -609,40 +526,16 @@ int nr_rx_pdsch(PHY_VARS_NR_UE *ue,
pdsch_vars[gNB_id]->log2_maxh,
2*len, // subcarriers Re Im
0); // we start from the beginning of the vector
- /* if (symbol == 5) {
- write_output("rxF_comp_d00.m","rxF_c_d00",&pdsch_vars[gNB_id]->rxdataF_comp0[0][symbol*frame_parms->N_RB_DL*12],frame_parms->N_RB_DL*12,1,1);// should be QAM
- write_output("rxF_comp_d01.m","rxF_c_d01",&pdsch_vars[gNB_id]->rxdataF_comp0[1][symbol*frame_parms->N_RB_DL*12],frame_parms->N_RB_DL*12,1,1);//should be almost 0
- write_output("rxF_comp_d10.m","rxF_c_d10",&pdsch_vars[gNB_id]->rxdataF_comp1[harq_pid][round][0][symbol*frame_parms->N_RB_DL*12],frame_parms->N_RB_DL*12,1,1);//should be almost 0
- write_output("rxF_comp_d11.m","rxF_c_d11",&pdsch_vars[gNB_id]->rxdataF_comp1[harq_pid][round][1][symbol*frame_parms->N_RB_DL*12],frame_parms->N_RB_DL*12,1,1);//should be QAM
- } */
- // compute correlation between signal and interference channels (rho12 and rho21)
- nr_dlsch_dual_stream_correlation_core(pdsch_vars[gNB_id]->dl_ch_estimates_ext,
- &(pdsch_vars[gNB_id]->dl_ch_estimates_ext[2]),
- pdsch_vars[gNB_id]->dl_ch_rho_ext[harq_pid][round],
- n_tx,
- n_rx,
- pdsch_vars[gNB_id]->log2_maxh,
- 2*len,
- 0);
- //printf("rho stream1 =%d\n", &pdsch_vars[gNB_id]->dl_ch_rho_ext[harq_pid][round] );
- nr_dlsch_dual_stream_correlation_core(&(pdsch_vars[gNB_id]->dl_ch_estimates_ext[2]),
- pdsch_vars[gNB_id]->dl_ch_estimates_ext,
- pdsch_vars[gNB_id]->dl_ch_rho2_ext,
- n_tx,
- n_rx,
- pdsch_vars[gNB_id]->log2_maxh,
- 2*len,
- 0);
- // printf("rho stream2 =%d\n",&pdsch_vars[gNB_id]->dl_ch_rho2_ext );
- //printf("TM3 log2_maxh : %d\n",pdsch_vars[gNB_id]->log2_maxh);
- /* if (symbol == 5) {
- write_output("rho0_0.m","rho0_0",&pdsch_vars[gNB_id]->dl_ch_rho_ext[harq_pid][round][0][symbol*frame_parms->N_RB_DL*12],frame_parms->N_RB_DL*12,1,1);// should be QAM
- write_output("rho2_0.m","rho2_0",&pdsch_vars[gNB_id]->dl_ch_rho2_ext[0][symbol*frame_parms->N_RB_DL*12],frame_parms->N_RB_DL*12,1,1);//should be almost 0
- write_output("rho0_1.m.m","rho0_1",&pdsch_vars[gNB_id]->dl_ch_rho_ext[harq_pid][round][1][symbol*frame_parms->N_RB_DL*12],frame_parms->N_RB_DL*12,1,1);//should be almost 0
- write_output("rho2_1.m","rho2_1",&pdsch_vars[gNB_id]->dl_ch_rho2_ext[1][symbol*frame_parms->N_RB_DL*12],frame_parms->N_RB_DL*12,1,1);//should be QAM
- } */
-
- }
+ // compute correlation between signal and interference channels (rho12 and rho21)
+ nr_dlsch_dual_stream_correlation_core(pdsch_vars[gNB_id]->dl_ch_estimates_ext,
+ &(pdsch_vars[gNB_id]->dl_ch_estimates_ext[2]),
+ pdsch_vars[gNB_id]->dl_ch_rho_ext[harq_pid][round],
+ n_tx,
+ n_rx,
+ pdsch_vars[gNB_id]->log2_maxh,
+ 2*len,
+ 0);
+ }
#if UE_TIMING_TRACE
stop_meas(&ue->generic_stat_bis[proc->thread_id][slot]);
@@ -657,35 +550,50 @@ int nr_rx_pdsch(PHY_VARS_NR_UE *ue,
start_meas(&ue->generic_stat_bis[proc->thread_id][slot]);
#endif
- if (frame_parms->nb_antennas_rx > 1) {
- if (dlsch0_harq->mimo_mode == NR_DUALSTREAM){
- nr_dlsch_detection_mrc_core(pdsch_vars[gNB_id]->rxdataF_comp0,
- NULL,
- pdsch_vars[gNB_id]->dl_ch_rho_ext[harq_pid][round],
- pdsch_vars[gNB_id]->dl_ch_rho2_ext,
- pdsch_vars[gNB_id]->dl_ch_mag0,
- pdsch_vars[gNB_id]->dl_ch_magb0,
- NULL,
- NULL,
- n_tx,
- n_rx,
- 2*len,
- 0);
- /* if (symbol == 5) {
- write_output("rho0_mrc.m","rho0_0",&pdsch_vars[gNB_id]->dl_ch_rho_ext[harq_pid][round][0][symbol*frame_parms->N_RB_DL*12],frame_parms->N_RB_DL*12,1,1);// should be QAM
- write_output("rho2_mrc.m","rho2_0",&pdsch_vars[gNB_id]->dl_ch_rho2_ext[0][symbol*frame_parms->N_RB_DL*12],frame_parms->N_RB_DL*12,1,1);//should be almost 0
- } */
+ if (frame_parms->nb_antennas_rx > 1) {
+ if (dlsch0_harq->mimo_moderxdataF_comp0,
+ (n_tx>1)? pdsch_vars[gNB_id]->rho : NULL,
+ pdsch_vars[gNB_id]->dl_ch_mag0,
+ pdsch_vars[gNB_id]->dl_ch_magb0,
+ n_tx,
+ n_rx,
+ symbol,
+ nb_rb);
+ if (n_tx == 2)//Apply zero forcing for 2 Tx layers
+ nr_zero_forcing_rx_2layers(pdsch_vars[gNB_id]->rxdataF_comp0,
+ pdsch_vars[gNB_id]->dl_ch_mag0,
+ pdsch_vars[gNB_id]->dl_ch_magb0,
+ pdsch_vars[gNB_id]->dl_ch_estimates_ext,
+ nb_rb,
+ n_rx,
+ dlsch0_harq->Qm,
+ pdsch_vars[gNB_id]->log2_maxh,
+ symbol);
}
+ else if (dlsch0_harq->mimo_mode == NR_DUALSTREAM) {
+ nr_dlsch_detection_mrc_core(pdsch_vars[gNB_id]->rxdataF_comp0,
+ NULL,
+ pdsch_vars[gNB_id]->dl_ch_rho_ext[harq_pid][round],
+ pdsch_vars[gNB_id]->dl_ch_rho2_ext,
+ pdsch_vars[gNB_id]->dl_ch_mag0,
+ pdsch_vars[gNB_id]->dl_ch_magb0,
+ NULL,
+ NULL,
+ n_tx,
+ n_rx,
+ 2*len,
+ 0);
}
-
- //printf("start compute LLR\n");
+ }
+ //printf("start compute LLR\n");
if (dlsch0_harq->mimo_mode == NR_DUALSTREAM) {
rxdataF_comp_ptr = pdsch_vars[gNB_id]->rxdataF_comp1[harq_pid][round];
dl_ch_mag_ptr = pdsch_vars[gNB_id]->dl_ch_mag1[harq_pid][round];
}
else {
- rxdataF_comp_ptr = pdsch_vars[eNB_id_i]->rxdataF_comp0;
- dl_ch_mag_ptr = pdsch_vars[eNB_id_i]->dl_ch_mag0;
+ rxdataF_comp_ptr = pdsch_vars[gNB_id_i]->rxdataF_comp0;
+ dl_ch_mag_ptr = pdsch_vars[gNB_id_i]->dl_ch_mag0;
//i_mod should have been passed as a parameter
}
@@ -747,7 +655,7 @@ int nr_rx_pdsch(PHY_VARS_NR_UE *ue,
rxdataF_comp_ptr, dl_ch_mag_ptr,
dlsch0_harq, dlsch1_harq,
rx_type, harq_pid,
- gNB_id, eNB_id_i,
+ gNB_id, gNB_id_i,
first_symbol_flag,
i, nb_rb, round,
codeword_TB0, codeword_TB1,
@@ -868,10 +776,11 @@ void nr_dlsch_channel_compensation(int **rxdataF_ext,
int **dl_ch_magb,
int **dl_ch_magr,
int **rxdataF_comp,
- int **rho,
+ int ***rho,
NR_DL_FRAME_PARMS *frame_parms,
+ uint8_t nb_aatx,
unsigned char symbol,
- uint8_t pilots,
+ uint8_t pilots,
uint8_t first_symbol_flag,
unsigned char mod_order,
unsigned short nb_rb,
@@ -882,12 +791,12 @@ void nr_dlsch_channel_compensation(int **rxdataF_ext,
#if defined(__i386) || defined(__x86_64)
unsigned short rb;
- unsigned char aatx,aarx;
+ unsigned char aatx,aarx,atx;
__m128i *dl_ch128,*dl_ch128_2,*dl_ch_mag128,*dl_ch_mag128b,*dl_ch_mag128r,*rxdataF128,*rxdataF_comp128,*rho128;
__m128i mmtmpD0,mmtmpD1,mmtmpD2,mmtmpD3,QAM_amp128,QAM_amp128b,QAM_amp128r;
QAM_amp128b = _mm_setzero_si128();
- for (aatx=0; aatxnb_antenna_ports_gNB; aatx++) {
+ for (aatx=0; aatxnb_antennas_rx; aarx++) {
- dl_ch128 = (__m128i *)&dl_ch_estimates_ext[(aatx<<1)+aarx][symbol*nb_rb*12];
- dl_ch_mag128 = (__m128i *)&dl_ch_mag[(aatx<<1)+aarx][symbol*nb_rb*12];
- dl_ch_mag128b = (__m128i *)&dl_ch_magb[(aatx<<1)+aarx][symbol*nb_rb*12];
- dl_ch_mag128r = (__m128i *)&dl_ch_magr[(aatx<<1)+aarx][symbol*nb_rb*12];
+ dl_ch128 = (__m128i *)&dl_ch_estimates_ext[(aatx*frame_parms->nb_antennas_rx)+aarx][symbol*nb_rb*12];
+ dl_ch_mag128 = (__m128i *)&dl_ch_mag[(aatx*frame_parms->nb_antennas_rx)+aarx][symbol*nb_rb*12];
+ dl_ch_mag128b = (__m128i *)&dl_ch_magb[(aatx*frame_parms->nb_antennas_rx)+aarx][symbol*nb_rb*12];
+ dl_ch_mag128r = (__m128i *)&dl_ch_magr[(aatx*frame_parms->nb_antennas_rx)+aarx][symbol*nb_rb*12];
rxdataF128 = (__m128i *)&rxdataF_ext[aarx][symbol*nb_rb*12];
- rxdataF_comp128 = (__m128i *)&rxdataF_comp[(aatx<<1)+aarx][symbol*nb_rb*12];
-
+ rxdataF_comp128 = (__m128i *)&rxdataF_comp[(aatx*frame_parms->nb_antennas_rx)+aarx][symbol*nb_rb*12];
for (rb=0; rb2) {
@@ -997,10 +905,15 @@ void nr_dlsch_channel_compensation(int **rxdataF_ext,
// print_ints("c0",&mmtmpD2);
// print_ints("c1",&mmtmpD3);
rxdataF_comp128[0] = _mm_packs_epi32(mmtmpD2,mmtmpD3);
+ //printf("arx%d atx%d rb_index %d symbol%d\n",aarx,aatx,rb,symbol);
// print_shorts("rx:",rxdataF128);
// print_shorts("ch:",dl_ch128);
// print_shorts("pack:",rxdataF_comp128);
+ //printf("arx%d atx%d rb_index %d symbol%d\n",aarx,aatx,rb,symbol);
+ //print_shorts("rx:",(int16_t*)&rxdataF128[0]);
+ //print_shorts("ch:",(int16_t*)&dl_ch128[0]);
+ //print_shorts("pack:",(int16_t*)&rxdataF_comp128[0]);
// multiply by conjugated channel
mmtmpD0 = _mm_madd_epi16(dl_ch128[1],rxdataF128[1]);
// mmtmpD0 contains real part of 4 consecutive outputs (32-bit)
@@ -1015,9 +928,9 @@ void nr_dlsch_channel_compensation(int **rxdataF_ext,
mmtmpD3 = _mm_unpackhi_epi32(mmtmpD0,mmtmpD1);
rxdataF_comp128[1] = _mm_packs_epi32(mmtmpD2,mmtmpD3);
- // print_shorts("rx:",rxdataF128+1);
- // print_shorts("ch:",dl_ch128+1);
- // print_shorts("pack:",rxdataF_comp128+1);
+ //print_shorts("rx:",(int16_t*)&rxdataF128[1]);
+ //print_shorts("ch:",(int16_t*)&dl_ch128[1]);
+ //print_shorts("pack:",(int16_t*)&rxdataF_comp128[1]);
if (pilots==0) {
// multiply by conjugated channel
@@ -1034,9 +947,9 @@ void nr_dlsch_channel_compensation(int **rxdataF_ext,
mmtmpD3 = _mm_unpackhi_epi32(mmtmpD0,mmtmpD1);
rxdataF_comp128[2] = _mm_packs_epi32(mmtmpD2,mmtmpD3);
- // print_shorts("rx:",rxdataF128+2);
- // print_shorts("ch:",dl_ch128+2);
- // print_shorts("pack:",rxdataF_comp128+2);
+ //print_shorts("rx:",(int16_t*)&rxdataF128[2]);
+ //print_shorts("ch:",(int16_t*)&dl_ch128[2]);
+ //print_shorts("pack:",(int16_t*)&rxdataF_comp128[2]);
dl_ch128+=3;
dl_ch_mag128+=3;
@@ -1044,107 +957,145 @@ void nr_dlsch_channel_compensation(int **rxdataF_ext,
dl_ch_mag128r+=3;
rxdataF128+=3;
rxdataF_comp128+=3;
- } else { // we have a smaller PDSCH in symbols with pilots so skip last group of 4 REs and increment less
- dl_ch128+=2;
- dl_ch_mag128+=2;
- dl_ch_mag128b+=2;
- dl_ch_mag128r+=2;
- rxdataF128+=2;
- rxdataF_comp128+=2;
}
-
+ else { // we have a smaller PDSCH in symbols with pilots so skip last group of 4 REs and increment less
+ dl_ch128+=2;
+ dl_ch_mag128+=2;
+ dl_ch_mag128b+=2;
+ dl_ch_mag128r+=2;
+ rxdataF128+=2;
+ rxdataF_comp128+=2;
+ }
}
}
}
-
if (rho) {
+ //we compute the Tx correlation matrix for each Rx antenna
+ //As an example the 2x2 MIMO case requires
+ //rho[aarx][nb_aatx*nb_aatx] = [cov(H_aarx_0,H_aarx_0) cov(H_aarx_0,H_aarx_1)
+ // cov(H_aarx_1,H_aarx_0) cov(H_aarx_1,H_aarx_1)], aarx=0,...,nb_antennas_rx-1
+ int avg_rho_re[frame_parms->nb_antennas_rx][nb_aatx*nb_aatx];
+ int avg_rho_im[frame_parms->nb_antennas_rx][nb_aatx*nb_aatx];
for (aarx=0; aarxnb_antennas_rx; aarx++) {
- rho128 = (__m128i *)&rho[aarx][symbol*frame_parms->N_RB_DL*12];
- dl_ch128 = (__m128i *)&dl_ch_estimates_ext[aarx][symbol*frame_parms->N_RB_DL*12];
- dl_ch128_2 = (__m128i *)&dl_ch_estimates_ext[2+aarx][symbol*frame_parms->N_RB_DL*12];
- for (rb=0; rbnb_antennas_rx+aarx][symbol*nb_rb*12];
- // mmtmpD0 contains real part of 4 consecutive outputs (32-bit)
- mmtmpD1 = _mm_shufflelo_epi16(dl_ch128[0],_MM_SHUFFLE(2,3,0,1));
- mmtmpD1 = _mm_shufflehi_epi16(mmtmpD1,_MM_SHUFFLE(2,3,0,1));
- mmtmpD1 = _mm_sign_epi16(mmtmpD1,*(__m128i*)&conjugate[0]);
- // print_ints("im",&mmtmpD1);
- mmtmpD1 = _mm_madd_epi16(mmtmpD1,dl_ch128_2[0]);
- // mmtmpD1 contains imag part of 4 consecutive outputs (32-bit)
- mmtmpD0 = _mm_srai_epi32(mmtmpD0,output_shift);
- // print_ints("re(shift)",&mmtmpD0);
- mmtmpD1 = _mm_srai_epi32(mmtmpD1,output_shift);
- // print_ints("im(shift)",&mmtmpD1);
- mmtmpD2 = _mm_unpacklo_epi32(mmtmpD0,mmtmpD1);
- mmtmpD3 = _mm_unpackhi_epi32(mmtmpD0,mmtmpD1);
- // print_ints("c0",&mmtmpD2);
- // print_ints("c1",&mmtmpD3);
- rho128[0] = _mm_packs_epi32(mmtmpD2,mmtmpD3);
+ for (atx=0; atxnb_antennas_rx+aarx][symbol*nb_rb*12];
- //print_shorts("rx:",dl_ch128_2);
- //print_shorts("ch:",dl_ch128);
- //print_shorts("pack:",rho128);
+ for (rb=0; rbrx_correlation[0][aarx] = signal_energy(&rho[aarx][symbol*nb_rb*12],rb*12);
+ rho128[2] = _mm_packs_epi32(mmtmpD2,mmtmpD3);
+ //print_shorts("rx:",dl_ch128_2+2);
+ //print_shorts("ch:",dl_ch128+2);
+ //print_shorts("pack:",rho128+2);
+ avg_rho_re[aarx][aatx*nb_aatx+atx] +=(((int16_t*)&rho128[2])[0]+
+ ((int16_t*)&rho128[2])[2] +
+ ((int16_t*)&rho128[2])[4] +
+ ((int16_t*)&rho128[2])[6])/16;
+
+ avg_rho_im[aarx][aatx*nb_aatx+atx] +=(((int16_t*)&rho128[2])[1]+
+ ((int16_t*)&rho128[2])[3] +
+ ((int16_t*)&rho128[2])[5] +
+ ((int16_t*)&rho128[2])[7])/16;
+
+ dl_ch128+=3;
+ dl_ch128_2+=3;
+ rho128+=3;
+ }
+ if (first_symbol_flag==1) {
+ //measurements->rx_correlation[0][0][aarx] = signal_energy(&rho[aarx][aatx*nb_aatx+atx][symbol*nb_rb*12],rb*12);
+ avg_rho_re[aarx][aatx*nb_aatx+atx] = 16*avg_rho_re[aarx][aatx*nb_aatx+atx]/(nb_rb*12);
+ avg_rho_im[aarx][aatx*nb_aatx+atx] = 16*avg_rho_im[aarx][aatx*nb_aatx+atx]/(nb_rb*12);
+ printf("rho[rx]%d tx%d tx%d = Re: %d Im: %d\n",aarx, aatx,atx, avg_rho_re[aarx][aatx*nb_aatx+atx], avg_rho_im[aarx][aatx*nb_aatx+atx]);
+ }
+ }
}
}
}
-
_mm_empty();
_m_empty();
#elif defined(__arm__)
-
unsigned short rb;
unsigned char aatx,aarx,symbol_mod,pilots=0;
@@ -1349,7 +1300,7 @@ void nr_dlsch_channel_compensation_core(int **rxdataF_ext,
int **dl_ch_mag,
int **dl_ch_magb,
int **rxdataF_comp,
- int **rho,
+ int ***rho,
unsigned char n_tx,
unsigned char n_rx,
unsigned char mod_order,
@@ -1486,7 +1437,7 @@ void nr_dlsch_channel_compensation_core(int **rxdataF_ext,
for (aarx=0; aarxnb_antenna_ports_gNB; aatx++) {
- for (aarx=0; aarxnb_antennas_rx; aarx++) {
+ for (aatx=0; aatxnb_antenna_ports_gNB; aatx++)
+ for (aatx=0; aatxnb_antennas_rx; aarx++) {
//clear average level
avg128D = _mm_setzero_si128();
- // 5 is always a symbol with no pilots for both normal and extended prefix
- dl_ch128=(__m128i *)&dl_ch_estimates_ext[(aatx<<1)+aarx][symbol*nb_rb*12];
+ dl_ch128=(__m128i *)&dl_ch_estimates_ext[(aatx*frame_parms->nb_antennas_rx)+aarx][symbol*nb_rb*12];
for (rb=0;rbnb_antennas_rx)+aarx] =(((int32_t*)&avg128D)[0] +
((int32_t*)&avg128D)[1] +
((int32_t*)&avg128D)[2] +
((int32_t*)&avg128D)[3])/y;
@@ -1729,38 +1682,36 @@ void nr_dlsch_channel_level_median(int **dl_ch_estimates_ext,
int norm_pack;
__m128i *dl_ch128, norm128D;
- for (aatx=0; aatx>2;
+ length2 = length>>2;//length = number of REs, hence length2=nb_REs*(32/128) in SIMD loop
for (ii=0;ii max)
- max = norm_pack;
+ max = norm_pack;//store values more than max
if (norm_pack < min)
- min = norm_pack;
-
+ min = norm_pack;//store values less than min
dl_ch128+=1;
}
- median[aatx*n_rx + aarx] = (max+min)>>1;
-
- // printf("Channel level median [%d]: %d\n",aatx*n_rx + aarx, median[aatx*n_rx + aarx]);
+ median[aatx*n_rx + aarx] = (max+min)>>1;
+ //printf("Channel level median [%d]: %d max = %d min = %d\n",aatx*n_rx + aarx, median[aatx*n_rx + aarx],max,min);
}
- }
+ }
_mm_empty();
_m_empty();
@@ -2100,37 +2051,37 @@ void nr_dlsch_detection_mrc_core(int **rxdataF_comp,
//==============================================================================================
unsigned short nr_dlsch_extract_rbs_single(int **rxdataF,
- int **dl_ch_estimates,
- int **rxdataF_ext,
- int **dl_ch_estimates_ext,
- unsigned short pmi,
- unsigned char *pmi_ext,
- unsigned char symbol,
- uint8_t pilots,
- uint8_t config_type,
- unsigned short start_rb,
- unsigned short nb_rb_pdsch,
- unsigned char nr_slot_rx,
- uint32_t high_speed_flag,
+ int **dl_ch_estimates,
+ int **rxdataF_ext,
+ int **dl_ch_estimates_ext,
+ unsigned char symbol,
+ uint8_t pilots,
+ uint8_t config_type,
+ unsigned short start_rb,
+ unsigned short nb_rb_pdsch,
+ uint8_t n_dmrs_cdm_groups,
NR_DL_FRAME_PARMS *frame_parms,
- uint16_t dlDmrsSymbPos) {
-
-
+ uint16_t dlDmrsSymbPos)
+{
unsigned short k,rb;
- unsigned char i,aarx; //,nsymb,sss_symb,pss_symb=0,l;
+ unsigned char nushift,i,aarx;
int *dl_ch0,*dl_ch0_ext,*rxF,*rxF_ext;
int8_t validDmrsEst = 0; //store last DMRS Symbol index
unsigned char j=0;
- if (config_type==pdsch_dmrs_type1)
- AssertFatal(frame_parms->nushift ==0 || frame_parms->nushift == 1,
- "nushift %d is illegal\n",frame_parms->nushift);
- else
- AssertFatal(frame_parms->nushift ==0 || frame_parms->nushift == 2 || frame_parms->nushift == 4,
- "nushift %d is illegal\n",frame_parms->nushift);
+ if (config_type==pdsch_dmrs_type1) {
+ AssertFatal(n_dmrs_cdm_groups == 1 || n_dmrs_cdm_groups == 2,
+ "n_dmrs_cdm_groups %d is illegal\n",n_dmrs_cdm_groups);
+ nushift = n_dmrs_cdm_groups -1;//delta in Table 7.4.1.1.2-1
+
+ } else {
+ AssertFatal(n_dmrs_cdm_groups == 1 || n_dmrs_cdm_groups == 2 || n_dmrs_cdm_groups == 3,
+ "n_dmrs_cdm_groups %d is illegal\n",n_dmrs_cdm_groups);
+ nushift = (n_dmrs_cdm_groups -1)<<1;//delta in Table 7.4.1.1.2-2
+ }
for (aarx=0; aarxnb_antennas_rx; aarx++) {
@@ -2151,33 +2102,35 @@ unsigned short nr_dlsch_extract_rbs_single(int **rxdataF,
rxF = &rxdataF[aarx][(k+(symbol*(frame_parms->ofdm_symbol_size)))];
}
if (pilots==0) {
- memcpy((void*)rxF_ext,(void*)rxF,12*sizeof(*rxF_ext));
- memcpy((void*)dl_ch0_ext,(void*)dl_ch0,12*sizeof(*dl_ch0_ext));
- dl_ch0_ext+=12;
- rxF_ext+=12;
+ memcpy((void*)rxF_ext,(void*)rxF,12*sizeof(*rxF_ext));
+ memcpy((void*)dl_ch0_ext,(void*)dl_ch0,12*sizeof(*dl_ch0_ext));
+ dl_ch0_ext+=12;
+ rxF_ext+=12;
} else {//the symbol contains DMRS
j=0;
if (config_type==pdsch_dmrs_type1){
- for (i = (1-frame_parms->nushift); i<12; i+=2) {
+ if (nushift == 0) {//data is multiplexed
+ for (i = (1-nushift); i<12; i+=2) {
+ rxF_ext[j]=rxF[i];
+ dl_ch0_ext[j]=dl_ch0[i];
+ j++;
+ }
+ dl_ch0_ext+=6;
+ rxF_ext+=6;
+ }
+ } else {//pdsch_dmrs_type2
+ for (i = (2+nushift); i<6; i++) {
rxF_ext[j]=rxF[i];
dl_ch0_ext[j]=dl_ch0[i];
j++;
}
- dl_ch0_ext+=6;
- rxF_ext+=6;
- } else {
- for (i = (2+frame_parms->nushift); i<6; i++) {
+ for (i = (8+nushift); i<12; i++) {
rxF_ext[j]=rxF[i];
dl_ch0_ext[j]=dl_ch0[i];
j++;
}
- for (i = (8+frame_parms->nushift); i<12; i++) {
- rxF_ext[j]=rxF[i];
- dl_ch0_ext[j]=dl_ch0[i];
- j++;
- }
- dl_ch0_ext+= 8;
- rxF_ext+= 8;
+ dl_ch0_ext+= j;
+ rxF_ext+= j;
}
}
@@ -2190,104 +2143,782 @@ unsigned short nr_dlsch_extract_rbs_single(int **rxdataF,
}
}
}
-
-
- return(nb_rb_pdsch/frame_parms->nb_antennas_rx);
+ return(nb_rb_pdsch);
}
-unsigned short nr_dlsch_extract_rbs_dual(int **rxdataF,
- int **dl_ch_estimates,
- int **rxdataF_ext,
- int **dl_ch_estimates_ext,
- unsigned short pmi,
- unsigned char *pmi_ext,
- unsigned char symbol,
- uint8_t pilots,
- unsigned short start_rb,
- unsigned short nb_rb_pdsch,
- unsigned char nr_slot_rx,
- uint32_t high_speed_flag,
- NR_DL_FRAME_PARMS *frame_parms,
- MIMO_mode_t mimo_mode) {
+unsigned short nr_dlsch_extract_rbs_multiple(int **rxdataF,
+ int **dl_ch_estimates,
+ int **rxdataF_ext,
+ int **dl_ch_estimates_ext,
+ unsigned char symbol,
+ uint8_t pilots,
+ uint8_t config_type,
+ unsigned short start_rb,
+ unsigned short nb_rb_pdsch,
+ uint8_t n_dmrs_cdm_groups,
+ uint8_t Nl,
+ NR_DL_FRAME_PARMS *frame_parms,
+ uint16_t dlDmrsSymbPos)
+{
- int prb,nb_rb=0;
- unsigned short k;
- int i,j,aarx;
- int32_t *dl_ch0=NULL,*dl_ch0_ext=NULL,*dl_ch1=NULL,*dl_ch1_ext=NULL,*rxF=NULL,*rxF_ext=NULL;
+ unsigned short k,rb;
+ unsigned char nushift,j,i,aarx,aatx;
+ int *dl_ch0,*dl_ch0_ext,*rxF,*rxF_ext;
+ int8_t validDmrsEst = 0; //store last DMRS Symbol index
- k = frame_parms->first_carrier_offset + 516; //0
+ if (config_type==pdsch_dmrs_type1) {
+ AssertFatal(n_dmrs_cdm_groups == 1 || n_dmrs_cdm_groups == 2,
+ "n_dmrs_cdm_groups %d is illegal\n",n_dmrs_cdm_groups);
+ nushift = n_dmrs_cdm_groups -1;//delta in Table 7.4.1.1.2-1
+ } else {
+ AssertFatal(n_dmrs_cdm_groups == 1 || n_dmrs_cdm_groups == 2 || n_dmrs_cdm_groups == 3,
+ "n_dmrs_cdm_groups %d is illegal\n",n_dmrs_cdm_groups);
+ nushift = (n_dmrs_cdm_groups -1)<<1;//delta in Table 7.4.1.1.2-2
+ }
+
+ validDmrsEst = get_valid_dmrs_idx_for_channel_est(dlDmrsSymbPos,symbol);
for (aarx=0; aarxnb_antennas_rx; aarx++) {
- if (high_speed_flag==1) {
- dl_ch0 = &dl_ch_estimates[aarx][symbol*(frame_parms->ofdm_symbol_size)];
- dl_ch1 = &dl_ch_estimates[2+aarx][symbol*(frame_parms->ofdm_symbol_size)];
- } else {
- dl_ch0 = &dl_ch_estimates[aarx][0];
- dl_ch1 = &dl_ch_estimates[2+aarx][0];
- }
+ k = frame_parms->first_carrier_offset + NR_NB_SC_PER_RB*start_rb;
+ if (k>frame_parms->ofdm_symbol_size)
+ k = k-frame_parms->ofdm_symbol_size;
- //pmi_loc = pmi_ext;
+ rxF_ext = &rxdataF_ext[aarx][symbol*(nb_rb_pdsch*12)];
+ rxF = &rxdataF[aarx][(k+(symbol*(frame_parms->ofdm_symbol_size)))];
- // pointers to extracted RX signals and channel estimates
- rxF_ext = &rxdataF_ext[aarx][symbol*(nb_rb_pdsch*12)];
- dl_ch0_ext = &dl_ch_estimates_ext[aarx][symbol*(nb_rb_pdsch*12)];
- dl_ch1_ext = &dl_ch_estimates_ext[2+aarx][symbol*(nb_rb_pdsch*12)];
+ for (aatx=0; aatxN_RB_DL; prb++) {
- //skip_half=0;
+ dl_ch0 = &dl_ch_estimates[(aatx*frame_parms->nb_antennas_rx)+aarx][(validDmrsEst*(frame_parms->ofdm_symbol_size))];
+ dl_ch0_ext = &dl_ch_estimates_ext[(aatx*frame_parms->nb_antennas_rx)+aarx][symbol*(nb_rb_pdsch*NR_NB_SC_PER_RB)];
- if ((frame_parms->N_RB_DL&1) == 0) { // even number of RBs
-
- // For second half of RBs skip DC carrier
- if (k>=frame_parms->ofdm_symbol_size) {
- rxF = &rxdataF[aarx][(symbol*(frame_parms->ofdm_symbol_size))];
- k=k-(frame_parms->ofdm_symbol_size);
+ for (rb = 0; rb < nb_rb_pdsch; rb++)
+ {
+ if (pilots==0) {//data symbol only
+ if (aatx==0) {//Extract Rx signal only
+ memcpy((void*)rxF_ext,(void*)rxF,12*sizeof(*rxF_ext));
+ rxF_ext+=12;
+ }
+ memcpy((void*)dl_ch0_ext,(void*)dl_ch0,12*sizeof(*dl_ch0_ext));//Extract Channel Estimate
+ dl_ch0_ext+=12;
+ }
+ else {//the symbol contains DMRS
+ j=0;
+ if (config_type==pdsch_dmrs_type1) {
+ if (nushift == 0) {//data is multiplexed
+ for (i = (1-nushift); i<12; i+=2) {
+ if (aatx==0) rxF_ext[j]=rxF[i];
+ dl_ch0_ext[j]=dl_ch0[i];
+ j++;
+ }
+ dl_ch0_ext+=6;
+ if (aatx==0) rxF_ext+=6;
+ }
+ }
+ else {//pdsch_dmrs_type2
+ for (i = (2+nushift); i<6; i++) {
+ if (aatx==0) rxF_ext[j]=rxF[i];
+ dl_ch0_ext[j]=dl_ch0[i];
+ j++;
+ }
+ for (i = (8+nushift); i<12; i++) {
+ if (aatx==0) rxF_ext[j]=rxF[i];
+ dl_ch0_ext[j]=dl_ch0[i];
+ j++;
+ }
+ dl_ch0_ext+= j;
+ if (aatx==0) rxF_ext+= j;
+ }
}
- /*
- if (mimo_mode <= PUSCH_PRECODING1)
- *pmi_loc = (pmi>>((prb>>2)<<1))&3;
- else
- *pmi_loc=(pmi>>prb)&1;*/
-
- // *pmi_loc = get_pmi(frame_parms->N_RB_DL,mimo_mode,pmi,prb);
- // pmi_loc++;
-
-
- if (pilots == 0) {
-
- memcpy(dl_ch0_ext,dl_ch0,12*sizeof(int));
- memcpy(dl_ch1_ext,dl_ch1,12*sizeof(int));
- memcpy(rxF_ext,rxF,12*sizeof(int));
- dl_ch0_ext +=12;
- dl_ch1_ext +=12;
- rxF_ext +=12;
- } else { // pilots==1
- j=0;
- for (i=0; i<12; i++) {
- if ((i&1)!=frame_parms->nushift) {
- rxF_ext[j]=rxF[i];
- // printf("extract rb %d, re %d => (%d,%d)\n",rb,i,*(short *)&rxF_ext[j],*(1+(short*)&rxF_ext[j]));
- dl_ch0_ext[j]=dl_ch0[i];
- dl_ch1_ext[j++]=dl_ch1[i];
- }
- }
- dl_ch0_ext+=6;
- dl_ch1_ext+=6;
- rxF_ext+=6;
- } // pilots==1
-
- dl_ch0+=12;
- dl_ch1+=12;
+ dl_ch0+=12;
+ if (aatx==0) {
rxF+=12;
k+=12;
- }
- } // for prb
- } // for aarx
- return(nb_rb/frame_parms->nb_antennas_rx);
+ if (k>=frame_parms->ofdm_symbol_size) {
+ k=k-(frame_parms->ofdm_symbol_size);
+ rxF = &rxdataF[aarx][k+(symbol*(frame_parms->ofdm_symbol_size))];
+ }
+ }
+ }//rb
+ }//aatx
+ }//aarx
+ return(nb_rb_pdsch);
}
+void nr_dlsch_detection_mrc(int **rxdataF_comp,
+ int ***rho,
+ int **dl_ch_mag,
+ int **dl_ch_magb,
+ short n_tx,
+ short n_rx,
+ unsigned char symbol,
+ unsigned short nb_rb) {
+#if defined(__x86_64__)||defined(__i386__)
+ unsigned char aatx, aarx;
+ int i;
+ __m128i *rxdataF_comp128_0,*rxdataF_comp128_1,*dl_ch_mag128_0,*dl_ch_mag128_1,*dl_ch_mag128_0b,*dl_ch_mag128_1b;
+
+ if (n_rx>1) {
+ for (aatx=0; aatxN_RB_DL*12];
+ rho128_1 = (__m128i *) &rho[1][symbol*frame_parms->N_RB_DL*12];
+ for (i=0; i=2){
+ // (1/2^log2_maxh)*conj_H_00xH_00: (1/(64*2))conjH_00*H_00*2^15
+ nr_conjch0_mult_ch1(ch00,
+ ch00,
+ conjch00_ch00,
+ nb_rb,
+ shift);
+ // (1/2^log2_maxh)*conj_H_10xH_10: (1/(64*2))conjH_10*H_10*2^15
+ nr_conjch0_mult_ch1(ch10,
+ ch10,
+ conjch10_ch10,
+ nb_rb,
+ shift);
+ // conj_H_00xH_01
+ nr_conjch0_mult_ch1(ch00,
+ ch01,
+ conjch00_ch01,
+ nb_rb,
+ shift); // this shift is equal to the channel level log2_maxh
+ // conj_H_10xH_11
+ nr_conjch0_mult_ch1(ch10,
+ ch11,
+ conjch10_ch11,
+ nb_rb,
+ shift);
+ // conj_H_01xH_01
+ nr_conjch0_mult_ch1(ch01,
+ ch01,
+ conjch01_ch01,
+ nb_rb,
+ shift);
+ // conj_H_11xH_11
+ nr_conjch0_mult_ch1(ch11,
+ ch11,
+ conjch11_ch11,
+ nb_rb,
+ shift);
+ // conj_H_01xH_00
+ nr_conjch0_mult_ch1(ch01,
+ ch00,
+ conjch01_ch00,
+ nb_rb,
+ shift);
+ // conj_H_11xH_10
+ nr_conjch0_mult_ch1(ch11,
+ ch10,
+ conjch11_ch10,
+ nb_rb,
+ shift);
+ }
+ if (n_rx==4){
+ // (1/2^log2_maxh)*conj_H_20xH_20: (1/(64*2*16))conjH_20*H_20*2^15
+ nr_conjch0_mult_ch1(ch20,
+ ch20,
+ conjch20_ch20,
+ nb_rb,
+ shift);
+
+ // (1/2^log2_maxh)*conj_H_30xH_30: (1/(64*2*4))conjH_30*H_30*2^15
+ nr_conjch0_mult_ch1(ch30,
+ ch30,
+ conjch30_ch30,
+ nb_rb,
+ shift);
+
+ // (1/2^log2_maxh)*conj_H_20xH_20: (1/(64*2))conjH_20*H_20*2^15
+ nr_conjch0_mult_ch1(ch20,
+ ch21,
+ conjch20_ch21,
+ nb_rb,
+ shift);
+
+ nr_conjch0_mult_ch1(ch30,
+ ch31,
+ conjch30_ch31,
+ nb_rb,
+ shift);
+
+ nr_conjch0_mult_ch1(ch21,
+ ch21,
+ conjch21_ch21,
+ nb_rb,
+ shift);
+
+ nr_conjch0_mult_ch1(ch31,
+ ch31,
+ conjch31_ch31,
+ nb_rb,
+ shift);
+
+ // (1/2^log2_maxh)*conj_H_20xH_20: (1/(64*2))conjH_20*H_20*2^15
+ nr_conjch0_mult_ch1(ch21,
+ ch20,
+ conjch21_ch20,
+ nb_rb,
+ shift);
+
+ nr_conjch0_mult_ch1(ch31,
+ ch30,
+ conjch31_ch30,
+ nb_rb,
+ shift);
+
+ nr_construct_HhH_elements(conjch00_ch00,
+ conjch01_ch01,
+ conjch11_ch11,
+ conjch10_ch10,//
+ conjch20_ch20,
+ conjch21_ch21,
+ conjch30_ch30,
+ conjch31_ch31,
+ conjch00_ch01,
+ conjch01_ch00,
+ conjch10_ch11,
+ conjch11_ch10,//
+ conjch20_ch21,
+ conjch21_ch20,
+ conjch30_ch31,
+ conjch31_ch30,
+ af_mf_00,
+ af_mf_01,
+ af_mf_10,
+ af_mf_11,
+ nb_rb,
+ symbol);
+ }
+ if (n_rx==2){
+ nr_construct_HhH_elements(conjch00_ch00,
+ conjch01_ch01,
+ conjch11_ch11,
+ conjch10_ch10,//
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ conjch00_ch01,
+ conjch01_ch00,
+ conjch10_ch11,
+ conjch11_ch10,//
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ af_mf_00,
+ af_mf_01,
+ af_mf_10,
+ af_mf_11,
+ nb_rb,
+ symbol);
+ }
+ //det_HhH = ad -bc
+ nr_det_HhH(af_mf_00,//a
+ af_mf_01,//b
+ af_mf_10,//c
+ af_mf_11,//d
+ determ_fin,
+ nb_rb,
+ symbol);
+ /* 2- Compute the channel matrix inversion **********************************
+ *
+ * |(conj_H_00xH_00+conj_H_10xH_10) (conj_H_00xH_01+conj_H_10xH_11)|
+ * A= | |
+ * |(conj_H_01xH_00+conj_H_11xH_10) (conj_H_01xH_01+conj_H_11xH_11)|
+ *
+ *
+ *
+ *inv(A) =(1/det)*[d -b
+ * -c a]
+ *
+ *
+ **************************************************************************/
+ __m128i *rxdataF_comp128_0,*rxdataF_comp128_1,*dl_ch_mag128_0,*dl_ch_mag128b_0,*dl_ch_mag128_1,*dl_ch_mag128b_1,*determ_fin_128;
+ __m128i mmtmpD2,mmtmpD3,mmtmpD0,mmtmpD1,QAM_amp128,QAM_amp128b;
+ __m128i *after_mf_a_128,*after_mf_b_128, *after_mf_c_128, *after_mf_d_128;
+
+ determ_fin_128 = (__m128i *)&determ_fin[0];
+
+ rxdataF_comp128_0 = (__m128i *)&rxdataF_comp[0][symbol*nb_rb*12];//aatx=0 @ aarx =0
+ rxdataF_comp128_1 = (__m128i *)&rxdataF_comp[n_rx][symbol*nb_rb*12];//aatx=1 @ aarx =0
+
+ dl_ch_mag128_0 = (__m128i *)&dl_ch_mag[0][symbol*nb_rb*12];
+ dl_ch_mag128_1 = (__m128i *)&dl_ch_mag[n_rx][symbol*nb_rb*12];
+ dl_ch_mag128b_0 = (__m128i *)&dl_ch_magb[0][symbol*nb_rb*12];
+ dl_ch_mag128b_1 = (__m128i *)&dl_ch_magb[n_rx][symbol*nb_rb*12];
+
+ after_mf_a_128 = (__m128i *)af_mf_00;
+ after_mf_b_128 = (__m128i *)af_mf_01;
+ after_mf_c_128 = (__m128i *)af_mf_10;
+ after_mf_d_128 = (__m128i *)af_mf_11;
+
+ QAM_amp128b = _mm_setzero_si128();
+
+ if (mod_order == 4) {
+ QAM_amp128 = _mm_set1_epi16(QAM16_n1); // 2/sqrt(10)
+ QAM_amp128b = _mm_setzero_si128();
+ } else if (mod_order == 6) {
+ QAM_amp128 = _mm_set1_epi16(QAM64_n1); //
+ QAM_amp128b = _mm_set1_epi16(QAM64_n2);
+ }
+
+ for (int rb=0; rb<3*nb_rb; rb++) {
+ if (mod_order>2) {
+ // get channel determ (da -bc) if not QPSK
+ mmtmpD0 = _mm_packs_epi32(determ_fin_128[0],determ_fin_128[0]);//convert 32 bits to 16 bits
+
+ dl_ch_mag128_0[0] = _mm_unpacklo_epi16(mmtmpD0,mmtmpD0);
+ dl_ch_mag128b_0[0] = dl_ch_mag128_0[0];
+
+ dl_ch_mag128_0[0] = _mm_mulhi_epi16(dl_ch_mag128_0[0],QAM_amp128);
+ dl_ch_mag128_0[0] = _mm_slli_epi16(dl_ch_mag128_0[0],1);//aatx=0 @ aarx =0
+ dl_ch_mag128_1[0] = dl_ch_mag128_0[0];//aatx=1 @ aarx =0
+
+ dl_ch_mag128b_0[0] = _mm_mulhi_epi16(dl_ch_mag128b_0[0],QAM_amp128b);
+ dl_ch_mag128b_0[0] = _mm_slli_epi16(dl_ch_mag128b_0[0],1);//aatx=0 @ aarx =
+ dl_ch_mag128b_1[0] = dl_ch_mag128b_0[0];//aatx=1 @ aarx =0
+
+ if ((rb==0)&&(symbol==1)) {
+ printf("\n Signal mag after ZF \n");
+ print_shorts("mag layer 1:",(int16_t*)&dl_ch_mag128_0[0]);
+ print_shorts("mag layer 2:",(int16_t*)&dl_ch_mag128_1[0]);
+ print_shorts("magb layer 1:",(int16_t*)&dl_ch_mag128b_0[0]);
+ print_shorts("magb layer 2:",(int16_t*)&dl_ch_mag128b_1[0]);
+ }
+ }
+ // multiply by channel Inv
+ //rxdataF_zf128_0 = rxdataF_comp128_0*d - b*rxdataF_comp128_1
+ //rxdataF_zf128_1 = rxdataF_comp128_1*a - c*rxdataF_comp128_0
+ mmtmpD2 = nr_inv_comp_muli(rxdataF_comp128_0[0],//x
+ after_mf_d_128[0]);//y
+ mmtmpD3 = nr_inv_comp_muli(rxdataF_comp128_1[0],//x
+ after_mf_b_128[0]);//y
+ //mmtmpD2[0] - mmtmpD3[0]
+ //rxdataF_zf128_0
+ mmtmpD0 = _mm_sub_epi16(mmtmpD2, mmtmpD3);
+
+ mmtmpD2 = nr_inv_comp_muli(rxdataF_comp128_1[0],//x
+ after_mf_a_128[0]);//y
+ mmtmpD3 = nr_inv_comp_muli(rxdataF_comp128_0[0],//x
+ after_mf_c_128[0]);//y
+ //mmtmpD2[0] - mmtmpD3[0]
+ //rxdataF_zf128_1
+ mmtmpD1 = _mm_sub_epi16(mmtmpD2, mmtmpD3);
+
+ rxdataF_comp128_0[0] = mmtmpD0;
+ rxdataF_comp128_1[0] = mmtmpD1;
+
+ /*if ((rb==0)&&(symbol==1)) {
+ printf("\n Rx signal after ZF \n");
+ print_shorts("Rx layer 1:",(int16_t*)&rxdataF_comp128_0[0]);
+ print_shorts("Rx layer 2:",(int16_t*)&rxdataF_comp128_1[0]);
+ }*/
+
+ determ_fin_128 += 1;
+ dl_ch_mag128_0 += 1;
+ dl_ch_mag128b_0 += 1;
+ dl_ch_mag128_1 += 1;
+ dl_ch_mag128b_1 += 1;
+ rxdataF_comp128_0 += 1;
+ rxdataF_comp128_1 += 1;
+ after_mf_a_128 += 1;
+ after_mf_b_128 += 1;
+ after_mf_c_128 += 1;
+ after_mf_d_128 += 1;
+ }
+ _mm_empty();
+ _m_empty();
+ return(0);
+}
static void nr_dlsch_layer_demapping(int16_t **llr_cw,
uint8_t Nl,
@@ -2327,7 +2958,7 @@ static int nr_dlsch_llr(NR_UE_PDSCH **pdsch_vars,
RX_type_t rx_type,
unsigned char harq_pid,
unsigned char gNB_id,
- unsigned char eNB_id_i,
+ unsigned char gNB_id_i,
unsigned char first_symbol_flag,
unsigned char symbol,
unsigned short nb_rb,
diff --git a/openair1/PHY/NR_UE_TRANSPORT/nr_initial_sync.c b/openair1/PHY/NR_UE_TRANSPORT/nr_initial_sync.c
index 13270c5c4b..189ad53efa 100644
--- a/openair1/PHY/NR_UE_TRANSPORT/nr_initial_sync.c
+++ b/openair1/PHY/NR_UE_TRANSPORT/nr_initial_sync.c
@@ -289,8 +289,7 @@ int nr_initial_sync(UE_nr_rxtx_proc_t *proc, PHY_VARS_NR_UE *ue, int n_frames)
proc,
i,
0,
- is*fp->samples_per_frame+ue->ssb_offset,
- 0);
+ is*fp->samples_per_frame+ue->ssb_offset);
#ifdef DEBUG_INITIAL_SYNCH
LOG_I(PHY,"Calling sss detection (normal CP)\n");
diff --git a/openair1/PHY/NR_UE_TRANSPORT/nr_pbch.c b/openair1/PHY/NR_UE_TRANSPORT/nr_pbch.c
index 3e1fd68b72..ef884512fd 100644
--- a/openair1/PHY/NR_UE_TRANSPORT/nr_pbch.c
+++ b/openair1/PHY/NR_UE_TRANSPORT/nr_pbch.c
@@ -60,16 +60,15 @@ uint16_t nr_pbch_extract(int **rxdataF,
uint8_t i,j,aarx;
int32_t *dl_ch0,*dl_ch0_ext,*rxF,*rxF_ext;
int nushiftmod4 = frame_parms->nushift;
- unsigned int rx_offset = frame_parms->first_carrier_offset + frame_parms->ssb_start_subcarrier; //and
-
- // if (rx_offset>= frame_parms->ofdm_symbol_size) rx_offset-=frame_parms->ofdm_symbol_size;
- rx_offset=(rx_offset)%(frame_parms->ofdm_symbol_size);
AssertFatal(symbol>=1 && symbol<5,
"symbol %d illegal for PBCH extraction\n",
symbol);
for (aarx=0; aarxnb_antennas_rx; aarx++) {
+ unsigned int rx_offset = frame_parms->first_carrier_offset + frame_parms->ssb_start_subcarrier;
+ rx_offset = (rx_offset)%(frame_parms->ofdm_symbol_size);
+
rxF = &rxdataF[aarx][(symbol+s_offset)*frame_parms->ofdm_symbol_size];
rxF_ext = &rxdataF_ext[aarx][symbol*20*12];
#ifdef DEBUG_PBCH
diff --git a/openair1/PHY/NR_UE_TRANSPORT/nr_prach.c b/openair1/PHY/NR_UE_TRANSPORT/nr_prach.c
index 3ab88dac0a..0ba02c6bac 100644
--- a/openair1/PHY/NR_UE_TRANSPORT/nr_prach.c
+++ b/openair1/PHY/NR_UE_TRANSPORT/nr_prach.c
@@ -244,86 +244,82 @@ int32_t generate_nr_prach(PHY_VARS_NR_UE *ue, uint8_t gNB_id, uint8_t slot){
*********************************************************/
if (mu==1) {
- if (fp->N_RB_UL <= 100)
- AssertFatal(1 == 0, "N_RB_UL %d not support for NR PRACH yet\n", fp->N_RB_UL);
- else if (fp->N_RB_UL < 137) {
- if (fp->threequarter_fs == 0) {
- //40 MHz @ 61.44 Ms/s
- //50 MHz @ 61.44 Ms/s
+ switch(fp->samples_per_subframe) {
+ case 15360:
+ // 10, 15 MHz @ 15.36 Ms/s
if (prach_sequence_length == 0) {
if (prach_fmt_id == 0 || prach_fmt_id == 1 || prach_fmt_id == 2)
- dftlen = 49152;
+ dftlen = 12288;
if (prach_fmt_id == 3)
- dftlen = 12288;
- } // 839 sequence
- else {
- switch (mu){
- case 1:
- dftlen = 2048;
- break;
- default:
- AssertFatal(1 == 0, "Shouldn't get here\n");
- break;
- }
+ dftlen = 3072;
+ } else { // 839 sequence
+ dftlen = 512;
}
- } else { // threequarter sampling
- // 40 MHz @ 46.08 Ms/s
+ break;
+
+ case 30720:
+ // 20, 25, 30 MHz @ 30.72 Ms/s
+ if (prach_sequence_length == 0) {
+ if (prach_fmt_id == 0 || prach_fmt_id == 1 || prach_fmt_id == 2)
+ dftlen = 24576;
+ if (prach_fmt_id == 3)
+ dftlen = 6144;
+ } else { // 839 sequence
+ dftlen = 1024;
+ }
+ break;
+
+ case 46080:
+ // 40 MHz @ 46.08 Ms/s
if (prach_sequence_length == 0) {
- AssertFatal(fp->N_RB_UL <= 107, "cannot do 108..136 PRBs with 3/4 sampling\n");
if (prach_fmt_id == 0 || prach_fmt_id == 1 || prach_fmt_id == 2)
dftlen = 36864;
if (prach_fmt_id == 3)
dftlen = 9216;
- } else {
- switch (mu){
- case 1:
- dftlen = 1536;
- break;
- default:
- AssertFatal(1 == 0, "Shouldn't get here\n");
- break;
- }
- } // short format
- } // 3/4 sampling
- } // <=50 MHz BW
- else if (fp->N_RB_UL <= 273) {
- if (fp->threequarter_fs == 0) {
- //80,90,100 MHz @ 122.88 Ms/s
+ } else { // 839 sequence
+ dftlen = 1536;
+ }
+ break;
+
+ case 61440:
+ // 40, 50, 60 MHz @ 61.44 Ms/s
+ if (prach_sequence_length == 0) {
+ if (prach_fmt_id == 0 || prach_fmt_id == 1 || prach_fmt_id == 2)
+ dftlen = 49152;
+ if (prach_fmt_id == 3)
+ dftlen = 12288;
+ } else { // 839 sequence
+ dftlen = 2048;
+ }
+ break;
+
+ case 92160:
+ // 50, 60, 70, 80, 90 MHz @ 92.16 Ms/s
+ if (prach_sequence_length == 0) {
+ if (prach_fmt_id == 0 || prach_fmt_id == 1 || prach_fmt_id == 2)
+ dftlen = 73728;
+ if (prach_fmt_id == 3)
+ dftlen = 18432;
+ } else { // 839 sequence
+ dftlen = 3072;
+ }
+ break;
+
+ case 122880:
+ // 70, 80, 90, 100 MHz @ 122.88 Ms/s
if (prach_sequence_length == 0) {
if (prach_fmt_id == 0 || prach_fmt_id == 1 || prach_fmt_id == 2)
dftlen = 98304;
if (prach_fmt_id == 3)
dftlen = 24576;
+ } else { // 839 sequence
+ dftlen = 4096;
}
- } else { // threequarter sampling
- switch (mu){
- case 1:
- dftlen = 4096;
- break;
- default:
- AssertFatal(1 == 0, "Shouldn't get here\n");
- break;
- }
+ break;
+
+ default:
+ AssertFatal(1==0,"sample rate %f MHz not supported for numerology %d\n", fp->samples_per_subframe / 1000.0, mu);
}
- } else {
- AssertFatal(fp->N_RB_UL <= 217, "cannot do more than 217 PRBs with 3/4 sampling\n");
- // 80 MHz @ 92.16 Ms/s
- if (prach_sequence_length == 0) {
- if (prach_fmt_id == 0 || prach_fmt_id == 1 || prach_fmt_id == 2)
- dftlen = 73728;
- if (prach_fmt_id == 3)
- dftlen = 18432;
- } else {
- switch (mu){
- case 1:
- dftlen = 3072;
- break;
- default:
- AssertFatal(1 == 0, "Shouldn't get here\n");
- break;
- }
- }
- }
}
else if (mu==3) {
if (fp->threequarter_fs)
@@ -425,15 +421,16 @@ int32_t generate_nr_prach(PHY_VARS_NR_UE *ue, uint8_t gNB_id, uint8_t slot){
uint8_t use_extended_prach_prefix = 0;
if(fp->numerology_index == 0) {
if (prachStartSymbol == 0 || prachStartSymbol == 7)
- use_extended_prach_prefix = 1;
+ use_extended_prach_prefix = 1;
}
else {
if (slot%(fp->slots_per_subframe/2)==0 && prachStartSymbol == 0)
- use_extended_prach_prefix = 1;
+ use_extended_prach_prefix = 1;
}
-
- if (fp->N_RB_UL <= 34) { //32 PRB case 61.44Msps
- if (fp->threequarter_fs == 0) {
+
+ if (mu == 3) {
+ switch (fp->samples_per_subframe) {
+ case 61440: // 32 PRB case, 61.44 Msps
Ncp<<=1; //to account for 61.44Mbps
// This is after cyclic prefix
prach2 = prach+(Ncp<<1); //times 2 for complex samples
@@ -491,13 +488,9 @@ int32_t generate_nr_prach(PHY_VARS_NR_UE *ue, uint8_t gNB_id, uint8_t slot){
prach_len = (512*12)+Ncp;
}
}
- }
- else
- AssertFatal(1==0,"3/4 sampling not supported for this PRACH size %d\n",fp->N_RB_UL);
-
- }
- else if (fp->N_RB_UL <= 68) {//66 PRB case, 122.88 Msps
- if (fp->threequarter_fs == 0) {
+ break;
+
+ case 122880: // 66 PRB case, 122.88 Msps
Ncp<<=2; //to account for 122.88Mbps
// This is after cyclic prefix
prach2 = prach+(Ncp<<1); //times 2 for complex samples
@@ -555,13 +548,211 @@ int32_t generate_nr_prach(PHY_VARS_NR_UE *ue, uint8_t gNB_id, uint8_t slot){
prach_len = (1024*12)+Ncp;
}
}
+ break;
+
+ default:
+ AssertFatal(1==0,"sample rate %f MHz not supported for numerology %d\n", fp->samples_per_subframe / 1000.0, mu);
}
- else
- AssertFatal(1==0,"3/4 sampling not supported for this PRACH size %d\n",fp->N_RB_UL);
- }
- else if (fp->N_RB_UL < 137) { // 46.08 or 61.44 Ms/s
- if (fp->threequarter_fs == 0) { // full sampling @ 61.44 Ms/s
- Ncp<<=1; //to account for 61.44Mbps
+ } else if (mu == 1) {
+ switch (fp->samples_per_subframe) {
+ case 15360: // full sampling @ 15.36 Ms/s
+ Ncp = Ncp/2; // to account for 15.36 Ms/s
+ // This is after cyclic prefix
+ prach2 = prach+(2*Ncp); // times 2 for complex samples
+ if (prach_sequence_length == 0){
+ if (prach_fmt_id == 0) { // 24576 samples @ 30.72 Ms/s, 12288 samples @ 15.36 Ms/s
+ idft(IDFT_12288,prachF,prach2,1);
+ // here we have | empty | Prach12288 |
+ memmove(prach,prach+(12288<<1),(Ncp<<2));
+ // here we have | Prefix | Prach12288 |
+ prach_len = 12288+Ncp;
+ } else if (prach_fmt_id == 1) { // 24576 samples @ 30.72 Ms/s, 12288 samples @ 15.36 Ms/s
+ idft(IDFT_12288,prachF,prach2,1);
+ // here we have | empty | Prach12288 | empty12288 |
+ memmove(prach2+(12288<<1),prach2,(12288<<2));
+ // here we have | empty | Prach12288 | Prach12288 |
+ memmove(prach,prach+(12288<<2),(Ncp<<2));
+ // here we have | Prefix | Prach12288 | Prach12288 |
+ prach_len = (12288*2)+Ncp;
+ } else if (prach_fmt_id == 2) { // 24576 samples @ 30.72 Ms/s, 12288 samples @ 15.36 Ms/s
+ idft(IDFT_12288,prachF,prach2,1);
+ // here we have | empty | Prach12288 | empty12288 | empty12288 | empty12288 |
+ memmove(prach2+(12288<<1),prach2,(12288<<2));
+ // here we have | empty | Prach12288 | Prach12288 | empty12288 | empty12288 |
+ memmove(prach2+(12288<<2),prach2,(12288<<3));
+ // here we have | empty | Prach12288 | Prach12288 | Prach12288 | Prach12288 |
+ memmove(prach,prach+(12288<<3),(Ncp<<2));
+ // here we have | Prefix | Prach12288 | Prach12288 | Prach12288 | Prach12288 |
+ prach_len = (12288*4)+Ncp;
+ } else if (prach_fmt_id == 3) { // 6144 samples @ 30.72 Ms/s, 3072 samples @ 15.36 Ms/s
+ idft(IDFT_3072,prachF,prach2,1);
+ // here we have | empty | Prach3072 | empty3072 | empty3072 | empty3072 |
+ memmove(prach2+(3072<<1),prach2,(3072<<2));
+ // here we have | empty | Prach3072 | Prach3072 | empty3072 | empty3072 |
+ memmove(prach2+(3072<<2),prach2,(3072<<3));
+ // here we have | empty | Prach3072 | Prach3072 | Prach3072 | Prach3072 |
+ memmove(prach,prach+(3072<<3),(Ncp<<2));
+ // here we have | Prefix | Prach3072 | Prach3072 | Prach3072 | Prach3072 |
+ prach_len = (3072*4)+Ncp;
+ }
+ } else { // short PRACH sequence
+ if (use_extended_prach_prefix)
+ Ncp += 8; // 16*kappa, kappa=0.5 for 15.36 Ms/s
+ prach2 = prach+(2*Ncp); // times 2 for complex samples
+ if (prach_fmt_id == 9) {
+ idft(IDFT_512,prachF,prach2,1);
+ // here we have | empty | Prach512 |
+ memmove(prach,prach+(512<<1),(Ncp<<2));
+ // here we have | Prefix | Prach512 |
+ prach_len = (512*1)+Ncp;
+ } else if (prach_fmt_id == 4 || prach_fmt_id == 7) {
+ idft(IDFT_512,prachF,prach2,1);
+ // here we have | empty | Prach512 | empty512 |
+ memmove(prach2+(512<<1),prach2,(512<<2));
+ // here we have | empty | Prach512 | Prach512 |
+ memmove(prach,prach+(512<<1),(Ncp<<2));
+ // here we have | Prefix | Prach512 | Prach512 |
+ prach_len = (512*2)+Ncp;
+ } else if (prach_fmt_id == 5) { // 4x512
+ idft(IDFT_512,prachF,prach2,1);
+ // here we have | empty | Prach512 | empty512 | empty512 | empty512 |
+ memmove(prach2+(512<<1),prach2,(512<<2));
+ // here we have | empty | Prach512 | Prach512 | empty512 | empty512 |
+ memmove(prach2+(512<<2),prach2,(512<<3));
+ // here we have | empty | Prach512 | Prach512 | Prach512 | Prach512 |
+ memmove(prach,prach+(512<<1),(Ncp<<2));
+ // here we have | Prefix | Prach512 | Prach512 | Prach512 | Prach512 |
+ prach_len = (512*4)+Ncp;
+ } else if (prach_fmt_id == 6) { // 6x512
+ idft(IDFT_512,prachF,prach2,1);
+ // here we have | empty | Prach512 | empty512 | empty512 | empty512 | empty512 | empty512 |
+ memmove(prach2+(512<<1),prach2,(512<<2));
+ // here we have | empty | Prach512 | Prach512 | empty512 | empty512 | empty512 | empty512 |
+ memmove(prach2+(512<<2),prach2,(512<<3));
+ // here we have | empty | Prach512 | Prach512 | Prach512 | Prach512 | empty512 | empty512 |
+ memmove(prach2+(512<<3),prach2,(512<<3));
+ // here we have | empty | Prach512 | Prach512 | Prach512 | Prach512 | Prach512 | Prach512 |
+ memmove(prach,prach+(512<<1),(Ncp<<2));
+ // here we have | Prefix | Prach512 | Prach512 | Prach512 | Prach512 | Prach512 | Prach512 |
+ prach_len = (512*6)+Ncp;
+ } else if (prach_fmt_id == 8) { // 12x512
+ idft(IDFT_512,prachF,prach2,1);
+ // here we have | empty | Prach512 | empty512 | empty512 | empty512 | empty512 | empty512 | empty512 | empty512 | empty512 | empty512 | empty512 | empty512 |
+ memmove(prach2+(512<<1),prach2,(512<<2));
+ // here we have | empty | Prach512 | Prach512 | empty512 | empty512 | empty512 | empty512 | empty512 | empty512 | empty512 | empty512 | empty512 | empty512 |
+ memmove(prach2+(512<<2),prach2,(512<<3));
+ // here we have | empty | Prach512 | Prach512 | Prach512 | Prach512 | empty512 | empty512 | empty512 | empty512 | empty512 | empty512 | empty512 | empty512 |
+ memmove(prach2+(512<<3),prach2,(512<<3));
+ // here we have | empty | Prach512 | Prach512 | Prach512 | Prach512 | Prach512 | Prach512 | empty512 | empty512 | empty512 | empty512 | empty512 | empty512 |
+ memmove(prach2+(512<<1)*6,prach2,(512<<2)*6);
+ // here we have | empty | Prach512 | Prach512 | Prach512 | Prach512 | Prach512 | Prach512 | Prach512 | Prach512 | Prach512 | Prach512 | Prach512 | Prach512 |
+ memmove(prach,prach+(512<<1),(Ncp<<2));
+ // here we have | Prefix | Prach512 | Prach512 | Prach512 | Prach512 | Prach512 | Prach512 | Prach512 | Prach512 | Prach512 | Prach512 | Prach512 | Prach512 |
+ prach_len = (512*12)+Ncp;
+ }
+ }
+ break;
+
+ case 30720: // full sampling @ 30.72 Ms/s
+ Ncp = Ncp*1; // to account for 30.72 Ms/s
+ // This is after cyclic prefix
+ prach2 = prach+(2*Ncp); // times 2 for complex samples
+ if (prach_sequence_length == 0){
+ if (prach_fmt_id == 0) { // 24576 samples @ 30.72 Ms/s
+ idft(IDFT_24576,prachF,prach2,1);
+ // here we have | empty | Prach24576 |
+ memmove(prach,prach+(24576<<1),(Ncp<<2));
+ // here we have | Prefix | Prach24576 |
+ prach_len = 24576+Ncp;
+ } else if (prach_fmt_id == 1) { // 24576 samples @ 30.72 Ms/s
+ idft(IDFT_24576,prachF,prach2,1);
+ // here we have | empty | Prach24576 | empty24576 |
+ memmove(prach2+(24576<<1),prach2,(24576<<2));
+ // here we have | empty | Prach24576 | Prach24576 |
+ memmove(prach,prach+(24576<<2),(Ncp<<2));
+ // here we have | Prefix | Prach24576 | Prach24576 |
+ prach_len = (24576*2)+Ncp;
+ } else if (prach_fmt_id == 2) { // 24576 samples @ 30.72 Ms/s
+ idft(IDFT_24576,prachF,prach2,1);
+ // here we have | empty | Prach24576 | empty24576 | empty24576 | empty24576 |
+ memmove(prach2+(24576<<1),prach2,(24576<<2));
+ // here we have | empty | Prach24576 | Prach24576 | empty24576 | empty24576 |
+ memmove(prach2+(24576<<2),prach2,(24576<<3));
+ // here we have | empty | Prach24576 | Prach24576 | Prach24576 | Prach24576 |
+ memmove(prach,prach+(24576<<3),(Ncp<<2));
+ // here we have | Prefix | Prach24576 | Prach24576 | Prach24576 | Prach24576 |
+ prach_len = (24576*4)+Ncp;
+ } else if (prach_fmt_id == 3) { // 6144 samples @ 30.72 Ms/s
+ idft(IDFT_6144,prachF,prach2,1);
+ // here we have | empty | Prach6144 | empty6144 | empty6144 | empty6144 |
+ memmove(prach2+(6144<<1),prach2,(6144<<2));
+ // here we have | empty | Prach6144 | Prach6144 | empty6144 | empty6144 |
+ memmove(prach2+(6144<<2),prach2,(6144<<3));
+ // here we have | empty | Prach6144 | Prach6144 | Prach6144 | Prach6144 |
+ memmove(prach,prach+(6144<<3),(Ncp<<2));
+ // here we have | Prefix | Prach6144 | Prach6144 | Prach6144 | Prach6144 |
+ prach_len = (6144*4)+Ncp;
+ }
+ } else { // short PRACH sequence
+ if (use_extended_prach_prefix)
+ Ncp += 16; // 16*kappa, kappa=1 for 30.72Msps
+ prach2 = prach+(2*Ncp); // times 2 for complex samples
+ if (prach_fmt_id == 9) {
+ idft(IDFT_1024,prachF,prach2,1);
+ // here we have | empty | Prach1024 |
+ memmove(prach,prach+(1024<<1),(Ncp<<2));
+ // here we have | Prefix | Prach1024 |
+ prach_len = (1024*1)+Ncp;
+ } else if (prach_fmt_id == 4 || prach_fmt_id == 7) {
+ idft(IDFT_1024,prachF,prach2,1);
+ // here we have | empty | Prach1024 | empty1024 |
+ memmove(prach2+(1024<<1),prach2,(1024<<2));
+ // here we have | empty | Prach1024 | Prach1024 |
+ memmove(prach,prach+(1024<<1),(Ncp<<2));
+ // here we have | Prefix | Prach1024 | Prach1024 |
+ prach_len = (1024*2)+Ncp;
+ } else if (prach_fmt_id == 5) { // 4x1024
+ idft(IDFT_1024,prachF,prach2,1);
+ // here we have | empty | Prach1024 | empty1024 | empty1024 | empty1024 |
+ memmove(prach2+(1024<<1),prach2,(1024<<2));
+ // here we have | empty | Prach1024 | Prach1024 | empty1024 | empty1024 |
+ memmove(prach2+(1024<<2),prach2,(1024<<3));
+ // here we have | empty | Prach1024 | Prach1024 | Prach1024 | Prach1024 |
+ memmove(prach,prach+(1024<<1),(Ncp<<2));
+ // here we have | Prefix | Prach1024 | Prach1024 | Prach1024 | Prach1024 |
+ prach_len = (1024*4)+Ncp;
+ } else if (prach_fmt_id == 6) { // 6x1024
+ idft(IDFT_1024,prachF,prach2,1);
+ // here we have | empty | Prach1024 | empty1024 | empty1024 | empty1024 | empty1024 | empty1024 |
+ memmove(prach2+(1024<<1),prach2,(1024<<2));
+ // here we have | empty | Prach1024 | Prach1024 | empty1024 | empty1024 | empty1024 | empty1024 |
+ memmove(prach2+(1024<<2),prach2,(1024<<3));
+ // here we have | empty | Prach1024 | Prach1024 | Prach1024 | Prach1024 | empty1024 | empty1024 |
+ memmove(prach2+(1024<<3),prach2,(1024<<3));
+ // here we have | empty | Prach1024 | Prach1024 | Prach1024 | Prach1024 | Prach1024 | Prach1024 |
+ memmove(prach,prach+(1024<<1),(Ncp<<2));
+ // here we have | Prefix | Prach1024 | Prach1024 | Prach1024 | Prach1024 | Prach1024 | Prach1024 |
+ prach_len = (1024*6)+Ncp;
+ } else if (prach_fmt_id == 8) { // 12x1024
+ idft(IDFT_1024,prachF,prach2,1);
+ // here we have | empty | Prach1024 | empty1024 | empty1024 | empty1024 | empty1024 | empty1024 | empty1024 | empty1024 | empty1024 | empty1024 | empty1024 | empty1024 |
+ memmove(prach2+(1024<<1),prach2,(1024<<2));
+ // here we have | empty | Prach1024 | Prach1024 | empty1024 | empty1024 | empty1024 | empty1024 | empty1024 | empty1024 | empty1024 | empty1024 | empty1024 | empty1024 |
+ memmove(prach2+(1024<<2),prach2,(1024<<3));
+ // here we have | empty | Prach1024 | Prach1024 | Prach1024 | Prach1024 | empty1024 | empty1024 | empty1024 | empty1024 | empty1024 | empty1024 | empty1024 | empty1024 |
+ memmove(prach2+(1024<<3),prach2,(1024<<3));
+ // here we have | empty | Prach1024 | Prach1024 | Prach1024 | Prach1024 | Prach1024 | Prach1024 | empty1024 | empty1024 | empty1024 | empty1024 | empty1024 | empty1024 |
+ memmove(prach2+(1024<<1)*6,prach2,(1024<<2)*6);
+ // here we have | empty | Prach1024 | Prach1024 | Prach1024 | Prach1024 | Prach1024 | Prach1024 | Prach1024 | Prach1024 | Prach1024 | Prach1024 | Prach1024 | Prach1024 |
+ memmove(prach,prach+(1024<<1),(Ncp<<2));
+ // here we have | Prefix | Prach1024 | Prach1024 | Prach1024 | Prach1024 | Prach1024 | Prach1024 | Prach1024 | Prach1024 | Prach1024 | Prach1024 | Prach1024 | Prach1024 |
+ prach_len = (1024*12)+Ncp;
+ }
+ }
+ break;
+
+ case 61440: // full sampling @ 61.44 Ms/s
+ Ncp = Ncp*2; // to account for 61.44 Ms/s
// This is after cyclic prefix
prach2 = prach+(Ncp<<1); //times 2 for complex samples
if (prach_sequence_length == 0){
@@ -587,7 +778,7 @@ int32_t generate_nr_prach(PHY_VARS_NR_UE *ue, uint8_t gNB_id, uint8_t slot){
memmove(prach,prach+(49152<<3),(Ncp<<2));
// here we have |Prefix | Prach49152 | Prach49152| Prach49152 | Prach49152
prach_len = (49152*4)+Ncp;
- } else if (prach_fmt_id == 3) { // //6144 samples @ 30.72 Ms/s, 12288 samples @ 61.44 Ms/s
+ } else if (prach_fmt_id == 3) { // 6144 samples @ 30.72 Ms/s, 12288 samples @ 61.44 Ms/s
idft(IDFT_12288,prachF,prach2,1);
memmove(prach2+(12288<<1),prach2,(12288<<2));
// here we have |empty | Prach12288 | Prach12288| empty12288 | empty12288
@@ -649,7 +840,9 @@ int32_t generate_nr_prach(PHY_VARS_NR_UE *ue, uint8_t gNB_id, uint8_t slot){
prach_len = (2048*12)+Ncp;
}
}
- } else { // threequarter sampling @ 46.08 Ms/s
+ break;
+
+ case 46080: // threequarter sampling @ 46.08 Ms/s
Ncp = (Ncp*3)/2;
prach2 = prach+(Ncp<<1);
if (prach_sequence_length == 0){
@@ -738,9 +931,9 @@ int32_t generate_nr_prach(PHY_VARS_NR_UE *ue, uint8_t gNB_id, uint8_t slot){
prach_len = (1536*12)+Ncp;
}
}
- }
- } else if (fp->N_RB_UL <= 273) {// 92.16 or 122.88 Ms/s
- if (fp->threequarter_fs == 0) { // full sampling @ 122.88 Ms/s
+ break;
+
+ case 122880: // full sampling @ 122.88 Ms/s
Ncp<<=2; //to account for 122.88Mbps
// This is after cyclic prefix
prach2 = prach+(Ncp<<1); //times 2 for complex samples
@@ -828,7 +1021,9 @@ int32_t generate_nr_prach(PHY_VARS_NR_UE *ue, uint8_t gNB_id, uint8_t slot){
prach_len = (4096*12)+Ncp;
}
}
- } else { // three quarter sampling @ 92.16 Ms/s
+ break;
+
+ case 92160: // three quarter sampling @ 92.16 Ms/s
Ncp = (Ncp*3); //to account for 92.16 Msps
prach2 = prach+(Ncp<<1); //times 2 for complex samples
if (prach_sequence_length == 0){
@@ -915,6 +1110,10 @@ int32_t generate_nr_prach(PHY_VARS_NR_UE *ue, uint8_t gNB_id, uint8_t slot){
prach_len = (3072*12)+Ncp;
}
}
+ break;
+
+ default:
+ AssertFatal(1==0,"sample rate %f MHz not supported for numerology %d\n", fp->samples_per_subframe / 1000.0, mu);
}
}
diff --git a/openair1/PHY/NR_UE_TRANSPORT/nr_transport_proto_ue.h b/openair1/PHY/NR_UE_TRANSPORT/nr_transport_proto_ue.h
index 91274b908a..1e7e10def7 100644
--- a/openair1/PHY/NR_UE_TRANSPORT/nr_transport_proto_ue.h
+++ b/openair1/PHY/NR_UE_TRANSPORT/nr_transport_proto_ue.h
@@ -686,11 +686,8 @@ void dlsch_detection_mrc_TM34(NR_DL_FRAME_PARMS *frame_parms,
int32_t **dl_ch_estimates,
int32_t **rxdataF_ext,
int32_t **dl_ch_estimates_ext,
- uint16_t pmi,
- uint8_t *pmi_ext,
uint32_t *rb_alloc,
uint8_t symbol,
- uint8_t nr_slot_rx,
NR_DL_FRAME_PARMS *frame_parms)
\brief This function extracts the received resource blocks, both channel estimates and data symbols,
for the current allocation and for single antenna eNB transmission.
@@ -698,67 +695,61 @@ void dlsch_detection_mrc_TM34(NR_DL_FRAME_PARMS *frame_parms,
@param dl_ch_estimates Channel estimates of current slot
@param rxdataF_ext FFT output for RBs in this allocation
@param dl_ch_estimates_ext Channel estimates for RBs in this allocation
- @param pmi subband Precoding matrix indicator
- @param pmi_ext Extracted PMI for chosen RBs
@param rb_alloc RB allocation vector
@param symbol Symbol to extract
- @param nr_slot_rx Slot number
- @param high_speed_flag
+ @param n_dmrs_cdm_groups
@param frame_parms Pointer to frame descriptor
*/
unsigned short nr_dlsch_extract_rbs_single(int **rxdataF,
int **dl_ch_estimates,
int **rxdataF_ext,
int **dl_ch_estimates_ext,
- unsigned short pmi,
- unsigned char *pmi_ext,
unsigned char symbol,
uint8_t pilots,
uint8_t config_type,
unsigned short start_rb,
- unsigned short nb_pdsch_rb,
- unsigned char nr_slot_rx,
- uint32_t high_speed_flag,
+ unsigned short nb_rb_pdsch,
+ uint8_t n_dmrs_cdm_groups,
NR_DL_FRAME_PARMS *frame_parms,
uint16_t dlDmrsSymbPos);
-/** \fn dlsch_extract_rbs_dual(int32_t **rxdataF,
+/** \fn dlsch_extract_rbs_multiple(int32_t **rxdataF,
int32_t **dl_ch_estimates,
int32_t **rxdataF_ext,
int32_t **dl_ch_estimates_ext,
- uint16_t pmi,
- uint8_t *pmi_ext,
- uint32_t *rb_alloc,
- uint8_t symbol,
- NR_DL_FRAME_PARMS *frame_parms)
+ unsigned char symbol
+ uint8_t pilots,
+ uint8_t config_type,
+ unsigned short start_rb,
+ unsigned short nb_rb_pdsch,
+ uint8_t n_dmrs_cdm_groups,
+ uint8_t Nl,
+ NR_DL_FRAME_PARMS *frame_parms,
+ uint16_t dlDmrsSymbPos)
\brief This function extracts the received resource blocks, both channel estimates and data symbols,
- for the current allocation and for dual antenna eNB transmission.
+ for the current allocation and for multiple layer antenna gNB transmission.
@param rxdataF Raw FFT output of received signal
@param dl_ch_estimates Channel estimates of current slot
@param rxdataF_ext FFT output for RBs in this allocation
@param dl_ch_estimates_ext Channel estimates for RBs in this allocation
- @param pmi subband Precoding matrix indicator
- @param pmi_ext Extracted PMI for chosen RBs
- @param rb_alloc RB allocation vector
+ @param Nl nb of antenna layers
@param symbol Symbol to extract
- @param nr_slot_rx Slot index
- @param high_speed_flag
+ @param n_dmrs_cdm_groups
@param frame_parms Pointer to frame descriptor
*/
-unsigned short nr_dlsch_extract_rbs_dual(int **rxdataF,
- int **dl_ch_estimates,
- int **rxdataF_ext,
- int **dl_ch_estimates_ext,
- unsigned short pmi,
- unsigned char *pmi_ext,
- unsigned char symbol,
- uint8_t pilots,
- unsigned short start_rb,
- unsigned short nb_rb_pdsch,
- unsigned char nr_slot_rx,
- uint32_t high_speed_flag,
- NR_DL_FRAME_PARMS *frame_parms,
- MIMO_mode_t mimo_mode);
+unsigned short nr_dlsch_extract_rbs_multiple(int **rxdataF,
+ int **dl_ch_estimates,
+ int **rxdataF_ext,
+ int **dl_ch_estimates_ext,
+ unsigned char symbol,
+ uint8_t pilots,
+ uint8_t config_type,
+ unsigned short start_rb,
+ unsigned short nb_rb_pdsch,
+ uint8_t n_dmrs_cdm_groups,
+ uint8_t Nl,
+ NR_DL_FRAME_PARMS *frame_parms,
+ uint16_t dlDmrsSymbPos);
/** \fn dlsch_extract_rbs_TM7(int32_t **rxdataF,
int32_t **dl_bf_ch_estimates,
@@ -812,8 +803,9 @@ void nr_dlsch_channel_compensation(int32_t **rxdataF_ext,
int32_t **dl_ch_magb,
int32_t **dl_ch_magr,
int32_t **rxdataF_comp,
- int32_t **rho,
+ int32_t ***rho,
NR_DL_FRAME_PARMS *frame_parms,
+ uint8_t nb_aatx,
uint8_t symbol,
uint8_t start_symbol,
uint8_t first_symbol_flag,
@@ -827,7 +819,7 @@ void nr_dlsch_channel_compensation_core(int **rxdataF_ext,
int **dl_ch_mag,
int **dl_ch_magb,
int **rxdataF_comp,
- int **rho,
+ int ***rho,
unsigned char n_tx,
unsigned char n_rx,
unsigned char mod_order,
@@ -898,6 +890,15 @@ void nr_dlsch_channel_level_median(int **dl_ch_estimates_ext,
int length,
int start_point);
+void nr_dlsch_detection_mrc(int **rxdataF_comp,
+ int ***rho,
+ int **dl_ch_mag,
+ int **dl_ch_magb,
+ short n_tx,
+ short n_rx,
+ unsigned char symbol,
+ unsigned short nb_rb);
+
void nr_dlsch_detection_mrc_core(int **rxdataF_comp,
int **rxdataF_comp_i,
int **rho,
@@ -971,6 +972,7 @@ void dlsch_channel_compensation_TM34(NR_DL_FRAME_PARMS *frame_parms,
*/
void nr_dlsch_channel_level(int **dl_ch_estimates_ext,
NR_DL_FRAME_PARMS *frame_parms,
+ uint8_t n_tx,
int32_t *avg,
uint8_t symbol,
uint32_t len,
@@ -1002,6 +1004,8 @@ void dlsch_channel_level_TM7(int32_t **dl_bf_ch_estimates_ext,
void nr_dlsch_scale_channel(int32_t **dl_ch_estimates_ext,
NR_DL_FRAME_PARMS *frame_parms,
+ uint8_t n_tx,
+ uint8_t n_rx,
NR_UE_DLSCH_t **dlsch_ue,
uint8_t symbol,
uint8_t start_symbol,
diff --git a/openair1/PHY/defs_gNB.h b/openair1/PHY/defs_gNB.h
index 0a339c11d7..2edae9eaad 100644
--- a/openair1/PHY/defs_gNB.h
+++ b/openair1/PHY/defs_gNB.h
@@ -138,8 +138,10 @@ typedef struct {
typedef struct {
/// Pointers to variables related to DLSCH harq process
NR_DL_gNB_HARQ_t harq_process;
- /// TX buffers for UE-spec transmission (antenna ports 5 or 7..14, prior to precoding)
+ /// TX buffers for UE-spec transmission (antenna layers 1,...,4 after to precoding)
int32_t *txdataF[NR_MAX_NB_LAYERS];
+ /// TX buffers for UE-spec transmission (antenna ports 1000 or 1001,...,1007, before precoding)
+ int32_t *txdataF_precoding[NR_MAX_NB_LAYERS];
/// Modulated symbols buffer
int32_t *mod_symbs[NR_MAX_NB_CODEWORDS];
/// beamforming weights for UE-spec transmission (antenna ports 5 or 7..14), for each codeword, maximum 4 layers?
diff --git a/openair1/PHY/defs_nr_UE.h b/openair1/PHY/defs_nr_UE.h
index 390574a66b..de03b13464 100644
--- a/openair1/PHY/defs_nr_UE.h
+++ b/openair1/PHY/defs_nr_UE.h
@@ -187,7 +187,7 @@ typedef struct {
//! estimated rssi (dBm)
short rx_rssi_dBm[NUMBER_OF_CONNECTED_gNB_MAX];
//! estimated correlation (wideband linear) between spatial channels (computed in dlsch_demodulation)
- int rx_correlation[NUMBER_OF_CONNECTED_gNB_MAX][2];
+ int rx_correlation[NUMBER_OF_CONNECTED_gNB_MAX][4][4];
//! estimated correlation (wideband dB) between spatial channels (computed in dlsch_demodulation)
int rx_correlation_dB[NUMBER_OF_CONNECTED_gNB_MAX][2];
@@ -332,12 +332,10 @@ typedef struct {
int32_t **dl_ch_magb1[8][8];
/// \brief Magnitude of Downlink Channel, first layer (256QAM level).
int32_t **dl_ch_magr0;
- /// \brief Cross-correlation of two gNB signals.
- /// - first index: rx antenna [0..nb_antennas_rx[
+ /// \brief Cross-correlation Matrix of the gNB Tx channel signals.
+ /// - first index: aatx*n_rx+aarx for all aatx=[0..n_tx[ and aarx=[0..nb_rx[
/// - second index: symbol [0..]
- int32_t **rho;
- /// never used... always send dl_ch_rho_ext instead...
- int32_t **rho_i;
+ int32_t ***rho;
/// \brief Pointers to llr vectors (2 TBs).
/// - first index: ? [0..1] (hard coded)
/// - second index: ? [0..1179743] (hard coded)
diff --git a/openair1/SCHED_NR/nr_ru_procedures.c b/openair1/SCHED_NR/nr_ru_procedures.c
index a78b1f4805..4fbb4524e9 100644
--- a/openair1/SCHED_NR/nr_ru_procedures.c
+++ b/openair1/SCHED_NR/nr_ru_procedures.c
@@ -279,13 +279,12 @@ static void *nr_feptx_thread(void *param) {
RU_feptx_t *feptx = (RU_feptx_t *)param;
RU_t *ru;
- int aa, slot, start, l, nb_antenna_ports, ret;
+ int aa, slot, start, l, ret;
int i;
int32_t ***bw;
NR_DL_FRAME_PARMS *fp;
int ofdm_mask_full;
int txdataF_offset;
- int32_t *txdataF;
while (!oai_exit) {
ret = 0;
if (wait_on_condition(&feptx->mutex_feptx,&feptx->cond_feptx,&feptx->instance_cnt_feptx,"NR feptx thread")<0) break;
@@ -299,7 +298,6 @@ static void *nr_feptx_thread(void *param) {
l = feptx->symbol;
fp = ru->nr_frame_parms;
start = feptx->symbol;
- nb_antenna_ports = feptx->nb_antenna_ports;
ofdm_mask_full = (1<<(ru->nb_tx*2))-1;
if(ru->num_gNB != 0){
@@ -314,16 +312,16 @@ static void *nr_feptx_thread(void *param) {
}
else {
bw = ru->beam_weights[0];
- txdataF = &ru->gNB_list[0]->common_vars.txdataF[0][txdataF_offset];
for(i=0; isymbols_per_slot>>1; ++i){
- nr_beam_precoding(&txdataF,
+ nr_beam_precoding(ru->gNB_list[0]->common_vars.txdataF,
ru->common.txdataF_BF,
fp,
bw,
slot,
l+i,
aa,
- nb_antenna_ports);
+ ru->nb_log_antennas,
+ txdataF_offset);//here
}
}
stop_meas(&ru->precoding_stats);
@@ -362,7 +360,8 @@ static void *nr_feptx_thread(void *param) {
slot,
l,
aa,
- nb_antenna_ports);
+ ru->nb_log_antennas,
+ 0);
}
stop_meas(&ru->precoding_stats);
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_RU_FEPTX_PREC+feptx->index+1 , 0);
@@ -485,7 +484,8 @@ void nr_feptx_prec(RU_t *ru,int frame_tx,int tti_tx) {
tti_tx,
l,
aa,
- ru->nb_log_antennas);
+ ru->nb_log_antennas,
+ 0);
}// for (aa=0;aanb_tx;aa++)
}// for (l=0;lsymbols_per_slot;l++)
}// if (ru->nb_tx == 1)
@@ -520,8 +520,7 @@ void nr_fep0(RU_t *ru, int first_half) {
ru->common.rxdataF[aa],
l,
proc->tti_rx,
- ru->N_TA_offset,
- 0);
+ ru->N_TA_offset);
}
}
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_RU_FEPRX+proc->tti_rx, 0);
@@ -657,8 +656,7 @@ void nr_fep_full(RU_t *ru, int slot) {
ru->common.rxdataF[aa],
l,
proc->tti_rx,
- ru->N_TA_offset,
- 0);
+ ru->N_TA_offset);
}
}
diff --git a/openair1/SCHED_NR/phy_procedures_nr_gNB.c b/openair1/SCHED_NR/phy_procedures_nr_gNB.c
index 5e1ce51173..c45a0c1ec1 100644
--- a/openair1/SCHED_NR/phy_procedures_nr_gNB.c
+++ b/openair1/SCHED_NR/phy_procedures_nr_gNB.c
@@ -189,7 +189,9 @@ void phy_procedures_gNB_TX(PHY_VARS_gNB *gNB,
if ((frame&127) == 0) dump_pdsch_stats(gNB);
//apply the OFDM symbol rotation here
- apply_nr_rotation(fp,(int16_t*) &gNB->common_vars.txdataF[0][txdataF_offset],slot,0,fp->Ncp==EXTENDED?12:14,fp->ofdm_symbol_size);
+ for (aa=0; aacarrier_config.num_tx_ant.value; aa++) {
+ apply_nr_rotation(fp,(int16_t*) &gNB->common_vars.txdataF[aa][txdataF_offset],slot,0,fp->Ncp==EXTENDED?12:14,fp->ofdm_symbol_size);
+ }
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_gNB_TX+offset,0);
}
@@ -349,7 +351,6 @@ void nr_fill_indication(PHY_VARS_gNB *gNB, int frame, int slot_rx, int ULSCH_id,
int timing_advance_update, cqi;
int sync_pos;
- uint16_t mu = gNB->frame_parms.numerology_index;
NR_gNB_ULSCH_t *ulsch = gNB->ulsch[ULSCH_id][0];
NR_UL_gNB_HARQ_t *harq_process = ulsch->harq_processes[harq_pid];
@@ -357,18 +358,10 @@ void nr_fill_indication(PHY_VARS_gNB *gNB, int frame, int slot_rx, int ULSCH_id,
// pdu->data = gNB->ulsch[ULSCH_id+1][0]->harq_processes[harq_pid]->b;
sync_pos = nr_est_timing_advance_pusch(gNB, ULSCH_id); // estimate timing advance for MAC
- timing_advance_update = sync_pos * (1 << mu); // scale by the used scs numerology
// scale the 16 factor in N_TA calculation in 38.213 section 4.2 according to the used FFT size
- switch (gNB->frame_parms.N_RB_DL) {
- case 106: timing_advance_update /= 16; break;
- case 217: timing_advance_update /= 32; break;
- case 245: timing_advance_update /= 32; break;
- case 273: timing_advance_update /= 32; break;
- case 66: timing_advance_update /= 12; break;
- case 32: timing_advance_update /= 12; break;
- default: AssertFatal(0==1,"No case defined for PRB %d to calculate timing_advance_update\n",gNB->frame_parms.N_RB_DL);
- }
+ uint16_t bw_scaling = 16 * gNB->frame_parms.ofdm_symbol_size / 2048;
+ timing_advance_update = sync_pos / bw_scaling;
// put timing advance command in 0..63 range
timing_advance_update += 31;
@@ -499,15 +492,12 @@ void phy_procedures_gNB_common_RX(PHY_VARS_gNB *gNB, int frame_rx, int slot_rx)
unsigned char aa;
for(symbol = 0; symbol < (gNB->frame_parms.Ncp==EXTENDED?12:14); symbol++) {
- // nr_slot_fep_ul(gNB, symbol, proc->slot_rx, 0, 0);
-
for (aa = 0; aa < gNB->frame_parms.nb_antennas_rx; aa++) {
nr_slot_fep_ul(&gNB->frame_parms,
gNB->common_vars.rxdata[aa],
gNB->common_vars.rxdataF[aa],
symbol,
slot_rx,
- 0,
0);
}
}
diff --git a/openair1/SCHED_NR_UE/phy_procedures_nr_ue.c b/openair1/SCHED_NR_UE/phy_procedures_nr_ue.c
index d23322f55d..e11eec6b28 100644
--- a/openair1/SCHED_NR_UE/phy_procedures_nr_ue.c
+++ b/openair1/SCHED_NR_UE/phy_procedures_nr_ue.c
@@ -203,20 +203,15 @@ uint8_t get_ra_PreambleIndex(uint8_t Mod_id, uint8_t CC_id, uint8_t gNB_id){
}
-
-// scale the 16 factor in N_TA calculation in 38.213 section 4.2 according to the used FFT size
-uint16_t get_bw_scaling(uint16_t nb_rb){
- uint16_t bw_scaling;
- switch (nb_rb) {
- case 32: bw_scaling = 4; break;
- case 66: bw_scaling = 8; break;
- case 106: bw_scaling = 16; break;
- case 217: bw_scaling = 32; break;
- case 245: bw_scaling = 32; break;
- case 273: bw_scaling = 32; break;
- default: abort();
- }
- return bw_scaling;
+// convert time factor "16 * 64 * T_c / (2^mu)" in N_TA calculation in TS38.213 section 4.2 to samples by multiplying with samples per second
+// 16 * 64 * T_c / (2^mu) * samples_per_second
+// = 16 * T_s / (2^mu) * samples_per_second
+// = 16 * 1 / (15 kHz * 2048) / (2^mu) * (15 kHz * 2^mu * ofdm_symbol_size)
+// = 16 * 1 / 2048 * ofdm_symbol_size
+// = 16 * ofdm_symbol_size / 2048
+static inline
+uint16_t get_bw_scaling(uint16_t ofdm_symbol_size){
+ return 16 * ofdm_symbol_size / 2048;
}
// UL time alignment procedures:
@@ -234,12 +229,10 @@ void ue_ta_procedures(PHY_VARS_NR_UE *ue, int slot_tx, int frame_tx){
if (frame_tx == ul_time_alignment->ta_frame && slot_tx == ul_time_alignment->ta_slot) {
- uint8_t numerology = ue->frame_parms.numerology_index;
- uint16_t bwp_ul_NB_RB = ue->frame_parms.N_RB_UL;
- int factor_mu = 1 << numerology;
- uint16_t bw_scaling = get_bw_scaling(bwp_ul_NB_RB);
+ uint16_t ofdm_symbol_size = ue->frame_parms.ofdm_symbol_size;
+ uint16_t bw_scaling = get_bw_scaling(ofdm_symbol_size);
- ue->timing_advance += (ul_time_alignment->ta_command - 31) * bw_scaling / factor_mu;
+ ue->timing_advance += (ul_time_alignment->ta_command - 31) * bw_scaling;
LOG_I(PHY, "In %s: [UE %d] [%d.%d] Got timing advance command %u from MAC, new value is %d\n",
__FUNCTION__,
@@ -783,7 +776,7 @@ int nr_ue_pdsch_procedures(PHY_VARS_NR_UE *ue, UE_nr_rxtx_proc_t *proc, int eNB_
for (m = s0; m < (s0 +s1); m++) {
if (((1<harq_processes[harq_pid]->dlDmrsSymbPos) > 0) {
- for (uint8_t aatx=0; aatx<1; aatx++) {//for MIMO Config: it shall loop over no_layers
+ for (uint8_t aatx=0; aatxharq_processes[harq_pid]->Nl; aatx++) {//for MIMO Config: it shall loop over no_layers
nr_pdsch_channel_estimation(ue,
proc,
0 /*eNB_id*/,
@@ -838,43 +831,24 @@ int nr_ue_pdsch_procedures(PHY_VARS_NR_UE *ue, UE_nr_rxtx_proc_t *proc, int eNB_
slot = 1;
start_meas(&ue->dlsch_llr_stats_parallelization[proc->thread_id][slot]);
#endif
- // process DLSCH received in first slot
- // skip DMRS symbols (will have to check later if PDSCH/DMRS are multiplexed
- if (((1<harq_processes[harq_pid]->dlDmrsSymbPos) == 0) {
+ // process DLSCH received symbols in the slot
+ // symbol by symbol processing (if data/DMRS are multiplexed is checked inside the function)
+ if (pdsch == PDSCH || pdsch == SI_PDSCH || pdsch == RA_PDSCH) {
if (nr_rx_pdsch(ue,
- proc,
- pdsch,
- eNB_id,
- eNB_id_i,
- frame_rx,
- nr_slot_rx,
- m,
- first_symbol_flag,
- dual_stream_UE,
- i_mod,
- dlsch0->current_harq_pid) < 0)
- return -1;
- }
- else { // This is to adjust the llr offset in the case of skipping over a dmrs symbol (i.e. in case of no PDSCH REs in DMRS)
- if (pdsch == RA_PDSCH) ue->pdsch_vars[proc->thread_id][eNB_id]->llr_offset[m]=ue->pdsch_vars[proc->thread_id][eNB_id]->llr_offset[m-1];
- else if (pdsch == PDSCH || pdsch == SI_PDSCH) {
- if (nr_rx_pdsch(ue,
- proc,
- pdsch,
- eNB_id,
- eNB_id_i,
- frame_rx,
- nr_slot_rx,
- m,
- first_symbol_flag,
- dual_stream_UE,
- i_mod,
- dlsch0->current_harq_pid) < 0)
- return -1;
- }
- else AssertFatal(1==0,"Not RA_PDSCH, SI_PDSCH or PDSCH\n");
- }
- if (pdsch == PDSCH) LOG_D(PHY,"Done processing symbol %d : llr_offset %d\n",m,ue->pdsch_vars[proc->thread_id][eNB_id]->llr_offset[m]);
+ proc,
+ pdsch,
+ eNB_id,
+ eNB_id_i,
+ frame_rx,
+ nr_slot_rx,
+ m,
+ first_symbol_flag,
+ dual_stream_UE,
+ i_mod,
+ dlsch0->current_harq_pid) < 0)
+ return -1;
+ } else AssertFatal(1==0,"Not RA_PDSCH, SI_PDSCH or PDSCH\n");
+
#if UE_TIMING_TRACE
stop_meas(&ue->dlsch_llr_stats_parallelization[proc->thread_id][slot]);
#if DISABLE_LOG_X
@@ -884,10 +858,9 @@ int nr_ue_pdsch_procedures(PHY_VARS_NR_UE *ue, UE_nr_rxtx_proc_t *proc, int eNB_
#endif
#endif
- if(first_symbol_flag)
- {
- proc->first_symbol_available = 1;
- }
+ if(first_symbol_flag) {
+ proc->first_symbol_available = 1;
+ }
} // CRNTI active
}
return 0;
@@ -908,35 +881,21 @@ void nr_ue_dlsch_procedures(PHY_VARS_NR_UE *ue,
int harq_pid = dlsch0->current_harq_pid;
int frame_rx = proc->frame_rx;
int nr_slot_rx = proc->nr_slot_rx;
- int ret=0, ret1=0;
+ uint32_t ret = UINT32_MAX, ret1 = UINT32_MAX;
NR_UE_PDSCH *pdsch_vars;
- uint8_t is_cw0_active = 0;
- uint8_t is_cw1_active = 0;
- uint8_t dmrs_type, nb_re_dmrs;
uint16_t dmrs_len = get_num_dmrs(dlsch0->harq_processes[dlsch0->current_harq_pid]->dlDmrsSymbPos);
- uint16_t nb_symb_sch = 9;
nr_downlink_indication_t dl_indication;
fapi_nr_rx_indication_t rx_ind;
uint16_t number_pdus = 1;
// params for UL time alignment procedure
NR_UL_TIME_ALIGNMENT_t *ul_time_alignment = &ue->ul_time_alignment[eNB_id];
- uint16_t slots_per_frame = ue->frame_parms.slots_per_frame;
- uint16_t slots_per_subframe = ue->frame_parms.slots_per_subframe;
- uint8_t numerology = ue->frame_parms.numerology_index, mapping_type_ul, mapping_type_dl;
- int ul_tx_timing_adjustment, N_TA_max, factor_mu, N_t_1, N_t_2, N_1, N_2, d_1_1 = 0, d_2_1, d;
- uint8_t d_2_2 = 0;// set to 0 because there is only 1 BWP
- // TODO this should corresponds to the switching time as defined in
- // TS 38.133
- uint16_t ofdm_symbol_size = ue->frame_parms.ofdm_symbol_size;
- uint16_t nb_prefix_samples = ue->frame_parms.nb_prefix_samples;
- uint32_t t_subframe = 1; // subframe duration of 1 msec
- uint16_t start_symbol;
- float tc_factor;
- is_cw0_active = dlsch0->harq_processes[harq_pid]->status;
- nb_symb_sch = dlsch0->harq_processes[harq_pid]->nb_symbols;
- start_symbol = dlsch0->harq_processes[harq_pid]->start_symbol;
- dmrs_type = dlsch0->harq_processes[harq_pid]->dmrsConfigType;
+ uint8_t is_cw0_active = dlsch0->harq_processes[harq_pid]->status;
+ uint16_t nb_symb_sch = dlsch0->harq_processes[harq_pid]->nb_symbols;
+ uint16_t start_symbol = dlsch0->harq_processes[harq_pid]->start_symbol;
+ uint8_t dmrs_type = dlsch0->harq_processes[harq_pid]->dmrsConfigType;
+
+ uint8_t nb_re_dmrs;
if (dmrs_type==NFAPI_NR_DMRS_TYPE1) {
nb_re_dmrs = 6*dlsch0->harq_processes[harq_pid]->n_dmrs_cdm_groups;
}
@@ -944,6 +903,7 @@ void nr_ue_dlsch_procedures(PHY_VARS_NR_UE *ue,
nb_re_dmrs = 4*dlsch0->harq_processes[harq_pid]->n_dmrs_cdm_groups;
}
+ uint8_t is_cw1_active = 0;
if(dlsch1)
is_cw1_active = dlsch1->harq_processes[harq_pid]->status;
@@ -1206,53 +1166,29 @@ void nr_ue_dlsch_procedures(PHY_VARS_NR_UE *ue,
}
}
- // TODO CRC check for CW0
-
- // Check CRC for CW 0
- /*if (ret == (1+dlsch0->max_turbo_iterations)) {
- *dlsch_errors=*dlsch_errors+1;
- if(dlsch0->rnti != 0xffff){
- LOG_D(PHY,"[UE %d][PDSCH %x/%d] AbsSubframe %d.%d : DLSCH CW0 in error (rv %d,round %d, mcs %d,TBS %d)\n",
- ue->Mod_id,dlsch0->rnti,
- harq_pid,frame_rx,nr_slot_rx,
- dlsch0->harq_processes[harq_pid]->rvidx,
- dlsch0->harq_processes[harq_pid]->round,
- dlsch0->harq_processes[harq_pid]->mcs,
- dlsch0->harq_processes[harq_pid]->TBS);
- }
- } else {
- if(dlsch0->rnti != 0xffff){
- LOG_D(PHY,"[UE %d][PDSCH %x/%d] AbsSubframe %d.%d : Received DLSCH CW0 (rv %d,round %d, mcs %d,TBS %d)\n",
- ue->Mod_id,dlsch0->rnti,
- harq_pid,frame_rx,nr_slot_rx,
- dlsch0->harq_processes[harq_pid]->rvidx,
- dlsch0->harq_processes[harq_pid]->round,
- dlsch0->harq_processes[harq_pid]->mcs,
- dlsch0->harq_processes[harq_pid]->TBS);
- }
- if ( LOG_DEBUGFLAG(DEBUG_UE_PHYPROC)){
- int j;
- LOG_D(PHY,"dlsch harq_pid %d (rx): \n",dlsch0->current_harq_pid);
-
- for (j=0; jharq_processes[dlsch0->current_harq_pid]->TBS>>3; j++)
- LOG_T(PHY,"%x.",dlsch0->harq_processes[dlsch0->current_harq_pid]->b[j]);
- LOG_T(PHY,"\n");
- }*/
-
if (ue->mac_enabled == 1) {
- uint16_t bw_scaling = get_bw_scaling(ue->frame_parms.N_RB_DL);
-
/* Time Alignment procedure
// - UE processing capability 1
// - Setting the TA update to be applied after the reception of the TA command
// - Timing adjustment computed according to TS 38.213 section 4.2
// - Durations of N1 and N2 symbols corresponding to PDSCH and PUSCH are
// computed according to sections 5.3 and 6.4 of TS 38.214 */
- factor_mu = 1 << numerology;
- N_TA_max = 3846 * bw_scaling / factor_mu;
+ const int numerology = ue->frame_parms.numerology_index;
+ const int ofdm_symbol_size = ue->frame_parms.ofdm_symbol_size;
+ const int nb_prefix_samples = ue->frame_parms.nb_prefix_samples;
+ const int samples_per_subframe = ue->frame_parms.samples_per_subframe;
+ const int slots_per_frame = ue->frame_parms.slots_per_frame;
+ const int slots_per_subframe = ue->frame_parms.slots_per_subframe;
+
+ const double tc_factor = 1.0 / samples_per_subframe;
+ const uint16_t bw_scaling = get_bw_scaling(ofdm_symbol_size);
+
+ const int Ta_max = 3846; // Max value of 12 bits TA Command
+ const double N_TA_max = Ta_max * bw_scaling * tc_factor;
/* PDSCH decoding time N_1 for processing capability 1 */
+ int N_1;
if (ue->dmrs_DownlinkConfig.pdsch_dmrs_AdditionalPosition == pdsch_dmrs_pos0)
N_1 = pdsch_N_1_capability_1[numerology][1];
else if (ue->dmrs_DownlinkConfig.pdsch_dmrs_AdditionalPosition == pdsch_dmrs_pos1 || ue->dmrs_DownlinkConfig.pdsch_dmrs_AdditionalPosition == 2) // TODO set to pdsch_dmrs_pos2 when available
@@ -1261,12 +1197,12 @@ void nr_ue_dlsch_procedures(PHY_VARS_NR_UE *ue,
N_1 = pdsch_N_1_capability_1[numerology][3];
/* PUSCH preapration time N_2 for processing capability 1 */
- N_2 = pusch_N_2_timing_capability_1[numerology][1];
- mapping_type_dl = ue->PDSCH_Config.pdsch_TimeDomainResourceAllocation[0]->mappingType;
- mapping_type_ul = ue->pusch_config.pusch_TimeDomainResourceAllocation[0]->mappingType;
+ const int N_2 = pusch_N_2_timing_capability_1[numerology][1];
/* d_1_1 depending on the number of PDSCH symbols allocated */
- d = 0; // TODO number of overlapping symbols of the scheduling PDCCH and the scheduled PDSCH
+ const int d = 0; // TODO number of overlapping symbols of the scheduling PDCCH and the scheduled PDSCH
+ int d_1_1 = 0;
+ mappingType_t mapping_type_dl = ue->PDSCH_Config.pdsch_TimeDomainResourceAllocation[0]->mappingType;
if (mapping_type_dl == typeA)
if (nb_symb_sch + start_symbol < 7)
d_1_1 = 7 - (nb_symb_sch + start_symbol);
@@ -1281,22 +1217,26 @@ void nr_ue_dlsch_procedures(PHY_VARS_NR_UE *ue,
}
/* d_2_1 */
+ int d_2_1;
+ mappingType_t mapping_type_ul = ue->pusch_config.pusch_TimeDomainResourceAllocation[0]->mappingType;
if (mapping_type_ul == typeB && start_symbol != 0)
d_2_1 = 0;
else
d_2_1 = 1;
+ /* d_2_2 */
+ const double d_2_2 = 0.0; // set to 0 because there is only 1 BWP: TODO this should corresponds to the switching time as defined in TS 38.133
+
/* N_t_1 time duration in msec of N_1 symbols corresponding to a PDSCH reception time
// N_t_2 time duration in msec of N_2 symbols corresponding to a PUSCH preparation time */
- N_t_1 = (N_1 + d_1_1) * (ofdm_symbol_size + nb_prefix_samples) / factor_mu;
- N_t_2 = (N_2 + d_2_1) * (ofdm_symbol_size + nb_prefix_samples) / factor_mu;
+ double N_t_1 = (N_1 + d_1_1) * (ofdm_symbol_size + nb_prefix_samples) * tc_factor;
+ double N_t_2 = (N_2 + d_2_1) * (ofdm_symbol_size + nb_prefix_samples) * tc_factor;
if (N_t_2 < d_2_2) N_t_2 = d_2_2;
/* Time alignment procedure */
- // N_t_1 + N_t_2 + N_TA_max is in unit of Ts, therefore must be converted to Tc
// N_t_1 + N_t_2 + N_TA_max must be in msec
- tc_factor = 64 * 0.509 * 10e-7;
- ul_tx_timing_adjustment = 1 + ceil(slots_per_subframe*((N_t_1 + N_t_2 + N_TA_max)*tc_factor + 0.5)/t_subframe);
+ const double t_subframe = 1.0; // subframe duration of 1 msec
+ const int ul_tx_timing_adjustment = 1 + (int)ceil(slots_per_subframe*(N_t_1 + N_t_2 + N_TA_max + 0.5)/t_subframe);
if (ul_time_alignment->apply_ta == 1){
ul_time_alignment->ta_slot = (nr_slot_rx + ul_tx_timing_adjustment) % slots_per_frame;
@@ -1310,13 +1250,6 @@ void nr_ue_dlsch_procedures(PHY_VARS_NR_UE *ue,
LOG_D(PHY,"Frame %d slot %d -- Starting UL time alignment procedures. TA update will be applied at frame %d slot %d\n", frame_rx, nr_slot_rx, ul_time_alignment->ta_frame, ul_time_alignment->ta_slot);
}
}
-
- /*ue->total_TBS[eNB_id] = ue->total_TBS[eNB_id] + dlsch0->harq_processes[dlsch0->current_harq_pid]->TBS;
- ue->total_received_bits[eNB_id] = ue->total_TBS[eNB_id] + dlsch0->harq_processes[dlsch0->current_harq_pid]->TBS;
- }*/
-
- // TODO CRC check for CW1
-
}
}
@@ -1714,15 +1647,14 @@ int phy_procedures_nrUE_RX(PHY_VARS_NR_UE *ue,
// looking for pbch only in slot where it is supposed to be
if (slot_ssb) {
+ VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_UE_SLOT_FEP_PBCH, VCD_FUNCTION_IN);
LOG_D(PHY," ------ PBCH ChannelComp/LLR: frame.slot %d.%d ------ \n", frame_rx%1024, nr_slot_rx);
for (int i=1; i<4; i++) {
nr_slot_fep(ue,
proc,
(ue->symbol_offset+i)%(fp->symbols_per_slot),
- nr_slot_rx,
- 0,
- 0);
+ nr_slot_rx);
#if UE_TIMING_TRACE
start_meas(&ue->dlsch_channel_estimation_stats);
@@ -1753,6 +1685,7 @@ int phy_procedures_nrUE_RX(PHY_VARS_NR_UE *ue,
LOG_D(PHY, "Doing N0 measurements in %s\n", __FUNCTION__);
nr_ue_rrc_measurements(ue, proc, nr_slot_rx);
+ VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_UE_SLOT_FEP_PBCH, VCD_FUNCTION_OUT);
}
}
@@ -1766,18 +1699,16 @@ int phy_procedures_nrUE_RX(PHY_VARS_NR_UE *ue,
nr_gold_pdcch(ue, 0, 2);
LOG_D(PHY," ------ --> PDCCH ChannelComp/LLR Frame.slot %d.%d ------ \n", frame_rx%1024, nr_slot_rx);
+ VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_UE_SLOT_FEP_PDCCH, VCD_FUNCTION_IN);
for (uint16_t l=0; lofdm_demod_stats);
#endif
- VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_UE_SLOT_FEP, VCD_FUNCTION_IN);
nr_slot_fep(ue,
proc,
l,
- nr_slot_rx,
- 0,
- 0);
+ nr_slot_rx);
dci_cnt = 0;
for(int n_ss = 0; n_ssnb_search_space; n_ss++) {
@@ -1795,7 +1726,6 @@ int phy_procedures_nrUE_RX(PHY_VARS_NR_UE *ue,
fp->first_carrier_offset+(pdcch_vars->pdcch_config[n_ss].BWPStart + coreset_start_rb)*12,
coreset_nb_rb);
- VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_UE_SLOT_FEP, VCD_FUNCTION_OUT);
#if UE_TIMING_TRACE
stop_meas(&ue->ofdm_demod_stats);
#endif
@@ -1803,6 +1733,7 @@ int phy_procedures_nrUE_RX(PHY_VARS_NR_UE *ue,
dci_cnt = dci_cnt + nr_ue_pdcch_procedures(gNB_id, ue, proc);
}
}
+ VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_UE_SLOT_FEP_PDCCH, VCD_FUNCTION_OUT);
if (dci_cnt > 0) {
@@ -1818,6 +1749,7 @@ int phy_procedures_nrUE_RX(PHY_VARS_NR_UE *ue,
}
if (dlsch) {
+ VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_UE_SLOT_FEP_PDSCH, VCD_FUNCTION_IN);
uint8_t harq_pid = dlsch->current_harq_pid;
NR_DL_UE_HARQ_t *dlsch0_harq = dlsch->harq_processes[harq_pid];
uint16_t nb_symb_sch = dlsch0_harq->nb_symbols;
@@ -1836,10 +1768,9 @@ int phy_procedures_nrUE_RX(PHY_VARS_NR_UE *ue,
nr_slot_fep(ue,
proc,
m, //to be updated from higher layer
- nr_slot_rx,
- 0,
- 0);
+ nr_slot_rx);
}
+ VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_UE_SLOT_FEP_PDSCH, VCD_FUNCTION_OUT);
}
} else {
LOG_D(PHY,"[UE %d] Frame %d, nr_slot_rx %d: No DCIs found\n", ue->Mod_id, frame_rx, nr_slot_rx);
@@ -1853,7 +1784,7 @@ int phy_procedures_nrUE_RX(PHY_VARS_NR_UE *ue,
// do procedures for C-RNTI
int ret_pdsch = 0;
if (ue->dlsch[proc->thread_id][gNB_id][0]->active == 1) {
- //VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PDSCH_PROC, VCD_FUNCTION_IN);
+ VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PDSCH_PROC_C, VCD_FUNCTION_IN);
ret_pdsch = nr_ue_pdsch_procedures(ue,
proc,
gNB_id,
@@ -1862,6 +1793,7 @@ int phy_procedures_nrUE_RX(PHY_VARS_NR_UE *ue,
NULL);
nr_ue_measurement_procedures(2, ue, proc, gNB_id, nr_slot_rx);
+ VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PDSCH_PROC_C, VCD_FUNCTION_OUT);
}
// do procedures for SI-RNTI
@@ -1910,7 +1842,6 @@ int phy_procedures_nrUE_RX(PHY_VARS_NR_UE *ue,
// deactivate dlsch once dlsch proc is done
ue->dlsch_p[gNB_id]->active = 0;
-
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PDSCH_PROC_P, VCD_FUNCTION_OUT);
}
diff --git a/openair1/SIMULATION/NR_PHY/dlsim.c b/openair1/SIMULATION/NR_PHY/dlsim.c
index 5891ed7384..2095ea2d7b 100644
--- a/openair1/SIMULATION/NR_PHY/dlsim.c
+++ b/openair1/SIMULATION/NR_PHY/dlsim.c
@@ -174,7 +174,8 @@ int nr_derive_key(int alg_type, uint8_t alg_id,
void config_common(int Mod_idP,
int ssb_SubcarrierOffset,
- int pdsch_AntennaPorts,
+ int pdsch_AntennaPorts,
+ int pusch_AntennaPorts,
NR_ServingCellConfigCommon_t *scc
);
@@ -205,6 +206,7 @@ int oai_nfapi_ul_tti_req(nfapi_nr_ul_tti_request_t *ul_tti_req){ return(0); }
openair0_config_t openair0_cfg[MAX_CARDS];
void update_ptrs_config(NR_CellGroupConfig_t *secondaryCellGroup, uint16_t *rbSize, uint8_t *mcsIndex,int8_t *ptrs_arg);
void update_dmrs_config(NR_CellGroupConfig_t *scg,PHY_VARS_NR_UE *ue, int8_t* dmrs_arg);
+extern void fix_scd(NR_ServingCellConfig_t *scd);// forward declaration
/* specific dlsim DL preprocessor: uses rbStart/rbSize/mcs from command line of
dlsim, does not search for CCE/PUCCH occasion but simply sets to 0 */
@@ -297,7 +299,7 @@ int main(int argc, char **argv)
//uint8_t frame_mod4,num_pdcch_symbols = 0;
- SCM_t channel_model=AWGN;//Rayleigh1_anticorr;
+ SCM_t channel_model = AWGN; // AWGN Rayleigh1 Rayleigh1_anticorr;
NB_UE_INST = 1;
//double pbch_sinr;
@@ -456,7 +458,7 @@ int main(int argc, char **argv)
case 'y':
n_tx=atoi(optarg);
- if ((n_tx==0) || (n_tx>2)) {
+ if ((n_tx==0) || (n_tx>4)) {//extend gNB to support n_tx = 4
printf("Unsupported number of tx antennas %d\n",n_tx);
exit(-1);
}
@@ -466,7 +468,7 @@ int main(int argc, char **argv)
case 'z':
n_rx=atoi(optarg);
- if ((n_rx==0) || (n_rx>2)) {
+ if ((n_rx==0) || (n_rx>4)) {//extend UE to support n_tx = 4
printf("Unsupported number of rx antennas %d\n",n_rx);
exit(-1);
}
@@ -601,7 +603,8 @@ int main(int argc, char **argv)
InitSinLUT();
get_softmodem_params()->phy_test = 1;
-
+ get_softmodem_params()->do_ra = 0;
+
if (snr1set==0)
snr1 = snr0+10;
init_dlsch_tpool(dlsch_threads);
@@ -674,20 +677,26 @@ int main(int argc, char **argv)
rrc.carrier.servingcellconfigcommon = calloc(1,sizeof(*rrc.carrier.servingcellconfigcommon));
NR_ServingCellConfigCommon_t *scc = rrc.carrier.servingcellconfigcommon;
+ NR_ServingCellConfig_t *scd = calloc(1,sizeof(NR_ServingCellConfig_t));
NR_CellGroupConfig_t *secondaryCellGroup=calloc(1,sizeof(*secondaryCellGroup));
prepare_scc(rrc.carrier.servingcellconfigcommon);
uint64_t ssb_bitmap = 1;
fill_scc(rrc.carrier.servingcellconfigcommon,&ssb_bitmap,N_RB_DL,N_RB_DL,mu,mu);
-
+ ssb_bitmap = 1;// Enable only first SSB with index ssb_indx=0
fix_scc(scc,ssb_bitmap);
- fill_default_secondaryCellGroup(scc,
- secondaryCellGroup,
- 0,
- 1,
- n_tx,
- 0);
+ prepare_scd(scd);
+ fill_default_secondaryCellGroup(scc,
+ scd,
+ secondaryCellGroup,
+ 0,
+ 1,
+ n_tx,
+ 0);
+
+ /* RRC parameter validation for secondaryCellGroup */
+ fix_scd(scd);
/* -U option modify DMRS */
if(modify_dmrs) {
update_dmrs_config(secondaryCellGroup, NULL,dmrs_arg);
@@ -703,9 +712,9 @@ int main(int argc, char **argv)
AssertFatal((gNB->if_inst = NR_IF_Module_init(0))!=NULL,"Cannot register interface");
gNB->if_inst->NR_PHY_config_req = nr_phy_config_request;
// common configuration
- rrc_mac_config_req_gNB(0,0,1,pusch_tgt_snrx10,pucch_tgt_snrx10,scc,0,0,NULL);
+ rrc_mac_config_req_gNB(0,0,n_tx,1,pusch_tgt_snrx10,pucch_tgt_snrx10,scc,0,0,NULL);
// UE dedicated configuration
- rrc_mac_config_req_gNB(0,0,1,pusch_tgt_snrx10,pucch_tgt_snrx10,NULL,1,secondaryCellGroup->spCellConfig->reconfigurationWithSync->newUE_Identity,secondaryCellGroup);
+ rrc_mac_config_req_gNB(0,0,n_tx,1,pusch_tgt_snrx10,pucch_tgt_snrx10,NULL,1,secondaryCellGroup->spCellConfig->reconfigurationWithSync->newUE_Identity,secondaryCellGroup);
phy_init_nr_gNB(gNB,0,0);
N_RB_DL = gNB->frame_parms.N_RB_DL;
NR_UE_info_t *UE_info = &RC.nrmac[0]->UE_info;
@@ -753,7 +762,7 @@ int main(int argc, char **argv)
gNB2UE = new_channel_desc_scm(n_tx,
n_rx,
channel_model,
- fs,
+ fs/1e6,//sampling frequency in MHz
bw,
30e-9,
0,
@@ -768,28 +777,28 @@ int main(int argc, char **argv)
frame_length_complex_samples = frame_parms->samples_per_subframe*NR_NUMBER_OF_SUBFRAMES_PER_FRAME;
//frame_length_complex_samples_no_prefix = frame_parms->samples_per_subframe_wCP*NR_NUMBER_OF_SUBFRAMES_PER_FRAME;
- s_re = malloc(2*sizeof(double*));
- s_im = malloc(2*sizeof(double*));
- r_re = malloc(2*sizeof(double*));
- r_im = malloc(2*sizeof(double*));
- txdata = malloc(2*sizeof(int*));
-
- for (i=0; i<2; i++) {
+ s_re = malloc(n_tx*sizeof(double*));
+ s_im = malloc(n_tx*sizeof(double*));
+ r_re = malloc(n_rx*sizeof(double*));
+ r_im = malloc(n_rx*sizeof(double*));
+ txdata = malloc(n_tx*sizeof(int*));
+ for (i=0; iframe_parms,frame_parms,sizeof(NR_DL_FRAME_PARMS));
+ UE->frame_parms.nb_antennas_rx = n_rx;
if (run_initial_sync==1) UE->is_synchronized = 0;
else {UE->is_synchronized = 1; UE->UE_mode[0]=PUSCH;}
@@ -874,7 +884,7 @@ int main(int argc, char **argv)
scheduled_response.CC_id = 0;
scheduled_response.frame = frame;
scheduled_response.slot = slot;
- scheduled_response.thread_id = UE_proc.thread_id;
+ scheduled_response.thread_id = 0;
nr_ue_phy_config_request(&UE_mac->phy_config);
//NR_COMMON_channels_t *cc = RC.nrmac[0]->common_channels;
@@ -983,9 +993,9 @@ int main(int argc, char **argv)
int txdataF_offset = (slot%2) * frame_parms->samples_per_slot_wCP;
if (n_trials==1) {
- LOG_M("txsigF0.m","txsF0", &gNB->common_vars.txdataF[0][txdataF_offset],frame_parms->samples_per_slot_wCP,1,1);
+ LOG_M("txsigF0.m","txsF0=", &gNB->common_vars.txdataF[0][txdataF_offset+2*frame_parms->ofdm_symbol_size],frame_parms->ofdm_symbol_size,1,1);
if (gNB->frame_parms.nb_antennas_tx>1)
- LOG_M("txsigF1.m","txsF1", &gNB->common_vars.txdataF[1][txdataF_offset],frame_parms->samples_per_slot_wCP,1,1);
+ LOG_M("txsigF1.m","txsF1=", &gNB->common_vars.txdataF[1][txdataF_offset+2*frame_parms->ofdm_symbol_size],frame_parms->ofdm_symbol_size,1,1);
}
int tx_offset = frame_parms->get_samples_slot_timestamp(slot,frame_parms,0);
if (n_trials==1) printf("tx_offset %d, txdataF_offset %d \n", tx_offset,txdataF_offset);
@@ -1009,45 +1019,79 @@ int main(int argc, char **argv)
}
if (n_trials==1) {
- LOG_M("txsig0.m","txs0", &txdata[0][tx_offset],frame_parms->get_samples_slot_timestamp(slot,frame_parms,0),1,1);
- if (gNB->frame_parms.nb_antennas_tx>1)
- LOG_M("txsig1.m","txs1", &txdata[1][tx_offset],frame_parms->get_samples_slot_timestamp(slot,frame_parms,0),1,1);
+ char filename[100];//LOG_M
+ for (aa=0;aaofdm_symbol_size+frame_parms->nb_prefix_samples0],6*(frame_parms->ofdm_symbol_size+frame_parms->nb_prefix_samples),1,1);
+ }
}
if (output_fd) {
printf("writing txdata to binary file\n");
fwrite(txdata[0],sizeof(int32_t),frame_length_complex_samples,output_fd);
}
- int txlev = signal_energy(&txdata[0][frame_parms->get_samples_slot_timestamp(slot,frame_parms,0)+5*frame_parms->ofdm_symbol_size + 4*frame_parms->nb_prefix_samples + frame_parms->nb_prefix_samples0], frame_parms->ofdm_symbol_size + frame_parms->nb_prefix_samples);
-
- // if (n_trials==1) printf("txlev %d (%f)\n",txlev,10*log10((double)txlev));
+ int txlev[n_tx];
+ int txlev_sum = 0;
+ int l_ofdm = 6;
+ for (aa=0; aaofdm_symbol_size + (l_ofdm-1)*frame_parms->nb_prefix_samples + frame_parms->nb_prefix_samples0],
+ frame_parms->ofdm_symbol_size + frame_parms->nb_prefix_samples);
+ txlev_sum += txlev[aa];
+ if (n_trials==1) printf("txlev[%d] = %d (%f dB) txlev_sum %d\n",aa,txlev[aa],10*log10((double)txlev[aa]),txlev_sum);
+ }
for (i=(frame_parms->get_samples_slot_timestamp(slot,frame_parms,0));
i<(frame_parms->get_samples_slot_timestamp(slot+1,frame_parms,0));
i++) {
for (aa=0; aanb_antennas_tx; aa++) {
- r_re[aa][i] = ((double)(((short *)txdata[aa]))[(i<<1)]);
- r_im[aa][i] = ((double)(((short *)txdata[aa]))[(i<<1)+1]);
+ s_re[aa][i] = ((double)(((short *)txdata[aa]))[(i<<1)]);
+ s_im[aa][i] = ((double)(((short *)txdata[aa]))[(i<<1)+1]);
}
}
+
double ts = 1.0/(frame_parms->subcarrier_spacing * frame_parms->ofdm_symbol_size);
- //AWGN
- sigma2_dB = 10 * log10((double)txlev * ((double)UE->frame_parms.ofdm_symbol_size/(12*rel15->rbSize))) - SNR;
+ //Compute AWGN variance
+ sigma2_dB = 10 * log10((double)txlev_sum * ((double)UE->frame_parms.ofdm_symbol_size/(12*rel15->rbSize))) - SNR;
sigma2 = pow(10, sigma2_dB/10);
- if (n_trials==1) printf("sigma2 %f (%f dB), txlev %f (factor %f)\n",sigma2,sigma2_dB,10*log10((double)txlev),(double)(double)UE->frame_parms.ofdm_symbol_size/(12*rel15->rbSize));
+ if (n_trials==1) printf("sigma2 %f (%f dB), txlev_sum %f (factor %f)\n",sigma2,sigma2_dB,10*log10((double)txlev_sum),(double)(double)UE->frame_parms.ofdm_symbol_size/(12*rel15->rbSize));
+
+ for (aa=0; aaget_samples_slot_timestamp(slot,frame_parms,0);
iget_samples_slot_timestamp(slot+1,frame_parms,0);
i++) {
- for (aa=0; aanb_antennas_rx; aa++) {
- ((short*) UE->common_vars.rxdata[aa])[2*i] = (short) ((r_re[aa][i] + sqrt(sigma2/2)*gaussdouble(0.0,1.0)));
- ((short*) UE->common_vars.rxdata[aa])[2*i+1] = (short) ((r_im[aa][i] + sqrt(sigma2/2)*gaussdouble(0.0,1.0)));
+ for (int aa_rx=0; aa_rxcommon_vars.rxdata[aa_rx])[2*i] = (short) ((r_re[aa_rx][i] + sqrt(sigma2/2)*gaussdouble(0.0,1.0)));
+ ((short*) UE->common_vars.rxdata[aa_rx])[2*i+1] = (short) ((r_im[aa_rx][i] + sqrt(sigma2/2)*gaussdouble(0.0,1.0)));
/* Add phase noise if enabled */
if (pdu_bit_map & 0x1) {
- phase_noise(ts, &((short*) UE->common_vars.rxdata[aa])[2*i],
- &((short*) UE->common_vars.rxdata[aa])[2*i+1]);
+ phase_noise(ts, &((short*) UE->common_vars.rxdata[aa_rx])[2*i],
+ &((short*) UE->common_vars.rxdata[aa_rx])[2*i+1]);
}
}
}
@@ -1087,10 +1131,10 @@ int main(int argc, char **argv)
available_bits-= (ptrsSymbPerSlot * ptrsRePerSymb *rel15->nrOfLayers* 2);
printf("[DLSIM][PTRS] Available bits are: %5u, removed PTRS bits are: %5u \n",available_bits, (ptrsSymbPerSlot * ptrsRePerSymb *rel15->nrOfLayers* 2) );
}
-
+
for (i = 0; i < available_bits; i++) {
-
- if(((gNB_dlsch->harq_process.f[i] == 0) && (UE_llr[i] <= 0)) ||
+
+ if(((gNB_dlsch->harq_process.f[i] == 0) && (UE_llr[i] <= 0)) ||
((gNB_dlsch->harq_process.f[i] == 1) && (UE_llr[i] >= 0)))
{
if(errors_scrambling == 0) {
@@ -1099,7 +1143,7 @@ int main(int argc, char **argv)
}
errors_scrambling++;
}
-
+
}
for (i = 0; i < TBS; i++) {
@@ -1227,12 +1271,16 @@ int main(int argc, char **argv)
}
}*/
- for (i = 0; i < 2; i++) {
+ free_channel_desc_scm(gNB2UE);
+
+ for (i = 0; i < n_tx; i++) {
free(s_re[i]);
free(s_im[i]);
+ free(txdata[i]);
+ }
+ for (i = 0; i < n_rx; i++) {
free(r_re[i]);
free(r_im[i]);
- free(txdata[i]);
}
free(s_re);
diff --git a/openair1/SIMULATION/NR_PHY/nr_unitary_defs.h b/openair1/SIMULATION/NR_PHY/nr_unitary_defs.h
index 906636d56f..b78b42db91 100644
--- a/openair1/SIMULATION/NR_PHY/nr_unitary_defs.h
+++ b/openair1/SIMULATION/NR_PHY/nr_unitary_defs.h
@@ -222,6 +222,7 @@ void fill_scc(NR_ServingCellConfigCommon_t *scc,uint64_t *ssb_bitmap,int N_RB_DL
void fix_scc(NR_ServingCellConfigCommon_t *scc,uint64_t ssbmap);
void prepare_scc(NR_ServingCellConfigCommon_t *scc);
+void prepare_scd(NR_ServingCellConfig_t *scd);
ngap_gNB_config_t ngap_config;
uint32_t ngap_generate_gNB_id(void) {return 0;}
void configure_nfapi_pnf(char *vnf_ip_addr, int vnf_p5_port, char *pnf_ip_addr, int pnf_p7_port, int vnf_p7_port) { return;}
diff --git a/openair1/SIMULATION/NR_PHY/pbchsim.c b/openair1/SIMULATION/NR_PHY/pbchsim.c
index 618a7cd7d7..ee74909a9e 100644
--- a/openair1/SIMULATION/NR_PHY/pbchsim.c
+++ b/openair1/SIMULATION/NR_PHY/pbchsim.c
@@ -101,8 +101,8 @@ void nr_phy_config_request_sim_pbchsim(PHY_VARS_gNB *gNB,
//gNB_config->subframe_config.dl_cyclic_prefix_type.value = (fp->Ncp == NORMAL) ? NFAPI_CP_NORMAL : NFAPI_CP_EXTENDED;
gNB->mac_enabled = 1;
- fp->dl_CarrierFreq = 3500000000;//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->dl_CarrierFreq = 3600000000;//from_nrarfcn(gNB_config->nfapi_config.rf_bands.rf_band[0],gNB_config->nfapi_config.nrarfcn.value);
+ fp->ul_CarrierFreq = 3600000000;//fp->dl_CarrierFreq - (get_uldl_offset(gNB_config->nfapi_config.rf_bands.rf_band[0])*100000);
if (mu>2) fp->nr_band = 257;
else fp->nr_band = 78;
fp->threequarter_fs= 0;
@@ -698,9 +698,7 @@ int main(int argc, char **argv)
nr_slot_fep(UE,
&proc,
i%frame_parms->symbols_per_slot,
- ssb_slot,
- 0,
- 0);
+ ssb_slot);
nr_pbch_channel_estimation(UE,&proc,0,ssb_slot,i%frame_parms->symbols_per_slot,i-(UE->symbol_offset+1),ssb_index%8,n_hf);
diff --git a/openair1/SIMULATION/NR_PHY/prachsim.c b/openair1/SIMULATION/NR_PHY/prachsim.c
index 8bd54ec345..74ca8d9184 100644
--- a/openair1/SIMULATION/NR_PHY/prachsim.c
+++ b/openair1/SIMULATION/NR_PHY/prachsim.c
@@ -465,7 +465,10 @@ int main(int argc, char **argv){
nr_phy_config_request_sim(gNB, N_RB_UL, N_RB_UL, mu, Nid_cell, SSB_positions);
- uint64_t absoluteFrequencyPointA = (mu==1 ? 640000 : 2070833);
+ uint64_t absoluteFrequencyPointA = to_nrarfcn(frame_parms->nr_band,
+ frame_parms->dl_CarrierFreq,
+ frame_parms->numerology_index,
+ frame_parms->N_RB_UL*(180e3)*(1 << frame_parms->numerology_index));
uint8_t subframe = slot/frame_parms->slots_per_subframe;
diff --git a/openair1/SIMULATION/NR_PHY/ulsim.c b/openair1/SIMULATION/NR_PHY/ulsim.c
index 35d642e7b3..fce690ebd2 100644
--- a/openair1/SIMULATION/NR_PHY/ulsim.c
+++ b/openair1/SIMULATION/NR_PHY/ulsim.c
@@ -82,6 +82,7 @@ double cpuf;
//uint8_t nfapi_mode = 0;
uint64_t downlink_frequency[MAX_NUM_CCs][4];
+extern void fix_scd(NR_ServingCellConfig_t *scd);// forward declaration
int8_t nr_mac_rrc_data_ind_ue(const module_id_t module_id, const int CC_id, const uint8_t gNB_index,
const int8_t channel, const uint8_t* pduP, const sdu_size_t pdu_len) { return 0; }
@@ -619,8 +620,8 @@ int main(int argc, char **argv)
frame_parms = &gNB->frame_parms; //to be initialized I suppose (maybe not necessary for PBCH)
- frame_parms->nb_antennas_tx = n_tx;
- frame_parms->nb_antennas_rx = n_rx;
+ //frame_parms->nb_antennas_tx = n_tx;
+ //frame_parms->nb_antennas_rx = n_rx;
frame_parms->N_RB_DL = N_RB_DL;
frame_parms->N_RB_UL = N_RB_UL;
frame_parms->Ncp = extended_prefix_flag ? EXTENDED : NORMAL;
@@ -638,6 +639,7 @@ int main(int argc, char **argv)
rrc.carrier.servingcellconfigcommon = calloc(1,sizeof(*rrc.carrier.servingcellconfigcommon));
NR_ServingCellConfigCommon_t *scc = rrc.carrier.servingcellconfigcommon;
+ NR_ServingCellConfig_t *scd = calloc(1,sizeof(NR_ServingCellConfig_t));
NR_CellGroupConfig_t *secondaryCellGroup=calloc(1,sizeof(*secondaryCellGroup));
prepare_scc(rrc.carrier.servingcellconfigcommon);
uint64_t ssb_bitmap;
@@ -645,7 +647,10 @@ int main(int argc, char **argv)
fix_scc(scc,ssb_bitmap);
+ prepare_scd(scd);
+
fill_default_secondaryCellGroup(scc,
+ scd,
secondaryCellGroup,
0,
1,
@@ -654,13 +659,16 @@ int main(int argc, char **argv)
// xer_fprint(stdout, &asn_DEF_NR_CellGroupConfig, (const void*)secondaryCellGroup);
+ /* RRC parameter validation for secondaryCellGroup */
+ fix_scd(scd);
+
AssertFatal((gNB->if_inst = NR_IF_Module_init(0))!=NULL,"Cannot register interface");
gNB->if_inst->NR_PHY_config_req = nr_phy_config_request;
// common configuration
- rrc_mac_config_req_gNB(0,0,1,pusch_tgt_snrx10,pucch_tgt_snrx10,scc,0,0,NULL);
+ rrc_mac_config_req_gNB(0,0,n_tx,n_rx,pusch_tgt_snrx10,pucch_tgt_snrx10,scc,0,0,NULL);
// UE dedicated configuration
- rrc_mac_config_req_gNB(0,0,1,pusch_tgt_snrx10,pucch_tgt_snrx10,NULL,1,secondaryCellGroup->spCellConfig->reconfigurationWithSync->newUE_Identity,secondaryCellGroup);
+ rrc_mac_config_req_gNB(0,0,1,1,pusch_tgt_snrx10,pucch_tgt_snrx10,NULL,1,secondaryCellGroup->spCellConfig->reconfigurationWithSync->newUE_Identity,secondaryCellGroup);
phy_init_nr_gNB(gNB,0,0);
N_RB_DL = gNB->frame_parms.N_RB_DL;
@@ -1065,70 +1073,69 @@ int main(int argc, char **argv)
}
- nr_fill_ulsch(gNB,frame,slot,pusch_pdu);
+ //nr_fill_ulsch(gNB,frame,slot,pusch_pdu); // Not needed as its its already filled as apart of "nr_schedule_response(Sched_INFO);"
for (int i=0;i<(TBS/8);i++) ulsch_ue[0]->harq_processes[harq_pid]->a[i]=i&0xff;
if (input_fd == NULL) {
- // set FAPI parameters for UE, put them in the scheduled response and call
- nr_ue_scheduled_response(&scheduled_response);
-
-
- /////////////////////////phy_procedures_nr_ue_TX///////////////////////
- ///////////
-
- phy_procedures_nrUE_TX(UE, &UE_proc, gNB_id);
-
-
- if (n_trials==1) {
- LOG_M("txsig0.m","txs0", UE->common_vars.txdata[0],frame_parms->samples_per_subframe*10,1,1);
- LOG_M("txsig0F.m","txs0F", UE->common_vars.txdataF[0],frame_parms->ofdm_symbol_size*14,1,1);
- }
- ///////////
- ////////////////////////////////////////////////////
- tx_offset = frame_parms->get_samples_slot_timestamp(slot,frame_parms,0);
-
- txlev = signal_energy(&UE->common_vars.txdata[0][tx_offset + 5*frame_parms->ofdm_symbol_size + 4*frame_parms->nb_prefix_samples + frame_parms->nb_prefix_samples0],
- frame_parms->ofdm_symbol_size + frame_parms->nb_prefix_samples);
+ // set FAPI parameters for UE, put them in the scheduled response and call
+ nr_ue_scheduled_response(&scheduled_response);
+
+
+ /////////////////////////phy_procedures_nr_ue_TX///////////////////////
+ ///////////
+
+ phy_procedures_nrUE_TX(UE, &UE_proc, gNB_id);
+
+
+ if (n_trials==1) {
+ LOG_M("txsig0.m","txs0", UE->common_vars.txdata[0],frame_parms->samples_per_subframe*10,1,1);
+ LOG_M("txsig0F.m","txs0F", UE->common_vars.txdataF[0],frame_parms->ofdm_symbol_size*14,1,1);
+ }
+ ///////////
+ ////////////////////////////////////////////////////
+ tx_offset = frame_parms->get_samples_slot_timestamp(slot,frame_parms,0);
+
+ txlev = signal_energy(&UE->common_vars.txdata[0][tx_offset + 5*frame_parms->ofdm_symbol_size + 4*frame_parms->nb_prefix_samples + frame_parms->nb_prefix_samples0],
+ frame_parms->ofdm_symbol_size + frame_parms->nb_prefix_samples);
}
else n_trials = 1;
if (input_fd == NULL ) {
- sigma_dB = 10 * log10((double)txlev * ((double)frame_parms->ofdm_symbol_size/(12*nb_rb))) - SNR;;
- sigma = pow(10,sigma_dB/10);
+ sigma_dB = 10 * log10((double)txlev * ((double)frame_parms->ofdm_symbol_size/(12*nb_rb))) - SNR;;
+ sigma = pow(10,sigma_dB/10);
- if(n_trials==1) printf("sigma %f (%f dB), txlev %f (factor %f)\n",sigma,sigma_dB,10*log10((double)txlev),(double)(double)frame_parms->ofdm_symbol_size/(12*nb_rb));
+ if(n_trials==1) printf("sigma %f (%f dB), txlev %f (factor %f)\n",sigma,sigma_dB,10*log10((double)txlev),(double)(double)
+ frame_parms->ofdm_symbol_size/(12*nb_rb));
- for (i=0; icommon_vars.txdata[aa][slot_offset]))[(i<<1)]);
- s_im[aa][i] = ((double)(((short *)&UE->common_vars.txdata[aa][slot_offset]))[(i<<1)+1]);
- }
- }
-
+ for (i=0; inb_antennas_rx; aa++) {
+ s_re[aa][i] = ((double)(((short *)&UE->common_vars.txdata[aa][slot_offset]))[(i<<1)]);
+ s_im[aa][i] = ((double)(((short *)&UE->common_vars.txdata[aa][slot_offset]))[(i<<1)+1]);
+ }
+ }
- if (UE2gNB->max_Doppler == 0) {
- multipath_channel(UE2gNB,s_re,s_im,r_re,r_im,
- slot_length,0,(n_trials==1)?1:0);
- } else {
- multipath_tv_channel(UE2gNB,s_re,s_im,r_re,r_im,
- 2*slot_length,0);
- }
- for (i=0; inb_antennas_rx; ap++) {
- ((int16_t*) &gNB->common_vars.rxdata[ap][slot_offset])[(2*i) + (delay*2)] = (int16_t)((r_re[ap][i]) + (sqrt(sigma/2)*gaussdouble(0.0,1.0))); // convert to fixed point
- ((int16_t*) &gNB->common_vars.rxdata[ap][slot_offset])[(2*i)+1 + (delay*2)] = (int16_t)((r_im[ap][i]) + (sqrt(sigma/2)*gaussdouble(0.0,1.0)));
+
+ if (UE2gNB->max_Doppler == 0) {
+ multipath_channel(UE2gNB, s_re, s_im, r_re, r_im, slot_length, 0, (n_trials==1)?1:0);
+ } else {
+ multipath_tv_channel(UE2gNB, s_re, s_im, r_re, r_im, 2*slot_length, 0);
+ }
+ for (i=0; inb_antennas_rx; ap++) {
+ ((int16_t*) &gNB->common_vars.rxdata[ap][slot_offset])[(2*i) + (delay*2)] = (int16_t)((r_re[ap][i]) + (sqrt(sigma/2)*gaussdouble(0.0,1.0))); // convert to fixed point
+ ((int16_t*) &gNB->common_vars.rxdata[ap][slot_offset])[(2*i)+1 + (delay*2)] = (int16_t)((r_im[ap][i]) + (sqrt(sigma/2)*gaussdouble(0.0,1.0)));
/* Add phase noise if enabled */
if (pdu_bit_map & PUSCH_PDU_BITMAP_PUSCH_PTRS) {
phase_noise(ts, &((int16_t*)&gNB->common_vars.rxdata[ap][slot_offset])[(2*i)],
&((int16_t*)&gNB->common_vars.rxdata[ap][slot_offset])[(2*i)+1]);
}
- }
- }
+ }
+ }
- }
+ } /*End input_fd */
if(pusch_pdu->pdu_bit_map & PUSCH_PDU_BITMAP_PUSCH_PTRS) {
diff --git a/openair1/SIMULATION/TOOLS/multipath_tv_channel.c b/openair1/SIMULATION/TOOLS/multipath_tv_channel.c
index d344992586..c68ce73758 100644
--- a/openair1/SIMULATION/TOOLS/multipath_tv_channel.c
+++ b/openair1/SIMULATION/TOOLS/multipath_tv_channel.c
@@ -48,9 +48,9 @@ void multipath_tv_channel(channel_desc_t *desc,
printf("[TV CHANNEL] keep = %d : path_loss = %g (%f), nb_rx %d, nb_tx %d, dd %d, len %d max_doppler %g\n",keep_channel,path_loss,desc->path_loss_dB,desc->nb_rx,desc->nb_tx,dd,desc->channel_length,
desc->max_Doppler);
#endif
- tx = (double complex **)malloc(desc->nb_tx*sizeof(double complex));
- rx = (double complex **)malloc(desc->nb_rx*sizeof(double complex));
- H_t= (double complex ** *) malloc(desc->nb_tx*desc->nb_rx*sizeof(double complex **));
+ tx = (double complex **)malloc(desc->nb_tx*sizeof(double complex *));
+ rx = (double complex **)malloc(desc->nb_rx*sizeof(double complex *));
+ H_t= (double complex ***) malloc(desc->nb_tx*desc->nb_rx*sizeof(double complex **));
// tv_H_t = (double complex *) malloc(length*sizeof(double complex));
rx_temp= (double complex *) calloc(length,sizeof(double complex));
@@ -63,10 +63,10 @@ void multipath_tv_channel(channel_desc_t *desc,
}
for(i=0; inb_tx*desc->nb_rx; i++) {
- H_t[i] = (double complex **) malloc(length*sizeof(double complex *));
+ H_t[i] = (double complex **)malloc(desc->nb_taps*sizeof(double complex *));
- for(j=0; jnb_taps,sizeof(double complex));
+ for(j=0; jnb_taps; j++) {
+ H_t[i][j] = (double complex *)calloc(length,sizeof(double complex));
}
}
@@ -116,7 +116,7 @@ void multipath_tv_channel(channel_desc_t *desc,
free(rx);
for(i=0; inb_rx*desc->nb_tx; i++) {
- for(j=0; jnb_taps; j++) {
free(H_t[i][j]);
}
@@ -131,14 +131,29 @@ void multipath_tv_channel(channel_desc_t *desc,
void tv_channel(channel_desc_t *desc,double complex ***H,uint32_t length){
int i,j,p,l,k;
- double *alpha,*phi_rad,pi=acos(-1),*w_Hz;
+ double *alpha,***phi_rad,pi=acos(-1),***w_Hz;
alpha = (double *)calloc(desc->nb_paths,sizeof(double));
- phi_rad = (double *)calloc(desc->nb_paths,sizeof(double));
- w_Hz = (double *)calloc(desc->nb_paths,sizeof(double));
+ phi_rad = (double ***)malloc(desc->nb_rx*desc->nb_tx*sizeof(double **));
+ w_Hz = (double ***)malloc(desc->nb_rx*desc->nb_tx*sizeof(double **));
- for(i=0; inb_paths; i++) {
- w_Hz[i]=desc->max_Doppler*cos(frand_a_b(0,2*pi));
- phi_rad[i]=frand_a_b(0,2*pi);
+ for(i=0; inb_tx*desc->nb_rx; i++) {
+ phi_rad[i] = (double **) malloc(desc->nb_taps*sizeof(double *));
+ w_Hz[i] = (double **) malloc(desc->nb_taps*sizeof(double *));
+ for(j=0; jnb_taps; j++) {
+ phi_rad[i][j] = (double *) malloc(desc->nb_paths*sizeof(double));
+ w_Hz[i][j] = (double *) malloc(desc->nb_paths*sizeof(double));
+ }
+ }
+
+ for(i=0; inb_tx*desc->nb_rx; i++) {
+ for (j = 0; jnb_taps; j++) {
+ for(k=0; knb_paths; k++) {
+ w_Hz[i][j][k] = desc->max_Doppler*cos(frand_a_b(0,2*M_PI));
+ phi_rad[i][j][k] = frand_a_b(0,2*M_PI);
+ //printf("w_hz[%d][%d][%d]=f_d*cos(theta) = %f\n",i,j,k,w_Hz[i][j][k]);
+ //printf("phi_rad[%d][%d][%d] = %f\n",i,j,k,phi_rad[i][j][k]);
+ }
+ }
}
if(desc->ricean_factor == 1) {
@@ -153,44 +168,34 @@ void tv_channel(channel_desc_t *desc,double complex ***H,uint32_t length){
}
}
- /*
- // This is the code when we only consider a SISO case
- for(i=0;inb_taps;j++)
- {
- for(p=0;pnb_paths;p++)
- {
- H[i][j] += sqrt(desc->amps[j]/2)*alpha[p]*cexp(-I*(2*pi*w_Hz[p]*i*(1/(desc->sampling_rate*1e6))+phi_rad[p]));
- }
- }
- }
- for(j=0;jnb_paths;j++)
- {
- phi_rad[j] = fmod(2*pi*w_Hz[j]*(length-1)*(1/desc->sampling_rate)+phi_rad[j],2*pi);
- }
- */
-
- // if MIMO
+ // SISO or MIMO
for (i=0; inb_rx; i++) {
for(j=0; jnb_tx; j++) {
- for(k=0; knb_taps; l++) {
- H[i+(j*desc->nb_rx)][k][l] = 0;
-
+ for(k=0; knb_taps; k++) {
+ for(l=0; lnb_paths; p++) {
- H[i+(j*desc->nb_rx)][k][l] += sqrt(desc->amps[l]/2)*alpha[p]*cexp(I*(2*pi*w_Hz[p]*k*(1/(desc->sampling_rate*1e6))+phi_rad[p]));
+ H[i+(j*desc->nb_rx)][k][l] += sqrt(desc->amps[k])*alpha[p]*cexp(I*(2*pi*w_Hz[i+(j*desc->nb_rx)][k][p]*l*(1/(desc->sampling_rate*1e6))+phi_rad[i+(j*desc->nb_rx)][k][p]));
}
}
- }
-
- for(j=0; jnb_paths; j++) {
- phi_rad[j] = fmod(2*pi*w_Hz[j]*(length-1)*(1/desc->sampling_rate)+phi_rad[j],2*pi);
+ //printf("H[tx%d][rx%d][k%d] = %f+j%f \n",j,i,k,creal(H[i+(j*desc->nb_rx)][k][0]),cimag(H[i+(j*desc->nb_rx)][k][0]));
}
}
}
-
+ //accumlate the phase
+ /*for(k=0; knb_taps; k++) {
+ * for(j=0; jnb_paths; j++) {
+ * desc->random_phase[k][j] = fmod(2*pi*w_Hz[k][j]*(length-1)*(1/(desc->sampling_rate*1e6))+phi_rad[k][j],2*pi);
+ * }
+ * }*/
free(alpha);
+ for(i=0; inb_rx*desc->nb_tx; i++) {
+ for (j=0; jnb_taps; j++) {
+ free(w_Hz[i][j]);
+ free(phi_rad[i][j]);
+ }
+ free(w_Hz[i]);
+ free(phi_rad[i]);
+ }
free(w_Hz);
free(phi_rad);
}
@@ -203,7 +208,7 @@ void tv_conv(double complex **h, double complex *x, double complex *y, uint32_t
for(i=0; i<((int)nb_samples-dd); i++) {
for(j=0; jj)
- y[i+dd] += creal(h[i][j])*creal(x[i-j])-cimag(h[i][j])*cimag(x[i-j]) + I*(creal(h[i][j])*cimag(x[i-j])+cimag(h[i][j])*creal(x[i-j]));
+ y[i+dd] += creal(h[j][i])*creal(x[i-j])-cimag(h[j][i])*cimag(x[i-j]) + I*(creal(h[j][i])*cimag(x[i-j])+cimag(h[j][i])*creal(x[i-j]));
}
}
}
diff --git a/openair1/SIMULATION/TOOLS/random_channel.c b/openair1/SIMULATION/TOOLS/random_channel.c
index 8c063fadc0..47597f4d6e 100644
--- a/openair1/SIMULATION/TOOLS/random_channel.c
+++ b/openair1/SIMULATION/TOOLS/random_channel.c
@@ -61,7 +61,7 @@ static telnetshell_vardef_t channelmod_vardef[] = {
static double snr_dB=25;
static double sinr_dB=0;
static unsigned int max_chan;
-static channel_desc_t** defined_channels;
+static channel_desc_t **defined_channels;
void fill_channel_desc(channel_desc_t *chan_desc,
uint8_t nb_tx,
uint8_t nb_rx,
@@ -1185,11 +1185,11 @@ channel_desc_t *new_channel_desc_scm(uint8_t nb_tx,
1);
break;
- case Rayleigh1:
+ case Rayleigh1://MIMO Test uses Rayleigh1
nb_taps = 1;
Td = 0;
channel_length = 1;
- ricean_factor = 1;
+ ricean_factor = 0.0;
aoa = .03;
maxDoppler = 0;
fill_channel_desc(chan_desc,nb_tx,
@@ -1632,7 +1632,7 @@ channel_desc_t *new_channel_desc_scm(uint8_t nb_tx,
void free_channel_desc_scm(channel_desc_t *ch) {
// Must be made cleanly, a lot of leaks...
- defined_channels[ch->chan_idx]=NULL;
+ if (max_chan != 0) defined_channels[ch->chan_idx]=NULL;
if(ch->free_flags&CHANMODEL_FREE_AMPS)
free(ch->amps);
for (int i = 0; inb_tx*ch->nb_rx; i++) {
diff --git a/openair2/COMMON/rrc_messages_types.h b/openair2/COMMON/rrc_messages_types.h
index 02f878ee2e..64c42eaf0e 100644
--- a/openair2/COMMON/rrc_messages_types.h
+++ b/openair2/COMMON/rrc_messages_types.h
@@ -42,6 +42,7 @@
#include "LTE_SL-DiscResourcePool-r12.h"
#include "NR_RACH-ConfigCommon.h"
#include "NR_ServingCellConfigCommon.h"
+#include "NR_ServingCellConfig.h"
//-------------------------------------------------------------------------------------------//
// Messages for RRC logging
#if defined(DISABLE_ITTI_XER_PRINT)
@@ -405,8 +406,10 @@ typedef struct NRRrcConfigurationReq_s {
uint16_t mnc[PLMN_LIST_MAX_SIZE];
uint8_t mnc_digit_length[PLMN_LIST_MAX_SIZE];
NR_ServingCellConfigCommon_t *scc;
+ NR_ServingCellConfig_t *scd;
int ssb_SubcarrierOffset;
int pdsch_AntennaPorts;
+ int pusch_AntennaPorts;
int pusch_TargetSNRx10;
int pucch_TargetSNRx10;
} gNB_RrcConfigurationReq;
diff --git a/openair2/GNB_APP/RRC_nr_paramsvalues.h b/openair2/GNB_APP/RRC_nr_paramsvalues.h
index 1f1d076e9d..d05908e8ed 100644
--- a/openair2/GNB_APP/RRC_nr_paramsvalues.h
+++ b/openair2/GNB_APP/RRC_nr_paramsvalues.h
@@ -211,6 +211,24 @@
#define CARRIERBANDWIDTH_OKVALUES {11,18,24,25,31,32,38,51,52,65,66,78,79,93,106,107,121,132,133,135,160,162,189,216,217,245,264,270,273}
+/* Serving Cell Config Dedicated */
+#define GNB_CONFIG_STRING_SERVINGCELLCONFIGDEDICATED "servingCellConfigDedicated"
+#define GNB_CONFIG_STRING_DLPTRSFREQDENSITY0_0 "dl_ptrsFreqDensity0_0"
+#define GNB_CONFIG_STRING_DLPTRSFREQDENSITY1_0 "dl_ptrsFreqDensity1_0"
+#define GNB_CONFIG_STRING_DLPTRSTIMEDENSITY0_0 "dl_ptrsTimeDensity0_0"
+#define GNB_CONFIG_STRING_DLPTRSTIMEDENSITY1_0 "dl_ptrsTimeDensity1_0"
+#define GNB_CONFIG_STRING_DLPTRSTIMEDENSITY2_0 "dl_ptrsTimeDensity2_0"
+#define GNB_CONFIG_STRING_DLPTRSEPRERATIO_0 "dl_ptrsEpreRatio_0"
+#define GNB_CONFIG_STRING_DLPTRSREOFFSET_0 "dl_ptrsReOffset_0"
+#define GNB_CONFIG_STRING_ULPTRSFREQDENSITY0_0 "ul_ptrsFreqDensity0_0"
+#define GNB_CONFIG_STRING_ULPTRSFREQDENSITY1_0 "ul_ptrsFreqDensity1_0"
+#define GNB_CONFIG_STRING_ULPTRSTIMEDENSITY0_0 "ul_ptrsTimeDensity0_0"
+#define GNB_CONFIG_STRING_ULPTRSTIMEDENSITY1_0 "ul_ptrsTimeDensity1_0"
+#define GNB_CONFIG_STRING_ULPTRSTIMEDENSITY2_0 "ul_ptrsTimeDensity2_0"
+#define GNB_CONFIG_STRING_ULPTRSREOFFSET_0 "ul_ptrsReOffset_0"
+#define GNB_CONFIG_STRING_ULPTRSMAXPORTS_0 "ul_ptrsMaxPorts_0"
+#define GNB_CONFIG_STRING_ULPTRSPOWER_0 "ul_ptrsPower_0"
+
/*--------------------------------------------------------------------------------------------------------------------*/
/* pdcch_ConfigSIB1 parameters */
/*--------------------------------------------------------------------------------------------------------------------*/
@@ -395,6 +413,26 @@
{GNB_CONFIG_STRING_SSPBCHBLOCKPOWER,NULL,0,i64ptr:&scc->ss_PBCH_BlockPower,defint64val:20,TYPE_INT64,0}, \
{GNB_CONFIG_STRING_MSG1SUBCARRIERSPACING,NULL,0,i64ptr:scc->uplinkConfigCommon->initialUplinkBWP->rach_ConfigCommon->choice.setup->msg1_SubcarrierSpacing,defintval:-1,TYPE_INT64,0}}
+/*-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------*/
+/* Serving Cell Config Dedicated configuration parameters */
+/*-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------*/
+
+#define SCDPARAMS_DESC(scd) { \
+{GNB_CONFIG_STRING_DLPTRSFREQDENSITY0_0,NULL,0,i64ptr:scd->downlinkBWP_ToAddModList->list.array[0]->bwp_Dedicated->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup->phaseTrackingRS->choice.setup->frequencyDensity->list.array[0],defint64val:-1,TYPE_INT64,0}, \
+{GNB_CONFIG_STRING_DLPTRSFREQDENSITY1_0,NULL,0,i64ptr:scd->downlinkBWP_ToAddModList->list.array[0]->bwp_Dedicated->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup->phaseTrackingRS->choice.setup->frequencyDensity->list.array[1],defint64val:-1,TYPE_INT64,0}, \
+{GNB_CONFIG_STRING_DLPTRSTIMEDENSITY0_0,NULL,0,i64ptr:scd->downlinkBWP_ToAddModList->list.array[0]->bwp_Dedicated->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup->phaseTrackingRS->choice.setup->timeDensity->list.array[0],defint64val:-1,TYPE_INT64,0}, \
+{GNB_CONFIG_STRING_DLPTRSTIMEDENSITY1_0,NULL,0,i64ptr:scd->downlinkBWP_ToAddModList->list.array[0]->bwp_Dedicated->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup->phaseTrackingRS->choice.setup->timeDensity->list.array[1],defint64val:-1,TYPE_INT64,0}, \
+{GNB_CONFIG_STRING_DLPTRSTIMEDENSITY2_0,NULL,0,i64ptr:scd->downlinkBWP_ToAddModList->list.array[0]->bwp_Dedicated->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup->phaseTrackingRS->choice.setup->timeDensity->list.array[2],defint64val:-1,TYPE_INT64,0}, \
+{GNB_CONFIG_STRING_DLPTRSEPRERATIO_0,NULL,0,i64ptr:scd->downlinkBWP_ToAddModList->list.array[0]->bwp_Dedicated->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup->phaseTrackingRS->choice.setup->epre_Ratio,defint64val:-1,TYPE_INT64,0}, \
+{GNB_CONFIG_STRING_DLPTRSREOFFSET_0,NULL,0,i64ptr:scd->downlinkBWP_ToAddModList->list.array[0]->bwp_Dedicated->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup->phaseTrackingRS->choice.setup->resourceElementOffset,defint64val:-1,TYPE_INT64,0}, \
+{GNB_CONFIG_STRING_ULPTRSFREQDENSITY0_0,NULL,0,i64ptr:scd->uplinkConfig->uplinkBWP_ToAddModList->list.array[0]->bwp_Dedicated->pusch_Config->choice.setup->dmrs_UplinkForPUSCH_MappingTypeB->choice.setup->phaseTrackingRS->choice.setup->transformPrecoderDisabled->frequencyDensity->list.array[0],defint64val:-1,TYPE_INT64,0}, \
+{GNB_CONFIG_STRING_ULPTRSFREQDENSITY1_0,NULL,0,i64ptr:scd->uplinkConfig->uplinkBWP_ToAddModList->list.array[0]->bwp_Dedicated->pusch_Config->choice.setup->dmrs_UplinkForPUSCH_MappingTypeB->choice.setup->phaseTrackingRS->choice.setup->transformPrecoderDisabled->frequencyDensity->list.array[1],defint64val:-1,TYPE_INT64,0}, \
+{GNB_CONFIG_STRING_ULPTRSTIMEDENSITY0_0,NULL,0,i64ptr:scd->uplinkConfig->uplinkBWP_ToAddModList->list.array[0]->bwp_Dedicated->pusch_Config->choice.setup->dmrs_UplinkForPUSCH_MappingTypeB->choice.setup->phaseTrackingRS->choice.setup->transformPrecoderDisabled->timeDensity->list.array[0],defint64val:-1,TYPE_INT64,0}, \
+{GNB_CONFIG_STRING_ULPTRSTIMEDENSITY1_0,NULL,0,i64ptr:scd->uplinkConfig->uplinkBWP_ToAddModList->list.array[0]->bwp_Dedicated->pusch_Config->choice.setup->dmrs_UplinkForPUSCH_MappingTypeB->choice.setup->phaseTrackingRS->choice.setup->transformPrecoderDisabled->timeDensity->list.array[1],defint64val:-1,TYPE_INT64,0}, \
+{GNB_CONFIG_STRING_ULPTRSTIMEDENSITY2_0,NULL,0,i64ptr:scd->uplinkConfig->uplinkBWP_ToAddModList->list.array[0]->bwp_Dedicated->pusch_Config->choice.setup->dmrs_UplinkForPUSCH_MappingTypeB->choice.setup->phaseTrackingRS->choice.setup->transformPrecoderDisabled->timeDensity->list.array[2],defint64val:-1,TYPE_INT64,0}, \
+{GNB_CONFIG_STRING_ULPTRSREOFFSET_0,NULL,0,i64ptr:scd->uplinkConfig->uplinkBWP_ToAddModList->list.array[0]->bwp_Dedicated->pusch_Config->choice.setup->dmrs_UplinkForPUSCH_MappingTypeB->choice.setup->phaseTrackingRS->choice.setup->transformPrecoderDisabled->resourceElementOffset,defint64val:-1,TYPE_INT64,0}, \
+{GNB_CONFIG_STRING_ULPTRSMAXPORTS_0,NULL,0,i64ptr:&scd->uplinkConfig->uplinkBWP_ToAddModList->list.array[0]->bwp_Dedicated->pusch_Config->choice.setup->dmrs_UplinkForPUSCH_MappingTypeB->choice.setup->phaseTrackingRS->choice.setup->transformPrecoderDisabled->maxNrofPorts,defint64val:0,TYPE_INT64,0}, \
+{GNB_CONFIG_STRING_ULPTRSPOWER_0,NULL,0,i64ptr:&scd->uplinkConfig->uplinkBWP_ToAddModList->list.array[0]->bwp_Dedicated->pusch_Config->choice.setup->dmrs_UplinkForPUSCH_MappingTypeB->choice.setup->phaseTrackingRS->choice.setup->transformPrecoderDisabled->ptrs_Power,defint64val:0,TYPE_INT64,0}}
diff --git a/openair2/GNB_APP/gnb_config.c b/openair2/GNB_APP/gnb_config.c
index 957485a992..c25ddaab29 100644
--- a/openair2/GNB_APP/gnb_config.c
+++ b/openair2/GNB_APP/gnb_config.c
@@ -293,6 +293,163 @@ void fix_scc(NR_ServingCellConfigCommon_t *scc,uint64_t ssbmap) {
}
}
+/* Function to allocate dedicated serving cell config strutures */
+void prepare_scd(NR_ServingCellConfig_t *scd) {
+ // Allocate downlink structures
+
+ scd->downlinkBWP_ToAddModList = CALLOC(1, sizeof(*scd->downlinkBWP_ToAddModList));
+
+ // Downlink bandwidth part
+ NR_BWP_Downlink_t *bwp = calloc(1, sizeof(*bwp));
+ bwp->bwp_Id = 1;
+
+ // Allocate downlink dedicated bandwidth part and PDSCH structures
+ bwp->bwp_Dedicated = calloc(1, sizeof(*bwp->bwp_Dedicated));
+ bwp->bwp_Dedicated->pdsch_Config = calloc(1, sizeof(*bwp->bwp_Dedicated->pdsch_Config));
+ bwp->bwp_Dedicated->pdsch_Config->present = NR_SetupRelease_PDSCH_Config_PR_setup;
+ bwp->bwp_Dedicated->pdsch_Config->choice.setup = calloc(1, sizeof(*bwp->bwp_Dedicated->pdsch_Config->choice.setup));
+ bwp->bwp_Dedicated->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA = calloc(1, sizeof(*bwp->bwp_Dedicated->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA));
+ bwp->bwp_Dedicated->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA->present = NR_SetupRelease_DMRS_DownlinkConfig_PR_setup;
+
+ // Allocate DL DMRS and PTRS configuration
+ bwp->bwp_Dedicated->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup = calloc(1, sizeof(*bwp->bwp_Dedicated->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup));
+ NR_DMRS_DownlinkConfig_t *NR_DMRS_DownlinkCfg = bwp->bwp_Dedicated->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup;
+ NR_DMRS_DownlinkCfg->phaseTrackingRS=CALLOC(1, sizeof(*NR_DMRS_DownlinkCfg->phaseTrackingRS));
+ NR_DMRS_DownlinkCfg->phaseTrackingRS->present = NR_SetupRelease_PTRS_DownlinkConfig_PR_setup;
+ NR_DMRS_DownlinkCfg->phaseTrackingRS->choice.setup = CALLOC(1, sizeof(*NR_DMRS_DownlinkCfg->phaseTrackingRS->choice.setup));
+ NR_PTRS_DownlinkConfig_t *NR_PTRS_DownlinkCfg = NR_DMRS_DownlinkCfg->phaseTrackingRS->choice.setup;
+ NR_PTRS_DownlinkCfg->frequencyDensity = CALLOC(1, sizeof(*NR_PTRS_DownlinkCfg->frequencyDensity));
+ long *dl_rbs = CALLOC(2, sizeof(long));
+ for (int i=0;i<2;i++) {
+ ASN_SEQUENCE_ADD(&NR_PTRS_DownlinkCfg->frequencyDensity->list, &dl_rbs[i]);
+ }
+ NR_PTRS_DownlinkCfg->timeDensity = CALLOC(1, sizeof(*NR_PTRS_DownlinkCfg->timeDensity));
+ long *dl_mcs = CALLOC(3, sizeof(long));
+ for (int i=0;i<3;i++) {
+ ASN_SEQUENCE_ADD(&NR_PTRS_DownlinkCfg->timeDensity->list, &dl_mcs[i]);
+ }
+ NR_PTRS_DownlinkCfg->epre_Ratio = CALLOC(1, sizeof(*NR_PTRS_DownlinkCfg->epre_Ratio));
+ NR_PTRS_DownlinkCfg->resourceElementOffset = CALLOC(1, sizeof(*NR_PTRS_DownlinkCfg->resourceElementOffset));
+ *NR_PTRS_DownlinkCfg->resourceElementOffset = 0;
+ ASN_SEQUENCE_ADD(&scd->downlinkBWP_ToAddModList->list,bwp);
+
+ // Allocate uplink structures
+
+ scd->uplinkConfig = CALLOC(1, sizeof(*scd->uplinkConfig));
+ scd->uplinkConfig->uplinkBWP_ToAddModList = CALLOC(1, sizeof(*scd->uplinkConfig->uplinkBWP_ToAddModList));
+
+ NR_PUSCH_Config_t *pusch_Config = CALLOC(1, sizeof(*pusch_Config));
+
+ // Allocate UL DMRS and PTRS structures
+ pusch_Config->dmrs_UplinkForPUSCH_MappingTypeB = CALLOC(1, sizeof(*pusch_Config->dmrs_UplinkForPUSCH_MappingTypeB));
+ pusch_Config->dmrs_UplinkForPUSCH_MappingTypeB->present = NR_SetupRelease_DMRS_UplinkConfig_PR_setup;
+ pusch_Config->dmrs_UplinkForPUSCH_MappingTypeB->choice.setup = CALLOC(1, sizeof(*pusch_Config->dmrs_UplinkForPUSCH_MappingTypeB->choice.setup));
+ NR_DMRS_UplinkConfig_t *NR_DMRS_UplinkConfig = pusch_Config->dmrs_UplinkForPUSCH_MappingTypeB->choice.setup;
+ NR_DMRS_UplinkConfig->phaseTrackingRS = CALLOC(1, sizeof(*NR_DMRS_UplinkConfig->phaseTrackingRS));
+ NR_DMRS_UplinkConfig->phaseTrackingRS->present = NR_SetupRelease_PTRS_UplinkConfig_PR_setup;
+ NR_DMRS_UplinkConfig->phaseTrackingRS->choice.setup = CALLOC(1, sizeof(*NR_DMRS_UplinkConfig->phaseTrackingRS->choice.setup));
+ NR_PTRS_UplinkConfig_t *NR_PTRS_UplinkConfig = NR_DMRS_UplinkConfig->phaseTrackingRS->choice.setup;
+ NR_PTRS_UplinkConfig->transformPrecoderDisabled = CALLOC(1, sizeof(*NR_PTRS_UplinkConfig->transformPrecoderDisabled));
+ NR_PTRS_UplinkConfig->transformPrecoderDisabled->frequencyDensity = CALLOC(1, sizeof(*NR_PTRS_UplinkConfig->transformPrecoderDisabled->frequencyDensity));
+ long *n_rbs = CALLOC(2, sizeof(long));
+ for (int i=0;i<2;i++) {
+ ASN_SEQUENCE_ADD(&NR_PTRS_UplinkConfig->transformPrecoderDisabled->frequencyDensity->list, &n_rbs[i]);
+ }
+ NR_PTRS_UplinkConfig->transformPrecoderDisabled->timeDensity = CALLOC(1, sizeof(*NR_PTRS_UplinkConfig->transformPrecoderDisabled->timeDensity));
+ long *ptrs_mcs = CALLOC(3, sizeof(long));
+ for (int i = 0; i < 3; i++) {
+ ASN_SEQUENCE_ADD(&NR_PTRS_UplinkConfig->transformPrecoderDisabled->timeDensity->list, &ptrs_mcs[i]);
+ }
+ NR_PTRS_UplinkConfig->transformPrecoderDisabled->resourceElementOffset = CALLOC(1, sizeof(*NR_PTRS_UplinkConfig->transformPrecoderDisabled->resourceElementOffset));
+ *NR_PTRS_UplinkConfig->transformPrecoderDisabled->resourceElementOffset = 0;
+
+ // UL bandwidth part
+ NR_BWP_Uplink_t *ubwp = CALLOC(1, sizeof(*ubwp));
+ ubwp->bwp_Id = 1;
+ ubwp->bwp_Dedicated = CALLOC(1, sizeof(*ubwp->bwp_Dedicated));
+
+ ubwp->bwp_Dedicated->pusch_Config = CALLOC(1, sizeof(*ubwp->bwp_Dedicated->pusch_Config));
+ ubwp->bwp_Dedicated->pusch_Config->present = NR_SetupRelease_PUSCH_Config_PR_setup;
+ ubwp->bwp_Dedicated->pusch_Config->choice.setup = pusch_Config;
+
+ ASN_SEQUENCE_ADD(&scd->uplinkConfig->uplinkBWP_ToAddModList->list,ubwp);
+}
+
+/* This function checks dedicated serving cell configuration and performs fixes as needed */
+void fix_scd(NR_ServingCellConfig_t *scd) {
+ // Check for DL PTRS parameters validity
+ if (scd->downlinkBWP_ToAddModList->list.array[0]->bwp_Dedicated->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup->phaseTrackingRS) {
+ // If any of the frequencyDensity values are not set or are out of bounds, PTRS is assumed to be not present
+ for (int i = scd->downlinkBWP_ToAddModList->list.array[0]->bwp_Dedicated->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup->phaseTrackingRS->choice.setup->frequencyDensity->list.count-1; i >= 0; i--) {
+ if ((*scd->downlinkBWP_ToAddModList->list.array[0]->bwp_Dedicated->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup->phaseTrackingRS->choice.setup->frequencyDensity->list.array[i] < 1)
+ || (*scd->downlinkBWP_ToAddModList->list.array[0]->bwp_Dedicated->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup->phaseTrackingRS->choice.setup->frequencyDensity->list.array[i] > 276)) {
+ LOG_I(RRC, "DL PTRS frequencyDensity %d not set. Assuming PTRS not present! \n", i);
+ free(scd->downlinkBWP_ToAddModList->list.array[0]->bwp_Dedicated->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup->phaseTrackingRS);
+ scd->downlinkBWP_ToAddModList->list.array[0]->bwp_Dedicated->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup->phaseTrackingRS = NULL;
+ break;
+ }
+ }
+ }
+ if (scd->downlinkBWP_ToAddModList->list.array[0]->bwp_Dedicated->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup->phaseTrackingRS) {
+ // If any of the timeDensity values are not set or are out of bounds, PTRS is assumed to be not present
+ for (int i = scd->downlinkBWP_ToAddModList->list.array[0]->bwp_Dedicated->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup->phaseTrackingRS->choice.setup->timeDensity->list.count-1; i >= 0; i--) {
+ if ((*scd->downlinkBWP_ToAddModList->list.array[0]->bwp_Dedicated->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup->phaseTrackingRS->choice.setup->timeDensity->list.array[i] < 0)
+ || (*scd->downlinkBWP_ToAddModList->list.array[0]->bwp_Dedicated->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup->phaseTrackingRS->choice.setup->timeDensity->list.array[i] > 29)) {
+ LOG_I(RRC, "DL PTRS timeDensity %d not set. Assuming PTRS not present! \n", i);
+ free(scd->downlinkBWP_ToAddModList->list.array[0]->bwp_Dedicated->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup->phaseTrackingRS);
+ scd->downlinkBWP_ToAddModList->list.array[0]->bwp_Dedicated->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup->phaseTrackingRS = NULL;
+ break;
+ }
+ }
+ }
+ if (scd->downlinkBWP_ToAddModList->list.array[0]->bwp_Dedicated->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup->phaseTrackingRS) {
+ if (*scd->downlinkBWP_ToAddModList->list.array[0]->bwp_Dedicated->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup->phaseTrackingRS->choice.setup->resourceElementOffset > 2) {
+ LOG_I(RRC, "Freeing DL PTRS resourceElementOffset \n");
+ free(scd->downlinkBWP_ToAddModList->list.array[0]->bwp_Dedicated->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup->phaseTrackingRS->choice.setup->resourceElementOffset);
+ scd->downlinkBWP_ToAddModList->list.array[0]->bwp_Dedicated->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup->phaseTrackingRS->choice.setup->resourceElementOffset = NULL;
+ }
+ if (*scd->downlinkBWP_ToAddModList->list.array[0]->bwp_Dedicated->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup->phaseTrackingRS->choice.setup->epre_Ratio > 1) {
+ LOG_I(RRC, "Freeing DL PTRS epre_Ratio \n");
+ free(scd->downlinkBWP_ToAddModList->list.array[0]->bwp_Dedicated->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup->phaseTrackingRS->choice.setup->epre_Ratio);
+ scd->downlinkBWP_ToAddModList->list.array[0]->bwp_Dedicated->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup->phaseTrackingRS->choice.setup->epre_Ratio = NULL;
+ }
+ }
+
+ if (scd->uplinkConfig->uplinkBWP_ToAddModList->list.array[0]->bwp_Dedicated->pusch_Config->choice.setup->dmrs_UplinkForPUSCH_MappingTypeB->choice.setup->phaseTrackingRS) {
+ // If any of the frequencyDensity values are not set or are out of bounds, PTRS is assumed to be not present
+ for (int i = scd->uplinkConfig->uplinkBWP_ToAddModList->list.array[0]->bwp_Dedicated->pusch_Config->choice.setup->dmrs_UplinkForPUSCH_MappingTypeB->choice.setup->phaseTrackingRS->choice.setup->transformPrecoderDisabled->frequencyDensity->list.count-1; i >= 0; i--) {
+ if ((*scd->uplinkConfig->uplinkBWP_ToAddModList->list.array[0]->bwp_Dedicated->pusch_Config->choice.setup->dmrs_UplinkForPUSCH_MappingTypeB->choice.setup->phaseTrackingRS->choice.setup->transformPrecoderDisabled->frequencyDensity->list.array[i] < 1)
+ || (*scd->uplinkConfig->uplinkBWP_ToAddModList->list.array[0]->bwp_Dedicated->pusch_Config->choice.setup->dmrs_UplinkForPUSCH_MappingTypeB->choice.setup->phaseTrackingRS->choice.setup->transformPrecoderDisabled->frequencyDensity->list.array[i] > 276)) {
+ LOG_I(RRC, "UL PTRS frequencyDensity %d not set. Assuming PTRS not present! \n", i);
+ free(scd->uplinkConfig->uplinkBWP_ToAddModList->list.array[0]->bwp_Dedicated->pusch_Config->choice.setup->dmrs_UplinkForPUSCH_MappingTypeB->choice.setup->phaseTrackingRS);
+ scd->uplinkConfig->uplinkBWP_ToAddModList->list.array[0]->bwp_Dedicated->pusch_Config->choice.setup->dmrs_UplinkForPUSCH_MappingTypeB->choice.setup->phaseTrackingRS = NULL;
+ break;
+ }
+ }
+ }
+
+ if (scd->uplinkConfig->uplinkBWP_ToAddModList->list.array[0]->bwp_Dedicated->pusch_Config->choice.setup->dmrs_UplinkForPUSCH_MappingTypeB->choice.setup->phaseTrackingRS) {
+ // If any of the timeDensity values are not set or are out of bounds, PTRS is assumed to be not present
+ for (int i = scd->uplinkConfig->uplinkBWP_ToAddModList->list.array[0]->bwp_Dedicated->pusch_Config->choice.setup->dmrs_UplinkForPUSCH_MappingTypeB->choice.setup->phaseTrackingRS->choice.setup->transformPrecoderDisabled->timeDensity->list.count-1; i >= 0; i--) {
+ if ((*scd->uplinkConfig->uplinkBWP_ToAddModList->list.array[0]->bwp_Dedicated->pusch_Config->choice.setup->dmrs_UplinkForPUSCH_MappingTypeB->choice.setup->phaseTrackingRS->choice.setup->transformPrecoderDisabled->timeDensity->list.array[i] < 0)
+ || (*scd->uplinkConfig->uplinkBWP_ToAddModList->list.array[0]->bwp_Dedicated->pusch_Config->choice.setup->dmrs_UplinkForPUSCH_MappingTypeB->choice.setup->phaseTrackingRS->choice.setup->transformPrecoderDisabled->timeDensity->list.array[i] > 29)) {
+ LOG_I(RRC, "UL PTRS timeDensity %d not set. Assuming PTRS not present! \n", i);
+ free(scd->uplinkConfig->uplinkBWP_ToAddModList->list.array[0]->bwp_Dedicated->pusch_Config->choice.setup->dmrs_UplinkForPUSCH_MappingTypeB->choice.setup->phaseTrackingRS);
+ scd->uplinkConfig->uplinkBWP_ToAddModList->list.array[0]->bwp_Dedicated->pusch_Config->choice.setup->dmrs_UplinkForPUSCH_MappingTypeB->choice.setup->phaseTrackingRS = NULL;
+ break;
+ }
+ }
+ }
+ if (scd->uplinkConfig->uplinkBWP_ToAddModList->list.array[0]->bwp_Dedicated->pusch_Config->choice.setup->dmrs_UplinkForPUSCH_MappingTypeB->choice.setup->phaseTrackingRS) {
+ // Check for UL PTRS parameters validity
+ if (*scd->uplinkConfig->uplinkBWP_ToAddModList->list.array[0]->bwp_Dedicated->pusch_Config->choice.setup->dmrs_UplinkForPUSCH_MappingTypeB->choice.setup->phaseTrackingRS->choice.setup->transformPrecoderDisabled->resourceElementOffset > 2) {
+ LOG_I(RRC, "Freeing UL PTRS resourceElementOffset \n");
+ free(scd->uplinkConfig->uplinkBWP_ToAddModList->list.array[0]->bwp_Dedicated->pusch_Config->choice.setup->dmrs_UplinkForPUSCH_MappingTypeB->choice.setup->phaseTrackingRS->choice.setup->transformPrecoderDisabled->resourceElementOffset);
+ scd->uplinkConfig->uplinkBWP_ToAddModList->list.array[0]->bwp_Dedicated->pusch_Config->choice.setup->dmrs_UplinkForPUSCH_MappingTypeB->choice.setup->phaseTrackingRS->choice.setup->transformPrecoderDisabled->resourceElementOffset = NULL;
+ }
+ }
+}
+
void RCconfig_nr_flexran()
{
uint16_t i;
@@ -627,6 +784,13 @@ void RCconfig_NRRRC(MessageDef *msg_p, uint32_t i, gNB_RRC_INST *rrc) {
prepare_scc(scc);
paramdef_t SCCsParams[] = SCCPARAMS_DESC(scc);
paramlist_def_t SCCsParamList = {GNB_CONFIG_STRING_SERVINGCELLCONFIGCOMMON, NULL, 0};
+
+ // Serving Cell Config Dedicated
+ NR_ServingCellConfig_t *scd = calloc(1,sizeof(NR_ServingCellConfig_t));
+ memset((void*)scd,0,sizeof(NR_ServingCellConfig_t));
+ prepare_scd(scd);
+ paramdef_t SCDsParams[] = SCDPARAMS_DESC(scd);
+ paramlist_def_t SCDsParamList = {GNB_CONFIG_STRING_SERVINGCELLCONFIGDEDICATED, NULL, 0};
////////// Physical parameters
@@ -700,6 +864,23 @@ void RCconfig_NRRRC(MessageDef *msg_p, uint32_t i, gNB_RRC_INST *rrc) {
(int)scc->uplinkConfigCommon->initialUplinkBWP->rach_ConfigCommon->choice.setup->rach_ConfigGeneric.preambleReceivedTargetPower);
fix_scc(scc,ssb_bitmap);
}
+
+ sprintf(aprefix, "%s.[%i]", GNB_CONFIG_STRING_GNB_LIST, 0);
+
+ config_getlist(&SCDsParamList, NULL, 0, aprefix);
+ if (SCDsParamList.numelt > 0) {
+ sprintf(aprefix, "%s.[%i].%s.[%i]", GNB_CONFIG_STRING_GNB_LIST,0,GNB_CONFIG_STRING_SERVINGCELLCONFIGDEDICATED, 0);
+ config_get( SCDsParams,sizeof(SCDsParams)/sizeof(paramdef_t),aprefix);
+ LOG_I(RRC,"Read in ServingCellConfigDedicated UL (FreqDensity_0 %d, FreqDensity_1 %d, TimeDensity_0 %d, TimeDensity_1 %d, TimeDensity_2 %d, RE offset %d \n",
+ (int)*scd->uplinkConfig->uplinkBWP_ToAddModList->list.array[0]->bwp_Dedicated->pusch_Config->choice.setup->dmrs_UplinkForPUSCH_MappingTypeB->choice.setup->phaseTrackingRS->choice.setup->transformPrecoderDisabled->frequencyDensity->list.array[0],
+ (int)*scd->uplinkConfig->uplinkBWP_ToAddModList->list.array[0]->bwp_Dedicated->pusch_Config->choice.setup->dmrs_UplinkForPUSCH_MappingTypeB->choice.setup->phaseTrackingRS->choice.setup->transformPrecoderDisabled->frequencyDensity->list.array[1],
+ (int)*scd->uplinkConfig->uplinkBWP_ToAddModList->list.array[0]->bwp_Dedicated->pusch_Config->choice.setup->dmrs_UplinkForPUSCH_MappingTypeB->choice.setup->phaseTrackingRS->choice.setup->transformPrecoderDisabled->timeDensity->list.array[0],
+ (int)*scd->uplinkConfig->uplinkBWP_ToAddModList->list.array[0]->bwp_Dedicated->pusch_Config->choice.setup->dmrs_UplinkForPUSCH_MappingTypeB->choice.setup->phaseTrackingRS->choice.setup->transformPrecoderDisabled->timeDensity->list.array[1],
+ (int)*scd->uplinkConfig->uplinkBWP_ToAddModList->list.array[0]->bwp_Dedicated->pusch_Config->choice.setup->dmrs_UplinkForPUSCH_MappingTypeB->choice.setup->phaseTrackingRS->choice.setup->transformPrecoderDisabled->timeDensity->list.array[2],
+ (int)*scd->uplinkConfig->uplinkBWP_ToAddModList->list.array[0]->bwp_Dedicated->pusch_Config->choice.setup->dmrs_UplinkForPUSCH_MappingTypeB->choice.setup->phaseTrackingRS->choice.setup->transformPrecoderDisabled->resourceElementOffset);
+ }
+ fix_scd(scd);
+
printf("NRRRC %d: Southbound Transport %s\n",i,*(GNBParamList.paramarray[i][GNB_TRANSPORT_S_PREFERENCE_IDX].strptr));
if (strcmp(*(GNBParamList.paramarray[i][GNB_TRANSPORT_S_PREFERENCE_IDX].strptr), "local_mac") == 0) {
@@ -765,11 +946,14 @@ void RCconfig_NRRRC(MessageDef *msg_p, uint32_t i, gNB_RRC_INST *rrc) {
NRRRC_CONFIGURATION_REQ (msg_p).ssb_SubcarrierOffset = *GNBParamList.paramarray[i][GNB_SSB_SUBCARRIEROFFSET_IDX].iptr;
printf("pdsch_AntennaPorts %d\n",*GNBParamList.paramarray[i][GNB_PDSCH_ANTENNAPORTS_IDX].iptr);
NRRRC_CONFIGURATION_REQ (msg_p).pdsch_AntennaPorts = *GNBParamList.paramarray[i][GNB_PDSCH_ANTENNAPORTS_IDX].iptr;
+ printf("pusch_AntennaPorts %d\n",*GNBParamList.paramarray[i][GNB_PUSCH_ANTENNAPORTS_IDX].iptr);
+ NRRRC_CONFIGURATION_REQ (msg_p).pusch_AntennaPorts = *GNBParamList.paramarray[i][GNB_PUSCH_ANTENNAPORTS_IDX].iptr;
printf("pusch_TargetSNRx10 %d\n",*GNBParamList.paramarray[i][GNB_PUSCH_TARGETPOW_X10_IDX].iptr);
NRRRC_CONFIGURATION_REQ (msg_p).pusch_TargetSNRx10 = *GNBParamList.paramarray[i][GNB_PUSCH_TARGETPOW_X10_IDX].iptr;
printf("pucch_TargetSNRx10 %d\n",*GNBParamList.paramarray[i][GNB_PUCCH_TARGETPOW_X10_IDX].iptr);
NRRRC_CONFIGURATION_REQ (msg_p).pucch_TargetSNRx10 = *GNBParamList.paramarray[i][GNB_PUCCH_TARGETPOW_X10_IDX].iptr;
NRRRC_CONFIGURATION_REQ (msg_p).scc = scc;
+ NRRRC_CONFIGURATION_REQ (msg_p).scd = scd;
}//
diff --git a/openair2/GNB_APP/gnb_paramdef.h b/openair2/GNB_APP/gnb_paramdef.h
index 403602c109..8b326d58c9 100644
--- a/openair2/GNB_APP/gnb_paramdef.h
+++ b/openair2/GNB_APP/gnb_paramdef.h
@@ -115,6 +115,7 @@ typedef enum {
#define GNB_CONFIG_STRING_REMOTE_S_PORTD "remote_s_portd"
#define GNB_CONFIG_STRING_SSBSUBCARRIEROFFSET "ssb_SubcarrierOffset"
#define GNB_CONFIG_STRING_PDSCHANTENNAPORTS "pdsch_AntennaPorts"
+#define GNB_CONFIG_STRING_PUSCHANTENNAPORTS "pusch_AntennaPorts"
#define GNB_CONFIG_STRING_PUSCHTARGETPOWX10 "pusch_TargetSNRx10"
#define GNB_CONFIG_STRING_PUCCHTARGETPOWX10 "pucch_TargetSNRx10"
@@ -139,6 +140,7 @@ typedef enum {
{GNB_CONFIG_STRING_REMOTE_S_PORTD, NULL, 0, uptr:NULL, defuintval:50001, TYPE_UINT, 0}, \
{GNB_CONFIG_STRING_SSBSUBCARRIEROFFSET, NULL, 0, iptr:NULL, defintval:31, TYPE_INT, 0}, \
{GNB_CONFIG_STRING_PDSCHANTENNAPORTS, NULL, 0, iptr:NULL, defintval:1, TYPE_INT, 0}, \
+{GNB_CONFIG_STRING_PUSCHANTENNAPORTS, NULL, 0, iptr:NULL, defintval:1, TYPE_INT, 0}, \
{GNB_CONFIG_STRING_PUSCHTARGETPOWX10, NULL, 0, iptr:NULL, defintval:200, TYPE_INT, 0}, \
{GNB_CONFIG_STRING_PUCCHTARGETPOWX10, NULL, 0, iptr:NULL, defintval:200, TYPE_INT, 0}, \
}
@@ -159,8 +161,9 @@ typedef enum {
#define GNB_REMOTE_S_PORTD_IDX 13
#define GNB_SSB_SUBCARRIEROFFSET_IDX 14
#define GNB_PDSCH_ANTENNAPORTS_IDX 15
-#define GNB_PUSCH_TARGETPOW_X10_IDX 16
-#define GNB_PUCCH_TARGETPOW_X10_IDX 17
+#define GNB_PUSCH_ANTENNAPORTS_IDX 16
+#define GNB_PUSCH_TARGETPOW_X10_IDX 17
+#define GNB_PUCCH_TARGETPOW_X10_IDX 18
#define TRACKING_AREA_CODE_OKRANGE {0x0001,0xFFFD}
#define GNBPARAMS_CHECK { \
diff --git a/openair2/LAYER2/NR_MAC_COMMON/nr_mac_common.c b/openair2/LAYER2/NR_MAC_COMMON/nr_mac_common.c
index edf19be130..c0b7e23c20 100644
--- a/openair2/LAYER2/NR_MAC_COMMON/nr_mac_common.c
+++ b/openair2/LAYER2/NR_MAC_COMMON/nr_mac_common.c
@@ -1409,19 +1409,17 @@ int get_nr_prach_info_from_index(uint8_t index,
if (table_6_3_3_2_3_prachConfig_Index[index][1] != -1)
format2 = (uint8_t) table_6_3_3_2_3_prachConfig_Index[index][1];
*format = ((uint8_t) table_6_3_3_2_3_prachConfig_Index[index][0]) | (format2<<8);
- LOG_D(MAC,"Frame %d slot %d: Getting PRACH info from index %d (col 6 %lu) absoluteFrequencyPointA %u mu %u frame_type %u start_symbol %u N_t_slot %u N_dur %u N_RA_slot %u RA_sfn_index %u \n",
- frame,
- slot,
- index,
- table_6_3_3_2_3_prachConfig_Index[index][6],
- pointa,
- mu,
- unpaired,
- *start_symbol,
- *N_t_slot,
- *N_dur,
- *N_RA_slot,
- *RA_sfn_index);
+ LOG_D(MAC,"Frame %d slot %d: Getting PRACH info from index %d (col 6 %lu) absoluteFrequencyPointA %u mu %u frame_type %u start_symbol %u N_t_slot %u N_dur %u N_RA_slot %u RA_sfn_index %u \n", frame,
+ slot,
+ index, table_6_3_3_2_3_prachConfig_Index[index][6],
+ pointa,
+ mu,
+ unpaired,
+ *start_symbol,
+ *N_t_slot,
+ *N_dur,
+ *N_RA_slot,
+ *RA_sfn_index);
}
return 1;
}
@@ -3008,7 +3006,12 @@ bool set_dl_ptrs_values(NR_PTRS_DownlinkConfig_t *ptrs_config,
valid = false;
return valid;
}
- //printf("[MAC] PTRS is set K= %u L= %u\n", *K_ptrs,1<<*L_ptrs);
+
+ /* Moved below check from scheduler function to here */
+ if (*L_ptrs >= NrOfSymbols) {
+ valid = false;
+ return valid;
+ }
return valid;
}
@@ -3383,3 +3386,79 @@ void get_type0_PDCCH_CSS_config_parameters(NR_Type0_PDCCH_CSS_config_t *type0_PD
type0_PDCCH_CSS_config->cset_start_rb = ssb_offset_point_a - type0_PDCCH_CSS_config->rb_offset;
}
+
+/* extract UL PTRS values from RRC and validate it based upon 38.214 6.2.3 */
+bool set_ul_ptrs_values(NR_PTRS_UplinkConfig_t *ul_ptrs_config,
+ uint16_t rbSize,uint8_t mcsIndex, uint8_t mcsTable,
+ uint8_t *K_ptrs, uint8_t *L_ptrs,
+ uint8_t *reOffset, uint8_t *maxNumPorts, uint8_t *ulPower,
+ uint8_t NrOfSymbols)
+{
+ bool valid = true;
+
+ /* as defined in T 38.214 6.2.3 */
+ if(rbSize < 3) {
+ valid = false;
+ return valid;
+ }
+ /* Check for Frequency Density values */
+ if(ul_ptrs_config->transformPrecoderDisabled->frequencyDensity->list.count < 2) {
+ /* Default value for K_PTRS = 2 as defined in T 38.214 6.2.3 */
+ *K_ptrs = 2;
+ }
+ else {
+ *K_ptrs = get_K_ptrs(*ul_ptrs_config->transformPrecoderDisabled->frequencyDensity->list.array[0],
+ *ul_ptrs_config->transformPrecoderDisabled->frequencyDensity->list.array[1],
+ rbSize);
+ }
+ /* Check for time Density values */
+ if(ul_ptrs_config->transformPrecoderDisabled->timeDensity->list.count < 3) {
+ *L_ptrs = 0;
+ }
+ else {
+ *L_ptrs = get_L_ptrs(*ul_ptrs_config->transformPrecoderDisabled->timeDensity->list.array[0],
+ *ul_ptrs_config->transformPrecoderDisabled->timeDensity->list.array[1],
+ *ul_ptrs_config->transformPrecoderDisabled->timeDensity->list.array[2],
+ mcsIndex,
+ mcsTable);
+ }
+
+ *reOffset = *ul_ptrs_config->transformPrecoderDisabled->resourceElementOffset;
+ *maxNumPorts = ul_ptrs_config->transformPrecoderDisabled->maxNrofPorts;
+ *ulPower = ul_ptrs_config->transformPrecoderDisabled->ptrs_Power;
+ /* If either or both of the parameters PT-RS time density (LPT-RS) and PT-RS frequency density (KPT-RS), shown in Table
+ * 6.2.3.1-1 and Table 6.2.3.1-2, indicates that 'PT-RS not present', the UE shall assume that PT-RS is not present
+ */
+ if(*K_ptrs ==2 || *K_ptrs ==4 ) {
+ valid = true;
+ }
+ else {
+ valid = false;
+ return valid;
+ }
+ if(*L_ptrs ==0 || *L_ptrs ==1 || *L_ptrs ==2 ) {
+ valid = true;
+ }
+ else {
+ valid = false;
+ return valid;
+ }
+ /* PTRS is not present also :
+ * When the UE is receiving a PUSCH with allocation duration of 4 symbols and if LPT-RS is set to 4, the UE shall assume
+ * PT-RS is not transmitted
+ * When the UE is receiving a PUSCH with allocation duration of 2 symbols as defined in Clause 6.4.1.2.2 of [4, TS
+ * 38.211] and if LPT-RS is set to 2 or 4, the UE shall assume PT-RS is not transmitted.
+ */
+ if((NrOfSymbols == 4 && *L_ptrs ==2) || ((NrOfSymbols == 2 && *L_ptrs > 0))) {
+ valid = false;
+ return valid;
+ }
+
+ /* Moved below check from nr_ue_scheduler function to here */
+ if (*L_ptrs >= NrOfSymbols) {
+ valid = false;
+ return valid;
+ }
+ return valid;
+}
+
diff --git a/openair2/LAYER2/NR_MAC_COMMON/nr_mac_common.h b/openair2/LAYER2/NR_MAC_COMMON/nr_mac_common.h
index ba0f67f0d8..741b4e4799 100644
--- a/openair2/LAYER2/NR_MAC_COMMON/nr_mac_common.h
+++ b/openair2/LAYER2/NR_MAC_COMMON/nr_mac_common.h
@@ -81,7 +81,7 @@ int get_nr_prach_info_from_index(uint8_t index,
uint8_t *N_dur,
uint16_t *RA_sfn_index,
uint8_t *N_RA_slot,
- uint8_t *config_period);
+ uint8_t *config_period);
int get_nr_prach_occasion_info_from_index(uint8_t index,
uint32_t pointa,
@@ -147,6 +147,11 @@ bool set_dl_ptrs_values(NR_PTRS_DownlinkConfig_t *ptrs_config,
uint8_t *nERatio,uint8_t *reOffset,
uint8_t NrOfSymbols);
+bool set_ul_ptrs_values(NR_PTRS_UplinkConfig_t *ul_ptrs_config,
+ uint16_t rbSize,uint8_t mcsIndex, uint8_t mcsTable,
+ uint8_t *K_ptrs, uint8_t *L_ptrs,
+ uint8_t *reOffset, uint8_t *maxNumPorts, uint8_t *ulPower,
+ uint8_t NrOfSymbols);
uint8_t get_num_dmrs_symbols(NR_PDSCH_Config_t *pdsch_Config,int dmrs_TypeA_Position,int NrOfSymbols);
/* \brief Set the transform precoding according to 6.1.3 of 3GPP TS 38.214 version 16.3.0 Release 16
diff --git a/openair2/LAYER2/NR_MAC_UE/nr_ue_procedures.c b/openair2/LAYER2/NR_MAC_UE/nr_ue_procedures.c
index ab51033f35..388a19b605 100644
--- a/openair2/LAYER2/NR_MAC_UE/nr_ue_procedures.c
+++ b/openair2/LAYER2/NR_MAC_UE/nr_ue_procedures.c
@@ -610,7 +610,6 @@ int8_t nr_ue_process_dci(module_id_t module_id, int cc_id, uint8_t gNB_index, fr
}
}
-
break;
}
@@ -1047,6 +1046,7 @@ int8_t nr_ue_process_dci(module_id_t module_id, int cc_id, uint8_t gNB_index, fr
&dlsch_config_pdu_1_1->PTRSReOffset, dlsch_config_pdu_1_1->number_symbols);
if(valid_ptrs_setup==true) {
dlsch_config_pdu_1_1->pduBitmap |= 0x1;
+ LOG_D(MAC, "DL PTRS values: PTRS time den: %d, PTRS freq den: %d\n", dlsch_config_pdu_1_1->PTRSTimeDensity, dlsch_config_pdu_1_1->PTRSFreqDensity);
}
}
@@ -1773,7 +1773,7 @@ void nr_ue_process_mac_pdu(nr_downlink_indication_t *dl_info,
frame_t frameP = dl_info->frame;
int slot = dl_info->slot;
uint8_t *pduP = (dl_info->rx_ind->rx_indication_body + pdu_id)->pdsch_pdu.pdu;
- uint16_t pdu_len = (dl_info->rx_ind->rx_indication_body + pdu_id)->pdsch_pdu.pdu_length;
+ int32_t pdu_len = (dl_info->rx_ind->rx_indication_body + pdu_id)->pdsch_pdu.pdu_length;
uint8_t gNB_index = dl_info->gNB_index;
uint8_t CC_id = dl_info->cc_id;
uint8_t done = 0;
@@ -1784,7 +1784,7 @@ void nr_ue_process_mac_pdu(nr_downlink_indication_t *dl_info,
return;
}
- LOG_D(MAC, "In %s [%d.%d]: processing PDU %d of %d total number of PDUs...\n", __FUNCTION__, frameP, slot, pdu_id, dl_info->rx_ind->number_pdus);
+ LOG_D(MAC, "In %s [%d.%d]: processing PDU %d (with length %d) of %d total number of PDUs...\n", __FUNCTION__, frameP, slot, pdu_id, pdu_len, dl_info->rx_ind->number_pdus);
while (!done && pdu_len > 0){
mac_ce_len = 0x0000;
@@ -1988,7 +1988,7 @@ void nr_ue_process_mac_pdu(nr_downlink_indication_t *dl_info,
pduP += ( mac_subheader_len + mac_ce_len + mac_sdu_len );
pdu_len -= ( mac_subheader_len + mac_ce_len + mac_sdu_len );
if (pdu_len < 0)
- LOG_E(MAC, "[MAC] nr_ue_process_mac_pdu, residual mac pdu length %d < 0!\n", pdu_len);
+ LOG_E(MAC, "[UE %d][%d.%d] nr_ue_process_mac_pdu, residual mac pdu length %d < 0!\n", module_idP, frameP, slot, pdu_len);
}
}
diff --git a/openair2/LAYER2/NR_MAC_UE/nr_ue_scheduler.c b/openair2/LAYER2/NR_MAC_UE/nr_ue_scheduler.c
index 194df8101f..ad1958ef33 100644
--- a/openair2/LAYER2/NR_MAC_UE/nr_ue_scheduler.c
+++ b/openair2/LAYER2/NR_MAC_UE/nr_ue_scheduler.c
@@ -561,20 +561,11 @@ int nr_config_pusch_pdu(NR_UE_MAC_INST_t *mac,
} else if (dci) {
int target_ss;
- uint8_t ptrs_time_density;
- uint8_t ptrs_freq_density;
- nfapi_nr_ue_ptrs_ports_t ptrs_ports_list;
+ bool valid_ptrs_setup = 0;
uint16_t n_RB_ULBWP = NRRIV2BW(mac->ULbwp[0]->bwp_Common->genericParameters.locationAndBandwidth, MAX_BWP_SIZE);
fapi_nr_pusch_config_dedicated_t *pusch_config_dedicated = &mac->phy_config.config_req.ul_bwp_dedicated.pusch_config_dedicated;
NR_PUSCH_Config_t *pusch_Config = mac->ULbwp[0]->bwp_Dedicated->pusch_Config->choice.setup;
- // These should come from RRC config!!!
- uint8_t ptrs_mcs1 = 2;
- uint8_t ptrs_mcs2 = 4;
- uint8_t ptrs_mcs3 = 10;
- uint16_t n_rb0 = 25;
- uint16_t n_rb1 = 75;
-
// Basic sanity check for MCS value to check for a false or erroneous DCI
if (dci->mcs > 28) {
LOG_W(MAC, "MCS value %d out of bounds! Possibly due to false DCI. Ignoring DCI!\n", dci->mcs);
@@ -690,12 +681,6 @@ int nr_config_pusch_pdu(NR_UE_MAC_INST_t *mac,
pusch_config_pdu->absolute_delta_PUSCH = 4;
}
- ptrs_time_density = get_L_ptrs(ptrs_mcs1, ptrs_mcs2, ptrs_mcs3, pusch_config_pdu->mcs_index, pusch_config_pdu->mcs_table);
- ptrs_freq_density = get_K_ptrs(n_rb0, n_rb1, pusch_config_pdu->rb_size);
- // PTRS ports configuration
- // TbD: ptrs_dmrs_port and ptrs_port_index are not initialised!
- ptrs_ports_list.ptrs_re_offset = 0;
-
/* DMRS */
l_prime_mask = get_l_prime(pusch_config_pdu->nr_of_symbols, typeB, pusch_dmrs_pos0, pusch_len1);
if (pusch_config_pdu->transform_precoding == transform_precoder_disabled)
@@ -709,12 +694,20 @@ int nr_config_pusch_pdu(NR_UE_MAC_INST_t *mac,
}
/* PTRS */
- pusch_config_pdu->pusch_ptrs.ptrs_time_density = ptrs_time_density;
- pusch_config_pdu->pusch_ptrs.ptrs_freq_density = ptrs_freq_density;
- pusch_config_pdu->pusch_ptrs.ptrs_ports_list = &ptrs_ports_list;
-
- if (1 << pusch_config_pdu->pusch_ptrs.ptrs_time_density >= pusch_config_pdu->nr_of_symbols) {
- pusch_config_pdu->pdu_bit_map &= ~PUSCH_PDU_BITMAP_PUSCH_PTRS; // disable PUSCH PTRS
+ if (mac->ULbwp[0]->bwp_Dedicated->pusch_Config->choice.setup->dmrs_UplinkForPUSCH_MappingTypeB->choice.setup->phaseTrackingRS != NULL) {
+ if (pusch_config_pdu->transform_precoding == transform_precoder_disabled) {
+ nfapi_nr_ue_ptrs_ports_t ptrs_ports_list;
+ pusch_config_pdu->pusch_ptrs.ptrs_ports_list = &ptrs_ports_list;
+ valid_ptrs_setup = set_ul_ptrs_values(mac->ULbwp[0]->bwp_Dedicated->pusch_Config->choice.setup->dmrs_UplinkForPUSCH_MappingTypeB->choice.setup->phaseTrackingRS->choice.setup,
+ pusch_config_pdu->rb_size, pusch_config_pdu->mcs_index, pusch_config_pdu->mcs_table,
+ &pusch_config_pdu->pusch_ptrs.ptrs_freq_density,&pusch_config_pdu->pusch_ptrs.ptrs_time_density,
+ &pusch_config_pdu->pusch_ptrs.ptrs_ports_list->ptrs_re_offset,&pusch_config_pdu->pusch_ptrs.num_ptrs_ports,
+ &pusch_config_pdu->pusch_ptrs.ul_ptrs_power, pusch_config_pdu->nr_of_symbols);
+ if(valid_ptrs_setup==true) {
+ pusch_config_pdu->pdu_bit_map |= PUSCH_PDU_BITMAP_PUSCH_PTRS;
+ }
+ LOG_D(MAC, "UL PTRS values: PTRS time den: %d, PTRS freq den: %d\n", pusch_config_pdu->pusch_ptrs.ptrs_time_density, pusch_config_pdu->pusch_ptrs.ptrs_freq_density);
+ }
}
}
diff --git a/openair2/LAYER2/NR_MAC_gNB/config.c b/openair2/LAYER2/NR_MAC_gNB/config.c
index 636fc38199..38700798f5 100644
--- a/openair2/LAYER2/NR_MAC_gNB/config.c
+++ b/openair2/LAYER2/NR_MAC_gNB/config.c
@@ -54,7 +54,7 @@ extern RAN_CONTEXT_t RC;
extern void mac_top_init_gNB(void);
extern uint8_t nfapi_mode;
-void config_common(int Mod_idP, int ssb_SubcarrierOffset, int pdsch_AntennaPorts, NR_ServingCellConfigCommon_t *scc) {
+void config_common(int Mod_idP, int ssb_SubcarrierOffset, int pdsch_AntennaPorts, int pusch_AntennaPorts, NR_ServingCellConfigCommon_t *scc) {
nfapi_nr_config_request_scf_t *cfg = &RC.nrmac[Mod_idP]->config[0];
RC.nrmac[Mod_idP]->common_channels[0].ServingCellConfigCommon = scc;
@@ -278,7 +278,8 @@ void config_common(int Mod_idP, int ssb_SubcarrierOffset, int pdsch_AntennaPorts
num_ssb += (cfg->ssb_table.ssb_mask_list[1].ssb_mask.value>>i)&1;
}
- cfg->carrier_config.num_rx_ant.value = cfg->carrier_config.num_tx_ant.value;
+ cfg->carrier_config.num_rx_ant.value = pusch_AntennaPorts;
+ AssertFatal(pusch_AntennaPorts > 0 && pusch_AntennaPorts < 13, "pusch_AntennaPorts in 1...12\n");
cfg->carrier_config.num_rx_ant.tl.tag = NFAPI_NR_CONFIG_NUM_RX_ANT_TAG;
LOG_I(MAC,"Set TX/RX antenna number to %d (num ssb %d: %x,%x)\n",cfg->carrier_config.num_tx_ant.value,num_ssb,cfg->ssb_table.ssb_mask_list[0].ssb_mask.value,cfg->ssb_table.ssb_mask_list[1].ssb_mask.value);
AssertFatal(cfg->carrier_config.num_tx_ant.value > 0,"carrier_config.num_tx_ant.value %d !\n",cfg->carrier_config.num_tx_ant.value );
@@ -313,12 +314,11 @@ void config_common(int Mod_idP, int ssb_SubcarrierOffset, int pdsch_AntennaPorts
}
-
-
extern uint16_t sl_ahead;
-int rrc_mac_config_req_gNB(module_id_t Mod_idP,
- int ssb_SubcarrierOffset,
+int rrc_mac_config_req_gNB(module_id_t Mod_idP,
+ int ssb_SubcarrierOffset,
int pdsch_AntennaPorts,
+ int pusch_AntennaPorts,
int pusch_tgt_snrx10,
int pucch_tgt_snrx10,
NR_ServingCellConfigCommon_t *scc,
@@ -365,7 +365,8 @@ int rrc_mac_config_req_gNB(module_id_t Mod_idP,
config_common(Mod_idP,
ssb_SubcarrierOffset,
- pdsch_AntennaPorts,
+ pdsch_AntennaPorts,
+ pusch_AntennaPorts,
scc);
LOG_E(MAC, "%s() %s:%d RC.nrmac[Mod_idP]->if_inst->NR_PHY_config_req:%p\n", __FUNCTION__, __FILE__, __LINE__, RC.nrmac[Mod_idP]->if_inst->NR_PHY_config_req);
diff --git a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler.c b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler.c
index 3c300c5f9d..8bd1e848e1 100644
--- a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler.c
+++ b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler.c
@@ -66,11 +66,15 @@ void dump_mac_stats(gNB_MAC_INST *gNB)
int num = 1;
for (int UE_id = UE_info->list.head; UE_id >= 0; UE_id = UE_info->list.next[UE_id]) {
LOG_I(MAC, "UE ID %d RNTI %04x (%d/%d)\n", UE_id, UE_info->rnti[UE_id], num++, UE_info->num_UEs);
- const NR_mac_stats_t *stats = &UE_info->mac_stats[UE_id];
- LOG_I(MAC, "UE %d: dlsch_rounds %d/%d/%d/%d, dlsch_errors %d\n",
+ NR_mac_stats_t *stats = &UE_info->mac_stats[UE_id];
+ const int avg_rsrp = stats->num_rsrp_meas > 0 ? stats->cumul_rsrp / stats->num_rsrp_meas : 0;
+ LOG_I(MAC, "UE %d: dlsch_rounds %d/%d/%d/%d, dlsch_errors %d, average RSRP %d (%d meas)\n",
UE_id,
stats->dlsch_rounds[0], stats->dlsch_rounds[1],
- stats->dlsch_rounds[2], stats->dlsch_rounds[3], stats->dlsch_errors);
+ stats->dlsch_rounds[2], stats->dlsch_rounds[3], stats->dlsch_errors,
+ avg_rsrp, stats->num_rsrp_meas);
+ stats->num_rsrp_meas = 0;
+ stats->cumul_rsrp = 0 ;
LOG_I(MAC, "UE %d: dlsch_total_bytes %d\n", UE_id, stats->dlsch_total_bytes);
LOG_I(MAC, "UE %d: ulsch_rounds %d/%d/%d/%d, ulsch_errors %d\n",
UE_id,
diff --git a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_RA.c b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_RA.c
index 64867c5be5..82774cd2a6 100644
--- a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_RA.c
+++ b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_RA.c
@@ -961,7 +961,7 @@ void nr_generate_Msg2(module_id_t module_idP, int CC_id, frame_t frameP, sub_fra
pdsch_pdu_rel15->nrOfLayers = 1;
pdsch_pdu_rel15->transmissionScheme = 0;
pdsch_pdu_rel15->refPoint = 0;
- pdsch_pdu_rel15->dmrsConfigType = 0;
+ pdsch_pdu_rel15->dmrsConfigType = 0;//Reconfigure Msg2 to use pdsch_dmrs_type1
pdsch_pdu_rel15->dlDmrsScramblingId = *scc->physCellId;
pdsch_pdu_rel15->SCID = 0;
pdsch_pdu_rel15->numDmrsCdmGrpsNoData = 2;
diff --git a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_primitives.c b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_primitives.c
index 20da8fa30a..94524795f3 100644
--- a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_primitives.c
+++ b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_primitives.c
@@ -646,6 +646,7 @@ void nr_configure_pucch(nfapi_nr_pucch_pdu_t* pucch_pdu,
int res_found = 0;
pucch_pdu->bit_len_harq = O_ack;
+ pucch_pdu->bit_len_csi_part1 = O_csi;
uint16_t O_uci = O_csi + O_ack;
@@ -698,6 +699,8 @@ void nr_configure_pucch(nfapi_nr_pucch_pdu_t* pucch_pdu,
n_set = pucch_Config->resourceSetToAddModList->list.count;
AssertFatal(n_set>0,"PUCCH resourceSetToAddModList is empty\n");
+ LOG_D(MAC, "UCI n_set= %d\n", n_set);
+
N2 = 2;
// procedure to select pucch resource id from resource sets according to
// number of uci bits and pucch resource indicator pucch_resource
@@ -1635,7 +1638,7 @@ int add_new_nr_ue(module_id_t mod_idP, rnti_t rntiP, NR_CellGroupConfig_t *secon
add_nr_list(&UE_info->list, UE_id);
memset(&UE_info->mac_stats[UE_id], 0, sizeof(NR_mac_stats_t));
set_Y(UE_info->Y[UE_id], rntiP);
- compute_csi_bitlen(secondaryCellGroup, UE_info, UE_id);
+ compute_csi_bitlen (secondaryCellGroup->spCellConfig->spCellConfigDedicated->csi_MeasConfig->choice.setup, UE_info, UE_id, mod_idP);
NR_UE_sched_ctrl_t *sched_ctrl = &UE_info->UE_sched_ctrl[UE_id];
memset(sched_ctrl, 0, sizeof(*sched_ctrl));
sched_ctrl->ta_frame = 0;
diff --git a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_uci.c b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_uci.c
index 629b4dc7b0..247a7e2c45 100644
--- a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_uci.c
+++ b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_uci.c
@@ -80,6 +80,42 @@ void nr_fill_nfapi_pucch(module_id_t mod_id,
pucch->sr_flag);
}
+#define MIN_RSRP_VALUE -141
+#define MAX_NUM_SSB 128
+#define MAX_SSB_SCHED 8
+#define L1_RSRP_HYSTERIS 10 //considering 10 dBm as hysterisis for avoiding frequent SSB Beam Switching. !Fixme provide exact value if any
+//#define L1_DIFF_RSRP_STEP_SIZE 2
+
+int ssb_index_sorted[MAX_NUM_SSB] = {0};
+int ssb_rsrp_sorted[MAX_NUM_SSB] = {0};
+
+//Measured RSRP Values Table 10.1.16.1-1 from 36.133
+//Stored all the upper limits[Max RSRP Value of corresponding index]
+//stored -1 for invalid values
+int L1_SSB_CSI_RSRP_measReport_mapping_38133_10_1_6_1_1[128] = {
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, //0 - 9
+ -1, -1, -1, -1, -1, -1, -140, -139, -138, -137, //10 - 19
+ -136, -135, -134, -133, -132, -131, -130, -129, -128, -127, //20 - 29
+ -126, -125, -124, -123, -122, -121, -120, -119, -118, -117, //30 - 39
+ -116, -115, -114, -113, -112, -111, -110, -109, -108, -107, //40 - 49
+ -106, -105, -104, -103, -102, -101, -100, -99, -98, -97, //50 - 59
+ -96, -95, -94, -93, -92, -91, -90, -89, -88, -87, //60 - 69
+ -86, -85, -84, -83, -82, -81, -80, -79, -78, -77, //70 - 79
+ -76, -75, -74, -73, -72, -71, -70, -69, -68, -67, //80 - 89
+ -66, -65, -64, -63, -62, -61, -60, -59, -58, -57, //90 - 99
+ -56, -55, -54, -53, -52, -51, -50, -49, -48, -47, //100 - 109
+ -46, -45, -44, -44, -1, -1, -1, -1, -1, -1, //110 - 119
+ -1, -1, -1, -1, -1, -1, -1, -1//120 - 127
+ };
+
+//Differential RSRP values Table 10.1.6.1-2 from 36.133
+//Stored the upper limits[MAX RSRP Value]
+int diff_rsrp_ssb_csi_meas_10_1_6_1_2[16] = {
+ 0, -2, -4, -6, -8, -10, -12, -14, -16, -18, //0 - 9
+ -20, -22, -24, -26, -28, -30 //10 - 15
+};
+
+
void nr_schedule_pucch(int Mod_idP,
frame_t frameP,
sub_frame_t slotP) {
@@ -106,74 +142,293 @@ void nr_schedule_pucch(int Mod_idP,
}
+//! Calculating number of bits set
+uint8_t number_of_bits_set (uint8_t buf,uint8_t * max_ri){
+ uint8_t nb_of_bits_set = 0;
+ uint8_t mask = 0xff;
+ uint8_t index = 0;
+
+ for (index=7; (buf & mask) && (index>=0) ; index--){
+ if (buf & (1<>=1;
+ }
+ *max_ri = 8-index;
+ return nb_of_bits_set;
+}
+
+
//!TODO : same function can be written to handle csi_resources
-void compute_csi_bitlen (NR_CellGroupConfig_t *secondaryCellGroup, NR_UE_info_t *UE_info, int UE_id) {
+void compute_csi_bitlen(NR_CSI_MeasConfig_t *csi_MeasConfig, NR_UE_info_t *UE_info, int UE_id, module_id_t Mod_idP){
uint8_t csi_report_id = 0;
uint8_t csi_resourceidx =0;
uint8_t csi_ssb_idx =0;
-
- NR_CSI_MeasConfig_t *csi_MeasConfig = secondaryCellGroup->spCellConfig->spCellConfigDedicated->csi_MeasConfig->choice.setup;
+ NR_CSI_ReportConfig__reportQuantity_PR reportQuantity_type;
NR_CSI_ResourceConfigId_t csi_ResourceConfigId;
+
for (csi_report_id=0; csi_report_id < csi_MeasConfig->csi_ReportConfigToAddModList->list.count; csi_report_id++){
- csi_ResourceConfigId=csi_MeasConfig->csi_ReportConfigToAddModList->list.array[csi_report_id]->resourcesForChannelMeasurement;
- UE_info->csi_report_template[UE_id][csi_report_id].reportQuantity_type = csi_MeasConfig->csi_ReportConfigToAddModList->list.array[csi_report_id]->reportQuantity.present;
+ struct NR_CSI_ReportConfig *csi_reportconfig = csi_MeasConfig->csi_ReportConfigToAddModList->list.array[csi_report_id];
+ nr_csi_report_t *csi_report = &UE_info->csi_report_template[UE_id][csi_report_id];
+ csi_ResourceConfigId=csi_reportconfig->resourcesForChannelMeasurement;
+ reportQuantity_type = csi_reportconfig->reportQuantity.present;
+ csi_report->reportQuantity_type = reportQuantity_type;
for ( csi_resourceidx = 0; csi_resourceidx < csi_MeasConfig->csi_ResourceConfigToAddModList->list.count; csi_resourceidx++) {
- if ( csi_MeasConfig->csi_ResourceConfigToAddModList->list.array[csi_resourceidx]->csi_ResourceConfigId != csi_ResourceConfigId)
- continue;
+ struct NR_CSI_ResourceConfig *csi_resourceconfig = csi_MeasConfig->csi_ResourceConfigToAddModList->list.array[csi_resourceidx];
+ if ( csi_resourceconfig->csi_ResourceConfigId != csi_ResourceConfigId)
+ continue;
else {
- //Finding the CSI_RS or SSB Resources
- UE_info->csi_report_template[UE_id][csi_report_id].CSI_Resource_type= csi_MeasConfig->csi_ResourceConfigToAddModList->list.array[csi_resourceidx]->csi_RS_ResourceSetList.present;
- if (NR_CSI_ResourceConfig__csi_RS_ResourceSetList_PR_nzp_CSI_RS_SSB ==UE_info->csi_report_template[UE_id][csi_report_id].CSI_Resource_type){
- struct NR_CSI_ResourceConfig__csi_RS_ResourceSetList__nzp_CSI_RS_SSB * nzp_CSI_RS_SSB = csi_MeasConfig->csi_ResourceConfigToAddModList->list.array[csi_resourceidx]->csi_RS_ResourceSetList.choice.nzp_CSI_RS_SSB;
+ uint8_t nb_ssb_resources =0;
+ //Finding the CSI_RS or SSB Resources
+ if (NR_CSI_ReportConfig__reportQuantity_PR_cri_RSRP == reportQuantity_type ||
+ NR_CSI_ReportConfig__reportQuantity_PR_ssb_Index_RSRP == reportQuantity_type) {
- UE_info->csi_report_template[UE_id][csi_report_id].nb_of_nzp_csi_report = nzp_CSI_RS_SSB->nzp_CSI_RS_ResourceSetList!=NULL ? nzp_CSI_RS_SSB->nzp_CSI_RS_ResourceSetList->list.count:0;
- UE_info->csi_report_template[UE_id][csi_report_id].nb_of_csi_ssb_report = nzp_CSI_RS_SSB->csi_SSB_ResourceSetList!=NULL ? nzp_CSI_RS_SSB->csi_SSB_ResourceSetList->list.count:0;
+ if (NR_CSI_ReportConfig__groupBasedBeamReporting_PR_disabled == csi_reportconfig->groupBasedBeamReporting.present) {
+ if (NULL != csi_reportconfig->groupBasedBeamReporting.choice.disabled->nrofReportedRS)
+ csi_report->CSI_report_bitlen.nb_ssbri_cri = *(csi_reportconfig->groupBasedBeamReporting.choice.disabled->nrofReportedRS)+1;
+ else
+ /*! From Spec 38.331
+ * nrofReportedRS
+ * The number (N) of measured RS resources to be reported per report setting in a non-group-based report. N <= N_max, where N_max is either 2 or 4 depending on UE
+ * capability. FFS: The signaling mechanism for the gNB to select a subset of N beams for the UE to measure and report.
+ * When the field is absent the UE applies the value 1
+ */
+ csi_report->CSI_report_bitlen.nb_ssbri_cri= 1;
+ }else
+ csi_report->CSI_report_bitlen.nb_ssbri_cri= 2;
+
+ if (NR_CSI_ReportConfig__reportQuantity_PR_ssb_Index_RSRP == csi_report->reportQuantity_type) {
+ for ( csi_ssb_idx = 0; csi_ssb_idx < csi_MeasConfig->csi_SSB_ResourceSetToAddModList->list.count; csi_ssb_idx++) {
+ if (csi_MeasConfig->csi_SSB_ResourceSetToAddModList->list.array[csi_ssb_idx]->csi_SSB_ResourceSetId ==
+ *(csi_resourceconfig->csi_RS_ResourceSetList.choice.nzp_CSI_RS_SSB->csi_SSB_ResourceSetList->list.array[0])){
+
+ ///We can configure only one SSB resource set from spec 38.331 IE CSI-ResourceConfig
+ nb_ssb_resources= csi_MeasConfig->csi_SSB_ResourceSetToAddModList->list.array[csi_ssb_idx]->csi_SSB_ResourceList.list.count;
+ csi_report->SSB_Index_list = csi_MeasConfig->csi_SSB_ResourceSetToAddModList->list.array[csi_ssb_idx]->csi_SSB_ResourceList.list.array;
+ csi_report->CSI_Index_list = NULL;
+ break;
+ }
+ }
+ } else /*if (NR_CSI_ReportConfig__reportQuantity_PR_cri_RSRP == UE_info->csi_report_template[UE_id][csi_report_id].reportQuantity_type)*/{
+ for ( csi_ssb_idx = 0; csi_ssb_idx < csi_MeasConfig->nzp_CSI_RS_ResourceSetToAddModList->list.count; csi_ssb_idx++) {
+ if (csi_MeasConfig->nzp_CSI_RS_ResourceSetToAddModList->list.array[csi_ssb_idx]->nzp_CSI_ResourceSetId ==
+ *(csi_resourceconfig->csi_RS_ResourceSetList.choice.nzp_CSI_RS_SSB->nzp_CSI_RS_ResourceSetList->list.array[0])) {
+
+ ///For periodic and semi-persistent CSI Resource Settings, the number of CSI-RS Resource Sets configured is limited to S=1 for spec 38.212
+ nb_ssb_resources= csi_MeasConfig->nzp_CSI_RS_ResourceSetToAddModList->list.array[csi_ssb_idx]->nzp_CSI_RS_Resources.list.count;
+ csi_report->CSI_Index_list = csi_MeasConfig->nzp_CSI_RS_ResourceSetToAddModList->list.array[csi_ssb_idx]->nzp_CSI_RS_Resources.list.array;
+ csi_report->SSB_Index_list = NULL;
+ break;
+ }
+ }
+ }
+
+ if (nb_ssb_resources) {
+ csi_report->CSI_report_bitlen.cri_ssbri_bitlen =ceil(log2 (nb_ssb_resources));
+ csi_report->CSI_report_bitlen.rsrp_bitlen = 7; //From spec 38.212 Table 6.3.1.1.2-6: CRI, SSBRI, and RSRP
+ csi_report->CSI_report_bitlen.diff_rsrp_bitlen =4; //From spec 38.212 Table 6.3.1.1.2-6: CRI, SSBRI, and RSRP
+ } else {
+ csi_report->CSI_report_bitlen.cri_ssbri_bitlen =0;
+ csi_report->CSI_report_bitlen.rsrp_bitlen = 0;
+ csi_report->CSI_report_bitlen.diff_rsrp_bitlen =0;
+ }
+
+ LOG_I (MAC, "UCI: CSI_bit len : ssbri %d, rsrp: %d, diff_rsrp: %d\n",
+ csi_report->CSI_report_bitlen.cri_ssbri_bitlen,
+ csi_report->CSI_report_bitlen.rsrp_bitlen,
+ csi_report->CSI_report_bitlen.diff_rsrp_bitlen);
}
- if (0 != UE_info->csi_report_template[UE_id][csi_report_id].nb_of_csi_ssb_report){
- uint8_t nb_ssb_resources =0;
+ uint8_t ri_restriction;
+ uint8_t ri_bitlen;
+ uint8_t nb_allowed_ri;
+ uint8_t max_ri;
+
+ if (NR_CSI_ReportConfig__reportQuantity_PR_cri_RI_PMI_CQI == reportQuantity_type ||
+ NR_CSI_ReportConfig__reportQuantity_PR_cri_RI_LI_PMI_CQI==reportQuantity_type ||
+ NR_CSI_ReportConfig__reportQuantity_PR_cri_RI_CQI==reportQuantity_type ||
+ NR_CSI_ReportConfig__reportQuantity_PR_cri_RI_i1_CQI==reportQuantity_type||
+ NR_CSI_ReportConfig__reportQuantity_PR_cri_RI_i1==reportQuantity_type){
+
for ( csi_ssb_idx = 0; csi_ssb_idx < csi_MeasConfig->csi_SSB_ResourceSetToAddModList->list.count; csi_ssb_idx++) {
- if (csi_MeasConfig->csi_SSB_ResourceSetToAddModList->list.array[csi_ssb_idx]->csi_SSB_ResourceSetId ==
- *(csi_MeasConfig->csi_ResourceConfigToAddModList->list.array[csi_resourceidx]->csi_RS_ResourceSetList.choice.nzp_CSI_RS_SSB->csi_SSB_ResourceSetList->list.array[0])) {
- ///We can configure only one SSB resource set from spec 38.331 IE CSI-ResourceConfig
- if (NR_CSI_ReportConfig__groupBasedBeamReporting_PR_disabled ==
- csi_MeasConfig->csi_ReportConfigToAddModList->list.array[csi_report_id]->groupBasedBeamReporting.present ) {
- if (NULL != csi_MeasConfig->csi_ReportConfigToAddModList->list.array[csi_report_id]->groupBasedBeamReporting.choice.disabled->nrofReportedRS)
- UE_info->csi_report_template[UE_id][csi_report_id].CSI_report_bitlen[0].nb_ssbri_cri = *(csi_MeasConfig->csi_ReportConfigToAddModList->list.array[csi_report_id]->groupBasedBeamReporting.choice.disabled->nrofReportedRS)+1;
- else
- /*! From Spec 38.331
- * nrofReportedRS
- * The number (N) of measured RS resources to be reported per report setting in a non-group-based report. N <= N_max, where N_max is either 2 or 4 depending on UE
- * capability. FFS: The signaling mechanism for the gNB to select a subset of N beams for the UE to measure and report.
- * When the field is absent the UE applies the value 1
- */
- UE_info->csi_report_template[UE_id][csi_report_id].CSI_report_bitlen[0].nb_ssbri_cri= 1;
- } else
- UE_info->csi_report_template[UE_id][csi_report_id].CSI_report_bitlen[0].nb_ssbri_cri= 2;
+ if (csi_MeasConfig->nzp_CSI_RS_ResourceSetToAddModList->list.array[csi_ssb_idx]->nzp_CSI_ResourceSetId ==
+ *(csi_resourceconfig->csi_RS_ResourceSetList.choice.nzp_CSI_RS_SSB->nzp_CSI_RS_ResourceSetList->list.array[0])) {
+ ///For periodic and semi-persistent CSI Resource Settings, the number of CSI-RS Resource Sets configured is limited to S=1 for spec 38.212
+ nb_ssb_resources= csi_MeasConfig->nzp_CSI_RS_ResourceSetToAddModList->list.array[csi_ssb_idx]->nzp_CSI_RS_Resources.list.count;
+ csi_report->CSI_Index_list = csi_MeasConfig->nzp_CSI_RS_ResourceSetToAddModList->list.array[csi_ssb_idx]->nzp_CSI_RS_Resources.list.array;
+ csi_report->SSB_Index_list = NULL;
+ }
+ break;
+ }
+ csi_report->csi_meas_bitlen.cri_bitlen=ceil(log2 (nb_ssb_resources));
- nb_ssb_resources= csi_MeasConfig->csi_SSB_ResourceSetToAddModList->list.array[csi_ssb_idx]->csi_SSB_ResourceList.list.count;
- if (nb_ssb_resources){
- UE_info->csi_report_template[UE_id][csi_report_id].CSI_report_bitlen[0].cri_ssbri_bitlen =ceil(log2 (nb_ssb_resources));
- UE_info->csi_report_template[UE_id][csi_report_id].CSI_report_bitlen[0].rsrp_bitlen = 7; //From spec 38.212 Table 6.3.1.1.2-6: CRI, SSBRI, and RSRP
- UE_info->csi_report_template[UE_id][csi_report_id].CSI_report_bitlen[0].diff_rsrp_bitlen =4; //From spec 38.212 Table 6.3.1.1.2-6: CRI, SSBRI, and RSRP
- }
- else{
- UE_info->csi_report_template[UE_id][csi_report_id].CSI_report_bitlen[0].cri_ssbri_bitlen =0;
- UE_info->csi_report_template[UE_id][csi_report_id].CSI_report_bitlen[0].rsrp_bitlen = 0;
- UE_info->csi_report_template[UE_id][csi_report_id].CSI_report_bitlen[0].diff_rsrp_bitlen =0;
- }
+ if (NR_CodebookConfig__codebookType__type1__subType_PR_typeI_SinglePanel==csi_reportconfig->codebookConfig->codebookType.choice.type1->subType.present){
- LOG_I (MAC, "UCI: CSI_bit len : ssbri %d, rsrp: %d, diff_rsrp: %d\n",
- UE_info->csi_report_template[UE_id][csi_report_id].CSI_report_bitlen[0].cri_ssbri_bitlen,
- UE_info->csi_report_template[UE_id][csi_report_id].CSI_report_bitlen[0].rsrp_bitlen,
- UE_info->csi_report_template[UE_id][csi_report_id].CSI_report_bitlen[0].diff_rsrp_bitlen);
- break ;
+ switch (RC.nrmac[Mod_idP]->config[0].carrier_config.num_tx_ant.value) {
+ case 1:;
+ csi_report->csi_meas_bitlen.ri_bitlen=0;
+ break;
+ case 2:
+ /* From Spec 38.212
+ * If the higher layer parameter nrofCQIsPerReport=1, nRI in Table 6.3.1.1.2-3 is the number of allowed rank indicator
+ * values in the 4 LSBs of the higher layer parameter typeI-SinglePanel-ri-Restriction according to Subclause 5.2.2.2.1 [6,
+ * TS 38.214]; otherwise nRI in Table 6.3.1.1.2-3 is the number of allowed rank indicator values according to Subclause
+ * 5.2.2.2.1 [6, TS 38.214].
+ *
+ * But from Current RRC ASN structures nrofCQIsPerReport is not present. Present a dummy variable is present so using it to
+ * calculate RI for antennas equal or more than two.
+ * */
+ AssertFatal (NULL!=csi_reportconfig->dummy, "nrofCQIsPerReport is not present");
+
+ ri_restriction = csi_reportconfig->codebookConfig->codebookType.choice.type1->subType.choice.typeI_SinglePanel->typeI_SinglePanel_ri_Restriction.buf[0];
+
+ /* Replace dummy with the nrofCQIsPerReport from the CSIreport
+ config when equalent ASN structure present */
+ if (0==*(csi_reportconfig->dummy)){
+ nb_allowed_ri = number_of_bits_set((ri_restriction & 0xf0), &max_ri);
+ ri_bitlen = ceil(log2(nb_allowed_ri));
+ }
+ else{
+ nb_allowed_ri = number_of_bits_set(ri_restriction, &max_ri);
+ ri_bitlen = ceil(log2(nb_allowed_ri));
+ }
+ ri_bitlen = ri_bitlen<1?ri_bitlen:1; //from the spec 38.212 and table 6.3.1.1.2-3: RI, LI, CQI, and CRI of codebookType=typeI-SinglePanel
+ csi_report->csi_meas_bitlen.ri_bitlen=ri_bitlen;
+ break;
+ case 4:
+ AssertFatal (NULL!=csi_reportconfig->dummy, "nrofCQIsPerReport is not present");
+
+ ri_restriction = csi_reportconfig->codebookConfig->codebookType.choice.type1->subType.choice.typeI_SinglePanel->typeI_SinglePanel_ri_Restriction.buf[0];
+
+ /* Replace dummy with the nrofCQIsPerReport from the CSIreport
+ config when equalent ASN structure present */
+ if (0==*(csi_reportconfig->dummy)){
+ nb_allowed_ri = number_of_bits_set((ri_restriction & 0xf0), &max_ri);
+ ri_bitlen = ceil(log2(nb_allowed_ri));
+ }
+ else{
+ nb_allowed_ri = number_of_bits_set(ri_restriction,&max_ri);
+ ri_bitlen = ceil(log2(nb_allowed_ri));
+ }
+ ri_bitlen = ri_bitlen<2?ri_bitlen:2; //from the spec 38.212 and table 6.3.1.1.2-3: RI, LI, CQI, and CRI of codebookType=typeI-SinglePanel
+ csi_report->csi_meas_bitlen.ri_bitlen=ri_bitlen;
+ break;
+ case 6:
+ case 8:
+ AssertFatal (NULL!=csi_reportconfig->dummy, "nrofCQIsPerReport is not present");
+
+ ri_restriction = csi_reportconfig->codebookConfig->codebookType.choice.type1->subType.choice.typeI_SinglePanel->typeI_SinglePanel_ri_Restriction.buf[0];
+
+ /* Replace dummy with the nrofCQIsPerReport from the CSIreport
+ config when equalent ASN structure present */
+ if (0==*(csi_reportconfig->dummy)){
+ nb_allowed_ri = number_of_bits_set((ri_restriction & 0xf0),&max_ri);
+ ri_bitlen = ceil(log2(nb_allowed_ri));
+ }
+ else{
+ nb_allowed_ri = number_of_bits_set(ri_restriction, &max_ri);
+ ri_bitlen = ceil(log2(nb_allowed_ri));
+ }
+ csi_report->csi_meas_bitlen.ri_bitlen=ri_bitlen;
+ break;
+ default:
+ AssertFatal(RC.nrmac[Mod_idP]->config[0].carrier_config.num_tx_ant.value>8,"Number of antennas %d are out of range", RC.nrmac[Mod_idP]->config[0].carrier_config.num_tx_ant.value);
+ }
+ }
+ csi_report->csi_meas_bitlen.li_bitlen=0;
+ csi_report->csi_meas_bitlen.cqi_bitlen=0;
+ csi_report->csi_meas_bitlen.pmi_x1_bitlen=0;
+ csi_report->csi_meas_bitlen.pmi_x2_bitlen=0;
+ }
+
+ if( NR_CSI_ReportConfig__reportQuantity_PR_cri_RI_LI_PMI_CQI==reportQuantity_type ){
+ if (NR_CodebookConfig__codebookType__type1__subType_PR_typeI_SinglePanel==csi_reportconfig->codebookConfig->codebookType.choice.type1->subType.present){
+
+ switch (RC.nrmac[Mod_idP]->config[0].carrier_config.num_tx_ant.value) {
+ case 1:;
+ csi_report->csi_meas_bitlen.li_bitlen=0;
+ break;
+ case 2:
+ case 4:
+ case 6:
+ case 8:
+ /* From Spec 38.212
+ * If the higher layer parameter nrofCQIsPerReport=1, nRI in Table 6.3.1.1.2-3 is the number of allowed rank indicator
+ * values in the 4 LSBs of the higher layer parameter typeI-SinglePanel-ri-Restriction according to Subclause 5.2.2.2.1 [6,
+ * TS 38.214]; otherwise nRI in Table 6.3.1.1.2-3 is the number of allowed rank indicator values according to Subclause
+ * 5.2.2.2.1 [6, TS 38.214].
+ *
+ * But from Current RRC ASN structures nrofCQIsPerReport is not present. Present a dummy variable is present so using it to
+ * calculate RI for antennas equal or more than two.
+ * */
+ //! TODO: The bit length of LI is as follows LI = log2(RI), Need to confirm wheather we should consider maximum RI can be reported from ri_restricted
+ // or we should consider reported RI. If we need to consider reported RI for calculating LI bit length then we need to modify the code.
+ csi_report->csi_meas_bitlen.li_bitlen=ceil(log2(max_ri))<2?ceil(log2(max_ri)):2;
+ break;
+ default:
+ AssertFatal(RC.nrmac[Mod_idP]->config[0].carrier_config.num_tx_ant.value>8,"Number of antennas %d are out of range", RC.nrmac[Mod_idP]->config[0].carrier_config.num_tx_ant.value);
+ }
+ }
+ }
+
+ if (NR_CSI_ReportConfig__reportQuantity_PR_cri_RI_PMI_CQI == reportQuantity_type ||
+ NR_CSI_ReportConfig__reportQuantity_PR_cri_RI_LI_PMI_CQI==reportQuantity_type ||
+ NR_CSI_ReportConfig__reportQuantity_PR_cri_RI_CQI==reportQuantity_type ||
+ NR_CSI_ReportConfig__reportQuantity_PR_cri_RI_i1_CQI==reportQuantity_type){
+
+ switch (RC.nrmac[Mod_idP]->config[0].carrier_config.num_tx_ant.value){
+ case 1:
+ case 2:
+ case 4:
+ case 6:
+ case 8:
+ /* From Spec 38.212
+ * If the higher layer parameter nrofCQIsPerReport=1, nRI in Table 6.3.1.1.2-3 is the number of allowed rank indicator
+ * values in the 4 LSBs of the higher layer parameter typeI-SinglePanel-ri-Restriction according to Subclause 5.2.2.2.1 [6,
+ * TS 38.214]; otherwise nRI in Table 6.3.1.1.2-3 is the number of allowed rank indicator values according to Subclause
+ * 5.2.2.2.1 [6, TS 38.214].
+ *
+ * But from Current RRC ASN structures nrofCQIsPerReport is not present. Present a dummy variable is present so using it to
+ * calculate RI for antennas equal or more than two.
+ * */
+
+ if (max_ri > 4 && max_ri < 8){
+ if (NR_CodebookConfig__codebookType__type1__subType_PR_typeI_SinglePanel==csi_reportconfig->codebookConfig->codebookType.choice.type1->subType.present){
+ if (NR_CSI_ReportConfig__reportFreqConfiguration__cqi_FormatIndicator_widebandCQI==csi_reportconfig->reportFreqConfiguration->cqi_FormatIndicator)
+ csi_report->csi_meas_bitlen.cqi_bitlen = 8;
+ else
+ csi_report->csi_meas_bitlen.cqi_bitlen = 4;
+ }
+ }else{ //This condition will work even for type1-multipanel.
+ if (NR_CSI_ReportConfig__reportFreqConfiguration__cqi_FormatIndicator_widebandCQI==csi_reportconfig->reportFreqConfiguration->cqi_FormatIndicator)
+ csi_report->csi_meas_bitlen.cqi_bitlen = 4;
+ else
+ csi_report->csi_meas_bitlen.cqi_bitlen = 2;
+ }
+ break;
+ default:
+ AssertFatal(RC.nrmac[Mod_idP]->config[0].carrier_config.num_tx_ant.value>8,"Number of antennas %d are out of range", RC.nrmac[Mod_idP]->config[0].carrier_config.num_tx_ant.value);
+ }
+ }
+ if (NR_CSI_ReportConfig__reportQuantity_PR_cri_RI_PMI_CQI == reportQuantity_type ||
+ NR_CSI_ReportConfig__reportQuantity_PR_cri_RI_LI_PMI_CQI==reportQuantity_type){
+ if (NR_CodebookConfig__codebookType__type1__subType_PR_typeI_SinglePanel==csi_reportconfig->codebookConfig->codebookType.choice.type1->subType.present){
+ switch (csi_reportconfig->codebookConfig->codebookType.choice.type1->subType.choice.typeI_SinglePanel->nrOfAntennaPorts.present){
+ case NR_CodebookConfig__codebookType__type1__subType__typeI_SinglePanel__nrOfAntennaPorts_PR_two:
+ if (max_ri ==1)
+ csi_report->csi_meas_bitlen.pmi_x1_bitlen = 2;
+ else if (max_ri ==2)
+ csi_report->csi_meas_bitlen.pmi_x1_bitlen = 1;
+ break;
+ default:
+ AssertFatal(csi_reportconfig->codebookConfig->codebookType.choice.type1->subType.choice.typeI_SinglePanel->nrOfAntennaPorts.present!=
+ NR_CodebookConfig__codebookType__type1__subType__typeI_SinglePanel__nrOfAntennaPorts_PR_two,
+ "Not handled Yet %d", csi_reportconfig->codebookConfig->codebookType.choice.type1->subType.choice.typeI_SinglePanel->nrOfAntennaPorts.present);
+ break;
}
}
}
- if (0 != UE_info->csi_report_template[UE_id][csi_report_id].nb_of_nzp_csi_report)
- AssertFatal(1==0,"Currently configuring only SSB beamreporting.");
break;
}
}
@@ -181,12 +436,27 @@ void compute_csi_bitlen (NR_CellGroupConfig_t *secondaryCellGroup, NR_UE_info_t
}
-uint16_t nr_get_csi_bitlen(const nr_csi_report_t *csi_report)
-{
- const CRI_SSBRI_RSRP_bitlen_t *bitlen = &csi_report->CSI_report_bitlen[0];
- return bitlen->cri_ssbri_bitlen * bitlen->nb_ssbri_cri
- + bitlen->rsrp_bitlen
- + bitlen->diff_rsrp_bitlen * (bitlen->nb_ssbri_cri - 1) * csi_report->nb_of_csi_ssb_report;
+uint16_t nr_get_csi_bitlen(int Mod_idP,
+ int UE_id,
+ uint8_t csi_report_id) {
+
+ uint16_t csi_bitlen =0;
+ NR_UE_info_t *UE_info = &RC.nrmac[Mod_idP]->UE_info;
+ L1_RSRP_bitlen_t * CSI_report_bitlen = NULL;
+ CSI_Meas_bitlen_t * csi_meas_bitlen = NULL;
+
+ if (NR_CSI_ReportConfig__reportQuantity_PR_ssb_Index_RSRP==UE_info->csi_report_template[UE_id][csi_report_id].reportQuantity_type||
+ NR_CSI_ReportConfig__reportQuantity_PR_cri_RSRP==UE_info->csi_report_template[UE_id][csi_report_id].reportQuantity_type){
+ CSI_report_bitlen = &(UE_info->csi_report_template[UE_id][csi_report_id].CSI_report_bitlen); //This might need to be moodif for Aperiodic CSI-RS measurements
+ csi_bitlen+= ((CSI_report_bitlen->cri_ssbri_bitlen * CSI_report_bitlen->nb_ssbri_cri) +
+ CSI_report_bitlen->rsrp_bitlen +(CSI_report_bitlen->diff_rsrp_bitlen *
+ (CSI_report_bitlen->nb_ssbri_cri -1 )));
+ } else{
+ csi_meas_bitlen = &(UE_info->csi_report_template[UE_id][csi_report_id].csi_meas_bitlen); //This might need to be moodif for Aperiodic CSI-RS measurements
+ csi_bitlen+= (csi_meas_bitlen->cri_bitlen +csi_meas_bitlen->ri_bitlen+csi_meas_bitlen->li_bitlen+csi_meas_bitlen->cqi_bitlen+csi_meas_bitlen->pmi_x1_bitlen+csi_meas_bitlen->pmi_x2_bitlen);
+ }
+
+ return csi_bitlen;
}
@@ -244,7 +514,7 @@ void nr_csi_meas_reporting(int Mod_idP,
curr_pucch->ul_slot = sched_slot;
curr_pucch->resource_indicator = res_index;
curr_pucch->csi_bits +=
- nr_get_csi_bitlen(&UE_info->csi_report_template[UE_id][csi_report_id]);
+ nr_get_csi_bitlen(Mod_idP,UE_id,csi_report_id);
// going through the list of PUCCH resources to find the one indexed by resource_id
uint16_t *vrb_map_UL = &RC.nrmac[Mod_idP]->common_channels[0].vrb_map_UL[sched_slot * MAX_BWP_SIZE];
@@ -312,6 +582,375 @@ static void handle_dl_harq(module_id_t mod_id,
}
}
+int checkTargetSSBInFirst64TCIStates_pdschConfig(int ssb_index_t, int Mod_idP, int UE_id) {
+ NR_UE_info_t *UE_info = &RC.nrmac[Mod_idP]->UE_info;
+ NR_CellGroupConfig_t *secondaryCellGroup = UE_info->secondaryCellGroup[UE_id] ;
+ int nb_tci_states = secondaryCellGroup->spCellConfig->spCellConfigDedicated->initialDownlinkBWP->pdsch_Config->choice.setup->tci_StatesToAddModList->list.count;
+ NR_TCI_State_t *tci =NULL;
+ int i;
+
+ for(i=0; ispCellConfig->spCellConfigDedicated->initialDownlinkBWP->pdsch_Config->choice.setup->tci_StatesToAddModList->list.array[i];
+
+ if(tci != NULL) {
+ if(tci->qcl_Type1.referenceSignal.present == NR_QCL_Info__referenceSignal_PR_ssb) {
+ if(tci->qcl_Type1.referenceSignal.choice.ssb == ssb_index_t)
+ return tci->tci_StateId; // returned TCI state ID
+ }
+ // if type2 is configured
+ else if(tci->qcl_Type2 != NULL && tci->qcl_Type2->referenceSignal.present == NR_QCL_Info__referenceSignal_PR_ssb) {
+ if(tci->qcl_Type2->referenceSignal.choice.ssb == ssb_index_t)
+ return tci->tci_StateId; // returned TCI state ID
+ } else LOG_I(MAC,"SSB index is not found in first 64 TCI states of TCI_statestoAddModList[%d]", i);
+ }
+ }
+
+ // tci state not identified in first 64 TCI States of PDSCH Config
+ return -1;
+}
+
+int checkTargetSSBInTCIStates_pdcchConfig(int ssb_index_t, int Mod_idP, int UE_id) {
+ NR_UE_info_t *UE_info = &RC.nrmac[Mod_idP]->UE_info;
+ NR_CellGroupConfig_t *secondaryCellGroup = UE_info->secondaryCellGroup[UE_id] ;
+ int nb_tci_states = secondaryCellGroup->spCellConfig->spCellConfigDedicated->initialDownlinkBWP->pdsch_Config->choice.setup->tci_StatesToAddModList->list.count;
+ NR_TCI_State_t *tci =NULL;
+ NR_TCI_StateId_t *tci_id = NULL;
+ int bwp_id = 1;
+ NR_BWP_Downlink_t *bwp = secondaryCellGroup->spCellConfig->spCellConfigDedicated->downlinkBWP_ToAddModList->list.array[bwp_id-1];
+ NR_ControlResourceSet_t *coreset = bwp->bwp_Dedicated->pdcch_Config->choice.setup->controlResourceSetToAddModList->list.array[bwp_id-1];
+ int i;
+ int flag = 0;
+ int tci_stateID = -1;
+
+ for(i=0; ispCellConfig->spCellConfigDedicated->initialDownlinkBWP->pdsch_Config->choice.setup->tci_StatesToAddModList->list.array[i];
+
+ if(tci != NULL && tci->qcl_Type1.referenceSignal.present == NR_QCL_Info__referenceSignal_PR_ssb) {
+ if(tci->qcl_Type1.referenceSignal.choice.ssb == ssb_index_t) {
+ flag = 1;
+ tci_stateID = tci->tci_StateId;
+ break;
+ } else if(tci->qcl_Type2 != NULL && tci->qcl_Type2->referenceSignal.present == NR_QCL_Info__referenceSignal_PR_ssb) {
+ flag = 1;
+ tci_stateID = tci->tci_StateId;
+ break;
+ }
+ }
+
+ if(flag != 0 && tci_stateID != -1 && coreset != NULL) {
+ for(i=0; i<64 && itci_StatesPDCCH_ToAddList->list.count; i++) {
+ tci_id = coreset->tci_StatesPDCCH_ToAddList->list.array[i];
+
+ if(tci_id != NULL && *tci_id == tci_stateID)
+ return tci_stateID;
+ }
+ }
+ }
+
+ // Need to implement once configuration is received
+ return -1;
+}
+
+//returns the measured RSRP value (upper limit)
+int get_measured_rsrp(uint8_t index) {
+ //if index is invalid returning minimum rsrp -140
+ if((index >= 0 && index <= 15) || index >= 114)
+ return MIN_RSRP_VALUE;
+
+ return L1_SSB_CSI_RSRP_measReport_mapping_38133_10_1_6_1_1[index];
+}
+
+//returns the differential RSRP value (upper limit)
+int get_diff_rsrp(uint8_t index, int strongest_rsrp) {
+ if(strongest_rsrp != -1) {
+ return strongest_rsrp + diff_rsrp_ssb_csi_meas_10_1_6_1_2[index];
+ } else
+ return MIN_RSRP_VALUE;
+}
+
+//identifies the target SSB Beam index
+//keeps the required date for PDCCH and PDSCH TCI state activation/deactivation CE consutruction globally
+//handles triggering of PDCCH and PDSCH MAC CEs
+void tci_handling(module_id_t Mod_idP, int UE_id, frame_t frame, slot_t slot) {
+
+ int strongest_ssb_rsrp = 0;
+ int cqi_idx = 0;
+ int curr_ssb_beam_index = 0; //ToDo: yet to know how to identify the serving ssb beam index
+ uint8_t target_ssb_beam_index = curr_ssb_beam_index;
+ uint8_t is_triggering_ssb_beam_switch =0;
+ uint8_t ssb_idx = 0;
+ int pdsch_bwp_id =0;
+ int ssb_index[MAX_NUM_SSB] = {0};
+ int ssb_rsrp[MAX_NUM_SSB] = {0};
+ uint8_t idx = 0;
+ int bwp_id = 1;
+ NR_UE_info_t *UE_info = &RC.nrmac[Mod_idP]->UE_info;
+ NR_CellGroupConfig_t *secondaryCellGroup = UE_info->secondaryCellGroup[UE_id];
+ NR_BWP_Downlink_t *bwp = secondaryCellGroup->spCellConfig->spCellConfigDedicated->downlinkBWP_ToAddModList->list.array[bwp_id-1];
+ //bwp indicator
+ int n_dl_bwp = secondaryCellGroup->spCellConfig->spCellConfigDedicated->downlinkBWP_ToAddModList->list.count;
+ uint8_t nr_ssbri_cri = 0;
+ uint8_t nb_of_csi_ssb_report = UE_info->csi_report_template[UE_id][cqi_idx].nb_of_csi_ssb_report;
+ int better_rsrp_reported = -140-(-0); /*minimum_measured_RSRP_value - minimum_differntail_RSRP_value*///considering the minimum RSRP value as better RSRP initially
+ uint8_t diff_rsrp_idx = 0;
+ uint8_t i, j;
+ NR_UE_sched_ctrl_t *sched_ctrl = &UE_info->UE_sched_ctrl[UE_id];
+ NR_mac_stats_t *stats = &UE_info->mac_stats[UE_id];
+
+ if (n_dl_bwp < 4)
+ pdsch_bwp_id = bwp_id;
+ else
+ pdsch_bwp_id = bwp_id - 1; // as per table 7.3.1.1.2-1 in 38.212
+
+ /*Example:
+ CRI_SSBRI: 1 2 3 4| 5 6 7 8| 9 10 1 2|
+ nb_of_csi_ssb_report = 3 //3 sets as above
+ nr_ssbri_cri = 4 //each set has 4 elements
+ storing ssb indexes in ssb_index array as ssb_index[0] = 1 .. ssb_index[4] = 5
+ ssb_rsrp[0] = strongest rsrp in first set, ssb_rsrp[4] = strongest rsrp in second set, ..
+ idx: resource set index
+ */
+
+ //for all reported SSB
+ for (idx = 0; idx < nb_of_csi_ssb_report; idx++) {
+ nr_ssbri_cri = sched_ctrl->CSI_report[idx].choice.ssb_cri_report.nr_ssbri_cri;
+ //extracting the ssb indexes
+ for (ssb_idx = 0; ssb_idx < nr_ssbri_cri; ssb_idx++) {
+ ssb_index[idx * nb_of_csi_ssb_report + ssb_idx] = sched_ctrl->CSI_report[idx].choice.ssb_cri_report.CRI_SSBRI[ssb_idx];
+ }
+
+ //if strongest measured RSRP is configured
+ strongest_ssb_rsrp = get_measured_rsrp(sched_ctrl->CSI_report[idx].choice.ssb_cri_report.RSRP);
+ // including ssb rsrp in mac stats
+ stats->cumul_rsrp += strongest_ssb_rsrp;
+ stats->num_rsrp_meas++;
+ ssb_rsrp[idx * nb_of_csi_ssb_report] = strongest_ssb_rsrp;
+ LOG_D(MAC,"ssb_rsrp = %d\n",strongest_ssb_rsrp);
+
+ //if current ssb rsrp is greater than better rsrp
+ if(ssb_rsrp[idx * nb_of_csi_ssb_report] > better_rsrp_reported) {
+ better_rsrp_reported = ssb_rsrp[idx * nb_of_csi_ssb_report];
+ target_ssb_beam_index = idx * nb_of_csi_ssb_report;
+ }
+
+ for(diff_rsrp_idx =1; diff_rsrp_idx < nr_ssbri_cri; diff_rsrp_idx++) {
+ ssb_rsrp[idx * nb_of_csi_ssb_report + diff_rsrp_idx] = get_diff_rsrp(sched_ctrl->CSI_report[idx].choice.ssb_cri_report.diff_RSRP[diff_rsrp_idx-1], strongest_ssb_rsrp);
+
+ //if current reported rsrp is greater than better rsrp
+ if(ssb_rsrp[idx * nb_of_csi_ssb_report + diff_rsrp_idx] > better_rsrp_reported) {
+ better_rsrp_reported = ssb_rsrp[idx * nb_of_csi_ssb_report + diff_rsrp_idx];
+ target_ssb_beam_index = idx * nb_of_csi_ssb_report + diff_rsrp_idx;
+ }
+ }
+ }
+
+
+ if(ssb_index[target_ssb_beam_index] != ssb_index[curr_ssb_beam_index] && ssb_rsrp[target_ssb_beam_index] > ssb_rsrp[curr_ssb_beam_index]) {
+ if( ssb_rsrp[target_ssb_beam_index] - ssb_rsrp[curr_ssb_beam_index] > L1_RSRP_HYSTERIS) {
+ is_triggering_ssb_beam_switch = 1;
+ LOG_D(MAC, "Triggering ssb beam switching using tci\n");
+ }
+ }
+
+ if(is_triggering_ssb_beam_switch) {
+ //filling pdcch tci state activativation mac ce structure fields
+ sched_ctrl->UE_mac_ce_ctrl.pdcch_state_ind.is_scheduled = 1;
+ //OAI currently focusing on Non CA usecase hence 0 is considered as serving
+ //cell id
+ sched_ctrl->UE_mac_ce_ctrl.pdcch_state_ind.servingCellId = 0; //0 for PCell as 38.331 v15.9.0 page 353 //serving cell id for which this MAC CE applies
+ sched_ctrl->UE_mac_ce_ctrl.pdcch_state_ind.coresetId = 0; //coreset id for which the TCI State id is being indicated
+
+ /* 38.321 v15.8.0 page 66
+ TCI State ID: This field indicates the TCI state identified by TCI-StateId as specified in TS 38.331 [5] applicable
+ to the Control Resource Set identified by CORESET ID field.
+ If the field of CORESET ID is set to 0,
+ this field indicates a TCI-StateId for a TCI state of the first 64 TCI-states configured by tci-States-ToAddModList and tciStates-ToReleaseList in the PDSCH-Config in the active BWP.
+ If the field of CORESET ID is set to the other value than 0,
+ this field indicates a TCI-StateId configured by tci-StatesPDCCH-ToAddList and tciStatesPDCCH-ToReleaseList in the controlResourceSet identified by the indicated CORESET ID.
+ The length of the field is 7 bits
+ */
+ if(sched_ctrl->UE_mac_ce_ctrl.pdcch_state_ind.coresetId == 0) {
+ int tci_state_id = checkTargetSSBInFirst64TCIStates_pdschConfig(ssb_index[target_ssb_beam_index], Mod_idP, UE_id);
+
+ if( tci_state_id != -1)
+ sched_ctrl->UE_mac_ce_ctrl.pdcch_state_ind.tciStateId = tci_state_id;
+ else {
+ //identify the best beam within first 64 TCI States of PDSCH
+ //Config TCI-states-to-addModList
+ int flag = 0;
+
+ for(i =0; ssb_index_sorted[i]!=0; i++) {
+ tci_state_id = checkTargetSSBInFirst64TCIStates_pdschConfig(ssb_index_sorted[i], Mod_idP, UE_id) ;
+
+ if(tci_state_id != -1 && ssb_rsrp_sorted[i] > ssb_rsrp[curr_ssb_beam_index] && ssb_rsrp_sorted[i] - ssb_rsrp[curr_ssb_beam_index] > L1_RSRP_HYSTERIS) {
+ sched_ctrl->UE_mac_ce_ctrl.pdcch_state_ind.tciStateId = tci_state_id;
+ flag = 1;
+ break;
+ }
+ }
+
+ if(flag == 0 || ssb_rsrp_sorted[i] < ssb_rsrp[curr_ssb_beam_index] || ssb_rsrp_sorted[i] - ssb_rsrp[curr_ssb_beam_index] < L1_RSRP_HYSTERIS) {
+ sched_ctrl->UE_mac_ce_ctrl.pdcch_state_ind.is_scheduled = 0;
+ }
+ }
+ } else {
+ int tci_state_id = checkTargetSSBInTCIStates_pdcchConfig(ssb_index[target_ssb_beam_index], Mod_idP, UE_id);
+
+ if (tci_state_id !=-1)
+ sched_ctrl->UE_mac_ce_ctrl.pdcch_state_ind.tciStateId = tci_state_id;
+ else {
+ //identify the best beam within CORESET/PDCCH
+ ////Config TCI-states-to-addModList
+ int flag = 0;
+
+ for(i =0; ssb_index_sorted[i]!=0; i++) {
+ tci_state_id = checkTargetSSBInTCIStates_pdcchConfig(ssb_index_sorted[i], Mod_idP, UE_id);
+
+ if( tci_state_id != -1 && ssb_rsrp_sorted[i] > ssb_rsrp[curr_ssb_beam_index] && ssb_rsrp_sorted[i] - ssb_rsrp[curr_ssb_beam_index] > L1_RSRP_HYSTERIS) {
+ sched_ctrl->UE_mac_ce_ctrl.pdcch_state_ind.tciStateId = tci_state_id;
+ flag = 1;
+ break;
+ }
+ }
+
+ if(flag == 0 || ssb_rsrp_sorted[i] < ssb_rsrp[curr_ssb_beam_index] || ssb_rsrp_sorted[i] - ssb_rsrp[curr_ssb_beam_index] < L1_RSRP_HYSTERIS) {
+ sched_ctrl->UE_mac_ce_ctrl.pdcch_state_ind.is_scheduled = 0;
+ }
+ }
+ }
+
+ sched_ctrl->UE_mac_ce_ctrl.pdcch_state_ind.tci_present_inDCI = bwp->bwp_Dedicated->pdcch_Config->choice.setup->controlResourceSetToAddModList->list.array[bwp_id-1]->tci_PresentInDCI;
+
+ //filling pdsch tci state activation deactivation mac ce structure fields
+ if(sched_ctrl->UE_mac_ce_ctrl.pdcch_state_ind.tci_present_inDCI) {
+ sched_ctrl->UE_mac_ce_ctrl.pdsch_TCI_States_ActDeact.is_scheduled = 1;
+ /*
+ Serving Cell ID: This field indicates the identity of the Serving Cell for which the MAC CE applies
+ Considering only PCell exists. Serving cell index of PCell is always 0, hence configuring 0
+ */
+ sched_ctrl->UE_mac_ce_ctrl.pdsch_TCI_States_ActDeact.servingCellId = 0;
+ /*
+ BWP ID: This field indicates a DL BWP for which the MAC CE applies as the codepoint of the DCI bandwidth
+ part indicator field as specified in TS 38.212
+ */
+ sched_ctrl->UE_mac_ce_ctrl.pdsch_TCI_States_ActDeact.bwpId = pdsch_bwp_id;
+
+ /*
+ * TODO ssb_rsrp_sort() API yet to code to find 8 best beams, rrc configuration
+ * is required
+ */
+ for(i = 0; i<8; i++) {
+ sched_ctrl->UE_mac_ce_ctrl.pdsch_TCI_States_ActDeact.tciStateActDeact[i] = i;
+ }
+
+ sched_ctrl->UE_mac_ce_ctrl.pdsch_TCI_States_ActDeact.highestTciStateActivated = 8;
+
+ for(i = 0, j =0; iUE_mac_ce_ctrl.pdsch_TCI_States_ActDeact.tciStateActDeact[i]) {
+ sched_ctrl->UE_mac_ce_ctrl.pdsch_TCI_States_ActDeact.codepoint[j] = i;
+ j++;
+ }
+ }
+ }//tci_presentInDCI
+ }//is-triggering_beam_switch
+}//tci handling
+
+void reverse_n_bits(uint8_t *value, uint16_t bitlen) {
+ uint16_t j;
+ uint8_t i;
+ for(j = bitlen - 1,i = 0; j > i; j--, i++) {
+ if(((*value>>j)&1) != ((*value>>i)&1)) {
+ *value ^= (1<csi_part1.csi_part1_bit_len)/8);
+ uint8_t *payload = uci_pdu->csi_part1.csi_part1_payload;
+ NR_CSI_ReportConfig__reportQuantity_PR reportQuantity_type = NR_CSI_ReportConfig__reportQuantity_PR_NOTHING;
+ NR_UE_info_t *UE_info = &(RC.nrmac[Mod_idP]->UE_info);
+ NR_UE_sched_ctrl_t *sched_ctrl = &UE_info->UE_sched_ctrl[UE_id];
+ uint8_t csi_report_id = 0;
+
+ UE_info->csi_report_template[UE_id][csi_report_id].nb_of_csi_ssb_report = 0;
+ for ( csi_report_id =0; csi_report_id < csi_MeasConfig->csi_ReportConfigToAddModList->list.count; csi_report_id++ ) {
+ //Has to implement according to reportSlotConfig type
+ /*reportQuantity must be considered according to the current scheduled
+ CSI-ReportConfig if multiple CSI-ReportConfigs present*/
+ reportQuantity_type = UE_info->csi_report_template[UE_id][csi_report_id].reportQuantity_type;
+ LOG_D(PHY,"SFN/SF:%d%d reportQuantity type = %d\n",frame,slot,reportQuantity_type);
+
+ if (NR_CSI_ReportConfig__reportQuantity_PR_ssb_Index_RSRP == reportQuantity_type ||
+ NR_CSI_ReportConfig__reportQuantity_PR_cri_RSRP == reportQuantity_type) {
+ uint8_t csi_ssb_idx = 0;
+ uint8_t diff_rsrp_idx = 0;
+ uint8_t cri_ssbri_bitlen = UE_info->csi_report_template[UE_id][csi_report_id].CSI_report_bitlen.cri_ssbri_bitlen;
+
+ /*! As per the spec 38.212 and table: 6.3.1.1.2-12 in a single UCI sequence we can have multiple CSI_report
+ * the number of CSI_report will depend on number of CSI resource sets that are configured in CSI-ResourceConfig RRC IE
+ * From spec 38.331 from the IE CSI-ResourceConfig for SSB RSRP reporting we can configure only one resource set
+ * From spec 38.214 section 5.2.1.2 For periodic and semi-persistent CSI Resource Settings, the number of CSI-RS Resource Sets configured is limited to S=1
+ */
+
+ /** from 38.214 sec 5.2.1.4.2
+ - if the UE is configured with the higher layer parameter groupBasedBeamReporting set to 'disabled', the UE is
+ not required to update measurements for more than 64 CSI-RS and/or SSB resources, and the UE shall report in
+ a single report nrofReportedRS (higher layer configured) different CRI or SSBRI for each report setting
+
+ - if the UE is configured with the higher layer parameter groupBasedBeamReporting set to 'enabled', the UE is not
+ required to update measurements for more than 64 CSI-RS and/or SSB resources, and the UE shall report in a
+ single reporting instance two different CRI or SSBRI for each report setting, where CSI-RS and/or SSB
+ resources can be received simultaneously by the UE either with a single spatial domain receive filter, or with
+ multiple simultaneous spatial domain receive filter
+ */
+
+ idx = 0; //Since for SSB RSRP reporting in RRC can configure only one ssb resource set per one report config
+ sched_ctrl->CSI_report[idx].choice.ssb_cri_report.nr_ssbri_cri = UE_info->csi_report_template[UE_id][csi_report_id].CSI_report_bitlen.nb_ssbri_cri;
+
+ for (csi_ssb_idx = 0; csi_ssb_idx < sched_ctrl->CSI_report[idx].choice.ssb_cri_report.nr_ssbri_cri ; csi_ssb_idx++) {
+ if(cri_ssbri_bitlen > 1)
+ reverse_n_bits(payload, cri_ssbri_bitlen);
+
+ if (NR_CSI_ReportConfig__reportQuantity_PR_ssb_Index_RSRP == reportQuantity_type)
+ sched_ctrl->CSI_report[idx].choice.ssb_cri_report.CRI_SSBRI [csi_ssb_idx] =
+ *(UE_info->csi_report_template[UE_id][csi_report_id].SSB_Index_list[cri_ssbri_bitlen>0?((*payload)&~(~1<<(cri_ssbri_bitlen-1))):cri_ssbri_bitlen]);
+ else
+ sched_ctrl->CSI_report[idx].choice.ssb_cri_report.CRI_SSBRI [csi_ssb_idx] =
+ *(UE_info->csi_report_template[UE_id][csi_report_id].CSI_Index_list[cri_ssbri_bitlen>0?((*payload)&~(~1<<(cri_ssbri_bitlen-1))):cri_ssbri_bitlen]);
+
+ *payload >>= cri_ssbri_bitlen;
+ LOG_D(PHY,"SSB_index = %d\n",sched_ctrl->CSI_report[idx].choice.ssb_cri_report.CRI_SSBRI [csi_ssb_idx]);
+ }
+
+ reverse_n_bits(payload, 7);
+ sched_ctrl->CSI_report[idx].choice.ssb_cri_report.RSRP = (*payload) & 0x7f;
+ *payload >>= 7;
+
+ for ( diff_rsrp_idx =0; diff_rsrp_idx < sched_ctrl->CSI_report[idx].choice.ssb_cri_report.nr_ssbri_cri - 1; diff_rsrp_idx++ ) {
+ reverse_n_bits(payload,4);
+ sched_ctrl->CSI_report[idx].choice.ssb_cri_report.diff_RSRP[diff_rsrp_idx] = (*payload) & 0x0f;
+ *payload >>= 4;
+ }
+ UE_info->csi_report_template[UE_id][csi_report_id].nb_of_csi_ssb_report++;
+ LOG_D(MAC,"csi_payload size = %d, rsrp_id = %d\n",payload_size, sched_ctrl->CSI_report[idx].choice.ssb_cri_report.RSRP);
+ }
+ }
+
+ if ( !(reportQuantity_type))
+ AssertFatal(reportQuantity_type, "reportQuantity is not configured");
+
+}
+
void handle_nr_uci_pucch_0_1(module_id_t mod_id,
frame_t frame,
sub_frame_t slot,
@@ -374,6 +1013,7 @@ void handle_nr_uci_pucch_2_3_4(module_id_t mod_id,
LOG_E(MAC, "%s(): unknown RNTI %04x in PUCCH UCI\n", __func__, uci_234->rnti);
return;
}
+ NR_CSI_MeasConfig_t *csi_MeasConfig = RC.nrmac[mod_id]->UE_info.secondaryCellGroup[UE_id]->spCellConfig->spCellConfigDedicated->csi_MeasConfig->choice.setup;
NR_UE_info_t *UE_info = &RC.nrmac[mod_id]->UE_info;
NR_UE_sched_ctrl_t *sched_ctrl = &UE_info->UE_sched_ctrl[UE_id];
@@ -413,6 +1053,15 @@ void handle_nr_uci_pucch_2_3_4(module_id_t mod_id,
handle_dl_harq(mod_id, UE_id, pid, uci_234->harq.harq_crc != 1 && acknack);
}
}
+ if ((uci_234->pduBitmap >> 2) & 0x01) {
+ //API to parse the csi report and store it into sched_ctrl
+ extract_pucch_csi_report (csi_MeasConfig, uci_234, frame, slot, UE_id, mod_id);
+ //TCI handling function
+ tci_handling(mod_id, UE_id,frame, slot);
+ }
+ if ((uci_234->pduBitmap >> 3) & 0x01) {
+ //@TODO:Handle CSI Report 2
+ }
}
@@ -743,5 +1392,4 @@ uint16_t compute_pucch_prb_size(uint8_t format,
else{
AssertFatal(1==0,"Not yet implemented");
}
-
}
diff --git a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_ulsch.c b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_ulsch.c
index 29c782a242..9784b6b79e 100644
--- a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_ulsch.c
+++ b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_ulsch.c
@@ -137,10 +137,10 @@ void nr_process_mac_pdu(
case UL_SCH_LCID_S_BSR:
case UL_SCH_LCID_S_TRUNCATED_BSR:
- //38.321 section 6.1.3.1
- //fixed length
- mac_ce_len =1;
- /* Extract short BSR value */
+ //38.321 section 6.1.3.1
+ //fixed length
+ mac_ce_len =1;
+ /* Extract short BSR value */
ce_ptr = &pdu_ptr[mac_subheader_len];
NR_BSR_SHORT *bsr_s = (NR_BSR_SHORT *) ce_ptr;
sched_ctrl->estimated_ul_buffer = 0;
@@ -182,7 +182,7 @@ void nr_process_mac_pdu(
NR_LONG_BSR_TABLE[pdu_ptr[mac_subheader_len + 1 + n]];
}
- break;
+ break;
case UL_SCH_LCID_C_RNTI:
//38.321 section 6.1.3.2
@@ -1064,18 +1064,16 @@ void nr_schedule_ulsch(module_id_t module_id,
/* PUSCH PTRS */
if (ps->NR_DMRS_UplinkConfig->phaseTrackingRS != NULL) {
- // TODO to be fixed from RRC config
- uint8_t ptrs_mcs1 = 2; // higher layer parameter in PTRS-UplinkConfig
- uint8_t ptrs_mcs2 = 4; // higher layer parameter in PTRS-UplinkConfig
- uint8_t ptrs_mcs3 = 10; // higher layer parameter in PTRS-UplinkConfig
- uint16_t n_rb0 = 25; // higher layer parameter in PTRS-UplinkConfig
- uint16_t n_rb1 = 75; // higher layer parameter in PTRS-UplinkConfig
- pusch_pdu->pusch_ptrs.ptrs_time_density = get_L_ptrs(ptrs_mcs1, ptrs_mcs2, ptrs_mcs3, pusch_pdu->mcs_index, pusch_pdu->mcs_table);
- pusch_pdu->pusch_ptrs.ptrs_freq_density = get_K_ptrs(n_rb0, n_rb1, pusch_pdu->rb_size);
+ bool valid_ptrs_setup = false;
pusch_pdu->pusch_ptrs.ptrs_ports_list = (nfapi_nr_ptrs_ports_t *) malloc(2*sizeof(nfapi_nr_ptrs_ports_t));
- pusch_pdu->pusch_ptrs.ptrs_ports_list[0].ptrs_re_offset = 0;
-
- pusch_pdu->pdu_bit_map |= PUSCH_PDU_BITMAP_PUSCH_PTRS; // enable PUSCH PTRS
+ valid_ptrs_setup = set_ul_ptrs_values(ps->NR_DMRS_UplinkConfig->phaseTrackingRS->choice.setup,
+ pusch_pdu->rb_size, pusch_pdu->mcs_index, pusch_pdu->mcs_table,
+ &pusch_pdu->pusch_ptrs.ptrs_freq_density,&pusch_pdu->pusch_ptrs.ptrs_time_density,
+ &pusch_pdu->pusch_ptrs.ptrs_ports_list->ptrs_re_offset,&pusch_pdu->pusch_ptrs.num_ptrs_ports,
+ &pusch_pdu->pusch_ptrs.ul_ptrs_power, pusch_pdu->nr_of_symbols);
+ if (valid_ptrs_setup==true) {
+ pusch_pdu->pdu_bit_map |= PUSCH_PDU_BITMAP_PUSCH_PTRS; // enable PUSCH PTRS
+ }
}
else{
pusch_pdu->pdu_bit_map &= ~PUSCH_PDU_BITMAP_PUSCH_PTRS; // disable PUSCH PTRS
@@ -1139,4 +1137,4 @@ void nr_schedule_ulsch(module_id_t module_id,
memset(sched_pusch, 0, sizeof(*sched_pusch));
}
-}
\ No newline at end of file
+}
diff --git a/openair2/LAYER2/NR_MAC_gNB/mac_proto.h b/openair2/LAYER2/NR_MAC_gNB/mac_proto.h
index b234ad6578..e09fe56c25 100644
--- a/openair2/LAYER2/NR_MAC_gNB/mac_proto.h
+++ b/openair2/LAYER2/NR_MAC_gNB/mac_proto.h
@@ -43,12 +43,14 @@ void mac_top_init_gNB(void);
void config_common(int Mod_idP,
int ssb_SubcarrierOffset,
int pdsch_AntennaPorts,
+ int pusch_AntennaPorts,
NR_ServingCellConfigCommon_t *scc
);
-int rrc_mac_config_req_gNB(module_id_t Mod_idP,
- int ssb_SubcarrierOffset,
+int rrc_mac_config_req_gNB(module_id_t Mod_idP,
+ int ssb_SubcarrierOffset,
int pdsch_AntennaPorts,
+ int pusch_AntennaPorts,
int pusch_tgt_snrx10,
int pucch_tgt_snrx10,
NR_ServingCellConfigCommon_t *scc,
@@ -331,7 +333,7 @@ uint16_t compute_pucch_prb_size(uint8_t format,
uint8_t n_symb,
uint8_t n_re_ctrl);
-void compute_csi_bitlen (NR_CellGroupConfig_t *secondaryCellGroup, NR_UE_info_t *UE_info, int UE_id);
+void compute_csi_bitlen(NR_CSI_MeasConfig_t *csi_MeasConfig, NR_UE_info_t *UE_info, int UE_id, module_id_t Mod_idP);
int get_dlscs(nfapi_nr_config_request_t *cfg);
diff --git a/openair2/LAYER2/NR_MAC_gNB/nr_mac_gNB.h b/openair2/LAYER2/NR_MAC_gNB/nr_mac_gNB.h
index 7af7793801..5235e74129 100644
--- a/openair2/LAYER2/NR_MAC_gNB/nr_mac_gNB.h
+++ b/openair2/LAYER2/NR_MAC_gNB/nr_mac_gNB.h
@@ -246,8 +246,17 @@ typedef struct pdcchStateInd {
uint8_t servingCellId;
uint8_t coresetId;
uint8_t tciStateId;
+ bool tci_present_inDCI;
} pdcchStateInd_t;
+typedef struct pucchSpatialRelation {
+ bool is_scheduled;
+ uint8_t servingCellId;
+ uint8_t bwpId;
+ uint8_t pucchResourceId;
+ bool s0tos7_actDeact[8];
+} pucchSpatialRelation_t;
+
typedef struct SPCSIReportingpucch {
bool is_scheduled;
uint8_t servingCellId;
@@ -271,12 +280,14 @@ typedef struct pdschTciStatesActDeact {
uint8_t bwpId;
uint8_t highestTciStateActivated;
bool tciStateActDeact[MAX_TCI_STATES];
+ uint8_t codepoint[8];
} pdschTciStatesActDeact_t;
typedef struct UE_info {
sp_zp_csirs_t sp_zp_csi_rs;
csi_rs_im_t csi_im;
pdcchStateInd_t pdcch_state_ind;
+ pucchSpatialRelation_t pucch_spatial_relation;
SPCSIReportingpucch_t SP_CSI_reporting_pucch;
aperiodicCSI_triggerStateSelection_t aperi_CSI_trigger;
pdschTciStatesActDeact_t pdsch_TCI_States_ActDeact;
@@ -352,6 +363,84 @@ typedef struct NR_UE_harq {
uint32_t tb_size;
} NR_UE_harq_t;
+//! fixme : need to enhace for the multiple TB CQI report
+
+
+//
+/*! As per spec 38.214 section 5.2.1.4.2
+ * - if the UE is configured with the higher layer parameter groupBasedBeamReporting set to 'disabled', the UE shall report in
+ a single report nrofReportedRS (higher layer configured) different CRI or SSBRI for each report setting.
+ * - if the UE is configured with the higher layer parameter groupBasedBeamReporting set to 'enabled', the UE shall report in a
+ single reporting instance two different CRI or SSBRI for each report setting, where CSI-RS and/or SSB
+ resources can be received simultaneously by the UE either with a single spatial domain receive filter, or with
+ multiple simultaneous spatial domain receive filter
+*/
+#define MAX_NR_OF_REPORTED_RS 4
+
+typedef enum NR_CSI_Report_Config {
+ CSI_Report_PR_cri_ri_li_pmi_cqi_report,
+ CSI_Report_PR_ssb_cri_report
+} NR_CSI_Report_Config_PR;
+struct CRI_RI_LI_PMI_CQI {
+ uint8_t cri;
+ uint8_t ri;
+ uint8_t li;
+ uint8_t pmi_x1;
+ uint8_t pmi_x2;
+ uint8_t cqi;
+};
+
+typedef struct CRI_SSB_RSRP {
+ uint8_t nr_ssbri_cri;
+ uint8_t CRI_SSBRI[MAX_NR_OF_REPORTED_RS];
+ uint8_t RSRP;
+ uint8_t diff_RSRP[MAX_NR_OF_REPORTED_RS - 1];
+} CRI_SSB_RSRP_t;
+
+struct CSI_Report {
+ NR_CSI_Report_Config_PR present;
+ union Config_CSI_Report {
+ struct CRI_RI_LI_PMI_CQI cri_ri_li_pmi_cqi_report;
+ struct CRI_SSB_RSRP ssb_cri_report;
+ } choice;
+};
+
+#define MAX_SR_BITLEN 8
+
+typedef struct {
+ uint8_t nb_ssbri_cri;
+ uint8_t cri_ssbri_bitlen;
+ uint8_t rsrp_bitlen;
+ uint8_t diff_rsrp_bitlen;
+}L1_RSRP_bitlen_t;
+
+typedef struct{
+ uint8_t cri_bitlen;
+ uint8_t ri_bitlen;
+ uint8_t li_bitlen;
+ uint8_t pmi_x1_bitlen;
+ uint8_t pmi_x2_bitlen;
+ uint8_t cqi_bitlen;
+} CSI_Meas_bitlen_t;
+
+typedef struct nr_csi_report {
+ NR_CSI_ReportConfig__reportQuantity_PR reportQuantity_type;
+ long periodicity;
+ uint16_t offset;
+ long ** SSB_Index_list;
+ long ** CSI_Index_list;
+// uint8_t nb_of_nzp_csi_report;
+ uint8_t nb_of_csi_ssb_report;
+ L1_RSRP_bitlen_t CSI_report_bitlen;
+ CSI_Meas_bitlen_t csi_meas_bitlen;
+} nr_csi_report_t;
+
+/*! As per the spec 38.212 and table: 6.3.1.1.2-12 in a single UCI sequence we can have multiple CSI_report
+ the number of CSI_report will depend on number of CSI resource sets that are configured in CSI-ResourceConfig RRC IE
+ From spec 38.331 from the IE CSI-ResourceConfig for SSB RSRP reporting we can configure only one resource set
+ From spec 38.214 section 5.2.1.2 For periodic and semi-persistent CSI Resource Settings, the number of CSI-RS Resource Sets configured is limited to S=1
+ */
+#define MAX_CSI_RESOURCE_SET_IN_CSI_RESOURCE_CONFIG 16
typedef struct NR_UE_old_sched {
uint16_t rbSize;
int time_domain_allocation;
@@ -376,26 +465,8 @@ typedef struct NR_UE_ul_harq {
NR_sched_pusch_t sched_pusch;
} NR_UE_ul_harq_t;
-
-typedef struct {
- uint8_t nb_ssbri_cri;
- uint8_t cri_ssbri_bitlen;
- uint8_t rsrp_bitlen;
- uint8_t diff_rsrp_bitlen;
-}CRI_SSBRI_RSRP_bitlen_t;
-
-
-#define MAX_CSI_RESOURCE_SET_IN_CSI_RESOURCE_CONFIG 16
-typedef struct nr_csi_report {
- NR_CSI_ReportConfig__reportQuantity_PR reportQuantity_type;
- NR_CSI_ResourceConfig__csi_RS_ResourceSetList_PR CSI_Resource_type;
- uint8_t nb_of_nzp_csi_report;
- uint8_t nb_of_csi_ssb_report;
- CRI_SSBRI_RSRP_bitlen_t CSI_report_bitlen[MAX_CSI_RESOURCE_SET_IN_CSI_RESOURCE_CONFIG];
-} nr_csi_report_t;
-
-
/*! \brief scheduling control information set through an API */
+#define MAX_CSI_REPORTS 48
typedef struct {
/// total amount of data awaiting for this UE
uint32_t num_total_bytes;
@@ -450,6 +521,8 @@ typedef struct {
uint8_t tpc0;
uint8_t tpc1;
uint16_t ul_rssi;
+ uint8_t current_harq_pid;
+ struct CSI_Report CSI_report[MAX_CSI_REPORTS];
/// information about every HARQ process
NR_UE_harq_t harq_processes[NR_MAX_NB_HARQ_PROCESSES];
/// HARQ processes that are free
@@ -487,6 +560,8 @@ typedef struct {
int ulsch_total_bytes_scheduled;
int ulsch_total_bytes_rx;
int ulsch_current_bytes;
+ int cumul_rsrp;
+ uint8_t num_rsrp_meas;
} NR_mac_stats_t;
diff --git a/openair2/LAYER2/nr_pdcp/nr_pdcp_oai_api.c b/openair2/LAYER2/nr_pdcp/nr_pdcp_oai_api.c
index 597cba7bf5..ec48b0adae 100644
--- a/openair2/LAYER2/nr_pdcp/nr_pdcp_oai_api.c
+++ b/openair2/LAYER2/nr_pdcp/nr_pdcp_oai_api.c
@@ -776,7 +776,7 @@ void nr_DRB_preconfiguration(uint16_t crnti)
drb_ToAddMod->pdcp_Config = calloc(1,sizeof(*drb_ToAddMod->pdcp_Config));
drb_ToAddMod->pdcp_Config->drb = calloc(1,sizeof(*drb_ToAddMod->pdcp_Config->drb));
drb_ToAddMod->pdcp_Config->drb->discardTimer = calloc(1,sizeof(*drb_ToAddMod->pdcp_Config->drb->discardTimer));
- *drb_ToAddMod->pdcp_Config->drb->discardTimer=NR_PDCP_Config__drb__discardTimer_ms30;
+ *drb_ToAddMod->pdcp_Config->drb->discardTimer=NR_PDCP_Config__drb__discardTimer_infinity;
drb_ToAddMod->pdcp_Config->drb->pdcp_SN_SizeUL = calloc(1,sizeof(*drb_ToAddMod->pdcp_Config->drb->pdcp_SN_SizeUL));
*drb_ToAddMod->pdcp_Config->drb->pdcp_SN_SizeUL = NR_PDCP_Config__drb__pdcp_SN_SizeUL_len12bits;
drb_ToAddMod->pdcp_Config->drb->pdcp_SN_SizeDL = calloc(1,sizeof(*drb_ToAddMod->pdcp_Config->drb->pdcp_SN_SizeDL));
diff --git a/openair2/NR_PHY_INTERFACE/NR_IF_Module.c b/openair2/NR_PHY_INTERFACE/NR_IF_Module.c
index b183b32aab..5b5f3e6b3c 100644
--- a/openair2/NR_PHY_INTERFACE/NR_IF_Module.c
+++ b/openair2/NR_PHY_INTERFACE/NR_IF_Module.c
@@ -43,7 +43,6 @@
NR_IF_Module_t *if_inst[MAX_IF_MODULES];
NR_Sched_Rsp_t Sched_INFO[MAX_IF_MODULES][MAX_NUM_CCs];
-
extern int oai_nfapi_harq_indication(nfapi_harq_indication_t *harq_ind);
extern int oai_nfapi_crc_indication(nfapi_crc_indication_t *crc_ind);
extern int oai_nfapi_cqi_indication(nfapi_cqi_indication_t *cqi_ind);
@@ -96,6 +95,7 @@ void handle_nr_uci(NR_UL_IND_t *UL_info)
handle_nr_uci_pucch_0_1(mod_id, frame, slot, uci_pdu);
break;
}
+
case NFAPI_NR_UCI_FORMAT_2_3_4_PDU_TYPE: {
const nfapi_nr_uci_pucch_pdu_format_2_3_4_t *uci_pdu = &uci_list[i].pucch_pdu_format_2_3_4;
handle_nr_uci_pucch_2_3_4(mod_id, frame, slot, uci_pdu);
diff --git a/openair2/RRC/LTE/defs_NB_IoT.h b/openair2/RRC/LTE/defs_NB_IoT.h
index 91dc7aafd4..2a34971c23 100644
--- a/openair2/RRC/LTE/defs_NB_IoT.h
+++ b/openair2/RRC/LTE/defs_NB_IoT.h
@@ -148,7 +148,7 @@ typedef struct UE_RRC_INFO_NB_IoT_s {
//Measurement Report not supported in NB-IoT
#define PAYLOAD_SIZE_MAX 1024
-#define RRC_BUF_SIZE 255
+#define RRC_BUF_SIZE 8192
#define UNDEF_SECURITY_MODE 0xff
#define NO_SECURITY_MODE 0x20
diff --git a/openair2/RRC/LTE/rrc_defs.h b/openair2/RRC/LTE/rrc_defs.h
index 4f55f94121..c19335910b 100644
--- a/openair2/RRC/LTE/rrc_defs.h
+++ b/openair2/RRC/LTE/rrc_defs.h
@@ -327,7 +327,7 @@ typedef enum SL_TRIGGER_e {
#define MAX_MEAS_ID 6
#define PAYLOAD_SIZE_MAX 1024
-#define RRC_BUF_SIZE 255
+#define RRC_BUF_SIZE 8192
#define UNDEF_SECURITY_MODE 0xff
#define NO_SECURITY_MODE 0x20
diff --git a/openair2/RRC/NR/nr_rrc_defs.h b/openair2/RRC/NR/nr_rrc_defs.h
index 36d9bdee60..e0b04a6976 100644
--- a/openair2/RRC/NR/nr_rrc_defs.h
+++ b/openair2/RRC/NR/nr_rrc_defs.h
@@ -127,7 +127,7 @@ typedef enum UE_STATE_NR_e {
#define MAX_MEAS_ID 6
#define PAYLOAD_SIZE_MAX 1024
-#define RRC_BUF_SIZE 255
+#define RRC_BUF_SIZE 8192
#define UNDEF_SECURITY_MODE 0xff
#define NO_SECURITY_MODE 0x20
@@ -431,6 +431,7 @@ typedef struct {
NR_BCCH_BCH_Message_t mib;
int ssb_SubcarrierOffset;
int pdsch_AntennaPorts;
+ int pusch_AntennaPorts;
int pusch_TargetSNRx10;
int pucch_TargetSNRx10;
NR_BCCH_DL_SCH_Message_t *siblock1;
diff --git a/openair2/RRC/NR/nr_rrc_proto.h b/openair2/RRC/NR/nr_rrc_proto.h
index 6d876a0eef..5aafbaee4c 100644
--- a/openair2/RRC/NR/nr_rrc_proto.h
+++ b/openair2/RRC/NR/nr_rrc_proto.h
@@ -79,17 +79,19 @@ void fill_default_coresetZero(NR_ControlResourceSet_t *coreset0, NR_ServingCellC
void fill_default_searchSpaceZero(NR_SearchSpace_t *ss0);
void fill_default_secondaryCellGroup(NR_ServingCellConfigCommon_t *servingcellconfigcommon,
- NR_CellGroupConfig_t *secondaryCellGroup,
- int scg_id,
- int servCellIndex,
- int n_physical_antenna_ports,
- int initial_csi_index);
+ NR_ServingCellConfig_t *servingcellconfigdedicated,
+ NR_CellGroupConfig_t *secondaryCellGroup,
+ int scg_id,
+ int servCellIndex,
+ int n_physical_antenna_ports,
+ int initial_csi_index);
void fill_default_reconfig(NR_ServingCellConfigCommon_t *servingcellconfigcommon,
- NR_RRCReconfiguration_IEs_t *reconfig,
- NR_CellGroupConfig_t *secondaryCellGroup,
- int n_physical_antenna_ports,
- int initial_csi_index);
+ NR_ServingCellConfig_t *servingcellconfigdedicated,
+ NR_RRCReconfiguration_IEs_t *reconfig,
+ NR_CellGroupConfig_t *secondaryCellGroup,
+ int n_physical_antenna_ports,
+ int initial_csi_index);
void fill_default_rbconfig(NR_RadioBearerConfig_t *rbconfig,
int eps_bearer_id, int rb_id,
diff --git a/openair2/RRC/NR/rrc_gNB.c b/openair2/RRC/NR/rrc_gNB.c
index 6d430d7223..9bea266ffd 100755
--- a/openair2/RRC/NR/rrc_gNB.c
+++ b/openair2/RRC/NR/rrc_gNB.c
@@ -224,6 +224,7 @@ static void init_NR_SI(gNB_RRC_INST *rrc, gNB_RrcConfigurationReq *configuration
rrc_mac_config_req_gNB(rrc->module_id,
rrc->carrier.ssb_SubcarrierOffset,
rrc->carrier.pdsch_AntennaPorts,
+ rrc->carrier.pusch_AntennaPorts,
rrc->carrier.pusch_TargetSNRx10,
rrc->carrier.pucch_TargetSNRx10,
(NR_ServingCellConfigCommon_t *)rrc->carrier.servingcellconfigcommon,
@@ -277,6 +278,8 @@ static void init_NR_SI(gNB_RRC_INST *rrc, gNB_RrcConfigurationReq *configuration
parse_CG_ConfigInfo(rrc,CG_ConfigInfo,NULL);
} else {
struct rrc_gNB_ue_context_s *ue_context_p = rrc_gNB_allocate_new_UE_context(rrc);
+ ue_context_p->ue_context.spCellConfig = calloc(1, sizeof(struct NR_SpCellConfig));
+ ue_context_p->ue_context.spCellConfig->spCellConfigDedicated = configuration->scd;
LOG_I(NR_RRC,"Adding new user (%p)\n",ue_context_p);
rrc_add_nsa_user(rrc,ue_context_p,NULL);
}
@@ -307,6 +310,7 @@ char openair_rrc_gNB_configuration(const module_id_t gnb_mod_idP, gNB_RrcConfigu
rrc->carrier.servingcellconfigcommon = configuration->scc;
rrc->carrier.ssb_SubcarrierOffset = configuration->ssb_SubcarrierOffset;
rrc->carrier.pdsch_AntennaPorts = configuration->pdsch_AntennaPorts;
+ rrc->carrier.pusch_AntennaPorts = configuration->pusch_AntennaPorts;
rrc->carrier.pusch_TargetSNRx10 = configuration->pusch_TargetSNRx10;
rrc->carrier.pucch_TargetSNRx10 = configuration->pucch_TargetSNRx10;
/// System Information INIT
@@ -460,6 +464,7 @@ rrc_gNB_generate_RRCSetup_for_RRCReestablishmentRequest(
rrc_mac_config_req_gNB(rrc_instance_p->module_id,
rrc_instance_p->carrier.ssb_SubcarrierOffset,
rrc_instance_p->carrier.pdsch_AntennaPorts,
+ rrc_instance_p->carrier.pusch_AntennaPorts,
rrc_instance_p->carrier.pusch_TargetSNRx10,
rrc_instance_p->carrier.pucch_TargetSNRx10,
(NR_ServingCellConfigCommon_t *)rrc_instance_p->carrier.servingcellconfigcommon,
@@ -631,7 +636,7 @@ rrc_gNB_generate_defaultRRCReconfiguration(
DRB_config->pdcp_Config = calloc(1, sizeof(*DRB_config->pdcp_Config));
DRB_config->pdcp_Config->drb = calloc(1,sizeof(*DRB_config->pdcp_Config->drb));
DRB_config->pdcp_Config->drb->discardTimer = calloc(1, sizeof(*DRB_config->pdcp_Config->drb->discardTimer));
- *DRB_config->pdcp_Config->drb->discardTimer = NR_PDCP_Config__drb__discardTimer_ms30;
+ *DRB_config->pdcp_Config->drb->discardTimer = NR_PDCP_Config__drb__discardTimer_infinity;
DRB_config->pdcp_Config->drb->pdcp_SN_SizeUL = calloc(1, sizeof(*DRB_config->pdcp_Config->drb->pdcp_SN_SizeUL));
*DRB_config->pdcp_Config->drb->pdcp_SN_SizeUL = NR_PDCP_Config__drb__pdcp_SN_SizeUL_len18bits;
DRB_config->pdcp_Config->drb->pdcp_SN_SizeDL = calloc(1, sizeof(*DRB_config->pdcp_Config->drb->pdcp_SN_SizeDL));
diff --git a/openair2/RRC/NR/rrc_gNB_nsa.c b/openair2/RRC/NR/rrc_gNB_nsa.c
index 4e09f46c36..c1efc9550c 100644
--- a/openair2/RRC/NR/rrc_gNB_nsa.c
+++ b/openair2/RRC/NR/rrc_gNB_nsa.c
@@ -238,11 +238,21 @@ void rrc_add_nsa_user(gNB_RRC_INST *rrc,struct rrc_gNB_ue_context_s *ue_context_
cipher_algo,
NR_SecurityConfig__keyToUse_secondary);
}
- fill_default_reconfig(carrier->servingcellconfigcommon,
+ if (ue_context_p->ue_context.spCellConfig) {
+ fill_default_reconfig(carrier->servingcellconfigcommon,
+ ue_context_p->ue_context.spCellConfig->spCellConfigDedicated,
reconfig_ies,
ue_context_p->ue_context.secondaryCellGroup,
carrier->pdsch_AntennaPorts,
carrier->initial_csi_index[rrc->Nb_ue]);
+ } else {
+ fill_default_reconfig(carrier->servingcellconfigcommon,
+ NULL,
+ reconfig_ies,
+ ue_context_p->ue_context.secondaryCellGroup,
+ carrier->pdsch_AntennaPorts,
+ carrier->initial_csi_index[rrc->Nb_ue]);
+ }
ue_context_p->ue_id_rnti = ue_context_p->ue_context.secondaryCellGroup->spCellConfig->reconfigurationWithSync->newUE_Identity;
NR_CG_Config_t *CG_Config = calloc(1,sizeof(*CG_Config));
memset((void *)CG_Config,0,sizeof(*CG_Config));
@@ -336,6 +346,7 @@ void rrc_add_nsa_user(gNB_RRC_INST *rrc,struct rrc_gNB_ue_context_s *ue_context_
rrc_mac_config_req_gNB(rrc->module_id,
rrc->carrier.ssb_SubcarrierOffset,
rrc->carrier.pdsch_AntennaPorts,
+ rrc->carrier.pusch_AntennaPorts,
rrc->carrier.pusch_TargetSNRx10,
rrc->carrier.pucch_TargetSNRx10,
NULL,
diff --git a/openair2/RRC/NR/rrc_gNB_reconfig.c b/openair2/RRC/NR/rrc_gNB_reconfig.c
index 2798cf0008..b2b8107e52 100644
--- a/openair2/RRC/NR/rrc_gNB_reconfig.c
+++ b/openair2/RRC/NR/rrc_gNB_reconfig.c
@@ -31,6 +31,7 @@
#define RRC_GNB_NSA_C
#include "NR_ServingCellConfigCommon.h"
+#include "NR_ServingCellConfig.h"
#include "NR_RRCReconfiguration.h"
#include "NR_RRCReconfiguration-IEs.h"
#include "NR_CellGroupConfig.h"
@@ -143,6 +144,7 @@ void fill_default_searchSpaceZero(NR_SearchSpace_t *ss0) {
}
void fill_default_secondaryCellGroup(NR_ServingCellConfigCommon_t *servingcellconfigcommon,
+ NR_ServingCellConfig_t *servingcellconfigdedicated,
NR_CellGroupConfig_t *secondaryCellGroup,
int scg_id,
int servCellIndex,
@@ -285,7 +287,11 @@ void fill_default_secondaryCellGroup(NR_ServingCellConfigCommon_t *servingcellco
secondaryCellGroup->spCellConfig->rlf_TimersAndConstants->choice.setup->ext1 = calloc(1,sizeof(*secondaryCellGroup->spCellConfig->rlf_TimersAndConstants->choice.setup->ext1));
secondaryCellGroup->spCellConfig->rlf_TimersAndConstants->choice.setup->ext1->t311 = NR_RLF_TimersAndConstants__ext1__t311_ms30000;
secondaryCellGroup->spCellConfig->rlmInSyncOutOfSyncThreshold = NULL;
- secondaryCellGroup->spCellConfig->spCellConfigDedicated = calloc(1,sizeof(*secondaryCellGroup->spCellConfig->spCellConfigDedicated));
+ if (servingcellconfigdedicated) {
+ secondaryCellGroup->spCellConfig->spCellConfigDedicated = servingcellconfigdedicated;
+ } else {
+ secondaryCellGroup->spCellConfig->spCellConfigDedicated = calloc(1,sizeof(*secondaryCellGroup->spCellConfig->spCellConfigDedicated));
+ }
secondaryCellGroup->spCellConfig->spCellConfigDedicated->tdd_UL_DL_ConfigurationDedicated = NULL;
secondaryCellGroup->spCellConfig->spCellConfigDedicated->initialDownlinkBWP = calloc(1,sizeof(*secondaryCellGroup->spCellConfig->spCellConfigDedicated->initialDownlinkBWP));
secondaryCellGroup->spCellConfig->spCellConfigDedicated->initialDownlinkBWP->pdcch_Config=NULL;
@@ -460,9 +466,15 @@ void fill_default_secondaryCellGroup(NR_ServingCellConfigCommon_t *servingcellco
#endif
secondaryCellGroup->spCellConfig->spCellConfigDedicated->downlinkBWP_ToReleaseList= NULL;
- secondaryCellGroup->spCellConfig->spCellConfigDedicated->downlinkBWP_ToAddModList = calloc(1,sizeof(*secondaryCellGroup->spCellConfig->spCellConfigDedicated->downlinkBWP_ToAddModList));
+
+ NR_BWP_Downlink_t *bwp = NULL;
+ if (servingcellconfigdedicated) {
+ bwp=servingcellconfigdedicated->downlinkBWP_ToAddModList->list.array[0];
+ } else {
+ secondaryCellGroup->spCellConfig->spCellConfigDedicated->downlinkBWP_ToAddModList = calloc(1,sizeof(*secondaryCellGroup->spCellConfig->spCellConfigDedicated->downlinkBWP_ToAddModList));
- NR_BWP_Downlink_t *bwp=calloc(1,sizeof(*bwp));
+ bwp=calloc(1,sizeof(*bwp));
+ }
bwp->bwp_Id=1;
bwp->bwp_Common=calloc(1,sizeof(*bwp->bwp_Common));
// copy common BWP size from initial BWP except for bandwdith
@@ -577,8 +589,9 @@ void fill_default_secondaryCellGroup(NR_ServingCellConfigCommon_t *servingcellco
ASN_SEQUENCE_ADD(&bwp->bwp_Common->pdsch_ConfigCommon->choice.setup->pdsch_TimeDomainAllocationList->list,pdschi);
}
- bwp->bwp_Dedicated=calloc(1,sizeof(*bwp->bwp_Dedicated));
-
+ if (!servingcellconfigdedicated) {
+ bwp->bwp_Dedicated=calloc(1,sizeof(*bwp->bwp_Dedicated));
+ }
bwp->bwp_Dedicated->pdcch_Config=calloc(1,sizeof(*bwp->bwp_Dedicated->pdcch_Config));
bwp->bwp_Dedicated->pdcch_Config->present = NR_SetupRelease_PDCCH_Config_PR_setup;
bwp->bwp_Dedicated->pdcch_Config->choice.setup = calloc(1,sizeof(*bwp->bwp_Dedicated->pdcch_Config->choice.setup));
@@ -626,113 +639,30 @@ void fill_default_secondaryCellGroup(NR_ServingCellConfigCommon_t *servingcellco
bwp->bwp_Dedicated->pdcch_Config->choice.setup->searchSpacesToReleaseList = NULL;
- bwp->bwp_Dedicated->pdsch_Config = calloc(1,sizeof(*bwp->bwp_Dedicated->pdsch_Config));
+ if (!servingcellconfigdedicated) {
+ bwp->bwp_Dedicated->pdsch_Config = calloc(1,sizeof(*bwp->bwp_Dedicated->pdsch_Config));
bwp->bwp_Dedicated->pdsch_Config->present = NR_SetupRelease_PDSCH_Config_PR_setup;
bwp->bwp_Dedicated->pdsch_Config->choice.setup = calloc(1,sizeof(*bwp->bwp_Dedicated->pdsch_Config->choice.setup));
- bwp->bwp_Dedicated->pdsch_Config->choice.setup->dataScramblingIdentityPDSCH = NULL;
bwp->bwp_Dedicated->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA = calloc(1,sizeof(*bwp->bwp_Dedicated->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA));
bwp->bwp_Dedicated->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA->present= NR_SetupRelease_DMRS_DownlinkConfig_PR_setup;
- bwp->bwp_Dedicated->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup = calloc(1,sizeof(*bwp->bwp_Dedicated->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup));
+ bwp->bwp_Dedicated->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup = calloc(1,sizeof(*bwp->bwp_Dedicated->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup));
+ }
+ bwp->bwp_Dedicated->pdsch_Config->choice.setup->dataScramblingIdentityPDSCH = NULL;
- bwp->bwp_Dedicated->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup->dmrs_Type=NULL;
+ bwp->bwp_Dedicated->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup->dmrs_Type=NULL;//calloc(1,sizeof(*bwp->bwp_Dedicated->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup->dmrs_Type));
bwp->bwp_Dedicated->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup->maxLength=NULL;
bwp->bwp_Dedicated->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup->scramblingID0=NULL;
bwp->bwp_Dedicated->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup->scramblingID1=NULL;
- bwp->bwp_Dedicated->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup->phaseTrackingRS=NULL;
-
+ if (!servingcellconfigdedicated) {
+ bwp->bwp_Dedicated->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup->phaseTrackingRS=NULL;
+ }
bwp->bwp_Dedicated->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup->dmrs_AdditionalPosition = calloc(1,sizeof(*bwp->bwp_Dedicated->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup->dmrs_AdditionalPosition));
*bwp->bwp_Dedicated->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup->dmrs_AdditionalPosition = NR_DMRS_DownlinkConfig__dmrs_AdditionalPosition_pos0;
- //bwp->bwp_Dedicated->pdsch_Config->choice.setup->tci_StatesToAddModList=NULL;
bwp->bwp_Dedicated->pdsch_Config->choice.setup->tci_StatesToAddModList=calloc(1,sizeof(*bwp->bwp_Dedicated->pdsch_Config->choice.setup->tci_StatesToAddModList));
-#if 0
- bwp->bwp_Dedicated->pdsch_Config->choice.setup->tci_StatesToAddModList=calloc(1,sizeof(*bwp->bwp_Dedicated->pdsch_Config->choice.setup->tci_StatesToAddModList));
-
- NR_TCI_State_t*tcid0=calloc(1,sizeof(*tcid0));
- tcid0->tci_StateId=0;
- tcid0->qcl_Type1.cell=NULL;
- tcid0->qcl_Type1.bwp_Id=calloc(1,sizeof(*tcid0->qcl_Type1.bwp_Id));
- *tcid0->qcl_Type1.bwp_Id=1;
- tcid0->qcl_Type1.referenceSignal.present = NR_QCL_Info__referenceSignal_PR_csi_rs;
- tcid0->qcl_Type1.referenceSignal.choice.csi_rs = 2;
- tcid0->qcl_Type1.qcl_Type=NR_QCL_Info__qcl_Type_typeA;
- ASN_SEQUENCE_ADD(&bwp->bwp_Dedicated->pdsch_Config->choice.setup->tci_StatesToAddModList->list,tcid0);
-
- NR_TCI_State_t*tcid1=calloc(1,sizeof(*tcid1));
- tcid1->tci_StateId=0;
- tcid1->qcl_Type1.cell=NULL;
- tcid1->qcl_Type1.bwp_Id=calloc(1,sizeof(*tcid1->qcl_Type1.bwp_Id));
- *tcid1->qcl_Type1.bwp_Id=1;
- tcid1->qcl_Type1.referenceSignal.present = NR_QCL_Info__referenceSignal_PR_csi_rs;
- tcid1->qcl_Type1.referenceSignal.choice.csi_rs = 6;
- tcid1->qcl_Type1.qcl_Type=NR_QCL_Info__qcl_Type_typeA;
- ASN_SEQUENCE_ADD(&bwp->bwp_Dedicated->pdsch_Config->choice.setup->tci_StatesToAddModList->list,tcid1);
-
- NR_TCI_State_t*tcid2=calloc(1,sizeof(*tcid2));
- tcid2->tci_StateId=2;
- tcid2->qcl_Type1.cell=NULL;
- tcid2->qcl_Type1.bwp_Id=calloc(1,sizeof(*tcid2->qcl_Type1.bwp_Id));
- *tcid2->qcl_Type1.bwp_Id=1;
- tcid2->qcl_Type1.referenceSignal.present = NR_QCL_Info__referenceSignal_PR_csi_rs;
- tcid2->qcl_Type1.referenceSignal.choice.csi_rs = 10;
- tcid2->qcl_Type1.qcl_Type=NR_QCL_Info__qcl_Type_typeA;
- ASN_SEQUENCE_ADD(&bwp->bwp_Dedicated->pdsch_Config->choice.setup->tci_StatesToAddModList->list,tcid2);
-
- NR_TCI_State_t*tcid3=calloc(1,sizeof(*tcid3));
- tcid3->tci_StateId=3;
- tcid3->qcl_Type1.cell=NULL;
- tcid3->qcl_Type1.bwp_Id=calloc(1,sizeof(*tcid3->qcl_Type1.bwp_Id));
- *tcid3->qcl_Type1.bwp_Id=1;
- tcid3->qcl_Type1.referenceSignal.present = NR_QCL_Info__referenceSignal_PR_csi_rs;
- tcid3->qcl_Type1.referenceSignal.choice.csi_rs = 14;
- tcid3->qcl_Type1.qcl_Type=NR_QCL_Info__qcl_Type_typeA;
- ASN_SEQUENCE_ADD(&bwp->bwp_Dedicated->pdsch_Config->choice.setup->tci_StatesToAddModList->list,tcid3);
-
- NR_TCI_State_t*tcid4=calloc(1,sizeof(*tcid4));
- tcid4->tci_StateId=4;
- tcid4->qcl_Type1.cell=NULL;
- tcid4->qcl_Type1.bwp_Id=calloc(1,sizeof(*tcid4->qcl_Type1.bwp_Id));
- *tcid4->qcl_Type1.bwp_Id=1;
- tcid4->qcl_Type1.referenceSignal.present = NR_QCL_Info__referenceSignal_PR_csi_rs;
- tcid4->qcl_Type1.referenceSignal.choice.csi_rs = 18;
- tcid4->qcl_Type1.qcl_Type=NR_QCL_Info__qcl_Type_typeA;
- ASN_SEQUENCE_ADD(&bwp->bwp_Dedicated->pdsch_Config->choice.setup->tci_StatesToAddModList->list,tcid4);
-
- NR_TCI_State_t*tcid5=calloc(1,sizeof(*tcid5));
- tcid5->tci_StateId=5;
- tcid5->qcl_Type1.cell=NULL;
- tcid5->qcl_Type1.bwp_Id=calloc(1,sizeof(*tcid5->qcl_Type1.bwp_Id));
- *tcid5->qcl_Type1.bwp_Id=1;
- tcid5->qcl_Type1.referenceSignal.present = NR_QCL_Info__referenceSignal_PR_csi_rs;
- tcid5->qcl_Type1.referenceSignal.choice.csi_rs = 22;
- tcid5->qcl_Type1.qcl_Type=NR_QCL_Info__qcl_Type_typeA;
- ASN_SEQUENCE_ADD(&bwp->bwp_Dedicated->pdsch_Config->choice.setup->tci_StatesToAddModList->list,tcid5);
-
- NR_TCI_State_t*tcid6=calloc(1,sizeof(*tcid6));
- tcid6->tci_StateId=6;
- tcid6->qcl_Type1.cell=NULL;
- tcid6->qcl_Type1.bwp_Id=calloc(1,sizeof(*tcid6->qcl_Type1.bwp_Id));
- *tcid6->qcl_Type1.bwp_Id=1;
- tcid6->qcl_Type1.referenceSignal.present = NR_QCL_Info__referenceSignal_PR_csi_rs;
- tcid6->qcl_Type1.referenceSignal.choice.csi_rs = 26;
- tcid6->qcl_Type1.qcl_Type=NR_QCL_Info__qcl_Type_typeA;
- ASN_SEQUENCE_ADD(&bwp->bwp_Dedicated->pdsch_Config->choice.setup->tci_StatesToAddModList->list,tcid6);
-
- NR_TCI_State_t*tcid7=calloc(1,sizeof(*tcid7));
- tcid7->tci_StateId=7;
- tcid7->qcl_Type1.cell=NULL;
- tcid7->qcl_Type1.bwp_Id=calloc(1,sizeof(*tcid7->qcl_Type1.bwp_Id));
- *tcid7->qcl_Type1.bwp_Id=1;
- tcid7->qcl_Type1.referenceSignal.present = NR_QCL_Info__referenceSignal_PR_csi_rs;
- tcid7->qcl_Type1.referenceSignal.choice.csi_rs = 30;
- tcid7->qcl_Type1.qcl_Type=NR_QCL_Info__qcl_Type_typeA;
- ASN_SEQUENCE_ADD(&bwp->bwp_Dedicated->pdsch_Config->choice.setup->tci_StatesToAddModList->list,tcid7);
-#endif
-
-
n_ssb = 0;
NR_TCI_State_t *tcid[64];
for (int i=0;i<64;i++) {
@@ -828,8 +758,9 @@ void fill_default_secondaryCellGroup(NR_ServingCellConfigCommon_t *servingcellco
*bwp->bwp_Dedicated->radioLinkMonitoringConfig->choice.setup->beamFailureDetectionTimer = NR_RadioLinkMonitoringConfig__beamFailureDetectionTimer_pbfd2;
#endif
- ASN_SEQUENCE_ADD(&secondaryCellGroup->spCellConfig->spCellConfigDedicated->downlinkBWP_ToAddModList->list,bwp);
-
+ if (!servingcellconfigdedicated) {
+ ASN_SEQUENCE_ADD(&secondaryCellGroup->spCellConfig->spCellConfigDedicated->downlinkBWP_ToAddModList->list,bwp);
+ }
secondaryCellGroup->spCellConfig->spCellConfigDedicated->firstActiveDownlinkBWP_Id=calloc(1,sizeof(*secondaryCellGroup->spCellConfig->spCellConfigDedicated->firstActiveDownlinkBWP_Id));
*secondaryCellGroup->spCellConfig->spCellConfigDedicated->firstActiveDownlinkBWP_Id=1;
@@ -837,26 +768,38 @@ void fill_default_secondaryCellGroup(NR_ServingCellConfigCommon_t *servingcellco
secondaryCellGroup->spCellConfig->spCellConfigDedicated->defaultDownlinkBWP_Id = NULL;
secondaryCellGroup->spCellConfig->spCellConfigDedicated->defaultDownlinkBWP_Id = calloc(1, sizeof(*secondaryCellGroup->spCellConfig->spCellConfigDedicated->defaultDownlinkBWP_Id));
*secondaryCellGroup->spCellConfig->spCellConfigDedicated->defaultDownlinkBWP_Id = 1;
- secondaryCellGroup->spCellConfig->spCellConfigDedicated->uplinkConfig=calloc(1,sizeof(*secondaryCellGroup->spCellConfig->spCellConfigDedicated->uplinkConfig));
+
+ if (!servingcellconfigdedicated) {
+ secondaryCellGroup->spCellConfig->spCellConfigDedicated->uplinkConfig=calloc(1,sizeof(*secondaryCellGroup->spCellConfig->spCellConfigDedicated->uplinkConfig));
+ }
NR_BWP_UplinkDedicated_t *initialUplinkBWP = calloc(1,sizeof(*initialUplinkBWP));
secondaryCellGroup->spCellConfig->spCellConfigDedicated->uplinkConfig->initialUplinkBWP = initialUplinkBWP;
initialUplinkBWP->pucch_Config = NULL;
initialUplinkBWP->pusch_Config = calloc(1,sizeof(*initialUplinkBWP->pusch_Config));
initialUplinkBWP->pusch_Config->present = NR_SetupRelease_PUSCH_Config_PR_setup;
- NR_PUSCH_Config_t *pusch_Config = calloc(1,sizeof(*pusch_Config));
+ NR_PUSCH_Config_t *pusch_Config = NULL;
+ if (servingcellconfigdedicated) {
+ pusch_Config = servingcellconfigdedicated->uplinkConfig->uplinkBWP_ToAddModList->list.array[0]->bwp_Dedicated->pusch_Config->choice.setup;
+ } else {
+ pusch_Config = calloc(1,sizeof(*pusch_Config));
+ }
initialUplinkBWP->pusch_Config->choice.setup = pusch_Config;
pusch_Config->txConfig=calloc(1,sizeof(*pusch_Config->txConfig));
*pusch_Config->txConfig= NR_PUSCH_Config__txConfig_codebook;
pusch_Config->dmrs_UplinkForPUSCH_MappingTypeA = NULL;
- pusch_Config->dmrs_UplinkForPUSCH_MappingTypeB = calloc(1,sizeof(*pusch_Config->dmrs_UplinkForPUSCH_MappingTypeB));
- pusch_Config->dmrs_UplinkForPUSCH_MappingTypeB->present = NR_SetupRelease_DMRS_UplinkConfig_PR_setup;
- pusch_Config->dmrs_UplinkForPUSCH_MappingTypeB->choice.setup = calloc(1,sizeof(*pusch_Config->dmrs_UplinkForPUSCH_MappingTypeB->choice.setup));
+ if (!servingcellconfigdedicated) {
+ pusch_Config->dmrs_UplinkForPUSCH_MappingTypeB = calloc(1,sizeof(*pusch_Config->dmrs_UplinkForPUSCH_MappingTypeB));
+ pusch_Config->dmrs_UplinkForPUSCH_MappingTypeB->present = NR_SetupRelease_DMRS_UplinkConfig_PR_setup;
+ pusch_Config->dmrs_UplinkForPUSCH_MappingTypeB->choice.setup = calloc(1,sizeof(*pusch_Config->dmrs_UplinkForPUSCH_MappingTypeB->choice.setup));
+ }
NR_DMRS_UplinkConfig_t *NR_DMRS_UplinkConfig = pusch_Config->dmrs_UplinkForPUSCH_MappingTypeB->choice.setup;
NR_DMRS_UplinkConfig->dmrs_Type = NULL;
NR_DMRS_UplinkConfig->dmrs_AdditionalPosition = calloc(1,sizeof(*NR_DMRS_UplinkConfig->dmrs_AdditionalPosition));
*NR_DMRS_UplinkConfig->dmrs_AdditionalPosition = NR_DMRS_UplinkConfig__dmrs_AdditionalPosition_pos0;
- NR_DMRS_UplinkConfig->phaseTrackingRS=NULL;
+ if (!servingcellconfigdedicated) {
+ NR_DMRS_UplinkConfig->phaseTrackingRS=NULL;
+ }
NR_DMRS_UplinkConfig->maxLength=NULL;
NR_DMRS_UplinkConfig->transformPrecodingDisabled = calloc(1,sizeof(*NR_DMRS_UplinkConfig->transformPrecodingDisabled));
NR_DMRS_UplinkConfig->transformPrecodingDisabled->scramblingID0 = NULL;
@@ -903,7 +846,7 @@ void fill_default_secondaryCellGroup(NR_ServingCellConfigCommon_t *servingcellco
pusch_Config->tp_pi2BPSK=NULL;
/*------------------------------TRANSFORM PRECODING- -----------------------------------------------------------------------*/
-
+
uint8_t transform_precoding = NR_PUSCH_Config__transformPrecoder_disabled;
// TBD: configure this from .conf file, Dedicated params cannot yet be configured in .conf file.
@@ -918,20 +861,20 @@ void fill_default_secondaryCellGroup(NR_ServingCellConfigCommon_t *servingcellco
if (servingcellconfigcommon->uplinkConfigCommon->initialUplinkBWP->rach_ConfigCommon->choice.setup->msg3_transformPrecoder != NULL)
transform_precoding = NR_PUSCH_Config__transformPrecoder_enabled;
}
- else
+ else
transform_precoding = *pusch_Config->transformPrecoder;
-
-
+
+
if (transform_precoding == NR_PUSCH_Config__transformPrecoder_enabled ) {
/* Enable DMRS uplink config for transform precoding enabled */
NR_DMRS_UplinkConfig->transformPrecodingEnabled = calloc(1,sizeof(*NR_DMRS_UplinkConfig->transformPrecodingEnabled));
NR_DMRS_UplinkConfig->transformPrecodingEnabled->nPUSCH_Identity = NULL;
- NR_DMRS_UplinkConfig->transformPrecodingEnabled->sequenceGroupHopping = NULL;
+ NR_DMRS_UplinkConfig->transformPrecodingEnabled->sequenceGroupHopping = NULL;
NR_DMRS_UplinkConfig->transformPrecodingEnabled->sequenceHopping = NULL;
- NR_DMRS_UplinkConfig->transformPrecodingEnabled->ext1 = NULL;
+ NR_DMRS_UplinkConfig->transformPrecodingEnabled->ext1 = NULL;
LOG_I(RRC,"TRANSFORM PRECODING ENABLED......\n");
-
+
}
/*----------------------------------------------------------------------------------------------------------------------------*/
@@ -992,8 +935,13 @@ void fill_default_secondaryCellGroup(NR_ServingCellConfigCommon_t *servingcellco
ASN_SEQUENCE_ADD(&srs_Config->srs_ResourceToAddModList->list,srs_res0);
secondaryCellGroup->spCellConfig->spCellConfigDedicated->uplinkConfig->uplinkBWP_ToReleaseList = NULL;
- secondaryCellGroup->spCellConfig->spCellConfigDedicated->uplinkConfig->uplinkBWP_ToAddModList = calloc(1,sizeof(*secondaryCellGroup->spCellConfig->spCellConfigDedicated->uplinkConfig->uplinkBWP_ToAddModList));
- NR_BWP_Uplink_t *ubwp = calloc(1,sizeof(*ubwp));
+ NR_BWP_Uplink_t *ubwp = NULL;
+ if (servingcellconfigdedicated) {
+ ubwp = servingcellconfigdedicated->uplinkConfig->uplinkBWP_ToAddModList->list.array[0];
+ } else {
+ secondaryCellGroup->spCellConfig->spCellConfigDedicated->uplinkConfig->uplinkBWP_ToAddModList = calloc(1,sizeof(*secondaryCellGroup->spCellConfig->spCellConfigDedicated->uplinkConfig->uplinkBWP_ToAddModList));
+ ubwp = calloc(1,sizeof(*ubwp));
+ }
ubwp->bwp_Id=1;
ubwp->bwp_Common = calloc(1,sizeof(*ubwp->bwp_Common));
// copy bwp_Common from Initial UL BWP except for bandwidth
@@ -1006,7 +954,9 @@ void fill_default_secondaryCellGroup(NR_ServingCellConfigCommon_t *servingcellco
ubwp->bwp_Common->pusch_ConfigCommon = servingcellconfigcommon->uplinkConfigCommon->initialUplinkBWP->pusch_ConfigCommon;
ubwp->bwp_Common->pucch_ConfigCommon = servingcellconfigcommon->uplinkConfigCommon->initialUplinkBWP->pucch_ConfigCommon;
- ubwp->bwp_Dedicated = calloc(1,sizeof(*ubwp->bwp_Dedicated));
+ if (!servingcellconfigdedicated) {
+ ubwp->bwp_Dedicated = calloc(1,sizeof(*ubwp->bwp_Dedicated));
+ }
ubwp->bwp_Dedicated->pucch_Config = calloc(1,sizeof(*ubwp->bwp_Dedicated->pucch_Config));
ubwp->bwp_Dedicated->pucch_Config->present = NR_SetupRelease_PUCCH_Config_PR_setup;
NR_PUCCH_Config_t *pucch_Config = calloc(1,sizeof(*pucch_Config));
@@ -1136,11 +1086,12 @@ void fill_default_secondaryCellGroup(NR_ServingCellConfigCommon_t *servingcellco
ASN_SEQUENCE_ADD(&pucch_Config->pucch_PowerControl->p0_Set->list,p00);
pucch_Config->pucch_PowerControl->pathlossReferenceRSs = NULL;
- // copy pusch_Config from dedicated initialBWP
- ubwp->bwp_Dedicated->pusch_Config = calloc(1,sizeof(*ubwp->bwp_Dedicated->pusch_Config));
- ubwp->bwp_Dedicated->pusch_Config->present = NR_SetupRelease_PUSCH_Config_PR_setup;
- ubwp->bwp_Dedicated->pusch_Config->choice.setup = pusch_Config;
-
+ if (!servingcellconfigdedicated) {
+ // copy pusch_Config from dedicated initialBWP
+ ubwp->bwp_Dedicated->pusch_Config = calloc(1,sizeof(*ubwp->bwp_Dedicated->pusch_Config));
+ ubwp->bwp_Dedicated->pusch_Config->present = NR_SetupRelease_PUSCH_Config_PR_setup;
+ ubwp->bwp_Dedicated->pusch_Config->choice.setup = pusch_Config;
+ }
ubwp->bwp_Dedicated->configuredGrantConfig = NULL;
ubwp->bwp_Dedicated->srs_Config = calloc(1,sizeof(*ubwp->bwp_Dedicated->srs_Config));
ubwp->bwp_Dedicated->srs_Config->present = NR_SetupRelease_SRS_Config_PR_setup;
@@ -1148,7 +1099,9 @@ void fill_default_secondaryCellGroup(NR_ServingCellConfigCommon_t *servingcellco
ubwp->bwp_Dedicated->beamFailureRecoveryConfig = NULL;
- ASN_SEQUENCE_ADD(&secondaryCellGroup->spCellConfig->spCellConfigDedicated->uplinkConfig->uplinkBWP_ToAddModList->list,ubwp);
+ if (!servingcellconfigdedicated) {
+ ASN_SEQUENCE_ADD(&secondaryCellGroup->spCellConfig->spCellConfigDedicated->uplinkConfig->uplinkBWP_ToAddModList->list,ubwp);
+ }
secondaryCellGroup->spCellConfig->spCellConfigDedicated->uplinkConfig->firstActiveUplinkBWP_Id = calloc(1,sizeof(*secondaryCellGroup->spCellConfig->spCellConfigDedicated->uplinkConfig->firstActiveUplinkBWP_Id));
*secondaryCellGroup->spCellConfig->spCellConfigDedicated->uplinkConfig->firstActiveUplinkBWP_Id = 1;
@@ -1300,7 +1253,9 @@ void fill_default_secondaryCellGroup(NR_ServingCellConfigCommon_t *servingcellco
secondaryCellGroup->spCellConfig->spCellConfigDedicated->servingCellMO=NULL;
}
+
void fill_default_reconfig(NR_ServingCellConfigCommon_t *servingcellconfigcommon,
+ NR_ServingCellConfig_t *servingcellconfigdedicated,
NR_RRCReconfiguration_IEs_t *reconfig,
NR_CellGroupConfig_t *secondaryCellGroup,
int n_physical_antenna_ports,
@@ -1311,7 +1266,7 @@ void fill_default_reconfig(NR_ServingCellConfigCommon_t *servingcellconfigcommon
// radioBearerConfig
reconfig->radioBearerConfig=NULL;
// secondaryCellGroup
- fill_default_secondaryCellGroup(servingcellconfigcommon,secondaryCellGroup,1,1,n_physical_antenna_ports,initial_csi_index);
+ fill_default_secondaryCellGroup(servingcellconfigcommon,servingcellconfigdedicated,secondaryCellGroup,1,1,n_physical_antenna_ports,initial_csi_index);
xer_fprint(stdout, &asn_DEF_NR_CellGroupConfig, (const void*)secondaryCellGroup);
char scg_buffer[1024];
@@ -1347,7 +1302,7 @@ void fill_default_rbconfig(NR_RadioBearerConfig_t *rbconfig,
drb_ToAddMod->pdcp_Config = calloc(1,sizeof(*drb_ToAddMod->pdcp_Config));
drb_ToAddMod->pdcp_Config->drb = calloc(1,sizeof(*drb_ToAddMod->pdcp_Config->drb));
drb_ToAddMod->pdcp_Config->drb->discardTimer = calloc(1,sizeof(*drb_ToAddMod->pdcp_Config->drb->discardTimer));
- *drb_ToAddMod->pdcp_Config->drb->discardTimer=NR_PDCP_Config__drb__discardTimer_ms30;
+ *drb_ToAddMod->pdcp_Config->drb->discardTimer=NR_PDCP_Config__drb__discardTimer_infinity;
drb_ToAddMod->pdcp_Config->drb->pdcp_SN_SizeUL = calloc(1,sizeof(*drb_ToAddMod->pdcp_Config->drb->pdcp_SN_SizeUL));
*drb_ToAddMod->pdcp_Config->drb->pdcp_SN_SizeUL = NR_PDCP_Config__drb__pdcp_SN_SizeUL_len18bits;
drb_ToAddMod->pdcp_Config->drb->pdcp_SN_SizeDL = calloc(1,sizeof(*drb_ToAddMod->pdcp_Config->drb->pdcp_SN_SizeDL));
diff --git a/openair2/X2AP/x2ap_eNB_generate_messages.c b/openair2/X2AP/x2ap_eNB_generate_messages.c
index fdce8678b0..7c3a89e7f4 100644
--- a/openair2/X2AP/x2ap_eNB_generate_messages.c
+++ b/openair2/X2AP/x2ap_eNB_generate_messages.c
@@ -1318,6 +1318,9 @@ MCC_MNC_TO_PLMNID(instance_p->mcc, instance_p->mnc, instance_p->mnc_digit_length
ASN_SEQUENCE_ADD(&servedCellMember->servedNRCellInfo.nrModeInfo.choice.tdd.nRFreqInfo.freqBandListNr, freq_band);
switch (instance_p->N_RB_DL[i]) {
+ case 24:
+ servedCellMember->servedNRCellInfo.nrModeInfo.choice.tdd.nR_TxBW.nRNRB = X2AP_NRNRB_nrb24;
+ break;
case 32:
servedCellMember->servedNRCellInfo.nrModeInfo.choice.tdd.nR_TxBW.nRNRB = X2AP_NRNRB_nrb32;
break;
diff --git a/targets/ARCH/USRP/USERSPACE/LIB/usrp_lib.cpp b/targets/ARCH/USRP/USERSPACE/LIB/usrp_lib.cpp
index dd29d01fae..61a742af65 100644
--- a/targets/ARCH/USRP/USERSPACE/LIB/usrp_lib.cpp
+++ b/targets/ARCH/USRP/USERSPACE/LIB/usrp_lib.cpp
@@ -1110,7 +1110,7 @@ extern "C" {
case 46080000:
//openair0_cfg[0].samples_per_packet = 2048;
- openair0_cfg[0].tx_sample_advance = 15;
+ openair0_cfg[0].tx_sample_advance = 65;
openair0_cfg[0].tx_bw = 40e6;
openair0_cfg[0].rx_bw = 40e6;
break;
@@ -1125,7 +1125,7 @@ extern "C" {
case 15360000:
//openair0_cfg[0].samples_per_packet = 2048;
- openair0_cfg[0].tx_sample_advance = 45;
+ openair0_cfg[0].tx_sample_advance = 40;
openair0_cfg[0].tx_bw = 10e6;
openair0_cfg[0].rx_bw = 10e6;
break;
diff --git a/targets/ARCH/iqplayer/iqplayer_lib.c b/targets/ARCH/iqplayer/iqplayer_lib.c
index c4133d1b11..66308d4b1c 100644
--- a/targets/ARCH/iqplayer/iqplayer_lib.c
+++ b/targets/ARCH/iqplayer/iqplayer_lib.c
@@ -25,7 +25,6 @@
*/
#define _LARGEFILE_SOURCE
#define _FILE_OFFSET_BITS 64
-#define NB_ANTENNAS_RX 2
#include
#include
#include
diff --git a/targets/ARCH/rfsimulator/simulator.c b/targets/ARCH/rfsimulator/simulator.c
index cd35c46a15..96d9541db9 100644
--- a/targets/ARCH/rfsimulator/simulator.c
+++ b/targets/ARCH/rfsimulator/simulator.c
@@ -54,7 +54,7 @@
#include
#define PORT 4043 //default TCP port for this simulator
-#define CirSize 307200 // 100ms is enough
+#define CirSize 6144000 // 100ms is enough
#define sampleToByte(a,b) ((a)*(b)*sizeof(sample_t))
#define byteToSample(a,b) ((a)/(sizeof(sample_t)*(b)))
diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/benetel-5g.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/benetel-5g.conf
index 504d5e7b34..cbc672ccc8 100644
--- a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/benetel-5g.conf
+++ b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/benetel-5g.conf
@@ -23,6 +23,7 @@ gNBs =
ssb_SubcarrierOffset = 31; //0;
pdsch_AntennaPorts = 1;
+ pusch_AntennaPorts = 1;
#pusch_TargetSNRx10 = 200;
#pucch_TargetSNRx10 = 200;
pusch_TargetSNRx10 = 200;
@@ -50,7 +51,7 @@ gNBs =
#initialDownlinkBWP
#genericParameters
# this is RBstart=84,L=13 (275*(L-1))+RBstart
- initialDLBWPlocationAndBandwidth = 6366; //28875; //6366; #6407; #3384;
+ initialDLBWPlocationAndBandwidth = 6368;
# subcarrierSpacing
# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
initialDLBWPsubcarrierSpacing = 1;
@@ -92,7 +93,7 @@ gNBs =
pMax = 20;
#initialUplinkBWP
#genericParameters
- initialULBWPlocationAndBandwidth = 6366; //28875; //6366; #6407; #3384;
+ initialULBWPlocationAndBandwidth = 6368;
# subcarrierSpacing
# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
initialULBWPsubcarrierSpacing = 1;
diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band257.tm1.32PRB.usrpx300.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band257.tm1.32PRB.usrpx300.conf
index f2e468c71b..39ee4c6907 100644
--- a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band257.tm1.32PRB.usrpx300.conf
+++ b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band257.tm1.32PRB.usrpx300.conf
@@ -23,6 +23,7 @@ gNBs =
ssb_SubcarrierOffset = 0;
pdsch_AntennaPorts = 1;
+ pusch_AntennaPorts = 1;
servingCellConfigCommon = (
{
diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band257.tm1.66PRB.usrpn300.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band257.tm1.66PRB.usrpn300.conf
index 2737357851..182398cd88 100644
--- a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band257.tm1.66PRB.usrpn300.conf
+++ b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band257.tm1.66PRB.usrpn300.conf
@@ -23,6 +23,7 @@ gNBs =
ssb_SubcarrierOffset = 0;
pdsch_AntennaPorts = 1;
+ pusch_AntennaPorts = 1;
servingCellConfigCommon = (
{
diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band261.tm1.32PRB.usrpn300.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band261.tm1.32PRB.usrpn300.conf
index f810dd546c..f252bd1967 100644
--- a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band261.tm1.32PRB.usrpn300.conf
+++ b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band261.tm1.32PRB.usrpn300.conf
@@ -23,6 +23,7 @@ gNBs =
ssb_SubcarrierOffset = 0;
pdsch_AntennaPorts = 1;
+ pusch_AntennaPorts = 1;
pusch_TargetSNRx10 = 200;
pucch_TargetSNRx10 = 200;
diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band66.tm1.106PRB.usrpn300.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band66.tm1.106PRB.usrpn300.conf
index 32de0aa4f5..632ae126cd 100644
--- a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band66.tm1.106PRB.usrpn300.conf
+++ b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band66.tm1.106PRB.usrpn300.conf
@@ -23,6 +23,7 @@ gNBs =
ssb_SubcarrierOffset = 0;
pdsch_AntennaPorts = 1;
+ pusch_AntennaPorts = 1;
servingCellConfigCommon = (
{
@@ -238,7 +239,7 @@ L1s = (
RUs = (
{
- local_rf = "yes"
+ local_rf = "yes"
nb_tx = 1;
nb_rx = 1;
att_tx = 0;
@@ -247,15 +248,14 @@ RUs = (
max_pdschReferenceSignalPower = -27;
max_rxgain = 75;
eNB_instances = [0];
- ##beamforming 1x2 matrix: 1 layer x 2 antennas
+ ## beamforming 1x2 matrix: 1 layer x 2 antennas
bf_weights = [0x00007fff, 0x0000];
- ##beamforming 1x4 matrix: 1 layer x 4 antennas
+ ## beamforming 1x4 matrix: 1 layer x 4 antennas
#bf_weights = [0x00007fff, 0x0000,0x0000, 0x0000];
## beamforming 2x2 matrix:
- # bf_weights = [0x00007fff, 0x00000000, 0x00000000, 0x00007fff];
+ #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;
diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band66.tm1.106PRB.usrpx300.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band66.tm1.106PRB.usrpx300.conf
index 307cf52cb3..46868d0185 100644
--- a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band66.tm1.106PRB.usrpx300.conf
+++ b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band66.tm1.106PRB.usrpx300.conf
@@ -23,6 +23,7 @@ gNBs =
ssb_SubcarrierOffset = 0;
pdsch_AntennaPorts = 1;
+ pusch_AntennaPorts = 1;
servingCellConfigCommon = (
{
@@ -238,7 +239,7 @@ L1s = (
RUs = (
{
- local_rf = "yes"
+ local_rf = "yes"
nb_tx = 1;
nb_rx = 1;
att_tx = 0;
@@ -247,15 +248,14 @@ RUs = (
max_pdschReferenceSignalPower = -27;
max_rxgain = 114;
eNB_instances = [0];
- ##beamforming 1x2 matrix: 1 layer x 2 antennas
+ ## beamforming 1x2 matrix: 1 layer x 2 antennas
bf_weights = [0x00007fff, 0x0000];
- ##beamforming 1x4 matrix: 1 layer x 4 antennas
+ ## beamforming 1x4 matrix: 1 layer x 4 antennas
#bf_weights = [0x00007fff, 0x0000,0x0000, 0x0000];
## beamforming 2x2 matrix:
- # bf_weights = [0x00007fff, 0x00000000, 0x00000000, 0x00007fff];
+ #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 = "type=x300";
clock_src = "external";
# if_freq = 3700000000L;
diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.106PRB.30kHz,usrpb2x0.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.106PRB.30kHz,usrpb2x0.conf
index 1cd16d0831..cb52494230 100644
--- a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.106PRB.30kHz,usrpb2x0.conf
+++ b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.106PRB.30kHz,usrpb2x0.conf
@@ -23,6 +23,7 @@ gNBs =
ssb_SubcarrierOffset = 31;
pdsch_AntennaPorts = 1;
+ pusch_AntennaPorts = 1;
servingCellConfigCommon = (
{
@@ -46,7 +47,7 @@ gNBs =
#initialDownlinkBWP
#genericParameters
# this is RBstart=84,L=13 (275*(L-1))+RBstart
- initialDLBWPlocationAndBandwidth = 6366;
+ initialDLBWPlocationAndBandwidth = 6368;
# subcarrierSpacing
# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
initialDLBWPsubcarrierSpacing = 1;
@@ -83,7 +84,7 @@ gNBs =
pMax = 20;
#initialUplinkBWP
#genericParameters
- initialULBWPlocationAndBandwidth = 6366;
+ initialULBWPlocationAndBandwidth = 6368;
# subcarrierSpacing
# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
initialULBWPsubcarrierSpacing = 1;
diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.106PRB.slave.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.106PRB.slave.conf
index dfae41f0a6..27ade965dc 100644
--- a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.106PRB.slave.conf
+++ b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.106PRB.slave.conf
@@ -23,6 +23,7 @@ gNBs =
ssb_SubcarrierOffset = 0;
pdsch_AntennaPorts = 1;
+ pusch_AntennaPorts = 1;
servingCellConfigCommon = (
{
@@ -46,7 +47,7 @@ gNBs =
#initialDownlinkBWP
#genericParameters
# this is RBstart=0,L=50 (275*(L-1))+RBstart
- initialDLBWPlocationAndBandwidth = 6366;
+ initialDLBWPlocationAndBandwidth = 6368;
# subcarrierSpacing
# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
initialDLBWPsubcarrierSpacing = 1;
@@ -89,7 +90,7 @@ gNBs =
pMax = 20;
#initialUplinkBWP
#genericParameters
- initialULBWPlocationAndBandwidth = 6366;
+ initialULBWPlocationAndBandwidth = 6368;
# subcarrierSpacing
# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
initialULBWPsubcarrierSpacing = 1;
diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.slave.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.slave.conf
index dcdfa003a2..9bb9132917 100644
--- a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.slave.conf
+++ b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.slave.conf
@@ -23,6 +23,7 @@ gNBs =
ssb_SubcarrierOffset = 0;
pdsch_AntennaPorts = 1;
+ pusch_AntennaPorts = 1;
servingCellConfigCommon = (
{
diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.tm1.106PRB.PTRS.usrpx300.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.tm1.106PRB.PTRS.usrpx300.conf
new file mode 100644
index 0000000000..a02cf1485a
--- /dev/null
+++ b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.tm1.106PRB.PTRS.usrpx300.conf
@@ -0,0 +1,339 @@
+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 3600 MHz + 43 PRBs@30kHz SCS (same as initial BWP)
+ absoluteFrequencySSB = 641032;
+ dl_frequencyBand = 78;
+ # this is 3600 MHz
+ dl_absoluteFrequencyPointA = 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=0,L=50 (275*(L-1))+RBstart
+ initialDLBWPlocationAndBandwidth = 6366;
+ # 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 = 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 = 6366;
+ # 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 = 10;
+ }
+
+ );
+
+ # Dedicated Serving Cell Configuration
+ servingCellConfigDedicated = (
+ {
+ # DL PTRS related parameters.
+ # 3GPP TS 38.331 PTRS-DownlinkConfig
+
+ # frequencyDensity value range: 1-276
+ dl_ptrsFreqDensity0_0 = 25;
+ dl_ptrsFreqDensity1_0 = 75;
+
+ # timeDensity value range: 0-29
+ dl_ptrsTimeDensity0_0 = 2;
+ dl_ptrsTimeDensity1_0 = 4;
+ dl_ptrsTimeDensity2_0 = 10;
+
+ # epre_Ratio
+ # 0 = "00", 1 = "01" in TS 38.214, table 4.1-2
+ dl_ptrsEpreRatio_0 = 0;
+
+ # resourceElementOffset
+ # 0 = offset01 1 = offset02, 2 = offset02
+ # 3GPP TS 38.331 PTRS-DownlinkConfig; TS 38.211 sec. 7.4.1.2.2
+ dl_ptrsReOffset_0 = 0;
+
+ # UL PTRS related parameters.
+ # 3GPP TS 38.331 PTRS-UplinkConfig
+
+ # frequencyDensity value range: 1-276
+ ul_ptrsFreqDensity0_0 = 25;
+ ul_ptrsFreqDensity1_0 = 75;
+
+ # timeDensity value range: 0-29
+ ul_ptrsTimeDensity0_0 = 2;
+ ul_ptrsTimeDensity1_0 = 4;
+ ul_ptrsTimeDensity2_0 = 10;
+
+ # resourceElementOffset
+ # 0 = offset01 1 = offset02, 2 = offset02
+ # TS 38.331 PTRS-UplinkConfig; TS 38.211 sec. 6.4.1.2.2.1
+ ul_ptrsReOffset_0 = 0;
+
+ # maxNrofPorts
+ # 0 = n1, 1 = n2
+ ul_ptrsMaxPorts_0 = 0;
+
+ # ptrs-Power
+ # 0 = p00, 1 = p01, 2 = p10, 3 = p11
+ #ul_ptrsPower_0 = 0;
+ }
+ );
+
+ # ------- 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 = 114;
+ 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 = "type=x300";
+ clock_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";
+};
diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.tm1.106PRB.usrpb210.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.tm1.106PRB.usrpb210.conf
index 862f0e6303..3b384dd072 100644
--- a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.tm1.106PRB.usrpb210.conf
+++ b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.tm1.106PRB.usrpb210.conf
@@ -23,6 +23,7 @@ gNBs =
ssb_SubcarrierOffset = 0;
pdsch_AntennaPorts = 1;
+ pusch_AntennaPorts = 1;
servingCellConfigCommon = (
{
@@ -228,7 +229,7 @@ L1s = (
RUs = (
{
- local_rf = "yes"
+ local_rf = "yes"
nb_tx = 1
nb_rx = 1
att_tx = 0
@@ -237,7 +238,15 @@ RUs = (
max_pdschReferenceSignalPower = -27;
max_rxgain = 114;
eNB_instances = [0];
- sdr_addrs = "type=b200";
+ ## beamforming 1x2 matrix: 1 layer x 2 antennas
+ #bf_weights = [0x00007fff, 0x00007fff];
+ ## 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 = "type=b200";
#clock_src = "external";
}
);
diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.tm1.106PRB.usrpn300.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.tm1.106PRB.usrpn300.conf
index c77497dedd..79db9138e4 100644
--- a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.tm1.106PRB.usrpn300.conf
+++ b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.tm1.106PRB.usrpn300.conf
@@ -23,6 +23,7 @@ gNBs =
ssb_SubcarrierOffset = 0;
pdsch_AntennaPorts = 1;
+ pusch_AntennaPorts = 1;
servingCellConfigCommon = (
{
@@ -46,7 +47,7 @@ gNBs =
#initialDownlinkBWP
#genericParameters
# this is RBstart=41,L=24 (275*(L-1))+RBstart
- initialDLBWPlocationAndBandwidth = 6366;
+ initialDLBWPlocationAndBandwidth = 6368;
# subcarrierSpacing
# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
initialDLBWPsubcarrierSpacing = 1;
@@ -89,7 +90,7 @@ gNBs =
pMax = 20;
#initialUplinkBWP
#genericParameters
- initialULBWPlocationAndBandwidth = 6366;
+ initialULBWPlocationAndBandwidth = 6368;
# subcarrierSpacing
# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
initialULBWPsubcarrierSpacing = 1;
@@ -239,7 +240,7 @@ L1s = (
RUs = (
{
- local_rf = "yes"
+ local_rf = "yes"
nb_tx = 1
nb_rx = 1
att_tx = 0
@@ -248,15 +249,14 @@ RUs = (
max_pdschReferenceSignalPower = -27;
max_rxgain = 50;
eNB_instances = [0];
- ##beamforming 1x2 matrix: 1 layer x 2 antennas
- bf_weights = [0x00007fff, 0x0000];
- ##beamforming 1x4 matrix: 1 layer x 4 antennas
+ ## beamforming 1x2 matrix: 1 layer x 2 antennas
+ #bf_weights = [0x00007fff, 0x00007fff];
+ ## beamforming 1x4 matrix: 1 layer x 4 antennas
#bf_weights = [0x00007fff, 0x0000,0x0000, 0x0000];
## beamforming 2x2 matrix:
- # bf_weights = [0x00007fff, 0x00000000, 0x00000000, 0x00007fff];
+ #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";
}
diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.tm1.106PRB.usrpx300.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.tm1.106PRB.usrpx300.conf
index b3fdd79475..d0775384c3 100644
--- a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.tm1.106PRB.usrpx300.conf
+++ b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.tm1.106PRB.usrpx300.conf
@@ -23,6 +23,7 @@ gNBs =
ssb_SubcarrierOffset = 0;
pdsch_AntennaPorts = 1;
+ pusch_AntennaPorts = 1;
servingCellConfigCommon = (
{
@@ -46,7 +47,7 @@ gNBs =
#initialDownlinkBWP
#genericParameters
# this is RBstart=0,L=50 (275*(L-1))+RBstart
- initialDLBWPlocationAndBandwidth = 6366;
+ initialDLBWPlocationAndBandwidth = 6368;
# subcarrierSpacing
# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
initialDLBWPsubcarrierSpacing = 1;
@@ -89,7 +90,7 @@ gNBs =
pMax = 20;
#initialUplinkBWP
#genericParameters
- initialULBWPlocationAndBandwidth = 6366;
+ initialULBWPlocationAndBandwidth = 6368;
# subcarrierSpacing
# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
initialULBWPsubcarrierSpacing = 1;
@@ -256,7 +257,6 @@ RUs = (
# 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 = "type=x300";
clock_src = "external";
}
diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.tm1.217PRB.usrpn300.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.tm1.217PRB.usrpn300.conf
index 40361aaf4e..d6110e19d5 100644
--- a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.tm1.217PRB.usrpn300.conf
+++ b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.tm1.217PRB.usrpn300.conf
@@ -23,6 +23,7 @@ gNBs =
ssb_SubcarrierOffset = 0;
pdsch_AntennaPorts = 1;
+ pusch_AntennaPorts = 1;
servingCellConfigCommon = (
{
diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.tm1.217PRB.usrpx300.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.tm1.217PRB.usrpx300.conf
index c907dcfe8d..07d04e65f9 100644
--- a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.tm1.217PRB.usrpx300.conf
+++ b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.tm1.217PRB.usrpx300.conf
@@ -23,6 +23,7 @@ gNBs =
ssb_SubcarrierOffset = 0;
pdsch_AntennaPorts = 1;
+ pusch_AntennaPorts = 1;
servingCellConfigCommon = (
{
diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.tm1.24PRB.usrpb210.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.tm1.24PRB.usrpb210.conf
new file mode 100644
index 0000000000..17b7421376
--- /dev/null
+++ b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.tm1.24PRB.usrpb210.conf
@@ -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 3600 MHz + 43 PRBs@30kHz SCS (same as initial BWP)
+ absoluteFrequencySSB = 640288;
+ dl_frequencyBand = 78;
+ # this is 3600 MHz
+ dl_absoluteFrequencyPointA = 640000;
+ #scs-SpecificCarrierList
+ dl_offstToCarrier = 0;
+# subcarrierSpacing
+# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
+ dl_subcarrierSpacing = 1;
+ dl_carrierBandwidth = 24;
+ #initialDownlinkBWP
+ #genericParameters
+ # this is RBstart=41,L=24 (275*(L-1))+RBstart
+ initialDLBWPlocationAndBandwidth = 6325;
+# 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;
+ #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=5
+ initialDLBWPstartSymbolAndLength_3 = 57;
+
+ #uplinkConfigCommon
+ #frequencyInfoUL
+ ul_frequencyBand = 78;
+ #scs-SpecificCarrierList
+ ul_offstToCarrier = 0;
+# subcarrierSpacing
+# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
+ ul_subcarrierSpacing = 1;
+ ul_carrierBandwidth = 24;
+ pMax = 20;
+ #initialUplinkBWP
+ #genericParameters
+ initialULBWPlocationAndBandwidth = 6325;
+# 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 = 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.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 = "type=b200";
+ #"addr=192.168.18.207";
+ #"addr=192.168.10.2,mgmt_addr=192.168.10.2,second_addr=192.168.20.2";
+ clock_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";
+ };
+
diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.tm1.24PRB.usrpn300.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.tm1.24PRB.usrpn300.conf
new file mode 100644
index 0000000000..38ce771e06
--- /dev/null
+++ b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.tm1.24PRB.usrpn300.conf
@@ -0,0 +1,291 @@
+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 3600 MHz + 43 PRBs@30kHz SCS (same as initial BWP)
+ absoluteFrequencySSB = 640288;
+ dl_frequencyBand = 78;
+ # this is 3600 MHz
+ dl_absoluteFrequencyPointA = 640000;
+ #scs-SpecificCarrierList
+ dl_offstToCarrier = 0;
+# subcarrierSpacing
+# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
+ dl_subcarrierSpacing = 1;
+ dl_carrierBandwidth = 24;
+ #initialDownlinkBWP
+ #genericParameters
+ # this is RBstart=41,L=24 (275*(L-1))+RBstart
+ initialDLBWPlocationAndBandwidth = 6325;
+# 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;
+ #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=5
+ initialDLBWPstartSymbolAndLength_3 = 57;
+
+ #uplinkConfigCommon
+ #frequencyInfoUL
+ ul_frequencyBand = 78;
+ #scs-SpecificCarrierList
+ ul_offstToCarrier = 0;
+# subcarrierSpacing
+# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
+ ul_subcarrierSpacing = 1;
+ ul_carrierBandwidth = 24;
+ pMax = 20;
+ #initialUplinkBWP
+ #genericParameters
+ initialULBWPlocationAndBandwidth = 6325;
+# 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 = 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.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";
+ }
+);
+
+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";
+ };
+
diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.tm1.24PRB.usrpx300.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.tm1.24PRB.usrpx300.conf
new file mode 100644
index 0000000000..c17174d1b6
--- /dev/null
+++ b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.tm1.24PRB.usrpx300.conf
@@ -0,0 +1,291 @@
+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 3600 MHz + 43 PRBs@30kHz SCS (same as initial BWP)
+ absoluteFrequencySSB = 640288;
+ dl_frequencyBand = 78;
+ # this is 3600 MHz
+ dl_absoluteFrequencyPointA = 640000;
+ #scs-SpecificCarrierList
+ dl_offstToCarrier = 0;
+# subcarrierSpacing
+# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
+ dl_subcarrierSpacing = 1;
+ dl_carrierBandwidth = 24;
+ #initialDownlinkBWP
+ #genericParameters
+ # this is RBstart=41,L=24 (275*(L-1))+RBstart
+ initialDLBWPlocationAndBandwidth = 6325;
+# 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;
+ #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=5
+ initialDLBWPstartSymbolAndLength_3 = 57;
+
+ #uplinkConfigCommon
+ #frequencyInfoUL
+ ul_frequencyBand = 78;
+ #scs-SpecificCarrierList
+ ul_offstToCarrier = 0;
+# subcarrierSpacing
+# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
+ ul_subcarrierSpacing = 1;
+ ul_carrierBandwidth = 24;
+ pMax = 20;
+ #initialUplinkBWP
+ #genericParameters
+ initialULBWPlocationAndBandwidth = 6325;
+# 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 = 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.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 = 114;
+ 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 = "type=x300";
+ clock_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";
+ };
+
diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.tm1.273PRB.usrpn300.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.tm1.273PRB.usrpn300.conf
index a899845cb8..a42da67df3 100644
--- a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.tm1.273PRB.usrpn300.conf
+++ b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.tm1.273PRB.usrpn300.conf
@@ -23,6 +23,7 @@ gNBs =
ssb_SubcarrierOffset = 0;
pdsch_AntennaPorts = 1;
+ pusch_AntennaPorts = 1;
servingCellConfigCommon = (
{
diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/rcc.band78.tm1.106PRB.nfapi.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/rcc.band78.tm1.106PRB.nfapi.conf
index 5f65a2c801..e541607559 100644
--- a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/rcc.band78.tm1.106PRB.nfapi.conf
+++ b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/rcc.band78.tm1.106PRB.nfapi.conf
@@ -23,6 +23,7 @@ gNBs =
ssb_SubcarrierOffset = 0;
pdsch_AntennaPorts = 1;
+ pusch_AntennaPorts = 1;
servingCellConfigCommon = (
{
diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/testing_gnb.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/testing_gnb.conf
index c46ea98ec2..b2a765c447 100644
--- a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/testing_gnb.conf
+++ b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/testing_gnb.conf
@@ -23,6 +23,7 @@ gNBs =
ssb_SubcarrierOffset = 31; //0;
pdsch_AntennaPorts = 1;
+ pusch_AntennaPorts = 1;
pusch_TargetSNRx10 = 200;
pucch_TargetSNRx10 = 200;
@@ -48,7 +49,7 @@ gNBs =
#initialDownlinkBWP
#genericParameters
# this is RBstart=84,L=13 (275*(L-1))+RBstart
- initialDLBWPlocationAndBandwidth = 6366; //28875; //6366; #6407; #3384;
+ initialDLBWPlocationAndBandwidth = 6368;
# subcarrierSpacing
# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
initialDLBWPsubcarrierSpacing = 1;
@@ -90,7 +91,7 @@ gNBs =
pMax = 20;
#initialUplinkBWP
#genericParameters
- initialULBWPlocationAndBandwidth = 6366; //28875; //6366; #6407; #3384;
+ initialULBWPlocationAndBandwidth = 6368;
# subcarrierSpacing
# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
initialULBWPsubcarrierSpacing = 1;
@@ -249,7 +250,7 @@ L1s = (
{
num_cc = 1;
tr_n_preference = "local_mac";
- pusch_proc_threads = 8;
+ pusch_proc_threads = 8;
}
);
diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/testing_gnb_24PRB.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/testing_gnb_24PRB.conf
new file mode 100644
index 0000000000..185edc5666
--- /dev/null
+++ b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/testing_gnb_24PRB.conf
@@ -0,0 +1,307 @@
+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;
+
+ servingCellConfigCommon = (
+ {
+ #spCellConfigCommon
+
+ physCellId = 0;
+
+# downlinkConfigCommon
+ #frequencyInfoDL
+ # this is 3600 MHz + 12 PRBs@30kHz SCS
+ absoluteFrequencySSB = 640288;
+ dl_frequencyBand = 78;
+ # this is 3600 MHz
+ dl_absoluteFrequencyPointA = 640000;
+ #scs-SpecificCarrierList
+ dl_offstToCarrier = 0;
+# subcarrierSpacing
+# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
+ dl_subcarrierSpacing = 1;
+ dl_carrierBandwidth = 24;
+ #initialDownlinkBWP
+ #genericParameters
+ # this is RBstart=0,L=24 (275*(L-1))+RBstart
+ initialDLBWPlocationAndBandwidth = 6325;
+# 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;
+ #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 //5 (4 is for 43, 5 is for 57)
+ initialDLBWPstartSymbolAndLength_3 = 57; //43; //57;
+ #uplinkConfigCommon
+ #frequencyInfoUL
+ ul_frequencyBand = 78;
+ #scs-SpecificCarrierList
+ ul_offstToCarrier = 0;
+# subcarrierSpacing
+# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
+ ul_subcarrierSpacing = 1;
+ ul_carrierBandwidth = 24;
+ pMax = 20;
+ #initialUplinkBWP
+ #genericParameters
+ initialULBWPlocationAndBandwidth = 6325;
+# 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 = -100;
+#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 = 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 = 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 = 2;
+ initialULBWPmappingType_0 = 1
+ # this is SS=0 L=12
+ initialULBWPstartSymbolAndLength_0 = 55;
+
+ initialULBWPk2_1 = 2;
+ initialULBWPmappingType_1 = 1;
+ # this is SS=0 L=11
+ 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; #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 = -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.18.99";
+ 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 = "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 = 114;
+ 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];
+ clock_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";
+ //parallel_config = "PARALLEL_SINGLE_THREAD";
+ #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";
+ };
+
diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/testing_gnb_n310.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/testing_gnb_n310.conf
index 6a3f008ec1..e8fcced386 100644
--- a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/testing_gnb_n310.conf
+++ b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/testing_gnb_n310.conf
@@ -23,6 +23,7 @@ gNBs =
ssb_SubcarrierOffset = 31; //0;
pdsch_AntennaPorts = 1;
+ pusch_AntennaPorts = 1;
servingCellConfigCommon = (
{
@@ -46,7 +47,7 @@ gNBs =
#initialDownlinkBWP
#genericParameters
# this is RBstart=84,L=13 (275*(L-1))+RBstart
- initialDLBWPlocationAndBandwidth = 6366; //28875; //6366; #6407; #3384;
+ initialDLBWPlocationAndBandwidth = 6368;
# subcarrierSpacing
# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
initialDLBWPsubcarrierSpacing = 1;
@@ -88,7 +89,7 @@ gNBs =
pMax = 20;
#initialUplinkBWP
#genericParameters
- initialULBWPlocationAndBandwidth = 6366; //28875; //6366; #6407; #3384;
+ initialULBWPlocationAndBandwidth = 6368;
# subcarrierSpacing
# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
initialULBWPsubcarrierSpacing = 1;
diff --git a/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band41.fr1.106PRB.usrpb210.conf b/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band41.fr1.106PRB.usrpb210.conf
index 108cf06033..42b87d5672 100644
--- a/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band41.fr1.106PRB.usrpb210.conf
+++ b/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band41.fr1.106PRB.usrpb210.conf
@@ -51,7 +51,7 @@ gNBs =
#initialDownlinkBWP
#genericParameters
# this is RBstart=41,L=24 (275*(L-1))+RBstart
- initialDLBWPlocationAndBandwidth = 6366; # 6366 12925 12956 28875
+ initialDLBWPlocationAndBandwidth = 6368;
# subcarrierSpacing
# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
initialDLBWPsubcarrierSpacing = 1;
@@ -99,7 +99,7 @@ gNBs =
pMax = 20;
#initialUplinkBWP
#genericParameters
- initialULBWPlocationAndBandwidth = 6366;
+ initialULBWPlocationAndBandwidth = 6368;
# subcarrierSpacing
# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
initialULBWPsubcarrierSpacing = 1;
diff --git a/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.106PRB.usrpb210.conf b/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.106PRB.usrpb210.conf
index d28427dbf3..96df4a971f 100644
--- a/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.106PRB.usrpb210.conf
+++ b/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.106PRB.usrpb210.conf
@@ -51,7 +51,7 @@ gNBs =
#initialDownlinkBWP
#genericParameters
# this is RBstart=41,L=24 (275*(L-1))+RBstart
- initialDLBWPlocationAndBandwidth = 6366; # 6366 12925 12956 28875
+ initialDLBWPlocationAndBandwidth = 6368;
# subcarrierSpacing
# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
initialDLBWPsubcarrierSpacing = 1;
@@ -94,7 +94,7 @@ gNBs =
pMax = 20;
#initialUplinkBWP
#genericParameters
- initialULBWPlocationAndBandwidth = 6366;
+ initialULBWPlocationAndBandwidth = 6368;
# subcarrierSpacing
# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
initialULBWPsubcarrierSpacing = 1;