Merge branch 'integration_2023_w40' into 'develop'
integration_2023_w40 See merge request oai/openairinterface5g!2381 * !2345 fix bug for IE cause in pdu session accept * !2361 Fix Msg3 MAC CE C-RNTI * !2371 fix(ci): printing the warning and error lines for CI purposes * !2374 Fix SSB ARFCN: wrong ARFCNs in FDD * !2379 fix the selection of DCI candidates at UE * !2369 Add bwp_size and bwp_start fields to CSI_RS PDU struct at NR UE * !2349 E2AP Version 1,2,3 and KPM version 2, 3 * !2375 increase the max fd of rfsim, that have been shorten to tightly for cpu saving * !2367 chore(ci): improve GitLab <-> Jenkins contributor experience * !2378 F1AP: correct message handling * !2370 NR PDCP RB suspend * !2107 Compute RI based on SRS up to 4 * !2339 PUCCH power computation * !2382 Remove dead code in NR UE * !2229 PUSCH LLR 128/256 SIMDe routines for ARM/x86
This commit is contained in:
@@ -289,6 +289,15 @@ add_definitions(-DHAVE_NETINET_IN_H)
|
||||
set(E2_AGENT "OFF" CACHE STRING "O-RAN-compliant E2 Agent")
|
||||
set_property(CACHE E2_AGENT PROPERTY STRINGS "ON" "OFF")
|
||||
|
||||
set(E2AP_VERSION "E2AP_V2" CACHE STRING "E2AP version")
|
||||
set_property(CACHE E2AP_VERSION PROPERTY STRINGS "E2AP_V1" "E2AP_V2" "E2AP_V3")
|
||||
message(STATUS "Selected E2AP_VERSION: ${E2AP_VERSION}")
|
||||
|
||||
set(KPM_VERSION "KPM_V2" CACHE STRING "The KPM SM version to use")
|
||||
set_property(CACHE KPM_VERSION PROPERTY STRINGS "KPM_V2" "KPM_V3")
|
||||
message(STATUS "Selected KPM Version: ${KPM_VERSION}")
|
||||
|
||||
|
||||
##################################################
|
||||
# ASN.1 grammar C code generation & dependencies #
|
||||
##################################################
|
||||
@@ -1409,9 +1418,11 @@ add_library(L2
|
||||
)
|
||||
target_link_libraries(L2 PRIVATE x2ap s1ap lte_rrc m2ap)
|
||||
target_link_libraries(L2 PRIVATE asn1_lte_rrc_hdrs asn1_nr_rrc_hdrs)
|
||||
|
||||
if(E2_AGENT)
|
||||
target_link_libraries(L2 PUBLIC e2_agent e2_ran_func)
|
||||
target_compile_definitions(L2 PRIVATE E2_AGENT)
|
||||
target_compile_definitions(L2 PRIVATE ${E2AP_VERSION} ${KPM_VERSION})
|
||||
endif()
|
||||
|
||||
|
||||
@@ -1443,6 +1454,7 @@ target_link_libraries(e1_pdcp_if PRIVATE asn1_nr_rrc_hdrs asn1_lte_rrc_hdrs)
|
||||
target_link_libraries(L2_NR PRIVATE f1ap x2ap s1ap ngap nr_rrc e1ap nr_rlc)
|
||||
if(E2_AGENT)
|
||||
target_link_libraries(L2_NR PUBLIC e2_agent e2_ran_func)
|
||||
target_compile_definitions(L2_NR PRIVATE ${E2AP_VERSION} ${KPM_VERSION})
|
||||
target_compile_definitions(L2_NR PRIVATE E2_AGENT)
|
||||
endif()
|
||||
|
||||
@@ -1965,6 +1977,7 @@ target_link_libraries(lte-softmodem PRIVATE asn1_nr_rrc_hdrs asn1_lte_rrc_hdrs)
|
||||
|
||||
if(E2_AGENT)
|
||||
target_compile_definitions(lte-softmodem PRIVATE E2_AGENT)
|
||||
target_compile_definitions(lte-softmodem PRIVATE ${E2AP_VERSION} ${KPM_VERSION})
|
||||
endif()
|
||||
|
||||
add_executable(oairu
|
||||
@@ -2061,6 +2074,11 @@ target_link_libraries(nr-softmodem PRIVATE
|
||||
target_link_libraries(nr-softmodem PRIVATE pthread m CONFIG_LIB rt sctp)
|
||||
target_link_libraries(nr-softmodem PRIVATE ${T_LIB})
|
||||
target_link_libraries(nr-softmodem PRIVATE asn1_nr_rrc_hdrs asn1_lte_rrc_hdrs)
|
||||
target_link_libraries(nr-softmodem PRIVATE asn1_nr_rrc_hdrs asn1_lte_rrc_hdrs)
|
||||
if(E2_AGENT)
|
||||
target_compile_definitions(nr-softmodem PRIVATE ${E2AP_VERSION} ${KPM_VERSION})
|
||||
endif()
|
||||
|
||||
|
||||
add_dependencies(nr-softmodem ldpc_orig ldpc_optim ldpc_optim8seg ldpc)
|
||||
|
||||
|
||||
@@ -31,6 +31,9 @@ def do5Gtest = false
|
||||
//
|
||||
def gitCommitAuthorEmailAddr
|
||||
|
||||
// list of failing stages
|
||||
def failingStages = ""
|
||||
|
||||
pipeline {
|
||||
agent {
|
||||
label nodeExecutor
|
||||
@@ -130,12 +133,13 @@ pipeline {
|
||||
post {
|
||||
always {
|
||||
script {
|
||||
finalizeSlaveJob('RAN-Ubuntu18-Image-Builder')
|
||||
testBullet = finalizeSlaveJob('RAN-Ubuntu18-Image-Builder')
|
||||
}
|
||||
}
|
||||
failure {
|
||||
script {
|
||||
currentBuild.result = 'FAILURE'
|
||||
failingStages += testBullet
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -149,12 +153,13 @@ pipeline {
|
||||
post {
|
||||
always {
|
||||
script {
|
||||
finalizeSlaveJob('RAN-RHEL8-Cluster-Image-Builder')
|
||||
testBullet = finalizeSlaveJob('RAN-RHEL8-Cluster-Image-Builder')
|
||||
}
|
||||
}
|
||||
failure {
|
||||
script {
|
||||
currentBuild.result = 'FAILURE'
|
||||
failingStages += testBullet
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -168,12 +173,13 @@ pipeline {
|
||||
post {
|
||||
always {
|
||||
script {
|
||||
finalizeSlaveJob('RAN-cppcheck')
|
||||
testBullet = finalizeSlaveJob('RAN-cppcheck')
|
||||
}
|
||||
}
|
||||
failure {
|
||||
script {
|
||||
currentBuild.result = 'FAILURE'
|
||||
failingStages += testBullet
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -193,12 +199,13 @@ pipeline {
|
||||
post {
|
||||
always {
|
||||
script {
|
||||
finalizeSlaveJob('RAN-PhySim-Cluster')
|
||||
testBullet = finalizeSlaveJob('RAN-PhySim-Cluster')
|
||||
}
|
||||
}
|
||||
failure {
|
||||
script {
|
||||
currentBuild.result = 'FAILURE'
|
||||
failingStages += testBullet
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -213,12 +220,13 @@ pipeline {
|
||||
post {
|
||||
always {
|
||||
script {
|
||||
finalizeSlaveJob('RAN-RF-Sim-Test-4G')
|
||||
testBullet = finalizeSlaveJob('RAN-RF-Sim-Test-4G')
|
||||
}
|
||||
}
|
||||
failure {
|
||||
script {
|
||||
currentBuild.result = 'FAILURE'
|
||||
failingStages += testBullet
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -233,12 +241,13 @@ pipeline {
|
||||
post {
|
||||
always {
|
||||
script {
|
||||
finalizeSlaveJob('RAN-RF-Sim-Test-5G')
|
||||
testBullet = finalizeSlaveJob('RAN-RF-Sim-Test-5G')
|
||||
}
|
||||
}
|
||||
failure {
|
||||
script {
|
||||
currentBuild.result = 'FAILURE'
|
||||
failingStages += testBullet
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -253,12 +262,13 @@ pipeline {
|
||||
post {
|
||||
always {
|
||||
script {
|
||||
finalizeSlaveJob('RAN-L2-Sim-Test-4G')
|
||||
testBullet = finalizeSlaveJob('RAN-L2-Sim-Test-4G')
|
||||
}
|
||||
}
|
||||
failure {
|
||||
script {
|
||||
currentBuild.result = 'FAILURE'
|
||||
failingStages += testBullet
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -273,12 +283,13 @@ pipeline {
|
||||
post {
|
||||
always {
|
||||
script {
|
||||
finalizeSlaveJob('RAN-L2-Sim-Test-5G')
|
||||
testBullet = finalizeSlaveJob('RAN-L2-Sim-Test-5G')
|
||||
}
|
||||
}
|
||||
failure {
|
||||
script {
|
||||
currentBuild.result = 'FAILURE'
|
||||
failingStages += testBullet
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -293,12 +304,13 @@ pipeline {
|
||||
post {
|
||||
always {
|
||||
script {
|
||||
finalizeSlaveJob('RAN-LTE-FDD-LTEBOX-Container')
|
||||
testBullet = finalizeSlaveJob('RAN-LTE-FDD-LTEBOX-Container')
|
||||
}
|
||||
}
|
||||
failure {
|
||||
script {
|
||||
currentBuild.result = 'FAILURE'
|
||||
failingStages += testBullet
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -314,12 +326,13 @@ pipeline {
|
||||
post {
|
||||
always {
|
||||
script {
|
||||
finalizeSlaveJob('RAN-LTE-FDD-OAIUE-OAICN4G-Container')
|
||||
testBullet = finalizeSlaveJob('RAN-LTE-FDD-OAIUE-OAICN4G-Container')
|
||||
}
|
||||
}
|
||||
failure {
|
||||
script {
|
||||
currentBuild.result = 'FAILURE'
|
||||
failingStages += testBullet
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -334,12 +347,13 @@ pipeline {
|
||||
post {
|
||||
always {
|
||||
script {
|
||||
finalizeSlaveJob('RAN-LTE-TDD-LTEBOX-Container')
|
||||
testBullet = finalizeSlaveJob('RAN-LTE-TDD-LTEBOX-Container')
|
||||
}
|
||||
}
|
||||
failure {
|
||||
script {
|
||||
currentBuild.result = 'FAILURE'
|
||||
failingStages += testBullet
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -354,12 +368,13 @@ pipeline {
|
||||
post {
|
||||
always {
|
||||
script {
|
||||
finalizeSlaveJob('RAN-NSA-B200-Module-LTEBOX-Container')
|
||||
testBullet = finalizeSlaveJob('RAN-NSA-B200-Module-LTEBOX-Container')
|
||||
}
|
||||
}
|
||||
failure {
|
||||
script {
|
||||
currentBuild.result = 'FAILURE'
|
||||
failingStages += testBullet
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -374,12 +389,13 @@ pipeline {
|
||||
post {
|
||||
always {
|
||||
script {
|
||||
finalizeSlaveJob('RAN-SA-B200-Module-SABOX-Container')
|
||||
testBullet = finalizeSlaveJob('RAN-SA-B200-Module-SABOX-Container')
|
||||
}
|
||||
}
|
||||
failure {
|
||||
script {
|
||||
currentBuild.result = 'FAILURE'
|
||||
failingStages += testBullet
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -394,12 +410,13 @@ pipeline {
|
||||
post {
|
||||
always {
|
||||
script {
|
||||
finalizeSlaveJob('RAN-gNB-N300-Timing-Phytest-LDPC')
|
||||
testBullet = finalizeSlaveJob('RAN-gNB-N300-Timing-Phytest-LDPC')
|
||||
}
|
||||
}
|
||||
failure {
|
||||
script {
|
||||
currentBuild.result = 'FAILURE'
|
||||
failingStages += testBullet
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -414,12 +431,13 @@ pipeline {
|
||||
post {
|
||||
always {
|
||||
script {
|
||||
finalizeSlaveJob('RAN-LTE-TDD-2x2-Container')
|
||||
testBullet = finalizeSlaveJob('RAN-LTE-TDD-2x2-Container')
|
||||
}
|
||||
}
|
||||
failure {
|
||||
script {
|
||||
currentBuild.result = 'FAILURE'
|
||||
failingStages += testBullet
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -434,12 +452,13 @@ pipeline {
|
||||
post {
|
||||
always {
|
||||
script {
|
||||
finalizeSlaveJob('RAN-SA-AW2S-CN5G')
|
||||
testBullet = finalizeSlaveJob('RAN-SA-AW2S-CN5G')
|
||||
}
|
||||
}
|
||||
failure {
|
||||
script {
|
||||
currentBuild.result = 'FAILURE'
|
||||
failingStages += testBullet
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -454,12 +473,13 @@ pipeline {
|
||||
post {
|
||||
always {
|
||||
script {
|
||||
finalizeSlaveJob('RAN-Interop-F1')
|
||||
testBullet = finalizeSlaveJob('RAN-Interop-F1')
|
||||
}
|
||||
}
|
||||
failure {
|
||||
script {
|
||||
currentBuild.result = 'FAILURE'
|
||||
failingStages += testBullet
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -474,12 +494,13 @@ pipeline {
|
||||
post {
|
||||
always {
|
||||
script {
|
||||
finalizeSlaveJob('OAI-CN5G-COTS-UE-Test')
|
||||
testBullet = finalizeSlaveJob('OAI-CN5G-COTS-UE-Test')
|
||||
}
|
||||
}
|
||||
failure {
|
||||
script {
|
||||
currentBuild.result = 'FAILURE'
|
||||
failingStages += testBullet
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -494,12 +515,13 @@ pipeline {
|
||||
post {
|
||||
always {
|
||||
script {
|
||||
finalizeSlaveJob('RAN-SA-OAIUE-CN5G')
|
||||
testBullet = finalizeSlaveJob('RAN-SA-OAIUE-CN5G')
|
||||
}
|
||||
}
|
||||
failure {
|
||||
script {
|
||||
currentBuild.result = 'FAILURE'
|
||||
failingStages += testBullet
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -518,6 +540,7 @@ pipeline {
|
||||
script {
|
||||
echo "Push to Docker-Hub KO"
|
||||
currentBuild.result = 'FAILURE'
|
||||
failingStages += '\n * RAN-DockerHub-Push'
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -541,7 +564,8 @@ pipeline {
|
||||
script {
|
||||
def message = "OAI " + JOB_NAME + " build (" + BUILD_ID + "): failed (" + BUILD_URL + ")"
|
||||
if ("MERGE".equals(env.gitlabActionType)) {
|
||||
addGitLabMRComment comment: message
|
||||
def fullMessage = message + '\n\nList of failing test stages:' + failingStages
|
||||
addGitLabMRComment comment: fullMessage
|
||||
def message2 = message + " -- MergeRequest #" + env.gitlabMergeRequestIid + " (" + env.gitlabMergeRequestTitle + ")"
|
||||
sendSocialMediaMessage('ci-enb', 'danger', message2)
|
||||
} else {
|
||||
@@ -651,6 +675,7 @@ def finalizeSlaveJob(jobName) {
|
||||
} else {
|
||||
fileName = "test_results-${jobName}.html"
|
||||
}
|
||||
artifactUrl = BUILD_URL
|
||||
if (!fileExists(fileName)) {
|
||||
copyArtifacts(projectName: jobName,
|
||||
filter: 'test_results*.html',
|
||||
@@ -658,8 +683,13 @@ def finalizeSlaveJob(jobName) {
|
||||
if (fileExists(fileName)) {
|
||||
sh "sed -i -e 's#TEMPLATE_BUILD_TIME#${JOB_TIMESTAMP}#' ${fileName}"
|
||||
archiveArtifacts artifacts: fileName
|
||||
// BUILD_URL is like http://server:port/jenkins/job/foo/15/
|
||||
// no need to add a prefixed '/'
|
||||
artifactUrl += 'artifact/' + fileName
|
||||
}
|
||||
}
|
||||
artifactUrl = "\n * [${jobName}](${artifactUrl})"
|
||||
return artifactUrl
|
||||
}
|
||||
|
||||
// Abstraction function to send social media messages:
|
||||
|
||||
@@ -67,6 +67,13 @@ pipeline {
|
||||
}
|
||||
|
||||
stages {
|
||||
stage("Build Init") {
|
||||
steps {
|
||||
// update the build name and description
|
||||
buildName "${params.eNB_MR}"
|
||||
buildDescription "Branch : ${params.eNB_Branch}"
|
||||
}
|
||||
}
|
||||
stage ('Verify Parameters') {
|
||||
steps {
|
||||
script {
|
||||
|
||||
@@ -61,6 +61,13 @@ pipeline {
|
||||
}
|
||||
|
||||
stages {
|
||||
stage("Build Init") {
|
||||
steps {
|
||||
// update the build name and description
|
||||
buildName "${params.eNB_MR}"
|
||||
buildDescription "Branch : ${params.eNB_Branch}"
|
||||
}
|
||||
}
|
||||
stage ('Verify Parameters') {
|
||||
steps {
|
||||
script {
|
||||
|
||||
@@ -61,6 +61,13 @@ pipeline {
|
||||
}
|
||||
|
||||
stages {
|
||||
stage("Build Init") {
|
||||
steps {
|
||||
// update the build name and description
|
||||
buildName "${params.eNB_MR}"
|
||||
buildDescription "Branch : ${params.eNB_Branch}"
|
||||
}
|
||||
}
|
||||
stage ('Verify Parameters') {
|
||||
steps {
|
||||
script {
|
||||
|
||||
@@ -66,6 +66,13 @@ pipeline {
|
||||
}
|
||||
|
||||
stages {
|
||||
stage("Build Init") {
|
||||
steps {
|
||||
// update the build name and description
|
||||
buildName "${params.eNB_MR}"
|
||||
buildDescription "Branch : ${params.eNB_Branch}"
|
||||
}
|
||||
}
|
||||
stage ("Verify Parameters") {
|
||||
steps {
|
||||
script {
|
||||
|
||||
@@ -54,6 +54,13 @@ pipeline {
|
||||
lock(extra: lockResources)
|
||||
}
|
||||
stages {
|
||||
stage("Build Init") {
|
||||
steps {
|
||||
// update the build name and description
|
||||
buildName "${params.eNB_MR}"
|
||||
buildDescription "Branch : ${params.eNB_Branch}"
|
||||
}
|
||||
}
|
||||
stage ("Verify Parameters") {
|
||||
steps {
|
||||
script {
|
||||
|
||||
@@ -66,32 +66,14 @@ pipeline {
|
||||
ansiColor('xterm')
|
||||
lock(extra: lockResources)
|
||||
}
|
||||
// the following parameter options are commented out so it shows the ones
|
||||
// that you SHALL have to run the job.
|
||||
// You can use them as template
|
||||
/*
|
||||
parameters {
|
||||
//node-test parameters
|
||||
string(name: 'pythonExecutor', defaultValue: 'nodea', description: 'Node where the pipeline - python scripts will be executed')
|
||||
string(name: 'pythonTestXmlFile', defaultValue: 'enb_usrpB210_band7_50PRB.xml', description: 'Location of the Test XML to be run')
|
||||
string(name: 'pipelineTestStageName', defaultValue: 'Test COTS-UE - OAI eNB - LTEBOX EPC', description: 'Naming of the Test Stage')
|
||||
booleanParam(name: 'pipelineZipsConsoleLog', defaultValue: 'True', description: 'If true, the pipeline script retrieves the job console log, zips it and archives it as artifact')
|
||||
string(name: 'lockResources', defaultValue: 'CI-Bench-1-Phones', description: 'Lockeable Resource to prevent multiple jobs to run simultaneously with the same resource')
|
||||
|
||||
//eNB parameters
|
||||
string(name: 'eNB_IPAddress', defaultValue: '192.168.XX.XX', description: 'IP Address of eNB')
|
||||
credentials(name: 'eNB_Credentials', defaultValue: 'XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX', credentialType: "Username with password", required: true, description: 'Credentials for eNB')
|
||||
string(name: 'eNB_SourceCodePath', defaultValue: '/tmp/CI-enb', description: 'Full path of eNB source code')
|
||||
|
||||
//EPC parameters
|
||||
string(name: 'EPC_IPAddress', defaultValue: '192.168.XX.XX', description: 'IP Address of EPC')
|
||||
string(name: 'EPC_Type', defaultValue: 'ltebox', description: 'EPC type: OAI or ltebox')
|
||||
credentials(name: 'EPC_Credentials', defaultValue: 'XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX', credentialType: "Username with password", required: true, description: 'Credentials for EPC')
|
||||
string(name: 'EPC_SourceCodePath', defaultValue: '/tmp/CI-enb', description: 'Full path of EPC source code')
|
||||
}
|
||||
*/
|
||||
|
||||
stages {
|
||||
stage("Build Init") {
|
||||
steps {
|
||||
// update the build name and description
|
||||
buildName "${params.eNB_MR}"
|
||||
buildDescription "Branch : ${params.eNB_Branch}"
|
||||
}
|
||||
}
|
||||
stage ("Verify Parameters") {
|
||||
steps {
|
||||
script {
|
||||
|
||||
@@ -433,7 +433,7 @@ class Containerize():
|
||||
if ret.returncode != 0:
|
||||
logging.error('\u001B[1m Could not build properly ran-base\u001B[0m')
|
||||
# Recover the name of the failed container?
|
||||
cmd.run(f"{self.cli} ps --quiet --filter \"status=exited\" -n1 | xargs {self.cli} rm -f")
|
||||
cmd.run(f"{self.cli} ps --quiet --filter \"status=exited\" -n1 | xargs --no-run-if-empty {self.cli} rm -f")
|
||||
cmd.run(f"{self.cli} image prune --force")
|
||||
cmd.close()
|
||||
logging.error('\u001B[1m Building OAI Images Failed\u001B[0m')
|
||||
@@ -466,8 +466,8 @@ class Containerize():
|
||||
cmd.run(f'sed -i -e "s#{baseImage}:latest#{baseImage}:{baseTag}#" docker/Dockerfile.{pattern}{self.dockerfileprefix}')
|
||||
if image != 'ran-build':
|
||||
cmd.run(f'sed -i -e "s#ran-build:latest#ran-build:{imageTag}#" docker/Dockerfile.{pattern}{self.dockerfileprefix}')
|
||||
cmd.run(f'{self.cli} build {self.cliBuildOptions} --target {image} --tag {image}:{imageTag} --file docker/Dockerfile.{pattern}{self.dockerfileprefix} . > cmake_targets/log/{image}.log 2>&1', timeout=1200)
|
||||
if image == 'ran-build':
|
||||
ret = cmd.run(f'{self.cli} build {self.cliBuildOptions} --target {image} --tag {image}:{imageTag} --file docker/Dockerfile.{pattern}{self.dockerfileprefix} . > cmake_targets/log/{image}.log 2>&1', timeout=1200)
|
||||
if image == 'ran-build' and ret.returncode == 0:
|
||||
cmd.run(f"docker run --name test-log -d {image}:{imageTag} /bin/true")
|
||||
cmd.run(f"docker cp test-log:/oai-ran/cmake_targets/log/ cmake_targets/log/{image}/")
|
||||
cmd.run(f"docker rm -f test-log")
|
||||
@@ -479,7 +479,7 @@ class Containerize():
|
||||
logging.error('\u001B[1m Could not build properly ' + image + '\u001B[0m')
|
||||
status = False
|
||||
# Here we should check if the last container corresponds to a failed command and destroy it
|
||||
cmd.run(f"{self.cli} ps --quiet --filter \"status=exited\" -n1 | xargs {self.cli} rm -f")
|
||||
cmd.run(f"{self.cli} ps --quiet --filter \"status=exited\" -n1 | xargs --no-run-if-empty {self.cli} rm -f")
|
||||
allImagesSize[image] = 'N/A -- Build Failed'
|
||||
break
|
||||
else:
|
||||
|
||||
@@ -32,7 +32,7 @@ gNBs =
|
||||
absoluteFrequencySSB = 432990;
|
||||
dl_frequencyBand = 66;
|
||||
# this is 3600 MHz
|
||||
dl_absoluteFrequencyPointA = 430000;
|
||||
dl_absoluteFrequencyPointA = 430002;
|
||||
#scs-SpecificCarrierList
|
||||
dl_offstToCarrier = 0;
|
||||
# subcarrierSpacing
|
||||
@@ -53,7 +53,7 @@ gNBs =
|
||||
#uplinkConfigCommon
|
||||
#frequencyInfoUL
|
||||
ul_frequencyBand = 66;
|
||||
ul_absoluteFrequencyPointA = 350000;
|
||||
ul_absoluteFrequencyPointA = 350002;
|
||||
#scs-SpecificCarrierList
|
||||
ul_offstToCarrier = 0;
|
||||
# subcarrierSpacing
|
||||
|
||||
@@ -32,7 +32,7 @@ gNBs =
|
||||
absoluteFrequencySSB = 430590;
|
||||
dl_frequencyBand = 66;
|
||||
# this is 2150 MHz
|
||||
dl_absoluteFrequencyPointA = 430000;
|
||||
dl_absoluteFrequencyPointA = 430002;
|
||||
#scs-SpecificCarrierList
|
||||
dl_offstToCarrier = 0;
|
||||
# subcarrierSpacing
|
||||
@@ -54,7 +54,7 @@ gNBs =
|
||||
#frequencyInfoUL
|
||||
ul_frequencyBand = 66;
|
||||
# this is 1750 MHz
|
||||
ul_absoluteFrequencyPointA = 350000;
|
||||
ul_absoluteFrequencyPointA = 350002;
|
||||
#scs-SpecificCarrierList
|
||||
ul_offstToCarrier = 0;
|
||||
# subcarrierSpacing
|
||||
|
||||
@@ -185,7 +185,7 @@ services:
|
||||
privileged: true
|
||||
container_name: rfsim5g-oai-nr-ue
|
||||
environment:
|
||||
USE_ADDITIONAL_OPTIONS: -E --sa --rfsim -r 106 --numerology 1 --uicc0.imsi 208990100001100 --band 66 -C 2169080000 --CO -400000000 --ssb 378 --rfsimulator.serveraddr 192.168.71.140 --log_config.global_log_options level,nocolor,time
|
||||
USE_ADDITIONAL_OPTIONS: -E --sa --rfsim -r 106 --numerology 1 --uicc0.imsi 208990100001100 --band 66 -C 2169090000 --CO -400000000 --ssb 378 --rfsimulator.serveraddr 192.168.71.140 --log_config.global_log_options level,nocolor,time
|
||||
depends_on:
|
||||
- oai-gnb
|
||||
networks:
|
||||
|
||||
@@ -186,7 +186,7 @@ services:
|
||||
privileged: true
|
||||
container_name: rfsim5g-oai-nr-ue
|
||||
environment:
|
||||
USE_ADDITIONAL_OPTIONS: --sa --rfsim -r 25 --numerology 0 --uicc0.imsi 208990100001100 --band 66 -C 2152250000 --CO -400000000 --ssb 76 --rfsimulator.serveraddr 192.168.71.140 --log_config.global_log_options level,nocolor,time
|
||||
USE_ADDITIONAL_OPTIONS: --sa --rfsim -r 25 --numerology 0 --uicc0.imsi 208990100001100 --band 66 -C 2152260000 --CO -400000000 --ssb 76 --rfsimulator.serveraddr 192.168.71.140 --log_config.global_log_options level,nocolor,time
|
||||
depends_on:
|
||||
- oai-gnb
|
||||
networks:
|
||||
|
||||
@@ -233,6 +233,8 @@ compilations() {
|
||||
$CMAKE --build . $verbose --target $targets -- -j$(nproc)
|
||||
ret=$?
|
||||
} > $dlog/$logfile 2>&1
|
||||
# Print the errors and warnings for CI purposes
|
||||
egrep -A3 "warning:|error:" $dlog/$logfile || true
|
||||
check_warnings "$dlog/$logfile"
|
||||
if [[ $ret -eq 0 ]]; then
|
||||
echo_success "$targets compiled"
|
||||
|
||||
@@ -855,15 +855,6 @@ void flush_mem_to_file(void)
|
||||
}
|
||||
}
|
||||
|
||||
const char logmem_log_level[NUM_LOG_LEVEL] = {
|
||||
[OAILOG_ERR] = 'E',
|
||||
[OAILOG_WARNING] = 'W',
|
||||
[OAILOG_ANALYSIS] = 'A',
|
||||
[OAILOG_INFO] = 'I',
|
||||
[OAILOG_DEBUG] = 'D',
|
||||
[OAILOG_TRACE] = 'T',
|
||||
};
|
||||
|
||||
static void log_output_memory(log_component_t *c, const char *file, const char *func, int line, int comp, int level, const char* format,va_list args)
|
||||
{
|
||||
//logRecord_mt(file,func,line, pthread_self(), comp, level, format, ##args)
|
||||
|
||||
@@ -34,14 +34,14 @@ COPY . .
|
||||
# build all targets so final targets can be created afterwards
|
||||
RUN /bin/sh oaienv && \
|
||||
cd cmake_targets && \
|
||||
mkdir -p ran_build/build ran_build/build-cross && \
|
||||
mkdir -p log ran_build/build ran_build/build-cross && \
|
||||
cd ran_build/build && \
|
||||
cmake ../../.. -GNinja && \
|
||||
echo "====== Start of log for host-tools ======" && \
|
||||
ninja ldpc_generators generate_T && \
|
||||
ninja ldpc_generators generate_T > ../../log/host-tools.txt 2>&1 && \
|
||||
echo "====== End of log for host-tools ======" && \
|
||||
cd ../build-cross/ && \
|
||||
cmake ../../.. -GNinja -DCMAKE_TOOLCHAIN_FILE=../../../cmake_targets/cross-arm.cmake -DNATIVE_DIR=../build && \
|
||||
echo "====== Start of log for cross-build executables ======" && \
|
||||
ninja dlsim ulsim ldpctest polartest smallblocktest nr_pbchsim nr_dlschsim nr_ulschsim nr_dlsim nr_ulsim nr_pucchsim nr_prachsim lte-softmodem nr-softmodem nr-cuup oairu lte-uesoftmodem nr-uesoftmodem params_libconfig coding rfsimulator && \
|
||||
ninja dlsim ulsim ldpctest polartest smallblocktest nr_pbchsim nr_dlschsim nr_ulschsim nr_dlsim nr_ulsim nr_pucchsim nr_prachsim lte-softmodem nr-softmodem nr-cuup oairu lte-uesoftmodem nr-uesoftmodem params_libconfig coding rfsimulator > ../../log/all.txt 2>&1 && \
|
||||
echo "====== End of log for cross-build executables ======"
|
||||
|
||||
@@ -696,10 +696,13 @@ int main( int argc, char **argv ) {
|
||||
|
||||
// OAI Wrapper
|
||||
e2_agent_args_t oai_args = RCconfig_NR_E2agent();
|
||||
AssertFatal(oai_args.sm_dir != NULL , "Please, specify the directory where the SMs are located in the config file, i.e., e2_agent = {near_ric_ip_addr = \"127.0.0.1\"; sm_dir = \"/usr/local/lib/flexric/\");} ");
|
||||
AssertFatal(oai_args.sm_dir != NULL , "Please, specify the directory where the SMs are located in the config file, i.e., add in config file the next line: e2_agent = {near_ric_ip_addr = \"127.0.0.1\"; sm_dir = \"/usr/local/lib/flexric/\");} ");
|
||||
|
||||
AssertFatal(oai_args.ip != NULL , "Please, specify the IP address of the nearRT-RIC in the config file, i.e., e2_agent = {near_ric_ip_addr = \"127.0.0.1\"; sm_dir = \"/usr/local/lib/flexric/\"");
|
||||
|
||||
fr_args_t args = {.ip = oai_args.ip}; // init_fr_args(0, NULL);
|
||||
printf("After RCconfig_NR_E2agent %s %s \n",oai_args.sm_dir, oai_args.ip );
|
||||
|
||||
fr_args_t args = { .ip = oai_args.ip }; // init_fr_args(0, NULL);
|
||||
memcpy(args.libs_dir, oai_args.sm_dir, 128);
|
||||
|
||||
sleep(1);
|
||||
@@ -726,6 +729,7 @@ int main( int argc, char **argv ) {
|
||||
|
||||
printf("[E2 NODE]: mcc = %d mnc = %d mnc_digit = %d nb_id = %d \n", mcc, mnc, mnc_digit_len, nb_id);
|
||||
|
||||
printf("[E2 NODE]: Args %s %s \n", args.ip, args.libs_dir);
|
||||
init_agent_api(mcc, mnc, mnc_digit_len, nb_id, cu_du_id, node_type, io, &args);
|
||||
// }
|
||||
|
||||
|
||||
@@ -686,7 +686,7 @@ int phy_init_nr_gNB(PHY_VARS_gNB *gNB)
|
||||
int n_buf = Prx*max_ul_mimo_layers;
|
||||
|
||||
int nb_re_pusch = N_RB_UL * NR_NB_SC_PER_RB;
|
||||
int nb_re_pusch2 = (nb_re_pusch + 7) & ~7;
|
||||
int nb_re_pusch2 = (nb_re_pusch + 15) & ~15;
|
||||
|
||||
gNB->pusch_vars = (NR_gNB_PUSCH *)malloc16_clear(gNB->max_nb_pusch * sizeof(NR_gNB_PUSCH));
|
||||
for (int ULSCH_id = 0; ULSCH_id < gNB->max_nb_pusch; ULSCH_id++) {
|
||||
@@ -697,24 +697,9 @@ int phy_init_nr_gNB(PHY_VARS_gNB *gNB)
|
||||
pusch->ptrs_phase_per_slot = (int32_t **)malloc16(n_buf * sizeof(int32_t *));
|
||||
pusch->ul_ch_estimates_time = (int32_t **)malloc16(n_buf * sizeof(int32_t *));
|
||||
pusch->rxdataF_comp = (int32_t **)malloc16(n_buf * sizeof(int32_t *));
|
||||
pusch->ul_ch_mag0 = (int32_t **)malloc16(n_buf * sizeof(int32_t *));
|
||||
pusch->ul_ch_magb0 = (int32_t **)malloc16(n_buf * sizeof(int32_t *));
|
||||
pusch->ul_ch_magc0 = (int32_t **)malloc16(n_buf * sizeof(int32_t *));
|
||||
pusch->ul_ch_mag = (int32_t **)malloc16(n_buf * sizeof(int32_t *));
|
||||
pusch->ul_ch_magb = (int32_t **)malloc16(n_buf * sizeof(int32_t *));
|
||||
pusch->ul_ch_magc = (int32_t **)malloc16(n_buf * sizeof(int32_t *));
|
||||
pusch->rho = (int32_t ***)malloc16(Prx * sizeof(int32_t **));
|
||||
pusch->llr_layers = (int16_t **)malloc16(max_ul_mimo_layers * sizeof(int32_t *));
|
||||
for (i = 0; i < Prx; i++) {
|
||||
pusch->rxdataF_ext[i] = (int32_t *)malloc16_clear(sizeof(int32_t) * nb_re_pusch2 * fp->symbols_per_slot);
|
||||
pusch->rho[i] = (int32_t **)malloc16_clear(NR_MAX_NB_LAYERS * NR_MAX_NB_LAYERS * sizeof(int32_t *));
|
||||
|
||||
for (int j = 0; j < max_ul_mimo_layers; j++) {
|
||||
for (int k = 0; k < max_ul_mimo_layers; k++) {
|
||||
pusch->rho[i][j * max_ul_mimo_layers + k] =
|
||||
(int32_t *)malloc16_clear(sizeof(int32_t) * nb_re_pusch2 * fp->symbols_per_slot);
|
||||
}
|
||||
}
|
||||
}
|
||||
for (i = 0; i < n_buf; i++) {
|
||||
pusch->ul_ch_estimates[i] = (int32_t *)malloc16_clear(sizeof(int32_t) * fp->ofdm_symbol_size * fp->symbols_per_slot);
|
||||
@@ -722,12 +707,6 @@ int phy_init_nr_gNB(PHY_VARS_gNB *gNB)
|
||||
pusch->ul_ch_estimates_time[i] = (int32_t *)malloc16_clear(sizeof(int32_t) * fp->ofdm_symbol_size);
|
||||
pusch->ptrs_phase_per_slot[i] = (int32_t *)malloc16_clear(sizeof(int32_t) * fp->symbols_per_slot); // symbols per slot
|
||||
pusch->rxdataF_comp[i] = (int32_t *)malloc16_clear(sizeof(int32_t) * nb_re_pusch2 * fp->symbols_per_slot);
|
||||
pusch->ul_ch_mag0[i] = (int32_t *)malloc16_clear(sizeof(int32_t) * nb_re_pusch2 * fp->symbols_per_slot);
|
||||
pusch->ul_ch_magb0[i] = (int32_t *)malloc16_clear(sizeof(int32_t) * nb_re_pusch2 * fp->symbols_per_slot);
|
||||
pusch->ul_ch_magc0[i] = (int32_t *)malloc16_clear(sizeof(int32_t) * nb_re_pusch2 * fp->symbols_per_slot);
|
||||
pusch->ul_ch_mag[i] = (int32_t *)malloc16_clear(sizeof(int32_t) * nb_re_pusch2 * fp->symbols_per_slot);
|
||||
pusch->ul_ch_magb[i] = (int32_t *)malloc16_clear(sizeof(int32_t) * nb_re_pusch2 * fp->symbols_per_slot);
|
||||
pusch->ul_ch_magc[i] = (int32_t *)malloc16_clear(sizeof(int32_t) * nb_re_pusch2 * fp->symbols_per_slot);
|
||||
}
|
||||
|
||||
for (i=0; i< max_ul_mimo_layers; i++) {
|
||||
@@ -851,11 +830,6 @@ void phy_free_nr_gNB(PHY_VARS_gNB *gNB)
|
||||
free_and_zero(pusch_vars->llr_layers[i]);
|
||||
for (int i = 0; i < Prx; i++) {
|
||||
free_and_zero(pusch_vars->rxdataF_ext[i]);
|
||||
for (int j=0; j< max_ul_mimo_layers; j++) {
|
||||
for (int k=0; k<max_ul_mimo_layers; k++)
|
||||
free_and_zero(pusch_vars->rho[i][j * max_ul_mimo_layers + k]);
|
||||
}
|
||||
free_and_zero(pusch_vars->rho[i]);
|
||||
}
|
||||
for (int i = 0; i < n_buf; i++) {
|
||||
free_and_zero(pusch_vars->ul_ch_estimates[i]);
|
||||
@@ -863,12 +837,6 @@ void phy_free_nr_gNB(PHY_VARS_gNB *gNB)
|
||||
free_and_zero(pusch_vars->ul_ch_estimates_time[i]);
|
||||
free_and_zero(pusch_vars->ptrs_phase_per_slot[i]);
|
||||
free_and_zero(pusch_vars->rxdataF_comp[i]);
|
||||
free_and_zero(pusch_vars->ul_ch_mag0[i]);
|
||||
free_and_zero(pusch_vars->ul_ch_magb0[i]);
|
||||
free_and_zero(pusch_vars->ul_ch_magc0[i]);
|
||||
free_and_zero(pusch_vars->ul_ch_mag[i]);
|
||||
free_and_zero(pusch_vars->ul_ch_magb[i]);
|
||||
free_and_zero(pusch_vars->ul_ch_magc[i]);
|
||||
}
|
||||
free_and_zero(pusch_vars->llr_layers);
|
||||
free_and_zero(pusch_vars->rxdataF_ext);
|
||||
@@ -878,13 +846,6 @@ void phy_free_nr_gNB(PHY_VARS_gNB *gNB)
|
||||
free_and_zero(pusch_vars->ul_ch_estimates_time);
|
||||
free_and_zero(pusch_vars->ul_valid_re_per_slot);
|
||||
free_and_zero(pusch_vars->rxdataF_comp);
|
||||
free_and_zero(pusch_vars->ul_ch_mag0);
|
||||
free_and_zero(pusch_vars->ul_ch_magb0);
|
||||
free_and_zero(pusch_vars->ul_ch_magc0);
|
||||
free_and_zero(pusch_vars->ul_ch_mag);
|
||||
free_and_zero(pusch_vars->ul_ch_magb);
|
||||
free_and_zero(pusch_vars->ul_ch_magc);
|
||||
free_and_zero(pusch_vars->rho);
|
||||
|
||||
free_and_zero(pusch_vars->llr);
|
||||
} // ULSCH_id
|
||||
|
||||
@@ -1146,9 +1146,8 @@ static uint8_t nr_ulsch_mmse_2layers(NR_DL_FRAME_PARMS *frame_parms,
|
||||
simde__m128i *after_mf_c_128 = (simde__m128i *)af_mf_10;
|
||||
simde__m128i *after_mf_d_128 = (simde__m128i *)af_mf_11;
|
||||
|
||||
int rxComp_aligned = ((nb_rb * 12) % 8) ? (8 - (nb_rb * 12) % 8) : 0;
|
||||
simde__m128i *rxdataF_comp128_0 = (simde__m128i *)&rxdataF_comp[0][symbol * (nb_rb * 12 + rxComp_aligned)];
|
||||
simde__m128i *rxdataF_comp128_1 = (simde__m128i *)&rxdataF_comp[n_rx][symbol * (nb_rb * 12 + rxComp_aligned)];
|
||||
simde__m128i *rxdataF_comp128_0 = (simde__m128i *)&rxdataF_comp[0][symbol * buffer_length];
|
||||
simde__m128i *rxdataF_comp128_1 = (simde__m128i *)&rxdataF_comp[n_rx][symbol * buffer_length];
|
||||
|
||||
if (mod_order > 2) {
|
||||
if (mod_order == 4) {
|
||||
@@ -1277,7 +1276,7 @@ static void inner_rx (PHY_VARS_gNB *gNB,
|
||||
int nb_layer = rel15_ul->nrOfLayers;
|
||||
int nb_rx_ant = frame_parms->nb_antennas_rx;
|
||||
int dmrs_symbol_flag = (rel15_ul->ul_dmrs_symb_pos >> symbol) & 0x01;
|
||||
int buffer_length = (rel15_ul->rb_size * NR_NB_SC_PER_RB + 7) & ~7;
|
||||
int buffer_length = (rel15_ul->rb_size * NR_NB_SC_PER_RB + 15) & ~15;
|
||||
c16_t rxFext[nb_rx_ant][buffer_length] __attribute__((aligned(32)));
|
||||
c16_t chFext[nb_layer][nb_rx_ant][buffer_length] __attribute__((aligned(32)));
|
||||
|
||||
@@ -1578,8 +1577,7 @@ int nr_rx_pusch_tp(PHY_VARS_gNB *gNB,
|
||||
// extract the data in the OFDM frame, to the start of the array
|
||||
int soffset = (slot&3)*frame_parms->symbols_per_slot*frame_parms->ofdm_symbol_size;
|
||||
|
||||
if (nb_re_pusch & 7)
|
||||
nb_re_pusch += 8 - (nb_re_pusch & 7);
|
||||
nb_re_pusch = (nb_re_pusch + 15) & ~15;
|
||||
|
||||
for (int aarx = 0; aarx < frame_parms->nb_antennas_rx; aarx++)
|
||||
for (int aatx = 0; aatx < rel15_ul->nrOfLayers; aatx++)
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -256,6 +256,7 @@ void nr_decode_pucch0(PHY_VARS_gNB *gNB,
|
||||
int32_t rp[frame_parms->nb_antennas_rx][pucch_pdu->nr_of_symbols][nb_re_pucch];
|
||||
memset(rp, 0, sizeof(rp));
|
||||
int32_t *tmp_rp = NULL;
|
||||
int signal_energy = 0;
|
||||
|
||||
for (int l=0; l<pucch_pdu->nr_of_symbols; l++) {
|
||||
uint8_t l2 = l + pucch_pdu->start_symbol_index;
|
||||
@@ -286,9 +287,13 @@ void nr_decode_pucch0(PHY_VARS_gNB *gNB,
|
||||
#endif
|
||||
|
||||
}
|
||||
signal_energy += signal_energy_nodc((int32_t *)r, nb_re_pucch);
|
||||
}
|
||||
}
|
||||
|
||||
signal_energy /= (pucch_pdu->nr_of_symbols * frame_parms->nb_antennas_rx);
|
||||
int pucch_power_dBtimes10 = 10 * dB_fixed(signal_energy);
|
||||
|
||||
//int32_t no_corr = 0;
|
||||
int seq_index = 0;
|
||||
int64_t temp;
|
||||
@@ -377,7 +382,7 @@ void nr_decode_pucch0(PHY_VARS_gNB *gNB,
|
||||
int SNRtimes10,sigenergy=0;
|
||||
for (int aa=0;aa<frame_parms->nb_antennas_rx;aa++)
|
||||
sigenergy += signal_energy_nodc(rp[aa][0],12);
|
||||
SNRtimes10 = xrtmag_dBtimes10-(10*max_n0);
|
||||
SNRtimes10 = pucch_power_dBtimes10 - (10 * max_n0);
|
||||
int cqi;
|
||||
if (SNRtimes10 < -640) cqi=0;
|
||||
else if (SNRtimes10 > 635) cqi=255;
|
||||
@@ -421,7 +426,7 @@ void nr_decode_pucch0(PHY_VARS_gNB *gNB,
|
||||
uci_pdu->harq.harq_confidence_level = no_conf;
|
||||
uci_pdu->harq.harq_list[0].harq_value = !(index&0x01);
|
||||
LOG_D(PHY,
|
||||
"[DLSCH/PDSCH/PUCCH] %d.%d HARQ %s with confidence level %s xrt_mag %d xrt_mag_next %d n0 %d (%d,%d) pucch0_thres %d, "
|
||||
"[DLSCH/PDSCH/PUCCH] %d.%d HARQ %s with confidence level %s xrt_mag %d xrt_mag_next %d pucch_power_dBtimes10 %d n0 %d (%d,%d) pucch0_thres %d, "
|
||||
"cqi %d, SNRtimes10 %d, energy %f\n",
|
||||
frame,
|
||||
slot,
|
||||
@@ -429,6 +434,7 @@ void nr_decode_pucch0(PHY_VARS_gNB *gNB,
|
||||
uci_pdu->harq.harq_confidence_level == 0 ? "good" : "bad",
|
||||
xrtmag_dBtimes10,
|
||||
xrtmag_next_dBtimes10,
|
||||
pucch_power_dBtimes10,
|
||||
max_n0,
|
||||
uci_stats->pucch0_n00,
|
||||
uci_stats->pucch0_n01,
|
||||
@@ -454,7 +460,7 @@ void nr_decode_pucch0(PHY_VARS_gNB *gNB,
|
||||
uci_pdu->harq.harq_list[1].harq_value = !(index&0x01);
|
||||
uci_pdu->harq.harq_list[0].harq_value = !((index>>1)&0x01);
|
||||
LOG_D(PHY,
|
||||
"[DLSCH/PDSCH/PUCCH] %d.%d HARQ values (%s, %s) with confidence level %s, xrt_mag %d xrt_mag_next %d n0 %d (%d,%d) "
|
||||
"[DLSCH/PDSCH/PUCCH] %d.%d HARQ values (%s, %s) with confidence level %s, xrt_mag %d xrt_mag_next %d pucch_power_dBtimes10 %d n0 %d (%d,%d) "
|
||||
"pucch0_thres %d, cqi %d, SNRtimes10 %d\n",
|
||||
frame,
|
||||
slot,
|
||||
@@ -463,6 +469,7 @@ void nr_decode_pucch0(PHY_VARS_gNB *gNB,
|
||||
uci_pdu->harq.harq_confidence_level == 0 ? "good" : "bad",
|
||||
xrtmag_dBtimes10,
|
||||
xrtmag_next_dBtimes10,
|
||||
pucch_power_dBtimes10,
|
||||
max_n0,
|
||||
uci_stats->pucch0_n00,
|
||||
uci_stats->pucch0_n01,
|
||||
|
||||
@@ -834,6 +834,26 @@ int nr_ue_csi_im_procedures(PHY_VARS_NR_UE *ue, UE_nr_rxtx_proc_t *proc, c16_t r
|
||||
return 0;
|
||||
}
|
||||
|
||||
nfapi_nr_dl_tti_csi_rs_pdu_rel15_t *convert_csirs_pdu(fapi_nr_dl_config_csirs_pdu_rel15_t *csirs_config_pdu)
|
||||
{
|
||||
nfapi_nr_dl_tti_csi_rs_pdu_rel15_t *dl_tti_csi_rs_pdu = calloc(1, sizeof(nfapi_nr_dl_tti_csi_rs_pdu_rel15_t));
|
||||
dl_tti_csi_rs_pdu->subcarrier_spacing = csirs_config_pdu->subcarrier_spacing;
|
||||
dl_tti_csi_rs_pdu->cyclic_prefix = csirs_config_pdu->cyclic_prefix;
|
||||
dl_tti_csi_rs_pdu->start_rb = csirs_config_pdu->start_rb;
|
||||
dl_tti_csi_rs_pdu->nr_of_rbs = csirs_config_pdu->nr_of_rbs;
|
||||
dl_tti_csi_rs_pdu->csi_type = csirs_config_pdu->csi_type;
|
||||
dl_tti_csi_rs_pdu->row = csirs_config_pdu->row;
|
||||
dl_tti_csi_rs_pdu->freq_domain = csirs_config_pdu->freq_domain;
|
||||
dl_tti_csi_rs_pdu->symb_l0 = csirs_config_pdu->symb_l0;
|
||||
dl_tti_csi_rs_pdu->symb_l1 = csirs_config_pdu->symb_l1;
|
||||
dl_tti_csi_rs_pdu->cdm_type = csirs_config_pdu->cdm_type;
|
||||
dl_tti_csi_rs_pdu->freq_density = csirs_config_pdu->freq_density;
|
||||
dl_tti_csi_rs_pdu->scramb_id = csirs_config_pdu->scramb_id;
|
||||
dl_tti_csi_rs_pdu->power_control_offset = csirs_config_pdu->power_control_offset;
|
||||
dl_tti_csi_rs_pdu->power_control_offset_ss = csirs_config_pdu->power_control_offset_ss;
|
||||
return dl_tti_csi_rs_pdu;
|
||||
}
|
||||
|
||||
void nr_ue_csi_rs_procedures(PHY_VARS_NR_UE *ue, UE_nr_rxtx_proc_t *proc, c16_t rxdataF[][ue->frame_parms.samples_per_slot_wCP])
|
||||
{
|
||||
|
||||
@@ -891,7 +911,7 @@ void nr_ue_csi_rs_procedures(PHY_VARS_NR_UE *ue, UE_nr_rxtx_proc_t *proc, c16_t
|
||||
ue->nr_csi_info->csi_rs_generated_signal,
|
||||
AMP,
|
||||
ue->nr_csi_info,
|
||||
(nfapi_nr_dl_tti_csi_rs_pdu_rel15_t *) csirs_config_pdu,
|
||||
convert_csirs_pdu((fapi_nr_dl_config_csirs_pdu_rel15_t*)&ue->csirs_vars[gNB_id]->csirs_config_pdu),
|
||||
proc->nr_slot_rx,
|
||||
&N_cdm_groups,
|
||||
&CDM_group_size,
|
||||
|
||||
@@ -345,48 +345,8 @@ typedef struct {
|
||||
/// - first index: rx antenna id [0..nb_antennas_rx[
|
||||
/// - second index: ? [0..12*N_RB_UL*frame_parms->symbols_per_tti[
|
||||
int32_t **rxdataF_comp;
|
||||
/// \brief Magnitude of the UL channel estimates. Used for 2nd-bit level thresholds in LLR computation
|
||||
/// - first index: rx antenna id [0..nb_antennas_rx[
|
||||
/// - second index: ? [0..12*N_RB_UL*frame_parms->symbols_per_tti[
|
||||
int32_t **ul_ch_mag;
|
||||
/// \brief Magnitude of the UL channel estimates scaled for 3rd bit level thresholds in LLR computation
|
||||
/// - first index: rx antenna id [0..nb_antennas_rx[
|
||||
/// - second index: ? [0..12*N_RB_UL*frame_parms->symbols_per_tti[
|
||||
int32_t **ul_ch_magb;
|
||||
/// \brief Magnitude of the UL channel estimates scaled for 4th bit level thresholds in LLR computation
|
||||
/// - first index: rx antenna id [0..nb_antennas_rx[
|
||||
/// - second index: ? [0..12*N_RB_UL*frame_parms->symbols_per_tti[
|
||||
int32_t **ul_ch_magc;
|
||||
/// \brief Cross-correlation of two UE signals.
|
||||
/// - first index: rx antenna [0..nb_antennas_rx[
|
||||
/// - second index: symbol [0..]
|
||||
int32_t ***rho;
|
||||
/// \f$\log_2(\max|H_i|^2)\f$
|
||||
int16_t log2_maxh;
|
||||
/// \brief Magnitude of Uplink Channel first layer (16QAM level/First 64QAM level/First 256QAM level).
|
||||
/// - first index: ? [0..7] (hard coded) FIXME! accessed via \c nb_antennas_rx
|
||||
/// - second index: ? [0..168*N_RB_UL[
|
||||
int32_t **ul_ch_mag0;
|
||||
/// \brief Magnitude of Uplink Channel second layer (16QAM level/First 64QAM level/First 256QAM level).
|
||||
/// - first index: ? [0..7] (hard coded) FIXME! accessed via \c nb_antennas_rx
|
||||
/// - second index: ? [0..168*N_RB_UL[
|
||||
int32_t **ul_ch_mag1[8][8];
|
||||
/// \brief Magnitude of Uplink Channel, first layer (2nd 64QAM/256QAM level).
|
||||
/// - first index: ? [0..7] (hard coded) FIXME! accessed via \c nb_antennas_rx
|
||||
/// - second index: ? [0..168*N_RB_UL[
|
||||
int32_t **ul_ch_magb0;
|
||||
/// \brief Magnitude of Uplink Channel second layer (2nd 64QAM/256QAM level).
|
||||
/// - first index: ? [0..7] (hard coded) FIXME! accessed via \c nb_antennas_rx
|
||||
/// - second index: ? [0..168*N_RB_UL[
|
||||
int32_t **ul_ch_magb1[8][8];
|
||||
/// \brief Magnitude of Uplink Channel, first layer (3rd 256QAM level).
|
||||
/// - first index: ? [0..7] (hard coded) FIXME! accessed via \c nb_antennas_rx
|
||||
/// - second index: ? [0..168*N_RB_UL[
|
||||
int32_t **ul_ch_magc0;
|
||||
/// \brief Magnitude of Uplink Channel second layer (3rd 256QAM level).
|
||||
/// - first index: ? [0..7] (hard coded) FIXME! accessed via \c nb_antennas_rx
|
||||
/// - second index: ? [0..168*N_RB_UL[
|
||||
int32_t **ul_ch_magc1[8][8];
|
||||
/// measured RX power based on DRS
|
||||
int ulsch_power[8];
|
||||
/// total signal over antennas
|
||||
|
||||
@@ -465,12 +465,6 @@ void nr_fill_indication(PHY_VARS_gNB *gNB, int frame, int slot_rx, int ULSCH_id,
|
||||
int off = ((pusch_pdu->rb_size&1) == 1)? 4:0;
|
||||
|
||||
LOG_M("rxsigF0.m","rxsF0",&gNB->common_vars.rxdataF[0][(slot_rx&3)*gNB->frame_parms.ofdm_symbol_size*gNB->frame_parms.symbols_per_slot],gNB->frame_parms.ofdm_symbol_size*gNB->frame_parms.symbols_per_slot,1,1);
|
||||
LOG_M("rxsigF0_ext.m",
|
||||
"rxsF0_ext",
|
||||
&gNB->pusch_vars[0].rxdataF_ext[0][pusch_pdu->start_symbol_index * NR_NB_SC_PER_RB * pusch_pdu->rb_size],
|
||||
pusch_pdu->nr_of_symbols * (off + (NR_NB_SC_PER_RB * pusch_pdu->rb_size)),
|
||||
1,
|
||||
1);
|
||||
LOG_M("chestF0.m",
|
||||
"chF0",
|
||||
&gNB->pusch_vars[0].ul_ch_estimates[0][pusch_pdu->start_symbol_index * gNB->frame_parms.ofdm_symbol_size],
|
||||
@@ -498,12 +492,6 @@ void nr_fill_indication(PHY_VARS_gNB *gNB, int frame, int slot_rx, int ULSCH_id,
|
||||
0);
|
||||
if (gNB->frame_parms.nb_antennas_rx > 1) {
|
||||
LOG_M("rxsigF1.m","rxsF1",&gNB->common_vars.rxdataF[1][(slot_rx&3)*gNB->frame_parms.ofdm_symbol_size*gNB->frame_parms.symbols_per_slot],gNB->frame_parms.ofdm_symbol_size*gNB->frame_parms.symbols_per_slot,1,1);
|
||||
LOG_M("rxsigF1_ext.m",
|
||||
"rxsF1_ext",
|
||||
&gNB->pusch_vars[0].rxdataF_ext[1][pusch_pdu->start_symbol_index * NR_NB_SC_PER_RB * pusch_pdu->rb_size],
|
||||
pusch_pdu->nr_of_symbols * (off + (NR_NB_SC_PER_RB * pusch_pdu->rb_size)),
|
||||
1,
|
||||
1);
|
||||
LOG_M("chestF1.m",
|
||||
"chF1",
|
||||
&gNB->pusch_vars[0].ul_ch_estimates[1][pusch_pdu->start_symbol_index * gNB->frame_parms.ofdm_symbol_size],
|
||||
|
||||
@@ -1296,18 +1296,6 @@ int main(int argc, char *argv[])
|
||||
nb_symb_sch * (off + (NR_NB_SC_PER_RB * pusch_pdu->rb_size)),
|
||||
1,
|
||||
1);
|
||||
LOG_M("chmagF0.m",
|
||||
"chmF0",
|
||||
&pusch_vars->ul_ch_mag[0][start_symbol * (off + (NR_NB_SC_PER_RB * pusch_pdu->rb_size))],
|
||||
nb_symb_sch * (off + (NR_NB_SC_PER_RB * pusch_pdu->rb_size)),
|
||||
1,
|
||||
1);
|
||||
LOG_M("chmagbF0.m",
|
||||
"chmbF0",
|
||||
&pusch_vars->ul_ch_magb[0][start_symbol * (off + (NR_NB_SC_PER_RB * pusch_pdu->rb_size))],
|
||||
nb_symb_sch * (off + (NR_NB_SC_PER_RB * pusch_pdu->rb_size)),
|
||||
1,
|
||||
1);
|
||||
LOG_M("rxsigF0_llrlayers0.m",
|
||||
"rxsF0_llrlayers0",
|
||||
&pusch_vars->llr_layers[0][0],
|
||||
|
||||
@@ -29,6 +29,9 @@ else()
|
||||
message(FATAL_ERROR "Unknown building type. Either choose a static or a dynamic library")
|
||||
endif()
|
||||
|
||||
#######
|
||||
## E2AP encoding and versioning
|
||||
#######
|
||||
|
||||
set(E2AP_ENCODING "ASN" CACHE STRING "The E2AP encoding to use")
|
||||
set_property(CACHE E2AP_ENCODING PROPERTY STRINGS "ASN" "FLATBUFFERS")
|
||||
@@ -76,6 +79,35 @@ set(SM_ENCODING_GTP "PLAIN" CACHE STRING "The GTP SM encoding to use")
|
||||
set_property(CACHE SM_ENCODING_GTP PROPERTY STRINGS "PLAIN")
|
||||
message(STATUS "Selected GTP SM_ENCODING: ${SM_ENCODING_GTP}")
|
||||
|
||||
|
||||
if(E2AP_VERSION STREQUAL "E2AP_V1")
|
||||
add_library(e2ap_ran_func_obj OBJECT
|
||||
flexric/src/lib/e2ap/v1_01/e2ap_types/common/e2ap_ran_function.c )
|
||||
add_library(e2ap_plmn_obj OBJECT
|
||||
flexric/src/lib/e2ap/v1_01/e2ap_types/common/e2ap_plmn.c )
|
||||
add_library(e2ap_global_node_id_obj OBJECT
|
||||
flexric/src/lib/e2ap/v1_01/e2ap_types/common/e2ap_global_node_id.c )
|
||||
elseif(E2AP_VERSION STREQUAL "E2AP_V2")
|
||||
add_library(e2ap_ran_func_obj OBJECT
|
||||
flexric/src/lib/e2ap/v2_03/e2ap_types/common/e2ap_ran_function.c )
|
||||
add_library(e2ap_plmn_obj OBJECT
|
||||
flexric/src/lib/e2ap/v2_03/e2ap_types/common/e2ap_plmn.c )
|
||||
add_library(e2ap_global_node_id_obj OBJECT
|
||||
flexric/src/lib/e2ap/v2_03/e2ap_types/common/e2ap_global_node_id.c )
|
||||
elseif(E2AP_VERSION STREQUAL "E2AP_V3")
|
||||
add_library(e2ap_ran_func_obj OBJECT
|
||||
flexric/src/lib/e2ap/v3_01/e2ap_types/common/e2ap_ran_function.c )
|
||||
add_library(e2ap_plmn_obj OBJECT
|
||||
flexric/src/lib/e2ap/v3_01/e2ap_types/common/e2ap_plmn.c )
|
||||
add_library(e2ap_global_node_id_obj OBJECT
|
||||
flexric/src/lib/e2ap/v3_01/e2ap_types/common/e2ap_global_node_id.c )
|
||||
else()
|
||||
message(FATAL_ERROR "E2AP Unknown version selected")
|
||||
endif()
|
||||
|
||||
|
||||
|
||||
|
||||
########
|
||||
### Flatbuffer
|
||||
########
|
||||
|
||||
@@ -3,6 +3,8 @@ add_subdirectory(O-RAN)
|
||||
|
||||
add_library(e2_ran_func STATIC
|
||||
init_ran_func.c
|
||||
read_setup_ran.c
|
||||
../flexric/test/rnd/fill_rnd_data_e2_setup_req.c
|
||||
)
|
||||
|
||||
target_link_libraries(e2_ran_func
|
||||
@@ -10,3 +12,6 @@ target_link_libraries(e2_ran_func
|
||||
e2_ran_func_cust
|
||||
e2_ran_func_oran
|
||||
)
|
||||
|
||||
# This dependency sucks! Create pointers and forward declarations!
|
||||
target_compile_definitions(e2_ran_func PRIVATE ${E2AP_VERSION} ${KPM_VERSION})
|
||||
|
||||
@@ -16,3 +16,5 @@ add_library(e2_ran_func_cust STATIC
|
||||
)
|
||||
|
||||
target_link_libraries(e2_ran_func_cust PUBLIC asn1_nr_rrc nr_rrc asn1_nr_rrc_hdrs)
|
||||
# This dependency sucks! Create pointers and forward declarations!
|
||||
target_compile_definitions(e2_ran_func_cust PRIVATE ${E2AP_VERSION} ${KPM_VERSION} )
|
||||
|
||||
@@ -1,7 +1,14 @@
|
||||
#include "ran_func_gtp.h"
|
||||
#include "openair2/E2AP/flexric/test/rnd/fill_rnd_data_gtp.h"
|
||||
|
||||
#include <assert.h>
|
||||
|
||||
#include "openair2/E2AP/flexric/test/rnd/fill_rnd_data_gtp.h"
|
||||
#include "common/ran_context.h"
|
||||
#include "openair2/LAYER2/NR_MAC_gNB/mac_proto.h"
|
||||
#include "openair2/E2AP/flexric/src/util/time_now_us.h"
|
||||
#include "openair2/RRC/NR/rrc_gNB_UE_context.h"
|
||||
|
||||
|
||||
static
|
||||
const int mod_id = 0;
|
||||
|
||||
|
||||
@@ -2,10 +2,6 @@
|
||||
#define RAN_FUNC_SM_GTP_READ_WRITE_AGENT_H
|
||||
|
||||
#include "openair2/E2AP/flexric/src/agent/../sm/sm_io.h"
|
||||
#include "common/ran_context.h"
|
||||
#include "openair2/LAYER2/NR_MAC_gNB/mac_proto.h"
|
||||
#include "openair2/E2AP/flexric/src/util/time_now_us.h"
|
||||
#include "openair2/RRC/NR/rrc_gNB_UE_context.h"
|
||||
|
||||
void read_gtp_sm(void*);
|
||||
|
||||
|
||||
@@ -1,6 +1,17 @@
|
||||
#include "ran_func_pdcp.h"
|
||||
#include "openair2/E2AP/flexric/test/rnd/fill_rnd_data_pdcp.h"
|
||||
|
||||
#include <assert.h>
|
||||
#include <stdint.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
#include "openair2/E2AP/flexric/test/rnd/fill_rnd_data_pdcp.h"
|
||||
#include "common/ran_context.h"
|
||||
#include "openair2/RRC/NR/rrc_gNB_UE_context.h"
|
||||
#include "openair2/LAYER2/nr_pdcp/nr_pdcp_oai_api.h"
|
||||
#include "openair2/LAYER2/nr_rlc/nr_rlc_oai_api.h"
|
||||
#include "openair2/LAYER2/NR_MAC_gNB/mac_proto.h"
|
||||
#include "openair2/E2AP/flexric/src/util/time_now_us.h"
|
||||
|
||||
|
||||
static
|
||||
const int mod_id = 0;
|
||||
|
||||
@@ -2,12 +2,6 @@
|
||||
#define RAN_FUNC_SM_PDCP_READ_WRITE_AGENT_H
|
||||
|
||||
#include "openair2/E2AP/flexric/src/agent/../sm/sm_io.h"
|
||||
#include "common/ran_context.h"
|
||||
#include "openair2/RRC/NR/rrc_gNB_UE_context.h"
|
||||
#include "openair2/LAYER2/nr_pdcp/nr_pdcp_oai_api.h"
|
||||
#include "openair2/LAYER2/nr_rlc/nr_rlc_oai_api.h"
|
||||
#include "openair2/LAYER2/NR_MAC_gNB/mac_proto.h"
|
||||
#include "openair2/E2AP/flexric/src/util/time_now_us.h"
|
||||
|
||||
void read_pdcp_sm(void*);
|
||||
|
||||
|
||||
@@ -1,5 +1,12 @@
|
||||
#include <assert.h>
|
||||
#include <stdint.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
#include "ran_func_rlc.h"
|
||||
#include "common/ran_context.h"
|
||||
#include "openair2/LAYER2/NR_MAC_gNB/mac_proto.h"
|
||||
#include "openair2/LAYER2/nr_rlc/nr_rlc_oai_api.h"
|
||||
#include "openair2/E2AP/flexric/src/util/time_now_us.h"
|
||||
#include "openair2/E2AP/flexric/test/rnd/fill_rnd_data_rlc.h"
|
||||
|
||||
static
|
||||
|
||||
@@ -2,11 +2,6 @@
|
||||
#define RAN_FUNC_SM_RLC_READ_WRITE_AGENT_H
|
||||
|
||||
#include "openair2/E2AP/flexric/src/agent/../sm/sm_io.h"
|
||||
#include "common/ran_context.h"
|
||||
#include "openair2/LAYER2/NR_MAC_gNB/mac_proto.h"
|
||||
#include "openair2/LAYER2/nr_rlc/nr_rlc_oai_api.h"
|
||||
#include "openair2/E2AP/flexric/src/util/time_now_us.h"
|
||||
|
||||
|
||||
void read_rlc_sm(void*);
|
||||
|
||||
|
||||
@@ -7,3 +7,4 @@ add_library(e2_ran_func_oran STATIC
|
||||
)
|
||||
|
||||
target_link_libraries(e2_ran_func_oran PUBLIC asn1_nr_rrc nr_rrc asn1_nr_rrc_hdrs)
|
||||
target_compile_definitions(e2_ran_func_oran PRIVATE ${E2AP_VERSION} ${KPM_VERSION})
|
||||
|
||||
@@ -20,7 +20,7 @@ typedef struct {
|
||||
|
||||
|
||||
static
|
||||
matched_ues_mac_t filter_ues_by_s_nssai_in_du_or_monolithic(test_cond_e const * condition, int64_t const value)
|
||||
matched_ues_mac_t filter_ues_by_s_nssai_in_du_or_monolithic(test_cond_e const condition, int64_t const value)
|
||||
{
|
||||
matched_ues_mac_t matched_ues = {.num_ues = 0, .ue_list = calloc(MAX_MOBILES_PER_GNB, sizeof(NR_UE_info_t)) };
|
||||
assert(matched_ues.ue_list != NULL && "Memory exhausted");
|
||||
@@ -37,7 +37,7 @@ matched_ues_mac_t filter_ues_by_s_nssai_in_du_or_monolithic(test_cond_e const *
|
||||
|
||||
// Filter connected UEs by S-NSSAI test condition to get list of matched UEs
|
||||
// note: not possible to filter
|
||||
switch (*condition)
|
||||
switch (condition)
|
||||
{
|
||||
case EQUAL_TEST_COND:
|
||||
{
|
||||
@@ -73,7 +73,7 @@ typedef struct {
|
||||
} matched_ues_rrc_t;
|
||||
|
||||
static
|
||||
matched_ues_rrc_t filter_ues_by_s_nssai_in_cu(test_cond_e const * condition, int64_t const value)
|
||||
matched_ues_rrc_t filter_ues_by_s_nssai_in_cu(test_cond_e const condition, int64_t const value)
|
||||
{
|
||||
matched_ues_rrc_t matched_ues = {.num_ues = 0, .rrc_ue_id_list = calloc(MAX_MOBILES_PER_GNB, sizeof(f1_ue_data_t)) };
|
||||
assert(matched_ues.rrc_ue_id_list != NULL && "Memory exhausted");
|
||||
@@ -85,7 +85,7 @@ matched_ues_rrc_t filter_ues_by_s_nssai_in_cu(test_cond_e const * condition, int
|
||||
ngap_gNB_ue_context_t *ngap_ue_context_list = ngap_get_ue_context(ue_context_p1->ue_context.rrc_ue_id);
|
||||
|
||||
// Filter connected UEs by S-NSSAI test condition to get list of matched UEs
|
||||
switch (*condition)
|
||||
switch (condition)
|
||||
{
|
||||
case EQUAL_TEST_COND:
|
||||
assert(ngap_ue_context_list->gNB_instance[0].s_nssai[0][0].sST == value && "Please, check the condition for S-NSSAI. At the moment, OAI supports eMBB");
|
||||
@@ -104,7 +104,7 @@ matched_ues_rrc_t filter_ues_by_s_nssai_in_cu(test_cond_e const * condition, int
|
||||
}
|
||||
|
||||
static
|
||||
nr_rlc_statistics_t get_rlc_stats_per_drb(NR_UE_info_t * const UE)
|
||||
nr_rlc_statistics_t get_rlc_stats_per_drb(NR_UE_info_t const * UE)
|
||||
{
|
||||
assert(UE != NULL);
|
||||
|
||||
@@ -195,13 +195,14 @@ gnb_du_e2sm_t fill_gnb_du_data(const f1_ue_data_t * rrc_ue_id)
|
||||
return gnb_du;
|
||||
}
|
||||
|
||||
|
||||
uint32_t last_dl_rlc_pdu_total_bytes[MAX_MOBILES_PER_GNB] = {0};
|
||||
uint32_t last_ul_rlc_pdu_total_bytes[MAX_MOBILES_PER_GNB] = {0};
|
||||
uint32_t last_dl_total_prbs[MAX_MOBILES_PER_GNB] = {0};
|
||||
uint32_t last_ul_total_prbs[MAX_MOBILES_PER_GNB] = {0};
|
||||
uint32_t last_dl_pdcp_sdu_total_bytes[MAX_MOBILES_PER_GNB] = {0};
|
||||
uint32_t last_ul_pdcp_sdu_total_bytes[MAX_MOBILES_PER_GNB] = {0};
|
||||
// Bad bad bad. Create a proper exponential moving average filter or at least, only read statistics
|
||||
// Avoid coupling among sublayers
|
||||
static uint32_t last_dl_rlc_pdu_total_bytes[MAX_MOBILES_PER_GNB] = {0};
|
||||
static uint32_t last_ul_rlc_pdu_total_bytes[MAX_MOBILES_PER_GNB] = {0};
|
||||
static uint32_t last_dl_total_prbs[MAX_MOBILES_PER_GNB] = {0};
|
||||
static uint32_t last_ul_total_prbs[MAX_MOBILES_PER_GNB] = {0};
|
||||
static uint32_t last_dl_pdcp_sdu_total_bytes[MAX_MOBILES_PER_GNB] = {0};
|
||||
static uint32_t last_ul_pdcp_sdu_total_bytes[MAX_MOBILES_PER_GNB] = {0};
|
||||
|
||||
|
||||
static
|
||||
@@ -596,18 +597,23 @@ kpm_ind_msg_format_3_t fill_kpm_ind_msg_frm_3_in_monolithic(const matched_ues_ma
|
||||
msg_frm_3.meas_report_per_ue[i].ind_msg_format_1 = fill_kpm_ind_msg_frm_1_in_monolithic(&matched_ues.ue_list[i], i, rrc_ue_context_list->ue_context.rrc_ue_id, act_def_fr_1);
|
||||
}
|
||||
|
||||
|
||||
return msg_frm_3;
|
||||
}
|
||||
|
||||
|
||||
static
|
||||
kpm_ric_ind_hdr_format_1_t fill_kpm_ind_hdr_frm_1(void)
|
||||
static
|
||||
kpm_ric_ind_hdr_format_1_t kpm_ind_hdr_frm_1(void)
|
||||
{
|
||||
kpm_ric_ind_hdr_format_1_t hdr_frm_1 = {0};
|
||||
|
||||
hdr_frm_1.collectStartTime = time_now_us();
|
||||
|
||||
int64_t const t = time_now_us();
|
||||
#if defined KPM_V2
|
||||
hdr_frm_1.collectStartTime = t/1000000; // seconds
|
||||
#elif defined KPM_V3
|
||||
hdr_frm_1.collectStartTime = t; // microseconds
|
||||
#else
|
||||
static_assert(0!=0, "Undefined KPM SM Version");
|
||||
#endif
|
||||
|
||||
hdr_frm_1.fileformat_version = NULL;
|
||||
|
||||
// Check E2 Node NG-RAN Type
|
||||
@@ -617,7 +623,7 @@ kpm_ric_ind_hdr_format_1_t fill_kpm_ind_hdr_frm_1(void)
|
||||
hdr_frm_1.sender_name->buf = calloc(strlen("My OAI-DU") + 1, sizeof(char));
|
||||
memcpy(hdr_frm_1.sender_name->buf, "My OAI-DU", strlen("My OAI-DU"));
|
||||
hdr_frm_1.sender_name->len = strlen("My OAI-DU");
|
||||
|
||||
|
||||
hdr_frm_1.sender_type = calloc(1, sizeof(byte_array_t));
|
||||
hdr_frm_1.sender_type->buf = calloc(strlen("DU") + 1, sizeof(char));
|
||||
memcpy(hdr_frm_1.sender_type->buf, "DU", strlen("DU"));
|
||||
@@ -629,7 +635,7 @@ kpm_ric_ind_hdr_format_1_t fill_kpm_ind_hdr_frm_1(void)
|
||||
hdr_frm_1.sender_name->buf = calloc(strlen("My OAI-CU") + 1, sizeof(char));
|
||||
memcpy(hdr_frm_1.sender_name->buf, "My OAI-CU", strlen("My OAI-CU"));
|
||||
hdr_frm_1.sender_name->len = strlen("My OAI-CU");
|
||||
|
||||
|
||||
hdr_frm_1.sender_type = calloc(1, sizeof(byte_array_t));
|
||||
hdr_frm_1.sender_type->buf = calloc(strlen("CU") + 1, sizeof(char));
|
||||
memcpy(hdr_frm_1.sender_type->buf, "CU", strlen("CU"));
|
||||
@@ -641,14 +647,15 @@ kpm_ric_ind_hdr_format_1_t fill_kpm_ind_hdr_frm_1(void)
|
||||
hdr_frm_1.sender_name->buf = calloc(strlen("My OAI-MONO") + 1, sizeof(char));
|
||||
memcpy(hdr_frm_1.sender_name->buf, "My OAI-MONO", strlen("My OAI-MONO"));
|
||||
hdr_frm_1.sender_name->len = strlen("My OAI-MONO");
|
||||
|
||||
|
||||
hdr_frm_1.sender_type = calloc(1, sizeof(byte_array_t));
|
||||
hdr_frm_1.sender_type->buf = calloc(strlen("MONO") + 1, sizeof(char));
|
||||
memcpy(hdr_frm_1.sender_type->buf, "MONO", strlen("MONO"));
|
||||
hdr_frm_1.sender_type->len = strlen("MONO");
|
||||
} else {
|
||||
assert(0!=0 && "Unknown node type");
|
||||
}
|
||||
|
||||
|
||||
|
||||
hdr_frm_1.vendor_name = calloc(1, sizeof(byte_array_t));
|
||||
hdr_frm_1.vendor_name->buf = calloc(strlen("OAI") + 1, sizeof(char));
|
||||
memcpy(hdr_frm_1.vendor_name->buf, "OAI", strlen("OAI"));
|
||||
@@ -657,87 +664,125 @@ kpm_ric_ind_hdr_format_1_t fill_kpm_ind_hdr_frm_1(void)
|
||||
return hdr_frm_1;
|
||||
}
|
||||
|
||||
static
|
||||
kpm_ind_hdr_t fill_kpm_ind_hdr(void)
|
||||
kpm_ind_hdr_t kpm_ind_hdr(void)
|
||||
{
|
||||
kpm_ind_hdr_t hdr = {0};
|
||||
|
||||
hdr.type = FORMAT_1_INDICATION_HEADER;
|
||||
hdr.kpm_ric_ind_hdr_format_1 = fill_kpm_ind_hdr_frm_1();
|
||||
hdr.kpm_ric_ind_hdr_format_1 = kpm_ind_hdr_frm_1();
|
||||
|
||||
return hdr;
|
||||
}
|
||||
|
||||
|
||||
void read_kpm_sm(void* data)
|
||||
{
|
||||
assert(data != NULL);
|
||||
//assert(data->type == KPM_STATS_V3_0);
|
||||
// assert(data->type == KPM_STATS_V3_0);
|
||||
|
||||
kpm_rd_ind_data_t* const kpm = (kpm_rd_ind_data_t*)data;
|
||||
|
||||
assert(kpm->act_def!= NULL && "Cannot be NULL");
|
||||
assert(kpm->act_def != NULL && "Cannot be NULL");
|
||||
|
||||
// 7.8 Supported RIC Styles and E2SM IE Formats
|
||||
// Action Definition Format 4 corresponds to Indication Message Format 3
|
||||
switch (kpm->act_def->type)
|
||||
{
|
||||
case FORMAT_4_ACTION_DEFINITION:
|
||||
{
|
||||
kpm->ind.hdr = fill_kpm_ind_hdr();
|
||||
|
||||
kpm->ind.msg.type = FORMAT_3_INDICATION_MESSAGE;
|
||||
switch (kpm->act_def->type) {
|
||||
case FORMAT_4_ACTION_DEFINITION: {
|
||||
kpm->ind.hdr = kpm_ind_hdr();
|
||||
|
||||
// Filter the UE by the test condition criteria
|
||||
for (size_t i = 0; i<kpm->act_def->frm_4.matching_cond_lst_len; i++)
|
||||
{
|
||||
switch (kpm->act_def->frm_4.matching_cond_lst[i].test_info_lst.test_cond_type)
|
||||
{
|
||||
case S_NSSAI_TEST_COND_TYPE:
|
||||
assert(kpm->act_def->frm_4.matching_cond_lst[i].test_info_lst.S_NSSAI == TRUE_TEST_COND_TYPE && "Must be true");
|
||||
|
||||
// Check E2 Node NG-RAN Type
|
||||
if (NODE_IS_DU(RC.nrrrc[0]->node_type))
|
||||
{
|
||||
matched_ues_mac_t matched_ues = filter_ues_by_s_nssai_in_du_or_monolithic(kpm->act_def->frm_4.matching_cond_lst[i].test_info_lst.test_cond, *kpm->act_def->frm_4.matching_cond_lst[i].test_info_lst.int_value);
|
||||
kpm->ind.msg.frm_3 = fill_kpm_ind_msg_frm_3_in_du(matched_ues, &kpm->act_def->frm_4.action_def_format_1);
|
||||
}
|
||||
else if (NODE_IS_CU(RC.nrrrc[0]->node_type))
|
||||
{
|
||||
matched_ues_rrc_t matched_ues = filter_ues_by_s_nssai_in_cu(kpm->act_def->frm_4.matching_cond_lst[i].test_info_lst.test_cond, *kpm->act_def->frm_4.matching_cond_lst[i].test_info_lst.int_value);
|
||||
kpm->ind.msg.frm_3 = fill_kpm_ind_msg_frm_3_in_cu(matched_ues, &kpm->act_def->frm_4.action_def_format_1);
|
||||
}
|
||||
else if (NODE_IS_MONOLITHIC(RC.nrrrc[0]->node_type))
|
||||
{
|
||||
matched_ues_mac_t matched_ues = filter_ues_by_s_nssai_in_du_or_monolithic(kpm->act_def->frm_4.matching_cond_lst[i].test_info_lst.test_cond, *kpm->act_def->frm_4.matching_cond_lst[i].test_info_lst.int_value);
|
||||
kpm->ind.msg.frm_3 = fill_kpm_ind_msg_frm_3_in_monolithic(matched_ues, &kpm->act_def->frm_4.action_def_format_1);
|
||||
}
|
||||
else
|
||||
{
|
||||
assert(false && "NG-RAN Type not yet implemented");
|
||||
}
|
||||
kpm->ind.msg.type = FORMAT_3_INDICATION_MESSAGE;
|
||||
// Filter the UE by the test condition criteria
|
||||
kpm_act_def_format_4_t const* frm_4 = &kpm->act_def->frm_4; // 8.2.1.2.4
|
||||
for (size_t i = 0; i < frm_4->matching_cond_lst_len; i++) {
|
||||
switch (frm_4->matching_cond_lst[i].test_info_lst.test_cond_type) {
|
||||
case GBR_TEST_COND_TYPE: {
|
||||
assert(0 != 0 && "Not implemented");
|
||||
break;
|
||||
}
|
||||
case AMBR_TEST_COND_TYPE: {
|
||||
assert(0 != 0 && "Not implemented");
|
||||
break;
|
||||
}
|
||||
case IsStat_TEST_COND_TYPE: {
|
||||
assert(0 != 0 && "Not implemented");
|
||||
break;
|
||||
}
|
||||
case IsCatM_TEST_COND_TYPE: {
|
||||
assert(0 != 0 && "Not implemented");
|
||||
break;
|
||||
}
|
||||
|
||||
break;
|
||||
|
||||
default:
|
||||
assert(false && "Test condition type not yet implemented");
|
||||
case DL_RSRP_TEST_COND_TYPE: {
|
||||
assert(0 != 0 && "Not implemented");
|
||||
break;
|
||||
}
|
||||
|
||||
case DL_RSRQ_TEST_COND_TYPE: {
|
||||
assert(0 != 0 && "Not implemented");
|
||||
break;
|
||||
}
|
||||
|
||||
case UL_RSRP_TEST_COND_TYPE: {
|
||||
assert(0 != 0 && "Not implemented");
|
||||
break;
|
||||
}
|
||||
|
||||
case CQI_TEST_COND_TYPE: {
|
||||
// This is a bad idea. Done only to check FlexRIC xAPP
|
||||
printf("CQI not implemented!. Randomly filling the data \n");
|
||||
goto rnd_data_label;
|
||||
break;
|
||||
}
|
||||
|
||||
case fiveQI_TEST_COND_TYPE: {
|
||||
assert(0 != 0 && "Not implemented");
|
||||
break;
|
||||
}
|
||||
|
||||
case QCI_TEST_COND_TYPE: {
|
||||
;
|
||||
assert(0 != 0 && "Not implemented");
|
||||
break;
|
||||
}
|
||||
case S_NSSAI_TEST_COND_TYPE: {
|
||||
assert(frm_4->matching_cond_lst[i].test_info_lst.S_NSSAI == TRUE_TEST_COND_TYPE && "Must be true");
|
||||
assert(frm_4->matching_cond_lst[i].test_info_lst.test_cond != NULL && "Even though is optional..");
|
||||
assert(frm_4->matching_cond_lst[i].test_info_lst.int_value != NULL && "Even though is optional..");
|
||||
|
||||
test_cond_e const test_cond = *frm_4->matching_cond_lst[i].test_info_lst.test_cond;
|
||||
int64_t const value = *frm_4->matching_cond_lst[i].test_info_lst.int_value;
|
||||
// Check E2 Node NG-RAN Type
|
||||
if (NODE_IS_DU(RC.nrrrc[0]->node_type)) {
|
||||
matched_ues_mac_t matched_ues = filter_ues_by_s_nssai_in_du_or_monolithic(test_cond, value);
|
||||
kpm->ind.msg.frm_3 = fill_kpm_ind_msg_frm_3_in_du(matched_ues, &frm_4->action_def_format_1);
|
||||
} else if (NODE_IS_CU(RC.nrrrc[0]->node_type)) {
|
||||
matched_ues_rrc_t matched_ues = filter_ues_by_s_nssai_in_cu(test_cond, value);
|
||||
kpm->ind.msg.frm_3 = fill_kpm_ind_msg_frm_3_in_cu(matched_ues, &frm_4->action_def_format_1);
|
||||
} else if (NODE_IS_MONOLITHIC(RC.nrrrc[0]->node_type)) {
|
||||
matched_ues_mac_t matched_ues = filter_ues_by_s_nssai_in_du_or_monolithic(test_cond, value);
|
||||
kpm->ind.msg.frm_3 = fill_kpm_ind_msg_frm_3_in_monolithic(matched_ues, &frm_4->action_def_format_1);
|
||||
} else {
|
||||
assert(false && "NG-RAN Type not implemented");
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
default:
|
||||
assert(false && "Unknown Test condition");
|
||||
}
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
default:
|
||||
{
|
||||
kpm->ind.hdr = fill_rnd_kpm_ind_hdr();
|
||||
kpm->ind.msg = fill_rnd_kpm_ind_msg();
|
||||
default: {
|
||||
rnd_data_label:
|
||||
kpm->ind.hdr = fill_rnd_kpm_ind_hdr();
|
||||
kpm->ind.msg = fill_rnd_kpm_ind_msg();
|
||||
|
||||
break;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
void read_kpm_setup_sm(void* e2ap)
|
||||
|
||||
@@ -2,6 +2,8 @@
|
||||
#include "../../flexric/test/rnd/fill_rnd_data_rc.h"
|
||||
#include "../../flexric/src/sm/rc_sm/ie/ir/lst_ran_param.h"
|
||||
#include "../../flexric/src/sm/rc_sm/ie/ir/ran_param_list.h"
|
||||
#include "../../flexric/src/agent/e2_agent_api.h"
|
||||
|
||||
#include <assert.h>
|
||||
#include <stdio.h>
|
||||
#include <pthread.h>
|
||||
|
||||
@@ -1,4 +1,6 @@
|
||||
#include "init_ran_func.h"
|
||||
#include "read_setup_ran.h"
|
||||
#include "../flexric/src/agent/e2_agent_api.h"
|
||||
#include "CUSTOMIZED/ran_func_mac.h"
|
||||
#include "CUSTOMIZED/ran_func_rlc.h"
|
||||
#include "CUSTOMIZED/ran_func_pdcp.h"
|
||||
@@ -67,6 +69,10 @@ sm_io_ag_ran_t init_ran_func_ag(void)
|
||||
init_write_ctrl(&io.write_ctrl_tbl);
|
||||
init_write_subs(&io.write_subs_tbl);
|
||||
|
||||
#if defined(E2AP_V2) || defined(E2AP_V3)
|
||||
io.read_setup_ran = read_setup_ran;
|
||||
#endif
|
||||
|
||||
return io;
|
||||
}
|
||||
|
||||
|
||||
@@ -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
|
||||
*/
|
||||
|
||||
#include "read_setup_ran.h"
|
||||
#include "../../E2AP/flexric/src/lib/e2ap/e2ap_node_component_config_add_wrapper.h"
|
||||
#include "../../E2AP/flexric/test/rnd/fill_rnd_data_e2_setup_req.h"
|
||||
#include <assert.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
void read_setup_ran(void* data)
|
||||
{
|
||||
assert(data != NULL);
|
||||
#ifdef E2AP_V1
|
||||
|
||||
#elif defined(E2AP_V2) || defined(E2AP_V3)
|
||||
*((e2ap_node_component_config_add_t*)data) = fill_e2ap_node_component_config_add();
|
||||
#else
|
||||
static_assert(0!=0, "Unknown E2AP version");
|
||||
#endif
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -0,0 +1,27 @@
|
||||
/*
|
||||
* 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 READ_SETUP_RAN_E2_AGENT_H
|
||||
#define READ_SETUP_RAN_E2_AGENT_H
|
||||
|
||||
void read_setup_ran(void* data);
|
||||
|
||||
#endif
|
||||
+16
-8
@@ -11,7 +11,7 @@ Please see [NOTICE](NOTICE.md) file for third party software that is included in
|
||||
|
||||
# Overview
|
||||
|
||||
This tutorial describes the steps of deployment 5G OAI RAN, with integrated E2 agent, and FlexRIC, O-RAN compliant nearRT-RIC.
|
||||
This tutorial describes the steps of deployment 5G OAI RAN, with integrated E2 agent and a nearRT-RIC using O-RAN compliant FlexRIC.
|
||||
|
||||
# 1. Installation
|
||||
|
||||
@@ -29,9 +29,10 @@ This tutorial describes the steps of deployment 5G OAI RAN, with integrated E2 a
|
||||
```bash
|
||||
git clone https://github.com/swig/swig.git
|
||||
cd swig
|
||||
git checkout release-4.1
|
||||
./autogen.sh
|
||||
./configure --prefix=/usr/
|
||||
make
|
||||
make -j8
|
||||
make install
|
||||
```
|
||||
|
||||
@@ -57,12 +58,15 @@ git clone https://gitlab.eurecom.fr/oai/openairinterface5g oai
|
||||
cd oai/
|
||||
```
|
||||
|
||||
### 2.1.2 Build OAI
|
||||
### 2.1.2 Build OAI with E2 Agent
|
||||
|
||||
- By default, OAI will build the E2 Agent with E2AP v2 and KPM v2. If you want a different version, edit the variable E2AP\_VERSION and KPM\_VERSION at OAI's CMakeLists.txt file.
|
||||
|
||||
```bash
|
||||
cd cmake_targets/
|
||||
./build_oai -I -w SIMU --gNB --nrUE --build-e2 --ninja
|
||||
```
|
||||
If the flexric folder is empty, try manually the following commands
|
||||
If the openair2/E2AP/flexric folder is empty, try manually the following commands
|
||||
|
||||
```bash
|
||||
git submodule init
|
||||
@@ -74,15 +78,18 @@ git submodule update
|
||||
* `--gNB` is to build the `nr-softmodem` and `nr-cuup` executables and all required shared libraries
|
||||
* `--nrUE` is to build the `nr-uesoftmodem` executable and all required shared libraries
|
||||
* `--ninja` is to use the ninja build tool, which speeds up compilation
|
||||
* `--build-e2` option is to use the E2 agent, integrated within gNB.
|
||||
* `--build-e2` option is to use the E2 agent, integrated within RAN.
|
||||
|
||||
## 2.2 FlexRIC
|
||||
|
||||
- By default, FlexRIC will build the nearRT-RIC with E2AP v2 and KPM v2. If you want a different version, edit the variable E2AP\_VERSION and KPM\_VERSION at FlexRIC's CMakeLists.txt file. Note that OAI's and FlexRIC's E2AP\_VERSION and KPM\_VERSION need to match due to O-RAN incompatibilities among versions.
|
||||
|
||||
|
||||
### 2.2.1 Clone the FlexRIC repository
|
||||
```bash
|
||||
git clone https://gitlab.eurecom.fr/mosaic5g/flexric flexric
|
||||
cd flexric/
|
||||
git checkout 8ee3aca107a9da8ccf425e623bed18cd40a31fa1
|
||||
git checkout 035fd2e8f9a9d2c16df8d44c9e8c13ccddf9ff19
|
||||
```
|
||||
|
||||
### 2.2.2 Build FlexRIC
|
||||
@@ -98,7 +105,8 @@ sudo make install
|
||||
By default the service model libraries will be installed in the path `/usr/local/lib/flexric` while the configuration file in `/usr/local/etc/flexric`.
|
||||
|
||||
Available SMs in this version are:
|
||||
* KPM v03.00 (xapp_kpm_moni)
|
||||
* KPM v02.03 and KPM v03.00 (xapp_kpm_moni)
|
||||
* RC v01.03 (xapp_kpm_rc)
|
||||
* GTP (xapp_gtp_moni)
|
||||
* MAC + RLC + PDCP (xapp_mac_rlc_pdcp_moni)
|
||||
|
||||
@@ -106,7 +114,7 @@ If you are interested in TC and SLICE SMs, please follow the instructions at htt
|
||||
|
||||
# 3. Start the process
|
||||
|
||||
In order to configure E2 agent, please, add the following block in the configuration file:
|
||||
In order to configure E2 agent, please, add the following block in OAI's configuration file:
|
||||
```bash
|
||||
e2_agent = {
|
||||
near_ric_ip_addr = "127.0.0.1";
|
||||
|
||||
+1
-1
Submodule openair2/E2AP/flexric updated: 8ee3aca107...035fd2e8f9
@@ -957,9 +957,7 @@ int CU_send_UE_CONTEXT_MODIFICATION_REQUEST(instance_t instance, f1ap_ue_context
|
||||
F1AP_UEContextModificationRequest_t *out;
|
||||
uint8_t *buffer=NULL;
|
||||
uint32_t len=0;
|
||||
// for test
|
||||
LOG_W(F1AP, "UE Context Modification Request PLMN is hardcoded!\n");
|
||||
f1ap_served_cell_info_t hardCoded= { .plmn.mcc=208, .plmn.mnc=93, .plmn.mnc_digit_length=2};
|
||||
|
||||
/* Create */
|
||||
/* 0. Message Type */
|
||||
pdu.present = F1AP_F1AP_PDU_PR_initiatingMessage;
|
||||
@@ -985,13 +983,18 @@ int CU_send_UE_CONTEXT_MODIFICATION_REQUEST(instance_t instance, f1ap_ue_context
|
||||
|
||||
/* optional */
|
||||
/* c3. NRCGI */
|
||||
if (0) {
|
||||
if (true) {
|
||||
asn1cSequenceAdd(out->protocolIEs.list, F1AP_UEContextModificationRequestIEs_t, ie3);
|
||||
ie3->id = F1AP_ProtocolIE_ID_id_SpCell_ID;
|
||||
ie3->criticality = F1AP_Criticality_ignore;
|
||||
ie3->value.present = F1AP_UEContextModificationRequestIEs__value_PR_NRCGI;
|
||||
/* - nRCGI */
|
||||
addnRCGI(ie3->value.choice.NRCGI, &hardCoded);
|
||||
|
||||
f1ap_served_cell_info_t nrcgi = {
|
||||
.plmn = f1ap_ue_context_modification_req->plmn,
|
||||
.nr_cellid = f1ap_ue_context_modification_req->nr_cellid,
|
||||
};
|
||||
addnRCGI(ie3->value.choice.NRCGI, &nrcgi);
|
||||
}
|
||||
|
||||
/* optional */
|
||||
@@ -1113,6 +1116,7 @@ int CU_send_UE_CONTEXT_MODIFICATION_REQUEST(instance_t instance, f1ap_ue_context
|
||||
F1AP_SCell_ToBeSetupMod_Item_t *scell_toBeSetupMod_item=
|
||||
&scell_toBeSetupMod_item_ies->value.choice.SCell_ToBeSetupMod_Item;
|
||||
// /* - sCell_ID */
|
||||
f1ap_served_cell_info_t hardCoded = {0};
|
||||
addnRCGI(scell_toBeSetupMod_item->sCell_ID, &hardCoded);
|
||||
/* sCellIndex */
|
||||
scell_toBeSetupMod_item->sCellIndex = 6; // issue here
|
||||
@@ -1140,6 +1144,7 @@ int CU_send_UE_CONTEXT_MODIFICATION_REQUEST(instance_t instance, f1ap_ue_context
|
||||
F1AP_SCell_ToBeRemoved_Item_t *scell_toBeRemoved_item=
|
||||
&scell_toBeRemoved_item_ies->value.choice.SCell_ToBeRemoved_Item;
|
||||
/* - sCell_ID */
|
||||
f1ap_served_cell_info_t hardCoded = {0};
|
||||
addnRCGI(scell_toBeRemoved_item->sCell_ID, &hardCoded);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -927,16 +927,7 @@ int DU_handle_UE_CONTEXT_MODIFICATION_REQUEST(instance_t instance, sctp_assoc_t
|
||||
f1ap_ue_context_modification_req->rrc_container = malloc(ieRRC->value.choice.RRCContainer.size);
|
||||
memcpy(f1ap_ue_context_modification_req->rrc_container,
|
||||
ieRRC->value.choice.RRCContainer.buf, ieRRC->value.choice.RRCContainer.size);
|
||||
protocol_ctxt_t ctxt;
|
||||
// decode RRC Container and act on the message type
|
||||
ctxt.rntiMaybeUEid = f1ap_ue_context_modification_req->gNB_DU_ue_id;
|
||||
ctxt.instance = instance;
|
||||
ctxt.module_id = instance;
|
||||
ctxt.enb_flag = 1;
|
||||
ctxt.eNB_index = instance;
|
||||
mem_block_t *pdcp_pdu_p = get_free_mem_block(ieRRC->value.choice.RRCContainer.size, __func__);
|
||||
memcpy(&pdcp_pdu_p->data[0], ieRRC->value.choice.RRCContainer.buf, ieRRC->value.choice.RRCContainer.size);
|
||||
du_rlc_data_req(&ctxt, 1, 0x00, 1, 1, 0, ieRRC->value.choice.RRCContainer.size, pdcp_pdu_p);
|
||||
f1ap_ue_context_modification_req->rrc_container_length = ieRRC->value.choice.RRCContainer.size;
|
||||
} else {
|
||||
LOG_E(F1AP, " RRCContainer in UEContextModificationRequestIEs size id 0\n");
|
||||
}
|
||||
@@ -944,6 +935,32 @@ int DU_handle_UE_CONTEXT_MODIFICATION_REQUEST(instance_t instance, sctp_assoc_t
|
||||
LOG_D(F1AP, "can't find RRCContainer in UEContextModificationRequestIEs by id %ld \n", F1AP_ProtocolIE_ID_id_RRCContainer);
|
||||
}
|
||||
|
||||
/* CU2DU Information */
|
||||
F1AP_UEContextModificationRequestIEs_t *ieCU2DU = NULL;
|
||||
F1AP_FIND_PROTOCOLIE_BY_ID(F1AP_UEContextModificationRequestIEs_t,
|
||||
ieCU2DU,
|
||||
container,
|
||||
F1AP_ProtocolIE_ID_id_CUtoDURRCInformation,
|
||||
false);
|
||||
if (ieCU2DU != NULL) {
|
||||
f1ap_ue_context_modification_req->cu_to_du_rrc_information =
|
||||
calloc(1, sizeof(*f1ap_ue_context_modification_req->cu_to_du_rrc_information));
|
||||
AssertFatal(f1ap_ue_context_modification_req->cu_to_du_rrc_information != NULL, "out of memory\n");
|
||||
cu_to_du_rrc_information_t *cu2du = f1ap_ue_context_modification_req->cu_to_du_rrc_information;
|
||||
const F1AP_CUtoDURRCInformation_t *cu2duie = &ieCU2DU->value.choice.CUtoDURRCInformation;
|
||||
if (cu2duie->cG_ConfigInfo != NULL)
|
||||
LOG_W(F1AP, "UE RNTI %04x: ignoring cg_ConfigInfo, not implemented\n", f1ap_ue_context_modification_req->gNB_DU_ue_id);
|
||||
if (cu2duie->measConfig != NULL)
|
||||
LOG_W(F1AP, "UE RNTI %04x: ignoring measConfig, not implemented\n", f1ap_ue_context_modification_req->gNB_DU_ue_id);
|
||||
if (cu2duie->uE_CapabilityRAT_ContainerList != NULL) {
|
||||
F1AP_UE_CapabilityRAT_ContainerList_t *uecap = cu2duie->uE_CapabilityRAT_ContainerList;
|
||||
cu2du->uE_CapabilityRAT_ContainerList = calloc(uecap->size, sizeof(*cu2du->uE_CapabilityRAT_ContainerList));
|
||||
AssertFatal(cu2du->uE_CapabilityRAT_ContainerList != NULL, "out of memory\n");
|
||||
cu2du->uE_CapabilityRAT_ContainerList_length = uecap->size;
|
||||
memcpy(cu2du->uE_CapabilityRAT_ContainerList, uecap->buf, uecap->size);
|
||||
}
|
||||
}
|
||||
|
||||
ue_context_modification_request(f1ap_ue_context_modification_req);
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -46,34 +46,44 @@ void fill_dci_search_candidates(const NR_SearchSpace_t *ss,
|
||||
{
|
||||
LOG_D(NR_MAC,"Filling search candidates for DCI\n");
|
||||
|
||||
rel15->number_of_candidates = 0;
|
||||
int i = 0;
|
||||
for (int maxL = 16; maxL > 0; maxL >>= 1) {
|
||||
uint8_t aggregation, number_of_candidates;
|
||||
uint8_t aggregation, max_number_of_candidates;
|
||||
find_aggregation_candidates(&aggregation,
|
||||
&number_of_candidates,
|
||||
&max_number_of_candidates,
|
||||
ss,
|
||||
maxL);
|
||||
if (number_of_candidates > 0) {
|
||||
LOG_D(NR_MAC,"L %d, number of candidates %d, aggregation %d\n", maxL, number_of_candidates, aggregation);
|
||||
int N_cce_sym = 0; // nb of rbs of coreset per symbol
|
||||
for (int f = 0; f < 6; f++) {
|
||||
for (int t = 0; t < 8; t++) {
|
||||
N_cce_sym += ((rel15->coreset.frequency_domain_resource[f] >> t) & 1);
|
||||
if (max_number_of_candidates == 0)
|
||||
continue;
|
||||
LOG_D(NR_MAC,"L %d, max number of candidates %d, aggregation %d\n", maxL, max_number_of_candidates, aggregation);
|
||||
int N_cce_sym = 0; // nb of rbs of coreset per symbol
|
||||
for (int f = 0; f < 6; f++) {
|
||||
for (int t = 0; t < 8; t++) {
|
||||
N_cce_sym += ((rel15->coreset.frequency_domain_resource[f] >> t) & 1);
|
||||
}
|
||||
}
|
||||
int N_cces = N_cce_sym * rel15->coreset.duration;
|
||||
if (N_cces < aggregation)
|
||||
continue;
|
||||
for (int j = 0; j < max_number_of_candidates; j++) {
|
||||
int first_cce = aggregation * ((Y + ((j * N_cces) / (aggregation * max_number_of_candidates)) + 0) % (N_cces / aggregation));
|
||||
LOG_D(NR_MAC,"Candidate %d of %d first_cce %d (L %d N_cces %d Y %d)\n", j, max_number_of_candidates, first_cce, aggregation, N_cces, Y);
|
||||
// to avoid storing more than one candidate with the same aggregation and starting CCE (duplicated candidate)
|
||||
bool duplicated = false;
|
||||
for (int k = 0; k < i; k++) {
|
||||
if (rel15->CCE[k] == first_cce && rel15->L[k] == aggregation) {
|
||||
duplicated = true;
|
||||
LOG_D(NR_MAC, "Candidate %d of %d is duplicated\n", j, max_number_of_candidates);
|
||||
}
|
||||
}
|
||||
int N_cces = N_cce_sym * rel15->coreset.duration;
|
||||
// limit the number of candidates to the ones fitting current configuration
|
||||
int max_candidates = min(N_cces / aggregation, number_of_candidates);
|
||||
rel15->number_of_candidates += max_candidates;
|
||||
for (int j = 0; j < max_candidates; i++, j++) {
|
||||
int first_cce = aggregation * ((Y + ((j * N_cces) / (aggregation * number_of_candidates)) + 0) % (N_cces / aggregation));
|
||||
LOG_D(NR_MAC,"Candidate %d of %d first_cce %d (L %d N_cces %d Y %d)\n", j, max_candidates, first_cce, aggregation, N_cces, Y);
|
||||
if (!duplicated) {
|
||||
rel15->CCE[i] = first_cce;
|
||||
rel15->L[i] = aggregation;
|
||||
i++;
|
||||
}
|
||||
}
|
||||
}
|
||||
rel15->number_of_candidates = i;
|
||||
}
|
||||
|
||||
NR_ControlResourceSet_t *ue_get_coreset(const NR_UE_MAC_INST_t *mac, const int coreset_id)
|
||||
|
||||
@@ -1879,16 +1879,14 @@ static void nr_check_Msg4_Ack(module_id_t module_id, int CC_id, frame_t frame, s
|
||||
|
||||
NR_UE_sched_ctrl_t *sched_ctrl = &UE->UE_sched_ctrl;
|
||||
NR_UE_harq_t *harq = &sched_ctrl->harq_processes[current_harq_pid];
|
||||
NR_mac_stats_t *stats = &UE->mac_stats;
|
||||
|
||||
LOG_D(NR_MAC, "ue rnti 0x%04x, harq is waiting %d, round %d, frame %d %d, harq id %d\n", ra->rnti, harq->is_waiting, harq->round, frame, slot, current_harq_pid);
|
||||
|
||||
if (harq->is_waiting == 0) {
|
||||
if (harq->round == 0) {
|
||||
|
||||
if (stats->dl.errors == 0) {
|
||||
if (UE->Msg4_ACKed) {
|
||||
LOG_A(NR_MAC, "(UE RNTI 0x%04x) Received Ack of RA-Msg4. CBRA procedure succeeded!\n", ra->rnti);
|
||||
UE->Msg4_ACKed = true;
|
||||
UE->ra_timer = 0;
|
||||
|
||||
// Pause scheduling according to:
|
||||
|
||||
@@ -2570,7 +2570,8 @@ void nr_csirs_scheduling(int Mod_idP, frame_t frame, sub_frame_t slot, int n_slo
|
||||
dl_tti_csirs_pdu->PDUSize = (uint8_t)(2+sizeof(nfapi_nr_dl_tti_csi_rs_pdu));
|
||||
|
||||
nfapi_nr_dl_tti_csi_rs_pdu_rel15_t *csirs_pdu_rel15 = &dl_tti_csirs_pdu->csi_rs_pdu.csi_rs_pdu_rel15;
|
||||
|
||||
csirs_pdu_rel15->bwp_size = dl_bwp->BWPSize;
|
||||
csirs_pdu_rel15->bwp_start = dl_bwp->BWPStart;
|
||||
csirs_pdu_rel15->subcarrier_spacing = dl_bwp->scs;
|
||||
if (dl_bwp->cyclicprefix)
|
||||
csirs_pdu_rel15->cyclic_prefix = *dl_bwp->cyclicprefix;
|
||||
@@ -2916,8 +2917,11 @@ void send_initial_ul_rrc_message(gNB_MAC_INST *mac, int rnti, const uint8_t *sdu
|
||||
uint8_t du2cu[1024];
|
||||
int encoded = encode_cellGroupConfig(UE->CellGroup, du2cu, sizeof(du2cu));
|
||||
|
||||
DevAssert(mac->f1_config.setup_req != NULL);
|
||||
AssertFatal(mac->f1_config.setup_req->num_cells_available == 1, "can handle only one cell\n");
|
||||
const f1ap_initial_ul_rrc_message_t ul_rrc_msg = {
|
||||
/* TODO: add mcc, mnc, cell_id, ..., is not available at MAC yet */
|
||||
.plmn = mac->f1_config.setup_req->cell[0].info.plmn,
|
||||
.nr_cellid = mac->f1_config.setup_req->cell[0].info.nr_cellid,
|
||||
.gNB_DU_ue_id = rnti,
|
||||
.crnti = rnti,
|
||||
.rrc_container = (uint8_t *) sdu,
|
||||
|
||||
@@ -32,6 +32,10 @@
|
||||
#include "common/ran_context.h"
|
||||
#include "nfapi/oai_integration/vendor_ext.h"
|
||||
#include "common/utils/nr/nr_common.h"
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <math.h>
|
||||
#include <immintrin.h>
|
||||
|
||||
//#define SRS_DEBUG
|
||||
|
||||
@@ -42,12 +46,112 @@ const uint16_t m_SRS[64] = { 4, 8, 12, 16, 16, 20, 24, 24, 28, 32, 36, 40, 48, 4
|
||||
160, 160, 168, 176, 184, 192, 192, 192, 192, 208, 216, 224, 240, 240, 240, 240, 256, 256,
|
||||
256, 264, 272, 272, 272 };
|
||||
|
||||
static uint32_t max4(uint32_t a, uint32_t b, uint32_t c, uint32_t d)
|
||||
#ifdef SRS_DEBUG
|
||||
static void print128_number(const simde__m128i var)
|
||||
{
|
||||
int x = max(a, b);
|
||||
x = max(x, c);
|
||||
x = max(x, d);
|
||||
return x;
|
||||
int32_t *var16 = (int32_t *)&var;
|
||||
for (int i = 0; i < 4; i++) {
|
||||
printf("%5d ", var16[i]);
|
||||
}
|
||||
printf("\n");
|
||||
}
|
||||
#endif
|
||||
|
||||
int most_frequent_ri(const int *arr, int n)
|
||||
{
|
||||
int maxcount = 0;
|
||||
int element_having_max_freq = -1;
|
||||
for (int i = 0; i < n; i++) {
|
||||
int count = 0;
|
||||
for (int j = 0; j < n; j++) {
|
||||
if (arr[i] == arr[j])
|
||||
count++;
|
||||
}
|
||||
if (count > maxcount) {
|
||||
maxcount = count;
|
||||
element_having_max_freq = arr[i];
|
||||
}
|
||||
}
|
||||
return element_having_max_freq;
|
||||
}
|
||||
|
||||
void matrix_rank_128bits(int row, int col, simde__m128i mat[4])
|
||||
{
|
||||
if ((row == 2 && col == 2) || (row == 4 && col == 2)) {
|
||||
|
||||
int32_t *mat_k = (int32_t *)&mat[0];
|
||||
int32_t *mat_i = (int32_t *)&mat[1];
|
||||
|
||||
simde__m128 mult_128 = simde_mm_setr_ps((float)mat_i[0] / (float)mat_k[0],
|
||||
(float)mat_i[0] / (float)mat_k[0],
|
||||
(float)mat_i[2] / (float)mat_k[2],
|
||||
(float)mat_i[2] / (float)mat_k[2]);
|
||||
|
||||
simde__m128i mat_kj_128 = simde_mm_setr_epi32(mat_k[0], mat_k[1], mat_k[2], mat_k[3]);
|
||||
simde__m128 multiplication = simde_mm_mul_ps(mult_128, simde_mm_cvtepi32_ps(mat_kj_128));
|
||||
mat[1] = simde_mm_sub_epi32(mat[1], simde_mm_cvtps_epi32(multiplication));
|
||||
|
||||
mat_k = (int32_t *)&mat[2];
|
||||
mat_i = (int32_t *)&mat[3];
|
||||
|
||||
mult_128 = simde_mm_setr_ps((float)mat_i[0] / (float)mat_k[0],
|
||||
(float)mat_i[0] / (float)mat_k[0],
|
||||
(float)mat_i[2] / (float)mat_k[2],
|
||||
(float)mat_i[2] / (float)mat_k[2]);
|
||||
|
||||
mat_kj_128 = simde_mm_setr_epi32(mat_k[0], mat_k[1], mat_k[2], mat_k[3]);
|
||||
multiplication = simde_mm_mul_ps(mult_128, simde_mm_cvtepi32_ps(mat_kj_128));
|
||||
mat[3] = simde_mm_sub_epi32(mat[3], simde_mm_cvtps_epi32(multiplication));
|
||||
|
||||
} else if (row == 2 && col == 4) {
|
||||
|
||||
int32_t *mat_k = (int32_t *)&mat[0];
|
||||
int32_t *mat_i = (int32_t *)&mat[1];
|
||||
|
||||
simde__m128 mult_128 = simde_mm_setr_ps((float)mat_i[0] / (float)mat_k[0],
|
||||
(float)mat_i[0] / (float)mat_k[0],
|
||||
(float)mat_i[0] / (float)mat_k[0],
|
||||
(float)mat_i[0] / (float)mat_k[0]);
|
||||
|
||||
simde__m128i mat_kj_128 = simde_mm_setr_epi32(mat_k[0], mat_k[1], mat_k[2], mat_k[3]);
|
||||
simde__m128 multiplication = simde_mm_mul_ps(mult_128, simde_mm_cvtepi32_ps(mat_kj_128));
|
||||
mat[1] = simde_mm_sub_epi32(mat[1], simde_mm_cvtps_epi32(multiplication));
|
||||
|
||||
mat_k = (int32_t *)&mat[2];
|
||||
mat_i = (int32_t *)&mat[3];
|
||||
|
||||
mult_128 = simde_mm_setr_ps((float)mat_i[0] / (float)mat_k[0],
|
||||
(float)mat_i[0] / (float)mat_k[0],
|
||||
(float)mat_i[0] / (float)mat_k[0],
|
||||
(float)mat_i[0] / (float)mat_k[0]);
|
||||
|
||||
mat_kj_128 = simde_mm_setr_epi32(mat_k[0], mat_k[1], mat_k[2], mat_k[3]);
|
||||
multiplication = simde_mm_mul_ps(mult_128, simde_mm_cvtepi32_ps(mat_kj_128));
|
||||
mat[3] = simde_mm_sub_epi32(mat[3], simde_mm_cvtps_epi32(multiplication));
|
||||
|
||||
} else if (row == 4 && col == 4) {
|
||||
|
||||
for (int k = 0; k < col; k++) {
|
||||
int32_t *mat_k = (int32_t *)&mat[k];
|
||||
|
||||
for (int i = k + 1; i < row; i++) {
|
||||
int32_t *mat_i = (int32_t *)&mat[i];
|
||||
|
||||
float mult = (float)mat_i[k] / (float)mat_k[k];
|
||||
if (isnan(mult))
|
||||
mult = 0;
|
||||
if (isinf(mult))
|
||||
mult = 0;
|
||||
|
||||
simde__m128 mult_128 = simde_mm_set1_ps(mult);
|
||||
simde__m128i mat_kj_128 = simde_mm_setr_epi32(mat_k[0], mat_k[1], mat_k[2], mat_k[3]);
|
||||
simde__m128 multiplication = simde_mm_mul_ps(mult_128, simde_mm_cvtepi32_ps(mat_kj_128));
|
||||
mat[i] = simde_mm_sub_epi32(mat[i], simde_mm_cvtps_epi32(multiplication));
|
||||
}
|
||||
}
|
||||
} else {
|
||||
AssertFatal(1 == 0, "matrix_rank_128bits() function is not implemented for row = %i and col = %i\n", row, col);
|
||||
}
|
||||
}
|
||||
|
||||
void nr_srs_ri_computation(const nfapi_nr_srs_normalized_channel_iq_matrix_t *nr_srs_normalized_channel_iq_matrix,
|
||||
@@ -57,12 +161,15 @@ void nr_srs_ri_computation(const nfapi_nr_srs_normalized_channel_iq_matrix_t *nr
|
||||
/* already mutex protected: held in handle_nr_srs_measurements() */
|
||||
NR_SCHED_ENSURE_LOCKED(&RC.nrmac[0]->sched_lock);
|
||||
|
||||
// If the gNB or UE has 1 antenna, the rank is always 1, i.e., *ul_ri = 0.
|
||||
// For 2x2 scenario, we compute the rank of channel.
|
||||
// The computation for 2x4, 4x2, 4x4, ... scenarios are not implemented yet. In these cases, the function sets *ul_ri = 0, which is always a valid value.
|
||||
if (!(nr_srs_normalized_channel_iq_matrix->num_gnb_antenna_elements == 2 &&
|
||||
nr_srs_normalized_channel_iq_matrix->num_ue_srs_ports == 2 &&
|
||||
current_BWP->pusch_Config && *current_BWP->pusch_Config->maxRank == 2)) {
|
||||
#ifdef SRS_DEBUG
|
||||
LOG_I(NR_MAC, "num_gnb_antenna_elements = %i\n", nr_srs_normalized_channel_iq_matrix->num_gnb_antenna_elements);
|
||||
LOG_I(NR_MAC, "num_ue_srs_ports = %i\n", nr_srs_normalized_channel_iq_matrix->num_ue_srs_ports);
|
||||
#endif
|
||||
|
||||
if (nr_srs_normalized_channel_iq_matrix->num_gnb_antenna_elements == 1 ||
|
||||
nr_srs_normalized_channel_iq_matrix->num_ue_srs_ports == 1 ||
|
||||
current_BWP->pusch_Config == NULL ||
|
||||
(current_BWP->pusch_Config && *current_BWP->pusch_Config->maxRank == 1)) {
|
||||
*ul_ri = 0;
|
||||
return;
|
||||
}
|
||||
@@ -70,75 +177,236 @@ void nr_srs_ri_computation(const nfapi_nr_srs_normalized_channel_iq_matrix_t *nr
|
||||
const c16_t *ch = (c16_t *)nr_srs_normalized_channel_iq_matrix->channel_matrix;
|
||||
const uint16_t num_gnb_antenna_elements = nr_srs_normalized_channel_iq_matrix->num_gnb_antenna_elements;
|
||||
const uint16_t num_prgs = nr_srs_normalized_channel_iq_matrix->num_prgs;
|
||||
const uint16_t base00_idx = 0 * num_gnb_antenna_elements * num_prgs + 0 * num_prgs; // Rx antenna 0, Tx port 0
|
||||
const uint16_t base01_idx = 1 * num_gnb_antenna_elements * num_prgs + 0 * num_prgs; // Rx antenna 0, Tx port 1
|
||||
const uint16_t base10_idx = 0 * num_gnb_antenna_elements * num_prgs + 1 * num_prgs; // Rx antenna 1, Tx port 0
|
||||
const uint16_t base11_idx = 1 * num_gnb_antenna_elements * num_prgs + 1 * num_prgs; // Rx antenna 1, Tx port 1
|
||||
const uint8_t bshift = 2;
|
||||
const int16_t cond_dB_threshold = 5;
|
||||
int count = 0;
|
||||
|
||||
for(int pI = 0; pI < num_prgs; pI++) {
|
||||
int row = num_gnb_antenna_elements;
|
||||
int col = nr_srs_normalized_channel_iq_matrix->num_ue_srs_ports;
|
||||
simde__m128i mat_real128[4];
|
||||
simde__m128i mat_imag128[4];
|
||||
simde__m128i sum_matrix[4];
|
||||
|
||||
/* Hh x H =
|
||||
* | conjch00 conjch10 | x | ch00 ch01 | = | conjch00*ch00+conjch10*ch10 conjch00*ch01+conjch10*ch11 |
|
||||
* | conjch01 conjch11 | | ch10 ch11 | | conjch01*ch00+conjch11*ch10 conjch01*ch01+conjch11*ch11 |
|
||||
*/
|
||||
if ((row == 2 && col == 2) || (row == 4 && col == 2)) {
|
||||
int array_lim = num_prgs >> 2;
|
||||
int antenna_rank[array_lim];
|
||||
int count = 0;
|
||||
|
||||
const c32_t ch00 = {ch[base00_idx + pI].r, ch[base00_idx + pI].i};
|
||||
const c32_t ch01 = {ch[base01_idx + pI].r, ch[base01_idx + pI].i};
|
||||
const c32_t ch10 = {ch[base10_idx + pI].r, ch[base10_idx + pI].i};
|
||||
const c32_t ch11 = {ch[base11_idx + pI].r, ch[base11_idx + pI].i};
|
||||
const uint16_t base00_idx = 0 * num_gnb_antenna_elements * num_prgs + 0 * num_prgs; // Rx antenna 0, Tx port 0
|
||||
const uint16_t base01_idx = 1 * num_gnb_antenna_elements * num_prgs + 0 * num_prgs; // Rx antenna 0, Tx port 1
|
||||
const uint16_t base10_idx = 0 * num_gnb_antenna_elements * num_prgs + 1 * num_prgs; // Rx antenna 1, Tx port 0
|
||||
const uint16_t base11_idx = 1 * num_gnb_antenna_elements * num_prgs + 1 * num_prgs; // Rx antenna 1, Tx port 1
|
||||
|
||||
c16_t HhxH00 = {(int16_t)((ch00.r * ch00.r + ch00.i * ch00.i + ch10.r * ch10.r + ch10.i * ch10.i) >> bshift),
|
||||
(int16_t)((ch00.r * ch00.i - ch00.i * ch00.r + ch10.r * ch10.i - ch10.i * ch10.r) >> bshift)};
|
||||
for (int pI = 0; pI < num_prgs; pI += 4) {
|
||||
uint16_t pI00 = pI + base00_idx;
|
||||
uint16_t pI10 = pI + base10_idx;
|
||||
uint16_t pI01 = pI + base01_idx;
|
||||
uint16_t pI11 = pI + base11_idx;
|
||||
mat_real128[0] = simde_mm_setr_epi32(ch[pI00].r, ch[pI10].r, ch[pI00 + 1].r, ch[pI10 + 1].r);
|
||||
mat_real128[1] = simde_mm_setr_epi32(ch[pI01].r, ch[pI11].r, ch[pI01 + 1].r, ch[pI11 + 1].r);
|
||||
mat_real128[2] = simde_mm_setr_epi32(ch[pI00 + 2].r, ch[pI10 + 2].r, ch[pI00 + 3].r, ch[pI10 + 3].r);
|
||||
mat_real128[3] = simde_mm_setr_epi32(ch[pI01 + 2].r, ch[pI11 + 2].r, ch[pI01 + 3].r, ch[pI11 + 3].r);
|
||||
mat_imag128[0] = simde_mm_setr_epi32(ch[pI00].i, ch[pI10].i, ch[pI00 + 1].i, ch[pI10 + 1].i);
|
||||
mat_imag128[1] = simde_mm_setr_epi32(ch[pI01].i, ch[pI11].i, ch[pI01 + 1].i, ch[pI11 + 1].i);
|
||||
mat_imag128[2] = simde_mm_setr_epi32(ch[pI00 + 2].i, ch[pI10 + 2].i, ch[pI00 + 3].i, ch[pI10 + 3].i);
|
||||
mat_imag128[3] = simde_mm_setr_epi32(ch[pI01 + 2].i, ch[pI11 + 2].i, ch[pI01 + 3].i, ch[pI11 + 3].i);
|
||||
|
||||
c16_t HhxH01 = {(int16_t)((ch00.r * ch01.r + ch00.i * ch01.i + ch10.r * ch11.r + ch10.i * ch11.i) >> bshift),
|
||||
(int16_t)((ch00.r * ch01.i - ch00.i * ch01.r + ch10.r * ch11.i - ch10.i * ch11.r) >> bshift)};
|
||||
matrix_rank_128bits(row, col, mat_real128);
|
||||
matrix_rank_128bits(row, col, mat_imag128);
|
||||
|
||||
c16_t HhxH10 = {(int16_t)((ch01.r * ch00.r + ch01.i * ch00.i + ch11.r * ch10.r + ch11.i * ch10.i) >> bshift),
|
||||
(int16_t)((ch01.r * ch00.i - ch01.i * ch00.r + ch11.r * ch10.i - ch11.i * ch10.r) >> bshift)};
|
||||
sum_matrix[0] = simde_mm_add_epi32(mat_real128[0], mat_imag128[0]);
|
||||
sum_matrix[1] = simde_mm_add_epi32(mat_real128[1], mat_imag128[1]);
|
||||
sum_matrix[2] = simde_mm_add_epi32(mat_real128[2], mat_imag128[2]);
|
||||
sum_matrix[3] = simde_mm_add_epi32(mat_real128[3], mat_imag128[3]);
|
||||
|
||||
c16_t HhxH11 = {(int16_t)((ch01.r * ch01.r + ch01.i * ch01.i + ch11.r * ch11.r + ch11.i * ch11.i) >> bshift),
|
||||
(int16_t)((ch01.r * ch01.i - ch01.i * ch01.r + ch11.r * ch11.i - ch11.i * ch11.r) >> bshift)};
|
||||
#ifdef SRS_DEBUG
|
||||
LOG_I(NR_MAC, "\nSum matrix\n");
|
||||
print128_number(sum_matrix[0]);
|
||||
print128_number(sum_matrix[1]);
|
||||
print128_number(sum_matrix[2]);
|
||||
print128_number(sum_matrix[3]);
|
||||
#endif
|
||||
|
||||
int8_t det_HhxH_dB = dB_fixed(HhxH00.r * HhxH11.r - HhxH00.i * HhxH11.i - HhxH01.r * HhxH10.r + HhxH01.i * HhxH10.i);
|
||||
int count_pivots = 0;
|
||||
|
||||
int8_t norm_HhxH_2_dB = dB_fixed(max4(HhxH00.r*HhxH00.r + HhxH00.i*HhxH00.i,
|
||||
HhxH01.r*HhxH01.r + HhxH01.i*HhxH01.i,
|
||||
HhxH10.r*HhxH10.r + HhxH10.i*HhxH10.i,
|
||||
HhxH11.r*HhxH11.r + HhxH11.i*HhxH11.i));
|
||||
int32_t *sum_matrix_i = (int32_t *)&sum_matrix[1];
|
||||
if (sum_matrix_i[1] != 0)
|
||||
count_pivots++;
|
||||
if (sum_matrix_i[3] != 0)
|
||||
count_pivots++;
|
||||
|
||||
int8_t cond_db = norm_HhxH_2_dB - det_HhxH_dB;
|
||||
sum_matrix_i = (int32_t *)&sum_matrix[3];
|
||||
if (sum_matrix_i[1] != 0)
|
||||
count_pivots++;
|
||||
if (sum_matrix_i[3] != 0)
|
||||
count_pivots++;
|
||||
|
||||
if (cond_db < cond_dB_threshold) {
|
||||
antenna_rank[count] = count_pivots / 4;
|
||||
count++;
|
||||
}
|
||||
*ul_ri = most_frequent_ri(antenna_rank, array_lim);
|
||||
|
||||
} else if (row == 2 && col == 4) {
|
||||
|
||||
int array_lim = num_prgs >> 1;
|
||||
int antenna_rank[array_lim];
|
||||
int count = 0;
|
||||
|
||||
const uint16_t base00_idx = 0 * num_gnb_antenna_elements * num_prgs + 0 * num_prgs; // Rx antenna 0, Tx port 0
|
||||
const uint16_t base10_idx = 1 * num_gnb_antenna_elements * num_prgs + 0 * num_prgs; // Rx antenna 1, Tx port 0
|
||||
const uint16_t base20_idx = 2 * num_gnb_antenna_elements * num_prgs + 0 * num_prgs; // Rx antenna 2, Tx port 0
|
||||
const uint16_t base30_idx = 3 * num_gnb_antenna_elements * num_prgs + 0 * num_prgs; // Rx antenna 3, Tx port 0
|
||||
|
||||
const uint16_t base01_idx = 0 * num_gnb_antenna_elements * num_prgs + 1 * num_prgs; // Rx antenna 0, Tx port 1
|
||||
const uint16_t base11_idx = 1 * num_gnb_antenna_elements * num_prgs + 1 * num_prgs; // Rx antenna 1, Tx port 1
|
||||
const uint16_t base21_idx = 2 * num_gnb_antenna_elements * num_prgs + 1 * num_prgs; // Rx antenna 2, Tx port 1
|
||||
const uint16_t base31_idx = 3 * num_gnb_antenna_elements * num_prgs + 1 * num_prgs; // Rx antenna 3, Tx port 1
|
||||
|
||||
for (int pI = 0; pI < num_prgs; pI += 2) {
|
||||
|
||||
mat_real128[0] = simde_mm_setr_epi32(ch[base00_idx + pI].r,
|
||||
ch[base10_idx + pI].r,
|
||||
ch[base20_idx + pI].r,
|
||||
ch[base30_idx + pI].r);
|
||||
mat_real128[1] = simde_mm_setr_epi32(ch[base01_idx + pI].r,
|
||||
ch[base11_idx + pI].r,
|
||||
ch[base21_idx + pI].r,
|
||||
ch[base31_idx + pI].r);
|
||||
mat_real128[2] = simde_mm_setr_epi32(ch[base00_idx + (pI + 1)].r,
|
||||
ch[base10_idx + (pI + 1)].r,
|
||||
ch[base20_idx + (pI + 1)].r,
|
||||
ch[base30_idx + (pI + 1)].r);
|
||||
mat_real128[3] = simde_mm_setr_epi32(ch[base01_idx + (pI + 1)].r,
|
||||
ch[base11_idx + (pI + 1)].r,
|
||||
ch[base21_idx + (pI + 1)].r,
|
||||
ch[base31_idx + (pI + 1)].r);
|
||||
|
||||
mat_imag128[0] = simde_mm_setr_epi32(ch[base00_idx + pI].i,
|
||||
ch[base10_idx + pI].i,
|
||||
ch[base20_idx + pI].i,
|
||||
ch[base30_idx + pI].i);
|
||||
mat_imag128[1] = simde_mm_setr_epi32(ch[base01_idx + pI].i,
|
||||
ch[base11_idx + pI].i,
|
||||
ch[base21_idx + pI].i,
|
||||
ch[base31_idx + pI].i);
|
||||
mat_imag128[2] = simde_mm_setr_epi32(ch[base00_idx + (pI + 1)].i,
|
||||
ch[base10_idx + (pI + 1)].i,
|
||||
ch[base20_idx + (pI + 1)].i,
|
||||
ch[base30_idx + (pI + 1)].i);
|
||||
mat_imag128[3] = simde_mm_setr_epi32(ch[base01_idx + (pI + 1)].i,
|
||||
ch[base11_idx + (pI + 1)].i,
|
||||
ch[base21_idx + (pI + 1)].i,
|
||||
ch[base31_idx + (pI + 1)].i);
|
||||
|
||||
matrix_rank_128bits(row, col, mat_real128);
|
||||
matrix_rank_128bits(row, col, mat_imag128);
|
||||
|
||||
sum_matrix[0] = simde_mm_add_epi32(mat_real128[0], mat_imag128[0]);
|
||||
sum_matrix[1] = simde_mm_add_epi32(mat_real128[1], mat_imag128[1]);
|
||||
sum_matrix[2] = simde_mm_add_epi32(mat_real128[2], mat_imag128[2]);
|
||||
sum_matrix[3] = simde_mm_add_epi32(mat_real128[3], mat_imag128[3]);
|
||||
|
||||
#ifdef SRS_DEBUG
|
||||
LOG_I(NR_MAC, "\nSum matrix\n");
|
||||
print128_number(sum_matrix[0]);
|
||||
print128_number(sum_matrix[1]);
|
||||
print128_number(sum_matrix[2]);
|
||||
print128_number(sum_matrix[3]);
|
||||
#endif
|
||||
|
||||
int count_pivots = 0;
|
||||
|
||||
int32_t *sum_matrix_i = (int32_t *)&sum_matrix[1];
|
||||
if (sum_matrix_i[1] != 0)
|
||||
count_pivots++;
|
||||
if (sum_matrix_i[3] != 0)
|
||||
count_pivots++;
|
||||
|
||||
sum_matrix_i = (int32_t *)&sum_matrix[3];
|
||||
if (sum_matrix_i[1] != 0)
|
||||
count_pivots++;
|
||||
if (sum_matrix_i[3] != 0)
|
||||
count_pivots++;
|
||||
|
||||
antenna_rank[count] = count_pivots / 2;
|
||||
count++;
|
||||
} else {
|
||||
count--;
|
||||
}
|
||||
|
||||
#ifdef SRS_DEBUG
|
||||
LOG_I(NR_MAC, "H00[%i] = %i + j(%i)\n", pI, ch[base00_idx+pI].r, ch[base00_idx+pI].i);
|
||||
LOG_I(NR_MAC, "H01[%i] = %i + j(%i)\n", pI, ch[base01_idx+pI].r, ch[base01_idx+pI].i);
|
||||
LOG_I(NR_MAC, "H10[%i] = %i + j(%i)\n", pI, ch[base10_idx+pI].r, ch[base10_idx+pI].i);
|
||||
LOG_I(NR_MAC, "H11[%i] = %i + j(%i)\n", pI, ch[base11_idx+pI].r, ch[base11_idx+pI].i);
|
||||
LOG_I(NR_MAC, "HhxH00[%i] = %i + j(%i)\n", pI, HhxH00.r, HhxH00.i);
|
||||
LOG_I(NR_MAC, "HhxH01[%i] = %i + j(%i)\n", pI, HhxH01.r, HhxH01.i);
|
||||
LOG_I(NR_MAC, "HhxH10[%i] = %i + j(%i)\n", pI, HhxH10.r, HhxH10.i);
|
||||
LOG_I(NR_MAC, "HhxH11[%i] = %i + j(%i)\n", pI, HhxH11.r, HhxH11.i);
|
||||
LOG_I(NR_MAC, "det_HhxH[%i] = %i\n", pI, det_HhxH_dB);
|
||||
LOG_I(NR_MAC, "norm_HhxH_2_dB[%i] = %i\n", pI, norm_HhxH_2_dB);
|
||||
#endif
|
||||
}
|
||||
int rr = most_frequent_ri(antenna_rank, array_lim);
|
||||
if (rr == 0 || rr == 1)
|
||||
*ul_ri = 0;
|
||||
if (rr > 1)
|
||||
*ul_ri = 1;
|
||||
|
||||
if (count > 0) {
|
||||
*ul_ri = 1;
|
||||
}
|
||||
} else if (row == 4 && col == 4) {
|
||||
|
||||
int antenna_rank[num_prgs];
|
||||
int count = 0;
|
||||
|
||||
const uint16_t base00_idx = 0 * num_gnb_antenna_elements * num_prgs + 0 * num_prgs; // Rx antenna 0, Tx port 0
|
||||
const uint16_t base10_idx = 1 * num_gnb_antenna_elements * num_prgs + 0 * num_prgs; // Rx antenna 1, Tx port 0
|
||||
const uint16_t base20_idx = 2 * num_gnb_antenna_elements * num_prgs + 0 * num_prgs; // Rx antenna 2, Tx port 0
|
||||
const uint16_t base30_idx = 3 * num_gnb_antenna_elements * num_prgs + 0 * num_prgs; // Rx antenna 3, Tx port 0
|
||||
|
||||
const uint16_t base01_idx = 0 * num_gnb_antenna_elements * num_prgs + 1 * num_prgs; // Rx antenna 0, Tx port 1
|
||||
const uint16_t base11_idx = 1 * num_gnb_antenna_elements * num_prgs + 1 * num_prgs; // Rx antenna 1, Tx port 1
|
||||
const uint16_t base21_idx = 2 * num_gnb_antenna_elements * num_prgs + 1 * num_prgs; // Rx antenna 2, Tx port 1
|
||||
const uint16_t base31_idx = 3 * num_gnb_antenna_elements * num_prgs + 1 * num_prgs; // Rx antenna 3, Tx port 1
|
||||
|
||||
const uint16_t base02_idx = 0 * num_gnb_antenna_elements * num_prgs + 2 * num_prgs; // Rx antenna 0, Tx port 2
|
||||
const uint16_t base12_idx = 1 * num_gnb_antenna_elements * num_prgs + 2 * num_prgs; // Rx antenna 1, Tx port 2
|
||||
const uint16_t base22_idx = 2 * num_gnb_antenna_elements * num_prgs + 2 * num_prgs; // Rx antenna 2, Tx port 2
|
||||
const uint16_t base32_idx = 3 * num_gnb_antenna_elements * num_prgs + 2 * num_prgs; // Rx antenna 3, Tx port 2
|
||||
|
||||
const uint16_t base03_idx = 0 * num_gnb_antenna_elements * num_prgs + 3 * num_prgs; // Rx antenna 0, Tx port 3
|
||||
const uint16_t base13_idx = 1 * num_gnb_antenna_elements * num_prgs + 3 * num_prgs; // Rx antenna 1, Tx port 3
|
||||
const uint16_t base23_idx = 2 * num_gnb_antenna_elements * num_prgs + 3 * num_prgs; // Rx antenna 2, Tx port 3
|
||||
const uint16_t base33_idx = 3 * num_gnb_antenna_elements * num_prgs + 3 * num_prgs; // Rx antenna 3, Tx port 3
|
||||
|
||||
for (int pI = 0; pI < num_prgs; pI++) {
|
||||
mat_real128[0] = simde_mm_setr_epi32(ch[base00_idx + pI].r, ch[base10_idx + pI].r, ch[base20_idx + pI].r, ch[base30_idx + pI].r);
|
||||
mat_real128[1] = simde_mm_setr_epi32(ch[base01_idx + pI].r, ch[base11_idx + pI].r, ch[base21_idx + pI].r, ch[base31_idx + pI].r);
|
||||
mat_real128[2] = simde_mm_setr_epi32(ch[base02_idx + pI].r, ch[base12_idx + pI].r, ch[base22_idx + pI].r, ch[base32_idx + pI].r);
|
||||
mat_real128[3] = simde_mm_setr_epi32(ch[base03_idx + pI].r, ch[base13_idx + pI].r, ch[base23_idx + pI].r, ch[base33_idx + pI].r);
|
||||
|
||||
mat_imag128[0] = simde_mm_setr_epi32(ch[base00_idx + pI].i, ch[base10_idx + pI].i, ch[base20_idx + pI].i, ch[base30_idx + pI].i);
|
||||
mat_imag128[1] = simde_mm_setr_epi32(ch[base01_idx + pI].i, ch[base11_idx + pI].i, ch[base21_idx + pI].i, ch[base31_idx + pI].i);
|
||||
mat_imag128[2] = simde_mm_setr_epi32(ch[base02_idx + pI].i, ch[base12_idx + pI].i, ch[base22_idx + pI].i, ch[base32_idx + pI].i);
|
||||
mat_imag128[3] = simde_mm_setr_epi32(ch[base03_idx + pI].i, ch[base13_idx + pI].i, ch[base23_idx + pI].i, ch[base33_idx + pI].i);
|
||||
|
||||
matrix_rank_128bits(row, col, mat_real128);
|
||||
matrix_rank_128bits(row, col, mat_imag128);
|
||||
|
||||
sum_matrix[0] = simde_mm_add_epi32(mat_real128[0], mat_imag128[0]);
|
||||
sum_matrix[1] = simde_mm_add_epi32(mat_real128[1], mat_imag128[1]);
|
||||
sum_matrix[2] = simde_mm_add_epi32(mat_real128[2], mat_imag128[2]);
|
||||
sum_matrix[3] = simde_mm_add_epi32(mat_real128[3], mat_imag128[3]);
|
||||
|
||||
#ifdef SRS_DEBUG
|
||||
LOG_I(NR_MAC, "ul_ri = %i (count = %i)\n", (*ul_ri)+1, count);
|
||||
LOG_I(NR_MAC, "\nSum matrix\n");
|
||||
print128_number(sum_matrix[0]);
|
||||
print128_number(sum_matrix[1]);
|
||||
print128_number(sum_matrix[2]);
|
||||
print128_number(sum_matrix[3]);
|
||||
#endif
|
||||
|
||||
int count_pivots = 0;
|
||||
for (int i = 0; i < row; i++) {
|
||||
int32_t *sum_matrix_i = (int32_t *)&sum_matrix[i];
|
||||
|
||||
int found_piv = 0;
|
||||
for (int j = 0; j < col; j++) {
|
||||
if (sum_matrix_i[j] != 0 && found_piv == 0) {
|
||||
count_pivots++;
|
||||
found_piv = 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
antenna_rank[count] = count_pivots;
|
||||
count++;
|
||||
}
|
||||
*ul_ri = most_frequent_ri(antenna_rank, num_prgs) - 1;
|
||||
|
||||
} else {
|
||||
AssertFatal(1 == 0, "nr_srs_ri_computation() function is not implemented for row = %i and col = %i\n", row, col);
|
||||
}
|
||||
}
|
||||
|
||||
static void nr_configure_srs(nfapi_nr_srs_pdu_t *srs_pdu,
|
||||
|
||||
@@ -1011,6 +1011,8 @@ void handle_nr_uci_pucch_0_1(module_id_t mod_id,
|
||||
remove_front_nr_list(&sched_ctrl->feedback_dl_harq);
|
||||
LOG_D(NR_MAC,"%4d.%2d bit %d pid %d ack/nack %d\n",frame, slot, harq_bit,pid,harq_value);
|
||||
handle_dl_harq(UE, pid, harq_value == 0 && harq_confidence == 0, nrmac->dl_bler.harq_round_max);
|
||||
if (!UE->Msg4_ACKed && harq_value == 0 && harq_confidence == 0)
|
||||
UE->Msg4_ACKed = true;
|
||||
if (harq_confidence == 1) UE->mac_stats.pucch0_DTX++;
|
||||
}
|
||||
|
||||
|
||||
@@ -795,6 +795,9 @@ static void _nr_rx_sdu(const module_id_t gnb_mod_idP,
|
||||
LOG_W(NR_MAC, "No UE found with C-RNTI %04x, ignoring Msg.3 to have UE come back with new RA attempt\n", ra->rnti);
|
||||
return;
|
||||
} else {
|
||||
// Reset Msg4_ACKed to not schedule ULSCH and DLSCH before RRC Reconfiguration
|
||||
UE_C->Msg4_ACKed = false;
|
||||
|
||||
// The UE identified by C-RNTI still exists at the gNB
|
||||
nr_mac_reset_ul_failure(&UE_C->UE_sched_ctrl);
|
||||
|
||||
@@ -1316,8 +1319,11 @@ void handle_nr_srs_measurements(const module_id_t module_id,
|
||||
NR_UE_UL_BWP_t *current_BWP = &UE->current_UL_BWP;
|
||||
sched_ctrl->srs_feedback.sri = NR_SRS_SRI_0;
|
||||
|
||||
start_meas(&nr_mac->nr_srs_ri_computation_timer);
|
||||
nr_srs_ri_computation(&nr_srs_channel_iq_matrix, current_BWP, &sched_ctrl->srs_feedback.ul_ri);
|
||||
stop_meas(&nr_mac->nr_srs_ri_computation_timer);
|
||||
|
||||
start_meas(&nr_mac->nr_srs_tpmi_computation_timer);
|
||||
sched_ctrl->srs_feedback.tpmi = nr_srs_tpmi_estimation(current_BWP->pusch_Config,
|
||||
current_BWP->transform_precoding,
|
||||
nr_srs_channel_iq_matrix.channel_matrix,
|
||||
@@ -1327,6 +1333,7 @@ void handle_nr_srs_measurements(const module_id_t module_id,
|
||||
nr_srs_channel_iq_matrix.prg_size,
|
||||
nr_srs_channel_iq_matrix.num_prgs,
|
||||
sched_ctrl->srs_feedback.ul_ri);
|
||||
stop_meas(&nr_mac->nr_srs_tpmi_computation_timer);
|
||||
|
||||
sprintf(stats->srs_stats, "UL-RI %d, TPMI %d", sched_ctrl->srs_feedback.ul_ri + 1, sched_ctrl->srs_feedback.tpmi);
|
||||
|
||||
|
||||
@@ -369,7 +369,8 @@ void ue_context_modification_request(const f1ap_ue_context_modif_req_t *req)
|
||||
update_cellGroupConfig(new_CellGroup, UE->uid, UE->capability, &mac->radio_config, scc);
|
||||
}
|
||||
|
||||
if (req->srbs_to_be_setup_length > 0 || req->drbs_to_be_setup_length > 0 || req->drbs_to_be_released_length > 0) {
|
||||
if (req->srbs_to_be_setup_length > 0 || req->drbs_to_be_setup_length > 0 || req->drbs_to_be_released_length > 0
|
||||
|| ue_cap != NULL) {
|
||||
resp.du_to_cu_rrc_information = calloc(1, sizeof(du_to_cu_rrc_information_t));
|
||||
AssertFatal(resp.du_to_cu_rrc_information != NULL, "out of memory\n");
|
||||
resp.du_to_cu_rrc_information->cellGroupConfig = calloc(1, 1024);
|
||||
|
||||
@@ -69,6 +69,8 @@ void *nrmac_stats_thread(void *arg) {
|
||||
p += print_meas_log(&gNB->schedule_dlsch, "dlsch scheduler", NULL, NULL, p, end - p);
|
||||
p += print_meas_log(&gNB->rlc_data_req, "rlc_data_req", NULL, NULL, p, end - p);
|
||||
p += print_meas_log(&gNB->rlc_status_ind, "rlc_status_ind", NULL, NULL, p, end - p);
|
||||
p += print_meas_log(&gNB->nr_srs_ri_computation_timer, "UL-RI computation time", NULL, NULL, p, end - p);
|
||||
p += print_meas_log(&gNB->nr_srs_tpmi_computation_timer, "UL-TPMI computation time", NULL, NULL, p, end - p);
|
||||
fwrite(output, p - output, 1, file);
|
||||
fflush(file);
|
||||
sleep(1);
|
||||
|
||||
@@ -806,6 +806,10 @@ typedef struct gNB_MAC_INST_s {
|
||||
time_stats_t rlc_data_req;
|
||||
/// processing time of rlc_status_ind
|
||||
time_stats_t rlc_status_ind;
|
||||
/// processing time of nr_srs_ri_computation
|
||||
time_stats_t nr_srs_ri_computation_timer;
|
||||
/// processing time of nr_srs_tpmi_estimation
|
||||
time_stats_t nr_srs_tpmi_computation_timer;
|
||||
/// processing time of eNB MCH scheduler
|
||||
time_stats_t schedule_mch;
|
||||
/// processing time of eNB ULSCH reception
|
||||
|
||||
@@ -369,7 +369,7 @@ void nr_pdcp_entity_set_time(struct nr_pdcp_entity_t *entity, uint64_t now)
|
||||
check_t_reordering(entity);
|
||||
}
|
||||
|
||||
void nr_pdcp_entity_release(nr_pdcp_entity_t *entity)
|
||||
static void deliver_all_sdus(nr_pdcp_entity_t *entity)
|
||||
{
|
||||
// deliver the PDCP SDUs stored in the receiving PDCP entity to upper layers
|
||||
while (entity->rx_list != NULL) {
|
||||
@@ -384,6 +384,22 @@ void nr_pdcp_entity_release(nr_pdcp_entity_t *entity)
|
||||
}
|
||||
}
|
||||
|
||||
void nr_pdcp_entity_suspend(nr_pdcp_entity_t *entity)
|
||||
{
|
||||
entity->tx_next = 0;
|
||||
if (entity->t_reordering_start != 0) {
|
||||
entity->t_reordering_start = 0;
|
||||
deliver_all_sdus(entity);
|
||||
}
|
||||
entity->rx_next = 0;
|
||||
entity->rx_deliv = 0;
|
||||
}
|
||||
|
||||
void nr_pdcp_entity_release(nr_pdcp_entity_t *entity)
|
||||
{
|
||||
deliver_all_sdus(entity);
|
||||
}
|
||||
|
||||
void nr_pdcp_entity_delete(nr_pdcp_entity_t *entity)
|
||||
{
|
||||
nr_pdcp_sdu_t *cur = entity->rx_list;
|
||||
@@ -444,6 +460,7 @@ nr_pdcp_entity_t *new_nr_pdcp_entity(
|
||||
|
||||
ret->delete_entity = nr_pdcp_entity_delete;
|
||||
ret->release_entity = nr_pdcp_entity_release;
|
||||
ret->suspend_entity = nr_pdcp_entity_suspend;
|
||||
|
||||
ret->get_stats = nr_pdcp_entity_get_stats;
|
||||
ret->deliver_sdu = deliver_sdu;
|
||||
|
||||
@@ -77,6 +77,7 @@ typedef struct nr_pdcp_entity_t {
|
||||
int sdu_id, char *pdu_buffer, int pdu_max_size);
|
||||
void (*delete_entity)(struct nr_pdcp_entity_t *entity);
|
||||
void (*release_entity)(struct nr_pdcp_entity_t *entity);
|
||||
void (*suspend_entity)(struct nr_pdcp_entity_t *entity);
|
||||
void (*get_stats)(struct nr_pdcp_entity_t *entity, nr_pdcp_statistics_t *out);
|
||||
|
||||
/* set_security: pass -1 to integrity_algorithm / ciphering_algorithm
|
||||
|
||||
@@ -1057,6 +1057,32 @@ bool nr_pdcp_data_req_srb(ue_id_t ue_id,
|
||||
return 1;
|
||||
}
|
||||
|
||||
void nr_pdcp_suspend_srb(ue_id_t ue_id, int srb_id)
|
||||
{
|
||||
nr_pdcp_manager_lock(nr_pdcp_ue_manager);
|
||||
nr_pdcp_ue_t *ue = nr_pdcp_manager_get_ue(nr_pdcp_ue_manager, ue_id);
|
||||
nr_pdcp_entity_t *srb = ue->srb[srb_id - 1];
|
||||
if (srb == NULL) {
|
||||
LOG_E(PDCP, "Trying to susbend SRB with ID %d but it is not established\n", srb_id);
|
||||
return;
|
||||
}
|
||||
srb->suspend_entity(srb);
|
||||
nr_pdcp_manager_unlock(nr_pdcp_ue_manager);
|
||||
}
|
||||
|
||||
void nr_pdcp_suspend_drb(ue_id_t ue_id, int drb_id)
|
||||
{
|
||||
nr_pdcp_manager_lock(nr_pdcp_ue_manager);
|
||||
nr_pdcp_ue_t *ue = nr_pdcp_manager_get_ue(nr_pdcp_ue_manager, ue_id);
|
||||
nr_pdcp_entity_t *drb = ue->drb[drb_id - 1];
|
||||
if (drb == NULL) {
|
||||
LOG_E(PDCP, "Trying to susbend DRB with ID %d but it is not established\n", drb_id);
|
||||
return;
|
||||
}
|
||||
drb->suspend_entity(drb);
|
||||
nr_pdcp_manager_unlock(nr_pdcp_ue_manager);
|
||||
}
|
||||
|
||||
void nr_pdcp_reconfigure_srb(ue_id_t ue_id, int srb_id, long t_Reordering)
|
||||
{
|
||||
nr_pdcp_manager_lock(nr_pdcp_ue_manager);
|
||||
|
||||
@@ -66,6 +66,8 @@ void nr_DRB_preconfiguration(ue_id_t crntiMaybeUEid);
|
||||
bool nr_pdcp_remove_UE(ue_id_t ue_id);
|
||||
void nr_pdcp_reestablishment(ue_id_t ue_id);
|
||||
|
||||
void nr_pdcp_suspend_srb(ue_id_t ue_id, int srb_id);
|
||||
void nr_pdcp_suspend_drb(ue_id_t ue_id, int drb_id);
|
||||
void nr_pdcp_reconfigure_srb(ue_id_t ue_id, int srb_id, long t_Reordering);
|
||||
void nr_pdcp_reconfigure_drb(ue_id_t ue_id, int drb_id, long t_Reordering);
|
||||
void nr_pdcp_release_srb(ue_id_t ue_id, int srb_id);
|
||||
|
||||
@@ -269,7 +269,7 @@ static int get_ssb_arfcn(const f1ap_served_cell_info_t *cell_info, const NR_MIB_
|
||||
// taken out (but the reestablishment will likely not work).
|
||||
const NR_ServingCellConfigCommon_t *scc = RC.nrmac[0]->common_channels[0].ServingCellConfigCommon;
|
||||
uint32_t scc_ssb_arfcn = *scc->downlinkConfigCommon->frequencyInfoDL->absoluteFrequencySSB;
|
||||
AssertFatal(ssb_arfcn == scc_ssb_arfcn, "fuck: SCC SSB ARFCN original %d vs. computed %d\n", scc_ssb_arfcn, ssb_arfcn);
|
||||
AssertFatal(ssb_arfcn == scc_ssb_arfcn, "mismatch of SCC SSB ARFCN original %d vs. computed %d! Note: you can remove this Assert, the gNB might run but UE connection instable\n", scc_ssb_arfcn, ssb_arfcn);
|
||||
}
|
||||
|
||||
return ssb_arfcn;
|
||||
@@ -2077,7 +2077,6 @@ static void rrc_CU_process_ue_context_modification_response(MessageDef *msg_p, i
|
||||
}
|
||||
|
||||
if (resp->du_to_cu_rrc_information != NULL && resp->du_to_cu_rrc_information->cellGroupConfig != NULL) {
|
||||
LOG_W(RRC, "UE context modification response contains new CellGroupConfig for UE %04x, triggering reconfiguration\n", UE->rnti);
|
||||
NR_CellGroupConfig_t *cellGroupConfig = NULL;
|
||||
asn_dec_rval_t dec_rval = uper_decode_complete(NULL,
|
||||
&asn_DEF_NR_CellGroupConfig,
|
||||
|
||||
@@ -27,46 +27,49 @@
|
||||
|
||||
extern char *baseNetAddress;
|
||||
|
||||
static uint16_t getShort(uint8_t *input)
|
||||
{
|
||||
uint16_t tmp16;
|
||||
memcpy(&tmp16, input, sizeof(tmp16));
|
||||
return htons(tmp16);
|
||||
}
|
||||
|
||||
void capture_pdu_session_establishment_accept_msg(uint8_t *buffer, uint32_t msg_length)
|
||||
{
|
||||
uint8_t offset = 0;
|
||||
security_protected_nas_5gs_msg_t sec_nas_hdr;
|
||||
security_protected_plain_nas_5gs_msg_t sec_nas_msg;
|
||||
pdu_session_establishment_accept_msg_t psea_msg;
|
||||
sec_nas_hdr.epd = *(buffer + (offset++));
|
||||
sec_nas_hdr.sht = *(buffer + (offset++));
|
||||
uint8_t *curPtr = buffer;
|
||||
sec_nas_hdr.epd = *curPtr++;
|
||||
sec_nas_hdr.sht = *curPtr++;
|
||||
uint32_t tmp;
|
||||
memcpy(&tmp, buffer + offset, sizeof(tmp));
|
||||
memcpy(&tmp, buffer, sizeof(tmp));
|
||||
sec_nas_hdr.mac = htonl(tmp);
|
||||
offset+=sizeof(sec_nas_hdr.mac);
|
||||
sec_nas_hdr.sqn = *(buffer + (offset++));
|
||||
sec_nas_msg.epd = *(buffer + (offset++));
|
||||
sec_nas_msg.sht = *(buffer + (offset++));
|
||||
sec_nas_msg.msg_type = *(buffer + (offset++));
|
||||
sec_nas_msg.payload_type = *(buffer + (offset++));
|
||||
uint16_t tmp16;
|
||||
memcpy(&tmp16, buffer + offset, sizeof(tmp16));
|
||||
sec_nas_msg.payload_len = htons(tmp16);
|
||||
offset+=sizeof(sec_nas_msg.payload_len);
|
||||
curPtr += sizeof(sec_nas_hdr.mac);
|
||||
sec_nas_hdr.sqn = *curPtr++;
|
||||
sec_nas_msg.epd = *curPtr++;
|
||||
sec_nas_msg.sht = *curPtr++;
|
||||
sec_nas_msg.msg_type = *curPtr++;
|
||||
sec_nas_msg.payload_type = *curPtr++;
|
||||
sec_nas_msg.payload_len = getShort(curPtr);
|
||||
curPtr += sizeof(sec_nas_msg.payload_len);
|
||||
/* Mandatory Presence IEs */
|
||||
psea_msg.epd = *(buffer + (offset++));
|
||||
psea_msg.pdu_id = *(buffer + (offset++));
|
||||
psea_msg.pti = *(buffer + (offset++));
|
||||
psea_msg.msg_type = *(buffer + (offset++));
|
||||
psea_msg.pdu_type = *(buffer + offset) & 0x0f;
|
||||
psea_msg.ssc_mode = (*(buffer + (offset++)) & 0xf0) >> 4;
|
||||
memcpy(&tmp16, buffer + offset, sizeof(tmp16));
|
||||
psea_msg.qos_rules.length = htons(tmp16);
|
||||
offset+=sizeof(psea_msg.qos_rules.length);
|
||||
psea_msg.epd = *curPtr++;
|
||||
psea_msg.pdu_id = *curPtr++;
|
||||
psea_msg.pti = *curPtr++;
|
||||
psea_msg.msg_type = *curPtr++;
|
||||
psea_msg.pdu_type = *curPtr & 0x0f;
|
||||
psea_msg.ssc_mode = (*curPtr++ & 0xf0) >> 4;
|
||||
psea_msg.qos_rules.length = getShort(curPtr);
|
||||
curPtr += sizeof(psea_msg.qos_rules.length);
|
||||
/* Supports the capture of only one QoS Rule, it should be changed for multiple QoS Rules */
|
||||
qos_rule_t qos_rule;
|
||||
qos_rule.id = *(buffer + (offset++));
|
||||
memcpy(&tmp16, buffer + offset, sizeof(tmp16));
|
||||
qos_rule.length = htons(tmp16);
|
||||
offset+=sizeof(qos_rule.length);
|
||||
qos_rule.oc = (*(buffer + offset) & 0xE0) >> 5;
|
||||
qos_rule.dqr = (*(buffer + offset) & 0x10) >> 4;
|
||||
qos_rule.nb_pf = *(buffer + (offset++)) & 0x0F;
|
||||
qos_rule.id = *curPtr++;
|
||||
qos_rule.length = getShort(curPtr);
|
||||
curPtr += sizeof(qos_rule.length);
|
||||
qos_rule.oc = (*(curPtr)&0xE0) >> 5;
|
||||
qos_rule.dqr = (*(curPtr)&0x10) >> 4;
|
||||
qos_rule.nb_pf = *curPtr++ & 0x0F;
|
||||
|
||||
if(qos_rule.nb_pf) {
|
||||
packet_filter_t pf;
|
||||
@@ -74,40 +77,39 @@ void capture_pdu_session_establishment_accept_msg(uint8_t *buffer, uint32_t msg_
|
||||
if(qos_rule.oc == ROC_CREATE_NEW_QOS_RULE ||
|
||||
qos_rule.oc == ROC_MODIFY_QOS_RULE_ADD_PF ||
|
||||
qos_rule.oc == ROC_MODIFY_QOS_RULE_REPLACE_PF) {
|
||||
pf.pf_type.type_1.pf_dir = (*(buffer + offset) & 0x30) >> 4;
|
||||
pf.pf_type.type_1.pf_id = *(buffer + offset++) & 0x0F;
|
||||
pf.pf_type.type_1.length = *(buffer + offset++);
|
||||
offset += (qos_rule.nb_pf * pf.pf_type.type_1.length); /* Ommit the Packet filter List */
|
||||
pf.pf_type.type_1.pf_dir = (*curPtr & 0x30) >> 4;
|
||||
pf.pf_type.type_1.pf_id = *curPtr++ & 0x0F;
|
||||
pf.pf_type.type_1.length = *curPtr++;
|
||||
curPtr += (qos_rule.nb_pf * pf.pf_type.type_1.length); /* Ommit the Packet filter List */
|
||||
} else if (qos_rule.oc == ROC_MODIFY_QOS_RULE_DELETE_PF) {
|
||||
offset += qos_rule.nb_pf;
|
||||
curPtr += qos_rule.nb_pf;
|
||||
}
|
||||
}
|
||||
|
||||
qos_rule.prcd = *(buffer + offset++);
|
||||
qos_rule.qfi = *(buffer + offset++);
|
||||
psea_msg.sess_ambr.length = *(buffer + offset++);
|
||||
offset += psea_msg.sess_ambr.length; /* Ommit the Seassion-AMBR */
|
||||
qos_rule.prcd = *curPtr++;
|
||||
qos_rule.qfi = *curPtr++;
|
||||
psea_msg.sess_ambr.length = *curPtr++;
|
||||
curPtr += psea_msg.sess_ambr.length; /* Ommit the Seassion-AMBR */
|
||||
|
||||
/* Optional Presence IEs */
|
||||
uint8_t psea_iei = *(buffer + offset++);
|
||||
|
||||
while(offset < msg_length) {
|
||||
while (curPtr < buffer + msg_length) {
|
||||
uint8_t psea_iei = *curPtr++;
|
||||
switch (psea_iei) {
|
||||
case IEI_5GSM_CAUSE: /* Ommited */
|
||||
LOG_T(NAS, "PDU SESSION ESTABLISHMENT ACCEPT - Received 5GSM Cause IEI\n");
|
||||
offset++;
|
||||
curPtr++;
|
||||
break;
|
||||
|
||||
case IEI_PDU_ADDRESS:
|
||||
LOG_T(NAS, "PDU SESSION ESTABLISHMENT ACCEPT - Received PDU Address IE\n");
|
||||
psea_msg.pdu_addr_ie.pdu_length = *(buffer + offset++);
|
||||
psea_msg.pdu_addr_ie.pdu_type = *(buffer + offset++);
|
||||
psea_msg.pdu_addr_ie.pdu_length = *curPtr++;
|
||||
psea_msg.pdu_addr_ie.pdu_type = *curPtr++;
|
||||
|
||||
if (psea_msg.pdu_addr_ie.pdu_type == PDU_SESSION_TYPE_IPV4) {
|
||||
psea_msg.pdu_addr_ie.pdu_addr_oct1 = *(buffer + offset++);
|
||||
psea_msg.pdu_addr_ie.pdu_addr_oct2 = *(buffer + offset++);
|
||||
psea_msg.pdu_addr_ie.pdu_addr_oct3 = *(buffer + offset++);
|
||||
psea_msg.pdu_addr_ie.pdu_addr_oct4 = *(buffer + offset++);
|
||||
psea_msg.pdu_addr_ie.pdu_addr_oct1 = *curPtr++;
|
||||
psea_msg.pdu_addr_ie.pdu_addr_oct2 = *curPtr++;
|
||||
psea_msg.pdu_addr_ie.pdu_addr_oct3 = *curPtr++;
|
||||
psea_msg.pdu_addr_ie.pdu_addr_oct4 = *curPtr++;
|
||||
nas_getparams();
|
||||
sprintf(baseNetAddress, "%d.%d", psea_msg.pdu_addr_ie.pdu_addr_oct1, psea_msg.pdu_addr_ie.pdu_addr_oct2);
|
||||
nas_config(1, psea_msg.pdu_addr_ie.pdu_addr_oct3, psea_msg.pdu_addr_ie.pdu_addr_oct4, "oaitun_ue");
|
||||
@@ -117,78 +119,68 @@ void capture_pdu_session_establishment_accept_msg(uint8_t *buffer, uint32_t msg_
|
||||
psea_msg.pdu_addr_ie.pdu_addr_oct3,
|
||||
psea_msg.pdu_addr_ie.pdu_addr_oct4);
|
||||
} else {
|
||||
offset += psea_msg.pdu_addr_ie.pdu_length;
|
||||
curPtr += psea_msg.pdu_addr_ie.pdu_length;
|
||||
}
|
||||
|
||||
psea_iei = *(buffer + offset++);
|
||||
break;
|
||||
|
||||
case IEI_RQ_TIMER_VALUE: /* Ommited */
|
||||
LOG_T(NAS, "PDU SESSION ESTABLISHMENT ACCEPT - Received RQ timer value IE\n");
|
||||
offset++; /* TS 24.008 10.5.7.3 */
|
||||
psea_iei = *(buffer + offset++);
|
||||
curPtr++; /* TS 24.008 10.5.7.3 */
|
||||
break;
|
||||
|
||||
case IEI_SNSSAI: /* Ommited */
|
||||
LOG_T(NAS, "PDU SESSION ESTABLISHMENT ACCEPT - Received S-NSSAI IE\n");
|
||||
uint8_t snssai_length = *(buffer + offset);
|
||||
offset += (snssai_length + sizeof(snssai_length));
|
||||
psea_iei = *(buffer + offset++);
|
||||
uint8_t snssai_length = *curPtr;
|
||||
curPtr += (snssai_length + sizeof(snssai_length));
|
||||
break;
|
||||
|
||||
case IEI_ALWAYSON_PDU: /* Ommited */
|
||||
LOG_T(NAS, "PDU SESSION ESTABLISHMENT ACCEPT - Received Always-on PDU Session indication IE\n");
|
||||
offset++;
|
||||
psea_iei = *(buffer + offset++);
|
||||
curPtr++;
|
||||
break;
|
||||
|
||||
case IEI_MAPPED_EPS: /* Ommited */
|
||||
LOG_T(NAS, "PDU SESSION ESTABLISHMENT ACCEPT - Received Mapped EPS bearer context IE\n");
|
||||
uint16_t mapped_eps_length = htons(*(uint16_t *)(buffer + offset));
|
||||
offset += mapped_eps_length;
|
||||
psea_iei = *(buffer + offset++);
|
||||
uint16_t mapped_eps_length = getShort(curPtr);
|
||||
curPtr += mapped_eps_length;
|
||||
break;
|
||||
|
||||
case IEI_EAP_MSG: /* Ommited */
|
||||
LOG_T(NAS, "PDU SESSION ESTABLISHMENT ACCEPT - Received EAP message IE\n");
|
||||
uint16_t eap_length = htons(*(uint16_t *)(buffer + offset));
|
||||
offset += (eap_length + sizeof(eap_length));
|
||||
psea_iei = *(buffer + offset++);
|
||||
uint16_t eap_length = getShort(curPtr);
|
||||
curPtr += (eap_length + sizeof(eap_length));
|
||||
break;
|
||||
|
||||
case IEI_AUTH_QOS_DESC: /* Ommited */
|
||||
LOG_T(NAS, "PDU SESSION ESTABLISHMENT ACCEPT - Received Authorized QoS flow descriptions IE\n");
|
||||
psea_msg.qos_fd_ie.length = htons(*(uint16_t *)(buffer + offset));
|
||||
offset += (psea_msg.qos_fd_ie.length + sizeof(psea_msg.qos_fd_ie.length));
|
||||
psea_iei = *(buffer + offset++);
|
||||
psea_msg.qos_fd_ie.length = getShort(curPtr);
|
||||
curPtr += (psea_msg.qos_fd_ie.length + sizeof(psea_msg.qos_fd_ie.length));
|
||||
break;
|
||||
|
||||
case IEI_EXT_CONF_OPT: /* Ommited */
|
||||
LOG_T(NAS, "PDU SESSION ESTABLISHMENT ACCEPT - Received Extended protocol configuration options IE\n");
|
||||
psea_msg.ext_pp_ie.length = htons(*(uint16_t *)(buffer + offset));
|
||||
offset += (psea_msg.ext_pp_ie.length + sizeof(psea_msg.ext_pp_ie.length ));
|
||||
psea_iei = *(buffer + offset++);
|
||||
psea_msg.ext_pp_ie.length = getShort(curPtr);
|
||||
curPtr += (psea_msg.ext_pp_ie.length + sizeof(psea_msg.ext_pp_ie.length));
|
||||
break;
|
||||
|
||||
case IEI_DNN:
|
||||
LOG_T(NAS, "PDU SESSION ESTABLISHMENT ACCEPT - Received DNN IE\n");
|
||||
psea_msg.dnn_ie.dnn_length = *(buffer + offset++);
|
||||
psea_msg.dnn_ie.dnn_length = *curPtr++;
|
||||
char apn[APN_MAX_LEN];
|
||||
|
||||
if(psea_msg.dnn_ie.dnn_length <= APN_MAX_LEN &&
|
||||
psea_msg.dnn_ie.dnn_length >= APN_MIN_LEN) {
|
||||
for (int i = 0 ; i < psea_msg.dnn_ie.dnn_length ; ++i)
|
||||
apn[i] = *(buffer + offset + i);
|
||||
memcpy(apn, curPtr, psea_msg.dnn_ie.dnn_length);
|
||||
LOG_T(NAS, "PDU SESSION ESTABLISHMENT ACCEPT - APN: %s\n", apn);
|
||||
} else
|
||||
LOG_E(NAS, "PDU SESSION ESTABLISHMENT ACCEPT - DNN IE has invalid length\n");
|
||||
|
||||
offset = msg_length;
|
||||
curPtr = buffer + msg_length; // we force stop processing
|
||||
break;
|
||||
|
||||
default:
|
||||
LOG_T(NAS, "PDU SESSION ESTABLISHMENT ACCEPT - Not known IE\n");
|
||||
offset = msg_length;
|
||||
curPtr = buffer + msg_length; // we force stop processing
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -961,7 +961,7 @@ static int Gtpv1uHandleError(int h,
|
||||
uint32_t msgBufLen,
|
||||
uint16_t peerPort,
|
||||
uint32_t peerIp) {
|
||||
LOG_E(GTPU,"Hadle error to be dev\n");
|
||||
LOG_E(GTPU, "Handle error to be dev\n");
|
||||
int rc = GTPNOK;
|
||||
return rc;
|
||||
}
|
||||
|
||||
@@ -70,7 +70,6 @@
|
||||
#define sampleToByte(a,b) ((a)*(b)*sizeof(sample_t))
|
||||
#define byteToSample(a,b) ((a)/(sizeof(sample_t)*(b)))
|
||||
|
||||
#define MAX_SIMULATION_CONNECTED_NODES 5
|
||||
#define GENERATE_CHANNEL 10 // each frame (or slot?) in DL
|
||||
|
||||
// This needs to be re-architected in the future
|
||||
@@ -86,7 +85,7 @@
|
||||
// FD_SETSIE) and reduced to 125. This should allow for around 20 simultaeous UEs.
|
||||
//
|
||||
// #define MAX_FD_RFSIMU FD_SETSIZE
|
||||
#define MAX_FD_RFSIMU 125
|
||||
#define MAX_FD_RFSIMU 250
|
||||
#define SYSCTL_MEM_VALUE 134217728 // Kernel network buffer size
|
||||
#define SEND_BUFF_SIZE SYSCTL_MEM_VALUE // Socket buffer size
|
||||
|
||||
@@ -803,7 +802,7 @@ static bool flushInput(rfsimulator_state_t *t, int timeout, int nsamps_for_initi
|
||||
for ( int i=0; i < t->tx_num_channels; i++)
|
||||
samplesVoid[i]=(void *)&v;
|
||||
|
||||
rfsimulator_write_internal(t, t->lastWroteTS > 1 ? t->lastWroteTS - 1 : 0, samplesVoid, 1, t->tx_num_channels, 1, true);
|
||||
rfsimulator_write_internal(t, t->lastWroteTS > 1 ? t->lastWroteTS - 1 : 0, samplesVoid, 1, t->tx_num_channels, 1, false);
|
||||
} else {
|
||||
if ( events[nbEv].events & (EPOLLHUP | EPOLLERR | EPOLLRDHUP) ) {
|
||||
socketError(t,fd);
|
||||
@@ -963,7 +962,7 @@ static int rfsimulator_read(openair0_device *device, openair0_timestamp *ptimest
|
||||
"Waiting on socket, current last ts: %ld, expected at least : %ld\n",
|
||||
b->lastReceivedTS,
|
||||
t->nextRxTstamp + nsamps);
|
||||
flushInput(t, 1000, nsamps); // was 3
|
||||
flushInput(t, 3, nsamps);
|
||||
}
|
||||
} while (have_to_wait);
|
||||
}
|
||||
|
||||
@@ -0,0 +1,862 @@
|
||||
<UE-NR-Capability>
|
||||
<accessStratumRelease><rel15/></accessStratumRelease>
|
||||
<pdcp-Parameters>
|
||||
<supportedROHC-Profiles>
|
||||
<profile0x0000><false/></profile0x0000>
|
||||
<profile0x0001><false/></profile0x0001>
|
||||
<profile0x0002><false/></profile0x0002>
|
||||
<profile0x0003><false/></profile0x0003>
|
||||
<profile0x0004><false/></profile0x0004>
|
||||
<profile0x0006><false/></profile0x0006>
|
||||
<profile0x0101><false/></profile0x0101>
|
||||
<profile0x0102><false/></profile0x0102>
|
||||
<profile0x0103><false/></profile0x0103>
|
||||
<profile0x0104><false/></profile0x0104>
|
||||
</supportedROHC-Profiles>
|
||||
<maxNumberROHC-ContextSessions><cs2/></maxNumberROHC-ContextSessions>
|
||||
<shortSN><supported/></shortSN>
|
||||
</pdcp-Parameters>
|
||||
<rlc-Parameters>
|
||||
<am-WithShortSN><supported/></am-WithShortSN>
|
||||
<um-WithShortSN><supported/></um-WithShortSN>
|
||||
<um-WithLongSN><supported/></um-WithLongSN>
|
||||
</rlc-Parameters>
|
||||
<mac-Parameters>
|
||||
<mac-ParametersXDD-Diff>
|
||||
<logicalChannelSR-DelayTimer><supported/></logicalChannelSR-DelayTimer>
|
||||
<longDRX-Cycle><supported/></longDRX-Cycle>
|
||||
<shortDRX-Cycle><supported/></shortDRX-Cycle>
|
||||
<multipleSR-Configurations><supported/></multipleSR-Configurations>
|
||||
</mac-ParametersXDD-Diff>
|
||||
</mac-Parameters>
|
||||
<phy-Parameters>
|
||||
<phy-ParametersCommon>
|
||||
<nzp-CSI-RS-IntefMgmt><supported/></nzp-CSI-RS-IntefMgmt>
|
||||
<dynamicHARQ-ACK-Codebook><supported/></dynamicHARQ-ACK-Codebook>
|
||||
<semiStaticHARQ-ACK-Codebook><supported/></semiStaticHARQ-ACK-Codebook>
|
||||
<pdsch-MappingTypeA><supported/></pdsch-MappingTypeA>
|
||||
<rateMatchingResrcSetSemi-Static><supported/></rateMatchingResrcSetSemi-Static>
|
||||
<ext2>
|
||||
<maxLayersMIMO-Indication><supported/></maxLayersMIMO-Indication>
|
||||
</ext2>
|
||||
</phy-ParametersCommon>
|
||||
<phy-ParametersFRX-Diff>
|
||||
<twoFL-DMRS>
|
||||
11
|
||||
</twoFL-DMRS>
|
||||
<supportedDMRS-TypeDL><type1/></supportedDMRS-TypeDL>
|
||||
<supportedDMRS-TypeUL><type1And2/></supportedDMRS-TypeUL>
|
||||
<onePortsPTRS>
|
||||
01
|
||||
</onePortsPTRS>
|
||||
<pucch-F2-WithFH><supported/></pucch-F2-WithFH>
|
||||
<pucch-F3-WithFH><supported/></pucch-F3-WithFH>
|
||||
<absoluteTPC-Command><supported/></absoluteTPC-Command>
|
||||
<pusch-HalfPi-BPSK><supported/></pusch-HalfPi-BPSK>
|
||||
<pucch-F3-4-HalfPi-BPSK><supported/></pucch-F3-4-HalfPi-BPSK>
|
||||
<ext1>
|
||||
<csi-RS-IM-ReceptionForFeedback>
|
||||
<maxConfigNumberNZP-CSI-RS-PerCC>8</maxConfigNumberNZP-CSI-RS-PerCC>
|
||||
<maxConfigNumberPortsAcrossNZP-CSI-RS-PerCC>64</maxConfigNumberPortsAcrossNZP-CSI-RS-PerCC>
|
||||
<maxConfigNumberCSI-IM-PerCC><n8/></maxConfigNumberCSI-IM-PerCC>
|
||||
<maxNumberSimultaneousNZP-CSI-RS-PerCC>4</maxNumberSimultaneousNZP-CSI-RS-PerCC>
|
||||
<totalNumberPortsSimultaneousNZP-CSI-RS-PerCC>32</totalNumberPortsSimultaneousNZP-CSI-RS-PerCC>
|
||||
</csi-RS-IM-ReceptionForFeedback>
|
||||
<csi-ReportFramework>
|
||||
<maxNumberPeriodicCSI-PerBWP-ForCSI-Report>2</maxNumberPeriodicCSI-PerBWP-ForCSI-Report>
|
||||
<maxNumberAperiodicCSI-PerBWP-ForCSI-Report>2</maxNumberAperiodicCSI-PerBWP-ForCSI-Report>
|
||||
<maxNumberSemiPersistentCSI-PerBWP-ForCSI-Report>0</maxNumberSemiPersistentCSI-PerBWP-ForCSI-Report>
|
||||
<maxNumberPeriodicCSI-PerBWP-ForBeamReport>2</maxNumberPeriodicCSI-PerBWP-ForBeamReport>
|
||||
<maxNumberAperiodicCSI-PerBWP-ForBeamReport>2</maxNumberAperiodicCSI-PerBWP-ForBeamReport>
|
||||
<maxNumberAperiodicCSI-triggeringStatePerCC><n63/></maxNumberAperiodicCSI-triggeringStatePerCC>
|
||||
<maxNumberSemiPersistentCSI-PerBWP-ForBeamReport>0</maxNumberSemiPersistentCSI-PerBWP-ForBeamReport>
|
||||
<simultaneousCSI-ReportsPerCC>4</simultaneousCSI-ReportsPerCC>
|
||||
</csi-ReportFramework>
|
||||
<mux-SR-HARQ-ACK-CSI-PUCCH-OncePerSlot>
|
||||
<sameSymbol><supported/></sameSymbol>
|
||||
</mux-SR-HARQ-ACK-CSI-PUCCH-OncePerSlot>
|
||||
<oneFL-DMRS-TwoAdditionalDMRS-UL><supported/></oneFL-DMRS-TwoAdditionalDMRS-UL>
|
||||
<twoFL-DMRS-TwoAdditionalDMRS-UL><supported/></twoFL-DMRS-TwoAdditionalDMRS-UL>
|
||||
</ext1>
|
||||
</phy-ParametersFRX-Diff>
|
||||
<phy-ParametersFR1>
|
||||
<pdsch-256QAM-FR1><supported/></pdsch-256QAM-FR1>
|
||||
<pdsch-RE-MappingFR1-PerSymbol><n10/></pdsch-RE-MappingFR1-PerSymbol>
|
||||
<ext1>
|
||||
<pdsch-RE-MappingFR1-PerSlot><n32/></pdsch-RE-MappingFR1-PerSlot>
|
||||
</ext1>
|
||||
</phy-ParametersFR1>
|
||||
</phy-Parameters>
|
||||
<rf-Parameters>
|
||||
<supportedBandListNR>
|
||||
<BandNR>
|
||||
<bandNR>78</bandNR>
|
||||
<mimo-ParametersPerBand>
|
||||
<tci-StatePDSCH>
|
||||
<maxNumberConfiguredTCI-StatesPerCC><n16/></maxNumberConfiguredTCI-StatesPerCC>
|
||||
<maxNumberActiveTCI-PerBWP><n1/></maxNumberActiveTCI-PerBWP>
|
||||
</tci-StatePDSCH>
|
||||
<pusch-TransCoherence><nonCoherent/></pusch-TransCoherence>
|
||||
<periodicBeamReport><supported/></periodicBeamReport>
|
||||
<aperiodicBeamReport><supported/></aperiodicBeamReport>
|
||||
<maxNumberNonGroupBeamReporting><n4/></maxNumberNonGroupBeamReporting>
|
||||
<maxNumberSSB-BFD>2</maxNumberSSB-BFD>
|
||||
<maxNumberCSI-RS-SSB-CBD>8</maxNumberCSI-RS-SSB-CBD>
|
||||
<beamReportTiming>
|
||||
<scs-15kHz><sym8/></scs-15kHz>
|
||||
<scs-30kHz><sym14/></scs-30kHz>
|
||||
</beamReportTiming>
|
||||
<ext1>
|
||||
<beamManagementSSB-CSI-RS>
|
||||
<maxNumberSSB-CSI-RS-ResourceOneTx><n8/></maxNumberSSB-CSI-RS-ResourceOneTx>
|
||||
<maxNumberCSI-RS-Resource><n32/></maxNumberCSI-RS-Resource>
|
||||
<maxNumberCSI-RS-ResourceTwoTx><n8/></maxNumberCSI-RS-ResourceTwoTx>
|
||||
<supportedCSI-RS-Density><oneAndThree/></supportedCSI-RS-Density>
|
||||
<maxNumberAperiodicCSI-RS-Resource><n32/></maxNumberAperiodicCSI-RS-Resource>
|
||||
</beamManagementSSB-CSI-RS>
|
||||
<codebookParameters>
|
||||
<type1>
|
||||
<singlePanel>
|
||||
<supportedCSI-RS-ResourceList>
|
||||
<SupportedCSI-RS-Resource>
|
||||
<maxNumberTxPortsPerResource><p8/></maxNumberTxPortsPerResource>
|
||||
<maxNumberResourcesPerBand>8</maxNumberResourcesPerBand>
|
||||
<totalNumberTxPortsPerBand>64</totalNumberTxPortsPerBand>
|
||||
</SupportedCSI-RS-Resource>
|
||||
<SupportedCSI-RS-Resource>
|
||||
<maxNumberTxPortsPerResource><p4/></maxNumberTxPortsPerResource>
|
||||
<maxNumberResourcesPerBand>8</maxNumberResourcesPerBand>
|
||||
<totalNumberTxPortsPerBand>32</totalNumberTxPortsPerBand>
|
||||
</SupportedCSI-RS-Resource>
|
||||
<SupportedCSI-RS-Resource>
|
||||
<maxNumberTxPortsPerResource><p16/></maxNumberTxPortsPerResource>
|
||||
<maxNumberResourcesPerBand>4</maxNumberResourcesPerBand>
|
||||
<totalNumberTxPortsPerBand>64</totalNumberTxPortsPerBand>
|
||||
</SupportedCSI-RS-Resource>
|
||||
<SupportedCSI-RS-Resource>
|
||||
<maxNumberTxPortsPerResource><p32/></maxNumberTxPortsPerResource>
|
||||
<maxNumberResourcesPerBand>2</maxNumberResourcesPerBand>
|
||||
<totalNumberTxPortsPerBand>64</totalNumberTxPortsPerBand>
|
||||
</SupportedCSI-RS-Resource>
|
||||
</supportedCSI-RS-ResourceList>
|
||||
<modes><mode1/></modes>
|
||||
<maxNumberCSI-RS-PerResourceSet>4</maxNumberCSI-RS-PerResourceSet>
|
||||
</singlePanel>
|
||||
</type1>
|
||||
</codebookParameters>
|
||||
<csi-RS-IM-ReceptionForFeedback>
|
||||
<maxConfigNumberNZP-CSI-RS-PerCC>8</maxConfigNumberNZP-CSI-RS-PerCC>
|
||||
<maxConfigNumberPortsAcrossNZP-CSI-RS-PerCC>64</maxConfigNumberPortsAcrossNZP-CSI-RS-PerCC>
|
||||
<maxConfigNumberCSI-IM-PerCC><n8/></maxConfigNumberCSI-IM-PerCC>
|
||||
<maxNumberSimultaneousNZP-CSI-RS-PerCC>4</maxNumberSimultaneousNZP-CSI-RS-PerCC>
|
||||
<totalNumberPortsSimultaneousNZP-CSI-RS-PerCC>32</totalNumberPortsSimultaneousNZP-CSI-RS-PerCC>
|
||||
</csi-RS-IM-ReceptionForFeedback>
|
||||
<csi-ReportFramework>
|
||||
<maxNumberPeriodicCSI-PerBWP-ForCSI-Report>2</maxNumberPeriodicCSI-PerBWP-ForCSI-Report>
|
||||
<maxNumberAperiodicCSI-PerBWP-ForCSI-Report>2</maxNumberAperiodicCSI-PerBWP-ForCSI-Report>
|
||||
<maxNumberSemiPersistentCSI-PerBWP-ForCSI-Report>0</maxNumberSemiPersistentCSI-PerBWP-ForCSI-Report>
|
||||
<maxNumberPeriodicCSI-PerBWP-ForBeamReport>2</maxNumberPeriodicCSI-PerBWP-ForBeamReport>
|
||||
<maxNumberAperiodicCSI-PerBWP-ForBeamReport>2</maxNumberAperiodicCSI-PerBWP-ForBeamReport>
|
||||
<maxNumberAperiodicCSI-triggeringStatePerCC><n63/></maxNumberAperiodicCSI-triggeringStatePerCC>
|
||||
<maxNumberSemiPersistentCSI-PerBWP-ForBeamReport>0</maxNumberSemiPersistentCSI-PerBWP-ForBeamReport>
|
||||
<simultaneousCSI-ReportsPerCC>4</simultaneousCSI-ReportsPerCC>
|
||||
</csi-ReportFramework>
|
||||
<csi-RS-ForTracking>
|
||||
<maxBurstLength>2</maxBurstLength>
|
||||
<maxSimultaneousResourceSetsPerCC>1</maxSimultaneousResourceSetsPerCC>
|
||||
<maxConfiguredResourceSetsPerCC>8</maxConfiguredResourceSetsPerCC>
|
||||
<maxConfiguredResourceSetsAllCC>16</maxConfiguredResourceSetsAllCC>
|
||||
</csi-RS-ForTracking>
|
||||
</ext1>
|
||||
</mimo-ParametersPerBand>
|
||||
<multipleTCI><supported/></multipleTCI>
|
||||
<pusch-256QAM><supported/></pusch-256QAM>
|
||||
<ue-PowerClass><pc2/></ue-PowerClass>
|
||||
<channelBWs-DL>
|
||||
<fr1>
|
||||
<scs-15kHz>
|
||||
0000000000
|
||||
</scs-15kHz>
|
||||
<scs-30kHz>
|
||||
0001011111
|
||||
</scs-30kHz>
|
||||
<scs-60kHz>
|
||||
0000000000
|
||||
</scs-60kHz>
|
||||
</fr1>
|
||||
</channelBWs-DL>
|
||||
<channelBWs-UL>
|
||||
<fr1>
|
||||
<scs-15kHz>
|
||||
0000000000
|
||||
</scs-15kHz>
|
||||
<scs-30kHz>
|
||||
0001011111
|
||||
</scs-30kHz>
|
||||
<scs-60kHz>
|
||||
0000000000
|
||||
</scs-60kHz>
|
||||
</fr1>
|
||||
</channelBWs-UL>
|
||||
<ext1>
|
||||
<maxUplinkDutyCycle-PC2-FR1><n100/></maxUplinkDutyCycle-PC2-FR1>
|
||||
</ext1>
|
||||
<ext4>
|
||||
<channelBWs-DL-v1590>
|
||||
<fr1>
|
||||
<scs-30kHz>
|
||||
1000000000000000
|
||||
</scs-30kHz>
|
||||
</fr1>
|
||||
</channelBWs-DL-v1590>
|
||||
<channelBWs-UL-v1590>
|
||||
<fr1>
|
||||
<scs-30kHz>
|
||||
1000000000000000
|
||||
</scs-30kHz>
|
||||
</fr1>
|
||||
</channelBWs-UL-v1590>
|
||||
</ext4>
|
||||
</BandNR>
|
||||
</supportedBandListNR>
|
||||
<supportedBandCombinationList>
|
||||
<BandCombination>
|
||||
<bandList>
|
||||
<nr>
|
||||
<bandNR>78</bandNR>
|
||||
<ca-BandwidthClassDL-NR><a/></ca-BandwidthClassDL-NR>
|
||||
<ca-BandwidthClassUL-NR><a/></ca-BandwidthClassUL-NR>
|
||||
</nr>
|
||||
</bandList>
|
||||
<featureSetCombination>0</featureSetCombination>
|
||||
<powerClass-v1530><pc2/></powerClass-v1530>
|
||||
</BandCombination>
|
||||
</supportedBandCombinationList>
|
||||
<appliedFreqBandListFilter>
|
||||
<bandInformationNR>
|
||||
<bandNR>78</bandNR>
|
||||
</bandInformationNR>
|
||||
</appliedFreqBandListFilter>
|
||||
<ext1>
|
||||
<supportedBandCombinationList-v1540>
|
||||
<BandCombination-v1540>
|
||||
<bandList-v1540>
|
||||
<BandParameters-v1540>
|
||||
<srs-TxSwitch>
|
||||
<supportedSRS-TxPortSwitch><t2r4/></supportedSRS-TxPortSwitch>
|
||||
</srs-TxSwitch>
|
||||
</BandParameters-v1540>
|
||||
</bandList-v1540>
|
||||
<ca-ParametersNR-v1540>
|
||||
<csi-RS-IM-ReceptionForFeedbackPerBandComb>
|
||||
<maxNumberSimultaneousNZP-CSI-RS-ActBWP-AllCC>8</maxNumberSimultaneousNZP-CSI-RS-ActBWP-AllCC>
|
||||
<totalNumberPortsSimultaneousNZP-CSI-RS-ActBWP-AllCC>64</totalNumberPortsSimultaneousNZP-CSI-RS-ActBWP-AllCC>
|
||||
</csi-RS-IM-ReceptionForFeedbackPerBandComb>
|
||||
<simultaneousCSI-ReportsAllCC>8</simultaneousCSI-ReportsAllCC>
|
||||
</ca-ParametersNR-v1540>
|
||||
</BandCombination-v1540>
|
||||
</supportedBandCombinationList-v1540>
|
||||
</ext1>
|
||||
</rf-Parameters>
|
||||
<measAndMobParameters>
|
||||
<measAndMobParametersCommon>
|
||||
<ssb-RLM><supported/></ssb-RLM>
|
||||
<ext1>
|
||||
<eventB-MeasAndReport><supported/></eventB-MeasAndReport>
|
||||
<handoverFDD-TDD><supported/></handoverFDD-TDD>
|
||||
</ext1>
|
||||
<ext2>
|
||||
<periodicEUTRA-MeasAndReport><supported/></periodicEUTRA-MeasAndReport>
|
||||
</ext2>
|
||||
</measAndMobParametersCommon>
|
||||
<measAndMobParametersXDD-Diff>
|
||||
<intraAndInterF-MeasAndReport><supported/></intraAndInterF-MeasAndReport>
|
||||
<eventA-MeasAndReport><supported/></eventA-MeasAndReport>
|
||||
<ext1>
|
||||
<handoverInterF><supported/></handoverInterF>
|
||||
<handoverLTE-EPC><supported/></handoverLTE-EPC>
|
||||
</ext1>
|
||||
</measAndMobParametersXDD-Diff>
|
||||
<measAndMobParametersFRX-Diff>
|
||||
<ss-SINR-Meas><supported/></ss-SINR-Meas>
|
||||
<ext1>
|
||||
<handoverInterF><supported/></handoverInterF>
|
||||
<handoverLTE-EPC><supported/></handoverLTE-EPC>
|
||||
</ext1>
|
||||
<ext3>
|
||||
<simultaneousRxDataSSB-DiffNumerology><supported/></simultaneousRxDataSSB-DiffNumerology>
|
||||
</ext3>
|
||||
</measAndMobParametersFRX-Diff>
|
||||
</measAndMobParameters>
|
||||
<featureSets>
|
||||
<featureSetsDownlink>
|
||||
<FeatureSetDownlink>
|
||||
<featureSetListPerDownlinkCC>
|
||||
<FeatureSetDownlinkPerCC-Id>1</FeatureSetDownlinkPerCC-Id>
|
||||
</featureSetListPerDownlinkCC>
|
||||
<ue-SpecificUL-DL-Assignment><supported/></ue-SpecificUL-DL-Assignment>
|
||||
</FeatureSetDownlink>
|
||||
<FeatureSetDownlink>
|
||||
<featureSetListPerDownlinkCC>
|
||||
<FeatureSetDownlinkPerCC-Id>2</FeatureSetDownlinkPerCC-Id>
|
||||
</featureSetListPerDownlinkCC>
|
||||
<ue-SpecificUL-DL-Assignment><supported/></ue-SpecificUL-DL-Assignment>
|
||||
</FeatureSetDownlink>
|
||||
<FeatureSetDownlink>
|
||||
<featureSetListPerDownlinkCC>
|
||||
<FeatureSetDownlinkPerCC-Id>3</FeatureSetDownlinkPerCC-Id>
|
||||
</featureSetListPerDownlinkCC>
|
||||
<ue-SpecificUL-DL-Assignment><supported/></ue-SpecificUL-DL-Assignment>
|
||||
</FeatureSetDownlink>
|
||||
<FeatureSetDownlink>
|
||||
<featureSetListPerDownlinkCC>
|
||||
<FeatureSetDownlinkPerCC-Id>4</FeatureSetDownlinkPerCC-Id>
|
||||
</featureSetListPerDownlinkCC>
|
||||
<ue-SpecificUL-DL-Assignment><supported/></ue-SpecificUL-DL-Assignment>
|
||||
</FeatureSetDownlink>
|
||||
<FeatureSetDownlink>
|
||||
<featureSetListPerDownlinkCC>
|
||||
<FeatureSetDownlinkPerCC-Id>5</FeatureSetDownlinkPerCC-Id>
|
||||
</featureSetListPerDownlinkCC>
|
||||
<ue-SpecificUL-DL-Assignment><supported/></ue-SpecificUL-DL-Assignment>
|
||||
</FeatureSetDownlink>
|
||||
<FeatureSetDownlink>
|
||||
<featureSetListPerDownlinkCC>
|
||||
<FeatureSetDownlinkPerCC-Id>6</FeatureSetDownlinkPerCC-Id>
|
||||
</featureSetListPerDownlinkCC>
|
||||
<ue-SpecificUL-DL-Assignment><supported/></ue-SpecificUL-DL-Assignment>
|
||||
</FeatureSetDownlink>
|
||||
<FeatureSetDownlink>
|
||||
<featureSetListPerDownlinkCC>
|
||||
<FeatureSetDownlinkPerCC-Id>7</FeatureSetDownlinkPerCC-Id>
|
||||
</featureSetListPerDownlinkCC>
|
||||
<ue-SpecificUL-DL-Assignment><supported/></ue-SpecificUL-DL-Assignment>
|
||||
</FeatureSetDownlink>
|
||||
<FeatureSetDownlink>
|
||||
<featureSetListPerDownlinkCC>
|
||||
<FeatureSetDownlinkPerCC-Id>8</FeatureSetDownlinkPerCC-Id>
|
||||
</featureSetListPerDownlinkCC>
|
||||
<ue-SpecificUL-DL-Assignment><supported/></ue-SpecificUL-DL-Assignment>
|
||||
</FeatureSetDownlink>
|
||||
<FeatureSetDownlink>
|
||||
<featureSetListPerDownlinkCC>
|
||||
<FeatureSetDownlinkPerCC-Id>9</FeatureSetDownlinkPerCC-Id>
|
||||
</featureSetListPerDownlinkCC>
|
||||
<ue-SpecificUL-DL-Assignment><supported/></ue-SpecificUL-DL-Assignment>
|
||||
</FeatureSetDownlink>
|
||||
<FeatureSetDownlink>
|
||||
<featureSetListPerDownlinkCC>
|
||||
<FeatureSetDownlinkPerCC-Id>10</FeatureSetDownlinkPerCC-Id>
|
||||
</featureSetListPerDownlinkCC>
|
||||
<ue-SpecificUL-DL-Assignment><supported/></ue-SpecificUL-DL-Assignment>
|
||||
</FeatureSetDownlink>
|
||||
<FeatureSetDownlink>
|
||||
<featureSetListPerDownlinkCC>
|
||||
<FeatureSetDownlinkPerCC-Id>11</FeatureSetDownlinkPerCC-Id>
|
||||
</featureSetListPerDownlinkCC>
|
||||
<ue-SpecificUL-DL-Assignment><supported/></ue-SpecificUL-DL-Assignment>
|
||||
</FeatureSetDownlink>
|
||||
<FeatureSetDownlink>
|
||||
<featureSetListPerDownlinkCC>
|
||||
<FeatureSetDownlinkPerCC-Id>12</FeatureSetDownlinkPerCC-Id>
|
||||
</featureSetListPerDownlinkCC>
|
||||
<ue-SpecificUL-DL-Assignment><supported/></ue-SpecificUL-DL-Assignment>
|
||||
</FeatureSetDownlink>
|
||||
</featureSetsDownlink>
|
||||
<featureSetsDownlinkPerCC>
|
||||
<FeatureSetDownlinkPerCC>
|
||||
<supportedSubcarrierSpacingDL><kHz30/></supportedSubcarrierSpacingDL>
|
||||
<supportedBandwidthDL>
|
||||
<fr1><mhz100/></fr1>
|
||||
</supportedBandwidthDL>
|
||||
<maxNumberMIMO-LayersPDSCH><fourLayers/></maxNumberMIMO-LayersPDSCH>
|
||||
<supportedModulationOrderDL><qam256/></supportedModulationOrderDL>
|
||||
</FeatureSetDownlinkPerCC>
|
||||
<FeatureSetDownlinkPerCC>
|
||||
<supportedSubcarrierSpacingDL><kHz30/></supportedSubcarrierSpacingDL>
|
||||
<supportedBandwidthDL>
|
||||
<fr1><mhz100/></fr1>
|
||||
</supportedBandwidthDL>
|
||||
<channelBW-90mhz><supported/></channelBW-90mhz>
|
||||
<maxNumberMIMO-LayersPDSCH><fourLayers/></maxNumberMIMO-LayersPDSCH>
|
||||
<supportedModulationOrderDL><qam256/></supportedModulationOrderDL>
|
||||
</FeatureSetDownlinkPerCC>
|
||||
<FeatureSetDownlinkPerCC>
|
||||
<supportedSubcarrierSpacingDL><kHz15/></supportedSubcarrierSpacingDL>
|
||||
<supportedBandwidthDL>
|
||||
<fr1><mhz20/></fr1>
|
||||
</supportedBandwidthDL>
|
||||
<maxNumberMIMO-LayersPDSCH><twoLayers/></maxNumberMIMO-LayersPDSCH>
|
||||
<supportedModulationOrderDL><qam256/></supportedModulationOrderDL>
|
||||
</FeatureSetDownlinkPerCC>
|
||||
<FeatureSetDownlinkPerCC>
|
||||
<supportedSubcarrierSpacingDL><kHz15/></supportedSubcarrierSpacingDL>
|
||||
<supportedBandwidthDL>
|
||||
<fr1><mhz40/></fr1>
|
||||
</supportedBandwidthDL>
|
||||
<maxNumberMIMO-LayersPDSCH><fourLayers/></maxNumberMIMO-LayersPDSCH>
|
||||
<supportedModulationOrderDL><qam256/></supportedModulationOrderDL>
|
||||
</FeatureSetDownlinkPerCC>
|
||||
<FeatureSetDownlinkPerCC>
|
||||
<supportedSubcarrierSpacingDL><kHz30/></supportedSubcarrierSpacingDL>
|
||||
<supportedBandwidthDL>
|
||||
<fr1><mhz40/></fr1>
|
||||
</supportedBandwidthDL>
|
||||
<maxNumberMIMO-LayersPDSCH><fourLayers/></maxNumberMIMO-LayersPDSCH>
|
||||
<supportedModulationOrderDL><qam256/></supportedModulationOrderDL>
|
||||
</FeatureSetDownlinkPerCC>
|
||||
<FeatureSetDownlinkPerCC>
|
||||
<supportedSubcarrierSpacingDL><kHz30/></supportedSubcarrierSpacingDL>
|
||||
<supportedBandwidthDL>
|
||||
<fr1><mhz80/></fr1>
|
||||
</supportedBandwidthDL>
|
||||
<maxNumberMIMO-LayersPDSCH><fourLayers/></maxNumberMIMO-LayersPDSCH>
|
||||
<supportedModulationOrderDL><qam256/></supportedModulationOrderDL>
|
||||
</FeatureSetDownlinkPerCC>
|
||||
<FeatureSetDownlinkPerCC>
|
||||
<supportedSubcarrierSpacingDL><kHz30/></supportedSubcarrierSpacingDL>
|
||||
<supportedBandwidthDL>
|
||||
<fr1><mhz20/></fr1>
|
||||
</supportedBandwidthDL>
|
||||
<maxNumberMIMO-LayersPDSCH><fourLayers/></maxNumberMIMO-LayersPDSCH>
|
||||
<supportedModulationOrderDL><qam256/></supportedModulationOrderDL>
|
||||
</FeatureSetDownlinkPerCC>
|
||||
<FeatureSetDownlinkPerCC>
|
||||
<supportedSubcarrierSpacingDL><kHz15/></supportedSubcarrierSpacingDL>
|
||||
<supportedBandwidthDL>
|
||||
<fr1><mhz30/></fr1>
|
||||
</supportedBandwidthDL>
|
||||
<maxNumberMIMO-LayersPDSCH><twoLayers/></maxNumberMIMO-LayersPDSCH>
|
||||
<supportedModulationOrderDL><qam256/></supportedModulationOrderDL>
|
||||
</FeatureSetDownlinkPerCC>
|
||||
<FeatureSetDownlinkPerCC>
|
||||
<supportedSubcarrierSpacingDL><kHz15/></supportedSubcarrierSpacingDL>
|
||||
<supportedBandwidthDL>
|
||||
<fr1><mhz20/></fr1>
|
||||
</supportedBandwidthDL>
|
||||
<maxNumberMIMO-LayersPDSCH><fourLayers/></maxNumberMIMO-LayersPDSCH>
|
||||
<supportedModulationOrderDL><qam256/></supportedModulationOrderDL>
|
||||
</FeatureSetDownlinkPerCC>
|
||||
<FeatureSetDownlinkPerCC>
|
||||
<supportedSubcarrierSpacingDL><kHz15/></supportedSubcarrierSpacingDL>
|
||||
<supportedBandwidthDL>
|
||||
<fr1><mhz15/></fr1>
|
||||
</supportedBandwidthDL>
|
||||
<maxNumberMIMO-LayersPDSCH><twoLayers/></maxNumberMIMO-LayersPDSCH>
|
||||
<supportedModulationOrderDL><qam256/></supportedModulationOrderDL>
|
||||
</FeatureSetDownlinkPerCC>
|
||||
<FeatureSetDownlinkPerCC>
|
||||
<supportedSubcarrierSpacingDL><kHz15/></supportedSubcarrierSpacingDL>
|
||||
<supportedBandwidthDL>
|
||||
<fr1><mhz30/></fr1>
|
||||
</supportedBandwidthDL>
|
||||
<maxNumberMIMO-LayersPDSCH><fourLayers/></maxNumberMIMO-LayersPDSCH>
|
||||
<supportedModulationOrderDL><qam256/></supportedModulationOrderDL>
|
||||
</FeatureSetDownlinkPerCC>
|
||||
<FeatureSetDownlinkPerCC>
|
||||
<supportedSubcarrierSpacingDL><kHz30/></supportedSubcarrierSpacingDL>
|
||||
<supportedBandwidthDL>
|
||||
<fr1><mhz60/></fr1>
|
||||
</supportedBandwidthDL>
|
||||
<maxNumberMIMO-LayersPDSCH><fourLayers/></maxNumberMIMO-LayersPDSCH>
|
||||
<supportedModulationOrderDL><qam256/></supportedModulationOrderDL>
|
||||
</FeatureSetDownlinkPerCC>
|
||||
</featureSetsDownlinkPerCC>
|
||||
<featureSetsUplink>
|
||||
<FeatureSetUplink>
|
||||
<featureSetListPerUplinkCC>
|
||||
<FeatureSetUplinkPerCC-Id>1</FeatureSetUplinkPerCC-Id>
|
||||
</featureSetListPerUplinkCC>
|
||||
<supportedSRS-Resources>
|
||||
<maxNumberAperiodicSRS-PerBWP><n16/></maxNumberAperiodicSRS-PerBWP>
|
||||
<maxNumberAperiodicSRS-PerBWP-PerSlot>6</maxNumberAperiodicSRS-PerBWP-PerSlot>
|
||||
<maxNumberPeriodicSRS-PerBWP><n16/></maxNumberPeriodicSRS-PerBWP>
|
||||
<maxNumberPeriodicSRS-PerBWP-PerSlot>6</maxNumberPeriodicSRS-PerBWP-PerSlot>
|
||||
<maxNumberSemiPersistentSRS-PerBWP><n2/></maxNumberSemiPersistentSRS-PerBWP>
|
||||
<maxNumberSemiPersistentSRS-PerBWP-PerSlot>2</maxNumberSemiPersistentSRS-PerBWP-PerSlot>
|
||||
<maxNumberSRS-Ports-PerResource><n4/></maxNumberSRS-Ports-PerResource>
|
||||
</supportedSRS-Resources>
|
||||
</FeatureSetUplink>
|
||||
<FeatureSetUplink>
|
||||
<featureSetListPerUplinkCC>
|
||||
<FeatureSetUplinkPerCC-Id>2</FeatureSetUplinkPerCC-Id>
|
||||
</featureSetListPerUplinkCC>
|
||||
<supportedSRS-Resources>
|
||||
<maxNumberAperiodicSRS-PerBWP><n16/></maxNumberAperiodicSRS-PerBWP>
|
||||
<maxNumberAperiodicSRS-PerBWP-PerSlot>6</maxNumberAperiodicSRS-PerBWP-PerSlot>
|
||||
<maxNumberPeriodicSRS-PerBWP><n16/></maxNumberPeriodicSRS-PerBWP>
|
||||
<maxNumberPeriodicSRS-PerBWP-PerSlot>6</maxNumberPeriodicSRS-PerBWP-PerSlot>
|
||||
<maxNumberSemiPersistentSRS-PerBWP><n2/></maxNumberSemiPersistentSRS-PerBWP>
|
||||
<maxNumberSemiPersistentSRS-PerBWP-PerSlot>2</maxNumberSemiPersistentSRS-PerBWP-PerSlot>
|
||||
<maxNumberSRS-Ports-PerResource><n4/></maxNumberSRS-Ports-PerResource>
|
||||
</supportedSRS-Resources>
|
||||
</FeatureSetUplink>
|
||||
<FeatureSetUplink>
|
||||
<featureSetListPerUplinkCC>
|
||||
<FeatureSetUplinkPerCC-Id>3</FeatureSetUplinkPerCC-Id>
|
||||
</featureSetListPerUplinkCC>
|
||||
<supportedSRS-Resources>
|
||||
<maxNumberAperiodicSRS-PerBWP><n16/></maxNumberAperiodicSRS-PerBWP>
|
||||
<maxNumberAperiodicSRS-PerBWP-PerSlot>6</maxNumberAperiodicSRS-PerBWP-PerSlot>
|
||||
<maxNumberPeriodicSRS-PerBWP><n16/></maxNumberPeriodicSRS-PerBWP>
|
||||
<maxNumberPeriodicSRS-PerBWP-PerSlot>6</maxNumberPeriodicSRS-PerBWP-PerSlot>
|
||||
<maxNumberSemiPersistentSRS-PerBWP><n2/></maxNumberSemiPersistentSRS-PerBWP>
|
||||
<maxNumberSemiPersistentSRS-PerBWP-PerSlot>2</maxNumberSemiPersistentSRS-PerBWP-PerSlot>
|
||||
<maxNumberSRS-Ports-PerResource><n1/></maxNumberSRS-Ports-PerResource>
|
||||
</supportedSRS-Resources>
|
||||
</FeatureSetUplink>
|
||||
<FeatureSetUplink>
|
||||
<featureSetListPerUplinkCC>
|
||||
<FeatureSetUplinkPerCC-Id>4</FeatureSetUplinkPerCC-Id>
|
||||
</featureSetListPerUplinkCC>
|
||||
<supportedSRS-Resources>
|
||||
<maxNumberAperiodicSRS-PerBWP><n16/></maxNumberAperiodicSRS-PerBWP>
|
||||
<maxNumberAperiodicSRS-PerBWP-PerSlot>6</maxNumberAperiodicSRS-PerBWP-PerSlot>
|
||||
<maxNumberPeriodicSRS-PerBWP><n16/></maxNumberPeriodicSRS-PerBWP>
|
||||
<maxNumberPeriodicSRS-PerBWP-PerSlot>6</maxNumberPeriodicSRS-PerBWP-PerSlot>
|
||||
<maxNumberSemiPersistentSRS-PerBWP><n2/></maxNumberSemiPersistentSRS-PerBWP>
|
||||
<maxNumberSemiPersistentSRS-PerBWP-PerSlot>2</maxNumberSemiPersistentSRS-PerBWP-PerSlot>
|
||||
<maxNumberSRS-Ports-PerResource><n1/></maxNumberSRS-Ports-PerResource>
|
||||
</supportedSRS-Resources>
|
||||
</FeatureSetUplink>
|
||||
<FeatureSetUplink>
|
||||
<featureSetListPerUplinkCC>
|
||||
<FeatureSetUplinkPerCC-Id>5</FeatureSetUplinkPerCC-Id>
|
||||
</featureSetListPerUplinkCC>
|
||||
<supportedSRS-Resources>
|
||||
<maxNumberAperiodicSRS-PerBWP><n16/></maxNumberAperiodicSRS-PerBWP>
|
||||
<maxNumberAperiodicSRS-PerBWP-PerSlot>6</maxNumberAperiodicSRS-PerBWP-PerSlot>
|
||||
<maxNumberPeriodicSRS-PerBWP><n16/></maxNumberPeriodicSRS-PerBWP>
|
||||
<maxNumberPeriodicSRS-PerBWP-PerSlot>6</maxNumberPeriodicSRS-PerBWP-PerSlot>
|
||||
<maxNumberSemiPersistentSRS-PerBWP><n2/></maxNumberSemiPersistentSRS-PerBWP>
|
||||
<maxNumberSemiPersistentSRS-PerBWP-PerSlot>2</maxNumberSemiPersistentSRS-PerBWP-PerSlot>
|
||||
<maxNumberSRS-Ports-PerResource><n1/></maxNumberSRS-Ports-PerResource>
|
||||
</supportedSRS-Resources>
|
||||
</FeatureSetUplink>
|
||||
<FeatureSetUplink>
|
||||
<featureSetListPerUplinkCC>
|
||||
<FeatureSetUplinkPerCC-Id>6</FeatureSetUplinkPerCC-Id>
|
||||
</featureSetListPerUplinkCC>
|
||||
<supportedSRS-Resources>
|
||||
<maxNumberAperiodicSRS-PerBWP><n16/></maxNumberAperiodicSRS-PerBWP>
|
||||
<maxNumberAperiodicSRS-PerBWP-PerSlot>6</maxNumberAperiodicSRS-PerBWP-PerSlot>
|
||||
<maxNumberPeriodicSRS-PerBWP><n16/></maxNumberPeriodicSRS-PerBWP>
|
||||
<maxNumberPeriodicSRS-PerBWP-PerSlot>6</maxNumberPeriodicSRS-PerBWP-PerSlot>
|
||||
<maxNumberSemiPersistentSRS-PerBWP><n2/></maxNumberSemiPersistentSRS-PerBWP>
|
||||
<maxNumberSemiPersistentSRS-PerBWP-PerSlot>2</maxNumberSemiPersistentSRS-PerBWP-PerSlot>
|
||||
<maxNumberSRS-Ports-PerResource><n1/></maxNumberSRS-Ports-PerResource>
|
||||
</supportedSRS-Resources>
|
||||
</FeatureSetUplink>
|
||||
<FeatureSetUplink>
|
||||
<featureSetListPerUplinkCC>
|
||||
<FeatureSetUplinkPerCC-Id>7</FeatureSetUplinkPerCC-Id>
|
||||
</featureSetListPerUplinkCC>
|
||||
<supportedSRS-Resources>
|
||||
<maxNumberAperiodicSRS-PerBWP><n16/></maxNumberAperiodicSRS-PerBWP>
|
||||
<maxNumberAperiodicSRS-PerBWP-PerSlot>6</maxNumberAperiodicSRS-PerBWP-PerSlot>
|
||||
<maxNumberPeriodicSRS-PerBWP><n16/></maxNumberPeriodicSRS-PerBWP>
|
||||
<maxNumberPeriodicSRS-PerBWP-PerSlot>6</maxNumberPeriodicSRS-PerBWP-PerSlot>
|
||||
<maxNumberSemiPersistentSRS-PerBWP><n2/></maxNumberSemiPersistentSRS-PerBWP>
|
||||
<maxNumberSemiPersistentSRS-PerBWP-PerSlot>2</maxNumberSemiPersistentSRS-PerBWP-PerSlot>
|
||||
<maxNumberSRS-Ports-PerResource><n1/></maxNumberSRS-Ports-PerResource>
|
||||
</supportedSRS-Resources>
|
||||
</FeatureSetUplink>
|
||||
<FeatureSetUplink>
|
||||
<featureSetListPerUplinkCC>
|
||||
<FeatureSetUplinkPerCC-Id>8</FeatureSetUplinkPerCC-Id>
|
||||
</featureSetListPerUplinkCC>
|
||||
<supportedSRS-Resources>
|
||||
<maxNumberAperiodicSRS-PerBWP><n16/></maxNumberAperiodicSRS-PerBWP>
|
||||
<maxNumberAperiodicSRS-PerBWP-PerSlot>6</maxNumberAperiodicSRS-PerBWP-PerSlot>
|
||||
<maxNumberPeriodicSRS-PerBWP><n16/></maxNumberPeriodicSRS-PerBWP>
|
||||
<maxNumberPeriodicSRS-PerBWP-PerSlot>6</maxNumberPeriodicSRS-PerBWP-PerSlot>
|
||||
<maxNumberSemiPersistentSRS-PerBWP><n2/></maxNumberSemiPersistentSRS-PerBWP>
|
||||
<maxNumberSemiPersistentSRS-PerBWP-PerSlot>2</maxNumberSemiPersistentSRS-PerBWP-PerSlot>
|
||||
<maxNumberSRS-Ports-PerResource><n1/></maxNumberSRS-Ports-PerResource>
|
||||
</supportedSRS-Resources>
|
||||
</FeatureSetUplink>
|
||||
<FeatureSetUplink>
|
||||
<featureSetListPerUplinkCC>
|
||||
<FeatureSetUplinkPerCC-Id>9</FeatureSetUplinkPerCC-Id>
|
||||
</featureSetListPerUplinkCC>
|
||||
<supportedSRS-Resources>
|
||||
<maxNumberAperiodicSRS-PerBWP><n16/></maxNumberAperiodicSRS-PerBWP>
|
||||
<maxNumberAperiodicSRS-PerBWP-PerSlot>6</maxNumberAperiodicSRS-PerBWP-PerSlot>
|
||||
<maxNumberPeriodicSRS-PerBWP><n16/></maxNumberPeriodicSRS-PerBWP>
|
||||
<maxNumberPeriodicSRS-PerBWP-PerSlot>6</maxNumberPeriodicSRS-PerBWP-PerSlot>
|
||||
<maxNumberSemiPersistentSRS-PerBWP><n2/></maxNumberSemiPersistentSRS-PerBWP>
|
||||
<maxNumberSemiPersistentSRS-PerBWP-PerSlot>2</maxNumberSemiPersistentSRS-PerBWP-PerSlot>
|
||||
<maxNumberSRS-Ports-PerResource><n1/></maxNumberSRS-Ports-PerResource>
|
||||
</supportedSRS-Resources>
|
||||
</FeatureSetUplink>
|
||||
<FeatureSetUplink>
|
||||
<featureSetListPerUplinkCC>
|
||||
<FeatureSetUplinkPerCC-Id>10</FeatureSetUplinkPerCC-Id>
|
||||
</featureSetListPerUplinkCC>
|
||||
<supportedSRS-Resources>
|
||||
<maxNumberAperiodicSRS-PerBWP><n16/></maxNumberAperiodicSRS-PerBWP>
|
||||
<maxNumberAperiodicSRS-PerBWP-PerSlot>6</maxNumberAperiodicSRS-PerBWP-PerSlot>
|
||||
<maxNumberPeriodicSRS-PerBWP><n16/></maxNumberPeriodicSRS-PerBWP>
|
||||
<maxNumberPeriodicSRS-PerBWP-PerSlot>6</maxNumberPeriodicSRS-PerBWP-PerSlot>
|
||||
<maxNumberSemiPersistentSRS-PerBWP><n2/></maxNumberSemiPersistentSRS-PerBWP>
|
||||
<maxNumberSemiPersistentSRS-PerBWP-PerSlot>2</maxNumberSemiPersistentSRS-PerBWP-PerSlot>
|
||||
<maxNumberSRS-Ports-PerResource><n1/></maxNumberSRS-Ports-PerResource>
|
||||
</supportedSRS-Resources>
|
||||
</FeatureSetUplink>
|
||||
<FeatureSetUplink>
|
||||
<featureSetListPerUplinkCC>
|
||||
<FeatureSetUplinkPerCC-Id>11</FeatureSetUplinkPerCC-Id>
|
||||
</featureSetListPerUplinkCC>
|
||||
<supportedSRS-Resources>
|
||||
<maxNumberAperiodicSRS-PerBWP><n16/></maxNumberAperiodicSRS-PerBWP>
|
||||
<maxNumberAperiodicSRS-PerBWP-PerSlot>6</maxNumberAperiodicSRS-PerBWP-PerSlot>
|
||||
<maxNumberPeriodicSRS-PerBWP><n16/></maxNumberPeriodicSRS-PerBWP>
|
||||
<maxNumberPeriodicSRS-PerBWP-PerSlot>6</maxNumberPeriodicSRS-PerBWP-PerSlot>
|
||||
<maxNumberSemiPersistentSRS-PerBWP><n2/></maxNumberSemiPersistentSRS-PerBWP>
|
||||
<maxNumberSemiPersistentSRS-PerBWP-PerSlot>2</maxNumberSemiPersistentSRS-PerBWP-PerSlot>
|
||||
<maxNumberSRS-Ports-PerResource><n1/></maxNumberSRS-Ports-PerResource>
|
||||
</supportedSRS-Resources>
|
||||
</FeatureSetUplink>
|
||||
<FeatureSetUplink>
|
||||
<featureSetListPerUplinkCC>
|
||||
<FeatureSetUplinkPerCC-Id>12</FeatureSetUplinkPerCC-Id>
|
||||
</featureSetListPerUplinkCC>
|
||||
<supportedSRS-Resources>
|
||||
<maxNumberAperiodicSRS-PerBWP><n16/></maxNumberAperiodicSRS-PerBWP>
|
||||
<maxNumberAperiodicSRS-PerBWP-PerSlot>6</maxNumberAperiodicSRS-PerBWP-PerSlot>
|
||||
<maxNumberPeriodicSRS-PerBWP><n16/></maxNumberPeriodicSRS-PerBWP>
|
||||
<maxNumberPeriodicSRS-PerBWP-PerSlot>6</maxNumberPeriodicSRS-PerBWP-PerSlot>
|
||||
<maxNumberSemiPersistentSRS-PerBWP><n2/></maxNumberSemiPersistentSRS-PerBWP>
|
||||
<maxNumberSemiPersistentSRS-PerBWP-PerSlot>2</maxNumberSemiPersistentSRS-PerBWP-PerSlot>
|
||||
<maxNumberSRS-Ports-PerResource><n1/></maxNumberSRS-Ports-PerResource>
|
||||
</supportedSRS-Resources>
|
||||
</FeatureSetUplink>
|
||||
<FeatureSetUplink>
|
||||
<featureSetListPerUplinkCC>
|
||||
<FeatureSetUplinkPerCC-Id>11</FeatureSetUplinkPerCC-Id>
|
||||
</featureSetListPerUplinkCC>
|
||||
<supportedSRS-Resources>
|
||||
<maxNumberAperiodicSRS-PerBWP><n1/></maxNumberAperiodicSRS-PerBWP>
|
||||
<maxNumberAperiodicSRS-PerBWP-PerSlot>6</maxNumberAperiodicSRS-PerBWP-PerSlot>
|
||||
<maxNumberPeriodicSRS-PerBWP><n16/></maxNumberPeriodicSRS-PerBWP>
|
||||
<maxNumberPeriodicSRS-PerBWP-PerSlot>6</maxNumberPeriodicSRS-PerBWP-PerSlot>
|
||||
<maxNumberSemiPersistentSRS-PerBWP><n2/></maxNumberSemiPersistentSRS-PerBWP>
|
||||
<maxNumberSemiPersistentSRS-PerBWP-PerSlot>2</maxNumberSemiPersistentSRS-PerBWP-PerSlot>
|
||||
<maxNumberSRS-Ports-PerResource><n1/></maxNumberSRS-Ports-PerResource>
|
||||
</supportedSRS-Resources>
|
||||
</FeatureSetUplink>
|
||||
</featureSetsUplink>
|
||||
<featureSetsUplinkPerCC>
|
||||
<FeatureSetUplinkPerCC>
|
||||
<supportedSubcarrierSpacingUL><kHz30/></supportedSubcarrierSpacingUL>
|
||||
<supportedBandwidthUL>
|
||||
<fr1><mhz100/></fr1>
|
||||
</supportedBandwidthUL>
|
||||
<mimo-CB-PUSCH>
|
||||
<maxNumberMIMO-LayersCB-PUSCH><fourLayers/></maxNumberMIMO-LayersCB-PUSCH>
|
||||
<maxNumberSRS-ResourcePerSet>1</maxNumberSRS-ResourcePerSet>
|
||||
</mimo-CB-PUSCH>
|
||||
<supportedModulationOrderUL><qam256/></supportedModulationOrderUL>
|
||||
</FeatureSetUplinkPerCC>
|
||||
<FeatureSetUplinkPerCC>
|
||||
<supportedSubcarrierSpacingUL><kHz30/></supportedSubcarrierSpacingUL>
|
||||
<supportedBandwidthUL>
|
||||
<fr1><mhz100/></fr1>
|
||||
</supportedBandwidthUL>
|
||||
<channelBW-90mhz><supported/></channelBW-90mhz>
|
||||
<mimo-CB-PUSCH>
|
||||
<maxNumberMIMO-LayersCB-PUSCH><fourLayers/></maxNumberMIMO-LayersCB-PUSCH>
|
||||
<maxNumberSRS-ResourcePerSet>1</maxNumberSRS-ResourcePerSet>
|
||||
</mimo-CB-PUSCH>
|
||||
<supportedModulationOrderUL><qam256/></supportedModulationOrderUL>
|
||||
</FeatureSetUplinkPerCC>
|
||||
<FeatureSetUplinkPerCC>
|
||||
<supportedSubcarrierSpacingUL><kHz15/></supportedSubcarrierSpacingUL>
|
||||
<supportedBandwidthUL>
|
||||
<fr1><mhz20/></fr1>
|
||||
</supportedBandwidthUL>
|
||||
<mimo-CB-PUSCH>
|
||||
<maxNumberMIMO-LayersCB-PUSCH><oneLayer/></maxNumberMIMO-LayersCB-PUSCH>
|
||||
<maxNumberSRS-ResourcePerSet>1</maxNumberSRS-ResourcePerSet>
|
||||
</mimo-CB-PUSCH>
|
||||
<supportedModulationOrderUL><qam256/></supportedModulationOrderUL>
|
||||
</FeatureSetUplinkPerCC>
|
||||
<FeatureSetUplinkPerCC>
|
||||
<supportedSubcarrierSpacingUL><kHz15/></supportedSubcarrierSpacingUL>
|
||||
<supportedBandwidthUL>
|
||||
<fr1><mhz40/></fr1>
|
||||
</supportedBandwidthUL>
|
||||
<mimo-CB-PUSCH>
|
||||
<maxNumberMIMO-LayersCB-PUSCH><oneLayer/></maxNumberMIMO-LayersCB-PUSCH>
|
||||
<maxNumberSRS-ResourcePerSet>1</maxNumberSRS-ResourcePerSet>
|
||||
</mimo-CB-PUSCH>
|
||||
<supportedModulationOrderUL><qam256/></supportedModulationOrderUL>
|
||||
</FeatureSetUplinkPerCC>
|
||||
<FeatureSetUplinkPerCC>
|
||||
<supportedSubcarrierSpacingUL><kHz30/></supportedSubcarrierSpacingUL>
|
||||
<supportedBandwidthUL>
|
||||
<fr1><mhz40/></fr1>
|
||||
</supportedBandwidthUL>
|
||||
<mimo-CB-PUSCH>
|
||||
<maxNumberMIMO-LayersCB-PUSCH><oneLayer/></maxNumberMIMO-LayersCB-PUSCH>
|
||||
<maxNumberSRS-ResourcePerSet>1</maxNumberSRS-ResourcePerSet>
|
||||
</mimo-CB-PUSCH>
|
||||
<supportedModulationOrderUL><qam256/></supportedModulationOrderUL>
|
||||
</FeatureSetUplinkPerCC>
|
||||
<FeatureSetUplinkPerCC>
|
||||
<supportedSubcarrierSpacingUL><kHz30/></supportedSubcarrierSpacingUL>
|
||||
<supportedBandwidthUL>
|
||||
<fr1><mhz80/></fr1>
|
||||
</supportedBandwidthUL>
|
||||
<mimo-CB-PUSCH>
|
||||
<maxNumberMIMO-LayersCB-PUSCH><oneLayer/></maxNumberMIMO-LayersCB-PUSCH>
|
||||
<maxNumberSRS-ResourcePerSet>1</maxNumberSRS-ResourcePerSet>
|
||||
</mimo-CB-PUSCH>
|
||||
<supportedModulationOrderUL><qam256/></supportedModulationOrderUL>
|
||||
</FeatureSetUplinkPerCC>
|
||||
<FeatureSetUplinkPerCC>
|
||||
<supportedSubcarrierSpacingUL><kHz30/></supportedSubcarrierSpacingUL>
|
||||
<supportedBandwidthUL>
|
||||
<fr1><mhz20/></fr1>
|
||||
</supportedBandwidthUL>
|
||||
<mimo-CB-PUSCH>
|
||||
<maxNumberMIMO-LayersCB-PUSCH><oneLayer/></maxNumberMIMO-LayersCB-PUSCH>
|
||||
<maxNumberSRS-ResourcePerSet>1</maxNumberSRS-ResourcePerSet>
|
||||
</mimo-CB-PUSCH>
|
||||
<supportedModulationOrderUL><qam256/></supportedModulationOrderUL>
|
||||
</FeatureSetUplinkPerCC>
|
||||
<FeatureSetUplinkPerCC>
|
||||
<supportedSubcarrierSpacingUL><kHz15/></supportedSubcarrierSpacingUL>
|
||||
<supportedBandwidthUL>
|
||||
<fr1><mhz30/></fr1>
|
||||
</supportedBandwidthUL>
|
||||
<mimo-CB-PUSCH>
|
||||
<maxNumberMIMO-LayersCB-PUSCH><oneLayer/></maxNumberMIMO-LayersCB-PUSCH>
|
||||
<maxNumberSRS-ResourcePerSet>1</maxNumberSRS-ResourcePerSet>
|
||||
</mimo-CB-PUSCH>
|
||||
<supportedModulationOrderUL><qam256/></supportedModulationOrderUL>
|
||||
</FeatureSetUplinkPerCC>
|
||||
<FeatureSetUplinkPerCC>
|
||||
<supportedSubcarrierSpacingUL><kHz15/></supportedSubcarrierSpacingUL>
|
||||
<supportedBandwidthUL>
|
||||
<fr1><mhz15/></fr1>
|
||||
</supportedBandwidthUL>
|
||||
<mimo-CB-PUSCH>
|
||||
<maxNumberMIMO-LayersCB-PUSCH><oneLayer/></maxNumberMIMO-LayersCB-PUSCH>
|
||||
<maxNumberSRS-ResourcePerSet>1</maxNumberSRS-ResourcePerSet>
|
||||
</mimo-CB-PUSCH>
|
||||
<supportedModulationOrderUL><qam256/></supportedModulationOrderUL>
|
||||
</FeatureSetUplinkPerCC>
|
||||
<FeatureSetUplinkPerCC>
|
||||
<supportedSubcarrierSpacingUL><kHz30/></supportedSubcarrierSpacingUL>
|
||||
<supportedBandwidthUL>
|
||||
<fr1><mhz100/></fr1>
|
||||
</supportedBandwidthUL>
|
||||
<mimo-CB-PUSCH>
|
||||
<maxNumberMIMO-LayersCB-PUSCH><oneLayer/></maxNumberMIMO-LayersCB-PUSCH>
|
||||
<maxNumberSRS-ResourcePerSet>1</maxNumberSRS-ResourcePerSet>
|
||||
</mimo-CB-PUSCH>
|
||||
<supportedModulationOrderUL><qam256/></supportedModulationOrderUL>
|
||||
</FeatureSetUplinkPerCC>
|
||||
<FeatureSetUplinkPerCC>
|
||||
<supportedSubcarrierSpacingUL><kHz30/></supportedSubcarrierSpacingUL>
|
||||
<supportedBandwidthUL>
|
||||
<fr1><mhz100/></fr1>
|
||||
</supportedBandwidthUL>
|
||||
<channelBW-90mhz><supported/></channelBW-90mhz>
|
||||
<mimo-CB-PUSCH>
|
||||
<maxNumberMIMO-LayersCB-PUSCH><oneLayer/></maxNumberMIMO-LayersCB-PUSCH>
|
||||
<maxNumberSRS-ResourcePerSet>1</maxNumberSRS-ResourcePerSet>
|
||||
</mimo-CB-PUSCH>
|
||||
<supportedModulationOrderUL><qam256/></supportedModulationOrderUL>
|
||||
</FeatureSetUplinkPerCC>
|
||||
<FeatureSetUplinkPerCC>
|
||||
<supportedSubcarrierSpacingUL><kHz30/></supportedSubcarrierSpacingUL>
|
||||
<supportedBandwidthUL>
|
||||
<fr1><mhz60/></fr1>
|
||||
</supportedBandwidthUL>
|
||||
<mimo-CB-PUSCH>
|
||||
<maxNumberMIMO-LayersCB-PUSCH><oneLayer/></maxNumberMIMO-LayersCB-PUSCH>
|
||||
<maxNumberSRS-ResourcePerSet>1</maxNumberSRS-ResourcePerSet>
|
||||
</mimo-CB-PUSCH>
|
||||
<supportedModulationOrderUL><qam256/></supportedModulationOrderUL>
|
||||
</FeatureSetUplinkPerCC>
|
||||
</featureSetsUplinkPerCC>
|
||||
<ext1>
|
||||
<featureSetsDownlink-v1540>
|
||||
<FeatureSetDownlink-v1540>
|
||||
<oneFL-DMRS-TwoAdditionalDMRS-DL><supported/></oneFL-DMRS-TwoAdditionalDMRS-DL>
|
||||
<twoFL-DMRS-TwoAdditionalDMRS-DL><supported/></twoFL-DMRS-TwoAdditionalDMRS-DL>
|
||||
</FeatureSetDownlink-v1540>
|
||||
<FeatureSetDownlink-v1540>
|
||||
<oneFL-DMRS-TwoAdditionalDMRS-DL><supported/></oneFL-DMRS-TwoAdditionalDMRS-DL>
|
||||
<twoFL-DMRS-TwoAdditionalDMRS-DL><supported/></twoFL-DMRS-TwoAdditionalDMRS-DL>
|
||||
</FeatureSetDownlink-v1540>
|
||||
<FeatureSetDownlink-v1540>
|
||||
<oneFL-DMRS-TwoAdditionalDMRS-DL><supported/></oneFL-DMRS-TwoAdditionalDMRS-DL>
|
||||
<twoFL-DMRS-TwoAdditionalDMRS-DL><supported/></twoFL-DMRS-TwoAdditionalDMRS-DL>
|
||||
</FeatureSetDownlink-v1540>
|
||||
<FeatureSetDownlink-v1540>
|
||||
<oneFL-DMRS-TwoAdditionalDMRS-DL><supported/></oneFL-DMRS-TwoAdditionalDMRS-DL>
|
||||
<twoFL-DMRS-TwoAdditionalDMRS-DL><supported/></twoFL-DMRS-TwoAdditionalDMRS-DL>
|
||||
</FeatureSetDownlink-v1540>
|
||||
<FeatureSetDownlink-v1540>
|
||||
<oneFL-DMRS-TwoAdditionalDMRS-DL><supported/></oneFL-DMRS-TwoAdditionalDMRS-DL>
|
||||
<twoFL-DMRS-TwoAdditionalDMRS-DL><supported/></twoFL-DMRS-TwoAdditionalDMRS-DL>
|
||||
</FeatureSetDownlink-v1540>
|
||||
<FeatureSetDownlink-v1540>
|
||||
<oneFL-DMRS-TwoAdditionalDMRS-DL><supported/></oneFL-DMRS-TwoAdditionalDMRS-DL>
|
||||
<twoFL-DMRS-TwoAdditionalDMRS-DL><supported/></twoFL-DMRS-TwoAdditionalDMRS-DL>
|
||||
</FeatureSetDownlink-v1540>
|
||||
<FeatureSetDownlink-v1540>
|
||||
<oneFL-DMRS-TwoAdditionalDMRS-DL><supported/></oneFL-DMRS-TwoAdditionalDMRS-DL>
|
||||
<twoFL-DMRS-TwoAdditionalDMRS-DL><supported/></twoFL-DMRS-TwoAdditionalDMRS-DL>
|
||||
</FeatureSetDownlink-v1540>
|
||||
<FeatureSetDownlink-v1540>
|
||||
<oneFL-DMRS-TwoAdditionalDMRS-DL><supported/></oneFL-DMRS-TwoAdditionalDMRS-DL>
|
||||
<twoFL-DMRS-TwoAdditionalDMRS-DL><supported/></twoFL-DMRS-TwoAdditionalDMRS-DL>
|
||||
</FeatureSetDownlink-v1540>
|
||||
<FeatureSetDownlink-v1540>
|
||||
<oneFL-DMRS-TwoAdditionalDMRS-DL><supported/></oneFL-DMRS-TwoAdditionalDMRS-DL>
|
||||
<twoFL-DMRS-TwoAdditionalDMRS-DL><supported/></twoFL-DMRS-TwoAdditionalDMRS-DL>
|
||||
</FeatureSetDownlink-v1540>
|
||||
<FeatureSetDownlink-v1540>
|
||||
<oneFL-DMRS-TwoAdditionalDMRS-DL><supported/></oneFL-DMRS-TwoAdditionalDMRS-DL>
|
||||
<twoFL-DMRS-TwoAdditionalDMRS-DL><supported/></twoFL-DMRS-TwoAdditionalDMRS-DL>
|
||||
</FeatureSetDownlink-v1540>
|
||||
<FeatureSetDownlink-v1540>
|
||||
<oneFL-DMRS-TwoAdditionalDMRS-DL><supported/></oneFL-DMRS-TwoAdditionalDMRS-DL>
|
||||
<twoFL-DMRS-TwoAdditionalDMRS-DL><supported/></twoFL-DMRS-TwoAdditionalDMRS-DL>
|
||||
</FeatureSetDownlink-v1540>
|
||||
<FeatureSetDownlink-v1540>
|
||||
<oneFL-DMRS-TwoAdditionalDMRS-DL><supported/></oneFL-DMRS-TwoAdditionalDMRS-DL>
|
||||
<twoFL-DMRS-TwoAdditionalDMRS-DL><supported/></twoFL-DMRS-TwoAdditionalDMRS-DL>
|
||||
</FeatureSetDownlink-v1540>
|
||||
</featureSetsDownlink-v1540>
|
||||
</ext1>
|
||||
</featureSets>
|
||||
<featureSetCombinations>
|
||||
<FeatureSetCombination>
|
||||
<FeatureSetsPerBand>
|
||||
<nr>
|
||||
<downlinkSetNR>2</downlinkSetNR>
|
||||
<uplinkSetNR>2</uplinkSetNR>
|
||||
</nr>
|
||||
</FeatureSetsPerBand>
|
||||
</FeatureSetCombination>
|
||||
</featureSetCombinations>
|
||||
<nonCriticalExtension>
|
||||
<interRAT-Parameters>
|
||||
<eutra>
|
||||
<supportedBandListEUTRA>
|
||||
<FreqBandIndicatorEUTRA>7</FreqBandIndicatorEUTRA>
|
||||
<FreqBandIndicatorEUTRA>38</FreqBandIndicatorEUTRA>
|
||||
</supportedBandListEUTRA>
|
||||
<eutra-ParametersCommon>
|
||||
<mfbi-EUTRA><supported/></mfbi-EUTRA>
|
||||
</eutra-ParametersCommon>
|
||||
</eutra>
|
||||
</interRAT-Parameters>
|
||||
<inactiveState><supported/></inactiveState>
|
||||
</nonCriticalExtension>
|
||||
</UE-NR-Capability>
|
||||
Reference in New Issue
Block a user