Merge remote-tracking branch 'origin/develop' into if5_ECPRI_rework
This commit is contained in:
@@ -278,6 +278,26 @@ pipeline {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
stage ("SA B200 Sanity Check") {
|
||||||
|
when { expression {doMandatoryTests} }
|
||||||
|
steps {
|
||||||
|
script {
|
||||||
|
triggerSlaveJob ('RAN-SA-B200-Module-SABOX-Container', 'Test-SA-B200')
|
||||||
|
}
|
||||||
|
}
|
||||||
|
post {
|
||||||
|
always {
|
||||||
|
script {
|
||||||
|
finalizeSlaveJob('RAN-SA-B200-Module-SABOX-Container')
|
||||||
|
}
|
||||||
|
}
|
||||||
|
failure {
|
||||||
|
script {
|
||||||
|
currentBuild.result = 'FAILURE'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
stage ("Test OAI NR UE - OAI gNB - TDD - Band 78 - N300") {
|
stage ("Test OAI NR UE - OAI gNB - TDD - Band 78 - N300") {
|
||||||
when { expression {doMandatoryTests} }
|
when { expression {doMandatoryTests} }
|
||||||
steps {
|
steps {
|
||||||
|
|||||||
@@ -66,7 +66,7 @@ pipeline {
|
|||||||
withCredentials([
|
withCredentials([
|
||||||
[$class: 'UsernamePasswordMultiBinding', credentialsId: "${params.DH_Credentials}", usernameVariable: 'DH_Username', passwordVariable: 'DH_Password']
|
[$class: 'UsernamePasswordMultiBinding', credentialsId: "${params.DH_Credentials}", usernameVariable: 'DH_Username', passwordVariable: 'DH_Password']
|
||||||
]) {
|
]) {
|
||||||
def listOfImages = ["oai-enb", "oai-gnb", "oai-lte-ue", "oai-nr-ue"]
|
def listOfImages = ["oai-enb", "oai-gnb", "oai-lte-ue", "oai-nr-ue", "proxy"]
|
||||||
sh "docker login -u ${DH_Username} -p ${DH_Password} > /dev/null 2>&1"
|
sh "docker login -u ${DH_Username} -p ${DH_Password} > /dev/null 2>&1"
|
||||||
listOfImages.eachWithIndex { item, iindex ->
|
listOfImages.eachWithIndex { item, iindex ->
|
||||||
sh "docker image tag ${item}:develop ${DH_Account}/${item}:develop"
|
sh "docker image tag ${item}:develop ${DH_Account}/${item}:develop"
|
||||||
|
|||||||
@@ -36,6 +36,9 @@ def testStageName = params.pipelineTestStageName
|
|||||||
// Name of the phone resource
|
// Name of the phone resource
|
||||||
def ciSmartPhoneResource = params.smartphonesResource
|
def ciSmartPhoneResource = params.smartphonesResource
|
||||||
|
|
||||||
|
// Name of the phone resource
|
||||||
|
def ciEpcResource = params.epcResource
|
||||||
|
|
||||||
// Global Parameters. Normally they should be populated when the master job
|
// Global Parameters. Normally they should be populated when the master job
|
||||||
// triggers the slave job with parameters
|
// triggers the slave job with parameters
|
||||||
def eNB_Repository
|
def eNB_Repository
|
||||||
@@ -51,7 +54,7 @@ pipeline {
|
|||||||
options {
|
options {
|
||||||
disableConcurrentBuilds()
|
disableConcurrentBuilds()
|
||||||
ansiColor('xterm')
|
ansiColor('xterm')
|
||||||
lock (ciSmartPhoneResource)
|
lock(extra: [[resource: ciEpcResource]], resource: ciSmartPhoneResource)
|
||||||
}
|
}
|
||||||
stages {
|
stages {
|
||||||
stage ("Verify Parameters") {
|
stage ("Verify Parameters") {
|
||||||
@@ -216,6 +219,76 @@ pipeline {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
stage ("Terminate") {
|
||||||
|
parallel {
|
||||||
|
stage('Terminate UE') {
|
||||||
|
// Bypassing this stage if there are no abd server defined
|
||||||
|
when {
|
||||||
|
expression { params.ADB_IPAddress != "none" }
|
||||||
|
}
|
||||||
|
steps {
|
||||||
|
echo '\u2705 \u001B[32mTerminate UE\u001B[0m'
|
||||||
|
withCredentials([
|
||||||
|
[$class: 'UsernamePasswordMultiBinding', credentialsId: "${params.ADB_Credentials}", usernameVariable: 'ADB_Username', passwordVariable: 'ADB_Password']
|
||||||
|
]) {
|
||||||
|
sh "python3 ci-scripts/main.py --mode=TerminateUE --ADBIPAddress=${params.ADB_IPAddress} --ADBUserName=${ADB_Username} --ADBPassword=${ADB_Password}"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
stage('Terminate eNB') {
|
||||||
|
steps {
|
||||||
|
echo '\u2705 \u001B[32mTerminate eNB\u001B[0m'
|
||||||
|
withCredentials([
|
||||||
|
[$class: 'UsernamePasswordMultiBinding', credentialsId: "${params.eNB_Credentials}", usernameVariable: 'eNB_Username', passwordVariable: 'eNB_Password']
|
||||||
|
]) {
|
||||||
|
sh "python3 ci-scripts/main.py --mode=TerminateeNB --eNBIPAddress=${params.eNB_IPAddress} --eNBUserName=${eNB_Username} --eNBPassword=${eNB_Password}"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
stage('Terminate SPGW') {
|
||||||
|
// Bypassing this stage if EPC server is not defined
|
||||||
|
when {
|
||||||
|
expression { params.EPC_IPAddress != "none" }
|
||||||
|
}
|
||||||
|
steps {
|
||||||
|
echo '\u2705 \u001B[32mTerminate SPGW\u001B[0m'
|
||||||
|
withCredentials([
|
||||||
|
[$class: 'UsernamePasswordMultiBinding', credentialsId: "${params.EPC_Credentials}", usernameVariable: 'EPC_Username', passwordVariable: 'EPC_Password']
|
||||||
|
]) {
|
||||||
|
sh "python3 ci-scripts/main.py --mode=TerminateSPGW --EPCIPAddress=${params.EPC_IPAddress} --EPCUserName=${EPC_Username} --EPCPassword=${EPC_Password} --EPCType=${params.EPC_Type} --EPCSourceCodePath=${params.EPC_SourceCodePath}"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
stage('Terminate MME') {
|
||||||
|
// Bypassing this stage if EPC server is not defined
|
||||||
|
when {
|
||||||
|
expression { params.EPC_IPAddress != "none" }
|
||||||
|
}
|
||||||
|
steps {
|
||||||
|
echo '\u2705 \u001B[32mTerminate MME\u001B[0m'
|
||||||
|
withCredentials([
|
||||||
|
[$class: 'UsernamePasswordMultiBinding', credentialsId: "${params.EPC_Credentials}", usernameVariable: 'EPC_Username', passwordVariable: 'EPC_Password']
|
||||||
|
]) {
|
||||||
|
sh "python3 ci-scripts/main.py --mode=TerminateMME --EPCIPAddress=${params.EPC_IPAddress} --EPCUserName=${EPC_Username} --EPCPassword=${EPC_Password} --EPCType=${params.EPC_Type} --EPCSourceCodePath=${params.EPC_SourceCodePath}"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
stage('Terminate HSS') {
|
||||||
|
// Bypassing this stage if EPC server is not defined
|
||||||
|
when {
|
||||||
|
expression { params.EPC_IPAddress != "none" }
|
||||||
|
}
|
||||||
|
steps {
|
||||||
|
echo '\u2705 \u001B[32mTerminate HSS\u001B[0m'
|
||||||
|
withCredentials([
|
||||||
|
[$class: 'UsernamePasswordMultiBinding', credentialsId: "${params.EPC_Credentials}", usernameVariable: 'EPC_Username', passwordVariable: 'EPC_Password']
|
||||||
|
]) {
|
||||||
|
sh "python3 ci-scripts/main.py --mode=TerminateHSS --EPCIPAddress=${params.EPC_IPAddress} --EPCUserName=${EPC_Username} --EPCPassword=${EPC_Password} --EPCType=${params.EPC_Type} --EPCSourceCodePath=${params.EPC_SourceCodePath}"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
stage('Log Collection') {
|
stage('Log Collection') {
|
||||||
parallel {
|
parallel {
|
||||||
stage('Log Collection (eNB - Build)') {
|
stage('Log Collection (eNB - Build)') {
|
||||||
@@ -242,7 +315,7 @@ pipeline {
|
|||||||
[$class: 'UsernamePasswordMultiBinding', credentialsId: "${params.eNB_Credentials}", usernameVariable: 'eNB_Username', passwordVariable: 'eNB_Password']
|
[$class: 'UsernamePasswordMultiBinding', credentialsId: "${params.eNB_Credentials}", usernameVariable: 'eNB_Username', passwordVariable: 'eNB_Password']
|
||||||
]) {
|
]) {
|
||||||
echo '\u2705 \u001B[32mLog Collection (eNB - Run)\u001B[0m'
|
echo '\u2705 \u001B[32mLog Collection (eNB - Run)\u001B[0m'
|
||||||
sh "python3 ci-scripts/main.py --mode=LogCollecteNB --eNBIPAddress=${params.eNB_IPAddress} --eNBUserName=${eNB_Username} --eNBPassword=${eNB_Password} --eNBSourceCodePath=${params.eNB_SourceCodePath}"
|
sh "python3 ci-scripts/main.py --mode=LogCollecteNB --eNBIPAddress=${params.eNB_IPAddress} --eNBUserName=${eNB_Username} --eNBPassword=${eNB_Password} --eNBSourceCodePath=${params.eNB_SourceCodePath} --BuildId=${env.BUILD_ID}"
|
||||||
|
|
||||||
echo '\u2705 \u001B[32mLog Transfer (eNB - Run)\u001B[0m'
|
echo '\u2705 \u001B[32mLog Transfer (eNB - Run)\u001B[0m'
|
||||||
sh "sshpass -p \'${eNB_Password}\' scp -o 'StrictHostKeyChecking no' -o 'ConnectTimeout 10' ${eNB_Username}@${params.eNB_IPAddress}:${eNB_SourceCodePath}/cmake_targets/enb.log.zip ./enb.log.${env.BUILD_ID}.zip || true"
|
sh "sshpass -p \'${eNB_Password}\' scp -o 'StrictHostKeyChecking no' -o 'ConnectTimeout 10' ${eNB_Username}@${params.eNB_IPAddress}:${eNB_SourceCodePath}/cmake_targets/enb.log.zip ./enb.log.${env.BUILD_ID}.zip || true"
|
||||||
@@ -259,6 +332,116 @@ pipeline {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
stage('Log Collection (SPGW)') {
|
||||||
|
// Bypassing this stage if EPC server is not defined
|
||||||
|
when {
|
||||||
|
expression { params.EPC_IPAddress != "none" }
|
||||||
|
}
|
||||||
|
steps {
|
||||||
|
withCredentials([
|
||||||
|
[$class: 'UsernamePasswordMultiBinding', credentialsId: "${params.EPC_Credentials}", usernameVariable: 'EPC_Username', passwordVariable: 'EPC_Password']
|
||||||
|
]) {
|
||||||
|
echo '\u2705 \u001B[32mLog Collection (SPGW)\u001B[0m'
|
||||||
|
sh "python3 ci-scripts/main.py --mode=LogCollectSPGW --EPCIPAddress=${params.EPC_IPAddress} --EPCUserName=${EPC_Username} --EPCPassword=${EPC_Password} --EPCSourceCodePath=${params.EPC_SourceCodePath} --EPCType=${params.EPC_Type}"
|
||||||
|
|
||||||
|
echo '\u2705 \u001B[32mLog Transfer (SPGW)\u001B[0m'
|
||||||
|
sh "sshpass -p \'${EPC_Password}\' scp -o 'StrictHostKeyChecking no' -o 'ConnectTimeout 10' ${EPC_Username}@${params.EPC_IPAddress}:${EPC_SourceCodePath}/scripts/spgw.log.zip ./spgw.log.${env.BUILD_ID}.zip || true"
|
||||||
|
}
|
||||||
|
script {
|
||||||
|
if(fileExists("spgw.log.${env.BUILD_ID}.zip")) {
|
||||||
|
archiveArtifacts "spgw.log.${env.BUILD_ID}.zip"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
stage('Log Collection (MME)') {
|
||||||
|
// Bypassing this stage if EPC server is not defined
|
||||||
|
when {
|
||||||
|
expression { params.EPC_IPAddress != "none" }
|
||||||
|
}
|
||||||
|
steps {
|
||||||
|
withCredentials([
|
||||||
|
[$class: 'UsernamePasswordMultiBinding', credentialsId: "${params.EPC_Credentials}", usernameVariable: 'EPC_Username', passwordVariable: 'EPC_Password']
|
||||||
|
]) {
|
||||||
|
echo '\u2705 \u001B[32mLog Collection (MME)\u001B[0m'
|
||||||
|
sh "python3 ci-scripts/main.py --mode=LogCollectMME --EPCIPAddress=${params.EPC_IPAddress} --EPCUserName=${EPC_Username} --EPCPassword=${EPC_Password} --EPCSourceCodePath=${params.EPC_SourceCodePath} --EPCType=${params.EPC_Type}"
|
||||||
|
|
||||||
|
echo '\u2705 \u001B[32mLog Transfer (MME)\u001B[0m'
|
||||||
|
sh "sshpass -p \'${EPC_Password}\' scp -o 'StrictHostKeyChecking no' -o 'ConnectTimeout 10' ${EPC_Username}@${params.EPC_IPAddress}:${EPC_SourceCodePath}/scripts/mme.log.zip ./mme.log.${env.BUILD_ID}.zip || true"
|
||||||
|
}
|
||||||
|
script {
|
||||||
|
if(fileExists("mme.log.${env.BUILD_ID}.zip")) {
|
||||||
|
archiveArtifacts "mme.log.${env.BUILD_ID}.zip"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
stage('Log Collection (HSS)') {
|
||||||
|
// Bypassing this stage if EPC server is not defined
|
||||||
|
when {
|
||||||
|
expression { params.EPC_IPAddress != "none" }
|
||||||
|
}
|
||||||
|
steps {
|
||||||
|
withCredentials([
|
||||||
|
[$class: 'UsernamePasswordMultiBinding', credentialsId: "${params.EPC_Credentials}", usernameVariable: 'EPC_Username', passwordVariable: 'EPC_Password']
|
||||||
|
]) {
|
||||||
|
echo '\u2705 \u001B[32mLog Collection (HSS)\u001B[0m'
|
||||||
|
sh "python3 ci-scripts/main.py --mode=LogCollectHSS --EPCIPAddress=${params.EPC_IPAddress} --EPCUserName=${EPC_Username} --EPCPassword=${EPC_Password} --EPCSourceCodePath=${params.EPC_SourceCodePath} --EPCType=${params.EPC_Type}"
|
||||||
|
|
||||||
|
echo '\u2705 \u001B[32mLog Transfer (HSS)\u001B[0m'
|
||||||
|
sh "sshpass -p \'${EPC_Password}\' scp -o 'StrictHostKeyChecking no' -o 'ConnectTimeout 10' ${EPC_Username}@${params.EPC_IPAddress}:${EPC_SourceCodePath}/scripts/hss.log.zip ./hss.log.${env.BUILD_ID}.zip || true"
|
||||||
|
}
|
||||||
|
script {
|
||||||
|
if(fileExists("hss.log.${env.BUILD_ID}.zip")) {
|
||||||
|
archiveArtifacts "hss.log.${env.BUILD_ID}.zip"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
stage('Log Collection (Ping)') {
|
||||||
|
// Bypassing this stage if EPC server is not defined
|
||||||
|
when {
|
||||||
|
expression { params.EPC_IPAddress != "none" }
|
||||||
|
}
|
||||||
|
steps {
|
||||||
|
withCredentials([
|
||||||
|
[$class: 'UsernamePasswordMultiBinding', credentialsId: "${params.EPC_Credentials}", usernameVariable: 'EPC_Username', passwordVariable: 'EPC_Password']
|
||||||
|
]) {
|
||||||
|
echo '\u2705 \u001B[32mLog Collection (Ping)\u001B[0m'
|
||||||
|
sh "python3 ci-scripts/main.py --mode=LogCollectPing --EPCIPAddress=${params.EPC_IPAddress} --EPCUserName=${EPC_Username} --EPCPassword=${EPC_Password} --EPCSourceCodePath=${params.EPC_SourceCodePath} --EPCType=${params.EPC_Type}"
|
||||||
|
|
||||||
|
echo '\u2705 \u001B[32mLog Transfer (Ping)\u001B[0m'
|
||||||
|
sh "sshpass -p \'${EPC_Password}\' scp -o 'StrictHostKeyChecking no' -o 'ConnectTimeout 10' ${EPC_Username}@${params.EPC_IPAddress}:${EPC_SourceCodePath}/scripts/ping.log.zip ./ping.log.${env.BUILD_ID}.zip || true"
|
||||||
|
}
|
||||||
|
script {
|
||||||
|
if(fileExists("ping.log.${env.BUILD_ID}.zip")) {
|
||||||
|
archiveArtifacts "ping.log.${env.BUILD_ID}.zip"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
stage('Log Collection (Iperf)') {
|
||||||
|
// Bypassing this stage if EPC server is not defined
|
||||||
|
when {
|
||||||
|
expression { params.EPC_IPAddress != "none" }
|
||||||
|
}
|
||||||
|
steps {
|
||||||
|
withCredentials([
|
||||||
|
[$class: 'UsernamePasswordMultiBinding', credentialsId: "${params.EPC_Credentials}", usernameVariable: 'EPC_Username', passwordVariable: 'EPC_Password']
|
||||||
|
]) {
|
||||||
|
echo '\u2705 \u001B[32mLog Collection (Iperf)\u001B[0m'
|
||||||
|
sh "python3 ci-scripts/main.py --mode=LogCollectIperf --EPCIPAddress=${params.EPC_IPAddress} --EPCUserName=${EPC_Username} --EPCPassword=${EPC_Password} --EPCSourceCodePath=${params.EPC_SourceCodePath} --EPCType=${params.EPC_Type}"
|
||||||
|
|
||||||
|
echo '\u2705 \u001B[32mLog Transfer (Iperf)\u001B[0m'
|
||||||
|
sh "sshpass -p \'${EPC_Password}\' scp -o 'StrictHostKeyChecking no' -o 'ConnectTimeout 10' ${EPC_Username}@${params.EPC_IPAddress}:${EPC_SourceCodePath}/scripts/iperf.log.zip ./iperf.log.${env.BUILD_ID}.zip || true"
|
||||||
|
}
|
||||||
|
script {
|
||||||
|
if(fileExists("iperf.log.${env.BUILD_ID}.zip")) {
|
||||||
|
archiveArtifacts "iperf.log.${env.BUILD_ID}.zip"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -20,6 +20,9 @@
|
|||||||
* contact@openairinterface.org
|
* contact@openairinterface.org
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
// necessary for reading JSON
|
||||||
|
import groovy.json.JsonSlurper
|
||||||
|
|
||||||
// Template Jenkins Declarative Pipeline script to run Test w/ RF HW
|
// Template Jenkins Declarative Pipeline script to run Test w/ RF HW
|
||||||
|
|
||||||
// Location of the python executor node shall be in the same subnet as the others servers
|
// Location of the python executor node shall be in the same subnet as the others servers
|
||||||
@@ -37,12 +40,12 @@ pipeline {
|
|||||||
stages {
|
stages {
|
||||||
stage ("Launcher") {
|
stage ("Launcher") {
|
||||||
steps {
|
steps {
|
||||||
script {
|
script {
|
||||||
//retrieve MR that are opened nd with tag NSA
|
// retrieve MR that are opened nd with tag NSA
|
||||||
MR_LIST= sh returnStdout: true, script: 'curl --silent "https://gitlab.eurecom.fr/api/v4/projects/oai%2Fopenairinterface5g/merge_requests?state=opened&per_page=100&labels=NSA" | jq ".[].iid" || true '
|
MR_LIST = sh returnStdout: true, script: 'curl --silent "https://gitlab.eurecom.fr/api/v4/projects/oai%2Fopenairinterface5g/merge_requests?state=opened&per_page=100&labels=NSA" | jq -cj "[.[].iid]"'
|
||||||
echo "List of selected MR:\n${MR_LIST}"
|
echo "List of selected MRs: ${MR_LIST.trim()}"
|
||||||
def MR_ARRAY = MR_LIST.split('\n')
|
def MR_ARRAY = new JsonSlurper().parseText(MR_LIST.trim())
|
||||||
//for every selected MR, retrieve the branch name and the latest commit
|
// for every selected MR, retrieve the branch name and the latest commit
|
||||||
for (MR in MR_ARRAY) {
|
for (MR in MR_ARRAY) {
|
||||||
SRC_BRANCH=sh returnStdout: true, script: """curl --silent "https://gitlab.eurecom.fr/api/v4/projects/oai%2Fopenairinterface5g/merge_requests/${MR}" | jq ".source_branch" || true """
|
SRC_BRANCH=sh returnStdout: true, script: """curl --silent "https://gitlab.eurecom.fr/api/v4/projects/oai%2Fopenairinterface5g/merge_requests/${MR}" | jq ".source_branch" || true """
|
||||||
SRC_BRANCH=SRC_BRANCH.trim()
|
SRC_BRANCH=SRC_BRANCH.trim()
|
||||||
|
|||||||
@@ -74,6 +74,7 @@ class Containerize():
|
|||||||
self.eNB2SourceCodePath = ''
|
self.eNB2SourceCodePath = ''
|
||||||
self.forcedWorkspaceCleanup = False
|
self.forcedWorkspaceCleanup = False
|
||||||
self.imageKind = ''
|
self.imageKind = ''
|
||||||
|
self.proxyCommit = None
|
||||||
self.eNB_instance = 0
|
self.eNB_instance = 0
|
||||||
self.eNB_serverId = ['', '', '']
|
self.eNB_serverId = ['', '', '']
|
||||||
self.yamlPath = ['', '', '']
|
self.yamlPath = ['', '', '']
|
||||||
@@ -421,6 +422,124 @@ class Containerize():
|
|||||||
HTML.CreateHtmlTabFooter(False)
|
HTML.CreateHtmlTabFooter(False)
|
||||||
sys.exit(1)
|
sys.exit(1)
|
||||||
|
|
||||||
|
def BuildProxy(self, HTML):
|
||||||
|
if self.ranRepository == '' or self.ranBranch == '' or self.ranCommitID == '':
|
||||||
|
HELP.GenericHelp(CONST.Version)
|
||||||
|
sys.exit('Insufficient Parameter')
|
||||||
|
if self.eNB_serverId[self.eNB_instance] == '0':
|
||||||
|
lIpAddr = self.eNBIPAddress
|
||||||
|
lUserName = self.eNBUserName
|
||||||
|
lPassWord = self.eNBPassword
|
||||||
|
lSourcePath = self.eNBSourceCodePath
|
||||||
|
elif self.eNB_serverId[self.eNB_instance] == '1':
|
||||||
|
lIpAddr = self.eNB1IPAddress
|
||||||
|
lUserName = self.eNB1UserName
|
||||||
|
lPassWord = self.eNB1Password
|
||||||
|
lSourcePath = self.eNB1SourceCodePath
|
||||||
|
elif self.eNB_serverId[self.eNB_instance] == '2':
|
||||||
|
lIpAddr = self.eNB2IPAddress
|
||||||
|
lUserName = self.eNB2UserName
|
||||||
|
lPassWord = self.eNB2Password
|
||||||
|
lSourcePath = self.eNB2SourceCodePath
|
||||||
|
if lIpAddr == '' or lUserName == '' or lPassWord == '' or lSourcePath == '':
|
||||||
|
HELP.GenericHelp(CONST.Version)
|
||||||
|
sys.exit('Insufficient Parameter')
|
||||||
|
if self.proxyCommit is None:
|
||||||
|
HELP.GenericHelp(CONST.Version)
|
||||||
|
sys.exit('Insufficient Parameter (need proxyCommit for proxy build)')
|
||||||
|
logging.debug('Building on server: ' + lIpAddr)
|
||||||
|
mySSH = SSH.SSHConnection()
|
||||||
|
mySSH.open(lIpAddr, lUserName, lPassWord)
|
||||||
|
|
||||||
|
# Check that we are on Ubuntu
|
||||||
|
mySSH.command('hostnamectl', '\$', 5)
|
||||||
|
result = re.search('Ubuntu', mySSH.getBefore())
|
||||||
|
self.host = result.group(0)
|
||||||
|
if self.host != 'Ubuntu':
|
||||||
|
logging.error('\u001B[1m Can build proxy only on Ubuntu server\u001B[0m')
|
||||||
|
mySSH.close()
|
||||||
|
sys.exit(1)
|
||||||
|
|
||||||
|
self.cli = 'docker'
|
||||||
|
self.cliBuildOptions = '--no-cache'
|
||||||
|
|
||||||
|
# Workaround for some servers, we need to erase completely the workspace
|
||||||
|
if self.forcedWorkspaceCleanup:
|
||||||
|
mySSH.command('echo ' + lPassWord + ' | sudo -S rm -Rf ' + lSourcePath, '\$', 15)
|
||||||
|
|
||||||
|
oldRanCommidID = self.ranCommitID
|
||||||
|
oldRanRepository = self.ranRepository
|
||||||
|
oldRanAllowMerge = self.ranAllowMerge
|
||||||
|
self.ranCommitID = self.proxyCommit
|
||||||
|
self.ranRepository = 'https://github.com/EpiSci/oai-lte-5g-multi-ue-proxy.git'
|
||||||
|
self.ranAllowMerge = False
|
||||||
|
self._createWorkspace(mySSH, lPassWord, lSourcePath)
|
||||||
|
# to prevent accidentally overwriting data that might be used later
|
||||||
|
self.ranCommitID = oldRanCommidID
|
||||||
|
self.ranRepository = oldRanRepository
|
||||||
|
self.ranAllowMerge = oldRanAllowMerge
|
||||||
|
|
||||||
|
# Let's remove any previous run artifacts if still there
|
||||||
|
mySSH.command(self.cli + ' image prune --force', '\$', 30)
|
||||||
|
# Remove any previous proxy image
|
||||||
|
mySSH.command(self.cli + ' image rm oai-lte-multi-ue-proxy:latest || true', '\$', 30)
|
||||||
|
|
||||||
|
tag = self.proxyCommit
|
||||||
|
logging.debug('building L2sim proxy image for tag ' + tag)
|
||||||
|
# check if the corresponding proxy image with tag exists. If not, build it
|
||||||
|
mySSH.command(self.cli + ' image inspect --format=\'Size = {{.Size}} bytes\' proxy:' + tag, '\$', 5)
|
||||||
|
buildProxy = mySSH.getBefore().count('o such image') != 0
|
||||||
|
if buildProxy:
|
||||||
|
mySSH.command(self.cli + ' build ' + self.cliBuildOptions + ' --target oai-lte-multi-ue-proxy --tag proxy:' + tag + ' --file docker/Dockerfile.ubuntu18.04 . > cmake_targets/log/proxy-build.log 2>&1', '\$', 180)
|
||||||
|
# Note: at this point, OAI images are flattened, but we cannot do this
|
||||||
|
# here, as the flatten script is not in the proxy repo
|
||||||
|
mySSH.command(self.cli + ' image inspect --format=\'Size = {{.Size}} bytes\' proxy:' + tag, '\$', 5)
|
||||||
|
if mySSH.getBefore().count('o such image') != 0:
|
||||||
|
logging.error('\u001B[1m Build of L2sim proxy failed\u001B[0m')
|
||||||
|
mySSH.close()
|
||||||
|
HTML.CreateHtmlTestRow('commit ' + tag, 'KO', CONST.ALL_PROCESSES_OK)
|
||||||
|
HTML.CreateHtmlTabFooter(False)
|
||||||
|
sys.exit(1)
|
||||||
|
else:
|
||||||
|
logging.debug('L2sim proxy image for tag ' + tag + ' already exists, skipping build')
|
||||||
|
|
||||||
|
# retag the build images to that we pick it up later
|
||||||
|
mySSH.command('docker image tag proxy:' + tag + ' oai-lte-multi-ue-proxy:latest', '\$', 5)
|
||||||
|
|
||||||
|
# no merge: is a push to develop, tag the image so we can push it to the registry
|
||||||
|
if not self.ranAllowMerge:
|
||||||
|
mySSH.command('docker image tag proxy:' + tag + ' proxy:develop', '\$', 5)
|
||||||
|
|
||||||
|
# we assume that the host on which this is built will also run the proxy. The proxy
|
||||||
|
# currently requires the following command, and the docker-compose up mechanism of
|
||||||
|
# the CI does not allow to run arbitrary commands. Note that the following actually
|
||||||
|
# belongs to the deployment, not the build of the proxy...
|
||||||
|
logging.warning('the following command belongs to deployment, but no mechanism exists to exec it there!')
|
||||||
|
mySSH.command('sudo ifconfig lo: 127.0.0.2 netmask 255.0.0.0 up', '\$', 5)
|
||||||
|
|
||||||
|
# Analyzing the logs
|
||||||
|
if buildProxy:
|
||||||
|
self.testCase_id = HTML.testCase_id
|
||||||
|
mySSH.command('cd ' + lSourcePath + '/cmake_targets', '\$', 5)
|
||||||
|
mySSH.command('mkdir -p proxy_build_log_' + self.testCase_id, '\$', 5)
|
||||||
|
mySSH.command('mv log/* ' + 'proxy_build_log_' + self.testCase_id, '\$', 5)
|
||||||
|
if (os.path.isfile('./proxy_build_log_' + self.testCase_id + '.zip')):
|
||||||
|
os.remove('./proxy_build_log_' + self.testCase_id + '.zip')
|
||||||
|
if (os.path.isdir('./proxy_build_log_' + self.testCase_id)):
|
||||||
|
shutil.rmtree('./proxy_build_log_' + self.testCase_id)
|
||||||
|
mySSH.command('zip -r -qq proxy_build_log_' + self.testCase_id + '.zip proxy_build_log_' + self.testCase_id, '\$', 5)
|
||||||
|
mySSH.copyin(lIpAddr, lUserName, lPassWord, lSourcePath + '/cmake_targets/build_log_' + self.testCase_id + '.zip', '.')
|
||||||
|
# don't delete such that we might recover the zips
|
||||||
|
#mySSH.command('rm -f build_log_' + self.testCase_id + '.zip','\$', 5)
|
||||||
|
|
||||||
|
# Cleaning any created tmp volume
|
||||||
|
mySSH.command(self.cli + ' volume prune --force || true','\$', 15)
|
||||||
|
mySSH.close()
|
||||||
|
|
||||||
|
logging.info('\u001B[1m Building L2sim Proxy Image Pass\u001B[0m')
|
||||||
|
HTML.CreateHtmlTestRow('commit ' + tag, 'OK', CONST.ALL_PROCESSES_OK)
|
||||||
|
HTML.CreateHtmlNextTabHeaderTestRow(self.collectInfo, self.allImagesSize)
|
||||||
|
|
||||||
def Copy_Image_to_Test_Server(self, HTML):
|
def Copy_Image_to_Test_Server(self, HTML):
|
||||||
imageTag = 'develop'
|
imageTag = 'develop'
|
||||||
if (self.ranAllowMerge):
|
if (self.ranAllowMerge):
|
||||||
@@ -567,8 +686,10 @@ class Containerize():
|
|||||||
if status:
|
if status:
|
||||||
HTML.CreateHtmlTestRow('N/A', 'OK', CONST.ALL_PROCESSES_OK)
|
HTML.CreateHtmlTestRow('N/A', 'OK', CONST.ALL_PROCESSES_OK)
|
||||||
else:
|
else:
|
||||||
|
self.exitStatus = 1
|
||||||
HTML.CreateHtmlTestRow('N/A', 'KO', CONST.ALL_PROCESSES_OK)
|
HTML.CreateHtmlTestRow('N/A', 'KO', CONST.ALL_PROCESSES_OK)
|
||||||
|
|
||||||
|
|
||||||
def UndeployObject(self, HTML, RAN):
|
def UndeployObject(self, HTML, RAN):
|
||||||
if self.eNB_serverId[self.eNB_instance] == '0':
|
if self.eNB_serverId[self.eNB_instance] == '0':
|
||||||
lIpAddr = self.eNBIPAddress
|
lIpAddr = self.eNBIPAddress
|
||||||
@@ -588,7 +709,7 @@ class Containerize():
|
|||||||
if lIpAddr == '' or lUserName == '' or lPassWord == '' or lSourcePath == '':
|
if lIpAddr == '' or lUserName == '' or lPassWord == '' or lSourcePath == '':
|
||||||
HELP.GenericHelp(CONST.Version)
|
HELP.GenericHelp(CONST.Version)
|
||||||
sys.exit('Insufficient Parameter')
|
sys.exit('Insufficient Parameter')
|
||||||
logging.debug('\u001B[1m Deploying OAI Object on server: ' + lIpAddr + '\u001B[0m')
|
logging.debug('\u001B[1m Undeploying OAI Object from server: ' + lIpAddr + '\u001B[0m')
|
||||||
mySSH = SSH.SSHConnection()
|
mySSH = SSH.SSHConnection()
|
||||||
mySSH.open(lIpAddr, lUserName, lPassWord)
|
mySSH.open(lIpAddr, lUserName, lPassWord)
|
||||||
mySSH.command('cd ' + lSourcePath + '/' + self.yamlPath[self.eNB_instance], '\$', 5)
|
mySSH.command('cd ' + lSourcePath + '/' + self.yamlPath[self.eNB_instance], '\$', 5)
|
||||||
|
|||||||
@@ -0,0 +1,344 @@
|
|||||||
|
Active_gNBs = ( "gNB-OAI");
|
||||||
|
# Asn1_verbosity, choice in: none, info, annoying
|
||||||
|
Asn1_verbosity = "none";
|
||||||
|
|
||||||
|
gNBs =
|
||||||
|
(
|
||||||
|
{
|
||||||
|
////////// Identification parameters:
|
||||||
|
gNB_ID = 0xe00;
|
||||||
|
gNB_name = "gNB-OAI";
|
||||||
|
|
||||||
|
// Tracking area code, 0x0000 and 0xfffe are reserved values
|
||||||
|
tracking_area_code = 1;
|
||||||
|
plmn_list = ({
|
||||||
|
mcc = 222;
|
||||||
|
mnc = 01;
|
||||||
|
mnc_length = 2;
|
||||||
|
snssaiList = (
|
||||||
|
{
|
||||||
|
sst = 1;
|
||||||
|
#sd = 0x1; // 0 false, else true
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
});
|
||||||
|
|
||||||
|
nr_cellid = 12345678L;
|
||||||
|
|
||||||
|
////////// Physical parameters:
|
||||||
|
|
||||||
|
min_rxtxtime = 2;
|
||||||
|
do_CSIRS = 1;
|
||||||
|
do_SRS = 1;
|
||||||
|
|
||||||
|
pdcch_ConfigSIB1 = (
|
||||||
|
{
|
||||||
|
controlResourceSetZero = 12;
|
||||||
|
searchSpaceZero = 0;
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
servingCellConfigCommon = (
|
||||||
|
{
|
||||||
|
#spCellConfigCommon
|
||||||
|
|
||||||
|
physCellId = 0;
|
||||||
|
|
||||||
|
# downlinkConfigCommon
|
||||||
|
#frequencyInfoDL
|
||||||
|
# this is 3600 MHz + 43 PRBs@30kHz SCS (same as initial BWP)
|
||||||
|
absoluteFrequencySSB = 641280;
|
||||||
|
dl_frequencyBand = 78;
|
||||||
|
# this is 3600 MHz
|
||||||
|
dl_absoluteFrequencyPointA = 640008;
|
||||||
|
#scs-SpecificCarrierList
|
||||||
|
dl_offstToCarrier = 0;
|
||||||
|
# subcarrierSpacing
|
||||||
|
# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
|
||||||
|
dl_subcarrierSpacing = 1;
|
||||||
|
dl_carrierBandwidth = 106;
|
||||||
|
#initialDownlinkBWP
|
||||||
|
#genericParameters
|
||||||
|
# this is RBstart=27,L=48 (275*(L-1))+RBstart
|
||||||
|
initialDLBWPlocationAndBandwidth = 28875; # 6366 12925 12956 28875 12952
|
||||||
|
# subcarrierSpacing
|
||||||
|
# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
|
||||||
|
initialDLBWPsubcarrierSpacing = 1;
|
||||||
|
#pdcch-ConfigCommon
|
||||||
|
initialDLBWPcontrolResourceSetZero = 12;
|
||||||
|
initialDLBWPsearchSpaceZero = 0;
|
||||||
|
|
||||||
|
#uplinkConfigCommon
|
||||||
|
#frequencyInfoUL
|
||||||
|
ul_frequencyBand = 78;
|
||||||
|
#scs-SpecificCarrierList
|
||||||
|
ul_offstToCarrier = 0;
|
||||||
|
# subcarrierSpacing
|
||||||
|
# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
|
||||||
|
ul_subcarrierSpacing = 1;
|
||||||
|
ul_carrierBandwidth = 106;
|
||||||
|
pMax = 20;
|
||||||
|
#initialUplinkBWP
|
||||||
|
#genericParameters
|
||||||
|
initialULBWPlocationAndBandwidth = 28875;
|
||||||
|
# subcarrierSpacing
|
||||||
|
# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
|
||||||
|
initialULBWPsubcarrierSpacing = 1;
|
||||||
|
#rach-ConfigCommon
|
||||||
|
#rach-ConfigGeneric
|
||||||
|
prach_ConfigurationIndex = 98;
|
||||||
|
#prach_msg1_FDM
|
||||||
|
#0 = one, 1=two, 2=four, 3=eight
|
||||||
|
prach_msg1_FDM = 0;
|
||||||
|
prach_msg1_FrequencyStart = 0;
|
||||||
|
zeroCorrelationZoneConfig = 13;
|
||||||
|
preambleReceivedTargetPower = -96;
|
||||||
|
#preamblTransMax (0...10) = (3,4,5,6,7,8,10,20,50,100,200)
|
||||||
|
preambleTransMax = 6;
|
||||||
|
#powerRampingStep
|
||||||
|
# 0=dB0,1=dB2,2=dB4,3=dB6
|
||||||
|
powerRampingStep = 1;
|
||||||
|
#ra_ReponseWindow
|
||||||
|
#1,2,4,8,10,20,40,80
|
||||||
|
ra_ResponseWindow = 4;
|
||||||
|
#ssb_perRACH_OccasionAndCB_PreamblesPerSSB_PR
|
||||||
|
#1=oneeighth,2=onefourth,3=half,4=one,5=two,6=four,7=eight,8=sixteen
|
||||||
|
ssb_perRACH_OccasionAndCB_PreamblesPerSSB_PR = 4;
|
||||||
|
#oneHalf (0..15) 4,8,12,16,...60,64
|
||||||
|
ssb_perRACH_OccasionAndCB_PreamblesPerSSB = 14;
|
||||||
|
#ra_ContentionResolutionTimer
|
||||||
|
#(0..7) 8,16,24,32,40,48,56,64
|
||||||
|
ra_ContentionResolutionTimer = 7;
|
||||||
|
rsrp_ThresholdSSB = 19;
|
||||||
|
#prach-RootSequenceIndex_PR
|
||||||
|
#1 = 839, 2 = 139
|
||||||
|
prach_RootSequenceIndex_PR = 2;
|
||||||
|
prach_RootSequenceIndex = 1;
|
||||||
|
# SCS for msg1, can only be 15 for 30 kHz < 6 GHz, takes precendence over the one derived from prach-ConfigIndex
|
||||||
|
#
|
||||||
|
msg1_SubcarrierSpacing = 1,
|
||||||
|
# restrictedSetConfig
|
||||||
|
# 0=unrestricted, 1=restricted type A, 2=restricted type B
|
||||||
|
restrictedSetConfig = 0,
|
||||||
|
|
||||||
|
msg3_DeltaPreamble = 1;
|
||||||
|
p0_NominalWithGrant =-90;
|
||||||
|
|
||||||
|
# pucch-ConfigCommon setup :
|
||||||
|
# pucchGroupHopping
|
||||||
|
# 0 = neither, 1= group hopping, 2=sequence hopping
|
||||||
|
pucchGroupHopping = 0;
|
||||||
|
hoppingId = 40;
|
||||||
|
p0_nominal = -90;
|
||||||
|
# ssb_PositionsInBurs_BitmapPR
|
||||||
|
# 1=short, 2=medium, 3=long
|
||||||
|
ssb_PositionsInBurst_PR = 2;
|
||||||
|
ssb_PositionsInBurst_Bitmap = 1;
|
||||||
|
|
||||||
|
# ssb_periodicityServingCell
|
||||||
|
# 0 = ms5, 1=ms10, 2=ms20, 3=ms40, 4=ms80, 5=ms160, 6=spare2, 7=spare1
|
||||||
|
ssb_periodicityServingCell = 2;
|
||||||
|
|
||||||
|
# dmrs_TypeA_position
|
||||||
|
# 0 = pos2, 1 = pos3
|
||||||
|
dmrs_TypeA_Position = 0;
|
||||||
|
|
||||||
|
# subcarrierSpacing
|
||||||
|
# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
|
||||||
|
subcarrierSpacing = 1;
|
||||||
|
|
||||||
|
|
||||||
|
#tdd-UL-DL-ConfigurationCommon
|
||||||
|
# subcarrierSpacing
|
||||||
|
# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
|
||||||
|
referenceSubcarrierSpacing = 1;
|
||||||
|
# pattern1
|
||||||
|
# dl_UL_TransmissionPeriodicity
|
||||||
|
# 0=ms0p5, 1=ms0p625, 2=ms1, 3=ms1p25, 4=ms2, 5=ms2p5, 6=ms5, 7=ms10
|
||||||
|
dl_UL_TransmissionPeriodicity = 6;
|
||||||
|
nrofDownlinkSlots = 7;
|
||||||
|
nrofDownlinkSymbols = 6;
|
||||||
|
nrofUplinkSlots = 2;
|
||||||
|
nrofUplinkSymbols = 4;
|
||||||
|
|
||||||
|
ssPBCH_BlockPower = -25;
|
||||||
|
}
|
||||||
|
|
||||||
|
);
|
||||||
|
|
||||||
|
# Dedicated Serving Cell Configuration
|
||||||
|
servingCellConfigDedicated = ({
|
||||||
|
# BWP-Downlink
|
||||||
|
# BWP 1 Configuration
|
||||||
|
dl_bwp-Id_1 = 1;
|
||||||
|
dl_bwp1_locationAndBandwidth = 28875; // RBstart=0, L=106 (40 MHz BW)
|
||||||
|
# subcarrierSpacing
|
||||||
|
# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
|
||||||
|
dl_bwp1_subcarrierSpacing = 1;
|
||||||
|
|
||||||
|
# BWP 2 Configuration
|
||||||
|
dl_bwp-Id_2 = 2;
|
||||||
|
dl_bwp2_locationAndBandwidth = 13750; // RBstart=0, L=51 (20 MHz BW)
|
||||||
|
# subcarrierSpacing
|
||||||
|
# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
|
||||||
|
dl_bwp2_subcarrierSpacing = 1;
|
||||||
|
|
||||||
|
# BWP 3 Configuration
|
||||||
|
dl_bwp-Id_3 = 3;
|
||||||
|
dl_bwp3_locationAndBandwidth = 6325; // RBstart=0, L=24 (10 MHz BW)
|
||||||
|
# subcarrierSpacing
|
||||||
|
# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
|
||||||
|
dl_bwp3_subcarrierSpacing = 1;
|
||||||
|
|
||||||
|
firstActiveDownlinkBWP-Id = 1; #BWP-Id
|
||||||
|
defaultDownlinkBWP-Id = 1; #BWP-Id
|
||||||
|
|
||||||
|
# bwp-InactivityTimer ENUMERATED {ms2, ms3, ms4, ms5, ms6, ms8, ms10, ms20, ms30,
|
||||||
|
# ms40,ms50, ms60, ms80,ms100, ms200,ms300, ms500,
|
||||||
|
# ms750, ms1280, ms1920, ms2560, spare10, spare9, spare8,
|
||||||
|
# spare7, spare6, spare5, spare4, spare3, spare2, spare1 }
|
||||||
|
|
||||||
|
# UplinkConfig
|
||||||
|
# BWP-Uplink
|
||||||
|
# BWP 1 Configuration
|
||||||
|
ul_bwp-Id_1 = 1;
|
||||||
|
ul_bwp1_locationAndBandwidth = 28875; // RBstart=0, L=106 (40 MHz BW)
|
||||||
|
# subcarrierSpacing
|
||||||
|
# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
|
||||||
|
ul_bwp1_subcarrierSpacing = 1;
|
||||||
|
|
||||||
|
# BWP 2 Configuration
|
||||||
|
ul_bwp-Id_2 = 2;
|
||||||
|
ul_bwp2_locationAndBandwidth = 13750; // RBstart=0, L=51 (20 MHz BW)
|
||||||
|
# subcarrierSpacing
|
||||||
|
# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
|
||||||
|
ul_bwp2_subcarrierSpacing = 1;
|
||||||
|
|
||||||
|
# BWP 3 Configuration
|
||||||
|
ul_bwp-Id_3 = 3;
|
||||||
|
ul_bwp3_locationAndBandwidth = 6325; // RBstart=0, L=24 (10 MHz BW)
|
||||||
|
# subcarrierSpacing
|
||||||
|
# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
|
||||||
|
ul_bwp3_subcarrierSpacing = 1;
|
||||||
|
|
||||||
|
firstActiveUplinkBWP-Id = 1; #BWP-Id
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
# ------- SCTP definitions
|
||||||
|
SCTP :
|
||||||
|
{
|
||||||
|
# Number of streams to use in input/output
|
||||||
|
SCTP_INSTREAMS = 2;
|
||||||
|
SCTP_OUTSTREAMS = 2;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
////////// AMF parameters:
|
||||||
|
amf_ip_address = ( { ipv4 = "172.21.16.136";
|
||||||
|
ipv6 = "192:168:30::17";
|
||||||
|
active = "yes";
|
||||||
|
preference = "ipv4";
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
|
||||||
|
NETWORK_INTERFACES :
|
||||||
|
{
|
||||||
|
GNB_INTERFACE_NAME_FOR_NG_AMF = "demo-oai";
|
||||||
|
GNB_IPV4_ADDRESS_FOR_NG_AMF = "172.21.16.137/24";
|
||||||
|
GNB_INTERFACE_NAME_FOR_NGU = "demo-oai";
|
||||||
|
GNB_IPV4_ADDRESS_FOR_NGU = "172.21.16.137/24";
|
||||||
|
GNB_PORT_FOR_S1U = 2152; # Spec 2152
|
||||||
|
};
|
||||||
|
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
MACRLCs = (
|
||||||
|
{
|
||||||
|
num_cc = 1;
|
||||||
|
tr_s_preference = "local_L1";
|
||||||
|
tr_n_preference = "local_RRC";
|
||||||
|
pusch_TargetSNRx10 = 200;
|
||||||
|
pucch_TargetSNRx10 = 200;
|
||||||
|
ulsch_max_frame_inactivity = 0;
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
L1s = (
|
||||||
|
{
|
||||||
|
num_cc = 1;
|
||||||
|
tr_n_preference = "local_mac";
|
||||||
|
prach_dtx_threshold = 120;
|
||||||
|
pucch0_dtx_threshold = 100;
|
||||||
|
ofdm_offset_divisor = 8; #set this to UINT_MAX for offset 0
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
RUs = (
|
||||||
|
{
|
||||||
|
local_rf = "yes"
|
||||||
|
nb_tx = 1
|
||||||
|
nb_rx = 1
|
||||||
|
att_tx = 10;
|
||||||
|
att_rx = 10;
|
||||||
|
bands = [78];
|
||||||
|
max_pdschReferenceSignalPower = -27;
|
||||||
|
max_rxgain = 114;
|
||||||
|
eNB_instances = [0];
|
||||||
|
#beamforming 1x4 matrix:
|
||||||
|
bf_weights = [0x00007fff, 0x0000, 0x0000, 0x0000];
|
||||||
|
clock_src = "internal";
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
THREAD_STRUCT = (
|
||||||
|
{
|
||||||
|
#three config for level of parallelism "PARALLEL_SINGLE_THREAD", "PARALLEL_RU_L1_SPLIT", or "PARALLEL_RU_L1_TRX_SPLIT"
|
||||||
|
parallel_config = "PARALLEL_SINGLE_THREAD";
|
||||||
|
#two option for worker "WORKER_DISABLE" or "WORKER_ENABLE"
|
||||||
|
worker_config = "WORKER_ENABLE";
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
rfsimulator :
|
||||||
|
{
|
||||||
|
serveraddr = "server";
|
||||||
|
serverport = "4043";
|
||||||
|
options = (); #("saviq"); or/and "chanmod"
|
||||||
|
modelname = "AWGN";
|
||||||
|
IQfile = "/tmp/rfsimulator.iqs";
|
||||||
|
};
|
||||||
|
|
||||||
|
security = {
|
||||||
|
# preferred ciphering algorithms
|
||||||
|
# the first one of the list that an UE supports in chosen
|
||||||
|
# valid values: nea0, nea1, nea2, nea3
|
||||||
|
ciphering_algorithms = ( "nea0" );
|
||||||
|
|
||||||
|
# preferred integrity algorithms
|
||||||
|
# the first one of the list that an UE supports in chosen
|
||||||
|
# valid values: nia0, nia1, nia2, nia3
|
||||||
|
integrity_algorithms = ( "nia2", "nia0" );
|
||||||
|
|
||||||
|
# setting 'drb_ciphering' to "no" disables ciphering for DRBs, no matter
|
||||||
|
# what 'ciphering_algorithms' configures; same thing for 'drb_integrity'
|
||||||
|
drb_ciphering = "yes";
|
||||||
|
drb_integrity = "no";
|
||||||
|
};
|
||||||
|
|
||||||
|
log_config :
|
||||||
|
{
|
||||||
|
global_log_level ="info";
|
||||||
|
hw_log_level ="info";
|
||||||
|
phy_log_level ="info";
|
||||||
|
mac_log_level ="info";
|
||||||
|
rlc_log_level ="info";
|
||||||
|
pdcp_log_level ="info";
|
||||||
|
rrc_log_level ="info";
|
||||||
|
ngap_log_level ="debug";
|
||||||
|
f1ap_log_level ="debug";
|
||||||
|
};
|
||||||
|
|
||||||
@@ -311,6 +311,8 @@ class EPCManagement():
|
|||||||
tmp = str(response[0],'utf-8')
|
tmp = str(response[0],'utf-8')
|
||||||
self.MmeIPAddress = tmp.rstrip()
|
self.MmeIPAddress = tmp.rstrip()
|
||||||
logging.debug('AMF IP Address ' + self.MmeIPAddress)
|
logging.debug('AMF IP Address ' + self.MmeIPAddress)
|
||||||
|
else:
|
||||||
|
logging.error('no container with name oai-amf found, could not retrieve AMF IP address')
|
||||||
mySSH.close()
|
mySSH.close()
|
||||||
|
|
||||||
def CheckHSSProcess(self, status_queue):
|
def CheckHSSProcess(self, status_queue):
|
||||||
|
|||||||
+8
-1
@@ -102,7 +102,7 @@ def AssignParams(params_dict):
|
|||||||
|
|
||||||
|
|
||||||
def GetParametersFromXML(action):
|
def GetParametersFromXML(action):
|
||||||
if action == 'Build_eNB' or action == 'Build_Image':
|
if action == 'Build_eNB' or action == 'Build_Image' or action == 'Build_Proxy':
|
||||||
RAN.Build_eNB_args=test.findtext('Build_eNB_args')
|
RAN.Build_eNB_args=test.findtext('Build_eNB_args')
|
||||||
CONTAINERS.imageKind=test.findtext('kind')
|
CONTAINERS.imageKind=test.findtext('kind')
|
||||||
forced_workspace_cleanup = test.findtext('forced_workspace_cleanup')
|
forced_workspace_cleanup = test.findtext('forced_workspace_cleanup')
|
||||||
@@ -138,6 +138,9 @@ def GetParametersFromXML(action):
|
|||||||
RAN.backgroundBuild=True
|
RAN.backgroundBuild=True
|
||||||
else:
|
else:
|
||||||
RAN.backgroundBuild=False
|
RAN.backgroundBuild=False
|
||||||
|
proxy_commit = test.findtext('proxy_commit')
|
||||||
|
if proxy_commit is not None:
|
||||||
|
CONTAINERS.proxyCommit = proxy_commit
|
||||||
|
|
||||||
elif action == 'WaitEndBuild_eNB':
|
elif action == 'WaitEndBuild_eNB':
|
||||||
RAN.Build_eNB_args=test.findtext('Build_eNB_args')
|
RAN.Build_eNB_args=test.findtext('Build_eNB_args')
|
||||||
@@ -915,10 +918,14 @@ elif re.match('^TesteNB$', mode, re.IGNORECASE) or re.match('^TestUE$', mode, re
|
|||||||
HTML=ldpc.Run_PhySim(HTML,CONST,id)
|
HTML=ldpc.Run_PhySim(HTML,CONST,id)
|
||||||
elif action == 'Build_Image':
|
elif action == 'Build_Image':
|
||||||
CONTAINERS.BuildImage(HTML)
|
CONTAINERS.BuildImage(HTML)
|
||||||
|
elif action == 'Build_Proxy':
|
||||||
|
CONTAINERS.BuildProxy(HTML)
|
||||||
elif action == 'Copy_Image_to_Test':
|
elif action == 'Copy_Image_to_Test':
|
||||||
CONTAINERS.Copy_Image_to_Test_Server(HTML)
|
CONTAINERS.Copy_Image_to_Test_Server(HTML)
|
||||||
elif action == 'Deploy_Object':
|
elif action == 'Deploy_Object':
|
||||||
CONTAINERS.DeployObject(HTML, EPC)
|
CONTAINERS.DeployObject(HTML, EPC)
|
||||||
|
if CONTAINERS.exitStatus==1:
|
||||||
|
RAN.prematureExit = True
|
||||||
elif action == 'Undeploy_Object':
|
elif action == 'Undeploy_Object':
|
||||||
CONTAINERS.UndeployObject(HTML, RAN)
|
CONTAINERS.UndeployObject(HTML, RAN)
|
||||||
elif action == 'Cppcheck_Analysis':
|
elif action == 'Cppcheck_Analysis':
|
||||||
|
|||||||
@@ -60,7 +60,7 @@ class SSHConnection():
|
|||||||
count = 0
|
count = 0
|
||||||
connect_status = False
|
connect_status = False
|
||||||
while count < 4:
|
while count < 4:
|
||||||
self.ssh = pexpect.spawn('ssh -o PubkeyAuthentication=no {}@{}'.format(username,ipaddress))
|
self.ssh = pexpect.spawn('ssh -o PubkeyAuthentication=yes {}@{}'.format(username,ipaddress))
|
||||||
# Longer timeout at connection due to asterix slowness
|
# Longer timeout at connection due to asterix slowness
|
||||||
self.ssh.timeout = 25
|
self.ssh.timeout = 25
|
||||||
self.sshresponse = self.ssh.expect(['Are you sure you want to continue connecting (yes/no)?', 'password:', 'Last login', pexpect.EOF, pexpect.TIMEOUT])
|
self.sshresponse = self.ssh.expect(['Are you sure you want to continue connecting (yes/no)?', 'password:', 'Last login', pexpect.EOF, pexpect.TIMEOUT])
|
||||||
@@ -84,14 +84,11 @@ class SSHConnection():
|
|||||||
else:
|
else:
|
||||||
logging.debug('self.sshresponse = ' + str(self.sshresponse))
|
logging.debug('self.sshresponse = ' + str(self.sshresponse))
|
||||||
elif self.sshresponse == 2:
|
elif self.sshresponse == 2:
|
||||||
# Checking if we are really on the remote client defined by its IP address
|
# We directly ended up on the remote server because of pubkey auth
|
||||||
self.command('stdbuf -o0 ifconfig | egrep --color=never "inet addr:|inet "', prompt, 5)
|
count = 10
|
||||||
result = re.search(str(ipaddress), str(self.ssh.before))
|
connect_status = True
|
||||||
if result is None:
|
# this expect() seems to be necessary to advance the read buffer until the prompt, or getBefore() will not return the last command
|
||||||
self.close()
|
self.sshresponse = self.ssh.expect([prompt])
|
||||||
else:
|
|
||||||
count = 10
|
|
||||||
connect_status = True
|
|
||||||
else:
|
else:
|
||||||
# debug output
|
# debug output
|
||||||
logging.debug(str(self.ssh.before))
|
logging.debug(str(self.ssh.before))
|
||||||
@@ -272,4 +269,4 @@ class SSHConnection():
|
|||||||
sys.exit('SCP failed')
|
sys.exit('SCP failed')
|
||||||
|
|
||||||
def getBefore(self):
|
def getBefore(self):
|
||||||
return str(self.ssh.before)
|
return self.ssh.before.decode('utf-8')
|
||||||
|
|||||||
@@ -1,3 +1,4 @@
|
|||||||
|
- Build_Proxy
|
||||||
- Build_PhySim
|
- Build_PhySim
|
||||||
- Run_PhySim
|
- Run_PhySim
|
||||||
- Build_eNB
|
- Build_eNB
|
||||||
|
|||||||
@@ -0,0 +1,42 @@
|
|||||||
|
<!--
|
||||||
|
|
||||||
|
Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
|
||||||
|
contributor license agreements. See the NOTICE file distributed with
|
||||||
|
this work for additional information regarding copyright ownership.
|
||||||
|
The OpenAirInterface Software Alliance licenses this file to You under
|
||||||
|
the OAI Public License, Version 1.1 (the "License"); you may not use this file
|
||||||
|
except in compliance with the License.
|
||||||
|
You may obtain a copy of the License at
|
||||||
|
|
||||||
|
http://www.openairinterface.org/?page_id=698
|
||||||
|
|
||||||
|
Unless required by applicable law or agreed to in writing, software
|
||||||
|
distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
See the License for the specific language governing permissions and
|
||||||
|
limitations under the License.
|
||||||
|
|
||||||
|
For more information about the OpenAirInterface (OAI) Software Alliance:
|
||||||
|
contact@openairinterface.org
|
||||||
|
|
||||||
|
-->
|
||||||
|
<testCaseList>
|
||||||
|
<htmlTabRef>l2sim-5gnr-proxy-build</htmlTabRef>
|
||||||
|
<htmlTabName>Build L2sim proxy image</htmlTabName>
|
||||||
|
<htmlTabIcon>wrench</htmlTabIcon>
|
||||||
|
<repeatCount>1</repeatCount>
|
||||||
|
<TestCaseRequestedList>
|
||||||
|
000001
|
||||||
|
</TestCaseRequestedList>
|
||||||
|
<TestCaseExclusionList></TestCaseExclusionList>
|
||||||
|
|
||||||
|
<testCase id="000001">
|
||||||
|
<class>Build_Proxy</class>
|
||||||
|
<desc>Build L2sim Proxy Image</desc>
|
||||||
|
<eNB_instance>1</eNB_instance>
|
||||||
|
<eNB_serverId>1</eNB_serverId>
|
||||||
|
<forced_workspace_cleanup>True</forced_workspace_cleanup>
|
||||||
|
<proxy_commit>56cfdc0</proxy_commit>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
</testCaseList>
|
||||||
@@ -53,7 +53,6 @@
|
|||||||
<class>Initialize_UE</class>
|
<class>Initialize_UE</class>
|
||||||
<desc>Initialize Quectel</desc>
|
<desc>Initialize Quectel</desc>
|
||||||
<id>idefix</id>
|
<id>idefix</id>
|
||||||
<UE_Trace>yes</UE_Trace>
|
|
||||||
</testCase>
|
</testCase>
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,168 @@
|
|||||||
|
<!--
|
||||||
|
|
||||||
|
Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
|
||||||
|
contributor license agreements. See the NOTICE file distributed with
|
||||||
|
this work for additional information regarding copyright ownership.
|
||||||
|
The OpenAirInterface Software Alliance licenses this file to You under
|
||||||
|
the OAI Public License, Version 1.1 (the "License"); you may not use this file
|
||||||
|
except in compliance with the License.
|
||||||
|
You may obtain a copy of the License at
|
||||||
|
|
||||||
|
http://www.openairinterface.org/?page_id=698
|
||||||
|
|
||||||
|
Unless required by applicable law or agreed to in writing, software
|
||||||
|
distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
See the License for the specific language governing permissions and
|
||||||
|
limitations under the License.
|
||||||
|
|
||||||
|
For more information about the OpenAirInterface (OAI) Software Alliance:
|
||||||
|
contact@openairinterface.org
|
||||||
|
|
||||||
|
-->
|
||||||
|
<testCaseList>
|
||||||
|
<htmlTabRef>TEST-SA-FR1-B200</htmlTabRef>
|
||||||
|
<htmlTabName>SA SanityCheck with QUECTEL</htmlTabName>
|
||||||
|
<htmlTabIcon>tasks</htmlTabIcon>
|
||||||
|
<repeatCount>1</repeatCount>
|
||||||
|
<TestCaseRequestedList>
|
||||||
|
010002
|
||||||
|
030000
|
||||||
|
030101
|
||||||
|
000001
|
||||||
|
010000
|
||||||
|
000001
|
||||||
|
050000
|
||||||
|
050001
|
||||||
|
010002
|
||||||
|
000001
|
||||||
|
030201
|
||||||
|
</TestCaseRequestedList>
|
||||||
|
<!--
|
||||||
|
070001
|
||||||
|
070000
|
||||||
|
070002
|
||||||
|
050002
|
||||||
|
050003
|
||||||
|
-->
|
||||||
|
<TestCaseExclusionList></TestCaseExclusionList>
|
||||||
|
|
||||||
|
<testCase id="010000">
|
||||||
|
<class>Initialize_UE</class>
|
||||||
|
<desc>Initialize Quectel</desc>
|
||||||
|
<id>idefix</id>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
|
||||||
|
<testCase id="010002">
|
||||||
|
<class>Terminate_UE</class>
|
||||||
|
<desc>Terminate Quectel</desc>
|
||||||
|
<id>idefix</id>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
<testCase id="030000">
|
||||||
|
<class>Copy_Image_to_Test</class>
|
||||||
|
<desc>Copy gNB image to test server</desc>
|
||||||
|
<image_name>oai-gnb</image_name>
|
||||||
|
<registry_svr_id>1</registry_svr_id>
|
||||||
|
<test_svr_id>0</test_svr_id>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
<testCase id="030101">
|
||||||
|
<class>Deploy_Object</class>
|
||||||
|
<desc>Deploy gNB (TDD/Band78/40MHz/B200) in a container</desc>
|
||||||
|
<yaml_path>ci-scripts/yaml_files/sa_b200_gnb</yaml_path>
|
||||||
|
<eNB_instance>0</eNB_instance>
|
||||||
|
<eNB_serverId>0</eNB_serverId>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
<testCase id="000001">
|
||||||
|
<class>IdleSleep</class>
|
||||||
|
<desc>Sleep</desc>
|
||||||
|
<idle_sleep_time_in_sec>5</idle_sleep_time_in_sec>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
<testCase id="000002">
|
||||||
|
<class>IdleSleep</class>
|
||||||
|
<desc>Sleep</desc>
|
||||||
|
<idle_sleep_time_in_sec>20</idle_sleep_time_in_sec>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
|
||||||
|
<testCase id="050000">
|
||||||
|
<class>Ping</class>
|
||||||
|
<desc>Ping: 20pings in 20sec</desc>
|
||||||
|
<id>idefix</id>
|
||||||
|
<ping_args>-c 20</ping_args>
|
||||||
|
<ping_packetloss_threshold>1</ping_packetloss_threshold>
|
||||||
|
<ping_rttavg_threshold>15</ping_rttavg_threshold>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
<testCase id="050001">
|
||||||
|
<class>Ping</class>
|
||||||
|
<desc>Ping: 100pings in 20sec</desc>
|
||||||
|
<id>idefix</id>
|
||||||
|
<ping_args>-c 100 -i 0.2</ping_args>
|
||||||
|
<ping_packetloss_threshold>1</ping_packetloss_threshold>
|
||||||
|
<ping_rttavg_threshold>15</ping_rttavg_threshold>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
<testCase id="050002">
|
||||||
|
<class>Ping</class>
|
||||||
|
<desc>Ping: 20pings in 20sec</desc>
|
||||||
|
<id>idefix</id>
|
||||||
|
<ping_args>-c 20</ping_args>
|
||||||
|
<ping_packetloss_threshold>1</ping_packetloss_threshold>
|
||||||
|
<ping_rttavg_threshold>15</ping_rttavg_threshold>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
<testCase id="050003">
|
||||||
|
<class>Ping</class>
|
||||||
|
<desc>Ping: 100pings in 20sec</desc>
|
||||||
|
<id>idefix</id>
|
||||||
|
<ping_args>-c 100 -i 0.2</ping_args>
|
||||||
|
<ping_packetloss_threshold>1</ping_packetloss_threshold>
|
||||||
|
<ping_rttavg_threshold>15</ping_rttavg_threshold>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
<testCase id="070000">
|
||||||
|
<class>Iperf</class>
|
||||||
|
<desc>iperf (DL/125Mbps/UDP)(60 sec)(single-ue profile)</desc>
|
||||||
|
<iperf_args>-u -b 125M -t 60 -i 1 -fm</iperf_args>
|
||||||
|
<direction>DL</direction>
|
||||||
|
<id>idefix</id>
|
||||||
|
<iperf_packetloss_threshold>25</iperf_packetloss_threshold>
|
||||||
|
<iperf_bitrate_threshold>80</iperf_bitrate_threshold>
|
||||||
|
<iperf_profile>single-ue</iperf_profile>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
<testCase id="070001">
|
||||||
|
<class>Iperf</class>
|
||||||
|
<desc>iperf (UL/8Mbps/UDP)(60 sec)(single-ue profile)</desc>
|
||||||
|
<iperf_args>-u -b 8M -t 60 -i 1 -fm</iperf_args>
|
||||||
|
<direction>UL</direction>
|
||||||
|
<id>idefix</id>
|
||||||
|
<iperf_packetloss_threshold>1</iperf_packetloss_threshold>
|
||||||
|
<iperf_bitrate_threshold>95</iperf_bitrate_threshold>
|
||||||
|
<iperf_profile>single-ue</iperf_profile>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
<testCase id="070002">
|
||||||
|
<class>Iperf</class>
|
||||||
|
<desc>iperf (BIDIR TCP)(10 sec)(single-ue profile)</desc>
|
||||||
|
<iperf_args>-t 10 --bidir</iperf_args>
|
||||||
|
<direction>BIDIR</direction>
|
||||||
|
<id>idefix</id>
|
||||||
|
<iperf_profile>single-ue</iperf_profile>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
<testCase id="030201">
|
||||||
|
<class>Undeploy_Object</class>
|
||||||
|
<desc>Undeploy gNB</desc>
|
||||||
|
<yaml_path>ci-scripts/yaml_files/sa_b200_gnb</yaml_path>
|
||||||
|
<eNB_instance>0</eNB_instance>
|
||||||
|
<eNB_serverId>0</eNB_serverId>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
</testCaseList>
|
||||||
|
|
||||||
@@ -0,0 +1,42 @@
|
|||||||
|
<!--
|
||||||
|
|
||||||
|
Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
|
||||||
|
contributor license agreements. See the NOTICE file distributed with
|
||||||
|
this work for additional information regarding copyright ownership.
|
||||||
|
The OpenAirInterface Software Alliance licenses this file to You under
|
||||||
|
the OAI Public License, Version 1.1 (the "License"); you may not use this file
|
||||||
|
except in compliance with the License.
|
||||||
|
You may obtain a copy of the License at
|
||||||
|
|
||||||
|
http://www.openairinterface.org/?page_id=698
|
||||||
|
|
||||||
|
Unless required by applicable law or agreed to in writing, software
|
||||||
|
distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
See the License for the specific language governing permissions and
|
||||||
|
limitations under the License.
|
||||||
|
|
||||||
|
For more information about the OpenAirInterface (OAI) Software Alliance:
|
||||||
|
contact@openairinterface.org
|
||||||
|
|
||||||
|
-->
|
||||||
|
<testCaseList>
|
||||||
|
<htmlTabRef>TEST-SA-FR1-B200-terminate</htmlTabRef>
|
||||||
|
<htmlTabName>SA tear-down in case of problem</htmlTabName>
|
||||||
|
<htmlTabIcon>tasks</htmlTabIcon>
|
||||||
|
<repeatCount>1</repeatCount>
|
||||||
|
<TestCaseRequestedList>
|
||||||
|
030201
|
||||||
|
</TestCaseRequestedList>
|
||||||
|
<TestCaseExclusionList></TestCaseExclusionList>
|
||||||
|
|
||||||
|
<testCase id="030201">
|
||||||
|
<class>Undeploy_Object</class>
|
||||||
|
<desc>Undeploy gNB</desc>
|
||||||
|
<yaml_path>ci-scripts/yaml_files/sa_b200_gnb</yaml_path>
|
||||||
|
<eNB_instance>1</eNB_instance>
|
||||||
|
<eNB_serverId>1</eNB_serverId>
|
||||||
|
<image_tag>sa-test</image_tag>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
</testCaseList>
|
||||||
@@ -0,0 +1,37 @@
|
|||||||
|
<!--
|
||||||
|
|
||||||
|
Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
|
||||||
|
contributor license agreements. See the NOTICE file distributed with
|
||||||
|
this work for additional information regarding copyright ownership.
|
||||||
|
The OpenAirInterface Software Alliance licenses this file to You under
|
||||||
|
the OAI Public License, Version 1.1 (the "License"); you may not use this file
|
||||||
|
except in compliance with the License.
|
||||||
|
You may obtain a copy of the License at
|
||||||
|
|
||||||
|
http://www.openairinterface.org/?page_id=698
|
||||||
|
|
||||||
|
Unless required by applicable law or agreed to in writing, software
|
||||||
|
distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
See the License for the specific language governing permissions and
|
||||||
|
limitations under the License.
|
||||||
|
|
||||||
|
For more information about the OpenAirInterface (OAI) Software Alliance:
|
||||||
|
contact@openairinterface.org
|
||||||
|
|
||||||
|
-->
|
||||||
|
<testCaseList>
|
||||||
|
<htmlTabRef>5gc-closure</htmlTabRef>
|
||||||
|
<htmlTabName>5GC-Closure</htmlTabName>
|
||||||
|
<htmlTabIcon>log-out</htmlTabIcon>
|
||||||
|
<TestCaseRequestedList>
|
||||||
|
060000
|
||||||
|
</TestCaseRequestedList>
|
||||||
|
<TestCaseExclusionList></TestCaseExclusionList>
|
||||||
|
|
||||||
|
<testCase id="060000">
|
||||||
|
<class>Terminate_5GCN</class>
|
||||||
|
<desc>Terminate 5GC</desc>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
</testCaseList>
|
||||||
@@ -0,0 +1,38 @@
|
|||||||
|
<!--
|
||||||
|
|
||||||
|
Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
|
||||||
|
contributor license agreements. See the NOTICE file distributed with
|
||||||
|
this work for additional information regarding copyright ownership.
|
||||||
|
The OpenAirInterface Software Alliance licenses this file to You under
|
||||||
|
the OAI Public License, Version 1.1 (the "License"); you may not use this file
|
||||||
|
except in compliance with the License.
|
||||||
|
You may obtain a copy of the License at
|
||||||
|
|
||||||
|
http://www.openairinterface.org/?page_id=698
|
||||||
|
|
||||||
|
Unless required by applicable law or agreed to in writing, software
|
||||||
|
distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
See the License for the specific language governing permissions and
|
||||||
|
limitations under the License.
|
||||||
|
|
||||||
|
For more information about the OpenAirInterface (OAI) Software Alliance:
|
||||||
|
contact@openairinterface.org
|
||||||
|
|
||||||
|
-->
|
||||||
|
<testCaseList>
|
||||||
|
<htmlTabRef>5gc-start-tab</htmlTabRef>
|
||||||
|
<htmlTabName>5GC-Start</htmlTabName>
|
||||||
|
<htmlTabIcon>log-in</htmlTabIcon>
|
||||||
|
<TestCaseRequestedList>
|
||||||
|
000100
|
||||||
|
</TestCaseRequestedList>
|
||||||
|
<TestCaseExclusionList>
|
||||||
|
</TestCaseExclusionList>
|
||||||
|
|
||||||
|
<testCase id="000100">
|
||||||
|
<class>Initialize_5GCN</class>
|
||||||
|
<desc>Initialize 5GC</desc>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
|
</testCaseList>
|
||||||
@@ -26,6 +26,7 @@
|
|||||||
<htmlTabIcon>tasks</htmlTabIcon>
|
<htmlTabIcon>tasks</htmlTabIcon>
|
||||||
<repeatCount>1</repeatCount>
|
<repeatCount>1</repeatCount>
|
||||||
<TestCaseRequestedList>
|
<TestCaseRequestedList>
|
||||||
|
010002
|
||||||
030000
|
030000
|
||||||
040000
|
040000
|
||||||
000002
|
000002
|
||||||
|
|||||||
@@ -26,6 +26,7 @@
|
|||||||
<htmlTabIcon>tasks</htmlTabIcon>
|
<htmlTabIcon>tasks</htmlTabIcon>
|
||||||
<repeatCount>1</repeatCount>
|
<repeatCount>1</repeatCount>
|
||||||
<TestCaseRequestedList>
|
<TestCaseRequestedList>
|
||||||
|
010002
|
||||||
031000
|
031000
|
||||||
041000
|
041000
|
||||||
000002
|
000002
|
||||||
|
|||||||
@@ -26,6 +26,7 @@
|
|||||||
<htmlTabIcon>tasks</htmlTabIcon>
|
<htmlTabIcon>tasks</htmlTabIcon>
|
||||||
<repeatCount>1</repeatCount>
|
<repeatCount>1</repeatCount>
|
||||||
<TestCaseRequestedList>
|
<TestCaseRequestedList>
|
||||||
|
010002
|
||||||
030000
|
030000
|
||||||
040000
|
040000
|
||||||
000002
|
000002
|
||||||
|
|||||||
@@ -26,6 +26,7 @@
|
|||||||
<htmlTabIcon>tasks</htmlTabIcon>
|
<htmlTabIcon>tasks</htmlTabIcon>
|
||||||
<repeatCount>1</repeatCount>
|
<repeatCount>1</repeatCount>
|
||||||
<TestCaseRequestedList>
|
<TestCaseRequestedList>
|
||||||
|
010002
|
||||||
040000
|
040000
|
||||||
000002
|
000002
|
||||||
010000
|
010000
|
||||||
|
|||||||
@@ -26,6 +26,7 @@
|
|||||||
<htmlTabIcon>tasks</htmlTabIcon>
|
<htmlTabIcon>tasks</htmlTabIcon>
|
||||||
<repeatCount>1</repeatCount>
|
<repeatCount>1</repeatCount>
|
||||||
<TestCaseRequestedList>
|
<TestCaseRequestedList>
|
||||||
|
010002
|
||||||
042000
|
042000
|
||||||
000002
|
000002
|
||||||
010000
|
010000
|
||||||
|
|||||||
@@ -26,6 +26,7 @@
|
|||||||
<htmlTabIcon>tasks</htmlTabIcon>
|
<htmlTabIcon>tasks</htmlTabIcon>
|
||||||
<repeatCount>1</repeatCount>
|
<repeatCount>1</repeatCount>
|
||||||
<TestCaseRequestedList>
|
<TestCaseRequestedList>
|
||||||
|
011002
|
||||||
041000
|
041000
|
||||||
000002
|
000002
|
||||||
011000
|
011000
|
||||||
|
|||||||
@@ -26,6 +26,7 @@
|
|||||||
<htmlTabIcon>tasks</htmlTabIcon>
|
<htmlTabIcon>tasks</htmlTabIcon>
|
||||||
<repeatCount>1</repeatCount>
|
<repeatCount>1</repeatCount>
|
||||||
<TestCaseRequestedList>
|
<TestCaseRequestedList>
|
||||||
|
010002
|
||||||
030000
|
030000
|
||||||
000002
|
000002
|
||||||
010000
|
010000
|
||||||
|
|||||||
@@ -26,6 +26,7 @@
|
|||||||
<htmlTabIcon>tasks</htmlTabIcon>
|
<htmlTabIcon>tasks</htmlTabIcon>
|
||||||
<repeatCount>1</repeatCount>
|
<repeatCount>1</repeatCount>
|
||||||
<TestCaseRequestedList>
|
<TestCaseRequestedList>
|
||||||
|
010002
|
||||||
030001
|
030001
|
||||||
000002
|
000002
|
||||||
010000
|
010000
|
||||||
|
|||||||
@@ -0,0 +1,44 @@
|
|||||||
|
version: '3.8'
|
||||||
|
|
||||||
|
services:
|
||||||
|
gnb_mono_tdd:
|
||||||
|
image: oai-gnb:latest
|
||||||
|
privileged: true
|
||||||
|
container_name: sa-b200-gnb
|
||||||
|
environment:
|
||||||
|
USE_SA_TDD_MONO_B2XX: 'yes'
|
||||||
|
USE_B2XX: 'yes'
|
||||||
|
GNB_NAME: gNB-in-docker
|
||||||
|
MCC: '222'
|
||||||
|
MNC: '01'
|
||||||
|
MNC_LENGTH: 2
|
||||||
|
TAC: 1
|
||||||
|
NSSAI_SST: 1
|
||||||
|
NSSAI_SD0: 1
|
||||||
|
AMF_IP_ADDRESS: 172.21.16.136
|
||||||
|
GNB_NGA_IF_NAME: eth0
|
||||||
|
GNB_NGA_IP_ADDRESS: 192.168.68.194
|
||||||
|
GNB_NGU_IF_NAME: eth0
|
||||||
|
GNB_NGU_IP_ADDRESS: 192.168.68.194
|
||||||
|
USE_ADDITIONAL_OPTIONS: --sa -E -q --RUs.[0].sdr_addrs serial=30C51D4 --continuous-tx --log_config.global_log_options level,nocolor,time,line_num,function
|
||||||
|
volumes:
|
||||||
|
- /dev:/dev
|
||||||
|
networks:
|
||||||
|
public_net:
|
||||||
|
ipv4_address: 192.168.68.194
|
||||||
|
#entrypoint: /bin/bash -c "sleep infinity"
|
||||||
|
healthcheck:
|
||||||
|
# pgrep does NOT work
|
||||||
|
test: /bin/bash -c "ps aux | grep -v grep | grep -c softmodem"
|
||||||
|
interval: 10s
|
||||||
|
timeout: 5s
|
||||||
|
retries: 5
|
||||||
|
|
||||||
|
networks:
|
||||||
|
public_net:
|
||||||
|
name: sa-b200-gnb-net
|
||||||
|
ipam:
|
||||||
|
config:
|
||||||
|
- subnet: 192.168.68.192/26
|
||||||
|
driver_opts:
|
||||||
|
com.docker.network.bridge.name: "sa-gnb-net"
|
||||||
@@ -271,6 +271,12 @@ if (SANITIZE_ADDRESS)
|
|||||||
# wrong in the pthread library, or something subtly wrong in this CMakeLists.txt. Use Ubuntu 20.04 instead.
|
# wrong in the pthread library, or something subtly wrong in this CMakeLists.txt. Use Ubuntu 20.04 instead.
|
||||||
endif ()
|
endif ()
|
||||||
|
|
||||||
|
add_boolean_option(SANITIZE_UNDEFINED False "enable the undefined behavior sanitizer (UBSan)")
|
||||||
|
if (SANITIZE_UNDEFINED)
|
||||||
|
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fsanitize=undefined -fno-sanitize-recover=all")
|
||||||
|
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fsanitize=undefined -fno-sanitize-recover=all")
|
||||||
|
endif ()
|
||||||
|
|
||||||
add_definitions("-DASN_DISABLE_OER_SUPPORT")
|
add_definitions("-DASN_DISABLE_OER_SUPPORT")
|
||||||
|
|
||||||
#########################
|
#########################
|
||||||
@@ -1804,7 +1810,15 @@ set(NR_PDCP_SRC
|
|||||||
${OPENAIR2_DIR}/LAYER2/nr_pdcp/nr_pdcp_timer_thread.c
|
${OPENAIR2_DIR}/LAYER2/nr_pdcp/nr_pdcp_timer_thread.c
|
||||||
${OPENAIR2_DIR}/LAYER2/nr_pdcp/nr_pdcp_security_nea2.c
|
${OPENAIR2_DIR}/LAYER2/nr_pdcp/nr_pdcp_security_nea2.c
|
||||||
${OPENAIR2_DIR}/LAYER2/nr_pdcp/nr_pdcp_integrity_nia2.c
|
${OPENAIR2_DIR}/LAYER2/nr_pdcp/nr_pdcp_integrity_nia2.c
|
||||||
|
${OPENAIR2_DIR}/LAYER2/nr_pdcp/nr_pdcp_integrity_nia1.c
|
||||||
${OPENAIR2_DIR}/LAYER2/nr_pdcp/asn1_utils.c
|
${OPENAIR2_DIR}/LAYER2/nr_pdcp/asn1_utils.c
|
||||||
|
#hack: include these files to compile the nr phy simulators
|
||||||
|
#these files should not be here, will be removed at some point when the
|
||||||
|
#computation is done directly inside nr_pdcp_integrity_nia1.c instead
|
||||||
|
#of reusing code of osa_stream_eia.c
|
||||||
|
${OPENAIR2_DIR}/UTIL/OSA/osa_stream_eia.c
|
||||||
|
${OPENAIR2_DIR}/UTIL/OSA/osa_snow3g.c
|
||||||
|
${OPENAIR2_DIR}/UTIL/OSA/osa_rijndael.c
|
||||||
)
|
)
|
||||||
|
|
||||||
set(NR_SDAP_SRC
|
set(NR_SDAP_SRC
|
||||||
|
|||||||
+11
-1
@@ -171,8 +171,12 @@ Options:
|
|||||||
Skip build for shared libraries to reduce compilation time when building frequently for debugging purposes
|
Skip build for shared libraries to reduce compilation time when building frequently for debugging purposes
|
||||||
--ninja
|
--ninja
|
||||||
Tell cmake to use the Ninja build system. Without, will generate make files
|
Tell cmake to use the Ninja build system. Without, will generate make files
|
||||||
|
--sanitize
|
||||||
|
Shortcut for usage of --sanitize-address --sanitize-undefined
|
||||||
--sanitize-address | -fsanitize=address
|
--sanitize-address | -fsanitize=address
|
||||||
Enable the address sanitizer on all targets
|
Enable the address sanitizer on all targets
|
||||||
|
--sanitize-undefined | -fsanitize=undefined
|
||||||
|
Enable the undefined behavior sanitizer on all targets
|
||||||
--ittiSIM
|
--ittiSIM
|
||||||
Makes the itti simulator
|
Makes the itti simulator
|
||||||
-h | --help
|
-h | --help
|
||||||
@@ -451,10 +455,16 @@ function main() {
|
|||||||
CMAKE_CMD="$CMAKE_CMD -GNinja"
|
CMAKE_CMD="$CMAKE_CMD -GNinja"
|
||||||
MAKE_CMD=ninja
|
MAKE_CMD=ninja
|
||||||
shift;;
|
shift;;
|
||||||
|
--sanitize)
|
||||||
|
CMAKE_CMD="$CMAKE_CMD -DSANITIZE_ADDRESS=True -DSANITIZE_UNDEFINED=True"
|
||||||
|
shift;;
|
||||||
--sanitize-address | -fsanitize=address)
|
--sanitize-address | -fsanitize=address)
|
||||||
grep -sq "Ubuntu 18.04" /etc/os-release && echo_error "Bug in OS with this option, see CMakeLists.txt"
|
grep -sq "Ubuntu 18.04" /etc/os-release && echo_error "Bug in OS with this option, see CMakeLists.txt"
|
||||||
CMAKE_CMD="$CMAKE_CMD -DSANITIZE_ADDRESS=True"
|
CMAKE_CMD="$CMAKE_CMD -DSANITIZE_ADDRESS=True"
|
||||||
shift;;
|
shift;;
|
||||||
|
--sanitize-undefined | -fundefined=address)
|
||||||
|
CMAKE_CMD="$CMAKE_CMD -DSANITIZE_UNDEFINED=True"
|
||||||
|
shift;;
|
||||||
--ittiSIM)
|
--ittiSIM)
|
||||||
ittiSIM=1
|
ittiSIM=1
|
||||||
CMAKE_CMD="$CMAKE_CMD -DITTI_SIM=True"
|
CMAKE_CMD="$CMAKE_CMD -DITTI_SIM=True"
|
||||||
|
|||||||
@@ -62,7 +62,7 @@ typedef struct time_stats {
|
|||||||
oai_cputime_t in; /*!< \brief time at measure starting point */
|
oai_cputime_t in; /*!< \brief time at measure starting point */
|
||||||
oai_cputime_t diff; /*!< \brief average difference between time at starting point and time at endpoint*/
|
oai_cputime_t diff; /*!< \brief average difference between time at starting point and time at endpoint*/
|
||||||
oai_cputime_t p_time; /*!< \brief absolute process duration */
|
oai_cputime_t p_time; /*!< \brief absolute process duration */
|
||||||
oai_cputime_t diff_square; /*!< \brief process duration square */
|
double diff_square; /*!< \brief process duration square */
|
||||||
oai_cputime_t max; /*!< \brief maximum difference between time at starting point and time at endpoint*/
|
oai_cputime_t max; /*!< \brief maximum difference between time at starting point and time at endpoint*/
|
||||||
int trials; /*!< \brief number of start point - end point iterations */
|
int trials; /*!< \brief number of start point - end point iterations */
|
||||||
int meas_flag; /*!< \brief 1: stop_meas not called (consecutive calls of start_meas) */
|
int meas_flag; /*!< \brief 1: stop_meas not called (consecutive calls of start_meas) */
|
||||||
@@ -156,7 +156,7 @@ static inline void stop_meas(time_stats_t *ts) {
|
|||||||
ts->diff += (out-ts->in);
|
ts->diff += (out-ts->in);
|
||||||
/// process duration is the difference between two clock points
|
/// process duration is the difference between two clock points
|
||||||
ts->p_time = (out-ts->in);
|
ts->p_time = (out-ts->in);
|
||||||
ts->diff_square += (out-ts->in)*(out-ts->in);
|
ts->diff_square += ((double)out-ts->in)*((double)out-ts->in);
|
||||||
|
|
||||||
if ((out-ts->in) > ts->max)
|
if ((out-ts->in) > ts->max)
|
||||||
ts->max = out-ts->in;
|
ts->max = out-ts->in;
|
||||||
|
|||||||
@@ -71,10 +71,6 @@ reboot
|
|||||||
# https://docs.docker.com/compose/install/
|
# https://docs.docker.com/compose/install/
|
||||||
sudo curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
|
sudo curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
|
||||||
sudo chmod +x /usr/local/bin/docker-compose
|
sudo chmod +x /usr/local/bin/docker-compose
|
||||||
|
|
||||||
docker network create --driver=bridge --subnet=192.168.70.128/26 -o "com.docker.network.bridge.name"="demo-oai" demo-oai-public-net
|
|
||||||
sudo service docker restart
|
|
||||||
|
|
||||||
```
|
```
|
||||||
|
|
||||||
## 2.2 OAI CN5G Setup
|
## 2.2 OAI CN5G Setup
|
||||||
@@ -82,39 +78,36 @@ sudo service docker restart
|
|||||||
```bash
|
```bash
|
||||||
# Git oai-cn5g-fed repository
|
# Git oai-cn5g-fed repository
|
||||||
git clone https://gitlab.eurecom.fr/oai/cn5g/oai-cn5g-fed.git ~/oai-cn5g-fed
|
git clone https://gitlab.eurecom.fr/oai/cn5g/oai-cn5g-fed.git ~/oai-cn5g-fed
|
||||||
cd ~/oai-cn5g-fed
|
|
||||||
git checkout master
|
|
||||||
./scripts/syncComponents.sh --nrf-branch develop --amf-branch develop --smf-branch develop --spgwu-tiny-branch develop --ausf-branch develop --udm-branch develop --udr-branch develop --upf-vpp-branch develop --nssf-branch develop
|
|
||||||
|
|
||||||
|
# Pull docker images
|
||||||
docker pull oaisoftwarealliance/oai-amf:develop
|
docker pull oaisoftwarealliance/oai-amf:develop
|
||||||
docker pull oaisoftwarealliance/oai-nrf:develop
|
docker pull oaisoftwarealliance/oai-nrf:develop
|
||||||
docker pull oaisoftwarealliance/oai-smf:develop
|
docker pull oaisoftwarealliance/oai-smf:develop
|
||||||
docker pull oaisoftwarealliance/oai-udr:develop
|
docker pull oaisoftwarealliance/oai-udr:develop
|
||||||
docker pull oaisoftwarealliance/oai-udm:develop
|
docker pull oaisoftwarealliance/oai-udm:develop
|
||||||
docker pull oaisoftwarealliance/oai-ausf:develop
|
docker pull oaisoftwarealliance/oai-ausf:develop
|
||||||
docker pull oaisoftwarealliance/oai-upf-vpp:develop
|
|
||||||
docker pull oaisoftwarealliance/oai-spgwu-tiny:develop
|
docker pull oaisoftwarealliance/oai-spgwu-tiny:develop
|
||||||
docker pull oaisoftwarealliance/oai-nssf:develop
|
docker pull oaisoftwarealliance/trf-gen-cn5g:latest
|
||||||
|
|
||||||
|
# Tag docker images
|
||||||
docker image tag oaisoftwarealliance/oai-amf:develop oai-amf:develop
|
docker image tag oaisoftwarealliance/oai-amf:develop oai-amf:develop
|
||||||
docker image tag oaisoftwarealliance/oai-nrf:develop oai-nrf:develop
|
docker image tag oaisoftwarealliance/oai-nrf:develop oai-nrf:develop
|
||||||
docker image tag oaisoftwarealliance/oai-smf:develop oai-smf:develop
|
docker image tag oaisoftwarealliance/oai-smf:develop oai-smf:develop
|
||||||
docker image tag oaisoftwarealliance/oai-udr:develop oai-udr:develop
|
docker image tag oaisoftwarealliance/oai-udr:develop oai-udr:develop
|
||||||
docker image tag oaisoftwarealliance/oai-udm:develop oai-udm:develop
|
docker image tag oaisoftwarealliance/oai-udm:develop oai-udm:develop
|
||||||
docker image tag oaisoftwarealliance/oai-ausf:develop oai-ausf:develop
|
docker image tag oaisoftwarealliance/oai-ausf:develop oai-ausf:develop
|
||||||
docker image tag oaisoftwarealliance/oai-upf-vpp:develop oai-upf-vpp:develop
|
|
||||||
docker image tag oaisoftwarealliance/oai-spgwu-tiny:develop oai-spgwu-tiny:develop
|
docker image tag oaisoftwarealliance/oai-spgwu-tiny:develop oai-spgwu-tiny:develop
|
||||||
docker image tag oaisoftwarealliance/oai-nssf:develop oai-nssf:develop
|
docker image tag oaisoftwarealliance/trf-gen-cn5g:latest trf-gen-cn5g:latest
|
||||||
```
|
```
|
||||||
|
|
||||||
## 2.3 OAI CN5G Configuration files
|
## 2.3 OAI CN5G Configuration files
|
||||||
Download and copy the configuration files to ~/oai-cn5g-fed/docker-compose:
|
Download and copy configuration files:
|
||||||
- [docker-compose-basic-nrf.yaml](tutorial_resources/docker-compose-basic-nrf.yaml)
|
- Copy [docker-compose-basic-nrf.yaml](tutorial_resources/docker-compose-basic-nrf.yaml) to `~/oai-cn5g-fed/docker-compose`
|
||||||
- [oai_db.sql](tutorial_resources/oai_db.sql)
|
- Copy [oai_db.sql](tutorial_resources/oai_db.sql) to `~/oai-cn5g-fed/docker-compose/database`
|
||||||
|
|
||||||
Change permissions on oai_db.sql to prevent mysql permission denied error:
|
Change permissions on oai_db.sql to prevent mysql permission denied error:
|
||||||
```bash
|
```bash
|
||||||
chmod 644 ~/oai-cn5g-fed/docker-compose/oai_db.sql
|
chmod 644 ~/oai-cn5g-fed/docker-compose/database/oai_db.sql
|
||||||
```
|
```
|
||||||
|
|
||||||
## 2.4 SIM Card
|
## 2.4 SIM Card
|
||||||
@@ -175,7 +168,7 @@ cd cmake_targets
|
|||||||
|
|
||||||
```bash
|
```bash
|
||||||
cd ~/oai-cn5g-fed/docker-compose
|
cd ~/oai-cn5g-fed/docker-compose
|
||||||
python3 core-network.py --type start-basic --fqdn yes --scenario 1
|
python3 core-network.py --type start-basic --scenario 1
|
||||||
```
|
```
|
||||||
|
|
||||||
## 4.2 Run OAI gNB
|
## 4.2 Run OAI gNB
|
||||||
|
|||||||
@@ -72,10 +72,6 @@ reboot
|
|||||||
# https://docs.docker.com/compose/install/
|
# https://docs.docker.com/compose/install/
|
||||||
sudo curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
|
sudo curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
|
||||||
sudo chmod +x /usr/local/bin/docker-compose
|
sudo chmod +x /usr/local/bin/docker-compose
|
||||||
|
|
||||||
docker network create --driver=bridge --subnet=192.168.70.128/26 -o "com.docker.network.bridge.name"="demo-oai" demo-oai-public-net
|
|
||||||
sudo service docker restart
|
|
||||||
|
|
||||||
```
|
```
|
||||||
|
|
||||||
## 2.2 OAI CN5G Setup
|
## 2.2 OAI CN5G Setup
|
||||||
@@ -83,39 +79,36 @@ sudo service docker restart
|
|||||||
```bash
|
```bash
|
||||||
# Git oai-cn5g-fed repository
|
# Git oai-cn5g-fed repository
|
||||||
git clone https://gitlab.eurecom.fr/oai/cn5g/oai-cn5g-fed.git ~/oai-cn5g-fed
|
git clone https://gitlab.eurecom.fr/oai/cn5g/oai-cn5g-fed.git ~/oai-cn5g-fed
|
||||||
cd ~/oai-cn5g-fed
|
|
||||||
git checkout master
|
|
||||||
./scripts/syncComponents.sh --nrf-branch develop --amf-branch develop --smf-branch develop --spgwu-tiny-branch develop --ausf-branch develop --udm-branch develop --udr-branch develop --upf-vpp-branch develop --nssf-branch develop
|
|
||||||
|
|
||||||
|
# Pull docker images
|
||||||
docker pull oaisoftwarealliance/oai-amf:develop
|
docker pull oaisoftwarealliance/oai-amf:develop
|
||||||
docker pull oaisoftwarealliance/oai-nrf:develop
|
docker pull oaisoftwarealliance/oai-nrf:develop
|
||||||
docker pull oaisoftwarealliance/oai-smf:develop
|
docker pull oaisoftwarealliance/oai-smf:develop
|
||||||
docker pull oaisoftwarealliance/oai-udr:develop
|
docker pull oaisoftwarealliance/oai-udr:develop
|
||||||
docker pull oaisoftwarealliance/oai-udm:develop
|
docker pull oaisoftwarealliance/oai-udm:develop
|
||||||
docker pull oaisoftwarealliance/oai-ausf:develop
|
docker pull oaisoftwarealliance/oai-ausf:develop
|
||||||
docker pull oaisoftwarealliance/oai-upf-vpp:develop
|
|
||||||
docker pull oaisoftwarealliance/oai-spgwu-tiny:develop
|
docker pull oaisoftwarealliance/oai-spgwu-tiny:develop
|
||||||
docker pull oaisoftwarealliance/oai-nssf:develop
|
docker pull oaisoftwarealliance/trf-gen-cn5g:latest
|
||||||
|
|
||||||
|
# Tag docker images
|
||||||
docker image tag oaisoftwarealliance/oai-amf:develop oai-amf:develop
|
docker image tag oaisoftwarealliance/oai-amf:develop oai-amf:develop
|
||||||
docker image tag oaisoftwarealliance/oai-nrf:develop oai-nrf:develop
|
docker image tag oaisoftwarealliance/oai-nrf:develop oai-nrf:develop
|
||||||
docker image tag oaisoftwarealliance/oai-smf:develop oai-smf:develop
|
docker image tag oaisoftwarealliance/oai-smf:develop oai-smf:develop
|
||||||
docker image tag oaisoftwarealliance/oai-udr:develop oai-udr:develop
|
docker image tag oaisoftwarealliance/oai-udr:develop oai-udr:develop
|
||||||
docker image tag oaisoftwarealliance/oai-udm:develop oai-udm:develop
|
docker image tag oaisoftwarealliance/oai-udm:develop oai-udm:develop
|
||||||
docker image tag oaisoftwarealliance/oai-ausf:develop oai-ausf:develop
|
docker image tag oaisoftwarealliance/oai-ausf:develop oai-ausf:develop
|
||||||
docker image tag oaisoftwarealliance/oai-upf-vpp:develop oai-upf-vpp:develop
|
|
||||||
docker image tag oaisoftwarealliance/oai-spgwu-tiny:develop oai-spgwu-tiny:develop
|
docker image tag oaisoftwarealliance/oai-spgwu-tiny:develop oai-spgwu-tiny:develop
|
||||||
docker image tag oaisoftwarealliance/oai-nssf:develop oai-nssf:develop
|
docker image tag oaisoftwarealliance/trf-gen-cn5g:latest trf-gen-cn5g:latest
|
||||||
```
|
```
|
||||||
|
|
||||||
## 2.3 OAI CN5G Configuration files
|
## 2.3 OAI CN5G Configuration files
|
||||||
Download and copy the configuration files to ~/oai-cn5g-fed/docker-compose:
|
Download and copy configuration files:
|
||||||
- [docker-compose-basic-nrf.yaml](tutorial_resources/docker-compose-basic-nrf.yaml)
|
- Copy [docker-compose-basic-nrf.yaml](tutorial_resources/docker-compose-basic-nrf.yaml) to `~/oai-cn5g-fed/docker-compose`
|
||||||
- [oai_db.sql](tutorial_resources/oai_db.sql)
|
- Copy [oai_db.sql](tutorial_resources/oai_db.sql) to `~/oai-cn5g-fed/docker-compose/database`
|
||||||
|
|
||||||
Change permissions on oai_db.sql to prevent mysql permission denied error:
|
Change permissions on oai_db.sql to prevent mysql permission denied error:
|
||||||
```bash
|
```bash
|
||||||
chmod 644 ~/oai-cn5g-fed/docker-compose/oai_db.sql
|
chmod 644 ~/oai-cn5g-fed/docker-compose/database/oai_db.sql
|
||||||
```
|
```
|
||||||
|
|
||||||
## 2.4 SIM Card
|
## 2.4 SIM Card
|
||||||
@@ -193,7 +186,7 @@ The following steps are recommended. Please change the network interface(s) as r
|
|||||||
|
|
||||||
```bash
|
```bash
|
||||||
cd ~/oai-cn5g-fed/docker-compose
|
cd ~/oai-cn5g-fed/docker-compose
|
||||||
python3 core-network.py --type start-basic --fqdn yes --scenario 1
|
python3 core-network.py --type start-basic --scenario 1
|
||||||
```
|
```
|
||||||
|
|
||||||
## 4.2 Run OAI gNB
|
## 4.2 Run OAI gNB
|
||||||
|
|||||||
+10
-7
@@ -9,19 +9,19 @@
|
|||||||
|
|
||||||
| Machine | IP address | Lockable Resource | Function | Connected devices |
|
| Machine | IP address | Lockable Resource | Function | Connected devices |
|
||||||
| ------------- | --------------- | --------------------- | ------------------ | ----------------------------------------------------- |
|
| ------------- | --------------- | --------------------- | ------------------ | ----------------------------------------------------- |
|
||||||
| asterix | 172.21.16.127 | CI-Asterix-Usage | gNB | 173.21.19.14 |
|
| asterix | 172.21.16.127 | CI-Asterix-Usage | gNB (n78) | 173.21.19.14 |
|
||||||
| obelix | 172.21.16.128 | CI-Obelix-Usage | eNB, UE (5G) | 172.21.19.13, X300 (192.168.60.2), B200mini (30C51EB) |
|
| obelix | 172.21.16.128 | CI-Obelix-Usage | eNB (n40, n78), nrUE | 172.21.19.13, X300 (192.168.60.2), B200mini (30C51EB) |
|
||||||
| porcepix | 172.21.16.136 | CI-NSA-MiniBench | Executor, EPC, 5GC | -- |
|
| porcepix | 172.21.16.136 | CI-NSA-MiniBench | Executor, EPC, 5GC | -- |
|
||||||
| nrmodule2 | 172.21.16.139 | CI-NSA-MiniBench | Quectel | Quectel module |
|
| nrmodule2 | 172.21.16.139 | CI-NSA-MiniBench | Quectel | Quectel module |
|
||||||
| nepes | 172.21.16.137 | CI-NSA-MiniBench | gNB | B200mini (30C51D4) |
|
| nepes | 172.21.16.137 | CI-NSA-MiniBench | gNB (n78) | B200mini (30C51D4) |
|
||||||
| caracal | 172.21.16.132 | CI-Caracal | gNB/phytest | N300 (192.168.10.2) |
|
| caracal | 172.21.16.132 | CI-Caracal | gNB/phytest | N300 (192.168.10.2) |
|
||||||
| idefix | 172.21.16.135 | CI-NSA-MiniBench | Quectel | Quectel module |
|
| idefix | 172.21.16.135 | CI-NSA-MiniBench | Quectel | Quectel module |
|
||||||
| amariue | 172.21.16.144 | CI-Amarisoft-UE-Usage | TBD | Amarisoft UE simulator |
|
| amariue | 172.21.16.144 | CI-Amarisoft-UE-Usage | nrUE | Amarisoft UE simulator |
|
||||||
| bellatrix | 192.168.117.115 | CI-RAN-VM-Deployment | Executor | -- |
|
| bellatrix | 192.168.117.115 | CI-RAN-VM-Deployment | Executor | -- |
|
||||||
| nano | 192.168.12.62 | CI-Bench-1-Phones | EPC, adb | 2x COTS (adb) |
|
| nano | 192.168.12.62 | CI-Bench-1-Phones | EPC, adb | 2x COTS (adb) |
|
||||||
| hutch | 192.168.12.19 | CI-Bench-1-Phones | eNB (B7) | B200mini (30C5239) |
|
| hutch | 192.168.12.19 | CI-Bench-1-Phones | eNB (B7) | B200mini (30C5239) |
|
||||||
| starsky | 192.168.12.18 | CI-Bench-1-Phones | eNB (B40) | b200mini (30A3E3C) |
|
| starsky | 192.168.12.18 | CI-Bench-1-Phones | eNB (B40) | b200mini (30A3E3C) |
|
||||||
| carabe | 192.168.12.211 | CI-Bench-2-OAI-Phone | UE 4G (B) | B200mini (30AE8C9) |
|
| carabe | 192.168.12.211 | CI-Bench-2-OAI-Phone | UE (B7UE) | B200mini (30AE8C9) |
|
||||||
|
|
||||||
Note: The available resources, and their current usage, is indicated here:
|
Note: The available resources, and their current usage, is indicated here:
|
||||||
- [Lockable resources of jenkins-oai](https://jenkins-oai.eurecom.fr/lockable-resources/):
|
- [Lockable resources of jenkins-oai](https://jenkins-oai.eurecom.fr/lockable-resources/):
|
||||||
@@ -40,7 +40,7 @@ Note: The available resources, and their current usage, is indicated here:
|
|||||||
|
|
||||||
### OTA Testbench
|
### OTA Testbench
|
||||||
|
|
||||||
[Proper image to be followed up. TBD: add antennas/circulators]
|
**Purpose**: Over-the-air 4G/5G (NSA/SA) tests
|
||||||
|
|
||||||
Note: obelix and porcepix are both used in the OTA testbench and the 5G
|
Note: obelix and porcepix are both used in the OTA testbench and the 5G
|
||||||
NSA/Faraday Cage testbench!
|
NSA/Faraday Cage testbench!
|
||||||
@@ -89,7 +89,10 @@ Webhook
|
|||||||
currently only ping
|
currently only ping
|
||||||
- [RAN-NSA-B200-Module-LTEBOX-Container](https://jenkins-oai.eurecom.fr/job/RAN-NSA-B200-Module-LTEBOX-Container/)
|
- [RAN-NSA-B200-Module-LTEBOX-Container](https://jenkins-oai.eurecom.fr/job/RAN-NSA-B200-Module-LTEBOX-Container/)
|
||||||
- obelix + B200, nepes + B200, idefix + Quectel, porcepix w/ ltebox
|
- obelix + B200, nepes + B200, idefix + Quectel, porcepix w/ ltebox
|
||||||
- basic NSA test, known to be instable
|
- basic NSA test
|
||||||
|
- [RAN-SA-B200-Module-SABOX-Container](https://jenkins-oai.eurecom.fr/job/RAN-SA-B200-Module-SABOX-Container/)
|
||||||
|
- obelix + B200, nepes + B200, idefix + Quectel, porcepix w/ sabox
|
||||||
|
- basic SA test (40 MHz TDD)
|
||||||
- [RAN-PhySim-Cluster](https://jenkins-oai.eurecom.fr/job/RAN-PhySim-Cluster/)
|
- [RAN-PhySim-Cluster](https://jenkins-oai.eurecom.fr/job/RAN-PhySim-Cluster/)
|
||||||
- asterix (`Asterix-OC-oaicicd-session` resource), tests in OpenShift Cluster
|
- asterix (`Asterix-OC-oaicicd-session` resource), tests in OpenShift Cluster
|
||||||
- unitary simulators (`nr_dlsim`, etc.)
|
- unitary simulators (`nr_dlsim`, etc.)
|
||||||
|
|||||||
Binary file not shown.
Binary file not shown.
|
Before Width: | Height: | Size: 90 KiB After Width: | Height: | Size: 90 KiB |
Binary file not shown.
Binary file not shown.
|
Before Width: | Height: | Size: 87 KiB After Width: | Height: | Size: 87 KiB |
@@ -30,7 +30,7 @@
|
|||||||
\draw (obelix) -- (b210o);
|
\draw (obelix) -- (b210o);
|
||||||
\node[above right=0.35cm of faraday.south west] (antn)
|
\node[above right=0.35cm of faraday.south west] (antn)
|
||||||
{\includegraphics[width=0.3cm]{antenna}};
|
{\includegraphics[width=0.3cm]{antenna}};
|
||||||
\draw (b210n) -| node [pos=0.2, duplexer] {B78} (antn);
|
\draw (b210n) -| node [pos=0.2, duplexer] {n78} (antn);
|
||||||
|
|
||||||
\node[left=5cm of faraday, label=above:porcepix] (porcepix)
|
\node[left=5cm of faraday, label=above:porcepix] (porcepix)
|
||||||
{\includegraphics[width=1.2cm]{server}};
|
{\includegraphics[width=1.2cm]{server}};
|
||||||
|
|||||||
Binary file not shown.
Binary file not shown.
|
Before Width: | Height: | Size: 88 KiB After Width: | Height: | Size: 94 KiB |
@@ -21,7 +21,7 @@
|
|||||||
edge (porcepix);
|
edge (porcepix);
|
||||||
\node[right=0.3cm of asterix, label=above:N310] (n310a)
|
\node[right=0.3cm of asterix, label=above:N310] (n310a)
|
||||||
{\includegraphics[width=1.5cm]{n310}} edge (asterix);
|
{\includegraphics[width=1.5cm]{n310}} edge (asterix);
|
||||||
\node[right=.2cm of n310a, duplexer] (b78o) {B78} edge (n310a);
|
\node[right=.2cm of n310a, duplexer] (b78o) {n78} edge (n310a);
|
||||||
\node[below right=-0.1cm and 0.35cm of b78o.east] (anto1)
|
\node[below right=-0.1cm and 0.35cm of b78o.east] (anto1)
|
||||||
{\includegraphics[width=0.3cm]{antenna}} edge (b78o);
|
{\includegraphics[width=0.3cm]{antenna}} edge (b78o);
|
||||||
\node[above right=-0.1cm and 0.35cm of b78o.east] (anto2)
|
\node[above right=-0.1cm and 0.35cm of b78o.east] (anto2)
|
||||||
@@ -32,20 +32,20 @@
|
|||||||
edge (porcepix);
|
edge (porcepix);
|
||||||
\node[above right=-0.5cm and 0.3cm of obelix, label=above:N310] (n310o)
|
\node[above right=-0.5cm and 0.3cm of obelix, label=above:N310] (n310o)
|
||||||
{\includegraphics[width=1.5cm]{n310}} edge (obelix);
|
{\includegraphics[width=1.5cm]{n310}} edge (obelix);
|
||||||
\node[right=.2cm of n310o, duplexer] (b78o) {B40} edge (n310o);
|
\node[right=.2cm of n310o, duplexer] (b78o) {n40} edge (n310o);
|
||||||
\node[below right=-0.1cm and 0.35cm of b78o.east] (anto1)
|
\node[below right=-0.1cm and 0.35cm of b78o.east] (anto1)
|
||||||
{\includegraphics[width=0.3cm]{antenna}} edge (b78o);
|
{\includegraphics[width=0.3cm]{antenna}} edge (b78o);
|
||||||
\node[above right=-0.1cm and 0.35cm of b78o.east] (anto2)
|
\node[above right=-0.1cm and 0.35cm of b78o.east] (anto2)
|
||||||
{\includegraphics[width=0.3cm]{antenna}} edge (b78o);
|
{\includegraphics[width=0.3cm]{antenna}} edge (b78o);
|
||||||
\node[below right=-0.5cm and 0.3cm of obelix, label=above:X310] (x310o)
|
\node[below right=-0.5cm and 0.3cm of obelix, label=above:X310] (x310o)
|
||||||
{\includegraphics[width=1.5cm]{x310}} edge (obelix);
|
{\includegraphics[width=1.5cm]{x310}} edge (obelix);
|
||||||
\node[right=.2cm of x310o, duplexer] (b78o) {B78} edge (x310o);
|
\node[right=.2cm of x310o, duplexer] (b78o) {n78} edge (x310o);
|
||||||
\node[below right=-0.1cm and 0.35cm of b78o.east] (anto1)
|
\node[below right=-0.1cm and 0.35cm of b78o.east] (anto1)
|
||||||
{\includegraphics[width=0.3cm]{antenna}} edge (b78o);
|
{\includegraphics[width=0.3cm]{antenna}} edge (b78o);
|
||||||
\node[above right=-0.1cm and 0.35cm of b78o.east] (anto2)
|
\node[above right=-0.1cm and 0.35cm of b78o.east] (anto2)
|
||||||
{\includegraphics[width=0.3cm]{antenna}} edge (b78o);
|
{\includegraphics[width=0.3cm]{antenna}} edge (b78o);
|
||||||
|
|
||||||
\node[right=5.0cm of n310o, label=above:RM500Q-GL] (quectel)
|
\node[above right=-1.3cm and 5.0cm of n310a.east, label=above:RM500Q-GL] (quectel)
|
||||||
{\includegraphics[height=1.2cm]{quectel}};
|
{\includegraphics[height=1.2cm]{quectel}};
|
||||||
\node[above left=-0.1cm and 0.8cm of quectel.west] (aq2)
|
\node[above left=-0.1cm and 0.8cm of quectel.west] (aq2)
|
||||||
{\includegraphics[width=0.3cm]{antenna}} edge (quectel);
|
{\includegraphics[width=0.3cm]{antenna}} edge (quectel);
|
||||||
@@ -59,5 +59,10 @@
|
|||||||
{\includegraphics[width=1.2cm]{server}}
|
{\includegraphics[width=1.2cm]{server}}
|
||||||
edge (quectel);
|
edge (quectel);
|
||||||
|
|
||||||
|
\node[above right=-0.3cm and 5.0cm of x310o.east, label=above:amariue] (amariue)
|
||||||
|
{\includegraphics[height=1.2cm]{server}};
|
||||||
|
\node[left=0.8cm of amariue.west] (aa1)
|
||||||
|
{\includegraphics[width=0.3cm]{antenna}} edge (amariue);
|
||||||
|
|
||||||
\end{tikzpicture}
|
\end{tikzpicture}
|
||||||
\end{document}
|
\end{document}
|
||||||
|
|||||||
@@ -4,8 +4,8 @@ services:
|
|||||||
container_name: "mysql"
|
container_name: "mysql"
|
||||||
image: mysql:5.7
|
image: mysql:5.7
|
||||||
volumes:
|
volumes:
|
||||||
- ./oai_db.sql:/docker-entrypoint-initdb.d/oai_db.sql
|
- ./database/oai_db.sql:/docker-entrypoint-initdb.d/oai_db.sql
|
||||||
- ./mysql-healthcheck2.sh:/tmp/mysql-healthcheck.sh
|
- ./healthscripts/mysql-healthcheck2.sh:/tmp/mysql-healthcheck.sh
|
||||||
environment:
|
environment:
|
||||||
- TZ=Europe/Paris
|
- TZ=Europe/Paris
|
||||||
- MYSQL_DATABASE=oai_db
|
- MYSQL_DATABASE=oai_db
|
||||||
@@ -21,35 +21,45 @@ services:
|
|||||||
public_net:
|
public_net:
|
||||||
ipv4_address: 192.168.70.131
|
ipv4_address: 192.168.70.131
|
||||||
oai-udr:
|
oai-udr:
|
||||||
container_name: oai-udr
|
container_name: "oai-udr"
|
||||||
image: oai-udr:develop
|
image: oai-udr:develop
|
||||||
environment:
|
environment:
|
||||||
- TZ=Europe/Paris
|
- TZ=Europe/Paris
|
||||||
- INSTANCE=0
|
- INSTANCE=0
|
||||||
- PID_DIRECTORY=/var/run
|
- PID_DIRECTORY=/var/run
|
||||||
|
- UDR_NAME=OAI_UDR
|
||||||
- UDR_INTERFACE_NAME_FOR_NUDR=eth0
|
- UDR_INTERFACE_NAME_FOR_NUDR=eth0
|
||||||
- UDR_INTERFACE_PORT_FOR_NUDR=80
|
- UDR_INTERFACE_PORT_FOR_NUDR=80
|
||||||
- UDR_INTERFACE_HTTP2_PORT_FOR_NUDR=8080
|
- UDR_INTERFACE_HTTP2_PORT_FOR_NUDR=8080
|
||||||
|
- USE_HTTP2=no
|
||||||
- UDR_API_VERSION=v1
|
- UDR_API_VERSION=v1
|
||||||
- MYSQL_IPV4_ADDRESS=192.168.70.131
|
- MYSQL_IPV4_ADDRESS=192.168.70.131
|
||||||
- MYSQL_USER=test
|
- MYSQL_USER=test
|
||||||
- MYSQL_PASS=test
|
- MYSQL_PASS=test
|
||||||
|
- DB_CONNECTION_TIMEOUT=300 # Reset the connection to the DB after expiring the timeout (in second) currently can't be changed
|
||||||
- MYSQL_DB=oai_db
|
- MYSQL_DB=oai_db
|
||||||
- WAIT_MYSQL=120
|
- WAIT_MYSQL=120
|
||||||
|
- USE_FQDN_DNS=yes
|
||||||
|
- REGISTER_NRF=yes
|
||||||
|
- NRF_IPV4_ADDRESS=192.168.70.130
|
||||||
|
- NRF_PORT=80
|
||||||
|
- NRF_API_VERSION=v1
|
||||||
|
- NRF_FQDN=oai-nrf
|
||||||
depends_on:
|
depends_on:
|
||||||
- mysql
|
- mysql
|
||||||
|
- oai-nrf
|
||||||
networks:
|
networks:
|
||||||
public_net:
|
public_net:
|
||||||
ipv4_address: 192.168.70.136
|
ipv4_address: 192.168.70.136
|
||||||
volumes:
|
volumes:
|
||||||
- ./udr-healthcheck.sh:/openair-udr/bin/udr-healthcheck.sh
|
- ./healthscripts/udr-healthcheck.sh:/openair-udr/bin/udr-healthcheck.sh
|
||||||
healthcheck:
|
healthcheck:
|
||||||
test: /bin/bash -c "/openair-udr/bin/udr-healthcheck.sh"
|
test: /bin/bash -c "/openair-udr/bin/udr-healthcheck.sh"
|
||||||
interval: 10s
|
interval: 10s
|
||||||
timeout: 5s
|
timeout: 5s
|
||||||
retries: 5
|
retries: 5
|
||||||
oai-udm:
|
oai-udm:
|
||||||
container_name: oai-udm
|
container_name: "oai-udm"
|
||||||
image: oai-udm:develop
|
image: oai-udm:develop
|
||||||
environment:
|
environment:
|
||||||
- TZ=Europe/Paris
|
- TZ=Europe/Paris
|
||||||
@@ -58,26 +68,33 @@ services:
|
|||||||
- UDM_NAME=OAI_UDM
|
- UDM_NAME=OAI_UDM
|
||||||
- SBI_IF_NAME=eth0
|
- SBI_IF_NAME=eth0
|
||||||
- SBI_PORT=80
|
- SBI_PORT=80
|
||||||
|
- SBI_HTTP2_PORT=8080
|
||||||
|
- USE_HTTP2=no
|
||||||
- UDM_VERSION_NB=v1
|
- UDM_VERSION_NB=v1
|
||||||
- USE_FQDN_DNS=yes
|
- USE_FQDN_DNS=yes
|
||||||
- UDR_IP_ADDRESS=192.168.70.136
|
- UDR_IP_ADDRESS=192.168.70.136
|
||||||
- UDR_PORT=80
|
- UDR_PORT=80
|
||||||
- UDR_VERSION_NB=v1
|
- UDR_VERSION_NB=v1
|
||||||
- UDR_FQDN=oai-udr
|
- UDR_FQDN=oai-udr
|
||||||
|
- REGISTER_NRF=yes
|
||||||
|
- NRF_IPV4_ADDRESS=192.168.70.130
|
||||||
|
- NRF_PORT=80
|
||||||
|
- NRF_API_VERSION=v1
|
||||||
|
- NRF_FQDN=oai-nrf
|
||||||
depends_on:
|
depends_on:
|
||||||
- oai-udr
|
- oai-udr
|
||||||
networks:
|
networks:
|
||||||
public_net:
|
public_net:
|
||||||
ipv4_address: 192.168.70.137
|
ipv4_address: 192.168.70.137
|
||||||
volumes:
|
volumes:
|
||||||
- ./udm-healthcheck.sh:/openair-udm/bin/udm-healthcheck.sh
|
- ./healthscripts/udm-healthcheck.sh:/openair-udm/bin/udm-healthcheck.sh
|
||||||
healthcheck:
|
healthcheck:
|
||||||
test: /bin/bash -c "/openair-udm/bin/udm-healthcheck.sh"
|
test: /bin/bash -c "/openair-udm/bin/udm-healthcheck.sh"
|
||||||
interval: 10s
|
interval: 10s
|
||||||
timeout: 5s
|
timeout: 5s
|
||||||
retries: 5
|
retries: 5
|
||||||
oai-ausf:
|
oai-ausf:
|
||||||
container_name: oai-ausf
|
container_name: "oai-ausf"
|
||||||
image: oai-ausf:develop
|
image: oai-ausf:develop
|
||||||
environment:
|
environment:
|
||||||
- TZ=Europe/Paris
|
- TZ=Europe/Paris
|
||||||
@@ -86,18 +103,25 @@ services:
|
|||||||
- AUSF_NAME=OAI_AUSF
|
- AUSF_NAME=OAI_AUSF
|
||||||
- SBI_IF_NAME=eth0
|
- SBI_IF_NAME=eth0
|
||||||
- SBI_PORT=80
|
- SBI_PORT=80
|
||||||
|
- USE_HTTP2
|
||||||
|
- SBI_HTTP2_PORT
|
||||||
- USE_FQDN_DNS=yes
|
- USE_FQDN_DNS=yes
|
||||||
- UDM_IP_ADDRESS=192.168.70.137
|
- UDM_IP_ADDRESS=192.168.70.137
|
||||||
- UDM_PORT=80
|
- UDM_PORT=80
|
||||||
- UDM_VERSION_NB=v1
|
- UDM_VERSION_NB=v1
|
||||||
- UDM_FQDN=oai-udm
|
- UDM_FQDN=oai-udm
|
||||||
|
- REGISTER_NRF=yes
|
||||||
|
- NRF_IPV4_ADDRESS=192.168.70.130
|
||||||
|
- NRF_PORT=80
|
||||||
|
- NRF_API_VERSION=v1
|
||||||
|
- NRF_FQDN=oai-nrf
|
||||||
depends_on:
|
depends_on:
|
||||||
- oai-udm
|
- oai-udm
|
||||||
networks:
|
networks:
|
||||||
public_net:
|
public_net:
|
||||||
ipv4_address: 192.168.70.138
|
ipv4_address: 192.168.70.138
|
||||||
volumes:
|
volumes:
|
||||||
- ./ausf-healthcheck.sh:/openair-ausf/bin/ausf-healthcheck.sh
|
- ./healthscripts/ausf-healthcheck.sh:/openair-ausf/bin/ausf-healthcheck.sh
|
||||||
healthcheck:
|
healthcheck:
|
||||||
test: /bin/bash -c "/openair-ausf/bin/ausf-healthcheck.sh"
|
test: /bin/bash -c "/openair-ausf/bin/ausf-healthcheck.sh"
|
||||||
interval: 10s
|
interval: 10s
|
||||||
@@ -107,9 +131,10 @@ services:
|
|||||||
container_name: "oai-nrf"
|
container_name: "oai-nrf"
|
||||||
image: oai-nrf:develop
|
image: oai-nrf:develop
|
||||||
environment:
|
environment:
|
||||||
|
- TZ=Europe/Paris
|
||||||
- NRF_INTERFACE_NAME_FOR_SBI=eth0
|
- NRF_INTERFACE_NAME_FOR_SBI=eth0
|
||||||
- NRF_INTERFACE_PORT_FOR_SBI=80
|
- NRF_INTERFACE_PORT_FOR_SBI=80
|
||||||
- NRF_INTERFACE_HTTP2_PORT_FOR_SBI=9090
|
- NRF_INTERFACE_HTTP2_PORT_FOR_SBI=8080
|
||||||
- NRF_API_VERSION=v1
|
- NRF_API_VERSION=v1
|
||||||
- INSTANCE=0
|
- INSTANCE=0
|
||||||
- PID_DIRECTORY=/var/run
|
- PID_DIRECTORY=/var/run
|
||||||
@@ -117,7 +142,7 @@ services:
|
|||||||
public_net:
|
public_net:
|
||||||
ipv4_address: 192.168.70.130
|
ipv4_address: 192.168.70.130
|
||||||
volumes:
|
volumes:
|
||||||
- ./nrf-healthcheck.sh:/openair-nrf/bin/nrf-healthcheck.sh
|
- ./healthscripts/nrf-healthcheck.sh:/openair-nrf/bin/nrf-healthcheck.sh
|
||||||
healthcheck:
|
healthcheck:
|
||||||
test: /bin/bash -c "/openair-nrf/bin/nrf-healthcheck.sh"
|
test: /bin/bash -c "/openair-nrf/bin/nrf-healthcheck.sh"
|
||||||
interval: 10s
|
interval: 10s
|
||||||
@@ -146,9 +171,7 @@ services:
|
|||||||
- PLMN_SUPPORT_MNC=99
|
- PLMN_SUPPORT_MNC=99
|
||||||
- PLMN_SUPPORT_TAC=0x0001
|
- PLMN_SUPPORT_TAC=0x0001
|
||||||
- SST_0=1
|
- SST_0=1
|
||||||
- SD_0=1
|
- SD_0=0x1
|
||||||
- SST_1=1
|
|
||||||
- SD_1=12
|
|
||||||
- AMF_INTERFACE_NAME_FOR_NGAP=eth0
|
- AMF_INTERFACE_NAME_FOR_NGAP=eth0
|
||||||
- AMF_INTERFACE_NAME_FOR_N11=eth0
|
- AMF_INTERFACE_NAME_FOR_N11=eth0
|
||||||
- SMF_INSTANCE_ID_0=1
|
- SMF_INSTANCE_ID_0=1
|
||||||
@@ -168,22 +191,30 @@ services:
|
|||||||
- OPERATOR_KEY=1006020f0a478bf6b699f15c062e42b3
|
- OPERATOR_KEY=1006020f0a478bf6b699f15c062e42b3
|
||||||
- NRF_IPV4_ADDRESS=192.168.70.130
|
- NRF_IPV4_ADDRESS=192.168.70.130
|
||||||
- NRF_PORT=80
|
- NRF_PORT=80
|
||||||
|
- EXTERNAL_NRF=no
|
||||||
- NF_REGISTRATION=yes
|
- NF_REGISTRATION=yes
|
||||||
- SMF_SELECTION=yes
|
- SMF_SELECTION=yes
|
||||||
- USE_FQDN_DNS=yes
|
- USE_FQDN_DNS=yes
|
||||||
- EXTERNAL_AUSF=yes
|
- EXTERNAL_AUSF=yes
|
||||||
|
- EXTERNAL_UDM=no
|
||||||
|
- EXTERNAL_NSSF=no
|
||||||
|
- USE_HTTP2=no
|
||||||
- NRF_API_VERSION=v1
|
- NRF_API_VERSION=v1
|
||||||
- NRF_FQDN=oai-nrf
|
- NRF_FQDN=oai-nrf
|
||||||
- AUSF_IPV4_ADDRESS=192.168.70.138
|
- AUSF_IPV4_ADDRESS=192.168.70.138
|
||||||
- AUSF_PORT=80
|
- AUSF_PORT=80
|
||||||
- AUSF_API_VERSION=v1
|
- AUSF_API_VERSION=v1
|
||||||
- AUSF_FQDN=oai-ausf
|
- AUSF_FQDN=oai-ausf
|
||||||
|
- UDM_IPV4_ADDRESS=192.168.70.137
|
||||||
|
- UDM_PORT=80
|
||||||
|
- UDM_API_VERSION=v2
|
||||||
|
- UDM_FQDN=oai-udm
|
||||||
depends_on:
|
depends_on:
|
||||||
- mysql
|
- mysql
|
||||||
- oai-nrf
|
- oai-nrf
|
||||||
- oai-ausf
|
- oai-ausf
|
||||||
volumes:
|
volumes:
|
||||||
- ./amf-healthcheck.sh:/openair-amf/bin/amf-healthcheck.sh
|
- ./healthscripts/amf-healthcheck.sh:/openair-amf/bin/amf-healthcheck.sh
|
||||||
healthcheck:
|
healthcheck:
|
||||||
test: /bin/bash -c "/openair-amf/bin/amf-healthcheck.sh"
|
test: /bin/bash -c "/openair-amf/bin/amf-healthcheck.sh"
|
||||||
interval: 10s
|
interval: 10s
|
||||||
@@ -212,26 +243,35 @@ services:
|
|||||||
- AMF_FQDN=oai-amf
|
- AMF_FQDN=oai-amf
|
||||||
- UDM_IPV4_ADDRESS=192.168.70.137
|
- UDM_IPV4_ADDRESS=192.168.70.137
|
||||||
- UDM_PORT=80
|
- UDM_PORT=80
|
||||||
- UDM_API_VERSION=v1
|
- UDM_API_VERSION=v2
|
||||||
- UDM_FQDN=oai-udm
|
- UDM_FQDN=oai-udm
|
||||||
- UPF_IPV4_ADDRESS=192.168.70.134
|
- UPF_IPV4_ADDRESS=192.168.70.134
|
||||||
- UPF_FQDN_0=oai-spgwu
|
- UPF_FQDN_0=oai-spgwu
|
||||||
- NRF_IPV4_ADDRESS=192.168.70.130
|
- NRF_IPV4_ADDRESS=192.168.70.130
|
||||||
- NRF_PORT=80
|
- NRF_PORT=80
|
||||||
- NRF_API_VERSION=v1
|
- NRF_API_VERSION=v1
|
||||||
- USE_LOCAL_SUBSCRIPTION_INFO=yes
|
- USE_LOCAL_SUBSCRIPTION_INFO=yes #Set to yes if SMF uses local subscription information instead of from an UDM
|
||||||
|
- USE_NETWORK_INSTANCE=no #Set yes if network instance is to be used for given UPF
|
||||||
- NRF_FQDN=oai-nrf
|
- NRF_FQDN=oai-nrf
|
||||||
- REGISTER_NRF=yes
|
- REGISTER_NRF=yes
|
||||||
- DISCOVER_UPF=yes
|
- DISCOVER_UPF=yes
|
||||||
- USE_FQDN_DNS=yes
|
- USE_FQDN_DNS=yes
|
||||||
- DNN_RANGE1=12.1.1.2 - 12.1.1.128
|
- HTTP_VERSION=1 # Default: 1
|
||||||
- DNN_RANGE0=12.2.1.2 - 12.2.1.128
|
- UE_MTU=1500
|
||||||
- DNN_NI1=oai
|
- DNN_NI0=oai
|
||||||
|
- TYPE0=IPv4
|
||||||
|
- DNN_RANGE0=12.1.1.2 - 12.1.1.253
|
||||||
|
- NSSAI_SST0=1
|
||||||
|
- NSSAI_SD0=0x1
|
||||||
|
- SESSION_AMBR_UL0=1000Mbps
|
||||||
|
- SESSION_AMBR_DL0=1000Mbps
|
||||||
|
- DEFAULT_CSCF_IPV4_ADDRESS=127.0.0.1 # only needed when ims is being used
|
||||||
|
- ENABLE_USAGE_REPORTING=no # Set yes if UE USAGE REPORTING is to be done at UPF
|
||||||
depends_on:
|
depends_on:
|
||||||
- oai-nrf
|
- oai-nrf
|
||||||
- oai-amf
|
- oai-amf
|
||||||
volumes:
|
volumes:
|
||||||
- ./smf-healthcheck.sh:/openair-smf/bin/smf-healthcheck.sh
|
- ./healthscripts/smf-healthcheck.sh:/openair-smf/bin/smf-healthcheck.sh
|
||||||
healthcheck:
|
healthcheck:
|
||||||
test: /bin/bash -c "/openair-smf/bin/smf-healthcheck.sh"
|
test: /bin/bash -c "/openair-smf/bin/smf-healthcheck.sh"
|
||||||
interval: 10s
|
interval: 10s
|
||||||
@@ -258,17 +298,23 @@ services:
|
|||||||
- MNC03=099
|
- MNC03=099
|
||||||
- TAC=1
|
- TAC=1
|
||||||
- GW_ID=1
|
- GW_ID=1
|
||||||
|
- THREAD_S1U_PRIO=80
|
||||||
|
- S1U_THREADS=8
|
||||||
|
- THREAD_SX_PRIO=81
|
||||||
|
- SX_THREADS=1
|
||||||
|
- THREAD_SGI_PRIO=80
|
||||||
|
- SGI_THREADS=8
|
||||||
- REALM=openairinterface.org
|
- REALM=openairinterface.org
|
||||||
- ENABLE_5G_FEATURES=yes
|
- ENABLE_5G_FEATURES=yes
|
||||||
- REGISTER_NRF=yes
|
- REGISTER_NRF=yes
|
||||||
- USE_FQDN_NRF=no
|
- USE_FQDN_NRF=yes
|
||||||
- UPF_FQDN_5G=oai-spgwu
|
- UPF_FQDN_5G=oai-spgwu
|
||||||
- NRF_IPV4_ADDRESS=192.168.70.130
|
- NRF_IPV4_ADDRESS=192.168.70.130
|
||||||
- NRF_PORT=80
|
- NRF_PORT=80
|
||||||
- NRF_API_VERSION=v1
|
- NRF_API_VERSION=v1
|
||||||
- NRF_FQDN=oai-nrf
|
- NRF_FQDN=oai-nrf
|
||||||
- NSSAI_SST_0=1
|
- NSSAI_SST_0=1
|
||||||
- NSSAI_SD_0=1
|
- NSSAI_SD_0=0x1
|
||||||
- DNN_0=oai
|
- DNN_0=oai
|
||||||
depends_on:
|
depends_on:
|
||||||
- oai-nrf
|
- oai-nrf
|
||||||
@@ -280,7 +326,7 @@ services:
|
|||||||
- ALL
|
- ALL
|
||||||
privileged: true
|
privileged: true
|
||||||
volumes:
|
volumes:
|
||||||
- ./spgwu-healthcheck.sh:/openair-spgwu-tiny/bin/spgwu-healthcheck.sh
|
- ./healthscripts/spgwu-healthcheck.sh:/openair-spgwu-tiny/bin/spgwu-healthcheck.sh
|
||||||
healthcheck:
|
healthcheck:
|
||||||
test: /bin/bash -c "/openair-spgwu-tiny/bin/spgwu-healthcheck.sh"
|
test: /bin/bash -c "/openair-spgwu-tiny/bin/spgwu-healthcheck.sh"
|
||||||
interval: 10s
|
interval: 10s
|
||||||
@@ -290,12 +336,10 @@ services:
|
|||||||
public_net:
|
public_net:
|
||||||
ipv4_address: 192.168.70.134
|
ipv4_address: 192.168.70.134
|
||||||
oai-ext-dn:
|
oai-ext-dn:
|
||||||
image: ubuntu:bionic
|
image: trf-gen-cn5g:latest
|
||||||
privileged: true
|
privileged: true
|
||||||
container_name: oai-ext-dn
|
container_name: oai-ext-dn
|
||||||
entrypoint: /bin/bash -c \
|
entrypoint: /bin/bash -c \
|
||||||
"apt update; apt install -y iptables iproute2 iperf iperf3 iputils-ping;"\
|
|
||||||
"iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE;"\
|
|
||||||
"ip route add 12.1.1.0/24 via 192.168.70.134 dev eth0; sleep infinity"
|
"ip route add 12.1.1.0/24 via 192.168.70.134 dev eth0; sleep infinity"
|
||||||
depends_on:
|
depends_on:
|
||||||
- oai-spgwu
|
- oai-spgwu
|
||||||
@@ -303,14 +347,14 @@ services:
|
|||||||
public_net:
|
public_net:
|
||||||
ipv4_address: 192.168.70.135
|
ipv4_address: 192.168.70.135
|
||||||
networks:
|
networks:
|
||||||
|
# public_net:
|
||||||
|
# external:
|
||||||
|
# name: demo-oai-public-net
|
||||||
public_net:
|
public_net:
|
||||||
external:
|
driver: bridge
|
||||||
name: demo-oai-public-net
|
name: demo-oai-public-net
|
||||||
# public_net:
|
ipam:
|
||||||
# driver: bridge
|
config:
|
||||||
# name: demo-oai-public-net
|
- subnet: 192.168.70.128/26
|
||||||
# ipam:
|
driver_opts:
|
||||||
# config:
|
com.docker.network.bridge.name: "demo-oai"
|
||||||
# - subnet: 192.168.70.128/26
|
|
||||||
# driver_opts:
|
|
||||||
# com.docker.network.bridge.name: "demo-oai"
|
|
||||||
|
|||||||
@@ -151,10 +151,13 @@ CREATE TABLE `AuthenticationSubscription` (
|
|||||||
--
|
--
|
||||||
|
|
||||||
INSERT INTO `AuthenticationSubscription` (`ueid`, `authenticationMethod`, `encPermanentKey`, `protectionParameterId`, `sequenceNumber`, `authenticationManagementField`, `algorithmId`, `encOpcKey`, `encTopcKey`, `vectorGenerationInHss`, `n5gcAuthMethod`, `rgAuthenticationInd`, `supi`) VALUES
|
INSERT INTO `AuthenticationSubscription` (`ueid`, `authenticationMethod`, `encPermanentKey`, `protectionParameterId`, `sequenceNumber`, `authenticationManagementField`, `algorithmId`, `encOpcKey`, `encTopcKey`, `vectorGenerationInHss`, `n5gcAuthMethod`, `rgAuthenticationInd`, `supi`) VALUES
|
||||||
('208950000000031', '5G_AKA', '0C0A34601D4F07677303652C0462535B', '0C0A34601D4F07677303652C0462535B', '{\"sqn\": \"000000000020\", \"sqnScheme\": \"NON_TIME_BASED\", \"lastIndexes\": {\"ausf\": 0}}', '8000', 'milenage', '63bfa50ee6523365ff14c1f45f88737d', NULL, NULL, NULL, NULL, '208950000000031');
|
('2089900007487', '5G_AKA', 'fec86ba6eb707ed08905757b1bb44b8f', 'fec86ba6eb707ed08905757b1bb44b8f', '{\"sqn\": \"000000000000\", \"sqnScheme\": \"NON_TIME_BASED\", \"lastIndexes\": {\"ausf\": 0}}', '8000', 'milenage', 'C42449363BBAD02B66D16BC975D77CC1', NULL, NULL, NULL, NULL, '2089900007487');
|
||||||
|
|
||||||
INSERT INTO `AuthenticationSubscription` (`ueid`, `authenticationMethod`, `encPermanentKey`, `protectionParameterId`, `sequenceNumber`, `authenticationManagementField`, `algorithmId`, `encOpcKey`, `encTopcKey`, `vectorGenerationInHss`, `n5gcAuthMethod`, `rgAuthenticationInd`, `supi`) VALUES
|
INSERT INTO `AuthenticationSubscription` (`ueid`, `authenticationMethod`, `encPermanentKey`, `protectionParameterId`, `sequenceNumber`, `authenticationManagementField`, `algorithmId`, `encOpcKey`, `encTopcKey`, `vectorGenerationInHss`, `n5gcAuthMethod`, `rgAuthenticationInd`, `supi`) VALUES
|
||||||
('208990000000001', '5G_AKA', 'fec86ba6eb707ed08905757b1bb44b8f', 'fec86ba6eb707ed08905757b1bb44b8f', '{\"sqn\": \"000000000020\", \"sqnScheme\": \"NON_TIME_BASED\", \"lastIndexes\": {\"ausf\": 0}}', '8000', 'milenage', 'C42449363BBAD02B66D16BC975D77CC1', NULL, NULL, NULL, NULL, '208990000000001');
|
('208990000000001', '5G_AKA', 'fec86ba6eb707ed08905757b1bb44b8f', 'fec86ba6eb707ed08905757b1bb44b8f', '{\"sqn\": \"000000000000\", \"sqnScheme\": \"NON_TIME_BASED\", \"lastIndexes\": {\"ausf\": 0}}', '8000', 'milenage', 'C42449363BBAD02B66D16BC975D77CC1', NULL, NULL, NULL, NULL, '208990000000001');
|
||||||
|
INSERT INTO `AuthenticationSubscription` (`ueid`, `authenticationMethod`, `encPermanentKey`, `protectionParameterId`, `sequenceNumber`, `authenticationManagementField`, `algorithmId`, `encOpcKey`, `encTopcKey`, `vectorGenerationInHss`, `n5gcAuthMethod`, `rgAuthenticationInd`, `supi`) VALUES
|
||||||
|
('208990000000002', '5G_AKA', 'fec86ba6eb707ed08905757b1bb44b8f', 'fec86ba6eb707ed08905757b1bb44b8f', '{\"sqn\": \"000000000000\", \"sqnScheme\": \"NON_TIME_BASED\", \"lastIndexes\": {\"ausf\": 0}}', '8000', 'milenage', 'C42449363BBAD02B66D16BC975D77CC1', NULL, NULL, NULL, NULL, '208990000000002');
|
||||||
|
INSERT INTO `AuthenticationSubscription` (`ueid`, `authenticationMethod`, `encPermanentKey`, `protectionParameterId`, `sequenceNumber`, `authenticationManagementField`, `algorithmId`, `encOpcKey`, `encTopcKey`, `vectorGenerationInHss`, `n5gcAuthMethod`, `rgAuthenticationInd`, `supi`) VALUES
|
||||||
|
('208990000000003', '5G_AKA', 'fec86ba6eb707ed08905757b1bb44b8f', 'fec86ba6eb707ed08905757b1bb44b8f', '{\"sqn\": \"000000000000\", \"sqnScheme\": \"NON_TIME_BASED\", \"lastIndexes\": {\"ausf\": 0}}', '8000', 'milenage', 'C42449363BBAD02B66D16BC975D77CC1', NULL, NULL, NULL, NULL, '208990000000003');
|
||||||
|
|
||||||
-- --------------------------------------------------------
|
-- --------------------------------------------------------
|
||||||
|
|
||||||
@@ -203,6 +206,19 @@ CREATE TABLE `SessionManagementSubscriptionData` (
|
|||||||
`3gppChargingCharacteristics` varchar(50) DEFAULT NULL
|
`3gppChargingCharacteristics` varchar(50) DEFAULT NULL
|
||||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
|
||||||
|
|
||||||
|
--
|
||||||
|
-- Dumping data for table `SessionManagementSubscriptionData`
|
||||||
|
--
|
||||||
|
|
||||||
|
INSERT INTO `SessionManagementSubscriptionData` (`ueid`, `servingPlmnid`, `singleNssai`, `dnnConfigurations`) VALUES
|
||||||
|
('2089900007487', '20899', '{\"sst\": 1, \"sd\": \"1\"}','{\"oai\":{\"pduSessionTypes\":{ \"defaultSessionType\": \"IPV4\"},\"sscModes\": {\"defaultSscMode\": \"SSC_MODE_1\"},\"5gQosProfile\": {\"5qi\": 6,\"arp\":{\"priorityLevel\": 1,\"preemptCap\": \"NOT_PREEMPT\",\"preemptVuln\":\"NOT_PREEMPTABLE\"},\"priorityLevel\":1},\"sessionAmbr\":{\"uplink\":\"1000Mbps\", \"downlink\":\"1000Mbps\"},\"staticIpAddress\":[{\"ipv4Addr\": \"12.1.1.2\"}]}}');
|
||||||
|
INSERT INTO `SessionManagementSubscriptionData` (`ueid`, `servingPlmnid`, `singleNssai`, `dnnConfigurations`) VALUES
|
||||||
|
('208990000000001', '20899', '{\"sst\": 1, \"sd\": \"1\"}','{\"oai\":{\"pduSessionTypes\":{ \"defaultSessionType\": \"IPV4\"},\"sscModes\": {\"defaultSscMode\": \"SSC_MODE_1\"},\"5gQosProfile\": {\"5qi\": 6,\"arp\":{\"priorityLevel\": 1,\"preemptCap\": \"NOT_PREEMPT\",\"preemptVuln\":\"NOT_PREEMPTABLE\"},\"priorityLevel\":1},\"sessionAmbr\":{\"uplink\":\"1000Mbps\", \"downlink\":\"1000Mbps\"},\"staticIpAddress\":[{\"ipv4Addr\": \"12.1.1.2\"}]}}');
|
||||||
|
INSERT INTO `SessionManagementSubscriptionData` (`ueid`, `servingPlmnid`, `singleNssai`, `dnnConfigurations`) VALUES
|
||||||
|
('208990000000002', '20899', '{\"sst\": 1, \"sd\": \"1\"}','{\"oai\":{\"pduSessionTypes\":{ \"defaultSessionType\": \"IPV4\"},\"sscModes\": {\"defaultSscMode\": \"SSC_MODE_1\"},\"5gQosProfile\": {\"5qi\": 6,\"arp\":{\"priorityLevel\": 1,\"preemptCap\": \"NOT_PREEMPT\",\"preemptVuln\":\"NOT_PREEMPTABLE\"},\"priorityLevel\":1},\"sessionAmbr\":{\"uplink\":\"1000Mbps\", \"downlink\":\"1000Mbps\"},\"staticIpAddress\":[{\"ipv4Addr\": \"12.1.1.3\"}]}}');
|
||||||
|
INSERT INTO `SessionManagementSubscriptionData` (`ueid`, `servingPlmnid`, `singleNssai`, `dnnConfigurations`) VALUES
|
||||||
|
('208990000000003', '20899', '{\"sst\": 1, \"sd\": \"1\"}','{\"oai\":{\"pduSessionTypes\":{ \"defaultSessionType\": \"IPV4\"},\"sscModes\": {\"defaultSscMode\": \"SSC_MODE_1\"},\"5gQosProfile\": {\"5qi\": 6,\"arp\":{\"priorityLevel\": 1,\"preemptCap\": \"NOT_PREEMPT\",\"preemptVuln\":\"NOT_PREEMPTABLE\"},\"priorityLevel\":1},\"sessionAmbr\":{\"uplink\":\"1000Mbps\", \"downlink\":\"1000Mbps\"},\"staticIpAddress\":[{\"ipv4Addr\": \"12.1.1.4\"}]}}');
|
||||||
|
|
||||||
-- --------------------------------------------------------
|
-- --------------------------------------------------------
|
||||||
|
|
||||||
--
|
--
|
||||||
|
|||||||
@@ -60,6 +60,7 @@ def main():
|
|||||||
"rcc.band40.tm1.25PRB": f'{data[0]["paths"]["dest_dir"]}/{outputfilename}',
|
"rcc.band40.tm1.25PRB": f'{data[0]["paths"]["dest_dir"]}/{outputfilename}',
|
||||||
"gnb.band78.tm1.fr1.106PRB.usrpb210.conf": f'{data[0]["paths"]["dest_dir"]}/{outputfilename}',
|
"gnb.band78.tm1.fr1.106PRB.usrpb210.conf": f'{data[0]["paths"]["dest_dir"]}/{outputfilename}',
|
||||||
"gnb.band78.sa.fr1.106PRB.usrpn310.conf": f'{data[0]["paths"]["dest_dir"]}/{outputfilename}',
|
"gnb.band78.sa.fr1.106PRB.usrpn310.conf": f'{data[0]["paths"]["dest_dir"]}/{outputfilename}',
|
||||||
|
"gnb.sa.band78.fr1.106PRB.usrpb210.conf": f'{data[0]["paths"]["dest_dir"]}/{outputfilename}',
|
||||||
"gnb.sa.band66.fr1.106PRB.usrpn300.conf": f'{data[0]["paths"]["dest_dir"]}/{outputfilename}',
|
"gnb.sa.band66.fr1.106PRB.usrpn300.conf": f'{data[0]["paths"]["dest_dir"]}/{outputfilename}',
|
||||||
"gNB_SA_CU.conf": f'{data[0]["paths"]["dest_dir"]}/{outputfilename}',
|
"gNB_SA_CU.conf": f'{data[0]["paths"]["dest_dir"]}/{outputfilename}',
|
||||||
"gNB_SA_DU.conf": f'{data[0]["paths"]["dest_dir"]}/{outputfilename}',
|
"gNB_SA_DU.conf": f'{data[0]["paths"]["dest_dir"]}/{outputfilename}',
|
||||||
|
|||||||
@@ -10,6 +10,7 @@ THREAD_PARALLEL_CONFIG=${THREAD_PARALLEL_CONFIG:-PARALLEL_SINGLE_THREAD}
|
|||||||
|
|
||||||
if [[ -v USE_NSA_TDD_MONO ]]; then cp $PREFIX/etc/gnb.nsa.tdd.conf $PREFIX/etc/gnb.conf; fi
|
if [[ -v USE_NSA_TDD_MONO ]]; then cp $PREFIX/etc/gnb.nsa.tdd.conf $PREFIX/etc/gnb.conf; fi
|
||||||
if [[ -v USE_SA_TDD_MONO ]]; then cp $PREFIX/etc/gnb.sa.tdd.conf $PREFIX/etc/gnb.conf; fi
|
if [[ -v USE_SA_TDD_MONO ]]; then cp $PREFIX/etc/gnb.sa.tdd.conf $PREFIX/etc/gnb.conf; fi
|
||||||
|
if [[ -v USE_SA_TDD_MONO_B2XX ]]; then cp $PREFIX/etc/gnb.sa.tdd.b2xx.conf $PREFIX/etc/gnb.conf; fi
|
||||||
if [[ -v USE_SA_FDD_MONO ]]; then cp $PREFIX/etc/gnb.sa.fdd.conf $PREFIX/etc/gnb.conf; fi
|
if [[ -v USE_SA_FDD_MONO ]]; then cp $PREFIX/etc/gnb.sa.fdd.conf $PREFIX/etc/gnb.conf; fi
|
||||||
if [[ -v USE_SA_CU ]]; then cp $PREFIX/etc/gnb.sa.cu.conf $PREFIX/etc/gnb.conf; fi
|
if [[ -v USE_SA_CU ]]; then cp $PREFIX/etc/gnb.sa.cu.conf $PREFIX/etc/gnb.conf; fi
|
||||||
if [[ -v USE_SA_TDD_CU ]]; then cp $PREFIX/etc/gnb.sa.du.tdd.conf $PREFIX/etc/gnb.conf; fi
|
if [[ -v USE_SA_TDD_CU ]]; then cp $PREFIX/etc/gnb.sa.du.tdd.conf $PREFIX/etc/gnb.conf; fi
|
||||||
|
|||||||
@@ -94,6 +94,36 @@
|
|||||||
- key: parallel_config
|
- key: parallel_config
|
||||||
env: "@THREAD_PARALLEL_CONFIG@"
|
env: "@THREAD_PARALLEL_CONFIG@"
|
||||||
|
|
||||||
|
- filePrefix: gnb.sa.band78.fr1.106PRB.usrpb210.conf
|
||||||
|
outputfilename: "gnb.sa.tdd.b2xx.conf"
|
||||||
|
config:
|
||||||
|
- key: Active_gNBs
|
||||||
|
env: "@GNB_NAME@"
|
||||||
|
- key: gNB_name
|
||||||
|
env: "@GNB_NAME@"
|
||||||
|
- key: mcc
|
||||||
|
env: "@MCC@"
|
||||||
|
- key: mnc
|
||||||
|
env: "@MNC@"
|
||||||
|
- key: mnc_length
|
||||||
|
env: "@MNC_LENGTH@"
|
||||||
|
- key: tracking_area_code
|
||||||
|
env: "@TAC@"
|
||||||
|
- key: sst
|
||||||
|
env: "@NSSAI_SST@"
|
||||||
|
- key: ipv4
|
||||||
|
env: "@AMF_IP_ADDRESS@"
|
||||||
|
- key: GNB_INTERFACE_NAME_FOR_NG_AMF
|
||||||
|
env: "@GNB_NGA_IF_NAME@"
|
||||||
|
- key: GNB_IPV4_ADDRESS_FOR_NG_AMF
|
||||||
|
env: "@GNB_NGA_IP_ADDRESS@"
|
||||||
|
- key: GNB_INTERFACE_NAME_FOR_NGU
|
||||||
|
env: "@GNB_NGU_IF_NAME@"
|
||||||
|
- key: GNB_IPV4_ADDRESS_FOR_NGU
|
||||||
|
env: "@GNB_NGU_IP_ADDRESS@"
|
||||||
|
- key: parallel_config
|
||||||
|
env: "@THREAD_PARALLEL_CONFIG@"
|
||||||
|
|
||||||
- filePrefix: gnb.sa.band66.fr1.106PRB.usrpn300.conf
|
- filePrefix: gnb.sa.band66.fr1.106PRB.usrpn300.conf
|
||||||
outputfilename: "gnb.sa.fdd.conf"
|
outputfilename: "gnb.sa.fdd.conf"
|
||||||
config:
|
config:
|
||||||
|
|||||||
+1
-1
@@ -283,7 +283,7 @@ void fh_if5_south_out(RU_t *ru, int frame, int slot, uint64_t timestamp) {
|
|||||||
struct timespec txmeas;
|
struct timespec txmeas;
|
||||||
clock_gettime(CLOCK_MONOTONIC, &txmeas);
|
clock_gettime(CLOCK_MONOTONIC, &txmeas);
|
||||||
LOG_D(PHY,"IF5 TX %d.%d, TS %llu, buffs[0] %p, buffs[1] %p ener0 %f dB, tx start %d\n",frame,slot,(unsigned long long)timestamp,buffs[0],buffs[1],
|
LOG_D(PHY,"IF5 TX %d.%d, TS %llu, buffs[0] %p, buffs[1] %p ener0 %f dB, tx start %d\n",frame,slot,(unsigned long long)timestamp,buffs[0],buffs[1],
|
||||||
10*log10((double)signal_energy(buffs[0],offset)),txmeas.tv_nsec);
|
10*log10((double)signal_energy(buffs[0],ru->nr_frame_parms->get_samples_per_slot(slot,ru->nr_frame_parms))),txmeas.tv_nsec);
|
||||||
ru->ifdevice.trx_write_func2(&ru->ifdevice,
|
ru->ifdevice.trx_write_func2(&ru->ifdevice,
|
||||||
timestamp,
|
timestamp,
|
||||||
buffs,
|
buffs,
|
||||||
|
|||||||
@@ -59,9 +59,6 @@ extern void set_function_spec_param(RU_t *ru);
|
|||||||
|
|
||||||
extern void reset_opp_meas(void);
|
extern void reset_opp_meas(void);
|
||||||
extern void print_opp_meas(void);
|
extern void print_opp_meas(void);
|
||||||
|
|
||||||
extern void init_fep_thread(PHY_VARS_gNB *);
|
|
||||||
|
|
||||||
void init_gNB_afterRU(void);
|
void init_gNB_afterRU(void);
|
||||||
|
|
||||||
extern int stop_L1L2(module_id_t gnb_id);
|
extern int stop_L1L2(module_id_t gnb_id);
|
||||||
|
|||||||
@@ -87,7 +87,7 @@ typedef struct {
|
|||||||
// N_CCE is L, or number of CCEs for DCI
|
// N_CCE is L, or number of CCEs for DCI
|
||||||
int N_CCE;
|
int N_CCE;
|
||||||
uint8_t payloadSize;
|
uint8_t payloadSize;
|
||||||
uint8_t payloadBits[16];
|
uint8_t payloadBits[16] __attribute__((aligned(16))); // will be cast as uint64
|
||||||
//fapi_nr_dci_pdu_rel15_t dci;
|
//fapi_nr_dci_pdu_rel15_t dci;
|
||||||
} fapi_nr_dci_indication_pdu_t;
|
} fapi_nr_dci_indication_pdu_t;
|
||||||
|
|
||||||
|
|||||||
@@ -738,7 +738,7 @@ typedef struct {
|
|||||||
// The total DCI length (in bits) including padding bits [TS38.212 sec 7.3.1] Range 0->DCI_PAYLOAD_BYTE_LEN*8
|
// The total DCI length (in bits) including padding bits [TS38.212 sec 7.3.1] Range 0->DCI_PAYLOAD_BYTE_LEN*8
|
||||||
uint16_t PayloadSizeBits;
|
uint16_t PayloadSizeBits;
|
||||||
// DCI payload, where the actual size is defined by PayloadSizeBits. The bit order is as following bit0-bit7 are mapped to first byte of MSB - LSB
|
// DCI payload, where the actual size is defined by PayloadSizeBits. The bit order is as following bit0-bit7 are mapped to first byte of MSB - LSB
|
||||||
uint8_t Payload[DCI_PAYLOAD_BYTE_LEN];
|
uint8_t Payload[DCI_PAYLOAD_BYTE_LEN] __attribute__((aligned(32)));
|
||||||
|
|
||||||
} nfapi_nr_dl_dci_pdu_t;
|
} nfapi_nr_dl_dci_pdu_t;
|
||||||
|
|
||||||
@@ -1666,41 +1666,34 @@ typedef struct
|
|||||||
|
|
||||||
} nfapi_nr_uci_indication_t;
|
} nfapi_nr_uci_indication_t;
|
||||||
|
|
||||||
//3.4.10 srs_indication
|
|
||||||
//table 3-73
|
|
||||||
|
|
||||||
typedef struct
|
/// 5G PHY FAPI Specification: SRS indication - Section 3.4.10, Table 3-73
|
||||||
{
|
|
||||||
uint8_t rb_snr;
|
|
||||||
}nfapi_nr_srs_indication_reported_symbol_resource_block_t;
|
|
||||||
|
|
||||||
typedef struct
|
typedef struct {
|
||||||
{
|
uint8_t rb_snr; // SNR value in dB. Value: 0 -> 255 representing -64 dB to 63 dB with a step size 0.5 dB, 0xff will be set if this field is invalid.
|
||||||
uint16_t num_rbs;
|
} nfapi_nr_srs_indication_reported_symbol_resource_block_t;
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
uint16_t num_rbs; // Number of PRBs to be reported for this SRS PDU. Value: 0 -> 272.
|
||||||
nfapi_nr_srs_indication_reported_symbol_resource_block_t* rb_list;
|
nfapi_nr_srs_indication_reported_symbol_resource_block_t* rb_list;
|
||||||
}nfapi_nr_srs_indication_reported_symbol_t;
|
} nfapi_nr_srs_indication_reported_symbol_t;
|
||||||
|
|
||||||
#define NFAPI_NR_SRS_IND_MAX_PDU 100
|
typedef struct {
|
||||||
typedef struct
|
uint32_t handle; // The handle passed to the PHY in the the UL_TTI.request SRS PDU.
|
||||||
{
|
uint16_t rnti; // The RNTI passed to the PHY in the UL_TTI.request SRS PDU. Value: 1 -> 65535.
|
||||||
uint32_t handle;
|
uint16_t timing_advance; // Timing advance TA measured for the UE [TS 38.213, Section 4.2]. NTA_new = NTA_old + (TA − 31) * 16 * 64 / (2^u). Value: 0 -> 63. 0xffff should be set if this field is invalid.
|
||||||
uint16_t rnti;
|
uint8_t num_symbols; // Number of symbols for SRS. Value: 1 -> 4. If a PHY does not report for individual symbols then this parameter should be set to 1.
|
||||||
uint16_t timing_advance;
|
uint8_t wide_band_snr; // SNR value in dB measured within configured SRS bandwidth on each symbol. Value: 0 -> 255 representing -64 dB to 63 dB with a step size 0.5 dB. 0xff will be set if this field is invalid.
|
||||||
uint8_t num_symbols;
|
uint8_t num_reported_symbols; // Number of symbols reported in this message. This allows PHY to report individual symbols or aggregated symbols where this field will be set to 1. Value: 1 -> 4.
|
||||||
uint8_t wide_band_snr;
|
|
||||||
uint8_t num_reported_symbols;
|
|
||||||
nfapi_nr_srs_indication_reported_symbol_t* reported_symbol_list;
|
nfapi_nr_srs_indication_reported_symbol_t* reported_symbol_list;
|
||||||
|
} nfapi_nr_srs_indication_pdu_t;
|
||||||
|
|
||||||
}nfapi_nr_srs_indication_pdu_t;
|
typedef struct {
|
||||||
|
|
||||||
typedef struct
|
|
||||||
{
|
|
||||||
nfapi_p7_message_header_t header;
|
nfapi_p7_message_header_t header;
|
||||||
uint16_t sfn;
|
uint16_t sfn; // SFN. Value: 0 -> 1023
|
||||||
uint16_t slot;
|
uint16_t slot; // Slot. Value: 0 -> 159
|
||||||
uint8_t number_of_pdus;
|
uint8_t number_of_pdus; // Number of PDUs included in this message. Value: 0 -> 255
|
||||||
nfapi_nr_srs_indication_pdu_t* pdu_list;
|
nfapi_nr_srs_indication_pdu_t* pdu_list;
|
||||||
|
|
||||||
} nfapi_nr_srs_indication_t;
|
} nfapi_nr_srs_indication_t;
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -814,7 +814,7 @@ uint8_t phy_threegpplte_turbo_decoder8(int16_t *y,
|
|||||||
llr_t *s1,*s2,*yp1,*yp2,*yp;
|
llr_t *s1,*s2,*yp1,*yp2,*yp;
|
||||||
unsigned int i,j,iind;//,pi;
|
unsigned int i,j,iind;//,pi;
|
||||||
unsigned char iteration_cnt=0;
|
unsigned char iteration_cnt=0;
|
||||||
unsigned int crc,oldcrc,crc_len;
|
unsigned int crc, crc_len;
|
||||||
uint8_t temp;
|
uint8_t temp;
|
||||||
#if defined(__x86_64__) || defined(__i386__)
|
#if defined(__x86_64__) || defined(__i386__)
|
||||||
__m128i *yp128;
|
__m128i *yp128;
|
||||||
@@ -1233,8 +1233,8 @@ uint8_t phy_threegpplte_turbo_decoder8(int16_t *y,
|
|||||||
}
|
}
|
||||||
|
|
||||||
// check the CRC
|
// check the CRC
|
||||||
oldcrc= *((unsigned int *)(&decoded_bytes[(n>>3)-crc_len]));
|
uint32_t oldcrc;
|
||||||
|
memcpy(&oldcrc, &decoded_bytes[(n >> 3) - crc_len], crc_len);
|
||||||
switch (crc_type) {
|
switch (crc_type) {
|
||||||
case CRC24_A:
|
case CRC24_A:
|
||||||
oldcrc&=0x00ffffff;
|
oldcrc&=0x00ffffff;
|
||||||
|
|||||||
@@ -244,11 +244,11 @@ crc16 (unsigned char * inptr, int bitlen)
|
|||||||
|
|
||||||
while (octetlen-- > 0) {
|
while (octetlen-- > 0) {
|
||||||
|
|
||||||
crc = (crc << 8) ^ (crc16Table[(*inptr++) ^ (crc >> 24)] << 16);
|
crc = (crc << 8) ^ (((uint32_t)crc16Table[(*inptr++) ^ (crc >> 24)]) << 16);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (resbit > 0)
|
if (resbit > 0)
|
||||||
crc = (crc << resbit) ^ (crc16Table[((*inptr) >> (8 - resbit)) ^ (crc >> (32 - resbit))] << 16);
|
crc = (crc << resbit) ^ (((uint32_t)crc16Table[(*inptr) >> (8 - resbit) ^ (crc >> (32 - resbit))]) << 16);
|
||||||
|
|
||||||
return crc;
|
return crc;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -961,7 +961,8 @@ static inline uint32_t nrLDPC_cnProcPc_BG1(t_nrLDPC_lut* p_lut, int8_t* cnProcBu
|
|||||||
|
|
||||||
// If no error pcRes should be 0
|
// If no error pcRes should be 0
|
||||||
// Only use valid CNs
|
// Only use valid CNs
|
||||||
pcResSum |= (pcRes&(0xFFFFFFFF>>(32-Mrem)));
|
if (Mrem)
|
||||||
|
pcResSum |= (pcRes&(0xFFFFFFFF>>(32-Mrem)));
|
||||||
|
|
||||||
// If PC failed we can stop here
|
// If PC failed we can stop here
|
||||||
if (pcResSum > 0)
|
if (pcResSum > 0)
|
||||||
@@ -1028,7 +1029,8 @@ static inline uint32_t nrLDPC_cnProcPc_BG1(t_nrLDPC_lut* p_lut, int8_t* cnProcBu
|
|||||||
|
|
||||||
// If no error pcRes should be 0
|
// If no error pcRes should be 0
|
||||||
// Only use valid CNs
|
// Only use valid CNs
|
||||||
pcResSum |= (pcRes&(0xFFFFFFFF>>(32-Mrem)));
|
if (Mrem)
|
||||||
|
pcResSum |= (pcRes&(0xFFFFFFFF>>(32-Mrem)));
|
||||||
|
|
||||||
// If PC failed we can stop here
|
// If PC failed we can stop here
|
||||||
if (pcResSum > 0)
|
if (pcResSum > 0)
|
||||||
@@ -1096,7 +1098,8 @@ static inline uint32_t nrLDPC_cnProcPc_BG1(t_nrLDPC_lut* p_lut, int8_t* cnProcBu
|
|||||||
|
|
||||||
// If no error pcRes should be 0
|
// If no error pcRes should be 0
|
||||||
// Only use valid CNs
|
// Only use valid CNs
|
||||||
pcResSum |= (pcRes&(0xFFFFFFFF>>(32-Mrem)));
|
if (Mrem)
|
||||||
|
pcResSum |= (pcRes&(0xFFFFFFFF>>(32-Mrem)));
|
||||||
|
|
||||||
// If PC failed we can stop here
|
// If PC failed we can stop here
|
||||||
if (pcResSum > 0)
|
if (pcResSum > 0)
|
||||||
@@ -1163,7 +1166,8 @@ static inline uint32_t nrLDPC_cnProcPc_BG1(t_nrLDPC_lut* p_lut, int8_t* cnProcBu
|
|||||||
|
|
||||||
// If no error pcRes should be 0
|
// If no error pcRes should be 0
|
||||||
// Only use valid CNs
|
// Only use valid CNs
|
||||||
pcResSum |= (pcRes&(0xFFFFFFFF>>(32-Mrem)));
|
if (Mrem)
|
||||||
|
pcResSum |= (pcRes&(0xFFFFFFFF>>(32-Mrem)));
|
||||||
|
|
||||||
// If PC failed we can stop here
|
// If PC failed we can stop here
|
||||||
if (pcResSum > 0)
|
if (pcResSum > 0)
|
||||||
@@ -1230,7 +1234,8 @@ static inline uint32_t nrLDPC_cnProcPc_BG1(t_nrLDPC_lut* p_lut, int8_t* cnProcBu
|
|||||||
|
|
||||||
// If no error pcRes should be 0
|
// If no error pcRes should be 0
|
||||||
// Only use valid CNs
|
// Only use valid CNs
|
||||||
pcResSum |= (pcRes&(0xFFFFFFFF>>(32-Mrem)));
|
if (Mrem)
|
||||||
|
pcResSum |= (pcRes&(0xFFFFFFFF>>(32-Mrem)));
|
||||||
|
|
||||||
// If PC failed we can stop here
|
// If PC failed we can stop here
|
||||||
if (pcResSum > 0)
|
if (pcResSum > 0)
|
||||||
@@ -1297,7 +1302,8 @@ static inline uint32_t nrLDPC_cnProcPc_BG1(t_nrLDPC_lut* p_lut, int8_t* cnProcBu
|
|||||||
|
|
||||||
// If no error pcRes should be 0
|
// If no error pcRes should be 0
|
||||||
// Only use valid CNs
|
// Only use valid CNs
|
||||||
pcResSum |= (pcRes&(0xFFFFFFFF>>(32-Mrem)));
|
if (Mrem)
|
||||||
|
pcResSum |= (pcRes&(0xFFFFFFFF>>(32-Mrem)));
|
||||||
|
|
||||||
// If PC failed we can stop here
|
// If PC failed we can stop here
|
||||||
if (pcResSum > 0)
|
if (pcResSum > 0)
|
||||||
@@ -1364,7 +1370,8 @@ static inline uint32_t nrLDPC_cnProcPc_BG1(t_nrLDPC_lut* p_lut, int8_t* cnProcBu
|
|||||||
|
|
||||||
// If no error pcRes should be 0
|
// If no error pcRes should be 0
|
||||||
// Only use valid CNs
|
// Only use valid CNs
|
||||||
pcResSum |= (pcRes&(0xFFFFFFFF>>(32-Mrem)));
|
if (Mrem)
|
||||||
|
pcResSum |= (pcRes&(0xFFFFFFFF>>(32-Mrem)));
|
||||||
|
|
||||||
// If PC failed we can stop here
|
// If PC failed we can stop here
|
||||||
if (pcResSum > 0)
|
if (pcResSum > 0)
|
||||||
@@ -1431,7 +1438,8 @@ static inline uint32_t nrLDPC_cnProcPc_BG1(t_nrLDPC_lut* p_lut, int8_t* cnProcBu
|
|||||||
|
|
||||||
// If no error pcRes should be 0
|
// If no error pcRes should be 0
|
||||||
// Only use valid CNs
|
// Only use valid CNs
|
||||||
pcResSum |= (pcRes&(0xFFFFFFFF>>(32-Mrem)));
|
if (Mrem)
|
||||||
|
pcResSum |= (pcRes&(0xFFFFFFFF>>(32-Mrem)));
|
||||||
|
|
||||||
// If PC failed we can stop here
|
// If PC failed we can stop here
|
||||||
if (pcResSum > 0)
|
if (pcResSum > 0)
|
||||||
@@ -1498,7 +1506,8 @@ static inline uint32_t nrLDPC_cnProcPc_BG1(t_nrLDPC_lut* p_lut, int8_t* cnProcBu
|
|||||||
|
|
||||||
// If no error pcRes should be 0
|
// If no error pcRes should be 0
|
||||||
// Only use valid CNs
|
// Only use valid CNs
|
||||||
pcResSum |= (pcRes&(0xFFFFFFFF>>(32-Mrem)));
|
if (Mrem)
|
||||||
|
pcResSum |= (pcRes&(0xFFFFFFFF>>(32-Mrem)));
|
||||||
|
|
||||||
// If PC failed we can stop here
|
// If PC failed we can stop here
|
||||||
if (pcResSum > 0)
|
if (pcResSum > 0)
|
||||||
@@ -1593,7 +1602,8 @@ static inline uint32_t nrLDPC_cnProcPc_BG2(t_nrLDPC_lut* p_lut, int8_t* cnProcBu
|
|||||||
|
|
||||||
// If no error pcRes should be 0
|
// If no error pcRes should be 0
|
||||||
// Only use valid CNs
|
// Only use valid CNs
|
||||||
pcResSum |= (pcRes&(0xFFFFFFFF>>(32-Mrem)));
|
if (Mrem)
|
||||||
|
pcResSum |= (pcRes&(0xFFFFFFFF>>(32-Mrem)));
|
||||||
|
|
||||||
// If PC failed we can stop here
|
// If PC failed we can stop here
|
||||||
if (pcResSum > 0)
|
if (pcResSum > 0)
|
||||||
@@ -1660,7 +1670,8 @@ static inline uint32_t nrLDPC_cnProcPc_BG2(t_nrLDPC_lut* p_lut, int8_t* cnProcBu
|
|||||||
|
|
||||||
// If no error pcRes should be 0
|
// If no error pcRes should be 0
|
||||||
// Only use valid CNs
|
// Only use valid CNs
|
||||||
pcResSum |= (pcRes&(0xFFFFFFFF>>(32-Mrem)));
|
if (Mrem)
|
||||||
|
pcResSum |= (pcRes&(0xFFFFFFFF>>(32-Mrem)));
|
||||||
|
|
||||||
// If PC failed we can stop here
|
// If PC failed we can stop here
|
||||||
if (pcResSum > 0)
|
if (pcResSum > 0)
|
||||||
@@ -1727,7 +1738,8 @@ static inline uint32_t nrLDPC_cnProcPc_BG2(t_nrLDPC_lut* p_lut, int8_t* cnProcBu
|
|||||||
|
|
||||||
// If no error pcRes should be 0
|
// If no error pcRes should be 0
|
||||||
// Only use valid CNs
|
// Only use valid CNs
|
||||||
pcResSum |= (pcRes&(0xFFFFFFFF>>(32-Mrem)));
|
if (Mrem)
|
||||||
|
pcResSum |= (pcRes&(0xFFFFFFFF>>(32-Mrem)));
|
||||||
|
|
||||||
// If PC failed we can stop here
|
// If PC failed we can stop here
|
||||||
if (pcResSum > 0)
|
if (pcResSum > 0)
|
||||||
@@ -1794,7 +1806,8 @@ static inline uint32_t nrLDPC_cnProcPc_BG2(t_nrLDPC_lut* p_lut, int8_t* cnProcBu
|
|||||||
|
|
||||||
// If no error pcRes should be 0
|
// If no error pcRes should be 0
|
||||||
// Only use valid CNs
|
// Only use valid CNs
|
||||||
pcResSum |= (pcRes&(0xFFFFFFFF>>(32-Mrem)));
|
if (Mrem)
|
||||||
|
pcResSum |= (pcRes&(0xFFFFFFFF>>(32-Mrem)));
|
||||||
|
|
||||||
// If PC failed we can stop here
|
// If PC failed we can stop here
|
||||||
if (pcResSum > 0)
|
if (pcResSum > 0)
|
||||||
@@ -1861,7 +1874,8 @@ static inline uint32_t nrLDPC_cnProcPc_BG2(t_nrLDPC_lut* p_lut, int8_t* cnProcBu
|
|||||||
|
|
||||||
// If no error pcRes should be 0
|
// If no error pcRes should be 0
|
||||||
// Only use valid CNs
|
// Only use valid CNs
|
||||||
pcResSum |= (pcRes&(0xFFFFFFFF>>(32-Mrem)));
|
if (Mrem)
|
||||||
|
pcResSum |= (pcRes&(0xFFFFFFFF>>(32-Mrem)));
|
||||||
|
|
||||||
// If PC failed we can stop here
|
// If PC failed we can stop here
|
||||||
if (pcResSum > 0)
|
if (pcResSum > 0)
|
||||||
@@ -1928,7 +1942,8 @@ static inline uint32_t nrLDPC_cnProcPc_BG2(t_nrLDPC_lut* p_lut, int8_t* cnProcBu
|
|||||||
|
|
||||||
// If no error pcRes should be 0
|
// If no error pcRes should be 0
|
||||||
// Only use valid CNs
|
// Only use valid CNs
|
||||||
pcResSum |= (pcRes&(0xFFFFFFFF>>(32-Mrem)));
|
if (Mrem)
|
||||||
|
pcResSum |= (pcRes&(0xFFFFFFFF>>(32-Mrem)));
|
||||||
|
|
||||||
// If PC failed we can stop here
|
// If PC failed we can stop here
|
||||||
if (pcResSum > 0)
|
if (pcResSum > 0)
|
||||||
|
|||||||
@@ -613,21 +613,6 @@ int phy_init_nr_gNB(PHY_VARS_gNB *gNB,
|
|||||||
|
|
||||||
for (int id=0; id<NUMBER_OF_NR_SRS_MAX; id++) {
|
for (int id=0; id<NUMBER_OF_NR_SRS_MAX; id++) {
|
||||||
gNB->nr_srs_info[id] = (nr_srs_info_t *)malloc16_clear(sizeof(nr_srs_info_t));
|
gNB->nr_srs_info[id] = (nr_srs_info_t *)malloc16_clear(sizeof(nr_srs_info_t));
|
||||||
gNB->nr_srs_info[id]->sc_list = (uint16_t *) malloc16_clear(6*fp->N_RB_UL*sizeof(uint16_t));
|
|
||||||
gNB->nr_srs_info[id]->srs_generated_signal = (int32_t*)malloc16_clear(fp->ofdm_symbol_size*MAX_NUM_NR_SRS_SYMBOLS*sizeof(int32_t));
|
|
||||||
gNB->nr_srs_info[id]->noise_power = (uint32_t*)malloc16_clear(sizeof(uint32_t));
|
|
||||||
gNB->nr_srs_info[id]->srs_received_signal = (int32_t **)malloc16(Prx*sizeof(int32_t*));
|
|
||||||
gNB->nr_srs_info[id]->srs_ls_estimated_channel = (int32_t **)malloc16(Prx*sizeof(int32_t*));
|
|
||||||
gNB->nr_srs_info[id]->srs_estimated_channel_freq = (int32_t **)malloc16(Prx*sizeof(int32_t*));
|
|
||||||
gNB->nr_srs_info[id]->srs_estimated_channel_time = (int32_t **)malloc16(Prx*sizeof(int32_t*));
|
|
||||||
gNB->nr_srs_info[id]->srs_estimated_channel_time_shifted = (int32_t **)malloc16(Prx*sizeof(int32_t*));
|
|
||||||
for (i=0;i<Prx;i++){
|
|
||||||
gNB->nr_srs_info[id]->srs_received_signal[i] = (int32_t*)malloc16_clear(fp->ofdm_symbol_size*MAX_NUM_NR_SRS_SYMBOLS*sizeof(int32_t));
|
|
||||||
gNB->nr_srs_info[id]->srs_ls_estimated_channel[i] = (int32_t*)malloc16_clear(fp->ofdm_symbol_size*MAX_NUM_NR_SRS_SYMBOLS*sizeof(int32_t));
|
|
||||||
gNB->nr_srs_info[id]->srs_estimated_channel_freq[i] = (int32_t*)malloc16_clear(fp->ofdm_symbol_size*MAX_NUM_NR_SRS_SYMBOLS*sizeof(int32_t));
|
|
||||||
gNB->nr_srs_info[id]->srs_estimated_channel_time[i] = (int32_t*)malloc16_clear(fp->ofdm_symbol_size*MAX_NUM_NR_SRS_SYMBOLS*sizeof(int32_t));
|
|
||||||
gNB->nr_srs_info[id]->srs_estimated_channel_time_shifted[i] = (int32_t*)malloc16_clear(fp->ofdm_symbol_size*MAX_NUM_NR_SRS_SYMBOLS*sizeof(int32_t));
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
generate_ul_reference_signal_sequences(SHRT_MAX);
|
generate_ul_reference_signal_sequences(SHRT_MAX);
|
||||||
@@ -785,21 +770,6 @@ void phy_free_nr_gNB(PHY_VARS_gNB *gNB)
|
|||||||
free_and_zero(gNB->nr_csi_rs_info);
|
free_and_zero(gNB->nr_csi_rs_info);
|
||||||
|
|
||||||
for (int id = 0; id < NUMBER_OF_NR_SRS_MAX; id++) {
|
for (int id = 0; id < NUMBER_OF_NR_SRS_MAX; id++) {
|
||||||
for (int i = 0; i < Prx; i++) {
|
|
||||||
free_and_zero(gNB->nr_srs_info[id]->srs_received_signal[i]);
|
|
||||||
free_and_zero(gNB->nr_srs_info[id]->srs_ls_estimated_channel[i]);
|
|
||||||
free_and_zero(gNB->nr_srs_info[id]->srs_estimated_channel_freq[i]);
|
|
||||||
free_and_zero(gNB->nr_srs_info[id]->srs_estimated_channel_time[i]);
|
|
||||||
free_and_zero(gNB->nr_srs_info[id]->srs_estimated_channel_time_shifted[i]);
|
|
||||||
}
|
|
||||||
free_and_zero(gNB->nr_srs_info[id]->sc_list);
|
|
||||||
free_and_zero(gNB->nr_srs_info[id]->srs_generated_signal);
|
|
||||||
free_and_zero(gNB->nr_srs_info[id]->noise_power);
|
|
||||||
free_and_zero(gNB->nr_srs_info[id]->srs_received_signal);
|
|
||||||
free_and_zero(gNB->nr_srs_info[id]->srs_ls_estimated_channel);
|
|
||||||
free_and_zero(gNB->nr_srs_info[id]->srs_estimated_channel_freq);
|
|
||||||
free_and_zero(gNB->nr_srs_info[id]->srs_estimated_channel_time);
|
|
||||||
free_and_zero(gNB->nr_srs_info[id]->srs_estimated_channel_time_shifted);
|
|
||||||
free_and_zero(gNB->nr_srs_info[id]);
|
free_and_zero(gNB->nr_srs_info[id]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -377,22 +377,6 @@ int init_nr_ue_signal(PHY_VARS_NR_UE *ue, int nb_connected_gNB)
|
|||||||
}
|
}
|
||||||
|
|
||||||
ue->nr_srs_info = (nr_srs_info_t *)malloc16_clear(sizeof(nr_srs_info_t));
|
ue->nr_srs_info = (nr_srs_info_t *)malloc16_clear(sizeof(nr_srs_info_t));
|
||||||
ue->nr_srs_info->sc_list = (uint16_t *) malloc16_clear(6*fp->N_RB_UL*sizeof(uint16_t));
|
|
||||||
ue->nr_srs_info->srs_generated_signal = (int32_t *) malloc16_clear( (2*(fp->samples_per_frame)+2048)*sizeof(int32_t) );
|
|
||||||
ue->nr_srs_info->noise_power = (uint32_t*)malloc16_clear(sizeof(uint32_t));
|
|
||||||
ue->nr_srs_info->srs_received_signal = (int32_t **)malloc16( fp->nb_antennas_rx*sizeof(int32_t *) );
|
|
||||||
ue->nr_srs_info->srs_ls_estimated_channel = (int32_t **)malloc16( fp->nb_antennas_rx*sizeof(int32_t *) );
|
|
||||||
ue->nr_srs_info->srs_estimated_channel_freq = (int32_t **)malloc16( fp->nb_antennas_rx*sizeof(int32_t *) );
|
|
||||||
ue->nr_srs_info->srs_estimated_channel_time = (int32_t **)malloc16( fp->nb_antennas_rx*sizeof(int32_t *) );
|
|
||||||
ue->nr_srs_info->srs_estimated_channel_time_shifted = (int32_t **)malloc16( fp->nb_antennas_rx*sizeof(int32_t *) );
|
|
||||||
for (i=0; i<fp->nb_antennas_rx; i++) {
|
|
||||||
ue->nr_srs_info->srs_received_signal[i] = (int32_t *) malloc16_clear(fp->ofdm_symbol_size*MAX_NUM_NR_SRS_SYMBOLS*sizeof(int32_t));
|
|
||||||
ue->nr_srs_info->srs_ls_estimated_channel[i] = (int32_t *) malloc16_clear(fp->ofdm_symbol_size*MAX_NUM_NR_SRS_SYMBOLS*sizeof(int32_t));
|
|
||||||
ue->nr_srs_info->srs_estimated_channel_freq[i] = (int32_t *) malloc16_clear(fp->ofdm_symbol_size*MAX_NUM_NR_SRS_SYMBOLS*sizeof(int32_t));
|
|
||||||
ue->nr_srs_info->srs_estimated_channel_time[i] = (int32_t *) malloc16_clear(fp->ofdm_symbol_size*MAX_NUM_NR_SRS_SYMBOLS*sizeof(int32_t));
|
|
||||||
ue->nr_srs_info->srs_estimated_channel_time_shifted[i] = (int32_t *) malloc16_clear(fp->ofdm_symbol_size*MAX_NUM_NR_SRS_SYMBOLS*sizeof(int32_t));
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// RACH
|
// RACH
|
||||||
prach_vars[gNB_id]->prachF = (int16_t *)malloc16_clear( sizeof(int)*(7*2*sizeof(int)*(fp->ofdm_symbol_size*12)) );
|
prach_vars[gNB_id]->prachF = (int16_t *)malloc16_clear( sizeof(int)*(7*2*sizeof(int)*(fp->ofdm_symbol_size*12)) );
|
||||||
@@ -520,21 +504,6 @@ void term_nr_ue_signal(PHY_VARS_NR_UE *ue, int nb_connected_gNB)
|
|||||||
free_and_zero(ue->nr_csi_rs_info->csi_rs_estimated_channel_freq);
|
free_and_zero(ue->nr_csi_rs_info->csi_rs_estimated_channel_freq);
|
||||||
free_and_zero(ue->nr_csi_rs_info);
|
free_and_zero(ue->nr_csi_rs_info);
|
||||||
|
|
||||||
for (int i = 0; i < fp->nb_antennas_rx; i++) {
|
|
||||||
free_and_zero(ue->nr_srs_info->srs_received_signal[i]);
|
|
||||||
free_and_zero(ue->nr_srs_info->srs_ls_estimated_channel[i]);
|
|
||||||
free_and_zero(ue->nr_srs_info->srs_estimated_channel_freq[i]);
|
|
||||||
free_and_zero(ue->nr_srs_info->srs_estimated_channel_time[i]);
|
|
||||||
free_and_zero(ue->nr_srs_info->srs_estimated_channel_time_shifted[i]);
|
|
||||||
}
|
|
||||||
free_and_zero(ue->nr_srs_info->sc_list);
|
|
||||||
free_and_zero(ue->nr_srs_info->srs_generated_signal);
|
|
||||||
free_and_zero(ue->nr_srs_info->noise_power);
|
|
||||||
free_and_zero(ue->nr_srs_info->srs_received_signal);
|
|
||||||
free_and_zero(ue->nr_srs_info->srs_ls_estimated_channel);
|
|
||||||
free_and_zero(ue->nr_srs_info->srs_estimated_channel_freq);
|
|
||||||
free_and_zero(ue->nr_srs_info->srs_estimated_channel_time);
|
|
||||||
free_and_zero(ue->nr_srs_info->srs_estimated_channel_time_shifted);
|
|
||||||
free_and_zero(ue->nr_srs_info);
|
free_and_zero(ue->nr_srs_info);
|
||||||
|
|
||||||
free_and_zero(ue->csiim_vars[gNB_id]);
|
free_and_zero(ue->csiim_vars[gNB_id]);
|
||||||
|
|||||||
@@ -532,9 +532,12 @@ uint32_t conv_1C_RIV(int32_t rballoc,uint32_t N_RB_DL) {
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// FIXME: this function is compting PRB outside the range, so I FORCED in the range
|
||||||
|
// I can't understand the 3GPP spec, see below note
|
||||||
uint32_t get_prb(int N_RB_DL,int odd_slot,int vrb,int Ngap) {
|
uint32_t get_prb(int N_RB_DL,int odd_slot,int vrb,int Ngap) {
|
||||||
|
|
||||||
int offset;
|
int offset;
|
||||||
|
int ret=-1;
|
||||||
|
|
||||||
switch (N_RB_DL) {
|
switch (N_RB_DL) {
|
||||||
|
|
||||||
@@ -545,16 +548,16 @@ uint32_t get_prb(int N_RB_DL,int odd_slot,int vrb,int Ngap) {
|
|||||||
switch (vrb) {
|
switch (vrb) {
|
||||||
case 0: // even: 0->0, 1->2, odd: 0->3, 1->5
|
case 0: // even: 0->0, 1->2, odd: 0->3, 1->5
|
||||||
case 1:
|
case 1:
|
||||||
return ((3*odd_slot) + 2*(vrb&3))%6;
|
ret= ((3*odd_slot) + 2*(vrb&3))%6;
|
||||||
break;
|
break;
|
||||||
case 2: // even: 2->3, 3->5, odd: 2->0, 3->2
|
case 2: // even: 2->3, 3->5, odd: 2->0, 3->2
|
||||||
case 3:
|
case 3:
|
||||||
return ((3*odd_slot) + 2*(vrb&3) + 5)%6;
|
ret= ((3*odd_slot) + 2*(vrb&3) + 5)%6;
|
||||||
break;
|
break;
|
||||||
case 4: // even: 4->1, odd: 4->4
|
case 4: // even: 4->1, odd: 4->4
|
||||||
return ((3*odd_slot) + 1)%6;
|
ret= ((3*odd_slot) + 1)%6;
|
||||||
case 5: // even: 5->4, odd: 5->1
|
case 5: // even: 5->4, odd: 5->1
|
||||||
return ((3*odd_slot) + 4)%6;
|
ret= ((3*odd_slot) + 4)%6;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
@@ -562,88 +565,90 @@ uint32_t get_prb(int N_RB_DL,int odd_slot,int vrb,int Ngap) {
|
|||||||
case 15:
|
case 15:
|
||||||
if (vrb<12) {
|
if (vrb<12) {
|
||||||
if ((vrb&3) < 2) // even: 0->0, 1->4, 4->1, 5->5, 8->2, 9->6 odd: 0->7, 1->11
|
if ((vrb&3) < 2) // even: 0->0, 1->4, 4->1, 5->5, 8->2, 9->6 odd: 0->7, 1->11
|
||||||
return(((7*odd_slot) + 4*(vrb&3) + (vrb>>2))%14) + 14*(vrb/14);
|
ret= (((7*odd_slot) + 4*(vrb&3) + (vrb>>2))%14) + 14*(vrb/14);
|
||||||
else if (vrb < 12) // even: 2->7, 3->11, 6->8, 7->12, 10->9, 11->13
|
else if (vrb < 12) // even: 2->7, 3->11, 6->8, 7->12, 10->9, 11->13
|
||||||
return (((7*odd_slot) + 4*(vrb&3) + (vrb>>2) +13 )%14) + 14*(vrb/14);
|
ret= (((7*odd_slot) + 4*(vrb&3) + (vrb>>2) +13 )%14) + 14*(vrb/14);
|
||||||
}
|
}
|
||||||
if (vrb==12)
|
if (vrb==12)
|
||||||
return (3+(7*odd_slot)) % 14;
|
ret= (3+(7*odd_slot)) % 14;
|
||||||
if (vrb==13)
|
if (vrb==13)
|
||||||
return (10+(7*odd_slot)) % 14;
|
ret= (10+(7*odd_slot)) % 14;
|
||||||
return 14;
|
ret= 14;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
// Formula in TS 36.211, chap 6.2.3.2
|
||||||
|
// Fix me: returns a PRB number > 24 when vrb is 24
|
||||||
case 25:
|
case 25:
|
||||||
return (((12*odd_slot) + 6*(vrb&3) + (vrb>>2))%24) + 24*(vrb/24);
|
ret= (((12*odd_slot) + 6*(vrb&3) + (vrb>>2))%24) + 24*(vrb/24);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 50: // P=3
|
case 50: // P=3
|
||||||
if (Ngap==0) {
|
if (Ngap==0) {
|
||||||
// Nrow=12,Nnull=2,NVRBDL=46,Ngap1= 27
|
// Nrow=12,Nnull=2,NVRBDL=46,Ngap1= 27
|
||||||
if (vrb>=23)
|
if (vrb>=23)
|
||||||
offset=4;
|
offset=4;
|
||||||
else
|
else
|
||||||
offset=0;
|
offset=0;
|
||||||
if (vrb<44) {
|
if (vrb<44) {
|
||||||
if ((vrb&3)>=2)
|
if ((vrb&3)>=2)
|
||||||
return offset+((23*odd_slot) + 12*(vrb&3) + (vrb>>2) + 45)%46;
|
ret= offset+((23*odd_slot) + 12*(vrb&3) + (vrb>>2) + 45)%46;
|
||||||
else
|
else
|
||||||
return offset+((23*odd_slot) + 12*(vrb&3) + (vrb>>2))%46;
|
ret= offset+((23*odd_slot) + 12*(vrb&3) + (vrb>>2))%46;
|
||||||
}
|
}
|
||||||
if (vrb==44) // even: 44->11, odd: 45->34
|
if (vrb==44) // even: 44->11, odd: 45->34
|
||||||
return offset+((23*odd_slot) + 22-12+1);
|
ret= offset+((23*odd_slot) + 22-12+1);
|
||||||
if (vrb==45) // even: 45->10, odd: 45->33
|
if (vrb==45) // even: 45->10, odd: 45->33
|
||||||
return offset+((23*odd_slot) + 22+12);
|
ret= offset+((23*odd_slot) + 22+12);
|
||||||
if (vrb==46)
|
if (vrb==46)
|
||||||
return offset+46+((23*odd_slot) + 23-12+1) % 46;
|
ret= offset+46+((23*odd_slot) + 23-12+1) % 46;
|
||||||
if (vrb==47)
|
if (vrb==47)
|
||||||
return offset+46+((23*odd_slot) + 23+12) % 46;
|
ret= offset+46+((23*odd_slot) + 23+12) % 46;
|
||||||
if (vrb==48)
|
if (vrb==48)
|
||||||
return offset+46+((23*odd_slot) + 23-12+1) % 46;
|
ret= offset+46+((23*odd_slot) + 23-12+1) % 46;
|
||||||
if (vrb==49)
|
if (vrb==49)
|
||||||
return offset+46+((23*odd_slot) + 23+12) % 46;
|
ret= offset+46+((23*odd_slot) + 23+12) % 46;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
// Nrow=6,Nnull=6,NVRBDL=18,Ngap1= 27
|
// Nrow=6,Nnull=6,NVRBDL=18,Ngap1= 27
|
||||||
if (vrb>=9)
|
if (vrb>=9)
|
||||||
offset=18;
|
offset=18;
|
||||||
else
|
else
|
||||||
offset=0;
|
offset=0;
|
||||||
|
|
||||||
if (vrb<12) {
|
if (vrb<12) {
|
||||||
if ((vrb&3)>=2)
|
if ((vrb&3)>=2)
|
||||||
return offset+((9*odd_slot) + 6*(vrb&3) + (vrb>>2) + 17)%18;
|
ret= offset+((9*odd_slot) + 6*(vrb&3) + (vrb>>2) + 17)%18;
|
||||||
else
|
else
|
||||||
return offset+((9*odd_slot) + 6*(vrb&3) + (vrb>>2))%18;
|
ret= offset+((9*odd_slot) + 6*(vrb&3) + (vrb>>2))%18;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
return offset+((9*odd_slot) + 12*(vrb&1)+(vrb>>1) )%18 + 18*(vrb/18);
|
ret= offset+((9*odd_slot) + 12*(vrb&1)+(vrb>>1) )%18 + 18*(vrb/18);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case 75:
|
case 75:
|
||||||
// Ngap1 = 32, NVRBRL=64, P=4, Nrow= 16, Nnull=0
|
// Ngap1 = 32, NVRBRL=64, P=4, Nrow= 16, Nnull=0
|
||||||
if (Ngap ==0) {
|
if (Ngap ==0) {
|
||||||
return ((32*odd_slot) + 16*(vrb&3) + (vrb>>2))%64 + (vrb/64);
|
ret= ((32*odd_slot) + 16*(vrb&3) + (vrb>>2))%64 + (vrb/64);
|
||||||
} else {
|
} else {
|
||||||
// Ngap2 = 16, NVRBDL=32, Nrow=8, Nnull=0
|
// Ngap2 = 16, NVRBDL=32, Nrow=8, Nnull=0
|
||||||
return ((16*odd_slot) + 8*(vrb&3) + (vrb>>2))%32 + (vrb/32);
|
ret= ((16*odd_slot) + 8*(vrb&3) + (vrb>>2))%32 + (vrb/32);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case 100:
|
case 100:
|
||||||
// Ngap1 = 48, NVRBDL=96, Nrow=24, Nnull=0
|
// Ngap1 = 48, NVRBDL=96, Nrow=24, Nnull=0
|
||||||
if (Ngap ==0) {
|
if (Ngap ==0) {
|
||||||
return ((48*odd_slot) + 24*(vrb&3) + (vrb>>2))%96 + (vrb/96);
|
ret= ((48*odd_slot) + 24*(vrb&3) + (vrb>>2))%96 + (vrb/96);
|
||||||
} else {
|
} else {
|
||||||
// Ngap2 = 16, NVRBDL=32, Nrow=8, Nnull=0
|
// Ngap2 = 16, NVRBDL=32, Nrow=8, Nnull=0
|
||||||
return ((16*odd_slot) + 8*(vrb&3) + (vrb>>2))%32 + (vrb/32);
|
ret= ((16*odd_slot) + 8*(vrb&3) + (vrb>>2))%32 + (vrb/32);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
LOG_E(PHY,"Unknown N_RB_DL %d\n",N_RB_DL);
|
LOG_E(PHY,"Unknown N_RB_DL %d\n",N_RB_DL);
|
||||||
return 0;
|
ret= 0;
|
||||||
}
|
}
|
||||||
return 0;
|
return ret%N_RB_DL;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -677,7 +682,7 @@ void generate_RIV_tables(void)
|
|||||||
|
|
||||||
// printf("RIV %d (%d) : first_rb %d NBRB %d\n",RIV,localRIV2alloc_LUT25[RIV],RBstart,Lcrbs);
|
// printf("RIV %d (%d) : first_rb %d NBRB %d\n",RIV,localRIV2alloc_LUT25[RIV],RBstart,Lcrbs);
|
||||||
localRIV2alloc_LUT6[RIV] = alloc0;
|
localRIV2alloc_LUT6[RIV] = alloc0;
|
||||||
distRIV2alloc_even_LUT6[RIV] = allocdist0_0_even;
|
distRIV2alloc_even_LUT6[RIV] = allocdist0_0_even;
|
||||||
distRIV2alloc_odd_LUT6[RIV] = allocdist0_0_odd;
|
distRIV2alloc_odd_LUT6[RIV] = allocdist0_0_odd;
|
||||||
RIV2nb_rb_LUT6[RIV] = Lcrbs;
|
RIV2nb_rb_LUT6[RIV] = Lcrbs;
|
||||||
RIV2first_rb_LUT6[RIV] = RBstart;
|
RIV2first_rb_LUT6[RIV] = RBstart;
|
||||||
@@ -693,15 +698,14 @@ void generate_RIV_tables(void)
|
|||||||
nVRB = Lcrbs-1+RBstart;
|
nVRB = Lcrbs-1+RBstart;
|
||||||
//printf("RBstart %d, len %d --> ",RBstart,Lcrbs);
|
//printf("RBstart %d, len %d --> ",RBstart,Lcrbs);
|
||||||
alloc0 |= (1<<nVRB);
|
alloc0 |= (1<<nVRB);
|
||||||
allocdist0_0_even |= (1<<get_prb(25,0,nVRB,0));
|
allocdist0_0_even |= 1U << get_prb(25, 0, nVRB, 0);
|
||||||
allocdist0_0_odd |= (1<<get_prb(25,1,nVRB,0));
|
allocdist0_0_odd |= 1U << get_prb(25, 1, nVRB, 0);
|
||||||
|
|
||||||
//printf("alloc 0 %x, allocdist0_even %x, allocdist0_odd %x\n",alloc0,allocdist0_0_even,allocdist0_0_odd);
|
//printf("alloc 0 %x, allocdist0_even %x, allocdist0_odd %x\n",alloc0,allocdist0_0_even,allocdist0_0_odd);
|
||||||
RIV=computeRIV(25,RBstart,Lcrbs);
|
RIV=computeRIV(25,RBstart,Lcrbs);
|
||||||
|
|
||||||
if (RIV>RIV_max25)
|
if (RIV>RIV_max25)
|
||||||
RIV_max25 = RIV;;
|
RIV_max25 = RIV;
|
||||||
|
|
||||||
|
|
||||||
localRIV2alloc_LUT25[RIV] = alloc0;
|
localRIV2alloc_LUT25[RIV] = alloc0;
|
||||||
distRIV2alloc_even_LUT25[RIV] = allocdist0_0_even;
|
distRIV2alloc_even_LUT25[RIV] = allocdist0_0_even;
|
||||||
@@ -730,37 +734,37 @@ void generate_RIV_tables(void)
|
|||||||
|
|
||||||
|
|
||||||
if (nVRB<32)
|
if (nVRB<32)
|
||||||
alloc0 |= (1<<nVRB);
|
alloc0 |= 1U << nVRB;
|
||||||
else
|
else
|
||||||
alloc1 |= (1<<(nVRB-32));
|
alloc1 |= 1U << (nVRB - 32);
|
||||||
|
|
||||||
// Distributed Gap1, even slot
|
// Distributed Gap1, even slot
|
||||||
nVRB_even_dist = get_prb(50,0,nVRB,0);
|
nVRB_even_dist = get_prb(50,0,nVRB,0);
|
||||||
if (nVRB_even_dist<32)
|
if (nVRB_even_dist<32)
|
||||||
allocdist0_0_even |= (1<<nVRB_even_dist);
|
allocdist0_0_even |= 1U << nVRB_even_dist;
|
||||||
else
|
else
|
||||||
allocdist1_0_even |= (1<<(nVRB_even_dist-32));
|
allocdist1_0_even |= 1U << (nVRB_even_dist - 32);
|
||||||
|
|
||||||
// Distributed Gap1, odd slot
|
// Distributed Gap1, odd slot
|
||||||
nVRB_odd_dist = get_prb(50,1,nVRB,0);
|
nVRB_odd_dist = get_prb(50,1,nVRB,0);
|
||||||
if (nVRB_odd_dist<32)
|
if (nVRB_odd_dist<32)
|
||||||
allocdist0_0_odd |= (1<<nVRB_odd_dist);
|
allocdist0_0_odd |= (1U <<nVRB_odd_dist);
|
||||||
else
|
else
|
||||||
allocdist1_0_odd |= (1<<(nVRB_odd_dist-32));
|
allocdist1_0_odd |= (1U <<(nVRB_odd_dist-32));
|
||||||
|
|
||||||
// Distributed Gap2, even slot
|
// Distributed Gap2, even slot
|
||||||
nVRB_even_dist = get_prb(50,0,nVRB,1);
|
nVRB_even_dist = get_prb(50,0,nVRB,1);
|
||||||
if (nVRB_even_dist<32)
|
if (nVRB_even_dist<32)
|
||||||
allocdist0_1_even |= (1<<nVRB_even_dist);
|
allocdist0_1_even |= 1U << nVRB_even_dist;
|
||||||
else
|
else
|
||||||
allocdist1_1_even |= (1<<(nVRB_even_dist-32));
|
allocdist1_1_even |= 1U << (nVRB_even_dist - 32);
|
||||||
|
|
||||||
// Distributed Gap2, odd slot
|
// Distributed Gap2, odd slot
|
||||||
nVRB_odd_dist = get_prb(50,1,nVRB,1);
|
nVRB_odd_dist = get_prb(50,1,nVRB,1);
|
||||||
if (nVRB_odd_dist<32)
|
if (nVRB_odd_dist<32)
|
||||||
allocdist0_1_odd |= (1<<nVRB_odd_dist);
|
allocdist0_1_odd |= 1U << nVRB_odd_dist;
|
||||||
else
|
else
|
||||||
allocdist1_1_odd |= (1<<(nVRB_odd_dist-32));
|
allocdist1_1_odd |= 1U << (nVRB_odd_dist - 32);
|
||||||
|
|
||||||
RIV=computeRIV(50,RBstart,Lcrbs);
|
RIV=computeRIV(50,RBstart,Lcrbs);
|
||||||
|
|
||||||
@@ -811,13 +815,13 @@ void generate_RIV_tables(void)
|
|||||||
nVRB = Lcrbs-1+RBstart;
|
nVRB = Lcrbs-1+RBstart;
|
||||||
|
|
||||||
if (nVRB<32)
|
if (nVRB<32)
|
||||||
alloc0 |= (1<<nVRB);
|
alloc0 |= 1U << nVRB;
|
||||||
else if (nVRB<64)
|
else if (nVRB<64)
|
||||||
alloc1 |= (1<<(nVRB-32));
|
alloc1 |= 1U << (nVRB - 32);
|
||||||
else if (nVRB<96)
|
else if (nVRB<96)
|
||||||
alloc2 |= (1<<(nVRB-64));
|
alloc2 |= 1U << (nVRB - 64);
|
||||||
else
|
else
|
||||||
alloc3 |= (1<<(nVRB-96));
|
alloc3 |= 1U << (nVRB - 96);
|
||||||
|
|
||||||
// Distributed Gap1, even slot
|
// Distributed Gap1, even slot
|
||||||
nVRB_even_dist = get_prb(100,0,nVRB,0);
|
nVRB_even_dist = get_prb(100,0,nVRB,0);
|
||||||
@@ -825,15 +829,14 @@ void generate_RIV_tables(void)
|
|||||||
// if ((RBstart==0) && (Lcrbs<=8))
|
// if ((RBstart==0) && (Lcrbs<=8))
|
||||||
// printf("nVRB %d => nVRB_even_dist %d\n",nVRB,nVRB_even_dist);
|
// printf("nVRB %d => nVRB_even_dist %d\n",nVRB,nVRB_even_dist);
|
||||||
|
|
||||||
|
|
||||||
if (nVRB_even_dist<32)
|
if (nVRB_even_dist<32)
|
||||||
allocdist0_0_even |= (1<<nVRB_even_dist);
|
allocdist0_0_even |= 1U << nVRB_even_dist;
|
||||||
else if (nVRB_even_dist<64)
|
else if (nVRB_even_dist<64)
|
||||||
allocdist1_0_even |= (1<<(nVRB_even_dist-32));
|
allocdist1_0_even |= 1U << (nVRB_even_dist - 32);
|
||||||
else if (nVRB_even_dist<96)
|
else if (nVRB_even_dist<96)
|
||||||
allocdist2_0_even |= (1<<(nVRB_even_dist-64));
|
allocdist2_0_even |= 1U << (nVRB_even_dist - 64);
|
||||||
else
|
else
|
||||||
allocdist3_0_even |= (1<<(nVRB_even_dist-96));
|
allocdist3_0_even |= 1U << (nVRB_even_dist - 96);
|
||||||
/* if ((RBstart==0) && (Lcrbs<=8))
|
/* if ((RBstart==0) && (Lcrbs<=8))
|
||||||
printf("rballoc =>(%08x.%08x.%08x.%08x)\n",
|
printf("rballoc =>(%08x.%08x.%08x.%08x)\n",
|
||||||
allocdist0_0_even,
|
allocdist0_0_even,
|
||||||
@@ -845,38 +848,37 @@ void generate_RIV_tables(void)
|
|||||||
// Distributed Gap1, odd slot
|
// Distributed Gap1, odd slot
|
||||||
nVRB_odd_dist = get_prb(100,1,nVRB,0);
|
nVRB_odd_dist = get_prb(100,1,nVRB,0);
|
||||||
if (nVRB_odd_dist<32)
|
if (nVRB_odd_dist<32)
|
||||||
allocdist0_0_odd |= (1<<nVRB_odd_dist);
|
allocdist0_0_odd |= 1U << nVRB_odd_dist;
|
||||||
else if (nVRB_odd_dist<64)
|
else if (nVRB_odd_dist<64)
|
||||||
allocdist1_0_odd |= (1<<(nVRB_odd_dist-32));
|
allocdist1_0_odd |= 1U << (nVRB_odd_dist - 32);
|
||||||
else if (nVRB_odd_dist<96)
|
else if (nVRB_odd_dist<96)
|
||||||
allocdist2_0_odd |= (1<<(nVRB_odd_dist-64));
|
allocdist2_0_odd |= 1U << (nVRB_odd_dist - 64);
|
||||||
else
|
else
|
||||||
allocdist3_0_odd |= (1<<(nVRB_odd_dist-96));
|
allocdist3_0_odd |= 1U << (nVRB_odd_dist - 96);
|
||||||
|
|
||||||
|
|
||||||
// Distributed Gap2, even slot
|
// Distributed Gap2, even slot
|
||||||
nVRB_even_dist = get_prb(100,0,nVRB,1);
|
nVRB_even_dist = get_prb(100,0,nVRB,1);
|
||||||
if (nVRB_even_dist<32)
|
if (nVRB_even_dist<32)
|
||||||
allocdist0_1_even |= (1<<nVRB_even_dist);
|
allocdist0_1_even |= 1U << nVRB_even_dist;
|
||||||
else if (nVRB_even_dist<64)
|
else if (nVRB_even_dist<64)
|
||||||
allocdist1_1_even |= (1<<(nVRB_even_dist-32));
|
allocdist1_1_even |= 1U << (nVRB_even_dist - 32);
|
||||||
else if (nVRB_even_dist<96)
|
else if (nVRB_even_dist<96)
|
||||||
allocdist2_1_even |= (1<<(nVRB_even_dist-64));
|
allocdist2_1_even |= 1U << (nVRB_even_dist - 64);
|
||||||
else
|
else
|
||||||
allocdist3_1_even |= (1<<(nVRB_even_dist-96));
|
allocdist3_1_even |= 1U << (nVRB_even_dist - 96);
|
||||||
|
|
||||||
|
|
||||||
// Distributed Gap2, odd slot
|
// Distributed Gap2, odd slot
|
||||||
nVRB_odd_dist = get_prb(100,1,nVRB,1);
|
nVRB_odd_dist = get_prb(100,1,nVRB,1);
|
||||||
if (nVRB_odd_dist<32)
|
if (nVRB_odd_dist<32)
|
||||||
allocdist0_1_odd |= (1<<nVRB_odd_dist);
|
allocdist0_1_odd |= 1U << nVRB_odd_dist;
|
||||||
else if (nVRB_odd_dist<64)
|
else if (nVRB_odd_dist<64)
|
||||||
allocdist1_1_odd |= (1<<(nVRB_odd_dist-32));
|
allocdist1_1_odd |= 1U << (nVRB_odd_dist - 32);
|
||||||
else if (nVRB_odd_dist<96)
|
else if (nVRB_odd_dist<96)
|
||||||
allocdist2_1_odd |= (1<<(nVRB_odd_dist-64));
|
allocdist2_1_odd |= 1U << (nVRB_odd_dist - 64);
|
||||||
else
|
else
|
||||||
allocdist3_1_odd |= (1<<(nVRB_odd_dist-96));
|
allocdist3_1_odd |= 1U << (nVRB_odd_dist - 96);
|
||||||
|
|
||||||
|
|
||||||
RIV=computeRIV(100,RBstart,Lcrbs);
|
RIV=computeRIV(100,RBstart,Lcrbs);
|
||||||
|
|
||||||
|
|||||||
@@ -288,7 +288,7 @@ static void TPencode(void * arg) {
|
|||||||
LTE_DL_eNB_HARQ_t *hadlsch=rdata->dlsch->harq_processes[harq_pid];
|
LTE_DL_eNB_HARQ_t *hadlsch=rdata->dlsch->harq_processes[harq_pid];
|
||||||
|
|
||||||
if ( rdata-> round == 0) {
|
if ( rdata-> round == 0) {
|
||||||
uint8_t tmp[96+12+3+3*6144];
|
uint8_t tmp[96+12+3+3*6144] __attribute__((aligned(32)));
|
||||||
memset(tmp,LTE_NULL, TURBO_SIMD_SOFTBITS);
|
memset(tmp,LTE_NULL, TURBO_SIMD_SOFTBITS);
|
||||||
start_meas(rdata->te_stats);
|
start_meas(rdata->te_stats);
|
||||||
encoder(rdata->input,
|
encoder(rdata->input,
|
||||||
|
|||||||
@@ -64,6 +64,12 @@ extern uint16_t beta_cqi[16];
|
|||||||
extern uint16_t beta_ri[16];
|
extern uint16_t beta_ri[16];
|
||||||
extern uint16_t beta_ack[16];
|
extern uint16_t beta_ack[16];
|
||||||
|
|
||||||
|
static int errorRB(int rb, char * table, int line) {
|
||||||
|
LOG_E(PHY,"Received %d rb, impossble in table %s, at line %d\n", rb, table, line);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
#define rbAllocCheck(RBalL, TabLe) (RBalL) > sizeof(TabLe)/sizeof(*TabLe) ? errorRB(RBalL, #TabLe, __LINE__) : TabLe[RBalL]
|
||||||
void extract_dci1A_info(uint8_t N_RB_DL, frame_type_t frame_type, void *dci_pdu, DCI_INFO_EXTRACTED_t *pdci_info_extarcted)
|
void extract_dci1A_info(uint8_t N_RB_DL, frame_type_t frame_type, void *dci_pdu, DCI_INFO_EXTRACTED_t *pdci_info_extarcted)
|
||||||
{
|
{
|
||||||
uint8_t harq_pid=0;
|
uint8_t harq_pid=0;
|
||||||
@@ -974,28 +980,28 @@ int check_dci_format1_1a_coherency(DCI_format_t dci_format,
|
|||||||
{
|
{
|
||||||
switch (N_RB_DL) {
|
switch (N_RB_DL) {
|
||||||
case 6:
|
case 6:
|
||||||
NPRB = RIV2nb_rb_LUT6[rballoc];//NPRB;
|
NPRB = rbAllocCheck(rballoc, RIV2nb_rb_LUT6);
|
||||||
if(rah)
|
if(rah)
|
||||||
RIV_max = RIV_max6;
|
RIV_max = RIV_max6;
|
||||||
else
|
else
|
||||||
RIV_max = 0x3F;
|
RIV_max = 0x3F;
|
||||||
break;
|
break;
|
||||||
case 25:
|
case 25:
|
||||||
NPRB = RIV2nb_rb_LUT25[rballoc];//NPRB;
|
NPRB = rbAllocCheck(rballoc,RIV2nb_rb_LUT25);
|
||||||
if(rah)
|
if(rah)
|
||||||
RIV_max = RIV_max25;
|
RIV_max = RIV_max25;
|
||||||
else
|
else
|
||||||
RIV_max = 0x1FFF;
|
RIV_max = 0x1FFF;
|
||||||
break;
|
break;
|
||||||
case 50:
|
case 50:
|
||||||
NPRB = RIV2nb_rb_LUT50[rballoc];//NPRB;
|
NPRB = rbAllocCheck(rballoc,RIV2nb_rb_LUT50);
|
||||||
if(rah)
|
if(rah)
|
||||||
RIV_max = RIV_max50;
|
RIV_max = RIV_max50;
|
||||||
else
|
else
|
||||||
RIV_max = 0x1FFFF;
|
RIV_max = 0x1FFFF;
|
||||||
break;
|
break;
|
||||||
case 100:
|
case 100:
|
||||||
NPRB = RIV2nb_rb_LUT100[rballoc];//NPRB;
|
NPRB = rbAllocCheck(rballoc,RIV2nb_rb_LUT100);
|
||||||
if(rah)
|
if(rah)
|
||||||
RIV_max = RIV_max100;
|
RIV_max = RIV_max100;
|
||||||
else
|
else
|
||||||
@@ -1034,9 +1040,14 @@ int check_dci_format1_1a_coherency(DCI_format_t dci_format,
|
|||||||
// this is an eNB issue
|
// this is an eNB issue
|
||||||
// retransmisison but old and new TBS are different !!!
|
// retransmisison but old and new TBS are different !!!
|
||||||
// work around, consider it as a new transmission
|
// work around, consider it as a new transmission
|
||||||
LOG_E(PHY,"Format1A Retransmission but TBS are different: consider it as new transmission !!! \n");
|
LOG_E(PHY,
|
||||||
|
"Format1A Retransmission but TBS are different: consider it as new transmission !!!, round %d, mcs 1 %d, NPRB %d \n",
|
||||||
|
pdlsch0_harq->round,
|
||||||
|
mcs1,
|
||||||
|
NPRB);
|
||||||
pdlsch0_harq->round = 0;
|
pdlsch0_harq->round = 0;
|
||||||
//return(0); // ?? to cross check
|
//return(0); // ?? to cross check
|
||||||
|
return(0); // ?? to cross check
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1272,14 +1272,6 @@ uint32_t get_TBS_DL(uint8_t mcs, uint16_t nb_rb);
|
|||||||
@return Transport block size */
|
@return Transport block size */
|
||||||
uint32_t get_TBS_UL(uint8_t mcs, uint16_t nb_rb);
|
uint32_t get_TBS_UL(uint8_t mcs, uint16_t nb_rb);
|
||||||
|
|
||||||
/* \brief Return bit-map of resource allocation for a given DCI rballoc (RIV format) and vrb type
|
|
||||||
@param N_RB_DL number of PRB on DL
|
|
||||||
@param indicator for even/odd slot
|
|
||||||
@param vrb vrb index
|
|
||||||
@param Ngap Gap indicator
|
|
||||||
*/
|
|
||||||
uint32_t get_prb(int N_RB_DL,int odd_slot,int vrb,int Ngap);
|
|
||||||
|
|
||||||
/* \brief Return prb for a given vrb index
|
/* \brief Return prb for a given vrb index
|
||||||
@param vrb_type VRB type (0=localized,1=distributed)
|
@param vrb_type VRB type (0=localized,1=distributed)
|
||||||
@param rb_alloc_dci rballoc field from DCI
|
@param rb_alloc_dci rballoc field from DCI
|
||||||
|
|||||||
@@ -90,7 +90,7 @@ typedef struct {
|
|||||||
/// Redundancy-version of the current sub-frame
|
/// Redundancy-version of the current sub-frame
|
||||||
uint8_t rvidx;
|
uint8_t rvidx;
|
||||||
/// Turbo-code outputs (36-212 V8.6 2009-03, p.12
|
/// Turbo-code outputs (36-212 V8.6 2009-03, p.12
|
||||||
uint8_t d[MAX_NUM_ULSCH_SEGMENTS][(96+3+(3*6144))];
|
uint8_t *d[MAX_NUM_ULSCH_SEGMENTS];
|
||||||
/// Sub-block interleaver outputs (36-212 V8.6 2009-03, p.16-17)
|
/// Sub-block interleaver outputs (36-212 V8.6 2009-03, p.16-17)
|
||||||
uint8_t w[MAX_NUM_ULSCH_SEGMENTS][3*6144];
|
uint8_t w[MAX_NUM_ULSCH_SEGMENTS][3*6144];
|
||||||
/// Number of code segments (for definition see 36-212 V8.6 2009-03, p.9)
|
/// Number of code segments (for definition see 36-212 V8.6 2009-03, p.9)
|
||||||
|
|||||||
@@ -71,6 +71,7 @@ void free_ue_ulsch(LTE_UE_ULSCH_t *ulsch) {
|
|||||||
for (r=0; r<MAX_NUM_ULSCH_SEGMENTS; r++) {
|
for (r=0; r<MAX_NUM_ULSCH_SEGMENTS; r++) {
|
||||||
if (ulsch->harq_processes[i]->c[r]) {
|
if (ulsch->harq_processes[i]->c[r]) {
|
||||||
free16(ulsch->harq_processes[i]->c[r],((r==0)?8:0) + 3+768);
|
free16(ulsch->harq_processes[i]->c[r],((r==0)?8:0) + 3+768);
|
||||||
|
free16(ulsch->harq_processes[i]->d[r],0);
|
||||||
ulsch->harq_processes[i]->c[r] = NULL;
|
ulsch->harq_processes[i]->c[r] = NULL;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -86,7 +87,7 @@ void free_ue_ulsch(LTE_UE_ULSCH_t *ulsch) {
|
|||||||
|
|
||||||
LTE_UE_ULSCH_t *new_ue_ulsch(unsigned char N_RB_UL, uint8_t abstraction_flag) {
|
LTE_UE_ULSCH_t *new_ue_ulsch(unsigned char N_RB_UL, uint8_t abstraction_flag) {
|
||||||
LTE_UE_ULSCH_t *ulsch;
|
LTE_UE_ULSCH_t *ulsch;
|
||||||
unsigned char exit_flag = 0,i,j,r;
|
unsigned char exit_flag = 0;
|
||||||
unsigned char bw_scaling =1;
|
unsigned char bw_scaling =1;
|
||||||
|
|
||||||
switch (N_RB_UL) {
|
switch (N_RB_UL) {
|
||||||
@@ -113,7 +114,7 @@ LTE_UE_ULSCH_t *new_ue_ulsch(unsigned char N_RB_UL, uint8_t abstraction_flag) {
|
|||||||
memset(ulsch,0,sizeof(LTE_UE_ULSCH_t));
|
memset(ulsch,0,sizeof(LTE_UE_ULSCH_t));
|
||||||
ulsch->Mlimit = 4;
|
ulsch->Mlimit = 4;
|
||||||
|
|
||||||
for (i=0; i<8; i++) {
|
for (int i=0; i<8; i++) {
|
||||||
ulsch->harq_processes[i] = (LTE_UL_UE_HARQ_t *)malloc16(sizeof(LTE_UL_UE_HARQ_t));
|
ulsch->harq_processes[i] = (LTE_UL_UE_HARQ_t *)malloc16(sizeof(LTE_UL_UE_HARQ_t));
|
||||||
|
|
||||||
// printf("ulsch->harq_processes[%d] %p\n",i,ulsch->harq_processes[i]);
|
// printf("ulsch->harq_processes[%d] %p\n",i,ulsch->harq_processes[i]);
|
||||||
@@ -129,15 +130,11 @@ LTE_UE_ULSCH_t *new_ue_ulsch(unsigned char N_RB_UL, uint8_t abstraction_flag) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (abstraction_flag==0) {
|
if (abstraction_flag==0) {
|
||||||
for (r=0; r<MAX_NUM_ULSCH_SEGMENTS; r++) {
|
for (int r=0; r<MAX_NUM_ULSCH_SEGMENTS; r++) {
|
||||||
ulsch->harq_processes[i]->c[r] = (unsigned char *)malloc16(((r==0)?8:0) + 3+768); // account for filler in first segment and CRCs for multiple segment case
|
ulsch->harq_processes[i]->c[r] = malloc16_clear(((r==0)?8:0) + 3+768); // account for filler in first segment and CRCs for multiple segment case
|
||||||
|
AssertFatal(ulsch->harq_processes[i]->c[r], "");
|
||||||
if (ulsch->harq_processes[i]->c[r])
|
ulsch->harq_processes[i]->d[r] = malloc16_clear(96+3+(3*6144));
|
||||||
memset(ulsch->harq_processes[i]->c[r],0,((r==0)?8:0) + 3+768);
|
AssertFatal(ulsch->harq_processes[i]->d[r], "");
|
||||||
else {
|
|
||||||
LOG_E(PHY,"Can't get c\n");
|
|
||||||
exit_flag=2;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -148,15 +145,7 @@ LTE_UE_ULSCH_t *new_ue_ulsch(unsigned char N_RB_UL, uint8_t abstraction_flag) {
|
|||||||
exit_flag=3;
|
exit_flag=3;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if (!exit_flag)
|
||||||
if ((abstraction_flag == 0) && (exit_flag==0)) {
|
|
||||||
for (i=0; i<8; i++)
|
|
||||||
for (j=0; j<96; j++)
|
|
||||||
for (r=0; r<MAX_NUM_ULSCH_SEGMENTS; r++)
|
|
||||||
ulsch->harq_processes[i]->d[r][j] = LTE_NULL;
|
|
||||||
|
|
||||||
return(ulsch);
|
|
||||||
} else if (abstraction_flag==1)
|
|
||||||
return(ulsch);
|
return(ulsch);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -191,7 +180,7 @@ uint32_t ulsch_encoding(uint8_t *a,
|
|||||||
uint32_t Qprime_ACK=0,Qprime_CQI=0,Qprime_RI=0,len_ACK=0,len_RI=0;
|
uint32_t Qprime_ACK=0,Qprime_CQI=0,Qprime_RI=0,len_ACK=0,len_RI=0;
|
||||||
// uint32_t E;
|
// uint32_t E;
|
||||||
uint8_t ack_parity;
|
uint8_t ack_parity;
|
||||||
uint32_t i,q,j,iprime,j2;
|
uint32_t q,j,iprime,j2;
|
||||||
uint16_t o_RCC;
|
uint16_t o_RCC;
|
||||||
uint8_t o_flip[8];
|
uint8_t o_flip[8];
|
||||||
uint32_t wACK_idx;
|
uint32_t wACK_idx;
|
||||||
@@ -327,6 +316,8 @@ uint32_t ulsch_encoding(uint8_t *a,
|
|||||||
#endif
|
#endif
|
||||||
// offset=0;
|
// offset=0;
|
||||||
start_meas(te_stats);
|
start_meas(te_stats);
|
||||||
|
for (int z=0; z<96; z++)
|
||||||
|
ulsch->harq_processes[harq_pid]->d[r][z] = LTE_NULL;
|
||||||
encoder(ulsch->harq_processes[harq_pid]->c[r],
|
encoder(ulsch->harq_processes[harq_pid]->c[r],
|
||||||
Kr>>3,
|
Kr>>3,
|
||||||
&ulsch->harq_processes[harq_pid]->d[r][96],
|
&ulsch->harq_processes[harq_pid]->d[r][96],
|
||||||
@@ -539,8 +530,6 @@ uint32_t ulsch_encoding(uint8_t *a,
|
|||||||
ulsch->q);
|
ulsch->q);
|
||||||
}
|
}
|
||||||
|
|
||||||
i=0;
|
|
||||||
|
|
||||||
// Do RI coding
|
// Do RI coding
|
||||||
if (ulsch->O_RI == 1) {
|
if (ulsch->O_RI == 1) {
|
||||||
switch (Q_m) {
|
switch (Q_m) {
|
||||||
@@ -691,7 +680,7 @@ uint32_t ulsch_encoding(uint8_t *a,
|
|||||||
|
|
||||||
j=0;
|
j=0;
|
||||||
|
|
||||||
for (i=0; i<Qprime_RI; i++) {
|
for (int i=0; i<Qprime_RI; i++) {
|
||||||
r = Rmux_prime - 1 - (i>>2);
|
r = Rmux_prime - 1 - (i>>2);
|
||||||
|
|
||||||
for (q=0; q<Q_m; q++) {
|
for (q=0; q<Q_m; q++) {
|
||||||
@@ -725,7 +714,7 @@ uint32_t ulsch_encoding(uint8_t *a,
|
|||||||
}
|
}
|
||||||
*/
|
*/
|
||||||
|
|
||||||
for (i=0; i<Qprime_CQI; i++) {
|
for (int i=0; i<Qprime_CQI; i++) {
|
||||||
while (y[Q_m*j] != LTE_NULL) j++;
|
while (y[Q_m*j] != LTE_NULL) j++;
|
||||||
|
|
||||||
for (q=0; q<Q_m; q++) {
|
for (q=0; q<Q_m; q++) {
|
||||||
@@ -788,7 +777,7 @@ uint32_t ulsch_encoding(uint8_t *a,
|
|||||||
|
|
||||||
j=0;
|
j=0;
|
||||||
|
|
||||||
for (i=0; i<Qprime_ACK; i++) {
|
for (int i=0; i<Qprime_ACK; i++) {
|
||||||
r = Rmux_prime - 1 - (i>>2);
|
r = Rmux_prime - 1 - (i>>2);
|
||||||
|
|
||||||
for (q=0; q<Q_m; q++) {
|
for (q=0; q<Q_m; q++) {
|
||||||
@@ -808,7 +797,7 @@ uint32_t ulsch_encoding(uint8_t *a,
|
|||||||
|
|
||||||
switch (Q_m) {
|
switch (Q_m) {
|
||||||
case 2:
|
case 2:
|
||||||
for (i=0; i<Cmux; i++)
|
for (int i=0; i<Cmux; i++)
|
||||||
for (r=0; r<Rmux_prime; r++) {
|
for (r=0; r<Rmux_prime; r++) {
|
||||||
yptr=&y[((r*Cmux)+i)<<1];
|
yptr=&y[((r*Cmux)+i)<<1];
|
||||||
ulsch->h[j++] = *yptr++;
|
ulsch->h[j++] = *yptr++;
|
||||||
@@ -818,7 +807,7 @@ uint32_t ulsch_encoding(uint8_t *a,
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case 4:
|
case 4:
|
||||||
for (i=0; i<Cmux; i++)
|
for (int i=0; i<Cmux; i++)
|
||||||
for (r=0; r<Rmux_prime; r++) {
|
for (r=0; r<Rmux_prime; r++) {
|
||||||
yptr = &y[((r*Cmux)+i)<<2];
|
yptr = &y[((r*Cmux)+i)<<2];
|
||||||
ulsch->h[j++] = *yptr++;
|
ulsch->h[j++] = *yptr++;
|
||||||
@@ -830,7 +819,7 @@ uint32_t ulsch_encoding(uint8_t *a,
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case 6:
|
case 6:
|
||||||
for (i=0; i<Cmux; i++)
|
for (int i=0; i<Cmux; i++)
|
||||||
for (r=0; r<Rmux_prime; r++) {
|
for (r=0; r<Rmux_prime; r++) {
|
||||||
yptr = &y[((r*Cmux)+i)*6];
|
yptr = &y[((r*Cmux)+i)*6];
|
||||||
ulsch->h[j++] = *yptr++;
|
ulsch->h[j++] = *yptr++;
|
||||||
|
|||||||
@@ -226,10 +226,11 @@ void nr_modulation(uint32_t *in,
|
|||||||
i *= 24;
|
i *= 24;
|
||||||
bit_cnt = i * 8;
|
bit_cnt = i * 8;
|
||||||
while (bit_cnt < length) {
|
while (bit_cnt < length) {
|
||||||
x = *((uint32_t*)(in_bytes+i));
|
uint32_t xx;
|
||||||
x1 = x&4095;
|
memcpy(&xx, in_bytes+i, sizeof(xx));
|
||||||
|
x1 = xx & 4095;
|
||||||
out64[j++] = nr_64qam_mod_table[x1];
|
out64[j++] = nr_64qam_mod_table[x1];
|
||||||
x1 = (x>>12)&4095;
|
x1 = (xx >> 12) & 4095;
|
||||||
out64[j++] = nr_64qam_mod_table[x1];
|
out64[j++] = nr_64qam_mod_table[x1];
|
||||||
i += 3;
|
i += 3;
|
||||||
bit_cnt += 24;
|
bit_cnt += 24;
|
||||||
|
|||||||
@@ -67,6 +67,49 @@ int nr_est_timing_advance_pusch(PHY_VARS_gNB* gNB, int UE_id)
|
|||||||
return max_pos - sync_pos;
|
return max_pos - sync_pos;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int nr_est_timing_advance_srs(const NR_DL_FRAME_PARMS *frame_parms,
|
||||||
|
const int32_t srs_estimated_channel_time[][frame_parms->ofdm_symbol_size]) {
|
||||||
|
int timing_advance = 0;
|
||||||
|
int max_val = 0;
|
||||||
|
|
||||||
|
for (int i = 0; i < frame_parms->ofdm_symbol_size; i++) {
|
||||||
|
int temp = 0;
|
||||||
|
for (int aa = 0; aa < frame_parms->nb_antennas_rx; aa++) {
|
||||||
|
int Re = ((c16_t*)srs_estimated_channel_time[aa])[i].r;
|
||||||
|
int Im = ((c16_t*)srs_estimated_channel_time[aa])[i].i;
|
||||||
|
temp += (Re*Re/2) + (Im*Im/2);
|
||||||
|
}
|
||||||
|
if (temp > max_val) {
|
||||||
|
timing_advance = i;
|
||||||
|
max_val = temp;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (timing_advance > frame_parms->ofdm_symbol_size/2) {
|
||||||
|
timing_advance = timing_advance - frame_parms->ofdm_symbol_size;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Scale the 16 factor in N_TA calculation in 38.213 section 4.2 according to the used FFT size
|
||||||
|
const uint16_t bw_scaling = frame_parms->ofdm_symbol_size >> 7;
|
||||||
|
|
||||||
|
// do some integer rounding to improve TA accuracy
|
||||||
|
int sync_pos_rounded;
|
||||||
|
if (timing_advance > 0) {
|
||||||
|
sync_pos_rounded = timing_advance + (bw_scaling >> 1) - 1;
|
||||||
|
} else {
|
||||||
|
sync_pos_rounded = timing_advance - (bw_scaling >> 1) + 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
int timing_advance_update = sync_pos_rounded / bw_scaling;
|
||||||
|
|
||||||
|
// put timing advance command in 0..63 range
|
||||||
|
timing_advance_update += 31;
|
||||||
|
|
||||||
|
if (timing_advance_update < 0) timing_advance_update = 0;
|
||||||
|
if (timing_advance_update > 63) timing_advance_update = 63;
|
||||||
|
|
||||||
|
return timing_advance_update;
|
||||||
|
}
|
||||||
|
|
||||||
void dump_nr_I0_stats(FILE *fd,PHY_VARS_gNB *gNB) {
|
void dump_nr_I0_stats(FILE *fd,PHY_VARS_gNB *gNB) {
|
||||||
|
|
||||||
@@ -119,8 +162,8 @@ void gNB_I0_measurements(PHY_VARS_gNB *gNB,int slot, int first_symb,int num_symb
|
|||||||
for (int aarx=0; aarx<frame_parms->nb_antennas_rx;aarx++)
|
for (int aarx=0; aarx<frame_parms->nb_antennas_rx;aarx++)
|
||||||
measurements->n0_subband_power[aarx][rb]=0;
|
measurements->n0_subband_power[aarx][rb]=0;
|
||||||
}
|
}
|
||||||
offset0 = (slot&3)*(frame_parms->symbols_per_slot * frame_parms->ofdm_symbol_size) + (frame_parms->first_carrier_offset + (rb*12))%frame_parms->ofdm_symbol_size;
|
int offset0 = (slot&3)*(frame_parms->symbols_per_slot * frame_parms->ofdm_symbol_size) + (frame_parms->first_carrier_offset + (rb*12))%frame_parms->ofdm_symbol_size;
|
||||||
if ((gNB->rb_mask_ul[s][rb>>5]&(1<<(rb&31))) == 0) { // check that rb was not used in this subframe
|
if ((gNB->rb_mask_ul[s][rb >> 5] & (1U << (rb & 31))) == 0) { // check that rb was not used in this subframe
|
||||||
nb_symb[rb]++;
|
nb_symb[rb]++;
|
||||||
for (int aarx=0; aarx<frame_parms->nb_antennas_rx; aarx++) {
|
for (int aarx=0; aarx<frame_parms->nb_antennas_rx; aarx++) {
|
||||||
int offset = offset0 + (s*frame_parms->ofdm_symbol_size);
|
int offset = offset0 + (s*frame_parms->ofdm_symbol_size);
|
||||||
|
|||||||
@@ -949,9 +949,9 @@ void nr_pusch_ptrs_processing(PHY_VARS_gNB *gNB,
|
|||||||
}//Antenna loop
|
}//Antenna loop
|
||||||
}
|
}
|
||||||
|
|
||||||
uint32_t calc_power(uint16_t *x, uint32_t size) {
|
uint32_t calc_power(const int16_t *x, const uint32_t size) {
|
||||||
uint64_t sum_x = 0;
|
int64_t sum_x = 0;
|
||||||
uint64_t sum_x2 = 0;
|
int64_t sum_x2 = 0;
|
||||||
for(int k = 0; k<size; k++) {
|
for(int k = 0; k<size; k++) {
|
||||||
sum_x = sum_x + x[k];
|
sum_x = sum_x + x[k];
|
||||||
sum_x2 = sum_x2 + x[k]*x[k];
|
sum_x2 = sum_x2 + x[k]*x[k];
|
||||||
@@ -959,28 +959,34 @@ uint32_t calc_power(uint16_t *x, uint32_t size) {
|
|||||||
return sum_x2/size - (sum_x/size)*(sum_x/size);
|
return sum_x2/size - (sum_x/size)*(sum_x/size);
|
||||||
}
|
}
|
||||||
|
|
||||||
int nr_srs_channel_estimation(PHY_VARS_gNB *gNB,
|
int nr_srs_channel_estimation(const PHY_VARS_gNB *gNB,
|
||||||
int frame,
|
const int frame,
|
||||||
int slot,
|
const int slot,
|
||||||
nfapi_nr_srs_pdu_t *srs_pdu,
|
const nfapi_nr_srs_pdu_t *srs_pdu,
|
||||||
nr_srs_info_t *nr_srs_info,
|
const nr_srs_info_t *nr_srs_info,
|
||||||
int32_t *srs_generated_signal,
|
const int32_t *srs_generated_signal,
|
||||||
int32_t **srs_received_signal,
|
int32_t srs_received_signal[][gNB->frame_parms.ofdm_symbol_size*(1<<srs_pdu->num_symbols)],
|
||||||
int32_t **srs_estimated_channel_freq,
|
int32_t srs_ls_estimated_channel[][gNB->frame_parms.ofdm_symbol_size*(1<<srs_pdu->num_symbols)],
|
||||||
int32_t **srs_estimated_channel_time,
|
int32_t srs_estimated_channel_freq[][gNB->frame_parms.ofdm_symbol_size*(1<<srs_pdu->num_symbols)],
|
||||||
int32_t **srs_estimated_channel_time_shifted,
|
int32_t srs_estimated_channel_time[][gNB->frame_parms.ofdm_symbol_size],
|
||||||
uint32_t *noise_power) {
|
int32_t srs_estimated_channel_time_shifted[][gNB->frame_parms.ofdm_symbol_size],
|
||||||
|
uint32_t *signal_power,
|
||||||
|
uint32_t *noise_power_per_rb,
|
||||||
|
uint32_t *noise_power,
|
||||||
|
int8_t *snr_per_rb,
|
||||||
|
int8_t *snr) {
|
||||||
|
|
||||||
if(nr_srs_info->sc_list_length == 0) {
|
if(nr_srs_info->sc_list_length == 0) {
|
||||||
LOG_E(NR_PHY, "(%d.%d) nr_srs_info was not generated yet!\n", frame, slot);
|
LOG_E(NR_PHY, "(%d.%d) nr_srs_info was not generated yet!\n", frame, slot);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
NR_DL_FRAME_PARMS *frame_parms = &gNB->frame_parms;
|
const NR_DL_FRAME_PARMS *frame_parms = &gNB->frame_parms;
|
||||||
int32_t **srs_ls_estimated_channel = nr_srs_info->srs_ls_estimated_channel;
|
|
||||||
|
|
||||||
uint16_t noise_real[frame_parms->nb_antennas_rx*nr_srs_info->sc_list_length];
|
int16_t ch_real[frame_parms->nb_antennas_rx*nr_srs_info->sc_list_length];
|
||||||
uint16_t noise_imag[frame_parms->nb_antennas_rx*nr_srs_info->sc_list_length];
|
int16_t ch_imag[frame_parms->nb_antennas_rx*nr_srs_info->sc_list_length];
|
||||||
|
int16_t noise_real[frame_parms->nb_antennas_rx*nr_srs_info->sc_list_length];
|
||||||
|
int16_t noise_imag[frame_parms->nb_antennas_rx*nr_srs_info->sc_list_length];
|
||||||
|
|
||||||
int16_t ls_estimated[2];
|
int16_t ls_estimated[2];
|
||||||
|
|
||||||
@@ -993,11 +999,11 @@ int nr_srs_channel_estimation(PHY_VARS_gNB *gNB,
|
|||||||
|
|
||||||
for(int sc_idx = 0; sc_idx < nr_srs_info->sc_list_length; sc_idx++) {
|
for(int sc_idx = 0; sc_idx < nr_srs_info->sc_list_length; sc_idx++) {
|
||||||
|
|
||||||
int16_t generated_real = srs_generated_signal[nr_srs_info->sc_list[sc_idx]] & 0xFFFF;
|
int16_t generated_real = ((c16_t*)srs_generated_signal)[nr_srs_info->sc_list[sc_idx]].r;
|
||||||
int16_t generated_imag = (srs_generated_signal[nr_srs_info->sc_list[sc_idx]] >> 16) & 0xFFFF;
|
int16_t generated_imag = ((c16_t*)srs_generated_signal)[nr_srs_info->sc_list[sc_idx]].i;
|
||||||
|
|
||||||
int16_t received_real = srs_received_signal[ant][nr_srs_info->sc_list[sc_idx]] & 0xFFFF;
|
int16_t received_real = ((c16_t*)srs_received_signal[ant])[nr_srs_info->sc_list[sc_idx]].r;
|
||||||
int16_t received_imag = (srs_received_signal[ant][nr_srs_info->sc_list[sc_idx]] >> 16) & 0xFFFF;
|
int16_t received_imag = ((c16_t*)srs_received_signal[ant])[nr_srs_info->sc_list[sc_idx]].i;
|
||||||
|
|
||||||
// We know that nr_srs_info->srs_generated_signal_bits bits are enough to represent the generated_real and generated_imag.
|
// We know that nr_srs_info->srs_generated_signal_bits bits are enough to represent the generated_real and generated_imag.
|
||||||
// So we only need a nr_srs_info->srs_generated_signal_bits shift to ensure that the result fits into 16 bits.
|
// So we only need a nr_srs_info->srs_generated_signal_bits shift to ensure that the result fits into 16 bits.
|
||||||
@@ -1068,8 +1074,10 @@ int nr_srs_channel_estimation(PHY_VARS_gNB *gNB,
|
|||||||
|
|
||||||
// Compute noise
|
// Compute noise
|
||||||
for(int sc_idx = 0; sc_idx < nr_srs_info->sc_list_length; sc_idx++) {
|
for(int sc_idx = 0; sc_idx < nr_srs_info->sc_list_length; sc_idx++) {
|
||||||
noise_real[ant*nr_srs_info->sc_list_length + sc_idx] = abs((int16_t)((srs_ls_estimated_channel[ant][nr_srs_info->sc_list[sc_idx]]-srs_estimated_channel_freq[ant][nr_srs_info->sc_list[sc_idx]]) & 0xFFFF));
|
ch_real[ant*nr_srs_info->sc_list_length + sc_idx] = ((c16_t*)srs_estimated_channel_freq[ant])[nr_srs_info->sc_list[sc_idx]].r;
|
||||||
noise_imag[ant*nr_srs_info->sc_list_length + sc_idx] = abs((int16_t)(((srs_ls_estimated_channel[ant][nr_srs_info->sc_list[sc_idx]]-srs_estimated_channel_freq[ant][nr_srs_info->sc_list[sc_idx]]) >> 16) & 0xFFFF));
|
ch_imag[ant*nr_srs_info->sc_list_length + sc_idx] = ((c16_t*)srs_estimated_channel_freq[ant])[nr_srs_info->sc_list[sc_idx]].i;
|
||||||
|
noise_real[ant*nr_srs_info->sc_list_length + sc_idx] = abs(((c16_t*)srs_ls_estimated_channel[ant])[nr_srs_info->sc_list[sc_idx]].r - ch_real[ant*nr_srs_info->sc_list_length + sc_idx]);
|
||||||
|
noise_imag[ant*nr_srs_info->sc_list_length + sc_idx] = abs(((c16_t*)srs_ls_estimated_channel[ant])[nr_srs_info->sc_list[sc_idx]].i - ch_imag[ant*nr_srs_info->sc_list_length + sc_idx]);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Convert to time domain
|
// Convert to time domain
|
||||||
@@ -1086,11 +1094,74 @@ int nr_srs_channel_estimation(PHY_VARS_gNB *gNB,
|
|||||||
(gNB->frame_parms.ofdm_symbol_size>>1)*sizeof(int32_t));
|
(gNB->frame_parms.ofdm_symbol_size>>1)*sizeof(int32_t));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Compute signal power
|
||||||
|
*signal_power = calc_power(ch_real,frame_parms->nb_antennas_rx*nr_srs_info->sc_list_length)
|
||||||
|
+ calc_power(ch_imag,frame_parms->nb_antennas_rx*nr_srs_info->sc_list_length);
|
||||||
|
|
||||||
|
#ifdef SRS_DEBUG
|
||||||
|
LOG_I(NR_PHY,"signal_power = %u\n", *signal_power);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
if (*signal_power == 0) {
|
||||||
|
LOG_W(NR_PHY, "Received SRS signal power is 0\n");
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Compute noise power
|
||||||
|
|
||||||
|
const uint8_t signal_power_bits = log2_approx(*signal_power);
|
||||||
|
const uint8_t factor_bits = signal_power_bits < 32 ? 32 - signal_power_bits : 0; // 32 due to input of dB_fixed(uint32_t x)
|
||||||
|
const int32_t factor_dB = dB_fixed(1<<factor_bits);
|
||||||
|
|
||||||
|
const uint64_t subcarrier_offset = frame_parms->first_carrier_offset + srs_pdu->bwp_start*12;
|
||||||
|
const uint8_t srs_symbols_per_rb = srs_pdu->comb_size == 0 ? 6 : 3;
|
||||||
|
const uint8_t n_noise_estimates = frame_parms->nb_antennas_rx*srs_symbols_per_rb;
|
||||||
|
uint8_t count_estimates = 0;
|
||||||
|
uint64_t sum_re = 0;
|
||||||
|
uint64_t sum_re2 = 0;
|
||||||
|
uint64_t sum_im = 0;
|
||||||
|
uint64_t sum_im2 = 0;
|
||||||
|
|
||||||
|
for (int sc_idx = 0; sc_idx < nr_srs_info->sc_list_length; sc_idx++) {
|
||||||
|
|
||||||
|
int subcarrier0 = nr_srs_info->sc_list[sc_idx]-subcarrier_offset;
|
||||||
|
if(subcarrier0 < 0) {
|
||||||
|
subcarrier0 = subcarrier0 + frame_parms->ofdm_symbol_size;
|
||||||
|
}
|
||||||
|
int rb = subcarrier0/NR_NB_SC_PER_RB;
|
||||||
|
|
||||||
|
for (int ant = 0; ant < frame_parms->nb_antennas_rx; ant++) {
|
||||||
|
|
||||||
|
sum_re = sum_re + noise_real[ant*nr_srs_info->sc_list_length+sc_idx];
|
||||||
|
sum_re2 = sum_re2 + noise_real[ant*nr_srs_info->sc_list_length+sc_idx]*noise_real[ant*nr_srs_info->sc_list_length+sc_idx];
|
||||||
|
sum_im = sum_im + noise_imag[ant*nr_srs_info->sc_list_length+sc_idx];
|
||||||
|
sum_im2 = sum_im2 + noise_imag[ant*nr_srs_info->sc_list_length+sc_idx]*noise_imag[ant*nr_srs_info->sc_list_length+sc_idx];
|
||||||
|
|
||||||
|
count_estimates++;
|
||||||
|
if (count_estimates == n_noise_estimates) {
|
||||||
|
noise_power_per_rb[rb] = sum_re2/n_noise_estimates - (sum_re/n_noise_estimates)*(sum_re/n_noise_estimates) +
|
||||||
|
sum_im2/n_noise_estimates - (sum_im/n_noise_estimates)*(sum_im/n_noise_estimates);
|
||||||
|
snr_per_rb[rb] = dB_fixed((int32_t)((*signal_power<<factor_bits)/noise_power_per_rb[rb])) - factor_dB;
|
||||||
|
count_estimates = 0;
|
||||||
|
sum_re = 0;
|
||||||
|
sum_re2 = 0;
|
||||||
|
sum_im = 0;
|
||||||
|
sum_im2 = 0;
|
||||||
|
|
||||||
|
#ifdef SRS_DEBUG
|
||||||
|
LOG_I(NR_PHY,"noise_power_per_rb[%i] = %i, snr_per_rb[%i] = %i dB\n", rb, noise_power_per_rb[rb], rb, snr_per_rb[rb]);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
*noise_power = calc_power(noise_real,frame_parms->nb_antennas_rx*nr_srs_info->sc_list_length)
|
*noise_power = calc_power(noise_real,frame_parms->nb_antennas_rx*nr_srs_info->sc_list_length)
|
||||||
+ calc_power(noise_imag,frame_parms->nb_antennas_rx*nr_srs_info->sc_list_length);
|
+ calc_power(noise_imag,frame_parms->nb_antennas_rx*nr_srs_info->sc_list_length);
|
||||||
|
|
||||||
|
*snr = dB_fixed((int32_t)((*signal_power<<factor_bits)/(*noise_power))) - factor_dB;
|
||||||
|
|
||||||
#ifdef SRS_DEBUG
|
#ifdef SRS_DEBUG
|
||||||
uint64_t subcarrier_offset = frame_parms->first_carrier_offset + srs_pdu->bwp_start*12;
|
|
||||||
uint8_t R = srs_pdu->comb_size == 0 ? 2 : 4;
|
uint8_t R = srs_pdu->comb_size == 0 ? 2 : 4;
|
||||||
for (int ant = 0; ant < frame_parms->nb_antennas_rx; ant++) {
|
for (int ant = 0; ant < frame_parms->nb_antennas_rx; ant++) {
|
||||||
for(int sc_idx = 0; sc_idx < nr_srs_info->sc_list_length; sc_idx++) {
|
for(int sc_idx = 0; sc_idx < nr_srs_info->sc_list_length; sc_idx++) {
|
||||||
@@ -1118,7 +1189,7 @@ int nr_srs_channel_estimation(PHY_VARS_gNB *gNB,
|
|||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
LOG_I(NR_PHY,"noise_power = %u\n", *noise_power);
|
LOG_I(NR_PHY,"noise_power = %u, SNR = %i dB\n", *noise_power, *snr);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|||||||
@@ -55,6 +55,9 @@ void nr_gnb_measurements(PHY_VARS_gNB *gNB, uint8_t ulsch_id, unsigned char harq
|
|||||||
|
|
||||||
int nr_est_timing_advance_pusch(PHY_VARS_gNB* phy_vars_gNB, int UE_id);
|
int nr_est_timing_advance_pusch(PHY_VARS_gNB* phy_vars_gNB, int UE_id);
|
||||||
|
|
||||||
|
int nr_est_timing_advance_srs(const NR_DL_FRAME_PARMS *frame_parms,
|
||||||
|
const int32_t srs_estimated_channel_time[][frame_parms->ofdm_symbol_size]);
|
||||||
|
|
||||||
void nr_pusch_ptrs_processing(PHY_VARS_gNB *gNB,
|
void nr_pusch_ptrs_processing(PHY_VARS_gNB *gNB,
|
||||||
NR_DL_FRAME_PARMS *frame_parms,
|
NR_DL_FRAME_PARMS *frame_parms,
|
||||||
nfapi_nr_pusch_pdu_t *rel15_ul,
|
nfapi_nr_pusch_pdu_t *rel15_ul,
|
||||||
@@ -63,15 +66,20 @@ void nr_pusch_ptrs_processing(PHY_VARS_gNB *gNB,
|
|||||||
unsigned char symbol,
|
unsigned char symbol,
|
||||||
uint32_t nb_re_pusch);
|
uint32_t nb_re_pusch);
|
||||||
|
|
||||||
int nr_srs_channel_estimation(PHY_VARS_gNB *gNB,
|
int nr_srs_channel_estimation(const PHY_VARS_gNB *gNB,
|
||||||
int frame,
|
const int frame,
|
||||||
int slot,
|
const int slot,
|
||||||
nfapi_nr_srs_pdu_t *srs_pdu,
|
const nfapi_nr_srs_pdu_t *srs_pdu,
|
||||||
nr_srs_info_t *nr_srs_info,
|
const nr_srs_info_t *nr_srs_info,
|
||||||
int32_t *srs_generated_signal,
|
const int32_t *srs_generated_signal,
|
||||||
int32_t **srs_received_signal,
|
int32_t srs_received_signal[][gNB->frame_parms.ofdm_symbol_size*(1<<srs_pdu->num_symbols)],
|
||||||
int32_t **srs_estimated_channel_freq,
|
int32_t srs_ls_estimated_channel[][gNB->frame_parms.ofdm_symbol_size*(1<<srs_pdu->num_symbols)],
|
||||||
int32_t **srs_estimated_channel_time,
|
int32_t srs_estimated_channel_freq[][gNB->frame_parms.ofdm_symbol_size*(1<<srs_pdu->num_symbols)],
|
||||||
int32_t **srs_estimated_channel_time_shifted,
|
int32_t srs_estimated_channel_time[][gNB->frame_parms.ofdm_symbol_size],
|
||||||
uint32_t *noise_power);
|
int32_t srs_estimated_channel_time_shifted[][gNB->frame_parms.ofdm_symbol_size],
|
||||||
|
uint32_t *signal_power,
|
||||||
|
uint32_t *noise_power_per_rb,
|
||||||
|
uint32_t *noise_power,
|
||||||
|
int8_t *snr_per_rb,
|
||||||
|
int8_t *snr);
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -123,7 +123,6 @@ void nr_generate_pdsch(processingData_L1tx_t *msgTx,
|
|||||||
rel15->dlDmrsSymbPos);
|
rel15->dlDmrsSymbPos);
|
||||||
n_ptrs = (rel15->rbSize + rel15->PTRSFreqDensity - 1)/rel15->PTRSFreqDensity;
|
n_ptrs = (rel15->rbSize + rel15->PTRSFreqDensity - 1)/rel15->PTRSFreqDensity;
|
||||||
}
|
}
|
||||||
int16_t mod_ptrs[n_ptrs<<1] __attribute__ ((aligned(16)));
|
|
||||||
|
|
||||||
/// CRC, coding, interleaving and rate matching
|
/// CRC, coding, interleaving and rate matching
|
||||||
AssertFatal(harq->pdu!=NULL,"harq->pdu is null\n");
|
AssertFatal(harq->pdu!=NULL,"harq->pdu is null\n");
|
||||||
@@ -302,12 +301,14 @@ void nr_generate_pdsch(processingData_L1tx_t *msgTx,
|
|||||||
|
|
||||||
/* calculate if current symbol is PTRS symbols */
|
/* calculate if current symbol is PTRS symbols */
|
||||||
ptrs_idx = 0;
|
ptrs_idx = 0;
|
||||||
|
int16_t *mod_ptrs = NULL;
|
||||||
if(rel15->pduBitmap & 0x1) {
|
if(rel15->pduBitmap & 0x1) {
|
||||||
ptrs_symbol = is_ptrs_symbol(l,dlPtrsSymPos);
|
ptrs_symbol = is_ptrs_symbol(l,dlPtrsSymPos);
|
||||||
if(ptrs_symbol) {
|
if(ptrs_symbol) {
|
||||||
/* PTRS QPSK Modulation for each OFDM symbol in a slot */
|
/* PTRS QPSK Modulation for each OFDM symbol in a slot */
|
||||||
LOG_D(PHY,"Doing ptrs modulation for symbol %d, n_ptrs %d\n",l,n_ptrs);
|
LOG_D(PHY,"Doing ptrs modulation for symbol %d, n_ptrs %d\n",l,n_ptrs);
|
||||||
|
int16_t mod_ptrsBuf[n_ptrs<<1] __attribute__ ((aligned(16)));
|
||||||
|
mod_ptrs =mod_ptrsBuf;
|
||||||
nr_modulation(pdsch_dmrs[l][rel15->SCID], (n_ptrs<<1), DMRS_MOD_ORDER, mod_ptrs);
|
nr_modulation(pdsch_dmrs[l][rel15->SCID], (n_ptrs<<1), DMRS_MOD_ORDER, mod_ptrs);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -35,6 +35,7 @@
|
|||||||
#include "PHY/NR_TRANSPORT/nr_transport_proto.h"
|
#include "PHY/NR_TRANSPORT/nr_transport_proto.h"
|
||||||
#include "PHY/LTE_REFSIG/lte_refsig.h"
|
#include "PHY/LTE_REFSIG/lte_refsig.h"
|
||||||
#include "PHY/sse_intrin.h"
|
#include "PHY/sse_intrin.h"
|
||||||
|
#include "executables/softmodem-common.h"
|
||||||
|
|
||||||
//#define DEBUG_PBCH
|
//#define DEBUG_PBCH
|
||||||
//#define DEBUG_PBCH_ENCODING
|
//#define DEBUG_PBCH_ENCODING
|
||||||
@@ -248,6 +249,9 @@ int nr_generate_pbch(nfapi_nr_dl_tti_ssb_pdu *ssb_pdu,
|
|||||||
for (int i=0; i<NR_PBCH_PDU_BITS; i++)
|
for (int i=0; i<NR_PBCH_PDU_BITS; i++)
|
||||||
pbch->pbch_a |= ((pbch_pdu[i>>3]>>(7-(i&7)))&1)<<i;
|
pbch->pbch_a |= ((pbch_pdu[i>>3]>>(7-(i&7)))&1)<<i;
|
||||||
|
|
||||||
|
// NSA to signal no coreset0
|
||||||
|
const int ssb_sc_offset = get_softmodem_params()->sa ? config->ssb_table.ssb_subcarrier_offset.value : 31;
|
||||||
|
|
||||||
#ifdef DEBUG_PBCH_ENCODING
|
#ifdef DEBUG_PBCH_ENCODING
|
||||||
for (int i=0; i<3; i++)
|
for (int i=0; i<3; i++)
|
||||||
printf("pbch_pdu[%d]: 0x%02x\n", i, pbch_pdu[i]);
|
printf("pbch_pdu[%d]: 0x%02x\n", i, pbch_pdu[i]);
|
||||||
@@ -265,7 +269,7 @@ int nr_generate_pbch(nfapi_nr_dl_tti_ssb_pdu *ssb_pdu,
|
|||||||
for (int i=0; i<3; i++)
|
for (int i=0; i<3; i++)
|
||||||
pbch->pbch_a |= ((ssb_index>>(5-i))&1)<<(29+i); // resp. 6th, 5th and 4th bits of ssb_index
|
pbch->pbch_a |= ((ssb_index>>(5-i))&1)<<(29+i); // resp. 6th, 5th and 4th bits of ssb_index
|
||||||
else
|
else
|
||||||
pbch->pbch_a |= ((config->ssb_table.ssb_subcarrier_offset.value>>4)&1)<<29; //MSB of k_SSB (bit index 4)
|
pbch->pbch_a |= ((ssb_sc_offset>>4)&1)<<29; //MSB of k_SSB (bit index 4)
|
||||||
|
|
||||||
LOG_D(PHY,"After extra byte: pbch_a = 0x%08x\n",pbch->pbch_a);
|
LOG_D(PHY,"After extra byte: pbch_a = 0x%08x\n",pbch->pbch_a);
|
||||||
|
|
||||||
|
|||||||
@@ -330,7 +330,7 @@ int nr_get_srs_signal(PHY_VARS_gNB *gNB,
|
|||||||
int slot,
|
int slot,
|
||||||
nfapi_nr_srs_pdu_t *srs_pdu,
|
nfapi_nr_srs_pdu_t *srs_pdu,
|
||||||
nr_srs_info_t *nr_srs_info,
|
nr_srs_info_t *nr_srs_info,
|
||||||
int32_t **srs_received_signal);
|
int32_t srs_received_signal[][gNB->frame_parms.ofdm_symbol_size*(1<<srs_pdu->num_symbols)]);
|
||||||
|
|
||||||
void init_prach_list(PHY_VARS_gNB *gNB);
|
void init_prach_list(PHY_VARS_gNB *gNB);
|
||||||
void init_prach_ru_list(RU_t *ru);
|
void init_prach_ru_list(RU_t *ru);
|
||||||
|
|||||||
@@ -98,7 +98,7 @@ int nr_get_srs_signal(PHY_VARS_gNB *gNB,
|
|||||||
int slot,
|
int slot,
|
||||||
nfapi_nr_srs_pdu_t *srs_pdu,
|
nfapi_nr_srs_pdu_t *srs_pdu,
|
||||||
nr_srs_info_t *nr_srs_info,
|
nr_srs_info_t *nr_srs_info,
|
||||||
int32_t **srs_received_signal) {
|
int32_t srs_received_signal[][gNB->frame_parms.ofdm_symbol_size*(1<<srs_pdu->num_symbols)]) {
|
||||||
|
|
||||||
if(nr_srs_info->sc_list_length == 0) {
|
if(nr_srs_info->sc_list_length == 0) {
|
||||||
LOG_E(NR_PHY, "(%d.%d) nr_srs_info was not generated yet!\n", frame, slot);
|
LOG_E(NR_PHY, "(%d.%d) nr_srs_info was not generated yet!\n", frame, slot);
|
||||||
@@ -113,6 +113,7 @@ int nr_get_srs_signal(PHY_VARS_gNB *gNB,
|
|||||||
uint64_t symbol_offset = (n_symbols+l0)*frame_parms->ofdm_symbol_size;
|
uint64_t symbol_offset = (n_symbols+l0)*frame_parms->ofdm_symbol_size;
|
||||||
|
|
||||||
int32_t *rx_signal;
|
int32_t *rx_signal;
|
||||||
|
bool no_srs_signal = true;
|
||||||
for (int ant = 0; ant < frame_parms->nb_antennas_rx; ant++) {
|
for (int ant = 0; ant < frame_parms->nb_antennas_rx; ant++) {
|
||||||
|
|
||||||
memset(srs_received_signal[ant], 0, frame_parms->ofdm_symbol_size*sizeof(int32_t));
|
memset(srs_received_signal[ant], 0, frame_parms->ofdm_symbol_size*sizeof(int32_t));
|
||||||
@@ -121,6 +122,10 @@ int nr_get_srs_signal(PHY_VARS_gNB *gNB,
|
|||||||
for(int sc_idx = 0; sc_idx < nr_srs_info->sc_list_length; sc_idx++) {
|
for(int sc_idx = 0; sc_idx < nr_srs_info->sc_list_length; sc_idx++) {
|
||||||
srs_received_signal[ant][nr_srs_info->sc_list[sc_idx]] = rx_signal[nr_srs_info->sc_list[sc_idx]];
|
srs_received_signal[ant][nr_srs_info->sc_list[sc_idx]] = rx_signal[nr_srs_info->sc_list[sc_idx]];
|
||||||
|
|
||||||
|
if (rx_signal[nr_srs_info->sc_list[sc_idx]] != 0) {
|
||||||
|
no_srs_signal = false;
|
||||||
|
}
|
||||||
|
|
||||||
#ifdef SRS_DEBUG
|
#ifdef SRS_DEBUG
|
||||||
uint64_t subcarrier_offset = frame_parms->first_carrier_offset + srs_pdu->bwp_start*12;
|
uint64_t subcarrier_offset = frame_parms->first_carrier_offset + srs_pdu->bwp_start*12;
|
||||||
int subcarrier_log = nr_srs_info->sc_list[sc_idx]-subcarrier_offset;
|
int subcarrier_log = nr_srs_info->sc_list[sc_idx]-subcarrier_offset;
|
||||||
@@ -140,5 +145,11 @@ int nr_get_srs_signal(PHY_VARS_gNB *gNB,
|
|||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return 0;
|
|
||||||
|
if (no_srs_signal) {
|
||||||
|
LOG_W(NR_PHY, "No SRS signal\n");
|
||||||
|
return -1;
|
||||||
|
} else {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
@@ -466,88 +466,87 @@ int nr_rx_pdsch(PHY_VARS_NR_UE *ue,
|
|||||||
if (cpumeas(CPUMEAS_GETSTATE))
|
if (cpumeas(CPUMEAS_GETSTATE))
|
||||||
LOG_D(PHY, "[AbsSFN %u.%d] Slot%d Symbol %d: Channel Combine and zero forcing %5.2f \n",frame,nr_slot_rx,slot,symbol,ue->generic_stat_bis[proc->thread_id][slot].p_time/(cpuf*1000.0));
|
LOG_D(PHY, "[AbsSFN %u.%d] Slot%d Symbol %d: Channel Combine and zero forcing %5.2f \n",frame,nr_slot_rx,slot,symbol,ue->generic_stat_bis[proc->thread_id][slot].p_time/(cpuf*1000.0));
|
||||||
|
|
||||||
start_meas(&ue->generic_stat_bis[proc->thread_id][slot]);
|
start_meas(&ue->generic_stat_bis[proc->thread_id][slot]);
|
||||||
/* Store the valid DL RE's */
|
/* Store the valid DL RE's */
|
||||||
pdsch_vars[gNB_id]->dl_valid_re[symbol-1] = nb_re_pdsch;
|
pdsch_vars[gNB_id]->dl_valid_re[symbol-1] = nb_re_pdsch;
|
||||||
|
|
||||||
if(dlsch0_harq->status == ACTIVE) {
|
if(dlsch0_harq->status == ACTIVE) {
|
||||||
startSymbIdx = dlsch0_harq->start_symbol;
|
startSymbIdx = dlsch0_harq->start_symbol;
|
||||||
nbSymb = dlsch0_harq->nb_symbols;
|
nbSymb = dlsch0_harq->nb_symbols;
|
||||||
pduBitmap = dlsch0_harq->pduBitmap;
|
pduBitmap = dlsch0_harq->pduBitmap;
|
||||||
}
|
}
|
||||||
if(dlsch1_harq) {
|
if(dlsch1_harq) {
|
||||||
startSymbIdx = dlsch1_harq->start_symbol;
|
startSymbIdx = dlsch1_harq->start_symbol;
|
||||||
nbSymb = dlsch1_harq->nb_symbols;
|
nbSymb = dlsch1_harq->nb_symbols;
|
||||||
pduBitmap = dlsch1_harq->pduBitmap;
|
pduBitmap = dlsch1_harq->pduBitmap;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Check for PTRS bitmap and process it respectively */
|
/* Check for PTRS bitmap and process it respectively */
|
||||||
if((pduBitmap & 0x1) && (type == PDSCH)) {
|
if((pduBitmap & 0x1) && (type == PDSCH)) {
|
||||||
nr_pdsch_ptrs_processing(ue,
|
nr_pdsch_ptrs_processing(ue,
|
||||||
pdsch_vars,
|
pdsch_vars,
|
||||||
frame_parms,
|
frame_parms,
|
||||||
dlsch0_harq,
|
dlsch0_harq,
|
||||||
dlsch1_harq,
|
dlsch1_harq,
|
||||||
gNB_id,
|
gNB_id,
|
||||||
nr_slot_rx,
|
nr_slot_rx,
|
||||||
symbol,
|
symbol,
|
||||||
(nb_rb_pdsch*12),
|
(nb_rb_pdsch*12),
|
||||||
dlsch[0]->rnti,rx_type);
|
dlsch[0]->rnti,rx_type);
|
||||||
pdsch_vars[gNB_id]->dl_valid_re[symbol-1] -= pdsch_vars[gNB_id]->ptrs_re_per_slot[0][symbol];
|
pdsch_vars[gNB_id]->dl_valid_re[symbol-1] -= pdsch_vars[gNB_id]->ptrs_re_per_slot[0][symbol];
|
||||||
}
|
}
|
||||||
|
|
||||||
/* at last symbol in a slot calculate LLR's for whole slot */
|
/* at last symbol in a slot calculate LLR's for whole slot */
|
||||||
if(symbol == (startSymbIdx + nbSymb -1)) {
|
if(symbol == (startSymbIdx + nbSymb -1)) {
|
||||||
for(uint8_t i =startSymbIdx; i < (startSymbIdx+nbSymb);i++) {
|
for(uint8_t i =startSymbIdx; i < (startSymbIdx+nbSymb);i++) {
|
||||||
/* re evaluating the first symbol flag as LLR's are done in symbol loop */
|
/* re evaluating the first symbol flag as LLR's are done in symbol loop */
|
||||||
if(i == startSymbIdx && i < 3) {
|
if(i == startSymbIdx && i < 3) {
|
||||||
first_symbol_flag =1;
|
first_symbol_flag =1;
|
||||||
}
|
|
||||||
else {
|
|
||||||
first_symbol_flag=0;
|
|
||||||
}
|
|
||||||
/* Calculate LLR's for each symbol */
|
|
||||||
nr_dlsch_llr(pdsch_vars, frame_parms,
|
|
||||||
rxdataF_comp_ptr, dl_ch_mag_ptr,
|
|
||||||
dlsch0_harq, dlsch1_harq,
|
|
||||||
rx_type, harq_pid,
|
|
||||||
gNB_id, gNB_id_i,
|
|
||||||
first_symbol_flag,
|
|
||||||
i, nb_rb_pdsch,
|
|
||||||
codeword_TB0, codeword_TB1,
|
|
||||||
pdsch_vars[gNB_id]->dl_valid_re[i-1],
|
|
||||||
nr_slot_rx, beamforming_mode);
|
|
||||||
}
|
}
|
||||||
|
else {
|
||||||
int dmrs_type = dlsch[0]->harq_processes[harq_pid]->dmrsConfigType;
|
first_symbol_flag=0;
|
||||||
uint8_t nb_re_dmrs;
|
|
||||||
uint16_t dmrs_len = get_num_dmrs(dlsch[0]->harq_processes[harq_pid]->dlDmrsSymbPos);
|
|
||||||
if (dmrs_type==NFAPI_NR_DMRS_TYPE1) {
|
|
||||||
nb_re_dmrs = 6*dlsch[0]->harq_processes[harq_pid]->n_dmrs_cdm_groups;
|
|
||||||
} else {
|
|
||||||
nb_re_dmrs = 4*dlsch[0]->harq_processes[harq_pid]->n_dmrs_cdm_groups;
|
|
||||||
}
|
}
|
||||||
dlsch[0]->harq_processes[harq_pid]->G = nr_get_G(dlsch[0]->harq_processes[harq_pid]->nb_rb,
|
/* Calculate LLR's for each symbol */
|
||||||
dlsch[0]->harq_processes[harq_pid]->nb_symbols,
|
nr_dlsch_llr(pdsch_vars, frame_parms,
|
||||||
nb_re_dmrs,
|
rxdataF_comp_ptr, dl_ch_mag_ptr,
|
||||||
dmrs_len,
|
dlsch0_harq, dlsch1_harq,
|
||||||
dlsch[0]->harq_processes[harq_pid]->Qm,
|
rx_type, harq_pid,
|
||||||
dlsch[0]->harq_processes[harq_pid]->Nl);
|
gNB_id, gNB_id_i,
|
||||||
nr_dlsch_layer_demapping(pdsch_vars[gNB_id]->llr,
|
first_symbol_flag,
|
||||||
dlsch[0]->harq_processes[harq_pid]->Nl,
|
i, nb_rb_pdsch,
|
||||||
dlsch[0]->harq_processes[harq_pid]->Qm,
|
codeword_TB0, codeword_TB1,
|
||||||
dlsch[0]->harq_processes[harq_pid]->G,
|
pdsch_vars[gNB_id]->dl_valid_re[i-1],
|
||||||
codeword_TB0,
|
nr_slot_rx, beamforming_mode);
|
||||||
codeword_TB1,
|
|
||||||
pdsch_vars[gNB_id]->layer_llr);
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
stop_meas(&ue->generic_stat_bis[proc->thread_id][slot]);
|
int dmrs_type = dlsch[0]->harq_processes[harq_pid]->dmrsConfigType;
|
||||||
if (cpumeas(CPUMEAS_GETSTATE))
|
uint8_t nb_re_dmrs;
|
||||||
LOG_D(PHY, "[AbsSFN %u.%d] Slot%d Symbol %d: LLR Computation %5.2f \n",frame,nr_slot_rx,slot,symbol,ue->generic_stat_bis[proc->thread_id][slot].p_time/(cpuf*1000.0));
|
uint16_t dmrs_len = get_num_dmrs(dlsch[0]->harq_processes[harq_pid]->dlDmrsSymbPos);
|
||||||
|
if (dmrs_type==NFAPI_NR_DMRS_TYPE1) {
|
||||||
|
nb_re_dmrs = 6*dlsch[0]->harq_processes[harq_pid]->n_dmrs_cdm_groups;
|
||||||
|
} else {
|
||||||
|
nb_re_dmrs = 4*dlsch[0]->harq_processes[harq_pid]->n_dmrs_cdm_groups;
|
||||||
|
}
|
||||||
|
dlsch[0]->harq_processes[harq_pid]->G = nr_get_G(dlsch[0]->harq_processes[harq_pid]->nb_rb,
|
||||||
|
dlsch[0]->harq_processes[harq_pid]->nb_symbols,
|
||||||
|
nb_re_dmrs,
|
||||||
|
dmrs_len,
|
||||||
|
dlsch[0]->harq_processes[harq_pid]->Qm,
|
||||||
|
dlsch[0]->harq_processes[harq_pid]->Nl);
|
||||||
|
nr_dlsch_layer_demapping(pdsch_vars[gNB_id]->llr,
|
||||||
|
dlsch[0]->harq_processes[harq_pid]->Nl,
|
||||||
|
dlsch[0]->harq_processes[harq_pid]->Qm,
|
||||||
|
dlsch[0]->harq_processes[harq_pid]->G,
|
||||||
|
codeword_TB0,
|
||||||
|
codeword_TB1,
|
||||||
|
pdsch_vars[gNB_id]->layer_llr);
|
||||||
|
}
|
||||||
|
|
||||||
// Please keep it: useful for debugging
|
stop_meas(&ue->generic_stat_bis[proc->thread_id][slot]);
|
||||||
|
if (cpumeas(CPUMEAS_GETSTATE))
|
||||||
|
LOG_D(PHY, "[AbsSFN %u.%d] Slot%d Symbol %d: LLR Computation %5.2f \n",frame,nr_slot_rx,slot,symbol,ue->generic_stat_bis[proc->thread_id][slot].p_time/(cpuf*1000.0));
|
||||||
|
|
||||||
|
// Please keep it: useful for debugging
|
||||||
#ifdef DEBUG_PDSCH_RX
|
#ifdef DEBUG_PDSCH_RX
|
||||||
char filename[50];
|
char filename[50];
|
||||||
uint8_t aa = 0;
|
uint8_t aa = 0;
|
||||||
|
|||||||
@@ -241,15 +241,9 @@ typedef struct {
|
|||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
uint16_t sc_list_length;
|
uint16_t sc_list_length;
|
||||||
uint16_t *sc_list;
|
uint16_t sc_list[6*273];
|
||||||
uint8_t srs_generated_signal_bits;
|
uint8_t srs_generated_signal_bits;
|
||||||
int32_t *srs_generated_signal;
|
int32_t srs_generated_signal[OFDM_SYMBOL_SIZE_SAMPLES_MAX * MAX_NUM_NR_SRS_SYMBOLS];
|
||||||
int32_t **srs_received_signal;
|
|
||||||
int32_t **srs_ls_estimated_channel;
|
|
||||||
int32_t **srs_estimated_channel_freq;
|
|
||||||
int32_t **srs_estimated_channel_time;
|
|
||||||
int32_t **srs_estimated_channel_time_shifted;
|
|
||||||
uint32_t *noise_power;
|
|
||||||
} nr_srs_info_t;
|
} nr_srs_info_t;
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
|
|||||||
@@ -71,9 +71,9 @@
|
|||||||
#include "common/utils/system.h"
|
#include "common/utils/system.h"
|
||||||
|
|
||||||
#include <time.h>
|
#include <time.h>
|
||||||
|
#include "openair1/SCHED/sched_common_extern.h"
|
||||||
extern int oai_exit;
|
#include "targets/RT/USER/lte-softmodem.h"
|
||||||
|
#include "common/ran_context.h"
|
||||||
|
|
||||||
void feptx0(RU_t *ru,
|
void feptx0(RU_t *ru,
|
||||||
int slot)
|
int slot)
|
||||||
@@ -616,9 +616,11 @@ void init_fep_thread(RU_t *ru,
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
extern void kill_fep_thread(RU_t *ru)
|
void kill_fep_thread(RU_t *ru)
|
||||||
{
|
{
|
||||||
RU_proc_t *proc = &ru->proc;
|
RU_proc_t *proc = &ru->proc;
|
||||||
|
if (proc->pthread_fep == 0)
|
||||||
|
return;
|
||||||
pthread_mutex_lock( &proc->mutex_fep[0] );
|
pthread_mutex_lock( &proc->mutex_fep[0] );
|
||||||
proc->instance_cnt_fep[0] = 0;
|
proc->instance_cnt_fep[0] = 0;
|
||||||
pthread_cond_signal(&proc->cond_fep[0]);
|
pthread_cond_signal(&proc->cond_fep[0]);
|
||||||
@@ -630,9 +632,11 @@ extern void kill_fep_thread(RU_t *ru)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
extern void kill_feptx_thread(RU_t *ru)
|
void kill_feptx_thread(RU_t *ru)
|
||||||
{
|
{
|
||||||
RU_proc_t *proc = &ru->proc;
|
RU_proc_t *proc = &ru->proc;
|
||||||
|
if (proc->pthread_feptx == 0)
|
||||||
|
return;
|
||||||
pthread_mutex_lock( &proc->mutex_feptx );
|
pthread_mutex_lock( &proc->mutex_feptx );
|
||||||
proc->instance_cnt_feptx = 0;
|
proc->instance_cnt_feptx = 0;
|
||||||
pthread_cond_signal(&proc->cond_feptx);
|
pthread_cond_signal(&proc->cond_feptx);
|
||||||
|
|||||||
@@ -29,4 +29,6 @@
|
|||||||
extern int16_t hundred_times_delta_TF[100];
|
extern int16_t hundred_times_delta_TF[100];
|
||||||
extern uint16_t hundred_times_log10_NPRB[100];
|
extern uint16_t hundred_times_log10_NPRB[100];
|
||||||
|
|
||||||
|
void kill_fep_thread(RU_t *ru);
|
||||||
|
|
||||||
#endif /*__SCHED_EXTERN_H__ */
|
#endif /*__SCHED_EXTERN_H__ */
|
||||||
|
|||||||
@@ -45,6 +45,7 @@
|
|||||||
#include "intertask_interface.h"
|
#include "intertask_interface.h"
|
||||||
|
|
||||||
//#define DEBUG_RXDATA
|
//#define DEBUG_RXDATA
|
||||||
|
//#define SRS_IND_DEBUG
|
||||||
|
|
||||||
uint8_t SSB_Table[38]={0,2,4,6,8,10,12,14,254,254,16,18,20,22,24,26,28,30,254,254,32,34,36,38,40,42,44,46,254,254,48,50,52,54,56,58,60,62};
|
uint8_t SSB_Table[38]={0,2,4,6,8,10,12,14,254,254,16,18,20,22,24,26,28,30,254,254,32,34,36,38,40,42,44,46,254,254,48,50,52,54,56,58,60,62};
|
||||||
|
|
||||||
@@ -72,8 +73,11 @@ void nr_common_signal_procedures (PHY_VARS_gNB *gNB,int frame,int slot,nfapi_nr_
|
|||||||
ssb_start_symbol = ssb_start_symbol_abs % fp->symbols_per_slot; // start symbol wrt slot
|
ssb_start_symbol = ssb_start_symbol_abs % fp->symbols_per_slot; // start symbol wrt slot
|
||||||
|
|
||||||
// setting the first subcarrier
|
// setting the first subcarrier
|
||||||
fp->ssb_start_subcarrier = (12 * cfg->ssb_table.ssb_offset_point_a.value + ssb_pdu.ssb_pdu_rel15.SsbSubcarrierOffset);
|
const int scs = cfg->ssb_config.scs_common.value;
|
||||||
LOG_D(PHY, "SSB first subcarrier %d (%d,%d)\n", fp->ssb_start_subcarrier,cfg->ssb_table.ssb_offset_point_a.value,ssb_pdu.ssb_pdu_rel15.SsbSubcarrierOffset);
|
const int prb_offset = (fp->freq_range == nr_FR1) ? ssb_pdu.ssb_pdu_rel15.ssbOffsetPointA>>scs : ssb_pdu.ssb_pdu_rel15.ssbOffsetPointA>>(scs-2);
|
||||||
|
const int sc_offset = (fp->freq_range == nr_FR1) ? ssb_pdu.ssb_pdu_rel15.SsbSubcarrierOffset>>scs : ssb_pdu.ssb_pdu_rel15.SsbSubcarrierOffset;
|
||||||
|
fp->ssb_start_subcarrier = (12 * prb_offset + sc_offset);
|
||||||
|
LOG_D(PHY, "SSB first subcarrier %d (%d,%d)\n", fp->ssb_start_subcarrier, prb_offset, sc_offset);
|
||||||
|
|
||||||
LOG_D(PHY,"SS TX: frame %d, slot %d, start_symbol %d\n",frame,slot, ssb_start_symbol);
|
LOG_D(PHY,"SS TX: frame %d, slot %d, start_symbol %d\n",frame,slot, ssb_start_symbol);
|
||||||
nr_generate_pss(&txdataF[0][txdataF_offset], AMP, ssb_start_symbol, cfg, fp);
|
nr_generate_pss(&txdataF[0][txdataF_offset], AMP, ssb_start_symbol, cfg, fp);
|
||||||
@@ -569,7 +573,7 @@ void fill_ul_rb_mask(PHY_VARS_gNB *gNB, int frame_rx, int slot_rx) {
|
|||||||
LOG_D(PHY,"symbol %d Filling rb_mask_ul rb_size %d\n",symbol,ulsch_harq->ulsch_pdu.rb_size);
|
LOG_D(PHY,"symbol %d Filling rb_mask_ul rb_size %d\n",symbol,ulsch_harq->ulsch_pdu.rb_size);
|
||||||
for (rb=0; rb<ulsch_harq->ulsch_pdu.rb_size; rb++) {
|
for (rb=0; rb<ulsch_harq->ulsch_pdu.rb_size; rb++) {
|
||||||
rb2 = rb+ulsch_harq->ulsch_pdu.rb_start+ulsch_harq->ulsch_pdu.bwp_start;
|
rb2 = rb+ulsch_harq->ulsch_pdu.rb_start+ulsch_harq->ulsch_pdu.bwp_start;
|
||||||
gNB->rb_mask_ul[symbol][rb2>>5] |= (1<<(rb2&31));
|
gNB->rb_mask_ul[symbol][rb2 >> 5] |= 1U << (rb2 & 31);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -621,11 +625,38 @@ void phy_procedures_gNB_common_RX(PHY_VARS_gNB *gNB, int frame_rx, int slot_rx)
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int fill_srs_reported_symbol_list(nfapi_nr_srs_indication_reported_symbol_t *reported_symbol_list,
|
||||||
|
const nfapi_nr_srs_pdu_t *srs_pdu,
|
||||||
|
const int N_RB_UL,
|
||||||
|
const int8_t *snr_per_rb,
|
||||||
|
const int srs_est) {
|
||||||
|
|
||||||
|
reported_symbol_list->num_rbs = srs_bandwidth_config[srs_pdu->config_index][srs_pdu->bandwidth_index][0];
|
||||||
|
|
||||||
|
if (!reported_symbol_list->rb_list) {
|
||||||
|
reported_symbol_list->rb_list = (nfapi_nr_srs_indication_reported_symbol_resource_block_t*) calloc(1, N_RB_UL*sizeof(nfapi_nr_srs_indication_reported_symbol_resource_block_t));
|
||||||
|
}
|
||||||
|
|
||||||
|
for(int rb = 0; rb < reported_symbol_list->num_rbs; rb++) {
|
||||||
|
if (srs_est<0) {
|
||||||
|
reported_symbol_list->rb_list[rb].rb_snr = 0xFF;
|
||||||
|
} else if (snr_per_rb[rb] < -64) {
|
||||||
|
reported_symbol_list->rb_list[rb].rb_snr = 0;
|
||||||
|
} else if (snr_per_rb[rb] > 63) {
|
||||||
|
reported_symbol_list->rb_list[rb].rb_snr = 0xFE;
|
||||||
|
} else {
|
||||||
|
reported_symbol_list->rb_list[rb].rb_snr = (snr_per_rb[rb] + 64)<<1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
int phy_procedures_gNB_uespec_RX(PHY_VARS_gNB *gNB, int frame_rx, int slot_rx) {
|
int phy_procedures_gNB_uespec_RX(PHY_VARS_gNB *gNB, int frame_rx, int slot_rx) {
|
||||||
/* those variables to log T_GNB_PHY_PUCCH_PUSCH_IQ only when we try to decode */
|
/* those variables to log T_GNB_PHY_PUCCH_PUSCH_IQ only when we try to decode */
|
||||||
int pucch_decode_done = 0;
|
int pucch_decode_done = 0;
|
||||||
int pusch_decode_done = 0;
|
int pusch_decode_done = 0;
|
||||||
int phy_procedures_errors = 0;
|
int pusch_DTX = 0;
|
||||||
|
|
||||||
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_gNB_UESPEC_RX,1);
|
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_gNB_UESPEC_RX,1);
|
||||||
LOG_D(PHY,"phy_procedures_gNB_uespec_RX frame %d, slot %d\n",frame_rx,slot_rx);
|
LOG_D(PHY,"phy_procedures_gNB_uespec_RX frame %d, slot %d\n",frame_rx,slot_rx);
|
||||||
@@ -765,7 +796,7 @@ int phy_procedures_gNB_uespec_RX(PHY_VARS_gNB *gNB, int frame_rx, int slot_rx) {
|
|||||||
if (no_sig) {
|
if (no_sig) {
|
||||||
LOG_D(PHY, "PUSCH not detected in frame %d, slot %d\n", frame_rx, slot_rx);
|
LOG_D(PHY, "PUSCH not detected in frame %d, slot %d\n", frame_rx, slot_rx);
|
||||||
nr_fill_indication(gNB, frame_rx, slot_rx, ULSCH_id, harq_pid, 1,1);
|
nr_fill_indication(gNB, frame_rx, slot_rx, ULSCH_id, harq_pid, 1,1);
|
||||||
phy_procedures_errors++;
|
pusch_DTX++;
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
gNB->pusch_vars[ULSCH_id]->ulsch_power_tot=0;
|
gNB->pusch_vars[ULSCH_id]->ulsch_power_tot=0;
|
||||||
@@ -790,7 +821,7 @@ int phy_procedures_gNB_uespec_RX(PHY_VARS_gNB *gNB, int frame_rx, int slot_rx) {
|
|||||||
/* in case of phy_test mode, we still want to decode to measure execution time.
|
/* in case of phy_test mode, we still want to decode to measure execution time.
|
||||||
Therefore, we don't yet call nr_fill_indication, it will be called later */
|
Therefore, we don't yet call nr_fill_indication, it will be called later */
|
||||||
nr_fill_indication(gNB,frame_rx, slot_rx, ULSCH_id, harq_pid, 1,1);
|
nr_fill_indication(gNB,frame_rx, slot_rx, ULSCH_id, harq_pid, 1,1);
|
||||||
phy_procedures_errors++;
|
pusch_DTX++;
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
@@ -822,29 +853,88 @@ int phy_procedures_gNB_uespec_RX(PHY_VARS_gNB *gNB, int frame_rx, int slot_rx) {
|
|||||||
|
|
||||||
LOG_D(NR_PHY, "(%d.%d) gNB is waiting for SRS, id = %i\n", frame_rx, slot_rx, i);
|
LOG_D(NR_PHY, "(%d.%d) gNB is waiting for SRS, id = %i\n", frame_rx, slot_rx, i);
|
||||||
|
|
||||||
|
NR_DL_FRAME_PARMS *frame_parms = &gNB->frame_parms;
|
||||||
nfapi_nr_srs_pdu_t *srs_pdu = &srs->srs_pdu;
|
nfapi_nr_srs_pdu_t *srs_pdu = &srs->srs_pdu;
|
||||||
|
uint8_t N_symb_SRS = 1<<srs_pdu->num_symbols;
|
||||||
|
int32_t srs_received_signal[frame_parms->nb_antennas_rx][frame_parms->ofdm_symbol_size*N_symb_SRS];
|
||||||
|
int32_t srs_ls_estimated_channel[frame_parms->nb_antennas_rx][frame_parms->ofdm_symbol_size*N_symb_SRS];
|
||||||
|
int32_t srs_estimated_channel_freq[frame_parms->nb_antennas_rx][frame_parms->ofdm_symbol_size*N_symb_SRS];
|
||||||
|
int32_t srs_estimated_channel_time[frame_parms->nb_antennas_rx][frame_parms->ofdm_symbol_size];
|
||||||
|
int32_t srs_estimated_channel_time_shifted[frame_parms->nb_antennas_rx][frame_parms->ofdm_symbol_size];
|
||||||
|
uint32_t noise_power_per_rb[srs_pdu->bwp_size];
|
||||||
|
int8_t snr_per_rb[srs_pdu->bwp_size];
|
||||||
|
uint32_t signal_power;
|
||||||
|
uint32_t noise_power;
|
||||||
|
int8_t snr;
|
||||||
|
|
||||||
// At least currently, the configuration is constant, so it is enough to generate the sequence just once.
|
// At least currently, the configuration is constant, so it is enough to generate the sequence just once.
|
||||||
if(gNB->nr_srs_info[i]->sc_list_length == 0) {
|
if(gNB->nr_srs_info[i]->sc_list_length == 0) {
|
||||||
generate_srs_nr(srs_pdu, &gNB->frame_parms, gNB->nr_srs_info[i]->srs_generated_signal, gNB->nr_srs_info[i], AMP, frame_rx, slot_rx);
|
generate_srs_nr(srs_pdu, frame_parms, gNB->nr_srs_info[i]->srs_generated_signal, gNB->nr_srs_info[i], AMP, frame_rx, slot_rx);
|
||||||
}
|
}
|
||||||
|
|
||||||
nr_get_srs_signal(gNB,frame_rx,slot_rx,srs_pdu, gNB->nr_srs_info[i], gNB->nr_srs_info[i]->srs_received_signal);
|
const int srs_est = nr_get_srs_signal(gNB,frame_rx,slot_rx, srs_pdu, gNB->nr_srs_info[i], srs_received_signal);
|
||||||
|
|
||||||
nr_srs_channel_estimation(gNB,frame_rx,slot_rx,srs_pdu,
|
if (srs_est >= 0) {
|
||||||
gNB->nr_srs_info[i],
|
nr_srs_channel_estimation(gNB,
|
||||||
gNB->nr_srs_info[i]->srs_generated_signal,
|
frame_rx,
|
||||||
gNB->nr_srs_info[i]->srs_received_signal,
|
slot_rx,
|
||||||
gNB->nr_srs_info[i]->srs_estimated_channel_freq,
|
srs_pdu,
|
||||||
gNB->nr_srs_info[i]->srs_estimated_channel_time,
|
gNB->nr_srs_info[i],
|
||||||
gNB->nr_srs_info[i]->srs_estimated_channel_time_shifted,
|
gNB->nr_srs_info[i]->srs_generated_signal,
|
||||||
gNB->nr_srs_info[i]->noise_power);
|
srs_received_signal,
|
||||||
|
srs_ls_estimated_channel,
|
||||||
|
srs_estimated_channel_freq,
|
||||||
|
srs_estimated_channel_time,
|
||||||
|
srs_estimated_channel_time_shifted,
|
||||||
|
&signal_power,
|
||||||
|
noise_power_per_rb,
|
||||||
|
&noise_power,
|
||||||
|
snr_per_rb,
|
||||||
|
&snr);
|
||||||
|
}
|
||||||
|
|
||||||
T(T_GNB_PHY_UL_FREQ_CHANNEL_ESTIMATE, T_INT(0), T_INT(srs_pdu->rnti), T_INT(frame_rx), T_INT(0), T_INT(0),
|
T(T_GNB_PHY_UL_FREQ_CHANNEL_ESTIMATE, T_INT(0), T_INT(srs_pdu->rnti), T_INT(frame_rx), T_INT(0), T_INT(0),
|
||||||
T_BUFFER(gNB->nr_srs_info[i]->srs_estimated_channel_freq[0], gNB->frame_parms.ofdm_symbol_size*sizeof(int32_t)));
|
T_BUFFER(srs_estimated_channel_freq[0], frame_parms->ofdm_symbol_size*sizeof(int32_t)));
|
||||||
|
|
||||||
T(T_GNB_PHY_UL_TIME_CHANNEL_ESTIMATE, T_INT(0), T_INT(srs_pdu->rnti), T_INT(frame_rx), T_INT(0), T_INT(0),
|
T(T_GNB_PHY_UL_TIME_CHANNEL_ESTIMATE, T_INT(0), T_INT(srs_pdu->rnti), T_INT(frame_rx), T_INT(0), T_INT(0),
|
||||||
T_BUFFER(gNB->nr_srs_info[i]->srs_estimated_channel_time_shifted[0], gNB->frame_parms.ofdm_symbol_size*sizeof(int32_t)));
|
T_BUFFER(srs_estimated_channel_time_shifted[0], frame_parms->ofdm_symbol_size*sizeof(int32_t)));
|
||||||
|
|
||||||
|
const uint16_t num_srs = gNB->UL_INFO.srs_ind.number_of_pdus;
|
||||||
|
gNB->UL_INFO.srs_ind.pdu_list = &gNB->srs_pdu_list[0];
|
||||||
|
gNB->UL_INFO.srs_ind.sfn = frame_rx;
|
||||||
|
gNB->UL_INFO.srs_ind.slot = slot_rx;
|
||||||
|
gNB->srs_pdu_list[num_srs].handle = srs_pdu->handle;
|
||||||
|
gNB->srs_pdu_list[num_srs].rnti = srs_pdu->rnti;
|
||||||
|
gNB->srs_pdu_list[num_srs].timing_advance = srs_est >= 0 ? nr_est_timing_advance_srs(frame_parms,
|
||||||
|
srs_estimated_channel_time) : 0xFFFF;
|
||||||
|
gNB->srs_pdu_list[num_srs].num_symbols = 1<<srs_pdu->num_symbols;
|
||||||
|
gNB->srs_pdu_list[num_srs].wide_band_snr = srs_est >= 0 ? (snr + 64)<<1 : 0xFF; // 0xFF will be set if this field is invalid
|
||||||
|
gNB->srs_pdu_list[num_srs].num_reported_symbols = 1<<srs_pdu->num_symbols;
|
||||||
|
if(!gNB->srs_pdu_list[num_srs].reported_symbol_list) {
|
||||||
|
gNB->srs_pdu_list[num_srs].reported_symbol_list = (nfapi_nr_srs_indication_reported_symbol_t*) calloc(1, gNB->srs_pdu_list[num_srs].num_reported_symbols*sizeof(nfapi_nr_srs_indication_reported_symbol_t));
|
||||||
|
}
|
||||||
|
fill_srs_reported_symbol_list(&gNB->srs_pdu_list[num_srs].reported_symbol_list[0],
|
||||||
|
srs_pdu,
|
||||||
|
frame_parms->N_RB_UL,
|
||||||
|
snr_per_rb,
|
||||||
|
srs_est);
|
||||||
|
|
||||||
|
gNB->UL_INFO.srs_ind.number_of_pdus += 1;
|
||||||
|
|
||||||
|
#ifdef SRS_IND_DEBUG
|
||||||
|
LOG_I(NR_PHY, "gNB->UL_INFO.srs_ind.sfn = %i\n", gNB->UL_INFO.srs_ind.sfn);
|
||||||
|
LOG_I(NR_PHY, "gNB->UL_INFO.srs_ind.slot = %i\n", gNB->UL_INFO.srs_ind.slot);
|
||||||
|
LOG_I(NR_PHY, "gNB->srs_pdu_list[%i].rnti = 0x%04x\n", num_srs, gNB->srs_pdu_list[num_srs].rnti);
|
||||||
|
LOG_I(NR_PHY, "gNB->srs_pdu_list[%i].timing_advance = %i\n", num_srs, gNB->srs_pdu_list[num_srs].timing_advance);
|
||||||
|
LOG_I(NR_PHY, "gNB->srs_pdu_list[%i].num_symbols = %i\n", num_srs, gNB->srs_pdu_list[num_srs].num_symbols);
|
||||||
|
LOG_I(NR_PHY, "gNB->srs_pdu_list[%i].wide_band_snr = %i\n", num_srs, gNB->srs_pdu_list[num_srs].wide_band_snr);
|
||||||
|
LOG_I(NR_PHY, "gNB->srs_pdu_list[%i].num_reported_symbols = %i\n", num_srs, gNB->srs_pdu_list[num_srs].num_reported_symbols);
|
||||||
|
LOG_I(NR_PHY, "gNB->srs_pdu_list[%i].reported_symbol_list[0].num_rbs = %i\n", num_srs, gNB->srs_pdu_list[num_srs].reported_symbol_list[0].num_rbs);
|
||||||
|
for(int rb = 0; rb < gNB->srs_pdu_list[num_srs].reported_symbol_list[0].num_rbs; rb++) {
|
||||||
|
LOG_I(NR_PHY, "gNB->srs_pdu_list[%i].reported_symbol_list[0].rb_list[%3i].rb_snr = %i\n",
|
||||||
|
num_srs, rb, gNB->srs_pdu_list[num_srs].reported_symbol_list[0].rb_list[rb].rb_snr);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
srs->active = 0;
|
srs->active = 0;
|
||||||
}
|
}
|
||||||
@@ -858,5 +948,5 @@ int phy_procedures_gNB_uespec_RX(PHY_VARS_gNB *gNB, int frame_rx, int slot_rx) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_gNB_UESPEC_RX,0);
|
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_gNB_UESPEC_RX,0);
|
||||||
return phy_procedures_errors;
|
return pusch_DTX;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1321,8 +1321,7 @@ int is_ssb_in_slot(fapi_nr_config_request_t *config, int frame, int slot, NR_DL_
|
|||||||
//uint8_t half_frame_index = fp->half_frame_bit;
|
//uint8_t half_frame_index = fp->half_frame_bit;
|
||||||
//uint8_t i_ssb = fp->ssb_index;
|
//uint8_t i_ssb = fp->ssb_index;
|
||||||
uint8_t Lmax = fp->Lmax;
|
uint8_t Lmax = fp->Lmax;
|
||||||
|
if ((config->ssb_table.ssb_period > 0) && !(frame % (1 << (config->ssb_table.ssb_period - 1)))) {
|
||||||
if (!(frame%(1<<(config->ssb_table.ssb_period-1)))){
|
|
||||||
|
|
||||||
if(Lmax <= 8) {
|
if(Lmax <= 8) {
|
||||||
if(slot <=3 && (((config->ssb_table.ssb_mask_list[0].ssb_mask << 2*slot)&0x80000000) == 0x80000000 || ((config->ssb_table.ssb_mask_list[0].ssb_mask << (2*slot +1))&0x80000000) == 0x80000000))
|
if(slot <=3 && (((config->ssb_table.ssb_mask_list[0].ssb_mask << 2*slot)&0x80000000) == 0x80000000 || ((config->ssb_table.ssb_mask_list[0].ssb_mask << (2*slot +1))&0x80000000) == 0x80000000))
|
||||||
|
|||||||
@@ -512,12 +512,16 @@ int main(int argc, char **argv) {
|
|||||||
int re;
|
int re;
|
||||||
int s,Kr,Kr_bytes;
|
int s,Kr,Kr_bytes;
|
||||||
LTE_DL_FRAME_PARMS *frame_parms;
|
LTE_DL_FRAME_PARMS *frame_parms;
|
||||||
double s_re0[30720*2],s_im0[30720*2],r_re0[30720*2],r_im0[30720*2];
|
double *tmpTX[4], *tmpRX[4] ;
|
||||||
double s_re1[30720*2],s_im1[30720*2],r_re1[30720*2],r_im1[30720*2];
|
for (int i = 0; i < 4; i++) {
|
||||||
double *s_re[2]= {s_re0,s_re1};
|
tmpTX[i] = malloc(30720 * NB_ANTENNAS_TX * sizeof(*tmpTX));
|
||||||
double *s_im[2]= {s_im0,s_im1};
|
tmpRX[i] = malloc(30720 * NB_ANTENNAS_RX * sizeof(*tmpRX));
|
||||||
double *r_re[2]= {r_re0,r_re1};
|
}
|
||||||
double *r_im[2]= {r_im0,r_im1};
|
double *s_re[NB_ANTENNAS_TX] = {tmpTX[0], tmpTX[1]};
|
||||||
|
double *s_im[NB_ANTENNAS_TX] = {tmpTX[2], tmpTX[3]};
|
||||||
|
double *r_re[NB_ANTENNAS_RX] = {tmpRX[0], tmpRX[1]};
|
||||||
|
double *r_im[NB_ANTENNAS_RX] = {tmpRX[2], tmpRX[3]};
|
||||||
|
|
||||||
uint8_t transmission_mode=1,n_tx_port=1,n_tx_phy=1,n_rx=2;
|
uint8_t transmission_mode=1,n_tx_port=1,n_tx_phy=1,n_rx=2;
|
||||||
int eNB_id = 0;
|
int eNB_id = 0;
|
||||||
unsigned char round;
|
unsigned char round;
|
||||||
|
|||||||
@@ -358,7 +358,7 @@ int main(int argc, char **argv) {
|
|||||||
unsigned short input_buffer_length;
|
unsigned short input_buffer_length;
|
||||||
unsigned int ret;
|
unsigned int ret;
|
||||||
unsigned int coded_bits_per_codeword,nsymb;
|
unsigned int coded_bits_per_codeword,nsymb;
|
||||||
unsigned int tx_lev=0,tx_lev_dB=0,trials,errs[5]= {0,0,0,0,0},round_trials[4]= {0,0,0,0};
|
unsigned int tx_lev = 0, tx_lev_dB = 0, trials, errs[6] = {0}, round_trials[4] = {0};
|
||||||
FILE *bler_fd=NULL;
|
FILE *bler_fd=NULL;
|
||||||
char bler_fname[512];
|
char bler_fname[512];
|
||||||
FILE *time_meas_fd=NULL;
|
FILE *time_meas_fd=NULL;
|
||||||
@@ -387,7 +387,6 @@ int main(int argc, char **argv) {
|
|||||||
double cpu_freq_GHz;
|
double cpu_freq_GHz;
|
||||||
int iter_trials;
|
int iter_trials;
|
||||||
uint32_t UL_alloc_pdu;
|
uint32_t UL_alloc_pdu;
|
||||||
int s,Kr,Kr_bytes;
|
|
||||||
int dump_perf=0;
|
int dump_perf=0;
|
||||||
static int dump_table =0;
|
static int dump_table =0;
|
||||||
double effective_rate=0.0;
|
double effective_rate=0.0;
|
||||||
@@ -1233,20 +1232,21 @@ int main(int argc, char **argv) {
|
|||||||
|
|
||||||
if (n_frames==1) {
|
if (n_frames==1) {
|
||||||
printf("ULSCH errors found o_ACK[0]= %d\n",eNB->ulsch[0]->harq_processes[harq_pid]->o_ACK[0]);
|
printf("ULSCH errors found o_ACK[0]= %d\n",eNB->ulsch[0]->harq_processes[harq_pid]->o_ACK[0]);
|
||||||
|
#ifdef DUMP_EACH_VALUE
|
||||||
|
int Kr_bytes;
|
||||||
for (s=0; s<eNB->ulsch[0]->harq_processes[harq_pid]->C; s++) {
|
for (s=0; s<eNB->ulsch[0]->harq_processes[harq_pid]->C; s++) {
|
||||||
if (s<eNB->ulsch[0]->harq_processes[harq_pid]->Cminus)
|
if (s<eNB->ulsch[0]->harq_processes[harq_pid]->Cminus)
|
||||||
Kr = eNB->ulsch[0]->harq_processes[harq_pid]->Kminus;
|
Kr_bytes = eNB->ulsch[0]->harq_processes[harq_pid]->Kminus;
|
||||||
else
|
else
|
||||||
Kr = eNB->ulsch[0]->harq_processes[harq_pid]->Kplus;
|
Kr_bytes = eNB->ulsch[0]->harq_processes[harq_pid]->Kplus;
|
||||||
|
Kr_bytes = Kr_bytes >> 3;
|
||||||
Kr_bytes = Kr>>3;
|
|
||||||
printf("Decoded_output (Segment %d):\n",s);
|
printf("Decoded_output (Segment %d):\n",s);
|
||||||
|
|
||||||
for (i=0; i<Kr_bytes; i++)
|
for (i=0; i<Kr_bytes; i++)
|
||||||
printf("%d : %x (%x)\n",i,eNB->ulsch[0]->harq_processes[harq_pid]->c[s][i],
|
printf("%d : %x (%x)\n",i,eNB->ulsch[0]->harq_processes[harq_pid]->c[s][i],
|
||||||
eNB->ulsch[0]->harq_processes[harq_pid]->c[s][i]^UE->ulsch[0]->harq_processes[harq_pid]->c[s][i]);
|
eNB->ulsch[0]->harq_processes[harq_pid]->c[s][i]^UE->ulsch[0]->harq_processes[harq_pid]->c[s][i]);
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
dump_ulsch(eNB,eNB->proc.frame_rx,subframe,0,round);
|
dump_ulsch(eNB,eNB->proc.frame_rx,subframe,0,round);
|
||||||
round=5;
|
round=5;
|
||||||
|
|||||||
@@ -1142,7 +1142,7 @@ int main(int argc, char **argv)
|
|||||||
Sched_INFO.frame = frame;
|
Sched_INFO.frame = frame;
|
||||||
Sched_INFO.slot = slot;
|
Sched_INFO.slot = slot;
|
||||||
Sched_INFO.DL_req = &gNB_mac->DL_req[0];
|
Sched_INFO.DL_req = &gNB_mac->DL_req[0];
|
||||||
Sched_INFO.UL_tti_req = gNB_mac->UL_tti_req_ahead[slot];
|
Sched_INFO.UL_tti_req = gNB_mac->UL_tti_req_ahead[0];
|
||||||
Sched_INFO.UL_dci_req = NULL;
|
Sched_INFO.UL_dci_req = NULL;
|
||||||
Sched_INFO.TX_req = &gNB_mac->TX_req[0];
|
Sched_INFO.TX_req = &gNB_mac->TX_req[0];
|
||||||
pushNotifiedFIFO(gNB->L1_tx_free,msgL1Tx);
|
pushNotifiedFIFO(gNB->L1_tx_free,msgL1Tx);
|
||||||
|
|||||||
@@ -67,7 +67,10 @@ openair0_config_t openair0_cfg[MAX_CARDS];
|
|||||||
uint8_t const nr_rv_round_map[4] = {0, 2, 3, 1};
|
uint8_t const nr_rv_round_map[4] = {0, 2, 3, 1};
|
||||||
|
|
||||||
uint64_t get_softmodem_optmask(void) {return 0;}
|
uint64_t get_softmodem_optmask(void) {return 0;}
|
||||||
softmodem_params_t *get_softmodem_params(void) {return 0;}
|
static softmodem_params_t softmodem_params;
|
||||||
|
softmodem_params_t *get_softmodem_params(void) {
|
||||||
|
return &softmodem_params;
|
||||||
|
}
|
||||||
|
|
||||||
void init_downlink_harq_status(NR_DL_UE_HARQ_t *dl_harq) {}
|
void init_downlink_harq_status(NR_DL_UE_HARQ_t *dl_harq) {}
|
||||||
|
|
||||||
@@ -174,6 +177,7 @@ int main(int argc, char **argv)
|
|||||||
int ssb_subcarrier_offset = 0;
|
int ssb_subcarrier_offset = 0;
|
||||||
|
|
||||||
channel_desc_t *gNB2UE;
|
channel_desc_t *gNB2UE;
|
||||||
|
get_softmodem_params()->sa = 1;
|
||||||
|
|
||||||
//uint8_t extended_prefix_flag=0;
|
//uint8_t extended_prefix_flag=0;
|
||||||
//int8_t interf1=-21,interf2=-21;
|
//int8_t interf1=-21,interf2=-21;
|
||||||
@@ -460,6 +464,7 @@ int main(int argc, char **argv)
|
|||||||
frame_parms->Nid_cell = Nid_cell;
|
frame_parms->Nid_cell = Nid_cell;
|
||||||
frame_parms->nushift = Nid_cell%4;
|
frame_parms->nushift = Nid_cell%4;
|
||||||
frame_parms->ssb_type = nr_ssb_type_C;
|
frame_parms->ssb_type = nr_ssb_type_C;
|
||||||
|
frame_parms->freq_range = mu<2 ? nr_FR1 : nr_FR2;
|
||||||
|
|
||||||
nr_phy_config_request_sim_pbchsim(gNB,N_RB_DL,N_RB_DL,mu,Nid_cell,SSB_positions);
|
nr_phy_config_request_sim_pbchsim(gNB,N_RB_DL,N_RB_DL,mu,Nid_cell,SSB_positions);
|
||||||
phy_init_nr_gNB(gNB,0,1);
|
phy_init_nr_gNB(gNB,0,1);
|
||||||
@@ -584,9 +589,12 @@ int main(int argc, char **argv)
|
|||||||
for (i=0; i<frame_parms->Lmax; i++) {
|
for (i=0; i<frame_parms->Lmax; i++) {
|
||||||
if((SSB_positions >> i) & 0x01) {
|
if((SSB_positions >> i) & 0x01) {
|
||||||
|
|
||||||
|
const int sc_offset = frame_parms->freq_range == nr_FR1 ? ssb_subcarrier_offset<<mu : ssb_subcarrier_offset;
|
||||||
|
const int prb_offset = frame_parms->freq_range == nr_FR1 ? gNB->gNB_config.ssb_table.ssb_offset_point_a.value<<mu : gNB->gNB_config.ssb_table.ssb_offset_point_a.value << (mu - 2);
|
||||||
msgDataTx.ssb[i].ssb_pdu.ssb_pdu_rel15.bchPayload = 0x55dd33;
|
msgDataTx.ssb[i].ssb_pdu.ssb_pdu_rel15.bchPayload = 0x55dd33;
|
||||||
msgDataTx.ssb[i].ssb_pdu.ssb_pdu_rel15.SsbBlockIndex = i;
|
msgDataTx.ssb[i].ssb_pdu.ssb_pdu_rel15.SsbBlockIndex = i;
|
||||||
msgDataTx.ssb[i].ssb_pdu.ssb_pdu_rel15.SsbSubcarrierOffset = ssb_subcarrier_offset;
|
msgDataTx.ssb[i].ssb_pdu.ssb_pdu_rel15.SsbSubcarrierOffset = sc_offset;
|
||||||
|
msgDataTx.ssb[i].ssb_pdu.ssb_pdu_rel15.ssbOffsetPointA = prb_offset;
|
||||||
|
|
||||||
start_symbol = nr_get_ssb_start_symbol(frame_parms,i);
|
start_symbol = nr_get_ssb_start_symbol(frame_parms,i);
|
||||||
int slot = start_symbol/14;
|
int slot = start_symbol/14;
|
||||||
|
|||||||
@@ -58,6 +58,7 @@
|
|||||||
#define CONFIG_STRING_MACRLC_ULSCH_MAX_FRAME_INACTIVITY "ulsch_max_frame_inactivity"
|
#define CONFIG_STRING_MACRLC_ULSCH_MAX_FRAME_INACTIVITY "ulsch_max_frame_inactivity"
|
||||||
#define CONFIG_STRING_MACRLC_PUSCHTARGETSNRX10 "pusch_TargetSNRx10"
|
#define CONFIG_STRING_MACRLC_PUSCHTARGETSNRX10 "pusch_TargetSNRx10"
|
||||||
#define CONFIG_STRING_MACRLC_PUCCHTARGETSNRX10 "pucch_TargetSNRx10"
|
#define CONFIG_STRING_MACRLC_PUCCHTARGETSNRX10 "pucch_TargetSNRx10"
|
||||||
|
#define CONFIG_STRING_MACRLC_UL_PRBBLACK_SNR_THRESHOLD "ul_prbblack_SNR_threshold"
|
||||||
#define CONFIG_STRING_MACRLC_PUCCHFAILURETHRES "pucch_FailureThres"
|
#define CONFIG_STRING_MACRLC_PUCCHFAILURETHRES "pucch_FailureThres"
|
||||||
#define CONFIG_STRING_MACRLC_PUSCHFAILURETHRES "pusch_FailureThres"
|
#define CONFIG_STRING_MACRLC_PUSCHFAILURETHRES "pusch_FailureThres"
|
||||||
#define CONFIG_STRING_MACRLC_DL_BLER_TARGET_UPPER "dl_bler_target_upper"
|
#define CONFIG_STRING_MACRLC_DL_BLER_TARGET_UPPER "dl_bler_target_upper"
|
||||||
@@ -96,6 +97,7 @@
|
|||||||
{CONFIG_STRING_MACRLC_ULSCH_MAX_FRAME_INACTIVITY, NULL, 0, uptr:NULL, defintval:10, TYPE_UINT, 0}, \
|
{CONFIG_STRING_MACRLC_ULSCH_MAX_FRAME_INACTIVITY, NULL, 0, uptr:NULL, defintval:10, TYPE_UINT, 0}, \
|
||||||
{CONFIG_STRING_MACRLC_PUSCHTARGETSNRX10, NULL, 0, iptr:NULL, defintval:200, TYPE_INT, 0}, \
|
{CONFIG_STRING_MACRLC_PUSCHTARGETSNRX10, NULL, 0, iptr:NULL, defintval:200, TYPE_INT, 0}, \
|
||||||
{CONFIG_STRING_MACRLC_PUCCHTARGETSNRX10, NULL, 0, iptr:NULL, defintval:150, TYPE_INT, 0}, \
|
{CONFIG_STRING_MACRLC_PUCCHTARGETSNRX10, NULL, 0, iptr:NULL, defintval:150, TYPE_INT, 0}, \
|
||||||
|
{CONFIG_STRING_MACRLC_UL_PRBBLACK_SNR_THRESHOLD, "SNR threshold to decide whether a PRB will be blacklisted or not", 0, iptr:NULL, defintval:10, TYPE_INT, 0}, \
|
||||||
{CONFIG_STRING_MACRLC_PUCCHFAILURETHRES, NULL, 0, iptr:NULL, defintval:10, TYPE_INT, 0}, \
|
{CONFIG_STRING_MACRLC_PUCCHFAILURETHRES, NULL, 0, iptr:NULL, defintval:10, TYPE_INT, 0}, \
|
||||||
{CONFIG_STRING_MACRLC_PUSCHFAILURETHRES, NULL, 0, iptr:NULL, defintval:10, TYPE_INT, 0}, \
|
{CONFIG_STRING_MACRLC_PUSCHFAILURETHRES, NULL, 0, iptr:NULL, defintval:10, TYPE_INT, 0}, \
|
||||||
{CONFIG_STRING_MACRLC_DL_BLER_TARGET_UPPER, "Upper threshold of BLER to decrease DL MCS", 0, dblptr:NULL, defdblval:0.15, TYPE_DOUBLE, 0}, \
|
{CONFIG_STRING_MACRLC_DL_BLER_TARGET_UPPER, "Upper threshold of BLER to decrease DL MCS", 0, dblptr:NULL, defdblval:0.15, TYPE_DOUBLE, 0}, \
|
||||||
@@ -128,17 +130,18 @@
|
|||||||
#define MACRLC_ULSCH_MAX_FRAME_INACTIVITY 17
|
#define MACRLC_ULSCH_MAX_FRAME_INACTIVITY 17
|
||||||
#define MACRLC_PUSCHTARGETSNRX10_IDX 18
|
#define MACRLC_PUSCHTARGETSNRX10_IDX 18
|
||||||
#define MACRLC_PUCCHTARGETSNRX10_IDX 19
|
#define MACRLC_PUCCHTARGETSNRX10_IDX 19
|
||||||
#define MACRLC_PUCCHFAILURETHRES_IDX 20
|
#define MACRLC_UL_PRBBLACK_SNR_THRESHOLD_IDX 20
|
||||||
#define MACRLC_PUSCHFAILURETHRES_IDX 21
|
#define MACRLC_PUCCHFAILURETHRES_IDX 21
|
||||||
#define MACRLC_DL_BLER_TARGET_UPPER_IDX 22
|
#define MACRLC_PUSCHFAILURETHRES_IDX 22
|
||||||
#define MACRLC_DL_BLER_TARGET_LOWER_IDX 23
|
#define MACRLC_DL_BLER_TARGET_UPPER_IDX 23
|
||||||
#define MACRLC_DL_MAX_MCS_IDX 24
|
#define MACRLC_DL_BLER_TARGET_LOWER_IDX 24
|
||||||
#define MACRLC_UL_BLER_TARGET_UPPER_IDX 25
|
#define MACRLC_DL_MAX_MCS_IDX 25
|
||||||
#define MACRLC_UL_BLER_TARGET_LOWER_IDX 26
|
#define MACRLC_UL_BLER_TARGET_UPPER_IDX 26
|
||||||
#define MACRLC_UL_MAX_MCS_IDX 27
|
#define MACRLC_UL_BLER_TARGET_LOWER_IDX 27
|
||||||
#define MACRLC_HARQ_ROUND_MAX_IDX 28
|
#define MACRLC_UL_MAX_MCS_IDX 28
|
||||||
#define MACRLC_MIN_GRANT_PRB_IDX 29
|
#define MACRLC_HARQ_ROUND_MAX_IDX 29
|
||||||
#define MACRLC_MIN_GRANT_MCS_IDX 30
|
#define MACRLC_MIN_GRANT_PRB_IDX 30
|
||||||
|
#define MACRLC_MIN_GRANT_MCS_IDX 31
|
||||||
|
|
||||||
/*---------------------------------------------------------------------------------------------------------------------------------------------------------*/
|
/*---------------------------------------------------------------------------------------------------------------------------------------------------------*/
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -828,6 +828,7 @@ void RCconfig_nr_macrlc() {
|
|||||||
RC.nb_nr_mac_CC[j] = *(MacRLC_ParamList.paramarray[j][MACRLC_CC_IDX].iptr);
|
RC.nb_nr_mac_CC[j] = *(MacRLC_ParamList.paramarray[j][MACRLC_CC_IDX].iptr);
|
||||||
RC.nrmac[j]->pusch_target_snrx10 = *(MacRLC_ParamList.paramarray[j][MACRLC_PUSCHTARGETSNRX10_IDX].iptr);
|
RC.nrmac[j]->pusch_target_snrx10 = *(MacRLC_ParamList.paramarray[j][MACRLC_PUSCHTARGETSNRX10_IDX].iptr);
|
||||||
RC.nrmac[j]->pucch_target_snrx10 = *(MacRLC_ParamList.paramarray[j][MACRLC_PUCCHTARGETSNRX10_IDX].iptr);
|
RC.nrmac[j]->pucch_target_snrx10 = *(MacRLC_ParamList.paramarray[j][MACRLC_PUCCHTARGETSNRX10_IDX].iptr);
|
||||||
|
RC.nrmac[j]->ul_prbblack_SNR_threshold = *(MacRLC_ParamList.paramarray[j][MACRLC_UL_PRBBLACK_SNR_THRESHOLD_IDX].iptr);
|
||||||
RC.nrmac[j]->pucch_failure_thres = *(MacRLC_ParamList.paramarray[j][MACRLC_PUCCHFAILURETHRES_IDX].iptr);
|
RC.nrmac[j]->pucch_failure_thres = *(MacRLC_ParamList.paramarray[j][MACRLC_PUCCHFAILURETHRES_IDX].iptr);
|
||||||
RC.nrmac[j]->pusch_failure_thres = *(MacRLC_ParamList.paramarray[j][MACRLC_PUSCHFAILURETHRES_IDX].iptr);
|
RC.nrmac[j]->pusch_failure_thres = *(MacRLC_ParamList.paramarray[j][MACRLC_PUSCHFAILURETHRES_IDX].iptr);
|
||||||
|
|
||||||
|
|||||||
@@ -2366,22 +2366,6 @@ rrc_mac_remove_ue(module_id_t mod_idP,
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
//------------------------------------------------------------------------------
|
|
||||||
/*
|
|
||||||
* Returns the previous UE_id in the scheduling list in UL or DL
|
|
||||||
*/
|
|
||||||
inline int prev(UE_list_t *listP, int nodeP) {
|
|
||||||
if (nodeP == listP->head)
|
|
||||||
return -1; /* there is no previous of the head */
|
|
||||||
|
|
||||||
for (int j = listP->head; j >= 0; j = listP->next[j])
|
|
||||||
if (listP->next[j] == nodeP)
|
|
||||||
return j;
|
|
||||||
|
|
||||||
LOG_E(MAC, "%s(): could not find previous to %d in UE_list\n", __func__, nodeP);
|
|
||||||
dump_ue_list(listP);
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
// This has to be updated to include BSR information
|
// This has to be updated to include BSR information
|
||||||
//------------------------------------------------------------------------------
|
//------------------------------------------------------------------------------
|
||||||
|
|||||||
@@ -329,17 +329,7 @@ rx_sdu(const module_id_t enb_mod_idP,
|
|||||||
if (ra->msg3_round >= mac->common_channels[CC_idP].radioResourceConfigCommon->rach_ConfigCommon.maxHARQ_Msg3Tx - 1) {
|
if (ra->msg3_round >= mac->common_channels[CC_idP].radioResourceConfigCommon->rach_ConfigCommon.maxHARQ_Msg3Tx - 1) {
|
||||||
|
|
||||||
// Release RNTI of LTE PHY when RA does not succeed
|
// Release RNTI of LTE PHY when RA does not succeed
|
||||||
UE_free_list_t *free_list = NULL;
|
put_UE_in_freelist(enb_mod_idP, current_rnti, true);
|
||||||
pthread_mutex_lock(&lock_ue_freelist);
|
|
||||||
free_list = &mac->UE_free_list;
|
|
||||||
free_list->UE_free_ctrl[free_list->tail_freelist].rnti = current_rnti;
|
|
||||||
free_list->UE_free_ctrl[free_list->tail_freelist].removeContextFlg = 1;
|
|
||||||
free_list->UE_free_ctrl[free_list->tail_freelist].raFlag = 1;
|
|
||||||
free_list->num_UEs++;
|
|
||||||
mac->UE_release_req.ue_release_request_body.ue_release_request_TLVs_list[mac->UE_release_req.ue_release_request_body.number_of_TLVs].rnti = current_rnti;
|
|
||||||
mac->UE_release_req.ue_release_request_body.number_of_TLVs++;
|
|
||||||
free_list->tail_freelist = (free_list->tail_freelist + 1) % (NUMBER_OF_UE_MAX+1);
|
|
||||||
pthread_mutex_unlock(&lock_ue_freelist);
|
|
||||||
|
|
||||||
cancel_ra_proc(enb_mod_idP, CC_idP, frameP, current_rnti);
|
cancel_ra_proc(enb_mod_idP, CC_idP, frameP, current_rnti);
|
||||||
nfapi_hi_dci0_request_t *hi_dci0_req = NULL;
|
nfapi_hi_dci0_request_t *hi_dci0_req = NULL;
|
||||||
|
|||||||
@@ -1195,14 +1195,6 @@ typedef struct {
|
|||||||
///remove RA flag
|
///remove RA flag
|
||||||
bool raFlag;
|
bool raFlag;
|
||||||
} UE_free_ctrl_t;
|
} UE_free_ctrl_t;
|
||||||
/*! \brief REMOVE UE list used by eNB to order UEs/CC for deleting*/
|
|
||||||
typedef struct {
|
|
||||||
/// deleting control info
|
|
||||||
UE_free_ctrl_t UE_free_ctrl[NUMBER_OF_UE_MAX+1];
|
|
||||||
int num_UEs;
|
|
||||||
int head_freelist; ///the head position of the delete list
|
|
||||||
int tail_freelist; ///the tail position of the delete list
|
|
||||||
} UE_free_list_t;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* describes contiguous RBs
|
* describes contiguous RBs
|
||||||
@@ -1443,7 +1435,7 @@ typedef struct eNB_MAC_INST_s {
|
|||||||
/// processing time of eNB PCH scheduler
|
/// processing time of eNB PCH scheduler
|
||||||
time_stats_t schedule_pch;
|
time_stats_t schedule_pch;
|
||||||
|
|
||||||
UE_free_list_t UE_free_list;
|
UE_free_ctrl_t UE_free_ctrl[NUMBER_OF_UE_MAX+1];
|
||||||
/// for scheduling selection
|
/// for scheduling selection
|
||||||
SCHEDULER_MODES scheduler_mode;
|
SCHEDULER_MODES scheduler_mode;
|
||||||
/// Default scheduler: Pre-processor implementation. Algorithms for UL/DL
|
/// Default scheduler: Pre-processor implementation. Algorithms for UL/DL
|
||||||
|
|||||||
@@ -190,7 +190,7 @@ void config_common_ue_sa(NR_UE_MAC_INST_t *mac,
|
|||||||
cfg->ssb_table.ssb_subcarrier_offset = mac->ssb_subcarrier_offset;
|
cfg->ssb_table.ssb_subcarrier_offset = mac->ssb_subcarrier_offset;
|
||||||
|
|
||||||
if (mac->frequency_range == FR1){
|
if (mac->frequency_range == FR1){
|
||||||
cfg->ssb_table.ssb_mask_list[0].ssb_mask = scc->ssb_PositionsInBurst.inOneGroup.buf[0]<<24;
|
cfg->ssb_table.ssb_mask_list[0].ssb_mask = ((uint32_t) scc->ssb_PositionsInBurst.inOneGroup.buf[0]) << 24;
|
||||||
cfg->ssb_table.ssb_mask_list[1].ssb_mask = 0;
|
cfg->ssb_table.ssb_mask_list[1].ssb_mask = 0;
|
||||||
}
|
}
|
||||||
else{
|
else{
|
||||||
@@ -353,7 +353,7 @@ void config_common_ue(NR_UE_MAC_INST_t *mac,
|
|||||||
cfg->ssb_table.ssb_mask_list[1].ssb_mask = 0;
|
cfg->ssb_table.ssb_mask_list[1].ssb_mask = 0;
|
||||||
break;
|
break;
|
||||||
case 2 :
|
case 2 :
|
||||||
cfg->ssb_table.ssb_mask_list[0].ssb_mask = scc->ssb_PositionsInBurst->choice.mediumBitmap.buf[0]<<24;
|
cfg->ssb_table.ssb_mask_list[0].ssb_mask = ((uint32_t) scc->ssb_PositionsInBurst->choice.mediumBitmap.buf[0]) << 24;
|
||||||
cfg->ssb_table.ssb_mask_list[1].ssb_mask = 0;
|
cfg->ssb_table.ssb_mask_list[1].ssb_mask = 0;
|
||||||
break;
|
break;
|
||||||
case 3 :
|
case 3 :
|
||||||
|
|||||||
@@ -257,13 +257,6 @@ void get_bwp_info(NR_UE_MAC_INST_t *mac,
|
|||||||
|
|
||||||
NR_BWP_DownlinkCommon_t *get_bwp_downlink_common(NR_UE_MAC_INST_t *mac, NR_BWP_Id_t dl_bwp_id);
|
NR_BWP_DownlinkCommon_t *get_bwp_downlink_common(NR_UE_MAC_INST_t *mac, NR_BWP_Id_t dl_bwp_id);
|
||||||
|
|
||||||
uint8_t nr_extract_dci_info(NR_UE_MAC_INST_t *mac,
|
|
||||||
uint8_t dci_format,
|
|
||||||
uint8_t dci_length,
|
|
||||||
uint16_t rnti,
|
|
||||||
uint64_t *dci_pdu,
|
|
||||||
dci_pdu_rel15_t *nr_pdci_info_extracted);
|
|
||||||
|
|
||||||
NR_PUSCH_TimeDomainResourceAllocationList_t *choose_ul_tda_list(const NR_PUSCH_Config_t *pusch_Config,NR_PUSCH_ConfigCommon_t *pusch_ConfigCommon);
|
NR_PUSCH_TimeDomainResourceAllocationList_t *choose_ul_tda_list(const NR_PUSCH_Config_t *pusch_Config,NR_PUSCH_ConfigCommon_t *pusch_ConfigCommon);
|
||||||
NR_PDSCH_TimeDomainResourceAllocationList_t *choose_dl_tda_list(NR_PDSCH_Config_t *pdsch_Config,NR_PDSCH_ConfigCommon_t *pdsch_ConfigCommon);
|
NR_PDSCH_TimeDomainResourceAllocationList_t *choose_dl_tda_list(NR_PDSCH_Config_t *pdsch_Config,NR_PDSCH_ConfigCommon_t *pdsch_ConfigCommon);
|
||||||
|
|
||||||
|
|||||||
@@ -134,6 +134,13 @@ const initial_pucch_resource_t initial_pucch_resource[16] = {
|
|||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
static uint8_t nr_extract_dci_info(NR_UE_MAC_INST_t *mac,
|
||||||
|
uint8_t dci_format,
|
||||||
|
uint8_t dci_length,
|
||||||
|
uint16_t rnti,
|
||||||
|
uint64_t *dci_pdu,
|
||||||
|
dci_pdu_rel15_t *nr_pdci_info_extracted);
|
||||||
|
|
||||||
void nr_ue_init_mac(module_id_t module_idP) {
|
void nr_ue_init_mac(module_id_t module_idP) {
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
@@ -985,7 +992,8 @@ int8_t nr_ue_process_dci(module_id_t module_id, int cc_id, uint8_t gNB_index, fr
|
|||||||
if (dci->tpc == 3) dlsch_config_pdu_1_0->accumulated_delta_PUCCH = 3;
|
if (dci->tpc == 3) dlsch_config_pdu_1_0->accumulated_delta_PUCCH = 3;
|
||||||
// Sanity check for pucch_resource_indicator value received to check for false DCI.
|
// Sanity check for pucch_resource_indicator value received to check for false DCI.
|
||||||
valid = 0;
|
valid = 0;
|
||||||
if (mac->ULbwp[ul_bwp_id-1] &&
|
if (ul_bwp_id > 0 &&
|
||||||
|
mac->ULbwp[ul_bwp_id-1] &&
|
||||||
mac->ULbwp[ul_bwp_id-1]->bwp_Dedicated &&
|
mac->ULbwp[ul_bwp_id-1]->bwp_Dedicated &&
|
||||||
mac->ULbwp[ul_bwp_id-1]->bwp_Dedicated->pucch_Config &&
|
mac->ULbwp[ul_bwp_id-1]->bwp_Dedicated->pucch_Config &&
|
||||||
mac->ULbwp[ul_bwp_id-1]->bwp_Dedicated->pucch_Config->choice.setup&&
|
mac->ULbwp[ul_bwp_id-1]->bwp_Dedicated->pucch_Config->choice.setup&&
|
||||||
@@ -1512,13 +1520,12 @@ void nr_ue_configure_pucch(NR_UE_MAC_INST_t *mac,
|
|||||||
NR_BWP_UplinkCommon_t *initialUplinkBWP;
|
NR_BWP_UplinkCommon_t *initialUplinkBWP;
|
||||||
if (mac->scc) initialUplinkBWP = mac->scc->uplinkConfigCommon->initialUplinkBWP;
|
if (mac->scc) initialUplinkBWP = mac->scc->uplinkConfigCommon->initialUplinkBWP;
|
||||||
else initialUplinkBWP = &mac->scc_SIB->uplinkConfigCommon->initialUplinkBWP;
|
else initialUplinkBWP = &mac->scc_SIB->uplinkConfigCommon->initialUplinkBWP;
|
||||||
NR_BWP_Uplink_t *ubwp = mac->ULbwp[bwp_id-1];
|
if (mac->cg && bwp_id > 1 && mac->ULbwp[bwp_id - 1] &&
|
||||||
if (mac->cg && ubwp &&
|
|
||||||
mac->cg->spCellConfig &&
|
mac->cg->spCellConfig &&
|
||||||
mac->cg->spCellConfig->spCellConfigDedicated &&
|
mac->cg->spCellConfig->spCellConfigDedicated &&
|
||||||
mac->cg->spCellConfig->spCellConfigDedicated->uplinkConfig &&
|
mac->cg->spCellConfig->spCellConfigDedicated->uplinkConfig &&
|
||||||
mac->cg->spCellConfig->spCellConfigDedicated->uplinkConfig->initialUplinkBWP) {
|
mac->cg->spCellConfig->spCellConfigDedicated->uplinkConfig->initialUplinkBWP) {
|
||||||
scs = ubwp->bwp_Common->genericParameters.subcarrierSpacing;
|
scs = mac->ULbwp[bwp_id - 1]->bwp_Common->genericParameters.subcarrierSpacing;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
scs = initialUplinkBWP->genericParameters.subcarrierSpacing;
|
scs = initialUplinkBWP->genericParameters.subcarrierSpacing;
|
||||||
@@ -2340,17 +2347,16 @@ bool trigger_periodic_scheduling_request(NR_UE_MAC_INST_t *mac,
|
|||||||
NR_BWP_Id_t bwp_id = mac->UL_BWP_Id;
|
NR_BWP_Id_t bwp_id = mac->UL_BWP_Id;
|
||||||
NR_PUCCH_Config_t *pucch_Config = NULL;
|
NR_PUCCH_Config_t *pucch_Config = NULL;
|
||||||
int scs;
|
int scs;
|
||||||
NR_BWP_Uplink_t *ubwp = mac->ULbwp[bwp_id-1];
|
|
||||||
NR_BWP_UplinkCommon_t *initialUplinkBWP;
|
NR_BWP_UplinkCommon_t *initialUplinkBWP;
|
||||||
if (mac->scc) initialUplinkBWP = mac->scc->uplinkConfigCommon->initialUplinkBWP;
|
if (mac->scc) initialUplinkBWP = mac->scc->uplinkConfigCommon->initialUplinkBWP;
|
||||||
else initialUplinkBWP = &mac->scc_SIB->uplinkConfigCommon->initialUplinkBWP;
|
else initialUplinkBWP = &mac->scc_SIB->uplinkConfigCommon->initialUplinkBWP;
|
||||||
|
|
||||||
if (mac->cg && ubwp &&
|
if (mac->cg && bwp_id && mac->ULbwp[bwp_id - 1] &&
|
||||||
mac->cg->spCellConfig &&
|
mac->cg->spCellConfig &&
|
||||||
mac->cg->spCellConfig->spCellConfigDedicated &&
|
mac->cg->spCellConfig->spCellConfigDedicated &&
|
||||||
mac->cg->spCellConfig->spCellConfigDedicated->uplinkConfig &&
|
mac->cg->spCellConfig->spCellConfigDedicated->uplinkConfig &&
|
||||||
mac->cg->spCellConfig->spCellConfigDedicated->uplinkConfig->initialUplinkBWP) {
|
mac->cg->spCellConfig->spCellConfigDedicated->uplinkConfig->initialUplinkBWP) {
|
||||||
scs = ubwp->bwp_Common->genericParameters.subcarrierSpacing;
|
scs = mac->ULbwp[bwp_id - 1]->bwp_Common->genericParameters.subcarrierSpacing;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
scs = initialUplinkBWP->genericParameters.subcarrierSpacing;
|
scs = initialUplinkBWP->genericParameters.subcarrierSpacing;
|
||||||
@@ -2732,7 +2738,7 @@ int get_n_rb(NR_UE_MAC_INST_t *mac, int rnti_type){
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
uint8_t nr_extract_dci_info(NR_UE_MAC_INST_t *mac,
|
static uint8_t nr_extract_dci_info(NR_UE_MAC_INST_t *mac,
|
||||||
uint8_t dci_format,
|
uint8_t dci_format,
|
||||||
uint8_t dci_size,
|
uint8_t dci_size,
|
||||||
uint16_t rnti,
|
uint16_t rnti,
|
||||||
|
|||||||
@@ -118,12 +118,13 @@ long get_k2(NR_UE_MAC_INST_t *mac, uint8_t time_domain_ind) {
|
|||||||
|
|
||||||
NR_BWP_Id_t ul_bwp_id = mac->UL_BWP_Id;
|
NR_BWP_Id_t ul_bwp_id = mac->UL_BWP_Id;
|
||||||
// Get K2 from RRC configuration
|
// Get K2 from RRC configuration
|
||||||
NR_PUSCH_Config_t *pusch_config=mac->ULbwp[ul_bwp_id-1] ? mac->ULbwp[ul_bwp_id-1]->bwp_Dedicated->pusch_Config->choice.setup : NULL;
|
NR_PUSCH_Config_t *pusch_config= ul_bwp_id > 0 && mac->ULbwp[ul_bwp_id-1] ? mac->ULbwp[ul_bwp_id-1]->bwp_Dedicated->pusch_Config->choice.setup : NULL;
|
||||||
NR_PUSCH_TimeDomainResourceAllocationList_t *pusch_TimeDomainAllocationList = NULL;
|
NR_PUSCH_TimeDomainResourceAllocationList_t *pusch_TimeDomainAllocationList = NULL;
|
||||||
if (pusch_config && pusch_config->pusch_TimeDomainAllocationList) {
|
if (pusch_config && pusch_config->pusch_TimeDomainAllocationList) {
|
||||||
pusch_TimeDomainAllocationList = pusch_config->pusch_TimeDomainAllocationList->choice.setup;
|
pusch_TimeDomainAllocationList = pusch_config->pusch_TimeDomainAllocationList->choice.setup;
|
||||||
}
|
}
|
||||||
else if (mac->ULbwp[ul_bwp_id-1] &&
|
else if (ul_bwp_id > 0 &&
|
||||||
|
mac->ULbwp[ul_bwp_id-1] &&
|
||||||
mac->ULbwp[ul_bwp_id-1]->bwp_Common&&
|
mac->ULbwp[ul_bwp_id-1]->bwp_Common&&
|
||||||
mac->ULbwp[ul_bwp_id-1]->bwp_Common->pusch_ConfigCommon&&
|
mac->ULbwp[ul_bwp_id-1]->bwp_Common->pusch_ConfigCommon&&
|
||||||
mac->ULbwp[ul_bwp_id-1]->bwp_Common->pusch_ConfigCommon->choice.setup &&
|
mac->ULbwp[ul_bwp_id-1]->bwp_Common->pusch_ConfigCommon->choice.setup &&
|
||||||
@@ -169,7 +170,7 @@ fapi_nr_ul_config_request_t *get_ul_config_request(NR_UE_MAC_INST_t *mac, int sl
|
|||||||
// Calculate the index of the UL slot in mac->ul_config_request list. This is
|
// Calculate the index of the UL slot in mac->ul_config_request list. This is
|
||||||
// based on the TDD pattern (slot configuration period) and number of UL+mixed
|
// based on the TDD pattern (slot configuration period) and number of UL+mixed
|
||||||
// slots in the period. TS 38.213 Sec 11.1
|
// slots in the period. TS 38.213 Sec 11.1
|
||||||
int mu = mac->ULbwp[ul_bwp_id-1] ?
|
int mu = ul_bwp_id > 0 && mac->ULbwp[ul_bwp_id-1] ?
|
||||||
mac->ULbwp[ul_bwp_id-1]->bwp_Common->genericParameters.subcarrierSpacing :
|
mac->ULbwp[ul_bwp_id-1]->bwp_Common->genericParameters.subcarrierSpacing :
|
||||||
mac->scc_SIB->uplinkConfigCommon->initialUplinkBWP.genericParameters.subcarrierSpacing;
|
mac->scc_SIB->uplinkConfigCommon->initialUplinkBWP.genericParameters.subcarrierSpacing;
|
||||||
const int n = nr_slots_per_frame[mu];
|
const int n = nr_slots_per_frame[mu];
|
||||||
@@ -205,7 +206,7 @@ void ul_layers_config(NR_UE_MAC_INST_t * mac, nfapi_nr_ue_pusch_pdu_t *pusch_con
|
|||||||
srs_config = mac->cg->spCellConfig->spCellConfigDedicated->uplinkConfig->initialUplinkBWP->srs_Config->choice.setup;
|
srs_config = mac->cg->spCellConfig->spCellConfigDedicated->uplinkConfig->initialUplinkBWP->srs_Config->choice.setup;
|
||||||
}
|
}
|
||||||
|
|
||||||
NR_PUSCH_Config_t *pusch_Config = mac->ULbwp[ul_bwp_id-1] ?
|
NR_PUSCH_Config_t *pusch_Config = ul_bwp_id > 0 && mac->ULbwp[ul_bwp_id-1] ?
|
||||||
mac->ULbwp[ul_bwp_id-1]->bwp_Dedicated->pusch_Config->choice.setup :
|
mac->ULbwp[ul_bwp_id-1]->bwp_Dedicated->pusch_Config->choice.setup :
|
||||||
(ubwpd?
|
(ubwpd?
|
||||||
ubwpd->pusch_Config->choice.setup:
|
ubwpd->pusch_Config->choice.setup:
|
||||||
@@ -361,7 +362,7 @@ void ul_ports_config(NR_UE_MAC_INST_t *mac, int *n_front_load_symb, nfapi_nr_ue_
|
|||||||
mac->cg->spCellConfig->spCellConfigDedicated->uplinkConfig->initialUplinkBWP)
|
mac->cg->spCellConfig->spCellConfigDedicated->uplinkConfig->initialUplinkBWP)
|
||||||
ubwpd = mac->cg->spCellConfig->spCellConfigDedicated->uplinkConfig->initialUplinkBWP;
|
ubwpd = mac->cg->spCellConfig->spCellConfigDedicated->uplinkConfig->initialUplinkBWP;
|
||||||
|
|
||||||
NR_PUSCH_Config_t *pusch_Config = mac->ULbwp[ul_bwp_id-1] ? mac->ULbwp[ul_bwp_id-1]->bwp_Dedicated->pusch_Config->choice.setup : (ubwpd?ubwpd->pusch_Config->choice.setup:NULL);
|
NR_PUSCH_Config_t *pusch_Config = ul_bwp_id > 0 && mac->ULbwp[ul_bwp_id-1] ? mac->ULbwp[ul_bwp_id-1]->bwp_Dedicated->pusch_Config->choice.setup : (ubwpd?ubwpd->pusch_Config->choice.setup:NULL);
|
||||||
AssertFatal(pusch_Config!=NULL,"pusch_Config shouldn't be null\n");
|
AssertFatal(pusch_Config!=NULL,"pusch_Config shouldn't be null\n");
|
||||||
|
|
||||||
long transformPrecoder;
|
long transformPrecoder;
|
||||||
@@ -581,7 +582,7 @@ int nr_config_pusch_pdu(NR_UE_MAC_INST_t *mac,
|
|||||||
if (rar_grant) {
|
if (rar_grant) {
|
||||||
|
|
||||||
// Note: for Msg3 or MsgA PUSCH transmission the N_PRB_oh is always set to 0
|
// Note: for Msg3 or MsgA PUSCH transmission the N_PRB_oh is always set to 0
|
||||||
NR_BWP_Uplink_t *ubwp = mac->ULbwp[ul_bwp_id-1];
|
NR_BWP_Uplink_t *ubwp = ul_bwp_id > 0 ? mac->ULbwp[ul_bwp_id - 1] : NULL;
|
||||||
NR_BWP_UplinkDedicated_t *ibwp;
|
NR_BWP_UplinkDedicated_t *ibwp;
|
||||||
int scs,abwp_start,abwp_size,startSymbolAndLength,mappingtype;
|
int scs,abwp_start,abwp_size,startSymbolAndLength,mappingtype;
|
||||||
NR_PUSCH_Config_t *pusch_Config=NULL;
|
NR_PUSCH_Config_t *pusch_Config=NULL;
|
||||||
@@ -839,11 +840,15 @@ int nr_config_pusch_pdu(NR_UE_MAC_INST_t *mac,
|
|||||||
mappingtype, add_pos, dmrslength,
|
mappingtype, add_pos, dmrslength,
|
||||||
pusch_config_pdu->start_symbol_index,
|
pusch_config_pdu->start_symbol_index,
|
||||||
mac->scc ? mac->scc->dmrs_TypeA_Position : mac->mib->dmrs_TypeA_Position);
|
mac->scc ? mac->scc->dmrs_TypeA_Position : mac->mib->dmrs_TypeA_Position);
|
||||||
if (mac->ULbwp[ul_bwp_id-1] && pusch_config_pdu->transform_precoding == NR_PUSCH_Config__transformPrecoder_disabled) {
|
if (ul_bwp_id > 0 &&
|
||||||
if (*dci_format != NR_UL_DCI_FORMAT_0_1) {
|
mac->ULbwp[ul_bwp_id - 1] &&
|
||||||
pusch_config_pdu->num_dmrs_cdm_grps_no_data = 1;
|
pusch_config_pdu->transform_precoding == NR_PUSCH_Config__transformPrecoder_disabled &&
|
||||||
}
|
*dci_format != NR_UL_DCI_FORMAT_0_1) {
|
||||||
} else if (*dci_format == NR_UL_DCI_FORMAT_0_0 || (mac->ULbwp[ul_bwp_id-1] && pusch_config_pdu->transform_precoding == NR_PUSCH_Config__transformPrecoder_enabled)) {
|
pusch_config_pdu->num_dmrs_cdm_grps_no_data = 1;
|
||||||
|
} else if (*dci_format == NR_UL_DCI_FORMAT_0_0 ||
|
||||||
|
(ul_bwp_id > 0 &&
|
||||||
|
mac->ULbwp[ul_bwp_id-1] &&
|
||||||
|
pusch_config_pdu->transform_precoding == NR_PUSCH_Config__transformPrecoder_enabled)) {
|
||||||
pusch_config_pdu->num_dmrs_cdm_grps_no_data = 2;
|
pusch_config_pdu->num_dmrs_cdm_grps_no_data = 2;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -859,7 +864,8 @@ int nr_config_pusch_pdu(NR_UE_MAC_INST_t *mac,
|
|||||||
else N_PRB_oh = 0;
|
else N_PRB_oh = 0;
|
||||||
|
|
||||||
/* PTRS */
|
/* PTRS */
|
||||||
if (mac->ULbwp[ul_bwp_id-1] &&
|
if (ul_bwp_id > 0 &&
|
||||||
|
mac->ULbwp[ul_bwp_id-1] &&
|
||||||
mac->ULbwp[ul_bwp_id-1]->bwp_Dedicated &&
|
mac->ULbwp[ul_bwp_id-1]->bwp_Dedicated &&
|
||||||
mac->ULbwp[ul_bwp_id-1]->bwp_Dedicated->pusch_Config &&
|
mac->ULbwp[ul_bwp_id-1]->bwp_Dedicated->pusch_Config &&
|
||||||
mac->ULbwp[ul_bwp_id-1]->bwp_Dedicated->pusch_Config->choice.setup &&
|
mac->ULbwp[ul_bwp_id-1]->bwp_Dedicated->pusch_Config->choice.setup &&
|
||||||
@@ -928,15 +934,23 @@ bool nr_ue_periodic_srs_scheduling(module_id_t mod_id, frame_t frame, slot_t slo
|
|||||||
bool srs_scheduled = false;
|
bool srs_scheduled = false;
|
||||||
|
|
||||||
NR_UE_MAC_INST_t *mac = get_mac_inst(mod_id);
|
NR_UE_MAC_INST_t *mac = get_mac_inst(mod_id);
|
||||||
|
const NR_BWP_Id_t ul_bwp_id = mac->UL_BWP_Id;
|
||||||
|
|
||||||
NR_SRS_Config_t *srs_config = NULL;
|
NR_SRS_Config_t *srs_config = NULL;
|
||||||
if (mac->cg &&
|
if (ul_bwp_id > 0 && mac->ULbwp[ul_bwp_id-1]) {
|
||||||
mac->cg->spCellConfig &&
|
if (mac->ULbwp[ul_bwp_id-1]->bwp_Dedicated &&
|
||||||
mac->cg->spCellConfig->spCellConfigDedicated &&
|
mac->ULbwp[ul_bwp_id-1]->bwp_Dedicated->srs_Config) {
|
||||||
mac->cg->spCellConfig->spCellConfigDedicated->uplinkConfig &&
|
srs_config = mac->ULbwp[ul_bwp_id-1]->bwp_Dedicated->srs_Config->choice.setup;
|
||||||
mac->cg->spCellConfig->spCellConfigDedicated->uplinkConfig->initialUplinkBWP) {
|
}
|
||||||
|
} else if (mac->cg &&
|
||||||
|
mac->cg->spCellConfig &&
|
||||||
|
mac->cg->spCellConfig->spCellConfigDedicated &&
|
||||||
|
mac->cg->spCellConfig->spCellConfigDedicated->uplinkConfig &&
|
||||||
|
mac->cg->spCellConfig->spCellConfigDedicated->uplinkConfig->initialUplinkBWP) {
|
||||||
srs_config = mac->cg->spCellConfig->spCellConfigDedicated->uplinkConfig->initialUplinkBWP->srs_Config->choice.setup;
|
srs_config = mac->cg->spCellConfig->spCellConfigDedicated->uplinkConfig->initialUplinkBWP->srs_Config->choice.setup;
|
||||||
} else {
|
}
|
||||||
|
|
||||||
|
if (!srs_config) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -964,7 +978,6 @@ bool nr_ue_periodic_srs_scheduling(module_id_t mod_id, frame_t frame, slot_t slo
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
NR_BWP_Id_t ul_bwp_id = mac->UL_BWP_Id;
|
|
||||||
NR_BWP_t ubwp = ul_bwp_id > 0 && mac->ULbwp[ul_bwp_id-1] ?
|
NR_BWP_t ubwp = ul_bwp_id > 0 && mac->ULbwp[ul_bwp_id-1] ?
|
||||||
mac->ULbwp[ul_bwp_id-1]->bwp_Common->genericParameters :
|
mac->ULbwp[ul_bwp_id-1]->bwp_Common->genericParameters :
|
||||||
mac->scc_SIB->uplinkConfigCommon->initialUplinkBWP.genericParameters;
|
mac->scc_SIB->uplinkConfigCommon->initialUplinkBWP.genericParameters;
|
||||||
@@ -1086,9 +1099,10 @@ NR_UE_L2_STATE_t nr_ue_scheduler(nr_downlink_indication_t *dl_info, nr_uplink_in
|
|||||||
dcireq.dl_config_req = mac->dl_config_request;
|
dcireq.dl_config_req = mac->dl_config_request;
|
||||||
|
|
||||||
fill_scheduled_response(&scheduled_response, &dcireq.dl_config_req, NULL, NULL, mod_id, cc_id, rx_frame, rx_slot, dl_info->thread_id, dl_info->phy_data);
|
fill_scheduled_response(&scheduled_response, &dcireq.dl_config_req, NULL, NULL, mod_id, cc_id, rx_frame, rx_slot, dl_info->thread_id, dl_info->phy_data);
|
||||||
if(mac->if_module != NULL && mac->if_module->scheduled_response != NULL)
|
if(mac->if_module != NULL && mac->if_module->scheduled_response != NULL) {
|
||||||
LOG_D(NR_MAC,"1# scheduled_response transmitted, %d, %d\n", rx_frame, rx_slot);
|
LOG_D(NR_MAC,"1# scheduled_response transmitted, %d, %d\n", rx_frame, rx_slot);
|
||||||
mac->if_module->scheduled_response(&scheduled_response);
|
mac->if_module->scheduled_response(&scheduled_response);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
// this is for Msg2/Msg4
|
// this is for Msg2/Msg4
|
||||||
@@ -1557,15 +1571,14 @@ int nr_ue_pusch_scheduler(NR_UE_MAC_INST_t *mac,
|
|||||||
|
|
||||||
int delta = 0;
|
int delta = 0;
|
||||||
NR_BWP_Id_t ul_bwp_id = mac->UL_BWP_Id;
|
NR_BWP_Id_t ul_bwp_id = mac->UL_BWP_Id;
|
||||||
NR_BWP_Uplink_t *ubwp = mac->ULbwp[ul_bwp_id-1];
|
|
||||||
|
|
||||||
// Get the numerology to calculate the Tx frame and slot
|
// Get the numerology to calculate the Tx frame and slot
|
||||||
int mu = ubwp ?
|
int mu = ul_bwp_id > 0 && mac->ULbwp[ul_bwp_id-1] ?
|
||||||
ubwp->bwp_Common->genericParameters.subcarrierSpacing :
|
mac->ULbwp[ul_bwp_id-1]->bwp_Common->genericParameters.subcarrierSpacing :
|
||||||
mac->scc_SIB->uplinkConfigCommon->initialUplinkBWP.genericParameters.subcarrierSpacing;
|
mac->scc_SIB->uplinkConfigCommon->initialUplinkBWP.genericParameters.subcarrierSpacing;
|
||||||
|
|
||||||
NR_PUSCH_TimeDomainResourceAllocationList_t *pusch_TimeDomainAllocationList = ubwp ?
|
NR_PUSCH_TimeDomainResourceAllocationList_t *pusch_TimeDomainAllocationList = ul_bwp_id > 0 && mac->ULbwp[ul_bwp_id-1] ?
|
||||||
ubwp->bwp_Common->pusch_ConfigCommon->choice.setup->pusch_TimeDomainAllocationList:
|
mac->ULbwp[ul_bwp_id-1]->bwp_Common->pusch_ConfigCommon->choice.setup->pusch_TimeDomainAllocationList:
|
||||||
mac->scc_SIB->uplinkConfigCommon->initialUplinkBWP.pusch_ConfigCommon->choice.setup->pusch_TimeDomainAllocationList;
|
mac->scc_SIB->uplinkConfigCommon->initialUplinkBWP.pusch_ConfigCommon->choice.setup->pusch_TimeDomainAllocationList;
|
||||||
// k2 as per 3GPP TS 38.214 version 15.9.0 Release 15 ch 6.1.2.1.1
|
// k2 as per 3GPP TS 38.214 version 15.9.0 Release 15 ch 6.1.2.1.1
|
||||||
// PUSCH time domain resource allocation is higher layer configured from uschTimeDomainAllocationList in either pusch-ConfigCommon
|
// PUSCH time domain resource allocation is higher layer configured from uschTimeDomainAllocationList in either pusch-ConfigCommon
|
||||||
|
|||||||
@@ -335,22 +335,13 @@ void config_common(int Mod_idP, int pdsch_AntennaPorts, int pusch_AntennaPorts,
|
|||||||
cfg->num_tlv++;
|
cfg->num_tlv++;
|
||||||
|
|
||||||
// SSB Table Configuration
|
// SSB Table Configuration
|
||||||
int scs_scaling = 1<<(cfg->ssb_config.scs_common.value);
|
|
||||||
if (scc->downlinkConfigCommon->frequencyInfoDL->absoluteFrequencyPointA < 600000)
|
|
||||||
scs_scaling = scs_scaling*3;
|
|
||||||
if (scc->downlinkConfigCommon->frequencyInfoDL->absoluteFrequencyPointA > 2016666)
|
|
||||||
scs_scaling = scs_scaling>>2;
|
|
||||||
uint32_t absolute_diff = (*scc->downlinkConfigCommon->frequencyInfoDL->absoluteFrequencySSB - scc->downlinkConfigCommon->frequencyInfoDL->absoluteFrequencyPointA);
|
uint32_t absolute_diff = (*scc->downlinkConfigCommon->frequencyInfoDL->absoluteFrequencySSB - scc->downlinkConfigCommon->frequencyInfoDL->absoluteFrequencyPointA);
|
||||||
|
const int scaling_5khz = scc->downlinkConfigCommon->frequencyInfoDL->absoluteFrequencyPointA < 600000 ? 3 : 1;
|
||||||
RC.nrmac[Mod_idP]->ssb_SubcarrierOffset = absolute_diff%(12*scs_scaling);
|
int sco = (absolute_diff/scaling_5khz) % 24;
|
||||||
int sco = 31; // no SIB1
|
if(frequency_range == FR2)
|
||||||
if(get_softmodem_params()->sa) {
|
sco >>= 1; // this assumes 120kHz SCS for SSB and subCarrierSpacingCommon (only option supported by OAI for
|
||||||
sco = RC.nrmac[Mod_idP]->ssb_SubcarrierOffset;
|
const int scs_scaling = frequency_range == FR2 ? 1 << (*scc->ssbSubcarrierSpacing - 2) : 1 << *scc->ssbSubcarrierSpacing;
|
||||||
if(frequency_range == FR1)
|
cfg->ssb_table.ssb_offset_point_a.value = absolute_diff/(12*scaling_5khz) - 10*scs_scaling; //absoluteFrequencySSB is the central frequency of SSB which is made by 20RBs in total
|
||||||
sco <<= cfg->ssb_config.scs_common.value; // 38.211 section 7.4.3.1 in FR1 it is expresses in terms of 15kHz SCS
|
|
||||||
}
|
|
||||||
|
|
||||||
cfg->ssb_table.ssb_offset_point_a.value = absolute_diff/(12*scs_scaling) - 10; //absoluteFrequencySSB is the central frequency of SSB which is made by 20RBs in total
|
|
||||||
cfg->ssb_table.ssb_offset_point_a.tl.tag = NFAPI_NR_CONFIG_SSB_OFFSET_POINT_A_TAG;
|
cfg->ssb_table.ssb_offset_point_a.tl.tag = NFAPI_NR_CONFIG_SSB_OFFSET_POINT_A_TAG;
|
||||||
cfg->num_tlv++;
|
cfg->num_tlv++;
|
||||||
cfg->ssb_table.ssb_period.value = *scc->ssb_periodicityServingCell;
|
cfg->ssb_table.ssb_period.value = *scc->ssb_periodicityServingCell;
|
||||||
@@ -360,13 +351,16 @@ void config_common(int Mod_idP, int pdsch_AntennaPorts, int pusch_AntennaPorts,
|
|||||||
cfg->ssb_table.ssb_subcarrier_offset.tl.tag = NFAPI_NR_CONFIG_SSB_SUBCARRIER_OFFSET_TAG;
|
cfg->ssb_table.ssb_subcarrier_offset.tl.tag = NFAPI_NR_CONFIG_SSB_SUBCARRIER_OFFSET_TAG;
|
||||||
cfg->num_tlv++;
|
cfg->num_tlv++;
|
||||||
|
|
||||||
|
RC.nrmac[Mod_idP]->ssb_SubcarrierOffset = cfg->ssb_table.ssb_subcarrier_offset.value;
|
||||||
|
RC.nrmac[Mod_idP]->ssb_OffsetPointA = cfg->ssb_table.ssb_offset_point_a.value;
|
||||||
|
|
||||||
switch (scc->ssb_PositionsInBurst->present) {
|
switch (scc->ssb_PositionsInBurst->present) {
|
||||||
case 1 :
|
case 1 :
|
||||||
cfg->ssb_table.ssb_mask_list[0].ssb_mask.value = scc->ssb_PositionsInBurst->choice.shortBitmap.buf[0]<<24;
|
cfg->ssb_table.ssb_mask_list[0].ssb_mask.value = scc->ssb_PositionsInBurst->choice.shortBitmap.buf[0]<<24;
|
||||||
cfg->ssb_table.ssb_mask_list[1].ssb_mask.value = 0;
|
cfg->ssb_table.ssb_mask_list[1].ssb_mask.value = 0;
|
||||||
break;
|
break;
|
||||||
case 2 :
|
case 2 :
|
||||||
cfg->ssb_table.ssb_mask_list[0].ssb_mask.value = scc->ssb_PositionsInBurst->choice.mediumBitmap.buf[0]<<24;
|
cfg->ssb_table.ssb_mask_list[0].ssb_mask.value = ((uint32_t) scc->ssb_PositionsInBurst->choice.mediumBitmap.buf[0]) << 24;
|
||||||
cfg->ssb_table.ssb_mask_list[1].ssb_mask.value = 0;
|
cfg->ssb_table.ssb_mask_list[1].ssb_mask.value = 0;
|
||||||
break;
|
break;
|
||||||
case 3 :
|
case 3 :
|
||||||
|
|||||||
@@ -54,52 +54,6 @@
|
|||||||
|
|
||||||
extern RAN_CONTEXT_t RC;
|
extern RAN_CONTEXT_t RC;
|
||||||
|
|
||||||
|
|
||||||
uint16_t get_ssboffset_pointa(NR_ServingCellConfigCommon_t *scc,const long band) {
|
|
||||||
|
|
||||||
int ratio;
|
|
||||||
switch (*scc->ssbSubcarrierSpacing) {
|
|
||||||
case NR_SubcarrierSpacing_kHz15:
|
|
||||||
AssertFatal(band <= 95,
|
|
||||||
"Band %ld is not possible for SSB with 15 kHz SCS\n",
|
|
||||||
band);
|
|
||||||
// no band available above 3GHz using 15kHz
|
|
||||||
ratio = 3; // NRARFCN step is 5 kHz
|
|
||||||
break;
|
|
||||||
case NR_SubcarrierSpacing_kHz30:
|
|
||||||
AssertFatal(band <= 96,
|
|
||||||
"Band %ld is not possible for SSB with 30 kHz SCS\n",
|
|
||||||
band);
|
|
||||||
if (band == 46 || band == 48 || band == 77 ||
|
|
||||||
band == 78 || band == 79 || band == 96) // above 3GHz
|
|
||||||
ratio = 2; // NRARFCN step is 15 kHz
|
|
||||||
else
|
|
||||||
ratio = 6; // NRARFCN step is 5 kHz
|
|
||||||
break;
|
|
||||||
case NR_SubcarrierSpacing_kHz120:
|
|
||||||
AssertFatal(band >= 257,
|
|
||||||
"Band %ld is not possible for SSB with 120 kHz SCS\n",
|
|
||||||
band);
|
|
||||||
ratio = 2; // NRARFCN step is 15 kHz
|
|
||||||
break;
|
|
||||||
case NR_SubcarrierSpacing_kHz240:
|
|
||||||
AssertFatal(band >= 257,
|
|
||||||
"Band %ld is not possible for SSB with 240 kHz SCS\n",
|
|
||||||
band);
|
|
||||||
ratio = 4; // NRARFCN step is 15 kHz
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
AssertFatal(1 == 0, "SCS %ld not allowed for SSB \n",
|
|
||||||
*scc->ssbSubcarrierSpacing);
|
|
||||||
}
|
|
||||||
|
|
||||||
const uint32_t ssb_offset0 = *scc->downlinkConfigCommon->frequencyInfoDL->absoluteFrequencySSB - scc->downlinkConfigCommon->frequencyInfoDL->absoluteFrequencyPointA;
|
|
||||||
|
|
||||||
return (ssb_offset0/(ratio*12) - 10); // absoluteFrequencySSB is the center of SSB
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void schedule_ssb(frame_t frame, sub_frame_t slot,
|
void schedule_ssb(frame_t frame, sub_frame_t slot,
|
||||||
NR_ServingCellConfigCommon_t *scc,
|
NR_ServingCellConfigCommon_t *scc,
|
||||||
nfapi_nr_dl_tti_request_body_t *dl_req,
|
nfapi_nr_dl_tti_request_body_t *dl_req,
|
||||||
@@ -190,7 +144,7 @@ void schedule_nr_mib(module_id_t module_idP, frame_t frameP, sub_frame_t slotP)
|
|||||||
|
|
||||||
NR_SubcarrierSpacing_t scs = *scc->ssbSubcarrierSpacing;
|
NR_SubcarrierSpacing_t scs = *scc->ssbSubcarrierSpacing;
|
||||||
const long band = *scc->downlinkConfigCommon->frequencyInfoDL->frequencyBandList.list.array[0];
|
const long band = *scc->downlinkConfigCommon->frequencyInfoDL->frequencyBandList.list.array[0];
|
||||||
uint16_t offset_pointa = get_ssboffset_pointa(scc,band);
|
const uint16_t offset_pointa = gNB->ssb_OffsetPointA;
|
||||||
uint8_t ssbSubcarrierOffset = gNB->ssb_SubcarrierOffset;
|
uint8_t ssbSubcarrierOffset = gNB->ssb_SubcarrierOffset;
|
||||||
|
|
||||||
const BIT_STRING_t *shortBitmap = &scc->ssb_PositionsInBurst->choice.shortBitmap;
|
const BIT_STRING_t *shortBitmap = &scc->ssb_PositionsInBurst->choice.shortBitmap;
|
||||||
@@ -207,8 +161,9 @@ void schedule_nr_mib(module_id_t module_idP, frame_t frameP, sub_frame_t slotP)
|
|||||||
ssb_start_symbol = get_ssb_start_symbol(band,scs,i_ssb);
|
ssb_start_symbol = get_ssb_start_symbol(band,scs,i_ssb);
|
||||||
// if start symbol is in current slot, schedule current SSB, fill VRB map and call get_type0_PDCCH_CSS_config_parameters
|
// if start symbol is in current slot, schedule current SSB, fill VRB map and call get_type0_PDCCH_CSS_config_parameters
|
||||||
if ((ssb_start_symbol/14) == rel_slot){
|
if ((ssb_start_symbol/14) == rel_slot){
|
||||||
|
const int prb_offset = offset_pointa >> scs;
|
||||||
schedule_ssb(frameP, slotP, scc, dl_req, i_ssb, ssbSubcarrierOffset, offset_pointa, (*(uint32_t*)cc->MIB_pdu.payload) & ((1<<24)-1));
|
schedule_ssb(frameP, slotP, scc, dl_req, i_ssb, ssbSubcarrierOffset, offset_pointa, (*(uint32_t*)cc->MIB_pdu.payload) & ((1<<24)-1));
|
||||||
fill_ssb_vrb_map(cc, offset_pointa, ssb_start_symbol, CC_id);
|
fill_ssb_vrb_map(cc, prb_offset, ssbSubcarrierOffset, ssb_start_symbol, CC_id);
|
||||||
if (get_softmodem_params()->sa == 1) {
|
if (get_softmodem_params()->sa == 1) {
|
||||||
get_type0_PDCCH_CSS_config_parameters(&gNB->type0_PDCCH_CSS_config[i_ssb],
|
get_type0_PDCCH_CSS_config_parameters(&gNB->type0_PDCCH_CSS_config[i_ssb],
|
||||||
frameP,
|
frameP,
|
||||||
@@ -221,7 +176,7 @@ void schedule_nr_mib(module_id_t module_idP, frame_t frameP, sub_frame_t slotP)
|
|||||||
band,
|
band,
|
||||||
i_ssb,
|
i_ssb,
|
||||||
ssb_frame_periodicity,
|
ssb_frame_periodicity,
|
||||||
offset_pointa);
|
prb_offset);
|
||||||
gNB->type0_PDCCH_CSS_config[i_ssb].active = true;
|
gNB->type0_PDCCH_CSS_config[i_ssb].active = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -235,8 +190,9 @@ void schedule_nr_mib(module_id_t module_idP, frame_t frameP, sub_frame_t slotP)
|
|||||||
ssb_start_symbol = get_ssb_start_symbol(band,scs,i_ssb);
|
ssb_start_symbol = get_ssb_start_symbol(band,scs,i_ssb);
|
||||||
// if start symbol is in current slot, schedule current SSB, fill VRB map and call get_type0_PDCCH_CSS_config_parameters
|
// if start symbol is in current slot, schedule current SSB, fill VRB map and call get_type0_PDCCH_CSS_config_parameters
|
||||||
if ((ssb_start_symbol/14) == rel_slot){
|
if ((ssb_start_symbol/14) == rel_slot){
|
||||||
|
const int prb_offset = offset_pointa >> scs;
|
||||||
schedule_ssb(frameP, slotP, scc, dl_req, i_ssb, ssbSubcarrierOffset, offset_pointa, (*(uint32_t*)cc->MIB_pdu.payload) & ((1<<24)-1));
|
schedule_ssb(frameP, slotP, scc, dl_req, i_ssb, ssbSubcarrierOffset, offset_pointa, (*(uint32_t*)cc->MIB_pdu.payload) & ((1<<24)-1));
|
||||||
fill_ssb_vrb_map(cc, offset_pointa, ssb_start_symbol, CC_id);
|
fill_ssb_vrb_map(cc, prb_offset, ssbSubcarrierOffset, ssb_start_symbol, CC_id);
|
||||||
if (get_softmodem_params()->sa == 1) {
|
if (get_softmodem_params()->sa == 1) {
|
||||||
get_type0_PDCCH_CSS_config_parameters(&gNB->type0_PDCCH_CSS_config[i_ssb],
|
get_type0_PDCCH_CSS_config_parameters(&gNB->type0_PDCCH_CSS_config[i_ssb],
|
||||||
frameP,
|
frameP,
|
||||||
@@ -249,7 +205,7 @@ void schedule_nr_mib(module_id_t module_idP, frame_t frameP, sub_frame_t slotP)
|
|||||||
band,
|
band,
|
||||||
i_ssb,
|
i_ssb,
|
||||||
ssb_frame_periodicity,
|
ssb_frame_periodicity,
|
||||||
offset_pointa);
|
prb_offset);
|
||||||
gNB->type0_PDCCH_CSS_config[i_ssb].active = true;
|
gNB->type0_PDCCH_CSS_config[i_ssb].active = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -264,8 +220,9 @@ void schedule_nr_mib(module_id_t module_idP, frame_t frameP, sub_frame_t slotP)
|
|||||||
ssb_start_symbol = get_ssb_start_symbol(band,scs,i_ssb);
|
ssb_start_symbol = get_ssb_start_symbol(band,scs,i_ssb);
|
||||||
// if start symbol is in current slot, schedule current SSB, fill VRB map and call get_type0_PDCCH_CSS_config_parameters
|
// if start symbol is in current slot, schedule current SSB, fill VRB map and call get_type0_PDCCH_CSS_config_parameters
|
||||||
if ((ssb_start_symbol/14) == rel_slot){
|
if ((ssb_start_symbol/14) == rel_slot){
|
||||||
|
const int prb_offset = offset_pointa >> (scs-2); // reference 60kHz
|
||||||
schedule_ssb(frameP, slotP, scc, dl_req, i_ssb, ssbSubcarrierOffset, offset_pointa, (*(uint32_t*)cc->MIB_pdu.payload) & ((1<<24)-1));
|
schedule_ssb(frameP, slotP, scc, dl_req, i_ssb, ssbSubcarrierOffset, offset_pointa, (*(uint32_t*)cc->MIB_pdu.payload) & ((1<<24)-1));
|
||||||
fill_ssb_vrb_map(cc, offset_pointa, ssb_start_symbol, CC_id);
|
fill_ssb_vrb_map(cc, prb_offset, ssbSubcarrierOffset, ssb_start_symbol, CC_id);
|
||||||
const NR_TDD_UL_DL_Pattern_t *tdd = &scc->tdd_UL_DL_ConfigurationCommon->pattern1;
|
const NR_TDD_UL_DL_Pattern_t *tdd = &scc->tdd_UL_DL_ConfigurationCommon->pattern1;
|
||||||
const int n_slots_frame = nr_slots_per_frame[*scc->ssbSubcarrierSpacing];
|
const int n_slots_frame = nr_slots_per_frame[*scc->ssbSubcarrierSpacing];
|
||||||
// FR2 is only TDD, to be fixed for flexible TDD
|
// FR2 is only TDD, to be fixed for flexible TDD
|
||||||
@@ -286,7 +243,7 @@ void schedule_nr_mib(module_id_t module_idP, frame_t frameP, sub_frame_t slotP)
|
|||||||
band,
|
band,
|
||||||
i_ssb,
|
i_ssb,
|
||||||
ssb_frame_periodicity,
|
ssb_frame_periodicity,
|
||||||
offset_pointa);
|
prb_offset);
|
||||||
gNB->type0_PDCCH_CSS_config[i_ssb].active = true;
|
gNB->type0_PDCCH_CSS_config[i_ssb].active = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -306,7 +263,7 @@ void schedule_nr_SI(module_id_t module_idP, frame_t frameP, sub_frame_t subframe
|
|||||||
//----------------------------------------
|
//----------------------------------------
|
||||||
}
|
}
|
||||||
|
|
||||||
void fill_ssb_vrb_map (NR_COMMON_channels_t *cc, int rbStart, uint16_t symStart, int CC_id) {
|
void fill_ssb_vrb_map (NR_COMMON_channels_t *cc, int rbStart, int ssb_subcarrier_offset, uint16_t symStart, int CC_id) {
|
||||||
|
|
||||||
AssertFatal(*cc->ServingCellConfigCommon->ssbSubcarrierSpacing !=
|
AssertFatal(*cc->ServingCellConfigCommon->ssbSubcarrierSpacing !=
|
||||||
NR_SubcarrierSpacing_kHz240,
|
NR_SubcarrierSpacing_kHz240,
|
||||||
@@ -314,7 +271,8 @@ void fill_ssb_vrb_map (NR_COMMON_channels_t *cc, int rbStart, uint16_t symStart
|
|||||||
|
|
||||||
uint16_t *vrb_map = cc[CC_id].vrb_map;
|
uint16_t *vrb_map = cc[CC_id].vrb_map;
|
||||||
|
|
||||||
for (int rb = 0; rb < 20; rb++)
|
const int extra_prb = ssb_subcarrier_offset > 0;
|
||||||
|
for (int rb = 0; rb < 20+extra_prb; rb++)
|
||||||
vrb_map[rbStart + rb] = SL_to_bitmap(symStart, 4);
|
vrb_map[rbStart + rb] = SL_to_bitmap(symStart, 4);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1348,6 +1348,8 @@ void nr_schedule_ue_spec(module_id_t module_id,
|
|||||||
header->L = htons(bufEnd-buf);
|
header->L = htons(bufEnd-buf);
|
||||||
dlsch_total_bytes += bufEnd-buf;
|
dlsch_total_bytes += bufEnd-buf;
|
||||||
|
|
||||||
|
for (; ((intptr_t)buf) % 4; buf++)
|
||||||
|
*buf = lrand48() & 0xff;
|
||||||
for (; buf < bufEnd - 3; buf += 4) {
|
for (; buf < bufEnd - 3; buf += 4) {
|
||||||
uint32_t *buf32 = (uint32_t *)buf;
|
uint32_t *buf32 = (uint32_t *)buf;
|
||||||
*buf32 = lrand48();
|
*buf32 = lrand48();
|
||||||
|
|||||||
@@ -2437,16 +2437,15 @@ NR_UE_info_t *add_new_nr_ue(gNB_MAC_INST *nr_mac, rnti_t rntiP, NR_CellGroupConf
|
|||||||
sched_ctrl->next_dl_bwp_id = -1;
|
sched_ctrl->next_dl_bwp_id = -1;
|
||||||
sched_ctrl->next_ul_bwp_id = -1;
|
sched_ctrl->next_ul_bwp_id = -1;
|
||||||
const struct NR_UplinkConfig__uplinkBWP_ToAddModList *ubwpList = servingCellConfig ? servingCellConfig->uplinkConfig->uplinkBWP_ToAddModList : NULL;
|
const struct NR_UplinkConfig__uplinkBWP_ToAddModList *ubwpList = servingCellConfig ? servingCellConfig->uplinkConfig->uplinkBWP_ToAddModList : NULL;
|
||||||
if (ubwpList)
|
AssertFatal(ubwpList == NULL || ubwpList->list.count <= NR_MAX_NUM_BWP,
|
||||||
AssertFatal(ubwpList->list.count <= NR_MAX_NUM_BWP,
|
"uplinkBWP_ToAddModList has %d BWP!\n",
|
||||||
"uplinkBWP_ToAddModList has %d BWP!\n",
|
ubwpList->list.count);
|
||||||
ubwpList->list.count);
|
|
||||||
const int ul_bwp_id = servingCellConfig ? *servingCellConfig->uplinkConfig->firstActiveUplinkBWP_Id : 0;
|
const int ul_bwp_id = servingCellConfig ? *servingCellConfig->uplinkConfig->firstActiveUplinkBWP_Id : 0;
|
||||||
sched_ctrl->active_ubwp = ubwpList && ul_bwp_id > 0 ? ubwpList->list.array[ul_bwp_id - 1] : NULL;
|
sched_ctrl->active_ubwp = ubwpList && ul_bwp_id > 0 ? ubwpList->list.array[ul_bwp_id - 1] : NULL;
|
||||||
|
|
||||||
/* get Number of HARQ processes for this UE */
|
/* get Number of HARQ processes for this UE */
|
||||||
if (servingCellConfig)
|
AssertFatal(servingCellConfig == NULL
|
||||||
AssertFatal(servingCellConfig->pdsch_ServingCellConfig->present == NR_SetupRelease_PDSCH_ServingCellConfig_PR_setup,
|
|| servingCellConfig->pdsch_ServingCellConfig->present == NR_SetupRelease_PDSCH_ServingCellConfig_PR_setup,
|
||||||
"no pdsch-ServingCellConfig found for UE %04x\n",
|
"no pdsch-ServingCellConfig found for UE %04x\n",
|
||||||
UE->rnti);
|
UE->rnti);
|
||||||
const NR_PDSCH_ServingCellConfig_t *pdsch = servingCellConfig ? servingCellConfig->pdsch_ServingCellConfig->choice.setup : NULL;
|
const NR_PDSCH_ServingCellConfig_t *pdsch = servingCellConfig ? servingCellConfig->pdsch_ServingCellConfig->choice.setup : NULL;
|
||||||
|
|||||||
@@ -40,15 +40,16 @@ void nr_configure_srs(nfapi_nr_srs_pdu_t *srs_pdu, int module_id, int CC_id,NR_U
|
|||||||
NR_ServingCellConfigCommon_t *scc = nrmac->common_channels[CC_id].ServingCellConfigCommon;
|
NR_ServingCellConfigCommon_t *scc = nrmac->common_channels[CC_id].ServingCellConfigCommon;
|
||||||
NR_UE_sched_ctrl_t *sched_ctrl = &UE->UE_sched_ctrl;
|
NR_UE_sched_ctrl_t *sched_ctrl = &UE->UE_sched_ctrl;
|
||||||
|
|
||||||
NR_BWP_t ubwp = sched_ctrl->active_ubwp ?
|
const NR_SIB1_t *sib1 = nrmac->common_channels[0].sib1 ? nrmac->common_channels[0].sib1->message.choice.c1->choice.systemInformationBlockType1 : NULL;
|
||||||
sched_ctrl->active_ubwp->bwp_Common->genericParameters :
|
const NR_BWP_t *genericParameters = get_ul_bwp_genericParameters(sched_ctrl->active_ubwp,
|
||||||
scc->uplinkConfigCommon->initialUplinkBWP->genericParameters;
|
scc,
|
||||||
|
sib1);
|
||||||
|
|
||||||
srs_pdu->rnti = UE->rnti;
|
srs_pdu->rnti = UE->rnti;
|
||||||
srs_pdu->handle = 0;
|
srs_pdu->handle = 0;
|
||||||
srs_pdu->bwp_size = NRRIV2BW(ubwp.locationAndBandwidth, MAX_BWP_SIZE);;
|
srs_pdu->bwp_size = NRRIV2BW(genericParameters->locationAndBandwidth, MAX_BWP_SIZE);;
|
||||||
srs_pdu->bwp_start = NRRIV2PRBOFFSET(ubwp.locationAndBandwidth, MAX_BWP_SIZE);;
|
srs_pdu->bwp_start = NRRIV2PRBOFFSET(genericParameters->locationAndBandwidth, MAX_BWP_SIZE);;
|
||||||
srs_pdu->subcarrier_spacing = ubwp.subcarrierSpacing;
|
srs_pdu->subcarrier_spacing = genericParameters->subcarrierSpacing;
|
||||||
srs_pdu->cyclic_prefix = 0;
|
srs_pdu->cyclic_prefix = 0;
|
||||||
srs_pdu->num_ant_ports = srs_resource->nrofSRS_Ports;
|
srs_pdu->num_ant_ports = srs_resource->nrofSRS_Ports;
|
||||||
srs_pdu->num_symbols = srs_resource->resourceMapping.nrofSymbols;
|
srs_pdu->num_symbols = srs_resource->resourceMapping.nrofSymbols;
|
||||||
@@ -122,18 +123,26 @@ void nr_schedule_srs(int module_id, frame_t frame) {
|
|||||||
sched_ctrl->sched_srs.slot = -1;
|
sched_ctrl->sched_srs.slot = -1;
|
||||||
sched_ctrl->sched_srs.srs_scheduled = false;
|
sched_ctrl->sched_srs.srs_scheduled = false;
|
||||||
|
|
||||||
if(!UE->Msg4_ACKed || sched_ctrl->rrc_processing_timer > 0) {
|
if((sched_ctrl->ul_failure == 1 && get_softmodem_params()->phy_test==0) ||
|
||||||
|
sched_ctrl->rrc_processing_timer > 0) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
NR_SRS_Config_t *srs_config = NULL;
|
NR_SRS_Config_t *srs_config = NULL;
|
||||||
if (cg &&
|
if (sched_ctrl->active_ubwp) {
|
||||||
cg->spCellConfig &&
|
if (sched_ctrl->active_ubwp->bwp_Dedicated &&
|
||||||
cg->spCellConfig->spCellConfigDedicated &&
|
sched_ctrl->active_ubwp->bwp_Dedicated->srs_Config) {
|
||||||
cg->spCellConfig->spCellConfigDedicated->uplinkConfig &&
|
srs_config = sched_ctrl->active_ubwp->bwp_Dedicated->srs_Config->choice.setup;
|
||||||
cg->spCellConfig->spCellConfigDedicated->uplinkConfig->initialUplinkBWP) {
|
}
|
||||||
|
} else if (cg &&
|
||||||
|
cg->spCellConfig &&
|
||||||
|
cg->spCellConfig->spCellConfigDedicated &&
|
||||||
|
cg->spCellConfig->spCellConfigDedicated->uplinkConfig &&
|
||||||
|
cg->spCellConfig->spCellConfigDedicated->uplinkConfig->initialUplinkBWP) {
|
||||||
srs_config = cg->spCellConfig->spCellConfigDedicated->uplinkConfig->initialUplinkBWP->srs_Config->choice.setup;
|
srs_config = cg->spCellConfig->spCellConfigDedicated->uplinkConfig->initialUplinkBWP->srs_Config->choice.setup;
|
||||||
} else {
|
}
|
||||||
|
|
||||||
|
if (!srs_config) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -163,14 +172,15 @@ void nr_schedule_srs(int module_id, frame_t frame) {
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
NR_BWP_t ubwp = sched_ctrl->active_ubwp ?
|
const NR_SIB1_t *sib1 = nrmac->common_channels[0].sib1 ? nrmac->common_channels[0].sib1->message.choice.c1->choice.systemInformationBlockType1 : NULL;
|
||||||
sched_ctrl->active_ubwp->bwp_Common->genericParameters :
|
const NR_BWP_t *genericParameters = get_ul_bwp_genericParameters(sched_ctrl->active_ubwp,
|
||||||
scc->uplinkConfigCommon->initialUplinkBWP->genericParameters;
|
scc,
|
||||||
|
sib1);
|
||||||
|
|
||||||
uint16_t period = srs_period[srs_resource->resourceType.choice.periodic->periodicityAndOffset_p.present];
|
uint16_t period = srs_period[srs_resource->resourceType.choice.periodic->periodicityAndOffset_p.present];
|
||||||
uint16_t offset = get_nr_srs_offset(srs_resource->resourceType.choice.periodic->periodicityAndOffset_p);
|
uint16_t offset = get_nr_srs_offset(srs_resource->resourceType.choice.periodic->periodicityAndOffset_p);
|
||||||
|
|
||||||
int n_slots_frame = nr_slots_per_frame[ubwp.subcarrierSpacing];
|
const int n_slots_frame = nr_slots_per_frame[genericParameters->subcarrierSpacing];
|
||||||
|
|
||||||
// Check if UE will transmit the SRS in this frame
|
// Check if UE will transmit the SRS in this frame
|
||||||
if ( ((frame - offset/n_slots_frame)*n_slots_frame)%period == 0) {
|
if ( ((frame - offset/n_slots_frame)*n_slots_frame)%period == 0) {
|
||||||
|
|||||||
@@ -38,6 +38,8 @@
|
|||||||
#include "LAYER2/NR_MAC_COMMON/nr_mac_extern.h"
|
#include "LAYER2/NR_MAC_COMMON/nr_mac_extern.h"
|
||||||
extern void process_CellGroup(NR_CellGroupConfig_t *CellGroup, NR_UE_sched_ctrl_t *sched_ctrl);
|
extern void process_CellGroup(NR_CellGroupConfig_t *CellGroup, NR_UE_sched_ctrl_t *sched_ctrl);
|
||||||
|
|
||||||
|
//#define SRS_IND_DEBUG
|
||||||
|
|
||||||
int get_dci_format(NR_UE_sched_ctrl_t *sched_ctrl) {
|
int get_dci_format(NR_UE_sched_ctrl_t *sched_ctrl) {
|
||||||
|
|
||||||
int dci_format = sched_ctrl->search_space && sched_ctrl->search_space->searchSpaceType &&
|
int dci_format = sched_ctrl->search_space && sched_ctrl->search_space->searchSpaceType &&
|
||||||
@@ -763,6 +765,56 @@ void nr_rx_sdu(const module_id_t gnb_mod_idP,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void handle_nr_srs_measurements(const module_id_t module_id,
|
||||||
|
const frame_t frame,
|
||||||
|
const sub_frame_t slot,
|
||||||
|
const rnti_t rnti,
|
||||||
|
const uint16_t timing_advance,
|
||||||
|
const uint8_t num_symbols,
|
||||||
|
const uint8_t wide_band_snr,
|
||||||
|
const uint8_t num_reported_symbols,
|
||||||
|
nfapi_nr_srs_indication_reported_symbol_t* reported_symbol_list) {
|
||||||
|
|
||||||
|
LOG_D(NR_MAC, "(%d.%d) Received SRS indication for rnti: 0x%04x\n", frame, slot, rnti);
|
||||||
|
|
||||||
|
#ifdef SRS_IND_DEBUG
|
||||||
|
LOG_I(NR_MAC, "frame = %i\n", frame);
|
||||||
|
LOG_I(NR_MAC, "slot = %i\n", slot);
|
||||||
|
LOG_I(NR_MAC, "rnti = 0x%04x\n", rnti);
|
||||||
|
LOG_I(NR_MAC, "timing_advance = %i\n", timing_advance);
|
||||||
|
LOG_I(NR_MAC, "num_symbols = %i\n", num_symbols);
|
||||||
|
LOG_I(NR_MAC, "wide_band_snr = %i (%i dB)\n", wide_band_snr, (wide_band_snr>>1)-64);
|
||||||
|
LOG_I(NR_MAC, "num_reported_symbols = %i\n", num_reported_symbols);
|
||||||
|
LOG_I(NR_MAC, "reported_symbol_list[0].num_rbs = %i\n", reported_symbol_list[0].num_rbs);
|
||||||
|
for(int rb = 0; rb < reported_symbol_list[0].num_rbs; rb++) {
|
||||||
|
LOG_I(NR_MAC, "reported_symbol_list[0].rb_list[%3i].rb_snr = %i (%i dB)\n",
|
||||||
|
rb, reported_symbol_list[0].rb_list[rb].rb_snr, (reported_symbol_list[0].rb_list[rb].rb_snr>>1)-64);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
NR_UE_info_t *UE = find_nr_UE(&RC.nrmac[module_id]->UE_info, rnti);
|
||||||
|
if (!UE) {
|
||||||
|
LOG_W(NR_MAC, "Could not find UE for RNTI 0x%04x\n", rnti);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
gNB_MAC_INST *nr_mac = RC.nrmac[module_id];
|
||||||
|
NR_mac_stats_t *stats = &UE->mac_stats;
|
||||||
|
stats->srs_wide_band_snr = (wide_band_snr>>1)-64;
|
||||||
|
|
||||||
|
const int ul_prbblack_SNR_threshold = nr_mac->ul_prbblack_SNR_threshold;
|
||||||
|
uint16_t *ulprbbl = nr_mac->ulprbbl;
|
||||||
|
|
||||||
|
memset(ulprbbl, 0, reported_symbol_list[0].num_rbs*sizeof(uint16_t));
|
||||||
|
for (int rb = 0; rb < reported_symbol_list[0].num_rbs; rb++) {
|
||||||
|
int snr = (reported_symbol_list[0].rb_list[rb].rb_snr>>1)-64;
|
||||||
|
if (snr < ul_prbblack_SNR_threshold) {
|
||||||
|
ulprbbl[rb] = 0x3FFF; // all symbols taken
|
||||||
|
}
|
||||||
|
LOG_D(NR_MAC, "ulprbbl[%3i] = 0x%x\n", rb, ulprbbl[rb]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
long get_K2(NR_ServingCellConfigCommon_t *scc,
|
long get_K2(NR_ServingCellConfigCommon_t *scc,
|
||||||
NR_ServingCellConfigCommonSIB_t *scc_sib1,
|
NR_ServingCellConfigCommonSIB_t *scc_sib1,
|
||||||
NR_BWP_Uplink_t *ubwp,
|
NR_BWP_Uplink_t *ubwp,
|
||||||
|
|||||||
@@ -434,7 +434,7 @@ int binomial(int n, int k);
|
|||||||
|
|
||||||
bool is_xlsch_in_slot(uint64_t bitmap, sub_frame_t slot);
|
bool is_xlsch_in_slot(uint64_t bitmap, sub_frame_t slot);
|
||||||
|
|
||||||
void fill_ssb_vrb_map (NR_COMMON_channels_t *cc, int rbStart, uint16_t symStart, int CC_id);
|
void fill_ssb_vrb_map (NR_COMMON_channels_t *cc, int rbStart, int ssb_subcarrier_offset, uint16_t symStart, int CC_id);
|
||||||
|
|
||||||
|
|
||||||
/* \brief Function to indicate a received SDU on ULSCH.
|
/* \brief Function to indicate a received SDU on ULSCH.
|
||||||
@@ -470,9 +470,19 @@ void handle_nr_ul_harq(const int CC_idP,
|
|||||||
sub_frame_t slot,
|
sub_frame_t slot,
|
||||||
const nfapi_nr_crc_t *crc_pdu);
|
const nfapi_nr_crc_t *crc_pdu);
|
||||||
|
|
||||||
|
void handle_nr_srs_measurements(const module_id_t module_id,
|
||||||
|
const frame_t frame,
|
||||||
|
const sub_frame_t slot,
|
||||||
|
const rnti_t rnti,
|
||||||
|
const uint16_t timing_advance,
|
||||||
|
const uint8_t num_symbols,
|
||||||
|
const uint8_t wide_band_snr,
|
||||||
|
const uint8_t num_reported_symbols,
|
||||||
|
nfapi_nr_srs_indication_reported_symbol_t* reported_symbol_list);
|
||||||
|
|
||||||
int16_t ssb_index_from_prach(module_id_t module_idP,
|
int16_t ssb_index_from_prach(module_id_t module_idP,
|
||||||
frame_t frameP,
|
frame_t frameP,
|
||||||
sub_frame_t slotP,
|
sub_frame_t slotP,
|
||||||
uint16_t preamble_index,
|
uint16_t preamble_index,
|
||||||
uint8_t freq_index,
|
uint8_t freq_index,
|
||||||
uint8_t symbol);
|
uint8_t symbol);
|
||||||
|
|||||||
@@ -84,23 +84,23 @@ size_t dump_mac_stats(gNB_MAC_INST *gNB, char *output, size_t strlen, bool reset
|
|||||||
int num = 1;
|
int num = 1;
|
||||||
const char *begin = output;
|
const char *begin = output;
|
||||||
const char *end = output + strlen;
|
const char *end = output + strlen;
|
||||||
|
|
||||||
pthread_mutex_lock(&gNB->UE_info.mutex);
|
pthread_mutex_lock(&gNB->UE_info.mutex);
|
||||||
UE_iterator(gNB->UE_info.list, UE) {
|
UE_iterator(gNB->UE_info.list, UE) {
|
||||||
NR_UE_sched_ctrl_t *sched_ctrl = &UE->UE_sched_ctrl;
|
NR_UE_sched_ctrl_t *sched_ctrl = &UE->UE_sched_ctrl;
|
||||||
NR_mac_stats_t *stats = &UE->mac_stats;
|
NR_mac_stats_t *stats = &UE->mac_stats;
|
||||||
const int avg_rsrp = stats->num_rsrp_meas > 0 ? stats->cumul_rsrp / stats->num_rsrp_meas : 0;
|
const int avg_rsrp = stats->num_rsrp_meas > 0 ? stats->cumul_rsrp / stats->num_rsrp_meas : 0;
|
||||||
|
|
||||||
|
|
||||||
output += snprintf(output,
|
output += snprintf(output,
|
||||||
end - output,
|
end - output,
|
||||||
"UE RNTI %04x (%d) PH %d dB PCMAX %d dBm, average RSRP %d (%d meas)\n",
|
"UE RNTI %04x (%d) PH %d dB PCMAX %d dBm, average RSRP %d (%d meas), UL-SNR %d dB\n",
|
||||||
UE->rnti,
|
UE->rnti,
|
||||||
num++,
|
num++,
|
||||||
sched_ctrl->ph,
|
sched_ctrl->ph,
|
||||||
sched_ctrl->pcmax,
|
sched_ctrl->pcmax,
|
||||||
avg_rsrp,
|
avg_rsrp,
|
||||||
stats->num_rsrp_meas);
|
stats->num_rsrp_meas,
|
||||||
|
stats->srs_wide_band_snr);
|
||||||
output += snprintf(output,
|
output += snprintf(output,
|
||||||
end - output,
|
end - output,
|
||||||
"UE %04x: CQI %d, RI %d, PMI (%d,%d)\n",
|
"UE %04x: CQI %d, RI %d, PMI (%d,%d)\n",
|
||||||
@@ -232,7 +232,6 @@ void mac_top_init_gNB(void)
|
|||||||
|
|
||||||
// Initialize Linked-List for Active UEs
|
// Initialize Linked-List for Active UEs
|
||||||
for (i = 0; i < RC.nb_nr_macrlc_inst; i++) {
|
for (i = 0; i < RC.nb_nr_macrlc_inst; i++) {
|
||||||
|
|
||||||
nrmac = RC.nrmac[i];
|
nrmac = RC.nrmac[i];
|
||||||
nrmac->if_inst = NR_IF_Module_init(i);
|
nrmac->if_inst = NR_IF_Module_init(i);
|
||||||
memset(&nrmac->UE_info, 0, sizeof(nrmac->UE_info));
|
memset(&nrmac->UE_info, 0, sizeof(nrmac->UE_info));
|
||||||
|
|||||||
@@ -693,6 +693,7 @@ typedef struct NR_mac_stats {
|
|||||||
uint32_t pucch0_DTX;
|
uint32_t pucch0_DTX;
|
||||||
int cumul_rsrp;
|
int cumul_rsrp;
|
||||||
uint8_t num_rsrp_meas;
|
uint8_t num_rsrp_meas;
|
||||||
|
int8_t srs_wide_band_snr;
|
||||||
} NR_mac_stats_t;
|
} NR_mac_stats_t;
|
||||||
|
|
||||||
typedef struct NR_bler_options {
|
typedef struct NR_bler_options {
|
||||||
@@ -759,12 +760,15 @@ typedef struct gNB_MAC_INST_s {
|
|||||||
int pusch_target_snrx10;
|
int pusch_target_snrx10;
|
||||||
/// Pucch target SNR
|
/// Pucch target SNR
|
||||||
int pucch_target_snrx10;
|
int pucch_target_snrx10;
|
||||||
|
/// SNR threshold needed to put or not a PRB in the black list
|
||||||
|
int ul_prbblack_SNR_threshold;
|
||||||
/// PUCCH Failure threshold (compared to consecutive PUCCH DTX)
|
/// PUCCH Failure threshold (compared to consecutive PUCCH DTX)
|
||||||
int pucch_failure_thres;
|
int pucch_failure_thres;
|
||||||
/// PUSCH Failure threshold (compared to consecutive PUSCH DTX)
|
/// PUSCH Failure threshold (compared to consecutive PUSCH DTX)
|
||||||
int pusch_failure_thres;
|
int pusch_failure_thres;
|
||||||
/// Subcarrier Offset
|
/// Subcarrier Offset
|
||||||
int ssb_SubcarrierOffset;
|
int ssb_SubcarrierOffset;
|
||||||
|
int ssb_OffsetPointA;
|
||||||
/// SIB1 Time domain allocation
|
/// SIB1 Time domain allocation
|
||||||
int sib1_tda;
|
int sib1_tda;
|
||||||
int minRXTXTIMEpdsch;
|
int minRXTXTIMEpdsch;
|
||||||
@@ -773,7 +777,7 @@ typedef struct gNB_MAC_INST_s {
|
|||||||
/// current PDU index (BCH,DLSCH)
|
/// current PDU index (BCH,DLSCH)
|
||||||
uint16_t pdu_index[NFAPI_CC_MAX];
|
uint16_t pdu_index[NFAPI_CC_MAX];
|
||||||
int num_ulprbbl;
|
int num_ulprbbl;
|
||||||
uint16_t ulprbbl[275];
|
uint16_t ulprbbl[MAX_BWP_SIZE];
|
||||||
/// NFAPI Config Request Structure
|
/// NFAPI Config Request Structure
|
||||||
nfapi_nr_config_request_scf_t config[NFAPI_CC_MAX];
|
nfapi_nr_config_request_scf_t config[NFAPI_CC_MAX];
|
||||||
/// NFAPI DL Config Request Structure
|
/// NFAPI DL Config Request Structure
|
||||||
|
|||||||
@@ -27,6 +27,7 @@
|
|||||||
|
|
||||||
#include "nr_pdcp_security_nea2.h"
|
#include "nr_pdcp_security_nea2.h"
|
||||||
#include "nr_pdcp_integrity_nia2.h"
|
#include "nr_pdcp_integrity_nia2.h"
|
||||||
|
#include "nr_pdcp_integrity_nia1.h"
|
||||||
#include "nr_pdcp_sdu.h"
|
#include "nr_pdcp_sdu.h"
|
||||||
|
|
||||||
#include "LOG/log.h"
|
#include "LOG/log.h"
|
||||||
@@ -240,16 +241,21 @@ static void nr_pdcp_entity_set_security(nr_pdcp_entity_t *entity,
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (integrity_algorithm != 0 && integrity_algorithm != -1) {
|
if (integrity_algorithm != 0 && integrity_algorithm != -1) {
|
||||||
if (integrity_algorithm != 2) {
|
|
||||||
LOG_E(PDCP, "FATAL: only nia2 supported for the moment\n");
|
|
||||||
exit(1);
|
|
||||||
}
|
|
||||||
entity->has_integrity = 1;
|
entity->has_integrity = 1;
|
||||||
if (entity->free_integrity != NULL)
|
if (entity->free_integrity != NULL)
|
||||||
entity->free_integrity(entity->integrity_context);
|
entity->free_integrity(entity->integrity_context);
|
||||||
entity->integrity_context = nr_pdcp_integrity_nia2_init(entity->integrity_key);
|
if (integrity_algorithm == 2) {
|
||||||
entity->integrity = nr_pdcp_integrity_nia2_integrity;
|
entity->integrity_context = nr_pdcp_integrity_nia2_init(entity->integrity_key);
|
||||||
entity->free_integrity = nr_pdcp_integrity_nia2_free_integrity;
|
entity->integrity = nr_pdcp_integrity_nia2_integrity;
|
||||||
|
entity->free_integrity = nr_pdcp_integrity_nia2_free_integrity;
|
||||||
|
} else if (integrity_algorithm == 1) {
|
||||||
|
entity->integrity_context = nr_pdcp_integrity_nia1_init(entity->integrity_key);
|
||||||
|
entity->integrity = nr_pdcp_integrity_nia1_integrity;
|
||||||
|
entity->free_integrity = nr_pdcp_integrity_nia1_free_integrity;
|
||||||
|
} else {
|
||||||
|
LOG_E(PDCP, "FATAL: only nia1 and nia2 supported for the moment\n");
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ciphering_algorithm == 0) {
|
if (ciphering_algorithm == 0) {
|
||||||
|
|||||||
@@ -0,0 +1,66 @@
|
|||||||
|
/*
|
||||||
|
* 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
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "nr_pdcp_integrity_nia1.h"
|
||||||
|
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <stdint.h>
|
||||||
|
#include <openssl/cmac.h>
|
||||||
|
|
||||||
|
#include "UTIL/OSA/osa_defs.h"
|
||||||
|
|
||||||
|
int stream_compute_integrity_eia1(stream_cipher_t *stream_cipher, uint8_t out[4]);
|
||||||
|
|
||||||
|
void *nr_pdcp_integrity_nia1_init(unsigned char *integrity_key)
|
||||||
|
{
|
||||||
|
stream_cipher_t *ret;
|
||||||
|
|
||||||
|
ret = calloc(1, sizeof(*ret)); if (ret == NULL) abort();
|
||||||
|
ret->key = malloc(16); if (ret->key == NULL) abort();
|
||||||
|
memcpy(ret->key, integrity_key, 16);
|
||||||
|
ret->key_length = 16; /* unused */
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
void nr_pdcp_integrity_nia1_integrity(void *integrity_context,
|
||||||
|
unsigned char *out,
|
||||||
|
unsigned char *buffer, int length,
|
||||||
|
int bearer, int count, int direction)
|
||||||
|
{
|
||||||
|
stream_cipher_t *ctx = integrity_context;
|
||||||
|
|
||||||
|
ctx->message = buffer;
|
||||||
|
ctx->count = count;
|
||||||
|
ctx->bearer = bearer-1;
|
||||||
|
ctx->direction = direction;
|
||||||
|
ctx->blength = length * 8;
|
||||||
|
|
||||||
|
stream_compute_integrity_eia1(ctx, out);
|
||||||
|
}
|
||||||
|
|
||||||
|
void nr_pdcp_integrity_nia1_free_integrity(void *integrity_context)
|
||||||
|
{
|
||||||
|
stream_cipher_t *ctx = integrity_context;
|
||||||
|
free(ctx->key);
|
||||||
|
free(ctx);
|
||||||
|
}
|
||||||
@@ -0,0 +1,34 @@
|
|||||||
|
/*
|
||||||
|
* 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
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef _NR_PDCP_INTEGRITY_NIA1_H_
|
||||||
|
#define _NR_PDCP_INTEGRITY_NIA1_H_
|
||||||
|
|
||||||
|
void *nr_pdcp_integrity_nia1_init(unsigned char *integrity_key);
|
||||||
|
|
||||||
|
void nr_pdcp_integrity_nia1_integrity(void *integrity_context,
|
||||||
|
unsigned char *out,
|
||||||
|
unsigned char *buffer, int length,
|
||||||
|
int bearer, int count, int direction);
|
||||||
|
|
||||||
|
void nr_pdcp_integrity_nia1_free_integrity(void *integrity_context);
|
||||||
|
|
||||||
|
#endif /* _NR_PDCP_INTEGRITY_NIA1_H_ */
|
||||||
@@ -215,6 +215,41 @@ void handle_nr_ulsch(NR_UL_IND_t *UL_info)
|
|||||||
UL_info->crc_ind.number_crcs = 0;
|
UL_info->crc_ind.number_crcs = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void handle_nr_srs(NR_UL_IND_t *UL_info) {
|
||||||
|
|
||||||
|
if(NFAPI_MODE == NFAPI_MODE_PNF) {
|
||||||
|
if (UL_info->srs_ind.number_of_pdus > 0) {
|
||||||
|
LOG_D(PHY,"PNF Sending UL_info->srs_ind.number_of_pdus: %d, SFN/SF:%d.%d \n",
|
||||||
|
UL_info->srs_ind.number_of_pdus, UL_info->frame, UL_info->slot);
|
||||||
|
oai_nfapi_nr_srs_indication(&UL_info->srs_ind);
|
||||||
|
UL_info->srs_ind.number_of_pdus = 0;
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
const module_id_t module_id = UL_info->module_id;
|
||||||
|
const frame_t frame = UL_info->srs_ind.sfn;
|
||||||
|
const sub_frame_t slot = UL_info->srs_ind.slot;
|
||||||
|
const int num_srs = UL_info->srs_ind.number_of_pdus;
|
||||||
|
const nfapi_nr_srs_indication_pdu_t *srs_list = UL_info->srs_ind.pdu_list;
|
||||||
|
|
||||||
|
for (int i = 0; i < num_srs; i++) {
|
||||||
|
const nfapi_nr_srs_indication_pdu_t *srs_ind = &srs_list[i];
|
||||||
|
LOG_D(NR_PHY, "(%d.%d) UL_info->srs_ind.pdu_list[%d].rnti: 0x%04x\n", frame, slot, i, srs_ind->rnti);
|
||||||
|
handle_nr_srs_measurements(module_id,
|
||||||
|
frame,
|
||||||
|
slot,
|
||||||
|
srs_ind->rnti,
|
||||||
|
srs_ind->timing_advance,
|
||||||
|
srs_ind->num_symbols,
|
||||||
|
srs_ind->wide_band_snr,
|
||||||
|
srs_ind->num_reported_symbols,
|
||||||
|
srs_ind->reported_symbol_list);
|
||||||
|
}
|
||||||
|
|
||||||
|
UL_info->srs_ind.number_of_pdus = 0;
|
||||||
|
}
|
||||||
|
|
||||||
static void free_unqueued_nfapi_indications(nfapi_nr_rach_indication_t *rach_ind,
|
static void free_unqueued_nfapi_indications(nfapi_nr_rach_indication_t *rach_ind,
|
||||||
nfapi_nr_uci_indication_t *uci_ind,
|
nfapi_nr_uci_indication_t *uci_ind,
|
||||||
nfapi_nr_rx_data_indication_t *rx_ind,
|
nfapi_nr_rx_data_indication_t *rx_ind,
|
||||||
@@ -431,6 +466,7 @@ void NR_UL_indication(NR_UL_IND_t *UL_info) {
|
|||||||
// clear UL DCI prior to handling ULSCH
|
// clear UL DCI prior to handling ULSCH
|
||||||
mac->UL_dci_req[CC_id].numPdus = 0;
|
mac->UL_dci_req[CC_id].numPdus = 0;
|
||||||
handle_nr_ulsch(UL_info);
|
handle_nr_ulsch(UL_info);
|
||||||
|
handle_nr_srs(UL_info);
|
||||||
|
|
||||||
if (get_softmodem_params()->emulate_l1) {
|
if (get_softmodem_params()->emulate_l1) {
|
||||||
free_unqueued_nfapi_indications(rach_ind, uci_ind, rx_ind, crc_ind);
|
free_unqueued_nfapi_indications(rach_ind, uci_ind, rx_ind, crc_ind);
|
||||||
|
|||||||
+33
-91
@@ -976,28 +976,24 @@ rrc_eNB_free_UE(
|
|||||||
put_UE_in_freelist(enb_mod_idP, rnti, 1);
|
put_UE_in_freelist(enb_mod_idP, rnti, 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
void remove_UE_from_freelist(module_id_t mod_id, rnti_t rnti) {
|
|
||||||
eNB_MAC_INST *eNB_MAC = RC.mac[mod_id];
|
|
||||||
pthread_mutex_lock(&lock_ue_freelist);
|
|
||||||
UE_free_list_t *free_list = &eNB_MAC->UE_free_list;
|
|
||||||
free_list->UE_free_ctrl[free_list->head_freelist].rnti = 0;
|
|
||||||
free_list->head_freelist = (free_list->head_freelist + 1) % (NUMBER_OF_UE_MAX+1);
|
|
||||||
free_list->num_UEs--;
|
|
||||||
pthread_mutex_unlock(&lock_ue_freelist);
|
|
||||||
}
|
|
||||||
|
|
||||||
void put_UE_in_freelist(module_id_t mod_id, rnti_t rnti, bool removeFlag) {
|
void put_UE_in_freelist(module_id_t mod_id, rnti_t rnti, bool removeFlag) {
|
||||||
UE_free_list_t *free_list = NULL;
|
|
||||||
eNB_MAC_INST *eNB_MAC = RC.mac[mod_id];
|
eNB_MAC_INST *eNB_MAC = RC.mac[mod_id];
|
||||||
pthread_mutex_lock(&lock_ue_freelist);
|
pthread_mutex_lock(&lock_ue_freelist);
|
||||||
free_list = &eNB_MAC->UE_free_list;
|
LOG_I(PHY,"add ue %d in fre list, context flag: %d\n", rnti, removeFlag);
|
||||||
free_list->UE_free_ctrl[free_list->tail_freelist].rnti = rnti;
|
int i;
|
||||||
free_list->UE_free_ctrl[free_list->tail_freelist].removeContextFlg = removeFlag;
|
for (i=0; i < sizeofArray(eNB_MAC->UE_free_ctrl); i++)
|
||||||
free_list->UE_free_ctrl[free_list->tail_freelist].raFlag = 0;
|
if (eNB_MAC->UE_free_ctrl[i].rnti == 0)
|
||||||
free_list->num_UEs++;
|
break;
|
||||||
|
if (i==sizeofArray(eNB_MAC->UE_free_ctrl)) {
|
||||||
|
LOG_E(PHY,"List of UE to free is full\n");
|
||||||
|
pthread_mutex_unlock(&lock_ue_freelist);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
eNB_MAC->UE_free_ctrl[i].rnti = rnti;
|
||||||
|
eNB_MAC->UE_free_ctrl[i].removeContextFlg = removeFlag;
|
||||||
|
eNB_MAC->UE_free_ctrl[i].raFlag = 0;
|
||||||
eNB_MAC->UE_release_req.ue_release_request_body.ue_release_request_TLVs_list[eNB_MAC->UE_release_req.ue_release_request_body.number_of_TLVs].rnti = rnti;
|
eNB_MAC->UE_release_req.ue_release_request_body.ue_release_request_TLVs_list[eNB_MAC->UE_release_req.ue_release_request_body.number_of_TLVs].rnti = rnti;
|
||||||
eNB_MAC->UE_release_req.ue_release_request_body.number_of_TLVs++;
|
eNB_MAC->UE_release_req.ue_release_request_body.number_of_TLVs++;
|
||||||
free_list->tail_freelist = (free_list->tail_freelist + 1) % (NUMBER_OF_UE_MAX+1);
|
|
||||||
pthread_mutex_unlock(&lock_ue_freelist);
|
pthread_mutex_unlock(&lock_ue_freelist);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1007,104 +1003,47 @@ extern void clean_eNb_ulsch(LTE_eNB_ULSCH_t *ulsch);
|
|||||||
extern void clean_eNb_dlsch(LTE_eNB_DLSCH_t *dlsch);
|
extern void clean_eNb_dlsch(LTE_eNB_DLSCH_t *dlsch);
|
||||||
|
|
||||||
void release_UE_in_freeList(module_id_t mod_id) {
|
void release_UE_in_freeList(module_id_t mod_id) {
|
||||||
int i, j, CC_id, pdu_number;
|
|
||||||
protocol_ctxt_t ctxt;
|
|
||||||
nfapi_ul_config_request_body_t *ul_req_tmp = NULL;
|
|
||||||
PHY_VARS_eNB *eNB_PHY = NULL;
|
PHY_VARS_eNB *eNB_PHY = NULL;
|
||||||
struct rrc_eNB_ue_context_s *ue_context_pP = NULL;
|
|
||||||
eNB_MAC_INST *eNB_MAC = RC.mac[mod_id];
|
eNB_MAC_INST *eNB_MAC = RC.mac[mod_id];
|
||||||
bool remove_UEContext;
|
|
||||||
rnti_t rnti;
|
|
||||||
int head, tail, ue_num;
|
|
||||||
pthread_mutex_lock(&lock_ue_freelist);
|
pthread_mutex_lock(&lock_ue_freelist);
|
||||||
head = eNB_MAC->UE_free_list.head_freelist;
|
|
||||||
tail = eNB_MAC->UE_free_list.tail_freelist;
|
|
||||||
|
|
||||||
if(head == tail) {
|
for(int ue_num = 0; ue_num < sizeofArray(eNB_MAC->UE_free_ctrl) ; ue_num++) {
|
||||||
pthread_mutex_unlock(&lock_ue_freelist);
|
rnti_t rnti = eNB_MAC->UE_free_ctrl[ue_num].rnti;
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if(tail < head) {
|
|
||||||
tail = head + eNB_MAC->UE_free_list.num_UEs;
|
|
||||||
}
|
|
||||||
|
|
||||||
pthread_mutex_unlock(&lock_ue_freelist);
|
|
||||||
|
|
||||||
for(ue_num = head; ue_num < tail; ue_num++) {
|
|
||||||
ue_num = ue_num % (NUMBER_OF_UE_MAX+1);
|
|
||||||
rnti = eNB_MAC->UE_free_list.UE_free_ctrl[ue_num].rnti;
|
|
||||||
|
|
||||||
if(rnti != 0) {
|
if(rnti != 0) {
|
||||||
remove_UEContext = eNB_MAC->UE_free_list.UE_free_ctrl[ue_num].removeContextFlg;
|
protocol_ctxt_t ctxt;
|
||||||
PROTOCOL_CTXT_SET_BY_MODULE_ID(&ctxt, mod_id, ENB_FLAG_YES, rnti, 0, 0,mod_id);
|
PROTOCOL_CTXT_SET_BY_MODULE_ID(&ctxt, mod_id, ENB_FLAG_YES, rnti, 0, 0,mod_id);
|
||||||
|
|
||||||
for (CC_id = 0; CC_id < MAX_NUM_CCs; CC_id++) {
|
for (int CC_id = 0; CC_id < MAX_NUM_CCs; CC_id++) {
|
||||||
eNB_PHY = RC.eNB[mod_id][CC_id];
|
eNB_PHY = RC.eNB[mod_id][CC_id];
|
||||||
int id;
|
int id;
|
||||||
// clean ULSCH entries for rnti
|
// clean ULSCH entries for rnti
|
||||||
id = find_ulsch(rnti,eNB_PHY,eNB_MAC->UE_free_list.UE_free_ctrl[ue_num].raFlag ? SEARCH_EXIST_RA : SEARCH_EXIST);
|
id = find_ulsch(rnti,eNB_PHY,eNB_MAC->UE_free_ctrl[ue_num].raFlag ? SEARCH_EXIST_RA : SEARCH_EXIST);
|
||||||
|
|
||||||
if (id>=0) clean_eNb_ulsch(eNB_PHY->ulsch[id]);
|
if (id>=0) clean_eNb_ulsch(eNB_PHY->ulsch[id]);
|
||||||
|
|
||||||
// clean DLSCH entries for rnti
|
// clean DLSCH entries for rnti
|
||||||
id = find_dlsch(rnti,eNB_PHY,eNB_MAC->UE_free_list.UE_free_ctrl[ue_num].raFlag ? SEARCH_EXIST_RA : SEARCH_EXIST);
|
id = find_dlsch(rnti,eNB_PHY,eNB_MAC->UE_free_ctrl[ue_num].raFlag ? SEARCH_EXIST_RA : SEARCH_EXIST);
|
||||||
|
|
||||||
if (id>=0) clean_eNb_dlsch(eNB_PHY->dlsch[id][0]);
|
if (id>=0) clean_eNb_dlsch(eNB_PHY->dlsch[id][0]);
|
||||||
|
|
||||||
// clean UCI entries for rnti
|
// clean UCI entries for rnti
|
||||||
for (i=0; i<NUMBER_OF_UCI_MAX; i++) {
|
for (int i=0; i<NUMBER_OF_UCI_MAX; i++) {
|
||||||
if(eNB_PHY->uci_vars[i].rnti == rnti) {
|
if(eNB_PHY->uci_vars[i].rnti == rnti) {
|
||||||
LOG_I(MAC, "clean eNb uci_vars[%d] UE %x \n",i, rnti);
|
LOG_I(MAC, "clean eNb uci_vars[%d] UE %x \n",i, rnti);
|
||||||
memset(&eNB_PHY->uci_vars[i],0,sizeof(LTE_eNB_UCI));
|
memset(&eNB_PHY->uci_vars[i],0,sizeof(LTE_eNB_UCI));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
for (i=0; i<MAX_MOBILES_PER_ENB; i++) {
|
|
||||||
ulsch = eNB_PHY->ulsch[i];
|
|
||||||
|
|
||||||
if((ulsch != NULL) && (ulsch->rnti == rnti)) {
|
|
||||||
void clean_eNb_ulsch(LTE_eNB_ULSCH_t *ulsch);
|
|
||||||
LOG_I(RRC, "clean_eNb_ulsch ulsch[%d] UE %x\n", i, rnti);
|
|
||||||
clean_eNb_ulsch(ulsch);
|
|
||||||
}
|
|
||||||
|
|
||||||
dlsch = eNB_PHY->dlsch[i][0];
|
|
||||||
|
|
||||||
if((dlsch != NULL) && (dlsch->rnti == rnti)) {
|
|
||||||
void clean_eNb_dlsch(LTE_eNB_DLSCH_t *dlsch);
|
|
||||||
LOG_I(RRC, "clean_eNb_dlsch dlsch[%d] UE %x \n", i, rnti);
|
|
||||||
clean_eNb_dlsch(dlsch);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
ulsch = eNB_PHY->ulsch[i];
|
|
||||||
|
|
||||||
if((ulsch != NULL) && (ulsch->rnti == rnti)) {
|
|
||||||
void clean_eNb_ulsch(LTE_eNB_ULSCH_t *ulsch);
|
|
||||||
LOG_I(RRC, "clean_eNb_ulsch ulsch[%d] UE %x\n", i, rnti);
|
|
||||||
clean_eNb_ulsch(ulsch);
|
|
||||||
}
|
|
||||||
|
|
||||||
for (i=0; i<NUMBER_OF_UCI_MAX; i++) {
|
|
||||||
if(eNB_PHY->uci_vars[i].rnti == rnti) {
|
|
||||||
LOG_I(MAC, "clean eNb uci_vars[%d] UE %x \n",i, rnti);
|
|
||||||
memset(&eNB_PHY->uci_vars[i],0,sizeof(LTE_eNB_UCI));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
*/
|
|
||||||
|
|
||||||
if (flexran_agent_get_rrc_xface(mod_id)) {
|
if (flexran_agent_get_rrc_xface(mod_id)) {
|
||||||
flexran_agent_get_rrc_xface(mod_id)->flexran_agent_notify_ue_state_change(
|
flexran_agent_get_rrc_xface(mod_id)->flexran_agent_notify_ue_state_change( mod_id, rnti, PROTOCOL__FLEX_UE_STATE_CHANGE_TYPE__FLUESC_DEACTIVATED);
|
||||||
mod_id, rnti, PROTOCOL__FLEX_UE_STATE_CHANGE_TYPE__FLUESC_DEACTIVATED);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
for(j = 0; j < 10; j++) {
|
for(int j = 0; j < 10; j++) {
|
||||||
ul_req_tmp = &eNB_MAC->UL_req_tmp[CC_id][j].ul_config_request_body;
|
nfapi_ul_config_request_body_t *ul_req_tmp = &eNB_MAC->UL_req_tmp[CC_id][j].ul_config_request_body;
|
||||||
|
|
||||||
if(ul_req_tmp) {
|
if(ul_req_tmp) {
|
||||||
pdu_number = ul_req_tmp->number_of_pdus;
|
int pdu_number = ul_req_tmp->number_of_pdus;
|
||||||
|
|
||||||
for(int pdu_index = pdu_number-1; pdu_index >= 0; pdu_index--) {
|
for(int pdu_index = pdu_number-1; pdu_index >= 0; pdu_index--) {
|
||||||
if((ul_req_tmp->ul_config_pdu_list[pdu_index].ulsch_pdu.ulsch_pdu_rel8.rnti == rnti) ||
|
if((ul_req_tmp->ul_config_pdu_list[pdu_index].ulsch_pdu.ulsch_pdu_rel8.rnti == rnti) ||
|
||||||
@@ -1126,7 +1065,8 @@ void release_UE_in_freeList(module_id_t mod_id) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (!NODE_IS_CU(RC.rrc[mod_id]->node_type)) {
|
if (!NODE_IS_CU(RC.rrc[mod_id]->node_type)) {
|
||||||
rrc_mac_remove_ue(mod_id,rnti);
|
if (!eNB_MAC->UE_free_ctrl[ue_num].raFlag)
|
||||||
|
rrc_mac_remove_ue(mod_id,rnti);
|
||||||
rrc_rlc_remove_ue(&ctxt);
|
rrc_rlc_remove_ue(&ctxt);
|
||||||
pdcp_remove_UE(&ctxt);
|
pdcp_remove_UE(&ctxt);
|
||||||
} else {
|
} else {
|
||||||
@@ -1139,19 +1079,20 @@ void release_UE_in_freeList(module_id_t mod_id) {
|
|||||||
itti_send_msg_to_task(TASK_CU_F1, mod_id, m);
|
itti_send_msg_to_task(TASK_CU_F1, mod_id, m);
|
||||||
}
|
}
|
||||||
|
|
||||||
if(remove_UEContext) {
|
if(eNB_MAC->UE_free_ctrl[ue_num].removeContextFlg) {
|
||||||
ue_context_pP = rrc_eNB_get_ue_context(RC.rrc[mod_id],rnti);
|
struct rrc_eNB_ue_context_s *ue_context_pP = rrc_eNB_get_ue_context(RC.rrc[mod_id],rnti);
|
||||||
|
|
||||||
if(ue_context_pP) {
|
if(ue_context_pP) {
|
||||||
|
LOG_I(PHY, "remove RNTI %04x\n", rnti);
|
||||||
rrc_eNB_remove_ue_context(&ctxt,RC.rrc[mod_id],
|
rrc_eNB_remove_ue_context(&ctxt,RC.rrc[mod_id],
|
||||||
(struct rrc_eNB_ue_context_s *) ue_context_pP);
|
(struct rrc_eNB_ue_context_s *) ue_context_pP);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
LOG_I(RRC, "[release_UE_in_freeList] remove UE %x from freeList\n", rnti);
|
LOG_I(RRC, "[release_UE_in_freeList] remove UE %x from freeList ra context: %d\n", rnti, eNB_MAC->UE_free_ctrl[ue_num].raFlag);
|
||||||
remove_UE_from_freelist(mod_id, rnti);
|
eNB_MAC->UE_free_ctrl[ue_num].rnti = 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
pthread_mutex_unlock(&lock_ue_freelist);
|
||||||
}
|
}
|
||||||
|
|
||||||
int rrc_eNB_previous_SRB2(rrc_eNB_ue_context_t *ue_context_pP) {
|
int rrc_eNB_previous_SRB2(rrc_eNB_ue_context_t *ue_context_pP) {
|
||||||
@@ -7246,6 +7187,7 @@ rrc_eNB_decode_ccch(
|
|||||||
LOG_I(RRC," S-TMSI exists, ue_context_p %p, old rnti %x => %x\n",ue_context_p,ue_context_p->ue_context.rnti,ctxt_pP->rnti);
|
LOG_I(RRC," S-TMSI exists, ue_context_p %p, old rnti %x => %x\n",ue_context_p,ue_context_p->ue_context.rnti,ctxt_pP->rnti);
|
||||||
|
|
||||||
if (!NODE_IS_CU(RC.rrc[ctxt_pP->module_id]->node_type)) {
|
if (!NODE_IS_CU(RC.rrc[ctxt_pP->module_id]->node_type)) {
|
||||||
|
LOG_I(PHY, "remove RNTI %04x\n", ue_context_p->ue_context.rnti);
|
||||||
rrc_mac_remove_ue(ctxt_pP->module_id, ue_context_p->ue_context.rnti);
|
rrc_mac_remove_ue(ctxt_pP->module_id, ue_context_p->ue_context.rnti);
|
||||||
} else {
|
} else {
|
||||||
MessageDef *m = itti_alloc_new_message(TASK_RRC_ENB, 0, F1AP_UE_CONTEXT_RELEASE_CMD);
|
MessageDef *m = itti_alloc_new_message(TASK_RRC_ENB, 0, F1AP_UE_CONTEXT_RELEASE_CMD);
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user