Merge branch 'integration_2025_w45' into 'develop'
Integration `2025.w45` * !3736 fix bugs in scope for pdcch, and optimize cpu cost of pdcch decoding * !3743 NR UE: fix PDCCH LLR indexing for different search space RB sizes * !3739 Bugfix: save old tunnel info to remain the user plane connection while rolling back to source DU due to handover failure * !3742 Simplify node management in CI, handle SIGINT * !3670 PRS bug fix and CI Integration * !3746 Fix unsigned to signed decoding parameters to allow for 'no affinity'/'no pin' threads to CPUs * !3738 CI: Add new Jenkinsfiles Closes #984 and #1021 See merge request oai/openairinterface5g!3744
This commit is contained in:
Vendored
+233
@@ -0,0 +1,233 @@
|
||||
#!/bin/groovy
|
||||
/*
|
||||
* Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
|
||||
* contributor license agreements. See the NOTICE file distributed with
|
||||
* this work for additional information regarding copyright ownership.
|
||||
* The OpenAirInterface Software Alliance licenses this file to You under
|
||||
* the OAI Public License, Version 1.1 (the "License"); you may not use this file
|
||||
* except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.openairinterface.org/?page_id=698
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*-------------------------------------------------------------------------------
|
||||
* For more information about the OpenAirInterface (OAI) Software Alliance:
|
||||
* contact@openairinterface.org
|
||||
*/
|
||||
|
||||
def pythonExecutor = params.pythonExecutor
|
||||
def testXMLFile = params.pythonTestXmlFile
|
||||
def mainPythonAllXmlFiles = ""
|
||||
def buildStageStatus = true
|
||||
def JOB_TIMESTAMP
|
||||
|
||||
// Choose test stage name or fallback default
|
||||
def testStageName = params.pipelineTestStageName != null ? params.pipelineTestStageName : 'Template Test Stage'
|
||||
|
||||
// Name of the resource
|
||||
def lockResources = []
|
||||
if (params.LockResources != null && params.LockResources.trim().length() > 0)
|
||||
params.LockResources.trim().split(",").each{lockResources += [resource: it.trim()]}
|
||||
|
||||
// Global Parameters. Normally they should be populated when the master job
|
||||
// triggers the slave job with parameters
|
||||
|
||||
def sourceRepository = params.eNB_Repository ?: env.GIT_URL
|
||||
def sourceBranch = params.eNB_Branch ?: env.GIT_BRANCH
|
||||
def targetRepository = params.Target_Repository ?: sourceRepository
|
||||
def targetBranch = params.eNB_TargetBranch ?: 'develop'
|
||||
def commitID = params.eNB_CommitID ?: env.GIT_COMMIT
|
||||
def is_MR = params.eNB_mergeRequest ?: false
|
||||
|
||||
def flexricOption = ""
|
||||
def runWithOC = false
|
||||
|
||||
//-------------------------------------------------------------------------------
|
||||
// Pipeline start
|
||||
pipeline {
|
||||
agent {
|
||||
label pythonExecutor
|
||||
}
|
||||
options {
|
||||
timestamps()
|
||||
ansiColor('xterm')
|
||||
lock(extra: lockResources)
|
||||
}
|
||||
|
||||
stages {
|
||||
stage("Build Init") {
|
||||
steps {
|
||||
script {
|
||||
echo '\u2705 \u001B[94mBuild Init\u001B[0m'
|
||||
JOB_TIMESTAMP = sh(returnStdout: true, script: 'date --utc --rfc-3339=seconds | sed -e "s#+00:00##"').trim()
|
||||
}
|
||||
// update the build name and description
|
||||
buildName "${params.eNB_MR}"
|
||||
buildDescription "Branch : ${sourceBranch}"
|
||||
}
|
||||
}
|
||||
stage ('Verify Parameters') {
|
||||
steps {
|
||||
script {
|
||||
echo '\u2705 \u001B[94mVerify Parameters\u001B[0m'
|
||||
def allParametersPresent = true
|
||||
|
||||
if (params.LockResources == null) {
|
||||
echo "no LockResources given"
|
||||
allParametersPresent = false
|
||||
}
|
||||
if (params.eNB_SourceCodePath == null) {
|
||||
echo "no eNB_SourceCodePath given"
|
||||
allParametersPresent = false
|
||||
}
|
||||
if (params.OC_Credentials != null) {
|
||||
echo "This pipeline is configured to run with Opensift Cluster."
|
||||
runWithOC = true
|
||||
if (params.OC_ProjectName == null) {
|
||||
echo "no OC_ProjectName given"
|
||||
allParametersPresent = false
|
||||
}
|
||||
}
|
||||
if (params.Flexric_Tag != null) {
|
||||
echo "This pipeline is configured to run with a FlexRIC deployment."
|
||||
echo "Appending FlexRicTag option to the list of options"
|
||||
flexricOption = "--FlexRicTag=${params.Flexric_Tag}"
|
||||
echo "Using new Flexric option: ${flexricOption}"
|
||||
}
|
||||
|
||||
echo "CI executor node : ${pythonExecutor}"
|
||||
echo "Source Repository : ${sourceRepository}"
|
||||
echo "Source Branch : ${sourceBranch}"
|
||||
echo "Target Repository : ${targetRepository}"
|
||||
echo "Target Branch : ${targetBranch}"
|
||||
echo "Commit ID : ${commitID}"
|
||||
|
||||
if (allParametersPresent) {
|
||||
echo '\u2705 \u001B[94m All parameters are present\u001B[0m'
|
||||
if (is_MR) {
|
||||
sh "git fetch"
|
||||
sh "./ci-scripts/doGitLabMerge.sh --src-branch ${sourceBranch} --src-commit ${commitID} --target-branch ${targetBranch} --target-commit latest"
|
||||
} else {
|
||||
sh "git fetch"
|
||||
sh "git checkout -f ${commitID}"
|
||||
}
|
||||
} else {
|
||||
echo "\u274C Some parameters are missing"
|
||||
sh "./ci-scripts/fail.sh"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
stage ("Deploy and Test") {
|
||||
steps {
|
||||
script {
|
||||
dir ('ci-scripts') {
|
||||
echo "\u2705 \u001B[94m Deploy and Test: ${testStageName}\u001B[0m"
|
||||
String[] myXmlTestSuite = testXMLFile.split("\\r?\\n")
|
||||
for (xmlFile in myXmlTestSuite) {
|
||||
if (fileExists(xmlFile)) {
|
||||
mainPythonAllXmlFiles += "--XMLTestFile=" + xmlFile + " "
|
||||
echo "Test XML file : ${xmlFile}"
|
||||
} else {
|
||||
echo "Test XML file ${xmlFile}: no such file"
|
||||
}
|
||||
}
|
||||
sh """
|
||||
python3 main.py --mode=InitiateHtml --ranRepository=${targetRepository} \
|
||||
--ranBranch=${sourceBranch} --ranCommitID=${commitID} \
|
||||
--ranAllowMerge=${is_MR} --ranTargetBranch=${targetBranch} \
|
||||
${flexricOption} ${mainPythonAllXmlFiles}
|
||||
"""
|
||||
if (runWithOC) {
|
||||
withCredentials([usernamePassword(credentialsId: "${params.OC_Credentials}", usernameVariable: 'OC_Username', passwordVariable: 'OC_Password')]) {
|
||||
sh """
|
||||
python3 main.py --mode=InitiateHtml --ranRepository=${targetRepository} \
|
||||
--ranBranch=${sourceBranch} --ranCommitID=${commitID} \
|
||||
--ranAllowMerge=${is_MR} --ranTargetBranch=${targetBranch} \
|
||||
${flexricOption} ${mainPythonAllXmlFiles}
|
||||
"""
|
||||
for (xmlFile in myXmlTestSuite) {
|
||||
if (fileExists(xmlFile)) {
|
||||
try {
|
||||
timeout (time: 60, unit: 'MINUTES') {
|
||||
sh """
|
||||
python3 main.py --mode=TesteNB --ranRepository=${targetRepository} \
|
||||
--ranBranch=${sourceBranch} --ranCommitID=${commitID} \
|
||||
--ranAllowMerge=${is_MR} --ranTargetBranch=${targetBranch} \
|
||||
--eNBSourceCodePath=${params.eNB_SourceCodePath} --XMLTestFile=${xmlFile} \
|
||||
--OCUserName=${OC_Username} --OCPassword=${OC_Password} --OCProjectName=${OC_ProjectName} \
|
||||
${flexricOption}
|
||||
"""
|
||||
}
|
||||
} catch (Exception e) {
|
||||
currentBuild.result = 'FAILURE'
|
||||
buildStageStatus = false
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
} else {
|
||||
for (xmlFile in myXmlTestSuite) {
|
||||
if (fileExists(xmlFile)) {
|
||||
try {
|
||||
timeout (time: 60, unit: 'MINUTES') {
|
||||
sh """
|
||||
python3 main.py --mode=TesteNB --ranRepository=${targetRepository} \
|
||||
--ranBranch=${sourceBranch} --ranCommitID=${commitID} \
|
||||
--ranAllowMerge=${is_MR} --ranTargetBranch=${targetBranch} \
|
||||
--eNBSourceCodePath=${params.eNB_SourceCodePath} --XMLTestFile=${xmlFile} \
|
||||
${flexricOption}
|
||||
"""
|
||||
}
|
||||
} catch (Exception e) {
|
||||
currentBuild.result = 'FAILURE'
|
||||
buildStageStatus = false
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
sh "python3 main.py --mode=FinalizeHtml --finalStatus=${buildStageStatus}"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
stage ("Log Collection") {
|
||||
steps {
|
||||
script {
|
||||
echo '\u2705 \u001B[94mLog Collection\u001B[0m'
|
||||
dir ('ci-scripts') {
|
||||
// Zipping all archived log files
|
||||
sh "mkdir test_logs"
|
||||
sh "mv *.log* test_logs || true"
|
||||
// Zip all log files matching cmake_targets/{*.log*,log/*} into test_logs_XXXX.zip
|
||||
if (fileExists('../cmake_targets/log')) {
|
||||
sh "mv ../cmake_targets/log/* test_logs || true"
|
||||
}
|
||||
sh "zip -r -qq test_logs_${env.BUILD_ID}.zip *test_log*/"
|
||||
sh "rm -rf *test_log*/"
|
||||
if (fileExists("test_logs_${env.BUILD_ID}.zip")) {
|
||||
archiveArtifacts artifacts: "test_logs_${env.BUILD_ID}.zip"
|
||||
}
|
||||
if (fileExists("test_results.html")) {
|
||||
def reportName = "test_results-${env.JOB_NAME}.html"
|
||||
sh "mv test_results.html ${reportName}"
|
||||
sh """
|
||||
sed -i -e 's#TEMPLATE_BUILD_TIME#${JOB_TIMESTAMP}#' \
|
||||
-e 's#TEMPLATE_JOB_NAME#${JOB_NAME}#' \
|
||||
-e 's@build #TEMPLATE_BUILD_ID@build #${BUILD_ID}@' \
|
||||
-e 's#Build-ID: TEMPLATE_BUILD_ID#Build-ID: <a href=\"${BUILD_URL}\">${BUILD_ID}</a>#' \
|
||||
-e 's#TEMPLATE_STAGE_NAME#${testStageName}#' ${reportName}
|
||||
"""
|
||||
archiveArtifacts artifacts: "${reportName}"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -43,10 +43,6 @@ import constants as CONST
|
||||
|
||||
def ArgsParse(argvs,CiTestObj,RAN,HTML,CONTAINERS,HELP,SCA,CLUSTER):
|
||||
|
||||
|
||||
py_param_file_present = False
|
||||
py_params={}
|
||||
|
||||
force_local = False
|
||||
while len(argvs) > 1:
|
||||
myArgv = argvs.pop(1) # 0th is this file's name
|
||||
@@ -172,4 +168,4 @@ def ArgsParse(argvs,CiTestObj,RAN,HTML,CONTAINERS,HELP,SCA,CLUSTER):
|
||||
HELP.GenericHelp(CONST.Version)
|
||||
sys.exit('Invalid Parameter: ' + myArgv)
|
||||
|
||||
return py_param_file_present, py_params, mode, force_local
|
||||
return mode, force_local
|
||||
|
||||
+23
-25
@@ -233,10 +233,10 @@ def Custom_Command(HTML, node, command):
|
||||
HTML.CreateHtmlTestRowQueue(command, status, message)
|
||||
return status == 'OK' or status == 'Warning'
|
||||
|
||||
def Custom_Script(HTML, node, script):
|
||||
def Custom_Script(HTML, node, script, args):
|
||||
logging.info(f"Executing custom script on {node}")
|
||||
with cls_cmd.getConnection(node) as c:
|
||||
ret = c.exec_script(script, 90)
|
||||
ret = c.exec_script(script, 90, args)
|
||||
logging.debug(f"Custom_Script: {script} on node: {node} - return code {ret.returncode}, output:\n{ret.stdout}")
|
||||
status = 'OK'
|
||||
message = [ret.stdout]
|
||||
@@ -299,18 +299,16 @@ class OaiCiTest():
|
||||
self.iperf_packetloss_threshold = ''
|
||||
self.iperf_bitrate_threshold = ''
|
||||
self.iperf_profile = ''
|
||||
self.iperf_options = ''
|
||||
self.iperf_tcp_rate_target = ''
|
||||
self.finalStatus = False
|
||||
self.air_interface=''
|
||||
self.ue_ids = []
|
||||
self.nodes = []
|
||||
self.svr_node = None
|
||||
self.svr_id = None
|
||||
self.cmd_prefix = '' # prefix before {lte,nr}-uesoftmodem
|
||||
|
||||
def InitializeUE(self, HTML):
|
||||
ues = [cls_module.Module_UE(n.strip()) for n in self.ue_ids]
|
||||
def InitializeUE(self, node, HTML):
|
||||
ues = [cls_module.Module_UE(n.strip(), node) for n in self.ue_ids]
|
||||
messages = []
|
||||
with concurrent.futures.ThreadPoolExecutor(max_workers=64) as executor:
|
||||
futures = [executor.submit(ue.initialize) for ue in ues]
|
||||
@@ -321,8 +319,8 @@ class OaiCiTest():
|
||||
HTML.CreateHtmlTestRowQueue('N/A', 'OK', messages)
|
||||
return True
|
||||
|
||||
def AttachUE(self, HTML):
|
||||
ues = [cls_module.Module_UE(ue_id, server_name) for ue_id, server_name in zip(self.ue_ids, self.nodes)]
|
||||
def AttachUE(self, node, HTML):
|
||||
ues = [cls_module.Module_UE(ue_id, node) for ue_id in self.ue_ids]
|
||||
with concurrent.futures.ThreadPoolExecutor(max_workers=64) as executor:
|
||||
futures = [executor.submit(ue.attach) for ue in ues]
|
||||
attached = [f.result() for f in futures]
|
||||
@@ -337,8 +335,8 @@ class OaiCiTest():
|
||||
HTML.CreateHtmlTestRowQueue('N/A', 'KO', ["Could not retrieve UE IP address(es) or MTU(s) wrong!"])
|
||||
return success
|
||||
|
||||
def DetachUE(self, HTML):
|
||||
ues = [cls_module.Module_UE(ue_id, server_name) for ue_id, server_name in zip(self.ue_ids, self.nodes)]
|
||||
def DetachUE(self, node, HTML):
|
||||
ues = [cls_module.Module_UE(ue_id, node) for ue_id in self.ue_ids]
|
||||
with concurrent.futures.ThreadPoolExecutor(max_workers=64) as executor:
|
||||
futures = [executor.submit(ue.detach) for ue in ues]
|
||||
[f.result() for f in futures]
|
||||
@@ -346,8 +344,8 @@ class OaiCiTest():
|
||||
HTML.CreateHtmlTestRowQueue('NA', 'OK', messages)
|
||||
return True
|
||||
|
||||
def DataDisableUE(self, HTML):
|
||||
ues = [cls_module.Module_UE(n.strip()) for n in self.ue_ids]
|
||||
def DataDisableUE(self, node, HTML):
|
||||
ues = [cls_module.Module_UE(n.strip(), node) for n in self.ue_ids]
|
||||
with concurrent.futures.ThreadPoolExecutor(max_workers=64) as executor:
|
||||
futures = [executor.submit(ue.dataDisable) for ue in ues]
|
||||
status = [f.result() for f in futures]
|
||||
@@ -360,8 +358,8 @@ class OaiCiTest():
|
||||
HTML.CreateHtmlTestRowQueue('N/A', 'KO', ["Could not disable UE data!"])
|
||||
return success
|
||||
|
||||
def DataEnableUE(self, HTML):
|
||||
ues = [cls_module.Module_UE(n.strip()) for n in self.ue_ids]
|
||||
def DataEnableUE(self, node, HTML):
|
||||
ues = [cls_module.Module_UE(n.strip(), node) for n in self.ue_ids]
|
||||
logging.debug(f'disabling data for UEs {ues}')
|
||||
with concurrent.futures.ThreadPoolExecutor(max_workers=64) as executor:
|
||||
futures = [executor.submit(ue.dataEnable) for ue in ues]
|
||||
@@ -375,8 +373,8 @@ class OaiCiTest():
|
||||
HTML.CreateHtmlTestRowQueue('N/A', 'KO', ["Could not enable UE data!"])
|
||||
return success
|
||||
|
||||
def CheckStatusUE(self,HTML):
|
||||
ues = [cls_module.Module_UE(n.strip()) for n in self.ue_ids]
|
||||
def CheckStatusUE(self, node, HTML):
|
||||
ues = [cls_module.Module_UE(n.strip(), node) for n in self.ue_ids]
|
||||
logging.debug(f'checking status of UEs {ues}')
|
||||
messages = []
|
||||
with concurrent.futures.ThreadPoolExecutor(max_workers=64) as executor:
|
||||
@@ -446,10 +444,10 @@ class OaiCiTest():
|
||||
|
||||
return (True, message)
|
||||
|
||||
def Ping(self, ctx, HTML, infra_file="ci_infra.yaml"):
|
||||
def Ping(self, ctx, node, HTML, infra_file="ci_infra.yaml"):
|
||||
if self.ue_ids == [] or self.svr_id == None:
|
||||
raise Exception("no module names in self.ue_ids or/and self.svr_id provided")
|
||||
ues = [cls_module.Module_UE(ue_id, server_name, infra_file) for ue_id, server_name in zip(self.ue_ids, self.nodes)]
|
||||
ues = [cls_module.Module_UE(ue_id, node, infra_file) for ue_id in self.ue_ids]
|
||||
cn = cls_corenetwork.CoreNetwork(self.svr_id, self.svr_node, filename=infra_file)
|
||||
with concurrent.futures.ThreadPoolExecutor(max_workers=64) as executor:
|
||||
futures = [executor.submit(self.Ping_common, ctx, cn, ue) for ue in ues]
|
||||
@@ -520,12 +518,12 @@ class OaiCiTest():
|
||||
|
||||
return (status, f'{ue_header}\n{msg}')
|
||||
|
||||
def Iperf(self, ctx, HTML, infra_file="ci_infra.yaml"):
|
||||
logging.debug(f'Iperf: iperf_args "{self.iperf_args}" iperf_packetloss_threshold "{self.iperf_packetloss_threshold}" iperf_bitrate_threshold "{self.iperf_bitrate_threshold}" iperf_profile "{self.iperf_profile}" iperf_options "{self.iperf_options}"')
|
||||
def Iperf(self, ctx, node, HTML, infra_file="ci_infra.yaml"):
|
||||
logging.debug(f'Iperf: iperf_args "{self.iperf_args}" iperf_packetloss_threshold "{self.iperf_packetloss_threshold}" iperf_bitrate_threshold "{self.iperf_bitrate_threshold}" iperf_profile "{self.iperf_profile}"')
|
||||
|
||||
if self.ue_ids == [] or self.svr_id == None:
|
||||
raise Exception("no module names in self.ue_ids or/and self.svr_id provided")
|
||||
ues = [cls_module.Module_UE(ue_id, server_name, infra_file) for ue_id, server_name in zip(self.ue_ids, self.nodes)]
|
||||
ues = [cls_module.Module_UE(ue_id, node, infra_file) for ue_id in self.ue_ids]
|
||||
cn = cls_corenetwork.CoreNetwork(self.svr_id, self.svr_node, filename=infra_file)
|
||||
with concurrent.futures.ThreadPoolExecutor(max_workers=64) as executor:
|
||||
futures = [executor.submit(self.Iperf_Module, ctx, cn, ue, i, len(ues)) for i, ue in enumerate(ues)]
|
||||
@@ -549,10 +547,10 @@ class OaiCiTest():
|
||||
HTML.CreateHtmlTestRowQueue(self.iperf_args, 'KO', messages)
|
||||
return success
|
||||
|
||||
def Iperf2_Unidir(self, ctx, HTML, infra_file="ci_infra.yaml"):
|
||||
def Iperf2_Unidir(self, ctx, node, HTML, infra_file="ci_infra.yaml"):
|
||||
if self.ue_ids == [] or self.svr_id == None or len(self.ue_ids) != 1:
|
||||
raise Exception("no module names in self.ue_ids or/and self.svr_id provided, multi UE scenario not supported")
|
||||
ue = cls_module.Module_UE(self.ue_ids[0].strip(),self.nodes[0].strip(), infra_file)
|
||||
ue = cls_module.Module_UE(self.ue_ids[0].strip(), node, infra_file)
|
||||
cn = cls_corenetwork.CoreNetwork(self.svr_id, self.svr_node, filename=infra_file)
|
||||
ueIP = ue.getIP()
|
||||
if not ueIP:
|
||||
@@ -852,8 +850,8 @@ class OaiCiTest():
|
||||
global_status = CONST.OAI_UE_PROCESS_COULD_NOT_SYNC
|
||||
return global_status
|
||||
|
||||
def TerminateUE(self, ctx, HTML):
|
||||
ues = [cls_module.Module_UE(n.strip()) for n in self.ue_ids]
|
||||
def TerminateUE(self, ctx, node, HTML):
|
||||
ues = [cls_module.Module_UE(n.strip(), node) for n in self.ue_ids]
|
||||
with concurrent.futures.ThreadPoolExecutor(max_workers=64) as executor:
|
||||
futures = [executor.submit(ue.terminate, ctx) for ue in ues]
|
||||
archives = [f.result() for f in futures]
|
||||
|
||||
@@ -0,0 +1,256 @@
|
||||
Active_gNBs = ( "gNB-OAI");
|
||||
# Asn1_verbosity, choice in: none, info, annoying
|
||||
Asn1_verbosity = "none";
|
||||
|
||||
gNBs =
|
||||
(
|
||||
{
|
||||
////////// Identification parameters:
|
||||
gNB_ID = 0xe00;
|
||||
gNB_name = "gNB-OAI";
|
||||
|
||||
// Tracking area code, 0x0000 and 0xfffe are reserved values
|
||||
tracking_area_code = 1;
|
||||
|
||||
plmn_list = ({mcc = 208; mnc = 97; mnc_length = 2;});
|
||||
|
||||
////////// Physical parameters:
|
||||
|
||||
min_rxtxtime = 6;
|
||||
|
||||
servingCellConfigCommon = (
|
||||
{
|
||||
#spCellConfigCommon
|
||||
|
||||
physCellId = 0;
|
||||
|
||||
# downlinkConfigCommon
|
||||
#frequencyInfoDL
|
||||
# this is 3300.60 MHz + 53*12*30e-3 MHz = 3319.68
|
||||
absoluteFrequencySSB = 621312;
|
||||
# this is 3300.60 MHz
|
||||
dl_absoluteFrequencyPointA = 620040;
|
||||
#scs-SpecificCarrierList
|
||||
dl_offstToCarrier = 0;
|
||||
# subcarrierSpacing
|
||||
# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
|
||||
dl_subcarrierSpacing = 1;
|
||||
dl_carrierBandwidth = 106;
|
||||
#initialDownlinkBWP
|
||||
#genericParameters
|
||||
# this is RBstart=0,L=106 (275*(L-1))+RBstart
|
||||
initialDLBWPlocationAndBandwidth = 28875;
|
||||
# subcarrierSpacing
|
||||
# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
|
||||
initialDLBWPsubcarrierSpacing = 1;
|
||||
#pdcch-ConfigCommon
|
||||
initialDLBWPcontrolResourceSetZero = 11;
|
||||
initialDLBWPsearchSpaceZero = 0;
|
||||
|
||||
#uplinkConfigCommon
|
||||
#frequencyInfoUL
|
||||
ul_frequencyBand = 78;
|
||||
#scs-SpecificCarrierList
|
||||
ul_offstToCarrier = 0;
|
||||
# subcarrierSpacing
|
||||
# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
|
||||
ul_subcarrierSpacing = 1;
|
||||
ul_carrierBandwidth = 106;
|
||||
pMax = 20;
|
||||
#initialUplinkBWP
|
||||
#genericParameters
|
||||
initialULBWPlocationAndBandwidth = 28875;
|
||||
# subcarrierSpacing
|
||||
# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
|
||||
initialULBWPsubcarrierSpacing = 1;
|
||||
#rach-ConfigCommon
|
||||
#rach-ConfigGeneric
|
||||
prach_ConfigurationIndex = 98;
|
||||
#prach_msg1_FDM
|
||||
#0 = one, 1=two, 2=four, 3=eight
|
||||
prach_msg1_FDM = 0;
|
||||
prach_msg1_FrequencyStart = 0;
|
||||
zeroCorrelationZoneConfig = 12;
|
||||
preambleReceivedTargetPower = -104;
|
||||
#preamblTransMax (0...10) = (3,4,5,6,7,8,10,20,50,100,200)
|
||||
preambleTransMax = 6;
|
||||
#powerRampingStep
|
||||
# 0=dB0,1=dB2,2=dB4,3=dB6
|
||||
powerRampingStep = 1;
|
||||
#ssb_perRACH_OccasionAndCB_PreamblesPerSSB_PR
|
||||
#1=oneeighth,2=onefourth,3=half,4=one,5=two,6=four,7=eight,8=sixteen
|
||||
ssb_perRACH_OccasionAndCB_PreamblesPerSSB_PR = 4;
|
||||
#one (0..15) 4,8,12,16,...60,64
|
||||
ssb_perRACH_OccasionAndCB_PreamblesPerSSB = 15;
|
||||
#ra_ContentionResolutionTimer
|
||||
#(0..7) 8,16,24,32,40,48,56,64
|
||||
ra_ContentionResolutionTimer = 7;
|
||||
rsrp_ThresholdSSB = 19;
|
||||
#prach-RootSequenceIndex_PR
|
||||
#1 = 839, 2 = 139
|
||||
prach_RootSequenceIndex_PR = 2;
|
||||
prach_RootSequenceIndex = 1;
|
||||
# SCS for msg1, can only be 15 for 30 kHz < 6 GHz, takes precendence over the one derived from prach-ConfigIndex
|
||||
#
|
||||
msg1_SubcarrierSpacing = 1,
|
||||
# restrictedSetConfig
|
||||
# 0=unrestricted, 1=restricted type A, 2=restricted type B
|
||||
restrictedSetConfig = 0,
|
||||
|
||||
msg3_DeltaPreamble = 1;
|
||||
p0_NominalWithGrant =-90;
|
||||
|
||||
# pucch-ConfigCommon setup :
|
||||
# pucchGroupHopping
|
||||
# 0 = neither, 1= group hopping, 2=sequence hopping
|
||||
pucchGroupHopping = 0;
|
||||
hoppingId = 40;
|
||||
p0_nominal = -90;
|
||||
|
||||
ssb_PositionsInBurst_Bitmap = 1;
|
||||
|
||||
# ssb_periodicityServingCell
|
||||
# 0 = ms5, 1=ms10, 2=ms20, 3=ms40, 4=ms80, 5=ms160, 6=spare2, 7=spar e1
|
||||
ssb_periodicityServingCell = 2;
|
||||
|
||||
# dmrs_TypeA_position
|
||||
# 0 = pos2, 1 = pos3
|
||||
dmrs_TypeA_Position = 0;
|
||||
|
||||
# subcarrierSpacing
|
||||
# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
|
||||
subcarrierSpacing = 1;
|
||||
|
||||
|
||||
#tdd-UL-DL-ConfigurationCommon
|
||||
# subcarrierSpacing
|
||||
# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
|
||||
referenceSubcarrierSpacing = 1;
|
||||
# pattern1
|
||||
# dl_UL_TransmissionPeriodicity
|
||||
# 0=ms0p5, 1=ms0p625, 2=ms1, 3=ms1p25, 4=ms2, 5=ms2p5, 6=ms5, 7=ms10
|
||||
dl_UL_TransmissionPeriodicity = 6;
|
||||
nrofDownlinkSlots = 7;
|
||||
nrofDownlinkSymbols = 6;
|
||||
nrofUplinkSlots = 2;
|
||||
nrofUplinkSymbols = 4;
|
||||
|
||||
ssPBCH_BlockPower = -25;
|
||||
}
|
||||
|
||||
);
|
||||
|
||||
|
||||
# ------- SCTP definitions
|
||||
SCTP :
|
||||
{
|
||||
# Number of streams to use in input/output
|
||||
SCTP_INSTREAMS = 2;
|
||||
SCTP_OUTSTREAMS = 2;
|
||||
};
|
||||
|
||||
////////// AMF parameters:
|
||||
amf_ip_address = ({ ipv4 = "CI_MME_IP_ADDR"; });
|
||||
|
||||
NETWORK_INTERFACES :
|
||||
{
|
||||
|
||||
GNB_IPV4_ADDRESS_FOR_NG_AMF = "CI_GNB_IP_ADDR";
|
||||
GNB_IPV4_ADDRESS_FOR_NGU = "CI_GNB_IP_ADDR";
|
||||
GNB_PORT_FOR_S1U = 2152; # Spec 2152
|
||||
};
|
||||
|
||||
}
|
||||
);
|
||||
|
||||
MACRLCs = (
|
||||
{
|
||||
num_cc = 1;
|
||||
tr_s_preference = "local_L1";
|
||||
tr_n_preference = "local_RRC";
|
||||
pusch_TargetSNRx10 = 200;
|
||||
pucch_TargetSNRx10 = 200;
|
||||
}
|
||||
);
|
||||
|
||||
prs_config = (
|
||||
{
|
||||
NumPRSResources = 1;
|
||||
PRSResourceSetPeriod = [20, 2];
|
||||
SymbolStart = [7];
|
||||
NumPRSSymbols = [6];
|
||||
NumRB = 106;
|
||||
RBOffset = 0;
|
||||
CombSize = 4;
|
||||
REOffset = [0];
|
||||
PRSResourceOffset = [0];
|
||||
PRSResourceRepetition = 1;
|
||||
PRSResourceTimeGap = 1;
|
||||
NPRS_ID = [0];
|
||||
MutingPattern1 = [];
|
||||
MutingPattern2 = [];
|
||||
MutingBitRepetition = 1;
|
||||
}
|
||||
);
|
||||
|
||||
L1s = (
|
||||
{
|
||||
num_cc = 1;
|
||||
tr_n_preference = "local_mac";
|
||||
prach_dtx_threshold = 120;
|
||||
}
|
||||
);
|
||||
|
||||
RUs = (
|
||||
{
|
||||
local_rf = "yes"
|
||||
nb_tx = 1
|
||||
nb_rx = 1
|
||||
att_tx = 0
|
||||
att_rx = 0;
|
||||
bands = [78];
|
||||
max_pdschReferenceSignalPower = -27;
|
||||
max_rxgain = 75;
|
||||
sf_extension = 0;
|
||||
eNB_instances = [0];
|
||||
}
|
||||
);
|
||||
|
||||
|
||||
rfsimulator :
|
||||
{
|
||||
serveraddr = "server";
|
||||
serverport = 4043;
|
||||
options = (); #("saviq"); or/and "chanmod"
|
||||
modelname = "AWGN";
|
||||
IQfile = "/tmp/rfsimulator.iqs";
|
||||
};
|
||||
|
||||
security = {
|
||||
# preferred ciphering algorithms
|
||||
# the first one of the list that an UE supports in chosen
|
||||
# valid values: nea0, nea1, nea2, nea3
|
||||
ciphering_algorithms = ( "nea0" );
|
||||
|
||||
# preferred integrity algorithms
|
||||
# the first one of the list that an UE supports in chosen
|
||||
# valid values: nia0, nia1, nia2, nia3
|
||||
integrity_algorithms = ( "nia2", "nia0" );
|
||||
|
||||
# setting 'drb_ciphering' to "no" disables ciphering for DRBs, no matter
|
||||
# what 'ciphering_algorithms' configures; same thing for 'drb_integrity'
|
||||
drb_ciphering = "yes";
|
||||
drb_integrity = "no";
|
||||
};
|
||||
|
||||
log_config :
|
||||
{
|
||||
global_log_level = "info";
|
||||
hw_log_level = "info";
|
||||
phy_log_level = "info";
|
||||
mac_log_level = "info";
|
||||
rlc_log_level = "info";
|
||||
pdcp_log_level = "info";
|
||||
rrc_log_level = "info";
|
||||
f1ap_log_level = "debug";
|
||||
};
|
||||
@@ -0,0 +1,89 @@
|
||||
PRSs =
|
||||
(
|
||||
{
|
||||
Active_gNBs = 1;
|
||||
prs_config0 = (
|
||||
{
|
||||
gNB_id = 0;
|
||||
NumPRSResources = 1;
|
||||
PRSResourceSetPeriod = [20, 2];
|
||||
SymbolStart = [7];
|
||||
NumPRSSymbols = [6];
|
||||
NumRB = 106;
|
||||
RBOffset = 0;
|
||||
CombSize = 4;
|
||||
REOffset = [0];
|
||||
PRSResourceOffset = [0];
|
||||
PRSResourceRepetition = 1;
|
||||
PRSResourceTimeGap = 1;
|
||||
NPRS_ID = [0];
|
||||
MutingPattern1 = [];
|
||||
MutingPattern2 = [];
|
||||
MutingBitRepetition = 1;
|
||||
}
|
||||
);
|
||||
|
||||
prs_config1 = (
|
||||
{
|
||||
gNB_id = 1;
|
||||
NumPRSResources = 1;
|
||||
PRSResourceSetPeriod = [20, 2];
|
||||
SymbolStart = [7];
|
||||
NumPRSSymbols = [6];
|
||||
NumRB = 106;
|
||||
RBOffset = 0;
|
||||
CombSize = 4;
|
||||
REOffset = [0];
|
||||
PRSResourceOffset = [1];
|
||||
PRSResourceRepetition = 1;
|
||||
PRSResourceTimeGap = 1;
|
||||
NPRS_ID = [1];
|
||||
MutingPattern1 = [];
|
||||
MutingPattern2 = [];
|
||||
MutingBitRepetition = 1;
|
||||
}
|
||||
);
|
||||
|
||||
prs_config2 = (
|
||||
{
|
||||
gNB_id = 2;
|
||||
NumPRSResources = 1;
|
||||
PRSResourceSetPeriod = [20, 2];
|
||||
SymbolStart = [7];
|
||||
NumPRSSymbols = [6];
|
||||
NumRB = 106;
|
||||
RBOffset = 0;
|
||||
CombSize = 4;
|
||||
REOffset = [0];
|
||||
PRSResourceOffset = [2];
|
||||
PRSResourceRepetition = 1;
|
||||
PRSResourceTimeGap = 1;
|
||||
NPRS_ID = [2];
|
||||
MutingPattern1 = [];
|
||||
MutingPattern2 = [];
|
||||
MutingBitRepetition = 1;
|
||||
}
|
||||
);
|
||||
|
||||
prs_config3 = (
|
||||
{
|
||||
gNB_id = 3;
|
||||
NumPRSResources = 1;
|
||||
PRSResourceSetPeriod = [20, 2];
|
||||
SymbolStart = [7];
|
||||
NumPRSSymbols = [6];
|
||||
NumRB = 106;
|
||||
RBOffset = 0;
|
||||
CombSize = 4;
|
||||
REOffset = [0];
|
||||
PRSResourceOffset = [3];
|
||||
PRSResourceRepetition = 1;
|
||||
PRSResourceTimeGap = 1;
|
||||
NPRS_ID = [3];
|
||||
MutingPattern1 = [];
|
||||
MutingPattern2 = [];
|
||||
MutingBitRepetition = 1;
|
||||
}
|
||||
);
|
||||
}
|
||||
);
|
||||
+30
-88
@@ -85,15 +85,7 @@ def CheckClassValidity(xml_class_list,action,id):
|
||||
resp=True
|
||||
return resp
|
||||
|
||||
#assigning parameters to object instance attributes (even if the attributes do not exist !!)
|
||||
def AssignParams(params_dict):
|
||||
|
||||
for key,value in params_dict.items():
|
||||
setattr(CiTestObj, key, value)
|
||||
setattr(RAN, key, value)
|
||||
setattr(HTML, key, value)
|
||||
|
||||
def ExecuteActionWithParam(action, ctx):
|
||||
def ExecuteActionWithParam(action, ctx, node):
|
||||
global RAN
|
||||
global HTML
|
||||
global CONTAINERS
|
||||
@@ -102,7 +94,6 @@ def ExecuteActionWithParam(action, ctx):
|
||||
if action == 'Build_eNB' or action == 'Build_Image' or action == 'Build_Proxy' or action == "Build_Cluster_Image" or action == "Build_Run_Tests":
|
||||
RAN.Build_eNB_args=test.findtext('Build_eNB_args')
|
||||
CONTAINERS.imageKind=test.findtext('kind')
|
||||
node = test.findtext('node')
|
||||
proxy_commit = test.findtext('proxy_commit')
|
||||
if proxy_commit is not None:
|
||||
CONTAINERS.proxyCommit = proxy_commit
|
||||
@@ -118,7 +109,6 @@ def ExecuteActionWithParam(action, ctx):
|
||||
success = CONTAINERS.BuildRunTests(ctx, node, HTML)
|
||||
|
||||
elif action == 'Initialize_eNB':
|
||||
node = test.findtext('node')
|
||||
datalog_rt_stats_file=test.findtext('rt_stats_cfg')
|
||||
if datalog_rt_stats_file is None:
|
||||
RAN.datalog_rt_stats_file='datalog_rt_stats.default.yaml'
|
||||
@@ -139,7 +129,6 @@ def ExecuteActionWithParam(action, ctx):
|
||||
success = RAN.InitializeeNB(ctx, node, HTML)
|
||||
|
||||
elif action == 'Terminate_eNB':
|
||||
node = test.findtext('node')
|
||||
#retx checkers
|
||||
string_field = test.findtext('d_retx_th')
|
||||
if (string_field is not None):
|
||||
@@ -158,68 +147,35 @@ def ExecuteActionWithParam(action, ctx):
|
||||
|
||||
elif action == 'Initialize_UE' or action == 'Attach_UE' or action == 'Detach_UE' or action == 'Terminate_UE' or action == 'CheckStatusUE' or action == 'DataEnable_UE' or action == 'DataDisable_UE':
|
||||
CiTestObj.ue_ids = test.findtext('id').split(' ')
|
||||
if force_local:
|
||||
# Change all execution targets to localhost
|
||||
CiTestObj.nodes = ['localhost'] * len(CiTestObj.ue_ids)
|
||||
else:
|
||||
if test.findtext('nodes'):
|
||||
CiTestObj.nodes = test.findtext('nodes').split(' ')
|
||||
if len(CiTestObj.ue_ids) != len(CiTestObj.nodes):
|
||||
logging.error('Number of Nodes are not equal to the total number of UEs')
|
||||
sys.exit("Mismatch in number of Nodes and UIs")
|
||||
else:
|
||||
CiTestObj.nodes = [None] * len(CiTestObj.ue_ids)
|
||||
if action == 'Initialize_UE':
|
||||
success = CiTestObj.InitializeUE(HTML)
|
||||
success = CiTestObj.InitializeUE(node, HTML)
|
||||
elif action == 'Attach_UE':
|
||||
success = CiTestObj.AttachUE(HTML)
|
||||
success = CiTestObj.AttachUE(node, HTML)
|
||||
elif action == 'Detach_UE':
|
||||
success = CiTestObj.DetachUE(HTML)
|
||||
success = CiTestObj.DetachUE(node, HTML)
|
||||
elif action == 'Terminate_UE':
|
||||
success = CiTestObj.TerminateUE(ctx, HTML)
|
||||
success = CiTestObj.TerminateUE(ctx, node, HTML)
|
||||
elif action == 'CheckStatusUE':
|
||||
success = CiTestObj.CheckStatusUE(HTML)
|
||||
success = CiTestObj.CheckStatusUE(node, HTML)
|
||||
elif action == 'DataEnable_UE':
|
||||
success = CiTestObj.DataEnableUE(HTML)
|
||||
success = CiTestObj.DataEnableUE(node, HTML)
|
||||
elif action == 'DataDisable_UE':
|
||||
success = CiTestObj.DataDisableUE(HTML)
|
||||
success = CiTestObj.DataDisableUE(node, HTML)
|
||||
|
||||
elif action == 'Ping':
|
||||
CiTestObj.ping_args = test.findtext('ping_args')
|
||||
CiTestObj.ping_packetloss_threshold = test.findtext('ping_packetloss_threshold')
|
||||
CiTestObj.ue_ids = test.findtext('id').split(' ')
|
||||
CiTestObj.svr_id = test.findtext('svr_id') or None
|
||||
CiTestObj.svr_id = test.findtext('svr_id')
|
||||
if test.findtext('svr_node'):
|
||||
CiTestObj.svr_node = test.findtext('svr_node') if not force_local else 'localhost'
|
||||
if force_local:
|
||||
# Change all execution targets to localhost
|
||||
CiTestObj.nodes = ['localhost'] * len(CiTestObj.ue_ids)
|
||||
else:
|
||||
if test.findtext('nodes'):
|
||||
CiTestObj.nodes = test.findtext('nodes').split(' ')
|
||||
if len(CiTestObj.ue_ids) != len(CiTestObj.nodes):
|
||||
logging.error('Number of Nodes are not equal to the total number of UEs')
|
||||
sys.exit("Mismatch in number of Nodes and UIs")
|
||||
else:
|
||||
CiTestObj.nodes = [None] * len(CiTestObj.ue_ids)
|
||||
ping_rttavg_threshold = test.findtext('ping_rttavg_threshold') or ''
|
||||
success = CiTestObj.Ping(ctx, HTML)
|
||||
success = CiTestObj.Ping(ctx, node, HTML)
|
||||
|
||||
elif action == 'Iperf' or action == 'Iperf2_Unidir':
|
||||
CiTestObj.iperf_args = test.findtext('iperf_args')
|
||||
CiTestObj.ue_ids = test.findtext('id').split(' ')
|
||||
CiTestObj.svr_id = test.findtext('svr_id') or None
|
||||
if force_local:
|
||||
# Change all execution targets to localhost
|
||||
CiTestObj.nodes = ['localhost'] * len(CiTestObj.ue_ids)
|
||||
else:
|
||||
if test.findtext('nodes'):
|
||||
CiTestObj.nodes = test.findtext('nodes').split(' ')
|
||||
if len(CiTestObj.ue_ids) != len(CiTestObj.nodes):
|
||||
logging.error('Number of Nodes are not equal to the total number of UEs')
|
||||
sys.exit("Mismatch in number of Nodes and UIs")
|
||||
else:
|
||||
CiTestObj.nodes = [None] * len(CiTestObj.ue_ids)
|
||||
CiTestObj.svr_id = test.findtext('svr_id')
|
||||
if test.findtext('svr_node'):
|
||||
CiTestObj.svr_node = test.findtext('svr_node') if not force_local else 'localhost'
|
||||
CiTestObj.iperf_packetloss_threshold = test.findtext('iperf_packetloss_threshold')
|
||||
@@ -229,14 +185,10 @@ def ExecuteActionWithParam(action, ctx):
|
||||
if CiTestObj.iperf_profile != 'balanced' and CiTestObj.iperf_profile != 'unbalanced' and CiTestObj.iperf_profile != 'single-ue':
|
||||
logging.error(f'test-case has wrong profile {CiTestObj.iperf_profile}, forcing balanced')
|
||||
CiTestObj.iperf_profile = 'balanced'
|
||||
CiTestObj.iperf_options = test.findtext('iperf_options') or 'check'
|
||||
if CiTestObj.iperf_options != 'check' and CiTestObj.iperf_options != 'sink':
|
||||
logging.error('test-case has wrong option ' + CiTestObj.iperf_options)
|
||||
CiTestObj.iperf_options = 'check'
|
||||
if action == 'Iperf':
|
||||
success = CiTestObj.Iperf(ctx, HTML)
|
||||
success = CiTestObj.Iperf(ctx, node, HTML)
|
||||
elif action == 'Iperf2_Unidir':
|
||||
success = CiTestObj.Iperf2_Unidir(ctx, HTML)
|
||||
success = CiTestObj.Iperf2_Unidir(ctx, node, HTML)
|
||||
|
||||
elif action == 'IdleSleep':
|
||||
st = test.findtext('idle_sleep_time_in_sec') or "5"
|
||||
@@ -244,7 +196,6 @@ def ExecuteActionWithParam(action, ctx):
|
||||
|
||||
elif action == 'Deploy_Run_OC_PhySim':
|
||||
oc_release = test.findtext('oc_release')
|
||||
node = test.findtext('node') or None
|
||||
script = "scripts/oc-deploy-physims.sh"
|
||||
image_tag = cls_containerize.CreateTag(CLUSTER.ranCommitID, CLUSTER.ranBranch, CLUSTER.ranAllowMerge)
|
||||
options = f"oaicicd-core-for-ci-ran {oc_release} {image_tag} {CLUSTER.eNBSourceCodePath}"
|
||||
@@ -252,7 +203,6 @@ def ExecuteActionWithParam(action, ctx):
|
||||
success = cls_oaicitest.Deploy_Physim(ctx, HTML, node, workdir, script, options)
|
||||
|
||||
elif action == 'Build_Deploy_Docker_PhySim' or action == 'Build_Deploy_Source_PhySim':
|
||||
node = test.findtext('node') or None
|
||||
ctest_opt = test.findtext('ctest-opt') or ''
|
||||
script = "scripts/docker-build-and-deploy-physims.sh" if action == 'Build_Deploy_Docker_PhySim' else 'scripts/source-deploy-physims.sh'
|
||||
options = f"{CONTAINERS.eNBSourceCodePath} {ctest_opt}"
|
||||
@@ -265,7 +215,6 @@ def ExecuteActionWithParam(action, ctx):
|
||||
success = core_op(cn_id, ctx, HTML)
|
||||
|
||||
elif action == 'Deploy_Object' or action == 'Undeploy_Object' or action == "Create_Workspace":
|
||||
node = test.findtext('node')
|
||||
CONTAINERS.yamlPath = test.findtext('yaml_path')
|
||||
string_field=test.findtext('d_retx_th')
|
||||
if (string_field is not None):
|
||||
@@ -287,15 +236,12 @@ def ExecuteActionWithParam(action, ctx):
|
||||
success = CONTAINERS.Create_Workspace(node, HTML)
|
||||
|
||||
elif action == 'LicenceAndFormattingCheck':
|
||||
node = test.findtext('node')
|
||||
success = SCA.LicenceAndFormattingCheck(ctx, node, HTML)
|
||||
|
||||
elif action == 'Cppcheck_Analysis':
|
||||
node = test.findtext('node')
|
||||
success = SCA.CppCheckAnalysis(ctx, node, HTML)
|
||||
|
||||
elif action == 'Push_Local_Registry':
|
||||
node = test.findtext('node')
|
||||
tag_prefix = test.findtext('tag_prefix') or ""
|
||||
success = CONTAINERS.Push_Image_to_Local_Registry(node, HTML, tag_prefix)
|
||||
|
||||
@@ -303,7 +249,6 @@ def ExecuteActionWithParam(action, ctx):
|
||||
if force_local:
|
||||
# Do not pull or remove images when running locally. User is supposed to handle image creation & cleanup
|
||||
return True
|
||||
node = test.findtext('node')
|
||||
tag_prefix = test.findtext('tag_prefix') or ""
|
||||
images = test.findtext('images').split()
|
||||
# hack: for FlexRIC, we need to overwrite the tag to use
|
||||
@@ -316,26 +261,21 @@ def ExecuteActionWithParam(action, ctx):
|
||||
success = CONTAINERS.Clean_Test_Server_Images(HTML, node, images, tag=tag)
|
||||
|
||||
elif action == 'Custom_Command':
|
||||
node = test.findtext('node')
|
||||
if force_local:
|
||||
# Change all execution targets to localhost
|
||||
node = 'localhost'
|
||||
command = test.findtext('command')
|
||||
# Allow referencing repository workspace path in XML via %%workspace%%
|
||||
command = command.replace("%%workspace%%", CONTAINERS.eNBSourceCodePath)
|
||||
success = cls_oaicitest.Custom_Command(HTML, node, command)
|
||||
|
||||
elif action == 'Custom_Script':
|
||||
node = test.findtext('node')
|
||||
script = test.findtext('script')
|
||||
args = test.findtext('args')
|
||||
# Allow referencing repository workspace path in XML via %%workspace%%
|
||||
script = script.replace("%%workspace%%", CONTAINERS.eNBSourceCodePath)
|
||||
success = cls_oaicitest.Custom_Script(HTML, node, script)
|
||||
success = cls_oaicitest.Custom_Script(HTML, node, script, args)
|
||||
|
||||
elif action == 'Pull_Cluster_Image':
|
||||
tag_prefix = test.findtext('tag_prefix') or ""
|
||||
images = test.findtext('images').split()
|
||||
node = test.findtext('node')
|
||||
success = CLUSTER.PullClusterImage(HTML, node, images, tag_prefix=tag_prefix)
|
||||
|
||||
else:
|
||||
@@ -353,8 +293,16 @@ def test_in_list(test, list):
|
||||
return True
|
||||
return False
|
||||
|
||||
test_runner_abort = False
|
||||
def receive_signal(signum, frame):
|
||||
sys.exit(1)
|
||||
global test_runner_abort
|
||||
if not test_runner_abort:
|
||||
logging.warning("received signal, canceling steps")
|
||||
logging.info("send signal again to exit immediately")
|
||||
test_runner_abort = True
|
||||
else:
|
||||
logging.warning("received signal again, exiting")
|
||||
sys.exit(1)
|
||||
|
||||
def ShowTestID(ctx, desc):
|
||||
logging.info(f'\u001B[1m----------------------------------------\u001B[0m')
|
||||
@@ -399,16 +347,7 @@ CLUSTER = cls_cluster.Cluster()
|
||||
import args_parse
|
||||
# Force local execution, move all execution targets to localhost
|
||||
force_local = False
|
||||
py_param_file_present, py_params, mode, force_local = args_parse.ArgsParse(sys.argv,CiTestObj,RAN,HTML,CONTAINERS,HELP,SCA,CLUSTER)
|
||||
|
||||
|
||||
|
||||
#-----------------------------------------------------------
|
||||
# TEMPORARY params management (UNUSED)
|
||||
#-----------------------------------------------------------
|
||||
#temporary solution for testing:
|
||||
if py_param_file_present == True:
|
||||
AssignParams(py_params)
|
||||
mode, force_local = args_parse.ArgsParse(sys.argv,CiTestObj,RAN,HTML,CONTAINERS,HELP,SCA,CLUSTER)
|
||||
|
||||
#-----------------------------------------------------------
|
||||
# mode amd XML class (action) analysis
|
||||
@@ -554,7 +493,7 @@ elif re.match('^TesteNB$', mode, re.IGNORECASE) or re.match('^TestUE$', mode, re
|
||||
#logging.info('test will be run: ' + test)
|
||||
todo_tests.append(test)
|
||||
|
||||
signal.signal(signal.SIGUSR1, receive_signal)
|
||||
signal.signal(signal.SIGINT, receive_signal)
|
||||
|
||||
HTML.CreateHtmlTabHeader()
|
||||
|
||||
@@ -564,6 +503,8 @@ elif re.match('^TesteNB$', mode, re.IGNORECASE) or re.match('^TestUE$', mode, re
|
||||
i = 0
|
||||
for test_case_id in todo_tests:
|
||||
for test in all_tests:
|
||||
if test_runner_abort:
|
||||
task_set_succeeded = False
|
||||
id = test.get('id')
|
||||
if test_case_id != id:
|
||||
continue
|
||||
@@ -572,6 +513,7 @@ elif re.match('^TesteNB$', mode, re.IGNORECASE) or re.match('^TestUE$', mode, re
|
||||
ctx = TestCaseCtx(i, int(id), logPath)
|
||||
HTML.testCase_id=CiTestObj.testCase_id
|
||||
desc = test.findtext('desc')
|
||||
node = test.findtext('node') if not force_local else 'localhost'
|
||||
always_exec = test.findtext('always_exec') in ['True', 'true', 'Yes', 'yes']
|
||||
may_fail = test.findtext('may_fail') in ['True', 'true', 'Yes', 'yes']
|
||||
HTML.desc = desc
|
||||
@@ -586,7 +528,7 @@ elif re.match('^TesteNB$', mode, re.IGNORECASE) or re.match('^TestUE$', mode, re
|
||||
HTML.CreateHtmlTestRowQueue(msg, "SKIP", [])
|
||||
break
|
||||
try:
|
||||
test_succeeded = ExecuteActionWithParam(action, ctx)
|
||||
test_succeeded = ExecuteActionWithParam(action, ctx, node)
|
||||
if not test_succeeded and may_fail:
|
||||
logging.warning(f"test ID {test_case_id} action {action} may or may not fail, proceeding despite error")
|
||||
elif not test_succeeded:
|
||||
|
||||
+89
@@ -0,0 +1,89 @@
|
||||
#!/bin/bash
|
||||
|
||||
[[ $# -lt 1 ]] && { echo "Usage: $0 <distance_in_meters...>"; exit 1; }
|
||||
DISTANCES=("$@")
|
||||
|
||||
IP=192.168.71.150
|
||||
PORT=8091
|
||||
NCAT_TIMEOUT=1 #s
|
||||
SLEEP_WAIT=4 #s
|
||||
MAX_RETRIES=3
|
||||
|
||||
set_and_verify_distance() {
|
||||
local distance=$1
|
||||
echo "Testing PRS ToA estimation for distance: $distance m"
|
||||
|
||||
# it seems that grep returns immediately with this syntax, but not echo | ncat | grep
|
||||
# so prefer this to receive new distance immediately. We use --idle to keep
|
||||
# ncat open for some additional time
|
||||
local setdist_resp="$(grep --max-count 1 new_offset <(echo rfsimu setdistance rfsimu_channel_enB0 $distance | ncat --idle ${NCAT_TIMEOUT} ${IP} ${PORT}))"
|
||||
echo "> response: ${setdist_resp}"
|
||||
|
||||
local gettoa_resp="$(echo "ciUE get_max_dl_toa" | ncat ${IP} ${PORT} | grep "UE max PRS DL ToA")"
|
||||
echo "> response: ${gettoa_resp}"
|
||||
|
||||
[[ -z "$setdist_resp" || -z "$gettoa_resp" ]] && return 1
|
||||
|
||||
# Extract ToA values
|
||||
[[ "$setdist_resp" =~ new_offset\ ([0-9]+) ]] && local set_toa="${BASH_REMATCH[1]}" || { echo "> Set ToA extraction failed for distance: $distance m"; return 1; }
|
||||
|
||||
[[ "$gettoa_resp" =~ UE\ max\ PRS\ DL\ ToA\ ([0-9]+) ]] && local est_toa="${BASH_REMATCH[1]}" || { echo "> Estimated ToA extraction failed for distance: $distance m"; return 1; }
|
||||
|
||||
# Compare extracted ToA values
|
||||
[[ $set_toa == $est_toa ]] && echo "PRS SUCCESS for distance: $distance m" || { echo "PRS FAILURE for distance: $distance m (Actual ToA=$set_toa, Estimated ToA=$est_toa)" ; return 1; }
|
||||
|
||||
}
|
||||
|
||||
test_distance() {
|
||||
local distance=$1 retries=0
|
||||
|
||||
# retry loop incase we didn't receive the response
|
||||
while (( retries < MAX_RETRIES )); do
|
||||
echo " Attempt $((retries + 1))/$MAX_RETRIES"
|
||||
|
||||
# Always reset to 0 m before testing target distance
|
||||
if ! set_and_verify_distance 0; then
|
||||
echo " Set distance 0 m failed during attempt $((retries + 1))"
|
||||
else
|
||||
sleep "$SLEEP_WAIT"
|
||||
# Now test the actual target distance
|
||||
if set_and_verify_distance "$distance"; then
|
||||
return 0
|
||||
fi
|
||||
fi
|
||||
|
||||
((retries++))
|
||||
if (( retries < MAX_RETRIES )); then
|
||||
sleep "$SLEEP_WAIT"
|
||||
else
|
||||
echo " ERROR: No valid response after $MAX_RETRIES retries for distance: $distance m"
|
||||
return 1
|
||||
fi
|
||||
done
|
||||
}
|
||||
|
||||
num_success=0
|
||||
num_fail=0
|
||||
|
||||
for d in "${DISTANCES[@]}"; do
|
||||
if test_distance "$d"; then
|
||||
((num_success++))
|
||||
else
|
||||
((num_fail++))
|
||||
fi
|
||||
sleep "$SLEEP_WAIT"
|
||||
done
|
||||
|
||||
# ---- Summary ----
|
||||
echo
|
||||
echo "==================== SUMMARY ===================="
|
||||
echo "Total tests run : ${#DISTANCES[@]}"
|
||||
echo "Successful tests: ${num_success}"
|
||||
echo "Failed tests : ${num_fail}"
|
||||
echo "================================================="
|
||||
|
||||
if [ $num_success -gt 0 ]; then
|
||||
exit 0
|
||||
else
|
||||
exit 1
|
||||
fi
|
||||
@@ -23,7 +23,7 @@ class TestPingIperf(unittest.TestCase):
|
||||
self.html.testCaseId = "000000"
|
||||
self.ci = cls_oaicitest.OaiCiTest()
|
||||
self.ci.ue_ids = ["test"]
|
||||
self.ci.nodes = ["localhost"]
|
||||
self.node = "localhost"
|
||||
self.ctx = TestCaseCtx.Default(tempfile.mkdtemp())
|
||||
def tearDown(self):
|
||||
with cls_cmd.LocalCmd() as c:
|
||||
@@ -35,7 +35,7 @@ class TestPingIperf(unittest.TestCase):
|
||||
self.ci.svr_id = "test"
|
||||
infra_file = "tests/config/infra_ping_iperf.yaml"
|
||||
# TODO Should need nothing but options and UE(s) to use
|
||||
success = self.ci.Ping(self.ctx, self.html, infra_file=infra_file)
|
||||
success = self.ci.Ping(self.ctx, self.node, self.html, infra_file=infra_file)
|
||||
self.assertTrue(success)
|
||||
|
||||
def test_iperf(self):
|
||||
@@ -50,7 +50,7 @@ class TestPingIperf(unittest.TestCase):
|
||||
self.ci.iperf_profile = "balanced"
|
||||
infra_file = "tests/config/infra_ping_iperf.yaml"
|
||||
# TODO Should need nothing but options and UE(s) to use
|
||||
success = self.ci.Iperf(self.ctx, self.html, infra_file=infra_file)
|
||||
success = self.ci.Iperf(self.ctx, self.node, self.html, infra_file=infra_file)
|
||||
self.assertTrue(success)
|
||||
|
||||
def test_iperf2_unidir(self):
|
||||
@@ -62,7 +62,7 @@ class TestPingIperf(unittest.TestCase):
|
||||
self.ci.iperf_profile = "balanced"
|
||||
infra_file = "tests/config/infra_ping_iperf.yaml"
|
||||
# TODO Should need nothing but options and UE(s) to use
|
||||
success = self.ci.Iperf2_Unidir(self.ctx, self.html, infra_file=infra_file)
|
||||
success = self.ci.Iperf2_Unidir(self.ctx, self.node, self.html, infra_file=infra_file)
|
||||
self.assertTrue(success)
|
||||
|
||||
def test_iperf_highrate(self):
|
||||
@@ -77,7 +77,7 @@ class TestPingIperf(unittest.TestCase):
|
||||
self.ci.iperf_profile = "balanced"
|
||||
infra_file = "tests/config/infra_ping_iperf.yaml"
|
||||
# TODO Should need nothing but options and UE(s) to use
|
||||
success = self.ci.Iperf(self.ctx, self.html, infra_file=infra_file)
|
||||
success = self.ci.Iperf(self.ctx, self.node, self.html, infra_file=infra_file)
|
||||
self.assertTrue(success)
|
||||
|
||||
if __name__ == '__main__':
|
||||
|
||||
@@ -88,14 +88,14 @@
|
||||
<class>Attach_UE</class>
|
||||
<desc>Attach OAI UE</desc>
|
||||
<id>l2sim4g_ue</id>
|
||||
<nodes>localhost</nodes>
|
||||
<node>localhost</node>
|
||||
</testCase>
|
||||
|
||||
<testCase id="020001">
|
||||
<class>Ping</class>
|
||||
<desc>Ping trf-gen from LTE-UE 1</desc>
|
||||
<id>l2sim4g_ue</id>
|
||||
<nodes>localhost</nodes>
|
||||
<node>localhost</node>
|
||||
<svr_id>l2sim4g_ext_dn</svr_id>
|
||||
<svr_node>localhost</svr_node>
|
||||
<ping_args>-c 20</ping_args>
|
||||
@@ -106,7 +106,7 @@
|
||||
<class>Ping</class>
|
||||
<desc>Ping LTE-UE 1 from trf-gen</desc>
|
||||
<id>l2sim4g_ext_dn</id>
|
||||
<nodes>localhost</nodes>
|
||||
<node>localhost</node>
|
||||
<svr_id>l2sim4g_ue</svr_id>
|
||||
<svr_node>localhost</svr_node>
|
||||
<ping_args>-c 20</ping_args>
|
||||
@@ -117,7 +117,7 @@
|
||||
<class>Iperf</class>
|
||||
<desc>Iperf UDP Downlink</desc>
|
||||
<id>l2sim4g_ue</id>
|
||||
<nodes>localhost</nodes>
|
||||
<node>localhost</node>
|
||||
<svr_id>l2sim4g_ext_dn</svr_id>
|
||||
<svr_node>localhost</svr_node>
|
||||
<iperf_args>-u -t 30 -b 1M -R</iperf_args>
|
||||
@@ -129,7 +129,7 @@
|
||||
<class>Iperf</class>
|
||||
<desc>Iperf UDP Uplink</desc>
|
||||
<id>l2sim4g_ue</id>
|
||||
<nodes>localhost</nodes>
|
||||
<node>localhost</node>
|
||||
<svr_id>l2sim4g_ext_dn</svr_id>
|
||||
<svr_node>localhost</svr_node>
|
||||
<iperf_args>-u -t 30 -b 3M</iperf_args>
|
||||
|
||||
@@ -103,14 +103,14 @@
|
||||
<class>Attach_UE</class>
|
||||
<desc>Attach OAI UE (Wait for IP)</desc>
|
||||
<id>rfsim4g_ue</id>
|
||||
<nodes>localhost</nodes>
|
||||
<node>localhost</node>
|
||||
</testCase>
|
||||
|
||||
<testCase id="020011">
|
||||
<class>Ping</class>
|
||||
<desc>Ping Traffic-Gen from LTE-UE</desc>
|
||||
<id>rfsim4g_ue</id>
|
||||
<nodes>localhost</nodes>
|
||||
<node>localhost</node>
|
||||
<svr_id>rfsim4g_ext_dn</svr_id>
|
||||
<svr_node>localhost</svr_node>
|
||||
<ping_args>-c 20</ping_args>
|
||||
@@ -121,7 +121,7 @@
|
||||
<class>Ping</class>
|
||||
<desc>Ping LTE-UE from Traffic-Gen</desc>
|
||||
<id>rfsim4g_ext_dn</id>
|
||||
<nodes>localhost</nodes>
|
||||
<node>localhost</node>
|
||||
<svr_id>rfsim4g_ue</svr_id>
|
||||
<svr_node>localhost</svr_node>
|
||||
<ping_args>-c 20</ping_args>
|
||||
@@ -136,7 +136,7 @@
|
||||
<iperf_args>-u -t 30 -b 2M -R</iperf_args>
|
||||
<iperf_packetloss_threshold>25</iperf_packetloss_threshold>
|
||||
<iperf_bitrate_threshold>80</iperf_bitrate_threshold>
|
||||
<nodes>localhost</nodes>
|
||||
<node>localhost</node>
|
||||
<svr_node>localhost</svr_node>
|
||||
</testCase>
|
||||
|
||||
@@ -148,7 +148,7 @@
|
||||
<iperf_args>-u -t 30 -b 1M</iperf_args>
|
||||
<iperf_packetloss_threshold>25</iperf_packetloss_threshold>
|
||||
<iperf_bitrate_threshold>80</iperf_bitrate_threshold>
|
||||
<nodes>localhost</nodes>
|
||||
<node>localhost</node>
|
||||
<svr_node>localhost</svr_node>
|
||||
</testCase>
|
||||
|
||||
|
||||
@@ -83,7 +83,7 @@
|
||||
<class>Ping</class>
|
||||
<desc>Ping Traffic-Gen from LTE-UE</desc>
|
||||
<id>rfsim4g_ue</id>
|
||||
<nodes>localhost</nodes>
|
||||
<node>localhost</node>
|
||||
<svr_id>rfsim4g_enb_nos1</svr_id>
|
||||
<svr_node>localhost</svr_node>
|
||||
<ping_args>-c 20</ping_args>
|
||||
@@ -94,7 +94,7 @@
|
||||
<class>Ping</class>
|
||||
<desc>Ping LTE-UE from eNB</desc>
|
||||
<id>rfsim4g_enb_nos1</id>
|
||||
<nodes>localhost</nodes>
|
||||
<node>localhost</node>
|
||||
<svr_id>rfsim4g_ue</svr_id>
|
||||
<svr_node>localhost</svr_node>
|
||||
<ping_args>-c 20</ping_args>
|
||||
@@ -105,7 +105,7 @@
|
||||
<class>Iperf</class>
|
||||
<desc>Iperf UDP DL</desc>
|
||||
<id>rfsim4g_ue</id>
|
||||
<nodes>localhost</nodes>
|
||||
<node>localhost</node>
|
||||
<svr_id>rfsim4g_enb_nos1</svr_id>
|
||||
<svr_node>localhost</svr_node>
|
||||
<iperf_args>-u -t 30 -b 2M -R</iperf_args>
|
||||
@@ -117,7 +117,7 @@
|
||||
<class>Iperf</class>
|
||||
<desc>Iperf UDP UL</desc>
|
||||
<id>rfsim4g_ue</id>
|
||||
<nodes>localhost</nodes>
|
||||
<node>localhost</node>
|
||||
<svr_id>rfsim4g_enb_nos1</svr_id>
|
||||
<svr_node>localhost</svr_node>
|
||||
<iperf_args>-u -t 30 -b 1M</iperf_args>
|
||||
|
||||
@@ -103,14 +103,14 @@
|
||||
<class>Attach_UE</class>
|
||||
<desc>Attach OAI UE (Wait for IP)</desc>
|
||||
<id>rfsim4g_ue</id>
|
||||
<nodes>localhost</nodes>
|
||||
<node>localhost</node>
|
||||
</testCase>
|
||||
|
||||
<testCase id="020011">
|
||||
<class>Ping</class>
|
||||
<desc>Ping Traffic-Gen from LTE-UE</desc>
|
||||
<id>rfsim4g_ue</id>
|
||||
<nodes>localhost</nodes>
|
||||
<node>localhost</node>
|
||||
<svr_id>rfsim4g_ext_dn</svr_id>
|
||||
<svr_node>localhost</svr_node>
|
||||
<ping_args>-c 20</ping_args>
|
||||
@@ -121,7 +121,7 @@
|
||||
<class>Ping</class>
|
||||
<desc>Ping LTE-UE from Traffic-Gen</desc>
|
||||
<id>rfsim4g_ext_dn</id>
|
||||
<nodes>localhost</nodes>
|
||||
<node>localhost</node>
|
||||
<svr_id>rfsim4g_ue</svr_id>
|
||||
<svr_node>localhost</svr_node>
|
||||
<ping_args>-c 20</ping_args>
|
||||
@@ -132,7 +132,7 @@
|
||||
<class>Iperf</class>
|
||||
<desc>Iperf UDP DL</desc>
|
||||
<id>rfsim4g_ue</id>
|
||||
<nodes>localhost</nodes>
|
||||
<node>localhost</node>
|
||||
<svr_id>rfsim4g_ext_dn</svr_id>
|
||||
<svr_node>localhost</svr_node>
|
||||
<iperf_args>-u -t 30 -b 2M -R</iperf_args>
|
||||
@@ -144,7 +144,7 @@
|
||||
<class>Iperf</class>
|
||||
<desc>Iperf UDP UL</desc>
|
||||
<id>rfsim4g_ue</id>
|
||||
<nodes>localhost</nodes>
|
||||
<node>localhost</node>
|
||||
<svr_id>rfsim4g_ext_dn</svr_id>
|
||||
<svr_node>localhost</svr_node>
|
||||
<iperf_args>-u -t 30 -b 1M</iperf_args>
|
||||
|
||||
@@ -103,14 +103,14 @@
|
||||
<class>Attach_UE</class>
|
||||
<desc>Attach OAI UE (Wait for IP)</desc>
|
||||
<id>rfsim4g_ue</id>
|
||||
<nodes>localhost</nodes>
|
||||
<node>localhost</node>
|
||||
</testCase>
|
||||
|
||||
<testCase id="020011">
|
||||
<class>Ping</class>
|
||||
<desc>Ping Traffic-Gen from LTE-UE</desc>
|
||||
<id>rfsim4g_ue</id>
|
||||
<nodes>localhost</nodes>
|
||||
<node>localhost</node>
|
||||
<svr_id>rfsim4g_ext_dn</svr_id>
|
||||
<svr_node>localhost</svr_node>
|
||||
<ping_args>-c 20</ping_args>
|
||||
@@ -121,7 +121,7 @@
|
||||
<class>Ping</class>
|
||||
<desc>Ping LTE-UE from Traffic-Gen</desc>
|
||||
<id>rfsim4g_ext_dn</id>
|
||||
<nodes>localhost</nodes>
|
||||
<node>localhost</node>
|
||||
<svr_id>rfsim4g_ue</svr_id>
|
||||
<svr_node>localhost</svr_node>
|
||||
<ping_args>-c 20</ping_args>
|
||||
@@ -132,7 +132,7 @@
|
||||
<class>Iperf</class>
|
||||
<desc>Iperf UDP DL</desc>
|
||||
<id>rfsim4g_ue</id>
|
||||
<nodes>localhost</nodes>
|
||||
<node>localhost</node>
|
||||
<svr_id>rfsim4g_ext_dn</svr_id>
|
||||
<svr_node>localhost</svr_node>
|
||||
<iperf_args>-u -t 30 -b 2M -R</iperf_args>
|
||||
@@ -144,7 +144,7 @@
|
||||
<class>Iperf</class>
|
||||
<desc>Iperf UDP UL</desc>
|
||||
<id>rfsim4g_ue</id>
|
||||
<nodes>localhost</nodes>
|
||||
<node>localhost</node>
|
||||
<svr_id>rfsim4g_ext_dn</svr_id>
|
||||
<svr_node>localhost</svr_node>
|
||||
<iperf_args>-u -t 30 -b 1M</iperf_args>
|
||||
|
||||
@@ -80,7 +80,7 @@
|
||||
<class>Iperf2_Unidir</class>
|
||||
<desc>Iperf2 UDP DL</desc>
|
||||
<id>rfsim4g_ue_fembms</id>
|
||||
<nodes>localhost</nodes>
|
||||
<node>localhost</node>
|
||||
<svr_id>rfsim4g_enb_fembms</svr_id>
|
||||
<svr_node>localhost</svr_node>
|
||||
<iperf_args>-u -t 30 -b 2M</iperf_args>
|
||||
|
||||
@@ -80,7 +80,7 @@
|
||||
<class>Iperf</class>
|
||||
<desc>Iperf UDP DL</desc>
|
||||
<id>rfsim4g_ue</id>
|
||||
<nodes>localhost</nodes>
|
||||
<node>localhost</node>
|
||||
<svr_id>rfsim4g_enb_nos1</svr_id>
|
||||
<svr_node>localhost</svr_node>
|
||||
<iperf_args>-u -t 30 -b 2M -R</iperf_args>
|
||||
|
||||
@@ -103,7 +103,7 @@
|
||||
<class>Ping</class>
|
||||
<desc>Ping Traffic-Gen from LTE-UE</desc>
|
||||
<id>rfsim4g_ue</id>
|
||||
<nodes>localhost</nodes>
|
||||
<node>localhost</node>
|
||||
<svr_id>rfsim4g_ext_dn</svr_id>
|
||||
<svr_node>localhost</svr_node>
|
||||
<ping_args>-c 20</ping_args>
|
||||
@@ -114,7 +114,7 @@
|
||||
<class>Ping</class>
|
||||
<desc>Ping LTE-UE from Traffic-Gen</desc>
|
||||
<id>rfsim4g_ext_dn</id>
|
||||
<nodes>localhost</nodes>
|
||||
<node>localhost</node>
|
||||
<svr_id>rfsim4g_ue</svr_id>
|
||||
<svr_node>localhost</svr_node>
|
||||
<ping_args>-c 20</ping_args>
|
||||
@@ -125,7 +125,7 @@
|
||||
<class>Iperf</class>
|
||||
<desc>Iperf UDP DL</desc>
|
||||
<id>rfsim4g_ue</id>
|
||||
<nodes>localhost</nodes>
|
||||
<node>localhost</node>
|
||||
<svr_id>rfsim4g_ext_dn</svr_id>
|
||||
<svr_node>localhost</svr_node>
|
||||
<iperf_args>-u -t 30 -b 2M -R</iperf_args>
|
||||
@@ -137,7 +137,7 @@
|
||||
<class>Iperf</class>
|
||||
<desc>Iperf UDP UL</desc>
|
||||
<id>rfsim4g_ue</id>
|
||||
<nodes>localhost</nodes>
|
||||
<node>localhost</node>
|
||||
<svr_id>rfsim4g_ext_dn</svr_id>
|
||||
<svr_node>localhost</svr_node>
|
||||
<iperf_args>-u -t 30 -b 1M</iperf_args>
|
||||
|
||||
@@ -76,14 +76,14 @@
|
||||
<class>Attach_UE</class>
|
||||
<desc>Attach OAI UE (Wait for IP)</desc>
|
||||
<id>rfsim5g_ue rfsim5g_ue2 rfsim5g_ue3</id>
|
||||
<nodes>localhost localhost localhost</nodes>
|
||||
<node>localhost</node>
|
||||
</testCase>
|
||||
|
||||
<testCase id="020021">
|
||||
<class>Ping</class>
|
||||
<desc>Ping ext-dn from all NR-UEs</desc>
|
||||
<id>rfsim5g_ue rfsim5g_ue2 rfsim5g_ue3</id>
|
||||
<nodes>localhost localhost localhost</nodes>
|
||||
<node>localhost</node>
|
||||
<svr_id>rfsim5g_5gc_fixed_ip</svr_id>
|
||||
<svr_node>localhost</svr_node>
|
||||
<ping_args>-c 20 -i0.25</ping_args>
|
||||
|
||||
@@ -107,7 +107,7 @@
|
||||
<class>Attach_UE</class>
|
||||
<desc>Attach OAI UE (Wait for IP)</desc>
|
||||
<id>rfsim5g_ue</id>
|
||||
<nodes>localhost</nodes>
|
||||
<node>localhost</node>
|
||||
</testCase>
|
||||
|
||||
<testCase id="000024">
|
||||
@@ -122,7 +122,7 @@
|
||||
<class>Ping</class>
|
||||
<desc>Ping ext-dn from all NR-UEs</desc>
|
||||
<id>rfsim5g_ue</id>
|
||||
<nodes>localhost</nodes>
|
||||
<node>localhost</node>
|
||||
<svr_id>rfsim5g_ext_dn</svr_id>
|
||||
<svr_node>localhost</svr_node>
|
||||
<ping_args>-c 20 -i0.25</ping_args>
|
||||
@@ -141,7 +141,7 @@
|
||||
<desc>Iperf (DL/3Mbps/UDP)(20 sec)</desc>
|
||||
<iperf_args>-u -b 3M -t 20 -R</iperf_args>
|
||||
<id>rfsim5g_ue</id>
|
||||
<nodes>localhost</nodes>
|
||||
<node>localhost</node>
|
||||
<svr_id>rfsim5g_ext_dn</svr_id>
|
||||
<svr_node>localhost</svr_node>
|
||||
<iperf_packetloss_threshold>5</iperf_packetloss_threshold>
|
||||
@@ -153,7 +153,7 @@
|
||||
<desc>Iperf (UL/3Mbps/UDP)(20 sec)</desc>
|
||||
<iperf_args>-u -b 3M -t 20</iperf_args>
|
||||
<id>rfsim5g_ue</id>
|
||||
<nodes>localhost</nodes>
|
||||
<node>localhost</node>
|
||||
<svr_id>rfsim5g_ext_dn</svr_id>
|
||||
<svr_node>localhost</svr_node>
|
||||
<iperf_packetloss_threshold>5</iperf_packetloss_threshold>
|
||||
@@ -171,7 +171,7 @@
|
||||
<class>Ping</class>
|
||||
<desc>Ping ext-dn from NR-UE</desc>
|
||||
<id>rfsim5g_ue</id>
|
||||
<nodes>localhost</nodes>
|
||||
<node>localhost</node>
|
||||
<svr_id>rfsim5g_ext_dn</svr_id>
|
||||
<svr_node>localhost</svr_node>
|
||||
<ping_args>-c 20 -i0.5 -w25</ping_args>
|
||||
|
||||
@@ -70,14 +70,14 @@
|
||||
<class>Attach_UE</class>
|
||||
<desc>Attach OAI UE (Wait for IP)</desc>
|
||||
<id>rfsim5g_ue</id>
|
||||
<nodes>localhost</nodes>
|
||||
<node>localhost</node>
|
||||
</testCase>
|
||||
|
||||
<testCase id="020011">
|
||||
<class>Ping</class>
|
||||
<desc>Ping ext-dn from NR-UE</desc>
|
||||
<id>rfsim5g_ue</id>
|
||||
<nodes>localhost</nodes>
|
||||
<node>localhost</node>
|
||||
<svr_id>rfsim5g_ext_dn</svr_id>
|
||||
<svr_node>localhost</svr_node>
|
||||
<ping_args>-c 20 -i 0.25</ping_args>
|
||||
@@ -88,7 +88,7 @@
|
||||
<class>Ping</class>
|
||||
<desc>Ping NR-UE from ext-dn</desc>
|
||||
<id>rfsim5g_ext_dn</id>
|
||||
<nodes>localhost</nodes>
|
||||
<node>localhost</node>
|
||||
<svr_id>rfsim5g_ue</svr_id>
|
||||
<svr_node>localhost</svr_node>
|
||||
<ping_args>-c 20 -i 0.25</ping_args>
|
||||
@@ -100,7 +100,7 @@
|
||||
<desc>Iperf (DL/3Mbps/UDP)(30 sec)</desc>
|
||||
<iperf_args>-u -b 3M -t 30 -R</iperf_args>
|
||||
<id>rfsim5g_ue</id>
|
||||
<nodes>localhost</nodes>
|
||||
<node>localhost</node>
|
||||
<svr_id>rfsim5g_ext_dn</svr_id>
|
||||
<svr_node>localhost</svr_node>
|
||||
<iperf_packetloss_threshold>5</iperf_packetloss_threshold>
|
||||
@@ -112,7 +112,7 @@
|
||||
<desc>Iperf (UL/3Mbps/UDP)(30 sec)</desc>
|
||||
<iperf_args>-u -b 3M -t 30</iperf_args>
|
||||
<id>rfsim5g_ue</id>
|
||||
<nodes>localhost</nodes>
|
||||
<node>localhost</node>
|
||||
<svr_id>rfsim5g_ext_dn</svr_id>
|
||||
<svr_node>localhost</svr_node>
|
||||
<iperf_packetloss_threshold>5</iperf_packetloss_threshold>
|
||||
|
||||
@@ -121,7 +121,7 @@
|
||||
<class>Ping</class>
|
||||
<desc>Ping ext-dn from both UEs</desc>
|
||||
<id>rfsim5g_ue rfsim5g_ue2</id>
|
||||
<nodes>carabe carabe</nodes>
|
||||
<node>carabe</node>
|
||||
<svr_id>oai_ext_dn</svr_id>
|
||||
<svr_node>carabe</svr_node>
|
||||
<ping_args>-c 20</ping_args>
|
||||
@@ -132,14 +132,14 @@
|
||||
<class>Attach_UE</class>
|
||||
<desc>Attach OAI UE 1 and 2</desc>
|
||||
<id>rfsim5g_ue rfsim5g_ue2</id>
|
||||
<nodes>carabe carabe</nodes>
|
||||
<node>carabe</node>
|
||||
</testCase>
|
||||
|
||||
<testCase id="444444">
|
||||
<class>Detach_UE</class>
|
||||
<desc>Detach OAI UE 1 and 2</desc>
|
||||
<id>rfsim5g_ue rfsim5g_ue2</id>
|
||||
<nodes>carabe carabe</nodes>
|
||||
<node>carabe</node>
|
||||
</testCase>
|
||||
|
||||
<testCase id="100001">
|
||||
|
||||
@@ -125,14 +125,14 @@
|
||||
<class>Attach_UE</class>
|
||||
<desc>Attach OAI UE (Wait for IP)</desc>
|
||||
<id>rfsim5g_ue rfsim5g_ue2 rfsim5g_ue3 rfsim5g_ue4 rfsim5g_ue5 rfsim5g_ue6 rfsim5g_ue7 rfsim5g_ue8 rfsim5g_ue9 rfsim5g_ue10</id>
|
||||
<nodes>localhost localhost localhost localhost localhost localhost localhost localhost localhost localhost</nodes>
|
||||
<node>localhost</node>
|
||||
</testCase>
|
||||
|
||||
<testCase id="020001">
|
||||
<class>Ping</class>
|
||||
<desc>Ping ext-dn from NR-UE</desc>
|
||||
<id>rfsim5g_ue</id>
|
||||
<nodes>localhost</nodes>
|
||||
<node>localhost</node>
|
||||
<svr_id>rfsim5g_ext_dn</svr_id>
|
||||
<svr_node>localhost</svr_node>
|
||||
<ping_args>-c 20 -i 0.25</ping_args>
|
||||
@@ -143,7 +143,7 @@
|
||||
<class>Ping</class>
|
||||
<desc>Ping NR-UE from ext-dn</desc>
|
||||
<id>rfsim5g_ext_dn</id>
|
||||
<nodes>localhost</nodes>
|
||||
<node>localhost</node>
|
||||
<svr_id>rfsim5g_ue</svr_id>
|
||||
<svr_node>localhost</svr_node>
|
||||
<ping_args>-c 20 -i 0.25</ping_args>
|
||||
@@ -154,7 +154,7 @@
|
||||
<class>Ping</class>
|
||||
<desc>Ping ext-dn from Second NR-UE</desc>
|
||||
<id>rfsim5g_ue2</id>
|
||||
<nodes>localhost</nodes>
|
||||
<node>localhost</node>
|
||||
<svr_id>rfsim5g_ext_dn</svr_id>
|
||||
<svr_node>localhost</svr_node>
|
||||
<ping_args>-c 20 -i 0.25</ping_args>
|
||||
@@ -165,7 +165,7 @@
|
||||
<class>Ping</class>
|
||||
<desc>Ping Second NR-UE from ext-dn</desc>
|
||||
<id>rfsim5g_ext_dn</id>
|
||||
<nodes>localhost</nodes>
|
||||
<node>localhost</node>
|
||||
<svr_id>rfsim5g_ue2</svr_id>
|
||||
<svr_node>localhost</svr_node>
|
||||
<ping_args>-c 20 -i 0.25</ping_args>
|
||||
@@ -176,7 +176,7 @@
|
||||
<class>Ping</class>
|
||||
<desc>Ping ext-dn from both UEs</desc>
|
||||
<id>rfsim5g_ue rfsim5g_ue2</id>
|
||||
<nodes>localhost localhost</nodes>
|
||||
<node>localhost</node>
|
||||
<svr_id>rfsim5g_ext_dn</svr_id>
|
||||
<svr_node>localhost</svr_node>
|
||||
<ping_args>-c 20 -i 0.25</ping_args>
|
||||
@@ -187,7 +187,7 @@
|
||||
<class>Ping</class>
|
||||
<desc>Ping ext-dn from all UEs</desc>
|
||||
<id>rfsim5g_ue rfsim5g_ue2 rfsim5g_ue3 rfsim5g_ue4 rfsim5g_ue5 rfsim5g_ue6 rfsim5g_ue7 rfsim5g_ue8 rfsim5g_ue9 rfsim5g_ue10</id>
|
||||
<nodes>localhost localhost localhost localhost localhost localhost localhost localhost localhost localhost</nodes>
|
||||
<node>localhost</node>
|
||||
<svr_id>rfsim5g_ext_dn</svr_id>
|
||||
<svr_node>localhost</svr_node>
|
||||
<ping_args>-c 20 -i 0.25 -s 1016</ping_args>
|
||||
@@ -199,7 +199,7 @@
|
||||
<desc>Iperf (DL/3Mbps/UDP)(20 sec)</desc>
|
||||
<iperf_args>-u -b 3M -t 20 -R</iperf_args>
|
||||
<id>rfsim5g_ue</id>
|
||||
<nodes>localhost</nodes>
|
||||
<node>localhost</node>
|
||||
<svr_id>rfsim5g_ext_dn</svr_id>
|
||||
<svr_node>localhost</svr_node>
|
||||
<iperf_packetloss_threshold>5</iperf_packetloss_threshold>
|
||||
@@ -211,7 +211,7 @@
|
||||
<desc>Iperf (UL/1Mbps/UDP)(20 sec)</desc>
|
||||
<iperf_args>-u -b 1M -t 20</iperf_args>
|
||||
<id>rfsim5g_ue</id>
|
||||
<nodes>localhost</nodes>
|
||||
<node>localhost</node>
|
||||
<svr_id>rfsim5g_ext_dn</svr_id>
|
||||
<svr_node>localhost</svr_node>
|
||||
<iperf_packetloss_threshold>5</iperf_packetloss_threshold>
|
||||
@@ -222,21 +222,21 @@
|
||||
<class>Attach_UE</class>
|
||||
<desc>Attach OAI UE 1 and 2</desc>
|
||||
<id>rfsim5g_ue rfsim5g_ue2</id>
|
||||
<nodes>localhost localhost</nodes>
|
||||
<node>localhost</node>
|
||||
</testCase>
|
||||
|
||||
<testCase id="444444">
|
||||
<class>Detach_UE</class>
|
||||
<desc>Detach OAI UE 1 and 2</desc>
|
||||
<id>rfsim5g_ue rfsim5g_ue2</id>
|
||||
<nodes>localhost localhost</nodes>
|
||||
<node>localhost</node>
|
||||
</testCase>
|
||||
|
||||
<testCase id="444445">
|
||||
<class>Detach_UE</class>
|
||||
<desc>Detach OAI UE 3 to 10</desc>
|
||||
<id>rfsim5g_ue3 rfsim5g_ue4 rfsim5g_ue5 rfsim5g_ue6 rfsim5g_ue7 rfsim5g_ue8 rfsim5g_ue9 rfsim5g_ue10</id>
|
||||
<nodes>localhost localhost localhost localhost localhost localhost localhost localhost</nodes>
|
||||
<node>localhost</node>
|
||||
</testCase>
|
||||
|
||||
<testCase id="100001">
|
||||
|
||||
@@ -88,7 +88,7 @@
|
||||
<class>Attach_UE</class>
|
||||
<desc>Attach OAI UE (Wait for IP)</desc>
|
||||
<id>rfsim5g_ue</id>
|
||||
<nodes>localhost</nodes>
|
||||
<node>localhost</node>
|
||||
</testCase>
|
||||
|
||||
<testCase id="000004">
|
||||
@@ -101,7 +101,7 @@
|
||||
<class>Ping</class>
|
||||
<desc>Ping ext-dn from NR-UE</desc>
|
||||
<id>rfsim5g_ue</id>
|
||||
<nodes>localhost</nodes>
|
||||
<node>localhost</node>
|
||||
<svr_id>rfsim5g_ext_dn</svr_id>
|
||||
<svr_node>localhost</svr_node>
|
||||
<ping_args> -c 20 -i0.5</ping_args>
|
||||
@@ -112,7 +112,7 @@
|
||||
<class>Ping</class>
|
||||
<desc>Ping NR-UE from ext-dn</desc>
|
||||
<id>rfsim5g_ext_dn</id>
|
||||
<nodes>localhost</nodes>
|
||||
<node>localhost</node>
|
||||
<svr_id>rfsim5g_ue</svr_id>
|
||||
<svr_node>localhost</svr_node>
|
||||
<ping_args>-c 20 -i0.2</ping_args>
|
||||
@@ -124,7 +124,7 @@
|
||||
<desc>Iperf (DL/3Mbps/UDP)(20 sec)</desc>
|
||||
<iperf_args>-u -b 3M -t 20 -R</iperf_args>
|
||||
<id>rfsim5g_ue</id>
|
||||
<nodes>localhost</nodes>
|
||||
<node>localhost</node>
|
||||
<svr_id>rfsim5g_ext_dn</svr_id>
|
||||
<svr_node>localhost</svr_node>
|
||||
<iperf_packetloss_threshold>5</iperf_packetloss_threshold>
|
||||
@@ -136,7 +136,7 @@
|
||||
<desc>Iperf (UL/1Mbps/UDP)(20 sec)</desc>
|
||||
<iperf_args>-u -b 1M -t 20</iperf_args>
|
||||
<id>rfsim5g_ue</id>
|
||||
<nodes>localhost</nodes>
|
||||
<node>localhost</node>
|
||||
<svr_id>rfsim5g_ext_dn</svr_id>
|
||||
<svr_node>localhost</svr_node>
|
||||
<iperf_packetloss_threshold>5</iperf_packetloss_threshold>
|
||||
|
||||
@@ -70,14 +70,14 @@
|
||||
<class>Attach_UE</class>
|
||||
<desc>Attach OAI UE (Wait for IP)</desc>
|
||||
<id>rfsim5g_ue</id>
|
||||
<nodes>localhost</nodes>
|
||||
<node>localhost</node>
|
||||
</testCase>
|
||||
|
||||
<testCase id="020001">
|
||||
<class>Ping</class>
|
||||
<desc>Ping ext-dn from NR-UE</desc>
|
||||
<id>rfsim5g_ue</id>
|
||||
<nodes>localhost</nodes>
|
||||
<node>localhost</node>
|
||||
<svr_id>rfsim5g_ext_dn</svr_id>
|
||||
<svr_node>localhost</svr_node>
|
||||
<ping_args>-c 20 -i 0.25</ping_args>
|
||||
@@ -88,7 +88,7 @@
|
||||
<class>Ping</class>
|
||||
<desc>Ping NR-UE from ext-dn</desc>
|
||||
<id>rfsim5g_ext_dn</id>
|
||||
<nodes>localhost</nodes>
|
||||
<node>localhost</node>
|
||||
<svr_id>rfsim5g_ue</svr_id>
|
||||
<svr_node>localhost</svr_node>
|
||||
<ping_args>-c 20 -i 0.25</ping_args>
|
||||
@@ -100,7 +100,7 @@
|
||||
<desc>Iperf (DL/10Mbps/UDP)(20 sec)</desc>
|
||||
<iperf_args>-u -b 10M -t 20 -R</iperf_args>
|
||||
<id>rfsim5g_ue</id>
|
||||
<nodes>localhost</nodes>
|
||||
<node>localhost</node>
|
||||
<svr_id>rfsim5g_ext_dn</svr_id>
|
||||
<svr_node>localhost</svr_node>
|
||||
<iperf_packetloss_threshold>5</iperf_packetloss_threshold>
|
||||
@@ -112,7 +112,7 @@
|
||||
<desc>Iperf (UL/3Mbps/UDP)(20 sec)</desc>
|
||||
<iperf_args>-u -b 3M -t 20</iperf_args>
|
||||
<id>rfsim5g_ue</id>
|
||||
<nodes>localhost</nodes>
|
||||
<node>localhost</node>
|
||||
<svr_id>rfsim5g_ext_dn</svr_id>
|
||||
<svr_node>localhost</svr_node>
|
||||
<iperf_packetloss_threshold>5</iperf_packetloss_threshold>
|
||||
|
||||
@@ -77,7 +77,7 @@
|
||||
<class>Ping</class>
|
||||
<desc>Ping gNB from NR-UE</desc>
|
||||
<id>rfsim5g_ue</id>
|
||||
<nodes>localhost</nodes>
|
||||
<node>localhost</node>
|
||||
<svr_id>rfsim5g_gnb_nos1</svr_id>
|
||||
<svr_node>localhost</svr_node>
|
||||
<ping_args>-c20 -i0.2</ping_args>
|
||||
@@ -88,7 +88,7 @@
|
||||
<class>Ping</class>
|
||||
<desc>Ping NR-UE from gNB</desc>
|
||||
<id>rfsim5g_gnb_nos1</id>
|
||||
<nodes>localhost</nodes>
|
||||
<node>localhost</node>
|
||||
<svr_id>rfsim5g_ue</svr_id>
|
||||
<svr_node>localhost</svr_node>
|
||||
<ping_args>-c20 -i0.2</ping_args>
|
||||
@@ -100,7 +100,7 @@
|
||||
<desc>Iperf (DL/30kbps/UDP)(20 sec)</desc>
|
||||
<iperf_args>-u -b 0.03M -t 20 -R -c 10.0.1.1</iperf_args>
|
||||
<id>rfsim5g_ue</id>
|
||||
<nodes>localhost</nodes>
|
||||
<node>localhost</node>
|
||||
<svr_id>rfsim5g_gnb_nos1</svr_id>
|
||||
<svr_node>localhost</svr_node>
|
||||
<iperf_packetloss_threshold>5</iperf_packetloss_threshold>
|
||||
@@ -112,7 +112,7 @@
|
||||
<desc>Iperf (UL/30kbps/UDP)(20 sec)</desc>
|
||||
<iperf_args>-u -b 0.03M -t 20 -c 10.0.1.1</iperf_args>
|
||||
<id>rfsim5g_ue</id>
|
||||
<nodes>localhost</nodes>
|
||||
<node>localhost</node>
|
||||
<svr_id>rfsim5g_gnb_nos1</svr_id>
|
||||
<svr_node>localhost</svr_node>
|
||||
<iperf_packetloss_threshold>5</iperf_packetloss_threshold>
|
||||
|
||||
@@ -70,14 +70,14 @@
|
||||
<class>Attach_UE</class>
|
||||
<desc>Attach OAI UE (Wait for IP)</desc>
|
||||
<id>rfsim5g_ue</id>
|
||||
<nodes>localhost</nodes>
|
||||
<node>localhost</node>
|
||||
</testCase>
|
||||
|
||||
<testCase id="020001">
|
||||
<class>Ping</class>
|
||||
<desc>Ping ext-dn from NR-UE</desc>
|
||||
<id>rfsim5g_ue</id>
|
||||
<nodes>localhost</nodes>
|
||||
<node>localhost</node>
|
||||
<svr_id>rfsim5g_ext_dn</svr_id>
|
||||
<svr_node>localhost</svr_node>
|
||||
<ping_args>-c 20 -i0.2</ping_args>
|
||||
@@ -88,7 +88,7 @@
|
||||
<class>Ping</class>
|
||||
<desc>Ping NR-UE from ext-dn</desc>
|
||||
<id>rfsim5g_ext_dn</id>
|
||||
<nodes>localhost</nodes>
|
||||
<node>localhost</node>
|
||||
<svr_id>rfsim5g_ue</svr_id>
|
||||
<svr_node>localhost</svr_node>
|
||||
<ping_args>-c 20 -i0.2</ping_args>
|
||||
|
||||
@@ -84,14 +84,14 @@
|
||||
<class>Attach_UE</class>
|
||||
<desc>Attach OAI UE (Wait for IP)</desc>
|
||||
<id>rfsim5g_multiue1 rfsim5g_multiue2 rfsim5g_multiue3 rfsim5g_multiue4 rfsim5g_multiue5 rfsim5g_multiue6 rfsim5g_multiue7 rfsim5g_multiue8 rfsim5g_multiue9 rfsim5g_multiue10</id>
|
||||
<nodes>localhost localhost localhost localhost localhost localhost localhost localhost localhost localhost</nodes>
|
||||
<node>localhost</node>
|
||||
</testCase>
|
||||
|
||||
<testCase id="020001">
|
||||
<class>Ping</class>
|
||||
<desc>Ping ext-dn from NR-UE</desc>
|
||||
<id>rfsim5g_multiue1</id>
|
||||
<nodes>localhost</nodes>
|
||||
<node>localhost</node>
|
||||
<svr_id>rfsim5g_ext_dn</svr_id>
|
||||
<svr_node>localhost</svr_node>
|
||||
<ping_args>-c 20 -i 0.25</ping_args>
|
||||
@@ -102,7 +102,7 @@
|
||||
<class>Ping</class>
|
||||
<desc>Ping NR-UE from ext-dn</desc>
|
||||
<id>rfsim5g_ext_dn</id>
|
||||
<nodes>localhost</nodes>
|
||||
<node>localhost</node>
|
||||
<svr_id>rfsim5g_multiue1</svr_id>
|
||||
<svr_node>localhost</svr_node>
|
||||
<ping_args>-c 20 -i 0.25</ping_args>
|
||||
@@ -113,7 +113,7 @@
|
||||
<class>Ping</class>
|
||||
<desc>Ping ext-dn from Second NR-UE</desc>
|
||||
<id>rfsim5g_multiue2</id>
|
||||
<nodes>localhost</nodes>
|
||||
<node>localhost</node>
|
||||
<svr_id>rfsim5g_ext_dn</svr_id>
|
||||
<svr_node>localhost</svr_node>
|
||||
<ping_args>-c 20 -i 0.25</ping_args>
|
||||
@@ -124,7 +124,7 @@
|
||||
<class>Ping</class>
|
||||
<desc>Ping Second NR-UE from ext-dn</desc>
|
||||
<id>rfsim5g_ext_dn</id>
|
||||
<nodes>localhost</nodes>
|
||||
<node>localhost</node>
|
||||
<svr_id>rfsim5g_multiue2</svr_id>
|
||||
<svr_node>localhost</svr_node>
|
||||
<ping_args>-c 20 -i 0.25</ping_args>
|
||||
@@ -135,7 +135,7 @@
|
||||
<class>Ping</class>
|
||||
<desc>Ping ext-dn from both UEs</desc>
|
||||
<id>rfsim5g_multiue1 rfsim5g_multiue2</id>
|
||||
<nodes>localhost localhost</nodes>
|
||||
<node>localhost</node>
|
||||
<svr_id>rfsim5g_ext_dn</svr_id>
|
||||
<svr_node>localhost</svr_node>
|
||||
<ping_args>-c 20 -i 0.25</ping_args>
|
||||
@@ -146,7 +146,7 @@
|
||||
<class>Ping</class>
|
||||
<desc>Ping ext-dn from all UEs</desc>
|
||||
<id>rfsim5g_multiue1 rfsim5g_multiue2 rfsim5g_multiue3 rfsim5g_multiue4 rfsim5g_multiue5 rfsim5g_multiue6 rfsim5g_multiue7 rfsim5g_multiue8 rfsim5g_multiue9 rfsim5g_multiue10</id>
|
||||
<nodes>localhost localhost localhost localhost localhost localhost localhost localhost localhost localhost</nodes>
|
||||
<node>localhost</node>
|
||||
<svr_id>rfsim5g_ext_dn</svr_id>
|
||||
<svr_node>localhost</svr_node>
|
||||
<ping_args>-c 20 -i 0.25 -s 1016</ping_args>
|
||||
@@ -158,7 +158,7 @@
|
||||
<desc>Iperf (DL/3Mbps/UDP)(20 sec)</desc>
|
||||
<iperf_args>-u -b 3M -t 20 -R</iperf_args>
|
||||
<id>rfsim5g_multiue1</id>
|
||||
<nodes>localhost</nodes>
|
||||
<node>localhost</node>
|
||||
<svr_id>rfsim5g_ext_dn</svr_id>
|
||||
<svr_node>localhost</svr_node>
|
||||
<iperf_packetloss_threshold>5</iperf_packetloss_threshold>
|
||||
@@ -170,7 +170,7 @@
|
||||
<desc>Iperf (UL/1Mbps/UDP)(20 sec)</desc>
|
||||
<iperf_args>-u -b 1M -t 20</iperf_args>
|
||||
<id>rfsim5g_multiue1</id>
|
||||
<nodes>localhost</nodes>
|
||||
<node>localhost</node>
|
||||
<svr_id>rfsim5g_ext_dn</svr_id>
|
||||
<svr_node>localhost</svr_node>
|
||||
<iperf_packetloss_threshold>5</iperf_packetloss_threshold>
|
||||
@@ -181,7 +181,7 @@
|
||||
<class>Detach_UE</class>
|
||||
<desc>Detach OAI UEs</desc>
|
||||
<id>rfsim5g_multiue1</id>
|
||||
<nodes>localhost</nodes>
|
||||
<node>localhost</node>
|
||||
</testCase>
|
||||
|
||||
<testCase id="100001">
|
||||
|
||||
@@ -85,7 +85,7 @@
|
||||
<class>Attach_UE</class>
|
||||
<desc>Attach OAI UE (Wait for IP)</desc>
|
||||
<id>rfsim5g_ue</id>
|
||||
<nodes>localhost</nodes>
|
||||
<node>localhost</node>
|
||||
</testCase>
|
||||
|
||||
<testCase id="000004">
|
||||
@@ -100,7 +100,7 @@
|
||||
<class>Ping</class>
|
||||
<desc>Ping NR-UE from ext-dn</desc>
|
||||
<id>rfsim5g_ext_dn</id>
|
||||
<nodes>localhost</nodes>
|
||||
<node>localhost</node>
|
||||
<svr_id>rfsim5g_ue</svr_id>
|
||||
<svr_node>localhost</svr_node>
|
||||
<ping_args>-c 50 -i 0.25</ping_args>
|
||||
@@ -111,7 +111,7 @@
|
||||
<class>Ping</class>
|
||||
<desc>Ping ext-dn from NR-UE</desc>
|
||||
<id>rfsim5g_ue</id>
|
||||
<nodes>localhost</nodes>
|
||||
<node>localhost</node>
|
||||
<svr_id>rfsim5g_ext_dn</svr_id>
|
||||
<svr_node>localhost</svr_node>
|
||||
<ping_args>-c 50 -i 0.25</ping_args>
|
||||
@@ -123,7 +123,7 @@
|
||||
<desc>Iperf (DL/10Mbps/UDP)(20 sec)</desc>
|
||||
<iperf_args>-u -b 3M -t 20 -R</iperf_args>
|
||||
<id>rfsim5g_ue</id>
|
||||
<nodes>localhost</nodes>
|
||||
<node>localhost</node>
|
||||
<svr_id>rfsim5g_ext_dn</svr_id>
|
||||
<svr_node>localhost</svr_node>
|
||||
<iperf_packetloss_threshold>5</iperf_packetloss_threshold>
|
||||
@@ -135,7 +135,7 @@
|
||||
<desc>Iperf (UL/4Mbps/UDP)(20 sec)</desc>
|
||||
<iperf_args>-u -b 1M -t 20</iperf_args>
|
||||
<id>rfsim5g_ue</id>
|
||||
<nodes>localhost</nodes>
|
||||
<node>localhost</node>
|
||||
<svr_id>rfsim5g_ext_dn</svr_id>
|
||||
<svr_node>localhost</svr_node>
|
||||
<iperf_packetloss_threshold>5</iperf_packetloss_threshold>
|
||||
|
||||
@@ -74,14 +74,14 @@
|
||||
<class>Attach_UE</class>
|
||||
<desc>Attach OAI UE (Wait for IP)</desc>
|
||||
<id>rfsim5g_ue</id>
|
||||
<nodes>localhost</nodes>
|
||||
<node>localhost</node>
|
||||
</testCase>
|
||||
|
||||
<testCase id="020001">
|
||||
<class>Ping</class>
|
||||
<desc>Ping ext-dn from NR-UE</desc>
|
||||
<id>rfsim5g_ue</id>
|
||||
<nodes>localhost</nodes>
|
||||
<node>localhost</node>
|
||||
<svr_id>rfsim5g_ext_dn</svr_id>
|
||||
<svr_node>localhost</svr_node>
|
||||
<ping_args>-c 20 -i 0.25</ping_args>
|
||||
@@ -92,7 +92,7 @@
|
||||
<class>Ping</class>
|
||||
<desc>Ping NR-UE from ext-dn</desc>
|
||||
<id>rfsim5g_ext_dn</id>
|
||||
<nodes>localhost</nodes>
|
||||
<node>localhost</node>
|
||||
<svr_id>rfsim5g_ue</svr_id>
|
||||
<svr_node>localhost</svr_node>
|
||||
<ping_args>-c 20 -i 0.25</ping_args>
|
||||
@@ -111,7 +111,7 @@
|
||||
<class>Ping</class>
|
||||
<desc>Ping ext-dn from NR-UE</desc>
|
||||
<id>rfsim5g_ue</id>
|
||||
<nodes>localhost</nodes>
|
||||
<node>localhost</node>
|
||||
<svr_id>rfsim5g_ext_dn</svr_id>
|
||||
<svr_node>localhost</svr_node>
|
||||
<ping_args>-c 20 -i0.5 -w25</ping_args>
|
||||
|
||||
@@ -69,14 +69,14 @@
|
||||
<class>Attach_UE</class>
|
||||
<desc>Attach OAI UE (Wait for IP)</desc>
|
||||
<id>rfsim5g_ue</id>
|
||||
<nodes>localhost</nodes>
|
||||
<node>localhost</node>
|
||||
</testCase>
|
||||
|
||||
<testCase id="020001">
|
||||
<class>Ping</class>
|
||||
<desc>Ping ext-dn from NR-UE</desc>
|
||||
<id>rfsim5g_ue</id>
|
||||
<nodes>localhost</nodes>
|
||||
<node>localhost</node>
|
||||
<svr_id>rfsim5g_ext_dn</svr_id>
|
||||
<svr_node>localhost</svr_node>
|
||||
<ping_args>-c 20 -i 0.25</ping_args>
|
||||
@@ -87,7 +87,7 @@
|
||||
<class>Ping</class>
|
||||
<desc>Ping NR-UE from ext-dn</desc>
|
||||
<id>rfsim5g_ext_dn</id>
|
||||
<nodes>localhost</nodes>
|
||||
<node>localhost</node>
|
||||
<svr_id>rfsim5g_ue</svr_id>
|
||||
<svr_node>localhost</svr_node>
|
||||
<ping_args>-c 20 -i 0.25</ping_args>
|
||||
|
||||
@@ -0,0 +1,100 @@
|
||||
<!--
|
||||
|
||||
Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
|
||||
contributor license agreements. See the NOTICE file distributed with
|
||||
this work for additional information regarding copyright ownership.
|
||||
The OpenAirInterface Software Alliance licenses this file to You under
|
||||
the OAI Public License, Version 1.1 (the "License"); you may not use this file
|
||||
except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.openairinterface.org/?page_id=698
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
|
||||
For more information about the OpenAirInterface (OAI) Software Alliance:
|
||||
contact@openairinterface.org
|
||||
|
||||
-->
|
||||
<testCaseList>
|
||||
<htmlTabRef>rfsim-5gnr-prs</htmlTabRef>
|
||||
<htmlTabName>Monolithic gNB with PRS</htmlTabName>
|
||||
<htmlTabIcon>wrench</htmlTabIcon>
|
||||
<TestCaseRequestedList>
|
||||
111111
|
||||
800813
|
||||
000012
|
||||
000013
|
||||
040001
|
||||
040023
|
||||
100011
|
||||
222222
|
||||
</TestCaseRequestedList>
|
||||
<TestCaseExclusionList></TestCaseExclusionList>
|
||||
|
||||
<testCase id="111111">
|
||||
<class>Pull_Local_Registry</class>
|
||||
<desc>Pull Images from Local Registry</desc>
|
||||
<node>localhost</node>
|
||||
<images>oai-gnb-asan oai-nr-ue-asan</images>
|
||||
</testCase>
|
||||
|
||||
<testCase id="800813">
|
||||
<class>Create_Workspace</class>
|
||||
<desc>Create new Workspace</desc>
|
||||
<node>localhost</node>
|
||||
</testCase>
|
||||
|
||||
<testCase id="000012">
|
||||
<class>Deploy_Object</class>
|
||||
<desc>Deploy OAI 5G gNB+UE RF sim SA</desc>
|
||||
<node>localhost</node>
|
||||
<yaml_path>ci-scripts/yaml_files/5g_rfsimulator_prs</yaml_path>
|
||||
<services>oai-gnb oai-nr-ue</services>
|
||||
</testCase>
|
||||
|
||||
<testCase id="000013">
|
||||
<class>Attach_UE</class>
|
||||
<desc>Attach OAI UE (Wait for IP)</desc>
|
||||
<id>rfsim5g_ue</id>
|
||||
<node>localhost</node>
|
||||
</testCase>
|
||||
|
||||
<testCase id="040001">
|
||||
<class>IdleSleep</class>
|
||||
<desc>Sleep</desc>
|
||||
<idle_sleep_time_in_sec>2</idle_sleep_time_in_sec>
|
||||
</testCase>
|
||||
|
||||
<testCase id="040023">
|
||||
<class>Custom_Script</class>
|
||||
<always_exec>true</always_exec>
|
||||
<desc>Set and verify distance at 50, 100, 150 m</desc>
|
||||
<node>localhost</node>
|
||||
<script>scripts/set-and-verify-distance-prs.sh</script>
|
||||
<args>50 100 150</args>
|
||||
</testCase>
|
||||
|
||||
<testCase id="100011">
|
||||
<class>Undeploy_Object</class>
|
||||
<always_exec>true</always_exec>
|
||||
<desc>Undeploy all OAI 5G stack</desc>
|
||||
<node>localhost</node>
|
||||
<yaml_path>ci-scripts/yaml_files/5g_rfsimulator_prs</yaml_path>
|
||||
<d_retx_th>30,100,100,100</d_retx_th>
|
||||
<u_retx_th>30,100,100,100</u_retx_th>
|
||||
</testCase>
|
||||
|
||||
<testCase id="222222">
|
||||
<class>Clean_Test_Server_Images</class>
|
||||
<always_exec>true</always_exec>
|
||||
<desc>Clean Test Images on Test Server</desc>
|
||||
<node>localhost</node>
|
||||
<images>oai-gnb-asan oai-nr-ue-asan</images>
|
||||
</testCase>
|
||||
|
||||
</testCaseList>
|
||||
@@ -63,14 +63,14 @@
|
||||
<class>Attach_UE</class>
|
||||
<desc>Attach OAI UE (Wait for IP)</desc>
|
||||
<id>rfsim5g_ue</id>
|
||||
<nodes>localhost</nodes>
|
||||
<node>localhost</node>
|
||||
</testCase>
|
||||
|
||||
<testCase id="020001">
|
||||
<class>Ping</class>
|
||||
<desc>Ping ext-dn from NR-UE</desc>
|
||||
<id>rfsim5g_ue</id>
|
||||
<nodes>localhost</nodes>
|
||||
<node>localhost</node>
|
||||
<svr_id>rfsim5g_ext_dn</svr_id>
|
||||
<svr_node>localhost</svr_node>
|
||||
<ping_args>-c 20 -i 0.25</ping_args>
|
||||
@@ -81,7 +81,7 @@
|
||||
<class>Detach_UE</class>
|
||||
<desc>Detach OAI UE 1</desc>
|
||||
<id>rfsim5g_ue</id>
|
||||
<nodes>localhost</nodes>
|
||||
<node>localhost</node>
|
||||
</testCase>
|
||||
|
||||
<testCase id="100001">
|
||||
|
||||
@@ -83,7 +83,7 @@
|
||||
<class>Ping</class>
|
||||
<desc>Ping gNB from NR-UE</desc>
|
||||
<id>rfsim5g_ue</id>
|
||||
<nodes>localhost</nodes>
|
||||
<node>localhost</node>
|
||||
<svr_id>rfsim5g_gnb_nos1</svr_id>
|
||||
<svr_node>localhost</svr_node>
|
||||
<ping_args>-c20 -i0.2</ping_args>
|
||||
@@ -94,7 +94,7 @@
|
||||
<class>Ping</class>
|
||||
<desc>Ping NR-UE from gNB</desc>
|
||||
<id>rfsim5g_gnb_nos1</id>
|
||||
<nodes>localhost</nodes>
|
||||
<node>localhost</node>
|
||||
<svr_id>rfsim5g_ue</svr_id>
|
||||
<svr_node>localhost</svr_node>
|
||||
<ping_args>-c20 -i0.2</ping_args>
|
||||
|
||||
@@ -72,14 +72,14 @@
|
||||
<class>Attach_UE</class>
|
||||
<desc>Attach OAI UE (Wait for IP)</desc>
|
||||
<id>rfsim5g_ue</id>
|
||||
<nodes>localhost</nodes>
|
||||
<node>localhost</node>
|
||||
</testCase>
|
||||
|
||||
<testCase id="020001">
|
||||
<class>Ping</class>
|
||||
<desc>Ping ext-dn from NR-UE</desc>
|
||||
<id>rfsim5g_ue</id>
|
||||
<nodes>localhost</nodes>
|
||||
<node>localhost</node>
|
||||
<svr_id>rfsim5g_ext_dn</svr_id>
|
||||
<svr_node>localhost</svr_node>
|
||||
<ping_args>-c 20 -i 0.25</ping_args>
|
||||
@@ -90,7 +90,7 @@
|
||||
<class>Ping</class>
|
||||
<desc>Ping NR-UE from ext-dn</desc>
|
||||
<id>rfsim5g_ext_dn</id>
|
||||
<nodes>localhost</nodes>
|
||||
<node>localhost</node>
|
||||
<svr_id>rfsim5g_ue</svr_id>
|
||||
<svr_node>localhost</svr_node>
|
||||
<ping_args>-c 20 -i 0.25</ping_args>
|
||||
@@ -101,14 +101,14 @@
|
||||
<class>Attach_UE</class>
|
||||
<desc>Verify 2nd PDU session is up</desc>
|
||||
<id>rfsim5g_ue_pdu_2</id>
|
||||
<nodes>localhost</nodes>
|
||||
<node>localhost</node>
|
||||
</testCase>
|
||||
|
||||
<testCase id="020003">
|
||||
<class>Ping</class>
|
||||
<desc>Ping ext-dn from NR-UE on PDU session ID 2</desc>
|
||||
<id>rfsim5g_ue_pdu_2</id>
|
||||
<nodes>localhost</nodes>
|
||||
<node>localhost</node>
|
||||
<svr_id>rfsim5g_ext_dn</svr_id>
|
||||
<svr_node>localhost</svr_node>
|
||||
<ping_args>-c 20 -i 0.25</ping_args>
|
||||
@@ -120,7 +120,7 @@
|
||||
<desc>Iperf (DL/3Mbps/UDP)(20 sec)</desc>
|
||||
<iperf_args>-u -b 3M -t 20 -R</iperf_args>
|
||||
<id>rfsim5g_ue</id>
|
||||
<nodes>localhost</nodes>
|
||||
<node>localhost</node>
|
||||
<svr_id>rfsim5g_ext_dn</svr_id>
|
||||
<svr_node>localhost</svr_node>
|
||||
<iperf_packetloss_threshold>5</iperf_packetloss_threshold>
|
||||
@@ -132,7 +132,7 @@
|
||||
<desc>Iperf (UL/1Mbps/UDP)(20 sec)</desc>
|
||||
<iperf_args>-u -b 1M -t 20</iperf_args>
|
||||
<id>rfsim5g_ue</id>
|
||||
<nodes>localhost</nodes>
|
||||
<node>localhost</node>
|
||||
<svr_id>rfsim5g_ext_dn</svr_id>
|
||||
<svr_node>localhost</svr_node>
|
||||
<iperf_packetloss_threshold>5</iperf_packetloss_threshold>
|
||||
|
||||
@@ -0,0 +1,71 @@
|
||||
services:
|
||||
oai-gnb:
|
||||
image: ${REGISTRY-oaisoftwarealliance/}${GNB_IMG:-oai-gnb}:${TAG:-develop}
|
||||
container_name: rfsim5g-oai-gnb
|
||||
cap_drop:
|
||||
- ALL
|
||||
cap_add:
|
||||
- NET_ADMIN # for interface bringup
|
||||
- NET_RAW # for ping
|
||||
environment:
|
||||
USE_ADDITIONAL_OPTIONS: --phy-test --rfsim -E
|
||||
--log_config.global_log_options level,nocolor,time
|
||||
ASAN_OPTIONS: detect_leaks=0:detect_odr_violation=0
|
||||
networks:
|
||||
public_net:
|
||||
ipv4_address: 192.168.71.140
|
||||
devices:
|
||||
- /dev/net/tun:/dev/net/tun
|
||||
volumes:
|
||||
- ../../conf_files/gnb.sa.band78.106prb.rfsim.prs.conf:/opt/oai-gnb/etc/gnb.conf
|
||||
- rrc.config:/opt/oai-gnb/
|
||||
healthcheck:
|
||||
test: /bin/bash -c "pgrep nr-softmodem"
|
||||
interval: 10s
|
||||
timeout: 5s
|
||||
retries: 5
|
||||
|
||||
oai-nr-ue:
|
||||
image: ${REGISTRY-oaisoftwarealliance/}${NRUE_IMG:-oai-nr-ue}:${TAG:-develop}
|
||||
container_name: rfsim5g-oai-nr-ue
|
||||
cap_drop:
|
||||
- ALL
|
||||
cap_add:
|
||||
- NET_ADMIN # for interface bringup
|
||||
- NET_RAW # for ping
|
||||
environment:
|
||||
USE_ADDITIONAL_OPTIONS: --phy-test --rfsim -E
|
||||
--reconfig-file etc/rrc/reconfig.raw --rbconfig-file etc/rrc/rbconfig.raw
|
||||
--rfsimulator.serveraddr 192.168.71.140
|
||||
--log_config.global_log_options level,nocolor,time
|
||||
--telnetsrv --telnetsrv.listenaddr 192.168.71.150 --telnetsrv.listenport 8091
|
||||
--telnetsrv.shrmod ciUE
|
||||
ASAN_OPTIONS: detect_leaks=0:detect_odr_violation=0
|
||||
devices:
|
||||
- /dev/net/tun:/dev/net/tun
|
||||
volumes:
|
||||
- ../../conf_files/nrue.band78.106prb.prs.conf:/opt/oai-nr-ue/etc/nr-ue.conf
|
||||
- rrc.config:/opt/oai-nr-ue/etc/rrc/
|
||||
depends_on:
|
||||
- oai-gnb
|
||||
networks:
|
||||
public_net:
|
||||
ipv4_address: 192.168.71.150
|
||||
healthcheck:
|
||||
test: /bin/bash -c "pgrep nr-uesoftmodem"
|
||||
interval: 10s
|
||||
timeout: 5s
|
||||
retries: 5
|
||||
|
||||
volumes:
|
||||
rrc.config:
|
||||
|
||||
networks:
|
||||
public_net:
|
||||
driver: bridge
|
||||
name: rfsim5g-oai-public-net
|
||||
ipam:
|
||||
config:
|
||||
- subnet: 192.168.71.128/26
|
||||
driver_opts:
|
||||
com.docker.network.bridge.name: "rfsim5g-public"
|
||||
@@ -37,6 +37,8 @@
|
||||
#include "openair2/LAYER2/NR_MAC_UE/mac_defs.h"
|
||||
#include "openair2/LAYER2/NR_MAC_UE/mac_proto.h"
|
||||
#include "openair2/RRC/NR_UE/rrc_proto.h"
|
||||
#include "openair1/PHY/phy_extern_nr_ue.h"
|
||||
#include "openair1/PHY/defs_nr_common.h"
|
||||
|
||||
#define TELNETSERVERCODE
|
||||
#include "telnetsrv.h"
|
||||
@@ -110,6 +112,26 @@ static int force_deregistration(char *buf, int debug, telnet_printfunc_t prnt)
|
||||
return 0;
|
||||
}
|
||||
|
||||
extern float get_prs_max_dl_toa(prs_meas_t *prs_meas);
|
||||
static int get_dl_toa(char *buf, int debug, telnet_printfunc_t prnt)
|
||||
{
|
||||
// TODO multiple antennas, resources, gNBs?
|
||||
int gNB_id = 0;
|
||||
int rsc_id = 0;
|
||||
int ant = 0;
|
||||
|
||||
PHY_VARS_NR_UE *UE = PHY_vars_UE_g[0][0];
|
||||
if (!UE || !UE->prs_vars[gNB_id])
|
||||
ERROR_MSG_RET("no UE/prs_vars found!\n");
|
||||
NR_PRS_RESOURCE_t *prs_res = &UE->prs_vars[gNB_id]->prs_resource[rsc_id];
|
||||
if (!prs_res->prs_meas || !prs_res->prs_meas[ant])
|
||||
ERROR_MSG_RET("prs_meas not initialized!\n");
|
||||
|
||||
float max = get_prs_max_dl_toa(prs_res->prs_meas[ant]);
|
||||
prnt("UE max PRS DL ToA %.3f\n", max);
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* Telnet shell command definitions */
|
||||
static telnetshell_cmddef_t cicmds[] = {
|
||||
{"sync_state", "[UE_ID(int,opt)]", get_sync_state},
|
||||
@@ -117,6 +139,7 @@ static telnetshell_cmddef_t cicmds[] = {
|
||||
{"force_RRC_IDLE", "", force_RRC_IDLE},
|
||||
{"force_crnti_ra", "", force_crnti_ra},
|
||||
{"deregistration", "", force_deregistration},
|
||||
{"get_max_dl_toa", "[ant]", get_dl_toa},
|
||||
{"", "", NULL},
|
||||
};
|
||||
|
||||
|
||||
@@ -157,6 +157,9 @@ void init_nr_prs_ue_vars(PHY_VARS_NR_UE *ue)
|
||||
for (int j=0; j<fp->nb_antennas_rx; j++) {
|
||||
prs_vars[idx]->prs_resource[k].prs_meas[j] = malloc16_clear(sizeof(prs_meas_t));
|
||||
AssertFatal((prs_vars[idx]->prs_resource[k].prs_meas[j]!=NULL), "%s: PRS measurements malloc failed for gNB_id %d, rx_ant %d\n", __FUNCTION__, idx, j);
|
||||
prs_meas_t *m = prs_vars[idx]->prs_resource[k].prs_meas[j];
|
||||
m->next_dl_toa = m->dl_toa;
|
||||
pthread_mutex_init(&m->dl_toa_mtx, NULL);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -150,22 +150,11 @@ int nr_pdsch_dmrs_rx(const PHY_VARS_NR_UE *ue,
|
||||
return(0);
|
||||
}
|
||||
|
||||
int nr_pdcch_dmrs_rx(const unsigned int *nr_gold_pdcch,
|
||||
c16_t *output,
|
||||
unsigned short p,
|
||||
unsigned short nb_rb_coreset)
|
||||
void nr_pdcch_dmrs_ref(const unsigned int *nr_gold_pdcch, c16_t *output, unsigned short nb_rb_coreset)
|
||||
{
|
||||
if (p==2000) {
|
||||
for (int i=0; i<((nb_rb_coreset*6)>>1); i++) {
|
||||
output[i] = get_modulated(nr_gold_pdcch, i, true);
|
||||
#ifdef DEBUG_PDCCH
|
||||
if (i<8)
|
||||
printf("i %d idx %d pdcch mod_dmrs %d %d\n", i, idx, output[i].r, output[i].i);
|
||||
#endif
|
||||
}
|
||||
for (int i = 0; i < ((nb_rb_coreset * 6) >> 1); i++) {
|
||||
output[i] = get_modulated(nr_gold_pdcch, i, true);
|
||||
}
|
||||
|
||||
return(0);
|
||||
}
|
||||
|
||||
void nr_pbch_dmrs_rx(int symbol, const unsigned int *nr_gold_pbch, c16_t *output, bool sidelink)
|
||||
|
||||
@@ -35,10 +35,7 @@ void nr_pbch_dmrs_rx(int dmrss, const unsigned int *nr_gold_pbch, c16_t *output,
|
||||
/*!\brief This function generates the NR Gold sequence (38-211, Sec 5.2.1) for the PDCCH DMRS.
|
||||
@param PHY_VARS_NR_UE* ue structure provides configuration, frame parameters and the pointers to the 32 bits sequence storage tables
|
||||
*/
|
||||
int nr_pdcch_dmrs_rx(const unsigned int *nr_gold_pdcch,
|
||||
c16_t *output,
|
||||
unsigned short p,
|
||||
unsigned short nb_rb_corset);
|
||||
void nr_pdcch_dmrs_ref(const unsigned int *nr_gold_pdcch, c16_t *output, unsigned short nb_rb_corset);
|
||||
|
||||
int nr_pdsch_dmrs_rx(const PHY_VARS_NR_UE *ue,
|
||||
unsigned int Ns,
|
||||
|
||||
@@ -47,12 +47,12 @@
|
||||
#define NO_INTERP 1
|
||||
|
||||
/* Generic function to find the peak of channel estimation buffer */
|
||||
void peak_estimator(int32_t *buffer, int32_t buf_len, int32_t *peak_idx, int32_t *peak_val, int32_t mean_val)
|
||||
void peak_estimator(c16_t *buffer, int32_t buf_len, int32_t *peak_idx, int32_t *peak_val, int32_t mean_val)
|
||||
{
|
||||
int32_t max_val = 0, max_idx = 0, abs_val = 0;
|
||||
for(int k = 0; k < buf_len; k++)
|
||||
{
|
||||
abs_val = squaredMod(((c16_t*)buffer)[k]);
|
||||
abs_val = squaredMod(buffer[k]);
|
||||
if(abs_val > max_val)
|
||||
{
|
||||
max_val = abs_val;
|
||||
@@ -71,6 +71,32 @@ void peak_estimator(int32_t *buffer, int32_t buf_len, int32_t *peak_idx, int32_t
|
||||
}
|
||||
}
|
||||
|
||||
void set_prs_dl_toa(prs_meas_t *prs_meas, float dl_toa)
|
||||
{
|
||||
int rc = pthread_mutex_lock(&prs_meas->dl_toa_mtx);
|
||||
AssertFatal(rc == 0, "pthread_mutex_lock() failed: errno %d, %s\n", errno, strerror(errno));
|
||||
*prs_meas->next_dl_toa++ = dl_toa;
|
||||
if (prs_meas->next_dl_toa >= prs_meas->dl_toa + sizeofArray(prs_meas->dl_toa))
|
||||
prs_meas->next_dl_toa = prs_meas->dl_toa;
|
||||
LOG_D(NR_PHY, "next_dl_toa %p\n", prs_meas->next_dl_toa);
|
||||
rc = pthread_mutex_unlock(&prs_meas->dl_toa_mtx);
|
||||
AssertFatal(rc == 0, "pthread_mutex_unlock() failed: errno %d, %s\n", errno, strerror(errno));
|
||||
}
|
||||
|
||||
float get_prs_max_dl_toa(prs_meas_t *prs_meas)
|
||||
{
|
||||
float max = 0.0f;
|
||||
int rc = pthread_mutex_lock(&prs_meas->dl_toa_mtx);
|
||||
AssertFatal(rc == 0, "pthread_mutex_lock() failed: errno %d, %s\n", errno, strerror(errno));
|
||||
for (int i = 0; i < sizeofArray(prs_meas->dl_toa); ++i) {
|
||||
max = cmax(max, prs_meas->dl_toa[i]);
|
||||
LOG_I(NR_PHY, "i %d dl_toa %.3f max %.3f\n", i, prs_meas->dl_toa[i], max);
|
||||
}
|
||||
rc = pthread_mutex_unlock(&prs_meas->dl_toa_mtx);
|
||||
AssertFatal(rc == 0, "pthread_mutex_unlock() failed: errno %d, %s\n", errno, strerror(errno));
|
||||
return max;
|
||||
}
|
||||
|
||||
int nr_prs_channel_estimation(uint8_t gNB_id,
|
||||
uint8_t rsc_id,
|
||||
uint8_t rep_num,
|
||||
@@ -83,8 +109,8 @@ int nr_prs_channel_estimation(uint8_t gNB_id,
|
||||
prs_config_t *prs_cfg = &ue->prs_vars[gNB_id]->prs_resource[rsc_id].prs_cfg;
|
||||
prs_meas_t **prs_meas = ue->prs_vars[gNB_id]->prs_resource[rsc_id].prs_meas;
|
||||
c16_t ch_tmp_buf[ ue->frame_parms.ofdm_symbol_size] __attribute__((aligned(32)));
|
||||
int32_t chF_interpol[frame_params->nb_antennas_rx][NR_PRS_IDFT_OVERSAMP_FACTOR*ue->frame_parms.ofdm_symbol_size] __attribute__((aligned(32)));
|
||||
int32_t chT_interpol[frame_params->nb_antennas_rx][NR_PRS_IDFT_OVERSAMP_FACTOR*ue->frame_parms.ofdm_symbol_size] __attribute__((aligned(32)));
|
||||
c16_t chF_interpol[frame_params->nb_antennas_rx][NR_PRS_IDFT_OVERSAMP_FACTOR*ue->frame_parms.ofdm_symbol_size] __attribute__((aligned(32)));
|
||||
c16_t chT_interpol[frame_params->nb_antennas_rx][NR_PRS_IDFT_OVERSAMP_FACTOR*ue->frame_parms.ofdm_symbol_size] __attribute__((aligned(32)));
|
||||
memset(ch_tmp_buf,0,sizeof(ch_tmp_buf));
|
||||
memset(chF_interpol,0,sizeof(chF_interpol));
|
||||
memset(chT_interpol,0,sizeof(chF_interpol));
|
||||
@@ -315,10 +341,7 @@ int nr_prs_channel_estimation(uint8_t gNB_id,
|
||||
|
||||
//Start pilot
|
||||
c16_t ch = c16MulConjShift(*pil, *rxF, 15);
|
||||
multadd_real_vector_complex_scalar(fl,
|
||||
ch,
|
||||
ch_tmp,
|
||||
16);
|
||||
multadd_real_vector_complex_scalar(fl, ch, ch_tmp, 16);
|
||||
|
||||
// SNR & RSRP estimation
|
||||
rsrp += squaredMod(*rxF);
|
||||
@@ -331,10 +354,7 @@ int nr_prs_channel_estimation(uint8_t gNB_id,
|
||||
k = (k+prs_cfg->CombSize) % frame_params->ofdm_symbol_size;
|
||||
rxF = &rxdataF[rxAnt][l * frame_params->ofdm_symbol_size + k];
|
||||
ch = c16MulConjShift(*pil, *rxF, 15);
|
||||
multadd_real_vector_complex_scalar(fml,
|
||||
ch,
|
||||
ch_tmp,
|
||||
16);
|
||||
multadd_real_vector_complex_scalar(fml, ch, ch_tmp, 16);
|
||||
|
||||
// SNR & RSRP estimation
|
||||
rsrp += squaredMod(*rxF);
|
||||
@@ -352,10 +372,7 @@ int nr_prs_channel_estimation(uint8_t gNB_id,
|
||||
for(int pIdx = 2; pIdx < num_pilots-2; pIdx++)
|
||||
{
|
||||
c16_t ch = c16MulConjShift(*pil, *rxF, 15);
|
||||
multadd_real_vector_complex_scalar(fmm,
|
||||
ch,
|
||||
ch_tmp,
|
||||
16);
|
||||
multadd_real_vector_complex_scalar(fmm, ch, ch_tmp, 16);
|
||||
|
||||
// SNR & RSRP estimation
|
||||
rsrp += squaredMod(*rxF);
|
||||
@@ -372,10 +389,7 @@ int nr_prs_channel_estimation(uint8_t gNB_id,
|
||||
|
||||
//End pilot
|
||||
ch = c16MulConjShift(*pil, *rxF, 15);
|
||||
multadd_real_vector_complex_scalar(fmr,
|
||||
ch,
|
||||
ch_tmp,
|
||||
16);
|
||||
multadd_real_vector_complex_scalar(fmr, ch, ch_tmp, 16);
|
||||
|
||||
// SNR & RSRP estimation
|
||||
rsrp += squaredMod(*rxF);
|
||||
@@ -388,10 +402,7 @@ int nr_prs_channel_estimation(uint8_t gNB_id,
|
||||
k = (k+prs_cfg->CombSize) % frame_params->ofdm_symbol_size;
|
||||
rxF = &rxdataF[rxAnt][l * frame_params->ofdm_symbol_size + k];
|
||||
ch = c16MulConjShift(*pil, *rxF, 15);
|
||||
multadd_real_vector_complex_scalar(fr,
|
||||
ch,
|
||||
ch_tmp,
|
||||
16);
|
||||
multadd_real_vector_complex_scalar(fr, ch, ch_tmp, 16);
|
||||
|
||||
// SNR & RSRP estimation
|
||||
rsrp += squaredMod(*rxF);
|
||||
@@ -435,9 +446,9 @@ int nr_prs_channel_estimation(uint8_t gNB_id,
|
||||
|
||||
// Place PRS channel estimates in FFT shifted format
|
||||
if(first_half > 0)
|
||||
memcpy((int16_t *)&chF_interpol[rxAnt][start_offset], &ch_tmp[0], first_half * sizeof(int32_t));
|
||||
memcpy(&chF_interpol[rxAnt][start_offset], &ch_tmp[0], first_half * sizeof(c16_t));
|
||||
if(second_half > 0)
|
||||
memcpy((int16_t *)&chF_interpol[rxAnt][0], &ch_tmp[first_half << 1], second_half * sizeof(int32_t));
|
||||
memcpy(&chF_interpol[rxAnt][0], &ch_tmp[first_half], second_half * sizeof(c16_t));
|
||||
|
||||
// Convert to time domain
|
||||
freq2time(NR_PRS_IDFT_OVERSAMP_FACTOR * frame_params->ofdm_symbol_size,
|
||||
@@ -463,9 +474,9 @@ int nr_prs_channel_estimation(uint8_t gNB_id,
|
||||
prs_meas[rxAnt]->slot = proc->nr_slot_rx;
|
||||
prs_meas[rxAnt]->rxAnt_idx = rxAnt;
|
||||
prs_meas[rxAnt]->dl_aoa = rsc_id;
|
||||
prs_meas[rxAnt]->dl_toa = prs_toa / (float)NR_PRS_IDFT_OVERSAMP_FACTOR;
|
||||
if ((frame_params->ofdm_symbol_size - prs_meas[rxAnt]->dl_toa) < frame_params->ofdm_symbol_size / 2)
|
||||
prs_meas[rxAnt]->dl_toa -= (frame_params->ofdm_symbol_size);
|
||||
float dl_toa = prs_toa / (float)NR_PRS_IDFT_OVERSAMP_FACTOR;
|
||||
if ((frame_params->ofdm_symbol_size - dl_toa) < frame_params->ofdm_symbol_size / 2)
|
||||
dl_toa -= (frame_params->ofdm_symbol_size);
|
||||
LOG_I(PHY,
|
||||
"[gNB %d][rsc %d][Rx %d][sfn %d][slot %d] DL PRS ToA ==> %.1f / %d samples, peak channel power %.1f dBm, SNR %+.1f dB, rsrp %+.1f dBm\n",
|
||||
gNB_id,
|
||||
@@ -473,12 +484,14 @@ int nr_prs_channel_estimation(uint8_t gNB_id,
|
||||
rxAnt,
|
||||
proc->frame_rx,
|
||||
proc->nr_slot_rx,
|
||||
prs_meas[rxAnt]->dl_toa,
|
||||
dl_toa,
|
||||
frame_params->ofdm_symbol_size,
|
||||
ch_pwr_dbm,
|
||||
prs_meas[rxAnt]->snr,
|
||||
prs_meas[rxAnt]->rsrp_dBm);
|
||||
|
||||
set_prs_dl_toa(prs_meas[rxAnt], dl_toa);
|
||||
|
||||
#ifdef DEBUG_PRS_CHEST
|
||||
sprintf(filename, "%s%i%s", "PRSpilot_", rxAnt, ".m");
|
||||
LOG_M(filename, "prs_loc", mod_prs, num_pilots, 1, 1);
|
||||
@@ -496,7 +509,7 @@ int nr_prs_channel_estimation(uint8_t gNB_id,
|
||||
// T tracer dump
|
||||
T(T_UE_PHY_INPUT_SIGNAL, T_INT(gNB_id),
|
||||
T_INT(proc->frame_rx), T_INT(proc->nr_slot_rx),
|
||||
T_INT(rxAnt), T_BUFFER(&rxdataF[rxAnt][0], frame_params->samples_per_slot_wCP*sizeof(int32_t)));
|
||||
T_INT(rxAnt), T_BUFFER(&rxdataF[rxAnt][0], frame_params->samples_per_slot_wCP*sizeof(c16_t)));
|
||||
|
||||
T(T_UE_PHY_DL_CHANNEL_ESTIMATE_FREQ,
|
||||
T_INT(gNB_id),
|
||||
@@ -504,7 +517,7 @@ int nr_prs_channel_estimation(uint8_t gNB_id,
|
||||
T_INT(proc->frame_rx),
|
||||
T_INT(proc->nr_slot_rx),
|
||||
T_INT(rxAnt),
|
||||
T_BUFFER(&chF_interpol[rxAnt][0], NR_PRS_IDFT_OVERSAMP_FACTOR * frame_params->ofdm_symbol_size * sizeof(int32_t)));
|
||||
T_BUFFER(&chF_interpol[rxAnt][0], NR_PRS_IDFT_OVERSAMP_FACTOR * frame_params->ofdm_symbol_size * sizeof(c16_t)));
|
||||
|
||||
T(T_UE_PHY_DL_CHANNEL_ESTIMATE,
|
||||
T_INT(gNB_id),
|
||||
@@ -512,7 +525,7 @@ int nr_prs_channel_estimation(uint8_t gNB_id,
|
||||
T_INT(proc->frame_rx),
|
||||
T_INT(proc->nr_slot_rx),
|
||||
T_INT(rxAnt),
|
||||
T_BUFFER(&chT_interpol[rxAnt][0], NR_PRS_IDFT_OVERSAMP_FACTOR * frame_params->ofdm_symbol_size * sizeof(int32_t)));
|
||||
T_BUFFER(&chT_interpol[rxAnt][0], NR_PRS_IDFT_OVERSAMP_FACTOR * frame_params->ofdm_symbol_size * sizeof(c16_t)));
|
||||
}
|
||||
|
||||
return(0);
|
||||
@@ -797,25 +810,18 @@ int nr_pbch_channel_estimation(const NR_DL_FRAME_PARMS *fp,
|
||||
return(0);
|
||||
}
|
||||
|
||||
void nr_pdcch_channel_estimation(PHY_VARS_NR_UE *ue,
|
||||
const UE_nr_rxtx_proc_t *proc,
|
||||
unsigned char symbol,
|
||||
fapi_nr_coreset_t *coreset,
|
||||
void nr_pdcch_channel_estimation(const PHY_VARS_NR_UE *ue,
|
||||
int nb_rb_coreset,
|
||||
int coreset_start_rb,
|
||||
int dmrs_ref,
|
||||
uint16_t first_carrier_offset,
|
||||
uint16_t BWPStart,
|
||||
int32_t pdcch_est_size,
|
||||
c16_t pdcch_dl_ch_estimates[][pdcch_est_size],
|
||||
c16_t rxdataF[ue->frame_parms.nb_antennas_rx][ue->frame_parms.ofdm_symbol_size])
|
||||
c16_t rxdataF[ue->frame_parms.nb_antennas_rx][ue->frame_parms.ofdm_symbol_size],
|
||||
c16_t *pilot)
|
||||
{
|
||||
int slot = proc->nr_slot_rx;
|
||||
unsigned char aarx;
|
||||
unsigned short k;
|
||||
unsigned int pilot_cnt;
|
||||
|
||||
int nb_rb_coreset=0;
|
||||
int coreset_start_rb=0;
|
||||
get_coreset_rballoc(coreset->frequency_domain_resource,&nb_rb_coreset,&coreset_start_rb);
|
||||
if(nb_rb_coreset==0) return;
|
||||
const int symb_sz = ue->frame_parms.ofdm_symbol_size;
|
||||
|
||||
#ifdef DEBUG_PDCCH
|
||||
printf("pdcch_channel_estimation: first_carrier_offset %d, BWPStart %d, coreset_start_rb %d, coreset_nb_rb %d\n",
|
||||
@@ -824,38 +830,19 @@ void nr_pdcch_channel_estimation(PHY_VARS_NR_UE *ue,
|
||||
|
||||
unsigned short coreset_start_subcarrier = first_carrier_offset+(BWPStart + coreset_start_rb)*12;
|
||||
|
||||
#ifdef DEBUG_PDCCH
|
||||
printf("PDCCH Channel Estimation : OFDM size %d, Ncp=%d, slot=%d, symbol %d\n",
|
||||
ue->frame_parms.ofdm_symbol_size,
|
||||
ue->frame_parms.Ncp,
|
||||
slot,
|
||||
symbol);
|
||||
#endif
|
||||
|
||||
#if CH_INTERP
|
||||
int16_t *fl = filt16a_l1;
|
||||
int16_t *fm = filt16a_m1;
|
||||
int16_t *fr = filt16a_r1;
|
||||
#endif
|
||||
|
||||
unsigned short scrambling_id = coreset->pdcch_dmrs_scrambling_id;
|
||||
int dmrs_ref = 0;
|
||||
if (coreset->CoreSetType == NFAPI_NR_CSET_CONFIG_PDCCH_CONFIG)
|
||||
dmrs_ref = BWPStart;
|
||||
// generate pilot
|
||||
c16_t pilot[(nb_rb_coreset + dmrs_ref) * 3] __attribute__((aligned(16)));
|
||||
// Note: pilot returned by the following function is already the complex conjugate of the transmitted DMRS
|
||||
const uint32_t *gold = nr_gold_pdcch(ue->frame_parms.N_RB_DL, ue->frame_parms.symbols_per_slot, scrambling_id, slot, symbol);
|
||||
nr_pdcch_dmrs_rx(gold, pilot, 2000, (nb_rb_coreset + dmrs_ref));
|
||||
|
||||
for (aarx=0; aarx<ue->frame_parms.nb_antennas_rx; aarx++) {
|
||||
|
||||
k = coreset_start_subcarrier;
|
||||
for (int aarx = 0; aarx < ue->frame_parms.nb_antennas_rx; aarx++) {
|
||||
int k = coreset_start_subcarrier;
|
||||
c16_t *pil = &pilot[dmrs_ref * 3];
|
||||
c16_t *rxF = &rxdataF[aarx][k + 1];
|
||||
c16_t *dl_ch = &pdcch_dl_ch_estimates[aarx][0];
|
||||
c16_t *dl_ch = pdcch_dl_ch_estimates[aarx];
|
||||
|
||||
memset(dl_ch, 0, sizeof(c16_t) * ue->frame_parms.ofdm_symbol_size);
|
||||
memset(dl_ch, 0, sizeof(c16_t) * symb_sz);
|
||||
|
||||
#ifdef DEBUG_PDCCH
|
||||
printf("pdcch ch est pilot addr %p RB_DL %d\n",&pilot[dmrs_ref*3], ue->frame_parms.N_RB_DL);
|
||||
@@ -871,36 +858,36 @@ void nr_pdcch_channel_estimation(PHY_VARS_NR_UE *ue,
|
||||
rxF += 4;
|
||||
k += 2;
|
||||
|
||||
if (k >= ue->frame_parms.ofdm_symbol_size) {
|
||||
k -= ue->frame_parms.ofdm_symbol_size;
|
||||
if (k >= symb_sz) {
|
||||
k -= symb_sz;
|
||||
rxF = &rxdataF[aarx][k + 1];
|
||||
}
|
||||
multadd_real_vector_complex_scalar(fm, c16mulShift(*pil++, *rxF, 15), dl_ch, 16);
|
||||
k = (k + 4) % ue->frame_parms.ofdm_symbol_size;
|
||||
rxF = (c16_t *)&rxdataF[aarx][k + 1)];
|
||||
k = (k + 4) % symb_sz;
|
||||
rxF = &rxdataF[aarx][k + 1)];
|
||||
|
||||
multadd_real_vector_complex_scalar(fr, c16mulShift(*pil++, *rxF, 15), dl_ch, 16);
|
||||
dl_ch += 12;
|
||||
k = (k + 4) % ue->frame_parms.ofdm_symbol_size;
|
||||
rxF = (c16_t *)&rxdataF[aarx][k + 1];
|
||||
k = (k + 4) % symb_sz;
|
||||
rxF = &rxdataF[aarx][k + 1];
|
||||
|
||||
for (pilot_cnt=3; pilot_cnt<(3*nb_rb_coreset); pilot_cnt += 3) {
|
||||
for (int pilot_cnt = 3; pilot_cnt < (3 * nb_rb_coreset); pilot_cnt += 3) {
|
||||
multadd_real_vector_complex_scalar(fl, c16mulShift(*pil++, *rxF, 15), dl_ch, 16);
|
||||
k = (k + 4) % ue->frame_parms.ofdm_symbol_size;
|
||||
rxF = (c16_t *)&rxdataF[aarx][k + 1];
|
||||
k = (k + 4) % symb_sz;
|
||||
rxF = &rxdataF[aarx][k + 1];
|
||||
|
||||
multadd_real_vector_complex_scalar(fm, c16mulShift(*pil++, *rxF, 15), dl_ch, 16);
|
||||
k = (k + 4) % ue->frame_parms.ofdm_symbol_size;
|
||||
rxF = (c16_t *)&rxdataF[aarx][k + 1];
|
||||
k = (k + 4) % symb_sz;
|
||||
rxF = &rxdataF[aarx][k + 1];
|
||||
multadd_real_vector_complex_scalar(fr, c16mulShift(*pil++, *rxF, 15), dl_ch, 16);
|
||||
dl_ch += 12;
|
||||
k = (k + 4) % ue->frame_parms.ofdm_symbol_size;
|
||||
rxF = (c16_t *)&rxdataF[aarx][k + 1];
|
||||
k = (k + 4) % symb_sz;
|
||||
rxF = &rxdataF[aarx][k + 1];
|
||||
}
|
||||
#else //ELSE CH_INTERP
|
||||
#else //ELSE CH_INTERP
|
||||
c32_t ch_sum = {0, 0};
|
||||
|
||||
for (pilot_cnt = 0; pilot_cnt < 3*nb_rb_coreset; pilot_cnt++) {
|
||||
for (int pilot_cnt = 0; pilot_cnt < 3 * nb_rb_coreset; pilot_cnt++) {
|
||||
|
||||
#ifdef DEBUG_PDCCH
|
||||
printf("pilot[%u] = (%d, %d)\trxF[%d] = (%d, %d)\n", pilot_cnt, pil[0], pil[1], k+1, rxF[0], rxF[1]);
|
||||
@@ -908,8 +895,8 @@ void nr_pdcch_channel_estimation(PHY_VARS_NR_UE *ue,
|
||||
c16_t ch = c16mulShift(*pil++, *rxF, 15);
|
||||
ch_sum.r += ch.r;
|
||||
ch_sum.i += ch.i;
|
||||
k = (k + 4) % ue->frame_parms.ofdm_symbol_size;
|
||||
rxF = (c16_t *)&rxdataF[aarx][k + 1];
|
||||
k = (k + 4) % symb_sz;
|
||||
rxF = &rxdataF[aarx][k + 1];
|
||||
|
||||
if (pilot_cnt % 3 == 2) {
|
||||
ch.r = ch_sum.r / 3;
|
||||
@@ -923,11 +910,10 @@ void nr_pdcch_channel_estimation(PHY_VARS_NR_UE *ue,
|
||||
ch_sum = (c32_t){0};
|
||||
}
|
||||
}
|
||||
#endif //END CH_INTERP
|
||||
#endif //END CH_INTERP
|
||||
|
||||
|
||||
//}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -39,20 +39,21 @@ int nr_prs_channel_estimation(uint8_t gNB_id,
|
||||
c16_t rxdataF[][ue->frame_parms.samples_per_slot_wCP]);
|
||||
|
||||
/* Generic function to find the peak of channel estimation buffer */
|
||||
void peak_estimator(int32_t *buffer, int32_t buf_len, int32_t *peak_idx, int32_t *peak_val, int32_t mean_val);
|
||||
void peak_estimator(c16_t *buffer, int32_t buf_len, int32_t *peak_idx, int32_t *peak_val, int32_t mean_val);
|
||||
|
||||
/*!
|
||||
\brief This function performs channel estimation including frequency and temporal interpolation
|
||||
*/
|
||||
void nr_pdcch_channel_estimation(PHY_VARS_NR_UE *ue,
|
||||
const UE_nr_rxtx_proc_t *proc,
|
||||
unsigned char symbol,
|
||||
fapi_nr_coreset_t *coreset,
|
||||
void nr_pdcch_channel_estimation(const PHY_VARS_NR_UE *ue,
|
||||
int nb_rb,
|
||||
int rb_offset,
|
||||
int dmrs_ref,
|
||||
uint16_t first_carrier_offset,
|
||||
uint16_t BWPStart,
|
||||
int32_t pdcch_est_size,
|
||||
c16_t pdcch_dl_ch_estimates[][pdcch_est_size],
|
||||
c16_t rxdataF[ue->frame_parms.nb_antennas_rx][ue->frame_parms.ofdm_symbol_size]);
|
||||
c16_t rxdataF[ue->frame_parms.nb_antennas_rx][ue->frame_parms.ofdm_symbol_size],
|
||||
c16_t *pilot);
|
||||
|
||||
c32_t nr_pbch_dmrs_correlation(const NR_DL_FRAME_PARMS *fp,
|
||||
const UE_nr_rxtx_proc_t *proc,
|
||||
|
||||
@@ -40,7 +40,7 @@
|
||||
#include "PHY/sse_intrin.h"
|
||||
#include "common/utils/nr/nr_common.h"
|
||||
#include <openair1/PHY/TOOLS/phy_scope_interface.h>
|
||||
#include "openair1/PHY/NR_REFSIG/nr_refsig_common.h"
|
||||
#include "openair1/PHY/NR_REFSIG/refsig_defs_ue.h"
|
||||
#include "PHY/NR_UE_ESTIMATION/nr_estimation.h"
|
||||
|
||||
#include "assertions.h"
|
||||
@@ -81,7 +81,8 @@ static void nr_pdcch_demapping_deinterleaving(uint32_t coreset_nbr_rb,
|
||||
uint8_t n_shift,
|
||||
uint8_t number_of_candidates,
|
||||
uint16_t *CCE,
|
||||
uint8_t *L)
|
||||
uint8_t *L,
|
||||
int llr_stride_per_symbol)
|
||||
{
|
||||
/*
|
||||
* This function will do demapping and deinterleaving from llr containing demodulated symbols
|
||||
@@ -168,7 +169,7 @@ static void nr_pdcch_demapping_deinterleaving(uint32_t coreset_nbr_rb,
|
||||
for (int cce_count = 0; cce_count < L[c_id]; cce_count++) {
|
||||
for (int k = 0; k < NR_NB_REG_PER_CCE / reg_bundle_size_L; k++) { // loop over REG bundles
|
||||
int f = f_bundle_j_list_ord[c_id][k + NR_NB_REG_PER_CCE * cce_count / reg_bundle_size_L];
|
||||
c16_t *in = llr + (f * B_rb + symbol_idx * coreset_nbr_rb) * RE_PER_RB_OUT_DMRS;
|
||||
c16_t *in = llr + f * B_rb * RE_PER_RB_OUT_DMRS + symbol_idx * llr_stride_per_symbol;
|
||||
// loop over the RBs of the bundle
|
||||
memcpy(e_rx + RE_PER_RB_OUT_DMRS * rb_count, in, B_rb * RE_PER_RB_OUT_DMRS * sizeof(*e_rx));
|
||||
rb_count += B_rb;
|
||||
@@ -294,8 +295,9 @@ static void nr_pdcch_extract_rbs_single(uint32_t rxdataF_sz,
|
||||
}
|
||||
|
||||
static void nr_pdcch_channel_compensation(int arraySz,
|
||||
c16_t rxdataF_ext[][arraySz],
|
||||
c16_t dl_ch_estimates_ext[][arraySz],
|
||||
int sz2,
|
||||
c16_t rxdataF_ext[][sz2],
|
||||
c16_t dl_ch_estimates_ext[][sz2],
|
||||
c16_t rxdataF_comp[][arraySz],
|
||||
int antRx,
|
||||
uint8_t output_shift)
|
||||
@@ -306,17 +308,17 @@ static void nr_pdcch_channel_compensation(int arraySz,
|
||||
}
|
||||
}
|
||||
|
||||
static void nr_pdcch_detection_mrc(int sz, c16_t rxdataF_comp[][sz])
|
||||
static void nr_pdcch_detection_mrc(int nb_ant, int sz, c16_t rxdataF_comp[][sz])
|
||||
{
|
||||
LOG_D(NR_PHY_DCI, "we enter nr_pdcch_detection_mrc (hard coded 2 antennas)\n");
|
||||
c16_t *rx0 = rxdataF_comp[0];
|
||||
c16_t *rx1 = rxdataF_comp[1];
|
||||
|
||||
// MRC on each re of rb
|
||||
// input always aligned and accepting tail padding to process all actual samples
|
||||
for (int i = 0; i < sz; i += 4) {
|
||||
*(simde__m128i *)(rx0 + i) =
|
||||
simde_mm_adds_epi16(simde_mm_srai_epi16(*(simde__m128i *)(rx0 + i), 1), simde_mm_srai_epi16(*(simde__m128i *)(rx1 + i), 1));
|
||||
for (int a = 1; a < nb_ant; a++) {
|
||||
c16_t *rx = rxdataF_comp[a];
|
||||
for (int i = 0; i < sz; i += 4) {
|
||||
*(simde__m128i *)(rx0 + i) = simde_mm_adds_epi16(simde_mm_srai_epi16(*(simde__m128i *)(rx0 + i), 1),
|
||||
simde_mm_srai_epi16(*(simde__m128i *)(rx + i), 1));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -334,28 +336,36 @@ static void nr_rx_pdcch_symbol(PHY_VARS_NR_UE *ue,
|
||||
NR_DL_FRAME_PARMS *fp = &ue->frame_parms;
|
||||
NR_UE_PDCCH_CONFIG *phy_pdcch_config = &phy_data->phy_pdcch_config;
|
||||
fapi_nr_coreset_t *coreset = &phy_pdcch_config->pdcch_config[ss_idx].coreset;
|
||||
int32_t pdcch_est_size = ((((fp->ofdm_symbol_size + LTE_CE_FILTER_LENGTH) + 15) / 16) * 16);
|
||||
int32_t pdcch_est_size = ceil_mod(fp->ofdm_symbol_size + LTE_CE_FILTER_LENGTH, 16);
|
||||
__attribute__((aligned(16))) c16_t pdcch_dl_ch_estimates[fp->nb_antennas_rx][pdcch_est_size];
|
||||
int n_rb;
|
||||
int rb_offset;
|
||||
get_coreset_rballoc(coreset->frequency_domain_resource, &n_rb, &rb_offset);
|
||||
|
||||
unsigned short scrambling_id = coreset->pdcch_dmrs_scrambling_id;
|
||||
int dmrs_ref = 0;
|
||||
if (coreset->CoreSetType == NFAPI_NR_CSET_CONFIG_PDCCH_CONFIG)
|
||||
dmrs_ref = phy_pdcch_config->pdcch_config[ss_idx].BWPStart;
|
||||
// generate pilot
|
||||
c16_t pilot[(n_rb + dmrs_ref) * 3] __attribute__((aligned(16)));
|
||||
// Note: pilot returned by the following function is already the complex conjugate of the transmitted DMRS
|
||||
const uint32_t *gold =
|
||||
nr_gold_pdcch(ue->frame_parms.N_RB_DL, ue->frame_parms.symbols_per_slot, scrambling_id, proc->nr_slot_rx, symbol);
|
||||
nr_pdcch_dmrs_ref(gold, pilot, n_rb + dmrs_ref);
|
||||
nr_pdcch_channel_estimation(ue,
|
||||
proc,
|
||||
symbol,
|
||||
coreset,
|
||||
n_rb,
|
||||
rb_offset,
|
||||
dmrs_ref,
|
||||
fp->first_carrier_offset,
|
||||
phy_pdcch_config->pdcch_config[ss_idx].BWPStart,
|
||||
pdcch_est_size,
|
||||
pdcch_dl_ch_estimates,
|
||||
rxdataF);
|
||||
rxdataF,
|
||||
pilot);
|
||||
|
||||
const int32_t rx_size = ((4 * fp->N_RB_DL * 12 + 31) >> 5) << 5;
|
||||
const int32_t rx_size = ceil_mod(fp->N_RB_DL * 12, 32);
|
||||
__attribute__((aligned(32))) c16_t rxdataF_ext[fp->nb_antennas_rx][rx_size];
|
||||
__attribute__((aligned(32))) c16_t rxdataF_comp[fp->nb_antennas_rx][rx_size];
|
||||
__attribute__((aligned(32))) c16_t pdcch_dl_ch_estimates_ext[fp->nb_antennas_rx][rx_size];
|
||||
memset(rxdataF_comp, 0, sizeof(rxdataF_comp));
|
||||
|
||||
int n_rb;
|
||||
int rb_offset;
|
||||
get_coreset_rballoc(coreset->frequency_domain_resource, &n_rb, &rb_offset);
|
||||
|
||||
nr_pdcch_extract_rbs_single(ue->frame_parms.ofdm_symbol_size,
|
||||
rxdataF,
|
||||
@@ -376,20 +386,21 @@ static void nr_rx_pdcch_symbol(PHY_VARS_NR_UE *ue,
|
||||
for (int i = 1; i < fp->nb_antennas_rx; i++)
|
||||
avgs = cmax(avgs, avg[i]);
|
||||
const int log2_maxh = (log2_approx(avgs) / 2) + 5; //+frame_parms->nb_antennas_rx;
|
||||
|
||||
nr_pdcch_channel_compensation(rx_size,
|
||||
int rx_comp_sz = ceil_mod(llr_size_symbol, 4);
|
||||
__attribute__((aligned(32))) c16_t rxdataF_comp[fp->nb_antennas_rx][rx_comp_sz];
|
||||
memset(rxdataF_comp, 0, sizeof(rxdataF_comp));
|
||||
nr_pdcch_channel_compensation(rx_comp_sz,
|
||||
rx_size,
|
||||
rxdataF_ext,
|
||||
pdcch_dl_ch_estimates_ext,
|
||||
rxdataF_comp,
|
||||
fp->nb_antennas_rx,
|
||||
log2_maxh); // log2_maxh+I0_shift
|
||||
|
||||
UEscopeCopy(ue, pdcchRxdataF_comp, rxdataF_comp, sizeof(struct complex16), fp->nb_antennas_rx, rx_size, 0);
|
||||
|
||||
if (fp->nb_antennas_rx > 1) {
|
||||
nr_pdcch_detection_mrc(rx_size, rxdataF_comp);
|
||||
nr_pdcch_detection_mrc(fp->nb_antennas_rx, rx_comp_sz, rxdataF_comp);
|
||||
}
|
||||
|
||||
UEscopeCopy(ue, pdcchRxdataF_comp, rxdataF_comp[0], sizeof(c16_t), 1, llr_size_symbol, 0);
|
||||
nr_pdcch_llr(llr_size_symbol, rxdataF_comp[0], llr);
|
||||
}
|
||||
|
||||
@@ -497,6 +508,7 @@ void nr_pdcch_dci_indication(const UE_nr_rxtx_proc_t *proc,
|
||||
fapi_nr_dl_config_dci_dl_pdu_rel15_t *rel15 = &phy_pdcch_config->pdcch_config[ss_idx];
|
||||
uint8_t unused_start_symb[NR_SYMBOLS_PER_SLOT] = {0};
|
||||
const int num_monitoring_occ = get_pdcch_mon_occasions_slot(rel15, unused_start_symb);
|
||||
const int llr_stride = llr_size / rel15->coreset.duration;
|
||||
|
||||
int n_rb;
|
||||
int rb_offset;
|
||||
@@ -515,7 +527,8 @@ void nr_pdcch_dci_indication(const UE_nr_rxtx_proc_t *proc,
|
||||
rel15->coreset.ShiftIndex,
|
||||
rel15->number_of_candidates,
|
||||
rel15->CCE,
|
||||
rel15->L);
|
||||
rel15->L,
|
||||
llr_stride);
|
||||
|
||||
nr_dci_decoding_procedure(ue, proc, pdcch_e_rx, rel15, &dci_ind);
|
||||
}
|
||||
|
||||
@@ -38,6 +38,8 @@
|
||||
#include "impl_defs_nr.h"
|
||||
#include "PHY/CODING/nrPolar_tools/nr_polar_defs.h"
|
||||
|
||||
#include <pthread.h>
|
||||
|
||||
#define MAX_NUM_SUBCARRIER_SPACING 5
|
||||
#define NR_MAX_OFDM_SYMBOL_SIZE 8192
|
||||
|
||||
@@ -312,7 +314,10 @@ typedef struct {
|
||||
int32_t sfn;
|
||||
int8_t slot;
|
||||
int8_t rxAnt_idx;
|
||||
float dl_toa;
|
||||
pthread_mutex_t dl_toa_mtx; // protect reading of max from write
|
||||
// circular buffer to be able to read maximum of last estimations
|
||||
float dl_toa[128]; // set through set_prs_dl_toa()
|
||||
float *next_dl_toa;
|
||||
int32_t dl_aoa;
|
||||
float snr;
|
||||
float rsrp;
|
||||
|
||||
@@ -1041,7 +1041,7 @@ void pdcch_processing(PHY_VARS_NR_UE *ue, const UE_nr_rxtx_proc_t *proc, nr_phy_
|
||||
nr_pdcch_generate_llr(ue, proc, symbol, phy_data, llr_size_symbol, num_monitoring_occ, max_nb_symb_pdcch, rxdataF_symb, pdcch_llr);
|
||||
if (symbol == last_symb_pdcch) {
|
||||
nr_pdcch_dci_indication(proc, llr_size_symbol * max_nb_symb_pdcch, num_monitoring_occ, ue, phy_data, pdcch_llr);
|
||||
UEscopeCopy(ue, pdcchLlr, pdcch_llr, sizeof(c16_t), 1, sizeof(pdcch_llr), 0);
|
||||
UEscopeCopy(ue, pdcchLlr, pdcch_llr, sizeof(c16_t), 1, sizeof(pdcch_llr) / sizeof(c16_t), 0);
|
||||
}
|
||||
}
|
||||
stop_meas_nr_ue_phy(ue, DLSCH_RX_PDCCH_STATS);
|
||||
|
||||
@@ -217,7 +217,7 @@ typedef enum {
|
||||
{CONFIG_STRING_RU_NUM_TP_CORES, HLP_RU_NUM_TP_CORES, 0, .uptr=NULL, .defintval=2, TYPE_UINT, 0}, \
|
||||
{CONFIG_STRING_RU_NUM_INTERFACES, HLP_RU_NUM_INTERFACES, 0, .uptr=NULL, .defintval=1, TYPE_UINT, 0}, \
|
||||
{CONFIG_STRING_RU_HALF_SLOT_PARALLELIZATION, HLP_RU_HALF_SLOT_PARALLELIZATION, 0, .uptr=NULL, .defintval=1, TYPE_UINT, 0}, \
|
||||
{CONFIG_STRING_RU_RU_THREAD_CORE, HLP_RU_RU_THREAD_CORE, 0, .uptr=NULL, .defintval=-1, TYPE_UINT, 0}, \
|
||||
{CONFIG_STRING_RU_RU_THREAD_CORE, HLP_RU_RU_THREAD_CORE, 0, .iptr=NULL, .defintval=-1, TYPE_INT, 0}, \
|
||||
{CONFIG_STRING_RU_GPIO_CONTROL, HLP_RU_GPIO_CONTROL, 0, .strptr=NULL, .defstrval="generic", TYPE_STRING, 0}, \
|
||||
}
|
||||
// clang-format on
|
||||
|
||||
@@ -84,8 +84,8 @@
|
||||
{CONFIG_STRING_L1_PUSCH_DTX_THRESHOLD, NULL, 0, .uptr=NULL, .defintval=50, TYPE_UINT, 0}, \
|
||||
{CONFIG_STRING_L1_SRS_DTX_THRESHOLD, NULL, 0, .uptr=NULL, .defintval=30, TYPE_UINT, 0}, \
|
||||
{CONFIG_STRING_L1_MAX_LDPC_ITERATIONS, NULL, 0, .uptr=NULL, .defintval=8, TYPE_UINT, 0}, \
|
||||
{CONFIG_STRING_L1_RX_THREAD_CORE, NULL, 0, .uptr=NULL, .defintval=-1, TYPE_UINT, 0}, \
|
||||
{CONFIG_STRING_L1_TX_THREAD_CORE, NULL, 0, .uptr=NULL, .defintval=-1, TYPE_UINT, 0}, \
|
||||
{CONFIG_STRING_L1_RX_THREAD_CORE, NULL, 0, .iptr=NULL, .defintval=-1, TYPE_INT, 0}, \
|
||||
{CONFIG_STRING_L1_TX_THREAD_CORE, NULL, 0, .iptr=NULL, .defintval=-1, TYPE_INT, 0}, \
|
||||
{CONFIG_STRING_L1_TX_AMP_BACKOFF_dB, HLP_L1TX_BO,0, .uptr=NULL, .defintval=36, TYPE_UINT, 0}, \
|
||||
{CONFIG_STRING_L1_PHASE_COMP, HLP_L1_PHASE_COMP,PARAMFLAG_BOOL, .uptr=NULL,.defintval=1, TYPE_UINT, 0}, \
|
||||
{CONFIG_STRING_NUM_ANTENNAS_PER_THREAD, HLP_NUM_ARX,0, .uptr=NULL, .defintval=1, TYPE_UINT, 0}, \
|
||||
|
||||
@@ -1283,6 +1283,20 @@ static rrc_gNB_ue_context_t *rrc_gNB_get_ue_context_source_cell(gNB_RRC_INST *rr
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Rollback F1-U DL TL and TEID in RRC
|
||||
*/
|
||||
static void f1u_dl_gtp_rollback(gNB_RRC_UE_t *UE)
|
||||
{
|
||||
DevAssert(UE != NULL);
|
||||
DevAssert(UE->ho_context->source != NULL);
|
||||
|
||||
FOR_EACH_SEQ_ARR(drb_t *, drb, &UE->drbs) {
|
||||
drb->du_tunnel_config = UE->ho_context->source->old_du_tunnel_config;
|
||||
LOG_W(NR_RRC, "DRB id %d rollback to tunnel TEID %x\n", drb->drb_id, drb->du_tunnel_config.teid);
|
||||
}
|
||||
}
|
||||
|
||||
static void rrc_handle_RRCReestablishmentRequest(gNB_RRC_INST *rrc,
|
||||
sctp_assoc_t assoc_id,
|
||||
const NR_RRCReestablishmentRequest_IEs_t *req,
|
||||
@@ -1361,6 +1375,7 @@ static void rrc_handle_RRCReestablishmentRequest(gNB_RRC_INST *rrc,
|
||||
}
|
||||
|
||||
source_ctx->ho_cancel(rrc, UE);
|
||||
f1u_dl_gtp_rollback(UE);
|
||||
|
||||
/* we need the original CellGroupConfig */
|
||||
ASN_STRUCT_FREE(asn_DEF_NR_CellGroupConfig, UE->masterCellGroup);
|
||||
|
||||
@@ -160,6 +160,12 @@ static void nr_initiate_handover(const gNB_RRC_INST *rrc,
|
||||
ho_ctx->source->du_ue_id = ue_data.secondary_ue;
|
||||
ho_ctx->source->old_rnti = ue->rnti;
|
||||
|
||||
// Save the GTP-U tunnel info for source DU before process UE context setup request/response
|
||||
// since tunnel info will be updated by calling store_du_f1u_tunnel() in rrc_CU_process_ue_context_setup_response()
|
||||
FOR_EACH_SEQ_ARR(drb_t *, drb, &ue->drbs) {
|
||||
ho_ctx->source->old_du_tunnel_config = drb->du_tunnel_config;
|
||||
}
|
||||
|
||||
int result = asn_copy(&asn_DEF_NR_CellGroupConfig, (void **)&ho_ctx->source->old_cellGroupConfig, ue->masterCellGroup);
|
||||
AssertFatal(result == 0, "error during asn_copy() of CellGroupConfig\n");
|
||||
}
|
||||
|
||||
@@ -56,6 +56,8 @@ typedef struct nr_ho_source_cu {
|
||||
ho_cancel_t ho_cancel;
|
||||
/// status transfer
|
||||
ho_status_transfer_t ho_status_transfer;
|
||||
/// old (source) downlink tunnel
|
||||
gtpu_tunnel_t old_du_tunnel_config;
|
||||
} nr_ho_source_cu_t;
|
||||
|
||||
/* acknowledgement of handover request. buf+len is the RRC Reconfiguration */
|
||||
|
||||
Reference in New Issue
Block a user